geomview-1.9.4/0000777000175000001440000000000010665240703010353 500000000000000geomview-1.9.4/m4/0000777000175000001440000000000010665240667010704 500000000000000geomview-1.9.4/m4/withtool.m40000644000175000001440000001000610622716743012724 00000000000000dnl Copyright (C) 2007 Claus-Justus Heine dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. # Find a program, with user override. # # $1: symbolic name, fancy. Converted to uppercase for the defintion # of variables # $2: default program to check for. Should be _without_ path, # just the name # $3: optional search path # $4: keyword: optional/required, bail out if required and prog is not found # # Example: # # GV_PATH_PROG(tk-interpreter, wish, [$PATH:blah]) AC_DEFUN([GV_PATH_PROG], [m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)]) m4_if($#,1, [m4_define([PROG],[$1])],[m4_define([PROG],[$2])]) AC_ARG_WITH($1, AC_HELP_STRING([--with-$1=PROGRAM], [Set PROGRAM to the name of the `$1' program (usually `PROG'). (default: autodetected)]), [case "${withval}" in no) AC_MSG_ERROR(["--without-$1" or "--with-$1=no" is not an option here]) ;; yes) # simply ignore that, use auto-detection ;; *) UPNAME[OPT]="${withval}" ;; esac], [UPNAME[OPT]=PROG]) acgv_path=`dirname "${UPNAME[OPT]}"|sed -e 's|^\./\?||g'` test "${acgv_path}" = "." && acgv_path="" if test -n "${acgv_path}"; then UPNAME[PROG]=`basename "${UPNAME[OPT]}"` if echo "${acgv_path}" | egrep '^/' > /dev/null 2>&1 ; then acgv_path="${acgv_path}" else acgv_path="`pwd`/${acgv_path}" fi else UPNAME[PROG]="${UPNAME[OPT]}" m4_if($#,3,[acgv_path="$3:${PATH}"],[acgv_path="${PATH}"]) fi AC_PATH_PROGS(UPNAME, ${UPNAME[PROG]}, [not found], [${acgv_path}]) acgv_required=optional m4_if($#,4,[acgv_required="$4"]) if test "${UPNAME}" = "not found" -a "${acgv_required}" = "required"; then AC_MSG_ERROR([`$1' executable not found. Check your installation.]) exit 1 fi AM_CONDITIONAL(UPNAME,[! test "${UPNAME}" = "not found"]) ]) AC_DEFUN([GV_CHECK_PROG], [m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)]) m4_if($2,[], [m4_define([PROG],[$1])],[m4_define([PROG],[$2])]) AC_ARG_WITH($1, AC_HELP_STRING([--with-$1=PROGRAM], [Set PROGRAM to the name of the `$1' program (usually `PROG'). (default: autodetected)]), [case "${withval}" in no) AC_MSG_ERROR(["--without-$1" or "--with-$1=no" is not an option here]) ;; yes) # simply ignore that, use auto-detection ;; *) UPNAME[OPT]="${withval}" ;; esac], [UPNAME[OPT]=PROG]) acgv_path=`dirname "${UPNAME[OPT]}"|sed -e 's|^\./\?||g'` if test -n "${acgv_path}"; then UPNAME[PROG]=`basename "${UPNAME[OPT]}"` if echo "${acgv_path}" | egrep '^/' > /dev/null 2>&1 ; then acgv_path="${acgv_path}" else acgv_path="`pwd`/${acgv_path}" fi AC_PATH_PROGS(UPNAME, ${UPNAME[PROG]}, [not found], [${acgv_path}]) else UPNAME[PROG]="${UPNAME[OPT]}" m4_if($3,[],[acgv_path="${PATH}"],[acgv_path="$3:${PATH}"]) AC_CHECK_PROGS(UPNAME, ${UPNAME[PROG]}, [not found], [${acgv_path}]) fi acgv_required=optional m4_if($#,4,[acgv_required="$4"]) if test "${UPNAME}" = "not found" -a "${acgv_required}" = "required"; then AC_MSG_ERROR([`$1' executable not found. Check your installation.]) exit 1 fi AM_CONDITIONAL(UPNAME,[! test "${UPNAME}" = "not found"]) ]) geomview-1.9.4/m4/set-prefix.m40000644000175000001440000000113110612242643013130 00000000000000dnl set prefix to its proper value, so that one can define substitutions dnl depending on the value of prefix AC_DEFUN([GEOMVIEW_SET_PREFIX], [AC_ARG_VAR([DEFAULT_PREFIX],[Default installation prefix]) test "x${DEFAULT_PREFIX}" = "x" && DEFAULT_PREFIX="${ac_default_prefix}" test "x$prefix" = xNONE && prefix="${DEFAULT_PREFIX}" PREFIX="${prefix}" # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' expanded_prefix=`eval eval eval echo ${prefix}` AC_SUBST(expanded_prefix) expanded_exec_prefix=`eval eval eval echo ${exec_prefix}` AC_SUBST(expanded_exec_prefix) ]) geomview-1.9.4/m4/check-package.m40000644000175000001440000002352210611073373013521 00000000000000dnl GEOMVIEW_CHECK_PACKAGE() dnl dnl Check for a library + header files dnl dnl Arguments: dnl dnl $1: symbolic name (fancy) dnl $2: library name (base name, lib$2[.so|.a] dnl $3: library path (-L$3) dnl $4: additional libraries needed (e.g. -lm -lGL) dnl $5: header name dnl $6: include path for $5 (-I$6) dnl $7: additional include paths (e.g. when $5 includes some other headers) dnl $8: a space separated list of the keywords dnl dnl optional, required, disabled, enabled dnl dnl optional: failing to detect the package is not fatal dnl required: configure is terminated when the package is not detected dnl (default) dnl disabled: package is initially disabled and needs the appropriate dnl --with-blah switch, otherwise the package is not checked for dnl enabled: package is initially enabled (the default) dnl dnl Default is to check for libraries below $prefix/lib/ and for header-files dnl below $prefix/include/ dnl dnl $5 may be empty (e.g. to check for a Fortran library). In this case dnl $6 and $7 are ignored dnl dnl This Macro defines the following variables (UPNAME means a dnl canonicalized version of $1: i.e. uppercase and - converted to _) dnl dnl Makefile-substitution dnl dnl UPNAME[]_INCLUDE_PATH dnl UPNAME[]_LIB_PATH dnl UPNAME[]_INCLUDE dnl UPNAME[]_LIB linker flags excluding $4 dnl UPNAME[]_ALL_LIB linker flags including $4 dnl dnl config.h preprocessor macros dnl dnl HAVE_LIB$2 dnl HAVE_$5_H dnl dnl Automake conditional dnl dnl AM_CONDITIONAL([HAVE_]UPNAME, [test -n "$[]UPNAME[_LIB]"]) dnl dnl Helper-macros dnl dnl dnl GEOMVIEW_CHECK_PKG_OPT(PKGNAME) dnl AC_DEFUN([GEOMVIEW_CHECK_PKG_OPT], [m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)]) m4_if($2,enabled, [m4_define([NEGDEFAULT],[without]) m4_define([NEGVERB],[disable]) m4_define([DEFAULT],[autodetect])], [m4_define([NEGDEFAULT],[with]) m4_define([NEGVERB],[enable]) m4_define([DEFAULT],[disabled])]) AC_ARG_WITH($1, AC_HELP_STRING(--[]NEGDEFAULT[]-$1, [NEGVERB use of package $1 (default: DEFAULT)]), [if test -z "$[]UPNAME[_DISABLE]"; then case "$withval" in yes) UPNAME[_DISABLE]=no ;; no) UPNAME[_DISABLE]=yes AC_MSG_RESULT([Disabling "$1"]) ;; *) AC_MSG_ERROR(["$withval" should have been either "yes" or "no"]) ;; esac fi], [if test -z "$[]UPNAME[_DISABLE]"; then m4_if($2,enabled, [UPNAME[_DISABLE]=no], [UPNAME[_DISABLE]=yes]) fi]) ]) dnl dnl GEOMVIEW_CHECK_PKG_HDR_OPT(PKGNAME, INCLUDEPATH) dnl AC_DEFUN([GEOMVIEW_CHECK_PKG_HDR_OPT], [m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)]) AC_ARG_WITH($1-headers, m4_if($2,[], [AC_HELP_STRING([--with-$1-headers=DIR], [use $1 include files below directory DIR (default: PREFIX/include/)])], [AC_HELP_STRING([--with-$1-headers=DIR], [use $1 include files below directory DIR (default: $2)])]), [case "$withval" in yes) AC_MSG_ERROR("option \"--with-$1-headers\" requires an argument") ;; no) AC_MSG_ERROR("option \"--with-$1-headers\" requires an argument") ;; *) UPNAME[_INCLUDE_PATH]="$withval" ;; esac], test -z "`eval eval eval echo ${UPNAME[_INCLUDE_PATH]}`" && UPNAME[_INCLUDE_PATH]="${DEFAULT_INCDIR}") ]) dnl dnl headers and libraries below the same directory :( dnl AC_DEFUN([GEOMVIEW_CHECK_PKG_DIR_OPT], [m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)]) AC_ARG_WITH($1-dir, AC_HELP_STRING([--with-$1-dir=DIR], [use $1 library (and headers) below directory DIR (no default)]), [case "$withval" in yes) AC_MSG_ERROR("option \"--with-$1-dir\" requires an argument") ;; no) AC_MSG_ERROR("option \"--with-$1-dir\" requires an argument") ;; *) UPNAME[_LIB_PATH]="$withval" UPNAME[_INCLUDE_PATH]="$withval" ;; esac]) ]) dnl dnl the macro itself dnl AC_DEFUN([GEOMVIEW_CHECK_PACKAGE], [AC_REQUIRE([GEOMVIEW_SET_PREFIX]) dnl m4_if($#,8,, dnl [m4_if($#,9,, dnl [errprint([$0] needs eight (8) or nine (9) arguments, but got $# dnl ) dnl m4exit(1)])]) dnl dnl upcase $1 dnl m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)]) dnl dnl need to use m4_if, the $i arguments are not shell variables dnl m4_define([ENABLED],[enabled]) m4_define([OPTIONAL],[required]) m4_if($#,8,[ m4_foreach_w([ac_gv_lvar],[$8], [m4_if(ac_gv_lvar,[disabled], [m4_define([ENABLED],ac_gv_lvar)], ac_gv_lvar,[enabled], [m4_define([ENABLED],ac_gv_lvar)], ac_gv_lvar,[optional], [m4_define([OPTIONAL],ac_gv_lvar)], ac_gv_lvar,[required], [m4_define([OPTIONAL],ac_gv_lvar)])])]) m4_if(OPTIONAL,[optional],[GEOMVIEW_CHECK_PKG_OPT([$1],[ENABLED])]) dnl dnl bail out if package is completely disabled dnl if test "${UPNAME[_DISABLE]}" = yes; then : else m4_if($3,[],[DEFAULT_LIBDIR="${libdir}"], [DEFAULT_LIBDIR="$3"]) if test "${DEFAULT_LIBDIR}" = '' then DEFAULT_LIBDIR="'${libdir}'" fi dnl dnl Optionally use an alternate name (e.g. MesaGL instead of GL etc.) dnl AC_ARG_WITH($1-name, AC_HELP_STRING([--with-$1-name=NAME], [use NAME as the name of the $1 library (without leading "lib" prefix and trailing suffix). Default: "$2"]), [case "$withval" in yes) AC_MSG_ERROR("option \"--with-$1-name\" requires an argument") ;; no) AC_MSG_ERROR("option \"--with-$1-name\" requires an argument") ;; *) UPNAME[_NAME]="$withval" ;; esac], UPNAME[_NAME]="$2") dnl dnl headers and libraries below the same directory :( dnl If we have no header to check for, then this additional option does not dnl make sense, hence the m4_if() dnl m4_if($5,[],[],[GEOMVIEW_CHECK_PKG_DIR_OPT([$1])]) dnl dnl location of library dnl AC_ARG_WITH($1-lib, m4_if($3,[], [AC_HELP_STRING([--with-$1-lib=DIR], [use $1 library below directory DIR (default: EPREFIX/lib/)])], [AC_HELP_STRING([--with-$1-lib=DIR], [use $1 library below directory DIR (default: $3)])]), [case "$withval" in yes) AC_MSG_ERROR("option \"--with-$1-lib\" requires an argument") ;; no) AC_MSG_ERROR("option \"--with-$1-lib\" requires an argument") ;; *) UPNAME[_LIB_PATH]="$withval" ;; esac], test -z "`eval eval eval echo ${UPNAME[_LIB_PATH]}`" && UPNAME[_LIB_PATH]="${DEFAULT_LIBDIR}") dnl dnl now for the header file dnl m4_if($5,[],[], [m4_if($6,[],[DEFAULT_INCDIR="${includedir}" GEOMVIEW_CHECK_PKG_HDR_OPT([$1], [PREFIX/include/])], [DEFAULT_INCDIR="$6" GEOMVIEW_CHECK_PKG_HDR_OPT([$1], [$6/])])]) dnl dnl now check if the library and header files exist dnl m4_if(OPTIONAL,[optional], [AC_CHECK_LIB(${UPNAME[_NAME]}, main, [UPNAME[_LIB]="-L${UPNAME[_LIB_PATH]} -l${UPNAME[_NAME]}" UPNAME[_ALL_LIB]="-L${UPNAME[_LIB_PATH]} -l${UPNAME[_NAME]} $4"], [UPNAME[_LIB]="" UPNAME[_ALL_LIB]="" UPNAME[_LIB_PATH]="" UPNAME[_INCLUDE_PATH]=""], -L`eval eval eval echo ${UPNAME[_LIB_PATH]}` $4)], [AC_CHECK_LIB(${UPNAME[_NAME]}, main, [UPNAME[_LIB]="-L${UPNAME[_LIB_PATH]} -l${UPNAME[_NAME]}" UPNAME[_ALL_LIB]="-L${UPNAME[_LIB_PATH]} -l${UPNAME[_NAME]} $4"], [case "$host" in *darwin*) AC_MSG_RESULT([Running the test for "$1" again with -framework switch]) ;; *) AC_MSG_ERROR([Library "lib${UPNAME[_NAME]}" was not found]) ;; esac], -L`eval eval eval echo $UPNAME[_LIB_PATH]` `eval eval eval echo $4`)]) dnl dnl On MacOS X we have that funky -framework switch ... dnl So just run the test again with the framework switch in case the dnl package was not found. dnl if test "x${UPNAME[_LIB]}" = "x" ; then case "$host" in *darwin*) eval "unset ac_cv_lib_${UPNAME[_NAME]}___main" m4_if(OPTIONAL,[optional], [AC_CHECK_FRAMEWORK(${UPNAME[_NAME]}, main, [UPNAME[_LIB]="-F${UPNAME[_LIB_PATH]} -framework ${UPNAME[_NAME]}" UPNAME[_ALL_LIB]="-F${UPNAME[_LIB_PATH]} -framework ${UPNAME[_NAME]} $4"], [UPNAME[_LIB]="" UPNAME[_ALL_LIB]="" UPNAME[_LIB_PATH]="" UPNAME[_INCLUDE_PATH]=""], -F`eval eval eval echo ${UPNAME[_LIB_PATH]}` `eval eval eval echo $4`)], [AC_CHECK_FRAMEWORK(${UPNAME[_NAME]}, main, [UPNAME[_LIB]="-F${UPNAME[_LIB_PATH]} -framework ${UPNAME[_NAME]}" UPNAME[_ALL_LIB]="-F${UPNAME[_LIB_PATH]} -framework ${UPNAME[_NAME]} $4"], [AC_MSG_ERROR([Framework "${UPNAME[_NAME]}" was not found])], -F`eval eval eval echo $UPNAME[_LIB_PATH]` `eval eval eval echo $4`)]) ;; esac fi if test "x${UPNAME[_LIB]}" = "x" ; then : else m4_if($5,[],,[ dnl dnl check for the header file dnl [gv_ac_]UPNAME[_save_CPPFLAGS]="$CPPFLAGS" m4_define([gv_ac_inctemp],[m4_bpatsubst([gv_ac_$5],[[].-[]],_)]) unset gv_ac_inctemp for incdir in "${UPNAME[_INCLUDE_PATH]}"; do if test -n "`eval eval eval echo ${incdir}`"; then CPPFLAGS="-I`eval eval eval echo ${incdir}` $7 ${[gv_ac_]UPNAME[_save_CPPFLAGS]}" fi AC_CHECK_HEADERS($5,[gv_ac_inctemp="$5"]) if ! test "${gv_ac_inctemp}" = "$5"; then eval "[unset ac_cv_header_]m4_bpatsubst([$5],[[].-[]],_)" else break fi done if ! test "${gv_ac_inctemp}" = "$5"; then m4_if(OPTIONAL,[optional], [UPNAME[_LIB]="" UPNAME[_ALL_LIB]="" UPNAME[_LIB_PATH]="" UPNAME[_INCLUDE_PATH]=""], [AC_MSG_ERROR([Header file "$5" was not found])]) else UPNAME[_ALL_INCLUDES]="-I${incdir} $7" UPNAME[_INCLUDES]="-I${incdir}" UPNAME[_INCLUDE_PATH]="${incdir}" fi CPPFLAGS="${[gv_ac_]UPNAME[_save_CPPFLAGS]}" ]) dnl dnl define makefile substitutions and config.h macros dnl if test "x${UPNAME[_LIB]}" = "x" ; then : else AC_DEFINE(m4_bpatsubst(m4_toupper([HAVE_LIB$2]),-,_), 1, Define to 1 if you have lib$2) fi fi fi dnl disable fi AM_CONDITIONAL([HAVE_]UPNAME, [test -n "$[]UPNAME[_LIB]"]) AC_SUBST(UPNAME[_INCLUDE_PATH]) AC_SUBST(UPNAME[_INCLUDES]) AC_SUBST(UPNAME[_ALL_INCLUDES]) AC_SUBST(UPNAME[_LIB_PATH]) AC_SUBST(UPNAME[_LIB]) AC_SUBST(UPNAME[_ALL_LIB]) AC_SUBST(UPNAME[_NAME]) ]) geomview-1.9.4/m4/iso-c99.m40000644000175000001440000000224210613450361012241 00000000000000# # We need (at least) two features from the C99 standard: variadic # macros and variable length arrays. We check here whether or those # are available. # # Note that we do not further modify the compiler flags, we just check # whether variadic macros and variable length arrays are available. # # The macro takes 2 arguments: # # $1: optional: a set of compiler flags in addition to CFLAGS # AC_DEFUN([GEOMVIEW_ISO_C99_CHECK], [AC_REQUIRE([AC_PROG_CC]) _alberta_save_cflags="${CFLAGS}" m4_if($#,1,[CFLAGS="$1"]) AC_LANG_PUSH([C]) AC_MSG_CHECKING([for ISO C99 features with "${CC} ${CFLAGS}"]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[extern void exit(int status); #define FOO(a, ...) (a, __VA_ARGS__) extern int foo(int a, int b, int c);]], [[int bar[foo FOO(3, 4, 5)]; exit(bar[0]);]])], [HAVE_ISO_C99=1 AC_MSG_RESULT([variadic macros and variable length arrays are available])], [HAVE_ISO_C99=0 AC_MSG_RESULT([variadic macros and/or vairable length arrays are NOT available])]) AC_LANG_POP([C]) CFLAGS="${_alberta_save_cflags}" AC_DEFINE_UNQUOTED([HAVE_ISO_C99],[${HAVE_ISO_C99}], [Define to 1 if ISO C99 features are available (e.g. variadic macros and variable length arrays)]) ]) geomview-1.9.4/m4/frameworks.m40000644000175000001440000000567710462247351013251 00000000000000# AC_SEARCH_FRAMEWORKS(FUNCTION, SEARCH-FRAMEWORKS, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [OTHER-LIBRARIES]) # -------------------------------------------------------- # Search for a library defining FUNC, if it's not already available. AC_DEFUN([AC_SEARCH_FRAMEWORKS], [AC_CACHE_CHECK([for library containing $1], [ac_cv_search_$1], [ac_func_search_save_LIBS=$LIBS ac_cv_search_$1=no AC_LINK_IFELSE([AC_LANG_CALL([], [$1])], [ac_cv_search_$1="none required"]) if test "$ac_cv_search_$1" = no; then for ac_lib in $2; do LIBS="-framework $ac_lib $5 $ac_func_search_save_LIBS" AC_LINK_IFELSE([AC_LANG_CALL([], [$1])], [ac_cv_search_$1="-framework $ac_lib" break]) done fi LIBS=$ac_func_search_save_LIBS]) AS_IF([test "$ac_cv_search_$1" != no], [test "$ac_cv_search_$1" = "none required" || LIBS="$ac_cv_search_$1 $LIBS" $3], [$4])dnl ]) # AC_CHECK_LIB(LIBRARY, FUNCTION, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [OTHER-LIBRARIES]) # ------------------------------------------------------ # # Use a cache variable name containing both the library and function name, # because the test really is for library $1 defining function $2, not # just for library $1. Separate tests with the same $1 and different $2s # may have different results. # # Note that using directly AS_VAR_PUSHDEF([ac_Lib], [ac_cv_lib_$1_$2]) # is asking for troubles, since AC_CHECK_LIB($lib, fun) would give # ac_cv_lib_$lib_fun, which is definitely not what was meant. Hence # the AS_LITERAL_IF indirection. # # FIXME: This macro is extremely suspicious. It DEFINEs unconditionally, # whatever the FUNCTION, in addition to not being a *S macro. Note # that the cache does depend upon the function we are looking for. # # It is on purpose we used `ac_check_lib_save_LIBS' and not just # `ac_save_LIBS': there are many macros which don't want to see `LIBS' # changed but still want to use AC_CHECK_LIB, so they save `LIBS'. # And ``ac_save_LIBS' is too tempting a name, so let's leave them some # freedom. AC_DEFUN([AC_CHECK_FRAMEWORK], [m4_ifval([$3], , [AH_CHECK_FRAMEWORK([$1])])dnl AS_LITERAL_IF([$1], [AS_VAR_PUSHDEF([ac_Lib], [ac_cv_lib_$1_$2])], [AS_VAR_PUSHDEF([ac_Lib], [ac_cv_lib_$1''_$2])])dnl AC_CACHE_CHECK([for $2 in -framework $1], ac_Lib, [ac_check_lib_save_LIBS=$LIBS LIBS="-framework $1 $5 $LIBS" AC_LINK_IFELSE([AC_LANG_CALL([], [$2])], [AS_VAR_SET(ac_Lib, yes)], [AS_VAR_SET(ac_Lib, no)]) LIBS=$ac_check_lib_save_LIBS]) AS_IF([test AS_VAR_GET(ac_Lib) = yes], [m4_default([$3], [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_LIB$1)) LIBS="-framework $1 $LIBS" ])], [$4])dnl AS_VAR_POPDEF([ac_Lib])dnl ])# AC_CHECK_FRAMEWORK # AH_CHECK_FRAMEWORK(LIBNAME) # --------------------- m4_define([AH_CHECK_FRAMEWORK], [AH_TEMPLATE(AS_TR_CPP(HAVE_LIB$1), [Define to 1 if you have the `]$1[' library (-framework ]$1[).])]) geomview-1.9.4/m4/lf_local.m40000644000175000001440000001122310622716743012630 00000000000000dnl Copyright (C) 1988 Eleftherios Gkioulekas dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. # ------------------------------------------------------------------------ # The following macro is useful for deep packages. It allows you to # link all the header files *.h under a certain set of directories # to be linked under an include directory from the toplevel. # To use this feature in your configure.in call: # LF_LINK_HEADERS(dir1 dir2 dir3 .... , [directory] ) # where directory -> put links under include/directory # dir1 ... -> the directories with header files we want to link # WARNING: This macro will do --> rm -rf include # ------------------------------------------------------------------------ AC_DEFUN([LF_LINK_HEADERS],[ # Find out how to link files if we haven't already if test -z "$LN_S" then AC_PROG_LN_S fi # Remove the include directory if we haven't done that yet if test -z "$lf_link_headers" then lf_link_headers="we are all Kosh" rm -rf "$srcdir/include" fi # Get the directory from the second argument which is optional ifelse([$2], , [lf_directory="include"] , [lf_directory="include/$2"]) # ${srcdir}/mkinstalldirs "$lf_directory" mkdir $lf_directory if test -d "`pwd`/$srcdir"; then lf_srcdir="`pwd`/$srcdir" else lf_srcdir="$srcdir" fi # Link them lf_subdirs="`echo $1`" for lf_dir in $lf_subdirs do echo "linking headers from $srcdir/$lf_dir" # Check if the Headers file exists if test -f "$srcdir/$lf_dir/Headers" then for lf_file in `(cd $srcdir/$lf_dir; cat Headers)` do rm -f $lf_directory/$lf_file if test -f "$lf_srcdir/$lf_dir/$lf_file"; then $LN_S "$lf_srcdir/$lf_dir/$lf_file" "$lf_directory/$lf_file" else # assume it will be located in the build-directory $LN_S "`pwd`/$lf_dir/$lf_file" "$lf_directory/$lf_file" fi if echo ${lf_file}|fgrep 'P.h' > /dev/null 2>&1; then GEOMVIEWPRIVHDRFILES="${GEOMVIEWPRIVHDRFILES} include/${lf_file}" else GEOMVIEWHDRFILES="${GEOMVIEWHDRFILES} include/${lf_file}" fi done else echo "Warning: No Headers file for $srcdir/$lf_dir" fi done AC_SUBST(GEOMVIEWHDRFILES) AC_SUBST(GEOMVIEWPRIVHDRFILES) ]) # -------------------------------------------------------------------------- # The following macro is useful for deep packages. # To use it in your configure.in call # LF_SET_INCLUDES(dir1 dir2 dir3 ...) # and in your Makefile.am set # @default-includes@ # Then this symbol will be substituted with # INCLUDES = -I$(prefix) -I$(top_builddir)/include/dir1 ... # The prefix entry will be skipped if the prefix is equal to /usr/local # or /usr # -------------------------------------------------------------------------- AC_DEFUN([LF_SET_INCLUDES],[ # See whether to put an entry for the prefix if test "$prefix" = "/usr" || test "$prefix" = "/usr/local" then default_includes="" else default_includes="-I\$(prefix) " fi # Get the directory list lf_dirs="`echo $1`" # Check whether we have a lib directory. If so put it in AC_MSG_CHECKING([whether sources have a lib directory]) if test -d "`pwd`/$srcdir/lib" then AC_MSG_RESULT([yes]) default_includes="$default_includes -I\$(top_srcdir)/lib" else AC_MSG_RESULT([no]) fi # Now add in the directories. If the list is empty then just add include/ # If the list is not empty then add the subdirectories. if test -z "$lf_dirs" then default_includes="$default_includes -I\$(top_builddir)/include" else for lf_dir in $lf_dirs do default_includes="$default_includes -I\$(top_builddir)/include/$lf_dir" done fi # And that's it AC_SUBST(default_includes) ]) geomview-1.9.4/m4/geom_local.m40000644000175000001440000002144410461140700013145 00000000000000dnl dnl dnl GEOM_LOG_MSG(MESSAGE) define(GEOM_LOG_MSG, [echo "configure:__oline__: $1" >&AC_FD_CC]) dnl dnl GEOM_FIND_L_OPTION(LIB, FUNC, DIRS, OTHERLIBS) dnl dnl Figure out what -L option might be needed to link with the library dnl LIB. FUNC should be some function from that library. DIRS should be a dnl list of directories to try, one of them can be "" which means use no dnl -L option. OTHERLIBS, if present, can be a list of other libraries to dnl link with. Upon return: dnl dnl * If linking was successful, then the shell variable GEOM_L_OPTION dnl is set to the first -L option (including the "-L") that worked, dnl unless what worked was linking with no -L option, in which case dnl GEOM_L_OPTION is the empty string. dnl dnl * If linking didn't work with any of the dirs in DIRS, then dnl GEOM_L_OPTION is 0. dnl AC_DEFUN([GEOM_FIND_L_OPTION],[ geom_lib=$1 geom_func=$2 geom_dirs='$3' geom_otherlibs=$4 geom_saved_LIBS=$LIBS #AC_MSG_CHECKING([how to link with $geom_lib]) GEOM_L_OPTION=0 for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_l_option= test -n "$geom_z" && geom_l_option="-L$geom_z" LIBS="$geom_l_option $geom_lib $geom_otherlibs" GEOM_LOG_MSG([checking for $geom_func with $geom_l_option]) AC_TRY_LINK_FUNC($geom_func, [ GEOM_L_OPTION="$geom_l_option" break ] ) done LIBS=$geom_saved_LIBS #if test "$GEOM_L_OPTION" != "0" ; then # AC_MSG_RESULT([$geom_l_option $geom_lib]) #else # AC_MSG_RESULT([not found]) #fi ]) dnl dnl dnl dnl dnl dnl dnl dnl GEOM_FIND_I_OPTION(HEADER, DIRS) dnl # Find out what -I argument we need in order to get the header file HEADER. # DIRS should be a list of strings to use as -I arguments; the empty # string corresponds to no -I option at all. If we're successful, return # with GEOM_I_OPTION set to the relevant -I option (including the "-I" itself). # Note that this might be the empty string, which corresponds to no -I # option at all. If we don't find HEADER in any of the dirs listed in DIRS, # return with GEOM_I_OPTION = "0". AC_DEFUN([GEOM_FIND_I_OPTION],[ geom_header=$1 geom_dirs='$2' geom_saved_CPPFLAGS=$CPPFLAGS GEOM_I_OPTION="0" #AC_MSG_CHECKING([for $geom_header]) for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_i_option= test -n "$geom_z" && geom_i_option="-I$geom_z" CPPFLAGS="$geom_i_option $geom_saved_CPPFLAGS" GEOM_LOG_MSG([checking for $geom_header with $geom_i_option]) AC_TRY_CPP([ #include <$geom_header> ], [ GEOM_I_OPTION="$geom_i_option" break ] ) done CPPFLAGS=$geom_saved_CPPFLAGS #if test "$GEOM_I_OPTION" = "0" ; then # AC_MSG_RESULT([not found]) #else # if test "$GEOM_I_OPTION" != "" ; then # AC_MSG_RESULT($GEOM_I_OPTION) # else # AC_MSG_RESULT([(found with no -I required)]) # fi #fi ]) dnl dnl dnl GEOM_FIND_LIBC_VERSION dnl dnl Try to figure out which version of the libc library is installed on dnl a linux system. Return with GEOM_LIBC_VERSION set to: dnl dnl 5 for the old libc (libc.so.5) dnl 6 for glibc (i.e., libc.so.6) (RedHat 5.0 and later) dnl dnl default to 6 if we can't figure it out. Note that this test is dnl not really correct; I think there is yet another version of libc dnl that we probably need to distinguish, but I'm not sure and I don't dnl know how to detect it, so this'll have to do for now. If you know dnl more about this, please email me at mbp@geomtech.com. dnl AC_DEFUN([GEOM_FIND_LIBC_VERSION],[ if test -e "/lib/libc.so.6" ; then GEOM_LIBC_VERSION="6" else if test -e "/lib/libc.so.5" ; then GEOM_LIBC_VERSION="5" else GEOM_LIBC_VERSION="6" fi fi ]) dnl dnl GEOM_AC_PROG_CXX (and its internally used GEOM_AC_PROG_CXX_WORKS) is a dnl replacement that I wrote for the standard AC_PROG_CXX (and dnl AC_PROG_CXX_WORKS). It differs from the standard one only in that it dnl does not abort if a C++ compiler isn't found --- it just sets CXX to dnl the empty string. If anyone knows a better way to test for the dnl presense of a C++ compiler without exiting if it isn't found, let me dnl know! [mbp@geomtech.com, Sat Oct 14 00:33:38 2000] dnl AC_DEFUN([GEOM_AC_PROG_CXX_WORKS], [AC_MSG_CHECKING([whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works]) AC_LANG_SAVE AC_LANG_CPLUSPLUS AC_TRY_COMPILER([int main(){return(0);}], ac_cv_prog_cxx_works, ac_cv_prog_cxx_cross) AC_LANG_RESTORE AC_MSG_RESULT($ac_cv_prog_cxx_works) AC_MSG_CHECKING([whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler]) AC_MSG_RESULT($ac_cv_prog_cxx_cross) cross_compiling=$ac_cv_prog_cxx_cross ]) AC_DEFUN([GEOM_AC_PROG_CXX], [AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl AC_CHECK_PROGS(CXX, $CCC c++ g++ gcc CC cxx cc++ cl, gcc) GEOM_AC_PROG_CXX_WORKS if test $ac_cv_prog_cxx_works = no; then CXX= else AC_PROG_CXX_GNU if test $ac_cv_prog_gxx = yes; then GXX=yes else GXX= fi dnl Check whether -g works, even if CXXFLAGS is set, in case the package dnl plays around with CXXFLAGS (such as to build both debugging and dnl normal versions of a library), tasteless as that idea is. ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= AC_PROG_CXX_G 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 fi ]) dnl dnl AC_DEFUN([GEOM_GET_CACHED_VALUE],[ AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(ac_cv_$1,[ AC_MSG_ERROR([ Can't find cached value for $1. You're not trying to run 'configure' from $PACKAGE's source directory, are you? You should only run Geomview's top-level 'configure' script, not this one directly. See the file INSTALL in $PACKAGE's source directory for details. ])]) eval $ac_cv_$1 AC_MSG_RESULT([done.]) ]) dnl dnl AC_DEFUN([GEOM_REQUIRE_XFORMS],[ AC_MSG_CHECKING([for xforms]) AC_CACHE_VAL(ac_cv_have_xforms,[:]) eval $ac_cv_have_xforms if test "$have_xforms" != "yes" ; then AC_MSG_RESULT([no]) AC_MSG_ERROR([ $PACKAGE requires the xforms library, but I can't find it in Geomview's top-level config.cache. Please install an xforms distribution appropriate to your machine in the 'xforms' directory under the top-level Geomview directory, delete any existing 'config.cache' file in that directory, and re-run 'configure' in that directory. You should only run Geomview's top-level 'configure' script, not this one directly. See the file INSTALL in $PACKAGE's source directory for details. ]) else XFORMSINCLUDE=$ac_xforms_include XFORMSLIBS=$ac_xforms_libs AC_MSG_RESULT([headers '$ac_xforms_include', libraries '$ac_xforms_libs']) fi ]) dnl Less severe version of the above: just check and WARN dnl AC_DEFUN([GEOM_CHECK_XFORMS],[ AC_MSG_CHECKING([for xforms]) AC_CACHE_VAL(ac_cv_have_xforms,[:]) eval $ac_cv_have_xforms if test "$have_xforms" != "yes" ; then AC_MSG_RESULT([no]) AC_MSG_WARN([ $PACKAGE requires the xforms library, but I can't find it in Geomview's top-level config.cache. Please install an xforms distribution appropriate to your machine in the 'xforms' directory under the top-level Geomview directory, delete any existing 'config.cache' file in that directory, and re-run 'configure' in that directory. You should only run Geomview's top-level 'configure' script, not this one directly. See the file INSTALL in $PACKAGE's source directory for details. ]) else XFORMSINCLUDE=$ac_xforms_include XFORMSLIBS=$ac_xforms_libs AC_MSG_RESULT([headers '$ac_xforms_include', libraries '$ac_xforms_libs']) fi ]) dnl dnl GEOM_REQUIRE_GEOMVIEW_VERSION(TOPDIR,MAJOR_OP,MAJOR,MINOR_OP,MINOR_COND) dnl $1 $2 $3, $4, $5 dnl AC_DEFUN([GEOM_REQUIRE_GEOMVIEW_VERSION],[ if test -f "$1/configure.in"; then GVCFGFILE="$1/configure.in" else test -f "$1/configure.ac" GVCFGFILE="$1/configure.ac" fi if test "z${GVCFGFILE}" = "z"; then AC_MSG_ERROR([Geomview configure file not found ("$1/configure.in/ac")]) fi changequote(<<, >>)dnl if test "z${GVCFGFILE}" = "zconfigure.in"; then gv_version=`sed -e 's/#.*$//' ${GVCFGFILE} | grep AM_INIT_AUTOMAKE | sed -e 's/^.*geomview,//' | sed -e 's/)//'` else gv_version=`grep <> ${GVCFGFILE}|cut -d ',' -f 2| sed -e 's/[][]//g'` changequote([,])dnl AC_MSG_NOTICE(version: $gv_version) changequote(<<, >>)dnl fi gv_major=`echo $gv_version | sed -e 's/\..*//'` gv_rest=`echo $gv_version | sed -e 's/^[^\.]\.//'` gv_minor=`echo $gv_rest | sed -e 's/\..*//'` gv_rev=`echo $gv_rest | sed -e 's/^[^\.]\.//'` changequote([,])dnl gv_major_ok=`expr $gv_major '$2' $3` gv_minor_ok=`expr $gv_minor '$4' $5` if test "$gv_major_ok" != "1" -o "$gv_minor_ok" != "1" ; then AC_MSG_ERROR([ $PACKAGE requires Geomview version N.M, where N$2$3 and M$4$5. Your version of Geomview seems to be $gv_major.$gv_minor.$gv_rev. ]) fi ]) geomview-1.9.4/doc/0000777000175000001440000000000010665240704011121 500000000000000geomview-1.9.4/doc/figs/0000777000175000001440000000000010665240704012051 500000000000000geomview-1.9.4/doc/figs/color.eps0000644000175000001440000006724510616356706013640 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: blah-000.ps %%Creator: pnmtops %%CreationDate: Jun 26 2006 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 253 344 359 448 %%EndComments %%BeginProlog %%BeginPreview: 106 104 8 312 % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffff % ff2929292962626262626262626262a9292929292929292929292929296262626262626262626262 % 62292929292929292929292929626262626262626262626262292929292929292929292929626262 % 626262626262626262a9292929292929292929292962626262ff % ff2962626262626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262296262626262626262626262626262ff % ff2962a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262626262626262 % 62a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262 % 626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262ff % ff2962a9292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929296262ff % ff2962a92962626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262622962 % 626262626262626262622962626262626262626262a9296262ff % ff2962a92962626262626262626262a962626262626262ffffffff62626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262622962 % 626262626262626262a9296262626262626262ff62a9296262ff % ff2962a92962626262626262626262a962626262626262ff62626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262622962 % 626262626262626262a9296262626262626262ff62a9296262ff % ff2962a92962626262626262626262a962626262626262ff626262ff6262ff62ff62ff62ff62ff62 % ff626262626262626262626262626262626262626262626262626262626262626262626262622962 % 626262626262626262a9296262626262626262ff62a9296262ff % ff2962a9296262626262626262ff62a9626262626262ff62626262ffff62ff626262ffffff6262ff % 62626262626262626262626262626262626262626262626262626262626262626262626262622962 % 62626262ff62626262a9296262626262626262ff62a9296262ff % ff626262296262ffffffffffffff62a9296262626262ff626262ff62ffff62ff62ff62ff62ff62ff % 62626262626262626262626262626262626262626262626262626262626262626262626262a92962 % 626262ffff6262626262296262626262626262ff62a92929a9ff % ff6262622962626262626262626262a9296262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262a92962 % 62626262626262626262296262626262626262ff62a92929a9ff % ff6262622962626262626262626262a9296262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262a92962 % 62626262626262626262296262626262626262ff62a92929a9ff % ff6262622962626262626262626262a9296262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262a92962 % 6262626262626262626229626262ffffffffffff62a92929a9ff % ff62626229a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9 % a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a929a9 % a9a9a9a9a9a9a9a9a9622962626262626262626262a92929a9ff % ffa9a962ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffff29a9a9ff % ff296262502020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202050292929ff % ff626262505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050502929a9ff % ff626262505020202020202020202020202020202020202020202020202020202050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050202020 % 202020202020202020202020202020202020202050502929a9ff % ff626262505020505050505050505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509b50502929a9ff % ff626262505020505050505050505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509b50502929a9ff % ff626262505020505050505050505050505050505050505050505050505050509b50505050505050 % 50505050502020202020202020202020202020202020205050505050505050505050505050505050 % 505050505050505050505050505050505050509b50502929a9ff % ff2962a950502050505050ffff50505050505050505050505050505050ff50509b50505050505050 % 505050505020505050505050505050505050505050509b5050505050505050505050505050505050 % ffffff505050505050505050505050505050509b5050296262ff % ff2962a9505020505050ff5050ff505050505050505050505050505050ff50509b50505050505050 % 505050505020505050505050505050505050505050509b5050505050505050505050505050505050 % ff5050ff5050505050505050505050505050509b5050296262ff % ff2962a95050205050505050505050ff5050ff50ff50ff50ff50ff50ffff50509b50505050505050 % 5050505050205050505050ff505050ffff505050ff509b5050505050505050505050505050505050 % ff50505050ff50ff50ff50ff50ff50ff5050509b5050296262ff % ff2962a95050205050505050505050ffff50ff505050ff505050ffffffff50509b50505050505050 % 5050505050205050505050ff505050505050505050509b5050505050505050505050505050505050 % ff50505050ff5050505050ff50ffffff5050509b5050296262ff % ff2962a9505020505050ff5050ff50505050ff505050ff505050505050ff50509b50505050505050 % 5050505050205050ffffffff5050ff5050ff50ff50509b5050505050505050505050505050505050 % ff5050ff50ff5050505050ff505050505050509b5050296262ff % ff2962a950502050505050ffff5050ffffffff50505050ffff50ffff50ff50509b50505050505050 % 5050505050205050505050ff505050ff5050505050509b5050505050505050505050505050505050 % ffffff505050ffff505050ff50ffff505050509b5050296262ff % ff2962a9505020505050505050505050505050505050505050505050505050509b50505050505050 % 5050505050205050505050ff505050ff5050ff5050509b5050505050505050505050505050505050 % 505050505050505050505050505050505050509b5050296262ff % ff2962a9505020505050505050505050505050505050505050505050505050509b50505050505050 % 505050505020505050505050505050505050505050509b5050505050505050505050505050505050 % 505050505050505050505050505050505050509b5050296262ff % ff2962a9505020505050505050505050505050505050505050505050505050509b50505050505050 % 505050505020505050505050505050505050505050509b5050505050505050505050505050505050 % 505050505050505050505050505050505050509b5050296262ff % ff2962a9505020505050505050505050505050505050505050505050505050509b50505050505050 % 505050505020505050505050505050505050505050509b5050505050505050505050505050505050 % 505050505050505050505050505050505050509b5050296262ff % ff2962a95050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050 % 5050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050505050505050509b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050296262ff % ff2962a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050296262ff % ff6262625050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff626262505050ff50505050505050509b6a6a6a20202020202020202020202020206a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff626262505050ff50505050505050509b6a6a6a205050505050502050505050509b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff626262505050ff50505050505050509b6a6a6a205050505050502050505050509b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff626262505050ff50505050505050509b6a6a6a205050505050502050505050509b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff626262505050ff50505050505050509b6a6a6a205050505050502050505050509b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff626262505050ff50505050505050509b6a6a6a205050505050502050505050509b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff6262625050505050505050505050509b6a6a6a205050505050502050505050509b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff6262625050505050505050505050509b6a6a6a9b9b9b9b9b9b9b9b9b9b9b9b9b9b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff626262505050505050505050505050202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff626262505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff626262505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff2962a950505050ffff5050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a20202020202020202020202020206a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5050296262ff % ff2962a9505050ff5050ff50505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a205050505050502050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5050296262ff % ff2962a950505050ff505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a205050505050502050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5050296262ff % ff2962a9505050505050ff50505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a205050505050502050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5050296262ff % ff2962a9505050ff5050ff50505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a205050505050502050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5050296262ff % ff2962a950505050ffff5050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a205050505050502050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5050296262ff % ff2962a95050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a205050505050502050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5050296262ff % ff2962a95050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a9b9b9b9b9b9b9b9b9b9b9b9b9b9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5050296262ff % ff2962a9505050505050505050505050202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5050296262ff % ff2962a9505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5050296262ff % ff2962a95050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5050296262ff % ff2962a95050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a202020202020209b2020202020209b6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5050296262ff % ff626262505050ff5050ff50505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a205050505050509b5050505050509b6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff6262625050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a205050505050509b5050505050509b6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff62626250505050ffff5050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a205050505050509b5050505050509b6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff6262625050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a205050505050509b5050505050509b6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff6262625050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a205050505050509b5050505050509b6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff6262625050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a209b9b9b9b9b9b9b9b9b9b9b9b9b9b6a6a6a6a6a6a6a6a6a20506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff626262505050505050505050505050202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020506e6e6e6e6e6e6e6e6e % 6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e50502929a9ff % ff626262505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050502929a9ff % ff626262505050505050505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50502929a9ff % ff626262505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050502929a9ff % ff626262505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050502929a9ff % ff626262505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050502929a9ff % ff2962a95050505050505050505050505050505050505050505050505050505050ffff505050ffff % ff50ffff5050505050505050ff505050ffffff5050ffff50ffffff505050ffff50505050ff5050ff % ff5050ffff5050505050505050505050505050205050296262ff % ff2962a950505050505050505050505050505050505050505050505050505050ff50505050505050 % 50ff505050505050505050ff50ff5050ff505050ff505050ff50505050505050ff5050ff50ff5050 % 5050505050ff50505050505050505050505050205050296262ff % ff2962a9505050505050505050ff50ff5050ff505050ff505050505050505050ff505050505050ff % 50ffffff50505050505050ff50ff5050ffffff5050505050ffff505050505050ff50505050505050 % ff50505050ff50505050505050505050505050205050296262ff % ff2962a9505050505050505050ff505050505050505050505050505050505050ff50505050505050 % 50ff505050505050505050ff50ff505050505050505050505050ff5050505050ff505050ff505050 % 50ff505050ff50505050505050505050505050205050296262ff % ff2962a9505050505050ffffff50505050ffff50ffff50505050505050505050ff5050505050ff50 % 50ff505050505050505050ff50ff5050ff505050ff505050ff50ff5050505050ff5050ff50505050 % 50ff505050ff50505050505050505050505050205050296262ff % ff2962a9505050505050505050ff50505050ff5050505050505050505050505050ffff50ff50ff50 % 5050ffff5050505050505050ff50505050ffff5050ffff5050ff50505050ffff505050ffffff50ff % ff5050ffff5050505050505050505050505050205050296262ff % ff2962a9505050505050505050ff50ff50ffff505050ff5050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050205050296262ff % ff2962a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050205050296262ff % ff2962a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050205050296262ff % ff2962a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050205050296262ff % ff2962a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050205050296262ff % ff2962a9505050505050505050505050505050505050505050505050502020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020205050296262ff % ff626262505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050502929a9ff % ff626262505050505050505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50502929a9ff % ff626262505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050502929a9ff % ff626262505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050502929a9ff % ff626262505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050502929a9ff % ff626262505050505050ff50505050ff50ff505050505050505050505050505050ffff505050ffff % 5050ffff5050ffff50505050ff50505050ffff5050505050ffffff505050ffff505050ffffff50ff % ff505050ff50505050505050505050505050502050502929a9ff % ff292962505050505050ff50505050ff505050ff5050ff505050505050505050ff50505050505050 % ffff505050ff5050505050ff50ff5050ff505050505050505050505050505050ff50505050505050 % 50505050ff5050505050505050505050505050205050292929ff % ff626262505050505050ffffffff505050505050505050505050505050505050ff50505050505050 % ffff505050ff5050505050ff50ff5050ffffff505050505050ff505050505050ff50505050505050 % ff505050ff50505050505050505050505050502050502929a9ff % ff626262505050505050ff505050505050505050ffff50505050505050505050ff50505050505050 % ff50505050ff5050505050ff50ff5050ff505050ff5050505050505050505050ff505050ff505050 % 50ff5050ff50505050505050505050505050502050502929a9ff % ff626262505050505050ff50505050ff50ff5050505050505050505050505050ff50505050505050 % ffff505050ff5050505050ff50ff5050ff505050505050505050505050505050ff50505050505050 % 50ff5050ff50505050505050505050505050502050502929a9ff % ff6262625050505050505050505050505050505050505050505050505050505050ffff50ff50ffff % 5050ffff5050ffff50505050ff50505050ffff5050505050505050505050ffff50505050505050ff % ff505050ff50505050505050505050505050502050502929a9ff % ff626262505050505050505050505050505050505050505050505050505050ffff50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050502929a9ff % ff2962a95050505050505050505050505050505050505050505050505050ff5050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050205050296262ff % ff2962a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050205050296262ff % ff2962a9505050505050505050505050505050505050505050505050502020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020205050296262ff % ff2962a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050296262ff % ff2962a9509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50296262ff % ff2962a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050296262ff % ff2962a9292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929296262ff % ff2962626262626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262296262626262626262626262626262ff % ff29a9a9a962626262626262626262a929a9a9a9a9a9a9a9a9a9a9a9a96262626262626262626262 % 62a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262 % 626262626262626262a929a9a9a9a9a9a9a9a9a9a962626262ff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffff %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def %%EndProlog %%Page 1 1 /picstr 660 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def gsave 253.2 344.4 translate 105.6 103.2 scale 220 215 8 [ 220 0 0 -215 0 215 ] { inputf picstr readstring pop } false 3 colorimage 78DAED9D4192DB2010457D4A9FC017CA224B9FC1B7996D8E92B8E22A8A92056A 503774A3F717AA8CA29125F1FC044830B71B21EEF26393E7F379BFDF7FC842B1 2ED3F7FE7326DF3FEA2EEFFF937F1CCBE84BEB327DEF3C319956EA261DFF93AC 12BB327DEFF9DB9346C74F39AEC7A4DDCEBF3DF9619525CB91CB9CBD5D4F7289 588E07F2D093F44590617D3E424FDA751011925262AFC4AA56639F8EA0C596A9 58CFEFADC393B4BBE9C0B12BD3FC76DCEA49FA27170052510EDF652AAF3DEE32 39D2937D97E2F05CC84439EC96A9B080F2CD3EFB89E249208CE8C98E920DE749 405AD29369CB409EAC0059BA956BADC79378B289C97CBDC5BFF164384FB676CE 9FF4645D6569FD6683C3F597AD181CCAA1E9DEE1C4934DE5B8F92EA8DFB80F01 AB837DCDB67C5D0EF2EFAC2B4FF6DD7F9B3CD974E3966C4C4B4AEE49F965F1E3 C98EDBB78A275B6FD04256AFA6CA434F0A6FDFDEDADD1D554AB92769DDCC6D77 CBAB94D769774B2A93BB68D10B44FFE4944B41E89F9CF81C87E0493C8927F124 59CF931D8D5F3C8927ED3CD944269E24033CD9BD9F0E4FA6CDCE2CDFFB61B8E8 F4650249656F5A655AF164FA3167359DCBC968ED87F82908AD5DE59ECC417DE7 FB1319774C468EEFDE80BA19CA9D367811629CDD6904364CE60A7DFFCA1F42CC 92987C66F3006C98DCB4896092D8E5F178E49E94B4BB7326B9C510DD3CFE67E3 C9C3FE499824C398ECF664A05A0A49F159405A9E0C544B216E99FC1490AE2743 DC11C886496F05A4EB499884497526F1244CE2499884493C19B1818027F1A42B 26EDF48E279764327495E3CA9E4CAF1E0D3BC1EFCF8249F9296C5E185BCC939B 931A768E307992C94A2146F7E4F7B9C0643826C794DA184F1E9EC8EE0DE2F3EF DD1B4769FBD24E4632B97BB2A5E33FBC4469BD1326372B550A6E8A27EB4CE647 D8FDEFCA06AE982CD5612232A952706E3D593A65C9FAD68DA733D9F15F6E9954 59EFD093A5F65D2B93929D38645258795B83494943DE83274B35AB339EF45C9F 2C1547BD6B623D4F7A6E77ABDC025C31B99B3A81BBE83A6F770F667264FFA4B0 79B2461B47788FF0C9A4BC109BDA44B33C59EA03F95E5F6A8A4ABA20A2F4051D B6CE061CB690C97AF54F72CD0FCB689627FDC46DBBDB2193730B88F782E6F64F 1E4A1526F1A4E9BDBB7EFF82493C19A24061124FC2249E844998C49330892761 1226277AF2E13EEA051AEEB0679D82FC4C153DF98810DD028D78D8B34EA19B49 E69F247E6EE2CC3F497C32892797C9DF98C1936B33F92B603C78F2416C1A44CB 3039DE9320A49B542278F293D6F75AD301FCDE8BDDAC50BF174D5E2278722E93 1F3FC83786493C798649610540BE254CE2499884493C09937832C74F32C61926 61124FC224F5499884493C099378122661124FC2249E1CF9BC1B2661D2DB7B41 300993813C297F1F46FEF20C4CE2C96E268D5EE882493C79C8E41FA2FD0743F1 E41926A108265D7992301EC79B27094CE24998C493042619B7C8585A3C09938C A575EE49C9EBE5511EF6C51ACF4BFF6469EC43E9C7B599F4309E97FE49C9BB6A 6B3019E53D103C297C7F122661726E7D525E938449981CD9EE5EAC8D0393CBF4 4F2ED3C681C995FA276112266977C3249EBC42FF244CF21C072661D2E7781C98 84496FE316611226F164F4F1BC78F2224C061ACF8B27194BCBB8C5553D094530 C9781CC6E3E04902938CC7618C189E8449C68839F464E96162F73CBD21263173 357C8C76374C7A1B3E46BBFB0AEFAAC57AEC8827611226797F1226F164DFB8C5 A6A1B5300993D6FD933009933EDF3397CF3F00933039E0390E4CC2A4C3E738F2 A930601226C73CEF864998E43D7398C4933009937892E16378124F861B3E8627 1923C6789C553D094530C9781CC6E3E049425AAB737892B86572014F324C2CFA A0CBF53C49B1461F74B9AA27B903864BC269554F52C4CB308927099E84498227 099E8449822761124F4661F296A5FEBFBB9327547EB1723CBA1F5AD95EFEA195 0D5AD7E3C9334C7E5FE4FA7ED206955F3C2CA6C30F154EFC553A18950F3D3CD3 D64B87272D986C9A39615526BBBFCE9E3D79DB4BDF7DA4F58FE5456752286D15 849C33A9FEF7BB77F12BFDB85953F92F532677B7ECAB4F4A98947CE9F26B22A9 2B9EF9F6ED566257F26487822A5FDB594CD68FF90C93928F96EFDFEE4C3B6E58 513CD9741B9AC2A4BCF63580C9BEF57667BAA427CFD4D3C6D4272FC2A42ECCB1 3C5971FE610F58DFFDE20C937D25A5D8C651E996B16EEC5FD093272F452B93F2 FAAD2293DDEC9D61B2BB7DBD76BBBBE9CAE8D6275FE5272392AF89EE731CC943 A2338F54EA1FDAF1C46A99E738AEDADDC4793C78B2D45D69D43F49823239D893 7514759FE3103C392B3089276192E04998C4937892E0499884493C49F0244C12 3C49F0E45C2699413AEEC4D74B7A92925D8949E6E9257E6A5FCC674E7C32C93C BDC4DBDCD1CC674EBCCD1D4DFF24A17F122609CF71089E8449822761124FC224 09E449E1A0F8C379A2EAEB61F26A9E4C6EECF0E4E108EEDDA1B5464C4E9951F9 FC3CCFAFF6B19C5366C91EE9C97B165D4F566615E89E3EB47BBE200F53F75410 3A731B1296D19959B24D3D991398DFBBD3FFEA7A52FE8B5760B2B487266B4D99 91D8DA93291B262DEA93F5FB8BC4150B3359FFF25E84C90D96E7DBDDB74224B7 A7A6CB159AC9C3B9108D26BD549C257BB17677C58D1E987C1566C2D462B234F5 59B760A7CC921DA87F526552FAA64B61C1E4F836CEE1FCB1F26B3E6646E2653C 29BC2CD764B2DE63731D26077B52D29069BD0EEBF505BD0CE68137EA2558A63E D9F4D75ED49974358DB32993A6B36407F2E4F89C9C3B7AF034CEAFC6E7382FF1 9F121B3F4B76144F3A61D2F462123CD9CAE480E762044FCA99CCDFEB004B3C39 9DC9EE0794044F5A30297F8849F0E4AC7637C1933049F0244CE249E69F24CC3F 2961929265FE49428C7A4E987F923864B2C393CC50478C26A2ECF324978E5833 D9E449424CD3EAC91B21F6917BF28790819178325FC392E59865C5938AF928F7 49168A6999EE7AD2E2F8C1723D268D68F9F6E4EEA47F6796E9F8D5F7CC72D6D2 BA4C139377B37C4FE646A2C7B44CE98B200EF30F4B460C7C > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/color.pdf0000644000175000001440000001304510616356706013607 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h`j4406R0Ô³´43°T0ц… .ù\@!Ùendstream endobj 6 0 obj 62 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 2968>>stream xœí=’Ô:…ïÛ èBV@$L2UÄ,ƒd’Þ9 ªf“±žg0ãÑèÏWÖ•tu}¾ªqu«Õú±NI¶¥ùPÆËßïß¿[$ýððpww×"q0„Ömº¤ÿñãÇ'Q.ï_¿~-x\J¿$»U@<}û[·é’þׯ_ÿ‰r •þö«OŒ¢]›.)¿yóÆwJÙ<è±P¤%š¶iÜ)WµâˆcÏ£«½¸Sj(%Žç9ºãÆûŒS.jmaÎxDµwÊE­®°q¹\¢ÚK:¥Ôu¢5³á×2p”:.­¹6k}j«(Ëœ²~†uÙ·îå®ãHµ©Û!;e}êÓ5Ü?^ñi…°Mù3/_¾¸élÞ×Ï)‹h ÝÊ€H¹C´M—&ã4mMg§\E  ÒÁ)™¢$§eçsJˆR%NI-;“Sfévën©pÃÀ)Ÿ•ž ÏEJ”nx‹×æ1蔥7xÜ_çŒ&ÖÍSÕn8Lˆ»îPÔ{hqJf®^äR§döÝ´§°¼²·OO%ͼ;lM¶û£Õå”E¢tóæ;eQß͉| /“pœ’ß“(rÊÝ,=–¼Eœ²´fŠõT¢$†SºoçpÊhÑó”:%¦8íà¸X©Å)Q䔜¥g„¸ÄÇà컦¸÷=\§|Vz’; 8å³:À)‡§|Vz‚Sê µSòS€S‚?´vʦ4á”àMòp:GœrÊY%™9Þýeø:Γ7%‰¤&Õ¦9§\ï¾,ï]µn·d*ÙN ‹`CH%å:¥«Ô?¢¼½½õ²ÄºoЇÕ)]‰?uß[ÐãÇý‹NÅÍÍM¸½Àåry&J×EQ¾|ù²w1Áiøõë×*ÊgòDé΀è¯SB” ×ëõÝ»w›S²fß®S.ŠXz`?~,ÇM”Üë”ä8%D dñDI‡r–®?!…­¶4˜S*¬^È:R] Ehkµµ„R³mU]E¨jµ­„RIõ¢@”!ªZ-%J‚Sž U­§PÕjpJzÎXU­§ ›(Û]4PÕjpJúT¹é¨CU«õvÊ%õõÅ·oßWí)G//ˆ2$U…­½Vú´Z?§\«·ÕÊ{Ûˆ’C¦ÕܳקÕú9e(Ž0¤%U­ÖÉ)wkâv®›.¯£=~*~*‘h³g¦¯ÊÑÊF-'_N/\‰(½@‘†óèä”yQºÂá×™ªD™ÆÌ(J‘† £Å)Suö~d)E.ÊT‡˜ï+uŠ’sÎwÃ=T8%%fy¥¢ôBfe'bC”^Rz2ìÑê2>|L™ê¹ò(lˆ’Óaª˜}‹ôªDV?˜šú(e¦„­EI=¯S2ç(ùñõ,0œb½Dø ¢ä7"¿áÂÂh¹£ã†§&¤aè%• Ô,Êð£”ñë¼£Ã9ç» ç{ßH;ݷJD9<%$€ÈuÊhä¦ÅvQÕjpJDîèd"¯@”pÊ ßûœRˆR8¥¥,pJ JYà”@”²´rÊëõ:¨F\ÄEÙ§ÊME©ªÕ„RUÝRÈŠ²[•Û‰R[«I:%R`J 8¥YÞ¿?ºGøþý;œÒ,‹(?þ<ºżxñb¼S®%‚¬³"3¢à”¥,Ÿ>}Z[ÄŒ(©Ò)Kt¥GQ¾zõ*üèíÛ·•5LñóçÏF)e=cÆDY딣Dy½^‡àGŽfg“¢$…NÉ,‰lÝÖnÌTv0)JN Qò1)J‚SNIQ 8e4'ˆ²&EIpÊ©1)JŒ)çÆ¤( N95&E §œ“¢$8åÔ˜å°{ߥ&EI£ž‚(E0)JNÉ\D²ˆ’¿Ü¢TËNÙhYD©ENÉÆìbL”4Ä)¡HYŒ‰ktì`F”„ÕŒf0#J8¥̈’à”f0#J¬f´€±%¶„uß³co‰­ŒSæ·›÷P~ßo®e¾&/žSýSB´÷9<̈RÃ2_“¢”žr÷ÿòM!ÊY 1)JjñegpGgˆ²3Šî}C”"˜¥®ÕŒ€(;§Üg®e¾&E §ô™k™¯IQÒ(§Ä‚FAŒ‰rŒSB‘²%aŽ̈«í`F”„5:0¶p «§ÇÞÂ1ªqÊÔ³‡wòUŽÂ5e&/ U9%D™¢Ûš2“¢$ñ5:³?º–AáH“¢Äó”@”-Àó”U@”-hµšÑåî#•¥“ Jñë”eDɧá“ç‹™@”^L‚([ÜÑ(= J> ïèð÷o(½˜Q¶Û!¢Ü€(ù(º÷ Qn1 ¢Tò”D¹Å$ˆNy…kÊLŠ’à”|®)3)ÊaN‰e:‚%á3À˜(±FÇfDIX͆§ê0è”X‰65‹ :%D9/ë-³N¹®}±ÉɬSB”Ó‘%Á)Á(à”@pJ 8%Pœ¨ã¤N¹ýƒŠm‘à~êÅÙýbfí‡l¦™øüL3JÃ9£SzÒÙ]E´EÈ|q÷ßXífÊÜ,U‘LwkZzêŽqF§,:³E[*d"L-J~‚"trʰ¯¡½.,Õe¤¾bC”©tDDYš¸)§Œ¶ewÀrCÂsA ]Ö‹23ÓSWŠÒ}»›'~åÏ/¬©5§Ì7a>Â1_i!JJ·PiRE¦[:f-Í”_S槆aNIYÍí~½ƒ(ù#0N©*Ey,¼]M™µ8Æ0§¬«1ÏDÉÉTVÍ"ôsJ/$Sçpºs¬Ë¨屦œè¤º‘Ýp‘×dZj§¬<¥¢äq9•*Í´§(wN:E©bLÙh¢C13&†(S_d–Š“i4ñÒp~¦™¬&ÓJÎ8ûÊQá”ôøû ¦©^ƒ*®SåhqÊ-d}}¼ïÖŒ)rÎxï(çŒO åÀ):à”@pJ 8%Pœ¨N Ôaß)±eõ¤˜uJ(r^l:%˜ƒN fÇ Sb'ß© ·—&N QÎKt{i;N‰KBÓë”@ö¯SB”Ó§ê€SuÀ):ú9%sµüú‚¿OAˆrRÊœòöövuG÷("ÊèÛow£k!ÊÝõÝö(Š@å+°Ëq§„"A#:åÀƒ3Pì”Ëg#Ë ÎASº;ЖS®¯qıç1甂¬¦Û"e0ЦmwJñ<Ö‘ti†vmwJo7Àú#=n¨µí›…ãìÇÖmúä”íf6[¥úÓ´Mÿ‰Uü3èÆ endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer blah-000.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000379 00000 n 0000005108 00000 n 0000000320 00000 n 0000000165 00000 n 0000000015 00000 n 0000000147 00000 n 0000000444 00000 n 0000000544 00000 n 0000000485 00000 n 0000000514 00000 n 0000003713 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<0244893F81FE20DBEAB10AB0EC6E54EF><0244893F81FE20DBEAB10AB0EC6E54EF>] >> startxref 5276 %%EOF geomview-1.9.4/doc/figs/color.png0000644000175000001440000000331110616356716013616 00000000000000‰PNG  IHDRÜ׃³"qPLTE¯¯¯•••‘‘‘ÖÖÖdddVVVÿÿÿßß߬wfIDATxœíœËjã:€¥@èVÚ„™]?@W³?p0˜®Ë@v!ü g[ ó¶cÝﲬHJhü§!iãèë'ý²¥D6mc;Ñ %Ã.m¶½ãÐ »´3ؾôè†CÁ°Jëˆùó×[qViÄ®k¯ÌîÒ(zf·oԸݹhòc+ì†Wúó›ã —&íúp.-k ´NÙi¼µßuWý—áÀc3áAfï&ÍÃjÖµ£8 nN·ŽT|‡´[ØŽl é¼+ŒcÛM?AœvÛ‘¬8b8œˆ›J ÛÃ.Üv€m›dço;¤*’ÞC8@ÿ_@^DáÌôà<ýŽÜn&Ux=qD1œJÏ^M‚›ë,“`d¯ÂÞ µŽµÏT™Âù"÷ˆ úˉ¸|;¶;_ˆË²³ËIÇÝ÷xW÷4v_Ç`˜8çe *È´ ÓLœ[š… •²{žù]ò~üÒv?þ‰FÀ.’3Ñø˜ÇùìrqŸ‹ìÄAßÞÞ~™³Žßoóñ+§Ùùp_÷_!\ÐŽUîŽ?”ÂíêàîhÇFßÕî{·Ý·¶SûÌ&v-pA;>"áÕíÌcKU»È綱ȴ;ÕÃ=ÀX¥"îùì*üJŽ3f¦ø¨öîÉfæÿ¾e¯"?ªÅù‡ƒËwhǪܿãÎ8ÞÕÆémêãŒÌœO•’vx>UŠÚÕO•;ffB¿+Ùv {•²m×83Í.6¬`fÛµ‰Uø=ÀX¥"îi>#3W9{„• ¹ýn!ŽçïWn¿K81«ò¶6.¼»·ìxWÒnj8ØÐ®Î8š#»„ªv pÆ^6µk€[v4/kW—cÇöÿ'~¨mg}]x»]Û±Êú™XN<àw¯»Ü’)våp§$»EKAcñ'É®(nµ+ˆ[íøzN@µ¾Ð?|¥ûÖ–n†øJR ‹K²Cb)%f‹ñÈs(ùjÑ â (ÕªÄ<;ƒ‚:Ã~œiǾÊfUÁëb‡-ŽáL;ÈxÒ…ŽÀÆ‘Ùv ÇÖ&Bö¨ýWd5ð¼ä«8ÅúD¤“( ʶ´6sVb{í¬0õ*T8y·6K²Síã´]áÎú,šTí2²*N–c¤Š¶Yd¦ê ©vбCtq(Ž ´™*l‘,­c¯ÂV͹Œœn&v> {•@f–‰€ùHÀìwåp;Ò‘ ±W)‡[wq«]AܳÛåNÝH²+FK²+87/;Yn87?­ýnµKÇÝÕNžO¤ÆÜåí^:}E‡v–¢ÄyfÁHMå¸Í3§öؽŒÝɳÎ7 –sz>2æÔî^xá½3q8‡ÙYjbÚÌÞ«&¹¶½ð‚Ùvò,Å4œ~Úã®'8µÇ ã/ŠÜ1ŽýkIEND®B`‚geomview-1.9.4/doc/figs/ap.ps0000644000175000001440000021331407730233213012731 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: noname.ps %%Pages: 1 %%BoundingBox: 227 289 384 472 %%EndComments /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 326 string def %%EndProlog %%Page: 1 1 gsave 227.76 289.56 translate 156.48 182.88 scale 326 381 8 [ 326 0 0 -381 0 381 ] { picstr readstring } image 80008000ba000000e3d6019d5680d680d6fcd6019d56e2d6019d007f00d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656 d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d45d69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d56000300d69d d6e59d0256d6d6809d809dfd9d0256d6d6e59d02569d000200d6d6e49d01 56d6809d809dfc9d0156d6e39d0156007f00d69dd69d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d567f9d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d56459d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569dd69d569d007f00d6d69d9d9d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d7f569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d45569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569dd69d9d9d56000600d69dd69d569d80008000c80006d6 9dd69d569d000700d6d69d9d9d560080d680d6cad60700d6d69d9d9d5600 7f00d69dd69d569d00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd6459dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9dd6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd600d69dd69d569d0008 00d6d69d9d9d5600d6ea9d0156d6809d959d0256d6d6ea9d0156d6ea9d08 5600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d6809d979d 025656d6e99d0556d6d69d9d9df200fc9d085600d69dd69d569d000800d6 d69d9d9d5600d6eb9d025656d6ef9d010000809da89d0256d6d6eb9d0256 56d6fc9d0000f49d0d009d9d9d565600d6d69d9d9d56000900d69dd69d56 9d00d6d6eb9d0256d6d6f19dfd00809da99d025656d6e99d0656d6d69d9d 9d00f49d0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb 9d025656d6f19d0400009d0000809da99d0256d6d6eb9d025656d6fc9d00 00f49d0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb 9d0256d6d6f29d1600009d00009d9d9d00009d0000009d9d9d00009d0000 00fc9dfc00fc9dfc00fd9d0600009d00009d9dfc00fd9d0500009d000000 fc9dfc00fc9dfc00809df39d025656d6e99d0656d6d69d9d9d00f49d0d00 009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f2 9d2a00009d9d00009d9d9d0000009d9d00009d9d0000009d9d00009d9d00 009d9d00009d9d00009d9d00009d9dfb001f9d00009d9d00009d9d000000 9d9d00009d9d00009d9d00009d9d00009d9d0000809df39d0256d6d6eb9d 025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00d69dd6 9d569d00d6d69d9df000fd9d0256d6d6f39d2000009d9d00009d9d000000 9d9d9d00009d0000009d9d9d00009d00009d9d9d0000fa9d0500009d9d00 00f89d1a00009d9d00009d9d9d00009d00009d9d9d00009d00009d9d9d00 00809df49d025656d6f89dfc00f59d0656d6d69d9d9d00f49d0d00009d9d 9d5600d69dd69d569d000c00d6d69d9d9d5600d69d9d9d00f29d05009d9d 5656d6f39d0a00009d9d9d00009d9d0000fc9d0400009d0000fc9d020000 9dfa00fd9dfb00039d9d0000fb9dfb000c9d9d00009d9d9d00009d9d0000 fa9dfa00809df29d0256d6d6f99d04009d9d0000f79d025656d6fc9d0000 f49d0d00009d9d565600d6d69d9d9d56000c00d69dd69d569d00d6d69d9d 00f29d0600009d9d56d6d6f59df800149d9d00009d9d9d00009d9d00009d 9d9d00009d0000f99d0900009d9d00009d9d0000fc9d1100009d9d00009d 9d00009d9d9d00009d0000fa9d010000809dee9d025656d6f89d04009d9d 0000f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b 00d6d69d9d9d5600d69d9d9def00039d5656d6f49d010000fc9d1600009d 9d00009d9d9d00009d9d00009d9d9d00009d0000fa9d2800009d9d9d0000 9d9d00009d9d9d00009d9d9d00009d9d00009d9d9d00009d00009d9d9d00 009d0000809ded9d0256d6d6f99dfb00f79d025656d6fc9d0000f49d0d00 009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6fc9df100049d 9d56d6d6f69d010000fb9d0200009dfc00049d00009d9dfc00169d00009d 9d00009d9d00009d9d00009d9d00009d9d0000fc9d1e00009d9d00009d9d 00009d9d9d00009d9d00009d9d00009d9d00009d9d0000809df29d025656 d6f79dfc00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d56 9d000800d6d69d9d9d5600d6eb9d025656d6f59d010000fb9d1100009d00 009d0000009d9d9d00009d000000fc9dfc00fc9dfd00059d00009d0000fb 9dfd000d9d00009d00009d9d9d00009d9d9dfc00fc9dfc00809df09d0256 d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d560009 00d69dd69d569d00d6d6eb9d0256d6d6ec9d010000f99d010000809db69d 025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d 000800d6d69d9d9d5600d6eb9d025656d6ec9d010000f99d010000809db4 9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d 56000900d69dd69d569d00d6d6eb9d0256d6d6ed9d010000f99d01000080 9db59d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd6 9d569d000800d6d69d9d9d5600d6eb9d025656d6809d959d0256d6d6eb9d 025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d569d00 d6d6eb9d0256d6d6809d979d025656d6e99d0256d6d6fb9df300fd9d0856 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6809d959d0256 d6d6eb9d025656d6eb9d09565600d6d69d9d9d56007f00d69dd69d569d00 d69d9d569d569d569d569d569d569d569d569d569d569d56d6569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 7f9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d56459d569d569d569d569d569d5656d69d569d569d56 9d569d569d569d569d569d569d569d569d56d6569d569d569d569d569d56 9d569d569d569d569d569d5600d69dd69d569d0008009d569d9d9d56009d e956009d80569456009de856009de9560700d6d69d569d56000000fb5600 9d80008000c80001d69dfc56ff000000fcd6029d565680df80dfcadf0000 fad6ff000700d6d6d69d569d5680df80dfcbdf036400d69dfcd6ff000900 d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000a00d69d d69d569d56dfdfafa9df80afd9afcbdf0700d69dd69d569d000a00d6d69d 9d9d5656dfdfafaadf006480afd9afccdf086400d6d69d9d9d56000c00d6 9dd69d569d56dfdfafdfdfadaf01646480afd9af01dfdfcfaf09646400d6 9dd69d569d000c00d6d69d9d9d5656dfdfafdfdfadaf01646480afd9af01 dfdfcfaf09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdfad af01646480afd9af01dfdfcfaf09646400d69dd69d569d000c00d6d69d9d 9d5656dfdfafdfdfadaf01646480afd9af01dfdfcfaf09646400d6d69d9d 9d56000c00d69dd69d569d56dfdfafdfdfadaf01646480afd9af01dfdfcf af09646400d69dd69d569d000c00d6d69d9d9d5656dfdfafdfdfadaf0164 6480afd9af01dfdfcfaf09646400d6d69d9d9d56000c00d69dd69d569d56 dfdfafdfdfadaf01646480afd9af01dfdfcfaf09646400d69dd69d569d00 0c00d6d69d9d9d5656dfdfafdfdff8affd00f1affd00faaff900d7af0164 64eeaff36480aff8af01dfdff5af0000faaf0300afaf00f9af0000edaf09 646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8af0000edaf 0000faaf0000fbaf010000e2af0000f7af016464eeaff46400dff9affd00 f0affd00f7affd00e2af0000f9af0000c8af01dfdff5af0000faaf0300af af00f9af0000edaf09646400d69dd69d569d000c00d6d69d9d9d5656dfdf afdfdff8af0000edaf0000faaf0000faaf0000e2af0000f7af016464eeaf 016464f7e201dfdff9af0000ecaf0000f9af060000afafaf0000e4af0000 f9af0000c8af01dfdff5af0000faaf0000f6af0000edaf09646400d6d69d 9d9d56000c00d69dd69d569d56dfdfafdfdff8af0000fcaffc000bafaf00 00afafaf0000afaf00faaf0000faaf0300afafaffc0002afaf00fbaf0200 afaffc00fdaf0100affb00f8af016464eeaf016464f7e201dfdff9af0000 ecaf0000f9af0000fbaf0000dcaf0000c8af01dfdff5af0000faaf0e00af af00afafaf000000af00afafaffc00f4af09646400d69dd69d569d000c00 d6d69d9d9d5656dfdfafdfdff8af1400afafaf0000afaf0000afaf00afaf af00afafaf00faaf0000fbaf0b00afafaf0000afaf0000af00fbaf0f00af 0000afaf0000afaf0000afafaf00f7af016464eeaf016464f7e201dfdff9 af0000fcaffc00fcaffc00fcaf0000faaf0000f9af0200af00fbaf0200af affc00fdaf1500af0000af00af0000af00afafaf000000af00afafaffc00 cfaf01dfdff5af0000faaf1300afaf00afaf0000afaf0000afaf0000afaf 0000f5af09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8 af0000f8af0600afafaf00af00fcaf0000faaffa00fcaf0000fcaf0a00af af00afafaf00afaf00fcaf0300afaf00fcaf0000f7af016464eeaf016464 f7e201dfdff9af1500afafaf0000afaf0000afaf0000afaf0000afafaf00 faaf0000f9af0200af00fbaf2400af0000afaf0000afaf0000afafaf0000 afafaf00afaf0000afaf0000afaf0000afaf0000d0af01dfdff5aff80005 afaf00afaf00fcaf0300afaf00fcaf0000f5af09646400d69dd69d569d00 0c00d6d69d9d9d5656dfdfafdfdff8af0000fcaffb00fcaf0000fbaf0000 faaf0000fbaf0300afafaffa0008afaf00afafaf00afaffa0002afaf00fc af0000f7af016464eeaf016464f7e201dfdff9af0000f8af0300afaf00fc af0400afafaf00faaf0000f9af0a00afaf00afafaf00afaf00fcaf0300af af00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000d0af01dfdff5 af0000faaf0600afaf00afaf00fcaf0200afaffa00f5af09646400d6d69d 9d9d56000c00d69dd69d569d56dfdfafdfdff8af0900afafaf0000afafaf 00fcaf0000fbaf0000faaf0000faaf0300afaf00f9af0700afafaf00afaf 00f9af0000fcaf0000f7af016464eeaf016464f7e201dfdff9af0000fcaf fb0002afaf00fcaf0400afafaf00faaf0000f9af0900afaf00afafaf00af affa0002afaf00fcaf0000fcaf0300afaf00fcaf0200afaffa00d0af01df dff5af0000faaf0600afaf00afaf00fcaf0300afaf00f0af09646400d69d d69d569d000c00d6d69d9d9d5656dfdfafdfdff8af0400afafaf00fcaf06 00afafaf00af00fcaf0000faaf0000faaf0300afaf00f8af0600af00afaf af00f9af0000fcaf0000f7af016464eeaf016464f7e201dfdff9af0c00af afaf0000afafaf00afaf00fcaf0400afafaf00faaf0000f9af0a00afaf00 afafaf00afaf00f9af0000fcaf0000fcaf0300afaf00fcaf0300afaf00cb af01dfdff5af0000faaf0600afaf00afaf00fcaf0300afaf00f0af096464 00d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8af1400afafaf00 00afaf0000afaf00afafaf00afafaf00faaf0000faaf1a00afaf0000afaf 0000afafaf00af00afafaf0000afaf0000afaf00fcaf0000f7af016464ee af016464f7e201dfdff9af0400afafaf00fcaf0300afaf00fcaf0400afaf af00f9af0000fbaf0000fcaf0600af00afafaf00f9af0000fcaf0000fcaf 0300afaf00fcaf0300afaf00cbaf01dfdff5af0000faaf1300afaf00afaf 0000afaf0000afaf0000afaf0000f5af09646400d69dd69d569d000c00d6 d69d9d9d5656dfdfafdfdff8af0000fcaffd0000affc00fdaf040000afaf 00faaf0000faaf0300afafaffc00fbaf0000fbaffc00fdaf0000fbaf0100 00f9af016464eeaf016464f7e201dfdff9af1500afafaf0000afaf0000af af0000afaf0000afafaf00f9af060000afafaf0000fcaf0e00af00afafaf 0000afaf0000afaf00fcaf0000fcaf1000afaf0000afaf0000afaf0000af af0000d0af01dfdff5af0000faaf0e00afaf00afafaf000000af00afafaf fc00f4af09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8 af0000edaf0000caaf016464eeaf016464f5dff9af0000fcaffd0004af00 00afaffc00fcaf0000f7affd00f9af0000fbaffc00fdaf0000fcaf0000fc af0b00afafaf000000af00afafaffc00cfaf01dfdfcfaf09646400d69dd6 9d569d000c00d6d69d9d9d5656dfdfafdfdff8af0000edaf0000caaf0164 64eeaf0064f4dff9af0000ecaf000095af01dfdfcfaf09646400d6d69d9d 9d56000c00d69dd69d569d56dfdfafdfdff8affd00f1affd00caaf016464 daaf0000ecaf000095af01dfdfcfaf09646400d69dd69d569d000c00d6d6 9d9d9d5656dfdfafdfdfadaf016464daaffd00f0affd0095af01dfdfcfaf 09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdfadaf016464 80afd9af01dfdfcfaf09646400d69dd69d569d000c00d6d69d9d9d5656df dfafdfdfadaf01646480afd9af01dfdfcfaf09646400d6d69d9d9d56000c 00d69dd69d569d56dfdfafdfdfadaf01646480afd9af01dfdfcfaf096464 00d69dd69d569d000c00d6d69d9d9d5656dfdfafdfdfadaf01646480afd9 af01dfdfcfaf09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdf dfadaf01646480afd9af01dfdfcd640700d69dd69d569d000c00d6d69d9d 9d5656dfdfafdfdfab6480afd9af00dfcc640700d6d69d9d9d56000b00d6 9dd69d569d56dfdfafdfaa6480afa6af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80af80afceaf09646400d69dd69d569d000900d6d69d9d9d 5656dfdf80af80afceaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdf80af80afceaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80af80afceaf09646400d6d69d9d9d56000900d69dd69d569d56dfdff4af fd00f4af0000d3affd00fcaf000080af9faf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdff6af060000afafaf0000f6af0000d5af090000af afaf0000afaf0080af9faf09646400d6d69d9d9d56000900d69dd69d569d 56dfdff6af0000fbaf0000f6af0000d5af0000fbaf0300afaf0080af9faf 09646400d69dd69d569d000900d6d69d9d9d5656dfdff7af0000f6affc00 fdaf0300afafaffc00fdaf0500af0000af00e5af0000f8af0400af000000 fcaffc000dafaf00afafaf00afafaf00afaf0080afb9af09646400d6d69d 9d9d56000900d69dd69d569d56dfdff7af0000f7af180000afaf0000afaf 00afaf0000afaf0000afaf0000afafaf00e4af010000faaf1a0000afaf00 00afaf0000afaf0000af00afafaf00afafaf00afaf0080afb9af09646400 d69dd69d569d000900d6d69d9d9d5656dfdff7af0000f7af0000fcaf0600 afaf00afaf00fcaf0300afaf00ddaf010000fcaf0000fcaf0300afaf00fc af0a00af00afafaf00afafaf0080afb6af09646400d6d69d9d9d56000900 d69dd69d569d56dfdff7af0000f7af0000fcaf0600afaf00afaf00fcaf03 00afaf00dbaf040000afaf00fcaf0300afaf00fcaf0900afaf00afaf00af af0080afb5af09646400d69dd69d569d000900d6d69d9d9d5656dfdff7af 0000f7af0000fcaf0600afaf00afaf00fcaf0300afaf00daaf0300afaf00 fcaf0300afaf00fcaf0900afaf00afaf00afaf0080afb5af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdff6af0000fbaf0300afaf00fcaf06 00afaf00afaf00fcaf0300afaf00e0af0000fbaf0300afaf00fcaf0300af af00fcaf0900afaf00af00af00af0080afb5af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdff6af1c0000afafaf0000afaf0000afaf0000af af00afaf0000afaf0000afaf00fcaf0000e5af090000afafaf0000afaf00 fcaf1000afaf0000afaf0000afafaf00afafaf00fcaf000080afb9af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdff4affd00fbaffc00fdaf 0300afafaffc00fdaf0000fcaf0000e3affd00fcaf0000fcaf0300afafaf fc00fcaf0400afafaf00fcaf000080afb9af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80af9aaffd00fcaf0000ecaf0300afaf00d4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80af9caf090000afaf af0000afaf00ecaf0300afaf00d4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80af9caf0000fbaf0300afaf00ecaf0000d1af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80af9caf0000f8af0400af00 0000fcaffc00fcaffd000baf00afaf00afaf00af000000fcaffd0001af00 e4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af9baf0100 00faaf280000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00af af0000afaf0000afaf0000afaf0000e4af09646400d6d69d9d9d56000900 d69dd69d569d56dfdf80af99af010000fcaf0000fcaf0000f9af0300afaf 00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4af09646400d69d d69d569d000900d6d69d9d9d5656dfdf80af97af040000afaf00fcaf0300 afafaffb0002afaf00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000 e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af96af0300 afaf00fcaf0b00afaf0000afafaf00afaf00fcaf0600afaf00afaf00fcaf 0300afaf00fcaf0000e4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80af9caf0000fbaf0300afaf00fcaf0300afaf00fcaf0300afaf00 fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf80af9caf090000afafaf0000afaf00 fcaf1600afaf0000afaf0000afaf0000afaf0000afaf00afaf00fcaf0800 afaf0000afaf0000e4af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf80af9aaffd00fcaf0000fcaf1600afafaf000000af0000afaf000000 af00afaf00afaf00fcaf0800afafaf000000af00e4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdffcafd1df80af9eaf0000e4af09646400 d69dd69d569d000900d6d69d9d9d5656dfdffcafd2df006480afa3af0500 00afaf0000e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffc af01dfdfd5af01646480afa2affc00e3af09646400d69dd69d569d000900 d6d69d9d9d5656dfdffcaf01dfdfd5af01646480af81af09646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8af8b 640bdfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdf d5af046464afafaff36488af00648ddf0c64dfaf646400d6d69d9d9d5600 0900d69dd69d569d56dfdffcaf01dfdff5affd00fcaffd00fbaffb00f4af 046464afafaff46400dff9affd00f6affb00faaff900aeaf0164df8d640b dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5af 0000fcaf090000afafaf0000afaf00fcaf0000f4af066464afafaf6464f7 e201dfdff9af0000f5af0000fcaf0000faaf0000a8af0164df8f640ddf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff5af 0000fcaf0000fbaf0300afaf00fcaf0000f4af066464afafaf6464f7e201 dfdff9af0000f5af0000fcaf0000faaf0000a8af0364df646492af0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5 af0400afafaf00f8affd00fdaf0000f4af066464afafaf6464f7e201dfdf f9af0000fcaffc0008afaf000000afafaf00faaf0000f8affc00fcaffc00 fdaffc00fcaffd00caaf0364df646492af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff5af0400afafaf00f7af00 00fcaf0000f4af066464afafaf6464f7e201dfdff9af0c00afafaf0000af af0000afaf00fcaf0000faaf0000f9af1b0000afaf0000afaf0000afaf00 00af0000afaf0000afaf00afafaf00cbaf0964df6464af000000afaffc00 efaffd00f7affd00bcaf0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdff5af0400afafaf00f7af0000fcaf0000f4af 066464afafaf6464f7e201dfdff9af0000f8af0300afaf00fcaf0000faaf fa00f9af0300afaf00faaf0000fcaf0400afaf0000c8af0964df6464af00 afafaf00fcaf0000eeaf0000f9af060000afafaf0000e7af0000edaf0000 ecaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffc af01dfdff5af0400afafaf00f7af0000fcaf0000f4af066464afafaf6464 f7e201dfdff9af0000fcaffb0002afaf00fcaf0000faaf0000f8affb0002 afaf00faaffa00fdaffd00caaf0964df6464af00afafaf00fcaf0000eeaf 0000f9af0000fbaf0000e7af0000edaf0000ecaf0edfdf64dfaf646400d6 9dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5af0400afafaf00 f7af0000fcaf0000f4af066464afafaf6464f7e201dfdff9af0c00afafaf 0000afafaf00afaf00fcaf0000faaf0000f9af080000afafaf00afaf00fa af0000f6af010000cbaf0964df6464af00afafaf00fcaf0300afafaffc00 fcaffd00fcaf0000faaf0000f6affc00fdaf0400af000000fcaffd0007af af000000afafaffc00fdaf0900af000000afaf000000edaf0edfdf64dfaf 646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff5af0000 fcaf0000fbaf0300afaf00fcaf0000f4af066464afafaf6464f7e201dfdf f9af0400afafaf00fcaf0300afaf00fcaf0000faaf0000f9af0000fcaf03 00afaf00fcaf0200af00f5af0000cbaf0964df6464af00afafaf00fcaf13 00afaf0000afaf0000afaf00afafaf00afafaf00faaf0000f7af2b0000af af0000afaf0000afaf0000afaf00afafaf00afaf00afafaf0000afaf0000 afaf0000afaf0000afaf00ecaf0edfdf64dfaf646400d69dd69d569d0009 00d6d69d9d9d5656dfdffcaf01dfdff5af0000fcaf090000afafaf0000af af00fcaf0000f4af066464afafaf6464f7e201dfdff9af0c00afafaf0000 afaf0000afaf00fcaf0000faaf0000f9af1b0000afaf0000afaf0000afaf 0000af0000afaf0000afaf00afafaf00cbaf0964df6464af00afafaf00fc af0000f9af0400afaf0000faaf0000faaf0000f7af0000fcaf0300afaf00 fcaf0400afaf0000fbaf0000f8af0300afaf00fcaf0300afaf00ecaf0edf df64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdf f5af0000faaffd00fcaf0000fcaf0000f4af066464afafaf6464f5dff9af 0000fcaffd0004af0000af00fcaf0000faaf0000f8affd0004af0000afaf fc00fdaffc00fcaffd00caaf0964df6464af00afafaf00fcaf0300afafaf fb00fdaffd00fcaf0000faaf0000f7af0000fcaf0300afaf00fcaf0a00af afaf000000afafaf00fcaffb0002afaf00fcaf0300afaf00ecaf0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5af 0000eeaf0000f4af056464afafaf64f4dff9af0000f0af0000a1af0964df 6464af00afafaf00fcaf0800afaf0000afafaf00fbaf050000afafaf00fa af0000f7af0000fcaf0300afaf00fcaf0000fbaf100000afaf00afafaf00 00afafaf00afaf00fcaf0300afaf00ecaf0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff5af0000eeaf0000f4af01 6464e9af0000f0af0000a1af0964df6464af00afafaf00fcaf0300afaf00 fcaf0000faaf0400afafaf00f9af0000fbaf0300afaf00fcaf0300afaf00 fcaf0000faaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00ec af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf 01dfdff5affd00f2affd00f4af016464e9affd00f4affd00a1af0964df64 64af00afafaf00fcaf1300afaf0000afaf0000afaf00afafaf00afafaf00 f9af110000afafaf0000afaf0000afaf0000afaf00fcaf1600afaf00afaf af00afaf00afafaf0000afaf0000afaf00fcaf0300afaf00ecaf0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af 01646480aff8af0564df6464af00fcaffc00fcaffd0007af0000afaf0000 00fcaf0000f7affd00fbaffc00fdaf0000fcaf0600afafaf000000fcaf0b 0000afaf000000af0000af00fcaf0500afafaf0000eeaf0edfdf64dfaf64 6400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af016464 80aff8af0564df6464af00e5af0000b0af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdfd36480aff8af0564df6464 af00e5af0000b0af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcaf00dfd26480aff8af0764df6464af000000e9affd00b0af 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcafd1 df80aff8af0364df646492000edfdf64dfaf646400d69dd69d569d000900 d6d69d9d9d5656dfdffcafd2df006480aff8af0364df646492000edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af 01646480aff8af0764df646400afafaffc0000afee00fdaffa00f9af0100 afbf000edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf fcaf01dfdfd5af01646480aff8af0564df646400affc00fdafec0000affa 0000aff90000aff60000afca000edfdf64dfaf646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8af0564df646400 affa0000afec0000affa0000aff90000aff60000afca000edfdf64dfaf64 6400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af046464 afafaff3df88af0564df646400affa0000affb00fcaffc00fdaffc0000af fa0000aff90003af000000fcaf040000afafafcb000edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff7affd00fcaffd 00f5affd00f6af046464afafaff4df0064f9affd00f0affd00faaff900f9 af0000baaf0564df646400affa0000affc0010afaf0000afaf0000af0000 00af000000affa0000aff9000baf0000afaf0000afaf0000afca000edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7 af0000fcaf060000afafaf0000f5af0000f6af066464afafafdfdff7af01 6464f9af0000ecaf0000faaf0000f3af0000baaf0564df646400affa0000 aff70004af0000afaffa0000affa00faaf020000aff90003af0000afca00 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 dfdff7af0000fcaf0000fbaf0000f5af0000f6af066464afafafdfdff7af 016464f9af0000ecaf0000faaf0000f3af0000baaf0564df646400affa00 00affb00fbaffd00fdaffc0000affa0000aff90003af000000fbaf020000 afca000edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf fcaf01dfdff7af0400afafaf00f6affc00fcaf0000f6af066464afafafdf dff7af016464f9af0000fcaffc00fcaffc00fcaf0000faaf0000f7affd00 0caf00afafaf000000af00afafaffc00fcaffd00d0af0564df646400affa 0000affc0005afaf000000affb0005afaf000000affa0000aff9000baf00 00afaf000000af0000afca000edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf01dfdff7af0400afafaf00f7af090000afaf00 00afafaf00f6af066464afafafdfdff7af016464f9af1500afafaf0000af af0000afaf0000afaf0000afafaf00faaf0000f8af1c0000afaf0000afaf 0000afaf0000afaf0000afaf0000afaf00afafaf00d1af0564df646400af fa0000affc0000affc0000affa0004af000000affa0000aff90003af0000 affc0003af0000afca000edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf0400afaf af00f6af066464afafafdfdff7af016464f9af0000f8af0300afaf00fcaf 0400afafaf00faaffa00fdaf0000fcaf0300afaf00fcaf0300afaf00fcaf 0400afaf0000ceaf0564df646400affa0000affc0010afaf0000afaf0000 af000000af000000affa0000aff9000baf0000afaf0000afaf0000afca00 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 dfdff7af0400afafaf00f7affa00fdaf0000f6af066464afafafdfdff7af 016464f9af0000fcaffb0001afaffa00fdaf0000faaf0000f8af0000fcaf 0300afaf00fcaf0200afaffa00fdaffd00d0af0564df646400affa0000af fb00fdaf0700afaf0000afafaffc0000affa0000aff9000daf000000afaf af00afaf0000afafcc000edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000f8af0000f6af 066464afafafdfdff7af016464f9af0c00afafaf0000afafaf00afaf00f8 af0000faaf0000f8af0000fcaf0300afaf00fcaf0300afaf00f6af010000 d1af0564df646400afe50000afb0000edfdf64dfaf646400d6d69d9d9d56 000900d69dd69d569d56dfdffcaf01dfdff7af0000fcaf0000fbaf0300af af00f8af0000f6af066464afafafdfdff7af016464f9af0400afafaf00fc af0300afaf00f8af0000faaf0000f8af0000fcaf0300afaf00fcaf0300af af00f5af0000d1af0564df646400afe50000afb0000edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0000fcaf12 0000afafaf0000afaf0000afaf0000afafaf00f6af066464afafafdfdff7 af016464f9af1500afafaf0000afaf0000afaf0000afaf0000afafaf00fa af0000f8af1c0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 00afafaf00d1af0764df646400afafafe900fdafb0000edfdf64dfaf6464 00d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff7af0000faaf fd00fbaffc00fcaf0000f6af066464afafafdfdff564f9af0000fcaffd00 04af0000afaffc00fcaf0000faaff900fdaffd000caf00afafaf000000af 00afafaffc00fcaffd00d0af0364df646492af0edfdf64dfaf646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0000eaaf0000f6 af056464afafafdff464f9af0000ecaf0000e4af0000c2af0364df646492 af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 01dfdff7af0000eaaf0000f6af016464e9af0000ecaf0000e9af050000af af0000c2af0964df6464af000000afaffc00efaffd00f8affd00ddaf0000 dfaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc af01dfdff7affd00eeaffd00f6af016464e9affd00f0affd00e8affc00c1 af0964df6464af00afafaf00fcaf0000eeaf0000faaf060000afafaf0000 e3af0400afafaf00dfaf0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdfd5af01646480aff8af0964df6464af00afaf af00fcaf0000eeaf0000faaf0000fbaf0000e3af0400afafaf00dfaf0edf df64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdf d5af01646480aff8af0564df6464af00f8af0300afafaffc00fcaffd00fc af0000faaf0000f8af0700af0000afaf0000fcaffc00fcaffc000bafaf00 0000afaf00af000000e3af0edfdf64dfaf646400d6d69d9d9d56000900d6 9dd69d569d56dfdffcaf01dfdfd36480aff8af0564df6464af00f9af1400 afafaf0000afaf0000afaf00afafaf00afafaf00f9af010000faaf240000 afaf0000afaf00afaf0000afaf0000afaf0000afaf0000afaf00afafaf00 00afaf0000e4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf00dfd26480aff8af0564df6464af00faaf0000f7af0400af af0000faaf0000f7af010000fcaf0b00afafaf00afafaf00afaf00fcaf03 00afaf00fcaf0700afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcafd1df80aff8af0564df64 64af00fbaf0000faaffb00fdaffd00fcaf0000f5af0f0000afaf00afafaf 00afafaf00afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000 e4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc afd2df006480aff8af0564df6464af00fcaf0000faaf050000afafaf00fb af050000afafaf00f4af0e00afaf00afafaf00afafaf00afaf00fcaf0300 afaf00fcaf0700afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8 af0964df6464af00afafaf00f9af0000fcaf0000faaf0400afafaf00faaf 0000fbaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf07 00afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400d69dd69d569d00 0900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0964df6464 af00afafaf00f9af100000afaf0000afaf00afafaf00afafaf00faaf2800 00afafaf0000afaf00afafaf00afafaf00afaf0000afaf0000afaf0000af af0000afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400d6d69d9d9d 56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8af0864df 6464af00afafaffa00fdaffd0007af0000afaf000000fcaf0000f8affd00 fcaf0b00afafaf00afafaf00afafaffc00fcaffc00fcaf030000af00fcaf 0000e4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf01dfdfd5af046464afafaff3df88af0564df6464af00e5af0000b0 af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 01dfdff7affd00fcaffd00f5affd00f6af046464afafaff4df0064f9affd 00f0affd00faaf010000fbaf0000deaf0000d6af0564df6464af00e5af00 00b0af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf fcaf01dfdff7af0000fcaf060000afafaf0000f5af0000f6af066464afaf afdfdff7af016464f9af0000ecaf0000faaf0200af00fcaf0000deaf0000 d6af0764df6464af000000e9affd00b0af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff7af0000fcaf0000fbaf00 00f5af0000f6af066464afafafdfdff7af016464f9af0000ecaf0000faaf 0200af00fcaf0000deaf0000d6af0364df646492af0edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0400afafaf 00f7af0400af000000fcaf0000f6af066464afafafdfdff7af016464f9af 0000fcaffc00fdaf0400af000000fcaf0000faaf0a00afaf00afafaf00af afaffc00fdaf0c00af0000af00af0000afaf0000fcaffc00fdaf0600afaf af000000dcaf0364df646492af0edfdf64dfaf646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf01dfdff7af0400afafaf00f7af090000afaf 0000afafaf00f6af066464afafafdfdff7af016464f9af1500afafaf0000 afaf0000afaf0000afaf0000afafaf00faaf3100afaf00afafaf00afaf00 00afaf0000afaf0000afafaf0000afaf0000afaf00afaf0000afaf0000af af00afaf00afafaf00ddaf0964df6464af000000afaffc00efaffd00f7af fd00faaffd00ddaf0000e9af0edfdf64dfaf646400d69dd69d569d000900 d6d69d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf0400 afafaf00f6af066464afafafdfdff7af016464f9af0000f8af0300afaf00 fcaf0400afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fc af0800afafaf00afafaf00f9af0700afaf00afaf0000daaf0964df6464af 00afafaf00fcaf0000eeaf0000f9af0f0000afafaf0000afaf0000afafaf 0000e3af0400afafaf00e9af0edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf0400 afafaf00f6af066464afafafdfdff7af016464f9af0000fcaffb0002afaf 00fcaf0400afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00 fcaf0b00afafaf00afafaf00afafaffb0008afaf00afafaf000000dcaf09 64df6464af00afafaf00fcaf0000eeaf0000f9af0000fbaf0300afaf00fb af0000e3af0400afafaf00e9af0edfdf64dfaf646400d69dd69d569d0009 00d6d69d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf04 00afafaf00f6af066464afafafdfdff7af016464f9af0c00afafaf0000af afaf00afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf03 00afaf00fcaf1300afafaf00afafaf00afaf0000afafaf00afaf00fbaf01 0000ddaf0564df6464af00f8af0300afafaffc00fcaffd00fcaf0000faaf 0000f7af0000f8af0700af0000afaf0000fcaffc00fcaffc000bafaf0000 00afaf00af000000edaf0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdff7af0000fcaf0000fbaf0300afaf00fcaf04 00afafaf00f6af066464afafafdfdff7af016464f9af0400afafaf00fcaf 0300afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf0300 afaf00fcaf0b00afafaf00afafaf00afaf00fcaf0300afaf00faaf0000dd af0564df6464af00f8af1300afaf0000afaf0000afaf00afafaf00afafaf 00faaf0000f6af010000faaf240000afaf0000afaf00afaf0000afaf0000 afaf0000afaf0000afaf00afafaf0000afaf0000eeaf0edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0000fcaf 090000afafaf0000afaf00fcaf0400afafaf00f6af066464afafafdfdff7 af016464f9af0c00afafaf0000afaf0000afaf00fcaf0400afafaf00faaf 0000fbaf0c0000afaf0000afaf0000afaf00fcaf1a00afafaf00afafaf00 afaf0000afaf0000afaf00afaf00afafaf00ddaf0564df6464af00fbaffd 00f8af0400afaf0000faaf0000faaf0000f4af010000fcaf0b00afafaf00 afafaf00afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000ee af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 01dfdff7af0000faaffd00fcaf0000fcaf0400afafaf00f6af066464afaf afdfdff564f9af0000fcaffd0004af0000af00fcaf0400afafaf00faaf00 00fbaf040000afafaffc00fdaf0000fcaf1900afafaf00afafaf00afafaf 000000af0000af00afafaf000000dcaf0564df6464af00f8af0300afafaf fb00fdaffd00fcaf0000faaf0000f2af0f0000afaf00afafaf00afafaf00 afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000eeaf0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7 af0000eaaf0000f6af056464afafafdff464f9af0000ecaf0000a5af0564 df6464af00f8af0800afaf0000afafaf00fbaf050000afafaf00faaf0000 f1af0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf0700af af00afafaf00fcaf0000eeaf0edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf01dfdff7af0000eaaf0000f6af016464e9af00 00ecaf0000a5af0964df6464af00afafaf00fcaf0300afaf00fcaf0000fa af0400afafaf00f9af0000fbaf0300afaf00fbaf0e00afaf00afafaf00af afaf00afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000eeaf 0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01 dfdff7affd00eeaffd00f6af016464e9affd00f0affd00a5af0964df6464 af00afafaf00fcaf1300afaf0000afaf0000afaf00afafaf00afafaf00f9 af310000afafaf0000afaf0000afafaf0000afaf00afafaf00afafaf00af af0000afaf0000afaf0000afaf0000afaf00afafaf00fcaf0000eeaf0edf df64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdf d5af01646480aff8af0564df6464af00fcaffc00fcaffd0007af0000afaf 000000fcaf0000f7affd00faaffd00fcaf0b00afafaf00afafaf00afafaf fc00fcaffc00fcaf030000af00fcaf0000eeaf0edfdf64dfaf646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af 0564df6464af00e5af0000b0af0edfdf64dfaf646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf01dfdfd36480aff8af0564df6464af00e5af 0000b0af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf00dfd26480aff8af0764df6464af000000e9affd00b0af0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcafd1df80aff8 af0364df646492af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcafd2df006480aff8af0364df646492af0edfdf64dfaf6464 00d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480 aff8af0364df646492af0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0364df646492af0edf df64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdf d5af01646480aff8af0364df646492af0edfdf64dfaf646400d69dd69d56 9d000900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0364df 646492af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcaf01dfdfd5af01646480aff8af0364df646492af0edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6affd00fcaf fd00fcaf0000fbaffd00f6af01646480aff8af0364df646492af0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff6af 0000fcaf090000afafaf0000afaf00f9af0000f6af046464afafaff3df88 af0364df646492af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcaf01dfdff6af0000fcaf0000fbaf0300afaf00f9af0000f6 af046464afafaff4df0064f9affd00f7af0000fbaffd00faaffa00fdaffa 00b9af0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdff6af0400afafaf00f7af0800af000000afaf af00f6af066464afafafdfdff7af016464f9af0000f5af0000f9af0000fa af0000fcaf040000afaf00fcaf010000baaf0364df646492af0edfdf64df af646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af04 00afafaf00f7af080000afaf0000afaf00f6af066464afafafdfdff7af01 6464f9af0000f5af0000f9af0000faaf0000fbaf0300afaf00fbaf0000ba af0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d 569d56dfdffcaf01dfdff6af0400afafaf00f7af0000fcaf0300afaf00f6 af066464afafafdfdff7af016464f9af0000fcaffc00fdaf0800af000000 afafaf00faaf0000fbaf0300afaf00fbaf0300afafaffc000aafaf0000af afaf0000afaffc00fcaffd00d7af0364df646492af0edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af0400afafaf 00f7af0000fcaf0300afaf00f6af066464afafafdfdff7af016464f9af14 00afafaf0000afaf0000afaf0000afaf0000afaf00faaf0000fcaf0400af afaf00fcaf1f00afafaf0000afaf0000afaf00afafaf00afaf0000afaf00 00afaf00afafaf00d8af0364df646492af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff6af0400afafaf00f7af00 00fcaf0300afaf00f6af066464afafafdfdff7af016464f9af0000f8af03 00afaf00fcaf0300afaf00faaffb00fcaffb00fcaf0000fcaf0a00afafaf 00af00afafaf00fcaf0400afaf0000d5af0364df646492af0edfdf64dfaf 646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af0000 fcaf0000fbaf0300afaf00fcaf0300afaf00f6af066464afafafdfdff7af 016464f9af0000fcaffb0002afaf00fcaf0300afaf00faaf0000fcaf0400 afafaf00fcaf0400afafaf00fcaf0000fcaf0000fcaffa00fdaffd00d7af 0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d56 9d56dfdffcaf01dfdff6af0000fcaf110000afafaf0000afaf0000afaf00 00afaf00f6af066464afafafdfdff7af016464f9af0c00afafaf0000afaf af00afaf00fcaf0300afaf00faaf0000fbaf0300afaf00fbaf0300afaf00 fcaf0000fcaf0000fcaf0000f6af010000d8af0364df646492af0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af 0000faaffd00fcaf0800af000000afafaf00f6af066464afafafdfdff7af 016464f9af0400afafaf00fcaf0300afaf00fcaf0300afaf00faaf0000fb af0300afaf00fbaf0300afaf00fcaf0a00afafaf00af00afafaf00f5af00 00d8af0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdff6af0000ebaf0000f6af066464afafafdfdf f7af016464f9af1400afafaf0000afaf0000afaf0000afaf0000afaf00fa af0000fcaf040000afaf00fcaf1f0000afaf0000afaf0000afaf00afafaf 00afaf0000afaf0000afaf00afafaf00d8af0364df646492af0edfdf64df af646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af00 00ebaf0000f6af066464afafafdfdff564f9af0000fcaffd000caf0000af 00af000000afafaf00faaffa00fdaffa00fcaffc000aafaf0000afafaf00 00afaffc00fcaffd00d7af0364df646492af0edfdf64dfaf646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf01dfdff6affd00efaffd00f6af 056464afafafdff464f9af0000edaf0000a4af0364df646492af0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af 016464e9af0000edaf0000a4af0364df646492af0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af016464e9affd 00f1affd00a4af0364df646492af0edfdf64dfaf646400d69dd69d569d00 0900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0364df6464 90df0c64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 dfdfd5af01646480aff8af0264df648fdf0c64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf01dfdfd36480aff8af8b640bdfaf6464 00d6d69d9d9d56000900d69dd69d569d56dfdffcaf00dfd26480aff8af8a df0aaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf 09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf09646400d69d d69d569d000900d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d 9d56000900d69dd69d569d56dfdfcaaff36480af91af09646400d69dd69d 569d000900d6d69d9d9d5656dfdfcaaff46400dff9affd00f8af0000f9af fc00fbaf0000f9af000080afbdaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfcaaf016464f7e201dfdff9af0000f6af0000f9af0300afaf 00fbaf0000f9af0000f0af000080afceaf09646400d69dd69d569d000900 d6d69d9d9d5656dfdfcaaf016464f7e201dfdff9af0000f5af0000fbaf04 00afafaf00faaf0000fbaf0000efaf000080afceaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfcaaf016464f7e201dfdff9af0000fcaffc 00fdaf0000fbaf0400afafaf00faaf0000fbaf0300afafaffc00fcaffc00 09af000000afafaf00000080afd5af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfcaaf016464f7e201dfdff9af1600afafaf0000afaf0000 afaf0000afafaf0000afafaf00faaf200000afafaf0000afaf0000afaf00 00afaf0000afaf0000af00afafaf00afafaf0080afd6af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfcaaf016464f7e201dfdff9af0000f8 af0800afafaf00afafaf00fcaf0000f9af0800afafaf00afafaf00fcaf03 00afaf00faaf0500afafaf000080afd3af09646400d69dd69d569d000900 d6d69d9d9d5656dfdfcaaf016464f7e201dfdff9af0000fcaffb00fdaf04 00afafaf00fcaf0000f9af0700afafaf00afafaffa0002afaf00faaf0000 fcaffd0080afd5af09646400d6d69d9d9d56000900d69dd69d569d56dfdf caaf016464f7e201dfdff9af0900afafaf0000afafaf00fcaf0200af00fb af0000f8af0200af00fcaf0000f9af0000faaf0000faaf01000080afd6af 09646400d69dd69d569d000900d6d69d9d9d5656dfdfcaaf016464f7e201 dfdff9af0400afafaf00fcaf0000fcaf0200af00fbaf0000f8af0200af00 fcaf0000f9af0000fcaf0200af00f9af000080afd6af09646400d6d69d9d 9d56000900d69dd69d569d56dfdfcaaf016464f7e201dfdff9af0900afaf af0000afaf0000fbaf0000faaf0000f7af0000fbaf170000afaf0000afaf 0000afaf0000af00afafaf00afafaf0080afd6af09646400d69dd69d569d 000900d6d69d9d9d5656dfdfcaaf016464f5dff9af0000fcaffd0002af00 00fcaf0000faaf0000f7af0000faaffc00fcaffc00fdaf060000afaf0000 0080afd5af09646400d6d69d9d9d56000900d69dd69d569d56dfdfcaaf00 64f4dff9af0000ebaf000080afafaf09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfb6af0000ebaf000080afafaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfb6affd00efaffd00a6aff3df96af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc5aff4df0064f9affd00f4 affd00fbaff700bdaf09646400d6d69d9d9d56000900d69dd69d569d56df df80afc5af01dfdff7af016464f9af0000f5af0000fcaf0000f7af0000ec af0000ceaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5 af01dfdff7af016464f9af0000f5af0000fcaf0000f7af0000ecaf0000ce af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af01dfdf f7af016464f9af0000fcaffc0008afaf000000afafaf00f7af0000faaffc 0006afaf0000afafaffb0002afaf00fcaf0700af00af0000afaffc00e2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5af01dfdff7 af016464f9af0c00afafaf0000afaf0000afaf00fcaf0000f7af0000fbaf 130000afaf0000afaf00afafaf00afaf00afafaf00fcaf0c00af0000afaf af0000afaf0000e3af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc5af01dfdff7af016464f9af0000f8af0300afaf00fcaf0000f7af 0000fbaf0000fcaf0e00afafaf00af00afafaf00afafaf00fcaf0200af00 fcaf0000fcaf0000e3af09646400d69dd69d569d000900d6d69d9d9d5656 dfdff9aff36480afd9af01dfdff7af016464f9af0000fcaffb0002afaf00 fcaf0000f7af0000fbaffa00fcaf0000fcaf0400afafaf00fcaf0200af00 fcaffa00e3af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9af f46400dff9affd00f1affd00faaff900f0af0000eaaf010000fbaf0000de af0000d4af01dfdff7af016464f9af0c00afafaf0000afafaf00afaf00fc af0000f7af0000fbaf0000f7af0000fcaf0400afafaf00fcaf0200af00fc af0000deaf09646400d69dd69d569d000900d6d69d9d9d5656dfdff9af01 6464f7e201dfdff9af0000edaf0000faaf0000eaaf0000eaaf0200af00fc af0000deaf0000d4af01dfdff7af016464f9af0400afafaf00fcaf0300af af00fcaf0000f7af0000fbaf0000f8af0a00af00afafaf00afafaf00fcaf 0200af00fcaf0000deaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdff9af016464f7e201dfdff9af0000edaf0000faaf0000d3af0200af00 fcaf0000deaf0000d4af01dfdff7af016464f9af0c00afafaf0000afaf00 00afaf00fcaf0000f7af0000fbaf1a0000afaf0000afaf00afafaf00afaf 00afafaf0000afaf0000af00fcaf050000afaf0000e3af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdff9af016464f7e201dfdff9af0000fc affc0002afaf00fbaf0300afaf00faaf0000f8affc00fcaffc0009afaf00 afaf00af000000fcaffd0001af00faaf0a00afaf00afafaf00afafaffc00 fdaf0c00af0000af00af0000afaf0000fcaffc00fdaf0600afafaf000000 daaf01dfdff564f9af0000fcaffd0009af0000afaf0000afaf00f7af0000 faaffc0015afaf0000afafaf0000afaf0000afaf000000af00af00fbaffc 00e2af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9af016464 f7e201dfdff9af0b00afafaf0000afaf0000af00fbaf0300afaf00faaf00 00f9af1f0000afaf0000afaf0000afaf0000af00afaf0000afaf0000afaf 0000afaf0000faaf3100afaf00afafaf00afaf0000afaf0000afaf0000af afaf0000afaf0000afaf00afaf0000afaf0000afaf00afaf00afafaf00db af00dff464f9af0000f0af0000afaf09646400d69dd69d569d000900d6d6 9d9d9d5656dfdff9af016464f7e201dfdff9af0000f8af0b00afaf00afaf af00afafaf00faaffa00f9af0300afaf00faaf0300afaf00fcaf0300afaf 00fcaf0000faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf0800 afafaf00afafaf00f9af0700afaf00afaf0000c4af0000f0af0000afaf09 646400d6d69d9d9d56000900d69dd69d569d56dfdff9af016464f7e201df dff9af0000fcaffb000aafaf00afafaf00afafaf00faaf0000f8affb0002 afaf00faaf0300afaf00fcaf0300afaf00fcaf0000faaf0a00afafaf00af af00afaf00fcaf0300afaf00fcaf0b00afafaf00afafaf00afafaffb0008 afaf00afafaf000000c6affd00f4affd00afaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdff9af016464f7e201dfdff9af1400afafaf0000 afafaf00afaf00afafaf00afafaf00faaf0000f9af080000afafaf00afaf 00faaf0300afaf00fcaf0300afaf00fcaf0000faaf0000fcaf0500af00af af00fcaf0300afaf00fcaf1300afafaf00afafaf00afaf0000afafaf00af af00fbaf01000080afe4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdff9af016464f7e201dfdff9af0400afafaf00fcaf0600afafaf00af 00fcaf0000faaf0000f9af0000fcaf0300afaf00fcaf0500af00afaf00fc af0300afaf00fcaf0000faaf0000fcaf0500af00afaf00fcaf0300afaf00 fcaf0b00afafaf00afafaf00afaf00fcaf0300afaf00faaf000080afe4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdff9af016464f7e201 dfdff9af0f00afafaf0000afaf0000afafaf00af00fcaf0000faaf0000f9 af120000afaf0000afaf0000afaf0000af00afaf00fcaf0800afaf0000af af0000faaf0000fbaf0c0000afaf0000afaf0000afaf00fcaf1a00afafaf 00afafaf00afaf0000afaf0000afaf00afaf00afafaf0080afe4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdff9af016464f5dff9af0000 fcaffd0006af0000afafaf00fbaf0000faaf0000f8affd0004af0000afaf fc0005afaf00afaf00fcaf0800afafaf000000af00faaf0000fbaf040000 afafaffc00fdaf0000fcaf1900afafaf00afafaf00afafaf000000af0000 af00afafaf00000080afe3af09646400d69dd69d569d000900d6d69d9d9d 5656dfdff9af0064f4dff9af0000edaf0000d3af000080afacaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdfe5af0000edaf0000d8af0500 00afaf0000a3aff3df96af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfe5affd00f1affd00d7affc00a2aff4df0064f9affd00f4affd00fd affd00f7affd00c1af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc5af01dfdff7af016464f9af0000f4af0a0000afafaf0000afafaf 00f9af060000afafaf0000c3af09646400d69dd69d569d000900d6d69d9d 9d5656dfdf80afc5af01dfdff7af016464f9af0000f4af0000fbaf0400af afaf00f9af0000fbaf0000c3af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc5af01dfdff7af016464f9af0000fcaffc00fdaf0000f6 af0000faaf0000f6affc00fdaf0400af000000fcaffc00fdaffc0002afaf 00fbaf0200afaffc00f0af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc5af01dfdff7af016464f9af0c00afafaf0000afaf0000afaf 00f6af0000faaf0000f7af1e0000afaf0000afaf0000afaf0000afaf0000 afaf0000af0000afaf0000af00fbaf0700af0000afaf0000f1af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af01dfdff7af016464 f9af0000f8af0300afaf00f6af0000faaf0000f7af0000fcaf0300afaf00 fcaf0300afaf00f5af0a00afaf00afafaf00afaf00fcaf0000f1af096464 00d69dd69d569d000900d6d69d9d9d5656dfdff9aff3df80afd9af01dfdf f7af016464f9af0000fcaffb0002afaf00f6af0000faaf0000f7af0000fc af0300afaf00fcaf0300afaf00f9affb0008afaf00afafaf00afaffa00f1 af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9aff4df0064f9 affd00f7af0400af000000f8affd00fcaf0000ecaf0000f1af0000faaf00 00adaf01dfdff7af016464f9af0c00afafaf0000afafaf00afaf00f6af00 00faaf0000f7af0000fcaf0300afaf00fcaf0300afaf00faaf0f0000afaf af00afaf00afafaf00afaf00ecaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdff9af01dfdff7af016464f9af0000f5af0400afafaf00faaf 090000afafaf0000afaf00ecaf0000f1af0000faaf0000adaf01dfdff7af 016464f9af0400afafaf00fcaf0400afafaf00fbaf0400afafaf00f9af00 00fbaf0300afaf00fcaf0300afaf00fcaf0300afaf00fcaf0200af00fcaf 0a00afafaf00af00afafaf00ecaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdff9af01dfdff7af016464f9af0000f5af0400afafaf00faaf 0000fbaf0300afaf00ecaf0000f1af0000a6af01dfdff7af016464f9af17 00afafaf0000afaf0000afafaf0000afafaf0000afafaf00f9af110000af afaf0000afaf0000afaf0000afaf00fcaf1e00afaf0000afaf0000af0000 afaf0000afafaf00af00afafaf0000afaf0000f1af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdff9af01dfdff7af016464f9af0000fcaffc 00fdaf0400afafaf00faaf0000f8af0400af000000fcaffc00fcaffd0004 af00afafaffc00f8af0000faaf0700afaf00af000000fcaffc00fcaffd00 c3af01dfdff564f9af0000fcaffd0002af0000fcaffd00fbaf0000f7affd 00fbaffc00fdaf0000fcaf0300afafaffc00fdaffd0006af0000afafaf00 fbaffc00f0af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9af 01dfdff7af016464f9af1000afafaf0000afaf0000afaf00afafaf00f9af 010000faaf1d0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000f9af0000faaf1700afaf0000afaf0000afaf0000afaf0000 afaf00afafaf00c4af00dff464f9af0000eaaf0000b5af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdff9af01dfdff7af016464f9af0000f8 af0700afaf00afafaf00f7af010000fcaf0000fcaf0000f9af0300afaf00 fcaf0300afaf00fcaf0000f9af0000faaf0300afaf00fcaf0300afaf00fc af0400afaf0000adaf0000eaaf0000b5af09646400d6d69d9d9d56000900 d69dd69d569d56dfdff9af01dfdff7af016464f9af0000fcaffb0006afaf 00afafaf00f5af040000afaf00fcaf0300afafaffb0002afaf00fcaf0200 afaffa00f9af0000faaf0300afaf00fcaf0200afaffa00fdaffd00afaffd 00eeaffd00b5af09646400d69dd69d569d000900d6d69d9d9d5656dfdff9 af01dfdff7af016464f9af1000afafaf0000afafaf00afaf00afafaf00f4 af0300afaf00fcaf0b00afaf0000afafaf00afaf00fcaf0300afaf00f4af 0000faaf0300afaf00fcaf0300afaf00f6af01000080afcdaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdff9af01dfdff7af016464f9af04 00afafaf00fcaf0700afaf00afafaf00faaf0000fbaf0300afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f4af0000faaf0300afaf00fc af0300afaf00f5af000080afcdaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdff9af01dfdff7af016464f9af1000afafaf0000afaf0000af af00afafaf00faaf090000afafaf0000afaf00fcaf1800afaf0000afaf00 00afaf0000afaf0000afaf0000afaf0000f9af0000faaf0300afaf00fcaf 0f00afaf0000afaf0000afaf00afafaf0080afcdaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdff9af01dfdff564f9af0000fcaffd0008af 0000af00afafaf00f8affd00fcaf0000fcaf1300afafaf000000af0000af af000000af00afafaffc00f8affa0004af00afaf00fcaf0300afafaffc00 fcaffd0080afccaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf f9af00dff464f9af0000f1af000080af80affaaf09646400d6d69d9d9d56 000900d69dd69d569d56dfdfe5af0000f1af000080af80affaaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdfe5affd00f5affd0080af80af faaf09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80af80afceaf09646400d69dd69d 569d000900d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56 000900d69dd69d569d56dfdf80af80afceaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80af80afceaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80af80afceaf09646400d69dd69d569d000900d6d69d9d9d5656 dfdffcafc86480af8aaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdffcafc96400df80af8aaf09646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf016464ccaf01dfdf80af8aaf09646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf016464ccaf01dfdf80af8aaf09646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf80af8aaf 09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01 dfdf80afe3af010000fbaf0000deaf0300afaf00d5af09646400d69dd69d 569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf80afe3af0200 af00fcaf0000deaf0300afaf00d5af09646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf016464ccaf01dfdf80afe3af0200af00fcaf0000de af0000d2af09646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01 6464ccaf01dfdf80afe3af0a00afaf00afafaf00afafaffc00fdaf0c00af 0000af00af0000afaf0000fcaffc00fdaf0400afaf00affa00fdaffc00e3 af09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464f7af 0000d6af07dfdfafafaf000000eeaffd00f9af0000faaf0000ebaf0000fb af0000fbaf0200af00f9af0000faaf0000c0af2d00afaf00afafaf00afaf 0000afaf0000afaf0000afafaf0000afaf0000afaf00afaf0000afaf0000 afaf00afaf00faaf0800afaf0000afaf0000e4af09646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464f9affd00d6af05dfdfafafaf00 eaaf0000f9af0000faaf0000ebaf0000fbaf0000fbaf0200af00f9af0700 afaf00afafaf00c0af0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf 0800afafaf00afafaf00f9af0600afaf00afaf00fbaf0400afafaf00fcaf 0000e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0164 64f7af0000d6af05dfdfafafaf00eaaf0000f9af0000e4af0000fcaf0200 af00fcaf0000f7af0700afaf00afafaf00c0af0a00afafaf00afaf00afaf 00fcaf0300afaf00fcaf0b00afafaf00afafaf00afafaffb0005afaf00af af00fcaf0000fcaffa00e4af09646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf016464f7af0000d6af05dfdfafafaf00fcaffc000eafaf00 afafaf00afafaf00afafaf00f9af0000faaf0700afaf00af000000fcaffc 00f9af2000afafaf00af00afafaf00afaf00afafaf000000af00af000000 afaf00af000000c4af0000fcaf0500af00afaf00fcaf0300afaf00fcaf1a 00afafaf00afafaf00afaf0000afafaf00afaf00afaf00afafaf00fbaf00 00dfaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464 f7af0000d6af1cdfdfafafaf00afafaf0000afaf0000af00afafaf00afaf af00afafaf00f9af0000faaf1000afaf0000afaf0000afaf0000afaf0000 faaf2100afafaf00af00afafaf00afaf00afaf0000afaf0000afaf00afaf af0000afaf0000c5af0000fcaf0500af00afaf00fcaf0300afaf00fcaf0b 00afafaf00afafaf00afaf00fcaf0900afaf00afaf00afaf00faaf0000df af09646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464f7af 0000d6af05dfdfafafaf00f8af0e00af00afafaf00afafaf00afafaf00f9 af0000faaf0300afaf00fcaf0300afaf00fcaf0000faaf1000afafaf00af 00afafaf00afaf00afaf00fcaf0700afaf00afafaf00fcaf0000c5af0000 fbaf0c0000afaf0000afaf0000afaf00fcaf1800afafaf00afafaf00afaf 0000afaf0000afaf00afaf00af00f9af050000afaf0000e4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464f7af0000d6af05df dfafafaf00fcaffb0008afaf00afaf00afaf00fcaf0000f9af0000faaf03 00afaf00fcaf0200afaffa00f9af0f00af00afafaf00af00afafaf00afaf 00fcaf0700afaf00afafaf00fcaf0000c5af0000fbaf040000afafaffc00 fdaf0000fcaf1700afafaf00afafaf00afafaf000000af0000af00afaf00 affa00fdaffc00e3af09646400d69dd69d569d000900d6d69d9d9d5656df dffcaf016464f7af0000d6af17dfdfafafaf00afafaf0000afafaf00afaf 00afaf00afaf00fcaf0000f9af0000faaf0300afaf00fcaf0300afaf00f4 af0f00af00afafaf00af00afafaf00afaf00fcaf0700afaf00afafaf00fc af000080afecaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffc af016464f7af0000d6af09dfdfafafaf00afafaf00fcaf0900afaf00af00 af00af00fcaf0000f9af0000faaf0300afaf00fcaf0300afaf00f4af0f00 af00afafaf00af00afafaf00afaf00fcaf0700afaf00afafaf00fcaf0000 80afecaf09646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf0164 64f7af0000d6af16dfdfafafaf00afafaf0000afaf0000afafaf00afafaf 00fbaf0000f9af0000faaf0300afaf00fcaf0800afaf0000afaf0000f8af 0000fbaf0000fcaf0f00afaf0000afaf0000afaf00afafaf00fcaf000080 afecaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464 f7af0000d6af05dfdfafafaf00fcaffd0009af0000afaf00afafaf00fbaf 0000f9affa0004af00afaf00fcaf0300afafaffc00f7af0000fbaf0000fc af0f00afafaf000000af00afafaf0000af00fcaf000080afecaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf05dfdfafaf af00eaaf00009caf8b640bdfaf646400d6d69d9d9d56000900d69dd69d56 9d56dfdffcaf016464ccaf05dfdfafafaf00eaaf00009caf8cdf0c64dfaf 646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf07df dfafafaf000000eeaffd009caf8b640bdfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf016464ccaf01dfdf81af8d640ddf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81 af00648faf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56 dfdffcaf016464ccaf01dfdf81af00648faf0edfdf64dfaf646400d69dd6 9d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0664af 000000afaffc00fdaf010000fbaf0400af000000faaf010000fbaf0000b6 af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 016464ccaf01dfdf81af0664af00afafaf00fcaf0500afaf00af00fcaf04 00afafaf00faaf0200af00fcaf0000b6af0edfdf64dfaf646400d69dd69d 569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0664af00 afafaf00fcaf0500afaf00af00fcaf0400afafaf00faaf0200af00fcaf00 00b6af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf fcaf016464ccaf01dfdf81af0664af00afafaf00fcaf0e00afaf00afaf00 afafaf00afafaf00faaf0a00afaf00afafaf00afafaffc00fdaf0400af00 0000fcaffc00cdaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcaf016464ccaf01dfdf81af0664af00afafaf00fcaf0e00af af00afaf00afafaf00afafaf00faaf1f00afaf00afafaf00afaf0000afaf 0000afaf0000afaf0000afaf0000afaf0000ceaf0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf84af09 64df6464af00afafaf00fcaf0e00afaf00afafaf00afaf00afafaf00faaf 0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000 ceaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc af016464cadf84af0964df6464af00afafaf00fcaf0e00afaf00afafaf00 afaf00afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf 0200afaffa00ceaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d 569d56dfdffcaf0064c9df84af0964df6464af00afafaf00fcaf0300afaf 00fcaf0600af00afafaf00faaf0000fcaf0500af00afaf00fcaf0300afaf 00fcaf0300afaf00c9af0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80afc8af0964df6464af00afafaf00fcaf0300afaf00fc af0600af00afafaf00faaf0000fcaf0500af00afaf00fcaf0300afaf00fc af0300afaf00c9af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc8af0964df6464af00afafaf00fcaf0300afaf00fbaf05 0000afafaf00faaf0000fbaf0c0000afaf0000afaf0000afaf00fcaf0800 afaf0000afaf0000ceaf0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80afc8af0564df6464af00fcaffc00fdaf0000fbaf0500 00afafaf00faaf0000fbaf040000afafaffc00fdaf0000fcaf0300afafaf fc00cdaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcafc86484af0564df6464af00eaaf0000a8af0edfdf64dfaf646400d6 9dd69d569d000900d6d69d9d9d5656dfdffcafc96400df81af0264af00ea af0000a8af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56 dfdffcaf016464ccaf01dfdf81af0464af000000eeaffd00a8af0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf 01dfdf81af00648f000edfdf64dfaf646400d6d69d9d9d56000900d69dd6 9d569d56dfdffcaf016464ccaf01dfdf81af00648f000edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81 af046400afafaffc0000affc0001afaffb0004af00afafaff90000aff100 03af0000aff70000aff90000afef0000afe7000edfdf64dfaf646400d6d6 9d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af0264 00affc00fdaffc0002af00affc0004af000000aff90000aff10003af0000 aff70000aff90000afef0000afe7000edfdf64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af026400affa00 00affc0002af00affc0004af000000aff90000aff10000afec0000afef00 00afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcaf016464ccaf01dfdf81af026400affa0000affc000baf0000af0000 00af000000aff90007af0000af00afafaffc00fdaf0600af0000af00affb 000daf00af000000afafaf00af0000affc0002af0000fcaffd0000afe700 0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01 6464f7af0000d6af01dfdf81af026400affa0000affc000baf0000af0000 00af000000aff90015af0000afaf0000afaf0000afaf0000afaf0000af00 affb000daf00af0000afaf0000afaf0000affc000aaf00afaf0000afaf00 00afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcaf016464f9affd00d6af07dfdfafafaf000000f7af0000faaffd00fa af010000fbaf0000deaf0000f9af0000deaf0000f6af026400affa0000af fc000baf000000af0000af000000aff90003af0000affc0003af0000affc 0010af0000af0000af000000af0000af0000affc0003af0000affc0000af fa0003af0000afe7000edfdf64dfaf646400d69dd69d569d000900d6d69d 9d9d5656dfdffcaf016464f7af0000d6af05dfdfafafaf00f5af0000f8af 0000faaf0200af00fcaf0000deaf0000f9af0000e2af0400afafaf00f6af 026400affa0000affc000baf000000af0000af000000aff90003af0000af fc0003af0000affc0010af0000af0000af000000af0000af0000affc0003 af0000affc0002af0000fbaf020000afe7000edfdf64dfaf646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf016464f7af0000d6af05dfdfaf afaf00f5af0000f8af0000faaf0200af00fcaf0000deaf0000f9af0000e2 af0400afafaf00f6af026400affa0000affc0000affc0006af00af000000 aff90003af0000affc0003af0000affc0010af0000af0000af000000af00 00af0000affc0003af0000affc000aaf00afaf000000af0000afe7000edf df64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464 f7af0000d6af05dfdfafafaf00fcaffc00fdaf0400af000000fcaf0000fa af0a00afaf00afafaf00afafaffc00fdaf0c00af0000af00af0000afaf00 00fcaffc00fdaf0000f9af0000f9affc00fdaf0400af000000fcaffd000c af00af000000afaf00af000000faaf026400affa0000affc0000affc0006 af00af000000aff90003af0000affc0003af0000affc0010af0000af0000 00af00af000000af0000affc0003af0000affc0002af00affc0003af0000 afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf fcaf016464f7af0000d6af1adfdfafafaf00afafaf0000afaf0000afaf00 00afaf0000afafaf00faaf2a00afaf00afafaf00afaf0000afaf0000afaf 0000afafaf0000afaf0000afaf00afaf0000afaf0000afaf00f9af0000fa af210000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00afafaf 0000afaf0000fbaf026400affa0000affc0000affb0005afaf000000aff9 0003af0000affc002faf0000afaf0000afaf0000af000000af00af000000 af0000afaf0000afaf0000afaf0000afaf00afaf0000afaf0000afe7000e dfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf0164 64f7af0000d6af05dfdfafafaf00f8af0300afaf00fcaf0400afafaf00fa af0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf0800afafaf00afaf af00f9af0300afaf00f9af0000faaf0000fcaf0300afaf00fcaf0300afaf 00fcaf0700afaf00afafaf00fcaf0000fbaf026400affa0000affc0000af fb0005afaf000000aff90003af0000affc000baf000000afafaf00af0000 affc0000affc001aaf000000afafaf00af000000afafaf00af0000afafaf 00afaf00afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d56 9d56dfdffcaf016464f7af0000d6af05dfdfafafaf00fcaffb0002afaf00 fcaf0400afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fc af0b00afafaf00afafaf00afafaffb0002afaf00f9af0000faaffa0002af af00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000fbaf026400af ea0000afa8000edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d56 56dfdffcaf016464f7af0000d6af11dfdfafafaf00afafaf0000afafaf00 afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf0300afaf 00fcaf1300afafaf00afafaf00afaf0000afafaf00afaf00f9af0000faaf 0000f9af0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000fbaf 026400afea0000afa8000edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf016464f7af0000d6af09dfdfafafaf00afafaf00fc af0300afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf03 00afaf00fcaf0b00afafaf00afafaf00afaf00fcaf0300afaf00f9af0000 faaf0000f9af0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000 fbaf046400afafafee00fdafa8000edfdf64dfaf646400d69dd69d569d00 0900d6d69d9d9d5656dfdffcaf016464f7af0000d6af11dfdfafafaf00af afaf0000afaf0000afaf00fcaf0400afafaf00faaf0000fbaf0c0000afaf 0000afaf0000afaf00fcaf1300afafaf00afafaf00afaf0000afaf0000af af00f9af0000faaf080000afaf0000afaf00fcaf0f00afaf0000afaf0000 afaf00afafaf00fcaf0000fbaf00648faf0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf016464ccaf05dfdfafafaf00fcaf fd0004af0000af00fcaf0400afafaf00faaf0000fbaf040000afafaffc00 fdaf0000fcaf1300afafaf00afafaf00afafaf000000af0000af00f9affa 0001afaffc00fdaf0000fcaf0f00afafaf000000af00afafaf0000af00fc af0000fbaf00648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d 9d9d5656dfdffcaf016464ccaf05dfdfafafaf00ecaf0000acaf0000efaf 0664af000000afaffc00fdaf010000fbaf0400af000000f8affd00b3af0e dfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0164 64ccaf05dfdfafafaf00ecaf0000b1af050000afaf0000efaf0664af00af afaf00fcaf0500afaf00af00fcaf0400afafaf00faaf060000afafaf0000 b5af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc af016464ccaf07dfdfafafaf000000f0affd00b0affc00eeaf0664af00af afaf00fcaf0500afaf00af00fcaf0400afafaf00faaf0000fbaf0000b5af 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 6464ccaf01dfdf81af0264af00f8af0e00afaf00afaf00afafaf00afafaf 00faaf0000f7affc00fcaffd0004af00afaf00fcaf0200afaffc00fdaf04 00af000000fcaffc00fdaffc00eaaf0edfdf64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0264af00f9af 0f00afafaf00afaf00afafaf00afafaf00f9af010000faaf100000afaf00 00afaf0000afaf0000afaf00fcaf1e00af0000afaf0000afaf0000afaf00 00afaf0000afaf0000af0000afaf0000ebaf0edfdf64dfaf646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af0264af 00faaf0000fcaf0b00afafaf00afaf00afafaf00f7af010000fcaf0000fc af0300afaf00fcaf0300afaf00fcaf0200af00fcaf0300afaf00fcaf0300 afaf00faaf0000fcaf0000ebaf0edfdf64dfaf646400d69dd69d569d0009 00d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0264af00fbaf0000 fbaf0b00afafaf00afaf00afafaf00f5af030000afaffa0002afaf00fcaf 0300afaf00fcaf0100affa0002afaf00fcaf0300afaf00faaffa00ebaf0e dfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0164 64ccaf01dfdf81af0264af00fcaf0000faaf0000fcaf0600af00afafaf00 f4af0300afaf00f9af0000fcaf0300afaf00fcaf0200af00f9af0000fcaf 0300afaf00faaf0000e6af0edfdf64dfaf646400d69dd69d569d000900d6 d69d9d9d5656dfdffcaf016464cadf81af0664af00afafaf00f9af0000fc af0600af00afafaf00faaf0000fbaf0300afaf00f9af0000fcaf0300afaf 00fcaf0200af00f9af0000fcaf0300afaf00fcaf0200af00e6af0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0064c9df81 af0664af00afafaf00f9af0000fbaf050000afafaf00faaf280000afafaf 0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000af0000af af0000afaf00fcaf0f00afaf0000afaf0000af0000afaf0000ebaf0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc8af0864 df6464af00afafaffa0002afaf00fbaf050000afafaf00f8affd00fbaffc 00fcaffd000baf00afafaf000000af00afaffc00fdaf0000fcaf0300afaf affc00fdaffc00eaaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80afc8af0564df6464af00eaaf0000e4af0000c5af0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc8af0564 df6464af00eaaf0000e4af0000c5af0edfdf64dfaf646400d6d69d9d9d56 000900d69dd69d569d56dfdffcafc86484af0764df6464af000000eeaffd 00e4af0000c5af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d 5656dfdffcafc96400df84af0364df64648faf0edfdf64dfaf646400d6d6 9d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf84af0364 df64648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656 dfdffcaf016464ccaf01dfdf84af0964df6464af000000afaffc00fdaf01 0000fbaf0400af000000faaf0000fbaf0000b5af0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf84af09 64df6464af00afafaf00fcaf0500afaf00af00fcaf0400afafaf00faaf00 00fcaf0000b4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf016464ccaf01dfdf81af0664af00afafaf00fcaf0500afaf 00af00fcaf0400afafaf00faaf0400afafaf00b3af0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af 0264af00f8af0e00afaf00afaf00afafaf00afafaf00faaf0300afaf00fa affc00fcaffc00fdaf0400af000000ccaf0edfdf64dfaf646400d69dd69d 569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0264af00 f8af0e00afaf00afaf00afafaf00afafaf00faaf0200af00faaf150000af af0000afaf0000afaf0000afaf0000afaf0000cdaf0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af 0264af00fbaffd00fdaf0b00afafaf00afaf00afafaf00faaffd00faaf00 00fcaf0300afaf00fcaf0300afaf00fcaf0000cdaf0edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464f7af0000fbaffc 00dfaf01dfdf81af0264af00f8af0e00afaf00afafaf00afaf00afafaf00 faaf0300afaf00fbaffa0001afaffa0002afaf00fcaf0000cdaf0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464f9af fd00fcaf0000fcaf0000e0af01dfdf81af0264af00f8af0300afaf00fcaf 0600af00afafaf00faaf0400afafaf00fcaf0000f9af0000f9af0000fcaf 0000cdaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf016464f7af0000fcaf0000fcaf0000e0af01dfdf81af0664af00af afaf00fcaf0300afaf00fcaf0600af00afafaf00faaf0000fcaf0400afaf af00f9af0000f9af0000fcaf0000cdaf0edfdf64dfaf646400d6d69d9d9d 56000900569d569d569d56dfdffcaf016464f7af0000fcaf0000fcaf0000 e0af01dfdf81af0664af00afafaf00fcaf0300afaf00fbaf050000afafaf 00faaf0000fbaf1800afaf0000afaf0000afaf0000afaf0000afaf0000af af0000cdaf0edfdf64dfaf646400d69dd69d569d000000fc56049d5656df dffcaf016464f7af0000fcaf0000fcaf0000e0af01dfdf81af0264af00fc affc00fdaf0000fbaf050000afafaf00faaf0000faaf0200afaffc00fcaf fc00fdaf0400af000000ccaf09dfdf64dfaf646400d6d6fc56ff000000fc d604569d56dfdffcaf016464f7af0000fcaf0000fcaf0000e0af07dfdfaf afaf000000f2af0400af000000faaffa00eaaf0000f5affb00fbaf0000f7 af0000ddaf0264af00eaaf0000e1af0000c8af09dfdf64dfaf646400d69d fcd6ff000900d6d6d69d9d5656dfdffcaf016464f7af0000fcaf0000fcaf 0000e0af05dfdfafafaf00f0af0400afafaf00faaf0000fcaf010000f6af 0000f6af0000f5af0000fcaf050000afafaf00f7af0000ddaf0264af00ea af0000e1af0000c8af0edfdf64dfaf646400d6d69dd6d6d6000900d69dd6 9d569d56dfdffcaf016464f7af0000fcaf0000fcaf0000e0af05dfdfafaf af00f0af0400afafaf00faaf0000fbaf0000f6af0000f6af0000f5af0000 fbaf0000cfaf0464af000000eeaffd00e1af0000c8af0edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464f7af0000fcaf 0000fcaf0000e0af05dfdfafafaf00fcaffc00fcaffd0005af00afafaf00 faaf0000fbaf0300afafaffc0007afaf000000afafaffc0006afaf00af00 0000f9af0000faaf0600afaf00afafaffc0009afaf00afaf00af000000fc affd0001af00edaf00648faf0edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf016464f7af0000fcaf0000fcaf0000e0af1adf dfafafaf00afafaf0000afaf0000afaf0000afaf0000afafaf00faaf0000 fcaf1c0000afaf0000afaf0000afaf00afafaf0000afaf0000af0000afaf 0000faaf0000faaf1d00afaf00afaf0000afaf0000af00afaf0000afaf00 00afaf0000afaf0000edaf00648faf0edfdf64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464f7af0000fbaffc00dfaf05dfdf afafaf00f8af0300afaf00fcaf0400afafaf00faaffa00f8af0700afaf00 afafaf00faaf0000fcaf0000faaf0000faaf0600afaf00afaf00faaf0300 afaf00fcaf0300afaf00fcaf0000edaf00648faf0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf05dfdfafafaf 00fcaffb0002afaf00fcaf0400afafaf00faaf0000f7affb0006afaf00af afaf00faaf0000fcaf0000faaf0000faaf0600afaf00afaf00faaf0300af af00fcaf0300afaf00fcaf0000edaf00648faf0edfdf64dfaf646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf11dfdfafafaf00 afafaf0000afafaf00afaf00fcaf0400afafaf00faaf0000f8af0c0000af afaf00afaf00afafaf00faaf0000fcaf0000faaf0000faaf0600afaf00af af00faaf0300afaf00fcaf0300afaf00fcaf0000edaf00648faf0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf 09dfdfafafaf00afafaf00fcaf0300afaf00fcaf0400afafaf00faaf0000 f8af0000fcaf0700afaf00afafaf00fcaf0200af00fcaf0000faaf0000fb af0700afafaf00afaf00fcaf0500af00afaf00fcaf0300afaf00fcaf0000 edaf00648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d56 56dfdffcaf016464ccaf1adfdfafafaf00afafaf0000afaf0000afaf0000 afaf0000afafaf00faaf0000f8af130000afaf0000afaf00afafaf0000af af0000af00fcaf0000faaf0000fcaf120000afafaf00afaf0000afaf0000 af00afaf00fcaf0800afaf0000afaf0000edaf00648faf0edfdf64dfaf64 6400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf05dfdf afafaf00fcaffd000daf0000afaf000000af00afafaf00faaf0000f7affd 0008af0000afaf0000afaffc0002afaf00fcaf0000faaffb00fbaf0300af afaffc0005afaf00afaf00fcaf0800afafaf000000af00edaf00648faf0e dfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf0164 64ccaf05dfdfafafaf00ecaf0000aeaf0000edaf00648faf0edfdf64dfaf 646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf05df dfafafaf00ecaf0000b3af050000afaf0000edaf00648faf0edfdf64dfaf 646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf07df dfafafaf000000f0affd00b2affc00ecaf00648faf0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af 00648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf016464cadf81af00648faf0edfdf64dfaf646400d6d69d9d9d5600 0900d69dd69d569d56dfdffcaf0064c9df81af00648faf0edfdf64dfaf64 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5af00648ddf0c64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af8cdf0c 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5af8b64 0bdfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af8adf 0aaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80648064cc640700d6 9dd69d569d000800d6d69d9d9d5656df80648064cb640700d6d69d9d9d56 000700d69dd69d569d5680008000c90006d69dd69d569d000600d6d69d9d 9d5680d680d6c6d6fd9d0156007f00d69dd69d569dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d6459dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69d569d000200d6d6e49d0156d6809d809dfc9d0156d6 e39d0156000300d69dd6e59d0256d6d6809d809dfd9d0256d6d6e59d0256 9d007f00d6d69d569d569d569d569d569d569d569d569d569d569d569d56 9d569d5656d6d6569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d7f569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d45569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d5656d6 d6569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 000100d6e25601d6d680568056fc5601d6d6e356ff0080008000ba00 grestore showpage %%Trailer geomview-1.9.4/doc/figs/command.eps0000644000175000001440000014543410616356701014130 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: blah-000.ps %%Creator: pnmtops %%CreationDate: Jun 26 2006 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 198 343 414 449 %%EndComments %%BeginProlog %%BeginPreview: 216 106 8 636 % 29292929292929292929292929296229292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % a9292929292929292929292929292962 % 29296262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % a9296262626262626262626262626262 % 2929a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262 % 6262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9 % a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262 % a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262 % 6262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9 % a9a9a9a9626262626262626262626262 % 2929a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffff626262 % 2929a9ff292929292929292962626229626262626262626229292929292929292929292962626262 % 62626262626262622929292929292929292929296262626262626262626262622929292929292929 % 29292929626262626262626262626262292929292929292929292929626262626262626262626262 % 29292929292929292929292962626262626262626262626229292929292929292929292962626262 % 62626262626262622929292929292929292929296262626262626262626262622929292929292929 % 622929296262626262626262ff626262 % 296262ff62626262626262626262a9296262626262626262ffff6262626262626262626262626262 % 6262626262626262626262626262ff62626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262a92962626262626262626262 % a96262ff6262626262ff62a9ff2962a9 % 296262ff62626262626262626262a92962626262626262ff6262ff62626262626262626262626262 % 6262626262626262626262626262ff62626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262a92962626262626262626262 % a96262ff6262626262ff62a9ff2962a9 % 296262ff62626262626262626262a92962626262626262ff62626262ff62ff62ff62ff6262ffffff % ffff62ff62ff62ff62ff62ff62ffff62ff62ff626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262a92962626262626262626262 % a96262ff6262626262ff62a9ff2962a9 % 296262ff62626262626262626262a929626262626262ff62626262ff6262ffff62ff62ff62ff62ff % 62ff62ffffff62ff62ff62ff62ff6262ffff62626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262a92962626262ff6262626262 % a96262ff6262626262ff62a9ff2962a9 % 296262ff6262ffffffffffffffffa929626262626262ff6262ff62ff62ff62ff62ff62ff62ff62ff % 62ffff6262ff62ff62ffff6262ff62ff62ff62626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262a929626262ffff6262626262 % a96262ff6262626262ff62a9ff2962a9 % 296262ff62626262626262626262a92962626262626262ffff6262ffff6262ff62ff62ffff62ff62 % ff6262ff62ffff62ff6262ff62ff62ffff6262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262a92962626262626262626262 % a96262ff6262626262ff62a9ff2962a9 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262a92962626262626262626262 % a96262ff6262626262ff62a9ff2962a9 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262a92962626262626262626262 % a96262ffffffffffffff62a9ff2962a9 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262a92962626262626262626262 % a962626262626262626262a9ff2962a9 % 626262ffa9a9a9a9a9a9a9a9a9a9a962a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9ff29a9a9 % 292962a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020ff292929 % 296262a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020209bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050509bff626262 % 2929a9a9205050202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020509bff626262 % 2929a9a9205050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b5020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 296262a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff2962a9 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205020509bff626262 % 2929a9a9205050209b20202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020205020509bff626262 % 2929a9a9205050205050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505020509bff626262 % 2929a9a9205050202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020509bff626262 % 2929a9a9205050202020202020202020202020502020202020202020202020209b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050509bff626262 % 2929a9a920505020505050505050505050509b5020205050505050505050509b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050502020202020202020202020202020 % 2020202020202020209b509bff626262 % 2929a9a920505020505050505050505050509b5020205050505050505050509b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050502020505050505050505050505050 % 50505050505050509b9b509bff626262 % 2929a9a920505020505050505050505050509b5020205050505050505050509b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050502020505050505050505050505050 % 50505050505050509b9b509bff626262 % 2929a9a920505020505050ff5050505050509b5020205050505050505050509b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505020205050505050505050ff505050 % 50505050505050509b9b509bff626262 % 296262a92050502050505050ffffff5050509b502020505050ffffff5050509b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505020205050505050505050ff5050ff % 50ff50ff505050509b9b509bff2962a9 % 296262a92050502050505050ffffff5050509b5020205050ffffffffffff509b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505020205050505050505050ff505050 % 50ffffff505050509b9b509bff2962a9 % 296262a92050502050505050ffffff5050509b5020205050ffffffffff50509b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505020205050505050505050ff5050ff % 50ff50ff505050509b9b509bff2962a9 % 296262a92050502050505050ffffff5050509b502020505050ffffff5050509b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050502020505050505050505050505050 % 50505050505050509b9b509bff2962a9 % 296262a92050502050505050ffffff5050509b50202050505050ff505050509b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050502020505050505050505050505050 % 50505050505050509b9b509bff2962a9 % 296262a920505020505050505050505050509b5020205050505050505050509b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050502020505050505050505050505050 % 50505050505050509b9b509bff2962a9 % 296262a9205050209b9b9b9b9b9b9b9b9b9b9b50209b9b9b9b9b9b9b9b9b9b9b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050509bff2962a9 % 296262a92050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b50509bff2962a9 % 296262a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050502050509bff2962a9 % 296262a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050502050509bff2962a9 % 2929a9a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050502050509bff626262 % a9a9a9a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050502050509bff62a9a9 % 2929a9a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050502050509bff622929 % 2929a9a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050502050509bff626262 % 2929a9a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050502050509bff626262 % 2929a9a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050502050509bff626262 % 2929a9a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050502050509bff626262 % 2929a9a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050502050509bff626262 % 2929a9a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050502050509bff626262 % 2929a9a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050502050509bff626262 % 2929a9a92050509b2020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050509bff626262 % 296262a9209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9bff2962a9 % 296262a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffff2962a9 % 29626262626262626262626229292929292929292929292962626262626262626262626229292929 % 29292929292929296262626262626262626262622929292929292929292929296262626262626262 % 62626262292929292929292929292929626262626262626262626262292929292929292929292929 % 62626262626262626262626229292929292929292929292962626262626262626262626229292929 % 29292929292929296262626262626262626262622929292929292929292929296262626262626262 % 626262622929292929292929292962a9 % 2962626262626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % a92962626262626262626262626262a9 % 29a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9 %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def %%EndProlog %%Page 1 1 /picstr 1350 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def gsave 198 342.72 translate 216 106.56 scale 450 222 8 [ 450 0 0 -222 0 222 ] { inputf picstr readstring pop } false 3 colorimage 78DAEDDDDB91DB3A1A85D18E5211302DC5D0D9F46BA762955546C1BC09247FF0 86B51E50B6A70F2D6BCAFB7C9238D35F5F006CF253C7F3F97C3C1E3F0007A9BD 42AFEBE72BFAFA69ECF9F82BFFED9C4EA773CFB3F60ABD2E9E5634FD62ACF4F8 9F0047A8B742AF2B0F5BB4D2E3F7DF2370EC8AD6BBF8B045DFEBEA743A9DCEA9 335FCBD116F514399D4EE7FC847E6C51F72D008CDED154D8A2F56E7F02B8A8A9 B59C5AD7A81B03DCE6E4743A0F3CD3106DBFDA8A16F5193D70F5DB93A256287F 91BEB445CF79A71670E3090D0CB0E10A95BF0B3ABAA27BB6E8C6A762EACF727E 577CCC70CB161D5DA1C2BF9EF997BDAF73A116ED8DE7E546C98AC2C95B74C55F E40BB5E87082AE354A26146ED3A2E92B2FD4A2251334FA4A3FFDB4F783A55F53 78FDA97F64F847B8EEFB12A045AFD8A21FD766EA95FE70C7869B56FE35F3D7DF FE65406B2DBAF4F6FE754FC5A2095DB47EE53F2E59ECD1AC2DF9A78090005BF4 12EF242DBA680A7AEB1DF872BE64CA364EE8E8BF0E0AD77B66546D2904B66879 A89CAA45D7BD2A0F6CD11D4274D1D23E977C10664821B645CBFF669DA74557BC A80F69D1F94F6D027FBC22386756F463A3025B5AB4F045FDD93EA35FF1D6E896 CFE8177DA0B37F883E7DAE0407B5E873C95BA3CDDE2F3AD3A595A2F439F1C1FD 7C55BAC709F66FD18D2B74EFFB4501DC2F5AE9A900B4A81605D0A25A14B87A8B AEF8A05C8B025A74C5966A51408B465D67458BA62FDB72BEAEE35BAF3A9DCE45 679ABE90AB45ADD04C8BA69FE6EB9AFE2C1B455D07684AE074445D2A6FD17C5A 5F86BFA3EF3A0D30F5FDE87BD3DAFBD6F3E90B7E01C8F4D6327D93FAFCD7F34C F58C01245DD7E5EF8B8EAE68EFD3284F1A409AD0B4A2859FD1E72BFA0DD0B0EE 9F45F78B5A5180D115D5A20047B56807D08CB47E812DFABE2C400B1F274DADE8 C616F5021F68E4557CBD16F5D21EB8B7F9150D69514F3270EFB743F76951CD0F DC4C1ABD7D5AD4130E34B8A25A14408B026851002D0AA045B528801605D0A200 5A14408B6A51C08A6A51002D0AA04501B4A81505ACA81605D0A2005A14408B5A 51408B6A51002D0AA04501B4288016D5A28015D5A2005A14408B0268512B0A58 512D0AA04501B4288016B5A28016D5A2005A14408B026851002DAA4501B42880 1605D0A2005AD48A0256548B026851002D0AA045AD286045B528801605D0A200 5A14408B6A51002D0AA04501B4288016D5A28015D5A2005A14408B0268512B0A 58512D0AA04501B4288016B5A28016D5A2005A14408B026851002DAA45012BAA 4501B428801605D0A25614B0A25A14408B026851002D6A45012DAA4501B42880 1605D0A2005A548B026851002D0AA04501B4A81505ACA81605D0A2005A14408B 5A51C08A6A51002D0AA04501B4288016D5A2005A14408B026851002DAA45012B AA4501B428801605D0A25614B0A25A14E0542DFA0B7047FBB4A8E71968734543 5A14E0DEEAB52840236AB4A8CE075A7B691FDBA2351E5E8D6B02C4BEBA3F618B A61BA56A5C13A0DE8A9EA145F3DB4D6B5C13B8A2ABBCA20F69D19055AF774DC0 8A06BEBCADD1A25614B8F78AE693B27F8BBE2E18B5A2EF4B0D4F2B0A375ED1C3 1F496F52766ED199AD5BD7A2BD09B5A260458F5DD1AA2DFA311AB528A0456317 4F8B025A74664287A3A74581D52B3A5C80F42BA3E330FF31CD795A747E427B7F 0A2D0AD458D1C2AF3F618B7EFD33BA78F97FAA45817D5AB4374AC3B13A5B8B6E 593C2D0AC4AE68FE83A98D3D558B6E5C3C2D0A2C5AD1A1F9280D5FD14BB468C9 1BAD33EF12005A74B44B0B5FD4DFA3453F4EA815052BBA6845CB1FC96DDE172D 9C502B0A56F4DBFBA24B96F9E33DA840CB2BFAED33FACDCB0CDC7545F771A716 ED5DB6F07F9B0F58D17A2B5AB545A7EE40D8B8A2F3136A45C18ADEA645573C3C FF2FCD8016B5A280165DD4A25D847AD7042EBDA2DD69546AD1D88757E39AC075 57B43B931A2D1AFEF06A5C13B8E88A762713DEA2000D0A6C51002BAA45018E6A D10EA019355AD4B30A346274FAA25A54DE03F7361590512DEA19065A5E512D0A A04501B428801605D0A25A1460638BA69F6A518092164DC1F95ED1C7FFB42860 45675A341FCCFC7DD17C63AD286045A75A34D75B51EF8B0294BC2F3ABAA2DE17 05F8F6193D40FD1675BF28801605D0A2005A14408B6A51002D0AA04501B42880 16B5A28015D5A2005A14408B0268512B0A58D1ED2DFA0BD0804A2DEA89051A5F D12D2D0AD0A0C01605B0A22B5AB403606D8B7ADE0056B7A8270D60758B7E01F0 BFF216FD01604C498BE65FE6743A9DCEE139D3A2B15EBF458DCB021CBE42332D 1AF85BBC1FBF21058E9AD0AA2BD46BD1F4E97CEC991E7FA5EB3B9D4EE7812B94 56F451CDFBF13F000E527585DCB700B0D11F63DEB779 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/command.pdf0000644000175000001440000001141610616356701014102 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`dh–R0403Õ32tôÌ-Í,!ª,\ò¹ôú2endstream endobj 6 0 obj 60 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 2179>>stream xœíÝ1rÓL€aqZW´œ€‚Š&ànÒ¸àä4T9AZ*ÎóëGd#˲$ûÛ•%ùyfØIŒYK™ÉÇkÙwïê_þü)±õËËËóóóããc‰ÍF•žBõþ_¿~}£õç?~̸ÖG_o›N ûþV«Õ:¼–žBõþ?~üø7FÓ­yGuú{ ûÎS”›BõΟ>}êÖhÞǨ^OÀ n¥èê¯Ñf¾Z­V«õÜÚž–ý5º„£´Z­Öe®íëŸÏ5ZÏ× °j½Ó²¿FëùZè]P+µÛíz§åÙÍõ.¨æÁnþ¾«ÕzŸk=>þDñÝš1šn™T£/á×¶ž½R\î9ß»”rM¡öÓô—Kk4~ñ}€ûñüúžù,sãt Míçé驽OêËùj4øµhŸjûd–¯9òu3,J®ëBõwè”oÏöÝš}ÖT£i€6ç°º©´º†E™¡F'ŽÑªõ¼¦=AëšJë:ZX¦…Ôhõú½¼¦2ƒzŸì§?ØùàÒûLÜÿÜio>°0@}uá×btŒ¶ïpúqu2é®»Ïðþñ»Ã6X£—þPS{~OÿZ\4C«±YvÝÇçîÜC_‚0:á £vÑ“¼¥ÔèÄGíÜùÒ½zŒfœ¡¿0†gèðou64LaºáKCfth,«F/£íÇÎU£3¤èE£v4E§ŸÐ6¥F§?á[PŽ>dGýØYjôÜÌÊ>"¯HÎ1:Z©À€ÑmºŽí=ôaWÔhÕ7¼ª¬³2øñèÝ¦ì ›R`Ó/.¥F¯yßh£·L;¿UâÂèÓÉ›¢Îueï=`Ø_©œƒŸ©.â}£GG_åûZ÷Cƒ.¢F޾R£ÀåJ×èôÔ(°>¥k´1q˜ªQ`•ŠÖèÕû\S£Í]§ü£ëã_7ÿ?Q­VëŠÖ4û²ì–k ÕhóGõçíùš~ )(}Q¦Ë8:rmÕ®ÑölýŒ><5 4Ö2F Öèu#OµŒÑªPž›¡§“T½¦_6ì½¥w8 ¿TsÎ jtx†vNC½‚ctâý§˜»F›ÑVýn§#/Ig¢F^k4%×éU_Šu¸6 ¬R®1Úþ zy:>stream GPL Ghostscript 8.54 PDF Writer blah-000.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000377 00000 n 0000004317 00000 n 0000000318 00000 n 0000000163 00000 n 0000000015 00000 n 0000000145 00000 n 0000000442 00000 n 0000000542 00000 n 0000000483 00000 n 0000000512 00000 n 0000002922 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 4485 %%EOF geomview-1.9.4/doc/figs/command.png0000644000175000001440000000227310616356716014124 00000000000000‰PNG  IHDRÂÞ\U"PLTE¯¯¯ÖÖÖdddVVVßßßN"aIDATxœí]Šò0†cËÜWp¥’û¡á[À€x-J0 î _Òô'‰m¥5}ç)8M;HÞyNNýTò¤ÊC*p¹HKJ•Ø„N"Ý.Rؤqèñ‡x„ŒCI˜½ux¦Kiæ±ûùb¤ÃS”¶þÒÖ¡Ú÷¸ûˆn€Îa9ÞŠ ¸Œ½Cç àõP^Ü*r»pÀaÕíçúW&È'Ͼ—‹ ·{IQM:ÌE!¦îuE ïÚ=ñÀ¡(¦Nž|3ÃÅ´C«ÈTªÈ“îÖŽMøD<*ã÷ñšC›ÐTª“t·õ87›¬ƒ¿8ltëÉë˜ÂÛlf­³XQ¾Æ¡°ós˜Øƒyç°K˜'ý¦ï%iRç¦dßdœÚabËnÌabæ‰çйßL꺊×ÒN­Ã&á˜Ã¶JÇ¡)F?›7 ÅjZ‡Â6¾Ñ^Ú&ì{i.ŠámuÆ:lZû×CÑ\,Ül¢Q·ª‹Å‹×C$^|Lƒ;¤ç°}øBÖa‘®Ã~¿sX:¯0þ‹öÚæë\Ü v˜œ‹“¬zÜ}ÎîÀ –ç“øªªveÒ#••®RUV7ª¤J}ë„RÆžÈR\Ó½IXdÚ^*o¿[Šìíõ°¢›ð£èñë;<Æî ³sýõc—ÔììB‡»ØE57»Ð!µ„Ç{‡?±Ëj^n÷I&d‡È°C|Ø!>ìvˆ;ćâÃña‡ø°C|Ø!>ìvˆ;ćâÃña‡ø°C|Ø!>ìvˆ;ćâÃña‡ø°C|Ø!>ìvˆ;ćâÃña‡ø°C|Ø!>ìvˆ;ćâÃña‡ø°C|Ø!>ìvˆ;ćâÃña‡ø°C|cˆúÌÜ;Œ=£¹¹s»ªf'tû#Ô p»¦ pè F¨Œ;¼#TÆ‚ÑÊ™ªR×aÿU3»C0Z9c ‡ä^†fæ¦M¸Ñ@$þ¦£Ã C©K˜e|ÂСδ¥í°ËDÕa–Õ1ê©n2ûÓ2äpSêpÓ„óú3¡3 í0ÓS6$¹uhn2³><ÖK7¨ëPaný„S3 LÂÆ¡¾Ñ ÍðØaÝv`ÂæðãuX+Ü %|v œuH¿—Þñ‡[£ìvˆ;ćâÃñù@‡cÿñŽKàð{>óÃïÀuxýVØBôcÏd):‡×Ø3YŠÎ¡ Jëp¯ÈÒ8, S;,\dY`°]*õÎé,@@;”>J‚Ð+U8ÅîçËómn¾–äúIEND®B`‚geomview-1.9.4/doc/figs/save.eps0000644000175000001440000053777110616356710013461 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: Sep 12 2003 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 217 250 395 512 %%EndComments %%BeginProlog %%BeginPreview: 178 262 8 1310 % 29292929292929292929292929296229292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929a9292929292929292929292929292962 % 29296262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262a92962626262626262626262626262a9 % 2929a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262 % 62626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9 % a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9 % a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262 % 62626262626262a9a9a9a9a9a9a9a96262a9 % 2929a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff2962a9 % 2929a9ff292929292929296262626229626262626262622929292929292929292929296262626262 % 62626262626262292929292929292929292929626262626262626262626262292929292929292929 % 29292962626262626262626262626229292929292929292929292962626262626262626262626229 % 29292929292929292929296262626262626262626262622929292929292962292929296262626262 % 6262626262626229292929292929ff2962a9 % 296262ff62626262626262626262a92962626262626262ffffff6262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff62626262626262626262a929626262626262626262ff6262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff62626262626262626262a92962626262626262ffff6262ff62ff62ff6262ffff62ff6262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff62626262626262626262a9296262626262626262ffff62ffffff62ff62ff62ffff626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a96262626262ff626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff6262ffffffffffffffffa929626262626262ff6262ffff6262ff62ffff62ff6262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a962626262ffff626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff62626262626262626262a929626262626262ffffff6262ff62ff62ff626262ff62626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962ff6262626262ff6262ff626262 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962ffffffffffffff6262ff626262 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262a9626262626262626262 % 6262a92962626262626262626262ff626262 % 626262ffa9a9a9a9a9a9a9a9a9a9a962a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9ff626262 % 292962a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff622929 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050ff50505050ff505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050ff50505050ffffff50ffff5050ff50505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050ffffff5050ff5050505050ff505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050ff50505050ff505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050ff50505050ff505050ff50ff505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a95050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b505050505050ff626262 % 296262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b505050ff5050505050505050505050505050ff50505050505050505050 % 505050505050505050505050ff5050505050505050505050ff505050505050505050505050505050 % 505050505050505050505050505050ffffffff505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b50505050ff505050ffff50ffff50ff50505050ffffff5050ffff5050ff % 50ffff50ffffff50ff50ffffff50ffff50ffff50ffff50505050ff505050ff5050ffff505050ff50 % ff50ffff5050ffff50ff50ff50ff5050ffffff505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b5050ff50ff505050ff5050ff50ff505050ff50ff505050ff50ff505050 % 50505050ff50505050505050ff505050ff505050505050ff50ff505050ff50ff505050ff50505050 % 5050ff50ff505050ffff50ff50ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b5050ff50ff50505050ff50ff50ff505050ff50ff505050ff50ff505050 % ff505050ff50505050505050ff50ff50ff5050ff505050ff50ff505050ff5050505050ff50505050 % 5050ff50ff505050505050ff50505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b50505050ff50ff50505050ff50ff50ff505050ff505050ff50ff505050 % ff50ff50ff50ffff5050ff50ff50ff50ff5050ff50ff505050ff50ff50ff50ff50ff50ff50505050 % 5050ff50ff50ff50ff50ff50ff50ff50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 296262a95050505050509b50505050505050505050505050505050505050505050505050ff505050 % 50505050ff5050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a9505050505050202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 296262a9505050505050ff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ff5050ff5050ff5050ff50ff5050ff505050ff50ff50ff50ffff50ff50ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050ff5050ff50ff50ff50505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ff5050ff5050ff5050ffffff5050505050505050ff505050ffffffff5050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050ff50ffff5050ff5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ff5050505050ff50505050505050505050505050ff505050ffff50505050 % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050ff505050505050ff50505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ffff50505050ff5050ffff5050ffff50ff50ffff50505050ff50ffff5050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050ff50ffff5050ff5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a950505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50509b9b9b9b9b9b % 9b9b505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 50509b9b9b9b9b9b9b5050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a206a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a209b6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a206a6a205050505050ff626262 % 296262a950505050509b50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b6a6a209b6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a20509b6a205050505050ff626262 % 296262a950505050509b50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b6a2050509b % 6a20505050509b5050ff505050ff505050505050505050505050505050505050ff50ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a20509b6a205050505050ff626262 % 2929a9a950505050509b50ff50ff50ff50ffff50ff50ff50ff5050ff50ff50ff50ffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b209b9b9b9b % 9b20505050509b5050ffffff50ff50ff50ff505050ff50ff50ff5050ff50ff50ff50ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b209b9b9b9b205050505050ff2962a9 % 2929a9a950505050509b50ff50ffffffffffff50ffffff505050ffff50ffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b6a6a6a6a6a % 6a20505050509b505050505050ff50ffffff505050505050ffff5050ff505050ff50ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b50ff50ffffffffffff50ffffffffffffffffffffff50ffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b2020202020 % 9b20505050509b5050ff505050ff505050505050505050ff50505050ff505050ff50ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b202020209b205050505050ff2962a9 % 2929a9a950505050509b5050ffffffffffffff50ffffff5050ffff50ff50ff50ffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b2050505050 % 9b20505050509b505050ffff5050ffffff5050ff50505050ff50ff5050ffff50ff50ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b50505050ff5050505050505050505050505050ff505050505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b50ff505050ff50ff50ffffff50ffff50ff50ff50ff50ff50505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b50505050ff50ffff5050ffff5050ff505050ff50505050ffff50ff5050ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff5050505050ffff50ff50ff505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b50505050ff50505050ff505050ff505050ff50505050ff505050ff505050ff50ff % ff505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff5050505050505050ff5050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b50505050ff50505050ff5050505050ff505050505050ff505050ff505050ff5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff2962a9 % 296262a950505050509b50ff50505050505050ff505050ffff5050ff50ff50ff5050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ffff5050ffff5050ffff5050ff5050505050505050ffff50ff505050ff50ff % ff505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b205050509b205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b9b9b9b9b9b205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b50505050505050505050505050505050505050505050505050ff50505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ff5050ff50ff50505050ffff50505050ff50ff505050ff50ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b50ff505050ff50ff50ffffff50ffff50ff50ff50ff50ff5050505050ff50 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff50505050ffff5050505050ff505050505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff5050505050ffff50ff50ff505050505050ff5050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ffffff5050ffffff505050505050505050ff50ff50ff5050ffffff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff5050505050505050ff5050505050ffffffff5050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff505050ffffffff50505050ff505050505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff505050ff50ff50ff50ff50ff5050505050ff50ff % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff50505050505050505050ff505050ff505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050ff50505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b5050ff5050ff50ff50505050ffff50505050ff50ff505050ff50ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b50ff505050ff50ff50ffffff50ffff50ff50ff50ff50ff50ffff50505050 % 50ffff505050ffffff50ff50ffff505050ff505050505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff50505050ffff5050505050ff505050505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff5050505050ffff50ff50ff505050505050ff50ff % 505050ff505050ff5050ff505050ff505050ff5050505050505050505050502050509b2050505050 % 9b20505050509b5050ffffff5050ffffff505050505050505050ff50ff50ff5050ffffff5050ff50 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff5050505050505050ff5050505050505050ff50ff % 5050505050505050ff50ff505050ff505050ff5050505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff505050ffffffff50505050ff505050505050ff5050505050ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff505050ff50ff50ff50ff50ff5050ffff50505050 % 50ff50ff505050505050ff50ff50ff505050ff5050505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff50505050505050505050ff505050ff505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050ffff50505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050505050505050505050ff5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 296262a950505050509b50ff505050ff50ff50ffffff50ffff50ff50ff50ff50ff5050ff50505050 % 5050ff5050ffff50ffff5050ff5050ffff50ffff50ffff50505050505050502050509b2050505050 % 9b20505050509b505050ffff50ff50ff50ffff5050ff505050ff5050ffff50ff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff5050505050ffff50ff50ff505050505050ff50ff % 505050ff50505050ff50505050ffff505050ffff50505050505050505050502050509b2050505050 % 9b20505050509b505050505050505050ff505050ff50505050ff5050ff5050ff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff5050505050505050ff50505050505050505050ff % 505050ff50505050ff50505050ffff505050ffff50505050505050505050502050509b2050505050 % 9b20505050509b5050ff50505050ff50ff5050505050ff5050ff505050ff50ff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff505050ff50ff50ff50ff50ff505050505050ff50 % 50ff50ff50ff5050ff5050ff50ffff50ff50ffff50ff50ff505050505050502050509b2050505050 % 9b20505050509b5050ff50ff50ff5050ff50ff50ff50ff5050ff5050505050ff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b50505050505050505050505050505050505050505050505050505050ff50 % 505050505050505050505050505050505050505050505050505050505050502050509b209b9b9b9b % 9b20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050ff5050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff5050505050ffff50505050505050ff505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b50505050505050505050505050505050505050505050ff50505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff50505050505050ff505050505050ff505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff50ff50ff5050ff50ff50ff50ffff50ff50ff50ff5050ff50ffff50 % ff5050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff50ff50ff505050505050ff50ff50ff505050ff50ff50ff50ffff50ff5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff505050ffffff5050ff505050505050505050ff50 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff5050505050505050505050ffff50ff505050ff5050505050ffff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 2929a9a950505050509b5050ff505050505050ff505050ff50ff50ff50ff50ff505050ff50ffff50 % ff5050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff50ff5050505050505050ff50ff50ff505050ff50ff50ff50ffff50ff5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b50505050505050505050505050505050505050505050505050505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b50505050505050505050505050505050505050505050505050505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b50505050505050505050505050505050505050505050505050ff50505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050ff50505050505050505050505050ff50505050505050ff50 % 505050505050505050505050ff50ff50505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b50505050505050505050505050505050505050505050ff50505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050ff50505050505050505050505050ff50505050505050ff50 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b5050ff50ff50ff5050ff50ff50ff50ffff50ff50ff50ff50505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff50ff50ff5050ff50ff50ff50ff5050505050ff50ff50ff50ff50ff50ffff % 50ff50ff50ff5050ff50ff5050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff505050ffffff5050ff5050505050505050ffff50 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff505050505050ff505050ff505050505050505050ff505050ff505050ffff % ffff50ff50505050ff50505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b5050ff505050505050ff5050505050505050505050ff5050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff505050505050ff505050ff505050505050505050ff505050ff505050ffff % 505050ff50505050ff50505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b50ff50505050505050ff505050ffff5050ff50ff50ff5050505050ffff50 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050ffff50ffff50ff50ffff5050505050505050ffffff50ffff5050ffffff50 % ffff5050ffff505050ffff5050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 2929a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff2962a9 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050ff50ff5050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050ff5050505050505050505050ff5050505050505050505050 % 5050505050505050505050ff505050505050505050505050ff50ff50505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b50505050505050505050505050505050505050505050ff50505050505050 % 50505050505050505050505050ff505050505050ff505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050ff5050505050505050505050505050505050505050505050 % 5050505050505050505050ff50505050505050505050505050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff50ff50ff5050ff50ff50ff50ffff50ff50ff50ff50ffff50ff50ff % 50505050505050505050505050ff50ff50505050ff505050505050505050502050509b6a6a6a6a6a % 6a20505050509b5050ff50ff50ff5050ff50ff50ff50ff50505050505050ff50ff50ff50ffff50ff % 5050505050ff50ffff5050ff50ff50ff50ff5050ff50ff5050505050505050505050505050505020 % 50509b6a6a6a6a6a205050505050ff626262 % 296262a950505050509b5050ff505050505050ff505050ffffff5050ff5050505050505050ffffff % 50ff5050ff5050505050ffff50ff50ff50505050ff505050505050505050502050509b2020202020 % 2020505050509b5050ff505050505050ff505050ff505050505050505050ffffff50505050ffffff % 5050505050505050ff5050ff505050ffffff5050ff50505050505050505050505050505050505020 % 50509b2020202020205050505050ff626262 % 296262a950505050509b5050ff505050505050ff5050505050505050505050ff5050505050ff5050 % 50ffffffff5050505050505050ff50ff50505050ff505050505050505050502050509b6a2050509b % 6a20505050509b5050ff505050505050ff505050ff5050505050505050505050ff505050ffff5050 % 50505050505050ffff5050ff5050505050505050ff50505050505050505050505050505050505020 % 50509b205050506a205050505050ff626262 % 296262a950505050509b50ff50505050505050ff505050ffff5050ff50ff50ff505050505050ffff % 50505050505050505050ffff5050ff50ff505050ff505050505050505050502050509b6a2050509b % 6a20505050509b505050ffff50ffff50ff50ffff50505050505050505050ffffff50ffff5050ff50 % 5050505050ffff5050ff50ffffff50ffff50505050ffff5050505050505050505050505050505020 % 50509b6a20509b6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a209b6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a20509b6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a209b6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a9b6a6a205050505050ff626262 % 296262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050502050509b6a6a6a6a6a % 6a20505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 50509b6a6a9b6a6a205050505050ff626262 % 296262a9505050505020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020202050509b2020202020 % 2020505050509b202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 5050202020202020205050505050ff626262 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050 % 5050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b6a6a6a6a206a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 2020202020202020202020202020202020202020202020202020206a6a6a6a205050505050505050 % 5050505050509b6a6a6a6a6a206a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a202020202020202020202020202020202020202020202020202020206a206a6a6a6a20 % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b6a6a20209b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 205050505050505050505050505050505050505050505050509b2020206a6a205050505050505050 % 5050505050509b6a6a6a20209b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a2050505050505050505050505050505050505050505050505050509b6a20206a6a6a20 % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b202050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 205050505050505050505050505050505050505050505050509b2050502020205050505050505050 % 5050505050509b6a202050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a2050505050505050505050505050505050505050505050505050509b6a205020206a20 % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b9b9b50509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 205050505050505050505050505050505050505050505050509b2050509b9b205050505050505050 % 5050505050509b6a9b9b50509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a2050505050505050505050505050505050505050505050505050509b6a20509b9b6a20 % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b6a6a9b9b9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 205050505050505050505050505050505050505050505050509b209b9b6a6a205050505050505050 % 5050505050509b6a6a6a9b9b9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a2050505050505050505050505050505050505050505050505050509b6a209b6a6a6a20 % 5050505050505050505050505050ff2962a9 % 2929a9a950505050509b6a6a6a6a9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b206a6a6a6a205050505050505050 % 5050505050509b6a6a6a6a6a9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b6a9b6a6a6a6a20 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020205050505050505050 % 5050505050509b202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020205050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050502020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020205050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050502050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050505050505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050502050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050505050505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050502050505050505050505050 % 5050505050505050505050ff5050ff50505050505050505050505050505050505050505050505050 % ff5050505050505050505050505050505050505050505050505050505050505050505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050502050505050505050505050 % 50505050505050505050505050505050ffff50ffff50ff505050ff50ff5050ff505050ff5050ffff % ff50ff505050505050505050505050505050505050505050505050202020202020505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 2929a9a9505050505020505050505050505050505050505050505050502050505050505050505050 % 505050505050505050505050505050505050ffff50ff50ff50505050505050ffff505050ff505050 % ff50ff50505050505050505050505050505050505050505050505050505050509b505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050502050505050505050505050 % 5050505050505050505050ff5050ff505050ffff50ff50ff505050505050ff50ff505050ff505050 % ff5050ff50505050505050505050505050505050505050505050509b9b9b9b9b9b505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050502050505050505050505050 % 505050505050505050505050ffff5050ffff50ff50ff50ff50505050505050ffff505050ff50ffff % ff50ff505050505050505050505050505050505050505050505050505050505050505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050502050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050505050505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050502050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050505050505050509b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a950505050502050505050505050505050505050505050505050209b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a950505050502050505050505050505050505050505050505050ffffffff50505050505050 % 5050505050505050505050509b5050ff5050ff505050505050505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a950505050502050505050505050505050505050505050505050ff50505050505050505050 % 5050505050505050505050509b5050ff505050505050505050505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a950505050502050505050505050505050505050505050505050ff505050ff50ff50ff50ff % 5050505050505050505050509b50505050505050ff50ff50ff50ff50ff50ffff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a950505050502050505050505050505050505050505050505050ff505050ff50ff50505050 % 5050505050505050505050509b505050ffff505050505050ff505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a950505050502050505050505050505050505050505050505050ff505050ff50ff50505050 % 5050505050505050505050509b505050ffff505050505050ff505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a950505050502050505050505050505050505050505050505050ff50505050ff50505050ff % 5050505050505050505050509b505050505050ff5050ffff50505050ff50ff505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 296262a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff626262 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020205050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a9505050505020505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b5050505050ff2962a9 % 2929a9a95050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b5050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ff50ff5050505050ff505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ff50505050ffff50ff50ffff5050ffffffff505050ffff50ffff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a950505050505050ff5050ff505050ff505050ffff505050505050ff505050ff50ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a950505050505050505050ff505050ff50505050ff505050505050ff505050ff50ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050ff50ff50ff50ff50ff50ff50ffff50ff50505050ff50ff50ff50ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a95050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b505050505050ff626262 % 296262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff626262 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b505050ff5050505050505050505050505050ff50505050505050505050 % 505050505050505050505050ff5050505050505050505050ff505050505050505050505050505050 % 505050505050505050505050505050ff505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b50505050ff505050ffff50ffff50ff50505050ffffff5050ffff5050ff % 50ffff50ffffff50ff50ffffff50ffff50ffff50ffff50505050ff505050ff5050ffff505050ff50 % ff50ffff5050ffff50ff50ff50ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050ff50ff505050ff5050ff50ff505050ff50ff505050ff50ff505050 % 50505050ff50505050505050ff505050ff505050505050ff50ff505050ff50ff505050ff50505050 % 5050ff50ff505050ffff50ff50ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050ff50ff50505050ff50ff50ff505050ff50ff505050ff50ff505050 % ff505050ff50505050505050ff50ff50ff5050ff505050ff50ff505050ff5050505050ff50505050 % 5050ff50ff505050505050ff50505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b50505050ff50ff50505050ff50ff50ff505050ff505050ff50ff505050 % ff50ff50ff50ffff5050ff50ff50ff50ff5050ff50ff505050ff50ff50ff50ff50ff50ff50505050 % 5050ff50ff50ff50ff50ff50ff50ff50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b50505050505050505050505050505050505050505050505050ff505050 % 50505050ff5050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050ff5050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b505050505050505050505050505050505050505050505050ff50505050 % 50505050ff505050505050505050505050505050505050505050ffff505050505050505050505050 % 505050505050505050505050505050ff50ff50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050ff505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020505050505050ff2962a9 % 2929a9a95050505050509b2020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020505050505050ff2962a9 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020202020202020ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9505050505050505020202020202020202020202020202020202020202050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 20202020202020202020202020202020202020505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050202020202020202020202020202020 % 2020202020205050505050505050ff2962a9 % 2929a9a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff2962a9 % 2929a9a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff2962a9 % 2929a9a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff2962a9 % 2929a9a950505050505050502050505050505050ff5050ff5050ff50505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050ffffff5050ff505050505050505050509b505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505020505050505050ff50505050ff5050 % 50505050509b5050505050505050ff2962a9 % 2929a9a950505050505050502050505050505050505050ff50ff5050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050ff50505050ff505050505050505050509b505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505020505050505050ff50505050ff5050 % 50505050509b5050505050505050ff2962a9 % 2929a9a95050505050505050205050505050ff505050ffffff505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050ff50505050ff505050ff50ff505050509b505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505020505050505050ff5050ff50ff50ff % 50ff5050509b5050505050505050ff2962a9 % 2929a9a95050505050505050205050505050ff505050ffff50505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050ff50505050ff505050ffffff505050509b505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505020505050505050ff50505050ff50ff % ffff5050509b5050505050505050ff2962a9 % 2929a9a950505050505050502050505050505050505050ff50505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050ff50505050ff505050505050505050509b505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505020505050505050ff50505050ff5050 % 50505050509b5050505050505050ff2962a9 % 296262a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff626262 % a9a962a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff62a9a9 % 292962a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff622929 % 296262a9505050505050505020505050505050505050505050505050505050509b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505020 % 5050505050505050505050505050505050509b505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050205050505050505050505050505050 % 50505050509b5050505050505050ff626262 % 296262a95050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050 % 5050505050505050505050505050505050505050505050505050505050505050505050505050509b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b5050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff626262 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050ff2962a9 % 2929a9a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff2962a9 % 2929a929292929292929296262626262626262626262622929292929292929292929296262626262 % 62626262626262292929292929292929292929626262626262626262626262292929292929292929 % 29292962626262626262626262626229292929292929292929292962626262626262626262626229 % 29292929292929292929296262626262626262626262622929292929292929292929296262626262 % 6262626262626229292929292929292962a9 % 29296262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262a92962626262626262626262626262a9 % 29a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9 %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 371 string def gsave 216.96 249.72 translate 178.08 262.56 scale 371 547 8 [ 371 0 0 -547 0 547 ] { picstr readstring } image 800080008d000000e3d6019d5680d680d6cfd6015656e2d6019d007f00d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656 d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d72d69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69d56d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69d9d9d000300d69dd6e59d0256d6d6809d809dd19d0356 56d6d6e49d0156000200d6d6e49d0156d6809d809dcf9d0156d6e49d0256 9d007f00d69dd69d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d567f9d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d566b9d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d56fb9d0156007f00d6d69d9d9d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d7f569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d72569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d9d9dd69d569d000600 d69dd69d569d800080009b0006d6d69d9d9d56000700d6d69d9d9d560080 d680d69dd60700d69dd69d569d007f00d69dd69d569d00d6d69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd6729dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d 9dd6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69d00d6d69d9d9d56000800 d6d69d9d9d5600d6ea9d0156d6809d809de89d0156d6e99d0256d6d6eb9d 085600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d80 9de99d0256d6d6eb9d025656d6fc9df200fd9d09565600d6d69d9d9d5600 0800d6d69d9d9d5600d6eb9d025656d6f09dfb00809d809d049d9d5656d6 e99d0656d6d69d9d9d00f49d0000fc9d085600d69dd69d569d000900d69d d69d569d00d6d6eb9d0256d6d6f29d0600009d9d9d0000809d809d049d9d 56d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d5600 0800d6d69d9d9d5600d6eb9d025656d6f29d010000fc9d010000809d809d 039d5656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d56 9d000900d69dd69d569d00d6d6eb9d0256d6d6f39dfd00f89dfc00039d9d 0000fc9d0300009d9dfc00809d959d0256d6d6eb9d025656d6fc9d0000f4 9d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d0256 56d6f19dfc00fb9d0800009d9d00009d0000fc9d0800009d00009d9d0000 809d979d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69d d69d569d000b00d69dd69d569d00d6d69d9df000fd9d0256d6d6f09dfd00 f89d1100009d00009d9d9d00009d00009d9d9d0000809d969d0256d6d6f9 9dfc00f69d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d5600 0c00d6d69d9d9d5600d69d9d9d00f29d05009d9d5656d6ee9dfd00fd9dfb 00099d9d00009d9d00009d9dfa00809d969d025656d6f89d04009d9d0000 f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00d6 9dd69d569d00d6d69d9d00f29d0600009d9d56d6d6ee9d1400009d9d0000 9d9d00009d9d00009d9d00009d0000809d909d0256d6d6f99d04009d9d00 00f79d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00 d6d69d9d9d5600d69d9d9def00039d5656d6f49d010000fb9d1400009d00 009d9d9d00009d9d9d009d00009d9d0000809d919d025656d6f89dfb00f6 9d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69d d69d569d00d6d6fc9df100049d9d56d6d6f59d010000fc9d0900009d9d00 009d9d0000fc9dfd00fd9d0500009d9d0000809d949d0256d6d6f89dfc00 f79d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6 d69d9d9d5600d6eb9d025656d6f39dfa00fc9dfd00079d00009d9d9d0000 fb9dfc00809d949d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d 5600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d809d e99d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d 9d56000800d6d69d9d9d5600d6eb9d025656d6809d809de99d025656d6e9 9d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69d d69d569d00d6d6eb9d0256d6d6809d809de99d0256d6d6eb9d025656d6fc 9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6 eb9d025656d6809d809de99d025656d6e99d0556d6d69d9d9df100fd9d08 5600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d809d e99d0256d6d6eb9d025656d6fa9df3000b9d9d565600d6d69d9d9d560008 00d6d69d9d9d5600d6eb9d025656d6809d809de99d025656d6e99d0256d6 d6eb9d085600d69dd69d569d007f00d69dd69d569d00d69d9d569d569d56 9d569d569d569d569d569d569d569d56d6569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d567f9d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 56729d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 d6569d569d569d569d569d569d569d569d569d569d569d5656d69d569d56 9d569d569d569d569d569d569d569d569d565600d6d69d9d9d560008009d 569d9d9d56009de956009d80568056e756009de856009de9560700d69dd6 9d569d000000fb56009d800080009b0001d6d6fc56ff000000fcd6029d56 5680af80af9daf0200d69dfcd6ff000700d6d6d69d569d5680af80af9daf 0700d6d69dd6d6d6000700d6d69d9d9d565680af80af9daf0700d69dd69d 569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6 d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d56 80af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf 0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d 9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d6 9dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d5656 80af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf 0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d 569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6 d69d9d9d5656f3aff90004af00afaf0080af80afb6af0700d69dd69d569d 000700d69dd69d569d56f3af0000f9af0600afaf00afaf0080af80afb9af 0700d6d69d9d9d56000700d6d69d9d9d5656f3af0000f6af0300afaf0080 af80afb9af0700d69dd69d569d000700d69dd69d569d56f3af0000f9af0a 00afaf00af000000afafaffc00fdaf0300af000080af80afc8af0700d6d6 9d9d9d56000700d6d69d9d9d5656f3af0000f9af1300afaf00afaf00afaf af0000afaf0000afaf000080af80afc6af0700d69dd69d569d000700d69d d69d569d56f3affa000cafaf00afaf00afaf00afafaf00fcaf0300afaf00 80af80afc5af0700d6d69d9d9d56000700d6d69d9d9d5656f3af0000f9af 0900afaf00afaf00afafaffa0002afaf0080af80afc5af0700d69dd69d56 9d000700d69dd69d569d56f3af0000f9af0a00afaf00afaf00afafaf00f9 af000080af80afc5af0700d6d69d9d9d56000700d6d69d9d9d5656f3af00 00f9af0a00afaf00afaf00afafaf00f9af000080af80afc5af0700d69dd6 9d569d000700d69dd69d569d56f3af0000f9af1200afaf00afaf00afafaf 0000afaf0000afaf0080af80afc5af0700d6d69d9d9d56000700d6d69d9d 9d5656f3af0000f9af0a00afaf00afafaf0000afaffc00fdaf000080af80 afc5af0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6 d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d00 0700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d 9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80 af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d6 9dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d5600 0700d6d69d9d9d5656f4af80648064b564f4af0700d69dd69d569d000700 d69dd69d569d56f4af80648064b66400dff4af0700d6d69d9d9d56000700 d6d69d9d9d5656f4af01646480af80afb9af01dfdff4af0700d69dd69d56 9d000700d69dd69d569d56f4af01646480af80afb9af01dfdff4af0700d6 d69d9d9d56000700d6d69d9d9d5656f4af01646480af80afb9af01dfdff4 af0700d69dd69d569d000700d69dd69d569d56f4af01646480af80afb9af 01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480af 80afb9af01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af01 646480af80afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d56 56f4af01646480af80afb9af01dfdff4af0700d69dd69d569d000700d69d d69d569d56f4af016464f8af0000e7af0000fcaf0000d8af0000faaf0000 e8af0000c0af0400afafaf0080afefaf01dfdff4af0700d6d69d9d9d5600 0700d6d69d9d9d5656f4af016464f8af0000e7af0000fcaf0000d8af0000 faaf0000f6af0000f3af0000c0af0600af00af00af0080aff1af01dfdff4 af0700d69dd69d569d000700d69dd69d569d56f4af016464f9af0000e6af 0400afafaf00d8af0000f9af0000f6af0000f4af0000c0af0600afafaf00 000080aff0af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4 af016464f9af0300afaf00fcaf1e00afaf000000afafaf00af0000afaf00 0000af00afafaf00afaf00af000000fcaffd0009af00afaf00af0000afaf fc00fdaf0400af000000fcaf0b00afafaf000000af00afafaffc0007afaf 000000afafaffc00fcaf0b00afafaf000000af00afafaffc00fcaffc00fd af0f00af0000afaf0000afafaf00af000000fcaffc0015afaf00afafaf00 afafaf00afafaf00afaf00af00af0080aff1af01dfdff4af0700d69dd69d 569d000700d69dd69d569d56f4af016464f9af0300afaf00fcaf7f00af00 afafaf00afaf0000afafaf0000afaf0000afafaf00afaf0000afaf0000af af0000afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afaf af00afaf0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000 afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf002100afaf00afaf0000afaf0000afaf0000afaf0000af00afaf af00afafaf00afafaf00fcaf000080afefaf01dfdff4af0700d6d69d9d9d 56000700d6d69d9d9d5656f4af016464faaf0400afafaf00fcaf0300af00 00fbaf0000fcaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf03 00afaf00f7af0300afaf00fcaf0700afaf00afafaf00fcaf0000f9af0300 afaf00f8af0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf 0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf0d00af00af afaf00afafaf00afaf0080afe9af01dfdff4af0700d69dd69d569d000700 d69dd69d569d56f4af016464faaf0400afafaf00fcaf0900afaf000000af afaf00fcaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300af af00fbaffb0002afaf00fcaf0700afaf00afafaf00fcaf0300afafaffb00 02afaf00fcaffb0006afaf00afafaf00fcaf0200afaffa0002afaf00fcaf 0e00afaf00afafaf00afafaf00afaf00fcaf0200afaffa000cafaf00afaf 00afaf00afafaf0080afe9af01dfdff4af0700d6d69d9d9d56000700d6d6 9d9d9d5656f4af016464faaf0400afafaf00fcaf0000fcaf040000afaf00 fcaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fc af080000afafaf00afaf00fcaf0700afaf00afafaf00fcaf1b00afaf0000 afafaf00afaf00afafaf0000afafaf00afaf00afafaf00fcaf0300afaf00 f9af0000fcaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9 af0a00afaf00afaf00afafaf0080afe9af01dfdff4af0700d69dd69d569d 000700d69dd69d569d56f4af016464fbaf0000fcaf0000fcaf0000fbaf03 00afaf00fcaf0000fcaf0200af00fcaf0000fcaf0300afaf00fcaf0300af af00fcaf0000fcaf0300afaf00fcaf0200af00fcaf0000fcaf0300afaf00 fcaf0700afaf00afafaf00fcaf0200af00fcaf0000fcaf0300afaf00f9af 0000fcaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af09 00af00af00af00afaf0080afe8af01dfdff4af0700d6d69d9d9d56000700 d6d69d9d9d5656f4af016464fbaf0000fcaf0e0000afaf0000af00afafaf 00afaf00fcaf070000afaf0000af00fcaf0000fcaf0b00afaf0000afaf00 00afaf00fcaf0f0000afaf0000afaf0000afaf0000af00fcaf1b0000afaf 0000afaf0000afaf0000afaf00afafaf0000afaf0000af00fcaf230000af af0000afaf0000afaf0000afaf0000afaf0000afaf00afafaf00afafaf00 afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf0080afe8 af01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af016464fb af0000fbaffd000aaf00afaf000000afafaf00fbaffd0003af00af00fcaf 0000fcaf0b00afafaf000000af00afaf00fbaffd000baf0000af00af0000 00afaf00fbaffd0017af00afafaf000000af0000afaf0000afaf000000af 000000fbaffd0004af00afafaffc00fcaffc00fdaf0b00afafaf00afafaf 00afaf00fcaf0300afafaffc00fcaf0800afafaf00afafaf0080afe8af01 dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af016464caaf00 00f1af0000d0af000080afb1af01dfdff4af0700d69dd69d569d000700d6 9dd69d569d56f4af016464cfaf050000afaf0000f1af0000d5af050000af af000080afb1af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656 f4af016464ceaffc00f0af0000d4affc0080afb0af01dfdff4af0700d69d d69d569d000700d69dd69d569d56f4af01646480af80afb9af01dfdff4af 0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480af80afb9af01 dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af01646480af80 afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af0164 6480af80afb9af01dfdff4af0700d69dd69d569d000700d69dd69d569d56 f4af01646480af80afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d 9d9d5656f4af01646480df80dfb7dff4af0700d69dd69d569d000700d69d d69d569d56f4af006480df80dfb6dff4af0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf07 00d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d56 9d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d5656f3 affb00fbaf0000d9af000091aff90004af00afaf0080afd8af0700d69dd6 9d569d000700d69dd69d569d56f3af0000fcaf050000afafaf00eaaf0000 f0af000091af0000f9af0300afaf0080afd8af0700d6d69d9d9d56000700 d6d69d9d9d5656f3af0000fbaf0000e6af000080af0000f6af000080afd8 af0700d69dd69d569d000700d69dd69d569d56f3af0000faaf0b00afaf00 afaf00af0000afaffc00fcaffc0006af000000afafaffc00fdaf0800af00 00af00afafaffc00fcaffd009faf0000f9af0600afaf00afafaffc00fcaf fd0080afe6af0700d6d69d9d9d56000700d6d69d9d9d5656f3af0000faaf 3a00afaf00afaf0000afafaf0000afaf0000afaf0000afaf0000af00afaf af0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf00afafaf00 a0af0000f9af1200afaf00afaf0000afaf0000afaf00afafaf0080afe7af 0700d69dd69d569d000700d69dd69d569d56f3af0000faaf0600afaf00af af00fcaf0000fcaf0300afaf00faaf0400afafaf00fcaf0300afaf00fcaf 0300afaf00fcaf0400afaf00009daffa0008afaf00afaf00afaf00fcaf04 00afaf000080afe4af0700d6d69d9d9d56000700d6d69d9d9d5656f3af00 00faaf0600afaf00afaf00fcaffa0002afaf00faaf0400afafaf00fcaf03 00afaf00fcaf0200afaffa00fdaffd009faf0000f9af0500afaf00afaffa 00fdaffd0080afe6af0700d69dd69d569d000700d69dd69d569d56f3af00 00faaf0600afaf00afaf00fcaf0000f9af0000faaf0400afafaf00fcaf03 00afaf00fcaf0300afaf00f6af010000a0af0000f9af0600afaf00afaf00 f6af01000080afe7af0700d6d69d9d9d56000700d6d69d9d9d5656f3af00 00fbaf0700afafaf00afaf00fcaf0000f9af0000fcaf0600af00afafaf00 fcaf0300afaf00fcaf0300afaf00f5af0000a0af0000f9af0600afaf00af af00f5af000080afe7af0700d69dd69d569d000700d69dd69d569d56f3af 0000fcaf080000afafaf00afaf00fcaf1b0000afaf0000afaf0000afaf00 00af00afafaf0000afaf0000afaf00fcaf0f00afaf0000afaf0000afaf00 afafaf00a0af0000f9af1200afaf00afaf0000afaf0000afaf00afafaf00 80afe7af0700d6d69d9d9d56000700d6d69d9d9d5656f3affb00fbaf0300 afaf00fbaffc00fcaffc00fdaf030000afaffc00fdaf0000fcaf0300afaf affc00fcaffd009faf0000f9af0600afaf00afafaffc00fcaffd0080afe6 af0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d 9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700 d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d56 5680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9d af0700d6d69d9d9d56000700d6d69d9d9d5656f6af8064fb64fcaff164f6 af8064e764fcaff164f5af0700d69dd69d569d000700d69dd69d569d56f6 af8064fc6400dffcaff26400dff6af8064e86400dffcaff26400dff5af07 00d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf 016464fb9500dffb9501dfdff6af01646480afebaf01dfdffcaf016464fb 9500dffb9501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af 01646480af02afdfdffcaf016464fc9502dfdf64fc9501dfdff6af016464 80afebaf01dfdffcaf016464fc9502dfdf64fc9501dfdff5af0700d6d69d 9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf016464fc 9502dfdf64fc9501dfdff6af01646480afebaf01dfdffcaf016464fc9502 dfdf64fc9501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af 046464afafaf8500fdaf01dfdffcaf0e6464959595dfdfaf6464959595df dff6af01646480afebaf01dfdffcaf0e6464959595dfdfaf6464959595df dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af046464afafaf85 00fdaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af01646480 afebaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff5af0700d69d d69d569d000700d69dd69d569d56f6af046464afafafd30000afb300fdaf 01dfdffcaf0e64649595dfdfafafaf64649595dfdff6af016464fcaffa00 d5af050000afaf0000a6af01dfdffcaf0e64649595dfdfafafaf64649595 dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af046464afafaf d30000afb300fdaf01dfdffcaf0e64649595dfdfafafaf64649595dfdff6 af016464fcaf0000f9af0000f5af0000e5af0400afafaf00a4af01dfdffc af0e64649595dfdfafafaf64649595dfdff5af0700d69dd69d569d000700 d69dd69d569d56f6af046464afafafd40000afb200fdaf01dfdffcaf0464 6495dfdffbaf04646495dfdff6af016464fcaf0000f9af0000f5af0000e5 af0400afafaf00a4af01dfdffcaf04646495dfdffbaf04646495dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464faaffd000faf00 afaf0000afaf000000af00afafaffc00fcaf0e0000af000000af000000af 000000afb200fdaf01dfdffcaf04646495dfdffbaf04646495dfdff6af01 6464fcaf0000faaffd00fdaffc000cafaf000000afaf00af0000afaffc00 f9affc0008afaf000000af000000a5af01dfdffcaf04646495dfdffbaf04 646495dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af316464 afafaf0000afaf0000afaf0000afaf0000af0000afaf0000afaf0000afaf 0000afaf00af000000af000000af000000afb200fdaf01dfdffcaf036464 dfdff76401dfdff6af016464fcaffb00fdaf1a00afafaf0000afaf0000af af00afafaf0000afafaf0000afaf0000fbaf0c0000afaf0000afaf00afaf af00a4af01dfdffcaf036464dfdff76401dfdff5af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af166464afafaf000000af0000af000000af0000 00af0000affc0003af0000affc000daf00af000000af000000af0000afb1 00fdaf01dfdffcaf026464dff66401dfdff6af016464f7af0700afaf00af afaf00fcaf0700afaf00afafaf00f7af0000fbaf0000fcaf0700afaf00af afaf00a4af01dfdffcaf026464dff66401dfdff5af0700d69dd69d569d00 0700d69dd69d569d56f6af166464afafaf000000af0000af000000af0000 00af0000affc0002af0000faaf0c0000af0000af0000af000000afb100fd af01dfdffcaf016464f59501dfdff6af016464f7af0600afaf00afafaffa 0006afaf00afafaf00fbaffb00fbaf0000fcaf0700afaf00afafaf00a4af 01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af166464afafaf000000af0000af000000af000000af0000affc 0003af0000aff9000aaf0000af0000af000000afb100fdaf01dfdffcaf01 6464f3dff6af016464f7af0700afaf00afafaf00f9af0400afafaf00fcaf 050000afafaf00fbaf0000fcaf0700afaf00afafaf00a4af01dfdffcaf01 6464f3dff5af0700d69dd69d569d000700d69dd69d569d56f6af166464af afaf000000af0000af000000af000000af0000affc0003af0000aff90009 af00af00af00af0000afb000fdaf01dfdffcaf016464f6df0264dfdff6af 016464fcaf0000fcaf0700afaf00afafaf00f9af0400afafaf00fcaf0000 fcaf0000fbaf0000fcaf0700afaf00afafaf00a4af01dfdffcaf016464f6 df0264dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af166464 afafaf0000afaf0000af000000af000000af0000affc0014af0000afaf00 00afaf000000af000000af000000affc0000afb500fdaf01dfdffcaf0364 64dfdff9af036464dfdff6af016464fcaf0000fcaf1300afaf00afafaf00 00afaf0000afaf00afafaf00fcaf170000afaf0000afaf00afaf0000afaf 0000afaf00afafaf00a4af01dfdffcaf036464dfdff9af036464dfdff5af 0700d69dd69d569d000700d69dd69d569d56f6af016464faaffd000baf00 0000af000000af0000affc0003af000000fcaffc0008af000000af000000 affc0000afb500fdaf01dfdffcaf036464dfdff9af036464dfdff6af0164 64fbaffc00fcaf030000afaffc00fcaf030000af00fbaffd0007af0000af 00afafaffc00fdaf0400afafaf00a4af01dfdffcaf036464dfdff9af0364 64dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af046464afaf af8500fdaf01dfdffcaf036464dfdff9af036464dfdff6af01646480afeb af01dfdffcaf036464dfdff9af036464dfdff5af0700d69dd69d569d0007 00d69dd69d569d56f6af046464afafaf8500fdaf01dfdffcaf036464dfdf f9af036464dfdff6af01646480afebaf01dfdffcaf036464dfdff9af0364 64dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af046464afaf af8500fdaf01dfdffcaf036464dfdff9af036464dfdff6af01646480afeb af01dfdffcaf036464dfdff9af036464dfdff5af0700d69dd69d569d0007 00d69dd69d569d56f6af01646480af02afdfdffcaf036464dfdff9af0364 64dfdff6af01646480afebaf01dfdffcaf036464dfdff9af036464dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdf fcaf036464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf0364 64dfdff9af036464dfdff5af0700d69dd69d569d000700d69dd69d569d56 f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af016464 80afebaf01dfdffcaf036464dfdff9af036464dfdff5af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf036464dfdff9 af036464dfdff6af01646480afebaf01dfdffcaf036464dfdff9af036464 dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01646480af02 afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf01dfdffc af036464dfdff9af036464dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af016464d0af0000b0af01dfdffcaf036464dfdff9af036464df dff6af016464f8af0000e7af0000fbaf0300afaf00f6af0000f5affc00b1 af01dfdffcaf036464dfdff9af036464dfdff5af0700d69dd69d569d0007 00d69dd69d569d56f6af016464d0af0000b0af01dfdffcaf036464dfdff9 af036464dfdff6af016464f8af0000e7af0000fcaf0400afafaf00f6af00 00f6af0000fcaf0000b2af01dfdffcaf036464dfdff9af036464dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d1af0000afaf01 dfdffcaf036464dfdff9af036464dfdff6af016464f8af0000e7af0400af afaf00fcaf0000ebaf0000fcaf0000b2af01dfdffcaf036464dfdff9af03 6464dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af1a6464af afaf000000afafaf00af0000afaf0000afafaf00af000000fcaffc000eaf af00afafaf00afafaf00afafaf00afaf01dfdffcaf036464dfdff9af0364 64dfdff6af016464f8af0300afafaffc00fcaffc00fcaffd00fdaf0300af af00fbaf0300afafaffc00fdaf0b00afaf00af000000afafaf00fcaf0000 b2af01dfdffcaf036464dfdff9af036464dfdff5af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af016464fbaf2a0000afaf0000afaf0000afaf00 afaf0000afaf0000afaf0000afaf0000af00afafaf00afafaf00afafaf00 afaf01dfdffcaf036464dfdff9af036464dfdff6af016464f8af1c00afaf 0000afaf0000afaf0000afaf0000afaf00afafaf00afaf00af00faaf1600 afaf0000afaf0000afaf00afaf0000afaf0000afaf00fcaf0000b2af01df dffcaf036464dfdff9af036464dfdff5af0700d69dd69d569d000700d69d d69d569d56f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0300afaf00fcaf0d00af00afafaf00afafaf00afaf00aeaf01dfdffcaf03 6464dfdff9af036464dfdff6af016464f8af0300afaf00fcaf0300afaf00 fcaf0400afaf0000fbaffd00faaf0300afaf00fcaf0600afaf00afaf00fc af0300afafaffc00b1af01dfdffcaf036464dfdff9af036464dfdff5af07 00d6d69d9d9d56000700d6d69d9d9d5656f6af016464faaf0e00afaf00af afaf00afafaf00afaf00fcaf0200afaffa000cafaf00afaf00afaf00afaf af00aeaf01dfdffcaf036464dfdff9af036464dfdff6af016464f8af0300 afaf00fcaf0200afaffa00fdaffd00fdaf0300afaf00fbaf0200afaffa00 05afaf00afaf00fcaf0300afaf00fcaf0000b2af01dfdffcaf036464dfdf f9af036464dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01 6464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0a 00afaf00afaf00afafaf00aeaf01dfdffcaf036464dfdff9af036464dfdf f6af016464f8af0300afaf00fcaf0300afaf00f6af080000afaf00afafaf 00fcaf0300afaf00f9af0300afaf00fcaf0300afaf00fcaf0000b2af01df dffcaf036464dfdff9af036464dfdff5af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0300afaf00f9af0900af00af00af00afaf00adaf01dfdffcaf036464dfdf f9af036464dfdff6af056464afafaf00fcaf0300afaf00fcaf0300afaf00 f5af0300afaf00fcaf0700afafaf00afaf00f9af0300afaf00fcaf0300af af00fcaf0000b2af01dfdffcaf036464dfdff9af036464dfdff5af0700d6 9dd69d569d000700d69dd69d569d56f6af016464fbaf0f0000afaf00afaf af00afafaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00af afaf00fcaf0300afaf00b5af01dfdffcaf036464dfdff9af036464dfdff6 af056464afafaf00fcaf1a00afaf0000afaf0000afaf0000afaf0000afaf 00afafaf00afaf00fbaf1100afaf00afaf0000afaf0000afaf00afaf00fc af0300afaf00fcaf0000b2af01dfdffcaf036464dfdff9af036464dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af166464afafaf000000 afafaf00afafaf00afafaf00afaf00fcaf0300afafaffc00fcaf0800afaf af00afafaf00fcaf0300afaf00b5af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaffc00fcaffc00fcaffc00fcaffd00fdaf0000faaf05 00af00afafaffc00fdaf0300afaf00fcaf0300afafaffc00b1af01dfdffc af036464dfdff9af036464dfdff5af0700d69dd69d569d000700d69dd69d 569d56f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af 01646480afebaf01dfdffcaf036464dfdff9af036464dfdff5af0700d6d6 9d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf036464 dfdff9af036464dfdff6af01646480afebaf01dfdffcaf036464dfdff9af 036464dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464 80af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf01 dfdffcaf036464dfdff76401dfdff5af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6 af01646480afebaf01dfdffcaf026464dff66401dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af01646480af02afdfdffcaf036464dfdf f9af036464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdf fcaf036464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf0164 64f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af0164 6480af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf 01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af 01646480afebaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d 000700d69dd69d569d56f6af016464d0af0000faaf0000f9af0000bfaf01 dfdffcaf036464dfdff9af036464dfdff6af016464fcaff900fdaff900fb af0000fbaffb00fcaf0000f7af0200afaff900a8af01dfdffcaf016464f5 9501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d0 af0000fbaf010000f9af0000bfaf01dfdffcaf036464dfdff9af036464df dff6af016464fcaf0000fbaf040000afaf00f6affd00fcaf0000fcaf0500 00afaf0000f9af040000afaf00a2af01dfdffcaf016464f59501dfdff5af 0700d69dd69d569d000700d69dd69d569d56f6af016464d1af0000fbaf02 00af00f9af0000bfaf01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf0000faaf0300afaf00f6af0200af00fcaf0000fbaf0400afaf0000 f9af040000afaf00a2af01dfdffcaf016464f59501dfdff5af0700d6d69d 9d9d56000700d6d69d9d9d5656f6af1a6464afafaf000000afafaf00af00 00afaf0000afafaf00af000000fcaffc000eafaf00afafaf00afafaf00af afaf00fcaf0b00afaf00afafaf000000af00bfaf01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaf0000faaf0300afaf00f6af0200af00fc af0000faaf0400af00af00fbaf0500af00afaf00a2af01dfdffcaf016464 f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464 fbaf3a0000afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf 0000af00afafaf00afafaf00afafaf00afafaf00afafaf00afaf0000afaf 0000bfaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000 fbaf0400afafaf00f7af0800afafaf00afafaf00faaf0400af00af00fbaf 0500af00afaf00a2af01dfdffcaf016464f59501dfdff5af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af016464faaf0e00afaf00afafaf00afaf af00afaf00fcaf0300afaf00fcaf1100af00afafaf00afafaf00afaf00af afaf00fcaf0300afaf00fcaf0000bfaf01dfdffcaf036464dfdff9af0364 64dfdff6af016464fcaffa00fcaffa00fcaf0800afafaf00afafaf00faaf 0e00af00afaf00afafaf00afaf00afaffa00a7af01dfdffcaf016464f595 01dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464faaf 0e00afaf00afafaf00afafaf00afaf00fcaf0200afaffa0010afaf00afaf 00afaf00afafaf00afafaf00fcaf0300afaf00fcaf0000bfaf01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf0000fbaf0400afafaf00f8 af0000fbaf0300afaf00faaf0f00af00afaf00afafaf00afaf00afaf00a2 af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf03 00afaf00f9af0d00afaf00afaf00afafaf00afafaff90001af00fcaf0000 bfaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf 0300afaf00f8aff90002afaf00faaf0f00af00afafaf00af00afafaf00af af00a2af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700 d69dd69d569d56f6af016464faaf0e00afaf00afafaf00afafaf00afaf00 fcaf0300afaf00f9af0900af00af00af00afaf00f7af0300afaf00fcaf00 00bfaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fa af0300afaf00f8af0000fbaf0300afaf00fbaf1000afaf00afafaf00af00 afafaf00afaf00a2af01dfdffcaf016464f59501dfdff5af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af016464fbaf0f0000afaf00afafaf00af afaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf00 f7af0800afaf0000afaf0000bfaf01dfdffcaf036464dfdff9af036464df dff6af016464fcaf0000faaf0300afaf00f9af0000f9af0200af00fcaf04 0000afaf00fcaf0000fcaf0300afaf00a2af01dfdffcaf016464f59501df dff5af0700d69dd69d569d000700d69dd69d569d56f6af166464afafaf00 0000afafaf00afafaf00afafaf00afaf00fcaf0300afafaffc00fcaf0800 afafaf00afafaf00f7af0800afafaf000000af00bfaf01dfdffcaf036464 dfdff9af036464dfdff6af016464fcaf0000faaf0200afaff90001af00f9 af0100affb00fcaf0000fcaf0000fcaf0200afaff900a8af01dfdffcaf01 6464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01 646480af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afeb af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd6 9d569d56f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6 af01646480afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf036464dfdff9 af036464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af 0700d69dd69d569d000700d69dd69d569d56f6af01646480af02afdfdffc af036464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 80af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf01 dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd69d56 9d56f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af01 646480afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af01646480af02afdfdffcaf036464dfdff9af03 6464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af0700 d69dd69d569d000700d69dd69d569d56f6af01646480af02afdfdffcaf03 6464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf016464f595 01dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d0af 0000dcaf0000d5af01dfdffcaf036464dfdff9af036464dfdff6af016464 fcaff900fdaff900fbaf0000fbaffb00fcaf0000f7af0200afaff900a8af 01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd69d 569d56f6af016464d0af0000dcaf0000d5af01dfdffcaf036464dfdff9af 036464dfdff6af016464fcaf0000fbaf040000afaf00f6affd00fcaf0000 fcaf050000afaf0000f9af040000afaf00a2af01dfdffcaf016464f59501 dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d1af00 00afaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fa af0300afaf00f6af0200af00fcaf0000fbaf0400afaf0000f9af040000af af00a2af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700 d69dd69d569d56f6af1a6464afafaf000000afafaf00af0000afaf0000af afaf00af000000fcaffc0011afaf00afafaf00afafaf00afafaf00afafaf fc0002afaf00fbaf0200afaffc00fdaf0f00af0000afaf000000afafaf00 afafaffc00fdaf0400af000000e4af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf0000faaf0300afaf00f6af0200af00fcaf0000faaf 0400af00af00fbaf0500af00afaf00a2af01dfdffcaf016464f59501dfdf f5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464fbaf340000 afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf0000af00af afaf00afafaf00afafaf00afaf0000afaf0000af00fbaf2600af0000afaf 0000afaf0000afafaf00afafaf00afaf00afaf0000afaf0000afaf0000af af0000e5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf00 00fbaf0400afafaf00f7af0800afafaf00afafaf00faaf0400af00af00fb af0500af00afaf00a2af01dfdffcaf016464f59501dfdff5af0700d69dd6 9d569d000700d69dd69d569d56f6af016464faaf0e00afaf00afafaf00af afaf00afaf00fcaf0300afaf00fcaf1100af00afafaf00afafaf00afaf00 afafaf00fcaf0a00afaf00afafaf00afaf00fcaf0300afaf00fcaf010000 fbaf0300afaf00fcaf0300afaf00fcaf0000e5af01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaffa00fcaffa00fcaf0800afafaf00afaf af00faaf0e00af00afaf00afafaf00afaf00afaffa00fcaf040000afaf00 b0af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0200afaffa000fafaf00afaf00afaf00afafaf00afafaffa0008afaf00af afaf00afaffa0002afaf00fbaffd00fdaf0300afaf00fcaf0300afaf00fc af0000e5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf00 00fbaf0400afafaf00f8af0000fbaf0300afaf00faaf0f00af00afaf00af afaf00afaf00afaf00f8af0500af0000af00b0af01dfdffcaf016464f595 01dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464faaf 0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0e00afaf00 afaf00afafaf00afafaf00f9af0700afafaf00afaf00f9af0000f9af0700 00afaf00afaf00fcaf0300afaf00fcaf0000e5af01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaf0000faaf0300afaf00f8aff90002afaf 00faaf0f00af00afafaf00af00afafaf00afaf00f8af0400afaf0000afaf 01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300 afaf00f9af0900af00af00af00afaf00fcaf0000f8af0600af00afafaf00 f9af0000f8af0600afaf00afaf00fcaf0300afaf00fcaf0000e5af01dfdf fcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0300afaf00 f8af0000fbaf0300afaf00fbaf1000afaf00afafaf00af00afafaf00afaf 00a2af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d6 9dd69d569d56f6af016464fbaf0f0000afaf00afafaf00afafaf00afaf00 fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf00fcaf170000af af0000afafaf00af00afafaf0000afaf0000afaf00fcaf1200afafaf00af af00afaf0000afaf0000afaf00fcaf0000e5af01dfdffcaf036464dfdff9 af036464dfdff6af016464fcaf0000faaf0300afaf00f9af0000f9af0200 af00fcaf040000afaf00fcaf0000fcaf0300afaf00a2af01dfdffcaf0164 64f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af1664 64afafaf000000afafaf00afafaf00afafaf00afaf00fcaf0300afafaffc 00fcaf0800afafaf00afafaf00fbaffc00fbaf0000fbaffc00fdaf0000fb affd00fdaf0300afafaffc00fdaf0000fcaf0000e5af01dfdffcaf036464 dfdff9af036464dfdff6af016464fcaf0000faaf0200afaff90001af00f9 af0100affb00fcaf0000fcaf0000fcaf0200afaff900a8af01dfdffcaf01 6464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01 646480af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afeb af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6 af01646480afebaf01dfdffcaf016464f59501dfdff5af0700d69dd69d56 9d000700d69dd69d569d56f6af01646480af02afdfdffcaf036464dfdff9 af036464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffc af036464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf016464 f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464 80af02afdfdffcaf036464dfdff9af036464dfdff6af01646480afebaf01 dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d 5656f6af01646480af02afdfdffcaf036464dfdff9af036464dfdff6af01 646480afebaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d00 0700d69dd69d569d56f6af01646480af02afdfdffcaf036464dfdff9af03 6464dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af0700 d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf03 6464dfdff9af036464dfdff6af01646480afebaf01dfdffcaf016464f595 01dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464d0af 0200af00ddaf0000f2af0300afaf00e8af01dfdffcaf036464dfdff9af03 6464dfdff6af016464dbaf0300afaf0094af01dfdffcaf016464f59501df dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d0af0200 af00ddaf0000f2af0300afaf00e8af01dfdffcaf036464dfdff9af036464 dfdff6af016464dbaf0300afaf00f7af00009eaf01dfdffcaf016464f595 01dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464d1af 0300afaf00ddaf0000f2af0000e5af01dfdffcaf036464dfdff9af036464 dfdff6af016464dbaf0000f4af00009eaf01dfdffcaf016464f59501dfdf f5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af1a6464afafaf0000 00afafaf00af0000afaf0000afafaf00af000000fcaffc0018afaf00afaf af00afafaf00afafaf00afaf00af000000afaf00fbaf0600af00af000000 fcaffc00fdaf0c00af0000af00af000000afafaffc00fdaf0600afaf00af afaffc00efaf01dfdffcaf036464dfdff9af036464dfdff6af016464fbaf fc000aafaf0000afafaf0000afaffc00fcaffd00faaf0e00afaf00afafaf 000000afaf0000009faf01dfdffcaf016464f59501dfdff5af0700d69dd6 9d569d000700d69dd69d569d56f6af016464fbaf350000afaf0000afaf00 00afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00afafaf00 afafaf00afaf0000afaf0000af0000fcaf3100af0000afaf0000afaf0000 afaf0000afaf0000afafaf0000afaf0000af0000afaf0000afaf00afaf00 afaf0000afaf0000f0af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fcaf1b0000afaf0000afaf00afafaf00afaf0000afaf0000afaf00af afaf00fbaf0d00afaf00afaf00afafaf00afaf009eaf01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf1100af 00afafaf00afafaf00afaf00afafaf00fcaf0a00afaf00afafaf00afaf00 fcaf0300afaf00fcaf0300afaf00fcaf0000fcaf0200af00fcaf0900afaf 00afaf00afaf00ebaf01dfdffcaf036464dfdff9af036464dfdff6af0164 64f7af0a00afafaf00af00afafaf00fcaf0400afaf0000f8af0700afaf00 afaf0000fbaf00009eaf01dfdffcaf016464f59501dfdff5af0700d69dd6 9d569d000700d69dd69d569d56f6af016464faaf0e00afaf00afafaf00af afaf00afaf00fcaf0200afaffa0010afaf00afaf00afaf00afafaf00afaf af00fcaf0a00afaf00afafaf00afaf00fcaf0200afaffa0002afaf00fcaf 0000fcaf0200af00fcaf0900afaf00afaf00afaf00ebaf01dfdffcaf0364 64dfdff9af036464dfdff6af016464fbaffb00fcaf0000fcaffa00fdaffd 00faaf0d00afaf00afafaf000000afafaf009eaf01dfdffcaf016464f595 01dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464faaf 0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0e00afaf00 afaf00afafaf00afafaf00fcaf0a00afafaf00afaf00afaf00fcaf0300af af00f9af0000fcaf0000fcaf0200af00fcaf0900afaf00afaf00afaf00eb af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf050000afaf af00fcaf0000fcaf0000f6af010000fbaf0300afaf00fbaf040000afaf00 9eaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69d d69d569d56f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0300afaf00f9af0900af00af00af00afaf00fcaf0000fcaf0a00afafaf00 af00afafaf00fcaf0300afaf00f9af0000fcaf0000fcaf0200af00fcaf09 00afaf00afaf00afaf00fcaf0000f0af01dfdffcaf036464dfdff9af0364 64dfdff6af016464fcaf0000fcaf0a00afafaf00af00afafaf00f5af0000 fbaf0300afaf00faaf0300afaf009eaf01dfdffcaf016464f59501dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464fbaf0f0000af af00afafaf00afafaf00afaf00fcaf1400afaf0000afaf0000afafaf00af afaf00afafaf00fcaf0000fcaf0000fcaf150000afafaf0000afaf0000af af0000afaf0000afaf00fcaf1a0000afaf0000af0000afaf0000afaf00af af00afaf0000afaf0000f0af01dfdffcaf036464dfdff9af036464dfdff6 af016464fcaf2e0000afaf0000afaf00afafaf00afaf0000afaf0000afaf 00afafaf00afaf00afaf00afaf00afaf00afafaf00afaf009eaf01dfdffc af016464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6 af166464afafaf000000afafaf00afafaf00afafaf00afaf00fcaf0300af afaffc00fcaf0800afafaf00afafaf00fcaf0000fcaf0000fcaf0000fcaf 0400af000000fcaffc00fdaf0000fcaf0700af000000afafaffc00fdaf06 00afaf00afafaffc00efaf01dfdffcaf036464dfdff76401dfdff6af0164 64fbaffd0000affc00fdaf030000afaffc00fcaffd00fdaf0c00afaf00af af00afafaf000000fcaf010000a0af01dfdffcaf016464f59501dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464c4af0000fcaf00 00c1af01dfdffcaf026464dff66401dfdff6af01646480afebaf01dfdffc af016464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6 af016464c5af010000fcaf0000c1af01dfdffcaf016464f59501dfdff6af 01646480afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56 000700d6d69d9d9d5656f6af016464c6af010000fbaf0000c1af01dfdffc af016464f59501dfdff6af01646480afebaf01dfdffcaf016464f59501df dff5af0700d69dd69d569d000700d69dd69d569d56f6af01646480af02af dfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf016464f5 9501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480 af02afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf01 6464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01 646480af02afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdf fcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656 f6af01646480af02afdfdffcaf016464f59501dfdff6af01646480afebaf 01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd69d 569d56f6af01646480af02afdfdffcaf016464f59501dfdff6af01646480 afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6 d69d9d9d5656f6af016464d0af0200af00b2af01dfdffcaf016464f59501 dfdff6af016464fcaf0000f4affc00f2af0300afaf00fbaf0000faaf0000 9faf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69d d69d569d56f6af016464d0af0200af00b2af01dfdffcaf016464f59501df dff6af016464fcaf0000f5af0000fcaf0000f3af0300afaf00fbaf0000fa af00009faf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d560007 00d6d69d9d9d5656f6af016464d1af0000afaf01dfdffcaf016464f59501 dfdff6af016464fcaf0000f5af0000fcaf0000f3af0300afaf00fbaf0000 faaf00009faf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d00 0700d69dd69d569d56f6af1a6464afafaf000000afafaf00af0000afaf00 00afafaf00af000000fcaffc0014afaf00afafaf00afafaf00afafaf00af af00afafaffc00fdaffc00c0af01dfdffcaf016464f59501dfdff6af0164 64fcaf0a00af000000afaf00af0000faaf0000faaffc00fdaf0300afaf00 fbaf1200af000000afaf00af000000afaf00af000000aaaf01dfdffcaf01 6464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01 6464fbaf3c0000afaf0000afaf0000afaf00afaf0000afaf0000afaf0000 afaf0000af00afafaf00afafaf00afafaf00afaf00afaf0000afaf0000af 0000afaf0000c1af01dfdffcaf016464f59501dfdff6af016464fcaf0800 00afaf0000af0000f9af0000faaf0b0000afaf0000afaf00afaf00fbaf13 0000afaf0000af0000afaf0000af0000afaf0000abaf01dfdffcaf016464 f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464 faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf1400af 00afafaf00afafaf00afaf00afafaf00afaf00faaf0000fcaf0000c1af01 dfdffcaf016464f59501dfdff6af016464fcaf0000fcaf0200af00f9af00 00f4af0600afaf00afaf00fbaf0000fcaf0200af00fcaf0200af00fcaf00 00abaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6 d69d9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fc af0200afaffa0013afaf00afaf00afaf00afafaf00afafaf00afaf00faaf 0000fcaf0000c1af01dfdffcaf016464f59501dfdff6af016464fcaf0000 fcaf0200af00faaf0000f7affb0005afaf00afaf00fbaf0000fcaf0200af 00fcaf0200af00fcaf0000abaf01dfdffcaf016464f59501dfdff5af0700 d69dd69d569d000700d69dd69d569d56f6af016464faaf0e00afaf00afaf af00afafaf00afaf00fcaf0300afaf00f9af1100afaf00afaf00afafaf00 afafaf00afaf00faaf0000fcaf0000c1af01dfdffcaf016464f59501dfdf f6af016464fcaf0000fcaf0200af00fbaf0000f7af0b0000afafaf00afaf 00afaf00fbaf0000fcaf0200af00fcaf0200af00fcaf0000abaf01dfdffc af016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6 af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9 af0900af00af00af00afaf00fcaf0300afaf00fcaf0200af00fcaf0000c1 af01dfdffcaf016464f59501dfdff6af016464fcaf0000fcaf0200af00fc af0000f6af0000fcaf0600afaf00afaf00fbaf0000fcaf0200af00fcaf02 00af00fcaf0000abaf01dfdffcaf016464f59501dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af016464fbaf0f0000afaf00afafaf00af afaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf00 fcaf0f00afaf0000afaf0000af0000afaf0000c1af01dfdffcaf016464f5 9501dfdff6af016464fcaf070000afaf0000af00fcaf0000f9af2700afaf 0000afaf0000afaf00afaf00afaf00afaf0000afaf0000af0000afaf0000 af0000afaf0000abaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af166464afafaf000000afafaf00afafaf 00afafaf00afaf00fcaf0300afafaffc00fcaf0800afafaf00afafaf00fc af0300afafaffc00fdaffc00c0af01dfdffcaf016464f59501dfdff6af01 6464fcaf0700af000000afaf00fcaffa0028afaf00afafaf000000af0000 af00afaf00afaf00afaf00af000000afaf00af000000afaf00af000000aa af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd6 9d569d56f6af01646480af02afdfdffcaf016464f59501dfdff6af016464 c6af0000a6af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af01646480af02afdfdffcaf016464f59501dfdf f6af016464c6af0000a6af01dfdffcaf016464f59501dfdff5af0700d69d d69d569d000700d69dd69d569d56f6af01646480af02afdfdffcaf016464 f59501dfdff6af016464c6af0000a6af01dfdffcaf016464f59501dfdff5 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdf fcaf016464f59501dfdff6af01646480afebaf01dfdffcaf016464f59501 dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01646480af02 afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 80af02afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf 016464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af 01646480af02afdfdffcaf016464f59501dfdff6af01646480afebaf01df dffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d56 56f6af01646480af02afdfdffcaf016464f59501dfdff6af01646480afeb af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd6 9d569d56f6af016464d0af0700af00afafaf0000b7af01dfdffcaf016464 f59501dfdff6af016464edaf0000e4af0000f1af0000e3af050000afaf00 00cfaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6 d69d9d9d5656f6af016464d0af0500af00afaf00b5af01dfdffcaf016464 f59501dfdff6af016464edaf0000e4af0000f1af0000e4af0400afafaf00 cdaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69d d69d569d56f6af016464d1af0000fbaf0000b5af01dfdffcaf016464f595 01dfdff6af016464edaf0000e4af0000f1af0000e4af0400afafaf00cdaf 01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af1a6464afafaf000000afafaf00af0000afaf0000afafaf00af 000000fcaffc001bafaf00afafaf00afafaf00afafaf00afaf00af000000 afafaf000000bcaf01dfdffcaf016464f59501dfdff6af016464fbaffc00 fdaffc00fdaf0300afafaffc00fdaf0300af0000f6affd0004af00afafaf fc00fcaffd0004af00afafaffc00fcaffc00faaffc0008afaf000000af00 0000ceaf01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700 d69dd69d569d56f6af016464fbaf380000afaf0000afaf0000afaf00afaf 0000afaf0000afaf0000afaf0000af00afafaf00afafaf00afafaf00afaf 00afaf00afafaf00afafaf00bdaf01dfdffcaf016464f59501dfdff6af01 6464fcaf1b0000afaf0000af0000afaf0000afaf00afaf0000afaf0000af af0000f5af250000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000afaf0000afaf0000fcaf0c0000afaf0000afaf00afafaf00 cdaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf 0300afaf00fcaf1900af00afafaf00afafaf00afaf00afafaf00afaf00af afaf0000baaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf 0000fcaf0600afaf00afaf00fcaf0300afaf00f4af0000fcaf0300afaf00 fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00f7af0000fcaf0700af af00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d69dd69d56 9d000700d69dd69d569d56f6af016464faaf0e00afaf00afafaf00afafaf 00afaf00fcaf0200afaffa0013afaf00afaf00afaf00afafaf00afafaf00 afaf00fcaffd00bcaf01dfdffcaf016464f59501dfdff6af016464fcaf00 00faaf0000fcaf0600afaf00afaf00fcaf0300afaf00f4af0000fcaf0300 afaf00fcaf0300afaf00fcaf0200afaffa0002afaf00f7af0000fcaf0700 afaf00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af016464faaf0e00afaf00afafaf00afaf af00afaf00fcaf0300afaf00f9af1100afaf00afaf00afafaf00afafaf00 afaf00faaf010000bdaf01dfdffcaf016464f59501dfdff6af016464fcaf 0000faaf0000fcaf0600afaf00afaf00fcaf0300afaf00f4af0000fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000f7af0000fcaf0700 afaf00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af016464faaf0e00afaf00afafaf00afaf af00afaf00fcaf0300afaf00f9af0900af00af00af00afaf00fcaf0300af af00f9af0000bdaf01dfdffcaf016464f59501dfdff6af016464fcaf0000 fcaf0200af00fcaf0600afaf00afaf00fcaf0300afaf00f4af0000fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000fcaf0000fcaf0000 fcaf0700afaf00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700 d6d69d9d9d56000700d6d69d9d9d5656f6af016464fbaf0f0000afaf00af afaf00afafaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00 afafaf00fcaf0b00afaf00afafaf00afafaf00bdaf01dfdffcaf016464f5 9501dfdff6af016464fcaf1a0000afaf0000af0000afaf0000afaf00afaf 0000afaf0000afaf00f4af360000afaf0000afaf0000afaf0000afaf0000 afaf0000afaf0000afaf0000afaf0000afaf0000af00afaf0000afaf0000 afaf00afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af166464afafaf000000afafaf00afafaf 00afafaf00afaf00fcaf0300afafaffc00fcaf0800afafaf00afafaf00fc af0300afaf00fcaffd00bcaf01dfdffcaf016464f59501dfdff6af016464 fbaffc00fdaffc00fdaf0300afafaffc00fdaf0000f3affd0004af00afaf affc00fcaffd0004af00afafaffc00fcaffc0005afaf00afafaffc00fdaf 0400afafaf00cdaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf016464f59501 dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af0700d69d d69d569d000700d69dd69d569d56f6af01646480af02afdfdffcaf016464 f59501dfdff6af01646480afebaf01dfdffcaf016464f59501dfdff5af07 00d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02afdfdffcaf 016464f59501dfdff6af016464deaff80095af01dfdffcaf016464f59501 dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af01646480af02 afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 80af02afdfdffcaf016464f59501dfdff6af01646480afebaf01dfdffcaf 016464f59501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af 01646480af02afdfdffcaf016464f59501dfdff6af01646480afebaf01df dffcaf016464f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d56 56f6af01646480af02afdfdffcaf016464f59501dfdff6af01646480afeb af01dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd6 9d569d56f6af01646480af02afdfdffcaf016464f59501dfdff6af016464 80afebaf01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d56000700 d6d69d9d9d5656f6af016464d0af0000caaf050000afaf0000ecaf01dfdf fcaf016464f59501dfdff6af016464edaf0000e8af010000d2af0000e6af 050000afaf0000e8af01dfdffcaf016464f59501dfdff5af0700d69dd69d 569d000700d69dd69d569d56f6af016464d0af0000d6af0000f6af0400af afaf00eaaf01dfdffcaf016464f59501dfdff6af016464edaf0000e9af00 00d0af0000e7af0400afafaf00e6af01dfdffcaf016464f59501dfdff5af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464d1af0000d5af00 00f6af0400afafaf00eaaf01dfdffcaf016464f59501dfdff6af016464ed af0000e9af0000d0af0000e7af0400afafaf00e6af01dfdffcaf016464f5 9501dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af1a6464af afaf000000afafaf00af0000afaf0000afafaf00af000000fcaffc0015af af00afafaf00afafaf00afafaf00afaf00af000000fcaffc000aafaf00af afaf00afafaf00f5affd0007afaf000000afaf00fcaffc0003af000000eb af01dfdffcaf016464f59501dfdff6af016464fbaffc00fdaffc00fdaf03 00afafaffc00fdaf0300af0000f8affd00fdaffc00fcaffc00fdaffc00f4 affc0002afaf00fcaf0900af00af000000afafaffc00f9affc0008afaf00 0000af000000e7af01dfdffcaf016464f59501dfdff5af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af016464fbaf440000afaf0000afaf0000af af00afaf0000afaf0000afaf0000afaf0000af00afafaf00afafaf00afaf af00afaf0000afaf0000afaf0000afaf0000af00afafaf00afafaf00f6af 0b00afafaf00afaf00afafaf00fcaf0600af00afafaf00eaaf01dfdffcaf 016464f59501dfdff6af016464fcaf1b0000afaf0000af0000afaf0000af af00afaf0000afaf0000afaf0000f5af1800afafaf0000afaf0000afaf00 00afaf0000af0000afaf0000f6af070000afaf0000af00fcaf0e00af0000 afaf0000af0000afaf0000fbaf0c0000afaf0000afaf00afafaf00e6af01 dfdffcaf016464f59501dfdff5af0700d69dd69d569d000700d69dd69d56 9d56f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300af af00fcaf1100af00afafaf00afafaf00afaf00afafaf00fcaf0300afaf00 fcaf0a00af00afafaf00afafaf00f6af010000fbaf0400afafaf00fcaf06 00af00afafaf00eaaf01dfdffcaf016464f59501dfdff6af016464fcaf00 00faaf0000fcaf0600afaf00afaf00fcaf0300afaf00f4af0000f8af0300 afaf00faaf0000fcaf0000f6af0000faaf0000fcaf0200af00fcaf0200af 00fcaf0000fbaf0000fcaf0700afaf00afafaf00e6af01dfdffcaf016464 f59501dfdff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464 faaf0e00afaf00afafaf00afafaf00afaf00fcaf0200afaffa0010afaf00 afaf00afaf00afafaf00afafaf00fcaf0200afaffa0008afaf00afaf00af af00f4affd00fdaf0400afafaf00fcaf0600af00afafaf00eaaf01dfdffc af016464f3dff6af016464fcaf0000faaf0000fcaf0600afaf00afaf00fc af0300afaf00f4af0000fcaffb0002afaf00faaffa00f6af0000faaf0000 fcaf0200af00fcaf0100affa00fbaf0000fcaf0700afaf00afafaf00e6af 01dfdffcaf016464f3dff5af0700d69dd69d569d000700d69dd69d569d56 f6af016464faaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00 f9af0e00afaf00afaf00afafaf00afafaf00fcaf0300afaf00f9af0600af af00afaf00f2af080000afaf00afafaf00fcaf0600af00afafaf00eaaf01 dfdffcaf016464f7df036464dfdff6af016464fcaf0000faaf0000fcaf06 00afaf00afaf00fcaf0300afaf00f4af0c00afafaf0000afafaf00afaf00 faaf0000f1af0000faaf0000fcaf0200af00fcaf0200af00f6af0000fcaf 0700afaf00afafaf00e6af01dfdffcaf016464f7df036464dfdff5af0700 d6d69d9d9d56000700d6d69d9d9d5656f6af016464faaf0e00afaf00afaf af00afafaf00afaf00fcaf0300afaf00f9af0900af00af00af00afaf00fc af0000fcaf0300afaf00f9af0600af00af00af00f1af0700afaf00afafaf 00fcaf0600af00afafaf00eaaf01dfdffcaf04646495dfdffbaf04646495 dfdff6af016464fcaf0000fcaf0200af00fcaf0600afaf00afaf00fcaf03 00afaf00f4af0400afafaf00fcaf0300afaf00fcaf0200af00f1af0000fc af0200af00fcaf0200af00fcaf0200af00f6af0000fcaf0700afaf00afaf af00e6af01dfdffcaf04646495dfdffbaf04646495dfdff5af0700d69dd6 9d569d000700d69dd69d569d56f6af016464fbaf0f0000afaf00afafaf00 afafaf00afaf00fcaf1400afaf0000afaf0000afafaf00afafaf00afafaf 00fcaf0000fcaf1000afaf0000afaf0000afafaf00afafaf00f4af1600af afaf00afaf00afafaf0000afaf0000af00afafaf00eaaf01dfdffcaf0464 6495dfdffbaf04646495dfdff6af016464fcaf1a0000afaf0000af0000af af0000afaf00afaf0000afaf0000afaf00f4af1800afafaf0000afaf0000 afaf0000afaf0000af0000afaf0000f6af2c0000afaf0000af0000afaf00 00af0000afaf0000af0000afaf0000afaf00afaf0000afaf0000afaf00af afaf00e6af01dfdffcaf04646495dfdffbaf04646495dfdff5af0700d6d6 9d9d9d56000700d6d69d9d9d5656f6af166464afafaf000000afafaf00af afaf00afafaf00afaf00fcaf0300afafaffc00fcaf0800afafaf00afafaf 00fcaf0000fcaf0300afafaffc00fcaf0400afafaf00f3affd00fcaf0e00 00afaf000000af00af00afafaf00eaaf01dfdffcaf0e64649595dfdfafaf af64649595dfdff6af016464fbaffc00fdaffc00fdaf0300afafaffc00fd af0000f4af0000fcaffd0004af0000afaffc00fdaffc00f4affc00fdaffd 000aaf00af00af000000afafaffc00fdaf0300afafaffc00fdaf0400afaf af00e6af01dfdffcaf0e64649595dfdfafafaf64649595dfdff5af0700d6 9dd69d569d000700d69dd69d569d56f6af01646480af02afdfdffcaf0e64 649595dfdfafafaf64649595dfdff6af01646480afebaf01dfdffcaf0e64 649595dfdfafafaf64649595dfdff5af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01646480af02afdfdffcaf0e6464959595dfdfaf64649595 95dfdff6af01646480afebaf01dfdffcaf0e6464959595dfdfaf64649595 95dfdff5af0700d69dd69d569d000700d69dd69d569d56f6af016464b5af f800d2af01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af016464 deaff800e5aff800b8af01dfdffcaf0e6464959595dfdfaf6464959595df dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02af dfdffcaf016464fc9502df6464fc9501dfdff6af01646480afebaf01dfdf fcaf016464fc9502df6464fc9501dfdff5af0700d69dd69d569d000700d6 9dd69d569d56f6af01646480af02afdfdffcaf016464fc9502df6464fc95 01dfdff6af01646480afebaf01dfdffcaf016464fc9502df6464fc9501df dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01646480af02af dfdffcaf016464fb950064fb9501dfdff6af01646480afebaf01dfdffcaf 016464fb950064fb9501dfdff5af0700d69dd69d569d000700d69dd69d56 9d56f6af01646480dffddffcaf016464f3dff6af01646480dfe9dffcaf01 6464f3dff5af0700d6d69d9d9d56000700d6d69d9d9d5656f6af006480df fcdffcaf0064f2dff6af006480dfe8dffcaf0064f2dff5af0700d69dd69d 569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6 d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d56 80af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf 0700d69dd69d569d000700d69dd69d569d56f6af8064fb64e3af8064e764 e2af0700d6d69d9d9d56000700d6d69d9d9d5656f6af8064fc6400dfe3af 8064e86400dfe2af0700d69dd69d569d000700d69dd69d569d56f6af0164 64f79501dfdfcc95cadf0295dfdff79501dfdfe3af016464f79501dfdfbd 95c5df0295dfdff79501dfdfe2af0700d6d69d9d9d56000700d6d69d9d9d 5656f6af016464f995fddf0064cc95cbdf016495fcdff99501dfdfe3af01 6464f995fddf0064bd95c6df016495fcdff99501dfdfe2af0700d69dd69d 569d000700d69dd69d569d56f6af016464fb95fcdf016464cc9501dfdfce af02646495fadffb9501dfdfe3af016464fb95fcdf016464bd9501dfdfc9 af02646495fadffb9501dfdfe2af0700d6d69d9d9d56000700d6d69d9d9d 5656f6af046464959595fcdf03afaf6464cc9501dfdfceaf06646495dfdf afaffcdffd9501dfdfe3af046464959595fcdf03afaf6464bd9501dfdfc9 af06646495dfdfafaffcdffd9501dfdfe2af0700d69dd69d569d000700d6 9dd69d569d56f6af02646495fcdffcaf016464cc9501dfdfceaf04646495 dfdffcaffcdf0295dfdfe3af02646495fcdffcaf016464bd9501dfdfc9af 04646495dfdffcaffcdf0295dfdfe2af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af046464dfdfdffaaf016464cc9501dfdfceaf04646495dfdf faaffd6401dfdfe3af046464dfdfdffaaf016464bd9501dfdfc9af046464 95dfdffaaffd6401dfdfe2af0700d69dd69d569d000700d69dd69d569d56 f6af02646495fc64fcaf016464cc9501dfdfceaf04646495dfdffcaffc64 0295dfdfe3af02646495fc64fcaf016464bd9501dfdfc9af04646495dfdf fcaffc640295dfdfe2af0700d6d69d9d9d56000700d6d69d9d9d5656f6af 046464959595fc6403afaf6464cc9501dfdfceaf06646495dfdfafaffc64 fd9501dfdfe3af046464959595fc6403afaf6464bd9501dfdfc9af066464 95dfdfafaffc64fd9501dfdfe2af0700d69dd69d569d000700d69dd69d56 9d56f6af016464fb95fa64cc9501dfdfceaf04646495dfdffc64fb9501df dfe3af016464fb95fa64bd9501dfdfc9af04646495dfdffc64fb9501dfdf e2af0700d6d69d9d9d56000700d6d69d9d9d5656f6af016464f995fc64cc 9501dfdfcc640495df646464f99501dfdfe3af016464f995fc64bd9501df dfc7640495df646464f99501dfdfe2af0700d69dd69d569d000700d69dd6 9d569d56f6af016464f795016464cc9500dfcb640295df64f79501dfdfe3 af016464f795016464bd9500dfc6640295df64f79501dfdfe2af0700d6d6 9d9d9d56000700d6d69d9d9d5656f6af01646480dffddfe3af01646480df e9dfe2af0700d69dd69d569d000700d69dd69d569d56f6af006480dffcdf e3af006480dfe8dfe2af0700d6d69d9d9d56000700d6d69d9d9d565680af 80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700 d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d 000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d 9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af 80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700 d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56 000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd6 9d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d5656f6af 80df80dfb1dff6af0700d69dd69d569d000700d69dd69d569d56f6af80df 80dfb2df0064f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01df df80af80afb5af016464f6af0700d69dd69d569d000700d69dd69d569d56 f6af01dfdf80af80afb5af016464f6af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01dfdf80af80afb5af016464f6af0700d69dd69d569d0007 00d69dd69d569d56f6af01dfdf80af80afb5af016464f6af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af01dfdf80af80afb5af016464f6af0700 d69dd69d569d000700d69dd69d569d56f6af01dfdf80af80afb5af016464 f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf80af80afb5 af016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdf80 af80afb5af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af 01dfdf80af80afb5af016464f6af0700d69dd69d569d000700d69dd69d56 9d56f6af01dfdfd8af80dfc6df97af016464f6af0700d6d69d9d9d560007 00d6d69d9d9d5656f6af01dfdfd8af80dfc7df006497af016464f6af0700 d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af01dfdf80afcaaf 01646497af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af 01dfdfd8af01dfdf80afcaaf01646497af016464f6af0700d69dd69d569d 000700d69dd69d569d56f6af01dfdfd8af01dfdf80afcaaf01646497af01 6464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd8af01 dfdf80afcaaf01646497af016464f6af0700d69dd69d569d000700d69dd6 9d569d56f6af01dfdfd8af01dfdfd1affd00c9af0000b4af01646497af01 6464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd8af01 dfdfd3af060000afafaf0000cbaf0000b4af01646497af016464f6af0700 d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af01dfdfd3af0000 fbaf0000cbaf0000caaff2dff8af01646497af016464f6af0700d6d69d9d 9d56000700d6d69d9d9d5656f6af01dfdfd8af01dfdfd4af0000f6affc00 fdaf1200af0000afaf0000afafaf00af0000afaf0000fcaffc00fdaf0400 af000000fcaffd0007af00afafaf000000d0aff3df0064f8af01646497af 016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af 01dfdfd4af0000f7af3a0000afaf0000afaf0000afaf0000afaf00afaf00 00afaf0000afaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf00afafaf00d1af01dfdff6af016464f8af01646497af016464f6 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd8af01dfdfd4 af0000f7af0000fcaf1600afaf00afafaf00afafaf00afaf00afafaf00af afaf00f9af0300afaf00fcaf0300afaf00fcaf0400afaf0000ceaf01dfdf f6af016464f8af01646497af016464f6af0700d69dd69d569d000700d69d d69d569d56f6af01dfdfd8af01dfdfd4af0000f7af0000fcaf1900afaf00 afafaf00afafaf00afaf00afafaf00afafaf00afafaffb0002afaf00fcaf 0300afaf00fcaf0600afafaf000000d0af01dfdff6af016464f8af016464 97af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf d8af01dfdfd4af0000f7af0000fcaf2100afaf00afafaf00afafaf00afaf 00afafaf00afafaf00afaf0000afafaf00afaf00fcaf0300afaf00fcaf00 00fbaf010000d1af01dfdff6af016464f8af01646497af016464f6af0700 d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af01dfdfd3af0000 fbaf0300afaf00fcaf1900afaf00afafaf00afafaf00afaf00afafaf00af afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000faaf0000d1af 01dfdff464f8af01646497af016464f6af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af01dfdfd8af01dfdfd3af2f0000afafaf0000afaf0000af af0000afaf00afafaf00afafaf00afaf00afafaf00afafaf00afaf0000af af0000afaf00fcaf0f00afaf0000afaf0000afaf00afafaf00d1af00dff3 64f8af01646497af016464f6af0700d69dd69d569d000700d69dd69d569d 56f6af01dfdfd8af01dfdfd1affd00fbaffc00fdaf1e00afafaf00afafaf 00afaf00afafaf00afafaf00afafaf000000af0000af00fcaf0e00afafaf 000000af00afafaf000000baaf01646497af016464f6af0700d6d69d9d9d 56000700d6d69d9d9d5656f6af01dfdfd8af01dfdf80afcaaf01646497af 016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af 01dfdf80afcaaf01646497af016464f6af0700d6d69d9d9d56000700d6d6 9d9d9d5656f6af01dfdfd8af01dfdf80afcaaf01646497af016464f6af07 00d69dd69d569d000700d69dd69d569d56f6af01dfdfd8af01dfdf80afca af01646497af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6 af01dfdfd8af01dfdf80afcaaf01646497af016464f6af0700d69dd69d56 9d000700d69dd69d569d56f6af01dfdfd8af01dfdf8064c86497af016464 f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd8af00df80 64c76497af016464f6af0700d69dd69d569d000700d69dd69d569d56f6af 01dfdf80af80afb5af016464f6af0700d6d69d9d9d56000700d6d69d9d9d 5656f6af01dfdf80af80afb5af016464f6af0700d69dd69d569d000700d6 9dd69d569d56f6af01dfdf80af80afb5af016464f6af0700d6d69d9d9d56 000700d6d69d9d9d5656f6af01dfdf80af80afb5af016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdf80af80afb5af016464f6af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf80af80afb5af01 6464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdf80af80 afb5af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01df df80af80afb5af016464f6af0700d69dd69d569d000700d69dd69d569d56 f6af01dfdfa8af8064c164ccaf016464f6af0700d6d69d9d9d56000700d6 d69d9d9d5656f6af01dfdfa8af8064c26400dfccaf016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdfa8af01646480afc5af01df dfccaf016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01df dfa8af01646480afc5af01dfdfccaf016464f6af0700d69dd69d569d0007 00d69dd69d569d56f6af01dfdfa8af01646480afc5af01dfdfccaf016464 f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfa8af016464 80afc5af01dfdfccaf016464f6af0700d69dd69d569d000700d69dd69d56 9d56f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6af0700d6d6 9d9d9d56000700d6d69d9d9d5656f6af01dfdfa8af01646480afc5af01df dfccaf016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01df dfa8af01646480afc5af01dfdfccaf016464f6af0700d6d69d9d9d560007 00d6d69d9d9d5656f6af01dfdfd7aff900d8af016464fbaf0000fbaf0000 fbaf0000f2af0000f9af000080afeeaf01dfdfccaf016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdfd7af0000d2af016464fbaf 0000fbaf0000fbaf0000f2af0000f9af000080afeeaf01dfdfccaf016464 f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd7af0000d2 af016464fbaf0000fcaf0200af00fcaf0000f2af0000f9af000080afeeaf 01dfdfccaf016464f6af0700d69dd69d569d000700d69dd69d569d56f6af 01dfdfd7af0000f8affc00fdaf0500af0000af00e7af016464faaf0d00af afaf00af00afafaf00afafaffc00fdaf0d00af0000af00afafaf000000af 0080afeeaf01dfdfccaf016464f6af0700d6d69d9d9d56000700d6d69d9d 9d5656f6af01dfdfd7af0000f9af0d0000afaf0000afaf0000afafaf00e7 af016464faaf2200afafaf00af00afafaf00afaf0000afaf0000afaf0000 afafaf00afaf0000afaf000080afeeaf01dfdfccaf016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdfd7affa0002afaf00fcaf03 00afaf00e2af016464faaf0d00afafaf00af00afafaf00afaf00fcaf0300 afaf00fcaf0300afaf00fcaf000080afeeaf01dfdfccaf016464f6af0700 d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd7af0000f9af0000fc af0300afaf00e2af016464f9af0c00af00afafaf00af00afafaf00fcaf03 00afaf00fcaf0300afaf00fcaf000080afeeaf01dfdfccaf016464f6af07 00d69dd69d569d000700d69dd69d569d56f6af01dfdfd7af0000f9af0000 fcaf0300afaf00e2af016464f9af0c00af00afafaf00af00afafaf00fcaf 0300afaf00fcaf0300afaf00fcaf000080afeeaf01dfdfccaf016464f6af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd7af0000f9af00 00fcaf0300afaf00e2af016464f9af0c00af00afafaf00af00afafaf00fc af0300afaf00fcaf0300afaf00fcaf000080afeeaf01dfdfccaf016464f6 af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfd7af0000f9af 080000afaf0000afaf00fcaf0000e7af016464f8af0000fbaf0000fcaf08 0000afaf0000afaf00fcaf0800afaf0000afaf000080afeeaf01dfdfccaf 016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfd7af 0000f8affc00fdaf0000fcaf0000e7af016464f8af0000fbaf0000fbaffc 00fdaf0000fcaf0800afafaf000000af0080afeeaf01dfdfccaf016464f6 af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfa8af01646480 afc5af01dfdfccaf016464f6af0700d6d69d9d9d56000700d6d69d9d9d56 56f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6af0700d69dd6 9d569d000700d69dd69d569d56f6af01dfdfa8af01646480afc5af01dfdf ccaf016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf a8af01646480afc5af01dfdfccaf016464f6af0700d69dd69d569d000700 d69dd69d569d56f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6 af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdfa8af01646480 afc5af01dfdfccaf016464f6af0700d69dd69d569d000700d69dd69d569d 56f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6af0700d6d69d 9d9d56000700d6d69d9d9d5656f6af01dfdfa8af01646480afc5af01dfdf ccaf016464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdf a8af01646480afc5af01dfdfccaf016464f6af0700d6d69d9d9d56000700 d6d69d9d9d5656f6af01dfdfa8af01646480afc5af01dfdfccaf016464f6 af0700d69dd69d569d000700d69dd69d569d56f6af01dfdfa8af01646480 dfc3dfccaf016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af 01dfdfa8af006480dfc2dfccaf016464f6af0700d69dd69d569d000700d6 9dd69d569d56f6af01dfdf80af80afb5af016464f6af0700d6d69d9d9d56 000700d6d69d9d9d5656f6af01dfdf80af80afb5af016464f6af0700d69d d69d569d000700d69dd69d569d56f6af01dfdf80af80afb5af016464f6af 0700d6d69d9d9d56000700d6d69d9d9d5656f6af01dfdf80af80afb5af01 6464f6af0700d69dd69d569d000700d69dd69d569d56f6af01dfdf80af80 afb5af016464f6af0700d6d69d9d9d56000700d6d69d9d9d5656f6af01df df80af80afb5af016464f6af0700d69dd69d569d000700d69dd69d569d56 f6af01dfdf80af80afb5af016464f6af0700d6d69d9d9d56000700d6d69d 9d9d5656f6af01dfdf80af80afb5af016464f6af0700d69dd69d569d0007 00d69dd69d569d56f6af01dfdf80648064b364f6af0700d6d69d9d9d5600 0700d6d69d9d9d5656f6af00df80648064b264f6af0700d69dd69d569d00 0700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d 9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80 af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d6 9dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d5600 0700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d 569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80 af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6 d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d00 0700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d 9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80 af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d6 9dd69d569d000700d69dd69d569d56f1affd00f4af0000ebaf000080af80 afd2af0700d6d69d9d9d56000700d6d69d9d9d5656f3af060000afafaf00 00f6af0000efaf0400afafaf0080af80afd2af0700d69dd69d569d000700 d69dd69d569d56f3af0000fbaf0000f6af0000efaf000080af80afceaf07 00d6d69d9d9d56000700d6d69d9d9d5656f3af0000f7affc00fdaf0300af afaffc00fcaffc0009af000000afaf00afafaffc00fdaf0400af00000080 af80afe1af0700d69dd69d569d000700d69dd69d569d56f2af010000faaf 2e0000afaf0000afaf00afaf0000afaf0000afaf0000afaf0000af00afaf af00afaf0000afaf0000afaf0000afaf000080af80afe2af0700d6d69d9d 9d56000700d6d69d9d9d5656f0af010000fcaf0000fcaf0600afaf00afaf 00fcaf0300afaf00faaf0700afafaf00afaf00fcaf0300afaf00fcaf0000 80af80afe2af0700d69dd69d569d000700d69dd69d569d56eeaf030000af affa0004afaf00afaffa0002afaf00faaf0700afafaf00afaf00fcaf0300 afaf00fcaf000080af80afe2af0700d6d69d9d9d56000700d6d69d9d9d56 56edaf0300afaf00f9af0300afaf00f9af0000faaf0700afafaf00afaf00 fcaf0300afaf00fcaf000080af80afe2af0700d69dd69d569d000700d69d d69d569d56f3af0000fbaf0300afaf00f9af0300afaf00f9af0000fcaf09 00af00afafaf00afaf00fcaf0300afaf00fcaf000080af80afe2af0700d6 d69d9d9d56000700d6d69d9d9d5656f3af320000afafaf0000afaf0000af af0000afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00afaf 0000afaf0000afaf00fcaf000080af80afe2af0700d69dd69d569d000700 d69dd69d569d56f1affd00fbaffc00fdaf0300afafaffc00fcaffc00fdaf 060000af00afafaffc00fdaf0000fcaf000080af80afe2af0700d6d69d9d 9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d6 9dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d5656 80af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf 0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d 569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6 d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d56 f4af80648064b564f4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af 80648064b66400dff4af0700d69dd69d569d000700d69dd69d569d56f4af 01646480af80afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d 5656f4af01646480af80afb9af01dfdff4af0700d69dd69d569d000700d6 9dd69d569d56f4af01646480af80afb9af01dfdff4af0700d6d69d9d9d56 000700d6d69d9d9d5656f4af01646480af80afb9af01dfdff4af0700d69d d69d569d000700d69dd69d569d56f4af01646480af80afb9af01dfdff4af 0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480af80afb9af01 dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af01646480af80 afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af0164 64f8af0000e7af0000fcaf0000d8af0000faaf0000e8af0000c0af000080 afebaf01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af0164 64f8af0000e7af0000fcaf0000d8af0000faaf0000f6af0000f3af0000c0 af000080afebaf01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656 f4af016464f9af0000e6af0400afafaf00d8af0000f9af0000f6af0000f4 af0000c0af000080afeaaf01dfdff4af0700d69dd69d569d000700d69dd6 9d569d56f4af016464f9af0300afaf00fcaf1e00afaf000000afafaf00af 0000afaf000000af00afafaf00afaf00af000000fcaffd0009af00afaf00 af0000afaffc00fdaf0400af000000fcaf0b00afafaf000000af00afafaf fc0007afaf000000afafaffc00fcaf0b00afafaf000000af00afafaffc00 fcaffc00fdaf0f00af0000afaf0000afafaf00af000000fcaffc000eafaf 00afafaf00afafaf00afafaf0080afeaaf01dfdff4af0700d6d69d9d9d56 000700d6d69d9d9d5656f4af016464f9af0300afaf00fcaf7f00af00afaf af00afaf0000afafaf0000afaf0000afafaf00afaf0000afaf0000afaf00 00afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afafaf00 afaf0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000afaf af00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000 afaf002100afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00 afafaf00afafaf0080afeaaf01dfdff4af0700d69dd69d569d000700d69d d69d569d56f4af016464faaf0400afafaf00fcaf0300af0000fbaf0000fc af0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f7af 0300afaf00fcaf0700afaf00afafaf00fcaf0000f9af0300afaf00f8af07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf0e00afaf00af afaf00afafaf00afaf00fcaf0300afaf00fcaf0d00af00afafaf00afafaf 00afaf0080afe9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d56 56f4af016464faaf0400afafaf00fcaf0900afaf000000afafaf00fcaf00 00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fbaffb00 02afaf00fcaf0700afaf00afafaf00fcaf0300afafaffb0002afaf00fcaf fb0006afaf00afafaf00fcaf0200afaffa0002afaf00fcaf0e00afaf00af afaf00afafaf00afaf00fcaf0200afaffa000cafaf00afaf00afaf00afaf af0080afe9af01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4 af016464faaf0400afafaf00fcaf0000fcaf040000afaf00fcaf0000fcaf 0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf080000afaf af00afaf00fcaf0700afaf00afafaf00fcaf1b00afaf0000afafaf00afaf 00afafaf0000afafaf00afaf00afafaf00fcaf0300afaf00f9af0000fcaf 0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0a00afaf00 afaf00afafaf0080afe9af01dfdff4af0700d6d69d9d9d56000700d6d69d 9d9d5656f4af016464fbaf0000fcaf0000fcaf0000fbaf0300afaf00fcaf 0000fcaf0200af00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000 fcaf0300afaf00fcaf0200af00fcaf0000fcaf0300afaf00fcaf0700afaf 00afafaf00fcaf0200af00fcaf0000fcaf0300afaf00f9af0000fcaf0e00 afaf00afafaf00afafaf00afaf00fcaf0300afaf00f9af0900af00af00af 00afaf0080afe8af01dfdff4af0700d69dd69d569d000700d69dd69d569d 56f4af016464fbaf0000fcaf0e0000afaf0000af00afafaf00afaf00fcaf 070000afaf0000af00fcaf0000fcaf0b00afaf0000afaf0000afaf00fcaf 0f0000afaf0000afaf0000afaf0000af00fcaf1b0000afaf0000afaf0000 afaf0000afaf00afafaf0000afaf0000af00fcaf230000afaf0000afaf00 00afaf0000afaf0000afaf0000afaf00afafaf00afafaf00afaf00fcaf14 00afaf0000afaf0000afafaf00afafaf00afafaf0080afe8af01dfdff4af 0700d6d69d9d9d56000700d6d69d9d9d5656f4af016464fbaf0000fbaffd 000aaf00afaf000000afafaf00fbaffd0003af00af00fcaf0000fcaf0b00 afafaf000000af00afaf00fbaffd000baf0000af00af000000afaf00fbaf fd0017af00afafaf000000af0000afaf0000afaf000000af000000fbaffd 0004af00afafaffc00fcaffc00fdaf0b00afafaf00afafaf00afaf00fcaf 0300afafaffc00fcaf0800afafaf00afafaf0080afe8af01dfdff4af0700 d69dd69d569d000700d69dd69d569d56f4af016464caaf0000f1af0000d0 af0000c5af000080afedaf01dfdff4af0700d6d69d9d9d56000700d6d69d 9d9d5656f4af016464cfaf050000afaf0000f1af0000d5af050000afaf00 00c6affd0080afeeaf01dfdff4af0700d69dd69d569d000700d69dd69d56 9d56f4af016464ceaffc00f0af0000d4affc00c6af040000af000080afef af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480 afd0af060000afafaf000080aff0af01dfdff4af0700d69dd69d569d0007 00d69dd69d569d56f4af01646480afd1af010000fbaf01000080aff1af01 dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656f4af01646480af80 afb9af01dfdff4af0700d69dd69d569d000700d69dd69d569d56f4af0164 6480af80afb9af01dfdff4af0700d6d69d9d9d56000700d6d69d9d9d5656 f4af01646480af80afb9af01dfdff4af0700d69dd69d569d000700d69dd6 9d569d56f4af01646480df80dfb7dff4af0700d6d69d9d9d56000700d6d6 9d9d9d5656f4af006480df80dfb6dff4af0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf07 00d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d56 9d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d56806480649d6407 00d6d69d9d9d56000700d6d69d9d9d565680df80df9ddf0700d69dd69d56 9d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9daf07 00d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d56 9d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d6 9d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d5680 af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf07 00d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d 56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69d d69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680 af80af9daf0700d69dd69d569d000700d69dd69d569d56eeafd5dfa1afd5 dfa1afd5dfeeaf0700d6d69d9d9d56000700d6d69d9d9d5656eeafd6df00 64a1afd6df0064a1afd6df0064eeaf0700d69dd69d569d000700d69dd69d 569d56eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdfd9af 016464eeaf0700d6d69d9d9d56000700d6d69d9d9d5656eeaf01dfdfd9af 016464a1af01dfdfd9af016464a1af01dfdfd9af016464eeaf0700d69dd6 9d569d000700d69dd69d569d56eeaf01dfdfd9af016464a1af01dfdfd9af 016464a1af01dfdfd9af016464eeaf0700d6d69d9d9d56000700d6d69d9d 9d5656eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdfd9af 016464eeaf0700d69dd69d569d000700d69dd69d569d56eeaf01dfdfd9af 016464a1af01dfdfd9af016464a1af01dfdfd9af016464eeaf0700d6d69d 9d9d56000700d6d69d9d9d5656eeaf01dfdfd9af016464a1af01dfdfd9af 016464a1af01dfdfd9af016464eeaf0700d69dd69d569d000700d69dd69d 569d56eeaf01dfdff3affd00fbaf0000fbaf0000f5af016464a1af01dfdf fbaff90004af00afaf00eaaf016464a1af01dfdffaaf0000faaf0300afaf 00f9af0000f2af016464eeaf0700d6d69d9d9d56000700d6d69d9d9d5656 eeaf01dfdff5af0a0000afafaf0000afafaf00fcaf0000f4af016464a1af 01dfdffbaf0000f9af0600afaf00afaf00edaf016464a1af01dfdffaaf00 00faaf0300afaf00f9af0000f2af016464eeaf0700d69dd69d569d000700 d69dd69d569d56eeaf01dfdff5af0000fbaf0800afafaf00afafaf00f3af 016464a1af01dfdffbaf0000f6af0300afaf00edaf016464a1af01dfdffa af0000faaf0000f6af0000f2af016464eeaf0700d6d69d9d9d56000700d6 d69d9d9d5656eeaf01dfdff6af0000f9af0600afaf00afaf00f2af016464 a1af01dfdffbaf0000f9af0a00afaf00af000000afafaffc00fdaf0300af 0000fcaf016464a1af01dfdffaaf0000faaf0e00afaf00afafaf000000af 00afafaffc00f9af016464eeaf0700d69dd69d569d000700d69dd69d569d 56eeaf01dfdff6af0000f9af0500afaf00af00f1af016464a1af01dfdffb af0000f9af1300afaf00afaf00afafaf0000afaf0000afaf0000faaf0164 64a1af01dfdffaaf0000faaf1300afaf00afaf0000afaf0000afaf0000af af0000faaf016464eeaf0700d6d69d9d9d56000700d6d69d9d9d5656eeaf 01dfdff6af0000f9af0500afaf000000f1af016464a1af01dfdffbaffa00 0cafaf00afaf00afaf00afafaf00fcaf0300afaf00f9af016464a1af01df dffaaff80005afaf00afaf00fcaf0300afaf00fcaf0000faaf016464eeaf 0700d69dd69d569d000700d69dd69d569d56eeaf01dfdff6af0000f9af06 00afaf00afaf00f2af016464a1af01dfdffbaf0000f9af0900afaf00afaf 00afafaffa0002afaf00f9af016464a1af01dfdffaaf0000faaf0600afaf 00afaf00fcaf0200afaffa00faaf016464eeaf0700d6d69d9d9d56000700 d6d69d9d9d5656eeaf01dfdff6af0000f9af0700afaf00afafaf00f3af01 6464a1af01dfdffbaf0000f9af0a00afaf00afaf00afafaf00f9af0000f9 af016464a1af01dfdffaaf0000faaf0600afaf00afaf00fcaf0300afaf00 f5af016464eeaf0700d69dd69d569d000700d69dd69d569d56eeaf01dfdf f5af0000fbaf0400afafaf00fcaf0000f4af016464a1af01dfdffbaf0000 f9af0a00afaf00afaf00afafaf00f9af0000f9af016464a1af01dfdffaaf 0000faaf0600afaf00afaf00fcaf0300afaf00f5af016464eeaf0700d6d6 9d9d9d56000700d6d69d9d9d5656eeaf01dfdff5af0a0000afafaf0000af afaf00fbaf0000f5af016464a1af01dfdffbaf0000f9af1200afaf00afaf 00afafaf0000afaf0000afaf00f9af016464a1af01dfdffaaf0000faaf13 00afaf00afaf0000afaf0000afaf0000afaf0000faaf016464eeaf0700d6 9dd69d569d000700d69dd69d569d56eeaf01dfdff3affd00fbaf0000faaf 0000f6af016464a1af01dfdffbaf0000f9af0a00afaf00afafaf0000afaf fc00fdaf0000f9af016464a1af01dfdffaaf0000faaf0e00afaf00afafaf 000000af00afafaffc00f9af016464eeaf0700d6d69d9d9d56000700d6d6 9d9d9d5656eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdf d9af016464eeaf0700d69dd69d569d000700569d569d569d56eeaf01dfdf d9af016464a1af01dfdfd9af016464a1af01dfdfd9af016464eeaf0700d6 d69d569d56000000fc56029d5656eeaf01dfdfd9af016464a1af01dfdfd9 af016464a1af01dfdfd9af016464eeaf0200d69dfc56ff000000fcd60256 9d56eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdfd9af01 6464eeaf0000fad6ff000700d6d6d69d9d5656eeaf01dfdfd9af016464a1 af01dfdfd9af016464a1af01dfdfd9af016464eeaf0200d69dfcd6ff0007 00d69dd69d569d56eeaf01dfdfd9af016464a1af01dfdfd9af016464a1af 01dfdfd9af016464eeaf0700d6d69d9d9d56000700d6d69d9d9d5656eeaf 01dfdfd9af016464a1af01dfdfd9af016464a1af01dfdfd9af016464eeaf 0700d69dd69d569d000700d69dd69d569d56eeaf01dfdfd764a1af01dfdf d764a1af01dfdfd764eeaf0700d6d69d9d9d56000700d6d69d9d9d5656ee af00dfd664a1af00dfd664a1af00dfd664eeaf0700d69dd69d569d000700 d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d56 5680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9d af0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd6 9d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700 d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d 5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9d af0700d69dd69d569d000700d69dd69d569d5680af80af9daf0700d6d69d 9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd69d569d000700 d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d56 5680af80af9daf0700d69dd69d569d000700d69dd69d569d5680af80af9d af0700d6d69d9d9d56000700d6d69d9d9d565680af80af9daf0700d69dd6 9d569d000700d69dd69d569d5680af80af9daf0700d6d69d9d9d56000700 d6d69d9d9d565680af80af9daf0700d69dd69d569d000700d69dd69d569d 5680af80af9daf0700d6d69d9d9d56000700d6d69d9d9d565680af80af9d af0700d69dd69d569d000700d69dd69d569d56800080009c0006d6d69d9d 9d56000600d6d69d9d9d5680d680d69ad6059dd69d569d007f00d69dd69d 569dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd6729dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69d9d9d56000200d6d6e49d0156d6809d809dcf9d0156d6e49d0256 9d000300d69dd6e59d0256d6d6809d809dd19d035656d6d6e49d0156007f 00d6d69d569d569d569d569d569d569d569d569d569d569d569d569d569d 5656d6d6569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d7f569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d72569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d56d6d69d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d000100d6e25601d6d680568056cf5601d6d6 e356ff00800080008d00 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/save.pdf0000644000175000001440000002106310616356710013421 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hna g6232Õ3SÐ5Ð3¶´01¶PÐ5Ò3·4³4…h°PpÉç Bž¼uendstream endobj 6 0 obj 72 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 6057>>stream xœí;’Ü8E1˜=ŒÛVËì(BcÑ鈱kå”SÆìa´9´Zµ™’Õë™äÀÃÿCðdÞ›Re&Á$ožAüøqëâïXò7¦@n£·Ç#¦/‹ç?þ>>– DÒñpL#©B,ž¯/BZ6ЃÛkÁ4fÙÇ·•óØo°¼PqË>>ïœ|ƃ㱚.9ïÌs<„XðVœ¿0ýðžZÞŠóoÑ"#ÔB¿íx+ÎCEFñG©3/çþ“-Ê-! ¯ÎK6­ë—až ¿.Ë¿åq¾o€êe߯“ËãŒLY¿ŒjÑú¦žó—ÅäÜðüáW=ç›Ûð¼ó5s©åüEç+K&ó•| Ûû§çÚÙÍæ¯Êóõ<…Zqn_Œ~õ~›ê_eþþtù¼vÆürþb:öòÕÿmn¦ïå—õ_ˆgÊ[ˆ3/æ¼sËóåÛñåZ/†×$‹y&Î ÏK9··ûÕâüEeå:+yy¶œ|å|ùS˹ãºÍ9-¤è"‹´ÿ¹|'Îzór‹Îµ«éyóÉJŠœåsHб|mçÎÙ•äÜ\Î[(Á¹å:8o çžå.ç?ü.ÞÞºwQôræñeø—kο.ý.>¾=.9½úX %hÎÿ\WCÿý½vÙý¶õ…þñ!þÓ9ž'Ðô÷ÒuEü¶z¾ä?ðütMK¢Ýó%cççk²Ê-àü|MVùœŸ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pί8çÓö4O³xüƒÚ(ι4zó¶·Q‚󙾄çmTÀù#£™·ìfyz¼ÅWP§<ÎuÞ²8-ÿCuJp¾þ©ç‹ÕÈg©œóEðüˆJË-d T©bÎáùas.Ï¡ð¼Z%œï†ïeÅÁÞD¨oáêùÎùÎùÎùÎùÎùåü¯naÝNÿ&¯£œÃóVzýEÞ$8ÿ·ýa¨F¿ Óó(çð¼‰lÏÁùùçüçüçüçüªâ<ÜD!;äi_1¸þá¦iÈö”*ÎÏóÜühÏ·ÇÁÍ4V ç‘c(ËÓ‚m|¶ æb¸þN5œËNDÓ¼ÑÖunÚºìÒ®ur™ZA®-äïA}hM3:äyÒ­Îz“¹9!»Úÿ7â|÷\˜ }äû¿ggÅŒ Yë[‹,Ïo’Ÿ“£Ùû)êcóõ©3úÖY W花 ‘47ÉNPœ^è®iÏמvÏ4ýšìÇûY3›žÞ”êçBè.EIÏU~á[‘¤¯­JŠsõòJž§97 ÆaËßv0K°3`žáM™žïçÍQ-¯à\ÓMŠ)æ"_ýCpOv±s¨?®gç-úç24浜«B é:·-2òµ¾Y×Ñý§IYpÖ¦ Yþ —ÏÍ"æ•öb/†5¯RçÖ+zǽ”XxË3's.ïÆ² }¸ºPÎ/ÔŸó œó œó œó«ˆóWîèîª|Îay+es"ô?ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8çWÆüç²_hÞö˜»¦\q†öŒù'î è,f÷Üè} å̯9˜îÇIèK®²æ•êɰ¬íÙÝêQ{º 眻®VÖ<¢“:å?¥ÅÑ;ÙkÁ¹ëjq.—èÌ“Œ’pŸ9PsDZíºZ%œË,…Ìîõ|_¥CÞºëjUqn¤ø9ß×:ýÈ-Ï9w]­Ür‹×s=63à9{~ιëj”ÏÕ›Ð9ÔZ…sh@ס“be ­ÒÅGwhÊŠ^¡¾…_¨Wä8ç8ç8çW„ó!f(^×üå.Ú4D„>E£Žq>­ó)ÿå.Ú4B„>Å£ŽsÞ}×6öé/ñiyóåûúWPÏ»GèS"ê8ç݈FÿE¼oO—òÜõ…8¿“çqÎ'f#úGÔòÙŒp<%¢NrÏË•ö¼!çsÓoÈð| Z½ ꆊ\=EL"ê¶œwòÜlFq^Û:½¢7íy;ÎÛZnx¾Ç¬_éöÜuN¹EM~6{æ'›åôeSoÏi¿}Ê5Ú7Dдs«×Óž§87Û…œøX<ïré«??Ÿes‰9ƒ ͻّQçäç³Aó¼w&ڟ픆¢ž«à=žoÇaÌŽiùª›uÝ´”ˆ:'?x¾}|_tæVYQ*PV$msÆÌ»v7WNÏQä\½<ÙscN“$ç‚ö!3p²sîúçºòúhn¹ßówO~îñ’æ3xþ^˜ŸÏ"·ÐIW%æ-7<ÿ%cJxnŸ'}SÕóyî:§^ÑôUY«:\ôöœ–\R¬ÌÏ­þÂx~…ú–¸ç£é(çð¼\àœ_ ò󎺫çWh'º›ç༵À9¿À9¿X9o~¥‘íyxÏ꺟Ž{¡­¢y]:+çÃzn]zÚ/ÇÍÉyû êFžGŒíãyº^QˆìI6V‘çÖ¨:©VÔ5.ò0Æäܺ–oמnÜ¥n&:ùc@Î…Qå<é ÷g;¥­Š<Ÿ­gÙ *fÏ*:›Ρév¿çkô=Šç{`ž¼ÅŒÙøcÔ9b@ÏI¡Äh½°cîèy-ç*þo$™ã¹“§ÐÂ7ÍDò<ÅyÑ${_äyè*T\ô:0ç“°|uN>½=÷•ͲâzœVë\ßs(ê[Z õŠüçü:Ú_±¯.îyežº¶çµýûꮞƒóÖçübå\]o(ûšH¨-‚ö6×½Ïu,ª®ë´á-¬œËãdö\íÕ¨ÞÒVc­õÎ'ç²jƒ›s³~\î›Ô¤L£yžWß’Ý6'k!…˜‡ñ|¯üTË»{žU¯˜Ý6'kÂèÏùxô9y‹Qƒo`0žçGê϶¹ÆU¤çÐÙ|åzNÂ,­^õü<àù÷4[+ð{îrN+Í·W¦çWæ\ÛómáÌï¹á¥* šµç3=†ótçÊs§m® ç¦ç&çêFñ<«‹/oñµÍÉ#æ?‡Z¿½ýyRås]ZÀó¼~\Žçþ¶¹ýP{•·ÅäÁ¼5ÏE÷¸m.Ô·ð뮞ƒóÖçüçüçüçüçüêÐNÔb¥]wm›ã7×ÞóÝÝ µÍ]~Üœ§ŽKWµ¨:®¡±ÈZA´¹Òö\8˜çì¶9zrm'†öPÚ6G ²¾²­ó=79WG`{~Žõoñå-¾¶9Z¼™=÷zÏ¡'yNy Gàðr’Zõãr<´Í©ahÆ[+?7·ô|[<~Ûê[Z õŠüçüçüçüçüçüçübn'ʹ³։]¶ñüü+OSÌí¡ã{Îà>ó¸¹:σjæyÞî‰yÜÜž*«ó¬•Å^_=©Vz]‡ã/(Ïó=¡*ÕèÁs«Âvß—?oÃó¶ãæ¬Æ wåöž«–ògßÙêÍÑ·…FÍ4nŽxnc/DÒsÇü6 kŸòèLÏ/“Ÿ—Îi©~âúti5ƱžCouÏ›Ž›sþØeE²°¨¬¹Oî£Ü˜SV$†ë.-çª[}‹?³(Tb7Ô·šDKÏÑ_ÖóS8oT¾«çW¨?¿›çW¨?¿›ç༵À9¿À9¿l'*P–çÆ>ÝK+]Û¢®ÿOÖ€í¡*öÜs%6¢çW7w7Ï›Ž›#5'Þ ”¶ÑKÏ÷ö@Y“"ÍöM¡Ôzúé q›3šçW'åyNÛ±œÖ[šëµŠ¯*êÆÍÑŸ0˵?­·÷9QÏzû&ñUEÝ|Ü\wÏõ.' ÊóÖãæúzN-7jχò¼õ¸¹–ÇTì9Ù!‰g8Ï›ßo®×9”šHOöVóßçÐÖ÷›ëWVÂèÔ±5ÙÍÚóqÊŠOZßrN¶² õŠuõœ·8ç8ç8ç8ç8çW‡v¢†Ww5žG $vb¼ôRy­ÊßÚ²Ö×suu](æqs¢mÁ÷®žŸ1n®Õð´<ÏÍ Zå3ÓœaÚg0¢}¥­÷²qOÈ!vUÇÁ=nÎüŽª´mΣ>R{üAà¿ GÛ…s­?µÍµ:–´ûÛõåö©Å Üÿì¬Ù)?x¾¦…Úæ8󖣞ëñ¬9çÆQÒ¡Îƹ¬ž·7çC½jÚæynüéÇyqÛÜ@çPÃó¼s¨õñœ—·Í±çç±²"ÝX^YÑúx§ü¼£P߯»z~sΧý¹ÍC–À9¿žžóçüçüçübn'ªŠ1ÜÖ´Í¢´(r4ñF;æöКU#—{-=/"üÄê¨ãæžÛóÆãæ‚©jjjÉI­ªžiØ67ÑuBýµuÔBOÈIVÊk´ã7N•;ÔUe¤öç¹ms³S·h¯cŽpWʬpä7H¥Ç%DSÏgåi²þ\ º¶ÜX…Ä%ŒA0™ëüãæ©zf=i–ç¯tá¡v"–ïDÊs½R¡ç¨O¹ßœ7•½0~%ž¿Gï •ôœŒ¥ÂÝk˜sAŠ=7£>å~s¾TûØ ó–ý·©_‘­< ê¹›õYq¹™J½ç¨O7çOµ]RGN´Õžg¶Íé=¦Î¡¾'{»‡nΛJö¨§–ÜZÇr<ßNBê…áyfÛœÌÏåm’ÃeE×ÙnŽçþ¨/Sßó|4¥=¿H½â#jù¬’ˆÐ§DÔlœ×5‘5ðE£Žq¤çÐIçüçüŠ–[P´08D„>Å‹°Ñòy½þХޡOñ¨ãœ«½/â{Å®¿T|FˆïdgÆ¥„«ÃZª xUAÔqÎ?©PÞ?>SÕ!¼Z>ö]n!ÏóÚ-Õ{^uçËÆÞEçñ}û´¶©,úž±…ÃZª X’u’óeS¿Ì~Ùªöü—ø]¬ñçx~$BKÇ<Ï:Áùv<‚ßs±ÅŸöüX„–ŽzžuœóWYMÐÁóµTòšòü`„–Ž{žu‚óŸb+kvð|)~Js~,BKÇ=ω:™ŸoÇÄîù{^~~$BKG=Ï‹:£Üòs}Ãêù»Üa^¹¥>BKÇ<Ï:«|þSÔzþž^Éѧ/ïB—»óÊçµZª xUAԙס?ë<¯:‚Gôäê2÷:´.BKu¯*ˆ:Yné­t¹eDÕs>ÂÅ=!BŸª9‡NÚ‰øÎùÎùÎùÎùÎùÎùÎùÎùáü÷ŽaÝPº> Â9äŠ ‰rÏ›Éôœsœó œó œó œó œó œó«9ç×½be£ª9ç—õüm¾€8¿f.Ä8Gà œÃó‚]sþ]sþ]õá<6«râ“­&ÍZôDœo“]Ö¹~Ïù9Ÿô„¿ÅªôÜ,ÍÊhŸ‡s:­ðMi/'T%©öMùJ7˜çË- Ïí·ÏŠ.ç“0óñês¨1 ±»ç=¯C­9ÜÝü|Ö·®9TVôë‰8FOÅù çüçüçüº6çõBôÕ…9¿ªåæJ ý¸øÎùÎùÎùÎùÎùÎùÕóQš ©îœ_ÛóÄÝ*ü€ó!ïÍ—§:[àüÉ=çeçüçüçüçü…óýní¹=}öhß«cé–;šFá¼Ðš§÷¼ çõžOºoœgƒ7õ¼)çt°JØ/ÀÖ1‘v7§Ÿ•ÝÓhœÓζF½žÛŸÕãŠÆÒ0œ¯­®âéLÏ#ÝÍGÒpœ—y® W]ÊŸÄó–ù9< œÑpœ[ÃQ’Âyh(Ëhs:X¥Ôsç³7.+¢¾¥L£p~ €Ë œó œó œó œó œó œó œó œó벜z#ç,]“óK[~MΟPÝ9Bs~s~s~s~s~s~es~Ù©pFTç°¼¥²8‡NR„sè$s~s~s~s~s~s~s~s~s~s~s~s~¥8·îäS5àH«‘çܹ£­ënÍ]±ž\qιUüžCEJp® ¥w)ê¶µb»…­5È€i‡R"?—ùJøöµž™@F½<’’å–ýÖÌz¾5¦?0VFù|CwÑιz¹¦ÂóRå”ÏÉDæKùÏ‹”Yn yœe +³|ž…çIå^‡†ÊŠBù.rfê[zõŠüçüçüçüçüçüŠr~í{7 %:©D”sxÞJƽ»œ_xΑd‡KpÏ›ÈöœŸ/pÎ/pÎ/pÎ/pί*Îíe¤5–^¯1›Kª8?Ïsó£Oâyç‘#)ê¯hõp6}SË«8§ ûúfYêîkò¤ZIçýýìt¨£·LØÒö͉PºÑ)OÝ0j¢Iò[¸·j%çV× Ú!À×wÎí1Z1cCY=®äyçêh6ØÍŧ™&Û=ëÜ…FþOWŒmˆ¤¹IvÊ€ªàÜðÂêRõ|ígðÜHÓ¯É~¼Ÿ5³9¹ Ýø€:ƹVס(žbvjÃtšñÚú¡¤8W/¯äyšsÃ`a¶üm³;æÞt‘éùöÖò Î5ÝÂ잨øê‚{²‹Cýét=;oÑ?—¡1¯å\u~¾/2ª¬¨VX×ѽ§IYpÖ¦ 5>#XVt<7‹˜Wòü„úûØ‹½8bވƟ[¯èÛRbÃÑÁ1Cg:™sù{7–•¸àÛ@ɧç#ߨIºuý¹3 u ݹþ\^%fú­9Twæ|Ts~q~í›Ú ¤|Îay+es"ô?ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç—Ãù?{GtýÏæü¿½#º¿þ…üœ]ÈÏù…r ¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿28ÿ=k¿Ò«ÑM"Éà<ûï'?ºI$YœgBsú¯›D’Åù-ŽtœHÀ9$àœ?pÎ 8礜s5‡ùÞ~Sí‘lsü‰È¬glžïû·çl‹GRʹž …LDÙ~SIÏ9þlîyçšnwÒ1nÏ…ÈsQ*’BΣˆuáܘäXÎ-Û‰s{ʼ@$…œ›‡kÖ/o1&BfŒÄôÜ™’9ÉΩÊxÏ¡Î<¹ä‡Ççùþ^ÿì9TÛs>DÞ¢&·Ô³fvã\ÍoºEŠäP~ÞùjqNR:{ž(?+·ŒRV¼šç‡Êç}®‰ÂçоžgŸC]‡RÓûx.'9soÎóËŠ¨oáŽDsþççϨWäˆdáüáôƒó?ï>ƒs†Hœ<žÖ¼Eˆ7pÎÉô÷úôÛêùäç‘,ù¹ØÏ åô#½E$9œgoþô#½G$è—Ë/ôËå8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç—Ãù·Þ=,ÎßzÇó29ÿãÂyPo±TÈ£¸eŠóØ¢_ äèCÄ-Û9ÿø|<6ðNÅÃ÷x‹:ºrþýÚž·¤à”°ìÁ9Ä­ÿ†—jÇ endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000389 00000 n 0000008196 00000 n 0000000330 00000 n 0000000175 00000 n 0000000015 00000 n 0000000157 00000 n 0000000454 00000 n 0000000554 00000 n 0000000495 00000 n 0000000524 00000 n 0000006803 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<85987C22F59BF20458F4B98DFC5B8FE1><85987C22F59BF20458F4B98DFC5B8FE1>] >> startxref 8362 %%EOF geomview-1.9.4/doc/figs/save.png0000644000175000001440000001175510616356716013451 00000000000000‰PNG  IHDRs#òæËPLTE¯¯¯•••ÖÖÖdddVVVßßßZ[„õIDATxœí]Ko䪆èê¬a1šm+õ²½ŠZ³¾Ñ¨•íhe}[GQþþ1P`Œ ÌËÆîÃ%iúQþò¥ÀŃãâ?— ΗâçÛ´ü ´êއÇg¥ú©u+—Ž ¨þ»IkW‚ÿ>kÕ/ßFØ[ãñâyádT+î®Z˜ »qü=ªn½{OíºMæ<4ŽàèçߘêïúñixKk2ƒêòÁiIuòxz؆ ®êòÑé!¬úÀ»=uêaÕOÒ]§!âÐÈyòT—lO§A]üÞ†ìQªSyÍJäÛ|oÈØ@’9I"~ÕÙÉúC—9I‡þÒÆa$™Ó£º¸Ouõ¤øƒF÷"ú«Y}Uª+ê^ÕµÃ<€ê‚­ <(ßÊѵê$¬ºæ®U—m£$-ü¦yE†„U7о.Ý›@mucÍk×wÌv}誷€«ºnK¨ú£n§ºÁ¨ú³5Âñ³ÕÐ †ŸÖã7ë±RýáÏãïóûûqsœ­Ç¬ÇJõ¿ÞßO«™¬‚Ëû»¤~~çG{¾\õó¹5“d°Ë·‹laލ:´0GTÚõ®ú†èª·@W½ºê-ÐUoWu6t&§mIÅÁUÉoÊš’ŠÃLuùóÔqÕ å„pÆöì9˜êÒa_M¹-`¦:!TQß½ÛøU—Þáma×uv¯ð«ÎwOÝ«º¨¦M©-Á£:'²qlJm wÔ‡9ºê-ÐUo;Rýz¼(êŽê­YEᆫ¾í?= _oò×LõvŒ¢¡©wÕ·DW½îTõÉÅ#êÄKã¬^àR=‰:åö//Ø€\®ªO/AQVcÔMM9ˆ!f¬5 PI¥‡+Ñ!B¥Ã/ÆØi˧Å댈ïá ñs,säêSDþíÒÈ&ª„o9.À)3_"Ü–_Ì<¢NÙ<¯?Ô7ñuy1ÞHaøñÔà†úŸh.j,^—©õªþÕ…j¨NÃÌ©3éš*”À+†ÏX¯ªOXC˜Õ©ûTçœ`ÔÉDuc6£ê|¦:_ú\užÂ€:µ©S]&Î1–1ꢂÖîö«.µÍ…`!«™$¡ò ŽT5µÊê9M]VsO[JU]4tÒ×E“¨¨ËÆQ¾B)G²$LÑ NGM]4Ž«QOèÃPç·‹­†(S{ŽVz§.e$«N 3œ:«v£_Bﯷ@W½îPõϨ;ª¿¶¦\õáŽÆ×„®z tÕ[ «Þ]õ誷@W½îHu1àŒcåm­7!™ç8$¨/šMëüAm óÝ,XáªXA-#³KEBNѾ!ËEÍ0nò8Ìù”™´ªÔ‘Ù¥T'ÀÔèº÷JmÖy 9<_u,اº™¿>Ío¥æšl¯=“ߣ:5ó×Gê"Ç•í0Â\m‡ ¨Î]ÕÅS¹# UGàÑÆ¢NêÙ¾n ÕàiשSMé«)~7¥GÓøÇûéÃ]õ¸Õ˧ ¿ð/ð¨’A¯iGõrû7mÿµ:uÇ´«zéñë`ÿ×÷ïÿþYÇ ß´«zûO«QM¯£ú6Ô]ÕYÑöD`ÿS|¯C}4=Sý@Ô#Uü‹”ý§¿ŽÔ Áûl©  ]Ó±ªPWsÙ8wûú©èõ8Õis >˜–?V n™FZ1?šIh”¨¯"êjHdø ƒ$ª”ØùŸQŸ©Ñ‘™÷—NýõCÜò,_§œšy…ÊÃs".×4âë 4SߺBý:¡nOù•d)·KiÔ-Óˆ¯[Ô‡gD‘¥QîÖß'·$àÎâŸMÝ6½¤:É þª¦~¸ªÃÀ-RÝ2V]Rëêõ«šN¨—9Œez®:µF,Pµ4Nweÿ&,9ÔuÅT£ÙÕÔ2ôÉH]ÎÐ-¥®ÚXõSΆv·˜ú }‡z-,ª~ êw¤zeû[ª^Ù~W3ÝU÷Úßê±w”º³’Rç8ÔÓžð/‚z¤ê5©ëì†JNEÛÎT=:“C}²’°€úün*–2XšId(! ä¡Ù¹ØIeÚ,­©:Dx㺯 ÔͪOщ”ëƒÇeõT‡õ‚&A­ eÔù˜¯&”këf½Xõ¹¯[ÔE¯„&ê¯V–ùŠªózÔeY¯L¥ÖÓõZ—:¥ ktçÔ'K„Ánê3Õ™í02u²Í ‡º]MaÖJ¹ÃÌûë|¤kÕ‹¨ #4Ž\Ö}B‹«éý÷arí÷ž£1s¬aÿÆW£s¬aÿÆ×¢s¬`+ê]uÛþÎT§z*T„ýÙ-I†Õåð:l¢žË§›’LêTuº¸L)ÁX/7ÏPSÉ»w6u=I×+QÇú0h€GÕÆ;¨ËýyÒ·YVÝà1èHfQ7ù/Z“úBÝxzŽi:u¢ºÄ¢Îe·‘DwqêÁ(É ðò©ÕaÏC}eÕM€'Z²lê°c’TBuדbuõåØTxª³‰ê´ul ðôàIu%gãÆDeÔ±Ñ/,ÀSCVÙª+ p7¥ÛÝMSìﬓb¿÷1Ó]u¯ý®:fº«îµ¿3Õç÷üî´e€—Á‹¦¾Z€·~oµ/6ƒÇˆÎ¤È׉ÎÂ9ÿó-¼Ø žÚ´‘1³Eã¸Ñê2õu¼Ø Ì‘ƒ$áã;–¨‡¼x¿I‹’¬OE8°ªêGRxLNe[Eu>ƦTWÃ`4…º?ÀKX8œ›ªOI4ŽÞåP¯àÅfðÔVÍÜäÆÍ<Ëxêµ¼Ø 3wC®}]/D¡¾F€wÿ}˜û½çˆ™îª{íwÕ1Ó]u¯ý©Žt’à™é]1‚zî=Ù±iuêÉü³3xê®ýEêöÇ ¨Çfð`¿x}X“;È«=“¡.ŒÀ!’f¦ \WJ=6ƒ'Ràé#6Ô;í£s±(IM³3{•0N3º¼Å¼q²%çp:‚ÙüÅG]& õªºíTÚQJ=-ƒg–M©°Ôl)¤f}Õ¹MÙ‡eDS'º.`vŸY[õI€7þÛê_?É­Ðz Õ}S4U”7N¶Ì­¦´Z5Íàé°L7ŽœûÇé*_±äÓj)øzò^Ve}˜åœïWgZÜú0êÍqÔmû{é9z¶z Ùß‹êö÷¢z†ý®:fº«îµ¿ÕcGÁêê“æ`5Ø›žòRÏMÓ¨›[B=ê+dð¶¢›ÁSý•ÅQeŒ:¡ò@@Áú<ê92Ëÿ¥QÍà™W’©«ÐP)­zš¦×™t(W~ñØî×ÌaìéÀFöõ#¦ð¨ÇfðŠ©K×P;ßV¢Á+¤®¦4ÐÍT·¼¸Ky©«L{U‡‰_ƒWRM!}§Â:Õ4z ^QãÈ!Û-wX¡¬NãØ´“žî«çXF½«î³ßûë˜é®º×~W3%EÝøüÔ[>u~÷×üØ4®·QH:5ټȎҖÔ2x1»Ö#Ô™ÌVS:åÓbJ’´7`?H W“Á£,(I€ºI!Œ:Ç< •\:Ž ?ƒÇ¢óñÝO×¹ ;¨S<ðd‘¯û¼<‡Y¢g¤SÎàɱˆ5¨sýUUÝ ðò|}Ìô…¨Ó ªû7Y©QM:RMO ÉÏàeûú´qToCGý¦xê÷߇ɵW=G’¸¤Úkº«îµß}3ÝU÷Úßê›Ñ七ÈPÃׯL.㜣›¢¤á%ëÅ8êÞ[&&Ū¼ÆÔ£3xvQ~R„c Î… QG9vŽBvoRMT¿lIu,À›œÆ ÿ•?€÷¢ç(ägð좺£Ž‡|š‚7™ä L«LS=0EÓÁa<Ô³pêÖéEÝwŽ‚k:a žUTõ9Œ´ Sg&'Èçªó0õÔ]4í¢¾œÏaÓ“ÓLoÌ jê,†ºm:>ƒgÁ8Uµm‰:à¡ÕT½ç(̨ÇgðÆ¢ú¤\çJ(BýéfŸÜƒx2X$Nã(mMß;§n™^¥3¥^ 3ê«ôÛœRæ_n¹L}ଅ©¯s"ÛuµNïhz¥sð6¡¾N”ôk½Pã—OõÏR¸bƒ^ÓŽê¯5ìZöË zMßÏù¦GBW½ªŸ*û2µ_nÐkºúY¾·õ¨;¦]ÕEè÷ô÷wžüM×ߟò .õƒÁV7íª.éýÊ¡þëóÓC=d0Š:nz®úÓçG€ºóñCì".€P4Ô}vý¦gª?}Þ¾dRçÃæÔÃ#©c¦]ÕŸ>ÍhG:õá3ê c©#¦]Õ‡ Pç×W—ú‚ÁhêsÓ®ê?†Ö3Ÿúõ:S}Á`4õ¹é™¯—ʦ~½"¾6K1=oa~\¯™Ô¯W´… Œ¤Ž™FÚõ!êÞ{ݯ+ò·-4ÔC·QÜ4v7ý ²ý[– jø%ñšžµ0¥p©ôšvT­m¿Ü ×ôýôׄ®z tÕ[ «Þ]õpT¯xÛ^7I}ªzkN‘xÁToðOÇ—ñÓU½%£hõ®ú¦èª·@W½þª¯zc, ¡úšÌ? ¨Ç¨žc>YÓTÏåê]õ\4R=¸_mäî)mTgÁ•âPÏW=¼Þ:DÝjÒÛ¨®öÙQÓéõ|}}"Ž8ìÏïOV“ÞFuµ/|MçëcSrg¯¥Ô U×3žÍJ3g?P*Q/TÝ¡Î1ÔS‡z]Õ'úxWÀ7WÞA°ÃK]%æJ©¶ëº>Õ‰™¤ï¯¦u¨ÞMõyãëŒ*?ùº…Þ‡á£ÞUÏEWû¨‡fM”¢€z„êÁ  ©÷ѯMÑUo®z tÕ[ \õ5ïT×ÙÒŒ9õÕW¦~[¢^¢zÊ›“ñõæ}©‚êù¼"°L½«^]u­©ß·ê̳?ÚU§tÎq¨ƒ*ªû­©Ç¨î± ¨[ìTu8¢Ò~^îÈ¢6Yѯ’èÃâQMuØÖC]¿êìÔU„:ªÃ®ãXÔ­½HkШ§º‡ºØ×iÜcg[ꑾ¾GêÿÕÕ•³j {tÁ«ÛVÓØvލ´Ÿ©›W7mï»ãCkê]õúèªãhM½«^]u­©—¨¾æ<åÙRê9õÕ_SïYMÑUo®z tÕ[W}å„b%(êSÕ?Z“Цú‘Ð÷h®z tÕ[ «Þ]õ誷À=©®WYé¬j™­ºpU7Kw _ÿ¢®ÆpU7³[,ê;ÅLuùƒÀDuzÌÉ;©q=Ì|]žÂl–íªƒyÌ!ǻ¼…!°ˆTÏ  õÓÿu€´ëÒ‚#°öK}Þ®›ƒ´8ß7u¬…±©ÓýRÇÚu´šî:v7µGÎ(Åf”´Ç=õaŽƒ®z tÕ[àŽTo=è…EÝQ½5«(ÜpÕ·ý§g¦›ÌToÇ(šzW}KtÕ[àNUwNJG×%Qg½ÒR¹ç] Bª'Q§ÜþåÅ ÔÕ§WÁÇŸR_dV1: ¨û¼©}÷dX-z¦TlÁ§÷߃M¦(#úLh§Cö©à¶¨ªOUΑ'|\äCwzï=fíÂ7-dHaêˆêò@vg¼ëãÌÍêžq‡5½7eÊ'û¯é³Ìé|aP êˆêÔ8Ìœú¸ÿwã¯`jÄoB]ŽþQV³–.ªÎaË7‡:™¨®JÄRÏTç«QŸ«²ëMö(µ©S]&Î1–1êª?ùUgêœzÅŒ2M] ÞA%d|ZM­²µa×+=ë&u‚ª‹†Nc/N«7 ½Ô+âøzx(‰SöY£¦.GÿÖ¢žÐ‡¡Îoa®çí©=G+!ƒS'¡]{ÅëµWçÅ«>.ÈÇ9°07F«¥Ñ¶î¯ÿV¦©Ø¸¿.x×’½GI-p‡ª¯»`§€º£úkkZ1ÀU?îh|ý@誷@W½ºê-ÐUo»P½u7ÿ3ª·î&ãÿÝ× ·0-ÐUo®z tÕ[ «Þ]õ誷@W½ÕÑhê–hw#ˆêè^j\µ®LuÄÈ—ä«®oS}ý«V1ÒUO¼j#]õÄ«V1âW]NŠÒ“‡r®*δ˜ÌWË¢NÍØuŸêLM„OdQç0Qp-ê>Õ¥àf~b.u^‡:ç)ªÃ"åÙ⯠ª}tE‘êD-ØR]Q×’9ŒÞ„ €ú¸“A´êzÎSf55óy¥ÛdQ'jg³0=Zõ Ãô¹EªÃÔæ_/¬¦f*r ê“¥¦Fã¸õ¥v½à–ÄíjZH«¦KwS%{u¹G©êhãxô>Ì_çCöσê½ÿ9¢êïïƒÃ\~QõËEP?¤¯Kê=Jнj#X»ŽMƒH¾êúFÕ?j\u#}¤·ºê-ÐUo®z tÕ[ «Þ]õ誷@W½FÕÉá U»Zõo¨nã<-îoÓ¢T}òÌù²!›œßž§e¡úï—?;ÅÛó´ grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/tools.pdf0000644000175000001440000002220510616356706013627 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`jl®g5251 õ --Œ ´¡%D±…‚K>W _™«endstream endobj 6 0 obj 62 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 6633>>stream xœí ”Åy€»gfïs¤] s!âˆM ¶9mç qˆ vŒ1†ØNHBœ‡<۱͋—Gˆ¯Ä&Ævޝ>x¶yðˆ8b$΀d$:VÇîêZ¤]í½;3»ùg µÝÕÕÕÕwWOÿ߃QoW}SÕU=S]cö÷÷f___Ü1Ôæþýû㎡¦0÷íÛÇMX¶lyÄ¡$ˆþ~×jmîÝ»×¶jùòá†S+ôõq*·¹gÏžê+V¬´fgg÷ÚsàèÈøÔ±‘ñÙÙ¹ˆbÔ˜–¦†Ö¦úe‹ò§,ëjkn´VÎÍÍÙ´š½½½ÖÒÊ•«¬…áщ'^Ü584a´I"›Íœ{úò³O[fýù̶½KZßH5wïÞ ÿ¬ZµÚú{ËÎþç·ï/–f#3a,^Ðvñ¹§u¶5Ãò÷~îÂÓ»¬õæ®]»àŸÕ«{àõ©—z7ïàwK{Nê:}åâÖæÆ¦†Üätq`p¸ÿÈÐþCǰâ»àÌÕp|™-_Ýwøé­{l+cÙ½¡¾î=—cUÿ›nÿá'ÞófX0wîÜÙÓs ,õ¼öà¦mÎCœÔÝÙsòÂå‹òí- S3EøÊoùªj‡ŽŽô >Špq¸ê’u­M¦iÖ×eáø3…Rå$@ù‚”¬? #“1üØfMv_ØÑrÍåçf2™_nÞuç}~þÆË^ »Ýóà3ÐÙÎÔo=ëÔeù¶¦–¦F '›˜š™¶œÎÍ ʼn©Â‹;ú á (ô’óN_”o53fSC]{scå=+7…“b©43Sªœ³œ«áÑÉGž~)WW¯ÉîW¼yí«—ÂÂꮲÐRår¹cÿáŸ?¹Õ™Ïž“»aë¶–8SKc}6“™.'§ c“ÓpFx»Æ'§·ï9ýx{ƒ…küš•‹3¦Y—Ët´ÂÙr•·¬ÜŒBV¦f £ÓpÈ宾#¿|vK{~¡&»Ãeô†+~úåoÞûÐëB±që¶Þƒ¶L65Ö¯Y¾è´åÝõu9è447Öç²8ÓL¡8>9ÅüB“·}ï¡WzfJºV'/êü­³O…âËdt´4Ôÿ™¹r)™ƒ¢o᱑ ÈdøÉ-»µuûÂEK=wo¨ËB„êk÷žeåæeºPªž½¥©\_ÝwÄm÷¼û"Ð::1µþ¦Ï™SÓXu×OŸ<>f¯ïu¹ì¥ç¯éηÁAá}Ÿ Þ7p oÚñQˆ³ïf^Ü1gB2ÊBá=[Ù9cÓuÙl÷‚ÖÆú:(òPd*õlN7xl ®l­Í ÷oxñÐ@ß‚ùYrîÞÖÜPM“ßýŒž%ÖJ¸šÁÙ[›^¯Ý[v¸íþî·ŸeÕú‹¯ù s´rݼã{ÿãÌ$´æP˜Aâ©Ë»ÝDìê„êðÝŸjÈ™u ¾$ÚÎõá?¸ðøø¼‹Ðþ56äÀ&6!WSÓÅ#C#…b©£¥ñ›lšÌw/ì¾´«Ív|ÐÞîÀgnüÃzìx¹=ù—ïopfòÈÐØ­¸. p¬3O±xi÷¸ÜÀÅóöï<ÒZ?ÛÜÚ!%œë–÷_6<YÊ,Ê·56ÔPBá²e”oG -g;[ïøÞ†ºâX¾{‰ÛîÐëæžâ™mûdv·ÎÞÕÑRMí?2,>;ðé½ ^ßqíÇÌÃGG`éK?xÔÁžÇ>û'¿ õê6ô¶ óĦÂiŽMÂe.O·ßóàâöúö|—¼A»Ž~áO¯›„ ÑÕÙAxŸ¬ èW¼6< ítn>õï?[ØPèìZâ¶û¹kùBŸ- õÞÝ:ûâoÜýì?4,>;ðw|¼^ù¡[ÌþÃC°ôå>æŒ`ß¡¡?ºtÝykW@W ê8]¾¸ÓJ:2<™‡‹N.óÜöýß¾ï¡UKv,Xä[ä ¶ì:ðõ¿½zt|:SiUàtf¥ß0W¹_†*5 º2Ð߸éö{WvflYÂÝ}ʼnlVÙ¼c@°;pëuWÀëU¾ÕÜ3ð,}å¿9BŸhoiºùš‹¡‚˜ U‚†þäî(’ÐLMÏà¿ÙÙò¾/oy~uOO[çBçA$y꥽߽íƒ3•þí¯Ÿzw›—{‚©k?{Ï'5u,\öîÂu|q¾Õswà×–…¾÷¦Oš;ö†¥¯Þû87ˆ­;û×_ñï|ËZ«_hÖ¡M,WÃ-Ÿ¸ö3ß^Ý2¾dÕš¦–v¡4žÛùÀBU*Í­]Å¿ ÜÝ?ÅíÊßu~O»-Kè»<:R¹ä”? ±®§‚Ý[Þ9¼~àæ¿7·î>KÿvßÜ Ž¼²ÿè W^ð»þZ¦tîá&6—Æý'm¾ë§K#Ö¬X´pÉŠ\}÷ 2üüÉm~ýf³|o}[3›>®i×5¸RWîÐ ¥·~ôËo{SWûü,Å»;ð7ï»^oüøm拯–?|þÚýÿËÍçÜììáÁ×vì;xæÚÓ.:«gÝšep­<|lî6<ÿêÆM›:³“‹ºt/;¥¥} ú£Ç¶<û·”— Pd¬ •ÿ€a¹ú‡™L¡X„š±öê¸âì%í ë³;ð±÷^¯vëçÍg·í…¥;Ä ”ŠÅ‰Ñ¡Þ}‡‡&F‹ÙÂ\.gšé¶ìtW³ÙšïêèZ 6³óïŽýòüö¾}ƒ2[v7N¿åÌSÚæ7€ñîüåÕÃë_}úŸÌ[ÊŸ‡~ã'Oºcn®T*ÍLŽ MŸ™š˜-2¹ºúÆæÆ–Ž–ö|}Sk6›5‚ÝË£ÃGzáU¼Y3´}'÷À«V»ÿùú·Áë-ŸûgóñÿÛKßz`£ø@pÃR*Š…° ˆòÕ4WV³¹ºJ8þÌäx±8#Þ,—«¯ojójµûGÿð­ðúÉ/|Ñ|ä™í°ôŸ?Û$>!æ†ß¿^o»ý«æƒËŸÚý×/Hh ®û½²Ðüâ×ÌžØK?xèé¸CJ6ï{×ðzÇ¿~üà °ô?wHÉæº«Þ ¯_¹ó[oýëõÄURùÒýO“P46oÞüØ®)W¡ëÖ­‹9ÀDq÷ÝwÃ+ Eƒ„"#+® q…èë=NÝ…Ây¯¿þz_Û‡‹Çy­8ý ¸ú[Á)1NŠ E†„"CB‘!¡ÈPdH(2hBóùüÐÐónëeRÝ•Ä'œŽÝ@òÔ¾Àê ‘»2x ’p…²ÁÈ¿òD*´Z@Ø5Ö²µ xÂj[ãž3*ç–Ü8ª¼->v3ɶP[pÂêž3*î–Ü8Ã*Ά8J#>¡’+¹qâ4Jâ‚YÝ>ÑBÙ#Ä&Ô³Ê'H¨ ) ¥Û¤\,BÆÌ 5:¡ÆüÆQ¦Ér T¿ýPA'DAœt§„ E†„"CB‘!¡ÈPdH(2$ŠŒºÐXº(1NBã6äWh¼qÊ %$!¡ÈPdH(2$Š E†„"CB‘!¡ÈPdH(2$-„ÚÆ"XàŽâ cX(-„V /Û$ô5Ö‚`ªÁŒóáî%EƒŽÖB} ˆu®4\F{…ŠÖB¹IÁ‡Ï…ŠîBãuÝ–¹ÃíH¨ýOµêväð¨¡t å#nåmí;»¸•7潄!²2(&ÙB=•GO²…ÑvÚeH¼PÝ ¡ÈPdH(2$Y¡Öv„ÃI¨˜u ¿B}}Mì8tŠ E†„"CB‘AÊýh2µà”P²Y…ª<2˜%TfÚ1ñ~§†f %¡Fô%T<œÆ¹eâš;äk¨ü„LžÃiœ©‰¹•w·0&›Ò™PJ( Åì‡ \P•~(®Ð´_CËÕ5Ö‚d í­ÊϤɰ,"½†J^XÝöJÈ%Ôà5ÐÜ+¬L+oÌ7žâ¿SJ\Ͻ¼Ûõ´ˆíÓ¦$vÚeˆ¿Ê×$Š E†„"CB‘¡i†B¦B†¦ Š EƇP«-ó$åo²PØ&å]+ßBPÐWe?Zf× Ód7‚Û#¤ò»ûÚ+:¡Ü¯7<ÎøÉið£Õ²Pç±,± Á° ÃeÔ…çH#AB埑wî+ˆÇvƒ7,Cò GVB¤BÙõ’ßԻ凛%®5A’Â{&x#“]BBÙ?%…Šwa%$U(J•ç®T>E‚…Ê´àjog`zUyv½ü5”MòÕÁr뇺5ÙÜxÄ­¼S‚¡ž÷Kb¡nìoêƒ?¡2wŸ$ÔˆàÓ&A[왚,èã;dH(2$Š E†„"CB‘!¡ÈPdH(2$Š E†„"CB‘!¡ÈPdH(2$Š E†„"CB‘Q*ùCØâÑ'‹„ u>¡O$„F|5àFÓ'6‰„"DÂ&šÏw†x…¡¡a6VÐÎÎp#EÂ&Õ¬PÓ4ææÐ"I»P°iå4ÕB«6-PœÆ/”͆-‡òÐ×qæAÍ©‚P;MµP8;{ EiÒ+Ôvºi”H¨QK’Q“Bƒ`Y)$4(¶rMBÕá^vI¨"Ül“РØ2OBAU>¬*o¹°îpH¨ ‚k…²7Î ˆûÿ)j¨Þ yÞM¥W¨-ž8t.iZE`Ö×ç&$Ô7âBF¡Aâö¼DÄ"´Úoc‰§Û$½äÕ6®êÜ]»˜±Ê\hp¬¼$©c/@¡FÅ) E‹J(Ú]C±ˆE¨F­<:4ú™Ô O¡ñFÂ&‘P„HØ$E¡±<0ÀªC$êBãzüÂ)T“H,…nPdH(2$ŠŒ¢Pç4ÔžS{þv â¤Öyæç›l?@6êB}ýTDÀT¿HþðDÊþŠ„ó7O ¹&ÿ©[0 ¦¨ÚæžË­PKs¡#"øj¸ý*/‡å,Ÿ#ÏpJ¨ß•29—‰Þ ±P·Ÿ ñ<—x„:ðDæÇUä‘*ˆ„sU÷wtPZI¡òÁ;ì†ÖBîòƒçŠPÃ¥õ4xí¸³UÅjåÙ“zVy·¾JÔUÞse,(TU,H(2ÑÝzF‰-˜(c£G!¡ÈPd}ë ¶xô‰Ä"aBiî;Lj ƒÙÐ'6)Ðx‡hé ›P¿£Š=bÛ"Áî+6©¦„"ÎXÅ:¬^BÙÉ©<óÌÇI¨/õÚ ­F/#Ô¦> ¡~aÒN¨-'òyC¨Â<ƒz e3)ÊÝW¨Ú<ƒ µåP ÔmKD¡¾vƦ…PgdžÑÛ¶¤k¨=gNœ+Ýž '¡ö ¸9±UmÁü$T*'Tåíx õ,w‚ml[’P‘)v†+™þ •Ê uì툟RÇšËÁ ¡j7*Ò.T&,¿¤W(âg‘ì¡Rz/ïY—ý~øX…„ò‘¯Y6R-Ô³3ï´“”~ÚD¨Ø–Ð u(IB=+)ŠPÉîš8HÝ…Jö ‚ õÕù|ø­µPù>V@¡~o%œ¡š õÛ] "TÁ¦÷í×Q¨Bç_Y¨²Í*¶B W?ÔðÓ·gQ\%KõÃF½„*ß•ÒPdh°2©ÎžBã„M"¡‘°I4÷B$êB5™qNŸH,…nPdH(2$ŠLP¡nÏö«=óÒ¼ ‚ MÐψ Ô- …Xê‘°I4X !6)¨Ðê ›„ 4®a®úDÂ&‘P„HؤÚÊ^ BM˜P·@°„:/¬~£MŒPñ\$Ô_ˆ,Ê’P3TPï°XPûOi£¤0oŠd6BíoTªÔHhê’P¿3çè"”[*%§Ë¨±ÊÛªõUbêÙäǶ%b£ä|JYrª‚˜…z^þ#êÔ'!»BÅu*¡\w2ȶ ‰-ö™zMvÆ-„:Ãe7ˆ²„Îñ¦+õu) Fi^ž ºmnc•ön“§Mg„‚íµêt{ùMÉ[8„úŠ[!b¡¾ŠgÀiؤZûp„[—Åx…Vƒ“ÌIdBQÞZ6©Ö>`–Šxña“jö+Y_'Fh5\ t¡X$Lhlè ›DB"a“H(B$l Cˆ„M¢áŒ‘°I4à!6‰„"DÂ&ÑÜw‘X¨ ÕdÆ9}"±PJ¸AB‘!¡ÈPdH(2Bu›ƒ@p^A¨‚•¾æ&ÀªÕ,â“*LŽ›PÁÄVlªÛÄ8ìÑ‚Là$>©íȶWn$ΰ„RBNÝdœ˜xȘ?ñŸ$òSCóçÀD™k _¨Â´Wâl„'ÔmŠ)„ºÉ%¡$T¡2S… G#ÔÐðŠØÊ+çÇó¤ÝÜVÞ˜¯Ûê‡"CB‘¡[OdèÃdH(2$™@ßzÆ‚-}"±H˜Pšû“Úè C6ô‰„M¢Áb‘°I¡ Åxz€„žéád¡òÏ#úŒ„M A¨ÚÈW^ÆH¨ªM GÞªòþGÇ$4ø¨ìùùL·P¬1îLVñ…ª=ʃPÜ'Nä3­%4Œç/*N¥Ð0ŸfIe+/˜bÆmî î\+¼ÍЄÚÎ✞ÄKk´B¹S}ÈüÉNçÃ[‰#”;-ŽçšùP·™ —2Ë#¦*/¸HE Ôíêá6uçJæ€q4JâR±Pö˜¶·eî‚£P®>çÐ*jRm 5_C™ã¨E'¡¸““´–PÊ$…Ù±?á…¿†Ý]({ü¤¶ò褺é½S ‰”ÞËŽz„Bß nä¼ ˜…xUp'ôˆd50œÎÏgŠ¿Sr‹ØŽì¥¾„VÃU€—CÊDì —ì¥¸•—Œž‹{–H(2©}žBã„M"¡‘°I4÷B$êB5™qNŸH,…nPdH(2$Š ¦PÁÔUÜI=¸GP›gD2ñÙÅ!I‚,Ô×ô8¾Ž<µÃ&I¨Û”5Üùs‚ÇàyvAHnt›Pŧ$c?»s¥|¯tl©êY=#q? e ¡U¨Êó F)ñBk¼ÛêØ#CB‘!¡ÈÐÇwȤûæHýW ØÐ—tȤþkdlÒ=Ð!R<'Ò:X,4R×± O¡ñFÂ&‘P„HØ$šû! u¡šÌ8§O$ŠB 7H(2$Š EƇÐ(çð;õBž7ås9Œ9l¡úÙ  B3Û¸m€BP¡žE@mÚ¶ìضì"9Uwî<<Ühñ;÷ K¨ÚÔ]òÓ;9ó)9å’ø¼âÝeмJ•÷µÀpú)™y¡lo-JY–?¡ìŸ’BÅ»` už¥º^¼šPnÄò%TàBá8¶5n¥O TÐRù F±•÷U_‚¬T¨Œ…Æp •_¶lù±­”i1» G뿤•7„Èlòç ;BŠŒ¦·ž~‘-U ëEgõ¬ÐÇ_Øi”ŸÐ);­¼fbV{¬§™ BQ¥o?çTƒúȳ¯œØÎe’b>•‚÷ÆŸ—œ·Æ`…(”…¾uýMq‡QSü?žYÿ endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer Bildschirmphoto5.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000378 00000 n 0000008780 00000 n 0000000319 00000 n 0000000165 00000 n 0000000015 00000 n 0000000147 00000 n 0000000443 00000 n 0000000543 00000 n 0000000484 00000 n 0000000513 00000 n 0000007377 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<4406B197658858E5A01091FB20EC17CE><4406B197658858E5A01091FB20EC17CE>] >> startxref 8956 %%EOF geomview-1.9.4/doc/figs/tools.png0000644000175000001440000001371310616356716013647 00000000000000‰PNG  IHDRpñæ,§’IDATxœí[UÕ™ÇÏãÌÃLÕ<ÍÃLÞ¦¦j’ræ%SSZ•8ú’Xf¢˜ ^f%D( ^a0ˆ‚x„ƒ ŠA 8 ˆ­F¬€¢\š¦o4}ïÓwºiòÞzÜìuÙßZûÛ{­Ýçû×Ç©Ýëú_¿³ÖÚûôÙ½)œa‘ªÐÂ"U¡™EªB“B/þ?‡*TÐ@…FAÎíæ%Dt BCH•¢ããêÏt½·¿vkÍç/nß»æws¼úûO·xøÀñæ¾Á‘ ¨ .6\®Âé¯U)ÔÓ7_ØúGiÀ ;XÛ\ÁõɧÃ*ÔO¨’ EáÝxþÍ8ôñÖû‡`æÐ6îØWÿµ §&d|üù©U›?ÆŽÔ·tuô  ƒ×ƒµ-oô…ª°E|v¬ipxPÒ“êk·í­,ÿ»—¼,ÔÕÕIuÍ+6Õˆ±eÏ¡µÍ½ƒ£cç¡~{ÏÀ™Î¾æöRsGiÿ±¦M»?“Ö2–ŽØ;?~ad::×Ó?ÜÕ7ÔY‚['zljë…€’þTÿíÎýp¾z8ùÓù«æW@!¶†g_Û‰;÷®kmnïíéŠçÆÆ¡§³]ýÐAc[/¼‡O¶®çObEÓ8tâ ø>ÛÝ_šxÏÇÎ_87zÆ682)°&`$ÐcÃÙ(¹ô•þTÿòTk0#¿üp¼¡mÙÆÝb¼õþçÇ:`JÇѱñññ‹ð6v•† éú3Ýðz¤þì–÷,ݰKZ»þtÃûÔÖÝ#K0Y``Ð)ôØÝWî±ñlÏéÖ(ùØÊMþT‡…0ܱ÷Èg=óPØ—¬ÿC$žÛT³cïQ˜†0Õ»û†GFÇÏ—'iÿÐ9˜¤µuÍ]ÐÇ»{.߸K¬nv샦N6wž>Ó +z¿8:VÒð¹óÐûÉæ®M§[»¡äƒK×cª&dZ=¨î=HÑTÎN°^sÛ¼ÔXùFÍëvFâ©Wví?ÚoΩ3Ý]}Ã0ÿÁ(`…Ø_Nµt=Ý}¼÷é‰Ekþï×¾+¶€§7ì®oí†íåØévhº:‹n^ƒî r¡ ”œ³ä¥Øê…ŒªWj½W~ÔT¯¬ú«¦Ì('¯kÞcÞ¯¶Á4pµ ¶•Š[þÕ›ÒF}ÁRøìx3ønë, žëƒW8†H‡\(%ï_¼V_]ô™juˆo€ööC<ò›·Å˜þäk§Z:aª©o“Òü²þ,,“º–Îé‹_³l£´d@_'š:öm:x¢¶ìîþáî‘Þx…cHtÈ…2PrÆ¢5šêª÷Y=è=\1¶w8‰A”vô @Ì_µMŒŸ>üÒ±Óm€ ÞØb"þ Xòð¦í;ÒxãÜçg<ñ¢´dÜôк“MûaHµ-Íí}½åKØgàŽ!Ò!Ê@É{®ÖTWEVzWŒí6Pˆ2Ð3%ˆWl*oÚ} ®¥«¼¹4´·tôUúèìjéìƒ >òC™k¶xú‚ÕÒFqí}«`¦ƒïÏO¶6wôµõ ¶÷–QÂ+C ¤C.”’w=ö|ªÕÅ7C_¢«4QÚÐÚ 1ûÙ-bÜ¾à•™K7ÃÛr¼¡ý‹ºV ÛÚÕ­ÃJ„¹3h‰~æ²ÍWß:ïÎÇWKAÆwïX“¦ü—§Îª¦Ø±‰%ïxdUÕÛz;JC˜êp Qz²©bæ²7¤ñ½Ÿ-_µå#h¨¶±°Â>9P¸Î‡Ë`øñàñ–oß´ð‡ÿ5÷Î…kU`âŸ~òË`;†Y¯"ïìéPò¶ù+Ó®ÞÖ3ÐÞ3ØÑ;XÙO5Õ!'.TË@áÊâž§^—ÆMó_¸bÚ“Å×ßèpB‡´µ|‘?20< ³uÕæÿyÚ“ß¹næg,ºkÑzU#˜øûë-©¹>/4¶õÀöíŸí€ «ÎõmÝà”œ6÷9¯ªCó² ôЉˆ»¿*;ŸØxÝýÅüѼþgíòW÷ìùôtùÉ k·}2õÑ—¿uõô+®½õßo¾êÜPRÕ&þæšyuC‚i×¶MåÏ-å.°±À``šÀÅSg©þ²>nylÝÔ‡VOypå ³—ÿÇýËàŽ!Òcë"ãæ‡×Ü8§ø£ûžÖ”’¾Uÿã¡Se »÷‡˜öè:Ž$ñÞþZˆ2Ð{@uŽ$±ó“£e Û?< 1õ¡8’D€± ôÍ=!®¿w G’0^´†e+J©b±¨Zb™¨8!J&J,,Ðìw¢ŠŒÆãܧï@Á\.€V|š5[r挪8÷É@ Ä@‰Å@‰Å@‰Å@‰Å@‰Å@‰E´P(H;P¥crUF‘}Fnn0j )J ¢EBßT@5?’(S âÔ¨š7  ‘•=Ñ•fŽ/y©©uñ@ZRj)# *{R«š³ª†ÞeÉPd¢Ô'ÍII?1#‹%§@5g¶ì€Æ.yͰKžÕtšÊe“…9'@z–ZÍhéò“#攥2Š”éu¨˜ŽˆÆg" i‹hb Äb Äb Äb Äb Äb Äb Äb Ä²Zt!£±9÷£€:qY4êÖgpÌ·3’‰‹‹‹‹‹‹‹‹‹‹‹Ë  ™È» mP%/€V”Þ°è7)Ò[e"÷Å•´·Í¤4ë¥ò¨ê¾-é}gInŸ#”×@¥YÉoŸKU¾OS úZ©Êk ø ¨* j9=M ¼‡Ê¥?Ë‹góR¥æ,_ºœxªò he6õÊ7PÕ~êPùZÊö¢£ÜõM ”X ”X ”X ”XX EVœ(¥" °@³\;9’Š&%%%Pé¯&«V43”iVÄKžX”34ö+³X¹ýND”3”–²Ÿ¡Ò¯ÌT-äñtG¼‡Š_Õ"ïEÐT¯F šI§ª‚IÌ…R™¡ 48¦¹Õ°` 6ס´@«}ÕWR¤gyé1ŸåYüYžZüÛ&bñ’'%%%%%–=ЖZÆ@ÝÚõ_f@YH1Pb1Pb1Pb1Pb1Pb1Pb1Pby´’]urKò¨æ»R»\É  zš[£"ß<«~,eøï@ínÒWIUyªIŒ­’ªrT¨0PË%߳ª^ v¼4D Tµ0~2ŠY¼4h" ÒbU T3¤iQ„@­ßïœÕçRM²†ò4vvÅ_¥å(rcMIS?ßâÏû ÑÔ¿÷žÅ£LÔ‚¦æí÷¨)Í$@­iŠXµÛòÉ&G±í#PkY%— éÉhJQ¥@:!š™bºuÎb NÂYüì;'I:ƒ8 œ$ÊR‰‹‹‹+)PÕßöÛýÍJ Ð<Є¼G Y„UŒšµxÊ©(ЦˆdižHƒ¬b§ðƒwTÉQÙ0Pä,@&R /¡I ÑÅdÅ–d _ÇNÆH]Õ)¢p¹¬‡§r’Þ®JRBZÄ/ùä2š˜¾ÍûZò h)ÙY^ Õz/¡Š?ZȯëД¤Ù—éx1ИDSùõÑ3%‰{~ΚŠ9B,J,J,K 5îä­“\¿kôÇ PiVz’~yë“p%pÎâ›ÅœPux¡?Nˆ¦!; ®œ0Pb'Õ4áÍé9ª*Ðä7üç¨~œ ÔÌbì(Örl 4ޖѨø¤¤3d1$ç—M·M²ÜRŠ,6ìP)GW34œ®÷ ŽÆ^ á÷\ ‘5kE¤é(æb(K ¢¤Cï€j0eTʳ€¨Î‰TeCºéûÔ‡%™bRvç|R’#Ó0ÕÏÇ@5Xñ4¥):Ô¯*÷@U¦ñ²ŠïéÍ# F¾Éâ-Åö ¨t ÅGr'€šbÍ (Ƴ¿@ñX3Šwë;P Vk ªöíÎy¶Å0hhÆ:ñh’aøã„;a ÄNˆ¦@]9¡šªŒ€:tB43Åuë$œÅ@ œ„³øÙwN’u2qþ8I”¥%%%%PßžA éWcU“h4  YéIß©ÅÃ1œ-„$Z‰}0N¸ŠÝìÀti9ò*ub´ÔR™¡ú§ùÄ&F†gÊÙiä×xv¼äØi­'©iûF%cE T—2P€b6S|bÆ@}ÜC !©L‹S8’HÙ~åXSï¯C‰Å@‰Å=‰Å¿!%%–%ÐwòÖI.Šß5úㄨ4+=I¿¼õÇI8‹8 gñÍbN2Jñ× ôkYÜi> c  þ‚Á)Pë»Z(MÅØˆ†MÊP’»¯(M)=P«õî(ÍËÇI´âÖPÙ¥¥bZ•@Ó ù5Sb ˆ]Û Rëª!Å–$é%rŒÀš-а3£#Ãi€Jß°ØŠªZï~©‰¦3ªÚ=ôˆ5‰èÓc @cgAÆ@5ªc­@UST˜ ”b •´J€â ft2ÌPJ Tµ JF «Ê$*egšèh:›—P•"óQúÖJ‡Ä@ã¦^l aªšÒÂ%Д˜"†aTã§l’3Å ÃhØ­¡2JÈ=ŒÉ”„©É0l€Z­ww@25FÌÐ$L͇Q5@/™3µƤ>Ë'aj;Œ*J!b ©9!š™bºuÎb NÂYüì;'I:ƒ8 œ$ÊR‰‹‹‹‹håÏûUOs‰ýûëçŒ =X4kZ…¨Ê’ PM “¨ê‘5Òçç$÷ۻƒªAQ΀Ò>Zãß»˜˜éc†¤&DÓ+ Ff¼Xò Ôx0¼ä¨¥%/–|I˜¦ MÚ‘~d©UÇ*¥4a™$Ò·Ÿvï%J®T>zZH.Mô^â_Ž‹‹Ëh;yë$—@ÅïýqBTš•ž¤_Þúã$œÅ@ œ„³øf1'¤@ ï­&†½ó’5òg(3 x'æÅ²Š·h(c H'æe2q@רÆI8_á$ —.¿çšB–@UN*?Šqþ {¢=P•ý=öjóŽ€z>Cd¹jõ×zYu¢O—Ut4YÍÜ %vÂ@‰d ÔüèÃ@]‡Ú9ñzͨŠ)Ò‰/gy=ÐØÑÊdÙ/Ú[U€±NÔ-0Pš¨E¿9^ò|RÊ1PýÅƉîвš¹Jì„;™ì@Í·ÈØŠÕ 4‚†"«ê†éHõ¹†Nª¨þ“’x ©…p2Ù†‰DxY@8™Ô@1ŸÌËT+Päg0óbU ý‰Ö¢dUuç„ hfŠêÖI8‹8 gñ³ïœ$êd â0üq’(K%J,J,J,J, Y>_À´È³KÄF*¹äÏ ˆ4hÔ´u*—øò±Ï_ñhì§à;yvæG½<ÐH#·ÿb­´€âGñgZÓ¾_}uÌ”·YòFøa[AZL|Å´lÚ‹X,k aa\ÆVQ5b T쥒Ž÷_JTê?C5,,Ú‰¤¨fŸªei/ú*ªº–gy£õ’$Ñb1jìŶ¬÷Ö’ÇG–Œ4QåR\õÒ*ÒS z·±þÃ?zzj*|¿i;d Äòô£§©]gà9B,J,J,J,J,J,J,J,J,J,J¬x E–¹”@]Ë«$@~~»¿ð‡4DVQ KÖÿâé »àõ—/í|b‡.®}wÁš2ÙG~ó¶heJÍ'_þ=¼rècÑ‹;×C¿Þ>Õ6ˆ(Ð9Å7ñÜ[sWnå•n´ðpzQ 3—½qß3›g?»²\±•C€XÍZ¾¸EÞ½äµ îyêuLÌxzÓ½K¿‰(P’(…„ñgOŸé›eì3ÑIEND®B`‚geomview-1.9.4/doc/figs/fig2.eps0000644000175000001440000044565610616356704013355 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: Sep 12 2003 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 202 277 410 485 %%EndComments %%BeginProlog %%BeginPreview: 208 208 8 1248 % 2929292929292929292929292929a929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929292929292929292929292929292929292929292929292929a929292929292929 % 2929292929292962 % 2929626262626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262626262a929626262626262 % 62626262626262a9 % 2962a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262626262626262 % 6262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a9626262 % 2962a929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929296262 % 2962a92962626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626229626262626262626262626229626262626262 % 62626262a9296262 % 2962a92962626262626262626262a9626262626262626262ffff6262626262626262626262626262 % 6262626262626262626262ffffffffff626262626262626262ff62ff626262ff6262626262626262 % 6262626262626262626262ff626262626262626262ff626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a92962626262626262626262622962ff62626262 % 62626262a9296262 % 2962a92962626262626262626262a96262626262626262ff62626262626262626262626262626262 % 62626262626262626262ff62ff6262626262626262626262ff626262626262ff6262626262626262 % 626262626262626262626262626262626262626262ff626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a92962626262626262626262622962ff62626262 % 6262ff62a9296262 % 2962a92962626262626262626262a962626262626262ff62626262ff62ff62ffffffffff62ff62ff % 62ffff62ff62ff6262626262ff626262ff6262ff62ffff62ff62ff62ff62ffff62ffff62ff62ff62 % ffff62ff6262ff6262ffff62ff62ff62ff6262ff6262ff6262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a92962626262626262626262622962ff62626262 % 6262ff62a9296262 % 2962a92962ff6262626262626262a962626262626262ff62626262ffffff62ff62ff62ff62ffff62 % ff626262ffff626262ff62ff62626262ff62ff62ff626262ff62ff62ff62ff62ffffff62ffffff62 % ff62ff626262ff62ff62ff62ffffff62ffff62ff6262ff6262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a929626262ff62ff62626262622962ff62626262 % 6262ff62a9296262 % 2962a92962ffffffffffffffffffa962626262626262ff6262ffff6262ff62ff62ff62ffff626262 % ff6262ff62ff626262ff62ff626262ff6262ff62ff62ff62ff62ffff6262ff62ff6262ff6262ff62 % ff62ff626262ffff6262ffff62626262ffffff626262ff6262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a929626262ffffff62626262622962ff62626262 % 6262ff62a9296262 % 2962a92962626262626262626262a96262626262626262ffff6262ff62ffff62ff62ff6262ff6262 % ff6262ffffff626262ff62ffffff6262ff62ff62ffff62ff62ff6262ff62ff62ffff6262ff62ffff % 6262ff626262ff6262ff6262ffff6262ff62ff6262ff626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a92962626262626262626262622962ff62626262 % 6262ff62a9296262 % 2962a92962626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262ff62626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a92962626262626262626262622962ff62626262 % 6262ff62a9296262 % 2962a92962626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a92962626262626262626262622962ffffffffff % ffffff62a9296262 % 2962a92962626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a929626262626262626262626229626262626262 % 62626262a9296262 % a9a962ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffff29a9a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab292929 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababffabababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababffababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababffabababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababffababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababababababababe9ab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababababababababcccc % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababababababababe8cccb % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababababababababe9cccc % ccababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababababababe9e8cccb % ccababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababababababe9e9cccc % ccccabababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababababababe8e9cbcccb % cccbabababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababababe9e9e9cccccc % ccccccababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababababe9e8e9cbcccb % cccbcccbabababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababababe8e9e9e9cccccc % ccccccccabababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababababe8e9e9e9cccccc % ccccccccccababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababe8e8e9e9cccccccc % ccccccccccccabababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababababe8e8e9e9cccccccc % ccccccccccccabababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababe8e8e8e9e9cccccccc % ccccccccccccabababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababababe8e8e8e9e9cccccccc % cccccccccccccbababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababababe8e8e8e8e9e9cccccccc % cccccccccccccbababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababe8e8e8e8e8e9cccccccccc % cccccccccccccbcbabababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababababe8e8e8e8e8e9cccccccccc % cccccccccccccbcbcbababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababe8e8e8e8e8e8e9cccccccccc % cccccccccccccbcbcbababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababababe8e8e8e8e8e8e9cccccccccc % cccccccccccccbcbcbcbabababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababababe8e8e8e8e8e8e8e9cccccccccc % cccccccccccccbcbcbcbabababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababe9e9e9e9e9e9e9e9cccbcccbcccb % cccbcccbcccbccccccccccababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababababe9e9e9e9e9e9e9e9cccccccccccc % ccccccccccccccccccccccccabababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababe9e9e9e9e9e9e9e9e9cccbcccbcccb % cccbcccbcccbccccccccccccabababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababababe9e9e9e9e9e9e9e9e9cccccccccccc % ccccccccccccccccccccccccccababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababababe9e9e9e9e9e9e9e9e9e9cccbcccbcccb % cccbcccbcccbccccccccccccccababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababe9e9e9e9e9e9e9e9e9d2d2d2d2cccccccc % ccccccccccccccccccccccccccccabababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababababe9e9e9e9e9e9e9e9d2d2d2d2d1d2d1cccb % cccbcccbcccbccccccccccccccccccababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababe9e9e9e9e9e9e9e9d2d2d2d2d2d2d2d2d2cc % ccccccccccccccccccccccccccccccababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababe9e9e9e9e9e9e9d2d2d2d2d2d2d1d2d1d2d1 % d2cbcccbcccbccccccccccccccccccccabababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababababe9e9e9e9e9e9d2d2d2d2d2d2d2d2d2d2d2d2 % d2d2ccccccccccccccccccccccccccccabababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababababe9e9e9e9e9e9d2d2d2d2d2d2d2d2d1d2d1d2d1 % d2d1d2d1cccbccccccccccccccccccccccababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababe9e9e9e9e9e9d2d2d2d2d2d2d2d2d2d2d2d2d2d2 % d2d2d2d2d2ccccccccccccccccccccccccccabababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababababe9e9e8e8e8d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1cbcbcbcbcbcbcbcbcbcbcbabababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababababe9e9e9e8e8d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1cbcbcbcbcbcbcbcbcbabababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababe9e9e9e9e8d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1cbcbcbcbcbcbcbcbccababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababababe9e9e9e9d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1cbcbcbcbcbcbccccabababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababe9e9e9e9d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1cbcbcbcbcbccccabababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababababe9e9e9d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1cbcbcbccccccababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababe9e9e9d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1cbcbccccccababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabababe9e9d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1ccccccccabababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffababe9e9d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2ccccccccababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababababababffabe9e9d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2ccccccababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababffffffababababababffabe9d2d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2ccccabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % ababababababababffffababffe9d2d2d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2 % d2d2d2d2d2d2d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2ccabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffabababababababababababab % abababababababababababababababababababababababababababababababababababababababff % ffababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffabababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababffffababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffabababababababababababab % ababababababababababababababc8c8c8c8c8c8c8ababababababababababababababababababab % abababababababffffababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababababababc8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8abababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababababababc8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8ababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababababc8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8ababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababababc8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8abababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababababc8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8abababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababc8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8ababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababc8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8abab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababc8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8abab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababc8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8ab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababc7c8c7c8c7c8c7 % c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7 % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababc7c8c7c8c7c8c7c8 % c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8 % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababc8c7c8c7c8c7c8c7 % c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7 % c8ababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababc8c7c8c7c8c7c8c7c8 % c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8 % c7c8abababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababc7c8c7c8c7c8c7c8c7 % c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7 % c8c7abababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabc7c8c7c8c7c8c7c8c7c8 % c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8 % c7c8c7ababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabc8c7c8c7c8c7c8c7c8c7 % c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7 % c8c7c8ababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc8c7c8c7c8c7c8c7c8c7c8 % c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8 % c7c8c7c8abababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc8c8c7c8c7c8c7c8c7c8c7 % c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7 % c8c7c8c7c8ababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc8c7c8c7c8c7c8c7c8c7c8 % c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c7c8c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8 % c7c8c7c8c7ababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc8c8c7c8c7c8c7c8c7c8c7 % c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7c8c782c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7 % c8c7c8c7c8dbabababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc8c7c8c7c8c7c8c7c8c7c8 % c7c8c8c8c8c8c8c8c8c8c8c8c8c8c8c7c8c7828282c7c8c7c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7c8 % c7c8c7c8c7ababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9c8c8c8c8c8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c8c88383838383838383c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 % c8c8c8c8dbababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cac8c8c8c8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c8c88383838383838383838383c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 % c8c8c8dbabababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacac8c8c8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c8c8c883838383838383838383838383c8c8c8c8c8c8c8c8c8c8c8c8c8c8 % c8c8c8dbabababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacac8c8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c8c882828283838383838383838383838382c8c8c8c8c8c8c8c8c8c8c8c8c8 % c8c8dbdbabababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacac8c8c8c8c8c8 % c8c8c8c8c8c8c8c8c8c882838283838383838383838383838383838283c8c8c8c8c8c8c8c8c8c8c8 % c8c8dbababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacac8c8c8c8c8 % c8c8c8c8c8c8c8c882828282828283838383838383838383838382828282c8c8c8c8c8c8c8c8c8c8 % c8dbdbababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacacac8c8c8c8 % c8c8c8c8c8c88283828382838283838383838383838383838383838283828382c8c8c8c8c8c8c8c8 % dbdbabababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacacacac8c8c8 % c8c8c8c8c882828282828282828283838383838383838383838382828282828282c8c8c8c8c8c8c8 % dbdbabababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacacacacac8c8 % c8c8c88382838283828382838283838383838383838383838383838283828382838283c8c8c8c8db % dbdbabababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacacacacacac8 % c8c882828282828282828282828283838383838383838383838382828282828282828282c8c8c8db % dbababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacacacacacaca % c883828382838283828382838283838383838383838383838383838283828382838283828382dbdb % dbababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffc9cacacacacacacacacaca % 8383828282828282828282828282838383838383838383838383828282828282828282828282dbdb % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabc9c9c9c9c9c9c9c9c9c9 % c9828383838383838383838383838282828282828282828282828383838383838383838383dbdbdb % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabc9c9c9c9c9c9c9c9c9c9 % c9828383838383838383838383838282828282828282828282828383838383838383838383dbdbab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababc9c9c9c9c9c9c9c9c9 % c98283838383838383838383838382828282828282828282828283838383838383838383dbdbabab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababc9c9c9c9c9c9c9c9c9 % c9c983838383838383838383838382828282828282828282828283838383838383838383dbdbabab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababc9c9c9c9c9c9c9c9 % c9c9838383838383838383838383828282828282828282828282838383838383838383dbdbdbabab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababc9c9c9c9c9c9c9 % c9c9838383838383838383838383828282828282828282828282838383838383838383dbdbababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababc9c9c9c9c9c9c9 % c9c9838383838383838383838383828282828282828282828282838383838383838383dbdbababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababc9c9c9c9c9c9 % c9c9c983838383838383838383838282828282828282828282828383838383838383dbdbabababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababc9c9c9c9c9c9 % c9c9c983838383838383838383838282828282828282828282828383838383838383dbdbabababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababc9c9c9c9c9 % c9c9c9838383838383838383838382828282828282828282828283838383838383dbdbababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababc9c9c9c9c9 % c9c9c9c98383838383838383838382828282828282828282828283838383838383dbdbababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababababc9c9c9c9 % c9c9c9c983838383838383838383828282828282828282828282838383838383dbdbabababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababababcacaca % cacac9c9c9828282828282828282838383838383838383838383828282828282dbdbabababababff % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababababababcaca % cacac9c9c98382838283828382838383838383838383838383838382838283dbdbababababababab % ffababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffabababababababababcaca % cacac9c9c98282828282828282828383838383838383838383838282828282dbdbababababababab % abffabababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababffffababababababababababab % cacac9c9c9c9828382838283828383838383838383838383838383828382dbdbabababababababab % ababffababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababc9c9c9828282828282828283838383838383838383838382828282dbababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababab8283828382838283838383838383838383838383838283dbabababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababffababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababffabababababababababababababababababababababababababababababab % ababababab296262 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababffababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab2962a9 % a9a962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab29a9a9 % 292962ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab292929 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a9ababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababab296262 % 2962a929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929296262 % 2929626262626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262626262a929626262626262 % 62626262626262a9 % 29a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9 %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 435 string def gsave 201.6 276.6 translate 208.8 208.8 scale 435 435 8 [ 435 0 0 -435 0 435 ] { picstr readstring } image 800080008000cd000000e3d6019d5680d680d68fd6015656e2d6019d007f 00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d 5656d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d32d69dd6 9dd69dd69dd69dd69dd69dd69dd69d56d6d69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d9d9d000300d69dd6e59d0256d6d680 9d809d919d035656d6d6e49d0156000200d6d6e49d0156d6809d809d8f9d 0156d6e49d02569d007f00d69dd69d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d567f9d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d567f9d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d562b9d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d56fb9d0156007f00d6d6 9d9d9d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d7f569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d7f569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d32569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d9d9dd69d569d000600d69dd69d569d800080008000db 0006d6d69d9d9d56000700d6d69d9d9d560080d680d680d6ddd60700d69d d69d569d007f00d69dd69d569d00d6d69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9dd6d69dd6 9dd6329dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69d00d6d69d9d9d56000800d6d69d9d 9d5600d6ea9d0156d6809d809da89d0156d6e99d0256d6d6eb9d085600d6 9dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d809da99d02 56d6d6eb9d025656d6fc9df200fd9d09565600d6d69d9d9d56000800d6d6 9d9d9d5600d6eb9d025656d6ee9dfc00cc9d0200009df900ed9d0500009d 9d0000f99d010000d99d010000ed9d010000809ddd9d025656d6e99d0656 d6d69d9d9d00f49d0000fc9d085600d69dd69d569d000900d69dd69d569d 00d6d6eb9d0256d6d6f19dfd00039d9d0000ce9d0500009d9d0000e89d05 00009d9d0000f99d010000d99d010000ec9d010000809ddd9d0256d6d6eb 9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d6 9d9d9d5600d6eb9d025656d6f19d010000fc9d010000cf9d0600009d9d9d 0000e99d010000f59d010000c29d010000809dde9d025656d6e99d0656d6 d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d 00d6d6eb9d0256d6d6f39d010000f69dfc00fd9d0800009d00009d000000 fc9dfc00fd9d0600009d00009d9dfc00f99d0600009d9d9d0000f99d0900 009d9d9d00009d9d9dfc00fd9d1100009d9d00009d9d9d0000009d00009d 9d9dfc00fc9dfc00fd9d0500009d000000fa9d010000fc9d0700009d0000 9d9d9dfc00109d9d00009d9d00009d9d00009d9d9d0000809dde9d0256d6 d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800 d6d69d9d9d5600d6eb9d025656d6f29d010000f79d1b00009d9d00009d9d 0000009d0000009d00009d9d00009d9d00009d9dfb00069d00009d9d0000 fa9d0600009d9d9d0000f99d3800009d9d9d00009d9d00009d9d00009d9d 00009d9d00009d9d00009d9d0000009d9d00009d9d00009d9d00009d9d00 009d9d0000009d9d0000fb9d010000fc9d1c00009d00009d9d00009d9d00 009d00009d9d00009d9d00009d9d9d0000809ddf9d025656d6e99d0656d6 d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b00d69dd69d569d 00d6d69d9df000fd9d0256d6d6f49d010000f29d1900009d9d00009d9d00 009d9d00009d00009d9d9d00009d9d0000f89d010000fb9d010000fc9df9 00029d0000fc9d1400009d00009d9d9d00009d00009d9d9d00009d0000fc 9d0900009d00009d9d9d0000fa9d0a00009d9d00009d9d9d0000fb9d2200 009d9d9d00009d9d00009d00009d9d9d00009d00009d9d00009d9d00009d 9d9d0000809dde9d0256d6d6f99dfc00f69d025656d6fc9d0000f49d0d00 009d9d565600d6d69d9d9d56000c00d6d69d9d9d5600d69d9d9d00f29d05 009d9d5656d6f39d010000f69dfb000d9d9d00009d9d00009d9d00009d9d fa00039d9d0000fb9dfb00fa9d0600009d9d9d0000f99d0a00009d9d9d00 009d9d0000fa9d1000009d9d00009d9d00009d9d9d00009d9dfa00fd9dfb 00089d9d00009d9d9d0000fa9d0b00009d9d00009d9d00009d9dfa000a9d 9d00009d0000009d0000fc9d010000809ddf9d025656d6f89d04009d9d00 00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00 d69dd69d569d00d6d69d9d00f29d0600009d9d56d6d6f49d010000f79d14 00009d9d00009d9d00009d9d00009d9d00009d0000f99d010000fc9d0500 009d9d0000fa9d0600009d9d9d0000f99d0900009d9d9d00009d0000f99d 0800009d9d00009d0000fc9d0400009d0000f99d0e00009d9d00009d9d00 009d9d9d0000fa9d0c00009d9d00009d9d00009d0000f99d0800009d009d 009d0000fc9d010000809dde9d0256d6d6f99d04009d9d0000f79d025656 d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00d6d69d9d9d56 00d69d9d9def00039d5656d6f39d010000fb9d1800009d00009d9d9d0000 9d9d00009d9d00009d9d00009d0000f99d0b00009d9d9d00009d9d9d0000 fa9d0600009d9d9d0000fa9d1a00009d9d9d00009d9d00009d9d9d00009d 9d00009d9d00009d0000fc9d0400009d0000fa9d0f00009d9d9d00009d9d 00009d9d9d0000f99d0b009d00009d9d9d00009d0000f99dfc00039d0000 00fb9d010000809ddf9d025656d6f89dfb00f69d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6fc9df100 049d9d56d6d6f39d2600009d9d0000009d9d00009d9d00009d9d00009d9d 00009d9d00009d9d00009d9d00009d9d0000fc9d0500009d9d0000f99d05 00009d9d0000f99d3800009d9d0000009d9d00009d9d00009d9d00009d9d 00009d9d00009d9d0000009d9d00009d9d00009d9d00009d9d00009d9d00 009d9d9d0000f89dfd00fd9d0900009d9d00009d9d0000fc9d0500009d9d 0000fb9d010000809ddd9d0256d6d6f89dfc00f79d025656d6fc9d0000f4 9d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d0256 56d6f19dfc00fb9dfd00109d00009d00009d9d00009d9d00009d9d9dfc00 fd9d010000fb9dfd00029d0000fa9d0300009d9df900fd9dfd00059d0000 9d9d9dfc00fd9d1100009d9d00009d9d9d0000009d00009d9d9dfc00fc9d fd000a9d00009d00009d9d9d0000f89d010000fc9d0400009d9d9dfc00fb 9d0500009d9d0000fb9d010000809dde9d025656d6e99d0656d6d69d9d9d 00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6eb 9d0256d6d6ba9d010000979d010000809ddc9d0256d6d6eb9d025656d6fc 9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6 eb9d025656d6b99d010000989d010000809ddc9d025656d6e99d0656d6d6 9d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00 d6d6eb9d0256d6d6b99d0100009a9d010000809dda9d0256d6d6eb9d0256 56d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d 5600d6eb9d025656d6809d809da99d025656d6e99d0556d6d69d9d9df100 fd9d085600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d680 9d809da99d0256d6d6eb9d025656d6fa9df3000b9d9d565600d6d69d9d9d 56000800d6d69d9d9d5600d6eb9d025656d6809d809da99d025656d6e99d 0256d6d6eb9d085600d69dd69d569d007f00d69dd69d569d00d69d9d569d 569d569d569d569d569d569d569d569d569d56d6569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d567f9d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d567f9d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d56d6569d569d56329d569d569d569d569d569d569d569d56 9d5656d69d569d569d569d569d569d569d569d569d569d569d565600d6d6 9d9d9d560008009d569d9d9d56009de956009d80568056a756009de85600 9de9560700d69dd69d569d000000fb56009d800080008000db0001d6d6fc 56ff000000fcd6029d5656805480548054dd540200d69dfcd6ff000700d6 d6d69d569d56805480548054dd540700d6d69dd6d6d6000700d6d69d9d9d 5656805480548054dd540700d69dd69d569d000700d69dd69d569d568054 80548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054 dd540700d69dd69d569d000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd54 0700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69d d69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d56 000700d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d6 9dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d 5656805480548054dd540700d69dd69d569d000700d69dd69d569d568054 80548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054 dd540700d69dd69d569d000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656ae548000 00008054b0540700d69dd69d569d000700d69dd69d569d56ae5400008054 00008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae5401000081 5400008054b1540700d69dd69d569d000700d69dd69d569d56ae54020054 00825400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae5403 00545400835400008054b1540700d69dd69d569d000700d69dd69d569d56 ae54040054545400845400008054b1540700d6d69d9d9d56000700d6d69d 9d9d5656ae540000fc540000855400008054b1540700d69dd69d569d0007 00d69dd69d569d56ae540000fb540000865400008054b1540700d6d69d9d 9d56000700d6d69d9d9d5656ae540000fa540000875400008054b1540700 d69dd69d569d000700d69dd69d569d56ae540000f9540000885400008054 b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000f95400008854 00008054b1540700d69dd69d569d000700d69dd69d569d56ae540000f854 0000895400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 0000f75400008a5400008054b1540700d69dd69d569d000700d69dd69d56 9d56ae540000f65400008b5400008054b1540700d6d69d9d9d56000700d6 d69d9d9d5656ae540000f55400008c5400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000f45400008d5400008054b1540700d6d6 9d9d9d56000700d6d69d9d9d5656ae540000f35400008e5400008054b154 0700d69dd69d569d000700d69dd69d569d56ae540000f25400008f540000 8054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000f1540000 905400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 f0540000915400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656 ae540000f0540000915400008054b1540700d69dd69d569d000700d69dd6 9d569d56ae540000ef540000925400008054b1540700d6d69d9d9d560007 00d6d69d9d9d5656ae540000ee540000935400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed5492008054b1540700d6d69d9d 9d56000700d6d69d9d9d5656ae540000ed540000cb540016ca5400008054 b1540700d69dd69d569d000700d69dd69d569d56ae540000ed540000cb54 011634cb5400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae 540000ed540000cc540316333333cc5400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000ed540000cc540317333433cc54000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000cd 5405171633333433cd5400008054b1540700d69dd69d569d000700d69dd6 9d569d56ae540000ed540000cd5405161733343334cd5400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ce54fd16fb 33ce5400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000cf540916171634333433343334cf5400008054b1540700d6d6 9d9d9d56000700d6d69d9d9d5656ae540000ed540000cf54091616173333 3334333333cf5400008054b1540700d69dd69d569d000700d69dd69d569d 56ae540000ed540000d0540b171617163433343334333433d05400008054 b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000d054 fc16f833d05400008054b1540700d69dd69d569d000700d69dd69d569d56 ae540000ed540000d1540d1617161716343334333433343334d154000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000d1 540d1716161634333333343333333433d15400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000d2540f17161716173334 333433343334333433d25400008054b1540700d6d69d9d9d56000700d6d6 9d9d9d5656ae540000ed540000d354fa16f433d35400008054b1540700d6 9dd69d569d000700d69dd69d569d56ae540000ed540000d3541116171617 1617333433343334333433343334d35400008054b1540700d6d69d9d9d56 000700d6d69d9d9d5656ae540000ed540000d454fd161017161616343333 33343333333433333334d45400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000d4541317161716171634333433343334 33343334333433d45400008054b1540700d6d69d9d9d56000700d6d69d9d 9d5656ae540000ed540000d554f916f133d55400008054b1540700d69dd6 9d569d000700d69dd69d569d56ae540000ed540000d65416171617161716 1716343334333433343334333433343334d55400008054b1540700d6d69d 9d9d56000700d6d69d9d9d5656ae540000ed540000d65417161716161617 161633343333333433333334333333343333d65400008054b1540700d69d d69d569d000700d69dd69d569d56ae540000ed540000d754191617161716 171617163433343334333433343334333433343334d75400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000d754f816ee 33d75400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000d8541b17161716171617161733343334333433343334333433 343334333433d85400008054b1540700d6d69d9d9d56000700d6d69d9d9d 5656ae540000ed540000d854fd1618171616161716333334333333343333 33343333333433333334d85400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000d9541d16171617161716171617333433 3433343334333433343334333433343334d95400008054b1540700d6d69d 9d9d56000700d6d69d9d9d5656ae540000ed540000da54f516ec33d95400 008054b1540700d69dd69d569d000700d69dd69d569d56ae540000ed5400 00da541f1716171617161716171634333433343334333433343334333433 343334333433da5400008054b1540700d6d69d9d9d56000700d6d69d9d9d 5656ae540000ed540000db54211616171616161716161617333333343333 3334333333343333333433333334333333db5400008054b1540700d69dd6 9d569d000700d69dd69d569d56ae540000ed540000db5421161716171617 16171617163433343334333433343334333433343334333433343334db54 00008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed54 0000dc54f416e833dc5400008054b1540700d69dd69d569d000700d69dd6 9d569d56ae540000ed540000dc5423171617161716171617161716343334 333433343334333433343334333433343334333433dc5400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000dd54251716 161617161616171616163433333334333333343333333433333334333333 343333333433dd5400008054b1540700d69dd69d569d000700d69dd69d56 9d56ae540000ed540000de54271716171617161716171617161733343334 3334333433343334333433343334333433343334333433de5400008054b1 540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000de54f3 16e533de5400008054b1540700d69dd69d569d000700d69dd69d569d56ae 540000ed540000df54291617161716171617161716171617333433343334 33343334333433343334333433343334333433343334df5400008054b154 0700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000df542916 161716161617161616171616163433333334333333343333333433333334 3333333433333334333333df5400008054b1540700d69dd69d569d000700 d69dd69d569d56ae540000ed540000e0542b171617161716171617161716 171634333433343334333433343334333433343334333433343334333433 3433e05400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 0000ed540000e054f216e233e05400008054b1540700d69dd69d569d0007 00d69dd69d569d56ae540000ed540000e1542d1617161716171617161716 171617163433343334333433343334333433343334333433343334333433 3433343334e15400008054b1540700d6d69d9d9d56000700d6d69d9d9d56 56ae540000ed540000e2542f161716161617161616171616161716163334 333333343333333433333334333333343333333433333334333333343333 e25400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 ed540000e2542f1716171617161716171617161716171634333433343334 33343334333433343334333433343334333433343334333433e254000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000e3 54f016de33e35400008054b1540700d69dd69d569d000700d69dd69d569d 56ae540000ed540000e35431161716171617161716171617161716173334 333433343334333433343334333433343334333433343334333433343334 3334e35400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 0000ed540000e454fd163017161616171616161716161617163333343333 333433333334333333343333333433333334333333343333333433333334 e45400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 ed540000e554341617161716171617161716171617161716173334333433 343334333433343334333433343334333433343334333433343334333433 e45400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000 ed540000e554ee16dc33e55400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000e6543717161716171617161716171617 161716171617333433343334333433343334333433343334333433343334 33343334333433343334333433e65400008054b1540700d6d69d9d9d5600 0700d6d69d9d9d5656ae540000ed540000e6543716171616161716161617 161616171616161733333334333333343333333433333334333333343333 33343333333433333334333333343333e65400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000e7543916171617161716 171617161716171617161716343334333433343334333433343334333433 343334333433343334333433343334333433343334e75400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000e754ed16d9 33e75400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000e8543b17161716171617161716171617161716171617163433 343334333433343334333433343334333433343334333433343334333433 3433343334333433e85400008054b1540700d6d69d9d9d56000700d6d69d 9d9d5656ae540000ed540000e9543c171616161716161617161616171616 16171616162e2d3333343333333433333334333333343333333433333334 33333334333333343333333433333334e85400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000e9543d16171617161716 1716171617161716171617162e2d2e2d2e33343334333433343334333433 34333433343334333433343334333433343334333433343334e954000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ea 54ee16f82dda33ea5400008054b1540700d69dd69d569d000700d69dd69d 569d56ae540000ed540000ea543f17161716171617161716171617161716 172d2e2d2e2d2e2d2e2d2e2d343334333433343334333433343334333433 343334333433343334333433343334333433ea5400008054b1540700d6d6 9d9d9d56000700d6d69d9d9d5656ae540000ed540000eb54411616171616 1617161616171616161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e33333334 333333343333333433333334333333343333333433333334333333343333 33eb5400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000eb5441161716171617161716171617161716172d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e3334333433343334333433343334333433343334 3334333433343334333433343334eb5400008054b1540700d6d69d9d9d56 000700d6d69d9d9d5656ae540000ed540000ec54f016ed2ddf33ec540000 8054b1540700d69dd69d569d000700d69dd69d569d56ae540000ed540000 ed5445161716171617161716171617161716172d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d3433343334333433343334333433343334333433 34333433343334333433343334ed5400008054b1540700d6d69d9d9d5600 0700d6d69d9d9d5656ae540000ed540000ed544517161616171616161716 16161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d33 343333333433333334333333343333333433333334333333343333333433 ed5400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 ed540000ee54471716171617161716171617161716172d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e333433343334333433343334 33343334333433343334333433343334333433ee5400008054b1540700d6 d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ee54f216e32de3 33ee5400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000ef544916171617161716171617161716172d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d34333433343334 33343334333433343334333433343334333433343334ef5400008054b154 0700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ef544916 1617161616171616161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e 2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e3333333433333334333333343333 33343333333433333334333333ef5400008054b1540700d69dd69d569d00 0700d69dd69d569d56ae540000ed540000f0544b17161716171617161716 1716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e333433343334333433343334333433343334333433 343334333433f05400008054b1540700d6d69d9d9d56000700d6d69d9d9d 5656ae540000ed540000f154f316d92de633f15400008054b1540700d69d d69d569d000700d69dd69d569d56ae540000ed540000f1544d1617161716 171617161716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d343334333433343334333433 34333433343334333433343334f15400008054b1540700d6d69d9d9d5600 0700d6d69d9d9d5656ae540000ed540000f2544f16171616161716161617 16162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d3334333333343333333433333334 33333334333333343333f25400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000f2544f17161716171617161716172d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e33343334333433343334333433343334 33343334333433f25400008054b1540700d6d69d9d9d56000700d6d69d9d 9d5656ae540000ed540000f354f516cf2dea33f35400008054b1540700d6 9dd69d569d000700d69dd69d569d56ae540000ed540000f4545217161716 171617161716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e33 34333433343334333433343334333433343334f35400008054b1540700d6 d69d9d9d56000700d6d69d9d9d5656ae540000ed540000f454fd16501716 16161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e33 33333433333334333333343333333433333334f45400008054b1540700d6 9dd69d569d000700d69dd69d569d56ae540000ed540000f5545516171617 1617161716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d34333433343334333433343334333433343334f55400008054b154 0700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000f554f716 c52dee33f55400008054b1540700d69dd69d569d000700d69dd69d569d56 ae540000ed540000f654571716171617161716172d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e3334333433343334 333433343334333433f65400008054b1540700d6d69d9d9d56000700d6d6 9d9d9d5656ae540000ed540000f6545716171616161716162d2e2d2d2d2e 2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d3334 3333333433333334333333343333f65400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000ed540000f75459161716171617162e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d343334333433343334333433343334f75400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000f854f916ba 2df233f75400008054b1540700d69dd69d569d000700d69dd69d569d56ae 540000ed540000f8545b1716171617162e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e33 343334333433343334333433f85400008054b1540700d6d69d9d9d560007 00d6d69d9d9d5656ae540000ed540000f9545d1716161617162d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e 2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e33333334333333343333333433f95400008054b1 540700d69dd69d569d000700d69dd69d569d56ae540000ed540000f9545d 16171617162e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d34333433343334 33343334f95400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656 ae540000ed540000fa54fb16b02df533fa5400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000fa545f171617162e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e333433343334333433fa 5400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed 540000fb5461161617162d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d333433333334333333fb5400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000ed540000fc5463171617162e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d34333433343334 33fc5400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae5400 00ed540000fc54fd16a62df933fc5400008054b1540700d69dd69d569d00 0700d69dd69d569d56ae540000ed546d005454541617162e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e33343334 3334545454008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 80000100008054b1540700d69dd69d569d000700d69dd69d569d56ad54fb 00f2546d00545417162e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d343334335454008054b1540700 d6d69d9d9d56000700d6d69d9d9d5656a854fc00f65403005454169b2d04 33335454008054b1540700d69dd69d569d000700d69dd69d569d56a454fc 00fa546d0054162e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e333454008054b1540700 d6d69d9d9d56000700d6d69d9d9d5656a054fb006e5400162d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d2d2e2d2d2d34008054b1540700d69dd69d569d000700d69dd6 9d569d569b5492008054b0540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd54 0700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69d d69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d56 000700d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d6 9dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d 5656805480548054dd540700d69dd69d569d000700d69dd69d569d568054 80548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054 dd540700d69dd69d569d000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd54 0700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69d d69d569d000700d69dd69d569d568054a8549400a1540700d6d69d9d9d56 000700d6d69d9d9d56568054a8540000985402005454fc00a5540700d69d d69d569d000700d69dd69d569d568054a854000098540000fa54fc00a954 0700d6d69d9d9d56000700d6d69d9d9d56568054a85401000099540000f6 54fb00ae540700d69dd69d569d000700d69dd69d569d568054a854010000 99540000f154fc00b2540700d6d69d9d9d56000700d6d69d9d9d56568054 a854010000cb54f037de540000ed54fc00b6540700d69dd69d569d000700 d69dd69d569d568054a8548000fb00ba540700d6d69d9d9d56000700d6d6 9d9d9d56568054a85402005400ec54b637f8540000e5540000bb540700d6 9dd69d569d000700d69dd69d569d568054a85402005400ec544a38373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 3837373738373737383737f9540000e5540000bb540700d6d69d9d9d5600 0700d6d69d9d9d56568054a85402005400ed54b337fa540000e5540000bb 540700d69dd69d569d000700d69dd69d569d568054a85402005400ed54fd 374938373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837373738373737383737373837fa540000e5540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400ee54b137fb540000 e5540000bb540700d69dd69d569d000700d69dd69d569d568054a8540200 5400ef54fd374d3837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 37373738373737383737373837373738373737383737373837fc540000e5 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854020054 00ef54af37fc540000e5540000bb540700d69dd69d569d000700d69dd69d 569d568054a85402005400f0545637373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 3737383737373854545400e5540000bb540700d6d69d9d9d56000700d6d6 9d9d9d56568054a85402005400f054ad37fd540000e5540000bb540700d6 9dd69d569d000700d69dd69d569d568054a85402005400f1545737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737545400e5540000bb54 0700d6d69d9d9d56000700d6d69d9d9d56568054a85402005400f254a937 015400e5540000bb540700d69dd69d569d000700d69dd69d569d568054a8 5402005400f2545838373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837375400e5540000bb540700d6d69d9d9d56000700d6d69d9d9d56 568054a85402005400f354a7370000e5540000bb540700d69dd69d569d00 0700d69dd69d569d568054a85402005400f354fd37563837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 38373737383737373837373738373737383737e5540000bb540700d6d69d 9d9d56000700d6d69d9d9d56568054a85402005400f454a537e5540000bb 540700d69dd69d569d000700d69dd69d569d568054a85402005400f4545b 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 3837e6540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854 02005400f554a237e7540000bb540700d69dd69d569d000700d69dd69d56 9d568054a85402005400f6545e3737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738e7540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a85402005400f654a037e8540000bb54 0700d69dd69d569d000700d69dd69d569d568054a85402005400f7546137 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837373738e9540000bb540700d6d69d9d9d56000700d6d69d9d9d56 568054a85402005400f7549e37e9540000bb540700d69dd69d569d000700 d69dd69d569d568054a85402005400f85463383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 38373737383737373837373738373737383737373837373738373737ea54 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a85402005400 f8549b37eb540000bb540700d69dd69d569d000700d69dd69d569d568054 a85402005400f954fd376238373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 3738373737383737373837373738373737383737eb540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400fa549837ec540000 bb540700d69dd69d569d000700d69dd69d569d568054a85402005400fa54 683737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 37383737373837373738373737383737ed540000bb540700d6d69d9d9d56 000700d6d69d9d9d56568054a85402005400fb549637ed540000bb540700 d69dd69d569d000700d69dd69d569d568054a85402005400fb546a373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 3837373738373737383737373837ee540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a85402005400fc549437ee540000bb540700d69d d69d569d000700d69dd69d569d568054a85402005400fc546c3837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 3738373737383737373837373738ef540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a854050054005454549137f0540000bb540700d6 9dd69d569d000700d69dd69d569d568054a8547400540054543837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 3738373737383737373837373738373737f0540000bb540700d6d69d9d9d 56000700d6d69d9d9d56568054a8540400540054548f37f1540000bb5407 00d69dd69d569d000700d69dd69d569d568054a854760054005437373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737f2540000bb540700d6 d69d9d9d56000700d6d69d9d9d56568054a85403005400548d37f2540000 bb540700d69dd69d569d000700d69dd69d569d568054a854770054003737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837373738373737383737373837373738373737383737f3540000bb 540700d6d69d9d9d56000700d6d69d9d9d56568054a854020054008a37f4 540000bb540700d69dd69d569d000700d69dd69d569d568054a854780054 003837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 3737373837373738373737383737373837373738373737383737373837f4 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854020037 008937f5540000bb540700d69dd69d569d000700d69dd69d569d568054a8 547900360037373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 3737373837373738377d3738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 37373724f5540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054 a85402003500c137027c7c7dcc37f4540000bb540700d69dd69d569d0007 00d69dd69d569d568054a854780036003637373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 38373737383737373837373738373737387c7d7c7d7c7d7c383737373837 373738373737383737373837373738373737383737373837373738373737 3837373738373737383737373824f4540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a854040035003536c637087c7d7c7d7c7d7c7d7c d0370024f4540000bb540700d69dd69d569d000700d69dd69d569d568054 a85477003600363636373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737377d7c7d7c7d7c7d7c7d7c7d7c7d37373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383724f3540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8 540600350035363536cc370f7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7cd537 012424f3540000bb540700d69dd69d569d000700d69dd69d569d568054a8 5402003600fb36fd376b3837373738373737383737373837373738373737 3837373738373737383737373837373738373737383737373837377c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c3737383737373837373738373737 38373737383737373837373738373737383737373837373738373724f254 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a85408003500 353635363536d137157d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7cd937012424f2540000bb540700d69dd69d569d000700d69dd69d569d56 8054a85402003600f936fd37693837373738373737383737373837373738 373737383737373837373738373737383737373837373738377d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d37383737373837373738 3737373837373738373737383737373837373738373737383737372424f2 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8540a0035 003536353635363536d637fd7c187d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7ddd37012424f1540000bb540700d69dd69d569d0007 00d69dd69d569d568054a85402003600f736fd3766383737373837373738 3737373837373738373737383737373837373738373737383737377d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c38 373737383737373837373738373737383737373837373738373737383737 37242424f1540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054 a8540c00350035363536353635363536db37217d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7ce137fd24f15400 00bb540700d69dd69d569d000700d69dd69d569d568054a85402003600f5 36fd37633837373738373737383737373837373738373737383737373837 37373837377c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d3737373837373738373737383737373837 3737383737373837373738242424f0540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a8540e003500353635363536353635363536e037 277c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7ce537fd24f0540000bb540700d69dd69d569d00 0700d69dd69d569d568054a85402003600f336fd375d3837373738373737 3837373738373737383737373837373738377d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c373738373737383737373837373738373737383737373837fc24f054 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8540f003500 35363536353635363536353635e5372e7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7cea37fc24ef540000bb540700d69dd69d569d000700d69dd69d569d 568054a85402003600f2365e383737373837373738373737383737373837 373738373737387c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d373837 3737383737373837373738373737383737fc24ef540000bb540700d6d69d 9d9d56000700d6d69d9d9d56568054a85411003500353635363536353635 363536353635ea37347d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7dee37fc24ee540000bb540700d69dd69d569d000700d69dd69d569d56 8054a85402003600f0365b38373737383737373837373738373737383737 377d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c383737 37383737373837373738373737fc24ee540000bb540700d6d69d9d9d5600 0700d6d69d9d9d56568054a8541300350035363536353635363536353635 36353635ef373a7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7cf237fb24ee540000bb540700d69dd69d569d000700d69dd6 9d569d568054a85402003600ee365738373737383737373837373738377d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d3737373837373738373737fb24ed540000bb540700d6d69d9d9d5600 0700d6d69d9d9d56568054a8541500350035363536353635363536353635 363536353635f437407c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7cf637fb24ed540000bb540700d69dd69d 569d000700d69dd69d569d568054a85402003600ec365438373737383737 37387c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c37373837373738fa24ed540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a854170054003536353635363536 35363536353635363536353635f937467c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfa37fb 24ec540000bb540700d69dd69d569d000700d69dd69d569d568054a85402 005400ea3651383737377d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d373837fa24 ec540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8546900 5400353635363536353635363536353635363536353635363537377d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d37fa24eb540000bb540700d69dd69d56 9d000700d69dd69d569d568054a8540300540054e9364e7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7dfa24eb540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a854680054005436353635363536353635363536 353635363536353635367c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfa24 ea540000bb540700d69dd69d569d000700d69dd69d569d568054a8540400 54005454ea364d7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfa24ea5400 00bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8546800540054 5435363536353635363536353635363536353635363536357d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7dfb24e9540000bb540700d69dd69d569d000700 d69dd69d569d568054a85405005400545454ea364b7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7dfa24e9540000bb540700d6d69d9d9d56000700d6d69d9d 9d56568054a85402005400fc546035363536353635363536353635363536 35363536357d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24e8540000bb5407 00d69dd69d569d000700d69dd69d569d568054a85402005400fc54ea3649 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24e7540000bb540700d6d69d9d9d56 000700d6d69d9d9d56568054a85402005400fb545e363536353635363536 3536353635363536353635367c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7cfb24e754 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 fb54eb36487d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfb24e6540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400fa545c3536353635 363536353635363536353635363536357d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24 e6540000bb540700d69dd69d569d000700d69dd69d569d568054a8540200 5400fa54eb36467c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24e5540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400f9545a3635363536 3536353635363536353635363536357c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7dfb24e554 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 f854ec36447d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7dfb240000e5540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a85402005400f8545835363536353635 363536353635363536353635367c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb240000e5540000 bb540700d69dd69d569d000700d69dd69d569d568054a85402005400f754 ed36447d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7dfc24015400e5540000bb540700d6d69d9d9d 56000700d6d69d9d9d56568054a85402005400f754563635363536353635 3635363536353635363536357d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7cfb24015400e5540000bb54 0700d69dd69d569d000700d69dd69d569d568054a85402005400f654ed36 427c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7cfc2402545400e5540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a85402005400f654543536353635363536353635 36353635363536357d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb2402545400e5540000bb540700d69d d69d569d000700d69dd69d569d568054a85402005400f554ed36407d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7dfc24fd540000e5540000bb540700d6d69d9d9d56000700d6d69d9d9d 56568054a85402005400f454513536353635363536353635363536353635 367c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7dfb24fd540000e5540000bb540700d69dd69d569d000700d69d d69d569d568054a85402005400f454ed363e7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc24fc540000e55400 00bb540700d6d69d9d9d56000700d6d69d9d9d56568054a85402005400f3 544f3635363536353635363536353635363536357d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24fc540000e554 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 f354ee363d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7dfc24fb540000e5540000bb540700d6d69d9d9d56000700 d6d69d9d9d56568054a85402005400f2544e353635363536353635363536 3536353635367c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7cfc24fb540000e5540000bb540700d69dd69d569d000700 d69dd69d569d568054a85402005400f254ee363b7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc24fa540000e5540000 bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854ee004c363536 35363536353635363536353635367c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24f900e5540000bb540700d69dd69d 569d000700d69dd69d569d568054a85402005400f054ef36397c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24f8540000e6 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854020054 00f0544a35363536353635363536353635363536357d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7cfc24f7540000e7540000bb 540700d69dd69d569d000700d69dd69d569d568054a85402005400ef54f0 36387c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc 24f5540000e8540000bb540700d6d69d9d9d56000700d6d69d9d9d565680 54a85402005400ef544836353635363536353635363536353635367c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24f4540000e9 540000bb540700d69dd69d569d000700d69dd69d569d568054a854020054 00ee54f036367d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7dfc24f2540000ea540000bb540700d6d69d9d9d56000700d6d69d9d9d56 568054a85402005400ed54453635363536353635363536353635367c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7cfc24f1540000eb54 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 ed54f036347c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc24 ef540000ec540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054 a85402005400ec54433536353635363536353635363536357d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24ee540000ed540000bb5407 00d69dd69d569d000700d69dd69d569d568054a85402005400eb54f23637 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c242424ec540000 ee540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8540200 5400e854413536353635363536353635367c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c242424ea540000ef540000bb540700d69dd69d569d00 0700d69dd69d569d568054a85402005400e554f736347d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d2424e9540000ef540000bb540700d6d69d 9d9d56000700d6d69d9d9d56568054a754010000e254393536353635367c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d2424e7540000f0540000bb 540700d69dd69d569d000700d69dd69d569d568054a754010000df54fc36 317c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c24e5540000f1540000bb 540700d6d69d9d9d56000700d6d69d9d9d56568054a754010000dc543135 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c24e3540000f2540000bb5407 00d69dd69d569d000700d69dd69d569d568054a7540100008c540000f354 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a7540100008b 540000f4540000bb540700d69dd69d569d000700d69dd69d569d568054a7 540100008a540000f5540000bb540700d6d69d9d9d56000700d6d69d9d9d 56568054a75401000089540000f6540000bb540700d69dd69d569d000700 d69dd69d569d568054a75401000088540000f7540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a75401000087540000f8540000bb5407 00d69dd69d569d000700d69dd69d569d568054a75401000086540000f954 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a75401000085 540000fa540000bb540700d69dd69d569d000700d69dd69d569d568054a7 5401000085540000fa540000bb540700d6d69d9d9d56000700d6d69d9d9d 56568054a75401000084540000fb540000bb540700d69dd69d569d000700 d69dd69d569d568054a75401000083540000fc540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a7540100008254040054545400bb5407 00d69dd69d569d000700d69dd69d569d568054a754010000815403005454 00bb540700d6d69d9d9d56000700d6d69d9d9d56568054a7540100008054 02005400bb540700d69dd69d569d000700d69dd69d569d568054a7540100 00805402540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a6 548000fd00ba540700d69dd69d569d000700d69dd69d569d568054805480 54dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd5407 00d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d 9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d00 0700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d6 9d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d 56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480 548054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd 540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d6 9dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d 56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d000700 d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d 9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d5680 5480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054805480 54dd540700d69dd69d569d000700d69dd69d569d56805480548054dd5407 00d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd6 9d569d000700569d569d569d56805480548054dd540700d6d69d569d5600 0000fc56029d5656805480548054dd540200d69dfc56ff000000fcd60256 9d56805480548054dd540000fad6ff000700d6d6d69d9d56568054805480 54dd540200d69dfcd6ff000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56800080008000dc00 06d6d69d9d9d56000600d6d69d9d9d5680d680d680d6dad6059dd69d569d 007f00d69dd69d569dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6329d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69d9d9d56000200d6d6e49d0156d680 9d809d8f9d0156d6e49d02569d000300d69dd6e59d0256d6d6809d809d91 9d035656d6d6e49d0156007f00d6d69d569d569d569d569d569d569d569d 569d569d569d569d569d569d5656d6d6569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d7f569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d7f 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d32569d569d569d569d569d569d569d569d569d56d6d6 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d00 0100d6e25601d6d6805680568f5601d6d6e356ff00800080008000cd00 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/fig2.pdf0000644000175000001440000001567110616356704013325 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`d`a3tõ,-Í , °Z —|®@ PUendstream endobj 6 0 obj 57 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 4414>>stream xœíMrÛF†©Šsƒ8 ËEm³ò&Îd3«ØÊX¹/¢‹h”‹`2+p¡Ê̬½Ê&É,ÇWñC ÿh4úk¼K–HŠ@«_>x˜ ¸Qˆ¾»ŸO‘Z¯χ*³çSµÏý¸„¿\5ñÜ+D•Yý…‹jAŸF`€Jß”Ÿ>Ôžù¾ã‘EÆ?姇ֳÓ..uh7ÏÖ .c.BTzuž"‰fÐèÕyöÁ»ËRàëV¯Î3×.?võºˆï¨3{0<³ï¬`¿q)œ3ë:¼ª22<£,ÌŨÃTw0žªÛ?Œó¬]€Ê¡Y™ƒx:tC°ÜYtWÆ.rä©aÙæž:̃ü3ÔWfxvòì8x03&¡ x¦dvýfxÖÌÇ„Y©â|œrÇÜ9çͳzã8Õ3y:Úmd½É{:ˆ6Lé6y+ªFÖ_ëÐ]’ïP–Ø>¼{ÞHßx>x„Í3i6úYj¦ó ÌœnéhffÿðÝ(´ÌÚn™…òL?òd<ôÉÐfV‰ByÄmš›åꢨŸ•%ÉkQ¦­’[fÒ̪ûtDÏZ OƳAß4š2Å¡lÎìšÝnPfü¶$y-Öï–VyŸ ä9ŒŒ4³uߌè™)‘Û3ËVMÍÄÅÌL¹ÁÐL_‹-3ùÕ…Kf²gJfTÏôå>9<Ó7ƒÖÌŒi6¯è 123¿³ý)-©‹~/…Af²gÕ?S=3R3<ì©?8nsqάëŽÞ³ëoÃëð±þ•™Íï2=ŸÄÿVäø±z颸ºÎ¬Ú~"³ä9V¯Am3«Š ž¥ÏQÛo„gésÔŽÏàYúÀ3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~Dðì|‰Dök 0<;®=g« 0Q<[yÎòË,‚g+OZ~™-ïÙ~åYË/³(}¶ê´å—Y ÏÖ·ü2‹´ß¸âÄå—YÏÖœ¹ü2‹v|¶ÚÔå—Y,ÏY(bžYkîòË,šg«M^~™Å<߸Îìå—YDÏVš¾ü2‹{^ùË/³¨ž­2ùeûÿÏâÏ`~™Eöl…)Ì/³øÿO{óË,ºgÈl&«¼$ò$æ—Y|ÏbÏb~™­òº«¸¯ŸË.³5<›øÔ/ÿlœY˳i™½Þ…g8yVÞ qhœáäÙùUqAf¬<;_îĤÐòËŒgeqõ¬Ø…gøxV qW}¦‹–_fL<+‹ËëKq™bZ~™1ñ¬Å+qí³ ¢å—ÏΗÎ3ònH~™ñðìÚfM ºhùeÆÂ³²<+vóÀ&ž¯=öúÒôyã˜_f<«Ú¬>:›ÔhùeÆÀ³²þ÷Nº…Z~™1ð¬n3Ù³b7wœáàYÙôXßg×ÝÌp†ƒgu›õ{äFË/³ä=kÚL©3Aj´ü2Kݳsk–êY±›7ΤïYÙvØ]!÷Ù… Z~™%îYYØ=#˜–_f‰{Ö¶™^g‚Ðhùe–¶g·6SŽÎˆûŽùe–¶gå­¿î„Ög¢ØÍg÷¬k3›gÅnú8“¶geÿ¥Ùg£-¿ÌRö¬k3s¯‘Ðhùe–°geß]¯„Ùgc_’_f {Ö·™Ã³b7uœIÙ3©Í¬uV1F´ü2K׳óeгQ–_fÉzv–zëµ¥ËF¿6$¿ÌRõL¶Ìzt6Ú´ü2KÕ3¹Íœu&Æ4Z~™%êYYŒô¬ØMg’õ¬TzËÝg#DË/³4=SÚ̹×8®ÑòË,MÏ”6óÕ™-¿Ì’ôLm³ÏŠ}œIÓ³Rë,ýµ ú‡ß´ü2Kѳó…äÙ@£å—Y‚ž•ÚuUxCË/³=ÓÚÌ{t6¢ÑòË,=ÏJ½¯,¯¡¼6$¿Ì’óL·lŒgÞFË/³ä<ÓÛlLŸy-¿ÌRóLßgç™Ï´ü2KÍ3ýØÌùZÑÇhùe–˜gf›  í;æ—Ybž™m6ªÎ„§ÑòË,-Ï,m6Ö3g£å—YRž-]õÕåŘ>ÅŽ0Î$晥;ªþý|N£å—YJž™eö²ýübÔªì[Çü2KÉ3£Í¾ì¿þbr£å—YBž•zG½T®>ÜiÖÐòË,!Ïô6ûR»>Üj»±àLJžémöÒü–ÁZ³‰–_fÉx6dÙ¸VÛ[gòììë²þã…¿Ó,¢å—Y*žGX6¦ÕÌÐòË,ÏÔ6³tY·Õ¶Y"ž•#-nµÝ˜p&ÏÊ1]6êXÍ-¿ÌÒðìL°l¨ÕôÐòË, Ï”2óvY»Õ´ÐòË, Ïä6c™¿ÕvÃàLž•¤.>V»÷­Œ=ix&µÙhË|­–{f x&µÙÈ.ë±·šZ~™­ïÙdËÜ®í†À™<+'u™ÿXm70Î$àY¿Ï8Å2×äÎ?Î$àY×fä.ë1[Mj´ü2[Û³®Í&[foµ{ï8³¾gå¬.s«åœÙÊžµmöÕÇì­¶ó €3k{Ö–ÙŒ*“P[­-¿ÌÖõìÌ2³Õî=àÌÊž5¯y9§Ç<Çj÷îpfeÏÊ –é­¶s€3ëzV·Y˜.ë‘ZíÞ9άëÙ9¸ej«åšÙŠž•a»Ìr¬vïgÖôl!Ë”V»w €3kzV†ï²ž¶ÕòÌl5ÏÊå,“Zm—cfË{|‰T²ËlqÏšÐÔy»>õÏËZÖµÚ=<›¼"!çvÆr¹.“x!rÌlyÏú•‰[nÇ}¹¼em«íòË,’gÝ «öÇ/9.³~|ñïì2‹èY¿Ö+éÈ,²øžÙ¬ã˜<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ãÇf<‹ù§Yþì›ñ,Ú’¾®Hýçá×°Ï"fV‹å¶Ïbý)iéÉay3ˆ kØŒg+dÖ®8tnðÌÏ_Úõ»áÙÞÒH„ÌmCž%@˜Ü¶ãÙÞº¢{4›¾0;BÛñÌžÙ½ÉÉÝmE¾AùQ¶íY8ÍÄÍ4x gfáÞN(^f[ö,¨f­hð,¶Ì‚Zv3 žÑYXbe¶]Ïþ ÿy¯àY@¬™çžÄÌì¯%Þˆòž…ÃÈlË*îàY0ŒÌžQΆÀ³`è™-¤™¿Á³PX2[¢ÏúóŽöAùQ6êÙbšyÿ‹ ž‘02[Ȳ}A~”mz¶ fÂc<#¡d¶¤eÍÙ× ‚ü(›ôlYÍÜ¢Á3rf‹œc<#¡d¶øÚ¢Á3Rf Q>ì¡Á3RfËk&¡Á3}fË<ÏHt™E±LØEƒg$¤Ì"Xæ0 ž‘¸eK3«hðŒD—Y$Ë„í¼#<#ÑfO3›hðŒD›YŒc3÷ÙxF¢É,¦fÂ4 ž‘¨3‹jÙe¹Ì¶äYdÍŒÐà‰*³8g@<¦Á3mf±Y&³íxömtË íl<#Qg¶rhðŒÄ5³¿Å·L¨gCà‰ã·¿­ã™,<#q|ûϹ}öþ—)ûôF<£püæ_3={'Š_&< }6™«go‹–}_\ªË?¨ûïyðŒÂÕ³oŠbòÃß5‘—_‰ü´Dfòìú´ŸfÙûKÑ_~¡V»FÏæ¡yvùÌý­ã6‹­f‹ žÑÐ=Ÿ¹,ûžYa?V[4³zæ2í=íÄ–ëXÍ<£axf7ÒdòE?V[6³Ízf1ØdîV«"ƒgs±x¦›6Õ±[«©–Y"ƒg4lž©¦½£÷˜ëXmé̶ì™d}oѺ¼ðl>ÇýÑâYgÚŒ&3[Í¥<£qÍÌæYcÚÌ&SZ­9²lf÷¬2mÒ1™óXÍ<£Qý.ÓŸö»ÂYV]~ªºhfÛñlÿ§}’ßÇŠ žÑ¨7×.ZXÏ~®—¹lfòLüaŸæBöYí™=2xF£ù[vÑBn}›FxF£ý›.VÓ~½itDÏh´™-ÝhÞÈàÛß(³î;¾Ögq2Û–gvÑ‚yæÛðŒH÷77m4¿fðŒF—™U´@{Ž‘Á3ýß¶5ÚÃòÇfÍ ‚ü(›óÌnZF«#ûï3 )3[£Ù8֛ƙmÏ3›hÁ<{ƒ÷ó †’™eœslö@ð¾¹ÁPÞKË"Z€c•Ù¼?u8”Ì,6ÿ­ÝчgÁPßr‰F«ÛÌŸ <#¡½«iÚÜsŽ·c3x -³ðÖ´< ˆþžâæ¾ã¼FëN[Á³`™ß1ϳ¶ÍàY@ôÌl6§Ïn›Fx#3S´9{Ž]dð,Gã–·Ïfmo– ÏBaxf1mzh]› o0ðŒ„%3£Ñ¦Ÿsì7— <#aÉÌm²gJdžhà kf¡MÞ46+s "ȲeÏ Ñ&î9ê‘9Ãg$¬™é¦M<ç¨m›ÕÙäGÙ´gaÍ™#xFž™¾ï8霣¹ilVhDeÛžé¦Mõlä/OÃ3®Ì„êÚ„sŽŽÈl Á3žÌ„dÛ„=ÇŸÆÿ¶<£qô7ÛèGgd–ˆà¡ÌDc9´Ÿ ¯õ†g4Fdvåê9G_dFHðŒÆ¸Ì‚¯uï¾6y™ðláÕî]W¦/ž-½Þ½ýëK„g‹¯xoûrÎáÙòkÞ›_ÍZ<‹°ê½þżÅÁ³ëÞ«Ÿg. žEYù^þ4wað,ÊÊÃfÏ¢¬}ßÿ;{Yð,Òê÷žQY9³:/xFcí̪ÀàÕ3øoWÂrà»!lÇ3ËoÆD'̳f;žåÆ<ËxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆÞ³NðŒ•gפ®žýx½öÏpõìtýTo…x„g 8~¬?}]göŒ>ã@Õg¢É ûLÀ~#?p|ÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆók ¢yö¸öxÀTϾ{Æ…ÃEòÌÉéÑw/Xÿ”wžùàç$üSÞzvzp^® xtߋ˗Go"µgÞØ¯™…|a¦üêàÆÿ0©ð endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000374 00000 n 0000006538 00000 n 0000000315 00000 n 0000000160 00000 n 0000000015 00000 n 0000000142 00000 n 0000000439 00000 n 0000000539 00000 n 0000000480 00000 n 0000000509 00000 n 0000005145 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 6704 %%EOF geomview-1.9.4/doc/figs/fig2.png0000644000175000001440000000775110616356716013343 00000000000000‰PNG  IHDR³³’3 µ6PLTE}}}777555333---ÖÖÖ|||VVVTTT888666444...$$$ûïËnIDATxœí‰V£JE}¶š´vøÿŸ} $P5­áTÍ¢;ƒ¡†ãæÆx:<>]œ/Χ‰<Ï”ŸÇÌÎöeÜ€ãy.òËÅ9ãç1³ñ†ÇHN.ž)¿Lž¹¾‚‘åÆ=å——g.ËÚ˳ÒᲜG½fÏJ¹’@&½–YŽcɽž7l˜<ÔO´œ£gvëÙžƒ²ëÌÚŽõ/&Ïb6@Žbf S¯dããž]Lß ÏDsÕÒÓçù‰àí[7U=Æ™žÑÆ0Þ9àÙI›ÝܯÌ $4gêcðlš³2¾Äú:퉣sŽYœgãÎq¯gêt<÷rã.ï|z…©<¦îEõÈ–{Ë æûÚÚOj'ô/TWŒÐ²y¦ÌÆ2K§y¦•Ç”Gæn33¯®çÍèM¢e&åÙú¼û¼ùnXOÆjfueÔW,ÎÌ"©/Ðþ×¶¤¶¢mlÕ$ZfÊÌêGe‘ž­Ù~7¬w[tôÝ™Y³óù¼ñù›Fݢ髕&µï†ÚQfö¤w8Ò3}³cºVÏ ;0=“€]£öÀF³u+¦ÌÔ/”ÌTÏ´Çz¶Ù9Z<[ï™m¦y{g½‘MfÛ¯|ŽÒúi9JÈLõlµsŒêÙÑÚË Ã³¯Å³èÐÚË Ã³áUÎvˆÖ^fž ªg±­½Ì <ûºköû¬gÑ;Çö2CðìaÙ×ÇìYdhíeàÙ0¨å,º¤µ—€gÃÚ³¸ŠÖ^fõ{vwL¯gq¡µ—Yýž}éGÑ­½Ìª÷lØ–³¸ŠÖ^fµ{6Y¶ö,fçØ^fµ{6Ö²ûú¡Õ³ÑÚˬrÏ‹g¦µ—Yåž ærSÑÚˬnÏ^–}­-‹8vl/³º={ž›MïY­G:€Låž .ÏBCk/³š=¶õ,¸¢µ—YÍž}Ù#*Z{™UìÙ«–-ïY¯»;€LÕž >ÏÂ*Z{™ÕëÙà)g¡%­½ÌêõìËïY§™UëÙ\ËÖ?;ÓÖ@¦^ÏTËŒggÁ¦µ—Y­ž !å,¨¢µ—Y¥ž ¡žùÛˬRÏ”s3g= ­½ÌêôL³ÌzÔVÑÚˬNφÐr Z{™UéÙ㙯¢µ—YžiµÌð^õßdêôì+γî2«Ð³aˆ)gÞ’Ö^fz¶²ÌyvPÑÚˬ>ÏôZf~/Èzí2z¶¶,Ä3çα½Ìªól]ÍB꙳¢µ—Ymžm, òÌeZ{™ÕæÙúÜÌú^às´ö2«Ì³­eÞ³3ß±c{™UæÙ¶š•3WEk/³º<3T³PϬ¡µ—YUžmjÙ}ý÷'¨žÙwŽíeV•gËþý¹/‡*Z{™ÕäÙ¶–ýyr¤¤µ—YMžm,ûóo^öW´ö2«È³M-»GõgYjZp©Ê3‡eU-¸ÈÔä™­–)ìªhíeVg>˪Z`cÈT䙳–-«§¦6†L=ž…XRÕÂ:€L=žykY`U ë2Õxj™¿ªu™j< ªeAçjA@¦Ïb,óUµ S‰gáµ,¤ªt™J<‹µÌ]Õ:€LžÅÕ2ÿ¹š¿ÈÔáÙË\UÍßdªð,¾–ùªš·ÈÔàÙnËì®y;€L ží«eîs5_©À³c–ÙŽ =@¦Ïö×2WUót™òž·Ì\ÕÜ@¦¼gÇjÙ빚»È÷L}ãÁÅVÑÚˬ¬gÇK™µª9;€LiÏä,ÛV5W)ìÙTËÕ1}5½7¤½ÌŠz&kÙºª9:€LYÏk™±ªÙ;€LYÏä-Ó«š½ÈõL¸–-«þÞö2+çY"Ë´ªfë2%=KPË6UÍÖd z–Ð2¥ªY:€LÏŠ#?¦¢dðìj˜·Ó£š%µl®jôlCZn÷› k™VÖZÌ,½gKcsn§kËžU­ÁÌ2y678wJs^f\ÛË,£gK«<9@vÏÈaÊxFŽ@Ïð gxÐ3<èô z†=ÞáAÏð gxÐ3<èô z†=ÞáAÏð gxÐ3<èô z†=ÞáAÏð gxÐ3<èô z†=ÞáAÏð gxÐ3<èô z†=ÞáAÏð gxÐ3<èô z†=ãϤ?|ÕEê¡ôâY¶O¸=­?ã\¾…n<ËÜPÂÜúñ,Whê_H\?žÈìÙ°tÓôÌÍûŠ€†ŒKæÖ‘g 4”n<3…¬=ÚÏÒ«"CéÆ3ó„ý½Ï¶Ð:7äê„ÈPúöLN³Ù4z&†539Ó^ ¹:!2”®=Õì)=Ô™¨e/Óè™–ÌäE£gb2“¶ì¾^é™ ÆÌRˆFÏÄØf&oÙ=c“YËFÓè™›ÌRXö7Sfz–H³÷wz&†!³T¦¹:!2”N=K¦Y–Ìúô,™eóuGs'D†Ò§g 5s™FÏ¢Ð2KiÙt5ÄÖ ‘¡téYZÍì¢Ñ³(ÔÌÒZæ0žE¡e–k'D†Ò¡gÉ-³†FÏ¢P2K¯™-4zÅ’YËlWCèYsfY,³ˆFÏ¢P2ËQÏ̦ѳ(^™åÒ,ify–˲wÓuGzÅ3³\’=0uBd(y–Ï2ÓÕzÅ”Y&Ã^l;!2”®<ËjYÂÌzò,] ›Nˆ ¥'ÏÌ9f=‹â™YnÖJGžå·ìï*4zŘY ôNˆ ¥#Ï Xöþ7If½xö^È354zÅéçp={Ûõº›Ú ™¡tãÙG=ûþ~Ûó2­2CéȳŸ–Ìë÷Û¸D¿î¦uBf(yößÏ.¿Fž‘½}Ǿ0Ifyö³×´·oe‰zíMï„ÌPºòlŸi÷ ¾Õ5Ʋ4™uåÙÓ¾ß6Kðko«NÈ ¥3Ï¢MÛQÕn‰2ë̳HÓÌ‘=ªZй=;ÂìYŒizÓךѳ8Ï‚M³:x®vK–Yžšæ‹Ì[ÕÒeÖ¡g!¦yóž«m#£gqhžùM³×±àsµ„™ué™Ç´ Ç<çj7zv”•gÿ¹‹ ÍbÙ&2zÇÚ³ßüˆÅx$efzf3-°Ž}{ÎÕŒ‘ѳ86ž™M‹vìÛ|®–6³n=3˜¶3°mU»Ñ3 ž­MÛØTÕtË ‘ѳ8Lžé¦í¨c¶sµÔ™õì™bÚ1Çæäë =àt5y6›&Ù«ªÙ"£gqÜ33y6™&ØTÕ¦+ i3ëܳ‡i똾:"£gq<~—É,Ú e%Cfýxv5{ö“-2zÇø»¹9<Ë‘YGž]-M´ž9"£gqLŸ5a-×®‘žÅñüL‹g»F{'D†Ò—gÉ+š32zÇë3ÊÌGŽbõ,Of}yfM¶š¹:!2”ÞCÚäY†s³©"CéÎ3³irÕŒgP %³d׳eÖŸg&ÑÄ?§ÌXÏ xÔ³gf¹@,ŠgV.ÎgIÜS>{æÚCËËÅ3åOÏ.öå2þ—œ‹;‘ѳ‹“OÏóDÏ”—> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hln¤g62³4×3S0Ö3µ473S0Ô3´´42¨¶PpÉç BpVæendstream endobj 6 0 obj 69 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 5500>>stream xœí½uܺ…qKy©#)t^KŽ˜ÜT†%ܬœ0’×R íÈõ¼áþ6~’ÀðlÙš’l}Hÿ, Ä_´úóãu§@ŽP¬tŸÏ“=Ÿ_ƒ?âšXß÷O¬t?¯ö\_Ã^ýk{.ÝÇ·™˜À»+¤çãÿØ?“+’ž£ciïgªq4=Ï{ñ܉W$=?aû~:}Y\Qô„Ú÷;nׯûÏ×@é¾8ôøëð»h¹‚íw¨tÓÎäГ•rGºýÊ0—άwßÄLK =nÊKZoÏ×tžoiµ¯Ðßx)Ý3-ÅôáCÓ#-éÈž(=†=S™ÖÐóæyÛ¶²è¹ªœžig{úµAíHmý¿IU¢Ç>t~óÑ3¯x&•sÓÖãol1žGϳYÄç7‡!ÔÎÕ¬Aúoülü!sé±ì™¶4é±ì1˜i JÉy&=vÂozèÇví¡ôL¿Jéq ²éé²b6j³ò©Ürõج‹={zÔžGÍ=ŠéAbz°bô˜K™µf)aÓ#—Jç£çÓ5çõõðk*«®.Ö„J§éyûø6ùt=@öê[`yW "´b¢gréñïm3¾ÎeêïçdÜÏyËõýGÔ”þ7_öûr³gâè¿?GÔ’Þü®ðÍöLu´`{ˆ®ö˜-ÓCu£ç“÷0=TLÓÅô@1=PLÓÅô@1=PLÓ£g˜_Æa×§SŒéÉlÏéŠÒ3Ò·g´'žëž6ÎûÛôrýx÷n¥Ò£w®Éùÿî¥çö{¤öL®œeG+¡gÒyìÉl¹È’ûW='³'—Y5ŸÄž zo–†ý€p÷ŸsAñ;ÓÅô@1=PLÓ¡çý°ÀŽÓwò>BÏ íy1Ê£ç»ýõ;׃°ìÁôœÞ¦‡Šébz ˜(¦Šé*¢G^½IS`Ãa\Vëszƒ »ïiVóåËà7iz=½Ø#P† ËõÊÀEË¥\óÏmI1=ëÝñ­©Ðeíu{~Õq‡óY.Þ-ë‹é!—ÙoÉ-ŸGzÑ]ŒF~Öz¹‰‘Ò¨R“šWñõU‘l$Ë=è«ýƒJϰÇÞÛ¬ȸÖÐ3Èâ ÷¿gÎÖX¯6¬=©ÿGbN‚ZäR°g°²$WÅ×Ñã\_7vkᲫӜÉ÷í}©’uô¯L’ ëÜzÍ©t{ÌÀܾ´î Ûs»ên—N_ K·G¸ ¹öè5A{¬ÀìYKÝ¡H~)h¢=VÉÂôeË³Ç ¬=º¤žÝÀ¹½^M­ìÑ»“Þh©O¥;ž‹G\0 `¹SDÏR’Ý€´(VMJÿld½ ›Úö«dŸ=¤N7ØóP4èêÆÓfÐZØS@m—ÓçAû!»øÜK?t½¡ÿäÁ†Ý2@Ñ-ü »z/G!œ#“ ôxe'lÎÓºo×˲Æ»wlaq©β =’pcYq}©m¬`–ÜßÅý=PLÓÅô@eÒó²w|‡+‡žó¹“CÏÙţà˜(¦Šébz ˜(¦Šébz ˜(¦Šébz ˜(¦*i û>T½Ë L­”tû Æ`±Åí1ƪ¢´Y@tnŽ99D‰³ È‘Bd$å2ð™ñÈj±¢\=uÍSâƒ9éÎã ¼´6–É´§R¢yʤG.ÑՀ㼮û3»Ã+$š§E¦7òÚ³lRu窔hž é1ÖøéY¶ZQËž:‰æ)½åòÚ£ì©X÷ÔI4OYÇ=êC¨j&ÕÃÝTÍéG̓(i Ôm½¢ëžv>ç ‹ÏØ¡˜(¦Šé‚ôl<ÿÊw7 =To¯¹_`˜žmC¼Íóî.Ú#ïÄ bôl8ðrãø.§O¿n¿ÅNy§£g'{žÄåQm'ˆFèiÙž=ÃaFd׈䫙÷抑@ÏÙíÉ£gÜ÷Ëë¨NR½²)ìzCóV×rèyºZVáì4D>=ÚžQŸÏ+{–»F½Ù#KOíQËô-’¥J°'‹ EÏ8Ðw~úO¯"[âÑïtÞ{².Oz "‰YîQÞŸ*qì±÷6ëÏ&ö¬R‚=±ãžÁ´ÇCIÀ¹½êXôÚó".2¿—<{*ô9G‚H9î,k–[²…eQz9o]Kì3ìQùì‘[;U³|_§j‘D)›š =òª ¶çQ“¹sÍŸ*UÍÞ ÒZ®R{„Ú©=4Ü|{êTÍ ÒZ®eºŠA¹ãÙ¹¨q¤å©=ÆAÙ%³î©Ør‚Hª{ŒŠÙ×€“%ªYÓ¸‘k>ª¹3ìù#s˵§ÞqO ˆÄã£íò7ì¤MÒÍ–Õ°¯µGe¶dTï¨سË9—u¤˜jÏÖªCÏ*ÉË\Ö=›Ó#/©š‹z±çàÞÂÖí9¸·°u{˜¦§,¦§2=¾AZôp6|¤fŒ-K³‡ô]ŒÂóvþ¼bÜ|uzho‹é«68Î/±G¦D“ôœ’V°§¸¿Ç-£ýÁ€èÀÿõšöÀ<‘*ô÷¨ròäI†ëØcïmúÌhp¦í\2i2zN…"ô  9¼.ßžý=Õ'ÿ-´‡¤c÷4gÖµ'vεÑ俉U³Uµ j¦J’,M=o'«AÉÝGMОeçªfêQ’-‚=ó’ºöÄ[®R{„9Ú¹ÈaL&kÓ£ó-k¼ÖÓ#æ«Oþ›oió^öDëó€"RÝàÉe9’ Õ·¬ºx§ª9á¸Ç°Èß°«÷BWÈvþÎÕƒ­ì¢í¼¬œª7컜s¹à7uÎµŽžU 0ß‹=›Óãg¾{¸¿çøº'Yëö0=LO$¦Ñ'=úhÉ:g(8€AôIÑ[x=-ÓÓ€=-ÓcôŽäÔKŸa©çÄ­ ¢Sz,{ä)±ïÿª z¥ÇèÎ1û7¬×UAôJÕ#h÷Ϥííi›Ú[èÒC>¯ ¢[zŒÎTÚc¹—=Ócø1ø«å-«æÆéqëâ}ö†éIѪ#ľéIÑÖö0=÷LO• î—ž*A0=0¦ÁôÀ :¥Çl–ÌS £{¬ðÀ°szí)nÜÀñm]ÝÒ3>=NEõêÛé¥üä‘,½Ó#ïB¤G•ŒP¥C è°ÃÔ“øîéªÇ™v8 ç-í÷Iß×z§çx{˜ž3Ò“äQïôÈi&d mUÍÔ·ÆN¢[zT£=zvAúY…©*ê5ì-Ó³µ:§gk1=IA0=0¦ÁôÀ ˜Óƒè”ž:S[¦§ÎÔ~è! öëLm›žÃ;S›¦çøÎÔ¶éÜß#skÒ¦‡é‰Ñ+=Çw¦¶MÏá©-Ó³µ:§gk1=IA0=0¦ÁôÀ ˜Óƒ`z`L ‚éAôJ<‘úqrf;ãÄ3V5#ˆNé1ÏØCý¨9ݧþ :¥gé´±ûuÌ·"±sÑ+=ÇÛÃôôM9]fØžz§Çªš½öduŸúƒè”§aسaÃÞ2=[«wz6Ó“Óƒ`z`L ‚éA0=0¦ÁôÀ ˜D¯ôß™Ú2= t¦¶LOVwØ û{Ž·‡é雞c;S›¦çøÎÔ–éi 3µez¶Vïôl,¦')¦ÁôÀ ˜Óƒ`z`=ÓS::%#ˆžé9Ö¦§mz.r‘ÿœky`ð|;¿y^jv²ŠüS¯èQî„ÏØ…zórÏ¿<µžr’}âÞ>=ÈŒþ² £u®NWgï†ÐCb{¦]GÝ‚,÷-5džXaO ˆèQ‘]½…Ë«ÐÝ_äÞuá¾Ö ¢zšõ;’·iú0ÿìÉñ(Dô`{èÕ,r P˜K”qÅUsØž£é™+CõÆÌ[ßÒ/?º_‘NÖ¢>ÕH-ÐíÙX öNÏ‘|Ý'ïÔ š §m{ާG<]æ—C;4—Ç@ éq]Ó˜VüJЬ8ïX9A$Ñ3%wyöør½uÅ [š=ùyGÂÈ "ž)±?济¢¸TOåÃ[Š=%yGÂÈ "JÏ ¨i˜c‹ÛS–w$Œ¬ bô¼È3ªöÜÚ¥—˜=…yGÂÈ "JÏo1Tµgj´ãô”å #+ˆ„ºg²¢=·¸Òêž’¼#ad‘Ôrý¾}¨dÏE&•Öråç #+ˆÄãžß™!>éA)†Ÿ.BϤ÷äæ ##ˆä£æßyöøÝ™"#Ç©GÍyyGÃÈ"¡åÚNñ–k­¡gûÎÔp`;v¦‚(¸¿‰{ ¡˜(¦Šébz ˜(¦Šébz  =v¤Èi¢ç¤ö\ô•S¦ÇÑEö@zÎW½ ‘NÛÃôbz ˜¨šôÈÛñÌ…£ûaû‰+«&=ú.=²ÛÓºQUéÑ›é>{À‚ÆTr£Ù0ßø:èŽÐ3èGË7¬êôXÓuš·,j{èÍÕ «*=·ß„}›§k°÷Ä&U¿î¹½›~A{–ýª7{Ö×=¸Çç‚â3v(¦ŠéÊ¥g¯;«ZÐËŸlzöÆÖ€.{¢ôDn »#½Ñóç$û×wŸ= ôœÃžk9KéÙcB‹ƒõ ¼ö$Ñs^{˜žYLÓÅô@1=PLÓÅô@1=P«èiýÃz­¢ç´öpÝ3‹ë(¦Šébz VÒc (¹…‹ Yݽ©\IÏæö˜_mÅžDz¶q'˜ìþÇYëè!Ó£QÈ£ÔG20Õót$²ÒIc Ï¯õåáyhýö¤ÓCì± OŸ°á<[ž<IÀ é¨Ö@BööÛÛ“~εØCG€ÑÄ;gmâ.´G‘Ñ‘xÁ„Ⱥ}ìI?çZc¹êØc¬ÓïÕ¶ÂÿÝ;¢‡Ž\u6¤£Z=#\Z¼Mz~¨aú­*®ùâ³Ç»½»apýaö$ÑóC:CÆOºU³Y*ßÓ‘Œ ÃU³½ûÐúìI§G ?•oí†Ý°Çût¤¥aì4F]~¡îX 6ìÍÑã=ç²âó…k/Ë.Re€jž±[f¾ã4ï±[Ni79ø «*=ÖƒÂ|Ï ó.Ë)mîÃÈÖ‰û{ ¸¿ª¯þžÝÕWÏî꪿guÕß³¿ºêïÙ_=õ÷ žú{POý=¨£þž=ì°ÕQϾÆÈÒvÓßs„?]ö÷ì§Þú{vVwý=ûŠû{ ¸¿Šébz ˜¨5ôœâVÿbzNáN1=GÄz„Šè9"ЃT@ÏÃq¥|zN&žý Šébz ˜¨,z½o%ÓsJw’é9§;©ô°øù\PLÓÅô@1=PLÓÅô@1=PLÓÅô@1=Pqz¬çùÇ/5<ªi•bô¨ÿjc„o{‡ŠÑ³ !Ùs¯ŠÒCFW껤¹qZ ĵﹹEë¹c‘±Ùž!ÜžûkîB -—s—€ç~ ï=w ¤ãy»šô¨··µ÷mOÂq¹ÙÊ|+_îØž´–+dÏ0Þ¹=iÇ=éUóÙ“xÔjØ…²HopOöð9WX|ÆÅô@1=PLÓÅô@Eè9Óˆx)zóQ„žÚcÜA¥ç7rz–=˜žÓÛÃôP1=PLÓÅô@1=PkèÉë l¸Lóc­Ïé_ &ì¾§Y…/O’r­¡§{è|Ør•3ZÀþfÀžLzÖ»ã[S¡sÚë¶#àŒð½„5k•¼f“3¯¥°× =C˜Ó¸hO.‚ÈKG‚>¯aPÛÑ‹ºÔ{o³ ¶'ž²y-õöž+AÃMÕ¼„Dì1/"ÑK‘&%{<ŸVÐ#“¥ØWþäVƆb¤ß%ÉRÆR%ëˆÝÆd[¯©¬-{ÌÀHJé‰Úã™×Rí\Yö7!×½ &h²§=¾y-—Åôxrté1Ê–gX5ztI=»r{= cmœ`0¯è/ßÈ숾‹§Â²  –—ÒS4¯%jiýŒ´ {‚U²ÏR§ìy(tuãi3h­_N(ž×RÇ'”kºa'ò”‡šÐ¬ud©{d0:rA °–ž ®ÞÏyZ÷í YV`X›x*=‰å]˘iO^â9Z›x*=絇é 'ÎôÀÄ™˜8Ó/¢‡Þ”iÞ߶žùÎtrojb ’—IÚ7:Ç/ Ç¸¥×Êf=ÎéN¬‡Ø“Kf†Þækd²Æ³ñ$%Nì!™Äϧþ•kѳÜà-È,5é±o &žOY ë\u粟™RÍßY¶ Ç¹sxuÕìLB]eϲ€N.`ԛгÕÎ¥&: OS©HšäbÎ œøÚº§~ÕlÑCÖÔ·Ç=$±´ºåÚ°aoÞ•Ç=Õ ÃUsu{rªæµGÍÔŸjöÈùlĸ=Y ;Ÿs…ç3v˜8Ó'ô¼}|czì¥=Wf®ôü;}fzÌ¥Wz>®¯ÓÎu}ùdzÌ¥?þÞ^¿ÜìáºÇ^:Õ=b±´\éw1Ø“—xŽÖ&žØreÜã•oOfâ9Z›xÚqOÎpÙöä&ž£µ‰óø(ßÅô@1=PQzÊfǺ#{xT|X<*Šébz ˜(¦Šébz ˜(¦Šébz ˜(ž; Ë¡ççѵ%‹ž¯GÇÓš z¾~òý£é ›øñ Vv/\:MOp ñŠVw®Xéfz®íVøçUàõ}ÿDJ7Ñó ~x}ߊ”îJ èÿV.f endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000386 00000 n 0000007636 00000 n 0000000327 00000 n 0000000172 00000 n 0000000015 00000 n 0000000154 00000 n 0000000451 00000 n 0000000551 00000 n 0000000492 00000 n 0000000521 00000 n 0000006243 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 7802 %%EOF geomview-1.9.4/doc/figs/myfilelist.png0000644000175000001440000001067410616356716014673 00000000000000‰PNG  IHDR2ïa¸5PLTE¯¯¯•••ÖÖÖdddVVVßßßZ[„õ_IDATxœíMo㬀¡ªÞ5,ªn«j”?P]uûªŠî¾ª¢l«Ñ(ûjåï_‡OÃÛØ¸½œL;qâ§ÁÆ!;‹û£‡ã¦nî‰Ü¿yq9¾máæ>Éý¯g7Çç-#ØÜAøñ?ñ'׎psÂÏa7ñKùù½—xS~žZçqˆ{ðó¹mOƽösüeÃ}¿~<»›3~ÞÒ ~…ø“ØÜÁúq>\ýøsøãNŸŸTâ¹x"~.ú½˜…<“€\?ÃæžÔ»»ç ê‡ÈŸxF~ôö2~į§»ú< ?÷#Hžî†ß„<ËŸj1ÏæÑ¯Š@%~ô!Òú’ó“LЕiÀ(Où->?:9¹¿ªI?ðG¦ühž;íx@Mýô<)?zÝ~T2ª›í¥¢œ'ó—æ?+&gåçIñ”æ¯õ²ûÌãÏz1óø¼^t?x„~ô¡x'~4Ð^üØ÷ÆÏ›s ôßÕ¯²þ¸î椟»ßÏŸ‡‹ ÷ý:ñÛp7wÿöû“üs¹èÕ:î—aß.·}ÄýñøïÀs8|ñ=ÄÃý/Áóö|ùj"ãAç¯ýøQÇŸî'ÝÝÝÝ»÷3A(e y?Tü0ù_žÀiÉõÃg„rJ¶ç‰ø‘û‹È×ö<Ÿ!=+Úd¯!~XžTþ¢0±5OÊO+ž”‘š÷ã‡Q™ßðìüüÕ8º<º<öîçáÔ*ÞÇ÷ÓŽç+îç}ÓÝcãQó~šót?8O÷ƒót?8ÏØ‹œÝ‹zJÍt¼ é|ÊÌo&¿`îUÜ娟5x„¡Œº—™b[T¬ õ­ßð6AíÛ\P3ƒu{Ë0ʼnú¶G„XñÿpaÈÅõ¼¸ä zZ|3ÉÙ˜œ]}-¨¸ž”{B~ƨåë(±FY³ÃxÎØ1¯áJC¾äU‡žߨ™ÜYÕ‹J1ð'.ø\® RêG_½Ã~õSòH&G®’ Ó3ØY™Ý¾\¦Lj3‰—Š?š3·¦ M?!À#÷WœG]ì{öÃ1±ßKý0îòpã\OËÄ­x̬ÜQrûLÎäì/ÆmþR<:¯!~lDåž©ÊwòJš«ô¬x¼´lyd}Ìå¡2èô<âIû‘ù]¤"ò;…ô3¤ñ½LrV/¿€¬?â0éäwù›èƒŽÈï~l°àÿD̯¶ÇØ‚ó»­?D78»šQîÒOÚØgiµ ^ xû<3Î_Ì=ù¥Ûói–-ÿ˜Õè•&Z —ó`u|ùònÓ˜k%硦±1“ Åy*ð’6GÑ*—ÕÓð˜ö(™ÇWV÷£þ2eU¤¨šà©ì‡Asî>67…§²U>´íuZûò*ÍSÛ*:²Ùé¹¶Û|i^~_ûü5õ~ÁÚç÷¥÷/ZóôòÎÓýàZ Ú ý,äùöÓ ýˆ²¯}ÏÀÜ7(LÏ•ýÈÜíäwu&ëYËòûÏ>-çé~pžîçé~pžõˇÓʫ뗟›–õW³Ë«õÏ_ËÊ«õÏïËÊ«?¼ü³˜§ûÁyê_-+¯Ö¿>]V^ýÙç¯å<ÝÎÓýà<ÝÎÓý๛¾ y§Ÿ°ÿ(Õy+ô+L`TrŒï?jÏÕ+25óD~Oµþ[Ä®:…ûKî&J]žx­¯Ü_ÃjÒý³-äQ—\jä=x£Ç6+ãYÜ?¤×¿ŸjÀe?\²,cà¡ù}X:Ý¿ßBž‰1æYìgåþ![ó,ï_ôº¼ÑSÍãs]žå~þ³¼Ú”Ÿó´A©‚óÅÄ¥Õ‚ÁùÂ÷3qmœŸ]žé8‚Ǭkì§yôþ±ñعŸ©=\+›Ñ?ö{ȳ¤ÿðórž/Ü,ËÞ^¢áfÓ׿¶ÌkW†-­ÊÙv o¶àö#Öx»fy®¯·¿ žÔÒ!ÏÇíåùʲ »ØiXñß(Oré_ÇP @y?ò„çëqó¤—óð(ëçf®©2<|ñ KGx œŸ³ØDÏBlé‡ [Ä ˆçáô1òƒ,ã9òégXeÏ€I?é¥#<§SIþR<×'–¿’KyÄœ%ÇŸ$sX}8ÑãÎs5kø¸ž^ŠŽ?Ã*ã+»º<±ìÒŠçäðøÂâ~ÎÓJwÁÊ&.-"ãgâÚ‚•MÇóìºüÓ<º<º<º<º<?3ŽøµâKñx~Zò¼ïËÏõ=êgÓÔâÆ x?Íyºœç{ùQ£èȰ=Òϲ˜÷Ãôˆž4ä© UèÇôîðð5y²~L7ûrÏ)?òƒux²~ˆûP½âÑÞ¯Á“ñCÀ <¤ <Ùq‡æódýÀÝt—‡“y£­–ðdÓ×=Ï;<œ´ôCÇ<ÍÒø¥€Úô³"OQún,¸Jà2ýÌθ€ç{¿¶çé~pžÐÏœ›FËãœô3§ÒmyœÓ~¾6ÞQ2?_ v×;æ§ÏêgëÅ¿P?Myºœ§ûÁyºœ§ûÁy¾Ÿ’OVã‰øiÊÓÓÎÓýà<ßÁO¤_Ðhž Çîœ{IŸó3™§ 'ÑRž˜oÓô¦÷yf·r~ sG=D Qcüçé%YÛjæ€.Míæ‘üéwÉÌô"žˆQY)s“MÏæsî§ggÚ<’_ÉÀ”»ùÝŒkªŸ^ë9$&aÎæ‘ü*~ìŒúg×KGŸø1ë˜Xx~‡šíÿÀé !ÎS~Lò ~ôCd¶ÿû.Γ—¶œ§—pžšåŸ<5Ë?5x*–ªðT,ÿTá©XþYËÏÜòÏZ~æ–ZùI•Öò3³ü³šŸ™åŸýÌ*ÿÌÏð+–óT-ÿTà©Zþ©ÀÓË?8O÷ƒó|?Û7@ýœ›òì¾}Bƒæn{’ÐÏãö{KÄ·iÿÓš§ûÁyvî§In—<¾ŸksßO;œ¨Ÿæ±ó翚G÷ƒG÷ƒG÷ƒG÷ƒG÷ƒÇþýQ[Œ-›“üxÆ@°y?úI3‡gËù‘0Döªî[Ëžxá†Î<±·ìP¼Ð¯®öÞ‚'Ì_Lß0w/l“•-xFÇQ×.vt½»5ÏøøCí=­ö~hÀÃû!Ð¥ô(=·J?"[»ùÃMžvé§eôó;ÝÝ¡Ÿ‡¶ÕQ#?íx¾â~Þ7Ý=65Oà§9O÷ƒót?8O÷ƒóÄý$JƒÎ%!cf:^pt?¥æ·jÿå][Êmeü¬Á#KÂ’‡x½eø<)?©™f-v"{!Íì|Öí-CQ?mÉõ´ø^ͤZpжA‰dj€3 lDixt;SyÁ£¬`~™òs;$ g…—â1£ð0ëÄá±WR¸¬A&Ñà BÅѬfP=ÊôÕ¤nhž„Ð< ŠiÔOºA&#IyÑïñ= uãòp¸ªóyJüØ™œÑ´>òÃQ¸ê-ò“hi¦©å¡¦»ä£ð0îî/êV©zr~Ò 2)ø’î0Ãã¦eË£GáaÜuD¡’’šôL3~Й2%Šü­ò»äñò»`ú5ñrò;U)‡S“ßs~¼(l9»rŽ•eç÷™؞x˜ZÉB?… 2g7Æ6Íî{ù§§ûÁyvîçܦyîh}ä§Î-î§uôú1<º<º<º<º<öëçÚ¬fÞ ã§Ù‰Ý‹kO?hôü…G÷ƒG÷ƒG÷ƒG÷ƒÇîý E÷Mx?ÈF¿6á ü4çé~pž‘ŸÇxI2ÅŸ;Åž\¹áù‰/rÆó>‰ç:ÝÏiÏu}Â=ê'²ž‡4Oìãä±*¹rÃñÓ”§ûÁyºœ'é‡hEç!DÝg-ä¡NsøOʃ>h¹Ñ^'åX0»ÎÃ'òðOÊÿ7—ø^ÈDOFE~ôMò2?° =_ÙþÒ±”ð˜Ö3SüèûÆÙô¬j(£8ù¡íÅ?Sö—ð£ži)ób¦¥Ÿâô¬²Lã1+7<™ü5-¿WàÉJއ^z.执çÜñY *â†n…<‰üþmÎ_xöèçî÷Žüüþ$ÿ\.»ñs¸ ûëø¶?Çã¿ÏŽÒàñóW´ö'ÉsRW”\¹áç¯èÒ<“ê®’+·~FÇŸèIžø’<©•§ý$#ÎS7¾AýOcžû9Çë—DlÃÓëç±è~ðè~ðè~ðè~ðè~ðØ¯Ÿx¹só0~È>BûùuÜI€Ÿ·Ý„ôóìÆáíyË6§ü¸q9nÙÜàçàÇñ°i›ü\ü8^6`sŸ­óxÿÜfx)åthcIEND®B`‚geomview-1.9.4/doc/figs/trefdodecinter.ps0000644000175000001440000014763007730233250015342 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: noname.ps %%Pages: 1 %%BoundingBox: 194 263 418 499 %%EndComments /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 466 string def %%EndProlog %%Page: 1 1 gsave 194.16 263.4 translate 223.68 235.2 scale 466 490 8 [ 466 0 0 -490 0 490 ] { picstr readstring } image 800080008000ae000000e3d6019d5680d680d680d6f0d6019d56e2d6019d 007f00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d5656d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d51d6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69d56000300d69dd6e59d0256 d6d6809d809d809df19d0256d6d6e59d02569d000200d6d6e49d0156d680 9d809d809df09d0156d6e39d0156007f00d69dd69d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d567f9d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d567f9d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d56519d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d d69d569d007f00d6d69d9d9d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d7f569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d7f569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d51569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569dd69d9d9d56000600d69dd6 9d569d800080008000bc0006d69dd69d569d000700d6d69d9d9d560080d6 80d680d6bed60700d6d69d9d9d56007f00d69dd69d569d00d6d69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd6519dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d9dd6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd600d69d d69d569d000800d6d69d9d9d5600d6ea9d0156d6809d809d899d0256d6d6 ea9d0156d6ea9d085600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d 0256d6d6809d809d8b9d025656d6e99d0556d6d69d9d9df200fc9d085600 d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6ee9dfc00cc9d02 00009df900ed9d0500009d9d0000f99d010000d99d010000ed9d01000080 9dbd9d0256d6d6eb9d025656d6fc9d0000f49d0d009d9d9d565600d6d69d 9d9d56000900d69dd69d569d00d6d6eb9d0256d6d6f19dfd00039d9d0000 ce9d0500009d9d0000e89d0500009d9d0000f99d010000d99d010000ec9d 010000809dbf9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d56 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f19d010000fc 9d010000cf9d0600009d9d9d0000e99d010000f59d010000c29d01000080 9dbe9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d 9d9d56000900d69dd69d569d00d6d6eb9d0256d6d6f39d010000f69dfc00 fd9d0800009d00009d000000fc9dfc00fd9d0600009d00009d9dfc00f99d 0600009d9d9d0000f99d0900009d9d9d00009d9d9dfc00fd9d1100009d9d 00009d9d9d0000009d00009d9d9dfc00fc9dfc00fd9d0500009d000000fa 9d010000fc9d0700009d00009d9d9dfc00109d9d00009d9d00009d9d0000 9d9d9d0000809dc09d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d 9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f29d0100 00f79d1b00009d9d00009d9d0000009d0000009d00009d9d00009d9d0000 9d9dfb00069d00009d9d0000fa9d0600009d9d9d0000f99d3800009d9d9d 00009d9d00009d9d00009d9d00009d9d00009d9d00009d9d0000009d9d00 009d9d00009d9d00009d9d00009d9d0000009d9d0000fb9d010000fc9d1c 00009d00009d9d00009d9d00009d00009d9d00009d9d00009d9d9d000080 9dbf9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d 9d9d56000b00d69dd69d569d00d6d69d9df000fd9d0256d6d6f49d010000 f29d1900009d9d00009d9d00009d9d00009d00009d9d9d00009d9d0000f8 9d010000fb9d010000fc9df900029d0000fc9d1400009d00009d9d9d0000 9d00009d9d9d00009d0000fc9d0900009d00009d9d9d0000fa9d0a00009d 9d00009d9d9d0000fb9d2200009d9d9d00009d9d00009d00009d9d9d0000 9d00009d9d00009d9d00009d9d9d0000809dc09d025656d6f89dfc00f59d 0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00d6d69d 9d9d5600d69d9d9d00f29d05009d9d5656d6f39d010000f69dfb000d9d9d 00009d9d00009d9d00009d9dfa00039d9d0000fb9dfb00fa9d0600009d9d 9d0000f99d0a00009d9d9d00009d9d0000fa9d1000009d9d00009d9d0000 9d9d9d00009d9dfa00fd9dfb00089d9d00009d9d9d0000fa9d0b00009d9d 00009d9d00009d9dfa000a9d9d00009d0000009d0000fc9d010000809dbf 9d0256d6d6f99d04009d9d0000f79d025656d6fc9d0000f49d0d00009d9d 565600d6d69d9d9d56000c00d69dd69d569d00d6d69d9d00f29d0600009d 9d56d6d6f49d010000f79d1400009d9d00009d9d00009d9d00009d9d0000 9d0000f99d010000fc9d0500009d9d0000fa9d0600009d9d9d0000f99d09 00009d9d9d00009d0000f99d0800009d9d00009d0000fc9d0400009d0000 f99d0e00009d9d00009d9d00009d9d9d0000fa9d0c00009d9d00009d9d00 009d0000f99d0800009d009d009d0000fc9d010000809dc09d025656d6f8 9d04009d9d0000f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd6 9d569d000b00d6d69d9d9d5600d69d9d9def00039d5656d6f39d010000fb 9d1800009d00009d9d9d00009d9d00009d9d00009d9d00009d0000f99d0b 00009d9d9d00009d9d9d0000fa9d0600009d9d9d0000fa9d1a00009d9d9d 00009d9d00009d9d9d00009d9d00009d9d00009d0000fc9d0400009d0000 fa9d0f00009d9d9d00009d9d00009d9d9d0000f99d0b009d00009d9d9d00 009d0000f99dfc00039d000000fb9d010000809dbf9d0256d6d6f99dfb00 f79d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000900d6 9dd69d569d00d6d6fc9df100049d9d56d6d6f39d2600009d9d0000009d9d 00009d9d00009d9d00009d9d00009d9d00009d9d00009d9d00009d9d0000 fc9d0500009d9d0000f99d0500009d9d0000f99d3800009d9d0000009d9d 00009d9d00009d9d00009d9d00009d9d00009d9d0000009d9d00009d9d00 009d9d00009d9d00009d9d00009d9d9d0000f89dfd00fd9d0900009d9d00 009d9d0000fc9d0500009d9d0000fb9d010000809dbf9d025656d6f79dfc 00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000800 d6d69d9d9d5600d6eb9d025656d6f19dfc00fb9dfd00109d00009d00009d 9d00009d9d00009d9d9dfc00fd9d010000fb9dfd00029d0000fa9d030000 9d9df900fd9dfd00059d00009d9d9dfc00fd9d1100009d9d00009d9d9d00 00009d00009d9d9dfc00fc9dfd000a9d00009d00009d9d9d0000f89d0100 00fc9d0400009d9d9dfc00fb9d0500009d9d0000fb9d010000809dbe9d02 56d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d5600 0900d69dd69d569d00d6d6eb9d0256d6d6ba9d010000979d010000809dbe 9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d56 9d000800d6d69d9d9d5600d6eb9d025656d6b99d010000989d010000809d bc9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d 9d56000900d69dd69d569d00d6d6eb9d0256d6d6b99d0100009a9d010000 809dbc9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69d d69d569d000800d6d69d9d9d5600d6eb9d025656d6809d809d899d0256d6 d6eb9d025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d 569d00d6d6eb9d0256d6d6809d809d8b9d025656d6e99d0256d6d6fb9df3 00fd9d085600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d680 9d809d899d0256d6d6eb9d025656d6eb9d09565600d6d69d9d9d56007f00 d69dd69d569d00d69d9d569d569d569d569d569d569d569d569d569d569d 56d6569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d567f9d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d567f9d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d56519d569d56 9d569d569d569d569d569d569d569d569d569d5656d69d569d569d569d56 9d569d569d569d569d569d569d569d56d6569d569d569d569d569d569d56 9d569d569d569d569d5600d69dd69d569d0008009d569d9d9d56009de956 009d805680568856009de856009de9560700d6d69d569d56000000fb5600 9d800080008000bc0001d69dfc56ff000000fcd6029d5656805580558055 be550000fad6ff000700d6d6d69d569d56805580558055be550200d69dfc d6ff000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d6 9d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d569d 000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d6 9dd69d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d 5656805580558055be550700d6d69d9d9d56000700d69dd69d569d568055 80558055be550700d69dd69d569d000700d6d69d9d9d5656805580558055 be550700d6d69d9d9d56000700d69dd69d569d56805580558055be550700 d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d 9d56000700d69dd69d569d56805580558055be550700d69dd69d569d0007 00d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd6 9d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d5656 805580558055be550700d6d69d9d9d56000700d69dd69d569d5680558055 8055be550700d69dd69d569d000700d6d69d9d9d5656805580558055be55 0700d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69d d69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56 000700d69dd69d569d56805580558055be550700d69dd69d569d000700d6 d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d56 9d56805580558055be550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d6 9d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d569d 000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d6 9dd69d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d 5656805580558055be550700d6d69d9d9d56000700d69dd69d569d568055 80558055be550700d69dd69d569d000700d6d69d9d9d5656805580558055 be550700d6d69d9d9d56000700d69dd69d569d56805580558055be550700 d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d 9d56000700d69dd69d569d56805580558055be550700d69dd69d569d0007 00d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd6 9d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d5656 805580558055be550700d6d69d9d9d56000700d69dd69d569d5680558055 8055be550700d69dd69d569d000700d6d69d9d9d5656805580558055be55 0700d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69d d69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56 000700d69dd69d569d56805580558055be550700d69dd69d569d000700d6 d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d56 9d56805580558055be550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656b75580008000d000b7550700 d6d69d9d9d56000700d69dd69d569d56b75501000080558055d455010000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550200550080558055 d65502005500b7550700d6d69d9d9d56000700d69dd69d569d56b7550300 55550080558055d8550300555500b7550700d69dd69d569d000700d6d69d 9d9d5656b75504005555550080558055da55040055555500b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000fc55000080558055dc550000 fc550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fb55 000080558055de550000fb550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000fa55000080558055e0550000fa550000b7550700d69d d69d569d000700d6d69d9d9d5656b7550000f955000080558055e2550000 f9550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f855 00009055f7aa8055dd550000f8550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000f75500009a55e9aa8055e3550000f7550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000f6550000a455dcaa 8055e8550000f6550000b7550700d69dd69d569d000700d6d69d9d9d5656 b7550000f5550000ad55cfaa8055ee550000f5550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000f4550000b1550099c9aa8055f355 0000f4550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 f4550000b355019999c3aa8055f8550000f4550000b7550700d6d69d9d9d 56000700d69dd69d569d56b7550000f3550000b655fc99bfaa8055fd5500 00f3550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f2 550000b955fb99e9aaf5dddeaa00bb81550000f2550000b7550700d6d69d 9d9d56000700d69dd69d569d56b75580008000d000b7550700d69dd69d56 9d000700d6d69d9d9d5656b755010000f1550000bf55f899f7aadddde9aa f9bb87550000f155010000b7550700d6d69d9d9d56000700d69dd69d569d 56b75502005500f1550000c355f69901aaaad0ddf0aaf6bb89550000f155 02005500b7550700d69dd69d569d000700d6d69d9d9d5656b75503005555 00f1550000c655f699c7ddf6aaf3bb8c550000f1550300555500b7550700 d6d69d9d9d56000700d69dd69d569d56b755040055555500f1550000c955 f699c0ddfdaaefbb8f550000f155040055555500b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000fc550000f1550000cc55f699bbddeebb 91550000f1550000fc550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000fb550000f1550000cf55f699b7ddeebb94550000f1550000 fb550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa55 0000f1550000d255f599b4ddeebb97550000f1550000fa550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000f9550000f1550000d555 f599b1ddeebb99550000f1550000f9550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000f8550000f155d700f599adddeebb9b00f155 0000f8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 f755010000f3550000da55f599a9ddefbb9d550000f355010000f7550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f5550000f455 0000db550088f799a6ddeebb9f550000f4550000f5550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000f4550000f5550000dc550188 88f999a2ddeebba1550000f5550000f4550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000f3550000f6550000dd55018888fa999edd efbba2550000f6550000f3550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000f2550000f7550000de55fd88fc999addefbba4550000 f7550000f2550000b7550700d69dd69d569d000700d6d69d9d9d5656b755 0000f1550000f8550000df55fd88fd99aadd011919efddeebba6550000f8 550000f1550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00f0550000f9550000e055fc880099adddf419f2ddefbba7550000f95500 00f0550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000ef 550000fa550000e155fc88ccddfbaafd99ebddec19f4ddf0bba8550000fa 550000ef550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00ee550000fb550000e255fc88d2ddf4aaf899f5dde219f8ddf0bba95500 00fb550000ee550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000ed550000fc550000e355fc88d8ddedaaf39901ddddda19faddf1bb aa550000fc550000ed550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000ec55040055555500e455fc88dfdde5aaf599d219fcddf2bb ab55040055555500ec550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000eb550300005500e555fc88e0ddfdbbe6aafa99cc19fcddf3 bbab550300550000eb550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000e955010000e655fc88e1ddfbbbe6aa019999c71903ddddee eef3bbac55010000e9550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000e8550000e755fc88e1ddf9bbeaaac21900ddfceef3bbad55 0000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 e855010000e955fc88e2ddf7bbeeaabd19fbeef3bbaf55010000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e85502005500 eb55fc88e3ddf5bbf2aab819fbeef3bbb15502005500e8550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000e8550300555500ed55fc 88e4ddf2bbf8aab219fbeef3bbfc19b7550300555500e8550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000e855040055555500ef55 fc88e5ddf0bbfcaaad19fbeef3bbf919bc55040055555500e8550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000fc550000 f155fc88e6ddedbb00aaaa19fceef2bbf519c2550000fc550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000fb55 0000f355fc88e7ddecbba719fceef3bbf119c7550000fb550000e8550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000fa55 0000f555fc88e8ddecbba419fceef3bbee19cc550000fa550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f955 0000f755fc88e9ddecbba119fceef3bbea19d2550000f9550000e8550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000f855 0000f955fb88ebddecbb9f19fbeef3bbe719d7550000f8550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f755 010000fc55fb88ebddedbb9c19fbeef3bbe719da55010000f7550000e855 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000 f55502005555fb88ebddeebb9919fbeef3bbe719dc550000f5550000e855 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000 f455010055fc88ebddefbb9619fbeef3bbe819dd550000f4550000e85500 00b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000f3 55fc88ebddf0bb9319fbeef4bbe719df550000f3550000e8550000b75507 00d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f355fd88eb ddf0bb9119fbeef4bbe719e1550000f2550000e8550000b7550700d6d69d 9d9d56000700d69dd69d569d56b7550000e8550000f455fd88ebddf1bb8e 19fceef3bbe719e3550000f1550000e8550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000e8550000f455018888ebddf2bb8b19fcee f3bbe819e4550000f0550000e8550000b7550700d6d69d9d9d56000700d6 9dd69d569d56b7550000e8550000f555028888eeecddf3bb8819fceef4bb 00cce819e6550000ef550000e8550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000e8550000f555038888eeeeeeddf3bb8619fceef7 bbfdcce719e8550000ee550000e8550000b7550700d6d69d9d9d56000700 d69dd69d569d56b7550000e8550000f655018888fceef0ddf4bb8319fcee fabbfacce819e9550000ed550000e8550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000e8550000f655018888fbeef2ddf5bb8019fc eefdbbf9cce619eb550000ec550000e8550000b7550700d6d69d9d9d5600 0700d69dd69d569d56b7550000e8550000f755018888faeef3ddf5bb8019 0019fbeef8cce419ee55010000eb550000e8550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000e8550000f755018888f9eef5ddf4bb 8019051919eeeefffff9cce319ef550000e9550000e8550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000e8550000f855018888f7ee f6ddf5bb8019fc19fcfffacce219f1550000e8550000e8550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f855018888f6 eef8ddf5bb8019fa19fdfffbcce019f200e7550000e8550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000e8550000f955018888f4ee faddf4bb8019f81904ffffccccccdf19f3550000e7550000e8550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000f9550188 88f4eefbddf4bb8019f61902ffccccdd19f4550000e7550000e8550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000e8550000fa5501 8888f2eefdddf4bb8019f41901ffccdc19f5550000e7550000e8550000b7 550700d69dd69d569d000700d6d69d9d9d5656b7550000e8550000fa5501 8888f1ee00ddf3bb8019ce19f5550000e7550000e8550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000e8550000fb55018888f0eef3 bb8019cc19f6550000e7550000e8550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000e8550000fb55018888f0eef4bb8019ca19f755 0000e7550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56 b7550000e8550000fc55018888f0eef3bb8019ca19f7550000e7550000e8 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e85500 00fc55018888f0eef4bb8019c819f8550000e7550000e8550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000e85505005555558888f0 eef4bb8019c619f9550000e7550000e8550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000e85505005555558888f0eef4bb8019c619 f9550000e7550000e8550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000e855040055558888f0eef4bb8019c419fa550000e7550000 e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e855 040055888888f0eef5bb8019c219fb550000e7550000e8550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000e8550300558888f0eef4 bb8019c219fb550000e7550000e8550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000e8550300888888f0eef5bb8019c019fc550000 e7550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000e85502008888f0eef5bb8019be19fd550000e7550000e8550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000e85502008888f0ee f6bb8019bc1902555500e7550000e8550000b7550700d6d69d9d9d560007 00d69dd69d569d56b7550000e855010088f0eef5bb8019bc1902555500e7 550000e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b75500 00e855018888f0eef6bb8019ba19015500e7550000e8550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000e8550088f0eef6bb8019b8 190000e7550000e8550000b7550700d69dd69d569d000700d6d69d9d9d56 56b7550000e8550088f0eef6bb8019b8190000e7550000e8550000b75507 00d6d69d9d9d56000700d69dd69d569d56b7550000e8550288fffff3eef6 bb8019b619e7550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e855fcfff4eef7bb8019b419e8550000e8550000b75507 00d6d69d9d9d56000700d69dd69d569d56b7550000e9550088fafff6eef7 bb8019b419e8550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e9550088f9fff8eef7bb8019b219e9550000e8550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000e9550088f7fffa eef8bb8019b019ea550000e8550000b7550700d69dd69d569d000700d6d6 9d9d9d5656b7550000e9550088f5fffdeef7bb8019b01901eeeeec550000 e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e955 0088f4ff01eeeef8bb8019ae1901eeeeed550000e8550000b7550700d69d d69d569d000700d6d69d9d9d5656b7550000e9550088f3fff8bb8019ac19 01eeeeee550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d 56b7550000ea550088f2fff8bb8019ac19fdeeef550000e8550000b75507 00d69dd69d569d000700d6d69d9d9d5656b7550000ea550088f2fff9bb80 19aa19fdeef0550000e8550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000ea550088f2fffabb8019a819fdeef1550000e8550000b7 550700d69dd69d569d000700d6d69d9d9d5656b7550000ea550088f2fffa bb8019a819fdee0088f2550000e8550000b7550700d6d69d9d9d56000700 d69dd69d569d56b7550000ea550088f2fffbbb8019a619fdee0088f35500 00e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000eb 55018888f3fffbbb8019a419fdee0088f4550000e8550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000eb550088f2fffbbb8019a419 fdee0088f4550000e8550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000eb550088f2fffcbb8019a219fdee0088f5550000e8550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000eb550088f2ff fdbb8019a01903eeee8888f6550000e8550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000eb550088f2fffdbb8019a019fdee0088f6 550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00eb550088f2ff01bbbb80199e19fdee0088f7550000e8550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000ec55018888f2ff00bb80 199c1902eeee88f7550000e8550000b7550700d6d69d9d9d56000700d69d d69d569d56b7550000ec550088f2ff00bb80199a1902eeee88f8550000e8 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000ec5500 88f2ff00bb80199a19fdee0088f9550000e8550000b7550700d6d69d9d9d 56000700d69dd69d569d56b7550000ec550088f2ff8019981902eeee88f9 550000e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b75500 00ec550088f3ff8019961902eeee88fa550000e8550000b7550700d6d69d 9d9d56000700d69dd69d569d56b7550000ed55018888f3ff8c190147478c 19fdee0088fb550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000ed55018888f4ff8c19fc478c1902eeee88fb550000e855 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ed550088 f4ff8d19f8478d1902eeee88fc550000e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000ed550088f4ff8e19f6478e19fdeefc55 0000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 ec55f5ff8f19f2478f1906eeee8855555500e8550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000ec55f6ff8f19f0478f1905eeee88 555500e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00ec55f6ff9119ec479119fdee02555500e8550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000ec55f7ff9119ea47911904eeee8855 00e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec 550088f9ff9119e847911903eeee5500e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000ec550088f9ff9319e4479319fdee0000 e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec55 0088faff9319e247931902eeee88e8550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000ec550088fbff9419de47941901dddde85500 00b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec550088fb ff9519dc47951902dddd88e9550000b7550700d69dd69d569d000700d6d6 9d9d9d5656b7550000ec550088fcff9619d847961902dd8888ea550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000ec550388ffffff 9619d6479619018888ea550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000eb55fdff9719d447971902dd8888eb550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000eb5501ffff9819d0479819 018888eb550000b7550700d69dd69d569d000700d6d69d9d9d5656b75500 00eb5500889819ce4798190088eb550000b7550700d6d69d9d9d56000700 d69dd69d569d56b7550000eb5501880b9b19ca479b1902178888ec550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000eb550288ff0b 9d19c8479d190317dd8888ec550000b7550700d6d69d9d9d56000700d69d d69d569d56b7550000eb550388ff0b0b9f19c6479f19041717dd8888ec55 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000eb550388 ff0b0ba119c247a119041717dd8888ec550000b7550700d6d69d9d9d5600 0700d69dd69d569d56b7550000eb550488ff0b0b0ba319c047a319fd1703 dd888888ed550000b7550700d69dd69d569d000700d6d69d9d9d5656b755 0000eb550588ffff0b0b0ba619bc47a619fd17fddd018888ed550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000eb550288fffffc0b a819ba47a819fc17fddd018888ed550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000ea550688ff0bbbbb0b0bab19b647ab19fb17fd dd018888ed550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000ea550188fffcbb010b0bad19b447ad19fa17fdddfd88ee550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000ea550088fabb010b 0baf19b247af19fa17fbdd018888ee550000b7550700d6d69d9d9d560007 00d69dd69d569d56b7550000ea550088f9bb000bb119ae47b119fa17fbdd 018888ee550000b7550700d69dd69d569d000700d6d69d9d9d5656b75500 00ea55f7bb000bb319ac47b319f917fbdd018888ee550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000eb55f6bb01ff0bb619a847b6 19f817fadd018888ef550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000eb55f7bb03ffff0b0bb819a647b819f817f9dd018888ef55 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec55f7bb fcff010b0bbb19a247bb19f717f9dd018888ef550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000ed55f6bbfcfffd0bbd19a047bd19 f617f9dd018888ef550000b7550700d6d69d9d9d56000700d69dd69d569d 56b7550000ed55f7bbfaff010b0bbe199e47be19f617f8dd018888f05500 00b7550700d69dd69d569d000700d6d69d9d9d5656b7550000ee55f7bbf9 fffd0bc1199a47c119f617f7dd018888f0550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000ef55f6bbf8fffd0bc3199847c319f617 f6dd018888f0550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000ef55f7bbf6fffd0bc6199447c619f517f6dd018888f0550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000f055f7bbf5fffc0b c8199247c819f517f4dd018888f1550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000f055f7bbf4fffc0bcb198e47cb19f517f3dd01 8888f1550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 f055f8bbf3fffb0bcd198c47cd19f417f3dd018888f1550000b7550700d6 9dd69d569d000700d6d69d9d9d5656b7550000f155f8bbf1fffc0bce198a 47ce19f517f2dd018888f1550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000f155f8bbf1fffb0bd1198647d119f517f1ddfd88f255 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f155f8bb f0fffb0bd3198447d319f417f1ddfd88f2550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f255f8bbeffffa0bd6198047d619f417 f0ddfd88f2550000b7550700d69dd69d569d000700d6d69d9d9d5656b755 0000f255f8bbeefffa0bd8198047014747d819f317f0ddfd88f2550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000f255f8bbeefff9 0bdb198047fa47db19f3170088f0ddfc88f3550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000f355f7bbedfffa0bdc198047f847dc 19f3170088f0ddfc88f3550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000f355f8bbecfff90bde198047f647de19f317018888f0dd fc88f3550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 f355f8bbecff00aaf90be1198047f247e119f217018888f0ddfc88f35500 00b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f455f7bbed ff0199aaf80be3198047f047e319f217fd88f0ddfc88f3550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000f455f8bbecfffd99f80b e6198047ec47e619f117fd88f0ddfc88f3550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f455f8bbecfffd99f70be8198047ea47 e819f117fd88efddfc88f3550000b7550700d69dd69d569d000700d6d69d 9d9d5656b7550000f555f7bbedfffc99f60beb198047e647eb19f117fc88 efddfc88f3550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000f555f8bbecfffb99f70bec198047e447ec19f117fc88f0ddfc88f255 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f555f8bb ecfffb99f60bee198047e247ee19f117fb88f0ddfc88f2550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000f655f7bbedfff999f60b f1198047de47f119f017fb88f0ddfc88f2550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000f655f8bbecfff999f50bf3198047dc47 f319f017fa88f0ddfc88f2550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000f655f8bbecfff999f40bf6198047d847f619ef17fa88 f0ddfc88f2550000b7550700d69dd69d569d000700d6d69d9d9d5656b755 0000f755f7bbedfff799f40bf8198047d647f819ef17f988f0ddfc88f255 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f755f8bb ecfff799f40bf9198047d447f919ef17f988f0ddfc88f2550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000f855f7bbecfff799f30b fc198047d047fc19ef17f888f0ddfc88f2550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f855f7bbedfff599f30b0119198047ce 47011919ee17f888f0ddfc88f2550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000f855f8bbecfff599f20b8047cc47ee17f788f0dd fc88f2550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 f955f7bbecfff499f30b8047cc47ee17f788f0ddfc88f2550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000f955f7bbecfff499f20b 8047ce47ee17f788efddfc88f2550000b7550700d6d69d9d9d56000700d6 9dd69d569d56b7550000f955f8bbecfff399f20b8047ce47ee17f788efdd fd88f1550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 f95500aaf9bbecfff299f30b8047ce47ef17f688efddfd88f1550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000f955fdaafbbbecff f299f20b8047d047ef17f688efddfc88f1550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000f955fcaafdbbecfff199f20b8047d047 ef17f688efddfc88f1550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000f955faaa00bbecfff099f20b8047d247ef17f588efddfc88 f1550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f955 f9aa00eeedfff099f20b8047d247ef17f688eeddfc88f1550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000f955f9aafbeef2ffee99 f30b8047d247f017f588eeddfc88f1550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000f955f9aaf7eef6ffee99f20b8047d447ef17 f688edddfc88f1550000b7550700d6d69d9d9d56000700d69dd69d569d56 b7550000f955f9aaf3eefaffee99f20b8047d447f017f588edddfc88f155 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f955f9aa efee00ffed990033f20b8047d647ef17f688eddd049999888888f1550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f955f9aaeeee f688f7990033f20b8047d647f017f588eddd049999888888f1550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000f955f9aaeeeeee88 013333f20b8047d647f117f588edddfc99018888f1550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000f955f9aaeeeeee88013333f1 0b8047d847f017f588edddfc990088f0550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000f955f9aaeeeeee88013333f10b8047d847 f117f488edddfb99f0550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000fa55f8aaeeeeee88fd33f10b8047da47f017f588edddfa99 f0550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa55 f8aaeeeeee88fd33f10b8047da47f117f488edddfa99f0550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000fa55f8aaeeeeee88fd33 f10b8047da47f117f588edddf999f0550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000fa55f8aaeeeeee88fd33f00b8047dc47f117 f488edddfa99ef550000b7550700d6d69d9d9d56000700d69dd69d569d56 b7550000fa55f8aaeeeeee88fc33f10b8047dc47f117f588edddf999ef55 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa55f8aa eeeeee88fc33f00b8047de47f117f488edddfa99ee550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000fa55f8aaeeeeee88fc33f00b 8047de47f217f388edddfa99ee550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000fa55f8aaeeeeee88fb33f10b8047de47f217f488 edddfa99ed550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000fa55f8aaeeeeee88fb33f00b8047e047f217f388edddfa99ed550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa55f8aaeeee ee88fb33f00b8047e047f217f488edddf999ed550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000fa55f8aaeeeeee88fb33ef0b8047 e247f217f388edddfa99ec550000b7550700d69dd69d569d000700d6d69d 9d9d5656b7550000fa55f8aaeeeeee88fa33f00b8047e247f217f488eddd f999ec550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 fa55f8aaeeeeee88fa33ef0b8047e447f217f488ecddfa99eb550000b755 0700d69dd69d569d000700d6d69d9d9d5656b7550000fa55f8aaedeeef88 fb330055ef0b8047e447f317f488ebddfa99eb550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000fa55f8aaedeeef88fc33fd55f00b 8047e447f317f588ebddfa99ea550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000fa55f8aaedeeef88fd33fc55ef0b8047e647f317 f488ebddfa99ea550000b7550700d6d69d9d9d56000700d69dd69d569d56 b7550000fa55f8aaedeeef88013333fb55ef0b8047e647f317f588ebddfa 99e9550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fa 55f8aaedeeef880033f955ef0b8047e847f317f588eaddfa99e9550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000fa55f8aaedeef0 88017777f955ef0b8047e847f417f588eaddf999e9550000b7550700d69d d69d569d000700d6d69d9d9d5656b7550000fa55f8aaedeef488fa77f955 ef0b8047e847f417f688e9ddfa99e8550000b7550700d6d69d9d9d560007 00d69dd69d569d56b7550000fa55f8aaedeef888f677f855ef0b8047ea47 f417f688e8ddfa99e8550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000f955f9aaedeefb88f277f955ef0b8047ea47f417f788e8dd fa990000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000f955f9aaedee0088ee77f955ee0b8047ec47f417f788e7ddfa990000 e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f955 f9aaeddded77f855ef0b8047ec47f517f788e7ddfa99015500e8550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000f855faaaedddec 77f955ef0b8047ec47f517f888e7dd01aaaafb99015500e8550000b75507 00d69dd69d569d000700d6d69d9d9d5656b7550000f855f9aaeeddec77f9 55ee0b8047ee47f517f888e7ddfdaafb99015500e8550000b7550700d6d6 9d9d9d56000700d69dd69d569d56b7550000f855f9aaeddded77f955ee0b 8047ee47f517f988e7ddfcaafc9902555500e8550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000f755faaaedddec77f955ee0b8047 f047f517f888e8ddfbaafc9902555500e8550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f755f9aaeddded77f955ee0b8047f047 f517f988e7ddfaaa05999955555500e8550000b7550700d69dd69d569d00 0700d6d69d9d9d5656b7550000f755f9aaeddded77f955ee0b8047f047f6 17f988e7ddf9aa05999955555500e8550000b7550700d6d69d9d9d560007 00d69dd69d569d56b7550000f655faaaedddec77fa550066ee0b8047f247 f617f988e7ddf8aa0099fc550000e8550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000f655f9aaeddded77fb55fd66ef0b8047f247 f617fa8800eee8ddf7aa0099fc550000e8550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f655f9aaeddded77fb55fd66ee0b8047 f447f617fb88fdeee9ddf6aafb550000e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000f555faaaedddec77fd55fb66ef0b8047 f447f717fc88faeeebddf6aafa550000e8550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000f555f9aaeddded77fd55fa66f00b8047 f447f717018888f8eeecddf6aaf9550000e8550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000f555f9aaeddded77015555f966ef0b 8047f647f7170088f5eeeeddf6aaf8550000e8550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000f555f9aaedddec770055f866f00b 8047f647f717f3eef0ddf6aaf7550000e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000f455f9aaeddded77f766ef0b8047f847 f717f2eef1ddf5aaf7550000e8550000b7550700d6d69d9d9d56000700d6 9dd69d569d56b7550000f455f9aaeddded77f666f00b8047f847f717f1ee f3ddf5aaf6550000e8550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000f455f9aaedddec77f766f00b8047f847f817efeef5ddf5aa f5550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000f355f9aaedddec77f766f00b8047fa47f717efeef5ddf6aaf4550000 e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f355 f9aaedddeb77f866f00b8047fa47f817edeef7ddf6aaf3550000e8550000 b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f355f9aaeddd eb77f866ef0b8047fc47f717eceef9ddf6aaf2550000e8550000b7550700 d69dd69d569d000700d6d69d9d9d5656b7550000f255f9aaedddeb77f866 f00b8047fc47f817ebeefaddf6aaf1550000e8550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000f255f9aaedddea77f966f00b8047 fc47f817eaeefcddf6aaf0550000e8550000b7550700d69dd69d569d0007 00d6d69d9d9d5656b7550000f255f9aaeddde977f966f00b8047014747f8 17e9eefdddf6aaef550000e8550000b7550700d6d69d9d9d56000700d69d d69d569d56b7550000f155f9aaeddde977fa66f00b8047014747f817e8ee 00ddf6aaee550000e8550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000f155f9aaeddde977f966f00b8047f817e7ee00bbf7aaed55 0000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000 f155f9aaecdde977fa66f00b8047f817e9eefdbbf8aaec550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f055f9aaeddd e877fb660077f10b8047f917eaeefbbbf9aaeb550000e8550000b7550700 d6d69d9d9d56000700d69dd69d569d56b7550000f055f9aaecdde877fc66 017777f10b8247f817eceef9bbfaaaea550000e8550000b7550700d69dd6 9d569d000700d6d69d9d9d5656b7550000f055f9aaebdde977fc66017777 f10b8247f917eceef8bbfaaaea550000e8550000b7550700d6d69d9d9d56 000700d69dd69d569d56b7550000ef55f9aaebdde977fd66fd77f10b8447 f817eeeef6bbfbaae9550000e8550000b7550700d69dd69d569d000700d6 d69d9d9d5656b7550000ee55faaaebdde877046666777777f10b8447f917 efeef4bbfcaae8550000e8550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000ee55f9aaebdde377f20b8447f917f1eef2bbfdaae755 0000e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 ed55faaaeadde9770088fb77f20b8647f917f2eeefbb01aa00e7550000e8 550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ec55fa aaeaddeb77fd88fc77f20b8647f917f3eeeebb015500e7550000e8550000 b7550700d69dd69d569d000700d6d69d9d9d5656b7550000eb55faaaeadd ec77fb88fd77f20b8847f917f4eeeebbfd550000e7550000e8550000b755 0700d6d69d9d9d56000700d69dd69d569d56b7550000eb55f9aaebdded77 f988017777f20b8847f917f6eeeebbfb550000e7550000e8550000b75507 00d69dd69d569d000700d6d69d9d9d5656b7550000ea55faaaeaddef77f6 880077f30b8847fa17f7eeedbbfa550000e7550000e8550000b7550700d6 d69d9d9d56000700d69dd69d569d56b7550000e955faaaeaddf177f48800 77f30b8a47f917f9eeedbbf700e7550000e8550000b7550700d69dd69d56 9d000700d6d69d9d9d5656b7550000e855faaaeaddf377f288f30b8a47fa 17f9eeeebbf5550000e8550000e8550000b7550700d6d69d9d9d56000700 d69dd69d569d56b7550000e855f9aaeaddf477f288f20b8c47f917fbeeee bbf2550000e9550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e8550000f9aaebddf577f088f30b8c47fa1700eefcccef bbef55010000eb550000e8550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000e855010055faaaeaddf777ef88f30b8c47fa17fbccf1 bbeb550000ec550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e85502005555faaaeaddf977ed88f30b8e47f917faccf4 bbe8550000ed550000e8550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000e85502005555f9aaeaddfb77ec88f30b8e47f917faccf5 bbe6550000ee550000e8550000b7550700d69dd69d569d000700d6d69d9d 9d5656b7550000e8550300555555f9aaeaddfc77eb88f30b9047f917f9cc f7bbe3550000ef550000e8550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000e8550000fc55faaaeaddfd77ea88f30b9047f917f9cc f9bbe0550000f0550000e8550000b7550700d69dd69d569d000700d6d69d 9d9d5656b7550000e8550000fb55faaaeadd0077e888f40b9047f917f9cc fbbbdd550000f1550000e8550000b7550700d6d69d9d9d56000700d69dd6 9d569d56b7550000e8550000fb55f9aaeadde888f30b9247f817f9ccfdbb 0017db550000f2550000e8550000b7550700d69dd69d569d000700d6d69d 9d9d5656b7550000e8550000fa55f9aae9dde988f40b9247f817f9cc01bb 17d8550000f3550000e8550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000e8550000f955f9aae9ddea88f30b9447f717faccd45500 00f4550000e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000e8550000f855faaae7ddea880099f60b9447f81701ccccce550000 f5550000e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000e8550000f855f9aae6ddec88fb99f90b9647f917c955010000f75500 00e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8 550000f8550000f9aae6ddee88f699fd0b9647fd17c3550000f8550000e8 550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e85500 00f95502005555f9aae5ddf088d199e2aafbffdfccbb550000f9550000e8 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e85500 00fa550000fc55f9aae5ddf188d199e4aaedfff0ccb5550000fa550000e8 550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e85500 00fb550000fb55f9aae3ddf488d099e5aaeafffdaaa9550000fb550000e8 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e85500 00fc550000f855faaae2ddf688d099e6aaeaff01aaaaa6550000fc550000 e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e855 040055555500f655faaae2ddf888cf99e8aae9ff01aaaaa4550400555555 00e8550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e8 550300555500f355faaae2ddfa88ce99ecaae8ff01aaaaa1550300555500 e8550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000e855 02005500f155faaae2ddfb88ce99efaae6ff01aaaa9f5502005500e85500 00b7550700d69dd69d569d000700d6d69d9d9d5656b7550000e855010000 ee55faaae2dd018888cd99f1aae5ff01aaaa9d55010000e8550000b75507 00d6d69d9d9d56000700d69dd69d569d56b7550000e8550000ec55faaae2 dd0088cd99f4aae4ff01aaaa9a550000e8550000b7550700d69dd69d569d 000700d6d69d9d9d5656b7550000e955010000eb55f9aae0ddd099f6aae3 ff01aaaa9955010000e9550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000eb550300005500e955f9aadeddd399faaae1ff00aa9755 0300550000eb550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000ec55040055555500e855f9aadaddd899fcaae1ff01aaaa96550400 55555500ec550000b7550700d6d69d9d9d56000700d69dd69d569d56b755 0000ed550000fc550000e655f9aad8dddc9900aadfff00aa94550000fc55 0000ed550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000 ee550000fb550000e555f9aad5dde799f9eedfff00aa93550000fb550000 ee550000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000ef55 0000fa550000e355f9aad3ddf899eceee1ff01aaaa92550000fa550000ef 550000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f05500 00f9550000e255f9aad2dde6eee2ff00aa90550000f9550000f0550000b7 550700d6d69d9d9d56000700d69dd69d569d56b7550000f1550000f85500 00e055f9aad5dde5eee3ff00aa8f550000f8550000f1550000b7550700d6 9dd69d569d000700d6d69d9d9d5656b7550000f2550000f7550000df55f9 aad6dde5eee5ff00aa8d550000f7550000f2550000b7550700d6d69d9d9d 56000700d69dd69d569d56b7550000f3550000f6550000dd55f9aad8dde5 eee8fffdbb8c550000f6550000f3550000b7550700d69dd69d569d000700 d6d69d9d9d5656b7550000f4550000f5550000dc55f9aadadde4eeebfffc bb8a550000f5550000f4550000b7550700d6d69d9d9d56000700d69dd69d 569d56b7550000f5550000f4550000da55f9aadcdde4eeeefffcbb875500 00f4550000f5550000b7550700d69dd69d569d000700d6d69d9d9d5656b7 550000f755010000f3550000d955f8aadedde4eef0fffdbb84550000f355 010000f7550000b7550700d6d69d9d9d56000700d69dd69d569d56b75500 00f8550000f155d500f8bbe2dde3eef3fffdbb8000f1550000f8550000b7 550700d69dd69d569d000700d6d69d9d9d5656b7550000f9550000f15500 00d155f8bbe6dde3eef6fffcbb805502555500f1550000f9550000b75507 00d6d69d9d9d56000700d69dd69d569d56b7550000fa550000f1550000cd 55f7bbebdde2eef8fffdbb8055fa550000f1550000fa550000b7550700d6 9dd69d569d000700d6d69d9d9d5656b7550000fb550000f1550000c855f7 bbefdde2eefbfffdbb8055f6550000f1550000fb550000b7550700d6d69d 9d9d56000700d69dd69d569d56b7550000fc550000f1550000c455f6bbf3 dde2ee04ffffbbbbbb8055f2550000f1550000fc550000b7550700d69dd6 9d569d000700d6d69d9d9d5656b755040055555500f1550000bf55f6bbf8 dde1ee01bbbb8055ee550000f155040055555500b7550700d6d69d9d9d56 000700d69dd69d569d56b7550300555500f1550000bb55f5bbfcddf1eef1 bb8055ea550000f1550300555500b7550700d69dd69d569d000700d6d69d 9d9d5656b75502005500f1550000b655dabb8055e6550000f15502005500 b7550700d6d69d9d9d56000700d69dd69d569d56b755010000f1550000b2 55f3bb8055cf550000f155010000b7550700d69dd69d569d000700d6d69d 9d9d5656b75580008000d000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000f255000080558055f0550000f2550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000f355000080558055ee550000f355 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f4550000 80558055ec550000f4550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000f455000080558055ec550000f4550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000f555000080558055ea550000f555 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000f6550000 80558055e8550000f6550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b7550000f755000080558055e6550000f7550000b7550700d69dd69d 569d000700d6d69d9d9d5656b7550000f855000080558055e4550000f855 0000b7550700d6d69d9d9d56000700d69dd69d569d56b7550000f9550000 80558055e2550000f9550000b7550700d69dd69d569d000700d6d69d9d9d 5656b7550000fa55000080558055e0550000fa550000b7550700d6d69d9d 9d56000700d69dd69d569d56b7550000fb55000080558055de550000fb55 0000b7550700d69dd69d569d000700d6d69d9d9d5656b7550000fc550000 80558055dc550000fc550000b7550700d6d69d9d9d56000700d69dd69d56 9d56b75504005555550080558055da55040055555500b7550700d69dd69d 569d000700d6d69d9d9d5656b755030055550080558055d8550300555500 b7550700d6d69d9d9d56000700d69dd69d569d56b7550200550080558055 d65502005500b7550700d69dd69d569d000700d6d69d9d9d5656b7550100 0080558055d455010000b7550700d6d69d9d9d56000700d69dd69d569d56 b75580008000d000b7550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d6 9d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d569d 000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d6 9dd69d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d 5656805580558055be550700d6d69d9d9d56000700d69dd69d569d568055 80558055be550700d69dd69d569d000700d6d69d9d9d5656805580558055 be550700d6d69d9d9d56000700d69dd69d569d56805580558055be550700 d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d 9d56000700d69dd69d569d56805580558055be550700d69dd69d569d0007 00d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd6 9d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d5656 805580558055be550700d6d69d9d9d56000700d69dd69d569d5680558055 8055be550700d69dd69d569d000700d6d69d9d9d5656805580558055be55 0700d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69d d69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56 000700d69dd69d569d56805580558055be550700d69dd69d569d000700d6 d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d56 9d56805580558055be550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656805580558055be550700d6d6 9d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d569d 0007009d569d9d9d5656805580558055be550700d6d69d569d56000000fb 56019d56805580558055be550200d69dfc56ff000000fcd6029d56568055 80558055be550000fad6ff000700d6d6d69d569d56805580558055be5502 00d69dfcd6ff000700d6d69d9d9d5656805580558055be550700d6d69d9d 9d56000700d69dd69d569d56805580558055be550700d69dd69d569d0007 00d6d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd6 9d569d56805580558055be550700d69dd69d569d000700d6d69d9d9d5656 805580558055be550700d6d69d9d9d56000700d69dd69d569d5680558055 8055be550700d69dd69d569d000700d6d69d9d9d5656805580558055be55 0700d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69d d69d569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d56 000700d69dd69d569d56805580558055be550700d69dd69d569d000700d6 d69d9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d56 9d56805580558055be550700d69dd69d569d000700d6d69d9d9d56568055 80558055be550700d6d69d9d9d56000700d69dd69d569d56805580558055 be550700d69dd69d569d000700d6d69d9d9d5656805580558055be550700 d6d69d9d9d56000700d69dd69d569d56805580558055be550700d69dd69d 569d000700d6d69d9d9d5656805580558055be550700d6d69d9d9d560007 00d69dd69d569d56805580558055be550700d69dd69d569d000700d6d69d 9d9d5656805580558055be550700d6d69d9d9d56000700d69dd69d569d56 805580558055be550700d69dd69d569d000700d6d69d9d9d565680558055 8055be550700d6d69d9d9d56000700d69dd69d569d56805580558055be55 0700d69dd69d569d000700d6d69d9d9d5656800080008000bd0006d6d69d 9d9d56000600d69dd69d569d80d680d680d6bbd6059dd69d569d007f00d6 d69d9d9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d51d69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69d9d9d56000300d69dd6e59d0156d6809d80 9d809df09d0156d6e49d02569d000200d6d6e59d035656d6d6809d809d80 9df29d035656d6d6e49d0156007f00d69d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d56d6d69d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d567f9d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 567f9d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d56519d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 56d6d69d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d000100d6e25601d6d6805680568056f05601d6d6e356ff0080008000 8000ae00 grestore showpage %%Trailer geomview-1.9.4/doc/figs/main.ps0000644000175000001440000002710410447731022013255 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: blah-000.ps %%Pages: 1 %%BoundingBox: 210 321 401 470 %%EndComments %%Page: Image0 1 /picstr 1191 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def %%EndProlog %%Page: 1 1 gsave 210.72 321.6 translate 190.56 148.8 scale 397 310 8 [ 397 0 0 -310 0 310 ] { inputf picstr readstring pop } false 3 colorimage 78DAED9D5D929CBA120667955E81B7741FBD0676E3576FE53ACE447460904A55 A5D27FE603316E77030D22FB9310D2D71700C0ECFC6EC3AF5FBF7EFCF8F11B00 F6E5C77FB45BFF5F8DDC35F5F79FB1CBC7FE87AF9F254B96332C3F9779F89ABF F968EAF17A14F7FD0780FDB8A79146EB7FA4A9469AE25402EC6DAA760249A6A9 EFD759B264C972D45293A6384A2C59B21CEBA87B6ACAA529EE7E02C0C08E079A 34D5AE970200400E2135255F8FBAC3486F04962C275C7E2ECFA9F6CA91A6B8D3 07C0EDB96EFD8EEEE6B1A629FA4D01ECAAA9906BFC6D3C7D4BD4633DFDD35472 FFF524BF4B67866C5D38A151FB33C3B16D74C4F04F876BB3683CE58978BC6DAD 34F52872038BDF6C92ACDF9FCD8E6DF8D739C775ADD394F568AF95A692E5E4CC 1FCAC7B76E740D8E3AB62DBE0E9A5A2E4D3DEA7D4BA4294D21C925FCE4EBEFEA 52F1F73757C37AAF5FF3778B6B50FFF5C71E5BF9B8252BB3F28642BE8E5C1284 178B25843475489A2A9E77AB25DED742F2BA286A2AF9F7104D15659BDB7AFF63 AB3F4472E3AA4F539ADDD6EC95B0867535B5659AB2F623F519BBF843ACFC5133 5D269ACF6AB6DB334DE9BFC2FCC7D6E4079FA36A5CA4DFA5CDD294DEC3F3A429 D349796CB7B2C627FC8A154B942F1E38B6ABB91927FBDCED2861F72639B6FA75 866BCAB4E962C0DBCC51F2B569FABEF3A4295F0CA84C539A76809A9F7B4724C8 EDDB7D39304ACD736CF5AD64FAE641A5A67C9B56BA689B36F6629A527EDFA9D2 94A3DE579FA61C4D2EBE86119F0792F5A6C07E4D4D35D5FAD8EA0D13A5A91A43 EA6FAA9E93A64CF5BE79EEF4399AA76AEEF4396EABF96EC3C96DB6CADB82BFA2 FB5EC66680FEC7D6D1E6239F94D8AF13D260B5719AD2374F9DDC6FEA519F928F 5BF1F6905E35C5660AE5EDA46E9A32B576763EB6F23A4D41CE7A1D69EE183A8E EA4E353EFA4DE98D0DB071FBCFD269AAC678DBA729C051388A34459A021C05A4 29D214C0E169CAD71B9C3405007DD2944956A42900E89FA6DCEB71A4A9CF676B 96DFB3CCFF62661F962C275B465D9B1FE3D5AF474853BFFE9D21EBFBF5CF072B 895A0F00C412786D46AD4A4853EF2D325918000C9CA7EFE1AEC7947C1F2BFE01 00E8CB3D4DDD27EFBB6BEA5E4FE48801404F7EFEFCF99821F4ADA9C75D80EF0F 5E0000EDF9F91FA63B7D680A0046694AD96F0A4D0100690A0080340500A42900 00D2140090A6485300409A0200204D0100694A26F908E1F7EB9F37B4F86AB9ED 26DFD9624F1A7DAF9EC8C76D9E9D8C3A0B1B9C32D2942F4D759683A3C8BDF724 64970696F9FA4D3FEC34B3ACE41FA0E26E3FBE264E38364D0DB99C1D9A8ADDA5 D535B54AD208D41490A63469AA58410BAC0BE4AA9FE13B20ACF6FDA2E6CDF2EB 21FB2F7CBC7E0F63CFF5E3240AAFBFB7F8FE67719F57A90B93A61A69EA5D7EDA 5D68B98DB64853C5CD29DFACFF3B6AFF93EB89DAC3A873ADD454D3B3001BA4A9 643B76510EF59ACAB59FE736D44E53457DE9F74DB3AB81974F321AB9D3B27525 EEE3AC2F5DF2A79A165158374DC5D60534FF354A5342A52FE734C1F64D2F1F61 8BB98A52710FA3CE359A224DF56C9BEAD61F601E4DE925503C8CAD2F1F6B38EC 99F7E4F62834459A4253F59A7257EE72EF6F7AA7AFB25A1AD87A86A6485343D2 D4AE4DE8A60B64862674A1DFD49C4DE8CA5AB31C5F4D6F465367A6A92BBA4382 DC8A2EF7870FF4A4A36D2AEA767FD4314CC621B97F45F2BE7FBB0E099A7FCA07 F05277484053FBA529880A81EC21A02946484002680A485380A600664B53C23C CBAD2FA5519BBE32DD87D652E5C0A317BBB73CD8429A0200583D4D010090A600 8034459A0200D2140000690A0048530000B3A5A99F0000BD70A4290E1A00F4D7 94354D010074C3D7360500D007D214004CEE28F79D3E6EF601409FDB7C35698A 6308003D35459A02800FC3EB7AA429009859537FBD449A02806935F5ED25D214 00283535AA318A3405002B6A8A34050027A4A9139E2DA200039A5A3A4D6DEF28 3224A0A93DD2D4DE278E020C686A833485A65A70CEF4734CAE37B3A692E7E5F3 62EEACE9CF26696A514D9D3657E69CDFCBB757F5676AD4D1985353A4A9393595 2BE71B9B6A0F4D45FDACACA529E15B90A676D554B16C33FFF8242742F37EC799 1A787EEBD3D47DCF73BFB0A4A99D34454BCE703BF934E53B593354ED2B3575DF 67CDDFA4A94535155244F52BD127B7E49BE56B4A58B3357538B6E296864F17A6 2FBBA2A684DDCB3552155F274DADAEA9C024205F3B4AD52809D7547143E19AF2 BD39562CEBA6A9DC1BE46236304DE97FB6D054C83191D34E8B77CA1FAFD79469 43264D859F0E34A54F5353B54DE97FB0D054ACA64E7B517F4BD47DE7CEF4CEFA 5A1B9AEA99A6D05460F92CB60F28A34B60C8E92C1FFD371AA8A99026269AD049 53686A334DBD0BFF23D8F86A7C359A2AB6FC6FA9A9AB4D87842169EA5D72D054 7D6388BE7DBBA7A6F4922C26224D43BA50FFEAA9A97AE1CCA6A9D64C95A672E5 134DA1A9104DBDD52428AB5B137AD3ED9EA0A96E694AEE1283A694D9D85795AB B9A066D094E9D0E92B80688A34459A6A1AA84C1969ACA62E45B799404DC53E08 89A68E4A53B44D0506AAFA8E8EDD1AC66B347519BB688ED594E3B0A0A939D314 95BED86020FCAFF545530BB0E37A343D95E3F8460EAD55EA22FCA8A229FA4DAD A5A94BD10F4793281C4FC1B813420B4D5DC6A151C66AAAF2A8A229D2D4729AD2 C7277D180B0F391D3465FA46C3355553C39D4A5363E746214DADA52980FEA57D F8144E9DD3148F1E03ACA5A919669A63BC29340530398C3785A600D6D214690A 4D0190A6D0140090A6D01400690A4D5172004853680A004853680A803485A600 803485A6004853EE34F5676B283900ABA7A93FBB43C901583A4D01004C9EA600 00485300409A224D0100690A0080340500A429A1DF141C88EF678BE3067211A2 DF144451A3298E1E0845A8519AA232786632AFD1140710FAA7298E39650C4D41 0B4D91A6004D01690AD014050648534ABEF2506036D3D4846739398DBBE9FDD6 F5D7AC8D343589B236DB109A6A778DB7D3546EBB0EAF6EACA963DBA6D0149A42 53A4A9153595AC207CFF7D7FF1FE9EC73B1F1F4FAE6D9B6AE68A9ACA9D0EE1F5 5C49B8FFF3B139E1E3EF9DD4BC9EABBA268BE2FB3D8EB591A6E6D4D45B2F42C1 36FD9DDCE806A65A344D25CF82F51457960493A62A37A45F5BFFC2499AAA0CF9 F249D7BF2D57B04953ADCFAFD07E9E0C18EE535CCC6FB2A68AE6AC2972494DE5 3ED5BF7092A62A2B7D0E4D293F4EA56F86B629E1B4EA4FA5720DB369AA58D5A5 6D6A894A5F7D9AD2F8104D4DAB29EB478458A2D1941CF09AA6A9B1859334E5D0 5460A5CF5AE6D1544F4D992A7D0E4D592B7D53698AB6A955D254B1D6E66BCFA4 097D064DD534A15BD394B2D2E75EA1FEEFA59BD04953B986A3649783E4DB922D 12B2D9689B1AD50BDD74B74EEE51A0699B2A1624476397A9285E5B7448E099BE D66D201BC3337D409A9AD64B63EFE1A229384D53A4A9CA0A05650C4D01690AD0 1490A6485380A6E08434054C0B622A9C009D679661828C9371688A8306721162 D6630098BF32C8ACC700B090A6485300409A0200204D0100690A4D01C0BA698A 8E1F747A711742803EFDA6BE37040752D90B1DA05B2F741E7C383999F3B00CB4 28428DD21449FE344234C561DCA324F8AAF357C767FA2872C7B627A029781480 A822D43A4D7DC1EE7C8A4194A6A8FB2CCA5B08DF27F47FFFF2F73DEF574C9A0A 4F535CC5680A4DA1A98791922F8E4D539FFF924BFB7D25B9690D1FE3DE9B5E91 376D7A1D3A684A9EE0D237566AFF41568F1AD0B59BA65AA429CDC5FE2E969552 42534B6B4A3FE59CD203C20C3253696A69AD1535752F2AB9D707A6A9A69ABA6E 73FAA0A9A334A5BFAEDD1F4453136AAA439A7A9C1187A6926FC87D2497F91F25 5FDE3D18DB36254FD15B396FAFA6C0080543AE549A56BEFAC41FB2A61EFF9BFC AF49D2D43B7237D594B039D3FB61754D0915BD904984AFFCECC9EE95A0A95169 2AA7A3769A326DAEA6E688A6C235559C68D8716927538D666DC539D9931AD437 B2EDAD29E1F9DF39D35488A6043BD56C0E4D2D9DA68A779073092A2796E4AABE 7493B0A3A9769A5A254DA1293455D9EC6C4D471A4DE91D7894A63E9D10842EE8 A42934C59D3EE183952629063C34253BCAA1A90E692AA4095DDF57C1B4399AD0 0FEC37A54953354DE8D6956FDC2121C784FDA61CF76ADD9A923B24C81D184853 632B7DB932536C772ACA4ADF849ECBDBD60E09C5862F9F7BD7AAF469A6E79BB3 17FA65EFF90907B64D4DC5D749CFBF74D0D49C6D53D65A159A4253686A034DE5 4EFD3C6D5342971559503410A1293485A65AA729CEDD398593815C28098BA629 CE1D9A4253686AFE3465BA2F23F7E99D24F3CBCF47A0A9704DE55A32E573A4EF 944E458F3465EAD9A2ECBFF755F7507C48BB0445B78FA6E43E4EC5B3A03F4D5F A5511460EF3455F3B385A64ED6D4576AD41DD3590ED1149C96A6DECFB6583525 DF0A4CBE27D7D5BCF8746A6E9D73564837D3D4DB4E8EDFACAFFCE02DFA02337F 5B04692A304D151B761C694AF9F0827537F40F4450381BF542177C55A3295F81 A1009C93A6344F973B3495FC2F7D89F20D1344296DA729D393B91D4E2E374D4E 4B532D34551C1748A839BA4733A3B8AEAB296B81A1D2479A8A4D53CAC4559418 9A1AAB2961E89ED834658AE8B92204A4A9169AA2D23779DB94324D39EEF48568 8A0260D5D4CCE34D5DD334A19B1A5169425F4253BE7E53BE024301A8D154ECB0 781DFA4DD57748C8153661E81EB957837CDF39573229A5433465ED52AEEC9020 1718DAA66A34153E2C5EE75EE8A37A69C25A9A02343555BF293485A638A4686A 489A3275FF265DA32940539DD314A0293485A6264F5380A6D0149A9ABF6DCA54 C5CB3D0DEA68B0B25618DB5530371EA56A923B7D726F289A0E4853454D59FD50 BCEFBF96A6F6EEC630C97853688A34D57ABC293485A6AEEAF1A6DC73220369CA D4BDD3A429CD9CA142A5B2F2FD8E818CB6BC7739CF7853CA19D8F50F1D63B933 D394A68946F93855CD24DAE17F17DF499AB26ACA31DE946606F6E4394253A4A9 D68F1E5FE2335F4D5F77EC159AD268CA3D904BF1EFE49AD11469AA66A482819A 2A0E4984A616D5947C6695E71ACE4C539A76AA51694A29193435C37853F2B3C3 C5338BA648538ECAD4CC9A52FE134D39DAA694E725F78AEFCCBE9770669A2A36 32576AAAFFDF878F5235E17853F22D3FA1C99D5629D2D4A37140D36260D5D435 A243C2E1A354CD39EBB1DC7E55ECC78EA64E4E53A6A61E0A0C9A02347531DE14 A029204D31DE149A4253688AF1A6004D01698AF1A6004DC1EE6D53C5BA9B69B0 296A8527682A77CFD4D468C0D9214D450DE4E2EB9A9E6B99870D34A5EF8E5B79 1F1948534D3545993C4753BEF34E91204DD577EF2C3EB17279C7C413FA586A46 62517E90083783A6AE8ACEBDEE22017BA7A9E2683FF59A723CF3A27FF3B5F5A8 E6B369CAFA4842E063509CEB93D394E3C997CA30AF1FA131648C293415A529DF B078EED74D4502B64F531D34551C2ACA371291BC7E0AE7F0F1A66A460F4353A4 A99E9AD2FC10EB7FA9AFD2DD258AEE129A2A9E5934459A928D147BA72F2AE16B 2C4AD11DAEA99AD1CCD01469AA5D13FAA56ED67654FAE40FD2AC3A95A67CC5A0 BE48C0DE69EA52F42EB6D6EF84B6A3CB387B8872C0ABE4FA299C33F442777448 701409D83B4D59A16C1CAB29405303D3149A4253680A4D4D3EDE945E50246D34 0568EA62BC294053409A023485A6D014690AF6D5947B5029F93E609F2685D899 493BEF3C690AD094A6CC2887463469EA7DE12FA4A99E3B4F9A0234A5D4D4E57D F4DB3ACD68534D355ADBB19A224DC1FC9A2AF6E1F4694AD3B9F7317BBB7276DA C71FA6696DDD3BDF7F845BD2149CA629B95BB8FE6FB9DEA4596D5253EDC6346B B4F31DA217690AD0947CB56A1EB3129AA04DAB750F6CD579E7951567D2145731 9A7268AA72048CAB7AC8A0393565DDF9CE4D58A429384D53CA510A6BAE74B740 66D094FEE3FB698A3405E7A4A91334B565A58F3405C33525F731886D85F6356E CBA31927FF2E6AAAD1CEF7CC54A4294053C919B1AD1D12E48668655781E24D37 B94382FE83353BBF718704D214CC50E93B9C450706214D019ADADB4B1B8C664C 9A02347582A9961E638D3405680AD014690AD01490A6004D593515382C40CF31 F96BAA6FB44D91A660214D39E6441BAEA9CA6E004B0FFE4F9A82333575C53DFA D1C70095F10F4D91A660334D39260F4D3E21F8EE0F204F3C2ACF67AA545072E8 2AFD34BB8E3793A6D0149AEA3C908BFB5197EBDFC75E4C0337299F6AD10F7150 F4A1E38B8C7A5E86340568EA6D8CA4046A1E22CE89C531AAB97254287D9556DE 07CDD382A4293485A63A8F90205F98CA116084118C35CF0E9B64E5D094E68BC8 DF7ACB4A1F690A26D154D136CAD4640D337272735CEC6E4D15774619C3BAC52A D21490A6FA68CAB751CD2B0E4D45D55E699B425368AAF37853C9FA54D4C85195 4DE8FA3679539AA2099D34052B6AEA8AEB90906CE4C9C944F38C70EE0DA6A1AB 723B731DDF218134053354FA1C2CDD3172B392409A0234A5AC7FC1AE9A224DC1 42696A83319AD014690ACEA9F401698A3405680A485380A634E34D091540CE05 698A34059D35656A77AAD714A2234D019A7268AAA73DD014690AD05488A692BD 34AFD7B324727785DCE49BA63EA29C7AD2141CAE29C7284C516FB8ECD3BE0369 0AD054AE6A263F1DAC79A24DF3F85BCD0809688A34055B6ACA3ACE805553C571 9CD014690AD0545153A6D1ED4C9AD28CE384A6485380A606A6298D82D014690A D0945066F403B9D4A72947133A679C340568AAB5A6AED2384EEFF6AB5CCA02D2 141C5BE90334459A023405A4298A1C9A4253688A3405680A4853A4294053409A 02347595C69B728CE5A29C72BD066EF991A6004D0913DE0DD7945E9E4D6D369B 2A495370A0A6AC57654F4D5D134C347CACA648533083A634462A0E397529E631 F70D2A659A09D4B1B9C001B24853680A86684A33A2944653BE41A54C23CCB827 5BBF829EEE214DA12918A529B9AEA74F53957546ABA68A9B730F9035437D706C 9AFAD8893405F3A429618C175FA5CF77F99BB6E5D694724C9BB1F5BEB169EAC7 BF90A660AA34E56E9BD20C3C553464074D2907C81AFE8874CF347537D2BD6DEA 93B54853D05A53A6DC52A3A9FACA541F4D993E389BA6FEE8B0A6A90F0F4DD136 053D35E5687F1672C87DE416E57A4C294EDED6A56E0997D3D48A4DE8829AEE6F B0B64D253545DB14F4D4D4A3922554BE34B5A1BB348A034FF93495DCD6651CC3 2A6480AC51A6122A7D39573CFE973B7DB0A2A660C592D05A53F49B023405E19A 7A9B2AF95FA4294053B087A6485380A6A085A61E3ACABD4E9A0234051B688A34 05680A1A69EADB48C917495380A660274D91A6004D413B4DFDE5FDCAF034F507 CE2050531CCCD54BC2432FE10FCBC4A6294E199AB26A8A23B999A6428A50BB34 05A751AF29A008754B53702C6E4D010845283C4D117AC9FCBEA657805C110A4F 530000E195C1D8340500D05453A42900204D010090A600803475D714B75001A0 0FBE34C5710380CE9A32A5290E1A00CC9CA6BE0000BAA34F53BF0100C6514C53 776BB164C992E5A8652E4DC5F2772B2D560B00F3D0F432CFA5A9C0F57FEF3FA6 02D85E538D1CF248539F7B7CB1CBCFFE375A3F4B962CC72E3F9779A3F57F34F5 A3199FFD07805D697A9973F71300E6E7FF1439BD97 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer geomview-1.9.4/doc/figs/mat.eps0000644000175000001440000023465310616356702013276 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: Sep 12 2003 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 242 307 370 455 %%EndComments %%BeginProlog %%BeginPreview: 128 148 8 592 % ff2929292929292929292929292929a9292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929a92929292929292929 % 29292929292929ff % ff6262626262626262626262626262a9296262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262a92962626262626262 % 62626262626262ff % ff626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262626262626262 % 6262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262ff % ff626262ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffff296262ff % ff626262296262626262292929292929292929292929626262626262626262626262292929292929 % 29292929292962626262626262626262626229292929292929292929292962626262626262626262 % 62622929292929292929292929296262626262622962626262622929292929292929292929296262 % 62626262296262ff % ff6262622962626262626262626262a9296262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262622962626262626262626262a9296262ffffffffff % ff6262a9296262ff % ff6262622962626262626262626262a929626262626262ff626262ffff6262626262626262626262 % 626262ff62626262ff62626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262622962626262626262626262a92962626262626262 % 62ff62a9296262ff % ff6262622962626262626262626262a929626262626262ffff62ffff6262ffff62ffff62ffff62ff % 62ffff6262ff6262ff62626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262622962626262626262626262a92962626262626262 % 62ff62a9296262ff % ff2962a92962ff626262626262ff62a9626262626262ff62ffff62ff62ffffff62ff62ffffff62ff % 6262ff62ffff62ff6262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262a9296262626262ff62626262622962626262626262 % 62ff62a92929a9ff % ff2962a92962ffffffffffffffff62a9626262626262ff62ffff62ffff6262ffff62ff62626262ff % 6262ffff626262ff6262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262a92962626262ffff62626262622962626262626262 % 62ff62a92929a9ff % ff2962a92962626262626262626262a9626262626262ff62ff62ff6262ff62ff62ff62ffff62ff62 % 62ff6262ff6262ff6262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262a92962626262626262626262622962626262626262 % 62ff62a92929a9ff % ff2962a92962626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262a92962626262626262626262622962626262626262 % 62ff62a92929a9ff % ff2962a92962626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262a9296262626262626262626262296262ffffffffff % ffff62a92929a9ff % ff2962a92962626262626262626262a9626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262a92962626262626262626262622962626262626262 % 626262a92929a9ff % ffa962a962a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a962a9a9a9a9a9a9a9a9a9a9a962a9a9a9a9a9a9a9 % a9a9a9a92929a9ff % ff2929a9a92020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020292929ff % ff2962a9a92020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020209b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505020202020202020202020202020202020202020 % 209b9b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505020505050505050505050505050505050505050 % 9b9b9b9b2929a9ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505020505050505050505050505050505050505050 % 9b9b9b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505020505050505050505050505050505050505050 % 9b9b9b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050ff505050ff50505050505050505050505050ff50505050ff5050505050 % 5050505050505050505050505050505050505050502050505050ff50505050505050505050505050 % 9b9b9b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050ff50ffff50ffff505050ffff50ffff50ff5050505050 % 5050505050505050505050505050505050505050502050505050505050ffff50ffffff5050ff5050 % 9b9b9b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050ff50ff50505050ff5050505050ff505050ff50505050ff5050505050 % 50505050505050505050505050505050505050505020505050505050ff505050ff505050ff50ff50 % 9b9b9b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050ff50ff505050505050505050ffff505050ff5050505050 % 50505050505050505050505050505050505050505020505050505050ff505050ff505050ff505050 % 9b9b9b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050ff505050ff50ff505050ff50ff505050ffff50ff50ff5050505050 % 5050505050505050505050505050505050505050502050505050ff50ff50ff50ff505050ff50ff50 % 9b9b9b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505020505050505050505050505050505050505050 % 9b9b9b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505020505050505050505050505050505050505050 % 9b9b9b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505020505050505050505050505050505050505050 % 9b9b9b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505020505050505050505050505050505050505050 % 9b9b9b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b296262ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a9205050ffff5050505050ff50ff50505050505050505050505050ffffff505050505050 % ffff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a9205050ff5050505050ff50ff50505050505050505050505050505050505050505050ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a9205050ff5050ff5050ff50ff50ff50505050ff50ff50ff50505050505050ff50ff50ff % 50ff50ff50ffff50ff505050ff50ff50ff5050ff50ff50ff50ff5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a9205050ff5050ff5050ff50ff50ff505050ff5050ffffff50505050505050ffffff50ff % 50ff50ffffffff5050505050ffffff50505050ff505050ffffff5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a9205050ff5050505050ff50ff50ff50505050ff5050505050505050505050ff505050ff % 50ff50505050ff50505050505050ff50505050ff5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a9205050ffff50505050ff50ff5050ff5050ff5050ffff505050505050505050ffff50ff % 50ff50ffff5050ffff50ff50ffffff5050505050ffff50ffff505050505050505050505050505050 % 505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff626262a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a2020202020209b202020 % 2020209b2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a5050505050509b505050 % 5050509b2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a5050505050509b505050 % 5050509b2050509b505050ffff505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a5050505050509b505050 % 5050509b2050509b50505050ff505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a5050505050509b505050 % 5050509b2050509b50505050ff505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a5050505050509b505050 % 5050509b2050509b50505050ff505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a5050505050509b505050 % 5050509b2050509b50505050ff505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b2020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff2962a9a920505050ff5050505050505050505050505050505050505050ff505050505050ff5050 % 50505050505050505050505050ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050ff50ff50ff50ff50ff50ffffff50ff50ff50ff50ff5050505050505050ff % 50ff50505050ff50ff50ff50ffff50ff50ff50ff50ff50ff50ffff50ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a9205050ff505050ff50ff50ff505050ffffffffff50ff505050ff5050505050505050ff % ffff50505050ffffff50505050ff5050ffff505050ff50505050ffffff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a9205050ff505050ff50ff50ff505050ffffff505050ff505050ff505050505050ff5050 % 505050505050505050505050ffff50ff5050505050ff505050ffff50505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a9205050505050ffff50ff50ff5050ff50ff50ffff50ff50505050ff5050505050ff50ff % ff5050505050ffff5050ffff5050ff50ff50505050ff50ffff5050ffff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 20509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a202020202020209b202020202020 % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050509b505050505050 % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050509b505050505050 % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050ff50505050ff505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050509b505050505050 % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050ff50505050ff505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050509b505050505050 % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050ff50505050ff505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050509b505050505050 % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050ff50505050ff505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a209b9b9b9b9b9b9b9b9b9b9b9b9b % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b505050ffff50ff50ffff50505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b2020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920505050ff5050ff505050ff5050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b2020202020202020202020202020202020202020202020202020202020202020 % 20509b9b296262ff % ff626262a9205050ff505050ff505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b296262ff % ff626262a920505050ff5050ff50ff50ff50ff50ff5050ff50ff50ff50ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b296262ff % ff626262a92050505050ff50ff505050ff505050ff50505050ff50ffffff50ffff50ffff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b296262ff % ff626262a9205050ff505050ff505050ff505050ff50505050ff5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b296262ff % ff626262a920505050ff5050ff505050ff505050ff50505050ff50ffff5050ffff50ffff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 20509b9b296262ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a20202020202020202020202020206a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a205050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b50505050ff50ffffff5050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a205050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b50505050ff50ff50505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a205050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b50505050ff50ffffff5050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a205050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b50505050ff505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a205050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b50505050ff50ff50505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a205050505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b50505050ff5050ffff5050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a9b9b9b9b9b9b9b9b9b9b9b9b9b9b6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b2020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff626262a9205050ff50ff505050505050505050505050505050ff505050505050505050505050ff % 505050505050ff5050505050505050ff505050505050505050505050505050505050505050505050 % 50505050505050202020202020202020202020202020202020202020202020202020202020202020 % 20509b9b296262ff % ff626262a92050505050505050ff5050ffff5050ffff505050ffff50ffff505050ff5050505050ff % 50ffff50ffffff50ffff5050ffff50ff5050ff505050ff5050ffff5050ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b296262ff % ff626262a920505050ff50505050ff505050ff505050505050ffff505050ff5050505050ffffff50 % 505050ff5050ff505050ff50505050ff505050ff505050ff50505050ff50ff505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b296262ff % ff626262a92050505050ff505050ff50505050505050505050ffff50ff50ff5050505050505050ff % 505050505050ff5050505050505050ff50ff50ff505050ff50505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b296262ff % ff626262a9205050ff50ff50ff50ff50ff50ff50ff5050ff50ffff50ff50ff5050505050505050ff % 50ff50ff5050ff50ff50ff50ff50ffff50ff50ff505050ff50ff50ffff50ff505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 20509b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b50509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a2020202020202020202020202020 % 206a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050509b505050505050 % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050509b505050505050 % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050ff50505050ff505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050509b505050505050 % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050ff50505050ff505050505050505050505050505050505050505020 % 20509b9b296262ff % ff2962a9a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050509b505050505050 % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050ff50505050ff505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050509b505050505050 % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050ff50505050ff505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050509b505050505050 % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b505050ffff50ff50ffff50505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a209b9b9b9b9b9b9b9b9b9b9b9b9b % 9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a920509b2020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b2020202020202020202020202020202020202020202020202020202020202020 % 20509b9b2929a9ff % ff2962a9a9205050505050505050ffff505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050505050505050ff50ff50ff50ff50ff50ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050ff5050ff5050ff5050505050ff50ffffff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050ff5050ff5050ff5050505050ff505050ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050505050505050ffffff505050ff50ffffff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b509b9b2929a9ff % ff626262a92050505050505050505050505050ff5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b50509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20202020202020202020 % 202020202050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a5050505050509b505050 % 5050509b2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a5050505050509b505050 % 5050509b2050509b505050ffff505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a5050505050509b505050 % 5050509b2050509b50505050ff505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a5050505050509b505050 % 5050509b2050509b50505050ff505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a5050505050509b505050 % 5050509b2050509b50505050ff505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a5050505050509b505050 % 5050509b2050509b50505050ff505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b2050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a920509b2020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b5050505050505050505050505050505050505050505050505050505050505020 % 20509b9b296262ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b2020202020202020202020202020202020202020202020202020202020202020 % 20509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ffa9a9a9a9205050505020202020209b505050ffff505050ffffffffffff505050ffffffff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b29a9a9ff % ff2962a9a9205050505050505050509b505050ff505050505050ff50505050505050ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b292929ff % ff2962a9a9205050505050505050509b505050ff50ff50ff5050ff50505050505050ff5050ff5050 % ff50ff50ff5050ff50ff50ff50ff50ff50ffff5050ff50ff50ff50ff505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a9205050505050505050509b505050ff5050ffff5050ff50505050505050ff5050ff5050 % ffffff5050505050ff50505050ff50ffffffff5050ffffff505050ff505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a9205050505050505050509b505050ff50ff50ff5050ff50505050505050ff5050ff5050 % 5050ff505050505050ff505050ff505050ffff5050505050505050ff505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a920505050509b9b9b9b9b9b505050ff5050ffff5050ff50505050505050ff5050ff5050 % ffffff5050505050ff505050ff5050ffffffff5050ffff50505050ff50ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050505050505050ff5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff2962a9a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b2929a9ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b296262ff % ff626262a92050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50509b9b296262ff % ff626262a99b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b296262ff % ff626262ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffff296262ff % ff626262626262626262292929292929292929292929626262626262626262626262292929292929 % 29292929292962626262626262626262626229292929292929292929292962626262626262626262 % 62622929292929292929292929296262626262626262626262622929292929292929292929296262 % 62626262626262ff % ff6262626262626262626262626262a9296262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262a92962626262626262 % 62626262626262ff % ffa9a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9ff %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 265 string def gsave 242.4 306.84 translate 127.2 148.32 scale 265 309 8 [ 265 0 0 -309 0 309 ] { picstr readstring } image 80008000f7000000e3d6019d5680d6b9d6015656e2d6019d007f00d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69d56d6d69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69d08d69dd69dd69d9d9d000300d69dd6e59d 0256d6d6809dbb9d035656d6d6e49d0156000200d6d6e49d0156d6809db9 9d0156d6e49d02569d007f00d69dd69d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d567f9d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d56019d 56fb9d0156007f00d6d69d9d9d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d7f569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d08569d9d9dd6 9d569d000600d69dd69d569d8000850006d6d69d9d9d56000700d6d69d9d 9d560080d687d60700d69dd69d569d007f00d69dd69d569d00d6d69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd6d6d69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d9dd6d69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd6089d00d6d69d9d9d56000800d6d69d9d9d5600d6ea9d0156d680 9dd29d0156d6e99d0256d6d6eb9d085600d69dd69d569d000900d69dd69d 569d00d6d6eb9d0256d6d6809dd39d0256d6d6eb9d025656d6fc9df200fd 9d09565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d025656d6f19d 010000f99d010000e39d010000f69d010000989d025656d6e99d0656d6d6 9d9d9d00f49d0000fc9d085600d69dd69d569d000900d69dd69d569d00d6 d6eb9d0256d6d6f29d010000fa9dfd00f69d010000ef9d010000f69d0100 00979d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d 9d9d56000800d6d69d9d9d5600d6eb9d025656d6f19d010000fb9dfd00f5 9d010000e49d010000979d025656d6e99d0656d6d69d9d9d00f49d0d0000 9d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6f3 9dfc00fd9dfc00fd9dfc00019d9dfb00019d9dfc00fd9d0a00009d00009d 00009d9d9dfc00fd9d010000969d0256d6d6eb9d025656d6fc9d0000f49d 0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d025656 d6f29d2100009d009d9d9d009d00009d9d00009d9d00009d9d00009d9d9d 00009d9d00009d9dfb000e9d00009d9d00009d9d00009d9d0000979d0256 56d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b 00d69dd69d569d00d6d69d9df000fd9d0256d6d6f39d0900009d009d9d00 009d00f99d1200009d9d00009d9d00009d9d9d00009d9d0000fc9d010000 fa9d0400009d0000959d0256d6d6f99dfc00f69d025656d6fc9d0000f49d 0d00009d9d565600d6d69d9d9d56000c00d6d69d9d9d5600d69d9d9d00f2 9d05009d9d5656d6f39d0d00009d9d009d00009d00009d9d9dfb00069d9d 00009d9d9dfa00039d9d0000fc9d0400009d9d9dfb00039d9d0000969d02 5656d6f89d04009d9d0000f69d0656d6d69d9d9d00f49d0d00009d9d9d56 00d69dd69d569d000c00d69dd69d569d00d6d69d9d00f29d0600009d9d56 d6d6f49d1a00009d9d0000009d9d00009d9d00009d9d00009d9d00009d9d 0000f99d010000fc9d0d00009d9d00009d9d00009d9d0000959d0256d6d6 f99d04009d9d0000f79d025656d6fc9d0000f49d0d00009d9d565600d6d6 9d9d9d56000b00d6d69d9d9d5600d69d9d9def00039d5656d6f39d1a0000 9d9d0000009d9d00009d00009d9d9d00009d00009d9d9d0000f99d010000 fc9d0d00009d00009d9d9d00009d9d0000969d025656d6f89dfb00f69d06 56d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d 569d00d6d6fc9df100049d9d56d6d6f59d2300009d9d9d00009d9d00009d 9d00009d9d00009d9d00009d9d9d00009d9d00009d9d0000fc9d0d00009d 9d00009d9d00009d9d0000949d0256d6d6f89dfc00f79d025656d6fc9d00 00f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d 025656d6f49d1a00009d9d9d00009d9d00009d9d9d0000009d00009d9d00 009d9d9dfc00fd9d010000fc9d0d00009d9d9d0000009d00009d0000959d 025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d 000900d69dd69d569d00d6d6eb9d0256d6d6809dd39d0256d6d6eb9d0256 56d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d 5600d6eb9d025656d6809dd39d025656d6e99d0656d6d69d9d9d00f49d0d 00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6 d6809dd39d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6 d69d9d9d56000800d6d69d9d9d5600d6eb9d025656d6809dd39d025656d6 e99d0556d6d69d9d9df100fd9d085600d69dd69d569d000900d69dd69d56 9d00d6d6eb9d0256d6d6809dd39d0256d6d6eb9d025656d6fa9df3000b9d 9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d025656d6809dd3 9d025656d6e99d0256d6d6eb9d085600d69dd69d569d007f00d69dd69d56 9d00d69d9d569d569d569d569d569d569d569d569d569d569d56d6569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d567f9d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d56d6569d569d569d 569d569d569d569d569d569d569d569d5656d69d569d569d569d569d569d 569d569d569d569d569d56085600d6d69d9d9d560008009d569d9d9d5600 9de956009d8056d156009de856009de9560700d69dd69d569d000000fb56 009d8000850001d6d6fc56ff000000fcd6039d56565680df88df0200d69d fcd6ff000800d6d6d69d569d565680df89df086400d6d69dd6d6d6000800 d6d69d9d9d56565680df8adf09646400d69dd69d569d000a00d69dd69d56 9d5656dfdf80af8daffd640700d6d69d9d9d56000a00d6d69d9d9d565656 dfdf80af8daffd640700d69dd69d569d000a00d69dd69d569d5656dfdf80 afbaafd4df0baf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdf 80afbaafd6df0d6464af64646400d69dd69d569d000a00d69dd69d569d56 56dfdf80afbaafd7dffd640baf64646400d6d69d9d9d56000a00d6d69d9d 9d565656dfdf80afbaaffddfdbaffc640baf64646400d69dd69d569d000a 00d69dd69d569d5656dfdf80afbaaffddfdbaffc640baf64646400d6d69d 9d9d56000a00d6d69d9d9d565656dfdf80afbaaffddfdbaffc640baf6464 6400d69dd69d569d000a00d69dd69d569d5656dfdf80afbaaffddfdbaffc 640baf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afbaaf fddfdbaffc640baf64646400d69dd69d569d000a00d69dd69d569d5656df df80afbaaffddfdbaffc640baf64646400d6d69d9d9d56000a00d6d69d9d 9d565656dfdfa2af0000f7af0000e5af0000f6af0000caaffddffdaffb00 e3affc640baf64646400d69dd69d569d000a00d69dd69d569d5656dfdfa2 af010000f9af010000f6af0000f0af0000f6af0000caaffddffdaf0000fc af010000e5affc640baf64646400d6d69d9d9d56000a00d6d69d9d9d5656 56dfdfa2af010000f9af010000f6af0000e5af0000caaffddffdaf0000fb af0000e5affc640baf64646400d69dd69d569d000a00d69dd69d569d5656 dfdfa2af0200af00fbaf0500af00afafaffc0007afaf000000afafaffc00 fdaf0800af0000af00afafaffc00fdaf0000caaffddffdaf0000faaf0300 afafaffc00fdaf0400af000000fcaffc00fdaffc640baf64646400d6d69d 9d9d56000a00d6d69d9d9d565656dfdfa2af0200af00fbaf2900af00afaf 0000afaf0000afaf00afafaf0000afaf0000afaf0000afafaf00afaf0000 afaf0000afaf00caaffddffdaf0000faaf1a00afaf0000afaf0000afaf00 00afaf0000afaf0000afaf0000afaffc640baf64646400d69dd69d569d00 0a00d69dd69d569d5656dfdfa2af0a00afaf00afafaf00afaf00f9af0700 afaf00afafaf00fcaf0300afaf00fcaf0000f9af0300afaf00caaffddffd af0000faaf0300afaf00fcaf0300afaf00fcaf0300afaf00fcaf0200afaf fc640baf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdfa2af0d 00afaf00afafaf00afaf00afafaffb0005afaf00afafaffa0002afaf00fc af0300afafaffb0002afaf00caaffddffdaf0000faaf0300afaf00fcaf03 00afaf00fcaf0200afaffa0001afaffc640baf64646400d69dd69d569d00 0a00d69dd69d569d5656dfdfa2af1900afafaf00af00afafaf00afaf0000 afafaf00afaf00afafaf00f9af0000fcaf0b00afaf0000afafaf00afaf00 caaffddffdaf0000faaf0300afaf00fcaf0300afaf00fcaf0300afaf00f9 affc640baf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdfa2af 0d00afafaf00af00afafaf00afaf00fcaf0700afaf00afafaf00f9af0000 fcaf0300afaf00fcaf0300afaf00caaffddffdaf0000fbaf0400afafaf00 fcaf0300afaf00fcaf0300afaf00f9affc640baf64646400d69dd69d569d 000a00d69dd69d569d5656dfdfa2af0000fcaf0000fcaf1700afaf0000af af0000afaf00afafaf0000afaf0000afaf00fcaf0b00afaf0000afaf0000 afaf00caaffddffdaf0000fcaf0d0000afafaf0000afaf0000afaf00fcaf 0a00afaf0000afaf0000afaffc640baf64646400d6d69d9d9d56000a00d6 d69d9d9d565656dfdfa2af0000fcaf0000fcaf0f00afafaf000000af0000 afaf0000afaffc00fdaf0000fcaf0b00afafaf000000af0000af00caaffd dffdaffb00faaffc00fdaf0000fcaf0300afafaffc00fdaffc640baf6464 6400d69dd69d569d000a00d69dd69d569d5656dfdf80afbaaffddfdbaffc 640baf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afbaaf fddfdbaffc640baf64646400d69dd69d569d000a00d69dd69d569d5656df df80afbaaffddfdbaffc640baf64646400d6d69d9d9d56000a00d6d69d9d 9d565656dfdf80afbaaffddfdbaffc640baf64646400d69dd69d569d000a 00d69dd69d569d5656dfdf80afbaaffddfdbaffc640baf64646400d6d69d 9d9d56000a00d6d69d9d9d565656dfdf80afbaaffddfdbaffc640baf6464 6400d69dd69d569d000a00d69dd69d569d5656dfdf80afbaaffddfdbaffc 640baf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afbaaf fddfd7640baf64646400d69dd69d569d000a00d69dd69d569d5656dfdf80 afbaaf01dfdfd6640baf64646400d6d69d9d9d56000a00d6d69d9d9d5656 56dfdf80afbaaf00dfd5640baf64646400d69dd69d569d000a00d69dd69d 569d5656dfdf80af8daffd640700d6d69d9d9d56000a00d6d69d9d9d5656 56dfdf80af8daffd640700d69dd69d569d000a00d69dd69d569d5656dfdf 80af8daffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80af8d affd640700d69dd69d569d000a00d69dd69d569d5656dfdf80af8daffd64 0700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80af8daffd640700d6 9dd69d569d000a00d69dd69d569d5656dfdf80af8daffd640700d6d69d9d 9d56000a00d6d69d9d9d565656dfdf80af8daffd640700d69dd69d569d00 0a00d69dd69d569d5656dfdf80af8daffd640700d6d69d9d9d56000a00d6 d69d9d9d565656dfdf80af8daffd640700d69dd69d569d000a00d69dd69d 569d5656dfdf80af8daffd640700d6d69d9d9d56000a00d6d69d9d9d5656 56dfdffbaffb00fbaf0900afafaf0000afaf0000e5aff900f4af030000af 0080afd8affd640700d69dd69d569d000a00d69dd69d569d5656dfdffbaf 0000fcaf0c0000afafaf00afaf00afafaf00e3af0000fbaf010000f6af04 00afafaf00efaf000080afeaaffd640700d6d69d9d9d56000a00d6d69d9d 9d565656dfdffbaf0000fbaf0000faaf0400afafaf00e3af0000faaf0000 f6af0400afafaf00efaf000080afeaaffd640700d69dd69d569d000a00d6 9dd69d569d5656dfdffbaf0000faaf0e00afaf00af000000af000000afaf 00fcaf0500afaf000000fcaffc00f9af0000faaf0300afafaffc000aafaf 000000afaf00afafaffc00fcaffc0006af000000afafaffc00fdaf0400af 000000fcaffc00fdaffc0089affd640700d6d69d9d9d56000a00d6d69d9d 9d565656dfdffbaf0000faaf0e00afaf00afaf00afafaf00afafaf00fcaf 0e00af00afafaf00afaf0000afaf0000faaf0000fbaf4200afafaf0000af af0000afaf00afafaf00afaf0000afaf0000afaf0000afaf0000af00afaf af0000afaf0000afaf0000afaf0000afaf0000afaf0000af0000afaf0000 8aaffd640700d69dd69d569d000a00d69dd69d569d5656dfdffbaf0000fa af0e00afaf00afaf00afafaf00afafaf00fcaf0300af0000fbaf0000fcaf 0000faaffa00fcaf0000fcaf0a00afaf00afafaf00afaf00fcaf0300afaf 00faaf0000f8af0300afaf00fcaf0300afaf00faaf0000fcaf00008aaffd 640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffbaf0000faaf0e00 afaf00afaf00afafaf00afafaf00fcaf0800afaf000000afafaffa00faaf 0000fbaf0300afafaffa0008afaf00afafaf00afaffa0002afaf00faaf00 00fcaffb0002afaf00fcaf0300afaf00faaffa008aaffd640700d69dd69d 569d000a00d69dd69d569d5656dfdffbaf0000faaf0e00afaf00afaf00af afaf00afafaf00fcaf0000fcaf040000afaf00f5af0000faaf0300afaf00 f9af0700afafaf00afaf00f9af0000faaf0c00afafaf0000afafaf00afaf 00fcaf0300afaf00faaf000085affd640700d6d69d9d9d56000a00d6d69d 9d9d565656dfdffbaf0000fbaf0f00afafaf00afaf00afafaf00afafaf00 fcaf0000fbaf0300afaf00f5af0000faaf0300afaf00f9af0700afafaf00 afaf00f9af0000fcaf0600af00afafaf00fcaf0300afaf00fcaf0300afaf 00fcaf0200af0085affd640700d69dd69d569d000a00d69dd69d569d5656 dfdffbaf0000fcaf230000afafaf00afaf00afafaf00afafaf0000afaf00 00af00afafaf00afaf0000afaf0000faaf0000faaf2d00afaf0000afaf00 00afaf00afafaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00 00afaf0000afaf00fcaf0f00afaf0000afaf0000af0000afaf00008aaffd 640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffbaffb00fbaf0700 afaf00afafaf00fcaffd0006af00afaf000000fcaffc00f9af0000faaf03 00afafaffc00fdaf0700afafaf00afafaffc00fcaffc00fdaf0b0000afaf 000000af0000af00fcaf0300afafaffc00fdaffc00d3afb964fdaffd6407 00d69dd69d569d000a00d69dd69d569d5656dfdf80afd7afbb640fdfdfaf afaf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af01 6464beaffddffdaffd640700d69dd69d569d000a00d69dd69d569d5656df df80afd7af016464beaffddffdaffd640700d6d69d9d9d56000d00d6d69d 9d9d565656dfdfafafaf8064dd64fdaf016464beaffddffdaffd640700d6 9dd69d569d000d00d69dd69d569d5656dfdfafafaf8064df6406dfdfafaf af6464beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656 dfdfafafaf64648095dfdffdaf016464beaffddffdaffd640700d69dd69d 569d000f00d69dd69d569d5656dfdfafafaf64648095f2df0064f2df0864 dfdfdfafafaf6464beaffddffdaffd640700d6d69d9d9d56000f00d6d69d 9d9d565656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdf afafaf6464beaffddffdaffd640700d69dd69d569d000f00d69dd69d569d 5656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf 6464beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656df dfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464f7 af0000c8affddffdaffd640700d69dd69d569d000f00d69dd69d569d5656 dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464 f9affd00c8affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d5656 56dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf64 64f7af0000c8affddffdaffd640700d69dd69d569d000f00d69dd69d569d 5656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf 6464f7af0000c8affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d 565656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafaf af6464f7af0000c8affddffdaffd640700d69dd69d569d000f00d69dd69d 569d5656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfaf afaf6464f7af0000c8affddffdaffd640700d6d69d9d9d56000f00d6d69d 9d9d565656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdf afafaf6464f7af0000c8affddffdaffd640700d69dd69d569d000f00d69d d69d569d5656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdf dfafafaf6464f7af0000c8affddffdaffd640700d6d69d9d9d56000f00d6 d69d9d9d565656dfdfafafaf6464809501dfdff4af0164dff4af096464df dfdfafafaf6464f7af0000c8affddffdaffd640700d69dd69d569d000f00 d69dd69d569d5656dfdfafafaf6464809501dfdff4af0164dff4af096464 dfdfdfafafaf6464f7af0000c8affddffdaffd640700d6d69d9d9d56000f 00d6d69d9d9d565656dfdfafafaf6464809501dfdff36400dff264fddffd af016464f7af0000c8affddffdaffd640700d69dd69d569d000f00d69dd6 9d569d5656dfdfafafaf6464809500dfe364fddffdaf016464beaffddffd affd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf646480 dfdfdffdaf016464beaffddffdaffd640700d69dd69d569d000e00d69dd6 9d569d5656dfdfafafaf6480dfdedffdaf016464beaffddffdaffd640700 d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af016464beaffddf fdaffd640700d69dd69d569d000a00d69dd69d569d5656dfdf80afd7af01 6464beaffddffdaffd640700d6d69d9d9d56000a00d6d69d9d9d565656df df80afd7af016464beaffddffdaffd640700d69dd69d569d000a00d69dd6 9d569d5656dfdf80afd7af016464beaffddffdaffd640700d6d69d9d9d56 000a00d6d69d9d9d565656dfdff8af0000f0af0000faaf0000e6aff900f4 af030000af00a9af016464bbdffdaffd640700d69dd69d569d000a00d69d d69d569d5656dfdff9affd00f1af0000faaf0000eeaf0000f9af0000fbaf 010000f6af0400afafaf00efaf0000bbaf0064badffdaffd640700d6d69d 9d9d56000a00d6d69d9d9d565656dfdff9af0200af00f1af0000e7af0000 f9af0000faaf0000f6af0400afafaf00efaf000080aff1affd640700d69d d69d569d000a00d69dd69d569d5656dfdff9af0200af00fcaf1500af0000 afaf0000afafaf00af000000afaf00afafaffc00fdaf0900af000000afaf 000000faaf0000faaf0300afafaffc000aafaf000000afaf00afafaffc00 fcaffc0006af000000afafaffc00fdaf0400af000000fcaffc00fdaffc00 90affd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffaaf2d00af afaf00afafaf0000afaf0000afaf00afaf0000afaf0000af00afaf0000af af0000afaf0000afaf0000afaf00f9af0000fbaf4200afafaf0000afaf00 00afaf00afafaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00 00afaf0000afaf0000afaf0000afaf0000afaf0000af0000afaf000091af fd640700d69dd69d569d000a00d69dd69d569d5656dfdffaaf1300afafaf 00afafaf00afafaf00afafaf00afaf00fcaf0500af00afaf00fcaf0300af af00fcaf0300afaf00f9affa00fcaf0000fcaf0a00afaf00afafaf00afaf 00fcaf0300afaf00faaf0000f8af0300afaf00fcaf0300afaf00faaf0000 fcaf000091affd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffb af0000fbaf0e00afaf00afafaf00afafaf00afaf00fcaf0400af00afaffa 0002afaf00fcaf0300afaf00f9af0000fbaf0300afafaffa0008afaf00af afaf00afaffa0002afaf00faaf0000fcaffb0002afaf00fcaf0300afaf00 faaffa0091affd640700d69dd69d569d000a00d69dd69d569d5656dfdffb aff9000dafaf00afafaf00afafaf00afaf00fcaf0500af00afaf00f9af00 00fcaf0300afaf00f9af0000faaf0300afaf00f9af0700afafaf00afaf00 f9af0000faaf0c00afafaf0000afafaf00afaf00fcaf0300afaf00faaf00 008caffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffbaf0000 fbaf0e00afaf00afafaf00afafaf00afaf00fcaf0500af00afaf00f9af00 00fcaf0300afaf00f9af0000faaf0300afaf00f9af0700afafaf00afaf00 f9af0000fcaf0600af00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf 0200af008caffd640700d69dd69d569d000a00d69dd69d569d5656dfdffc af0000f9af1f00af00afafaf00afafaf00afaf0000afaf0000af00afaf00 00afaf0000afaf00fcaf0300afaf00f9af0000faaf2d00afaf0000afaf00 00afaf00afafaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00 00afaf0000afaf00fcaf0f00afaf0000afaf0000af0000afaf000091affd 640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffcaf0000f9af1700 af00afafaf00afafaf00afaf00af000000afaf00afafaffc00fdaf0000fc af0500afafaf0000fbaf0000faaf0300afafaffc00fdaf0700afafaf00af afaffc00fcaffc00fdaf0b0000afaf000000af0000af00fcaf0300afafaf fc00fdaffc0090affd640700d69dd69d569d000a00d69dd69d569d5656df df80afd7afb964fdaffd640700d6d69d9d9d56000a00d6d69d9d9d565656 dfdf80afd7afbb640fdfdfafafaf64646400d69dd69d569d000a00d69dd6 9d569d5656dfdf80afd7af016464beaffddffdaffd640700d6d69d9d9d56 000a00d6d69d9d9d565656dfdf80afd7af016464beaffddffdaffd640700 d69dd69d569d000d00d69dd69d569d5656dfdfafafaf8064dd64fdaf0164 64beaffddffdaffd640700d6d69d9d9d56000d00d6d69d9d9d565656dfdf afafaf8064df6406dfdfafafaf6464beaffddffdaffd640700d69dd69d56 9d000f00d69dd69d569d5656dfdfafafaf6464da95e2dfa695fddffdaf01 6464beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656df dfafafaf6464da95f2df0064f2df0064a695fddffdaf016464beaffddffd affd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464da 9501dfdff4af0164dff4af016464a695fddffdaf016464beaffddffdaffd 640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464da9501 dfdff4af0164dff4af016464a695fddffdaf016464beaffddffdaffd6407 00d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464da9501dfdf f4af0164dff4af016464a695fddffdaf016464f9affc00f9affc00d4affd dffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf64 64da9501dfdff4af0164dff4af016464a695fddffdaf016464faaf0000fc af0000fbaf0000fcaf0000d5affddffdaffd640700d69dd69d569d000f00 d69dd69d569d5656dfdfafafaf6464da9501dfdff4af0164dff4af016464 a695fddffdaf016464faaf0000fcaf0000fbaf0000fcaf0000d5affddffd affd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464da 9501dfdff4af0164dff4af016464a695fddffdaf016464faaf0000fcaf00 00f6af0000d5affddffdaffd640700d69dd69d569d000f00d69dd69d569d 5656dfdfafafaf6464da9501dfdff4af0164dff4af016464a695fddffdaf 016464faaf0000fcaf0000f6af0000d5affddffdaffd640700d6d69d9d9d 56000f00d6d69d9d9d565656dfdfafafaf6464da9501dfdff4af0164dff4 af016464a695fddffdaf016464faaf0000fcaf0000f9affd00d4affddffd affd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464da 9501dfdff4af0164dff4af016464a695fddffdaf016464faaf0000fcaf00 00f6af0000d5affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d56 5656dfdfafafaf6464da9501dfdff4af0164dff4af016464a695fddffdaf 016464faaf0000fcaf0000f6af0000d5affddffdaffd640700d69dd69d56 9d000f00d69dd69d569d5656dfdfafafaf6464da9501dfdff4af0164dff4 af016464a695fddffdaf016464faaf0000fcaf0000fbaf0000fcaf0000d5 affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafaf af6464da9501dfdff4af0164dff4af016464a695fddffdaf016464faaf00 00fcaf0600afaf00afaf00fcaf0000d5affddffdaffd640700d69dd69d56 9d000f00d69dd69d569d5656dfdfafafaf6464da9501dfdff36400dff264 a695fddffdaf016464f9affc00fdaf0300afafaffc00d4affddffdaffd64 0700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464da9500df e364a695fddffdaf016464beaffddffdaffd640700d69dd69d569d000f00 d69dd69d569d5656dfdfafafaf646480dfdfdffdaf016464beaffddffdaf fd640700d6d69d9d9d56000e00d6d69d9d9d565656dfdfafafaf6480dfde dffdaf016464beaffddffdaffd640700d69dd69d569d000a00d69dd69d56 9d5656dfdf80afd7af016464beaffddffdaffd640700d6d69d9d9d56000a 00d6d69d9d9d565656dfdf80afd7af016464beaffddffdaffd640700d69d d69d569d000a00d69dd69d569d5656dfdf80afd7af016464beaffddffdaf fd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af016464 beaffddffdaffd640700d69dd69d569d000a00d69dd69d569d5656dfdff9 affd00fcaf0000f9af0000f6af000080aff9af016464bbdffdaffd640700 d6d69d9d9d56000a00d6d69d9d9d565656dfdffbaf090000afafaf0000af af00f9af0000f6af000080aff9af0064badffdaffd640700d69dd69d569d 000a00d69dd69d569d5656dfdffbaf0000fbaf0300afaf0080af9caffd64 0700d6d69d9d9d56000a00d6d69d9d9d565656dfdffbaf0000f8af1a00af 000000afafaf00afaf00af000000afafaf00afaf00af000000fcaffc00fc affd00fcaffd0080afccaffd640700d69dd69d569d000a00d69dd69d569d 5656dfdffaaf010000faaf310000afaf0000afaf00afaf0000afaf0000af af00afaf0000afaf0000afaf0000afaf0000afaf00afafaf00afaf00afaf af0080afcdaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff8 af010000fcaf0000fcaf0600afaf00afaf00fcaf0600afaf00afaf00fcaf 0300afaf00fcaf0400afaf0000fbaf01000080afcaaffd640700d69dd69d 569d000a00d69dd69d569d5656dfdff6af040000afaf00fcaf0600afaf00 afaf00fcaf0600afaf00afaf00fcaf0200afaffa00fdaffd00fcaffd0080 afccaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff5af0300 afaf00fcaf0600afaf00afaf00fcaf0600afaf00afaf00fcaf0300afaf00 f6af010000fbaf01000080afcdaffd640700d69dd69d569d000a00d69dd6 9d569d5656dfdffbaf0000fbaf0300afaf00fcaf0600afaf00afaf00fcaf 0600afaf00afaf00fcaf0300afaf00f5af0000faaf000080afcdaffd6407 00d6d69d9d9d56000a00d6d69d9d9d565656dfdffbaf090000afafaf0000 afaf00fcaf0600afaf00afaf00fcaf0600afaf00afaf00fcaf1600afaf00 00afaf0000afaf00afafaf00afaf00afafaf0097afb964fdaffd640700d6 9dd69d569d000a00d69dd69d569d5656dfdff9affd00fcaf0000fcaf0600 afaf00afaf00fcaf0600afaf00afaf00fcaf0300afafaffc00fcaffd00fc affd0096afbb640fdfdfafafaf64646400d6d69d9d9d56000a00d6d69d9d 9d565656dfdf80afd7af016464beaffddffdaffd640700d69dd69d569d00 0a00d69dd69d569d5656dfdf80afd7af016464beaffddffdaffd640700d6 d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af016464beaffddffd affd640700d69dd69d569d000d00d69dd69d569d5656dfdfafafaf8064dd 64fdaf016464beaffddffdaffd640700d6d69d9d9d56000d00d6d69d9d9d 565656dfdfafafaf8064df6406dfdfafafaf6464beaffddffdaffd640700 d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464f295e2df8e95 fddffdaf016464beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d 9d565656dfdfafafaf6464f295f2df0064f2df00648e95fddffdaf016464 beaffddffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfaf afaf6464f29501dfdff4af0164dff4af0164648e95fddffdaf016464beaf fddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf 6464f29501dfdff4af0164dff4af0164648e95fddffdaf016464f7af0000 fcaffa00d2affddffdaffd640700d69dd69d569d000f00d69dd69d569d56 56dfdfafafaf6464f29501dfdff4af0164dff4af0164648e95fddffdaf01 6464f9affd00fcaf0000cdaffddffdaffd640700d6d69d9d9d56000f00d6 d69d9d9d565656dfdfafafaf6464f29501dfdff4af0164dff4af0164648e 95fddffdaf016464f7af0000fcaf0000cdaffddffdaffd640700d69dd69d 569d000f00d69dd69d569d5656dfdfafafaf6464f29501dfdff4af0164df f4af0164648e95fddffdaf016464f7af0000fcaf0000cdaffddffdaffd64 0700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464f29501df dff4af0164dff4af0164648e95fddffdaf016464f7af0000fcaffb00d1af fddffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf 6464f29501dfdff4af0164dff4af0164648e95fddffdaf016464f7af0000 f7af0000d2affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d5656 56dfdfafafaf6464f29501dfdff4af0164dff4af0164648e95fddffdaf01 6464f7af0000f7af0000d2affddffdaffd640700d69dd69d569d000f00d6 9dd69d569d5656dfdfafafaf6464f29501dfdff4af0164dff4af0164648e 95fddffdaf016464f7af0000f7af0000d2affddffdaffd640700d6d69d9d 9d56000f00d6d69d9d9d565656dfdfafafaf6464f29501dfdff4af0164df f4af0164648e95fddffdaf016464f7af0000fcaf0000fcaf0000d2affddf fdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464 f29501dfdff4af0164dff4af0164648e95fddffdaf016464f7af0000fcaf 0000fcaf0000d2affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d 565656dfdfafafaf6464f29501dfdff4af0164dff4af0164648e95fddffd af016464f7af0000fbaffc00d1affddffdaffd640700d69dd69d569d000f 00d69dd69d569d5656dfdfafafaf6464f29501dfdff36400dff2648e95fd dffdaf016464beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d 565656dfdfafafaf6464f29500dfe3648e95fddffdaf016464beaffddffd affd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf646480 dfdfdffdaf016464beaffddffdaffd640700d6d69d9d9d56000e00d6d69d 9d9d565656dfdfafafaf6480dfdedffdaf016464beaffddffdaffd640700 d69dd69d569d000a00d69dd69d569d5656dfdf80afd7af016464beaffddf fdaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af01 6464beaffddffdaffd640700d69dd69d569d000a00d69dd69d569d5656df df80afd7af016464beaffddffdaffd640700d6d69d9d9d56000a00d6d69d 9d9d565656dfdffaaffd00deaf0000edaff900f4af030000af00adaf0164 64bbdffdaffd640700d69dd69d569d000a00d69dd69d569d5656dfdffcaf 060000afafaf0000e0af0000edaf0000fbaf010000f6af0400afafaf00ef af0000bfaf0064badffdaffd640700d6d69d9d9d56000a00d6d69d9d9d56 5656dfdffcaf0000fbaf0000e0af0000edaf0000faaf0000f6af0400afaf af00efaf000080aff5affd640700d69dd69d569d000a00d69dd69d569d56 56dfdffcaf0000f8af0400af000000fcaffc00fcaffc0002afaf00fcaf05 00af00afafaffc00fdaf0300af0000fbaf0000faaf0300afafaffc000aaf af000000afaf00afafaffc00fcaffc0006af000000afafaffc00fdaf0400 af000000fcaffc00fdaffc0094affd640700d6d69d9d9d56000a00d6d69d 9d9d565656dfdffbaf010000faaf170000afaf0000afaf0000afaf0000af af0000afaf0000af00fcaf0e00af00afaf0000afaf0000afaf0000f9af00 00fbaf4200afafaf0000afaf0000afaf00afafaf00afaf0000afaf0000af af0000afaf0000af00afafaf0000afaf0000afaf0000afaf0000afaf0000 afaf0000af0000afaf000095affd640700d69dd69d569d000a00d69dd69d 569d5656dfdff9af010000fcaf0000fcaf0300afaf00fcaf0300afaf00fa af0000fcaf0200af00f9af0300afaf00f8affa00fcaf0000fcaf0a00afaf 00afafaf00afaf00fcaf0300afaf00faaf0000f8af0300afaf00fcaf0300 afaf00faaf0000fcaf000095affd640700d6d69d9d9d56000a00d6d69d9d 9d565656dfdff7af040000afaf00fcaf0200afaffa0002afaf00faaf0000 fcaf0500af00afafaffb0002afaf00f8af0000fbaf0300afafaffa0008af af00afafaf00afaffa0002afaf00faaf0000fcaffb0002afaf00fcaf0300 afaf00faaffa0095affd640700d69dd69d569d000a00d69dd69d569d5656 dfdff6af0300afaf00fcaf0300afaf00f9af0000faaf0000fcaf0d00af00 afaf0000afafaf00afaf00f8af0000faaf0300afaf00f9af0700afafaf00 afaf00f9af0000faaf0c00afafaf0000afafaf00afaf00fcaf0300afaf00 faaf000090affd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffc af0000fbaf0300afaf00fcaf0300afaf00f9af0000fcaf0200af00fcaf05 00af00afaf00fcaf0300afaf00f8af0000faaf0300afaf00f9af0700afaf af00afaf00f9af0000fcaf0600af00afafaf00fcaf0300afaf00fcaf0300 afaf00fcaf0200af0090affd640700d69dd69d569d000a00d69dd69d569d 5656dfdffcaf320000afafaf0000afaf0000afaf0000afaf0000afaf0000 afaf0000afaf0000af0000afaf0000af00afaf0000afaf0000afaf00f8af 0000faaf2d00afaf0000afaf0000afaf00afafaf00afaf0000afaf0000af af0000afaf0000af00afafaf0000afaf0000afaf00fcaf0f00afaf0000af af0000af0000afaf000095affd640700d6d69d9d9d56000a00d6d69d9d9d 565656dfdffaaffd00fcaf0400af000000fcaffc00fcaffc00fdaffd000e af00af00afafaf000000af0000af00f8af0000faaf0300afafaffc00fdaf 0700afafaf00afafaffc00fcaffc00fdaf0b0000afaf000000af0000af00 fcaf0300afafaffc00fdaffc00deafb964fdaffd640700d69dd69d569d00 0a00d69dd69d569d5656dfdff3af000080afe5afbb640fdfdfafafaf6464 6400d6d69d9d9d56000a00d6d69d9d9d565656dfdff3af000080afe5af01 6464beaffddffdaffd640700d69dd69d569d000a00d69dd69d569d5656df dff3af000080afe5af016464beaffddffdaffd640700d6d69d9d9d56000a 00d6d69d9d9d565656dfdf80afd7af016464beaffddffdaffd640700d69d d69d569d000d00d69dd69d569d5656dfdfafafaf8064dd64fdaf016464be affddffdaffd640700d6d69d9d9d56000d00d6d69d9d9d565656dfdfafaf af8064df6406dfdfafafaf6464beaffddffdaffd640700d69dd69d569d00 0f00d69dd69d569d5656dfdfafafaf6464da95e2dfa695fddffdaf016464 beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfaf afaf6464da95f2df0064f2df0064a695fddffdaf016464beaffddffdaffd 640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464da9501 dfdff4af0164dff4af016464a695fddffdaf016464beaffddffdaffd6407 00d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464da9501dfdf f4af0164dff4af016464a695fddffdaf016464f9affc00f9affc00d4affd dffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf64 64da9501dfdff4af0164dff4af016464a695fddffdaf016464faaf0000fc af0000fbaf0000fcaf0000d5affddffdaffd640700d6d69d9d9d56000f00 d6d69d9d9d565656dfdfafafaf6464da9501dfdff4af0164dff4af016464 a695fddffdaf016464faaf0000fcaf0000fbaf0000fcaf0000d5affddffd affd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464da 9501dfdff4af0164dff4af016464a695fddffdaf016464faaf0000fcaf00 00f6af0000d5affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d56 5656dfdfafafaf6464da9501dfdff4af0164dff4af016464a695fddffdaf 016464faaf0000fcaf0000f6af0000d5affddffdaffd640700d69dd69d56 9d000f00d69dd69d569d5656dfdfafafaf6464da9501dfdff4af0164dff4 af016464a695fddffdaf016464faaf0000fcaf0000f9affd00d4affddffd affd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464da 9501dfdff4af0164dff4af016464a695fddffdaf016464faaf0000fcaf00 00f6af0000d5affddffdaffd640700d69dd69d569d000f00d69dd69d569d 5656dfdfafafaf6464da9501dfdff4af0164dff4af016464a695fddffdaf 016464faaf0000fcaf0000f6af0000d5affddffdaffd640700d6d69d9d9d 56000f00d6d69d9d9d565656dfdfafafaf6464da9501dfdff4af0164dff4 af016464a695fddffdaf016464faaf0000fcaf0000fbaf0000fcaf0000d5 affddffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafaf af6464da9501dfdff4af0164dff4af016464a695fddffdaf016464faaf00 00fcaf0600afaf00afaf00fcaf0000d5affddffdaffd640700d6d69d9d9d 56000f00d6d69d9d9d565656dfdfafafaf6464da9501dfdff4af0164dff4 af016464a695fddffdaf016464f9affc00fdaf0300afafaffc00d4affddf fdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464 da9501dfdff36400dff264a695fddffdaf016464beaffddffdaffd640700 d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464da9500dfe364 a695fddffdaf016464beaffddffdaffd640700d69dd69d569d000f00d69d d69d569d5656dfdfafafaf646480dfdfdffdaf016464beaffddffdaffd64 0700d6d69d9d9d56000e00d6d69d9d9d565656dfdfafafaf6480dfdedffd af016464beaffddffdaffd640700d69dd69d569d000a00d69dd69d569d56 56dfdf80afd7af016464beaffddffdaffd640700d6d69d9d9d56000a00d6 d69d9d9d565656dfdf80afd7af016464beaffddffdaffd640700d69dd69d 569d000a00d69dd69d569d5656dfdf80afd7af016464beaffddffdaffd64 0700d6d69d9d9d56000a00d6d69d9d9d565656dfdfedaf0000fbaf0000f6 af000080affcaf016464bbdffdaffd640700d69dd69d569d000a00d69dd6 9d569d5656dfdfeeaffd00fcaf0000f6af000080affcaf0064badffdaffd 640700d6d69d9d9d56000a00d6d69d9d9d565656dfdfeeaf0200af00fcaf 0000f6af000080afb2affd640700d69dd69d569d000a00d69dd69d569d56 56dfdfeeaf0200af00fcaf0f00afaf00af000000afafaf00af000000fcaf fc0080afbeaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdfef af2000afafaf00afafaf00afaf0000afaf0000afaf0000afaf0000afaf00 00afaf000080afbfaffd640700d69dd69d569d000a00d69dd69d569d5656 dfdfefaf0b00afafaf00afafaf00afaf00fcaf0300afaf00fcaf0000f9af 000080afbfaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff0 af0000fbaf0600afaf00afaf00fcaf0300afaf00fcaf0300afafaffb0080 afbfaffd640700d69dd69d569d000a00d69dd69d569d5656dfdff0aff900 05afaf00afaf00fcaf0300afaf00fcaf0800afaf0000afafaf0080afbfaf fd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff0af0000fbaf06 00afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf000080afbfaffd 640700d69dd69d569d000a00d69dd69d569d5656dfdff1af0000f9af0d00 af00afaf0000afaf0000afaf00fcaf0800afaf0000afaf000080afbfaffd 640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff1af0000f9af0d00 af00afaf00af000000afafaf00fcaf0900afafaf000000af00008aafb964 fdaffd640700d69dd69d569d000a00d69dd69d569d5656dfdfe4af000080 aff4afbb640fdfdfafafaf64646400d6d69d9d9d56000a00d6d69d9d9d56 5656dfdfe4af000080aff4af016464beaffddffdaffd640700d69dd69d56 9d000a00d69dd69d569d5656dfdfe4af000080aff4af016464beaffddffd affd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af0164 64beaffddffdaffd640700d69dd69d569d000d00d69dd69d569d5656dfdf afafaf8064dd64fdaf016464beaffddffdaffd640700d6d69d9d9d56000d 00d6d69d9d9d565656dfdfafafaf8064df6406dfdfafafaf6464beaffddf fdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464 8095dfdffdaf016464beaffddffdaffd640700d6d69d9d9d56000f00d6d6 9d9d9d565656dfdfafafaf64648095f2df0064f2df0864dfdfdfafafaf64 64beaffddffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdf afafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464beaf fddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf 6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464f7af0000c8 affddffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafaf af6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464f9affd00 c8affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfaf afaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464f7af00 00c8affddffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdf afafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464f7af 0000c8affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656df dfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464f7 af0000c8affddffdaffd640700d69dd69d569d000f00d69dd69d569d5656 dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464 f7af0000c8affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d5656 56dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf64 64f7af0000c8affddffdaffd640700d69dd69d569d000f00d69dd69d569d 5656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf 6464f7af0000c8affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d 565656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafaf af6464f7af0000c8affddffdaffd640700d69dd69d569d000f00d69dd69d 569d5656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfaf afaf6464f7af0000c8affddffdaffd640700d6d69d9d9d56000f00d6d69d 9d9d565656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdf afafaf6464f7af0000c8affddffdaffd640700d69dd69d569d000f00d69d d69d569d5656dfdfafafaf6464809501dfdff36400dff264fddffdaf0164 64beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdf afafaf6464809500dfe364fddffdaf016464beaffddffdaffd640700d69d d69d569d000f00d69dd69d569d5656dfdfafafaf646480dfdfdffdaf0164 64beaffddffdaffd640700d6d69d9d9d56000e00d6d69d9d9d565656dfdf afafaf6480dfdedffdaf016464beaffddffdaffd640700d69dd69d569d00 0a00d69dd69d569d5656dfdf80afd7af016464beaffddffdaffd640700d6 d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af016464beaffddffd affd640700d69dd69d569d000a00d69dd69d569d5656dfdf80afd7af0164 64beaffddffdaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf 80afd7af016464bbdffdaffd640700d69dd69d569d000a00d69dd69d569d 5656dfdf80afd7af0064badffdaffd640700d6d69d9d9d56000a00d6d69d 9d9d565656dfdf80af8daffd640700d69dd69d569d000a00d69dd69d569d 5656dfdf80af8daffd640700d6d69d9d9d56000a00d6d69d9d9d565656df df80af8daffd640700d69dd69d569d000a00d69dd69d569d5656dfdf80af 8daffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80af8daffd 640700d69dd69d569d000a00569d569d569d5656dfdff8aff3df80afa2af fd640700d6d69d569d56000000fc56059d565656dfdff8aff4df0064f9af fd00f8aff400fbaff70080afceaffd640200d69dfc56ff000000fcd60556 9d5656dfdff8af01dfdff7af016464f9af0000f2af0000faaf0000f7af00 00baaf000091affd640000fad6ff000a00d6d6d69d9d565656dfdff8af01 dfdff7af016464f9af0000f2af0000faaf0000f7af0000baaf000091affd 640200d69dfcd6ff000a00d69dd69d569d5656dfdff8af01dfdff7af0164 64f9af0000fcaffc00faaf0000faaf0000f7af0000fbaf0500af0000afaf fc00fdaf0400af000000fcaffd00fdaf0400af000000fcaffc00fdaf0500 af0000afaffc00fdaf0900af000000afaf00000092affd640700d6d69d9d 9d56000a00d6d69d9d9d565656dfdff8af01dfdff7af016464f9af0900af afaf0000afaf0000fbaf0000faaf0000f7af0000fbaf410000afafaf0000 afaf0000afaf0000afaf0000afaf00afafaf00afaf0000afaf0000afaf00 00afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afaf0091 affd640700d69dd69d569d000a00d69dd69d569d5656dfdff8af01dfdff7 af016464f9af0000f8af0000fbaf0000faaf0000f7af0000fbaf0000f7af 0300afaf00fcaf0400afaf0000fbaf0000fcaf0000f9af0300afaf00fcaf 0000fcaf0300afaf00fcaf0300afaf0091affd640700d6d69d9d9d56000a 00d6d69d9d9d565656dfdff8af01dfdff7af016464f9af0000fcaffb00fb af0000faaf0000f7af0000fbaf0000fbaffb0002afaf00fcaf0a00afafaf 000000afafaf00fcaf0300afafaffb0002afaf00fcaffa0002afaf00fcaf 0300afaf0091affd640700d69dd69d569d000a00d69dd69d569d5656dfdf f8af01dfdff7af016464f9af0900afafaf0000afafaf00fbaf0000faaf00 00f7af0000fbaf0000fcaf080000afafaf00afaf00fcaf0000fbaf040000 afaf00fcaf0b00afaf0000afafaf00afaf00fcaf0000f9af0000fcaf0300 afaf0091affd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff8af 01dfdff7af016464f9af0400afafaf00fcaf0000fbaf0000faaf0000f7af 0000fbaf0000fcaf0000fcaf0300afaf00fcaf0000faaf0300afaf00fcaf 0300afaf00fcaf0300afaf00fcaf0000f9af0000fcaf0300afaf0091affd 640700d69dd69d569d000a00d69dd69d569d5656dfdff8af01dfdff7af01 6464f9af0900afafaf0000afaf0000fbaf0000faaf0000f7af0000fbaf00 00fcaf080000afaf0000afaf00fcaf1a00afaf00afafaf00afaf0000afaf 0000afaf0000afaf0000afaf00fcaf080000afaf0000afaf00fcaf0300af af0091affd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff8af01 dfdff564f9af0000fcaffd0002af0000fcaf0000faaf0000f7af0000fbaf 0000fbaffd0004af0000af00fcaf0e00afafaf000000afafaf00af000000 fcaffd0004af0000af00fbaffc00fdaf0000fcaf0500afafaf000093affd 640700d69dd69d569d000a00d69dd69d569d5656dfdff8af00dff464f9af 0000ebaf0000d5af000080afecaffd640700d6d69d9d9d56000a00d6d69d 9d9d565656dfdfe4af0000ebaf0000d5af000080afecaffd640700d69dd6 9d569d000a00d69dd69d569d5656dfdfe4affd00efaffd00d5af000080af ecaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80af8daffd 640700d69dd69d569d000a00d69dd69d569d5656dfdf80af8daffd640700 d6d69d9d9d56000a00d6d69d9d9d565656dfdf80af8daffd640700d69dd6 9d569d000a00d69dd69d569d5656dfdf80af8daffd640700d6d69d9d9d56 000a00d6d69d9d9d565656dfdf80af8daffd640700d69dd69d569d000a00 d69dd69d569d5656dfdf80af8daffd640700d6d69d9d9d56000a00d6d69d 9d9d565656dfdf80af8daffd640700d69dd69d569d000a00d69dd69d569d 5656dfdf80af8daffd640700d6d69d9d9d56000a00d6d69d9d9d565656df df80648a640700d69dd69d569d000900d69dd69d569d5656df8064896407 00d6d69d9d9d56000800d6d69d9d9d565656806488640700d69dd69d569d 000700d69dd69d569d568000860006d6d69d9d9d56000600d6d69d9d9d56 80d684d6059dd69d569d007f00d69dd69d569dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd608 9dd69dd69d9d9d56000200d6d6e49d0156d6809db99d0156d6e49d02569d 000300d69dd6e59d0256d6d6809dbb9d035656d6d6e49d0156007f00d6d6 9d569d569d569d569d569d569d569d569d569d569d569d569d569d5656d6 d6569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d7f569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d56d6d69d569d569d569d 569d569d569d569d569d569d569d08569d569d569d569d000100d6e25601 d6d68056b95601d6d6e356ff0080008000f700 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/mat.pdf0000644000175000001440000001276310616356702013254 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hdn44±0Ö3R0Ö³´43°TÐ5Ô3µ477„(¶PpÉç B^"¤endstream endobj 6 0 obj 68 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 2925>>stream xœí=–£8…Õ˜=LÚQOX+ð9SIoÀ˨ĉƒÙC{•Õœã8íhÖ3xèé_€ÐïzzÊF˜‚ë!¤kÕ7Fšôýç*~=o‰vä`݆‡K¯+wâõf}<ùåõ<†ÔQÊwb|bß@Ô'“øGê:ççÈ„k[Føäy™™x^Îü­&rïL^#8 ×D¨ ……‰OçÅ´e}ŸQX˜°]L+»ˆ²·µû{Õ˜0W­µ];¬ûkkð#טX³Re=`6Z$W‡¾ü3Œ‰yHWþ~é‰Y¸Ø³jDéû»”Œ]ñŽŒ/¶3GueîCÍã„— ɉa·ö3!á9Ô”F¬bb<=¶2ÁO´‡òc<ùbÙcú­•̉„Lðƒä7*þ‡^ Ò‹Ó(jCóab‚;1û›ÓÜÀÕÉ#%hg aù:&®ò._šÇã¡Jô Ð ¦'Úß«ü›W2¡8Á=“™˜ñ—É—ÎáD†“CbBúÍk™P·û021;çÃr^,kÈ‹s11€(YyíP¼P™PªFc}™ ¼¿REûÚ!ÎWt¯˜¸8íÉ‘®=Qº¶1Ë1±ˆ˜˜åeB^xb&/NÌ„a¹ÎÄËÜÕ»eï†_õ°íï`‘y¹`âÁ{üŸŸCsÒ¨‹ey©²î¯­@0ñs\íÔã·áÿŸSjà5øõOæÊ¥?ÿãCìûè?ƒÎêÄýé™àÆY™¸³_ʵƒ3ñ;÷n¥×c¿”ö;±­2ñcź¿›f"܉;{'&¸îlv¢a&‚d0¡}&V:AL“ˆ 1ÊÇD×ëÏ\k9Wshr¢ãOÈÇD;Ö1ÇÑFs¢W~“¦ŒL9ß°Û ç&22ÑÃÞñŸœÞžÿyÎ *‹áëäͳ‰”ñgÎz9ѱù_ÏÄóùðqÙ©NàÍã9™˜Ž[¢X"+e¤9Ñ›f½v 'æº}yʨlƒ¼NÌ¿.+PG 3¡—0ÐÊ6(ˆ –»=!œ@»¥9¡ìòJ©×¿9˜>w­Æ4”mÚž°m>s×½¨ÉÅU•Åjc6/_E龃îE' bDL€ˆ 1:÷Ðu[g"؈֙7¢q&V©i&V‰˜ bDL€ˆ 1"&@Ĉ˜¹˜¸ÞªiDIZc{·tz¹˜@òÀŒYó‹ÐßS¨7N&pð Ô 5R—.&f ¦!iü'äÕq$ °L?µ ÞÚ\jù™˜O ø|g'Ðð.œhüðiqi ¥ÈWíDš¢*]Öÿ/ yêcÀbukQ¦³g+( Ä LLK&ÄKX#hs©µ• Æ´Aliõe‰ò–â`„— »vÀ)V÷9±T1º]ÖÆÇêö®öL5¦TEúkÌ^zGö3¤)>IÆú°«(rO¹TöR0¿ƒ­¬&¾v;0ê½þûŽ(N|ðã­ý^ô‹œ;5 ÖÏDT'ŒLD:Ô{&Šwb>»S0ñW„ÝÝ£¿}+ÄwÂÂDYNÜ?´—'bWÜ_Ò+vˆÅ2‘܉6˜Ø|ÓÒÝö»ybÔqœ &ˆ‰QĈ˜ bTRÆöCNÜžŠ gØ8å}LJ#y•ê^´x#R1Q‡¨oDL€ˆ P2&´k´x?m/ÒÎË„ÞdwBNI¤ŠàEºÂy™Ð öý7äEPÉQNÄ“‡ ÖGÓ訉:X´E]<'JzG> Ñ9ùìPâ"ž@I<'8Q„“BÓìK¦€é1\âÈTYŠRŸ=A9+³ãû N &ÄêD@§”ž3gÅо›™`Ì℺ĸBQ¼Lìr¢¼žƒ ±çØ ½Æ´;QUÏÁ„Ù ÃU”!Ô WQt :,‚ˉªï;¢è½…{Ñú {ÑIÔ?ò÷m¯ø)Ä:ó˜G¤ww¸³‚ÿîÞOÇï-,gåÎ 7ztˆ;™p^VæÄN&r¢&ðWnغ¶z[L ÎÕýy{"Òlo-Ì{·Cј yïò+ÅAÙ;,êÛ L ^Y©þæ,’þ}Ì2œHô7g‘º~ÏMN g¢MûΖ«\¡L,ùk°$ÇÞÇT(Ø %´”×­@&pæJsbË÷vËS K$Ýà„ç*W&V÷Œ”©0&Dm &íº¶jL/²bÚÔ¥žèsY‘6{§¨¨!ë¼w…9‘ñ^´e'¨ÂÓY¼({7©¸ìÝqr§úXqãÇÉêû(.{wœÜ㌇8Q,«œØ|uoŒ‰3: Æ˜ˆã1ALŒ"&@Ĉ˜ bT®Tß©î;œ©¾”÷¢ÅGÎR1Q¼”½Ã¢¾m1"&@²w…*Cö®yÕÎD< bDL€$&~^ž™‰xݶ홙Ž`âç°à"1¸ëc,*î¥%¥MÂ411=ÏÆn ¿Åšà„|”hf7cùV¥ŽîLLp}x1…‰s9ñzc“ÚµÃê„Èï[œèæÙ µØ¿á[¦uwŒsn“çÚas¥QmNç”´À¸nJyÚγ£s:_Kou²œwVCÐ µ‘ ”ßw:¡Ì‘»œâ¥(fòº•0òû.'Ô9rçEê·ôoŠÔÃ>4—†¸¿ïÛ2á©1 åO¿kLÛº)åe9(õDæ%wÔê¹êEu™Í !ÎÀtò1_Ì-+æZjVQÉoP´,N¬ÌòZëZ„å:AýŒú¬„ˆ 1"&@Ĉ˜ ΄S³20qN# Lü‘{—2Icâ3÷e“ÂÄ-÷þd”ÌÄÛëÌÄ„UÏ›«´"¹daµ§QÕèÉÜ23ñ¼XÃnöÒš7çqŽLÜœfNÄülòÉs ¤IÿÁÚKž endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000385 00000 n 0000005060 00000 n 0000000326 00000 n 0000000171 00000 n 0000000015 00000 n 0000000153 00000 n 0000000450 00000 n 0000000550 00000 n 0000000491 00000 n 0000000520 00000 n 0000003667 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<2A70DA62D13D3E71D81B4E94666EF3A0><2A70DA62D13D3E71D81B4E94666EF3A0>] >> startxref 5226 %%EOF geomview-1.9.4/doc/figs/mat.png0000644000175000001440000000503710616356716013270 00000000000000‰PNG  IHDR 5þPLTE¯¯¯•••ÖÖÖdddVVVßßßZ[„õ ÂIDATxœíMo«8†m4ºk³Ý-Šªüù£uÝ.¢n«(ÃÝNÑýûƒíã/0`üÉ4>QHxûàÏ—EèñGoĹO¯wsý2ª¸1ô—ôq7WO£Š—“çþ”<Î÷‹¹NY˜ï˜«iân®Þ(‹sÙ,nEãtá,º¢•´Ÿjçbü},úúrÄ8-m·“,´z‘ªŽÛÕkê§b¡}:Q{¡o÷<ÖT(§ó§Å –ÑøÓ5æ¦ö¼3äviŒ,ø–»-t_ˆ}Vi P1e*šm:™*l«Ž±À¢YgÑÆÃ6¾tã ]jPÇßòRáÇ¢kšS3îž=º¦£bØK“’eV°h*ä¤é`F$>"øv;^ÐY4°o©à4ì™*¡bø‚G°ívðå%BE#XŒ{kºF;H` aÁ¿¼ÈB‘F± *X¡…kanÉfu¬ oÀcZ’"°*LiéÄ0ÕbvD䔡UÌ)B’Bœ·(«QBš:wñX´lbݶÒsh ¼cEHØêˆRÑ.« † ±6OwR±Ð^Ð"§—NpÄf¥~Z:-m'û3¶ÔT¦×Tª„z‹ð‹¥šjtO†àéû‘m_éûÔëæ'~e`á¦Bgáp÷Å»‹Ø"è!÷`ñW`ÌÎ×z±ˆ¤âN׺«ˆË‚oøƒ¿\K±ðU‘ƒÅj¯Ÿ‹Yícž‹…ƒŠÊ¢²¨,r²€zöB,æøÂ³Ù›€·^}êG1u ®TTJ…ÉBÖl<­åÁTtõDú\…Sž°“^CX"ëïo„Cµ›³Àš Ò8Ù¯Â)¦,0õG¨g…‡Y’°oØ ó Æ™›V‚·…1a!üÂ}0L ‘ì!=,?A?މ/› "Ì3Òs\˜†ef’t³tÓÏ_ÅÌ×ÒTˆÌ#ÅqÜÝ£¿SŸ ÈÛy°@à&J­®B,€ÑÆ‘i€¦`±¡«l1öñ: ¶u®B–NC…µtBnRPéÔYh*TMåþª¬©¬½@àÁcž“D‚kjq9©ûT'Ûé}j))=>w§1¥ßéî4nÍG&ƒ}“¤h¾ìF+D*6YðÏŠ©g)YTd`ÁOá,5ð¹X`~ra”‹…ƒŠ\,ÚC°XW‘Å’ýŒ,Q.QGp`{4tÖ>*ø˜9¨í|˜Cë1gáîÞ¹…WŸúQLEƒ+•…R1óø„9Ç{‡±Á>_/Â|D|›ÿÞkV‘Edd-y> ‚Ö:¡œ,6Tä(Û*²•‹%9Y,ŸoÍÉbCÅS±X¾ä'o9‹åKÁ–Y@Ç t°ŠÕXdñ0‡ TTÏÎ"AüoÇàåT˜ùZó‘ªæ^™|y|Ïͬ/íÏäs(ðSÄÒç*eòÍs”dZAp#»$WËŠŸÉ7ó/Z#5ª pIdÂL¾™!ÒÄdjÛ?ƒ”.“oÖ^@˜¼—®"]&ßÜã3“ÕØi¥ŠD™|–:¢T®¢]V)“ÏÒ^LŠØkBE’L>KÛ©ÕTzÁ.†Kr=3ù\޹Çׯ¶5ݬ–yŸYÅæ'ì}jÇ_ì0ÎÜâx|ÆhÞŒŒó‹ ­Ô<¾@tO•—s<¾ö,ÖUdc±šA÷d,Q.QG62è2µtòøÖ£æñ­°ø(¦â€¾V1Çe¡…‰@æu­. yþ3‚ ‡¿À‚x*œÂ΂'DÝm/½ ¬û$9îPaa5®Ô*æ,H«çð­œލb΂Ý'SÏ$<‹€‹¢w¨˜³`EAX{™J眨 â–ÿ8è†Ûaõø "µXnVËbŸKÅæ'VûÔ¼*Ž7¾Øaœ¹Å7óøö ý}G¿)îMC›w¬÷ãËÊ¢Þo—ŠÊ¢²¨,žôèгêGæø¢z|>*ŽëkåWñ,œ Oj> §8äÿb)¦¢²P*‹g`ñ“Ûì*úóÈâÇp4VLe î>¦s¢GÃ0‘þX|±w[52¹Š.ÞNÀýøúžª€rQJÅ…©uÄPä};ù:ÿPʯܕÿžG¾ë}™÷´Žè*¸ßª«P‰—ÆIã>Ÿž,ŒöbrD&*ø+Ïæ§ï11R…£³ÿÕJW!²|¥1ÌÒõû|ÆfÁϘ*D–¯¸âk'QÒ° –#¢þ»óô¤A:ÓÒÙjwôÔnaÜç3 >£à{eg¦åBdùBMe9Áú}>£°¸j*Dجˆ§9Î dP±xNÍ—Ò©8Ðø¢ŽµÚÊÂTQY(Gc11¥r†Æ¢œÅ?%UH¨d÷¾d/eXèq6WÓÄÝ\e,L}zçûÅ\§,nz ý-}ÜÍ}Rƒý>î¯æzÑ:ªâ?˜ZÕ­ IEND®B`‚geomview-1.9.4/doc/figs/load.ps0000644000175000001440000000724710447731022013256 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: blah-000.ps %%Pages: 1 %%BoundingBox: 173 366 438 426 %%EndComments %%Page: Image0 1 /picstr 1653 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def %%EndProlog %%Page: 1 1 gsave 173.76 366 translate 264.48 60 scale 551 125 8 [ 551 0 0 -125 0 125 ] { inputf picstr readstring pop } false 3 colorimage 78DAEDDD5D729B30180550AF322BF0B6B206EF26AFDD4A33F594D1F0233E8104 C29CF3A049A84308B4BABD58761E0F0038CE4F1BDFDFDF5F5F5F3F005CC1D73F EDF6FF1B0A69E8FC7E5A771C1D7FF5FD1B8D46A3B1FABCDD68C67E1B4267B4BD 96F4F801E859DA141AED7FD4741A858E4B097095DC691707B34DE7BDDD68341A 8DC6FD63A4E9384B46A3D168AC953869A3596A3A56F40150656974A4E9B45B47 0DC01D641ACDECF65AABE6AC97361A8DC6A6E330D97675541B9A8ED56B00B75A 72566BC9749A23A54DA787E307E080A498E657FC199CD17E8E6F3AB3C7BF6A74 F0B534DA2DC0E989D3B4E90467CED1C32ED474840E40574DA7748ED574240EA0 E9B46E3AA33B6C97683A997498BD7318D92E74004D47D3290A9D74FBB68F850E A0E95CA5E994BE0AB56ED3196D5C0DA6A5D6E32F2770C3A6B3743BA8E7A65334 638FBEEFFE7B6B99D0990DBB604801DCA1E92CCD8D9D379DA2D0497327DE744A 6BCEECC76A0EA0E96C0B9DAE9ACE863B6C559ACE52E804B70B1D40D329BAC3D6 CFEAB50D4FEBC49B8E2504002D9ACE77F8699D5BAD5ECB2457E9A2688BA5014D A7567E7DF6EB7400386BA6BDE73B1200A0E9683A009A8EA603A0E9346D3ADBDE 1940D301D074B6E557E9BA654D0740D33932BF36349DE16BF78CBFFBD9B907A3 D168341E33D30EF9B57F3F99A6333C32DD3E7CE14EB5F603C001336DAD5D659A CEF43B3E00609F77D31925D1B07DE841EF3F7A01C05669D3198C4227BD23E78C 01B0337446B9B3B47A4DE80050ABE9ACAE5E133A00D46A3AABAFD3113A009CD8 74FE1096BF10DD1EE185CE21F0F14D4794043D9FCFCE4367E9082F740E014D87 F76CD979E8648EF042E710B84FD37126973CFF0B864E6F47D8C3250E9E43E03E 4DC799143A4207D074848ED001341DA12374840E683A2D9ACEEC1BBEBDB70F0F 283AE0E9AE6E183A4B3F7E644BC5D099DDF9EA952DBD6A4207349DA2D0C96F2F 0D9DE9DC7BABD019FDC8D34F4BA777A1037C58D329CA91D207DF3074325B3201 747CE854B9E24207349D764D67F5BE5966CA1DEEDAA55B467B8BCCCFB307307B 60D3EFD83A74E227333EB11FD37466EFAC46AEB8D0014DA751E84CF362756FF9 1B4DD3BDAD86CED2C6A2833C3D748AAAC401A11339819993297440D3290A9DD9 A7FE57FF73BE34A12DFDDF38F269247456EFE015B589E343A7F479AE9DA1B3B4 5024726583CF40091DD074DA359DFCFD967CD3294A8ACCD4375B9AF237EBDC5E 8B1F4CD115173AA0E9B40B9DC801AFEE6767E8CCDEF929FAD17A089D57070B09 4A9BCECE7308683ADD86CE740CCEE4E786CEAB64F5DAAB9B25D34207E8B3E96C 584890BF4B36BBB7E02C1D79EEFB94D089BF4EE7D5C78B432D24003A6C3AAFD8 92E9A5670166E7DBD5250799AF5ADDD529A19339C8D7A617CE58320D7C52D3B9 39EFBD76D83904341D848ED001341DA12374004D47E8081DA1039A8EA6237484 0EA0E9081DA103DCB0E93C59130C9DDE8EB0AB4BEC1F2C683A12A762E8747884 5D5D62FF6041D39126B542A7CF23ECEA12FB070B376F3A007058D301004D0700 4D0700A1A3E900A0E900A0E9A4AC850620F8EA86FD4DC7E90560B0FA6B3DAB34 1D9D1180C8EF92AED2749C6A0082A1A3E900A0E900A0E9081D00FA693A8F0FE2 6F1140E74D47DC00081D4D47E8007C64D309464F6942B54BB4342E871F01804B 349D6B854EBADB347A00D074840E80A6330D9D74CBF4B992E96C5FF7F1B30935 FDD3D1FEA71F03D07FD319CDEAE77EBCFA484D07E0EA4D6776263F727BFEEE9C D001F898A6D33A5CA6DF54E800683A47361AA103A0E99C153AC14F850EC0A736 9DE33F8E3C52E8007C5ED33965C9F4EA57091D80739BCED06EBCF71A00D59BCE 902C43E80CBCCB3400159B4E1A31E9EDB537BF4F07808A4D27350A1DBF391480 BA4D67367436AF5E0340E8649A4EDDD56B00089D7CD3A9F83A1D00848EA60380 A60380A6136F3A7F00E090A6E30C03100F9D3D4D070082F6371D00280A1D4D07 004D07004D0700341D00341D00D07400D07400D074840E009A0E009A0E00683A 00683A00683A9A0E00A7349D0700EC106F3A3F00B05BB0E9A45B8C46A3D168DC 33E69B4E45EFD2F40DC015B49BB4979A4E8BE3973B0097489CA693F6B4E90CAB 086A8DC3F157DFB3D168341A5B8CED12216D3A5FCD0CA10340FF9A4EDA56F401 70A4BFD6503658 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer geomview-1.9.4/doc/figs/main.eps0000644000175000001440000021163610616356707013442 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: blah-000.ps %%Creator: pnmtops %%CreationDate: Jun 26 2006 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 211 322 401 470 %%EndComments %%BeginProlog %%BeginPreview: 190 148 8 740 % 29292929292929292929292929296229292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929292929292929a9292929292929292929292929292962 % 29296262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262a92962626262626262626262626262a9 % 2962626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9 % a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9 % a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262626262 % 6262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9 % a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262 % 296262ff292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929292929292929292929292929292929292929ff626262 % 296262ff626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262a96262626262626262626262a92962626262626262626262ff626262 % 296262ff62626262626262626262a9296262626262626262ffff6262626262626262626262626262 % 6262626262ff626262626262626262626262626262626262ffffffffff6262626262626262626262 % ffff62626262626262626262626262626262626262626262626262626262626262ffff6262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262a96262626262626262626262a92962ff6262626262626262ff626262 % 296262ff62626262626262626262a92962626262626262ff6262ff62626262626262626262626262 % 62626262626262626262626262626262626262626262626262ff6262ff626262626262626262ff62 % 6262ff626262626262626262626262626262626262ff62626262626262626262ff62ff6262626262 % 6262626262ff62626262626262626262626262626262626262626262626262626262626262626262 % 6262a96262626262626262626262a92962ff626262626262ff62ff626262 % 296262ff62626262626262626262a929626262626262ff6262626262ffff62ff62ff62ffffffffff % 626262ff62ff62ff62ffff62ff62ff62626262626262626262ff6262ff62ff62ff62ff626262ff62 % 626262ff62ff62ff62ff62ff62ff62ff62ff62ff626262ffffff6262ff6262ff62626262ff62ff62 % ffff62ff626262ff62ff62ffff626262626262626262626262626262626262626262626262626262 % 6262a96262626262626262626262a92962ff626262626262ff62ff626262 % 296262ff62ff6262626262626262a929626262626262ff6262ff62ffffff62ff62ff62ff62ff62ff % 6262ff62ff62ffffff62ff62ffff626262ffffffff626262626262ff6262ff62ffffff6262ff6262 % 62ff62ffffff62ff62ffff62ff62ff62ffffff62ff62ff6262ff62ff626262ff62626262ffffff62 % ff62ff62ff62ffffff62ff6262626262626262626262626262626262626262626262626262626262 % 6262a962626262ff62ff62626262a92962ff626262626262ff62ff626262 % 296262ff62ffffffffffffffffffa929626262626262ff6262ff62ff6262ff6262ff62ff62ff62ff % 6262ff62ff62ff626262ffff62ff62626262626262626262626262ff6262ffff6262626262ff6262 % ff62ff626262ff626262ff62ff62ff62ff626262ff62ff6262ff62ff626262ff6262ffff62626262 % ff62ff62ff62ff626262ff6262626262626262626262626262626262626262626262626262626262 % 6262a962626262ffffff62626262a92962ff626262626262ff62ff626262 % 296262ff62626262626262626262a92962626262626262ffffff62ffff6262ffff62ff62ff62ff62 % 62ff6262ff62ffff626262ff626262626262626262626262ff6262ff62ff6262ffff62626262ffff % 626262ffff6262ffff62ff62ff62ff62ffff6262ff62ff626262ff6262626262ff626262ffff62ff % 6262ff62ff62ffff6262ff6262626262626262626262626262626262626262626262626262626262 % 6262a96262626262626262626262a92962ff626262626262ff62ff626262 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262ff6262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262a96262626262626262626262a92962ff626262626262ff62ff626262 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262a96262626262626262626262a92962ffffffffffffffff62ff626262 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262a96262626262626262626262a92962626262626262626262ff626262 % a9a9a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffff29a9a9 % 2929a9a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020202020202020202020202020202020202020ff292929 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050505050505050505050ff505050505050505050505050505050505050505050ff50 % 505050505050505050505050505050505050505050505050505050505050ff505050505050505050 % 50ff50ff505050505050505050505050505050505050505050505050ff505050505050505050ff50 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050505050505050505050ff50ffff505050505050505050505050505050ff5050ffff % ff5050505050505050505050ffff5050ffff50ffffff5050ff5050ffff50ff505050505050505050 % 5050505050ffffff50ffff5050ffff5050ffff505050505050505050ffff5050ff5050ffff50ff50 % ff50ffff50ffffff5050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a920505050505050ffffff5050ffff505050505050505050505050ffffff50ff505050ff50 % 505050505050505050505050ff50ff50ff5050ff505050ff50ff50505050ff505050505050505050 % 5050ff5050ff5050505050ff50505050ff5050505050505050505050ff5050505050ff505050ff50 % ff505050ffff50505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050505050505050505050ffff50505050505050505050505050505050ff505050ff50 % 505050505050505050505050ff50ff5050ff50ff505050ff505050505050ff505050505050505050 % 5050505050ff505050ff50ff50505050ff5050505050505050505050ff50ffff5050ff505050ff50 % ff505050ffff50505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050505050505050505050ffff50ff5050505050505050505050505050ff50ff50ff50 % 505050505050505050505050ff50ff50505050ff50ff50ff50ff50ff50ffff505050505050505050 % 50ff50ff50ff50ff50ff50ff50ff50ffff50ff505050505050505050ff5050505050ff50ff50ff50 % ff50ff50ffff50505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050ff5050505050505050505050505050505050505050 % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050505050ffffffffff5050505050505050505050505050ffffffffff505050505050 % 50505050505050505050ffff50505050505050505050505050505050505050505050505050505050 % ffffffffff5050505050505050505050505050505050505050505050ffffffffffff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9bff626262 % 296262a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020202020202020202020202020202020202020ff626262 % 296262a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020209bff626262 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050202020202020202020202020202020202020202020509bff626262 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505050505050505050509b509bff626262 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505050505050505050509b509bff626262 % 2929a9a9205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505020505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505050505050505050509b509bff2962a9 % 2929a9a9205050509b50505050505050505050505050505050505050505050505050505050505050 % 5050502050505050505050505050505050505050505050ffffffffff505050505050505050505050 % 505050505050505050505050505050505050505050ff505050505050505050505050505050505050 % 5050505050ff5050505050505050ffff5050505050505050ffff5050505050505050505050505050 % 50505020205050ff50505050ff505050505050505050509b509bff2962a9 % 2929a9a9205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505020505050505050505050505050505050505050ffff505050ffff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050ff505050505050ffff5050ff50505050505050ffff5050505050505050505050505050 % 50505020205050ff50505050ff50ff505050ffff5050509b509bff2962a9 % 2929a9a9205050509b50505050505050505050505050505050505050505050505050505050505050 % 505050205050505050505050505050505050505050ffff505050505050505050ffff5050505050ff % ff505050ffffffff50ffff505050ff505050ffff50ff50505050ffff5050ffff5050ff505050ff50 % 505050ffffff505050505050ff505050ff5050505050ffffffff5050505050505050505050505050 % 50505020205050ffffffff50ffff505050ff50505050509b509bff2962a9 % 2929a9a9205050509b505050ff50505050ff50505050505050505050505050505050505050505050 % 505050205050505050505050505050505050505050ffff5050505050505050ffff50ffff50ffff50 % ffff5050ffff50ffff50ffff5050ff505050ffff50ff5050ffff50ffff5050ff5050ff505050ff50 % 5050505050ff505050505050ff5050505050505050505050ffff5050505050505050505050505050 % 50505020205050ff50505050ffff505050ff50505050509b509bff2962a9 % 2929a9a9205050509b50505050505050505050505050505050505050505050505050505050505050 % 505050205050505050505050505050505050505050ffff5050ffffffff50ffff505050ff50ff5050 % 50ffff50ffff5050ff5050ff5050ffff5050ff5050ff5050ff505050ffff50ff50ffffff50ffff50 % 5050505050ff505050505050ffffffffff50505050505050ffff5050505050505050505050505050 % 50505020205050ff50505050ffff50ff50ff50ff5050509b509bff2962a9 % 2929a9a9205050509b50505050505050ff5050505050505050505050505050505050505050505050 % 505050205050505050505050505050505050505050ffff5050505050ff50ffffffffffff50ff5050 % 50ffff50ffff5050ff5050ff505050ff50ffff5050ff5050ffffffffffff50ff50ff50ff50ff5050 % 5050505050ff505050505050ffff5050ff50505050505050ffff5050505050505050505050505050 % 50505020205050505050505050505050505050505050509b509bff2962a9 % 2929a9a9205050509b5050505050ff50505050505050505050505050505050505050505050505050 % 505050205050505050505050505050505050505050ffff5050505050ff50ffff5050505050ff5050 % 50ffff50ffff5050ff5050ff505050ff50ffff5050ff5050ff50505050505050ffff50ff50ff5050 % 5050505050ff505050505050ff505050ff50505050505050ffff5050505050505050505050505050 % 50505020205050505050505050505050505050505050509b509bff2962a9 % 2929a9a9205050509b50505050505050ff5050505050505050505050505050505050505050505050 % 50505020505050505050505050505050505050505050ffff505050ffff5050ff505050ff50ffff50 % 50ff5050ffff5050ff5050ff505050ffffff505050ff5050ffff5050ffff5050ffff50ffffff5050 % 5050505050ff505050505050ffff5050ff50505050505050ffff5050505050505050505050505050 % 50505020205050505050505050505050505050505050509b509bff2962a9 % 2929a9a9205050509b50505050505050505050505050505050505050505050505050505050505050 % 5050502050505050505050505050505050505050505050ffffffff50ff5050ffffffffff5050ffff % ffff5050ffff5050ff5050ff50505050ffff505050ff505050ffffffff505050ff505050ff505050 % 5050505050ff505050ffff5050ffffffff5050ff50505050ffff5050505050505050505050505050 % 50505020205050505050505050505050505050505050509b509bff2962a9 % 2929a9a9205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505020505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b509bff2962a9 % 2929a9a9205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505020505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505020505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505020505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505020505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505020505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050502020202020202020202020202020202020202020202020202020202020202020 % 20202020505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050502020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202050505050505050505020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020202020202020202020202020209b5050509bff626262 % 296262a9205050502050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505020505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050509b5050509bff626262 % 296262a9205050502050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505020505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050509b5050509bff626262 % 296262a9205050502050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050ff5050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050205050505050505050505050505050ff505050505050 % 50ff505050505050505050505050505050505050ff505050ff50505050505050ff50505050ff5050 % 5050505050505050505050505050505050505050509b5050509bff626262 % 2929a9a9205050502050505050505050505050505050505050505050505050505050505050505050 % ffff50ff5050ff50ff50ff50ffff50ff50ff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050205050505050505050505050505050ff505050505050 % 50ff50ff50ff50ff50ff50ff50ff50ff50505050505050505050ff50ff50ff50ff505050ffff50ff % 5050ff50ff505050505050505050505050505050509b5050509bff2962a9 % 2929a9a9205050502050505050505050505050505050505050505050505050505050505050505050 % ffff50ff50505050ff50ffffffff5050ff5050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050205050505050505050505050505050ff505050505050 % 50ff50ffffff505050ff50505050ffff5050505050ff50ff5050ff5050505050ff505050ffff50ff % ff5050ff50505050505050505050505050505050509b5050509bff2962a9 % 2929a9a9205050502050505050505050505050505050505050505050505050505050505050505050 % 505050ff50505050ff50505050ff505050ff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050205050505050505050505050505050ff50505050ffff % 50ff50ff5050505050ff505050ff505050505050505050505050ff5050505050ff505050ffff5050 % 50505050ff505050505050505050505050505050509b5050509bff2962a9 % 2929a9a9205050502050505050505050505050505050505050505050505050505050505050505050 % ff50ffff5050ffffff50ffff5050ff50ff5050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050205050505050505050505050505050ffffffffff5050 % ff50ff50ff50505050ff50505050ff50ff5050505050ff50505050ffff50ffffff50ffffffff50ff % ff5050ff50505050505050505050505050505050509b5050509bff2962a9 % 2929a9a9205050502050505050505050505050505050505050505050505050505050505050505050 % 505050505050ff50ff50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505020505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050509b5050509bff2962a9 % 2929a9a9205050502050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505020505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050509b5050509bff2962a9 % 2929a9a9205050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b5050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050509bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a92050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b5050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050509bff2962a9 % 2929a9a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505020505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050509b5050509bff2962a9 % 296262a92050509b509bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b5050ffffffffff50ff5050ffff50ffff50ffffffffffffffffff50ffffff % 50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2050505050505050505050209b50ffff50ffffff50505050505050ffff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a209b6a6a209b5050509bff626262 % 296262a92050509b509b50ffffffffff50ff50ff50ffff50ffffffffffffffffffffffff50ffffff % 50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2050505050505050505050209b50505050ff5050ff5050505050ff5050ff505050 % 5050505050505050505050505050505050505050ff50505050505050505050505050505050505050 % 505050505050505050505020509b6a6a209b6a6a209b5050509bff626262 % 296262a92050509b509b50ff50ff50ff50ff50ff50ffffffffffffffffff50ff50ff50ff50ff50ff % 50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2050505050505050505050209b50505050ff505050505050505050ff505050ff50 % ff50ff50ffff50ff50ff50ff50ff50ff5050ff50ff50505050505050505050505050505050505050 % 505050505050505050505020509b6a2050509b6a209b5050509bff626262 % 296262a92050509b509b50ff50ffffff50ff50ff50ffffff5050ff5050ffffff50ffffff50ffffff % 50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2050505050505050505050209b50505050ff50505050ffffffff505050ff505050 % ff50ffffffff50505050ff50505050ff50505050ff50505050505050505050505050505050505050 % 505050505050505050505020509b6a2050509b6a209b5050509bff626262 % 296262a92050509b509b50ff50ffffff50ff50ff50ffffff5050ff5050ffffff50ffffff50ffffff % 50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2050505050505050505050209b50505050ff5050ff5050505050ff5050ff505050 % ff505050ffff5050505050ff505050ff50505050ff50505050505050505050505050505050505050 % 505050505050505050505020509b209b9b9b9b9b209b5050509bff626262 % 296262a92050509b509b50ffff50ffffff50ffff50ffffffffffffffffff5050ffffffff50ff5050 % 50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2050505050505050505050209b50ffff50ffffff50505050505050ffff50505050 % ff50ffffffffffff5050ff50505050ff50ffff5050ff505050505050505050505050505050505050 % 505050505050505050505020509b202020202020209b5050509bff626262 % 296262a92050509b509b50ff50ff50ffffffffff50ffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2050505050505050505050209b5050505050505050505050505050505050505050 % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b20505050509b209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b20505050509b209b5050509bff626262 % 296262a92050509b509bffff5050505050ff50ffff50505050505050505050505050505050505050 % 505050ff50ff50505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50505050ffffff50505050ffffffff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b20505050509b209b5050509bff626262 % 296262a92050509b509bff505050505050ff5050ff5050505050505050ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50505050ff5050ff5050505050505050505050ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b20505050509b209b5050509bff626262 % 296262a92050509b509bff50ff50ff5050ff5050ff5050505050ff50ffff50ff5050ff50ff5050ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50505050ff50505050505050505050ff50ff50ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b20505050509b209b5050509bff626262 % 2929a9a92050509b509bff50ff50505050ff5050ff5050505050505050ff50ff5050ff50ff5050ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50ffffffff50505050505050505050ff505050ff % 50ff50505050ff505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b20505050509b209b5050509bff2962a9 % 2929a9a92050509b509bff50ff50ff5050ff5050ff5050505050ff50ffff50ff5050ff50ff5050ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50505050ff5050ff50505050505050ff50ff50ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b209b9b9b9b9b209b5050509bff2962a9 % 2929a9a92050509b509bff505050505050505050ff50505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509bffff50ffff50505050ffff50505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509bff5050505050ff50ff50ff50505050505050505050505050505050505050 % 50505050505050505050505050ff5050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050ff50ff5050ff5050505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509bff5050ff50505050ff50ff50505050ff5050ff505050ffff5050ff505050 % ff5050ffff505050ffff50ffffff5050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50ff5050ff50505050ff5050ffff50ffff50ff50 % ff50ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509bff50ff50505050ff5050ff5050505050ff50505050ff505050ff505050ff % 50ff5050505050505050ff5050ff5050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50505050ff5050505050505050ff505050ffff50 % ff50ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509bff50ff50505050505050ff5050505050ff50505050ff505050ff505050ff % 50505050505050505050ff5050ff5050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50ffffffff5050505050ffff50ff505050505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509bff50ff50ff50ff505050ff5050505050ff50ffff50ff50ff50ff50ff50ff % 50ff50ff50ffff50ff50ff5050ff5050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50505050ff5050ff5050505050ff50ff50ff50ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509bff505050505050505050ff50505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509bffff50ffff50505050ffff50505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 296262a92050509b509bffff50505050ffff50ff5050505050ff5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50ffff50ffffff50505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509bff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50505050ff5050ff505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509bff50ff50ff5050505050505050ff50505050ff50ff50ff50ff5050ff50ff % 50ff50ff50ff50505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50ffff50ff50505050ff50ff50ff50ff50ff50ff % 5050ff50ff5050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509bff50ff50505050505050505050ff5050505050ffff505050505050ffffff % 50505050ffff50505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50505050ff50505050ff505050ffffff50505050 % 5050ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509bff50ff505050505050505050505050505050ff50ff505050505050ff5050 % 505050ff505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50505050ff5050ff50ff50505050505050505050 % 5050ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509bff5050ffff50ffff50505050505050ff505050ffff50505050505050ffff % 50505050ff50ff505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50ffff50ffffff505050ff5050ffff5050505050 % 505050ffff5050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509bff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50505050505050ff505050ff5050ffffff505050 % 505050505050505050505050ff505050505050505050505050ffffff505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50ffff50505050ff505050ff5050ff5050ff5050 % 505050505050505050505050ff505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050ff50ff50ff50ff5050ff50505050ff % 50ff50505050ff50ff50ff50ff5050ff50ff50ff50ff5050505050ff50ff50ff5050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b505050ff505050ff505050ff5050ff5050505050 % 50ff505050505050ff505050ff5050ff50ff505050ff5050505050ff505050ff5050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209bff50505050ff50ff50ff50ff5050ff5050ff50ff % 50ff50ff50505050ff50ff50ff5050ff50ff50ff50ff5050505050ff50ff50ff5050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050ff505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050ffff50505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50ffff5050505050505050505050505050505050 % 50505050505050505050ff5050ff505050505050ff50505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50ffff50505050ff505050ffff5050ff50ffff50 % ffff505050ffff505050ff5050505050505050ffff5050ffff5050ffff50ffff5050ff5050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b505050505050ff505050ff5050505050ffff5050 % 5050ff505050505050505050ff50505050505050ff5050505050ff5050ff505050ff505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50ffffff5050ff505050ff5050505050ffff5050 % ff50ff50505050505050505050ff505050505050ff50ff505050ff5050ff5050505050ff50505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209bff5050505050ff50ff50ff50ff50ff50ffff5050 % ff50ff5050ff50ff5050ff5050ff50ff50505050ff50ff50ff50ff50ffff50ff50ff50ff50505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50505050505050ffff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff2962a9 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b50ffff50505050505050505050505050505050ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050ff50ff5050ff50ff5050ff50ff50ff % 50ff50ff50ff50505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b505050ff505050ff5050ff50ff505050ffff50ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b505050ff505050ff5050ff50ff5050ff505050ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209bff505050505050ff5050ff50ff505050ff50ff50 % ff50ffff505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050ff505050505050ff5050505050ff50505050 % 505050505050ff505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b505050505050505050ff5050505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 296262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050ff50ff50ff5050ff50ffff50ff50ff % 50ff505050ff50ff50ff5050505050ff5050ff50ff50ff50ff50ff5050ff50ff5050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 626262a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050ffffff50ff5050ff50ffff50ffffff % 505050505050505050ff5050505050505050ff50ff50ff50ffffff505050ffff5050505050505050 % 505050505050505050505020509b6a6a6a6a6a6a209b5050509bff626262 % 292962a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050ff505050ff5050ff50ffff505050ff % 505050505050505050ff5050505050505050ff50ff50ff505050ff5050ff50505050505050505050 % 505050505050505050505020509b202020202020209b5050509bff622929 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a2050509b6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a2050509b6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a209b6a6a209b5050509bff2962a9 % 2929a9a92050509b509b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050209b5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505020509b6a6a209b6a6a209b5050509bff2962a9 % 2929a9a92050509b509b202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202050505050505050505050209b2020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020509b202020202020209b5050509bff2962a9 % 2929a9a92050509b5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505020505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050509b5050509bff2962a9 % 2929a9a9205050202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202050505050505050505020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020205050509bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9bff2962a9 % 2929a9a99b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9bff2962a9 % 2929a929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929292929292929292929292929292929292929292962a9 % 2962626262626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262a9296262626262626262626262626262 % 29a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9 %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def %%EndProlog %%Page 1 1 /picstr 1191 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def gsave 210.72 321.6 translate 190.56 148.8 scale 397 310 8 [ 397 0 0 -310 0 310 ] { inputf picstr readstring pop } false 3 colorimage 78DAED9D5D929CBA120667955E81B7741FBD0676E3576FE53ACE447460904A55 A5D27FE603316E77030D22FB9310D2D71700C0ECFC6EC3AF5FBF7EFCF8F11B00 F6E5C77FB45BFF5F8DDC35F5F79FB1CBC7FE87AF9F254B96332C3F9779F89ABF F968EAF17A14F7FD0780FDB8A79146EB7FA4A9469AE25402EC6DAA760249A6A9 EFD759B264C972D45293A6384A2C59B21CEBA87B6ACAA529EE7E02C0C08E079A 34D5AE970200400E2135255F8FBAC3486F04962C275C7E2ECFA9F6CA91A6B8D3 07C0EDB96EFD8EEEE6B1A629FA4D01ECAAA9906BFC6D3C7D4BD4633DFDD35472 FFF524BF4B67866C5D38A151FB33C3B16D74C4F04F876BB3683CE58978BC6DAD 34F52872038BDF6C92ACDF9FCD8E6DF8D739C775ADD394F568AF95A692E5E4CC 1FCAC7B76E740D8E3AB62DBE0E9A5A2E4D3DEA7D4BA4294D21C925FCE4EBEFEA 52F1F73757C37AAF5FF3778B6B50FFF5C71E5BF9B8252BB3F28642BE8E5C1284 178B25843475489A2A9E77AB25DED742F2BA286A2AF9F7104D15659BDB7AFF63 AB3F4472E3AA4F539ADDD6EC95B0867535B5659AB2F623F519BBF843ACFC5133 5D269ACF6AB6DB334DE9BFC2FCC7D6E4079FA36A5CA4DFA5CDD294DEC3F3A429 D349796CB7B2C627FC8A154B942F1E38B6ABB91927FBDCED2861F72639B6FA75 866BCAB4E962C0DBCC51F2B569FABEF3A4295F0CA84C539A76809A9F7B4724C8 EDDB7D39304ACD736CF5AD64FAE641A5A67C9B56BA689B36F6629A527EDFA9D2 94A3DE579FA61C4D2EBE86119F0792F5A6C07E4D4D35D5FAD8EA0D13A5A91A43 EA6FAA9E93A64CF5BE79EEF4399AA76AEEF4396EABF96EC3C96DB6CADB82BFA2 FB5EC66680FEC7D6D1E6239F94D8AF13D260B5719AD2374F9DDC6FEA519F928F 5BF1F6905E35C5660AE5EDA46E9A32B576763EB6F23A4D41CE7A1D69EE183A8E EA4E353EFA4DE98D0DB071FBCFD269AAC678DBA729C051388A34459A021C05A4 29D214C0E169CAD71B9C3405007DD2944956A42900E89FA6DCEB71A4A9CF676B 96DFB3CCFF62661F962C275B465D9B1FE3D5AF474853BFFE9D21EBFBF5CF072B 895A0F00C412786D46AD4A4853EF2D325918000C9CA7EFE1AEC7947C1F2BFE01 00E8CB3D4DDD27EFBB6BEA5E4FE48801404F7EFEFCF99821F4ADA9C75D80EF0F 5E0000EDF9F91FA63B7D680A0046694AD96F0A4D0100690A0080340500A42900 00D2140090A6485300409A0200204D0100694A26F908E1F7EB9F37B4F86AB9ED 26DFD9624F1A7DAF9EC8C76D9E9D8C3A0B1B9C32D2942F4D759683A3C8BDF724 64970696F9FA4D3FEC34B3ACE41FA0E26E3FBE264E38364D0DB99C1D9A8ADDA5 D535B54AD208D41490A63469AA58410BAC0BE4AA9FE13B20ACF6FDA2E6CDF2EB 21FB2F7CBC7E0F63CFF5E3240AAFBFB7F8FE67719F57A90B93A61A69EA5D7EDA 5D68B98DB64853C5CD29DFACFF3B6AFF93EB89DAC3A873ADD454D3B3001BA4A9 643B76510EF59ACAB59FE736D44E53457DE9F74DB3AB81974F321AB9D3B27525 EEE3AC2F5DF2A79A165158374DC5D60534FF354A5342A52FE734C1F64D2F1F61 8BB98A52710FA3CE359A224DF56C9BEAD61F601E4DE925503C8CAD2F1F6B38EC 99F7E4F62834459A4253F59A7257EE72EF6F7AA7AFB25A1AD87A86A6485343D2 D4AE4DE8A60B64862674A1DFD49C4DE8CA5AB31C5F4D6F465367A6A92BBA4382 DC8A2EF7870FF4A4A36D2AEA767FD4314CC621B97F45F2BE7FBB0E099A7FCA07 F05277484053FBA529880A81EC21A02946484002680A485380A600664B53C23C CBAD2FA5519BBE32DD87D652E5C0A317BBB73CD8429A0200583D4D010090A600 8034459A0200D2140000690A0048530000B3A5A99F0000BD70A4290E1A00F4D7 94354D010074C3D7360500D007D214004CEE28F79D3E6EF601409FDB7C35698A 6308003D35459A02800FC3EB7AA429009859537FBD449A02806935F5ED25D214 00283535AA318A3405002B6A8A34050027A4A9139E2DA200039A5A3A4D6DEF28 3224A0A93DD2D4DE278E020C686A833485A65A70CEF4734CAE37B3A692E7E5F3 62EEACE9CF26696A514D9D3657E69CDFCBB757F5676AD4D1985353A4A9393595 2BE71B9B6A0F4D45FDACACA529E15B90A676D554B16C33FFF8242742F37EC799 1A787EEBD3D47DCF73BFB0A4A99D34454BCE703BF934E53B593354ED2B3575DF 67CDDFA4A94535155244F52BD127B7E49BE56B4A58B3357538B6E296864F17A6 2FBBA2A684DDCB3552155F274DADAEA9C024205F3B4AD52809D7547143E19AF2 BD39562CEBA6A9DC1BE46236304DE97FB6D054C83191D34E8B77CA1FAFD79469 43264D859F0E34A54F5353B54DE97FB0D054ACA64E7B517F4BD47DE7CEF4CEFA 5A1B9AEA99A6D05460F92CB60F28A34B60C8E92C1FFD371AA8A99026269AD049 53686A334DBD0BFF23D8F86A7C359A2AB6FC6FA9A9AB4D87842169EA5D72D054 7D6388BE7DBBA7A6F4922C26224D43BA50FFEAA9A97AE1CCA6A9D64C95A672E5 134DA1A9104DBDD52428AB5B137AD3ED9EA0A96E694AEE1283A694D9D85795AB B9A066D094E9D0E92B80688A34459A6A1AA84C1969ACA62E45B799404DC53E08 89A68E4A53B44D0506AAFA8E8EDD1AC66B347519BB688ED594E3B0A0A939D314 95BED86020FCAFF545530BB0E37A343D95E3F8460EAD55EA22FCA8A229FA4DAD A5A94BD10F4793281C4FC1B813420B4D5DC6A151C66AAAF2A8A229D2D4729AD2 C7277D180B0F391D3465FA46C3355553C39D4A5363E746214DADA52980FEA57D F8144E9DD3148F1E03ACA5A919669A63BC29340530398C3785A600D6D214690A 4D0190A6D0140090A6D01400690A4D5172004853680A004853680A803485A600 803485A6004853EE34F5676B283900ABA7A93FBB43C901583A4D01004C9EA600 00485300409A224D0100690A0080340500A429A1DF141C88EF678BE3067211A2 DF144451A3298E1E0845A8519AA232786632AFD1140710FAA7298E39650C4D41 0B4D91A6004D01690AD014050648534ABEF2506036D3D4846739398DBBE9FDD6 F5D7AC8D343589B236DB109A6A778DB7D3546EBB0EAF6EACA963DBA6D0149A42 53A4A9153595AC207CFF7D7FF1FE9EC73B1F1F4FAE6D9B6AE68A9ACA9D0EE1F5 5C49B8FFF3B139E1E3EF9DD4BC9EABBA268BE2FB3D8EB591A6E6D4D45B2F42C1 36FD9DDCE806A65A344D25CF82F51457960493A62A37A45F5BFFC2499AAA0CF9 F249D7BF2D57B04953ADCFAFD07E9E0C18EE535CCC6FB2A68AE6AC2972494DE5 3ED5BF7092A62A2B7D0E4D293F4EA56F86B629E1B4EA4FA5720DB369AA58D5A5 6D6A894A5F7D9AD2F8104D4DAB29EB478458A2D1941CF09AA6A9B1859334E5D0 5460A5CF5AE6D1544F4D992A7D0E4D592B7D53698AB6A955D254B1D6E66BCFA4 097D064DD534A15BD394B2D2E75EA1FEEFA59BD04953B986A3649783E4DB922D 12B2D9689B1AD50BDD74B74EEE51A0699B2A1624476397A9285E5B7448E099BE D66D201BC3337D409A9AD64B63EFE1A229384D53A4A9CA0A05650C4D01690AD0 1490A6485380A6E08434054C0B622A9C009D679661828C9371688A8306721162 D6630098BF32C8ACC700B090A6485300409A0200204D0100690A4D01C0BA698A 8E1F747A711742803EFDA6BE37040752D90B1DA05B2F741E7C383999F3B00CB4 28428DD21449FE344234C561DCA324F8AAF357C767FA2872C7B627A029781480 A822D43A4D7DC1EE7C8A4194A6A8FB2CCA5B08DF27F47FFFF2F73DEF574C9A0A 4F535CC5680A4DA1A98791922F8E4D539FFF924BFB7D25B9690D1FE3DE9B5E91 376D7A1D3A684A9EE0D237566AFF41568F1AD0B59BA65AA429CDC5FE2E969552 42534B6B4A3FE59CD203C20C3253696A69AD1535752F2AB9D707A6A9A69ABA6E 73FAA0A9A334A5BFAEDD1F4453136AAA439A7A9C1187A6926FC87D2497F91F25 5FDE3D18DB36254FD15B396FAFA6C0080543AE549A56BEFAC41FB2A61EFF9BFC AF49D2D43B7237D594B039D3FB61754D0915BD904984AFFCECC9EE95A0A95169 2AA7A3769A326DAEA6E688A6C235559C68D8716927538D666DC539D9931AD437 B2EDAD29E1F9DF39D35488A6043BD56C0E4D2D9DA68A779073092A2796E4AABE 7493B0A3A9769A5A254DA1293455D9EC6C4D471A4DE91D7894A63E9D10842EE8 A42934C59D3EE183952629063C34253BCAA1A90E692AA4095DDF57C1B4399AD0 0FEC37A54953354DE8D6956FDC2121C784FDA61CF76ADD9A923B24C81D184853 632B7DB932536C772ACA4ADF849ECBDBD60E09C5862F9F7BD7AAF469A6E79BB3 17FA65EFF90907B64D4DC5D749CFBF74D0D49C6D53D65A159A4253686A034DE5 4EFD3C6D5342971559503410A1293485A65AA729CEDD398593815C28098BA629 CE1D9A4253686AFE3465BA2F23F7E99D24F3CBCF47A0A9704DE55A32E573A4EF 944E458F3465EAD9A2ECBFF755F7507C48BB0445B78FA6E43E4EC5B3A03F4D5F A5511460EF3455F3B385A64ED6D4576AD41DD3590ED1149C96A6DECFB6583525 DF0A4CBE27D7D5BCF8746A6E9D73564837D3D4DB4E8EDFACAFFCE02DFA02337F 5B04692A304D151B761C694AF9F0827537F40F4450381BF542177C55A3295F81 A1009C93A6344F973B3495FC2F7D89F20D1344296DA729D393B91D4E2E374D4E 4B532D34551C1748A839BA4733A3B8AEAB296B81A1D2479A8A4D53CAC4559418 9A1AAB2961E89ED834658AE8B92204A4A9169AA2D23779DB94324D39EEF48568 8A0260D5D4CCE34D5DD334A19B1A5169425F4253BE7E53BE024301A8D154ECB0 781DFA4DD57748C8153661E81EB957837CDF39573229A5433465ED52AEEC9020 1718DAA66A34153E2C5EE75EE8A37A69C25A9A02343555BF293485A638A4686A 489A3275FF265DA32940539DD314A0293485A6264F5380A6D0149A9ABF6DCA54 C5CB3D0DEA68B0B25618DB5530371EA56A923B7D726F289A0E4853454D59FD50 BCEFBF96A6F6EEC630C97853688A34D57ABC293485A6AEEAF1A6DC73220369CA D4BDD3A429CD9CA142A5B2F2FD8E818CB6BC7739CF7853CA19D8F50F1D63B933 D394A68946F93855CD24DAE17F17DF499AB26ACA31DE946606F6E4394253A4A9 D68F1E5FE2335F4D5F77EC159AD268CA3D904BF1EFE49AD11469AA66A482819A 2A0E4984A616D5947C6695E71ACE4C539A76AA51694A29193435C37853F2B3C3 C5338BA648538ECAD4CC9A52FE134D39DAA694E725F78AEFCCBE9770669A2A36 32576AAAFFDF878F5235E17853F22D3FA1C99D5629D2D4A37140D36260D5D435 A243C2E1A354CD39EBB1DC7E55ECC78EA64E4E53A6A61E0A0C9A02347531DE14 A029204D31DE149A4253688AF1A6004D01698AF1A6004DC1EE6D53C5BA9B69B0 296A8527682A77CFD4D468C0D9214D450DE4E2EB9A9E6B99870D34A5EF8E5B79 1F1948534D3545993C4753BEF34E91204DD577EF2C3EB17279C7C413FA586A46 62517E90083783A6AE8ACEBDEE22017BA7A9E2683FF59A723CF3A27FF3B5F5A8 E6B369CAFA4842E063509CEB93D394E3C997CA30AF1FA131648C293415A529DF B078EED74D4502B64F531D34551C2ACA371291BC7E0AE7F0F1A66A460F4353A4 A99E9AD2FC10EB7FA9AFD2DD258AEE129A2A9E5934459A928D147BA72F2AE16B 2C4AD11DAEA99AD1CCD01469AA5D13FAA56ED67654FAE40FD2AC3A95A67CC5A0 BE48C0DE69EA52F42EB6D6EF84B6A3CB387B8872C0ABE4FA299C33F442777448 701409D83B4D59A16C1CAB29405303D3149A4253680A4D4D3EDE945E50246D34 0568EA62BC294053409A023485A6D014690AF6D5947B5029F93E609F2685D899 493BEF3C690AD094A6CC2887463469EA7DE12FA4A99E3B4F9A0234A5D4D4E57D F4DB3ACD68534D355ADBB19A224DC1FC9A2AF6E1F4694AD3B9F7317BBB7276DA C71FA6696DDD3BDF7F845BD2149CA629B95BB8FE6FB9DEA4596D5253EDC6346B B4F31DA217690AD0947CB56A1EB3129AA04DAB750F6CD579E7951567D2145731 9A7268AA72048CAB7AC8A0393565DDF9CE4D58A429384D53CA510A6BAE74B740 66D094FEE3FB698A3405E7A4A91334B565A58F3405C33525F731886D85F6356E CBA31927FF2E6AAAD1CEF7CC54A4294053C919B1AD1D12E48668655781E24D37 B94382FE83353BBF718704D214CC50E93B9C450706214D019ADADB4B1B8C664C 9A02347582A9961E638D3405680AD014690AD01490A6004D593515382C40CF31 F96BAA6FB44D91A660214D39E6441BAEA9CA6E004B0FFE4F9A82333575C53DFA D1C70095F10F4D91A660334D39260F4D3E21F8EE0F204F3C2ACF67AA545072E8 2AFD34BB8E3793A6D0149AEA3C908BFB5197EBDFC75E4C0337299F6AD10F7150 F4A1E38B8C7A5E86340568EA6D8CA4046A1E22CE89C531AAB97254287D9556DE 07CDD382A4293485A63A8F90205F98CA116084118C35CF0E9B64E5D094E68BC8 DF7ACB4A1F690A26D154D136CAD4640D337272735CEC6E4D15774619C3BAC52A D21490A6FA68CAB751CD2B0E4D45D55E699B425368AAF37853C9FA54D4C85195 4DE8FA3679539AA2099D34052B6AEA8AEB90906CE4C9C944F38C70EE0DA6A1AB 723B731DDF218134053354FA1C2CDD3172B392409A0234A5AC7FC1AE9A224DC1 42696A83319AD014690ACEA9F401698A3405680A485380A634E34D091540CE05 698A34059D35656A77AAD714A2234D019A7268AAA73DD014690AD05488A692BD 34AFD7B324727785DCE49BA63EA29C7AD2141CAE29C7284C516FB8ECD3BE0369 0AD054AE6A263F1DAC79A24DF3F85BCD0809688A34055B6ACA3ACE805553C571 9CD014690AD0545153A6D1ED4C9AD28CE384A6485380A606A6298D82D014690A D0945066F403B9D4A72947133A679C340568AAB5A6AED2384EEFF6AB5CCA02D2 141C5BE90334459A023405A4298A1C9A4253688A3405680A4853A4294053409A 02347595C69B728CE5A29C72BD066EF991A6004D0913DE0DD7945E9E4D6D369B 2A495370A0A6AC57654F4D5D134C347CACA648533083A634462A0E397529E631 F70D2A659A09D4B1B9C001B24853680A86684A33A2944653BE41A54C23CCB827 5BBF829EEE214DA12918A529B9AEA74F53957546ABA68A9B730F9035437D706C 9AFAD8893405F3A429618C175FA5CF77F99BB6E5D694724C9BB1F5BEB169EAC7 BF90A660AA34E56E9BD20C3C553464074D2907C81AFE8874CF347537D2BD6DEA 93B54853D05A53A6DC52A3A9FACA541F4D993E389BA6FEE8B0A6A90F0F4DD136 053D35E5687F1672C87DE416E57A4C294EDED6A56E0997D3D48A4DE8829AEE6F B0B64D253545DB14F4D4D4A3922554BE34B5A1BB348A034FF93495DCD6651CC3 2A6480AC51A6122A7D39573CFE973B7DB0A2A660C592D05A53F49B023405E19A 7A9B2AF95FA4294053B087A6485380A6A085A61E3ACABD4E9A0234051B688A34 05680A1A69EADB48C917495380A660274D91A6004D413B4DFDE5FDCAF034F507 CE2050531CCCD54BC2432FE10FCBC4A6294E199AB26A8A23B999A6428A50BB34 05A751AF29A008754B53702C6E4D010845283C4D117AC9FCBEA657805C110A4F 530000E195C1D8340500D05453A42900204D010090A600803475D714B75001A0 0FBE34C5710380CE9A32A5290E1A00CC9CA6BE0000BAA34F53BF0100C6514C53 776BB164C992E5A8652E4DC5F2772B2D560B00F3D0F432CFA5A9C0F57FEF3FA6 02D85E538D1CF248539F7B7CB1CBCFFE375A3F4B962CC72E3F9779A3F57F34F5 A3199FFD07805D697A9973F71300E6E7FF1439BD97 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/main.pdf0000644000175000001440000002262110616356710013410 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hi`ªg64±°PÐ5Ò3·41Œõ,-Í Ì!ª-\ò¹oÊåendstream endobj 6 0 obj 67 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 6911>>stream xœí;²å4׆õ ¥ÓŽšPEG$=†ÑI''`ôH:‚*F@)Sùw¡¿.KKW/y?OÕqùȲ.¶üîW²lÿÏØæ¿¿ÿþ{FÒüñÇï¿ÿþéÓ§‰€ü>ï2ÈÈ?þøŸN=þÿöÛo."u®ÀðôY²diayØ‘á){éøO§‚ £8W`lÊ`³™q™?Òÿå—_^ù©y<*€Hܘy—ù#åï¾û.á§ü–,Y²¼jHUÚOY((K–,ŸséUèl›²~ê±a¸…(Û¦¬Ÿzl˜4Y ÇÛ·o“¶)ë§FMVðÙ_~ë”%K–ç¥û·oeíÚ<+—޲Ÿú£{ÿwî÷˜dàµùû éGgåñ²Uá§,TÆ2P\Ü¿ó§Îéè¸?þ|NçqZç§’Ðs®êQ™Åø2,Î=wŽÅU Çv 7«Î:¯Í8µ@ògDs"‚h›ù©£Ùù:\"ç’ØQÉþòÜìØ¯Îµg|%³ý”R§Ü×£½™ŸJ6”çi=g‚ZOº¯:¶3ªƒN)±ã§Üë®ß~JÓJr&?~$¬¸ü/p¼K.ýs„Üz3Å‚iª/'˜‹£L¼xlsûÛd ÉŒ†TGn BQ…Š e0 ~Jª€¾ÜÅúuµK¡©%7%×/Ñ©¸.ÊÜ×[e:.ÒˆsÕr%﬎¾TB A97âž~J?zï9g¬×láÊtyƒ#„kÖ5ûjò]é§ôÕ/¦æ¹ðØÊUÓWG>zÍb¤/ÒvÈ×fÑžŸÓqFü”2× r­f[d,—r“j3ÅßÏ8NÎMÄI¦£9ÅËFNöÂc«OS(X›NUe]´x7)'^›ÇU¬©¯!?U¥SGÞ~Êe. a¯±Ú$äÄ9/sñõ4›)}‚šDš)e²mÓom3Sú¬7¢è§”:eËO³ xäÝï§4M§S§Ü×cÚ 7>»*M}èÔìc«—˜Q:Õ#‘E锳ÞŸ:ÿ»‡ŸJ]¦ÁO¹T‹wê £a=¨WÃϬòG¸ ½HU`ñ±ÕÿH$Ë\ýÎê´mº‡HyŠ×fð3,¤ãŒø©6zæOyŽÎTrSn—s`­Ö$C„v¹NÉÅK¦|Äœ}lå4«¬œ¦:ÅMšÃ(þ6:uÏû}+Pä6r`æOIA¤€Ÿ*T@‘Z~Jª\Î?¥ß?i¦ú)R­ðS`¶ŸjN§ÅOù\5Ÿ²–Ÿþåòí°dÉ2XŽº6ÉëOGòSŸÿ;þÝ×/gù Ÿ¿N(ïä(˜bàµ9*)ÉO}øð!Ȳj `ÞOùޤçÕø”ÇkØcå§Ÿ~Z]@xnÞ¼ysø©#ðíÛ·¯têÜÃD§`%///?ÿüóùË¡>ü•N®ÜW?õ×_]Rbx*~ýõ×ÇÒë”ö~ßá§Ð)XÀY§œrþ”ÃOÀBðS`üX?ÖÁO€uðS`üX?ÖYá§~øá‡8ðË—/ðÇÒGð+cÉ囌9£$“êµ’ãZ®ˆ|œ«Î NÙ-Yá§rç~N)“K2¤H6úþ¬½B‰ÿšB(›¦Øçc…NÙd‘ŸÒ7”4èÔØ"í®S3ŽÉ êØÄœŸ:wÖ†_iÁÖ#— $£:;šdã@Md9|Hù…£×_B9r[QsÂ*·® Ŧ8¶…€’+ýT²·å^7 yWZ2£Iý¾bvÊÈúõQåw©S0ª„ÉmåÔèÔÔ³SYä§‚œ(M­óbËå+d4O§rÙ¹¨¡Ë&‡'é¬EPHåiª*aOsÆ\ٺ佔á0‹~êÌÔž‹\’:åòý¾d"Aúktê\N}u4% BÐ)Èak|jìYßB§ŽWRâa,vRkW:¾ ÓféA§lbÎO=§Ni"+u*¾P; ß\B9=æü”»é8zÕ’+›~}ˆN¹×樿TA “ÚŠ*h‡æÀVtj=¶ü”ûÚ&~üˆ‹„gÀ¦NôSwuþÌ¡Sð ØÔ)7ÐO¡S3H~¨î–Ÿ¥;jzËÚíBN§’š=sŸ¡Õž?ÕËU:Uü”æÍ®g›:ÕVªþÎ^u4lê”ÃO¹D§r }÷¯. ÜC§F} |/ÊŸZÇz:·õÜÏ”†P{œ“ñçÂóÛï§ÎõM†»T¥ðS½\¨SBµé>îAó˜`î¤(O–…±ÈNòUЯà§zY¬SC~Kõ‰è½›ÿy "ËýPáúŒ7ɳPÎZu(ªF›^TUv`¾ct*?Ö©s‹áø©^®Ò©¶*·§†˜Åá|a÷!:U,çpj‹<Öáî5>¥Ñ©`_C~JÿÃe¹ó²‘NÉ~'© 1åÝûuJYÎdWBÖ©ÚqqtªS§äŠ\é§”£ýú›—°£NMÍÍ…bL™6êï¼£SþßE~ ªEãA£Q4/mÎbõÑ×èBJRÛÂ÷Õ)7aÝá§Š Sqdk:å¢Öü› w:šuJîMÌw,6ç%\ã§â¦ƒN4ˆÈ¿çɘ tJ(gq8I_#÷ºQ%»`¹@›Ni˨|ÇòŒÏ÷Å”ïD§Щr‘6 š¥¡ùt´%Ò³ËlêÔ:?%üŽ¡Sgô=}oNÞQÞdA§ªÆ’„¾^­™ª*:Õ~ªãóÑy JÛ™µ@qì¼*µÚ2 S=XñSA¸c|*OÑR/È6«2#0Y`9NƒGKæ²X§Š¥b|JÀ–ŸJ‚NÅ(/9akm`Õ0péߜôhîU隆6ï階êwbS§˜?UÆæû§r£ÂÂ^¹KWíÊ™LçZJ[[tÊÿ‹ŸÒbù}ž¹a}O§Óæ,Щx÷\!‘e:µjßþwrè”ÿêçzðSð~tx|k¿J¤ÜU~ʯXûѨ‚çáÑÚ/)Çû§šA§Ãû§ªA§ƒŸªX ~ªt `1ø©jÐ)€Å৪A§ƒŸªX ~ªt `1ø©jÐ)€Å৪A§3ÑO}üøqaEVƒN,c–Ÿº·H9t `!SüÀ@¦ø)€à§À:ø)°~ ¬ƒŸëLœ?OÈÇ~·h0plBÌŸ‚a¼¼¼4ë \¾ ÍòSmí¶¦ù¼Ó`À“k ýÍîÙ@§ ¥Ná§ t :ÁOÁtÐ)è?• ù tåšÅ²NÉß»¿„ø»ßò—Àk¿>6µ5à§ ,;m6ÛÇŒëÔÀ‹|Irõ6éÓ×o½ üTtªtª t*?U yÚÎ…c«yn7G4~Žì~ŽÄ1ØhjÙQ§‚ë?è §ÒE-áü¯{}B…ÝãBj“ ºLS lKÍ-?U@þqË­+£ëÉ–jó÷­ŠuÊeÎB|Om çÜ‹áéS[ß8ñSŠgBþuÒGË]7À¸N!E‹‘»Jk[B\Y§r¹W5­b¸f/·¼qâ§ û}NüuŠÿÍ]qüóÖ­1®SÊß¡ø_ý©T¦`M§’µsW4NüT¹ßç­AŽ&dçµ)7Ö)Í©TŸr‘š;ŽõSÉjºU?U@n4n²N ᱯNUõûrivÊG2S :¥Œ3üTÙOý ŽJæ¢w×\ ±©Nµ@ߊ~JØ}H‚úõªâYÓ)üTèW¾D·Ÿ…hÉQ YÚÜþ>g^§âÀ/¯ç—¸Òå}ìuDÖÈŠ«iHµ ºTÓŠÓÃkSsKÀO-ⶨË:[€ŸšEîø A§ üÔDr¶ùÙ@§ üL‚NðS0t :Yí§&WŒÂ÷f “u~êÝ»w3*[РS48³ÈO „ï!€uðS`üX?ÖÁO€uÆû)æÂ<3ÌŸ‚NÍŸò3J'Õ,óòòÒ3}F‘`/rMhŠŸâˆç„çf “uÏ÷9a柊÷ïß÷ëmæ&÷¥ƒxÇãeøU!rÖò{þA`’Nå>pÞ±öí©ë?LðTïË_¦SSü”æjâœÿmS%tj3tJÿ):§á»2S©Õ©­u­¨Sg=Ê…_駦êÔùS?¹8U¹·%ò´\¨SÉ$Í;v‚N¹ :µÂOŸ?;ÎìGЩd„Ü.ů›ÅûÆÅãS‚Nåõqr À‰Ÿí+6°†Äwÿ˜£¬S‡ ›¬ø)ù­G"£tªøÅWe|ØB§\¾¯§o*Åõø¤=‰lÇ2šî§rz4O§ª²ëé<>-ót*gO‚Ý«®íX­r}Ì\.BŸÔE:¨h»·N"•ÛjÈO Ñ)——§žìЩìø©\;‰ Ø¢8)Müœ°¢SçøÍ:µŸrè”ìèTµþ¨ÿâJ¢öT:å2yyÉíè#à§´Ù¡S ì~¿¯SJŠzœ\A¤\½N­ðSnÄ8znSœNUv¹ø °ûü)ŸR®ëÍ—&‘íP>7cn|Ê5ݲmÖ©\²²,&‹9vŸ®o:ÿÂÛmq|*WAW#¾Öû}E ù© Æy¶çû¶¶˜Ï2rÃý”ñ6ý­óIt rlì§hs·ÏÞ~*yg$GînKqÇeäî(?- t*¸;òÂ@AÛÉ¢¯§ao?¥Ÿ‰çW4ù4iÎh[É92OÎl’ç:¹’ôèO““s­a{?¥?ÇÊ Ç蔦êÔ1Y©y>ú ·òSÁܹb³K†)!.šîpnß¹ùÉÖ)§i³Oz ót*–§†­Ü.Ǻ¦ÁØްÀ}üTqp§ÁO)Ÿcp‘®ÉÅФIKuÓtJóJ°5Iîw®¶ÁЊÜÇO èCœØ\šT1Sš©À Òÿxk’!'7Èç¼'¹•Ÿš¡SÁV¦ÈwŽÐ)=;êTG¯SçÝ9ûø© ?¥‰“sõ¹LÑ)I:GKhºn?• ×4T‡T½?5^§ªŠN ,ž?¥!ÂÒdýl,{OÞ ?å.GÏù©ä.Œ£ë¹P§4¦¦yªZ–½'Ï-˜?uîÞ7û)—jmG²qaâKéö³Ëôi¦ƒóÑ“ûÉDr †ñ) ËÞ“·z>ºæRGŒÃó}àÙø}žµý¾tÊ8èx¶÷S~“ÜG‹Á`o:ž½ýTmma/Ð)ðìí§:*€Ngo?¥ì¾ÅýAaGå UíØÖ¼±°†¹]0r¿OžÅ(çööS 7õŠ·ÿ÷Ò©{Ïf0òþ)têr¶÷Sè:% èT 2òôº†Ùê0[ù)yžçG£SÉŽa.}yj_C|—é[ã ¥É÷ÅÎû§’Ïl®½!sUÜÇOi†iouL¦sÕz±T7núvÞ?œ‘ä)Hž#tj÷ñSE RZ÷\:‹ÃJu¿¦oê½.ÅõdÊèÔnå§ÒE-У Gt*Çv:ìžëZÞïLÍæ)ü”f¬*¸Ì7¡S1ÖÞ?[$WsfÑ©fîï§„6aY§”ÿ¢S2cß?Õ£Sñ²¶.ÏÌ­ü”+4ÔêT.ýyëšÜÑ)áïŸä,wŽÜÝOÓîã§Üi€ ¾ÂÏÈ-Fî?ÆéYË£‰ï22$Wá~€‘ùèÉøÉáÌÞø4-à>~*@Óh1Æáù>ðÜÇO ®;:et <Ûû)¿)¶î²;‚MÐ)ðìí§jk {Ngo?ÕQqØt <{û)M÷-yM¿à ™÷|ß!y«Î)Æ h+ÙÛO›‹<É 7+Ïež8…Å\øÜŒ|ÞÑ©Ålï§fèTq^2¬aNTwšÄbnå§äy’N¡Sá ²8ö’'FTíD{Z®Õ)5¿¢™µÛÜ$ É}ü”üÜɧG§ÑG–7='ót*”Ûç 4 B’ûø©†‡`üT2r.Yaì#ÞS˜[2ï} Ås$o­ ¯jäV~jN%ï ieNîÚ¨ºët{ì¼JØ+Øš~JŠou¥ŸbM£Š—LÿiÙB§Šgêç¶~ꆨҩdøp“ŸË‹¶p­N[Wr/y_tª[ù)×=ޤ“K6^×ôûä…hO‹ùSÊfປ$¹Ÿr¯ ‚:]ÏE­çžTCa=Y6Mú¹BÞSóуS£?³UM’ÜÇOÕ‚Ó¶Ï÷çV~ª tÊ>èx¶÷S~S•â´íëA§À³·Ÿª­-ì:ž½ýTGÅaÐ)ðà§À.Suª8@©ŸaçòÓ'QœÀU›ZbmH?v™§Sš1ÊZ¦_ g¸N­,|ø)°ËTЧôè”°ûÆ&¾¸ð à§À.ëuª8™3§nÅÇnŽpÍ“^I»—,C°¢ß±§ðÂdýIà§À.óæ£ ÄõÇœ‘ŸÐÊ%•Ô©ª2hžÍš]øæ ?vY¯SÊGÿŠãèB|9ÙÚ2è#Œ-|®À“ÀO]Ö¼wxÔ¥._ÏÊd¯Ò©Ú ©Í?v™÷>πᗺfw³:¥ßý~:åðSP˾~ª9Ùtê–ý>üT3\§m1yQµaÇ)œÿ­JêXä&·cQ§&>×7œ~ ì²X§ÜiDùKý¼„ $¾ò…ð/§ ‚‰Ë 4>c è]Nþ‚Ÿ»ð|ßp–(?vA§úÑôû샟» SCÈõ:7?vA§ÀƒŸ» SàÁO]¿ªyŒ¹gpºvßóÍ»†¼Úv¼üØeñû§ŒëTçl€MïôyðS`—Åïu¹D§zr©ÊÂOÁ.Ô©â„O½I*ðh¹9îÉ}…ēœ7kÌá,æ•+¤™ùè¯RD§žŠ«ÞëÒüÔËy]è¦å|IF8£ð%YMaäŠ\õè ~ ìr¡N垕Ӈ˗nñÁX­4ÐØ±ÜS5Å'gƒŸ»\õ¾ùÊðà§À.èxðS`t <ø)° :üØ~ ì2ûýS~¥êÕ.ò]¹!÷ì¸ñƒŸ»Ì{¾Ïe>„—c™NéÕsªœYÓJüØeÁsÈžâe¹R§”/ÆB§~ ,°æ¹™y¦üˆLîdýK¦ä§rÊšìâ¬ãcO—L|%ø)°Ëz*>Ô¢Ô)y&z®Ê÷Æä4QŸõ}V‚Ÿ»\¢SÊGgŠÚ‘LVŸ{­NU=ÿÜSÎKº„û©ÏŸ?{y:68ü|å*?u¦Y§‚¤®ÿª¼šuJSÎdœ•\ì§>|øpÞ?g.÷SqxC¿OØ+È"œ­Sšræâ¬d¥ŸúôéÓ±õÕø”Çk˜ÃOÁWÖßï¨SEáÈeQÜk¬NUí(Wa9zœ\Íîµ~êØúöíÛW:ÅøĬŸ?U5ŽǬŸ>#‡Ëy)³+ú©ÇÑzyy9"ÔŽORõJ§¸ßI.™~îi:Dî¤ÂV‰KiÑÇy¹”‚äŠ-¯ÇåÌ%þå¢/w ý¾£gwŽoå~Ì‚çûÀ³L§ó§ t <ò8z UÉMø)˜:že:åðSP :žâ¼„³åÂñS0t <ËtÊá§ t <šyžIòs‚@‡Ÿ‚© SàY¦S?µ SàQ>7óçŸ!×û)å”yØ:E›ÙšÏ͸±~Š÷<ŒÒ)ÚÌî:¥?¡×ø©¶J¾ôëÔŒRÁF,õS“êöiÖ©…Yä§üX<- :E›3+üÀXÆû)€±à§À:ø)°~ ¬3ÀOù§ufÓè§)XF‹ŸB¤`%Õ~ê±íš’ÀSá§ÎùXLÙOyÁbÉ’%Ëk—Y?5VÙ|úôix²`‡©—yÖO Ìà±|T`Fâ`¯Snކ„~ê¸Ó7vyT`Rú,Y²¼vé¾Ú‘ÇrFúÿù)ŸÍ Ž LJ.gêeþÿ:`™ÿ‚C„ endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer blah-000.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000384 00000 n 0000009056 00000 n 0000000325 00000 n 0000000170 00000 n 0000000015 00000 n 0000000152 00000 n 0000000449 00000 n 0000000549 00000 n 0000000490 00000 n 0000000519 00000 n 0000007661 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<11F22A21453D06B472CF7DC09D247949><11F22A21453D06B472CF7DC09D247949>] >> startxref 9224 %%EOF geomview-1.9.4/doc/figs/main.png0000644000175000001440000001031410616356716013425 00000000000000‰PNG  IHDR6o„ÓTPLTE¯¯¯•••ÖÖÖdddVVVßßßZ[„õoIDATxœí]K«ëê¬a1ÊÖ²"ÿè*Û+ËÊ:ÑÑh¶Q4òúx1š¿ª º›núåër&¶û|þ(¨‚‚âAä?×@Î×=È÷ðû¥Áq äv½ìAÞï§Ç×—óõ´9¿_Âï†ðHøu«ò~ýcø8ï]ˆ?;—Óø8®ÝfN”+òñ{•¶³šüïB|\¿záŸ7%§kæÄÑñqñš¿Ýö*(ow{>ØÕ›í?xÉÎM»‹Êq:ÿNñqsŸâHí˜8h’ãÇÓwF·ô]Ñ_²“åò8öñq§T^)æ ;>àNqà×§’lKÌÇoîáC ÎÀ^ÈJž¹3,y9Ž ‡n> qSCÌ_SmìOؼ™ïGû J.ŽkKâN{©{Íæ4€¶_ì üØcPA¯&?8„)[ÇAàÁÄøù(8›ž°{p âC8í¿ú¢™’Û¿–žþOá®wžðÍ!µ‰x$Ý0 dØ„dùÀDŽµÍ®ù¾Üø²Ç„­ ðɪ»©"s'~;8„{Ä–ìˆ×åø ÆÔXdݽ@¼6#üEw¢ÚX5: û]r:õã>àº,T¯Œø|iNÒÆ£©õ8â;ö8„Ã!NÃp¢›rðíÕÑ©*¾Nâà>ÙŠà‡MÜI:`û{ƒk󿵟ì@Kúqô'•Þ6:‡ ê¤ÛwÚo¬1ƒ4PñáÆ~ãú™¤Üq2²?ŸE[ ÙèØS$æƒZ¦½û'jaw·ÏÇ… ýXkªW~°Ïïì3ðqøsú}¾y៷%göùû |üu»ë)-*×ÛÍÌ\nŸ»–.׫Áq>¯]’iòóúõjÛ«Û§Þ±¼ü¤öê¼sÔ<ùØ‚<ùØ–<ùØ–<ùØ–´ùPÍ¥´ ®2ÇÌ[x8¼¦-JäÏI–€**qZÚ|(Ý*0åÔæy¦p°óJê<Ø;êàhñ‘(£Ã¡KptýÒG Éó!ØióR¦º Vx©LÍiŽ˜£ þØy{;¤(¥ýk‰†c…‰LÁ‘âÃT ©¢"5YFõÊ\cª…ð/~^àMtЧ8â¦àhñ!Ì/d ÌpóƒµôCY,΀RµDÀ)íNI~/f¢ÜÍSjXžѪ"Iš-Æa4zŒ§xŠõqdô#H´ VÚ+¢²@éD‚*ijÖ"| Æ¡·W¾Ê©™qäø¢çXŒ´žÛþ#«çZE ÅL|„í®©ý¶ÝåŠ×Þ¸ò»¨ÝmJ·» öæÀv·2#¤£áŸÒ'”H{w8•3Æçnã[Û— ¸)89É åqý}Ê“mÉ“mÉ#òñºgñ||¬]”IÂøØµüãõc×ò ||°öê¾v£3A¸~Ü×.ÌyÝ_’Õj|$q|<¯{ä£}ìåu|´½<,/ƒl™_KžÉ0>†á¸/]x&ùø5$©{Ý¢É@>~ Iêž8¨:«‚Ë\Ô™ù' AK‡¶R‘Õ9êÆ¯ë;¡|2©‹³8êð!ìxzÿø`/Å~Nö8Ve! ªY¡{íEt,ÈÜó¡pÆ¡"õøÊïµË” xMkÃáfyëñÁrTT Ë43äT6…¿µ¢®Ð®Ìö|/sÊ4W¯ †Ññ‚„p.ÀḠ(íÑsš&Îðwwèl'ûû‡o0©æqÀ9E8‚2—â°ù¦ùÀF`,©1Z£çÍþóJíp(ÎmŽ6#q@­…úMÕ</Iâ`Ó;=8B=¯ÆG! …¦¹hCë?âv7ɇ’£ê• Á  è¦5“-’wíi±dù€à—¹qHxE8|je8|( )À!Ž 8iXJ 5«Ž*|PÞC ÞjZ^ Gý ûÊuo-÷8è’$]U?Œá@{‚H0–D„8 îa?X&¾ÌÁ5ø(Æí>üÊÂÙidš'qøWá¬:%Dvb]’Ä¡=Æ ŽÔˆA5>“/m>F؉ËÉ—äÎþÆK2Rm¼deyò±-yò±-yò±-yò±-‰ùxq_»Ôm‰ùÌq_»ÔmÙÝ|mFv7_›‘'Û’'Û’Qñ …rw™Í#ozdÿQ&ÇÛ ©7ò–à㮫‹Oó­~â”lÌǽçž²Ž'ek|ðˆ‰ÉãÈÆÖд…ôß;8‹ùh/¸²à¬G.]É7 ÐÃpèǦqòaFÕÍrY…³Oý1%Ý8”Ô4m¢$-Ô•|ã-¤]É+ýÄH G BÓÔµÔ]WCph»|»•,ßøÀ.Šf» ¤që,s¦p‚~ÍïÔs».]Á"î`¾a€F¸BG¡~ØH¶“ÁÔz¥iëJwAHá ùÇ$Ž2>”d|Àvë¾±]ø†ž­`”~èÇTý z¥ƒêšÇQG?PéfÑsâê•ßø_=z^ªÒìÁ@!*JNÒ³%¶RB;ýPÒá v×üõ´»#í«á›)l;âR²‰Í–í]Õ1Ë–ù(‘-óQ"«ð1Çx†Ã1Gâ¯Éñ’/sŒg8s$n¤ÍÇnåAÇw+O>¶%ÊÇ,íûÝe6$ú·Z÷5ÆÛç°Ö°¯Þ^êÓÎpÔLÝUÓ_)>jæò6Ž7‡ãžäã礇%$ä“ãøU­25FÕë·oß›÷$ûÂñù·ÃóAK{`à•þYQø7‡ Ö}&)†úý-1 ‹,=ˆŠ8p„ ×Ú%†U³cð)ßï¯Y>bJÕÇc^*QÜÑ8Ú|˜6Gó®ÌR8¼7Óqh¾÷+ŒÃÑ\®£†=ǧ~ù;χÝÔ4ÀCyð^G¼c²[ô3e8Ú| áÿ&â€Y*¥àsfLT³Ý^ßïö¿‡™"²Ÿjá >´Z|ÇdeëÕXÝ|̆…ï˜ Ãà8ì’–·Uøh·WlÇd­uŽŽ£Í×sSn3¡)Çd=o÷4W@zî¶IîÇñÍH^?ÜLJ€ñÚÝvîæ °Ýu³ê••Žþ:>Ù]ÀQ8ò>ðâÈë‡VÙm"§3|˜Z‹¦â®pD|tä4Nf´Û»ø¨—e¸Ž˜Ú¿"?ï’QÙ [ý p[}ø kÕ>ü6nû™(—þ©æ.ÂõØE¨:8b>hí÷L8”ïÏ9ŽbÀ‡ŠpØÀ$3G.­ó•àŒÅ!½}…aPMŠJ&GŠp´ùh?`/Ô b‹Cé†(@LÃ4m>¤V XD‘ƾÂ!#Ø“H*ÂÑæ#Ä!2`›™Ú8l¼’ÂçVLÂÑϲ"kða섌"ë5 ûpôñápT©Wí–À1B?:üŒžKTÉ©z®™ÿáõ\Óó0lw5@CR|èI8¼ÿ!]rup¤ù k1CÆáýÄàOÇ‘ö?8Ž„ž8"9ÿCiLzÜ…ðaÚW 4ÎNÄín#’O„1KY ÇÓÿ˜áÓÿèLöéŒÌpUÿÃEªc$2ÌÍ×NS¿aþ‡"£\ô¯sìË07^GÒÿp8¦º m.ÍÙùP¸ÖÕUâZmŠ“*{ŽA‡ï\%xÅmã°þ#ÀáC¢À*™2?()n)»*K1#eïê~ ¼‘8ܳнáI+'âHÙ»:®W’¹ zЃ>28$ÇAS+UpôóAÓ^Îj/¨îÀAS³ñ¡‚öJéÇ„zåWeׯ‘ô?‚þƒ&)Üsã§è9õÁÊïzžò? Êõç0ó¡Éé0ßÇâpý¹b“)²F»›O42Õ"Á Wó?Hö…£íà•“-DÌðét&ûÿâTˉ2ŒÆÛí'2Û–Að*òíØÚ|gŸ¹4À!óÞÏÚ|ÈGì…ÈèË` óvC6gL!Zeâæ\‡)¯te>¬U€þ š£hìÄ^ÍÁdv‘Y™`“(x€†¤y²H}Ô>ΈJÝÉ^™o?3÷ ‹e—_™])¯ç8Øö^=8VæcŽõjQ>~jí5û7¥B ?hÎE£¯3LÏåÃâ`í®Àil³œ ‚°´»‚žý7 Ýݪ}Õ3L·v>Pz7¦Ú ½Sí„þd÷ÁG²ëû^ƒÛc¾:m\?„ìÂÁžsÙ—ìúþG ‡?0ÇòþŸü "q(çw¤Ä½léí¹ã-øA„‡äS ä”榤#@6áÈÀ<´Æ"Ö#V>éC\ZÉnÁÞõ“‡‚ ,âp€‰¡.ýõj ÿƒE@Y“W±a‡·È…µ5ÿ\2ƒpHÄ!½ÃAŽ |ֺݴmÁÿ#¹¸žÓt‹,×óåý°ÝÕ¸S-f'êLqlw×±¯&ÇD­ÝŸ[)Ùö6—ìø(Ùö6—ìø¨‘ìø¨‘ìúþ‡‘úz¾ÊüÇ1ÒÚ|´G+áXÁÿ°Û­¸À+÷ÔŒ²d7àø®´þ¼<0cþØŠ‰ã,²d·`ïznýùdkÍ` Ïcð¡êÕ«5üƇÓóÒd·à0ýþ©eÉ>í«‘>íÝÎdŸ|ŒÌð1ù ‘‰¢^&Ú‰ ÛW´ån ‡J/.Ûhü•›Žjã€Ï£q,Ë Ö ‰££n ˆ¦RçÀrØ€kŽÅí+j…ý»RÑr™ìÚ80³nI ápËè\ÊfIóqø³(B°zå%«nË› Móñ×í¶(šÕ+üÍݼŽÇçÒ6d›Û­©W×Ë‚íÇÁ»·ø uG9á~¯×«Á±dÿzÎÖ±#G°íD´Ü$¯çö©nÿ«¯×¥ûslwmÐ>¦9`°¶ÎÁ>åi]ûSÏ£Z²1Ž=Û»û·×ˉ2\Çžùèx¾A½œ(Ã…pì™oÙçÔˉ2\Ç®ùøoÖÞ­ÿ¬*Ž£bê±]ñQ/#Ž£b²š–ä£ï^ŽRÇd#>ê=§Š‰Ã1Kêôœ¸€Š¼{q8fIýŸ3úÏÜ­<ùØ–<"3µ‹‹ãcí¢LÏÇÇÚE™$ž*O‘YOˆ¯× òqÙ½X>N\ΗÓä=ü |p¹]—+Ìy¿_ çP®ç=Èûð{ƒãÊõ¶yÿ~_»É¬&ÿ‘ Ÿ"æ“ÅIEND®B`‚geomview-1.9.4/doc/figs/initial.eps0000644000175000001440000102731410616356707014146 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: blah-000.ps %%Creator: pnmtops %%CreationDate: Jun 26 2006 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 62 277 550 514 %%EndComments %%BeginProlog %%BeginPreview: 488 237 8 3081 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000ffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffff00000000000000ff3939393939397f7f7f7f7f7f7f7fbd397f7f % 3939393939393939393939397f7f7f7f7f7f7f7f7f7f7f7f3939393939393939393939397f7f7f7f % 7f7f7f7f7f7f7f7f3939393939393939393939397f7f7f7f7f7f7f7f7f7f7f7f3939393939393939 % 393939397f7f7f7f7f7f7f7f7f7f7f7f3939393939393939393939397f7f7f7f7f7f7f7f7f7f7f7f % 3939393939393939393939397f7f7f7f7f7f7f7f7f7f7f7f3939393939393939393939397f7f7f7f % 7f7f7f7f7f7f7f7f3939393939393939393939397f7f7f7f7f7f7f7f7f7f7f7f3939393939393939 % 393939397f7f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % 7f7f7f7f7f7f7f7f393939bd39393939393939397f7f7f7f7f7f7f7f7f7f7f7f3939393939bd3939 % 393939397f7f7f7f7f7f7f7f7fff00000000000000ff397f7f7f7f7f7f7f7f7f7f7f7f7fbd7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f % 7f7f7f7f7f7f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % 7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f % 7f7f7f7f7f7f7f7f7f7f7f7f7fff00000000000000ff397fbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7f % bdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f % 7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbd % bdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7f % bdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f % 7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbd % bdbdbdbd7f7f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % 7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbd % bdbdbdbd7f7f7f7f7f7f7f7f7fff00000000000000ff397fbd393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % ff393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939397f7fff00000000000000ff397fbd397f7f7f7f7f7f7f7f7f7fbd7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f % 7f7f7f7f397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % ff7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f397f % 7f7f7f7f7f7f7f7f7fbd397f7fff00000000000000ff397fbd397f7f7f7f7f7f7f7f7f7fbd7f7f7f % 7f7f7f7f7f7fffff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fffffffff7f7f7f % 7f7f7f7f7f7f7fffff7f7f7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fff7f7f7f7f7f7f7f % 7f7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f % 7fff7fbd397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % ff7f7f7f7f7f7f7f7f7f7fbd397f7fffffffff7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7fbd397f % 7f7f7f7f7f7f7f7f7fbd397f7fff00000000000000ff397fbd397f7f7f7f7f7f7f7f7f7fbd7f7f7f % 7f7f7f7fff7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fff7fff7f7f7f7f7f % 7f7f7f7f7f7fff7f7f7f7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f % 7fff7fbd397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % ff7f7f7f7f7f7f7f7f7f7fbd397f7f7fff7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7fbd397f % 7f7f7f7f7f7f7fff7fbd397f7fff00000000000000ff397fbd397f7f7f7f7f7f7f7f7f7fbd7f7f7f % 7f7f7f7fff7f7f7f7fff7fff7fff7fff7fff7fff7fff7fffffff7fff7f7f7fff7f7fff7f7f7fff7f % ff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f7f7fff7f7fffff7fff7fffff7fff % 7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f % 7fff7fbd397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % ff7f7f7f7f7f7f7f7f7f7fbd397f7f7fff7f7fffff7fff7f7f7f397f7f7f7f7f7f7f7f7f7fbd397f % 7f7f7f7f7f7f7fff7fbd397f7fff00000000000000ff397fbd397fff7f7f7f7f7f7fff7fbd7f7f7f % 7f7f7fff7f7f7f7f7fffffffff7fff7fff7fffffff7fff7f7fffffff7f7f7fff7fff7f7f7fff7f7f % ff7fff7f7f7fff7f7fff7f7fff7fffffff7fffff7fff7f7fff7f7f7fff7fff7f7fffffff7fff7fff % 7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7fff7f7f7f7f7f397f7f7f7f7f7f7f % 7fff7fbd397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % ff397f7f7f7f7f7f7f7fff7f397f7fff7f7fff7fffff7f7f7fbd397f7f7f7f7fff7f7f7f7f7f397f % 7f7f7f7f7f7f7fff7fbd3939bdff00000000000000ff7f7f7f397f7fffffffffffffff7fbd397f7f % 7f7f7f7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f7f7f7fff7fff7f7f7fff7fff % 7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7fff7f7f7f7fffff7fff7fff7fff7f7fff7f % ff7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7fffff7f7f7f7f7f397f7f7f7f7f7f7f % 7fff7f7f3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % ff397f7fffffffffffffff7f397f7fff7f7fff7f7fff7fff7fbd397f7f7f7fffff7f7f7f7f7f397f % 7f7f7f7f7f7f7fff7fbd3939bdff00000000000000ff7f7f7f397f7f7f7f7f7f7f7f7f7fbd397f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fff7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f % 7fff7f7f3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % ff397f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f7fbd397f7f7f7f7f7f7f7f7f7f7f397f % 7f7f7f7f7f7f7fff7fbd3939bdff00000000000000ff7f7f7f397f7f7f7f7f7f7f7f7f7fbd397f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fff7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f % 7fff7f7f3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % ff397f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f7fbd397f7f7f7f7f7f7f7f7f7f7f397f % 7f7f7f7f7f7f7fff7fbd3939bdff00000000000000ff7f7f7f397f7f7f7f7f7f7f7f7f7fbd397f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f397f7f7fffffffff % ffff7f7f3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % ff397f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f7fbd397f7f7f7f7f7f7f7f7f7f7f397f % 7f7fffffffffffff7fbd3939bdff00000000000000ff7f7f7f397f7fbdbdbdbdbdbdbdbdbdbdbdbd % 7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbd % bdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f % 7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd % 7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbd % bdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7f39bdbdbdbdbdbdbdbdbdbdbd397f7f7f7f7f7f7f % 7f7f7f7f3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % ff7fbdbdbdbdbdbd7f7f7f7f397f7f7f7f7f7f7fbdbdbdbdbdbd39bdbdbdbdbd7f7f7f7f7f7f397f % 7f7f7f7fbdbdbdbdbdbd3939bdff00000000000000ffbdbd7fffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffff39bdbdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000bdbdbd % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffff39bdbdff00000000000000ff397f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab393939ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020209b393939ff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd2050202020202020202020202020202020202020209b5050505050502020202020202020202020 % 202020202020209b509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd2050205050505050505050505050505050505050509b5050505050502050505050505050505050 % 505050505050509b509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd2050205050505050505050505050505050505050509b5050505050502050505050505050505050 % 505050505050509b509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050205050505050505050505050505050505050509b5050505050502050505050505050505050 % 505050505050509b509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050205050505050505050505050505050505050509b5050505050502050505050505050505050 % 505050505050509b509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205020505050ff5050ff50505050505050505050509b5050505050502050505050505050505050 % 505050505050509b509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050205050505050ffff50505050ff50ff505050509b5050505050502050505050ff50505050ff % 50ff5050ff50509b509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205020505050505050ff50ffff50ff5050505050509b5050505050502050505050ff50505050ff % 50ff50ffff50509b509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd20502050505050ff50ff50505050ff5050505050509b50505050505020505050505050505050ff % 50ff5050ff50509b509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050205050505050505050505050505050505050509b5050505050502050505050505050505050 % 505050505050509b509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050205050505050505050505050505050505050509b5050505050502050505050505050505050 % 505050505050509b509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050205050505050505050505050505050505050509b5050505050502050505050505050505050 % 505050505050509b509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050205050505050505050505050505050505050509b5050505050502050505050505050505050 % 505050505050509b509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050205050505050505050505050505050505050509b5050505050502050505050505050505050 % 505050505050509b509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050505050209b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050ff5050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050ff5050ff50ff50ff50505050ff5050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd20505050505050505050505050505050505050ff50ff50ff50ff50ffff50ff5050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050ff5050ff50ff50ff50505050ff5050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd20505050505050505050505050505050505050505050505050ff50505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050ff5050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff3939393939393939393939393939bd393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 3939393939393939393939393939bd393939393939393939393939393939ff0000000000003939bd % bd20509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b50509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff397f7f7f7f7f7f7f7f7f7f7f7f7fbd7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f7f7fbdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050502050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7f % bdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f % 7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbd % bdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7f % bdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbd7f39bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050502050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 3939393939393939393939393939393939393939393939393939393939bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050502050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd7f7f7f7f7f7f7f7f7f7f7fbd7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f397f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7fbd3939bdff000000000000397f7f % bd20509b50505050ff50ff505050505050ff5050ff50505050505050505050505050505050505050 % 5050505050502050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd7f7f7f7f7f7f7f7f7f7f7fbd7f7f7f7f7f7f7f7f7fffff7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fffffffff7fff7f7f7f7f7f7f7f7f7f7f % ffff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fffff7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7fbd397f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7fbd3939bdff000000000000397f7f % bd20509b505050ffff505050505050ff50ff5050ff50505050505050505050505050505050505050 % 5050505050502050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd7f7f7f7f7f7f7f7f7f7f7fbd7f7f7f7f7f7f7fff7f7f7fff7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fff7fff7f7f7f7f7f7f7f7f7f7fff % 7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fff7f7f7f7f7f7f7f7f7f7fff7f7fff7f7f7f7f % 7f7f7f7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7fbd397f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7fff7fbd3939bdff000000000000397f7f % bd20509b505050ff50505050505050ff50ff5050ff50505050505050505050505050505050505050 % 5050505050502050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd7f7f7f7f7f7f7f7f7f7f7fbd7f7f7f7f7f7f7fff7f7f7f7fff7fff7fff7fff7fff7fff7f % 7fff7f7fffff7fff7fff7fffff7fff7f7f7f7f7f7f7f7f7f7fff7f7fffffffff7fff7fff7f7fff7f % 7f7f7f7fff7fff7f7fff7fffffffffff7fff7fff7fff7fffffffff7fff7f7f7f7f7f7f7f7fff7fff % 7fff7fff7fff7fff7fff7fffffff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7fbd397f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7fff7fbd3939bdff000000000000397f7f % bd20509b5050505050ff5050505050ff50ff5050ff50505050505050505050505050505050505050 % 5050505050502050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd7f7f7f7f7f7f7f7f7fff7fbd7f7f7f7f7f7fff7f7f7fff7fffff7fff7f7fffff7fff7fff % 7fff7fff7fff7fffffff7fffff7fff7f7f7fffffff7f7f7f7fff7f7fff7fff7fffffff7f7f7fff7f % 7fff7fffffff7fff7fff7fff7fff7fff7fffffffff7f7fff7f7fff7fff7f7fff7f7f7f7fffffff7f % ff7f7fffff7f7fffffff7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7fbd397f7f7f7f7fff7f7f7f7f7f397f7f7f7f7f7f7f7fff7fbd3939bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050502050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd7f7fffffffffffffffff7fbd7f7f7f7f7f7fff7f7fff7fff7f7f7fff7fff7fff7fff7fff % 7fffff7f7fffff7f7f7f7fff7fff7f7f7f7f7f7f7f7f7f7f7fff7f7fff7fff7fff7f7f7f7f7fff7f % 7fff7fff7f7f7fff7fff7fff7fff7fffff7f7f7fff7f7fff7f7fffff7f7f7fff7f7fff7fff7f7f7f % ff7f7fffff7fff7f7f7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7fbd397f7f7f7fffff7f7f7f7f7f397f7f7f7f7f7f7f7fff7fbd3939bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050502050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd7f7f7f7f7f7f7f7f7f7f7fbd7f7f7f7f7f7f7fffff7f7f7fff7f7fffff7f7fff7fff7fff % 7fff7f7fff7f7fffff7f7fff7fff7f7f7f7f7f7f7f7f7f7fff7f7fff7f7fff7fffff7f7f7f7f7fff % ffff7fffff7f7fffff7fff7fff7fff7f7fffff7fff7fff7f7f7fff7f7f7f7f7fffff7f7fffff7f7f % ff7fff7fff7f7fffff7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7fbd397f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7fff7fbd3939bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050502050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd7f7f7f7f7f7f7f7f7f7f7fbd7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fff7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7fbd397f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7fff7fbd3939bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050502050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd7f7f7f7f7f7f7f7f7f7f7fbd7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7fbd397f7f7f7f7f7f7f7f7f7f7f397f7fffffffffffffff7fbd3939bdff000000000000397f7f % bd205020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffabababababababababababababababababababababababababababab % abababab397f7fff % ff7f7f7f7fbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd % 7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbd % bdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f % 7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd % 7f7f7f397f7f7f7f7f7f7f7fbdbdbd39bdbdbdbdbdbdbdbd7f7fbd397f7fff0000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ffbdbd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffff39bdbdff0000000000003939bd % bd205050505050505050505050505050ffff50505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff397f7f202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020209b397f39ff0000000000003939bd % bd20505050505050505050505050505050505050ff50ffff50ffff50ffff50ff5050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050505050505050505050505050505050ff5050ff50ff505050505050ff5050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffffababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050505050505050505050505050505050ff5050ff50ff505050505050ff5050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabffabababffabababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abffabababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050505050505050505050505050ffff5050ff50ff50ff50ff50ffff50ff5050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababffabababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ffabababffababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababffabababffabababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababc7c7c7abababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababff % abababffabababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050505050ffffff505050505050505050505050505050ffffff5050505050ff5050 % 505050505050505050505050505050505050505050505050505050505050505050505050505050ff % 505050505050505050505050505050505050505050505050ff50505050ff505050505050ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababffabababffababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7ababababababababababababababababababab % ababababababababababababababababababababababababababababababababababababababffab % ababffababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050ff5050505050505050505050 % 505050505050505050505050505050505050505050505050ff50505050ff50505050ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd20509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababffabababffabababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababababababababababab % abababababababababababababababababababababababababababababababababababababffabab % abffabababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050505050505050505050ff50ff50505050505050505050505050ff50ff50ff5050 % 50505050505050505050ff50ff50505050ff50ff50ff50ff50ff50ffff505050505050505050ff50 % 5050ff50ff50ff50ff50ff50ffff50ff5050505050505050ffff5050ffff50ffff50ff50ff50ff50 % ff50ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababababababababffababababababab % abababababababababababababababababababababababababababababababababababababababab % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababababababab % ababababababababababababababababababababababababababababababababababababffababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050505050505050505050ffffff50505050505050505050505050ff505050ff5050 % 50505050505050505050ff50ff50ffff50ff505050ffffff50505050ff5050505050505050505050 % ff50ff50505050ffff50505050ffffff5050505050505050ff50505050ff50505050ff50ff505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababababababababababababababababababababababababababababababc7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababab % abababababababababababababababababababababababababababababababababababffabababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050505050505050505050ff505050505050505050505050505050ff505050ff5050 % 50505050505050505050ff50ff50505050ff505050ff5050505050ffff5050505050505050505050 % 5050ff505050ff50ff505050ffff50505050505050505050ff50ffff50ff50505050ff50ff505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababababababababababababababababababababababababababc7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abab % ababababababababababababababababababababababababababababababababababffababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050ff50505050505050505050505050505050505050505050 % 5050ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd20509b50505050505050505050505050505050ff50505050505050505050505050505050505050 % 5050505050505020509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababababababababababababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7abababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050ff50505050505050505050505050505050505050505050 % 5050ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd20509b5050ffff50ff50505050ff505050ff50ff50505050505050505050505050505050505050 % 5050505050505020509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababababababababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7abababababababababababababababababababababababababababffabababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd20509b505050505050ff505050505050ff50ffff50505050505050505050505050505050505050 % 5050505050505020509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababababababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7ababababababababababababababababababababababffababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd20509b50505050ff50ff505050505050ff5050ff50505050505050505050505050505050505050 % 5050505050505020509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababff % abababababababababababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7abababababababababababababababababffabababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd20509b505050ff50ff50505050ff505050ff50ff50505050505050505050505050505050505050 % 5050505050505020509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ffabababababababababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7abababababababababababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b3939bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abffababababababababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababababababababababffabababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020202020202020202020202020202020202020203939bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababff % ababffababababababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababababababababffababffabababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababffababababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababababababffabababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababffabababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababababababababffababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050202020202020202020202020202020202020202050509b3939bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababffffffffffffffc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ffffffffffffffffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd20509b505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff7f7f7f205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd20509b202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababababffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b50505050505050505050505050505050505050505050505050505050505050 % 5050505020505050505050505050505050505050505050ffffffffff505050505050505050505050 % 505050505050505050505050505050505050505050ffff5050505050505050505050505050505050 % 5050505050ffff50505050505050ffff505050505050505050ff5050505050505050505050505050 % 5050505020505050505050ffff505050ff5050505050505050509b397f7fff0000000000003939bd % bd205050202020202020202020202020202020202020202050502020202020202020202020202020 % 2020202020205050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050ffff505050ffff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050ffff505050505050ffff50ff50505050505050ffff5050505050505050505050505050 % 5050505020505050505050ffff50ffffff50ffff5050505050509b397f7fff0000000000003939bd % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050ffff505050505050505050ffff50505050ff % ff50505050ff50ff50ffffff5050ffff505050ff50ffff505050ffff505050ff5050ffff5050ffff % 50505050ffffff5050505050ffff5050ffff5050505050ffffff5050505050505050505050505050 % 5050505020505050ffffffffff505050ff505050ff50505050509b397f7fff0000000000003939bd % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b505050ff505050505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050ff5050505050505050ffff50ffff5050ffff % 50ffff5050ffff50ffff50ffff50ffff505050ff50ffff5050ffff50ffff50ff5050ffff5050ff50 % 5050505050ffff5050505050ffff5050505050505050505050ff5050505050505050505050505050 % 5050505020505050505050ffff505050ff5050505050505050509b397f7fff0000000000003939bd % bd205050205050e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3509b50502050000000000000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b505050ff50ffff505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050ff505050ffffffff50ff505050ff50ffff50 % 5050ff5050ff5050ff5050ffff5050ff5050ffff50ffff50ffff505050ff50ff5050ffff5050ff50 % 5050505050ffff5050505050ffffffffff5050505050505050ff5050505050505050505050505050 % 5050505020505050505050ffff50ff50ff50ff50ff50505050509b397f7fff0000000000003939bd % bd205050205050e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3509b50502050000000e30000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b505050ff50ff50505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050ff5050505050ffff50ffffffffff50ffff50 % 5050ff5050ff5050ff5050ffff5050ffff50ff5050ffff50ffffffffffff505050ffffffff50ff50 % 5050505050ffff5050505050ffff5050ff5050505050505050ff5050505050505050505050505050 % 50505050205050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050205050e3e3e3e30000e3e3e3e3e3e3e3e3e3509b505020500000e3e30000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b505050ff50ff50505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050ffff50505050ffff50ff5050505050ffff50 % 5050ff5050ff5050ff5050ffff5050ffff50ff5050ffff50ffff505050505050ffff5050ffff5050 % 5050505050ffff5050505050ffff5050ffff50505050505050ff5050505050505050505050505050 % 50505050205050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050205050e3e3e3000000e3e3e3e3e3e3e3e3e3509b50502050000000e3e300000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b505050ff50ff50505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050ffff505050ffffff50ffff5050ff5050ff50 % 50ffff5050ff5050ff5050ffff505050ffffff5050ffff5050ff505050ff5050ffff5050ffff5050 % 5050505050ffff505050505050ff5050ff5050505050505050ff5050505050505050505050505050 % 50505050205050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050205050e3e3e3000000e3e3e3e3e3e3e3e3e3509b50502050000000e30000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b505050ff505050505050505050505050505050505050505050505050505050 % 5050505020505050505050505050505050505050505050ffffffffffffff5050ffffffff5050ffff % ffff505050ff5050ff5050ffff505050ffff505050ffff5050ffffffffff5050ffff5050ffff5050 % 5050505050ffff505050ff5050ffffffff5050ffff50505050ff5050505050505050505050505050 % 50505050205050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050205050e3e3e3e3e3e3e3e3e3e3e3e3e300e3509b50502050000000e30000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b505050ffff5050ff5050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50509b397f7fff0000000000003939bd % bd205050205050e3e3e3e3e3e3e3e3e3e3e3e30000e3509b50502050000000e30000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050205050e3e3e3e3e3e3e3e3e3e3e3e30000e3509b50502050000000e30000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff397fbd205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd205050205050e3e3e3e3e3e3e3e3e3e3e30000e3e3509b50502050000000e30000000000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd20505020505000e3e3e3e3e3e3e3e3e30000e3e3e3509b50502050000000e30000000000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd205050205050000000e3e3e3e3e3000000e3e3e3e3509b50502050000000e30000000000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505050205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd205050205050e3000000000000000000e3e3e3e3e3509b50502050000000e30000000000000000 % e3000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abc7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050509b20202020202020202020202020202020202020202020202020202020202020 % 20202020205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd205050205050e3e3e30000000000e3e3e3e3e3e3e3509b50502050000000e3e3e3e3e3e3e3e3e3 % e3e3e300509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd205050205050e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3509b50502050000000e3e3e3e3e3e3e3e3e3 % e3e3e300509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababc7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd205050205050e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3509b50502050000000000000000000000000 % e3000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababababc7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd205050205050e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3509b50502050000000000000000000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababababc7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c78ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050509b20202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020209b9b20202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020205050509b3939bdff000000000000397f7f % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababc7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b9b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050205050509b3939bdff000000000000397f7f % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababc7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b9b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd205050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050209b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababc7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd205050509b50505050505050505050505050505050505050505050505050505050ff5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b9b5050505050505050505050505050505050505050ff50 % 50505050505050505050505050505050505050505050505050ff505050ff50505050505050ff5050 % 50505050505050505050505050505050505050505050505050509b3939bdff000000000000397f7f % bd20505050ff5050ff50505050ff50505050505050505050505050505050ff505050505050505050 % 5050505050505050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababc7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff7f7f7f205050509b50505050505050505050505050505050505050505050505050505050ff5050 % ff50ff50ff50ff50ff50ff50ff505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b9b5050505050505050505050505050505050505050ff50 % 50505050ff505050ff50ff50ff50ff50ff50ff50ff50505050505050ffff50ff50ff50ff50ff5050 % 505050ff50ff50ff50ff505050505050505050505050505050509b397f7fff0000000000003939bd % bd20505050ff5050ff50505050ff505050ff5050ff50ff50505050505050ff5050ff505050ff5050 % 5050ff5050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababc7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b50505050505050505050505050505050505050505050505050505050ff5050 % ffffff505050ff505050ffffff505050ffff50505050505050505050505050505050505050505050 % 505050505050505050505050505050509b9b5050505050505050505050505050505050505050ff50 % 5050505050505050ffffff505050ff50ff50ffffff5050505050ff5050ff505050ff505050ff5050 % 505050ffffff5050ff50505050505050505050505050505050509b397f7fff0000000000003939bd % bd20505050ff5050ff50505050ff50ff50ff5050ff505050505050505050ff5050ff50ff50ff5050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababababababababababc7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b50505050505050505050505050505050505050505050505050505050ff5050 % 5050ff505050ff505050ff5050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b9b5050505050505050505050505050505050505050ff50 % 505050ff50505050505050505050ff50ff505050ff5050505050505050ff505050ff505050ff5050 % 505050ff5050505050ff505050505050505050505050505050509b397f7fff0000000000003939bd % bd20505050ff5050ff50ffff50ff5050ff5050ff50ff5050505050505050ff5050ff5050ff505050 % 505050ff50505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababc7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b50505050505050505050505050505050505050505050505050505050ff5050 % ffffff50505050ff505050ff5050ff50ffff50505050505050505050505050505050505050505050 % 505050505050505050505050505050509b9b5050505050505050505050505050505050505050ffff % ffffff50ff50ff50ffff50505050ff50ff50ffffff505050505050ff50ff50ffff5050ffffff50ff % 50505050ffff5050ff50505050505050505050505050505050509b397f7fff0000000000003939bd % bd20505050ff5050ff50505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababc7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b50505050505050505050505050505050505050505050505050505050505050 % 505050505050ff50ff50505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b9b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababc7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7abababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b9b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050205050509b397f7fff0000000000003939bd % bd205050202020202020202020202020202020202020202050502020202020202020202020202020 % 2020202020205050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababc9c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7 % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7daabababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b205050509b397f7fff0000000000003939bd % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababc9c9c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadaabababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababababababababababc9c9c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadaabababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050205050000000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababababababababababc9c9c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadadaabababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd20505020505000000000000000e3e3e3e3e3e3e300509b50502050000000000000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababababababababababc9c9c9c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadadaababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b205050509b397f7fff0000000000003939bd % bd2050502050500000000000e300e30000000000e300509b5050205000000000000000e300000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababababababababababc9c9c9c9c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadadadaababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b50509b9b9b9b9b9b9b9b205050509b397f7fff0000000000003939bd % bd20505020505000000000000000e30000000000e300509b50502050000000000000e3e3e3000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababc9c9c9c9c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadadadadaababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff397fbd20505050209bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff20209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a209b6a6a20205050509b3939bdff000000000000397f7f % bd20505020505000000000000000e30000e30000e300509b5050205000000000000000e300000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababc9c9c9c9c9 % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadadadadadaababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b50ffffffffffffff50ff50ffff50ffff50ffffffffffffffffff50ffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff20209bff50ff505050ff505050505050ff50ff505050505050 % 50505050505050505050ff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a209b6a6a20205050509b3939bdff000000000000397f7f % bd20505020505000000000000000e30000000000e300509b5050205000000000000000e300000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababc9c9c9c9c9 % c9c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadadadadadaabababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b50ffff50ffffffff50ff50ffffffffffffff50ff5050ffffff5050ff5050 % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff20209b5050ff50505050ff5050505050ff505050ffffff5050 % ffff50ffff5050ffff50ffffff5050ff50ffff505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a2050509b6a20205050509b3939bdff000000000000397f7f % bd2050502050500000e300000000e3e300000000e300509b5050205000000000000000e300000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababc9c9c9c9c9 % c9c9c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadadadadadadaabababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b50ff50ffffffffff50ff50ffffffffffffff50ffffff50ffffff50ffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff20209b50ff5050505050ff505050505050ff5050ff50505050 % 505050ff50ff50ff5050ff505050ff50ff5050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a2050509b6a20205050509b3939bdff000000000000397f7f % bd20505020505000000000000000e3e3e3e3e3e3e300509b50502050000000000000e3e3e3000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababc9c9c9c9 % c9c9c9c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadadadadadadadaabababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b50ff50ffffffffff50ff50ffffff5050ff50ffffffff50ffffff50ffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff20209b5050ff50505050ff505050505050505050ff505050ff % 505050ff50ff5050ff50ff505050ff50ff5050505050505050505050505050505050505050505050 % 50505050505050505050505050509b209b9b9b9b9b20205050509b3939bdff000000000000397f7f % bd205050205050000000000000e30000000000000000509b50502050000000000000e3e3e3000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababc9c9c9c9 % c9c9c9c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadadadadadadadaabababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b50ff50ff50ffffff50ff50ffffffffffffffffff50ff50ffffff50ff50ff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff20209bff50ff505050ff505050505050ff50ff50ff505050ff % 50ff50ff50ff50505050ff505050ff50ff5050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd20505020505000e3e3e3e3e3000000000000000000509b50502050000000000000e3e3e3000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababc9c9c9c9 % c9c9c9c9c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadadadadadadadaababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b50ffffffffffffffffff50ffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff20209b50505050505050505050505050505050505050505050 % 505050ff505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b20202020209b20205050509b3939bdff000000000000397f7f % bd2050502050500000000000e30000000000e3000000509b505020500000000000e3e3e3e3e30000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababc9c9c9c9 % c9c9c9c9c9c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7dadadadadadadadadaababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b5050ff5050ffffffff5050ffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffff20209b50505050505050505050505050505050505050505050 % 505050ff505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b20505050509b20205050509b3939bdff000000000000397f7f % bd2050502050500000000000e3000000000000000000509b5050205000000000e3e3e3e3e3e3e300 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababc9c9c9c9 % c9c9c9c9c9c9c7c7c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7c7dadadadadadadadadadaababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b20505050509b20205050509b3939bdff000000000000397f7f % bd2050502050500000000000e30000e3000000000000509b5050205000000000e3e3e3e3e3e3e3e3 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababc9c9c9c9 % c9c9c9c9c9c9c9c7c7c7c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7c7c7dadadadadadadadadadaababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209bff5050505050ffff5050ff5050505050505050ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b5050ff505050ff5050505050ff505050505050505050 % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b20505050509b20205050509b3939bdff000000000000397f7f % bd2050502050500000000000e3000000000000000000509b50502050000000e3e3e3e3e3e3e3e3e3 % e3000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababc9c9c9 % c9c9c9c9c9c9c9c9c7c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7c7c7dadadadadadadadadadaabababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209bff5050ff505050ff5050ff5050ffff50ffff50ff50ffff50ffff50505050 % ff50ffffffff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50ffff50505050ff50505050ff5050ffff50ffff5050 % ffff50ff505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b20505050509b20205050509b3939bdff000000000000397f7f % bd20505020505000e3e3e3e3e3000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababc9c9c9 % c9c9c9c9c9c9c9c9c7c7c7c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7c7c7c7dadadadadadadadadadadaabababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209bff50ff50505050ff5050ff5050505050505050ff50ff50505050ff5050ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bff50ff50505050ff50505050ff50505050ff50505050 % 50ff50ff505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b20505050509b20205050509b3939bdff000000000000397f7f % bd205050205050000000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababc9c9c9 % c9c9c9c9c9c9c9c9c9c7c7c7c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7c7c7c7dadadadadadadadadadadadaabababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff7f7f7f20505050209bff50ff50505050ff5050ff5050505050505050ff50ff50505050ff5050ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b5050ff505050505050505050ff505050505050505050 % 50ff5050ff5050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b209b9b9b9b9b20205050509b397f7fff0000000000003939bd % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababababababababababababababc9c9 % c9c9c9c9c9c9c9c9c9c9c7c78a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8ac7c7dadadadadadadadadadadadaababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209bff5050ff505050ff5050ff505050ff50ffff5050ffff5050ffffff505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b5050ff50ffff505050505050ff5050ffff5050ff5050 % 50ff50ff505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababababababababababababababc9c9 % c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadaababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209bff50ff50ff5050505050ff50505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50509b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababababababababababababababc9c9 % c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadaababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd2050505050ff505050ff505050505050505050505050505050505050505050ff50ffff50505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababababababababababababababc9c9 % c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadadaababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209bffff50505050ffff50ffff50505050505050505050505050505050505050 % 505050505050505050505050ff50ff50505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b5050ff50ffff5050ff505050ffff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd2050505050ff50ff50ff50ffff5050ff505050ffff50505050505050505050ffffffff5050ff50 % ff50505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababc9 % c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadaabababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209bff50505050505050ff50ff50505050505050505050505050505050505050 % 50505050505050505050505050ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b5050ff50505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd2050505050ff505050ff505050505050ff5050505050505050505050505050ff5050ff5050ff50 % ff50505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababc9 % c9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadadaabababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209bff50ff50ff5050505050ff505050ff50ff5050ff50ff50ff50ff50ff50ff % 50ff50ff50ff5050ff50ff5050ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b5050ff50505050ff50ff50ff50ffff50ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd2050505050ff505050ff50505050ff50ff5050505050505050505050505050ff5050ff50505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababc9 % c9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadadaabababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209bff50ff50505050505050ff5050505050ff50505050ff505050ff505050ff % ffff5050505050505050ff5050ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bff50ff50505050ff50ff50ff50ffffffff50ff5050ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd2050505050ff50ff50ff50ffff5050ff505050ffff50505050505050505050ff5050ff505050ff % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababc9 % c9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadadaabababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209bff50ff50505050505050ff5050505050ff50505050ff505050ff505050ff % 5050505050ff50505050ff5050ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b5050ff50505050505050505050ffff505050ffffffff % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd2050505050ff505050ff505050505050505050505050505050505050505050ff5050ff50505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % c9c9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadadaababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209bff5050ff5050ffffff50ff5050505050ff50ff505050ffff5050ff505050 % ff5050ffff50ff50ffff505050ff5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b5050ff50ffff50505050ff5050ff50ffff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % c9c9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadadaababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209bff50ff50ff5050505050ff50505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abc9c9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadadaabababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abc9c9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadadaabababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff397fbd20505050209bff50505050505050505050505050ff50ff50505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bff50ff505050ff50505050ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababc9c9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8ade8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadadaababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209bff5050ffff5050505050505050ff50505050ffff505050ff50ff5050ffff % 5050ff50ffff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bff505050505050ff50ffffff50ffff50ffff50ff5050 % ffff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050000000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababc9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8adede8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadaabababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209bff50ff50505050505050505050ff505050505050ff505050505050ff5050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bff50ff50505050ff505050ff50505050ff50ff50ff50 % 5050ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050e30000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababc9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8adedede8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadaabababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209bff50ff50505050505050505050ff50505050ff50ff505050505050ff5050 % 505050ff505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bff50ff50505050ff505050ff50505050ff50ff50ff50 % 5050ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050e30000000000000000000000000000509b5050205000000000e3e3000000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababc9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8adedededede8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadaababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209bff50ff50ff505050505050505050ff50ff50ff50ff505050505050ff50ff % 505050ff50ff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bff50ff505050ff5050ff50ff50ffff50ff50ff50ff50 % ff50ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050e30000000000000000e3e3e3000000509b5050205000000000e3e3e30000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababc9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8adedededededede8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadaababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209bff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050e3000000000000e3e3e30000000000509b5050205000000000e3e3e30000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababc9c9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8adedeccccccdede8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadaabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209bffff50505050505050ff5050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050e300000000e3e3e300000000000000509b50502050000000000000000000000000 % 00e30000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababc9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8acccccccccccccccccc8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadadaabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050e30000e3e3e300e300000000000000509b5050205000000000e300e300000000e3 % e3e30000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababc9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadaffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50ff5050505050505050505050505050ff5050505050 % 5050505050505050505050ff50505050505050505050ff5050ff5050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050e300e3e3000000e300000000000000509b5050205000000000e300e3e300000000 % e3e30000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababc9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadaffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50ff505050ff505050ff505050505050505050ffff50 % ff505050ffff5050ff5050ff5050ff5050ff50505050ff5050ff50ffff50ff50ff50505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050e300e300000000e300000000000000509b50502050000000e3e300e3e3000000e3 % e3000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababc9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadaabffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b5050ff50ff505050ff5050505050ffff5050ff505050 % ff505050505050ff505050ff505050ffff5050505050ffffff505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050e300e3e3e30000e300000000000000509b50502050000000e300000000e300e3e3 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababc9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8adadadadadadadadadadadadaabffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bffffff50ff505050ff505050505050505050ff505050 % ff505050505050ff505050ff505050ffff5050505050ff5050ff5050505050ff5050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050e3000000e3e3e30000000000000000509b505020500000e3e300000000e3e3e300 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababc9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8adadadadadadadadadadadadaababffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b505050ff50ff505050ff50505050ffffff5050ffff50 % 50ff505050505050ff5050ff505050ff50ff50505050ffffff5050ffff50ff50ff50505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050205050e3000000000000e3e3e30000000000509b505020500000e3e3e3e3e3e3e3000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababc9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8adadadadadadadadadadadaabababffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050ff50ff505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050205050e30000000000000000e3e3e3000000509b50502050000000e3e3e3e30000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababc9c9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8adadadadadadadadadadadadaabababffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050205050e30000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababdedec9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8adadadadadadadadadadadadedeababffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050ff5050505050505050505050505050505050 % 50ff50505050505050ff5050505050505050ff505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050205050e30000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababdedec9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8adadadadadadadadadadadadedeababffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50ff5050ff5050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050205050000000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababababdededec9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8adadadadadadadadadadadadedededeabffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b5050ff50ff50ff50ff50ff50ff5050ff50ff50ff50ff % 50ff50ffff505050ff505050ff50505050505050ff50ff50ff50ffff50ff50505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababdedededec9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8adadadadadadadadadadadadedededeabffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bff505050ff505050ff50ffffff50505050505050ffff % 50ff5050505050505050ff50ff50505050505050ffffff50505050ffffff50ffff50505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50509b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababdededededec9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8adadadadadadadadadadadadedededededeffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bff505050ff505050ff50505050505050505050ff5050 % 50ff50505050505050505050ff505050505050505050ff505050ffff505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababababdedededededec9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8adadadadadadadadadadadadedededededeffabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b505050ffff50ffffff50ffff5050ffff50505050ff50 % ffff50ffff50505050ff505050ff505050505050ffffff50ffff5050ff5050ffff50505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababdedededededededec9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8adadadadadadadadadadadedededededededeabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b505050505050ff50ff50505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd2050505050ff505050ff505050505050505050505050505050505050ff50505050505050ff5050 % 5050ff5050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababdedededededededec9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8adadadadadadadadadadadadedededededededeabababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd2050505050ff505050ff50505050ff50ff50ffffff50505050505050ff5050ff5050ff50ff50ff % 5050ff5050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababdedededededededededec9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8adadadadadadadadadadadedededededededededeababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b5050505050505050ff50505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd2050505050ff505050ff50505050ff50ff505050ff50505050505050ff5050ff5050ff50ff50ff % 5050ff5050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababababdededededededededeccc9c9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8adadadadadadadadadadadaccdededededededededeababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50ff5050ffffff50ff5050ff50ff50ffff50ffff50ff % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd2050505050ff50ff50ff50ffff5050ff50505050ff50505050505050ff50ff505050ff50ffff50 % 5050ff5050505050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababdededededededeccccccccccc9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8adadadadadadadadadadaccccccccccdededededededeabababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b5050ff50ff505050ff5050505050505050ff50505050 % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd2050505050ff505050ff505050505050505050505050505050505050ff50505050505050505050 % 5050505050505050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababdedededededeccccccccccccccccc9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8adadadadadadadadadadaccccccccccccccccdedededededeababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bffffff50ff505050ff505050505050ff50ff50505050 % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ababdedededeccccccccccccccccccccc9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8adadadadadadadadadadaccccccccccccccccccccdedededeababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b505050ffff505050ff505050505050ff50ff505050ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050202020202020202020202020202020202020202050502020202020202020202020202020 % 2020202020205050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abdededeccccccccccccccccccccccccccc9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8adadadadadadadadadaccccccccccccccccccccccccccdededeabababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abdeccccccccccccccccccccccccccccccc9c9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8adadadadadadadadadadaccccccccccccccccccccccccccccccdeabababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % ffffffffffffffffffffffffffffffffffffc9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8a8adadadadadadadadadadaffffffffffffffffffffffffffffffffffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050000000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababababffab % abababababababababababababababababababc9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8adadadadadadadadadadaabababababababababababababababababababffababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50ff50ff505050505050ff5050505050505050505050 % 50505050ff5050505050ff5050505050505050505050505050ff5050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd205050205050000000b3b3b3b3b3b3b3b300000000509b50502050000000000000b3b3b3000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababababffabab % abababababababababababababababababababc9c9c9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8adadadadadadadadadaabababababababababababababababababababababffabababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bff50505050ffff505050ff505050505050ffff50ffff % 50505050ff50505050ffff5050ffff5050ff50ff5050ffff50ff5050ff5050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd2050502050500000b3b3b3b3b3b3b3b3b3b3000000509b5050205000000000000000b300000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababababffababab % abababababababababababababababababababababc9c9c9c9c9c9c98a8a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % 8adadadadadadadaababababababababababababababababababababababababffababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff397fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bff505050505050ff5050ff505050505050505050ff50 % 505050ff5050505050ffff50ff505050505050505050505050ff505050ff50505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd20505020505000b3b3b3b3b3b3b3b3b3b3b3b30000509b50502050000000000000b3b3b3000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababababffababffab % abababababababababababababababababababababababababc9c9c9c98a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % dadadadaababababababababababababababababababababababababababffababffabababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ffbd7fbd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209bff505050505050505050ff5050505050ff505050ff50 % 505050ffffff505050ffff50ff5050505050505050ff505050ff50ff50ff50505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b3939bdff000000000000397f7f % bd20505020505000b3b3b3b3b3b3b3b3b3b3b3b3b300509b5050205000000000000000b300000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffababababababababababababffababffabab % ababababababababababababababababababababababababababababc98a8a8a8a8a8a8a8a8a8a8a % 8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a % daababababababababababababababababababababababababababababababffabababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff3939bd20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50ff50ff50ff50ff5050ff50ff505050ff50ff50ff50 % 5050ff50505050ff50ffff50ff50ff505050505050ff50ff50ff50ff50ff50505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b393939ff000000000000397f7f % bd205050205050b30000b3000000b30000b30000b300509b505020500000000000b300b300b30000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababffabababababababababababffababffababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababababababffababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a2050509b6a20205050509b397f7fff0000000000003939bd % bd205050205050b300b3b3b300b3b300b30000b30000509b5050205000b30000000000b300000000 % 0000b300509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababffabababffabababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababffabab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a2050509b6a20205050509b397f7fff0000000000003939bd % bd205050205050b3b300b3b300b3b300b3000000b300509b5050205000b3000000b300b300b30000 % b300b300509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababababababffabababffababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababababababababababababababababababababababababababababababababababababffab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a209b6a6a20205050509b397f7fff0000000000003939bd % bd205050205050b3b3b300b300b3b300b30000b3b300509b5050205000b3000000b300b300b30000 % b300b300509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababffabababffabababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababff % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a209b6a6a20205050509b397f7fff0000000000003939bd % bd205050205050b30000b3b300b3b30000b300b3b300509b5050205000b30000000000b300000000 % 0000b300509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababababffababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ffababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f20505050209b505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505020209b50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b6a6a6a6a6a6a20205050509b397f7fff0000000000003939bd % bd205050205050b3b3b3b3b3b3b3b3b3b3b3b3b3b300509b5050205000000000b30000b30000b300 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050502020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202050509b20202020202020205050509b397f7fff0000000000003939bd % bd20505020505000b3b3b3b3b3b3b3b3b3b3b3b3b300509b50502050000000000000b3b3b3000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050502020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020205050509b397f7fff0000000000003939bd % bd20505020505000b3b3b3b3b3b3b3b3b3b3b3b30000509b5050205000000000000000b300000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd2050502050500000b3b3b3b3b3b3b3b3b3b3000000509b5050205000000000000000b300000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababffabababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050205050000000b3b3b3b3b3b3b3b300000000509b50502050000000000000b3b3b3000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffababababffababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababffabababffababababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050509b397f7fff0000000000003939bd % bd205050205050000000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababffabababffabababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababffabababffabababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b397f7fff0000000000003939bd % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % ababababababababababababababababababababffffababffababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % ababababffabababffababababababababababababababababababababababababababababababab % abababab3939bdff % ff7f7f7f393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 393939393939393939393939393939393939393939393939393939397f7fff0000000000003939bd % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababffabffabababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababffabababffabababababababababababababababababababababababababababababab % abababab3939bdff % ff397f7f7f7f7f7f7f7f7f7f7f7f7fbd7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f7f7fbdff000000000000397f7f % bd205050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50509b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababffabababffffababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababffabababababababababababababababababababababababababababab % abababab397f7fff % ffbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbd % bdbdbdbdbdbdbdbdbdbdbdbdbdbdbd39bdbdbdbdbdbdbdbdbdbdbdbdbdbdff000000000000397f7f % bd205050505050505050505050ff50505050ff505050505050505050ffff5050ff50505050505050 % 5050505050505050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050505050505050505050ff50ffff50ffff505050505050505050ff5050ff50ffff5050ff50 % 5050ff5050505050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050505050505050ffffff50ff50505050ff50505050505050505050ff5050ff50505050ff50ff % 50ff505050505050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050505050505050505050ff50505050ff50505050505050505050ff5050ff50505050ff50ff % 5050505050505050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050505050505050505050ff50ffffffff50505050505050505050ffffffff50ffff5050ff50 % 5050505050505050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050505050505050505050ff505050505050505050505050505050505050ff50505050505050 % 5050505050505050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050202020202020202020202020202020202020202050502020202020202020202020202020 % 2020202020205050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050205050000000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050205050000000000000000000000000000000509b5050205000b30000000000b300000000 % 0000b300509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd2050502050500000b3b30000000000000000000000509b50502050000000b30000b3b300b300b3 % b3000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd2050502050500000b3b30000000000000000000000509b50502050000000b3000000b3b30000b3 % b3000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050205050000000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050205050000000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd2050502050500000000000b3b3b3b3000000000000509b50502050000000b30000b3b3b3b30000 % b3000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd2050502050500000000000b30000b3000000000000509b5050205000b3b3b30000b30000b300b3 % b3b3b300509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd2050502050500000000000b30000b3000000000000509b50502050000000b30000b30000b30000 % b3000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd2050502050500000000000b3b3b3b3000000000000509b505020500000b3000000b3b3b3b30000 % 00b30000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050205050000000000000000000000000000000509b50502050000000000000000000000000 % 00000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050205050000000000000000000000000000000509b505020500000b3b3000000b3000000b3 % b3b30000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050205050000000000000000000000000000000509b50502050000000b30000b3b3b30000b3 % b3000000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050205050000000000000000000000000000000509b505020500000b300000000b300b300b3 % 00b30000509b5050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050205050000000000000000000000000000000509b5050205000b30000000000b300000000 % 0000b300509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050205050505050505050505050505050505050509b50502050505050505050505050505050 % 50505050509b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd205050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50509b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b5050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000007f7f7f % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000000000000039397f % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b393939ff00000000000000ffbd7fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050ff50505050505050505050505050505050ff50505050505050ff50ff5050ff505050505050 % 505050505050ff50509b397f7fff00000000000000ff3939bdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab393939ff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050ffff50ff505050ff50ff50505050ff50ffff50ff50ff50ff505050ff5050ff50ff50505050 % ff5050ff5050ff50509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050ff5050ff505050ff505050ffff50ff50ffff50ffffff5050505050505050ff505050ffff50 % 50ff50ffff50ff50509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050ff50ff50ff5050ff50ff50505050ff50ffff50ff50ff50505050ff50ff50ff505050505050 % ff5050ff5050ff50509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000397f7f % bd2050ff5050505050505050505050505050505050505050505050505050505050ff505050505050 % 5050505050505050509b397f7fff00000000000000ff397fbdababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab397f7fff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd205050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050509b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % bd9b9b50505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050509b9b3939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000000000000000000000000000000000003939bd % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 393939393939393939393939bdff00000000000000ff7f7f7fababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababababababababababababababababababababababababababababababababababababababab % abababab3939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000000000000039397f % 7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f % 7f7f7f7f7f7f7f7f7f7f7f7fbdff00000000000000ff7f7f7f393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 39393939393939393939393939393939393939393939393939393939393939393939393939393939 % 393939393939bdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 0000000000000000000000000000000000000000000000000000000000000000000000000039bdbd % bdbdbdbdbdbdbdbd7f7f7f7f397f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f397f % 7f7f7f7fbdbdbdbdbdbdbdbdbdff00000000000000ff7f7f7f7f7f7f7f7f7f7f7f7f7f7fbd7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f % 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f397f7f7f7f7f7f7f % 7f7f7f7f7f7fbdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000ffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffff00000000000000ff7f7f7f7f7f7fbdbdbdbdbdbdbdbdbd39bdbd % 7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbd % bdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f % 7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd % 7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbd % bdbdbdbdbdbdbdbd7f7f7f7f7f7f7f7f7f7f7f7fbdbdbdbdbdbdbdbdbdbdbdbd397f7f7f7f7f7f7f % 7f7f7f7fbdbdbdff % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 00000000000000000000000000000000000000000000000000000000000000000000000000000000 % 000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffff %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def %%EndProlog %%Page 1 1 /picstr 3066 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def gsave 60.72 276.48 translate 490.56 239.04 scale 1022 498 8 [ 1022 0 0 -498 0 498 ] { inputf picstr readstring pop } false 3 colorimage 78DAEDDDCD91E336A370E109C49B594C04AEBAF5ADBD9EE51B42A7F0EE9DC48D 4359388D09C55F97BBAE4A1649100001E2EF390B558F8692D812D53A3C02C1BF FF06000000000000000000000000000000000000002CC1370040537C1201006E 33FFBFEAF0E79F7FFEF1C71F7F01C0B0D4FE3BF679FFCC1F80C28CDBDAD1D3FC 3F3F80CA5EFEF10FAF1F702E5DBA7439D665EDBF639F77CEFC0128CC5316E63E DBD1D72BF2FC182ACBF3F7FD1300C6A4DEDFB1CF7BD6FC012C62FE0B16E63EDB D1EB2B52E91393390018DDFCEBDD39F30730BDF92F5B983B6C476FAFC8D7FDB8 74E9D2A5CB7A97AF7F6F993F80459AFF8285B9C376B47D457C28BB74E9D2656D EDD7FC012CD8FC7D04346F47BBAF8803A501A006BB7F6FB90180759A3F756FDB 8E765F917A076203C0B21CFDBDE50600966AFE2A50C37674743FA50E4336A5A7 4B972E87BE7CFE29BB7E6F9A3F00CD5F616EDB8E02AF88B97D000C3D214F577F C75E3FEC347F008B37FF450A7387EDE8F415997BB62500536A7FC1ECB0FD3B16 FFCDECAEF96BFE0034FF9E0BF3DCEDA8DE2B72F1C3F7E8D3B3379E6B78FAB99F 77B76F3F07166BF58B37B93970CFDFEDDDBF63919BEEEB625FF7A3F903D0FC3B 2FCCD3B7A30E5F91B75FB96745ACB79ED39B3FF9C7D0CD3F630BD7FC0168FEB5 0B738C452FDE8E7A6BFEDB17A85B3F7C5BB182EB197957A39B33F3C7F4CDFFB9 A4E60F40F3BFB330673BC6F4EDA8ABE61FF332EDEEC1BD0DB9D97E719074DB3F 23C61AC56B7F78C9F02A05968FBCABC8DF7A77E5037B61A70F1DF333F987E6AF F903D0FC6BFCA9BF221873B7A3AE9AFFE9CB14F6C9ADCAC6BB68CCAD8A9BFFF5 9F6BDC3CD5FC777F66FED0FC357F0068529803561308A49AFF733D534F3490F7 E19B2A8149AE1B1FD5E3379EA3CD2990E5635629F2FAC8DF2EE6198BFC35939E 58E68F9E9B7FD2E04FCD1F00C66AFEE1A1E3A712A8F9A70A79DE4E53EA509FBC C41DDFBAE387C15C0FFE191B67CC6F17F38C5D5C93D32736723F08B8B3F9C71F 98AFF90340EDE65FBC30C70CB40E68FFDCED28F215C94BF1659B7FF6E096A4B9 71EE19EA1379938CE07F712722E9E6310FFD76C9FCD149F38FDF02357F00A8DA FCCB16E653D938D598B9DB51E42B92B13B56A4F9A70ED7B968FE194A9CB758EA AF9361FE798FBEBB7967EFBF9C1E47CCFCD1AAF947461BCD1F006E68FE050B73 5EF08F1FB2327A3B8A3FF222E38B982B73FB14398235757057C62CFA498BF573 6C6FA47BC7CF3B94F164D27EB46AFE495FD76AFE0050BBF9172CCC17CD7FFA76 D4E77CFEE1E1F77FE61E491A7F586B7C4E0F8F404B9D84B3D27C9E7FA61F0E9C F495D9A9D8337F74D5FC2FFE1DD3FC01A0CFC29C776C6FEADC3E43B7A3E1CEAA DC09ACD51388A19BFF95BF639A3F00F45998F3E6F37CBBDEDC3E3D7CF81257CF 1EA0F903C0ACCDBF93C26C3E7FCD9FBE7ADEA0F96BFE00D07FF3D78E347F009A 7FF1BFDB198351357F009ABFE6AFF903C058CD3FC9FF357F00CC5FF3EFA71D69 FE0034FFDA7FC7347F009ABFE6DF433B0ABC22CFC7BA72F9793F17EFC1A54B97 2E532F9F7FB78BDC5BA9BF639A3F00CD7FF1E6DFBC1D3DCF86F0763FCF07BA48 A9FB0180567F7C4ADDD5EBDFEDD7DD016E0060C1E6DF6D619EBB1D7DDE64FB19 F70D005081E75FECD7DD016E006062F31FB1304FDC8E9EF7F37A6F9FFC070050 94B7BFB75F307F00739BBFC2DC553B7AFD247ADD89F0190D0035CCFFEBBB5AE6 0F609DD13EDBC2FC0B89946A47BBC70B307F00A8D7FCCDED036041F37F2DCC4C 3E898F8F8F52ED68F77801E60F00559BBFB97D002C65FE6F85F94B681F88E0E3 1FAACEE7CFFC0140F3078022E6BF2DCCCC3FCFFC2BCDE7CFFC0140F307801B9A 7FDB813491FADD70DD347F00D0FC01608EE6DF76FC7CB7E6FF5C37CD1F00347F 0098A9F9B71A459364FE4DD64DF30700CD1F00666AFECC3FC6FC357F00D0FC01 40F3D7FC357F00D0FC0140F3D7FC357F00D0FC0140F3D7FC7D460380E60F009A BFE60F00D0FC0140F3D7FC01009A3F0068FE9A3F0068FE9A3F00CD9FF96BFE00 A0F90380E6FF79DB5D2B3EBA3EE67F4B99FFB77FA3F90300347F00CC3FBBF9EF 4A7541D3BE68FE79BB1B9A3F0068FE00A0F96798FFB6BA3F7FFEFA21B0A750D0 FCDFAE395AABEDCA1C7D6BA0F90380E60F004B35FFAD516FDD7E57F8DF347B57 FE2B99FFD15AEDAEE1D11D6AFE00A0F903C052CD3F6CFE61F10E787513F38FBC 52F30700CD1F00D66CFEA7A9FF6DC0CC58E67F7498B0E60F009A3F00ACD6FC03 E67F3ADA67A0E66F9C3F0068FE00A0F9E7E9F49DE67F71558DF30700CD1F0034 FFD39F9F4365628EFFBD673EFFC08C43A7B30069FE00A0F903C06ACDDF397C35 7F00D0FC016085E6CFFC357F00D0FC0140F3D7FC357F00D0FC0140F3D7FC357F 00D0FC0140F3D7FC357F00D0FC0140F3D7FC01009A3F0068FE9A3F0040F30700 CD5FF3070068FE00347FCD5FF30700CD9F1B00D0FC99BFE60F009A3F00ACD0FC 3F1A9164FE4DD64DF30700CD1F00A669FE1FED8837FF56EBA6F90380E60F0073 347FC48CFCD1FC0140F30780D19B3FE2CD5FF30700CD1F00347FCD5FF30700CD 1F00347FCD5FF30700CD1F00347FCDDF67340068FE00A0F96BFE0000CD1F007A 6BFEDFF628FE109A3F0040F307804E9A7F3D3F6F68FE9A3F0068FE00A0F99FFA F9F62B80AF9F9FD73CFFF76D99D75B55FA1E41F30700CD1F0034FF22E6BF15FE 57D53FBDF26D01CD1F00A0F90340B7CD3FECF0A792DF83F96BFE00A0F90380E6 1F3FDA27C9FCC3B7D2FC01009A3F0074D5FCE393FE69DED7FC01009A3F0074DB FC9306F318E70F00D0FC0160D0E6FF362DCF760E9FC8B97DDE760D347F0080E6 0F007F0F7B0EDF9BABBEE60F009A3F0068FE4D6CBF5BF3D7FC0140F30700CDBF 88FCDF3C9247F30700CD1F00347F68FE00A0F90380E6BFA6F96BFE00A0F90380 E6AFF96BFE00A0F90380E6AFF96BFE00D067F3FF06007D53B0F97F600FCD1F00 1669FECF258BF3F5A07F0198972F91AB77FF49A939A6F993FC2DAF5F8868FE00 307DF37F7EC296BD7C5382E2F7EFD2A5CB1E2E9F6FF3E2F7FC458DE66F54CF93 B7A1509A3F00ACD0FCDF3E6A4BF1AA0400E6E37507BFD2FDD768FE843FC6FC35 7F0098BBF957327F7604CC2DFFF5FE8068FE9A3F00A05EF37F3619972E5DBA6C 72A9F96BFE0080DB9A3FF170E9D2655BEDCF134ECD5FF30700CD3FA3F99B4510 4013AE08A7E6AFF90380E69FD1FCEB4DF50900475C144ECD5FF30700CD3FAFF9 979AA6CF949E2E5D7678F97C7B76B5560D9BFFE76D4F7F0EB3BB64FCCD357F00 40DBE66F6E1FC0843CB74DDEFBFA97E7FEE6CFFC357F00D0FC3B51020035CCBF C87B7CBB13113FAAFFED7E3A6FFECFD57EFBDFD7CBD725357FCD1F00D669FEBB 4A10CFAE1EDC4C93470F3852A9F5E9E1B9ADF48C51FA1BDE9BA73B11912FC4DB 626D9BFFABA56F7F38FAF9754760F707CD5FF30700CD3F52E41AEA77F387DE7D F4EBEB33D9735BFCD75967F7A176F34F7DB69B37FFDD801F63FE91576AFE9A3F 0068FE91EAB566CE7DFBAD2B696DABE7B6C6AFC3FC876BFE6F037E7A68FECC5F F30700CDFF9EAE18E35D47433B76AFDF8E9339ADC447436BB6F71FF3730DAD8D FFF5DB3EB7E1E76D771453F8818AFC3AE12D2170E5E916A2F98FDEFCC3D2AEF9 6BFE00A0F997ED8AA72A952ADE5BBDDC55CD53F3DFFDB989F99FEEBF1C3DFAFD CF6DFC53143EF633CFFC63563B66AD02F730AEF96BFEF798BF71FE9A3F008CD8 FC53CFC299D7154F7371647A4D32CF98DBC63CEE9DCD3FFE57E8FFB94D52EE3C EDBFA2F7F1AB3459F38FDFB559A7F907E6F6399A0548F3D7FC0160C4E69FE439 6F1FE51787FA045AEBA9A4E545EC8CC78D997E27BC8B94ADFD81D5EBE4B98DBF CFE2E69FF4D0A75F434CA6FDE1F766D2EF3B53F3770E5FCD1F0034FF54F37F95 FF2BCD3F664CF595289D11AE8FD6EDF5B261F0EFE7B98D3FE220FE508B48F3CF 7BE848BD9FE610E0D3E61FF9FB4ED6FC99BFE60F009AFFB7748A34FF8CE1EB79 83CCF3D47A77C04CC1F9F6AB9A7FEDE7365EDA4B99FF959D8EF86994D669FE49 037E347FCD5FF30780699A7F86FFE7CD1F927124E6959F771F28E3B6659D3063 A84F6A09BFE1B9CD183F1F7E51CAFE3A4506FF4FDCFCE387FA6BFE9ABFE60F00 9335FF3BE70FD986F45315399D1026DEDE4F877C9FFAE7CDE69F7430E6CDCF6D F83E93BE6E4855D3983982329ED59986FA98DB079A3F0068FE3D9CC3178BB3E6 89DB7A6BFE577622347FCD5FF30700CD1FA0FD9ABFE6AFF9FB8C0600CD1FA0FD 9AFF3DCDFF17FE8DE60F009ABFE60F68FE79CD3FEFC47FF7347F9E1F69FE9AFF E9E72C8009D0FC357F40F3BFBE13913A0FD83DCD1F6134FF0CF3DFFDAFE72580 B6EFD3A337E394E6AFF903B8BFF967DFCF0DCD1FF1E6AFF9C718C5AE5404FE0B 803769B7CDFF79C32B979FF773F11E5CBA7459E3B2D47BF3B91371FD7E347FCD 7F44A9D8CA43E0BF007887366FFECF055E3F6A9F9FC51729753F00CA52F0BD59 EAAE347FCD7F50AF88D70C00DE9ECD9BFFF643DCE11E009AF0F587EB6D77A0E7 E6FFBAF27937D7FCE7508BC8A10500BC379B37FFBF5E78AB6400701BAF7FB89E F4DCFCDFBC3D43E37B367FCD3FD52EFE737638212503BC317B68FE6FDAFF5AC9 00E01EDE8433DBFC6F6BFE6169DF7E11F0F5F3EB95BBCB1CDD4AF31F4230FEF3 7F138624DD048077E5FDCDDFC85800430F32B9F9AF59C0C6B7EABE75FEC09247 B7D2FC87700CF20F8CA2FDFF31B78FD930000C3BC8A49FE67FE4F091571E2DA0 F90F64FE610F2169C06DDA1FF36ED5FC993F00CDFF8AF96F8FFC8D31FFF0AD34 FFB1CC3F3B4202487A279EEE656BFE9A3F00CDFF9EE69FF14540E4A368FEFD9B FF22CA01781B6AFE003077F37F1CCFED33C7681FCDBF8872907FC07B50F30780 D19BFF7688CEEEF5A7621F33B78FE63FB475FCC731BFC05D6FC0DDF79AE6AFF9 03D0FCA1F9DF66FE79D703A8FD16D3FC357F009ABF1742F3AF61FEE47F08FEDF 019E9941B55FF357C90068FED0FC9B983FF91FCBF6ED054CA0FD9A7FF14AF66D 8F47CD23D48E1E7177C9B2EB70F398DB4ACF5BB7AB57EA991FFA65229C9ABFE6 3FB7F993FF1155DF8EC0B8DAAFF917AF64B7597786D785CF983996F95F79E8DD A308FBDC3149FDAFDDE787F96BFE9ABFE6DFB3F993FF096CDF5EC028DAAFF9D7 68FE37DB7286F9975A9971CDBFFF2A5ED0FCA1F91FFD35FBC0019AFFCDE64FFE 67B27D7B013D6BBFE6DFB6F99F8ECF29322CE468C451C1870EDCE1D1BC7CE185 C3D75F5CF3D3530E5D59B752AFECDB4B16B87EF73CA78193A526BD2298BBF933 FC5DDE9E1FCDFF3697389AED93FC0FAAFA76046E7BAF259D085BF3BFA7F9EF8E B4399AC5BAA0C71E3D5CD9E67FFA40910BC7FF7C7DCD8FCE105A64DDAEBFB291 E65FF599C722CDDF13FECAF6F9D1FC6F7689EB62C3F687C3AB76E7AEB1E65FBC F9EF1E6C7B6ADD57CCFFE8F0DED3536A1634FFD33D82F8B58A59C92276BA1BF0 B3BFC149BD938CE7367E2B8A39FF69F14D1183367F4F788CF96BFE77BA84913F D3ABBE1D81866F0ACDBF6DF32F352C24E6BFEE37FF47C459384F9F907AE61F4E E5817132A7EB76FD9565FECC5FF3D7FC97357FF2BFA0EDDB0BB8EDEDA0F9B71A E77FC3D49A3D987FBC5D9F3E75F5EC34F5CB8B7BBE8F088CFC61FE9ABFE6AFF9 CF6DFEE47F65DBB71750F58DA0F9376CFEEB987FF6A89EA3E52BCDED73712452 916310983F347FCD9FF9937FAA6F47A0D25B40F36FD8FC673AC237C93FDB1EE1 1B98CFBFB7237C23874885BF58495A98F96BFECC5FF3EFCA25569BF087CFDB0B 086FE4D78F76D7FC5B35FF47B9593DC307F986CF235C64A723639C7FA99933AF 3F6FBBD13E3C3DE9EE149A3566F58CF967F8497B44CFEAC9FC357F68FEDDBAC4 C4F24FDAED08DCBCCD6BFECE7A79333D8B25E985E65FEF8D30C4FB4BF3EFD625 66927F666E2FA0E1D6AEF9976DFE60FEC0E8CD9FF96BFE7DBAC4D0F2CFC0ED05 74B29D6BFE9A3FBB66FED0FC5FDF05814183AFEF94F00138E1534B6BFE9AFFF4 F24FB3ED08F4B9856BFE059BFFB763EA99EAFD0FFA3898DC7E94FD8E26CF58D9 F51CF199C7A0CD3FE668F1C0958F0A139A69FE2B9B7FE7F2CFA5ED05F4BF6D6B FE9A3F00CD3FE6CBAFB0D83F12E795D5FC35FF69E49F36DB051868ABD6FC8DF3 07A0F907CC3F7CF6EAC0970231E7BCD6FC997FF6236EEFF9FA8487B41FF7CBFF CD1BB3E6AFF903D0FC5347FBC42F70FA5582E6CFFC878EFF3C99F98FB50D6BFE 9A3F00CDFFBAF91BE7AFF9377189B6F24F92C9FF705BAFE6AFF903D0FCB7C37B B6A37D1E9B597DDE963F9D11C8DC3E9AFF4CF24F8FC9FF88DBADE6AFF903D0FC 8B30C17C539AFFA02ED144A2B831F31FF1BB2ACD3FBE927D00C05D346CFED9B6 3FB1F96BFEFDBBC4CD2A458CC9FFA043D434FFC84AC64300DC6FFE4334FF994E 30A1F90FED124773A4D07EF423FFCDE7A4D2FCE32B1900DCC628CD7F3234FF09 5CA2B6FC9361F2DFEDC6C9FCCB8EF307807B18749CBFE6AFF977E212DF6AC284 57A3EAE6E4DDDA73F3F799086085B97D98BFE63F81F9575A131A2CFB8F38B65F F337B70F0073FB307FCD7F29F3BFBE320498FC77B541327FCD1F80E6AFF96BFE 5C22BC3ED9ABC47E997F91A3CE99BFE60FA013E56B88E6AFF933FF1BD6277BAD A82F7AD80E99BFE60F6002F37F3570CD5FF367FEB5CD3FF52860D28B8CA37D8B 6CA8CC5FF307505BF99A0CEFD1FC357FE67FB3F90BFEA897FD99BFE60F80F9A7 9ABFE6AFF933FFE6E64F779121FFCC5FF307C0FC357FCD5FF31FCBFC892EF2E4 9FF96BFE0098BFE6AFF96BFECC1FCC9FF98FDBFC3F16800C80F96BFE9ABFE6BF A0F9535C64CB3FF39FB5F94FAFFDBEEC00F3D7FC99BFE6BFA0F9935B5C917FE6 3F77F3E74280AD7DD0E6FF0B07E756D0FC993FC0FC357FE67F1BBBB3E34EF93C CFFDDB8DBEB5EFBE2ECF2B8F5EB5A457B361F327F991E6AFF9AF66FEB41617E5 9FF96BFECCFFA2F34FECFF7DFE5E796B75FD956AF56CF469FE559BFFDBEFDEFC E4C59DAC46D95D30CD7F44F327B4B82EFFCC5FF367FE17D57162F99FC3FC4BED A98D65FE81DFA2FFE6DF8372BFFEE29DAC46D95D30CD9FF983F9337FCD9FF9C7 D863DE02B8E78588593EE3956AF8FA5E6FFEAF6B7EB4D3DA73F3BF7F337BFBC5 3B590DCD7F71F3A7B22822FFCC5FF367FEA57A2FF3BF799CD595172EF24E7A18 D375D1FC5FD739E6E70E9B3FF3D7FC993F894529F967FE9A3FF3BFA7F7C6DF49 FCF70BBB0B87353570CFA96D3CE351B23D3CCFC0937ED911CD3FB07A4703FE4F AFD7FC357FCD9FF983F97BB74ED3FC2F26D0C5CDBF60AF0EEB68A4BD4752DCFC 4F1FA8B8F9E72D5C76AB1EB7F91F2D70BA416AFE9A3FF3EFC1FCE92B0ACA3FF3 5FADF99F8E5761FE65952FDCE46B2C19BEF975F34F7AA024F32FFE7230FFF8E6 1FF367A479F3FFAD3291E6FF7765347FE64FFB514FFE99FF82CD9FF93731FFD5 AE8C9F04297BAE9EA425AF0FD761FECD9B7FB7E6FF79DB56E6AFF9337F80F96B FE91E6FF6A44CCFFE270F170753FBDCF8229FE669F8FFF8D1A9A7F91E1FA8EF0 D5FC77CDFF7973CD9FF917377FCA8AE2F2CFFC576EFEBBA6C7FC997F11F3DF6E 606FF93D6FA8CF15F30F8FA19AD5FC1F7566F5D4FCDFB4BFA0FC6BFECC9FF6A3 9EFC337FCD9FF9D71B581E7FF8ED9DE61FBFDF71DAED638EF30D0CBCB9D3FCAF 3B7C6FE67F030335FF808DCF6DFE9AFFACE64F535149FE99FFE2CD9FF933FFDA E6BFB5FDC05E40D597E3A2C633FF6E9BFFEEC0FB1BCC3F7265347FE6CFFCC1FC 99BFE63FA2F9C74FFF5ED5517B30FFA4A72E7EE40FF3D7FCC732FFB771FEF79B BFE63FA5F91354D483F96BFECCBF94F52595FCB6E6FF889BCEBDE0D1B89147FB 327FCD7F20F3EFE1085FCD7F3EF3A7A6B873AA1FE6AFF933FFBCEC7FFD9C56B7 1DB77BC5FC1F8967E36A6BFE194F0BF3D7FC1FE6F6D1FC993F983FF3D7FCD736 FF78890DFC6FEA954907A866286EFCEECCE9AD62CE385C4AA4F3BEA4C87B5699 FF2873FBB43AC257F367FE65CD9F94A207F967FEB336FFD4FF5DDCFC1F11F3C3 C774EF18498E5CAC89F927FD46CDCDFFE2B3CAFC5798CFFF29F09ABFE6DFD6FC E9283A917FE63F6BF367FE05FDFFED7FE3BF32289EE26F30FFA4DFA8B9F95F19 DAC4FCE79ECFFF4DE0357FCD9FF983F933FFF99A7F590D5BD0FC81FBB7F68F76 4CD9FC770F0DD0FC35FF86EB4344D18FFC33FF999AFF4C2EC409B188F97F3465 BEE6BFBB629ABFE6DF707D2828BA927FE63F53F367FE00AE0CFE99669CBFE6AF F9337F80F96BFECC1FC0A9F98F3ECE5FF3D7FCFB711BF289DEE49FF96BFECC1F C034CD7FEBED9ABFE6DF6A7D68273A947FE6AFF9337F007334FFC0CCFF9ABFE6 CFFCC1FC99BFE6CFFC0174D2FCAF9CA8EBF4845F9ABFE67FF3FA104EF429FFCC 5FF367FE007A68FE57CED27B7A9E5FCD5FF3BF737DA826BA957FE6AFF9337F00 9D34FFB0BD474EE3338DF96BFECC1F60FE9A3FF3073071F38F34F9A3397C6632 7FCD7F50F32799E859FE99BFE6CFFC01F4D6FC33087F35A0F96BFEF7AC0FBD44 E7F2CFFC357FE60FA09FB97D6A687F13F3DFBDA1E6CFFC01E6AFF9E735FF5F53 C3C480D59A7F78244FB6F3376CFEDB9B6BFE739B3FB144FF30FF419BFFAFD961 62C09ACD3F7E172069F29F8BE65FEA5C039AFFC42E412931DCD1BECC7F94E60F 007337FFE23437FF2FF9D7FC993FC0FC35FFD4E60F008B34FF69CC5FF39FDB25 C824C83FF3D7FC0168FE439B7FA9E9868CF39FDB256824C83FF3D7FC0168FEA3 37FFEBDA6F6E9FE95D824082FC337FCD1F80E6AFF99BCF9FF903CC5FF3D7FC01 68FECC5FF39FC025A86355FEFB0F9E8709E45FF32F329F3F10E673FBF12460BB 55F4D9FC6FDEC7E96D3534FF115D8234D676FE573C2743CBBFE66F3E7FD4E669 FE9E0ABC6D157D367FE6AFF9337F1C693FF967FE9ABF814038F58AB0E961D9AD 42F3D7FC993FED1FCBF9F9FFE8F2AFF91769FE3406CC1F35CC5FF3D7FC993FED EF53FBC9FFA0F2AFF96BFE60FEE86D83D1FC357FE6CFFCFBD77EF2CFFC357F80 F9A3A0F9DFD9FC5B1DE9DCDB6A68FE03B904456CEBFCFC7F44F9D7FC1769FEDF 8E215AEB987F871BC07605C2AB94BAC265EF6DE2E6DF708EA3DE5643F31FC525 C8613FDA4FFE07927FCD7FC1E67F9BEDD8ADE8D0FC7B7B0577CDFFE871337655 4637FF7B9A7FE0D9B8F8045E7C869F377FBD9FDB5E35CD9FF9737EFECFFC357F E6CFFC993FF39FACF9EF6AF6EBE5DB7746BBFFCC5820F2E5DBDEED763D8F1E6E 77B3895C07CDBF6797A0857D6A3FF9EF5FFE357FCD7F3B0E24F0B9F9BACCEE07 7AC10F7DE67F9BF91FBD5281EB8F36925D553BBDF9AEEC9D5E7F346669772BDD 2E93716F8B34FF806647A6F8F805AE34FFDDF58CFF454ED741F3EFD6250861B7 CECFFFFB977FCD5FF3DF75FB801026FD7CE5439FF9DFD9FC63B4ADF6469264FE 171F28FEDE061D6472BDF9A75E99344AA794F917BC95E6CFFC693FF967FE9AFF 9AE3FCC3B214BFD891106AFE0D5FFAC0E1BDBB193CFBD5CF70B3246DBBB235EE 9AFF69FD5EAAF9E759F4EE777FA7DF259532FFD347BF32DA47F3EFC725A8E028 DA4FFEFB947FCD5FF30F7C28C79B7FE4CD8DF61965A7EF54DB32CC3FE6E60DCD FF748C5313F31FA8F9272D90BAC5D678F4A4D13E9A7F272E410207727EFEDFA7 FC6BFE9AFFEE808D2BCD3F661783F98F68FEA93709C4F318F30F7F0D51B5F9B7 DD6E076DFE4DC6F9673CBA71FECC9FF6937FE6AFF91BE75F70B44FAA2B32FF4E CC3F69B44F86F9A78EF6E9CAFC1FCB8FF37F1C1FB6BFBBC0EEBC3A7973FB3C22 0E3A3E7AF452A37D34FF1E5C82FE0DEAFCFCBF2BF9D7FC35FF47CA41918EF09D D5FCAF1CE19BDAFC2347FB64DF61FCCFFD1FE1DBF97CFE4DB658F3F9AF69FEC4 6F02ED27FF3DC8BFE6AFF9EFE6B2C0FC2A91B37A1E099571FE6D5FFADD01ED49 F3F384A7E58C19E77FBA8DA5DE61CCAC9E314DB8C3593D9B347FE6AFF9337FCE CFFF99BFE63F8DF9DF3374041D9A3F46D9605A35FFBC335ED5DE576DB54A9A3F F3A7FDE49FF96BFE2B9B7F601677307F8CDEFCA1F9F7EC12FFF33FFF43FC66D2 7EF29FCA8F1F3F98BFE6DF76B8083160FE98A9F943F3EFDCFCC9FF4CCECFFF53 B59FF96BFE60FE187DABE8A4F9FF6A4A6FABA1F977EB12E47F4AED27FF776ABF E6AFF983F9A367F3BFA7F937F4EDCFDFB4B7D5D0FC3B377FF23F99F3F3FF18ED 67FE5D357FE0942FB500DEB68AAE9A7FABE134BDAD86E6DFBFF993FF29B59FFC 07B49FF9F7D3FC7F0140B911260D9B3FF3D7FC07327FF23FA5F693FF23ED67FE FD347F00E8F0C052CD5FF39FCFFC65FFE99D9FFFD70EFE9ABFD93000F46CFE9A BFE6CFFC65FF05B59FFC570AFE9ABFE60F40F37FBBF2EFCA449A7FABD5D0FC07 32FF35E5FFBF8B41FB99BFE60F40F3AFD7FC9384F6B74492CCFFB76AA49ABFE6 DFADF9AF26FFFF5D92C5B59FF96BFE0034FF4E9A7F6DF3AF51FB33CC5FF3EFC7 259695FFFF2E0FED67FE9A3F00CDBF55F3FFF2E7A7CF47EE205432FFA47D04CD 7F3EF39F5EFE69FF0AF2FFE300E6DF4FF337213980F9E6F34F32ED18F37FDB47 286EFEAFBB159A3FF3A7FDE49FF933FF4ACDFFEBB31B089F1BD49380A30D639A 71FE494B9635FFED6822CD7F4DF39F52FE79FE3AFEFFE318E6DF55F3776E5638 81EFCA5CF91270DCE6FF2AD861DFDE5DB2A0F91F1D4AA0F94F6CFEEBC83FBD5F 47FE6FD37ECDBF48F3273F60FE86EB2499FFD0CDFF4DAD03B27DB46429F30F1F 47ACF9AF69FE73C83FAB5FCAFF7F0461FEDD36FF6FC086A7E01DA905C665FB67 E1EB55FEDF7FF3B9CCF69A78F31F656E9F86A37D8CF367FE93C93F995F4AFE7F 9CC1FCBB6DFE2C17CC9FF9BF99FF53F2B3CDBFB7E6BFB5EB5DE5DE95F0A1CD5F F31FCBFC07957F0EBF9AFFFF8880F9F7DCFC9FD7876DF0F51EDEAED92E99714D F8A193AE470DF3DFDD18021B490CD937CCE6CEC75AD9FCBB6AFE619F3F9D6053 F3D7FCC93FED27FF6DB55FF32FDBFC63FC792B7E173D9FF98F65FEDB5DBF5D91 8ED7F8DD3D880ECD7FBE3D8553F37F2EB07BBDB97D347FCD9FF9D3FE95E59FF9 CFD1FCAB9AFF539F98FFF4E61FAFCAD93764FE43987F3FCDFFB4E4471E90ABF9 6BFEB799FF10F2CFD5D7F4FF1F7130FFB19AFF9BF36498FFEE024737391AFBF1 E696E1D5C3CDE3FC03E61F69CB816562B690C096101E4D9474E7F70F466A6EFE 6FFFBBFDAFB19A7F78DECEE789BA347FCDBF37F3EF5CFE29FA9AF2FF231AE63F 50F3DF0EBDA86AFE81874B5A1EC3997F60844FFCB671FAF3EE0A67DF09F337B7 CF7067F2D2FC3B7489A1E59F992FEBFF6DB55FF3AFD7FC8F0CBF9EF9273DDC95 2143B86EFE4709FDCA0899DDF61E736F81630D027B16F1072C2C68FEBB7F31DE FE77A0E69F3DA9FED14CFB239ABFE63FB4F9F726FF847C59F9FF9102F31FAEF9 1731FF80F05F7938E63F56F33F9D24EAA8F31FB9FAEE5DC52CCFFC6F36FFE6CD 3FEF2CBAF399BFE63FBAF97722FF3C7C65FFFF9108F35FB3F9337FE69F7DEC6D 64C38F31FFF8DD0AE6FF14FBC0097CA799DB277E68FD2B9ABFE6BFA6F9D3EFC5 E59FF96BFECCDFDC3E55E7F6B928E7A75F4330FF23F3FF083250F3CF13FBD37D 8482E67FF4B582E6BF82F98F25FFC47B71F9EF44FB35FFAACDBFC811BEF1137E 263D9C237C5798CF3FA6F95F39C237F5CE579BD5F388519A7FCCB89DBCAF0646 347FCD7F0EF36F22FF7C9BFFFF4887F90FD7FCF3E63FCC36FFF0AC9EE1594035 FF9B47FB1C6D24A763F84FFD3FFE08DFA3AF815267F53C3D88206F776682D13E A7F4DFFC8B98FFEE629ABFE6DFD0FC6F967F9A4DFE7F64C1FC876BFEA7A29EB7 0C261BE7DF15F365F90ECD7FA071FE018B4E12EC7AE69FBD57A2F92F6EFEF7C8 3FBBE6FFD9DACFFC071DE79F3A9C86F9337FE63F8DF907947EACE69F67FEE1FF 2D62FE57BE92D0FC6772893EE59F5493FF3EB55FF32FDEFC0333AB879DDF607B E6CFFC99FF1CCDFF34B95F37FFF81944357FE67FB3FC7369FE7F51FB99FF28CD 9F0861570E6D24CC7F9DE61F39F8FFA2F9A79E3E40F367FEB7993F8526FFCC7F 9DE64F84C0FC99FFCACD3F7EB69F2BE6FF5B3A9A3FF3BF47FEC933F92FA2FDCC 7FA0E69F34314BF804A99D8CFD383AF7134A99FFD16120E11725FE94BE46F868 FE3734FFD469FFB3CDFFB75C34FF89CDBF07F9E7CCFC7F14EDD7FCCB36FFA409 D823CFDC14739F35E42D307F234A997F78EEFDD3A73DFE7509EF4A789934FF2B E69F71B6AF3CF3FFED329A3FF3AF21FF5499FC17D47EE63F5CF3BFD25A99FF52 E6FF3A85FE23EB1CBE45CC1F9AFF23773EFFEC33FCA69AFF6F45D1FC997F29F9 67C8FCBFB8F633FFA19BFFDB749D19E61F9EFC677799A313F5061A72F83EFB1C 8934BAF96F853F63BFEFE826495B48FFA3CE34FF09CEE15BEF4C5E7968FECCFF BAFC1363F25F43FB99FFB8CDFF74907C46F30F9C29E0689448CC6AC4DC27CD2B 68FEBBCF6D11F3CFDB42BCE29AFFAEF9D723C9FC2BA1F94FE612779A3F1FE6FF E3067FCDBF5EF3DFF6FF22E6BFFB5FF1CE76FAA03CB0B6F9C73CE177BE9A0EE2 D6FC7B36FF26ABA1F92F6BFE31F24F83C9FFD0C15FF3AFDAFC6B98FFEE742E61 4B0FCF00C3FC2733FFD42DC4681FCD7FF777B987B0F9B75A0DCD7F65F30FCB3F 0126FF55B59FF96BFE91061E7EDCD3FD02E67FB3F9EFFA798DE69FF4CDD1D136 83059B3FF3D7FC5736FF5DF9E7BD38F2FF1F4561FE9AFF75F337DAA72BF33F7A FE8BCCED53C4FCBDE245CCFFE318CD5FF3D7FCC7927FBA8B23F91F4EFB35FFAA CDBFD511BE47FD76F7268EF0EDD3FCF3E6F3CFDB42BCE2C5CDFF2388E6AFF96B FEFD9BFF97FCB35C04FCFF476998FFD0CDFF516256CF239DDB6A61F881DEA6E8 7C1C1F3E90F45D03CA9A7FEA09792367F50C6F21C6F91737FFFF3D43F3D7FC35 FF21CC9FDC220CF3D7FC2F9E2995712D68FE60FEFD34FF8F46F4B61A9A3FF327 FFB85FFB99FF04E3FC53E74B64FECC1FCCBF55F3FF68476FABA1F98FEB12CC1F 823FF3BFB9F9279D3CD7280BE60FE6DF43F347BD5D30CD7F68F327FF982CF86B FE659B3FC0FC99FF88CD7F1B22E2AF6FF255E66E6329FE889A3FF367FE60FE9A 3FF307F3C7C4CDFFE2F14AB799FFE90F9A3FF367FE60FE9A7FED71FE49637B8E 9A55C6E766EA875DBD9145190738AC6CFE3173FB8467E937484CF32FDEFC8F3A FFE94C50A7B38495FA9BF03A59D9DB1BA1E044B59AFF882E41FE41FB997F0F73 FB1C7D009D7E368D65FEE6024D32FFC0108598D10BCC5FF3AFDAFC23BB7AE495 65FF3864AFA4E6CFFC993F98BFE65F693E7FE64F0E03E67F142A239F4C4FAFE6 5FBBF907B6BAF8D3CC4D63FE9AFFCAE64FFE5155FB99FF34CD3F7C26AF24F33F FD62FDF4CC5C57968F3C63D4F69461ECF4C8FC230727A73AD8EE8B62BF4CF3CF 1EE77F3474277CDAC1C0E9C24BFD654832FFEC87D3FC993FF307F3D7FC23CD3F 66B87BCC70EEA3FB69F5F3E992DCF2D4FCE355EAE8250898D5DBCFCC5FF3BF32 CE3F6F47F551F9C0DBD4D45FC4FC35FF815C82F9C3501FE67F7FF33FB5FAC8F1 1B47F773F3F5196BC52D77CD3FE9098FF1F6F04BC9FC35FF65C7F997357FCD7F 71F327FF9823F86BFE559B7F46DE6F62FEBBDFC233FF11CD3FFC5256AAAFCC7F E2E67F656E9FC0C0C2DB9AFFC5AD5DF367FECC1FCC5FF3BF6EFE3163FE5B35FF C88F4BE67FC5FC77153DFED5CF7E2999BFE67FFF7CFE95883FE6BD94F96BFE63 B904F907ED67FE9D34FFD44FD54ECC3FF29FCCFFD4FC4FB5FCD46DF25ECAA30C 0BCD7F62F3BFB8C29A3FF367FE60FE9A7FBCF99F1E037BD1FCEFFF396649E65F C4FCE3CFEC167350B6D745F34F6AFEA7B30DF460FE815149A53675CD7F5C97F8 7C50E68FFECDBFD5BB43F3AF349FFFD1F9258F66B74B9DFFE7FE593D4F6FC530 AF987FCC9C87A7D3FE9F9E05D8EBA2F987CD1F9A3FF327FFB827F833FF999A7F 467DA2640B9A3F987F6FCD1F9AFF1CE6FF1FD37BA2FBC93C99FF64E3FC4FE7F3 67FECC1FCC5FF3D7FC99FF40E64FFE693FF3D7FCB7D3B684875E1C8D5965FECC 1FCC5FF3D7FC997FC1F561FEE836F833FF099A3FC0FC99BFE6AFF96BFECC1FCC 9FF9AFD0FC01E6CFFC476CFEBF9AD2DB6A68FE33993FF947B7DACFFCE718E77F 3A686777C29CF85BD1AD09CCFF685AA4A4E1619E5BCDBF60F36FE8DBAF7BC49D AC86E63F99F9D7907F3ECCFC8B4CE0CFFC279EDB6757D8224FEC7B3A6D350632 FFF853AD0D714225E63F53F36F359CA6B7D5D0FC993FF9DFF2FD1F683FF3D7FC 6F307FD637B1F9E7BDD0B601CDBF46F367FE9AFFACE62FFB17D1FE05E5BFF619 7B99FF64CD3F7C26AC18F38F9F14687B57E16945936EE88B8626E6FFB870E2B6 EC6D009AFF277F5726D2FC5BAD86E6CFFC993FF367FE9A7F91F9FCCB9AFF91D7 057E8E5FF891754A02449A7FEA199C335EEBBC6D009AFF9772FF568D24F36FB2 1A9AFF94E64FFE8B68FF52F25F5BFB99FF64CD3FC6E4AF37FFD311E3BB3F470E 3537C2A492F9C7BC28792FD9F56D009AFF53B96B64F60CF3BF7F35347FE6CFFC 03DABF8EFC337FCDBF43F3DF9D1026C6FA4E6F18B87F141CED73DDFCB3B701E6 AFF9337FCD7F29F327FFA5B47F05F9BF41FB99BFE67F65B4CF95DE1B58BD9863 90D1D6FC4F5F4AE6AFF9CFD7FCDFC6ED68FECC9FF9337FE6CFFCBB6AFE79E3FC 1FC1295F4A8DF488D9312187F79BFFE9E6C4FC35FF6E9BFF91961731FFDD41FB 9A3FF38F7C50E65F44FBA797FF1BB49FF9CFD7FCAF1FE1FB883EEA3663B44FF8 860F07813635FFBCD7FDFA3600CDFFA2F9879D7C5CF3D7FC99FF52F2FF3D1ADA CFFC35FFDD41F2E12B2307F604C6E11FED5F047E8E995E66F7FE71C5FC1FB9E7 F0CD98D533631B80E69F6DFE3136AEF96BFECDD747F6CFD0FEDF5F5841FEEFD1 7EE63F59F34F857DAD63FE60FE9335FF780FD7FC35FF1ECC9FFCC79BFFEF074C 6CFEB7693FF39FAFF9337F307FE63F77F34F35F0718FF0D5FC99FF22E67FEAFC BBFECFFC99FFB2CD3F63EC841117CC1FCC7FB8E69F57DDDBCEEAF95C55CD9FF9 9795FF99B4FFF72CA691FF3BB59FF94FD0FC01E6CFFCA76FFE5706DBD430FFC8 655ED756F367FEB23F98BFE67FBDF903CC9FF94FDCFC7785BF49F37FBD3EBC02 BBFB299A3FF3FF5A86F9A39EF9476E84DEAD9A3F1631FF981334C75F7F7432DF 4A9C9E50206FC0DB5823DF966AFEA77375C61F1750EA08DFD37307EC6ABFE6CF FC2B993FF9A7FDCC5FF3078ECC3F467153CD7FEBD20399FF9D2BAFF9A79A7FCC 5C9DB799FF764D22574FF367FEBBCB307FD430FFA48D90F96BFE58C1FC1F1127 71C836FF47E5D9A2CADEF9CD2BAFF9679BFFE991B3B5CD7F57F263BE8FD0FC99 FF0DE64FFE693FF3D7FCC1FC93CCFFF4745D79E61F73E2B6D73B3F3AD9DC761D DE7E88BFE195950F9CE058F3AFDAFCDB9AFF91E13F653EACFD6F0B6BFECCFFB9 0CF347F1E0CFFC357F30FFD773F8061437FEE7F0809998BBDD35FFA475485DB8 C6CAB7FA8260C1E6DF7CB4CF5BB4CF1E05A4F9337FE60FE6AFF96BFE686EFE31 63E9638EF08DF1EA40F38F5F87F805CAAE7CE48829CDBFD4DC3E3D1CE11BF9D5 C3EB570081237F357FE6FFBA0CF9A7FDC567F264FE9A3F987F7864CB45790E1B 72E7E69FBAF23D1C0EB0E07CFE0D67F58C3977C0D14C3ECEE1CBFC993F98BFE6 AFF9A395F91F4D6259509EB39DBC07F38FBFF90AE6DFE1397CEF3F9357FC6345 AE98E6CFFCB7CB907FDA5FF6D45DCC5FF307F3BFADF9AF60FE8B8CF6E9F01CBE 498E5DD6FC93827FF66A68FE6B9A7F41F9E7D26B9A7F918D90F96BFE98C9FCC3 1375963D4836EFD8DB80C09F1EE19B74C3EB2BDFBCFC2FDBFCAFF8FFF5E61FC9 95D5D0FC993FF367FECC5FF367FEA86DFE8F6BB37A868F938D9C6FF3749A9DF0 AC9EF137BCB2F24BCDEAD96DF3CFF3FF7BCCFFE20E88E6BFACF9937FDA5F4AFB 99BFE60FE66F23790C728A2ECD3FD5FCE3FDBFB6F9171974A4F9337FE6CFFC99 BFE6CFFCC1FCF354FF74B40FF31FBDF927CDFF59EA1CBED947196BFECC3FBC0C F9A7FDD7B59FF96BFE60FECB6E2447C37898FF64CD3F7C5EAD22E65F0ACD9FF9 1F2DF3FDFB77E6CFFC53F9DC6C98BFE60F30FFE95F5CCDBFAC72F76CFE9AFF0A E6FFFDFF60FECC3F49FBBF60FE9A3FC0FC99FF9ACD7F3EF3D7FC993FF9A7FDCC 5FF32775C836FFC024F619C369AE0CC5C91BBA933DEC87F96BFE9ABFE6DFA1F9 7FFF37CC9FF92769FF56FE99BFE60FE61FF6E7CECDFFE25C9A930DF25FA1F957 22D5FCEF5F0DCD9FF9CBFEB49FF96BFECC1F65CDFF11777EDB7EA4FAE29714CC 7FACE65F9578F36FB21A9AFF82E6FF7D0FE6CFFC93B4FF4DFE99BFE60FE61F6F FEA7A7F4DA9EC4767BBAABC7DEA49ABBB70D2C10A3EEBBBFC8DB5AED7E651079 D2B198339169FE059BFF6D84CDBFD56A68FEAB99FFF703983FF3CF30FFA7FC33 7FCD1FCC7F57B6B73F1FCD819FF4736070CE7607E11137F17EE44EC1D10AC4AC 4CF817D95DF3565F284CDCFC99BFE6CFFCC93FEDCFD37EE6AFF983F96798FFAE 57275D1F96E15DF38F1FB7131EA7943A9629BC0E81DFBAED08A2F99AFF47237A 5B0DCD7F29F3FF7E06F367FE49DAFF947FE6AFF983F98747CBC718FEEEE09948 F30FDF366F929F6CF38FF945C2BFF522A37D6E6BFE1FEDE86D35347FE62FFBD3 7EE6AFF9337F9432FF53818F6CFBA9C93DFCFD42863F679BFFE9CA447E59D036 FECFD4FC516F174CF3EFD9FCBFC7C1FC997F92F67FC1FC357F30FFEBCDFF8AF9 E73D68CC3519E65F6AD852F66E8BE68F24F3D7FC993FF367FECC5FF367FE4832 FFB0BA173FC237303827E308DFF84386939ABF237C357FCD9FF93731FFEF2990 7FDA9FA4FDBB67F565FE9A3F98FF51DC2E35ABE756DDDF743A7E56CFED9D04EE FC113DCEFF1137F5E8B2B37A6AFE9A3FF3AF61FEDF1361FECC3FC3FC4FE59FF9 6BFE987EB44F06F39D036B9A1777CAE69F3AA76B6D028F9B74EE898C435A347F E64FFE69FF15ED67FE9A3F987FAAEA349FBB12AB35FFF853B6DD66FEA9FF9B71 13CD7F29F3FF9E05F367FE795B0EF3D7FCC1FC23E59FF633FF26CDFF68233C9D 523530142D7BDF21FCA0DB93563F82E7924B7A5B69FECCBFACFC73EFA1CD3F7B B361FE9A3F983F98FF40CD3F3C13D4E99581434B92CCFF745ADAD363D8357FE6 7F45FB657FC1BFB8FC337FCD1FCC1FCCBF93E69F21F9313B0BF5CC3F729D8DF3 67FE0DE59F81AF16FC99BFE60FE69FAA1F06FC68FEAD9A7FCC991716317FCD7F 0EF3BF226FBFFF83ECBF66F0FF7AF58BCB3FF3D7FCB188F9270D36BE6EFEF61D 34FFBCE6CFFC35FF99CCFFA2F33F61FEAB99FFDB065050FE99BFE68F75CCFF4E 2167FE9A7F46F38F3C6B739FE66F9C3FF32F62FEBF1FC0FCD731FFA36D80F96B FE440817CDFF68EE91EDEC2581393F77E763893931D6EE742858B9F9179CDBA7 88F947DEFF2338B74FD246AEF9CF64FEA59C5FF65F3CF85FF47FE6AFF96341F3 0F0C4B389D9CE4E202E16538BFE6FF98623EFF5268FE6B9AFFEF7130FF95837F B6FF337FCD1FCCFFC861324632270D93B85862B1C8DC3ECC5FF39FC0FC0B0ABF EC2FF85FDC0560FE9A3F9632FFC8B1D3D9E6FFEDDF307FCD3FA3F91F9D18B795 F907F66D357FE67FDDFC7FCF85F90BFE19FECFFC357FAC66FE5B4A997FFC1068 E6AFF943F35FC4FC6B383FF367FE57FC9FF96BFED0FC4B99BFD13E9AFFC5E60F CD7F26F3AFE4FCE49FF65FF47FE6AFF96305F30F0FC82FDBFC338EF0F57A2DDB FC7F35A5B7D5D0FCE736FFDF8BC2FC997F9EFF337FCD1FCCBFEC38FFC7D9343E 474383B060F36FE8DBAF7F3C3B590DCD7F1AF3AF27FCE49FF65FDF0560FE9A3F 5618ED03E6DF6DF36F359CA6B7D5D0FC2733FF57EFFABC9EF933FFFBCDFF6DC3 63FE9A3F983F987FF3E6CFFC35FF99CC7FDBF96B68FF45F9E7E71D9A7FA58D64 BBF97D6EA2CC5FF307F307F3D7FC357FE67F7D7DEE44F69F29F8DFBCF178B76A FE60FE60FE9ABFE6CFFC0BAECC0DEBC0FCE730FF29374ECD5FF307F387E61FF8 5DFEAE4CA4F9B75A0DCD7F5C97D88DA8B7AD00F9A7FDD9F27FF3DB44F3D7FC71 BFF96F67D7091039F76691F9794CF2A3F907EEF667349399BFE6DFBF4BEC3ED0 9D26C3FC99FF10DBAAE6AFF9E366F3DF4EA7792ADBB7997FFCFE48D51D8421F6 3E166CFE3F13B9C1FC53773A34FF595DA2B9F65F917FAEDE83F9F7F09669F866 D1FC357F5435FF54D1BDD3FC23EF87F9AFD6FC7F66318DF96BFE3DBB4427DA2F FB0BFE436CB79ABFE68F3BCD3F46F203A7D93ADA05D81A7BE07E02553F7C4EB1 F03DC73CDCF6A1B7378CBC73CDFFCEE6FFF302F78CF689177ECD7F3297E847FB AFEC0530F626E6DFE71BA7C95B46F3D7FCD1C4FC0367DD4D32FFF0D97B634A7B E0F4BE477B19493F472E90B4FE9A7FA5E6FFF3321398BFE6DFA74B74ABFD197B 01A4FD1EED1FE2BD73FFBB46F3D7FCD1CAFCC3837CE29BFFC5C142A9E67FFA70 81E593D67335F36FDEFC7F16A29EF9E70DF5D1FC477789A3697CFA5717E67FBF F9F7FFF6B97363D6FC357FF4D6FC7707C05C19ED9367D4498F956DFE31EBB9BB 8CE67F43F3FF5914CD5FF35F2DF527ED02F0F6E2E63FC19BE8B6B7CFCACDFFB9 80E68FE6CD3F7B9CFFE96102313B1D37987FCC7A1E2DA3F9D76EFE3F2B609CBF E64FFB037B01D4FDBAF6CFF73EBAE71DB472F3FFE3DF68FE286BFE4975FD8AF9 5F1F45738FF927DD7041F3FFE4F52FD26DCDFF6735CCEDA3F9D37EA0E116AEF9 EF3699E79E82E68F1AE69F71786CA0963F7F4E3A7236FEBB86F0633DA20FD40D 377F47F80684F3C96DCD7F57A18FBC7A7B7DF8E645CCFFED21DE7E8EF17FCD7F 3897A0FD20FFCCBF78F37FD37ECD1FC5CDFF6D744D60D44DCC3098570F0FFC6F E421C081EC1FB37F111899733ACEFF7427E8744AD24ECCFF571C49E3FCB3CDFF 4AF37F8BEAF1FF7C53F1ED95D7CD7F77B72275FC8FE63F96F9D37E907FE65FAF F91BE78FDAE68F095EDC54F37F5DA0F371FE0399FFD1509FB2E6AFF9B77509DA 0FF25FF5DDB478F337B70F983FAE8CF6D9FD8BF1F6BF9DCFEDB3ABF75BC1AE6D FE47A386228FF00D0F58D2FC8730FFA3B90D693F9695FFEBEF29CD5FF307F347 9FE6DFB0F96F137A5BF30FFC70F473786534FFFECDFFE8B6B41F2BCB7FA5B795 E6AFF983F923CFFCB7F2BFFDAF219AFF91E72799FF95237CFB317FCDFF7E97A0 FD408D3782E6AFF983F9A35BF36FDEFC4B8DF3CF9BD5B3DECCA29A7FE7E64FFB 814A6F07CD5FF307F34771F37F95FFDDEBFB6FFE658FF0BD62FE9AFF6AE64FFB 817A6F0ACD5FF307F347B7E63FCDDC3EA39BBFE67F9B4B543AAA1198E05D56E4 6877CD5FF307F3470DF3FF92FCDD2BC79ADB67F720DFA36B7677018A98BFB97D A6377FD3F80037EC1A6BFE9A3F983FBA35FF7EC6F9171C631F6FFEE6F35FC7FC 8DF001EE19F9A3F96BFE60FEA864FE9F6CAF19716E9F9ECDDF397C27307FDA0F DC26FF9A7FA9E6FF0B38386DAB8D6462B6A298B46168FE79E6BF1D08B4FD16E0 F429D2FC3B317FDA0FDC29FF9A7F91E6CF7F706AFE9E8A15CC3F75C3E8B6F957 92FFB0722799FFE9F985CB9ABFE65FC925683F70B3FC6BFE179B3F00E4D173F3 AF21FFA7CA9D61FEF1637B34FF0ECD9FF603F7CBBFE67FA5F90B9E004A7D65D0 5BF32F2BFF31CADDB3F96BFEC5CD9FF6034DE45FF3BFD2FC01A038FD34FF52F2 1FA9DC79E69F37D447F36F68FE811908693F5056FE77DF809A7F76F30780AAE6 DFBCF95F97FF78E5D6FC5730FF15AC03F01ED4FC0160D0E67F45FE9394DB38FF E9AD83F603DE869A3F0074DEFCF3E43F55B9CDED33B772240D480090F74E3C1D 4AA7F96BFE0034FFF853685DD4FE41CD5FF3BF68FE06F603CDDF8FE137A3E6AF F903D0FC6B5063B44FC1D5D0FC8B9B3FED07FA917FCD3FBE92997E1CC06D346C FE37EFE3F4B61A9AFF3D9A41FB01EFCA9E9B3F0F0170BFF93769FECC5FF32FE2 1881A105B41FF0C6ECB9F97F0380DBD1FC35FF710523703821ED07BC377B6EFE 7F01403B347FCD7F38BB084C2148FB016FCF9E9BFFEB0D5DBA74E9B2D5A5E6AF F98FA216F19A01C03BB4ABE65F96CF07AD71B700FAA1EADBBC76F36F7544436F ABA1F95FF18AA4A10500BC497B6BFE053FB2BF9480FC03D39B7FA5BF21559B7F C363997B5B0DCD3FEF73F668C290D329C401DC29FF47EFD399CEA997D1FC9F35 A6ECE573352ADDBF4B972EDB5E3EDFE695EEBF52F347BD53AAADD3FC014CC09A CDFF8F6A3C9500C0AC547D9B576AFEBB7C7D0A7CFDB0FDAFD70502F7F0F6433C E147CFBBC326A7545BA4F903C0A0CD1F007AE6B6E61FF0F648A5BF68FE81DBDE 6FFE9A3F00CCD7FC01600E8A34FF24F37FEE9BEC7E35902ADEF1E6BF7BFF472B 93B40BA0F903C0DCCD1F006632FFDB9A7FD8B1EB35FF53B77FBB32694D347F00 D0FC0160B5E6BF2549CB3B31FFD4D5D0FC0140F30700CD3F30EA664AF3D7FC01 40F30780159ABFD13E9A3F0068FE00A0F90F64FED947F86AFE00A0F90380E6BF 9D4EE72DB05F9CDB277C7C41EADC3EF1F2AFF90380E60F004B35FFB293E41799 7EBFDEE36AFE00A0F903C0B2CD9FF96BFE00A0F903C0DCCDFF54BFAB9AFFD19D 577D5CCD1F00347F0098B8F9FF6A4A6FABA1F90380E60F00B336FF86BEFDA9D6 BDAD86E60F009A3F00CCDDFC1FB7F3A5D6BDAD86E60F009A3F00CCDDFC99BFE6 0F009A3F0068FE9ABFE60F009A3F0068FE9ABFE60F009A3F000CD7FC6BAF5BA4 F9B75A0DCD1F00347F0058A4F97FDEFCE73F3437FFF8D5C85852F30700CD1F00 34FFAAF29FD4FC2357236331CD1F00347F00D0FCABCA7FEA689F98D5C85846F3 0700CD1F0034FF5D5B2EB5179031CEFF68355EAF8C5F40F30700CD1F0034FFED A1B53F5F6865FE47ABF1FCE7F687D395D7FC0140F30700CDFFC8BA1B9AFFD16A FCDC10B9E69A3F0068FE00A0F98FD2FCAFFC97E60F009A3F0068FE4745BD95F9 9FAE46F8FADD1B6AFE00A0F90380E65F9511CFE4A5F90380E60F0073377FE6AF F90380E60F009ABFE6AFF90380E60F007337FF9F075432FFC861FC49070268FE 00A0F90380E6DF9BF91FC97FE46A98DB0700347F6E0040F3BF62FE3159BE94F9 473E68FC8A69FE00A0F90380E6DF89F99F26FDD3D508DC83E60F009A3F0068FE CC5FF30700CD1F0034FFBFD71BEDA3F90380E60F002B37FF758EF0D5FC0140F3 0780959BFF3AB37A6AFE00A0F903C09ACDFF0ACEE1ABF90380E60F00A334FFD5 CC5FF30700CD1F00347FCD5FF30700CD1F0034FF22E69F318CFFF4869A3F0068 FE00A0F977D8FC4FA7EE49FD2FCD1F00347F00D0FC3B34FF578D0F54FDA3FF8D 5F0DCD1F00347F00D0FC7B6BFECF7F6E7FD0FC0140F3D7FC0168FE838EF37FFE FC7A7DC6029A3F0068FE00A0F97768FE31E708CB5846F30700CD1F0034FF7ECC 3FF2D4C0198B69FE00A0F90380E6DF89F947FA7CDE929A3F0068FE00A0F9F7D3 FCEF5F0DCD1F00347F0058A4F9DF46D8FC5BAD86E60F009A3F002CD2FC99BFE6 0F009A3F0068FE9ABFE60F009A3F0068FE9ABFE60F009A3F0068FE9ABFE60F00 9A3F00346FFE1F8DE86D35347F00D0FC0160E2E6FFD18EDE5643F30700CD1F00 666DFE088C02D2FC0140F30780CECDFFF9E7EEB4F9E3D4FCDF745DF30700CD1F 00FA31FF3FFE8DE67FB1F9BF3E999A3F0068FE00D0D5689F279AFFF5E6FF4A9E F9EF7E0BE3331A00EA35FF2BDFD502C088E61F18E7FFED1F02F67BBA403C91F7 F37CC4D7E5B73F175CB1A335DC8EF3BF68FEBBDFC2F88C06804ACDFFE277B500 309CF987C7F9C7C8F3FDE67F64FB81056A9B7FC1B97DDEBE85F1190D00959AFF C56203006399FFE9DC3E9175FD2DC8BF19F2F6CA6D96DF5DE6E856A9E6BFBDE1 D14A06567B7BAB1A73FB6CBF85F1190D00959A3FF307A0F9679BFF69787FB3E8 8C86BFBB2F90F770E19BC77C89603E7F0018BAF99BDB0780E6BF3BDA27E987A3 113219FB088174FF764D602725635C50AAF99BCF1F00466CFEE6F601A0F99735 FF57E2CDFFE856D7CD7F7BCFDBD13EA7ABADF90380E60F001337FF5DC78E6FFE 195F046C6FB51D8D7F74ABF87B8E3C3A58F30700CD1F00A66FFEA963664A5D19 1EED73D1FC8DF30700CD5FF307A0F967987FEADC3E81E37063E6F6C933FFECB9 7DB6CB68FE00A0F903C094CDBFF67CFE65A7FDBF61C5347F00D0FC0160CAE6CF FC03E6AFF90380E60F00A337FFD34362EF37FFC8FD11CD1F00A0F9034064F387 E60F009A3F00ACD0FCA1F90380E60F009A3FF3D7FC0140F30700CD5FF3D7FC01 40F30700CD5FF3D7FC0140F30700CD5FF3D7FC0140F30700CD5FF3070068FE00 A0F96BFE0000CD1F00347FCD1F0098BFE60F40F37F9AFF97D372FBB0F36BFE00 A0F903C0D0CDFFE9B40C3FDEFC357F00D0FC0160ACE6FF0DE968FE00A0F903C0 58CDFF2FE4A2F90380E60F00A334FFD73F832EF32E6B347F5FA900409FDFD502 C0A0CDBF2C9F7F426BDCED106B58B6F9FB320500BAFDAE1600C66DFE05D5F7CB ABBB95FFDA6B58AAF9FB0EC5A54B972E7BFEAE1600866BFECFF1E4652F9F125B E9FE3B5FC3EBCD7FB56F610060B8EF6A01602CF3FFA31A5F5EFD47C7545DC322 CD7F9D6F610060C4EF6A016020F347557C0BE3D2A54B97737F570B00806F6100 6085EF6A0100F02D0C00ACF05D2D0000000000000000E89CFF0FEBFBC679 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/initial.pdf0000644000175000001440000005731010616356707014126 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`bi`ªg62¶4Ð3QÐ54Ò3·4³TÐ5Õ3´´42‡¨·PpÉç BŽ > /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 21550>>stream xœíÝ¿ª$IzþñXÉ—!§1ú ¦Á04¬c¬±ÍÂÐmè º1æ\\íÎÀ"k¬11Žü1väj¯@ _1ñëÜì̈7߈Œ?oD|?FQ'++3êTå9O>••õ³ÿû¿ÿsf÷3¢?°¢?°¢?°¢? ®Ÿýìg½‡KÛ?ÑP×#úÿû¿ÿ{%ÿîw¿ûöÛo¿þúë €jÿ{,ÿ«¯¾"ú˜sm©ÿ8¶èÿøôË_þ²àåãÿåc±Û¿ÌâËç’K.¹¬}YûïØcù¿ÿýï‰þ¦µrÇ\{„¿û¸=RòÏÈö¨ì¶Ç[|ÉÐF½¿c%ÿíßþ-­?€™­Ü17n2ž‘‚O´çÿe’ûŒ«êß1Z“[¼cnÙ)ž¿.¹ä’K.ë]îÿÞÒú˜ÙâsÕ~[¨õ·ð‘K.¹ärÖË}óõ-­?€¹Ñ1Wú/⯗jýË©óüÀÒ‚o‰þ¦EÇܬ=ºóŒ<–SéÓØ°¬7oÞÿÞýL‹Ž¹ ¹=RŠ=#¥>í×Òý3Ö\rÉ%—y—¿`¿üéOÙý¥ùè¿M¡õ0?:æR.Û#%áùÝíÏ$|kþÓ¦ôm¹s*”ú;¶ÿgû»Mô0›Å;f×°=*õŒÜyº þ÷¥o?œI¹È_žóß1ý;Õû9÷­ ­?€UŒØ1Ú)Õ{Fnþ÷ÝÿË´|H˜ÛW?‰Ýzg±‡Ka¶Æn®ºãȱ‚R·ƒÇbÛûÁ~6¿ZË®c·=R2øŒlô2øv§ èõ–# «úw;{9´þ–3\Çúï÷"ˆþP–þþÝÚm"ÑÀÌbóo~ó›~ƒÒ«W¯äöH)øé Gë¥m­?gø°ŠXÇLôOòüüüOÿôOr{¤üô­?·oý9À%Ä:fýÿë¿þ«ãØFñ/ÿò/Ký]óú;Z(ÖÀrb3Ñ_oý+ןÖŠ£õ°Mëÿúõë~Ôî~t¤­?ŒˆÖÀr4­Çèÿüüüöí[Íœí¹ÖFDë`9úÖ¿ýÁ?>R'EÿfƒÜÖFDë`9úÖŸè¿‹þ´þ0 ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°œ;­ÿÓÓÓËËËy™±éš[÷îDÿÇZö·*רG룣õ°œ;­¿×‡Tœ˜çfôßA¿¿‘16Z­?€åÜlýÝUôßÚ÷ýÝ_v FÿÔب΃9Ïy­?ŒˆÖÀrn¶þ>.Ÿô>Üïo:\q"u°•¯ýc£:&8çyl´þ0"Z˹¬¿ýÏ3¯8Ñ_9ñ<6Z­?€åÜoýÝUÙ¿Í?bôß/ÖfBë`9EÎð‹þ—üØþ±ÓúÀèhý,§Hë»n'úßêy´þ0:ZË)u^ế²½-Ð,úïo ž†È…Î;$Œ?66Z­?€åðm¾yhý`t´þ–s§õ¯mÄèO룠õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°}ëÿüüÜe„IÑ¿ñ iý`\´þ–£lý{å~—ýÛ’ÖÆEë`9šÖ2Z­?€åhZÈhý`D´þ–Cë­?ŒˆÖÀrhýï£õ€ÑúX­ÿ}´þ0"ZË¡õ¿ÖFDë`9í[ÿ§§§óÄ———²«(»@­?ŒˆÖÀr:¶þõzÇèO룠õ°œŽÇúŸúö†À6ÝϳÍégØO9ßë¼Úhý`D´þ–c§õ?¤ùCÖ¿œx˜Ö £õ°S­ÿù¦`²¿œcý—hý,ÇNëï>þ°>úï—Ð=úÓúÀ(hý,ÇNë¯/õc3Ä–\­?ŒˆÖÀrì´þIÇó8ŽõÜCë`9vZ÷ñÉyçöÙÏ ŸáÇ}¼oЭ?ŒˆÖÀrý6߯½¾ŒÖFDë`9[ÿT±ãþ»£õ€ÑúXÎX­û¯ëÒ õ€ÑúXÎ@­¿Y´þ0"ZË«õ·‰ÖFDë`9´þ÷ÑúÀˆhý,‡Öÿ>ZQBëÿøÓÜoœpM™85­¿¶8xûö­¿Bë#Jhý·?ÍÅù}ޝ¿þºÆÂXðþýûÇe½ÍüñgD_6kZ¢ÿÙ»wï¶·Dhý`Di­ÿ¶—àç.uéÛ-_>—\riárÛÃ/¾dÿ§#5ú;Eë¿•ÜxýúµÛ Eë#JnýÿkKÙg‚²K`Á~¿Æfž”8õ­?Ñ#DÿÃo’ÖÌÊlý‹ÃGr?0±z›yjâ¤õÏ@ëÈoý·V†K.¹ä²ËåþoÙ·´þ•ÑúÀnµþþ÷sÉ%—k^ú¿By‰“Ö?­?Lànëÿø_ÛcØVw'qÒúg õ€ Ümýÿk+ñbÞ¼ys'qÒúg õ€ hýKñÓ¯¥ûù¹ä’Ëý¥ûé kÛæþ/Oð/—ìNëÿôôôòò"_—çÔß½Z˜@™Öÿw·OÙñ-gøL*¸m~[è¾û¿ëìÿßlý÷5iÒÅÃ\ö¥}öóìÅæ×;/$ö0•«kÿ»ÕüÞ.¬r`ú[3QÒªrÙú_þ*¶å¸‰ZÿÑúÀÊ·þ©#xÜå~ë¯Icwâév—sÊÔGØýBÎÓóÈ¿ åðô ¬ñ»U.Sž¢_ˆæ^Â#©fÕÃÑ´þÂç¥Ñú‹Ö&På ?Iqç«M^ö~ògÒåáq%­Qžóy-IË-¶ÁïV9ÈØ˜ÏOJÙ‡“wS©§Ø‚Ëmóü Œ-ÇÑúŒÖ&0ê~Ü)pì3D,‹¯ëÓÛå!ÕÈ…Êñh†\òv½öïV^ŽüKÓü2/ŸaØÊå%Œ‹3üý7´þ0QÏ븉¶eœ×?áANÖ&0pëÅ‘û õ'úohý`´þ¹¿™Å[ÿwïÞ%<ÈÐúÀÐhýD5hýõwoßú“ûÏhý3<þÑö€þþïÿ¾÷  õ ©Úú{ʀƭ?d´þz[ô?ç†ÇM‰þ²ù¸ü‰°1 ›ðˆhýDÕný³—Ó õ‡ŒÖ_o çT!Ü ™¥6Ò2­¿¿óÖÓä]>2Áû÷ïï,K.¹¬qYjÛtö"î/‡Ö¿;Z½}b8¤á&m¬¶…¦µþ_ýôÍ»9üÿ¿ö«_Ç{ÓöO€)·ÍR‹¢õïŽÖ_O&¦ÉÀ(Ü<ÓZÿ/¾øbgÿ¿¶Ý`àÿ—ëýû÷Ûã­ÿÓÓÓvýåå%ãî÷ª‡Ö_/é‚iâ`ßšÛfαþžŸÛ}èÉ ™W¯^m¹¶‰oÞ¼1Ûú‚{FŽ·ý­¿(öÁAá3…s$ À²e7ÌäcýýõsOmëDצõ?œÎÛýdñcUck ÎYv »-ë|±)—ߪöÐOÓšhý õ×»&HÿÝ¥f}{mdo8ëDÿF­,fUþÊžÇps03åU?Jh- £Ò øò$‰°ŒÖßZ½›a‚ôß^Ù¸Ãn@%w6™u¢¿kÖúë3YÑ¿Ô`Æþe5ŒþN³Ö߯goß¾u´þ)î‡ Òmâ~ »¥ÜÜXÖ‰þ[ÿ؉ð’\²-ÿ0†ûG¼h;=Ÿ<³<ýæÈ/¿{èÎØä™SÛK‘_E‡ñ_¾äJ½PJ³ÖŸèôîÝ»ýï‡Ö_£H˜ˆôsš8Ò^߬/cO OpsHúJìu¢¿ëÛú¶qgµA6¸Šâü\®H9³þúý‘»Ð/¼ÔØ‚3¤ŽPý«þæÑKãÖß7Üð^¿~í>þýÐúk ÷“Íâ,Çýv4Jí¯ýÛµþ‡)±´}HuÙY6¶Fa5¢lEî”#/G%O.${ü‡á)Ÿ”¤±å 5ö6‘òU$ßK9½4ný‰þ{±èïhýEeÃÿ$1ëËØ8+¸Q¬ýÍÖ¯Òá+òªF?à'¸ÃòkGÿýõD3¶Ã¢?’ÐúwD럧x˜ ýËæ‹û1ì¸Ò›Ã:Ñßܱþ¥–ñè¿MqWñúòWw9±Þ9¼?Ðæ‰Ãê²Ó<Ñ8´þÑúç©&HÿëÄý˜5wŠoëDg°õ_'úkfVFÿsÎvöØäéDÜDëß­žJabñôOÖ—­°'PcX'ú[lýÝDóM  ±Qé¯ßŒþîã ÿþxc Î:H!Žk~™I¿y¢¿)´þÑúç©&V;íq?Ï”»•>ò¾NôwÖZ÷!~y7ƒìÁy/‘o.²×!dÇýö·ž§»ø/$8ýÎȃSŽ-îƒc;/$ixšè/¬+¸›-ÑßZÿŽhýóÔ± 4AL!ë×0Áž@½×ü:Ñ¿QëK–“¥å±aÝ[ÿJÂÛ­žab¦ôOÜoiÄÝ€ª¯öu¢¿kÓúã’åÿ–džutoý‰þ´þ©Ú„‰¡Ó?qß‚!vj¿Î׉þ´þVXþ÷oylXGßÖ?xÞyÊKè«å„ƒý‚ÇÑD럧Y˜(ý“õí3¸'Ðà¾Nôw Zÿàa÷^¥ÿvÂë­ô¼^ãÿË÷zýÆRÉãÜØ0 2Õúk>2®ÿ ¹ýW,­ž–aÂrú'îËÂn@›×ö:ÑŸÖÀÌë/Ÿ¼ër†¡£¿£õ5ÖÒ?‰&½öš½ª×‰þŽcý ÁTëïB'†R¾- ÜË,Zÿ<íÃDð‡÷Ï{˜Ü?ŸÆé¿ñ‹yèOë` ¦Z}©›!¸X³hýóô ê¢ÿ|ZFÿö¯áu¢¿£õ0S­Òñ<Žcýãhý[®ºY‚!÷ϪMúïòê]'úÓúƒ…Öß‰ß <"H>ÃÏy±6Ñúçé&z¥rÿÜj§ÿ^¯Ûu¢¿£õ0„î­¶!z}­žîa¢KŠ"úÏ­jôïønU÷­µb­ÿóós‡áXRÇÖ?Iìè AÑúç±&g)rÿ *¥ÿ¾G©YØZk+Óú“û´4Pë?Ê×uiÐúç1&bgJ)>rÿ:Чÿó ²ñ™©Œl­Uký ™W¯^ ÑúO†Ö?©0ŒVÇ@î_MÁô_ûÅ™7†Žƒ©¤Ø±þÐÆóóó@­ÿLhýóX ¾F­äóÏ?¯·pôÝwßÕ[x—­ÃÔÖZgø0’îgøY­ka¢Þ±ÔTþkº_ü[øŠË•Nýgø0„qÏð3Zÿ<ÖÂDl¥7Cî_Ùô_éYv0½ÆS­?€‘ÐúwDëŸÇZ˜Çãr² ú¯,/ú˯7ƒ[ÇLÑßÑúøÌ×Ñö†Ö¿#Zÿ<ÖÂÄåJ3FEîGjú¯ñ:¼ÏÚÖZ­?€k}£ÿóóóÁiý;¢õÏc-LhVšôQ`>Ú /é#¿š¡©­c²èïhýö™¯±C§õïˆÖ?µ0¡ŒþúQùÃÓÿÅ_„¥XÛZk õpÍfô§õoŒÖ?µ0Q6u‘û±§LÿDÿŽhý\³ý­[´þy¬…‰‚©‹Ü3Mú'úwDëàšÍèOëß­ka‚誈þÆÕmýýÿ†¹‘ °›ÑßÑú·EëŸÇZ˜(•ºÈýˆ¹LÿDÿŽê¶þÓGÿwïÞñvV`3úÓú7FëŸÇZ˜(’ºÈýÉéŸèßQ‹ÖÖÿÃИÍèïê·þÝûòip´þ©¬… ¢? ú›Õ¢õ'ú×ðôôtžøòòÒ~$µmtÊG7ŠØ«ýñ윟—mbðVazPÇÖŸÜDëŸÊZ˜¸ŸºÈýÐÒ?Ñ¿#Zÿ|½¢0ôïM‘mFÿ¼Qž»ŒGÔë·a3ú»š­ÿ¦ï×™mƒ12Œ ­¿žµ0q3u‘û¡KÿDÿŽhýóu‰þ±ìx?Sš5GôvØòv†ˆþ1C´þ›Ž™{ÿ5ÆF†±¡õ׳&ˆþh†èo­¾öÑceª<ŠHý=çÏñŸßû­ÿþñ§»Èƒ2Òú·ïðÀ ã0Ö_ÃZ˜¸“ºÈýHLÿDÿŽhýóuŒþBì³Ù‘Ï!ûó±'EùdYø\ÇÍèï‚þúž‘Ö¿{æ62ŒÃtZ ka";u‘û‘çœþ‰þÑúçküŸ¸Hã«_ˆþ_âf–@"ïù&9 ãL Ü—A­ÿÍÔˆ^Ñ?ï—#G´Œ9/?m,ܽHô¿gñèŸ7sÙWõXÇúk¢ÿá¾´þ›¢¿£õY y©‹Ü;éŸèßQŸÖ_þ_ÒG;(úË­|0”ßœS¾ûýè¯gð9ú§~l—è3ú_>k­ÿ?üÃ?hV‘íÿñý9úùå—U‡ñÍ7߇±¡õ׳&2R¹÷íÓ?Ñ¿£n­?Ñ?U‘èY½O6Q˜r9§,/úß?j‹èß½õ7ý?ùä“ü±Ô0’¢¿£õY DtAô7¢ëï¯>íGô?Ó4å‡:ü²b/XÆ7ôúGÔ1ú¥¾ÔÇþ®ÂÇ|­ÿÜﯔJÿ´þY ©©‹ÜR¶ôOôï¨ëþOô"úß9^èüclºÓÉŽþòaT×[–Í“{Òú{[î÷ФZÿ‚¬…‰¤ÔEîGY>ýý;²ÒúÇnµÌNô—ç”[çàœ ¢¿0ÎËCóõÈ}œéƒÇÞÈ•sL^ô×üZJ­·¬^Ÿ1uCµþûÌ}ˆãz#FZ™µ0¡O]ä~ÔðHÿDÿŽL´þD ¢ÿèïNq_Ø ÐÈ~:òrç.EØŒþ¦ZÿsàÎKÿ©Ñ?¸–ûéŸÖ¿ ka‚辈þ}Ñúç3{^ýa<òå›,Dÿ¤ãò…ƒ|R+ÿ¤1ýo¥õïý«Þë_äó¾´þY ÊÔõù矷ôÝwßý{¡õÏgüÛ|ùèíÍU .?Ú›´´Ô1ýo¢õÃÔÇ|­¿ÈZ˜Ð¬”¾µ¿çëÀÚÖ1Yôw´þ:FI~—7¯P¯118`yžŒw‚kiý/Gűþ2Zÿà0LEZ™µ0Aô‡Dÿ^hýóu CÊ+Üš:1éSªW¿?KóšsÅ$í*hä½Câ²~«E|“Íèoªõwý>æëzGGë/²&.WJîGrú·¶uLýßæ›¡W’?äûЪp¯XVÎÖ%ú ã .§oôF›:¢¿ÙÖÿ&Ù ~ÄèOë/³&ä•’ûÑ’þ­m“E¾Í7GÇ0ät5ÿå6IŸˆÍÐ+úŸï›GXH³èjÒ}ïø&›ÑßZëŸçð^ÁˆÑßÑú‹¬… ¢?ì ú·×­õ÷WJå°.úF %ÿj~~î5€)[ÿàÇFŒþ´þ2kaBX)¹íÅÒ¿µ­c²èߺõŸÑëx¼Ú;æ~7cëÌèƒFGë/²&b+%÷£—`ú7µuôO }Zÿ9ýöfjýÝ)©ýiýeÖÂÑÖý[¢õÏGôÚ›¦õwðãhýEÖÂDp¥ä~ôuNÿv¶ŽŽã©Ö?ÑhošÖÿ|&PÿE¼#FZ™µ0q^)¹Ò¿‘­£ïxj õÏGôÚ›£õ¾`ÄèïhýEÖÂÑ6ýÛ õÏGôÚ³Ðúûz>û!Èßü5bô§õ—Y ‡•’ûaÇ>ý[Ø:”7…Ö?ÑhÏBë¿}ýVÆø/¿ñwÄèïhýEÖÂÄ~¥ä~X³¥ÿî[‡þ¦±Ðúç#úíiý·[õ;ç“ùg1úÓúˬ… ¢?,#ú×FëŸè´g§õ?ö‚gò‰Í{þQy÷" Ô_O^—èoü¼þµõ­¿^ƒ0AîÏf'÷{¤ÿlEÒÿ:ÑßÑúobÿMý•—Ó‰…ÙÎež‹Ÿ?;µð›†©èž«fc™x»×6³&©»”×Xê]èUw^þe+|¹4×D÷Öÿrb3v¢?­¿Œèo“µÐ¿Ç@¢¿­-«•÷ÙìD ¡cëï²¾úªž¾C¢õ×#úd9÷{¤ÿTD%Zÿbbe0dD$éÕúã€Ö_¯A˜øÃþðgög÷—³û¹ß#ýëýÏÿüϧŸ~z9ëDZÿ2bE@@ôG’^­?hýõÚDÿÇ%éÿÒ(¡€KÜÿ¸$ú+Ñú£3¢?΄?í[ÿׯ_ß|8wlƒ12Œ ­¿^›0Aú¿4bî÷Hÿ‚‚¹ß­ýiýÑ ÑgÊèߦõÛÅÛ·oM cCë¯×2ú;Òȸ¡€3ŸûÑ?EõֿŃÀà|ôï= Øb­õo¿_êé!úwÆa:­¿FãèïHÿ›#÷{¤ÿ½-÷;¢Šº­ßw¨ ÍTëß=sÆa:­¿FûèïHÿÌ”û=Ò¿·ÏýŽèŸ¢nëeÑú÷Æa:­¿F³0Añ¿7_èßc FåïVŠþµZ(‹Ö¿ï0Óiý5ºD·vúŸ;÷{+§ÿJ•¿[)ú;ZCèÞúùå—åMÀ7ß|ã¯ÈÑ¿×06´þz½¢¿[2ý¯ú÷Ü8ä~GôODë`$Ý[ÿ¤ÌýÉ'Ÿèg~øñÇõÑ?uáE†±¡õ×ëýÝbéµÜï-•þϹßýÑúÉX­íèÿ˜?iù~±´þµ ˦ÿ5CÿÞ ;µs¿[)úÓúÃ(­¿Ð>ú_ôm¡RôOÚIȈþŽÖ_Ô=ú»ÙÓ?¹ß›;ýs¿#ú§«ØúsRÙÌž×_ý·¨­‰þ‡„âÑ¿_q9³£õ¯€è_¹oâôOô/¥bë￳ÍÃÀ ü—øö̾Ýy”ÖßS¶þû9ËFÿÃGÊ‘Ðú—e!ú»Ó?¡?f¾€XîwDÿtu[¾¥—x‘LlŸSß·õß'r9úç,ýƒŸ4Ðì-Ðú—Õ8L,’þÉý²™Ò³ÜïVŠþ[Rd¼HfuÈîúèï_ƒ¶þ‡8.DÿØœ¥¢¿ð cÍH´þÙ‰þnŠôOè×›`@ÈýŽèŸ¥Qëÿø÷Ðæñ` ?üðƒOxþErÎ×ùû§|RüùϾŸíW¿úÕ¿þ뿦8õ?Îdë¿×ý€DZþ˜ŠþnðôOîO5tú—s¿#úgiÔúýqFôŸ˜&úo)?8qÄÖÿœÅƒÑ?Ù‡ŽþŽÖ_d-ú»1Ó?¡ÿŽw.s¿#úgi×ú¿¼¼øéOOO€¶Ù¶9cw|LϘ"¯:8sÒB Œþû_µðÔ'­h»{ê³=ÖØl]6µ‰þÎRë/zy67xô§õ—µó¥rÿ}c¥ÿ.¹ß­ý[´þš}˜gÿc^Ð'ú[vŽþ‡Ä¼ýxžît9>¸÷Ø ”§Fÿùv.£¿ø‚ÓmýÏ9àÇÑú‹ˆþ7‘ûK(ýýëiÚúWþþGa —ˆþeGÿà” ì;ÞDôoý™Öÿ²Ëæ9Ì9bô§õ—ÙŒþn„ôOè¯Áþ€&÷;¢®n­ÿ¾ˆÝnJŠþÁbw9wÆû»†ʺ<Ö_ˆþ±‰úybϸ‹t¤yEe,¼ýñH ÈÑËý±›Æjý…¾zå‰8þŽÖ_d6ú;ÛéŸÜ_åô¯ÌýŽèŸ«Oë¿O<‡ë5¢¿°:wÚçAA ¢¿‹ä£m\^?$þ› ™C›èïÌ´þ1Ýøió•^´þ².abèôOèoÃà@ßÜïVŠþ­[ÿXįý“Vwç¨!èÅ¢¬D?Ü=).ŸwbÅÖ"ŒäN»ú-,ý¹?xë@­öÉõƒþŽÖ_d<ú;céŸÜß’©ô¯ÏýŽèC·Ö¿HôwñÄguDÿ6Jµþ±Æy¢P´Êûó¢4óÇöUˆþ®Nôw½[ÿ¼ïÓ ýiýeö£¿³‘þ ý½XØHÊýŽèÃØ­¿#ú¬Í?ÊeÆZüËù÷SÜÕ~Ñÿñt»Ÿ’}ìŽÛ £´þå±ø#FGë/"úkûûêžþ‰þÍÐúý»é{†Ÿ›éüò¢¿‹D!÷»ÄèﺶþyÉ>h¿¨‚Ñ?øžƒfoÖ¿¬^ab ôOî· cú7’ûÝJÑ¿CëïJ|Ì7vÓy9I«‹Í²úž×_Óú+¯ëß"Ð,dš¯ô åXÿË#yô{‡?bôw´þ¢Q¢¿ë‘þ ýÖ´ßHÍýŽèO·óúÒÒùhiw: bvô-VÞÓõý6_å±ûû½ÄËêå±þ±èRög† ðsÉ~ë_$ú³ûˆÑŸÖ_6PôwmÓ?¹ß¦–é?#÷;¢ÿ=&¾ÍW“­Éßó¹<Öß”ùŠùªò¢¿=¸qZÿ˯ñÄ‚{©è/ìœ\î0Ðú—5VôwMÒ?¡ß¾;y¹ßýï±u^Ñ>Dÿ‰ÉÑ_Èô£ë'úË‘½Hô¿ó¦­qÄÍôOîEÕôo0÷»•¢£ÖßO?Ø gúØQÑbm¢ÿˆ­ÿåQ:÷£¿òŒ¢òiý 1ú»:éŸÐ?¢;Ù¹ßýokÔúOuèâeŠþHBë¾IyF ›Ñ?é›bã§õ/‹èï‘ûÇU<ýý;jÔú“êpFôŸ­ÿá&ý™@ïDÿÔo;ÓÑúW0hôwEÓ?¹tÓÿÜïˆþ·µkýƒ§F‰‰nåÆ#-,v–Fè]FÿÃ917±_µpHXÞ³ÃA>Ùhý·›ROÿŸý3r¿ÜK¡õ/¨o˜èžþ ý3¹¿`9÷»Þ[kíZýw0ù+š¯pÒ,³Fz žÊ©äè/Ÿƒß]¥yýó"ÌÉ“›Ößß”ñµ_yÑ?;÷oû*´þ ýݽôOîŸÏô3÷;¢ M[}ŠR~{+ÑhBôßN¢Ÿým¾E¢?²-ÒúËò¾ë75úßý{~´þeý]Vú'ôÏ-cà~îwDÿºµþ‡oMº vÁ)ÛSÜ霡û;©h0ÿÉË´y0Ò(bÑÿœø3vübwÙ®k^!ö<3k‘Ö_—û]ѯôÊCë_ÜÑß%¦rÿ ’Ò‘Üïˆþ%ôiý/”Ïhýcˌͣ†f™dÁ<Áèü݉þy¯žñ<Ó·þõ$EÿJc õ/«{˜hYüúW£Ü¢òw¶Öú´þçwŠDÿà2õ¡ír¥Á²ÎÑ_ó ?ßTäÙ<|Θ'ZoúÖ¿}ôï2Œ ­¿^÷0Ѭø'÷¯é2ýRù;[kÝZÿÑÿp«&¦Ë§Ž!úWÕ>úæÑGÿýÝyº5&ný›‘£¯a¦Óúkt¥¢¿Ó?¹eBú/•ûÑ¿i[Í<±£;b+%ú—ŒþçÙ‚Ÿq·[ÿàtÍ+Ó‘þ&ný›(ú;ZQ÷0Q0ú»Pú'ôÃ;ïÌýŽè_ÈT­ÿÍ`Gôo,é¼þÊ/ÌP$úkV wýý3Dë¿(úÓúË,„‰zéŸÜ½}ú.÷;mÝZ×éc¾±Ö?x>æ[Uvô×TïÙóeg¯!ú ¹ßÑúï ý­¿ÈB˜(ýÝOéŸÐ˜Ç@ÙÜïˆþåt;¯ÿþÈéìÖß…òܶØó<Âñß/W§tt‘Cƒ‚ÙŠ›o𾇉Á…Ä^!ëŸ-ýþóŸËwüÕ¯~åhý2Pô§õ—YÅ£ÿßýÝß•] &³* ¢)&¾ÍW“žIØó¹ŒþW›èß²õ—߬¨çý»cCë¯g!LþŽô¸â¹ßýË1z^ÿ3¢ÿ|ˆþ›¬õï¸ÝÇÑßÂ06´þzFÂÅ?š´òwf¶Öªš¶þ~º|pÎZÌŠè?±™ZÑúë ÿhcÜÊß™ÙZ«j×ú·y<Ñb3µþ{±w)óÎúZéÍÌà' „¯ÈÈCë¯g$LýÑÑ߸v­“‡ƒ‘ý'6këó3K÷ï’´XáÊ}´þzFÂÑmýkz¬¿Ÿ®<¼ÇEZ«ÃÌÙ'{)8Ò’]â‡&Vä ?òÙúùˆH/·þÁÏ,or¡I%Ý%Ïöâß(ïäm&´þzvÂéµ û¥­µgøÙȧV=úsJÐ9úÇN½/ß´Ÿ‡èßÑô­¿²YWN,ûÇ!{Ihýõì„ ¢?j#úÛ×í¼þADÿ¥ÑÿÜåïyÐ š™¾õ^u—/¿ù¢?­¿ÌN˜¨ýéÔÈýŽè_Z·Ö?øfô2ú_¾·|W½Ôü.þ™¿ý­‡åÇXôW œ‚OJìЋşšû¦oý]ü€áÚvýü ßÏÙ2úg¿Úiýõì„ ¢?ª"úÁîyý…wöƒËéuýrT„˽`ô¿úßùµþŽÖ_d*LPü£’ *glk­¤[ë/DMÊ—ïXpúaDÿ‚GÿÃÝ‹ÿ€½ZÿóÛM‡›\ä(Á-p_Þ%2úŸLBë¯g*LýQ ÑæZÿØ¿" ­¿<˜¤Q‘/]$úŸg‹“—E¾Ky*‰þeMßú'ÝÔ˜ò]Saº­¿žµ0AúGqsä~gok­ÁVëŸúoÕHôWþHô?H:¯ÿe”¹ýÏ—…âºVhýõ75¦Œþ7Lë¯g-LýQÑ ÝZwõA؃Ôè[~½ëšµý÷²£ÿÓé£Õ‡ùƒKp‘Ofó¼Ô0qëïâ'õ2òâ9¿ÂÝil÷_ê´þzÖÂÄc¥Ÿ}öYñÅýWV#úÿý÷]¶S[k ÝÎë>ìu?q#g2ùÀ¡óò«¸f~IöòC bºBßæœ?8Ex*y^Š›µõdžÖ_ÏZ˜¨ýéU•*¢%&¾ÍW“·Èdó¹Œþ׬­?6´þzÖ„_)gùD)•ÎéÙqëH½i,vÏë@ôŸÑb´þÓ£õ׳&êEGú_O½£ü‰þ•4mýýôó!r¦?ÜÓ úOŒÖz´þzÖÂĶRŠÜWïk¼ˆþ•´kýÛ< „è?1ZÿéÑúëY DDôN»Ö¿ÉÃÁHˆþ›©õ÷¥—m0F†±¡õ׳&ö+%ýãŽz¹ßØ:ô7¥é±þ~ºüeXÛõÃqAš{qDÐX‚Ñ?vr¤ý/ã•ÐÝL­ÇÌýø=l»ÄF†±¡õ׳&+-žþ‰þë(ý÷'ò·°u(o‹‰3üxò™:cßÇä®N_ ³‚ßæ«üÎ5—rŠO´7_ëßþ( ÿHÑ¿û0Óiý5¬…‰ÚÑß­—þ¿ÒÇå¹P¯jåïllÊ›ÆÒí¼þgyÑ¿ø÷Ô ™Ëè¿Iz¢y X0_ëß=sÆa:­¿†µ0q^)Åÿ>÷{sDC¥ª•¿3³uôO ÝZù+±œ"úkö%«Øî%Ÿ]4鎇٠w'ú»Ó+Ä_Ñ|#[ökz·þ_~ù¥fÙ¶ÿ¦rôï5Œ ­¿žµ0Aô/‹è_ Ñ¿ Cçõ/ýcÁN¸®ŸY¾ J±èþð†üÈx®c×/Ÿw(MÜú?2÷'Ÿ|¢YK†üQý» cCë¯g-LWJúϳÏýÞéðRíÜï,mÇSCŸÖ_åï·þÁ™c‹+N¿3xÁèïB‰ÿ2ú+?!pó5½¹[ÿGæ~„cÍŠ’øÅ&EÿöÃØÐúëY DÿRιߛ# ʈþãêÖú7ˆþÁÓÂhbßa9±ô™tÚœeÌW¾5é©$úW2}ëOô§õ׳&b+%ý'‰å~oŽŒÓ ÷;c[G¯ñÔ0më¯é5±O^pùÐký/ŸJ¢%´þJEÿý@ã¤õ/ÎZ˜ úAô/ˆèß’‰Ö;Â;)ú§?Ø#¶.Òá}w¢ÿåË)x/ù¾Dÿ‚hý[4?,¤Hô? u¨´þÅY ÂJ˦ÿ‰£¿œû½9bbPÙèÌýÎÞÖ1YôïÐú»Ûó=,'¶ØóuÍ?ò…Ù Wê¼þÊçÝÝ~ @Ö?è˧‰þŽÖ_d-L4‹þnÒô¯ÉýÞIñ Måïìm“E×þ¼þûã°î0ÑéŽíq§|¶ŸÜÁ®ǦY~l8+øm¾‡çBÿT&½ Gë ‡þmžA£?­¿ÌZ˜WJñ/;çþý«ôüãáÖ9Ââ^›ÊßÙÛ:&‹þ&¾ÍWÀS FÌÖ£ ýÛœƒFGë/²&.WJúì£ìõ¹ß˜#,nšå~goë˜,ú; ßæ+ úO‰è?1Z—ú·ùý˜/­¿ÌZ˜ úgÛr¿æ•¹íÌ‘=¢ãñÔдõ÷Ó“B|Þ½0¢ÿÄoýSCÿv¯Ž'÷ôc~,Ö¿8kaB³Ò‚éšèÿø½å½ ûsDÆ–¹ßÙÛ:&‹þ®Aëßæñ` Dÿ‰-Ûúß9Þ¦FôWγ-­qÖÂDãèï&Jÿ‹#úÏý[´þMFBôŸØ‚­°éߪtͨ ð³M—ÜQ¡õ/ÎZ˜Ð¬ô1ÏgŸ}VjDÿ9Œþßÿ½æEhjë˜,ú;Z´'DÿËOwè¿êÁſַ’Ë/H]ÚaÊ¿-Õú_ž²ó<1¨àÇ|Ñ?8€sîw´þuX í£¿#ý¯låOôïˆÖÝÄ¢¿æ©Ñ_øZ€âŠGÿ–ƒ/eÖÿò3µ-£ÿ9è+‡·Ÿ‡Ö¿8kaBýópÄ?6£ÿ§Ÿ~ª–Z©’µ­µZt#DÿóW¼܉þÂÝ‹(»ðƃ/eÖ_¨Õ÷34ˆþÁ”¯yGâ0­qÖÂD—èïHÿ#+~”?Ñ¿#Zt“ý/¿·+¶Ã §gÍ7¸í‡|S"8†Ãýï ^øªã–lýûFÿXÄ÷óÇpÞUØf¦õ/ËZ˜HJ]ÿp¥+—ø"lÉÚÖZ­?º‰}›¯ðõºçt»¾Ìñ—‹ Fÿ¤1죯Á÷z‹`ÁÖßõ>àçpvÎóœî@ Zÿ⬅ ¢?Rý{§Zt“ýƒ XHÆû‰û…ùåŦŽA?CÙÁÇÜÒ:­¿³ñ1_å›îþAl´—ÃØÐúëY ©©‹ô¿¸â¹ßý»¢õG7çè/Ür3=ËY¹Ø^Ñ?uðÂÒšY§õßt<¹çeî?O˜ŸÖ¿8ka‚è$DÿŽã©ÖÝ£ÿy¶âéYsw³Ñ_÷¢¿‘Ö¯ýWz]q›ðhý˲&2RéY5r¿#úwEënzµþÙ‹(ú/rÀ³Ôúï)Cöù^w¢Rå/ÏLë_–µ0‘—ºJ¥¢ÿXJEÿÃw÷ý;¢õG7‡èÿÈÁœš÷Ûóö?&-j».$øØ/£¥ÁÇ jfÙÖ/uà~ë¯t¹ßBë_–µ0Aô‡Ñ¿ïxj õG7IÑßí>ðú’~rÏÔs˜¦¿ìNë)´ìç1(ëù²ƒ?ìBÄö(j[¼õßÓï´‰þ7÷@6´þzÖÂDvê"ý¯¦RîwDÿ®hýÑMì¼þËê{t~Y´þš€ÚÑ¿ÈqGZ=ka‚è%¢÷ñÔ@ënˆþš~EëtyÐRßæ{4ZZÿ⬅‰;©‹ô¿Žz¹ßý»¢õG7D?Üht´þ‚ØsoFÿRhý‹³&²S×üÇüÕ_ýU‘1ýí+ýÿ÷ÿ÷oþæo‰þÑú£¢ÿÄhý3ŒýiýeÖÂD^êzä~¥Hú'úÛW$ú?r¿¿rHÿDÿŽhýÑ Ñb´þÆþŽÖ_d-LXˆþŽôo[ÁÊß_!úÛAën„è/œÌ>ÕÏΦÞwºžŒuåÝÑ&Zÿ ãFZ™µ0‘‘º¶ÜïQüO¯låïíÓ?Ñ¿#Zt‹þÁm<úß<¥æLçöñ¦oý5kÉýÛcCë¯g-L‰þŽôoUñÊß#úAën„è/ŸD?I›T}óm ¢ÿfˆÖ_³ŠlúèßeZ=ka"5ur¿Gñ?±•¿·¥¢G´þè&;ú_~·—û¸€ß¾ Ø}ü}·çskï+,<8<ù¦ý£;|]×åºbƒ”gæÛ|Ïî´þÍÈÑ¿×0Óiý5¬…‰¤ÔÌýŽè?µzÑß}HÿDÿŽhýÑM0úÒöùzì\øI×…ãs×åî ÓƒÑ߉û$8òóÚ˜¸õof èOë/³&ŠDGúŸTÕÜïˆþÐú£›ìè|7 iºœ†Ï÷Í>è_9Í›Áy„Gí:õýÞ|­¿•¶wˆþ݇±¡õ׳&ô©KÈýÞýôOô·æ~ôr¿÷HÿDÿŽhýÑÍ9ú GÌk"þaùIÑ?xìMFôß/M?€ó—$8§ 4ñ?®Uëß+p»£¿…alhýõ¬… SÑß‘þ-©]ù{Dÿ¾hýÑM0úŸgÓGÿ`ÆU&o:ü&;ú_øò“ —ow]p®GúŸ©õG­¿žµ0¡L]¯^½Ò,â& *ï‡~ ú÷BënŠ·þw¢¿¼ÌËãs4#W à‘K±±50Së Z=ka‚袿µ­µZtsˆþ !d÷âóµþyóÕn86>æëÑú‚Ö_ÏZ˜Ð¬ôòPŸ=Òÿšå~ïðý¾gÖ¶ŽÉ¢¿£õG{yÑß}|{pºÓÜó°–ý2• ?58ÃyÀÊcýƒáþüƒãX­ÿ}´þzÖÂÄåJ“r¿#úÏ¢qôwWéßÚÖ1Yô§õG±óú'éRiãÒ¬­ì³½>S!¬Wª0Q¿AÑúëY Å£¿#ý¯}îwDÿNhýÑM^ô¿<öÌÚú ɸË^¨¼ÒŒ†çEZ™µ0!¯4#÷;¢ÿøºD'¦k[ÇdÑŸÖd·þšcoÐ×Ä­ìà«Ø1iûû&ž?Ç’}")aù‡í“‹“ÑúëY 5¢¿»þ‰þ}ÝŒþy¹ßý{ õG7EøMë´þòù .'ºøÇK4”+Õ|ýÎ?´þ2kaBXivîwÿ#ëUù{±ôomë˜,úÓú£¢ÿĦoýÏ?æEÿìä·ü¤9e´þzÖÂD¥èï(þ‡Õ«ò÷ˆþÑú£!úëóóµi…Ö?¶°`ô§õ—Y ±•ÞÉýþ™úó?ÿóüaý„ôßÞýÊÿ/þâ/—üã³—Lÿ¦¶Ž^ã©ÖÝÄ¢ÒÇ÷£?;5¬Ðúý­¿Žµ0\ivî?LÄNæsžhMl7€è_,ú[‹û_ÌëDGëöòZÿ½ìèXTF¤NZWvô׌38Ow+´þ¥r¿·…rZZÿ«.µöˆþ÷¢¿ñÄÐìU½Nô×¶þü~ ­?î¸ÙúŸ§gð#Üë°ŠóÄÚÑ_3ÎØ<ÝMßú—ÍýžOç#FGë/j&æÈý~7€ô‡ß¢ÇŠûm^ÛëD§lý¿øâ‹ýiýqGê~ FÿË,[Åå½ÊFÿ¤;Ê¡±f­ÿû÷ï·›šµþ5r¿÷èœá‡Ö¿ìЦÉ+@ƒWø:Ñ?íXÏÏíhý‘+õ¼þIó=Ï™ôñÙ=yº¼.åê.[>æ{XÎ>qn7½yó¦Mëï#õ!C'§Ëw/ý«Ø·þ±qÐúÔ&Lû±‚Ú¯óu¢¿Óëï¯s¬?îËø6ßý7š#aÜ.ˆ ·ºS^?¬ôò݆ú\(”dž-_?3¶ðñ̤ŢÿãéÖÜ=éXÿ-ý§Fÿ;­¿Î[­®ÿq»›x?úŸïÑL9 õ/¨A˜ ÷cU_íëDÎðƒ„èÑeDÿ2ð3?Ö è;ÃOÙèïhýEµÃ¹«©÷š_'ú;Îðƒöˆþøñ‡ôþbn5~†ŸC^?/¿Mô8<èH3q¿@Zÿ‚ê…‰Ø)§É(@L,ý»{'ý\'úÓú£¢ÿÄÚDÿŽ­¿¿.—ë-£ÿ~‡+±ëÁ+.+ú;ZQ¥0»ï4ÕØÖ‰þŽÖíý'&Ì÷þÏ7 ÑúoÎõ¿>úo2>æk'úÓúËj„ r?à*lëDZt@ôŸX›èß½õßÜ<Ö¿œÔè_­qÅùؔÝÖ‰þŽÖíý'vyrÏ-ý§ÛoýË~ÌwCëO럽´ir ªàF±Nô§õGDÿ‰µ‰þÓœág3hôw´þ¢‚a¢ÒGÑ•úÈû:ÑßÑú£=¢ÿÄ4_éõHùþ©?Lt#´þ.ò\^ìèÿýœe£ÿ~áœáÇš"a‚“ù—îï¯ýiýÑÑbm¢¿cýKá¼þ´þI³M“E€Rnn,ëDGëöˆþÓDÿ‡ÿüÏÿIßæ»GëïnD÷ñ¡;.ô>€œû­Qw¹Ƚá¬ý]ÕÖŸH‡˜-úó"™Ò!úëŸeã­¿‹|‰ïMòAöIÑß¾iø­AÙa‚ÜdËÛ|Ö‰þµZÿ6À|,·þþJÙô¿%ò‚ÑsyxÏ­Aya‚ÜÜ”±­ý]Ößÿ£€<–[¯Túßçò£?­¿¬`¾Ÿ&|mÜĦÙú*¶þPœÖß»Ÿþ¡¼lôáç­AIaB8á4ÉhIHùî´­­ý]ÖŠ3Õú{wÒÿ9‹Óú¯Üú¯;€öØ÷hýŒÄZëïå¥ÿ`1ú;Z‘2L¬9€^Ø 7´þFb°õ÷RÓ,‹s†Ÿ5[ÿ¤cdÐM·Nô§õ0›­¿§OÿBþ1ú;ZÑe˜àC½@3òæ¶Nôw´þ†`¶õ/¥Æ?‡±¡õדÄãC½@[yo²M³Ikýý²@[ÿfäèßk‡é´þ9cšØ´òVY¦õ'÷h©cëßÌ@ÑŸÖ_L ÂÑÓ$ À²e7Ì­ÿãßm‘X­—a¦ÓúkOÞûLá4ñ°oÍmónëÿ¸ÞeÜàhý›ã0Ö_C8q¸þœâjXpó¼ÕúûûpÉ%—\ö½¤õo6ŒÃtZ e˜˜&XcYm ÍoýËŽã±Ö¯¿þºøbØQu3¯Ýú÷úDÓ!úwƆÖ_OsÁ4©ÑRé­Ö¿ßî<2A…0ÂGWçoHÕÖ¿ã™ öÑßÂ06´þzþœ!.tÚËS‰hCþ€¯¿2ÇvšÓúo}LÙË-TZ>—\rÙ÷Ò}ØÃÿþ}åWjýD믷åC›)ú'´þÿÙ•†²e‚JËÐ]ÕÍ<5ú»ßMþôôô¸|yyy\y\nòÓý Âü­ç%Ü\»¼^y0z´þ0¢´Ö¿Ë@©Yë/we¦¿ý…ûÞY ­?Œ(¡õ€9iý“¢¿/ãݮ߿9à{z}ô.?6˜Øƒhý`D ­?Ì¡qëÈâ­JÊè/¯÷<1i$´þ0"ZË)ÛúŸoMÊåF¢¿K|çÖFDë`9íõßï!Ìýiý`´þ–ÓøXÿéøq´þ0ZËáXÿûƒ¡õ€ÑúXNß3ü*öŒƒmbŸ4МY(81¸? £õ€ÑúXNÁÖÿæmÿ^ðVÎë‹ õ°œEZÿí8Ÿóá^ò06´þ0"ZË™¬õßúÇõ}²ß&êg‡±¡õ€ÑúXÎL­ì#¼{óÐúÀ”hý,gšÖ_“éóf£õ€)ÑúXέ¿2Ð;uôßÏIëS¢õ°œiZÿöÃØÐúÀˆhý,çNëߌý{ ã0ÖÆBë`9wZÿfŠþ´þ0 ZË¡õÏÆa:­?Œ…ÖÀrhý³‡q˜Nëc¡õ°Zÿìa¦ÓúÀXhý,'£õ~~î2ÔCôï>Œ ­?ŒˆÖÀrR[ÿ^Û}ý- cCë#¢õ°œ¤ÖA´þ0"ZËyÍÇŸ9ÿ÷ÎOZ[ÿ-¯Óú€Y´þ–óš_|ñÅ~ ­ªCë—ýiý 6ZËÙ:foK®D½Cë¿÷æÍ›Œè|†èeí[ÿ໵D³ÙGáXÿ§§§ÇåËËKl9—3è=¥YζÆýüçëáùXÿí¦¼è|†èem­ìÝZ¢?€Ù(Ïð£‰ãÊÈ~Iýýlrô/8°Ø+áÇÛþ'ý ¬­õßÛW6D³QžágkÐå~}?Å_ÙGäóÄs1œ'v¯Ôè¾cl°Ï÷ªq†cý žý±þÛD¢?€™%µþÊèY½Âw0 ÇÖââ;y«“ï®yóúÀˆ8Àå$µþ©Wö’ö4-~lßCØKÉ84(5ús^gø°œÔcýïDÿýúè»×ýè^ò6]3€m"­?ŒˆÖÀròZÿ`ÈÖ·þÁ‰—Ýüá^‡›„{é—,ß%öXhý`D´þ–“q†Ÿ¤ÃfJM<ÏP0ús¬?,ˆÖÀrR[ýuåÁ/?Œ+Üëfô—y9lWù ?´þP­?€å<¯¿’~uµFë#¢õ°œŒÖ?†èOë¡õ°}ëï>> æàr†â”kl00Z­?€å([hý`D´þ–£lý! õ€ÑúX­ÿ}´þ0"ZË¡õ¿ÖFDë`9´þ÷ÑúÀˆhý,‡Öÿ>Z­?€åÐúßGë#¢õ°Zÿûhý`D´þ–Cë­?ŒˆÖÀräÖÿùùùqùöíÛ~4͇~ÖÆBë`9Bëïs¿#úÇ£?­?Œ‚ÖÀrbóïÿûžÃ­? „ÖÀr‚óãzïqŠÖFAë`9çŽÙÿäòÎ¥ÿM–mýyŠ£õ°–CÇ\vá¿¡_ýuñÅTo„e[Þ‡€Jhý,äÜ1—â»êG°®±ð"j°Tëoá} .¹ä’˹/ƒ·‰þf³uÌÛ1åe/·`]iùÆGx¿õ/ûtÛd-ß­%ú˜šïß¿¯´|¬ë-ÿ¾ª#,Òú—bÿ}5~·–è`6 Ù{“ËnýG|—ƒK.¹ä²Áe³wk‰þ€ºxdÍÞ­%úêâ}è‹è¬…è,áÿ«æ>¿ endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer blah-000.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000388 00000 n 0000023702 00000 n 0000000329 00000 n 0000000174 00000 n 0000000015 00000 n 0000000156 00000 n 0000000453 00000 n 0000000553 00000 n 0000000494 00000 n 0000000523 00000 n 0000022307 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<8D5B31C3EA1EC1CB71D170669586E503><8D5B31C3EA1EC1CB71D170669586E503>] >> startxref 23870 %%EOF geomview-1.9.4/doc/figs/initial.png0000644000175000001440000003326210616356716014141 00000000000000‰PNG  IHDRþòeå­6PLTE¯¯¯•••uuu333%%%!!!ÆÆÆ€€€dddTTTÿÿÿLLLBBB888666ßßßæ…y| IDATxœí‰bœ¸¶E¥ÛO‰_Çÿÿ³Ï®t4‰£ öv—)A ™Å1©ß‚Ü4jtà · ðGÛø#¹(ä’ù ü‘|Ôk*oŸÉ·‘AÉý]Þ€ÿìf»ßËJüëóg1K¼¯1_¹¿Ë'ðŸ=-¼Ë²‚S‹ï¥%žïé%ÞEF%ýwù„ý§O ﲬàÕ"¹˜ /·ˆH2Øú4ñ.Ç ~->ñu¡¯Ÿ¿'ðŸ=M¼Ë±B £—X|É}½¾Áþ ¤»ww+„j1¦‘Ï+ì¿Dz{÷5eÿt?$²Lö¿çoà?w:{÷5mÿX!ŽûMùõû»Àþ‹¤¯w‰µì@„íÉý]>aÿEÒÄ»+ÄjQ´ü!ò]û>ÿ.ööÝc8ì¿HÎx÷” j\þöE­4ßc‘Õóíxƒ=ýè¤.’Øßyû»X3ªÃaÿEr»ç¬p®Êµ éññ¿ÿÙ¿3ô˜kØ•°¼«Â¾î:ô“µ¯½™û¯žwƒøŸ³B´éåÏY ·=mPÊ©Ù?À6;ôÞÁ7è§Xø“¦!Ì_ ôü_7,ïÚfÛ¿ÏY!Q öòWœŽH^ˆ~÷¿l˜gýmÚC†Êüõãc¹‹…œýkÓÉëÐû_8-Ïùw‹ñöïFå¥è‡ý/›3Þ]ÏþHMrgoö_%7³?RžÜßÙY¼Áþ뤥ý“V«Ò:™¿s`8ì¿HÚ?m…p-ÞÂw}íy/b|9_ŸÑ{AÇþ.°ÿ"ihÿÀð¨ý¿—•ŸáßE‚‰ Gº$Úü±7~þΟ°ÿü9ãÝSV°kñ\˜¼óŽEóúX1ÿÙsÊ»g¬`×âç6Àß#} —Èvãhà?{:{×XÁ®Åës½0z±Ed¢÷ˆþÓg÷îß.!Vpkñè½Ø"2AÏÿ"Ù½Û…þwb§o°ÿ…‚žÿE²{÷ï_Ý<ïï™ãþÀÿ"ýÉîÝ^ø'ûÿ‹ö_$Ôþü­x‹jö8°ÿ]û/jþ>|þï°ÿ}û/ÛþÜxæ8°ÿ]û/Ûþíñ‡ýïØ‘Àþˆ|`ÿEû#òý ìÈö_$°?"Ø‘Àþˆ|`ÿEû#òý ìÈö_$!û+mÿ¤¯bø?®ægàûß!°ÿ" Ùã8Šs-Äö¿C`ÿE´?ÁÿétõóïXDñ×tŒgñ}›ö¿S`ÿE´¿Vûÿûšÿ} EƒýïØ‘„÷ýü ÓÈLüuØÿýIØþDýÊõxþ{ ì§Àþ‹$Òó¯l矲?öýoØ‘DìïSÌÁ?8"öýïØ‘ÄŽûßJY€QüãþDZrö¿W`ÿE‚³þùÀþ‹çü#òý ìÈö_$°?"Ø‘Àþˆ|`ÿEû#òý ìÈö_$°?"Ø‘Àþˆ|`ÿEû#òý‰mÿwfü™ãÀþw ì¿H,ûséwðçŽûß%°ÿ"¡öoØÿ.ý µüaÿ;ö_$°?"Ø‘Àþˆ|`ÿEû#òý ìÈö_$<û+•yˆWêù^þ°ÿû/¶ýÓ€³ñ‡ýïØ‘°÷ýíûx>ŸãsÜË3ýxOŠ?ì‡Àþ‹¤Ìþμ÷óÏáûß!°ÿ")´¿=ò8þ°ÿû/’Â}ÿã™_ÎS¼`„ö_$eöwžÝc¸‡ýØ‘Ôíûkìû#‰Àþ‹¤¢ç{ò7íù×èùGH`ÿErê¬?–ómüaÿ;ö_$Õçü“G~–àûß!°ÿ"©·?ïTØÿý ®øCäû/\ñ‡Èö_$°?"Ø‘Àþˆ|û+dž8àû³ïó]ØÿFqìÿýk"oŸÉ·‘’|fóÍÅߨ¿%ýaÿŵÿëÏﱯÇ›x_%_ŸÉ¶|óð§öo¶ÝÿwÇö¿C<û?–¼X>_Sï"%ùÌ4ægÊþíñƒýo€ýS‹$è—Kº1]ö`D>!ûâkð×›ÏìÈ'hÿÑKÿÝ¿ÞìÁþˆ|Âö}Èëæ ±û#ò Û?}üi› {°?"ŸˆýcǤpܯøë­¸ÍØö'÷ò")¹­Wÿ7Øÿ‰Ù¿¦³ %Úf±Ÿlû·Äö¿Câö/Yb‘x¢”?× ö^ÿcx•ýÕñ\íž^°?’M‘ý?C&Û–ZV˜%båK>3ù)§'’M°Ížï<ÚÚªÂã¾ý·{wZ·ó>ÂþH6gíÿ@ˆQéŠ"\^ä3‘]+äìï~rý7Ù‡æû#Ùœ´ÿFмFSLÒÉýÌÔD:à_fÿÇÖ‰ý›áûß!çìOAÙ·¥·ŸÏMwâØ}[^Ã'£Ð‰ò?Ó|Ž:†’5J`"¦¶ÇRëú´´¿áöG*rÎþ„ —iµátð³½Ø¾™ø“È^’÷™ö˜Ž5:2ãzÿ¦öOà}$Ÿ„ýÝsÑÞ<“ÍZªtð£Ãh9Žýí Ô}¦Cô›õ©~Aï—s1mf¯IdíôüïÇ`$Ÿ„ý_ù�íkˆÞŽ ÕA¨Ù°6k2a y“ý™ö{oæ-3óÉþj€ =ÒfÎô$ì/ØÿVIÙß^Žf ÙÿÍÂøíÍÁЗò>Î[t¿: ÿ²Ï¤ŸC&ç¬Cè+_þvÁêû[Ó±;üaÿ;$eoë?lÊKÿ7g;ýííØzЕÅ?÷™6ç1üCë ²¾ /ªCíïlýÃþÈà${þ½ÿPϿבïÑÿ¦Ó¼çl&¸$Ò#Þ'Jlû7íùo‡?ì‡Üèœ •W¤éqÿvøÃþwÈùsþWÉ(úadÚÜÆþƒèodÿ¿íûß(÷±ÿ díïŸ[•·Cú{Ùß;®„Gÿ›ØX2öwV,û·NûK¯úXŒï“£¹„ð‡ý›&gÿÀð¬ý{àßÜþÛr|¼@n¶˜ýßÂ÷ ~}ì¿bmöy¢ÂMì¿}›H>Ò­æÚÿíó±ä}/„ÁĆ#ñDÛ,öÆ]ìï,ÍH6âæÚÿ¹\éÈ@öü<þ÷³Îþ?£û+ðïa{[ÉE¾Íü}ÿ×ׇcaùù›üÜî¿Âþǵÿ§ñïbÚ“u~’WOƒ&óöý_7Ç £ò`/€?Ãþ†sµßøW¯[³ðïcÿŸlgI‹ ÷üwÙÃD‚‰°ÇúË(úºñ/ªB'ûƒn<úÛõüÿq‰°Wfÿð­ÿs? §ýÉqðŸˆi$Yüaÿ¹"cÿg Åß aU¡ŸýCbCìÐM$Øÿʳ¿ÝøwFûË.ÑWL³Æ‚ýgËû=ÿç7þ{Úü§Ó®­`ÿÙrÆþ渿¢7þµzþ™Uèjt¦âìÁþWÎ)ûËU¡¯ý?‘-Ñ‚ý/˜sö«BgûÌÅÿÿm]õ°ÿsWûOÃÿÿ9[¿QºÛ;=Óu´—Ú~‹—­{þ ýœŠ‘bŸ~²2ò¹­ý'àß%ü: Ð$ÝíÏ@Z»o©xq6q¡‚[7wÖhÖ }æI˜ s_ûå?ŽþÀU@¨AúÛ?øÒ‡¬ø9üË&qŒÃº0ìÿÞ4ãì?Œÿ<úcVÁæmÿàE¥îõ&êyÁI¤àñ–¹4eÿÕü ŽMÎl «:Ö¦Œ91ΩÅÐ0ìß”þ¿íovãŸO~ÿuÀÞ*4´¿ý•¹Ž$ ¦}±I¨ )býj‡ÇVæghœpí,ü3Ÿ>6,û·ûø¿GÚÿ#¶Ì7I úýV±5aû›Æw¤Cø«Ã¢:·ï!ÛòÊùÝ8WŠŽcM2Z;»ý1î§Nÿ¸ûüø²ÿG§€3ä÷YD›a¸ýcÛ×ôí¬0ì S¢(*gtœpíÖÂÿÎöoÏ¿ úWñF¼ï¤ eE§BÑÝ€Èo1è}`üomÿ¦üË¢ßnh‚Ñö,8•ø6ú÷ßCc«à8*9Ž^ ÿ{Û¿ÿmÈo³H5ÀhûïÊubðß åñß ñW:Z>ÙõGþ‹uýYs1*°ÿ‡ü€Öè ¯’ÝŸƒí=ðgúþÌ‚‘õÄAZêÀ_xì£(=v¸Ç‹×Ο| ýuüïn3øü"Þ‹|Áu@zÞ¯wÎ sÃ9m”û'› ²}æ°ÿ‡ ÿýÑ—XdæüzWü“û·Ä´ýOó?ý“«€Ü|Ãþµã¬¾ý½x›}™c©8ÓØÿÿ£¹§©m˜l³t³ÿñô™är£xÅ4£ˆÀ§ÄÇ›áÄÞT íO»/íͺŸÇþuüÆ=”ŠvÉ·Ê…ì˜Tìû+{M %ðŸÀþåüæ<žÂfa4Ê…öý“Ò}sÎã±!@Ï‚,ÍLö?}1/Íx*¼FáÌ.ìåÚßV~þôÇ\¦²ÿGÙÀhÄS)h^‹Àþ—L徿¾à¾?}Ÿ±¬&<v“0ö¿dJìoαrÎbÚß,Ïlöçó?šï\¤æö¿rÎõwú¨Ætögs1ï\d沓ý›ÞQI¥öœÿãÄe üç±?“ŒÑtçs~í" í?;§Úþ§4Lhÿïù6Œf›“ls°Žpt±?2,¸â/V<^v4Ù¼TÏÞ‰–KO+¶ïŒ ®ø –Og4ؼdf¢MË%§…žÿÉ‚ëýSå#¥GsÍMͼm¹ä´Ðó?Yp½²|°øhªù)žµó-—œì?Y`ÿLùÀ£¡æ'0cõ-Á+Ÿœìß<ûýöÏ•Œ1šé’”Ì—LË%§û7OA¯Ÿ†ýså?¼nÀÑD—%ÞÝû_2ìÆ|ßñ‡ýãåýQF]ölIµ\rZ°ó”ãûÇË{£Œæ¹4ÌÙk¹ä´`ÿæýC ž÷‚YÞe4ÍåaÍ–\Ë%§û7ìZð¼Ìòî(£a.k¶äZ.9­Œý%Ïeo·ÌÎØ?´ày/˜å×£Y® c¶[.9­Œýé¿íìZð¼ÌòöëÑ$×%;[’-—œVÖþ’ËÕ=ÓÀþÅd)û¹.ÙÙ’l¹ä´²öïyZ˜DÆßØ{Ÿss>r‹^¶ý[Ò¿”ýGs\›Ìl‰¶\rZÓÙ_ú~üåÓñÇ׆;årü3ö×%§•Ö Ù4ÅõIΖlË%§5›ýwÒÄø?luTÿ1» ×þº€è÷ÒÂz!û†¸>ÉÙ’m¹ä´&³?¡Lp (îçšõQº\4aû+ûñÂ?)²?ofÞßK ëuì?šá3IÌ–pË%§5™ý)R#ðx~ÿÕ\²{Ä_9ß?)²?o~ªñ_Àþ£ >—èlI·\rZsÙ?‚”òÐ3/÷ÇÜ(S×Ú^‰Ø>ÖÎä¢åâ9ð?FÚwÿÉÏŸÀþŒòÀ¿¬|rZLûX.þÁ„5ë7åÄš†?)’Àßÿ5>Ççì¿¿$³û3ʯGó{6‘Ùo¹ä´˜ö'›ä¼EÉK5þÆî©ßÌÀ0þNëÓü®¾L•rïØIãO –Úÿ+MñwIv£³ÿhzÏ'8[ò-—œ×þf¡g-òq’‰à/ýãø?Ø©çãÞÎo‡?ÓþøqñŸÞþ£á=ŸàlÉ·\rZöWÇ#äjR†?ÙO¶dU{æGh*lü­X¹xÊ»þšÙÿ{àEì?š]‰f«AË%§U`E»©Š3þzÿî ø•051»Ñrñ”økeÿÇÐKØ4¹2™ÿû“…¸8ÿfÇ>²2o¯(ˆéÅ÷ŠÊ7Z å  Güœíâ -‡ÿÜöÍ­TÆã_`ÿãUM&Ã_Yß¹JøƒC"¿âO;ø?Käñ·Š/mÿÑØJe<þ³Ù_Y¿e`,Áßù {À©Dü£åâin6þ}þSÛ4µrŽÿTö·RµøëÃònAkÚ´û/V‡KÙ¿¤ëofûfV2‘Yl¹ä´æ²?Õ?ÝP×: |g*ø{•‹fû_¥ç4²’‰Ì¢`Ë%§5™ým.Wî§?Î#Ô^‹ho*ÞêÀ©}üÄȨgæüDϘþ«Ú4±² ΢dË%§5×YšvÒY¦¦Ü*bþÎT ð~bdÔ`Ú÷ü‡òͺ¾¤ýGó*À,ж\rZsõ÷ü"~2Äzß¼ô‹¸S)À?´/5˜ööÁÿyí?WéfQ´å’ÓâÚ?N 3w¾×_ÉÍ%ìÿåšöM«|j[â‚×û_1|ú…ìÿ[ÿYí?šÕ©k‰ ^ïÈìû_×þ£Qm‘º–€ý¯‰}ÿëÚ4©mRÓ°ÿ%#`ÿ'èW´ÿhN[¥¼%øå“Ó‚ý'Ëyûoœ_ñ¸ÿhL[¥¼%øå“Ó‚ý'K‰ýCçús€ôÕì?šÒv)m‰‚òÉiÁþ“¥Äþ¡sý ý—³ÿhF[¦¬%JZ.9-زÙÿ·»øMé‹Ù4¢-SÖ%-—œì?YÊìoáî^û£¯eÿÑ„¶ ìèrû{ùÁ>ûæ³u`¤´ç?E?ÿmžÝþ£ñl9íÏågYû&³OZ´\zZ°ÿdéÿŒ¿¯ù÷ýGsÙ+ò-—™ì?YÚ>ã/Hÿ㇞Øþ£©ìé–ËM öŸ,x¯ŸÑPö‹tËå¦ûO–îöã?“ý‡€øÏ?C>V¶å²ÓÊ÷_37Øš$u’½ýY+“ÒÂñ5Ð(û ðŸGF|²dËå§Õñ¸Ç|ã?º …±ðgÚ¿%þÙƒÿü3ŒÉ–ËO+gÿ5÷Þÿ®VqØ?–þþCÒÿÓåZ.Ÿ¼ý¹ËïTYØß¤?ÿü35ÿ°6ëáö·Ó¾þÌ¿TË1ûÏ®ý¹]Š¥…õ\öïÍž ÿˆ€LËqÒÊþÎõz§ ÿ⪺;õžý}'¦ýÙGJ ë©ìß›¼ý“ñ¿Šý‹~«µC!þ™ß##‡F'P‡ÞþÇ”ƒüTEŸÓœ­Â$öï‹]þþ+‰–c¥å¾?ðogÿf¥·G“§‘[/­J=ß|Ž·ÒûÓQ*Ìaÿ¾ÔÅ韉ÿÅì¯è‚öxn÷10¼œ ¤ÿ½6ÊÔðYmëYãÇÊú©L‘]´wUçÛÿ ÙR»ýÒšKegOBÙU˜Âþ]‘KÁß}p¶å¸…æöWÊ|[¿¨Ør*JûSzrÕvð±ßѬù,²¿ûÃ~#Štˆ©Âöï \Žþ¾üŸm9î_¡Ï¾¿áÁþegK:5]Ï*Yä¸ÕÖt MOh䲆ðæ³ÄþÞ}«jŸ)k.£%µS¹Yìß“·<ý³ð¿–ý÷åÐÆß8ËÆ¿&µT¡j[óÂÆŸìNpª~ÆþÎKw.S%IùIìß6üWgZŽÿWhnE4³Ì‰ó/€¿;à8Åßl.dì¿MŒ1Ÿ§ìï¿´f-ZÒ®æ$öþžüŸi9þ_¡ý¾?Yôbøûª:™Zü•GŽ_íøsæ³ÜþGêöRéàÆÆ¶ú:ê¦]Zvûw×@}ËüºØŸlç;ßÚ|KF°ëï(àT;ö–ý˜×\Õkû3ç²~ Ô×þÝ0+£<ÿkÙÿ©™£—\¹Ã|M ¤î¬?§—ßã;þ³çÅ}‹XÕ²kñ?¦ýÉÎ\²G˜Âþ+…¿ã  ¶åJþ Îù‡ÝÏåÏùß7× Öœündÿú{ñ_Ûr%…¾WüGÒgqü9öo\…áöÿ¯auô÷áÿWmË•ü:Û¿ÓU@‹ãϱã* ·ÿíù¯…¿Ë àWüq½ÿ)¾Û7¥…õ$öoÏÿú›ó¥iûwÊâøs®÷çÞC°´°žÄþßø7åÿü­W¿zá;ýÎÜëÏÉMù?OKþuÃ?mþv#r2…öoŒÿöoÇ¿ýíøÿÕ<åg®Àþ{Úá/»@Š~<åçÒý÷4Ó¿ýmøOÊö¿t ìïÂéF¯ýŒ¿ÿÚð/ “À¯žøÃþs¥Àþ›î#þüÓÏœðÿ5á_š~qþuÅöŸ+õöÏáŸr¿‡ÿöoÁ¿<üÒ+€ý°ÿ¥Skÿ¯oüíuAge0£ýwüùoC¿$ÿ¿:㟴ÿèƒá7JÅqgŠÿceÀÿëË]èií/‡+úùïÒþ«='w˂ծyÆŸÃæ—xÿçÎA ÿ™ì/Ä;øåV¿æ²ÿzgÏ=2yµCVçìÿeáÿ•ÁïHà?ƒýeùoK¿ ÿ úûÚç3wµÿúøŸ´ÿ—eÿý·þ¦spnûüÏóß~‘À¯þøgí¯–ËߟjÇ;×Fçï†ÿÿ~ò÷ùÿß³ûþ¿‹6þר÷'øŸå¿ý§ùÿ5ÿ¬ýGÃ\ž…ðÿæ>€©ý¿(þ_"øOfÿsü÷ÿì à×üóö×ÇÝð¹aÔó7ïSÐùÙ1þOß+ê$0(6w&Éã_h¼ùåöâ¿ýgøgÒßÝþ`½ÿ7?þö-·-’ͱÓqKȬþß/·Ÿ}{þ±¿ þ=é?Áÿüöw¡vð×f¨[ÒÜ#ü½'^°`…™ý‰ï­þ½‹Ù¿’ÿ¾ðׯ~MmÿÇÂïᯎçJЇà>¡3#Á6pƒkrcSkåüî¿­dîShð¼z¾¨·¿9Ü÷eÜ»˜ýëøïOÿ¿áϳ¿yn…ŠãoÝ$ߺa~ßdñ?6ü#ç8ž÷Üÿæ=ÿùÓ~æ°ÿYþGÀ_µàÓ?Äþ;öiüUøgïìø+ó ]e?¤cûIŸÙCÞ¶÷#ÄðßZùñªÚþÃùùK~Ö8ëïÃÅ¿”ÿQôóÿkþLû»D›]{{û&üµcÿ½Êf`=£Çù} þö÷Ïå“ÁJû—ñ?þÒÀ¯qøŸ³ÿRø;qmOñ·×mðÿkÎM”èù÷/è=ƒÿœö/Á,ýEüÄÿ²öçôüù&› mñáÏ·ô"þ¯þ«œóÿq‚ÿÑôð_DÿûGºþì#€N¡±]œãþÔþ¡®?÷mQüÿgRkº©ïÑ ÿIìïáÏä4úÏÔÑßæqíÛYÓô­U=vÖ9ü³þ¬}ýc#æxßêxÄ?~Á/Ûþü·_Îà?«ýyüæ~OýÚÿÉAlÕìÔŸó/£÷L|ü«÷ýÍE~6Ëiü—¹âï#„žÿÑÐÓTÐ?¡ý½íxà_ƒÿ6 ~ß?„¿y¥Ãø‡6¦µÿ£‰·#MûGÉX¿L—åñ?c¢tÄß>88»ýCø'ù»ŸBúû⟵"d³È¿-ìouèþîÉ Ú?…ÿhÖC™ÿ¬ýû0!™åñ¯¶¿Ýÿ¯ø»ç« ½ýãü&=œ"úg³¿rŽšiíbdï>èç´Ej{ì jاr íïž }ü=úõ†žÔþ%üÆ<9ú»Ûß9dnFCßKñ£2ï‹ÆàoŽí“·ë¡Âƒ¦•ý½S€´‡€þ¯mÍ¡'µÿ ÿ£O…Mgüö·—Þ…ðWÁ³þ"øw‹¨ýcçý„ðÃÿw5ûø x.Lúç´¿zœóxEÿ?l¯Õq€p[šÍ{å; µ9®ø Ÿó¿pj]·SSS=Iû'è?õ¯Ùíïñ?šî|xôOi²ëîÙß:SÖ-lŸEÛ'ûY:…¿_ë^µ´:ÚÆ?™yíÏÒÿh´y‘ÿû›Sdøo/lxH±1øÓæÔ¬[ߤ ýKðgÖ³ÙŸ£ÿÑ\s# ÿ1ö×:ŽÿÖ•n7}ëãïÖz¢¦ý1øs ëUìOøM5?Yúµ?}­”]lþà)ûkíÍÝ ÿLû3RÿößùtY2ô/hí¼v Ú÷'m}xÿ®ûþ'¯÷gä öÏð?šçÒœ¤Œý¹]Ú0²ëo«ŸÙ ѦΡZwïú‹Þîö·Çÿ¿åàÿI‚þîø3û‡üíWÃûÕäPÚÕ(üÝ“üö5—SëîûþñÛ}ÀþVø&¹.á_pÖE£ËYäœÿswûá>N¸´°^ÊþKòŸ Rû{§ìÿêˆØŸ ô{ia=Ÿý¯¦ÿSô÷·¿s"Ÿî´‘\åñÏÛ¿if³ÿÅôNþ¸Þ?—…@²+IDATåñÏÛÿ'JÙ?M’ëfrªs$+ÙøŸ ®÷ï)ûûdœ7áÀþM3þ…×û“ e¼Í]žÒ;íîéù7GúÇÙ_“3¬ŽÃÎ?ûƒâG:§³ÿ¥ø?IÿÐëýÍ!2ò»õfâwïÍFF®÷_¶ý-“[?âÍÍÉtöþÕ-—™Váõþkáï\ïoŸ±0,‚öWö òÛYü×±ÿbü§èŸ×þäìy²ÕINó ýnnÓò±ëý-Xì ~z®$÷ýé¥ÊšÎUäŽfZ»ø ­eà_ŸšãþtGÚ<€÷M~ÓÁEO"±ëýÍÍŽj̉?ßß_Çåúõ\õGðŸËþÚú?KÿtWüK[î§7FSüVö÷öîœøwÛ÷ã?—ý¯£ÿÓò|Ååž=¹ªÞc$þ¦bIW¶¨^ãžÿÌ}Ëì™ZÌþÀ¿:ÅöWf!ÒÚ†9eýø®÷W¡ŠÍ‡ÿÙãþÉX[oQü'³ÿUø?OÿPû»‹\þÊ£)þûçÒÅ=„ÿ®Ën‘Ý÷×§ðŽ:¡ýuË%§Ux½Þ·Ò»þöªé­þ¦Ú¤-뫞”ý•ý“™£TÇf|Fû«ëãÏm‰Â–KN«ðzÿã9þÌdH?ü­§üÿÓsgßgÿf™ÑþIü—á?)ÿ!øãzÿÞÁø_âØ_rÓbûãz¹ÀþÒø/ÂzÏVûãzÑÀþ5ø_@ÿIúgµÿrYØ?TøWµ\rZ¸Þ¿{dîõÇMia=­ý—ç?Mÿ¬ö§[úÎåþzÊý€ýœóRºß2¬Z{dîôËÌ{ia=­ý—¿ç_šþYíï²C•уÈÓ$pÒ¯{èoddìÏû¬KÜçÿ(ÖSÿ//ÒSÌÈZû›ÄÇŸü?MþZÕvª8¾®¸ÏÿG%þõÿò"Άþ©íO®ÜqÏúÙ^îgóÐk{­AÝ6Bø‡ÎM ÔµKõ¤ìïÂéFSü¹…õÄöþ-—œVÙqÿ8þÞ¾ö¯ ïìçgÇß=?1z6rçêIÙÿ÷W2þÌÂzfûwãÿåEœÿý3Ûß;Ç—ün¢Ì›dSAÑ÷{d¿âÏúx·Báºv©ž˜ý¿R:÷ðçÖ3Û¿þ//òüωÁÙ)ëZÿøÝ§Ä»Þÿ¨«37M«'gÿvøOjÿ>ü¿¼ÈóŸ¥iûS×ÚÚ%]ï³àO*6%þMíÿØÔÏâ?©ýÿÈëý]üM·zlƒZS´âOfb~üOÙ§;‚ÿ¶«ŸÃVû'ø#õå¥ÿYú§¶¿ výÙÝzÞÆ¿4¤ëO²½z†ëÚ¥z-íoà>‡ÿ¬öï ÿ——üçå?³ýé)tZÛ[ýǾ½{ë\ëÖÛû==ëÏ;ðçÕµKõÚÙŸ¢}Qû7×ÿ“ú¿#Éžþ™íï¦*U¹Å9ÿÚÇßû¢öoÎÿÿ¾™(ƒþ©íïø×§‘ý]¬ÏuýÍkÿÆøø·€ÄT§ÅŸy½¿• /ó¡Yÿ ûûNçøûq%ûÇùàÔb[œŸ*‡þYí¿\–Ç¿Øþ¡-úþÖë¯þÛ¿Gç¿pæÅ×û÷ޏý7ö™öÿúM‹n+Ž¥ì¿íçhÌc‰Ò¯"³(ØrÉi]ÚþdÅ>QÁܱ8íã`­ž¬ýÉ¡>»/ Öõ÷Ûœ°_°–ýwýÍy8qùÇÿÂö·îJbÿ4'$’ÀŸ3z´z¢ö§‡úø}y#­gÿ¦{ÿ ßôŽÿ…íOŸÞÂ?wü"þ6kôhõDíÿE7ä³øüÕÁzö_lï?±ç?ÿ+ÛŸžqD~jëL`rnÒãy_ÖcJÿœ'—F/ºé‘¸ýùøïØý&ô?~]Ëþké?Ñï7ÿëÚßœÐgkMÎñ·ÏLÎݶ 9:wc@ÜþÿÑÿþíí,fàÏ/ŸœÖ…íOÏéu/ë9ºîœ7ݲŠ9º.xL¨pÏIןµ©ðEV«Ù%þôÇÿ²ö?6ЃüîÿUâïŽ^Ò ~ÜŸ}àÏ:'Ø:W`5ûØ?–ýn?ôv#!~p—ào”Ä¿ø¬?Þi?vk”åì¿ÿ)úÇãcûKâ/ºñ_qÎ?ç¤__þÂz ûÇù»›ýãñ¿ªýwýî¼çPíwê‘Ю?gPxt­Ùü7ºâ/ÉÏ—›Pa½ˆý?쎃ðÀŸé¼³ë›“ö ÐèÂþ*¯÷Ï]ð§Eû/Â’þñø_Õþm&ÍßçáÝ~½yaüí׳?ðç•ONë²öŸªØýÀšÞëŒõè&\ÒþKðŸ¦<þ°?7R÷k|§ß$þ±¬hÿ—•ñ‰Î–tË%§ûwîóÿ!ÿËKŒÿÑÈÓÄèy‰Ì–xË%§ûwÏàûüóðŸßþqü'â?*ÿYð¿²ýÃónBñî°Ð¦þüûþRøOoÿÇ]xWÅÿQùàlÉ·\rZW¶¿wSò#yüƒ‡òDvý%íŸÌ©G|NoÿþÓðŸÿ$ø_Øþä0¾“<ÇÁ ‡^øs퟉¶ðgÖkØ{Çšøo•ÌVƒ–KNëÒö÷OÙ9®îß®xÍ3ýPÖy}Ç‹íFö“N¼_¹Õ“²?#na½„ý_®€ÿËø_×þÓÁÓ{õþÔ¡À¥ýZ»ç÷j²†ð&QxÖ¯˜ý©Ærû¿,Á†þð¿®ý)þ:øÓðJÎï5ÃÌ®ƒ»aÊÒ+¸Õ±ÿ;3¥…õ ö'Ïà[Rùñø_ÖþÇÞ»uÙŽu ðVäæwþð§“ gÿKnü3ìÏú½´°^ÁþYü§à?'ÿð¿¬ýéõþ–õµÃ´ÙBðàOŠSÚ^Šmüçíß4ÓÛßzïjø[•Žÿ½ì¿•ð•n£ÿ{ø†Ó©2ª'`ÿ¦™ÞþÀ¿ |rZ—µ¿!=Ñõ÷(ìú³{û·îúƒýãå?>>^^–àŸAÿvî_]KÀþáøøGüéý=ëícðñ¶½ïo/lpàö—÷è_ÿ—à,J¶\rZ—µ¿?˜ß7ß6RöwQær”sÎmð:=&·¿ ФüóèÿUío »V_"RöWÞ‹t”ûÊ@ª0¯ý=€ÖÆÿ%0‹¢-—œÖMì/u­¾DÄì¿Ï9îxìÛ„cï?ÏcÔtOÈdnûû…ùŸÿ@å³(ÚrÉiÝÃþSEÖþæ˜ùqtfÐXÅì{™.dÿ@SêŸ+Ã?ì/“åñgÛßã^ Óøk÷7“©íhFý³é‹ÿ•ío/Õ³lýKÚŸž… Šÿ¬öñóï¿óé?,ÿÿMðûËĹÞOÿþ+Iû7ÃRûáÿ7Âÿtø?ªåö—‰û€ïdfÄŸmºû_ÿzûþaø#üφÿ^×™ð¿²ýw9Òþîãàþ€u¼Þ»Â[W¯CÏë}Óó¯WéùÁ?þãò®Ê[‚_>9­ Ûÿؾ%ÜÁ—Ö‰¼ª7ËqÿXæµ þéôŸ¦ß[”·¿|rZ¶?Ù½ ìñj3ÔÚƒîP=ÉžëE:EøOiÿ(û³é?# PÚå“Óº®ý­ýâþäºýÙðgÚ_Ù?sñNúeZûÇáŸLÿú­@iK”ONëºö§×û‡ú»íÞ²©ðÇÁò)ø—ÄŸ¬ÊZ¢¤å’Óº­ý)ò³á+þBå“ðOÅ?›~²€ý¥¸à7l¯ë¯OõDîõÇMia=­ýÓð¯Šÿ¾€ý¥ÂŸ\·Oüu©žÈ~™y/-¬gµšý™ø/£_ÀþB¹Á9ÿ7¼Ïÿ~u=üÕsû eyüqŸ¿ü‹A¥„ÿIðOVû9S/°¿L–Çö÷Ës2‡þCògU¿MË%§ûwìÿQ¼+^ÙYñš=»ìÎòøsŸð›‰¦øs ë í¯ØxLÀýÿ¬Æð^ÔçÚö÷¯øÍžø:Å%?¥OøýcEÿ™ì¯Ø%—Å¿`aÿLösþ÷Cú{øÛ+ŒÌº rU!nÿ?Âüëþîz"€ÿDö/ ?ÄÿxüK„ݰ,ä’‹QþzüËìïÒp­Oà?ý‹è¯ÿ:ùÌ'ìŸ =é÷sV9ÛWÑáæj˜ã$!ó.-½U@IõdíïÓ¿ƒ­ÿœß§µýÌ„y“0öÅÅ?pW[ïÑ_[Iò}¬"œïðùÂ%Õµˆþ}ÿYì_Aÿ#£ø¯D¿`^aÿL<ü·ÿ<û›á¤¤‹?)DO ¦ãIã_`ÿ0ýOþuÛNûï]þuKúHü«*Ìš]Ø?ßþÇ•¿þÆ¿±Êâo]I\¼õ/iÿý¸õêö¯U¿Éüëë˘ã–öÿ~}QûëðÆ¿mqçü­[”_*$hÿ8ý?üëÅ÷ýÏÓÿHOþÏ Ïœç–öÿüÉ5ìï¸\ðwÞçÚß$ŽÿëÏ_aÿýßüëµ{þ…è_,Ù¹n»ïÿ½>¸†ýÍq§ëïùítáýÄü4eì~>ݧëïíçÏÀ°ÿFðòó§¨Ãø? ü!ãÍiÿ{ÒŸŸï¦ûþ¯—Ù÷×ú8‰Ç:ð÷¼Ðß¼Rü·2î½È¾?½U@!ÿ;þö¥öö¾ÿý"·ÿûýûø¡ƒøÿñþŸÒþw¥?;çèùÏd‘sþ úï•ûþÕøïÛþqüGÛÿ¾ôçæ=ÿ™,‚ÿÿ¶V~¼ªêùߨÿÃÂÿ%|ëí'Ô3Ø_Ý™~øm¼'>öïž<þlûÿ!*çàüÛ¿Mq=‘ýUâ½[$Õ°&«àÿäÿù¢Òþ;øþ¿]eø´ÿíéO6ìŸÉòøØ?¶ïïøK$œÈþ ÿ#Õ°&ËàÿÃÿö³Îþñ®¿þkØô?mØ?“åñèù?‹ÿ0û'»½î”X÷'ìŸÉ:øÿïïö£¾çÿ7Ù÷?Nû‰áÿ{öžÿ›wùÛ ¯ aÿL–Ç¿lß¿ð¤ß™ûcÃßJ°9`ÿLÂÿïg®ø«ÆÒ³þ@¿“Pƒt¶?ûQódöj?³õ³ÿ¼çüƒ~/&ékÿA„œÊìÕ~6­•ºëý“ô¯vÅèÄo”žöGz¥în?)ú»Þôã5KGû‘ã=ScÿÚ›}Mx·ÐI´ÚÛéžÒ;ýÆé_é^ ôGs4²~í`¤{Šïó¥!ûK.Ò×K»¶‚ýgKùS~bô¯³ïúÓiÖX°ÿl©xÆ_„þezþ­[Ä Ý7‚ý¯œš'ü†é_åØígÄ4ìåÔ<á7ØøÖ½íúYñ7‘ZÚôað‡mÖʤ´p| ÔÄþ Ÿ›-³ÿhî¶ý[âßÉþʼ@2iÐdû+d`îcE^ ¹È·YØþ¯ÈØÜÄþо@²o´ ý_ñ5üëö·—f$éV Ù?žÏÔ›HY2™³?·'¡´p?û;Û²#ÂÍ´t‰üL¾%ݘ9û³;K ÷²¿¹­è/ˆéø“8IÊ·ÿgêë5ó>¾ø_ß™|?iÿ¦ébät$ðwìÿ™Ìkæ}¤ ™ÆLÚËñ|Rë1£ô™å~Iÿ­þ­íÌ×þȈÿ1Œ‡kû#3ı?2k"öwðW۳ȕçxÿí}EŸ{ûß/Žý‘Yò¿²^ÅñWΧ4ì—Àþ‹$nÿgº‹ðw Ãþw ì¿HxûþÇŠà4þ°ÿû/Ö¾¿àÆ?ì‡Àþ‹¤é¾ ëö¿C`ÿEÂïùWÁ ú½— Üóoóûß%°ÿ"‰Ú?øÚ ¼Šö¿K`ÿEµ#üaÿ;ö_$û«ÐË þŠWnÇö¿C`ÿEâ]ï_ðì°ÒÁþw ì¿H¼ëý™y/- ûß(°ÿ"¹ÚÝ~û/’«Ýë™!°ÿ"ýùÀþ‹öGäû/’ä3þ"±ðç†ýoØ‘Ÿñ÷Ç{L·»°÷ìÃÀþ‹$lÿ4ÿŽý­ÂÞ/°ÿ û/’È~“ü»ÿ´°÷ö¿a`ÿEÛ÷ÿA7¶ ðöý÷¼—°ÿ-û/’ˆýànø][áïÿžÿÈè°ÿ û/’xÏ þ{á?þ˜WvaØÿFý‰¨ýC/`ÿö_$ñ}ÿüIaóóöýoØ‘DíŸÈ™Ó~`ÿ;ö_$8ë‘ì¿H`D>°ÿ"ÉÙÿÏŸ?^7@ð¸¿_ûþ· ì¿Hrögáÿ›t÷“¾«0ì£Àþ‹$oóÿžàqÿðÿ°ÿ-û/’¼ýÍÿ{lü‰òIác(ìÃÀþ‹ä¼ýËð‡ýïØ‘œ·¿W,¹ñûß!°ÿ"éù/èúƒýïØ‘ˆôüøƒýïØ‘à¬?D>°ÿ"ÁYˆ|`ÿEû#òý‰ˆý .ø…ýïØ‘ÈØŸ»Øÿý‰Ð¾?ûf_°ÿû/Qû3nõ ûß!°ÿ"Ú÷gßèö¿C`ÿE"aÿ’Ç|Àþwì¿Hì_ô/ØÿýÉyû—=âö¿C`ÿE‚³þùÀþ‹$dF þܰÿû/’ý[âûß!°ÿ"ýùÀþ‹öGäû/Ø‘ì¿H<û¿3SZö¿Q`ÿEâÚŸ ô{iaØÿFý‰cÿ¦ýïØ‘¨ï¿±sü”Ãþì¿HÔçO:Úÿçã`ÿ‹ö_$ßëé#÷³ÿO|ü·mÑ‹-"²•ügŽz}5ûþJ¨’—v¬áߥÔ6LÅGÙÇzîûñß¶AF/¶ˆLÈVðŸ9VÏ¿rÍ⯠þÑQ(þÑžÿÇ6ÈèÅ‘ ÙÊþ3Çêù·\þ»Òǧ޷×ê(dãÿ´vŒü’êùžÿ…B¶ò€ÿÌqìoáO¤®ž4;¸+Ê=-dÒ ÷¿KÐó¿Hû»ÿ´öÖtȾ¦PÁw‘qÜÿ6AÏÿ"q÷ýCø+¥ü÷!aüÕ¾‡` ûß&°ÿ"ñí¯Ž-bo#@û fˆý®ö¦ûß%°ÿ"ñzþ•Gzfã?ˆ?öýoØ‘¸ö·¿ížÿ£söüûøzþu¶çö¿R`ÿER|ÜߊJüæö¿K`ÿEâÙ¿1þ°ÿû/Ûþ¤×އ¿ŠýÃö¿C`ÿE‚ëýùÀþ‹Ä¹ÛOsüaÿ;ö_$°?"Ø‘Àþˆ|`ÿEû#òý ìÈö_$°?"Ø‘Àþˆ|`ÿEû#òý‰±ÿþ,žvðÃþw ì¿Hû¿÷Áö¿C`ÿE²{Wõ ì‹Àþ‹d[O¿ö ì‡Àþ‹ä¹ž~íø•²§m¤u`ÿ5¢žDÆò™z³r¬¸ý»mƒ ­û/‘çz:Jêgòíʱböï¹ ‚¯Ö_°ÿQ}îø×kæýª±ÂöO¬/ª¶AÖálåÿ™£^?“yͼ_5VÄþÑå¨jiÖVðŸ9cz†¼Z4ÙÁWë/ÆVðGri³ ‚´c+ø#¹ŒÙAZç7ðGø#Èmóÿ÷qìy=B÷IEND®B`‚geomview-1.9.4/doc/figs/fig2.ps0000644000175000001440000016477607730233223013202 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: noname.ps %%Pages: 1 %%BoundingBox: 201 276 410 485 %%EndComments /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 435 string def %%EndProlog %%Page: 1 1 gsave 201.6 276.6 translate 208.8 208.8 scale 435 435 8 [ 435 0 0 -435 0 435 ] { picstr readstring } image 800080008000cd000000e3d6019d5680d680d68fd6015656e2d6019d007f 00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d 5656d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d32d69dd6 9dd69dd69dd69dd69dd69dd69dd69d56d6d69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d9d9d000300d69dd6e59d0256d6d680 9d809d919d035656d6d6e49d0156000200d6d6e49d0156d6809d809d8f9d 0156d6e49d02569d007f00d69dd69d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d567f9d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d567f9d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d562b9d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d56fb9d0156007f00d6d6 9d9d9d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d7f569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d7f569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d32569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d9d9dd69d569d000600d69dd69d569d800080008000db 0006d6d69d9d9d56000700d6d69d9d9d560080d680d680d6ddd60700d69d d69d569d007f00d69dd69d569d00d6d69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9dd6d69dd6 9dd6329dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69d00d6d69d9d9d56000800d6d69d9d 9d5600d6ea9d0156d6809d809da89d0156d6e99d0256d6d6eb9d085600d6 9dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d809da99d02 56d6d6eb9d025656d6fc9df200fd9d09565600d6d69d9d9d56000800d6d6 9d9d9d5600d6eb9d025656d6ee9dfc00cc9d0200009df900ed9d0500009d 9d0000f99d010000d99d010000ed9d010000809ddd9d025656d6e99d0656 d6d69d9d9d00f49d0000fc9d085600d69dd69d569d000900d69dd69d569d 00d6d6eb9d0256d6d6f19dfd00039d9d0000ce9d0500009d9d0000e89d05 00009d9d0000f99d010000d99d010000ec9d010000809ddd9d0256d6d6eb 9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d6 9d9d9d5600d6eb9d025656d6f19d010000fc9d010000cf9d0600009d9d9d 0000e99d010000f59d010000c29d010000809dde9d025656d6e99d0656d6 d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d 00d6d6eb9d0256d6d6f39d010000f69dfc00fd9d0800009d00009d000000 fc9dfc00fd9d0600009d00009d9dfc00f99d0600009d9d9d0000f99d0900 009d9d9d00009d9d9dfc00fd9d1100009d9d00009d9d9d0000009d00009d 9d9dfc00fc9dfc00fd9d0500009d000000fa9d010000fc9d0700009d0000 9d9d9dfc00109d9d00009d9d00009d9d00009d9d9d0000809dde9d0256d6 d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800 d6d69d9d9d5600d6eb9d025656d6f29d010000f79d1b00009d9d00009d9d 0000009d0000009d00009d9d00009d9d00009d9dfb00069d00009d9d0000 fa9d0600009d9d9d0000f99d3800009d9d9d00009d9d00009d9d00009d9d 00009d9d00009d9d00009d9d0000009d9d00009d9d00009d9d00009d9d00 009d9d0000009d9d0000fb9d010000fc9d1c00009d00009d9d00009d9d00 009d00009d9d00009d9d00009d9d9d0000809ddf9d025656d6e99d0656d6 d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b00d69dd69d569d 00d6d69d9df000fd9d0256d6d6f49d010000f29d1900009d9d00009d9d00 009d9d00009d00009d9d9d00009d9d0000f89d010000fb9d010000fc9df9 00029d0000fc9d1400009d00009d9d9d00009d00009d9d9d00009d0000fc 9d0900009d00009d9d9d0000fa9d0a00009d9d00009d9d9d0000fb9d2200 009d9d9d00009d9d00009d00009d9d9d00009d00009d9d00009d9d00009d 9d9d0000809dde9d0256d6d6f99dfc00f69d025656d6fc9d0000f49d0d00 009d9d565600d6d69d9d9d56000c00d6d69d9d9d5600d69d9d9d00f29d05 009d9d5656d6f39d010000f69dfb000d9d9d00009d9d00009d9d00009d9d fa00039d9d0000fb9dfb00fa9d0600009d9d9d0000f99d0a00009d9d9d00 009d9d0000fa9d1000009d9d00009d9d00009d9d9d00009d9dfa00fd9dfb 00089d9d00009d9d9d0000fa9d0b00009d9d00009d9d00009d9dfa000a9d 9d00009d0000009d0000fc9d010000809ddf9d025656d6f89d04009d9d00 00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00 d69dd69d569d00d6d69d9d00f29d0600009d9d56d6d6f49d010000f79d14 00009d9d00009d9d00009d9d00009d9d00009d0000f99d010000fc9d0500 009d9d0000fa9d0600009d9d9d0000f99d0900009d9d9d00009d0000f99d 0800009d9d00009d0000fc9d0400009d0000f99d0e00009d9d00009d9d00 009d9d9d0000fa9d0c00009d9d00009d9d00009d0000f99d0800009d009d 009d0000fc9d010000809dde9d0256d6d6f99d04009d9d0000f79d025656 d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00d6d69d9d9d56 00d69d9d9def00039d5656d6f39d010000fb9d1800009d00009d9d9d0000 9d9d00009d9d00009d9d00009d0000f99d0b00009d9d9d00009d9d9d0000 fa9d0600009d9d9d0000fa9d1a00009d9d9d00009d9d00009d9d9d00009d 9d00009d9d00009d0000fc9d0400009d0000fa9d0f00009d9d9d00009d9d 00009d9d9d0000f99d0b009d00009d9d9d00009d0000f99dfc00039d0000 00fb9d010000809ddf9d025656d6f89dfb00f69d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6fc9df100 049d9d56d6d6f39d2600009d9d0000009d9d00009d9d00009d9d00009d9d 00009d9d00009d9d00009d9d00009d9d0000fc9d0500009d9d0000f99d05 00009d9d0000f99d3800009d9d0000009d9d00009d9d00009d9d00009d9d 00009d9d00009d9d0000009d9d00009d9d00009d9d00009d9d00009d9d00 009d9d9d0000f89dfd00fd9d0900009d9d00009d9d0000fc9d0500009d9d 0000fb9d010000809ddd9d0256d6d6f89dfc00f79d025656d6fc9d0000f4 9d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d0256 56d6f19dfc00fb9dfd00109d00009d00009d9d00009d9d00009d9d9dfc00 fd9d010000fb9dfd00029d0000fa9d0300009d9df900fd9dfd00059d0000 9d9d9dfc00fd9d1100009d9d00009d9d9d0000009d00009d9d9dfc00fc9d fd000a9d00009d00009d9d9d0000f89d010000fc9d0400009d9d9dfc00fb 9d0500009d9d0000fb9d010000809dde9d025656d6e99d0656d6d69d9d9d 00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6eb 9d0256d6d6ba9d010000979d010000809ddc9d0256d6d6eb9d025656d6fc 9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6 eb9d025656d6b99d010000989d010000809ddc9d025656d6e99d0656d6d6 9d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00 d6d6eb9d0256d6d6b99d0100009a9d010000809dda9d0256d6d6eb9d0256 56d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d 5600d6eb9d025656d6809d809da99d025656d6e99d0556d6d69d9d9df100 fd9d085600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d680 9d809da99d0256d6d6eb9d025656d6fa9df3000b9d9d565600d6d69d9d9d 56000800d6d69d9d9d5600d6eb9d025656d6809d809da99d025656d6e99d 0256d6d6eb9d085600d69dd69d569d007f00d69dd69d569d00d69d9d569d 569d569d569d569d569d569d569d569d569d56d6569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d567f9d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d567f9d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d56d6569d569d56329d569d569d569d569d569d569d569d56 9d5656d69d569d569d569d569d569d569d569d569d569d569d565600d6d6 9d9d9d560008009d569d9d9d56009de956009d80568056a756009de85600 9de9560700d69dd69d569d000000fb56009d800080008000db0001d6d6fc 56ff000000fcd6029d5656805480548054dd540200d69dfcd6ff000700d6 d6d69d569d56805480548054dd540700d6d69dd6d6d6000700d6d69d9d9d 5656805480548054dd540700d69dd69d569d000700d69dd69d569d568054 80548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054 dd540700d69dd69d569d000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd54 0700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69d d69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d56 000700d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d6 9dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d 5656805480548054dd540700d69dd69d569d000700d69dd69d569d568054 80548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054 dd540700d69dd69d569d000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656ae548000 00008054b0540700d69dd69d569d000700d69dd69d569d56ae5400008054 00008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae5401000081 5400008054b1540700d69dd69d569d000700d69dd69d569d56ae54020054 00825400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae5403 00545400835400008054b1540700d69dd69d569d000700d69dd69d569d56 ae54040054545400845400008054b1540700d6d69d9d9d56000700d6d69d 9d9d5656ae540000fc540000855400008054b1540700d69dd69d569d0007 00d69dd69d569d56ae540000fb540000865400008054b1540700d6d69d9d 9d56000700d6d69d9d9d5656ae540000fa540000875400008054b1540700 d69dd69d569d000700d69dd69d569d56ae540000f9540000885400008054 b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000f95400008854 00008054b1540700d69dd69d569d000700d69dd69d569d56ae540000f854 0000895400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 0000f75400008a5400008054b1540700d69dd69d569d000700d69dd69d56 9d56ae540000f65400008b5400008054b1540700d6d69d9d9d56000700d6 d69d9d9d5656ae540000f55400008c5400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000f45400008d5400008054b1540700d6d6 9d9d9d56000700d6d69d9d9d5656ae540000f35400008e5400008054b154 0700d69dd69d569d000700d69dd69d569d56ae540000f25400008f540000 8054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000f1540000 905400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 f0540000915400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656 ae540000f0540000915400008054b1540700d69dd69d569d000700d69dd6 9d569d56ae540000ef540000925400008054b1540700d6d69d9d9d560007 00d6d69d9d9d5656ae540000ee540000935400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed5492008054b1540700d6d69d9d 9d56000700d6d69d9d9d5656ae540000ed540000cb540016ca5400008054 b1540700d69dd69d569d000700d69dd69d569d56ae540000ed540000cb54 011634cb5400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae 540000ed540000cc540316333333cc5400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000ed540000cc540317333433cc54000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000cd 5405171633333433cd5400008054b1540700d69dd69d569d000700d69dd6 9d569d56ae540000ed540000cd5405161733343334cd5400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ce54fd16fb 33ce5400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000cf540916171634333433343334cf5400008054b1540700d6d6 9d9d9d56000700d6d69d9d9d5656ae540000ed540000cf54091616173333 3334333333cf5400008054b1540700d69dd69d569d000700d69dd69d569d 56ae540000ed540000d0540b171617163433343334333433d05400008054 b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000d054 fc16f833d05400008054b1540700d69dd69d569d000700d69dd69d569d56 ae540000ed540000d1540d1617161716343334333433343334d154000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000d1 540d1716161634333333343333333433d15400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000d2540f17161716173334 333433343334333433d25400008054b1540700d6d69d9d9d56000700d6d6 9d9d9d5656ae540000ed540000d354fa16f433d35400008054b1540700d6 9dd69d569d000700d69dd69d569d56ae540000ed540000d3541116171617 1617333433343334333433343334d35400008054b1540700d6d69d9d9d56 000700d6d69d9d9d5656ae540000ed540000d454fd161017161616343333 33343333333433333334d45400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000d4541317161716171634333433343334 33343334333433d45400008054b1540700d6d69d9d9d56000700d6d69d9d 9d5656ae540000ed540000d554f916f133d55400008054b1540700d69dd6 9d569d000700d69dd69d569d56ae540000ed540000d65416171617161716 1716343334333433343334333433343334d55400008054b1540700d6d69d 9d9d56000700d6d69d9d9d5656ae540000ed540000d65417161716161617 161633343333333433333334333333343333d65400008054b1540700d69d d69d569d000700d69dd69d569d56ae540000ed540000d754191617161716 171617163433343334333433343334333433343334d75400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000d754f816ee 33d75400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000d8541b17161716171617161733343334333433343334333433 343334333433d85400008054b1540700d6d69d9d9d56000700d6d69d9d9d 5656ae540000ed540000d854fd1618171616161716333334333333343333 33343333333433333334d85400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000d9541d16171617161716171617333433 3433343334333433343334333433343334d95400008054b1540700d6d69d 9d9d56000700d6d69d9d9d5656ae540000ed540000da54f516ec33d95400 008054b1540700d69dd69d569d000700d69dd69d569d56ae540000ed5400 00da541f1716171617161716171634333433343334333433343334333433 343334333433da5400008054b1540700d6d69d9d9d56000700d6d69d9d9d 5656ae540000ed540000db54211616171616161716161617333333343333 3334333333343333333433333334333333db5400008054b1540700d69dd6 9d569d000700d69dd69d569d56ae540000ed540000db5421161716171617 16171617163433343334333433343334333433343334333433343334db54 00008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed54 0000dc54f416e833dc5400008054b1540700d69dd69d569d000700d69dd6 9d569d56ae540000ed540000dc5423171617161716171617161716343334 333433343334333433343334333433343334333433dc5400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000dd54251716 161617161616171616163433333334333333343333333433333334333333 343333333433dd5400008054b1540700d69dd69d569d000700d69dd69d56 9d56ae540000ed540000de54271716171617161716171617161733343334 3334333433343334333433343334333433343334333433de5400008054b1 540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000de54f3 16e533de5400008054b1540700d69dd69d569d000700d69dd69d569d56ae 540000ed540000df54291617161716171617161716171617333433343334 33343334333433343334333433343334333433343334df5400008054b154 0700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000df542916 161716161617161616171616163433333334333333343333333433333334 3333333433333334333333df5400008054b1540700d69dd69d569d000700 d69dd69d569d56ae540000ed540000e0542b171617161716171617161716 171634333433343334333433343334333433343334333433343334333433 3433e05400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 0000ed540000e054f216e233e05400008054b1540700d69dd69d569d0007 00d69dd69d569d56ae540000ed540000e1542d1617161716171617161716 171617163433343334333433343334333433343334333433343334333433 3433343334e15400008054b1540700d6d69d9d9d56000700d6d69d9d9d56 56ae540000ed540000e2542f161716161617161616171616161716163334 333333343333333433333334333333343333333433333334333333343333 e25400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 ed540000e2542f1716171617161716171617161716171634333433343334 33343334333433343334333433343334333433343334333433e254000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000e3 54f016de33e35400008054b1540700d69dd69d569d000700d69dd69d569d 56ae540000ed540000e35431161716171617161716171617161716173334 333433343334333433343334333433343334333433343334333433343334 3334e35400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 0000ed540000e454fd163017161616171616161716161617163333343333 333433333334333333343333333433333334333333343333333433333334 e45400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 ed540000e554341617161716171617161716171617161716173334333433 343334333433343334333433343334333433343334333433343334333433 e45400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000 ed540000e554ee16dc33e55400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000e6543717161716171617161716171617 161716171617333433343334333433343334333433343334333433343334 33343334333433343334333433e65400008054b1540700d6d69d9d9d5600 0700d6d69d9d9d5656ae540000ed540000e6543716171616161716161617 161616171616161733333334333333343333333433333334333333343333 33343333333433333334333333343333e65400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000e7543916171617161716 171617161716171617161716343334333433343334333433343334333433 343334333433343334333433343334333433343334e75400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000e754ed16d9 33e75400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000e8543b17161716171617161716171617161716171617163433 343334333433343334333433343334333433343334333433343334333433 3433343334333433e85400008054b1540700d6d69d9d9d56000700d6d69d 9d9d5656ae540000ed540000e9543c171616161716161617161616171616 16171616162e2d3333343333333433333334333333343333333433333334 33333334333333343333333433333334e85400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000e9543d16171617161716 1716171617161716171617162e2d2e2d2e33343334333433343334333433 34333433343334333433343334333433343334333433343334e954000080 54b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ea 54ee16f82dda33ea5400008054b1540700d69dd69d569d000700d69dd69d 569d56ae540000ed540000ea543f17161716171617161716171617161716 172d2e2d2e2d2e2d2e2d2e2d343334333433343334333433343334333433 343334333433343334333433343334333433ea5400008054b1540700d6d6 9d9d9d56000700d6d69d9d9d5656ae540000ed540000eb54411616171616 1617161616171616161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e33333334 333333343333333433333334333333343333333433333334333333343333 33eb5400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000eb5441161716171617161716171617161716172d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e3334333433343334333433343334333433343334 3334333433343334333433343334eb5400008054b1540700d6d69d9d9d56 000700d6d69d9d9d5656ae540000ed540000ec54f016ed2ddf33ec540000 8054b1540700d69dd69d569d000700d69dd69d569d56ae540000ed540000 ed5445161716171617161716171617161716172d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d3433343334333433343334333433343334333433 34333433343334333433343334ed5400008054b1540700d6d69d9d9d5600 0700d6d69d9d9d5656ae540000ed540000ed544517161616171616161716 16161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d33 343333333433333334333333343333333433333334333333343333333433 ed5400008054b1540700d69dd69d569d000700d69dd69d569d56ae540000 ed540000ee54471716171617161716171617161716172d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e333433343334333433343334 33343334333433343334333433343334333433ee5400008054b1540700d6 d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ee54f216e32de3 33ee5400008054b1540700d69dd69d569d000700d69dd69d569d56ae5400 00ed540000ef544916171617161716171617161716172d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d34333433343334 33343334333433343334333433343334333433343334ef5400008054b154 0700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000ef544916 1617161616171616161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e 2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e3333333433333334333333343333 33343333333433333334333333ef5400008054b1540700d69dd69d569d00 0700d69dd69d569d56ae540000ed540000f0544b17161716171617161716 1716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e333433343334333433343334333433343334333433 343334333433f05400008054b1540700d6d69d9d9d56000700d6d69d9d9d 5656ae540000ed540000f154f316d92de633f15400008054b1540700d69d d69d569d000700d69dd69d569d56ae540000ed540000f1544d1617161716 171617161716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d343334333433343334333433 34333433343334333433343334f15400008054b1540700d6d69d9d9d5600 0700d6d69d9d9d5656ae540000ed540000f2544f16171616161716161617 16162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d3334333333343333333433333334 33333334333333343333f25400008054b1540700d69dd69d569d000700d6 9dd69d569d56ae540000ed540000f2544f17161716171617161716172d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e33343334333433343334333433343334 33343334333433f25400008054b1540700d6d69d9d9d56000700d6d69d9d 9d5656ae540000ed540000f354f516cf2dea33f35400008054b1540700d6 9dd69d569d000700d69dd69d569d56ae540000ed540000f4545217161716 171617161716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e33 34333433343334333433343334333433343334f35400008054b1540700d6 d69d9d9d56000700d6d69d9d9d5656ae540000ed540000f454fd16501716 16161716162d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e33 33333433333334333333343333333433333334f45400008054b1540700d6 9dd69d569d000700d69dd69d569d56ae540000ed540000f5545516171617 1617161716172d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d34333433343334333433343334333433343334f55400008054b154 0700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000f554f716 c52dee33f55400008054b1540700d69dd69d569d000700d69dd69d569d56 ae540000ed540000f654571716171617161716172d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e3334333433343334 333433343334333433f65400008054b1540700d6d69d9d9d56000700d6d6 9d9d9d5656ae540000ed540000f6545716171616161716162d2e2d2d2d2e 2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d3334 3333333433333334333333343333f65400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000ed540000f75459161716171617162e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d343334333433343334333433343334f75400008054b15407 00d6d69d9d9d56000700d6d69d9d9d5656ae540000ed540000f854f916ba 2df233f75400008054b1540700d69dd69d569d000700d69dd69d569d56ae 540000ed540000f8545b1716171617162e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d 2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e33 343334333433343334333433f85400008054b1540700d6d69d9d9d560007 00d6d69d9d9d5656ae540000ed540000f9545d1716161617162d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e 2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d 2d2e2d2d2d2e2d2d2d2e33333334333333343333333433f95400008054b1 540700d69dd69d569d000700d69dd69d569d56ae540000ed540000f9545d 16171617162e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d34333433343334 33343334f95400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656 ae540000ed540000fa54fb16b02df533fa5400008054b1540700d69dd69d 569d000700d69dd69d569d56ae540000ed540000fa545f171617162e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e333433343334333433fa 5400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae540000ed 540000fb5461161617162d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d333433333334333333fb5400008054b1540700d69dd69d569d 000700d69dd69d569d56ae540000ed540000fc5463171617162e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d34333433343334 33fc5400008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae5400 00ed540000fc54fd16a62df933fc5400008054b1540700d69dd69d569d00 0700d69dd69d569d56ae540000ed546d005454541617162e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e33343334 3334545454008054b1540700d6d69d9d9d56000700d6d69d9d9d5656ae54 80000100008054b1540700d69dd69d569d000700d69dd69d569d56ad54fb 00f2546d00545417162e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d343334335454008054b1540700 d6d69d9d9d56000700d6d69d9d9d5656a854fc00f65403005454169b2d04 33335454008054b1540700d69dd69d569d000700d69dd69d569d56a454fc 00fa546d0054162e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e 2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e2d2e333454008054b1540700 d6d69d9d9d56000700d6d69d9d9d5656a054fb006e5400162d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d 2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d2d2d2e2d 2d2d2e2d2d2d2e2d2d2d34008054b1540700d69dd69d569d000700d69dd6 9d569d569b5492008054b0540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd54 0700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69d d69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d56 000700d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d6 9dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d 5656805480548054dd540700d69dd69d569d000700d69dd69d569d568054 80548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054 dd540700d69dd69d569d000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd54 0700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69d d69d569d000700d69dd69d569d568054a8549400a1540700d6d69d9d9d56 000700d6d69d9d9d56568054a8540000985402005454fc00a5540700d69d d69d569d000700d69dd69d569d568054a854000098540000fa54fc00a954 0700d6d69d9d9d56000700d6d69d9d9d56568054a85401000099540000f6 54fb00ae540700d69dd69d569d000700d69dd69d569d568054a854010000 99540000f154fc00b2540700d6d69d9d9d56000700d6d69d9d9d56568054 a854010000cb54f037de540000ed54fc00b6540700d69dd69d569d000700 d69dd69d569d568054a8548000fb00ba540700d6d69d9d9d56000700d6d6 9d9d9d56568054a85402005400ec54b637f8540000e5540000bb540700d6 9dd69d569d000700d69dd69d569d568054a85402005400ec544a38373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 3837373738373737383737f9540000e5540000bb540700d6d69d9d9d5600 0700d6d69d9d9d56568054a85402005400ed54b337fa540000e5540000bb 540700d69dd69d569d000700d69dd69d569d568054a85402005400ed54fd 374938373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837373738373737383737373837fa540000e5540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400ee54b137fb540000 e5540000bb540700d69dd69d569d000700d69dd69d569d568054a8540200 5400ef54fd374d3837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 37373738373737383737373837373738373737383737373837fc540000e5 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854020054 00ef54af37fc540000e5540000bb540700d69dd69d569d000700d69dd69d 569d568054a85402005400f0545637373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 3737383737373854545400e5540000bb540700d6d69d9d9d56000700d6d6 9d9d9d56568054a85402005400f054ad37fd540000e5540000bb540700d6 9dd69d569d000700d69dd69d569d568054a85402005400f1545737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737545400e5540000bb54 0700d6d69d9d9d56000700d6d69d9d9d56568054a85402005400f254a937 015400e5540000bb540700d69dd69d569d000700d69dd69d569d568054a8 5402005400f2545838373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837375400e5540000bb540700d6d69d9d9d56000700d6d69d9d9d56 568054a85402005400f354a7370000e5540000bb540700d69dd69d569d00 0700d69dd69d569d568054a85402005400f354fd37563837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 38373737383737373837373738373737383737e5540000bb540700d6d69d 9d9d56000700d6d69d9d9d56568054a85402005400f454a537e5540000bb 540700d69dd69d569d000700d69dd69d569d568054a85402005400f4545b 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 3837e6540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854 02005400f554a237e7540000bb540700d69dd69d569d000700d69dd69d56 9d568054a85402005400f6545e3737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738e7540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a85402005400f654a037e8540000bb54 0700d69dd69d569d000700d69dd69d569d568054a85402005400f7546137 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837373738e9540000bb540700d6d69d9d9d56000700d6d69d9d9d56 568054a85402005400f7549e37e9540000bb540700d69dd69d569d000700 d69dd69d569d568054a85402005400f85463383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 38373737383737373837373738373737383737373837373738373737ea54 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a85402005400 f8549b37eb540000bb540700d69dd69d569d000700d69dd69d569d568054 a85402005400f954fd376238373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 3738373737383737373837373738373737383737eb540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400fa549837ec540000 bb540700d69dd69d569d000700d69dd69d569d568054a85402005400fa54 683737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 37383737373837373738373737383737ed540000bb540700d6d69d9d9d56 000700d6d69d9d9d56568054a85402005400fb549637ed540000bb540700 d69dd69d569d000700d69dd69d569d568054a85402005400fb546a373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 3837373738373737383737373837ee540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a85402005400fc549437ee540000bb540700d69d d69d569d000700d69dd69d569d568054a85402005400fc546c3837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 3738373737383737373837373738ef540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a854050054005454549137f0540000bb540700d6 9dd69d569d000700d69dd69d569d568054a8547400540054543837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 3738373737383737373837373738373737f0540000bb540700d6d69d9d9d 56000700d6d69d9d9d56568054a8540400540054548f37f1540000bb5407 00d69dd69d569d000700d69dd69d569d568054a854760054005437373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737f2540000bb540700d6 d69d9d9d56000700d6d69d9d9d56568054a85403005400548d37f2540000 bb540700d69dd69d569d000700d69dd69d569d568054a854770054003737 383737373837373738373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737373837373738373737383737373837373738373737383737373837 37373837373738373737383737373837373738373737383737f3540000bb 540700d6d69d9d9d56000700d6d69d9d9d56568054a854020054008a37f4 540000bb540700d69dd69d569d000700d69dd69d569d568054a854780054 003837373738373737383737373837373738373737383737373837373738 373737383737373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 3737373837373738373737383737373837373738373737383737373837f4 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854020037 008937f5540000bb540700d69dd69d569d000700d69dd69d569d568054a8 547900360037373837373738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 3737373837373738377d3738373737383737373837373738373737383737 373837373738373737383737373837373738373737383737373837373738 37373724f5540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054 a85402003500c137027c7c7dcc37f4540000bb540700d69dd69d569d0007 00d69dd69d569d568054a854780036003637373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 38373737383737373837373738373737387c7d7c7d7c7d7c383737373837 373738373737383737373837373738373737383737373837373738373737 3837373738373737383737373824f4540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a854040035003536c637087c7d7c7d7c7d7c7d7c d0370024f4540000bb540700d69dd69d569d000700d69dd69d569d568054 a85477003600363636373737383737373837373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383737377d7c7d7c7d7c7d7c7d7c7d7c7d37373738373737383737373837 373738373737383737373837373738373737383737373837373738373737 383724f3540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8 540600350035363536cc370f7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7cd537 012424f3540000bb540700d69dd69d569d000700d69dd69d569d568054a8 5402003600fb36fd376b3837373738373737383737373837373738373737 3837373738373737383737373837373738373737383737373837377c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c3737383737373837373738373737 38373737383737373837373738373737383737373837373738373724f254 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a85408003500 353635363536d137157d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7cd937012424f2540000bb540700d69dd69d569d000700d69dd69d569d56 8054a85402003600f936fd37693837373738373737383737373837373738 373737383737373837373738373737383737373837373738377d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d37383737373837373738 3737373837373738373737383737373837373738373737383737372424f2 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8540a0035 003536353635363536d637fd7c187d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7ddd37012424f1540000bb540700d69dd69d569d0007 00d69dd69d569d568054a85402003600f736fd3766383737373837373738 3737373837373738373737383737373837373738373737383737377d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c38 373737383737373837373738373737383737373837373738373737383737 37242424f1540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054 a8540c00350035363536353635363536db37217d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7ce137fd24f15400 00bb540700d69dd69d569d000700d69dd69d569d568054a85402003600f5 36fd37633837373738373737383737373837373738373737383737373837 37373837377c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d3737373837373738373737383737373837 3737383737373837373738242424f0540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a8540e003500353635363536353635363536e037 277c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7ce537fd24f0540000bb540700d69dd69d569d00 0700d69dd69d569d568054a85402003600f336fd375d3837373738373737 3837373738373737383737373837373738377d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c373738373737383737373837373738373737383737373837fc24f054 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8540f003500 35363536353635363536353635e5372e7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7cea37fc24ef540000bb540700d69dd69d569d000700d69dd69d569d 568054a85402003600f2365e383737373837373738373737383737373837 373738373737387c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d373837 3737383737373837373738373737383737fc24ef540000bb540700d6d69d 9d9d56000700d6d69d9d9d56568054a85411003500353635363536353635 363536353635ea37347d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7dee37fc24ee540000bb540700d69dd69d569d000700d69dd69d569d56 8054a85402003600f0365b38373737383737373837373738373737383737 377d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c383737 37383737373837373738373737fc24ee540000bb540700d6d69d9d9d5600 0700d6d69d9d9d56568054a8541300350035363536353635363536353635 36353635ef373a7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7cf237fb24ee540000bb540700d69dd69d569d000700d69dd6 9d569d568054a85402003600ee365738373737383737373837373738377d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d3737373837373738373737fb24ed540000bb540700d6d69d9d9d5600 0700d6d69d9d9d56568054a8541500350035363536353635363536353635 363536353635f437407c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7cf637fb24ed540000bb540700d69dd69d 569d000700d69dd69d569d568054a85402003600ec365438373737383737 37387c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c37373837373738fa24ed540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a854170054003536353635363536 35363536353635363536353635f937467c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfa37fb 24ec540000bb540700d69dd69d569d000700d69dd69d569d568054a85402 005400ea3651383737377d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d373837fa24 ec540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8546900 5400353635363536353635363536353635363536353635363537377d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d37fa24eb540000bb540700d69dd69d56 9d000700d69dd69d569d568054a8540300540054e9364e7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7dfa24eb540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a854680054005436353635363536353635363536 353635363536353635367c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfa24 ea540000bb540700d69dd69d569d000700d69dd69d569d568054a8540400 54005454ea364d7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfa24ea5400 00bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8546800540054 5435363536353635363536353635363536353635363536357d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7dfb24e9540000bb540700d69dd69d569d000700 d69dd69d569d568054a85405005400545454ea364b7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7dfa24e9540000bb540700d6d69d9d9d56000700d6d69d9d 9d56568054a85402005400fc546035363536353635363536353635363536 35363536357d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24e8540000bb5407 00d69dd69d569d000700d69dd69d569d568054a85402005400fc54ea3649 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24e7540000bb540700d6d69d9d9d56 000700d6d69d9d9d56568054a85402005400fb545e363536353635363536 3536353635363536353635367c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7cfb24e754 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 fb54eb36487d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfb24e6540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400fa545c3536353635 363536353635363536353635363536357d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24 e6540000bb540700d69dd69d569d000700d69dd69d569d568054a8540200 5400fa54eb36467c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24e5540000bb540700d6d6 9d9d9d56000700d6d69d9d9d56568054a85402005400f9545a3635363536 3536353635363536353635363536357c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7dfb24e554 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 f854ec36447d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7dfb240000e5540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a85402005400f8545835363536353635 363536353635363536353635367c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb240000e5540000 bb540700d69dd69d569d000700d69dd69d569d568054a85402005400f754 ed36447d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7dfc24015400e5540000bb540700d6d69d9d9d 56000700d6d69d9d9d56568054a85402005400f754563635363536353635 3635363536353635363536357d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7cfb24015400e5540000bb54 0700d69dd69d569d000700d69dd69d569d568054a85402005400f654ed36 427c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7cfc2402545400e5540000bb540700d6d69d9d9d560007 00d6d69d9d9d56568054a85402005400f654543536353635363536353635 36353635363536357d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb2402545400e5540000bb540700d69d d69d569d000700d69dd69d569d568054a85402005400f554ed36407d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7dfc24fd540000e5540000bb540700d6d69d9d9d56000700d6d69d9d9d 56568054a85402005400f454513536353635363536353635363536353635 367c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7dfb24fd540000e5540000bb540700d69dd69d569d000700d69d d69d569d568054a85402005400f454ed363e7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc24fc540000e55400 00bb540700d6d69d9d9d56000700d6d69d9d9d56568054a85402005400f3 544f3635363536353635363536353635363536357d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfb24fc540000e554 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 f354ee363d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7dfc24fb540000e5540000bb540700d6d69d9d9d56000700 d6d69d9d9d56568054a85402005400f2544e353635363536353635363536 3536353635367c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7cfc24fb540000e5540000bb540700d69dd69d569d000700 d69dd69d569d568054a85402005400f254ee363b7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc24fa540000e5540000 bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854ee004c363536 35363536353635363536353635367c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24f900e5540000bb540700d69dd69d 569d000700d69dd69d569d568054a85402005400f054ef36397c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24f8540000e6 540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a854020054 00f0544a35363536353635363536353635363536357d7c7c7c7d7c7c7c7d 7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c 7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7cfc24f7540000e7540000bb 540700d69dd69d569d000700d69dd69d569d568054a85402005400ef54f0 36387c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc 24f5540000e8540000bb540700d6d69d9d9d56000700d6d69d9d9d565680 54a85402005400ef544836353635363536353635363536353635367c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24f4540000e9 540000bb540700d69dd69d569d000700d69dd69d569d568054a854020054 00ee54f036367d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7dfc24f2540000ea540000bb540700d6d69d9d9d56000700d6d69d9d9d56 568054a85402005400ed54453635363536353635363536353635367c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7cfc24f1540000eb54 0000bb540700d69dd69d569d000700d69dd69d569d568054a85402005400 ed54f036347c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7cfc24 ef540000ec540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054 a85402005400ec54433536353635363536353635363536357d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7dfc24ee540000ed540000bb5407 00d69dd69d569d000700d69dd69d569d568054a85402005400eb54f23637 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d 7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c242424ec540000 ee540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a8540200 5400e854413536353635363536353635367c7d7c7c7c7d7c7c7c7d7c7c7c 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c242424ea540000ef540000bb540700d69dd69d569d00 0700d69dd69d569d568054a85402005400e554f736347d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d2424e9540000ef540000bb540700d6d69d 9d9d56000700d6d69d9d9d56568054a754010000e254393536353635367c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d2424e7540000f0540000bb 540700d69dd69d569d000700d69dd69d569d568054a754010000df54fc36 317c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c 7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c7d7c24e5540000f1540000bb 540700d6d69d9d9d56000700d6d69d9d9d56568054a754010000dc543135 7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c 7c7c7d7c7c7c7d7c7c7c7d7c7c7c7d7c7c7c24e3540000f2540000bb5407 00d69dd69d569d000700d69dd69d569d568054a7540100008c540000f354 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a7540100008b 540000f4540000bb540700d69dd69d569d000700d69dd69d569d568054a7 540100008a540000f5540000bb540700d6d69d9d9d56000700d6d69d9d9d 56568054a75401000089540000f6540000bb540700d69dd69d569d000700 d69dd69d569d568054a75401000088540000f7540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a75401000087540000f8540000bb5407 00d69dd69d569d000700d69dd69d569d568054a75401000086540000f954 0000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a75401000085 540000fa540000bb540700d69dd69d569d000700d69dd69d569d568054a7 5401000085540000fa540000bb540700d6d69d9d9d56000700d6d69d9d9d 56568054a75401000084540000fb540000bb540700d69dd69d569d000700 d69dd69d569d568054a75401000083540000fc540000bb540700d6d69d9d 9d56000700d6d69d9d9d56568054a7540100008254040054545400bb5407 00d69dd69d569d000700d69dd69d569d568054a754010000815403005454 00bb540700d6d69d9d9d56000700d6d69d9d9d56568054a7540100008054 02005400bb540700d69dd69d569d000700d69dd69d569d568054a7540100 00805402540000bb540700d6d69d9d9d56000700d6d69d9d9d56568054a6 548000fd00ba540700d69dd69d569d000700d69dd69d569d568054805480 54dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd5407 00d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d 9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d00 0700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d6 9d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d 56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480 548054dd540700d69dd69d569d000700d69dd69d569d56805480548054dd 540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d6 9dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d 56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d000700 d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d 9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d5680 5480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054805480 54dd540700d69dd69d569d000700d69dd69d569d56805480548054dd5407 00d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd6 9d569d000700569d569d569d56805480548054dd540700d6d69d569d5600 0000fc56029d5656805480548054dd540200d69dfc56ff000000fcd60256 9d56805480548054dd540000fad6ff000700d6d6d69d9d56568054805480 54dd540200d69dfcd6ff000700d69dd69d569d56805480548054dd540700 d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d 569d000700d69dd69d569d56805480548054dd540700d6d69d9d9d560007 00d6d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd6 9d569d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d5656 805480548054dd540700d69dd69d569d000700d69dd69d569d5680548054 8054dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd54 0700d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d6 9d9d9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d 000700d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6 d69d9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d56 9d56805480548054dd540700d6d69d9d9d56000700d6d69d9d9d56568054 80548054dd540700d69dd69d569d000700d69dd69d569d56805480548054 dd540700d6d69d9d9d56000700d6d69d9d9d5656805480548054dd540700 d69dd69d569d000700d69dd69d569d56805480548054dd540700d6d69d9d 9d56000700d6d69d9d9d5656805480548054dd540700d69dd69d569d0007 00d69dd69d569d56805480548054dd540700d6d69d9d9d56000700d6d69d 9d9d5656805480548054dd540700d69dd69d569d000700d69dd69d569d56 805480548054dd540700d6d69d9d9d56000700d6d69d9d9d565680548054 8054dd540700d69dd69d569d000700d69dd69d569d56800080008000dc00 06d6d69d9d9d56000600d6d69d9d9d5680d680d680d6dad6059dd69d569d 007f00d69dd69d569dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6329d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69d9d9d56000200d6d6e49d0156d680 9d809d8f9d0156d6e49d02569d000300d69dd6e59d0256d6d6809d809d91 9d035656d6d6e49d0156007f00d6d69d569d569d569d569d569d569d569d 569d569d569d569d569d569d5656d6d6569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d7f569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d7f 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d32569d569d569d569d569d569d569d569d569d56d6d6 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d00 0100d6e25601d6d6805680568f5601d6d6e356ff00800080008000cd00 grestore showpage %%Trailer geomview-1.9.4/doc/figs/initial.ps0000644000175000001440000010104210447731022013754 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: blah-000.ps %%Pages: 1 %%BoundingBox: 60 276 551 516 %%EndComments %%Page: Image0 1 /picstr 3066 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def %%EndProlog %%Page: 1 1 gsave 60.72 276.48 translate 490.56 239.04 scale 1022 498 8 [ 1022 0 0 -498 0 498 ] { inputf picstr readstring pop } false 3 colorimage 78DAEDDDCD91E336A370E109C49B594C04AEBAF5ADBD9EE51B42A7F0EE9DC48D 4359388D09C55F97BBAE4A1649100001E2EF390B558F8692D812D53A3C02C1BF FF06000000000000000000000000000000000000002CC1370040537C1201006E 33FFBFEAF0E79F7FFEF1C71F7F01C0B0D4FE3BF679FFCC1F80C28CDBDAD1D3FC 3F3F80CA5EFEF10FAF1F702E5DBA7439D665EDBF639F77CEFC0128CC5316E63E DBD1D72BF2FC182ACBF3F7FD1300C6A4DEDFB1CF7BD6FC012C62FE0B16E63EDB D1EB2B52E91393390018DDFCEBDD39F30730BDF92F5B983B6C476FAFC8D7FDB8 74E9D2A5CB7A97AF7F6F993F80459AFF8285B9C376B47D457C28BB74E9D2656D EDD7FC012CD8FC7D04346F47BBAF8803A501A006BB7F6FB90180759A3F756FDB 8E765F917A076203C0B21CFDBDE50600966AFE2A50C37674743FA50E4336A5A7 4B972E87BE7CFE29BB7E6F9A3F00CD5F616EDB8E02AF88B97D000C3D214F577F C75E3FEC347F008B37FF450A7387EDE8F415997BB62500536A7FC1ECB0FD3B16 FFCDECAEF96BFE0034FF9E0BF3DCEDA8DE2B72F1C3F7E8D3B3379E6B78FAB99F 77B76F3F07166BF58B37B93970CFDFEDDDBF63919BEEEB625FF7A3F903D0FC3B 2FCCD3B7A30E5F91B75FB96745ACB79ED39B3FF9C7D0CD3F630BD7FC0168FEB5 0B738C452FDE8E7A6BFEDB17A85B3F7C5BB182EB197957A39B33F3C7F4CDFFB9 A4E60F40F3BFB330673BC6F4EDA8ABE61FF332EDEEC1BD0DB9D97E719074DB3F 23C61AC56B7F78C9F02A05968FBCABC8DF7A77E5037B61A70F1DF333F987E6AF F903D0FC6BFCA9BF221873B7A3AE9AFFE9CB14F6C9ADCAC6BB68CCAD8A9BFFF5 9F6BDC3CD5FC777F66FED0FC357F0068529803561308A49AFF733D534F3490F7 E19B2A8149AE1B1FD5E3379EA3CD2990E5635629F2FAC8DF2EE6198BFC35939E 58E68F9E9B7FD2E04FCD1F00C66AFEE1A1E3A712A8F9A70A79DE4E53EA509FBC C41DDFBAE387C15C0FFE191B67CC6F17F38C5D5C93D32736723F08B8B3F9C71F 98AFF90340EDE65FBC30C70CB40E68FFDCED28F215C94BF1659B7FF6E096A4B9 71EE19EA1379938CE07F712722E9E6310FFD76C9FCD149F38FDF02357F00A8DA FCCB16E653D938D598B9DB51E42B92B13B56A4F9A70ED7B968FE194A9CB758EA AF9361FE798FBEBB7967EFBF9C1E47CCFCD1AAF947461BCD1F006E68FE050B73 5EF08F1FB2327A3B8A3FF222E38B982B73FB14398235757057C62CFA498BF573 6C6FA47BC7CF3B94F164D27EB46AFE495FD76AFE0050BBF9172CCC17CD7FFA76 D4E77CFEE1E1F77FE61E491A7F586B7C4E0F8F404B9D84B3D27C9E7FA61F0E9C F495D9A9D8337F74D5FC2FFE1DD3FC01A0CFC29C776C6FEADC3E43B7A3E1CEAA DC09ACD51388A19BFF95BF639A3F00F45998F3E6F37CBBDEDC3E3D7CF81257CF 1EA0F903C0ACCDBF93C26C3E7FCD9FBE7ADEA0F96BFE00D07FF3D78E347F009A 7FF1BFDB198351357F009ABFE6AFF903C058CD3FC9FF357F00CC5FF3EFA71D69 FE0034FFDA7FC7347F009ABFE6DF433B0ABC22CFC7BA72F9793F17EFC1A54B97 2E532F9F7FB78BDC5BA9BF639A3F00CD7FF1E6DFBC1D3DCF86F0763FCF07BA48 A9FB0180567F7C4ADDD5EBDFEDD7DD016E0060C1E6DF6D619EBB1D7DDE64FB19 F70D005081E75FECD7DD016E006062F31FB1304FDC8E9EF7F37A6F9FFC070050 94B7BFB75F307F00739BBFC2DC553B7AFD247ADD89F0190D0035CCFFEBBB5AE6 0F609DD13EDBC2FC0B89946A47BBC70B307F00A8D7FCCDED036041F37F2DCC4C 3E898F8F8F52ED68F77801E60F00559BBFB97D002C65FE6F85F94B681F88E0E3 1FAACEE7CFFC0140F3078022E6BF2DCCCC3FCFFC2BCDE7CFFC0140F307801B9A 7FDB813491FADD70DD347F00D0FC01608EE6DF76FC7CB7E6FF5C37CD1F00347F 0098A9F9B71A459364FE4DD64DF30700CD1F00666AFECC3FC6FC357F00D0FC01 40F3D7FC357F00D0FC0140F3D7FC357F00D0FC0140F3D7FC7D460380E60F009A BFE60F00D0FC0140F3D7FC01009A3F0068FE9A3F0068FE9A3F00CD9FF96BFE00 A0F90380E6FF79DB5D2B3EBA3EE67F4B99FFB77FA3F90300347F00CC3FBBF9EF 4A7541D3BE68FE79BB1B9A3F0068FE00A0F96798FFB6BA3F7FFEFA21B0A750D0 FCDFAE395AABEDCA1C7D6BA0F90380E60F004B35FFAD516FDD7E57F8DF347B57 FE2B99FFD15AEDAEE1D11D6AFE00A0F903C052CD3F6CFE61F10E787513F38FBC 52F30700CD1F00D66CFEA7A9FF6DC0CC58E67F7498B0E60F009A3F00ACD6FC03 E67F3ADA67A0E66F9C3F0068FE00A0F9E7E9F49DE67F71558DF30700CD1F0034 FFD39F9F4365628EFFBD673EFFC08C43A7B30069FE00A0F903C06ACDDF397C35 7F00D0FC016085E6CFFC357F00D0FC0140F3D7FC357F00D0FC0140F3D7FC357F 00D0FC0140F3D7FC357F00D0FC0140F3D7FC01009A3F0068FE9A3F0040F30700 CD5FF3070068FE00347FCD5FF30700CD9F1B00D0FC99BFE60F009A3F00ACD0FC 3F1A9164FE4DD64DF30700CD1F00A669FE1FED8837FF56EBA6F90380E60F0073 347FC48CFCD1FC0140F30780D19B3FE2CD5FF30700CD1F00347FCD5FF30700CD 1F00347FCD5FF30700CD1F00347FCDDF67340068FE00A0F96BFE0000CD1F007A 6BFEDFF628FE109A3F0040F307804E9A7F3D3F6F68FE9A3F0068FE00A0F99FFA F9F62B80AF9F9FD73CFFF76D99D75B55FA1E41F30700CD1F0034FF22E6BF15FE 57D53FBDF26D01CD1F00A0F90340B7CD3FECF0A792DF83F96BFE00A0F90380E6 1F3FDA27C9FCC3B7D2FC01009A3F0074D5FCE393FE69DED7FC01009A3F0074DB FC9306F318E70F00D0FC0160D0E6FF362DCF760E9FC8B97DDE760D347F0080E6 0F007F0F7B0EDF9BABBEE60F009A3F0068FE4D6CBF5BF3D7FC0140F30700CDBF 88FCDF3C9247F30700CD1F00347F68FE00A0F90380E6BFA6F96BFE00A0F90380 E6AFF96BFE00A0F90380E6AFF96BFE00D067F3FF06007D53B0F97F600FCD1F00 1669FECF258BF3F5A07F0198972F91AB77FF49A939A6F993FC2DAF5F8868FE00 307DF37F7EC296BD7C5382E2F7EFD2A5CB1E2E9F6FF3E2F7FC458DE66F54CF93 B7A1509A3F00ACD0FCDF3E6A4BF1AA0400E6E37507BFD2FDD768FE843FC6FC35 7F0098BBF957327F7604CC2DFFF5FE8068FE9A3F00A05EF37F3619972E5DBA6C 72A9F96BFE0080DB9A3FF170E9D2655BEDCF134ECD5FF30700CD3FA3F99B4510 4013AE08A7E6AFF90380E69FD1FCEB4DF50900475C144ECD5FF30700CD3FAFF9 979AA6CF949E2E5D7678F97C7B76B5560D9BFFE76D4F7F0EB3BB64FCCD357F00 40DBE66F6E1FC0843CB74DDEFBFA97E7FEE6CFFC357F00D0FC3B51020035CCBF C87B7CBB13113FAAFFED7E3A6FFECFD57EFBDFD7CBD725357FCD1F00D669FEBB 4A10CFAE1EDC4C93470F3852A9F5E9E1B9ADF48C51FA1BDE9BA73B11912FC4DB 626D9BFFABA56F7F38FAF9754760F707CD5FF30700CD3F52E41AEA77F387DE7D F4EBEB33D9735BFCD75967F7A176F34F7DB69B37FFDD801F63FE91576AFE9A3F 0068FE91EAB566CE7DFBAD2B696DABE7B6C6AFC3FC876BFE6F037E7A68FECC5F F30700CDFF9EAE18E35D47433B76AFDF8E9339ADC447436BB6F71FF3730DAD8D FFF5DB3EB7E1E76D771453F8818AFC3AE12D2170E5E916A2F98FDEFCC3D2AEF9 6BFE00A0F997ED8AA72A952ADE5BBDDC55CD53F3DFFDB989F99FEEBF1C3DFAFD CF6DFC53143EF633CFFC63563B66AD02F730AEF96BFEF798BF71FE9A3F008CD8 FC53CFC299D7154F7371647A4D32CF98DBC63CEE9DCD3FFE57E8FFB94D52EE3C EDBFA2F7F1AB3459F38FDFB559A7F907E6F6399A0548F3D7FC0160C4E69FE439 6F1FE51787FA045AEBA9A4E545EC8CC78D997E27BC8B94ADFD81D5EBE4B98DBF CFE2E69FF4D0A75F434CA6FDE1F766D2EF3B53F3770E5FCD1F0034FF54F37F95 FF2BCD3F664CF595289D11AE8FD6EDF5B261F0EFE7B98D3FE220FE508B48F3CF 7BE848BD9FE610E0D3E61FF9FB4ED6FC99BFE60F009AFFB7748A34FF8CE1EB79 83CCF3D47A77C04CC1F9F6AB9A7FEDE7365EDA4B99FF959D8EF86994D669FE49 037E347FCD5FF30780699A7F86FFE7CD1F927124E6959F771F28E3B6659D3063 A84F6A09BFE1B9CD183F1F7E51CAFE3A4506FF4FDCFCE387FA6BFE9ABFE60F00 9335FF3BE70FD986F45315399D1026DEDE4F877C9FFAE7CDE69F7430E6CDCF6D F83E93BE6E4855D3983982329ED59986FA98DB079A3F0068FE3D9CC3178BB3E6 89DB7A6BFE577622347FCD5FF30700CD1FA0FD9ABFE6AFF9FB8C0600CD1FA0FD 9AFF3DCDFF17FE8DE60F009ABFE60F68FE79CD3FEFC47FF7347F9E1F69FE9AFF E9E72C8009D0FC357F40F3BFBE13913A0FD83DCD1F6134FF0CF3DFFDAFE72580 B6EFD3A337E394E6AFF903B8BFF967DFCF0DCD1FF1E6AFF9C718C5AE5404FE0B 803769B7CDFF79C32B979FF773F11E5CBA7459E3B2D47BF3B91371FD7E347FCD 7F44A9D8CA43E0BF007887366FFECF055E3F6A9F9FC51729753F00CA52F0BD59 EAAE347FCD7F50AF88D70C00DE9ECD9BFFF643DCE11E009AF0F587EB6D77A0E7 E6FFBAF27937D7FCE7508BC8A10500BC379B37FFBF5E78AB6400701BAF7FB89E F4DCFCDFBC3D43E37B367FCD3FD52EFE737638212503BC317B68FE6FDAFF5AC9 00E01EDE8433DBFC6F6BFE6169DF7E11F0F5F3EB95BBCB1CDD4AF31F4230FEF3 7F138624DD048077E5FDCDDFC85800430F32B9F9AF59C0C6B7EABE75FEC09247 B7D2FC87700CF20F8CA2FDFF31B78FD930000C3BC8A49FE67FE4F091571E2DA0 F90F64FE610F2169C06DDA1FF36ED5FC993F00CDFF8AF96F8FFC8D31FFF0AD34 FFB1CC3F3B4202487A279EEE656BFE9A3F00CDFF9EE69FF14540E4A368FEFD9B FF22CA01781B6AFE003077F37F1CCFED33C7681FCDBF8872907FC07B50F30780 D19BFF7688CEEEF5A7621F33B78FE63FB475FCC731BFC05D6FC0DDF79AE6AFF9 03D0FCA1F9DF66FE79D703A8FD16D3FC357F009ABF1742F3AF61FEE47F08FEDF 019E9941B55FF357C90068FED0FC9B983FF91FCBF6ED054CA0FD9A7FF14AF66D 8F47CD23D48E1E7177C9B2EB70F398DB4ACF5BB7AB57EA991FFA65229C9ABFE6 3FB7F993FF1155DF8EC0B8DAAFF917AF64B7597786D785CF983996F95F79E8DD A308FBDC3149FDAFDDE787F96BFE9ABFE6DFB3F993FF096CDF5EC028DAAFF9D7 68FE37DB7286F9975A9971CDBFFF2A5ED0FCA1F91FFD35FBC0019AFFCDE64FFE 67B27D7B013D6BBFE6DFB6F99F8ECF29322CE468C451C1870EDCE1D1BC7CE185 C3D75F5CF3D3530E5D59B752AFECDB4B16B87EF73CA78193A526BD2298BBF933 FC5DDE9E1FCDFF3697389AED93FC0FAAFA76046E7BAF259D085BF3BFA7F9EF8E B4399AC5BAA0C71E3D5CD9E67FFA40910BC7FF7C7DCD8FCE105A64DDAEBFB291 E65FF599C722CDDF13FECAF6F9D1FC6F7689EB62C3F687C3AB76E7AEB1E65FBC F9EF1E6C7B6ADD57CCFFE8F0DED3536A1634FFD33D82F8B58A59C92276BA1BF0 B3BFC149BD938CE7367E2B8A39FF69F14D1183367F4F788CF96BFE77BA84913F D3ABBE1D81866F0ACDBF6DF32F352C24E6BFEE37FF47C459384F9F907AE61F4E E5817132A7EB76FD9565FECC5FF3D7FC97357FF2BFA0EDDB0BB8EDEDA0F9B71A E77FC3D49A3D987FBC5D9F3E75F5EC34F5CB8B7BBE8F088CFC61FE9ABFE6AFF9 CF6DFEE47F65DBB71750F58DA0F9376CFEEB987FF6A89EA3E52BCDED73712452 916310983F347FCD9FF9937FAA6F47A0D25B40F36FD8FC673AC237C93FDB1EE1 1B98CFBFB7237C23874885BF58495A98F96BFECC5FF3EFCA25569BF087CFDB0B 086FE4D78F76D7FC5B35FF47B9593DC307F986CF235C64A723639C7FA99933AF 3F6FBBD13E3C3DE9EE149A3566F58CF967F8497B44CFEAC9FC357F68FEDDBAC4 C4F24FDAED08DCBCCD6BFECE7A79333D8B25E985E65FEF8D30C4FB4BF3EFD625 66927F666E2FA0E1D6AEF9976DFE60FEC0E8CD9FF96BFE7DBAC4D0F2CFC0ED05 74B29D6BFE9A3FBB66FED0FC5FDF05814183AFEF94F00138E1534B6BFE9AFFF4 F24FB3ED08F4B9856BFE059BFFB763EA99EAFD0FFA3898DC7E94FD8E26CF58D9 F51CF199C7A0CD3FE668F1C0958F0A139A69FE2B9B7FE7F2CFA5ED05F4BF6D6B FE9A3F00CD3FE6CBAFB0D83F12E795D5FC35FF69E49F36DB051868ABD6FC8DF3 07A0F907CC3F7CF6EAC0970231E7BCD6FC997FF6236EEFF9FA8487B41FF7CBFF CD1BB3E6AFF903D0FC5347FBC42F70FA5582E6CFFC878EFF3C99F98FB50D6BFE 9A3F00CDFFBAF91BE7AFF9377189B6F24F92C9FF705BAFE6AFF903D0FCB7C37B B6A37D1E9B597DDE963F9D11C8DC3E9AFF4CF24F8FC9FF88DBADE6AFF903D0FC 8B30C17C539AFFA02ED144A2B831F31FF1BB2ACD3FBE927D00C05D346CFED9B6 3FB1F96BFEFDBBC4CD2A458CC9FFA043D434FFC84AC64300DC6FFE4334FF994E 30A1F90FED124773A4D07EF423FFCDE7A4D2FCE32B1900DCC628CD7F3234FF09 5CA2B6FC9361F2DFEDC6C9FCCB8EF307807B18749CBFE6AFF977E212DF6AC284 57A3EAE6E4DDDA73F3F799086085B97D98BFE63F81F9575A131A2CFB8F38B65F F337B70F0073FB307FCD7F29F3BFBE320498FC77B541327FCD1F80E6AFF96BFE 5C22BC3ED9ABC47E997F91A3CE99BFE60FA013E56B88E6AFF933FF1BD6277BAD A82F7AD80E99BFE60F6002F37F3570CD5FF367FEB5CD3FF52860D28B8CA37D8B 6CA8CC5FF307505BF99A0CEFD1FC357FE67FB3F90BFEA897FD99BFE60F80F9A7 9ABFE6AFF933FFE6E64F779121FFCC5FF307C0FC357FCD5FF31FCBFC892EF2E4 9FF96BFE0098BFE6AFF96BFECC1FCC9FF98FDBFC3F16800C80F96BFE9ABFE6BF A0F9535C64CB3FF39FB5F94FAFFDBEEC00F3D7FC99BFE6BFA0F9935B5C917FE6 3F77F3E74280AD7DD0E6FF0B07E756D0FC993FC0FC357FE67F1BBBB3E34EF93C CFFDDB8DBEB5EFBE2ECF2B8F5EB5A457B361F327F991E6AFF9AF66FEB41617E5 9FF96BFECCFFA2F34FECFF7DFE5E796B75FD956AF56CF469FE559BFFDBEFDEFC E4C59DAC46D95D30CD7F44F327B4B82EFFCC5FF367FE17D57162F99FC3FC4BED A98D65FE81DFA2FFE6DF8372BFFEE29DAC46D95D30CD9FF983F9337FCD9FF9C7 D863DE02B8E78588593EE3956AF8FA5E6FFEAF6B7EB4D3DA73F3BF7F337BFBC5 3B590DCD7F71F3A7B22822FFCC5FF367FEA57A2FF3BF799CD595172EF24E7A18 D375D1FC5FD739E6E70E9B3FF3D7FC993F894529F967FE9A3FF3BFA7F7C6DF49 FCF70BBB0B87353570CFA96D3CE351B23D3CCFC0937ED911CD3FB07A4703FE4F AFD7FC357FCD9FF983F97BB74ED3FC2F26D0C5CDBF60AF0EEB68A4BD4752DCFC 4F1FA8B8F9E72D5C76AB1EB7F91F2D70BA416AFE9A3FF3EFC1FCE92B0ACA3FF3 5FADF99F8E5761FE65952FDCE46B2C19BEF975F34F7AA024F32FFE7230FFF8E6 1FF367A479F3FFAD3291E6FF7765347FE64FFB514FFE99FF82CD9FF93731FFD5 AE8C9F04297BAE9EA425AF0FD761FECD9B7FB7E6FF79DB56E6AFF9337F80F96B FE91E6FF6A44CCFFE270F170753FBDCF8229FE669F8FFF8D1A9A7F91E1FA8EF0 D5FC77CDFF7973CD9FF917377FCA8AE2F2CFFC576EFEBBA6C7FC997F11F3DF6E 606FF93D6FA8CF15F30F8FA19AD5FC1F7566F5D4FCDFB4BFA0FC6BFECC9FF6A3 9EFC337FCD9FF9D71B581E7FF8ED9DE61FBFDF71DAED638EF30D0CBCB9D3FCAF 3B7C6FE67F030335FF808DCF6DFE9AFFACE64F535149FE99FFE2CD9FF933FFDA E6BFB5FDC05E40D597E3A2C633FF6E9BFFEEC0FB1BCC3F7265347FE6CFFCC1FC 99BFE63FA2F9C74FFF5ED5517B30FFA4A72E7EE40FF3D7FCC732FFB771FEF79B BFE63FA5F91354D483F96BFECCBF94F52595FCB6E6FF889BCEBDE0D1B89147FB 327FCD7F20F3EFE1085FCD7F3EF3A7A6B873AA1FE6AFF933FFBCEC7FFD9C56B7 1DB77BC5FC1F8967E36A6BFE194F0BF3D7FC1FE6F6D1FC993F983FF3D7FCD736 FF78890DFC6FEA954907A866286EFCEECCE9AD62CE385C4AA4F3BEA4C87B5699 FF2873FBB43AC257F367FE65CD9F94A207F967FEB336FFD4FF5DDCFC1F11F3C3 C774EF18498E5CAC89F927FD46CDCDFFE2B3CAFC5798CFFF29F09ABFE6DFD6FC E9283A917FE63F6BF367FE05FDFFED7FE3BF32289EE26F30FFA4DFA8B9F95F19 DAC4FCE79ECFFF4DE0357FCD9FF983F933FFF99A7F590D5BD0FC81FBB7F68F76 4CD9FC770F0DD0FC35FF86EB4344D18FFC33FF999AFF4C2EC409B188F97F3465 BEE6BFBB629ABFE6DF707D2828BA927FE63F53F367FE00AE0CFE99669CBFE6AF F9337F80F96BFECC1FC0A9F98F3ECE5FF3D7FCFB711BF289DEE49FF96BFECC1F C034CD7FEBED9ABFE6DF6A7D68273A947FE6AFF9337F007334FFC0CCFF9ABFE6 CFFCC1FC99BFE6CFFC0174D2FCAF9CA8EBF4845F9ABFE67FF3FA104EF429FFCC 5FF367FE007A68FE57CED27B7A9E5FCD5FF3BF737DA826BA957FE6AFF9337F00 9D34FFB0BD474EE3338DF96BFECC1F60FE9A3FF3073071F38F34F9A3397C6632 7FCD7F50F32799E859FE99BFE6CFFC01F4D6FC33087F35A0F96BFEF7AC0FBD44 E7F2CFFC357FE60FA09FB97D6A687F13F3DFBDA1E6CFFC01E6AFF9E735FF5F53 C3C480D59A7F78244FB6F3376CFEDB9B6BFE739B3FB144FF30FF419BFFAFD961 62C09ACD3F7E172069F29F8BE65FEA5C039AFFC42E412931DCD1BECC7F94E60F 007337FFE23437FF2FF9D7FC993FC0FC35FFD4E60F008B34FF69CC5FF39FDB25 C824C83FF3D7FC0168FE439B7FA9E9868CF39FDB256824C83FF3D7FC0168FEA3 37FFEBDA6F6E9FE95D824082FC337FCD1F80E6AFF99BCF9FF903CC5FF3D7FC01 68FECC5FF39FC025A86355FEFB0F9E8709E45FF32F329F3F10E673FBF12460BB 55F4D9FC6FDEC7E96D3534FF115D8234D676FE573C2743CBBFE66F3E7FD4E669 FE9E0ABC6D157D367FE6AFF9337F1C693FF967FE9ABF814038F58AB0E961D9AD 42F3D7FC993FED1FCBF9F9FFE8F2AFF91769FE3406CC1F35CC5FF3D7FC993FED EF53FBC9FFA0F2AFF96BFE60FEE86D83D1FC357FE6CFFCFBD77EF2CFFC357F80 F9A3A0F9DFD9FC5B1DE9DCDB6A68FE03B904456CEBFCFC7F44F9D7FC1769FEDF 8E215AEB987F871BC07605C2AB94BAC265EF6DE2E6DF708EA3DE5643F31FC525 C8613FDA4FFE07927FCD7FC1E67F9BEDD8ADE8D0FC7B7B0577CDFFE871337655 4637FF7B9A7FE0D9B8F8045E7C869F377FBD9FDB5E35CD9FF9737EFECFFC357F E6CFFC993FF39FACF9EF6AF6EBE5DB7746BBFFCC5820F2E5DBDEED763D8F1E6E 77B3895C07CDBF6797A0857D6A3FF9EF5FFE357FCD7F3B0E24F0B9F9BACCEE07 7AC10F7DE67F9BF91FBD5281EB8F36925D553BBDF9AEEC9D5E7F346669772BDD 2E93716F8B34FF806647A6F8F805AE34FFDDF58CFF454ED741F3EFD6250861B7 CECFFFFB977FCD5FF3DF75FB801026FD7CE5439FF9DFD9FC63B4ADF6469264FE 171F28FEDE061D6472BDF9A75E99344AA794F917BC95E6CFFC693FF967FE9AFF 9AE3FCC3B214BFD891106AFE0D5FFAC0E1BDBB193CFBD5CF70B3246DBBB235EE 9AFF69FD5EAAF9E759F4EE777FA7DF259532FFD347BF32DA47F3EFC725A8E028 DA4FFEFB947FCD5FF30F7C28C79B7FE4CD8DF61965A7EF54DB32CC3FE6E60DCD FF748C5313F31FA8F9272D90BAC5D678F4A4D13E9A7F272E410207727EFEDFA7 FC6BFE9AFFEE808D2BCD3F661783F98F68FEA93709C4F318F30F7F0D51B5F9B7 DD6E076DFE4DC6F9673CBA71FECC9FF6937FE6AFF91BE75F70B44FAA2B32FF4E CC3F69B44F86F9A78EF6E9CAFC1FCB8FF37F1C1FB6BFBBC0EEBC3A7973FB3C22 0E3A3E7AF452A37D34FF1E5C82FE0DEAFCFCBF2BF9D7FC35FF47CA41918EF09D D5FCAF1CE19BDAFC2347FB64DF61FCCFFD1FE1DBF97CFE4DB658F3F9AF69FEC4 6F02ED27FF3DC8BFE6AFF9EFE6B2C0FC2A91B37A1E099571FE6D5FFADD01ED49 F3F384A7E58C19E77FBA8DA5DE61CCAC9E314DB8C3593D9B347FE6AFF9337FCE CFFF99BFE63F8DF9DF3374041D9A3F46D9605A35FFBC335ED5DE576DB54A9A3F F3A7FDE49FF96BFE2B9B7F601677307F8CDEFCA1F9F7EC12FFF33FFF43FC66D2 7EF29FCA8F1F3F98BFE6DF76B8083160FE98A9F943F3EFDCFCC9FF4CCECFFF53 B59FF96BFE60FE187DABE8A4F9FF6A4A6FABA1F977EB12E47F4AED27FF776ABF E6AFF983F9A367F3BFA7F937F4EDCFDFB4B7D5D0FC3B377FF23F99F3F3FF18ED 67FE5D357FE0942FB500DEB68AAE9A7FABE134BDAD86E6DFBFF993FF29B59FFC 07B49FF9F7D3FC7F0140B911260D9B3FF3D7FC07327FF23FA5F693FF23ED67FE FD347F00E8F0C052CD5FF39FCFFC65FFE99D9FFFD70EFE9ABFD93000F46CFE9A BFE6CFFC65FF05B59FFC570AFE9ABFE60F40F37FBBF2EFCA449A7FABD5D0FC07 32FF35E5FFBF8B41FB99BFE60F40F3AFD7FC9384F6B74492CCFFB76AA49ABFE6 DFADF9AF26FFFF5D92C5B59FF96BFE0034FF4E9A7F6DF3AF51FB33CC5FF3EFC7 259695FFFF2E0FED67FE9A3F00CDBF55F3FFF2E7A7CF47EE205432FFA47D04CD 7F3EF39F5EFE69FF0AF2FFE300E6DF4FF337213980F9E6F34F32ED18F37FDB47 286EFEAFBB159A3FF3A7FDE49FF933FF4ACDFFEBB31B089F1BD49380A30D639A 71FE494B9635FFED6822CD7F4DF39F52FE79FE3AFEFFE318E6DF55F3776E5638 81EFCA5CF91270DCE6FF2AD861DFDE5DB2A0F91F1D4AA0F94F6CFEEBC83FBD5F 47FE6FD37ECDBF48F3273F60FE86EB2499FFD0CDFF4DAD03B27DB46429F30F1F 47ACF9AF69FE73C83FAB5FCAFF7F0461FEDD36FF6FC086A7E01DA905C665FB67 E1EB55FEDF7FF3B9CCF69A78F31F656E9F86A37D8CF367FE93C93F995F4AFE7F 9CC1FCBB6DFE2C17CC9FF9BF99FF53F2B3CDBFB7E6BFB5EB5DE5DE95F0A1CD5F F31FCBFC07957F0EBF9AFFFF8880F9F7DCFC9FD7876DF0F51EDEAED92E99714D F8A193AE470DF3DFDD18021B490CD937CCE6CEC75AD9FCBB6AFE619F3F9D6053 F3D7FCC93FED27FF6DB55FF32FDBFC63FC792B7E173D9FF98F65FEDB5DBF5D91 8ED7F8DD3D880ECD7FBE3D8553F37F2EB07BBDB97D347FCD9FF9D3FE95E59FF9 CFD1FCAB9AFF539F98FFF4E61FAFCAD93764FE43987F3FCDFFB4E4471E90ABF9 6BFEB799FF10F2CFD5D7F4FF1F7130FFB19AFF9BF36498FFEE024737391AFBF1 E696E1D5C3CDE3FC03E61F69CB816562B690C096101E4D9474E7F70F466A6EFE 6FFFBBFDAFB19A7F78DECEE789BA347FCDBF37F3EF5CFE29FA9AF2FF231AE63F 50F3DF0EBDA86AFE81874B5A1EC3997F60844FFCB671FAF3EE0A67DF09F337B7 CF7067F2D2FC3B7489A1E59F992FEBFF6DB55FF3AFD7FC8F0CBF9EF9273DDC95 2143B86EFE4709FDCA0899DDF61E736F81630D027B16F1072C2C68FEBB7F31DE FE77A0E69F3DA9FED14CFB239ABFE63FB4F9F726FF847C59F9FF9102F31FAEF9 1731FF80F05F7938E63F56F33F9D24EAA8F31FB9FAEE5DC52CCFFC6F36FFE6CD 3FEF2CBAF399BFE63FBAF97722FF3C7C65FFFF9108F35FB3F9337FE69F7DEC6D 64C38F31FFF8DD0AE6FF14FBC0097CA799DB277E68FD2B9ABFE6BFA6F9D3EFC5 E59FF96BFECCDFDC3E55E7F6B928E7A75F4330FF23F3FF083250F3CF13FBD37D 8482E67FF4B582E6BF82F98F25FFC47B71F9EF44FB35FFAACDBFC811BEF1137E 263D9C237C5798CF3FA6F95F39C237F5CE579BD5F388519A7FCCB89DBCAF0646 347FCD7F0EF36F22FF7C9BFFFF4887F90FD7FCF3E63FCC36FFF0AC9EE1594035 FF9B47FB1C6D24A763F84FFD3FFE08DFA3AF815267F53C3D88206F776682D13E A7F4DFFC8B98FFEE629ABFE6DFD0FC6F967F9A4DFE7F64C1FC876BFEA7A29EB7 0C261BE7DF15F365F90ECD7FA071FE018B4E12EC7AE69FBD57A2F92F6EFEF7C8 3FBBE6FFD9DACFFC071DE79F3A9C86F9337FE63F8DF907947EACE69F67FEE1FF 2D62FE57BE92D0FC6772893EE59F5493FF3EB55FF32FDEFC0333AB879DDF607B E6CFFC99FF1CCDFF34B95F37FFF81944357FE67FB3FC7369FE7F51FB99FF28CD 9F0861570E6D24CC7F9DE61F39F8FFA2F9A79E3E40F367FEB7993F8526FFCC7F 9DE64F84C0FC99FFCACD3F7EB69F2BE6FF5B3A9A3FF3BF47FEC933F92FA2FDCC 7FA0E69F34314BF804A99D8CFD383AF7134A99FFD16120E11725FE94BE46F868 FE3734FFD469FFB3CDFFB75C34FF89CDBF07F9E7CCFC7F14EDD7FCCB36FFA409 D823CFDC14739F35E42D307F234A997F78EEFDD3A73DFE7509EF4A789934FF2B E69F71B6AF3CF3FFED329A3FF3AF21FF5499FC17D47EE63F5CF3BFD25A99FF52 E6FF3A85FE23EB1CBE45CC1F9AFF23773EFFEC33FCA69AFF6F45D1FC997F29F9 67C8FCBFB8F633FFA19BFFDB749D19E61F9EFC677799A313F5061A72F83EFB1C 8934BAF96F853F63BFEFE826495B48FFA3CE34FF09CEE15BEF4C5E7968FECCFF BAFC1363F25F43FB99FFB8CDFF74907C46F30F9C29E0689448CC6AC4DC27CD2B 68FEBBCF6D11F3CFDB42BCE29AFFAEF9D723C9FC2BA1F94FE612779A3F1FE6FF E3067FCDBF5EF3DFF6FF22E6BFFB5FF1CE76FAA03CB0B6F9C73CE177BE9A0EE2 D6FC7B36FF26ABA1F92F6BFE31F24F83C9FFD0C15FF3AFDAFC6B98FFEE742E61 4B0FCF00C3FC2733FFD42DC4681FCD7FF777B987B0F9B75A0DCD7F65F30FCB3F 0126FF55B59FF96BFE91061E7EDCD3FD02E67FB3F9EFFA798DE69FF4CDD1D136 83059B3FF3D7FC5736FF5DF9E7BD38F2FF1F4561FE9AFF75F337DAA72BF33F7A FE8BCCED53C4FCBDE245CCFFE318CD5FF3D7FCC7927FBA8B23F91F4EFB35FFAA CDBFD511BE47FD76F7268EF0EDD3FCF3E6F3CFDB42BCE2C5CDFF2388E6AFF96B FEFD9BFF97FCB35C04FCFF476998FFD0CDFF516256CF239DDB6A61F881DEA6E8 7C1C1F3E90F45D03CA9A7FEA09792367F50C6F21C6F91737FFFF3D43F3D7FC35 FF21CC9FDC220CF3D7FC2F9E2995712D68FE60FEFD34FF8F46F4B61A9A3FF327 FFB85FFB99FF04E3FC53E74B64FECC1FCCBF55F3FF68476FABA1F98FEB12CC1F 823FF3BFB9F9279D3CD7280BE60FE6DF43F347BD5D30CD7F68F327FF982CF86B FE659B3FC0FC99FF88CD7F1B22E2AF6FF255E66E6329FE889A3FF367FE60FE9A 3FF307F3C7C4CDFFE2F14AB799FFE90F9A3FF367FE60FE9A7FED71FE49637B8E 9A55C6E766EA875DBD9145190738AC6CFE3173FB8467E937484CF32FDEFC8F3A FFE94C50A7B38495FA9BF03A59D9DB1BA1E044B59AFF882E41FE41FB997F0F73 FB1C7D009D7E368D65FEE6024D32FFC0108598D10BCC5FF3AFDAFC23BB7AE495 65FF3864AFA4E6CFFC993F98BFE65F693E7FE64F0E03E67F142A239F4C4FAFE6 5FBBF907B6BAF8D3CC4D63FE9AFFCAE64FFE5155FB99FF34CD3F7C26AF24F33F FD62FDF4CC5C57968F3C63D4F69461ECF4C8FC230727A73AD8EE8B62BF4CF3CF 1EE77F3474277CDAC1C0E9C24BFD654832FFEC87D3FC993FF307F3D7FC23CD3F 66B87BCC70EEA3FB69F5F3E992DCF2D4FCE355EAE8250898D5DBCFCC5FF3BF32 CE3F6F47F551F9C0DBD4D45FC4FC35FF815C82F9C3501FE67F7FF33FB5FAC8F1 1B47F773F3F5196BC52D77CD3FE9098FF1F6F04BC9FC35FF65C7F997357FCD7F 71F327FF9823F86BFE559B7F46DE6F62FEBBDFC233FF11CD3FFC5256AAAFCC7F E2E67F656E9FC0C0C2DB9AFFC5AD5DF367FECC1FCC5FF3BF6EFE3163FE5B35FF C88F4BE67FC5FC77153DFED5CF7E2999BFE67FFF7CFE95883FE6BD94F96BFE63 B904F907ED67FE9D34FFD44FD54ECC3FF29FCCFFD4FC4FB5FCD46DF25ECAA30C 0BCD7F62F3BFB8C29A3FF367FE60FE9A7FBCF99F1E037BD1FCEFFF396649E65F C4FCE3CFEC167350B6D745F34F6AFEA7B30DF460FE815149A53675CD7F5C97F8 7C50E68FFECDBFD5BB43F3AF349FFFD1F9258F66B74B9DFFE7FE593D4F6FC530 AF987FCC9C87A7D3FE9F9E05D8EBA2F987CD1F9A3FF327FFB827F833FF999A7F 467DA2640B9A3F987F6FCD1F9AFF1CE6FF1FD37BA2FBC93C99FF64E3FC4FE7F3 67FECC1FCC5FF3D7FC99FF40E64FFE693FF3D7FCB7D3B684875E1C8D5965FECC 1FCC5FF3D7FC997FC1F561FEE836F833FF099A3FC0FC99BFE6AFF96BFECC1FCC 9FF9AFD0FC01E6CFFC476CFEBF9AD2DB6A68FE33993FF947B7DACFFCE718E77F 3A686777C29CF85BD1AD09CCFF685AA4A4E1619E5BCDBF60F36FE8DBAF7BC49D AC86E63F99F9D7907F3ECCFC8B4CE0CFFC279EDB6757D8224FEC7B3A6D350632 FFF853AD0D714225E63F53F36F359CA6B7D5D0FC993FF9DFF2FD1F683FF3D7FC 6F307FD637B1F9E7BDD0B601CDBF46F367FE9AFFACE62FFB17D1FE05E5BFF619 7B99FF64CD3F7C26AC18F38F9F14687B57E16945936EE88B8626E6FFB870E2B6 EC6D009AFF277F5726D2FC5BAD86E6CFFC993FF367FE9A7F91F9FCCB9AFF91D7 057E8E5FF891754A02449A7FEA199C335EEBBC6D009AFF9772FF568D24F36FB2 1A9AFF94E64FFE8B68FF52F25F5BFB99FF64CD3FC6E4AF37FFD311E3BB3F470E 3537C2A492F9C7BC28792FD9F56D009AFF53B96B64F60CF3BF7F35347FE6CFFC 03DABF8EFC337FCDBF43F3DF9D1026C6FA4E6F18B87F141CED73DDFCB3B701E6 AFF9337FCD7F29F327FFA5B47F05F9BF41FB99BFE67F65B4CF95DE1B58BD9863 90D1D6FC4F5F4AE6AFF9CFD7FCDFC6ED68FECC9FF9337FE6CFFCBB6AFE79E3FC 1FC1295F4A8DF488D9312187F79BFFE9E6C4FC35FF6E9BFF91961731FFDD41FB 9A3FF38F7C50E65F44FBA797FF1BB49FF9CFD7FCAF1FE1FB883EEA3663B44FF8 860F07813635FFBCD7FDFA3600CDFFA2F9879D7C5CF3D7FC99FF52F2FF3D1ADA CFFC35FFDD41F2E12B2307F604C6E11FED5F047E8E995E66F7FE71C5FC1FB9E7 F0CD98D533631B80E69F6DFE3136AEF96BFECDD747F6CFD0FEDF5F5841FEEFD1 7EE63F59F34F857DAD63FE60FE9335FF780FD7FC35FF1ECC9FFCC79BFFEF074C 6CFEB7693FF39FAFF9337F307FE63F77F34F35F0718FF0D5FC99FF22E67FEAFC BBFECFFC99FFB2CD3F63EC841117CC1FCC7FB8E69F57DDDBCEEAF95C55CD9FF9 9795FF99B4FFF72CA691FF3BB59FF94FD0FC01E6CFFCA76FFE5706DBD430FFC8 655ED756F367FEB23F98BFE67FBDF903CC9FF94FDCFC7785BF49F37FBD3EBC02 BBFB299A3FF3FF5A86F9A39EF9476E84DEAD9A3F1631FF981334C75F7F7432DF 4A9C9E50206FC0DB5823DF966AFEA77375C61F1750EA08DFD37307EC6ABFE6CF FC2B993FF9A7FDCC5FF3078ECC3F467153CD7FEBD20399FF9D2BAFF9A79A7FCC 5C9DB799FF764D22574FF367FEBBCB307FD430FFA48D90F96BFE58C1FC1F1127 71C836FF47E5D9A2CADEF9CD2BAFF9679BFFE991B3B5CD7F57F263BE8FD0FC99 FF0DE64FFE693FF3D7FCC1FC93CCFFF4745D79E61F73E2B6D73B3F3AD9DC761D DE7E88BFE195950F9CE058F3AFDAFCDB9AFF91E13F653EACFD6F0B6BFECCFFB9 0CF347F1E0CFFC357F30FFD773F8061437FEE7F0809998BBDD35FFA475485DB8 C6CAB7FA8260C1E6DF7CB4CF5BB4CF1E05A4F9337FE60FE6AFF96BFE686EFE31 63E9638EF08DF1EA40F38F5F87F805CAAE7CE48829CDBFD4DC3E3D1CE11BF9D5 C3EB570081237F357FE6FFBA0CF9A7FDC567F264FE9A3F987F7864CB45790E1B 72E7E69FBAF23D1C0EB0E07CFE0D67F58C3977C0D14C3ECEE1CBFC993F98BFE6 AFF9A395F91F4D6259509EB39DBC07F38FBFF90AE6DFE1397CEF3F9357FC6345 AE98E6CFFCB7CB907FDA5FF6D45DCC5FF307F3BFADF9AF60FE8B8CF6E9F01CBE 498E5DD6FC93827FF66A68FE6B9A7F41F9E7D26B9A7F918D90F96BFE98C9FCC3 1375963D4836EFD8DB80C09F1EE19B74C3EB2BDFBCFC2FDBFCAFF8FFF5E61FC9 95D5D0FC993FF367FECC5FF367FEA86DFE8F6BB37A868F938D9C6FF3749A9DF0 AC9EF137BCB2F24BCDEAD96DF3CFF3FF7BCCFFE20E88E6BFACF9937FDA5F4AFB 99BFE60FE66F23790C728A2ECD3FD5FCE3FDBFB6F9171974A4F9337FE6CFFC99 BFE6CFFCC1FCF354FF74B40FF31FBDF927CDFF59EA1CBED947196BFECC3FBC0C F9A7FDD7B59FF96BFE60FECB6E2447C37898FF64CD3F7C5EAD22E65F0ACD9FF9 1F2DF3FDFB77E6CFFC53F9DC6C98BFE60F30FFE95F5CCDBFAC72F76CFE9AFF0A E6FFFDFF60FECC3F49FBBF60FE9A3FC0FC99FF9ACD7F3EF3D7FC993FF9A7FDCC 5FF32775C836FFC024F619C369AE0CC5C91BBA933DEC87F96BFE9ABFE6DFA1F9 7FFF37CC9FF92769FF56FE99BFE60FE61FF6E7CECDFFE25C9A930DF25FA1F957 22D5FCEF5F0DCD9FF9CBFEB49FF96BFECC1F65CDFF11777EDB7EA4FAE29714CC 7FACE65F9578F36FB21A9AFF82E6FF7D0FE6CFFC93B4FF4DFE99BFE60FE61F6F FEA7A7F4DA9EC4767BBAABC7DEA49ABBB70D2C10A3EEBBBFC8DB5AED7E651079 D2B198339169FE059BFF6D84CDBFD56A68FEAB99FFF703983FF3CF30FFA7FC33 7FCD1FCC7F57B6B73F1FCD819FF4736070CE7607E11137F17EE44EC1D10AC4AC 4CF817D95DF3565F284CDCFC99BFE6CFFCC93FEDCFD37EE6AFF983F96798FFAE 57275D1F96E15DF38F1FB7131EA7943A9629BC0E81DFBAED08A2F99AFF47237A 5B0DCD7F29F3FF7E06F367FE49DAFF947FE6AFF983F98747CBC718FEEEE09948 F30FDF366F929F6CF38FF945C2BFF522A37D6E6BFE1FEDE86D35347FE62FFBD3 7EE6AFF9337F9432FF53818F6CFBA9C93DFCFD42863F679BFFE9CA447E59D036 FECFD4FC516F174CF3EFD9FCBFC7C1FC997F92F67FC1FC357F30FFEBCDFF8AF9 E73D68CC3519E65F6AD852F66E8BE68F24F3D7FC993FF367FECC5FF367FE4832 FFB0BA173FC237303827E308DFF84386939ABF237C357FCD9FF93731FFEF2990 7FDA9FA4FDBB67F565FE9A3F98FF51DC2E35ABE756DDDF743A7E56CFED9D04EE FC113DCEFF1137F5E8B2B37A6AFE9A3FF3AF61FEDF1361FECC3FC3FC4FE59FF9 6BFE987EB44F06F39D036B9A1777CAE69F3AA76B6D028F9B74EE898C435A347F E64FFE69FF15ED67FE9A3F987FAAEA349FBB12AB35FFF853B6DD66FEA9FF9B71 13CD7F29F3FF9E05F367FE795B0EF3D7FCC1FC23E59FF633FF26CDFF68233C9D 523530142D7BDF21FCA0DB93563F82E7924B7A5B69FECCBFACFC73EFA1CD3F7B B361FE9A3F983F98FF40CD3F3C13D4E99581434B92CCFF745ADAD363D8357FE6 7F45FB657FC1BFB8FC337FCD1FCC1FCCBF93E69F21F9313B0BF5CC3F729D8DF3 67FE0DE59F81AF16FC99BFE60FE69FAA1F06FC68FEAD9A7FCC991716317FCD7F 0EF3BF226FBFFF83ECBF66F0FF7AF58BCB3FF3D7FCB188F9270D36BE6EFEF61D 34FFBCE6CFFC35FF99CCFFA2F33F61FEAB99FFDB065050FE99BFE68F75CCFF4E 2167FE9A7F46F38F3C6B739FE66F9C3FF32F62FEBF1FC0FCD731FFA36D80F96B FE440817CDFF68EE91EDEC2581393F77E763893931D6EE742858B9F9179CDBA7 88F947DEFF2338B74FD246AEF9CF64FEA59C5FF65F3CF85FF47FE6AFF96341F3 0F0C4B389D9CE4E202E16538BFE6FF98623EFF5268FE6B9AFFEF7130FF95837F B6FF337FCD1FCCFFC861324632270D93B85862B1C8DC3ECC5FF39FC0FC0B0ABF EC2FF85FDC0560FE9A3F9632FFC8B1D3D9E6FFEDDF307FCD3FA3F91F9D18B795 F907F66D357FE67FDDFC7FCF85F90BFE19FECFFC357FAC66FE5B4A997FFC1068 E6AFF943F35FC4FC6B383FF367FE57FC9FF96BFED0FC4B99BFD13E9AFFC5E60F CD7F26F3AFE4FCE49FF65FF47FE6AFF96305F30F0FC82FDBFC338EF0F57A2DDB FC7F35A5B7D5D0FCE736FFDF8BC2FC997F9EFF337FCD1FCCBFEC38FFC7D9343E 474383B060F36FE8DBAF7F3C3B590DCD7F1AF3AF27FCE49FF65FDF0560FE9A3F 5618ED03E6DF6DF36F359CA6B7D5D0FC2733FF57EFFABC9EF933FFFBCDFF6DC3 63FE9A3F983F987FF3E6CFFC35FF99CC7FDBF96B68FF45F9E7E71D9A7FA58D64 BBF97D6EA2CC5FF307F307F3D7FC357FE67F7D7DEE44F69F29F8DFBCF178B76A FE60FE60FE9ABFE6CFFC0BAECC0DEBC0FCE730FF29374ECD5FF307F387E61FF8 5DFEAE4CA4F9B75A0DCD7F5C97D88DA8B7AD00F9A7FDD9F27FF3DB44F3D7FC71 BFF96F67D7091039F76691F9794CF2A3F907EEF667349399BFE6DFBF4BEC3ED0 9D26C3FC99FF10DBAAE6AFF9E366F3DF4EA7792ADBB7997FFCFE48D51D8421F6 3E166CFE3F13B9C1FC53773A34FF595DA2B9F65F917FAEDE83F9F7F09669F866 D1FC357F5435FF54D1BDD3FC23EF87F9AFD6FC7F66318DF96BFE3DBB4427DA2F FB0BFE436CB79ABFE68F3BCD3F46F203A7D93ADA05D81A7BE07E02553F7C4EB1 F03DC73CDCF6A1B7378CBC73CDFFCEE6FFF302F78CF689177ECD7F3297E847FB AFEC0530F626E6DFE71BA7C95B46F3D7FCD1C4FC0367DD4D32FFF0D97B634A7B E0F4BE477B19493F472E90B4FE9A7FA5E6FFF3321398BFE6DFA74B74ABFD197B 01A4FD1EED1FE2BD73FFBB46F3D7FCD1CAFCC3837CE29BFFC5C142A9E67FFA70 81E593D67335F36FDEFC7F16A29EF9E70DF5D1FC477789A3697CFA5717E67FBF F9F7FFF6B97363D6FC357FF4D6FC7707C05C19ED9367D4498F956DFE31EBB9BB 8CE67F43F3FF5914CD5FF35F2DF527ED02F0F6E2E63FC19BE8B6B7CFCACDFFB9 80E68FE6CD3F7B9CFFE96102313B1D37987FCC7A1E2DA3F9D76EFE3F2B609CBF E64FFB037B01D4FDBAF6CFF73EBAE71DB472F3FFE3DF68FE286BFE4975FD8AF9 5F1F45738FF927DD7041F3FFE4F52FD26DCDFF6735CCEDA3F9D37EA0E116AEF9 EF3699E79E82E68F1AE69F71786CA0963F7F4E3A7236FEBB86F0633DA20FD40D 377F47F80684F3C96DCD7F57A18FBC7A7B7DF8E645CCFFED21DE7E8EF17FCD7F 3897A0FD20FFCCBF78F37FD37ECD1FC5CDFF6D744D60D44DCC3098570F0FFC6F E421C081EC1FB37F111899733ACEFF7427E8744AD24ECCFF571C49E3FCB3CDFF 4AF37F8BEAF1FF7C53F1ED95D7CD7F77B72275FC8FE63F96F9D37E907FE65FAF F91BE78FDAE68F095EDC54F37F5DA0F371FE0399FFD1509FB2E6AFF9B77509DA 0FF25FF5DDB478F337B70F983FAE8CF6D9FD8BF1F6BF9DCFEDB3ABF75BC1AE6D FE47A386228FF00D0F58D2FC8730FFA3B90D693F9695FFEBEF29CD5FF307F347 9FE6DFB0F96F137A5BF30FFC70F473786534FFFECDFFE8B6B41F2BCB7FA5B795 E6AFF983F923CFFCB7F2BFFDAF219AFF91E72799FF95237CFB317FCDFF7E97A0 FD408D3782E6AFF983F9A35BF36FDEFC4B8DF3CF9BD5B3DECCA29A7FE7E64FFB 814A6F07CD5FF307F34771F37F95FFDDEBFB6FFE658FF0BD62FE9AFF6AE64FFB 817A6F0ACD5FF307F347B7E63FCDDC3EA39BBFE67F9B4B543AAA1198E05D56E4 6877CD5FF307F3470DF3FF92FCDD2BC79ADB67F720DFA36B7677018A98BFB97D A6377FD3F80037EC1A6BFE9A3F983FBA35FF7EC6F9171C631F6FFEE6F35FC7FC 8DF001EE19F9A3F96BFE60FEA864FE9F6CAF19716E9F9ECDDF397C27307FDA0F DC26FF9A7FA9E6FF0B38386DAB8D6462B6A298B46168FE79E6BF1D08B4FD16E0 F429D2FC3B317FDA0FDC29FF9A7F91E6CF7F706AFE9E8A15CC3F75C3E8B6F957 92FFB0722799FFE9F985CB9ABFE65FC925683F70B3FC6BFE179B3F00E4D173F3 AF21FFA7CA9D61FEF1637B34FF0ECD9FF603F7CBBFE67FA5F90B9E004A7D65D0 5BF32F2BFF31CADDB3F96BFEC5CD9FF6034DE45FF3BFD2FC01A038FD34FF52F2 1FA9DC79E69F37D447F36F68FE811908693F5056FE77DF809A7F76F30780AAE6 DFBCF95F97FF78E5D6FC5730FF15AC03F01ED4FC0160D0E67F45FE9394DB38FF E9AD83F603DE869A3F0074DEFCF3E43F55B9CDED33B772240D480090F74E3C1D 4AA7F96BFE0034FFF853685DD4FE41CD5FF3BF68FE06F603CDDF8FE137A3E6AF F903D0FC6B5063B44FC1D5D0FC8B9B3FED07FA917FCD3FBE92997E1CC06D346C FE37EFE3F4B61A9AFF3D9A41FB01EFCA9E9B3F0F0170BFF93769FECC5FF32FE2 1881A105B41FF0C6ECB9F97F0380DBD1FC35FF710523703821ED07BC377B6EFE 7F01403B347FCD7F38BB084C2148FB016FCF9E9BFFEB0D5DBA74E9B2D5A5E6AF F98FA216F19A01C03BB4ABE65F96CF07AD71B700FAA1EADBBC76F36F7544436F ABA1F95FF18AA4A10500BC497B6BFE053FB2BF9480FC03D39B7FA5BF21559B7F C363997B5B0DCD3FEF73F668C290D329C401DC29FF47EFD399CEA997D1FC9F35 A6ECE573352ADDBF4B972EDB5E3EDFE695EEBF52F347BD53AAADD3FC014CC09A CDFF8F6A3C9500C0AC547D9B576AFEBB7C7D0A7CFDB0FDAFD70502F7F0F6433C E147CFBBC326A7545BA4F903C0A0CD1F007AE6B6E61FF0F648A5BF68FE81DBDE 6FFE9A3F00CCD7FC01600E8A34FF24F37FEE9BEC7E35902ADEF1E6BF7BFF472B 93B40BA0F903C0DCCD1F006632FFDB9A7FD8B1EB35FF53B77FBB32694D347F00 D0FC0160B5E6BF2549CB3B31FFD4D5D0FC0140F30700CD3F30EA664AF3D7FC01 40F30780159ABFD13E9A3F0068FE00A0F90F64FED947F86AFE00A0F90380E6BF 9D4EE72DB05F9CDB277C7C41EADC3EF1F2AFF90380E60F004B35FFB293E41799 7EBFDEE36AFE00A0F903C0B2CD9FF96BFE00A0F903C0DCCDFF54BFAB9AFFD19D 577D5CCD1F00347F0098B8F9FF6A4A6FABA1F90380E60F00B336FF86BEFDA9D6 BDAD86E60F009A3F00CCDDFC1FB7F3A5D6BDAD86E60F009A3F00CCDDFC99BFE6 0F009A3F0068FE9ABFE60F009A3F0068FE9ABFE60F009A3F000CD7FC6BAF5BA4 F9B75A0DCD1F00347F0058A4F97FDEFCE73F3437FFF8D5C85852F30700CD1F00 34FFAAF29FD4FC2357236331CD1F00347F00D0FCABCA7FEA689F98D5C85846F3 0700CD1F0034FF5D5B2EB5179031CEFF68355EAF8C5F40F30700CD1F0034FFED A1B53F5F6865FE47ABF1FCE7F687D395D7FC0140F30700CDFFC8BA1B9AFFD16A FCDC10B9E69A3F0068FE00A0F98FD2FCAFFC97E60F009A3F0068FE4745BD95F9 9FAE46F8FADD1B6AFE00A0F90380E65F9511CFE4A5F90380E60F0073377FE6AF F90380E60F009ABFE6AFF90380E60F007337FF9F075432FFC861FC49070268FE 00A0F90380E6DF9BF91FC97FE46A98DB0700347F6E0040F3BF62FE3159BE94F9 473E68FC8A69FE00A0F90380E6DF89F99F26FDD3D508DC83E60F009A3F0068FE CC5FF30700CD1F0034FFBFD71BEDA3F90380E60F002B37FF758EF0D5FC0140F3 0780959BFF3AB37A6AFE00A0F903C09ACDFF0ACEE1ABF90380E60F00A334FFD5 CC5FF30700CD1F00347FCD5FF30700CD1F0034FF22E69F318CFFF4869A3F0068 FE00A0F977D8FC4FA7EE49FD2FCD1F00347F00D0FC3B34FF578D0F54FDA3FF8D 5F0DCD1F00347F00D0FC7B6BFECF7F6E7FD0FC0140F3D7FC0168FE838EF37FFE FC7A7DC6029A3F0068FE00A0F97768FE31E708CB5846F30700CD1F0034FF7ECC 3FF2D4C0198B69FE00A0F90380E6DF89F947FA7CDE929A3F0068FE00A0F9F7D3 FCEF5F0DCD1F00347F0058A4F9DF46D8FC5BAD86E60F009A3F002CD2FC99BFE6 0F009A3F0068FE9ABFE60F009A3F0068FE9ABFE60F009A3F0068FE9ABFE60F00 9A3F00346FFE1F8DE86D35347F00D0FC0160E2E6FFD18EDE5643F30700CD1F00 666DFE088C02D2FC0140F30780CECDFFF9E7EEB4F9E3D4FCDF745DF30700CD1F 00FA31FF3FFE8DE67FB1F9BF3E999A3F0068FE00D0D5689F279AFFF5E6FF4A9E F9EF7E0BE3331A00EA35FF2BDFD502C088E61F18E7FFED1F02F67BBA403C91F7 F37CC4D7E5B73F175CB1A335DC8EF3BF68FEBBDFC2F88C06804ACDFFE277B500 309CF987C7F9C7C8F3FDE67F64FB81056A9B7FC1B97DDEBE85F1190D00959AFF C56203006399FFE9DC3E9175FD2DC8BF19F2F6CA6D96DF5DE6E856A9E6BFBDE1 D14A06567B7BAB1A73FB6CBF85F1190D00959A3FF307A0F9679BFF69787FB3E8 8C86BFBB2F90F770E19BC77C89603E7F0018BAF99BDB0780E6BF3BDA27E987A3 113219FB088174FF764D602725635C50AAF99BCF1F00466CFEE6F601A0F99735 FF57E2CDFFE856D7CD7F7BCFDBD13EA7ABADF90380E60F001337FF5DC78E6FFE 195F046C6FB51D8D7F74ABF87B8E3C3A58F30700CD1F00A66FFEA963664A5D19 1EED73D1FC8DF30700CD5FF307A0F967987FEADC3E81E37063E6F6C933FFECB9 7DB6CB68FE00A0F903C094CDBFF67CFE65A7FDBF61C5347F00D0FC0160CAE6CF FC03E6AFF90380E60F00A337FFD34362EF37FFC8FD11CD1F00A0F9034064F387 E60F009A3F00ACD0FCA1F90380E60F009A3FF3D7FC0140F30700CD5FF3D7FC01 40F30700CD5FF3D7FC0140F30700CD5FF3D7FC0140F30700CD5FF3070068FE00 A0F96BFE0000CD1F00347FCD1F0098BFE60F40F37F9AFF97D372FBB0F36BFE00 A0F903C0D0CDFFE9B40C3FDEFC357F00D0FC0160ACE6FF0DE968FE00A0F903C0 58CDFF2FE4A2F90380E60F00A334FFD73F832EF32E6B347F5FA900409FDFD502 C0A0CDBF2C9F7F426BDCED106B58B6F9FB320500BAFDAE1600C66DFE05D5F7CB ABBB95FFDA6B58AAF9FB0EC5A54B972E7BFEAE1600866BFECFF1E4652F9F125B E9FE3B5FC3EBCD7FB56F610060B8EF6A01602CF3FFA31A5F5EFD47C7545DC322 CD7F9D6F610060C4EF6A016020F347557C0BE3D2A54B97737F570B00806F6100 6085EF6A0100F02D0C00ACF05D2D0000000000000000E89CFF0FEBFBC679 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer geomview-1.9.4/doc/figs/ap.eps0000644000175000001440000037706310616356700013116 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: Sep 12 2003 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 228 290 384 472 %%EndComments %%BeginProlog %%BeginPreview: 156 182 8 728 % 29292929292929292929292929296229292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929292929292929292929292929a9292929292929292929292929292962 % 29626262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a96262626262626262626262626262a9 % 296262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9 % a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9 % a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262 % 626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a92962a9 % 296262ff292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929292929292929292929292929292929292929292929292929ff2962a9 % 296262ff626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262626262626262626262ff2962a9 % 296262ff62626262626262626262a9296262626262626262ff626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a92962626262626262ffff626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a929626262626262ff62ff6262ff62ff62ff62ff62ff62ff62ff % 62ff62ffff62ff62ff62ff62ff62ff62ff62ff62ff62626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a929626262626262ff62ff62ff6262ffff6262ff62ffffff62ff % ffffff626262ffff62ff6262ff62626262ffffff6262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a929626262ff62ff62626262a96262ff62626262626262a9ff2962a9 % 296262ff6262ffffffffffffffffa9296262626262ff6262ff62ff6262ffff6262ffff626262ff62 % 62ffff6262ff62ff62ff6262ffff62ff62ff62626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a929626262ffffff62626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a9296262626262ff6262ff62ffffff62ffffff6262ffff6262ff % 62ffff6262ffffff62ff62ff6262ff6262ffff626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a929626262626262626262ff6262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262a96262ffffffffffffff62a9ff2962a9 % 2929a9ff62a9626262626262626262296262a9a9a9a9a9a9a9a9a9a9a9a962626262626262626262 % 6262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a9a96262a9626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262ff626262 % a9a9a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62a9a9 % 2929a9a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020202020202020202020202020202020202020202020202020ff622929 % 2929a9a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505020202020202020202020202020202020202020202020202020ff626262 % 2929a9a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff626262 % 2929a9a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff626262 % 2929a9a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff626262 % 2929a9a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff626262 % 2929a9a9202050505050505050505050505050ff505050505050ff50505050505050505050505050 % 50ff505050509b50505050505050509b9b9b9b9b9b20505050ff5050505050505050ffff50505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205050505050ff50505050505050505050505050505050509bff626262 % 2929a9a92020505050505050ffff50ff505050ff505050505050ff50ffff5050505050ffff505050 % ffff505050509b50505050505050509b1d1d1d1d1d20505050ff505050505050505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050205050505050ff505050505050ff505050ffff50505050509bff626262 % 2929a9a920205050505050505050ff50ffff50ff505050ffffff5050505050ff50ff505050ff5050 % 50ff505050509b50505050505050509b1d1d1d1d1d20505050ff50ff50ff50ff50ff50ff5050ff50 % 5050ffff5050ffff50ff50ff50ff505050ff50ff50ff50ff50505050505050505050505050505050 % 50505050505050205050505050ffffffff5050ff505050ff505050505050509bff626262 % 2929a9a92020505050505050ff50ff50505050ff505050505050ff50505050ff50ff505050505050 % 50ff505050509b50505050505050509b1d1d1d1d1d20505050ff50ffffff505050ff50ff5050ff50 % 5050ff50505050ffffff505050ff505050ff505050ffffff50505050505050505050505050505050 % 50505050505050205050505050ff5050505050ff505050ff505050505050509bff626262 % 296262a92020505050505050ffffffff505050ff505050505050ff50ffff5050ff5050ffff505050 % 5050505050509b50505050505050509b1d1d1d1d1d20505050ff50ff50ff50ff50ff50ff505050ff % 50ff5050ffff50ff50ff505050ff505050ff50ff50ff50ff50505050505050505050505050505050 % 50505050505050205050505050ff505050505050ff505050ffff50505050509bff2962a9 % 296262a9202050505050505050505050505050ff5050505050505050505050505050505050505050 % 5050505050509b50505050505050509b202020202020505050ff505050505050505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff2962a9 % 296262a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050ff5050505050505050ffff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff2962a9 % 296262a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff2962a9 % 296262a9202050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502050505050505050505050505050505050505050505050509bff2962a9 % 296262a920209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a92050505050ff5050ff5050505050505050505050505050505050505050505050505050ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920505050505050505050ffff505050ffff505050ffff5050505050505050505050505050 % 50505050ff5050ffff50ff50ff5050ff505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050ff50505050ff505050505050505050505050505050505050 % ff50505050ff505050ffff50ff505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a92050505050ff5050ff505050ff50505050ff505050505050505050505050505050505050 % 5050505050ff505050ff505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050ffff5050ffff505050ffff50505050ff5050505050505050505050505050 % ff50505050ff50ffff5050ff50ff50ff505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff50ff50ff50 % 5050505050505050ff505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050505050505050ffff % ff5050ffff50ffffff5050ffffff5050ff50505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050505050ff5050ff50 % 5050505050505050ff5050ff505050ff5050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050505050505050ff50 % 5050ff5050505050ff5050ff505050ff5050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff50ff50ff50 % 5050ff50ff50ff50ff5050ff505050ff50ff505050505050505050505050509bff626262 % 2929a9a9205020202020202020202020202020202020202020202020205050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050ffff505050505050505050505050509bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b209bff626262 % 2929a9a9205020505050505050ff5050ffff5050ffff5050505050509b509b9b9b9b9b9b20505050 % ffff50505050ffffff505050ffffff50505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b209bff626262 % 2929a9a92050205050505050505050ff505050ff50505050505050509b509b1d1d1d1d1d20505050 % ff50505050505050ff50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 296262a9205020505050505050505050505050ff50505050505050509b509b1d1d1d1d1d20505050 % ff505050ff505050ff505050ffff5050505050ff5050505050ffff50505050505050505050505050 % 50505050505050505050505050509b9b5050505050ff5050505050505050ff505050ff50ff505050 % 505050505050505050ff5050505050505050505050505050505050505020209bff2962a9 % 296262a9205020505050505050505050505050ff50505050505050509b509b1d1d1d1d1d20505050 % ff50ff50ff505050ff505050505050ff505050ff5050505050505050ff5050505050505050505050 % 50505050505050505050505050509b9b5050505050ff50ffff5050ff5050ff5050505050505050ff % ff50ffffff50ffff50ff5050ffff50ffffffffff50505050505050505020209bff2962a9 % 296262a92050205050505050505050ff505050ff50505050505050509b509b1d1d1d1d1d20505050 % ff50ff50ff505050ff505050505050ff50ff50ff50ff50ff50ffff50ff5050505050505050505050 % 50505050505050505050505050509b9b5050505050ff50505050ff505050ff50505050505050ff50 % 5050ff505050ff5050ff5050505050ff5050505050505050505050505020209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b509b202020202020505050 % ff50505050505050ff50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050ffff5050505050ff50ff50505050505050ff50 % 5050ff50505050ff50ff50ff505050ff5050505050505050505050505020209bff2962a9 % 296262a9205020505050505050ff50505050505050ff5050505050509b5050505050505050505050 % ffff5050505050ffff50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050ffff50ff50ff50ff50ff505050ff50ff50ff50 % ff50ff505050505050ff50ff50ff50ff5050505050505050505050505020209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050505050505050505050ff505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b50ff5050505050505050505050ffff505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a9205020202020202020202020202020202020202020202020205050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9bffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9bffffff5050ffffffffffffffffff50ffffffffffff50ffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b5020202020202020505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9bffffffff50ffff5050ffff50ffff50ffffffffffff50ff50 % 50ff5050ffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a920502050505050505050ff5050ff505050505050505050509b502050505050509b505050 % ff505050505050505050ff505050505050505050ff50505050505050505050505050505050505050 % 50505050505050505050505050509b9bffffffff50ffffffffff50ffffff50ffffff5050ff50ffff % ff50ffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a9205020505050505050505050505050ffff505050505050509b502050505050509b505050 % ff50ffff5050ffff5050ff50505050505050ffffff50ffffff50ffff5050ff505050505050505050 % 50505050505050505050505050509b9bffffffff50ff50ffffffffff50ff50ffffffffffff50ff50 % ff50ffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 2929a9a92050205050505050505050505050ffffff505050505050509b502050505050509b505050 % ff50ffffff50ffffff50ff505050505050505050ff505050ff50ffff5050ff505050505050505050 % 50505050505050505050505050509b9bffffffff50ffff50ff50ff50ffff50ffffffffffff50ff50 % 5050ff50ffffffffffffffffffffffffffffffffffffffffffffffffff20209bff626262 % 2929a9a920502050505050505050ff5050ffff5050505050505050509b502050505050509b505050 % ff505050ff5050505050ff505050505050505050ff505050ff505050505050ff5050505050505050 % 50505050505050505050505050509b9bffffffffffffffffffffffffffff50ffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff626262 % 2929a9a92050205050505050505050ffff5050ffff505050505050509b50209b9b9b9b9b9b505050 % ff50ffffff50ffff5050ff505050ffffff50ffffff50ffffff50ffff5050ff505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % ff505050505050505050ff5050505050505050505050ff50ff505050505050505050505050505050 % 50505050505050505050505050509b9b50ff50ffff5050505050505050ffff505050ffff50505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050ff5050505050505050ff5050505050ff505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050ff50ff50ff50ff50ff505050ff505050ff50 % ff5050ff50ff50ff50ff505050ff50ff5050505050505050505050505020209bff626262 % 2929a9a9205020202020202020202020202020202020202020202020205050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b50505050505050ffff5050ff5050ff5050505050ff505050 % 505050ff5050505050ff5050505050ff5050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050ff5050505050ff50ff5050505050ff505050 % 505050ff5050505050ff5050505050ff5050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050ffffff50ff50ff50ff5050ff505050ffff50505050 % 50505050ffff50ffff5050ff505050ff5050505050505050505050505020209bff626262 % 2929a9a92050205050505050ff5050ffff5050505050ff50505050509b502020202020209b505050 % ffff50505050505050ffff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050505050505050505050ff505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920502050505050505050ff5050ff505050505050505050509b502050505050509b505050 % ff505050505050505050ff505050ff50505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050ff50ff505050505050509b502050505050509b505050 % ff50ff50ff50ff50ff50ff50505050505050ff50ff50ff5050ffff50ff50ff50ff5050ff50ff5050 % 50505050505050505050505050509b9b50ff50ffff5050505050505050ffff50505050ff505050ff % ff5050505050505050505050505050505050505050505050505050505020209bff626262 % 296262a92050205050505050505050505050ff5050505050505050509b502050505050509b505050 % ff50ff50ff505050ff50ff50505050505050ff505050ff505050ff50ff50ff50ff50505050ff5050 % 50505050505050505050505050509b9b5050505050ff50ffff5050ff5050ff50505050505050ff50 % 50505050ff505050ffff5050ffff50ffff50ffff50505050505050505020209bff2962a9 % 296262a920502050505050505050ff5050ffff5050505050505050509b502050505050509b505050 % ff50ff50ff505050ff50ff5050505050ff50ff50ff50ff505050ff50ff50ff50ff5050ff50ff5050 % 50505050505050505050505050509b9b50505050ff5050505050ff505050ff505050505050505050 % ff5050505050ff505050ff505050ff505050505050505050505050505020209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b50209b9b9b9b9b9b505050 % ff505050505050505050ff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050ffff5050505050ff50ff505050505050505050 % 50ff50505050ff505050ff505050ff505050505050505050505050505020209bff2962a9 % 296262a92050205050505050ff505050505050505050ff50505050509b5050505050505050505050 % ffff50505050505050ffff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050ffff50ff50ff50ff50ff505050ff50ff50ff50 % 50ff50505050ff50ff50ff50ff50ff505050505050505050505050505020209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b5050505050505050505050505050ff505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b50ff5050505050505050505050ffff505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a9205020202020202020202020202020202020202020202020205050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050205050505050ffff5050ff5050505050ff50505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050205050505050ff5050505050505050505050505050509b502020202020209b505050 % ffff50505050505050ff505050ffffff50ffffff5050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a92050205050505050ff50ff50505050ff50ff5050505050509b502050505050509b505050 % ff505050505050505050505050ff505050ff5050ff50505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 2929a9a92050205050505050ff50ff505050505050ff5050505050509b502050505050509b505050 % ff505050ff505050ff50505050ffff5050ffffff50505050ff505050505050ff50ff505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050ff5050ff50ff50ff50ff5050505050509b502050505050509b505050 % ff50ff50ff505050ff50505050ff505050ff5050ff505050ff50ff50505050505050ff5050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050ff5050505050505050505050505050509b502050505050509b505050 % ff50ff50ff50ff50ff50505050ff50ff50ff5050ff50ff50ff5050ff50ff50ff5050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050ffff5050505050505050ff50505050509b50209b9b9b9b9b9b505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % ffff50505050505050ff505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a92050205050505050505050505050505050505050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020209bff626262 % 2929a9a92050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020209bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a920505050505050505050505050505050505050505050505050509b9b9b9b9b9b9b505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a920505050505050505050505050505050505050505050505050509b1d1d1d1d1d20505050 % ff50505050ff505050ff50505050505050ff50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a920505050505050505050505050505050505050505050505050509b1d1d1d1d1d20505050 % ff50ffff505050505050505050505050505050ffff5050ffffff5050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 296262a920505050505050505050505050505050505050505050505050509b1d1d1d1d1d20505050 % ff50ffffff50ff50ff5050505050ff50ff50ffffff50ff5050505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920505050505050505050505050505050505050505050505050509b1d1d1d1d1d20505050 % ff505050ff50505050505050505050505050ff505050ff505050505050ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920505050505050505050505050505050505050505050505050509b202020202020505050 % ff50ffffff5050ff50505050505050ff505050ffff5050ffff50ff50ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502020202020209b505050ff505050505050ffff5050ffffffff50 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b5050505050505050505050ff50505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b5050505050ff50ff505050ff50505050505050 % ff50ff5050505050505050ffff5050ff50ff505050505050505050505050509bff2962a9 % 296262a9205050509b9b9b9b9b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b5050505050ffffff505050ff50505050505050 % ffffff5050505050505050ffff5050ffffff505050505050505050505050509bff2962a9 % 296262a9205050509b1d1d1d1d2050505050505050505050505050ff5050ff505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b50505050505050ff505050ff50505050505050 % 50505050ffff5050505050ffff5050505050505050505050505050505050509bff2962a9 % 296262a9205050509b1d1d1d1d20505050505050ffff5050505050ff5050ff50505050ffff5050ff % ff505050ff5050ffffff5050505050505050ffff50ffff5050ffff5050ffff50505050ff50505050 % 5050505050505050505050505050209b9b9b9b9b9b5050505050ffffff50ff50ff50505050505050 % ffff50ff505050ff50ffffffff5050ffff50505050505050505050505050509bff2962a9 % 296262a9205050509b1d1d1d1d20505050505050505050ff50ff50ff5050ffffff5050505050ff50 % 5050505050ff505050ff50505050ff5050ff505050ff5050505050ff505050ff5050ff5050505050 % 5050505050505050505050505050505050505050505050505050505050505050ff50505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050509b1d1d1d1d205050505050ff505050ff50ff50ff5050ff505050ff505050ff50 % 5050505050ff505050ff50505050505050ff505050ff5050505050ff50ff50ff50505050ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050509b2020202020505050505050ff50ff50ff5050ff5050ff50505050ff50ff50ff % ff50505050ff50ffffff5050505050ff5050ffff50ff5050505050ff50ffffff505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a92050505050505050505050505050505050505050505050ff505050505050505050505050 % 50505050505050ff50ff505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502020202020202050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b505050505050505050ff5050ff5050505050ff % 50ff50505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b5050505050ffff50505050505050505050ff50 % 50505050ffff5050ff5050ffff5050ffff505050ff50ffff505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b50505050505050ff505050505050505050ff50 % 505050ff5050505050ff5050505050505050505050ff5050505050505050509bff626262 % 2929a9a92050505020202020202050505050ff50505050ffffff50505050ff505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b5050505050ff50ff505050505050505050ff50 % 505050ff5050505050ff50505050ff505050505050ff5050505050505050509bff626262 % 2929a9a92050505020505050509b505050505050505050ff50ff5050505050ff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502050505050509b5050505050ff50ff50ff5050ff5050505050ff % 50ff50ff50ff505050ff50ff50ffff50ff50ffff50ff50ff505050505050509bff626262 % 2929a9a92050505020505050509b5050505050ff50ff50ff50ff505050ff505050ff50ff50ff50ff % 50ffff50ff50ff5050505050505050ff50ff50ff50ff50ff50ff5050505050505050505050505050 % 5050505050505050505050505050209b9b9b9b9b9b50505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a92050505020505050509b505050505050ffff50ff50ff5050505050ff505050ff50ffffff % 50505050ffffff5050505050505050ff505050ffffff5050ff505050505050505050505050505050 % 505050505050505050505050505050505050505050505050ff505050505050505050ff5050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a92050505020505050509b5050505050ff505050ff50ff5050505050ff505050ff505050ff % 50505050ff50505050505050505050ff505050ff5050505050ff5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a920505050209b9b9b9b9b505050505050ff50ffff50ff50505050ff50505050ff50ffffff % 50ff505050ffff50505050ffffff50ff50505050ffff5050ff505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050ff5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050ff50505050505050 % 50505050505050505050ff50505050505050505050505050505050505050509bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050ff50ff50ffff50ffff50 % 50ff50ff5050ff505050ffffffff5050ffff505050505050505050505050509bff2962a9 % 296262a920509b50505050ff50505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050ff505050505050505050505050ff5050ffff505050ff5050505050 % 5050505050505050505050505050505050505050505050505050505050505050ff50505050ff5050 % 50505050505050ff5050ff5050ff50ff5050505050505050505050505050509bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050ffff50 % ff505050505050505050505050ffffffff5050ffff505050ff5050505050ff50ffffffffff50ffff % 50505050505050505050505050505050505050505050505050505050505050ffff50505050ff5050 % 5050505050ff50ff5050ff50ff5050ff5050505050505050505050505050509bff2962a9 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050ffffff % 505050ff505050505050505050ffff505050ffffff505050505050ffff50ff505050ff5050505050 % 5050505050505050505050505050505050505050505050505050505050505050ff50ffff50ff5050 % 505050505050ffff5050ffffffff5050ffff505050505050505050505050509bff626262 % 2929a9a920509b5050505050505050505050505050505050505050505050505020505050505050ff % 5050ffff505050505050505050ffff505050ff5050505050505050ffff50ff505050ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050ffffff % 50ff5050505050505050ffffffffff50505050ffff50505050ff50505050ff50ffffff50ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050502020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff50ff505050ff5050ff50ff505050505050ff505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff50ff505050ffff50ff50ff50505050ff50ff50ffff50ffff % ff5050ffff50505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bff50ff505050ff5050ff50ff505050505050ffff505050ff50 % 5050ff505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b202020202020202020202020202020202020202020202020202050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bff50ff505050ff50ffff50ff5050505050ffffff505050ff50 % 5050ff505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bff50ff505050ff5050ff50ff505050505050ffff50ff50ff50 % 5050ff50ff50505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bff50505050505050505050ff50505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b5050ffffffff50ffff505050ffffff50ffffffffffffffff50 % ffffffff50ffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b50ffffffffff50ffff50ff50ffffff50ffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b50ffffffffff5050ff50ff50ffffff50ff50ffff50ff50ff50 % 50ffff5050ffff50ff50ffffff50ff50ffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 5050505050505050ffff505050505050505050505050505050505050ff505050ff50505050505050 % 50505050505050ff50ff505050509b50ffffffffff50ffff50ff50ffffff50ffffffff50ffffff50 % ffffffff50ffffffff50ffffff505050ffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050ffff50 % 5050ff5050505050ff5050505050ff505050ffffff50ff5050ffff50ff505050ff505050ffff50ff % ffff5050ff5050ff50ffff5050509b50ffffffffff50ff5050ff50ffffff50ffffffff50ffffff50 % ff5050ff50ffffffff50ffffffffff50ffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b5050505050505050505050505050505050505050505050505020505050505050ff % 5050505050505050ff50ff5050ff50ff505050ff50ff50ff50505050ff505050ff505050505050ff % 505050ff505050ff50ff50ff50509b50ffffffffff50ffff50ff50ffffff50ffffffffff50ffff50 % ffffffff50ff50ffffff50ffff505050ffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050ff50ff % 5050505050505050ff50505050ff50ff505050ff50ff50ff50ff5050ff505050ff505050505050ff % 505050ff505050ff50ff50ff50509b50ffffffffffffffffffff50ffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff20209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050ff50ff % 5050505050505050ff5050ff50ff50ff505050ff50ff50ff50ffff50ff505050ff505050ff5050ff % 505050ff50ff50ff50ff50ff50509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bffff50ffff50ff5050ffffff50505050ff5050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b50505050505050505050505050505050505050505050505050205050ff50505050 % 50505050ff5050505050505050505050505050505050505050505050505050505050505050505050 % 50505050ffff50505050505050509bff50ff505050ff5050ff50ff50505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff505050ff50ffff50ff50ff505050ff505050ff50ff50ff50 % ff505050ffff50ff50ff50ff50ff50ffff50ff5050505050505050505020209bff2962a9 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff5050505050ff50ffff50ff50505050505050505050505050 % ff505050ffff5050505050ff50505050ff50505050505050505050505020209bff626262 % 2929a9a920509b202020202020202020202020202020202020202020202020202050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff50ff505050ff5050ff50ff505050ff50ff50ff50ff50ff50 % ff50ff50ffff50ff505050ff50ff50ffff50ff5050505050505050505020209bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bff50505050505050505050ff50505050505050505050505050 % ff5050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bffff5050505050505050ffff50505050505050505050505050 % ff5050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050209bff50ff505050ff5050ff50ff5050505050ff50505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff5050505050ffff50ff50ff50505050ff5050ffff5050ffff % 505050ff5050505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff5050ffff50ff5050ff50ff505050ff5050505050ff505050 % ff505050ff50505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b50505050ff5050ff50505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff5050505050ff50ffff50ff50505050505050505050505050 % 50505050ff50505050505050505050505050505050505050505050505020209bff626262 % a9a9a9a920509b50505050505050ff50505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509bff50ff505050ff5050ff50ff50505050505050ff50ff50ff50 % ff50ff50ff50505050505050505050505050505050505050505050505020209bff626262 % 2929a9a920509b50505050505050ff5050505050505050505050505050505050205050ff50505050 % 50505050ff505050ffffff50505050505050505050505050505050ffffff5050ff50505050ff5050 % 50505050505050505050505050509bff50505050505050505050ff50505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff622929 % 2929a9a920509b50505050505050ff50505050505050505050505050505050502050505050505050 % 5050505050505050ff5050ff50505050ff50505050505050505050ff5050ff505050505050505050 % 50505050505050505050505050509bffff5050505050505050ffff50505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff626262 % 296262a920509b5050505050505050ffff50505050505050505050505050505020505050505050ff % 5050505050505050ffffff5050505050ff50ff5050505050ff5050ff50505050ff50505050ffff50 % 5050ff50505050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050ff50ff % 5050505050505050ff50505050ff5050ff50ff5050505050ff5050ff50505050ff50505050ffff50 % 5050ff50505050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050ff50ff % 50ffff5050505050ff50505050ffff50ff50ff50ff505050ff5050ff5050ff50ff50ff50ffffff50 % 5050ff50ff5050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b505050505050505050505050505050505050505050505050502050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b50505050505050505050505050505050505050505050505050205050ff50505050 % 50505050ff5050505050505050505050505050505050505050505050505050505050505050505050 % 505050ffff5050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a920509b202020202020202020202020202020202020202020202020202050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505020209bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b20202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020202020209bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b209bff2962a9 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050509bff2962a9 % 296262a99b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9bff2962a9 % 29626229292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929292929292929292929292929292929292929292929292929292962a9 % 29626262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262a96262626262626262626262626262a9 % 29a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9 %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 326 string def gsave 227.76 289.56 translate 156.48 182.88 scale 326 381 8 [ 326 0 0 -381 0 381 ] { picstr readstring } image 80008000ba000000e3d6019d5680d680d6fcd6019d56e2d6019d007f00d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656 d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d45d69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d56000300d69d d6e59d0256d6d6809d809dfd9d0256d6d6e59d02569d000200d6d6e49d01 56d6809d809dfc9d0156d6e39d0156007f00d69dd69d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d567f9d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d56459d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569dd69d569d007f00d6d69d9d9d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d7f569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d45569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569dd69d9d9d56000600d69dd69d569d80008000c80006d6 9dd69d569d000700d6d69d9d9d560080d680d6cad60700d6d69d9d9d5600 7f00d69dd69d569d00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd6459dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9dd6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd600d69dd69d569d0008 00d6d69d9d9d5600d6ea9d0156d6809d959d0256d6d6ea9d0156d6ea9d08 5600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d6809d979d 025656d6e99d0556d6d69d9d9df200fc9d085600d69dd69d569d000800d6 d69d9d9d5600d6eb9d025656d6ef9d010000809da89d0256d6d6eb9d0256 56d6fc9d0000f49d0d009d9d9d565600d6d69d9d9d56000900d69dd69d56 9d00d6d6eb9d0256d6d6f19dfd00809da99d025656d6e99d0656d6d69d9d 9d00f49d0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb 9d025656d6f19d0400009d0000809da99d0256d6d6eb9d025656d6fc9d00 00f49d0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb 9d0256d6d6f29d1600009d00009d9d9d00009d0000009d9d9d00009d0000 00fc9dfc00fc9dfc00fd9d0600009d00009d9dfc00fd9d0500009d000000 fc9dfc00fc9dfc00809df39d025656d6e99d0656d6d69d9d9d00f49d0d00 009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f2 9d2a00009d9d00009d9d9d0000009d9d00009d9d0000009d9d00009d9d00 009d9d00009d9d00009d9d00009d9dfb001f9d00009d9d00009d9d000000 9d9d00009d9d00009d9d00009d9d00009d9d0000809df39d0256d6d6eb9d 025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00d69dd6 9d569d00d6d69d9df000fd9d0256d6d6f39d2000009d9d00009d9d000000 9d9d9d00009d0000009d9d9d00009d00009d9d9d0000fa9d0500009d9d00 00f89d1a00009d9d00009d9d9d00009d00009d9d9d00009d00009d9d9d00 00809df49d025656d6f89dfc00f59d0656d6d69d9d9d00f49d0d00009d9d 9d5600d69dd69d569d000c00d6d69d9d9d5600d69d9d9d00f29d05009d9d 5656d6f39d0a00009d9d9d00009d9d0000fc9d0400009d0000fc9d020000 9dfa00fd9dfb00039d9d0000fb9dfb000c9d9d00009d9d9d00009d9d0000 fa9dfa00809df29d0256d6d6f99d04009d9d0000f79d025656d6fc9d0000 f49d0d00009d9d565600d6d69d9d9d56000c00d69dd69d569d00d6d69d9d 00f29d0600009d9d56d6d6f59df800149d9d00009d9d9d00009d9d00009d 9d9d00009d0000f99d0900009d9d00009d9d0000fc9d1100009d9d00009d 9d00009d9d9d00009d0000fa9d010000809dee9d025656d6f89d04009d9d 0000f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b 00d6d69d9d9d5600d69d9d9def00039d5656d6f49d010000fc9d1600009d 9d00009d9d9d00009d9d00009d9d9d00009d0000fa9d2800009d9d9d0000 9d9d00009d9d9d00009d9d9d00009d9d00009d9d9d00009d00009d9d9d00 009d0000809ded9d0256d6d6f99dfb00f79d025656d6fc9d0000f49d0d00 009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6fc9df100049d 9d56d6d6f69d010000fb9d0200009dfc00049d00009d9dfc00169d00009d 9d00009d9d00009d9d00009d9d00009d9d0000fc9d1e00009d9d00009d9d 00009d9d9d00009d9d00009d9d00009d9d00009d9d0000809df29d025656 d6f79dfc00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d56 9d000800d6d69d9d9d5600d6eb9d025656d6f59d010000fb9d1100009d00 009d0000009d9d9d00009d000000fc9dfc00fc9dfd00059d00009d0000fb 9dfd000d9d00009d00009d9d9d00009d9d9dfc00fc9dfc00809df09d0256 d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d560009 00d69dd69d569d00d6d6eb9d0256d6d6ec9d010000f99d010000809db69d 025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d 000800d6d69d9d9d5600d6eb9d025656d6ec9d010000f99d010000809db4 9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d 56000900d69dd69d569d00d6d6eb9d0256d6d6ed9d010000f99d01000080 9db59d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd6 9d569d000800d6d69d9d9d5600d6eb9d025656d6809d959d0256d6d6eb9d 025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d569d00 d6d6eb9d0256d6d6809d979d025656d6e99d0256d6d6fb9df300fd9d0856 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6809d959d0256 d6d6eb9d025656d6eb9d09565600d6d69d9d9d56007f00d69dd69d569d00 d69d9d569d569d569d569d569d569d569d569d569d569d56d6569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 7f9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d56459d569d569d569d569d569d5656d69d569d569d56 9d569d569d569d569d569d569d569d569d56d6569d569d569d569d569d56 9d569d569d569d569d569d5600d69dd69d569d0008009d569d9d9d56009d e956009d80569456009de856009de9560700d6d69d569d56000000fb5600 9d80008000c80001d69dfc56ff000000fcd6029d565680df80dfcadf0000 fad6ff000700d6d6d69d569d5680df80dfcbdf036400d69dfcd6ff000900 d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000a00d69d d69d569d56dfdfafa9df80afd9afcbdf0700d69dd69d569d000a00d6d69d 9d9d5656dfdfafaadf006480afd9afccdf086400d6d69d9d9d56000c00d6 9dd69d569d56dfdfafdfdfadaf01646480afd9af01dfdfcfaf09646400d6 9dd69d569d000c00d6d69d9d9d5656dfdfafdfdfadaf01646480afd9af01 dfdfcfaf09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdfad af01646480afd9af01dfdfcfaf09646400d69dd69d569d000c00d6d69d9d 9d5656dfdfafdfdfadaf01646480afd9af01dfdfcfaf09646400d6d69d9d 9d56000c00d69dd69d569d56dfdfafdfdfadaf01646480afd9af01dfdfcf af09646400d69dd69d569d000c00d6d69d9d9d5656dfdfafdfdfadaf0164 6480afd9af01dfdfcfaf09646400d6d69d9d9d56000c00d69dd69d569d56 dfdfafdfdfadaf01646480afd9af01dfdfcfaf09646400d69dd69d569d00 0c00d6d69d9d9d5656dfdfafdfdff8affd00f1affd00faaff900d7af0164 64eeaff36480aff8af01dfdff5af0000faaf0300afaf00f9af0000edaf09 646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8af0000edaf 0000faaf0000fbaf010000e2af0000f7af016464eeaff46400dff9affd00 f0affd00f7affd00e2af0000f9af0000c8af01dfdff5af0000faaf0300af af00f9af0000edaf09646400d69dd69d569d000c00d6d69d9d9d5656dfdf afdfdff8af0000edaf0000faaf0000faaf0000e2af0000f7af016464eeaf 016464f7e201dfdff9af0000ecaf0000f9af060000afafaf0000e4af0000 f9af0000c8af01dfdff5af0000faaf0000f6af0000edaf09646400d6d69d 9d9d56000c00d69dd69d569d56dfdfafdfdff8af0000fcaffc000bafaf00 00afafaf0000afaf00faaf0000faaf0300afafaffc0002afaf00fbaf0200 afaffc00fdaf0100affb00f8af016464eeaf016464f7e201dfdff9af0000 ecaf0000f9af0000fbaf0000dcaf0000c8af01dfdff5af0000faaf0e00af af00afafaf000000af00afafaffc00f4af09646400d69dd69d569d000c00 d6d69d9d9d5656dfdfafdfdff8af1400afafaf0000afaf0000afaf00afaf af00afafaf00faaf0000fbaf0b00afafaf0000afaf0000af00fbaf0f00af 0000afaf0000afaf0000afafaf00f7af016464eeaf016464f7e201dfdff9 af0000fcaffc00fcaffc00fcaf0000faaf0000f9af0200af00fbaf0200af affc00fdaf1500af0000af00af0000af00afafaf000000af00afafaffc00 cfaf01dfdff5af0000faaf1300afaf00afaf0000afaf0000afaf0000afaf 0000f5af09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8 af0000f8af0600afafaf00af00fcaf0000faaffa00fcaf0000fcaf0a00af af00afafaf00afaf00fcaf0300afaf00fcaf0000f7af016464eeaf016464 f7e201dfdff9af1500afafaf0000afaf0000afaf0000afaf0000afafaf00 faaf0000f9af0200af00fbaf2400af0000afaf0000afaf0000afafaf0000 afafaf00afaf0000afaf0000afaf0000afaf0000d0af01dfdff5aff80005 afaf00afaf00fcaf0300afaf00fcaf0000f5af09646400d69dd69d569d00 0c00d6d69d9d9d5656dfdfafdfdff8af0000fcaffb00fcaf0000fbaf0000 faaf0000fbaf0300afafaffa0008afaf00afafaf00afaffa0002afaf00fc af0000f7af016464eeaf016464f7e201dfdff9af0000f8af0300afaf00fc af0400afafaf00faaf0000f9af0a00afaf00afafaf00afaf00fcaf0300af af00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000d0af01dfdff5 af0000faaf0600afaf00afaf00fcaf0200afaffa00f5af09646400d6d69d 9d9d56000c00d69dd69d569d56dfdfafdfdff8af0900afafaf0000afafaf 00fcaf0000fbaf0000faaf0000faaf0300afaf00f9af0700afafaf00afaf 00f9af0000fcaf0000f7af016464eeaf016464f7e201dfdff9af0000fcaf fb0002afaf00fcaf0400afafaf00faaf0000f9af0900afaf00afafaf00af affa0002afaf00fcaf0000fcaf0300afaf00fcaf0200afaffa00d0af01df dff5af0000faaf0600afaf00afaf00fcaf0300afaf00f0af09646400d69d d69d569d000c00d6d69d9d9d5656dfdfafdfdff8af0400afafaf00fcaf06 00afafaf00af00fcaf0000faaf0000faaf0300afaf00f8af0600af00afaf af00f9af0000fcaf0000f7af016464eeaf016464f7e201dfdff9af0c00af afaf0000afafaf00afaf00fcaf0400afafaf00faaf0000f9af0a00afaf00 afafaf00afaf00f9af0000fcaf0000fcaf0300afaf00fcaf0300afaf00cb af01dfdff5af0000faaf0600afaf00afaf00fcaf0300afaf00f0af096464 00d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8af1400afafaf00 00afaf0000afaf00afafaf00afafaf00faaf0000faaf1a00afaf0000afaf 0000afafaf00af00afafaf0000afaf0000afaf00fcaf0000f7af016464ee af016464f7e201dfdff9af0400afafaf00fcaf0300afaf00fcaf0400afaf af00f9af0000fbaf0000fcaf0600af00afafaf00f9af0000fcaf0000fcaf 0300afaf00fcaf0300afaf00cbaf01dfdff5af0000faaf1300afaf00afaf 0000afaf0000afaf0000afaf0000f5af09646400d69dd69d569d000c00d6 d69d9d9d5656dfdfafdfdff8af0000fcaffd0000affc00fdaf040000afaf 00faaf0000faaf0300afafaffc00fbaf0000fbaffc00fdaf0000fbaf0100 00f9af016464eeaf016464f7e201dfdff9af1500afafaf0000afaf0000af af0000afaf0000afafaf00f9af060000afafaf0000fcaf0e00af00afafaf 0000afaf0000afaf00fcaf0000fcaf1000afaf0000afaf0000afaf0000af af0000d0af01dfdff5af0000faaf0e00afaf00afafaf000000af00afafaf fc00f4af09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdff8 af0000edaf0000caaf016464eeaf016464f5dff9af0000fcaffd0004af00 00afaffc00fcaf0000f7affd00f9af0000fbaffc00fdaf0000fcaf0000fc af0b00afafaf000000af00afafaffc00cfaf01dfdfcfaf09646400d69dd6 9d569d000c00d6d69d9d9d5656dfdfafdfdff8af0000edaf0000caaf0164 64eeaf0064f4dff9af0000ecaf000095af01dfdfcfaf09646400d6d69d9d 9d56000c00d69dd69d569d56dfdfafdfdff8affd00f1affd00caaf016464 daaf0000ecaf000095af01dfdfcfaf09646400d69dd69d569d000c00d6d6 9d9d9d5656dfdfafdfdfadaf016464daaffd00f0affd0095af01dfdfcfaf 09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdfdfadaf016464 80afd9af01dfdfcfaf09646400d69dd69d569d000c00d6d69d9d9d5656df dfafdfdfadaf01646480afd9af01dfdfcfaf09646400d6d69d9d9d56000c 00d69dd69d569d56dfdfafdfdfadaf01646480afd9af01dfdfcfaf096464 00d69dd69d569d000c00d6d69d9d9d5656dfdfafdfdfadaf01646480afd9 af01dfdfcfaf09646400d6d69d9d9d56000c00d69dd69d569d56dfdfafdf dfadaf01646480afd9af01dfdfcd640700d69dd69d569d000c00d6d69d9d 9d5656dfdfafdfdfab6480afd9af00dfcc640700d6d69d9d9d56000b00d6 9dd69d569d56dfdfafdfaa6480afa6af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80af80afceaf09646400d69dd69d569d000900d6d69d9d9d 5656dfdf80af80afceaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdf80af80afceaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80af80afceaf09646400d6d69d9d9d56000900d69dd69d569d56dfdff4af fd00f4af0000d3affd00fcaf000080af9faf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdff6af060000afafaf0000f6af0000d5af090000af afaf0000afaf0080af9faf09646400d6d69d9d9d56000900d69dd69d569d 56dfdff6af0000fbaf0000f6af0000d5af0000fbaf0300afaf0080af9faf 09646400d69dd69d569d000900d6d69d9d9d5656dfdff7af0000f6affc00 fdaf0300afafaffc00fdaf0500af0000af00e5af0000f8af0400af000000 fcaffc000dafaf00afafaf00afafaf00afaf0080afb9af09646400d6d69d 9d9d56000900d69dd69d569d56dfdff7af0000f7af180000afaf0000afaf 00afaf0000afaf0000afaf0000afafaf00e4af010000faaf1a0000afaf00 00afaf0000afaf0000af00afafaf00afafaf00afaf0080afb9af09646400 d69dd69d569d000900d6d69d9d9d5656dfdff7af0000f7af0000fcaf0600 afaf00afaf00fcaf0300afaf00ddaf010000fcaf0000fcaf0300afaf00fc af0a00af00afafaf00afafaf0080afb6af09646400d6d69d9d9d56000900 d69dd69d569d56dfdff7af0000f7af0000fcaf0600afaf00afaf00fcaf03 00afaf00dbaf040000afaf00fcaf0300afaf00fcaf0900afaf00afaf00af af0080afb5af09646400d69dd69d569d000900d6d69d9d9d5656dfdff7af 0000f7af0000fcaf0600afaf00afaf00fcaf0300afaf00daaf0300afaf00 fcaf0300afaf00fcaf0900afaf00afaf00afaf0080afb5af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdff6af0000fbaf0300afaf00fcaf06 00afaf00afaf00fcaf0300afaf00e0af0000fbaf0300afaf00fcaf0300af af00fcaf0900afaf00af00af00af0080afb5af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdff6af1c0000afafaf0000afaf0000afaf0000af af00afaf0000afaf0000afaf00fcaf0000e5af090000afafaf0000afaf00 fcaf1000afaf0000afaf0000afafaf00afafaf00fcaf000080afb9af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdff4affd00fbaffc00fdaf 0300afafaffc00fdaf0000fcaf0000e3affd00fcaf0000fcaf0300afafaf fc00fcaf0400afafaf00fcaf000080afb9af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80af9aaffd00fcaf0000ecaf0300afaf00d4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80af9caf090000afaf af0000afaf00ecaf0300afaf00d4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80af9caf0000fbaf0300afaf00ecaf0000d1af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80af9caf0000f8af0400af00 0000fcaffc00fcaffd000baf00afaf00afaf00af000000fcaffd0001af00 e4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af9baf0100 00faaf280000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00af af0000afaf0000afaf0000afaf0000e4af09646400d6d69d9d9d56000900 d69dd69d569d56dfdf80af99af010000fcaf0000fcaf0000f9af0300afaf 00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4af09646400d69d d69d569d000900d6d69d9d9d5656dfdf80af97af040000afaf00fcaf0300 afafaffb0002afaf00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000 e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af96af0300 afaf00fcaf0b00afaf0000afafaf00afaf00fcaf0600afaf00afaf00fcaf 0300afaf00fcaf0000e4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80af9caf0000fbaf0300afaf00fcaf0300afaf00fcaf0300afaf00 fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf80af9caf090000afafaf0000afaf00 fcaf1600afaf0000afaf0000afaf0000afaf0000afaf00afaf00fcaf0800 afaf0000afaf0000e4af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf80af9aaffd00fcaf0000fcaf1600afafaf000000af0000afaf000000 af00afaf00afaf00fcaf0800afafaf000000af00e4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdffcafd1df80af9eaf0000e4af09646400 d69dd69d569d000900d6d69d9d9d5656dfdffcafd2df006480afa3af0500 00afaf0000e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffc af01dfdfd5af01646480afa2affc00e3af09646400d69dd69d569d000900 d6d69d9d9d5656dfdffcaf01dfdfd5af01646480af81af09646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8af8b 640bdfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdf d5af046464afafaff36488af00648ddf0c64dfaf646400d6d69d9d9d5600 0900d69dd69d569d56dfdffcaf01dfdff5affd00fcaffd00fbaffb00f4af 046464afafaff46400dff9affd00f6affb00faaff900aeaf0164df8d640b dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5af 0000fcaf090000afafaf0000afaf00fcaf0000f4af066464afafaf6464f7 e201dfdff9af0000f5af0000fcaf0000faaf0000a8af0164df8f640ddf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff5af 0000fcaf0000fbaf0300afaf00fcaf0000f4af066464afafaf6464f7e201 dfdff9af0000f5af0000fcaf0000faaf0000a8af0364df646492af0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5 af0400afafaf00f8affd00fdaf0000f4af066464afafaf6464f7e201dfdf f9af0000fcaffc0008afaf000000afafaf00faaf0000f8affc00fcaffc00 fdaffc00fcaffd00caaf0364df646492af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff5af0400afafaf00f7af00 00fcaf0000f4af066464afafaf6464f7e201dfdff9af0c00afafaf0000af af0000afaf00fcaf0000faaf0000f9af1b0000afaf0000afaf0000afaf00 00af0000afaf0000afaf00afafaf00cbaf0964df6464af000000afaffc00 efaffd00f7affd00bcaf0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdff5af0400afafaf00f7af0000fcaf0000f4af 066464afafaf6464f7e201dfdff9af0000f8af0300afaf00fcaf0000faaf fa00f9af0300afaf00faaf0000fcaf0400afaf0000c8af0964df6464af00 afafaf00fcaf0000eeaf0000f9af060000afafaf0000e7af0000edaf0000 ecaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffc af01dfdff5af0400afafaf00f7af0000fcaf0000f4af066464afafaf6464 f7e201dfdff9af0000fcaffb0002afaf00fcaf0000faaf0000f8affb0002 afaf00faaffa00fdaffd00caaf0964df6464af00afafaf00fcaf0000eeaf 0000f9af0000fbaf0000e7af0000edaf0000ecaf0edfdf64dfaf646400d6 9dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5af0400afafaf00 f7af0000fcaf0000f4af066464afafaf6464f7e201dfdff9af0c00afafaf 0000afafaf00afaf00fcaf0000faaf0000f9af080000afafaf00afaf00fa af0000f6af010000cbaf0964df6464af00afafaf00fcaf0300afafaffc00 fcaffd00fcaf0000faaf0000f6affc00fdaf0400af000000fcaffd0007af af000000afafaffc00fdaf0900af000000afaf000000edaf0edfdf64dfaf 646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff5af0000 fcaf0000fbaf0300afaf00fcaf0000f4af066464afafaf6464f7e201dfdf f9af0400afafaf00fcaf0300afaf00fcaf0000faaf0000f9af0000fcaf03 00afaf00fcaf0200af00f5af0000cbaf0964df6464af00afafaf00fcaf13 00afaf0000afaf0000afaf00afafaf00afafaf00faaf0000f7af2b0000af af0000afaf0000afaf0000afaf00afafaf00afaf00afafaf0000afaf0000 afaf0000afaf0000afaf00ecaf0edfdf64dfaf646400d69dd69d569d0009 00d6d69d9d9d5656dfdffcaf01dfdff5af0000fcaf090000afafaf0000af af00fcaf0000f4af066464afafaf6464f7e201dfdff9af0c00afafaf0000 afaf0000afaf00fcaf0000faaf0000f9af1b0000afaf0000afaf0000afaf 0000af0000afaf0000afaf00afafaf00cbaf0964df6464af00afafaf00fc af0000f9af0400afaf0000faaf0000faaf0000f7af0000fcaf0300afaf00 fcaf0400afaf0000fbaf0000f8af0300afaf00fcaf0300afaf00ecaf0edf df64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdf f5af0000faaffd00fcaf0000fcaf0000f4af066464afafaf6464f5dff9af 0000fcaffd0004af0000af00fcaf0000faaf0000f8affd0004af0000afaf fc00fdaffc00fcaffd00caaf0964df6464af00afafaf00fcaf0300afafaf fb00fdaffd00fcaf0000faaf0000f7af0000fcaf0300afaf00fcaf0a00af afaf000000afafaf00fcaffb0002afaf00fcaf0300afaf00ecaf0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff5af 0000eeaf0000f4af056464afafaf64f4dff9af0000f0af0000a1af0964df 6464af00afafaf00fcaf0800afaf0000afafaf00fbaf050000afafaf00fa af0000f7af0000fcaf0300afaf00fcaf0000fbaf100000afaf00afafaf00 00afafaf00afaf00fcaf0300afaf00ecaf0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff5af0000eeaf0000f4af01 6464e9af0000f0af0000a1af0964df6464af00afafaf00fcaf0300afaf00 fcaf0000faaf0400afafaf00f9af0000fbaf0300afaf00fcaf0300afaf00 fcaf0000faaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00ec af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf 01dfdff5affd00f2affd00f4af016464e9affd00f4affd00a1af0964df64 64af00afafaf00fcaf1300afaf0000afaf0000afaf00afafaf00afafaf00 f9af110000afafaf0000afaf0000afaf0000afaf00fcaf1600afaf00afaf af00afaf00afafaf0000afaf0000afaf00fcaf0300afaf00ecaf0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af 01646480aff8af0564df6464af00fcaffc00fcaffd0007af0000afaf0000 00fcaf0000f7affd00fbaffc00fdaf0000fcaf0600afafaf000000fcaf0b 0000afaf000000af0000af00fcaf0500afafaf0000eeaf0edfdf64dfaf64 6400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af016464 80aff8af0564df6464af00e5af0000b0af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdfd36480aff8af0564df6464 af00e5af0000b0af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcaf00dfd26480aff8af0764df6464af000000e9affd00b0af 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcafd1 df80aff8af0364df646492000edfdf64dfaf646400d69dd69d569d000900 d6d69d9d9d5656dfdffcafd2df006480aff8af0364df646492000edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af 01646480aff8af0764df646400afafaffc0000afee00fdaffa00f9af0100 afbf000edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf fcaf01dfdfd5af01646480aff8af0564df646400affc00fdafec0000affa 0000aff90000aff60000afca000edfdf64dfaf646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8af0564df646400 affa0000afec0000affa0000aff90000aff60000afca000edfdf64dfaf64 6400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af046464 afafaff3df88af0564df646400affa0000affb00fcaffc00fdaffc0000af fa0000aff90003af000000fcaf040000afafafcb000edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff7affd00fcaffd 00f5affd00f6af046464afafaff4df0064f9affd00f0affd00faaff900f9 af0000baaf0564df646400affa0000affc0010afaf0000afaf0000af0000 00af000000affa0000aff9000baf0000afaf0000afaf0000afca000edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7 af0000fcaf060000afafaf0000f5af0000f6af066464afafafdfdff7af01 6464f9af0000ecaf0000faaf0000f3af0000baaf0564df646400affa0000 aff70004af0000afaffa0000affa00faaf020000aff90003af0000afca00 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 dfdff7af0000fcaf0000fbaf0000f5af0000f6af066464afafafdfdff7af 016464f9af0000ecaf0000faaf0000f3af0000baaf0564df646400affa00 00affb00fbaffd00fdaffc0000affa0000aff90003af000000fbaf020000 afca000edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf fcaf01dfdff7af0400afafaf00f6affc00fcaf0000f6af066464afafafdf dff7af016464f9af0000fcaffc00fcaffc00fcaf0000faaf0000f7affd00 0caf00afafaf000000af00afafaffc00fcaffd00d0af0564df646400affa 0000affc0005afaf000000affb0005afaf000000affa0000aff9000baf00 00afaf000000af0000afca000edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf01dfdff7af0400afafaf00f7af090000afaf00 00afafaf00f6af066464afafafdfdff7af016464f9af1500afafaf0000af af0000afaf0000afaf0000afafaf00faaf0000f8af1c0000afaf0000afaf 0000afaf0000afaf0000afaf0000afaf00afafaf00d1af0564df646400af fa0000affc0000affc0000affa0004af000000affa0000aff90003af0000 affc0003af0000afca000edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf0400afaf af00f6af066464afafafdfdff7af016464f9af0000f8af0300afaf00fcaf 0400afafaf00faaffa00fdaf0000fcaf0300afaf00fcaf0300afaf00fcaf 0400afaf0000ceaf0564df646400affa0000affc0010afaf0000afaf0000 af000000af000000affa0000aff9000baf0000afaf0000afaf0000afca00 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 dfdff7af0400afafaf00f7affa00fdaf0000f6af066464afafafdfdff7af 016464f9af0000fcaffb0001afaffa00fdaf0000faaf0000f8af0000fcaf 0300afaf00fcaf0200afaffa00fdaffd00d0af0564df646400affa0000af fb00fdaf0700afaf0000afafaffc0000affa0000aff9000daf000000afaf af00afaf0000afafcc000edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000f8af0000f6af 066464afafafdfdff7af016464f9af0c00afafaf0000afafaf00afaf00f8 af0000faaf0000f8af0000fcaf0300afaf00fcaf0300afaf00f6af010000 d1af0564df646400afe50000afb0000edfdf64dfaf646400d6d69d9d9d56 000900d69dd69d569d56dfdffcaf01dfdff7af0000fcaf0000fbaf0300af af00f8af0000f6af066464afafafdfdff7af016464f9af0400afafaf00fc af0300afaf00f8af0000faaf0000f8af0000fcaf0300afaf00fcaf0300af af00f5af0000d1af0564df646400afe50000afb0000edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0000fcaf12 0000afafaf0000afaf0000afaf0000afafaf00f6af066464afafafdfdff7 af016464f9af1500afafaf0000afaf0000afaf0000afaf0000afafaf00fa af0000f8af1c0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 00afafaf00d1af0764df646400afafafe900fdafb0000edfdf64dfaf6464 00d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff7af0000faaf fd00fbaffc00fcaf0000f6af066464afafafdfdff564f9af0000fcaffd00 04af0000afaffc00fcaf0000faaff900fdaffd000caf00afafaf000000af 00afafaffc00fcaffd00d0af0364df646492af0edfdf64dfaf646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0000eaaf0000f6 af056464afafafdff464f9af0000ecaf0000e4af0000c2af0364df646492 af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 01dfdff7af0000eaaf0000f6af016464e9af0000ecaf0000e9af050000af af0000c2af0964df6464af000000afaffc00efaffd00f8affd00ddaf0000 dfaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc af01dfdff7affd00eeaffd00f6af016464e9affd00f0affd00e8affc00c1 af0964df6464af00afafaf00fcaf0000eeaf0000faaf060000afafaf0000 e3af0400afafaf00dfaf0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdfd5af01646480aff8af0964df6464af00afaf af00fcaf0000eeaf0000faaf0000fbaf0000e3af0400afafaf00dfaf0edf df64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdf d5af01646480aff8af0564df6464af00f8af0300afafaffc00fcaffd00fc af0000faaf0000f8af0700af0000afaf0000fcaffc00fcaffc000bafaf00 0000afaf00af000000e3af0edfdf64dfaf646400d6d69d9d9d56000900d6 9dd69d569d56dfdffcaf01dfdfd36480aff8af0564df6464af00f9af1400 afafaf0000afaf0000afaf00afafaf00afafaf00f9af010000faaf240000 afaf0000afaf00afaf0000afaf0000afaf0000afaf0000afaf00afafaf00 00afaf0000e4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf00dfd26480aff8af0564df6464af00faaf0000f7af0400af af0000faaf0000f7af010000fcaf0b00afafaf00afafaf00afaf00fcaf03 00afaf00fcaf0700afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcafd1df80aff8af0564df64 64af00fbaf0000faaffb00fdaffd00fcaf0000f5af0f0000afaf00afafaf 00afafaf00afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000 e4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc afd2df006480aff8af0564df6464af00fcaf0000faaf050000afafaf00fb af050000afafaf00f4af0e00afaf00afafaf00afafaf00afaf00fcaf0300 afaf00fcaf0700afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8 af0964df6464af00afafaf00f9af0000fcaf0000faaf0400afafaf00faaf 0000fbaf0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf07 00afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400d69dd69d569d00 0900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0964df6464 af00afafaf00f9af100000afaf0000afaf00afafaf00afafaf00faaf2800 00afafaf0000afaf00afafaf00afafaf00afaf0000afaf0000afaf0000af af0000afaf00afafaf00fcaf0000e4af0edfdf64dfaf646400d6d69d9d9d 56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480aff8af0864df 6464af00afafaffa00fdaffd0007af0000afaf000000fcaf0000f8affd00 fcaf0b00afafaf00afafaf00afafaffc00fcaffc00fcaf030000af00fcaf 0000e4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf01dfdfd5af046464afafaff3df88af0564df6464af00e5af0000b0 af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 01dfdff7affd00fcaffd00f5affd00f6af046464afafaff4df0064f9affd 00f0affd00faaf010000fbaf0000deaf0000d6af0564df6464af00e5af00 00b0af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf fcaf01dfdff7af0000fcaf060000afafaf0000f5af0000f6af066464afaf afdfdff7af016464f9af0000ecaf0000faaf0200af00fcaf0000deaf0000 d6af0764df6464af000000e9affd00b0af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff7af0000fcaf0000fbaf00 00f5af0000f6af066464afafafdfdff7af016464f9af0000ecaf0000faaf 0200af00fcaf0000deaf0000d6af0364df646492af0edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0400afafaf 00f7af0400af000000fcaf0000f6af066464afafafdfdff7af016464f9af 0000fcaffc00fdaf0400af000000fcaf0000faaf0a00afaf00afafaf00af afaffc00fdaf0c00af0000af00af0000afaf0000fcaffc00fdaf0600afaf af000000dcaf0364df646492af0edfdf64dfaf646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf01dfdff7af0400afafaf00f7af090000afaf 0000afafaf00f6af066464afafafdfdff7af016464f9af1500afafaf0000 afaf0000afaf0000afaf0000afafaf00faaf3100afaf00afafaf00afaf00 00afaf0000afaf0000afafaf0000afaf0000afaf00afaf0000afaf0000af af00afaf00afafaf00ddaf0964df6464af000000afaffc00efaffd00f7af fd00faaffd00ddaf0000e9af0edfdf64dfaf646400d69dd69d569d000900 d6d69d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf0400 afafaf00f6af066464afafafdfdff7af016464f9af0000f8af0300afaf00 fcaf0400afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fc af0800afafaf00afafaf00f9af0700afaf00afaf0000daaf0964df6464af 00afafaf00fcaf0000eeaf0000f9af0f0000afafaf0000afaf0000afafaf 0000e3af0400afafaf00e9af0edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf0400 afafaf00f6af066464afafafdfdff7af016464f9af0000fcaffb0002afaf 00fcaf0400afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00 fcaf0b00afafaf00afafaf00afafaffb0008afaf00afafaf000000dcaf09 64df6464af00afafaf00fcaf0000eeaf0000f9af0000fbaf0300afaf00fb af0000e3af0400afafaf00e9af0edfdf64dfaf646400d69dd69d569d0009 00d6d69d9d9d5656dfdffcaf01dfdff7af0400afafaf00f7af0000fcaf04 00afafaf00f6af066464afafafdfdff7af016464f9af0c00afafaf0000af afaf00afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf03 00afaf00fcaf1300afafaf00afafaf00afaf0000afafaf00afaf00fbaf01 0000ddaf0564df6464af00f8af0300afafaffc00fcaffd00fcaf0000faaf 0000f7af0000f8af0700af0000afaf0000fcaffc00fcaffc000bafaf0000 00afaf00af000000edaf0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdff7af0000fcaf0000fbaf0300afaf00fcaf04 00afafaf00f6af066464afafafdfdff7af016464f9af0400afafaf00fcaf 0300afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf0300 afaf00fcaf0b00afafaf00afafaf00afaf00fcaf0300afaf00faaf0000dd af0564df6464af00f8af1300afaf0000afaf0000afaf00afafaf00afafaf 00faaf0000f6af010000faaf240000afaf0000afaf00afaf0000afaf0000 afaf0000afaf0000afaf00afafaf0000afaf0000eeaf0edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7af0000fcaf 090000afafaf0000afaf00fcaf0400afafaf00f6af066464afafafdfdff7 af016464f9af0c00afafaf0000afaf0000afaf00fcaf0400afafaf00faaf 0000fbaf0c0000afaf0000afaf0000afaf00fcaf1a00afafaf00afafaf00 afaf0000afaf0000afaf00afaf00afafaf00ddaf0564df6464af00fbaffd 00f8af0400afaf0000faaf0000faaf0000f4af010000fcaf0b00afafaf00 afafaf00afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000ee af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 01dfdff7af0000faaffd00fcaf0000fcaf0400afafaf00f6af066464afaf afdfdff564f9af0000fcaffd0004af0000af00fcaf0400afafaf00faaf00 00fbaf040000afafaffc00fdaf0000fcaf1900afafaf00afafaf00afafaf 000000af0000af00afafaf000000dcaf0564df6464af00f8af0300afafaf fb00fdaffd00fcaf0000faaf0000f2af0f0000afaf00afafaf00afafaf00 afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000eeaf0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff7 af0000eaaf0000f6af056464afafafdff464f9af0000ecaf0000a5af0564 df6464af00f8af0800afaf0000afafaf00fbaf050000afafaf00faaf0000 f1af0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00fcaf0700af af00afafaf00fcaf0000eeaf0edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf01dfdff7af0000eaaf0000f6af016464e9af00 00ecaf0000a5af0964df6464af00afafaf00fcaf0300afaf00fcaf0000fa af0400afafaf00f9af0000fbaf0300afaf00fbaf0e00afaf00afafaf00af afaf00afaf00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000eeaf 0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01 dfdff7affd00eeaffd00f6af016464e9affd00f0affd00a5af0964df6464 af00afafaf00fcaf1300afaf0000afaf0000afaf00afafaf00afafaf00f9 af310000afafaf0000afaf0000afafaf0000afaf00afafaf00afafaf00af af0000afaf0000afaf0000afaf0000afaf00afafaf00fcaf0000eeaf0edf df64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdf d5af01646480aff8af0564df6464af00fcaffc00fcaffd0007af0000afaf 000000fcaf0000f7affd00faaffd00fcaf0b00afafaf00afafaf00afafaf fc00fcaffc00fcaf030000af00fcaf0000eeaf0edfdf64dfaf646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af 0564df6464af00e5af0000b0af0edfdf64dfaf646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf01dfdfd36480aff8af0564df6464af00e5af 0000b0af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf00dfd26480aff8af0764df6464af000000e9affd00b0af0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcafd1df80aff8 af0364df646492af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcafd2df006480aff8af0364df646492af0edfdf64dfaf6464 00d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af01646480 aff8af0364df646492af0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0364df646492af0edf df64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdf d5af01646480aff8af0364df646492af0edfdf64dfaf646400d69dd69d56 9d000900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0364df 646492af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcaf01dfdfd5af01646480aff8af0364df646492af0edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6affd00fcaf fd00fcaf0000fbaffd00f6af01646480aff8af0364df646492af0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdff6af 0000fcaf090000afafaf0000afaf00f9af0000f6af046464afafaff3df88 af0364df646492af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcaf01dfdff6af0000fcaf0000fbaf0300afaf00f9af0000f6 af046464afafaff4df0064f9affd00f7af0000fbaffd00faaffa00fdaffa 00b9af0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdff6af0400afafaf00f7af0800af000000afaf af00f6af066464afafafdfdff7af016464f9af0000f5af0000f9af0000fa af0000fcaf040000afaf00fcaf010000baaf0364df646492af0edfdf64df af646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af04 00afafaf00f7af080000afaf0000afaf00f6af066464afafafdfdff7af01 6464f9af0000f5af0000f9af0000faaf0000fbaf0300afaf00fbaf0000ba af0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d 569d56dfdffcaf01dfdff6af0400afafaf00f7af0000fcaf0300afaf00f6 af066464afafafdfdff7af016464f9af0000fcaffc00fdaf0800af000000 afafaf00faaf0000fbaf0300afaf00fbaf0300afafaffc000aafaf0000af afaf0000afaffc00fcaffd00d7af0364df646492af0edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af0400afafaf 00f7af0000fcaf0300afaf00f6af066464afafafdfdff7af016464f9af14 00afafaf0000afaf0000afaf0000afaf0000afaf00faaf0000fcaf0400af afaf00fcaf1f00afafaf0000afaf0000afaf00afafaf00afaf0000afaf00 00afaf00afafaf00d8af0364df646492af0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf01dfdff6af0400afafaf00f7af00 00fcaf0300afaf00f6af066464afafafdfdff7af016464f9af0000f8af03 00afaf00fcaf0300afaf00faaffb00fcaffb00fcaf0000fcaf0a00afafaf 00af00afafaf00fcaf0400afaf0000d5af0364df646492af0edfdf64dfaf 646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af0000 fcaf0000fbaf0300afaf00fcaf0300afaf00f6af066464afafafdfdff7af 016464f9af0000fcaffb0002afaf00fcaf0300afaf00faaf0000fcaf0400 afafaf00fcaf0400afafaf00fcaf0000fcaf0000fcaffa00fdaffd00d7af 0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d56 9d56dfdffcaf01dfdff6af0000fcaf110000afafaf0000afaf0000afaf00 00afaf00f6af066464afafafdfdff7af016464f9af0c00afafaf0000afaf af00afaf00fcaf0300afaf00faaf0000fbaf0300afaf00fbaf0300afaf00 fcaf0000fcaf0000fcaf0000f6af010000d8af0364df646492af0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af 0000faaffd00fcaf0800af000000afafaf00f6af066464afafafdfdff7af 016464f9af0400afafaf00fcaf0300afaf00fcaf0300afaf00faaf0000fb af0300afaf00fbaf0300afaf00fcaf0a00afafaf00af00afafaf00f5af00 00d8af0364df646492af0edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf01dfdff6af0000ebaf0000f6af066464afafafdfdf f7af016464f9af1400afafaf0000afaf0000afaf0000afaf0000afaf00fa af0000fcaf040000afaf00fcaf1f0000afaf0000afaf0000afaf00afafaf 00afaf0000afaf0000afaf00afafaf00d8af0364df646492af0edfdf64df af646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdff6af00 00ebaf0000f6af066464afafafdfdff564f9af0000fcaffd000caf0000af 00af000000afafaf00faaffa00fdaffa00fcaffc000aafaf0000afafaf00 00afaffc00fcaffd00d7af0364df646492af0edfdf64dfaf646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf01dfdff6affd00efaffd00f6af 056464afafafdff464f9af0000edaf0000a4af0364df646492af0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01dfdfd5af 016464e9af0000edaf0000a4af0364df646492af0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf01dfdfd5af016464e9affd 00f1affd00a4af0364df646492af0edfdf64dfaf646400d69dd69d569d00 0900d6d69d9d9d5656dfdffcaf01dfdfd5af01646480aff8af0364df6464 90df0c64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 dfdfd5af01646480aff8af0264df648fdf0c64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf01dfdfd36480aff8af8b640bdfaf6464 00d6d69d9d9d56000900d69dd69d569d56dfdffcaf00dfd26480aff8af8a df0aaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf 09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf09646400d69d d69d569d000900d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d 9d56000900d69dd69d569d56dfdfcaaff36480af91af09646400d69dd69d 569d000900d6d69d9d9d5656dfdfcaaff46400dff9affd00f8af0000f9af fc00fbaf0000f9af000080afbdaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfcaaf016464f7e201dfdff9af0000f6af0000f9af0300afaf 00fbaf0000f9af0000f0af000080afceaf09646400d69dd69d569d000900 d6d69d9d9d5656dfdfcaaf016464f7e201dfdff9af0000f5af0000fbaf04 00afafaf00faaf0000fbaf0000efaf000080afceaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfcaaf016464f7e201dfdff9af0000fcaffc 00fdaf0000fbaf0400afafaf00faaf0000fbaf0300afafaffc00fcaffc00 09af000000afafaf00000080afd5af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfcaaf016464f7e201dfdff9af1600afafaf0000afaf0000 afaf0000afafaf0000afafaf00faaf200000afafaf0000afaf0000afaf00 00afaf0000afaf0000af00afafaf00afafaf0080afd6af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfcaaf016464f7e201dfdff9af0000f8 af0800afafaf00afafaf00fcaf0000f9af0800afafaf00afafaf00fcaf03 00afaf00faaf0500afafaf000080afd3af09646400d69dd69d569d000900 d6d69d9d9d5656dfdfcaaf016464f7e201dfdff9af0000fcaffb00fdaf04 00afafaf00fcaf0000f9af0700afafaf00afafaffa0002afaf00faaf0000 fcaffd0080afd5af09646400d6d69d9d9d56000900d69dd69d569d56dfdf caaf016464f7e201dfdff9af0900afafaf0000afafaf00fcaf0200af00fb af0000f8af0200af00fcaf0000f9af0000faaf0000faaf01000080afd6af 09646400d69dd69d569d000900d6d69d9d9d5656dfdfcaaf016464f7e201 dfdff9af0400afafaf00fcaf0000fcaf0200af00fbaf0000f8af0200af00 fcaf0000f9af0000fcaf0200af00f9af000080afd6af09646400d6d69d9d 9d56000900d69dd69d569d56dfdfcaaf016464f7e201dfdff9af0900afaf af0000afaf0000fbaf0000faaf0000f7af0000fbaf170000afaf0000afaf 0000afaf0000af00afafaf00afafaf0080afd6af09646400d69dd69d569d 000900d6d69d9d9d5656dfdfcaaf016464f5dff9af0000fcaffd0002af00 00fcaf0000faaf0000f7af0000faaffc00fcaffc00fdaf060000afaf0000 0080afd5af09646400d6d69d9d9d56000900d69dd69d569d56dfdfcaaf00 64f4dff9af0000ebaf000080afafaf09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfb6af0000ebaf000080afafaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfb6affd00efaffd00a6aff3df96af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc5aff4df0064f9affd00f4 affd00fbaff700bdaf09646400d6d69d9d9d56000900d69dd69d569d56df df80afc5af01dfdff7af016464f9af0000f5af0000fcaf0000f7af0000ec af0000ceaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5 af01dfdff7af016464f9af0000f5af0000fcaf0000f7af0000ecaf0000ce af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af01dfdf f7af016464f9af0000fcaffc0008afaf000000afafaf00f7af0000faaffc 0006afaf0000afafaffb0002afaf00fcaf0700af00af0000afaffc00e2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5af01dfdff7 af016464f9af0c00afafaf0000afaf0000afaf00fcaf0000f7af0000fbaf 130000afaf0000afaf00afafaf00afaf00afafaf00fcaf0c00af0000afaf af0000afaf0000e3af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc5af01dfdff7af016464f9af0000f8af0300afaf00fcaf0000f7af 0000fbaf0000fcaf0e00afafaf00af00afafaf00afafaf00fcaf0200af00 fcaf0000fcaf0000e3af09646400d69dd69d569d000900d6d69d9d9d5656 dfdff9aff36480afd9af01dfdff7af016464f9af0000fcaffb0002afaf00 fcaf0000f7af0000fbaffa00fcaf0000fcaf0400afafaf00fcaf0200af00 fcaffa00e3af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9af f46400dff9affd00f1affd00faaff900f0af0000eaaf010000fbaf0000de af0000d4af01dfdff7af016464f9af0c00afafaf0000afafaf00afaf00fc af0000f7af0000fbaf0000f7af0000fcaf0400afafaf00fcaf0200af00fc af0000deaf09646400d69dd69d569d000900d6d69d9d9d5656dfdff9af01 6464f7e201dfdff9af0000edaf0000faaf0000eaaf0000eaaf0200af00fc af0000deaf0000d4af01dfdff7af016464f9af0400afafaf00fcaf0300af af00fcaf0000f7af0000fbaf0000f8af0a00af00afafaf00afafaf00fcaf 0200af00fcaf0000deaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdff9af016464f7e201dfdff9af0000edaf0000faaf0000d3af0200af00 fcaf0000deaf0000d4af01dfdff7af016464f9af0c00afafaf0000afaf00 00afaf00fcaf0000f7af0000fbaf1a0000afaf0000afaf00afafaf00afaf 00afafaf0000afaf0000af00fcaf050000afaf0000e3af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdff9af016464f7e201dfdff9af0000fc affc0002afaf00fbaf0300afaf00faaf0000f8affc00fcaffc0009afaf00 afaf00af000000fcaffd0001af00faaf0a00afaf00afafaf00afafaffc00 fdaf0c00af0000af00af0000afaf0000fcaffc00fdaf0600afafaf000000 daaf01dfdff564f9af0000fcaffd0009af0000afaf0000afaf00f7af0000 faaffc0015afaf0000afafaf0000afaf0000afaf000000af00af00fbaffc 00e2af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9af016464 f7e201dfdff9af0b00afafaf0000afaf0000af00fbaf0300afaf00faaf00 00f9af1f0000afaf0000afaf0000afaf0000af00afaf0000afaf0000afaf 0000afaf0000faaf3100afaf00afafaf00afaf0000afaf0000afaf0000af afaf0000afaf0000afaf00afaf0000afaf0000afaf00afaf00afafaf00db af00dff464f9af0000f0af0000afaf09646400d69dd69d569d000900d6d6 9d9d9d5656dfdff9af016464f7e201dfdff9af0000f8af0b00afaf00afaf af00afafaf00faaffa00f9af0300afaf00faaf0300afaf00fcaf0300afaf 00fcaf0000faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf0800 afafaf00afafaf00f9af0700afaf00afaf0000c4af0000f0af0000afaf09 646400d6d69d9d9d56000900d69dd69d569d56dfdff9af016464f7e201df dff9af0000fcaffb000aafaf00afafaf00afafaf00faaf0000f8affb0002 afaf00faaf0300afaf00fcaf0300afaf00fcaf0000faaf0a00afafaf00af af00afaf00fcaf0300afaf00fcaf0b00afafaf00afafaf00afafaffb0008 afaf00afafaf000000c6affd00f4affd00afaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdff9af016464f7e201dfdff9af1400afafaf0000 afafaf00afaf00afafaf00afafaf00faaf0000f9af080000afafaf00afaf 00faaf0300afaf00fcaf0300afaf00fcaf0000faaf0000fcaf0500af00af af00fcaf0300afaf00fcaf1300afafaf00afafaf00afaf0000afafaf00af af00fbaf01000080afe4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdff9af016464f7e201dfdff9af0400afafaf00fcaf0600afafaf00af 00fcaf0000faaf0000f9af0000fcaf0300afaf00fcaf0500af00afaf00fc af0300afaf00fcaf0000faaf0000fcaf0500af00afaf00fcaf0300afaf00 fcaf0b00afafaf00afafaf00afaf00fcaf0300afaf00faaf000080afe4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdff9af016464f7e201 dfdff9af0f00afafaf0000afaf0000afafaf00af00fcaf0000faaf0000f9 af120000afaf0000afaf0000afaf0000af00afaf00fcaf0800afaf0000af af0000faaf0000fbaf0c0000afaf0000afaf0000afaf00fcaf1a00afafaf 00afafaf00afaf0000afaf0000afaf00afaf00afafaf0080afe4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdff9af016464f5dff9af0000 fcaffd0006af0000afafaf00fbaf0000faaf0000f8affd0004af0000afaf fc0005afaf00afaf00fcaf0800afafaf000000af00faaf0000fbaf040000 afafaffc00fdaf0000fcaf1900afafaf00afafaf00afafaf000000af0000 af00afafaf00000080afe3af09646400d69dd69d569d000900d6d69d9d9d 5656dfdff9af0064f4dff9af0000edaf0000d3af000080afacaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdfe5af0000edaf0000d8af0500 00afaf0000a3aff3df96af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfe5affd00f1affd00d7affc00a2aff4df0064f9affd00f4affd00fd affd00f7affd00c1af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc5af01dfdff7af016464f9af0000f4af0a0000afafaf0000afafaf 00f9af060000afafaf0000c3af09646400d69dd69d569d000900d6d69d9d 9d5656dfdf80afc5af01dfdff7af016464f9af0000f4af0000fbaf0400af afaf00f9af0000fbaf0000c3af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc5af01dfdff7af016464f9af0000fcaffc00fdaf0000f6 af0000faaf0000f6affc00fdaf0400af000000fcaffc00fdaffc0002afaf 00fbaf0200afaffc00f0af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc5af01dfdff7af016464f9af0c00afafaf0000afaf0000afaf 00f6af0000faaf0000f7af1e0000afaf0000afaf0000afaf0000afaf0000 afaf0000af0000afaf0000af00fbaf0700af0000afaf0000f1af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af01dfdff7af016464 f9af0000f8af0300afaf00f6af0000faaf0000f7af0000fcaf0300afaf00 fcaf0300afaf00f5af0a00afaf00afafaf00afaf00fcaf0000f1af096464 00d69dd69d569d000900d6d69d9d9d5656dfdff9aff3df80afd9af01dfdf f7af016464f9af0000fcaffb0002afaf00f6af0000faaf0000f7af0000fc af0300afaf00fcaf0300afaf00f9affb0008afaf00afafaf00afaffa00f1 af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9aff4df0064f9 affd00f7af0400af000000f8affd00fcaf0000ecaf0000f1af0000faaf00 00adaf01dfdff7af016464f9af0c00afafaf0000afafaf00afaf00f6af00 00faaf0000f7af0000fcaf0300afaf00fcaf0300afaf00faaf0f0000afaf af00afaf00afafaf00afaf00ecaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdff9af01dfdff7af016464f9af0000f5af0400afafaf00faaf 090000afafaf0000afaf00ecaf0000f1af0000faaf0000adaf01dfdff7af 016464f9af0400afafaf00fcaf0400afafaf00fbaf0400afafaf00f9af00 00fbaf0300afaf00fcaf0300afaf00fcaf0300afaf00fcaf0200af00fcaf 0a00afafaf00af00afafaf00ecaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdff9af01dfdff7af016464f9af0000f5af0400afafaf00faaf 0000fbaf0300afaf00ecaf0000f1af0000a6af01dfdff7af016464f9af17 00afafaf0000afaf0000afafaf0000afafaf0000afafaf00f9af110000af afaf0000afaf0000afaf0000afaf00fcaf1e00afaf0000afaf0000af0000 afaf0000afafaf00af00afafaf0000afaf0000f1af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdff9af01dfdff7af016464f9af0000fcaffc 00fdaf0400afafaf00faaf0000f8af0400af000000fcaffc00fcaffd0004 af00afafaffc00f8af0000faaf0700afaf00af000000fcaffc00fcaffd00 c3af01dfdff564f9af0000fcaffd0002af0000fcaffd00fbaf0000f7affd 00fbaffc00fdaf0000fcaf0300afafaffc00fdaffd0006af0000afafaf00 fbaffc00f0af09646400d6d69d9d9d56000900d69dd69d569d56dfdff9af 01dfdff7af016464f9af1000afafaf0000afaf0000afaf00afafaf00f9af 010000faaf1d0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000f9af0000faaf1700afaf0000afaf0000afaf0000afaf0000 afaf00afafaf00c4af00dff464f9af0000eaaf0000b5af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdff9af01dfdff7af016464f9af0000f8 af0700afaf00afafaf00f7af010000fcaf0000fcaf0000f9af0300afaf00 fcaf0300afaf00fcaf0000f9af0000faaf0300afaf00fcaf0300afaf00fc af0400afaf0000adaf0000eaaf0000b5af09646400d6d69d9d9d56000900 d69dd69d569d56dfdff9af01dfdff7af016464f9af0000fcaffb0006afaf 00afafaf00f5af040000afaf00fcaf0300afafaffb0002afaf00fcaf0200 afaffa00f9af0000faaf0300afaf00fcaf0200afaffa00fdaffd00afaffd 00eeaffd00b5af09646400d69dd69d569d000900d6d69d9d9d5656dfdff9 af01dfdff7af016464f9af1000afafaf0000afafaf00afaf00afafaf00f4 af0300afaf00fcaf0b00afaf0000afafaf00afaf00fcaf0300afaf00f4af 0000faaf0300afaf00fcaf0300afaf00f6af01000080afcdaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdff9af01dfdff7af016464f9af04 00afafaf00fcaf0700afaf00afafaf00faaf0000fbaf0300afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f4af0000faaf0300afaf00fc af0300afaf00f5af000080afcdaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdff9af01dfdff7af016464f9af1000afafaf0000afaf0000af af00afafaf00faaf090000afafaf0000afaf00fcaf1800afaf0000afaf00 00afaf0000afaf0000afaf0000afaf0000f9af0000faaf0300afaf00fcaf 0f00afaf0000afaf0000afaf00afafaf0080afcdaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdff9af01dfdff564f9af0000fcaffd0008af 0000af00afafaf00f8affd00fcaf0000fcaf1300afafaf000000af0000af af000000af00afafaffc00f8affa0004af00afaf00fcaf0300afafaffc00 fcaffd0080afccaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf f9af00dff464f9af0000f1af000080af80affaaf09646400d6d69d9d9d56 000900d69dd69d569d56dfdfe5af0000f1af000080af80affaaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdfe5affd00f5affd0080af80af faaf09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80af80afceaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80af80afceaf09646400d69dd69d 569d000900d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56 000900d69dd69d569d56dfdf80af80afceaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80af80afceaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdf80af80afceaf09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80af80afceaf09646400d69dd69d569d000900d6d69d9d9d5656 dfdffcafc86480af8aaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdffcafc96400df80af8aaf09646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf016464ccaf01dfdf80af8aaf09646400d6d69d9d9d560009 00d69dd69d569d56dfdffcaf016464ccaf01dfdf80af8aaf09646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf80af8aaf 09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01 dfdf80afe3af010000fbaf0000deaf0300afaf00d5af09646400d69dd69d 569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf80afe3af0200 af00fcaf0000deaf0300afaf00d5af09646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf016464ccaf01dfdf80afe3af0200af00fcaf0000de af0000d2af09646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01 6464ccaf01dfdf80afe3af0a00afaf00afafaf00afafaffc00fdaf0c00af 0000af00af0000afaf0000fcaffc00fdaf0400afaf00affa00fdaffc00e3 af09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464f7af 0000d6af07dfdfafafaf000000eeaffd00f9af0000faaf0000ebaf0000fb af0000fbaf0200af00f9af0000faaf0000c0af2d00afaf00afafaf00afaf 0000afaf0000afaf0000afafaf0000afaf0000afaf00afaf0000afaf0000 afaf00afaf00faaf0800afaf0000afaf0000e4af09646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464f9affd00d6af05dfdfafafaf00 eaaf0000f9af0000faaf0000ebaf0000fbaf0000fbaf0200af00f9af0700 afaf00afafaf00c0af0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf 0800afafaf00afafaf00f9af0600afaf00afaf00fbaf0400afafaf00fcaf 0000e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0164 64f7af0000d6af05dfdfafafaf00eaaf0000f9af0000e4af0000fcaf0200 af00fcaf0000f7af0700afaf00afafaf00c0af0a00afafaf00afaf00afaf 00fcaf0300afaf00fcaf0b00afafaf00afafaf00afafaffb0005afaf00af af00fcaf0000fcaffa00e4af09646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf016464f7af0000d6af05dfdfafafaf00fcaffc000eafaf00 afafaf00afafaf00afafaf00f9af0000faaf0700afaf00af000000fcaffc 00f9af2000afafaf00af00afafaf00afaf00afafaf000000af00af000000 afaf00af000000c4af0000fcaf0500af00afaf00fcaf0300afaf00fcaf1a 00afafaf00afafaf00afaf0000afafaf00afaf00afaf00afafaf00fbaf00 00dfaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464 f7af0000d6af1cdfdfafafaf00afafaf0000afaf0000af00afafaf00afaf af00afafaf00f9af0000faaf1000afaf0000afaf0000afaf0000afaf0000 faaf2100afafaf00af00afafaf00afaf00afaf0000afaf0000afaf00afaf af0000afaf0000c5af0000fcaf0500af00afaf00fcaf0300afaf00fcaf0b 00afafaf00afafaf00afaf00fcaf0900afaf00afaf00afaf00faaf0000df af09646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464f7af 0000d6af05dfdfafafaf00f8af0e00af00afafaf00afafaf00afafaf00f9 af0000faaf0300afaf00fcaf0300afaf00fcaf0000faaf1000afafaf00af 00afafaf00afaf00afaf00fcaf0700afaf00afafaf00fcaf0000c5af0000 fbaf0c0000afaf0000afaf0000afaf00fcaf1800afafaf00afafaf00afaf 0000afaf0000afaf00afaf00af00f9af050000afaf0000e4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464f7af0000d6af05df dfafafaf00fcaffb0008afaf00afaf00afaf00fcaf0000f9af0000faaf03 00afaf00fcaf0200afaffa00f9af0f00af00afafaf00af00afafaf00afaf 00fcaf0700afaf00afafaf00fcaf0000c5af0000fbaf040000afafaffc00 fdaf0000fcaf1700afafaf00afafaf00afafaf000000af0000af00afaf00 affa00fdaffc00e3af09646400d69dd69d569d000900d6d69d9d9d5656df dffcaf016464f7af0000d6af17dfdfafafaf00afafaf0000afafaf00afaf 00afaf00afaf00fcaf0000f9af0000faaf0300afaf00fcaf0300afaf00f4 af0f00af00afafaf00af00afafaf00afaf00fcaf0700afaf00afafaf00fc af000080afecaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffc af016464f7af0000d6af09dfdfafafaf00afafaf00fcaf0900afaf00af00 af00af00fcaf0000f9af0000faaf0300afaf00fcaf0300afaf00f4af0f00 af00afafaf00af00afafaf00afaf00fcaf0700afaf00afafaf00fcaf0000 80afecaf09646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf0164 64f7af0000d6af16dfdfafafaf00afafaf0000afaf0000afafaf00afafaf 00fbaf0000f9af0000faaf0300afaf00fcaf0800afaf0000afaf0000f8af 0000fbaf0000fcaf0f00afaf0000afaf0000afaf00afafaf00fcaf000080 afecaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464 f7af0000d6af05dfdfafafaf00fcaffd0009af0000afaf00afafaf00fbaf 0000f9affa0004af00afaf00fcaf0300afafaffc00f7af0000fbaf0000fc af0f00afafaf000000af00afafaf0000af00fcaf000080afecaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf05dfdfafaf af00eaaf00009caf8b640bdfaf646400d6d69d9d9d56000900d69dd69d56 9d56dfdffcaf016464ccaf05dfdfafafaf00eaaf00009caf8cdf0c64dfaf 646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf07df dfafafaf000000eeaffd009caf8b640bdfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf016464ccaf01dfdf81af8d640ddf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81 af00648faf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56 dfdffcaf016464ccaf01dfdf81af00648faf0edfdf64dfaf646400d69dd6 9d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0664af 000000afaffc00fdaf010000fbaf0400af000000faaf010000fbaf0000b6 af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf 016464ccaf01dfdf81af0664af00afafaf00fcaf0500afaf00af00fcaf04 00afafaf00faaf0200af00fcaf0000b6af0edfdf64dfaf646400d69dd69d 569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0664af00 afafaf00fcaf0500afaf00af00fcaf0400afafaf00faaf0200af00fcaf00 00b6af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf fcaf016464ccaf01dfdf81af0664af00afafaf00fcaf0e00afaf00afaf00 afafaf00afafaf00faaf0a00afaf00afafaf00afafaffc00fdaf0400af00 0000fcaffc00cdaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d 9d5656dfdffcaf016464ccaf01dfdf81af0664af00afafaf00fcaf0e00af af00afaf00afafaf00afafaf00faaf1f00afaf00afafaf00afaf0000afaf 0000afaf0000afaf0000afaf0000afaf0000ceaf0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf84af09 64df6464af00afafaf00fcaf0e00afaf00afafaf00afaf00afafaf00faaf 0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000 ceaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc af016464cadf84af0964df6464af00afafaf00fcaf0e00afaf00afafaf00 afaf00afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf 0200afaffa00ceaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d 569d56dfdffcaf0064c9df84af0964df6464af00afafaf00fcaf0300afaf 00fcaf0600af00afafaf00faaf0000fcaf0500af00afaf00fcaf0300afaf 00fcaf0300afaf00c9af0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80afc8af0964df6464af00afafaf00fcaf0300afaf00fc af0600af00afafaf00faaf0000fcaf0500af00afaf00fcaf0300afaf00fc af0300afaf00c9af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc8af0964df6464af00afafaf00fcaf0300afaf00fbaf05 0000afafaf00faaf0000fbaf0c0000afaf0000afaf0000afaf00fcaf0800 afaf0000afaf0000ceaf0edfdf64dfaf646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80afc8af0564df6464af00fcaffc00fdaf0000fbaf0500 00afafaf00faaf0000fbaf040000afafaffc00fdaf0000fcaf0300afafaf fc00cdaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcafc86484af0564df6464af00eaaf0000a8af0edfdf64dfaf646400d6 9dd69d569d000900d6d69d9d9d5656dfdffcafc96400df81af0264af00ea af0000a8af0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56 dfdffcaf016464ccaf01dfdf81af0464af000000eeaffd00a8af0edfdf64 dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf 01dfdf81af00648f000edfdf64dfaf646400d6d69d9d9d56000900d69dd6 9d569d56dfdffcaf016464ccaf01dfdf81af00648f000edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81 af046400afafaffc0000affc0001afaffb0004af00afafaff90000aff100 03af0000aff70000aff90000afef0000afe7000edfdf64dfaf646400d6d6 9d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af0264 00affc00fdaffc0002af00affc0004af000000aff90000aff10003af0000 aff70000aff90000afef0000afe7000edfdf64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af026400affa00 00affc0002af00affc0004af000000aff90000aff10000afec0000afef00 00afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcaf016464ccaf01dfdf81af026400affa0000affc000baf0000af0000 00af000000aff90007af0000af00afafaffc00fdaf0600af0000af00affb 000daf00af000000afafaf00af0000affc0002af0000fcaffd0000afe700 0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf01 6464f7af0000d6af01dfdf81af026400affa0000affc000baf0000af0000 00af000000aff90015af0000afaf0000afaf0000afaf0000afaf0000af00 affb000daf00af0000afaf0000afaf0000affc000aaf00afaf0000afaf00 00afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56df dffcaf016464f9affd00d6af07dfdfafafaf000000f7af0000faaffd00fa af010000fbaf0000deaf0000f9af0000deaf0000f6af026400affa0000af fc000baf000000af0000af000000aff90003af0000affc0003af0000affc 0010af0000af0000af000000af0000af0000affc0003af0000affc0000af fa0003af0000afe7000edfdf64dfaf646400d69dd69d569d000900d6d69d 9d9d5656dfdffcaf016464f7af0000d6af05dfdfafafaf00f5af0000f8af 0000faaf0200af00fcaf0000deaf0000f9af0000e2af0400afafaf00f6af 026400affa0000affc000baf000000af0000af000000aff90003af0000af fc0003af0000affc0010af0000af0000af000000af0000af0000affc0003 af0000affc0002af0000fbaf020000afe7000edfdf64dfaf646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf016464f7af0000d6af05dfdfaf afaf00f5af0000f8af0000faaf0200af00fcaf0000deaf0000f9af0000e2 af0400afafaf00f6af026400affa0000affc0000affc0006af00af000000 aff90003af0000affc0003af0000affc0010af0000af0000af000000af00 00af0000affc0003af0000affc000aaf00afaf000000af0000afe7000edf df64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464 f7af0000d6af05dfdfafafaf00fcaffc00fdaf0400af000000fcaf0000fa af0a00afaf00afafaf00afafaffc00fdaf0c00af0000af00af0000afaf00 00fcaffc00fdaf0000f9af0000f9affc00fdaf0400af000000fcaffd000c af00af000000afaf00af000000faaf026400affa0000affc0000affc0006 af00af000000aff90003af0000affc0003af0000affc0010af0000af0000 00af00af000000af0000affc0003af0000affc0002af00affc0003af0000 afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf fcaf016464f7af0000d6af1adfdfafafaf00afafaf0000afaf0000afaf00 00afaf0000afafaf00faaf2a00afaf00afafaf00afaf0000afaf0000afaf 0000afafaf0000afaf0000afaf00afaf0000afaf0000afaf00f9af0000fa af210000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00afafaf 0000afaf0000fbaf026400affa0000affc0000affb0005afaf000000aff9 0003af0000affc002faf0000afaf0000afaf0000af000000af00af000000 af0000afaf0000afaf0000afaf0000afaf00afaf0000afaf0000afe7000e dfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf0164 64f7af0000d6af05dfdfafafaf00f8af0300afaf00fcaf0400afafaf00fa af0a00afafaf00afaf00afaf00fcaf0300afaf00fcaf0800afafaf00afaf af00f9af0300afaf00f9af0000faaf0000fcaf0300afaf00fcaf0300afaf 00fcaf0700afaf00afafaf00fcaf0000fbaf026400affa0000affc0000af fb0005afaf000000aff90003af0000affc000baf000000afafaf00af0000 affc0000affc001aaf000000afafaf00af000000afafaf00af0000afafaf 00afaf00afe7000edfdf64dfaf646400d6d69d9d9d56000900d69dd69d56 9d56dfdffcaf016464f7af0000d6af05dfdfafafaf00fcaffb0002afaf00 fcaf0400afafaf00faaf0a00afafaf00afaf00afaf00fcaf0300afaf00fc af0b00afafaf00afafaf00afafaffb0002afaf00f9af0000faaffa0002af af00fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000fbaf026400af ea0000afa8000edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d56 56dfdffcaf016464f7af0000d6af11dfdfafafaf00afafaf0000afafaf00 afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf0300afaf 00fcaf1300afafaf00afafaf00afaf0000afafaf00afaf00f9af0000faaf 0000f9af0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000fbaf 026400afea0000afa8000edfdf64dfaf646400d6d69d9d9d56000900d69d d69d569d56dfdffcaf016464f7af0000d6af09dfdfafafaf00afafaf00fc af0300afaf00fcaf0400afafaf00faaf0000fcaf0500af00afaf00fcaf03 00afaf00fcaf0b00afafaf00afafaf00afaf00fcaf0300afaf00f9af0000 faaf0000f9af0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000 fbaf046400afafafee00fdafa8000edfdf64dfaf646400d69dd69d569d00 0900d6d69d9d9d5656dfdffcaf016464f7af0000d6af11dfdfafafaf00af afaf0000afaf0000afaf00fcaf0400afafaf00faaf0000fbaf0c0000afaf 0000afaf0000afaf00fcaf1300afafaf00afafaf00afaf0000afaf0000af af00f9af0000faaf080000afaf0000afaf00fcaf0f00afaf0000afaf0000 afaf00afafaf00fcaf0000fbaf00648faf0edfdf64dfaf646400d6d69d9d 9d56000900d69dd69d569d56dfdffcaf016464ccaf05dfdfafafaf00fcaf fd0004af0000af00fcaf0400afafaf00faaf0000fbaf040000afafaffc00 fdaf0000fcaf1300afafaf00afafaf00afafaf000000af0000af00f9affa 0001afaffc00fdaf0000fcaf0f00afafaf000000af00afafaf0000af00fc af0000fbaf00648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d 9d9d5656dfdffcaf016464ccaf05dfdfafafaf00ecaf0000acaf0000efaf 0664af000000afaffc00fdaf010000fbaf0400af000000f8affd00b3af0e dfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0164 64ccaf05dfdfafafaf00ecaf0000b1af050000afaf0000efaf0664af00af afaf00fcaf0500afaf00af00fcaf0400afafaf00faaf060000afafaf0000 b5af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffc af016464ccaf07dfdfafafaf000000f0affd00b0affc00eeaf0664af00af afaf00fcaf0500afaf00af00fcaf0400afafaf00faaf0000fbaf0000b5af 0edfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf01 6464ccaf01dfdf81af0264af00f8af0e00afaf00afaf00afafaf00afafaf 00faaf0000f7affc00fcaffd0004af00afaf00fcaf0200afaffc00fdaf04 00af000000fcaffc00fdaffc00eaaf0edfdf64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0264af00f9af 0f00afafaf00afaf00afafaf00afafaf00f9af010000faaf100000afaf00 00afaf0000afaf0000afaf00fcaf1e00af0000afaf0000afaf0000afaf00 00afaf0000afaf0000af0000afaf0000ebaf0edfdf64dfaf646400d6d69d 9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af0264af 00faaf0000fcaf0b00afafaf00afaf00afafaf00f7af010000fcaf0000fc af0300afaf00fcaf0300afaf00fcaf0200af00fcaf0300afaf00fcaf0300 afaf00faaf0000fcaf0000ebaf0edfdf64dfaf646400d69dd69d569d0009 00d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0264af00fbaf0000 fbaf0b00afafaf00afaf00afafaf00f5af030000afaffa0002afaf00fcaf 0300afaf00fcaf0100affa0002afaf00fcaf0300afaf00faaffa00ebaf0e dfdf64dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0164 64ccaf01dfdf81af0264af00fcaf0000faaf0000fcaf0600af00afafaf00 f4af0300afaf00f9af0000fcaf0300afaf00fcaf0200af00f9af0000fcaf 0300afaf00faaf0000e6af0edfdf64dfaf646400d69dd69d569d000900d6 d69d9d9d5656dfdffcaf016464cadf81af0664af00afafaf00f9af0000fc af0600af00afafaf00faaf0000fbaf0300afaf00f9af0000fcaf0300afaf 00fcaf0200af00f9af0000fcaf0300afaf00fcaf0200af00e6af0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf0064c9df81 af0664af00afafaf00f9af0000fbaf050000afafaf00faaf280000afafaf 0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000af0000af af0000afaf00fcaf0f00afaf0000afaf0000af0000afaf0000ebaf0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc8af0864 df6464af00afafaffa0002afaf00fbaf050000afafaf00f8affd00fbaffc 00fcaffd000baf00afafaf000000af00afaffc00fdaf0000fcaf0300afaf affc00fdaffc00eaaf0edfdf64dfaf646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80afc8af0564df6464af00eaaf0000e4af0000c5af0edfdf 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc8af0564 df6464af00eaaf0000e4af0000c5af0edfdf64dfaf646400d6d69d9d9d56 000900d69dd69d569d56dfdffcafc86484af0764df6464af000000eeaffd 00e4af0000c5af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d 5656dfdffcafc96400df84af0364df64648faf0edfdf64dfaf646400d6d6 9d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf84af0364 df64648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656 dfdffcaf016464ccaf01dfdf84af0964df6464af000000afaffc00fdaf01 0000fbaf0400af000000faaf0000fbaf0000b5af0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf84af09 64df6464af00afafaf00fcaf0500afaf00af00fcaf0400afafaf00faaf00 00fcaf0000b4af0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d 5656dfdffcaf016464ccaf01dfdf81af0664af00afafaf00fcaf0500afaf 00af00fcaf0400afafaf00faaf0400afafaf00b3af0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af 0264af00f8af0e00afaf00afaf00afafaf00afafaf00faaf0300afaf00fa affc00fcaffc00fdaf0400af000000ccaf0edfdf64dfaf646400d69dd69d 569d000900d6d69d9d9d5656dfdffcaf016464ccaf01dfdf81af0264af00 f8af0e00afaf00afaf00afafaf00afafaf00faaf0200af00faaf150000af af0000afaf0000afaf0000afaf0000afaf0000cdaf0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af 0264af00fbaffd00fdaf0b00afafaf00afaf00afafaf00faaffd00faaf00 00fcaf0300afaf00fcaf0300afaf00fcaf0000cdaf0edfdf64dfaf646400 d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464f7af0000fbaffc 00dfaf01dfdf81af0264af00f8af0e00afaf00afafaf00afaf00afafaf00 faaf0300afaf00fbaffa0001afaffa0002afaf00fcaf0000cdaf0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464f9af fd00fcaf0000fcaf0000e0af01dfdf81af0264af00f8af0300afaf00fcaf 0600af00afafaf00faaf0400afafaf00fcaf0000f9af0000f9af0000fcaf 0000cdaf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf016464f7af0000fcaf0000fcaf0000e0af01dfdf81af0664af00af afaf00fcaf0300afaf00fcaf0600af00afafaf00faaf0000fcaf0400afaf af00f9af0000f9af0000fcaf0000cdaf0edfdf64dfaf646400d6d69d9d9d 56000900569d569d569d56dfdffcaf016464f7af0000fcaf0000fcaf0000 e0af01dfdf81af0664af00afafaf00fcaf0300afaf00fbaf050000afafaf 00faaf0000fbaf1800afaf0000afaf0000afaf0000afaf0000afaf0000af af0000cdaf0edfdf64dfaf646400d69dd69d569d000000fc56049d5656df dffcaf016464f7af0000fcaf0000fcaf0000e0af01dfdf81af0264af00fc affc00fdaf0000fbaf050000afafaf00faaf0000faaf0200afaffc00fcaf fc00fdaf0400af000000ccaf09dfdf64dfaf646400d6d6fc56ff000000fc d604569d56dfdffcaf016464f7af0000fcaf0000fcaf0000e0af07dfdfaf afaf000000f2af0400af000000faaffa00eaaf0000f5affb00fbaf0000f7 af0000ddaf0264af00eaaf0000e1af0000c8af09dfdf64dfaf646400d69d fcd6ff000900d6d6d69d9d5656dfdffcaf016464f7af0000fcaf0000fcaf 0000e0af05dfdfafafaf00f0af0400afafaf00faaf0000fcaf010000f6af 0000f6af0000f5af0000fcaf050000afafaf00f7af0000ddaf0264af00ea af0000e1af0000c8af0edfdf64dfaf646400d6d69dd6d6d6000900d69dd6 9d569d56dfdffcaf016464f7af0000fcaf0000fcaf0000e0af05dfdfafaf af00f0af0400afafaf00faaf0000fbaf0000f6af0000f6af0000f5af0000 fbaf0000cfaf0464af000000eeaffd00e1af0000c8af0edfdf64dfaf6464 00d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464f7af0000fcaf 0000fcaf0000e0af05dfdfafafaf00fcaffc00fcaffd0005af00afafaf00 faaf0000fbaf0300afafaffc0007afaf000000afafaffc0006afaf00af00 0000f9af0000faaf0600afaf00afafaffc0009afaf00afaf00af000000fc affd0001af00edaf00648faf0edfdf64dfaf646400d6d69d9d9d56000900 d69dd69d569d56dfdffcaf016464f7af0000fcaf0000fcaf0000e0af1adf dfafafaf00afafaf0000afaf0000afaf0000afaf0000afafaf00faaf0000 fcaf1c0000afaf0000afaf0000afaf00afafaf0000afaf0000af0000afaf 0000faaf0000faaf1d00afaf00afaf0000afaf0000af00afaf0000afaf00 00afaf0000afaf0000edaf00648faf0edfdf64dfaf646400d69dd69d569d 000900d6d69d9d9d5656dfdffcaf016464f7af0000fbaffc00dfaf05dfdf afafaf00f8af0300afaf00fcaf0400afafaf00faaffa00f8af0700afaf00 afafaf00faaf0000fcaf0000faaf0000faaf0600afaf00afaf00faaf0300 afaf00fcaf0300afaf00fcaf0000edaf00648faf0edfdf64dfaf646400d6 d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf05dfdfafafaf 00fcaffb0002afaf00fcaf0400afafaf00faaf0000f7affb0006afaf00af afaf00faaf0000fcaf0000faaf0000faaf0600afaf00afaf00faaf0300af af00fcaf0300afaf00fcaf0000edaf00648faf0edfdf64dfaf646400d69d d69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf11dfdfafafaf00 afafaf0000afafaf00afaf00fcaf0400afafaf00faaf0000f8af0c0000af afaf00afaf00afafaf00faaf0000fcaf0000faaf0000faaf0600afaf00af af00faaf0300afaf00fcaf0300afaf00fcaf0000edaf00648faf0edfdf64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf 09dfdfafafaf00afafaf00fcaf0300afaf00fcaf0400afafaf00faaf0000 f8af0000fcaf0700afaf00afafaf00fcaf0200af00fcaf0000faaf0000fb af0700afafaf00afaf00fcaf0500af00afaf00fcaf0300afaf00fcaf0000 edaf00648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d56 56dfdffcaf016464ccaf1adfdfafafaf00afafaf0000afaf0000afaf0000 afaf0000afafaf00faaf0000f8af130000afaf0000afaf00afafaf0000af af0000af00fcaf0000faaf0000fcaf120000afafaf00afaf0000afaf0000 af00afaf00fcaf0800afaf0000afaf0000edaf00648faf0edfdf64dfaf64 6400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf05dfdf afafaf00fcaffd000daf0000afaf000000af00afafaf00faaf0000f7affd 0008af0000afaf0000afaffc0002afaf00fcaf0000faaffb00fbaf0300af afaffc0005afaf00afaf00fcaf0800afafaf000000af00edaf00648faf0e dfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf0164 64ccaf05dfdfafafaf00ecaf0000aeaf0000edaf00648faf0edfdf64dfaf 646400d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf05df dfafafaf00ecaf0000b3af050000afaf0000edaf00648faf0edfdf64dfaf 646400d69dd69d569d000900d6d69d9d9d5656dfdffcaf016464ccaf07df dfafafaf000000f0affd00b2affc00ecaf00648faf0edfdf64dfaf646400 d6d69d9d9d56000900d69dd69d569d56dfdffcaf016464ccaf01dfdf81af 00648faf0edfdf64dfaf646400d69dd69d569d000900d6d69d9d9d5656df dffcaf016464cadf81af00648faf0edfdf64dfaf646400d6d69d9d9d5600 0900d69dd69d569d56dfdffcaf0064c9df81af00648faf0edfdf64dfaf64 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5af00648ddf0c64 dfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af8cdf0c 64dfaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc5af8b64 0bdfaf646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc5af8adf 0aaf646400d69dd69d569d000900d6d69d9d9d5656dfdf80af80afceaf09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80648064cc640700d6 9dd69d569d000800d6d69d9d9d5656df80648064cb640700d6d69d9d9d56 000700d69dd69d569d5680008000c90006d69dd69d569d000600d6d69d9d 9d5680d680d6c6d6fd9d0156007f00d69dd69d569dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d6459dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69d569d000200d6d6e49d0156d6809d809dfc9d0156d6 e39d0156000300d69dd6e59d0256d6d6809d809dfd9d0256d6d6e59d0256 9d007f00d6d69d569d569d569d569d569d569d569d569d569d569d569d56 9d569d5656d6d6569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d7f569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d45569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d5656d6 d6569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 000100d6e25601d6d680568056fc5601d6d6e356ff0080008000ba00 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/ap.pdf0000644000175000001440000002066510616356701013072 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjf¢g6´0²2uôŒ--LLtMÀ cˆz —|®@ Ž¿?endstream endobj 6 0 obj 67 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 5936>>stream xœí];rä8Í9ʸmµ;'ѹ€Ž¡ˆ 92ö­ ´CK†N ·­qç$±Å€ÌDâK€A¾ ©ªH? 3Aþ7 àøÇ·úëóu§i!¾ž'¿þr¾>á±Ïúk¼B,|þzÐøxwý¸žµWŸ…ϧEÞ Ü,YPjü|º_¹¯‰=¥Æ£å¼¯É"5>ïU?:ÃÊžRã/o¿ç†ßVö´]ýž»¿óxÁ_¾Yj”Û¢KµÔÎ~‹…©[jLÚr‡xô²纰@ÛwXÔ£FiËÏóz„K3+ Ïø¼§/Ÿ¯Ægè•Æ   ùj|ü¼[9&©ñAÂ5*çwòa¶è}-‰¿IÅÚÁŽj\ˆy_ëöJÓ»^Lÿxk…Ôȇ2ïö– +L’ï¦ù¡!îßù{!Ji†Õ”45>Ó“z~·Ô¨Oþy­—ïèÀJ)€aÃäêâ Áhæ™Ô”T52§’DJ®œÜîÐ K¾¡bmépV#58‰jä~gj¤Ô¸ù!%Üuº5 5NÿrÕhÉÔ¨ëé\ƒM;,70’[n`ˆ£Æ±lKiôuwÞÜð7Õ·ÙÝ]ûf#ôCØsc¶A>t½ÕØ'»«±S„ÔH—°]"¤FFä­Fj–Ûjü’£¬¯¯‡Ç0w{=Ør¬q±`Ôøþù4ñù°ˆxr,ïΓu­˜Ô8±ùü=»ãÔyøçk"ø×’˜÷øüߣè”øs ï›iœtyÓ˜·ŸÿL‘ü…Æ©­y¨ñ÷Ñu:|ÀOÖR?Ôøû{äòdýŸ¬ßÕh|ûQe³Å‘söo²+çNCcòÙO•ZRãMc\¶ñ¦1 ·mÜj,‚[Ep«±*¨qé/ô’aùÎVûveÓø¿´Â2¡qÕÛúI¿c„Ô(ýÆlyúàÑl Dã˺OûÊ‘EÂjyÒ¡G!“F¯C4†Ž6DãÔÇÿ©}ŠÔç0qè¿tµhäÛLjRãT}Gs6kqý¾|}|šëý¨wU‚ÆÑYÄõ“dxÔ8UsÂ1jVçÏ#¯Ô¦€Z ËùjTǩߩ(†QºfãúÏ}ºiÄgFªD´m\øð)Íÿõ‚AóŒ¿fÒh¯“FZj-ê<Ý ×÷Ñsf‘¶Q×MR¥°õŽ”>t%ß`ññZ4º¯™ït£àQ£Ú.(Fôy„Õhä ÐÈÛ0Þ¤m¨ÔE#°’ÞÓB|“Q¶Ñœ ©Ôk4êÚ§F²3ßéF!“Æ5:›lЍ|.¼V¶ÔbùšÕ¤Ñ×ÄÄØÆQ5ˆž9˵ìúeT»ÚÞÄà~£ëšùNw#ÞOæ(&2/æ ³k#L:<ë|øšñëðÄaÃ(&}WˆÅ¨î÷¨àáñ¸&Òwç{8+ù®‰ú¸ýEЇÇ­Æ"¸ÕX·‹à;¼¥ÿHVcƆÂ8 9'/ª± ‹g¡1²m<ú¨NÙ6}T§Ã­Æ"¸ÕX·‹ ¨FæHó´ ÜYØ+j´’Ráù# F dƒÐ?¾n5bþ@ûêiž‚{Û8`ˆs Ph¬‚ýjÄ9rä–PÖ€E˜:¥1F(d™½Lc~ɵ= Zy4¢&†þ²#%N¨¬FàôuLcLKC£ôãõ}yÕ9¥#Ûo”š˜PÏšöÑ/eì…ÊèQŒÔáxƒ“º¤ñ¢cjßH5Õt_ÖÃã©æÐxI5úGª©ÆæºjtŒTu6ÚÒ£ ‹Ü¸¬]#Uװן&yY5©.‹Ü=ä[Nî/ËÚO¦ñªjª>–µ«1ž‘*ÜjŒ†s¤Š›>ˆuâ²jGª*k¤jŒëðˆjL¼§OÿÌçÙÆ4Ïrçé˜iÍÄ&Hº½TrÕ˜U©™- ÷Ò0â´ÊÂB£'~‹/ o?ÒU¯ì^jäþPr@xbw[¥Ž¢q¹+Z¶›­»˜×¿}…^“›Ffn¥=™[é‚6Õë*ùÚ&ª1»¥–œŸDfÕ°'âÑ۰̳*D¬:¶îN+÷hbx¥FæÖ¦‘]åµ dÕKØF õB¢Ñ—mÄw8)Óá±*52·AqÏÌŽrÙHU#…@cÌ]Lò4±R+{$u\%›£+„岑®F ›F ÐÈ$hµÔŽ‚Ò66«‘×1¶ÀM#›œTý&±M ²ôÌtKML!5¾£¢‘¦ä˜î n¢¿ŠSÕ¢r«.õÂÔ<øit ¸U ©1ÉãtÓèPcšß®-&¸‚q©1 ­Ä©'îºÇ¶1ÍÄ©¤±·–ú§ Öj5ª1>:»L"Bj<1hhɱò¦èC4f2Ú±)Uõh,¤FbMjrlQWÕtL#r_e Z,JM®ÏiTMŽï––4V]¨?gшœpú¸D¢ÕH½@¯¿Ðø›|ge¬ÒuµhTŸF Õ•ÄtV¶Ø…t>Õ¸Ù_©wR#:K<R¼—F‹–üøòs52Æb¥Ö„:+õ^jÄçL|¡ËÁûh´&éØp!ó:3”`ÓÈ$(Ð8@ÓÔh¼F)•šxéqãòŽ*Çu"lbRÕˆÏ~=ø`¥6&^P£EŸ*X R«8€ß6jÿn:¶¨‘|ˆ¨ÔÄw¤Ûá •ZÄöÑCfKN#g'ÆM¶QD=Óúghbœ’Ü¡Šij4–ÊÝáAž^f¥§m˜QLáO£ùEX4byD÷[ÆÆnxÃù‘4Êê‘n@|~cœÔÃW5^ÒmׄxׄXzk¨$61/”Þ¨Š&ÐØ›¿1ŠÆäõ¬hA5F|{4ÎÚ+»·el ü/¦a UþþãÔ¤»5RyéD=³^ìpíuÇqj¦8<@§>ÀôJ×m0è6Nýƒ>=°¶z»\¥iì-NýŸ»#¿qÁP’Æ~[j < åÄEPUÐ(71$‘]ÑèÓ_YóW5PWýâáMŒí  ë2J«±™8u[ùõãÔ# ˆ,¢¤µüÆâÔáãÙŠŒöòëÇ©kÑ]º’ÔˆGvG6*N͈{¦Ä( r‡1ZGûéªTAèiˆƒÜø€BÎ|êmžÇl5Z‹2ãÔºÓËû½dóƒf4éó©·zsÕ˜L£ŠS§Óˆ~™R©£hT¶Þ6ú6¢h¬¬F>óÓ¸´3.i„;JÉþF\a²<™-u:Iq4âå)¶›Ç`Ðlk£ç1³ß˜¥Fé‡Fcb J¯Z9hÄá+ËßH¶µÉó˜ĵB¦Ñ§vÓˆ;6Ü6ª_¦ÚF½ ÙßÈøØàyl3N½b¥&WL6Ãv[‰S—@æ|ê46§.€¼ùÔ[<}ûIGGò7Z£f”c=}{¿](nQúSK¨Gcqê–üIh*N½ëûSïºÇ~[ê]÷ØoK½ëo5Á­Æ"¸ÕXñjÿqܘzw´¬FÁo d<ÐXòÉ®{LP#aRò S1ÎU‚bƒ‹ÖÕˆ<#fÖ§>ø˜¬ F¿–¸Ñz´®Fì`Iå† 4¿i œI@*7$&Ÿ¸i4ÓÈÌ1L¨ò'Rc"’+m} ¾æ¬‰¬«Pyó;±C ±< ÖÕÈ*aj¥›F[„KÒ”Ÿ¡R§ö›ž|â´œF³ýxA6¯F4ŠIëðú¢hD•šAÍ«ÑB‘&÷OÞÄĪ‘Á¦1”|B;<ó2Š9w‡'¬Æ@ÞjZòI¡Ž¶Œ–ÕDRòI¯4Vô7Ú:®›{Ò©wÇDãÞ¾ìÓû½ûãCýjš˜bjô?tœ4òy·hÞîIPR1÷,=3*{x®DcEc0ߢ4šÑ›¿14}Ô‚µ7ïwT¿ÕÄQdØœþÔx—P#ºi›«Ã¥oPe2¬òØ%7®¢Fë6hf]9»îлõ¸q5®dÕÂŽ ðXÕ_Ó}j’Ξ—Ƙéå]#Ù¶« 71#Y>1Ãd*µ“6hFó±ɶߎ{$Ä,ÌjØBcú]¿e8\%‘£FÜyh$} /Pú®ß‡!Ë6šóµˆà´äÓˆ—ר‰‘«ÆU*"v£¡M /+¨1¹‰9~5†bTº±Fo¸o†mâN#Éña¶1ñ®ß‡Á«ÆÈUšNšVU.R=<›hŒlÅIb1ÛæR†‡[‹À“Kùç/<=-ÉÇU¼ß¦U$´&û2j$)¿f1]ÚGBsa¨'lp5 w½±hçŽ/õĈíäeÔ¸~ðÒȆS¸ž›1qhøÔxPça¢b1hq Ô#Ff|j uÈCº¬` ð…GÉQ±ÇQ8hdžñ¨ýj g ]c'-ЈGšŽ–Z¤ù ì›UiøÕO#95jb|ýFî#¡MŒ¦ÑÕÄ$«I˜°xgA{#p7ÁüH,¾Æ@,Æì7Ñës^€Ž™{b@î𤪑ÒÖ#1µÛ÷gÎ _pq“y4Æ>­lȶ?g”ݬ·7x#’9ª1äÞ‰ÆdÛÈb1ú¸ˆïÕ”±º ju Ç¢¸Í²;ÊQ#ŘCc²ú`z#àZÝvÐÅ,ÛˆÎ]l©]ï ^k¶ãÕ«FÖÐ~£Ôv8š^|ksüj ?TÕ49<³ÍdìÏü»Šux‚W‡3J§¶Æbngl‹Åœ´ –GoþƃЛ÷û Üj,‚[Ep«±n5Á­Æ"¸ÕX·‹àVcÜj,§soç~’™®…áTc&/×T²G9ºJz EGð¨ñ¦1·‹àZjxÚ‰»¤#Ék©1i.|*Rc[ \O:¾¥Àœí(‰Þƒ5&\™™Æ@Î Ïåã'ŠþÛ¹SÛ`hŒ¼¥Ân„Õ˜ý[hôgpåÑX$ŸBq(dºáí£"$ÛÆ*jŒ¢Ñ}¢¶ Û‘F“ gŽ!|?£Û˜E£™“#\kPçÀrmõ)™ó]³W†ekãæ"¹hD™pæ˜ÃÔR#š“ã¡QÈ“â4’$©  ‚F³œ˜Çª©ÑáT#;hDeÂ6*€U\BºG1?÷Þã¿]ªñ8ûR£jsõÓBÑý”Ôr„9Ó} IK:UãˆïÖ½äጃ›¡r4v¦F•N±4Ú¸ÕÈhÔ"ñ=Ót =˜lÔu!Û¸nWcB—ë4r#¦Ñ,ÀO÷۪ƌz+!Ç,Jš'EÞ#Š‚@#¦r]Ž^ßMA¾ÿFD55âòúsr,$’Fä½™PœF5ßnÏM£2yy4Ž0ªF+`ä )¹½Š÷.D „ ™4šBœFüÕOcÅ™4]”Ð1O ïÝÂ;“i¥(‹FÔ|ùÖ£›˜Š37/ !Õs°i”œÕ8Î2$ÓÈû6d¡^¹îå Û¨N FüKD#Ð †häpó°UÕˆf"X4B£W™ÛZVe4Ö‰©4âåA£R.†¸° ª«Ñš¥·9O ïÝâ4ö“ߨlãˆ'X4FÌ“Z~1ÿíâÚ6¶Aã.3${£¡üF(O¨«FŽÒ4:ÂÊÁÄ<ÄnÔS£}½KK´M`ç7šÿeÐkdP×^GbžZ xP‰š.k̉ ¹€>#ƒšFÔB4ê - *a°Gƒj(èÌLé[¸6c‘RÿÖ{E}Ž®Õhþ[4*%N°i”›^—€žÕh™¨”ø ‰©‘/ö¶IýeÛi©A¢Q«4…F³X@Ù¶ ÒHýÄ»énKؘ3¦‰é/¿‘X8B£é²îø€5æŒìðô—m+ÀÛãÞÒïXêÓØY¶­TûƒÑzj9RããÛ·™Æ¯¶Ñ*eÙ&Äã ~DåNC#L<~ ä7–¤ÑÁEcƹeϧ.¡Æ²-5¶N&ÔÁi\ (ÒÍíæ©õ€sBÄp]Ãù94zf"°•¦0n, j}D»Úp~cê(Fè^æÿ¬ïÓ§qä›s^Ô†Õ˜´Íˆ™ P>h¬‘më‰0@ú ±†­óµhDÖÏ6¹ÓXKÎ&fþ 41œF­XÓÄ(lbjÎD;<@ ¨¡bP‡Ç,i­ÃsÖ™Ñx™-Vê3ÎDpõb;Rã‘hO'ͶÝ{fÛî½Çþò!ÿêoAoÙ¶ÐÞÓ‹NŠÖž^tR¡ÆGƒÐ›‚¨Æ·£ê„°Õx³˜K¿Ž>¢s‚©ñõèã9-ˆÿúº_¹/£F'>_}k¯‚ J¾ xY¾ü,(5~>9_ð:åI]ýbaRã«÷B¼‚ý5`áAãø?’K¾å endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000384 00000 n 0000008070 00000 n 0000000325 00000 n 0000000170 00000 n 0000000015 00000 n 0000000152 00000 n 0000000449 00000 n 0000000549 00000 n 0000000490 00000 n 0000000519 00000 n 0000006677 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 8236 %%EOF geomview-1.9.4/doc/figs/ap.png0000644000175000001440000001172610616356715013110 00000000000000‰PNG  IHDRF}ŠDÜ­PLTE¯¯¯âââÖÖÖdddVVVßßß#2yIDATxœí»n#¹†IÃØ“’1©a ô'8éÂ&^ã`àt` ”;0üú+²ªÈâlu³å]•á±GVKŸ~^ºªxâ Øý1°Ãqw‹Åýs`§ãóÞ#ü÷ߟ¸ŽO{[„p0:†„ÿÝÃb£ãáªí;èøvÍö :>îÝ·TìuüµKÓg÷¤ãñ»7þû>öÄœŽÏåF5É~^Göà.ýãá7ÿÏñé*ãÝ™1£ãÉý.¦>…:žá·»§SUÇÇ™Œ‰Žð›hè(ï¦àåu  £8‹ùxw®ø}~~œEø½†-Óñ sf¹3LOìKÜÙæqüZ²GGêÖŽ€gU´’ÚKÄþ8?Žß« ‚ŽX*%ñ­Ž”4¦h ©°ªÁÀk•5舥RÒ‘ïPGÓA‹å|’ŶE­×ª@Gd,éHe}‡:" cô€c\³å[Mi=UÚ51¢ŽÂ` hƼÑ൛ èøŒ½íîÇê ?ŒŠ+v=KûG]±ÎÕlá}ñ&Ý—ê8‘q±Ž3-Ö‘n)Íú8Ïb òšuô¿;ŸY<ûc—(ú7ÿG°:Þ½=ý:œ¼ñßçÙÿG¸~û%þ8¨†^£ÝNç²>>Ÿ>¯×îÇ?ÏŒ‡ÃÞ eû¸ÿnŸŸNŸúZí'µëÃç·¶Iåíï±<0~Leü`:¾w¿ÞÏ-‹oÿ“éX|RzÕ L±Õo:öÛMÇu쟥£øûËù~.³Wù߬½¬Çx~?eþÑþc•û‹‚ç šÌ1š+ݧ©rf?pc¤c̨th1ãÏö¿÷à5Í%JÆŸn„Q놎Bœ_^IǨ„ù]™Ç•¢“1ýtŒç(¥‚cÏtg&E:=„yGû¸¬éxþ0ðMª™ËÍRœ¯ß·Á¨ð«¤£yž„wæ%¥ý`FKû]fø0âC2zß"£ñ»Ã7ËÕGRxÍEFÑ`„RRžQáöõÂ÷mé¨á :ÚòT¬Í@e—X˪e-RFFïÛÃèÞ#­¬¬£RºÍ(ò:êPÇ’ÕSƒ6£ >Ñã5FÉ¡ ¤\ʶ™´>J÷=ЛÛÖ`¯k·è%<ˆŒ]m&Û÷Ôî3%cŒÖ›F%”¤¾î3æ3 ¬ß}Oîݪ÷™6ã+cì¹²lý~OèS´½mɸ–ÿùÃöÏòûìæ‡'ïvÓqÀ¾}ü,Ó±ü¤Ä¶`,¿Ó±q Ʋ1§¾ïˆ1÷F)ÚMÇuìKꈮAÁwQ¢$ob±Ží£õ®w` u”¨S‘b°©éh6rÁCÌhÂz ù5 8ÒBúø‰™MøÁ×LÆTG2e–ÀåVÅ·33:V1•¨Ï©š£:² ÎDÆ´]—UÀ(å.:BvÔµÕ8ì1¿âÒ?›3fî3¾ï‰[…Â6éˆiŒ{Þ¯E B)cµ«ßC©/´2ãŽ:Ê«TovÕ²¯Â6“USxŸôÜUGãb)ɾ\ 3bÜÓW’ú† S¾&µÆô5Y÷g€M^¯ŽþÆÛ`Ü¿dm†î³ãþ÷“ÍØ÷ØûlMÇ ÷ÙèµúX`|™KXïóÅýð²=7)†:f¯™Í˜Ø,’›‘½÷éO¾„õ¡R`ëïǯ[NdUÇc¸{BÄÌ—u~üºåD.Ò1Ü=A…Œ|§ÅWô[Nd­]eƒïl}ÆxüºåDÖúÇŠŽÁN‚=Po3’"­`üºåDãB¾.Å×#-l€ú›·ÔÊ:¿Ö 'rÍøºa¬¬ÿH¯PuÐV‹¯; ã×mÆUâë~ÆtüºîD^Åøuɼ_¯Èx¿fŒË.œ__À8­]/»pn»^váMÇðEþ}:zG9s¿Þ‡1ÑQú­ Â<ÅûnŒ‰Ž’’n1£yV’;SM6gÌè…qWdD'U€ì3ftÄ\µè`´zoÎXÔË»”K iïMlok3–t,1²éÑŠbYrŸÉÉ^›qTG6=ZçLA$9Ûª]—ÊÚM™õ:âUÓµKýc©Í°éÑ®>£}~¶™¯®#Üg },1Jª‰Sꣳv›þqë6“Ó1aŒs)Ø÷¸ûÌÆ}O¢cœl-äRzƒ¦5ÇüÇ}ÇüG'rÿÒBx‘/ᇿ¢Î–ÍôÃ"~Æ:n˜§È¿t…:n˜Kù¶TƳûÿ%÷‰»B»é¸Žýst\¯}/±>±£Òn¤J»]ÅïÛË»t ×±ãpÈ86^3ÆØ¥c²Ö^ûàu㨎0<Èqq@cöEŒ£:úC´ÎÜ^‹Û0Ž×G¥Ýp™tA˜V]yŸeŒ£:*!BF!\¶UYê«(°Q+Ç ãÞ1Žê(óŒ :¤mÇu~±‚v³6m3]:‚³©)¾ÝVûÖÇWÆèlû› ڨ߳ã˜ÿ'1z ã™A:°Yþ#0šs)ë_z¶)šå‡Ã¡f|hûÊ·9´rŸ0MÇwûnzã:Ú‰o¼ïRn{E»Ð4aœ¯#?µHºãàˆÌz¡ê#g´Iò¥Ø>-Œ‘ëˆY™­ÙI_RûƒÊ1iꡎÀøªÙT­øŒ@^µû§‡Ge鍯äÚHÇÿçá3@q·æ”±êuÈ—µŽÊ:a tl38 KmFÚ™•™6SÔÜk:§‹Ü¾Ïnÿôp:¹_Yº*ß÷X¿IÊÌ»²Žð©<£sý>»ýÓÃéäÍJ¨û~_­îL6Áw2 fZvNg¶„±X…pŒPÖ¢ÉXœÎ™OÑËXÒQI0ŠœŽ½ÓÃ/²J}ÄqJbD–*cqzø…ŒeUÀèÚ ÍªeWszø…ŒŽ¯ä-c¡|ÿˆë®ù>»²{zø…ŒŽŸŒ­ Êvi²ÄJ~Oƒ1Ùg·e[Ä33“}v[–g:7ªÜ+žqéA¿À­Â¸O<ãÒ¬Î;«1îÏ(…_ÜF•‚oìw‹g#ßã‚oìw‹g8£÷ aŽºŽu¼¤‡`„x¦À¨üñÆŽ‘ë÷¸øKþ¶ô?û;òL=ªÊØ—¿0go¸vI».Û¥9û‡‹gÝgºÈ3ï3ÇÃ5Ï‹»ZÆI:Â¹Šæ–b—¹³žUʨ• ã$%dr$ž¥9Æ8KGË•a Úž:â¤È(}Î^À&ƒöï6ÒÒ±”KY‘¾€Ñ®q:ÿb§ 7t,çì}‚bÌD£ ¡É€Q:F÷­àIg¿.×Q9Œb<’c”ƒŒZ·uܚѤô+ŒR]¨#…HaÌĪ“ŽLòc 5F)…gÌ–õظ“T¨Â ˾pŒÁ3JÎh[ˆe¤§gÛÌØ¸‚‹óU4§Ø·Í—æm1`=…diÔpq}¤5òYF\pbutÛü†Œd½çÏ.ÐÑ­‘ãíªüˆæªŒƒã EFÝ`ôçÂwŸã»HGÅsU¾ÍDc sò gŒëLÌ䪴ݺÁ-õc sòLß~_ß]ç»gLê8ÊÈF'“Ü^r[q|\¡;fb£“ cïôø¹ùGæö´¦ó‘ }+5#ÆiùGìø5-5Óì~©¢•šãD¥£Ôx›»gòôT0Ø8YG¥9£QÐß3­ÃÒѤÉ:Òí é¸ÒQ{™ÍËãb»öŒªÌ(SÆ)y\Ƙîniíh¥fÈ8/ U—š~†úó¬ÔŒûžiy\oÉ«ŠMÎã:fœ•Ç-æÇtÜ.ûºø3ÎçZzå¼ûŒ-ë`üúúü7>Ãã¡~ÆÆ¯;eÜ×”Ô‡ËêŒÎÙþ#gŒs.UÆy:*á}3sOù,Ï c&¾ÎìÎ³šŽŠ•µqɇ¬2fò¸™kVct¾™rSé¸ £ )ÙÖÃhtüãä{6eôcÃýmÆèøÇém{ãñk-»ûž§s}<þhêèéŽtO·Çž)ÿÿ˜ÑYLT»ã€ŽÇ?ÏŒíúè"„}E¤bÆgÃø½]F•a,Öýêøu[ÇÎv­ü¾3ÄhÇQí¿Jhªcñf›ÈXÁ¨Zö>Sf Çø¸L,AÆh³Í5{ï3¾־͸»†o«t oqóò¸|\AkÚžj{Æþ currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer geomview-1.9.4/doc/figs/myfilelist.ps0000644000175000001440000023552007730233240014515 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: noname.ps %%Pages: 1 %%BoundingBox: 237 246 375 516 %%EndComments /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 286 string def %%EndProlog %%Page: 1 1 gsave 237.36 246.12 translate 137.28 269.76 scale 286 562 8 [ 286 0 0 -562 0 562 ] { picstr readstring } image 80008000e2000000e3d6019d5680d6a4d6019d56e2d6019d007f00d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69d5656d6d61dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69d56000300d69dd6e59d0256d6d6809da59d02 56d6d6e59d02569d000200d6d6e49d0156d6809da49d0156d6e39d015600 7f00d69dd69d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d567f9d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d561d9d569d569d569d569d569d 569d569d569d569d569d569d569dd69d569d007f00d6d69d9d9d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d7f56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d1d569d569d569d569d569d569d569d569d569d569d569d 569dd69d9d9d56000600d69dd69d569d80008000f00006d69dd69d569d00 0700d6d69d9d9d560080d680d6f2d60700d6d69d9d9d56007f00d69dd69d 569d00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd67f9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69d9dd6d61d9dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd600d69dd69d569d000800d6d69d9d9d5600d6ea9d0156d6809d bd9d0256d6d6ea9d0156d6ea9d085600d6d69d9d9d56000900d69dd69d56 9d00d6d6eb9d0256d6d6809dbf9d025656d6e99d0556d6d69d9d9df200fc 9d085600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f19df9 00069d00009d9d0000809dda9d0256d6d6eb9d025656d6fc9d0000f49d0d 009d9d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6 d6f29d010000fa9d0500009d9d0000809ddb9d025656d6e99d0656d6d69d 9d9d00f49d0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6 eb9d025656d6f19d010000f79d010000809dd99d0256d6d6eb9d025656d6 fc9d0000f49d0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00 d6d6eb9d0256d6d6f39d010000fa9d0800009d9d00009d9d9dfc00fc9dfc 00809de99d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d6 9dd69d569d000800d6d69d9d9d5600d6eb9d025656d6f29d010000fa9d15 00009d9d00009d9d00009d9d00009d9d00009d9d0000809de99d0256d6d6 eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00d6 9dd69d569d00d6d69d9df000fd9d0256d6d6f39dfa00139d9d00009d0000 9d9d00009d9d9d00009d9d0000809de69d025656d6f89dfc00f59d0656d6 d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000c00d6d69d9d9d56 00d69d9d9d00f29d05009d9d5656d6f39d010000fa9d0700009d9d00009d 9dfa00fc9dfd00809de79d0256d6d6f99d04009d9d0000f79d025656d6fc 9d0000f49d0d00009d9d565600d6d69d9d9d56000c00d69dd69d569d00d6 d69d9d00f29d0600009d9d56d6d6f49d010000fa9d0800009d9d00009d00 00f59d010000809de99d025656d6f89d04009d9d0000f69d0656d6d69d9d 9d00f49d0d00009d9d9d5600d69dd69d569d000b00d6d69d9d9d5600d69d 9d9def00039d5656d6f39d010000fa9d0800009d9d00009d0000fa9d0600 009d9d9d0000809de89d0256d6d6f99dfb00f79d025656d6fc9d0000f49d 0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6fc9df100 049d9d56d6d6f59d010000fa9d1500009d9d00009d9d00009d9d00009d9d 00009d9d0000809de89d025656d6f79dfc00f69d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656 d6f49d010000fa9d0800009d9d00009d9d9dfc00fc9dfc00809de69d0256 d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d560009 00d69dd69d569d00d6d6eb9d0256d6d6809dbf9d025656d6e99d0656d6d6 9d9d9d00f49d0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600 d6eb9d025656d6809dbd9d0256d6d6eb9d025656d6fc9d0000f49d0d0000 9d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d680 9dbf9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd6 9d569d000800d6d69d9d9d5600d6eb9d025656d6809dbd9d0256d6d6eb9d 025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d569d00 d6d6eb9d0256d6d6809dbf9d025656d6e99d0256d6d6fb9df300fd9d0856 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6809dbd9d0256 d6d6eb9d025656d6eb9d09565600d6d69d9d9d56007f00d69dd69d569d00 d69d9d569d569d569d569d569d569d569d569d569d569d56d6569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 7f9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d5656d69d569d569d569d569d569d569d569d569d 569d569d569d56d6561d9d569d569d569d569d569d569d569d569d569d56 9d5600d69dd69d569d0008009d569d9d9d56009de956009d8056bc56009d e856009de9560700d6d69d569d56000000fb56009d80008000f00001d69d fc56ff000000fcd6029d565680df80dff2df0000fad6ff000800d6d6d69d 569d56df80af80aff4af036400d69dfcd6ff000800d6d69d9d9d5656df80 af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4 af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400 d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d 569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d560008 00d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d 9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56 df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80 aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af08 6400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d6 9d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d 000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d6 9dd69d569d56dff3aff90004af00afaf0080af8daf086400d69dd69d569d 000800d6d69d9d9d5656dff3af0000f9af0600afaf00afaf0080af90af08 6400d6d69d9d9d56000800d69dd69d569d56dff3af0000f6af0300afaf00 80af90af086400d69dd69d569d000800d6d69d9d9d5656dff3af0000f9af 0a00afaf00af000000afafaffc00fdaf0300af000080af9faf086400d6d6 9d9d9d56000800d69dd69d569d56dff3af0000f9af1300afaf00afaf00af afaf0000afaf0000afaf000080af9daf086400d69dd69d569d000800d6d6 9d9d9d5656dff3affa000cafaf00afaf00afaf00afafaf00fcaf0300afaf 0080af9caf086400d6d69d9d9d56000800d69dd69d569d56dff3af0000f9 af0900afaf00afaf00afafaffa0002afaf0080af9caf086400d69dd69d56 9d000800d6d69d9d9d5656dff3af0000f9af0a00afaf00afaf00afafaf00 f9af000080af9caf086400d6d69d9d9d56000800d69dd69d569d56dff3af 0000f9af0a00afaf00afaf00afafaf00f9af000080af9caf086400d69dd6 9d569d000800d6d69d9d9d5656dff3af0000f9af1200afaf00afaf00afaf af0000afaf0000afaf0080af9caf086400d6d69d9d9d56000800d69dd69d 569d56dff3af0000f9af0a00afaf00afafaf0000afaffc00fdaf000080af 9caf086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af0864 00d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd6 9d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d5600 0800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d6 9d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d 56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af 80aff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af80648c64 f4af086400d69dd69d569d000800d6d69d9d9d5656dff4af80648d6400df f4af086400d6d69d9d9d56000800d69dd69d569d56dff4af01646480af90 af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af0164 6480af90af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56df f4af01646480af90af01dfdff4af086400d69dd69d569d000800d6d69d9d 9d5656dff4af01646480af90af01dfdff4af086400d6d69d9d9d56000800 d69dd69d569d56dff4af01646480af90af01dfdff4af086400d69dd69d56 9d000800d6d69d9d9d5656dff4af01646480af90af01dfdff4af086400d6 d69d9d9d56000800d69dd69d569d56dff4af01646480af90af01dfdff4af 086400d69dd69d569d000800d6d69d9d9d5656dff4af01646480af90af01 dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af016464fa af0000fcaf0000d8af0000eaaf0200af00faaf0000f4af0000d5af0000ea af0000f5af0000f9af0000faaf0000fcaffd00e9af0000fcaf0400afafaf 00f8af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af 016464faaf0000fcaf0000d8af0000eaaf0200af00faaf0000f4af0000d5 af0000eaaf0000f7affd00fbaffd00faaf0900afaf0000afafaf0000ebaf 0000fcaf0600af00af00af00faaf01dfdff4af086400d6d69d9d9d560008 00d69dd69d569d56dff4af016464faaf0400afafaf00d8af0000eaaf0300 afaf00eeaf0000beaf0000f4af0000f9af0000fbaf0400afafaf00fbaf00 00e7af0600afafaf000000f9af01dfdff4af086400d69dd69d569d000800 d6d69d9d9d5656dff4af016464faaf0b00afafaf00afaf00af000000fcaf fd0009af00afaf00af0000afaffc00fdaf0400af000000fcaf0f00afafaf 000000afafaf00af0000afaffc00fdaf1100afaf00af000000afaf00afaf 00af000000fcaf0b00afafaf000000af00afafaffc00fcaffc00fdaf0a00 af0000afaf0000afaf00fbaf0500af00afafaffc0016afaf00afafaf00af afaf00afafaf00af0000afafaf0000fcaf0000f9af0000fbaf0300afaf00 f9af0000faaffd00fcaffd000faf00afaf00afafaf00afaf00af00af00fa af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af0164 64fbaf7f0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000 afafaf0000afaf0000afaf0000afaf0000afafaf00afaf00afafaf00afaf 0000afafaf0000afaf0000afaf00afaf0000afaf0000af00afaf0000afaf 0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000 afaf0000afaf0000afaf00af0000fbaf1f00af00afaf0000afaf0000af00 afafaf00afafaf00afafaf00afaf00afafaf00fbaf0000f9af0000fbaf03 00afaf00f9af0000fbaf1300afafaf00afaf0000afaf0000afaf00afafaf 00fcaf0000f8af01dfdff4af086400d69dd69d569d000800d6d69d9d9d56 56dff4af016464faaf0700afaf00afafaf00fcaf0300afaf00fcaf0300af af00f7af0300afaf00fcaf0800afaf00afafaf0000fbaf0000fcaf0000fa af0400afafaf00fcaf0500af00afaf00fcaf0700afaf00afafaf00fcaf03 00afaf00fcaf0300afaf00fcaf1800afaf00afafaf00afafaf00afaf00af afaf00afaf00afaf00fcaf0d00af00afafaf00afafaf00afaf00fcaf0200 af00faaf0000f9af0000fcaf0400afafaf00f9af0000fbaf010000fbaf00 00fcaf0600afaf00afaf00f2af01dfdff4af086400d6d69d9d9d56000800 d69dd69d569d56dff4af016464faaf0700afaf00afafaf00fcaf0300afaf 00fcaf0300afaf00fbaffb0002afaf00fcaf0300afaf00fcaffd00fdaf00 00fcaf0000faaf0400afafaf00fcaf0500af00afaf00fcaf0700afaf00af afaf00fcaf0200afaffa0002afaf00fcaf1700afaf00afafaf00afafaf00 afaf00afafaf00afaf00afaffa000cafaf00afaf00afaf00afafaf00fbaf 0000f9af0000f9af0000fcaf0400afafaf00f9af0000faaffd00fdaf0000 fcaf0600afaf00afaf00f2af01dfdff4af086400d69dd69d569d000800d6 d69d9d9d5656dff4af016464faaf0700afaf00afafaf00fcaf0300afaf00 fcaf0300afaf00fcaf080000afafaf00afaf00fcaf0300afaf00faaf0400 00afaf00fcaf0000faaf0400afafaf00fcaf0500af00afaf00fcaf0700af af00afafaf00fcaf0300afaf00f9af0000fcaf1800afaf00afafaf00afaf af00afaf00afafaf00afaf00afaf00f9af0a00afaf00afaf00afafaf00fb af0000f9af0000f9af0000fcaf0400afafaf00f9af0000f8af040000afaf 00fcaf0600afaf00afaf00f2af01dfdff4af086400d6d69d9d9d56000800 d69dd69d569d56dff4af016464faaf0200af00fcaf0000fcaf0300afaf00 fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00f8af0300afaf 00fcaf0000fcaf010000fcaf0000fcaf0500af00afaf00fcaf0200af00fc af0000fcaf0300afaf00f9af0000fcaf1800afaf00afafaf00afafaf00af afaf00af00afafaf00afaf00f9af0900af00af00af00afaf00fbaf0200af 00faaf0000f9af0400afafaf00fbaf0000fbaf0000f6af0300afaf00fcaf 0500afaf00af00f1af01dfdff4af086400d69dd69d569d000800d6d69d9d 9d5656dff4af016464fbaf030000af00fcaf0000fcaf0b00afaf0000afaf 0000afaf00fcaf0f0000afaf0000afaf0000afaf0000af00fcaf0700afaf af00afaf00fcaf060000afaf000000fcaf0a0000afaf0000af00afaf00fc af0200af00fcaf3e0000afaf0000afaf0000afaf0000afaf0000afaf0000 afaf00afafaf00afafaf00afafaf00af00afafaf00afaf0000afaf0000af afaf00afafaf00afafaf00fcaf0400afafaf00fbaf0000f9af0400afafaf 00fbaf1e0000afafaf0000afafaf00afaf00afafaf00afaf0000afaf0000 afaf00af00f1af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d 56dff4af016464faaf0200af00fcaf0000fcaf0b00afafaf000000af00af af00fbaffd000baf0000af00af000000afaf00fbaffd00fdaf0000fbaffc 0001af00fcaf0a00af000000afaf00afaf00fcaf0200af00fbaffd0004af 00afafaffc00fcaffc00fdaf0800afafaf00afafaf00fcaf0000fcaf0300 afafaffc00fcaf1200afafaf00afafaf00afafaf0000afafaf0000fcaf00 00f9af0400afafaf00f9affd00fbaf0600afafaf000000fcaffd0006af00 afaf00af00f1af01dfdff4af086400d69dd69d569d000800d6d69d9d9d56 56dff4af016464e6af0000f1af0000c3af00008eaf0000ecaf01dfdff4af 086400d6d69d9d9d56000800d69dd69d569d56dff4af016464ebaf050000 afaf0000f1af0000c8af050000afaf000093af050000afaf0000ecaf01df dff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464eaaf fc00f0af0000c7affc0091affc00ebaf01dfdff4af086400d6d69d9d9d56 000800d69dd69d569d56dff4af01646480af90af01dfdff4af086400d69d d69d569d000800d6d69d9d9d5656dff4af01646480af90af01dfdff4af08 6400d6d69d9d9d56000800d69dd69d569d56dff4af01646480af90af01df dff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af01646480af 90af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af01 646480af90af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656 dff4af01646480df8edff4af086400d6d69d9d9d56000800d69dd69d569d 56dff4af006480df8ddff4af086400d69dd69d569d000800d6d69d9d9d56 56df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af 80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af 086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d6 9dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d 56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800 d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d 569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df 80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80af f4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af0864 00d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd6 9d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d5600 0800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d6 9d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d 56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656dff3af fb00fbaf0000d9af0000b7aff90004af00afaf0089af086400d6d69d9d9d 56000800d69dd69d569d56dff3af0000fcaf050000afafaf00eaaf0000f0 af0000b7af0000f9af0300afaf0089af086400d69dd69d569d000800d6d6 9d9d9d5656dff3af0000fbaf0000e6af0000a6af0000f6af000089af0864 00d6d69d9d9d56000800d69dd69d569d56dff3af0000faaf0b00afaf00af af00af0000afaffc00fcaffc0006af000000afafaffc00fdaf0800af0000 af00afafaffc00fcaffd00c5af0000f9af0600afaf00afafaffc00fcaffd 0097af086400d69dd69d569d000800d6d69d9d9d5656dff3af0000faaf3a 00afaf00afaf0000afafaf0000afaf0000afaf0000afaf0000af00afafaf 0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf00afafaf00c6 af0000f9af1200afaf00afaf0000afaf0000afaf00afafaf0098af086400 d6d69d9d9d56000800d69dd69d569d56dff3af0000faaf0600afaf00afaf 00fcaf0000fcaf0300afaf00faaf0400afafaf00fcaf0300afaf00fcaf03 00afaf00fcaf0400afaf0000c3affa0008afaf00afaf00afaf00fcaf0400 afaf000095af086400d69dd69d569d000800d6d69d9d9d5656dff3af0000 faaf0600afaf00afaf00fcaffa0002afaf00faaf0400afafaf00fcaf0300 afaf00fcaf0200afaffa00fdaffd00c5af0000f9af0500afaf00afaffa00 fdaffd0097af086400d6d69d9d9d56000800d69dd69d569d56dff3af0000 faaf0600afaf00afaf00fcaf0000f9af0000faaf0400afafaf00fcaf0300 afaf00fcaf0300afaf00f6af010000c6af0000f9af0600afaf00afaf00f6 af01000098af086400d69dd69d569d000800d6d69d9d9d5656dff3af0000 fbaf0700afafaf00afaf00fcaf0000f9af0000fcaf0600af00afafaf00fc af0300afaf00fcaf0300afaf00f5af0000c6af0000f9af0600afaf00afaf 00f5af000098af086400d6d69d9d9d56000800d69dd69d569d56dff3af00 00fcaf080000afafaf00afaf00fcaf1b0000afaf0000afaf0000afaf0000 af00afafaf0000afaf0000afaf00fcaf0f00afaf0000afaf0000afaf00af afaf00c6af0000f9af1200afaf00afaf0000afaf0000afaf00afafaf0098 af086400d69dd69d569d000800d6d69d9d9d5656dff3affb00fbaf0300af af00fbaffc00fcaffc00fdaf030000afaffc00fdaf0000fcaf0300afafaf fc00fcaffd00c5af0000f9af0600afaf00afafaffc00fcaffd0097af0864 00d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd6 9d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d5600 0800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d6 9d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d 56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656dff6af a164fcaff164f6af9864fcaff164f5af086400d6d69d9d9d56000800d69d d69d569d56dff6afa26400dffcaff26400dff6af996400dffcaff26400df f5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01 dfdffcaf016464fb9500dffb9501dfdff6af0164649caf01dfdffcaf0164 64fb9500dffb9501dfdff5af086400d6d69d9d9d56000800d69dd69d569d 56dff6af016464a5af01dfdffcaf016464fc9502dfdf64fc9501dfdff6af 0164649caf01dfdffcaf016464fc9502dfdf64fc9501dfdff5af086400d6 9dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf0164 64fc9502dfdf64fc9501dfdff6af0164649caf01dfdffcaf016464fc9502 dfdf64fc9501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56df f6af046464afafafab00fdaf01dfdffcaf0e6464959595dfdfaf64649595 95dfdff6af0164649caf01dfdffcaf0e6464959595dfdfaf6464959595df dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af046464afaf afab00fdaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af0164 649caf01dfdffcaf0e6464959595dfdfaf6464959595dfdff5af086400d6 d69d9d9d56000800d69dd69d569d56dff6af046464afafaff10000aff500 00aff90000affa0000affc00fdafe90000affc0000affa00fdaf01dfdffc af0e64649595dfdfafafaf64649595dfdff6af016464fcaff90006afaf00 afafaf00faaff900fcaffd00c2af01dfdffcaf0e64649595dfdfafafaf64 649595dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af04 6464afafaff10000aff700fdaffb00fdaffa0009af0000afaf000000afaf eb0000affc0000affa00fdaf01dfdffcaf0e64649595dfdfafafaf646495 95dfdff6af016464fcaf0000f8af0400afafaf00faaf0000f8af060000af afaf0000c4af01dfdffcaf0e64649595dfdfafafaf64649595dfdff5af08 6400d6d69d9d9d56000800d69dd69d569d56dff6af046464afafaff20000 aff40000aff90000affb0004af000000affb0000afe70000aff900fdaf01 dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf0000f8af04 00afafaf00faaf0000f8af0000fbaf0000c4af01dfdffcaf04646495dfdf fbaf04646495dfdff5af086400d69dd69d569d000800d6d69d9d9d5656df f6af1b6464afafaf0000af000000af000000af000000af00afaf000000af affc0000aff90000affb0003af0000aff90000affa00fdaffc00fdaf0800 af0000af000000aff900fdaf01dfdffcaf04646495dfdffbaf04646495df dff6af016464fcaf0000f8af0400afafaf00faaf0000f8af0000beaf01df dffcaf04646495dfdffbaf04646495dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464fcaf1400af000000af000000af000000 af0000af000000affb0000aff90000affb0003af0000aff90000affb0013 af000000af0000afaf0000afaf0000af000000aff900fdaf01dfdffcaf03 6464dfdff76401dfdff6af016464fcaf0000f8af0400afafaf00faaf0000 f7af010000c0af01dfdffcaf036464dfdff76401dfdff5af086400d69dd6 9d569d000800d6d69d9d9d5656dff6af016464fcaf0c00af000000af0000 00af0000affc0002af00affa0000aff90000affc0004af000000aff90000 affb0001afaffb0000affc0006af0000af0000aff800fdaf01dfdffcaf02 6464dff66401dfdff6af016464fcaffa00fdaf0400afafaf00faaffa00fa af010000c2af01dfdffcaf026464dff66401dfdff5af086400d6d69d9d9d 56000800d69dd69d569d56dff6af016464fcaf0c0000af0000af0000af00 0000affb0000aff90000aff90000affc0004af000000aff90000affa00fd affd0000affc0006af0000af0000aff800fdaf01dfdffcaf016464f59501 dfdff6af016464fcaf0000f8af0400afafaf00faaf0000f3af010000c4af 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af126464afafaf000000af0000af0000af000000affb0000 aff90000aff90000affc0004af000000aff90000aff80004afaf0000affc 0006af0000af0000aff800fdaf01dfdffcaf016464f3dff6af016464fcaf 0000f8af0400afafaf00faaf0000f2af0000c4af01dfdffcaf016464f3df f5af086400d6d69d9d9d56000800d69dd69d569d56dff6af116464afafaf 000000af00af00af00af0000affb0002af00affa0000aff90004af000000 affb0000affb0000aff60003af0000affc0005af0000af00aff700fdaf01 dfdffcaf016464f6df0264dfdff6af016464fcaf0000f8af0400afafaf00 faaf0000f8af0000fbaf0000c4af01dfdffcaf016464f6df0264dfdff5af 086400d69dd69d569d000800d6d69d9d9d5656dff6af016464fcaffd0008 af000000af000000affc0004af000000affb0000aff90004af000000affb 001eafaf000000afaf000000af0000af000000af0000afaf0000afaf0000 af00affc0000affc00fdaf01dfdffcaf036464dfdff9af036464dfdff6af 016464fcaf0000f8af0400afafaf00faaf0000f8af060000afafaf0000c4 af01dfdffcaf036464dfdff9af036464dfdff5af086400d6d69d9d9d5600 0800d69dd69d569d56dff6af046464afafaffc0012af000000af000000af 000000afaf000000afaffc0000aff90004af000000aff900fdaffb0006af 000000afafaffc00fdaf0600af0000af00affc0000affc00fdaf01dfdffc af036464dfdff9af036464dfdff6af016464fcaf0000f8af0300afafaffa 0000aff900fcaffd00c2af01dfdffcaf036464dfdff9af036464dfdff5af 086400d69dd69d569d000800d6d69d9d9d5656dff6af046464afafafba00 00aff200fdaf01dfdffcaf036464dfdff9af036464dfdff6af0164649caf 01dfdffcaf036464dfdff9af036464dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af046464afafafbf0005afaf0000afaff200fdaf 01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf03 6464dfdff9af036464dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af046464afafafbe00fcaff100fdaf01dfdffcaf036464dfdff9 af036464dfdff6af0164649caf01dfdffcaf036464dfdff9af036464dfdf f5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01 dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf0364 64dfdff9af036464dfdff5af086400d69dd69d569d000800d6d69d9d9d56 56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164 649caf01dfdffcaf036464dfdff9af036464dfdff5af086400d6d69d9d9d 56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9 af036464dfdff6af0164649caf01dfdffcaf036464dfdff9af036464dfdf f5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01 dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf0364 64dfdff9af036464dfdff5af086400d6d69d9d9d56000800d69dd69d569d 56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164 649caf01dfdffcaf036464dfdff9af036464dfdff5af086400d69dd69d56 9d000800d6d69d9d9d5656dff6af016464eeaf0000f5af0000f9af0000fa af0000fcaffd00e9af0000fcaf0000f7af01dfdffcaf036464dfdff9af03 6464dfdff6af056464afafaf00f7af0000f6af0000f1af060000af00afaf 00cbaf01dfdffcaf036464dfdff9af036464dfdff5af086400d6d69d9d9d 56000800d69dd69d569d56dff6af016464eeaf0000f7affd00fbaffd00fa af0900afaf0000afafaf0000ebaf0000fcaf0000f7af01dfdffcaf036464 dfdff9af036464dfdff6af066464afafaf0000f9af010000f6af0000f2af 0700afafaf00afaf00cbaf01dfdffcaf036464dfdff76401dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464efaf0000f4af00 00f9af0000fbaf0400afafaf00fbaf0000e7af0000f6af01dfdffcaf0364 64dfdff9af036464dfdff6af066464afafaf0000f9af010000f6af0000f2 af0000faaf0000cbaf01dfdffcaf026464dff66401dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464fbaf1400afafaf00afaf af00afafaf00af0000afafaf0000fcaf0000f9af0000fbaf0300afaf00f9 af0000faaffd00fcaffd0008af00afaf00afafaf00f6af01dfdffcaf0364 64dfdff9af036464dfdff6af076464afafaf00af00fbaf0500af00afafaf fc00fdaf0700afafaf00afafaffc000dafaf000000afaf00afaf00afafaf fc00d2af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af1a6464afafaf00af00afafaf00afafaf00afaf af00afaf00afafaf00fbaf0000f9af0000fbaf0300afaf00f9af0000fbaf 1300afafaf00afaf0000afaf0000afaf00afafaf00f6af01dfdffcaf0364 64dfdff9af036464dfdff6af076464afafaf00af00fbaf2b00af00afaf00 00afaf0000afaf00afaf00afafaf0000afaf0000afaf00afafaf00afaf00 afaf0000afaf0000d3af01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af126464afafaf00af00afafaf00 afafaf00afaf00fcaf0200af00faaf0000f9af0000fcaf0400afafaf00f9 af0000fbaf010000fbaf0000fcaf0600afaf00afaf00f5af01dfdffcaf03 6464dfdff9af036464dfdff6af0f6464afafaf00afaf00afafaf00afaf00 f9af0500afaf00af00fcaf0000fcaf0d00afaf00afafaf00afaf00afaf00 fcaf0000d3af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d 000800d6d69d9d9d5656dff6af126464afafaf00afaf00afaf00afaf00af afaf00fbaf0000f9af0000f9af0000fcaf0400afafaf00f9af0000faaffd 00fdaf0000fcaf0600afaf00afaf00f5af01dfdffcaf036464dfdff9af03 6464dfdff6af126464afafaf00afaf00afafaf00afaf00afafaffb0003af af0000fbaffa000bafaf00afafaf00afaf00afaffa00d3af01dfdffcaf01 6464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6 af016464faaf0a00afaf00afaf00afafaf00fbaf0000f9af0000f9af0000 fcaf0400afafaf00f9af0000f8af040000afaf00fcaf0600afaf00afaf00 f5af01dfdffcaf036464dfdff9af036464dfdff6af1c6464afafaf00afaf af00af00afafaf00afaf0000afafaf00afaf00af00fcaf0000f9af0a00af afaf00afaf00afaf00ceaf01dfdffcaf016464f59501dfdff5af086400d6 9dd69d569d000800d6d69d9d9d5656dff6af016464faaf0900af00af00af 00afaf00fbaf0200af00faaf0000f9af0400afafaf00fbaf0000fbaf0000 f6af0300afaf00fcaf0500afaf00af00f4af01dfdffcaf036464dfdff9af 036464dfdff6af126464afafaf00afafaf00af00afafaf00afaf00fcaf0a 00afaf00afaf00afafaf00f9af0a00afafaf00afaf00afaf00ceaf01dfdf fcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d 56dff6af116464afafaf00afafaf00afafaf00afafaf00fcaf0400afafaf 00fbaf0000f9af0400afafaf00fbaf1e0000afafaf0000afafaf00afaf00 afafaf00afaf0000afaf0000afaf00af00fcaf0300afaf00fcaf01dfdffc af036464dfdff9af036464dfdff6af056464afafaf00fcaf0000fcaf2900 afaf0000afaf0000afaf00afafaf00afaf0000afaf0000afaf00afafaf00 afaf00afaf0000afaf0000d3af01dfdffcaf016464f59501dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464f9af1200afafaf 00afafaf00afafaf0000afafaf0000fcaf0000f9af0400afafaf00f9affd 00fbaf0600afafaf000000fcaffd0006af00afaf00af00fcaf0300afaf00 fcaf01dfdffcaf036464dfdff9af036464dfdff6af056464afafaf00fcaf 0000fcaf0b00afafaf000000af0000af00fcaf0200afaffc00fdaf0a00af afaf00afaf00afafaffc00d2af01dfdffcaf016464f59501dfdff5af0864 00d6d69d9d9d56000800d69dd69d569d56dff6af016464b7af0000efaf01 dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf0164 64f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af 016464bcaf050000afaf0000efaf01dfdffcaf036464dfdff9af036464df dff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d 9d56000800d69dd69d569d56dff6af016464bbaffc00eeaf01dfdffcaf03 6464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501df dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af 01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf01 6464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6 af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6 af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56 000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af 036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400 d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf03 6464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501df dff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af 01dfdffcaf036464dfdff9af036464dfdff6af056464afafaf00f7af0300 afaf00f5af0000b9af01dfdffcaf016464f59501dfdff5af086400d69dd6 9d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464df dff9af036464dfdff6af066464afafaf0000f9af040000afaf00f5af0000 b9af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d6 9dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464df dff6af066464afafaf0000f9af040000afaf00f5af0000b9af01dfdffcaf 016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656df f6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af076464af afaf00af00fbaf1400af00afaf00afafaf00afafaf000000af00afafaffc 00fdaf0400af000000c8af01dfdffcaf016464f59501dfdff5af086400d6 d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf0364 64dfdff9af036464dfdff6af076464afafaf00af00fbaf2100af00afaf00 afaf00afafaf0000afaf0000afaf0000afaf0000afaf0000afaf0000c9af 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6 af146464afafaf00afaf00afafaf00afaf00afaf00af00fcaf0000fcaf03 00afaf00fcaf0300afaf00fcaf0000c9af01dfdffcaf016464f59501dfdf f5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01 dfdffcaf036464dfdff9af036464dfdff6af136464afafaf00afaf00afaf af00afaf00afaf0000fbaf0000fcaf0200afaffa0002afaf00fcaf0000c9 af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d6 9d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af146464afafaf00afafaf00af00afafaf00afaf00af00fcaf0000fcaf 0300afaf00f9af0000fcaf0000c9af01dfdffcaf016464f59501dfdff5af 086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdf fcaf036464dfdff9af036464dfdff6af196464afafaf00afafaf00af00af afaf00afaf00afaf00afafaf00fcaf0300afaf00f9af0000fcaf0000c9af 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6 af056464afafaf00fcaf0000fcaf1f00afaf00afafaf00afaf0000afaf00 00afaf0000afaf0000afaf0000afaf0000c9af01dfdffcaf016464f59501 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af056464afafaf00fcaf00 00fcaf0300afaf00fcaf0a00afaf000000af00afafaffc00fdaf0400af00 0000c8af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af016464d9af0000c4af01dfdffcaf016464f59501dfdff5af08 6400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffc af036464dfdff9af036464dfdff6af016464d9af0000c4af01dfdffcaf01 6464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6 af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464d9af 0000c4af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69d d69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af016464fcaf0000f3af0300afaf00f9af0300afaf00f5af0100 00caaf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800 d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf0000f3af0300afaf00f9af0300afaf00f6af0000c8 af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d6 9d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af016464fcaf0000f0af0000f9af0000f3af0000c8af01dfdffcaf0164 64f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af 016464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf07 00af000000afaf00fcaf1f00af00afaf00afafaf000000af00afaf00afaf 00af000000afaf000000afafaffc00f9affc00dbaf01dfdffcaf016464f5 9501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af0164 64a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf070000 afaf0000af00fcaf2400af00afaf00afaf0000afaf0000afaf00afaf0000 afaf0000afaf00afafaf0000afaf0000fbaf050000afaf0000dcaf01dfdf fcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d 56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf0000fcaf0200af00fcaf0800af00afaf00afaf00fcaf0600afaf00 afaf00fcaf0700afaf00afafaf00fcaf0000fbaf0000d7af01dfdffcaf01 6464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6 af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf 0000fcaf0200af00fcaf0800af00afaf00afaf00fcaf0600afaf00afaf00 fcaf0700afaf00afafaf00fcaf0000fbaf0000d7af01dfdffcaf016464f5 9501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af0164 64a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fc af0200af00fcaf0800af00afaf00afaf00fcaf0600afaf00afaf00fcaf07 00afaf00afafaf00fcaf0000fbaf0000d7af01dfdffcaf016464f59501df dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af 01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fcaf0200 af00fcaf0800af00afaf00afaf00fcaf0600afaf00afaf00fcaf0700afaf 00afafaf00fcaf0000fbaf0000fcaf0000dcaf01dfdffcaf016464f59501 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf1f0000afaf 0000af0000afaf0000af00afaf00afaf0000afaf0000afaf00afaf00fcaf 1700afaf00afafaf0000afaf0000afaf00afaf0000afaf0000dcaf01dfdf fcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d56 56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf1f00af000000afafaf000000af00af00afaf00afafaf000000af00 afaf00afaf00fcaf0300afaf00fcaffc00fdaf0300afafaffc00dbaf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69d d69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af016464fcaf0000f3af0300afaf 00f9af0300afaf00f5af010000caaf01dfdffcaf016464f59501dfdff5af 086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdf fcaf036464dfdff9af036464dfdff6af016464fcaf0000f3af0300afaf00 f9af0300afaf00f6af0000c8af01dfdffcaf016464f59501dfdff5af0864 00d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf0000f0af0000f9af0000f3 af0000c8af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d00 0800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0700af000000afaf00fcaf1f00af00afaf00af afaf000000af00afaf00afaf00af000000afaf000000afafaffc00f9affc 00dbaf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800 d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf070000afaf0000af00fcaf2400af00afaf00afaf00 00afaf0000afaf00afaf0000afaf0000afaf00afafaf0000afaf0000fbaf 050000afaf0000dcaf01dfdffcaf016464f59501dfdff5af086400d69dd6 9d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464df dff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf0800af00af af00afaf00fcaf0600afaf00afaf00fcaf0700afaf00afafaf00fcaf0000 fbaf0000fcaf0000dcaf01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf0800af00 afaf00afaf00fcaf0600afaf00afaf00fcaf0700afaf00afafaf00fcaf00 00fbaf0000fcaf0000dcaf01dfdffcaf016464f59501dfdff5af086400d6 9dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf0364 64dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf0800af 00afaf00afaf00fcaf0600afaf00afaf00fcaf0700afaf00afafaf00fcaf 0000fbaf0000fcaf0000dcaf01dfdffcaf016464f59501dfdff5af086400 d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf03 6464dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf0800 af00afaf00afaf00fcaf0600afaf00afaf00fcaf0700afaf00afafaf00fc af0000fbaf0000fcaf0000dcaf01dfdffcaf016464f59501dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf1f0000afaf0000af0000af af0000af00afaf00afaf0000afaf0000afaf00afaf00fcaf1700afaf00af afaf0000afaf0000afaf00afaf0000afaf0000dcaf01dfdffcaf016464f5 9501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af0164 64a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf1f00af 000000afafaf000000af00af00afaf00afafaf000000af00afaf00afaf00 fcaf0300afaf00fcaffc00fdaf0300afafaffc00dbaf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69d d69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fbaffc00fdaffc00fdaf1200af0000afaf0000afafaf00af0000afaf 0000f9affc00cdaf01dfdffcaf016464f59501dfdff5af086400d69dd69d 569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaf220000afaf0000af0000afaf0000afaf 0000afaf0000afaf00afaf0000afaf0000afaf00fbaf050000afaf0000ce af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69d d69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af016464fcaf0000faaf0000fcaf1600afaf00afafaf00afafaf00afaf 00afafaf00afafaf00fbaf0000c9af01dfdffcaf016464f59501dfdff5af 086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdf fcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0000fcaf16 00afaf00afafaf00afafaf00afaf00afafaf00afafaf00fbaf0000c9af01 dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d 569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af 016464fcaf0000faaf0000fcaf1600afaf00afafaf00afafaf00afaf00af afaf00afafaf00fbaf0000c9af01dfdffcaf016464f59501dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00fcaf16 00afaf00afafaf00afafaf00afaf00afafaf00afafaf00fbaf0000fcaf00 00ceaf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800 d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf2d0000afaf0000af0000afaf0000afaf00afafaf00 afafaf00afaf00afafaf00afafaf00afaf00afaf0000afaf0000ceaf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fbaffc00fdaffc00fdaf1900afafaf00afafaf00afaf00afafaf00af afaf00afaf00afafaffc00cdaf01dfdffcaf016464f59501dfdff5af0864 00d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501 dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf 016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56df f6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649c af01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d6 9d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af0164649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d 56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9 af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af0864 00d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf 016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656df f6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649c af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69d d69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d56 9d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9 af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af0864 00d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf 036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501 dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5 af01dfdffcaf036464dfdff9af036464dfdff6af016464fbaffc00fdaffc 00fdaf1200af0000afaf0000afafaf00af0000afaf0000f9affc00cdaf01 dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d 569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af 016464fcaf220000afaf0000af0000afaf0000afaf0000afaf0000afaf00 afaf0000afaf0000afaf00fbaf050000afaf0000ceaf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000 faaf0000fcaf1600afaf00afafaf00afafaf00afaf00afafaf00afafaf00 fbaf0000fcaf0000ceaf01dfdffcaf016464f59501dfdff5af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af016464fcaf0000faaf0000fcaf1600afaf00af afaf00afafaf00afaf00afafaf00afafaf00fbaf0000fcaf0000ceaf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fcaf0000faaf0000fcaf1600afaf00afafaf00afafaf00afaf00afaf af00afafaf00fbaf0000fcaf0000ceaf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af016464fcaf0000fcaf0200af00 fcaf1600afaf00afafaf00afafaf00afaf00afafaf00afafaf00fbaf0000 fcaf0000ceaf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d 000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af 036464dfdff6af016464fcaf2d0000afaf0000af0000afaf0000afaf00af afaf00afafaf00afaf00afafaf00afafaf00afaf00afaf0000afaf0000ce af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69d d69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdf f6af016464fbaffc00fdaffc00fdaf1900afafaf00afafaf00afaf00afaf af00afafaf00afaf00afafaffc00cdaf01dfdffcaf016464f59501dfdff5 af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d 5656dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af0164649caf01dfdffcaf016464f59501dfdff5af086400d69d d69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464 dfdff9af036464dfdff6af0164649caf01dfdffcaf016464f59501dfdff5 af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01df dffcaf036464dfdff9af036464dfdff6af0164649caf01dfdffcaf016464 f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af01 6464a5af01dfdffcaf036464dfdff9af036464dfdff6af0164649caf01df dffcaf016464f59501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af01 64649caf01dfdffcaf016464f59501dfdff5af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464a5af01dfdffcaf036464dfdff9af0364 64dfdff6af016464f7af0000a6af01dfdffcaf016464f59501dfdff5af08 6400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5af01dfdffc af036464dfdff9af036464dfdff6af016464f7af0000a6af01dfdffcaf01 6464f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6 af016464a5af01dfdffcaf036464dfdff9af036464dfdff6af016464f7af 0000a6af01dfdffcaf016464f59501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf036464dfdff76401df dff6af016464fbaffd0009af00afaf00af0000afaffc000dafaf00afafaf 00afafaf00afafaffc00fdaf0300af0000fbaffc00d4af01dfdffcaf0164 64f59501dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af 016464a5af01dfdffcaf026464dff66401dfdff6af016464fcaf280000af af0000afaf0000afafaf0000afaf0000af00afafaf00afafaf00afaf0000 afaf0000afaf0000faaf050000afaf0000d5af01dfdffcaf016464f59501 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf016464f59501dfdff6af016464fcaf0000fcaf0300afaf00 f7af0d00af00afafaf00afafaf00afaf00fcaf0300afaf00f9af0000d0af 01dfdffcaf016464f59501dfdff5af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464a5af01dfdffcaf016464f3dff6af016464fcaf00 00fcaf0300afaf00fbaffb000bafaf00afaf00afaf00afafaffa0002afaf 00f9af0000d0af01dfdffcaf016464f3dff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf016464f7df036464df dff6af016464fcaf0000fcaf0300afaf00fcaf120000afafaf00afaf00af af00afaf00afafaf00f9af0000f9af0000d0af01dfdffcaf016464f7df03 6464dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af0164 64a5af01dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf00 00fcaf0300afaf00fcaf0000fcaf0d00afaf00af00af00af00afafaf00f9 af0000f9af0000fcaf0000d5af01dfdffcaf04646495dfdffbaf04646495 dfdff5af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464a5 af01dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf080000 afaf0000afaf00fcaf0d0000afaf0000afafaf00afafaf00fcaf080000af af0000afaf00fcaf0800afaf0000afaf0000d5af01dfdffcaf04646495df dffbaf04646495dfdff5af086400d69dd69d569d000800d6d69d9d9d5656 dff6af016464a5af01dfdffcaf0e64649595dfdfafafaf64649595dfdff6 af016464fbaffd0004af00afaf00fbaffd0009af0000afaf00afafaf00fb affc00fdaf0000fcaf0300afafaffc00d4af01dfdffcaf0e64649595dfdf afafaf64649595dfdff5af086400d6d69d9d9d56000800d69dd69d569d56 dff6af016464a5af01dfdffcaf0e64649595dfdfafafaf64649595dfdff6 af0164649caf01dfdffcaf0e64649595dfdfafafaf64649595dfdff5af08 6400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af01dfdffc af0e6464959595dfdfaf6464959595dfdff6af0164649caf01dfdffcaf0e 6464959595dfdfaf6464959595dfdff5af086400d6d69d9d9d56000800d6 9dd69d569d56dff6af016464a5af01dfdffcaf0e6464959595dfdfaf6464 959595dfdff6af0164649caf01dfdffcaf0e6464959595dfdfaf64649595 95dfdff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464 a5af01dfdffcaf016464fc9502df6464fc9501dfdff6af0164649caf01df dffcaf016464fc9502df6464fc9501dfdff5af086400d6d69d9d9d560008 00d69dd69d569d56dff6af016464a5af01dfdffcaf016464fc9502df6464 fc9501dfdff6af0164649caf01dfdffcaf016464fc9502df6464fc9501df dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af016464a5af 01dfdffcaf016464fb950064fb9501dfdff6af0164649caf01dfdffcaf01 6464fb950064fb9501dfdff5af086400d6d69d9d9d56000800d69dd69d56 9d56dff6af016464a3dffcaf016464f3dff6af0164649adffcaf016464f3 dff5af086400d69dd69d569d000800d6d69d9d9d5656dff6af0064a2dffc af0064f2dff6af006499dffcaf0064f2dff5af086400d6d69d9d9d560008 00d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d 9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56 df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80 aff4af086400d6d69d9d9d56000800d69dd69d569d56dff6afa164e3af98 64e2af086400d69dd69d569d000800d6d69d9d9d5656dff6afa26400dfe3 af996400dfe2af086400d6d69d9d9d56000800d69dd69d569d56dff6af01 6464f79501dfdfd495e8df0295dfdff79501dfdfe3af016464f79501dfdf c995eadf0295dfdff79501dfdfe2af086400d69dd69d569d000800d6d69d 9d9d5656dff6af016464f995fddf0064d495e9df016495fcdff99501dfdf e3af016464f995fddf0064c995ebdf016495fcdff99501dfdfe2af086400 d6d69d9d9d56000800d69dd69d569d56dff6af016464fb95fcdf016464d4 9501dfdfecaf02646495fadffb9501dfdfe3af016464fb95fcdf016464c9 9501dfdfeeaf02646495fadffb9501dfdfe2af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af046464959595fcdf03afaf6464d49501dfdfec af06646495dfdfafaffcdffd9501dfdfe3af046464959595fcdf03afaf64 64c99501dfdfeeaf06646495dfdfafaffcdffd9501dfdfe2af086400d6d6 9d9d9d56000800d69dd69d569d56dff6af02646495fcdffcaf016464d495 01dfdfecaf04646495dfdffcaffcdf0295dfdfe3af02646495fcdffcaf01 6464c99501dfdfeeaf04646495dfdffcaffcdf0295dfdfe2af086400d69d d69d569d000800d6d69d9d9d5656dff6af046464dfdfdffaaf016464d495 01dfdfecaf04646495dfdffaaffd6401dfdfe3af046464dfdfdffaaf0164 64c99501dfdfeeaf04646495dfdffaaffd6401dfdfe2af086400d6d69d9d 9d56000800d69dd69d569d56dff6af02646495fc64fcaf016464d49501df dfecaf04646495dfdffcaffc640295dfdfe3af02646495fc64fcaf016464 c99501dfdfeeaf04646495dfdffcaffc640295dfdfe2af086400d69dd69d 569d000800d6d69d9d9d5656dff6af046464959595fc6403afaf6464d495 01dfdfecaf06646495dfdfafaffc64fd9501dfdfe3af046464959595fc64 03afaf6464c99501dfdfeeaf06646495dfdfafaffc64fd9501dfdfe2af08 6400d6d69d9d9d56000800d69dd69d569d56dff6af016464fb95fa64d495 01dfdfecaf04646495dfdffc64fb9501dfdfe3af016464fb95fa64c99501 dfdfeeaf04646495dfdffc64fb9501dfdfe2af086400d69dd69d569d0008 00d6d69d9d9d5656dff6af016464f995fc64d49501dfdfea640495df6464 64f99501dfdfe3af016464f995fc64c99501dfdfec640495df646464f995 01dfdfe2af086400d6d69d9d9d56000800d69dd69d569d56dff6af016464 f795016464d49500dfe9640295df64f79501dfdfe3af016464f795016464 c99500dfeb640295df64f79501dfdfe2af086400d69dd69d569d000800d6 d69d9d9d5656dff6af016464a3dfe3af0164649adfe2af086400d6d69d9d 9d56000800d69dd69d569d56dff6af0064a2dfe3af006499dfe2af086400 d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d 9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d0008 00d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd6 9d569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656 df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80 aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af08 6400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69d d69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56 000800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6 d69d9d9d5656dff6af80df88dff6af086400d6d69d9d9d56000800d69dd6 9d569d56dff6af80df89df0064f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6af80df8adf016464f6af086400d6d69d9d9d56000800d69d d69d569d56dff6affddf80af8eaffd64f6af086400d69dd69d569d000800 d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6d69d9d9d5600 0800d69dd69d569d56dff6affddf80af8eaffd64f6af086400d69dd69d56 9d000800d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6d69d 9d9d56000800d69dd69d569d56dff6affddf80af8eaffd64f6af086400d6 9dd69d569d000800d6d69d9d9d5656dff6affddfe1affa00f1af0000f4af 0000faaf000080afd7affd64f6af086400d6d69d9d9d56000800d69dd69d 569d56dff6affddfe1af0000fcaf010000f6af0400afafaf00f4af0000fa af0000f7af000080afe1affd64f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6affddfe1af0000fbaf0000f6af0400afafaf00f4af0000f0 af000080afe1affd64f6af086400d6d69d9d9d56000800d69dd69d569d56 dff6affddfe1af0000fbaf0300afafaffc000bafaf000000afaf00af0000 00f8af0000faaf0b00afafaf000000afaf00000080afe2affd64f6af0864 00d69dd69d569d000800d6d69d9d9d5656dff6affddfe1af0000fcaf1500 00afaf0000afaf0000afaf00afafaf0000afaf0000f9af0000faaf0a00af af00afafaf00afaf0080afe1affd64f6af086400d6d69d9d9d56000800d6 9dd69d569d56dff6affddfe1affa00f8af0700afaf00afafaf00fcaf0000 f9af0000faaf0400afaf0000fbaf000080afe1affd64f6af086400d69dd6 9d569d000800d6d69d9d9d5656dff6affddfe1af0000f7affb0006afaf00 afafaf00fcaf0000f9af0000faaf0a00afafaf000000afafaf0080afe1af fd64f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddfe1af 0000f8af0c0000afafaf00afaf00afafaf00fcaf0000f9af0000faaf0000 fbaf040000afaf0080afe1affd64f6af086400d69dd69d569d000800d6d6 9d9d9d5656dff6affddfe1af0000f8af0000fcaf0700afaf00afafaf00fc af0000f9af0000faaf0000faaf0300afaf0080afe1affd64f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6affddfe1af0000f8af0c0000af af0000afaf00afafaf00fcaf0000f9af0000faaf0a00afaf00afafaf00af af0080afe1affd64f6af086400d69dd69d569d000800d6d69d9d9d5656df f6affddfe1af0000f7affd0008af0000afaf0000af00fcaf0000f9affa00 07af00afafaf000000fcaf01000080afe3affd64f6af086400d6d69d9d9d 56000800d69dd69d569d56dff6affddf80af8eaffd64f6af086400d69dd6 9d569d000800d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6affddf80af8eaffd64f6af0864 00d69dd69d569d000800d6d69d9d9d5656dff6affddf80af8eaffd64f6af 086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf80649464 05dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6 affddffdaf006480df96df0664dfafaf646464f6af086400d6d69d9d9d56 000800d69dd69d569d56dff6affddffdaf0164df80af97af0664dfafaf64 6464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf 0264dfaf8064996407af64dfafaf646464f6af086400d6d69d9d9d560008 00d69dd69d569d56dff6affddffdaf0264dfaf80649a6408dfaf64dfafaf 646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffd af0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d6d69d 9d9d56000800d69dd69d569d56dff6affddffdaf0464dfaf646480af9daf 09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d 5656dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464 f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464 dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480af9daf09dfdf af64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d56df f6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af08 6400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0464dfaf64 6480af9daf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800 d69dd69d569d56dff6affddffdaf0464dfaf646480af9daf09dfdfaf64df afaf646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affd dffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464dfaf646480af 9daf09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf64 6464f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf 0664dfaf6464af0080af9faf09dfdfaf64dfafaf646464f6af086400d69d d69d569d000800d6d69d9d9d5656dff6affddffdaf0664dfaf6464af0080 af9faf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69d d69d569d56dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf 646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffd af0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d6d69d 9d9d56000800d69dd69d569d56dff6affddffdaf0464dfaf646480af9daf 09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d 5656dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464 f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464 dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d6d69d9d9d5656dff6affddffdaf0864dfaf6464afafaf00f6af00 00e6af0000d8af0000faaf0000e8af000090af09dfdfaf64dfafaf646464 f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0864 dfaf6464afafaf00f6af0000e6af0000d8af0000faaf0000f6af0000f3af 000090af09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6 d69d9d9d5656dff6affddffdaf0764dfaf6464afaf00f6af0000e6af0000 d8af0000f9af0000f6af0000f4af00008faf09dfdfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0a64df af6464afaf00afaf00fcaf0e00afaf00afafaf000000af00afafaffc00fd affd000caf00afafaf00afaf00af000000fcaffd0009af00afaf00af0000 afaffc00fdaf0400af000000fcaf0b00afafaf000000af00afafaffc0007 afaf000000afafaffc00fcaf0b00afafaf000000af00afafaffc00fcaffc 00fdaf0700af0000afaf0000b1af09dfdfaf64dfafaf646464f6af086400 d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0a64dfaf6464af af00afaf00fcaf7f00afaf00afaf0000afaf0000afaf0000afaf0000af00 00afaf0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000af afaf0000afaf0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf 0000afaf0000afaf00afafaf0000afaf0000afafaf00afaf0000afaf0000 afaf0000afaf0000afaf0000afaf00000aafaf0000afaf0000afaf00b2af 09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d56 9d56dff6affddffdaf0a64dfaf6464af00afafaf00fcaf0600af00afafaf 00fcaf0300afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00 fcaf0300afaf00f7af0300afaf00fcaf0700afaf00afafaf00fcaf0000f9 af0300afaf00f8af0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf 00fcaf0b00afaf00afafaf00afafaf00b2af09dfdfaf64dfafaf646464f6 af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0a64df af6464af00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000 fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fbaffb0002 afaf00fcaf0700afaf00afafaf00fcaf0300afafaffb0002afaf00fcaffb 0006afaf00afafaf00fcaf0200afaffa0002afaf00fcaf0b00afaf00afaf af00afafaf00b2af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56 000800d69dd69d569d56dff6affddffdaf0a64dfaf6464af00afafaf00fc af0600af00afafaf00fcaf0300afaf00faaf0000fcaf0700afaf00afafaf 00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf00afaf00fcaf07 00afaf00afafaf00fcaf1b00afaf0000afafaf00afaf00afafaf0000afaf af00afaf00afafaf00fcaf0300afaf00f9af0000fcaf0b00afaf00afafaf 00afafaf00b2af09dfdfaf64dfafaf646464f6af086400d69dd69d569d00 0800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fcaf0000fcaf01 0000fcaf0000fcaf0300afaf00fcaf0200af00fcaf0200af00fcaf0000fc af0300afaf00fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00 fcaf0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0200af00fcaf 0000fcaf0300afaf00f9af0000fcaf0b00afaf00afafaf00afafaf00b2af 09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d56 9d56dff6affddffdaf0564dfaf646400fcaf060000afaf000000fcaf1600 00afaf0000afaf0000afaf0000af0000afaf0000af00fcaf0000fcaf0b00 afaf0000afaf0000afaf00fcaf0f0000afaf0000afaf0000afaf0000af00 fcaf1b0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000af 00fcaf200000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00af afaf00afafaf00b2af09dfdfaf64dfafaf646464f6af086400d69dd69d56 9d000800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fbaffd0002 af0000fbaffd0004af00afafaffc00fdaffd0003af00af00fcaf0000fcaf 0b00afafaf000000af00afaf00fbaffd000baf0000af00af000000afaf00 fbaffd0017af00afafaf000000af0000afaf0000afaf000000af000000fb affd0004af00afafaffc00fcaffc00fdaf0800afafaf00afafaf00b2af09 dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d 56dff6affddffdaf0464dfaf6464ebaf0000f2af0000edaf0000f1af0000 d0af000097af09dfdfaf64dfafaf646464f6af086400d69dd69d569d0008 00d6d69d9d9d5656dff6affddffdaf0464dfaf6464f0af050000afaf0000 f7af050000afaf0000f2af050000afaf0000f1af0000d5af050000afaf00 0097af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69d d69d569d56dff6affddffdaf0464dfaf6464efaffc00f5affc00f0affc00 f0af0000d4affc0096af09dfdfaf64dfafaf646464f6af086400d69dd69d 569d000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480af9daf09 dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d 56dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464f6 af086400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0864df af6464afafaf00f6af0000e6af0000d8af0000faaf000080aff7af09dfdf af64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d56df f6affddffdaf0864dfaf6464afafaf00f6af0000e6af0000d8af0000faaf 0000f6af000082af09dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d6d69d9d9d5656dff6affddffdaf0764dfaf6464afaf00f6af0000 e6af0000d8af0000f9af0000f6af000082af09dfdfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0a64df af6464afaf00afaf00fcaf0e00afaf00afafaf000000af00afafaffc00fd affd000caf00afafaf00afaf00af000000fcaffd0009af00afaf00af0000 afaffc00fdaf0400af000000fcaf0b00afafaf000000af00afafaffc0007 afaf000000afafaffc008aaf09dfdfaf64dfafaf646464f6af086400d69d d69d569d000800d6d69d9d9d5656dff6affddffdaf0a64dfaf6464afaf00 afaf00fcaf6300afaf00afaf0000afaf0000afaf0000afaf0000af0000af af0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000afafaf 0000afaf0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf0000 afaf0000afaf00afafaf0000afaf00008baf09dfdfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0a64df af6464af00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000 fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f7af0300af af00fcaf0700afaf00afafaf00fcaf0000f9af0300afaf00f8af00008baf 09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d 5656dff6affddffdaf0a64dfaf6464af00afafaf00fcaf0600af00afafaf 00fcaf0300afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00 fcaf0300afaf00fbaffb0002afaf00fcaf0700afaf00afafaf00fcaf0300 afafaffb0002afaf00fcaffb008baf09dfdfaf64dfafaf646464f6af0864 00d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0a64dfaf6464 af00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf 00afaf00fcaf0700afaf00afafaf00fcaf1400afaf0000afafaf00afaf00 afafaf0000afafaf008baf09dfdfaf64dfafaf646464f6af086400d69dd6 9d569d000800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fcaf00 00fcaf010000fcaf0000fcaf0300afaf00fcaf0200af00fcaf0200af00fc af0000fcaf0300afaf00fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf 0200af00fcaf0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000 8baf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd6 9d569d56dff6affddffdaf0564dfaf646400fcaf060000afaf000000fcaf 160000afaf0000afaf0000afaf0000af0000afaf0000af00fcaf0000fcaf 0b00afaf0000afaf0000afaf00fcaf0f0000afaf0000afaf0000afaf0000 af00fcaf190000afaf0000afaf0000afaf0000afaf00afafaf0000afaf00 008baf09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d6 9d9d9d5656dff6affddffdaf0564dfaf646400fbaffd0002af0000fbaffd 0004af00afafaffc00fdaffd0003af00af00fcaf0000fcaf0b00afafaf00 0000af00afaf00fbaffd000baf0000af00af000000afaf00fbaffd0016af 00afafaf000000af0000afaf0000afaf000000af00008caf09dfdfaf64df afaf646464f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affd dffdaf0464dfaf6464ebaf0000f2af0000edaf0000f1af000080afe6af09 dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d9d9d56 56dff6affddffdaf0464dfaf6464f0af050000afaf0000f7af050000afaf 0000f2af050000afaf0000f1af000080afe6af09dfdfaf64dfafaf646464 f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464 dfaf6464efaffc00f5affc00f0affc00f0af000080afe6af09dfdfaf64df afaf646464f6af086400d69dd69d569d000800d6d69d9d9d5656dff6affd dffdaf0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6affddffdaf0464dfaf646480af 9daf09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6affddffdaf0464dfaf646480af9daf09dfdfaf64dfafaf64 6464f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affddffdaf 0464dfaf646480af9daf09dfdfaf64dfafaf646464f6af086400d69dd69d 569d000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480af9daf09 dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d69dd69d569d 56dff6affddffdaf0464dfaf646480df9bdf07af64dfafaf646464f6af08 6400d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf0364dfaf64 80df9adf07af64dfafaf646464f6af086400d6d69d9d9d56000800d69dd6 9d569d56dff6affddffdaf0164df80af97af0664dfafaf646464f6af0864 00d69dd69d569d000800d6d69d9d9d5656dff6affddffdaf8064946405df afaf646464f6af086400d6d69d9d9d56000800d69dd69d569d56dff6affd dffdaf80df93df04afaf646464f6af086400d69dd69d569d000800d6d69d 9d9d5656dff6affddf80af8eaffd64f6af086400d6d69d9d9d56000800d6 9dd69d569d56dff6affddf80af8eaffd64f6af086400d69dd69d569d0008 00d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6d69d9d9d56 000800d69dd69d569d56dff6affddf80af8eaffd64f6af086400d69dd69d 569d000800d6d69d9d9d5656dff6affddf80af8eaffd64f6af086400d6d6 9d9d9d56000800d69dd69d569d56dff6affddf80648b64f6af086400d69d d69d569d000800d6d69d9d9d5656dff6af01dfdf80648a64f6af086400d6 d69d9d9d56000800d69dd69d569d56dff6af00df80648964f6af086400d6 9dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d 56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800 d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d 569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df 80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80af f4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af0864 00d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd6 9d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d5600 0800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d6 9d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d 56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af 80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af 086400d69dd69d569d000800d6d69d9d9d5656dff1affd00f4af0000ebaf 000080afa9af086400d6d69d9d9d56000800d69dd69d569d56dff3af0600 00afafaf0000f6af0000efaf0400afafaf0080afa9af086400d69dd69d56 9d000800d6d69d9d9d5656dff3af0000fbaf0000f6af0000efaf000080af a5af086400d6d69d9d9d56000800d69dd69d569d56dff3af0000f7affc00 fdaf0300afafaffc00fcaffc0009af000000afaf00afafaffc00fdaf0400 af00000080afb8af086400d69dd69d569d000800d6d69d9d9d5656dff2af 010000faaf2e0000afaf0000afaf00afaf0000afaf0000afaf0000afaf00 00af00afafaf00afaf0000afaf0000afaf0000afaf000080afb9af086400 d6d69d9d9d56000800d69dd69d569d56dff0af010000fcaf0000fcaf0600 afaf00afaf00fcaf0300afaf00faaf0700afafaf00afaf00fcaf0300afaf 00fcaf000080afb9af086400d69dd69d569d000800d6d69d9d9d5656dfee af030000afaffa0004afaf00afaffa0002afaf00faaf0700afafaf00afaf 00fcaf0300afaf00fcaf000080afb9af086400d6d69d9d9d56000800d69d d69d569d56dfedaf0300afaf00f9af0300afaf00f9af0000faaf0700afaf af00afaf00fcaf0300afaf00fcaf000080afb9af086400d69dd69d569d00 0800d6d69d9d9d5656dff3af0000fbaf0300afaf00f9af0300afaf00f9af 0000fcaf0900af00afafaf00afaf00fcaf0300afaf00fcaf000080afb9af 086400d6d69d9d9d56000800d69dd69d569d56dff3af320000afafaf0000 afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf0000af00af afaf00afaf0000afaf0000afaf00fcaf000080afb9af086400d69dd69d56 9d000800d6d69d9d9d5656dff1affd00fbaffc00fdaf0300afafaffc00fc affc00fdaf060000af00afafaffc00fdaf0000fcaf000080afb9af086400 d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d 569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d560008 00d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d 9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56 df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80 aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af08 6400d69dd69d569d000800d6d69d9d9d5656dff4af80648c64f4af086400 d6d69d9d9d56000800d69dd69d569d56dff4af80648d6400dff4af086400 d69dd69d569d000800d6d69d9d9d5656dff4af01646480af90af01dfdff4 af086400d6d69d9d9d56000800d69dd69d569d56dff4af01646480af90af 01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464 80af90af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4 af01646480af90af01dfdff4af086400d69dd69d569d000800d6d69d9d9d 5656dff4af01646480af90af01dfdff4af086400d6d69d9d9d56000800d6 9dd69d569d56dff4af01646480af90af01dfdff4af086400d69dd69d569d 000800d6d69d9d9d5656dff4af01646480af90af01dfdff4af086400d6d6 9d9d9d56000800d69dd69d569d56dff4af01646480af90af01dfdff4af08 6400d69dd69d569d000800d6d69d9d9d5656dff4af016464f3af0000fcaf 0000d8af0000eaaf0200af00faaf0000f4af0000d5af0000eaaf0000f5af 0000f9af0000faaf0000fcaffd00e9af0000fcaf0000fbaf01dfdff4af08 6400d6d69d9d9d56000800d69dd69d569d56dff4af016464f3af0000fcaf 0000d8af0000eaaf0200af00faaf0000f4af0000d5af0000eaaf0000f7af fd00fbaffd00faaf0900afaf0000afafaf0000ebaf0000fcaf0000fbaf01 dfdff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464f3 af0400afafaf00d8af0000eaaf0300afaf00eeaf0000beaf0000f4af0000 f9af0000fbaf0400afafaf00fbaf0000e7af0000faaf01dfdff4af086400 d6d69d9d9d56000800d69dd69d569d56dff4af016464fbaf130000afaf00 0000af00afafaf00afaf00af000000fcaffd0009af00afaf00af0000afaf fc00fdaf0400af000000fcaf0f00afafaf000000afafaf00af0000afaffc 00fdaf1100afaf00af000000afaf00afaf00af000000fcaf0b00afafaf00 0000af00afafaffc00fcaffc00fdaf0a00af0000afaf0000afaf00fbaf05 00af00afafaffc0016afaf00afafaf00afafaf00afafaf00af0000afafaf 0000fcaf0000f9af0000fbaf0300afaf00f9af0000faaffd00fcaffd0008 af00afaf00afafaf00faaf01dfdff4af086400d69dd69d569d000800d6d6 9d9d9d5656dff4af016464f8af7f0000afaf0000afafaf00afaf0000afaf 0000afaf0000afaf0000afaf0000afafaf0000afaf0000afaf0000afaf00 00afafaf00afaf00afafaf00afaf0000afafaf0000afaf0000afaf00afaf 0000afaf0000af00afaf0000afaf0000afafaf00afaf0000afaf0000afaf 0000afaf0000afaf0000afaf0000afaf0000afaf000004afaf00af00fbaf 1f00af00afaf0000afaf0000af00afafaf00afafaf00afafaf00afaf00af afaf00fbaf0000f9af0000fbaf0300afaf00f9af0000fbaf1300afafaf00 afaf0000afaf0000afaf00afafaf00faaf01dfdff4af086400d6d69d9d9d 56000800d69dd69d569d56dff4af016464f8af0000fcaf0700afaf00afaf af00fcaf0300afaf00fcaf0300afaf00f7af0300afaf00fcaf0800afaf00 afafaf0000fbaf0000fcaf0000faaf0400afafaf00fcaf0500af00afaf00 fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf1800af af00afafaf00afafaf00afaf00afafaf00afaf00afaf00fcaf0d00af00af afaf00afafaf00afaf00fcaf0200af00faaf0000f9af0000fcaf0400afaf af00f9af0000fbaf010000fbaf0000fcaf0600afaf00afaf00f9af01dfdf f4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464f8af00 00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fbaffb00 02afaf00fcaf0300afaf00fcaffd00fdaf0000fcaf0000faaf0400afafaf 00fcaf0500af00afaf00fcaf0700afaf00afafaf00fcaf0200afaffa0002 afaf00fcaf1700afaf00afafaf00afafaf00afaf00afafaf00afaf00afaf fa000cafaf00afaf00afaf00afafaf00fbaf0000f9af0000f9af0000fcaf 0400afafaf00f9af0000faaffd00fdaf0000fcaf0600afaf00afaf00f9af 01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af016464 f8af0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fc af080000afafaf00afaf00fcaf0300afaf00faaf040000afaf00fcaf0000 faaf0400afafaf00fcaf0500af00afaf00fcaf0700afaf00afafaf00fcaf 0300afaf00f9af0000fcaf1800afaf00afafaf00afafaf00afaf00afafaf 00afaf00afaf00f9af0a00afaf00afaf00afafaf00fbaf0000f9af0000f9 af0000fcaf0400afafaf00f9af0000f8af040000afaf00fcaf0600afaf00 afaf00f9af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656df f4af016464f8af0000fcaf0200af00fcaf0000fcaf0300afaf00fcaf0300 afaf00fcaf0000fcaf0300afaf00fcaf0200af00f8af0300afaf00fcaf00 00fcaf010000fcaf0000fcaf0500af00afaf00fcaf0200af00fcaf0000fc af0300afaf00f9af0000fcaf1800afaf00afafaf00afafaf00afafaf00af 00afafaf00afaf00f9af0900af00af00af00afaf00fbaf0200af00faaf00 00f9af0400afafaf00fbaf0000fbaf0000f6af0300afaf00fcaf0500afaf 00af00f8af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56df f4af016464f8af070000afaf0000af00fcaf0000fcaf0b00afaf0000afaf 0000afaf00fcaf0f0000afaf0000afaf0000afaf0000af00fcaf0700afaf af00afaf00fcaf060000afaf000000fcaf0a0000afaf0000af00afaf00fc af0200af00fcaf3e0000afaf0000afaf0000afaf0000afaf0000afaf0000 afaf00afafaf00afafaf00afafaf00af00afafaf00afaf0000afaf0000af afaf00afafaf00afafaf00fcaf0400afafaf00fbaf0000f9af0400afafaf 00fbaf1e0000afafaf0000afafaf00afaf00afafaf00afaf0000afaf0000 afaf00af00f8af01dfdff4af086400d69dd69d569d000800d6d69d9d9d56 56dff4af016464f7affd0003af00af00fcaf0000fcaf0b00afafaf000000 af00afaf00fbaffd000baf0000af00af000000afaf00fbaffd00fdaf0000 fbaffc0001af00fcaf0a00af000000afaf00afaf00fcaf0200af00fbaffd 0004af00afafaffc00fcaffc00fdaf0800afafaf00afafaf00fcaf0000fc af0300afafaffc00fcaf1200afafaf00afafaf00afafaf0000afafaf0000 fcaf0000f9af0400afafaf00f9affd00fbaf0600afafaf000000fcaffd00 06af00afaf00af00f8af01dfdff4af086400d6d69d9d9d56000800d69dd6 9d569d56dff4af016464dfaf0000f1af0000c3af00008eaf0000f3af01df dff4af086400d69dd69d569d000800d6d69d9d9d5656dff4af016464e4af 050000afaf0000f1af0000c8af050000afaf000093af050000afaf0000f3 af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af0164 64e3affc00f0af0000c7affc0091affc00f2af01dfdff4af086400d69dd6 9d569d000800d6d69d9d9d5656dff4af01646480af90af01dfdff4af0864 00d6d69d9d9d56000800d69dd69d569d56dff4af01646480af90af01dfdf f4af086400d69dd69d569d000800d6d69d9d9d5656dff4af01646480af90 af01dfdff4af086400d6d69d9d9d56000800d69dd69d569d56dff4af0164 6480af90af01dfdff4af086400d69dd69d569d000800d6d69d9d9d5656df f4af01646480af90af01dfdff4af086400d6d69d9d9d56000800d69dd69d 569d56dff4af01646480df8edff4af086400d69dd69d569d000800d6d69d 9d9d5656dff4af006480df8ddff4af086400d6d69d9d9d56000800d69dd6 9d569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656 df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80 aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af08 6400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69d d69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56 000800d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6 d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d56 9d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80 af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4 af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400 d6d69d9d9d56000800d69dd69d569d56df80648064f3640700d69dd69d56 9d000700d6d69d9d9d565680df80dff3df086400d6d69d9d9d56000800d6 9dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d 5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80 af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4 af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400 d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d 9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d569d0008 00d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd6 9d569d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656 df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80 aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af08 6400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69d d69d569d000800d6d69d9d9d5656dff3afc96480afb8af086400d6d69d9d 9d56000800d69dd69d569d56dff3af0064cbaf00df80afb8af086400d69d d69d569d000800d6d69d9d9d5656dff3af0064cbaf00df80afb8af086400 d6d69d9d9d56000800d69dd69d569d56dff3af0064cbaf00df80afb8af08 6400d69dd69d569d000800d6d69d9d9d5656dff3af0064cbaf00df80afb8 af086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcafd3dffc af00dfd5afd3dfd0afd3dfedaf086400d69dd69d569d000800d6d69d9d9d 5656dff3af0064fcafd4df0064fcaf00dfd5afd4df0064d0afd4df0064ed af086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcafd5df01 6464fcaf00dfd5afd5df016464d0afd5df016464edaf086400d69dd69d56 9d000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64fcaf00dfd5af fddfd9affd64d0affddfd9affd64edaf086400d6d69d9d9d56000800d69d d69d569d56dff3af0064fcaffddfd9affd64fcaf00dfd5affddfd9affd64 d0affddfd9affd64edaf086400d69dd69d569d000800d6d69d9d9d5656df f3af0064fcaffddfd9affd64fcaf00dfd5affddfd9affd64d0affddfd9af fd64edaf086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaf fddfd9affd64fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf0864 00d69dd69d569d000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64 fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf086400d6d69d9d9d 56000800d69dd69d569d56dff3af0064fcaffddfd9affd64fcaf00dfd5af fddfd9affd64d0affddfd9affd64edaf086400d69dd69d569d000800d6d6 9d9d9d5656dff3af0064fcaffddff3affd00fbaf0000fbaf0000f5affd64 fcaf00dfd5affddffbaff90004af00afaf00eaaffd64d0affddffaaf0000 faaf0300afaf00f9af0000f2affd64edaf086400d6d69d9d9d56000800d6 9dd69d569d56dff3af0064fcaffddff5af0a0000afafaf0000afafaf00fc af0000f4affd64fcaf00dfd5affddffbaf0000f9af0600afaf00afaf00ed affd64d0affddffaaf0000faaf0300afaf00f9af0000f2affd64edaf0864 00d69dd69d569d000800d6d69d9d9d5656dff3af0064fcaffddff5af0000 fbaf0800afafaf00afafaf00f3affd64fcaf00dfd5affddffbaf0000f6af 0300afaf00edaffd64d0affddffaaf0000faaf0000f6af0000f2affd64ed af086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaffddff6 af0000f9af0600afaf00afaf00f2affd64fcaf00dfd5affddffbaf0000f9 af0a00afaf00af000000afafaffc00fdaf0300af0000fcaffd64d0affddf faaf0000faaf0e00afaf00afafaf000000af00afafaffc00f9affd64edaf 086400d69dd69d569d000800d6d69d9d9d5656dff3af0064fcaffddff6af 0000f9af0500afaf00af00f1affd64fcaf00dfd5affddffbaf0000f9af13 00afaf00afaf00afafaf0000afaf0000afaf0000faaffd64d0affddffaaf 0000faaf1300afaf00afaf0000afaf0000afaf0000afaf0000faaffd64ed af086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaffddff6 af0000f9af0500afaf000000f1affd64fcaf00dfd5affddffbaffa000caf af00afaf00afaf00afafaf00fcaf0300afaf00f9affd64d0affddffaaff8 0005afaf00afaf00fcaf0300afaf00fcaf0000faaffd64edaf086400d69d d69d569d000800d6d69d9d9d5656dff3af0064fcaffddff6af0000f9af06 00afaf00afaf00f2affd64fcaf00dfd5affddffbaf0000f9af0900afaf00 afaf00afafaffa0002afaf00f9affd64d0affddffaaf0000faaf0600afaf 00afaf00fcaf0200afaffa00faaffd64edaf086400d6d69d9d9d56000800 d69dd69d569d56dff3af0064fcaffddff6af0000f9af0700afaf00afafaf 00f3affd64fcaf00dfd5affddffbaf0000f9af0a00afaf00afaf00afafaf 00f9af0000f9affd64d0affddffaaf0000faaf0600afaf00afaf00fcaf03 00afaf00f5affd64edaf086400d69dd69d569d000800d6d69d9d9d5656df f3af0064fcaffddff5af0000fbaf0400afafaf00fcaf0000f4affd64fcaf 00dfd5affddffbaf0000f9af0a00afaf00afaf00afafaf00f9af0000f9af fd64d0affddffaaf0000faaf0600afaf00afaf00fcaf0300afaf00f5affd 64edaf086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaffd dff5af0a0000afafaf0000afafaf00fbaf0000f5affd64fcaf00dfd5affd dffbaf0000f9af1200afaf00afaf00afafaf0000afaf0000afaf00f9affd 64d0affddffaaf0000faaf1300afaf00afaf0000afaf0000afaf0000afaf 0000faaffd64edaf086400d69dd69d569d000800d6d69d9d9d5656dff3af 0064fcaffddff3affd00fbaf0000faaf0000f6affd64fcaf00dfd5affddf fbaf0000f9af0a00afaf00afafaf0000afaffc00fdaf0000f9affd64d0af fddffaaf0000faaf0e00afaf00afafaf000000af00afafaffc00f9affd64 edaf086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaffddf d9affd64fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf086400d6 9dd69d569d000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64fcaf 00dfd5affddfd9affd64d0affddfd9affd64edaf086400d6d69d9d9d5600 0800d69dd69d569d56dff3af0064fcaffddfd9affd64fcaf00dfd5affddf d9affd64d0affddfd9affd64edaf086400d69dd69d569d0008009d569d9d 9d5656dff3af0064fcaffddfd9affd64fcaf00dfd5affddfd9affd64d0af fddfd9affd64edaf086400d6d69d569d56000000fb56029d56dff3af0064 fcaffddfd9affd64fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf 036400d69dfc56ff000000fcd6039d5656dff3af0064fcaffddfd9affd64 fcaf00dfd5affddfd9affd64d0affddfd9affd64edaf016400fad6ff0008 00d6d6d69d569d56dff3af0064fcaffddfd9affd64fcaf00dfd5affddfd9 affd64d0affddfd9affd64edaf036400d69dfcd6ff000800d6d69d9d9d56 56dff3af0064fcaffddfd664fcaf00dfd5affddfd664d0affddfd664edaf 086400d6d69d9d9d56000800d69dd69d569d56dff3af0064fcaf01dfdfd5 64fcaf00dfd5af01dfdfd564d0af01dfdfd564edaf086400d69dd69d569d 000800d6d69d9d9d5656dff3af0064fcaf00dfd464fcaf00dfd5af00dfd4 64d0af00dfd464edaf086400d6d69d9d9d56000800d69dd69d569d56dff3 af0064cbaf00df80afb8af086400d69dd69d569d000800d6d69d9d9d5656 dff3af0064cbaf00df80afb8af086400d6d69d9d9d56000800d69dd69d56 9d56dff3af0064cbaf00df80afb8af086400d69dd69d569d000800d6d69d 9d9d5656dff3af0064cbaf00df80afb8af086400d6d69d9d9d56000800d6 9dd69d569d56dff3af0064cadf80afb8af086400d69dd69d569d000800d6 d69d9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d56 9d56df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80 af80aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4 af086400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400 d6d69d9d9d56000800d69dd69d569d56df80af80aff4af086400d69dd69d 569d000800d6d69d9d9d5656df80af80aff4af086400d6d69d9d9d560008 00d69dd69d569d56df80af80aff4af086400d69dd69d569d000800d6d69d 9d9d5656df80af80aff4af086400d6d69d9d9d56000800d69dd69d569d56 df80af80aff4af086400d69dd69d569d000800d6d69d9d9d5656df80af80 aff4af086400d6d69d9d9d56000800d69dd69d569d56df80af80aff4af08 6400d69dd69d569d000800d6d69d9d9d5656df80af80aff4af086400d6d6 9d9d9d56000800d69dd69d569d56df80648064f3640700d69dd69d569d00 0700d6d69d9d9d565680008000f10006d6d69d9d9d56000600d69dd69d56 9d80d680d6efd6059dd69d569d007f00d6d69d9d9dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d1dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9d 9d56000300d69dd6e59d0156d6809da49d0156d6e49d02569d000200d6d6 e59d035656d6d6809da69d035656d6d6e49d0156007f00d69d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d56d6d69d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 7f9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d56d6d61d9d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d000100d6e25601d6d68056a45601d6d6e356ff0080 008000e200 grestore showpage %%Trailer geomview-1.9.4/doc/figs/mat.ps0000644000175000001440000011665407730233236013130 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: noname.ps %%Pages: 1 %%BoundingBox: 242 306 370 455 %%EndComments /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 265 string def %%EndProlog %%Page: 1 1 gsave 242.4 306.84 translate 127.2 148.32 scale 265 309 8 [ 265 0 0 -309 0 309 ] { picstr readstring } image 80008000f7000000e3d6019d5680d6b9d6015656e2d6019d007f00d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69d56d6d69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69d08d69dd69dd69d9d9d000300d69dd6e59d 0256d6d6809dbb9d035656d6d6e49d0156000200d6d6e49d0156d6809db9 9d0156d6e49d02569d007f00d69dd69d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d567f9d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d56019d 56fb9d0156007f00d6d69d9d9d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d7f569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d08569d9d9dd6 9d569d000600d69dd69d569d8000850006d6d69d9d9d56000700d6d69d9d 9d560080d687d60700d69dd69d569d007f00d69dd69d569d00d6d69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd6d6d69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d9dd6d69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd6089d00d6d69d9d9d56000800d6d69d9d9d5600d6ea9d0156d680 9dd29d0156d6e99d0256d6d6eb9d085600d69dd69d569d000900d69dd69d 569d00d6d6eb9d0256d6d6809dd39d0256d6d6eb9d025656d6fc9df200fd 9d09565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d025656d6f19d 010000f99d010000e39d010000f69d010000989d025656d6e99d0656d6d6 9d9d9d00f49d0000fc9d085600d69dd69d569d000900d69dd69d569d00d6 d6eb9d0256d6d6f29d010000fa9dfd00f69d010000ef9d010000f69d0100 00979d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d 9d9d56000800d6d69d9d9d5600d6eb9d025656d6f19d010000fb9dfd00f5 9d010000e49d010000979d025656d6e99d0656d6d69d9d9d00f49d0d0000 9d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6f3 9dfc00fd9dfc00fd9dfc00019d9dfb00019d9dfc00fd9d0a00009d00009d 00009d9d9dfc00fd9d010000969d0256d6d6eb9d025656d6fc9d0000f49d 0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d025656 d6f29d2100009d009d9d9d009d00009d9d00009d9d00009d9d00009d9d9d 00009d9d00009d9dfb000e9d00009d9d00009d9d00009d9d0000979d0256 56d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b 00d69dd69d569d00d6d69d9df000fd9d0256d6d6f39d0900009d009d9d00 009d00f99d1200009d9d00009d9d00009d9d9d00009d9d0000fc9d010000 fa9d0400009d0000959d0256d6d6f99dfc00f69d025656d6fc9d0000f49d 0d00009d9d565600d6d69d9d9d56000c00d6d69d9d9d5600d69d9d9d00f2 9d05009d9d5656d6f39d0d00009d9d009d00009d00009d9d9dfb00069d9d 00009d9d9dfa00039d9d0000fc9d0400009d9d9dfb00039d9d0000969d02 5656d6f89d04009d9d0000f69d0656d6d69d9d9d00f49d0d00009d9d9d56 00d69dd69d569d000c00d69dd69d569d00d6d69d9d00f29d0600009d9d56 d6d6f49d1a00009d9d0000009d9d00009d9d00009d9d00009d9d00009d9d 0000f99d010000fc9d0d00009d9d00009d9d00009d9d0000959d0256d6d6 f99d04009d9d0000f79d025656d6fc9d0000f49d0d00009d9d565600d6d6 9d9d9d56000b00d6d69d9d9d5600d69d9d9def00039d5656d6f39d1a0000 9d9d0000009d9d00009d00009d9d9d00009d00009d9d9d0000f99d010000 fc9d0d00009d00009d9d9d00009d9d0000969d025656d6f89dfb00f69d06 56d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d 569d00d6d6fc9df100049d9d56d6d6f59d2300009d9d9d00009d9d00009d 9d00009d9d00009d9d00009d9d9d00009d9d00009d9d0000fc9d0d00009d 9d00009d9d00009d9d0000949d0256d6d6f89dfc00f79d025656d6fc9d00 00f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d 025656d6f49d1a00009d9d9d00009d9d00009d9d9d0000009d00009d9d00 009d9d9dfc00fd9d010000fc9d0d00009d9d9d0000009d00009d0000959d 025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d 000900d69dd69d569d00d6d6eb9d0256d6d6809dd39d0256d6d6eb9d0256 56d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d 5600d6eb9d025656d6809dd39d025656d6e99d0656d6d69d9d9d00f49d0d 00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6 d6809dd39d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6 d69d9d9d56000800d6d69d9d9d5600d6eb9d025656d6809dd39d025656d6 e99d0556d6d69d9d9df100fd9d085600d69dd69d569d000900d69dd69d56 9d00d6d6eb9d0256d6d6809dd39d0256d6d6eb9d025656d6fa9df3000b9d 9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d025656d6809dd3 9d025656d6e99d0256d6d6eb9d085600d69dd69d569d007f00d69dd69d56 9d00d69d9d569d569d569d569d569d569d569d569d569d569d56d6569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d567f9d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d56d6569d569d569d 569d569d569d569d569d569d569d569d5656d69d569d569d569d569d569d 569d569d569d569d569d56085600d6d69d9d9d560008009d569d9d9d5600 9de956009d8056d156009de856009de9560700d69dd69d569d000000fb56 009d8000850001d6d6fc56ff000000fcd6039d56565680df88df0200d69d fcd6ff000800d6d6d69d569d565680df89df086400d6d69dd6d6d6000800 d6d69d9d9d56565680df8adf09646400d69dd69d569d000a00d69dd69d56 9d5656dfdf80af8daffd640700d6d69d9d9d56000a00d6d69d9d9d565656 dfdf80af8daffd640700d69dd69d569d000a00d69dd69d569d5656dfdf80 afbaafd4df0baf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdf 80afbaafd6df0d6464af64646400d69dd69d569d000a00d69dd69d569d56 56dfdf80afbaafd7dffd640baf64646400d6d69d9d9d56000a00d6d69d9d 9d565656dfdf80afbaaffddfdbaffc640baf64646400d69dd69d569d000a 00d69dd69d569d5656dfdf80afbaaffddfdbaffc640baf64646400d6d69d 9d9d56000a00d6d69d9d9d565656dfdf80afbaaffddfdbaffc640baf6464 6400d69dd69d569d000a00d69dd69d569d5656dfdf80afbaaffddfdbaffc 640baf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afbaaf fddfdbaffc640baf64646400d69dd69d569d000a00d69dd69d569d5656df df80afbaaffddfdbaffc640baf64646400d6d69d9d9d56000a00d6d69d9d 9d565656dfdfa2af0000f7af0000e5af0000f6af0000caaffddffdaffb00 e3affc640baf64646400d69dd69d569d000a00d69dd69d569d5656dfdfa2 af010000f9af010000f6af0000f0af0000f6af0000caaffddffdaf0000fc af010000e5affc640baf64646400d6d69d9d9d56000a00d6d69d9d9d5656 56dfdfa2af010000f9af010000f6af0000e5af0000caaffddffdaf0000fb af0000e5affc640baf64646400d69dd69d569d000a00d69dd69d569d5656 dfdfa2af0200af00fbaf0500af00afafaffc0007afaf000000afafaffc00 fdaf0800af0000af00afafaffc00fdaf0000caaffddffdaf0000faaf0300 afafaffc00fdaf0400af000000fcaffc00fdaffc640baf64646400d6d69d 9d9d56000a00d6d69d9d9d565656dfdfa2af0200af00fbaf2900af00afaf 0000afaf0000afaf00afafaf0000afaf0000afaf0000afafaf00afaf0000 afaf0000afaf00caaffddffdaf0000faaf1a00afaf0000afaf0000afaf00 00afaf0000afaf0000afaf0000afaffc640baf64646400d69dd69d569d00 0a00d69dd69d569d5656dfdfa2af0a00afaf00afafaf00afaf00f9af0700 afaf00afafaf00fcaf0300afaf00fcaf0000f9af0300afaf00caaffddffd af0000faaf0300afaf00fcaf0300afaf00fcaf0300afaf00fcaf0200afaf fc640baf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdfa2af0d 00afaf00afafaf00afaf00afafaffb0005afaf00afafaffa0002afaf00fc af0300afafaffb0002afaf00caaffddffdaf0000faaf0300afaf00fcaf03 00afaf00fcaf0200afaffa0001afaffc640baf64646400d69dd69d569d00 0a00d69dd69d569d5656dfdfa2af1900afafaf00af00afafaf00afaf0000 afafaf00afaf00afafaf00f9af0000fcaf0b00afaf0000afafaf00afaf00 caaffddffdaf0000faaf0300afaf00fcaf0300afaf00fcaf0300afaf00f9 affc640baf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdfa2af 0d00afafaf00af00afafaf00afaf00fcaf0700afaf00afafaf00f9af0000 fcaf0300afaf00fcaf0300afaf00caaffddffdaf0000fbaf0400afafaf00 fcaf0300afaf00fcaf0300afaf00f9affc640baf64646400d69dd69d569d 000a00d69dd69d569d5656dfdfa2af0000fcaf0000fcaf1700afaf0000af af0000afaf00afafaf0000afaf0000afaf00fcaf0b00afaf0000afaf0000 afaf00caaffddffdaf0000fcaf0d0000afafaf0000afaf0000afaf00fcaf 0a00afaf0000afaf0000afaffc640baf64646400d6d69d9d9d56000a00d6 d69d9d9d565656dfdfa2af0000fcaf0000fcaf0f00afafaf000000af0000 afaf0000afaffc00fdaf0000fcaf0b00afafaf000000af0000af00caaffd dffdaffb00faaffc00fdaf0000fcaf0300afafaffc00fdaffc640baf6464 6400d69dd69d569d000a00d69dd69d569d5656dfdf80afbaaffddfdbaffc 640baf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afbaaf fddfdbaffc640baf64646400d69dd69d569d000a00d69dd69d569d5656df df80afbaaffddfdbaffc640baf64646400d6d69d9d9d56000a00d6d69d9d 9d565656dfdf80afbaaffddfdbaffc640baf64646400d69dd69d569d000a 00d69dd69d569d5656dfdf80afbaaffddfdbaffc640baf64646400d6d69d 9d9d56000a00d6d69d9d9d565656dfdf80afbaaffddfdbaffc640baf6464 6400d69dd69d569d000a00d69dd69d569d5656dfdf80afbaaffddfdbaffc 640baf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afbaaf fddfd7640baf64646400d69dd69d569d000a00d69dd69d569d5656dfdf80 afbaaf01dfdfd6640baf64646400d6d69d9d9d56000a00d6d69d9d9d5656 56dfdf80afbaaf00dfd5640baf64646400d69dd69d569d000a00d69dd69d 569d5656dfdf80af8daffd640700d6d69d9d9d56000a00d6d69d9d9d5656 56dfdf80af8daffd640700d69dd69d569d000a00d69dd69d569d5656dfdf 80af8daffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80af8d affd640700d69dd69d569d000a00d69dd69d569d5656dfdf80af8daffd64 0700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80af8daffd640700d6 9dd69d569d000a00d69dd69d569d5656dfdf80af8daffd640700d6d69d9d 9d56000a00d6d69d9d9d565656dfdf80af8daffd640700d69dd69d569d00 0a00d69dd69d569d5656dfdf80af8daffd640700d6d69d9d9d56000a00d6 d69d9d9d565656dfdf80af8daffd640700d69dd69d569d000a00d69dd69d 569d5656dfdf80af8daffd640700d6d69d9d9d56000a00d6d69d9d9d5656 56dfdffbaffb00fbaf0900afafaf0000afaf0000e5aff900f4af030000af 0080afd8affd640700d69dd69d569d000a00d69dd69d569d5656dfdffbaf 0000fcaf0c0000afafaf00afaf00afafaf00e3af0000fbaf010000f6af04 00afafaf00efaf000080afeaaffd640700d6d69d9d9d56000a00d6d69d9d 9d565656dfdffbaf0000fbaf0000faaf0400afafaf00e3af0000faaf0000 f6af0400afafaf00efaf000080afeaaffd640700d69dd69d569d000a00d6 9dd69d569d5656dfdffbaf0000faaf0e00afaf00af000000af000000afaf 00fcaf0500afaf000000fcaffc00f9af0000faaf0300afafaffc000aafaf 000000afaf00afafaffc00fcaffc0006af000000afafaffc00fdaf0400af 000000fcaffc00fdaffc0089affd640700d6d69d9d9d56000a00d6d69d9d 9d565656dfdffbaf0000faaf0e00afaf00afaf00afafaf00afafaf00fcaf 0e00af00afafaf00afaf0000afaf0000faaf0000fbaf4200afafaf0000af af0000afaf00afafaf00afaf0000afaf0000afaf0000afaf0000af00afaf af0000afaf0000afaf0000afaf0000afaf0000afaf0000af0000afaf0000 8aaffd640700d69dd69d569d000a00d69dd69d569d5656dfdffbaf0000fa af0e00afaf00afaf00afafaf00afafaf00fcaf0300af0000fbaf0000fcaf 0000faaffa00fcaf0000fcaf0a00afaf00afafaf00afaf00fcaf0300afaf 00faaf0000f8af0300afaf00fcaf0300afaf00faaf0000fcaf00008aaffd 640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffbaf0000faaf0e00 afaf00afaf00afafaf00afafaf00fcaf0800afaf000000afafaffa00faaf 0000fbaf0300afafaffa0008afaf00afafaf00afaffa0002afaf00faaf00 00fcaffb0002afaf00fcaf0300afaf00faaffa008aaffd640700d69dd69d 569d000a00d69dd69d569d5656dfdffbaf0000faaf0e00afaf00afaf00af afaf00afafaf00fcaf0000fcaf040000afaf00f5af0000faaf0300afaf00 f9af0700afafaf00afaf00f9af0000faaf0c00afafaf0000afafaf00afaf 00fcaf0300afaf00faaf000085affd640700d6d69d9d9d56000a00d6d69d 9d9d565656dfdffbaf0000fbaf0f00afafaf00afaf00afafaf00afafaf00 fcaf0000fbaf0300afaf00f5af0000faaf0300afaf00f9af0700afafaf00 afaf00f9af0000fcaf0600af00afafaf00fcaf0300afaf00fcaf0300afaf 00fcaf0200af0085affd640700d69dd69d569d000a00d69dd69d569d5656 dfdffbaf0000fcaf230000afafaf00afaf00afafaf00afafaf0000afaf00 00af00afafaf00afaf0000afaf0000faaf0000faaf2d00afaf0000afaf00 00afaf00afafaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00 00afaf0000afaf00fcaf0f00afaf0000afaf0000af0000afaf00008aaffd 640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffbaffb00fbaf0700 afaf00afafaf00fcaffd0006af00afaf000000fcaffc00f9af0000faaf03 00afafaffc00fdaf0700afafaf00afafaffc00fcaffc00fdaf0b0000afaf 000000af0000af00fcaf0300afafaffc00fdaffc00d3afb964fdaffd6407 00d69dd69d569d000a00d69dd69d569d5656dfdf80afd7afbb640fdfdfaf afaf64646400d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af01 6464beaffddffdaffd640700d69dd69d569d000a00d69dd69d569d5656df df80afd7af016464beaffddffdaffd640700d6d69d9d9d56000d00d6d69d 9d9d565656dfdfafafaf8064dd64fdaf016464beaffddffdaffd640700d6 9dd69d569d000d00d69dd69d569d5656dfdfafafaf8064df6406dfdfafaf af6464beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656 dfdfafafaf64648095dfdffdaf016464beaffddffdaffd640700d69dd69d 569d000f00d69dd69d569d5656dfdfafafaf64648095f2df0064f2df0864 dfdfdfafafaf6464beaffddffdaffd640700d6d69d9d9d56000f00d6d69d 9d9d565656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdf afafaf6464beaffddffdaffd640700d69dd69d569d000f00d69dd69d569d 5656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf 6464beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656df dfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464f7 af0000c8affddffdaffd640700d69dd69d569d000f00d69dd69d569d5656 dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464 f9affd00c8affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d5656 56dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf64 64f7af0000c8affddffdaffd640700d69dd69d569d000f00d69dd69d569d 5656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf 6464f7af0000c8affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d 565656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafaf af6464f7af0000c8affddffdaffd640700d69dd69d569d000f00d69dd69d 569d5656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfaf afaf6464f7af0000c8affddffdaffd640700d6d69d9d9d56000f00d6d69d 9d9d565656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdf afafaf6464f7af0000c8affddffdaffd640700d69dd69d569d000f00d69d d69d569d5656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdf dfafafaf6464f7af0000c8affddffdaffd640700d6d69d9d9d56000f00d6 d69d9d9d565656dfdfafafaf6464809501dfdff4af0164dff4af096464df dfdfafafaf6464f7af0000c8affddffdaffd640700d69dd69d569d000f00 d69dd69d569d5656dfdfafafaf6464809501dfdff4af0164dff4af096464 dfdfdfafafaf6464f7af0000c8affddffdaffd640700d6d69d9d9d56000f 00d6d69d9d9d565656dfdfafafaf6464809501dfdff36400dff264fddffd af016464f7af0000c8affddffdaffd640700d69dd69d569d000f00d69dd6 9d569d5656dfdfafafaf6464809500dfe364fddffdaf016464beaffddffd affd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf646480 dfdfdffdaf016464beaffddffdaffd640700d69dd69d569d000e00d69dd6 9d569d5656dfdfafafaf6480dfdedffdaf016464beaffddffdaffd640700 d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af016464beaffddf fdaffd640700d69dd69d569d000a00d69dd69d569d5656dfdf80afd7af01 6464beaffddffdaffd640700d6d69d9d9d56000a00d6d69d9d9d565656df df80afd7af016464beaffddffdaffd640700d69dd69d569d000a00d69dd6 9d569d5656dfdf80afd7af016464beaffddffdaffd640700d6d69d9d9d56 000a00d6d69d9d9d565656dfdff8af0000f0af0000faaf0000e6aff900f4 af030000af00a9af016464bbdffdaffd640700d69dd69d569d000a00d69d d69d569d5656dfdff9affd00f1af0000faaf0000eeaf0000f9af0000fbaf 010000f6af0400afafaf00efaf0000bbaf0064badffdaffd640700d6d69d 9d9d56000a00d6d69d9d9d565656dfdff9af0200af00f1af0000e7af0000 f9af0000faaf0000f6af0400afafaf00efaf000080aff1affd640700d69d d69d569d000a00d69dd69d569d5656dfdff9af0200af00fcaf1500af0000 afaf0000afafaf00af000000afaf00afafaffc00fdaf0900af000000afaf 000000faaf0000faaf0300afafaffc000aafaf000000afaf00afafaffc00 fcaffc0006af000000afafaffc00fdaf0400af000000fcaffc00fdaffc00 90affd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffaaf2d00af afaf00afafaf0000afaf0000afaf00afaf0000afaf0000af00afaf0000af af0000afaf0000afaf0000afaf00f9af0000fbaf4200afafaf0000afaf00 00afaf00afafaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00 00afaf0000afaf0000afaf0000afaf0000afaf0000af0000afaf000091af fd640700d69dd69d569d000a00d69dd69d569d5656dfdffaaf1300afafaf 00afafaf00afafaf00afafaf00afaf00fcaf0500af00afaf00fcaf0300af af00fcaf0300afaf00f9affa00fcaf0000fcaf0a00afaf00afafaf00afaf 00fcaf0300afaf00faaf0000f8af0300afaf00fcaf0300afaf00faaf0000 fcaf000091affd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffb af0000fbaf0e00afaf00afafaf00afafaf00afaf00fcaf0400af00afaffa 0002afaf00fcaf0300afaf00f9af0000fbaf0300afafaffa0008afaf00af afaf00afaffa0002afaf00faaf0000fcaffb0002afaf00fcaf0300afaf00 faaffa0091affd640700d69dd69d569d000a00d69dd69d569d5656dfdffb aff9000dafaf00afafaf00afafaf00afaf00fcaf0500af00afaf00f9af00 00fcaf0300afaf00f9af0000faaf0300afaf00f9af0700afafaf00afaf00 f9af0000faaf0c00afafaf0000afafaf00afaf00fcaf0300afaf00faaf00 008caffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffbaf0000 fbaf0e00afaf00afafaf00afafaf00afaf00fcaf0500af00afaf00f9af00 00fcaf0300afaf00f9af0000faaf0300afaf00f9af0700afafaf00afaf00 f9af0000fcaf0600af00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf 0200af008caffd640700d69dd69d569d000a00d69dd69d569d5656dfdffc af0000f9af1f00af00afafaf00afafaf00afaf0000afaf0000af00afaf00 00afaf0000afaf00fcaf0300afaf00f9af0000faaf2d00afaf0000afaf00 00afaf00afafaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00 00afaf0000afaf00fcaf0f00afaf0000afaf0000af0000afaf000091affd 640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffcaf0000f9af1700 af00afafaf00afafaf00afaf00af000000afaf00afafaffc00fdaf0000fc af0500afafaf0000fbaf0000faaf0300afafaffc00fdaf0700afafaf00af afaffc00fcaffc00fdaf0b0000afaf000000af0000af00fcaf0300afafaf fc00fdaffc0090affd640700d69dd69d569d000a00d69dd69d569d5656df df80afd7afb964fdaffd640700d6d69d9d9d56000a00d6d69d9d9d565656 dfdf80afd7afbb640fdfdfafafaf64646400d69dd69d569d000a00d69dd6 9d569d5656dfdf80afd7af016464beaffddffdaffd640700d6d69d9d9d56 000a00d6d69d9d9d565656dfdf80afd7af016464beaffddffdaffd640700 d69dd69d569d000d00d69dd69d569d5656dfdfafafaf8064dd64fdaf0164 64beaffddffdaffd640700d6d69d9d9d56000d00d6d69d9d9d565656dfdf afafaf8064df6406dfdfafafaf6464beaffddffdaffd640700d69dd69d56 9d000f00d69dd69d569d5656dfdfafafaf6464da95e2dfa695fddffdaf01 6464beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656df dfafafaf6464da95f2df0064f2df0064a695fddffdaf016464beaffddffd affd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464da 9501dfdff4af0164dff4af016464a695fddffdaf016464beaffddffdaffd 640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464da9501 dfdff4af0164dff4af016464a695fddffdaf016464beaffddffdaffd6407 00d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464da9501dfdf f4af0164dff4af016464a695fddffdaf016464f9affc00f9affc00d4affd dffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf64 64da9501dfdff4af0164dff4af016464a695fddffdaf016464faaf0000fc af0000fbaf0000fcaf0000d5affddffdaffd640700d69dd69d569d000f00 d69dd69d569d5656dfdfafafaf6464da9501dfdff4af0164dff4af016464 a695fddffdaf016464faaf0000fcaf0000fbaf0000fcaf0000d5affddffd affd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464da 9501dfdff4af0164dff4af016464a695fddffdaf016464faaf0000fcaf00 00f6af0000d5affddffdaffd640700d69dd69d569d000f00d69dd69d569d 5656dfdfafafaf6464da9501dfdff4af0164dff4af016464a695fddffdaf 016464faaf0000fcaf0000f6af0000d5affddffdaffd640700d6d69d9d9d 56000f00d6d69d9d9d565656dfdfafafaf6464da9501dfdff4af0164dff4 af016464a695fddffdaf016464faaf0000fcaf0000f9affd00d4affddffd affd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464da 9501dfdff4af0164dff4af016464a695fddffdaf016464faaf0000fcaf00 00f6af0000d5affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d56 5656dfdfafafaf6464da9501dfdff4af0164dff4af016464a695fddffdaf 016464faaf0000fcaf0000f6af0000d5affddffdaffd640700d69dd69d56 9d000f00d69dd69d569d5656dfdfafafaf6464da9501dfdff4af0164dff4 af016464a695fddffdaf016464faaf0000fcaf0000fbaf0000fcaf0000d5 affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafaf af6464da9501dfdff4af0164dff4af016464a695fddffdaf016464faaf00 00fcaf0600afaf00afaf00fcaf0000d5affddffdaffd640700d69dd69d56 9d000f00d69dd69d569d5656dfdfafafaf6464da9501dfdff36400dff264 a695fddffdaf016464f9affc00fdaf0300afafaffc00d4affddffdaffd64 0700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464da9500df e364a695fddffdaf016464beaffddffdaffd640700d69dd69d569d000f00 d69dd69d569d5656dfdfafafaf646480dfdfdffdaf016464beaffddffdaf fd640700d6d69d9d9d56000e00d6d69d9d9d565656dfdfafafaf6480dfde dffdaf016464beaffddffdaffd640700d69dd69d569d000a00d69dd69d56 9d5656dfdf80afd7af016464beaffddffdaffd640700d6d69d9d9d56000a 00d6d69d9d9d565656dfdf80afd7af016464beaffddffdaffd640700d69d d69d569d000a00d69dd69d569d5656dfdf80afd7af016464beaffddffdaf fd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af016464 beaffddffdaffd640700d69dd69d569d000a00d69dd69d569d5656dfdff9 affd00fcaf0000f9af0000f6af000080aff9af016464bbdffdaffd640700 d6d69d9d9d56000a00d6d69d9d9d565656dfdffbaf090000afafaf0000af af00f9af0000f6af000080aff9af0064badffdaffd640700d69dd69d569d 000a00d69dd69d569d5656dfdffbaf0000fbaf0300afaf0080af9caffd64 0700d6d69d9d9d56000a00d6d69d9d9d565656dfdffbaf0000f8af1a00af 000000afafaf00afaf00af000000afafaf00afaf00af000000fcaffc00fc affd00fcaffd0080afccaffd640700d69dd69d569d000a00d69dd69d569d 5656dfdffaaf010000faaf310000afaf0000afaf00afaf0000afaf0000af af00afaf0000afaf0000afaf0000afaf0000afaf00afafaf00afaf00afaf af0080afcdaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff8 af010000fcaf0000fcaf0600afaf00afaf00fcaf0600afaf00afaf00fcaf 0300afaf00fcaf0400afaf0000fbaf01000080afcaaffd640700d69dd69d 569d000a00d69dd69d569d5656dfdff6af040000afaf00fcaf0600afaf00 afaf00fcaf0600afaf00afaf00fcaf0200afaffa00fdaffd00fcaffd0080 afccaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff5af0300 afaf00fcaf0600afaf00afaf00fcaf0600afaf00afaf00fcaf0300afaf00 f6af010000fbaf01000080afcdaffd640700d69dd69d569d000a00d69dd6 9d569d5656dfdffbaf0000fbaf0300afaf00fcaf0600afaf00afaf00fcaf 0600afaf00afaf00fcaf0300afaf00f5af0000faaf000080afcdaffd6407 00d6d69d9d9d56000a00d6d69d9d9d565656dfdffbaf090000afafaf0000 afaf00fcaf0600afaf00afaf00fcaf0600afaf00afaf00fcaf1600afaf00 00afaf0000afaf00afafaf00afaf00afafaf0097afb964fdaffd640700d6 9dd69d569d000a00d69dd69d569d5656dfdff9affd00fcaf0000fcaf0600 afaf00afaf00fcaf0600afaf00afaf00fcaf0300afafaffc00fcaffd00fc affd0096afbb640fdfdfafafaf64646400d6d69d9d9d56000a00d6d69d9d 9d565656dfdf80afd7af016464beaffddffdaffd640700d69dd69d569d00 0a00d69dd69d569d5656dfdf80afd7af016464beaffddffdaffd640700d6 d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af016464beaffddffd affd640700d69dd69d569d000d00d69dd69d569d5656dfdfafafaf8064dd 64fdaf016464beaffddffdaffd640700d6d69d9d9d56000d00d6d69d9d9d 565656dfdfafafaf8064df6406dfdfafafaf6464beaffddffdaffd640700 d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464f295e2df8e95 fddffdaf016464beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d 9d565656dfdfafafaf6464f295f2df0064f2df00648e95fddffdaf016464 beaffddffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfaf afaf6464f29501dfdff4af0164dff4af0164648e95fddffdaf016464beaf fddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf 6464f29501dfdff4af0164dff4af0164648e95fddffdaf016464f7af0000 fcaffa00d2affddffdaffd640700d69dd69d569d000f00d69dd69d569d56 56dfdfafafaf6464f29501dfdff4af0164dff4af0164648e95fddffdaf01 6464f9affd00fcaf0000cdaffddffdaffd640700d6d69d9d9d56000f00d6 d69d9d9d565656dfdfafafaf6464f29501dfdff4af0164dff4af0164648e 95fddffdaf016464f7af0000fcaf0000cdaffddffdaffd640700d69dd69d 569d000f00d69dd69d569d5656dfdfafafaf6464f29501dfdff4af0164df f4af0164648e95fddffdaf016464f7af0000fcaf0000cdaffddffdaffd64 0700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464f29501df dff4af0164dff4af0164648e95fddffdaf016464f7af0000fcaffb00d1af fddffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf 6464f29501dfdff4af0164dff4af0164648e95fddffdaf016464f7af0000 f7af0000d2affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d5656 56dfdfafafaf6464f29501dfdff4af0164dff4af0164648e95fddffdaf01 6464f7af0000f7af0000d2affddffdaffd640700d69dd69d569d000f00d6 9dd69d569d5656dfdfafafaf6464f29501dfdff4af0164dff4af0164648e 95fddffdaf016464f7af0000f7af0000d2affddffdaffd640700d6d69d9d 9d56000f00d6d69d9d9d565656dfdfafafaf6464f29501dfdff4af0164df f4af0164648e95fddffdaf016464f7af0000fcaf0000fcaf0000d2affddf fdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464 f29501dfdff4af0164dff4af0164648e95fddffdaf016464f7af0000fcaf 0000fcaf0000d2affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d 565656dfdfafafaf6464f29501dfdff4af0164dff4af0164648e95fddffd af016464f7af0000fbaffc00d1affddffdaffd640700d69dd69d569d000f 00d69dd69d569d5656dfdfafafaf6464f29501dfdff36400dff2648e95fd dffdaf016464beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d 565656dfdfafafaf6464f29500dfe3648e95fddffdaf016464beaffddffd affd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf646480 dfdfdffdaf016464beaffddffdaffd640700d6d69d9d9d56000e00d6d69d 9d9d565656dfdfafafaf6480dfdedffdaf016464beaffddffdaffd640700 d69dd69d569d000a00d69dd69d569d5656dfdf80afd7af016464beaffddf fdaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af01 6464beaffddffdaffd640700d69dd69d569d000a00d69dd69d569d5656df df80afd7af016464beaffddffdaffd640700d6d69d9d9d56000a00d6d69d 9d9d565656dfdffaaffd00deaf0000edaff900f4af030000af00adaf0164 64bbdffdaffd640700d69dd69d569d000a00d69dd69d569d5656dfdffcaf 060000afafaf0000e0af0000edaf0000fbaf010000f6af0400afafaf00ef af0000bfaf0064badffdaffd640700d6d69d9d9d56000a00d6d69d9d9d56 5656dfdffcaf0000fbaf0000e0af0000edaf0000faaf0000f6af0400afaf af00efaf000080aff5affd640700d69dd69d569d000a00d69dd69d569d56 56dfdffcaf0000f8af0400af000000fcaffc00fcaffc0002afaf00fcaf05 00af00afafaffc00fdaf0300af0000fbaf0000faaf0300afafaffc000aaf af000000afaf00afafaffc00fcaffc0006af000000afafaffc00fdaf0400 af000000fcaffc00fdaffc0094affd640700d6d69d9d9d56000a00d6d69d 9d9d565656dfdffbaf010000faaf170000afaf0000afaf0000afaf0000af af0000afaf0000af00fcaf0e00af00afaf0000afaf0000afaf0000f9af00 00fbaf4200afafaf0000afaf0000afaf00afafaf00afaf0000afaf0000af af0000afaf0000af00afafaf0000afaf0000afaf0000afaf0000afaf0000 afaf0000af0000afaf000095affd640700d69dd69d569d000a00d69dd69d 569d5656dfdff9af010000fcaf0000fcaf0300afaf00fcaf0300afaf00fa af0000fcaf0200af00f9af0300afaf00f8affa00fcaf0000fcaf0a00afaf 00afafaf00afaf00fcaf0300afaf00faaf0000f8af0300afaf00fcaf0300 afaf00faaf0000fcaf000095affd640700d6d69d9d9d56000a00d6d69d9d 9d565656dfdff7af040000afaf00fcaf0200afaffa0002afaf00faaf0000 fcaf0500af00afafaffb0002afaf00f8af0000fbaf0300afafaffa0008af af00afafaf00afaffa0002afaf00faaf0000fcaffb0002afaf00fcaf0300 afaf00faaffa0095affd640700d69dd69d569d000a00d69dd69d569d5656 dfdff6af0300afaf00fcaf0300afaf00f9af0000faaf0000fcaf0d00af00 afaf0000afafaf00afaf00f8af0000faaf0300afaf00f9af0700afafaf00 afaf00f9af0000faaf0c00afafaf0000afafaf00afaf00fcaf0300afaf00 faaf000090affd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdffc af0000fbaf0300afaf00fcaf0300afaf00f9af0000fcaf0200af00fcaf05 00af00afaf00fcaf0300afaf00f8af0000faaf0300afaf00f9af0700afaf af00afaf00f9af0000fcaf0600af00afafaf00fcaf0300afaf00fcaf0300 afaf00fcaf0200af0090affd640700d69dd69d569d000a00d69dd69d569d 5656dfdffcaf320000afafaf0000afaf0000afaf0000afaf0000afaf0000 afaf0000afaf0000af0000afaf0000af00afaf0000afaf0000afaf00f8af 0000faaf2d00afaf0000afaf0000afaf00afafaf00afaf0000afaf0000af af0000afaf0000af00afafaf0000afaf0000afaf00fcaf0f00afaf0000af af0000af0000afaf000095affd640700d6d69d9d9d56000a00d6d69d9d9d 565656dfdffaaffd00fcaf0400af000000fcaffc00fcaffc00fdaffd000e af00af00afafaf000000af0000af00f8af0000faaf0300afafaffc00fdaf 0700afafaf00afafaffc00fcaffc00fdaf0b0000afaf000000af0000af00 fcaf0300afafaffc00fdaffc00deafb964fdaffd640700d69dd69d569d00 0a00d69dd69d569d5656dfdff3af000080afe5afbb640fdfdfafafaf6464 6400d6d69d9d9d56000a00d6d69d9d9d565656dfdff3af000080afe5af01 6464beaffddffdaffd640700d69dd69d569d000a00d69dd69d569d5656df dff3af000080afe5af016464beaffddffdaffd640700d6d69d9d9d56000a 00d6d69d9d9d565656dfdf80afd7af016464beaffddffdaffd640700d69d d69d569d000d00d69dd69d569d5656dfdfafafaf8064dd64fdaf016464be affddffdaffd640700d6d69d9d9d56000d00d6d69d9d9d565656dfdfafaf af8064df6406dfdfafafaf6464beaffddffdaffd640700d69dd69d569d00 0f00d69dd69d569d5656dfdfafafaf6464da95e2dfa695fddffdaf016464 beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfaf afaf6464da95f2df0064f2df0064a695fddffdaf016464beaffddffdaffd 640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464da9501 dfdff4af0164dff4af016464a695fddffdaf016464beaffddffdaffd6407 00d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464da9501dfdf f4af0164dff4af016464a695fddffdaf016464f9affc00f9affc00d4affd dffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf64 64da9501dfdff4af0164dff4af016464a695fddffdaf016464faaf0000fc af0000fbaf0000fcaf0000d5affddffdaffd640700d6d69d9d9d56000f00 d6d69d9d9d565656dfdfafafaf6464da9501dfdff4af0164dff4af016464 a695fddffdaf016464faaf0000fcaf0000fbaf0000fcaf0000d5affddffd affd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464da 9501dfdff4af0164dff4af016464a695fddffdaf016464faaf0000fcaf00 00f6af0000d5affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d56 5656dfdfafafaf6464da9501dfdff4af0164dff4af016464a695fddffdaf 016464faaf0000fcaf0000f6af0000d5affddffdaffd640700d69dd69d56 9d000f00d69dd69d569d5656dfdfafafaf6464da9501dfdff4af0164dff4 af016464a695fddffdaf016464faaf0000fcaf0000f9affd00d4affddffd affd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464da 9501dfdff4af0164dff4af016464a695fddffdaf016464faaf0000fcaf00 00f6af0000d5affddffdaffd640700d69dd69d569d000f00d69dd69d569d 5656dfdfafafaf6464da9501dfdff4af0164dff4af016464a695fddffdaf 016464faaf0000fcaf0000f6af0000d5affddffdaffd640700d6d69d9d9d 56000f00d6d69d9d9d565656dfdfafafaf6464da9501dfdff4af0164dff4 af016464a695fddffdaf016464faaf0000fcaf0000fbaf0000fcaf0000d5 affddffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafaf af6464da9501dfdff4af0164dff4af016464a695fddffdaf016464faaf00 00fcaf0600afaf00afaf00fcaf0000d5affddffdaffd640700d6d69d9d9d 56000f00d6d69d9d9d565656dfdfafafaf6464da9501dfdff4af0164dff4 af016464a695fddffdaf016464f9affc00fdaf0300afafaffc00d4affddf fdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464 da9501dfdff36400dff264a695fddffdaf016464beaffddffdaffd640700 d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf6464da9500dfe364 a695fddffdaf016464beaffddffdaffd640700d69dd69d569d000f00d69d d69d569d5656dfdfafafaf646480dfdfdffdaf016464beaffddffdaffd64 0700d6d69d9d9d56000e00d6d69d9d9d565656dfdfafafaf6480dfdedffd af016464beaffddffdaffd640700d69dd69d569d000a00d69dd69d569d56 56dfdf80afd7af016464beaffddffdaffd640700d6d69d9d9d56000a00d6 d69d9d9d565656dfdf80afd7af016464beaffddffdaffd640700d69dd69d 569d000a00d69dd69d569d5656dfdf80afd7af016464beaffddffdaffd64 0700d6d69d9d9d56000a00d6d69d9d9d565656dfdfedaf0000fbaf0000f6 af000080affcaf016464bbdffdaffd640700d69dd69d569d000a00d69dd6 9d569d5656dfdfeeaffd00fcaf0000f6af000080affcaf0064badffdaffd 640700d6d69d9d9d56000a00d6d69d9d9d565656dfdfeeaf0200af00fcaf 0000f6af000080afb2affd640700d69dd69d569d000a00d69dd69d569d56 56dfdfeeaf0200af00fcaf0f00afaf00af000000afafaf00af000000fcaf fc0080afbeaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdfef af2000afafaf00afafaf00afaf0000afaf0000afaf0000afaf0000afaf00 00afaf000080afbfaffd640700d69dd69d569d000a00d69dd69d569d5656 dfdfefaf0b00afafaf00afafaf00afaf00fcaf0300afaf00fcaf0000f9af 000080afbfaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff0 af0000fbaf0600afaf00afaf00fcaf0300afaf00fcaf0300afafaffb0080 afbfaffd640700d69dd69d569d000a00d69dd69d569d5656dfdff0aff900 05afaf00afaf00fcaf0300afaf00fcaf0800afaf0000afafaf0080afbfaf fd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff0af0000fbaf06 00afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf000080afbfaffd 640700d69dd69d569d000a00d69dd69d569d5656dfdff1af0000f9af0d00 af00afaf0000afaf0000afaf00fcaf0800afaf0000afaf000080afbfaffd 640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff1af0000f9af0d00 af00afaf00af000000afafaf00fcaf0900afafaf000000af00008aafb964 fdaffd640700d69dd69d569d000a00d69dd69d569d5656dfdfe4af000080 aff4afbb640fdfdfafafaf64646400d6d69d9d9d56000a00d6d69d9d9d56 5656dfdfe4af000080aff4af016464beaffddffdaffd640700d69dd69d56 9d000a00d69dd69d569d5656dfdfe4af000080aff4af016464beaffddffd affd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af0164 64beaffddffdaffd640700d69dd69d569d000d00d69dd69d569d5656dfdf afafaf8064dd64fdaf016464beaffddffdaffd640700d6d69d9d9d56000d 00d6d69d9d9d565656dfdfafafaf8064df6406dfdfafafaf6464beaffddf fdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafafaf6464 8095dfdffdaf016464beaffddffdaffd640700d6d69d9d9d56000f00d6d6 9d9d9d565656dfdfafafaf64648095f2df0064f2df0864dfdfdfafafaf64 64beaffddffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdf afafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464beaf fddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfafafaf 6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464f7af0000c8 affddffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdfafaf af6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464f9affd00 c8affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdfaf afaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464f7af00 00c8affddffdaffd640700d69dd69d569d000f00d69dd69d569d5656dfdf afafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464f7af 0000c8affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656df dfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464f7 af0000c8affddffdaffd640700d69dd69d569d000f00d69dd69d569d5656 dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf6464 f7af0000c8affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d5656 56dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf64 64f7af0000c8affddffdaffd640700d69dd69d569d000f00d69dd69d569d 5656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafafaf 6464f7af0000c8affddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d 565656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfafaf af6464f7af0000c8affddffdaffd640700d69dd69d569d000f00d69dd69d 569d5656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdfaf afaf6464f7af0000c8affddffdaffd640700d6d69d9d9d56000f00d6d69d 9d9d565656dfdfafafaf6464809501dfdff4af0164dff4af096464dfdfdf afafaf6464f7af0000c8affddffdaffd640700d69dd69d569d000f00d69d d69d569d5656dfdfafafaf6464809501dfdff36400dff264fddffdaf0164 64beaffddffdaffd640700d6d69d9d9d56000f00d6d69d9d9d565656dfdf afafaf6464809500dfe364fddffdaf016464beaffddffdaffd640700d69d d69d569d000f00d69dd69d569d5656dfdfafafaf646480dfdfdffdaf0164 64beaffddffdaffd640700d6d69d9d9d56000e00d6d69d9d9d565656dfdf afafaf6480dfdedffdaf016464beaffddffdaffd640700d69dd69d569d00 0a00d69dd69d569d5656dfdf80afd7af016464beaffddffdaffd640700d6 d69d9d9d56000a00d6d69d9d9d565656dfdf80afd7af016464beaffddffd affd640700d69dd69d569d000a00d69dd69d569d5656dfdf80afd7af0164 64beaffddffdaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf 80afd7af016464bbdffdaffd640700d69dd69d569d000a00d69dd69d569d 5656dfdf80afd7af0064badffdaffd640700d6d69d9d9d56000a00d6d69d 9d9d565656dfdf80af8daffd640700d69dd69d569d000a00d69dd69d569d 5656dfdf80af8daffd640700d6d69d9d9d56000a00d6d69d9d9d565656df df80af8daffd640700d69dd69d569d000a00d69dd69d569d5656dfdf80af 8daffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80af8daffd 640700d69dd69d569d000a00569d569d569d5656dfdff8aff3df80afa2af fd640700d6d69d569d56000000fc56059d565656dfdff8aff4df0064f9af fd00f8aff400fbaff70080afceaffd640200d69dfc56ff000000fcd60556 9d5656dfdff8af01dfdff7af016464f9af0000f2af0000faaf0000f7af00 00baaf000091affd640000fad6ff000a00d6d6d69d9d565656dfdff8af01 dfdff7af016464f9af0000f2af0000faaf0000f7af0000baaf000091affd 640200d69dfcd6ff000a00d69dd69d569d5656dfdff8af01dfdff7af0164 64f9af0000fcaffc00faaf0000faaf0000f7af0000fbaf0500af0000afaf fc00fdaf0400af000000fcaffd00fdaf0400af000000fcaffc00fdaf0500 af0000afaffc00fdaf0900af000000afaf00000092affd640700d6d69d9d 9d56000a00d6d69d9d9d565656dfdff8af01dfdff7af016464f9af0900af afaf0000afaf0000fbaf0000faaf0000f7af0000fbaf410000afafaf0000 afaf0000afaf0000afaf0000afaf00afafaf00afaf0000afaf0000afaf00 00afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afaf0091 affd640700d69dd69d569d000a00d69dd69d569d5656dfdff8af01dfdff7 af016464f9af0000f8af0000fbaf0000faaf0000f7af0000fbaf0000f7af 0300afaf00fcaf0400afaf0000fbaf0000fcaf0000f9af0300afaf00fcaf 0000fcaf0300afaf00fcaf0300afaf0091affd640700d6d69d9d9d56000a 00d6d69d9d9d565656dfdff8af01dfdff7af016464f9af0000fcaffb00fb af0000faaf0000f7af0000fbaf0000fbaffb0002afaf00fcaf0a00afafaf 000000afafaf00fcaf0300afafaffb0002afaf00fcaffa0002afaf00fcaf 0300afaf0091affd640700d69dd69d569d000a00d69dd69d569d5656dfdf f8af01dfdff7af016464f9af0900afafaf0000afafaf00fbaf0000faaf00 00f7af0000fbaf0000fcaf080000afafaf00afaf00fcaf0000fbaf040000 afaf00fcaf0b00afaf0000afafaf00afaf00fcaf0000f9af0000fcaf0300 afaf0091affd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff8af 01dfdff7af016464f9af0400afafaf00fcaf0000fbaf0000faaf0000f7af 0000fbaf0000fcaf0000fcaf0300afaf00fcaf0000faaf0300afaf00fcaf 0300afaf00fcaf0300afaf00fcaf0000f9af0000fcaf0300afaf0091affd 640700d69dd69d569d000a00d69dd69d569d5656dfdff8af01dfdff7af01 6464f9af0900afafaf0000afaf0000fbaf0000faaf0000f7af0000fbaf00 00fcaf080000afaf0000afaf00fcaf1a00afaf00afafaf00afaf0000afaf 0000afaf0000afaf0000afaf00fcaf080000afaf0000afaf00fcaf0300af af0091affd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdff8af01 dfdff564f9af0000fcaffd0002af0000fcaf0000faaf0000f7af0000fbaf 0000fbaffd0004af0000af00fcaf0e00afafaf000000afafaf00af000000 fcaffd0004af0000af00fbaffc00fdaf0000fcaf0500afafaf000093affd 640700d69dd69d569d000a00d69dd69d569d5656dfdff8af00dff464f9af 0000ebaf0000d5af000080afecaffd640700d6d69d9d9d56000a00d6d69d 9d9d565656dfdfe4af0000ebaf0000d5af000080afecaffd640700d69dd6 9d569d000a00d69dd69d569d5656dfdfe4affd00efaffd00d5af000080af ecaffd640700d6d69d9d9d56000a00d6d69d9d9d565656dfdf80af8daffd 640700d69dd69d569d000a00d69dd69d569d5656dfdf80af8daffd640700 d6d69d9d9d56000a00d6d69d9d9d565656dfdf80af8daffd640700d69dd6 9d569d000a00d69dd69d569d5656dfdf80af8daffd640700d6d69d9d9d56 000a00d6d69d9d9d565656dfdf80af8daffd640700d69dd69d569d000a00 d69dd69d569d5656dfdf80af8daffd640700d6d69d9d9d56000a00d6d69d 9d9d565656dfdf80af8daffd640700d69dd69d569d000a00d69dd69d569d 5656dfdf80af8daffd640700d6d69d9d9d56000a00d6d69d9d9d565656df df80648a640700d69dd69d569d000900d69dd69d569d5656df8064896407 00d6d69d9d9d56000800d6d69d9d9d565656806488640700d69dd69d569d 000700d69dd69d569d568000860006d6d69d9d9d56000600d6d69d9d9d56 80d684d6059dd69d569d007f00d69dd69d569dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd608 9dd69dd69d9d9d56000200d6d6e49d0156d6809db99d0156d6e49d02569d 000300d69dd6e59d0256d6d6809dbb9d035656d6d6e49d0156007f00d6d6 9d569d569d569d569d569d569d569d569d569d569d569d569d569d5656d6 d6569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d7f569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d56d6d69d569d569d569d 569d569d569d569d569d569d569d08569d569d569d569d000100d6e25601 d6d68056b95601d6d6e356ff0080008000f700 grestore showpage %%Trailer geomview-1.9.4/doc/figs/secondlinelist.eps0000644000175000001440000052357410616356703015540 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: Sep 12 2003 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 227 246 385 516 %%EndComments %%BeginProlog %%BeginPreview: 158 270 8 1080 % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ff62626262626262626262626229a929292929292929292929626262626262626262626262292929 % 29292929292929292962626262626262626262626229292929292929292929292962626262626262 % 62626262622929292929292929292929296262626262626262626262622929292929292929292929 % 29626262626262626262626262292929292929292929a92929626262626262626262626262ff % ff626262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262a96262626262626262626262626262ff % ff29a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2962ff % ff29a9ff292929292929292929626229626262626262626262292929292929292929292929626262 % 62626262626262626229292929292929292929292962626262626262626262626229292929292929 % 29292929296262626262626262626262622929292929292929292929296262626262626262626262 % 62292929292929292929622929626262626262626262626262292929292929292929ff2962ff % ff29a9ff296262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262626262626262a96262ffffffffffffff62a9ff2962ff % ff29a9ff29626262626262626262622962626262626262ff626262ff62ff62626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262626262626262a96262626262626262ff62a9ff2962ff % ff29a9ff29626262626262626262622962626262626262ff6262ff62ff6262ffff6262ffff626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262626262626262a96262626262626262ff62a9ff2962ff % ff29a9ff2962ffffffffffffff62622962626262626262ffff62ff62ff62ff62ff62ff6262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a929626262ffff6262626262a96262626262626262ff62a9ff2962ff % ff29a9ff296262626262626262ff6229626262626262ff626262ff62ffff626262626262ff626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262ff6262626262a96262626262626262ff62a9ff2962ff % ff29a9ff296262ffffffffffffff6229626262626262ff6262ff62ff62ff62ff62ff62ff62626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a929626262ffff6262626262a96262626262626262ff62a9ff2962ff % ff29a9ff296262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262626262626262a96262626262626262ff62a9ff2962ff % ff29a9ff296262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262626262626262a96262626262626262ff62a9ff2962ff % ff29a9ff296262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262a92962626262626262626262a9626262ffffffffffff62a9ff2962ff % ff29a9ff62a9a9a9a9a9a9a9a9626229626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262 % 626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9 % a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262626262626262 % 62a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262a96262a9a9a9a9a9a9a9a9a9ff2962ff % ff2962a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020ff6229ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a950505050505050505050ff5050ff50505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a950505050505050505050ff5050ff5050ffff50ffff505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a950505050505050ffff50ff5050ff50ff505050ff50505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a950505050505050505050ff5050ff50ff505050ff50505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff29a9a950505050505050505050ff505050ff50ffff50ff50505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a95050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b505050505050505050ff505050505050505050505050ff505050505050 % 50505050505050505050505050505050ff5050505050505050505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b505050ff50505050505050505050505050505050505050505050505050 % 505050505050505050505050ff505050ff50505050ff505050505050505050505050505050505050 % 505050505050ff50ffff505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b505050ff505050ff5050ff50ff50ff50ffff50ff505050ff50ff50ff50 % ff50ff50ff50ff50ff50ff50ff50ff50ff50ff50ffff50ff50ff505050ff50ff50ff50ff50ff50ff % 50ff50ff5050ff505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff6262a95050505050509b50505050505050ffff50ff505050505050ff505050ff50ff5050505050 % ff505050ff505050ff50ff5050505050ff50ff50ffff50ff505050ff50ff505050505050505050ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050ff5050ff50ff5050ff50ff50ff50ffff50ff505050ff505050ff50 % ff505050ff50ff50ff50ffff5050ff50ff50ff50ffff50ff50ff505050ff50ff50ff50ff50ff50ff % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % ff50505050505050ff50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050ffff5050505050ffff50505050505050ffff % 5050505050505050ff505050505050505050505050505050505050505050ffff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b2020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050ff50ff50505050505050505050ff50505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a95050505050505050505050ff5050ff50ffff5050ff50ff5050ffff50ffff505050ff5050 % ffff50505050505050505050505050505050505050505050505050505050505050ff505050ffff50 % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a95050505050505050505050ff505050ff505050ff5050ff50ff505050ff505050ff50ff50 % ff5050505050505050505050505050505050505050505050505050505050ffffffff5050ff505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a95050505050505050505050ff505050ff505050ff5050ff50ff505050ff505050ff505050 % 50ff50505050505050505050505050505050505050505050505050505050505050ff5050ff505050 % 5050ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050ff50ff505050ff50ff50ff50ffff50ff50ff50ff505050ff50ff50 % 505050505050505050505050505050505050505050505050505050505050505050ff5050ff50ff50 % ff50ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a950505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b50509b9b9b9b9b9b9b50505050509b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b2050509b9b9b9b9b9b205050505050ff2962ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a209b6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a9b6a6a205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b6a6a209b6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a209b6a6a205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b6a2050506a2050505050509b5050ff5050ff5050505050 % 505050505050505050ff5050ff505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a20509b6a205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b6a2050509b2050505050509b5050ff5050ff5050ffffff % 5050ff5050ffff505050505050505050ff50ff5050ffff5050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b2050509b6a205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b209b9b9b9b2050505050509b5050ffffffff5050ff5050 % 50ff5050505050ff5050505050505050ff5050ffff50505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b9b9b9b9b9b205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b20202020202050505050509b5050ff5050ff5050ff5050 % 50ff5050505050505050505050505050ff5050ffff50505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050ffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff50ff50ff50ff50ff5050ff50ff50ffff50ffff50ff5050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b2020202020205050505050ff6262ff % ff6262a950505050509b5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffff502050509b205050509b2050505050509b5050505050505050505050 % 5050ffff505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b205050509b205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b205050509b205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b205050509b205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050505050 % 505050505050505050ffff5050505050505050505050505050505050505050505050ff5050505050 % 505050505050505050505050505050505050502050509b209b9b9b9b205050505050ff6262ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050ffffff % 5050ff5050ffff5050505050ff505050ff505050ff50ff5050ffff50ffff5050ffffff5050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ffffffff5050ff5050 % 50ff5050505050ff50505050ff50505050ff505050505050ff505050ff50ff505050ff5050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff50505050505050505050ff5050ff50ff505050505050ff505050ff50ff505050ff5050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ffff5050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff50ff50ff50ff505050ff505050ff50ff505050505050ff50ff50ff50ff50ff50ff5050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 5050ffff505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b50505050ff505050ff505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050505050 % 505050505050505050ffff5050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050ffff505050ff505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b50505050ff50ff50ff505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050ff50ff % 50ff50ff50ff50ff50505050ff50ff50ffff50ff50ff50ff50ff50ff505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff50ff505050ff505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff505050ffffff50505050ff505050ffff505050ffffff50ff5050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff6262a950505050509b50505050ff50ff50ff505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff50ff50ff50ff505050ff5050ff50ffff50ff50ff50ff50ff50ff505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 5050ffff505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050ffff50505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050505050 % 505050505050505050ff505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050505050ff505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050ff5050ff5050505050 % 505050505050505050ff505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff505050505050ffff50ff505050ff50ff5050505050ffff50ff50ff % 5050505050ff50ff50ff50ff502050509b205050509b2050505050509b5050ff5050ff5050ff50ff % 50ff50ff50ff50ff50ff505050ff50ff5050ff50ff50ff50ff50ff50505050ff50ffff50ff505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff505050505050ffff5050505050ffffff5050505050ffff50ffffff % 505050505050ffff505050ff502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff505050ffffff50ff5050505050ff50505050ff505050ff5050505050505050ffffffff505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050505050ff505050ffff5050ffff505050ff5050505050ffff50ff5050 % 5050505050ff5050505050ff502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 50ff50505050505050ff5050505050ff50505050ff505050ff5050505050505050ffff5050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050ffff5050ffffffff5050505050ffffff50ff50ffffffff5050ffff % 5050ffffff50ff50ff50ff50502050509b205050509b2050505050509b5050ff5050ff5050ff5050 % 5050ff5050ffff5050ffffff50ffff505050505050ff505050ffff50ff505050ff5050ffff505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b205050509b2050505050509b5050505050505050505050 % 50ff50ff50505050505050505050505050505050ff50ff5050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b209b9b9b9b2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff5050505050505050ff505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050505050 % 5050505050505050ffffffffff505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050505050 % 50505050505050505050ff5050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff50ff50ff50ff5050ff50505050ff50ff50ff50ff50ff5050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff50ff % 50ff50ff50ff50ff5050ff5050ff50ff505050ff50ff50ff50505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff50ff50ffffff5050ff505050505050ff505050ffffff5050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff5050 % 50ff505050ffffff5050ff5050ffffff505050505050ffff50505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff50ff505050505050ff505050505050ff5050505050ff5050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff5050 % 50ff5050505050505050ff5050ff50505050505050ff505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff50ff50ffff505050ff50ff50ffff5050ffff50ffffff50ff505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff5050 % 5050ff5050ffff505050ff505050ffff50ff50505050ff50ff505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50ff50ff505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff6262a950505050509b5050ff505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050505050 % 50505050505050505050ff5050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff50ff5050ff50ff50ff50ff50ff50ff505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff50ff % 50ff50ff50ff50ff5050ff5050ff505050ff50ff50ff50ff50ff50ff5050ff50ff50505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff50ff5050ff505050ff505050ffffff505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff5050 % 50ff505050ffffff5050ff5050ff505050ffffff505050ff505050ff5050ffffff50505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff50ff5050ff505050ff505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff5050 % 50ff5050505050505050ff5050ff5050505050ff505050ff505050ff505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff50ff5050ff50505050ff5050ffff50505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ff5050ff5050 % 5050ff5050ffff505050ff5050ff505050ffffff505050ff50ffffff5050ffff5050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050505050505050505050ff50ff50505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50ff50ff505050505050505050505050505050505050505050ff50ff505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff50505050505050505050505050505050ff50505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff50ff50ff50505050 % 5050505050505050ff50505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ffff50ff5050ffffffff5050ff505050ffffffff50ffff5050505050 % ffff50505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff505050ff50ffff50 % 5050ffffff50505050505050ffff505050ff505050ffff50ffffffff505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b5050ff50ff50505050ff505050ff50ff505050ff5050505050ff505050ff % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ffff5050ff505050ff % 5050ff505050ffff505050505050ff5050505050505050ff50505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff29a9a950505050509b5050ff50ff50ffff50ff505050ff5050505050ff5050505050ff505050ff % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff50ff50ff50505050 % 5050ff5050505050505050505050ff5050505050505050ff50505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff50ff50505050ffffff5050ff50505050ffffff50ffff5050505050 % ffff50505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff5050ffff50ffff50 % 5050ff505050ffffff50ff50ffffff5050ff50ff50ffff5050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050ff5050ff5050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ff505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff50ff50ff50505050 % 5050505050505050ff5050505050505050ff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ffff50505050ff50ff50ffffff505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ff505050ff50ffff50 % 5050ffffff50505050505050ffff50ffffff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ffff5050505050505050ff5050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050ffff5050ff505050ff % 5050ff505050ffff505050505050ff5050ff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff2962ff % ff29a9a950505050509b5050ffff5050505050505050ff5050505050505050505050505050505050 % 505050505050505050505050502050509b202020209b2050505050509b5050ff505050ff50505050 % 5050ff5050505050505050505050ff5050ff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b202020209b205050505050ff2962ff % ff29a9a950505050509b5050ffff50ff505050505050ff50ff505050505050505050505050505050 % 505050505050505050505050502050509b6a2050509b2050505050509b5050ff505050ff50ff50ff % 5050ff5050505050ff50ff50ff50ff5050ff50505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b2050509b6a205050505050ff2962ff % ff29a9a950505050509b5050ff505050505050505050ff5050505050505050505050505050505050 % 505050505050505050505050502050509b6a2050506a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a20509b6a205050505050ff2962ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a209b6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a9b6a6a205050505050ff6262ff % ff6262a950505050509b505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050502050509b6a6a6a6a6a2050505050509b5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050502050509b6a6a6a6a6a205050505050ff6262ff % ff6262a950505050509b202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202050509b20202020202050505050509b2020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020205050202020202020205050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a950505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b205050505050505050505050505050ff6262ff % ff6262a950505050509b6a6a6a20206a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20202020 % 202020202020209b20206a6a6a2050505050505050505050505050509b6a6a6a6a206a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20202020202020202020202020202020 % 2020202020202020202020202020206a6a6a6a205050505050505050505050505050ff6262ff % ff6262a950505050509b6a6a20509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20505050 % 505050505050509b205020206a2050505050505050505050505050509b6a6a20209b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20505050505050505050505050505050 % 5050505050505050505050509b205020206a6a205050505050505050505050505050ff6262ff % ff6262a950505050509b202050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20505050 % 505050505050509b205050509b2050505050505050505050505050509b202050509b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20505050505050505050505050505050 % 5050505050505050505050509b205050509b9b205050505050505050505050505050ff6262ff % ff6262a950505050509b6a6a9b509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20505050 % 505050505050509b20509b9b6a2050505050505050505050505050509b6a6a9b9b9b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20505050505050505050505050505050 % 5050505050505050505050509b20509b9b6a6a205050505050505050505050505050ff6262ff % ff6262a950505050509b6a6a6a9b9b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a209b9b9b % 9b9b9b9b9b9b9b9b209b6a6a6a2050505050505050505050505050509b6a6a6a6a9b6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b209b6a6a6a6a205050505050505050505050505050ff6262ff % ff6262a950505050509b202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202050505050505050505050505050509b2020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020205050505050505050505050505050ff6262ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020202020209b5050505050ff2962ff % ff29a9a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff2962ff % ff29a9a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff2962ff % ff29a9a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff2962ff % ff29a9a9505050505020205050505050505050505050505050ff5050ff5050505050505050505050 % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff2962ff % ff29a9a9505050505020205050505050505050505050505050ff5050ff50ffff50ffff5050ff5050 % 5050505050ff50ffffffff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff2962ff % ff29a9a9505050505020205050505050505050505050505050ffffff50505050ff50505050505050 % 5050505050ff50ff5050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff2962ff % ff6262a9505050505020205050505050505050505050505050ff505050505050ff50505050505050 % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff6262ff % ff6262a9505050505020205050505050505050505050505050ff50505050ffffff50ff5050505050 % 5050ffffffff50ffff50ff5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff6262ff % ff6262a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff6262ff % ff6262a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff6262ff % ff6262a950505050502020509b202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff29a9a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bffffffffffffff50ffffffffffffffffffffffff50ffffffffff % ffffffffffffffffffffffffffffffffff50ffffffff50ffffffffffff50ffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bff50ffffff50ffffff50ffff5050ffff50ffffffff5050ffff50 % 5050ffff50ff5050ffff50ffff50ff505050ff5050ff50ffff5050ffffffff50ffff5050ffff5050 % ffffff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bffffffffff5050ff50ffffffffffff50ffffff50ff50ff50ffff % ff50ffffffffffffffffff50ffffffffff50ffffffff50ffffffffff50ff50ffffffffff50ffffff % 50ffffffff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bffffffffff5050ff50ffffffffffff50ffffff50ff50ff50ffff % ff50ffffff50ffffffffff50ffffffffff50ff50ffff50ff50ffffff50ff50ffffffffffffffffff % 50ffffffff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9b50ffff50ff50ffff50ff50ff50ff5050ff50ffffff50ff50ff50 % ff50ffffff50ff50ff50ff5050ffff50ff50ff50ffff50ff50ff50ffffff50ff50ff50ff50ff50ff % 50ffffffff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bffffffffffffffffffffffffffffffffffffffffffffffffffff % ff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9bffffffffffffffffff5050ffffffffff5050ffffffffffffff50 % 50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5050ffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffff209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff2962ff % ff29a9a950505050502020509b9b50505050505050ff505050505050505050505050ff5050505050 % 5050505050505050505050505050505050ff50505050ff5050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff2962ff % ff6262a950505050502020509b9b50ff505050ff5050ff50ff50ff50ffff50ff505050ff50ff50ff % 50ff50ff50ff50ff50ff50ff50ff50ff50ff50ff5050ff50ff50ff50505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050ffff50ff505050505050ff505050ff50ff50ff5050 % 50ff50505050ffff505050ff5050505050ff50ffff50ff5050ffff50505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9bff50505050ff5050ff5050505050ffff5050505050ff50ff5050 % 50ff505050ff5050505050ffff50505050ff50505050ff50ff505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9bff5050ffffff505050ff5050ffff5050ff50505050ff50ff50ff % ffff50505050ff50ff50ff50ff5050ffffff50ffffff50ff50ff50ff505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050ff50ff50505050ff50ff50505050505050ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b5050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b2020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020202020202020209b509b9b5050505050ff6262ff % ff6262a950505050502020509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b509b9b5050505050ff6262ff % ff6262a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff6262ff % ff6262a9505050505020205050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050509b9b5050505050ff6262ff % ff29a9a9505050505020209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050ff2962ff % ff29a9a95050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a950505050505050ff50ff50505050505050505050505050ff50ff50505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a95050505050505050505050ffff50505050ffff5050ff50ff50ff50ffff505050ff505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a95050505050505050ff50505050ff5050ff505050ff5050ff50ff505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff6262a9505050505050505050ff505050505050ff505050ff50ffff50ff505050ff505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a95050505050505050ff5050ffff50505050ffff5050ff5050ffff50ffff50505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a95050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b505050505050505050ff505050505050505050505050ff505050505050 % 50505050505050505050505050505050ff5050505050505050505050ff5050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff6262a95050505050509b505050ff50505050505050505050505050505050505050505050505050 % 505050505050505050505050ff505050ff50505050ff505050505050505050505050505050505050 % 505050505050ff505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff6262ff % ff29a9a95050505050509b50505050505050ffff50ff505050505050ff505050ff50ff5050505050 % ff50505050505050ff50ff5050505050ff505050ffff5050505050ff50ff5050505050ff505050ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b50505050505050ffff50ff505050505050ff505050ff50ff5050505050 % ff505050ff505050ff50ff5050505050ff50ff50ffff50ff505050ff50ff505050505050505050ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050ff5050ff50ff5050ff50ff50ff50ffff50ff505050ff505050ff50 % ff505050ff50ff50ff50ffff5050ff50ff50ff50ffff50ff50ff505050ff50ff50ff50ff50ff50ff % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % ff50505050505050ff50505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050ffff5050505050ffff50505050505050ffff % 5050505050505050ff505050505050505050505050505050505050505050ffff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b5050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505020505050505050ff2962ff % ff29a9a95050505050509b2020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff29a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff2962ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff29a9a95050505050505050502020202020202020202020202020202020202020209b5050505050 % 50505050505050505050505050505050505050505050505050505050202020202020202020202020 % 2020202020202020209b505050505050505050505050505050505050505050505050505050505050 % 5050502020202020202020202020202020202020202020209b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505050505050505050505050202050505050505050505050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050505050505050505050509b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505050505050505050505050202050505050505050505050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050505050505050505050509b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505050505050505050505050202050505050505050505050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050505050505050505050509b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050ff50ff505050505050505050509b9b5050505050 % 5050505050505050505050505050505050505050505050505050505020205050ff50505050ff5050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050ff50505050ff505050505050509b505050505050505050ff2962ff % ff29a9a9505050505050505050205050505050ff505050ff5050505050505050509b9b5050505050 % 5050505050505050505050505050505050505050505050505050505020205050ff50505050ffffff % 50ffff5050ff50509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050ff5050ffffff50ffff505050509b505050505050505050ff2962ff % ff29a9a9505050505050505050205050505050ff505050ff50ff505050505050509b9b5050505050 % 5050505050505050505050505050505050505050505050505050505020205050ffffff5050ff5050 % 505050ff505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050ffffffff50505050ff505050ff5050509b505050505050505050ff2962ff % ff29a9a9505050505050505050205050505050ff505050ff5050ff5050505050509b9b5050505050 % 5050505050505050505050505050505050505050505050505050505020205050ff50505050ff5050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050ff50505050ff505050505050509b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050ff50ff50505050ff50505050509b9b5050505050 % 5050505050505050505050505050505050505050505050505050505020205050ff50505050ff5050 % 50ff50ff505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050ff5050ff50ff50ff50ff5050509b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505050505050505050505050202050505050505050505050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050505050505050505050509b505050505050505050ff2962ff % ff29a9a950505050505050505020505050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505050505050505050505050202050505050505050505050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050505050505050505050509b505050505050505050ff2962ff % ffa9a9a950505050505050505020505050505050505050505050505050505050509b9b5050505050 % 50505050505050505050505050505050505050505050505050505050202050505050505050505050 % 50505050505050509b9b505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050505050505050505050509b505050505050505050ff29a9ff % ff6262a9505050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050 % 5050505050505050505050505050505050505050505050505050505020209b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b505050505050505050505050505050505050505050505050505050505050 % 50505020209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050505050505050ff6262ff % ff6262a95050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050 % 50505050505050505050505050505050505050505050505050505050209b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b505050505050505050505050505050505050505050505050505050505050 % 505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050ff6262ff % ff6262a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6262ff % ff296262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262a96262626262626262626262626262ff % ffa9a9a9a9a9a9a9a9a9a9a9a9626229626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262 % 626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9 % a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262626262626262626262 % 62a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262a92962a9a9a9a9a9a9a9a9a9a9a9a9ff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 329 string def gsave 227.04 246.12 translate 157.92 269.76 scale 329 562 8 [ 329 0 0 -562 0 562 ] { picstr readstring } image 80008000b7000000e3d6019d5680d680d6f9d6015656e2d6019d007f00d6 d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656 d6d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69d7fd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d48d69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d56d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9d9d0003 00d69dd6e59d0256d6d6809d809dfb9d035656d6d6e49d0156000200d6d6 e49d0156d6809d809df99d0156d6e49d02569d007f00d69dd69d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d567f 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d56419d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d56fb9d0156007f00d6d69d9d9d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d7f 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d48569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d9d9dd69d569d000600d69dd69d569d 80008000c50006d6d69d9d9d56000700d6d69d9d9d560080d680d6c7d607 00d69dd69d569d007f00d69dd69d569d00d6d69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd6d6d69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd67f9dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6489dd69d d69dd69dd69dd69dd69dd69d9dd6d69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d00d6d69d9d9d56000800d6d69d9d9d5600d6ea9d0156d6809d929d01 56d6e99d0256d6d6eb9d085600d69dd69d569d000900d69dd69d569d00d6 d6eb9d0256d6d6809d939d0256d6d6eb9d025656d6fc9df200fd9d095656 00d6d69d9d9d56000800d6d69d9d9d5600d6eb9d025656d6f19df900069d 00009d9d0000809db09d025656d6e99d0656d6d69d9d9d00f49d0000fc9d 085600d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6f29d01 0000fa9d0500009d9d0000809daf9d0256d6d6eb9d025656d6fc9d0000f4 9d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d0256 56d6f19d010000f79d010000809daf9d025656d6e99d0656d6d69d9d9d00 f49d0d00009d9d9d5600d69dd69d569d000900d69dd69d569d00d6d6eb9d 0256d6d6f39d010000fa9d0800009d9d00009d9d9dfc00fc9dfc00809dbd 9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d 56000800d6d69d9d9d5600d6eb9d025656d6f29d010000fa9d1500009d9d 00009d9d00009d9d00009d9d00009d9d0000809dbf9d025656d6e99d0656 d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000b00d69dd69d56 9d00d6d69d9df000fd9d0256d6d6f39dfa00139d9d00009d00009d9d0000 9d9d9d00009d9d0000809dba9d0256d6d6f99dfc00f69d025656d6fc9d00 00f49d0d00009d9d565600d6d69d9d9d56000c00d6d69d9d9d5600d69d9d 9d00f29d05009d9d5656d6f39d010000fa9d0700009d9d00009d9dfa00fc 9dfd00809dbd9d025656d6f89d04009d9d0000f69d0656d6d69d9d9d00f4 9d0d00009d9d9d5600d69dd69d569d000c00d69dd69d569d00d6d69d9d00 f29d0600009d9d56d6d6f49d010000fa9d0800009d9d00009d0000f59d01 0000809dbd9d0256d6d6f99d04009d9d0000f79d025656d6fc9d0000f49d 0d00009d9d565600d6d69d9d9d56000b00d6d69d9d9d5600d69d9d9def00 039d5656d6f39d010000fa9d0800009d9d00009d0000fa9d0600009d9d9d 0000809dbe9d025656d6f89dfb00f69d0656d6d69d9d9d00f49d0d00009d 9d9d5600d69dd69d569d000900d69dd69d569d00d6d6fc9df100049d9d56 d6d6f59d010000fa9d1500009d9d00009d9d00009d9d00009d9d00009d9d 0000809dbc9d0256d6d6f89dfc00f79d025656d6fc9d0000f49d0d00009d 9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d025656d6f49d01 0000fa9d0800009d9d00009d9d9dfc00fc9dfc00809dbc9d025656d6e99d 0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d000900d69dd6 9d569d00d6d6eb9d0256d6d6809d939d0256d6d6eb9d025656d6fc9d0000 f49d0d00009d9d565600d6d69d9d9d56000800d6d69d9d9d5600d6eb9d02 5656d6809d939d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d56 00d69dd69d569d000900d69dd69d569d00d6d6eb9d0256d6d6809d939d02 56d6d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d5600 0800d6d69d9d9d5600d6eb9d025656d6809d939d025656d6e99d0556d6d6 9d9d9df100fd9d085600d69dd69d569d000900d69dd69d569d00d6d6eb9d 0256d6d6809d939d0256d6d6eb9d025656d6fa9df3000b9d9d565600d6d6 9d9d9d56000800d6d69d9d9d5600d6eb9d025656d6809d939d025656d6e9 9d0256d6d6eb9d085600d69dd69d569d007f00d69dd69d569d00d69d9d56 9d569d569d569d569d569d569d569d569d569d56d6569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d567f9d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d56489d569d569d569d569d569d569d569d56d6569d569d569d56 9d569d569d569d569d569d569d569d5656d69d569d569d569d569d569d56 9d569d569d569d569d565600d6d69d9d9d560008009d569d9d9d56009de9 56009d80569156009de856009de9560700d69dd69d569d000000fb56009d 80008000c50001d6d6fc56ff000000fcd6029d565680df80dfc7df0200d6 9dfcd6ff000800d6d6d69d569d56df80af80afc9af086400d6d69dd6d6d6 000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d6 9dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d 5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d 569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d560008 00d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd6 9d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656 df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80 afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af08 6400d69dd69d569d000800d69dd69d569d56dff3aff90004af00afaf0080 af80afe2af086400d6d69d9d9d56000800d6d69d9d9d5656dff3af0000f9 af0600afaf00afaf0080af80afe5af086400d69dd69d569d000800d69dd6 9d569d56dff3af0000f6af0300afaf0080af80afe5af086400d6d69d9d9d 56000800d6d69d9d9d5656dff3af0000f9af0a00afaf00af000000afafaf fc00fdaf0300af000080af80aff4af086400d69dd69d569d000800d69dd6 9d569d56dff3af0000f9af1300afaf00afaf00afafaf0000afaf0000afaf 000080af80aff2af086400d6d69d9d9d56000800d6d69d9d9d5656dff3af fa000cafaf00afaf00afaf00afafaf00fcaf0300afaf0080af80aff1af08 6400d69dd69d569d000800d69dd69d569d56dff3af0000f9af0900afaf00 afaf00afafaffa0002afaf0080af80aff1af086400d6d69d9d9d56000800 d6d69d9d9d5656dff3af0000f9af0a00afaf00afaf00afafaf00f9af0000 80af80aff1af086400d69dd69d569d000800d69dd69d569d56dff3af0000 f9af0a00afaf00afaf00afafaf00f9af000080af80aff1af086400d6d69d 9d9d56000800d6d69d9d9d5656dff3af0000f9af1200afaf00afaf00afaf af0000afaf0000afaf0080af80aff1af086400d69dd69d569d000800d69d d69d569d56dff3af0000f9af0a00afaf00afafaf0000afaffc00fdaf0000 80af80aff1af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80af c9af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af0864 00d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd6 9d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d5600 0800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69d d69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d56 56df80af80afc9af086400d69dd69d569d000800d69dd69d569d56dff4af 80648064e164f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af 80648064e26400dff4af086400d69dd69d569d000800d69dd69d569d56df f4af01646480af80afe5af01dfdff4af086400d6d69d9d9d56000800d6d6 9d9d9d5656dff4af01646480af80afe5af01dfdff4af086400d69dd69d56 9d000800d69dd69d569d56dff4af01646480af80afe5af01dfdff4af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480af80afe5af01 dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4af01646480 af80afe5af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d5656df f4af01646480af80afe5af01dfdff4af086400d69dd69d569d000800d69d d69d569d56dff4af01646480af80afe5af01dfdff4af086400d6d69d9d9d 56000800d6d69d9d9d5656dff4af01646480af80afe5af01dfdff4af0864 00d69dd69d569d000800d69dd69d569d56dff4af016464f8af0000f6af00 00e6af0000d8af0000faaf0000e8af0000daaf0400afafaf0088af01dfdf f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af016464f8af00 00f6af0000e6af0000d8af0000faaf0000f6af0000f3af0000daaf0600af 00af00af008aaf01dfdff4af086400d69dd69d569d000800d69dd69d569d 56dff4af016464f9af0000f6af0000e6af0000d8af0000f9af0000f6af00 00f4af0000daaf0600afafaf00000089af01dfdff4af086400d6d69d9d9d 56000800d6d69d9d9d5656dff4af016464f9af0300afaf00fcaf0e00afaf 00afafaf000000af00afafaffc00fdaffd000caf00afafaf00afaf00af00 0000fcaffd0009af00afaf00af0000afaffc00fdaf0400af000000fcaf0b 00afafaf000000af00afafaffc0007afaf000000afafaffc00fcaf0b00af afaf000000af00afafaffc00fcaffc00fdaf0700af0000afaf0000fcaf07 00afaf00af00af008aaf01dfdff4af086400d69dd69d569d000800d69dd6 9d569d56dff4af016464f9af0300afaf00fcaf7f00afaf00afaf0000afaf 0000afaf0000afaf0000af0000afaf0000afafaf00afaf0000afaf0000af af0000afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afaf af00afaf0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000 afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf00000eaf af0000afaf0000afaf00afafaf00fcaf000088af01dfdff4af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff4af016464faaf0400afafaf00fcaf 0600af00afafaf00fcaf0300afaf00faaf0000fcaf0700afaf00afafaf00 fcaf0300afaf00fcaf0300afaf00f7af0300afaf00fcaf0700afaf00afaf af00fcaf0000f9af0300afaf00f8af0700afaf00afafaf00fcaf0300afaf 00fcaf0300afaf00fcaf0e00afaf00afafaf00afafaf00afaf0082af01df dff4af086400d69dd69d569d000800d69dd69d569d56dff4af016464faaf 0400afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fbaffb0002afaf00 fcaf0700afaf00afafaf00fcaf0300afafaffb0002afaf00fcaffb0006af af00afafaf00fcaf0200afaffa0002afaf00fcaf0e00afaf00afafaf00af afaf00afaf0082af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d 5656dff4af016464faaf0400afafaf00fcaf0600af00afafaf00fcaf0300 afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300af af00fcaf080000afafaf00afaf00fcaf0700afaf00afafaf00fcaf1b00af af0000afafaf00afaf00afafaf0000afafaf00afaf00afafaf00fcaf0300 afaf00f9af0000fcaf0e00afaf00afafaf00afafaf00afaf0082af01dfdf f4af086400d69dd69d569d000800d69dd69d569d56dff4af016464fbaf00 00fcaf0000fcaf010000fcaf0000fcaf0300afaf00fcaf0200af00fcaf02 00af00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000fcaf0300af af00fcaf0200af00fcaf0000fcaf0300afaf00fcaf0700afaf00afafaf00 fcaf0200af00fcaf0000fcaf0300afaf00f9af0000fcaf0d00afaf00afaf af00afafaf00af0081af01dfdff4af086400d6d69d9d9d56000800d6d69d 9d9d5656dff4af016464fbaf0000fcaf060000afaf000000fcaf160000af af0000afaf0000afaf0000af0000afaf0000af00fcaf0000fcaf0b00afaf 0000afaf0000afaf00fcaf0f0000afaf0000afaf0000afaf0000af00fcaf 1b0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000af00fc af220000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00afafaf 00afafaf00af0081af01dfdff4af086400d69dd69d569d000800d69dd69d 569d56dff4af016464fbaf0000fbaffd0002af0000fbaffd0004af00afaf affc00fdaffd0003af00af00fcaf0000fcaf0b00afafaf000000af00afaf 00fbaffd000baf0000af00af000000afaf00fbaffd0017af00afafaf0000 00af0000afaf0000afaf000000af000000fbaffd0004af00afafaffc00fc affc00fdaf0a00afafaf00afafaf00af0081af01dfdff4af086400d6d69d 9d9d56000800d6d69d9d9d5656dff4af016464e6af0000f2af0000edaf00 00f1af0000d0af000080afe4af01dfdff4af086400d69dd69d569d000800 d69dd69d569d56dff4af016464ebaf050000afaf0000f7af050000afaf00 00f2af050000afaf0000f1af0000d5af050000afaf000080afe4af01dfdf f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af016464eaaffc 00f5affc00f0affc00f0af0000d4affc0080afe3af01dfdff4af086400d6 9dd69d569d000800d69dd69d569d56dff4af01646480af80afe5af01dfdf f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480af80 afe5af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4af 01646480af80afe5af01dfdff4af086400d6d69d9d9d56000800d6d69d9d 9d5656dff4af01646480af80afe5af01dfdff4af086400d69dd69d569d00 0800d69dd69d569d56dff4af01646480af80afe5af01dfdff4af086400d6 d69d9d9d56000800d6d69d9d9d5656dff4af01646480df80dfe3dff4af08 6400d69dd69d569d000800d69dd69d569d56dff4af006480df80dfe2dff4 af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400 d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d 9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d0008 00d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d 9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56 df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80 afc9af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af08 6400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69d d69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56 000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d6 9dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d 5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656dff3affb00fbaf0000d9af0000b8 aff90004af00afaf0080afddaf086400d69dd69d569d000800d69dd69d56 9d56dff3af0000fcaf050000afafaf00eaaf0000f0af0000b8af0000f9af 0300afaf0080afddaf086400d6d69d9d9d56000800d6d69d9d9d5656dff3 af0000fbaf0000e6af0000a7af0000f6af000080afddaf086400d69dd69d 569d000800d69dd69d569d56dff3af0000faaf0b00afaf00afaf00af0000 afaffc00fcaffc0006af000000afafaffc00fdaf0800af0000af00afafaf fc00fcaffd00c6af0000f9af0600afaf00afafaffc00fcaffd0080afebaf 086400d6d69d9d9d56000800d6d69d9d9d5656dff3af0000faaf3a00afaf 00afaf0000afafaf0000afaf0000afaf0000afaf0000af00afafaf0000af af0000afaf0000afafaf00afaf0000afaf0000afaf00afafaf00c7af0000 f9af1200afaf00afaf0000afaf0000afaf00afafaf0080afecaf086400d6 9dd69d569d000800d69dd69d569d56dff3af0000faaf0600afaf00afaf00 fcaf0000fcaf0300afaf00faaf0400afafaf00fcaf0300afaf00fcaf0300 afaf00fcaf0400afaf0000c4affa0008afaf00afaf00afaf00fcaf0400af af000080afe9af086400d6d69d9d9d56000800d6d69d9d9d5656dff3af00 00faaf0600afaf00afaf00fcaffa0002afaf00faaf0400afafaf00fcaf03 00afaf00fcaf0200afaffa00fdaffd00c6af0000f9af0500afaf00afaffa 00fdaffd0080afebaf086400d69dd69d569d000800d69dd69d569d56dff3 af0000faaf0600afaf00afaf00fcaf0000f9af0000faaf0400afafaf00fc af0300afaf00fcaf0300afaf00f6af010000c7af0000f9af0600afaf00af af00f6af01000080afecaf086400d6d69d9d9d56000800d6d69d9d9d5656 dff3af0000fbaf0700afafaf00afaf00fcaf0000f9af0000fcaf0600af00 afafaf00fcaf0300afaf00fcaf0300afaf00f5af0000c7af0000f9af0600 afaf00afaf00f5af000080afecaf086400d69dd69d569d000800d69dd69d 569d56dff3af0000fcaf080000afafaf00afaf00fcaf1b0000afaf0000af af0000afaf0000af00afafaf0000afaf0000afaf00fcaf0f00afaf0000af af0000afaf00afafaf00c7af0000f9af1200afaf00afaf0000afaf0000af af00afafaf0080afecaf086400d6d69d9d9d56000800d6d69d9d9d5656df f3affb00fbaf0300afaf00fbaffc00fcaffc00fdaf030000afaffc00fdaf 0000fcaf0300afafaffc00fcaffd00c6af0000f9af0600afaf00afafaffc 00fcaffd0080afebaf086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d 569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6afa264fcaff164f6af8064eb64fcaff164f6af08 6400d69dd69d569d000800d69dd69d569d56dff6afa36400dffcaff26400 dff6af8064ec6400dffcaff26400dff6af086400d6d69d9d9d56000800d6 d69d9d9d5656dff6af016464a6af01dfdffcaf016464fb9500dffb9501df dff6af01646480afefaf01dfdffcaf016464fb9500dffb9501dfdff6af08 6400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffc af016464fc9502dfdf64fc9501dfdff6af01646480afefaf01dfdffcaf01 6464fc9502dfdf64fc9501dfdff6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6af016464a6af01dfdffcaf016464fc9502dfdf64fc9501df dff6af01646480afefaf01dfdffcaf016464fc9502dfdf64fc9501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af046464afafafac 00fdaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af01646480 afefaf01dfdffcaf0e6464959595dfdfaf6464959595dfdff6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6af046464afafafac00fdaf01df dffcaf0e6464959595dfdfaf6464959595dfdff6af01646480afefaf01df dffcaf0e6464959595dfdfaf6464959595dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af046464afafafac00fdaf01dfdffcaf0e64 649595dfdfafafaf64649595dfdff6af016464fcaf0000faaf0300afaf00 e3affd00f5af0000aaaf01dfdffcaf0e64649595dfdfafafaf64649595df dff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af046464afaf afac00fdaf01dfdffcaf0e64649595dfdfafafaf64649595dfdff6af0164 64fcaf0000faaf0300afaf00e5af060000afafaf0000f7af0000aaaf01df dffcaf0e64649595dfdfafafaf64649595dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af046464afafafac00fdaf01dfdffcaf0464 6495dfdffbaf04646495dfdff6af016464fcaf0000faaf0000e2af0000fb af0000f7af0000aaaf01dfdffcaf04646495dfdffbaf04646495dfdff6af 086400d6d69d9d9d56000800d6d69d9d9d5656dff6af046464afafafac00 fdaf01dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf0000 faaf0a00afaf00afaf00af000000fcaffd0004af00afafaffc00fdaf0000 f7af0000fcaf0900af00af000000afafaffc00b5af01dfdffcaf04646495 dfdffbaf04646495dfdff6af086400d69dd69d569d000800d69dd69d569d 56dff6af046464afafafac00fdaf01dfdffcaf036464dfdff76401dfdff6 af016464fcaf0000faaf1e00afaf00afaf0000afaf0000afaf0000afaf00 00afaf0000afaf0000afaf00f7af0000fcaf0e00af0000afaf0000af0000 afaf0000b6af01dfdffcaf036464dfdff76401dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af046464afafafac00fdaf01dfdffcaf 026464dff66401dfdff6af016464fcaff80005afaf00afaf00fcaf0300af af00fcaf0300afaf00fcaf0300afaf00f7af0000fcaf0200af00fcaf0200 af00fcaf0000b6af01dfdffcaf026464dff66401dfdff6af086400d69dd6 9d569d000800d69dd69d569d56dff6af046464afafafac00fdaf01dfdffc af016464f59501dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf 0300afaf00fcaf0200afaffa0002afaf00f7af0000fcaf0200af00fcaf01 00affa00b6af01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56 000800d6d69d9d9d5656dff6af046464afafafac00fdaf01dfdffcaf0164 64f3dff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fc af0300afaf00f9af0000f7af0000fcaf0200af00fcaf0200af00b1af01df dffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d56 9d56dff6af046464afafafac00fdaf01dfdffcaf016464f6df0264dfdff6 af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0300af af00f8af0000fbaf0300afaf00fcaf0200af00fcaf0200af00b1af01dfdf fcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d56 56dff6af066464afafaf00afae00fdaf01dfdffcaf036464dfdff9af0364 64dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf3000afaf0000 afaf0000afaf0000afaf0000afafaf0000afafaf0000afaf0000afaf0000 af0000afaf0000af0000afaf0000b6af01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af066464afafaf00 afae00fdaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf00 00faaf0600afaf00afaf00fcaf0b00afafaf000000af00afafaffc00faaf fd00fbaffd000aaf00af00af000000afafaffc00b5af01dfdffcaf016464 f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af04 6464afafafac00fdaf01dfdffcaf036464dfdff9af036464dfdff6af0164 64e2af00008eaf01dfdffcaf016464f3dff6af086400d69dd69d569d0008 00d69dd69d569d56dff6af046464afafafac00fdaf01dfdffcaf036464df dff9af036464dfdff6af016464e7af050000afaf00008eaf01dfdffcaf01 6464f6df0264dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656df f6af046464afafafac00fdaf01dfdffcaf036464dfdff9af036464dfdff6 af016464e6affc008daf01dfdffcaf036464dfdff9af036464dfdff6af08 6400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffc af036464dfdff9af036464dfdff6af01646480afefaf01dfdffcaf036464 dfdff9af036464dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464 80afefaf01dfdffcaf036464dfdff9af036464dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf036464dfdf f9af036464dfdff6af01646480afefaf01dfdffcaf036464dfdff9af0364 64dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 a6af01dfdffcaf036464dfdff9af036464dfdff6af01646480afefaf01df dffcaf036464dfdff9af036464dfdff6af086400d69dd69d569d000800d6 9dd69d569d56dff6af016464a6af01dfdffcaf036464dfdff9af036464df dff6af01646480afefaf01dfdffcaf036464dfdff9af036464dfdff6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffc af036464dfdff9af036464dfdff6af016464fcaf0000faaf0300afaf00e6 affb00fbaf0000d6af0000ceaf01dfdffcaf036464dfdff76401dfdff6af 086400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdf fcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0300afaf00 e6af0000fcaf050000afafaf00d6af0000ceaf01dfdffcaf026464dff664 01dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 a6af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf 0000e3af0000fbaf0000d2af0000ceaf01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01df dffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0a00afaf 00afaf00af000000fcaffd0004af00afafaffc00fdaf0000faaf0600afaf 00afafaffc00fdaf0700af0000afaf0000fcaffc00fdaf0400af000000fc affd0001af00ceaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdf f9af036464dfdff6af016464fcaf0000faaf1e00afaf00afaf0000afaf00 00afaf0000afaf0000afaf0000afaf0000afaf00faaf2e00afaf00afaf00 00afaf0000afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf 0000afaf0000afaf0000ceaf01dfdffcaf016464f59501dfdff6af086400 d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf03 6464dfdff9af036464dfdff6af016464fcaff80005afaf00afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00faaf0300afaf00f9af0e00af af00afafaf00afafaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf00 00ceaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdff9af036464 dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf 0200afaffa0002afaf00faaf0600afaf00afafaffb000dafaf00afafaf00 afafaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000ceaf01dfdf fcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d 56dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00f9 af0000faaf1900afaf00afaf0000afafaf00afaf00afafaf00afafaf00af af00fcaf0300afaf00fcaf0300afaf00fcaf0000ceaf01dfdffcaf016464 f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af01 6464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000 faaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000fbaf 0700afafaf00afaf00fcaf0e00afaf00afafaf00afafaf00afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0000ceaf01dfdffcaf016464f59501dfdf f6af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf03 00afaf00aeaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf 0000faaf0600afaf00afaf00fcaf1300afaf0000afaf0000afaf0000afaf 0000afaf00fcaf230000afafaf00afaf0000afaf0000afaf00afafaf00af afaf00afaf0000afaf0000afaf00fcaf0800afaf0000afaf0000ceaf01df dffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6af016464fcaf0300afaf00aeaf01dfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0b00afafaf 000000af00afafaffc00fdaffb00fbaf1600afafaf000000af0000af00af afaf00afafaf00afafaffc00fdaf0000fcaf0800afafaf000000af00ceaf 01dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd6 9d569d56dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6 af016464e2af00008eaf01dfdffcaf016464f59501dfdff6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464 dfdff9af036464dfdff6af016464e7af050000afaf00008eaf01dfdffcaf 016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56df f6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464e6 affc008daf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d5600 0800d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdff9af03 6464dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af0864 00d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf 036464dfdff9af036464dfdff6af01646480afefaf01dfdffcaf016464f5 9501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af0164 64a6af01dfdffcaf036464dfdff9af036464dfdff6af01646480afefaf01 dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d 569d56dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af 01646480afefaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d 56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdff9 af036464dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af 086400d69dd69d569d000800d69dd69d569d56dff6af016464f7af0000f9 af0000b8af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf00 00faaf0300afaf00e6affb00eeaf0000b0af01dfdffcaf016464f59501df dff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f8af 010000f9af0000b8af01dfdffcaf036464dfdff9af036464dfdff6af0164 64fcaf0000faaf0300afaf00e6af0000fcaf010000f0af0000b0af01dfdf fcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d 56dff6af016464f9af0200af00f9af0000b8af01dfdffcaf036464dfdff9 af036464dfdff6af016464fcaf0000faaf0000e3af0000fbaf0000f0af00 00b0af01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6af016464faaf0b00afaf00afafaf000000af00b8af 01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0a00 afaf00afaf00af000000fcaffd0004af00afafaffc00fdaf0000faaf0300 afafaffc00fcaffd0004af00afafaffc00fcaffc00bfaf01dfdffcaf0164 64f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af 016464fbaf0c00afafaf00afaf0000afaf0000b8af01dfdffcaf036464df dff9af036464dfdff6af016464fcaf0000faaf1e00afaf00afaf0000afaf 0000afaf0000afaf0000afaf0000afaf0000afaf00faaf2000afaf0000af af0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000c0af01 dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d 9d5656dff6af016464fcaf0000fcaf0300afaf00fcaf0000b8af01dfdffc af036464dfdff9af036464dfdff6af016464fcaff80005afaf00afaf00fc af0300afaf00fcaf0300afaf00fcaf0300afaf00faaf0300afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0300afaf00bbaf01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 fcaf0000fcaf0300afaf00fcaf0000b8af01dfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00 fcaf0200afaffa0002afaf00faaf0300afaf00fcaf0300afaf00fcaf0200 afaffa0002afaf00bbaf01dfdffcaf016464f59501dfdff6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6af016464fcaff90001af00fcaf00 00b8af01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000fa af0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000faaf03 00afaf00fcaf0300afaf00fcaf0300afaf00f9af0000bbaf01dfdffcaf01 6464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6 af016464f7af0300afaf00fcaf0000b8af01dfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00 fcaf0300afaf00f9af0000fbaf0400afafaf00fcaf0300afaf00fcaf0300 afaf00f9af0000fcaf0000c0af01dfdffcaf016464f59501dfdff6af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f7af0800afaf00 00afaf0000b8af01dfdffcaf036464dfdff9af036464dfdff6af016464fc af0000faaf0600afaf00afaf00fcaf1300afaf0000afaf0000afaf0000af af0000afaf00fcaf220000afafaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000afaf0000afaf0000c0af01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464f7af0800 afafaf000000af00b8af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fcaf0000faaf0600afaf00afaf00fcaf0b00afafaf000000af00afaf affc00fdaffb00faaffc00fcaffd0004af00afafaffc00fcaffc00bfaf01 dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d 9d5656dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af 016464e2af00008eaf01dfdffcaf016464f59501dfdff6af086400d69dd6 9d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf036464df dff9af036464dfdff6af016464e7af050000afaf00008eaf01dfdffcaf01 6464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464e6af fc008daf01dfdffcaf016464f59501dfdff6af086400d69dd69d569d0008 00d69dd69d569d56dff6af016464a6af01dfdffcaf036464dfdff9af0364 64dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af086400 d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf03 6464dfdff9af036464dfdff6af01646480afefaf01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 a6af01dfdffcaf036464dfdff9af036464dfdff6af01646480afefaf01df dffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af01 646480afefaf01dfdffcaf016464f59501dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af016464a6af01dfdffcaf036464dfdff9af 036464dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f9affd00c8af 0000f2af0000f8af01dfdffcaf036464dfdff9af036464dfdff6af016464 fcaf0000faaf0300afaf00e5af0000d4af0000c7af01dfdffcaf016464f5 9501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af0164 64fbaf060000afafaf0000e3af0000e8af0000f2af0000f8af01dfdffcaf 036464dfdff9af036464dfdff6af016464fcaf0000faaf0300afaf00e5af 0000d4af0000c7af01dfdffcaf016464f59501dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af016464fbaf0000fbaf0000e3af0000 e8af0000f2af0000f8af01dfdffcaf036464dfdff9af036464dfdff6af01 6464fcaf0000faaf0000e2af0000d4af0000c7af01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 fcaf0000f7af0000fcaf0600af00af000000fbaf0200afaffc0007afaf00 0000afaf00fcaf0700af00af0000afaffc00fcaf0000f9affc00fdaf0400 af000000fcaf01dfdffcaf036464dfdff9af036464dfdff6af016464fcaf 0000faaf0a00afaf00afaf00af000000fcaffd0004af00afafaffc00fcaf 0000f9affc00fdaf0400af000000fcaffd0004af00afafaffc0002afaf00 fcaf0900af00af000000afafaffc00d2af01dfdffcaf016464f59501dfdf f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf00 00f7af0000fcaf0600af0000afaf00fbaf0e00af0000afaf0000afaf00af afaf00fcaf1000af0000afafaf0000afaf0000afafaf00faaf120000afaf 0000afaf0000afaf0000afafafdfdffcaf036464dfdff9af036464dfdff6 af016464fcaf0000faaf1f00afaf00afaf0000afaf0000afaf0000afaf00 00afaf0000afaf0000afafaf00faaf1f0000afaf0000afaf0000afaf0000 afaf0000afaf0000afaf0000afaf0000af00fcaf0e00af0000afaf0000af 0000afaf0000d3af01dfdffcaf016464f59501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464fcaf0000f7af0000fcaf0200 af00fcaf0400afafaf00f9af0700afaf00afafaf00fcaf0200af00fcaf00 00fcaf0400afafaf00f5af0300afaf00fcaf0500afafafdfdffcaf036464 dfdff9af036464dfdff6af016464fcaff80005afaf00afaf00fcaf0300af af00fcaf0300afaf00fcaf0400afafaf00faaf0000fcaf0300afaf00fcaf 0300afaf00fcaf0300afaf00faaf0000fcaf0200af00fcaf0200af00fcaf 0000d3af01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6af016464fcaf0000f7af0000fcaf0200af00fcaf 0700afafaf00afafaffb0006afaf00afafaf00fcaf0200af00fcaffa00fd af0000f9affb0002afaf00fcaf0500afafafdfdffcaf036464dfdff9af03 6464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00 fcaf0200afaffa00fdaf0000faaf0000fcaf0300afaf00fcaf0300afaf00 fcaf0300afaf00faaf0000fcaf0200af00fcaf0100affa00d3af01dfdffc af016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56 dff6af016464fcaf0000f7af0000fcaf0200af00fcaf1300afafaf00afaf 0000afafaf00afaf00afafaf00fcaf0200af00fcaf0000f8af0000faaf08 0000afafaf00afaf00fcaf0500afafafdfdffcaf036464dfdff9af036464 dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf 0300afaf00f8af0000faaf0000fcaf0300afaf00fcaf0300afaf00fcaf03 00afaf00faaf0000fcaf0200af00fcaf0200af00ceaf01dfdffcaf016464 f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af01 6464fbaf0000fbaf0300afaf00fcaf0200af00fbaf0600af00afafaf00fc af0700afaf00afafaf00fcaf0200af00fcaf0000f8af0000faaf0000fcaf 0300afaf00fcaf0500afafafdfdffcaf036464dfdff9af036464dfdff6af 016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf 00f8af0000faaf0000fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00 fcaf0200af00fcaf0200af00fcaf0200af00ceaf01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 fbaf100000afafaf0000afaf0000afaf0000af00fbaf1900af00afafaf00 00afaf0000afaf00afafaf0000afaf0000af00fcaf090000afaf0000afaf af00faaf120000afaf0000afaf0000afaf0000afafafdfdffcaf036464df dff9af036464dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf14 00afaf0000afaf0000afaf0000afaf0000afafaf00faaf080000afaf0000 afaf00fcaf2500afaf0000afaf0000afaf0000afaf0000af0000afaf0000 af0000afaf0000af0000afaf0000d3af01dfdffcaf016464f59501dfdff6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f9affd00 fbaffd0003af00af00faaf0000fbaffd000faf0000afaf0000afaf000000 af00af00fbaffc00fcaffa000dafaf000000af0000af00af000000fcaf01 dfdffcaf036464dfdff9af036464dfdff6af016464fcaf0000faaf0600af af00afaf00fcaf0b00afafaf000000af00afafaffc00fcaffa0001afaffc 00fdaf0000fcaf0b00afafaf000000af00afafaffc00fdaffd000aaf00af 00af000000afafaffc00d2af01dfdffcaf016464f59501dfdff6af086400 d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf03 6464dfdff9af036464dfdff6af016464e2af0000d9af0000b6af01dfdffc af016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464a6af01dfdffcaf036464dfdff9af036464dfdff6af016464 e7af050000afaf0000deaf050000afaf0000b6af01dfdffcaf016464f595 01dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464 a6af01dfdffcaf036464dfdff9af036464dfdff6af016464e6affc00dcaf fc00b5af01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6af016464a6af01dfdffcaf036464dfdff76401df dff6af01646480afefaf01dfdffcaf016464f59501dfdff6af086400d69d d69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf026464 dff66401dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af 086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdf fcaf016464f59501dfdff6af01646480afefaf01dfdffcaf016464f59501 dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464a6 af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf0164 64f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af 016464a6af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdf fcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d 56dff6af016464fcaf0000f1af0300afaf00beaf01dfdffcaf016464f595 01dfdff6af016464fcaf0000faaf0300afaf00e7aff700a0af01dfdffcaf 016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656df f6af016464fcaf0000f1af0600afaf00afaf00e6af0000dcaf01dfdffcaf 016464f59501dfdff6af016464fcaf0000faaf0300afaf00e3af0000f3af 0000aaaf01dfdffcaf016464f59501dfdff6af086400d69dd69d569d0008 00d69dd69d569d56dff6af016464fcaf0000f1af0000fbaf0000e6af0000 dcaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0000e0af 0000f3af0000aaaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af016464fcaf0400af000000fcaffc00 fdaf0a00afaf00af000000afafaffc00fcaffc00fdaffc0004afaf000000 ddaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0a00afaf 00afaf00af000000fcaffd0004af00afafaffc00faaf0000faaffc000caf af000000afaf00af0000afaffc00b7af01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf3100 00afaf0000afaf0000afaf0000afaf00afaf00afaf00afafaf0000afaf00 00afaf0000afaf0000af0000afaf0000afaf00dcaf01dfdffcaf016464f5 9501dfdff6af016464fcaf0000faaf1b00afaf00afaf0000afaf0000afaf 0000afaf0000afaf0000afaf0000fbaf0000fbaf160000afaf0000afaf00 afafaf0000afafaf0000afaf0000b8af01dfdffcaf016464f59501dfdff6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000 fcaf0300afaf00fcaf0d00afaf00afaf00afaf00afafaf00fcaf0300afaf 00f5af0300afaf00dcaf01dfdffcaf016464f59501dfdff6af016464fcaf f80005afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000fbaf00 00fbaf0000fcaf0700afaf00afafaf00f7af0000b8af01dfdffcaf016464 f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af01 6464fcaf0000fcaf0200afaffa000cafaf00afaf00afaf00afafaf00fcaf 0300afaf00f9affb0002afaf00dcaf01dfdffcaf016464f59501dfdff6af 016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0200afaf fa00fbaf0000fbaffa0006afaf00afafaf00fbaffb00b8af01dfdffcaf01 6464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af016464fcaf0000fcaf0300afaf00f9af0a00afaf00afaf00afafaf00fc af0300afaf00faaf080000afafaf00afaf00dcaf01dfdffcaf016464f595 01dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fc af0300afaf00f6af0000fbaf0000f9af0400afafaf00fcaf050000afafaf 00b8af01dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800 d69dd69d569d56dff6af016464fcaf0000fcaf0300afaf00f9af0a00afaf 00afaf00afafaf00fcaf0300afaf00fcaf0200af00fcaf0300afaf00dcaf 01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0600afaf00af af00fcaf0300afaf00fcaf0300afaf00f6af0000fbaf0000f9af0400afaf af00fcaf0000fcaf0000b8af01dfdffcaf016464f59501dfdff6af086400 d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000fcaf2c00 afaf0000afaf0000afaf00afaf00afaf00afafaf0000afaf0000afaf0000 afaf0000af0000afaf0000afaf00dcaf01dfdffcaf016464f59501dfdff6 af016464fcaf0000faaf0600afaf00afaf00fcaf1000afaf0000afaf0000 afaf0000afaf0000fbaf0000fbaf0c0000afaf0000afaf00afafaf00fcaf 050000afaf0000b8af01dfdffcaf016464f59501dfdff6af086400d69dd6 9d569d000800d69dd69d569d56dff6af016464fcaf0000fcaf0300afafaf fc00fdaf0a00afaf00afafaf0000afaffc00fcaffc00fdaffd0006af0000 afaf0000deaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf 0600afaf00afaf00fcaf0b00afafaf000000af00afafaffc00faaf0000fa affc00fcaf030000af00fbaffd0002af0000b9af01dfdffcaf016464f595 01dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 a6af01dfdffcaf016464f59501dfdff6af016464e2af00008eaf01dfdffc af016464f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56 dff6af016464a6af01dfdffcaf016464f59501dfdff6af016464e7af0500 00afaf00008eaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d 56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf016464f59501 dfdff6af016464e6affc008daf01dfdffcaf016464f59501dfdff6af0864 00d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf 016464f59501dfdff6af01646480afefaf01dfdffcaf016464f59501dfdf f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01 dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf016464f5 9501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af0164 64a6af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf 016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656df f6af016464a6af01dfdffcaf016464f59501dfdff6af01646480afefaf01 dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d 569d56dff6af016464a6af01dfdffcaf016464f59501dfdff6af01646480 afefaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6af016464fcaf0000f9af0000b3af01dfdffcaf0164 64f59501dfdff6af016464fcaf0000faaf0300afaf00e7aff700faaf0000 e6af0000c2af01dfdffcaf016464f59501dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af016464fcaf0000f9af0000b3af01dfdffc af016464f59501dfdff6af016464fcaf0000faaf0300afaf00e3af0000f6 af0000e6af0000c2af01dfdffcaf016464f59501dfdff6af086400d6d69d 9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000abaf01dfdffcaf 016464f59501dfdff6af016464fcaf0000faaf0000e0af0000dbaf0000c2 af01dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69d d69d569d56dff6af016464fcaf0f00af000000afafaf00afaf00af000000 fcaffd0004af00afafaffc00caaf01dfdffcaf016464f59501dfdff6af01 6464fcaf0000faaf0a00afaf00afaf00af000000fcaffd0004af00afafaf fc00faaf0000fbaf0800af0000af00afafaffc00fdaf0400af000000fcaf fd0007af00afaf00afafaffc00c9af01dfdffcaf016464f59501dfdff6af 086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf200000 afaf0000afaf00afaf0000afaf0000afaf0000afaf0000afaf0000afaf00 00cbaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf1b00af af00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000fbaf0000 fbaf280000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000af af0000afaf00afaf0000afaf0000caaf01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf0000 fcaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000cbaf 01dfdffcaf016464f59501dfdff6af016464fcaff80005afaf00afaf00fc af0300afaf00fcaf0300afaf00fcaf0000fbaf0000fbaf0000fcaf0000f9 af0300afaf00fcaf0300afaf00fcaf0600afaf00afaf00fcaf0000caaf01 dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d 9d5656dff6af016464fcaf0000fcaf0600afaf00afaf00fcaf0300afaf00 fcaf0200afaffa00cbaf01dfdffcaf016464f59501dfdff6af016464fcaf 0000faaf0600afaf00afaf00fcaf0300afaf00fcaf0200afaffa00fbaf00 00fbaf0000fcaf0300afafaffb0002afaf00fcaf0300afaf00fcaf0500af af00afaffa00caaf01dfdffcaf016464f59501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464fcaf0000fcaf0600afaf00af af00fcaf0300afaf00fcaf0300afaf00c6af01dfdffcaf016464f59501df dff6af016464fcaf0000faaf0600afaf00afaf00fcaf0300afaf00fcaf03 00afaf00f6af0000fbaf0000fcaf0b00afaf0000afafaf00afaf00fcaf03 00afaf00fcaf0600afaf00afaf00c5af01dfdffcaf016464f59501dfdff6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000 fcaf0600afaf00afaf00fcaf0300afaf00fcaf0300afaf00c6af01dfdffc af016464f59501dfdff6af016464fcaf0000faaf0600afaf00afaf00fcaf 0300afaf00fcaf0300afaf00f6af0000fbaf0000fcaf0300afaf00fcaf03 00afaf00fcaf0300afaf00fcaf0600afaf00afaf00c5af01dfdffcaf0164 64f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af 016464fcaf0000fcaf0600afaf00afaf00fcaf1000afaf0000afaf0000af af0000afaf0000cbaf01dfdffcaf016464f59501dfdff6af016464fcaf00 00faaf0600afaf00afaf00fcaf1000afaf0000afaf0000afaf0000afaf00 00fbaf0000fbaf0000fcaf0b00afaf0000afaf0000afaf00fcaf1300afaf 0000afaf0000afaf00afaf0000afaf0000caaf01dfdffcaf016464f59501 dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fc af0000fcaf0600afaf00afaf00fcaf0b00afafaf000000af00afafaffc00 caaf01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0600afaf 00afaf00fcaf0b00afafaf000000af00afafaffc00faaf0000fbaf0000fc af0b00afafaf000000af0000af00fcaf0e00afafaf000000af00afaf00af afaffc00c9af01dfdffcaf016464f59501dfdff6af086400d69dd69d569d 000800d69dd69d569d56dff6af016464e4af0000c3af01dfdffcaf016464 f59501dfdff6af016464e2af0000d0af0000bfaf01dfdffcaf016464f595 01dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 e9af050000afaf0000c3af01dfdffcaf016464f59501dfdff6af016464e7 af050000afaf0000d5af050000afaf0000bfaf01dfdffcaf016464f59501 dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af016464e8 affc00c2af01dfdffcaf016464f59501dfdff6af016464e6affc00d3affc 00beaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6af016464a6af01dfdffcaf016464f59501dfdff6af 01646480afefaf01dfdffcaf016464f59501dfdff6af086400d69dd69d56 9d000800d69dd69d569d56dff6af016464a6af01dfdffcaf016464f59501 dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01dfdffcaf0164 64f59501dfdff6af01646480afefaf01dfdffcaf016464f59501dfdff6af 086400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdf fcaf016464f59501dfdff6af01646480afefaf01dfdffcaf016464f59501 dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6 af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf0164 64f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af 016464fcaf0000ddaf0000f2af0300afaf00e1af01dfdffcaf016464f595 01dfdff6af016464fcaf0000fbaf0300afaf00f6af0000f6affa00deaf05 0000afaf0000c0af01dfdffcaf016464f59501dfdff6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6af016464fcaf0000ddaf0000f2af0300 afaf00e1af01dfdffcaf016464f59501dfdff6af016464fcaf0000fcaf04 00afafaf00f6af0000f6af0000fcaf010000e0af0400afafaf00beaf01df dffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d56 9d56dff6af016464fcaf0000ddaf0000f2af0000deaf01dfdffcaf016464 f59501dfdff6af016464fcaf0400afafaf00fcaf0000ebaf0000fbaf0000 e0af0400afafaf00beaf01dfdffcaf016464f59501dfdff6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0700af000000afaf 00fbaf0600af00af000000fcaffc00fdaf0c00af0000af00af000000afaf affc00fdaf0600afaf00afafaffc00e8af01dfdffcaf016464f59501dfdf f6af016464fcaf0300afaf00fbaf0300afafaffc00fdaf0b00afaf00af00 0000afafaf00fbaf0000faaffc00fdaf0400af000000f9affc0008afaf00 0000af000000bfaf01dfdffcaf016464f59501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464fcaf080000afaf0000af0000 fcaf3100af0000afaf0000afaf0000afaf0000afaf0000afafaf0000afaf 0000af0000afaf0000afaf00afaf00afaf0000afaf0000e9af01dfdffcaf 016464f59501dfdff6af016464fcaf0200af00faaf1600afaf0000afaf00 00afaf00afaf0000afaf0000afaf00fcaf0000faaf0d0000afaf0000afaf 0000afaf0000fbaf0c0000afaf0000afaf00afafaf00beaf01dfdffcaf01 6464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af016464fcaf0000fcaf0a00afaf00afafaf00afaf00fcaf0300afaf00fc af0300afaf00fcaf0000fcaf0200af00fcaf0900afaf00afaf00afaf00e4 af01dfdffcaf016464f59501dfdff6af016464fcaffd00faaf0300afaf00 fcaf0600afaf00afaf00fcaf0200afaffb00f4af0300afaf00fcaf0000fb af0000fcaf0700afaf00afafaf00beaf01dfdffcaf016464f59501dfdff6 af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf0000 fcaf0a00afaf00afafaf00afaf00fcaf0200afaffa0002afaf00fcaf0000 fcaf0200af00fcaf0900afaf00afaf00afaf00e4af01dfdffcaf016464f5 9501dfdff6af016464fcaf0300afaf00fbaf0200afaffa0005afaf00afaf 00fcaf0300afaf00fcaf0000f9affb0002afaf00fcaf0000fbaf0000fcaf 0700afaf00afafaf00beaf01dfdffcaf016464f59501dfdff6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000fcaf0a00af afaf00afaf00afaf00fcaf0300afaf00f9af0000fcaf0000fcaf0200af00 fcaf0900afaf00afaf00afaf00e4af01dfdffcaf016464f59501dfdff6af 016464fcaf0400afafaf00fcaf0300afaf00f9af0300afaf00fcaf0300af af00fbaf0000fbaf080000afafaf00afaf00fcaf0000fbaf0000fcaf0700 afaf00afafaf00beaf01dfdffcaf016464f59501dfdff6af086400d69dd6 9d569d000800d69dd69d569d56dff6af016464fcaf0000fcaf0a00afafaf 00af00afafaf00fcaf0300afaf00f9af0000fcaf0000fcaf0200af00fcaf 0900afaf00afaf00afaf00fcaf0000e9af01dfdffcaf016464f59501dfdf f6af016464fcaf0000fcaf0700afafaf00afaf00f9af0300afaf00fcaf03 00afaf00fbaf0000fbaf0000fcaf0300afaf00fcaf0000fbaf0000fcaf07 00afaf00afafaf00beaf01dfdffcaf016464f59501dfdff6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0000fcaf0000fcaf 150000afafaf0000afaf0000afaf0000afaf0000afaf00fcaf1a0000afaf 0000af0000afaf0000afaf00afaf00afaf0000afaf0000e9af01dfdffcaf 016464f59501dfdff6af016464fcaf0000fbaf1100afaf00afaf0000afaf 0000afaf00afaf00fcaf0300afaf00fcaf260000afaf00afaf0000afaf00 00afaf0000afaf0000afaf00afaf0000afaf0000afaf00afafaf00beaf01 dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d 569d56dff6af016464fcaf0000fcaf0000fcaf0000fcaf0400af000000fc affc00fdaf0000fcaf0700af000000afafaffc00fdaf0600afaf00afafaf fc00e8af01dfdffcaf016464f59501dfdff6af016464fcaf0000faaf0500 af00afafaffc00fdaf0300afaf00fcaf0200afaffa00fdaf1600afafaf00 0000af0000af00af000000afafaf00afafaffc00fdaf0400afafaf00beaf 01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6af016464f2af0000fcaf0000baaf01dfdffcaf016464f595 01dfdff6af016464c9af0000a7af01dfdffcaf016464f59501dfdff6af08 6400d69dd69d569d000800d69dd69d569d56dff6af016464f3af010000fc af0000baaf01dfdffcaf016464f59501dfdff6af016464c9af0000a7af01 dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d 9d5656dff6af016464f4af010000fbaf0000baaf01dfdffcaf016464f595 01dfdff6af016464c9af0000a7af01dfdffcaf016464f59501dfdff6af08 6400d69dd69d569d000800d69dd69d569d56dff6af016464a6af01dfdffc af016464f59501dfdff6af01646480afefaf01dfdffcaf016464f59501df dff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af 01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffcaf016464 f59501dfdff6af086400d69dd69d569d000800d69dd69d569d56dff6af01 6464a6af01dfdffcaf016464f59501dfdff6af01646480afefaf01dfdffc af016464f59501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464a6af01dfdffcaf016464f59501dfdff6af01646480afefaf 01dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd6 9d569d56dff6af016464a6af01dfdffcaf016464f59501dfdff6af016464 80afefaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6af016464fcaf0000abaf01dfdffcaf016464f595 01dfdff6af016464fcaf0000fbaf0300afaf00f6af0000f6affa00f1af05 0000afaf0000adaf01dfdffcaf016464f59501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464fcaf0000abaf01dfdffcaf01 6464f59501dfdff6af016464fcaf0000fcaf0400afafaf00f6af0000f6af 0000fcaf010000f3af0400afafaf00abaf01dfdffcaf016464f59501dfdf f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464a6af01 dfdffcaf016464f59501dfdff6af016464fcaf0400afafaf00fcaf0000eb af0000fbaf0000f3af0400afafaf00abaf01dfdffcaf016464f59501dfdf f6af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf03 00afaf00fcaf1100af00af0000afaf0000afafaf00af000000c4af01dfdf fcaf016464f59501dfdff6af016464fcaf0300afaf00fbaf0300afafaffc 00fdaf0b00afaf00af000000afafaf00fbaf0000faaffc0008afaf000000 af000000acaf01dfdffcaf016464f59501dfdff6af086400d6d69d9d9d56 000800d6d69d9d9d5656dff6af016464fcaf0300afaf00fcaf1200af0000 afaf0000afaf00afaf0000afaf0000c5af01dfdffcaf016464f59501dfdf f6af016464fcaf0200af00faaf1600afaf0000afaf0000afaf00afaf0000 afaf0000afaf00fcaf0000faaf0c0000afaf0000afaf00afafaf00abaf01 dfdffcaf016464f59501dfdff6af086400d69dd69d569d000800d69dd69d 569d56dff6af016464fcaf0300afaf00fcaf0d00af00afafaf00afafaf00 afaf00fcaf0000c5af01dfdffcaf016464f59501dfdff6af016464fcaffd 00faaf0300afaf00fcaf0600afaf00afaf00fcaf0200afaffb00f9af0000 fcaf0700afaf00afafaf00abaf01dfdffcaf016464f59501dfdff6af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf0300afaf00 fcaf0d00af00afafaf00afafaf00afaf00fcaf0000c5af01dfdffcaf0164 64f3dff6af016464fcaf0300afaf00fbaf0200afaffa0005afaf00afaf00 fcaf0300afaf00fcaf0000faaf0000fcaf0700afaf00afafaf00abaf01df dffcaf016464f3dff6af086400d69dd69d569d000800d69dd69d569d56df f6af016464fcaf0300afaf00fcaf0d00af00afafaf00afafaf00afaf00fc af0000c5af01dfdffcaf016464f7df036464dfdff6af016464fcaf0400af afaf00fcaf0300afaf00f9af0300afaf00fcaf0300afaf00fbaf0000fbaf 0000fcaf0700afaf00afafaf00abaf01dfdffcaf016464f7df036464dfdf f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464fcaf03 00afaf00fcaf0d00af00afafaf00afafaf00afaf00fcaf0000c5af01dfdf fcaf04646495dfdffbaf04646495dfdff6af016464fcaf0000fcaf0700af afaf00afaf00f9af0300afaf00fcaf0300afaf00fbaf0000fbaf0000fcaf 0700afaf00afafaf00abaf01dfdffcaf04646495dfdffbaf04646495dfdf f6af086400d69dd69d569d000800d69dd69d569d56dff6af016464fcaf1a 00afaf0000afaf0000af00afafaf00afafaf00afaf0000afaf0000c5af01 dfdffcaf04646495dfdffbaf04646495dfdff6af016464fcaf0000fbaf11 00afaf00afaf0000afaf0000afaf00afaf00fcaf0300afaf00fcaf130000 afaf00afaf0000afaf0000afaf00afafaf00abaf01dfdffcaf04646495df dffbaf04646495dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464fcaf1900afafaf000000af00af00afafaf00afafaf00afaf 00af000000c4af01dfdffcaf0e64649595dfdfafafaf64649595dfdff6af 016464fcaf0000faaf0500af00afafaffc00fdaf0300afaf00fcaf0200af affa00fdaf0300afafaffc00fdaf0400afafaf00abaf01dfdffcaf0e6464 9595dfdfafafaf64649595dfdff6af086400d69dd69d569d000800d69dd6 9d569d56dff6af016464fcaf0000ecaf0000c0af01dfdffcaf0e64649595 dfdfafafaf64649595dfdff6af01646480afefaf01dfdffcaf0e64649595 dfdfafafaf64649595dfdff6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6af016464fcaf0000ecaf0000c0af01dfdffcaf0e6464959595df dfaf6464959595dfdff6af01646480afefaf01dfdffcaf0e6464959595df dfaf6464959595dfdff6af086400d69dd69d569d000800d69dd69d569d56 dff6af056464afafaf00ebaf0000c0af01dfdffcaf0e6464959595dfdfaf 6464959595dfdff6af01646480afefaf01dfdffcaf0e6464959595dfdfaf 6464959595dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af016464a6af01dfdffcaf016464fc9502df6464fc9501dfdff6af016464 80afefaf01dfdffcaf016464fc9502df6464fc9501dfdff6af086400d69d d69d569d000800d69dd69d569d56dff6af016464a6af01dfdffcaf016464 fc9502df6464fc9501dfdff6af01646480afefaf01dfdffcaf016464fc95 02df6464fc9501dfdff6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af016464a6af01dfdffcaf016464fb950064fb9501dfdff6af016464 80afefaf01dfdffcaf016464fb950064fb9501dfdff6af086400d69dd69d 569d000800d69dd69d569d56dff6af016464a4dffcaf016464f3dff6af01 646480dfeddffcaf016464f3dff6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6af0064a3dffcaf0064f2dff6af006480dfecdffcaf0064f2 dff6af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af08 6400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69d d69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56 000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d6 9dd69d569d56dff6afa264e3af8064eb64e3af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6afa36400dfe3af8064ec6400dfe3af086400d69d d69d569d000800d69dd69d569d56dff6af016464f79501dfdfd695e7df02 95dfdff79501dfdfe3af016464f79501dfdfc295c4df0295dfdff79501df dfe3af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464f995 fddf0064d695e8df016495fcdff99501dfdfe3af016464f995fddf0064c2 95c5df016495fcdff99501dfdfe3af086400d69dd69d569d000800d69dd6 9d569d56dff6af016464fb95fcdf016464d69501dfdfebaf02646495fadf fb9501dfdfe3af016464fb95fcdf016464c29501dfdfc8af02646495fadf fb9501dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af04 6464959595fcdf03afaf6464d69501dfdfebaf06646495dfdfafaffcdffd 9501dfdfe3af046464959595fcdf03afaf6464c29501dfdfc8af06646495 dfdfafaffcdffd9501dfdfe3af086400d69dd69d569d000800d69dd69d56 9d56dff6af02646495fcdffcaf016464d69501dfdfebaf04646495dfdffc affcdf0295dfdfe3af02646495fcdffcaf016464c29501dfdfc8af046464 95dfdffcaffcdf0295dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6af046464dfdfdffaaf016464d69501dfdfebaf04646495dfdffa affd6401dfdfe3af046464dfdfdffaaf016464c29501dfdfc8af04646495 dfdffaaffd6401dfdfe3af086400d69dd69d569d000800d69dd69d569d56 dff6af02646495fc64fcaf016464d69501dfdfebaf04646495dfdffcaffc 640295dfdfe3af02646495fc64fcaf016464c29501dfdfc8af04646495df dffcaffc640295dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af046464959595fc6403afaf6464d69501dfdfebaf06646495dfdfaf affc64fd9501dfdfe3af046464959595fc6403afaf6464c29501dfdfc8af 06646495dfdfafaffc64fd9501dfdfe3af086400d69dd69d569d000800d6 9dd69d569d56dff6af016464fb95fa64d69501dfdfebaf04646495dfdffc 64fb9501dfdfe3af016464fb95fa64c29501dfdfc8af04646495dfdffc64 fb9501dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af01 6464f995fc64d69501dfdfe9640495df646464f99501dfdfe3af016464f9 95fc64c29501dfdfc6640495df646464f99501dfdfe3af086400d69dd69d 569d000800d69dd69d569d56dff6af016464f795016464d69500dfe86402 95df64f79501dfdfe3af016464f795016464c29500dfc5640295df64f795 01dfdfe3af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af016464 a4dfe3af01646480dfeddfe3af086400d69dd69d569d000800d69dd69d56 9d56dff6af0064a3dfe3af006480dfecdfe3af086400d6d69d9d9d560008 00d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd6 9d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656 df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80 afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af08 6400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d6 9d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d 000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6 d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d56 9d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 af80df80dfdddff6af086400d69dd69d569d000800d69dd69d569d56dff6 af80df80dfdedf0064f6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6af80df80dfdfdf016464f6af086400d69dd69d569d000800d69dd69d 569d56dff6affddf80af80afe3affd64f6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6affddf80af80afe3affd64f6af086400d69dd69d56 9d000800d69dd69d569d56dff6affddf80af80afe3affd64f6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6affddf80af80afe3affd64f6af 086400d69dd69d569d000800d69dd69d569d56dff6affddf80af80afe3af fd64f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddfe1af fa00f1af0000f4af0000faaf000080afacaffd64f6af086400d69dd69d56 9d000800d69dd69d569d56dff6affddfe1af0000fcaf010000f6af0400af afaf00f4af0000faaf0000f7af000080afb6affd64f6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6affddfe1af0000fbaf0000f6af0400af afaf00f4af0000f0af000080afb6affd64f6af086400d69dd69d569d0008 00d69dd69d569d56dff6affddfe1af0000fbaf0300afafaffc000bafaf00 0000afaf00af000000f8af0000faaf0b00afafaf000000afaf00000080af b7affd64f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddf e1af0000fcaf150000afaf0000afaf0000afaf00afafaf0000afaf0000f9 af0000faaf0a00afaf00afafaf00afaf0080afb6affd64f6af086400d69d d69d569d000800d69dd69d569d56dff6affddfe1affa00f8af0700afaf00 afafaf00fcaf0000f9af0000faaf0400afaf0000fbaf000080afb6affd64 f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddfe1af0000 f7affb0006afaf00afafaf00fcaf0000f9af0000faaf0a00afafaf000000 afafaf0080afb6affd64f6af086400d69dd69d569d000800d69dd69d569d 56dff6affddfe1af0000f8af0c0000afafaf00afaf00afafaf00fcaf0000 f9af0000faaf0000fbaf040000afaf0080afb6affd64f6af086400d6d69d 9d9d56000800d6d69d9d9d5656dff6affddfe1af0000f8af0000fcaf0700 afaf00afafaf00fcaf0000f9af0000faaf0000faaf0300afaf0080afb6af fd64f6af086400d69dd69d569d000800d69dd69d569d56dff6affddfe1af 0000f8af0c0000afaf0000afaf00afafaf00fcaf0000f9af0000faaf0a00 afaf00afafaf00afaf0080afb6affd64f6af086400d6d69d9d9d56000800 d6d69d9d9d5656dff6affddfe1af0000f7affd0008af0000afaf0000af00 fcaf0000f9affa0007af00afafaf000000fcaf01000080afb8affd64f6af 086400d69dd69d569d000800d69dd69d569d56dff6affddf80af80afe3af fd64f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddf80af 80afe3affd64f6af086400d69dd69d569d000800d69dd69d569d56dff6af fddf80af80afe3affd64f6af086400d6d69d9d9d56000800d6d69d9d9d56 56dff6affddf80af80afe3affd64f6af086400d69dd69d569d000800d69d d69d569d56dff6affddffdaf80648064e96405dfafaf646464f6af086400 d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf006480df80dfeb df0664dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56 dff6affddffdaf0164df80af80afecaf0664dfafaf646464f6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0264dfaf80648064 ee6407af64dfafaf646464f6af086400d69dd69d569d000800d69dd69d56 9d56dff6affddffdaf0264dfaf80648064ef6408dfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464df af646480af80aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d56 9d000800d69dd69d569d56dff6affddffdaf0464dfaf646480af80aff2af 09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6affddffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf64 6464f6af086400d69dd69d569d000800d69dd69d569d56dff6affddffdaf 0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480af80 aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d69d d69d569d56dff6affddffdaf0464dfaf646480af80aff2af09dfdfaf64df afaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affd dffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464dfaf6464 80af80aff2af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6affddffdaf0464dfaf646480af80aff2af09dfdf af64dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56df f6affddffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6 af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464df af646480af80aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d56 9d000800d69dd69d569d56dff6affddffdaf0664dfaf6464af0080af80af f4af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6affddffdaf0664dfaf6464af0080af80aff4af09dfdfaf64 dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56dff6af fddffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464dfaf64 6480af80aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d569d00 0800d69dd69d569d56dff6affddffdaf0464dfaf646480af80aff2af09df dfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6affddffdaf0464dfaf646480008000f20009dfdfaf64dfafaf646464 f6af086400d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464 dfaf646480008000f20009dfdfaf64dfafaf646464f6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6affddffdaf0864dfaf6464000000aff6 0000afe60000afd80000affa0000afe80000af8000e50009dfdfaf64dfaf af646464f6af086400d69dd69d569d000800d69dd69d569d56dff6affddf fdaf0864dfaf6464000000aff60000afe60000afd80000affa0000aff600 00aff30000af8000e50009dfdfaf64dfafaf646464f6af086400d6d69d9d 9d56000800d6d69d9d9d5656dff6affddffdaf0764dfaf64640000aff600 00afe60000afd80000aff90000aff60000aff40000af8000e40009dfdfaf 64dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56dff6 affddffdaf0a64dfaf64640000af0000affc000eaf0000af000000afafaf 00af000000fcaffd00fdaf0c00af000000af0000af00afafaffc00fdaf09 00af0000af00afaf0000fcaffd0004af00afafaffc000baf000000afafaf 00af000000fcaf070000afafaf000000fcaffc000baf000000afafaf00af 000000fcaffc00fcaffd0007af00afaf0000afaf860009dfdfaf64dfafaf 646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffd af0a64dfaf64640000af0000affc007faf0000af0000afaf0000afaf0000 afaf0000afaf00afaf0000afaf000000af0000afaf0000afaf0000afaf00 00afaf0000afaf000000afaf0000afaf0000afaf0000afaf000000af0000 afaf0000afaf0000afaf0000afaf0000af000000afaf0000afaf000000af 0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf0a0000afaf00 00afaf0000af870009dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d69dd69d569d56dff6affddffdaf0a64dfaf646400af000000affc 0006af00af000000affc0003af0000affa0000affc0007af0000af000000 affc0003af0000affc0003af0000aff70003af0000affc0007af0000af00 0000affc0000aff90003af0000aff80007af0000af000000affc0003af00 00affc0003af0000affc000baf0000af000000af000000af870009dfdfaf 64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 affddffdaf0a64dfaf646400af000000affc0006af00af000000affc0003 af0000affa0000affc0007af0000af000000affc0003af0000affc0003af 0000affb00fbaf020000affc0007af0000af000000affc0003af000000fb af020000affc00fbaf060000af000000affc0002af0000faaf020000affc 000baf0000af000000af000000af870009dfdfaf64dfafaf646464f6af08 6400d69dd69d569d000800d69dd69d569d56dff6affddffdaf0a64dfaf64 6400af000000affc0006af00af000000affc0003af0000affa0000affc00 07af0000af000000affc0003af0000affc0003af0000affc0008afaf0000 00af0000affc0007af0000af000000affc001baf0000afaf000000af0000 af000000afaf000000af0000af000000affc0003af0000aff90000affc00 0baf0000af000000af000000af870009dfdfaf64dfafaf646464f6af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0564dfaf6464 affc0000affc0001afaffc0000affc0003af0000affc0002af00affc0002 af00affc0000affc0003af0000affc0003af0000affc0000affc0003af00 00affc0002af00affc0000affc0003af0000affc0007af0000af000000af fc0002af00affc0000affc0003af0000aff90000affc000baf0000af0000 00af000000af870009dfdfaf64dfafaf646464f6af086400d69dd69d569d 000800d69dd69d569d56dff6affddffdaf0564dfaf6464affc0006afaf00 00afafaffc0016afaf0000afaf0000afaf0000afaf00afaf0000afaf00af fc0000affc000baf0000afaf0000afaf0000affc000fafaf0000afaf0000 afaf0000afaf00affc001bafaf0000afaf0000afaf0000afaf0000af0000 00afaf0000afaf00affc0020afaf0000afaf0000afaf0000afaf0000afaf 0000afaf0000af000000af000000af870009dfdfaf64dfafaf646464f6af 086400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0564dfaf 6464affb00fdaf0200afaffb00fdaf0400af000000fcaffd00fdaf0300af 00affc0000affc000baf000000afafaf00af0000affb00fdaf0b00afaf00 af00afafaf0000affb00fdaf1700af000000afafaf00afaf0000afaf0000 afafaf00afafaffb00fdaf0400af000000fcaffc00fcaffd0008af000000 af000000af870009dfdfaf64dfafaf646464f6af086400d69dd69d569d00 0800d69dd69d569d56dff6affddffdaf0464dfaf6464eb0000aff20000af ed0000aff10000afd00000af8000ec0009dfdfaf64dfafaf646464f6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464dfaf64 64f00005afaf0000afaff70005afaf0000afaff20005afaf0000afaff100 00afd50005afaf0000afaf8000ec0009dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464dfaf6464 ef00fcaff500fcaff000fcaff00000afd400fcaf8000eb0009dfdfaf64df afaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6affd dffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464dfaf6464 80af80aff2af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6affddffdaf0864dfaf6464afafaf00f6af0000e6 af0000d8af0000faaf000080afccaf09dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0864dfaf6464 afafaf00f6af0000e6af0000d8af0000faaf0000f6af000080afd7af09df dfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6affddffdaf0764dfaf6464afaf00f6af0000e6af0000d8af0000f9af 0000f6af000080afd7af09dfdfaf64dfafaf646464f6af086400d69dd69d 569d000800d69dd69d569d56dff6affddffdaf0a64dfaf6464afaf00afaf 00fcaf0e00afaf00afafaf000000af00afafaffc00fdaffd000caf00afaf af00afaf00af000000fcaffd0009af00afaf00af0000afaffc00fdaf0400 af000000fcaf0b00afafaf000000af00afafaffc0007afaf000000afafaf fc0080afdfaf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6affddffdaf0a64dfaf6464afaf00afaf00fcaf63 00afaf00afaf0000afaf0000afaf0000afaf0000af0000afaf0000afafaf 00afaf0000afaf0000afaf0000afaf0000afaf0000afafaf0000afaf0000 afaf0000afaf0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf 00afafaf0000afaf000080afe0af09dfdfaf64dfafaf646464f6af086400 d69dd69d569d000800d69dd69d569d56dff6affddffdaf0a64dfaf6464af 00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf0700 afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f7af0300afaf00fcaf 0700afaf00afafaf00fcaf0000f9af0300afaf00f8af000080afe0af09df dfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656 dff6affddffdaf0a64dfaf6464af00afafaf00fcaf0600af00afafaf00fc af0300afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf 0300afaf00fbaffb0002afaf00fcaf0700afaf00afafaf00fcaf0300afaf affb0002afaf00fcaffb0080afe0af09dfdfaf64dfafaf646464f6af0864 00d69dd69d569d000800d69dd69d569d56dff6affddffdaf0a64dfaf6464 af00afafaf00fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf 00afaf00fcaf0700afaf00afafaf00fcaf1400afaf0000afafaf00afaf00 afafaf0000afafaf0080afe0af09dfdfaf64dfafaf646464f6af086400d6 d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fc af0000fcaf010000fcaf0000fcaf0300afaf00fcaf0200af00fcaf0200af 00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0000fcaf0300afaf00 fcaf0200af00fcaf0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf 000080afe0af09dfdfaf64dfafaf646464f6af086400d69dd69d569d0008 00d69dd69d569d56dff6affddffdaf0564dfaf646400fcaf060000afaf00 0000fcaf160000afaf0000afaf0000afaf0000af0000afaf0000af00fcaf 0000fcaf0b00afaf0000afaf0000afaf00fcaf0f0000afaf0000afaf0000 afaf0000af00fcaf190000afaf0000afaf0000afaf0000afaf00afafaf00 00afaf000080afe0af09dfdfaf64dfafaf646464f6af086400d6d69d9d9d 56000800d6d69d9d9d5656dff6affddffdaf0564dfaf646400fbaffd0002 af0000fbaffd0004af00afafaffc00fdaffd0003af00af00fcaf0000fcaf 0b00afafaf000000af00afaf00fbaffd000baf0000af00af000000afaf00 fbaffd0016af00afafaf000000af0000afaf0000afaf000000af000080af e1af09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800d69dd6 9d569d56dff6affddffdaf0464dfaf6464ebaf0000f2af0000edaf0000f1 af000080afbbaf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d5600 0800d6d69d9d9d5656dff6affddffdaf0464dfaf6464f0af050000afaf00 00f7af050000afaf0000f2af050000afaf0000f1af000080afbbaf09dfdf af64dfafaf646464f6af086400d69dd69d569d000800d69dd69d569d56df f6affddffdaf0464dfaf6464efaffc00f5affc00f0affc00f0af000080af bbaf09dfdfaf64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d 9d9d5656dff6affddffdaf0464dfaf646480af80aff2af09dfdfaf64dfaf af646464f6af086400d69dd69d569d000800d69dd69d569d56dff6affddf fdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af086400 d6d69d9d9d56000800d6d69d9d9d5656dff6affddffdaf0464dfaf646480 af80aff2af09dfdfaf64dfafaf646464f6af086400d69dd69d569d000800 d69dd69d569d56dff6affddffdaf0464dfaf646480af80aff2af09dfdfaf 64dfafaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6 affddffdaf0464dfaf646480af80aff2af09dfdfaf64dfafaf646464f6af 086400d69dd69d569d000800d69dd69d569d56dff6affddffdaf0464dfaf 646480df80dff0df07af64dfafaf646464f6af086400d6d69d9d9d560008 00d6d69d9d9d5656dff6affddffdaf0364dfaf6480df80dfefdf07af64df afaf646464f6af086400d69dd69d569d000800d69dd69d569d56dff6affd dffdaf0164df80af80afecaf0664dfafaf646464f6af086400d6d69d9d9d 56000800d6d69d9d9d5656dff6affddffdaf80648064e96405dfafaf6464 64f6af086400d69dd69d569d000800d69dd69d569d56dff6affddffdaf80 df80dfe8df04afaf646464f6af086400d6d69d9d9d56000800d6d69d9d9d 5656dff6affddf80af80afe3affd64f6af086400d69dd69d569d000800d6 9dd69d569d56dff6affddf80af80afe3affd64f6af086400d6d69d9d9d56 000800d6d69d9d9d5656dff6affddf80af80afe3affd64f6af086400d69d d69d569d000800d69dd69d569d56dff6affddf80af80afe3affd64f6af08 6400d6d69d9d9d56000800d6d69d9d9d5656dff6affddf80af80afe3affd 64f6af086400d69dd69d569d000800d69dd69d569d56dff6affddf806480 64e064f6af086400d6d69d9d9d56000800d6d69d9d9d5656dff6af01dfdf 80648064df64f6af086400d69dd69d569d000800d69dd69d569d56dff6af 00df80648064de64f6af086400d6d69d9d9d56000800d6d69d9d9d5656df 80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80af c9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af0864 00d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d 9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d00 0800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d6 9d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d 56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af 80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af 086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d6 9dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d 56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800 d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d 9d5656dff1affd00f4af0000ebaf000080af80af0aafaf6400d69dd69d56 9d000800d69dd69d569d56dff3af060000afafaf0000f6af0000efaf0400 afafaf0080af80af0aafaf6400d6d69d9d9d56000800d6d69d9d9d5656df f3af0000fbaf0000f6af0000efaf000080af80affaaf086400d69dd69d56 9d000800d69dd69d569d56dff3af0000f7affc00fdaf0300afafaffc00fc affc0009af000000afaf00afafaffc00fdaf0400af00000080af8daf0864 00d6d69d9d9d56000800d6d69d9d9d5656dff2af010000faaf2e0000afaf 0000afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00afaf00 00afaf0000afaf0000afaf000080af8eaf086400d69dd69d569d000800d6 9dd69d569d56dff0af010000fcaf0000fcaf0600afaf00afaf00fcaf0300 afaf00faaf0700afafaf00afaf00fcaf0300afaf00fcaf000080af8eaf08 6400d6d69d9d9d56000800d6d69d9d9d5656dfeeaf030000afaffa0004af af00afaffa0002afaf00faaf0700afafaf00afaf00fcaf0300afaf00fcaf 000080af8eaf086400d69dd69d569d000800d69dd69d569d56dfedaf0300 afaf00f9af0300afaf00f9af0000faaf0700afafaf00afaf00fcaf0300af af00fcaf000080af8eaf086400d6d69d9d9d56000800d6d69d9d9d5656df f3af0000fbaf0300afaf00f9af0300afaf00f9af0000fcaf0900af00afaf af00afaf00fcaf0300afaf00fcaf000080af8eaf086400d69dd69d569d00 0800d69dd69d569d56dff3af320000afafaf0000afaf0000afaf0000afaf 00afaf0000afaf0000afaf0000afaf0000af00afafaf00afaf0000afaf00 00afaf00fcaf000080af8eaf086400d6d69d9d9d56000800d6d69d9d9d56 56dff1affd00fbaffc00fdaf0300afafaffc00fcaffc00fdaf060000af00 afafaffc00fdaf0000fcaf000080af8eaf086400d69dd69d569d000800d6 9dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d 5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d 569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d560008 00d6d69d9d9d5656dff4af80648064e164f4af086400d69dd69d569d0008 00d69dd69d569d56dff4af80648064e26400dff4af086400d6d69d9d9d56 000800d6d69d9d9d5656dff4af01646480af80afe5af01dfdff4af086400 d69dd69d569d000800d69dd69d569d56dff4af01646480af80afe5af01df dff4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480af 80afe5af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4 af01646480af80afe5af01dfdff4af086400d6d69d9d9d56000800d6d69d 9d9d5656dff4af01646480af80afe5af01dfdff4af086400d69dd69d569d 000800d69dd69d569d56dff4af01646480af80afe5af01dfdff4af086400 d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480af80afe5af01df dff4af086400d69dd69d569d000800d69dd69d569d56dff4af01646480af 80afe5af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4 af016464f8af0000f6af0000e6af0000d8af0000faaf0000e8af0000daaf 000084af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4 af016464f8af0000f6af0000e6af0000d8af0000faaf0000f6af0000f3af 0000daaf000084af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d 5656dff4af016464f9af0000f6af0000e6af0000d8af0000f9af0000f6af 0000f4af0000daaf000083af01dfdff4af086400d69dd69d569d000800d6 9dd69d569d56dff4af016464f9af0300afaf00fcaf0e00afaf00afafaf00 0000af00afafaffc00fdaffd000caf00afafaf00afaf00af000000fcaffd 0009af00afaf00af0000afaffc00fdaf0400af000000fcaf0b00afafaf00 0000af00afafaffc0007afaf000000afafaffc00fcaf0b00afafaf000000 af00afafaffc00fcaffc00fdaf0700af0000afaf0000fcaf000083af01df dff4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af016464f9af 0300afaf00fcaf7f00afaf00afaf0000afaf0000afaf0000afaf0000af00 00afaf0000afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000af afaf0000afaf0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf 0000afaf0000afaf00afafaf0000afaf0000afafaf00afaf0000afaf0000 afaf0000afaf0000afaf0000afaf00000eafaf0000afaf0000afaf00afaf af0083af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4 af016464faaf0400afafaf00fcaf0600af00afafaf00fcaf0300afaf00fa af0000fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f7af 0300afaf00fcaf0700afaf00afafaf00fcaf0000f9af0300afaf00f8af07 00afaf00afafaf00fcaf0300afaf00fcaf0300afaf00fcaf0e00afaf00af afaf00afafaf00afaf0082af01dfdff4af086400d6d69d9d9d56000800d6 d69d9d9d5656dff4af016464faaf0400afafaf00fcaf0600af00afafaf00 fcaf0300afaf00faaf0000fcaf0700afaf00afafaf00fcaf0300afaf00fc af0300afaf00fbaffb0002afaf00fcaf0700afaf00afafaf00fcaf0300af afaffb0002afaf00fcaffb0006afaf00afafaf00fcaf0200afaffa0002af af00fcaf0e00afaf00afafaf00afafaf00afaf0082af01dfdff4af086400 d69dd69d569d000800d69dd69d569d56dff4af016464faaf0400afafaf00 fcaf0600af00afafaf00fcaf0300afaf00faaf0000fcaf0700afaf00afaf af00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf00afaf00fcaf 0700afaf00afafaf00fcaf1b00afaf0000afafaf00afaf00afafaf0000af afaf00afaf00afafaf00fcaf0300afaf00f9af0000fcaf0e00afaf00afaf af00afafaf00afaf0082af01dfdff4af086400d6d69d9d9d56000800d6d6 9d9d9d5656dff4af016464fbaf0000fcaf0000fcaf010000fcaf0000fcaf 0300afaf00fcaf0200af00fcaf0200af00fcaf0000fcaf0300afaf00fcaf 0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00fcaf0000fcaf0300 afaf00fcaf0700afaf00afafaf00fcaf0200af00fcaf0000fcaf0300afaf 00f9af0000fcaf0d00afaf00afafaf00afafaf00af0081af01dfdff4af08 6400d69dd69d569d000800d69dd69d569d56dff4af016464fbaf0000fcaf 060000afaf000000fcaf160000afaf0000afaf0000afaf0000af0000afaf 0000af00fcaf0000fcaf0b00afaf0000afaf0000afaf00fcaf0f0000afaf 0000afaf0000afaf0000af00fcaf1b0000afaf0000afaf0000afaf0000af af00afafaf0000afaf0000af00fcaf220000afaf0000afaf0000afaf0000 afaf0000afaf0000afaf00afafaf00afafaf00af0081af01dfdff4af0864 00d6d69d9d9d56000800d6d69d9d9d5656dff4af016464fbaf0000fbaffd 0002af0000fbaffd0004af00afafaffc00fdaffd0003af00af00fcaf0000 fcaf0b00afafaf000000af00afaf00fbaffd000baf0000af00af000000af af00fbaffd0017af00afafaf000000af0000afaf0000afaf000000af0000 00fbaffd0004af00afafaffc00fcaffc00fdaf0a00afafaf00afafaf00af 0081af01dfdff4af086400d69dd69d569d000800d69dd69d569d56dff4af 016464e6af0000f2af0000edaf0000f1af0000d0af000080afe4af01dfdf f4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af016464ebaf05 0000afaf0000f7af050000afaf0000f2af050000afaf0000f1af0000d5af 050000afaf000080afe4af01dfdff4af086400d69dd69d569d000800d69d d69d569d56dff4af016464eaaffc00f5affc00f0affc00f0af0000d4affc 0080afe3af01dfdff4af086400d6d69d9d9d56000800d6d69d9d9d5656df f4af01646480af80afe5af01dfdff4af086400d69dd69d569d000800d69d d69d569d56dff4af01646480af80afe5af01dfdff4af086400d6d69d9d9d 56000800d6d69d9d9d5656dff4af01646480af80afe5af01dfdff4af0864 00d69dd69d569d000800d69dd69d569d56dff4af01646480af80afe5af01 dfdff4af086400d6d69d9d9d56000800d6d69d9d9d5656dff4af01646480 af80afe5af01dfdff4af086400d69dd69d569d000800d69dd69d569d56df f4af01646480df80dfe3dff4af086400d6d69d9d9d56000800d6d69d9d9d 5656dff4af006480df80dfe2dff4af086400d69dd69d569d000800d69dd6 9d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656 df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80 afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af08 6400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d6 9d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d 000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6 d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d56 9d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80 af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80afc9 af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400 d69dd69d569d000800d69dd69d569d56df80648064c8640700d6d69d9d9d 56000700d6d69d9d9d565680df80dfc8df086400d69dd69d569d000800d6 9dd69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d 5656df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80 af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9 af086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400 d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d 569d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d560008 00d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd6 9d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656 df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80 afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af08 6400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6d6 9d9d9d56000800d6d69d9d9d5656dff3afc96480af8daf086400d69dd69d 569d000800d69dd69d569d56dff3af0064cbaf00df80af8daf086400d6d6 9d9d9d56000800d6d69d9d9d5656dff3af0064cbaf00df80af8daf086400 d69dd69d569d000800d69dd69d569d56dff3af0064cbaf00df80af8daf08 6400d6d69d9d9d56000800d6d69d9d9d5656dff3af0064cbaf00df80af8d af086400d69dd69d569d000800d69dd69d569d56dff3af0064fcafd3dffc af00dfbfafd3dfbaafd3dfeeaf086400d6d69d9d9d56000800d6d69d9d9d 5656dff3af0064fcafd4df0064fcaf00dfbfafd4df0064baafd4df0064ee af086400d69dd69d569d000800d69dd69d569d56dff3af0064fcafd5df01 6464fcaf00dfbfafd5df016464baafd5df016464eeaf086400d6d69d9d9d 56000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64fcaf00dfbfaf fddfd9affd64baaffddfd9affd64eeaf086400d69dd69d569d000800d69d d69d569d56dff3af0064fcaffddfd9affd64fcaf00dfbfaffddfd9affd64 baaffddfd9affd64eeaf086400d6d69d9d9d56000800d6d69d9d9d5656df f3af0064fcaffddfd9affd64fcaf00dfbfaffddfd9affd64baaffddfd9af fd64eeaf086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaf fddfd9affd64fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf0864 00d6d69d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64 fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf086400d69dd69d56 9d000800d69dd69d569d56dff3af0064fcaffddfd9affd64fcaf00dfbfaf fddfd9affd64baaffddfd9affd64eeaf086400d6d69d9d9d56000800d6d6 9d9d9d5656dff3af0064fcaffddff3affd00fbaf0000fbaf0000f5affd64 fcaf00dfbfaffddffbaff90004af00afaf00eaaffd64baaffddffaaf0000 faaf0300afaf00f9af0000f2affd64eeaf086400d69dd69d569d000800d6 9dd69d569d56dff3af0064fcaffddff5af0a0000afafaf0000afafaf00fc af0000f4affd64fcaf00dfbfaffddffbaf0000f9af0600afaf00afaf00ed affd64baaffddffaaf0000faaf0300afaf00f9af0000f2affd64eeaf0864 00d6d69d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddff5af0000 fbaf0800afafaf00afafaf00f3affd64fcaf00dfbfaffddffbaf0000f6af 0300afaf00edaffd64baaffddffaaf0000faaf0000f6af0000f2affd64ee af086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaffddff6 af0000f9af0600afaf00afaf00f2affd64fcaf00dfbfaffddffbaf0000f9 af0a00afaf00af000000afafaffc00fdaf0300af0000fcaffd64baaffddf faaf0000faaf0e00afaf00afafaf000000af00afafaffc00f9affd64eeaf 086400d6d69d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddff6af 0000f9af0500afaf00af00f1affd64fcaf00dfbfaffddffbaf0000f9af13 00afaf00afaf00afafaf0000afaf0000afaf0000faaffd64baaffddffaaf 0000faaf1300afaf00afaf0000afaf0000afaf0000afaf0000faaffd64ee af086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaffddff6 af0000f9af0500afaf000000f1affd64fcaf00dfbfaffddffbaffa000caf af00afaf00afaf00afafaf00fcaf0300afaf00f9affd64baaffddffaaff8 0005afaf00afaf00fcaf0300afaf00fcaf0000faaffd64eeaf086400d6d6 9d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddff6af0000f9af06 00afaf00afaf00f2affd64fcaf00dfbfaffddffbaf0000f9af0900afaf00 afaf00afafaffa0002afaf00f9affd64baaffddffaaf0000faaf0600afaf 00afaf00fcaf0200afaffa00faaffd64eeaf086400d69dd69d569d000800 d69dd69d569d56dff3af0064fcaffddff6af0000f9af0700afaf00afafaf 00f3affd64fcaf00dfbfaffddffbaf0000f9af0a00afaf00afaf00afafaf 00f9af0000f9affd64baaffddffaaf0000faaf0600afaf00afaf00fcaf03 00afaf00f5affd64eeaf086400d6d69d9d9d56000800d6d69d9d9d5656df f3af0064fcaffddff5af0000fbaf0400afafaf00fcaf0000f4affd64fcaf 00dfbfaffddffbaf0000f9af0a00afaf00afaf00afafaf00f9af0000f9af fd64baaffddffaaf0000faaf0600afaf00afaf00fcaf0300afaf00f5affd 64eeaf086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaffd dff5af0a0000afafaf0000afafaf00fbaf0000f5affd64fcaf00dfbfaffd dffbaf0000f9af1200afaf00afaf00afafaf0000afaf0000afaf00f9affd 64baaffddffaaf0000faaf1300afaf00afaf0000afaf0000afaf0000afaf 0000faaffd64eeaf086400d6d69d9d9d56000800d6d69d9d9d5656dff3af 0064fcaffddff3affd00fbaf0000faaf0000f6affd64fcaf00dfbfaffddf fbaf0000f9af0a00afaf00afafaf0000afaffc00fdaf0000f9affd64baaf fddffaaf0000faaf0e00afaf00afafaf000000af00afafaffc00f9affd64 eeaf086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaffddf d9affd64fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf086400d6 d69d9d9d56000800d6d69d9d9d5656dff3af0064fcaffddfd9affd64fcaf 00dfbfaffddfd9affd64baaffddfd9affd64eeaf086400d69dd69d569d00 0800d69dd69d569d56dff3af0064fcaffddfd9affd64fcaf00dfbfaffddf d9affd64baaffddfd9affd64eeaf086400d6d69d9d9d560008009d569d9d 9d5656dff3af0064fcaffddfd9affd64fcaf00dfbfaffddfd9affd64baaf fddfd9affd64eeaf086400d69dd69d569d000000fb56029d56dff3af0064 fcaffddfd9affd64fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf 036400d6d6fc56ff000000fcd6039d5656dff3af0064fcaffddfd9affd64 fcaf00dfbfaffddfd9affd64baaffddfd9affd64eeaf036400d69dfcd6ff 000800d6d6d69d569d56dff3af0064fcaffddfd9affd64fcaf00dfbfaffd dfd9affd64baaffddfd9affd64eeaf086400d6d69dd6d6d6000800d6d69d 9d9d5656dff3af0064fcaffddfd664fcaf00dfbfaffddfd664baaffddfd6 64eeaf086400d69dd69d569d000800d69dd69d569d56dff3af0064fcaf01 dfdfd564fcaf00dfbfaf01dfdfd564baaf01dfdfd564eeaf086400d6d69d 9d9d56000800d6d69d9d9d5656dff3af0064fcaf00dfd464fcaf00dfbfaf 00dfd464baaf00dfd464eeaf086400d69dd69d569d000800d69dd69d569d 56dff3af0064cbaf00df80af8daf086400d6d69d9d9d56000800d6d69d9d 9d5656dff3af0064cbaf00df80af8daf086400d69dd69d569d000800d69d d69d569d56dff3af0064cbaf00df80af8daf086400d6d69d9d9d56000800 d6d69d9d9d5656dff3af0064cbaf00df80af8daf086400d69dd69d569d00 0800d69dd69d569d56dff3af0064cadf80af8daf086400d6d69d9d9d5600 0800d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69d d69d569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d56 56df80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af 80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af 086400d69dd69d569d000800d69dd69d569d56df80af80afc9af086400d6 d69d9d9d56000800d6d69d9d9d5656df80af80afc9af086400d69dd69d56 9d000800d69dd69d569d56df80af80afc9af086400d6d69d9d9d56000800 d6d69d9d9d5656df80af80afc9af086400d69dd69d569d000800d69dd69d 569d56df80af80afc9af086400d6d69d9d9d56000800d6d69d9d9d5656df 80af80afc9af086400d69dd69d569d000800d69dd69d569d56df80af80af c9af086400d6d69d9d9d56000800d6d69d9d9d5656df80af80afc9af0864 00d69dd69d569d000800d69dd69d569d56df80648064c8640700d6d69d9d 9d56000700d6d69d9d9d565680008000c60006d69dd69d569d000600d69d d69d569d80d680d6c3d6fd9d0156007f00d6d69d9d9dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d7fd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69d48d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69d569d000300d69dd6e59d0156d6809d80 9df99d0156d6e39d0156000200d6d6e59d035656d6d6809d809dfa9d0256 d6d6e59d02569d007f00d69d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d56d6d69d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d567f9d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d56489d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d5656d6d6569d569d569d569d569d569d569d569d569d569d 569d569d569d569d56000100d6e25601d6d680568056f95601d6d6e356ff 0080008000b700 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/secondlinelist.pdf0000644000175000001440000002102110616356703015476 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjn©g62³4×3ª2¶´01¶P0Ô3´´42(·PpÉç B€Mendstream endobj 6 0 obj 69 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 6026>>stream xœí;–ܶE᡼ԑ:Ô¼–Uò& atÒIžƒ{J*’×ê(”"§o*¯È"€‹ÿï€Y÷´Ý]E²ˆË£ âKÔo‚…Ñoâߨîo;2¹Þî?1ýøº8ùãsðçc9AdÿóüÜ‘Šìbqr}Òrè?îAµ 3âãÛÊdìˆ76rU܈?6&?þàŸúŸÕJÉäè`Žü#Ä‚¢bòëN™ä„z ¨˜ü­ ±Âú}CQ1ª =Y%H|.½Þ¯“þ¢éÙÊîàõ†ªƒ‹s“%'8«‚†‰Õb³8y_¶Ëcr;Ñv®÷¯÷ó,ÿŸKîõª=«Å_é¯oê™”îÓÉ$“†“÷ËobòÝóò,*crÍÞµL:H.¹ý]è¿×~LÚNÚÿ\(&í†Î»ÉÇŽ¯¤Ì9‰‹«ôõš™¬É¯¦_ß#I!Tî>—äz¿šx2i9¹xn2i9ix , “†“¥LÚç}O0IßžÂIÊäò«–IÇK›É“—7Â(Œ%ºì>{hÏúäÙµcçÜb&ab&AJ2ind&ÃJ0iyÉL•bÒ³Ýeò‡¨öímø0è®?¡ë½[ìß®™|_Fl?¾Ý›3^ýØ~V¯7´C3ùßõ0ï®Ö¿ë4¶oY?>Ä_ƒã9¬þóï2”-~_\îýÒ1õýïe¦ÀæärÃìdîNše73Y©•IZŸd&+ÅL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢”bòòøs»ÜÄý?VX)&¥}'Ṵ̀’LÞèKv2¬"&ïYýöÈðËŸû[6V+—I»ÿäÿ,­$“ëïur1sº£&±“¶ÊËn²…ETÁ$;éU“²Äa' •1¹Ù¸Õ‚„;±¸Ý÷¡ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢”`òû°À¡?Éë“ìdL¯†U)&ÿ´?Î’ú$,'ãL²“A9N2“•b&Qb&Qb&Qb&Qb&QªdÒœŒRvGúv`ðøÌ]FvÞW2ÙÝIó£ÙN>~2SŪŽÉ>FO[‚¤5¤ŽI9éBO¸Éiô­ž=$·=¦‘¹Db;ucΑ/ s>ÒE¨hŽÇ$q’Î ºÿ¯.Íݵmw6x$Ç…Nä/]¢*&IØž¹A­t—1}ÈÆšº@Œˆì?5©ŠÉV'×ÉD'}úµ:Vø?;¡“;0©r¬ï@²ÏxmA}'3˜Ô9QÝé©3æáqÒ{¼{`p¿ð99ØÈ*&•‰ª\ö•8¦tú}¼g›b2¸ß*i&t2—ÉGµDè—º†òxk8©kAä£[-èbŸã¦­²¢®Mëdm»ÛºßuÙÛŠ¯}´YQ!ú‚¬yæ¾içÞ©è%ÆÌ?—¤Ìqþ·ám%ÆøN0•¸%îŸD‰™D‰™D‰™D©É×½ã;’J˜d#c*`’•-žÓ‹3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰RÖºjÉ%™cϰi[D4k½ 9Ï'g3ÎI=Ií Nf¬a¹’~IÎ|'sÖ°ºl‹‘Ù÷¿îâžÖô²z,&!çì¨ÌuÕ.j¢¾o.dp2~ø¦!ÓIÌ9;ªI¹Eß»œ‰Ìôo=î"¢íçì¨2&e¦&+yzÜAænÌ9;ª’IcŸÉí¨ú˶œ„œ³£òËn¯“žG!¬J ì> 9gGÕ'}3éÇ3[ÿ™Jœü6ŽšioÌ ×#Åì“Ö‚¸Ý ÷¡ÄL¢ÄL¢ÄL¢e²ïJº)è©ØS.28Æd×ËY—üînÚ!éJ%"Ž3Ùo¾þcºûwñ²¼ùòÏú[ì“t¥RÇ™ÜÇÉ/âúbÇ5·“¾ˆg`ò,N&˜¼têfÄuGþ5“žK©ˆ“L²“›ÒNŽfr G½ I›½£™½ºŠRg²ÙI5¼$ßrr0“[4ú•NšöËGd$÷v2ñp&óœÜƈU%é±´,¼Ü¬/†D)íäX&_ÅUn}M8YöFÈã„”' Ùa”Šx4“¯*,Ÿ“êxß°3jD†–]t£TÄ£™|Ñ[“¹[˜n§ :)“)ñp&éö2'Íábáe¨´“£ï“R×Ô}2”«UÙ=ÚÉ“7¼—†“¿db¹NZ%Ž3]©s‰SÏälN: ®é6Ž\ß­o-Hošì>q2¬“Rwöñ÷ÉR'G-¸–º³ÉA ®¥"Ýg^™»(íäØ>ó39ÉL扙D‰™DéÐLfõ™—?ÆVv¨TºWmb&óœ¤ÓŽsÕâd°WíLFd>d©ÁÉêvw'Õ´»££æ$jã»_ô&ãó•W·»;©ÂÉøèCà ðçj#>&“Û»œÑ³ï÷²Áù\mÄ'`2>ú@r·ääÌLŒ>èÜÍL69é±m:&ãµ¹ZáFŒú¤ûÝ/Á'Øj#®gr6'Z¤£¾?Fh7…ó[ŸZÐÄ÷ɰ:üÛ¦tèû¤W£GNÄäàчó09J'dr˜I”˜I”˜I”@LZ\\\ÈÑs3ºxÇ0©êo3:©Z‹îf¤ LêɈ£œŒH÷`x6…`Rwýá¦wö}0Öo±Þ·×åLZ}*u}‰ÒÔÔ¯ >úéÉÄDÜÔ?9ÌÉòчÈ ˆ˜|¼?ßÒiô!v(âöúäÜNÊnÝàÍ‘ƒÚ83”8éчÁ%Nvgx-ÈŠÃ}] :d»^ïNë|}AóŽ>ŽÉiGŽÆä(ÉAb&Qb&Qb&Q‚0y©/,­ŠŸz‹ë3/«[ÖWDý“êqôŠŸÉÉ$“îý¼ANV¥Ý|°!Pÿ¤ŽB?Ó¯úoìOvßt“WöÇóÜèC0 ó8+øòê=¨ÏÜpRužêg5H§–Ñ-£Ì°»ep£¡$¬ÿiðU‹dtaRþ@u¥ÎnãrÜú 7ú`ÜÂý˜ft]–=˜¤—`=k voYO;íéµ’(sR~éd“ö³Î?7ÉzLF´“(f²LȲۈÂýjœ¨“v–ÜÙI;[wq2¿>IïÝÒIZâÐ[{‡GåêD‰ã?ÎûëdAG®l$¯OnRñêÝ´ã_Ö“V›jABÝš±¡+^¡ãdtýjA‡lwçæÎŠ\Òùú‚r3&z”â„LæfLð(ÅüLFV—JÓ3[]v*ÍÎd(®#:9þ»H|qÑIf2OÈv÷C´¡Ö/®ì>sÙ_Ô}2²/è!Òâð+Ëg˜“nŠÀÚ8U&ãáöp2®IœL3©{óUߘÙx%óïn™‘åLGH ¡C ˜´{òUîö÷¶ôÊÝ‘ù¥²ÓÄì—·ñÏ>'ížB÷mu\£ÆošÐû>û`\”ÏI:ÂÐWÁèéàSé“-“2i\—µÇah« ÏÜ.uhâ6'“q'õ°ÃD¢l¼\Ÿù¤NZ¡t²t£Ž£mG…`òb:xš¾è¸*F.j©cá}¢-`ÈÚ,º(<€Ž«rô!và¥)`lÿ¤·‹°.Ót}Â`[ÀØ>s'¶í:;ÄU3ú@»ÿ„ßÉú€w`²N½úÌ·,c²SÄmLÎédøo_'k˜Râ$GìÜ÷}Kœ &Õ‚‚‰»÷IY!¢h ¸c»»%§ì?úÐí¢.}A€€G@Ã}˜lØsô3\Áý“(qÿ$JÌ$JÌ$JÌ$Jøyæ>YÇd´Ë jæ¾–áãåú;¦´OŸyO'/7ròÑ›ŠÏ:A­F1Ù—JZ¹J5™ØnNf>û Ãv… K ØÃy/×Ií=·ºq.Ì!µéÑ Ÿ¡Cæ™n¾¹Ý1î\ÔTÇK¦“¤Ã3BpõõÙ3SÛ„géýS×­zn¢ÑçŽ>ÐÞ ·M˜¬áØ· ;Ïܾ ÑÙI’»Izî?¢öƒx«pLÚ@È+èë¤/=sÓEeå£0)ܵ–h¼'C—P\ J9ér:/“FábÝö{•8BëlNî Åßö/q²™TäÙ„êøZ*3禷N™˜Q3>1“ZÑì Ž«¶Ý Ï#`_¬Qî×ÌeÒí×äþÉ“¾ˆãL¾Š~J´{&]©Tk1Âd׫ù妰WÒ•ŠGc’U (“¬1“(1“(%ÊVsú&]©xÄñúdG½FÙŸÑÉDÄq&Õ˜ÅñOvŠ_B;þ!g¡•Z_\uI…“¡’ˆãL¾¨`®/3¸ …~}Yöü“W]Ò%ád¨(â &—³]E‰“Þ$×>f!#Ës²4é‚p2Tq’Éå\¿ÌÁÉ„bNþº7_×Èrœ,Oº œ •Eœ`òq1è¤xD–v²&é‚p2TqœÉWÙ²D:¹–̯)'«’.'Ce'˜ü)Õ(¤“K ç%ÍdMÒád¨,âä}òqA8'רòî“åI„“¡²ˆ3ÊîŸëŒ“Wy¦¼²»4é‚p2TqV}ò§(sòêßñòå*t=1¯>Y–tQ8*‰8³ó³ÄÉPä÷¸HË%·S’tQ8*‰8YvwSºìžM Lv}Ç5¡‘ L² Ä}æ(1“(1“(1“(1“(1“(1“(1“(1“(E™ü40°ƒ(s®;™ÒUOË`&[t†“Q&ù¦Ñw!ò™d'#²d&kÅL¢ÄL¢„dÒ¿bÏÍ}ÓçñÖÁB2©ž°¦âNžÈS(“öŠ=!'#Ž+8“äAõËcÍò=aò¢Ž8‰àLÚ+I+;h'­õ,N (“ëoÂ]MEn“» «ÓÎ ü}r}µüŠ:)è^§þ>)„ñe!'Õ:*gQ&åz¼Nò}2(ƒÉK'3˜d'-Ý-©erºUΆê“ð:™Å$;Ip’™,3‰3‰3‰3‰3‰3‰3‰3‰R“'lW“ì$ß'Qâû$JÌ$J-Lþ="àiõ¿&ÙIª€“¹LÞ.jyi+²Ë{`ðøì P#“Ý4?z@'3™ìcdð´3ÙÈä2§o}Àá"ÔW«y|úíE˜_é÷xQÇ©Î9è¼@ß~AÏñ˜`8JÍL'oöõ•ÏÖ.õl‰µÁs 9.t"ûø1jbrîñ –ÂÀS˜o]7zÁ6Ö’=a;Ù7“yL¶:)gìûœ4öé×êXáÿìtNî¤ʱ¾É>ãµõôNfö A<±í2ÿ“Þã݃ûÅœÌ쟲8ú¥]â˜ЂÁ>Þ³–8þýô¸ÌgR>½¤^Úµ ÃI] "ÝjA7ûô‹¬eE)\ šÔÉúv·u)¾+³·_ý8»"jlw²êƾª²·ú\bÌèúwXP&eŽó¿ o+1Æw‚)ÔtŸð´â>s”Çq¬Õ.ʃ<ò¢-Lvwò8¦¶1ÙÇÈS9™É¤|4[>©½6êtG¤|{3+ìÛûí°ò©eóy¢ùŸZnf’8é´ßtûÄ×Äólðh¯ë2­šçmNÒuèÝÎZ¼Á:ÄÝh¯M`.1³šçµ8¹5¤½Nû¯çÖH&UŽöHö©.Œ©Õ4CåÄ‹Ð/oÔ\ýGxœôïhäøiÕÂäßÒDU.ûJÓ R8Ç{¶¿ÄÉgRùÉ—v-ÈpRׂÈG·ZÐÅ>éÖC7Ó Þî¶r¡/SÚۦϸYBΟ´r¡/Sz3ꩬcÒj‹øš&Þmgv’û'‹Åý“(1“(1“(1“(µ0É«/™ªf’´TËäˆX'W“#_L~çTÎ$+$^%f%f%f¥"&¯#"<²™d#Êe’L)“IVøû»Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&QJ3y1§“ú§’žc‚i“RLªGåÔÇ3õðÇs+ÅäöBÊIVšI2)_.GCWœú©ûiÙ'Sò>I–53Y2ŸRò<ûlÊ(»Çë<Ï,z®{.eÕ'õ²=“ê店\”WŸ$_›/åv2¿ì9y¹±“«²ë“ù%Îó:™ÙÆ Õ‚„rSð¤Nr»"î B‰™D‰™D‰™D‰™D‰™D)Á$?}Â8Á$;“ñ@g’I~°;¨OÂr2Î$;”ã$3Y)f%f%f%f%f¥J&£Ó0rvy Ÿy¢¡}ó•LvwÒüè!Ìb²‘ÁÓÁÈJ&í…‰;¯°ïIƒžãF'† S5“t>Kïö'rŽŸËÉ&UØû¬°<Ùgœ{ˆª˜lu²p…}ãDÂÿÙ ÜÉÒö=iÁÉ &uNÜe…}w¿ð99ØÈ*&•‰û¬°ïßo•4:™Ë$]þ¾ï ûÞ4Œ‰Is:YÛî¶.Äw]ö¶âkmVTˆ¾ =VØŸ¾:„É=VØŸþŸ%îŸD‰™D‰™D‰™D©I^>¢&ÙȘ ˜de‹çô¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢äa’¿ì¡N.“£#:¨®|Ÿ‰ï“(qÙ3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰RŠÉÊ¥—žp†[ŠÉïUž|zB®“L²“™b&Qb&QÊbòSÉ—·;Yœd»“Ìb²$ëú]¼bj I¢™¼ŠÝ¼‚ê\Iæ2™iÍws²,Év5&™Ë$;™J’™D%ÉL¢’d&QI2“¨$«˜T+UßF8'«‘5Ü+€;©×î1Ö…I$YÁ¤þZP½„ˆ•ÐI}-3'r²”IM¢ZâÇNï¤.µÔÓI’t2Ér&£”ôeÒXð²­¸Ó›I{±P’åLš×fA²Cî¶¿g´³“¾¯6íÀ¤³xJ§çF´V ëàä¶Ag:cU³>Lî›»enz!¬þLªÕÍÉ“l½OîUâXL’={9éÖõL5—ݻׂ&v²±>Ù¹f.qvr² ÄimãP+;;)׷ݘ,©q»’$÷¡’d&QI&ß?þ`&ë“$LþwyÏLÖ&¹0ùvÿ»Þ'…øÁLÖ&¹2yÿûûê$ß'ë“\7'#ewþ£Ê0'Ë’lWc’™ewÁ3ß(' “lWc’yõÉ’‡çAN–&Ù®Æ$yþ$J<%f%f¥$“uËË>§“üŒDüŒJÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$J¼N/L“ßFGtXYL~Ï‘E™üüƒZ~“a»?Þ";ŸI #“ÁÄ[l÷é#jÄÆä½äÿ¼‰øþgù¹#õÛ¿0ùý·xñýO£„w'YýW«3! endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000386 00000 n 0000008162 00000 n 0000000327 00000 n 0000000172 00000 n 0000000015 00000 n 0000000154 00000 n 0000000451 00000 n 0000000551 00000 n 0000000492 00000 n 0000000521 00000 n 0000006769 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<0E6B03274515F22B1CC96ABB5F41431E><0E6B03274515F22B1CC96ABB5F41431E>] >> startxref 8328 %%EOF geomview-1.9.4/doc/figs/secondlinelist.png0000644000175000001440000001173710616356716015532 00000000000000‰PNG  IHDRI2´©%PLTE¯¯¯•••ÖÖÖdddVVVßßßZ[„õ‚IDATxœíËj了¥pØcizB“hšL¡èñM‘iÓ„Ÿ°)òúۺߖdÉZ¾Týé$eÇ–¿þmÉZ²,rúÏ)ÐÓiýx—_&Ê—@—ÓËþz'ʯ¾žN»ëéý%\^†kÂÅ}ô.þ^>[ÆË߇Öã‹òòaïr¦¨“öò×.åM¥þûb¼<}uò?o¨ÇÜq¬—/.?í•ǃãú%Ñ/祷õNå¥ܧ©$ÒåãÓ/ÈË‹ù¦<îƒÎ­9/ åñRSj7º.5eÖKsÆï"/Õå¹¥ò’”½4˜ÆË­3ΤìeøÚ¾ ZX^n­…÷ž5¼ÄSì¥ÉÍÇöòÑ”9‡öÒÊyùâ…¿?v »ýã¾{Ÿ•—w¿=]œüÏ[Ê?îoï³òò¯ËåaÝ€ºS§ËE´ ¾\>¬ÿ½œN‚òééƒWŸ¾žd¿|ìRÐß&ÜK]^/»5¼ÄÓðOÃK< /ñt£^N•9JÙ®L©/©øfò×q”x)ñG {Ég„rJöds½”gœÈ¯c(ñrÊ=Š’è¼¼¸{¢yÊçqªŽ ¼—‡¢Ìz)òÎa(3^2*K¢=Ñ<Ýè}ü^âix‰§Ûôòþ|,iÊÈËû½±B½e¼|ÝôTÎéSýJ¼|Ý’¡^ökx‰§á%žJ^ªf¢ ¢¶Ñh=Pµgðž­”—Í”4O9 ò’¦\PÄxH áLQ^OðTòR´ Š0ÙZD(UMGâÓqmz ݪäöÐmLD69­æ¥¢T-Ed”öˬçv »e·ž®v]Ê+žÚ–"m¬…çªåYÕžäÚ–Ü_»›k ^ÎQ2Ù‚d¨ô1Îï¯h” ¼$—j‰p¿n /åy$æXL!{”ÞzŸ×.{”½#/©lá~îÑ”âË­çaîñ–MÎA£½œŠÂý’HQrõøbZO§’ˆ™-$Á”¬ëvX õË~ /ñtÛ^¾íÝ?0”¦Œ½Ü+ìå15Ú‚ñ4¼ÄÓðOÃK< /ñ4¼ÄÓðO7ê%!5U×DÚŒ²Fï8 ? úÙ&•*J¾NßM¨oÖüÉœ€‡(‚úf1nÚø§oÑæF8ƒD¶ÿÏQªþ†s[6R^ JêZ)u›¿n½,z«)+¶l¤ÌxiÛuƒ¶j׿–¡$¢Y³fËFÊŒ—Üôõ( ™{Æd¼œß²‘²à%O¼ä¼Ü@i(ç·l¤ó¸£d1eÕu9¿e#%\^úmüºÍ×Üß{·­øD–D¼ª|Y­$ºÍûø!5¼ÄÓMzyßÖ¥ïÕî Ãë+%yy_ØЇÙá ™2J8öòµåD|™ûùíÛ?ß¾©–åsç‰Í&{¹€òùº¥KÁË-(/ënЉ}Šï5(]©—‡¤ìöòùƒŸ%‚H]ïh¨}Ä ÷{9KI¸Š.z(»½œÒ‘?<ÊP&vn¥ôî÷ ´âtÕTõIÒAó"Ê^/ß®âSú_†Òt™«¤ôîöòíPÊõÔ •¥éUKé%ŒP^ Å^zÁq@IêâŒ8á~/½'Ä)%ç<ò²J e÷u)¯J®£½.ÊÄKÚH)öKrç~§Rõ¡1÷”½Ä¢4%‘º÷ˆ¾r%êuRZ‘Ç|ÿu™£¬=»EÊëê^VžÝ,¥—pw]½tÆñ({ëêÛP/ñ(ÿ/½Lëꢿ}¦Å5[R%57d/JÕ ¿ò\ª_"Pbùö"eù>Ž@™D”y/ÓÈGqúïµ”«\—qDA½—lü¿US"{)ïœIDAÍcþ­šr/£ˆ‚2ûjÍ2Êu®Ë(¢ æ›czÉu_ŸB𲡯@UD¡ËKû2ÿ(®š2ñ‹Ò–DêÞ#_·‘œöQ\CI´æ}¼«®¾æuéÔQläegD±—=ÚôºÄ£^âQÞ®—µÃÕGZµES— —Òë³³˜ð’öRò# D/Yù[A™FºWŒþ=[ÜWxIËõ•*Ê$¢ˆ¾Z):Q¹îW¦ÌGa3v#%P¿ì¡ÌFÑC‹FÊÔK"úö"QrQD-)Áò™2ìÑW‘xÕ½§?÷$Egîï=½%QQô–DkÞÇo ®ŽQ¬ç%fD1ê—x”ÃK<Ê›õ²ØkÁÜ…)L ô'Ê ÍÑD™ziz)ÁÇÙ‡2õ2~ç2¿÷RJ¨~éz)‰¡Hô¹Ð¯üpÎÍð^U…¤ôŸKÉÈRUW7½”(W?Ô If/7 QUD!WEU"™£ÙÁmZ¼TõBåÄôùŸ«" }„†7‚T§—ŠÉÛÅÔ+?ꌓeQ(IîVßì% ¼äúŒg½„ûe½Ì¨2ë4ì@d!%í¤¤Í”py©.q‘NƒX”PD×Ï ‹Œ(Ðú¹µR†=nq„ïåy J„wRlbÇõrÊõÒTS*ž@”i]]Ô’Z9*ëDÜ{ßÖ(=T¥Ý±µÅK¾”2eê%Ó=“¸én,o¼rtÑJÊ0¢ëT\B*‹õ /më(eܫĴœñ°A•r[³jh¾½.u=Ú–fg&€ˆ(Ô?3qQuSøìuIíø¶-œd*ï¥QH/u\Âëò{µ—< $µ^uuàËÝÌEÕÏ{J O+¶€rᇽìÍ=~Dár]œ{@/uI¤F Ð!~‘2.‰¸Œ¤HÕ¤y›ÞÇóŒ"Ky¨gy/ôŒbÔ/‡—kPÞ¨—•Ý2”Ùˆb®F]¦ëꘔ©2÷tPFú½d&š0£ø7S¦%Ì>Ù`Ä TO™z)ëCþl (Óˆ"Lr¦óFmýÒŸK¤…²Qp/É™^6µuu“\ö1BÙË8¢ð¦*Ñ”ÅТÝË‚Zêêæi‡ó²!á9/)ieÁËŽÜG&9û»1÷¼ì(‰âˆB'GM²­%Qñ>>SÂ/(fo-u¢ÙùD–EÓ”´x9;ŸÈ²ˆ¢bš’Q¿uõá%e¶]ÝɬInkp©îÝsÉ#Ó%uõ6JÓÅÄIyTÑ„Ùåå\bgÛHéí å%cª#µsšn4¾­C”’Km-CÕ…BwzRÏ*€§s”à3 Ñ£ÊUÿm3+‹în¥¬n¸W°UýÃVLkk¿—\5U1Õ•BZLì¬ú|xAƒ}É íº´”Dõ”êŒÁ—O&ú(A/]m·Rºý˜a6cûb{éÍ»S²Bb¶$Š)»Ï8ì¥7ï'mË=Ülf(ý¡ çØKñÃÎMØTq9¨4¡6÷È—±uqf';ìöRªîéQË}¼¡ù©ºNDF z©ãÓãPŽú%åðòF½ìnWÏD-3¯.©«·Qf"ЦyÖ¾.³E%8Œ|iB=Qh¥ÌEd.±"%8 s5˜VÊlD±†—ÜT×)ÁˆÂTÿ—Sf¼¬¦ŒÇe…"ŠE”åñ/—Pž£ÜÖÕ—PfÇsk=ãS:ÁØËÙˆ¢õŒ{ C^ªÙQxeî‰)sE%à¥|iBZRS=Äc‚YP^z ï=UMc!%ŽÊÒ}¼®o—±ê=´ãP"Ì¡p^©ææƘbJ„:ÑϵjÁ?s^¾5Íhß!›§Ä®L8ö²9±O/±7LJ?ᛜ¿ç ^â©o.¤×0±¥3Í&Ü7¯ÔÇZ”Q±—2ÚøüÉ/)þ‘›<Ç”rå?àÞVÏÅ"N8öRP~^g)~~f(Ÿ?öP ^NÑLéöšêÐ"5€òùó:Gí(“pêåTÜ×Pò)µ”òùó㾓J8ñRÜ“ª(§ÔÊçOH/§޽|ûäµ”üüSN”i‰—bN¹:Êó9ñòûTÐõS¦ §×å„YEy>×å„ÙM $ äñ©P­ yüûùÜI % •—9JïÞðóz(Ö}Ÿ¥¼–n:pÂས¼‰A¶Èý¾ÏQopÂio«R‡”M;7${Ù•ØÛj”·X¿<¨†—x^âix‰§á%ž"/¿ Ýã°¤(C/¿ì ëz^ža/7½Þfu¯)c/÷dJu?¼DÓå¥×!Hýf|þÉž*½´‚hL¹ j­—¦CO©Wl z/™‰rã%8¨ÒŠ”ó^š®Öª„¤4}36£œó’hM×0EY×#rÞK3†’GÉIÝ8Ch”ó×¥CɧZ‘²ÆKšRìº?ìH|¯ÜSw]ꓹÊNòº\>®ÏÊ?â>¾³†—xÊzy¿ìYñ*úÈzÙØh½¦®y/?6>«yݼüØû<[Ý—¼ÜÎè­ìåÖg6£Ï²—{¢yú^¢ix‰§á%ž†—xú#¼lzów=Íxy<Êq]vêð’C3^î§5ç%•[1 ¥Ã¢õ Úƒô²™’­L zÉR.€’üŸ P‚^²éxŒÚqTÅè%Lϵ4ýfvÈV³…j*tËzôU±(a/¥7ˆ*ñ†Zµã+¹‘–X´ìÖ¯ç%çNø'Æo‘'’QýS~¹^|3}Ö™þÉì_Ô%äå¥hýw”zIþdjÄ|tÊ%^òÀKµÄ=/É&^ÊóÈͱ¨Bö(½õ>¯]Ƨë—DäcâçM)T²ëI˜{¼eµnm/åXÉ~I¤(eIDÔÐ \"f†zêí!K¢•½tšrÚ%kB!–ì•u"],Ë2’„Ÿ2”½yŽ²ä¥œèÿ¢O0¥Ù›rÔÕ;5ç¥7ÞŒWB#Ó¯B zÙL¹Ê“Ó9/+ç`|+JÐK=V†n[1”èOnöb좨ú>n΢ ÉšÕTY'ÒgÑ í ”½-eÉKs?q…Œût/wÖŸQ¿<††—xšñrïÞNFE/ßö¦3*z¹ñ‰Í«äåÞ<å½ü²÷yö”÷òP}Yñ4¼ÄSÎ˽ ŸXŠ2òòº7U,Ð˽¡A^T7ùþøA5¼ÄÓðOÃK< /ñ4¼ÄÓ­zI¢wîW}l[©ÄK¢_mµhMCᯤÄKóþºG¹¿/%"1s“ÉbnöÝ(c/™×Ä>{ª˜—zmÊ$3ó0Ï>…¬˜Õ}mÊ´¼”}†¨™vñ”@yIÝ3ï£PByܧd‡ „ÊK0÷ÊKyïñK"NÌ„‰òòu"< /ñ4¼ÄSìåýÞ­ª‘4eäåýÞX¡Þ2^¾nz*礙$^¾îFÉP/û5¼ÄÓðO%/—výš:ë÷%/—vý_òra׈¨³Õ¦äå®ÿnµEåŒð5” —˺þ»e·~=/—vý§Üu WK´78.x¹´ë¿îdïýr—¹®ÿÞ\ºx¹°ë¿]ö({f ^.ìúï-›œƒF z¹¨ë¿·‡jWZ×K§ö®ÿÈ-^u¢ö®ÿèmï^¶wýGùlÔ/ñ4¼ÄÓm{ù¶w¿êPš2öro¬H°—ÇÔh ÆÓðOÃK< /ñ4¼ÄÓ­yyÝû9YAÎ˽k?%ëOÃK< /ñ4¼ÄÓðOÃK<ݨ—…úÓë~”±—” x`%^¾æ·ýØ€ÖðO€—_àZ}%¼ãìnÙ‰›eê%¼Ëu1åëRÊ«£¬õò¼”òº˜Ò@z ¤s_E mQSÌfi(!/G9¼Ä£^âQæ½”1L‡jJ1LtÐA§šÒÎ,KSʬ—LJÛ(åaübQ(³^2Õý‰¹]ª)ùrJSf½ MiôR÷"ý}Z½$jâ‹J/õáø"Jnz6SÚž‰-^šN/-¹GQšÞdÕ”Dïª{©µx¹ðŒ /Õ«©Í^JoH›—‹rö’/¦´‡4”sy|qI„J9[^6–êAîYB æžÙ{2³•R÷qn§„K¢[¿‰ò†¼¼û} ^þu¹ÜËËe:ã§—ƒ{y: Ê£_—_OI[/k(¯ ›=³‡4”@UE¹´q6{HC ”—à5”ð±j(s‡4”£ýMÃK<%^¾ÁM¥B;RŽggh^âix‰§á%ž†—x^âéÖ¼„ÃcÈy‰7“ç 2^~=ZÚË—ƒKzùèëéåq½‡‹ÊK_—Óv0Y½¿‹Â˧P§§ýõþ#\ž(/¡N—ýõþ#\Þ»˜©Ô¿3 æ›ÐâLIEND®B`‚geomview-1.9.4/doc/figs/load.eps0000644000175000001440000011012010616356704013414 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: blah-000.ps %%Creator: pnmtops %%CreationDate: Jun 26 2006 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 174 366 438 426 %%EndComments %%BeginProlog %%BeginPreview: 264 60 8 420 % 29292929292929292929292929296229292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929a9292929292929292929292929292962 % 29296262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262626262a9 % 2929a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262626262626262 % 6262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262626262626262 % 6262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a9a9626262626262626262626262a9a9a96262a9 % 2929a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffff2962a9 % 2929a9ff292962626262626262626229626229292929292929292929292962626262626262626262 % 62622929292929292929292929296262626262626262626262622929292929292929292929296262 % 62626262626262626262292929292929292929292929626262626262626262626262292929292929 % 29292929292962626262626262626262626229292929292929292929292962626262626262626262 % 62622929292929292929292929296262626262626262626262622929292929292929292929296262 % 62626262626262626262292929292929292929292929626262626262626262626262292962292929 % 2929292929296262626262626262626262622929ff2962a9 % 2929a9ff296262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9296262 % 6262626262626262a96262ffffffffffffff62a9ff2962a9 % 2929a9ff29626262626262626262622962626262626262ff62626262626262626262626262ff6262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9296262 % 6262626262626262a96262ff62626262626262a9ff2962a9 % 2929a9ff296262626262626262626229626262626262ff62626262ffff62ffff6262ffffff626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9296262 % 6262626262626262a96262ff62626262626262a9ff2962a9 % 2929a9ff2962ffffffffffffff626229626262626262ff626262ff62ff626262ffff6262ff626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9296262 % 62ffff6262626262a96262ff62626262626262a9ff2962a9 % 2929a9ff296262626262626262ff6229626262626262ff6262ff6262ff6262ff62ff6262ff626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9296262 % 62ff62ff62626262a96262ff62626262626262a9ff2962a9 % 2929a9ff2962ffffffffffffffff62296262626262ff626262ff62ff62ff62ff62ff62ff62626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9296262 % 6262ffff62626262a96262ff62626262626262a9ff2962a9 % 2929a9ff296262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9296262 % 6262626262626262a96262ff62626262626262a9ff2962a9 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9626262 % 6262626262626262a92962ffffffffffffff6262ff626262 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9626262 % 6262626262626262a92962626262626262626262ff626262 % 626262ffa9a9a9a9a9a9a9a9a9a9a962a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9ff626262 % 292962a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff622929 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff626262 % 296262a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff626262 % 296262a9505020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020202020202020505050505020202020202020202020202020202020202020209b % 505050202020202020202020202020202020202020202020209b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff626262 % 296262a9505020505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b5050505050205050505050505050505050505050505050509b9b % 5050502020505050505050505050505050505050505050509b9b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff626262 % 296262a9505020505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b5050505050205050505050505050505050505050505050509b9b % 5050502020505050505050505050505050505050505050509b9b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff626262 % 296262a95050205050505050ffffff5050ff505050505050ffffff50505050505050505050505050 % 505050505050505050505050509b505050505020505050505050ffff5050ff5050ff505050509b9b % 5050502020505050ff5050ff5050505050505050505050509b9b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff626262 % 296262a950502050505050505050505050ff505050505050ff5050ff505050505050505050505050 % 505050505050505050505050509b5050505050205050505050505050ff50ff50ff50505050509b9b % 5050502020505050ff5050ff5050505050505050505050509b9b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff626262 % 296262a950502050505050505050505050ffff50ff505050ff50505050ff50ff50ffff50ff50ff50 % 505050ff50ff50ff50505050509b5050505050205050505050ff50505050ffff5050505050509b9b % 5050502020505050ff5050ff5050ff50ff50ff50ff5050509b9b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff626262 % 2929a9a950502050505050505050505050ffff5050505050ff5050ff5050505050ff5050ff505050 % 50ff50505050505050505050509b5050505050205050505050ff50505050ff50ff50505050509b9b % 5050502020505050ff5050ff5050ff505050ff50505050509b9b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a950502050505050505050505050ffff50ff505050ff5050ff505050ff50ff50ff50ff5050 % 505050ff50ff505050505050509b5050505050205050505050505050ff50ff5050ff505050509b9b % 5050502020505050ff5050ff5050ff50ff50ff50ff5050509b9b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9505020505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b5050505050205050505050505050505050505050505050509b9b % 5050502020505050505050505050505050505050505050509b9b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9505020505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b5050505050205050505050505050505050505050505050509b9b % 5050502020505050505050505050505050505050505050509b9b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9505020505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050509b5050505050205050505050505050505050505050505050509b9b % 5050502020505050505050505050505050505050505050509b9b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a95050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 50505020209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a950509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a950509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b50505050ff2962a9 % 2929a9a950509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff2962a9 % 296262a950509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff626262 % 296262a950509b505050ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff626262 % 296262a950509b50505050ffffffffffffffffffffffffff50ffffffffffffffffffffffffffff50 % ffff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff626262 % 296262a950509b50505050ffffffffffffffffffffffffff50ffffffffffffffffffffffffff50ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff626262 % 296262a950509b50505050ff50ff50ff50ff50ff50ff50ff50ff50ff50ffff50ffff50ff50ff50ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff626262 % 296262a950509b50505050ffffff50ffffffffff50ffffff50ff505050ffffffffff50ffffff50ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff626262 % 296262a950509b50505050ffffff50ffffffffff50ffffff50ffffffffffffffffff50ffffff50ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff626262 % 296262a950509b50505050ffffffff50ffff5050ffff505050ff5050ffff5050ffffff5050ff50ff % 50ff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff626262 % a9a962a950509b505050ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffff5050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff62a9a9 % 292962a950509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff622929 % 296262a950509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff626262 % 296262a950509b505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050502050505050ff626262 % 2929a9a950509b202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020202020202020202050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050ff2962a9 % 2929a9a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffff2962a9 % 2929a929292962626262626262626262626229292929292929292929292962626262626262626262 % 62622929292929292929292929296262626262626262626262622929292929292929292929296262 % 62626262626262626262292929292929292929292929626262626262626262626262292929292929 % 29292929292962626262626262626262626229292929292929292929292962626262626262626262 % 62622929292929292929292929296262626262626262626262622929292929292929292929296262 % 62626262626262626262292929292929292929292929626262626262626262626262292929292929 % 2929292929296262626262626262626262622929292962a9 % 29296262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262626262a9 % 29a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9 %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def %%EndProlog %%Page 1 1 /picstr 1653 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def gsave 173.76 366 translate 264.48 60 scale 551 125 8 [ 551 0 0 -125 0 125 ] { inputf picstr readstring pop } false 3 colorimage 78DAEDDD5D729B30180550AF322BF0B6B206EF26AFDD4A33F594D1F0233E8104 C29CF3A049A84308B4BABD58761E0F0038CE4F1BDFDFDF5F5F5F3F005CC1D73F EDF6FF1B0A69E8FC7E5A771C1D7FF5FD1B8D46A3B1FABCDD68C67E1B4267B4BD 96F4F801E859DA141AED7FD4741A858E4B097095DC691707B34DE7BDDD68341A 8DC6FD63A4E9384B46A3D168AC953869A3596A3A56F40150656974A4E9B45B47 0DC01D641ACDECF65AABE6AC97361A8DC6A6E330D97675541B9A8ED56B00B75A 72566BC9749A23A54DA787E307E080A498E657FC199CD17E8E6F3AB3C7BF6A74 F0B534DA2DC0E989D3B4E90467CED1C32ED474840E40574DA7748ED574240EA0 E9B46E3AA33B6C97683A997498BD7318D92E74004D47D3290A9D74FBB68F850E A0E95CA5E994BE0AB56ED3196D5C0DA6A5D6E32F2770C3A6B3743BA8E7A65334 638FBEEFFE7B6B99D0990DBB604801DCA1E92CCD8D9D379DA2D0497327DE744A 6BCEECC76A0EA0E96C0B9DAE9ACE863B6C559ACE52E804B70B1D40D329BAC3D6 CFEAB50D4FEBC49B8E2504002D9ACE77F8699D5BAD5ECB2457E9A2688BA5014D A7567E7DF6EB7400386BA6BDE73B1200A0E9683A009A8EA603A0E9346D3ADBDE 1940D301D074B6E557E9BA654D0740D33932BF36349DE16BF78CBFFBD9B907A3 D168341E33D30EF9B57F3F99A6333C32DD3E7CE14EB5F603C001336DAD5D659A CEF43B3E00609F77D31925D1B07DE841EF3F7A01C05669D3198C4227BD23E78C 01B0337446B9B3B47A4DE80050ABE9ACAE5E133A00D46A3AABAFD3113A009CD8 74FE1096BF10DD1EE185CE21F0F14D4794043D9FCFCE4367E9082F740E014D87 F76CD979E8648EF042E710B84FD37126973CFF0B864E6F47D8C3250E9E43E03E 4DC799143A4207D074848ED001341DA12374840E683A2D9ACEEC1BBEBDB70F0F 283AE0E9AE6E183A4B3F7E644BC5D099DDF9EA952DBD6A4207349DA2D0C96F2F 0D9DE9DC7BABD019FDC8D34F4BA777A1037C58D329CA91D207DF3074325B3201 747CE854B9E24207349D764D67F5BE5966CA1DEEDAA55B467B8BCCCFB307307B 60D3EFD83A74E227333EB11FD37466EFAC46AEB8D0014DA751E84CF362756FF9 1B4DD3BDAD86CED2C6A2833C3D748AAAC401A11339819993297440D3290A9DD9 A7FE57FF73BE34A12DFDDF38F269247456EFE015B589E343A7F479AE9DA1B3B4 5024726583CF40091DD074DA359DFCFD967CD3294A8ACCD4375B9AF237EBDC5E 8B1F4CD115173AA0E9B40B9DC801AFEE6767E8CCDEF929FAD17A089D57070B09 4A9BCECE7308683ADD86CE740CCEE4E786CEAB64F5DAAB9B25D34207E8B3E96C 584890BF4B36BBB7E02C1D79EEFB94D089BF4EE7D5C78B432D24003A6C3AAFD8 92E9A5670166E7DBD5250799AF5ADDD529A19339C8D7A617CE58320D7C52D3B9 39EFBD76D83904341D848ED001341DA12374004D47E8081DA1039A8EA6237484 0EA0E9081DA103DCB0E93C59130C9DDE8EB0AB4BEC1F2C683A12A762E8747884 5D5D62FF6041D39126B542A7CF23ECEA12FB070B376F3A007058D301004D0700 4D0700A1A3E900A0E900A0E9A4AC850620F8EA86FD4DC7E90560B0FA6B3DAB34 1D9D1180C8EF92AED2749C6A0082A1A3E900A0E900A0E9081D00FA693A8F0FE2 6F1140E74D47DC00081D4D47E8007C64D309464F6942B54BB4342E871F01804B 349D6B854EBADB347A00D074840E80A6330D9D74CBF4B992E96C5FF7F1B30935 FDD3D1FEA71F03D07FD319CDEAE77EBCFA484D07E0EA4D6776263F727BFEEE9C D001F898A6D33A5CA6DF54E800683A47361AA103A0E99C153AC14F850EC0A736 9DE33F8E3C52E8007C5ED33965C9F4EA57091D80739BCED06EBCF71A00D59BCE 902C43E80CBCCB3400159B4E1A31E9EDB537BF4F07808A4D27350A1DBF391480 BA4D67367436AF5E0340E8649A4EDDD56B00089D7CD3A9F83A1D00848EA60380 A60380A6136F3A7F00E090A6E30C03100F9D3D4D070082F6371D00280A1D4D07 004D07004D0700341D00341D00D07400D07400D074840E009A0E009A0E00683A 00683A00683A9A0E00A7349D0700EC106F3A3F00B05BB0E9A45B8C46A3D168DC 33E69B4E45EFD2F40DC015B49BB4979A4E8BE3973B0097489CA693F6B4E90CAB 086A8DC3F157DFB3D168341A5B8CED12216D3A5FCD0CA10340FF9A4EDA56F401 70A4BFD6503658 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/load.pdf0000644000175000001440000001124710616356705013411 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`dfb¢g630PÐ5Ò3¶´01QÐ5Ð3# S¨z —|®@ ŠÅendstream endobj 6 0 obj 69 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 2068>>stream xœíÝ=rÛ8Pæ:ªÒæ)R¥ñLêÃ#Hã*…O6Uγœ ËPüE©÷f#Ë4Q3øòI´÷]¹¼«ÿûýû÷Sÿüùóíííz½n19i…íz»M»…¯_¿þKúë>$ëÈi?äóF£1íØT…ä3‡ ø—:o¤Ò~ig ­vUØbÓ®çÿþýûM×Ùâ1ê' ra»M»žùãÇ]'|Ãh4Æõc'x†»N 5FãÑÇ)íJ3Úuêo$¯W<”~¥í:õ76ºœ€Gp¹\+Íh×Iu9uxøÝ/4ƳŽÕŸw±JÛiÛ9‚`¾ëü\}ÛkØ6–p§}Kôë.í !´ ë”ð“0*ª?¿¯Óž'þcþoß¾µçi>©É×uŸÀ¬ð ›Õ§²Ñ´ûºo§˜­`õæ³sv;Rב:‹lÝu"S§úÕuDpZåtêöM¶ct‰xh¿·Ø>`öþúN©œ˜®3õâ×=vÿ}·§8ºsv¥ª ýÀë»NçÎÙdê ë'6½Ó޽!48OUH׉|ÔÎÁK8¦èT#=&è‰iN`v§möä˜Í° ®³(uªVâÅw¥Egð¶¢<šÙ®™:euÙ‡ì¨;I×KÈûǦ8‡˜®Óþò]gpéÓ–v×Ügv§üh§ ®sŸE]g0ÒúÞÄ\íšiàqœó¶„O€´ü¾ÎÔ !]gæ –®3õH(C׉ÿq]àü6í:Adöè:'·u×¹{ž{ºNxÔpÏÝãõ53F£qzLµÓ6¶~ž©®þŽ@}hûÍX©YI¸Ó¦šjªë<==uòŽ?m¡ë„·ì‚›Ïu‚Hõ/_¾ä^ gñùóç¦ë4w^.—›Ôi¿—'u¸[HêO²4Ás“:í|*]€Ú]gþ6]€5Ú]'Üó6ñû:•®À k»Îû÷ïwZùñüúõkâ»%œÉÁ–°°Æô9Ê·¶ëµ%•ìåååÓ§Oì~&ÇV¸û³ç(Ÿ®“C½]ÖcÉ©3±ÂB^â˜s”/Y×ñÖǘ?~„‘©“ÿLN¯°„—8òåKÖu¤Î©³žÔÓÐu6'uÖ“:pºÎæ¤ÎzRN#Gש£çëëk}=†ÂÈ÷§ŠüÙ]l”:Íyè<ýþÉœ=½kRgpòÙWvÑ+>»Bà@rtÙ­giê´›oÉÁ“»uzÞôÏf'¯¯¯{/àvë:çHy°ˆ®³ŠÔXdÏ®SoÙ1ÙyØÝÇ/š¹ú?/ãH€Eöì:ÇJö´Ím©°ˆ®sÏ´Rà>ûwfãnGEûÎÎvßžaýñÕÐ'Lýïvæïß ÆÎ]§ºÝÖ÷½L©ë¬´×iîioå9ïïˆù)©pŸ‚>×Ù"]úO¦|‡ÔØÎuþƒ¤ÀvNÞubR'òK©°^¡]§Ê~5AÌ£K€•Jì:ÕWNÏþ”ÔXoU×yzz ý¦=ú;lŒYÔušdùÛuêÔiŽ ß¨üÍiÆÅw)ÁÍ;lÁõz}À®È€Hñ]§ír¹Ü¤NøhÇÿK€i‹>×iîü—:w_ÃÀÚí6Ðn¿¯ÀÒuÈG× Ÿ|]çùù9ùê8¢Í»ŽÈ ±m×€H ºDÒuÈG× ]€|tòÑuÈG× ]€|tòÑuÈG× ]€|tòÑuÈgqשiï5p` ºÎõzÝgœHl× ·F£Ñh\?†í: …Ú´ÅÌ$·Ý¦=Úu’?Lx³Nð.\J¶Ý¦=ÐušK RͨǴ3F£q‹±I-æÿ×u¶»| Iæ ¡M7í¿]òøÚì€ô endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer blah-000.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000385 00000 n 0000004214 00000 n 0000000326 00000 n 0000000172 00000 n 0000000015 00000 n 0000000154 00000 n 0000000450 00000 n 0000000550 00000 n 0000000491 00000 n 0000000520 00000 n 0000002819 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 4382 %%EOF geomview-1.9.4/doc/figs/load.png0000644000175000001440000000245610616356716013430 00000000000000‰PNG  IHDR'}‹ôÞVPLTE¯¯¯ÖÖÖdddVVVßßßN"ÔIDATxœíÁŽ›0†mªÞÍ¥gÄŠ{ÊTZí9 â*­úþPÛcŒIIµÁØóeÓÅ£øß› B0k¾ ˆn(ŽËˆË½¥GLC_#.¶:”·6¤ÚÒèÆ—)x.Áˆ‹7cJÇxSnÌLÛƒ)ÍÑ#`J Δë!#ašüì½)ÃÛL8/m¬™ÍÝ”`Ä)dôAÍ ‡äëlJðê2öSÂfvzHvJÛ])S&?-ÐJšêËßçK™¦Tv¢ydJÞ¡,M©ìTSí2—ÎOÄ”jÛ«†ÞÈàYåÊs¦˜PšêþÈ-”2EÜ»ßÀá¢ùm>¶™¨ìt̘©»_¡h!”F%²ëg¡™û[ÇL™&*gа/1ý;»PÀ%jŠß|ªÀŠ{f ˜"¶Mñ©xS2ïg]×)¶M¹ãLiL§ëGãüFä'÷S2çÉ=Ú¼aSØ‚¥)~œaSü´9Åá_6ÅAyëƒó—Ãθ¼”°™c0 ¦T·öÚM3átƄͼÓ`Ê÷ij¾öLʹ¦É\ŠÑO5ãQý0˜Pºîèw’jxìèæÌ(?ú°)3Êï§°)3¡)?þìå·Y]Í,Úª•2¡)ûCùeVAW3‹¶j¥Ì™òå3Êgú¡ SvV~w¡ÄÑÊ{ú¡ SvVÎ66e ›B°6EéDª–n±2^‡¢„~ÚŸ: EšY&‚Z)³6EÕ¾PñÊ(%õK•oû¹CY›bçÏ¡¨xeŠùQþå‹P‚Už!”¨)BÔ®¥R˜‚´½5)ý”ÖŠ•á®ØÊ!Ý*Ï iŠn…Ò6½Uè‚ Å˜ ìÃ@„â½Z†¢Ü£>E(kStßjZÍ1\i³P$ƒŽ‡â{ 9s$ Vç:œ„5ÅŽ;¶ %ÌF â¡Ä6»ÊNJ¬Oíú” ”Z#  ÝÑzSæZ)7¥v…{(JÍ£5Š}"Cò¹B‰šâ;Z£†-Àv-ŠÛO¡wÞÎÕÑÆLqC²éd]C+ëûl+“{´°ìÜC2öYß’ Ø6…€M!`S°)ï;q¡ÄýùŒ×Jd ݆‡¡Õl(µR™²7Jt™ÖBásÉkøª6…€M!`SØdÊî!9Cl(¡)G¿¡øX›r ²‰‘)¿£€PØ›BÀ¦¦¨‡ÿÃaã"ž MyJÞ™> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`ddl¦g6265R0Ô3µ473S0Ö³´430ƒ¨µPpÉç BP/{endstream endobj 6 0 obj 67 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 6036>>stream xœí½‹$Iz‡cýEP2e®¹Æ:m-,²úXKpά%DîyÜ:+³áœ“)£1åL;rNÐhÌAc ÁîÉZóÎìÿ`¥ŠüŒï¬ˆ7"~ùþŠîªÊ¬ÊÌzŸz"¿¢ª>°|"~ þðüH´ œ´Äˆ|xH?|é½<‹ëãùB}‰y~{Ez½öC¿¾'c9ô yþz¶48&ÚW"DVKŸ¿æ ÂE’\-m½,|)q‘kÐÝÒªvƒS- ÉÕÒ·Á}Îù|!¹YêÛ—á}˜Î.âK‘Ï-KÝÛQ¼ÅÛ(Þ}ÙÐZ–fM™S5ÏÂçÒLDßöy#f+S,uNùa™HnÄ›‡}ì‘Óßv'u’‰G‹Ï¥…ȃúågqÜÒ¡?#ÁçDŠÀ4j©†T¾Þã–Îå:P´é)Þçi#nE€4ÏÒëë=n©Z­¥žÚÓ7ba­ S›hè~oÂvÿ:B›âòôím¥<ðAù`Jh©R¬½ˆsµ´Â eÈöD©û/4PH—?0¤¥,5!½±¦lÖÊ(¼FJ{ÆJaž®©™~­MI‹61c–`H—Œ­Ñ´¥œœÄ,5 ²¥$b©c¸méwÏÏÇÇæ}Oy¹’óŒñÙ-}óüµdûæÙýnùÚ3œS9ÞÂûFHK%ÙOÄ7Óøïøù郄ývþ0âõöÿµ^ Îyš»b>!•¾2ÒÑóô“ìu=#•ÛIléðy2¶xÙÒáódì—²¥Ã‡-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKáRÏÒ§R:I^•šP=KŸÊ-ä R°Z-}õÄLSS²X-}%˜ibŠÖª¦¥‚™¦¥l©ªZÊL“R¸Ru-e¦ )]¨Ê–2ÓhŠ×©¶¥Ì4’òeªni¦Ûü8ÚQ¡Jõ-%cê™K×\k‰ÀÒÊLS¦Ý+Ö*5¢°´ÓìIöǵN‰H,-Ïôþrìy]a­T!K #½‰Îé…k5¤$––dzý» ©LXkˆÈÒr‹,úˆÞí7?F'ty]dy§R}êž/åädKÍ…¼ý}x¿\o’Þy¨Ä£ë2‰f¦šÅ(z ¼ÞºÔZì›–ú~»uIA©Åäº7ܘڥd]Zé½ãVfv®Úª¸TGa†X—:Îë]î@—|tl[‘Cu•eK 1-tÊÏÖb¦Î¢Œbi ¦…Ê´…ê.É0–ÞÌôÞyóæ4„ê)È8–ÞÆ´PÑ©¯YêÚKÌ¿î7 •±¡þªüLìøÞà#YjíF'.|=C×XP D5ì*=0F²Ô¸¸ðwÛ¾F% ¢Iëë­ÄX–Š ·î>Ö*CõÆ7zÒ,ˆÎÄdvÉX‰Ö*CÜúzë0œ¥™§îæc<õÊBõ–aÎ2¼¥æè QPµÐec15ætkähèø–êãCDIŠ8Sq k윀¥êD©Š$¦2y\£g,ÝoLŸCs>ºÐÀ&’d¬ñóÿ–®;ÞYD«˜¦ôíİt¾C”¨(Î4©{$ˆ¥ÓïŠÔ"JTä0M@šÖ·ÆÒÀ¦‘I”¨p0=®ibßNK%ÒþˆdšÚ·ÇÒD¢Ä@Eò®Œˆ0MîÛ‰cé] Qz "ƒiizßNKïÄ·®³ÙÑ&@…Íôòwžú™fô턱ôŠÔq:» ¢Ó‹>¤^¦9};Q,•Dí. *Ñv@…ÊtþÐU¦¦Y};Q,‘L¢MŠéò¹H¯¥n¦y};A,]ˆêH;":ïʬ ä'êbšÛ·ÄÒ©Ê´›VwÊ{GÐQ©·Ë+¶¥Q•iO’^óg±®NƒHM¦ùä0,UnL;#:1†‰ ñíž—¶¥*Ñ•i_Íîœ?K¦1¢º¦~>Ø–:öHôÊôcœ¨Î´1ÒV–êD'¦}•LªLOj©‰T¼trÐèhúAÚÈR‹hây޳3=§¥a¤#U˜žÒR@IûAÚÆRDIw¦g´“èÆôŒ–2ÒäÙic)*Ñ•éù,½!¤#]˜žÏR\Iû@Joé€%™žÎÒ? ˜žÐR?Òñ‰J¦ç³ZÒ’[Ú8B zez6KïЉ ñ—³YÊHsFd§…¥?èwñˆ>&ƒié[¡wÆÞâÍú˜LdDvè-½J*³Ce¤ÁÙ¡·tAº1…$šõѧðˆì4³T¬PW¤XD}L¡-•y•T~œæ;ÇPpK…dŠ*©‡)¼¥B¼[®ñˆº™"ZªGj3E´Ô‘¨“éi,Å$êbzK‘¾Ö¿Vý,–¢u0´ôNؼ¸Dm¦€–žKÒFH‰-µ‘"µ˜žÂRl¢’ékå”ð),ÅGªjzKщLñ,56xÅ;|¢SÓK‹”ÔRSÒ3Õ˜ZzR¤SxKÿ¦ÔÌ:Ï´HZz¢ S8K­£H¿ÿÓ`®[Ó g©Ž´ Qш)!RRKýb¹nuaŠgi[¤_l·è™.gÃá,><±„œèÚ=r¨³¦p–*HmÅÙRb¤&Pb¨SÓ liD0}ýÏÒuû¨ ¢ ˜~‡gi¤> 2¤P¯Mï_£ZÚ Qr¦FÐ=ƒ[JI4 T†ê{ñž1ƒ[Jˆ4N””é{ñäÑtlK鈦•¡ƒúþI¸™miD)™þ–)mÁ·„HÓ‰2õi:¬¥W¤TDs€ÊPAõh:®¥wÿ\jú‘ä%d féÝïÿªÔ BÉ*Cõ—ß95ØÒ>%`zŒ( Ó_þ˽2ØÒ>Õ™%JÀôA€”ÜÒÚH•© •)½¥u™ÞF´2Ó_„Dêb:²¥¢*Ó[ÊÔƒ*‰^+S)ù'×®H«1-A´Ó+Q¤äߨòé¿‹_×aZ¨L¨’( ¥W¤òÃüU˜–#Z…éDtFê`:²¥wÓU¦%‰V`ºuk:²¥3RñëÂHË•) •)±¥ÛÏO”eZžha¦3QDK÷¹/xd°P™rP¢3RÓq-ÝÞ‹r‡‘j-ÇT'Z)©¥ QQŠi= 2E ®D‰RZª4»B:ŒT—h¦Q@K5IËhZ›h ¦RÓA-5ˆд>P™¡ÚD+#¥³ToveneJCôF¦¢0–š’Š™R•9u'J†”ÌRÑ›ÎÊP=ÎÔIÔÁtHK]H3¥*sª‡h]¤ä–ªD'¤G˜Ò=ÄT!Jˆ”ÊR'Ñ£š¶ z„©OR KHs™¶*“ ÕKÔ>g dé¦íˆf2õ6»•‘Yê#:#Í`Ú¨L:ÔQK½H3™¶&šÎT%J‹´µ¥ Ò4¦íÊ$AÕˆþÎvEª3ÏRçNé’tMû šÆ´!RKý’fhÚ Ñ¦:Ql© éÓ?Ìצý•‰@ÕˆR#%±4Ôî¾¾,HÃLû"aj´4$ék!¾_nú™öTÆU'JŽ”ÔÒR/Ó‰ú™Æ‰Žoi°Ý R7Ó>Ê8¡ÚD‰‘RX‘4¢i¿DÝLZD‡µ4ŽÔÁ´g¢.¦¢ÄH ,µ»"À´o 2Tƒh ¤–F%U‘êLû'j0uŵ4 ©Ât 2;T“h¤õ-MhwÝLG!º3õ…³4AR'ÒqˆnLû@ZÝÒ¤n¤Ó‘€ÊH¨>¢h–&µ»ÓшJ¦ÑFHÉ, Jj _•Z Âü·5d% fiZ»+ ¦Œôpê[z é€L3ˆ‚X#z6¤÷¶u™¯£HGoy-¤Qj¤µ-½^MP3‘Ç4“èÐ–Š‰iœ(#-K¯¹$ ši€(¤¥×Ü_쇜© ÂÒ¹áÕ±šD‡Þ@2‘†$E±t¾c Ši–¤H–®™±"# JŠféš‹MT¼þ_íî8Ló$}'^à,²#ÝÚb¤aIk#me©£Ý} HcDÅ•)¶¥ÛS ¤Ã0Í•ôŠtäo';!R…¨éüOÉ@–®Kš†tL¦ù’ÖEZÙÒ"M‘”-í;ÙGâÄ–Á´„¤À–ލi I-PÓ"’žÈÒáªD[!íÌÒñZ^?Ò ¢È–§iIÏdéÀH36ŽÎeiçL I mé`š’ÚÒ±4Í"ÃR›é„ô³ÿ0ƒ4F” i3KÝH?Âd:"Ò\¢À–^‰ZH;fZLR\K%Q¤ÙDa-ýl¾†iQ:¤ýXú"~žo ‰4‘èy,}™þc õÀ J féË6dA: Ó,¢„H›õœ‘¾hƒÆÒÔ‰4Lô;ßè, !}±ùvÉ4‹(%R"KïìG8>3TË« M%úÎKn$K—W™†t¨–×ÔËå㼆¡AZýÛɼšæ íiQJ¤D–æµ¼c" ¾ó“ÊÒ2-owL3$>ÒDˆ´þ÷ñbjš)©dú.@nDKq‘¦%DJðÝöZÞË¿Y#úbšMT¼ÈýKhzÂbÚ7Òoíã&s¶ÏÓ!%³ôV¤]15ˆ~kÙܲÚ{ꆃbivË;}GךnH%ÑùûiL ¢0–fk:ÅŠÉ´S¤ë»šDÑ,MFº|iNÇšîD¿ÝÚL-¢'µTü¼~R¿šnHÿ¤5™ÚDq,ÍcºU¦[MÝDM¤Ê÷àÐ"%ù•ácH»ÕÔƒTgê"zVKýšö†ôOæ…©“(¥XL}’z*D,ÍDº•¦o¤Q…©›èy-õ"í‚©_R±-¹‡(’¥Hš$]ÜGÉÒ\¤+ÓáN î%zfK;f&ª{²IÊÒ£L‡Cª~Õ®EÊRMcDÅÇm«×&zKÇÒ4‚ôã¾iç Šei¾¦sm.ÿ¢ì©›èÖP¸‰bYz@Ó©8ÑÓ¤[¿1'ÑÓXlzûD Ú)™¥™^DOLý’îÛ¹R7Q0K]BMo—H-¢êo„H¤¢h–ÑtŽÎ´?¤ú¾¼ø‰ÂYÒÔÇô25c½0u5ÅG¼|ãåƒf馗¹ë©ET¼öó³4ŸéԳ쥦¢ !>x–æ®N—¾‚/½"umŽ”ÖÒ¢•€ óu;Ç–™OK•‘9Ls‰zŸàësP‘¨õÂí‘…fÓÄR}\:Ôl¤Îgx¬*Páxåú¸Rsia©9*™i¤þÊU'êzéʨb3i`©£¬iPó‰šO Ô€¨ûµ/cƶÔ10‰éHCE#*@×¥ž7jÊîŒðÿ¢«/;Ò`ɨˆú5×ÒëK wÃBÍÄzQ§íËÐimšÙ4´–·ã“™Ê¤r½ˆ8P*EE £ZÞÛ΄š†õ-¢"PA-ÙLEë2©è&)Q Æ´4väzJ>Ô«k¤”î4?_ †´4z~iΦpa¤´ŠŠ@F´4~xM>Ô· Rr¢þ* hé~7¾ðÙL!¥(Ãx–*÷R>ê¤ï’zV·ÃYšÔINMÓPãê'·§Z b4K,|Ô<¤íxŠ[ßèi³ °Ô8–ºðëÃâPs6jp×­mBoÐüYÔ·ÔÚ¶KŸÆ.ןܨÕF¾S¾ô¤Qï$§¾¥·n­¯?êÇšˆ´iƒ»ÅWŽ,-±ÿµýì«kø`Â:¶qƒ»ÇSq,-¶GíÇš€´ž2î’ ciÑc$ûo4kXcH»â)ã,Ê(––?êec—ÿØOWY±´ÎqLåÕ%V©ñˆþxÊ8 3†¥õŽL«Xé“§Œ]š!,õî‚•‰Fµ_xžØ;ë#XZjB'É–Ö:y’Š'×hΗ2Q+õN®‘XÊD©vrü|)g ÎùRΚqÏ—2Q_ªÔˆÂR&êM"XÊD©r ¼¶¥L4˜§À+[ÊD#©p ¼®¥L4šò§À«ZÊDRüxMK™hRJŸ¯h)MLáSàõ,e¢É){ ¼ÞùR&šž¢§ÀëõjàädK9RÏRN£°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸ì–¾yþš-Eˆ´ôêæÕÒoä]¶tü\-}¾^Ɇ÷zõ-?O?MWŸOHy]й. RÞâ…oñÂ…÷Ká–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ËÒ·­—ˆsk K¿l½<œÛ£Yúå¾ \vKýàŸ#9 &²[ê}„x æ'Fd¶ôº½ë¿<Šðx¾P_"D¤¥ÁwÅ£çP'Bäj),ÿ)è|Ú endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000384 00000 n 0000008170 00000 n 0000000325 00000 n 0000000170 00000 n 0000000015 00000 n 0000000152 00000 n 0000000449 00000 n 0000000549 00000 n 0000000490 00000 n 0000000519 00000 n 0000006777 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<63AAE306C54F5777BD0B213C94B90ED9><63AAE306C54F5777BD0B213C94B90ED9>] >> startxref 8336 %%EOF geomview-1.9.4/doc/figs/trefdodecinter.png0000644000175000001440000001273010616356716015506 00000000000000‰PNG  IHDRÒꇗ?Ä*­ýXô+Ç×§QiÍ}n%Ÿf¥þ×2JÝR{Æú¦±¯7ʈ]iÒþ•R òµ eä×U)ë–•¢ü’-ÝŒ˜Ï¢ã÷#+uÞòãF¸\¯5yö·ç‚èÛ'oª{¨–îFŒUÜŒßO¯tc Ÿÿz•"8 V:ýÖ¸¾é•ÞÆ•0´ñ*äõŒK•(åUºYRétZ÷Mè¸=}Û<\O¾7ÝD›F_z]áùgcq‹›éƒ0/8ýÀ©`¥“a½†¸yŠ˜|oòçm¥î|ß|ÞŒy—`JsU:;¾åù¬fƒ7ƒ›^ãUÜ3ÃéŒÿ·4½ãÆfw ¦tÒÒl’WéÜ—]é|»k§dÖdn+Ý‘¾½½ÙBž§¦·èºôä.¿,½ójÉ(„]©y«ã%ÉJ[GSYÄv×ø†éü^\J§¿@”N+5ׇY©µå%*ocJ- öæ7b)µ/y_KÇ_ŠÍkª¥ÓJ-/{×z2uíñ»/³¤ŒH] ¯LÝâkÅ̽dëîŒNZ2ŸLK¼.}ÎmóÈd2ôéì_ÏmÓ§½ÍtIÌKc›0Yó‚`J_—f£‚ï¥"7g£]T*6i£TªðUjíÇêñÒÆ U:“ú¦•¶O RÇ÷íJ‰3??kŸÉ¸Ò¯_òìjÊÈ«Òë¿·×qB}_) 9xjÁPéïXéíbÖ{Jw|޲7·F¼þÿNéœû©Ø7¥C¯µ²”á¹ô¡tÜ_ªý€”¥Ì÷xUi÷Ì_—ªÒîÑJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJáÐJá(Wé¢ßP¾Bò ¾X¥ä Ȫ´X¥;uMÎa¬t§NcÉ:«’•ªÓHòŽªh¥ê4ŠÌ“*[©: ÷  WªNƒdŸSéJÕi€üc*^i§ÇÒwœ@)•¯TÌéÑÌ'RbH•vJ˜ìBk‘ITZÆiŒÊƽ–‘H¥ùnÙBÔZhB2•fVºM5Ú–×bJE*Íét»]¨´­¥$Ti¾‡¼õý{–zÉô€R)4Ÿ²ÇKù_ð¬†ù7ßäöŽ+K ªÑ‹R*Öpº¨Ô~Ø‹no»}Péõzy²è!¥c¦‹J]<™—P®N‡×Ë”E+™ˆc0}TšÏi¡/¯—9 W”k,TšÉi>¡#–Ri§Î¡ôRi§™…Ö—êI7•.vº-`´®Tb ýTºÌi!¡5Rãè¨R×K°HÊ uKÍÿöƒØ)-¼À{¼³õˆ|ðe…:¥f[wšÙ(Ê?^÷àO¥…ºœ–—JN¢¯Jw þt*.´ŠÔ…Ñ£îBèH 󔌇ѲBR³ À 9‡î*ež8uº)-/T\*9†þ*eíÛÝŒ–øývZP*ý: ß]HUÊxv”±ù" 5Û¢‡Ðc¥Ñï“ FSŒY¨º¿ø¤fCì º¬4òÝL¾Ñé‘PÇ+—MÛ«Sr}VuÌcÔq¶ÂvJH§©UÄ)9N+82eÔs’ØDhœÎ©V§äz­t| Ì÷àcŒ^§RʳI8Í6 s*ÄYFÝVº³Þñ5ˆ0:NÛ§4EçÝé~_Ü)¹öýVê[m”ršló¦t¿/ï4a*컯”þ‹6úvn#ûòNéMT畺Nf]§ŒSÏŽDß•º—…Œš»£¹mRN‡ïæ j¥®…£³—ü:=N3iõ¾‚ë½R{©ßè\èഀлӋËér¯þ÷Yº¯t¾ØkÔ!ôB:Éît¶|á<€+5—ûŒŠ pš¨5tÌ Òé”î[ÜêŽì÷çs„Q[)ûÜNŒJŸF§N›2úý}>?œú/Ç^ùèljV:QºoÔèè4Âè÷·÷sS8SYLÅJ§FNÛÚìÞ/·îà•:”¶hôê4¨ét¥•šFG§mœÆ\*fݱ++Ý·ò¦Q*1ë]©e4ò¸GÃD¬;t¥~¥µí¤^wäJ#mGiJ#}9]c¥˜FŸN×X©*^À¦N¥¨FN×WéÉ«´¶•eø×¶RÜHÛP*_)r¤7§««Úèèt…•ÒJkûÈAu¥*…Ž´¥â•¢Gzuº¶Já~¯®RUÊYÀ¦F¥ç3¸QÏÉ`V:œGéTZÛCNØSé¹ÒÓùlJU¥Þlä+½+=Ceýè“›j•>¥b¥œBWz— éðã4œ©€T::E5J8…¯ô|Æ5êvŠX©i\©í±R·ÒÚÓ/ƒÃéj*­=ûRØNWSiíÑ—âªô5¸JkO¾–SÀJOŽÞÚs/ÉÜ)`¥ëŠ´’RáJm¥µ§^–™ÓUTZ{楹*=…¦â[À|õJk¼4f¦k¨´öÄËc8Å«ô4WZ{Þˆ+­tF §€•®TéÓ)|¥µg-…°ÒŠ•Öž´O§p•žê+ýø¨q¯ÏM/\¥¦Ò³ýø¨åTP©h¥•~Ü©p×w§x•ÖUúñQÏéýh8\¥»šF? Äïþ–)\¥»fŒÖrŠ\©ð<çB+H7½À• Óe´‚Ó`¥§–ŒVp Xi¥”Pq©×M/l¥¢ƒôwzrM…WÚàkT*9E¿Pi©¬q¥ ¾F¥‚3 uú÷GeÚw¥rŒ*+õïD8íºR¹ùÅ•t*¡Tö AI¥ñFR™v[éNÎ(G¨¤T¥ÂçñJMŽkTÐ)c\Iƒ—>÷ŸÈØøBŤÜ™v\éYÂišQ§âÉ´ãJÏÿÊ;M5*àô ¡T¼ÒÒJÓ… HQ*_iY§ËŒvz•ºœö\iY§K…–•:ýsgÚs¥ƒÒbNs-çô ¤TüUþ].…œæZLêAJ©ø'ª ?Ì_Äi>£Eœ^JN{®ôöIGœæ4ZÀéÓ¨;Óž+½Ä\n¥y…*¨T¸Òççïæušßhf§ØJ_¿n"ç;ƒ%„æ•z˜*u9í·Ò—ÑŒo#•2šÏ©i´´RÑJ'F³9-'4›Ôƒ¬RÉJ/3¥9œ–5šÅéAX©d¥†Ñ<™–6šÃ©¥Ôá´ÓJgF3dZ^h©¶ÑÂJå*½Ì•.v*ct¡S‡Q˜J-£ J ]&õ ¯T¬R‡ÑEGe$¦;uu8í²R—Òt§²B“¥FË*¯ôÓÚ&_p"WêRzŒsZ[£ Ǩ´R‘J}ÛÝíC©ßim‡sXF+õEºÝnÃNk tkT\©h¥¥¤ÓÚöܤí¿RïvwªÔí´¶:šH£ÂJ%* DÈ´¶7‰J-£ÝVVêpZÛšŸ(£ÂJ* mw}Nk+ ã7ZC©@¥ÁH§JÿuftæÔi·Ò8¥ÿú:@­¢´|¥Û]·ÓÚ¦â …«4"R§ÒÚž84¥´x¥¾HÝJÿõ&tÀg­Ò¨í®å´¶!>£•”ŠUêt¦ô_m?)ÐFÁ*ÛîÎÖÖ“B3JKWš¦´C§ £ •†Œ®M)1® ƒ/^é1Viï[^Ú¨´ÒÒ•Ç¥Ý9eíºÒ›Ó°QUšið•R#”víÔc²Ò+ûõ*µŒbTzÜøv½ƒÄ‰¥ÒÑJ»rÊŠ©RS+²Ro¤h•>µÚF·ÿõê”év‹WéÈk­ñ”ú#-­´V¥¥þCQ2:8%Æ•að-TJ)íÆ)7Ò«Rj\ßr¥½*=…•n©qe|éJ,¥}:åGZViáJW¨4&R­´m"]o¥]8Í)p¥=fš#RàJ;Ì4K¤+ª´;¥§”6Vi[Þ,‘"WÚ]¦y"]S¥+eì­«ÒÆfŠºÒÎ2Í)t¥}eÊ2ꉣRÛéhtׯÒQ)¥Õ*u+½^A)×(p¥ÃU:Ê4[¤¸•ŽWPÊ6 [éýªÝ8e•SÚN¥ïï÷«v©4Òèz*}¹_µs¥n£þHÁ*}ò¸n'NYF•V;Cp?óÙ_¦N¥~£¤¹Ž*õ)}·¸_ÇRÚ¤S–QI¥B•:VÒ6Ú×–7Á(m®§Jw¥]myJI£Ç£ ÒâŸNFfÊQÚ SžQI¥B•ò¶¼}*õ=Þvw1*ͳåmÎ)#Ò£°ÒòŸÇ‹™)3ÒÁé¬R\¥qF• |¶}–÷§u§l£Çíl*世^â7Pð3ýù±Ö–h2WºT*VéR¥M9Ýï)¥O£ÇùTÈq-¼Èosâny~ZÏÔ0z{3Æ(L¥ìLœNkkœ2QúxË:Æ(Z¥ÑJÜJrú2:9 at¥•¾?”6œéS©qh)l§RžÓJi3NÝFçJµ”Šü–á4¥ÍfJ(Ý®µR:ÓÚ*F §N£@•b9¥"%”ÒS‰YÀ¼L¥L¥ï}(uœ|0ºÞJI¥M8¥#}9%Œ"UŠ”©ÏèÞo©R®Ò÷^•î½F×\iÃNýF÷^£P•¦:íNéÞgªR˜LCF÷ѵTÚW¦¥—ËÅc«R~¦7§ïm*%…>•ÆM%¸€?x±J2¾·åÔéý×zzŒ®¦R醴M¥£õ•ŠUšèô½)§t¤Ï_}ñ«Ôs ’oÓÛ¤RЛRÆT ØHVš’éÖ•^.3¥œ©°­Ô—)åôÔ”S§ÑËœ#í­Ò§÷ýoY©eôâñW)ßéãóÚpê0êêóƒW)÷éôù™+*u ­®T¶R^¦“ÏEjH©GèÅ»î¾%ýVÊrj|ÖUNÍHB7ØSé¹R†Ó“A3JýÛÜÀÊCVê}:ý‹TZÅé4R¯PÏÚcVº‰ÜE:ËônôëJ@è°–îõǬt·émEé—Ciü@+z:µŒVwz˜(ý %&€ZiÄÓ©Ãh«JY#€­4ìÔ¥´®SÃèW„Pç `+ nzFTÊn¥§n£¦Ó”&L¸Rÿ¦7F©°Óƒ¥ô2äJýN)©í(j͹Ò4§Õ2=˜J“]©ÿé””º­«”gÓžv¥L ©ã'‹;½ MÅkà•zßì%œnŸH+Í3 ìJCï"9¥ny½œ¾Bdt¥“wN3*=Û±i¯5k\ü{ªUiÄ«S‡T¦QŸR‡Ñ+GÏ9¸9æ\iìnïLj>¥”ÑlëXoçÒ<÷S§ÒÉBŽS®QR©[hQ£ÖŠÛ 3ÝM•JÍeñRÙJN Ÿ……ºÖÜ\–ë^jT:_í4ƒRʧ€QתOe»“ •:–ÄIå+¥…J%ÏHÚu_©ƒ(§ •z|Ê¥VÞ»€â•Q1RŸ¿}9A©O¨˜Q:Ó~+ÝÐO'‘R™Z#|^f[ëöÙ ü»­Ô»í”ã5F¨œQz½VêµÍ”§5äS2ÑgVxOlÇvêÓzÿÑ•¶ŒÒ#è³ÒÐ;×#|©/­®O®ih£;@ΠËJƒÇ—n¤8ýsÉŒQ*,Ô3„+ ~À—Jõ+7JO¡ÃJ#ÎÕxÂvš¦T^¨g ýUº¡¸aJMPwfuvÈ9tWiÔIrSXN=FÝJ#O•/9ˆÞ*Myð ©<¥õ|î–þE» J7i›˜c´TŽÒš>wÖÖ–³‡}å+µöíâyüÄ_ºÑýÜ'ãÞ‹;¥ƒ/^éÒ½õ°ÖH¥U7¸O¨qtTiŽ×_¯V¯Ñ}#ÜÄ@ú©4Û+jZk„Òf|¸GÒM¥Yß#¹¸µ†”6åsÀ9”^*Íÿ®—­ÕotßšÏ×X:©´Ìû˜S«¥0ü‰DÕq ¦J˽3½»D‘ïþrc¦‹J èDýb=ßM—«Ta‘oðRÇK37Ú?®É/U£å®‰TªF;¸&~¼T¹ƒs¼TyÐïñR5JQdF•ªQ’2‡À‹WªF=9^ºR5ê¥Ä!ð•ªÑ—­Tɼh¥j4‚ì‡ÀKVªF£È}¼`¥j4’̇ÀËUªF£É{¼ÜñÒl7µú8^ª°È7øb•*•(W©R ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ŽW¥×k¥ •þŽ•þh¥ýs­tP9>—vUi÷Œ&??oJõ¹á¹ô¡TŸK!Ð=^8ôu)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)V¥‹~E¹Ò³J?•þ1*ýÔ/ˆ¯W¥4¿¾…JüF^•’—øõ.VÄ ¹Uúëûú ,×/鯀‘A鯗ÏÀrEš€‘šûÜJþÍçñÌtƆ0IEND®B`‚geomview-1.9.4/doc/figs/command.ps0000644000175000001440000000771210447731021013751 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: blah-000.ps %%Pages: 1 %%BoundingBox: 198 342 414 449 %%EndComments %%Page: Image0 1 /picstr 1350 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def %%EndProlog %%Page: 1 1 gsave 198 342.72 translate 216 106.56 scale 450 222 8 [ 450 0 0 -222 0 222 ] { inputf picstr readstring pop } false 3 colorimage 78DAEDDDDB91DB3A1A85D18E5211302DC5D0D9F46BA762955546C1BC09247FF0 86B51E50B6A70F2D6BCAFB7C9238D35F5F006CF253C7F3F97C3C1E3F0007A9BD 42AFEBE72BFAFA69ECF9F82BFFED9C4EA773CFB3F60ABD2E9E5634FD62ACF4F8 9F0047A8B742AF2B0F5BB4D2E3F7DF2370EC8AD6BBF8B045DFEBEA743A9DCEA9 335FCBD116F514399D4EE7FC847E6C51F72D008CDED154D8A2F56E7F02B8A8A9 B59C5AD7A81B03DCE6E4743A0F3CD3106DBFDA8A16F5193D70F5DB93A256287F 91BEB445CF79A71670E3090D0CB0E10A95BF0B3ABAA27BB6E8C6A762EACF727E 577CCC70CB161D5DA1C2BF9EF997BDAF73A116ED8DE7E546C98AC2C95B74C55F E40BB5E87082AE354A26146ED3A2E92B2FD4A2251334FA4A3FFDB4F783A55F53 78FDA97F64F847B8EEFB12A045AFD8A21FD766EA95FE70C7869B56FE35F3D7DF FE65406B2DBAF4F6FE754FC5A2095DB47EE53F2E59ECD1AC2DF9A78090005BF4 12EF242DBA680A7AEB1DF872BE64CA364EE8E8BF0E0AD77B66546D2904B66879 A89CAA45D7BD2A0F6CD11D4274D1D23E977C10664821B645CBFF669DA74557BC A80F69D1F94F6D027FBC22386756F463A3025B5AB4F045FDD93EA35FF1D6E896 CFE8177DA0B37F883E7DAE0407B5E873C95BA3CDDE2F3AD3A595A2F439F1C1FD 7C55BAC709F66FD18D2B74EFFB4501DC2F5AE9A900B4A81605D0A25A14B87A8B AEF8A05C8B025A74C5966A51408B465D67458BA62FDB72BEAEE35BAF3A9DCE45 679ABE90AB45ADD04C8BA69FE6EB9AFE2C1B455D07684AE074445D2A6FD17C5A 5F86BFA3EF3A0D30F5FDE87BD3DAFBD6F3E90B7E01C8F4D6327D93FAFCD7F34C F58C01245DD7E5EF8B8EAE68EFD3284F1A409AD0B4A2859FD1E72BFA0DD0B0EE 9F45F78B5A5180D115D5A20047B56807D08CB47E812DFABE2C400B1F274DADE8 C616F5021F68E4557CBD16F5D21EB8B7F9150D69514F3270EFB743F76951CD0F DC4C1ABD7D5AD4130E34B8A25A14408B026851002D0AA045B528801605D0A200 5A14408B6A51C08A6A51002D0AA04501B4A81505ACA81605D0A2005A14408B5A 51408B6A51002D0AA04501B4288016D5A28015D5A2005A14408B0268512B0A58 512D0AA04501B4288016B5A28016D5A2005A14408B026851002DAA4501B42880 1605D0A2005AD48A0256548B026851002D0AA045AD286045B528801605D0A200 5A14408B6A51002D0AA04501B4288016D5A28015D5A2005A14408B0268512B0A 58512D0AA04501B4288016B5A28016D5A2005A14408B026851002DAA45012BAA 4501B428801605D0A25614B0A25A14408B026851002D6A45012DAA4501B42880 1605D0A2005A548B026851002D0AA04501B4A81505ACA81605D0A2005A14408B 5A51C08A6A51002D0AA04501B4288016D5A2005A14408B026851002DAA45012B AA4501B428801605D0A25614B0A25A14E0542DFA0B7047FBB4A8E71968734543 5A14E0DEEAB52840236AB4A8CE075A7B691FDBA2351E5E8D6B02C4BEBA3F618B A61BA56A5C13A0DE8A9EA145F3DB4D6B5C13B8A2ABBCA20F69D19055AF774DC0 8A06BEBCADD1A25614B8F78AE693B27F8BBE2E18B5A2EF4B0D4F2B0A375ED1C3 1F496F52766ED199AD5BD7A2BD09B5A260458F5DD1AA2DFA311AB528A0456317 4F8B025A74664287A3A74581D52B3A5C80F42BA3E330FF31CD795A747E427B7F 0A2D0AD458D1C2AF3F618B7EFD33BA78F97FAA45817D5AB4374AC3B13A5B8B6E 593C2D0AC4AE68FE83A98D3D558B6E5C3C2D0A2C5AD1A1F9280D5FD14BB468C9 1BAD33EF12005A74B44B0B5FD4DFA3453F4EA815052BBA6845CB1FC96DDE172D 9C502B0A56F4DBFBA24B96F9E33DA840CB2BFAED33FACDCB0CDC7545F771A716 ED5DB6F07F9B0F58D17A2B5AB545A7EE40D8B8A2F3136A45C18ADEA645573C3C FF2FCD8016B5A280165DD4A25D847AD7042EBDA2DD69546AD1D88757E39AC075 57B43B931A2D1AFEF06A5C13B8E88A762713DEA2000D0A6C51002BAA45018E6A D10EA019355AD4B30A346274FAA25A54DE03F7361590512DEA19065A5E512D0A A04501B428801605D0A25A1460638BA69F6A518092164DC1F95ED1C7FFB42860 45675A341FCCFC7DD17C63AD286045A75A34D75B51EF8B0294BC2F3ABAA2DE17 05F8F6193D40FD1675BF28801605D0A2005A14408B6A51002D0AA04501B42880 16B5A28015D5A2005A14408B0268512B0A58D1ED2DFA0BD0804A2DEA89051A5F D12D2D0AD0A0C01605B0A22B5AB403606D8B7ADE0056B7A8270D60758B7E01F0 BFF216FD01604C498BE65FE6743A9DCEE139D3A2B15EBF458DCB021CBE42332D 1AF85BBC1FBF21058E9AD0AA2BD46BD1F4E97CEC991E7FA5EB3B9D4EE7812B94 56F451CDFBF13F000E527585DCB700B0D11F63DEB779 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer geomview-1.9.4/doc/figs/tools.ps0000644000175000001440000002514210523212333013463 00000000000000%!PS-Adobe-3.0 EPSF-3.0 %%LanguageLevel: 3 %%Creator: pnmtops %%Title: Bildschirmphoto5.ps %%Pages: 1 %%BoundingBox: 279 267 333 525 %%EndComments %%BeginSetup %%EndSetup %%Page: 1 1 gsave 279.12 267.12 translate 53.76 257.76 scale 112 537 8 [ 112 0 0 -537 0 537 ] { currentfile /ASCIIHexDecode filter /FlateDecode filter false 3 colorimage } exec 78DAED9D5B9015C519C7794C1E92AA3CE521F12D95AA24651EF2622AA5556AF4 C5581A1114F192184409221705022A97A08882B88204B92A97A8084AC0282888 788312949B02BBECB2EC9DBDEFD93BBB2CC4FC774F79B23933D3D3DDD333D373 E6FFD5575BB373BA67BEF9CDD7B799EE6F6A6B2926A5866254AA2946A5CA432E 5FFE0FD54BABBCA5D221C425A9956E52314C722907062E95D7367F78B864FBFE E3EB761E58F3AFCFA9AFBDFFE5CE4F4E1C29AE6EEFEACD81BA74E972C5FFCBB9 EF2497A6B5BD1B18576FFF8CEAAA70B0A325D5395C07BF3E375CCA8724F72B52 E25EAC7CEB53AA58DFFEE8181C2F0B6DF3AE43E5DFC9D921C9EEFFFCF8D9155B 3F76D55D9F9F2CAF696E6CEDEAECBE80BF474B6ADEF9F46BAFC41AFAD5E9AAAE 9E3E19454A4BB2AFDD712057F61F5AF47A9664595959764F5975D3B22DFB9DBA 6DDFB12325D54D6D5D7DFD1791BDA1B5B3B6A9BDBA2153DD98397CBA6ACBDEAF 5C73A96A4D6306D676F7F65F1CB8D4DB87135D68EDE8696EEF6ECA74E38C7543 67ACAA6F8322A53DD9FFB9FB30DA1AD0FBF848E99DB356950D49B60142B5F0C2 EBFBF274F3EE4327CAEAAA1BDA5A3B7A91EF42FF004E74BEB903C7AFAC6FC32D 38515AB7E1DD2F9C1955F5D8995A987DBEA5233374C7FB2F5EBAD0771197D6D5 DB8F3D2811B8109CB1E27C2B522EDEB8DB9EECDF9CADCB3A64966776BBB8A27E C9E6BD4E7DFBA3E3C5158D704860ECEB1F1818B88C9BD89CE9C691CB6B5BF0F7 64F9F96D1F1E59BC698F6B7679DDF345310CC66DAA6FE9C085C024B80AAE0B27 C5195BDA07CF5879BEF55C5D2B52CE59BEC59EEC28F55986BB0E9CBC6DCAF3D9 6D54868B367C90A72F6ED9BFEBC0293821FCBCA5BDA7B76FE0E2C0A08B76745F 808B965436965537E314EF1D38B574F31E677625DDB4EB100E555ADD74AEB605 C50D67E91FB8DCD73F78453D172EE2ECA5D5CD67AA9ACED5B520E5F4C51B64B2 8F1812D5ECD95CC3CF9EDD23C89E6D985019DE70EF4C64812E7F73FF53EB77E7 E9B31BF71C3E55895B73B6B6A5B9BD07CE0F3B41151BA85BCED6349F3A578F53 7CF8E599056BFEFDF7B5EF398F20AFCF6DDA5B5ED782BAE5F4B9061C1CA7E8BE 80123780BFD9D3613F7E451AA49CB6E815DFEC23868952F65CAEECD973FF0AB2 E78AFC35A326669BAD796BDE75EACC9776C009C16D84B7E05754298F156D7BFC A5B75C0F22A938170AC257C5D530BBBEA52BD375A1A3BBAFB3A71F7FB18D3DD8 8F5F910629272F5C2BCEEEB433D4ECD01CCFB68E1EE8132FBFE3D4F1CFBC7EB6 A6097E7EB2BCDE15E637E5E75146CA6A9AC62F7C6DDA92CDAE0791549CEB4C55 E3A1535547CFD4A0BA6EE9E869E9EC6DEBECC55F6C630FF6E357A441CA890BD6 08B27BDD7AC9ECD9B30FCFE87B7628DA2F287836B6764267ADD8E1D43B1F7FE5 F4B97A10C3DD41F592671ECE82F28E5B76E864E5ED33564E7C6A9DEB412475F4 ECF5A5554D8771452535D50DED8D6D837D155432F88B6DECC17EFC8A34483961 FE2A41762F9E92D9B3671F9ED1F7EC50549E50F0AC6DCC40A72FDBEE54E4DDB2 F748594DF360C552D150D3D89E3B45537B774D533B6A030CF391E6C607178E9F B7CAF520927AE3232BE0E730FB78695D75637B7D6B5743DB2049FCC536F6603F 7E451AA47C60CECA50B33BEF85383BB439D30505CF8ABA16E8D417B639F5BE79 1B272DDE8A9B525CD1F075591DC0D63577E0E02886F01CF82760A2899FB464EB F5F7CC1C377795EB4124F5AAFB97C0D5E1F0DF9C3DEFE560A7878A0352DEFFC4 8A08B2D7B7753566BA65B243D17D85826769552374D292375DF5DA0797AED8F6 298E5352D900AA68EB315E004F74EFD1FBC5BF478B6B7E397AFE1FFE3C63DCFC B55E0791D15FDCF174B62A86CF7B01C1ED437D8E94F7CE5A1E76F6FAD6CE86D6 AEC6B6AE5C5D2AC80EAD1CEAA082273AE4D009CFBEE1AAA367ADBE72EC33456F 7C04E668CA518BD60DF6ED7B3B7BFAE0AB2BB67EF2EBB1CFFCEAE649B74D5CF0 C0820D5E0791D19FDEFCE4E015553761985059DF8ABA05C73FDFD289D28AB280 56BEBEA51306A32821E5D8192F5A951D9A754BF03C76A606FAC0C2D75C75DC53 9B6F9E5CF4F35B678EFCDBDAA5AFEDDBF7E5199CF1E0D7156B771C1CF3E4AB57 5C3FFECA1BEFF9FD5D93C7CC5886945E0791D11FDD30B36CE88AE024E8D3560D 8E5606072CA855702D7012F49A9A32830E8394773CF68255D9A159B7044FF4D8 A1F72FD8E4A5F7CD7D65D4B4A5BF19F9E84FAE9BF0C36B1EFEFED5537E70CDC4 1F5F33EE67D7DEF3DB9BEEBDE1EE69B74F597CDF9C758223C8E895772DFCDED5 5365F48A1BFE3A6AEAF35665871E2DA98682E78113E5D0FBE66FF4D4791BEE7E 72FDE8C796DD347EFEF563A75D3DF2A1DFDDF217FCC536F6603F7E451AD111E4 74D463CBAE1B33E5AA3FFC49AC488394B6653F74B2020A9E1F1F2985DE33F755 B1DE3D67FD98D9AB464D5F3E72EAD23F4E5E82BFD8C61EECF7CD2BA9773DBEE6 F66945B73EF29C589106296DCBFED9B1B350F0DC7BA8183AF6C9F5D420FAE1E1 122878EE3A70120AE6D420BAFBE0292878EEFCE40474CCECD5D4209AC5089E6F ED3B0ABDE5E145D4209AC5389CE77E8AAE90A741292A2A12F0CC5054A46848C8 933C13CD33C6EA48E97262B7D3729EB02D113C73762AF18CA5EC68F08CD14EF2 244FF2244FF2244FF2244FF20C8FE78811235C8FEFB55FE657E33CF3E63058CE D369A141B34DF1D4BB9B76F2743A466E3BBB21E01F06CFBC3D5EE639AD1278B8 D9F2EE6A8CABE5CE0DD79491F1F432CFD554C10123E329BE0AB19131F294DC19 5E7B2476CBBC9292509E82462D329EBEE53D89FE194D7F49C3B6587806B4399A F22EDECE951199D62AE2FEA7A0FBE1DB13E0F888E34DF2244FF2244FF2244FF2 244FF24C33CFA2384483678C76CAF32C8A495479C66B27E72B8651F6C9933CC9 933CC9933CC9933C29E4499EE449214FF2244FB1B806EF327E8A14FA6778574D 9E79AE9B97C6395D53303726D4C9DE09E2A934DF35C804B9149677DF5964E4A9 54DE95788A73B1BC6BFB27DB233D9EAC3F35DA77D7C50E32ED7BC6E8AAA8948C 8F22F3C002E6E93B639C3CB5C7AA1CBFF37908853CC9933C29AA3C8B2846E72B 12975854E3016A4C6D4D8F68C457244FF2244FF2A418E12988BB429E7AFE4998 2CEFF6FBA74CE40DDF0798923BD3E09FE419BD7F8AE7CCB8BE354BAD7F665402 2B49C688B3EAFD45F4EDBBD3D9C288199536FF244F83FD4F010AF2D4E87F9AE5 99F2FAD3D7B55463C4D13F393EE2F89DCF9758DEC9933CC9933CC9933CC9D37E 9EFC36B1A9EF6F12A6599E1449214FF2244FF2244FF2244FF2A4248567C06041 5C0F2BA0A101873C2551C87C22D3374050642F682CE7A937FD499C853C258949 6649394FC990418C17A4EA9F924ECB784182F69DE5DD78FF5372FA934CFBCEF1 11C747E4499EE4499EE4499EE4499EE9E4C908368C17C478410915CE57244FF2 244FF28C8B27D77319F74FC26479B7DF3FC3F0D2C4797E48F182C833A07FAACE 72B1ED5B5A36FB6712BFA59594FA3329DFD2B2BCFE4CDCB7B46CF6CF247E4B2B 89F5A764A5CAF22E9ED49A886F6915CCF8A8C0C6AAB18CDF931B4ECDDAE74B49 ECABF37908799227853CC9933CC993F182182F88F182D223E4499E85C153A91A 214F233CD9A752E5E97B28C193A58CF70B23F11BA580CF5AA30C4B12194F57F3 7C575B07441A7D589204F114BF0675FD2E83D2C35823614992C2D36C0C81F0C2 9244CFD3B542934F90F1F8E487119E92B74C701F13ED9F417886149684E55DD2 69254F915C9E326D77F4614992527F6AB4EFE2FE6748614954794A2E6354EDC5 15CC4B64259EF2CB42C933D4E74BE2E15E214D72E0F33AF2244FF2244FF2244F F2A49027799227853CC9933CC9933CC9933CC993429EE4499E14F2244FF2244F 799EB12F9BB2D09224F274CE3FB1C792E03C63294AD65A429E76F21C31E2DB50 559EE7B7210B79223B799AE2993B027906E7997790C2E029B840F254E5E95A9B 45C353D21EF294E799577F9227DB23F22CE0F688FD25D77B419EA64892A75992 E4691C26791AA74A9E2CEF1696F7E1E31AF2340233CDFDCF20DD75DF6E7F3A79 6A23F51D43A596A72A55C9D17DCA79CA80554A4C9EAAC2E721AEED7B1830E3E2 E99A3196FE924192F1FAA733BB6DCF93F59E8506E769AA7BCCF7EF66919227FD D39EF94BB6D59F89E6694FFBCEF975E469154FCEA7254F3B7916C521D65A1290 67514C62AD255CCF65CF7A2E0A7992277952F4787A8573179C28C8AFAA32FC73 4B9968E35D6BF3344BCC384FAF0DCB79E6B9419E87487E48C8F733437A3C871F C7D5E08CDC5790240BA0299EAA9FBAD0F8D5A07FCA7C5046F22B48E1F9A7EACE 787906BC220B790A3E2464E47B7CF23C25BF8214657957DDA9F199A19078CA1B 2F5F646CE619B67F06343E329E5EEDA66BABEAFB55C1803C5DDB77573B5D7B29 1197F7F0FA9046CA7BF4B6916742C79B11F3D428AA7C1EC2E74BE4494411F064 FC3AC6AF63FC3A5753ADB5843CEDE419EF2CACC29B0F66763587EA2CEB3C4BC2 9BE6975A9E6188853C872F9B559A6B1D124FD5A53D56F1CC5B33AB443E0C9EAA 4B932C2FEF4A298DF3D458806615CFE1368B2FC135A5599E7AA102EDE1E915C8 423EA5419EAAD17558DE0BBBFEF40A1A20D3D492A71225DF7E0B79B2BC87C7D3 D7EB24DB0EF2145F947C005EF2647F3E0C9E06233390A7DEF0843CF5CABBDEC3 B4D4F234F8EC513E2A42A18EDFF5C2CFCAB831796AF3744D96669E41FA485E69 D2F97C29084FF1AFA67806294109E2E9EB1B46780689319E149E92956A709E46 C2B65BCE53BEC50FC8D35498716B79AA765383F0341806DF4E9E1A7D7E6D9E06 A38E5BD8FFD41E3D69F0343ED326D1E3A3B0C7EF8531DF26329EA99A0FC6F98A 9C4FCBF9C909E5C9F8750679327E1DD77359BB9E8B429EE4499E94803CBD96EA EB2DE10F69D5BF3816996D3C0DC2098FA7EF86853C5D03C1B97A85D74EDF2C41 780AC2D9650CC52932C85335E451045198821B69034F999FE4AF37B53C05E55D 10822FD428767A3C039ECE787B2469610451EC54DB23677C30D69F05C33360FB EE1BE1369AFE52F0D359D5FF0C49E4C3AF91A7419E460CB66ABC191E4FDF7076 A6ACE5F3103E5F224FF264FC3AC6AF63FC3A8DA264AD25E469274FCE0733CE33 C6598205395F31C659AC05399F963CD3C633E0CCF364F10CB24A456F3D57A1F2 0CBEEA873CE5832490A72992E4699624DB23E321506CE82FC5B53E4E69157FEC FD4FD5183896F074C518977F2AC5C88D7DFDA678957490906B06DB23DFEEAE20 5A4B8C3C657A4151F2745D7C2D63A16D3C7D2BF908787A2D66F72D3EE499F18B 279077585F98798959DEBF15861B55AA07D81EC997146748073BFBF3F1F69724 C7B376C60BB2AD3FAF1448CDC27856B68D37F59C93CF4332E6E2DBF0799D419E 7C9E6C8A27DF7704E9B9693F05E5FB38BE2FE6FB77F224CFA4F0E47C30CE57B4 73BE22E7D392A79D3C19BFCE204FC6AFE37A2E6BD77351C8933CC993129CA76D 210504E715982AD8A9741546786AFC142A4FD55F35B244C053109F2AA318C22E 482026F149F38E9CF7D7D512A58216867F060CC1947775AA48E5433C796D5B55 DE35A257658C06400B1832CB2A9E5E6CC9933C63E72919B2D24E9E16D69F06DB 77233C258F2F6EDF553BD2EC7F5A383E224F8E37F93C84CF97C8933C63E1C9F8 758C5FC7F875AEA65A6B0979DAC993F3C1A2E369626100792AC3142235CC33C0 E28438791AF98C3D790681E97169619577F5A9E1F1F03432B59A3C4DC1742035 CF53776557D43C8D2F0048B37F86B4A6229D3CC35CA692C6F65D29508873BF30 BB319EAE616E54C27044CAD37569ABCCBF7957E7D86986A7D76A5B951A803C45 DEE81598C9B6F22EA8A022E02958F8ADB753BA650CA53D92891614194FC186D7 B6D09ED8DA7741F0325F9E01DBA382E419BCFED4EE2F85B7BA38D1ED51409E05 E09FE4194D7F5E5CA3BA8235C5B300DA776BC79B49EC7F26856722C647F63F0F 49D0F83D41CFEB12F4FE88CF93D3F9BE83EFE3D2F9FE88EF8B53389F21A13C39 DF2625F3C112CD93F315399F96F39319BF8EF1EB1C57C1F8755CCF65ED7A2E0A 79922779520CF21444A0720DD0E17A84BC0D5511DB1030DA58F43CBD6C900465 84A7E00885CD5310BC4E3B30853C4FED783B76F2341B234895A76A3CA828E305 B9DAE014A5CBB48A67C4F1AC829777F2647927CF8CA1787A8968DF9D616983B7 EF66E3E949220D83A7C1EE9CD9EE6204F1CAC8D3FEF1A67602233C630C5EC7E7 21E4499EE4C9F8758C5FC7F8757A45C95A4BC8D34E9E9C0F669EA7C627D543E2 296F897ACA48FD3334A4CAFE2969897AB2A8CB7B384875CABB8C25EA6962A83F C52102A2AC3FBD2CF18D66E09AC092F532F1B6475E8B5EB3FF3A37FCEC8FAD7D B784A79725E2F9F3BA2B7752EA9F017E8AADFEB481A7AF25E2FDEA2B1FD99F4F D87A2EF224CFA4F0545F1667B2FFA96789CDF567F43C65A2EEF8B6F296FBA7D6 E30803FDCFE07B52CBD3D7FD7C2DD18D0C439EE4C9F2CEF688FDA504F497D89F 274FF2244F3EAF4B907F16C0F364DBCA7B01BCEFB0DC3F93F83ECE9EFAB300DE 17733E4381F12C98F93636F02C98F960ECCF733E2DE727337E1DE3D7317E1DE3 D7257C3D17853CC9933C29F23CA30C17A07A1CD7B0755E91C7CC02CC3BA0124F E31C0CF2F462284860034F5F07C8F319C9003279516804FF8A2D91E7E91A51C7 D55A81FDCE5C21F1D40BC0251FA6C97999BEE864CE2BCE2EE3F01AE55D6943FE AAB52F4170678D78B252B28879FAC69872F522DFA082C1793ACFE22C0832C668 F3F48AEB25E99F1A4555701C99E22FE99F928D9DD9F65DA9B0988A1A27E99F01 79465F7FCA6F6B07889369DF0DF2D46EDF9D69ECEC7F86D75F0DDB42F24CC378 5383A7E4EDB68727853CC9933C29E4499EE4499EE4499EE4499E14833C8B28EA E2C593644CF17C7CE54EA7CE5DFD2ED5559DACF2782EDAF001F4B94D7BF0F7E9 57763FB59E2AD2F96BDF9BB76610EC132FBFE3CA33E79080F9CCABEFE32F55AC 0BD6ED02AED9FFD8396BC50E681ECF69456F3DFAE2DB33966F6731572AF52006 6EA097C773D29237A18F3CBF75EA0BDBF0EBF465DBA962054928584D59BA0DDC F2783EB4E8F5AC4E78F60DAA8C4E7C6ECBC38BFFA7793CA946143CA966F5BFA6 4DE99B > grestore showpage %%Trailer geomview-1.9.4/doc/figs/light.eps0000644000175000001440000007307610616356701013623 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: blah-000.ps %%Creator: pnmtops %%CreationDate: Jun 26 2006 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 234 355 378 437 %%EndComments %%BeginProlog %%BeginPreview: 144 82 8 328 % 29292929292929292929292929296229292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 2929292929292929a9292929292929292929292929292962 % 29296262626262626262626262626229626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a92962626262626262626262626262a9 % 2929a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a962626262626262626262 % 6262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a9a9626262626262626262626262a9a9a96262a9 % 2929a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffff2962a9 % 2929a9ff292962626262626262626229626229292929292929292929292962626262626262626262 % 62622929292929292929292929296262626262626262626262622929292929292929292929296262 % 62626262626262626262292929292929292929292929626262626262626262626262292962292929 % 2929292929296262626262626262626262622929ff2962a9 % 296262ff62626262626262626262a92962626262626262ff626262ff6262626262ff626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9626262 % 6262626262626262a92962ff6262626262626262ff626262 % 296262ff62626262626262626262a92962626262626262ff6262626262626262ff62626262ff6262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9626262 % 6262626262626262a92962ff6262626262626262ff626262 % 296262ff62626262626262626262a929626262626262ff626262ff62ff62ff62ffffffff62ff62ff % 62ff6262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9626262 % 6262626262626262a92962ff6262626262626262ff626262 % 296262ff62626262626262626262a929626262626262ff626262ff62ff62ff62ff62ff62ff626262 % ff626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9626262 % 62ff62ff62626262a92962ff6262626262626262ff626262 % 296262ff6262ffffffffffffffffa929626262626262ff626262ffff6262ff62ff62ff62ff62ff62 % 62ff6262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9626262 % 62ffffff62626262a92962ff6262626262626262ff626262 % 296262ff62626262626262626262a9296262626262ffffffffff6262ff6262ff6262ff62ff6262ff % ff626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9626262 % 6262626262626262a92962ff6262626262626262ff626262 % 296262ff62626262626262626262a9296262626262626262626262ff62ff62626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9626262 % 6262626262626262a92962ff6262626262626262ff626262 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9626262 % 6262626262626262a92962ffffffffffffff6262ff626262 % 296262ff62626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 626262626262626262626262626262626262626262626262626262626262626262626262a9626262 % 6262626262626262a92962626262626262626262ff626262 % 626262ffa9a9a9a9a9a9a9a9a9a9a962a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9ff626262 % 292962a9202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020202020202020202020202020202020ff622929 % 296262a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505020202020 % 202020202020202020202020202020202020209bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505020505050 % 5050505050505050505050505050505050509b9bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505020505050 % 5050505050505050505050505050505050509b9bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505020505050 % 5050505050505050505050505050505050509b9bff2962a9 % 2929a9a9205050505050505050505050505050505050505050ff505050ff50505050505050505050 % 505050505050505050505050505050505020202020202050505050ffff5050505050505050505050 % 505050505050505050ff50505050ff50505050505050505050ffffff50505050ff50505020505050 % 5050505050505050505050505050505050509b9bff2962a9 % 2929a9a9205050505050505050505050505050505050ff5050ffffff50ff50ffff50505050505050 % 505050505050505050505050505050505020505050509b505050ff5050ff50505050505050505050 % 5050505050505050505050505050ff505050ff505050505050ff50ff505050505050505020505050 % 5050ff5050505050505050505050505050509b9bff2962a9 % 2929a9a92050505050505050505050505050505050ff505050ff505050ff50ff5050505050505050 % 505050505050505050505050505050505020505050509b50505050ff505050ff50ff50ff50ff5050 % 505050505050505050ffff50ff50ff50ff50ff50ff50505050ff50ff505050505050505020505050 % 505050ff50ffff50ffffff5050ffff5050509b9bff2962a9 % 2929a9a92050505050505050505050505050505050ff505050ff505050ff5050ff50505050505050 % 505050505050505050505050505050505020505050509b505050505050ff505050ff505050ffff50 % 50ff50505050505050ffff505050ff505050ff5050ff505050ff50ff50ffff505050505020505050 % 505050ff50505050ff505050ff50505050509b9bff2962a9 % 2929a9a92050505050505050505050505050505050ff50ff50ff505050ff50505050505050505050 % 505050505050505050505050505050505020505050509b505050ff5050ff505050ff505050ffffff % ffff50505050505050ffff505050ff505050ff505050505050ff50ff505050505050505020505050 % 505050ff50505050ff505050ff50505050509b9bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050209b9b9b9b9b50505050ffff50505050ff50ffff505050 % 505050505050ffffffff50ff5050ff50505050ff50ff505050ff50ff50ffff505050505020505050 % 5050ff5050ffff50ff505050ff50ff5050509b9bff2962a9 % 2929a9a9205050505050505050505050505050505050ffff50505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050ff50ff505050505050505050505050ff5050505050505050505020505050 % 5050505050505050505050505050505050509b9bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505020505050 % 5050505050505050505050505050505050509b9bff2962a9 % 296262a920509b202020202020202020202020202020202020202020202020202020202020202020 % 20202020205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505020505050 % 5050505050505050505050505050505050509b9bff626262 % 296262a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b20205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505020505050 % 5050505050505050505050505050505050509b9bff626262 % 296262a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050505050509b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9bff626262 % 296262a920509b9b50505050505050505050505050ff5050505050505050ff505050505050505050 % 50505020205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9b50ffff505050ff50ff5050ff50ff50ffff505050ff50ff505050505050505050 % 50505020205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9b505050ff5050505050505050ffff505050ff505050ffff505050505050505050 % 50505020205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9b50ff50ff5050505050505050ffff50505050505050ffff505050505050505050 % 5050502020505050505050505050505050505050505050505050505050505050505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9b50ff50ff505050505050ff50ffff50ff50ff505050ffff505050505050505050 % 50505020205050505050505050505050505050505050ff5050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 505050202050505050505050505050505050ff50ff50ff50ff50ff50ff50ff50505050ff5050ff50 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 505050202050505050505050505050505050ff505050ff50ffffff505050ff50ffff50ff5050ff50 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffff202050505050505050505050505050ff505050ff50ff5050505050ff50505050ff50505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9bffff50ffffffffffffffff50ffffffff50ffffffffffffffffffffffffffffff % ffffff202050505050505050505050505050ff50505050ff50ff50505050ff50ffff50ff50ff50ff % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 2929a9a920509b9bffff50ff50ff50ff50ffff50ffffffffffffffffffffffffffffffffffffffff % ffffff2020505050505050505050505050505050505050505050505050505050505050505050ff50 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff2962a9 % 2929a9a920509b9bffff50ffffff50ffffffff50ffffffffffffffffffffffffffffffffffffffff % ffffff20205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff2962a9 % 2929a9a920509b9bffff50ffffff50ffffffff50ffffffffffffffffffffffffffffffffffffffff % ffffff2020505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b20509bff2962a9 % 2929a9a920509b9bffff50ff505050ffffffffff50ffffffffffffffffffffffffffffffffffffff % ffffff2020505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a2020202020202020202020202020 % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20509bff2962a9 % 2929a9a920509b9bffffffff50ff50ffffffffffffffffffffffffffffffffffffffffffffffffff % ffffff2020505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050502050505050509b % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20509bff2962a9 % 2929a9a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050502050505050509b % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20509bff2962a9 % 2929a9a920509b9b5050ff50505050505050505050505050ffff5050505050505050505050505050 % 5050502020505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050502050505050509b % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20509bff2962a9 % 2929a9a920509b9b5050505050505050505050ff505050ff50505050505050505050505050505050 % 5050502020505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050502050505050509b % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20509bff2962a9 % 2929a9a920509b9b5050ff50ff50ff50ff5050ff5050505050ff5050505050505050505050505050 % 5050502020505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050502050505050509b % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20509bff2962a9 % 2929a9a920509b9b5050ff505050ff50505050ff50505050ff505050505050505050505050505050 % 5050502020505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a205050505050502050505050509b % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20509bff2962a9 % 2929a9a920509b9b5050ff505050ff50505050ff505050ff50505050505050505050505050505050 % 5050502020505050505050505050509b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a20509bff2962a9 % 2929a9a920509b9b5050ff50ffffff5050505050ff5050ffffff5050505050505050505050505050 % 5050502020505050505050505050509b202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020202020509bff2962a9 % 296262a920509b9b50505050ffff5050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9b5050ff5050505050505050ff505050ff50505050505050505050505050505050 % 50505020205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9b5050ff50ffffff5050ff50ff5050505050505050505050505050505050505050 % 50505020205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9b5050ff505050ff50505050ff50505050ffff5050505050505050505050505050 % 50505020205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9b5050ff505050ff50505050ff5050505050505050505050505050505050505050 % 50505020205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff626262 % 296262a920509b9b5050ff50ff50ff50505050ff505050ff50505050505050505050505050505050 % 50505020205050505050505050505020202020202020202020202020202020202020202020202020 % 20202020202050202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020205050509bff626262 % 296262a920509b9b505050505050ff50505050505050505050505050505050505050505050505050 % 50505020205050505050505050505020505050505050505050505050505050505050505050505050 % 50505050509b502050505050505050505050505050505050505050505050509b2050505050505050 % 5050505050505050505050505050509b5050509bff626262 % 296262a920509b9b50505050ffff5050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505020505050505050505050505050505050505050505050505050 % 50505050509b502050505050505050505050505050505050505050505050509b2050505050505050 % 5050505050505050505050505050509b5050509bff626262 % 296262a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505020505050505050505050505050505050505050505050505050 % 50505050509b502050505050505050505050505050505050505050505050509b2050505050505050 % 5050505050505050505050505050509b5050509bff626262 % 296262a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505020505050505050505050505050505050505050505050505050 % 50505050509b502050505050505050505050505050505050505050505050509b2050505050505050 % 5050505050505050505050505050509b5050509bff626262 % 296262a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 505050202050505050505050505050205050505050505050ffff5050505050ff5050505050505050 % 50505050509b502050505050505050ff5050505050505050ff5050505050509b2050ffffff505050 % 505050ff50505050505050505050509b5050509bff626262 % 2929a9a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505020505050505050505050505050ffff50ff50ffff5050505050 % 50505050509b50205050505050505050505050ff5050ffffff5050505050509b2050ff5050505050 % ffff50ff50ffff50ff5050ffff50509b5050509bff2962a9 % a9a9a9a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 505050202050505050505050505050205050505050505050505050ff505050ff505050ff50505050 % 50505050509b5020505050505050ff50ff50ff5050505050ff5050505050509b2050ff50505050ff % 505050ff50505050ff50ff505050509b5050509bff29a9a9 % 2929a9a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 505050202050505050505050505050205050505050505050505050ff505050ff505050ff50505050 % 50505050509b5020505050505050ffffff50ff5050505050ff5050505050509b2050ff50505050ff % 505050ff50505050ff50ff505050509b5050509bff292929 % 2929a9a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 5050502020505050505050505050502050505050505050ff505050ff50ff50ff50ff50ff50505050 % 50505050509b50205050505050ff505050ffff50ff50ff50ff5050505050509b2050ff5050ff50ff % 50ff50ff50ffff50ff50ff50ff50509b5050509bff2962a9 % 2929a9a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505020505050505050505050505050505050505050505050505050 % 50505050509b502050505050505050505050505050505050505050505050509b2050505050505050 % 5050505050505050505050505050509b5050509bff2962a9 % 2929a9a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505020505050505050505050505050505050505050505050505050 % 50505050509b502050505050505050505050505050505050505050505050509b2050505050505050 % 5050505050505050505050505050509b5050509bff2962a9 % 2929a9a920509b9b5050505050505050505050505050505050505050505050505050505050505050 % 50505020205050505050505050505020505050505050505050505050505050505050505050505050 % 50505050509b502050505050505050505050505050505050505050505050509b2050505050505050 % 5050505050505050505050505050509b5050509bff2962a9 % 2929a9a920509b9b2020202020202020202020202020202020202020202020202020202020202020 % 20202020205050505050505050505020505050505050505050505050505050505050505050505050 % 50505050509b502050505050505050505050505050505050505050505050509b2050505050505050 % 5050505050505050505050505050509b5050509bff2962a9 % 2929a9a920509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b205050505050505050505020505050505050505050505050505050505050505050505050 % 50505050509b502050505050505050505050505050505050505050505050509b2050505050505050 % 5050505050505050505050505050509b5050509bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b50209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b5050509bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff2962a9 % 2929a9a9205050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050509bff2962a9 % 296262a9209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9bff626262 % 296262a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffff626262 % 29626262626229292929292929292929292962626262626262626262626229292929292929292929 % 29296262626262626262626262622929292929292929292929296262626262626262626262622929 % 29292929292929292929626262626262626262626262292929292929292929292929626262626262 % 626262626262292929292929292929292929626262626262 % 2962626262626262626262626262a929626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 6262626262626262a9296262626262626262626262626262 % 29a9a9a9a9a9a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9 % a9a9a9a9a9a9a9a9a929a9a9a9a9a9a9a9a9a9a9a9a9a9a9 %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def %%EndProlog %%Page 1 1 /picstr 903 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def gsave 233.76 354.72 translate 144.48 82.56 scale 301 172 8 [ 301 0 0 -172 0 172 ] { inputf picstr readstring pop } false 3 colorimage 78DAED9DCB91E42A1045DBCAB2A05C7ACBB641DEF4765C791D53110A0D029440 262470EE8298D6A82889E270F9F3F585101AAF1F1B7D7F7FBF5EAF1F8466D6EB AFECE2FFC5E48AE1EF9FBA61F0FCEAF11312F609CF6CAC1EF3472786C1752D5D 9F1FA119757513A3F8033734C2909F12CD4EA21D205137FC5C272424B40B256E 482A11125A337875BD941BD27B8C90E9C084C40DED463110DA5919D78B5ED7EA A165B482704878663F574F55E186F49422BA3715C7DDAE6495BA21E386685E0C 55F2F09D68794B3088A7BF1B469FFF51C1C33F5EAFBB0D6D32E66E44B4308F05 B74DE486761842286EA8E886A599790D376CFF2C18E286FDDD30A8974EE18642 2BBC56BCAFFF155C0CAE672E926F7143DCB008C3284A293CA39FCA44887043B7 6E583A4FC0CE0DEF37D4B1067A9BBBA1BC2EE4C70D8B726CF0BDBA35D23AD0A2 315323DDD90D8BEA427EDCB0AE6259E486DDAC907E1BDC508EA12B37ACA897AA BB611D86F9EA28186EEB8645F5523F3DA515CD43B91BAA74CE28BA245ADB0DE5 CDC3AD7A4A532C970E55C8FF84C19DDDB091E8B5C70D8B0447A843DEDB73168D 103A1844B8E110372C6A562348C40DD54B24845CB961DD6C16D61B22DC5097E8 D25103DC10E1861E88AE70C3F3B32DE1E714806F76C623EC1E6AE5BD93E8F678 326EF8FDEF0E8A9FEBE7071BA5150F4203F39E56541937BC7F239B492264BA4F 69C066B025E949FD1F8490B6AE6E78DDBCF48AE1B51E4B8A21A4ABF7FB1DEC00 7CC730E865FA7CF0400869E8FD57453DA56088901D86C271433044083744A845 DE5A85B82102C3E13D33B821DA16433F7551DC1081A1370C71430486B8214260 881B2230DCD90D7FBF4878B1E886897285A45B1BE186A66EA88BE15C78CABBB5 33E9F051B74418586C5E5F361361344D70438B1F68250C253F562AB345FF9C08 C3A2470DDEB7E21B53091EAC39C20DA3097E2F03CF3F83EC17CD9C6ED96CC430 75A53F867D8A4D530C33451C6DC33B658FFFAEFBD516C030F8AF547DF55E7615 A5D8C06233F3A8C29AB910C30E19662E374CA5ADE4BA671F6CC730F382456597 2E86A6C566F486A218E418A648BF7F85B0B89BDD0D1BAFAF5A29CDC0589468EA 18DA159B290CE5CDD53A0C2BCA96C7C7DBC70DFDDBA20A868F5D34F2EB92D6E5 C062B367A554F7A53677C385DB861689361C43B9C1455B734695D28A977AEC7A 9DCE0D1FDB14D52D854D7A4A85D7EFA1B762B3AEF138DC0D67691BDE8B0E61CF 5BA68AB27CDB503E6E2869B3C88BAC81C566CF2E9A4C547618CE32A7748D396C 41AE783F49528849BA68323D7845188E2A36BBB50DF3455C4B71E7D60D8B7A1E D6C3F02DD0BC2FA8FB7B558FF54B30CC37E532031645C5DDBC6ED8799611725B 6CDA61D85FAC374493169BC268E79DDACD7A43B483704384C0D0CE0DDF3B8922 080C7DBAE127736E72E4071882A15B371476BCE386080C4DDD700700C1100CA7 70C3B57F3E305CE677742223370443E4FC777455C572E886757B0D81219A5ADE DC5017435D7EC11075C0D0AD1B3A890D0CD1746EF8B87FCEF5B6E80D99BD4A84 9FD29DD30886682E37ACDE9B2BBF6F58CB965F6088366F1BCA5749E7F70DB358 010D8668E1B6617411653B868FD18221C20DEF95523B374C75C5CC8561FFE118 964EEFD336EC5029DD04438B95B3F0B89B1B96564AEBBA68C0105BC40D336DC3 A3E4AC8496018B54CC5A99CD1AC3D293564A4F52C8DCDCFF1415D4C10D975407 0C255588F6535AF2E34460B8921B8261634BEDB1267F88B770977CA3FFEDCD71 43DCD00F86454336994A2918AEED865F8BCAA11B4A5AC7999A6A9FAE2D34C40D C1D0218687E0CCA6C71364D05C6E18F48E66F47883FA0767C7B0FD94968CEBB1 2FFA4A6ED88E61E6839986D292181E8993564A4F52788C192B5CD50DAB4DCDCE 46BD61E84A60B8BC1BDEDB20A903B9247E0786160C82E1DA6DC3C7A64D740E1B 18C2206EA8E886F7464DD1753044B8A18A1B822142B8A12B0CDF686FE1866088 5C1D83D2D30D255D31BB61F81F2A97DD715D3D9F7F881BE6072CA270E5C72CC0 100C85A7E0C96FF68061CF39A5FD2102C3C5301426B2FC4E27189AAEB0C84FCA 024304867DDCF03E580C8630058607ABEF4B04866038911B82211882A1073794 AFE3AE98C798AAE8822118E286BA18B62C33074330C40D8BE8004304863DDD30 BA3F6DE3D184600886B8A11C438BA309691B82216E588A6194A0EA3DFAFAAF51 0543305CC00D15311CB24E1C0CC110371CCB20187AC350BEA448BEFE08371462 3870BF1430F483A1D132C01DDC50E568C2C530FC8376D5A8593499018B2865A9 D3883233C6E7C290AC088663E794CEB8171F5B422123755B6191AA948221423D DD70D4946C3044B8E1320243B4801B8221423DDD90F586080D7743D61B22E4C7 0D25D60686080C596F08866893B6A1C57A433044B8612986517CAA173AD14583 70C3E1CB7E7143841B822142DBBA213DA50837F4B6DE705E0CD758A4C37AA596 F54DFDDDF0505A6F78AC328B66DE8C749DAFE8F609FD275D073774D5A6F38CE1 A4D527CF6F71DDD6C073D27570C39485E56D0E0CC1100C596F088660B8B61B2E 203004C305DC100CC1100C7143300443DC100CC1100C7143300443DC100CDB31 2CEA6AB6E8916EC7507D4306218675BB4C2BA6216EB8008641E691E42587184A 28B0C330939EEA85066EB82A867639A4278647EDA979BA181E4A47D9AA63881B BAC5509219EE46139DD07BBFA1A89266846174BE71E6BA0A86F2244ADD10BD3F E5F82D6E78D2871BBAC5F071F58A64D7910E18E6B3B7D6A3D661D892868F2FD2 EE86AF7F851BFAC43095B584370CC750F278D618B6A761FE81E56E7825EEDA36 3CBD123704C33A0C334D33271846BB52E5371C4FA7FE15B9E1A90043DA8660D8 88A124273B71C38A1B1E9FB0A86D18C590B6A1E79E52DCB0BDA7D40F86F4943A C7B0A25B43DEBD608A613E0F0FE9A291A767E72E1AC60D3D631854ED3255BE4C 6F64E68681181EBD062CF2B368EAD2304A5FCB80056EE81FC3E1624EA956D2E1 866008866E31C40DC1100C714330044330C40DC1100C714330044330D472C3B5 373F074330F4EF86CB9F41008660E8D90DF7111882A14F37E45C9EEA96E68CF2 FF166E1FCCD40D510586F3D607FCBF85DB073375438450637D153744C80986B8 2142B8214260881B22841B220486A56EF84608E9A9C20D4934842C3094BBE117 42C8407237FC410859EAD10DAF54121212DA852937D4D5EFB758448B504F9966 E3941B2AC6FF797E48440B6068C448E086671FA96E783F1D839070AEF0CCC646 F19F18BECC743F460AA1E9649A8DE93D46C883FE07744278A5 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/light.pdf0000644000175000001440000001327510616356702013601 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hbb¢g¶02Õ3SÐ5Ò3¶´011Ì-Í,Ì!Ê-\ò¹~Aendstream endobj 6 0 obj 68 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 3115>>stream xœí=’Ô<†›£n!'  "’½Ç ™dîÀ^€d#¨ÚlJDÊU>úÖhdYjIÝRË~Ÿ*\ƒ­‘-¯¿þŸWÍ«åßïß¿5ª~~~~zzº\.•Ð×õºñ¢ÉçÏŸÿy¸üÿÝ»w‚ÃEB¿âõcˆaŸá'â5;5þyLÂo€lÍôÁn¼Ôÿýû÷›<Ô˜ÇÒH¦F¯/5¿ÿ>’‡n†b¨7 TŒç¡…Åãe~ìíæá2A<‚‹½Ý<\&(]ÌàÌÜÝÝEco7¥.f¸Ù?õŒáÙ†ôwßÏZßóÍrjäóð¹ùÑΗ‚Aö½'¡Ëo¾YNË‚<´ÐJ”‡þ^?ôëáŸ@yxxðëYøúåa´Y\ ץώ¯+ŽM]ßKÔ(½t3N ŠÍ”‡zBÑS¡‡Lé¥Ë$Û¿ σ<¤Û]Ó9ò†ëÞù2ÆŸ´~ö Ðfo~;räaªüåÞ¿ýýotR`rt8ÇÌÃÒÛküËæá¶@Â(æ$pHÒ}¿7d(™s —n“Jðz’_ :G0;Ù¾·öRÎÙPyHÞ6€Ÿ‡ÝÂ3S0;Ù=>>rF˜æé; ýæ÷pdÊz8—ŸÝÙí½©K{ݿժ+aàvÓol¢Âè:q÷¬åaõ·fô0±2׿Öv’ëmkcýÿNäaÑ¢ú…ëæ¸·ÂWuºÐ|yÝ ºÁ–o»!Ll-ÐèaШ`å/ëþ|[¾eÇÃ`‡‚”ûÌyèw)ºÕ,û9ú§²™“²“övY×Ïuklàv3±¨Ñ–V{˜h¾“åávCÅßa«ÖH‹‡´ßÀ¢—¬‡ªÛÍh¢ønk[dz`nïæËÃjéÐû¥+[‹Vš¸‡zÛÍ=£ßô°bãýìs¢<ô§’IE‘ÍàØö¿SxØÿªŒ‘ë@`Eñø0+|PªùçÏŸJ5û¸åßóPý~šÄu‹µžmùÄÕ|xxNøº?¿pŸ?GÚCêyi‹Ú‡FØöã=\·d–¤^Ž~y¸÷Þ~éDÀC#ÛCÒÎÃàH¹vuáØâyü ²ÏÃÃjŽí!áyü4ðÐÇöPåý¥Ùû÷+nð>øÓxh„c{H²ï/mô°åÁs%ࡎí¡âû¼ÀC%;Çö´óп@Ø»vŸu žc{¨{|Xñ¢) šáØ’jîíO2Çoéÿxh„c{¨ž‡‚y <4±=¤YòpÔ»Œà¡\?v-ËÚ-9XðpŽ<%!ÁC3,ý˜¯V<$í<$‰Ÿ.<˜‡ü§rÀÁv?MâºÅZ϶|`Ýöñy¯[@Â3câþÒ±VÒï=Ðïy‹½ýÒ‰€‡@‰®y8êþl)à!PÏxþ°x”Àó‡ÀC ž?,%ðüað(ç €‡@‰¹Ÿ?ä%¦|Þ‚JSx”˜ïy‹ä!8³æá¶|à!Pb¾<ÄùRp<¦þp^]m“²6êV !Úsæ{þЯ':UxèXÖÀzë¢ÍVýìaOüUçƒç Ððpºý[×cMµÂÑÁËzˆç3ÀC‚‡ 0=$<˜_:‹‡Öò£Pq¾4Ãpiçú¡È9&u¦;ñó4üõÙù< áúaË÷Óø{}‰s’‰L4<¤ÛvEûQ⺅_,ººš]‡Ó/: ä¡ <î/­y(<$xØòPxHð°ä¡ ðàaÈCà!ÁÇ2ÀC‚‡ ôÎC›¯R–<¬¢k[B‚‡ð°–NyØ©5€‡ð°‚yhó÷FôòÐíÉOGà¡ÁV8 .˜n‚R–l°—0ñ=´ÙŠõl…5tóP ò€ñ ò€ñ ò€ñ4å¡ÍóÂLJMBBd)ÎÃeÚ˜%àÐä¡ÿ’S€8ù>stream GPL Ghostscript 8.54 PDF Writer blah-000.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000384 00000 n 0000005260 00000 n 0000000325 00000 n 0000000171 00000 n 0000000015 00000 n 0000000153 00000 n 0000000449 00000 n 0000000549 00000 n 0000000490 00000 n 0000000519 00000 n 0000003865 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 5428 %%EOF geomview-1.9.4/doc/figs/light.png0000644000175000001440000000360610616356716013616 00000000000000‰PNG  IHDR-¬ÜVçPLTE¯¯¯•••ÖÖÖdddVVVßßßZ[„õ)IDATxœíK‹ë6€%SîZ^\º fÈè¢Û̬ïPB¶C^7”0¿Ö[GKŽdKræškçåOŸåcÉr„ßFDZF¼ßàòiæ:˜ÆS¸ÁÅaæzÌ8ŽC…8ÞNp™ú‚ÀŽâ¯Ô×±µ¾®Åpâ¾µs‚£ðõY%7㯓ô5¾é0ç7!´¦ƒòeìƒûí`MfžøÔ¾ŒWï–¿Ì5çõ­iE¾çP5­ó%kå&‘ákÓ°}É=¯µö× 3Bc¾Th_'£óö¾[7Ñ\Ó͘羺ëðyœt˜óÛ†¹¦«1Ï}ý˜¦Ã¶ÝÁÕ1N=Ïtš¾šŠNãH¹ŽÇÚ$0~o#Û§¯¾¡øùKîÇÆ¸dþzù2#T½jû `=ªûò?|®îËÿðùåËßÅ™',gãw¾çòû\‹lœëÁ^‹Ä›Ÿ#a,^ý”/5³ÌugD_†{´È%?ë‡èJ²Þõ5ŒÌÅBt.‹þóp9峸0-‘õP¿ˆüëIØàšß4—€ õoù0{Èà²KñEÔäÈÇÕ#6±?Àe—÷jVpZY¦¸/=¥lG†Ù¶$Ë*åÂ=äBÆ_º/î"ÊÅê=á¯jÞò¹Û‘è÷±‡“}¥Ô¯|¾Ÿ‹•Õ{äçš{q_¬Nô+ê½Á…±—‹H.òÕ/úB4ùÑýˆíOiy‹íˆ˜ ,Ÿ[ï±Ëµ|| ëq¦Á Ãë=a•‡ËçÔ/V"]¦X{‚à…ü ¸ÎŠk!°gä{–'D™¢¾Pp/\vù,.OìÔþ²ÊÇ+kä¸ýÿjíi¾ÎiqÙƒËôuI;§± —éëÒª¯4¬ ¾’>«$W ì¶¯½¹A®/lÛ”ä EØà‡‘}¸|ªøše„g1ëÔðÞÇ·¾t×…ujdO ¾/Õ¬d؊ܕ˪_™\´P‰ ú"ØòÕǸ<É$z(…˪_övLäÂð¡xó;Êeû’ÝuUï×s¥tW¢\výÂâ܂νu~Âæâ‰DŸ`˜E#’¹5óRªN)´«Mp.Wn{B&Õ‘ïÅbÖ¶,á‹É”B·c .è+e$5ä‹ïº´·èî+ë¹ ¯\üTÉKb¶¯yo¤«Æ ‚¤ré”ÂO1åuÕm_cë¹æ§N0ð¼’—Â\_pÅ}…"—ËõE`t»®„3AË\NýR§³|ež òøšy䔳s¹\_mpeúJ;s°2>ò}mÂu÷úâu>•ëõñ'<=ô¯óüÝ›ïiž @ýÆ\Áõ·—Ëw|ôÀåºóº-þós9í ºàr}õý"V_)¹¥†¯v¸ìþ#½÷xÔðep‰ÉmÔñÕ7ÂåúÒ£÷4ZñeŒÞKsmø2G}½ÍáZ¾L._o«_¾Vz>׃7gÄOøòvNó¹`k+Õ—½OâJ‚[þ|¯GïÙpþ2×e+.ßñq¹ïWi¼#zuB­ñ¡ØÕ uLJÂQw<-UƇֶ¿6ãÊlmÆ•ÙþÚŒ+³ýµW¤ýÕŽ/ØÎ©Vï—Û_­új©~ÁöW;¾`û+Âm±<ÑÌéýùÞhÅó}dá\BO<<¾øÊV´s$ÉÍñ|ÁÏË=ð̹/ÐþÚŒ+³ýµŸ¯hÔòÕ×Ë×:®ïîK4×`ÝàÒ§‡°â"r×ï*ê ‰‘Ð Â.9N Îiõ%¿äÂ~.óìà*ã‹0B½¼öÏË%¾»`r±+Bø»ÄE>¦¯îšé‹7nå€jYs~ÑVG9Å¥ßÅ/v0}ý˜¦¾ˆ¼¦Cø-.Ѳ³¸Œw± C„/u€M¹°ñ}‹‹]:ˆØå=ltJøR÷Ø”‹ Ô…|õòÊ<ö”ðeÜ s|Æ—ü›ÃU0™5Øâb+÷Õ{Ôê}É|¯ó„—ËÍH´ÕÅw¡°‘'¾ûñ±4×Ë×:®—¯u\ÐWR?}_Á¾ùþ\™ßOÛÅW’­/pó„ГD|„_py„žq|=Á—\Á„¿tæøj'j_4/_ëâåk]˜¾–÷øCûzÔF¡}-_T¸{H_oµï”n‡ðµãï($óîÙÆï¸¿¯0UùÝpÌÿ¾‚u×Êqûczâö—g.뮕cì¶–›Äí.×N ÁøŸ˜é4GÜuIEND®B`‚geomview-1.9.4/doc/figs/cam.eps0000644000175000001440000040676110616356703013257 00000000000000%!PS-Adobe-2.0 EPSF-1.2 %%Title: noname.ps %%Creator: pnmtops %%CreationDate: Sep 12 2003 %%For:claus claus %%Pages: 1 %%DocumentFonts: %%BoundingBox: 256 237 356 525 %%EndComments %%BeginProlog %%BeginPreview: 100 288 8 864 % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffff % 2962292929292929292929292929a929626262626262626262622929292929292929292929296262 % 62626262626262626262292929292929292929292929626262626262626262626262292929292929 % 29292929a92962626262626262626262626229a9 % 2962626262626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262622962626262626262626262626262a9 % 2962a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a9a962626262626262626262626262a9 % 2962a929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292962a9 % 2962a92962626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626229626262626262 % 62626262622962626262626262626262a92962a9 % 2929622962626262626262626262a92962626262626262ffff626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262626262a929626262626262 % 62626262622962ff626262626262ff62a9296262 % 2929622962626262626262626262a929626262626262ff6262626262ffff62ff62ffffff6262ff62 % 62ffff62ffff6262ffff62626262626262626262626262626262626262626262a929626262626262 % 62626262622962ff626262626262ff62a9296262 % 2929622962ffffffffffffffff62a929626262626262ff626262626262ff62ff62ff62ff62ff62ff % 62ff62626262ff62ff6262626262626262626262626262626262626262626262a929626262ffff62 % 62626262622962ff626262626262ff62a9296262 % 2929622962ff62626262626262ffa929626262626262ff62626262ff62ff62ff62ff62ffff626262 % ff6262ff62ff626262ff62626262626262626262626262626262626262626262a929626262ff62ff % 62626262622962ff626262626262ff62a9296262 % 292962296262ffffffffffffffffa929626262626262ff62ffffff62ff62ff62ff62ff62ff62ff62 % ff6262ff62ff62ff62ff62626262626262626262626262626262626262626262a92962626262ffff % 62626262622962ff626262626262ff62a9296262 % 2929622962626262626262626262a929626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262626262a929626262626262 % 62626262622962ff626262626262ff62a9296262 % 2929622962626262626262626262a929626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262626262a929626262626262 % 62626262622962ff626262626262ff62a9296262 % 2929622962626262626262626262a929626262626262626262626262626262626262626262626262 % 6262626262626262626262626262626262626262626262626262626262626262a929626262626262 % 6262626262296262ffffffffffffff62a9296262 % 2929622962626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9 % a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9a9a9a9a9a929626262626262 % 626262626229a9a9a9a9a9a9a9a9a9a9a9296262 % a9a962ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffff29a9a9 % 29296220202020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020202020209b292929 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050502020202020202020 % 202020202020202020202020202050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050502050505050505050 % 505050505050505050505050509b50509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050502050505050505050 % 505050505050505050505050509b50509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050502050505050505050 % 505050505050505050505050509b50509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050505050505050505050505050505050505050505050205050ffff505050 % 505050505050505050505050509b50509b2962a9 % 2962a92050505050505050505050505050505050505050505050505050505050505050505050ff50 % 50505050505050505050505050505050505050505050505050505050505050502050505050505050 % 505050505050505050505050509b50509b2962a9 % 2962a9205050505050505050505050505050505050505050505050505050505050505050505050ff % 5050505050505050505050505050505050505050505050505050505050505050205050505050ff50 % ff50ff50ff5050ff50ff5050509b50509b2962a9 % 2962a9205050505050505050505050505050505050505050505050505050505050505050ff505050 % 50ff50ff50ff50ff5050ff50ff50ff50ff50ff50505050505050505050505050205050505050ff50 % 5050ff50505050ffffff5050509b50509b2962a9 % 2962a9205050505050505050505050505050505050505050505050505050505050505050ff505050 % 50ffffff505050505050ffffff50505050ffff505050505050505050505050502050505050505050 % 5050ff50505050ff50505050509b50509b2962a9 % 2962a9205050505050505050505050505050505050505050505050505050505050505050505050ff % 505050ff505050505050505050505050ff505050505050505050505050505050205050ffff505050 % ffff505050505050ffff5050509b50509b2962a9 % 2962a92050505050505050505050505050505050505050505050505050505050505050505050ff50 % 50ffffff505050505050ffff5050505050ff50ff5050505050505050505050502050505050505050 % 505050505050505050505050509b50509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050502050505050505050 % 505050505050505050505050509b50509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050502050505050505050 % 505050505050505050505050509b50509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050509b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b50509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220502020202020202020202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020202020205050509b296262 % 29296220502050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b5050509b296262 % 29296220502050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b5050509b296262 % 29296220502050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b5050509b296262 % 292962205020505050505050505050ffffff5050505050505050ff50505050505050505050505050 % 5050505050505050505050505050ffff505050505050505050505050505050ffff50ffff5050ffff % ff50ff5050505050505050509b5050509b296262 % 2929622050205050505050505050505050505050505050505050ff50505050505050505050505050 % 50505050505050505050505050ff5050ff5050505050505050505050505050ff50505050ff505050 % 5050505050505050505050509b5050509b296262 % 2929622050205050505050505050505050ff50ff50ff50ff50ffff505050ff50ff50ff50ff50ff50 % 5050ffff50ff50ff50ff5050505050505050ff50ff5050ff50ff50ff505050ff50ff505050505050 % ff50505050505050505050509b5050509b296262 % 2929622050205050505050505050505050ff5050ffff50ff5050ff5050505050ff505050ff50ff50 % 5050ffff505050ff505050505050505050505050ff50505050ff5050505050ff50ff505050505050 % ff50505050505050505050509b5050509b296262 % 2962a92050205050505050505050505050ff50ff50ff50ff50ffff50ff50ff50ff505050ff50ff50 % ff50ffff505050ff50ff505050ff5050ff50ff50ff5050ff50ff5050505050ff50505050ff505050 % ff50505050505050505050509b5050509b2962a9 % 2962a92050205050505050505050505050505050505050505050505050505050ff50505050505050 % 50505050505050505050505050505050505050505050505050505050505050ff5050505050505050 % 5050505050505050505050509b5050509b2962a9 % 2962a9205020505050505050505050505050505050505050505050505050ffff5050505050505050 % 50505050505050505050505050505050505050505050505050505050505050ffff50505050505050 % 5050ff5050505050505050509b5050509b2962a9 % 2962a920502050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b5050509b2962a9 % 2962a920502050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050505050505050509b5050509b2962a9 % 2962a92050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b5050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050202020202020505050ffff50505050505050ff50505050ff5050ff505050505050 % 5050ff505050505050505050ffffff5050505050ff50ff5050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a92050505020505050509b505050ff5050505050505050505050505050505050505050505050 % 5050ff50505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a92050505020505050509b505050ff505050505050505050505050ff505050ff50ff50ffff50 % ff50ff50ff50ff50505050505050ff50ff505050505050ff50ff50ff505050ff50ff50ff50ff5050 % 505050505050505050505050505050509b2962a9 % 2962a92050505020505050509b505050ff50ff50ff50ffff50505050505050ff50ff505050ffff50 % 5050ff50ffffff50ffffff505050ff50ff505050505050ffffff50ff505050ff5050505050ff5050 % 505050505050505050505050505050509b2962a9 % 2962a92050505020505050509b505050ff50505050505050505050505050505050ff505050ffff50 % 5050ff50505050505050505050505050ff505050505050ff505050ff505050ff5050505050ff5050 % 505050505050505050505050505050509b2962a9 % 2962a920505050209b9b9b9b9b505050ff5050ff5050ffff505050505050ff5050ff505050ff50ff % 5050ff50ffff505050505050ffffff5050ff505050505050ffff50ff505050ff505050ffffff5050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050ff505050505050505050505050505050505050505050ff50 % ff50505050505050505050505050505050505050505050505050505050505050505050ff50ff5050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050202020202020505050ffff50505050505050ff50505050ffff505050505050ff50 % 50505050505050505050505050505050505050ffff50ff5050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2929622050505020505050509b505050ff505050505050505050505050ff5050ff505050505050ff % 505050505050505050505050505050505050ff5050ffff5050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2929622050505020505050509b505050ff50505050505050505050505050ff505050ff50ff5050ff % 505050505050ff50ff50ff50ff50ff50505050ff5050ff50ff50ff50ff50ff50ff5050ff50ff50ff % 50ff50505050505050505050505050509b296262 % 2929622050505020505050509b505050ff50ff50ff5050ffff50505050505050ff505050ff5050ff % 50ff5050ff5050ffff505050ffffff505050505050ffff50505050ffff50ff50505050ff505050ff % 505050505050505050505050505050509b296262 % 2929622050505020505050509b505050ff505050505050505050505050ff5050ff505050ff5050ff % 50ffffffff50ff5050505050ff5050505050ff5050ffff505050ff505050ff50505050ff505050ff % 505050505050505050505050505050509b296262 % 29296220505050209b9b9b9b9b505050ff5050ff50505050505050505050ffff5050ffff50505050 % ff505050505050ff50ff505050ffff50505050ffff50ff50505050ff50ff50ff505050ff50505050 % ff5050505050505050505050505050509b296262 % 29296220505050505050505050505050ff5050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050505050505050505050505050505050505050505050ff % 50ff50505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2962a9205050509b9b9b9b9b9b505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a9205050509b1d1d1d1d20505050ff50505050505050ff505050505050505050505050505050 % 50505050505050ff50ff50505050505050ff5050ff5050ff50ff505050505050505050ff50505050 % 505050505050505050505050505050509b2962a9 % 2962a9205050509b1d1d1d1d20505050ff5050505050505050ff5050505050505050505050ff50ff % ffffff505050ff50505050ffffff505050ff5050505050ff50ffffff5050ffff50ffffff5050ff50 % 50ffffff5050505050505050505050509b2962a9 % 2962a9205050509b1d1d1d1d20505050ff50ff50ff50505050ff5050505050505050505050ff5050 % ff5050505050ff50505050ff5050505050ff5050505050ff50ff505050ff505050ff50ff505050ff % 505050ff5050505050505050505050509b2962a9 % 2962a9205050509b1d1d1d1d20505050ff50ff50ff50505050ff5050505050505050505050ff5050 % ff5050505050ff50505050ff5050505050ff5050505050ff50ff505050ff505050ff50ff505050ff % 505050ff5050505050505050505050509b2962a9 % 2962a9205050509b1d1d1d1d20505050ff50505050505050ff50505050505050505050ff50ff5050 % ff505050505050ff50ff50ff5050505050ff5050ff5050ff50ff505050ff50ff50ff50ff505050ff % 50ff50ff5050505050505050505050509b2962a9 % 2962a920505050202020202020505050ff5050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050ff5050505050505050505050509b2962a9 % 2962a920505050505050505050505050ffff5050505050505050ff50505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 50ffff505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050202020202020505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2929622050505020505050509b505050ff50505050505050ff50505050ff5050ff50505050505050 % 50505050505050505050ff50ff50ff50505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2929622050505020505050509b505050ff5050505050ff50ff50505050ff50505050ff5050ffff50 % 50505050505050ff50505050ff50ff50ff50ff50ff50ff505050ff50505050ff50ff50ff50ff5050 % ff50ff50ff50ff50ff50ff50ff5050509b296262 % 2929622050505020505050509b505050ff50ff50ff505050ff50505050ff50505050ff5050ffff50 % ff5050ff505050ff50505050ff50ff505050ffffff5050505050ff5050505050ffff505050505050 % ffffff50ff5050ffff5050ff505050509b296262 % 2929622050505020505050509b505050ff50505050505050ff50505050ff5050ff50ff5050505050 % ffffffff505050505050ff50ff50ff505050ff505050505050505050505050ff5050505050505050 % ff505050ff50ff5050505050ff5050509b296262 % 29296220505050209b9b9b9b9b505050ff5050ff5050ffffff50505050ffffff5050ff5050ff50ff % 505050505050505050ff505050ffff50505050ffff50505050505050ff505050ff50505050505050 % 50ffff50ff5050ff50ff50ff505050509b296262 % 29296220505050505050505050505050ff5050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050202020202020505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2929622050505020505050509b505050ff5050505050ff50ff50505050ff5050ff50505050505050 % 50505050505050ff5050ff505050505050ff505050ff50ff5050505050ff50505050505050505050 % 505050505050505050505050505050509b296262 % 2962a92050505020505050509b505050ff50ff50ff50ff50ff50505050ff50505050ff5050ffff50 % 50505050505050ff5050ff50ff50ff5050ff50505050505050ff50ff50ff50ff50ff50ff50ff50ff % 50ff50505050505050505050505050509b2962a9 % 2962a92050505020505050509b505050ff5050ffff50ff50ff50505050ff50505050ff5050ffff50 % ff5050ff505050ff5050ff505050ff5050ff5050505050ff50ff505050ff505050ffffff505050ff % ffff50505050505050505050505050509b2962a9 % 2962a92050505020505050509b505050ff50ff505050ff50ff50505050ff5050ff50ff5050505050 % ffffffff505050ff5050ff505050ff5050ff505050ff505050ff505050ff505050ff5050505050ff % 505050505050505050505050505050509b2962a9 % 2962a920505050209b9b9b9b9b505050ff5050ff50ffff50ff50505050ffffff5050ff5050ff50ff % 5050505050505050ffff50505050ff505050ff505050ff5050ffffff50ff50505050ff5050505050 % ffff50505050505050505050505050509b2962a9 % 2962a920505050505050505050505050ff50505050505050ff505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050ff5050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050ff5050 % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % ff50ffff50ff50ffff5050ffffffff505050ffff50ffff5050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a92050505050505050505050505050505050505050505050505050505050505050ffffff5050 % 50ff505050ff505050ffff505050505050ff505050ff50ff50505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50ff505050ff50505050ff505050505050ff505050ff50ff50505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 5050ffff50ff50ffff5050ffff50ff505050ffff50ff50ff50505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050ff50505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020505050505050509b296262 % 29296220505050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b2020505050505050509b296262 % 29296220505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502020505050505050509b296262 % 29296220505050505050505050205050505050ff5050505050505050ff5050505050ff5050ff5050 % 50ff50ff505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050502020505050505050509b296262 % 29296220505050505050505050205050505050ffff5050ffffff5050ff5050505050505050505050 % ffff50ffffff5050ffff50ffffff5050ff50ffff50ffff505050ff50505050ffff50505050505050 % 505050505050502020505050505050509b296262 % 29296220505050505050505050205050505050ff50505050ff50ff50ff5050505050505050505050 % 50ff50ff505050ff5050505050ff50505050505050ff50ff505050ff5050ff505050505050505050 % 505050505050502020505050505050509b296262 % 29296220505050505050505050205050505050ff50505050ff50ff50ff5050505050505050505050 % 50ff50ff505050ff5050505050ff505050ff505050ff50ff505050ff5050ff505050505050505050 % 505050505050502020505050505050509b296262 % 2962a92050505050505050505020505050ffff5050505050ffff5050ff505050505050ffff505050 % 5050ffff50505050ffff50ffffff50505050ff50ffffff50505050ff505050ffff50505050505050 % 505050505050502020505050505050509b2962a9 % 2962a9205050505050505050502050505050505050505050ff505050ff5050505050505050505050 % 5050505050505050505050ff50ff50505050505050ff505050505050505050505050505050505050 % 505050505050502020505050505050509b2962a9 % 2962a92050505050505050505020ffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ff50ffff50ffffffffffffffff5050ffffffffff505050ffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ffffffff50ffffffffffffffffff50ffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ffffffff50ff50ffff5050ff50ff50ffffffffffffff50ff50ff % 50ff50ff50ff50ff50ffff50ff50ff50ff50ffffffffffff5050ff50ffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ffffffff50ffffffffff50ff50ff50ffffffffffffffffff5050 % 50ffffffff50ffffffffff505050ff50ffffffffffffffffff505050ffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ffffffff50ffff5050ff50ff50ff50ffffffffffffffffffffff % ffffffffffff50ffffffff50ffffff50ffffffffffff5050ff50ffffffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ffffffff50ffffffffff5050ffff50ffffffffffffffffff5050 % ffffffffff50ffffff50ffff5050ffff5050ff50ffffffffffff5050ffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a92050505050505050505020ffffffffffffffffffff50ffffff50ffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffff2020505050505050509b2962a9 % 2962a920505050505050505050202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020202020505050505050509b2962a9 % 2962a9205050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b20505050505050509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 2962a92050505050505050505050505050505050505050ff50505050505050505050505050505050 % 50ff50505050505050505050505050505050ff509b5050505050ff505050ff505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a9205050505050505050505050505050505050ff50ff50ffff5050ffff50ffff505050ffff50 % 50ff5050ff50505050505050505050ff5050ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a92050505050505050505050505050505050505050ff5050505050505050ff50505050505050 % 50ff505050ff50505050ff50ff505050ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050ffff50505050ff505050ff50505050505050 % 50ff505050ff50505050ff50ff505050ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a92050505050505050505050505050505050505050ff50ffff50ff50ff50ff50505050ffff50 % 50ff50ff50ff50505050505050505050ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050505050ff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050ff50505050505050ffff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b20202020202020202020202020202020202020 % 202020202020202020205050505050509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 2929622050505050505050505050505050505050505050505050ffffffff50505050505050505050 % 505050ff505050505050ffff50505050ffffff509b50505050ff5050ffff5050ffff505050505050 % 505050505050505050205050505050509b296262 % 2929622050505050505050505050505050505050505050505050ff50505050505050505050505050 % 50505050505050505050ff50505050505050ff509b50505050ff50505050ff505050505050505050 % 505050505050505050205050505050509b296262 % 2929622050505050505050505050505050505050505050505050ff505050ff50ff50ff505050ff50 % ff5050ff50ff50ff5050ff50505050505050ff509b50505050ff50505050ff505050505050505050 % 505050505050505050205050505050509b296262 % 2929622050505050505050505050505050505050505050505050ff50505050ffff50ff505050ff50 % 505050ff505050ff5050ff50ff50ff505050ff509b50505050ff50505050ff505050505050505050 % 505050505050505050205050505050509b296262 % 2929622050505050505050505050505050505050505050505050ff505050ff505050ff505050ff50 % 505050ff505050ff5050ff50505050505050ff509b50505050ff50505050ff505050505050505050 % 505050505050505050205050505050509b296262 % 2929622050505050505050505050505050505050505050505050ff50505050ff50ffff50505050ff % ff5050ff5050ff505050ff5050ff50505050ff509b50505050ff5050ffff5050ffff505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050ff50505050505050ff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b20202020202020202020202020202020202020 % 202020202020202020205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050ffffff5050ff % 5050ff505050ff5050ff50505050505050ffff509b5050505050ff50ffff50505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050ff5050505050505050ff509b50505050ffff505050ff505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50ff50ff50ff505050ffff5050ff50505050ff509b505050ff50ff505050ff505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50ff50ff50ff505050ff50505050ff50ff50ff509b5050505050ff505050ff505050505050505050 % 505050505050505050205050505050509b2962a9 % 2929622050505050505050505050505050505050505050505050505050505050505050505050ff50 % ff505050ff50505050ff50ffff5050505050ff509b5050505050ff505050ff505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050ff5050505050505050ff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050ff50505050505050ffff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b20202020202020202020202020202020202020 % 202020202020202020205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b5050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 2962a920505050505050ffffff505050505050505050505050505050ff5050505050505050505050 % 5050505050ff5050505050ff50505050ffffff509b505050ffff5050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050ff5050505050505050505050 % 505050ff50ff50505050505050505050ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a9205050505050505050505050ff50ff50ff50ff50ff50505050ff505050ff50ff50ff5050ff % 50ff50ff50ff50ff50505050ff5050ffff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a92050505050505050505050505050ff505050ffffff50505050ff505050ffffff50505050ff % 505050ff50ff50505050505050505050ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a92050505050505050505050505050ff5050505050ff50505050ff50505050505050505050ff % 505050ff50ff50505050505050ffff50ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a92050505050505050505050ffff5050ffff50ffffff50505050ffffff50ffff505050505050 % ff505050ffff50505050505050505050ff50ff509b505050ffff5050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a9205050505050505050505050505050505050505050505050505050505050505050505050ff % 50ff50505050505050505050505050505050ff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b20202020202020202020202020202020202020 % 202020202020202020205050505050509b2962a9 % 29296250505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b205050505050509b296262 % 29296250505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050ff505050505050505050505050505050ff5050ff50505050505050 % 505050505050505050ff50505050505050ffff509b505050ffff5050505050505050505050505050 % 505050505050505050205050505050509b296262 % 2929625050505050505050505050505050505050505050505050505050505050ff50505050505050 % 505050505050505050ff5050505050505050ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050ffff50ff50ff50ff50ff50ff5050ff50505050ff50ff50ff5050ff % 50ff50ff50ff505050ffff5050ffff50ff50ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050ffff505050ffffff5050ff505050ff50505050ff505050ff50ff50 % 50ffffff5050505050ff50505050ff505050ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050ffff505050ff5050505050ff50505050505050ff505050ff5050ff % 505050505050505050ff50ffff50ff505050ff509b5050505050ff50505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050ffffffffff50505050ffff5050ff5050505050ff5050ff50ffff5050ff50 % 50ffff505050505050ff5050505050ffff50ff509b505050ffff5050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050ff5050505050505050ff509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 29296250505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b296262 % 2962a950505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a950505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b50505050505050505050505050505050505050 % 505050505050505050205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050509b20202020202020202020202020202020202020 % 202020202020202020205050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a9205050505050505050505050505050505050505050505050505050ff50ff50505050505050 % 50505050505050505050ff50505050ff505050505050505050505050ff5050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050ffffff50ffff % 5050ffff5050ffff5050ffff5050ffff50ffff5050ff505050ffff50ff5050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050ff5050ff5050505050 % ff50505050ff50505050ff50505050ff505050ff50505050ff505050ff5050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a920505050505050505050505050505050505050505050505050505050505050ff505050ff50 % ff50505050ff50505050ff50ffff50ff505050ff50505050ff505050ff5050505050505050505050 % 505050505050505050505050505050509b2962a9 % 29296220505050505050505050505050505050505050505050505050505050ff5050ffffff50ffff % ff50ffff5050ffff5050ff50505050ff50ffff5050ff505050ffff50ff5050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050ff5050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020209b5050505050505050509b296262 % 29296220505050505050505050209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b5050505050505050509b296262 % 2929622050505050505050505020ffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2929622050505050505050505020ffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2929622050505050505050505020ffffffff50ff50ffffffffffffffff50ffff50ffff505050ff50 % ffffff5050ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2929622050505050505050505020ffffffffffffffff50ff50ffffffffffffffffffff50ffffff50 % ffffffffff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2929622050505050505050505020ffffffffffffffff50ff50ffffffffff5050ffffff50ffffff50 % ffffff50ff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2929622050505050505050505020ffffffffffffffffffffffffffffffffffffffffff50ffffff50 % ff50ff50ff50ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2929622050505050505050505020ffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffff9b5050505050505050509b296262 % 2962a920505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a9205050505050505050502050ff50505050505050505050ff505050ffffff50505050505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a92050505050505050505020505050505050505050505050ff50505050505050505050505050 % 505050505050505050ff505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a92050505050505050505020505050ff50ff5050ff50ff50ff5050505050ff50ff5050ffff50 % ff50ff50ff50ff50ffff505050505050ff50ff505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a920505050505050505050205050505050505050ff505050ff50505050505050ff5050505050 % ff50ffffff50505050ff5050ff50ff50ffffff505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a920505050505050505050205050505050505050ff505050ff50505050505050ff5050505050 % ff50505050505050ffff505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a920505050505050505050205050505050505050ffffff50ff50505050505050ff5050ffff50 % ff50ffff5050ffff5050505050ff5050ffff50505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a920505050505050505050205050505050505050ff505050ff50505050505050505050505050 % ff505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a920505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a9205050505050505050502050ff505050505050505050ff5050505050ff5050505050505050 % 5050ff50505050505050505050505050505050ff5050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a920505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050ff5050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 2962a92050505050505050505020505050ff50ff5050ff50ff50505050ff50505050ff50ff50ff50 % ff505050ff50ff50ff50ff50ff5050ff50ff50ff5050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b2962a9 % 29296220505050505050505050205050505050505050ff505050505050ff50505050ff5050505050 % ff5050505050ff5050505050505050ff505050ff5050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b296262 % a9a96220505050505050505050205050505050505050ff50ff5050505050ff50ff50ff50ff505050 % ff505050ff50ff5050505050505050ff50ff50ff5050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b296262 % 29296220505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b292929 % 292962205050505050505050502050ff505050505050505050ff5050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b296262 % 29296220505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b296262 % 29296220505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b296262 % 29296220505050505050505050205050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 5050505050509b5050505050505050509b296262 % 29296220505050505050505050202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 2020202020209b5050505050505050509b296262 % 29296220505050505050505050202020202020202020202020202020202020202020202020202020 % 20202020202020202020202020202020202020202020202020202020202020202020202020202020 % 202020202020205050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 29296220505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b296262 % 2962a920505050505050505050505050505050505050505050505050505050505050505050505050 % 50505050505050505050505050505050505050505050505050505050505050505050505050505050 % 505050505050505050505050505050509b2962a9 % 2962a9209b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b % 9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b2962a9 % 2962a929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292929292929292929292929292929292929292929292929 % 29292929292929292929292929292929292962a9 % 2962626262626262626262626262a962626262626262626262626262626262626262626262626262 % 62626262626262626262626262626262626262626262626262626262626262626262626262626262 % 62626262622962626262626262626262626262a9 % 2962a9a9a9a9a9a9a9a9a9a9a9a9a92962626262626262626262a9a9a9a9a9a9a9a9a9a9a9a96262 % 62626262626262626262a9a9a9a9a9a9a9a9a9a9a9a9626262626262626262626262a9a9a9a9a9a9 % a9a9a9a9a929626262626262626262626262a9a9 % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff % ffffffffffffffffffffffffffffffffffffffff %%EndImage %%EndPreview save countdictstack mark newpath /showpage {} def /setpagedevice {pop} def %%EndProlog %%Page 1 1 /rlestr1 1 string def /readrlestring { /rlestr exch def currentfile rlestr1 readhexstring pop 0 get dup 127 le { currentfile rlestr 0 4 3 roll 1 add getinterval readhexstring pop length } { 256 exch sub dup currentfile rlestr1 readhexstring pop 0 get exch 0 exch 1 exch 1 sub { rlestr exch 2 index put } for pop } ifelse } bind def /readstring { dup length 0 { 3 copy exch 1 index sub getinterval readrlestring add 2 copy le { exit } if } loop pop pop } bind def /picstr 210 string def gsave 255.6 237.24 translate 100.8 287.52 scale 210 599 8 [ 210 0 0 -599 0 599 ] { picstr readstring } image 8000ae000000e3d6019d5680d6f0d6019d56e2d6019d007f00d6d69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69d51d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d5656d6d6d69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d56000300d69dd6 e59d0256d6d6809df19d0256d6d6e59d02569d000200d6d6e49d0156d680 9df09d0156d6e39d0156007f00d69dd69d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d56519d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569dd69d569d007f00d6d69d9d9d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d51569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569dd69d9d9d56000600d69dd69d569d8000bc0006d69d d69d569d000700d6d69d9d9d560080d6bed60700d6d69d9d9d56007f00d6 9dd69d569d00d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 d6d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd6519dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d9dd6d69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd600d69dd69d569d0008 00d6d69d9d9d5600d6ea9d0156d6899d0256d6d6ea9d0156d6ea9d085600 d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d68b9d025656d6 e99d0556d6d69d9d9df200fc9d085600d69dd69d569d000800d6d69d9d9d 5600d6eb9d025656d6ee9dfc009f9d0256d6d6eb9d025656d6fc9d0000f4 9d0d009d9d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d02 56d6d6f19dfd00039d9d0000a19d025656d6e99d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656 d6f19d010000fc9d010000a09d0256d6d6eb9d025656d6fc9d0000f49d0d 00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6 d6f39d010000f69dfc00fd9d0800009d00009d000000fc9dfc00fd9d0600 009d00009d9dfc00fc9dfc00d29d025656d6e99d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000800d6d69d9d9d5600d6eb9d025656 d6f29d010000f79d1b00009d9d00009d9d0000009d0000009d00009d9d00 009d9d00009d9dfb000e9d00009d9d00009d9d00009d9d0000d29d0256d6 d6eb9d025656d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000b00 d69dd69d569d00d6d69d9df000fd9d0256d6d6f49d010000f29d1900009d 9d00009d9d00009d9d00009d00009d9d9d00009d9d0000f89d0500009d9d 0000cf9d025656d6f89dfc00f59d0656d6d69d9d9d00f49d0d00009d9d9d 5600d69dd69d569d000c00d6d69d9d9d5600d69d9d9d00f29d05009d9d56 56d6f39d010000f69dfb000d9d9d00009d9d00009d9d00009d9dfa00039d 9d0000fb9dfb00fc9dfd00d09d0256d6d6f99d04009d9d0000f79d025656 d6fc9d0000f49d0d00009d9d565600d6d69d9d9d56000c00d69dd69d569d 00d6d69d9d00f29d0600009d9d56d6d6f49d010000f79d1400009d9d0000 9d9d00009d9d00009d9d00009d0000f99d010000fc9d0500009d9d0000fa 9d010000d29d025656d6f89d04009d9d0000f69d0656d6d69d9d9d00f49d 0d00009d9d9d5600d69dd69d569d000b00d6d69d9d9d5600d69d9d9def00 039d5656d6f39d010000fb9d1800009d00009d9d9d00009d9d00009d9d00 009d9d00009d0000f99d1300009d9d9d00009d9d9d00009d00009d9d9d00 00d19d0256d6d6f99dfb00f79d025656d6fc9d0000f49d0d00009d9d5656 00d6d69d9d9d56000900d69dd69d569d00d6d6fc9df100049d9d56d6d6f3 9d2600009d9d0000009d9d00009d9d00009d9d00009d9d00009d9d00009d 9d00009d9d00009d9d0000fc9d0d00009d9d00009d9d00009d9d0000d19d 025656d6f79dfc00f69d0656d6d69d9d9d00f49d0d00009d9d9d5600d69d d69d569d000800d6d69d9d9d5600d6eb9d025656d6f19dfc00fb9dfd0010 9d00009d00009d9d00009d9d00009d9d9dfc00fd9d010000fb9dfd00049d 00009d9dfc00cf9d0256d6d6eb9d025656d6fc9d0000f49d0d00009d9d56 5600d6d69d9d9d56000900d69dd69d569d00d6d6eb9d0256d6d68b9d0256 56d6e99d0656d6d69d9d9d00f49d0d00009d9d9d5600d69dd69d569d0008 00d6d69d9d9d5600d6eb9d025656d6899d0256d6d6eb9d025656d6fc9d00 00f49d0d00009d9d565600d6d69d9d9d56000900d69dd69d569d00d6d6eb 9d0256d6d68b9d025656d6e99d0656d6d69d9d9d00f49d0d00009d9d9d56 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6899d0256d6d6 eb9d025656d6fc9df1000b9d9d565600d6d69d9d9d56000900d69dd69d56 9d00d6d6eb9d0256d6d68b9d025656d6e99d0256d6d6fb9df300fd9d0856 00d69dd69d569d000800d6d69d9d9d5600d6eb9d025656d6899d0256d6d6 eb9d025656d6eb9d09565600d6d69d9d9d56007f00d69dd69d569d00d69d 9d569d569d569d569d569d569d569d569d569d569d56d6569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d56519d 569d569d569d569d569d569d569d569d569d569d569d5656d69d569d569d 569d569d569d569d569d569d569d569d569d56d6569d569d569d569d569d 569d569d569d569d569d569d5600d69dd69d569d0008009d569d9d9d5600 9de956009d8856009de856009de9560700d6d69d569d56000000fb56009d 8000bc0001d69dfc56ff000000fcd6029d565680dfbedf0000fad6ff0007 00d6d6d69d569d5680dfbfdf036400d69dfcd6ff000900d6d69d9d9d5656 dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af c2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69d d69d569d000900d6d69d9d9d5656dfdf80aff4afd2dffcaf09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80aff4afd3df0064fcaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdf80aff4af01dfdfd6af016464 fcaf09646400d6d69d9d9d56000900d69dd69d569d56dfdf80aff4af01df dfd6af016464fcaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80aff4af01dfdfd6af016464fcaf09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80aff4af01dfdfd6af016464fcaf09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80aff4af01dfdfd6af016464fcaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80aff4af01dfdfd6af016464 fcaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80aff4af01df dffbaffb00e0af016464fcaf09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80aff4af01dfdffbaf0000fcaf010000e2af016464fcaf096464 00d69dd69d569d000900d6d69d9d9d5656dfdfbbaffd00bcaf01dfdffbaf 0000fbaf0000e2af016464fcaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdfbdaf060000afafaf0000beaf01dfdffbaf0000faaf0300afaf affc00fdaf0400af000000fcaffc00faaf016464fcaf09646400d69dd69d 569d000900d6d69d9d9d5656dfdfbdaf0000fbaf0000beaf01dfdffbaf00 00faaf1800afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000fb af016464fcaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfbeaf 0000f6affc00fdaf0700af0000afaf0000fcaffc00fdaf0500af0000afaf fc00e5af01dfdffbaf0000faaf0300afaf00fcaf0300afaf00fcaf0300af af00fcaf0000fbaf016464fcaf09646400d69dd69d569d000900d6d69d9d 9d5656dfdfbeaf0000f7af250000afaf0000afaf0000afaf0000afaf00af af0000afaf0000afaf0000afafaf0000afaf0000e6af01dfdffbaf0000fa af0300afaf00fcaf0300afaf00fcaf0200afaffa00fbaf016464fcaf0964 6400d6d69d9d9d56000900d69dd69d569d56dfdfbeaf0000f2af0e00afaf 00afafaf00afafaf00afaf00fcaf0300afaf00f7af0000e6af01dfdffbaf 0000faaf0300afaf00fcaf0300afaf00fcaf0300afaf00f6af016464fcaf 09646400d69dd69d569d000900d6d69d9d9d5656dfdfbeaf0000f6affb00 0cafaf00afafaf00afafaf00afaffa0002afaf00fbaffb00e6af01dfdffb af0000fbaf0400afafaf00fcaf0300afaf00fcaf0300afaf00f6af016464 fcaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfbeaf0000f7af 130000afafaf00afaf00afafaf00afafaf00afaf00f9af0000fcaf050000 afafaf00e6af01dfdffbaf0000fcaf0d0000afafaf0000afaf0000afaf00 fcaf0800afaf0000afaf0000fbaf016464fcaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdfbdaf0000fbaf0300afaf00fcaf0e00afaf00af afaf00afafaf00afaf00f9af0000fcaf0000fcaf0000e6af01dfdffbaffb 00faaffc00fdaf0000fcaf0300afafaffc00faaf016464fcaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdfbdaf240000afafaf0000afaf00 00afaf0000afaf00afafaf00afafaf00afaf0000afaf0000afaf00fcaf05 0000afaf0000e6af01dfdfd6af016464fcaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfbbaffd00fbaffd000faf0000af00afafaf00afaf af00afafaffc00fdaf0000fbaffd0002af0000e7af01dfdfd6af016464fc af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80aff4af01dfdf d6af016464fcaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80 aff4af01dfdfd6af016464fcaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80aff4af01dfdfd6af016464fcaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdf80aff4af01dfdfd6af016464fcaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdf80aff4af01dfdfd6af016464fc af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80aff4af01dfdf d464fcaf09646400d6d69d9d9d56000900d69dd69d569d56dfdf80aff4af 00dfd364fcaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af c2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000b00d6 9dd69d569d56dfdfafaf80dfcadffaaf09646400d69dd69d569d000b00d6 d69d9d9d5656dfdfafaf80dfcbdf0064faaf09646400d6d69d9d9d56000d 00d69dd69d569d56dfdfafafdfdf80afceaf016464faaf09646400d69dd6 9d569d000d00d6d69d9d9d5656dfdfafafdfdf80afceaf016464faaf0964 6400d6d69d9d9d56000d00d69dd69d569d56dfdfafafdfdf80afceaf0164 64faaf09646400d69dd69d569d000d00d6d69d9d9d5656dfdfafafdfdf80 afceaf016464faaf09646400d6d69d9d9d56000d00d69dd69d569d56dfdf afafdfdf80afceaf016464faaf09646400d69dd69d569d000d00d6d69d9d 9d5656dfdfafafdfdf80afceaf016464faaf09646400d6d69d9d9d56000d 00d69dd69d569d56dfdfafafdfdfeeaffa00eeaf0000d1af0000f7affd00 f4af0000edaffd00fcaffd00fcaffa0004afaf000000eeaf016464faaf09 646400d69dd69d569d000d00d6d69d9d9d5656dfdfafafdfdfeeaf0000fc af010000efaf0000d1af0000f9af060000afafaf0000f6af0000edaf0000 fcaf090000afafaf0000afaf00fcaf050000afafaf00eeaf016464faaf09 646400d6d69d9d9d56000d00d69dd69d569d56dfdfafafdfdfeeaf0000fb af0000efaf0000d1af0000f9af0000fbaf0000f6af0000edaf0000fcaf00 00fbaf0300afaf00fbaf0400afafaf00eeaf016464faaf09646400d69dd6 9d569d000d00d6d69d9d9d5656dfdfafafdfdfeeaf0000fbaf0300afafaf fc00fcaffc0016afaf00afafaf00afafaf000000af00afaf00af0000afaf fc00fdaf0000fcaf0600af00af000000fcaffd0001af00faaf0000f6affc 00fdaf0300afafaffc00fdaf0300af0000fbaf0400afafaf00f7af0000fb af0400afafaf00eeaf016464faaf09646400d6d69d9d9d56000d00d69dd6 9d569d56dfdfafafdfdfeeaf0000fcaf2f00afafaf0000afaf0000afaf00 00afaf0000af00afaf00afafaf0000afaf0000afaf0000afafaf0000afaf 0000afaf00fcaf0f00af0000afaf0000afaf0000afaf0000faaf0000f7af 140000afaf0000afaf00afaf0000afaf0000afaf0000f9af0400afafaf00 f7af0000fcaf0000fcaf0000eeaf016464faaf09646400d69dd69d569d00 0d00d6d69d9d9d5656dfdfafafdfdfeeaffb00f7af0300afaf00faaf0200 af00fcaf0000fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00 fcaf0300afaf00fcaf0000faaf0000f7af0000fcaf0600afaf00afaf00fc af0300afaf00f8af0400afafaf00f7affb00fbaf0000eeaf016464faaf09 646400d6d69d9d9d56000d00d69dd69d569d56dfdfafafdfdfeeaf0000fc af0000fcaffb0002afaf00faaf010000fbaf0000fcaf0300afaf00fcaf00 00fcaf0300afaf00fcaf0200af00fcaf0300afaf00fcaf0000faaf0000f7 af0000fcaf0600afaf00afaf00fcaf0300afaf00f8af0400afafaf00f7af 0000fcaf0000fcaf0000eeaf016464faaf09646400d69dd69d569d000d00 d6d69d9d9d5656dfdfafafdfdfeeaf0000fbaf0b00afaf0000afafaf00af af00faaf0200af00fcaf0000fcaf0300afaf00fcaf0000fcaf0300afaf00 fcaf0200af00fcaf0300afaf00fcaf0000faaf0000f7af0000fcaf0600af af00afaf00fcaf0300afaf00f8af0400afafaf00f7af0000fbaf0400afaf af00eeaf016464faaf09646400d6d69d9d9d56000d00d69dd69d569d56df dfafafdfdfeeaf0000fbaf0300afaf00fcaf0300afaf00fcaf0900af00af af00afafaf00fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0200af00 fcaf0300afaf00fcaf0000f9af0000fbaf0300afaf00fcaf0600afaf00af af00fcaf0300afaf00f8af0000fcaf0000fbaf0300afaf00fbaf0400afaf af00eeaf016464faaf09646400d69dd69d569d000d00d6d69d9d9d5656df dfafafdfdfeeaf0000fcaf220000afaf0000afaf0000afaf0000afaf0000 af00afafaf00afaf0000afaf0000afaf00fcaf0f0000afaf0000afaf0000 afaf0000af00fcaf0800afaf0000afaf0000f9af1c0000afafaf0000afaf 0000afaf0000afaf00afaf0000afaf0000afaf00f8af0000fcaf090000af afaf0000afaf00fcaf050000afafaf00eeaf016464faaf09646400d6d69d 9d9d56000d00d69dd69d569d56dfdfafafdfdfeeaffa00fcaffd0004af00 00afaffc0002afaf00fcaf0a00afaf000000af00afaf00fbaffc00fcaffd 0003af00af00fcaf0800afafaf000000af00f7affd00fbaffc00fdaf0300 afafaffc00fdaf0000f8af0000faaffd00fcaffa00fcaf0000eeaf016464 faaf09646400d69dd69d569d000d00d6d69d9d9d5656dfdfafafdfdfcaaf 0000b0af0000e9af0000eeaf016464faaf09646400d6d69d9d9d56000d00 d69dd69d569d56dfdfafafdfdfcfaf050000afaf0000b0af0000e9af0000 eeaf016464faaf09646400d69dd69d569d000d00d6d69d9d9d5656dfdfaf afdfdfceaffc00afaffd00edaffd00eeaf016464faaf09646400d6d69d9d 9d56000d00d69dd69d569d56dfdfafafdfdf80afceaf016464faaf096464 00d69dd69d569d000d00d6d69d9d9d5656dfdfafafdfdf80afceaf016464 faaf09646400d6d69d9d9d56000d00d69dd69d569d56dfdfafafdfdf80af ceaf016464faaf09646400d69dd69d569d000d00d6d69d9d9d5656dfdfaf afdfdf80afceaf016464faaf09646400d6d69d9d9d56000d00d69dd69d56 9d56dfdfafafdfdf8064cc64faaf09646400d69dd69d569d000c00d6d69d 9d9d5656dfdfafafdf8064cb64faaf09646400d6d69d9d9d56000900d69d d69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80 afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d 56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900 d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656df df80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2 af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d 56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80 afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09 646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6 d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900 d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d 9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2 af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af096464 00d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69d d69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80 afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d 56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900 d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656df df80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2 af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdffbaff3df80afd4af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdffbaff4df0064f9affd00f2affd00f8affd00fc af0000eeaf0000edaffa00f5af050000afaf0000f2af0000cbaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af 0000eeaf0000faaf090000afafaf0000afaf00eeaf0000edaf0000fcaf01 0000f7af0400afafaf00f0af0000cbaf09646400d69dd69d569d000900d6 d69d9d9d5656dfdffbaf01dfdff7af016464f9af0000eeaf0000faaf0000 fbaf0000ebaf0000edaf0000fbaf0000f7af0400afafaf00baaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af 0300afaf00fbaf0500afaf000000fcaf0000faaf0000f8af0700afaf00af 000000fcaffd0007af00afaf00afafaffc00f4af0000fbaf0300afaf00fc affc0006af000000afafaffc00fdaf0c00af0000af00afaf00af000000fc affd0001af00dbaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf fbaf01dfdff7af016464f9af0300afaf00fbaf0a00af00afafaf00afafaf 00f9af010000faaf1b00afaf0000afaf0000afaf0000afaf0000afaf00af af0000afaf0000f5af0000fcaf0400afafaf00fcaf2700af00afafaf00af afaf0000afaf0000afaf0000afafaf00afaf0000afaf0000afaf0000afaf 0000dbaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01df dff7af016464f9af0c00afafaf00afafaf00afaf0000faaf0000f7af0100 00fcaf0300afaf00fcaf0300afaf00fcaf0600afaf00afaf00fcaf0000f5 affb00fcaf0000fcaf0a00af00afafaf00afafaf00fcaf0300afaf00fcaf 0300afaf00fcaf0300afaf00fcaf0000dbaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af0e00afafaf00afaf af00afafaf000000fcaf0000f5af070000afaf00afaf00fcaf0300afaf00 fcaf0500afaf00afaffa0001afaff90002afaf00fcaf0400afafaf00fcaf 0900af00afafaf00afafaffa0002afaf00fcaf0300afaf00fcaf0300afaf 00fcaf0000dbaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffb af01dfdff7af016464f9af0800afafaf00afafaf00fbaf050000afafaf00 f4af0600afaf00afaf00fcaf0300afaf00fcaf0600afaf00afaf00f0af00 00fbaf0300afaf00fcaf0a00af00afafaf00afafaf00f9af0000fcaf0300 afaf00fcaf0300afaf00fcaf0000dbaf09646400d69dd69d569d000900d6 d69d9d9d5656dfdffbaf01dfdff7af016464f9af0000fcaf0200af00f9af 0400afafaf00faaf0000fbaf0600afaf00afaf00fcaf0300afaf00fcaf06 00afaf00afaf00f0af0000fbaf0300afaf00fcaf0a00af00afafaf00afaf af00f9af0000fcaf0300afaf00fcaf0300afaf00fcaf0000dbaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af 0000fcaf0e00af00afafaf00afafaf00afafaf00faaf0c0000afafaf0000 afaf00afaf00fcaf1300afaf0000afaf0000afaf00afaf0000afaf0000f5 af0000fcaf1b0000afaf0000afaf0000af00afafaf00afafaf0000afaf00 00afaf00fcaf0300afaf00fcaf0800afaf0000afaf0000dbaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdff564f9af0000fbaf 0000fbaffd00fcaf0000f8affd00fcaf0300afaf00fcaf0e00afafaf0000 00af00afaf00afafaffc00f4affa00fcaffd0007af00af00afafaf00fcaf fc00fdaf0000fcaf0300afaf00fcaf0800afafaf000000af00dbaf096464 00d6d69d9d9d56000900d69dd69d569d56dfdffbaf00dff464f9af0000ee af0000e1af0000b5af0000dbaf09646400d69dd69d569d000900d6d69d9d 9d5656dfdfe7af0000eeaf0000e6af050000afaf0000baaf050000afaf00 00dbaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfe7affd00f2 affd00e5affc00b8affc00daaf09646400d69dd69d569d000900d6d69d9d 9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56df df80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2 af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af096464 00d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69d d69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdffbaff3df80afd4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdffbaff4df0064f9affd00f1affd00f8affd00f3af010000d6affd00 fcaf0000ecaf0300afaf00d4af09646400d69dd69d569d000900d6d69d9d 9d5656dfdffbaf01dfdff7af016464f9af0000edaf0000faaf060000afaf af0000f6af0400afafaf00daaf090000afafaf0000afaf00ecaf0300afaf 00d4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdf f7af016464f9af0000edaf0000faaf0000fbaf0000f6af0400afafaf00da af0000fbaf0300afaf00ecaf0000d1af09646400d69dd69d569d000900d6 d69d9d9d5656dfdffbaf01dfdff7af016464f9af0300afaf00fbaf0000f6 af0000faaf0000f7affc0015afaf000000af000000af00afafaf00afafaf 00afafaffc00fdaf0500af0000afaffc00f9af0000f8af0400af000000fc affc00fcaffd000baf00afaf00afaf00af000000fcaffd0001af00e4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af0164 64f9af0300afaf00fbaf0000f6af0000f9af010000faaf2c0000afaf0000 afaf00afafaf00afaf00afafaf00afafaf00afaf0000afaf0000afaf0000 afafaf0000afaf0000f9af010000faaf280000afaf0000afaf0000afaf00 00afaf0000afaf0000afaf00afaf0000afaf0000afaf0000afaf0000e4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdff7af01 6464f9af1400afafaf00afafaf00afafaf0000afaf00afafaf00f7af0100 00fcaf0000fcaf1200afaf00afafaf00afaf00afafaf00afafaf00f9af03 00afaf00fcaf0000fcaf0000f7af010000fcaf0000fcaf0000f9af0300af af00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af14 00afafaf00afafaf00afaf00af0000af00afafaf00f5af040000afaf00fc af1100afaf00afafaf00afafaf00afaf00afaf00fcaffb0002afaf00fcaf fa00f5af040000afaf00fcaf0300afafaffb0002afaf00fcaf0600afaf00 afaf00fcaf0300afaf00fcaf0000e4af09646400d69dd69d569d000900d6 d69d9d9d5656dfdffbaf01dfdff7af016464f9af0f00afafaf00afafaf00 afaf00afaf0000fcaf0000f4af0300afaf00fcaf1d00afaf00afafaf00af afaf00afaf00afaf00afafaf0000afafaf00afaf00fcaf0000efaf0300af af00fcaf0b00afaf0000afafaf00afaf00fcaf0600afaf00afaf00fcaf03 00afaf00fcaf0000e4af09646400d6d69d9d9d56000900d69dd69d569d56 dfdffbaf01dfdff7af016464f9af0000fcaf0200af00f4af0000faaf0000 fbaf0300afaf00fcaf1500afaf00afafaf00afafaf00af00af00af00afaf af00fcaf0300afaf00fcaf0000f5af0000fbaf0300afaf00fcaf0300afaf 00fcaf0300afaf00fcaf0600afaf00afaf00fcaf0300afaf00fcaf0000e4 af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdff7af 016464f9af0000fcaf0200af00f4af0000faaf150000afafaf0000afaf00 00afaf0000afaf00afafaf00fcaf0400afafaf00fcaf080000afaf0000af af00fcaf050000afaf0000faaf090000afafaf0000afaf00fcaf1600afaf 0000afaf0000afaf0000afaf0000afaf00afaf00fcaf0800afaf0000afaf 0000e4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01df dff564f9af0000fbaf0000f3af0000f8affd00fbaffc00fdaf0000fcaf08 0000afaf00afafaf00fbaffd0004af0000af00fbaffc00f7affd00fcaf00 00fcaf1600afafaf000000af0000afaf000000af00afaf00afaf00fcaf08 00afafaf000000af00e4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdffbaf00dff464f9af0000edaf00008daf0000e4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfe7af0000edaf000092af050000afaf 0000e4af09646400d69dd69d569d000900d6d69d9d9d5656dfdfe7affd00 f1affd0091affc00e3af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80af c2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d 5656dfdffbaff36480afd4af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdffbaff46400dff9affd00f8affb00fcaffd00fbaff700e4affd00 efaffb00fbaf0000faaf0000ecaf0000d7af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdffbaf016464f7e201dfdff9af0000f6af0000fcaf 010000fcaf0000f7af0000e2af060000afafaf0000f1af0000fcaf0c0000 afafaf00afaf00afafaf00ecaf0000d7af09646400d6d69d9d9d56000900 d69dd69d569d56dfdffbaf016464f7e201dfdff9af0000f6af0000fbaf00 00fcaf0000f7af0000e2af0000fbaf0000f1af0000fbaf0000faaf0400af afaf00c2af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01 6464f7e201dfdff9af0300afaf00fbaf0200af00faaf0400afafaf00f7af 0000fbaf0000fcaf0b00af00af0000af00af000000f9af0000f9af0700af af00af000000f9af0000faaf0e00afaf00af000000afaf00af000000fcaf fc00fdaf0c00af0000af00afaf00af000000fcaffd0001af00e7af096464 00d6d69d9d9d56000900d69dd69d569d56dfdffbaf016464f7e201dfdff9 af0300afaf00fbaf0200af00faaf0400afafaf00f7af0000fbaf0000fcaf 0c00af0000afafaf0000afaf0000faaf0000f9af0800afaf0000afaf0000 faaf0000faaf2f00afaf00afaf00afafaf0000afaf0000afaf0000afaf00 00afaf0000afafaf00afaf0000afaf0000afaf0000afaf0000e7af096464 00d69dd69d569d000900d6d69d9d9d5656dfdffbaf016464f7e201dfdff9 af0b00afafaf00afafaf00afaf00faaf0400afafaf00f7af0000fbaf0000 fcaf0200af00fcaf0000fcaf0000faaf0000f9af0300afaf00fcaf0000fa af0000faaf0a00afaf00afaf00afafaf00fcaf0300afaf00fcaf0300afaf 00fcaf0300afaf00fcaf0300afaf00fcaf0000e7af09646400d6d69d9d9d 56000900d69dd69d569d56dfdffbaf016464f7e201dfdff9af0b00afafaf 00afafaf00afaf00faaf0400afafaf00f7af0000fbaf0000fcaf0200af00 fcaf0000fcaf0000faaf0000f9af0300afaf00fcaf0000faaf0000faaf0a 00afaf00afaf00afafaf00fcaf0200afaffa0002afaf00fcaf0300afaf00 fcaf0300afaf00fcaf0000e7af09646400d69dd69d569d000900d6d69d9d 9d5656dfdffbaf016464f7e201dfdff9af0b00afafaf00afafaf00afaf00 faaf0400afafaf00f7af0000fbaf0000fcaf0200af00fcaf0000fcaf0000 faaf0000f9af0300afaf00fcaf0000faaf0000faaf0a00afaf00afaf00af afaf00fcaf0300afaf00f9af0000fcaf0300afaf00fcaf0300afaf00fcaf 0000e7af09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf0164 64f7e201dfdff9af0000fcaf0600af00afafaf00fbaf0000fcaf0000f7af 0000fbaf0000fcaf0200af00fcaf0000fcaf0000f9af0000fbaf0400afaf af00fcaf0000faaf0000fbaf0b00afafaf00afaf00afafaf00fcaf0300af af00f9af0000fcaf0300afaf00fcaf0300afaf00fcaf0000e7af09646400 d69dd69d569d000900d6d69d9d9d5656dfdffbaf016464f7e201dfdff9af 0000fcaf0600af00afafaf00fcaf010000fcaf0000f7af0000fbaf070000 afaf0000af00fcaf0000fcaf0000f9af0a0000afafaf0000afafaf00fcaf 0000faaf0000fcaf0c0000afafaf00afaf00afafaf00fcaf0b00afaf0000 afaf0000afaf00fcaf0300afaf00fcaf0800afaf0000afaf0000e7af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdffbaf016464f5dff9af00 00fbaf0000fcaffb00faaf0000f7af0000faaffd0003af00af00fcaf0000 fcaf0000f7affd00fbaf0000fcaf0000faaffb00fbaf0700afafaf0000af 00fcaf0300afafaffc00fdaf0000fcaf0300afaf00fcaf0800afafaf0000 00af00e7af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf00 64f4dff9af0000ebaf00008caf0000e7af09646400d6d69d9d9d56000900 d69dd69d569d56dfdfe7af0000ebaf000091af050000afaf0000e7af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdfe7affd00efaffd0090af fc00e6af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d 9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf f3df80afd4af09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf f4df0064f9affd00f3af0400af000000faaffb00ddaffd00f7af0000e5af fd00c9af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01df dff7af016464f9af0000f1af0400afafaf00faaf0000fcaf010000e1af0e 0000afafaf0000afafaf00afafaf00e7af060000afafaf0000cbaf096464 00d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9 af0000f1af0400afafaf00faaf0000fbaf0000e1af0000fbaf0800afafaf 00afafaf00e7af0000fbaf0000cbaf09646400d69dd69d569d000900d6d6 9d9d9d5656dfdffbaf01dfdff7af016464f9af0300afaf00fbaf0b00afaf 000000af00afafaf00faaf0000faaf0800afaf00af0000afaffc000aafaf 00afafaf00afafaf00faaf0000f9af0b00af000000afaf00af000000fcaf fc00fdaf0300af0000fbaf0000f6affc00fdaf0700af0000afaf0000fcaf fc00fdaf0500af0000afaffc00fcaffd00f9af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdffbaf01dfdff7af016464f9af0300afaf00fbaf 0b00af0000afaf0000afafaf00faaf0000faaf1700afaf0000afafaf0000 afaf0000af00afafaf00afafaf00faaf0000f9af1800afaf00afafaf0000 afaf0000afaf0000afaf0000afaf0000f9af0000f7af2c0000afaf0000af af0000afaf0000afaf00afaf0000afaf0000afaf0000afafaf0000afaf00 00afaf00afafaf00faaf09646400d69dd69d569d000900d6d69d9d9d5656 dfdffbaf01dfdff7af016464f9af0b00afafaf00afafaf00afaf00fcaf04 00afafaf00faaf0000faaf0300afaf00f7af0a00af00afafaf00afafaf00 faaf0000f9af0700afaf00afafaf00fcaf0300afaf00fcaf0300afaf00f8 af0000f2af0e00afaf00afafaf00afafaf00afaf00fcaf0300afaf00f7af 0400afaf0000f7af09646400d6d69d9d9d56000900d69dd69d569d56dfdf fbaf01dfdff7af016464f9af0b00afafaf00afafaf00afaf00fcaf0400af afaf00faaf0000faaf0300afaf00fbaffb0008afaf00afaf00afaf00f9af 0000f9af0700afaf00afafaf00fcaf0200afaffa0002afaf00f8af0000f6 affb000cafaf00afafaf00afafaf00afaffa0002afaf00fbaffb00fdaffd 00f9af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdf f7af016464f9af0b00afafaf00afafaf00afaf00fcaf0400afafaf00faaf 0000faaf0300afaf00fcaf0e0000afafaf00afaf00afaf00afaf00f9af00 00f9af0700afaf00afafaf00fcaf0300afaf00f9af0000f8af0000f7af13 0000afafaf00afaf00afafaf00afafaf00afaf00f9af0000fcaf050000af afaf00fbaf010000faaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdffbaf01dfdff7af016464f9af0000fcaf0600af00afafaf00fcaf0400 afafaf00faaf0000fbaf0400afafaf00fcaf0000fcaf0900afaf00af00af 00af00f8af0000fbaf0800afafaf00afafaf00fcaf0300afaf00f9af0000 f7af0000fbaf0300afaf00fcaf0e00afaf00afafaf00afafaf00afaf00f9 af0000fcaf0000fcaf0000faaf0000faaf09646400d69dd69d569d000900 d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af0000fcaf0f00af00af afaf0000afaf0000afafaf00faaf0000fcaf050000afafaf00fcaf0d0000 afaf0000afafaf00afafaf00f7af0e0000afafaf0000afafaf00afafaf00 fcaf0b00afaf0000afaf0000afaf00f7af240000afafaf0000afaf0000af af0000afaf00afafaf00afafaf00afaf0000afaf0000afaf00fcaf0c0000 afaf0000afaf00afafaf00faaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdffbaf01dfdff564f9af0000fbaf0000fbaffd0005af00afafaf 00faaffb00fbaf0000fbaffd0009af0000afaf00afafaf00f5affd00faaf 030000af00fcaf0300afafaffc00fdaf0000f5affd00fbaffd000faf0000 af00afafaf00afafaf00afafaffc00fdaf0000fbaffd0007af0000afaf00 0000f9af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf00df f464f9af0000edaf000080aff0af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfe7af0000edaf000080aff0af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfe7affd00f1affd0080aff0af09646400d6d69d9d 9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af c2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69d d69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56 000900d69dd69d569d56dfdffbaff3df80afd4af09646400d69dd69d569d 000900d6d69d9d9d5656dfdffbaff4df0064f9affd00f7af0400af000000 f6affb00e0af0000faaf0000f6af0000f4affd00f4af0000caaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af 0000f5af0400afafaf00f6af0000fcaf010000e2af0000faaf0000f6af03 00afaf00f9af060000afafaf0000f6af0000caaf09646400d69dd69d569d 000900d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af0000f1af0000 f6af0000fbaf0000e2af0000faaf0000f3af0000f9af0000fbaf0000f6af 0000caaf09646400d6d69d9d9d56000900d69dd69d569d56dfdffbaf01df dff7af016464f9af0000fcaffc00fdaf0400afafaf00f6af0000faaf0800 afaf00af0000afaffc000aafaf00afafaf00afafaf00faaf0000faaf0f00 afaf00af000000afafaf00af000000faaf0000f8af0c00af000000afafaf 00af000000fcaffc00fdaf0500af0000afaffc00e3af09646400d69dd69d 569d000900d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af1000afaf af0000afaf0000afaf00afafaf00f6af0000faaf1700afaf0000afafaf00 00afaf0000af00afafaf00afafaf00faaf0000faaf0e00afaf0000afaf00 00afaf00afaf00f8af010000faaf220000afaf0000afaf0000afaf0000af af0000afaf0000afaf0000afafaf0000afaf0000e4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdffbaf01dfdff7af016464f9af0000f8af 0700afaf00afafaf00f6af0000faaf0300afaf00f7af0a00af00afafaf00 afafaf00faaf0000faaf0300afaf00fcaf0600afaf00afaf00f6af010000 fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00fcaf0000fc af0000e4af09646400d69dd69d569d000900d6d69d9d9d5656dfdffbaf01 dfdff7af016464f9af0000fcaffb0006afaf00afafaf00f6af0000faaf03 00afaf00fbaffb0008afaf00afaf00afaf00f9af0000faaf0300afaf00fc af0600afaf00afaf00f4af040000afaf00fcaf0300afaf00fcaf0200afaf fa0002afaf00fcaffa00e4af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdffbaf01dfdff7af016464f9af1000afafaf0000afafaf00afaf00 afafaf00f6af0000faaf0300afaf00fcaf0e0000afafaf00afaf00afaf00 afaf00f9af0000faaf0300afaf00fcaf0600afaf00afaf00f3af0300afaf 00fcaf0300afaf00fcaf0300afaf00f9af0000fcaf0000dfaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdffbaf01dfdff7af016464f9af04 00afafaf00fcaf0700afaf00afafaf00f6af0000fbaf0400afafaf00fcaf 0000fcaf0900afaf00af00af00af00f9af0000faaf0300afaf00fcaf0600 afaf00afaf00f9af0000fbaf0300afaf00fcaf0300afaf00fcaf0300afaf 00f9af0000fcaf0000dfaf09646400d6d69d9d9d56000900d69dd69d569d 56dfdffbaf01dfdff7af016464f9af1000afafaf0000afaf0000afaf00af afaf00f6af0000fcaf050000afafaf00fcaf0d0000afaf0000afafaf00af afaf00f7af0000fcaf0400afafaf00fcaf0600afaf00afaf00f9af110000 afafaf0000afaf0000afaf0000afaf00fcaf0b00afaf0000afaf0000afaf 00fcaf050000afaf0000e4af09646400d69dd69d569d000900d6d69d9d9d 5656dfdffbaf01dfdff564f9af0000fcaffd0008af0000af00afafaf00f6 affb00fbaf0000fbaffd0009af0000afaf00afafaf00f6affc00fcaf0000 fcaf0800afaf00afafaf0000f9affd00fcaf0800af000000afafaf00fcaf 0300afafaffc00fdaf0000fbaffc00e3af09646400d6d69d9d9d56000900 d69dd69d569d56dfdffbaf00dff464f9af0000f1af0000abaf0000c2af09 646400d69dd69d569d000900d6d69d9d9d5656dfdfe7af0000f1af0000ab af0000c2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfe7affd 00f5affd00abaf0000c2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80 afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09 646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d 56000900d69dd69d569d56dfdfc1affa00f0af0000ebaf0000aeaf096464 00d69dd69d569d000900d6d69d9d9d5656dfdfc1af0000fcaf010000f1af 0000efaf0400afafaf00aeaf09646400d6d69d9d9d56000900d69dd69d56 9d56dfdfc1af0000fbaf0000dfaf0000aaaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfc1af0000fbaf0800afaf00af0000afaffc00fdaf 0300afafaffc00fcaffc0009af000000afaf00afafaffc00fdaf0400af00 0000bdaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfc1af0000 fcaf370000afaf0000afafaf0000afaf0000afaf00afaf0000afaf0000af af0000afaf0000af00afafaf00afaf0000afaf0000afaf0000afaf0000be af09646400d69dd69d569d000900d6d69d9d9d5656dfdfc1affa00fdaf00 00fcaf0000fcaf0600afaf00afaf00fcaf0300afaf00faaf0700afafaf00 afaf00fcaf0300afaf00fcaf0000beaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfc1af0000f8af0000fcaf0000fcaf0500afaf00afaffa 0002afaf00faaf0700afafaf00afaf00fcaf0300afaf00fcaf0000beaf09 646400d69dd69d569d000900d6d69d9d9d5656dfdfc1af0000f8af0000fc af0000fcaf0600afaf00afaf00f9af0000faaf0700afafaf00afaf00fcaf 0300afaf00fcaf0000beaf09646400d6d69d9d9d56000900d69dd69d569d 56dfdfc1af0000f8af0000fcaf0000fcaf0600afaf00afaf00f9af0000fc af0900af00afafaf00afaf00fcaf0300afaf00fcaf0000beaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfc1af0000f8af0000fcaf290000 afaf0000afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00af af0000afaf0000afaf00fcaf0000beaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfc1af0000f8af0000fbaffc00fdaf0300afafaffc00fc affc00fdaf060000af00afafaffc00fdaf0000fcaf0000beaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfabaf000098af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfabaf000098af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdfadaf01000097af09646400d6d69d9d9d56 000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf8064e26400df f2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf006480df e4df0164dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfef af0164df8064e46400dff2af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdfefaf0164df8064e66402df64dff2af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdfefaf0364df646480afe9af03dfdf64dff2af09 646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0364df646480af e9af03dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d5656df dfefaf0964df6464af000000afaffc00efaffd00f3affd00f2af0000d4af 0000f9af0000dbaf03dfdf64dff2af09646400d6d69d9d9d56000900d69d d69d569d56dfdfefaf0964df6464af00afafaf00fcaf0000eeaf0000f5af 060000afafaf0000f8af0400afafaf00d4af0000f9af0000dbaf03dfdf64 dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0964df 6464af00afafaf00fcaf0000eeaf0000f5af0000fbaf0000f8af0400afaf af00d4af0000d3af03dfdf64dff2af09646400d6d69d9d9d56000900d69d d69d569d56dfdfefaf0964df6464af00afafaf00fcaf0200af00fbaf0600 af00af000000fcaf0000f6af0000f9af0400afaf00affb0006afaf00af00 0000fcaffc00fcaffd0009af00afaf00af0000afaffc00fdaf1300af0000 00afafaf00af000000afafaf00afafaffc00e2af03dfdf64dff2af096464 00d69dd69d569d000900d6d69d9d9d5656dfdfefaf0964df6464af00afaf af00fcaf0200af00fbaf0b00af0000afaf0000afafaf00f6af0000f9af49 00afaf0000afafaf00afafaf0000afaf0000afaf0000afaf0000afaf0000 afaf0000afaf0000afafaf0000afaf0000afaf0000afaf0000afaf0000af af0000afaf00afaf0000afaf0000e3af03dfdf64dff2af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfefaf0964df6464af00afafaf00fcaf 0a00afaf00afafaf00afaf00fcaf0400afafaf00f6af0000f9af0300afaf 00fcaf0400afafaf00fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00 f7af0300afaf00fcaf0300afaf00fcaf0600afaf00afaf00deaf03dfdf64 dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0964df 6464af00afafaf00fcaf0a00afaf00afafaf00afaf00fcaf0400afafaf00 f6af0000f9af0300afaf00fcaf0400afafaf00fcaf0300afaf00fcaf0300 afaf00fcaf0300afaf00fbaffb0002afaf00fcaf0300afaf00fcaf0600af af00afaf00deaf03dfdf64dff2af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfefaf0964df6464af00afafaf00fcaf0a00afaf00afafaf00 afaf00fcaf0400afafaf00f6af0000f9af0300afaf00fcaf0400afafaf00 fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00fcaf080000afafaf00 afaf00fcaf0300afaf00fcaf0600afaf00afaf00deaf03dfdf64dff2af09 646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0964df6464af00 afafaf00fcaf0a00afafaf00af00afafaf00fcaf0400afafaf00f5af0000 fbaf0400afafaf00fcaf0400afafaf00fcaf0300afaf00fcaf0300afaf00 fcaf0300afaf00fcaf0000fcaf0300afaf00fcaf0300afaf00fcaf0600af af00afaf00fcaf0000e3af03dfdf64dff2af09646400d6d69d9d9d560009 00d69dd69d569d56dfdfefaf0964df6464af00afafaf00fcaf1300afafaf 00af00afafaf0000afaf0000afafaf00f5af0a0000afafaf0000afafaf00 fcaf0400afafaf00fcaf1300afaf0000afaf0000afaf0000afaf0000afaf 00fcaf100000afaf0000afaf0000afaf0000afaf00fcaf0b00afaf00afaf 0000afaf0000e3af03dfdf64dff2af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfefaf0564df6464af00fcaffc00fbaf0000fcaf0400af00 0000fcaf0000f3affd00fbaf0000fbaf030000af00fcaf0300afafaffc00 fcaffd0004af00afaf00fbaffd000caf0000af00af000000afafaf00fcaf 0600afaf00afafaffc00e2af03dfdf64dff2af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0564df6464af00eeaf0000f8af0000cdaf 0000f1af0000cbaf03dfdf64dff2af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfefaf0564df6464af00eeaf0000f8af0000d2af050000af af0000f1af0000cbaf03dfdf64dff2af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfefaf0764df6464af000000f0af0000faaffd00d1affc 00f0af0000cbaf03dfdf64dff2af09646400d69dd69d569d000900d6d69d 9d9d5656dfdfefaf0364df64648000e90003dfdf64dff2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdfefaf0364df64648000e90003dfdf 64dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0764 df646400afafaffc0000afee00fdaff600faafce0000afca0003dfdf64df f2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0564df64 6400affc00fdafec0000aff60000affc0001afafd30004af000000afca00 03dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdfef af0564df646400affa0000afec0000aff60000affb0000afd30000afc600 03dfdf64dff2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfef af0564df646400affa0004af000000affb0006af00af00afafaffc0000af f60000affb0003af000000fcaffd0010af00afaf0000afafaf000000af00 afafaffc00fcaffc00fcaf0800afafaf0000af00affb0002af0000fcafd8 0003dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf efaf0564df646400affa0004af000000affb000baf00afaf0000afaf0000 00aff60000affc0035afaf0000afaf0000afaf0000afaf000000af000000 af0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00af000000 af00affb0007af00afaf0000afafd90003dfdf64dff2af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfefaf0564df646400affa0000affc00 07af000000af0000affc0004af000000aff600faaffd0000affc0003af00 00affc0001afaffb0000affc0003af0000affc0003af0000affa000eaf00 0000af0000af000000af0000affc0000afd90003dfdf64dff2af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfefaf0564df646400affa0000 affc0007af000000af0000affc0004af000000aff60000aff800faaf0200 00affb00fdaffd0000affc0002af0000faaf020000affa000daf000000af 0000af000000af0000faafd90003dfdf64dff2af09646400d6d69d9d9d56 000900d69dd69d569d56dfdfefaf0564df646400affa0000affc0007af00 0000af0000affc0004af000000aff60000aff80000aff90000aff90004af af0000affc0003af0000aff90000affa000eaf000000af0000af000000af 0000afd40003dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d 5656dfdfefaf0564df646400affa0000affb0006af00af000000affc0004 af000000aff60000aff80000aff90000aff80003af0000affc0003af0000 aff90000affc0010af00af000000af000000af00af000000afd40003dfdf 64dff2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0564 df646400affa0000affb000faf00af000000afaf0000afaf000000aff600 00aff80008afaf0000afaf0000affc0031af000000af0000afaf0000afaf 0000afaf0000afaf0000afaf0000afaf00af000000af000000af00af0000 00afaf0000afafd90003dfdf64dff2af09646400d69dd69d569d000900d6 d69d9d9d5656dfdfefaf0564df646400affa0000affa0000affc0004af00 afafaffc0000aff60000aff700fcaffd0000affb00fdaffd0004af00afaf affc00fcaffc00fcaffd0003afaf00affc0000affb00fcafd80003dfdf64 dff2af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0564df 646400afee0000aff80000afd90000afaf0003dfdf64dff2af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfefaf0564df646400afee0000af f80000afd90000afaf0003dfdf64dff2af09646400d6d69d9d9d56000900 d69dd69d569d56dfdfefaf0764df646400afafaff00000affa00fdafd900 00afaf0003dfdf64dff2af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfefaf0364df646480dfe7df0164dff2af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0264df6480dfe6df0164dff2af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfefaf8064e26400dff2af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdfefaf80dfe1dff2af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d 5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf 80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af 09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400 d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d 9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80af c2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69d d69d569d000900d6d69d9d9d5656dfdf8cafc264f4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdf8cafc36400dff4af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01 dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf0164 64c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf 8caf016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56 000900d69dd69d569d56dfdfe0af010000fbaf0000deaf0300afaf00f2af fd00f1affd00fdaf016464f9affc00f7af0000dbaf01dfdff4af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfe0af0200af00fcaf0000deaf 0300afaf00f2af0000edaf0500afafaf6464faaf0000fcaf0000faaffd00 dbaf01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfe0 af0200af00fcaf0000deaf0000efaf0000edaf0500afafaf6464faaf0000 fcaf0000f8af0000dbaf01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfe0af0a00afaf00afafaf00afafaffc00fcaffc00fdaf03 00af0000faaffc000cafaf00afaf00afaf00af000000f9af0300afaf00fb af0600af00af000000fcaf0500afafaf6464faaf0000fcaf0000f8af0000 dbaf01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfe0 af1b00afaf00afafaf00afaf0000afaf0000afaf0000afaf0000afaf0000 f9af120000afaf0000af00afaf00afaf0000afaf0000faaf0300afaf00fb af1000af0000afaf0000afafaf00afafaf6464faaf0000fcaf0000f8af00 00dbaf01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf e0af0a00afafaf00afaf00afaf00fcaf0000f9af0300afaf00f8af0000fa af0600afaf00afaf00fcaf0000faaf0b00afafaf00afafaf00afaf00fcaf 0900afafaf00afafaf6464faaf0000fcaf0000f8af0000dbaf01dfdff4af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfe0af0900afafaf00 afaf00afaffa00fdaffb0002afaf00f8af0000faaf0600afaf00afaf00fc af0000faaf0b00afafaf00afafaf00afaf00fcaf0900afafaf00afafaf64 64faaf0000fcaf0000f8af0000dbaf01dfdff4af09646400d69dd69d569d 000900d6d69d9d9d5656dfdfe0af0000fcaf0500af00afaf00f9af080000 afafaf00afaf00f8af0000faaf0600afaf00afaf00fcaf0000faaf0b00af afaf00afafaf00afaf00fcaf0900afafaf00afafaf6464faaf0000fcaf00 00f8af0000dbaf01dfdff4af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdfe0af0000fcaf0500af00afaf00f9af0000fcaf0300afaf00f8af 0000fcaf0800af00afaf00afaf00fcaf0000faaf0000fcaf0600af00afaf af00fcaf0900afafaf00afafaf6464faaf0000fcaf0000f8af0000dbaf01 dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdfe0af0000 fbaf140000afaf0000afaf0000afaf0000afaf0000afaf00f8af120000af af0000af00afaf00afaf0000afaf0000faaf0000fcaf0600af00afafaf00 fcaf0900afafaf00afafaf6464faaf0000fcaf0300afaf00fbaf0000dbaf 01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfe0af00 00fbaf040000afafaffc00fcaffd0004af0000af00f7affc000cafaf00af af00afaf00af000000f9af0000fbaf0000fcaf0000fcaf0900afafaf00af afaf6464f9affc00fdaf0000fbaf0000dbaf01dfdff4af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdfb0af0000f5af0000edaf0500afafaf 6464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56df dfb0af0000f5af0000edaf0500afafaf6464c6af01dfdff4af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfb0af0000f5affd00f1affd00fd af016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4 af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af 01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf01 6464c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656df df8caf016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d 569d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900 d6d69d9d9d5656dfdf8caf016464c4dff4af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf8caf0064c3dff4af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf8cafc264f4af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf8cafc36400dff4af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56 000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69d d69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdf f4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6 af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf 016464c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdfd2aff900e7af0300afaf00f2affd00f7affb00fdaf016464 f7af0000fbaffc00fcaffc00e1af01dfdff4af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdfd2af0000e1af0300afaf00f2af0000f6af0000 fcaf0500afafaf6464f9affd00fcaf0000fcaf0300afaf00fcaf0000e2af 01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfd2af00 00e1af0000efaf0000f6af0000fcaf0500afafaf6464f7af0000fcaf0000 fcaf0300afaf00fcaf0000e2af01dfdff4af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfd2af0000f8affc00fdaf0300af0000faaffc000c afaf00afaf00afaf00af000000f9af0300afaf00fbaffc00fdaf0500afaf af6464f7af0000fcaf0000fcaf0300afaf00fcaf0000e2af01dfdff4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdfd2af0000f9af090000 afaf0000afaf0000f9af120000afaf0000af00afaf00afaf0000afaf0000 faaf0300afaf00fbaf0200af00fcaf0500afafaf6464f7af0000fcaf0000 fcaf0300afaf00fcaf0000e2af01dfdff4af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfd2affa00f9af0300afaf00f8af0000faaf0600af af00afaf00fcaf0000faaf0b00afafaf00afafaf00afaf00fcaf0500afaf af6464f7af0000fcaf0000fcaf0300afaf00fcaf0000e2af01dfdff4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdfd2af0000f8affb0002 afaf00f8af0000faaf0600afaf00afaf00fcaf0000faaf0b00afafaf00af afaf00afaf00fcaf0500afafaf6464f7af0000fcaf0000fcaf0300afaf00 fcaf0000e2af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfd2af0000f9af080000afafaf00afaf00f8af0000faaf0600afaf00 afaf00fcaf0000faaf0b00afafaf00afafaf00afaf00fcaf0500afafaf64 64f7af0000fcaf0000fcaf0300afaf00fcaf0000e2af01dfdff4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdfd2af0000f9af0000fcaf03 00afaf00f8af0000fcaf0800af00afaf00afaf00fcaf0000faaf0000fcaf 0600af00afafaf00fcaf0500afafaf6464f7af0000fcaf0000fcaf0300af af00fcaf0000e2af01dfdff4af09646400d69dd69d569d000900d6d69d9d 9d5656dfdfd2af0000f9af080000afaf0000afaf00f8af120000afaf0000 af00afaf00afaf0000afaf0000faaf0000fcaf0600af00afafaf00fcaf05 00afafaf6464f7af0000fcaf0000fcaf0300afaf00fcaf0000e2af01dfdf f4af09646400d6d69d9d9d56000900d69dd69d569d56dfdfd2af0000f8af fd0004af0000af00f7affc000cafaf00afaf00afaf00af000000f9af0000 fbaf0000fcaf0000fcaf0500afafaf6464f7af0000fbaffc00fcaffc00e1 af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdfacaf 0000f5af0000f1af0500afafaf6464c6af01dfdff4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdfacaf0000f5af0000f1af0500afafaf64 64c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf acaf0000f5affd00f5affd00fdaf016464c6af01dfdff4af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdf f4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6 af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf 016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d69d 9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c4dff4af096464 00d69dd69d569d000900d6d69d9d9d5656dfdf8caf0064c3dff4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf8cafc264f4af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdf8cafc36400dff4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09 646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01df dff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464 c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8c af016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdfc3aff900fcaffd00fcaf0000f9af00 00fbaffd00f2affd00fdaf016464f5af0300afafaffc00d9af01dfdff4af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfc3af0000f8af0900 00afafaf0000afaf00f9af0000fbaf0000eeaf0500afafaf6464f6af0400 00afaf00fcaf0000daaf01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdfc3af0000f8af0000fbaf0400afafaf00fbaf0000faaf00 00eeaf0500afafaf6464f7af0500af00afaf00fcaf0000daaf01dfdff4af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfc3af0000f9af0000 f9af0300afaf00fbaf0000faaf0300afaf00fbaf010000fbaf0800afaf00 afafaf6464f8af0600afaf00afaf00fcaf0000daaf01dfdff4af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfc3af0000f9af0000f9af0900 afaf0000afafaf0000faaf0300afaf00fbaf010000fbaf0800afaf00afaf af6464f9af0700afafaf00afaf00fcaf0000daaf01dfdff4af09646400d6 d69d9d9d56000900d69dd69d569d56dfdfc3affa0002afaf00f9af0800af afaf00afafaf00f9af1800afafaf00afafaf00afaf00afafaf00afafaf00 afafaf6464faaf0000fcaf0300afaf00fcaf0000daaf01dfdff4af096464 00d69dd69d569d000900d6d69d9d9d5656dfdfc3af0000f9af0000f9af08 00afafaf00afafaf00f9af1800afafaf00afafaf00afaf00afafaf00afaf af00afafaf6464faaf0000fcaf0300afaf00fcaf0000daaf01dfdff4af09 646400d6d69d9d9d56000900d69dd69d569d56dfdfc3af0000f9af0000f9 af0000fcaf0200af00f8af1800afafaf00afafaf00afaf00afafaf00afaf af00afafaf6464faaff90001af00fcaf0000daaf01dfdff4af09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfc3af0000f8af0000fbaf0000fb af0200af00f8af0000fcaf0200af00fcaf0200af00fcaf0500afafaf6464 f5af0300afaf00fcaf0000daaf01dfdff4af09646400d6d69d9d9d560009 00d69dd69d569d56dfdfc3af0000f8af060000afafaf0000faaf0000f7af 0000fcaf0200af00fcaf0200af00fcaf0500afafaf6464f5af0300afaf00 fcaf0000daaf01dfdff4af09646400d69dd69d569d000900d6d69d9d9d56 56dfdfc3af0000f6affd00f8af0000f7af0000fbaf0000faaf0000fbaf05 00afafaf6464f5af0300afafaffc00d9af01dfdff4af09646400d6d69d9d 9d56000900d69dd69d569d56dfdfa3af0000eeaf0500afafaf6464c6af01 dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdfa3af0000 eeaf0500afafaf6464c6af01dfdff4af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfa3affd00f2affd00fdaf016464c6af01dfdff4af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdf f4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6 af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf 016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d69d 9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01 dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf0164 64c4dff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf00 64c3dff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8cafc2 64f4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8cafc36400 dff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464 c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8c af016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d 56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d000900d6d6 9d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd6 9d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af096464 00d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4 af09646400d69dd69d569d000900d6d69d9d9d5656dfdff5aff900e8af00 00f9af0000deaf0000f5affd00f8af0900af000000afafaf6464f9affc00 d1af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdff5 af0000e2af0000f9af0000e2af0400afafaf00f5af0000f6af0900afafaf 00afafaf6464faaf0000fcaf0000d2af01dfdff4af09646400d69dd69d56 9d000900d6d69d9d9d5656dfdff5af0000e2af0000f9af0000e2af0400af afaf00f5af0000f6af0900afafaf00afafaf6464faaf0000fcaf0000d2af 01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdff5af00 00f8affc00fcaffc00fdaffc00fdaf0000f9af0000f9affc00fdaf0400af 000000fcaffd000caf00af000000afaf00af000000f9af0300afaf00fbaf 0b00af00afafaf00afafaf6464f5af0000d2af01dfdff4af09646400d69d d69d569d000900d6d69d9d9d5656dfdff5af0000f9af170000afaf0000af af0000afaf0000af0000afaf0000afaf00f9af0000faaf210000afaf0000 afaf0000afaf0000afaf0000afaf0000afaf00afafaf0000afaf0000faaf 0300afaf00fbaf0b00af00afafaf00afafaf6464f5af0000d2af01dfdff4 af09646400d6d69d9d9d56000900d69dd69d569d56dfdff5affa0002afaf 00fcaf0300afaf00f5af0300afaf00f9af0000faaf0000fcaf0300afaf00 fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0000faaf1400afafaf00 afafaf00afaf00afafaf00afafaf6464f8affd00d1af01dfdff4af096464 00d69dd69d569d000900d6d69d9d9d5656dfdff5af0000f9af0000fcaf03 00afaf00f9affb0002afaf00f9af0000faaffa0002afaf00fcaf0300afaf 00fcaf0700afaf00afafaf00fcaf0000faaf1400afafaf00afafaf00afaf 00afafaf00afafaf6464f5af0000d2af01dfdff4af09646400d6d69d9d9d 56000900d69dd69d569d56dfdff5af0000f9af0000fcaf0300afaf00faaf 080000afafaf00afaf00f9af0000faaf0000f9af0000fcaf0300afaf00fc af0700afaf00afafaf00fcaf0000faaf1400afafaf00afafaf00afaf00af afaf00afafaf6464f5af0000d2af01dfdff4af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdff5af0000f9af0000fcaf0300afaf00fcaf0200 af00fcaf0300afaf00f9af0000faaf0000f9af0000fcaf0300afaf00fcaf 0700afaf00afafaf00fcaf0000faaf0000fcaf0f00af00afafaf00afafaf 00afafaf6464faaf0000fcaf0000d2af01dfdff4af09646400d6d69d9d9d 56000900d69dd69d569d56dfdff5af0000f9af170000afaf0000afaf0000 afaf0000af0000afaf0000afaf00f9af0000faaf080000afaf0000afaf00 fcaf0f00afaf0000afaf0000afaf00afafaf00fcaf0000faaf0000fcaf0f 00af00afafaf00afafaf00afafaf6464faaf0000fcaf0000d2af01dfdff4 af09646400d69dd69d569d000900d6d69d9d9d5656dfdff5af0000f8affc 00fcaffc00fdaffd0004af0000af00f9affa0001afaffc00fdaf0000fcaf 0f00afafaf000000af00afafaf0000af00fcaf0000faaf0000fbaf0000fc af0900afafaf00afafaf6464f9affc00d1af01dfdff4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdfb2af0000eeaf0000f2af0500afafaf 6464c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656df dfb7af050000afaf0000eeaf0000f2af0500afafaf6464c6af01dfdff4af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfb6affc00edaffd00 f6affd00fdaf016464c6af01dfdff4af09646400d69dd69d569d000900d6 d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56 000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af09646400d69d d69d569d000900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdf f4af09646400d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c6 af01dfdff4af09646400d6d69d9d9d56000900d69dd69d569d56dfdf8caf 016464c6af01dfdff4af09646400d69dd69d569d000900d6d69d9d9d5656 dfdf8caf016464c6af01dfdff4af09646400d6d69d9d9d56000900d69dd6 9d569d56dfdf8caf016464c6af01dfdff4af09646400d69dd69d569d0009 00d6d69d9d9d5656dfdf8caf016464c4dff4af09646400d6d69d9d9d5600 0900d69dd69d569d56dfdf8caf0064c3dff4af09646400d69dd69d569d00 0700d6d69d9d9d56568aafc264f4af09646400d6d69d9d9d56000700d69d d69d569d568aafc36400dff4af09646400d69dd69d569d000700d6d69d9d 9d56568aaf016464c6af01dfdff4af09646400d6d69d9d9d56000700d69d d69d569d568aaf016464c6af01dfdff4af09646400d69dd69d569d000700 d6d69d9d9d56568aaf016464c6af01dfdff4af09646400d6d69d9d9d5600 0700d69dd69d569d568aaf016464c6af01dfdff4af09646400d69dd69d56 9d000700d6d69d9d9d56568aaf016464c6af01dfdff4af09646400d6d69d 9d9d56000700d69dd69d569d568aaf016464c6af01dfdff4af09646400d6 9dd69d569d000700d6d69d9d9d56568aaf016464c6af01dfdff4af096464 00d6d69d9d9d56000700d69dd69d569d56f3af0000faaf0000e0affd00fc af0000deaffd00f2affd00fdaf016464f9affc00d1af01dfdff4af096464 00d69dd69d569d000700d6d69d9d9d5656f3af0000faaf0000e2af090000 afafaf0000afaf00deaf0000eeaf0500afafaf6464faaf0000fcaf0000d2 af01dfdff4af09646400d6d69d9d9d56000700d69dd69d569d56f3af0000 dbaf0000fbaf0300afaf00deaf0000eeaf0500afafaf6464faaf0000fcaf 0000d2af01dfdff4af09646400d69dd69d569d000700d6d69d9d9d5656f3 af0000faaf0700afaf00af000000fcaffc00fcaffd00f9af0000f7af0300 afafaffc00fcaffd00fcaffc00fdaf0300af0000fbaf0300afaf00fbaf02 00afaffc00fdaf0500afafaf6464f5af0000d2af01dfdff4af09646400d6 d69d9d9d56000700d69dd69d569d56f3af0000faaf1700afaf0000afaf00 00afaf0000afaf0000afaf00afafaf00faaf0000f7af1b00afaf0000afaf 0000afaf00afafaf00afaf0000afaf0000afaf0000f9af0300afaf00fbaf 0f00af0000afaf0000afaf00afafaf6464f5af0000d2af01dfdff4af0964 6400d69dd69d569d000700d6d69d9d9d5656f3af0000faaf0300afaf00fc af0300afaf00fcaf0400afaf0000f7af0000f7af0300afaf00fcaf0400af af0000fbaf0000fcaf0300afaf00f8af0b00afafaf00afafaf00afaf00f9 af0500afafaf6464f8affd00d1af01dfdff4af09646400d6d69d9d9d5600 0700d69dd69d569d56f3af0000faaf0300afaf00fcaf0200afaffa00fdaf fd00f9af0000f7af0300afaf00fcaf0900afafaf000000afafaffa0002af af00f8af0b00afafaf00afafaf00afaf00f9af0500afafaf6464f5af0000 d2af01dfdff4af09646400d69dd69d569d000700d6d69d9d9d5656f3af00 00faaf0300afaf00fcaf0300afaf00f6af010000faaf0000f7af0300afaf 00fcaf0000fbaf040000afaf00f9af0000f8af0b00afafaf00afafaf00af af00f9af0500afafaf6464f5af0000d2af01dfdff4af09646400d6d69d9d 9d56000700d69dd69d569d56f3af0000faaf0300afaf00fcaf0300afaf00 f5af0000f9af0000fbaf0600afaf00afaf00fcaf0000faaf0300afaf00f9 af0000f8af0000fcaf0600af00afafaf00fcaf0800afaf00afafaf6464fa af0000fcaf0000d2af01dfdff4af09646400d69dd69d569d000700d6d69d 9d9d5656f3af0000faaf0300afaf00fcaf0f00afaf0000afaf0000afaf00 afafaf00f9af230000afafaf0000afaf00afaf0000afaf0000afaf00afaf af00afaf0000afaf0000afaf00f8af0000fcaf1300af00afafaf0000afaf 0000afaf00afafaf6464faaf0000fcaf0000d2af01dfdff4af09646400d6 d69d9d9d56000700d69dd69d569d56f3affa0004af00afaf00fcaf0300af afaffc00fcaffd00f6affd00fcaf0300afafaffc00fcaffd00fcaffc00fd af0000f8af0000fbaf0000fbaffc00fdaf0500afafaf6464f9affc00d1af 01dfdff4af09646400d69dd69d569d000700d6d69d9d9d5656a1af0000ee af0500afafaf6464c6af01dfdff4af09646400d6d69d9d9d56000700d69d d69d569d56a1af0000eeaf0500afafaf6464c6af01dfdff4af09646400d6 9dd69d569d000700d6d69d9d9d5656a1affd00f2affd00fdaf016464c6af 01dfdff4af09646400d6d69d9d9d56000700d69dd69d569d568aaf016464 c6af01dfdff4af09646400d69dd69d569d000700d6d69d9d9d56568aaf01 6464c6af01dfdff4af09646400d6d69d9d9d56000700d69dd69d569d568a af016464c6af01dfdff4af09646400d69dd69d569d000700d6d69d9d9d56 568aaf016464c6af01dfdff4af09646400d6d69d9d9d56000700d69dd69d 569d568aaf016464c6af01dfdff4af09646400d69dd69d569d000700d6d6 9d9d9d56568aaf016464c6af01dfdff4af09646400d6d69d9d9d56000700 d69dd69d569d568aaf016464c6af01dfdff4af09646400d69dd69d569d00 0900d6d69d9d9d5656dfdf8caf016464c6af01dfdff4af09646400d6d69d 9d9d56000900d69dd69d569d56dfdf8caf016464c6af01dfdff4af096464 00d69dd69d569d000900d6d69d9d9d5656dfdf8caf016464c4dff4af0964 6400d6d69d9d9d56000900d69dd69d569d56dfdf8caf0064c3dff4af0964 6400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d 000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d6 9dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d 5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf 80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af 09646400d6d69d9d9d56000900d69dd69d569d56dfdfc9affd00daaf0000 f7af0000f1af0000f6af0000c8af09646400d69dd69d569d000900d6d69d 9d9d5656dfdfcbaf060000afafaf0000dcaf010000f9af010000f1af0000 f6af0000c8af09646400d6d69d9d9d56000900d69dd69d569d56dfdfcbaf 0000fbaf0000dcaf010000f9af010000f1af0000f6af0000c8af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfcbaf0000f8af0400af000000 fcaffc00fcaffc00fdaffc00faaf0200af00fbaf0500af00afafaffc00fc affd0004af00afafaffc00fdaf0000c8af09646400d6d69d9d9d56000900 d69dd69d569d56dfdfcaaf010000faaf1c0000afaf0000afaf0000afaf00 00afaf0000afaf0000af0000afaf0000fbaf0200af00fbaf1d00af00afaf 0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00c8af096464 00d69dd69d569d000900d6d69d9d9d5656dfdfc8af010000fcaf0000fcaf 0000f9af0300afaf00faaf0000fcaf0000fbaf0d00afaf00afafaf00afaf 00afaf00fcaf0300afaf00fcaf0300afaf00fcaf0300afaf00c8af096464 00d6d69d9d9d56000900d69dd69d569d56dfdfc6af040000afaf00fcaf03 00afafaffb0002afaf00faaffa00fbaf0d00afaf00afafaf00afaf00afaf 00fcaf0300afaf00fcaf0200afaffa0002afaf00c8af09646400d69dd69d 569d000900d6d69d9d9d5656dfdfc5af0300afaf00fcaf0b00afaf0000af afaf00afaf00faaf0000f6af0d00afafaf00af00afafaf00afaf00fcaf03 00afaf00fcaf0300afaf00f9af0000c8af09646400d6d69d9d9d56000900 d69dd69d569d56dfdfcbaf0000fbaf0300afaf00fcaf0300afaf00fcaf03 00afaf00fcaf0200af00f6af0d00afafaf00af00afafaf00afaf00fcaf03 00afaf00fcaf0300afaf00f9af0000c8af09646400d69dd69d569d000900 d6d69d9d9d5656dfdfcbaf250000afafaf0000afaf0000afaf0000afaf00 00afaf0000afaf0000afaf0000af0000afaf0000fbaf0000fcaf0000fcaf 1b00afaf0000afaf0000afaf0000afaf0000afaf0000afaf0000afaf00c8 af09646400d6d69d9d9d56000900d69dd69d569d56dfdfc9affd00fcaf04 00af000000fcaffd0004af0000afaffc00fdaffc00faaf0000fcaf0000fc af0300afafaffc00fcaffd0004af00afafaffc00fdaf0000c8af09646400 d69dd69d569d000900d6d69d9d9d5656dfdfc2af000081af09646400d6d6 9d9d9d56000900d69dd69d569d56dfdfc2af000081af09646400d69dd69d 569d000900d6d69d9d9d5656dfdfc2af000081af09646400d6d69d9d9d56 000900d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6 d69d9d9d5656dfdfefaf8064e56400dfefaf09646400d6d69d9d9d560009 00d69dd69d569d56dfdfefaf006480dfe7df0164dfefaf09646400d69dd6 9d569d000900d6d69d9d9d5656dfdfefaf0164df8064e76400dfefaf0964 6400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0164df8064e96402 df64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf03 64df64648000ec0003dfdf64dfefaf09646400d6d69d9d9d56000900d69d d69d569d56dfdfefaf0364df64648000ec0003dfdf64dfefaf09646400d6 9dd69d569d000900d6d69d9d9d5656dfdfefaf0764df646400afafafee00 fdaffb0000aff90002af00afe60000afb00003dfdf64dfefaf09646400d6 d69d9d9d56000900d69dd69d569d56dfdfefaf0564df646400afea0000af fb0000aff90002af00aff90000afee0000afb00003dfdf64dfefaf096464 00d69dd69d569d000900d6d69d9d9d5656dfdfefaf0564df646400afea00 00affa0000affb0000aff60000afee0000afb00003dfdf64dfefaf096464 00d6d69d9d9d56000900d69dd69d569d56dfdfefaf1364df646400af0000 00af00afaf0000afaf0000affb0003af0000affa0000affb0007af0000af 0000af00fbaf020000affc0002af0000fcaffd0000afb00003dfdf64dfef af09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf1364df6464 00af000000afaf0000afaf0000af00affb0003af0000affa0015afaf0000 00afaf0000af0000afaf000000af000000affc000aaf00afaf0000afaf00 00afb00003dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d 56dfdfefaf1c64df646400af000000af000000af000000af0000af000000 af000000aff9000baf000000af000000af0000affc0004af000000affc00 00affa0003af0000afb00003dfdf64dfefaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfefaf1c64df646400af000000af000000af000000 af0000af000000af000000aff9000baf000000af000000af0000affc0004 af000000affc0002af0000fbaf020000afb00003dfdf64dfefaf09646400 d6d69d9d9d56000900d69dd69d569d56dfdfefaf1c64df646400af000000 af000000af000000af0000af000000af000000aff80002af00affc0003af 0000affc0004af000000affc000aaf00afaf000000af0000afb00003dfdf 64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf1764 df646400af000000af000000af000000af000000af00affc0000aff80002 af00affc0003af0000affc0004af000000affc0002af00affc0003af0000 afb00003dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdfefaf1764df646400af000000af000000af000000af000000af00affc 0000aff70000affb0003af0000affc0013af000000afaf0000afaf00afaf 0000afaf0000afb00003dfdf64dfefaf09646400d69dd69d569d000900d6 d69d9d9d5656dfdfefaf1164df646400af000000af000000af000000affc 0000affb0000aff70000affb0003af0000affb0012afaf0000afafaf00af 0000afafaf00afaf00afb00003dfdf64dfefaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0564df646400afea0000af850003dfdf64 dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0564df 646400afea0000af850003dfdf64dfefaf09646400d6d69d9d9d56000900 d69dd69d569d56dfdfefaf0764df646400afafafee00fdaf850003dfdf64 dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0364df 646480afecaf03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdfefaf0364df646480afecaf03dfdf64dfefaf09646400d69dd6 9d569d000900d6d69d9d9d5656dfdfefaf0764df6464af000000edaffd00 faaffa00f0af0000ebaf0000b9af03dfdf64dfefaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfefaf0564df6464af00e9af0000faaf0000 fcaf010000f1af0000efaf0400afafaf00b9af03dfdf64dfefaf09646400 d69dd69d569d000900d6d69d9d9d5656dfdfefaf0564df6464af00e9af00 00faaf0000fbaf0000dfaf0000b5af03dfdf64dfefaf09646400d6d69d9d 9d56000900d69dd69d569d56dfdfefaf1864df6464af00afafaf00af0000 afaf0000afafaf00af000000fcaf0000faaf0000fbaf0800afaf00af0000 afaffc00fdaf0300afafaffc00fcaffc0008af000000afaf00af00fbaf02 00afaffc00c7af03dfdf64dfefaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdfefaf1d64df6464af00afafaf0000afaf0000afaf00afaf00 00afaf0000afafaf00faaf0000fcaf290000afaf0000afafaf0000afaf00 00afaf00afaf0000afaf0000afaf0000afaf0000af00afafaf00af00fbaf 0700af0000afaf0000c8af03dfdf64dfefaf09646400d6d69d9d9d560009 00d69dd69d569d56dfdfefaf1464df6464af00afafaf00afafaf00afafaf 00afaf00fcaf0400afafaf00faaffa00fdaf0000fcaf0000fcaf0600afaf 00afaf00fcaf0300afaf00faaf0e00afafaf00afaf00afafaf00afaf00fc af0000c8af03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d9d 5656dfdfefaf1464df6464af00afafaf00afafaf00afafaf00afaf00fcaf 0400afafaf00faaf0000f8af0000fcaf0000fcaf0500afaf00afaffa0002 afaf00faaf0d00afafaf00afaf00afafaf00afaffa00c8af03dfdf64dfef af09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf1464df6464 af00afafaf00afafaf00afafaf00afaf00fcaf0400afafaf00faaf0000f8 af0000fcaf0000fcaf0600afaf00afaf00f9af0000faaf0e00afafaf00af af00afafaf00afaf00c3af03dfdf64dfefaf09646400d69dd69d569d0009 00d6d69d9d9d5656dfdfefaf1464df6464af00afafaf00afafaf00afafaf 00afaf00fcaf0400afafaf00faaf0000f8af0000fcaf0000fcaf0600afaf 00afaf00f9af0000fcaf1000af00afafaf00afafaf00af00afafaf00c3af 03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfef af1d64df6464af00afafaf00afafaf00afafaf00afaf0000afaf0000afaf af00faaf0000f8af0000fcaf2d0000afaf0000afaf00afaf0000afaf0000 afaf0000afaf0000af00afafaf00afafaf00af00afafaf0000afaf0000c8 af03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdf efaf1864df6464af00afafaf00afafaf00afafaf00afaf00af000000fcaf 0000faaf0000f8af0000fbaffc00fdaf0300afafaffc00fcaffc00fdaf03 0000af00fcaf0000fbaffc00c7af03dfdf64dfefaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfefaf0564df6464af00f2af0000f8af0000 e4af0000a3af03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d 9d5656dfdfefaf0564df6464af00f2af0000f8af0000e4af0000a3af03df df64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf07 64df6464af000000f4af0000faaffd00e6af010000a2af03dfdf64dfefaf 09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0364df646480 afecaf03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56 dfdfefaf0364df646480afecaf03dfdf64dfefaf09646400d69dd69d569d 000900d6d69d9d9d5656dfdfefaf0764df6464af000000eeaffd00f7affd 00ebaf010000dfaf0000caaf03dfdf64dfefaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0564df6464af00eaaf0000f9af060000af afaf0000eeaf0000ddaf0000caaf03dfdf64dfefaf09646400d69dd69d56 9d000900d6d69d9d9d5656dfdfefaf0564df6464af00eaaf0000f9af0000 fbaf0000eeaf0000ddaf0000caaf03dfdf64dfefaf09646400d6d69d9d9d 56000900d69dd69d569d56dfdfefaf1064df6464af00afafaf00af0000af af0000fcaffc00fdaf0000faaf0000f6affc00fdaf0c00af000000afaf00 0000afafaffc00fdaf0c00af0000af00af0000afaf0000fcaffc00fdaf00 00caaf03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656 dfdfefaf1c64df6464af00afafaf0000afaf0000afaf00afaf0000afaf00 00afaf00faaf0000f7af340000afaf0000afaf0000afaf0000afaf00afaf af0000afaf0000afaf0000afafaf0000afaf0000afaf00afaf0000afaf00 00afaf00caaf03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d 569d56dfdfefaf1464df6464af00afafaf00afafaf00afafaf00afaf00f9 af0000faaf0000f7af0000fcaf0300afaf00fcaf0700afaf00afafaf00fc af0300afaf00fcaf0800afafaf00afafaf00f9af0300afaf00caaf03dfdf 64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf1464 df6464af00afafaf00afafaf00afafaf00afaf00f9af0000faaf0000f7af 0000fcaf0300afaf00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0b 00afafaf00afafaf00afafaffb0002afaf00caaf03dfdf64dfefaf096464 00d6d69d9d9d56000900d69dd69d569d56dfdfefaf1464df6464af00afaf af00afafaf00afafaf00afaf00f9af0000faaf0000f7af0000fcaf0300af af00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf1300afafaf00afaf af00afaf0000afafaf00afaf00caaf03dfdf64dfefaf09646400d69dd69d 569d000900d6d69d9d9d5656dfdfefaf1464df6464af00afafaf00afafaf 00afafaf00afaf00fcaf0300afaf00f9af0000fbaf0300afaf00fcaf0300 afaf00fcaf0700afaf00afafaf00fcaf0300afaf00fcaf0b00afafaf00af afaf00afaf00fcaf0300afaf00caaf03dfdf64dfefaf09646400d6d69d9d 9d56000900569d569d569d56dfdfefaf1c64df6464af00afafaf00afafaf 00afafaf00afaf0000afaf0000afaf00f9af110000afafaf0000afaf0000 afaf0000afaf00fcaf0f00afaf00afafaf0000afaf0000afaf00fcaf1300 afafaf00afafaf00afaf0000afaf0000afaf00caaf03dfdf64dfefaf0964 6400d69dd69d569d000000fc56049d5656dfdfefaf1464df6464af00afaf af00afafaf00afafaf00afafaffc00fdaf0000f7affd00fbaffc00fdaf00 00fcaf0300afaf00fcaffc00fdaf0000fcaf1300afafaf00afafaf00afaf af000000af0000af00caaf03dfdf64dfefaf04646400d6d6fc56ff000000 fcd604569d56dfdfefaf0564df6464af00eaaf000085af03dfdf64dfefaf 04646400d69dfcd6ff000900d6d6d69d9d5656dfdfefaf0564df6464af00 eaaf000085af03dfdf64dfefaf09646400d6d69dd6d6d6000900d69dd69d 569d56dfdfefaf0764df6464af000000eeaffd0085af03dfdf64dfefaf09 646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0364df646480af ecaf03dfdf64dfefaf09646400d6d69d9d9d56000900d69dd69d569d56df dfefaf0364df646480afecaf03dfdf64dfefaf09646400d69dd69d569d00 0900d6d69d9d9d5656dfdfefaf0364df646480afecaf03dfdf64dfefaf09 646400d6d69d9d9d56000900d69dd69d569d56dfdfefaf0364df646480af ecaf03dfdf64dfefaf09646400d69dd69d569d000900d6d69d9d9d5656df dfefaf0364df646480afecaf03dfdf64dfefaf09646400d6d69d9d9d5600 0900d69dd69d569d56dfdfefaf0364df646480afecaf03dfdf64dfefaf09 646400d69dd69d569d000900d6d69d9d9d5656dfdfefaf0364df646480df eadf0164dfefaf09646400d6d69d9d9d56000900d69dd69d569d56dfdfef af0264df6480dfe9df0164dfefaf09646400d69dd69d569d000900d6d69d 9d9d5656dfdfefaf8064e56400dfefaf09646400d6d69d9d9d56000900d6 9dd69d569d56dfdfefaf80dfe4dfefaf09646400d69dd69d569d000900d6 d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d56 9d56dfdf80afc2af09646400d69dd69d569d000900d6d69d9d9d5656dfdf 80afc2af09646400d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af 09646400d69dd69d569d000900d6d69d9d9d5656dfdf80afc2af09646400 d6d69d9d9d56000900d69dd69d569d56dfdf80afc2af09646400d69dd69d 569d000900d6d69d9d9d5656dfdf80afc2af09646400d6d69d9d9d560009 00d69dd69d569d56dfdf80afc2af09646400d69dd69d569d000900d6d69d 9d9d5656dfdf80afc2af09646400d6d69d9d9d56000900d69dd69d569d56 dfdf8064c0640700d69dd69d569d000800d6d69d9d9d5656df8064bf6407 00d6d69d9d9d56000700d69dd69d569d568000bd0006d69dd69d569d0006 00d6d69d9d9d5680d6bad6fd9d0156007f00d69dd69d569dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69d d69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6519dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd69dd6 9dd69dd69dd69dd69dd69dd69dd69d569d000200d6d6e49d0156d6809df0 9d0156d6e39d0156000300d69dd6e59d0256d6d6809df19d0256d6d6e59d 02569d007f00d6d69d569d569d569d569d569d569d569d569d569d569d56 9d569d569d5656d6d6569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d569d569d569d569d569d569d569d569d56 9d569d569d569d569d569d569d51569d569d569d569d569d569d569d569d 569d569d569d569d569d569d569d569d569d569d569d569d569d569d569d 569d5656d6d6569d569d569d569d569d569d569d569d569d569d569d569d 569d569d56000100d6e25601d6d68056f05601d6d6e356ff008000ae00 grestore showpage %%Trailer cleartomark countdictstack exch sub { end } repeat restore %%EOF geomview-1.9.4/doc/figs/cam.pdf0000644000175000001440000002012710616356704013226 00000000000000%PDF-1.4 %Çì¢ 5 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h``4²07Õ3RÐ5Ö³´43°T0Ò3¶´05‚(¶PpÉç B^3¦endstream endobj 6 0 obj 68 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <>/Length 5585>>stream xœí];’Ü8Åe]Yru‚6Æ¢£ˆµû±ÑŽŒ½ƒt9´dô äŽ5îœd#¶X$€ÌDÄŸ@U>©ë¢Px|`ÈX¨‡ÃêïÐáßï*‹³ý~Ý(ýþâý÷¡nŽ÷ÿwV£Ÿ7J·g?éÛ9 ½á}¼ì* ŒÑY´J/ñoc¢Uºº.µA•^{µ›†8˜h•~mùøt01*ùlù`6üÖ¶¾xjôÉQ‰·#—Y<¯­öÕhkhŽJI%7Æ­Gõ|ï^#|íÿP»*1*±%¿…4…ï\5z…ØÞ|¨|•^7>¯­9ª„(mµÉWi'ÓœRšJ·Ú䫹 ð–tÿpi¦‰¦7ÕŽ*J¯GÜÈì?`š“’È©ŽJtñÃ)™VŒTúõPäË¡£Ð¹$§©ôJêûÃQ‰¶;"ë²i6ÇaR9™sùŠÎIªJ®~•h«Ò"ÙlP ävTÂ2'ªD þáQ‰¶1–’~°o’8Y•î5!\ã-!å¨dì'1%Ƶx|1µè—”¹P~¼b«L8È‘7Úè×/õBÏÑC/ˆJ N}•©GP‰IwUúÍ{¾Þ߯ñ`Ýjî9â«‘UéÇÇËÆí6P`ñâIoïûl*mÌþP_ïÙ÷‘ý¹cn¯ÿ{u…Šñ¯ÝùéNiÓkzJß¾ÿ½ywJ›¸©ô×Õ•*Â/õX¼G „û%Qi< ¯Òç¤Ü[͇W)‰Ò·?Õ*Å׿—Ò”W)‡’¨Ô¢’•®ÀAiÙÖ“¼s©´lt–R­UZÎÏj ¥ãÑ‹¶*ÝOèÙY¢tÚÚàö´'íx¯Z«uVcàPÚÎ÷§«¸€“ª¿›$[¨KiåŸUc•,%ç„’s Nr&¥û®*š¨R\ö4Jö³TÒ= ¤¤lÒiãX¼(JMUÚ[—«’ΤÇPB-Õ6<Æ<4µxðd²”ìÕ¤´=O)ÔbxÓ~ žTÓðàyŽ3Qè5zØžou”ÐyÖÇ}ÅÈH\Í3‚¨tD%5…JßrÏ¡R £9TJÇð*¥CTšÏ£RZ jìRxTš’Ò=`Pi¾Æ·*ÍMIT¢Ò ÈP xjqz¢/úøPq\A6:¡éj÷£»y3TòE­r)9ñ–vI†œ™9*yâ+Ù”hy~JÈÏiÝÈ~J)*!ÿæþ ¼sëýkAˆå¨ o­ ú¥K¶™QœÆ©~4¥•êD=hàTê¸fÂ[\¼ÆÍÄQò¹œsTR \•Ö·½¬è›¸7î1®¢\8‚P2U¨¬Œ¯(s…w¡T[%s‘‚ø ªqJµ¯%ç{s-%RbËc)‘œ1”Rû%×< +›ÉfjŠ®|&^ƒ A_Ú¦_º?Sl,µ­¯±~Èί e#~™—½RÒÑC-•bÀ|S|ÖQéìËOÂyyȤTI¥“5yàW"[e¾4*D¥pªRRXg„Uš‘QX¥™ñ<‘‹™!*ÍQiˆJ3@Tš¢Ò •f€¨4D¥ *ÍQiˆJ3@Tš¢Ò •f€¨4D¥ *ÍQiˆJ3@TšO¥Ú‡:I¿JÒ±cÕ]S ïjgnÉ­³¿‹[í›·ž9¤Ò_6“¦ä­/^ÎfqÓv…~>%ŸJI”|ûU<©4¿gÓA’U›I`CƒËïé,°Jߥ´èUúLJàž,¦¬HJI*éºèÓj6…ØV[âaJ`÷‰)mìrËŠ¤”v-]#öt[RîÎgKÌžY•Éâˈm™é×’=ŸŽ…Ó’0”ÔNa{O\•ðñLJY*)n×Íâ¥Ä3›ÉiÇ=U:¾2$U€Rb¿„¿_Sý’©Æ©ypöuÑ­žNY‘”|*µâ¨_ÒÍ_Kö½½NFüþh­³½¬ºG!-+’’G%¸úý´«õ"®q(½–"Ë |MÍMZUú%¾`ÿ°•Ï^m“V|YO5_š¢Ò •f€¨4âëw›Ï2J„µÓð³ðZÒ–~Å*ÅqJqN¯p#h„Ìk)¶¨Î”Jú%¾¼À°µN½_O5_š¢Ò •fÀS©ô fûóšÚeÁ¯¤ôvè†ýAè&Ò:þٹ¿,;‰¤„TúÎô?ÝA¹fTŠæ¦áïu¼H¤¤Žq‹(ùT:§Dg/g”˜-ä'rÜL*ä "\Ⱥ#'7\md)e­!‚®B x†¼”ô܈wûÀ –»\9Žè’„²Õ)\mÁüÎ=”¸8Q‰dçr›ó˜©R,%» |»’2™J`5‘þf”[[ZÜðZ¨| ”h{à SIgm_ U´ËŒ·xæÈa+V°B‡±x%›fa)­ŠT! k€÷¦']QJЄóÑËŸæö˜‡¼5DÔˆoô0þ.O€w‘|`Ý‘ùƒ¹áj#-ÀŒkˆ‚˜n Ñ9æ[CtЧš/M QiˆJ3@Tšr·(ä±B#‡(§ž—ÎP$s¨•ï!"Cl;¹€¥dæ?ÔÑU@©Ì‡^žÔÂ¥Þ9%ôS þR³óýKŒÓk±þ.诵S_rÌ·áÎO)Ñ÷àÎ#ImO^xjj©ØÉ¡÷ï,ö¬²¯¥%D Z¿J梠?Á÷|Ò$s|Û«SJ!§——’ò¬F±ßhÞ„)%úñˆЧtz(yÕQ1Jé~³ /N¥©(Eª´(ßB ÷¶Û$OÒ•Ì}OP¤Ò˜ÓÀ$²(ÙYƒR¬J±”°g2›Rj©¤kmWù€³=É÷ÃÜ9½aƒø.òk®¦’¡—0”lÍ"VöÈ%Sʸ–ˆsÇ«<Ì8ƒìÇøƒm°ÚµT•’{§íbJ«%]¨’âwÏNîa/%ÿAŸ=¥”Ó/ñ»çvJ¦_r)¹€1€R®yHPÉZUmû#®ìèA_*Î9kÄuöÅÞJ5n•gÄT"0IÞÿá‚2j¨ä©EbuØU“R¬JÞ(yz@’kPýUúžó…íñOJSQŠTI …UÇóFÁ÷±`ÊA‘J«‰ ësdKªàþƒ9)Ÿ0(Si±Uæê„^¦U0“Άr•àÕ?2¢<”`ŸzÈ»’þVÙ>x]Ì'õÁ|Jé*JJïxgüÓŸòÍŒv¶´Ô|Jé*™‚׆Òýq±áÅ…Ó…O-5ŸRƵ¢¤_jnz¶Žh¢c”’>)ù”*«´æY9êTŠE=‹wŒ›S(1 N¿×E€RË(e¨d¦ópa–lXÞAóà”šO)«_Òç×cÄwNöú q¥iÙ¼…FW¸}ËõeæPªt-Ùec÷e ¢ÚÆ•M©šÅ[lx÷a\ ÆHX€}Î¥T±_Bw\ÅÛ¶À¯¸…))ô±´0â•ÇxÙu©„#ñ(‰J£#N¥²EÜMñÆT6F¥2'[K|ã)E¨ôö­O Ó‘¯Ò ”ÞŠTúÞ§’IøÇ×ðâTšŠR¤Jzº€`æöÖæn&“Ù(¥*y*´z(1ÙûQŠU)D‰0SSJP 8 4JÉÞ3á8v¬Ó]UÉr()}ø˜O¬š= =(%©dþàÛƒ<)éãcª”G ¶Ã.”ꨤ#CI7ÄÑUN)Áô.”òTr(#¬Ió©’Ó#h—©4¥H•øè²IÁx˜uêÕrõ•ªä« ‰‚¯ ¥9¥X•"(ET¶¦3¶†JvÿPJ:‰? 0ô>¦Xmn•¼&‚R‚J‹3Æq4¹q&/Cg¨.¥$•ÌŸó€bNx|–R—RŠJJº^¥ƒ+OIŸˆº”*©ä¥„ƒ¯ŒJÙ¸L¥¥Û"ÊÍym•8ó`«~b ¥6æ!W%Έ›>#®4-œ¯2¥¼Ñ¡àAÍŽÕEåÑÃДbUÂ-ÄvGþZç_%q(U©iåò ó%”Ë;_‚‰¾6Ñü2/¹Fó%Ó“ú–ëÆT·6¥²ùï0™® ”7_"+²@¥ÌÅÄh`Úê/¤¥²ù’C‰[Xß ©F©`$®•ÐüÈŽ¹Ý±.(áJ•jSÒÞóÇQ‰,é­F©l¾äX¼$J¤Z”´J__>^ÒçKN¿„hJ$ÍWH-JZ¥¯·÷/Ñ*¹öWà£Nƒ…ØUõ(©÷Û‹íZº=½g®@@¥Û‹OwJ¿óGW p-}Ù)%Í—v§KÍ!ó%”k6J¢Ò@•P®Ù(Å©4æê÷•ÆdT RŸúå W¥Ï}ª—…L•¦ÂÓî_š ¢Ò •f€¨4X•Ýø W¥Ù¹*ý¼ºFå *½_]Ÿ*@*}ùýÿ¬J^|¼‡Ž^“i•B_€p´J/Þê}‹Œôï¬F›JïÁ“ò®ÂÇûã¤F7J‡ÿ*ðì endstream endobj 11 0 obj <>stream GPL Ghostscript 8.54 PDF Writer noname.psclaus claus endstream endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000385 00000 n 0000007720 00000 n 0000000326 00000 n 0000000171 00000 n 0000000015 00000 n 0000000153 00000 n 0000000450 00000 n 0000000550 00000 n 0000000491 00000 n 0000000520 00000 n 0000006327 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<80BFA7CE0DC69966E626CBE4A0F95A86><80BFA7CE0DC69966E626CBE4A0F95A86>] >> startxref 7886 %%EOF geomview-1.9.4/doc/figs/cam.png0000644000175000001440000001104010616356716013236 00000000000000‰PNG  IHDRÒWU3PLTE¯¯¯âââÖÖÖdddVVVßßß#2ÃIDATxœíÏn$)‡Á²f¯põÕ²Z~}‘Ušó®V-_[VË÷9Xýú[@ò×í¶Á²•.ó«/3’ ‚HâÍÊí%(—I%®èNÜ>ååò8§Ä}·_ïyy¸ÜÏ)QE†)ܾPŠ*2LoP¾ÓóúòLwë ™¾Ï²ìl¹%¦ËW_øöH¹ç9¦Ç¼É4•™Š<Û9p==üà/.÷xþo®J ¦·}w}KcáL׊î`ëæþ¥Èt'îE£Ð ¶Ä “¸oVÊ0‰2ÓÝýy=‚âîæú·îps"(™#(®B¶ÜÆ]ÌŽ‰*ê¯Â(P8}À$D‘ Çc‚·_)îàËnÙÆVJL7p8rL¤t0ݑΰ¯ì:²9&TÊ1ÑÑ»aL¦þHIàΓE&’ºñ¶wGgßÝ— ˜Ð4®'Ce,ÜVmvÚŽ®ë©§t¶=å30Qs°œ‰¤Ö3ùmÇôÈ<³¿¼ºü¯È2Ý<ßxñ…o·–gþ‚Wtûøü]üñòBgn]¹}x¹½ËãËÏÕåörùëªôð°Zèõö«Qz¼ù©×–od{ë•ðzÚLù’±‡LÃ[Á”ÜûmS^i3(ýÎLJˆ¤Ò|&¥u,ÕʤŸ5§¤RJõLJ>kNI_ß*´2ÍÊF¦ÄgÍ+)öÕÌ$­œZ V]ë2­Ä¾›™l•¿èãŠèˆ”„èd2Ió…UÅG4Á¤û˜ÌÅJ׫ŽÙ^B©‘I0&¸rRL×½æà¢eôÙžŒ”dBÉb öVÞx=Yk°Jð¡‘(=m„JZ%üÐæu¥ÒïÜ–ç”6ÓˆÒl¦oɲ€é5¯´û#J›iY·ÝtÔ¦uB¯1Óº#3-VÚL#J¿–I0wQ&þÓíG§Ü;b¶w!µu;}y&©½ÃSRø>¦„^eèræ™$()Ñû% >²:(¥™ÐùD'\H‰˜+-ô¿®NVeý>ììPýI¥4“ÒÔÍ’´‰î«òý/¨Ôú²Y¯$«˜œië{Kéú à–ûþ—«”Üu¯$„®fÒÐkÑB÷(Õ2Ù“*G˜êÏ“ïÔI•UbïóJ­¶ç;Þaæúåû_Ô!C‹@¥¦ëɶÂtÑ­µY+‡nûµý/éÚoå DmDÓ±ä®ß¸¨ävu[ŽÇjT©†éÜÊ*‰Ôæçº?­Qú%Lé®ÏŒ1e:YÓ”>v_cµÒfQÚL#J›iDi3(m¦¥Í4¢´™F”6ÓˆÒfQÚL#J›iDi3(m¦¥ÎôÅ ¾.QbL_Üà«‹¡ÚóÊ…|ù¨tùL B`8dúÇî ª“˜g”RÂÜCí/*q¦ŒRœ”T¤T(Y&;:!ü@‰¤.ˆ÷;%ï—S¥ôÃ`ÕLÒŽÒHäI†î´Øa;¤âÃXb5“ùÚ%¸ñ„<±°ÃY¤tHC¬f²_Îæ¯ÇŒ¯óLøº¤T`2VG§$`ÒÁyÂ7ëN&-a(‹lo‚RîzB{p× pC_ʧ úa°"Ó+·áR¡ó¤È""+4ô¥\ "+1}cJXâÿ©ˆ:cò%£T7äUq=±7-¬/uC^Éwí{î˜ÒfQúàL‹½°ƒ¿xa°A-Eº…Ò(w=¡tâA‚ ¥¥jÁ|ˆs¥Ï&˜¸´¢T-2¬=×}#¦d›MãnùÜrz‚ÂÞÁè{“pߪdâJ6·ÈÞT)3Ÿ?Aáþ¸iq.ý‰o$)Õ†òsÝñ] ÿ«ÖÜM‹Ÿ(ûFRЙ!'A¡ï>¥Ä)¼©‹²RI*÷þP s‘|–šò JÍLZúÔ<É•”b H:øë‰RÑßó×Y¸­ü AÇÖY„M:Zgм0RòiEø°†±wL@ÒÔFHHP’¨”°rΔðÂjºFéR:O©wõ*•¯'¦$âÖ?µï¹ƒJ›iDé—0ýéÚˆ%JŒ ”ž´s‰ì]Úv3ã.‘¿.m˜JIÒ•™þ÷ïk1‡QáÐ *n“È[¢7IU¡Ä™J:£Ä’µ‰è¬Ì2A܈jPxËÖ Âèƒ$×Èn’{”‹Se™’JBû$lºÙIMw|JÆ©²LàÅLè!Ýú•f)ǹHK–©O©§šÎ¤›™ nÄl+Á_œ’¬SÊ]OR†×äeãÿ È’òJ…8UÈôD=5`°—¿»ž®Vë”´p¼ØFtc½/x°rÎô“)QéwŽ ç)Y}¯RñzboÇ­Ö5Êûž;¦´™F”>]Ünæ"î¡hrŽdb_V©7R¾¹Ž„ 1—‡}•LY¥ÔPÀA)ñ¶&½sJJÓó<4|c,Dˆè5 %·‚I%&©a:§$ð^è•´t"rÍtä,8%!S²ïQ~·±[ÕýiºÒfQÚL#J3˜jB‰S˜žê”vŸ0­Tüëoj{uJ›iDéý0‰è¹Å¨W(ÈcÁ'‘O#Õ3Åÿö •vž¥OÓéd:(NI«S¥¦|¯PÈz¥¦B¯p"“0 E¡5‘é¤W8ñ<ô '2ô §2{…SÏS±W8©Èˆóô³umy§R7“p¿öýi3u)m¦¥LoÖªì©-ï?¹žÚò>¡ë©mÛQÚL#JïŽÉ&§ÒbŠMŽàü•ðÀ¥J&ë/ÒbŠ!’RîáÙf&¨TÓ˜ÂAIåîarƒ^’¦MßVIž*50¹ç…J*é“w1Á„.&m£ß2šËÔ­Ô|ž`…XÉ„-fÛ)Ù¡eß«™Ê䌡O©… —öÃ׊(ç¶ie­×öŸ:•z™-ì©Ò'¾?MPÚL#J›iDi÷ ÓL»Oø{Ø^ÒfQúULÐõó%9WƒÂ·Ú7„%¥)vBJnÝ8|CëÖÀ´P)Á$pöPœðZjœLž¦Ç$4­iã½åf&š €Fh¤çŒpËã4*EL~ÅúØØf³(ÜG=(«tn &T¢1;|€œRÏy"%0éa¥,“”gJ4‰k·íå,BÓ¤¢J‰ëÉY9ŒÙ !hÉ»ÜpJÊ_OÍmÄy g|Ыú„|vf¥6&ÖþÒ´Ï»O¸™:•6ÓˆÒGγìjͳ\¦äzj3˜Š=œ§õJ›iDéã3a´=(l&¯p§-õ=µ)¡dç£Ëô µÖí>l\¯SMQJ0±¹ü4"Ò¬glU.Ó{by–=L¼Oæ”èµ_•Ë(ëÞØ×àJô8š½öIƒ~9©ÊžZŠIÃBüè¡ÿÏV劔F˜´¦%^IÉwsz”rLî%Øõd¼­ä5d{¼O†×·¯ä-¢ýz0ŸôVŽm·r"eÙÄÍmDuS[¯ÔËÔ>z÷ñïO+•6ÓˆÒÛ3í>a¨ô^û„JUå7›c¦Ri3(½/¦ä:PÞ•¦ß9? •*˜¬Çw(ðèUƒR“JVÒ¬TÃdërsrâLцŸp6i%d²ŸM5 ñyP ÇÀF™¬›ÅzÖMfýžÀDÉ®8öKAEJ˜‡9ʤ! P8&mGiäa¹»A&EJøÝ©T{=-B»~VEÔ¶8Û²ôV®Y?«ÆÊkÛ½\G¬¶Ô·åãJïi´,ŸöŸÓÔµ]^ÿ)1½¾ÓL¥¦y3ÚÿëµÌ´H)3w>Óʘée8•wíÄΧL¬"É”¼Z—Rq^lšó›Í÷=›IÁTå0Õ:ü6w)38N->‹É ‘’—s´ãg˜ÆSÇäîç’ÇÙàqâ÷IL%©×1™ãè•ô&Pˆ•T¯RÉ)Iš˜Ÿ– œÎ$E dW¬´ë*/j#Jk1I©8w~°vȨRj½=«|9aZ¤”bb#ÂõblaqÑ7N)×Ò”kÖ¹ í)ÓQéPmN“„«Tx¥ã‚¶v÷a¦V&¿’½ã‚¶F鸴T3“f«tå´M,—ÕÊ*™Ý¤$ø‚¶R‰ìWWr9žÄT*CL d§bQ§¦^Íä-ÂÖ/hK‹“M`òV£¹Ñ‚¶¸oŒÉR`¥î‚maZ¡”bBË5Õ†Fܺ í)S[uµJïåþ±^ñ=ÀÂm¹?¹1þ|½µJ'÷'—·0®T¸?Q| 3 ìú— ŸypàԂ~&wrJ~–bÝ­™¨¡öÙ9.fI[ô8úS­=ÿ°žILcò“8¤•dƒ’aúã!{rד[ÿÒmñšZ¦?^žSL.ŠkÚZ]]º-8O8gY…Òß/×ótù»ÔFô—éò×U©ØFLRz4Jéû“ÎŒ¦u*}–ûÓ¥Í4¢”`:ɬèÌ'˜æ ŒL ̗ǾLDúù³Ä´¨|Þüˆ9J›iDéC3Mm„Å1½.W"¦¡rM!¦—噾¾A&^—ý%®È0…o¸ÌR +²Lϼ¼\žç”¸¢+ÓKX./“JTÑ÷åîÊÿf‡IˆÖÑ®îIEND®B`‚geomview-1.9.4/doc/figs/light.ps0000644000175000001440000001245110447731022013437 00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Creator: pnmtops %%Title: blah-000.ps %%Pages: 1 %%BoundingBox: 233 354 378 437 %%EndComments %%Page: Image0 1 /picstr 903 string def /inputf currentfile /ASCIIHexDecode filter /FlateDecode filter def %%EndProlog %%Page: 1 1 gsave 233.76 354.72 translate 144.48 82.56 scale 301 172 8 [ 301 0 0 -172 0 172 ] { inputf picstr readstring pop } false 3 colorimage 78DAED9DCB91E42A1045DBCAB2A05C7ACBB641DEF4765C791D53110A0D029440 262470EE8298D6A82889E270F9F3F585101AAF1F1B7D7F7FBF5EAF1F8466D6EB AFECE2FFC5E48AE1EF9FBA61F0FCEAF11312F609CF6CAC1EF3472786C1752D5D 9F1FA119757513A3F8033734C2909F12CD4EA21D205137FC5C272424B40B256E 482A11125A337875BD941BD27B8C90E9C084C40DED463110DA5919D78B5ED7EA A165B482704878663F574F55E186F49422BA3715C7DDAE6495BA21E386685E0C 55F2F09D68794B3088A7BF1B469FFF51C1C33F5EAFBB0D6D32E66E44B4308F05 B74DE486761842286EA8E886A599790D376CFF2C18E286FDDD30A8974EE18642 2BBC56BCAFFF155C0CAE672E926F7143DCB008C3284A293CA39FCA44887043B7 6E583A4FC0CE0DEF37D4B1067A9BBBA1BC2EE4C70D8B726CF0BDBA35D23AD0A2 315323DDD90D8BEA427EDCB0AE6259E486DDAC907E1BDC508EA12B37ACA897AA BB611D86F9EA28186EEB8645F5523F3DA515CD43B91BAA74CE28BA245ADB0DE5 CDC3AD7A4A532C970E55C8FF84C19DDDB091E8B5C70D8B0447A843DEDB73168D 103A1844B8E110372C6A562348C40DD54B24845CB961DD6C16D61B22DC5097E8 D25103DC10E1861E88AE70C3F3B32DE1E714806F76C623EC1E6AE5BD93E8F678 326EF8FDEF0E8A9FEBE7071BA5150F4203F39E56541937BC7F239B492264BA4F 69C066B025E949FD1F8490B6AE6E78DDBCF48AE1B51E4B8A21A4ABF7FB1DEC00 7CC730E865FA7CF0400869E8FD57453DA56088901D86C271433044083744A845 DE5A85B82102C3E13D33B821DA16433F7551DC1081A1370C71430486B8214260 881B2230DCD90D7FBF4878B1E886897285A45B1BE186A66EA88BE15C78CABBB5 33E9F051B74418586C5E5F361361344D70438B1F68250C253F562AB345FF9C08 C3A2470DDEB7E21B53091EAC39C20DA3097E2F03CF3F83EC17CD9C6ED96CC430 75A53F867D8A4D530C33451C6DC33B658FFFAEFBD516C030F8AF547DF55E7615 A5D8C06233F3A8C29AB910C30E19662E374CA5ADE4BA671F6CC730F382456597 2E86A6C566F486A218E418A648BF7F85B0B89BDD0D1BAFAF5A29CDC0589468EA 18DA159B290CE5CDD53A0C2BCA96C7C7DBC70DFDDBA20A868F5D34F2EB92D6E5 C062B367A554F7A53677C385DB861689361C43B9C1455B734695D28A977AEC7A 9DCE0D1FDB14D52D854D7A4A85D7EFA1B762B3AEF138DC0D67691BDE8B0E61CF 5BA68AB27CDB503E6E2869B3C88BAC81C566CF2E9A4C547618CE32A7748D396C 41AE783F49528849BA68323D7845188E2A36BBB50DF3455C4B71E7D60D8B7A1E D6C3F02DD0BC2FA8FB7B558FF54B30CC37E532031645C5DDBC6ED8799611725B 6CDA61D85FAC374493169BC268E79DDACD7A43B483704384C0D0CE0DDF3B8922 080C7DBAE127736E72E4071882A15B371476BCE386080C4DDD700700C1100CA7 70C3B57F3E305CE677742223370443E4FC777455C572E886757B0D81219A5ADE DC5017435D7EC11075C0D0AD1B3A890D0CD1746EF8B87FCEF5B6E80D99BD4A84 9FD29DD30886682E37ACDE9B2BBF6F58CB965F6088366F1BCA5749E7F70DB358 010D8668E1B6617411653B868FD18221C20DEF95523B374C75C5CC8561FFE118 964EEFD336EC5029DD04438B95B3F0B89B1B96564AEBBA68C0105BC40D336DC3 A3E4AC8496018B54CC5A99CD1AC3D293564A4F52C8DCDCFF1415D4C10D975407 0C255588F6535AF2E34460B8921B8261634BEDB1267F88B770977CA3FFEDCD71 43DCD00F86454336994A2918AEED865F8BCAA11B4A5AC7999A6A9FAE2D34C40D C1D0218687E0CCA6C71364D05C6E18F48E66F47883FA0767C7B0FD94968CEBB1 2FFA4A6ED88E61E6839986D292181E8993564A4F52788C192B5CD50DAB4DCDCE 46BD61E84A60B8BC1BDEDB20A903B9247E0786160C82E1DA6DC3C7A64D740E1B 18C2206EA8E886F7464DD1753044B8A18A1B822142B8A12B0CDF686FE1866088 5C1D83D2D30D255D31BB61F81F2A97DD715D3D9F7F881BE6072CA270E5C72CC0 100C85A7E0C96FF68061CF39A5FD2102C3C5301426B2FC4E27189AAEB0C84FCA 024304867DDCF03E580C8630058607ABEF4B04866038911B82211882A1073794 AFE3AE98C798AAE8822118E286BA18B62C33074330C40D8BE8004304863DDD30 BA3F6DE3D184600886B8A11C438BA309691B82216E588A6194A0EA3DFAFAAF51 0543305CC00D15311CB24E1C0CC110371CCB20187AC350BEA448BEFE08371462 3870BF1430F483A1D132C01DDC50E568C2C530FC8376D5A8593499018B2865A9 D3883233C6E7C290AC088663E794CEB8171F5B422123755B6191AA948221423D DD70D4946C3044B8E1320243B4801B8221423DDD90F586080D7743D61B22E4C7 0D25D60686080C596F08866893B6A1C57A433044B8612986517CAA173AD14583 70C3E1CB7E7143841B822142DBBA213DA50837F4B6DE705E0CD758A4C37AA596 F54DFDDDF0505A6F78AC328B66DE8C749DAFE8F609FD275D073774D5A6F38CE1 A4D527CF6F71DDD6C073D27570C39485E56D0E0CC1100C596F088660B8B61B2E 203004C305DC100CC1100C7143300443DC100CC1100C7143300443DC100CDB31 2CEA6AB6E8916EC7507D4306218675BB4C2BA6216EB8008641E691E42587184A 28B0C330939EEA85066EB82A867639A4278647EDA979BA181E4A47D9AA63881B BAC5509219EE46139DD07BBFA1A89266846174BE71E6BA0A86F2244ADD10BD3F E5F82D6E78D2871BBAC5F071F58A64D7910E18E6B3B7D6A3D661D892868F2FD2 EE86AF7F851BFAC43095B584370CC750F278D618B6A761FE81E56E7825EEDA36 3CBD123704C33A0C334D33271846BB52E5371C4FA7FE15B9E1A90043DA8660D8 88A124273B71C38A1B1E9FB0A86D18C590B6A1E79E52DCB0BDA7D40F86F4943A C7B0A25B43DEBD608A613E0F0FE9A291A767E72E1AC60D3D631854ED3255BE4C 6F64E68681181EBD062CF2B368EAD2304A5FCB80056EE81FC3E1624EA956D2E1 866008866E31C40DC1100C714330044330C40DC1100C714330044330D472C3B5 373F074330F4EF86CB9F41008660E8D90DF7111882A14F37E45C9EEA96E68CF2 FF166E1FCCD40D510586F3D607FCBF85DB073375438450637D153744C80986B8 2142B8214260881B22841B220486A56EF84608E9A9C20D4934842C3094BBE117 42C8407237FC410859EAD10DAF54121212DA852937D4D5EFB758448B504F9966 E3941B2AC6FF797E48440B6068C448E086671FA96E783F1D839070AEF0CCC646 F19F18BECC743F460AA1E9649A8DE93D46C883FE07744278A5 > currentdict /inputf undef currentdict /picstr undef currentdict /rpicstr undef currentdict /gpicstr undef currentdict /bpicstr undef grestore showpage %%Trailer geomview-1.9.4/doc/lisp.3gv0000644000175000001440000004663610600605170012433 00000000000000 lisp(3gv) lisp(3gv) NAME geomview lisp interpreter NOTE This document describes the geomview 1.3 lisp interpreter. This version is incompatible with previous versions in several ways. Since the previous one was used mostly just by Geometry Center staff, I am not going to write a docu- ment detailing the changes. The geomview lisp interpreter is not very well documented in general because I am strongly considering phasing it out and replacing it with a real lisp interpreter in a future version of geomview. If you have any questions about the current version or how to convert programs from an older version please contact me directly [ mbp@geomtech.com ]. SYNOPSIS #include "lisp.h" void LInit(); Lake * LakeDefine(FILE *streamin, FILE *streamout, void *river); void LakeFree(Lake *lake); LObject * LNew(LType *type, LCell *cell); LObject * LRefIncr(LObject *obj); void LRefDecr(LObject *obj); void LWrite(FILE *fp, LObject *obj); void LFree(LObject *obj); LObject * LCopy(LObject *obj); LObject * LSexpr(Lake *lake); LObject * LEval(LObject *obj); LObject * LEvalSexpr(Lake *lake); LList * LListNew(); LList * LListAppend(LList *list, LObject *obj); void LListFree(LList *list); LList * LListCopy(LList *list); LObject * LListEntry(LList *list, int n); int LListLength(LList *list); int LParseArgs(char *name, Lake *lake, LList *args, ...); int LDefun(char *name, LObjectFunc func, char *help); void LListWrite(FILE *fp, LList *list); LInterest * LInterestList(char *funcname); LObject * LEvalFunc(char *name, ...); int LArgClassValid(LType *type); void LHelpDef(char *key, char *message); LDEFINE(name, ltype, doc) LDECLARE((name, LBEGIN, ..., LEND)); Geometry Center Oct 22 1992 1 lisp(3) lisp(3) DESCRIPTION Geomview contains a minimal lisp interpreter for parsing and evaluating commands. This lisp interpreter is part of the "-loogutil" library and thus any program which links with this library may use the interpreter. This provides a simple but powerful way to build up a command language. This manual page assumes that you are familiar with the syntax of lisp. The first part describes the basics of using the interpreter. Some gory details that don't con- cern most users then follow. The main steps in using the lisp interpreter are 1. call Linit() to initialize the interpreter 2. make calls to LDefun(), one for each lisp function you want the interpreter to know about 3. define the "i/o lake" 4. parse input with calls to LSexpr() and evaluate the resulting lisp objects with LEval() (or use LEvalSexpr() to combine both steps). For example the following code defines a single function "f" and executes commands from standard input: #include "lisp.h" Lake *lake; LObject *obj, *val; LInit(); LDefun("f", f, NULL); lake = LakeDefine(stdin, stdout, NULL); while (!feof(stdin)) { obj = LSexpr(lake); val = LEval(obj); LFree(obj); LFree(val); } The second argument to LDefun() is a function pointer; LDefun() sets up a correspondence between the string "f" and the function f, which is assumed to have been previ- ously declared. The section FUNCTION DEFINITIONS below gives the expected call syntax and behavior of such func- tions. (The third argument to LDefun() is a pointer to a string which documents the function and may be NULL if you don't care about documentation.) LakeDefine() defines an i/o lake; this is a generalization of the notion of an i/o stream. Most programs don't need to use the generaliza- tion, though, and can simply pass FILE pointers as LakeDe- fine()'s first two arguments and NULL as the third one. The section LAKES below gives the details for those who are interested. LSexpr() [which stands for Lisp Symbolic EXPRession] parses a single lisp expression from the lake, returning a lisp object which represents that expression. Geometry Center Oct 22 1992 2 lisp(3) lisp(3) The lisp object is returned as an LObject pointer, which points to an opaque structure containing a representation of the expression. LEval() then evaluates the object; it is during the call to LEval() that the action of the expression takes place. Note that the last two lines of code in this example could have been replaced by the sin- gle line LEval(LSexpr(lake)) or, more efficiently, by LEv- alSexpr(lake). FUNCTION DEFINITIONS The functions defined by calls to LDefun() are expected to have a certain call syntax; LEval() calls them when it encounters a call to the lisp function named with the cor- responding string. The macro LDEFINE is provided for declaring them. For example: LDEFINE(f, LSTRING, "(f a b) returns a string representing the0um of the integer a with the floating point number b.") { int a; float b; char buf[20], *s; LDECLARE(("f", LBEGIN, LINT, &a, LFLOAT, &b, LEND)); sprintf(buf,"%f",a+b); s = strdup(buf); return LNew(LSTRING, &s); } The important things about this function are: 1. It is declared with the LDEFINE macro, the general syntax of which is LDEFINE(name, type, helpstr). name should be a valid C identifer and will be used to construct the actual name of the C function by prepending an 'L' and the name of the help string by prepending an 'H'. type should be a lisp object type identifier (see below) and determines the type of object that the function returns. helpstr is a documentation string. 2. The use of the LDECLARE macro. More about this below. 3. It returns an LObject *. All lisp functions must actually return a value. If you don't care what value they return you can return one of the pre-defined values Lnil or Lt (and specify LVOID as the type in the LDEFINE header). This particular example is a function which takes two arguments, an int and a float, and returns a string object representing their sum. A lisp call to this function might look like "(f 1 3.4)". Geometry Center Oct 22 1992 3 lisp(3) lisp(3) The LDECLARE macro, defined in lisp.h, sets up the corre- spondence between variables in the C code and arguments in the lisp call to the function. Note that the arguments to LDECLARE are delimited by *two* pairs of parentheses (this is because C does not allow macros with a variable number of arguments; LDECLARE thus actually takes one argument which is a parenthesized list of an arbitrary number of items). The general usage of LDECLARE is LDECLARE(( name, LBEGIN, , ..., LEND )); where name is the name of the function (as specified to LDefun()). is an argument specification, which in general consists of a lisp type identifier followed by an address. The identifier indicates the data type of the argument. The builtin type identifiers are LINT (inte- ger), LFLOAT (float), LSTRING (string), LLOBJECT (lisp object), and LLIST (lisp list). Applications may define additional types whose identifiers may also be used here; see the section CUSTOM LISP TYPES below for details. There may be any number of 's; the last must be followed by the special keyword LEND. STOP HERE Most users of the lisp interpreter can stop reading this man page here. What follows is only used in advanced sit- uations. EVALUATION OF FUNCTION ARGUMENTS Normally the lisp interpreter evaluates function arguments before passing them to the function; to prevent this eval- uation from happening you can insert the special token LHOLD in an LDECLARE argument specification before the type keyword. For example LHOLD, LLIST, &list, specifies an unevalutated list argument. This feature is really useful only for LLIST, LLOBJECT, and array types (see below) since the other types evalutate to themselves. ARRAYS In general an in the LDECLARE call consists of a keyword followed by the address of a scalar data type. Since it is relatively common to use a lisp list to repre- sent an array of values, however, the special keyword LARRAY is provided for dealing with them. It has a different syntax: it should be followed by a lisp type Geometry Center Oct 22 1992 4 lisp(3) lisp(3) identifier which specifies the type of the elements of the array and then by two addresses --- the address of an array and the address of an integer count. Upon entry to LDECLARE the count specifies how many elements may be written into the array. LDECLARE then modifies this num- ber to indicate the number of entries actually parsed. For example: LDEFINE(myfunc, ...) { float f[2]; int fn = 2; LDECLARE(("myfunc", LEBGIN LHOLD, LARRAY, f, &fn, LEND)); /* at this point the value of fn has been modified to be the number of entries actually appearing in the list argument; and this number of values have been written into the array f. */ ... } defines a function "myfunc" which takes a list of up to 2 floats as its only argument. Valid calls to "myfunc" would be "(myfunc ())", "(myfunc (7))", and "(myfunc (7 8))". Note the use of LHOLD; this is necessary because otherwise the lisp system would attempt to evaluate the list as a function call before passing it off to myfunc. OPTIONAL ARGUMENTS Normally the lisp interpreter will generate (to stderr) a reasonable error message if a function is called with fewer arguments than were specified in LDECLARE. Some functions, however, may have some arguments that are optional. You can define a function which takes optional arguments by putting the keyword LOPTIONAL after the last required argument in the LDECLARE call. Any arguments specified in the list after that are considered optional; the interpreter doesn't complain if they are not supplied. Note that all optional arguments must come after all required arguments. Normally excess arguments also elicit an error message. The LREST keyword allows control over this situation. If LREST is followed by a pointer to an LList * variable, then trailing arguments are parsed, evaluated (unless LHOLD was used), and the list of them is stored in the given variable. (Note that the value is an LList, not an LObject of type LLIST -- if there are no excess arguments, the value is NULL, not an empty LLIST.) If LREST is fol- lowed by a NULL pointer, excess arguments are silently Geometry Center Oct 22 1992 5 lisp(3) lisp(3) ignored. LREST might be useful when a function's argument types are not known. It's not necessary to specify LEND after LREST. LISP OBJECTS The basic data type of the lisp interpreter is the lisp object; it is represented by an LObject pointer, which points to an opaque data structure. The functions for manipulating lisp objects (i.e. the object's methods) are: LNew(): creates a new lisp object of the given type with the given value. The "type" argument is one of the values LSTRING or LLIST, or a type pointer defining a custom object type (see CUSTOM OBJECT TYPES below). LRefIncr(): increments the reference count of a lisp object. The lisp interpreter uses the convention that when a procedure returns a lisp object, the caller owns the object and thus has responsibility for freeing it. LRefIncr() can be used to increment the reference count of an existing object about to be returned. New objects created by LNew() have their reference count initialized to 1 and hence do not need to be LRefIncr()'ed. LRefDecr(): decrements the reference count of a lisp object. This should probably not be called by application programs; it is used internally. LWrite(): writes a formatted string representation of a lisp object to a stream. LFree(): free the space assoicated with a lisp object LCopy(): construct a copy of a lisp object CUSTOM OBJECT TYPES In addition to the predefined lisp object types you may define your own custom types. This is done by construct- ing a structure containing various function pointers for manipulating objects of your new type. The address of this structure is then the type identifier for this type and may be used in LDECLARE 's and in LNew() calls. (The type names LINT, LSTRING and the other builtin types are actually pointers to predefined struc- tures.) The structure is of type LType as defined in lisp.h: struct LType { /* name of type */ char *name; /* size of corresponding C type */ int size; Geometry Center Oct 22 1992 6 lisp(3) lisp(3) /* extract cell value from obj */ int (*fromobj)(/* LObject *obj, void *x */); /* create a new LObject of this type */ LObject *(*toobj)(/* void *x */); /* free a cell of this type */ void (*free)(/* void *x */); /* write a cell value to a stream */ void (*write)(/* FILE *fp, void *x */); /* test equality of two cells of this type */ int (*match)(/* void *a, void *b */); /* pull a cell value from a va_list */ void (*pull)(/* va_list *a_list, void *x */); /* parse an object of this type */ LObject *(*parse)(/* Lake *lake */); /* magic number; always set to LTypeMagic */ int magic; }; The void * pointers in the above point to objects of the type you are defining. For examples of how to define new types see the code in lisp.c that defines the string and list types. See also the file TYPES.DOC in the lisp source code directory for further details. LISTS The LList pointer is used to refer to objects of type LLIST, which implement a linked list. The operations on these objects are LListNew(), LListLength(), LListEntry(), LListAppend(), LListCopy(), and LListFree(). These are mostly used internally by the lisp system but are avail- able for outside use. Maybe I'll write more documentation for them later if it seems necessary. LAKES The Lake structure is a generalization of an input stream. It contains three members: an input FILE pointer ("streamin"), an output FILE pointer ("streamout"), and an arbitrary pointer ("river"). The input FILE pointer is required; the lisp interpreter assumes that every lake has a valid input file pointer. The output FILE pointer is required if you do any operations that result in the intepreter producing any output. The third pointer may point to whatever you want. The lisp interpreter itself does not directly refer to this pointer. It may be used by the parser that you supply when defining a new lisp Geometry Center Oct 22 1992 7 lisp(3) lisp(3) object type. The term "Lake" is supposed to connote something more gen- eral than a stream; it also seemed particularly appropri- ate since this interpreter was written in the City of Lakes. HIDDEN LAKE ARGUMENTS AND OTHER WET THINGS This section is X rated. Don't read it unless you are really serious. The lisp interpreter works by first parsing (LSexpr()) an expression then evaluating it (LEval()). The LDECLARE macro is a mechanism which allows both the syntax (for parsing) and the semantics (for evaluation) of an expres- sion to be specified in the same convenient place --- at the top of the C function which implements the function. The call syntax of all such C functions is LObject *func(Lake *lake, LList *args) When parsing a call to the corresponding lisp function, LSexpr() calls func with that lake pointer, and with args pointing to the head of the list in the parse tree corre- sponding to this function call. LDECLARE parses the argu- ments in the call (by reading them from the lake) and appends them to this list. (Note: the head of this list is the function itself, so the first argument becomes entry #2 in the list.) When evaluating the function call, LEval() calls func with lake=NULL and with args pointing to the call's argument list. (In this case the first entry of the list is the first argument.) LDECLARE then converts the arguments in the list into the appropriate C data types, writing their values into the addresses in the s. One side-effect of using lake=NULL as the signal to evalu- ate rather than to parse is that the value of the lake pointer is not available at evaluation time. Some func- tions, however, may want to do something with the lake they were parsed from. For example, the "write" function in geomview writes data to the output stream associated with its input stream. (In geomview these streams are all stored in a general "Pool" structure which is retained as the "river" member of the lake.) The special token LLAKE may be used to cause the lake pointer to be saved in the args list at parse time and written into a variable at evaluation time. It is used exactly like the other Geometry Center Oct 22 1992 8 lisp(3) lisp(3) (scalar) argument keywords: LObject *func(Lake *lake, LList *args) Lake *mylake; LDECLARE(("myfunc", LBEGIN LARG_LAKE, &mylake, ... LARG_END)); At evaluation time LDECLARE will set mylake to have the value that lake had at parse time. This looks just like a specification for an argument to the lisp function but it is not --- it is just a way to tell LDECLARE to remember the lake pointer between parse- and evaluation-time. BUGS The documentation is incomplete. AUTHOR The lisp interpreter was written mostly by Mark Phillips with lots of input and moral support from Stuart Levy and Tamara Munzner. Geometry Center Oct 22 1992 9 geomview-1.9.4/doc/README.gvplot0000644000175000001440000002112510600574472013231 00000000000000 gvplot, writeoogl -- Maple 3-D graphics in Geomview Contents: Installation Outline (out of date) Maple's Library Directory Configurable Settings in gvplot Remote Display ******************************************************************************* NOTE: the installation instructions are out of date. Please have a look at `savegvplot.mws'; load that file with xmaple and try to guess what to do from the contents of that file. Nevertheless it may be helpful to read through _this_ file; it contains more information than just installation instructions. ******************************************************************************* This Maple package supports displaying Maple 3-D graphic objects (produced for example by Maple's plot3d function) in Geomview, and saving Maple graphics objects as Geomview-readable OOGL files. Maple 2-D graphics aren't supported. This distribution (in src/bin/geomutil/maple2oogl in the Geomview source distribution) includes Maple source files. You'll want to run Maple to produce library (.m) files from the source files, and possibly to install them in the Maple library directory to be accessible via readlib(gvplot). This process is handled by the "make install" command described here. Documentation for the package itself is available within Maple after installation; for example, type readlib(gvplot); ?gvplot To install this package: * Edit gvplot.mapleV3 or gvplot.mapleV4 (according to your version of Maple), possibly changing the settings of default_gvcommand and default_gvdirectories; see "Configurable Settings" and "Remote Display", below. * Determine the directory into which new Maple library (.m) files should be placed; see "Maple's Library Directory". This will be the setting of MAPLE_LIB. A typical value might be /usr/local/maple/lib. * If geomview, togeomview, and remotegv aren't already on the search path of everyone who'll want to use the program, determine which directory they are (or will be) placed in, e.g. /usr/local/bin. This will be the setting of BINDIR. * If you have the source distribution, edit makefiles/mk.site.default (relative to the top of the geomview distribution) and set MAPLE_LIB and BINDIR to the appropriate values. * Make sure "maple" is on your search path. * Run make install or, if you didn't set MAPLE_LIB and BINDIR in mk.site.default, give those values explicitly on the "make" command line: make install MAPLE_LIB=maple_library_directory BINDIR=binary_directory Maple V4 users: since the Geometry Center doesn't have Maple V4, we haven't been able to test that "make install" correctly determines the version of Maple if you have release 4. If you have trouble, try invoking the MapleV4 installation directly with make install_v4 MAPLE_LIB=maple_lib_dir BINDIR=binary_dir MAPLE'S LIBRARY DIRECTORY For convenient invocation, it's best to put the compiled Maple code for this package -- the file gvplot.m -- in some directory known to Maple. Users can then invoke it by typing readlib(gvplot); Since Maple V.2, Maple keeps a list of library directory names in the global variable "libname". Its default value is typically the single directory `/usr/local/maple/lib`; you can check its actual value by running Maple and typing libname; You can configure Maple to add other directories (e.g. for locally- installed rather than Maple-supplied packages) to the libname list for all users. Briefly, you create a "src" subdirectory of the default library directory (e.g. /usr/local/maple/lib/src) and create a file there named "init" containing something like libname := libname, `/usr/local/maple/otherstuff`: You could then place library files in /usr/local/maple/otherstuff, and/or set MAPLE_LIB = /usr/local/maple/otherstuff in makefiles/mk.site.default. Configurable Settings in gvplot Two values in the "gvplot" script are configurable: default_gvcommand, the UNIX command used to invoke geomview. It's normally "geomview", but might specify some geomview options, or might be "remotegv" if you'll want to run maple on one system and display via geomview on another. default_gvdirectories, the directory(ies) (in addition to those in the normal UNIX search path) to find the programs "togeomview" and "geomview". There's no default; this is correct if these programs are installed on everyone's search path, e.g. in /usr/local/bin. This value is automatically configured as part of the "make install" process and probably won't need to be messed with. It can be set to a colon-separated list of directories. It can be useful to invoke something other than simply "geomview" to display Maple graphics; for example, one might start geomview with options to position its window, or with a special startup script. To adjust this, change the setting of "gvcommand" near line 45, as in default_gvcommand := `geomview -nopanels -wpos 640x480@0,0`; To regenerate the library (.m) file after such changes, start a fresh Maple session, read the source file, and save the library file: read(`gvplot`); save(`/usr/local/maple/lib/gvplot.m`); REMOTE DISPLAY It's possible to run Maple on one system and display Geomview graphics on another. This can sometimes be done by using the X "DISPLAY" environment variable, so that Maple and Geomview run on one machine but Geomview's windows appear elsewhere. But for fastest graphics, it's better if you can run Geomview on the computer where the display is. To have the gvplot package invoke Geomview on another machine, make it invoke "remotegv" rather than "geomview". You can make "remotegv" the default for all gvplot users by editing the gvplot source and changing the setting of "default_gvcommand" near line 45. Or, a user can adjust the setting of "gvcommand" within each session, saying e.g. readlib(gvplot); gvcommand := `remotegv -h slevy@gauss`; remotegv attempts to guess which machine to invoke geomview on by examining the DISPLAY environment variable. If DISPLAY isn't set or if geomview should run on a different machine, use the -h host option. The script also assumes that geomview should display on the machine where it is invoked, so for that copy of geomview, it sets DISPLAY to ":0". If the display should appear elsewhere (on an X terminal, say), use the -display option. Remotegv uses "rsh" (remote shell) to pass data to the other computer, so the remote computer must allow this -- either with an entry in /etc/hosts.equiv, or in a .rhosts file in the user's home directory on the machine where geomview will run. The account name on the other machine is assumed to be the same as on this machine; if different, use the -l username or -h username@othermachine options. In case permissions are not set up correctly, the symptom is liable to be a "Permission denied." message followed by the immediate termination of the Maple process -- so if you're using it for the first time, check it out before doing much else in your Maple session! Sorry, but MapleV3 is just not very good at connecting to other programs. Note that togeomview and geomview MUST BE IN THE USER'S DEFAULT SEARCH PATH on the remote machine. To use this script within Maple, you'd say: readlib(gvplot); then gvcommand := `remotegv`; or e.g. gvcommand := `remotegv -h othermachine -display myxterm:0`; or, if the account on the other machine is different from yours, gvcommand := `remotegv -l otheraccount`; or gvcommand := `remotegv -h otheraccount@othermachine`; Following any remotegv options, you can add the command to be invoked as geomview, possibly including options, as in: gvcommand := `remotegv -l person /u/person/bin/geomview -wpos 300x200`; Once gvcommand is properly set, you can use gvplot() as usual. Normally, error messages reporting problems on the other machine (for example, being unable to run geomview) are suppressed; this is unfortunately necessary, or you'd never get another Maple prompt until quitting from geomview. There's a test mode to aid in tracing problems; use it as in gvcommand := `remotegv -test -h othermachine`; i.e. add "-test" to whatever other options you'd give to remotegv. Summary of remotegv options: -l user or -l user@host -h host or -h user@host -display host:number (set display on remote end) -test also accepts togeomview's options (-g, -M[c][g][p][s]). Invokes rsh to specified machine, invokes togeomview there by default. By default, we assume DISPLAY points to the machine where we'd like to be; -h {host-portion-of-DISPLAY} -display :0 Incorporates settings from "$RGVOPTS" environment variable. geomview-1.9.4/doc/version.texi0000644000175000001440000000014110663305731013411 00000000000000@set UPDATED 23 August 2007 @set UPDATED-MONTH August 2007 @set EDITION 1.9.4 @set VERSION 1.9.4 geomview-1.9.4/doc/motion.tex0000644000175000001440000000647007730233202013065 00000000000000\magnification=\magstep2 \centerline{Mathematical Formulas for Geomview's Motion Model} \centerline{Mark Phillips \& Nathaniel Thurston} \smallskip \centerline{Originally written sometime around late 1992} \centerline{Updated in March 2001} \bigskip The model that Geomview uses for object motions involves 3 objects for each motion: a {\it moving} object, a {\it center} object, and a {\it frame} object. As the name suggests, the {\it moving} object is the one that actually moves. The motion happens in an imaginary coordinate system obtained by (parallel) translating the coordinate system of the {\it frame} object to the origin of the {\it center} object coordinate system. To compute and apply a motion, we think of it as happening in this imaginary coordinate system (e.g. a ``rotation of 10 degrees around the X axis''). But we want to apply it to the {\it moving} object, which we have in its own coordinate system. This note explains how to do this. First, some notation. Think of a Geomview world as a copy of ${\bf R}^3$ with many different coordinate system representations. If $S$ is a coordinate system and $x \in {\bf R}^3$ is a point, we write $[x]_S$ to denote the coordinates of $x$ in $S$. Also, if $V: {\bf R}^3 \rightarrow {\bf R}^3$ is a projective transformation of ${\bf R}^3$, write $[V]_S$ to denote the ($4 \times 4$) matrix that represents $V$ in $S$. Let \smallskip \halign{\indent\indent#&#&#\hfil\cr $m$ & = & coord sys of moving object\cr $c$ & = & coord sys of center object\cr $f$ & = & coord sys of frame object\cr $f'$ & = & $f$ translated to origin of $c$\cr $U$ & = & universal coord sys\cr } \smallskip With this notation we can now precisely state the problem: If $V$ is a transformation, express $[V]_m$ in terms of $[V]_{f'}$. (We know $[V]_{f'}$ and need to compute $[V]_m$.) To do the computation we will need several change-of-coordinate matrices. If $S$ is a coordinate system, let $T_S$ be the matrix which changes $S$ coordinates into $U$ (universal) coordinates. So: \smallskip \halign{\indent\indent#&#&#&#\cr $[x]_U$ &= & $[x]_m$ & $\cdot \quad T_m$\cr $[x]_U$ &= & $[x]_c$ & $\cdot \quad T_c$\cr $[x]_U$ &= & $[x]_f$ & $\cdot \quad T_f$\cr $[x]_U$ &= & $[x]_{f'}$ & $\cdot \quad T_{f'}$\cr } \smallskip \noindent $T_m$, $T_c$, and $T_f$ can easily be computed from the position of $m$, $c$, and $f$ in the world heirarchy. $T_{f'}$ can be computed as follows. Let $p$ be the origin of $c$; so $[p]_c = [0, 0, 0, 1]$. The coordinates of $p$ in $f$ are \smallskip \halign{\indent\indent#&#&#&#\hfil\cr $[p]_f$ &= & $[p]_c $ & $\cdot T_c \cdot T_{f}^{-1}$\cr &= & $[0, 0, 0, 1] $ & $\cdot T_c \cdot T_{f}^{-1}$\cr } \smallskip \noindent If $P$ is the translation that takes the origin of $f$ to $p$, then $[P]_f$ is the matrix whose bottom row is $[p]_f$. Then $T_{f'} = [P]_f \cdot T_f$. (Another way to think of this is that $[P]_f$ is the matrix which changes $f'$ coordinates into $f$ coordinates.) $[V]_m$ can now be computed in terms of $[V]_{f'}$ as follows: \smallskip \halign{\indent\indent#&#&#&#&#&#&#\hfill\cr $[V]_m$ & = & $T_m \cdot$ & $T_{f'}^{-1}$ & $\cdot [V]_{f'}$ & $\cdot T_{f'}$ & $\cdot T_m^{-1}$\cr $[V]_m$ & = & $T_m \cdot$ & $T_f^{-1} \cdot {[P]_f}^{-1}$ & $\cdot [V]_{f'}$ & $\cdot [P]_f \cdot T_f$ & $\cdot T_m^{-1}$\cr } \end geomview-1.9.4/doc/geomview.html/0000777000175000001440000000000010663301507013703 500000000000000geomview-1.9.4/doc/geomview.html/figtrefdodec.html0000644000175000001440000000011010663301507017122 00000000000000 geomview-1.9.4/doc/geomview.html/Copying.html0000644000175000001440000007066110663301507016127 00000000000000 Copying - Geomview Manual

Next: , Previous: Distrib, Up: Top


Copying

     NOTE: Geomview is distributed under the GNU LESSER GENERAL PUBLIC
     LICENSE.  For the purposes of this license we think of Geomview as if it
     were a "library", and of Geomview external modules as "programs that
     link with the library".  We do this because we specifically want to
     allow proprietary programs and modules to use Geomview.

GNU LESSER PUBLIC LICENSE

Version 2.1, February 1999
     Copyright © 1991, 1999 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.
     
     [This is the first released version of the Lesser GPL.  It also counts
      as the successor of the GNU Library Public License, version 2, hence
      the version number 2.1.]

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software–to make sure the software is free for all its users.

This license, the Lesser General Public License, applies to some specially designated software packages–typically libraries–of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.

When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.

To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.

For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.

We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.

To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.

Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.

Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.

When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.

We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.

For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.

In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.

Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.

The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  1. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".

    A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.

    The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)

    "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.

    Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.

  2. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.

    You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

  3. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
    1. The modified work must itself be a software library.
    2. You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
    3. You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
    4. If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.

      (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)

    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.

    In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

  4. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. ^L Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.

    This option is useful when you wish to copy part of the code of the Library into a program that is not a library.

  5. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.

    If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.

  6. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.

    However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.

    When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.

    If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)

    Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.

  7. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.

    You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:

    1. Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
    2. Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
    3. Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
    4. If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
    5. Verify that the user has already received a copy of these materials or that you have already sent this user a copy.

    For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

    It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.

  8. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
    1. Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
    2. Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
  9. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
  10. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
  11. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
  12. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.

    If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.

    It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

    This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

  13. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
  14. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

    Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.

  15. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

    NO WARRANTY

  16. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  17. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).

To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.

     one line to give the library's name and a brief idea of what it does.
     Copyright (C) <year>  name of author
     
     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Lesser General Public
     License as published by the Free Software Foundation; either
     version 2 of the License, or (at your option) any later version.
     
     This library is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     Lesser General Public License for more details.
     
     You should have received a copy of the GNU Lesser General Public
     License along with this library; if not, write to the Free Software
     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:

     Yoyodyne, Inc., hereby disclaims all copyright interest in the
     library `Frob' (a library for tweaking knobs) written by James
     Random Hacker.
     
     <signature of Ty Coon>, 1 April 1990
     Ty Coon, President of Vice

That's all there is to it! geomview-1.9.4/doc/geomview.html/quote.html0000644000175000001440000000315310663301507015644 00000000000000 quote - Geomview Manual

Next: , Previous: quit, Up: GCL Reference


7.2.97 quote

(quote EXPR)
returns the symbolic lisp expression EXPR without evaluating it.
geomview-1.9.4/doc/geomview.html/Unix-Binary-Detail.html0000644000175000001440000001154010663301507020053 00000000000000 Unix Binary Detail - Geomview Manual

10.1.1 Details of the Unix Binary Installation

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

The install script should be self-explanatory; just run it and answer the questions. This section gives some details for system administrators and other users who may want to know more about the installation.

The installation is actually done by make; the install script queries the user for the settings of the following make variables and then invokes make install.

GEOMROOT:
the absolute pathname of the Geomview root directory. The geomview shell script, which is what users invoke to run Geomview, uses this to set various environment variables that Geomview needs. It is very important that this be an absolute pathname — i.e. it should start with a '/'.
BINDIR:
a directory where executable files are installed. The geomview shell script goes here, as well as various other auxiliary programs that can be used in conjunction with geomview. This should be a directory that is on users' $path. These auxiliary programs are distributed in the $GEOMROOT/bin/<MACHTYPE> directory; if you specify this directory for BINDIR, they are left in that directory.
MANDIR:
a directory where Unix manual pages are installed. These are distributed in the $GEOMROOT/man subdirectory; if you specify this directory for MANDIR, they are left in that directory.
MMAPACKAGEDIR:
a directory where Mathematica packages are installed. This should be a directory that Mathematica searches for packages that it loads; you can see what directories your Mathematica searches by looking at the value of the $Path variable in a Mathematica session. The installation process will install some packages there which allow you to use Geomview to display Mathematica graphics. These packages are distributed in the $GEOMROOT/mathematica subdirectory; if you specify this directory for MMAPACKAGEDIR, or if you specify the empty string for MMAPACKAGEDIR, the packages are left in that directory. For more details about the way these Mathematica packages connect to Geomview, see Package Installation.
geomview-1.9.4/doc/geomview.html/pick_002dinvisible.html0000644000175000001440000000342510663301507020071 00000000000000 pick-invisible - Geomview Manual

Next: , Previous: pick, Up: GCL Reference


7.2.90 pick-invisible

(pick-invisible [yes|no])
Selects whether picks should be sensitive to objects whose appearance makes them invisible; default yes. With no arguments, returns current status.
geomview-1.9.4/doc/geomview.html/dimension.html0000644000175000001440000000346710663301507016504 00000000000000 dimension - Geomview Manual

Next: , Previous: dice, Up: GCL Reference


7.2.28 dimension

(dimension [N])
Sets or reads the space dimension for N-dimensional viewing. (Since calculations are done using homogeneous coordinates, this means matrices are (N+1)x(N+1).) With no arguments, returns the current dimension, or 0 if N-dimensional viewing has not been enabled.
geomview-1.9.4/doc/geomview.html/merge_002dap.html0000644000175000001440000000347710663301507016665 00000000000000 merge-ap - Geomview Manual

Next: , Previous: merge, Up: GCL Reference


7.2.70 merge-ap

(merge-ap GEOM-ID APPEARANCE)
Merge in some appearance characteristics to GEOM-ID. Appearance parameters include surface and line color, shading style, line width, and lighting.
geomview-1.9.4/doc/geomview.html/ND_002dxform_002dset.html0000644000175000001440000000412610663301507020053 00000000000000 ND-xform-set - Geomview Manual

Next: , Previous: ND-xform-get, Up: GCL Reference


7.2.79 ND-xform-set

(ND-xform-set OBJID [ntransform { idim odim ... }])
Sets the N-D transform of the given object. In dimension N, this is an (N+1)x(N+1) matrix, so in that case idim and odim are expected to be both equal to (N+1). Note that all cameras in a camera-cluster have the same N-D transform. Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.
geomview-1.9.4/doc/geomview.html/lines_002dcloser.html0000644000175000001440000000412310663301507017554 00000000000000 lines-closer - Geomview Manual

Next: , Previous: interest, Up: GCL Reference


7.2.61 lines-closer

(lines-closer CAM-ID DIST)
Draw lines (including edges) closer to the camera than polygons by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default. If DIST is too small, a line lying on a surface may be dotted or invisible, depending on the viewpoint. If DIST is too large, lines may appear in front of surfaces that they actually lie behind. Good values for DIST vary with the scene, viewpoint, and distance between near and far clipping planes. This feature is a kludge, but can be helpful.
geomview-1.9.4/doc/geomview.html/figcolorchooser.html0000644000175000001440000000011310663301507017667 00000000000000 geomview-1.9.4/doc/geomview.html/image.html0000644000175000001440000003540210663301507015573 00000000000000 image - Geomview Manual

Next: , Previous: appearance, Up: Non-geometric objects


4.3.2 Image Objects

Image objects are used to specify pixmap data for either textures (see Texture Mapping), or for background images of cameras (see Camera objects).

At the time of this writing images are comprised of 1 to 4 channels, a channel provides a single number in the range from 0 to maxval for each pixel; and maxval is tied to 255. The interpretation of the image data depending on the number of channels is like follows:

#Channels Channel No. Interpretation
1 1 greyscale or luminance data
2 1 greyscale or luminance data
2 alpha channel (0: transparent, maxval: opaque)
3 1 red channel
2 green channel
3 blue channel
4 1 red channel
2 green channel
3 blue channel
4 alpha channel (0: transparent, maxval: opaque)

Image data can be specified inline (embedded into the current data stream) or via file references; in both cases the data is read in and interpreted at the time the image object is parsed. This is different from the old (and deprecated) texture image specification, where the the image data on-disk would eventually be re-read by Geomview.

The general syntax of image objects is like follows:

     <image> ::=
       [ "{" ]             (curly brace, generally needed to make
                            the end of the object unambiguous.)
       [ "image" ]          (optional keyword; unnecessary if the type
                            is determined by the context, which it
                            usually is.)
       [ "define" <name> ]
                            (defines an image named <name>, setting
                            its value from the stuff which follows)
       |
           "<" <filename>   (meaning: read image from that file)
       |
           ":" <name>       (meaning: use variable name,
                            defined elsewhere; if undefined the image
                            carries no data)
       |
                            (actual stuff defining the image; image data
                            must come last, after defining the width and
                            height and number of channels)
     
           "width"          (width of the image, auto-detected from image data
                            if possible)
     
           "height"         (height of the image, auto-detected from image data
                            if possible)
     
           "channels"       (number of channels, auto-detected from image data
                            and data specifications, if possible)
     
           "maxval"         (unsupported, must be 255 if specified)
     
           "data DESTMASK [FILTER] [{] < FILENAME [}]"
           "data DESTMASK [FILTER] DATASIZE [{][\n]LITERAL_IMAGE_DATA[}]"
                            (either external or embedded image data, see below
                            for a detailed description of the meaning of
                            MASK and FILTER. An image can (and
                            has, in general) multiple data sections.)
     
       [ "}" ]             (matching curly brace)

Details concerning the image data specification:

`DESTMASK'
This is a bit-field describing where the specified image data should be placed in the destination pixmap. The bit-field is specified by an integer in one of the known formats (decimal, octal, hexadecimal). The channels of the source data are always enumbered consecutively. If, e.g. `FILENAME' or `LITERAL_IMAGE_DATA' specify a three-channel (probably RGB ...) image and `DESTMASK' equals 0xD (i.e. bit 1 is 0), then the 3rd channel of the source pixmap would be placed in the 4th channel of the destination image object (the alpha channel), the 2nd source channel would determine the `blue' destination value and the 1st source channel the `red' destination value.

The number of channels of the source data always has to match the number of bits set in `DESTMASK'. Exception: if the source pixmap has only one channel, then it can be used to fill any number of destination channels; all channels specified in `DESTMASK' are filled with the data of the single channel source pixmap.

Geomview knows the following symbolic constants, which can be used instead of specifying the `DESTMASK' bit-field numerically:

LUMINANCE
same as `1', `0x1', `\01'
LUMINANCE_ALPHA
same as `3', `0x3', `\03'
RGB
same as `7', `0x7', `\07'
RGBA
same as `15', `0xf', `\017'
ALPHA
depends on the context: the absolute number of channels must be known; i.e. `data ALPHA ...' must be prepended by something determining the number of channels of the image, e.g.
               ...
               data RGB ...
               data ALPHA
               ...
          

is valid, but

               <no other channel or image data specification>
               data ALPHA ...
               <whatever else ...>
          

is not valid, because Geomview has not means to determine the destination channel from the context.

AUTO
PGM image data is interpreted as single grey-scale channel, RGB PNM data as RGB image data. AUTO cannot work with `raw' image data.

`FILTER'
The `FILTER' specification is optional. If it is missing, then Geomview tries to determine the image type from the `FILENAME' suffix. If there is no suffix or the suffix is unknown, or for embedded image data, Geomview is able to auto-detectc SGI image file formats (for historical reasons ...) and NetPBM image formats (for practical reasons). The auto-detection of NetPBM formats includes the new PAM image format which allows (among other things) to store an alpha channel together with the luminance or RGB data. Likewise, the final output of any of the specified filters must either be in SGI image file format, or specify a PAM, PNM or PGM image. If the image file format cannot be determined by either the filenmae suffix or the filter specification or by auto-deteciong of SGI or NetPBM data, then Geomview assume that it is raw-data. See below.

The decompression filters may be prepended to either one of the know image formats or an explicitly specified filter, e.g. the following is valid:

          data LUMINANCE raw.gzip { < gzippedgreymapfile }
     

The above should be equivalent to

          data LUMINANCE raw { < greymapfile },
     

provided that the decompressed data carries single channel data, with the first pixel corresponding to the lower-left corner (because of the `raw' image format, see below).

Geomview has builtin knowledge for the following filters/suffixes:

Data Decompression
`z'
`gz'
`gzip'
data is piped through `gzip -dc'
`bz2'
`bzip2'
data is piped through `bzip2 -dc'

Image Formats
`tiff'
`tif'
TIFF image file format. Only supported if the tifftopnm executable can be fond in the current excution path.
`png'
PNG image file format. Only supported if the pngtopnm executable can be fond in the current excution path.
`jpg'
`jpeg'
JPEG image file format. Only supported if the jpegtopnm executable can be fond in the current excution path.
`gif'
GIF image file format. Only supported if the giftoppm executable can be fond in the current excution path.
`raw'
Raw image data; the number of channels must match the number of bits set in `DESTMASK'. Pixels are specified with 1 byte per channel. The pixels are organized in rows as `liminance[-alpha]' or `RGB[A]' samples. The left-most pixel is the first pixel in each data-row, the top-most image row must come first (this is just the same as the NetPBM convention, the image co-ordinate systems has its origin in the left/top corner, as usual).

Explicitly Specified Filters
If none of the suffixes specified above should match, then the suffix/filter is interpreted as an external filter program; the filter program must read from STDIN and write to STDOUT. The output must either be in SGI image format, or in PNM or PGM format. Otherwise the output data is interpreted as raw image data (see above).

Something like the following should work, provided that the program ${HOME}/bin/bububfilter exists, is executable and does something useful:

               ...
               data RGB "${HOME}/bin/bububfilter.bzip2" 7 { # binary data follows
               bububub
               }
               ...
          

Note that – prior to feeding the data to the `bububfilter' – Geomview will try to decompress the stuff with `bzip2 -dc'.

Missing image data: Normally, the number of image channels is determined automatically from the image data specifications; if the image specification carries an explicit number of channels via the channels keyword which exceeds the number of channels found in the image data specifications, or if the union of all `DESTMASK' specfications has holes, then missing luminance and RGB channels are initialized to 0, and a missing alpha-channel is initialized to maxval, i.e. omitting the alpha channel data for an RGBA image is just the same as defining an RGB image. geomview-1.9.4/doc/geomview.html/System-Module-Installation.html0000644000175000001440000000627010663301507021660 00000000000000 System Module Installation - Geomview Manual

6.7.2 System Module Installation

To install a module so that it is available to all Geomview users do the following

1.
Create a file called .geomview-module where module is the name of the module. This file should contain a single line which is an emodule-define command for that module:
          (emodule-define "New Module" "newmodule")
     

The first argument, "New Module" above, is the string that will appear in the Modules browser. The second string, "newmodule" above, is the Bourne shell command for invoking the module. It may include arguments, and you may assume that the module is on the $path searched by the shell.

2.
Put a copy of the .geomview-module and the module executable itself in Geomview's modules/<CPU> directory, where <CPU> is your system type.

After these steps, the new module should appear, in alphabetical position, in the Modules browser of Geomview's Main panel next time Geomview is run. The reason this works is that when Geomview is invoked it processes all the .geomview-* files in its modules directory. It also remembers the pathname of this directory and prepends that path to the $path of the shell in which it invokes such a module. geomview-1.9.4/doc/geomview.html/Surface-normal-directions.html0000644000175000001440000000432210663301507021525 00000000000000 Surface normal directions - Geomview Manual

4.1.5 Surface normal directions

Geomview uses normal vectors to determine how an object is shaded. The direction of the normal is significant in this calculation.

When normals are supplied with an object, the direction of the normal is determined by the data given.

When normals are not supplied with the object, Geomview computes normal vectors automatically; in this case normals point toward the side from which the vertices appear in counterclockwise order.

On parametric surfaces (Bezier patches), the normal at point P(u,v) is in the direction dP/du cross dP/dv. geomview-1.9.4/doc/geomview.html/ND-Transformation-matrices.html0000644000175000001440000000505210663301507021621 00000000000000 ND Transformation matrices - Geomview Manual

4.1.7 ND Transformation matrices

In the context of N-dimensional space (N < 3) some objects incorporate (N+1)x(N+1) real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is an (N+1)-element row vector representing homogeneous coordinates of a point in the OOGL object, and A (N+1)x(N+1) is the matrix, then the transformed point is p' = p A.

Note that (unlike for the 4x4 transformation matrices, see Transformation matrices) the homogeneous component is located at index zero, so the translation components for Euclidean transformations appear in the zero-th row (first (N+1) elements). A's first column (at column index zero) is typically 1, 0, ..., 0. geomview-1.9.4/doc/geomview.html/Pronunciation.html0000644000175000001440000000370610663301507017343 00000000000000 Pronunciation - Geomview Manual

Next: , Previous: Platforms, Up: Top


How to Pronounce “Geomview“

The word 'Geomview' is a combination of the first syllable of the word 'geometry', and the word 'view'. The authors pronounce it with the accent on the first syllable

       GE-om-view

Some people put the accent on the second syllable, where it falls in the word 'geometry', but the original authors, who invented the name, prefer the accent-on-first-syllable pronunciation. geomview-1.9.4/doc/geomview.html/not.html0000644000175000001440000000333410663301507015310 00000000000000 not - Geomview Manual

Next: , Previous: normalization, Up: GCL Reference


7.2.87 not

(not EXPR)
Evaluates EXPR; if EXPR returns a non-nil value, returns nil, if EXPR returns nil, return t.
geomview-1.9.4/doc/geomview.html/ntransform.html0000644000175000001440000001317410663301507016704 00000000000000 ntransform - Geomview Manual

Next: , Previous: transform, Up: Non-geometric objects


4.3.4 ND-Transform Objects

Where – in the context of ND-viewing – a single (N+1)x(N+1) matrix is expected – as in the INST ntransform field, or the ND-xform* (see GCL) commands – use an ntransform object.

ntransform are NRows x NCols transformation matrix where usually NRows = N+1 in the context of N-dimensional objects and viewing. The homogeneous component of an ntransform sits at column zero (in contrast to ordinary transform objects where it is located at column three). ntransform objects operate on points of any dimension: if a point is to be transformed by an ntransform object and the dimension of the point does not match the number of rows of the ntransform object, then either the point is implicitly padded with zeros to match NRows or the matrix is implicitly padded with ones down its diagonal (and zeros everywhere else) such that it will operate as identity on the excess dimensions of the input point.

Syntax for an ntransform object is

     <ntransform> ::=
       [ "{" ]             (curly brace, generally needed to make
                            the end of the object unambiguous.)
     
        [ "ntransform" ]    (optional keyword; unnecessary if the type
                            is determined by the context, which it
                            usually is.)
     
        [ "define" <name> ]
                            (defines a transform named <name>, setting
                            its value from the stuff which follows)
     
          NRows NCols
                            (number of rows and columns of the matrix,
                            typically N+1 N+1, but any dimensions
                            are possible)
          <NRows x NCols floating-point numbers>
                            (interpreted as a NRows x NCols
                            homogeneous transform given row by row, intended
                            to apply to a row vector multiplied on its LEFT,
                            so that e.g. Euclidean translations appear in the
                            top row -- in contrast to the ordinary
                            transform objects where the translations appear
                            in the bottom row)
        |
           "<" <filename>  (meaning: read transform from that file)
        |
           ":" <name>      (meaning: use variable <name>,
                           defined elsewhere; if undefined the initial
                           value is the identity transform)
     
      [ "}" ]             (matching curly brace)

The whole should be enclosed in { braces }. Braces are not necessarily essential, so e.g. two integers – NRows NCols – followed by a NRows x NCols array of floats standing alone may but needn't have braces.

Some examples, in contexts where they might be used:

     # Example 1: A GCL command to define a 6x6 transform called
     # "fred", a mere translation by the vector -3 0 1 1 0. This
     # transform is meant for a five dimensional space, with an homogeneous
     # component a index zero.
     
     (read ntransform { ntransform  define fred
              6 6
              1 -3 0 1 1 0
              0  1 0 0 0 0
              0  0 1 0 0 0
              0  0 0 1 0 0
              0  0 0 0 1 0
              0  0 0 0 0 1
         }
     )
     # Example 2: Set the ND-xform of an object -- a geometry or a camera
     # cluster. Given the definition above, this puts the object at (-3 0 1 1
     # 0) in the five dimensional space.
     
     (ND-xform-set focus : fred)
     
     # or
     
     (ND-xform-set g1 : fred)
geomview-1.9.4/doc/geomview.html/Common-syntax.html0000644000175000001440000000520410663301507017262 00000000000000 Common syntax - Geomview Manual

Next: , Previous: Conventions, Up: Conventions


4.1.1 Syntax Common to All OOGL File Formats

Most OOGL object file formats are free-format ASCII — any amount of white space (blanks, tabs, newlines) may appear between tokens (numbers, key words, etc.). Line breaks are almost always insignificant, with a couple of exceptions as noted. Comments begin with # and continue to the end of the line; they're allowed anywhere a newline is.

Binary formats are also defined for several objects; See Binary format, and the individual object descriptions.

Typical OOGL objects begin with a key word designating object type, possibly with modifiers indicating presence of color information etc. In some formats the key word is optional, for compatibility with file formats defined elsewhere. Object type is then determined by guessing from the file suffix (if any) or from the data itself.

Key words are case sensitive. Some have optional prefix letters indicating presence of color or other data; in this case the order of prefixes is significant, e.g. CNMESH is meaningful but NCMESH is invalid. geomview-1.9.4/doc/geomview.html/figmatpanel.html0000644000175000001440000000011610663301507016772 00000000000000 geomview-1.9.4/doc/geomview.html/stereowin.html0000644000175000001440000000465610663301507016537 00000000000000 stereowin - Geomview Manual

Next: , Previous: space, Up: GCL Reference


7.2.123 stereowin

(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])
Configure CAM-ID as a stereo window. no: entire window is a single pane, stereo disabled
horizontal: split left/right: left is stereo eye#0, right is #1.
vertical: split top/bottom: bottom is eye#0, top is #1.
colored: panes overlap, red is stereo eye#0, cyan is #1.

A gap of gapsize pixels is left between subwindows; if omitted, subwindows are adjacent. If both layout and gapsize are omitted, e.g. (stereowin CAM-ID), returns current settings as a (stereowin ...) command list. This command doesn't set stereo projection; use merge camera or camera to set the stereyes transforms, and merge window or window to set the pixel aspect ratio & window position if needed.

geomview-1.9.4/doc/geomview.html/dither.html0000644000175000001440000000315710663301507015772 00000000000000 dither - Geomview Manual

Next: , Previous: dimension, Up: GCL Reference


7.2.29 dither

(dither CAM-ID {on|off|toggle})
Turn dithering on or off in that camera.
geomview-1.9.4/doc/geomview.html/figcommandpanel.html0000644000175000001440000000011310663301507017624 00000000000000 geomview-1.9.4/doc/geomview.html/dump_002dhandles.html0000644000175000001440000000330310663301507017535 00000000000000 dump-handles - Geomview Manual

Next: , Previous: draw, Up: GCL Reference


7.2.31 dump-handles

(dump-handles)
Dump the list of currently active handles to stdout. This function is intended for internal debugging use only.
geomview-1.9.4/doc/geomview.html/hsphere_002ddraw.html0000644000175000001440000000345410663301507017554 00000000000000 hsphere-draw - Geomview Manual

Next: , Previous: hmodel, Up: GCL Reference


7.2.56 hsphere-draw

(hsphere-draw CAMID [yes|no])
Say whether to draw a unit sphere: the sphere at infinity in hyperbolic space, and a reference sphere in Euclidean and spherical spaces. If the second argument is omitted, yes is assumed.
geomview-1.9.4/doc/geomview.html/ui_002dpdf_002dviewer.html0000644000175000001440000000424210663301507020312 00000000000000 ui-pdf-viewer - Geomview Manual

Next: , Previous: ui-panel, Up: GCL Reference


7.2.137 ui-pdf-viewer

(ui-pdf-viewer VIEWER)
Use the executable VIEWER for viewing the PDF-version of the manual when the `Manual (PDF)' menu-item is selected in the `Help'-menu. If the (ui-pdf-viewer ...) command was never executed, then the default is to use the browser stored in the PDFVIEWER environment variable. If the environment variable is unset then the default is compile-time dependent.
geomview-1.9.4/doc/geomview.html/INST.html0000644000175000001440000002105010663301507015260 00000000000000 INST - Geomview Manual

Next: , Previous: SPHERE, Up: Object File Formats


4.2.9 INST Files

The conventional suffix for a INST file is .inst.

There is no INST BINARY format.

An INST applies a 4x4 (or (N+1)x(N+1) in the context of ND-viewing) transformation to another OOGL object. It begins with INST followed by these sections which may appear in any order:

     geom oogl-object

specifies the OOGL object to be instantiated. See References, for the syntax of an oogl-object. The keyword unit is a synonym for geom.

     transform   ["{"] 4x4 transform ["}"]

specifies a single transformation matrix. Either the matrix may appear literally as 16 numbers, or there may be a reference to a "transform" object, i.e.

         "<" file-containing-4x4-matrix

or

         ":" symbol-representing-transform-object

Another way to specify the transformation is

     transforms
         oogl-object

The oogl-object must be a TLIST object (list of transformations) object, or a LIST whose members are ultimately TLIST objects. In effect, the transforms keyword takes a collection of 4x4 matrices and replicates the geom object, making one copy for each 4x4 matrix.

If no transform nor transforms keyword appears, no transformation is applied (actually the identity is applied). You could use this for, e.g., wrapping an appearance around an externally-supplied object, though a single-membered LIST would do this more efficiently.

See Transformation matrices, for the matrix format.

When replicating a single geometry by means of a TLIST object (see `transforms' above) it may be useful to transform texture co-ordinates by another list of transformations; that list can be specified by

     txtransforms
         TLIST-object

The number of texture transformations must match the number of geometry transformations. The SPHERE object (see Sphere Objects) uses this technique to generate an entire textured sphere out of some fraction of a sphere (usually one octant).

A single (N+1)-dimensional transformation can be specified by

     ntransform ["{"] N+1 N+1 (N+1)x(N+1) floats ["}"]

This gives a single N+1-dimensional transformation matrix. Either the matrix may appear literally as (N+1)x(N+1) numbers, or there may be a reference to an `ntransform' object, i.e.

         "<" file-containing-(N+1)x(N+1)-matrix

or

         ":" symbol-representing-ntransform-object

See ND Transformation matrices, for the matrix format.

Two more INST fields are accepted: location and origin.

Note that location as well as origin are ignored if this INST object carries an ntransform. Also, if ND-viewing is active (ND-axes command, see GCL) then INST objects with origin unequal to local will not be drawn, though the location stuff may work (or not).

     location [global or camera or ndc or screen or local]

Normally an INST specifies a position relative to its parent object; the location field allows putting an object elsewhere.

  • location global attaches the object to the global (a.k.a. universe) coordinate system – the same as that in which geomview's World objects, alien geometry, and cameras are placed.
  • location camera places the object relative to the camera. (Thus if there are multiple views, it may appear in a different spatial position in each view.) The center of the camera's view is along its negative Z axis; positive X is rightward, positive Y upward. Normally the units of camera space are the same as global coordinates. When a camera is reset, the global origin is at (0,0,-3.0).
  • location ndc places the object relative to the normalized unit cube into which the camera's projection (perspective or orthographic) maps the visible world. X, Y, and Z are each in the range from -1 to +1, with Z = -1 the near and Z = +1 the far clipping plane, and X and Y increasing rightward and upward respectively. Thus something like
              INST  transform  1 0 0 0  0 1 0 0  0 0 1 0  -.9 -.9 -.999 1
                    location ndc
                    geom < label.vect
         

    pastes label.vect onto the lower left corner of each window, and in front of nearly everything else, assuming label.vect's contents lie in the positive quadrant of the X-Y plane. It's tempting to use -1 rather than -.999 as the Z component of the position, but that may put the object just nearer than the near clipping plane and make it (partially) invisible, due to floating-point error.

  • location screen places the object in screen coordinates. The range of Z is still -1 through +1 as for ndc coordinates; X and Y are measured in pixels, and range from (0,0) at the lower left corner of the window, increasing rightward and upward.

location local is the default; the object is positioned relative to its parent.

     origin [global or camera or ndc or screen or local] x y z

The origin field translates the contents of the INST to place the origin at the specified point of the given coordinate system. Unlike location, it doesn't change the orientation, only the choice of origin. Both location and origin can be used together.

So for example

     { INST
       location screen
       origin ndc 0 0 -.99
       geom { < xyz.vect }
       transform { 100 0 0 0  0 100 0 0  0 0 -.009 0   0 0 0 1 }
     }

places xyz.vect's origin in the center of the window, just beyond the near clipping plane. The unit-length X and Y edges are scaled to be just 100 screen units – pixels – long, regardless of the size of the window.

geomview-1.9.4/doc/geomview.html/TLIST.html0000644000175000001440000000667710663301507015424 00000000000000 TLIST - Geomview Manual

Next: , Previous: LIST, Up: Object File Formats


4.2.11 TLIST Files

The conventional suffix for a TLIST file is .grp ("group") or or .prj ("projective" matrices).

Collection of 4x4 matrices, used in the transforms section of and INST object.

Syntax:

     TLIST			# key word
     
     <4x4 matrix (16 floats)>
     ...				# Any number of 4x4 matrices

TLISTs are used only within the transforms clause of an INST object. They cause the INSTs geom object to be instantiated once under each of the transforms in the TLIST. The effect is like that of a LIST of INSTs each with a single transform, and all referring to the same object, but is more efficient.

Be aware that a TLIST is a kind of geometry object, distinct from a transform object. Some contexts expect one type of object, some the other. For example in

     INST transform { : myT } geom { ... }

myT must be a transform object, which might have been created with the GCL

     (read transform { define myT 1 0 0 1 ... })

while in

       INST transforms { : myTs } geom { ... }
       or
       INST transforms { LIST {: myTs} {< more.prj} } geom { ... }

myTs must be a geometry object, defined e.g. with

       (read geometry { define myTs { TLIST 1 0 0 1 ... } })

A TLIST BINARY format is accepted. Binary data begins with a 32-bit integer giving the number of transformations, followed by that number of 4x4 matrices in 32-bit floating-point format. The order of matrix elements is the same as in the ASCII format. geomview-1.9.4/doc/geomview.html/figfilespanel.html0000644000175000001440000000011110663301507017306 00000000000000 geomview-1.9.4/doc/geomview.html/GROUP.html0000644000175000001440000000404710663301507015406 00000000000000 GROUP - Geomview Manual

Next: , Previous: TLIST, Up: Object File Formats


4.2.12 GROUP Files

This format is obsolete, but is still accepted. It combined the functions of INST and TLIST, taking a series of transformations and a single Geom (unit) object, and replicating the object under each transformation.

     GROUP ... < matrices > ... unit { oogl-object }

is still accepted and effectively translated into

     INST
     	transforms { TLIST ... <matrices> ... }
     	unit { oogl-object }
geomview-1.9.4/doc/geomview.html/Cameras.html0000644000175000001440000002024010663301507016056 00000000000000 Cameras - Geomview Manual

Next: , Previous: Appearance, Up: Interaction


3.7 Cameras

A camera in Geomview is the object that corresponds to a camera window. By default there is only one camera, but it is possible to have as many as you want. You can control certain aspects of the way the world is drawn in each camera window via the Cameras panel.

figs/cam.png

Figure 3.8: The Cameras Panel.

If the target object is a camera, the Cameras panel affects that camera. If the target object is not a camera, the Cameras panel affects the current camera. The current camera is the camera of the window that the mouse cursor is in, or was in most recently if the cursor is not in a camera window. Thus, if you use the keyboard shortcuts for the actions in the Cameras panel while the cursor is in a camera window, the actions apply to that camera, unless you have explicitly selected another camera.

To create new camera windows, use the v+ keyboard shortcut, or see the File menu on the Main panel.

Single-Buffering
Normally, geomview windows are double-buffered: geomview draws the next picture into a hidden window, then switches buffers to make it visible all at once. On many systems, the memory for the hidden buffer comes from stealing half the bits in each screen pixel, reducing the color resolution. When single-buffering is enabled, the window flickers as each scene is being drawn, but you may get smoother images with reduced grainy dithering artifacts. Single-buffering is possible if Geomview is compiled with GL or OpenGL, but not with plain-X graphics.
Dither
Many displays offer less than the 24 bits per pixel (8 bits each of red, green, and blue) conventionally needed to show smooth gradations of color. When trying to show a color not accurately available on the display, Geomview normally dithers, choosing pixel colors sometimes brighter, sometimes darker than the desired value, so that the average color over an area is a better approximation to the true color than a single pixel could be. Effectively this loses spatial resolution to gain color resolution. This isn't always desirable, though. Turning Dither off gives less grainy, but less accurately colored, images.
Software Shading
This button controls whether Geomview does shading calculations in software. The default is to let the hardware handle them, and in Euclidean space this is almost certainly best because it is faster. In hyperbolic and spherical space, however, the shading calculations that the hardware does are incorrect. Click this button to turn on correct but slower software shading.
Background Color
This button brings up a color chooser which you can use to set the background color of the camera's window.
PROJECTION
This browser lets you pick between perspective and orthogonal projection for this camera.
Near clip
This determines the distance in world coordinates of the near clipping plane from the eye point. It must be a positive number.
Far clip
This determines the distance in world coordinates of the far clipping plane from the eye point. It must be a positive number and in general should be larger than the Near clip value.
FOV
This is the camera's field of view, measured in its shorter direction. In perspective mode, it is an angle in degrees. In orthographic mode, it is the linear size of the field of view. This number can be modified with the mouse in Cam Zoom mode.
Focal Length
The focal length is intended to suggest the distance from the camera to an imaginary plane of interest. Its value is used when switching between orthographic and perspective views (and during stereo viewing), so as to preserve apparent size of objects lying at the focal distance from the camera. Focal length also affects interpretation of mouse-based translational motions. Speed of forward motion (in translate, fly and orbit modes) is proportional to focal length; and objects lying at the focal distance from the camera translate laterally at the same rate as the mouse cursor. Finally, in N-D projection mode, cameras are displaced back by the focal distance from the 3-D projection of the world origin.
Lines Closer
This number has to do with the way lines are drawn. Normally Geomview's z-buffering algorithm can get confused when drawing lines that lie exactly on surfaces (such as the edges of an object); due to machine round-off error, sometimes the lines appear to be in front of the surface and sometimes they appear behind it. The Lines Closer value is a fudge factor — Geomview nudges all the lines that it draws closer to the camera by this amount. The number should be a small integer; try 5 or 10. 0 turns this feature off completely. Choosing too large a value will make lines visible even though they should be hidden.
SPACE MODEL
This determines the model used to draw the world. It is most useful in hyperbolic and spherical spaces. You probably don't need to touch this browser if you stay in Euclidean space. For more information about these models, see Non-Euclidean Geometry.
Virtual
This is the default model and represents the natural view from inside the space.
Projective
The projective model of hyperbolic and spherical space. Geoms move under isometries of the space, and cameras move by Euclidean motions. By default in the projective model, the Euclidean unit sphere is drawn. In hyperbolic space this is the sphere at infinity. In Euclidean space the projective model is the same as the virtual model except that the sphere is drawn by default.
Conformal
The conformal model of hyperbolic and spherical space. Geoms move under isometries of the space, and cameras move by Euclidean motions. In Euclidean space, the conformal model amounts to inverting everything in the unit sphere.

Draw Sphere
This controls whether Geomview draws the unit sphere. By default the unit sphere appears in the projective and conformal models. In hyperbolic space this is the sphere at infinity. In spherical space it is the equatorial sphere.
Done
This button dismisses the Cameras panel.
geomview-1.9.4/doc/geomview.html/bbox_002ddraw.html0000644000175000001440000000340210663301507017041 00000000000000 bbox-draw - Geomview Manual

Next: , Previous: bbox-color, Up: GCL Reference


7.2.14 bbox-draw

(bbox-draw GEOM-ID [yes|no])
Say whether GEOM-ID's bounding-box should be drawn; defaults to yes if second argument is omitted.
geomview-1.9.4/doc/geomview.html/ui_002dtarget.html0000644000175000001440000000410210663301507017053 00000000000000 ui-target - Geomview Manual

Next: , Previous: ui-pdf-viewer, Up: GCL Reference


7.2.138 ui-target

(ui-target ID [yes|no])
Set the target of user actions (the selected line of the target object browser) to ID. The second argument specifies whether to make ID the current object regardless of its type. If no, then ID becomes the current object of its type (geom or camera). The default is yes. This command may result in a change of motion modes based on target choice.
geomview-1.9.4/doc/geomview.html/DISCGRP.html0000644000175000001440000000325310663301507015603 00000000000000 DISCGRP - Geomview Manual

Next: , Previous: GROUP, Up: Object File Formats


4.2.13 DISCGRP Files

This format is for discrete groups, such as appear in the theory of manifolds or in symmetry patterns. This format has its own man page. See discgrp(5). geomview-1.9.4/doc/geomview.html/hdelete.html0000644000175000001440000000502010663301507016114 00000000000000 hdelete - Geomview Manual

Next: , Previous: hdefine, Up: GCL Reference


7.2.53 hdelete

(hdelete [geometry|camera|window|appearance|image|transform|ntransform] name)
Deletes the given handle. Note that the handle will not actually be deleted in case there are still other objects referring to the handle, but once those objects are gone, the handle will also automatically go away. The object the handle referes to (if any) will only be deleted if there are no other references to that object.

If the optional first argument is omitted, then the first handle matching name will be deleted, regardless of the type of the object it is attached to. It is not an error to call this function with a non-existent handle, but it is an error to call this funcion with the name of a non-global handle, i.e. one that was not created by (hdefine ...) or (read ... { define ...}). See References. See (read ...). See (hdefine ...).

geomview-1.9.4/doc/geomview.html/ezoom.html0000644000175000001440000000313410663301507015637 00000000000000 ezoom - Geomview Manual

Next: , Previous: exit, Up: GCL Reference


7.2.48 ezoom

(ezoom GEOM-ID FACTOR)
Same as zoom but multiplies by exp(zoom). Obsolete.
geomview-1.9.4/doc/geomview.html/input_002dtranslator.html0000644000175000001440000000431710663301507020510 00000000000000 input-translator - Geomview Manual

Next: , Previous: inhibit-warning, Up: GCL Reference


7.2.59 input-translator

(input-translator "#prefix_string" "Bourne-shell-command")
Defines an external translation program for special input types. When asked to read a file which begins with the specified string, geomview invokes that program with standard input coming from the given file. The program is expected to emit OOGL geometric data to its standard output. In this implementation, only prefixes beginning with # are recognized. Useful as in
            (input-translator "#VRML" "vrml2oogl")
     
geomview-1.9.4/doc/geomview.html/background_002dimage.html0000644000175000001440000000417010663301507020356 00000000000000 background-image - Geomview Manual

Next: , Previous: backcolor, Up: GCL Reference


7.2.12 background-image

(background-image CAM-ID [FILENAME])
Use the given image as the background of camera CAM-ID (which must be a real camera, not default or allcams). Centers the image on the window area. Works only with GL and OpenGL graphics. Use "" for filename to remove background. With no filename argument, returns name of that window's current background image, or "". Any file type acceptable as a texture is allowed, e.g. .ppm.gz, .sgi, etc.
geomview-1.9.4/doc/geomview.html/camera.html0000644000175000001440000001633610663301507015746 00000000000000 camera - Geomview Manual

Next: , Previous: ntransform, Up: Non-geometric objects


4.3.5 cameras

A camera object specifies the following properties of a camera:

position and orientation
specified by either a camera-to-world or world-to-camera transformation; this transformation does not include the projection, so it's typically just a combination of translation and rotation. Specified as a transform object, typically a 4x4 matrix.
"focus" distance
Intended to suggest a typical distance from the camera to the object of interest; used for default camera positioning (the camera is placed at (X,Y,Z) = (0,0,focus) when reset) and for adjusting field-of-view when switching between perspective and orthographic views.
window aspect ratio
True aspect ratio in the sense <Xsize>/<Ysize>. This normally should agree with the aspect ratio of the camera's window. Geomview normally adjusts the aspect ratio of its cameras to match their associated windows.
near and far clipping plane distances
Note that both must be strictly greater than zero. Very large <far>/<near> distance ratios cause Z-buffering to behave badly; part of an object may be visible even if somewhat more distant than another.
field of view
Specified in either of two forms.
`fov'
is the field of view – in degrees if perspective, or linear distance if orthographic – in the shorter direction.
`halfyfield'
is half the projected Y-axis field, in world coordinates (not angle!), at unit distance from the camera. For a perspective camera, halfyfield is related to angular field:
halfyfield = tan( Y_axis_angular_field / 2 )

while for an orthographic one it's simply:

halfyfield = Y_axis_linear_field / 2

This odd-seeming definition is (a) easy to calculate with and (b) well-defined in both orthographic and perspective views.

background color
Arguably not a property of a camera, but of the scene. Nevertheless, as there is no "background" OOGL object, and the background color should not be a property of the drawing device, it can be specified here. At the time of this writing, however, the GUI always overrides the background color with its own settings.
background image
Same reasoning as above, only that the GUI does not override this setting. The image is centered at NDC co-ordinates (0,0,-1); it is not resized, just painted behind everything else as is. See Image objects.

The syntax for a camera is:

     <camera> ::=
     
        [ "camera" ]                 (optional keyword)
         [ "{" ]                    (opening brace, generally required)
             [ "define" <name> ]
     
             "<" <filename>
           |
             ":" <name>
           |
                                     (or any number of the following,
                                      in any order...)
     
             "perspective"  {"0" | "1"}            (default 1)
                                             (otherwise orthographic)
     
             "stereo"       {"0" | "1"}            (default 0)
                                             (otherwise mono)
     
             "worldtocam" <transform>        (see transform syntax above)
     
             "camtoworld" <transform>
                                     (no point in specifying both
                                      camtoworld and worldtocam; one is
                                      constrained to be the inverse of                                                the other)
     
             "halfyfield" <half-linear-Y-field-at-unit-distance>
                                     (default tan 40/2 degrees)
     
             "fov"           (angular field-of-view if perspective,
                              linear field-of-view otherwise.
                              Measured in whichever direction is smaller,
                              given the aspect ratio.  When aspect ratio
                              changes -- e.g. when a window is reshaped --
                              "fov" is preserved.)
     
             "frameaspect" <aspect-ratio>    (X/Y) (default 1.333)
     
             "near"  <near-clipping-distance>        (default 0.1)
     
             "far"   <far-clipping-distance>         (default 10.0)
     
             "focus" <focus-distance>                (default 3.0)
     
             "bgcolor" <float RGB(A) color>          (default 1/3 1/3 1/3 1)
     
             "bgimage" { <image specification> }     (default no background image)
     
          [ "}" ]                           (matching closebrace)

Next: , Previous: bbox-draw, Up: GCL Reference


7.2.15 camera

(camera CAM-ID [CAMERA])
Specify data for CAM-ID; CAMERA is a string giving an OOGL camera specification. If no camera CAM-ID exists, it is created; in this case, the second argument is optional, and if omitted, a default camera is used. See (new-camera ...).
geomview-1.9.4/doc/geomview.html/real_002did.html0000644000175000001440000000366510663301507016504 00000000000000 real-id - Geomview Manual

Next: , Previous: read, Up: GCL Reference


7.2.101 real-id

(real-id ID)
Returns a string canonically identifying the given ID, or nil if the object does not exist. Examples: (if (real-id fred) (delete fred)) deletes fred if it exists but reports no error if it doesn't, and (if (= (real-id targetgeom) (real-id World)) () (delete targetgeom)) deletes targetgeom if it is different from the World.
geomview-1.9.4/doc/geomview.html/emodule_002disrunning.html0000644000175000001440000000375410663301507020632 00000000000000 emodule-isrunning - Geomview Manual

Next: , Previous: emodule-defined, Up: GCL Reference


7.2.36 emodule-isrunning

(emodule-isrunning NAME)
Returns Lt if the emodule NAME is running, or Lnil if it is not running. NAME is searched for in the names as they appear in the browser and in the shell commands used to execute the external modules (not including arguments).
geomview-1.9.4/doc/geomview.html/Loading.html0000644000175000001440000001313510663301507016065 00000000000000 Loading - Geomview Manual

Next: , Previous: Basic Interaction, Up: Interaction


3.4 Loading Objects Into Geomview

There are several ways to load an object into Geomview.

the Files panel
If you click the Load button in Geomview's Main panel, the Files panel will appear.
figs/myfilelist.png

Figure 3.2: The Files Panel.

This panel lets you select a file from a variety of directories. The top of the panel is a standard Motif file browser. Below this is a list of directories on Geomview's standard search path; click on one of these to browse files in that directory.

To select a file, double-click on its name in the browser at upper right, or click on its name and press the <Enter> key, or type the file's name into the text box at the bottom of the browser and press <Enter>.

If the selected file contains OOGL geometric data, it will be added to the geomview Targets browser. If it contains GCL commands instead, the file will be interpreted. See GCL.

When the Files panel first appears, the directory selected in the directory browser is the current directory — the one from which you invoked Geomview. The file browser shows all the files in this directory, including ones that are not Geomview files. If you try to load a file that doesn't contain either an OOGL object or Geomview commands, Geomview will print out an error message.

The directory browser also lists a second and third directory in addition to the current directory. The second one, which ends in data/geom, is the Geomview example data directory. This contains a wide variety of sample objects. It also contains several subdirectories. In particular, the hyperbolic and spherical subdirectories have sample hyperbolic and spherical objects, respectively. Directory entries in the browser look just like file entries; to view a subdirectory, click on it.

The third directory shown in the directory browser, which ends in geom, contains several subdirectories with other Geomview files in them. These are used less frequently than the ones in the data/geom directory.

You can change the list of directories shown the Files panel's directory browser by using the set-load-path command; see (set-load-path ...).

the < keyboard shortcut:
If you type < in any Geomview window, the Load panel will appear. This is a small version of the Files panel; it contains a text field in which you can enter the name of a file to load (or a GCL command surrounded by parentheses). After typing the name of the file to load, type <Enter>; Geomview will load the file as if you had loaded it with the Add button in the Files panel. If, after bringing up the small load panel with <, you decide you want to use the larger Files panel after all, press the File Browser button.
figs/load.png

Figure 3.3: The Load Panel.


geometry loading commands:
The load, geometry, new-geometry, and read GCL commands allow you to load an object into Geomview; See GCL. See (load ...). See (new-geometry ...). See (read ...).
geomview-1.9.4/doc/geomview.html/figappearance.html0000644000175000001440000000011110663301507017263 00000000000000 geomview-1.9.4/doc/geomview.html/QUAD.html0000644000175000001440000000623010663301507015240 00000000000000 QUAD - Geomview Manual

Next: , Previous: Object File Formats, Up: Object File Formats


4.2.1 QUAD: collection of quadrilaterals

The conventional suffix for a QUAD file is .quad.

The file syntax is

        [C][N][4]QUAD  -or-  [C][N][4]POLY		   # Key word
        vertex  vertex  vertex  vertex  # 4*N vertices for some N
        vertex  vertex  vertex  vertex
        ...

The leading key word is [C][N][4]QUAD or [C][N][4]POLY, where the optional C and N prefixes indicate that each vertex includes colors and normals respectively. That is, these files begin with one of the words

QUAD CQUAD NQUAD CNQUAD POLY CPOLY NPOLY CNPOLY

(but not NCQUAD or NCPOLY). QUAD and POLY are synonymous; both forms are allowed just for compatibility with ChapReyes.

Following the key word is an arbitrary number of groups of four vertices, each group describing a quadrilateral. See the Vertex syntax above. The object ends at end-of-file, or with a close-brace if incorporated into an object reference (see above).

A QUAD BINARY file format is accepted; See Binary format. The first word of binary data must be a 32-bit integer giving the number of quads in the object; following that is a series of 32-bit floats, arranged just as in the ASCII format. geomview-1.9.4/doc/geomview.html/transform_002dincr.html0000644000175000001440000000447710663301507020135 00000000000000 transform-incr - Geomview Manual

Next: , Previous: transform, Up: GCL Reference


7.2.126 transform-incr

(transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center] [dt [smooth]])
Apply continuing motion: construct a transformation matrix and concatenate it with the current transform of objectID every refresh (sets objectID's incremental transform). Same syntax as transform. If optional dt argument is present, the object is moved at each time step such that its average motion equals one instance of the motion per dt seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds.
geomview-1.9.4/doc/geomview.html/ui_002dcenter.html0000644000175000001440000000351610663301507017055 00000000000000 ui-center - Geomview Manual

Next: , Previous: ui-cam-focus, Up: GCL Reference


7.2.129 ui-center

(ui-center ID)
Set the center for user interface (i.e. mouse) controlled motions to object ID.
geomview-1.9.4/doc/geomview.html/write.html0000644000175000001440000000512510663301507015642 00000000000000 write - Geomview Manual

Next: , Previous: winenter, Up: GCL Reference


7.2.144 write

(write {command|geometry|camera|transform|ntransform|window} FILENAME [ID|(ID ...)] [self|world|universe|otherID])
write description of ID in given format to FILENAME. Last parameter chooses coordinate system for geometry & transform: self: just the object, no transformation or appearance (geometry only) world: the object as positioned within the World. universe: object's position in universal coordinates; includes Worldtransform other ID: the object transformed to otherID's coordinate system.

A filename of - is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, - means geomview's standard output (see (command ...)).

The ID can either be a single id or a parenthesized list of ids, like g0 or (g2 g1 dodec.off).

geomview-1.9.4/doc/geomview.html/exit.html0000644000175000001440000000305010663301507015454 00000000000000 exit - Geomview Manual

Next: , Previous: evert, Up: GCL Reference


7.2.47 exit

(exit)
Terminates geomview.
geomview-1.9.4/doc/geomview.html/figcamerapanel.html0000644000175000001440000000011110663301507017434 00000000000000 geomview-1.9.4/doc/geomview.html/ui_002dcenter_002dorigin.html0000644000175000001440000000466110663301507021014 00000000000000 ui-center-origin - Geomview Manual

Next: , Previous: ui-center, Up: GCL Reference


7.2.130 ui-center-origin

(ui-center-origin [origin|bbox-center])
Set the origin of the coordinate system of the CENTER object for user interface (i.e. mouse) controlled motions. The keyword origin means to use the origin of the coordinate system of the currently selected object, while bbox-center means to use the center of the bouding box of the current object. The keyword bbox-center makes no sense if the geometry is non-Euclidean. Using either bbox-center or origin does not make a difference if the center object is not a geometry, e.g. if it is a camera. Same holds if the World is the currently selected object.
geomview-1.9.4/doc/geomview.html/ND_002dxform.html0000644000175000001440000000375310663301507016617 00000000000000 ND-xform - Geomview Manual

Next: , Previous: ND-color, Up: GCL Reference


7.2.77 ND-xform

(ND-xform OBJID [ntransform { idim odim ... }])
Concatenate the given ND-transform with the current ND-transform of the object (apply the ND-transform to object ID, as opposed to simply setting its ND-transform). Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.
geomview-1.9.4/doc/geomview.html/hdefine.html0000644000175000001440000000456710663301507016123 00000000000000 hdefine - Geomview Manual

Next: , Previous: geomview-version, Up: GCL Reference


7.2.52 hdefine

(hdefine geometry|camera|window|appearance|image|transform|ntransform name value)
Sets the value of a handle of a given type.
            (hdefine  <type>  <name>  <value>)
     

is generally equivalent to

            (read <type>  { define <name> <value> })
     

except that the assignment is done when hdefine is executed, (possibly not at all if inside a conditional statement), while the read ... define performs assignment as soon as the text is read. See References. See (read ...). See (hdelete ...).

geomview-1.9.4/doc/geomview.html/regtable.html0000644000175000001440000000327310663301507016277 00000000000000 regtable - Geomview Manual

Next: , Previous: redraw, Up: GCL Reference


7.2.103 regtable

(regtable)
shows the registry table
geomview-1.9.4/doc/geomview.html/Interaction.html0000644000175000001440000000542410663301507016771 00000000000000 Interaction - Geomview Manual

Next: , Previous: Tutorial, Up: Top


3 Interaction

This chapter describes how you interact with Geomview through the mouse and keyboard.

geomview-1.9.4/doc/geomview.html/progn.html0000644000175000001440000000344110663301507015634 00000000000000 progn - Geomview Manual

Next: , Previous: position-toward, Up: GCL Reference


7.2.95 progn

(progn STATEMENT [ ... ])
evaluates each STATEMENT in order and returns the value of the last one. Use progn to group a collection of commands together, forcing them to be treated as a single command.
geomview-1.9.4/doc/geomview.html/GCL-Reference.html0000644000175000001440000004577510663301507017030 00000000000000 GCL Reference - Geomview Manual

Previous: Argument Conventions, Up: GCL


7.2 GCL Reference Guide

geomview-1.9.4/doc/geomview.html/eq.html0000644000175000001440000000314510663301507015115 00000000000000 eq - Geomview Manual

Next: , Previous: lt, Up: GCL Reference


7.2.3 =

(= EXPR1 EXPR2)
Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.
geomview-1.9.4/doc/geomview.html/Distrib.html0000644000175000001440000000536010663301507016111 00000000000000 Distrib - Geomview Manual

Next: , Previous: Intro, Up: Top


Distribution

Geomview is free software; this means that everyone is free to use it and free to redistribute it on certain conditions. Geomview is not in the public domain; it is copyrighted and there are restrictions on its distribution, but these restrictions are designed to permit everything that a good cooperating citizen would want to do. What is not allowed is to try to prevent others from further sharing any version of Geomview that they might get from you. The precise conditions are found in the GNU Lesser Public License that comes with Geomview and also appears following this section.

One way to get a copy of Geomview is from someone else who has it. You need not ask for our permission to do so, or tell any one else; just copy it. If you have access to the Internet, you can get the latest distribution version of Geomview at http://www.geomview.org.

You may also receive Geomview when you buy a computer. Computer manufacturers are free to distribute copies on the same terms that apply to everyone else. These terms require them to give you the full sources, including whatever changes they may have made, and to permit you to redistribute the Geomview received from them under the usual terms of the General Public License. In other words, the program must be free for you when you get it, not just free for the manufacturer. geomview-1.9.4/doc/geomview.html/rib_002ddisplay.html0000644000175000001440000000447710663301507017410 00000000000000 rib-display - Geomview Manual

Next: , Previous: replace-geometry, Up: GCL Reference


7.2.106 rib-display

(rib-display [frame|tiff] FILEPREFIX)
Set Renderman display to framebuffer (popup screen window) or a TIFF format disk file. FILEPREFIX is used to construct names of the form prefixNNNN.suffix. (i.e. foo0000.rib) The number is incremented on every call to rib-snapshot and reset to 0000 when rib-display is called. TIFF files are given the same prefix and number as the RIB file (i.e. foo0004.rib generates foo0004.tiff). The default FILEPREFIX is geom and the default format is TIFF. (Note that geomview just generates a RIB file, which must then be rendered.)
geomview-1.9.4/doc/geomview.html/Argument-Conventions.html0000644000175000001440000001101410663301507020567 00000000000000 Argument Conventions - Geomview Manual

Next: , Previous: GCL, Up: GCL


7.1 Conventions Used In Describing Argument Types

The following symbols are used to describe argument types in the documentation for GCL functions.

appearance
is an OOGL appearance specification.
cam-id
is an id that refers to a camera.
camera
is an OOGL camera specification.
geom-id
is an id that refers to a geometry.
geometry
is an OOGL geometry specification.
id
is a string which names a geometry or camera. Besides those you create, valid ones are:
World, world, worldgeom, g0
the collection of all geom's
target
selected target object (cam or geom)
center
selected center-of-motion object
targetcam
last selected target camera
targetgeom
last selected target geom
focus
camera where cursor is (or most recently was)
allgeoms
all geom objects
allcams
all cameras
default, defaultcam, prototype
future cameras inherit default's settings

The following ids are used to name coordinate systems, e.g. in pick and write commands:

World, world, worldgeom, g0
the world, within which all other geoms live.
universe
the universe, in which the World, lights and cameras live. Cameras' world2cam transforms might better be called universe2cam, etc.
self
"this Geomview object". Transform from an object to self is the identity; writing its geometry gives the object itself with no enclosing transform; picked points appear in the object's coordinates.
primitive
(for pick only) Picked points appear in the coordinate system of the lowest-level OOGL primitive.

A name is also an acceptable id. Given names are made unique by appending numbers if necessary (i.e. foo<2>). Every geom is also named g[n] and every camera is also named c[n] (g0 is always the worldgeom): this name is used as a prefix to keyboard commands and can also be used as a GCL id. Numbers are reused after an object is deleted. Both names are shown in the Object browser.

statement
represents a function call. Function calls have the form (func arg1 arg2 ... ), where func is the name of the function and arg1, arg2, ... are the arguments.
transform
is an OOGL 4x4 transformation matrix.
ntransform
is an OOGL (N+1)x(N+1) transformation matrix.
window
is an OOGL winddow specification.
geomview-1.9.4/doc/geomview.html/normalization.html0000644000175000001440000000515510663301507017401 00000000000000 normalization - Geomview Manual

Next: , Previous: NeXT, Up: GCL Reference


7.2.86 normalization

(normalization GEOM-ID {each|none|all|keep})
Set the normalization status of GEOM-ID.
none
suppresses all normalization.
each
normalizes the object's bounding box to fit into the unit sphere, with the center of its bounding box translated to the origin. The box is scaled such that its long diagonal, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2.
all
resembles each, except when an object is changing (e.g. when its geometry is being changed by an external program). Then, each tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while all normalizes the union of all variants of the object and normalizes accordingly.
keep
leaves the current normalization transform unchanged when the object changes. It may be useful to apply each or all normalization apply to the first version of a changing object to bring it in view, then switch to keep.
geomview-1.9.4/doc/geomview.html/References.html0000644000175000001440000001011610663301507016565 00000000000000 References - Geomview Manual

Next: , Previous: Binary format, Up: Conventions


4.1.9 Embedded objects and external-object references

Some object types (LIST, INST) allow references to other OOGL objects, which may appear literally in the data stream, be loaded from named disk files, or be communicated from elsewhere via named objects. GCL commands also accept geometry in these forms.

The general syntax is

      <oogl-object>  ::=
     	[ "{" ]
     	    [ "define" symbolname ]
     	    [ ["="] object-keyword ...
     		 | "<" filename
     		 | ":" symbolname ]
     	[ "}" ]

where "quoted" items are literal strings (which appear without the quotes), [bracketed] items are optional, and | denotes alternatives. Curly braces, when present, must match; the outermost set of curly braces is generally required when the object is in a larger context, e.g. when it is part of a larger object or embedded in a Geomview command stream.

For example, each of the following three lines:

     	{ define fred   QUAD 1 0 0  0 0 1  0 1 0  1 0 0 }
     
     	{ define fred = QUAD 1 0 0  0 0 1  0 1 0  1 0 0 }
     
     	{ appearance { +edge } LIST { < "file1" } { : fred } }
     
     	VECT 1 2 0   2 0   0 0 0   1 1 2

is a valid OOGL object. The last example is only valid when it is delimited unambiguously by residing in its own disk file.

The ":" construct allows references to symbols, created with define. A symbol's initial value is a null object. When a symbol is (re)defined, all references to it are automatically changed.

The "define NAME" construct allows to define a global symbol for the given object. If "NAME" already references an object, then the old object is discarded and replaced by the new definition. See (read ...). See (hdefine ...).

The "<" construct causes a disk file to be read. Note that this isn't a general textual "include" mechanism; a complete OOGL object must appear in the referenced file.

Files read using "<" are sought first in the directory of the file which referred to them, if any; failing that, the normal search path (see (load-path ...)) is used. The default search looks first in the current directory, then in the Geomview data directories.

Again, white space and line breaks are insignificant, and "#" comments may appear anywhere. geomview-1.9.4/doc/geomview.html/ND_002daxes.html0000644000175000001440000000556310663301507016425 00000000000000 ND-axes - Geomview Manual

Next: , Previous: name-object, Up: GCL Reference


7.2.75 ND-axes

(ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex [Windex]]])
In our model for N-D viewing (enabled by (dimension)), objects in N-space are viewed by N-dimensional camera clusters. Each real camera window belongs to some cluster, and shows & manipulates a 3-D axis-aligned projected subspace of the N-space seen by its cluster. Moving one camera in a cluster affects its siblings.

The ND-axes command configures all this. It specifies a camera's cluster membership, and the set of N-space axes which become the 3-D camera's X, Y, and Z axes. Axes are specified by their indices, from 1 to N for an N-dimensional space. Cluster CLUSTERNAME is implicitly created if not previously known.

In principle it is possible to map the homogeneous component of a conformal 4 point to some other index; this would be done by specifying 0 for one of Xindex, Yindex or Zindex and giving Windex some positive value. This is probably not useful because Geomview does not support non-Euclidean geometries for in higher dimensions.

To read a camera's configuration, use (echo (ND-axes CAMID)). The return value is an array of 4 integers, the last one should 0.

geomview-1.9.4/doc/geomview.html/set_002dload_002dpath.html0000644000175000001440000000407110663301507020271 00000000000000 set-load-path - Geomview Manual

7.2.113 set-load-path

(set-load-path (PATH1 ... PATHN))
Sets search path for command, geometry, etc. files. The PATHi are strings giving the pathnames of directories to be searched. The special directory name + is replaced by the existing path, so e.g. (set-load-path (mydir +)) prepends mydir to the path.
geomview-1.9.4/doc/geomview.html/emodule_002drun.html0000644000175000001440000000664410663301507017423 00000000000000 emodule-run - Geomview Manual

Next: , Previous: morehelp, Up: GCL Reference


7.2.7 |

|
| is a synonym for emodule-run.

Next: , Previous: emodule-path, Up: GCL Reference


7.2.38 emodule-run

(emodule-run SHELL-COMMAND ARGS...)
Runs the given SHELL-COMMAND (a string containing a UNIX shell command) as an external module. The module's standard output is taken as geomview commands; responses (written to filename -) are sent to the module's standard input. The shell command is interpreted by /bin/sh, so e.g. I/O redirection may be used; a program which prompts the user for input from the terminal could be run with:
            (emodule-run  yourprogram  <&2)
     

If not already set, the environment variable $MACHTYPE is set to the name of the machine type. Input and output connections to geomview are dropped when the shell command terminates. Clicking on a running program's module-browser entry sends the signal SIGHUP to the program. For this to work, programs should avoid running in the background; those using FORMS or GL should call foreground() before the first FORMS or winopen() call. See (emodule-define ...). See (emodule-start ...).

geomview-1.9.4/doc/geomview.html/Appearance-Panel.html0000644000175000001440000001750610663301507017612 00000000000000 Appearance Panel - Geomview Manual

Next: , Previous: Appearance, Up: Appearance


3.6.1 The Appearance Panel

The Appearance panel lets you change most common appearance properties of the target object.

figs/ap.png

Figure 3.5: The Appearance Panel.

If the target is an individual geom, then changes you make in the appearance panel apply to that geometry's appearance. If the target is the World, then appearance panel changes apply to the World appearance and to all individual geom appearances. (Users have found that this is more desirable than having the changes only apply to the World appearance.) If the target is a camera, then appearance panel changes apply to the geom that was most recently the target.

The five buttons near the upper right corner under the word Draw control what parts of the target geom are drawn.

Faces
This button specifies whether faces are drawn.
Edges
This button specifies whether edges are drawn.
BBox
This button specifies whether the bounding box is drawn.
Vects
This button specifies whether VECT objects are drawn. VECTs are a type of OOGL object that represent points and line segments in 3-space; they are distinct from edges of other kinds of objects, and it is sometimes desirable to have separate control over whether they are drawn.
Normals
This button specifies whether surface normal vectors are drawn.

The four buttons under Color labeled Faces, Edges, Normals, and BBox let you specify the color of the corresponding aspect of the target geom. Clicking on one of them brings up a color chooser panel.

figs/color.png

Figure 3.6: Color Chooser Panel.

This panel offers two sets of sliders: H(ue) S(aturation) V(alue), or R(ed) G(reen) B(lue), each in the range 0 through 1. The square shows the current color, which is given numerically in both HSV and RGB systems in the corresponding text boxes.

In the HSV color system, hue H runs from red at 0, green at .333, blue at .667, and back to red at 1.0. Saturation gives the fraction of white mixed into the color, from 0 for pure gray to 1 for pure color. Value gives the brightness, from 0 for black to 1 for full brightness.

Pressing the RGb or HSV button at top center switches the sliders to the other color system. You can adjust colors either via the sliders, or by typing in either the RGB or HSV text boxes.

Click OK to accept the color that you have chosen, or Cancel to retain the previous color setting.

The SHADING browser lets you specify the shading model that Geomview uses to paint the target geom.

Constant
Every face of the object is drawn with a constant color which does not depend on the location of the face, the camera, or the light sources. If the object does not contain per-face or per-vertex colors, the diffuse color of the object's appearance is used. If the object contains per-face colors, they are used. If the object contains per-vertex colors, each face is painted using the color of its first vertex.
Flat
Each face of the object is drawn with a color that depends on the relative location of the face, the camera, and the light sources. The color is constant across the face but may change as the face, camera, or lights move.
Smooth
Each face of the object is drawn with smoothly interpolated colors based on the normal vectors at each vertex. If the object does not contain per-vertex normals, this has the same effect as flat shading. If the object has reasonable per-vertex normals, the effect is to smooth over the edges between the faces.
CSmooth
Each face of the object is drawn with exactly the specified color(s), independent of lighting, orientation, and material properties. If the object is defined with per-vertex colors, the colors are interpolated smoothly across the face; otherwise the effect is the same as in Constant shading style.

The Facing Normals button on the Appearance panel indicates whether or not Geomview should arrange that normal vectors always face the viewer. If a normal vector points away from the viewer the color of the corresponding face or vertex usually is darker than is desired. Geomview can avoid this by using the opposite normal in shading calculations. This is the default. Using Facing Normals can give strange flickering dark or light shading effects, though, near the horizon of a fairly smooth facetted object. Press this button to use the normals given with the object.

The three text fields in the lower left corner of the Appearance panel are:

Line Width
The width, in pixels, for lines drawn by Geomview.
Normal Length
This is actually a scale factor; when normal vectors are drawn, Geomview draws them to have a length that is their natural length times this number.
Patch Dicing
Geomview draws Bezier patches by first converting them to meshes. This parameter specifies the resolution of the mesh: if Patch Dicing is n, then an n by n mesh is used to draw each Bezier patch. if Patch Dicing is 1, the resolution reverts to a built-in default value.

The Revert button on the Appearance panel undoes all settings in the target appearance. This causes the target geom to inherit all its appearance properties from its parent.

The Appearance panel's Override button determines whether appearance controls should override settings in the objects themselves – for example, setting the face color will affect all faces of objects with multi-colored facets. Otherwise, appearance controls only provide settings which the objects themselves do not specify. By default, Override is enabled. This button applies to all objects, and to all appearance-related panels. geomview-1.9.4/doc/geomview.html/escale.html0000644000175000001440000000334310663301507015744 00000000000000 escale - Geomview Manual

Next: , Previous: emodule-transmit, Up: GCL Reference


7.2.42 escale

(escale GEOM-ID FACTOR)
Same as scale but multiplies by exp(scale). Obsolete.
geomview-1.9.4/doc/geomview.html/ui_002dmotion.html0000644000175000001440000000646710663301507017112 00000000000000 ui-motion - Geomview Manual

Next: , Previous: ui-html-browser, Up: GCL Reference


7.2.135 ui-motion

(ui-motion {inertia|constrain|own-coordinates} {on|off})
Enable or disable certain properties of mouse-controlled motion. The purpose of this command is to give access to the respective toggles of the Main panel's Motion menu through GCL commands. See Mouse Motions.
inertia
Normally, moving objects have inertia: if the mouse is still moving when the button is released, the selected object continues to move. When inertia is off, objects cease to move as soon as you release the mouse.
constrain
It's sometimes handy to move an object in a direction aligned with a coordinate axis: exactly horizontally or vertically. Calling (ui-motion constrain on) changes the interpretation of mouse motions to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical motion. Note that the motion is still along the X or Y axes of the camera in which you move the mouse, not necessarily the object's own coordinate system.
own-coordinates
It's sometimes handy to move objects with respect to the coordinate system where they were defined, rather than with respect to some camera's view. When (ui-motion own-coordinates on) has been called, all motions are interpreted that way: dragging the mouse rightward in translate mode moves the object in its own +X direction, and so on. May be especially useful in conjunction with the (ui-motion constrain on) command.
geomview-1.9.4/doc/geomview.html/time_002dinterests.html0000644000175000001440000000462110663301507020134 00000000000000 time-interests - Geomview Manual

Next: , Previous: stereowin, Up: GCL Reference


7.2.124 time-interests

(time-interests deltatime initial prefix [suffix])
Indicates that all interest-related messages, when separated by at least deltatime seconds of real time, should be preceded by the string prefix and followed by suffix; the first message is preceded by initial. All three are printf format strings, whose argument is the current clock time (in seconds) on that stream. A deltatime of zero timestamps every message. Typical usage:
(time-interests .1 (set-clock %g) (sleep-until %g)) or
(time-interests .1 (set-clock %g) "(sleep-until %g) (progn (set-clock %g)" ")") or
(time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))".
geomview-1.9.4/doc/geomview.html/scene.html0000644000175000001440000000321510663301507015603 00000000000000 scene - Geomview Manual

Next: , Previous: scale, Up: GCL Reference


7.2.109 scene

(scene CAM-ID [GEOMETRY])
Make CAM-ID look at GEOMETRY instead of at the universe.
geomview-1.9.4/doc/geomview.html/inhibit_002dwarning.html0000644000175000001440000000357710663301507020262 00000000000000 inhibit-warning - Geomview Manual

Next: , Previous: if, Up: GCL Reference


7.2.58 inhibit-warning

(inhibit-warning STRING)
Inhibit warning inhbits geomview from displaying a particular warning message determined by STRING. At present there are no warning messages that this applies to, so this command is rather useless.
geomview-1.9.4/doc/geomview.html/Binary-format.html0000644000175000001440000000623410663301507017224 00000000000000 Binary format - Geomview Manual

4.1.8 Binary format

Many OOGL objects accept binary as well as ASCII file formats. These files begin with the usual ASCII token (e.g. CQUAD) followed by the word BINARY. Binary data begins at the byte following the first newline after BINARY. White space and a single comment may intervene, e.g.

     OFF BINARY	# binary-format "OFF" data follows

Binary data comprise 32-bit integers and 32-bit IEEE-format floats, both in big-endian format (i.e., with most significant byte first). This is the native format for 'int's and 'float's on Sun-3's, Sun-4's, and Irises, among others.

Binary data formats resemble the corresponding ASCII formats, with ints and floats in just the places you'd expect. There are some exceptions though, specifically in the QUAD, OFF and COMMENT file formats. Details are given in the individual file format descriptions. See QUAD, See OFF, and See COMMENT.

Binary OOGL objects may be freely mixed in ASCII object streams:

     LIST
     { = MESH BINARY
     ... binary data for mesh here ...
     }
     { = QUAD
     	1 0 0   0 0 1   0 1 0  0 1 0
     }

Note that ASCII data resumes immediately following the last byte of binary data.

Naturally, it's impossible to embed comments inside a binary-format OOGL object, though comments may appear in the header before the beginning of binary data. geomview-1.9.4/doc/geomview.html/new_002dreset.html0000644000175000001440000000331710663301507017072 00000000000000 new-reset - Geomview Manual

Next: , Previous: new-geometry, Up: GCL Reference


7.2.84 new-reset

(new-reset)
Equivalent to (progn (new-center ALLGEOMS)(new-center ALLCAMS)).
geomview-1.9.4/doc/geomview.html/merge_002dbase_002dap.html0000644000175000001440000000352010663301507020232 00000000000000 merge-base-ap - Geomview Manual

Next: , Previous: merge-ap, Up: GCL Reference


7.2.71 merge-base-ap

(merge-base-ap APPEARANCE)
merge-base-ap is a synonym for merge-baseap.
geomview-1.9.4/doc/geomview.html/List-of-Figures.html0000644000175000001440000000533010663301507017425 00000000000000 List of Figures - Geomview Manual

Previous: Function Index, Up: Top


List of Figures

geomview-1.9.4/doc/geomview.html/lt.html0000644000175000001440000000317610663301507015133 00000000000000 lt - Geomview Manual

Next: , Previous: shell, Up: GCL Reference


7.2.2 <

(< EXPR1 EXPR2)
Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.
geomview-1.9.4/doc/geomview.html/quit.html0000644000175000001440000000314710663301507015474 00000000000000 quit - Geomview Manual

Next: , Previous: progn, Up: GCL Reference


7.2.96 quit

(quit)
quit is a synonym for exit.
geomview-1.9.4/doc/geomview.html/morehelp.html0000644000175000001440000000464210663301507016326 00000000000000 morehelp - Geomview Manual

Next: , Previous: help, Up: GCL Reference


7.2.6 ??

(?? command)
command may include * wildcards. Prints more info than (? command). ?? is a synonym for morehelp.

Next: , Previous: merge-baseap, Up: GCL Reference


7.2.73 morehelp

(morehelp command)
command may include * wildcards. Prints more info than (help command).
geomview-1.9.4/doc/geomview.html/load.html0000644000175000001440000000413410663301507015426 00000000000000 load - Geomview Manual

Next: , Previous: lines-closer, Up: GCL Reference


7.2.62 load

(load filename [command|geometry|camera])
Loads the given file into geomview. The optional second argument specifies the type of data it contains, which may be command (geomview commands), geometry (OOGL geometric data), or camera (OOGL camera definition). If omitted, attempts to guess about the file's contents. Loading geometric data creates a new visible object; loading a camera opens a new window; loading a command file executes those commands.
geomview-1.9.4/doc/geomview.html/freeze.html0000644000175000001440000000334110663301507015766 00000000000000 freeze - Geomview Manual

Next: , Previous: ezoom, Up: GCL Reference


7.2.49 freeze

(freeze CAM-ID)
Freeze CAM-ID; drawing in this camera's window is turned off until it is explicitly redrawn with (redraw CAM-ID), after which time drawing resumes as normal.
geomview-1.9.4/doc/geomview.html/ui_002dhtml_002dbrowser.html0000644000175000001440000000425310663301507020671 00000000000000 ui-html-browser - Geomview Manual

Next: , Previous: ui-freeze, Up: GCL Reference


7.2.134 ui-html-browser

(ui-html-browser BROWSER)
Use BROWSER for viewing the HTML-version of the manual when the `Manual (HTML)' menu item is selected in the `Help'-menu. If the (ui-html-browser...) command was never executed, then the default is to use the browser stored in the WEBBROWSER environment variable. If the environment variable is unset then the default is compile-time dependent.
geomview-1.9.4/doc/geomview.html/index.html0000644000175000001440000000734410663301507015624 00000000000000 Geomview Manual

Geomview Manual

Next: , Previous: (dir), Up: (dir)


Geomview, the interactive 3D viewing program.

geomview-1.9.4/doc/geomview.html/echo.html0000644000175000001440000000371010663301507015424 00000000000000 echo - Geomview Manual

Next: , Previous: dump-handles, Up: GCL Reference


7.2.32 echo

(echo ...)
Write the given data to the special file -. Strings are written literally; lisp expressions are evaluated and their values written. If received from an external program, echo sends to the program's input. Otherwise writes to geomview's own standard output (typically the terminal).
geomview-1.9.4/doc/geomview.html/camera_002dprop.html0000644000175000001440000000425310663301507017367 00000000000000 camera-prop - Geomview Manual

Next: , Previous: camera-draw, Up: GCL Reference


7.2.17 camera-prop

(camera-prop { geometry object } [projective])
Specify the object to be shown when drawing other cameras. By default, this object is drawn with its origin at the camera, and with the camera looking toward the object's -Z axis. With the projective keyword, the camera's viewing projection is also applied to the object; this places the object's Z=-1 and Z=+1 at near and far clipping planes, with the viewing area -1<={X,Y}<=+1. Example: (camera-prop { < cube } projective)
geomview-1.9.4/doc/geomview.html/soft_002dshader.html0000644000175000001440000000330710663301507017377 00000000000000 soft-shader - Geomview Manual

Next: , Previous: snapshot, Up: GCL Reference


7.2.121 soft-shader

(soft-shader CAM-ID {on|off|toggle})
Select whether to use software or hardware shading in that camera.
geomview-1.9.4/doc/geomview.html/Object-File-Formats.html0000644000175000001440000000622510663301507020206 00000000000000 Object File Formats - Geomview Manual

4.2 Object File Formats

geomview-1.9.4/doc/geomview.html/transform_002dset.html0000644000175000001440000000365010663301507017765 00000000000000 transform-set - Geomview Manual

Next: , Previous: transform-incr, Up: GCL Reference


7.2.127 transform-set

(transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center])
Set objectID's transform to the constructed transform. Same syntax as transform.
geomview-1.9.4/doc/geomview.html/Appearances.html0000644000175000001440000002516110663301507016734 00000000000000 Appearances - Geomview Manual

Next: , Previous: References, Up: Conventions


4.1.10 Appearances

Geometric objects can have associated "appearance" information, specifying shading, lighting, color, wire-frame vs. shaded-surface display, and so on. Appearances are inherited through object hierarchies, e.g. attaching an appearance to a LIST means that the appearance is applied to all the LIST's members.

Some appearance-related properties are relegated to "material", "lighting" and "texture" substructures. Take care to note which properties belong to which structure. Any geometric object can be preceded by an appearance definition like in the following example:

     {
        appearance { +edge }
        LIST { < "file1" } { QUAD 1 0 0  0 0 1  0 1 0  1 0 0 }
     }

Appearances are also OOGL objects in their own right and can be given symbolic names and referenced by them (see References). See Appearance objects.

Texture Mapping
There is a separate section concerning the definition of textures (see Texture Mapping).
Transparency
Rendering translucent objects is not supported by all drawing back ends. The OpenGL renderer has limited support for it: top-level objects (i.e. those which appear in the object browser of the main panel (see The Main Panel) are rendered correctly by means of alpha-blending). Also, the RenderMan snapshots will include opacity values.

Here's an example appearance structure including values for all attributes. Order of attributes is unimportant. As usual, white space is irrelevant. Boolean attributes may be preceded by "+" or "-" to turn them on or off; "+" is assumed if only the attribute name appears. Other attributes expect values.

A "*" prefix on any attribute, e.g. "*+edge" or "*linewidth 2" or "material { *diffuse 1 1 .25 }", selects "override" status for that attribute.

     appearance {
       +face               # (Do) draw faces of polygons.  On by default.
       -edge               # (Don't) draw edges of polygons
       +vect               # (Do) draw VECTs.  On by default.
       -transparent        # (Disable) transparency. Enabling transparency
                           # does not (necessarily) result in a correct Geomview
                           # pictures, but alpha values are used in RenderMan
                           # snapshots.
       -normal             # (Do) draw surface-normal vectors
       normscale 1         # ... with length 1.0 in object coordinates
     
       +evert              # do evert polygon normals where needed so as
                           #   to always face the camera
     
       +texturing          # (Enable) texture mapping
       +linear             # (Enable) linear average of closest texture elements
       +mipmap             # (Enable) texture mip-mapping
       +mipinterp          # (Enable) linear mip-mapping
       -backcull           # (Don't) discard clockwise-oriented faces
       -concave            # (Don't) expect and handle concave polygons
       -shadelines	      # (Don't) shade lines as if they were lighted cylinders
     		      # These four are only effective where the graphics system
     		      # supports them, namely on GL and Open GL.
     
       -keepcolor	      # Normally, when N-D positional coloring is enabled as
     		      # with geomview's (ND-color ...) command, all
     		      # objects' colors are affected.  But, objects with the
     		      # "+keepcolor" attribute are immune to N-D coloring.
     
       shading smooth      # or ``shading constant'' or ``shading flat'' or
                           # or ``shading csmooth''.
                           # smooth = Gouraud shading, flat = faceted,
                           # csmooth = smoothly interpolated but unlighted.
     
       linewidth 1         # lines, points, and edges are 1 pixel wide.
     
       patchdice 10 10     # subdivide Bezier patches this finely in u and v
     
       material {         # Here's a material definition;
                           # it could also be read from a file as in
                           #  ``material < file.mat''
     
           ka  1.0         # ambient reflection coefficient.
           ambient .3 .5 .3 # ambient color (red, green, blue components)
                           # The ambient contribution to the shading is
                           # the product of ka, the ambient color,
                           # and the color of the ambient light.
     
           kd  0.8         # diffuse-reflection coefficient.
           diffuse .9 1 .4 # diffuse color.
                             # (In ``shading constant'' mode, the surface
                             # is colored with the diffuse color.)
     
           ks 1.0          # specular reflection coefficient.
           specular 1 1 1  # specular (highlight) color.
           shininess  25   # specular exponent; larger values give
                           # sharper highlights.
     
           backdiffuse .7 .5 0 # back-face color for two-sided surfaces
                             # If defined, this field determines the diffuse
                             # color for the back side of a surface.
                             # It's implemented by the software shader, and
                             # by hardware shading on GL systems which support
                             # two-sided lighting, and under Open GL.
     
           alpha   1.0     # opacity; 0 = transparent (invisible), 1 = opaque.
                           # Ignored when transparency is disabled.
     
           edgecolor   1 1 0  # line & edge color
     
           normalcolor 0 0 0  # color for surface-normal vectors
       }
     
       lighting {         # Lighting model
     
           ambient  .3 .3 .3  # ambient light
     
           replacelights   # ``Use only the following lights to
                           # illuminate the objects under this
                           # appearance.''
                           # Without "replacelights", any lights listed
                           # are added to those already in the scene.
     
                           # Now a collection of sample lights:
           light {
               color  1 .7 .6      # light color
               position  1 0 .5 0  # light position [distant light]
                                   # given in homogeneous coordinates.
                                   # With fourth component = 0,
                                   # this means a light coming from
                                   # direction (1,0,.5).
           }
     
           light {                        # Another light.
               color 1 1 1
               position  0 0 .5 1  # light at finite position ...
               location camera     # specified in camera coordinates.
                                   # (Since the camera looks toward -Z,
                                   # this example places the light
                                   # .5 unit behind the eye.)
               # Possible "location" keywords:
               #  global    light position is in world (well, universe) coordinates
               #             This is the default if no location specified.
               #  camera   position is in the camera's coordinate system
               #  local    position is in the coordinate system where
               #                   the appearance was defined
           }
       }                   # end lighting model
       texture {
             clamp st               # or ``s'' or ``t'' or ``none''
             file lump.tiff         # file supplying texture-map image
             alphafile mask.pgm.Z   # file supplying transparency-mask image
             apply blend            # or ``modulate'' or ``decal''
             transform  1 0 0 0     # surface (s,t,0,1) * tfm -> texture coords
                        0 1 0 0
                        0 0 1 0
                       .5 0 0 1
     
             background 1 0 0 1     # relevant for ``apply blend''
       }
     }                     # end appearance

There are rules for inheritance of appearance attributes when several are imposed at different levels in the hierarchy.

For example, Geomview installs a backstop appearance which provides default values for most parameters; its control panels install other appearances which supply new values for a few attributes; user-supplied geometry may also contain appearances.

The general rule is that the child's appearance (the one closest to the geometric primitives) wins. Further, appearance controls with "override" status (e.g. *+face or material { *diffuse 1 1 0 }) win over those without it.

Geomview's appearance controls use the "override" feature so as to be effective even if user-supplied objects contain their own appearance settings. However, if a user-supplied object contains an appearance field with override status set, that property will be immune to Geomview's controls. geomview-1.9.4/doc/geomview.html/BBP-and-BEZ.html0000644000175000001440000001333510663301507016273 00000000000000 BBP and BEZ - Geomview Manual

Next: , Previous: BBOX, Up: Object File Formats


4.2.4 Bezier Surfaces

The conventional file suffixes for Bezier surface files are .bbp or .bez. A file with either suffix may contain either type of patch.

Syntax:

       [ST]BBP -or- [C]BEZ<Nu><Nv><Nd>[_ST]
     			# Nu, Nv are u- and v-direction
     			# polynomial degrees in range 1..6
     			# Nd = dimension: 3->3-D, 4->4-D (rational)
     			# (The '<' and '>' do not appear in the input.)
     			# Nu,Nv,Nd are each a single decimal digit.
     			# BBP form implies Nu=Nv=Nd=3 so BBP = BEZ333.
     
     		# Any number of patches follow the header
     			# (Nu+1)*(Nv+1) patch control points
     			# each 3 or 4 floats according to header
       vertex(u=0,v=0)  vertex(1,0) ... vertex(Nu,0)
       vertex(0,1)			   ... vertex(Nu,1)
       ...
       vertex(0,Nv)		   ... vertex(Nu,Nv)
     
     			# ST texture coordinates if mentioned in header
       S(u=0,v=0)	T(0,0)	S(0,Nv) T(0,Nv)
       S(Nu,0)	T(Nu,0)	S(Nu,Nv) T(Nu,Nv)
     
     			# 4-component float (0..1) R G B A colors
     			# for each patch corner if mentioned in header
       RGBA(0,0)   RGBA(0,Nv)
       RGBA(Nu,0)  RGBA(Nu,Nv)

These formats represent collections of Bezier surface patches, of degrees up to 6, and with 3-D or 4-D (rational) vertices.

The header keyword has the forms [ST]BBP or [C]BEZ<Nu><Nv><Nd>[_ST] (the '<' and '>' are not part of the keyword.

The ST prefix on BBP, or _ST suffix on BEZuvn, indicates that each patch includes four pairs of floating-point texture-space coordinates, one for each corner of the patch.

The C prefix on BEZuvn indicates a colored patch, including four sets of four-component floating-point colors (red, green, blue, and alpha) in the range 0..1, one color for each corner.

Nu and Nv, each a single digit in the range 1..6, are the patch's polynomial degree in the u and v direction respectively.

Nd is the number of components in each patch vertex, and must be either 3 for 3-D or 4 for homogeneous coordinates, that is, rational patches.

BBP patches are bicubic patches with 3-D vertices, so BBP = BEZ333 and STBBP = BEZ333_ST.

Any number of patches follow the header. Each patch comprises a series of patch vertices, followed by optional (s,t) texture coordinates, followed by optional (r,g,b,a) colors.

Each patch has (Nu+1)*(Nv+1) vertices in v-major order, so that if we designate a vertex by its control point indices (u,v) the order is

          (0,0) (1,0) (2,0) ...  (Nu,0)
          (0,1) (1,1) (2,1) ...  (Nu,1)
          ...
          (0,Nv)            ...  (Nu,Nv)

with each vertex containing either 3 or 4 floating-point numbers as specified by the header.

If the header calls for ST coordinates, four pairs of floating-point numbers follow: the texture-space coordinates for the (0,0), (Nu,0), (0,Nv), and (Nu,Nv) corners of the patch, respectively.

If the header calls for colors, four four-component (red, green, blue, alpha) floating-point colors follow, one for each patch corner.

The series of patches ends at end-of-file, or with a closebrace if incorporated in an object reference. geomview-1.9.4/doc/geomview.html/appearance.html0000644000175000001440000000367010663301507016612 00000000000000 appearance - Geomview Manual

4.3.1 Appearance Objects

Appearances are OOGL objects of their own right, which simply means that it is possible to give them symbolic names (see References). There are other sections dealing with appearance details. See Appearances. geomview-1.9.4/doc/geomview.html/Installation.html0000644000175000001440000000570010663301507017150 00000000000000 Installation - Geomview Manual

Next: , Previous: Mathematica, Up: Top


10 Installation

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

What you do to install Geomview depends on which kind of computer you have and on whether you have the source distribution or the binary distribution.

In general, if you don't care about looking at Geomview's source code, you should get one of the binary distribution. The binary installation is much easier and quicker than compiling and installing the source code.

geomview-1.9.4/doc/geomview.html/car.html0000644000175000001440000000314410663301507015254 00000000000000 car - Geomview Manual

Next: , Previous: camera-reset, Up: GCL Reference


7.2.19 car

(car LIST)
returns the first element of LIST.
geomview-1.9.4/doc/geomview.html/position.html0000644000175000001440000000326010663301507016352 00000000000000 position - Geomview Manual

Next: , Previous: pickable, Up: GCL Reference


7.2.92 position

(position objectID otherID)
Set the transform of objectID to that of otherID.
geomview-1.9.4/doc/geomview.html/BBOX.html0000644000175000001440000000615210663301507015243 00000000000000 BBOX - Geomview Manual

Next: , Previous: MESH, Up: Object File Formats


4.2.3 BBOX: simple bounding boxes

This is a very simple toy-object: it takes 2 vertices and draws a (hyper-) cube which is the bounding box of the two vertices.

Syntax:

       BBOX
       x[0] y[0] z[0]
       x[1] y[1] z[1]

or

       4BBOX
       x[0] y[0] z[0] w[0]
       x[1] y[1] z[1] w[1]

or

       nBBOX
       Ndim # > 3
       x[0] y[0] z[0] w[0] ...
       x[1] y[1] z[1] w[1] ...

or

       4nBBOX
       Ndim # > 3
       d[0] x[0] y[0] z[0] w[0] ...
       d[0] x[1] y[1] z[1] w[1] ...

There is no BBOX binary format. The 4 modifyer has different meanings depending on the dimension of the bounding box: 4BBOX means that the 4 components of the vertices make up a 4-dimensional bounding-box. Using 4 in conjunction with n4nBBOX NDim – means that the vertices specified in the file have NDim+1 components, but the component at index 0 is the homogeneous divisor (in contrast to the ordinary 3d case where the homogeneous divisor would be the w – the third – component). geomview-1.9.4/doc/geomview.html/rawpick.html0000644000175000001440000000332210663301507016145 00000000000000 rawpick - Geomview Manual

Next: , Previous: rawevent, Up: GCL Reference


7.2.99 rawpick

(rawpick CAMID X Y)
Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordinates. This is a low-level procedure not intended for external use.
geomview-1.9.4/doc/geomview.html/figmainpanel.html0000644000175000001440000000012110663301507017131 00000000000000 geomview-1.9.4/doc/geomview.html/cursor_002dstill.html0000644000175000001440000000350210663301507017617 00000000000000 cursor-still - Geomview Manual

Next: , Previous: copy, Up: GCL Reference


7.2.24 cursor-still

(cursor-still [INT])
Sets the number of microseconds for which the cursor must not move to register as holding still. If INT is not specified, the value will be reset to the default.
geomview-1.9.4/doc/geomview.html/Mouse-Motions.html0000644000175000001440000002710210663301507017225 00000000000000 Mouse Motions - Geomview Manual

Next: , Previous: Loading, Up: Interaction


3.5 Using the Mouse to Manipulate Objects

Geomview lets you manipulate objects with the mouse. There are six different mouse motion modes: Rotate, Translate, Cam Fly, Cam Zoom, Geom Scale, and Cam Orbit. The tools panel has a button for each of these modes; to switch modes, click on the corresponding button. You can also select these through the Motion Mode browser on the Main panel.

This section describes basic mouse interaction. For details, see Commands.

figs/tools.png

Figure 3.4: The Tools Panel.

Each of the motion modes uses a common paradigm for how the motion is applied. In particular, each depends on the current target object and the current center object. These are explained in the following paragraphs.

The current target object is shown in the Target field in the Tools panel. This is the same as the selected object in the Targets browser in the Main panel, and you can change it by either selecting a new object in the browser, by typing a new entry in the field, or by picking an object in a camera window by double-clicking the right mouse button with the cursor over the object.

The current center object is shown in the Center field in the Tools panel. Its default value is the special word "target", which means that the center object is whatever the target object is. You can change the center to any object by typing it in the Center field. The origin of the center object is held fixed in Rotate and Orbit modes. Normally the center object is one of the existing geoms listed in the Targets browser, and the actual center of rotations is the origin of that object's coordinate system. It is possible, however, to select an arbitrary point of interest on an object as the center. For details, see Point of Interest.

It is also possible to toggle the button BBox Center to set the center of motion to the center of the current object's bounding box. Once toggled the active geometry's bounding box center will become the center of motion, if you select another object, then the center of motion will become the center of that object's bounding box. Nothing changes when a camera or the World is selected, you have to type in the word target in the Center field the reset to the default.

You apply a mouse motion by holding down either the left or middle mouse button with the cursor in a camera window and moving the mouse. Most of the modes have inertia, which means that if you let go of the button while moving the mouse, the motion will continue. It may be helpful to imagine the mouse cursor as being a gripper; when you hold a mouse button down, it grips the target object and you can move it. When you let go of the mouse button, the gripper releases the object. Letting go of the mouse button while moving the mouse is like throwing the object — the object continues moving independent of the mouse. Inertia can be turned off; see the Main panel's Motion menu, described below.

Generally, the left mouse button controls motion in the screen plane, while the middle mouse controls motion along or around the forward direction.

Pressing the shift key while dragging with left or middle mouse buttons in most motion modes gives slow-speed motions, useful for fine adjustment.

You can pick any point on an object (not just its origin) as the center of motion by holding down the shift key while clicking the right mouse button; this chooses a point of interest.

Rotate
In Rotate mode, hold the left mouse button down to rotate the target object about the center object. Rotation proceeds in the direction that you move the mouse. Specifically, the axis of rotation passes through the origin of the center object, is parallel to the camera view plane, and is perpendicular to the direction of motion of the mouse. When the center is "target", this means that the target object rotates about its own origin.

The middle mouse button in Rotate mode rotates the target object about an axis perpendicular to the view plane.

Translate
In Translate mode, hold the left mouse button down to translate the target object in the direction of mouse motion. The middle mouse button translates the target along an axis perpendicular to the view plane.

In Euclidean space, the center object is essentially irrelevant for translations. In hyperbolic and spherical spaces, where translations have a unique axis, this axis is chosen to go through the origin of the center object.

Cam Fly
Cam Fly is a crude flight simulator that lets you fly around the scene. It works by moving the camera. Move the mouse while holding the left mouse button down to point the camera in a different direction. To move forward or backward, hold down the middle button and move the mouse vertically. Both of these motions have inertia; typically the easiest way to fly around a scene is to give the camera a slight forward push by letting go of the middle button while moving the mouse upward, and then using the left button to steer.

Cam Fly affects the camera window that the mouse is in; it ignores the target object and the center object.

Cam Orbit
Cam Orbit mode lets you rotate the current camera around the current center. The left mouse button does this rotation. The middle mouse button in Cam Orbit mode acts as in Cam Fly mode: it moves the camera forward or backward.

In general Cam Orbit does not move the target object, although if the current camera is selected as the target and the center is also the target, it will pivot that camera about itself just as in Cam Fly mode.

Cam Zoom
Cam Zoom mode lets you change the current camera's field of view with the mouse; hold the left mouse button down and move the mouse to change it. The numeric value of the field of view is shown in the FOV field in the Camera panel.
Geom Scale
Geom Scale mode lets you enlarge or shrink a geom. It operates on the target object if that object is a geom. If the target is a camera, Geom Scale operates on the geom that was most recently the target object. Moving the mouse while holding down the left mouse button scales the object either up or down, depending on the direction of mouse motion. The center of the applied scaling transformation is the center object.

Scaling is meaningful only in Euclidean space; attempts to scale are ignored in other spaces.

Geom Scale mode does not have inertia.

The Stop, Look At, Center, and Reset buttons on the Tools panel perform actions related to motions but do not change the current motion mode.

Stop
The Stop button causes all motions to stop. It affects all moving objects, not just the target object. Its keyboard shortcut is H.

The keyboard command h, which does not correspond to a panel button, stops the current motion for the target object only.

Look At
The Look At button causes the current camera to be moved to a position such that it is looking at the target object, and such that the target object more or less fills the window.

The Look At command is unreliable in non-Euclidean spaces.

Center
The Center button undoes the target object's transformation, moving it back to its home position, which is where it was when you originally loaded it into Geomview.
Reset
The Reset button stops all motion and causes all objects to move back to their home positions.

The Tools panel also sports a Main button, to invoke the main panel in case it was dismissed or buried, and a Done button to close the Tools panel.

The Main panel's Motion menu has special controls affecting how mouse motions are interpreted; the toggles are also accessible through a GCL command. See (ui-motion ...).

[ui] Inertia
Normally, moving objects have inertia: if the mouse is still moving when the button is released, the selected object continues to move. When Inertia is off, objects cease to move as soon as you release the mouse.
[uc] Constrain Motion
It's sometimes handy to move an object in a direction aligned with a coordinate axis: exactly horizontally or vertically. Selecting Constrain Motion changes the interpretation of mouse motions to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical motion. Note that the motion is still along the X or Y axes of the camera in which you move the mouse, not necessarily the object's own coordinate system.
[uo] Own Coordinates
It's sometimes handy to move objects with respect to the coordinate system where they were defined, rather than with respect to some camera's view. While Own Coordinates is selected, all motions are interpreted that way: dragging the mouse rightward in translate mode moves the object in its own +X direction, and so on. May be especially useful in conjunction with the Constrain Motion button.
geomview-1.9.4/doc/geomview.html/evert.html0000644000175000001440000000327210663301507015636 00000000000000 evert - Geomview Manual

Next: , Previous: event-pick, Up: GCL Reference


7.2.46 evert

(evert GEOM-ID [yes|no])
Set the normal eversion state of GEOM-ID. If the second argument is omitted, toggle the eversion state.
geomview-1.9.4/doc/geomview.html/Modules.html0000644000175000001440000000604110663301507016116 00000000000000 Modules - Geomview Manual

Next: , Previous: Customization, Up: Top


6 External Modules

An external module is a program that interacts with Geomview. A module communicates with Geomview through GCL and can control any apsect of Geomview that you can control through Geomview's user interface.

In many cases an external module is a specialized program that implements some mathematical algorithm that creates a geometric object that changes shape as the algorithm progresses. The module informs Geomview of the new object shape at each step, so the object appears to evolve with time in the Geomview window. In this way Geomview serves as a display engine for the module.

An external module may be interactive. It can respond to mouse and keyboard events that take place in a Geomview window, thus extending the capability of Geomview itself.

geomview-1.9.4/doc/geomview.html/replace_002dgeometry.html0000644000175000001440000000356110663301507020426 00000000000000 replace-geometry - Geomview Manual

Next: , Previous: rehash-emodule-path, Up: GCL Reference


7.2.105 replace-geometry

(replace-geometry GEOM-ID PART-SPECIFICATION GEOMETRY)
Replace a part of the geometry for GEOM-ID.
geomview-1.9.4/doc/geomview.html/figmyfilelist.html0000644000175000001440000000011010663301507017344 00000000000000 geomview-1.9.4/doc/geomview.html/ui_002dfreeze.html0000644000175000001440000000350110663301507017047 00000000000000 ui-freeze - Geomview Manual

Next: , Previous: ui-emotion-run, Up: GCL Reference


7.2.133 ui-freeze

(ui-freeze {on|off})
Toggle updating user interface panels. Off by default.
geomview-1.9.4/doc/geomview.html/emodule_002ddefine.html0000644000175000001440000000405710663301507020045 00000000000000 emodule-define - Geomview Manual

Next: , Previous: emodule-clear, Up: GCL Reference


7.2.34 emodule-define

(emodule-define NAME SHELL-COMMAND ...)
Define an external module called NAME, which then appears in the external-module browser. The SHELL-COMMAND string is a UNIX shell command which invokes the module. See (emodule-run ...) for discussion of external modules.
geomview-1.9.4/doc/geomview.html/geomview_002dversion.html0000644000175000001440000000333410663301507020465 00000000000000 geomview-version - Geomview Manual

Next: , Previous: geometry, Up: GCL Reference


7.2.51 geomview-version

(geomview-version)
Returns a string representing the version of geomview that is running.
geomview-1.9.4/doc/geomview.html/History.html0000644000175000001440000001012610663301507016146 00000000000000 History - Geomview Manual

Next: , Previous: Copying, Up: Top


History of Geomview's Development

Geomview was originally written at the Geometry Center at the University of Minnesota in Minneapolis. The Geometry Center was a research and education center funded by the National Science Foundation, with a mission to promote research and communication of mathematics. Much of the work there involved the use of computers to help visualize mathematical concepts.

The project that eventually led to Geomview began in the summer of 1988 with the work of Pat Hanrahan on a viewing program called MinneView. Shortly thereafter Charlie Gunn begin developing OOGL (Object Oriented Graphics Language) in conjunction with MinneView. Many people contributed to OOGL and MinneView, including Stuart Levy, Mark Meuer, Tamara Munzner, Steve Anderson, Mario Lopez, Todd Kaplan.

In 1991 the staff of the Geometry Center began work on a new improved version of OOGL, and a new and improved viewing program, which they called Geomview. At that time essentially the only game in town for interactive 3D graphics was Silicon Graphics (SGI), so Geomview was developed initially on SGI workstations, using IRIS GL. The first version was finished in January of 1992. It immediately became very popular among visitors to the Geometry Center, and through the Center's ftp archive (this was before the web) people at other institutions began using it too.

In addition to SGI workstations the Geometry Center had quite a few NeXT stations, so soon after Geomview was running on SGIs the staff developed a version for NeXTStep as well. By this time there were several thousand people using it around the world.

A few years later the staff ported Geomview to X windows and OpenGL, and eventually, with the demise of NeXT, the NeXT version fell by the wayside.

In its mission to foster communication among researchers and educators, the Geometry Center developed a web site, www.geom.umn.edu, in late 1993. It was one of the first 300 web sites in existence. A part of the web site was of course devoted to Geomview, and helped to spread the word about its existence.

The Geometry Center closed its "brick and mortar" facilities in August of 1998 (NSF cut its funding), but the web site continued to exist, and Geomview continued to be very popular around the world. In December of 1999 some of the former Geometry Center staff set up http://www.geomview.org as a permanent home on the web for Geomview.

Geomview's original authors, as well as a number of other volunteers around the world, are still actively involved in using and developing Geomview.

geomview-1.9.4/doc/geomview.html/look.html0000644000175000001440000000437010663301507015455 00000000000000 look - Geomview Manual

Next: , Previous: load-path, Up: GCL Reference


7.2.64 look

(look [objectID] [cameraID])
Rotates the named camera to point toward the center of the bounding box of the named object (or the origin in hyperbolic or spherical space). In Euclidean space, moves the camera forward or backward until the object appears as large as possible while still being entirely visible. Equivalent to
          progn (
          	(look-toward [objectID] [cameraID] {center | origin})
          	[(look-encompass [objectID] [cameraID])]
          )
     

If objectID is not specified, it is assumed to be World. If cameraID is not specified, it is assumed to be targetcam.

geomview-1.9.4/doc/geomview.html/Unix-Binary-Installation.html0000644000175000001440000001330310663301507021311 00000000000000 Unix Binary Installation - Geomview Manual

10.1 Installing the Unix Binary Distribution

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

If you have just obtained a copy of the binary distribution for a Unix system (Linux, SGI, Solaris, HP, etc), you should be able to run Geomview and make use of most of its features immediately after unpacking it by cd'ing to the directory that it is in and typing geomview.

In order to fully install Geomview so that you can run it from any directory and use all of its features, follow the steps in this section. In particular, you must go through this installation procedure in order to use Geomview to display Mathematica graphics.

Geomview is distributed in a directory that contains various files and subdirectories that Geomview needs at run-time, such as data files and external modules. It also contains other things distributed with Geomview, such as documentation and (in the soure-code distribution) source-code. We refer to the root directory of this tree as the $GEOMROOT directory. This is the directory called Geomview that is created when you unpack the distribution file.

To install Geomview on your system, arrange for the $GEOMROOT directory to be in a permanent place. Then, in a shell window, cd to that directory and type install. This runs a shell script which does the installation after asking you several questions about where you want to install the various components of Geomview.

After running the install script you should now be able to run Geomview from any directory on your system. (You may need to give the rehash command in any shells on your computer that were started up before you did the installation.)

The install script puts copies of the files in $GEOMROOT/bin/<CPU> and $GEOMROOT/man into the directories you specified for executables and man pages, respectively. Once you have done the installation you can cut down one the disk space required by Geomview by removing some files from these directories, since copies have been installed elsewhere. You should first test that your installed Geomview works properly because once you remove these files from their distribution directories you will not be able to do the installation again.

In particular, the files you can remove are

$GEOMROOT/bin/<MACHTYPE>:
(where <MACHTYPE> is the type of system you are on, e.g. linux, sgi, hpux, etc). Remove all files from here except gvx, which is the geomview executable file. DO NOT REMOVE gvx. It is not installed elsewhere.
$GEOMROOT/man:
You can remove all the files in this directory.
geomview-1.9.4/doc/geomview.html/RenderMan.html0000644000175000001440000001172410663301507016365 00000000000000 RenderMan - Geomview Manual

Next: , Previous: Geomview.m, Up: Mathematica


9.3 Using Mathematica to generate RenderMan files

In addition to the WriteOOGL and Geomview commands described above, the package OOGL.m also defines the command WriteRIb which writes a 3D graphics object to a RenderMan RIB file: WriteRIB[file, graphics] writes graphics to file file. RenderMan is a commercial rendering system available from Pixar, Inc., which can produce extremely high quality images.

     In[1] := <<OOGL.m
     
     In[2] := <<Graphics/Polyhedra.m
     
     In[3] := Graphics3D[Cube[]]
     
     Out[3] := -Graphics3D-
     
     In[4] := WriteRIB["cube.rib", %3]
     
     Out[4] := -Graphics3D-

This generates the file math.rib. This is a ready-to-render RIB file of the given geometry, using a default camera position, lighting, and the “plastic” shader. In a shell window, type render cube.rib to generate the image file mma.tiff. Of course, you need to have RenderMan installed for this to work. A shortcut to render from inside Mathematica is WriteRIB["!render", foo].

WriteRIb works by first converting the Mathematica graphics object to OOGL format using WriteOOGL and then calls an external program oogl2rib to convert OOGL to RIB format. The oogl2rib program takes several options which you can specify in a string as an optional third argument to WriteRIb. The default option string is " -n mma.tiff ", which indicates that the RIB file should generate a rendered TIFF file named mma.tiff. A particularly useful option is -g, which tells oogl2rib to convert only the geometry into a RIB fragment. You can insert that fragment into a full RIB file of your own making with camera positions and shaders of your choice, to harness the full power of RenderMan.

The full usage of oogl2rib is:

     oogl2rib [-n name] [-B r,g,b] [-w width] [-h height] [-fgb] [infile] [outfile]

By default it reads from stdin and writes to stdout. Either infile or outfile may be -, which means use stdin/stdout. The options are:

-n name
Use name for the name of the rendered TIFF file (default "geom.tiff") or framebuffer window (default "geom.rib").
-B r,g,b
Use background color (r,g,b). Each component ranges from 0 to 1. Default: none.
-w width -h height
Rendered frame will be width by height pixels.
-f
RIB file renders to on-screen framebuffer instead of TIFF file.
-g
Output only the geometry in RIB format.
-b
Output only a Quick Renderman clip object. Ignores -nBwhf.
geomview-1.9.4/doc/geomview.html/Mathematica.html0000644000175000001440000000647410663301507016735 00000000000000 Mathematica - Geomview Manual

Next: , Previous: Non-Euclidean Geometry, Up: Top


9 Mathematica Graphics in Geomview or RenderMan

Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc.

There are two ways to do this.

  1. Use Mathematica to write a graphics object to a file in OOGL format or in RIB format.
  2. Use Geomview as the default display for all 3D graphics output in Mathematica.
You can also use these packages to save Mathematica graphics in RenderMan (RIB) format.

Since the format of Mathematica graphics objects is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either of the above you must install this package.

geomview-1.9.4/doc/geomview.html/position_002dtoward.html0000644000175000001440000000362310663301507020323 00000000000000 position-toward - Geomview Manual

Next: , Previous: position-at, Up: GCL Reference


7.2.94 position-toward

(position-toward objectID otherID [center | origin])
Rotate objectID so that the center of the bounding box or the origin of the coordinate system of the otherID lies on the positive z-axis of the first object. Default is the center of the bounding box.
geomview-1.9.4/doc/geomview.html/Geomview_002em.html0000644000175000001440000001153310663301507017175 00000000000000 Geomview.m - Geomview Manual

Next: , Previous: OOGL.m, Up: Mathematica


9.2 Using Geomview as Mathematica's Default 3D Display

The package Geomview.m arranges for Geomview to be the default display program for 3D graphics in Mathematica. To load it, give the command << Geomview.m to Mathematica. Thereafter, whenever you display 3D graphics with Plot3D or Show, Mathematica will send the graphics to Geomview.

Loading Geomview.m implicitly loads OOGL.m as well, so you can use the Geomview and WriteOOGL as described above after loading Geomview.m. You do not have to separately load OOGL.m.

     % math
     Mathematica 2.0 for SGI Iris
     Copyright 1988-91 Wolfram Research, Inc.
      -- GL graphics initialized --
     
     In[1] := <<Geomview.m
     
     In[2] := Plot3D[x^2 + y^2, {x, -2, 2}, {y, -2, 2}]
     
     Out[2] := -SurfaceGraphics-

This invokes geomivew and loads the graphics object into it.

     In[3] := Plot3D[{x*y + 6, RGBColor[0,x,y]}, {x,0,1}, {y,0,1}]
     
     Out[3] := -SurfaceGraphics-

This replaces the previous Geomview object by the new object.

     In[4] := Geomview[{%2,%3}]
     
     Out[4] := {-SurfaceGraphics-, -SurfaceGraphics-}

This displays both objects at once. You also can have more than one Mathematica object at a time on display in Geomview, and have separate control over them, by using the Geomview command with a name, See OOGL.m.

     In[5] := Graphics3D[ {RGBColor[1,0,0], Line[{ {2,2,2},{1,1,1} }] }]
     
     Out[5] := -Graphics3D-
     
     In[6] := Geomview["myline", %5]

This addes the Line specified in In[5] to the existing Geomview display. It can be controlled independently of the "Mathematica" object, which is currently the list of two plots.

     In[7] := <<GL.m

If you're on an SGI, loading GL.m returns Mathematica to its usual 3D graphics display. The following plot will appear in a normal static Mathematica window.

     In[8] := ParametricPlot3D[{Sin[x],Sin[y],Sin[x]*Cos[y]}, {x,0,Pi},{y,0,Pi}]
     
     Out[8] := -Graphics3D-

We can return to Geomview graphics at any time by reloading Geomview.m.

     In[9] := <<Geomview.m
     
     In[10] := Show[%8]
     
     Out[10] := -Graphics3D-
     
     In[11] := ParametricPlot3D[
     	   {(2*(Cos[u] + u*Sin[u])*Sin[v])/(1 + u^2*Sin[v]^2),
     	   (2*(Sin[u] - u*Cos[u])*Sin[v])/(1 + u^2*Sin[v]^2),
     	   Log[Tan[v/2]] + (2*Cos[v])/(1 + u^2*Sin[v]^2)},
     	  {u,-4,4},{v,.01,Pi-.01}]
     
     Out[11] := -Graphics3D-

This last plot is Kuen's surface, a surface of constant negative curvature. Parametrization from Alfred Gray's Modern Differential Geometry of Curves and Surfaces textbook. geomview-1.9.4/doc/geomview.html/Command-Line-Options.html0000644000175000001440000002016510663301507020405 00000000000000 Command Line Options - Geomview Manual

3.2 Command Line Options

Here are the command line options that Geomview allows:

`-b r g b'
Set the window background color to the given r g b values.
`-c file'
Interpret the GCL commands in file, which may be the special symbol - for standard input. For a description of GCL, See GCL.
`-c command'
Commands may also be supplied literally, as in
          -c "(ui-panel main off)"
     

Since command includes parentheses, which have special meaning to the shell, command must be quoted. Multiple -c options are allowed.

`-wins nwins'
Causes Geomview to initially display nwins camera windows.
`-wpos width,height[@xmin,ymin]'
Specifies the initial location and size of the first camera window. The values for width, height, xmin, and ymin are in screen (pixel) coordinates.
`-M[cg][ps[un|in|in6]] PIPENAME|TCPPORT'
The `-M' option accepts modifiers: a `g' suffix expects geometry data (the default), while a `c' suffix expects GCL commands. A `p' implies the connection should use a named pipe (the default on everything except on the NeXT), while `s' implies using a UNIX-domain socket (the default on the NeXT). Since version 1.9 of Geomview Internet domain sockets are also supported; use `sin' to make Geomview listen on the IPv4 port given by TCPPORT, or use `sin6' to make Geomview listen on an IPv6 port (also as specified by TCPPORT). `sun' is a synonym for `s', i.e. use the Unix domain socket with the name PIPENAME. If PIPENAME starts with a slash ('/'), then it is assumed to be an absolute pathname, otherwise the named pipe or socket is created below ${TMPDIR}/geomview/.

Listening to command streams on TCP ports can be a security risk, as Geomview itself does not take any security precautions, it simply executes all commands fed to it through the network socket. This also implies that disk-io can be initiated remotely.

Examples:

-M objectname
Display (possibly dynamically changing) geometry sent from the programs geomstuff or togeomview. This actually listens to the named pipe /tmp/geomview/objectname; you can achieve the same effect with the shell commands:
               mkdir /tmp/geomview
               mknod /tmp/geomview/objectname p
          

(assuming the directory and named pipe don't already exist), then executing the GCL command:

               (geometry objectname  < /tmp/geomview/objectname)
          

(see (geometry ...))

-Mc pipename
Like `-M' above, but expects GCL commands, rather than OOGL geometry data, on the connection.
-Mcs fred
Read commands from the UNIX-domain socket named. /tmp/geomview/fred
-Mcsin 40000
Read commands from the IPv4 port `40000'. Geomview itself does not take any security precautions, so this can be a security risk.

`-noopengl'
Disable the use of OpenGL for (possibly) hardware accelerated rendering, even if the Geomview binary has support for OpenGL compiled in. This also disables the support for transparency and textures in the camera windows. RenderMan snapshots still will have correct transparency and some limited texture support.
`-nopanels'
Start up displaying no panels, only graphics windows. Panels may be invoked later as usual with the Px keyboard shortcuts or with the ui-panel command. See (ui-panel ...).
`-noinit'
Read no initialization files. By default, geomview reads the system-wide .geomview file, followed by those in ${HOME}/.geomview and ./.geomview.
`-e module'
Start an external module; module is the name associated with the module, appearing in the main panel's Applications browser, as defined by the emodule-define command. See (emodule-define ...).
`-start module args ...'
Like -e but allows you to pass arguments to the external module. "–" signals the end of the argument list; the "–" may be omitted if it would be the last argument on the Geomview command line.
`-run shell-command args ...'
Like -start but takes the pathname of executable of the external module instead of the module's name. The pathnames of all known module directories are appended to the UNIX search path when invoking shell-command.
geomview-1.9.4/doc/geomview.html/new_002dcenter.html0000644000175000001440000000373610663301507017235 00000000000000 new-center - Geomview Manual

Next: , Previous: new-camera, Up: GCL Reference


7.2.82 new-center

(new-center [id])
Stop id, then set id's transform to the identity. Default id is target. Also, if the id is a camera, calls (look-recenter World id). The main function of the call to (look-recenter) is to place the camera so that it is pointing parallel to the z axis toward the center of the world.
geomview-1.9.4/doc/geomview.html/figinitial.html0000644000175000001440000000010610663301507016621 00000000000000 geomview-1.9.4/doc/geomview.html/camera_002ddraw.html0000644000175000001440000000336610663301507017350 00000000000000 camera-draw - Geomview Manual

Next: , Previous: camera, Up: GCL Reference


7.2.16 camera-draw

(camera-draw CAM-ID [yes|no])
Say whether or not cameras should be drawn in CAM-ID; yes if omitted.
geomview-1.9.4/doc/geomview.html/pick.html0000644000175000001440000000614110663301507015435 00000000000000 pick - Geomview Manual

Next: , Previous: or, Up: GCL Reference


7.2.89 pick

(pick COORDSYS GEOMID G V E F P VI EI FI)
The pick command is executed internally in response to pick events (right mouse double click).
COORDSYS
= coordinate system in which coordinates of the following arguments are specified. This can be:
world
world coord sys
self
coord sys of the picked geom (GEOMID)
primitive
coord sys of the actual primitive within the picked geom where the pick occurred.

GEOMID
= id of picked geom
G
= picked point (actual intersection of pick ray with object)
V
= picked vertex, if any
E
= picked edge, if any
F
= picked face
P
= path to picked primitive [0 or more]
VI
= index of picked vertex in primitive
EI
= list of indices of endpoints of picked edge, if any
FI
= index of picked face

External modules can find out about pick events by registering interest in calls to pick via the interest command.

In the ND-viewing context the co-ordinates are actually ND-points. They correspond to the 3D points of the pick relative to the sub-space defined by the viewport of the camera where the pick occurred. The co-ordinates are then padded with zeroes and transformed back to the co-ordinate system defined by COORDSYS.

geomview-1.9.4/doc/geomview.html/Non_002dEuclidean-Geometry.html0000644000175000001440000001007310663301507021370 00000000000000 Non-Euclidean Geometry - Geomview Manual

Next: , Previous: GCL, Up: Top


8 Non-Euclidean Geometry

Geomview supports hyperbolic and spherical geometry as well as Euclidean geometry. The three buttons at the bottom of the Main panel are for setting the current geometry type.

In each of the three geometries, three models are supported: Virtual, Projective, and Conformal. You can change the current model with the Model browser on the Camera panel. Each Geomview camera has its own model setting.

The default model is all three spaces is Virtual. This corresponds to the camera being in the same space as, and moving under the same set of transformations as, the geometry itself.

In Euclidean space Virtual is the most useful model. The other models were implemented for hyperbolic and spherical spaces and just happen to work in Eucldiean space as well: Projective is the same as Virtual but by default displays the unit sphere, and Conformal displays everything inverted in the unit sphere.

In hyperbolic space, the Projective model setting gives a view of the projective ball model of hyperbolic 3-space imbedded in Euclidean space. The camera is initially outside the unit ball. In this model, the camera moves by Euclidean motions and geometry moves by hyperbolic motions. Conformal model is similar but shows the conformal ball model instead.

In spherical space, the Projective model gives a view of half of the 3-sphere imbedded in Euclidean 3-space. Spherical motions give rise to projective transformations in the Projective model, and to Moebius transformations in the Conformal model. In both of these models the camera moves by Euclidean motions.

In Projective and Conformal models, the unit sphere is drawn by default. You can turn it off and on at will using the Draw Sphere button in the Camera panel. In the Conformal model, polygons and edges are subdivided as necessary to make them look curved. The parameters which determine this subdivision can be set with the set-conformal-refine GCL command. See (set-conformal-refine ...).

There are several sample hyperbolic space objects in the data/geom/hyperbolic subdirectory of the Geomview directory. Likewise, the subdirectory data/geom/spherical contains several sample spherical space objects. geomview-1.9.4/doc/geomview.html/ui_002demotion_002drun.html0000644000175000001440000000364210663301507020521 00000000000000 ui-emotion-run - Geomview Manual

Next: , Previous: ui-emotion-program, Up: GCL Reference


7.2.132 ui-emotion-run

(ui-emotion-run EMODULE)
This is an obsolete command. Use its new eqivalent emodule_start instead.
geomview-1.9.4/doc/geomview.html/dice.html0000644000175000001440000000342210663301507015412 00000000000000 dice - Geomview Manual

Next: , Previous: delete, Up: GCL Reference


7.2.27 dice

(dice GEOM-ID N)
Dice any Bezier patches within GEOM-ID into NxN meshes; default 10. See also the appearance attribute patchdice, which makes this command obsolete.
geomview-1.9.4/doc/geomview.html/ui_002dpanel.html0000644000175000001440000000517410663301507016676 00000000000000 ui-panel - Geomview Manual

Next: , Previous: ui-motion, Up: GCL Reference


7.2.136 ui-panel

(ui-panel PANELNAME {on|off} [WINDOW])
Do or don't display the given user-interface panel. Case is ignored in panel names. Current PANELNAMEs are:
geomview
main panel
tools
motion controls
appearance
appearance controls
cameras
camera controls
lighting
lighting controls
obscure
obscure controls (doesn't seem to exist any more)
materials
material properties controls
command
command entry box
credits
geomview credits
By default, the geomview and tools panels appear when geomview starts. If the optional Window is supplied, a position clause (e.g. (ui-panel obscure on { position xmin xmax ymin ymax }) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. (ui-panel obscure on {)} causes interactive positioning.
geomview-1.9.4/doc/geomview.html/write_002dsexpr.html0000644000175000001440000000341510663301507017451 00000000000000 write-sexpr - Geomview Manual

Next: , Previous: write-handle, Up: GCL Reference


7.2.147 write-sexpr

(write-sexpr FILENAME LISPOBJECT)
Writes the given LISPOBJECT to FILENAME. This function is intended for internal debugging use only.
geomview-1.9.4/doc/geomview.html/position_002dat.html0000644000175000001440000000355610663301507017434 00000000000000 position-at - Geomview Manual

Next: , Previous: position, Up: GCL Reference


7.2.93 position-at

(position-at objectID otherID [center | origin])
Translate objectID to the center of the bounding box or the origin of the coordinate system of otherID (parallel translation). Default is center.
geomview-1.9.4/doc/geomview.html/xform_002dset.html0000644000175000001440000000334410663301507017105 00000000000000 xform-set - Geomview Manual

Next: , Previous: xform-incr, Up: GCL Reference


7.2.150 xform-set

(xform-set ID TRANSFORM)
Overwrite the current object transform with TRANSFORM (set object ID's transform to TRANSFORM).
geomview-1.9.4/doc/geomview.html/Function-Index.html0000644000175000001440000012272610663301507017351 00000000000000 Function Index - Geomview Manual

Next: , Previous: Contributing, Up: Top


Function Index

Table of Contents

geomview-1.9.4/doc/geomview.html/emodule_002dstart.html0000644000175000001440000000356510663301507017753 00000000000000 emodule-start - Geomview Manual

Next: , Previous: emodule-sort, Up: GCL Reference


7.2.40 emodule-start

(emodule-start NAME)
Starts the external module NAME, defined by emodule-define. Equivalent to clicking on the corresponding module-browser entry.
geomview-1.9.4/doc/geomview.html/zoom.html0000644000175000001440000000315310663301507015473 00000000000000 zoom - Geomview Manual

Previous: xform-set, Up: GCL Reference


7.2.151 zoom

(zoom CAM-ID FACTOR)
Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number.
geomview-1.9.4/doc/geomview.html/update_002ddraw.html0000644000175000001440000000347510663301507017403 00000000000000 update-draw - Geomview Manual

Next: , Previous: update, Up: GCL Reference


7.2.141 update-draw

(update-draw CAM-ID [timestep_in_seconds])
Apply each incremental motion once and then draw CAM-ID. Applies timestep seconds' worth of motion, or uses elapsed real time if timestep is absent or zero.
geomview-1.9.4/doc/geomview.html/set_002demodule_002dpath.html0000644000175000001440000000456410663301507021013 00000000000000 set-emodule-path - Geomview Manual

7.2.112 set-emodule-path

(set-emodule-path (PATH1 ... PATHN))
Sets the search path for external modules. The PATHi should be pathnames of directories containing, for each module, the module's executable file and a .geomview-<modulename> file which contains an (emodule-define ...) command for that module. This command implicitly calls (rehash-emodule-path) to rebuild the application brower from the new path setting. The special directory name + is replaced by the existing path, so e.g. (set-emodule-path (mydir +)) prepends mydir to the path.
geomview-1.9.4/doc/geomview.html/new_002dcamera.html0000644000175000001440000000357110663301507017202 00000000000000 new-camera - Geomview Manual

Next: , Previous: new-alien, Up: GCL Reference


7.2.81 new-camera

(new-camera name [CAMERA])
Create a new camera with the given name (a string). If a camera with that name already exists, the new object is given a unique name. If CAMERA is omitted a default camera is used.
geomview-1.9.4/doc/geomview.html/backcolor.html0000644000175000001440000000340610663301507016447 00000000000000 backcolor - Geomview Manual

Next: , Previous: ap-override, Up: GCL Reference


7.2.11 backcolor

(backcolor CAM-ID R G B)
Set the background color of CAM-ID; R G B are numbers between 0 and 1.
geomview-1.9.4/doc/geomview.html/interest.html0000644000175000001440000000602110663301507016341 00000000000000 interest - Geomview Manual

Next: , Previous: input-translator, Up: GCL Reference


7.2.60 interest

(interest (COMMAND [args]))
Allows you to express interest in a command. When geomview executes that command in the future it will echo it to the communication pool from which the interest command came. COMMAND can be any command. Args specify restrictions on the values of the arguments; if args are present in the interest command, geomview will only echo calls to the command in which the arguments match those given in the interest command. Two special argument values may appear in the argument list. * matches any value. nil matches any value but supresses the reporting of that value; its value is reported as nil.

The purpose of the interest command is to allow external modules to find out about things happening inside geomview. For example, a module interested in knowing when a geom called foo is deleted could say (interest (delete foo)) and would receive the string (delete foo) when foo is deleted.

Picking is a special case of this. For most modules interested in pick events the command (interest (pick world)) is sufficient. This causes geomview to send a string of the form (pick world ...) every time a pick event (right mouse double click). See the (pick ...) command for details.

geomview-1.9.4/doc/geomview.html/sleep_002dfor.html0000644000175000001440000000353710663301507017061 00000000000000 sleep-for - Geomview Manual

Next: , Previous: shell, Up: GCL Reference


7.2.118 sleep-for

(sleep-for TIME)
Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; sleep-for inside progn won't delay execution of the rest of the progn's contents.
geomview-1.9.4/doc/geomview.html/event_002dmode.html0000644000175000001440000000404310663301507017221 00000000000000 event-mode - Geomview Manual

Next: , Previous: event-keys, Up: GCL Reference


7.2.44 event-mode

(event-mode MODESTRING)w
Set the mouse event (motion) mode; MODESTRING should be one of the following strings:
  1. "[r] Rotate"
  2. "[t] Translate"
  3. "[z] Cam Zoom"
  4. "[s] Geom Scale"
  5. "[f] Cam Fly"
  6. "[o] Cam Orbit"
  7. "[le] Edit Lights"
geomview-1.9.4/doc/geomview.html/emodule_002dsort.html0000644000175000001440000000342010663301507017573 00000000000000 emodule-sort - Geomview Manual

Next: , Previous: emodule-run, Up: GCL Reference


7.2.39 emodule-sort

(emodule-sort)
Sorts the modules in the application browser alphabetically.
geomview-1.9.4/doc/geomview.html/Package-Installation.html0000644000175000001440000001560510663301507020506 00000000000000 Package Installation - Geomview Manual

Previous: Package Details, Up: Mathematica


9.6 Installing the Mathematica Packages

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

The installed Mathematica data-files can be found in PREFIX/share/geomview/Mathematica/.

If Geomview is properly installed on your system according to the instructions in See Installation, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed.

In this section, the phrase Geomview installation refers any of the procedures in See Installation. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution.

  1. The relevant mathematica files are OOGL.m, Geomview.m, and BezierPlot.m; Mathematica must be able to find these files. They are distributed in the PREFIX/share/geomview/Mathematica subdirectory of the binary distributions, and in the TOPSRCDIR/src/bin/geomutil/math2oogl subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the $Path variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path.

    The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (MMAPACKAGEDIR). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the $Path variable each time you run Mathematica.

  2. The package OOGL.m needs to be able to invoke the programs geomview, math2oogl, and oogl2rib. The Geomview installation procedure installs these programs into a directory that you specify for executables (BINDIR). Ideally, this directory should be on your shell's $PATH. More specifically, it should be on the $PATH of the shell in which Mathematica runs; the directory /usr/local/bin is usually a good choice. You can see the list of directories on this path by giving the command !echo $path in Mathematica.

    If for some reason you can't arrange for geomview, math2oogl, and oogl2rib to be in a directory on the shell's $path, you can modify OOGL.m to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables $GeomviewPath and $GeomRoot, which are defined near the top of the file. Change $GeomviewPath to the absolute pathname of the geomview shell script on your system. Change $GeomRoot to the absolute pathname of the $GEOMROOT directory on your system. If you do this, you should also make sure there are copies of geomview, math2oogl, and oogl2rib in the $GEOMROOT/bin/<CPU>.

  3. The geomview shell script, which OOGL.m uses to invoke Geomview, needs to be able to find the geomview executable file ( called gvx). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the geomview script are correct.
geomview-1.9.4/doc/geomview.html/Platforms.html0000644000175000001440000000605110663301507016456 00000000000000 Platforms - Geomview Manual

Next: , Previous: History, Up: Top


Supported Platforms

Geomview 1.9 should – in principle – compile and run on any fairly recent Unix-like operating system. Specifically, it runs on Linux and on Cygwin (Cygwin emulates a SystemV Unix-like environment under Microsoft Windows). Unluckily Geomview compiles with MacOS X (Darwin), but seemingly communicating with Geomview by means of pipes and sockets cause segmentation faults. Feel free to fix that! See Contributing, for details. geomview-1.9.4/doc/geomview.html/setenv.html0000644000175000001440000000347710663301507016024 00000000000000 setenv - Geomview Manual

Next: , Previous: set-motionscale, Up: GCL Reference


7.2.115 setenv

(setenv name string)
sets the environment variable name to the value string; the name is visible to geomview (as in pathnames containing $name) and to processes it creates, e.g. external modules.
geomview-1.9.4/doc/geomview.html/window.html0000644000175000001440000000733610663301507016025 00000000000000 window - Geomview Manual

Previous: camera, Up: Non-geometric objects


4.3.6 window

A window object specifies size, position, and other window-system related information about a window in a device-independent way.

The syntax for a window object is:

     window ::=
     
     	[ "window" ]			(optional keyword)
     	  [ "{" ]			(curly brace, often required)
     
     	    			(any of the following, in any order)
     
     		"size"  <xsize> <ysize>
     				(size of the window)
     
     		"position"  <xmin> <xmax> <ymin> <ymax>
     				(position & size)
     
     
     		"noborder"
     				(specifies the window should
     				 have no window border)
     
     		"pixelaspect"  <aspect>
     			    (specifies the true visual aspect ratio
     			     of a pixel in this window in the sense
     			     xsize/ysize, normally 1.0.
     			     For stereo hardware which stretches the
     			     display vertically by a factor of 2,
     			     ``pixelaspect 0.5'' might do.
     			     The value is used when computing the
     			     projection of a camera associated with
     			     this window.)
     
     	  [ "}" ]			(matching closebrace)

Window objects are used in the Geomview window and ui-panel commands to set default properties for future windows or to change those of an existing window. See (window ...). See (ui-panel ...).

Next: , Previous: update-draw, Up: GCL Reference


7.2.142 window

(window CAM-ID WINDOW)
Specify attributes for the window of CAM-ID, e.g. its size or initial position, in the OOGL Window syntax. The special CAM-ID default specifies properties of future windows (created by camera or new-camera).
geomview-1.9.4/doc/geomview.html/OOGL_002em.html0000644000175000001440000000761010663301507016154 00000000000000 OOGL.m - Geomview Manual

Next: , Previous: Mathematica, Up: Mathematica


9.1 Using Mathematica to generate OOGL files

The package OOGL.m allows Mathematica to write graphics objects in OOGL format. To use it, give the command << OOGL.m to Mathematica to load the package. The WriteOOGL[file,graphics] command writes an OOGL description of the 3D graphics object graphics to the file named file.

This package also provides the Geomview command which sends a 3D graphics object to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the Geomview command.

Geomview[graphics]
Sends the 3D graphics object graphics to Geomview as a geom named Mathematica. Subsequent usage of Geomview[graphics] replaces the Mathematica object in Geomview with the new graphics.
Geomview[name,graphics]
Sends the 3D graphics object graphics to Geomview as a geom named name. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objects at once and allow independent control over them.
     % math
     Mathematica 2.0 for SGI Iris
     Copyright 1988-91 Wolfram Research, Inc.
      -- GL graphics initialized --
     
     In[1] := <<OOGL.m
     
     In[2] := Plot3D[Sin[x + Sin[y]], {x,-2,2},{y,-2,2}]
     
     Out[2] := -Graphics3D-

This displays graphics in the usual Mathematica way here.

     In[3] := WriteOOGL["math.oogl", %2]
     
     Out[3] := -Graphics3D-

This displays nothing new but writes the file math.oogl. You can now load that file into Geomview on any computer. Alternately, you can use the Geomview command to start up a copy of Geomview from within Mathematica.

     In[5] := Geomview[%2]
     
     Out[5] := -Graphics3D-
geomview-1.9.4/doc/geomview.html/Saving.html0000644000175000001440000001650710663301507015745 00000000000000 Saving - Geomview Manual

Next: , Previous: Cameras, Up: Interaction


3.8 Saving your work

Geomview's Save panel lets you store Geomview objects and other information in files that you can read back into Geomview or other programs.

figs/save.png

Figure 3.9: The Save Panel.

To use the Save panel you select the desired format in the browser next to the word Save, enter the name of the object you want to save in the text field next to the word for, and enter the name of the file you wish to save to in the long text field next to the word in. You can then either hit <Enter> or click on the OK button. When the file has been written, the Save panel disappears. If you want to dismiss the Save panel without writing a file, click the Cancel button.

If you specify - as the file name, Geomview will write the file to standard output, i.e. in the shell window from which you invoked Geomview.

The possible formats are given below. The kind of object that can be written with each format is given in parentheses.

Commands (any object)
This write a file of GCL commands containing all information about the object. Loading this file later will restore the object as well as all other information about it, such as appearance, transformations, etc.
Geometry alone (geom)
This writes an OOGL file containing just the geometry of the object.
Geometry [in world] (geom)
This writes an OOGL file containing just the geometry of the object, transformed under Geomview's current transformation for this object. Use this if you have moved the object from its initial position and want to save the new position relative to the world.
Geometry [in universe] (geom)
This writes an OOGL file containing just the geometry of the geom, transformed under both the object's transformation and the world's transformation.
RMan [->tiff] (camera)
Writes a RenderMan file which when rendered creates a tiff image. Transparency and texturing (the latter only to some extent) will be available.
RMan [->frame] (camera)
Writes a RenderMan file which when rendered causes an image to appear in a window on the screen. Transparency and texturing (the latter only to some extent) will be available.
SGI snapshot (camera)
Write an SGI raster file. A bell rings when the snapshot is complete. Only available on SGI systems.
PPM GLX-offscreen snapshot (camera)
Render the complete scene anew into off-screen memory; GLX provides the means to use a Pixmap as rendering area. The advantage of rendering into off-screen memory over taking screen snapshot is that the camera windows need not be mapped and even raised at the time the snapshot is taken. So with off-screen snapshot one can safely iconify the camera window (but do not close it!), activate the screen-saver and go to bed while some script advances the scenes and takes snapshots.
PPM Screen snapshot (camera)
Take a snapshot of the given window and save it as a PPM image. If you specify a string beginning with a vertical bar (|) as the file name, it's interpreted as a Bourne shell command to which the PPM data should be piped, as in `| pnmtotiff > snap.tiff' or `| convert -geometry 50% ppm:- snap.gif'.

PPM screen snapshots are only available with GL and Open GL, not plain X graphics. The window should be entirely on the screen. Geomview will ensure that no other windows cover it while the snapshot is taken. It is probably a better idea to use GLX-off-screen snapshots, as explained above.

PPM software snapshot (camera)
Writes a snapshot of that window's current view, as a PPM image, to the given file. The file name may be a Bourne shell command preceded by a vertical bar (|), as with the PPM screen snapshot. The software snapshot, though, is produced by using a built-in software renderer (related to the X-windows renderer). It doesn't matter whether the window is visible or not, and doesn't depend on GL or OpenGL. It also doesn't support some features, such as texture mapping.
Postscript snapshot (camera)
Writes a Postscript snapshot of the camera's view. It's made by breaking up the scene into lines and polygons, sorting by depth, and generating Postscript lines and polygons for each one. Advantages over pixel-based snapshot images: resolution is very high, so edges look sharp even on high-resolution printers, or comparable-resolution images are typically much more compact. Disadvantages: depth-sorting gives good results on some scenes, but can be wildly wrong as a hidden-surface removal algorithm for other scenes. Also, Postscript doesn't offer smoothly interpolated shading, only flat shading for each facet.
Camera (camera)
Writes an OOGL file of a camera.
Transform [to world] (any object)
Writes an OOGL transform file giving Geomview's transform for the object.
Transform [to universe] (any object)
Writes an OOGL transform file giving a transform which is the composition of Geomview's transform for the object and the transform for the world.
Window (camera)
Writes an OOGL window file for a camera.
Panels
Writes a GCL file containing commands which record the state of all the Geomview panels. Loading this file later will restore the positions of all the panels.
geomview-1.9.4/doc/geomview.html/ap_002doverride.html0000644000175000001440000000336610663301507017402 00000000000000 ap-override - Geomview Manual

Next: , Previous: and, Up: GCL Reference


7.2.10 ap-override

(ap-override [on|off])
Selects whether appearance controls should override objects' own settings. On by default. With no arguments, returns current setting.
geomview-1.9.4/doc/geomview.html/NeXT.html0000644000175000001440000000333210663301507015324 00000000000000 NeXT - Geomview Manual

Next: , Previous: new-reset, Up: GCL Reference


7.2.85 NeXT

(NeXT)
Returns t if running on a NeXT, nil if not. A relict from ancient work-station year.
geomview-1.9.4/doc/geomview.html/cursor_002dtwitch.html0000644000175000001440000000351010663301507017771 00000000000000 cursor-twitch - Geomview Manual

Next: , Previous: cursor-still, Up: GCL Reference


7.2.25 cursor-twitch

(cursor-twitch [INT])
Sets the distance which the cursor must not move (in x or y) to register as holding still. If INT is not specified, the value will be reset to the default.
geomview-1.9.4/doc/geomview.html/gt.html0000644000175000001440000000317310663301507015123 00000000000000 gt - Geomview Manual

Next: , Previous: eq, Up: GCL Reference


7.2.4 >

(> EXPR1 EXPR2)
Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.
geomview-1.9.4/doc/geomview.html/Basic-Interaction.html0000644000175000001440000001761110663301507020011 00000000000000 Basic Interaction - Geomview Manual

Next: , Previous: Command Line Options, Up: Interaction


3.3 Basic Interaction: The Main Panel

Normally when you invoke Geomview, three windows appear: the Main panel, the Tools panel, and one camera window. Geomview has many other windows but most things can be done with these three and so by default the others do not appear. This section of the manual introduces some basic concepts that are used throughout the rest of the manual and describes the Main panel.

figs/main.png

Figure 3.1: The Main Panel

Geomview can display an arbitrary number of objects simultaneously. The Targets browser in the Main panel displays a list of all the objects that Geomview currently knows about. This browser has a line for each object that you have loaded, plus some lines for other objects. One of the other objects is called World and corresponds to the all the currently loaded objects, treated as if they were one object. Most of the operations that you can do to one object, such as applying a motion or changing a color, can also be done to the "World" object.

The Targets browser also has an entry for each camera. By default there is only one camera; it is possible to add more of them via the New Camera entry of the Main panel's File menu. Geomview treats cameras in much the same way as it does geometric objects. For example, you can move cameras around and add them and delete them just as with geometric objects. Cameras do not usually show up in the display as an object that you see. Each camera has a separate camera window which displays the view as seen by that camera. (It is possible for each camera to display a geometric representation of other cameras. See Cameras.)

Because Geomview treats cameras and geometric objects very similarly, the term object in this documentation is used to refer to either one. When we need to distinguish between the two kinds of objects, we use the term geom to denote a geometric object and the word camera to denote a camera.

The object which is selected (highlighted) in the Targets browser is called the target object. This is the object that receives any actions that you do with the mouse or keyboard. You can change the target object by selecting a different line in the Targets browser. Another way to change the target object is to put the mouse cursor directly over a geometry in a camera window and rapidly double-click the right mouse button. This process is called picking; the picked object becomes the new target.

Geomview objects are all known by two names, both of which are shown in the Targets browser. The first name given there, which appears in square brackets ([ ]), is a short name assigned by Geomview when you load the object. It consists of the letter `g' for geometries and `c' for cameras, followed by a number. The second name is a longer more descriptive name; by default this is the name of the file that the object was loaded from. The two names are equivalent as far as Geomview is concerned; at any point where you need to specify a name you can give either one.

To manipulate an object, make sure you that the object you want to move is the target object, and put the mouse cursor in a camera window. Motions are applied by holding down either the left or middle mouse button and moving the mouse. There are several different motion "modes", each for applying a different kind of motion. The MOTION MODE browser in the Main panel indicates the current motion mode. The default is "Rotate". You can change the current motion mode by selecting a new one in the MOTION MODE browser, or by using the Tools panel. For more information about motion modes, See Mouse Motions.

The Modules browser lists Geomview external modules. An external module is a separate program that interacts with Geomview to extend its functionality. For information on external modules, See Modules.

The menu bar at the top of the main panel offers menus for common operations.

To create new windows, load new objects, save objects or other information, or quit from geomview, see the File menu.

To copy or delete objects, see the Edit menu.

You can invoke any panel from the Inspect menu.

The Space menu lets you choose whether geomview operates in Euclidean, Hyperbolic, or Spherical mode. Euclidean mode is selected by default. For details about using Hyperbolic and Spherical spaces, See Non-Euclidean Geometry.

Most actions that you can do through Geomview's panels have equivalent keyboard shortcuts so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts are usually indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the keyboard shortcut for Rotate mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the MOTION MODE browser. To use this keyboard shortcut, just hit the r key while the mouse cursor is in any Geomview window. Do not hit the <Enter> key afterwards.

Some keyboard shortcuts consist of more than one key. In these cases just type the keys one after the other, with no <Enter> afterwards. Keyboard shortcuts are case sensitive.

Many keyboard shortcuts can be preceded by a numeric parameter. For example, typing ae toggles the state of drawing edges, while 1ae always enables edge drawing.

The keyboard field in the upper left corner of the Main panel echos the current state of keyboard shortcuts.

For a list of all keyboard shortcuts, press the ? key. geomview-1.9.4/doc/geomview.html/Example1.html0000644000175000001440000002331610663301507016166 00000000000000 Example1 - Geomview Manual

Next: , Previous: Interface, Up: Modules


6.2 Example 1: Simple External Module

This section gives a very simple external module which displays an oscillating mesh. To try out this example, make a copy of the file example1.c (it is distributed with Geomview in the doc subdirectory) in your directory and compile it with the command

     cc -o example1 example1.c -lm

Then put the line

     (emodule-define "Example 1" "./example1")

in a file called .geomview in your current directory. Then invoke Geomview; it is important that you compile the example program, create the .geomview file, and invoke Geomview all in the same directory. You should see "Example 1" in the Modules browser of Geomview's Main panel; click on this entry in the browser to start the module. A surface should appear in your camera window and should begin oscillating. You can stop the module by clicking on the red "[1] Example 1" line in the Modules browser.

     
     /*
      * example1.c: oscillating mesh
      *
      * This example module is distributed with the Geomview manual.
      * If you are not reading this in the manual, see the "External
      * Modules" chapter of the manual for more details.
      *
      * This module creates an oscillating mesh.
      */
     
     #include <math.h>
     #include <stdio.h>
     
     /* F is the function that we plot
      */
     float F(x,y,t)
          float x,y,t;
     {
       float r = sqrt(x*x+y*y);
       return(sin(r + t)*sqrt(r));
     }
     
     main(argc, argv)
          char **argv;
     {
       int xdim, ydim;
       float xmin, xmax, ymin, ymax, dx, dy, t, dt;
     
       xmin = ymin = -5;             /* Set x and y            */
       xmax = ymax = 5;              /*    plot ranges         */
       xdim = ydim = 24;             /* Set x and y resolution */
       dt = 0.1;                     /* Time increment is 0.1  */
     
       /* Geomview setup.  We begin by sending the command
        *            (geometry example { : foo})
        * to Geomview.  This tells Geomview to create a geom called
        * "example" which is an instance of the handle "foo".
        */
       printf("(geometry example { : foo })\n");
       fflush(stdout);
     
       /* Loop until killed.
        */
       for (t=0; ; t+=dt) {
         UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t);
       }
     }
     
     /* UpdateMesh sends one mesh iteration to Geomview.  This consists of
      * a command of the form
      *    (read geometry { define foo
      *       MESH
      *       ...
      *    })
      * where ... is the actual data of the mesh.  This command tells
      * Geomview to make the value of the handle "foo" be the specified
      * mesh.
      */
     UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t)
          float xmin, xmax, ymin, ymax, t;
          int xdim, ydim;
     {
       int i,j;
       float x,y, dx,dy;
     
       dx = (xmax-xmin)/(xdim-1);
       dy = (ymax-ymin)/(ydim-1);
     
       printf("(read geometry { define foo \n");
       printf("MESH\n");
       printf("%1d %1d\n", xdim, ydim);
       for (j=0, y = ymin; j<ydim; ++j, y += dy) {
         for (i=0, x = xmin; i<xdim; ++i, x += dx) {
           printf("%f %f %f\t", x, y, F(x,y,t));
         }
         printf("\n");
       }
       printf("})\n");
       fflush(stdout);
     }
     

The module begins by defining a function F(x,y,t) that specifies a time-varying surface. The purpose of the module is to animate this surface over time.

The main program begins by defining some variables that specify the parameters with which the function is to be plotted.

The next bit of code in the main program prints the following line to standard output

     (geometry example { : foo })

This tells Geomview to create a geom called example which is an instance of the handle foo. Handles are a part of the OOGL file format which allow you to name a piece of geometry whose value can be specified elsewhere (and in this case updated many times); for more information on handles, See OOGL File Formats. In this case, example is the title by which the user will see the object in Geomview's object browser, and foo is the internal name of the handle that the object is a reference to.

We then do fflush(stdout) to ensure that Geomview receives this command immediately. In general, since pipes may be buffered, an external module should do this whenever it wants to be sure Geomview has actually received everything it has printed out.

The last thing in the main program is an infinite loop that cycles through calls to the procedure UpdateMesh with increasing values of t. UpdateMesh sends Geomview a command of the form

     (read geometry { define foo
     MESH
     24 24
     ...
     })

where ... is a long list of numbers. This command tells Geomview to make the value of the handle foo be the specified mesh. As soon as Geomview receives this command, the geom being displayed changes to reflect the new geometry.

The mesh is given in the format of an OOGL MESH. This begins with the keyword MESH. Next come two numbers that give the x and y dimensions of the mesh; in this case they are both 24. This line is followed by 24 lines, each containing 24 triples of numbers. Each of these triples is a point on the surface. Then finally there is a line with "})" on it that ends the "{" which began the define statement and the "(" that began the command. For more details on the format of MESH data, see MESH.

This module could be written without the use of handles by having it write out commands of the form

     (geometry example {
     MESH
     24 24
     ...
     })

This first time Geomview receives a command of this form it would create a geom called example with the given MESH data. Subsequent (geometry example ...) commands would cause Geomview to replace the geometry of the geom example with the new MESH data. If done in this way there would be no need to send the initial (geometry example { : foo }) command as above. The handle technique is useful, however, because it can be used in more general situations where a handle represents only part of a complex geom, allowing an external module to replace only that part without having to retransmit the entire geom. For more information on handles, see GCL. See References. See (hdefine ...). See (read ...).

The module loops through calls to UpdateMesh which print out commands of the above form one after the other as fast as possible. The loop continues indefinitely; the module will terminate when the user kills it by clicking on its instance line in the Modules browser, or else when Geomview exits.

Sometimes when you terminate this module by clicking on its instance entry the Modules browser, Geomview will kill it while it is in the middle of sending a command to Geomview. Geomview will then receive only a piece of a command and will print out a cryptic but harmless error message about this. When a module has a user interface panel it can use a "Quit" button to provide a more graceful way for the user to terminate the module. See the next example.

You can run this module in a shell window without Geomview to see the commands it prints out. You will have to kill it with ctrl-C to get it to stop. geomview-1.9.4/doc/geomview.html/hmodel.html0000644000175000001440000000335210663301507015760 00000000000000 hmodel - Geomview Manual

Next: , Previous: help, Up: GCL Reference


7.2.55 hmodel

(hmodel CAMID {virtual|projective|conformal})
Set the model used to display geometry in this camera. See (space ...).
geomview-1.9.4/doc/geomview.html/write_002dcomments.html0000644000175000001440000000553010663301507020135 00000000000000 write-comments - Geomview Manual

Next: , Previous: write, Up: GCL Reference


7.2.145 write-comments

(write-comments FILENAME GEOMID PICKPATH)
write OOGL COMMENT objects in the GEOMID hierarchy at the level of the pick path to FILENAME. Specifically, COMMENTS at level (a b c ... f g) will match pick paths of the form (a b c ... f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the pick command) is a list of integer counters specifying a subpart of a hierarchical OOGL object. Descent into a complex object (LIST or INST) adds a new integer to the path. Traversal of simple objects increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire string of zero, one, or more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses.

Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objects, which can be attached to other OOGL objects via the LIST type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned.

geomview-1.9.4/doc/geomview.html/ui_002dcam_002dfocus.html0000644000175000001440000000527610663301507020127 00000000000000 ui-cam-focus - Geomview Manual

Next: , Previous: transform-set, Up: GCL Reference


7.2.128 ui-cam-focus

(ui-cam-focus [focus-change|mouse-cross])
Set the focus policy for the camera windows. The default is mouse-cross: a camera is made the active camera (for interactive mouse events) when the mouse cursor crosses the window. Because this means it can become complicated to activate a specific camera (in the context of multiple camera windows) there is also the option to only change the camera focus when the window-manager decides to give it the focus for input events. So, after specifying focus-change it depends on the focus-change configuration of your window-manager when a camera becomes the active camera for mouse-interaction. To change this behaviour permanently you could, e.g., place the following line in your ${HOME}/.geomview file (see Customization):
          (progn
            (ui-cam-focus focus-change)
            ... # other stuff
          )
     
geomview-1.9.4/doc/geomview.html/GCL.html0000644000175000001440000001177610663301507015126 00000000000000 GCL - Geomview Manual

Next: , Previous: Modules, Up: Top


7 GCL: the Geomview Command Language

GCL has the syntax of lisp – i.e. an expression of the form (f a b ...) means pass the values of a, b, ... to the function f. GCL is very limited and is by no means an implementation of lisp. It is simply a language for expressing commands to be executed in the order given, rather than a programming language. It does not support variable or function definition.

GCL is the language that Geomview understands for files that it loads as well as for communication with other programs. To execute a GCL command interactively, you can bring up the Commands panel which lets you type in a command; Geomview executes the command when you hit the <Enter> key. Output from such commands is printed to standard output. Alternately, you can invoke Geomview as geomview -c - which causes it to read GCL commands from standard input.

GCL functions return a value, and you can nest function calls in ways which use this returned value. For example

     (f (g a b))

evaluates (g a b) and then evaluates (f x) where x is the result returned by (g a b). Geomview maintains these return values internally but does not normally print them out. To print out a return value pass it to the echo function. For example the geomview-version function returns a string representing the version of Geomview that is running, and

     (echo (geomview-version))

prints out this string.

Many functions simply return t for success or nil for failure; this is the case if the documentation for the function does not indicate otherwise. These are the lisp symbols for true and false, respectively. (They correspond to the C variables Lt and Lnil which you are likely to see if you look at the source code for Geomview or some of the external modules.)

In the descriptions of the commands below several references are made to "OOGL" formats. OOGL is the data description language that Geomview uses for describing geometry, cameras, appearances, and other basic objects. For details of the OOGL formats, See OOGL File Formats. (Or equivalently, see the oogl(5) manual page, distributed with Geomview in the file man/cat5/oogl.5.

The GCL commands and argument types are listed below. Most of the documentation in this section of the manual is available within Geomview via the ? and ?? commands. The command (? command) causes Geomview to print out a one-line summary of the syntax of command, and (?? command) prints out an explanation of what command does. You can include the wild-card character * in command to print information for a group of commands matching a pattern. For example, (?? *emodule*) will print all information about all commands containing the string emodule. (? *) will print a short list of all commands.

geomview-1.9.4/doc/geomview.html/Authors.html0000644000175000001440000000361010663301507016132 00000000000000 Authors - Geomview Manual

Previous: History, Up: History


Authors

Tamara Munzner, Stuart Levy, and Mark Phillips are the original authors of Geomview. Celeste Fowler, Charlie Gunn, and Nathaniel Thurston also made significant contributions. Daniel Krech and Scott Wisdom did the NeXTStep and RenderMan port, and Daeron Meyer and Tim Rowley did the port to X windows. Many other Geometry Center staff members, as well as several people elsewhere, also contributed.

Mark Phillips wrote this manual, with substantial help from Stuart Levy and Tamara Munzner. Countless Geomview users have also been of great help by reading it and pointing out mistakes. geomview-1.9.4/doc/geomview.html/write_002dhandle.html0000644000175000001440000000356310663301507017547 00000000000000 write-handle - Geomview Manual

Next: , Previous: write-comments, Up: GCL Reference


7.2.146 write-handle

(write-handle PREFIX FILENAME HANDLE)
Writes the object underlying the given handle to FILENAME. This function is intended for internal debugging use only.
geomview-1.9.4/doc/geomview.html/SPHERE.html0000644000175000001440000000764210663301507015504 00000000000000 SPHERE - Geomview Manual

Next: , Previous: SKEL, Up: Object File Formats


4.2.8 SPHERE Files

The conventional suffix for SPHERE files is .sph.

     [ST][E|H|S]SPHERE # Keyword
     # auto-generated texture co-ordinates, only allowed with STSPHERE objects
     [SINUSOIDAL|CYLINDRICAL|RECTANGULAR|STEREOGRAPHIC|ONEFACE]
     # next four fields are required
     Radius
     Xcenter Ycenter Zcenter

The key word is [ST][E|H|S]SPHERE. The optional prefix characters mean:

`ST'
The sphere carries automatically generated texture co-ordinates. See below.
`E'
The sphere lives in Euclidean space.
`H'
The sphere lives in Hyperbolic space. See Non-Euclidean Geometry.
`S'
The sphere lives in spherical space. See Non-Euclidean Geometry.

Sphere objects are drawn using meshes which are rectangular in a polar co-ordinate system, with the equatorial plane parallel to the x,y-plane. Their smoothness, and the time taken to draw them, depends on the setting of the dicing level, 10x10 by default. From Geomview, the Appearance panel, the <N>ad keyboard command, or a dice nu nv Appearance attribute sets this.

Texture co-ordinates are generated for STSPHERE objects; the keyword following the initial STSPHERE keyword defines the way this is done. It follows the conventions of the mktxmesh Perl-script which comes with the Orrery.

SINUSOIDAL
sinusoidal equal-area projection
CYLINDRICAL
cylindrical proj: s is the longitude, t is the latitude
RECTANGULAR
rectangular proj: s is the longitude, t is sin(latitude) (i.e. z co-ordinate in the sphere's co-ordinate system)
STEREOGRAPHIC
stereographic projection from the south (z=-1) pole
ONEFACE
stretch orthographic view of +y hemisphere over both, mirroring
geomview-1.9.4/doc/geomview.html/emodule_002dpath.html0000644000175000001440000000402510663301507017542 00000000000000 emodule-path - Geomview Manual

Next: , Previous: emodule-isrunning, Up: GCL Reference


7.2.37 emodule-path

(emodule-path)
Returns the current search path for external modules. Note: to actually see the value returned by this function you should wrap it in a call to echo: (echo (emodule-path)). See (set-emodule-path ...).
geomview-1.9.4/doc/geomview.html/Example2.html0000644000175000001440000002500410663301507016163 00000000000000 Example2 - Geomview Manual

Next: , Previous: Example1, Up: Modules


6.3 Example 2: Simple External Module with FORMS Control Panel

This section gives a new version of the above module — one that includes a user interface panel for controlling the velocity of the oscillation. We use the FORMS library by Mark Overmars for the control panel. The FORMS library is a public domain user interface toolkit for IRISes; for more information See Forms.

To try out this example, make a copy of the file example2.c (distributed with Geomview in the doc subdirectory) in your directory and compile it with the command

     cc -I/u/gcg/ngrap/include -o example2 example2.c \
       -L/u/gcg/ngrap/lib/sgi -lforms -lfm_s -lgl_s -lm

You should replace the string /u/gcg/ngrap above with the pathname of the Geomview distribution directory on your system. (The forms library is distributed with Geomview and the -I and -L options above tell the compiler where to find it.)

Then put the line

     (emodule-define "Example 2" "./example2")

in a file called .geomview in the current directory and invoke Geomview from that directory. Click on the "Example 2" entry in the Modules browser to invoke the module. A small control panel should appear. You can then control the velocity of the mesh oscillation by moving the slider.

     
     /*
      * example2.c: oscillating mesh with FORMS control panel
      *
      * This example module is distributed with the Geomview manual.
      * If you are not reading this in the manual, see the "External
      * Modules" chapter of the manual for an explanation.
      *
      * This module creates an oscillating mesh and has a FORMS control
      * panel that lets you change the speed of the oscillation with a
      * slider.
      */
     
     #include <math.h>
     #include <stdio.h>
     #include <sys/time.h>           /* for struct timeval below */
     
     #include "forms.h"              /* for FORMS library */
     
     FL_FORM *OurForm;
     FL_OBJECT *VelocitySlider;
     float dt;
     
     /* F is the function that we plot
      */
     float F(x,y,t)
          float x,y,t;
     {
       float r = sqrt(x*x+y*y);
       return(sin(r + t)*sqrt(r));
     }
     
     /* SetVelocity is the slider callback procedure; FORMS calls this
      * when the user moves the slider bar.
      */
     void SetVelocity(FL_OBJECT *obj, long val)
     {
       dt = fl_get_slider_value(VelocitySlider);
     }
     
     /* Quit is the "Quit" button callback procedure; FORMS calls this
      * when the user clicks the "Quit" button.
      */
     void Quit(FL_OBJECT *obj, long val)
     {
       exit(0);
     }
     
     /* create_form_OurForm() creates the FORMS panel by calling a bunch of
      * procedures in the FORMS library.  This code was generated
      * automatically by the FORMS designer program; normally this code
      * would be in a separate file which you would not edit by hand.  For
      * simplicity of this example, however, we include this code here.
      */
     create_form_OurForm()
     {
       FL_OBJECT *obj;
       FL_FORM *form;
       OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0);
       obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,"");
       VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0,
                                               340.0,40.0,"Velocity");
         fl_set_object_lsize(obj,FL_LARGE_FONT);
         fl_set_object_align(obj,FL_ALIGN_TOP);
         fl_set_call_back(obj,SetVelocity,0);
       obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit");
         fl_set_object_lsize(obj,FL_LARGE_FONT);
         fl_set_call_back(obj,Quit,0);
       fl_end_form();
     }
     
     main(argc, argv)
          char **argv;
     {
       int xdim, ydim;
       float xmin, xmax, ymin, ymax, dx, dy, t;
       int fdmask;
       static struct timeval timeout = {0, 200000};
     
       xmin = ymin = -5;             /* Set x and y            */
       xmax = ymax = 5;              /*    plot ranges         */
       xdim = ydim = 24;             /* Set x and y resolution */
       dt = 0.1;                     /* Time increment is 0.1  */
     
       /* Forms panel setup.
        */
       foreground();
       create_form_OurForm();
       fl_set_slider_bounds(VelocitySlider, 0.0, 1.0);
       fl_set_slider_value(VelocitySlider, dt);
       fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2");
     
     
       /* Geomview setup.
        */
       printf("(geometry example { : foo })\n");
       fflush(stdout);
     
       /* Loop until killed.
        */
       for (t=0; ; t+=dt) {
         fdmask = (1 << fileno(stdin)) | (1 << qgetfd());
         select(qgetfd()+1, &fdmask, NULL, NULL, &timeout);
         fl_check_forms();
         UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t);
       }
     }
     
     /* UpdateMesh sends one mesh iteration to Geomview
      */
     UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t)
          float xmin, xmax, ymin, ymax, t;
          int xdim, ydim;
     {
       int i,j;
       float x,y, dx,dy;
     
       dx = (xmax-xmin)/(xdim-1);
       dy = (ymax-ymin)/(ydim-1);
     
       printf("(read geometry { define foo \n");
       printf("MESH\n");
       printf("%1d %1d\n", xdim, ydim);
       for (j=0, y = ymin; j<ydim; ++j, y += dy) {
         for (i=0, x = xmin; i<xdim; ++i, x += dx) {
           printf("%f %f %f\t", x, y, F(x,y,t));
         }
         printf("\n");
       }
       printf("})\n");
       fflush(stdout);
     }
     

The code begins by including some header files needed for the event loop and the FORMS library. It then declares global variables for holding a pointer to the slider FORMS object and the velocity dt. These are global because they are needed in the slider callback procedure SetVelocity, which forms calls every time the user moves the slider bar. SetVelocity sets dt to be the new value of the slider.

Quit is the callback procedure for the Quit button; it provides a graceful way for the user to terminate the program.

The procedure create_panel calls a bunch of FORMS library procedures to set up the control panel with slider and button. For more information on using FORMS to create interface panels see the FORMS documentation. In particular, FORMS comes with a graphical panel designer that lets you design your panels interactively and generates code like that in create_panel.

This example's main program is similar to the previous example, but includes extra code to deal with setting up and managing the FORMS panel.

To set up the panel we call the GL procedure foreground to cause the process to run in the foreground. By default GL programs run in the background, and for various reasons external modules that use FORMS (which is based on GL) need to run in the foreground. We then call create_panel to create the panel and fl_set_slider_value to set the initial value of the slider. The call to fl_show_form causes the panel to appear on the screen.

The first three lines of the main loop, starting with

     fdmask = (1 << fileno(stdin)) | (1 << qgetfd());

check for and deal with events in the panel. The call to select imposes a delay on each pass through the main loop. This call returns either after a delay of 1/5 second or when the next GL event occurs, or when data appears on standard input, whichever comes first. The timeout variable specifies the amount of time to wait on this call; the first member (0 in this example) gives the number of seconds, and the second member (200000 in this example) gives the number of microseconds. Finally, fl_check_forms() checks for and processes any FORMS events that have happened; in this case this means calling SetVelocity if the user has moved the slider or calling Quit if the user has clicked on the Quit button.

The purpose of the delay in the loop is to keep the program from using excessive amounts of CPU time running around its main loop when there are no events to be processed. This is not so crucial in this example, and in fact may actually slow down the animation somewhat, but in general with external modules that have event loops it is important to do something like this because otherwise the module will needlessly take CPU cycles away from other running programs (such as Geomview!) even when it isn't doing anything.

The last line of the main loop in this example, the call to UpdateMesh, is the same as in the previous example. geomview-1.9.4/doc/geomview.html/set_002dconformal_002drefine.html0000644000175000001440000000442210663301507021646 00000000000000 set-conformal-refine - Geomview Manual

Next: , Previous: set-clock, Up: GCL Reference


7.2.111 set-conformal-refine

(set-conformal-refine CMX [N [SHOWEDGES]])
Sets the parameters for the refinement algorithm used in drawing in the conformal model. CMX is the cosine of the maximum angle an edge can bend before it is refined. Its value should be between -1 and 1; the default is 0.95; decreasing its value will cause less refinement. N is the maximum number of iterations of refining; the default is 6. SHOWEDGES, which should be no or yes, determines whether interior edges in the refinement are drawn.
geomview-1.9.4/doc/geomview.html/redraw.html0000644000175000001440000000333110663301507015771 00000000000000 redraw - Geomview Manual

Next: , Previous: real-id, Up: GCL Reference


7.2.102 redraw

(redraw CAM-ID)
States that the view in CAM-ID should be redrawn on the next pass through the main loop or the next invocation of draw.
geomview-1.9.4/doc/geomview.html/scale.html0000644000175000001440000000423110663301507015574 00000000000000 scale - Geomview Manual

Next: , Previous: rib-snapshot, Up: GCL Reference


7.2.108 scale

(scale GEOM-ID FACTOR [FACTORY FACTORZ])
Scale GEOM-ID, multiplying its size by FACTOR. The factors should be positive numbers. If FACTORY and FACTORZ are present and non-zero, the object is scaled by FACTOR in x, by FACTORY in y, and by FACTORZ in z. If only FACTOR is present, the object is scaled by FACTOR in x, y, and z. Scaling only really makes sense in Euclidean space. Mouse-driven scaling in other spaces is not allowed; the scale command may be issued in other spaces but should be used with caution because it may cause the data to extend beyond the limits of the space.
geomview-1.9.4/doc/geomview.html/Example3.html0000644000175000001440000006135410663301507016174 00000000000000 Example3 - Geomview Manual

Next: , Previous: XForms, Up: Modules


6.5 Example 3: External Module with Bi-Directional Communication

The previous two example modules simply send commands to Geomview and do not receive anything from Geomview. This section describes a module that communicates in both directions. There are two types of communication that can go from Geomview to an external module. This example shows asynchronous communication — the module needs to be able to respond at any moment to expressions that Geomview may emit which inform the module of some change of state within Geomview.

(The other type of communication is synchronous, where a module sends a request to Geomview for some piece of information and waits for a response to come back before doing anything else. The main GCL command for requesting information of this type is (write ...). This module does not do any synchronous communication.)

In ansynchronous communication, Geomview sends expressions that are essentially echoes of GCL commands. The external module sends Geomview a command expressing interest in a certain command, and then every time Geomview executes that command, the module receives a copy of it. This happens regardless of who sent the command to Geomview; it can be the result of the user doing something with a Geomview panel, or it may have come from another module or from a file that Geomview reads. This is how a module can find out about and act on things that happen in Geomview.

This example uses the OOGL lisp library to parse and act on the expressions that Geomview writes to the module's standard input. This library is actually part of Geomview itself — we wrote the library in the process of implementing GCL. It is also convenient to use it in external modules that must understand a of subset of GCL — specifically, those commands that the module has expressed interest in.

This example shows how a module can receive user pick events, i.e. when the user clicks the right mouse button with the cursor over a geom in a Geomview camera window. When this happens Geomview generates an internal call to a procedure called pick; the arguments to the procedure give information about the pick, such as what object was picked, the coordinates of the picked point, etc. If an external module has expressed interest in calls to pick, then whenever pick is called Geomview will echo the call to the module's standard input. The module can then do whatever it wants with the pick information.

This module is the same as the Nose module that comes with Geomview. Its purpose is to illustrate picking. Whenever you pick on a geom by clicking the right mouse button on it, the module draws a little box at the spot where you clicked. Usually the box is yellow. If you pick a vertex, the box is colored magenta. If you pick a point on an edge of an object, the module will also highlight the edge by drawing cyan boxes at its endpoints and drawing a yellow line along the edge.

Note that in order for this module to actually do anything you must have a geom loaded into Geomview and you must click the right mouse button with the cursor over a part of the geom.

     
     /*
      * example3.c: external module with bi-directional communication
      *
      * This example module is distributed with the Geomview manual.
      * If you are not reading this in the manual, see the "External
      * Modules" chapter of the manual for an explanation.
      *
      * This module is the same as the "Nose" program that is distributed
      * with Geomview.  It illustrates how a module can find out about
      * and respond to user pick events in Geomview.  It draws a little box
      * at the point where a pick occurrs.  The box is yellow if it is not
      * at a vertex, and magenta if it is on a vertex.  If it is on an edge,
      * the program also marks the edge.
      *
      * To compile:
      *
      *   cc -I/u/gcg/ngrap/include -g -o example3 example3.c \
      *      -L/u/gcg/ngrap/lib/sgi -loogl -lm
      *
      * You should replace "/u/gcg/ngrap" above with the pathname of the
      * Geomview distribution directory on your system.
      */
     
     #include <stdio.h>
     #include "lisp.h"               /* We use the OOGL lisp library */
     #include "pickfunc.h"           /* for PICKFUNC below */
     #include "3d.h"                 /* for 3d geometry library */
     
     /* boxstring gives the OOGL data to define the little box that
      * we draw at the pick point.  NOTE:  It is very important to
      * have a newline at the end of the OFF object in this string.
      */
     char boxstring[] = "\
     INST\n\
     transform\n\
     .04 0 0 0\n\
     0 .04 0 0\n\
     0 0 .04 0\n\
     0 0 0 1\n\
     geom\n\
     OFF\n\
     8 6 12\n\
     \n\
     -.5 -.5 -.5     # 0   \n\
     .5 -.5 -.5      # 1   \n\
     .5  .5 -.5      # 2   \n\
     -.5  .5 -.5     # 3   \n\
     -.5 -.5  .5     # 4   \n\
     .5 -.5  .5      # 5   \n\
     .5  .5  .5      # 6   \n\
     -.5  .5  .5     # 7   \n\
     \n\
     4 0 1 2 3\n\
     4 4 5 6 7\n\
     4 2 3 7 6\n\
     4 0 1 5 4\n\
     4 0 4 7 3\n\
     4 1 2 6 5\n";
     
     progn()
     {
       printf("(progn\n");
     }
     
     endprogn()
     {
       printf(")\n");
       fflush(stdout);
     }
     
     Initialize()
     {
       extern LObject *Lpick();  /* This is defined by PICKFUNC below but must */
       			    /* be used in the following LDefun() call */
       LInit();
       LDefun("pick", Lpick, NULL);
     
       progn(); {
         /* Define handle "littlebox" for use later
          */
         printf("(read geometry { define littlebox { %s }})\n", boxstring);
     
         /* Express interest in pick events; see Geomview manual for explanation.
          */
         printf("(interest (pick world * * * * nil nil nil nil nil))\n");
     
         /* Define "pick" object, initially the empty list (= null object).
          * We replace this later upon receiving a pick event.
          */
         printf("(geometry \"pick\" { LIST } )\n");
     
         /* Make the "pick" object be non-pickable.
          */
         printf("(pickable \"pick\" no)\n");
     
         /* Turn off normalization, so that our pick object will appear in the
          * right place.
          */
         printf("(normalization \"pick\" none)\n");
     
         /* Don't draw the pick object's bounding box.
          */
         printf("(bbox-draw \"pick\" off)\n");
     
       } endprogn();
     }
     
     /* The following is a macro call that defines a procedure called
      * Lpick().  The reason for doing this in a macro is that that macro
      * encapsulates a lot of necessary stuff that would be the same for
      * this procedure in any program.  If you write a Geomview module that
      * wants to know about user pick events you can just copy this macro
      * call and change the body to suit your needs; the body is the last
      * argument to the macro and is delimited by curly braces.
      *
      * The first argument to the macro is the name of the procedure to
      * be defined, "Lpick".
      *
      * The next two arguments are numbers which specify the sizes that
      * certain arrays inside the body of the procedure should have.
      * These arrays are used for storing the face and path information
      * of the picked object.  In this module we don't care about this
      * information so we declare them to have length 1, the minimum
      * allowed.
      *
      * The last argument is a block of code to be executed when the module
      * receives a pick event.  In this body you can refer to certain local
      * variables that hold information about the pick.  For details see
      * Example 3 in the Extenal Modules chapter of the Geomview manual.
      */
     PICKFUNC(Lpick, 1, 1,
     {
       handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge);
     },
     /* version for picking Nd-objects (not documented here) */)
     
     handle_pick(picked, p, vert, v, edge, e)
          int picked;                /* was something actually picked?     */
          int vert;                  /* was the pick near a vertex?        */
          int edge;                  /* was the pick near an edge?         */
          HPoint3 *p;                /* coords of pick point               */
          HPoint3 *v;                /* coords of picked vertex            */
          HPoint3 e[2];              /* coords of endpoints of picked edge */
     {
       Normalize(&e[0]);             /* Normalize makes 4th coord 1.0 */
       Normalize(&e[1]);
       Normalize(p);
       progn(); {
         if (!picked) {
           printf("(geometry \"pick\" { LIST } )\n");
         } else {
           /*
            * Put the box in place, and color it magenta if it's on a vertex,
            * yellow if not.
            */
           printf("(xform-set pick { 1 0 0 0  0 1 0 0  0 0 1 0  %g %g %g 1 })\n",
                  p->x, p->y, p->z);
           printf("(geometry \"pick\"\n");
           if (vert) printf("{ appearance { material { diffuse 1 0 1 } }\n");
           else printf("{ appearance { material { diffuse 1 1 0 } }\n");
           printf("  { LIST { :littlebox }\n");
     
           /*
            * If it's on an edge and not a vertex, mark the edge
            * with cyan boxes at the endpoins and a black line
            * along the edge.
            */
           if (edge && !vert) {
             e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z;
             e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z;
             printf("{ appearance { material { diffuse 0 1 1 } }\n\
       LIST\n\
        { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\
        { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\
        { VECT\n\
               1 2 1\n\
               2\n\
               1\n\
               %f %f %f\n\
               %f %f %f\n\
               1 1 0 1\n\
        }\n\
       }\n",
                    e[0].x, e[0].y, e[0].z,
                    e[1].x, e[1].y, e[1].z,
                    e[0].x, e[0].y, e[0].z,
                    e[1].x, e[1].y, e[1].z);
           }
           printf("    }\n  }\n)\n");
         }
     
       } endprogn();
     
     }
     
     Normalize(HPoint3 *p)
     {
       if (p->w != 0) {
         p->x /= p->w;
         p->y /= p->w;
         p->z /= p->w;
         p->w = 1;
       }
     }
     
     main()
     {
       Lake *lake;
       LObject *lit, *val;
       extern char *getenv();
     
       Initialize();
     
       lake = LakeDefine(stdin, stdout, NULL);
       while (!feof(stdin)) {
     
         /* Parse next lisp expression from stdin.
          */
         lit = LSexpr(lake);
     
         /* Evaluate that expression; this is where Lpick() gets called.
          */
         val = LEval(lit);
     
         /* Free the two expressions from above.
          */
         LFree(lit);
         LFree(val);
       }
     }
     

The code begins by defining procedures progn() and endprogn() which begin and end a Geomview progn group. The purpose of the Geomview progn command is to group commands together and cause Geomview to execute them all at once, without refreshing any graphics windows until the end. It is a good idea to group blocks of commands that a module sends to Geomview like this so that the user sees their cumulative effect all at once.

Procedure Initialize() does various things needed at program startup time. It initializes the lisp library by calling LInit(). Any program that uses the lisp library should call this once before calling any other lisp library functions. It then calls LDefun to tell the library about our pick procedure, which is defined further down with a call to the PICKFUNC macro. Then it sends a bunch of setup commands to Geomview, grouped in a progn block. This includes defining a handle called littlebox that stores the geometry of the little box. Next it sends the command

     (interest (pick world * * * * nil nil nil nil nil))

which tells Geomview to notify us when a pick event happens.

The syntax of this interest statement merits some explanation. In general interest takes one argument which is a (parenthesized) expression representing a Geomview function call. It specifies a type of call that the module is interested in knowing about. The arguments can be any particular argument values, or the special symbols * or nil. For example, the first argument in the pick expression above is world. This means that the module is interested in calls to pick where the first argument, which specifies the coordinate system, is world. A * is like a wild-card; it means that the module is interested in calls where the corresponding argument has any value. The word nil is like *, except that the argument's value is not reported to the module. This is useful for cutting down on the amount of data that must be transmitted in cases where there are arguments that the module doesn't care about.

The second, third, fourth, and fifth arguments to the pick command give the name, pick point coordinates, vertex coordinates, and edge coordinates of a pick event. We specify these by *'s above. The remaining five arguments to the pick command give other information about the pick event that we do not care about in this module, so we specify these with nil's. For the details of the arguments to pick, See GCL.

The geometry statement defines a geom called pick that is initially an empty list, specified as { LIST } ; this is the best way of specifying a null geom. The module will replace this with something useful by sending Geomview another geometry command when the user picks something. Next we arrange for the pick object to be non-pickable, and turn normalization off for it so that Geomview will display it in the size and location where we put it, rather than resizing and relocating it to fit into the unit cube.

The next function in the file, Lpick, is defined with a strange looking call to a macro called PICKFUNC, defined in the header file pickfunc.h. This is the function for handling pick events. The reason we provide a macro for this is that that macro encapsulates a lot of necessary stuff that would be the same for the pick-handling function in any program. If you write a Geomview module that wants to know about user pick events you can just copy this macro call and change it to suit yours needs.

In general the syntax for PICKFUNC is

     PICKFUNC(name, block, NDblock)

where name is the name of the procedure to be defined, in this case Lpick. The next argument, block, is a block of code to be executed when a pick event occurs. If block contains a return statement, then the returned value must be a pointer to a Lisp-object, that is of type LObject *. The last argument has the same functionality as the block argument, but is only invoked when picking objects in a higher dimensional world.

PICKFUNC declares certain local variables in the body of the procedure. When the module receives a (pick ...) statement from Geomview, the procedure assigns values to these variables based on the information in the pick call (variables corresponding to nil's in the (interest (pick ...)) are not given values).

There is also a second variant of the PICKFUNC macro with a slightly different syntax:

     DEFPICKFUNC(helpstr, coordsys, id,
       point, pn, vertex, vn, edge, en, face, fn, ppath, ppn,
       vi, ei, ein, fi,
       body, NDbody)

DEFPICKFUNC can be used as well as PICKFUNC, there is no functional differene with the exception that the name of the C-function is tied to Lpick when using DEFPICKFUNC and that the (help pick) GCL-command (see (help ...)) would respond with echoing helpstr.

The table below lists all variables defined in PICKFUNC In the context of ND-viewing float variants of the arguments apply: the body execution block sees the HPoint3 variables, and the NDbody block sees only flat one-dimensional arrays of float-type.

In the ND-viewing context the co-ordinates passed to the pick function are still the 3-dimensional co-ordinates of the camera view-port where the pick occurred, but padded with zeroes on transformed back to the co-ordinate system specified by the second argument of the pick command.

char *coordsys;
A string specifying the coordinate system in which coordinates are given. In this example, this will always be world because of the interest call above.
char *id;
A string specifying the name of the picked geom.
HPoint3 point; int pn;
float *point; int pn;
point is an HPoint3 structure giving the coordinates of the picked point. HPoint3 is a homogeneous point coordinate representation equivalent to an array of 4 floats. pn tells how many coordinates have been written into this array; it will always be either 0, 4 or greater than 4. If it is greater than 4, then the NDbody instruction block is invoked and in this case point is a flat array of pn many floats. A value of zero means no point was picked, i.e. the user clicked the right mouse button while the cursor was not pointing at a geom. In this case the ordinary block 3d instruction block is executed.
HPoint3 vertex; int vn;
float *vertex; int vn;
vertex is an HPoint3 structure giving the coordinates of the picked vertex, if the pick point was near a vertex. vn tells how many coordinates have been written into this array; it will always be either 0 or greater equal 4. A value of zero means the pick point was not near a vertex. In the context of ND-viewing vertex will be an array of vn floats and vn will be equal to pn.
HPoint3 edge[2]; int en;
float *edge; int en;
edge is an array of two HPoint3 structures giving the coordinates of the endpoints of the picked edge, if the pick point was near an edge. en tells how many coordinates have been written into this array; it will always be 0 or greater equal 8. A value of zero means the pick point was not near an edge. In the context of ND-viewing edge will be a flat one-dimensional array of en many floats: the first pn floats define the first vertex, and the second pn many floats define the second vertex; en will be two times pn.

In this example module, the remaining variables will never be given values because their values in the interest statement were specified as nil.

HPoint3 face[]; int fn;
float *face; int fn;
face is a variable length array of fn HPoint3's. face gives the coordinates of the vertices of the picked face. fn tells how many coordinates have been written into this array; it will always be either 0 or a multiple of pn. A value of zero means the pick point was not near a face. In the context of ND-viewing face is a flat one-dimensional array of fn many floats of which each vertex occupies pn many components.
int ppath[]; int ppn;
ppath is an array of maxpathlen int's. ppath gives the path through the OOGL heirarchy to the picked primitive. pn tells how many integers have been written into this array; it will be at most maxpathlen. A path of {3,1,2}, for example, means that the picked primitive is "subobject number 2 of subobject number 1 of object 3 in the world".
int vi;
vi gives the index of the picked vertex in the picked primitive, if the pick point was near a vertex.
int ei[2]; int ein
The ei array gives the indices of the endpoints of the picked edge, if the pick point was near a vertex. ein tells how many integers were written into this array. It will always be either 0 or 2; a value of 0 means the pick point was not near an edge.
int fi;
fi gives the index of the picked face in the picked primitive, if the pick point was near a face.

The handle_pick procedure actually does the work of dealing with the pick event. It begins by normalizing the homogeneous coordinates passed in as arguments so that we can assume the fourth coordinate is 1. It then sends GCL commands to define the pick object to be whatever is appropriate for the kind of pick recieved. See see OOGL File Formats, and see GCL, for an explanation of the format of the data in these commands.

The main program, at the bottom of the file, first calls Initialize(). Next, the call to LakeDefine defines the Lake that the lisp library will use. A Lake is a structure that the lisp library uses internally as a type of communiation vehicle. (It is like a unix stream but more general, hence the name.) This call to LakeDefine defines a Lake structure for doing I/O with stdin and stdout. The third argument to LakeDefine should be NULL for external modules (it is used by Geomview). Finally, the program enters its main loop which parses and evaluates expressions from standard input. geomview-1.9.4/doc/geomview.html/snapshot.html0000644000175000001440000000622010663301507016344 00000000000000 snapshot - Geomview Manual

Next: , Previous: sleep-until, Up: GCL Reference


7.2.120 snapshot

(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])
Save a snapshot of CAM-ID in the FILENAME (a string). The FORMAT argument is optional; it may be "ppmscreen" (the default), "ps", "ppm", "sgi" (on SGI machines), "ppmosmesa" (if built with libOSMesa) or "ppmosglx". A "ppmscreen" snapshot is created by reading the image directly from the given window; the window is popped above other windows and redrawn first, then its contents are written as a PPM format image. A "ppmosmesa" snapshot is drawn by Mesa's software renderer into a memory buffer in RAM. A "ppmosglx" snapshot is rendered into a GLX Pixmap buffer, which is also off-screen but may or may not reside in video RAM. Rendering may or may not be accelerated. The problem with on-screen snapshots is that the window must be mapped and not obscured by other windows. So on-screen snapshots will not work in the background, or when a screen safer is active. With "ps", dumps a Postscript picture representing the view from that window; hidden-surface removal might be incorrect. With "ppm", dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the FILENAME argument begins with "|", it's interpreted as a /bin/sh command to which the PPM or PS data should be piped. Optional XSIZE and YSIZE values are relevant only for "ppm" formats, and render to a window of that size (or scaled to that size, with aspect fixed, if only XSIZE is given)
geomview-1.9.4/doc/geomview.html/Example4.html0000644000175000001440000001755510663301507016201 00000000000000 Example4 - Geomview Manual

Next: , Previous: Example3, Up: Modules


6.6 Example 4: Simple Tcl/Tk Module Demonstrating Picking

It's not necessary to write a Geomview module in C. The only requirement of an external module is that it send GCL commands to its standard output and expect responses (if any) on its standard input. An external module can be written in C, perl, tcl/tk, or pretty much anything.

As an example, assuming you have Tcl/Tk version 4.0 or later, here's an external module with a simple GUI which demonstrates interaction with geomview. This manual doesn't discuss the Tcl/Tk language; see the good book on the subject by its originator John Ousterhout, published by Addison-Wesley, titled Tcl and the Tk Toolkit.

The `#!' on the script's first line causes the system to interpret the script using the Tcl/Tk `wish' program; you might have to change its first line if that's in some location other than /usr/local/bin/wish4.0. Or, you could define it as a module using

       (emodule-define  "Pick Demo"  "wish pickdemo.tcl")

in which case `wish' could be anywhere on the UNIX search path.

     #! /usr/local/bin/wish4.0
     
     # We use "fileevent" below to have "readsomething" be called whenever
     # data is available from standard input, i.e. when geomview has sent us
     # something.  It promises to include a trailing newline, so we can use
     # "gets" to read the geomview response, then parse its nested parentheses
     # into tcl-friendly {} braces.
     
     proc readsomething {} {
       if {[gets stdin line] < 0} {
             puts stderr "EOF on input, exiting..."
             exit
       }
       regsub -all {\(} $line "\{" line
       regsub -all {\)} $line "\}" line
       # Strip outermost set of braces
       set stuff [lindex $line 0]
       # Invoke handler for whichever command we got.  Could add others here,
       # if we asked geomview for other kinds of data as well.
       switch [lindex $stuff 0] {
             pick     {handlepick $stuff}
             rawevent {handlekey $stuff}
       }
     }
     
     # Fields of a "pick" response, from geomview manual:
     #     (pick COORDSYS GEOMID G V E F P VI EI FI)
     #          The pick command is executed internally in response to pick
     #          events (right mouse double click).
     #
     #          COORDSYS = coordinate system in which coordinates of the following
     #              arguments are specified.   This can be:
     #               world: world coord sys
     #               self:  coord sys of the picked geom (GEOMID)
     #               primitive: coord sys of the actual primitive within
     #                   the picked geom where the pick occurred.
     #          GEOMID = id of picked geom
     #          G = picked point (actual intersection of pick ray with object)
     #          V = picked vertex, if any
     #          E = picked edge, if any
     #          F = picked face
     #          P = path to picked primitive [0 or more]
     #          VI = index of picked vertex in primitive
     #          EI = list of indices of endpoints of picked edge, if any
     #          FI = index of picked face
     
     # Report when user picked something.
     #
     proc handlepick {pick} {
       global nameof selvert seledge order
       set obj [lindex $pick 2]
       set xyzw [lindex $pick 3]
       set fv [lindex $pick 6]
       set vi [lindex $pick 8]
       set ei [lindex $pick 9]
       set fi [lindex $pick 10]
     
       # Report result, converting 4-component homogeneous point into 3-space point.
       set w [lindex $xyzw 3]
       set x [expr [lindex $xyzw 0]/$w]
       set y [expr [lindex $xyzw 1]/$w]
       set z [expr [lindex $xyzw 2]/$w]
       set s "$x $y $z "
       if {$vi >= 0} {
             set s "$s  vertex #$vi"
       }
       if {$ei != {}} {
             set s "$s  edge [lindex $ei 0]-[lindex $ei 1]"
       }
       if {$fi != -1} {
             set s "$s  face #$fi ([expr [llength $fv]/3]-gon)"
       }
       msg $s
     }
     
     
     # Having asked for notification of these raw events, we report when
     # the user pressed these keys in the geomview graphics windows.
     
     proc handlekey {event} {
       global lastincr
       switch [lindex $event 1] {
         32 {msg "Pressed space bar"}
          8 {msg "Pressed backspace key"}
       }
     }
     
     
     #
     # Display a message on the control panel, and on the terminal where geomview
     # was started.  We use ``puts stderr ...'' rather than simply ``puts ...'',
     # since Geomview interprets anything we send to standard output
     # as a GCL command!
     #
     proc msg {str} {
       global msgtext
       puts stderr $str
       set msgtext $str
       update
     }
     
     # Load object from file
     proc loadobject {fname} {
       if {$fname != ""} {
             puts "(geometry thing < $fname)"
             # Be sure to flush output to ensure geomview receives this now!
             flush stdout
       }
     }
     
     
     # Build simple "user interface"
     
     # The message area could be a simple label rather than an entry box,
     # but we want to be able to use X selection to copy text from it.
     # The default mouse bindings do that automatically.
     
     entry .msg -textvariable msgtext -width 45
     pack .msg
     
     frame .f
     
       label .f.l -text "File to load:"
       pack .f.l -side left
     
       entry .f.ent -textvariable fname
       pack .f.ent -side left -expand true -fill x
       bind .f.ent <Return> { loadobject $fname }
     
     pack .f
     
     
     # End UI definition.
     
     
     # Call "readsomething" when data arrives from geomview.
     
     fileevent stdin readable {readsomething}
     
     # Geomview initialization
     
     puts {
             (interest (pick primitive))
             (interest (rawevent 32))	# Be notified when user presses space
             (interest (rawevent 8))		# or backspace keys.
             (geometry thing < hdodec.off)
             (normalization world none)
     }
     # Flush to ensure geomview receives this.
     flush stdout
     
     wm title . {Sample external module}
     
     msg "Click right mouse in graphics window"
geomview-1.9.4/doc/geomview.html/Intro.html0000644000175000001440000000537210663301507015607 00000000000000 Intro - Geomview Manual

Next: , Previous: Top, Up: Top


Introduction to Geomview

Geomview is an interactive program for viewing and manipulating geometric objects, originally written by staff members of the Geometry Center at the University of Minnesota, starting in 1991. It can be used as a stand-alone viewer for static objects or as a display engine for other programs which produce dynamically changing geometry. It runs on many kinds of Unix computers, including Linux, SGI, Sun, and HP. It also runs with Cygwin. This manual describes Geomview version 1.9.

Geomview is free software, available under the terms of the GNU Lesser Public License; see Copying for details.

Geomview and this manual are available for download from http://www.geomview.org.

Permission is granted to make copies of this manual.

If you have questions or comments about Geomview or this manual, consider joining in the geomview-users mailing list, which is a forum in which users of Geomview communicate to answer each others' questions and to share news about what they are doing with Geomview. The Geomview authors participate in this list and sometimes post answers to questions there. To join the list, visit the list web page at http://lists.sourceforge.net/mailman/listinfo/geomview-users. geomview-1.9.4/doc/geomview.html/delete.html0000644000175000001440000000316610663301507015755 00000000000000 delete - Geomview Manual

Next: , Previous: cursor-twitch, Up: GCL Reference


7.2.26 delete

(delete ID)
Delete object or camera ID.
geomview-1.9.4/doc/geomview.html/emodule_002dtransmit.html0000644000175000001440000000371610663301507020455 00000000000000 emodule-transmit - Geomview Manual

Next: , Previous: emodule-start, Up: GCL Reference


7.2.41 emodule-transmit

(emodule-transmit NAME LIST)
Places LIST into external module NAME's standard input. NAME is searched for in the names of the modules as they appear in the External Modules browser and then in the shell commands used to execute the external modules. Does nothing if modname is not running.
geomview-1.9.4/doc/geomview.html/Networked-Geomview.html0000644000175000001440000000725710663301507020242 00000000000000 Networked Geomview - Geomview Manual

Next: , Previous: Remote Display, Up: Remote Display


9.4.1 Using a Networked Geomview Host

The Geomview command looks at the DISPLAY or REMOTEHOST environment variables to try to determine if you are logged in from another computer. If either of these indicates that you are, Geomview will attempt to run Geomview on that computer. In order for this to work, your network must be configured such that the Mathematica computer can successfully rsh to the Geomview computer without giving a password.

You can also explicitly set the DisplayHost option to the Geomview command to a string which is the desired hostname, for example:

     In[1] := << OOGL.m
     
     In[2] := Plot3D[Sin[x + Sin[y]], {x,-2,2},{y,-2,2}]
     
     Out[2] := -Graphics3D-
     
     In[3] := Geomview[%3, DisplayHost->"riemann"]

This displays the graphics %3 on the remote host named riemann.

Geomview recognizes the string "local" as a value for $DisplayHost; it forces the graphics to be displayed on the local machine.

In addition to knowing the name of the machine you want to run Geomview on, Geomview needs to know the type of that machine (the setting of the CPU variable that corresponds to the machine; see Source Code Installation). By default, Geomview assumes that it is the same kind of computer as the one you are running Mathematica on. The MachType option lets you explicitly specify the type of the DisplayHost computer; it should be one of the strings "sgi" or "next" or "x11".

You can use SetOptions to change the default DisplayHost and MachType. For example,

     In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"]

arranges for Geomview to run Geomview on an SGI workstation named riemann. geomview-1.9.4/doc/geomview.html/Private-Module-Installation.html0000644000175000001440000000606610663301507022011 00000000000000 Private Module Installation - Geomview Manual

6.7.1 Private Module Installation

The emodule-define command arranges for a module to appear in Geomview's Modules browser. The command takes two string arguments; the first is the name that will appear in the Modules browser. The second is the shell command for running the module; it may include arguments (see (emodule-define ...)). Geomview executes this command in a subshell when you click on the module's entry in the browser. For example

     (emodule-define "Foo" "/u/home/modules/foo -x")

adds a line labeled "Foo" to the Modules browser which causes the command "/u/home/modules/foo -x" to be executed when selected.

You may put emodule-define commands in your ~/.geomview file to arrange for certain modules to be available every time you run Geomview; See Customization. You can also execute emodule-define commands from the Commands panel to add a module to an already running copy of Geomview.

There are several other GCL commands for controlling the entries in the Modules browser; for details, See GCL. geomview-1.9.4/doc/geomview.html/Module-Installation.html0000644000175000001440000000401710663301507020373 00000000000000 Module Installation - Geomview Manual

Previous: Example4, Up: Modules


6.7 Module Installation

This section tells how to install an external module so you can invoke it within Geomview. There are two ways to install a module: you can install a private module so that the module is available to you whenever you run Geomview, or you can install a system module so that the module is available to all users on your system whenever they run Geomview.

geomview-1.9.4/doc/geomview.html/copy.html0000644000175000001440000000340510663301507015461 00000000000000 copy - Geomview Manual

Next: , Previous: command, Up: GCL Reference


7.2.23 copy

(copy [ID] [name])
Copies an object or camera. If ID is not specified, it is assumed to be targetgeom. If name is not specified, it is assumed to be the same as the name of ID.
geomview-1.9.4/doc/geomview.html/event_002dkeys.html0000644000175000001440000000332510663301507017252 00000000000000 event-keys - Geomview Manual

Next: , Previous: escale, Up: GCL Reference


7.2.43 event-keys

(event-keys {on|off})
Turn keyboard events on or off to enable/disable keyboard shortcuts.
geomview-1.9.4/doc/geomview.html/Overview.html0000644000175000001440000001004210663301507016310 00000000000000 Overview - Geomview Manual

Next: , Previous: Pronunciation, Up: Top


1 Overview

Geomview's main purpose is to display objects whose geometry is given, allowing interactive control over details such as point of view, speed of movement, appearance of surfaces and lines, and so on. Geomview can handle any number of objects and allows both separate and collective control over them.

The simplest way to use Geomview is as a stand-alone viewer to see and manipulate objects. It can display objects described in a variety of file formats. It comes with a wide variety of example objects, and you can create your own objects.

You can also use Geomview to handle the display of data coming from another program that is running simultaneously. As the other program changes the data, the Geomview image reflects the changes. Programs that generate objects and use Geomview to display them are called external modules. External modules can control almost all aspects of Geomview. The idea here is that many aspects of the display and interaction parts of geometry software are independent of the geometric content and can be collected together in a single piece of software that can be used in a wide variety of situations. The author of the external module can then concentrate on implementing the desired algorithms and leave the display aspects to Geomview. Geomview comes with a collection of sample external modules, and this manual describes how to write your own.

Geomview is the product of an effort at the Geometry Center to provide interactive geometry software that is particularly appropriate for mathematics research and education. In particular, Geomview can display things in hyperbolic and spherical space as well as Euclidean space.

Geomview allows multiple independently controllable objects and cameras. It provides interactive control for motion, appearances (including lighting, shading, and materials), picking on an object, edge or vertex level, snapshots in SGI image file or Renderman RIB format, and adding or deleting objects is provided through direct mouse manipulation, control panels, and keyboard shortcuts.

Geomview supports the following simple data types: polyhedra with shared vertices (.off), quadrilaterals, rectangular meshes, vectors, and Bezier surface patches of arbitrary degree including rational patches. Object hierarchies can be constructed with lists of objects and instances of object(s) transformed by one or many 4x4 matrices. Arbitrary portions of changing hierarchies may be transmitted by creating named references.

Geomview can display 3-D graphics output from Mathematica and Maple. geomview-1.9.4/doc/geomview.html/Keyboard-Shortcuts.html0000644000175000001440000002057210663301507020247 00000000000000 Keyboard Shortcuts - Geomview Manual

Previous: Commands, Up: Interaction


3.10 Keyboard Shortcuts

Most actions that you can do through Geomview's panels have equivalent keyboard shortcuts so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts usually are indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the keyboard shortcut for Rotate mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the MOTION MODE browser. To use this keyboard shortcut just hit the r key while the mouse cursor is in any Geomview window. You don't need to press the <Enter> or <SPACE> keys.

Some keyboard shortcuts consist of more than one key. In these cases just type the keys one after the other, with no <Enter> afterwards. Keyboard shortcuts are case sensitive. You can cancel a multi-key keyboard shortcut that you have started by typing any invalid key, for example the space bar.

Keyboard commands apply while the cursor is in any camera window and most control panels.

Many keyboard shortcuts allow numeric arguments which you type as a prefix to the command key(s). For example, the shortcut for Near clip in the camera panel is v n. To set the near clip plane to `0.5', type 0.5vn. Commands that don't take a numeric prefix toggle or reset the current value.

Most commands allow one of the following selection prefixes. If none is provided the command applies to the target object.

g
world geom
g#
#'th geom
g*
All geoms
c
current camera
c#
#'th camera
c*
All cameras

For example, g4af means toggle the face drawing of object g4.

Simply typing a selection prefix, like g4, doesn't yet select an object; that only happens when a command, like ae, follows the prefix. To select an object as the target without doing anything else to it, use the p command. So g3p selects object g3.

The text field in the upper left corner of the Main panel shows the state of the current keyboard shortcut.

In addition to the keyboard shortcuts for the panel commands, there is also a shortcut for picking a target object: type the short name of the object followed by p. For example, to select object g3, type g 3 p. This only works with the short names — the ones that appear in square brackets ([ ]) in the Targets browser of the Main panel.

Below is a summary of all keyboard shortcuts.

Draw
af
Faces
ae
Edges
an
Normals
ab
Bounding Boxes
aV
Vectors

Shading
0as
Constant
1as
Flat
2as
Smooth
3as
Smooth, non-lighted
aT
allow transparency
at
texture mapping

Other
av
eVert normals: always face viewer
#aw
Line Width (pixels)
aC
handle concave polygons
#vc
edges Closer than faces (try 5-100)

Color
Cf
faces
Ce
edges
Cn
normals
Cb
bounding boxes
CB
background

Motions
r
rotate
t
translate
z
zoom FOV
f
fly
o
orbit
s
scale
w
recenter target
W
recenter all
h
halt
H
halt all
@
select center of motion (e.g. g 3 @)
L
Look At object

Viewing
0vp
Orthographic view
1vp
Perspective view
vd
Draw other views' cameras
#vv
field of View
#vn
near clip distance
#vf
far clip distance
v+
add new camera
vx
cursor on/off
vb
backfacing poly cull on/off
#vl
focal length
v~
Software shading on/off

Panels
Pm
Main
Pa
Appearance
Pl
Lighting
Po
Obscure
Pt
Tools
Pc
Cameras
PC
Commands
Pf
Files
Ps
Save
P-
read commands from tty
PA
Credits ("about")

Lights
ls
show lights
le
edit lights

Space
me
Euclidean
mh
Hyperbolic
ms
Spherical

Model
mv
Virtual
mp
Projective
mc
Conformal

Other
0N
normalizaton: none
1N
normalization: each
2N all
normalization: all
ui
motion: Inertia
uc
motion: Constrain to axis
uo
motion: object's Own coordinates
<
Pf
load geometry/command file
dd
delete target object
>
Ps
save state to file
TV
NTSC mode toggle
p
pick as target object (e.g. g 3 p) With no prefix, selects the object under the mouse cursor (like double-clicking the right mouse)
geomview-1.9.4/doc/geomview.html/File-names.html0000644000175000001440000000355310663301507016473 00000000000000 File names - Geomview Manual

Next: , Previous: Common syntax, Up: Conventions


4.1.2 File Names

When OOGL objects are read from disk files, the OOGL library uses the file suffix to guess at the file type.

If the suffix is unrecognized, or if no suffix is available (e.g. for an object being read from a pipe, or embedded in another OOGL object), all known types of objects are tried in turn until one accepts the data as valid. geomview-1.9.4/doc/geomview.html/winenter.html0000644000175000001440000000330610663301507016342 00000000000000 winenter - Geomview Manual

Next: , Previous: window, Up: GCL Reference


7.2.143 winenter

(winenter CAM-ID)
Tell geomview that the mouse cursor is in the window of CAM-ID. This function is for development purposes and is not intended for general use.
geomview-1.9.4/doc/geomview.html/if.html0000644000175000001440000000351410663301507015106 00000000000000 if - Geomview Manual

Next: , Previous: hsphere-draw, Up: GCL Reference


7.2.57 if

(if TEST EXPR1 [EXPR2])
Evaluates TEST; if TEST returns a non-nil value, returns the value of EXPR1. If TEST returns nil, returns the value of EXPR2 if EXPR2 is present, otherwise returns nil.
geomview-1.9.4/doc/geomview.html/event_002dpick.html0000644000175000001440000000324210663301507017223 00000000000000 event-pick - Geomview Manual

Next: , Previous: event-mode, Up: GCL Reference


7.2.45 event-pick

(event-pick {on|off})
Turn picking on or off.
geomview-1.9.4/doc/geomview.html/Starting-Geomview.html0000644000175000001440000000422510663301507020063 00000000000000 Starting Geomview - Geomview Manual

Next: , Previous: Interaction, Up: Interaction


3.1 Starting Geomview

The usual way to start Geomview is to type geomview <Enter> in a shell window (<Enter> means hit the "Enter" key). It may take Geomview a few seconds to start up; one or more windows will appear and you can begin interacting with Geomview immediately.

It is also possible to specify actions for Geomview to perform at startup time by giving arguments in the shell command line. See Command Line Options. geomview-1.9.4/doc/geomview.html/emodule_002ddefined.html0000644000175000001440000000374610663301507020215 00000000000000 emodule-defined - Geomview Manual

7.2.35 emodule-defined

(emodule-defined modulename)
If the given external-module name is known, returns the name of the program invoked when it's run as a quoted string; otherwise returns nil. (echo (emodule-defined name)) prints the string.
geomview-1.9.4/doc/geomview.html/emodule_002dclear.html0000644000175000001440000000334010663301507017673 00000000000000 emodule-clear - Geomview Manual

Next: , Previous: echo, Up: GCL Reference


7.2.33 emodule-clear

(emodule-clear)
Clears the geomview application (external module) browser.
geomview-1.9.4/doc/geomview.html/Source-Code-Installation.html0000644000175000001440000001477210663301507021267 00000000000000 Source Code Installation - Geomview Manual

10.2 Compiling and Installing the Source Code Distribution

BUG: This section is out of date. Geomview follows the GNU-installation habits, data goes to PREFIX/share/geomview/, user executables to PREFIX/bin/, private executables to PREFIX/libexec/geomview/, libraries to PREFIX/lib/ where PREFIX denotes the installation prefiex specified for the TOPSRCDIR/configure script. Please have a look at the files TOPSRCDIR/INSTALL and TOPSRCDIR/INSTALL.Geomview for installation instructions.

The main reason to get the source code distribution is to look at and/or work with the source code. If you are only concered with using Geomview it is better to get the binary distribution. It takes anywhere from a few minutes to an hour or more to compile the entire source distribution, depending on what kind of computer you have.

Let $GEOMROOT denote the full pathname of the Geomview source code directory; this is the directory called Geomview that is created when you unpack the distribution. This directory contains the Geomview source code as well as various other files and subdirectories that Geomview needs when it runs.

Before doing any compilation you should edit the file $GEOMROOT/makefiles/mk.site.default. This file defines some make variables which specify your local configuration. This includes the pathnames of the directories into which Geomview will be installed, and possibly some other settings as well. There are comments in the file telling you what to do. This file is included by every Makefile in the source tree, so the settings you specify here are used throughout the source.

If you will be compiling for multiple systems, you can do them all in the same directory tree. By default the Makefiles are set up to put the objects files, libraries, and executables in directories which depend on the type of computer, so the two architectures will not interfere with each other. The Makefiles use a variable called CPU to determine the type of machine. Before doing any compilation you must arrange for this variable to have a value. There are two ways you can do this.

  1. If you will always be compiling Geomview on the same type of computer edit the file $GEOMROOT/makefiles/Makedefs.global to set the CPU variable to one of the values linux, FreeBSD, sgi, hpux, hpux-gcc, solaris, sun4os4 (for Suns with SunOS 4, not Solaris), rs6000, or alpha. If you're using a type of system not in this list, make up a new value for CPU, and write a mk.<CPU> file for it patterned after the other mk.* in the makefiles subdirectory.
  2. If you will be compiling on more than one type of computer you can set a shell environment variable named CPU to one of the values above and the Makefiles will inherit the value from the environment.

Note that many of the Makefiles refer to a variable called MACHTYPE; this variable tells which type of graphics system to compile Geomview for. The mk.<CPU> files set this variable for you; in most cases its value is x11, which specifies that Geomview should be compiled for X windows.

Once you have configured your source tree by editing the files as described above and setting the CPU variable, you can compile and install Geomview by typing make install in the $GEOMROOT directory. You can also type make all, or equivalently just make, to compile without installing, and then type make install later to install.

You can use these same make comands in any subdirectory in the tree to recompile and/or install a part of Geomview or a module.

If you want to modify the complier flags used during compilation, edit the file $GEOMROOT/makefiles/Makedefs.global; the COPTS variable specifies the flags passed to the C compiler (cc). geomview-1.9.4/doc/geomview.html/set_002dmotionscale.html0000644000175000001440000000420310663301507020262 00000000000000 set-motionscale - Geomview Manual

Next: , Previous: set-load-path, Up: GCL Reference


7.2.114 set-motionscale

(set-motionscale X)
Set the motion scale factor to X (default value 0.5). These commands scale their motion by an amount which depends on the distance from the frame to the center and on the size of the frame. Specifically, they scale by dist + scaleof(frame) * motionscale where dist is the distance from the center to the frame and motionscale is the motion scale factor set by this function. Scaleof(frame) measures the size of the frame object.
geomview-1.9.4/doc/geomview.html/merge.html0000644000175000001440000000367710663301507015621 00000000000000 merge - Geomview Manual

Next: , Previous: look-toward, Up: GCL Reference


7.2.69 merge

(merge {window|camera} CAM-ID { WINDOW or CAMERA ... })
Modify the given window or camera, changing just those properties specified in the last argument. E.g.
          	(merge camera Camera { far 20 })
     

sets Camera's far clipping plane to 20 while leaving other attributes untouched.

geomview-1.9.4/doc/geomview.html/figtools.html0000644000175000001440000000011110663301507016324 00000000000000 geomview-1.9.4/doc/geomview.html/or.html0000644000175000001440000000331110663301507015123 00000000000000 or - Geomview Manual

Next: , Previous: not, Up: GCL Reference


7.2.88 or

(or EXPR1 EXPR2)
Evaluates EXPR1; if EXPR1 returns non-nil, return its value, if EXPR1 returns nil, evaluate EXPR2 and return its value.
geomview-1.9.4/doc/geomview.html/all.html0000644000175000001440000000416710663301507015265 00000000000000 all - Geomview Manual

Next: , Previous: emodule-run, Up: GCL Reference


7.2.8 all

(all geometry)
returns a list of names of all geometry objects. Use e.g. `(echo (all geometry))' to print such a list.
(all camera)
returns a list of names of all cameras.
(all emodule defined)
returns a list of all defined external modules.
(all emodule running)
returns a list of all running external modules.
geomview-1.9.4/doc/geomview.html/bbox_002dcolor.html0000644000175000001440000000344510663301507017231 00000000000000 bbox-color - Geomview Manual

Next: , Previous: background-image, Up: GCL Reference


7.2.13 bbox-color

(bbox-color GEOM-ID R G B)
Set the bounding-box color of GEOM-ID; R G B are numbers between 0 and 1.
geomview-1.9.4/doc/geomview.html/Lighting-Panel.html0000644000175000001440000001031110663301507017303 00000000000000 Lighting Panel - Geomview Manual

Previous: Materials Panel, Up: Appearance


3.6.3 The Lighting Panel

The Lighting panel controls the number, position, and color of the light sources used in shading.

figs/light.png

The Lighting Panel.

The Lighting panel is different from the Appearance and Material panels in that it always works with the base appearance. This is because it usually makes sense to use the same set of lights for drawing all objects in your scene.

LIGHTS
The LIGHTS browser shows the currently selected light. Changes made using the other widgets on this panel apply to this light. There is always at least one light, the ambient light.
Intensity
This slider controls the intensity of the current light.
Color
This button brings up a color chooser which lets you select the color of the current light.
Add
This button adds a light.
Delete
This button deletes the current light.
Show Lights
This button lets you see and change the positions of the light sources in a camera window. Each light is drawn as long cylinder which is supposed to remind you of a light beam. When you click on the Show Lights button Geomview goes into "light edit" mode, during which you can rotate current light by holding down the left mouse button and moving the mouse. Lights placed in this way are infinitely distant, so what you are changing is the angular position. Click on the Show Lights button again to return to the previous motion mode and to quit drawing the light beams.
Done
This button dismisses the Lighting panel.

Geomview's Appearance, Materials, and Lighting panels are constructed to allow you to easily do most of the appearance related things that you might want to do. The appearance hierarchy that Geomview supports internally, however, is very complex and there are certain operations that you cannot do with the panels. The Geomview command language (GCL) provides complete support for appearance operations. In particular, the merge-baseap command can be used to change the base appearance (which, except for lighting, cannot be changed by Geomview's panels). The merge-ap command can be used to change an individual geom's appearance. Appearances can also be specified in OOGL files; for details, see Appearances. See (merge-baseap ...). See (merge-ap ...). geomview-1.9.4/doc/geomview.html/OFF.html0000644000175000001440000001454610663301507015131 00000000000000 OFF - Geomview Manual

Next: , Previous: BBP and BEZ, Up: Object File Formats


4.2.5 OFF Files

The conventional suffix for OFF files is .off.

Syntax:

     [ST][C][N][4][n]OFF	# Header keyword
     [Ndim]		# Space dimension of vertices, present only if nOFF
     NVertices  NFaces  NEdges   # NEdges not used or checked
     
     x[0]  y[0]  z[0]	# Vertices, possibly with normals,
     			# colors, and/or texture coordinates, in that order,
     			# if the prefixes N, C, ST
     			# are present.
     			# If 4OFF, each vertex has 4 components,
     			# including a final homogeneous component.
     			# If nOFF, each vertex has Ndim components.
     			# If 4nOFF, each vertex has Ndim+1 components.
     ...
     x[NVertices-1]  y[NVertices-1]  z[NVertices-1]
     
         			# Faces
         			# Nv = # vertices on this face
         			# v[0] ... v[Nv-1]: vertex indices
         			#		in range 0..NVertices-1
     Nv  v[0] v[1] ... v[Nv-1]  colorspec
     ...
         			# colorspec continues past v[Nv-1]
         			# to end-of-line; may be 0 to 4 numbers
         			# nothing: default
         			# integer: colormap index
         			# 3 or 4 integers: RGB[A] values 0..255
     			# 3 or 4 floats: RGB[A] values 0..1

OFF files (name for "object file format") represent collections of planar polygons with possibly shared vertices, a convenient way to describe polyhedra. The polygons may be concave but there's no provision for polygons containing holes.

An OFF file may begin with the keyword OFF; it's recommended but optional, as many existing files lack this keyword.

Three ASCII integers follow: NVertices, NFaces, and NEdges. Thease are the number of vertices, faces, and edges, respectively. Current software does not use nor check NEdges; it needn't be correct but must be present.

The vertex coordinates follow: dimension * Nvertices floating-point values. They're implicitly numbered 0 through NVertices-1. dimension is either 3 (default) or 4 (specified by the key character 4 directly before OFF in the keyword).

Following these are the face descriptions, typically written with one line per face. Each has the form

     N  Vert1 Vert2 ... VertN  [color]

Here N is the number of vertices on this face, and Vert1 through VertN are indices into the list of vertices (in the range 0..NVertices-1).

The optional color may take several forms. Line breaks are significant here: the color description begins after VertN and ends with the end of the line (or the next # comment). A color may be:

nothing
the default color
one integer
index into "the" colormap; see below
three or four integers
RGB and possibly alpha values in the range 0..255
three or four floating-point numbers
RGB and possibly alpha values in the range 0..1

For the one-integer case, the colormap is currently read from the file cmap.fmap in Geomview's data directory. Some better mechanism for supplying a colormap is likely someday.

The meaning of "default color" varies. If no face of the object has a color, all inherit the environment's default material color. If some but not all faces have colors, the default is gray (R,G,B,A=.666).

A [ST][C][N][n]OFF BINARY format is accepted; See Binary format. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions (and texture coordinates or vertex colors or normals if COFF/NOFF/CNOFF/STCNOFF/etc. format).

Exception: each face's vertex indices are followed by an integer indicating how many color components accompany it. Face color components must be floats, not integer values. Thus a colorless triangular face might be represented as

     int int int int int
     3   17   5   9   0

while the same face colored red might be

     int int int int int float float float float
      3  17   5   9   4   1.0   0.0   0.0   1.0
geomview-1.9.4/doc/geomview.html/look_002dtoward.html0000644000175000001440000000400610663301507017417 00000000000000 look-toward - Geomview Manual

Next: , Previous: look-recenter, Up: GCL Reference


7.2.68 look-toward

(look-toward [objectID] [cameraID] [origin | center])
Rotates the named camera to point toward the origin of the object's coordinate system, or the center of the object's bounding box (in non-Euclidean space, the origin will be used automatically). Default objectID is the world, default camera is targetcam, default location to point towards is the center of the bounding box.
geomview-1.9.4/doc/geomview.html/ND_002dxform_002dget.html0000644000175000001440000000403210663301507020033 00000000000000 ND-xform-get - Geomview Manual

Next: , Previous: ND-xform, Up: GCL Reference


7.2.78 ND-xform-get

(ND-xform-get ID [from-ID])
Returns the N-D transform of the given object in the coordinate system of from-ID (default universe), in the sense <point-in-ID-coords> * Transform = <point-in-from-ID-coords>. Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.
geomview-1.9.4/doc/geomview.html/Non_002dgeometric-objects.html0000644000175000001440000000464210663301507021320 00000000000000 Non-geometric objects - Geomview Manual

4.3 Non-geometric objects

The syntax of these objects is given in the form used in See References, where "quoted" items should appear literally but without quotes, square bracketed ([ ]) items are optional, and | separates alternative choices.

geomview-1.9.4/doc/geomview.html/Appearance.html0000644000175000001440000000654110663301507016552 00000000000000 Appearance - Geomview Manual

Next: , Previous: Mouse Motions, Up: Interaction


3.6 Changing the Way Things Look

Geomview uses a hierarchy of appearances to control the way things look. An appearance is a specification of information about how something should be drawn. This can include many things such things as color, lighting, material properties, and more. Appearances work in a hierarchal manner: if a certain appearance property, for example face color, is not specified in a particular object's appearance, that object is drawn using that property from the parent appearance. If both the parent and the child appearance specify a property, the child's setting takes precedence unless the parent appearance is set to override.

Every geom in Geomview has an appearance associated with it. There is also an appearance associated with the "World" geom, which serves as the parent of each individual geom's appearance. Finally, there is a global "base" appearance, which is the parent of the World appearance.

The base appearance specifies reasonable values for all appearance information, and by default none of the other appearances specify anything, which means they inherit their values from the base appearance. This means that by default all objects are drawn using the base appearance.

If you change a certain appearance property for a geom, that property is used in drawing that geom. The parent appearance is used for any properties that you do not explicitly set.

Geomview has three panels which let you modify appearances.

geomview-1.9.4/doc/geomview.html/Support.html0000644000175000001440000000521210663301507016161 00000000000000 Support - Geomview Manual

Next: , Previous: Installation, Up: Top


Getting Technical Support for Geomview

There are several ways to get support for Geomview.

  1. Visit the Geomview web site, http://www.geomview.org. It contains the latest documentation, news about development, and FAQ (Frequently Asked Questions) list.
  2. Send email to the geomview-users@lists.sourceforge.net mailing list. This is a mailing list for discussing any issues related to using Geomview. To join the list, send an empty note with 'subscribe' in the subject line to geomview-users-request@lists.sourceforge.net, or visit the list web page at http://lists.sourceforge.net/mailman/listinfo/geomview-users.
  3. Contract with Geometry Technologies for support. Geometry Technologies is a contract support and programming company that emerged from the Geometry Center, where Geomview was written. For more information visit the Geometry Technologies web site at http://www.geomtech.com.
geomview-1.9.4/doc/geomview.html/look_002dencompass.html0000644000175000001440000000414410663301507020112 00000000000000 look-encompass - Geomview Manual

Next: , Previous: look, Up: GCL Reference


7.2.65 look-encompass

(look-encompass [objectID] [cameraID])
Moves cameraID backwards or forwards until its field of view surrounds objectID. This routine works only in Euclidean space. If objectID is not specified, it is assumed to be the world. If cameraID is not specified, it is assumed to be the targetcam. See (look-encompass-size ...).
geomview-1.9.4/doc/geomview.html/Vertices.html0000644000175000001440000000654710663301507016305 00000000000000 Vertices - Geomview Manual

Next: , Previous: File names, Up: Conventions


4.1.3 Vertices

Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word.

All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on).

The syntax is

`x y z'
(3-D floating-point vertex coordinates) or
`x y z w'
(4-D floating-point vertex coordinates)

optionally followed by

`nx ny nz'
(normalized 3-D surface-normal if present)

optionally followed by

`r g b a'
(4-component floating-point color if present, each component in range 0..1. The a (alpha) component represents opacity: 0 transparent, 1 opaque.)

optionally followed by

`s t'
`or'
`s t u'

(two or three texture-coordinate values).

Values are separated by white space, and line breaks are immaterial.

Letters in the object's header key word must appear in a specific order; that's the reverse of the order in which the data is given for each vertex. So a `CN4OFF' object's vertices contain first the 4-component space position, then the 3-component normal, finally the 4-component color. You can't change the data order by changing the header key word; an `NCOFF' is just not recognized. geomview-1.9.4/doc/geomview.html/rehash_002demodule_002dpath.html0000644000175000001440000000440410663301507021463 00000000000000 rehash-emodule-path - Geomview Manual

Next: , Previous: regtable, Up: GCL Reference


7.2.104 rehash-emodule-path

(rehash-emodule-path)
Rebuilds the application (external module) browser by reading all .geomview-* files in all directories on the emodule-path. Primarily intended for internal use; any applications defined by (emodule-define ...) commands outside of the .geomview-* files on the emodule-path will be lost. Does not sort the entries in the brower. See (emodule-sort). See (emodule-define ...).
geomview-1.9.4/doc/geomview.html/Chunks.html0000644000175000001440000000667110663301507015752 00000000000000 Chunks - Geomview Manual

9.4.2 Transporting Mathematica Files to Geomview by Hand

The auxilliary function WriteChunk is for those who can only use Mathematica on a computer that Geomview isn't installed on. WriteChunk[file, graphics] generates a file named file which contains the graphics object graphics in the format accepted by math2oogl.

You can transfer that file to a computer that has Geomview installed on it and then use the programs math2oogl, oogl2rib, and geomview directly from the shell. These programs are distributed in the bin/<CPU> subdirectory of the Geomview directory, and may have been installed so that they are on your path.

     In[1]:= <<OOGL.m
     
     In[2]:= Plot3D[ Sin[x + Sin[y]], {x,-2,2}, {y,-2,2} ]
     
     Out[2]= -SurfaceGraphics-
     
     In[3]:= WriteChunk["mychunk",%2]

This writes the file mychunk which contains a description of the graphics object. You can then transfer this file to a system with Geomview and type

     math2oogl < mychunk > mma.oogl

to convert it to the OOGL file mma.oogl which you can then view using Geomview. This is the equivalent of the WriteOOGL command.

For a result equivalent to the Geomview or Show commands, type

     math2oogl -togeomview Mathematica geomview < mychunk

The WriteRIb command can be emulated from the shell as

     math2oogl < mychunk | oogl2rib -n mma.tiff

geomview-1.9.4/doc/geomview.html/Commands.html0000644000175000001440000000742010663301507016251 00000000000000 Commands - Geomview Manual

Next: , Previous: Saving, Up: Interaction


3.9 The Commands Panel

The Commands panel lets you type in a GCL command. When you hit <Enter>, Geomview interprets the command and prints any resulting output or error messages on standard output. You can edit the text and hit <Enter> as many times as you like, in general, whenever you hit <Enter> with the cursor in the Commands panel, Geomview tries to interpret whatever text you have typed in the text field as a command.

figs/command.png

Figure 3.10: The Commands Panel.

[Move this.] Normalization is a kind of scaling; Geomview can scale an object so that it fits within a certain region. The main point of normalization is to allow you to easily view all of an object without having to worry about how big it is. We are gradually replacing Geomview's normalization feature with more robust camera positioning features. In general, the best way to make sure you are seeing all of an object is to use the Look At button on the Tools panel. Normalization may be completely replaced by this and other features in a future version of Geomview.

Normalization is a property that applies to each geom separately. The NORMALIZE GEOMETRY browser affects the normalization property of target geom. If the target geom is "World", it affects all geoms.

None
Do no normalization.
Individual
Normalize this geom to fit within a unit sphere.
Sequence
This resembles "Individual", except when an object is changing. Then, "Individual" tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while "Sequence" normalizes the union of all variants of the object and normalizes accordingly.
Keep
This leaves the current normalization transform unchanged when the object changes. It may be useful to apply "Individual" or "Sequence" normalization to the first version of a changing object to bring it in view, then switch to "Keep".
geomview-1.9.4/doc/geomview.html/camera_002dreset.html0000644000175000001440000000326110663301507017527 00000000000000 camera-reset - Geomview Manual

Next: , Previous: camera-prop, Up: GCL Reference


7.2.18 camera-reset

(camera-reset CAM-ID)
Reset CAM-ID to its default value.
geomview-1.9.4/doc/geomview.html/XForms.html0000644000175000001440000000427210663301507015730 00000000000000 XForms - Geomview Manual

Next: , Previous: Example2, Up: Modules


6.4 The XForms Library

XForms is a handy and relatively simple user interface toolkit for X11. Many Geomview external modules, including the examples in this manual, use XForms to create and manage control panels. XForms is available from http://www.nongnu.org/xforms/. XForms is free-ware. If you wish you may use any other interface toolkit instead of XForms in an external module. We chose FORMS because it is free and relatively simple.

There is a complete autoconf'ed package `gvemod-xforms-example' available from Geomview's Sourceforge.NET page. geomview-1.9.4/doc/geomview.html/ui_002demotion_002dprogram.html0000644000175000001440000000373710663301507021371 00000000000000 ui-emotion-program - Geomview Manual

Next: , Previous: ui-center-origin, Up: GCL Reference


7.2.131 ui-emotion-program

(ui-emotion-program PROGRAM)
This is an obsolete command. Use its new eqivalent emodule-define instead.
geomview-1.9.4/doc/geomview.html/figlookatworld.html0000644000175000001440000000011210663301507017526 00000000000000 geomview-1.9.4/doc/geomview.html/space.html0000644000175000001440000000326010663301507015601 00000000000000 space - Geomview Manual

Next: , Previous: soft-shader, Up: GCL Reference


7.2.122 space

(space {euclidean|hyperbolic|spherical})
Set the space associated with the world.
geomview-1.9.4/doc/geomview.html/LIST.html0000644000175000001440000000457210663301507015270 00000000000000 LIST - Geomview Manual

Next: , Previous: INST, Up: Object File Formats


4.2.10 LIST Files

The conventional suffix for a LIST file is .list.

A list of OOGL objects

Syntax:

     LIST
         oogl-object
         oogl-object
         ...

Note that there's no explicit separation between the oogl-objects, so they should be enclosed in curly braces ({ }) for sanity. Likewise there's no explicit marker for the end of the list; unless appearing alone in a disk file, the whole construct should also be wrapped in braces, as in:

        { LIST { QUAD ... } { < xyz.quad } }

A LIST with no elements, i.e. { LIST }, is valid, and is the easiest way to create an empty object. For example, to remove a symbol's definition you might write

        { define somesymbol  { LIST } }
geomview-1.9.4/doc/geomview.html/Tutorial.html0000644000175000001440000003030610663301507016312 00000000000000 Tutorial - Geomview Manual

Next: , Previous: Overview, Up: Top


2 Tutorial

This chapter leads you through some of the basics of using Geomview. Work through this chapter in front of a computer where you can try out the examples given here to get a feel for what you can do with Geomview.

To start Geomview, login to the computer and get a shell window. A shell window is a window in which you can type Unix commands; the prompt in the window usually ends with a '%'. In the shell window (the mouse cursor must be in the window) type the following (<Enter> here means hit the "Enter" key):

     geomview tetra dodec <Enter>

This command starts up Geomview and loads two example objects, a tetrahedron and a dodecahedron. After a few seconds three windows should appear; see Figure.

figs/initial.png

Figure 2.1: Initial Geomview display.

The panel on the left is Geomview's main control panel; it's called the Main panel. The skinny panel in the middle is the Tools panel and is for selecting different kinds of motions. The window on the right is the camera window and in it you see a large tetrahedron and a dodecahedron which is partially obscured by the tetrahedron.

Geomview has lots of panels but by default it displays only these three. We'll describe some aspects of these and a couple of the others in this tutorial. You can read more about these and other panels in the later chapters of this manual.

Put the mouse cursor in the camera window and press down and hold the left mouse button. Now, while holding down the button, slowly move the mouse around. You should see the picture rotate in the direction you move the mouse. If you lift up on the mouse button while moving the mouse, the picture continues rotating. To stop it, hold the mouse very still and click down and up on the left mouse button.

Geomview uses the glass sphere model for mouse-based motion. This means you are supposed to think of the object as being inside an invisible sphere and the mouse cursor is a gripper outside the sphere. When you hold down the left mouse button, the gripper grabs the sphere; when you let go of the button, the gripper releases the sphere. Moving the mouse while holding the button down causes the sphere (and hence the object) to move in the same direction as the mouse.

In addition to the two solids you should also see two wire-frame boxes in the camera window. These are the "bounding boxes" of the two objects. By default Geomview puts a bounding box around each object that it displays so that you have an idea of how large it is.

Notice that as you move the mouse around the tetrahedron and dodecahedron move as a unit. That is because by default what you are actually moving is the "World". To move an individual object instead of the whole world, move the mouse cursor to the Targets browser in the Main panel. Click (any button) on the word tetra. This makes the tetrahedron be the "target object". Now move the cursor back to the camera window and you can rotate just the tetrahedron.

The motion that you have been applying up to now has been rotation, because that is the motion mode that is selected in the Tools panel. To translate instead, click on the Translate button. Now when you move the mouse in the camera window while holding down the left button, the tetrahedron (which should still be the target object from before) will translate in the direction you move the mouse. Notice that you can translate it beyond the edge of the window as long as you keep holding the left mouse button down. If you lift up on the mouse button while moving the mouse, the tetrahedron will keep going. It moves rather rapidly so it is very easy to lose track of where it is.

If you accidentally lose the tetrahedron by translating it too far out of the view of the window, you can get it back by clicking on the Center button in the Tools panel. This causes it to come back to its initial position.

Click on the Center button to bring the tetrahedron home, and then translate it off to one side so that you can completely see the dodecahedron.

Your world now has two objects in it that are beside each other. You should see the dodecahedron in the middle of the window and maybe part of the tetrahedron off to one side. Go back to the Targets browser in the Main panel and click on "World" to select the whole world again. Now click on the Look At button in the Tools panel. You should see the dodecahedron and the tetrahedron in the middle of the window next to each other (see Figure). The Look At button positions the camera in such a way that the target object is centered in the window.

figs/fig2.png

Figure 2.2: Looking at the world.

Now put the cursor over the middle of the dodecahedron and double-click the right mouse button. This means click it down-and-up two times in rapid succession. Notice that the dodecahedron becomes the target object; you can see this in the Targets browser in the Main panel. Double-clicking the right mouse button on an object is another way to make it the target object.
figs/ap.png

Figure 2.3: The Appearance Panel.

Go to the Inspect menu at the top of the Main panel and select Appearance. This brings up the Appearance panel. When it appears, if it partially obscures another Geomview window you can move it off to one side by dragging its frame with the middle mouse button down.

The Appearance panel lets you control various things about the way Geomview draws objects. Note the buttons labeled [af] Faces and [ae] Edges. Click on the [ae] Edges one, and notice that Geomview is now drawing the edges of the dodecahedron. Click on it again and the edges go away. Click several times and watch the edges come and go. When you've had enough of this, leave the edges on and click the [af] Faces button. This toggles the faces on and off. Click the button again to turn them back on.

Now click on the [Cf] Faces button under the word COLOR. A color chooser panel should appear (see Figure).

figs/color.png

Figure 2.4: Color Chooser Panel.

Note the three sliders, H, S, and V, controlling the color's hue, saturation, and value (lightness). Clicking the HSV button gives a different set of sliders, one each for red, green, and blue. Numerical values for both RGB and HSV color systems can be seen or edited at the bottom of the panel. The dodecahedron's previous colors were specified in the file dodec that you loaded when we started Geomview. The color that you specify with the color panel overrides the old colors. You can adjust the intensity of the color with the Intensity slider. When you find a color that you like, click the Done button.

Now put the cursor somewhere over the gray background and double-click the right mouse button; this picks "World" as the target object. Click the Look At button to look at the world again.

Notice that in the Appearance panel the settings of the buttons have changed from the way you left them with the dodecahedron. That's because the Appearance panel always displays the settings for the target object, which is now the world, which still has its default settings.

Click on the [ab] BBox button under the word Draw. The bounding boxes go away. Now put the cursor back in the camera window. At the keyboard, type the keys a b. Notice that the bounding boxes come back. a b is the keyboard shortcut for the bounding box toggle button; the string "[ab]" appears on the button to indicate this. Most of Geomview's buttons have keyboard shortcuts that you can use instead if you want. This is useful once you are familiar with Geomview and don't want to have to move around among lots of panels.

Now select the tetrahedron, either by double-clicking the right mouse button on it, or by selecting "tetra" in the Targets browser. Then click on the Delete button in the Main panel. The tetrahedron should disappear. This is how you get rid of an object.

You can also load objects from within Geomview. Click on the File menu in the Main panel and choose Open. The Files panel will appear. Below the middle of this panel is a browser with three lines in it; the second line is a directory with lots of Geomview example files in it. Click on that second line; see Figure. Scroll down in the list of files until you see tref.off. Click on that line, and then click on the OK button. A large trefoil-shaped tube will appear in your window. Click the Hide button in the Files panel to dismiss the panel.

figs/secondlinelist.png

Figure 2.5: The Files Panel.

Now click on the Reset button in the Tools panel. This causes everything to return to its home position. You should see a dodecahedron and a trefoil knot (see Figure).

Play around with the trefoil knot and the dodecahedron. Experiment with some of the other buttons in the Tools panel. Try coloring the trefoil knot with the Appearance panel.

For a tutorial on how to create your own objects to load into Geomview, see file doc/oogltour distributed with Geomview. The things in that file will be incorporated into a future version of this manual.

figs/trefdodecinter.png

Figure 2.6: Trefoil and Dodecahedron.

geomview-1.9.4/doc/geomview.html/sgi.html0000644000175000001440000000321610663301507015271 00000000000000 sgi - Geomview Manual

Next: , Previous: setenv, Up: GCL Reference


7.2.116 sgi

(sgi)
Returns t if running on an sgi machine, nil if not. A relict from the old work-station years.
geomview-1.9.4/doc/geomview.html/Interface.html0000644000175000001440000000641610663301507016414 00000000000000 Interface - Geomview Manual

Next: , Previous: Modules, Up: Modules


6.1 How External Modules Interface with Geomview

External modules appear in the Modules browser in Geomview's Main panel. To run a module, click the left mouse button on the module's entry in the browser. While the module is running, an additional line for that module will appear in red in the browser. This line begins with a number in brackets, which indicates the instace number of the module. (For some modules it makes sense to have more than one instance of the module running at the same time.) You can kill an external module by clicking on its red instance entry.

By default when Geomview starts, it displays all the modules that have been installed on your system.

For instructions on installing a module on your system so that it will appear in the Modules browser every time Geomview is run by anyone on your system, See Module Installation.

When Geomview invokes an external module, it creates pipes connected to the module's standard input and output. (Pipes are like files except they are used for communication between programs rather than for storing things on a disk.) Geomview interprets anything that the module writes to its standard output as a GCL command. Likewise, if the external module requests any data from Geomview, Geomview writes that data to the module's standard input. Thus all a module has to do in order to communicate with Geomview is write commands to standard output and (optionally) receive data on standard input. Note that this means that the module cannot use standard input and output for communicating with the user. If a module needs to communicate with the user it can do so either through a control panel of its own or else by responding to certain events that it finds out about from Geomview. geomview-1.9.4/doc/geomview.html/clock.html0000644000175000001440000000341010663301507015576 00000000000000 clock - Geomview Manual

Next: , Previous: cdr, Up: GCL Reference


7.2.21 clock

(clock)
Returns the current time, in seconds, as shown by this stream's clock. See (set-clock ...). See (sleep-until ...).
geomview-1.9.4/doc/geomview.html/COMMENT.html0000644000175000001440000000607510663301507015617 00000000000000 COMMENT - Geomview Manual

Previous: DISCGRP, Up: Object File Formats


4.2.14 COMMENT Objects

The COMMENT object is a mechanism for encoding arbitrary data within an OOGL object. It can be used to keep track of data or pass data back and forth between external modules.

Syntax:

     COMMENT                 # key word
     
     name type   # individual name and type specifier
     { ... }             # arbitrary data

The data, which must be enclosed by curly braces, can include anything except unbalanced curly braces. The type field can be used to identify data of interest to a particular program through naming conventions.

COMMENT objects are intended to be associated with other objects through inclusion in a LIST object. (See LIST.) The "#" OOGL comment syntax does not suffice for data exchange since these comments are stripped when an OOGL object is read in to Geomview. The COMMENT object is preserved when loaded into Geomview and is written out intact.

Here is an example associating a WorldWide Web URL with a piece of geometry:

     { LIST
      { < Tetrahedron}
      {COMMENT GCHomepage HREF { http://www.geomview.org/ }}
     }

A binary COMMENT format is accepted. Its format is not consistent with the other OOGL binary formats. See Binary format. The name and type are followed by

     N Byte1 Byte2 ... ByteN

instead of data enclosed in curly braces. geomview-1.9.4/doc/geomview.html/rib_002dsnapshot.html0000644000175000001440000000361010663301507017566 00000000000000 rib-snapshot - Geomview Manual

Next: , Previous: rib-display, Up: GCL Reference


7.2.107 rib-snapshot

(rib-snapshot CAM-ID [filename])
Write Renderman snapshot (in RIB format) of CAM-ID to <filename>. If no filename specified, see (rib-display ... for an explanation of the filename used.
geomview-1.9.4/doc/geomview.html/OOGL-File-Formats.html0000644000175000001440000000455410663301507017543 00000000000000 OOGL File Formats - Geomview Manual

Next: , Previous: Interaction, Up: Top


4 OOGL File Formats

The objects that you can load into Geomview are called OOGL objects. OOGL stands for “Object Oriented Graphics Library”; it is the library upon which Geomview is built.

There are many different kinds of OOGL objects. This chapter gives syntactic descriptions of file formats for OOGL objects.

Examples of most file types live in Geomview's data/geom directory.

geomview-1.9.4/doc/geomview.html/Remote-Display.html0000644000175000001440000000436010663301507017346 00000000000000 Remote Display - Geomview Manual

Next: , Previous: RenderMan, Up: Mathematica


9.4 Using Geomview and Mathematica on Different Computers

It is possible to use Geomview to display graphics generated by Mathematica running on a different computer. If you want to use Mathematica on a computer that is not networked with your Geomview computer, you can write out chunk files in Mathematica which you transfer to the Geomview computer and then translate to OOGL format for displaying in Geomview.

geomview-1.9.4/doc/geomview.html/new_002dalien.html0000644000175000001440000000440210663301507017034 00000000000000 new-alien - Geomview Manual

Next: , Previous: ND-xform-set, Up: GCL Reference


7.2.80 new-alien

(new-alien name [GEOMETRY])
Create a new alien (geom not in the world) with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new alien is given an empty geometry. If an object with that name already exists, the new alien is given a unique name. The light beams that are used to move around the lights are an example of aliens. They're drawn but are not controllable the way ordinary objects are: they don't appear in the object browser and the user can't move them with the normal motion modes.
geomview-1.9.4/doc/geomview.html/MESH.html0000644000175000001440000001146310663301507015246 00000000000000 MESH - Geomview Manual

Next: , Previous: QUAD, Up: Object File Formats


4.2.2 MESH: rectangularly-connected mesh

The conventional suffix for a MESH file is .mesh.

The file syntax is

     [U][C][N][Z][4][u][v][n]MESH # Key word
     [Ndim]                 # Space dimension, present only if nMESH
     Nu Nv            # Mesh grid dimensions
                                  # Nu*Nv vertices, in format specified
                                  # by initial key word
     vertex(u=0,v=0)  vertex(1,0)  ... vertex(Nu-1,0)
     vertex(0,1) ...    vertex(Nu-1,1)
     ...
     vertex(0,Nv-1) ... vertex(Nu-1,Nv-1)

The key word is [U][C][N][Z][4][u][v][n]MESH. The optional prefix characters mean:

`U'
Each vertex includes a 3-component texture space parameter. The first two components are the usual S and T texture parameters for that vertex; the third should be specified as zero.
`C'
Each vertex (see Vertices above) includes a 4-component color.
`N'
Each vertex includes a surface normal vector.
`Z'
Of the 3 vertex position values, only the Z component is present; X and Y are omitted, and assumed to equal the mesh (u,v) coordinate so X ranges from 0 .. (Nu-1), Y from 0 .. (Nv-1) where Nu and Nv are the mesh dimensions – see below.
`4'
Vertices are 4D, each consists of 4 floating values. Z and 4 cannot both be present.
`u'
The mesh is wrapped in the u-direction, so the (0,v)'th vertex is connected to the (Nu-1,v)'th for all v.
`v'
The mesh is wrapped in the v-direction, so the (u,0)'th vertex is connected to the (u,Nv-1)'th for all u. Thus a u-wrapped or v-wrapped mesh is topologically a cylinder, while a uv-wrapped mesh is a torus.
`n'
Specifies a mesh whose vertices live in a higher dimensional space. The dimension follows the "MESH" keyword. Each vertex then has Ndim components.

Note that the order of prefix characters is significant; a colored, u-wrapped mesh is a CuMESH not a uCMESH.

Following the mesh header are integers Nu and Nv, the dimensions of the mesh.

Then follow Nu*Nv vertices, each in the form given by the header. They appear in v-major order, i.e. if we name each vertex by (u,v) then the vertices appear in the order

     (0,0) (1,0) (2,0) (3,0) ...  (Nu-1,0)
     (0,1) (1,1) (2,1) (3,1) ...  (Nu-1,1)
     ...
     (0,Nv-1)		...  (Nu-1,Nv-1)

A MESH BINARY format is accepted; See Binary format. The values of Nu and Nv are 32-bit integers; all other values are 32-bit floats. geomview-1.9.4/doc/geomview.html/Customization.html0000644000175000001440000001025310663301507017356 00000000000000 Customization - Geomview Manual

Next: , Previous: OOGL File Formats, Up: Top


5 Customization: .geomview files

When Geomview is started, it loads and executes commands in a system-wide startup file named .geomview. This file is in the data subdirectory of the Geomview distribution directory and contains GCL commands to configure Geomview in a way common to all users on the system.

Next, Geomview looks for the file ~/.geomview (~ stands for your home directory). You can use this to configure your own default Geomview behavior to suit your tastes.

After reading ~/.geomview, Geomview looks for a file named .geomview in the current directory. If such a file exists Geomview reads it, unless it is the same as ~/.geomview (which would be the case if you are running Geomview from your home directory). You can use the current directory's .geomview to create a Geomview customization specific to a certain project.

You can use .geomview files to control all kinds of things about Geomview. They can contain any valid GCL statements. Especially useful is the ui-panel command which controls the initial placement of Geomview's panels. For an example see the system-wide .geomview file mentioned above. See GCL. See (ui-panel ...).

It is a good idea to enclose all the commands you put in a .geomview file in a progn statement in order to cause Geomview to execute them all at once. Otherwise Geomview might execute them sequentially over the first few refresh cycles after starting up.

To change, e.g. the focus policy of the camera window such that they pick up the focus policy of the window manager (instead of being activated when the mouse cursor crosses the window), you could put the following in your ~/.geomview file:

     (progn
       (ui-cam-focus focus-change)
       ... # other stuff
     )

You can put any valid GCL command into your .geomview files,see GCL. See (progn ...). See (ui-cam-focus ...). geomview-1.9.4/doc/geomview.html/help.html0000644000175000001440000000472310663301507015443 00000000000000 help - Geomview Manual

Next: , Previous: gt, Up: GCL Reference


7.2.5 ?

(? [command])
Gives one-line usage summary for command. Command may include *s as wildcards; see also (?? ...). One-line command help; lists names only if multiple commands match. ? is a synonym for (help ...)

Next: , Previous: hdelete, Up: GCL Reference


7.2.54 help

(help [command])
Command may include *s as wildcards; see also (?? ...) One-line command help; lists names only if multiple commands match.
geomview-1.9.4/doc/geomview.html/cdr.html0000644000175000001440000000311010663301507015250 00000000000000 cdr - Geomview Manual

Next: , Previous: car, Up: GCL Reference


7.2.20 cdr

(cdr LIST)
returns the list obtained by removing the first element of LIST.
geomview-1.9.4/doc/geomview.html/Package-Details.html0000644000175000001440000000622210663301507017425 00000000000000 Package Details - Geomview Manual

9.5 Details of the Mathematica->Geomview Package

The OOGL.m package uses the external program math2oogl to convert Graphics3D objects to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica.

The converter will sometimes handle colored SurfaceGraphics objects correctly that Mathematica does not handle correctly, which means that Geomview[object] sometimes works where Show[object] will give errors.

The converter supports the Polygon, Line, and Point graphics primitives, RGBColor Graphics3D directives, and SurfaceGraphics objects with or without RGBColor directives, and lists of any combination of these. It silently ignores all other directives.

The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib).

In the WriteOOGL and WriteRIB commands, filename can either be a string containing a filename, an OutputStream object, or a string starting with a ! to send the output to a command. Object can be a Graphics3D object, a SurfaceGraphics object, or a list of these.

The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host. geomview-1.9.4/doc/geomview.html/look_002dencompass_002dsize.html0000644000175000001440000000434210663301507021532 00000000000000 look-encompass-size - Geomview Manual

Next: , Previous: look-encompass, Up: GCL Reference


7.2.66 look-encompass-size

(look-encompass-size [view-fraction clip-ratio near-margin far-margin])
Sets/returns parameters used by (look-encompass). view-fraction is the portion of the camera window filled by the object, clip-ratio is the max allowed ratio of near-to-far clipping planes. The near clipping plane is 1/near-margin times closer than the near edge of the object, and the far clipping plane is far-margin times further away. Returns the list of current values. Defaults: .75 100 0.1 4.0
geomview-1.9.4/doc/geomview.html/figap.html0000644000175000001440000000011110663301507015564 00000000000000 geomview-1.9.4/doc/geomview.html/read.html0000644000175000001440000000442010663301507015420 00000000000000 read - Geomview Manual

Next: , Previous: rawpick, Up: GCL Reference


7.2.100 read

(read {geometry|camera|appearance|image|ntransform|transform|command} {GEOMETRY or CAMERA or ...})
Read and interpret the text in ... as containing the given type of data. Useful for defining objects using OOGL reference syntax, e.g.
          (geometry  thing { INST  transform : T    geom : fred })
          (read  geometry  { define fred
             QUAD
             1 0 0  0 1 0  0 0 1  1 0 0
          })
          (read  transform { define T <myfile})
     

See References. See (hdefine ...). See (hdelete ...).

geomview-1.9.4/doc/geomview.html/Texture-Mapping.html0000644000175000001440000001667710663301507017557 00000000000000 Texture Mapping - Geomview Manual

Previous: Appearances, Up: Conventions


4.1.11 Texture Mapping

Some rendering back-ends support texture-mapped objects, actually only the OpenGL and the RenderMan interface at the time of this writing. There are also some issues with the RMan interface when using an alpha-channel in the texture image. Those rendering back-ends which don't support texturing silently ignore attempts to use texture mapping. A texture is specified as part of an appearance structure (see Appearances). Briefly, one provides a texture image (see Image objects), which is considered to lie in a square in (s,t) parameter space in the range 0 <= s <= 1, 0 <= t <= 1. Then one provides a geometric primitive, with each vertex tagged with (s,t) texture coordinates. If texturing is enabled, the appropriate portion of the texture image is pasted onto each face of the textured object.

There is (currently) no provision for inheritance of part of a texture structure; if the texture keyword is mentioned in an appearance, it supplants any other texture specification.

The appearance attribute texturing controls whether textures are used; there's no performance penalty for having texture { ... } fields defined when texturing is off.

The available fields are:

     clamp   none  -or-  s  -or-  t  -or-  st
       Determines the meaning of texture coordinates outside the range 0..1.
       With clamp none, the default, coordinates are interpreted
       modulo 1, so (s,t) = (1.25,0), (.25,0), and (-.75,0) all refer to
       the same point in texture space.  With s or t or
       st, either or both of s- or t-coordinates less than 0 or
       greater than 1 are clamped to 1 or 0, respectively.
     
     image { <image specification> (see Image objects) }
       Specify the actual texture image. Images can have 1, 2, 3 or 4 channels:
         1 channel:  luminance
         2 channels: luminance and alpha
         3 channels: RGB data
         4 channels: RGBA data
     
       See Image objects, for the actual definition of image
       objects. The alpha-channel is only interpreted as mask: where the mask
       is zero, pixels are simply not drawn. An exception is the case where
       apply is equal to modulate and translucency is enabled:
       in this case the resulting alpha value is the result of the
       multiplication of the surface color with the alpha value of the
       texture's alpha channel.
     
     file      filename
     alphafile filename
       This is considered obsolete, and only kept for compatibility,
       the modern way is to use the new OOGL image object. See Image objects.
       The stuff documented here should still work, though
     
       Specifies image file(s) containing the texture.
     
       The file keyword specifies a file with color or lightness information;
       alphafile if present, specifies a transparency ("alpha") mask;
       where the mask is zero, pixels are simply not drawn.
       Several image file formats are available; the file type must be
       indicated by the last few characters of the file name:
         .ppm or .ppm.Z or .ppm.gz  24-bit 3-color image in PPM format
         .pgm or .pgm.Z or .pgm.gz  8-bit grayscale image in PGM format
         .sgi or .sgi.Z or .sgi.gz  8-bit, 24-bit, or 32-bit SGI image
         .tiff                      8-bit or 24-bit TIFF image
         .gif                       GIF image
       For this feature to work, some programs must be available in
       geomview's search path:
         zcat  for .Z files
         gzip  for .gz files
         tifftopnm for .tiff files
         giftoppm for .gif files
     
       If an alphafile image is supplied, it must be the same size
       as the file image.
     
       Image objects provide a more flexible way to specify texture
       data. See Image objects.
     
     apply   modulate  -or-  blend  -or-  decal
       Indicates how the texture image is applied to the surface.
       Here the "surface color" means the color that surface would have
       in the absence of texture mapping.
     
       With modulate, the default, the texture color (or lightness,
       if textured by a gray-scale image) is multiplied by the surface color.
     
       With blend, texture blends between the background color
       and the surface color.  The file parameter must specify a
       gray-scale image.  Where the texture image is 0, the surface color is
       unaffected; where it's 1, the surface is painted in the color given
       by background; and color is interpolated for intermediate values.
     
       With decal, the file parameter must specify a
       3-color image.  If an alphafile parameter is present,
       its value interpolates between the surface color (where alpha=0)
       and the texture color (where alpha=1).  Lighting does not affect the
       texture color in decal mode; effectively the texture is
       constant-shaded.
     
     background  R G B A
       Specifies a 4-component color, with R, G, B, and A floating-point
       numbers normally in the range 0..1, used when apply blend
       is selected.
     
     transform transformation-matrix
       Expects a list of 16 numbers, or one of the other ways of representing
       a transformation (: handlename or < filename).
       The 4x4 transformation matrix is applied to texture coordinates,
       in the sense of a 4-component row vector (s,t,0,1) multiplied on
       the left of the matrix, to produce new coordinates (s',t')
       which actually index the texture.
geomview-1.9.4/doc/geomview.html/Transformation-matrices.html0000644000175000001440000000467410663301507021333 00000000000000 Transformation matrices - Geomview Manual

4.1.6 Transformation matrices

Some objects incorporate 4x4 real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is a 4-element row vector representing homogeneous coordinates of a point in the OOGL object, and A is the 4x4 matrix, then the transformed point is p' = p A. This matrix convention is common in computer graphics; it's the transpose of that often used in mathematics, where points are column vectors multiplied on the right of matrices.

Thus for Euclidean transformations, the translation components appear in the fourth row (last four elements) of A. A's last column (4th, 8th, 12th and 16th elements) are typically 0, 0, 0, and 1 respectively. geomview-1.9.4/doc/geomview.html/ND_002dcolor.html0000644000175000001440000000547210663301507016602 00000000000000 ND-color - Geomview Manual

Next: , Previous: ND-axes, Up: GCL Reference


7.2.76 ND-color

(ND-color CAMID
[ (( [ID] (x1 x2 ... xN) v r g b a v r g b a ... ) ((x1 ... xN) v r g b a v r g b a ...) ...)] ) Specifies a function, applied to each N-D vertex, which determines the colors of N-dimensional objects as shown in camera CAMID. Each coloring function is defined by a vector (in ID's coordinate system) [x1 ... xN] and by a sequence of value (v)/color(r g b a) tuples, ordered by increasing v. The inner product v = P.[x] is linearly interpolated in this table to give a color. If ID is omitted, the (xi) vector is assumed in universe coordinates. The ND-color command specifies a list of such functions; each vertex is colored by their sum (so e.g. green intensity could indicate projection along one axis while red indicated another. An empty list, as in (ND-color CAMID ()), suppresses coloring. With no second argument, (ND-color CAMID) returns that camera's color-function list. Even when coloring is enabled, objects tagged with the keepcolor appearance attribute are shown in their natural colors.
geomview-1.9.4/doc/geomview.html/VECT.html0000644000175000001440000001143510663301507015252 00000000000000 VECT - Geomview Manual

Next: , Previous: OFF, Up: Object File Formats


4.2.6 VECT Files

The conventional suffix for VECT files is .vect.

Syntax:

     [4]VECT
     NPolylines  NVertices  NColors
     
     Nv[0] ... Nv[NPolylines-1]     # number of vertices
                                                # in each polyline
     
     Nc[0] ... Nc[NPolylines-1]     # number of colors supplied
                                                # in each polyline
     
     Vert[0] ... Vert[NVertices-1]  # All the vertices
                                                # (3*NVertices floats)
     
     Color[0] ... Color[NColors-1]  # All the colors
                                                # (4*NColors floats, RGBA)

VECT objects represent lists of polylines (strings of connected line segments, possibly closed). A degenerate polyline can be used to represent a point.

A VECT file begins with the key word VECT or 4VECT and three integers: NLines, NVertices, and NColors. Here NLines is the number of polylines in the file, NVertices the total number of vertices, and NColors the number of colors as explained below.

Next come NLines 16-bit integers

Nv[0] Nv[1] Nv[2] ... Nv[NLines-1]

giving the number of vertices in each polyline. A negative number indicates a closed polyline; 1 denotes a single-pixel point. The sum (of absolute values) of the Nv[i] must equal NVertices.

Next come NLines more 16-bit integers Nc[i]: the number of colors in each polyline. Normally one of three values:

0
No color is specified for this polyline. It's drawn in the same color as the previous polyline.
1
A single color is specified. The entire polyline is drawn in that color.
abs(Nv[i])
Each vertex has a color. Either each segment is drawn in the corresponding color, or the colors are smoothly interpolated along the line segments, depending on the implementation.

Next come NVertices groups of 3 or 4 floating-point numbers: the coordinates of all the vertices. If the keyword is 4VECT then there are 4 values per vertex. The first abs(Nv[0]) of them form the first polyline, the next abs(Nv[1]) form the second and so on.

Finally NColors groups of 4 floating-point numbers give red, green, blue and alpha (opacity) values. The first Nc[0] of them apply to the first polyline, and so on.

A VECT BINARY format is accepted; see Binary format. The binary format exactly follows the ASCII format, with 32-bit Big-Endian integers where ordinary integer numbers appear, and with 16-bit Big-Endian integers where 16-bit integers appear; 32-bit Big-Endian floats where real values appear. BIG FAT NOTE: The vertex counts Nv[i] and the color counts Nc[i] are 16-bit Big-Endian integers. geomview-1.9.4/doc/geomview.html/set_002dclock.html0000644000175000001440000000373310663301507017047 00000000000000 set-clock - Geomview Manual

Next: , Previous: scene, Up: GCL Reference


7.2.110 set-clock

(set-clock TIME)
Adjusts the clock for this command stream to read TIME (in seconds) as of the moment the command is received. See (sleep-until ...). See (clock ...).
geomview-1.9.4/doc/geomview.html/INST-Examples.html0000644000175000001440000000467010663301507017045 00000000000000 INST Examples - Geomview Manual

Previous: INST, Up: INST


4.2.9.1 INST Examples

Here are some examples of INST files

     INST
          unit < xyz.vect
          transform {
             1 0 0 0
             0 1 0 0
             0 0 1 0
             1 3 0 1
          }
     { appearance { +edge  material { edgecolor 1 1 0 } }
         INST geom < mysurface.quad }
     {INST transform {: T} geom {<dodec.off}}
     { INST
          transforms
              { LIST
          	{ < some-matrices.prj }
          	{ < others.prj }
          	{ TLIST <still more of them> }
     
              }
          geom
              { # stuff replicated by all the above matrices
          	...
              }
     }

This one resembles the origin example in the section above, but makes the X and Y edges be 1/4 the size of the window (1/4, not 1/2, since the range of ndc X and Y coordinates is -1 to +1).

     { INST
       location ndc
       geom { < xyz.vect }
       transform { .5 0 0 0  0 .5 0 0  0 0 -.009 0   0 0 -.99 1 }
     }
geomview-1.9.4/doc/geomview.html/figloadpanel.html0000644000175000001440000000010710663301507017130 00000000000000 geomview-1.9.4/doc/geomview.html/figcolorchooserpanel.html0000644000175000001440000000013010663301507020706 00000000000000 geomview-1.9.4/doc/geomview.html/Conventions.html0000644000175000001440000000600610663301507017014 00000000000000 Conventions - Geomview Manual

4.1 Conventions

geomview-1.9.4/doc/geomview.html/uninterest.html0000644000175000001440000000344610663301507016714 00000000000000 uninterest - Geomview Manual

Next: , Previous: ui-target, Up: GCL Reference


7.2.139 uninterest

(uninterest (COMMAND [args]))
Undoes the effect of an interest command. (COMMAND [args]) must be identical to those used in the interest command.
geomview-1.9.4/doc/geomview.html/Point-of-Interest.html0000644000175000001440000001120710663301507017774 00000000000000 Point of Interest - Geomview Manual

Previous: Mouse Motions, Up: Mouse Motions


3.5.1 Selecting a Point of Interest

It is sometimes useful to specify a particular point on some object in a geomview window as the center point for mouse motions. You can do this by shift-clicking the right mouse button (i.e. click it once while holding down the shift key on the keyboard) with the cursor over the desired point. This point then becomes the point of interest. The point of interest must be on an existing object.

Selecting a point of interest simplifies examining a small portion of a larger object. Shift-right-click on an interesting point, and select Orbit mode. Use the middle mouse button to approach, and the left mouse to orbit the point, examining the region from different directions.

When you have selected a point of interest, the current center object changes to an object named "CENTER", which is an invisible object located at the point of interest. In addition, mouse motions for the window in which you made the selection are adjusted so that the point of interest follows the mouse.

You can change the point of interest at any time by selecting a new one by shift-clicking the right mouse button again. You can cancel the point of interest altogether by shift-clicking the right mouse button with the cursor on the background (i.e. not on any object). This changes the center object back to its default value, "target".

The object named "CENTER", which serves as the center object for the point of interest, is a special kind of geom called an "alien". It does not appear in the Targets browser. By default it has no geometry associated with it and hence is invisible. You can, however, explicitly give it some geometry using a GCL command, causing it to appear. Use the geometry command for this: (geometry CENTER geometry), where geometry is any valid geometry. For example, (geometry CENTER { < xyz.vect }) causes the file xyz.vect, which is one of the standard example files distributed with geomview, to be used at the geometry for CENTER. See (geometry ...).

What happens internally when you select a point of interest is that the center is set to the object called CENTER, and that object is positioned at the point of interest. In addition, in order for mouse motions to track the point of interest, the current camera's focal length is set to be the distance from the camera to the point of interest. You can accomplish this via GCL with the following commands:

     (if (real-id CENTER) nil (new-alien CENTER {}))
     (ui-center CENTER)
     (transform-set CENTER universe universe translate x y z)
     (merge camera cam-id { focus d })

where (x,y,z) are the (universe) coordinates of the point of interest, and d is the distance from that point to the current camera, cam-id. The first command above creates the "alien" CENTER if it does not yet exist. geomview-1.9.4/doc/geomview.html/load_002dpath.html0000644000175000001440000000355410663301507017035 00000000000000 load-path - Geomview Manual

Next: , Previous: load, Up: GCL Reference


7.2.63 load-path

(load-path)
Returns the current search path for command, geometry, etc. files. Note: to actually see the value returned by this function you should wrap it in a call to echo: (echo (load-path)). See (set-load-path ...).
geomview-1.9.4/doc/geomview.html/and.html0000644000175000001440000000332610663301507015253 00000000000000 and - Geomview Manual

Next: , Previous: all, Up: GCL Reference


7.2.9 and

(and EXPR1 EXPR2)
Evaluate EXPR1 and EXPR2 and return t if both return non-nil, otherwise return nil.
geomview-1.9.4/doc/geomview.html/transform.html0000644000175000001440000001542010663301507016522 00000000000000 transform - Geomview Manual

Next: , Previous: image, Up: Non-geometric objects


4.3.3 Transform Objects

Where a single 4x4 matrix is expected – as in the INST transform field, the camera's camtoworld transform and the Geomview xform* commands – use a transform object.

Note that a transform is distinct from a TLIST, which is a type of geometry. TLISTs can contain one or more 4x4 transformations; "transform" objects must have exactly one.

Why have both? In many places – e.g. camera positioning – it's only meaningful to have a single transform. Using a separate object type enforces this.

Syntax for a transform object is

     <transform> ::=
       [ "{" ]             (curly brace, generally needed to make
                            the end of the object unambiguous.)
     
        [ "transform" ]    (optional keyword; unnecessary if the type
                            is determined by the context, which it
                            usually is.)
        [ "define" <name> ]
                           (defines a transform named <name>, setting
                            its value from the stuff which follows)
     
           <sixteen floating-point numbers>
                           (interpreted as a 4x4 homogeneous transform
     		       given row by row, intended to apply to a
                            row vector multiplied on its LEFT, so that e.g.
                            Euclidean translations appear in the bottom row)
        |
           "<" <filename>  (meaning: read transform from that file)
        |
           ":" <name>      (meaning: use variable <name>,
                             defined elsewhere; if undefined the initial
                             value is the identity transform)
     
      [ "}" ]              (matching curly brace)

The whole should be enclosed in { braces }. Braces are not essential if exactly one of the above items is present, so e.g. a 4x4 array of floats standing alone may but needn't have braces.

Some examples, in contexts where they might be used:

     # Example 1: A GCL command to define a transform
     # called "fred"
     
     (read transform { transform  define fred
              1 0 0 0
              0 1 0 0
              0 0 1 0
             -3 0 1 1
         }
     )
     # Example 2:  A camera object using transform
     # "fred" for camera positioning
     # Given the definition above, this puts the camera at
     # (-3, 0, 1), looking toward -Z.
     
     { camera
             halfyfield 1
             aspect 1.33
             camtoworld { : fred }
     }

Next: , Previous: time-interests, Up: GCL Reference


7.2.125 transform

(transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [bbox-center|origin] [dt [smooth]])
Apply a motion (rotation, translation, scaling) to object objectID; that is, construct and concatenate a transformation matrix with objectID's transform The 3 IDs involved are the object that moves, the center of motion, and the frame of reference in which to apply the motion. The center is easiest understood for rotations: if centerID is the same as objectID then it will spin around its own axes; otherwise the moving object will orbit the center object. Normally frameID, in whose coordinate system the (mouse) motions are interpreted, is focus, the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the space command to change spaces. With type rotate x, y, and z are floats specifying angles in RADIANS. For types translate and translate-scaled x, y, and z are floats specifying distances in the coordinate system of the center object.

The next field is optional and may consist of the keyword bbox-center or the keyword origin and modifies the location of the origin of objectID's co-ordinate frame: bbox-center temporarily translates objectID's co-ordinate frame to the center of objectID's bounding box. origin is the default (and means not to modify objectID's co-ordinate frame) and bbox-center is only valid in Euclidean space.

The optional dt field allows a simple form of animation; if present, the object moves by just that amount during approximately dt seconds, then stops. If present and followed by the smooth keyword, the motion is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the motion is applied immediately.

geomview-1.9.4/doc/geomview.html/draw.html0000644000175000001440000000331210663301507015441 00000000000000 draw - Geomview Manual

Next: , Previous: dither, Up: GCL Reference


7.2.30 draw

(draw CAM-ID)
Draw the view in CAM-ID, if it needs redrawing. See (redraw ...).
geomview-1.9.4/doc/geomview.html/xform.html0000644000175000001440000000335010663301507015641 00000000000000 xform - Geomview Manual

Next: , Previous: write-sexpr, Up: GCL Reference


7.2.148 xform

(xform ID TRANSFORM)
Concatenate TRANSFORM with the current transform of the object (apply TRANSFORM to object ID).
geomview-1.9.4/doc/geomview.html/SKEL.html0000644000175000001440000001034610663301507015247 00000000000000 SKEL - Geomview Manual

Next: , Previous: VECT, Up: Object File Formats


4.2.7 SKEL Files

SKEL files represent collections of points and polylines, with shared vertices. The conventional suffix for SKEL files is .skel.

Syntax:

     [C][4][n]SKEL
     [NDim]                    # Vertex dimension, present only if nSKEL
     NVertices  NPolylines
     
     x[0]  y[0]  z[0]  # Vertices
     				    # if 4SKEL, each vertex has 4 components
     				    # if nSKEL, each vertex has NDim components
                                         # if C[4][n]SKEL vertex coordinates are
                                         # followed by an RGBA color specification
     ...
     x[NVertices-1]  y[NVertices-1]  z[NVertices-1]
     
                             # Polylines
                             # Nv = # vertices on this polyline (1 = point)
                             # v[0] ... v[Nv-1]: vertex indices                        #               in range 0..NVertices-1
     Nv  v[0] v[1] ... v[Nv-1]  [colorspec]
     ...
                             # colorspec continues past v[Nv-1]
                             # to end-of-line; may be nothing, or 3 or 4 numbers.
                             # nothing: default color
     			# 3 or 4 floats: RGB[A] values 0..1

The syntax resembles that of OFF files, with a table of vertices followed by a sequence of polyline descriptions, each referring to vertices by index in the table. Each polyline has an optional color.

For nSKEL objects, each vertex has NDim components. For 4nSKEL objects, each vertex has NDim+1 components; the final component is the homogeneous divisor.

A [4][n]SKEL BINARY format is accepted; See Binary format. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions.

Exception: each polyline's vertex indices are followed by an integer indicating how many color components accompany it. Polyline color components must be floats, not integer values. Thus a colorless polyline with 3 vertices might be represented as

     int int int int int
     3   17   5   9   0

while the same polyline colored red might be

     int int int int int float float float float
      3  17   5   9   4   1.0   0.0   0.0   1.0
geomview-1.9.4/doc/geomview.html/update.html0000644000175000001440000000342010663301507015766 00000000000000 update - Geomview Manual

Next: , Previous: uninterest, Up: GCL Reference


7.2.140 update

(update [timestep_in_seconds])
Apply each incremental motion once. Uses timestep if it's present and nonzero; otherwise motions are proportional to elapsed real time.
geomview-1.9.4/doc/geomview.html/xform_002dincr.html0000644000175000001440000000344510663301507017247 00000000000000 xform-incr - Geomview Manual

Next: , Previous: xform, Up: GCL Reference


7.2.149 xform-incr

(xform-incr ID TRANSFORM)
Apply continual motion: concatenate TRANSFORM with the current transform of the object every refresh (set object ID's incremental transform to TRANSFORM).
geomview-1.9.4/doc/geomview.html/look_002drecenter.html0000644000175000001440000000430410663301507017727 00000000000000 look-recenter - Geomview Manual

Next: , Previous: look-encompass-size, Up: GCL Reference


7.2.67 look-recenter

(look-recenter [objectID] [cameraID])
Translates and rotates the camera so that it is looking in the -z direction (in objectID's coordinate system) at the center of objectID's bounding box (or the origin of the coordinate system in non-Eudlidean space). In Euclidean space, the camera is also moved as close as possible to the object while allowing the entire object to be visible. Also makes sure that the y-axes of objectID and cameraID are parallel.
geomview-1.9.4/doc/geomview.html/pickable.html0000644000175000001440000000337410663301507016266 00000000000000 pickable - Geomview Manual

Next: , Previous: pick-invisible, Up: GCL Reference


7.2.91 pickable

(pickable GEOM-ID {yes|no})
Say whether or not GEOM-ID is included in the pool of objects that could be returned from the pick command.
geomview-1.9.4/doc/geomview.html/figsavepanel.html0000644000175000001440000000010610663301507017146 00000000000000 geomview-1.9.4/doc/geomview.html/sleep_002duntil.html0000644000175000001440000000415710663301507017425 00000000000000 sleep-until - Geomview Manual

Next: , Previous: sleep-for, Up: GCL Reference


7.2.119 sleep-until

(sleep-until TIME)
Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; sleep-until inside progn won't delay execution of the rest of the progn's contents. Time is measured according to this stream's clock, as set by set-clock; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME.
geomview-1.9.4/doc/geomview.html/shell.html0000644000175000001440000000451610663301507015622 00000000000000 shell - Geomview Manual

Next: , Previous: GCL Reference, Up: GCL Reference


7.2.1 !

!
is a synonym for shell. See shell.

Next: , Previous: sgi, Up: GCL Reference


7.2.117 shell

(shell SHELL-COMMAND)
Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is !.
geomview-1.9.4/doc/geomview.html/Materials-Panel.html0000644000175000001440000000652010663301507017466 00000000000000 Materials Panel - Geomview Manual

Next: , Previous: Appearance Panel, Up: Appearance


3.6.2 The Materials Panel

The Materials panel controls material properties of surfaces. It works with the target object in the same way that the Appearance panel does.

figs/mat.png

Figure 3.7: The Materials Panel.

Transparent
This button determines whether transparency is enabled. Geomview itself does not fully support transparency yet and on some machines it does not work at all. (The missing piece is implementation of a depth-sorting algorithm in the rendering engine; not difficult, but just not done yet.) Use RenderMan if you want real transparency: when transparency is enabled, a RenderMan snapshot will contain the alpha information.
Alpha
This slider determines the opacity/transparency when transparency is enabled. 0 means totally transparent, 1 means totally opaque.
Diffuse Reflectance
This slider controls the diffuse reflectance of a surface. This has to do with how much the surface scatters light that it reflects.
Shininess
This slider controls how shiny a surface is. This determines the size of specular highlights on the surface. Lower values give the surface a duller appearance.
Ambient Reflectance
This slider controls how much of the ambient light a surface reflects.
Specular Reflectance
This slider controls the specular reflectance of a surface. This has to do with how directly the surface reflects light rays. Higher values give brighter specular highlights.
Done
This button dismisses the Materials panel.
geomview-1.9.4/doc/geomview.html/new_002dgeometry.html0000644000175000001440000000374110663301507017604 00000000000000 new-geometry - Geomview Manual

Next: , Previous: new-center, Up: GCL Reference


7.2.83 new-geometry

(new-geometry name [GEOMETRY])
Create a new geom with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new object is given an empty geometry. If an object with that name already exists, the new object is given a unique name.
geomview-1.9.4/doc/geomview.html/command.html0000644000175000001440000000326710663301507016133 00000000000000 command - Geomview Manual

Next: , Previous: clock, Up: GCL Reference


7.2.22 command

(command INFILE [OUTFILE])
Read commands from INFILE; send corresponding responses (e.g. anything written to filename -) to OUTFILE, stdout by default.
geomview-1.9.4/doc/geomview.html/rawevent.html0000644000175000001440000000344310663301507016344 00000000000000 rawevent - Geomview Manual

Next: , Previous: quote, Up: GCL Reference


7.2.98 rawevent

(rawevent dev val x y t)
Enter the specified raw event into the event queue. The arguments directly specify the members of the event structure used internally by geomview. This is the lowest level event handler and is not intended for general use.
geomview-1.9.4/doc/geomview.html/merge_002dbaseap.html0000644000175000001440000000357610663301507017520 00000000000000 merge-baseap - Geomview Manual

Next: , Previous: merge-base-ap, Up: GCL Reference


7.2.72 merge-baseap

(merge-baseap APPEARANCE)
Merge in some appearance characteristics to the base default appearance (applied to every geom before its own apperance). Lighting is typically included in the base appearance.
geomview-1.9.4/doc/geomview.html/name_002dobject.html0000644000175000001440000000356610663301507017353 00000000000000 name-object - Geomview Manual

Next: , Previous: morehelp, Up: GCL Reference


7.2.74 name-object

(name-object ID NAME)
Assign a new NAME (a string) to ID. A number is appended if that name is in use (for example, foo -> foo<2>). The new name, possibly with number appended, may be used as object's id thereafter.
geomview-1.9.4/doc/geomview.html/geometry.html0000644000175000001440000000363010663301507016342 00000000000000 geometry - Geomview Manual

Next: , Previous: freeze, Up: GCL Reference


7.2.50 geometry

(geometry GEOM-ID [GEOMETRY])
Specify the geometry for GEOM-ID. GEOMETRY is a string giving an OOGL geometry specification. If no object called GEOM-ID exists, it is created; in this case the GEOMETRY argument is optional, and if omitted, the new object GEOM-ID is given an empty geometry.
geomview-1.9.4/doc/geomview.html/ND_002dVertices.html0000644000175000001440000000607410663301507017247 00000000000000 ND-Vertices - Geomview Manual

4.1.4 N-dimensional Vertices

Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word.

All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on).

The syntax for N-dimensional vertices (N > 3) is

`x[1] x[2] x[3] x[4] ...'
(N floating-point vertex coordinates) or
`x[0] x[1] x[2] x[3] x[4] ...'
((N+1) floating-point vertex coordinates, if the 4 modifier has been specified in the object's header line)

Note, however, that N-dimensional objects internally always have (N+1)-dimensional points; the first component x[0] – if present in the object file – is used as homogeneous divisor. This is different from the ordinary 3D case where the 4 modifier generates a 4D object where the homogeneous component implicitly is set to 1.

Color components usually can be specified like for 3D vertices, see Vertices, while specifying normals does not make sense. geomview-1.9.4/doc/geomview.html/Contributing.html0000644000175000001440000000612010663301507017153 00000000000000 Contributing - Geomview Manual

Next: , Previous: Support, Up: Top


Contributing to Geomview's Development

If you are interested in contributing to the development of Geomview, there are several things you can do:

  1. Volunteer programming work.

    If you are a programmer and make an improvement to Geomview, contact the other geomview authors by sending a note to the geomview-users mailing list (see http://lists.sourceforge.net/mailman/listinfo/geomview-users).

  2. Contract with Geometry Technologies.

    Geometry Technologies, Inc. is a consulting firm that provides contract technical support and custom programming services in the area of 3D graphics. This includes a wide range of services related to 3D graphics, included but not limited to applications involving Geomview. To the extent that resources allow, Geometry Technologies supports the developement of Geomview; in particular it hosts the http://www.geomview.org web site, and its staff make ongoing improvements to Geomview itself. If you are in a position to pay for technical support or custom programming work, contracting with Geometry Technologies indirectly supports Geomview. You can also contract with with Geometry Technologies to have particular features that you want added to Geomview, or to port Geomview to a new platform. For more information see Geometry Technologies web site at http://www.geomtech.com.

Thank you. geomview-1.9.4/doc/geomview.texi0000644000175000001440000132637010663276422013572 00000000000000%%% -*-texinfo-*- \tolerance=2000 \input texinfo @letterpaper @setfilename geomview @settitle Geomview Manual @include version.texi @dircategory Graphics Applications @direntry * Geomview: (geomview). The interactive 3D viewing program. @end direntry @c @titlepage @sp 1 @center @titlefont{Geomview Manual} @sp 4 @center Geomview Version @value{VERSION} @sp 1 @center for Unix @sp 1 @center @value{UPDATED-MONTH} @comment November 19, 2000 @sp 2 @center Mark Phillips et al. @sp 4 @vskip 0pt plus 1filll @center Copyright @copyright{} 1992-1998 The Geometry Center @center Copyright @copyright{} 1998-2006 Stuart Levy, Tamara Munzner, Mark Phillips @center Copyright @copyright{} 2006-2007 Claus-Justus Heine @end titlepage @page @node Top, Intro, (dir), (dir) Geomview, the interactive 3D viewing program. @menu * Intro:: Introduction to Geomview. * Distrib:: How to get the latest Geomview distribution. * Copying:: The GNU Lesser Public License. * History:: History of Geomview's Development. * Platforms:: Supported Platforms. * Pronunciation:: How to Pronounce ``Geomview''. * Overview:: Overview of Geomview. * Tutorial:: Introductory Tutorial. * Interaction:: Interacting with Geomview. * OOGL File Formats:: Formats for Geometry Input. * Customization:: Modifying the behavior of Geomview. * Modules:: Programs that use Geomview for graphics display. * GCL:: GCL: the Geomview Command Language. * Non-Euclidean Geometry:: Non-Euclidean Geometry. * Mathematica:: Mathematica Graphics in Geomview or RenderMan. * Installation:: Installing Geomview on your computer. * Support:: Getting Technical Support for Geomview. * Contributing:: How to contribute to Geomview. * Function Index:: A node for each GCL function. * List of Figures:: List of Figures. @end menu @node Intro, Distrib, Top, Top @unnumbered Introduction to Geomview Geomview is an interactive program for viewing and manipulating geometric objects, originally written by staff members of the Geometry Center at the University of Minnesota, starting in 1991. It can be used as a stand-alone viewer for static objects or as a display engine for other programs which produce dynamically changing geometry. It runs on many kinds of Unix computers, including Linux, SGI, Sun, and HP. It also runs with Cygwin. This manual describes Geomview version 1.9. @refill Geomview is free software, available under the terms of the GNU Lesser Public License; @pxref{Copying} for details. Geomview and this manual are available for download from @uref{http://www.geomview.org}. Permission is granted to make copies of this manual. If you have questions or comments about Geomview or this manual, consider joining in the @file{geomview-users} mailing list, which is a forum in which users of Geomview communicate to answer each others' questions and to share news about what they are doing with Geomview. The Geomview authors participate in this list and sometimes post answers to questions there. To join the list, visit the list web page at @uref{http://lists.sourceforge.net/mailman/listinfo/geomview-users}. @node Distrib, Copying, Intro, Top @unnumbered Distribution Geomview is @dfn{free software}; this means that everyone is free to use it and free to redistribute it on certain conditions. Geomview is not in the public domain; it is copyrighted and there are restrictions on its distribution, but these restrictions are designed to permit everything that a good cooperating citizen would want to do. What is not allowed is to try to prevent others from further sharing any version of Geomview that they might get from you. The precise conditions are found in the GNU Lesser Public License that comes with Geomview and also appears following this section. One way to get a copy of Geomview is from someone else who has it. You need not ask for our permission to do so, or tell any one else; just copy it. If you have access to the Internet, you can get the latest distribution version of Geomview at @uref{http://www.geomview.org}. You may also receive Geomview when you buy a computer. Computer manufacturers are free to distribute copies on the same terms that apply to everyone else. These terms require them to give you the full sources, including whatever changes they may have made, and to permit you to redistribute the Geomview received from them under the usual terms of the General Public License. In other words, the program must be free for you when you get it, not just free for the manufacturer. @node Copying, History, Distrib, Top @unnumbered Copying @c cH: in my opinion the following paragraph is complete nonsense; programs @c which simply communicate with other programs by means of streams @c cannot inherit the restriction imposed by the GPL @smallexample NOTE: Geomview is distributed under the GNU LESSER GENERAL PUBLIC LICENSE. For the purposes of this license we think of Geomview as if it were a "library", and of Geomview external modules as "programs that link with the library". We do this because we specifically want to allow proprietary programs and modules to use Geomview. @end smallexample @unnumbered GNU LESSER PUBLIC LICENSE @center Version 2.1, February 1999 @display Copyright @copyright{} 1991, 1999 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. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] @end display @unnumberedsec Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. @unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @enumerate 0 @item This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. @item You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. @item You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: @enumerate a @item The modified work must itself be a software library. @item You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. @item You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. @item If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) @end enumerate These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. @item You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. ^L Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. @item You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. @item A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. @item As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: @enumerate a @item Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) @item Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. @item Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. @item If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. @item Verify that the user has already received a copy of these materials or that you have already sent this user a copy. @end enumerate For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. @item You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: @enumerate a @item Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. @item Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. @end enumerate @item You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. @item You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. @item Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. @item If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. @item If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. @item The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. @item If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. @heading NO WARRANTY @item BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. @item IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. @end enumerate @heading END OF TERMS AND CONDITIONS @page @unnumberedsec How to Apply These Terms to Your New Programs If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. @smallexample @var{one line to give the library's name and a brief idea of what it does.} Copyright (C) @var{name of author} This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA @end smallexample Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: @smallexample Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice @end smallexample That's all there is to it! @node History, Platforms, Copying, Top @unnumbered History of Geomview's Development Geomview was originally written at the Geometry Center at the University of Minnesota in Minneapolis. The Geometry Center was a research and education center funded by the National Science Foundation, with a mission to promote research and communication of mathematics. Much of the work there involved the use of computers to help visualize mathematical concepts. The project that eventually led to Geomview began in the summer of 1988 with the work of Pat Hanrahan on a viewing program called MinneView. Shortly thereafter Charlie Gunn begin developing OOGL (Object Oriented Graphics Language) in conjunction with MinneView. Many people contributed to OOGL and MinneView, including Stuart Levy, Mark Meuer, Tamara Munzner, Steve Anderson, Mario Lopez, Todd Kaplan. In 1991 the staff of the Geometry Center began work on a new improved version of OOGL, and a new and improved viewing program, which they called Geomview. At that time essentially the only game in town for interactive 3D graphics was Silicon Graphics (SGI), so Geomview was developed initially on SGI workstations, using IRIS GL. The first version was finished in January of 1992. It immediately became very popular among visitors to the Geometry Center, and through the Center's ftp archive (this was before the web) people at other institutions began using it too. In addition to SGI workstations the Geometry Center had quite a few NeXT stations, so soon after Geomview was running on SGIs the staff developed a version for NeXTStep as well. By this time there were several thousand people using it around the world. A few years later the staff ported Geomview to X windows and OpenGL, and eventually, with the demise of NeXT, the NeXT version fell by the wayside. In its mission to foster communication among researchers and educators, the Geometry Center developed a web site, www.geom.umn.edu, in late 1993. It was one of the first 300 web sites in existence. A part of the web site was of course devoted to Geomview, and helped to spread the word about its existence. The Geometry Center closed its "brick and mortar" facilities in August of 1998 (NSF cut its funding), but the web site continued to exist, and Geomview continued to be very popular around the world. In December of 1999 some of the former Geometry Center staff set up @uref{http://www.geomview.org} as a permanent home on the web for Geomview. Geomview's original authors, as well as a number of other volunteers around the world, are still actively involved in using and developing Geomview. @menu * Authors:: Authors. @end menu @node Authors, , History, History @unnumberedsec Authors Tamara Munzner, Stuart Levy, and Mark Phillips are the original authors of Geomview. Celeste Fowler, Charlie Gunn, and Nathaniel Thurston also made significant contributions. Daniel Krech and Scott Wisdom did the NeXTStep and RenderMan port, and Daeron Meyer and Tim Rowley did the port to X windows. Many other Geometry Center staff members, as well as several people elsewhere, also contributed. Mark Phillips wrote this manual, with substantial help from Stuart Levy and Tamara Munzner. Countless Geomview users have also been of great help by reading it and pointing out mistakes. @node Platforms, Pronunciation, History, Top @unnumbered Supported Platforms Geomview 1.9 should -- in principle -- compile and run on any fairly recent Unix-like operating system. Specifically, it runs on Linux and on Cygwin (Cygwin emulates a SystemV Unix-like environment under Microsoft Windows). Unluckily Geomview compiles with MacOS X (Darwin), but seemingly communicating with Geomview by means of pipes and sockets cause segmentation faults. Feel free to fix that! @xref{Contributing}, for details. @c Geomview runs on a wide variety of Unix systems. It has been tested on @c each of the following systems: Linux, FreeBSD, SGI, Sun either (Sun-OS @c 4.1.x and Solaris), HP RISC, Dec Alpha, RS/6000, and NeXT. Precompiled @c distributions are available for all of these systems. Using either @c OpenGL or the generic X11 renderer it can probably be compiled on other @c Unix systems as well. @c There is not a version of Geomview for Microsoft Windows. The main @c reason for this is that at the time when Geomview was written, personal @c computers were not fast enough to make interactive 3D graphics feasible, @c and by the time fast-enough PCs came around, the Geometry Center, @c where Geomview was developed, was in the process of being closed. The @c staff started work on a port to Windows but was not able to finish it @c before the Center shut down. @c If you would like to see a version of Geomview for Windows, @c you can contribute to its development in several ways. @c @xref{Contributing}, for details. @c There is also no version of Geomview for Macintosh. @node Pronunciation, Overview, Platforms, Top @unnumbered How to Pronounce ``Geomview`` The word 'Geomview' is a combination of the first syllable of the word 'geometry', and the word 'view'. The authors pronounce it with the accent on the first syllable @display GE-om-view @end display Some people put the accent on the second syllable, where it falls in the word 'geometry', but the original authors, who invented the name, prefer the accent-on-first-syllable pronunciation. @comment @comment @node node-name, next, previous, up @comment @comment **************************************************************** @node Overview, Tutorial, Pronunciation, Top @chapter Overview Geomview's main purpose is to display objects whose geometry is given, allowing interactive control over details such as point of view, speed of movement, appearance of surfaces and lines, and so on. Geomview can handle any number of objects and allows both separate and collective control over them. The simplest way to use Geomview is as a stand-alone viewer to see and manipulate objects. It can display objects described in a variety of file formats. It comes with a wide variety of example objects, and you can create your own objects. You can also use Geomview to handle the display of data coming from another program that is running simultaneously. As the other program changes the data, the Geomview image reflects the changes. Programs that generate objects and use Geomview to display them are called @emph{external modules}. External modules can control almost all aspects of Geomview. The idea here is that many aspects of the display and interaction parts of geometry software are independent of the geometric content and can be collected together in a single piece of software that can be used in a wide variety of situations. The author of the external module can then concentrate on implementing the desired algorithms and leave the display aspects to Geomview. Geomview comes with a collection of sample external modules, and this manual describes how to write your own. Geomview is the product of an effort at the Geometry Center to provide interactive geometry software that is particularly appropriate for mathematics research and education. In particular, Geomview can display things in hyperbolic and spherical space as well as Euclidean space. Geomview allows multiple independently controllable objects and cameras. It provides interactive control for motion, appearances (including lighting, shading, and materials), picking on an object, edge or vertex level, snapshots in SGI image file or Renderman RIB format, and adding or deleting objects is provided through direct mouse manipulation, control panels, and keyboard shortcuts. Geomview supports the following simple data types: polyhedra with shared vertices (.off), quadrilaterals, rectangular meshes, vectors, and Bezier surface patches of arbitrary degree including rational patches. Object hierarchies can be constructed with lists of objects and instances of object(s) transformed by one or many 4x4 matrices. Arbitrary portions of changing hierarchies may be transmitted by creating named references. Geomview can display 3-D graphics output from Mathematica and Maple. @comment **************************************************************** @node Tutorial, Interaction, Overview, Top @chapter Tutorial This chapter leads you through some of the basics of using Geomview. Work through this chapter in front of a computer where you can try out the examples given here to get a feel for what you can do with Geomview. To start Geomview, login to the computer and get a shell window. A shell window is a window in which you can type Unix commands; the prompt in the window usually ends with a '%'. In the shell window (the mouse cursor must be in the window) type the following (@kbd{@key{Enter}} here means hit the "Enter" key): @example geomview tetra dodec @key{Enter} @end example This command starts up Geomview and loads two example objects, a tetrahedron and a dodecahedron. After a few seconds three windows should appear; @pxref{figinitial, Figure}. @float Figure,figinitial @image{figs/initial} @caption{Initial Geomview display.} @end float The panel on the left is Geomview's main control panel; it's called the @emph{Main} panel. The skinny panel in the middle is the @emph{Tools} panel and is for selecting different kinds of motions. The window on the right is the camera window and in it you see a large tetrahedron and a dodecahedron which is partially obscured by the tetrahedron. Geomview has lots of panels but by default it displays only these three. We'll describe some aspects of these and a couple of the others in this tutorial. You can read more about these and other panels in the later chapters of this manual. Put the mouse cursor in the camera window and press down and hold the left mouse button. Now, while holding down the button, slowly move the mouse around. You should see the picture rotate in the direction you move the mouse. If you lift up on the mouse button while moving the mouse, the picture continues rotating. To stop it, hold the mouse very still and click down and up on the left mouse button. Geomview uses the @emph{glass sphere} model for mouse-based motion. This means you are supposed to think of the object as being inside an invisible sphere and the mouse cursor is a gripper outside the sphere. When you hold down the left mouse button, the gripper grabs the sphere; when you let go of the button, the gripper releases the sphere. Moving the mouse while holding the button down causes the sphere (and hence the object) to move in the same direction as the mouse. In addition to the two solids you should also see two wire-frame boxes in the camera window. These are the "bounding boxes" of the two objects. By default Geomview puts a bounding box around each object that it displays so that you have an idea of how large it is. Notice that as you move the mouse around the tetrahedron and dodecahedron move as a unit. That is because by default what you are actually moving is the "World". To move an individual object instead of the whole world, move the mouse cursor to the @emph{Targets} browser in the @emph{Main} panel. Click (any button) on the word @emph{tetra}. This makes the tetrahedron be the "target object". Now move the cursor back to the camera window and you can rotate just the tetrahedron. The motion that you have been applying up to now has been rotation, because that is the motion mode that is selected in the @emph{Tools} panel. To translate instead, click on the @emph{Translate} button. Now when you move the mouse in the camera window while holding down the left button, the tetrahedron (which should still be the target object from before) will translate in the direction you move the mouse. Notice that you can translate it beyond the edge of the window as long as you keep holding the left mouse button down. If you lift up on the mouse button while moving the mouse, the tetrahedron will keep going. It moves rather rapidly so it is very easy to lose track of where it is. If you accidentally lose the tetrahedron by translating it too far out of the view of the window, you can get it back by clicking on the @emph{Center} button in the @emph{Tools} panel. This causes it to come back to its initial position. Click on the @emph{Center} button to bring the tetrahedron home, and then translate it off to one side so that you can completely see the dodecahedron. Your world now has two objects in it that are beside each other. You should see the dodecahedron in the middle of the window and maybe part of the tetrahedron off to one side. Go back to the @emph{Targets} browser in the @emph{Main} panel and click on "World" to select the whole world again. Now click on the @emph{Look At} button in the @emph{Tools} panel. You should see the dodecahedron and the tetrahedron in the middle of the window next to each other (@pxref{figlookatworld, Figure}). The @emph{Look At} button positions the camera in such a way that the target object is centered in the window. @float Figure,figlookatworld @image{figs/fig2} @caption{Looking at the world.} @end float Now put the cursor over the middle of the dodecahedron and double-click the right mouse button. This means click it down-and-up two times in rapid succession. Notice that the dodecahedron becomes the target object; you can see this in the @emph{Targets} browser in the @emph{Main} panel. Double-clicking the right mouse button on an object is another way to make it the target object. @float Figure,figappearance @image{figs/ap} @caption{The Appearance Panel.} @end float Go to the @emph{Inspect} menu at the top of the @emph{Main} panel and select @emph{Appearance}. This brings up the @emph{Appearance} panel. When it appears, if it partially obscures another Geomview window you can move it off to one side by dragging its frame with the middle mouse button down. The @emph{Appearance} panel lets you control various things about the way Geomview draws objects. Note the buttons labeled @emph{[af] Faces} and @emph{[ae] Edges}. Click on the @emph{[ae] Edges} one, and notice that Geomview is now drawing the edges of the dodecahedron. Click on it again and the edges go away. Click several times and watch the edges come and go. When you've had enough of this, leave the edges on and click the @emph{[af] Faces} button. This toggles the faces on and off. Click the button again to turn them back on. Now click on the @emph{[Cf] Faces} button under the word @emph{COLOR}. A color chooser panel should appear (@pxref{figcolorchooser, Figure}). @float Figure,figcolorchooser @image{figs/color} @caption{Color Chooser Panel.} @end float @ifset forms Put the cursor in the color hexagon in this panel and hold down the left mouse button. Slowly move the mouse around. This drags the little black point around to choose a new color for the dodecahedron. @end ifset @ifclear forms Note the three sliders, @emph{H}, @emph{S}, and @emph{V}, controlling the color's hue, saturation, and value (lightness). Clicking the @emph{HSV} button gives a different set of sliders, one each for red, green, and blue. Numerical values for both RGB and HSV color systems can be seen or edited at the bottom of the panel. @end ifclear The dodecahedron's previous colors were specified in the file @file{dodec} that you loaded when we started Geomview. The color that you specify with the color panel overrides the old colors. You can adjust the intensity of the color with the @emph{Intensity} slider. When you find a color that you like, click the @emph{Done} button. Now put the cursor somewhere over the gray background and double-click the right mouse button; this picks "World" as the target object. Click the @emph{Look At} button to look at the world again. Notice that in the @emph{Appearance} panel the settings of the buttons have changed from the way you left them with the dodecahedron. That's because the @emph{Appearance} panel always displays the settings for the target object, which is now the world, which still has its default settings. Click on the @emph{[ab] BBox} button under the word @emph{Draw}. The bounding boxes go away. Now put the cursor back in the camera window. At the keyboard, type the keys @kbd{a }b. Notice that the bounding boxes come back. @kbd{a }b is the keyboard shortcut for the bounding box toggle button; the string "[ab]" appears on the button to indicate this. Most of Geomview's buttons have keyboard shortcuts that you can use instead if you want. This is useful once you are familiar with Geomview and don't want to have to move around among lots of panels. Now select the tetrahedron, either by double-clicking the right mouse button on it, or by selecting "tetra" in the @emph{Targets} browser. Then click on the @emph{Delete} button in the @emph{Main} panel. The tetrahedron should disappear. This is how you get rid of an object. You can also load objects from within Geomview. Click on the @emph{File} menu in the @emph{Main} panel and choose @emph{Open}. The @emph{Files} panel will appear. @c Below the middle of this panel is a browser with three lines in it; the second line is a directory with lots of Geomview example files in it. Click on that second line; @pxref{figfilespanel, Figure}. Scroll down in the list of files until you see @file{tref.off}. Click on that line, and then click on the @emph{OK} button. A large trefoil-shaped tube will appear in your window. Click the @emph{Hide} button in the @emph{Files} panel to dismiss the panel. @float Figure,figfilespanel @image{figs/secondlinelist} @caption{The Files Panel.} @end float Now click on the @emph{Reset} button in the @emph{Tools} panel. This causes everything to return to its home position. You should see a dodecahedron and a trefoil knot (@pxref{figtrefdodec, Figure}). Play around with the trefoil knot and the dodecahedron. Experiment with some of the other buttons in the @emph{Tools} panel. Try coloring the trefoil knot with the @emph{Appearance} panel. For a tutorial on how to create your own objects to load into Geomview, see file @file{doc/oogltour} distributed with Geomview. The things in that file will be incorporated into a future version of this manual. @float Figure,figtrefdodec @image{figs/trefdodecinter} @caption{Trefoil and Dodecahedron.} @end float @comment **************************************************************** @node Interaction, OOGL File Formats, Tutorial, Top @chapter Interaction This chapter describes how you interact with Geomview through the mouse and keyboard. @menu * Starting Geomview:: Starting Geomview. * Command Line Options:: Command Line Options. * Basic Interaction:: Basic Interaction: The Main Panel. * Loading:: Loading Objects Into Geomview. * Mouse Motions:: Using the Mouse to Manipulate Objects. * Appearance:: Changing the Way Things Look. * Cameras:: Cameras. * Saving:: Saving your work. * Commands:: The Commands Panel. * Keyboard Shortcuts:: Keyboard Shortcuts. @end menu @comment ================================================================ @node Starting Geomview, Command Line Options, Interaction, Interaction @section Starting Geomview The usual way to start Geomview is to type @kbd{geomview @key{Enter}} in a shell window (@key{Enter} means hit the "Enter" key). It may take Geomview a few seconds to start up; one or more windows will appear and you can begin interacting with Geomview immediately. It is also possible to specify actions for Geomview to perform at startup time by giving arguments in the shell command line. @xref{Command Line Options}. @comment ================================================================ @node Command Line Options, Basic Interaction, Starting Geomview, Interaction @section Command Line Options Here are the command line options that Geomview allows: @table @samp @item -b @var{r} @var{g} @var{}b Set the window background color to the given @var{r} @var{g} @var{}b values. @item -c @var{file} Interpret the GCL commands in @var{file}, which may be the special symbol @file{-} for standard input. For a description of GCL, @xref{GCL}. @item -c @var{command} Commands may also be supplied literally, as in @example -c "(ui-panel main off)" @end example Since @var{command} includes parentheses, which have special meaning to the shell, @var{command} must be quoted. Multiple @var{-c} options are allowed. @item -wins @var{nwins} Causes Geomview to initially display @var{nwins} camera windows. @item -wpos @var{width},@var{height}[@@@var{xmin},@var{ymin}] Specifies the initial location and size of the first camera window. The values for @var{width}, @var{height}, @var{xmin}, and @var{ymin} are in screen (pixel) coordinates. @item -M[cg][ps[un|in|in6]] @var{PIPENAME}|@var{TCPPORT} The @samp{-M} option accepts modifiers: a @samp{g} suffix expects geometry data (the default), while a @samp{c} suffix expects GCL commands. A @samp{p} implies the connection should use a named pipe (the default on everything except on the NeXT), while @samp{s} implies using a UNIX-domain socket (the default on the NeXT). Since version 1.9 of Geomview Internet domain sockets are also supported; use @samp{sin} to make Geomview listen on the IPv4 port given by @var{TCPPORT}, or use @samp{sin6} to make Geomview listen on an IPv6 port (also as specified by @var{TCPPORT}). @samp{sun} is a synonym for @samp{s}, i.e. use the Unix domain socket with the name @var{PIPENAME}. If @var{PIPENAME} starts with a slash ('/'), then it is assumed to be an absolute pathname, otherwise the named pipe or socket is created below @file{$@{TMPDIR@}/geomview/}. @b{Listening to command streams on TCP ports can be a security risk, as Geomview itself does not take any security precautions, it simply executes all commands fed to it through the network socket. This also implies that disk-io can be initiated remotely.} Examples: @table @code @item -M @var{objectname} Display (possibly dynamically changing) geometry sent from the programs @code{geomstuff} or @code{togeomview}. This actually listens to the named pipe @file{/tmp/geomview/objectname}; you can achieve the same effect with the shell commands: @example mkdir /tmp/geomview mknod /tmp/geomview/objectname p @end example (assuming the directory and named pipe don't already exist), then executing the GCL command: @example (geometry objectname < /tmp/geomview/objectname) @end example (@pxref{geometry,@code{(geometry @dots{})}}) @item -Mc @var{pipename} Like @samp{-M} above, but expects GCL commands, rather than OOGL geometry data, on the connection. @item -Mcs fred Read commands from the UNIX-domain socket named. @file{/tmp/geomview/fred} @item -Mcsin 40000 Read commands from the IPv4 port @samp{40000}. Geomview itself does not take any security precautions, so this can be a security risk. @end table @item -noopengl Disable the use of OpenGL for (possibly) hardware accelerated rendering, even if the Geomview binary has support for OpenGL compiled in. This also disables the support for transparency and textures in the camera windows. RenderMan snapshots still will have correct transparency and some limited texture support. @item -nopanels Start up displaying no panels, only graphics windows. Panels may be invoked later as usual with the @kbd{Px} keyboard shortcuts or with the @code{ui-panel} command. @xref{ui-panel, @code{(ui-panel @dots{})}}. @item -noinit Read no initialization files. By default, geomview reads the system-wide @file{.geomview} file, followed by those in @file{$@{HOME@}/.geomview} and @file{./.geomview}. @item -e @var{module} Start an external module; @var{module} is the name associated with the module, appearing in the main panel's Applications browser, as defined by the @code{emodule-define} command. @xref{emodule-define, @code{(emodule-define @dots{})}}. @item -start @var{module} @var{args} @dots{} Like -e but allows you to pass arguments to the external module. "--" signals the end of the argument list; the "--" may be omitted if it would be the last argument on the Geomview command line. @item -run @var{shell-command} @var{args} @dots{} Like -start but takes the pathname of executable of the external module instead of the module's name. The pathnames of all known module directories are appended to the UNIX search path when invoking @var{shell-command}. @end table @comment ================================================================ @node Basic Interaction, Loading, Command Line Options, Interaction @section Basic Interaction: The Main Panel Normally when you invoke Geomview, three windows appear: the @emph{Main} panel, the @emph{Tools} panel, and one camera window. Geomview has many other windows but most things can be done with these three and so by default the others do not appear. This section of the manual introduces some basic concepts that are used throughout the rest of the manual and describes the @emph{Main} panel. @c @float Figure,figmainpanel @image{figs/main} @caption{The Main Panel} @end float @c Geomview can display an arbitrary number of objects simultaneously. The @emph{Targets} browser in the @emph{Main} panel displays a list of all the objects that Geomview currently knows about. This browser has a line for each object that you have loaded, plus some lines for other objects. One of the other objects is called @code{World} and corresponds to the all the currently loaded objects, treated as if they were one object. Most of the operations that you can do to one object, such as applying a motion or changing a color, can also be done to the "World" object. The @emph{Targets} browser also has an entry for each camera. By default there is only one camera; it is possible to add more of them via the @emph{New Camera} entry of the @emph{Main} panel's @emph{File} menu. Geomview treats cameras in much the same way as it does geometric objects. For example, you can move cameras around and add them and delete them just as with geometric objects. Cameras do not usually show up in the display as an object that you see. Each camera has a separate camera window which displays the view as seen by that camera. (It is possible for each camera to display a geometric representation of other cameras. @xref{Cameras}.) Because Geomview treats cameras and geometric objects very similarly, the term @dfn{object} in this documentation is used to refer to either one. When we need to distinguish between the two kinds of objects, we use the term @dfn{geom} to denote a geometric object and the word @dfn{camera} to denote a camera. The object which is selected (highlighted) in the @emph{Targets} browser is called the @dfn{target} object. This is the object that receives any actions that you do with the mouse or keyboard. You can change the target object by selecting a different line in the @emph{Targets} browser. Another way to change the target object is to put the mouse cursor directly over a geometry in a camera window and rapidly double-click the right mouse button. This process is called @dfn{picking}; the picked object becomes the new target. Geomview objects are all known by two names, both of which are shown in the @emph{Targets} browser. The first name given there, which appears in square brackets ([ ]), is a short name assigned by Geomview when you load the object. It consists of the letter `g' for geometries and `c' for cameras, followed by a number. The second name is a longer more descriptive name; by default this is the name of the file that the object was loaded from. The two names are equivalent as far as Geomview is concerned; at any point where you need to specify a name you can give either one. To manipulate an object, make sure you that the object you want to move is the target object, and put the mouse cursor in a camera window. Motions are applied by holding down either the left or middle mouse button and moving the mouse. There are several different motion "modes", each for applying a different kind of motion. The @emph{MOTION MODE} browser in the @emph{Main} panel indicates the current motion mode. The default is "Rotate". You can change the current motion mode by selecting a new one in the @emph{MOTION MODE} browser, or by using the @emph{Tools} panel. For more information about motion modes, @xref{Mouse Motions}. The @emph{Modules} browser lists Geomview external modules. An external module is a separate program that interacts with Geomview to extend its functionality. For information on external modules, @xref{Modules}. @ifset forms The @emph{Load} button on the @emph{Main} panel brings up the @emph{Files} panel for loading a file. The file can contain either a geom, a camera, or GCL commands. For details, @xref{Loading}. The @emph{Delete} button causes the target object to be deleted. Geomview selects another object to be the new target. You can delete cameras as well as geometries in this way. If you hit the @emph{Delete} button while the target object is "World", Geomview deletes all geometries. The three buttons at the bottom of the @emph{Main} panel, labeled @emph{Euclidean}, @emph{Hyperbolic}, and @emph{Spherical}, allow you to change the geometry of the space that Geomview displays. By default @emph{Euclidean} is selected. For details about using @emph{Hyperbolic} and @emph{Spherical} spaces, @xref{Non-Euclidean Geometry}. @end ifset @ifclear forms The menu bar at the top of the main panel offers menus for common operations. To create new windows, load new objects, save objects or other information, or quit from geomview, see the @emph{File} menu. To copy or delete objects, see the @emph{Edit} menu. You can invoke any panel from the @emph{Inspect} menu. The @emph{Space} menu lets you choose whether geomview operates in Euclidean, Hyperbolic, or Spherical mode. Euclidean mode is selected by default. For details about using @emph{Hyperbolic} and @emph{Spherical} spaces, @xref{Non-Euclidean Geometry}. @end ifclear Most actions that you can do through Geomview's panels have equivalent keyboard shortcuts so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts are usually indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the keyboard shortcut for @emph{Rotate} mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the @emph{MOTION MODE} browser. To use this keyboard shortcut, just hit the @kbd{r} key while the mouse cursor is in any Geomview window. Do not hit the @kbd{@key{Enter}} key afterwards. Some keyboard shortcuts consist of more than one key. In these cases just type the keys one after the other, with no @kbd{@key{Enter}} afterwards. Keyboard shortcuts are case sensitive. Many keyboard shortcuts can be preceded by a numeric parameter. For example, typing @code{ae} toggles the state of drawing edges, while @code{1ae} always enables edge drawing. The @emph{keyboard} field in the upper left corner of the @emph{Main} panel echos the current state of keyboard shortcuts. @ifset forms The button labeled @emph{?} near the top right corner of the @emph{Main} panel causes Geomview to print out a list of all keyboard shortcuts to standard output. The @emph{Quit} button on the main panel terminates Geomview. @end ifset @ifclear forms For a list of all keyboard shortcuts, press the @emph{@code{?}} key. @end ifclear @comment ================================================================ @node Loading, Mouse Motions, Basic Interaction, Interaction @section Loading Objects Into Geomview There are several ways to load an object into Geomview. @table @asis @item the @emph{Files} panel If you click the @emph{Load} button in Geomview's @emph{Main} panel, the @emph{Files} panel will appear. @float Figure,figmyfilelist @image{figs/myfilelist} @caption{The Files Panel.} @end float This panel lets you select a file from a variety of directories. The top of the panel is a standard Motif file browser. Below this is a list of directories on Geomview's standard search path; click on one of these to browse files in that directory. To select a file, double-click on its name in the browser at upper right, or click on its name and press the @key{Enter} key, or type the file's name into the text box at the bottom of the browser and press @key{Enter}. @refill If the selected file contains OOGL geometric data, it will be added to the geomview @emph{Targets} browser. If it contains GCL commands instead, the file will be interpreted. @xref{GCL}. When the @emph{Files} panel first appears, the directory selected in the directory browser is the current directory --- the one from which you invoked Geomview. The file browser shows @emph{all} the files in this directory, including ones that are not Geomview files. If you try to load a file that doesn't contain either an OOGL object or Geomview commands, Geomview will print out an error message. The directory browser also lists a second and third directory in addition to the current directory. The second one, which ends in @file{data/geom}, is the Geomview example data directory. This contains a wide variety of sample objects. It also contains several subdirectories. In particular, the @file{hyperbolic} and @file{spherical} subdirectories have sample hyperbolic and spherical objects, respectively. Directory entries in the browser look just like file entries; to view a subdirectory, click on it. The third directory shown in the directory browser, which ends in @file{geom}, contains several subdirectories with other Geomview files in them. These are used less frequently than the ones in the @file{data/geom} directory. You can change the list of directories shown the @emph{Files} panel's directory browser by using the @code{set-load-path} command; @pxref{set-load-path, @code{(set-load-path @dots{})}}. @item the @kbd{<} keyboard shortcut: If you type @kbd{<} in any Geomview window, the @emph{Load} panel will appear. This is a small version of the @emph{Files} panel; it contains a text field in which you can enter the name of a file to load (or a GCL command surrounded by parentheses). After typing the name of the file to load, type @kbd{@key{Enter}}; Geomview will load the file as if you had loaded it with the @emph{Add} button in the @emph{Files} panel. If, after bringing up the small load panel with @kbd{<}, you decide you want to use the larger @emph{Files} panel after all, press the @emph{File Browser} button. @float Figure,figloadpanel @image{figs/load} @caption{The Load Panel.} @end float @item geometry loading commands: The @code{load}, @code{geometry}, @code{new-geometry}, and @code{read} GCL commands allow you to load an object into Geomview; @xref{GCL}. @xref{load, @code{(load @dots{})}}. @xref{new-geometry, @code{(new-geometry @dots{})}}. @xref{read, @code{(read @dots{})}}. @refill @end table @comment ================================================================ @node Mouse Motions, Appearance, Loading, Interaction @section Using the Mouse to Manipulate Objects Geomview lets you manipulate objects with the mouse. There are six different mouse motion modes: @emph{Rotate}, @emph{Translate}, @emph{Cam Fly}, @emph{Cam Zoom}, @emph{Geom Scale}, and @emph{Cam Orbit}. The tools panel has a button for each of these modes; to switch modes, click on the corresponding button. You can also select these through the @emph{Motion Mode} browser on the @emph{Main} panel.@refill This section describes basic mouse interaction. For details, @pxref{Commands}. @float Figure,figtools @image{figs/tools} @caption{The Tools Panel.} @end float Each of the motion modes uses a common paradigm for how the motion is applied. In particular, each depends on the current @emph{target} object and the current @emph{center} object. These are explained in the following paragraphs. The current target object is shown in the @emph{Target} field in the @emph{Tools} panel. This is the same as the selected object in the @emph{Targets} browser in the @emph{Main} panel, and you can change it by either selecting a new object in the browser, by typing a new entry in the field, or by picking an object in a camera window by double-clicking the right mouse button with the cursor over the object. The current center object is shown in the @emph{Center} field in the @emph{Tools} panel. Its default value is the special word "target", which means that the center object is whatever the target object is. You can change the center to any object by typing it in the @emph{Center} field. The origin of the center object is held fixed in @emph{Rotate} and @emph{Orbit} modes. Normally the center object is one of the existing geoms listed in the @emph{Targets} browser, and the actual center of rotations is the origin of that object's coordinate system. It is possible, however, to select an arbitrary point of interest on an object as the center. For details, @pxref{Point of Interest}. It is also possible to toggle the button @emph{BBox Center} to set the center of motion to the center of the current object's bounding box. Once toggled the active geometry's bounding box center will become the center of motion, if you select another object, then the center of motion will become the center of that object's bounding box. Nothing changes when a camera or the @emph{World} is selected, you have to type in the word @code{target} in the @emph{Center} field the reset to the default. You apply a mouse motion by holding down either the left or middle mouse button with the cursor in a camera window and moving the mouse. Most of the modes have @emph{inertia}, which means that if you let go of the button while moving the mouse, the motion will continue. It may be helpful to imagine the mouse cursor as being a gripper; when you hold a mouse button down, it grips the target object and you can move it. When you let go of the mouse button, the gripper releases the object. Letting go of the mouse button while moving the mouse is like throwing the object --- the object continues moving independent of the mouse. Inertia can be turned off; see the @emph{Main} panel's @emph{Motion} menu, described below. Generally, the left mouse button controls motion in the screen plane, while the middle mouse controls motion along or around the forward direction. Pressing the shift key while dragging with left or middle mouse buttons in most motion modes gives slow-speed motions, useful for fine adjustment. You can pick any point on an object (not just its origin) as the center of motion by holding down the shift key while clicking the right mouse button; this chooses a point of interest. @table @emph @item Rotate In @emph{Rotate} mode, hold the left mouse button down to rotate the target object about the center object. Rotation proceeds in the direction that you move the mouse. Specifically, the axis of rotation passes through the origin of the center object, is parallel to the camera view plane, and is perpendicular to the direction of motion of the mouse. When the center is "target", this means that the target object rotates about its own origin. The middle mouse button in @emph{Rotate} mode rotates the target object about an axis perpendicular to the view plane. @item Translate In @emph{Translate} mode, hold the left mouse button down to translate the target object in the direction of mouse motion. The middle mouse button translates the target along an axis perpendicular to the view plane. In Euclidean space, the center object is essentially irrelevant for translations. In hyperbolic and spherical spaces, where translations have a unique axis, this axis is chosen to go through the origin of the center object. @item Cam Fly @emph{Cam Fly} is a crude flight simulator that lets you fly around the scene. It works by moving the camera. Move the mouse while holding the left mouse button down to point the camera in a different direction. To move forward or backward, hold down the middle button and move the mouse vertically. Both of these motions have inertia; typically the easiest way to fly around a scene is to give the camera a slight forward push by letting go of the middle button while moving the mouse upward, and then using the left button to steer. @emph{Cam Fly} affects the camera window that the mouse is in; it ignores the target object and the center object. @item Cam Orbit @emph{Cam Orbit} mode lets you rotate the current camera around the current center. The left mouse button does this rotation. The middle mouse button in @emph{Cam Orbit} mode acts as in @emph{Cam Fly} mode: it moves the camera forward or backward. In general @emph{Cam Orbit} does not move the target object, although if the current camera is selected as the target and the center is also the target, it will pivot that camera about itself just as in @emph{Cam Fly} mode. @item Cam Zoom @emph{Cam Zoom} mode lets you change the current camera's field of view with the mouse; hold the left mouse button down and move the mouse to change it. The numeric value of the field of view is shown in the @emph{FOV} field in the @emph{Camera} panel. @item Geom Scale @emph{Geom Scale} mode lets you enlarge or shrink a geom. It operates on the target object if that object is a geom. If the target is a camera, @emph{Geom Scale} operates on the geom that was most recently the target object. Moving the mouse while holding down the left mouse button scales the object either up or down, depending on the direction of mouse motion. The center of the applied scaling transformation is the center object. Scaling is meaningful only in Euclidean space; attempts to scale are ignored in other spaces. @emph{Geom Scale} mode does not have inertia. @end table The @emph{Stop}, @emph{Look At}, @emph{Center}, and @emph{Reset} buttons on the @emph{Tools} panel perform actions related to motions but do not change the current motion mode. @table @emph @item Stop The @emph{Stop} button causes all motions to stop. It affects all moving objects, not just the target object. Its keyboard shortcut is @kbd{H}. The keyboard command @kbd{h}, which does not correspond to a panel button, stops the current motion for the target object only. @item Look At The @emph{Look At} button causes the current camera to be moved to a position such that it is looking at the target object, and such that the target object more or less fills the window. The Look At command is unreliable in non-Euclidean spaces. @item Center The @emph{Center} button undoes the target object's transformation, moving it back to its home position, which is where it was when you originally loaded it into Geomview. @item Reset The @emph{Reset} button stops all motion and causes all objects to move back to their home positions. @end table The @emph{Tools} panel also sports a @emph{Main} button, to invoke the main panel in case it was dismissed or buried, and a @emph{Done} button to close the @emph{Tools} panel. The @emph{Main} panel's @emph{Motion} menu has special controls affecting how mouse motions are interpreted; the toggles are also accessible through a GCL command. @xref{ui-motion, @code{(ui-motion @dots{})}}. @table @emph @item [ui] Inertia Normally, moving objects have inertia: if the mouse is still moving when the button is released, the selected object continues to move. When @emph{Inertia} is off, objects cease to move as soon as you release the mouse. @item [uc] Constrain Motion It's sometimes handy to move an object in a direction aligned with a coordinate axis: exactly horizontally or vertically. Selecting @emph{Constrain Motion} changes the interpretation of mouse motions to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical motion. Note that the motion is still along the X or Y axes of the camera in which you move the mouse, not necessarily the object's own coordinate system. @item [uo] Own Coordinates It's sometimes handy to move objects with respect to the coordinate system where they were defined, rather than with respect to some camera's view. While @emph{Own Coordinates} is selected, all motions are interpreted that way: dragging the mouse rightward in translate mode moves the object in its own +X direction, and so on. May be especially useful in conjunction with the @emph{Constrain Motion} button. @end table @comment ================================================================ @menu * Point of Interest:: Point of Interest. @end menu @node Point of Interest, , Mouse Motions, Mouse Motions @subsection Selecting a Point of Interest It is sometimes useful to specify a particular point on some object in a geomview window as the center point for mouse motions. You can do this by shift-clicking the right mouse button (i.e. click it once while holding down the shift key on the keyboard) with the cursor over the desired point. This point then becomes the @emph{point of interest}. The point of interest must be on an existing object. Selecting a point of interest simplifies examining a small portion of a larger object. Shift-right-click on an interesting point, and select @emph{Orbit} mode. Use the middle mouse button to approach, and the left mouse to orbit the point, examining the region from different directions. When you have selected a point of interest, the current center object changes to an object named "CENTER", which is an invisible object located at the point of interest. In addition, mouse motions for the window in which you made the selection are adjusted so that the point of interest follows the mouse. You can change the point of interest at any time by selecting a new one by shift-clicking the right mouse button again. You can cancel the point of interest altogether by shift-clicking the right mouse button with the cursor on the background (i.e. not on any object). This changes the center object back to its default value, "target". The object named "CENTER", which serves as the center object for the point of interest, is a special kind of geom called an "alien". It does not appear in the @emph{Targets} browser. By default it has no geometry associated with it and hence is invisible. You can, however, explicitly give it some geometry using a GCL command, causing it to appear. Use the @code{geometry} command for this: @code{(geometry CENTER @var{geometry})}, where @var{geometry} is any valid geometry. For example, @code{(geometry CENTER @{ < xyz.vect @})} causes the file @file{xyz.vect}, which is one of the standard example files distributed with geomview, to be used at the geometry for CENTER. @xref{geometry, @code{(geometry @dots{})}}. What happens internally when you select a point of interest is that the center is set to the object called CENTER, and that object is positioned at the point of interest. In addition, in order for mouse motions to track the point of interest, the current camera's focal length is set to be the distance from the camera to the point of interest. You can accomplish this via GCL with the following commands: @example (if (real-id CENTER) nil (new-alien CENTER @{@})) (ui-center CENTER) (transform-set CENTER universe universe translate @var{x} @var{y} @var{z}) (merge camera @var{cam-id} @{ focus @var{d} @}) @end example @noindent where @code{(@var{x},@var{y},@var{z})} are the (universe) coordinates of the point of interest, and @var{d} is the distance from that point to the current camera, @var{cam-id}. The first command above creates the "alien" CENTER if it does not yet exist. @comment ================================================================ @node Appearance, Cameras, Mouse Motions, Interaction @section Changing the Way Things Look Geomview uses a hierarchy of appearances to control the way things look. An @dfn{appearance} is a specification of information about how something should be drawn. This can include many things such things as color, lighting, material properties, and more. Appearances work in a hierarchal manner: if a certain appearance property, for example face color, is not specified in a particular object's appearance, that object is drawn using that property from the parent appearance. If both the parent and the child appearance specify a property, the child's setting takes precedence unless the parent appearance is set to override. Every geom in Geomview has an appearance associated with it. There is also an appearance associated with the "World" geom, which serves as the parent of each individual geom's appearance. Finally, there is a global "base" appearance, which is the parent of the World appearance. The base appearance specifies reasonable values for all appearance information, and by default none of the other appearances specify anything, which means they inherit their values from the base appearance. This means that by default all objects are drawn using the base appearance. If you change a certain appearance property for a geom, that property is used in drawing that geom. The parent appearance is used for any properties that you do not explicitly set. Geomview has three panels which let you modify appearances. @menu * Appearance Panel:: Color etc. * Materials Panel:: Surface Material properties. * Lighting Panel:: Lighting Parameters. @end menu @comment ---------------------------------------------------------------- @node Appearance Panel, Materials Panel, Appearance, Appearance @subsection The Appearance Panel The @emph{Appearance} panel lets you change most common appearance properties of the target object. @float Figure,figap @image{figs/ap} @caption{The Appearance Panel.} @end float If the target is an individual geom, then changes you make in the appearance panel apply to that geometry's appearance. If the target is the World, then appearance panel changes apply to the World appearance @emph{and} to all individual geom appearances. (Users have found that this is more desirable than having the changes only apply to the World appearance.) If the target is a camera, then appearance panel changes apply to the geom that was most recently the target. The five buttons near the upper right corner under the word @emph{Draw} control what parts of the target geom are drawn. @table @emph @item Faces This button specifies whether faces are drawn. @item Edges This button specifies whether edges are drawn. @item BBox This button specifies whether the bounding box is drawn. @item Vects This button specifies whether VECT objects are drawn. VECTs are a type of OOGL object that represent points and line segments in 3-space; they are distinct from edges of other kinds of objects, and it is sometimes desirable to have separate control over whether they are drawn. @item Normals This button specifies whether surface normal vectors are drawn. @end table The four buttons under @emph{Color} labeled @emph{Faces}, @emph{Edges}, @emph{Normals}, and @emph{BBox} let you specify the color of the corresponding aspect of the target geom. Clicking on one of them brings up a color chooser panel. @float Figure,figcolorchooserpanel @image{figs/color} @caption{Color Chooser Panel.} @end float This panel offers two sets of sliders: H(ue) S(aturation) V(alue), or R(ed) G(reen) B(lue), each in the range 0 through 1. The square shows the current color, which is given numerically in both HSV and RGB systems in the corresponding text boxes. In the HSV color system, hue H runs from red at 0, green at .333, blue at .667, and back to red at 1.0. Saturation gives the fraction of white mixed into the color, from 0 for pure gray to 1 for pure color. Value gives the brightness, from 0 for black to 1 for full brightness. Pressing the @emph{RG}b or @emph{HSV} button at top center switches the sliders to the other color system. You can adjust colors either via the sliders, or by typing in either the RGB or HSV text boxes. Click @emph{OK} to accept the color that you have chosen, or @emph{Cancel} to retain the previous color setting. The @emph{SHADING} browser lets you specify the shading model that Geomview uses to paint the target geom. @table @emph @item Constant Every face of the object is drawn with a constant color which does not depend on the location of the face, the camera, or the light sources. If the object does not contain per-face or per-vertex colors, the diffuse color of the object's appearance is used. If the object contains per-face colors, they are used. If the object contains per-vertex colors, each face is painted using the color of its first vertex. @item Flat Each face of the object is drawn with a color that depends on the relative location of the face, the camera, and the light sources. The color is constant across the face but may change as the face, camera, or lights move. @item Smooth Each face of the object is drawn with smoothly interpolated colors based on the normal vectors at each vertex. If the object does not contain per-vertex normals, this has the same effect as flat shading. If the object has reasonable per-vertex normals, the effect is to smooth over the edges between the faces. @item CSmooth Each face of the object is drawn with exactly the specified color(s), independent of lighting, orientation, and material properties. If the object is defined with per-vertex colors, the colors are interpolated smoothly across the face; otherwise the effect is the same as in Constant shading style. @end table The @emph{Facing Normals} button on the @emph{Appearance} panel indicates whether or not Geomview should arrange that normal vectors always face the viewer. If a normal vector points away from the viewer the color of the corresponding face or vertex usually is darker than is desired. Geomview can avoid this by using the opposite normal in shading calculations. This is the default. Using @emph{Facing Normals} can give strange flickering dark or light shading effects, though, near the horizon of a fairly smooth facetted object. Press this button to use the normals given with the object. The three text fields in the lower left corner of the @emph{Appearance} panel are: @table @emph @item Line Width The width, in pixels, for lines drawn by Geomview. @item Normal Length This is actually a scale factor; when normal vectors are drawn, Geomview draws them to have a length that is their natural length times this number. @item Patch Dicing Geomview draws Bezier patches by first converting them to meshes. This parameter specifies the resolution of the mesh: if @emph{Patch Dicing} is @var{n}, then an @var{n} by @var{n} mesh is used to draw each Bezier patch. if @emph{Patch Dicing} is 1, the resolution reverts to a built-in default value. @end table The @emph{Revert} button on the @emph{Appearance} panel undoes all settings in the target appearance. This causes the target geom to inherit all its appearance properties from its parent. The @emph{Appearance} panel's @emph{Override} button determines whether appearance controls should override settings in the objects themselves -- for example, setting the face color will affect all faces of objects with multi-colored facets. Otherwise, appearance controls only provide settings which the objects themselves do not specify. By default, @emph{Override} is enabled. This button applies to all objects, and to all appearance-related panels. @comment ---------------------------------------------------------------- @node Materials Panel, Lighting Panel, Appearance Panel, Appearance @subsection The Materials Panel The @emph{Materials} panel controls material properties of surfaces. It works with the target object in the same way that the @emph{Appearance} panel does. @float Figure,figmatpanel @image{figs/mat} @caption{The Materials Panel.} @end float @table @emph @item Transparent This button determines whether transparency is enabled. Geomview itself does not fully support transparency yet and on some machines it does not work at all. (The missing piece is implementation of a depth-sorting algorithm in the rendering engine; not difficult, but just not done yet.) Use RenderMan if you want real transparency: when transparency is enabled, a RenderMan snapshot will contain the alpha information. @item Alpha This slider determines the opacity/transparency when transparency is enabled. 0 means totally transparent, 1 means totally opaque. @item Diffuse Reflectance This slider controls the diffuse reflectance of a surface. This has to do with how much the surface scatters light that it reflects. @item Shininess This slider controls how shiny a surface is. This determines the size of specular highlights on the surface. Lower values give the surface a duller appearance. @item Ambient Reflectance This slider controls how much of the ambient light a surface reflects. @item Specular Reflectance This slider controls the specular reflectance of a surface. This has to do with how directly the surface reflects light rays. Higher values give brighter specular highlights. @item Done This button dismisses the @emph{Materials} panel. @end table @comment ---------------------------------------------------------------- @node Lighting Panel, , Materials Panel, Appearance @subsection The Lighting Panel The @emph{Lighting} panel controls the number, position, and color of the light sources used in shading. @float @image{figs/light} @caption{The Lighting Panel.} @end float The @emph{Lighting} panel is different from the @emph{Appearance} and @emph{Material} panels in that it always works with the base appearance. This is because it usually makes sense to use the same set of lights for drawing all objects in your scene. @table @emph @item LIGHTS The @emph{LIGHTS} browser shows the currently selected light. Changes made using the other widgets on this panel apply to this light. There is always at least one light, the ambient light. @item Intensity This slider controls the intensity of the current light. @item Color This button brings up a color chooser which lets you select the color of the current light. @item Add This button adds a light. @item Delete This button deletes the current light. @item Show Lights This button lets you see and change the positions of the light sources in a camera window. Each light is drawn as long cylinder which is supposed to remind you of a light beam. When you click on the @emph{Show Lights} button Geomview goes into "light edit" mode, during which you can rotate current light by holding down the left mouse button and moving the mouse. Lights placed in this way are infinitely distant, so what you are changing is the angular position. Click on the @emph{Show Lights} button again to return to the previous motion mode and to quit drawing the light beams. @item Done This button dismisses the @emph{Lighting} panel. @end table Geomview's @emph{Appearance}, @emph{Materials}, and @emph{Lighting} panels are constructed to allow you to easily do most of the appearance related things that you might want to do. The appearance hierarchy that Geomview supports internally, however, is very complex and there are certain operations that you cannot do with the panels. The Geomview command language (GCL) provides complete support for appearance operations. In particular, the @code{merge-baseap} command can be used to change the base appearance (which, except for lighting, cannot be changed by Geomview's panels). The @code{merge-ap} command can be used to change an individual geom's appearance. Appearances can also be specified in OOGL files; for details, @pxref{Appearances}. @xref{merge-baseap,@code{(merge-baseap @dots{})}}. @xref{merge-ap,@code{(merge-ap @dots{})}}. @comment ================================================================ @node Cameras, Saving, Appearance, Interaction @section Cameras A camera in Geomview is the object that corresponds to a camera window. By default there is only one camera, but it is possible to have as many as you want. You can control certain aspects of the way the world is drawn in each camera window via the @emph{Cameras} panel. @float Figure,figcamerapanel @image{figs/cam} @caption{The Cameras Panel.} @end float If the target object is a camera, the @emph{Cameras} panel affects that camera. If the target object is not a camera, the @emph{Cameras} panel affects the @dfn{current camera}. The current camera is the camera of the window that the mouse cursor is in, or was in most recently if the cursor is not in a camera window. Thus, if you use the keyboard shortcuts for the actions in the @emph{Cameras} panel while the cursor is in a camera window, the actions apply to that camera, unless you have explicitly selected another camera. To create new camera windows, use the @kbd{v+} keyboard shortcut, or see the @emph{File} menu on the @emph{Main} panel. @table @emph @item Single-Buffering Normally, geomview windows are @emph{double-buffered}: geomview draws the next picture into a hidden window, then switches buffers to make it visible all at once. On many systems, the memory for the hidden buffer comes from stealing half the bits in each screen pixel, reducing the color resolution. When single-buffering is enabled, the window flickers as each scene is being drawn, but you may get smoother images with reduced grainy dithering artifacts. Single-buffering is possible if Geomview is compiled with GL or OpenGL, but not with plain-X graphics. @item Dither Many displays offer less than the 24 bits per pixel (8 bits each of red, green, and blue) conventionally needed to show smooth gradations of color. When trying to show a color not accurately available on the display, Geomview normally @emph{dithers}, choosing pixel colors sometimes brighter, sometimes darker than the desired value, so that the average color over an area is a better approximation to the true color than a single pixel could be. Effectively this loses spatial resolution to gain color resolution. This isn't always desirable, though. Turning @emph{Dither} off gives less grainy, but less accurately colored, images. @item Software Shading This button controls whether Geomview does shading calculations in software. The default is to let the hardware handle them, and in Euclidean space this is almost certainly best because it is faster. In hyperbolic and spherical space, however, the shading calculations that the hardware does are incorrect. Click this button to turn on correct but slower software shading. @item Background Color This button brings up a color chooser which you can use to set the background color of the camera's window. @item PROJECTION This browser lets you pick between perspective and orthogonal projection for this camera. @item Near clip This determines the distance in world coordinates of the near clipping plane from the eye point. It must be a positive number. @item Far clip This determines the distance in world coordinates of the far clipping plane from the eye point. It must be a positive number and in general should be larger than the @emph{Near clip} value. @item FOV This is the camera's field of view, measured in its shorter direction. In perspective mode, it is an angle in degrees. In orthographic mode, it is the linear size of the field of view. This number can be modified with the mouse in @emph{Cam Zoom} mode. @item Focal Length The focal length is intended to suggest the distance from the camera to an imaginary plane of interest. Its value is used when switching between orthographic and perspective views (and during stereo viewing), so as to preserve apparent size of objects lying at the focal distance from the camera. Focal length also affects interpretation of mouse-based translational motions. Speed of forward motion (in translate, fly and orbit modes) is proportional to focal length; and objects lying at the focal distance from the camera translate laterally at the same rate as the mouse cursor. Finally, in N-D projection mode, cameras are displaced back by the focal distance from the 3-D projection of the world origin. @item Lines Closer This number has to do with the way lines are drawn. Normally Geomview's z-buffering algorithm can get confused when drawing lines that lie exactly on surfaces (such as the edges of an object); due to machine round-off error, sometimes the lines appear to be in front of the surface and sometimes they appear behind it. The @emph{Lines Closer} value is a fudge factor --- Geomview nudges all the lines that it draws closer to the camera by this amount. The number should be a small integer; try 5 or 10. 0 turns this feature off completely. Choosing too large a value will make lines visible even though they should be hidden. @item SPACE MODEL This determines the model used to draw the world. It is most useful in hyperbolic and spherical spaces. You probably don't need to touch this browser if you stay in Euclidean space. For more information about these models, @pxref{Non-Euclidean Geometry}. @table @emph @item Virtual This is the default model and represents the natural view from inside the space. @item Projective The projective model of hyperbolic and spherical space. Geoms move under isometries of the space, and cameras move by Euclidean motions. By default in the projective model, the Euclidean unit sphere is drawn. In hyperbolic space this is the sphere at infinity. In Euclidean space the projective model is the same as the virtual model except that the sphere is drawn by default. @item Conformal The conformal model of hyperbolic and spherical space. Geoms move under isometries of the space, and cameras move by Euclidean motions. In Euclidean space, the conformal model amounts to inverting everything in the unit sphere. @end table @item Draw Sphere This controls whether Geomview draws the unit sphere. By default the unit sphere appears in the projective and conformal models. In hyperbolic space this is the sphere at infinity. In spherical space it is the equatorial sphere. @item Done This button dismisses the @emph{Cameras} panel. @end table @comment ================================================================ @node Saving, Commands, Cameras, Interaction @section Saving your work Geomview's @emph{Save} panel lets you store Geomview objects and other information in files that you can read back into Geomview or other programs. @float Figure,figsavepanel @image{figs/save} @caption{The Save Panel.} @end float To use the @emph{Save} panel you select the desired format in the browser next to the word @emph{Save}, enter the name of the object you want to save in the text field next to the word @emph{for}, and enter the name of the file you wish to save to in the long text field next to the word @emph{in}. You can then either hit @kbd{@key{Enter}} or click on the @emph{OK} button. When the file has been written, the @emph{Save} panel disappears. If you want to dismiss the @emph{Save} panel without writing a file, click the @emph{Cancel} button. If you specify @file{-} as the file name, Geomview will write the file to standard output, i.e. in the shell window from which you invoked Geomview. The possible formats are given below. The kind of object that can be written with each format is given in parentheses. @table @emph @item Commands @asis{(any object)} This write a file of GCL commands containing all information about the object. Loading this file later will restore the object as well as all other information about it, such as appearance, transformations, etc. @item Geometry alone @asis{(geom)} This writes an OOGL file containing just the geometry of the object. @item Geometry [in world] @asis{(geom)} This writes an OOGL file containing just the geometry of the object, transformed under Geomview's current transformation for this object. Use this if you have moved the object from its initial position and want to save the new position relative to the world. @item Geometry [in universe] @asis{(geom)} This writes an OOGL file containing just the geometry of the geom, transformed under both the object's transformation and the world's transformation. @item RMan [->tiff] @asis{(camera)} Writes a RenderMan file which when rendered creates a tiff image. Transparency and texturing (the latter only to some extent) will be available. @item RMan [->frame] @asis{(camera)} Writes a RenderMan file which when rendered causes an image to appear in a window on the screen. Transparency and texturing (the latter only to some extent) will be available. @item SGI snapshot @asis{(camera)} Write an SGI raster file. A bell rings when the snapshot is complete. Only available on SGI systems. @item PPM GLX-offscreen snapshot @asis{(camera)} Render the complete scene anew into off-screen memory; GLX provides the means to use a Pixmap as rendering area. The advantage of rendering into @emph{off}-screen memory over taking screen snapshot is that the camera windows need not be mapped and even raised at the time the snapshot is taken. So with off-screen snapshot one can safely iconify the camera window (but do not close it!), activate the screen-saver and go to bed while some script advances the scenes and takes snapshots. @item PPM Screen snapshot @asis{(camera)} Take a snapshot of the given window and save it as a PPM image. If you specify a string beginning with a vertical bar (@kbd{|}) as the file name, it's interpreted as a Bourne shell command to which the PPM data should be piped, as in @samp{| pnmtotiff > snap.tiff} or @samp{| convert -geometry 50% ppm:- snap.gif}. PPM screen snapshots are only available with GL and Open GL, not plain X graphics. The window should be entirely on the screen. Geomview will ensure that no other windows cover it while the snapshot is taken. It is probably a better idea to use GLX-@emph{off-screen} snapshots, as explained above. @item PPM software snapshot @asis{(camera)} Writes a snapshot of that window's current view, as a PPM image, to the given file. The file name may be a Bourne shell command preceded by a vertical bar (@kbd{|}), as with the PPM screen snapshot. The software snapshot, though, is produced by using a built-in software renderer (related to the X-windows renderer). It doesn't matter whether the window is visible or not, and doesn't depend on GL or OpenGL. It also doesn't support some features, such as texture mapping. @item Postscript snapshot @asis{(camera)} Writes a Postscript snapshot of the camera's view. It's made by breaking up the scene into lines and polygons, sorting by depth, and generating Postscript lines and polygons for each one. Advantages over pixel-based snapshot images: resolution is very high, so edges look sharp even on high-resolution printers, or comparable-resolution images are typically much more compact. Disadvantages: depth-sorting gives good results on some scenes, but can be wildly wrong as a hidden-surface removal algorithm for other scenes. Also, Postscript doesn't offer smoothly interpolated shading, only flat shading for each facet. @item Camera @asis{(camera)} Writes an OOGL file of a camera. @item Transform [to world] @asis{(any object)} Writes an OOGL transform file giving Geomview's transform for the object. @item Transform [to universe] @asis{(any object)} Writes an OOGL transform file giving a transform which is the composition of Geomview's transform for the object and the transform for the world. @item Window @asis{(camera)} Writes an OOGL window file for a camera. @item Panels Writes a GCL file containing commands which record the state of all the Geomview panels. Loading this file later will restore the positions of all the panels. @end table @comment ================================================================ @node Commands, Keyboard Shortcuts, Saving, Interaction @section The Commands Panel The @emph{Commands} panel lets you type in a GCL command. When you hit @kbd{@key{Enter}}, Geomview interprets the command and prints any resulting output or error messages on standard output. You can edit the text and hit @kbd{@key{Enter}} as many times as you like, in general, whenever you hit @kbd{@key{Enter}} with the cursor in the @emph{Commands} panel, Geomview tries to interpret whatever text you have typed in the text field as a command. @float Figure,figcommandpanel @image{figs/command} @caption{The Commands Panel.} @end float @ifset forms The @emph{Obscure} panel is for relatively obscure things that don't really belong on any of the other panels. In the present version of Geomview, the @emph{Obscure} panel includes the @emph{NORMALIZE GEOMETRY} browser, which controls the kind of geometry normalization that Geomview does, and several buttons affecting motion style. @float Figure,figobscurepanel @image{figs/obscure} @caption{The Obscure Panel.} @end float @end ifset [Move this.] Normalization is a kind of scaling; Geomview can scale an object so that it fits within a certain region. The main point of normalization is to allow you to easily view all of an object without having to worry about how big it is. We are gradually replacing Geomview's normalization feature with more robust camera positioning features. In general, the best way to make sure you are seeing all of an object is to use the @emph{Look At} button on the @emph{Tools} panel. Normalization may be completely replaced by this and other features in a future version of Geomview. Normalization is a property that applies to each geom separately. The @emph{NORMALIZE GEOMETRY} browser affects the normalization property of target geom. If the target geom is "World", it affects all geoms. @table @emph @item None Do no normalization. @item Individual Normalize this geom to fit within a unit sphere. @item Sequence This resembles "Individual", except when an object is changing. Then, "Individual" tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while "Sequence" normalizes the union of all variants of the object and normalizes accordingly. @item Keep This leaves the current normalization transform unchanged when the object changes. It may be useful to apply "Individual" or "Sequence" normalization to the first version of a changing object to bring it in view, then switch to "Keep". @end table @comment ================================================================ @node Keyboard Shortcuts, , Commands, Interaction @section Keyboard Shortcuts Most actions that you can do through Geomview's panels have equivalent keyboard shortcuts so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts usually are indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the keyboard shortcut for @emph{Rotate} mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the @emph{MOTION MODE} browser. To use this keyboard shortcut just hit the @kbd{r} key while the mouse cursor is in any Geomview window. You don't need to press the @kbd{@key{Enter}} or @kbd{@key{SPACE}} keys. Some keyboard shortcuts consist of more than one key. In these cases just type the keys one after the other, with no @kbd{@key{Enter}} afterwards. Keyboard shortcuts are case sensitive. You can cancel a multi-key keyboard shortcut that you have started by typing any invalid key, for example the space bar. Keyboard commands apply while the cursor is in any camera window and most control panels. Many keyboard shortcuts allow numeric arguments which you type as a prefix to the command key(s). For example, the shortcut for @emph{Near clip} in the camera panel is @kbd{v n}. To set the near clip plane to @samp{0.5}, type @kbd{0.5vn}. Commands that don't take a numeric prefix toggle or reset the current value. Most commands allow one of the following selection prefixes. If none is provided the command applies to the target object. @table @kbd @item g world geom @item g# #'th geom @item g* All geoms @item c current camera @item c# #'th camera @item c* All cameras @end table For example, @kbd{g4af} means toggle the face drawing of object @emph{g4}. Simply typing a selection prefix, like @kbd{g4}, doesn't yet select an object; that only happens when a command, like @kbd{ae}, follows the prefix. To select an object as the target without doing anything else to it, use the @kbd{p} command. So @kbd{g3p} selects object g3. The text field in the upper left corner of the @emph{Main} panel shows the state of the current keyboard shortcut. In addition to the keyboard shortcuts for the panel commands, there is also a shortcut for picking a target object: type the short name of the object followed by @kbd{p}. For example, to select object @emph{g3}, type @kbd{g 3 p}. This only works with the short names --- the ones that appear in square brackets ([ ]) in the @emph{Targets} browser of the @emph{Main} panel. Below is a summary of all keyboard shortcuts. @table @asis @item Draw @table @kbd @item af Faces @item ae Edges @item an Normals @item ab Bounding Boxes @item aV Vectors @end table @item Shading @table @kbd @item 0as Constant @item 1as Flat @item 2as Smooth @item 3as Smooth, non-lighted @item aT allow transparency @item at texture mapping @end table @item Other @table @kbd @item av eVert normals: always face viewer @item #aw Line Width (pixels) @item aC handle concave polygons @item #vc edges Closer than faces (try 5-100) @end table @item Color @table @kbd @item Cf faces @item Ce edges @item Cn normals @item Cb bounding boxes @item CB background @end table @item Motions @table @kbd @item r rotate @item t translate @item z zoom FOV @item f fly @item o orbit @item s scale @item w recenter target @item W recenter all @item h halt @item H halt all @item @@ select center of motion (e.g. @kbd{g 3 @@}) @item L Look At object @end table @item Viewing @table @kbd @item 0vp Orthographic view @item 1vp Perspective view @item vd Draw other views' cameras @item #vv field of View @item #vn near clip distance @item #vf far clip distance @item v+ add new camera @item vx cursor on/off @item vb backfacing poly cull on/off @item #vl focal length @item v~ Software shading on/off @end table @item Panels @table @kbd @item Pm Main @item Pa Appearance @item Pl Lighting @item Po Obscure @item Pt Tools @item Pc Cameras @item PC Commands @item Pf Files @item Ps Save @item P- read commands from tty @item PA Credits ("about") @end table @item Lights @table @kbd @item ls show lights @item le edit lights @end table @item Space @table @kbd @item me Euclidean @item mh Hyperbolic @item ms Spherical @end table @item Model @table @kbd @item mv Virtual @item mp Projective @item mc Conformal @end table @item Other @table @kbd @item 0N normalizaton: none @item 1N normalization: each @item 2N all normalization: all @item ui motion: Inertia @item uc motion: Constrain to axis @item uo motion: object's Own coordinates @item < @item Pf load geometry/command file @item dd delete target object @item > @item Ps save state to file @item TV NTSC mode toggle @item p pick as target object (e.g. @kbd{g 3 p}) With no prefix, selects the object under the mouse cursor (like double-clicking the right mouse) @end table @end table @comment **************************************************************** @node OOGL File Formats, Customization, Interaction, Top @chapter OOGL File Formats The objects that you can load into Geomview are called OOGL objects. OOGL stands for ``Object Oriented Graphics Library''; it is the library upon which Geomview is built. There are many different kinds of OOGL objects. This chapter gives syntactic descriptions of file formats for OOGL objects. Examples of most file types live in Geomview's @file{data/geom} directory. @menu * Conventions:: Conventions and general remarks. * Object File Formats:: Object File Formats. * Non-geometric objects:: Non-geometric objects. @end menu @comment ================================================================ @node Conventions, Object File Formats, OOGL File Formats, OOGL File Formats @section Conventions @menu * Common syntax:: Syntax Common to All OOGL File Formats. * File names:: File Names. * Vertices:: Vertices. * ND-Vertices:: @var{N}-dimensional Vertices. * Surface normal directions:: Surface normal directions. * Transformation matrices:: Transformation matrices. * ND Transformation matrices:: @var{N}-dimensional transformation matrices. * Binary format:: Binary format. * References:: Embedded objects and external-object references. * Appearances:: Appearances. * Texture Mapping:: Texture mapping. @end menu @comment ---------------------------------------------------------------- @node Common syntax, File names, Conventions, Conventions @subsection Syntax Common to All OOGL File Formats Most OOGL object file formats are free-format ASCII --- any amount of white space (blanks, tabs, newlines) may appear between tokens (numbers, key words, etc.). Line breaks are almost always insignificant, with a couple of exceptions as noted. Comments begin with # and continue to the end of the line; they're allowed anywhere a newline is. Binary formats are also defined for several objects; @xref{Binary format}, and the individual object descriptions. Typical OOGL objects begin with a key word designating object type, possibly with modifiers indicating presence of color information etc. In some formats the key word is optional, for compatibility with file formats defined elsewhere. Object type is then determined by guessing from the file suffix (if any) or from the data itself. Key words are case sensitive. Some have optional prefix letters indicating presence of color or other data; in this case the order of prefixes is significant, e.g. @code{CNMESH} is meaningful but @code{NCMESH} is invalid. @comment ---------------------------------------------------------------- @node File names, Vertices, Common syntax, Conventions @subsection File Names When OOGL objects are read from disk files, the OOGL library uses the file suffix to guess at the file type. If the suffix is unrecognized, or if no suffix is available (e.g. for an object being read from a pipe, or embedded in another OOGL object), all known types of objects are tried in turn until one accepts the data as valid. @comment ---------------------------------------------------------------- @node Vertices, ND-Vertices, File names, Conventions @subsection Vertices Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax is @table @samp @item @var{x} @var{y} @var{z} (3-D floating-point vertex coordinates) or @item @var{x} @var{y} @var{z} @var{w} (4-D floating-point vertex coordinates) @end table optionally followed by @table @samp @item @var{nx} @var{ny} @var{nz} (normalized 3-D surface-normal if present) @end table optionally followed by @table @samp @item @var{r} @var{g} @var{}b @var{a} (4-component floating-point color if present, each component in range 0..1. The @var{a} (alpha) component represents opacity: 0 transparent, 1 opaque.) optionally followed by @item @var{s} @var{t} @item or @item @var{s} @var{t} @var{u} @end table (two or three texture-coordinate values). Values are separated by white space, and line breaks are immaterial. Letters in the object's header key word must appear in a specific order; that's the reverse of the order in which the data is given for each vertex. So a @samp{CN4OFF} object's vertices contain first the 4-component space position, then the 3-component normal, finally the 4-component color. You can't change the data order by changing the header key word; an @samp{NCOFF} is just not recognized. @comment ---------------------------------------------------------------- @node ND-Vertices, Surface normal directions, Vertices, Conventions @subsection @var{N}-dimensional Vertices Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax for @var{N}-dimensional vertices (@var{N} > 3) is @table @samp @item @var{x[1]} @var{x[2]} @var{x[3]} @var{x[4]} @dots{} (@var{N} floating-point vertex coordinates) or @item @var{x[0]} @var{x[1]} @var{x[2]} @var{x[3]} @var{x[4]} @dots{} (@var{(N+1)} floating-point vertex coordinates, if the @code{4} modifier has been specified in the object's header line) @end table Note, however, that @var{N}-dimensional objects internally always have @var{(N+1)}-dimensional points; the first component @var{x[0]} -- if present in the object file -- is used as homogeneous divisor. This is different from the ordinary 3D case where the @code{4} modifier generates a 4D object where the homogeneous component implicitly is set to 1. Color components usually can be specified like for 3D vertices, @pxref{Vertices}, while specifying normals does not make sense. @comment ---------------------------------------------------------------- @node Surface normal directions, Transformation matrices, ND-Vertices, Conventions @subsection Surface normal directions Geomview uses normal vectors to determine how an object is shaded. The direction of the normal is significant in this calculation. When normals are supplied with an object, the direction of the normal is determined by the data given. When normals are not supplied with the object, Geomview computes normal vectors automatically; in this case normals point toward the side from which the vertices appear in counterclockwise order. On parametric surfaces (Bezier patches), the normal at point P(u,v) is in the direction dP/du cross dP/dv. @comment ---------------------------------------------------------------- @node Transformation matrices, ND Transformation matrices, Surface normal directions, Conventions @subsection Transformation matrices Some objects incorporate 4x4 real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is a 4-element row vector representing homogeneous coordinates of a point in the OOGL object, and A is the 4x4 matrix, then the transformed point is p' = p A. This matrix convention is common in computer graphics; it's the transpose of that often used in mathematics, where points are column vectors multiplied on the right of matrices. Thus for Euclidean transformations, the translation components appear in the fourth row (last four elements) of A. A's last column (4th, 8th, 12th and 16th elements) are typically 0, 0, 0, and 1 respectively. @comment ---------------------------------------------------------------- @node ND Transformation matrices, Binary format, Transformation matrices, Conventions @subsection ND Transformation matrices In the context of @var{N}-dimensional space (@var{N} < 3) some objects incorporate @var{(N+1)}x@var{(N+1)} real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is an @var{(N+1)}-element row vector representing homogeneous coordinates of a point in the OOGL object, and A @var{(N+1)}x@var{(N+1)} is the matrix, then the transformed point is p' = p A. Note that (unlike for the 4x4 transformation matrices, @pxref{Transformation matrices}) the homogeneous component is located at index @b{zero}, so the translation components for Euclidean transformations appear in the @b{zero}-th row (first @var{(N+1)} elements). A's first column (at column index zero) is typically 1, 0, @dots{}, 0. @comment ---------------------------------------------------------------- @node Binary format, References, ND Transformation matrices, Conventions @subsection Binary format Many OOGL objects accept binary as well as ASCII file formats. These files begin with the usual ASCII token (e.g. @code{CQUAD}) followed by the word @code{BINARY}. Binary data begins at the byte following the first newline after @code{BINARY}. White space and a single comment may intervene, e.g. @example OFF BINARY # binary-format "OFF" data follows @end example Binary data comprise 32-bit integers and 32-bit IEEE-format floats, both in big-endian format (i.e., with most significant byte first). This is the native format for 'int's and 'float's on Sun-3's, Sun-4's, and Irises, among others. Binary data formats resemble the corresponding ASCII formats, with ints and floats in just the places you'd expect. There are some exceptions though, specifically in the @code{QUAD}, @code{OFF} and @code{COMMENT} file formats. Details are given in the individual file format descriptions. @xref{QUAD}, @xref{OFF}, and @xref{COMMENT}. Binary OOGL objects may be freely mixed in ASCII object streams: @example LIST @{ = MESH BINARY @dots{} binary data for mesh here @dots{} @} @{ = QUAD 1 0 0 0 0 1 0 1 0 0 1 0 @} @end example Note that ASCII data resumes immediately following the last byte of binary data. Naturally, it's impossible to embed comments inside a binary-format OOGL object, though comments may appear in the header before the beginning of binary data. @comment ---------------------------------------------------------------- @node References, Appearances, Binary format, Conventions @subsection Embedded objects and external-object references Some object types (@code{LIST}, @code{INST}) allow references to other OOGL objects, which may appear literally in the data stream, be loaded from named disk files, or be communicated from elsewhere via named objects. GCL commands also accept geometry in these forms. The general syntax is @example ::= [ "@{" ] [ "define" @code{symbolname} ] [ ["="] @code{object-keyword} @dots{} | "<" @code{filename} | ":" @code{symbolname} ] [ "@}" ] @end example where "quoted" items are literal strings (which appear without the quotes), [bracketed] items are optional, and | denotes alternatives. Curly braces, when present, must match; the outermost set of curly braces is generally required when the object is in a larger context, e.g. when it is part of a larger object or embedded in a Geomview command stream. For example, each of the following three lines: @example @{ define fred QUAD 1 0 0 0 0 1 0 1 0 1 0 0 @} @{ define fred = QUAD 1 0 0 0 0 1 0 1 0 1 0 0 @} @{ appearance @{ +edge @} LIST @{ < "file1" @} @{ : fred @} @} VECT 1 2 0 2 0 0 0 0 1 1 2 @end example @noindent is a valid OOGL object. The last example is only valid when it is delimited unambiguously by residing in its own disk file. The ":" construct allows references to symbols, created with @code{define}. A symbol's initial value is a null object. When a symbol is (re)defined, all references to it are automatically changed. The "@code{define} NAME" construct allows to define a global symbol for the given object. If "NAME" already references an object, then the old object is discarded and replaced by the new definition. @xref{read,@code{(read @dots{})}}. @xref{hdefine,@code{(hdefine @dots{})}}. The "<" construct causes a disk file to be read. Note that this isn't a general textual "include" mechanism; a complete OOGL object must appear in the referenced file. Files read using "<" are sought first in the directory of the file which referred to them, if any; failing that, the normal search path (@pxref{load-path, @code{(load-path @dots{})}}) is used. The default search looks first in the current directory, then in the Geomview data directories. Again, white space and line breaks are insignificant, and "#" comments may appear anywhere. @comment ---------------------------------------------------------------- @node Appearances, Texture Mapping, References, Conventions @subsection Appearances Geometric objects can have associated "appearance" information, specifying shading, lighting, color, wire-frame vs. shaded-surface display, and so on. Appearances are inherited through object hierarchies, e.g. attaching an appearance to a @code{LIST} means that the appearance is applied to all the @code{LIST}'s members. Some appearance-related properties are relegated to "material", "lighting" and "texture" substructures. Take care to note which properties belong to which structure. Any geometric object can be preceded by an appearance definition like in the following example: @example @{ appearance @{ +edge @} LIST @{ < "file1" @} @{ QUAD 1 0 0 0 0 1 0 1 0 1 0 0 @} @} @end example Appearances are also OOGL objects in their own right and can be given symbolic names and referenced by them (@pxref{References}). @xref{appearance, Appearance objects}. @table @b @item Texture Mapping There is a separate section concerning the definition of textures (@pxref{Texture Mapping}). @item Transparency Rendering translucent objects is not supported by all drawing back ends. The OpenGL renderer has limited support for it: top-level objects (i.e. those which appear in the object browser of the main panel (@pxref{Basic Interaction, The Main Panel}) are rendered correctly by means of alpha-blending). Also, the RenderMan snapshots will include opacity values. @end table Here's an example appearance structure including values for all attributes. Order of attributes is unimportant. As usual, white space is irrelevant. Boolean attributes may be preceded by "+" or "-" to turn them on or off; "+" is assumed if only the attribute name appears. Other attributes expect values. A "*" prefix on any attribute, e.g. "*+edge" or "*linewidth 2" or "material @{ *diffuse 1 1 .25 @}", selects "override" status for that attribute. @example appearance @{ +face # (Do) draw faces of polygons. On by default. -edge # (Don't) draw edges of polygons +vect # (Do) draw VECTs. On by default. -transparent # (Disable) transparency. Enabling transparency # does not (necessarily) result in a correct Geomview # pictures, but alpha values are used in RenderMan # snapshots. -normal # (Do) draw surface-normal vectors normscale 1 # @dots{} with length 1.0 in object coordinates +evert # do evert polygon normals where needed so as # to always face the camera +texturing # (Enable) texture mapping +linear # (Enable) linear average of closest texture elements +mipmap # (Enable) texture mip-mapping +mipinterp # (Enable) linear mip-mapping -backcull # (Don't) discard clockwise-oriented faces -concave # (Don't) expect and handle concave polygons -shadelines # (Don't) shade lines as if they were lighted cylinders # These four are only effective where the graphics system # supports them, namely on GL and Open GL. -keepcolor # Normally, when N-D positional coloring is enabled as # with geomview's (ND-color ...) command, all # objects' colors are affected. But, objects with the # "+keepcolor" attribute are immune to N-D coloring. shading smooth # or ``shading constant'' or ``shading flat'' or # or ``shading csmooth''. # smooth = Gouraud shading, flat = faceted, # csmooth = smoothly interpolated but unlighted. linewidth 1 # lines, points, and edges are 1 pixel wide. patchdice 10 10 # subdivide Bezier patches this finely in u and v material @{ # Here's a material definition; # it could also be read from a file as in # ``material < file.mat'' ka 1.0 # ambient reflection coefficient. ambient .3 .5 .3 # ambient color (red, green, blue components) # The ambient contribution to the shading is # the product of ka, the ambient color, # and the color of the ambient light. kd 0.8 # diffuse-reflection coefficient. diffuse .9 1 .4 # diffuse color. # (In ``shading constant'' mode, the surface # is colored with the diffuse color.) ks 1.0 # specular reflection coefficient. specular 1 1 1 # specular (highlight) color. shininess 25 # specular exponent; larger values give # sharper highlights. backdiffuse .7 .5 0 # back-face color for two-sided surfaces # If defined, this field determines the diffuse # color for the back side of a surface. # It's implemented by the software shader, and # by hardware shading on GL systems which support # two-sided lighting, and under Open GL. alpha 1.0 # opacity; 0 = transparent (invisible), 1 = opaque. # Ignored when transparency is disabled. edgecolor 1 1 0 # line & edge color normalcolor 0 0 0 # color for surface-normal vectors @} lighting @{ # Lighting model ambient .3 .3 .3 # ambient light replacelights # ``Use only the following lights to # illuminate the objects under this # appearance.'' # Without "replacelights", any lights listed # are added to those already in the scene. # Now a collection of sample lights: light @{ color 1 .7 .6 # light color position 1 0 .5 0 # light position [distant light] # given in homogeneous coordinates. # With fourth component = 0, # this means a light coming from # direction (1,0,.5). @} light @{ # Another light. color 1 1 1 position 0 0 .5 1 # light at finite position @dots{} location camera # specified in camera coordinates. # (Since the camera looks toward -Z, # this example places the light # .5 unit behind the eye.) # Possible "location" keywords: # global light position is in world (well, universe) coordinates # This is the default if no location specified. # camera position is in the camera's coordinate system # local position is in the coordinate system where # the appearance was defined @} @} # end lighting model texture @{ clamp st # or ``s'' or ``t'' or ``none'' file lump.tiff # file supplying texture-map image alphafile mask.pgm.Z # file supplying transparency-mask image apply blend # or ``modulate'' or ``decal'' transform 1 0 0 0 # surface (s,t,0,1) * tfm -> texture coords 0 1 0 0 0 0 1 0 .5 0 0 1 background 1 0 0 1 # relevant for ``apply blend'' @} @} # end appearance @end example There are rules for inheritance of appearance attributes when several are imposed at different levels in the hierarchy. For example, Geomview installs a backstop appearance which provides default values for most parameters; its control panels install other appearances which supply new values for a few attributes; user-supplied geometry may also contain appearances. The general rule is that the child's appearance (the one closest to the geometric primitives) wins. Further, appearance controls with "override" status (e.g. @code{*+face or material @{ *diffuse 1 1 0 @}}) win over those without it. Geomview's appearance controls use the "override" feature so as to be effective even if user-supplied objects contain their own appearance settings. However, if a user-supplied object contains an appearance field with override status set, that property will be immune to Geomview's controls. @comment ---------------------------------------------------------------- @node Texture Mapping, , Appearances, Conventions @subsection Texture Mapping Some rendering back-ends support texture-mapped objects, actually only the OpenGL and the RenderMan interface at the time of this writing. There are also some issues with the RMan interface when using an alpha-channel in the texture image. Those rendering back-ends which don't support texturing silently ignore attempts to use texture mapping. A texture is specified as part of an appearance structure (@pxref{Appearances}). Briefly, one provides a texture image (@pxref{image, Image objects}), which is considered to lie in a square in @code{(s,t)} parameter space in the range 0 <= s <= 1, 0 <= t <= 1. Then one provides a geometric primitive, with each vertex tagged with @code{(s,t)} texture coordinates. If texturing is enabled, the appropriate portion of the texture image is pasted onto each face of the textured object. There is (currently) no provision for inheritance of part of a texture structure; if the @code{texture} keyword is mentioned in an appearance, it supplants any other texture specification. The appearance attribute @code{texturing} controls whether textures are used; there's no performance penalty for having texture @{ @dots{} @} fields defined when texturing is off. The available fields are: @example clamp none -or- s -or- t -or- st Determines the meaning of texture coordinates outside the range 0..1. With @code{clamp none}, the default, coordinates are interpreted modulo 1, so (s,t) = (1.25,0), (.25,0), and (-.75,0) all refer to the same point in texture space. With @code{s} or @code{t} or @code{st}, either or both of s- or t-coordinates less than 0 or greater than 1 are clamped to 1 or 0, respectively. image @{ (@pxref{image, Image objects}) @} Specify the actual texture image. Images can have 1, 2, 3 or 4 channels: 1 channel: luminance 2 channels: luminance and alpha 3 channels: RGB data 4 channels: RGBA data @xref{image, Image objects}, for the actual definition of image objects. The alpha-channel is only interpreted as mask: where the mask is zero, pixels are simply not drawn. An exception is the case where @emph{apply} is equal to @emph{modulate} and translucency is enabled: in this case the resulting alpha value is the result of the multiplication of the surface color with the alpha value of the texture's alpha channel. file filename alphafile filename @emph{This is considered obsolete, and only kept for compatibility, the modern way is to use the new OOGL image object. @xref{image, Image objects}. The stuff documented here should still work, though} Specifies image file(s) containing the texture. The @emph{file} keyword specifies a file with color or lightness information; @emph{alphafile} if present, specifies a transparency ("alpha") mask; where the mask is zero, pixels are simply not drawn. Several image file formats are available; the file type must be indicated by the last few characters of the file name: .ppm or .ppm.Z or .ppm.gz 24-bit 3-color image in PPM format .pgm or .pgm.Z or .pgm.gz 8-bit grayscale image in PGM format .sgi or .sgi.Z or .sgi.gz 8-bit, 24-bit, or 32-bit SGI image .tiff 8-bit or 24-bit TIFF image .gif GIF image For this feature to work, some programs must be available in geomview's search path: zcat for .Z files gzip for .gz files tifftopnm for .tiff files giftoppm for .gif files If an @code{alphafile} image is supplied, it must be the same size as the @code{file} image. @emph{Image objects provide a more flexible way to specify texture data. @xref{image, Image objects}.} apply modulate -or- blend -or- decal Indicates how the texture image is applied to the surface. Here the "surface color" means the color that surface would have in the absence of texture mapping. With @code{modulate}, the default, the texture color (or lightness, if textured by a gray-scale image) is multiplied by the surface color. With @code{blend}, texture blends between the @code{background} color and the surface color. The @code{file} parameter must specify a gray-scale image. Where the texture image is 0, the surface color is unaffected; where it's 1, the surface is painted in the color given by @code{background}; and color is interpolated for intermediate values. With @code{decal}, the @code{file} parameter must specify a 3-color image. If an @code{alphafile} parameter is present, its value interpolates between the surface color (where alpha=0) and the texture color (where alpha=1). Lighting does not affect the texture color in @code{decal} mode; effectively the texture is constant-shaded. background R G B A Specifies a 4-component color, with R, G, B, and A floating-point numbers normally in the range 0..1, used when @code{apply blend} is selected. transform @code{transformation-matrix} Expects a list of 16 numbers, or one of the other ways of representing a transformation (@code{: handlename} or @code{< filename}). The 4x4 transformation matrix is applied to texture coordinates, in the sense of a 4-component row vector (s,t,0,1) multiplied on the left of the matrix, to produce new coordinates (s',t') which actually index the texture. @end example @comment ================================================================ @node Object File Formats, Non-geometric objects, Conventions, OOGL File Formats @section Object File Formats @menu * QUAD:: List of quadrilaterals. * MESH:: Rectangularly-connected mesh. * BBOX:: Simple bounding-boxes. * BBP and BEZ:: List of Bezier surface patches. * OFF:: Polyhedra: polygons with shared vertices. * VECT:: List of points and lines. * SKEL:: List of points and lines, with shared vertices. * SPHERE:: Sphere * INST:: Transformed Instance of another object. * LIST:: List of other objects. * TLIST:: Collection of 4x4 transformation matrices. * GROUP:: Obsolete format for collections of objects. * DISCGRP:: Discrete Group objects. * COMMENT:: Comment object, for caching information. @end menu @comment ---------------------------------------------------------------- @node QUAD, MESH, Object File Formats, Object File Formats @subsection QUAD: collection of quadrilaterals The conventional suffix for a @code{QUAD} file is @file{.quad}. The file syntax is @example [C][N][4]QUAD -or- [C][N][4]POLY # Key word @var{vertex} @var{vertex} @var{vertex} @var{vertex} # 4*N vertices for some N @var{vertex} @var{vertex} @var{vertex} @var{vertex} @dots{} @end example The leading key word is @code{[C][N][4]QUAD} or @code{[C][N][4]POLY}, where the optional @code{C} and @code{N} prefixes indicate that each vertex includes colors and normals respectively. That is, these files begin with one of the words @code{QUAD} @code{CQUAD} @code{NQUAD} @code{CNQUAD} @code{POLY} @code{CPOLY} @code{NPOLY} @code{CNPOLY} (but not @code{NCQUAD} or @code{NCPOLY}). @code{QUAD} and @code{POLY} are synonymous; both forms are allowed just for compatibility with ChapReyes. Following the key word is an arbitrary number of groups of four vertices, each group describing a quadrilateral. See the Vertex syntax above. The object ends at end-of-file, or with a close-brace if incorporated into an object reference (see above). A @code{QUAD BINARY} file format is accepted; @xref{Binary format}. The first word of binary data must be a 32-bit integer giving the number of quads in the object; following that is a series of 32-bit floats, arranged just as in the ASCII format. @comment ---------------------------------------------------------------- @node MESH, BBOX, QUAD, Object File Formats @subsection MESH: rectangularly-connected mesh The conventional suffix for a @code{MESH} file is @file{.mesh}. The file syntax is @example [U][C][N][Z][4][u][v][n]MESH # Key word [@var{Ndim}] # Space dimension, present only if nMESH @var{Nu} @var{Nv} # Mesh grid dimensions # @var{Nu}*@var{Nv} vertices, in format specified # by initial key word @var{vertex}(u=0,v=0) @var{vertex}(1,0) @dots{} @var{vertex}(@var{Nu}-1,0) @var{vertex}(0,1) @dots{} @var{vertex}(@var{Nu}-1,1) @dots{} @var{vertex}(0,@var{Nv}-1) @dots{} @var{vertex}(@var{Nu}-1,@var{Nv}-1) @end example The key word is @code{[U][C][N][Z][4][u][v][n]MESH}. The optional prefix characters mean: @table @samp @item U Each vertex includes a 3-component texture space parameter. The first two components are the usual @code{S} and @code{T} texture parameters for that vertex; the third should be specified as zero. @item C Each vertex (see Vertices above) includes a 4-component color. @item N Each vertex includes a surface normal vector. @item Z Of the 3 vertex position values, only the Z component is present; X and Y are omitted, and assumed to equal the mesh (u,v) coordinate so X ranges from 0 .. (Nu-1), Y from 0 .. (Nv-1) where Nu and Nv are the mesh dimensions -- see below. @item 4 Vertices are 4D, each consists of 4 floating values. @code{Z} and @code{4} cannot both be present. @item u The mesh is wrapped in the u-direction, so the (0,v)'th vertex is connected to the (@var{Nu}-1,v)'th for all v. @item v The mesh is wrapped in the v-direction, so the (u,0)'th vertex is connected to the (u,@var{Nv}-1)'th for all u. Thus a u-wrapped or v-wrapped mesh is topologically a cylinder, while a uv-wrapped mesh is a torus. @item n Specifies a mesh whose vertices live in a higher dimensional space. The dimension follows the "MESH" keyword. Each vertex then has @var{Ndim} components. @end table Note that the order of prefix characters is significant; a colored, u-wrapped mesh is a @code{CuMESH} not a @code{uCMESH}. Following the mesh header are integers @var{Nu} and @var{Nv}, the dimensions of the mesh. Then follow @var{Nu}*@var{Nv} vertices, each in the form given by the header. They appear in v-major order, i.e. if we name each vertex by (u,v) then the vertices appear in the order @example (0,0) (1,0) (2,0) (3,0) @dots{} (@var{Nu}-1,0) (0,1) (1,1) (2,1) (3,1) @dots{} (@var{Nu}-1,1) @dots{} (0,Nv-1) @dots{} (@var{Nu}-1,@var{Nv}-1) @end example A @code{MESH BINARY} format is accepted; @xref{Binary format}. The values of @var{Nu} and @var{Nv} are 32-bit integers; all other values are 32-bit floats. @comment ---------------------------------------------------------------- @node BBOX, BBP and BEZ, MESH, Object File Formats @subsection BBOX: simple bounding boxes This is a very simple toy-object: it takes 2 vertices and draws a (hyper-) cube which is the bounding box of the two vertices. Syntax: @example BBOX @var{x}[0] @var{y}[0] @var{z}[0] @var{x}[1] @var{y}[1] @var{z}[1] @end example or @example 4BBOX @var{x}[0] @var{y}[0] @var{z}[0] @var{w}[0] @var{x}[1] @var{y}[1] @var{z}[1] @var{w}[1] @end example or @example nBBOX @var{Ndim} # > 3 @var{x}[0] @var{y}[0] @var{z}[0] @var{w}[0] @dots{} @var{x}[1] @var{y}[1] @var{z}[1] @var{w}[1] @dots{} @end example or @example 4nBBOX @var{Ndim} # > 3 @var{d}[0] @var{x}[0] @var{y}[0] @var{z}[0] @var{w}[0] @dots{} @var{d}[0] @var{x}[1] @var{y}[1] @var{z}[1] @var{w}[1] @dots{} @end example There is no BBOX binary format. The @code{4} modifyer has different meanings depending on the dimension of the bounding box: @code{4BBOX} means that the 4 components of the vertices make up a 4-dimensional bounding-box. Using @code{4} in conjunction with @code{n} -- @code{4nBBOX @var{NDim}} -- means that the vertices specified in the file have @var{NDim+1} components, but the component at index 0 is the homogeneous divisor (in contrast to the ordinary 3d case where the homogeneous divisor would be the @code{w} -- the third -- component). @comment ---------------------------------------------------------------- @node BBP and BEZ, OFF, BBOX, Object File Formats @subsection Bezier Surfaces The conventional file suffixes for Bezier surface files are @file{.bbp} or @file{.bez}. A file with either suffix may contain either type of patch. Syntax: @example [ST]BBP -or- [C]BEZ<@var{Nu}><@var{Nv}><@var{Nd}>[_ST] # @var{Nu}, @var{Nv} are u- and v-direction # polynomial degrees in range 1..6 # @var{Nd} = dimension: 3->3-D, 4->4-D (rational) # (The '<' and '>' do not appear in the input.) # @var{Nu},@var{Nv},@var{Nd} are each a single decimal digit. # BBP form implies @var{Nu}=@var{Nv}=@var{Nd}=3 so BBP = BEZ333. # Any number of patches follow the header # (@var{Nu}+1)*(@var{Nv}+1) patch control points # each 3 or 4 floats according to header @var{vertex}(u=0,v=0) @var{vertex}(1,0) @dots{} @var{vertex}(@var{Nu},0) @var{vertex}(0,1) @dots{} @var{vertex}(@var{Nu},1) @dots{} @var{vertex}(0,@var{Nv}) @dots{} @var{vertex}(@var{Nu},@var{Nv}) # ST texture coordinates if mentioned in header @code{S}(u=0,v=0) @code{T}(0,0) @code{S}(0,@var{Nv}) @code{T}(0,@var{Nv}) @code{S}(@var{Nu},0) @code{T}(@var{Nu},0) @code{S}(@var{Nu},@var{Nv}) @code{T}(@var{Nu},@var{Nv}) # 4-component float (0..1) R G B A colors # for each patch corner if mentioned in header @code{RGBA}(0,0) @code{RGBA}(0,@var{Nv}) @code{RGBA}(@var{Nu},0) @code{RGBA}(@var{Nu},@var{Nv}) @end example These formats represent collections of Bezier surface patches, of degrees up to 6, and with 3-D or 4-D (rational) vertices. The header keyword has the forms @code{[ST]BBP} or @code{[C]BEZ<@var{Nu}><@var{Nv}><@var{Nd}>[_ST]} (the '<' and '>' are not part of the keyword. The @code{ST} prefix on @code{BBP}, or @code{_ST} suffix on @code{BEZuvn}, indicates that each patch includes four pairs of floating-point texture-space coordinates, one for each corner of the patch. The @code{C} prefix on @code{BEZuvn} indicates a colored patch, including four sets of four-component floating-point colors (red, green, blue, and alpha) in the range 0..1, one color for each corner. @var{Nu} and @var{Nv}, each a single digit in the range 1..6, are the patch's polynomial degree in the u and v direction respectively. @var{Nd} is the number of components in each patch vertex, and must be either @code{3} for 3-D or @code{4} for homogeneous coordinates, that is, rational patches. @code{BBP} patches are bicubic patches with 3-D vertices, so @code{BBP} = @code{BEZ333} and @code{STBBP} = @code{BEZ333_ST}. Any number of patches follow the header. Each patch comprises a series of patch vertices, followed by optional (s,t) texture coordinates, followed by optional (r,g,b,a) colors. Each patch has (@var{Nu}+1)*(@var{Nv}+1) vertices in v-major order, so that if we designate a vertex by its control point indices (u,v) the order is @example (0,0) (1,0) (2,0) @dots{} (@var{Nu},0) (0,1) (1,1) (2,1) @dots{} (@var{Nu},1) @dots{} (0,@var{Nv}) @dots{} (@var{Nu},@var{Nv}) @end example @noindent with each vertex containing either 3 or 4 floating-point numbers as specified by the header. If the header calls for ST coordinates, four pairs of floating-point numbers follow: the texture-space coordinates for the (0,0), (@var{Nu},0), (0,@var{Nv}), and (@var{Nu},@var{Nv}) corners of the patch, respectively. If the header calls for colors, four four-component (red, green, blue, alpha) floating-point colors follow, one for each patch corner. The series of patches ends at end-of-file, or with a closebrace if incorporated in an object reference. @comment ---------------------------------------------------------------- @node OFF, VECT, BBP and BEZ, Object File Formats @subsection OFF Files The conventional suffix for @code{OFF} files is @file{.off}. Syntax: @example [ST][C][N][4][n]OFF # Header keyword [@var{Ndim}] # Space dimension of vertices, present only if nOFF @var{NVertices} @var{NFaces} @var{NEdges} # NEdges not used or checked @var{x}[0] @var{y}[0] @var{z}[0] # Vertices, possibly with normals, # colors, and/or texture coordinates, in that order, # if the prefixes @code{N}, @code{C}, @code{ST} # are present. # If 4OFF, each vertex has 4 components, # including a final homogeneous component. # If nOFF, each vertex has @var{Ndim} components. # If 4nOFF, each vertex has @var{Ndim}+1 components. @dots{} @var{x}[@var{NVertices}-1] @var{y}[@var{NVertices}-1] @var{z}[@var{NVertices}-1] # Faces # @var{Nv} = # vertices on this face # @var{v}[0] @dots{} @var{v}[@var{Nv}-1]: vertex indices # in range 0..@var{NVertices}-1 @var{Nv} @var{v}[0] @var{v}[1] @dots{} @var{v}[@var{Nv}-1] @var{colorspec} @dots{} # @var{colorspec} continues past @var{v}[@var{Nv}-1] # to end-of-line; may be 0 to 4 numbers # nothing: default # integer: colormap index # 3 or 4 integers: RGB[A] values 0..255 # 3 or 4 floats: RGB[A] values 0..1 @end example @code{OFF} files (name for "object file format") represent collections of planar polygons with possibly shared vertices, a convenient way to describe polyhedra. The polygons may be concave but there's no provision for polygons containing holes. An @code{OFF} file may begin with the keyword @code{OFF}; it's recommended but optional, as many existing files lack this keyword. Three ASCII integers follow: @var{NVertices}, @var{NFaces}, and @var{NEdges}. Thease are the number of vertices, faces, and edges, respectively. Current software does not use nor check @var{NEdges}; it needn't be correct but must be present. The vertex coordinates follow: dimension * @var{Nvertices} floating-point values. They're implicitly numbered 0 through @var{NVertices}-1. dimension is either 3 (default) or 4 (specified by the key character @code{4} directly before @code{OFF} in the keyword). Following these are the face descriptions, typically written with one line per face. Each has the form @example @var{N} @var{Vert1} @var{Vert2} @dots{} @var{VertN} [@var{color}] @end example @noindent Here @var{N} is the number of vertices on this face, and @var{Vert1} through @var{VertN} are indices into the list of vertices (in the range 0..@var{NVertices}-1). The optional @var{color} may take several forms. Line breaks are significant here: the @var{color} description begins after @var{VertN} and ends with the end of the line (or the next # comment). A @var{color} may be: @table @asis @item nothing the default color @item one integer index into "the" colormap; see below @item three or four integers RGB and possibly alpha values in the range 0..255 @item three or four floating-point numbers RGB and possibly alpha values in the range 0..1 @end table For the one-integer case, the colormap is currently read from the file @file{cmap.fmap} in Geomview's @file{data} directory. Some better mechanism for supplying a colormap is likely someday. The meaning of "default color" varies. If no face of the object has a color, all inherit the environment's default material color. If some but not all faces have colors, the default is gray (R,G,B,A=.666). A @code{[ST][C][N][n]OFF BINARY} format is accepted; @xref{Binary format}. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions (and texture coordinates or vertex colors or normals if @code{COFF}/@code{NOFF}/@code{CNOFF}/@code{STCNOFF}/etc. format). Exception: each face's vertex indices are followed by an integer indicating how many color components accompany it. Face color components must be floats, not integer values. Thus a colorless triangular face might be represented as @example int int int int int 3 17 5 9 0 @end example while the same face colored red might be @example int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0 @end example @comment ---------------------------------------------------------------- @node VECT, SKEL, OFF, Object File Formats @subsection VECT Files The conventional suffix for @code{VECT} files is @file{.vect}. Syntax: @example [4]VECT @var{NPolylines} @var{NVertices} @var{NColors} @var{Nv[0]} @dots{} @var{Nv[NPolylines-1]} # number of vertices # in each polyline @var{Nc[0]} @dots{} @var{Nc[NPolylines-1]} # number of colors supplied # in each polyline @var{Vert[0]} @dots{} @var{Vert[NVertices-1]} # All the vertices # (3*NVertices floats) @var{Color[0]} @dots{} @var{Color[NColors-1]} # All the colors # (4*NColors floats, RGBA) @end example @code{VECT} objects represent lists of polylines (strings of connected line segments, possibly closed). A degenerate polyline can be used to represent a point. A @code{VECT} file begins with the key word @code{VECT} or @code{4VECT} and three integers: @var{NLines}, @var{NVertices}, and @var{NColors}. Here @var{NLines} is the number of polylines in the file, @var{NVertices} the total number of vertices, and @var{NColors} the number of colors as explained below. Next come @var{NLines} @b{16-bit} integers @center @var{Nv[0]} @var{Nv[1]} @var{Nv[2]} @dots{} @var{Nv[NLines-1]} giving the number of vertices in each polyline. A negative number indicates a closed polyline; 1 denotes a single-pixel point. The sum (of absolute values) of the @var{Nv[i]} must equal @var{NVertices}. Next come @var{NLines} more @b{16-bit} integers @var{Nc[i]}: the number of colors in each polyline. Normally one of three values: @table @asis @item 0 No color is specified for this polyline. It's drawn in the same color as the previous polyline. @item 1 A single color is specified. The entire polyline is drawn in that color. @item abs(@var{Nv[i]}) Each vertex has a color. Either each segment is drawn in the corresponding color, or the colors are smoothly interpolated along the line segments, depending on the implementation. @end table Next come @var{NVertices} groups of 3 or 4 floating-point numbers: the coordinates of all the vertices. If the keyword is @var{4VECT} then there are 4 values per vertex. The first abs(@var{Nv[0]}) of them form the first polyline, the next abs(@var{Nv[1]}) form the second and so on. Finally @var{NColors} groups of 4 floating-point numbers give red, green, blue and alpha (opacity) values. The first @var{Nc[0]} of them apply to the first polyline, and so on. A @var{VECT BINARY} format is accepted; @pxref{Binary format}. The binary format exactly follows the ASCII format, with 32-bit Big-Endian integers where ordinary integer numbers appear, and with @b{16-bit} Big-Endian integers where 16-bit integers appear; 32-bit Big-Endian floats where real values appear. @b{BIG FAT NOTE:} The vertex counts @var{Nv[i]} and the color counts @var{Nc[i]} are @b{16-bit} Big-Endian integers. @comment ---------------------------------------------------------------- @node SKEL, SPHERE, VECT, Object File Formats @subsection SKEL Files @code{SKEL} files represent collections of points and polylines, with shared vertices. The conventional suffix for @code{SKEL} files is @file{.skel}. Syntax: @example [C][4][n]SKEL [@var{NDim}] # Vertex dimension, present only if nSKEL @var{NVertices} @var{NPolylines} @var{x}[0] @var{y}[0] @var{z}[0] # Vertices # if 4SKEL, each vertex has 4 components # if nSKEL, each vertex has NDim components # if C[4][n]SKEL vertex coordinates are # followed by an RGBA color specification @dots{} @var{x}[@var{NVertices}-1] @var{y}[@var{NVertices}-1] @var{z}[@var{NVertices}-1] # Polylines # @var{Nv} = # vertices on this polyline (1 = point) # @var{v}[0] @dots{} @var{v}[@var{Nv}-1]: vertex indices # in range 0..@var{NVertices}-1 @var{Nv} @var{v}[0] @var{v}[1] @dots{} @var{v}[@var{Nv}-1] [@var{colorspec}] @dots{} # @var{colorspec} continues past @var{v}[@var{Nv}-1] # to end-of-line; may be nothing, or 3 or 4 numbers. # nothing: default color # 3 or 4 floats: RGB[A] values 0..1 @end example The syntax resembles that of @code{OFF} files, with a table of vertices followed by a sequence of polyline descriptions, each referring to vertices by index in the table. Each polyline has an optional color. For @code{nSKEL} objects, each vertex has @var{NDim} components. For @code{4nSKEL} objects, each vertex has @var{NDim+1} components; the final component is the homogeneous divisor. A @var{[4][n]SKEL BINARY} format is accepted; @xref{Binary format}. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions. Exception: each polyline's vertex indices are followed by an integer indicating how many color components accompany it. Polyline color components must be floats, not integer values. Thus a colorless polyline with 3 vertices might be represented as @example int int int int int 3 17 5 9 0 @end example while the same polyline colored red might be @example int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0 @end example @comment ---------------------------------------------------------------- @node SPHERE, INST, SKEL, Object File Formats @subsection SPHERE Files The conventional suffix for @code{SPHERE} files is @file{.sph}. @example [ST][E|H|S]SPHERE # Keyword # auto-generated texture co-ordinates, only allowed with @emph{ST}SPHERE objects [SINUSOIDAL|CYLINDRICAL|RECTANGULAR|STEREOGRAPHIC|ONEFACE] # next four fields are required @var{Radius} @var{Xcenter} @var{Ycenter} @var{Zcenter} @end example The key word is @code{[ST][E|H|S]SPHERE}. The optional prefix characters mean: @table @samp @item ST The sphere carries automatically generated texture co-ordinates. See below. @item E The sphere lives in Euclidean space. @item H The sphere lives in Hyperbolic space. @xref{Non-Euclidean Geometry}. @item S The sphere lives in spherical space. @xref{Non-Euclidean Geometry}. @end table Sphere objects are drawn using meshes which are rectangular in a polar co-ordinate system, with the equatorial plane parallel to the @code{x,y}-plane. Their smoothness, and the time taken to draw them, depends on the setting of the dicing level, 10x10 by default. From Geomview, the Appearance panel, the @code{ad} keyboard command, or a @code{dice nu nv} Appearance attribute sets this. Texture co-ordinates are generated for @code{STSPHERE} objects; the keyword following the initial @code{STSPHERE} keyword defines the way this is done. It follows the conventions of the @command{mktxmesh} Perl-script which comes with the @emph{Orrery}. @table @var @item SINUSOIDAL sinusoidal equal-area projection @item CYLINDRICAL cylindrical proj: @var{s} is the longitude, @var{t} is the latitude @item RECTANGULAR rectangular proj: @var{s} is the longitude, @var{t} is @code{sin(latitude)} (i.e. @code{z} co-ordinate in the sphere's co-ordinate system) @item STEREOGRAPHIC stereographic projection from the south (@code{z=-1}) pole @item ONEFACE stretch orthographic view of @code{+y} hemisphere over both, mirroring @end table @comment ---------------------------------------------------------------- @node INST, LIST, SPHERE, Object File Formats @subsection INST Files The conventional suffix for a @code{INST} file is @file{.inst}. There is no INST BINARY format. An @code{INST} applies a 4x4 (or @var{(N+1)}x@var{(N+1)} in the context of ND-viewing) transformation to another OOGL object. It begins with @code{INST} followed by these sections which may appear in any order: @example geom @var{oogl-object} @end example @noindent specifies the OOGL object to be instantiated. @xref{References}, for the syntax of an @var{oogl-object}. The keyword @code{unit} is a synonym for @code{geom}. @example transform ["@{"] @code{4x4 transform} ["@}"] @end example @noindent specifies a single transformation matrix. Either the matrix may appear literally as 16 numbers, or there may be a reference to a "transform" object, i.e. @example "<" file-containing-4x4-matrix @end example or @example ":" symbol-representing-transform-object @end example Another way to specify the transformation is @example transforms @var{oogl-object} @end example The @var{oogl-object} must be a @code{TLIST} object (list of transformations) object, or a @code{LIST} whose members are ultimately @code{TLIST} objects. In effect, the @code{transforms} keyword takes a collection of 4x4 matrices and replicates the @code{geom} object, making one copy for each 4x4 matrix. If no @code{transform} nor @code{transforms} keyword appears, no transformation is applied (actually the identity is applied). You could use this for, e.g., wrapping an appearance around an externally-supplied object, though a single-membered LIST would do this more efficiently. @xref{Transformation matrices}, for the matrix format. When replicating a single geometry by means of a @code{TLIST} object (see @samp{transforms} above) it may be useful to transform texture co-ordinates by another list of transformations; that list can be specified by @example txtransforms @var{TLIST-object} @end example The number of texture transformations must match the number of geometry transformations. The @code{SPHERE} object (@pxref{SPHERE, Sphere Objects}) uses this technique to generate an entire textured sphere out of some fraction of a sphere (usually one octant). A single @var{(N+1)}-dimensional transformation can be specified by @example ntransform ["@{"] @var{N+1} @var{N+1} @code{(N+1)x(N+1) floats} ["@}"] @end example @noindent This gives a single @var{N+1}-dimensional transformation matrix. Either the matrix may appear literally as @var{(N+1)}x@var{(N+1)} numbers, or there may be a reference to an @samp{ntransform} object, i.e. @example "<" file-containing-@var{(N+1)}x@var{(N+1)}-matrix @end example or @example ":" symbol-representing-ntransform-object @end example @xref{ND Transformation matrices}, for the matrix format. Two more INST fields are accepted: @code{location} and @code{origin}. Note that @code{location} as well as @code{origin} are ignored if this @code{INST} object carries an @code{ntransform}. Also, if ND-viewing is active (@code{ND-axes} command, @pxref{GCL}) then @code{INST} objects with @code{origin} unequal to @code{local} will not be drawn, though the @code{location} stuff may work (or not). @example location [global or camera or ndc or screen or local] @end example Normally an INST specifies a position relative to its parent object; the @code{location} field allows putting an object elsewhere. @itemize @bullet @item @code{location global} attaches the object to the global (a.k.a. universe) coordinate system -- the same as that in which geomview's World objects, alien geometry, and cameras are placed. @item @code{location camera} places the object relative to the camera. (Thus if there are multiple views, it may appear in a different spatial position in each view.) The center of the camera's view is along its negative Z axis; positive X is rightward, positive Y upward. Normally the units of camera space are the same as global coordinates. When a camera is reset, the global origin is at (0,0,-3.0). @item @code{location ndc} places the object relative to the normalized unit cube into which the camera's projection (perspective or orthographic) maps the visible world. X, Y, and Z are each in the range from -1 to +1, with Z = -1 the near and Z = +1 the far clipping plane, and X and Y increasing rightward and upward respectively. Thus something like @example INST transform 1 0 0 0 0 1 0 0 0 0 1 0 -.9 -.9 -.999 1 location ndc geom < label.vect @end example pastes @code{label.vect} onto the lower left corner of each window, and in front of nearly everything else, assuming @code{label.vect}'s contents lie in the positive quadrant of the X-Y plane. It's tempting to use -1 rather than -.999 as the Z component of the position, but that may put the object just nearer than the near clipping plane and make it (partially) invisible, due to floating-point error. @item @code{location screen} places the object in screen coordinates. The range of Z is still -1 through +1 as for ndc coordinates; X and Y are measured in pixels, and range from (0,0) at the @emph{lower left} corner of the window, increasing rightward and upward. @end itemize @code{location local} is the default; the object is positioned relative to its parent. @example origin [global or camera or ndc or screen or local] x y z @end example The @code{origin} field translates the contents of the INST to place the origin at the specified point of the given coordinate system. Unlike @code{location}, it doesn't change the orientation, only the choice of origin. Both @code{location} and @code{origin} can be used together. So for example @example @{ INST location screen origin ndc 0 0 -.99 geom @{ < xyz.vect @} transform @{ 100 0 0 0 0 100 0 0 0 0 -.009 0 0 0 0 1 @} @} @end example places xyz.vect's origin in the center of the window, just beyond the near clipping plane. The unit-length X and Y edges are scaled to be just 100 screen units -- pixels -- long, regardless of the size of the window. @menu * INST Examples:: Some example of @code{INST} Files. @end menu @comment ................................................................ @node INST Examples, , INST, INST @subsubsection INST Examples Here are some examples of @code{INST} files @example INST unit < xyz.vect transform @{ 1 0 0 0 0 1 0 0 0 0 1 0 1 3 0 1 @} @end example @example @{ appearance @{ +edge material @{ edgecolor 1 1 0 @} @} INST geom < mysurface.quad @} @end example @example @{INST transform @{: T@} geom @{ @} @} geom @{ # stuff replicated by all the above matrices @dots{} @} @} @end example This one resembles the @code{origin} example in the section above, but makes the X and Y edges be 1/4 the size of the window (1/4, not 1/2, since the range of ndc X and Y coordinates is -1 to +1). @example @{ INST location ndc geom @{ < xyz.vect @} transform @{ .5 0 0 0 0 .5 0 0 0 0 -.009 0 0 0 -.99 1 @} @} @end example @comment ---------------------------------------------------------------- @node LIST, TLIST, INST, Object File Formats @subsection LIST Files The conventional suffix for a @code{LIST} file is @file{.list}. A list of OOGL objects Syntax: @example LIST @var{oogl-object} @var{oogl-object} @dots{} @end example Note that there's no explicit separation between the oogl-objects, so they should be enclosed in curly braces (@{ @}) for sanity. Likewise there's no explicit marker for the end of the list; unless appearing alone in a disk file, the whole construct should also be wrapped in braces, as in: @example @{ LIST @{ QUAD @dots{} @} @{ < xyz.quad @} @} @end example A @code{LIST} with no elements, i.e. @code{@{ LIST @}}, is valid, and is the easiest way to create an empty object. For example, to remove a symbol's definition you might write @example @{ define somesymbol @{ LIST @} @} @end example @comment ---------------------------------------------------------------- @node TLIST, GROUP, LIST, Object File Formats @subsection TLIST Files The conventional suffix for a @code{TLIST} file is @file{.grp} ("group") or or @file{.prj} ("projective" matrices). Collection of 4x4 matrices, used in the @code{transforms} section of and @code{INST} object. Syntax: @example TLIST # key word <4x4 matrix (16 floats)> @dots{} # Any number of 4x4 matrices @end example @code{TLIST}s are used only within the @code{transforms} clause of an @code{INST} object. They cause the @code{INST}s @code{geom} object to be instantiated once under each of the transforms in the @code{TLIST}. The effect is like that of a @code{LIST} of @code{INST}s each with a single transform, and all referring to the same object, but is more efficient. Be aware that a @code{TLIST} is a kind of geometry object, distinct from a @code{transform} object. Some contexts expect one type of object, some the other. For example in @example INST transform @{ : @var{myT} @} geom @{ @dots{} @} @end example @noindent @var{myT} must be a transform object, which might have been created with the GCL @example (read transform @{ define myT 1 0 0 1 @dots{} @}) @end example @noindent while in @example INST transforms @{ : @var{myTs} @} geom @{ @dots{} @} or INST transforms @{ LIST @{: @var{myTs}@} @{< more.prj@} @} geom @{ @dots{} @} @end example @noindent @var{myTs} must be a geometry object, defined e.g. with @example (read geometry @{ define @var{myTs} @{ TLIST 1 0 0 1 @dots{} @} @}) @end example A @code{TLIST BINARY} format is accepted. Binary data begins with a 32-bit integer giving the number of transformations, followed by that number of 4x4 matrices in 32-bit floating-point format. The order of matrix elements is the same as in the ASCII format. @comment ---------------------------------------------------------------- @node GROUP, DISCGRP, TLIST, Object File Formats @subsection GROUP Files This format is obsolete, but is still accepted. It combined the functions of @code{INST} and @code{TLIST}, taking a series of transformations and a single Geom (@code{unit}) object, and replicating the object under each transformation. @example GROUP @dots{} < matrices > @dots{} unit @{ @var{oogl-object} @} @end example is still accepted and effectively translated into @example INST transforms @{ TLIST @dots{} @dots{} @} unit @{ @var{oogl-object} @} @end example @comment ---------------------------------------------------------------- @node DISCGRP, COMMENT, GROUP, Object File Formats @subsection DISCGRP Files This format is for discrete groups, such as appear in the theory of manifolds or in symmetry patterns. This format has its own man page. See discgrp(5). @comment ---------------------------------------------------------------- @node COMMENT, , DISCGRP, Object File Formats @subsection COMMENT Objects The COMMENT object is a mechanism for encoding arbitrary data within an OOGL object. It can be used to keep track of data or pass data back and forth between external modules. Syntax: @example COMMENT # key word @var{name} @var{type} # individual name and type specifier @{ @dots{} @} # arbitrary data @end example The data, which must be enclosed by curly braces, can include anything except unbalanced curly braces. The @var{type} field can be used to identify data of interest to a particular program through naming conventions. @code{COMMENT} objects are intended to be associated with other objects through inclusion in a @code{LIST} object. (@xref{LIST}.) The "#" OOGL comment syntax does not suffice for data exchange since these comments are stripped when an OOGL object is read in to Geomview. The @code{COMMENT} object is preserved when loaded into Geomview and is written out intact. Here is an example associating a WorldWide Web URL with a piece of geometry: @example @{ LIST @{ < Tetrahedron@} @{COMMENT GCHomepage HREF @{ http://www.geomview.org/ @}@} @} @end example A binary @code{COMMENT} format is accepted. Its format is not consistent with the other OOGL binary formats. @xref{Binary format}. The @code{name} and @code{type} are followed by @example @var{N} @var{Byte1} @var{Byte2} @dots{} @var{ByteN} @end example instead of data enclosed in curly braces. @comment ================================================================ @node Non-geometric objects, , Object File Formats, OOGL File Formats @section Non-geometric objects The syntax of these objects is given in the form used in @xref{References}, where "quoted" items should appear literally but without quotes, square bracketed ([ ]) items are optional, and | separates alternative choices. @menu * appearance:: Appearance objects. * image:: Image objects. * transform:: Transformation matrices. * ntransform:: N-dimensional transformation matrices. * camera:: Cameras. * window:: Windows. @end menu @comment ---------------------------------------------------------------- @node appearance, image, Non-geometric objects, Non-geometric objects @subsection Appearance Objects Appearances are OOGL objects of their own right, which simply means that it is possible to give them symbolic names (@pxref{References}). There are other sections dealing with appearance details. @xref{Appearances}. @node image, transform, appearance, Non-geometric objects @subsection Image Objects Image objects are used to specify pixmap data for either textures (@pxref{Texture Mapping}), or for background images of cameras (@pxref{camera, Camera objects}). At the time of this writing images are comprised of 1 to 4 channels, a channel provides a single number in the range from 0 to @code{maxval} for each pixel; and @code{maxval} is tied to 255. The interpretation of the image data depending on the number of channels is like follows: @multitable @columnfractions 0.2 0.2 0.6 @headitem #Channels @tab Channel No. @tab Interpretation @item 1 @tab 1 @tab greyscale or luminance data @item 2 @tab 1 @tab greyscale or luminance data @item @code{ } @tab 2 @tab alpha channel (0: transparent, @code{maxval}: opaque) @item 3 @tab 1 @tab red channel @item @code{} @tab 2 @tab green channel @item @code{} @tab 3 @tab blue channel @item 4 @tab 1 @tab red channel @item @code{} @tab 2 @tab green channel @item @code{} @tab 3 @tab blue channel @item @code{} @tab 4 @tab alpha channel (0: transparent, @code{maxval}: opaque) @end multitable Image data can be specified inline (embedded into the current data stream) or via file references; in both cases the data is read in and interpreted at the time the image object is parsed. @emph{This is different from the old (and deprecated) texture image specification, where the the image data on-disk would eventually be re-read by Geomview}. The general syntax of image objects is like follows: @example ::= [ "@{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "image" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines an image named , setting its value from the stuff which follows) | "<" (meaning: read image from that file) | ":" (meaning: use variable @var{name}, defined elsewhere; if undefined the image carries no data) | (actual stuff defining the image; image data must come last, after defining the width and height and number of channels) "width" (width of the image, auto-detected from image data if possible) "height" (height of the image, auto-detected from image data if possible) "channels" (number of channels, auto-detected from image data and @code{data} specifications, if possible) "maxval" (unsupported, must be @code{255} if specified) "data DESTMASK [FILTER] [@{] < FILENAME [@}]" "data DESTMASK [FILTER] DATASIZE [@{][\n]LITERAL_IMAGE_DATA[@}]" (either external or embedded image data, see below for a detailed description of the meaning of @emph{MASK} and @emph{FILTER}. An image can (and has, in general) multiple data sections.) [ "@}" ] (matching curly brace) @end example @b{Details concerning the image data specification:} @table @samp @item DESTMASK This is a bit-field describing where the specified image data should be placed in the destination pixmap. The bit-field is specified by an integer in one of the known formats (decimal, octal, hexadecimal). The channels of the source data are always enumbered consecutively. If, e.g. @samp{FILENAME} or @samp{LITERAL_IMAGE_DATA} specify a three-channel (probably RGB @dots{}) image and @samp{DESTMASK} equals @code{0xD} (i.e. bit 1 is 0), then the 3rd channel of the source pixmap would be placed in the 4th channel of the destination image object (the alpha channel), the 2nd source channel would determine the @samp{blue} destination value and the 1st source channel the @samp{red} destination value. The number of channels of the source data always has to match the number of bits set in @samp{DESTMASK}. @b{Exception:} if the source pixmap has only one channel, then it can be used to fill any number of destination channels; all channels specified in @samp{DESTMASK} are filled with the data of the single channel source pixmap. Geomview knows the following symbolic constants, which can be used instead of specifying the @samp{DESTMASK} bit-field numerically: @table @code @item LUMINANCE same as @samp{1}, @samp{0x1}, @samp{\01} @item LUMINANCE_ALPHA same as @samp{3}, @samp{0x3}, @samp{\03} @item RGB same as @samp{7}, @samp{0x7}, @samp{\07} @item RGBA same as @samp{15}, @samp{0xf}, @samp{\017} @item ALPHA depends on the context: the absolute number of channels must be known; i.e. @samp{data ALPHA @dots{}} must be prepended by something determining the number of channels of the image, e.g. @example ... data RGB ... data ALPHA ... @end example is valid, but @example data ALPHA ... @end example is not valid, because Geomview has not means to determine the destination channel from the context. @item AUTO PGM image data is interpreted as single grey-scale channel, RGB PNM data as RGB image data. @code{AUTO} cannot work with @samp{raw} image data. @end table @item FILTER The @samp{FILTER} specification is optional. If it is missing, then Geomview tries to determine the image type from the @samp{FILENAME} suffix. If there is no suffix or the suffix is unknown, or for embedded image data, Geomview is able to auto-detectc SGI image file formats (for historical reasons @dots{}) and NetPBM image formats (for practical reasons). The auto-detection of NetPBM formats includes the new @dfn{PAM} image format which allows (among other things) to store an alpha channel together with the luminance or RGB data. Likewise, the final output of any of the specified filters must either be in SGI image file format, or specify a PAM, PNM or PGM image. If the image file format cannot be determined by either the filenmae suffix or the filter specification or by auto-deteciong of SGI or NetPBM data, then Geomview assume that it is raw-data. See below. The decompression filters may be prepended to either one of the know image formats or an explicitly specified filter, e.g. the following is valid: @example data LUMINANCE raw.gzip @{ < gzippedgreymapfile @} @end example The above should be equivalent to @example data LUMINANCE raw @{ < greymapfile @}, @end example provided that the decompressed data carries single channel data, with the first pixel corresponding to the lower-left corner (because of the @samp{raw} image format, see below). Geomview has builtin knowledge for the following filters/suffixes: @table @b @item Data Decompression @table @samp @item z @item gz @item gzip data is piped through @samp{gzip -dc} @item bz2 @item bzip2 data is piped through @samp{bzip2 -dc} @end table @item Image Formats @table @samp @item tiff @item tif @code{TIFF} image file format. Only supported if the @code{tifftopnm} executable can be fond in the current excution path. @item png @code{PNG} image file format. Only supported if the @code{pngtopnm} executable can be fond in the current excution path. @item jpg @item jpeg @code{JPEG} image file format. Only supported if the @code{jpegtopnm} executable can be fond in the current excution path. @item gif @code{GIF} image file format. Only supported if the @code{giftoppm} executable can be fond in the current excution path. @item raw Raw image data; the number of channels must match the number of bits set in @samp{DESTMASK}. Pixels are specified with 1 byte per channel. The pixels are organized in rows as @samp{liminance[-alpha]} or @samp{RGB[A]} samples. The left-most pixel is the first pixel in each data-row, the top-most image row must come first (this is just the same as the NetPBM convention, the image co-ordinate systems has its origin in the left/top corner, as usual). @end table @item Explicitly Specified Filters If none of the suffixes specified above should match, then the suffix/filter is interpreted as an external filter program; the filter program must read from @code{STDIN} and write to @code{STDOUT}. The output must either be in SGI image format, or in PNM or PGM format. Otherwise the output data is interpreted as raw image data (see above). Something like the following should work, provided that the program @file{$@{HOME@}/bin/bububfilter} exists, is executable and does something useful: @example ... data RGB "$@{HOME@}/bin/bububfilter.bzip2" 7 @{ # binary data follows bububub @} ... @end example Note that -- prior to feeding the data to the @samp{bububfilter} -- Geomview will try to decompress the stuff with @samp{bzip2 -dc}. @end table @end table @b{Missing image data:} Normally, the number of image channels is determined automatically from the image @code{data} specifications; if the image specification carries an explicit number of channels via the @code{channels} keyword which exceeds the number of channels found in the image @code{data} specifications, or if the union of all @samp{DESTMASK} specfications has holes, then missing luminance and RGB channels are initialized to 0, and a missing alpha-channel is initialized to @code{maxval}, i.e. omitting the alpha channel data for an RGBA image is just the same as defining an RGB image. @node transform, ntransform, image, Non-geometric objects @subsection Transform Objects Where a single 4x4 matrix is expected -- as in the @code{INST} @code{transform} field, the camera's @code{camtoworld} transform and the Geomview @code{xform*} commands -- use a transform object. Note that a transform is distinct from a @code{TLIST}, which is a type of geometry. @code{TLIST}s can contain one or more 4x4 transformations; "transform" objects must have exactly one. Why have both? In many places -- e.g. camera positioning -- it's only meaningful to have a single transform. Using a separate object type enforces this. Syntax for a transform object is @example ::= [ "@{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "transform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) (interpreted as a 4x4 homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "@}" ] (matching curly brace) @end example The whole should be enclosed in @{ braces @}. Braces are not essential if exactly one of the above items is present, so e.g. a 4x4 array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used: @example # Example 1: A GCL command to define a transform # called "fred" (read transform @{ transform define fred 1 0 0 0 0 1 0 0 0 0 1 0 -3 0 1 1 @} ) @end example @example # Example 2: A camera object using transform # "fred" for camera positioning # Given the definition above, this puts the camera at # (-3, 0, 1), looking toward -Z. @{ camera halfyfield 1 aspect 1.33 camtoworld @{ : fred @} @} @end example @comment ---------------------------------------------------------------- @node ntransform, camera, transform, Non-geometric objects @subsection ND-Transform Objects Where -- in the context of ND-viewing -- a single (N+1)x(N+1) matrix is expected -- as in the @code{INST} @code{ntransform} field, or the @code{ND-xform*} (@pxref{GCL}) commands -- use an @code{ntransform} object. @code{ntransform} are @var{NRows} x @var{NCols} transformation matrix where usually @var{NRows} = @var{N+1} in the context of @var{N}-dimensional objects and viewing. The homogeneous component of an @code{ntransform} sits at column zero (in contrast to ordinary @code{transform} objects where it is located at column three). @code{ntransform} objects operate on points of any dimension: if a point is to be transformed by an @code{ntransform} object and the dimension of the point does not match the number of rows of the @code{ntransform} object, then either the point is implicitly padded with zeros to match @var{NRows} or the matrix is implicitly padded with ones down its diagonal (and zeros everywhere else) such that it will operate as identity on the excess dimensions of the input point. Syntax for an @code{ntransform} object is @example ::= [ "@{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "ntransform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) @var{NRows} @var{NCols} (number of rows and columns of the matrix, typically @var{N+1} @var{N+1}, but any dimensions are possible) <@var{NRows} x @var{NCols} floating-point numbers> (interpreted as a @var{NRows} x @var{NCols} homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the @b{top} row -- in contrast to the ordinary transform objects where the translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "@}" ] (matching curly brace) @end example The whole should be enclosed in @{ braces @}. Braces are not necessarily essential, so e.g. two integers -- @var{NRows} @var{NCols} -- followed by a @var{NRows} x @var{NCols} array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used: @example # Example 1: A GCL command to define a @code{6x6} transform called # "fred", a mere translation by the vector @code{-3 0 1 1 0}. This # transform is meant for a five dimensional space, with an homogeneous # component a index zero. (read ntransform @{ ntransform define fred 6 6 1 -3 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 @} ) @end example @example # Example 2: Set the ND-xform of an object -- a geometry or a camera # cluster. Given the definition above, this puts the object at (-3 0 1 1 # 0) in the five dimensional space. (ND-xform-set focus : fred) # or (ND-xform-set g1 : fred) @end example @comment ---------------------------------------------------------------- @node camera, window, ntransform, Non-geometric objects @subsection cameras A camera object specifies the following properties of a camera: @table @asis @item position and orientation specified by either a camera-to-world or world-to-camera transformation; this transformation does not include the projection, so it's typically just a combination of translation and rotation. Specified as a transform object, typically a 4x4 matrix. @item "focus" distance Intended to suggest a typical distance from the camera to the object of interest; used for default camera positioning (the camera is placed at (X,Y,Z) = (0,0,focus) when reset) and for adjusting field-of-view when switching between perspective and orthographic views. @item window aspect ratio True aspect ratio in the sense /. This normally should agree with the aspect ratio of the camera's window. Geomview normally adjusts the aspect ratio of its cameras to match their associated windows. @item near and far clipping plane distances Note that both must be strictly greater than zero. Very large / distance ratios cause Z-buffering to behave badly; part of an object may be visible even if somewhat more distant than another. @item field of view Specified in either of two forms. @table @samp @item fov is the field of view -- in degrees if perspective, or linear distance if orthographic -- in the @emph{shorter} direction. @item halfyfield is half the projected Y-axis field, in world coordinates (not angle!), at unit distance from the camera. For a perspective camera, halfyfield is related to angular field: @center halfyfield = tan( Y_axis_angular_field / 2 ) while for an orthographic one it's simply: @center halfyfield = Y_axis_linear_field / 2 @end table This odd-seeming definition is (a) easy to calculate with and (b) well-defined in both orthographic and perspective views. @item background color Arguably not a property of a camera, but of the scene. Nevertheless, as there is no "background" OOGL object, and the background color should not be a property of the drawing device, it can be specified here. At the time of this writing, however, the GUI always overrides the background color with its own settings. @item background image Same reasoning as above, only that the GUI does not override this setting. The image is centered at NDC co-ordinates @code{(0,0,-1)}; it is not resized, just painted behind everything else as is. @xref{image, Image objects}. @end table The syntax for a camera is: @example ::= [ "camera" ] (optional keyword) [ "@{" ] (opening brace, generally required) [ "define" ] "<" | ":" | (or any number of the following, in any order@dots{}) "perspective" @{"0" | "1"@} (default 1) (otherwise orthographic) "stereo" @{"0" | "1"@} (default 0) (otherwise mono) "worldtocam" (see transform syntax above) "camtoworld" (no point in specifying both camtoworld and worldtocam; one is constrained to be the inverse of the other) "halfyfield" (default tan 40/2 degrees) "fov" (angular field-of-view if perspective, linear field-of-view otherwise. Measured in whichever direction is smaller, given the aspect ratio. When aspect ratio changes -- e.g. when a window is reshaped -- "fov" is preserved.) "frameaspect" (X/Y) (default 1.333) "near" (default 0.1) "far" (default 10.0) "focus" (default 3.0) "bgcolor" (default 1/3 1/3 1/3 1) "bgimage" @{ @} (default no background image) [ "@}" ] (matching closebrace) @end example @comment ---------------------------------------------------------------- @node window, , camera, Non-geometric objects @subsection window A window object specifies size, position, and other window-system related information about a window in a device-independent way. The syntax for a window object is: @example window ::= [ "window" ] (optional keyword) [ "@{" ] (curly brace, often required) (any of the following, in any order) "size" (size of the window) "position" (position & size) "noborder" (specifies the window should have no window border) "pixelaspect" (specifies the true visual aspect ratio of a pixel in this window in the sense xsize/ysize, normally 1.0. For stereo hardware which stretches the display vertically by a factor of 2, ``pixelaspect 0.5'' might do. The value is used when computing the projection of a camera associated with this window.) [ "@}" ] (matching closebrace) @end example Window objects are used in the Geomview @code{window} and @code{ui-panel} commands to set default properties for future windows or to change those of an existing window. @xref{window, @code{(window @dots{})}}. @xref{ui-panel, @code{(ui-panel @dots{})}}. @comment **************************************************************** @node Customization, Modules, OOGL File Formats, Top @chapter Customization: @file{.geomview} files When Geomview is started, it loads and executes commands in a system-wide startup file named @file{.geomview}. This file is in the @file{data} subdirectory of the Geomview distribution directory and contains GCL commands to configure Geomview in a way common to all users on the system. Next, Geomview looks for the file @file{~/.geomview} (@file{~} stands for your home directory). You can use this to configure your own default Geomview behavior to suit your tastes. After reading @file{~/.geomview}, Geomview looks for a file named @file{.geomview} in the current directory. If such a file exists Geomview reads it, unless it is the same as @file{~/.geomview} (which would be the case if you are running Geomview from your home directory). You can use the current directory's @file{.geomview} to create a Geomview customization specific to a certain project. You can use @file{.geomview} files to control all kinds of things about Geomview. They can contain any valid GCL statements. Especially useful is the @code{ui-panel} command which controls the initial placement of Geomview's panels. For an example see the system-wide @file{.geomview} file mentioned above. @xref{GCL}. @xref{ui-panel, @code{(ui-panel @dots{})}}. It is a good idea to enclose all the commands you put in a @file{.geomview} file in a @code{progn} statement in order to cause Geomview to execute them all at once. Otherwise Geomview might execute them sequentially over the first few refresh cycles after starting up. To change, e.g. the focus policy of the camera window such that they pick up the focus policy of the window manager (instead of being activated when the mouse cursor crosses the window), you could put the following in your @file{~/.geomview} file: @example (progn (ui-cam-focus focus-change) @dots{} # other stuff ) @end example You can put any valid @code{GCL} command into your @file{.geomview} files,@pxref{GCL}. @xref{progn,@code{(progn @dots{})}}. @xref{ui-cam-focus,@code{(ui-cam-focus @dots{})}}. @comment **************************************************************** @node Modules, GCL, Customization, Top @chapter External Modules An external module is a program that interacts with Geomview. A module communicates with Geomview through GCL and can control any apsect of Geomview that you can control through Geomview's user interface. In many cases an external module is a specialized program that implements some mathematical algorithm that creates a geometric object that changes shape as the algorithm progresses. The module informs Geomview of the new object shape at each step, so the object appears to evolve with time in the Geomview window. In this way Geomview serves as a @emph{display engine} for the module. An external module may be interactive. It can respond to mouse and keyboard events that take place in a Geomview window, thus extending the capability of Geomview itself. @menu * Interface:: How External Modules Interface with Geomview. * Example1:: Simple External Module. * Example2:: Simple External Module with FORMS Control Panel. * XForms:: The XForms library. * Example3:: External Module with Bi-Directional Communication. * Example4:: Simple Tcl/Tk Module Demonstrating Picking. * Module Installation:: Module Installation. @end menu @node Interface, Example1, Modules, Modules @section How External Modules Interface with Geomview External modules appear in the @emph{Modules} browser in Geomview's @emph{Main} panel. To run a module, click the left mouse button on the module's entry in the browser. While the module is running, an additional line for that module will appear in red in the browser. This line begins with a number in brackets, which indicates the @emph{instace} number of the module. (For some modules it makes sense to have more than one instance of the module running at the same time.) You can kill an external module by clicking on its red instance entry. By default when Geomview starts, it displays all the modules that have been installed on your system. For instructions on installing a module on your system so that it will appear in the @emph{Modules} browser every time Geomview is run by anyone on your system, @xref{Module Installation}. When Geomview invokes an external module, it creates pipes connected to the module's standard input and output. (Pipes are like files except they are used for communication between programs rather than for storing things on a disk.) Geomview interprets anything that the module writes to its standard output as a GCL command. Likewise, if the external module requests any data from Geomview, Geomview writes that data to the module's standard input. Thus all a module has to do in order to communicate with Geomview is write commands to standard output and (optionally) receive data on standard input. Note that this means that the module cannot use standard input and output for communicating with the user. If a module needs to communicate with the user it can do so either through a control panel of its own or else by responding to certain events that it finds out about from Geomview. @node Example1, Example2, Interface, Modules @section Example 1: Simple External Module This section gives a very simple external module which displays an oscillating mesh. To try out this example, make a copy of the file @file{example1.c} (it is distributed with Geomview in the @file{doc} subdirectory) in your directory and compile it with the command @example cc -o example1 example1.c -lm @end example Then put the line @example (emodule-define "Example 1" "./example1") @end example @noindent in a file called @file{.geomview} in your current directory. Then invoke Geomview; it is important that you compile the example program, create the @file{.geomview} file, and invoke Geomview all in the same directory. You should see "Example 1" in the @emph{Modules} browser of Geomview's @emph{Main} panel; click on this entry in the browser to start the module. A surface should appear in your camera window and should begin oscillating. You can stop the module by clicking on the red "[1] Example 1" line in the @emph{Modules} browser. @example @comment #include "example1.c" /* * example1.c: oscillating mesh * * This example module is distributed with the Geomview manual. * If you are not reading this in the manual, see the "External * Modules" chapter of the manual for more details. * * This module creates an oscillating mesh. */ #include #include /* F is the function that we plot */ float F(x,y,t) float x,y,t; @{ float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); @} main(argc, argv) char **argv; @{ int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t, dt; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Geomview setup. We begin by sending the command * (geometry example @{ : foo@}) * to Geomview. This tells Geomview to create a geom called * "example" which is an instance of the handle "foo". */ printf("(geometry example @{ : foo @})\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) @{ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); @} @} /* UpdateMesh sends one mesh iteration to Geomview. This consists of * a command of the form * (read geometry @{ define foo * MESH * ... * @}) * where ... is the actual data of the mesh. This command tells * Geomview to make the value of the handle "foo" be the specified * mesh. */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; @{ int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry @{ define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include #include /* for struct timeval below */ #include "forms.h" /* for FORMS library */ FL_FORM *OurForm; FL_OBJECT *VelocitySlider; float dt; /* F is the function that we plot */ float F(x,y,t) float x,y,t; @{ float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); @} /* SetVelocity is the slider callback procedure; FORMS calls this * when the user moves the slider bar. */ void SetVelocity(FL_OBJECT *obj, long val) @{ dt = fl_get_slider_value(VelocitySlider); @} /* Quit is the "Quit" button callback procedure; FORMS calls this * when the user clicks the "Quit" button. */ void Quit(FL_OBJECT *obj, long val) @{ exit(0); @} /* create_form_OurForm() creates the FORMS panel by calling a bunch of * procedures in the FORMS library. This code was generated * automatically by the FORMS designer program; normally this code * would be in a separate file which you would not edit by hand. For * simplicity of this example, however, we include this code here. */ create_form_OurForm() @{ FL_OBJECT *obj; FL_FORM *form; OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0); obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,""); VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0, 340.0,40.0,"Velocity"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_object_align(obj,FL_ALIGN_TOP); fl_set_call_back(obj,SetVelocity,0); obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_call_back(obj,Quit,0); fl_end_form(); @} main(argc, argv) char **argv; @{ int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t; int fdmask; static struct timeval timeout = @{0, 200000@}; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Forms panel setup. */ foreground(); create_form_OurForm(); fl_set_slider_bounds(VelocitySlider, 0.0, 1.0); fl_set_slider_value(VelocitySlider, dt); fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2"); /* Geomview setup. */ printf("(geometry example @{ : foo @})\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) @{ fdmask = (1 << fileno(stdin)) | (1 << qgetfd()); select(qgetfd()+1, &fdmask, NULL, NULL, &timeout); fl_check_forms(); UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); @} @} /* UpdateMesh sends one mesh iteration to Geomview */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; @{ int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry @{ define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include "lisp.h" /* We use the OOGL lisp library */ #include "pickfunc.h" /* for PICKFUNC below */ #include "3d.h" /* for 3d geometry library */ /* boxstring gives the OOGL data to define the little box that * we draw at the pick point. NOTE: It is very important to * have a newline at the end of the OFF object in this string. */ char boxstring[] = "\ INST\n\ transform\n\ .04 0 0 0\n\ 0 .04 0 0\n\ 0 0 .04 0\n\ 0 0 0 1\n\ geom\n\ OFF\n\ 8 6 12\n\ \n\ -.5 -.5 -.5 # 0 \n\ .5 -.5 -.5 # 1 \n\ .5 .5 -.5 # 2 \n\ -.5 .5 -.5 # 3 \n\ -.5 -.5 .5 # 4 \n\ .5 -.5 .5 # 5 \n\ .5 .5 .5 # 6 \n\ -.5 .5 .5 # 7 \n\ \n\ 4 0 1 2 3\n\ 4 4 5 6 7\n\ 4 2 3 7 6\n\ 4 0 1 5 4\n\ 4 0 4 7 3\n\ 4 1 2 6 5\n"; progn() @{ printf("(progn\n"); @} endprogn() @{ printf(")\n"); fflush(stdout); @} Initialize() @{ extern LObject *Lpick(); /* This is defined by PICKFUNC below but must */ /* be used in the following LDefun() call */ LInit(); LDefun("pick", Lpick, NULL); progn(); @{ /* Define handle "littlebox" for use later */ printf("(read geometry @{ define littlebox @{ %s @}@})\n", boxstring); /* Express interest in pick events; see Geomview manual for explanation. */ printf("(interest (pick world * * * * nil nil nil nil nil))\n"); /* Define "pick" object, initially the empty list (= null object). * We replace this later upon receiving a pick event. */ printf("(geometry \"pick\" @{ LIST @} )\n"); /* Make the "pick" object be non-pickable. */ printf("(pickable \"pick\" no)\n"); /* Turn off normalization, so that our pick object will appear in the * right place. */ printf("(normalization \"pick\" none)\n"); /* Don't draw the pick object's bounding box. */ printf("(bbox-draw \"pick\" off)\n"); @} endprogn(); @} /* The following is a macro call that defines a procedure called * Lpick(). The reason for doing this in a macro is that that macro * encapsulates a lot of necessary stuff that would be the same for * this procedure in any program. If you write a Geomview module that * wants to know about user pick events you can just copy this macro * call and change the body to suit your needs; the body is the last * argument to the macro and is delimited by curly braces. * * The first argument to the macro is the name of the procedure to * be defined, "Lpick". * * The next two arguments are numbers which specify the sizes that * certain arrays inside the body of the procedure should have. * These arrays are used for storing the face and path information * of the picked object. In this module we don't care about this * information so we declare them to have length 1, the minimum * allowed. * * The last argument is a block of code to be executed when the module * receives a pick event. In this body you can refer to certain local * variables that hold information about the pick. For details see * Example 3 in the Extenal Modules chapter of the Geomview manual. */ PICKFUNC(Lpick, 1, 1, @{ handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge); @}, /* version for picking Nd-objects (not documented here) */) handle_pick(picked, p, vert, v, edge, e) int picked; /* was something actually picked? */ int vert; /* was the pick near a vertex? */ int edge; /* was the pick near an edge? */ HPoint3 *p; /* coords of pick point */ HPoint3 *v; /* coords of picked vertex */ HPoint3 e[2]; /* coords of endpoints of picked edge */ @{ Normalize(&e[0]); /* Normalize makes 4th coord 1.0 */ Normalize(&e[1]); Normalize(p); progn(); @{ if (!picked) @{ printf("(geometry \"pick\" @{ LIST @} )\n"); @} else @{ /* * Put the box in place, and color it magenta if it's on a vertex, * yellow if not. */ printf("(xform-set pick @{ 1 0 0 0 0 1 0 0 0 0 1 0 %g %g %g 1 @})\n", p->x, p->y, p->z); printf("(geometry \"pick\"\n"); if (vert) printf("@{ appearance @{ material @{ diffuse 1 0 1 @} @}\n"); else printf("@{ appearance @{ material @{ diffuse 1 1 0 @} @}\n"); printf(" @{ LIST @{ :littlebox @}\n"); /* * If it's on an edge and not a vertex, mark the edge * with cyan boxes at the endpoins and a black line * along the edge. */ if (edge && !vert) @{ e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z; e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z; printf("@{ appearance @{ material @{ diffuse 0 1 1 @} @}\n\ LIST\n\ @{ INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox @}\n\ @{ INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox @}\n\ @{ VECT\n\ 1 2 1\n\ 2\n\ 1\n\ %f %f %f\n\ %f %f %f\n\ 1 1 0 1\n\ @}\n\ @}\n", e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z, e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z); @} printf(" @}\n @}\n)\n"); @} @} endprogn(); @} Normalize(HPoint3 *p) @{ if (p->w != 0) @{ p->x /= p->w; p->y /= p->w; p->z /= p->w; p->w = 1; @} @} main() @{ Lake *lake; LObject *lit, *val; extern char *getenv(); Initialize(); lake = LakeDefine(stdin, stdout, NULL); while (!feof(stdin)) @{ /* Parse next lisp expression from stdin. */ lit = LSexpr(lake); /* Evaluate that expression; this is where Lpick() gets called. */ val = LEval(lit); /* Free the two expressions from above. */ LFree(lit); LFree(val); @} @} @comment #end include @end example The code begins by defining procedures @code{progn()} and @code{endprogn()} which begin and end a Geomview @code{progn} group. The purpose of the Geomview @code{progn} command is to group commands together and cause Geomview to execute them all at once, without refreshing any graphics windows until the end. It is a good idea to group blocks of commands that a module sends to Geomview like this so that the user sees their cumulative effect all at once. Procedure @code{Initialize()} does various things needed at program startup time. It initializes the lisp library by calling @code{LInit()}. Any program that uses the lisp library should call this once before calling any other lisp library functions. It then calls @code{LDefun} to tell the library about our @code{pick} procedure, which is defined further down with a call to the @code{PICKFUNC} macro. Then it sends a bunch of setup commands to Geomview, grouped in a @code{progn} block. This includes defining a handle called @code{littlebox} that stores the geometry of the little box. Next it sends the command @example (interest (pick world * * * * nil nil nil nil nil)) @end example @noindent which tells Geomview to notify us when a pick event happens. The syntax of this @code{interest} statement merits some explanation. In general @code{interest} takes one argument which is a (parenthesized) expression representing a Geomview function call. It specifies a type of call that the module is interested in knowing about. The arguments can be any particular argument values, or the special symbols @code{*} or @code{nil}. For example, the first argument in the @code{pick} expression above is @code{world}. This means that the module is interested in calls to @code{pick} where the first argument, which specifies the coordinate system, is @code{world}. A @code{*} is like a wild-card; it means that the module is interested in calls where the corresponding argument has any value. The word @code{nil} is like @code{*}, except that the argument's value is not reported to the module. This is useful for cutting down on the amount of data that must be transmitted in cases where there are arguments that the module doesn't care about. The second, third, fourth, and fifth arguments to the @code{pick} command give the name, pick point coordinates, vertex coordinates, and edge coordinates of a pick event. We specify these by @code{*}'s above. The remaining five arguments to the @code{pick} command give other information about the pick event that we do not care about in this module, so we specify these with @code{nil}'s. For the details of the arguments to @code{pick}, @xref{GCL}. The @code{geometry} statement defines a geom called @code{pick} that is initially an empty list, specified as @code{ @{ LIST @} }; this is the best way of specifying a null geom. The module will replace this with something useful by sending Geomview another @code{geometry} command when the user picks something. Next we arrange for the @code{pick} object to be non-pickable, and turn normalization off for it so that Geomview will display it in the size and location where we put it, rather than resizing and relocating it to fit into the unit cube. The next function in the file, @code{Lpick}, is defined with a strange looking call to a macro called @code{PICKFUNC}, defined in the header file @file{pickfunc.h}. This is the function for handling pick events. The reason we provide a macro for this is that that macro encapsulates a lot of necessary stuff that would be the same for the pick-handling function in any program. If you write a Geomview module that wants to know about user pick events you can just copy this macro call and change it to suit yours needs. In general the syntax for @code{PICKFUNC} is @example PICKFUNC(@var{name}, @var{block}, @var{NDblock}) @end example @noindent where @var{name} is the name of the procedure to be defined, in this case @code{Lpick}. The next argument, @var{block}, is a block of code to be executed when a pick event occurs. If @var{block} contains a return statement, then the returned value must be a pointer to a Lisp-object, that is of type @code{LObject *}. The last argument has the same functionality as the @var{block} argument, but is only invoked when picking objects in a higher dimensional world. @code{PICKFUNC} declares certain local variables in the body of the procedure. When the module receives a @code{(pick @dots{})} statement from Geomview, the procedure assigns values to these variables based on the information in the @code{pick} call (variables corresponding to @code{nil}'s in the @code{(interest (pick @dots{}))} are not given values). There is also a second variant of the @code{PICKFUNC} macro with a slightly different syntax: @example DEFPICKFUNC(@var{helpstr}, @var{coordsys}, @var{id}, @var{point}, @var{pn}, @var{vertex}, @var{vn}, @var{edge}, @var{en}, @var{face}, @var{fn}, @var{ppath}, @var{ppn}, @var{vi}, @var{ei}, @var{ein}, @var{fi}, @var{body}, @var{NDbody}) @end example @code{DEFPICKFUNC} can be used as well as @code{PICKFUNC}, there is no functional differene with the exception that the name of the C-function is tied to @code{Lpick} when using @code{DEFPICKFUNC} and that the @code{(help pick)} GCL-command (@pxref{help, @code{(help @dots{})}}) would respond with echoing @var{helpstr}. The table below lists all variables defined in @code{PICKFUNC} In the context of ND-viewing @code{float} variants of the arguments apply: the @var{body} execution block sees the @code{HPoint3} variables, and the @var{NDbody} block sees only flat one-dimensional arrays of @code{float}-type. In the ND-viewing context the co-ordinates passed to the pick function are still the 3-dimensional co-ordinates of the camera view-port where the pick occurred, but padded with zeroes on transformed back to the co-ordinate system specified by the second argument of the @code{pick} command. @table @asis @item @code{char *coordsys;} A string specifying the coordinate system in which coordinates are given. In this example, this will always be @code{world} because of the @code{interest} call above. @item @code{char *id;} A string specifying the name of the picked geom. @item @code{HPoint3 point; int pn;} @item @code{float *point; int pn;} @code{point} is an @code{HPoint3} structure giving the coordinates of the picked point. @code{HPoint3} is a homogeneous point coordinate representation equivalent to an array of 4 floats. @code{pn} tells how many coordinates have been written into this array; it will always be either @code{0}, @code{4} or greater than @code{4}. If it is greater than @code{4}, then the @var{NDbody} instruction block is invoked and in this case @code{point} is a flat array of @code{pn} many @code{float}s. A value of zero means no point was picked, i.e. the user clicked the right mouse button while the cursor was not pointing at a geom. In this case the ordinary @var{block} 3d instruction block is executed. @item @code{HPoint3 vertex; int vn;} @item @code{float *vertex; int vn;} @code{vertex} is an @code{HPoint3} structure giving the coordinates of the picked vertex, if the pick point was near a vertex. @code{vn} tells how many coordinates have been written into this array; it will always be either @code{0} or greater equal @code{4}. A value of zero means the pick point was not near a vertex. In the context of ND-viewing @code{vertex} will be an array of @code{vn} @code{float}s and @code{vn} will be equal to @code{pn}. @item @code{HPoint3 edge[2]; int en;} @item @code{float *edge; int en;} @code{edge} is an array of two @code{HPoint3} structures giving the coordinates of the endpoints of the picked edge, if the pick point was near an edge. @code{en} tells how many coordinates have been written into this array; it will always be @code{0} or greater equal @code{8}. A value of zero means the pick point was not near an edge. In the context of ND-viewing @code{edge} will be a flat one-dimensional array of @code{en} many @code{float}s: the first @code{pn} @code{float}s define the first vertex, and the second @code{pn} many @code{float}s define the second vertex; @code{en} will be two times @code{pn}. @end table In this example module, the remaining variables will never be given values because their values in the @code{interest} statement were specified as @code{nil}. @table @asis @item @code{HPoint3 face[]; int fn;} @item @code{float *face; int fn;} @code{face} is a variable length array of @var{fn} @code{HPoint3}'s. @code{face} gives the coordinates of the vertices of the picked face. @code{fn} tells how many coordinates have been written into this array; it will always be either @code{0} or a multiple of @code{pn}. A value of zero means the pick point was not near a face. In the context of ND-viewing @code{face} is a flat one-dimensional array of @code{fn} many floats of which each vertex occupies @code{pn} many components. @item @code{int ppath[]; int ppn;} @code{ppath} is an array of @var{maxpathlen} @code{int}'s. @code{ppath} gives the path through the OOGL heirarchy to the picked primitive. @code{pn} tells how many integers have been written into this array; it will be at most @var{maxpathlen}. A path of @{3,1,2@}, for example, means that the picked primitive is "subobject number 2 of subobject number 1 of object 3 in the world". @item @code{int vi;} @code{vi} gives the index of the picked vertex in the picked primitive, if the pick point was near a vertex. @item @code{int ei[2]; int ein} The @code{ei} array gives the indices of the endpoints of the picked edge, if the pick point was near a vertex. @code{ein} tells how many integers were written into this array. It will always be either 0 or 2; a value of 0 means the pick point was not near an edge. @item @code{int fi;} @code{fi} gives the index of the picked face in the picked primitive, if the pick point was near a face. @end table The @code{handle_pick} procedure actually does the work of dealing with the pick event. It begins by normalizing the homogeneous coordinates passed in as arguments so that we can assume the fourth coordinate is 1. It then sends GCL commands to define the @code{pick} object to be whatever is appropriate for the kind of pick recieved. See @pxref{OOGL File Formats}, and @pxref{GCL}, for an explanation of the format of the data in these commands. The main program, at the bottom of the file, first calls @code{Initialize()}. Next, the call to @code{LakeDefine} defines the @code{Lake} that the lisp library will use. A @code{Lake} is a structure that the lisp library uses internally as a type of communiation vehicle. (It is like a unix stream but more general, hence the name.) This call to @code{LakeDefine} defines a @code{Lake} structure for doing I/O with @code{stdin} and @code{stdout}. The third argument to @code{LakeDefine} should be @code{NULL} for external modules (it is used by Geomview). Finally, the program enters its main loop which parses and evaluates expressions from standard input. @comment **************************************************************** @node Example4, Module Installation, Example3, Modules @section Example 4: Simple Tcl/Tk Module Demonstrating Picking It's not necessary to write a Geomview module in C. The only requirement of an external module is that it send GCL commands to its standard output and expect responses (if any) on its standard input. An external module can be written in C, perl, tcl/tk, or pretty much anything. As an example, assuming you have Tcl/Tk version 4.0 or later, here's an external module with a simple GUI which demonstrates interaction with geomview. This manual doesn't discuss the Tcl/Tk language; see the good book on the subject by its originator John Ousterhout, published by Addison-Wesley, titled @emph{Tcl and the Tk Toolkit}. The @samp{#!} on the script's first line causes the system to interpret the script using the Tcl/Tk @samp{wish} program; you might have to change its first line if that's in some location other than /usr/local/bin/wish4.0. Or, you could define it as a module using @example (emodule-define "Pick Demo" "wish pickdemo.tcl") @end example in which case @samp{wish} could be anywhere on the UNIX search path. @example #! /usr/local/bin/wish4.0 # We use "fileevent" below to have "readsomething" be called whenever # data is available from standard input, i.e. when geomview has sent us # something. It promises to include a trailing newline, so we can use # "gets" to read the geomview response, then parse its nested parentheses # into tcl-friendly @{@} braces. proc readsomething @{@} @{ if @{[gets stdin line] < 0@} @{ puts stderr "EOF on input, exiting..." exit @} regsub -all @{\(@} $line "\@{" line regsub -all @{\)@} $line "\@}" line # Strip outermost set of braces set stuff [lindex $line 0] # Invoke handler for whichever command we got. Could add others here, # if we asked geomview for other kinds of data as well. switch [lindex $stuff 0] @{ pick @{handlepick $stuff@} rawevent @{handlekey $stuff@} @} @} # Fields of a "pick" response, from geomview manual: # (pick COORDSYS GEOMID G V E F P VI EI FI) # The pick command is executed internally in response to pick # events (right mouse double click). # # COORDSYS = coordinate system in which coordinates of the following # arguments are specified. This can be: # world: world coord sys # self: coord sys of the picked geom (GEOMID) # primitive: coord sys of the actual primitive within # the picked geom where the pick occurred. # GEOMID = id of picked geom # G = picked point (actual intersection of pick ray with object) # V = picked vertex, if any # E = picked edge, if any # F = picked face # P = path to picked primitive [0 or more] # VI = index of picked vertex in primitive # EI = list of indices of endpoints of picked edge, if any # FI = index of picked face # Report when user picked something. # proc handlepick @{pick@} @{ global nameof selvert seledge order set obj [lindex $pick 2] set xyzw [lindex $pick 3] set fv [lindex $pick 6] set vi [lindex $pick 8] set ei [lindex $pick 9] set fi [lindex $pick 10] # Report result, converting 4-component homogeneous point into 3-space point. set w [lindex $xyzw 3] set x [expr [lindex $xyzw 0]/$w] set y [expr [lindex $xyzw 1]/$w] set z [expr [lindex $xyzw 2]/$w] set s "$x $y $z " if @{$vi >= 0@} @{ set s "$s vertex #$vi" @} if @{$ei != @{@}@} @{ set s "$s edge [lindex $ei 0]-[lindex $ei 1]" @} if @{$fi != -1@} @{ set s "$s face #$fi ([expr [llength $fv]/3]-gon)" @} msg $s @} # Having asked for notification of these raw events, we report when # the user pressed these keys in the geomview graphics windows. proc handlekey @{event@} @{ global lastincr switch [lindex $event 1] @{ 32 @{msg "Pressed space bar"@} 8 @{msg "Pressed backspace key"@} @} @} # # Display a message on the control panel, and on the terminal where geomview # was started. We use ``puts stderr @dots{}'' rather than simply ``puts @dots{}'', # since Geomview interprets anything we send to standard output # as a GCL command! # proc msg @{str@} @{ global msgtext puts stderr $str set msgtext $str update @} # Load object from file proc loadobject @{fname@} @{ if @{$fname != ""@} @{ puts "(geometry thing < $fname)" # Be sure to flush output to ensure geomview receives this now! flush stdout @} @} # Build simple "user interface" # The message area could be a simple label rather than an entry box, # but we want to be able to use X selection to copy text from it. # The default mouse bindings do that automatically. entry .msg -textvariable msgtext -width 45 pack .msg frame .f label .f.l -text "File to load:" pack .f.l -side left entry .f.ent -textvariable fname pack .f.ent -side left -expand true -fill x bind .f.ent @{ loadobject $fname @} pack .f # End UI definition. # Call "readsomething" when data arrives from geomview. fileevent stdin readable @{readsomething@} # Geomview initialization puts @{ (interest (pick primitive)) (interest (rawevent 32)) # Be notified when user presses space (interest (rawevent 8)) # or backspace keys. (geometry thing < hdodec.off) (normalization world none) @} # Flush to ensure geomview receives this. flush stdout wm title . @{Sample external module@} msg "Click right mouse in graphics window" @end example @comment **************************************************************** @node Module Installation, , Example4, Modules @section Module Installation This section tells how to install an external module so you can invoke it within Geomview. There are two ways to install a module: you can install a @emph{private} module so that the module is available to you whenever you run Geomview, or you can install a @emph{system} module so that the module is available to all users on your system whenever they run Geomview. @menu * Private Module Installation:: Per-user modules. * System Module Installation:: System-wide modules. @end menu @comment ---------------------------------------------------------------- @node Private Module Installation, System Module Installation, Module Installation, Module Installation @subsection Private Module Installation The @code{emodule-define} command arranges for a module to appear in Geomview's @emph{Modules} browser. The command takes two string arguments; the first is the name that will appear in the @emph{Modules} browser. The second is the shell command for running the module; it may include arguments (@pxref{emodule-define,@code{(emodule-define @dots{})}}). Geomview executes this command in a subshell when you click on the module's entry in the browser. For example @example (emodule-define "Foo" "/u/home/modules/foo -x") @end example @noindent adds a line labeled "Foo" to the @emph{Modules} browser which causes the command "/u/home/modules/foo -x" to be executed when selected. You may put @code{emodule-define} commands in your @file{~/.geomview} file to arrange for certain modules to be available every time you run Geomview; @xref{Customization}. You can also execute @code{emodule-define} commands from the @emph{Commands} panel to add a module to an already running copy of Geomview. There are several other GCL commands for controlling the entries in the @emph{Modules} browser; for details, @xref{GCL}. @comment ---------------------------------------------------------------- @node System Module Installation, , Private Module Installation, Module Installation @subsection System Module Installation To install a module so that it is available to all Geomview users do the following @table @asis @item 1. Create a file called @file{.geomview-@var{module}} where @file{@var{module}} is the name of the module. This file should contain a single line which is an @code{emodule-define} command for that module: @example (emodule-define "New Module" "newmodule") @end example The first argument, @code{"New Module"} above, is the string that will appear in the @emph{Modules} browser. The second string, @code{"newmodule"} above, is the Bourne shell command for invoking the module. It may include arguments, and you may assume that the module is on the $path searched by the shell. @item 2. Put a copy of the @file{.geomview-@var{module}} and the module executable itself in Geomview's @file{modules/} directory, where @file{} is your system type. @end table After these steps, the new module should appear, in alphabetical position, in the @emph{Modules} browser of Geomview's @emph{Main} panel next time Geomview is run. The reason this works is that when Geomview is invoked it processes all the @file{.geomview-*} files in its @file{modules} directory. It also remembers the pathname of this directory and prepends that path to the $path of the shell in which it invokes such a module. @comment **************************************************************** @node GCL, Non-Euclidean Geometry, Modules, Top @chapter GCL: the Geomview Command Language GCL has the syntax of lisp -- i.e. an expression of the form (f a b @dots{}) means pass the values of a, b, @dots{} to the function f. GCL is very limited and is by no means an implementation of lisp. It is simply a language for expressing commands to be executed in the order given, rather than a programming language. It does not support variable or function definition. GCL is the language that Geomview understands for files that it loads as well as for communication with other programs. To execute a GCL command interactively, you can bring up the @emph{Commands} panel which lets you type in a command; Geomview executes the command when you hit the @key{Enter} key. Output from such commands is printed to standard output. Alternately, you can invoke Geomview as @code{geomview -c -} which causes it to read GCL commands from standard input. GCL functions return a value, and you can nest function calls in ways which use this returned value. For example @example (f (g a b)) @end example evaluates @code{(g a b)} and then evaluates @code{(f x)} where @code{x} is the result returned by @code{(g a b)}. Geomview maintains these return values internally but does not normally print them out. To print out a return value pass it to the @code{echo} function. For example the @code{geomview-version} function returns a string representing the version of Geomview that is running, and @example (echo (geomview-version)) @end example prints out this string. Many functions simply return @code{t} for success or @code{nil} for failure; this is the case if the documentation for the function does not indicate otherwise. These are the lisp symbols for true and false, respectively. (They correspond to the C variables @code{Lt} and @code{Lnil} which you are likely to see if you look at the source code for Geomview or some of the external modules.) In the descriptions of the commands below several references are made to "OOGL" formats. OOGL is the data description language that Geomview uses for describing geometry, cameras, appearances, and other basic objects. For details of the OOGL formats, @xref{OOGL File Formats}. (Or equivalently, see the oogl(5) manual page, distributed with Geomview in the file man/cat5/oogl.5. The GCL commands and argument types are listed below. Most of the documentation in this section of the manual is available within Geomview via the @code{?} and @code{??} commands. The command @code{(? @var{command})} causes Geomview to print out a one-line summary of the syntax of @var{command}, and @code{(?? @var{command})} prints out an explanation of what @var{command} does. You can include the wild-card character @code{*} in @var{command} to print information for a group of commands matching a pattern. For example, @code{(?? *emodule*)} will print all information about all commands containing the string @code{emodule}. @code{(? *)} will print a short list of all commands. @menu * Argument Conventions:: Conventions used in describing argument types. * GCL Reference:: Documentation for each GCL command. @end menu @node Argument Conventions, GCL Reference, GCL, GCL @section Conventions Used In Describing Argument Types The following symbols are used to describe argument types in the documentation for GCL functions. @table @code @item @var{appearance} is an OOGL appearance specification. @item @var{cam-id} is an @var{id} that refers to a camera. @item @var{camera} is an OOGL camera specification. @item @var{geom-id} is an @var{id} that refers to a geometry. @item @var{geometry} is an OOGL geometry specification. @item @var{id} is a string which names a geometry or camera. Besides those you create, valid ones are: @table @code @item @code{World, world, worldgeom, g0} the collection of all geom's @item target selected target object (cam or geom) @item center selected center-of-motion object @item targetcam last selected target camera @item targetgeom last selected target geom @item focus camera where cursor is (or most recently was) @item allgeoms all geom objects @item allcams all cameras @item @code{default, defaultcam, prototype} future cameras inherit default's settings @end table The following @var{id}s are used to name coordinate systems, e.g. in @code{pick} and @code{write} commands: @table @code @item @code{World, world, worldgeom, g0} the world, within which all other geoms live. @item universe the universe, in which the World, lights and cameras live. Cameras' world2cam transforms might better be called universe2cam, etc. @item self "this Geomview object". Transform from an object to @code{self} is the identity; writing its geometry gives the object itself with no enclosing transform; picked points appear in the object's coordinates. @item primitive (for @code{pick} only) Picked points appear in the coordinate system of the lowest-level OOGL primitive. @end table A name is also an acceptable id. Given names are made unique by appending numbers if necessary (i.e. @code{foo<2>}). Every geom is also named g[n] and every camera is also named c[n] (@code{g0} is always the worldgeom): this name is used as a prefix to keyboard commands and can also be used as a GCL id. Numbers are reused after an object is deleted. Both names are shown in the Object browser. @item @var{statement} represents a function call. Function calls have the form @code{(func arg1 arg2 @dots{} )}, where @code{func} is the name of the function and @code{arg1}, @code{arg2}, @dots{} are the arguments. @item @var{transform} is an OOGL 4x4 transformation matrix. @item @var{ntransform} is an OOGL (N+1)x(N+1) transformation matrix. @item @var{window} is an OOGL winddow specification. @end table @node GCL Reference, , Argument Conventions, GCL @section GCL Reference Guide @c @table @code @menu * shell:: @code{(! SHELLCOMMAND)} * lt:: @code{(< EXPR1 EXPR2)} * eq:: @code{(= EXPR1 EXPR2)} * gt:: @code{(> EXPR1 EXPR2)} * help:: @code{(? COMMAND)} * morehelp:: @code{(?? COMMAND)} * emodule-run:: @code{(| NAME)} * all:: @code{(all geometry|camera|emodule)} * and:: @code{(and EXPR1 EXPR2)} * ap-override:: @code{(ap-override [on|off])} * backcolor:: @code{(backcolor CAM-ID R G B)} * background-image:: @code{(background-image CAM-ID [FILENAME])} * bbox-color:: @code{(bbox-color GEOM-ID R G B)} * bbox-draw:: @code{(bbox-draw GEOM-ID [yes|no])} * camera:: @code{(camera CAM-ID [CAMERA])} * camera-draw:: @code{(camera-draw CAM-ID [yes|no])} * camera-prop:: @code{(camera-prop @{ geometry object @} [projective])} * camera-reset:: @code{(camera-reset CAM-ID)} * car:: @code{(car LIST)} * cdr:: @code{(cdr LIST)} * clock:: @code{(clock)} * command:: @code{(command INFILE [OUTFILE])} * copy:: @code{(copy [ID] [name])} * cursor-still:: @code{(cursor-still [INT])} * cursor-twitch:: @code{(cursor-twitch [INT])} * delete:: @code{(delete ID)} * dice:: @code{(dice GEOM-ID N)} * dimension:: @code{(dimension [N])} * dither:: @code{(dither CAM-ID @{on|off|toggle@})} * draw:: @code{(draw CAM-ID)} * dump-handles:: @code{(dump-handles)} * echo:: @code{(echo @dots{})} * emodule-clear:: @code{(emodule-clear)} * emodule-define:: @code{(emodule-define NAME SHELL-COMMAND @dots{})} * emodule-defined:: @code{(emodule-defined @code{modulename})} * emodule-isrunning:: @code{(emodule-isrunning NAME)} * emodule-path:: @code{(emodule-path)} * emodule-run:: @code{(| NAME)} * emodule-sort:: @code{(emodule-sort)} * emodule-start:: @code{(emodule-start NAME)} * emodule-transmit:: @code{(emodule-transmit NAME LIST)} * escale:: @code{(escale GEOM-ID FACTOR)} * event-keys:: @code{(event-keys @{on|off@})} * event-mode:: @code{(event-mode MODESTRING)} * event-pick:: @code{(event-pick @{on|off@})} * evert:: @code{(evert GEOM-ID [yes|no])} * exit:: @code{(exit)} * ezoom:: @code{(ezoom GEOM-ID FACTOR)} * freeze:: @code{(freeze CAM-ID)} * geometry:: @code{(geometry GEOM-ID [GEOMETRY])} * geomview-version:: @code{(geomview-version)} * hdefine:: @code{(hdefine geometry|camera|@dots{} NAME VALUE)} * hdelete:: @code{(hdelete [geometry|camera|@dots{}] name)} * help:: @code{(? COMMAND)} * hmodel:: @code{(hmodel CAMID @{virtual|projective|conformal@})} * hsphere-draw:: @code{(hsphere-draw CAMID [yes|no])} * if:: @code{(if TEST EXPR1 [EXPR2])} * inhibit-warning:: @code{(inhibit-warning STRING)} * input-translator:: @code{(input-translator "#pfx" "sh-command")} * interest:: @code{(interest (COMMAND [args]))} * lines-closer:: @code{(lines-closer CAM-ID DIST)} * load:: @code{(load filename [command|geometry|camera])} * load-path:: @code{(load-path)} * look:: @code{(look [objectID] [camID])} * look-encompass:: @code{(look-encompass [objID] [camID])} * look-encompass-size:: @code{(look-encompass-size [view clip near far])} * look-recenter:: @code{(look-recenter [objID] [camID])} * look-toward:: @code{(look-toward [objID] [camID] [origin|center])} * merge:: @code{(merge @{window|camera@} CAM-ID @{ WIN or CAM @dots{} @})} * merge-ap:: @code{(merge-ap GEOM-ID APPEARANCE)} * merge-base-ap:: @code{(merge-base-ap APPEARANCE)} * merge-baseap:: @code{(merge-baseap APPEARANCE)} * morehelp:: @code{(?? COMMAND)} * name-object:: @code{(name-object ID NAME)} * ND-axes:: @code{(ND-axes CAMID [CLUSTER [Xidx Yidx Zidx [Widx]]])} * ND-color:: @code{(ND-color CAMID @dots{}} * ND-xform:: @code{(ND-xform OBJID [ntransform @{ @dots{} @}])} * ND-xform-get:: @code{(ND-xform-get ID [from-ID])} * ND-xform-set:: @code{(ND-xform-set OBJID [ntransform @{ @dots{} @}])} * new-alien:: @code{(new-alien name [GEOMETRY])} * new-camera:: @code{(new-camera name [CAMERA])} * new-center:: @code{(new-center [id])} * new-geometry:: @code{(new-geometry name [GEOMETRY])} * new-reset:: @code{(new-reset)} * NeXT:: @code{(NeXT)} * normalization:: @code{(normalization GEOM-ID @{each|none|all|keep@})} * not:: @code{(not EXPR)} * or:: @code{(or EXPR1 EXPR2)} * pick:: @code{(pick COORDSYS GEOMID G V E F P VI EI FI)} * pick-invisible:: @code{(pick-invisible [yes|no])} * pickable:: @code{(pickable GEOM-ID @{yes|no@})} * position:: @code{(position objectID otherID)} * position-at:: @code{(position-at objectID otherID [center | origin])} * position-toward:: @code{(position-toward objID othID [center|origin])} * progn:: @code{(progn STATEMENT [ @dots{} ])} * quit:: @code{(quit)} * quote:: @code{(quote EXPR)} * rawevent:: @code{(rawevent dev val x y t)} * rawpick:: @code{(rawpick CAMID X Y)} * read:: @code{(read geometry|camera|@dots{} @{GEOM or CAM or @dots{}@})} * real-id:: @code{(real-id ID)} * redraw:: @code{(redraw CAM-ID)} * regtable:: @code{(regtable)} * rehash-emodule-path:: @code{(rehash-emodule-path)} * replace-geometry:: @code{(replace-geometry GEOM-ID PART GEOMETRY)} * rib-display:: @code{(rib-display [frame|tiff] FILEPREFIX)} * rib-snapshot:: @code{(rib-snapshot CAM-ID [filename])} * scale:: @code{(scale GEOM-ID FACTOR [FACTORY FACTORZ])} * scene:: @code{(scene CAM-ID [GEOMETRY])} * set-clock:: @code{(set-clock TIME)} * set-conformal-refine:: @code{(set-conformal-refine CMX [N [EDGES]])} * set-emodule-path:: @code{(set-emodule-path (PATH1 @dots{} PATHN))} * set-load-path:: @code{(set-load-path (PATH1 @dots{} PATHN))} * set-motionscale:: @code{(set-motionscale X)} * setenv:: @code{(setenv name string)} * sgi:: @code{(sgi)} * shell:: @code{(! SHELLCOMMAND)} * sleep-for:: @code{(sleep-for TIME)} * sleep-until:: @code{(sleep-until TIME)} * snapshot:: @code{(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])} * soft-shader:: @code{(soft-shader CAM-ID @{on|off|toggle@})} * space:: @code{(space @{euclidean|hyperbolic|spherical@})} * stereowin:: @code{(stereowin CAM-ID [no|horizontal|@dots{}] [gap])} * time-interests:: @code{(time-interests delta initial prefix [suffix])} * transform:: @code{(transform objectID centerID frameID [rotate|@dots{}] @dots{})} * transform-incr:: @code{(transform-incr objectID centerID frameID @dots{})} * transform-set:: @code{(transform-set objectID centerID frameID @dots{})} * ui-cam-focus:: @code{(ui-cam-focus @{focus-change|mouse-cross@})} * ui-center:: @code{(ui-center ID)} * ui-center-origin:: @code{(ui-center-origin @{origin|bbox-center@})} * ui-emotion-program:: @code{(ui-emotion-program PROGRAM)} * ui-emotion-run:: @code{(ui-emotion-run EMODULE)} * ui-freeze:: @code{(ui-freeze @{on|off@})} * ui-html-browser:: @code{(ui-html-browser BROWSER)} * ui-motion:: @code{(ui-motion @{inertia|@dots{}@} @{on|off@})} * ui-panel:: @code{(ui-panel PANELNAME @{on|off@} [WINDOW])} * ui-pdf-viewer:: @code{(ui-pdf-viewer VIEWER)} * ui-target:: @code{(ui-target ID [yes|no])} * uninterest:: @code{(uninterest (COMMAND [args]))} * update:: @code{(update [timestep_in_seconds])} * update-draw:: @code{(update-draw CAM-ID [timestep_in_seconds])} * window:: @code{(window CAM-ID WINDOW)} * winenter:: @code{(winenter CAM-ID)} * write:: @code{(write command|geometry|@dots{} FILENAME @dots{})} * write-comments:: @code{(write-comments FILENAME GEOMID PICKPATH)} * write-handle:: @code{(write-handle PREFIX FILENAME HANDLE)} * write-sexpr:: @code{(write-sexpr FILENAME LISPOBJECT)} * xform:: @code{(xform ID TRANSFORM)} * xform-incr:: @code{(xform-incr ID TRANSFORM)} * xform-set:: @code{(xform-set ID TRANSFORM)} * zoom:: @code{(zoom CAM-ID FACTOR)} @end menu @node shell, lt, GCL Reference, GCL Reference @subsection ! @findex !, shell @findex shell, ! @table @code @item ! is a synonym for @code{shell}. @xref{shell}. @end table @node lt, eq, shell, GCL Reference @subsection < @findex < @table @code @item (< EXPR1 EXPR2) Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. @end table @node eq, gt, lt, GCL Reference @subsection = @findex = @table @code @item (= EXPR1 EXPR2) Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. @end table @node gt, help, eq, GCL Reference @subsection > @findex > @table @code @item (> EXPR1 EXPR2) Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. @end table @node help, morehelp, gt, GCL Reference @subsection ? @findex ? @table @code @item (? [command]) Gives one-line usage summary for @code{command}. Command may include @code{*}s as wildcards; see also @ref{morehelp, @code{(?? @dots{})}}. One-line command help; lists names only if multiple commands match. @code{?} is a synonym for @ref{help, @code{(help @dots{})}} @end table @node morehelp, emodule-run, help, GCL Reference @subsection ?? @findex ?? @table @code @item (?? command) @code{command} may include @code{*} wildcards. Prints more info than @code{(? command)}. @code{??} is a synonym for @ref{morehelp, @code{morehelp}}. @end table @node emodule-run, all, morehelp, GCL Reference @subsection | @findex |, emodule-run @findex emodule-run, | @table @code @item | @code{|} is a synonym for @code{emodule-run}. @end table @node all, and, emodule-run, GCL Reference @subsection all @findex all @table @code @findex all geometry @item (all geometry) returns a list of names of all geometry objects. Use e.g. @samp{(echo (all geometry))} to print such a list. @findex all camera @item (all camera) returns a list of names of all cameras. @findex all emodule defined @item (all emodule defined) returns a list of all defined external modules. @findex all emodule running @item (all emodule running) returns a list of all running external modules. @end table @node and, ap-override, all, GCL Reference @subsection and @findex and @table @code @item (and EXPR1 EXPR2) Evaluate @code{EXPR1} and @code{EXPR2} and return @code{t} if both return non-@code{nil}, otherwise return @code{nil}. @end table @node ap-override, backcolor, and, GCL Reference @subsection ap-override @findex ap-override @table @code @item (ap-override [on|off]) Selects whether appearance controls should override objects' own settings. On by default. With no arguments, returns current setting. @end table @node backcolor, background-image, ap-override, GCL Reference @subsection backcolor @findex backcolor @table @code @item (backcolor CAM-ID R G B) Set the background color of CAM-ID; R G B are numbers between 0 and 1. @end table @node background-image, bbox-color, backcolor, GCL Reference @subsection background-image @findex background-image @table @code @item (background-image CAM-ID [FILENAME]) Use the given image as the background of camera CAM-ID (which must be a real camera, not @code{default} or @code{allcams}). Centers the image on the window area. Works only with GL and OpenGL graphics. Use "" for filename to remove background. With no filename argument, returns name of that window's current background image, or "". Any file type acceptable as a texture is allowed, e.g. .ppm.gz, .sgi, etc. @end table @node bbox-color, bbox-draw, background-image, GCL Reference @subsection bbox-color @findex bbox-color @table @code @item (bbox-color GEOM-ID R G B) Set the bounding-box color of GEOM-ID; R G B are numbers between 0 and 1. @end table @node bbox-draw, camera, bbox-color, GCL Reference @subsection bbox-draw @findex bbox-draw @table @code @item (bbox-draw GEOM-ID [yes|no]) Say whether GEOM-ID's bounding-box should be drawn; defaults to @code{yes} if second argument is omitted. @end table @node camera, camera-draw, bbox-draw, GCL Reference @subsection camera @findex camera @table @code @item (camera CAM-ID [CAMERA]) Specify data for @var{CAM-ID}; @var{CAMERA} is a string giving an OOGL camera specification. If no camera @var{CAM-ID} exists, it is created; in this case, the second argument is optional, and if omitted, a default camera is used. @xref{new-camera, @code{(new-camera @dots{})}}. @end table @node camera-draw, camera-prop, camera, GCL Reference @subsection camera-draw @findex camera-draw @table @code @item (camera-draw CAM-ID [yes|no]) Say whether or not cameras should be drawn in CAM-ID; @code{yes} if omitted. @end table @node camera-prop, camera-reset, camera-draw, GCL Reference @subsection camera-prop @findex camera-prop @table @code @item (camera-prop @{ geometry object @} [projective]) Specify the object to be shown when drawing other cameras. By default, this object is drawn with its origin at the camera, and with the camera looking toward the object's -Z axis. With the @code{projective} keyword, the camera's viewing projection is also applied to the object; this places the object's Z=-1 and Z=+1 at near and far clipping planes, with the viewing area -1<=@{X,Y@}<=+1. Example: (camera-prop @{ < cube @} projective) @end table @node camera-reset, car, camera-prop, GCL Reference @subsection camera-reset @findex camera-reset @table @code @item (camera-reset CAM-ID) Reset CAM-ID to its default value. @end table @node car, cdr, camera-reset, GCL Reference @subsection car @findex car @table @code @item (car LIST) returns the first element of LIST. @end table @node cdr, clock, car, GCL Reference @subsection cdr @findex cdr @table @code @item (cdr LIST) returns the list obtained by removing the first element of LIST. @end table @node clock, command, cdr, GCL Reference @subsection clock @findex clock @table @code @item (clock) Returns the current time, in seconds, as shown by this stream's clock. @xref{set-clock, @code{(set-clock @dots{})}}. @xref{sleep-until, @code{(sleep-until @dots{})}}. @end table @node command, copy, clock, GCL Reference @subsection command @findex command @table @code @item (command INFILE [OUTFILE]) Read commands from INFILE; send corresponding responses (e.g. anything written to filename @code{-}) to OUTFILE, stdout by default. @end table @node copy, cursor-still, command, GCL Reference @subsection copy @findex copy @table @code @item (copy [ID] [name]) Copies an object or camera. If ID is not specified, it is assumed to be targetgeom. If name is not specified, it is assumed to be the same as the name of ID. @end table @node cursor-still, cursor-twitch, copy, GCL Reference @subsection cursor-still @findex cursor-still @table @code @item (cursor-still [INT]) Sets the number of microseconds for which the cursor must not move to register as holding still. If INT is not specified, the value will be reset to the default. @end table @node cursor-twitch, delete, cursor-still, GCL Reference @subsection cursor-twitch @findex cursor-twitch @table @code @item (cursor-twitch [INT]) Sets the distance which the cursor must not move (in x or y) to register as holding still. If INT is not specified, the value will be reset to the default. @end table @node delete, dice, cursor-twitch, GCL Reference @subsection delete @findex delete @table @code @item (delete ID) Delete object or camera ID. @end table @node dice, dimension, delete, GCL Reference @subsection dice @findex dice @table @code @item (dice GEOM-ID N) Dice any Bezier patches within @var{GEOM-ID} into NxN meshes; default 10. See also the appearance attribute @ref{Appearances, @code{patchdice}}, which makes this command obsolete. @end table @node dimension, dither, dice, GCL Reference @subsection dimension @findex dimension @table @code @item (dimension [N]) Sets or reads the space dimension for N-dimensional viewing. (Since calculations are done using homogeneous coordinates, this means matrices are (N+1)x(N+1).) With no arguments, returns the current dimension, or 0 if N-dimensional viewing has not been enabled. @end table @node dither, draw, dimension, GCL Reference @subsection dither @findex dither @table @code @item (dither CAM-ID @{on|off|toggle@}) Turn dithering on or off in that camera. @end table @node draw, dump-handles, dither, GCL Reference @subsection draw @findex draw @table @code @item (draw CAM-ID) Draw the view in CAM-ID, if it needs redrawing. @xref{redraw, @code{(redraw @dots{})}}. @end table @node dump-handles, echo, draw, GCL Reference @subsection dump-handles @findex dump-handles @table @code @item (dump-handles) Dump the list of currently active handles to stdout. This function is intended for internal debugging use only. @end table @node echo, emodule-clear, dump-handles, GCL Reference @subsection echo @findex echo @table @code @item (echo @dots{}) Write the given data to the special file @code{-}. Strings are written literally; lisp expressions are evaluated and their values written. If received from an external program, @code{echo} sends to the program's input. Otherwise writes to geomview's own standard output (typically the terminal). @end table @node emodule-clear, emodule-define, echo, GCL Reference @subsection emodule-clear @findex emodule-clear @table @code @item (emodule-clear) Clears the geomview application (external module) browser. @end table @node emodule-define, emodule-defined, emodule-clear, GCL Reference @subsection emodule-define @findex emodule-define @table @code @item (emodule-define NAME SHELL-COMMAND @dots{}) Define an external module called NAME, which then appears in the external-module browser. The SHELL-COMMAND string is a UNIX shell command which invokes the module. See @ref{emodule-run, @code{(emodule-run @dots{})}} for discussion of external modules. @end table @node emodule-defined, emodule-isrunning, emodule-define, GCL Reference @subsection emodule-defined @findex emodule-defined @table @code @item (emodule-defined @code{modulename}) If the given external-module name is known, returns the name of the program invoked when it's run as a quoted string; otherwise returns nil. @code{(echo (emodule-defined @code{name}))} prints the string. @end table @node emodule-isrunning, emodule-path, emodule-defined, GCL Reference @subsection emodule-isrunning @findex emodule-isrunning @table @code @item (emodule-isrunning NAME) Returns Lt if the emodule NAME is running, or Lnil if it is not running. NAME is searched for in the names as they appear in the browser and in the shell commands used to execute the external modules (not including arguments). @end table @node emodule-path, emodule-run, emodule-isrunning, GCL Reference @subsection emodule-path @findex emodule-path @table @code @item (emodule-path) Returns the current search path for external modules. Note: to actually see the value returned by this function you should wrap it in a call to echo: @code{(echo (emodule-path))}. @xref{set-emodule-path, @code{(set-emodule-path @dots{})}}. @end table @node emodule-run, emodule-sort, emodule-path, GCL Reference @subsection emodule-run @findex emodule-run, | @findex |, emodule-run @table @code @item (emodule-run SHELL-COMMAND ARGS@dots{}) Runs the given SHELL-COMMAND (a string containing a UNIX shell command) as an external module. The module's standard output is taken as geomview commands; responses (written to filename @code{-}) are sent to the module's standard input. The shell command is interpreted by /bin/sh, so e.g. I/O redirection may be used; a program which prompts the user for input from the terminal could be run with: @example (emodule-run yourprogram <&2) @end example If not already set, the environment variable $MACHTYPE is set to the name of the machine type. Input and output connections to geomview are dropped when the shell command terminates. Clicking on a running program's module-browser entry sends the signal SIGHUP to the program. For this to work, programs should avoid running in the background; those using FORMS or GL should call foreground() before the first FORMS or winopen() call. @xref{emodule-define, @code{(emodule-define @dots{})}}. @xref{emodule-start, @code{(emodule-start @dots{})}}. @end table @node emodule-sort, emodule-start, emodule-run, GCL Reference @subsection emodule-sort @findex emodule-sort @table @code @item (emodule-sort) Sorts the modules in the application browser alphabetically. @end table @node emodule-start, emodule-transmit, emodule-sort, GCL Reference @subsection emodule-start @findex emodule-start @table @code @item (emodule-start NAME) Starts the external module NAME, defined by emodule-define. Equivalent to clicking on the corresponding module-browser entry. @end table @node emodule-transmit, escale, emodule-start, GCL Reference @subsection emodule-transmit @findex emodule-transmit @table @code @item (emodule-transmit NAME LIST) Places LIST into external module NAME's standard input. NAME is searched for in the names of the modules as they appear in the External Modules browser and then in the shell commands used to execute the external modules. Does nothing if modname is not running. @end table @node escale, event-keys, emodule-transmit, GCL Reference @subsection escale @findex escale @table @code @item (escale GEOM-ID FACTOR) Same as scale but multiplies by exp(scale). Obsolete. @end table @node event-keys, event-mode, escale, GCL Reference @subsection event-keys @findex event-keys @table @code @item (event-keys @{on|off@}) Turn keyboard events on or off to enable/disable keyboard shortcuts. @end table @node event-mode, event-pick, event-keys, GCL Reference @subsection event-mode @findex event-mode @table @code @item (event-mode MODESTRING)w Set the mouse event (motion) mode; MODESTRING should be one of the following strings: @enumerate @item @code{"[r] Rotate"} @item @code{"[t] Translate"} @item @code{"[z] Cam Zoom"} @item @code{"[s] Geom Scale"} @item @code{"[f] Cam Fly"} @item @code{"[o] Cam Orbit"} @item @code{"[le] Edit Lights"} @end enumerate @end table @node event-pick, evert, event-mode, GCL Reference @subsection event-pick @findex event-pick @table @code @item (event-pick @{on|off@}) Turn picking on or off. @end table @node evert, exit, event-pick, GCL Reference @subsection evert @findex evert @table @code @item (evert GEOM-ID [yes|no]) Set the normal eversion state of GEOM-ID. If the second argument is omitted, toggle the eversion state. @end table @node exit, ezoom, evert, GCL Reference @subsection exit @findex exit @table @code @item (exit) Terminates geomview. @end table @node ezoom, freeze, exit, GCL Reference @subsection ezoom @findex ezoom @table @code @item (ezoom GEOM-ID FACTOR) Same as zoom but multiplies by exp(zoom). Obsolete. @end table @node freeze, geometry, ezoom, GCL Reference @subsection freeze @findex freeze @table @code @item (freeze CAM-ID) Freeze CAM-ID; drawing in this camera's window is turned off until it is explicitly redrawn with @code{(redraw CAM-ID)}, after which time drawing resumes as normal. @end table @node geometry, geomview-version, freeze, GCL Reference @subsection geometry @findex geometry @table @code @item (geometry GEOM-ID [GEOMETRY]) Specify the geometry for GEOM-ID. GEOMETRY is a string giving an OOGL geometry specification. If no object called GEOM-ID exists, it is created; in this case the GEOMETRY argument is optional, and if omitted, the new object GEOM-ID is given an empty geometry. @end table @node geomview-version, hdefine, geometry, GCL Reference @subsection geomview-version @findex geomview-version @table @code @item (geomview-version) Returns a string representing the version of geomview that is running. @end table @node hdefine, hdelete, geomview-version, GCL Reference @subsection hdefine @findex hdefine @table @code @item (hdefine @code{geometry}|@code{camera}|@code{window}|@code{appearance}|@code{image}|@code{transform}|@code{ntransform} name value) Sets the value of a handle of a given type. @example (hdefine ) @end example is generally equivalent to @example (read @{ define @}) @end example except that the assignment is done when hdefine is executed, (possibly not at all if inside a conditional statement), while the @code{read @dots{} define} performs assignment as soon as the text is read. @xref{References}. @xref{read, @code{(read @dots{})}}. @xref{hdelete, @code{(hdelete @dots{})}}. @end table @node hdelete, help, hdefine, GCL Reference @subsection hdelete @findex hdelete @table @code @item (hdelete [@code{geometry}|@code{camera}|@code{window}|@code{appearance}|@code{image}|@code{transform}|@code{ntransform}] name) Deletes the given handle. Note that the handle will not actually be deleted in case there are still other objects referring to the handle, but once those objects are gone, the handle will also automatically go away. The object the handle referes to (if any) will only be deleted if there are no other references to that object. If the optional first argument is omitted, then the first handle matching @var{name} will be deleted, regardless of the type of the object it is attached to. It is not an error to call this function with a non-existent handle, but it is an error to call this funcion with the name of a non-global handle, i.e. one that was not created by @code{(hdefine @dots{})} or @code{(read @dots{} @{ define @dots{}@})}. @xref{References}. @xref{read,@code{(read @dots{})}}. @xref{hdefine,@code{(hdefine @dots{})}}. @end table @node help, hmodel, hdelete, GCL Reference @subsection help @findex help @table @code @item (help [command]) Command may include @code{*}s as wildcards; see also @ref{help, @code{(?? @dots{})}} One-line command help; lists names only if multiple commands match. @end table @node hmodel, hsphere-draw, help, GCL Reference @subsection hmodel @findex hmodel @table @code @item (hmodel CAMID @{virtual|projective|conformal@}) Set the model used to display geometry in this camera. @xref{space, @code{(space @dots{})}}. @end table @node hsphere-draw, if, hmodel, GCL Reference @subsection hsphere-draw @findex hsphere-draw @table @code @item (hsphere-draw CAMID [yes|no]) Say whether to draw a unit sphere: the sphere at infinity in hyperbolic space, and a reference sphere in Euclidean and spherical spaces. If the second argument is omitted, @code{yes} is assumed. @end table @node if, inhibit-warning, hsphere-draw, GCL Reference @subsection if @findex if @table @code @item (if TEST EXPR1 [EXPR2]) Evaluates TEST; if TEST returns a non-nil value, returns the value of EXPR1. If TEST returns nil, returns the value of EXPR2 if EXPR2 is present, otherwise returns nil. @end table @node inhibit-warning, input-translator, if, GCL Reference @subsection inhibit-warning @findex inhibit-warning @table @code @item (inhibit-warning STRING) Inhibit warning inhbits geomview from displaying a particular warning message determined by STRING. At present there are no warning messages that this applies to, so this command is rather useless. @end table @node input-translator, interest, inhibit-warning, GCL Reference @subsection input-translator @findex input-translator @table @code @item (input-translator "#prefix_string" "Bourne-shell-command") Defines an external translation program for special input types. When asked to read a file which begins with the specified string, geomview invokes that program with standard input coming from the given file. The program is expected to emit OOGL geometric data to its standard output. In this implementation, only prefixes beginning with # are recognized. Useful as in @example (input-translator "#VRML" "vrml2oogl") @end example @end table @node interest, lines-closer, input-translator, GCL Reference @subsection interest @findex interest @table @code @item (interest (COMMAND [args])) Allows you to express interest in a command. When geomview executes that command in the future it will echo it to the communication pool from which the interest command came. @var{COMMAND} can be any command. Args specify restrictions on the values of the arguments; if args are present in the interest command, geomview will only echo calls to the command in which the arguments match those given in the interest command. Two special argument values may appear in the argument list. @code{*} matches any value. @code{nil} matches any value but supresses the reporting of that value; its value is reported as @code{nil}. The purpose of the interest command is to allow external modules to find out about things happening inside geomview. For example, a module interested in knowing when a geom called @code{foo} is deleted could say @code{(interest (delete foo))} and would receive the string @code{(delete foo)} when foo is deleted. Picking is a special case of this. For most modules interested in pick events the command @code{(interest (pick world))} is sufficient. This causes geomview to send a string of the form @code{(pick world @dots{})} every time a pick event (right mouse double click). See the @ref{pick, @code{(pick @dots{})}} command for details. @end table @node lines-closer, load, interest, GCL Reference @subsection lines-closer @findex lines-closer @table @code @item (lines-closer CAM-ID DIST) Draw lines (including edges) closer to the camera than polygons by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default. If DIST is too small, a line lying on a surface may be dotted or invisible, depending on the viewpoint. If DIST is too large, lines may appear in front of surfaces that they actually lie behind. Good values for DIST vary with the scene, viewpoint, and distance between near and far clipping planes. This feature is a kludge, but can be helpful. @end table @node load, load-path, lines-closer, GCL Reference @subsection load @findex load @table @code @item (load filename [command|geometry|camera]) Loads the given file into geomview. The optional second argument specifies the type of data it contains, which may be @code{command} (geomview commands), @code{geometry} (OOGL geometric data), or @code{camera} (OOGL camera definition). If omitted, attempts to guess about the file's contents. Loading geometric data creates a new visible object; loading a camera opens a new window; loading a command file executes those commands. @end table @node load-path, look, load, GCL Reference @subsection load-path @findex load-path @table @code @item (load-path) Returns the current search path for command, geometry, etc. files. Note: to actually see the value returned by this function you should wrap it in a call to echo: @code{(echo (load-path))}. @xref{set-load-path, @code{(set-load-path @dots{})}}. @end table @node look, look-encompass, load-path, GCL Reference @subsection look @findex look @table @code @item (look [objectID] [cameraID]) Rotates the named camera to point toward the center of the bounding box of the named object (or the origin in hyperbolic or spherical space). In Euclidean space, moves the camera forward or backward until the object appears as large as possible while still being entirely visible. Equivalent to @example progn ( (look-toward [objectID] [cameraID] @{center | origin@}) [(look-encompass [objectID] [cameraID])] ) @end example If objectID is not specified, it is assumed to be World. If cameraID is not specified, it is assumed to be targetcam. @end table @node look-encompass, look-encompass-size, look, GCL Reference @subsection look-encompass @findex look-encompass @table @code @item (look-encompass [objectID] [cameraID]) Moves cameraID backwards or forwards until its field of view surrounds objectID. This routine works only in Euclidean space. If objectID is not specified, it is assumed to be the world. If cameraID is not specified, it is assumed to be the targetcam. @xref{look-encompass-size, @code{(look-encompass-size @dots{})}}. @end table @node look-encompass-size, look-recenter, look-encompass, GCL Reference @subsection look-encompass-size @findex look-encompass-size @table @code @item (look-encompass-size [view-fraction clip-ratio near-margin far-margin]) Sets/returns parameters used by (look-encompass). view-fraction is the portion of the camera window filled by the object, clip-ratio is the max allowed ratio of near-to-far clipping planes. The near clipping plane is 1/near-margin times closer than the near edge of the object, and the far clipping plane is far-margin times further away. Returns the list of current values. Defaults: .75 100 0.1 4.0 @end table @node look-recenter, look-toward, look-encompass-size, GCL Reference @subsection look-recenter @findex look-recenter @table @code @item (look-recenter [objectID] [cameraID]) Translates and rotates the camera so that it is looking in the -z direction (in objectID's coordinate system) at the center of objectID's bounding box (or the origin of the coordinate system in non-Eudlidean space). In Euclidean space, the camera is also moved as close as possible to the object while allowing the entire object to be visible. Also makes sure that the y-axes of objectID and cameraID are parallel. @end table @node look-toward, merge, look-recenter, GCL Reference @subsection look-toward @findex look-toward @table @code @item (look-toward [objectID] [cameraID] [origin | center]) Rotates the named camera to point toward the origin of the object's coordinate system, or the center of the object's bounding box (in non-Euclidean space, the origin will be used automatically). Default objectID is the world, default camera is targetcam, default location to point towards is the center of the bounding box. @end table @node merge, merge-ap, look-toward, GCL Reference @subsection merge @findex merge @table @code @item (merge @{window|camera@} CAM-ID @{ WINDOW or CAMERA @dots{} @}) Modify the given window or camera, changing just those properties specified in the last argument. E.g. @example (merge camera @code{Camera} @{ far 20 @}) @end example sets Camera's far clipping plane to 20 while leaving other attributes untouched. @end table @node merge-ap, merge-base-ap, merge, GCL Reference @subsection merge-ap @findex merge-ap @table @code @item (merge-ap GEOM-ID APPEARANCE) Merge in some appearance characteristics to GEOM-ID. Appearance parameters include surface and line color, shading style, line width, and lighting. @end table @node merge-base-ap, merge-baseap, merge-ap, GCL Reference @subsection merge-base-ap @findex merge-base-ap @table @code @item (merge-base-ap APPEARANCE) @code{merge-base-ap} is a synonym for @ref{merge-baseap, @code{merge-baseap}}. @end table @node merge-baseap, morehelp, merge-base-ap, GCL Reference @subsection merge-baseap @findex merge-baseap @table @code @item (merge-baseap APPEARANCE) Merge in some appearance characteristics to the base default appearance (applied to every geom before its own apperance). Lighting is typically included in the base appearance. @end table @node morehelp, name-object, merge-baseap, GCL Reference @subsection morehelp @findex morehelp @table @code @item (morehelp command) @code{command} may include @code{*} wildcards. Prints more info than @ref{help, @code{(help command)}}. @end table @node name-object, ND-axes, morehelp, GCL Reference @subsection name-object @findex name-object @table @code @item (name-object ID NAME) Assign a new NAME (a string) to ID. A number is appended if that name is in use (for example, @code{foo} -> @code{foo<2>}). The new name, possibly with number appended, may be used as object's id thereafter. @end table @node ND-axes, ND-color, name-object, GCL Reference @subsection ND-axes @findex ND-axes @table @code @item (ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex [Windex]]]) In our model for N-D viewing (enabled by (dimension)), objects in N-space are viewed by N-dimensional @emph{camera clusters}. Each real camera window belongs to some cluster, and shows & manipulates a 3-D axis-aligned projected subspace of the N-space seen by its cluster. Moving one camera in a cluster affects its siblings. The ND-axes command configures all this. It specifies a camera's cluster membership, and the set of N-space axes which become the 3-D camera's X, Y, and Z axes. Axes are specified by their indices, from 1 to N for an N-dimensional space. Cluster CLUSTERNAME is implicitly created if not previously known. In principle it is possible to map the homogeneous component of a conformal 4 point to some other index; this would be done by specifying 0 for one of @code{Xindex}, @code{Yindex} or @code{Zindex} and giving @code{Windex} some positive value. This is probably not useful because Geomview does not support non-Euclidean geometries for in higher dimensions. To read a camera's configuration, use @code{(echo (ND-axes CAMID))}. The return value is an array of 4 integers, the last one should 0. @end table @node ND-color, ND-xform, ND-axes, GCL Reference @subsection ND-color @findex ND-color @table @code @item (ND-color CAMID [ (( [ID] (x1 x2 @dots{} xN) v r g b a v r g b a @dots{} ) ((x1 @dots{} xN) v r g b a v r g b a @dots{}) @dots{})] ) Specifies a function, applied to each N-D vertex, which determines the colors of N-dimensional objects as shown in camera CAMID. Each coloring function is defined by a vector (in ID's coordinate system) [x1 @dots{} xN] and by a sequence of value (v)/color(r g b a) tuples, ordered by increasing v. The inner product v = P.[x] is linearly interpolated in this table to give a color. If ID is omitted, the (xi) vector is assumed in universe coordinates. The ND-color command specifies a list of such functions; each vertex is colored by their sum (so e.g. green intensity could indicate projection along one axis while red indicated another. An empty list, as in (ND-color CAMID ()), suppresses coloring. With no second argument, (ND-color CAMID) returns that camera's color-function list. Even when coloring is enabled, objects tagged with the @code{keepcolor} appearance attribute are shown in their natural colors. @end table @node ND-xform, ND-xform-get, ND-color, GCL Reference @subsection ND-xform @findex ND-xform @table @code @item (ND-xform OBJID [ntransform @{ idim odim @dots{} @}]) Concatenate the given ND-transform with the current ND-transform of the object (apply the ND-transform to object ID, as opposed to simply setting its ND-transform). Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3. @end table @node ND-xform-get, ND-xform-set, ND-xform, GCL Reference @subsection ND-xform-get @findex ND-xform-get @table @code @item (ND-xform-get ID [from-ID]) Returns the N-D transform of the given object in the coordinate system of from-ID (default @code{universe}), in the sense * Transform = . Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3. @end table @node ND-xform-set, new-alien, ND-xform-get, GCL Reference @subsection ND-xform-set @findex ND-xform-set @table @code @item (ND-xform-set OBJID [ntransform @{ idim odim @dots{} @}]) Sets the N-D transform of the given object. In dimension N, this is an (N+1)x(N+1) matrix, so in that case idim and odim are expected to be both equal to (N+1). Note that all cameras in a camera-cluster have the same N-D transform. Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3. @end table @node new-alien, new-camera, ND-xform-set, GCL Reference @subsection new-alien @findex new-alien @table @code @item (new-alien name [GEOMETRY]) Create a new alien (geom not in the world) with the given name (a string). @var{GEOMETRY} is a string giving an OOGL geometry specification. If @var{GEOMETRY} is omitted, the new alien is given an empty geometry. If an object with that name already exists, the new alien is given a unique name. The light beams that are used to move around the lights are an example of aliens. They're drawn but are not controllable the way ordinary objects are: they don't appear in the object browser and the user can't move them with the normal motion modes. @end table @node new-camera, new-center, new-alien, GCL Reference @subsection new-camera @findex new-camera @table @code @item (new-camera name [CAMERA]) Create a new camera with the given name (a string). If a camera with that name already exists, the new object is given a unique name. If @var{CAMERA} is omitted a default camera is used. @end table @node new-center, new-geometry, new-camera, GCL Reference @subsection new-center @findex new-center @table @code @item (new-center [id]) Stop id, then set id's transform to the identity. Default id is target. Also, if the id is a camera, calls (look-recenter World id). The main function of the call to (look-recenter) is to place the camera so that it is pointing parallel to the z axis toward the center of the world. @end table @node new-geometry, new-reset, new-center, GCL Reference @subsection new-geometry @findex new-geometry @table @code @item (new-geometry name [GEOMETRY]) Create a new geom with the given name (a string). @var{GEOMETRY} is a string giving an OOGL geometry specification. If @var{GEOMETRY} is omitted, the new object is given an empty geometry. If an object with that name already exists, the new object is given a unique name. @end table @node new-reset, NeXT, new-geometry, GCL Reference @subsection new-reset @findex new-reset @table @code @item (new-reset) Equivalent to @code{(progn (new-center ALLGEOMS)(new-center ALLCAMS))}. @end table @node NeXT, normalization, new-reset, GCL Reference @subsection NeXT @findex NeXT @table @code @item (NeXT) Returns @code{t} if running on a NeXT, @code{nil} if not. A relict from ancient work-station year. @end table @node normalization, not, NeXT, GCL Reference @subsection normalization @findex normalization @table @code @item (normalization GEOM-ID @{each|none|all|keep@}) Set the normalization status of GEOM-ID. @table @code @item none suppresses all normalization. @item each normalizes the object's bounding box to fit into the unit sphere, with the center of its bounding box translated to the origin. The box is scaled such that its long diagonal, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2. @item all resembles @code{each}, except when an object is changing (e.g. when its geometry is being changed by an external program). Then, @code{each} tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while @code{all} normalizes the union of all variants of the object and normalizes accordingly. @item keep leaves the current normalization transform unchanged when the object changes. It may be useful to apply @code{each} or @code{all} normalization apply to the first version of a changing object to bring it in view, then switch to @code{keep}. @end table @end table @node not, or, normalization, GCL Reference @subsection not @findex not @table @code @item (not EXPR) Evaluates @code{EXPR}; if @code{EXPR} returns a non-@code{nil} value, returns nil, if @code{EXPR} returns @code{nil}, return @code{t}. @end table @node or, pick, not, GCL Reference @subsection or @findex or @table @code @item (or EXPR1 EXPR2) Evaluates @code{EXPR1}; if @code{EXPR1} returns non-@code{nil}, return its value, if @code{EXPR1} returns @code{nil}, evaluate @code{EXPR2} and return its value. @end table @node pick, pick-invisible, or, GCL Reference @subsection pick @findex pick @table @code @item (pick COORDSYS GEOMID G V E F P VI EI FI) The pick command is executed internally in response to pick events (right mouse double click). @table @var @item COORDSYS = coordinate system in which coordinates of the following arguments are specified. This can be: @table @code @item world world coord sys @item self coord sys of the picked geom (@var{GEOMID}) @item primitive coord sys of the actual primitive within the picked geom where the pick occurred. @end table @item GEOMID = id of picked geom @item G = picked point (actual intersection of pick ray with object) @item V = picked vertex, if any @item E = picked edge, if any @item F = picked face @item P = path to picked primitive [0 or more] @item VI = index of picked vertex in primitive @item EI = list of indices of endpoints of picked edge, if any @item FI = index of picked face @end table External modules can find out about pick events by registering interest in calls to @code{pick} via the @code{interest} command. In the ND-viewing context the co-ordinates are actually ND-points. They correspond to the 3D points of the pick relative to the sub-space defined by the viewport of the camera where the pick occurred. The co-ordinates are then padded with zeroes and transformed back to the co-ordinate system defined by @var{COORDSYS}. @end table @node pick-invisible, pickable, pick, GCL Reference @subsection pick-invisible @findex pick-invisible @table @code @item (pick-invisible [yes|no]) Selects whether picks should be sensitive to objects whose appearance makes them invisible; default yes. With no arguments, returns current status. @end table @node pickable, position, pick-invisible, GCL Reference @subsection pickable @findex pickable @table @code @item (pickable GEOM-ID @{yes|no@}) Say whether or not GEOM-ID is included in the pool of objects that could be returned from the pick command. @end table @node position, position-at, pickable, GCL Reference @subsection position @findex position @table @code @item (position objectID otherID) Set the transform of objectID to that of otherID. @end table @node position-at, position-toward, position, GCL Reference @subsection position-at @findex position-at @table @code @item (position-at objectID otherID [center | origin]) Translate objectID to the center of the bounding box or the origin of the coordinate system of otherID (parallel translation). Default is center. @end table @node position-toward, progn, position-at, GCL Reference @subsection position-toward @findex position-toward @table @code @item (position-toward objectID otherID [center | origin]) Rotate objectID so that the center of the bounding box or the origin of the coordinate system of the otherID lies on the positive z-axis of the first object. Default is the center of the bounding box. @end table @node progn, quit, position-toward, GCL Reference @subsection progn @findex progn @table @code @item (progn STATEMENT [ @dots{} ]) evaluates each STATEMENT in order and returns the value of the last one. Use progn to group a collection of commands together, forcing them to be treated as a single command. @end table @node quit, quote, progn, GCL Reference @subsection quit @findex quit @table @code @item (quit) @code{quit} is a synonym for @ref{exit, @code{exit}}. @end table @node quote, rawevent, quit, GCL Reference @subsection quote @findex quote @table @code @item (quote EXPR) returns the symbolic lisp expression EXPR without evaluating it. @end table @node rawevent, rawpick, quote, GCL Reference @subsection rawevent @findex rawevent @table @code @item (rawevent dev val x y t) Enter the specified raw event into the event queue. The arguments directly specify the members of the event structure used internally by geomview. This is the lowest level event handler and is not intended for general use. @end table @node rawpick, read, rawevent, GCL Reference @subsection rawpick @findex rawpick @table @code @item (rawpick CAMID X Y) Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordinates. This is a low-level procedure not intended for external use. @end table @node read, real-id, rawpick, GCL Reference @subsection read @findex read @table @code @item (read @{geometry|camera|appearance|image|ntransform|transform|command@} @{GEOMETRY or CAMERA or @dots{}@}) Read and interpret the text in @dots{} as containing the given type of data. Useful for defining objects using OOGL reference syntax, e.g. @example (geometry thing @{ INST transform : T geom : fred @}) (read geometry @{ define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 @}) (read transform @{ define T . If no filename specified, see @ref{rib-display, @code{(rib-display @dots{}}} for an explanation of the filename used. @end table @node scale, scene, rib-snapshot, GCL Reference @subsection scale @findex scale @table @code @item (scale GEOM-ID FACTOR [FACTORY FACTORZ]) Scale GEOM-ID, multiplying its size by FACTOR. The factors should be positive numbers. If FACTORY and FACTORZ are present and non-zero, the object is scaled by FACTOR in x, by FACTORY in y, and by FACTORZ in z. If only FACTOR is present, the object is scaled by FACTOR in x, y, and z. Scaling only really makes sense in Euclidean space. Mouse-driven scaling in other spaces is not allowed; the scale command may be issued in other spaces but should be used with caution because it may cause the data to extend beyond the limits of the space. @end table @node scene, set-clock, scale, GCL Reference @subsection scene @findex scene @table @code @item (scene CAM-ID [GEOMETRY]) Make CAM-ID look at GEOMETRY instead of at the universe. @end table @node set-clock, set-conformal-refine, scene, GCL Reference @subsection set-clock @findex set-clock @table @code @item (set-clock TIME) Adjusts the clock for this command stream to read @var{TIME} (in seconds) as of the moment the command is received. @xref{sleep-until, @code{(sleep-until @dots{})}}. @xref{clock, @code{(clock @dots{})}}. @end table @node set-conformal-refine, set-emodule-path, set-clock, GCL Reference @subsection set-conformal-refine @findex set-conformal-refine @table @code @item (set-conformal-refine CMX [N [SHOWEDGES]]) Sets the parameters for the refinement algorithm used in drawing in the conformal model. CMX is the cosine of the maximum angle an edge can bend before it is refined. Its value should be between -1 and 1; the default is 0.95; decreasing its value will cause less refinement. N is the maximum number of iterations of refining; the default is 6. SHOWEDGES, which should be @code{no} or @code{yes}, determines whether interior edges in the refinement are drawn. @end table @node set-emodule-path, set-load-path, set-conformal-refine, GCL Reference @subsection set-emodule-path @findex set-emodule-path @table @code @item (set-emodule-path (PATH1 @dots{} PATHN)) Sets the search path for external modules. The PATHi should be pathnames of directories containing, for each module, the module's executable file and a .geomview- file which contains an (emodule-define @dots{}) command for that module. This command implicitly calls (rehash-emodule-path) to rebuild the application brower from the new path setting. The special directory name @code{+} is replaced by the existing path, so e.g. (set-emodule-path (mydir +)) prepends mydir to the path. @end table @node set-load-path, set-motionscale, set-emodule-path, GCL Reference @subsection set-load-path @findex set-load-path @table @code @item (set-load-path (PATH1 @dots{} PATHN)) Sets search path for command, geometry, etc. files. The PATHi are strings giving the pathnames of directories to be searched. The special directory name @code{+} is replaced by the existing path, so e.g. (set-load-path (mydir +)) prepends mydir to the path. @end table @node set-motionscale, setenv, set-load-path, GCL Reference @subsection set-motionscale @findex set-motionscale @table @code @item (set-motionscale X) Set the motion scale factor to X (default value 0.5). These commands scale their motion by an amount which depends on the distance from the frame to the center and on the size of the frame. Specifically, they scale by dist + scaleof(frame) * motionscale where dist is the distance from the center to the frame and motionscale is the motion scale factor set by this function. Scaleof(frame) measures the size of the frame object. @end table @node setenv, sgi, set-motionscale, GCL Reference @subsection setenv @findex setenv @table @code @item (setenv name string) sets the environment variable @code{name} to the value @var{string}; the name is visible to geomview (as in pathnames containing @code{$name}) and to processes it creates, e.g. external modules. @end table @node sgi, shell, setenv, GCL Reference @subsection sgi @findex sgi @table @code @item (sgi) Returns @code{t} if running on an sgi machine, @code{nil} if not. A relict from the old work-station years. @end table @node shell, sleep-for, sgi, GCL Reference @subsection shell @findex !, shell @findex shell, ! @table @code @item (shell SHELL-COMMAND) Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is @code{!}. @end table @node sleep-for, sleep-until, shell, GCL Reference @subsection sleep-for @findex sleep-for @table @code @item (sleep-for TIME) Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; @code{sleep-for} inside @code{progn} won't delay execution of the rest of the progn's contents. @end table @node sleep-until, snapshot, sleep-for, GCL Reference @subsection sleep-until @findex sleep-until @table @code @item (sleep-until TIME) Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; @code{sleep-until} inside @code{progn} won't delay execution of the rest of the progn's contents. Time is measured according to this stream's clock, as set by @code{set-clock}; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME. @end table @node snapshot, soft-shader, sleep-until, GCL Reference @subsection snapshot @findex snapshot @table @code @item (snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]]) Save a snapshot of @var{CAM-ID} in the @var{FILENAME} (a string). The @var{FORMAT} argument is optional; it may be "ppmscreen" (the default), "ps", "ppm", "sgi" (on SGI machines), "ppmosmesa" (if built with libOSMesa) or "ppmosglx". A "ppmscreen" snapshot is created by reading the image directly from the given window; the window is popped above other windows and redrawn first, then its contents are written as a PPM format image. A "ppmosmesa" snapshot is drawn by Mesa's software renderer into a memory buffer in RAM. A "ppmosglx" snapshot is rendered into a GLX Pixmap buffer, which is also off-screen but may or may not reside in video RAM. Rendering may or may not be accelerated. The problem with on-screen snapshots is that the window must be mapped and not obscured by other windows. So on-screen snapshots will not work in the background, or when a screen safer is active. With "ps", dumps a Postscript picture representing the view from that window; hidden-surface removal might be incorrect. With "ppm", dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the @var{FILENAME} argument begins with "|", it's interpreted as a @code{/bin/sh} command to which the PPM or PS data should be piped. Optional @var{XSIZE} and @var{YSIZE} values are relevant only for "ppm" formats, and render to a window of that size (or scaled to that size, with aspect fixed, if only @var{XSIZE} is given) @end table @node soft-shader, space, snapshot, GCL Reference @subsection soft-shader @findex soft-shader @table @code @item (soft-shader CAM-ID @{on|off|toggle@}) Select whether to use software or hardware shading in that camera. @end table @node space, stereowin, soft-shader, GCL Reference @subsection space @findex space @table @code @item (space @{euclidean|hyperbolic|spherical@}) Set the space associated with the world. @end table @node stereowin, time-interests, space, GCL Reference @subsection stereowin @findex stereowin @table @code @item (stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize]) Configure CAM-ID as a stereo window. no: entire window is a single pane, stereo disabled@* horizontal: split left/right: left is stereo eye#0, right is #1.@* vertical: split top/bottom: bottom is eye#0, top is #1.@* colored: panes overlap, red is stereo eye#0, cyan is #1. A gap of @code{gapsize} pixels is left between subwindows; if omitted, subwindows are adjacent. If both layout and gapsize are omitted, e.g. (stereowin CAM-ID), returns current settings as a @code{(stereowin @dots{})} command list. This command doesn't set stereo projection; use @code{merge camera} or @code{camera} to set the stereyes transforms, and @code{merge window} or @code{window} to set the pixel aspect ratio & window position if needed. @end table @node time-interests, transform, stereowin, GCL Reference @subsection time-interests @findex time-interests @table @code @item (time-interests deltatime initial prefix [suffix]) Indicates that all interest-related messages, when separated by at least @code{deltatime} seconds of real time, should be preceded by the string @code{prefix} and followed by @code{suffix}; the first message is preceded by @code{initial}. All three are printf format strings, whose argument is the current clock time (in seconds) on that stream. A @code{deltatime} of zero timestamps every message. Typical usage:@* (time-interests .1 @code{(set-clock %g)} @code{(sleep-until %g)}) or@* (time-interests .1 @code{(set-clock %g)} "(sleep-until %g) (progn (set-clock %g)" ")") or@* (time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))". @end table @node transform, transform-incr, time-interests, GCL Reference @subsection transform @findex transform @table @code @item (transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [bbox-center|origin] [dt [@code{smooth}]]) Apply a motion (rotation, translation, scaling) to object @code{objectID}; that is, construct and concatenate a transformation matrix with objectID's transform The 3 IDs involved are the object that moves, the center of motion, and the frame of reference in which to apply the motion. The center is easiest understood for rotations: if centerID is the same as objectID then it will spin around its own axes; otherwise the moving object will orbit the center object. Normally frameID, in whose coordinate system the (mouse) motions are interpreted, is @code{focus}, the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the @code{space} command to change spaces. With type @code{rotate} x, y, and z are floats specifying angles in RADIANS. For types @code{translate} and @code{translate-scaled} x, y, and z are floats specifying distances in the coordinate system of the center object. The next field is optional and may consist of the keyword @code{bbox-center} or the keyword @code{origin} and modifies the location of the origin of @var{objectID}'s co-ordinate frame: @code{bbox-center} temporarily translates @var{objectID}'s co-ordinate frame to the center of @var{objectID}'s bounding box. @code{origin} is the default (and means not to modify @var{objectID}'s co-ordinate frame) and @code{bbox-center} is only valid in Euclidean space. The optional @code{dt} field allows a simple form of animation; if present, the object moves by just that amount during approximately @code{dt} seconds, then stops. If present and followed by the @code{smooth} keyword, the motion is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the motion is applied immediately. @end table @node transform-incr, transform-set, transform, GCL Reference @subsection transform-incr @findex transform-incr @table @code @item (transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center] [dt [smooth]]) Apply continuing motion: construct a transformation matrix and concatenate it with the current transform of objectID every refresh (sets objectID's incremental transform). Same syntax as transform. If optional @code{dt} argument is present, the object is moved at each time step such that its average motion equals one instance of the motion per @code{dt} seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds. @end table @node transform-set, ui-cam-focus, transform-incr, GCL Reference @subsection transform-set @findex transform-set @table @code @item (transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center]) Set objectID's transform to the constructed transform. Same syntax as transform. @end table @node ui-cam-focus, ui-center, transform-set, GCL Reference @subsection ui-cam-focus @findex ui-cam-focus @table @code @item (ui-cam-focus [focus-change|mouse-cross]) Set the focus policy for the camera windows. The default is @code{mouse-cross}: a camera is made the active camera (for interactive mouse events) when the mouse cursor crosses the window. Because this means it can become complicated to activate a specific camera (in the context of multiple camera windows) there is also the option to only change the camera focus when the window-manager decides to give it the focus for input events. So, after specifying @code{focus-change} it depends on the focus-change configuration of your window-manager when a camera becomes the active camera for mouse-interaction. To change this behaviour permanently you could, e.g., place the following line in your @file{$@{HOME@}/.geomview} file (@pxref{Customization}): @example (progn (ui-cam-focus focus-change) @dots{} # other stuff ) @end example @end table @node ui-center, ui-center-origin, ui-cam-focus, GCL Reference @subsection ui-center @findex ui-center @table @code @item (ui-center ID) Set the center for user interface (i.e. mouse) controlled motions to object ID. @end table @node ui-center-origin, ui-emotion-program, ui-center, GCL Reference @subsection ui-center-origin @findex ui-center-origin @table @code @item (ui-center-origin [origin|bbox-center]) Set the origin of the coordinate system of the @code{CENTER} object for user interface (i.e. mouse) controlled motions. The keyword @code{origin} means to use the origin of the coordinate system of the currently selected object, while @code{bbox-center} means to use the center of the bouding box of the current object. The keyword @code{bbox-center} makes no sense if the geometry is non-Euclidean. Using either @code{bbox-center} or @code{origin} does not make a difference if the center object is not a @emph{geometry}, e.g. if it is a camera. Same holds if the World is the currently selected object. @end table @node ui-emotion-program, ui-emotion-run, ui-center-origin, GCL Reference @subsection ui-emotion-program @findex ui-emotion-program @table @code @item (ui-emotion-program PROGRAM) This is an obsolete command. Use its new eqivalent @ref{emodule-define, @code{emodule-define}} instead. @end table @node ui-emotion-run, ui-freeze, ui-emotion-program, GCL Reference @subsection ui-emotion-run @findex ui-emotion-run @table @code @item (ui-emotion-run EMODULE) This is an obsolete command. Use its new eqivalent @ref{emodule-start, @code{emodule_start}} instead. @end table @node ui-freeze, ui-html-browser, ui-emotion-run, GCL Reference @subsection ui-freeze @findex ui-freeze @table @code @item (ui-freeze @{on|off@}) Toggle updating user interface panels. Off by default. @end table @node ui-html-browser, ui-motion, ui-freeze, GCL Reference @subsection ui-html-browser @findex ui-html-browser @table @code @item (ui-html-browser BROWSER) Use @var{BROWSER} for viewing the @var{HTML}-version of the manual when the @samp{Manual (HTML)} menu item is selected in the @samp{Help}-menu. If the @code{(ui-html-browser...)} command was never executed, then the default is to use the browser stored in the @code{WEBBROWSER} environment variable. If the environment variable is unset then the default is compile-time dependent. @end table @node ui-motion, ui-panel, ui-html-browser, GCL Reference @subsection ui-motion @findex ui-motion @table @code @item (ui-motion @{inertia|constrain|own-coordinates@} @{on|off@}) Enable or disable certain properties of mouse-controlled motion. The purpose of this command is to give access to the respective toggles of the @emph{Main} panel's @emph{Motion} menu through GCL commands. @xref{Mouse Motions}. @table @code @item inertia Normally, moving objects have inertia: if the mouse is still moving when the button is released, the selected object continues to move. When @code{inertia} is off, objects cease to move as soon as you release the mouse. @item constrain It's sometimes handy to move an object in a direction aligned with a coordinate axis: exactly horizontally or vertically. Calling @code{(ui-motion constrain on)} changes the interpretation of mouse motions to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical motion. Note that the motion is still along the X or Y axes of the camera in which you move the mouse, not necessarily the object's own coordinate system. @item own-coordinates It's sometimes handy to move objects with respect to the coordinate system where they were defined, rather than with respect to some camera's view. When @code{(ui-motion own-coordinates on)} has been called, all motions are interpreted that way: dragging the mouse rightward in translate mode moves the object in its own @var{+X} direction, and so on. May be especially useful in conjunction with the @code{(ui-motion constrain on)} command. @end table @end table @node ui-panel, ui-pdf-viewer, ui-motion, GCL Reference @subsection ui-panel @findex ui-panel @table @code @item (ui-panel PANELNAME @{on|off@} [WINDOW]) Do or don't display the given user-interface panel. Case is ignored in panel names. Current @var{PANELNAMEs} are: @table @asis @item geomview main panel @item tools motion controls @item appearance appearance controls @item cameras camera controls @item lighting lighting controls @item obscure obscure controls (doesn't seem to exist any more) @item materials material properties controls @item command command entry box @item credits geomview credits @end table By default, the @code{geomview} and @code{tools} panels appear when geomview starts. If the optional Window is supplied, a @code{position} clause (e.g. (ui-panel obscure on @{ position xmin xmax ymin ymax @}) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. @code{(ui-panel obscure on @{})@} causes interactive positioning. @end table @node ui-pdf-viewer, ui-target, ui-panel, GCL Reference @subsection ui-pdf-viewer @findex ui-pdf-viewer @table @code @item (ui-pdf-viewer VIEWER) Use the executable @var{VIEWER} for viewing the @var{PDF}-version of the manual when the @samp{Manual (PDF)} menu-item is selected in the @samp{Help}-menu. If the @code{(ui-pdf-viewer @dots{})} command was never executed, then the default is to use the browser stored in the @code{PDFVIEWER} environment variable. If the environment variable is unset then the default is compile-time dependent. @end table @node ui-target, uninterest, ui-pdf-viewer, GCL Reference @subsection ui-target @findex ui-target @table @code @item (ui-target ID [yes|no]) Set the target of user actions (the selected line of the target object browser) to ID. The second argument specifies whether to make ID the current object regardless of its type. If @code{no}, then ID becomes the current object of its type (geom or camera). The default is @code{yes}. This command may result in a change of motion modes based on target choice. @end table @node uninterest, update, ui-target, GCL Reference @subsection uninterest @findex uninterest @table @code @item (uninterest (COMMAND [args])) Undoes the effect of an @code{interest} command. (COMMAND [args]) must be identical to those used in the @ref{interest, @code{interest}} command. @end table @node update, update-draw, uninterest, GCL Reference @subsection update @findex update @table @code @item (update [timestep_in_seconds]) Apply each incremental motion once. Uses timestep if it's present and nonzero; otherwise motions are proportional to elapsed real time. @end table @node update-draw, window, update, GCL Reference @subsection update-draw @findex update-draw @table @code @item (update-draw CAM-ID [timestep_in_seconds]) Apply each incremental motion once and then draw CAM-ID. Applies @code{timestep} seconds' worth of motion, or uses elapsed real time if @code{timestep} is absent or zero. @end table @node window, winenter, update-draw, GCL Reference @subsection window @findex window @table @code @item (window CAM-ID WINDOW) Specify attributes for the window of CAM-ID, e.g. its size or initial position, in the OOGL Window syntax. The special CAM-ID @code{default} specifies properties of future windows (created by @ref{camera, @code{camera}} or @ref{new-camera, @code{new-camera}}). @end table @node winenter, write, window, GCL Reference @subsection winenter @findex winenter @table @code @item (winenter CAM-ID) Tell geomview that the mouse cursor is in the window of CAM-ID. This function is for development purposes and is not intended for general use. @end table @node write, write-comments, winenter, GCL Reference @subsection write @findex write @table @code @item (write @{command|geometry|camera|transform|ntransform|window@} FILENAME [ID|(ID @dots{})] [self|world|universe|otherID]) write description of ID in given format to FILENAME. Last parameter chooses coordinate system for geometry & transform: self: just the object, no transformation or appearance (geometry only) world: the object as positioned within the World. universe: object's position in universal coordinates; includes Worldtransform other ID: the object transformed to otherID's coordinate system. A filename of @code{-} is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, @code{-} means geomview's standard output (@pxref{command, @code{(command @dots{})}}). The ID can either be a single id or a parenthesized list of ids, like @code{g0} or @code{(g2 g1 dodec.off)}. @end table @node write-comments, write-handle, write, GCL Reference @subsection write-comments @findex write-comments @table @code @item (write-comments FILENAME GEOMID PICKPATH) write OOGL COMMENT objects in the GEOMID hierarchy at the level of the pick path to FILENAME. Specifically, COMMENTS at level (a b c @dots{} f g) will match pick paths of the form (a b c @dots{} f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the @code{pick} command) is a list of integer counters specifying a subpart of a hierarchical OOGL object. Descent into a complex object (LIST or INST) adds a new integer to the path. Traversal of simple objects increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire string of zero, one, or more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses. Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objects, which can be attached to other OOGL objects via the LIST type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned. @end table @node write-handle, write-sexpr, write-comments, GCL Reference @subsection write-handle @findex write-handle @table @code @item (write-handle PREFIX FILENAME HANDLE) Writes the object underlying the given handle to @var{FILENAME}. This function is intended for internal debugging use only. @end table @node write-sexpr, xform, write-handle, GCL Reference @subsection write-sexpr @findex write-sexpr @table @code @item (write-sexpr FILENAME LISPOBJECT) Writes the given LISPOBJECT to FILENAME. This function is intended for internal debugging use only. @end table @node xform, xform-incr, write-sexpr, GCL Reference @subsection xform @findex xform @table @code @item (xform ID TRANSFORM) Concatenate TRANSFORM with the current transform of the object (apply TRANSFORM to object ID). @end table @node xform-incr, xform-set, xform, GCL Reference @subsection xform-incr @findex xform-incr @table @code @item (xform-incr ID TRANSFORM) Apply continual motion: concatenate TRANSFORM with the current transform of the object every refresh (set object ID's incremental transform to TRANSFORM). @end table @node xform-set, zoom, xform-incr, GCL Reference @subsection xform-set @findex xform-set @table @code @item (xform-set ID TRANSFORM) Overwrite the current object transform with TRANSFORM (set object ID's transform to TRANSFORM). @end table @node zoom, , xform-set, GCL Reference @subsection zoom @findex zoom @table @code @item (zoom CAM-ID FACTOR) Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number. @end table @comment **************************************************************** @node Non-Euclidean Geometry, Mathematica, GCL, Top @chapter Non-Euclidean Geometry Geomview supports hyperbolic and spherical geometry as well as Euclidean geometry. The three buttons at the bottom of the @emph{Main} panel are for setting the current geometry type. In each of the three geometries, three models are supported: @emph{Virtual}, @emph{Projective}, and @emph{Conformal}. You can change the current model with the @emph{Model} browser on the @emph{Camera} panel. Each Geomview camera has its own model setting. The default model is all three spaces is @emph{Virtual}. This corresponds to the camera being in the same space as, and moving under the same set of transformations as, the geometry itself. In Euclidean space @emph{Virtual} is the most useful model. The other models were implemented for hyperbolic and spherical spaces and just happen to work in Eucldiean space as well: @emph{Projective} is the same as @emph{Virtual} but by default displays the unit sphere, and @emph{Conformal} displays everything inverted in the unit sphere. In hyperbolic space, the @emph{Projective} model setting gives a view of the projective ball model of hyperbolic 3-space imbedded in Euclidean space. The camera is initially outside the unit ball. In this model, the camera moves by Euclidean motions and geometry moves by hyperbolic motions. @emph{Conformal} model is similar but shows the conformal ball model instead. In spherical space, the @emph{Projective} model gives a view of half of the 3-sphere imbedded in Euclidean 3-space. Spherical motions give rise to projective transformations in the @emph{Projective} model, and to @tex M\"{o}bius @end tex @ifnottex Moebius @end ifnottex transformations in the @emph{Conformal} model. In both of these models the camera moves by Euclidean motions. In @emph{Projective} and @emph{Conformal} models, the unit sphere is drawn by default. You can turn it off and on at will using the @emph{Draw Sphere} button in the @emph{Camera} panel. In the @emph{Conformal} model, polygons and edges are subdivided as necessary to make them look curved. The parameters which determine this subdivision can be set with the @code{set-conformal-refine} GCL command. @xref{set-conformal-refine,@code{(set-conformal-refine @dots{})}}. There are several sample hyperbolic space objects in the @file{data/geom/hyperbolic} subdirectory of the Geomview directory. Likewise, the subdirectory @file{data/geom/spherical} contains several sample spherical space objects. @comment **************************************************************** @node Mathematica, Installation, Non-Euclidean Geometry, Top @chapter Mathematica Graphics in Geomview or RenderMan Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc. There are two ways to do this. @enumerate @item Use Mathematica to write a graphics object to a file in OOGL format or in RIB format. @item Use Geomview as the default display for all 3D graphics output in Mathematica. @end enumerate You can also use these packages to save Mathematica graphics in RenderMan (RIB) format. Since the format of Mathematica graphics objects is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either of the above you must install this package. @menu * OOGL.m:: Generating OOGL files in Mathematica. * Geomview.m:: Geomview as Mathematica's Default 3D Display. * RenderMan:: Generating RenderMan files in Mathematica. * Remote Display:: Using Geomview and Mathematica on different computers. * Package Details:: Some details about the packages. * Package Installation:: Installing the Mathematica->Geomview package. @end menu @comment ================================================================ @node OOGL.m, Geomview.m, Mathematica, Mathematica @section Using Mathematica to generate OOGL files The package @file{OOGL.m} allows Mathematica to write graphics objects in OOGL format. To use it, give the command @code{<< OOGL.m} to Mathematica to load the package. The @code{WriteOOGL[@var{file},@var{graphics}]} command writes an OOGL description of the 3D graphics object @var{graphics} to the file named @var{file}.@refill This package also provides the @code{Geomview} command which sends a 3D graphics object to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the @code{Geomview} command. @table @code @item Geomview[@var{graphics}] Sends the 3D graphics object @var{graphics} to Geomview as a geom named @code{Mathematica}. Subsequent usage of @code{Geomview[@var{graphics}]} replaces the @code{Mathematica} object in Geomview with the new @var{graphics}. @item @code{Geomview[@var{name},@var{graphics}]} Sends the 3D graphics object @var{graphics} to Geomview as a geom named @var{name}. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objects at once and allow independent control over them. @end table @example % math Mathematica 2.0 for SGI Iris Copyright 1988-91 Wolfram Research, Inc. -- GL graphics initialized -- In[1] := <"riemann"] @end example @noindent This displays the graphics @code{%3} on the remote host named @code{riemann}.@refill @code{Geomview} recognizes the string @code{"local"} as a value for @code{$DisplayHost}; it forces the graphics to be displayed on the local machine.@refill In addition to knowing the name of the machine you want to run Geomview on, @code{Geomview} needs to know the type of that machine (the setting of the CPU variable that corresponds to the machine; @pxref{Source Code Installation}). By default, @code{Geomview} assumes that it is the same kind of computer as the one you are running Mathematica on. The @code{MachType} option lets you explicitly specify the type of the @code{DisplayHost} computer; it should be one of the strings @code{"sgi"} or @code{"next"} or @code{"x11"}.@refill You can use @code{SetOptions} to change the default @code{DisplayHost} and @code{MachType}. For example, @example In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"] @end example @noindent arranges for @code{Geomview} to run Geomview on an SGI workstation named @code{riemann}.@refill @comment ---------------------------------------------------------------- @node Chunks, , Networked Geomview, Remote Display @subsection Transporting Mathematica Files to Geomview by Hand The auxilliary function @code{WriteChunk} is for those who can only use Mathematica on a computer that Geomview isn't installed on. @code{WriteChunk[@var{file}, @var{graphics}]} generates a file named @var{file} which contains the graphics object @var{graphics} in the format accepted by @file{math2oogl}.@refill You can transfer that file to a computer that has Geomview installed on it and then use the programs @file{math2oogl}, @file{oogl2ri}b, and @file{geomview} directly from the shell. These programs are distributed in the @file{bin/} subdirectory of the Geomview directory, and may have been installed so that they are on your @code{path}. @example In[1]:= < mma.oogl @end example @noindent to convert it to the OOGL file @file{mma.oogl} which you can then view using Geomview. This is the equivalent of the @code{WriteOOGL} command. For a result equivalent to the @code{Geomview} or @code{Show} commands, type @example math2oogl -togeomview Mathematica geomview < mychunk @end example @noindent The @code{WriteRI}b command can be emulated from the shell as @example math2oogl < mychunk | oogl2rib -n mma.tiff @end example @noindent @comment ================================================================ @node Package Details, Package Installation, Remote Display, Mathematica @section Details of the Mathematica->Geomview Package The @file{OOGL.m} package uses the external program @file{math2oogl} to convert @code{Graphics3D} objects to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica. The converter will sometimes handle colored SurfaceGraphics objects correctly that Mathematica does not handle correctly, which means that Geomview[object] sometimes works where Show[object] will give errors. The converter supports the @code{Polygon}, @code{Line}, and @code{Point} graphics primitives, @code{RGBColor Graphics3D} directives, and @code{SurfaceGraphics} objects with or without @code{RGBColor} directives, and lists of any combination of these. It silently ignores all other directives. The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib). In the @code{WriteOOGL} and @code{WriteRIB} commands, filename can either be a string containing a filename, an @code{OutputStream} object, or a string starting with a @code{!} to send the output to a command. Object can be a @code{Graphics3D} object, a @code{SurfaceGraphics} object, or a list of these.@refill The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host. @comment ================================================================ @node Package Installation, , Package Details, Mathematica @section Installing the Mathematica Packages @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. The installed Mathematica data-files can be found in @file{PREFIX/share/geomview/Mathematica/}. @end quotation If Geomview is properly installed on your system according to the instructions in @xref{Installation}, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed. In this section, the phrase @emph{Geomview installation} refers any of the procedures in @xref{Installation}. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution. @enumerate @item The relevant mathematica files are @file{OOGL.m}, @file{Geomview.m}, and @file{BezierPlot.m}; Mathematica must be able to find these files. They are distributed in the @file{PREFIX/share/geomview/Mathematica} subdirectory of the binary distributions, and in the @file{TOPSRCDIR/src/bin/geomutil/math2oogl} subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the @code{$Path} variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path. The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (@code{MMAPACKAGEDIR}). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the @code{$Path} variable each time you run Mathematica. @item The package @file{OOGL.m} needs to be able to invoke the programs @file{geomview}, @file{math2oogl}, and @file{oogl2rib}. The Geomview installation procedure installs these programs into a directory that you specify for executables (@code{BINDIR}). Ideally, this directory should be on your shell's @code{$PATH}. More specifically, it should be on the @code{$PATH} of the shell in which Mathematica runs; the directory @file{/usr/local/bin} is usually a good choice. You can see the list of directories on this path by giving the command @code{!echo $path} in Mathematica. If for some reason you can't arrange for @file{geomview}, @file{math2oogl}, and @file{oogl2rib} to be in a directory on the shell's @code{$path}, you can modify @file{OOGL.m} to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables @code{$GeomviewPath} and @code{$GeomRoot}, which are defined near the top of the file. Change @code{$GeomviewPath} to the absolute pathname of the @file{geomview} shell script on your system. Change @code{$GeomRoot} to the absolute pathname of the @file{$GEOMROOT} directory on your system. If you do this, you should also make sure there are copies of @file{geomview}, @file{math2oogl}, and @file{oogl2ri}b in the @file{$GEOMROOT/bin/}. @item The @file{geomview} shell script, which @file{OOGL.m} uses to invoke Geomview, needs to be able to find the geomview executable file ( called @file{gvx}). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the @file{geomview} script are correct. @end enumerate @comment **************************************************************** @node Installation, Support, Mathematica, Top @chapter Installation @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. @end quotation What you do to install Geomview depends on which kind of computer you have and on whether you have the source distribution or the binary distribution. In general, if you don't care about looking at Geomview's source code, you should get one of the binary distribution. The binary installation is much easier and quicker than compiling and installing the source code. @menu * Unix Binary Installation:: Installing the Unix Binary Distribution * Source Code Installation:: Compiling and Installing the Source Code Distribution. @end menu @comment ================================================================ @node Unix Binary Installation, Source Code Installation, Installation, Installation @section Installing the Unix Binary Distribution @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. @end quotation If you have just obtained a copy of the binary distribution for a Unix system (Linux, SGI, Solaris, HP, etc), you should be able to run Geomview and make use of most of its features immediately after unpacking it by @code{cd}'ing to the directory that it is in and typing @code{geomview}. In order to fully install Geomview so that you can run it from any directory and use all of its features, follow the steps in this section. In particular, you must go through this installation procedure in order to use Geomview to display Mathematica graphics. Geomview is distributed in a directory that contains various files and subdirectories that Geomview needs at run-time, such as data files and external modules. It also contains other things distributed with Geomview, such as documentation and (in the soure-code distribution) source-code. We refer to the root directory of this tree as the @file{$GEOMROOT} directory. This is the directory called @file{Geomview} that is created when you unpack the distribution file. To install Geomview on your system, arrange for the @file{$GEOMROOT} directory to be in a permanent place. Then, in a shell window, @code{cd} to that directory and type @code{install}. This runs a shell script which does the installation after asking you several questions about where you want to install the various components of Geomview. After running the @code{install} script you should now be able to run Geomview from any directory on your system. (You may need to give the @code{rehash} command in any shells on your computer that were started up before you did the installation.) The @file{install} script puts copies of the files in @file{$GEOMROOT/bin/} and @file{$GEOMROOT/man} into the directories you specified for executables and man pages, respectively. Once you have done the installation you can cut down one the disk space required by Geomview by removing some files from these directories, since copies have been installed elsewhere. You should first test that your installed Geomview works properly because once you remove these files from their distribution directories you will not be able to do the installation again. In particular, the files you can remove are @table @asis @item @file{$GEOMROOT/bin/}: (where @file{} is the type of system you are on, e.g. @file{linux}, @file{sgi}, @file{hpux}, etc). Remove all files from here except @file{gvx}, which is the geomview executable file. DO NOT REMOVE @file{gvx}. It is not installed elsewhere. @item @file{$GEOMROOT/man}: You can remove all the files in this directory. @end table @comment ================================================================ @menu * Unix Binary Detail:: @end menu @node Unix Binary Detail, , Unix Binary Installation, Unix Binary Installation @subsection Details of the Unix Binary Installation @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. @end quotation The @code{install} script should be self-explanatory; just run it and answer the questions. This section gives some details for system administrators and other users who may want to know more about the installation. The installation is actually done by @code{make}; the @code{install} script queries the user for the settings of the following @code{make} variables and then invokes @code{make install}. @table @asis @item @code{GEOMROOT}: the absolute pathname of the Geomview root directory. The @code{geomview} shell script, which is what users invoke to run Geomview, uses this to set various environment variables that Geomview needs. It is very important that this be an @emph{absolute} pathname --- i.e. it should start with a '/'. @item @code{BINDIR}: a directory where executable files are installed. The @code{geomview} shell script goes here, as well as various other auxiliary programs that can be used in conjunction with @code{geomview}. This should be a directory that is on users' @file{$path}. These auxiliary programs are distributed in the @file{$GEOMROOT/bin/} directory; if you specify this directory for @code{BINDIR}, they are left in that directory. @item @code{MANDIR}: a directory where Unix manual pages are installed. These are distributed in the @file{$GEOMROOT/man} subdirectory; if you specify this directory for @code{MANDIR}, they are left in that directory. @item @code{MMAPACKAGEDIR}: a directory where Mathematica packages are installed. This should be a directory that Mathematica searches for packages that it loads; you can see what directories your Mathematica searches by looking at the value of the @code{$Path} variable in a Mathematica session. The installation process will install some packages there which allow you to use Geomview to display Mathematica graphics. These packages are distributed in the @file{$GEOMROOT/mathematica} subdirectory; if you specify this directory for @code{MMAPACKAGEDIR}, or if you specify the empty string for @code{MMAPACKAGEDIR}, the packages are left in that directory. For more details about the way these Mathematica packages connect to Geomview, @pxref{Package Installation}. @end table @comment ================================================================ @node Source Code Installation, , Unix Binary Installation, Installation @section Compiling and Installing the Source Code Distribution @quotation @b{BUG} This section is out of date. @code{Geomview} follows the GNU-installation habits, data goes to @file{PREFIX/share/geomview/}, user executables to @file{PREFIX/bin/}, private executables to @file{PREFIX/libexec/geomview/}, libraries to @file{PREFIX/lib/} where @code{PREFIX} denotes the installation prefiex specified for the @file{TOPSRCDIR/configure} script. Please have a look at the files @file{TOPSRCDIR/INSTALL} and @file{TOPSRCDIR/INSTALL.Geomview} for installation instructions. @end quotation The main reason to get the source code distribution is to look at and/or work with the source code. If you are only concered with @emph{using} Geomview it is better to get the binary distribution. It takes anywhere from a few minutes to an hour or more to compile the entire source distribution, depending on what kind of computer you have. Let @file{$GEOMROOT} denote the full pathname of the Geomview source code directory; this is the directory called @file{Geomview} that is created when you unpack the distribution. This directory contains the Geomview source code as well as various other files and subdirectories that Geomview needs when it runs. Before doing any compilation you should edit the file @file{$GEOMROOT/makefiles/mk.site.default}. This file defines some @code{make} variables which specify your local configuration. This includes the pathnames of the directories into which Geomview will be installed, and possibly some other settings as well. There are comments in the file telling you what to do. This file is included by every Makefile in the source tree, so the settings you specify here are used throughout the source. If you will be compiling for multiple systems, you can do them all in the same directory tree. By default the Makefiles are set up to put the objects files, libraries, and executables in directories which depend on the type of computer, so the two architectures will not interfere with each other. The Makefiles use a variable called @code{CPU} to determine the type of machine. Before doing any compilation you must arrange for this variable to have a value. There are two ways you can do this. @enumerate @item If you will always be compiling Geomview on the same type of computer edit the file @file{$GEOMROOT/makefiles/Makedefs.global} to set the @code{CPU} variable to one of the values @file{linux}, @file{FreeBSD}, @file{sgi}, @file{hpux}, @file{hpux-gcc}, @file{solaris}, @file{sun4os4} (for Suns with SunOS 4, not Solaris), @file{rs6000}, or @file{alpha}. If you're using a type of system not in this list, make up a new value for CPU, and write a @file{mk.} file for it patterned after the other @file{mk.*} in the @file{makefiles} subdirectory. @item If you will be compiling on more than one type of computer you can set a shell environment variable named @code{CPU} to one of the values above and the Makefiles will inherit the value from the environment. @end enumerate @noindent Note that many of the Makefiles refer to a variable called @code{MACHTYPE}; this variable tells which type of graphics system to compile Geomview for. The @file{mk.} files set this variable for you; in most cases its value is @file{x11}, which specifies that Geomview should be compiled for X windows. Once you have configured your source tree by editing the files as described above and setting the @code{CPU} variable, you can compile and install Geomview by typing @code{make install} in the @file{$GEOMROOT} directory. You can also type @code{make all}, or equivalently just @code{make}, to compile without installing, and then type @code{make install} later to install. You can use these same @code{make} comands in any subdirectory in the tree to recompile and/or install a part of Geomview or a module. If you want to modify the complier flags used during compilation, edit the file @file{$GEOMROOT/makefiles/Makedefs.global}; the @code{COPTS} variable specifies the flags passed to the C compiler (cc). @comment ********************************************************* @node Support, Contributing, Installation, Top @unnumbered Getting Technical Support for Geomview There are several ways to get support for Geomview. @enumerate @item Visit the Geomview web site, @uref{http://www.geomview.org}. It contains the latest documentation, news about development, and FAQ (Frequently Asked Questions) list. @item Send email to the geomview-users@@lists.sourceforge.net mailing list. This is a mailing list for discussing any issues related to using Geomview. To join the list, send an empty note with 'subscribe' in the subject line to @uref{mailto:geomview-users-request@@lists.sourceforge.net,geomview-users-request@@lists.sourceforge.net}, or visit the list web page at @uref{http://lists.sourceforge.net/mailman/listinfo/geomview-users}. @item Contract with Geometry Technologies for support. Geometry Technologies is a contract support and programming company that emerged from the Geometry Center, where Geomview was written. For more information visit the Geometry Technologies web site at @uref{http://www.geomtech.com}. @end enumerate @comment ############################################################ @node Contributing, Function Index, Support, Top @unnumbered Contributing to Geomview's Development If you are interested in contributing to the development of Geomview, there are several things you can do: @enumerate @item @strong{Volunteer programming work}. If you are a programmer and make an improvement to Geomview, contact the other geomview authors by sending a note to the @file{geomview-users} mailing list (see @uref{http://lists.sourceforge.net/mailman/listinfo/geomview-users}). @item @strong{Contract with Geometry Technologies}. Geometry Technologies, Inc. is a consulting firm that provides contract technical support and custom programming services in the area of 3D graphics. This includes a wide range of services related to 3D graphics, included but not limited to applications involving Geomview. To the extent that resources allow, Geometry Technologies supports the developement of Geomview; in particular it hosts the @uref{http://www.geomview.org} web site, and its staff make ongoing improvements to Geomview itself. If you are in a position to pay for technical support or custom programming work, contracting with Geometry Technologies indirectly supports Geomview. You can also contract with with Geometry Technologies to have particular features that you want added to Geomview, or to port Geomview to a new platform. For more information see Geometry Technologies web site at @uref{http://www.geomtech.com}. @end enumerate Thank you. @comment **************************************************************** @node Function Index, List of Figures, Contributing, Top @unnumbered Function Index @printindex fn @comment **************************************************************** @contents @node List of Figures, , Function Index, Top @unnumbered List of Figures @listoffloats Figure @bye @c LocalWords: Geomview RenderMan texinfo letterpaper setfilename geomview sp @c LocalWords: settitle texi dircategory direntry titlepage titlefont vskip @c LocalWords: Munzner uref Hanrahan MinneView OOGL Meuer Kaplan SGI NeXT GPL @c LocalWords: SGIs NeXTStep OpenGL Geomview's unnumberedsec Gunn Krech MacOS @c LocalWords: Daeron Cygwin SystemV FreeBSD Solaris Precompiled emph Heine @c LocalWords: Renderman Mathematica pxref smallexample Yoyodyne Thurston GCL @c LocalWords: xref Bezier var emodule iconify PPM NCMESH NCOFF RGBA geomview-1.9.4/doc/README0000644000175000001440000000207510447731020011713 00000000000000This directory contains the Geomview manual and various other pieces of documentation. geomview.pdf Manual in PDF format. geomview.html/ Manual in HTML format. geomview Manual in GNU info format. geomview-* geomview.texi Texinfo source code for manual. example1.c Example external modules; these are mentioned example3.c in the manual; they're included here so you example2.c don't have to type them in if you want to play example4.tcl with them. oogltour A gentle introduction to the OOGL file format (OOGL is the data file format that Geomview understands). newsletter_article.txt An article that appeared in an issue of the Geometry Center newsletter announcing the first release of Geomview, in January of 1992. figs/ This directory contains Postscript versions of all the images in the manual; it's only used in creating the pdf version of the manual. It isn't relevant if all you're doing is reading the manual. *.{1,3,5*} Various man pages, possibly out-of-date. The Geomview manual contains the same information as these, but is more current. geomview-1.9.4/doc/oogltour-pt_BR0000644000175000001440000005072310653573027013651 00000000000000Tradução usando a versão 1.1.1.1 do cvs em inglês. Tutorial: Os Formatos Geométricos de Arquivo OOGL (e do Geomview conseqüêntemente) OOGL é a abreviatura de Object Oriented Graphics Library (Biblioteca Gráfica Orientada a Objetos. Um objeto OOGL é chamado um Geom. Existe um formato de arquivo texto para cada tipo de Geom. Você pode chamar um arquivo texto em qualquer progama que usa o formato OOGL. Geomview é um visualizador interativo de objetos tridimensionais construído sobre o topo do OOGL. (Geomview executa sobre as palntaformas Silicon Graphics, NextStep, e X-Windows.) Existem notas do Geomview entre colchêtes ao longo deste guia dizendo a você o que fazer no Geomview para ver do que estamos falando. Posteriormente notas assumem que você tenha ambos know how para fazer e tenha realizado o que as notas anteriores disseram para você fazer. Todos os arquivos referenciados nesse documento estão no diretório de exemplos de arquivos OOGL que acompanham o Geomview. A seção Os formatos de arquivo OOGL do manual do Geomview é uma referência completa para a sintaxe dos formatos de arquivo. Esse tutorial é uma tentativa de levar você mais gentilmente ao mundo dos formatos de arquivos OOGL. ---------------------------------------------------------------------- ---------------------------------------------------------------------- QUAD Iniciamos um um objeto muito simples: um quadrado. Especificamente, o quadrado unitário no plano xy em z=0. ---------------------------------------------------------------------- "square.quad": QUAD -1 -1 0 1 -1 0 1 1 0 -1 1 0 ---------------------------------------------------------------------- O cabeçalho "QUAD" identifica o tipo de arquivo. (Você pode tambémusar o cabeçalho "POLY" para este tipo por razZões históricas.) Um arquivo QUAD é uma lista de 4*n vertices onde n é o número de quadriláteros. Esse arquivo contém somente um quadrilátero. Você também pode usar esse formato para especificar triângulos: apenas use um quadrilátero degenerado onde dois dos quatro vértices são identicos. Os vértices nesse arquivo são simples: apenas as coordenadas x,y, e z do ponto. [GEOMVIEW: Digite "geomview square.quad" de uma janela de shell sobre um Silicon Graphics Iris. Gire o quadrado em torno de si mesmo com o botão esquerdo do mouse após geomview Tê-lo carregado. Sinta-se livre para brincar com geomview por um tempo se a imaginação atingir você durante esse tutorial. ] O arquivo seguinte tem vértices mais complexos por incluirem uma cor com as coordenadas do ponto. ---------------------------------------------------------------------- "csquare.quad": CQUAD -1 -1 0 1 0 0 1 1 -1 0 0 1 0 1 1 1 0 0 1 0 1 -1 1 0 1 0 0 1 ---------------------------------------------------------------------- Esses foram os mesmos pontos do quadrado anterior, mas com dois cantos vermelhos e dois cantos verdes. O cabeçalho é agora "CQUAD" para indicar que seus vértices possuem informações de cores além das informações de ponto. Cores são especificadas pelas quádruplas (r,g,b,a) de números em ponto flutuante entre 0 e 1. Qualquer cor que pode ser mostrada na tela de um computador pode ser codificada por alguma combinação de vermelho (r), verde (g) e azul (b). A quarta componente, alfa, representa a opacidade: 0 é transparente e 1 é opaco. As plantaformas X-Window, NextStep, e some SGI ignoram a informação alfa inteiramente, mas um instantâneo Renderman irá usar a informação alfa se a transparência estiver habilitada. Algumas plantaformas SGI utilizam a informação alfa, mas a figura é garantidamente incorreta. [geomview: Apague o objeto atual pressionando o botão Delete. Para chamar csquare.quad, pressione File/Open/segunda linha do navegador de diretórios e localize o "csquare.quad" na lista dos arquivos (pressione o botão OK quando tiver terminado) dentro da caixa que aparece. Você está provavelmente surpreso porque esse quadrado está todo com uma cor somente. O modo de tonalidade de cor padrão é o tipo plano, onde cada polígono ou face poligonal é da mesma cor. Os outros dois modos de tonalidade de cor, constante e liso, irão ambos mostrar faces multicoloridas onde as cores são lisamente interpoladas entre os vértices. Tonalidade de cor constante ignora todas as informações de iluminação, enquanto tonalidade de cor lisa interpola iluminação e também coloração entre os vértices. Para mudar o modo de sombreamento, primeiro chame o painel de aparência clicando sobre a linha Aparência no navegador principal de painéis. Agora alterne de modo em modo clicando em diferentes linhas no navegador de @emph{Shading}. ] É hora de ir na direção de coisas maiores e melhores. "dodec.quad": QUAD 0 0 0.794654 0 0.491123 0.794654 0.356822 0.491123 0.794654 0.467086 0.151765 0.794654 0 0 0.794654 -0.467086 0.151765 0.794654 -0.356822 0.491123 0.794654 4.89153e-09 0.491123 0.794654 0 0 0.794654 -0.288675 -0.397327 0.794654 -0.57735 -0.187593 0.794654 -0.467086 0.151766 0.794654 0 0 0.794654 0.288675 -0.397327 0.794654 4.36694e-09 -0.607062 0.794654 -0.288675 -0.397327 0.794654 0 0 0.794654 0.467086 0.151766 0.794654 0.57735 -0.187592 0.794654 0.288675 -0.397327 0.794654 0 0.710761 0.35538 0 0.491123 0.794654 -0.356822 0.491123 0.794654 -0.467086 0.642889 0.491123 . . . < 55 lines of numbers deleted> Agora pegamos um objeto mais interessante: um dodecaedro. Uma vez que dodecaedro tem faces de 5 lados, cada uma de suas 12 faces é atualmente feita de 5 quadriláteros de um total de 20 quadriláteros nesse objeto do tipo Quad. [geomview: Apague o quadrado e chame o arquivo "dodec.quad". Uma vez que os 5 quadriláteros que formam cada face todos se ajustam perfeitamente uns aos outros, o fato de que existe realmente muitos deles em cada face é somente aparente quando as bordas são desenhadas. Para habilitar o desenho das bordas, aperte o botão "Edges" no painel de aparência. ] OFF Existe uma maneira muito mais eficiente de representar um dodecaedro. "dodec.off": OFF 20 12 30 1.214124 0.000000 1.589309 0.375185 1.154701 1.589309 -0.982247 0.713644 1.589309 -0.982247 -0.713644 1.589309 0.375185 -1.154701 1.589309 1.964494 0.000000 0.375185 0.607062 1.868345 0.375185 -1.589309 1.154701 0.375185 -1.589309 -1.154701 0.375185 0.607062 -1.868345 0.375185 1.589309 1.154701 -0.375185 -0.607062 1.868345 -0.375185 -1.964494 0.000000 -0.375185 -0.607062 -1.868345 -0.375185 1.589309 -1.154701 -0.375185 0.982247 0.713644 -1.589309 -0.375185 1.154701 -1.589309 -1.214124 0.000000 -1.589309 -0.375185 -1.154701 -1.589309 0.982247 -0.713644 -1.589309 5 0 1 2 3 4 5 0 5 10 6 1 5 1 6 11 7 2 5 2 7 12 8 3 5 3 8 13 9 4 5 4 9 14 5 0 5 15 10 5 14 19 5 16 11 6 10 15 5 17 12 7 11 16 5 18 13 8 12 17 5 19 14 9 13 18 5 19 18 17 16 15 O cabeçalho "OFF" nos diz que o arquivo dodec.off é um arquivo do tipo "polylist". A segunda linha no arquivo nos diz que existem 20 vértices, 12 faces, e 30 arestas. (As bibliotecas OOGL atualmente não utilizam os valores de arestas, de forma que você pode apenas usar 0 se acontecer de não saber o número de arestas.) As próximas 20 seguintes linhas fornecem uma lista de vértices. TAs últimas 12 linhas especificam as faces: o primeiro numero é o número de vértices naquela face. Uma vez que nosso poliedro é regular, todas as faces possuem o mesmo número de vértices (nesse caso, 5). Os números restantes na linha são indices dentro da lista de vértices acima. Juntamente com o fato de loge mais compacto, o formato de arquivo do tipo "Polylist" incorpora informação de conectividade no Geom (Objeto OOGL). OOGL não tem formas de conhecer se quaisquer dois quadriláteros em um bojeto Quad estão conectados. Mas com uma "Polylist", OOGL pode interpolar retas normais ao longo das faces conectadas. As retas normais de um objeto são usadas para calcular a informação de tonalidade de cor. Interpolated normals make an object look smooth instead of faceted. Isso é muitas vezes desejável se você estiver tentando aproximar uma superfície curva por meio da quebra da mesma em peças pequenas. [geomview: Vá adiante e chame "dodec.off" sem deletar o oddec.quad. Agora você tem dois Geoms no seu mundo. A maioria das ações aplicam-se aos objetos atualmente selecionados. Quando você inicia o geomview, os objetos atualmente selecionados é o mundo todo. Você pode independentemente controlar qualquer objeto no mundo selecionando esse objeto como alvo e suas ações. Duplo clicando o botão direito do mouse quando o mouse está sobre um objeto faz com que ele seja selecionado: duplo clicando o botão direito do mouse sobre o espaço vazio seleciona o mundo completo. Você pode também selecionar objetos clicando sobre a linha apropriada no navegador de objetos. Os dois dodecaedros estão provavelmente sobrepostos. Selecione um deles como seu alvo, clique sobre a linha "Translate" no navegador de movimentos, e mova o objeto selecionado afastando-se do centro do mundo com o botão esquerdo do mouse. (Para retornar ao modo "Rotate", clique na linha apropriada no navegador de movimento.) Agora selecione o mundo completo novamente e desenhe as normais pressionando o botão "Normals" no painel de aparência. Alterne entre os modos de sombreamento "Flat" e "Smooth" (clicando no navegador de tonalidades) e note que a "Polylist" modifica-se mas o "Quad" não se modifica. Algumas vezes usando o mouse para clicar no navegador de linhas e botões é incômodo. Os caracteres colchêtes mostram nos painéis de controle os atalhos de teclado que reproduzem o efeito de usar o mouse para clicar sobre aquela linha ou butão. Por exemplo, "an" (o "a" representa "appearance") muda o desenho de normais e "t" uda o movimento para translação. Como tecla de atalho adicional, você pode usar o prefixo de um objeto ("g" ou "c" seguido de um número, como mostrado nos parêtesis no navegador de objetos) antes da maioria dos comandos para simultâneamente selecionar um objeto e fazer alguma ação para esse objeto. Pr exemplo, "g0r" permite a você imediatamente rotacionar o mundo. ] Vamos comparar duas formas de se colorir uma "Polylist". facecube.off: # off file with per face cor OFF 8 6 12 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 -1.0 -1.0 -1.0 1.0 -1.0 -1.0 -1.0 4 0 2 3 1 .05 .8 .1 .75 4 4 5 7 6 .2 .05 .8 .75 4 0 4 6 2 .9 .9 .02 .75 4 1 3 7 5 .0 .7 .4 .75 4 0 1 5 4 .1 .4 .7 .75 4 2 6 7 3 .7 .7 0 .75 vertcube.off: # off file with per vertex cores COFF 8 6 12 1.0 1.0 1.0 .05 .8 .1 .75 1.0 1.0 -1.0 .2 .05 .8 .75 1.0 -1.0 1.0 .9 .9 .02 .75 1.0 -1.0 -1.0 .0 .7 .4 .75 -1.0 1.0 1.0 .1 .4 .7 .75 -1.0 1.0 -1.0 .7 .7 0 .75 -1.0 -1.0 1.0 0. 0. 0. .75 -1.0 -1.0 -1.0 1. 1. 1. .75 4 0 2 3 1 4 4 5 7 6 4 0 4 6 2 4 1 3 7 5 4 0 1 5 4 4 2 6 7 3 Tudo seguindo o caractere "#" é um comentário para humanos ler e é ignorado por OOGL. O cabeçalho para uma "Polylist" plana é opcional, mas se você tiver qualquer coisa ao lado de pontos em um vértice você precisará fazer um cabeçalho apropriado. O objeto é um cubo unitário, qu tem 8 vértices, 6 faces, e 12 arestas. O primeiro coloração por face e o segundo tem coloração pro vértice. Um ponto sutil: o cabeçalho para vertcube.off é "COFF" como você pode esperar mas o cabeçalho para facecube.off é apenas "OFF" por que o cabeçalho refere-se somente àestrutura dos vértices, não ao arquvo como um todo. [geomview: Apague tudo selecionando o mundo como alvo e clicando o botão delete. Agora chae "facecube.off" e "vertcube.off". Translacione um deles para adiante de centro de forma que você possa ver o que você está fazendo. Alterne ambas as "Polylists" entre os modos de tonalidade "Constant", "Flat", e "Smooth". Tonalidade é realizada conforme a fonte de luz que você controla. Para brincar com luzes, abra o painel "Light" clicando na linha "Light" no navegador de "Inspect". Quando você pressionar o botão "Show Lights", você irá ver raios luminosos que você pode arrastar ao redor para mover as luzes. Você também pode adicionar "add", apagar "delete", modificar a intensidade da, e modificar a cor das luzes. ] MESH Os vértices de um arquivo de Malha(Mesh) são conectados em uma grade retangular. tent.mesh: CMESH 3 3 0 0 0 1 0 0 1 1 0 1 0 1 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 2 1 0 0 0 1 1 0 2 0 1 0 0 1 1 2 1 0 1 0 1 2 2 0 0 0 1 1 O cabeçalho "CMESH" nos diz que esse é um arquivo de Malha e cada vértice contém ambos ponto e informação de cor. A segunda linha significa que ambas as dimensões u e v da malha são 3, então existirão 3*3 = 9 vértices. Cada vértice que não está sobre uma aresta externa está conectado a seus 4 vizinhos por uma aresta. Em "tent.mesh", somente o ponto (1,1,1) é um ponto interno. Os 9 vértices, quando chamados (u,v), são especificados na ordem crescente de v, apenas como um array em C: (0,0)---(1,0)---(2,0) | | | (0,1)---(1,1)---(2,1) | | | (0,2}---(1,2)---(2,2) [geomview: Apague tudo e chame "tent.mesh". Entre no modo de tonalidade "Smooth" (Inspect/Appearence/Shading) para ver cada vértice com sua própia cor de forma que seja óbvio como os pontos no arquivo correspondem com a imagem no visualizador. ] Se você desejar a malha seja fechada ao longo das ou (ou ambas) arestas u ou v, insira ou um "u" ou um "v" no cabeçalho apenas antes de "MESH". "wraptent.mesh" CuMESH 3 3 0 0 0 1 0 0 1 1 0 1 0 1 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 2 1 0 0 0 1 1 0 2 0 1 0 0 1 1 2 1 0 1 0 1 2 2 0 0 0 1 1 [geomview: Chame "wraptent.mesh" e compare as duas malhas, transladando-as separadamente se necessário. ] Existe uma forma extremamente eficiente de descrever uma malha quando as coordenadas x e y coincidem com as coordenadas u e v de todo ponto. "ztent.mesh": ZMESH 3 3 0 1 0 0 1 0 0 1 0 "ztent.mesh" é exatamente a mesma aparência que "tent.mesh", embora seus vértices não tenham quaisquer cores. O cabeçalho "ZMESH" significa que somente as coordenadas do eixo z de cada ponto é especificada e as coordenadas x e y de cada ponto são escolhidas para serem iguais à sua posição (u,v) na grade. [geomview: Chame "ztent.mesh" para verificar que esse arquivo realmente tem a mesma aparência que "tent.mesh" ] VECT Um vetor é uma coleção de "polylines", que são linhas com um ou mais vértices. Aqui está um arquivo especificando um "X" e o eixo x em vermelho, um "Y" e o eixo y em verde, e um "Z" e o eixo z em azul. "xyz.vect": VECT 8 19 3 2 2 2 2 2 3 2 4 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 0 0 0 0 1 0 -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 0 0 0 0 0 1 -.05 .25 1 .05 .25 1 -.05 .05 1 .05 .05 1 1 0 0 1 0 1 0 1 0 .6 1 1 O cabeçalho é sempre "VECT": nenhuma letra pode ser pregada na frente. A segunda linha significa que existem 8 "polylines", que possuem um total de 19 vértices e 3 cores. Não existe indexação dentro de uma lista de vértices como uma "polylist": todo vértice simples deve ser especificado separadamente. A terceira linha lista o número de vértices em cada "polyline". Em "xyz.vect", somente "polylines" com mais que 2 vértices são a parte superior do "Y", que tem 3, e o "Z", que tem 4. A quarta linha lista o número de cores em cada "polyline". Quando uma "polyline" não possui cores essa "polyline"herda a cor previamente escolhida. A seguir vem os 19 vértices: somente pontos são permitidos. Finalmente, as 3 cores são fornecidas nas últimas três linhas. [geomview: Apague tudo, chame e olhe "xyz.vect". Faça a mesma coisa para todos os exemplos restantes. ] BEZ Para aqueles que já entenderam como criar ajustes em superfície paramétrica, a sintaxe do ajuste da superfície de Bezier é descrito página de manual da OOGL. A arte de construir superfícies paramétricas não é facilmente explicável: dessa forma, superfícies paramétricas estão dentro da abrangência deste tutorial discutí-las. "Lists" e "Insts" são Geoms complexos que podem ser usados para criar uma árvore hierárquica de objetos. LIST Uma "List" é apenas uma coleção de outros Geoms. "ref.list": LIST < xyz.vect < dodec.quad { = QUAD -1 -1 0 1 -1 0 1 1 0 -1 1 0} O cabeçalho é sempre exatamente "LIST". Os primeiros dois subgeoms referem-se a outros arquivos, usando a sintaxe " < nomearquivo ". Omitimos as chaves opcionais. O terceiro é um objeto literal, ou in-line. Embora essa sintaxe em particular possa ainda trabalhar se esquecermos as chaves e o sinal de igual, sintaxe muito similar não pode então seguimos a regra "quando tiver dúvida, use as chaves". [geomview: Geomview procura por nomes de arquivos no diretório atual, o camino de nomes na variável de ambiente GEOMDATA, e no mesmo diretório que o arquivo que está atualmente sendo lido pelo geomview. ] INST Um "Inst"é uma ou mais transformações 4x4 aplicada a outro Geom. Essas matrizes podem representar todas as transformações em 3D tais como rotação, translação, homotetia, redução e perspectiva. Usamos matrizes 4x4 em lugar de matrizes 3x3 de forma que podemos usar coordenadas homogêneas e concatenar todas as transformações sem tratar translações como casos especiais que requerem adições em lugar de multiplicações. Matrizes 4x4 podem também serem usadas para operações tais como rotações em 4D ou transformações projetivas hiperbólicas. Um livro texto de álgebra linear ou um livro texto de computação gráfica são bons lugares para iniciar seus estudos se você não está familiarizado com essas idéias. "ref.inst": INST geom { < ref.list } transforms { = TLIST 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 2 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 2 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } O cabeçalho é sempre exatamente "INST". O valor seguindo a palavra chave "geom" é uma referência de nome de arquivo "ref.list", que é a "List" que mostramos acima. Isso também pode ser um Geom in-line ou um manipulador. Cercamos o valor com chaves para evitar ambiguidade. O valor da palavra chave "transforms" é uma "TList" in-line. Isso também pode ser uma referência a um nome de arquivo ou um manpulador. (Veja a seção Os Formatos de Arquivo do OOGL do manual do Geomview para especificidades.) Uma "TList" é atualmente um Geom completametne fugidio, mas nós não temos mesmo que chamar um arquivo como "foo.tlist" dentro do visualizador porque "TLists" são apenas uma coleção de transformações sem subgeom associado, de forma que não há nada para ver. Uma transformação é exatamente 16 números. Os primeiros três são translações: 2 unidade nas direções x, y e z, respectivamente. O último é apenas a identidade. O comprimeto da "TList" é o número de instanciações da unidade: nesse caso, 4. Se não pudermos usar instanciação, teremos que calcular 4 Geoms inteiramente novos, uma vez que os atuais pontos no espaço de um objeto são diferentes se você movê-lo. Uma vez que a unidade de um "Inst" pode ser outro "Inst", você pode construir uma hierarquía complexa. Por exemplo, para construi um sistema solar você só precisa gerar uma esfera. Tdos os planetes pode ser instanciações de homotetias e translações da que simples Geom. "warp.inst": INST transform { 1 0 0 0 0 9 0 0 0 0 3 0 0 0 0 1 } geom { < dodec.off } Esse "Inst" tem uma transformação simples em lugar de uma lista deles. Dessa forma usamos a palavra chave "transform" em lugar da palavra chave "transforms". Um "transform" não é um Geom, de forma que não existe cabeçalho antes dos 16. Podemos também ter um manipulador aqui. (Manipuladores estão documentados na seção Formatos de Arquivo do OOGL do manual do Geomview.) Finalmente, temos "dodec.off" como nossa unidade. A ordem do geom e das "transform/transforms" é irrelevante. Postscripts: OOGL: Esse tutorial não documenta arquivos binários ou aparências de objetos. Veja a seção Formatos de Arquivo do OOGL do manual do Geomview para detalhes. Espaços em branco em arquivos OOGL ocorrem para facilitar a vida dos leitores humanos. "ZMESH 3 3 0 1 0 0 1 0 0 1 0" é um arquivo OOGL válido. A única excessão é que não pode haver um fim de linha entre o último índice de vértice para uma face tipo "OFF" e os 4 números em ponto flutuante representativos de cor. Geomview: Quando um Geom é chamado, ele automaticamente normalizado ajustar dentro de um cubo unitário centrado em torno da origem. O ponto de visualização padrào da câmera é em {0,0,-3} olhando na direção da oríge. Para ver a posição e o tamanho inalterado de um objeto, seleciona a linah "None" no navegador "Normalization" Em "Inspect/Appearence". Em geral não importa o que o intervalo de coordenadas é enquanto o arquivo inteiro for consistente: {0,1}, {-1,1}, {0,100}, {-1000,-500}, {17,36} são todos intervalos válidos. geomview-1.9.4/doc/geomview-pt_BR-10000644000175000001440000111166210663305733013756 00000000000000This is ../../doc/geomview-pt_BR, produced by makeinfo version 4.8 from ../../doc/geomview-pt_BR.texi. INFO-DIR-SECTION Graphics Applications START-INFO-DIR-ENTRY * Geomview: (geomview-pt_BR). Programa interativo de visualizac,a~o tridimensional. END-INFO-DIR-ENTRY  File: geomview-pt_BR, Node: Top, Next: Intro, Prev: (dir), Up: (dir) Programa interativo de visualizac,a~o tridimensional. * Menu: * Intro:: Introduc,a~o ao Geomview. * Distrib:: Como acessar a versa~o mais recente do Geomview. * Copying:: A Licenc,a Pu'blica Geral Menor do GNU. * History:: Histo'ria do Desenvolvimento do Geomview. * Platforms:: Plantaformas Suportadas. * Pronunciation:: Como Pronunciar ``Geomview''. * Overview:: Visa~o Geral do Geomview. * Tutorial:: Tutorial Introduto'rio. * Interaction:: Interagindo com Geomview. * OOGL File Formats:: Formatos para Inserc,a~o de Dados Geome'tricos. * Customization:: Modificando o comportamento do Geomview. * Modules:: Programas que usam Geomview para exibic,a~o de imagens. * GCL:: GCL: a Linguagem de Comandos do Geomview. * Non-Euclidean Geometry:: Geometrias Na~o Euclideanas. * Mathematica:: Gra'ficos do Mathematica no Geomview ou no RenderMan. * Installation:: Instalando o Geomview no seu computador. * Support:: acessando o Suporte Te'cnico para o Geomview. * Contributing:: Como contribuir com o Geomview. * Function Index:: Acesso ra'pido a cada func,a~o da GCL. * List of Figures:: Lista de Figuras.  File: geomview-pt_BR, Node: Intro, Next: Distrib, Prev: Top, Up: Top Introduction to Geomview ************************ Geomview e' um programa interativo para visualizar e manipular objetos geome'tricos, originalmente escrito pelos membros do estado maior do Geometry Center na Universidade de Minesota (EUA), comec,ando em 1991. O Geomview pode ser usado como um visualizador independente para objetos esta'ticos ou como um mecanismo de visualizac,a~o para outros programas que produzem dinamicamente mudanc,as geome'tricas. Geomview roda sobre muitos tipos de computadores Unix, incluindo Linux, SGI, Sun, e HP. Geomview tambe'm executa com Cygwin. Esse manual descreve Geomview em sua versa~o 1.9. Geomview e' um "software" livre, disponi'vel sob os termos da Licenc,a Pu'blica Geral Menor do GNU ; veja *Note Copying:: para detalhes. Geomview e esse manual podem ser encontrados em `http://www.geomview.org'. E' permitido fazer co'pias desse manual. Se voce^ tiver du'vidas ou comenta'rios sobre o Geomview ou esse manual, considere inscrever-se na lista de correio eletro^nico `geomview-users', que e' um fo'rum no qual usua'rios do Geomview comunicam-se para responder outras questo~es e para compartilhar noti'cias sobre o que eles esta~o fazendo com o Geomview. Os autores do Geomview participam dessa lista e algumas vezes enviam respostas a questionamentos existentes. Para assinar a lista, visite a pa'gina da lista no si'tio `http://lists.sourceforge.net/mailman/listinfo/geomview-users'.  File: geomview-pt_BR, Node: Distrib, Next: Copying, Prev: Intro, Up: Top Distribution ************ Geomview e' um "software" livre; isso significa que qualquer um e' livre para usa'-lo e livre para redistribui'-lo sob certas condic,o~es. Geomview na~o e' de domi'nio pu'blico; e' protegido por direitos autorais e existem restric,o~es sobre sua distribuic,a~o, mas essas restric,o~es sa~o montadas de forma a permitir qualquer coisa que um bom cidada~o colaborador possa querer fazer. O que na~o e' permitido e' para tentar previnir outros de compartilhamento adicional de qualquer versa~o do Geomview que eles possam pegar de voce^. As condic,o~es precisas podem ser encontradas na Licenc,a Geral Menor do GNU que acompanha o Geomview e tambe'm aparece acompanhando essa sec,a~o. Uma forma de acessar uma co'pia do Geomview e' a partir de algue'm que ja' possua o Geomview. Voce^ na~o precisa perguntar por nossa permissa~o para fazer isso, ou informar qualquer coisa; apenas fac,a a co'pia. Se voce^ tiver acesso a` internet, voce^ pode pegar a mais recente versa~o do Geomview em `http://www.geomview.org'. Voce^ tambe'm pode receber Geomview quando voce^ compra um computador. Fabricantes de computadores esta~o livres para distribuir co'pias sob os mesmos termos que sa~o aplicados a qualquer pessoa. Esses termos requerem que os fabricantes fornec,am a voce^ o co'digo completo, incluindo qualquer mudanc,as que eles tenham feito, e permitam a voce^ que redistribua o Geomview recebido deles nos termos usuais da Licenc,a Pu'blica Geral Menor do GNU. Em outras palavras, o programa deve ser livre para voce^ quando voce^ o receber, na~o apenas livre para o fabricante.  File: geomview-pt_BR, Node: Copying, Next: History, Prev: Distrib, Up: Top Copying ******* NOTA: Geomview e' distribui'do sob a LICENC,A PU'BLICA GERAL MENOR. Para os propo'sitos dessa licenc,a no's pensamos em Geomview como se ele fosse uma "biblioteca", e dos mo'dulos externos do Geomview como "programas que se comunicam com a biblioteca". Fazemos isso porque queremos especificamente permitir que programas proprieta'rios e mo'dulos usem o Geomview. GNU LESSER PUBLIC LICENSE ************************* Version 2.1, February 1999 Licenc,a Pu'blica Geral Menor do GNU This is an unofficial translation of the GNU Lesser General Public License into Portuguese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU LGPL-only the original English text of the GNU LGPL does that. However, we hope that this translation will help Portuguese speakers understand the GNU LGPL better. Esta e' uma traduc,a~o na~o-oficial da GNU Lesser General Public License para o Portugue^s. Ela na~o e' publicada pela Free Software Foundation e na~o traz os termos de distribuic,a~o legal do software que usa a GNU LGPL - estes termos esta~o contidos apenas no texto da GNU LGPL original em ingle^s. No entanto, esperamos que esta traduc,a~o ajudara' no melhor entendimento da GNU LGPL em Portugue^s. Versa~o 2.1, Fevereiro de 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA [Estados Unidos da Ame'rica] E' permitido a qualquer pessoa copiar e distribuir co'pias sem alterac,o~es deste documento de licenc,a, sendo vedada, entretanto, sua modificac,a~o. [Esta e' a primeira versa~o da GPL Menor a ser lanc,ada. Ela tambe'm constitui a sucessora da Licenc,a Pu'blica de Biblioteca do GNU, dai' o nu'mero 2.1. da versa~o]. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Introduc,a~o ============ As licenc,as da maioria dos softwares sa~o elaboradas para suprimir sua liberdade de compartilha'-los e modifica'-los. As Licenc,as Pu'blicas do GNU, ao contra'rio, te^m o objetivo de assegurar sua liberdade para compartilhar e modificar softwares livres para garantir que o software seja livre para todos os seus usua'rios. A presente Licenc,a Pu'blica Geral Menor se aplica a alguns pacotes de software especialmente designados - normalmente bibliotecas - da Free Software Foundation e de outros autores que decidam utiliza'-la. Voce^ pode utiliza'-la tambe'm, mas recomendamos que antes, voce^ analise cuidadosamente se esta licenc,a, ou a Licenc,a Pu'blica Geral comum, e' a melhor estrate'gia a ser adotada em cada caso especi'fico, tendo como base as explicac,o~es abaixo. Quando falamos de software livre, estamos nos referindo a liberdade de uso e na~o de gratuidade de prec,o. Nossas Licenc,as Pu'blicas Gerais sa~o elaboradas para garantir que voce^ tenha liberdade para distribuir co'pias de software livre (cobrando por esse servic,o se voce^ assim o desejar); que voce^ receba co'digo-fonte ou o obtenha, se quiser; que voce^ modifique o software e utilize partes dele em novos programas livres; e que voce^ tenha cie^ncia de que pode praticar estes atos. A fim de proteger seus direitos, e' necessa'rio que fac,amos restric,o~es que proi'bam distribui'dores de negar estes direitos a voce^ ou de pedir que voce^ que renuncie a eles. Essas restric,o~es se traduzem em determinadas responsabilidades que voce^ devera' assumir, se vier a distribuir co'pias da biblioteca ou modifica'-la. Por exemplo, se voce^ distribuir co'pias da biblioteca, seja gratuitamente ou mediante um valor, tera' de conceder a seus receptores todos os direitos que estamos concedendo a voce^. Voce^ tera' de garantir que eles, tambe'm, recebam ou possam obter o co'digo fonte. Se voce^ ligar outro co'digo com a biblioteca, voce^ deve fornecer os arquivos-objeto completos para os receptores, de modo que eles possam liga'-los novamente com a biblioteca apo's terem feito mudanc,as na biblioteca e recompilado a mesma. E voce^ tera' de exibir a eles esses termos, para que eles conhec,am seus direitos. Protegemos seus direitos atrave's de um me'todo que envolve dois passos: (1) estabelecemos direitos autorais sobre a biblioteca e (2) oferecemos a voce^ esta licenc,a, que da' a voce^ permissa~o para copiar, distribuir e/ou modificar a biblioteca. Para proteger cada distribuidor, queremos deixar bem claro que na~o ha' nenhuma garantia para a biblioteca livre. Ale'm disso, se a biblioteca for modificada por algue'm e passada adiante, os receptores devem saber que o que eles te^m na~o e' a versa~o original, de modo que a reputac,a~o do autor original na~o sera' afetada por problemas que possam ser introduzidos por outros. Por fim, as patentes de software representam uma ameac,a constante para a existe^ncia de qualquer programa livre. Queremos assegurar que uma empresa na~o possa efetivamente restringir os usua'rios de um programa livre por ter obtido uma licenc,a restritiva de um titular de direitos de patente. Por isso, insistimos que qualquer licenc,a de patente obtida para alguma versa~o da biblioteca seja consistente com a plena liberdade de uso, especificada nesta licenc,a. A maior parte dos softwares do GNU, incluindo algumas bibliotecas, esta' coberta pela Licenc,a Pu'blica Geral comum do GNU. A presente Licenc,a Pu'blica Geral Menor do GNU se aplica a determinadas bibliotecas designadas, sendo bastante diferente da Licenc,a Pu'blica Geral comum. Usamos esta licenc,a para determinadas bibliotecas, a fim de permitir a ligac,a~o dessas bibliotecas a programas na~o-livres. Quando um programa e' ligado a uma biblioteca, seja estaticamente ou usando uma biblioteca compartilhada, essa combinac,a~o das duas e' em termos legais uma obra combinada, uma derivac,a~o da biblioteca original. Por essa raza~o, a Licenc,a Pu'blica Geral comum somente permite essa ligac,a~o se a combinac,a~o como um todo atender a seus crite'rios de liberdade. A Licenc,a Pu'blica Geral Menor permite crite'rios mais flexi'veis para a ligac,a~o de outros co'digos a` biblioteca. Chamamos esta licenc,a de Licenc,a Pu'blica Geral "Menor" porque ela faz Menos para proteger a liberdade do usua'rio do que a Licenc,a Pu'blica Geral comum. Ela tambe'm oferece a outros desenvolvedores de software livre uma Menor vantagem na competic,a~o com com programas na~o livres. Essas desvantagens sa~o o motivo pelo qual usamos a Licenc,a Pu'blica Geral comum para muitas bibliotecas. Por outro lado, em determinadas circunsta^ncias especiais, a licenc,a Menor oferece vantagens. Por exemplo, em raras ocasio~es, pode existir uma necessidade especial de se incentivar a mais ampla utilizac,a~o possi'vel de uma determinada biblioteca, para que ela se torne um padra~o de fato. Para conseguir isso, deve-se permitir que programas na~o-livres utilizem a biblioteca. Um caso mais frequ"ente ocorre quando uma biblioteca livre desempenha a mesma func,a~o de bibliotecas na~o-livres amplamente usadas. Nesse caso, existem poucas vantagens em restringir a biblioteca livre somente para software livre, enta~o utilizamos a Licenc,a Pu'blica Geral Menor. Em outros casos, a permissa~o para usar uma determinada biblioteca em programas na~o-livres possibilita que um maior nu'mero de pessoas use um amplo leque de softwares livres. Por exemplo, a permissa~o para usar a Biblioteca C do GNU permite que muito mais pessoas usem todo o sistema operacional do GNU, bem como sua variante, o sistema operacional do GNU/Linux. Mesmo protegendo a liberdade dos usua'rios em menor grau, a Licenc,a Pu'blica Geral Menor garante ao usua'rio de um programa que esteja ligado a` Biblioteca a liberdade e os meios para executar o programa, usando uma versa~o modificada da Biblioteca. Seguem abaixo os termos e condic,o~es exatos para a co'pia, distribuic,a~o e modificac,a~o. Preste muita atenc,a~o a` diferenc,a entre uma "obra baseada na biblioteca" e uma "obra que usa a biblioteca". O primeiro conte'm co'digo que e' derivado da biblioteca, enquanto o segundo tem de ser combinado a` biblioteca para que possa ser executado. TERMOS E CONDIC,O~ES PARA CO'PIA, DISTRIBUIC,A~O E MODIFICAC,A~O ================================================================ 0. O presente Contrato de Licenc,a se aplica a qualquer biblioteca de software ou a outro programa que contenha um aviso colocado pelo titular dos direitos autorais ou outra parte autorizada, informando que ela pode ser distribui'da nos termos desta Licenc,a Pu'blica Geral Menor (tambe'm denominada "esta Licenc,a"). Cada licenciado doravante sera' denominado "voce^". Uma "biblioteca" significa uma colec,a~o de func,o~es de software e/ou dados preparados, de forma a serem convenientemente ligados com programas de aplicac,a~o (que usam algumas dessas func,o~es e dados) para formar executa'veis. O termo "Biblioteca", abaixo, refere-se a qualquer biblioteca de software ou obra que tenha sido distribui'da de acordo com esses termos. Uma "obra baseada na Biblioteca" significa tanto a Biblioteca como qualquer obra derivada, nos termos da legislac,a~o autoral: isto e', uma obra contendo a Biblioteca ou parte dela, seja sem alterac,o~es ou com modificac,o~es e/ou traduzida diretamente para outra linguagem. (Doravante, o termo "modificac,a~o" inclui, sem reservas, o termo "traduc,a~o"). O "co'digo-fonte" de uma obra significa o formato preferencial da obra para que sejam feitas modificac,o~es na mesma. Para uma biblioteca, o co'digo-fonte completo significa todo o co'digo fonte para todos os mo'dulos contidos na mesma, ale'm de quaisquer arquivos de definic,a~o de interface associados, ale'm dos scripts utilizados para controlar a compilac,a~o e a instalac,a~o da biblioteca. Outras atividades que na~o a co'pia, distribuic,a~o e modificac,a~o na~o sa~o cobertas por esta Licenc,a; elas esta~o fora de seu escopo. O ato de executar um programa usando a Biblioteca na~o tem restric,o~es, e o resultado gerado a partir desse programa encontra-se coberto somente se seu conteu'do constituir uma obra baseada na Biblioteca (independente do uso da Biblioteca em uma ferramenta para escreve^-lo). Na verdade, isto dependera' daquilo que a Biblioteca faz e o que o programa que usa a biblioteca faz. 1. Voce^ pode copiar e distribuir co'pias sem alterac,o~es do co'digo-fonte completo da Biblioteca ao recebe^-lo, em qualquer meio ou mi'dia, desde que publique, ostensiva e adequadamente, um aviso de direitos autorais (ou copyright) apropriado e uma notificac,a~o sobre a exonerac,a~o de garantias; mantenha intactas as informac,o~es, avisos ou notificac,o~es referentes a esta Licenc,a e a` ause^ncia de qualquer garantia; e distribua uma co'pia desta Licenc,a junto com a Biblioteca. Voce^ podera' cobrar um valor pelo ato fi'sico de transferir uma co'pia, e voce^ pode oferecer, se quiser, a protec,a~o de uma garantia em troca de um valor. 2. Voce^ pode modificar sua co'pia ou co'pias da Biblioteca ou qualquer parte dela, formando, assim, uma obra baseada na Biblioteca, bem como copiar e distribuir essas modificac,o~es ou obra, em conformidade com a Cla'usula 1 acima, desde que atenda, ainda, a todas as seguintes condic,o~es: a. A obra modificada tem de ser, por si so', uma biblioteca de software. b. Voce^ tem de fazer com que os arquivos modificados contenham avisos, em destaque, de que voce^ modificou os arquivos e a data de qualquer modificac,a~o. c. Voce^ tem de fazer com que a obra como um todo seja licenciada, sem nenhum custo, a todos os terceiros, de acordo com esta Licenc,a. d. Se um dispositivo, na Biblioteca modificada, se referir a uma func,a~o ou a uma tabela de dados a ser fornecida por um programa de aplicac,a~o que usa esse dispositivo, outro que na~o um argumento transmitido quando o dispositivo e' invocado, nesse caso, voce^ tera' de fazer um esforc,o de boa-fe' para assegurar que, no caso de uma aplicac,a~o que na~o fornec,a essa func,a~o ou tabela, o dispositivo ainda assim opere, e ira' realizar qualquer parte de sua finalidade que permanecer significativa. (Por exemplo, uma func,a~o de uma biblioteca para computar rai'zes quadradas tem uma finalidade que e' completamente bem definida independentemente da aplicac,a~o. Por essa raza~o, a letra d, da Cla'usula 2, exige que qualquer func,a~o ou tabela fornecida pela aplicac,a~o, usada por essa func,a~o, tem de ser opcional: se a aplicac,a~o na~o fornece^-la, a func,a~o de rai'zes quadradas devera' ainda assim computar rai'zes quadradas). Essas exige^ncias se aplicam a` obra modificada como um todo. Se partes identifica'veis dessa obra na~o forem derivadas da Biblioteca e puderem ser consideradas razoavelmente, em si, como obras independentes e separadas, nesse caso, esta Licenc,a e seus termos na~o se aplicara~o a essas partes quando voce^ distribui-las como obras separadas. Todavia, quando voce^ distribuir essas mesmas partes como partes de um todo, que por si seja uma obra baseada na Biblioteca, a distribuic,a~o desse todo devera' ser realizada de acordo com esta Licenc,a, cujas respectivas permisso~es para outros licenciados extendem-se a` integralidade deste todo, dessa forma, a toda e qualquer parte, independentemente de quem a escreveu. Assim, esta cla'usula na~o tem a intenc,a~o de afirmar direitos ou contestar os seus direitos sobre uma obra escrita inteiramente por voce^; a intenc,a~o e', antes, de exercer o direito de controlar a distribuic,a~o de obras derivadas ou obras coletivas baseadas na Biblioteca. Ale'm disto, a simples agregac,a~o de outra obra, que na~o seja baseada na Biblioteca, a` Biblioteca (ou a uma obra baseada na Biblioteca) em um volume de meio ou mi'dia de armazenamento ou distribuic,a~o, na~o inclui esta outra obra no a^mbito desta Licenc,a. 3. Voce^ podera' optar por aplicar os termos da Licenc,a Pu'blica Geral do GNU ao inve's desta Licenc,a, para uma determinada co'pia da Biblioteca. Para tanto, voce^ devera' alterar todos os avisos ou notificac,o~es que se refiram a esta Licenc,a, para que eles se refiram a` Licenc,a Pu'blica Geral comum do GNU, versa~o 2, ao inve's desta Licenc,a. (Se uma versa~o mais nova do que a versa~o 2 da Licenc,a Pu'blica Geral comum do GNU tiver sido gerada, enta~o voce^ podera' especificar essa versa~o, se preferir). Na~o fac,a nenhuma outra alterac,a~o nesses avisos ou notificac,o~es. Uma vez que essa alterac,a~o tenha sido feita em uma determinada co'pia, ela e' irreversi'vel para esta co'pia, passando a Licenc,a Pu'blica Geral comum do GNU a ser aplicada para todas as co'pias e obras derivadas subsequ"entes, feitas a partir dessa co'pia. Essa opc,a~o e' u'til quando voce^ desejar copiar parte do co'digo da Biblioteca em um programa que na~o seja uma biblioteca. 4. Voce^ podera' copiar e distribuir a Biblioteca (ou uma parte ou obra derivada dela, de acordo com a Cla'usula 2) em co'digo-objeto ou formato executa'vel, sob as Cla'usulas 1 e 2 acima, desde que inclua todo o co'digo-fonte correspondente, passi'vel de leitura pela ma'quina, que deve ser distribui'do sob os termos das Cla'usulas 1 e 2 acima, em um meio ou mi'dia costumeiramente utilizado para o interca^mbio de software. Se a distribuic,a~o do co'digo-objeto for feita pela oferta de acesso para co'pia a partir de um local designado, enta~o a permissa~o de acesso equivalente para copiar o co'digo-fonte a partir do mesmo local atende a exige^ncia de distribuic,a~o do co'digo-fonte, mesmo que terceiros na~o sejam levados a copiar a fonte junto com o co'digo-objeto. 5. Um programa que na~o contenha nenhum derivativo de qualquer parte da Biblioteca, mas que seja desenhado para operar com a Biblioteca ao ser compilado ou ligado a ela, e' chamado de uma "obra que usa a Biblioteca". Essa obra, isoladamente, na~o e' uma obra derivada da Biblioteca e, portanto, fica de fora do a^mbito desta Licenc,a. Entretanto, a ligac,a~o de uma "obra que usa a Biblioteca" com a Biblioteca constitui um executa'vel que e' um derivado da Biblioteca (pois conte'm partes da Biblioteca), e na~o uma "obra que usa a Biblioteca". O executa'vel e', assim, coberto por esta Licenc,a. A Cla'usula 6 estabelece os termos para a distribuic,a~o desses executa'veis. Quando uma "obra que usa a Biblioteca" usar material de um arquivo de cabec,alho que e' parte da Biblioteca, o co'digo-objeto para a obra podera' ser uma obra derivada da Biblioteca, mesmo que o co'digo-fonte na~o o seja. Para que isto seja verdade, e' especialmente importante se a obra pode ser ligada sem a Biblioteca, ou se a obra e', em si mesma, uma biblioteca. O limiar para que isto seja verdade na~o e' definido com precisa~o pela lei. Se um arquivo-objeto usar somente para^metros nume'ricos, layouts e accessors da estrutura de dados, bem como pequenas macros e pequenas func,o~es inline (dez linhas ou menos de extensa~o), enta~o o uso do arquivo-objeto na~o e' restrito, independente de ser ele legalmente uma obra derivada. (Executa'veis contendo este co'digo-objeto mais partes da Biblioteca continuam submetidos aos termos da Cla'usula 6). Do contra'rio, se a obra for um derivado da Biblioteca, voce^ podera' distribuir o co'digo objeto da obra sob os termos da Cla'usula 6. Quaisquer executa'veis contendo esta obra tambe'm se submetmem a` Cla'usula 6, estejam ou na~o diretamente ligados a` Biblioteca em si. 6. Como excec,a~o a` Cla'usula acima, voce^ tambe'm pode combinar ou ligar uma "obra que usa a Biblioteca" a` Biblioteca para produzir uma obra contendo partes da Biblioteca e distribui'-la de acordo com os termos de sua escolha, desde que estes termos permitam modificac,o~es na obra para uso pro'prio por parte do cliente e engenharia reversa para depurac,a~o dessas modificac,o~es. Em cada co'pia da obra, voce^ tera' de colocar um aviso, em destaque, de que a Biblioteca foi usada e que ela e seu uso esta~o cobertos por esta Licenc,a. Voce^ devera' fornecer uma co'pia desta Licenc,a. Se, durante a execuc,a~o, a obra exibir avisos ou notificac,o~es de direitos autorais (ou copyright), voce^ tera' de incluir, entre eles, o aviso de direitos autorais (ou copyright) referente a` Biblioteca, bem como uma refere^ncia direcionando o usua'rio para a co'pia desta Licenc,a. Ale'm disso, voce^ dever tomar ao menos uma das seguintes provide^ncias: a. Incluir na obra todo o co'digo-fonte da Biblioteca, passi'vel de leitura pela ma'quina, incluindo quaisquer modificac,o~es que foram usadas na obra (as quais devem ser distribui'das conforme as Cla'usulas 1 e 2 acima); e, se a obra for um executa'vel ligado a` Biblioteca, com toda a "obra que usa a Bilblioteca" passi'vel de leitura pela ma'quina, como co'digo-objeto e/ou co'digo-fonte, de modo que o usua'rio possa modificar a biblioteca e, depois, religar para produzir um executa'vel modificado contendo a Biblioteca modificada. (Fica entendido que o usua'rio que modificar o conteu'do dos arquivos de definic,o~es da Biblioteca na~o necessariamente sera' capaz de recompilar a aplicac,a~o para usar as definic,o~es modificadas). b. Usar um mecanismo adequado de biblioteca compartilhada para ligar com a Biblioteca. Um mecanismo adequado e' aquele que (a) usa, ao tempo da execuc,a~o, uma co'pia da biblioteca ja' presente no sistema do computador do usua'rio, e (2) ira' operar adequadamente com uma versa~o modificada da biblioteca, se o usua'rio instalar uma, desde que a versa~o modificada seja compati'vel com a interface da versa~o com a qual a obra foi feita. c. Incluir na obra uma oferta por escrito, va'lida por pelo menos 3 anos, oferencendo ao mesmo usua'rio os materiais especificados na letra "a" da Cla'usula 6 acima, por um custo na~o superior ao custo de fazer esta distribuic,a~o. d. Se a distribuic,a~o da obra for feita com a permissa~o de acesso para copiar, a partir de um local designado, oferecer acesso equivalente para copiar os materiais acima especificados, a partir do mesmo local. e. Certificar-se se o usua'rio ja' recebeu uma co'pia desses materiais ou de que voce^ ja' enviou uma co'pia a esse usua'rio. Para um executa'vel, o formato exigido da "obra que usa a Biblioteca" deve incluir quaisquer dados e programas utilita'rios necessa'rios para reproduc,a~o do executa'vel a partir dele. Todavia, como uma excec,a~o especial, os materiais a serem distribui'dos na~o necessitam incluir algo que seja normalmente distribui'do (tanto no formato fonte quanto bina'rio) com os componentes mais importantes (compilador, kernel, e assim por diante) do sistema operacional no qual executa'vel e' executado, a menos que esse componente, em si, acompanhe o executa'vel. Pode ocorrer que essa exige^ncia contradiga as restric,o~es da licenc,a de outras bibliotecas proprieta'rias que normalmente na~o acompanham o sistema operacional. Essa contradic,a~o significa que voce^ na~o pode utilizar ambas e a Biblioteca juntas em um executa'vel distribui'do por voce^. 7. Voce^ pode colocar dispositivos da biblioteca que sejam uma obra baseada na Biblioteca lado-a-lado em uma u'nica biblioteca junto com outros dispositivos de bibliotecas, desde que uma distribuic,a~o separada da obra baseada na Biblioteca e dos outros dispositivos de bibliotecas seja, de outro modo, permitida e desde que voce^ tome uma das seguintes provide^ncias: a. Incluir na biblioteca combinada uma co'pia dessa obra baseada na Biblioteca sem a combinac,a~o com quaisquer outros dispositivos de biblioteca. Essa co'pia tem de ser distribui'da de acordo com as condic,o~es das cla'usulas acima. b. Junto com a biblioteca combinada, fornecer um aviso, em destaque, sobre o fato de que parte dela e' uma obra baseada na Biblioteca, e explicando onde encontrar o formato na~o combinado incluso dessa mesma obra. 8. Voce^ na~o podera' copiar, modificar, sublicenciar, ligar, ou distribuir a Biblioteca, exceto conforme expressamente disposto nesta Licenc,a. Qualquer tentativa de, de outro modo, copiar, modificar, sublicenciar, ligar ou distribuir a Biblioteca e' inva'lida, e automaticamente terminara' seus direitos sob esta Licenc,a. Todavia, terceiros que tiverem recebido co'pias ou direitos de voce^, de acordo com esta Licenc,a, na~o tera~o seus direitos rescindidos, enquanto estes terceiros mantiverem o seu pleno cumprimento. 9. Voce^ na~o e' obrigado a aceitar esta Licenc,a, uma vez que voce^ na~o a assinou. Entretanto, nada mais concede a voce^ permissa~o para modificar ou distribuir a Biblioteca ou suas obras derivadas. Esses atos sa~o proibidos por lei se voce^ na~o aceitar esta Licenc,a. Portanto, ao modificar ou distribuir a Biblioteca (ou qualquer obra baseada na Biblioteca), voce^ manifesta sua aceitac,a~o desta Licenc,a para faze^-lo, bem como de todos os seus termos e condic,o~es para co'pia, distribuic,a~o ou modificac,a~o da Biblioteca ou obras nela baseadas. 10. A cada vez que voce^ redistribuir a Biblioteca (ou qualquer obra nela baseada), o receptor automaticamente recebe uma licenc,a do licenciante original para copiar, distribuir, ligar ou modificar a Biblioteca, sujeito a estes respectivos termos e condic,o~es. Voce^ na~o podera' impor quaisquer restric,o~es adicionais ao exerci'cio, pelos receptores, dos direitos concedidos por este instrumento. Voce^ na~o tem responsabilidade de promover o cumprimento desta licenc,a por parte de terceiros. 11. Se, como resultado de uma sentenc,a judicial ou alegac,a~o de violac,a~o de patente, ou por qualquer outro motivo (na~o restrito a`s questo~es de patentes), forem impostas a voce^ condic,o~es (tanto atrave's de mandado judicial, contrato ou qualquer outra forma) que contradigam as condic,o~es desta Licenc,a, voce^ na~o estara' desobrigado quanto a`s condic,o~es desta Licenc,a. Se voce^ na~o puder atuar como distribuidor de modo a satisfazer simultaneamente suas obrigac,o~es sob esta Licenc,a e quaisquer outras obrigac,o~es pertinentes, enta~o, como consequ"e^ncia, voce^ na~o podera' distribuir a Biblioteca de nenhuma forma. Por exemplo, se uma licenc,a sob uma patente na~o permite a redistribuic,a~o por parte de todos aqueles que tiverem recebido co'pias, direta ou indiretamente de voce^, sem o pagamento de royalties, enta~o, a u'nica forma de cumprir tanto com esta exige^ncia quanto com esta licenc,a sera' deixar de distribuir, por completo, a Biblioteca. Se qualquer parte desta Cla'usula for considerada inva'lida ou na~o executa'vel, sob qualquer circunsta^ncia especi'fica, o restante da cla'usula devera' continuar a ser aplicado e a cla'usula, como um todo, devera' ser aplicada em outras circunsta^ncias. Esta cla'usula na~o tem a finalidade de induzir voce^ a infringir quaisquer patentes ou direitos de propriedade, nem de contestar a validade de quaisquer reivindicac,o~es deste tipo; a u'nica finalidade desta cla'usula e' proteger a integridade do sistema de distribuic,a~o do software livre, o qual e' implementado mediante pra'ticas de licenc,as pu'blicas. Muitas pessoas te^m feito generosas contribuic,o~es a` ampla gama de software distribui'do atrave's desse sistema, confiando na aplicac,a~o consistente deste sistema; cabe ao autor/doador decidir se deseja distribuir software atrave's de qualquer outro sistema e um licenciado na~o pode impor esta escolha. Esta cla'usula visa deixar absolutamente claro o que se acredita ser uma consequ"e^ncia do restante desta Licenc,a. 12. Se a distribuic,a~o e/ou uso da Biblioteca for restrito em determinados pai'ses, tanto por patentes ou por interfaces protegidas por direito autoral, o titular original dos direitos autorais que colocar a Biblioteca sob esta Licenc,a podera' acrescentar uma limitac,a~o geogra'fica de distribuic,a~o expli'cita excluindo esses pai'ses, de modo que a distribuic,a~o seja permitida somente nos pai'ses ou entre os pai'ses que na~o foram exclui'dos dessa forma. Nesse caso, esta Licenc,a passa a incorporar a limitac,a~o como se esta tivesse sido escrita no corpo desta Licenc,a 13. A Free Software Foundation [Fundac,a~o Software Livre] podera' de tempos em tempos publicar verso~es revisadas e/ou novasda Licenc,a Pu'blica Geral Menor. Essas novas verso~es sera~o semelhantes em espi'rito a` presente versa~o, podendo, pore'm, ter diferenc,as nos detalhes, para tratar de novos problemas ou preocupac,o~es. Cada versa~o recebe um nu'mero distinto de versa~o. Se a Biblioteca especificar um nu'mero de versa~o desta Licenc,a, aplica'vel a` Biblioteca ou a "qualquer versa~o posterior", voce^ tera' a opc,a~o de seguir os termos e condic,o~es tanto daquela versa~o como de qualquer versa~o posterior publicada pela Free Software Foundation. Se a Biblioteca na~o especificar um nu'mero de licenc,a da versa~o, voce^ podera' escolher qualquer versa~o ja' publicada pela Free Software Foundation. 14. Se voce^ desejar incorporar partes da Biblioteca em outros programas livres cujas condic,o~es de distribuic,a~o sejam incompati'veis com estas, escreva ao autor para solicitar permissa~o. Para software cujos direitos autorais pertencerem a` Free Software Foundation, escreva a` Fundac,a~o; algumas vezes, fazemos excec,o~es nesse sentido. Nossa decisa~o sera' guiada pelos dois objetivos de preservar a condic,a~o livre de todos os derivados de nosso software livre e de promover o compartilhamento e reutilizac,a~o de softwares, de modo geral. EXCLUSA~O DE GARANTIA ===================== 15. COMO A BIBLIOTECA E' LICENCIADA SEM CUSTO, NA~O HA' NENHUMA GARANTIA PARA A BIBLIOTECA, NO LIMITE PERMITIDO PELA LEI APLICA'VEL. EXCETO QUANDO DE OUTRA FORMA ESTABELECIDO POR ESCRITO, OS TITULARES DOS DIREITOS AUTORAIS E/OU OUTRAS PARTES FORNECEM A BIBLIOTECA "NO ESTADO EM QUE SE ENCONTRA", SEM NENHUMA GARANTIA DE QUALQUER TIPO, TANTO EXPRESSA COMO IMPLI'CITA, INCLUINDO, DENTRE OUTRAS, AS GARANTIAS IMPLI'CITAS DE COMERCIABILIDADE E ADEQUAC,A~O PARA UMA FINALIDADE ESPECI'FICA. O RISCO INTEGRAL QUANTO A` QUALIDADE E DESEMPENHO DA BIBLIOTECA E' ASSUMIDO POR VOCE^. CASO A BIBLIOTECA CONTENHA DEFEITOS, VOCE^ ARCARA' COM OS CUSTOS DE TODOS OS SERVIC,OS, REPAROS OU CORREC,O~ES NECESSA'RIAS. 16. EM NENHUMA CIRCUNSTA^NCIA, A MENOS QUE EXIGIDO PELA LEI APLICA'VEL OU ACORDADO POR ESCRITO, QUALQUER TITULAR DE DIREITOS AUTORAIS OU QUALQUER OUTRA PARTE QUE POSSA MODIFICAR E/OU REDISTRIBUIR A BIBLIOTECA, CONFORME PERMITIDO ACIMA, SERA' RESPONSA'VEL PARA COM VOCE^ POR DANOS, INCLUINDO ENTRE OUTROS QUAISQUER DANOS GERAIS, ESPECIAIS, FORTUITOS OU EMERGENTES, ADVINDOS DO USO OU IMPOSSIBILIDADE DE USO DA BIBLIOTECA (INCLUINDO, ENTRE OUTROS, PERDA DE DADOS, DADOS SENDO GERADOS DE FORMA IMPRECISA, PERDAS SOFRIDAS POR VOCE^ OU TERCEIROS OU A IMPOSSIBILIDADE DA BIBLIOTECA DE OPERAR COM QUALQUER OUTRO SOFTWARE), MESMO QUE ESSE TITULAR, OU OUTRA PARTE, TENHA SIDO AVISADO SOBRE A POSSIBILIDADE DESSES DANOS. FINAL DOS TERMOS E CONDIC,O~ES ============================== Como Aplicar Estes Termos para Suas Novas Bibliotecas ===================================================== Se voce^ desenvolver uma nova biblioteca e quiser que ela seja da maior utilidade possi'vel para o pu'blico, no's recomendamos fazer dela um software livre que todos possam redistribuir e modificar. Voce^ pode fazer isto permitindo a redistribuic,a~o sob estes termos (ou, alternativamente, sob os termos da Licenc,a Pu'blica Geral comum) Para fazer isto, anexe as notificac,o~es seguintes a` biblioteca. E' mais seguro anexa'-las ao comec,o de cada arquivo-fonte, de modo a transmitir do modo mais eficiente a exclusa~o de garantia; e cada arquivo deve ter ao menos a linha de "direitos autorais reservados" e uma indicac,a~o de onde a notificac,a~o completa se encontra. UMA LINHA PARA INFORMAR O NOME DA BIBLIOTECA E UMA BREVE IDE'IA DO QUE ELA FAZ. Direitos Autorais Reservados (C) NOME DO AUTOR Esta biblioteca e' software livre; voce^ pode redistribui'-la e/ou modifica'-la sob os termos da Licenc,a Pu'blica Geral Menor do GNU conforme publicada pela Free Software Foundation; tanto a versa~o 2.1 da Licenc,a, ou (a seu crite'rio) qualquer versa~o posterior. Esta biblioteca e' distribui'do na expectativa de que seja u'til, pore'm, SEM NENHUMA GARANTIA; nem mesmo a garantia impli'cita de COMERCIABILIDADE OU ADEQUAC,A~O A UMA FINALIDADE ESPECI'FICA. Consulte a Licenc,a Pu'blica Geral Menor do GNU para mais detalhes. Voce^ deve ter recebido uma co'pia da Licenc,a Pu'blica Geral Menor do GNU junto com esta biblioteca; se na~o, escreva para a Free Software Foundation, Inc., no enderec,o 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. Inclua tambe'm informac,o~es sobre como contatar voce^ por correio eletro^nico e por meio postal. Voce^ tambe'm pode solicitar a seu empregador (se voce^ for um programador) ou a sua instituic,a~o acade^mica, se for o caso, para assinar uma "renu'ncia de direitos autorais" sobre a biblioteca, se necessa'rio. Segue um exemplo; altere os nomes: A Yoyodyne Ltda., neste ato, renuncia a todos eventuais direitos autorais sobre a biblioteca 'Frob' (uma biblioteca para ajustar fechaduras), escrita por James Random Hacker. , 1 de abril de 1990 Ty Coon, Presidente Isso e' tudo!  File: geomview-pt_BR, Node: History, Next: Platforms, Prev: Copying, Up: Top History of Geomview's Development ********************************* Geomview was originally written at the Geometry Center at the University of Minnesota in Minneapolis. The Geometry Center was a research and education center funded by the National Science Foundation, with a mission to promote research and communication of mathematics. Much of the work there involved the use of computers to help visualize mathematical concepts. The project that eventually led to Geomview began in the summer of 1988 with the work of Pat Hanrahan on a viewing program called MinneView. Shortly thereafter Charlie Gunn begin developing OOGL (Object Oriented Graphics Language) in conjunction with MinneView. Many people contributed to OOGL and MinneView, including Stuart Levy, Mark Meuer, Tamara Munzner, Steve Anderson, Mario Lopez, Todd Kaplan. In 1991 the staff of the Geometry Center began work on a new improved version of OOGL, and a new and improved viewing program, which they called Geomview. At that time essentially the only game in town for interactive 3D graphics was Silicon Graphics (SGI), so Geomview was developed initially on SGI workstations, using IRIS GL. The first version was finished in January of 1992. It immediately became very popular among visitors to the Geometry Center, and through the Center's ftp archive (this was before the web) people at other institutions began using it too. In addition to SGI workstations the Geometry Center had quite a few NeXT stations, so soon after Geomview was running on SGIs the staff developed a version for NeXTStep as well. By this time there were several thousand people using it around the world. A few years later the staff ported Geomview to X windows and OpenGL, and eventually, with the demise of NeXT, the NeXT version fell by the wayside. In its mission to foster communication among researchers and educators, the Geometry Center developed a web site, www.geom.umn.edu, in late 1993. It was one of the first 300 web sites in existence. A part of the web site was of course devoted to Geomview, and helped to spread the word about its existence. The Geometry Center closed its "brick and mortar" facilities in August of 1998 (NSF cut its funding), but the web site continued to exist, and Geomview continued to be very popular around the world. In December of 1999 some of the former Geometry Center staff set up `http://www.geomview.org' as a permanent home on the web for Geomview. Geomview's original authors, as well as a number of other volunteers around the world, are still actively involved in using and developing Geomview. * Menu: * Authors:: Authors.  File: geomview-pt_BR, Node: Authors, Prev: History, Up: History Authors ======= Tamara Munzner, Stuart Levy, e Mark Phillips sa~o os autores originais do Geomview. Celeste Fowler, Charlie Gunn, e Nathaniel Thurston tambe'm fazem contribuic,o~es sgnificativas. Daniel Krech e Scott Wisdom fizeram o NeXTStep e a adaptac,a~o do RenderMan, e Daeron Meyer e Tim Rowley fizeram a adaptac,a~o para o X windows. Muitos outros membros do estado maior do Geometry Center, bem como muitas pessoas em muitos lugares, tambe'm contribui'ram. Mark Phillips escreveu essse manual, com ajuda substancial de Stuart Levy e Tamara Munzner. Inconta'veis usua'rios do Geomview tambe'm foram de grande ajuda por meio da leitura do manual e indicando nossos enganos.  File: geomview-pt_BR, Node: Platforms, Next: Pronunciation, Prev: History, Up: Top Supported Platforms ******************* Geomview 1.9 pode - em princi'pio - compilar e executarsobre qualquer claramente recente sistemas operacionais semelhantes ao Unix. Especificamente, Geomview executa sobre Linux e sobre Cygwin (Cygwin emula um ambiente semelhante ao SystemV Unix environment sob o Microsoft Windows). Desafortunadamente Geomview compila com MacOS X (Darwin), mas aparentemente comunicac,o~es com Geomview por meio de pipes e sockets causam falha de segmentaca~o. Sinta-se livre para consertar essa falha! Veja *Note Contributing::, para detalhes.  File: geomview-pt_BR, Node: Pronunciation, Next: Overview, Prev: Platforms, Up: Top How to Pronounce "Geomview" *************************** A palavra 'Geomview' e' uma combinac,a~o da primeira si'laba da palavra 'geometry', e da palavra 'view'. Os autores pronunciam Geomview como uma palavra oxi'tona, isto e', tonicidade na primeira si'laba. GE-om-view Algumas pessoas colocam a tonicidade na segunda si'laba, onde Geomview cai na palavra 'geometry', mas os autores originais, que criaram o nome, preferem a pronu'ncia com tonicidade na primeira si'laba.  File: geomview-pt_BR, Node: Overview, Next: Tutorial, Prev: Pronunciation, Up: Top 1 Overview ********** O principal objetivo do Geomview e' mostrar objetos cuja geometria e' fornecida, permitindo controle interativo sobre detalhes tais como ponto de visa~o, velocidade de movimento, apare^ncia de superfi'cies e linhas, e assim por diante. Geomview pode manusear qualquer nu'mero de objetos e permite controle coletivo ou separado sobre eles. A maneira mais simples de usar Geomview e' como um visualizador independente para ver e manipular objetos. Geomview pode mostrar objetos descritos em uma variedade de formatos de arquivo. Geomview e' acompanhado com uma larga variedade de objetos como exemplo, e voce^ pode criar seus pro'prios objetos. Voce^ pode tambe'm usar Geomview para manusear os dados a serem mostrados provenientes de outro programa que esta' sendo executado simulta^neamente. Como o outro programa modifica os dados, a ima'gem no geomview reflete as modificac,òes. Programas que geram objetos e utilizam o Geomview para mostra'-los sa~o chamados _mo'dulos externos_. Mo'dulos externos podem controlar quase todos os aspe'ctos do Geomview. A ide'ia aqui e' que muitos aspe'ctos de visualizac,a~o e partes da interac,a~o de programas geome'tricos sa~o independentes do conteu'do geome'trico e podem ser coletados conjuntamente em uma pec,a simples de programa que pode ser usada em uma larga variedade de situac,o~es. O autor de um mo'dulo externo pode concentrar-se sobre a implementac,a~o dos algori'tmos desejados e deixar os aspe'ctos de visualizac,a~o ao Geomview. Geomview e' acompanhado por uma colec,a~o de mo'dulos externos a ti'tulo de exemplo, e esse manual descreve como escrever seu pro'prio _mo'dulo externo_. Geomview e' o produto de um esforc,o no "Geometry Center" para disponibilizar um "software" de geometria interativa que e' particularmente apropriado para pesquisa matema'tica e educac,a~o. Em particular, Geomview pode mostrar coisas no espac,o hiperbo'lico e no espac,o esfe'rico bem como no espac,o Euclidiano. Geomview permite mu'ltiplos objetos que sa~o controlados independentemente e ca^meras. As ca^meras fornecem controle interativo para movimento, apare^ncias (incluindo iluminac,a~o, sombreamento, e materiais), selecionando um objeto, aresta ou ni'vel de ve'rtice, instanta^neos em um arquivo de imagem SGI ou no formato Renderman RIB, a adic,a~o ou apagamento de objetos e' possi'vel atrave's da manipulac,a~o direta do mouse, paine'is de controle, e teclas de atalho via teclado. Geomview suporta os seguintes tipos de dados simples: poliedros com ve'rtices compartilhados (.off), quadrila'teros, malhas retangulares, vetores, e ajustes em superfi'cies de Bezier de grau arbitra'rio incluindo ajustes racionais. Hierarqui'as de objetos podem ser construi'das com listas de objetos e insta^ncias de objeto(s) transformado(s) por uma ou mais matrizes 4x4. Porc,o~es arbitra'rias de modificac,o~es de hierarqui'as podem ser transmitidas por meio da criac,a~o de refere^ncias nomeadas. Geomview pode mostrar sai'das gra'ficas tridimensionais provenientes do Mathematica e do Maple.  File: geomview-pt_BR, Node: Tutorial, Next: Interaction, Prev: Overview, Up: Top 2 Tutorial ********** Esse capi'tulo conduzira' voce^ atrave's de alguns usos elementares do Geomview. Trabalhando do comec,o ao fim desse capi'tulo de frente a um computador onde voce^ pode tentar acompanhar os exemplos fornecidos aqui voce^ pegara' um pouco do que voce^ pode fazer com Geomview. Para iniciar o Geomview, coloque seu usua'rio e sua senha no computador e abra uma janela de shell. Uma janela de shell e' uma janela na qual voce^ pode digitar comandos Unix; o prompt na janela usualmente termina com um '%'. Na janela de shell (o cursor do mouse deve estar posicionado sobre a janela) digite o seguinte (`' aqui significa pressione a tecla "Enter"): geomview tetra dodec Esse comando inicia o geomview e chama dois objetos exemplo, um tetraedro e um dodecaedro. Apo's poucos segundos tre^s janelas ira~o aparecer; *note Figure: figinitial. [image src="figs/initial.png"] Figure 2.1: Initial Geomview display. O painel a` esquerda e' o painel de controle principal do Geomview; Esse painel e' chamado de painel _Main_ (principal). O painel menor ao centro e' o painel _Tools_ (de ferramentas) e serve para selecionar diferentes tipos de movimentos. A janela do lado direito e' a janela de ca^mera e nessa janela voce^ ve^ um tetraedro largo e um dodecaedro que esta' parcialmente obscurecido pelo tetraedro. Geomview tem alguns paine'is mais por padra~o ele mostra somente esses tre^s. iremos descrever alguns aspe'ctos desses tre^s e alguns dos outros nesse tutorial. Voce^ pode ler mais sobre esses e outros paine'is nos capi'tulos adiante neste manual. Coloque o cursor do mouse na janela de ca^mera e pressione e mantenha pressionado o bota~o esquerdo do mouse. Agora, enquanto mante'm pressionado o bota~o, lentamente mova o mouse com movimentos pequenos. Voce^ vera' a figura rotacionar na direc,a~o na qual voce^ mover o mouse. Se voce^ liberar o bota~o do mouse enquanto move o mesmo, a figura continua girando. Para parar o movimento de rotac,a~o, mantenha o mouse sobre a figura e pressione rapdamente o bota~o esquerdo do mesmo. Geomview utiliza o modelo da _esfera de vidro_ para os movimentos iniciados atrave's do mouse. Isso significa que voce^ esta' supondo o objeto como estando dentro de uma esfera invisi'vel e o cursor do mouse como sendo uma alc,a fora da esfera provida de uma ventosa. Quando voce^ mante'm pressionado o bota~o esquerdo do mouse, a ventosa da alc,a gruda na esfera; quando voce^ libera o bota~o do mouse, a ventosa da alc,a libera a esfera. Movendo o mouse enquanto mante'm pressionado o bota~o faz com que a esfera (e concequ"e^ntemente o objeto) mova-se na mesma direc,a~o que o mouse. Adicionalmente para os dois so'lidos que esta~o atualmente na tela voce^ pode tambe'm ver duas molduras de fios em forma de caixa na janela de ca^mera. Essas sa~o as "caixas associadas" dos dois objetos. Por padra~o Geomview coloca uma caisa associada em torno de cada objeto que e' mostrada de forma que voce^ tenha uma ide'ia de o quanto grande o objeto e'. Note que quando voce^ move o mouse em torno do tetraedro e do dodecaedro eles se movem como se fossem uma u'nica figura. Isso ocorre porque por padra~o o que voce^ esta' movendo atualmente e' o "World" (mundo). Para mover um dos objetos individualmente em lugar de o mundo como um todo, mova o cursor do mouse para o navegador de alvos (_Targets_) no painel principal (_Main_). Clique (qualquer bota~o) sobre a palavra _tetra_. Isso faz com que o tetraedro seja o "objeto alvo". Agora mova o cursor de volta a` janela de ca^mera e voce^ podera' rotacionar apenas o tetraedro. O movimento que voce^ aplicou ate' agora foi a rotac,a~o, porque esse e' o modo de modo de movimento selecionado no painel de ferramentas (_Tools_). Para efetuar o movimento de translac,a~o em lugar do movimento de rotac,a~o, clique sobre o bota~o translac,a~o (_Translate_). Agora quando voce^ mover o mouse na janela de ca^mera enquanto mante'm pressionado o bota~o esquerdo, o tetraedro (que deve ser ainda o objeto alvo de antes) ira' ser transladado na direc,a~o que voce^ move o mouse. Note que voce^ pode transladas o tetraedro na direc,a~o da borda da janela enquanto voce^ mante'm pressionado o bota~o esquerdo do mouse. Se voce^ liberar o bota~o do mouse enquanto move o mesmo, o tetraedro ira' continuar o movimento sozinho. O tetraedro mover-se-a' ao contra'rio do que ocorria antes muito rapidamente de forma que e' muito fa'cil perder o rastro de onde ele se encontra. Se voce^ acidentalmente perder o tetraedro atrave's de translac,a~o para muito longe da visa~o da janela, voce^ pode pega'-lo de vlta atrave's de um clique sobre o bota~o Centro (_Center_) no painel de ferramentas (_Tools_). Isso fara' com que o tetraedro retorne para a sua posic,a~o inicial. Clique sobre o bota~o Centro (_Center_) para trazer o tetraedro ao centro da janela de ca^mera, e enta~o coloque-o em uma posic,a~o de forma que voce^ possa ver completamente o dodecaedro. Seu mundo agora tem dois objetos que esta~o um ao lado do outro. Voce^ pode ver o dodecaedro no meio da janela de ca^mera e pode ver parte do tetraedro parcialmente fora da janela de ca^mera. Volte para o navegador de alvos (_Targets_) no painel principal (_Main_) e clique sobre o "World" para selecionar o referido mundo novamente. Agora clique sobre o bota~o "Olhar Para" (_Look At_) no painel de ferramentas (_Tools_). Voce^ pode ver o dodecaedro e o tetraedro ajustando-se ao meio da janela (figura *note figlookatworld::). O bota~o "Olhar Para" (_Look At_) posiciona a ca^mera em uma posic,a~o tal que o objeto alvo fique centrado na janela. [image src="figs/fig2.png"] Figure 2.2: Olhando para o Mundo. Agora coloque o cursor sobre o meio do dodecaedro e de^ sobre ele um duplo clique com o bota~o direito do mouse. Isso significa clicar no mouse para baixo e para cima duas vezes em uma ra'pida sucessa~o. Note que o dodecaedro torna-se o objeto alvo; voce^ pode ver isso no navegador de alvos (_Targets_) do painel principal (_Main_). Um duplo clique no bota~o direito do mouse sobre um objeto e' outra forma de fazer esse objeto tornar-se o objeto alvo. [image src="figs/ap.png"] Figure 2.3: A Painel Apare^ncia. Va' para o menu _Inspect_ no topo do painel principal (_Main_) e selecione Apare^ncia (_Appearance_). Isso faz aparecer o painel "Apare^ncia" (_Appearance_). Quando ele aparece, se estiver parcialmente obscurecido por outra janela do Geomview voce^ pode move^-lo para um lado arrastando sua moldura com o bota~o do meio do mouse pressionado. O painel Apare^ncia (_Appearance_) permite a voce^ controlar va'rias coisas sobre a maneira como o Geomview desenha objetos. Note os boto~es rotulados com _[af] Faces_ e _[ae] Edges_ (arestas). Clique sobre o _[ae] Edges_ uma vez, e note que Geomview esta' agora ressalta/destaca as arestas do dodecaedro. Clique sobre o _[ae] Edges_ novamente e as arestas desaparecem. Clique muitas vezes e assista as arestas indo e voltando. Quando voce^ tiver feito isso o suficiente, deixe as arestas habilitadas e clique sobre o bota~o _[af] Faces_. Essa ac,a~o alterna entre exibir ou na~o as faces. Clique sobre o bota~o novamente para de forma que a exibic,a~o das face fique habilitada. Agora clique sobre o bota~o _[Cf] Faces_ sob a palavra _COLOR_. Um painel de escolha de cores aparecera' (*note Figure: figcolorchooser.). [image src="figs/color.png"] Figure 2.4: Painel de Escolha de Cores. Note os tre^s boto~es deslizantes, _H_, _S_, e _V_, controlando a matiz (_hue_), saturac,a~o, e valor (iluminac,a~o). Clicando sobre o bota~o _HSV_ fornece um diferente conjunto de boto~es deslizantes, um para vermelho (_red_), outro para verde (_green_), e outro para azul (_ blue_). Valores nume'ricos para ambos os sistemas de cores RGB e HSV podem ser vistos ou editados na parte inferior do painel. A cor iinicial do dodecaedro foi especificada no arquivo `dodec' que voce^ chamou quando iniciamos o Geomview. A cor que voce^ especificou com o painel de cores sobrescreveu as cores antigas. Voce^ pode ajustar a intensidade da cor com o bota~o deslizante _Intensity_. Quando voce^ encontrar uma cor que voce^ gosta, clique sobre o bota~o _Done_. Agora coloque o cursor do mouse em algum lugar sobre sobre o fundo cinza da janela de ca^mera e duplo-clique no bota~o direito; isso seleciona "World" como objeto alvo. Clique no bota~o _Look At_ para para olhar para o mundo novamente. Note que no painel de Apare^ncia (_Appearance_) as escolhas dos boto~es se modificavam a` medida que o lado esquerdo tambe'm mudava com o dodecaedro. Isso ocoore porque o painel _Appearance_ sempre mostra as escolhas para o objeto alvo, que agora e' o mundo, o qual ainda tem suas escolhas padra~o. Clique sobre o bota~o _[ab] BBox_ sob a palavra _Draw_. A caixa associada desaparece. agora pona o cursor de volta na janela de ca^mera. No teclado, digite as teclas `a 'b. Note que a caixa associada aparece novamente. `a 'b e' o atalho de teclado para o bota~o que alterna entre a exibic,a~o ou na~o da caixa associada; a sequ"e^ncia de caracteres "[ab]" aparece sobre o bota~o para indicar isso. A maioria dos boto~es do Geomview possuem atalhos de teclado que voce^ pode usar se preferir. Isso sera' u'ltil quando voce^ estiver familiarizado com o Geomview e na~o quiser ter de se mover entre uma montanha de paine'is. Agora selecione o tetraedro, use qualquer das duas formas: duplo-clicando o bota~o direito do mouse sobre o tetraedro, ou selecionando "tetra" no navegador de alvos (_Targets_). Enta~o clique sobre o bota~o _Delete_ do menu _Edit_ no painel principal (_Main_). O tetraedro deve desaparecer. Essa e' a forma de voce^ se livrar de um objeto. Voce^ pode tambe'm chamar objetos de dentro do Geomview. Clique sobre o menu _File_ no painel principal (_Main_) e escolha abrir (_Open_). O painel de arquivos (_Files_) ira' aparecer. Abaixo do meio desse painel, onde se le^ _Path List_, temos um navegador com tre^s linhas detro dele; a segunda linha e' um direto'rio com montanhas de exemplos do Geomview dentro dele. Clique sobre aquela segunda linha; *note Figure: figfilespanel. Role para baixo na lista de arquivos ate' voce^ ver `tref.off'. Clique sobre aquela linha, e enta~o clique sobre o bota~o _OK_. Um grande tubo em forma de trevo ira' aparecer em sua janela. Clique sobre o bota~o _Hide_ no painel _Files_ para dispensar o painel. [image src="figs/secondlinelist.png"] Figure 2.5: O Painel de Arquivos. Agora clique sobre o bota~o _Reset_ no painel de ferramentas (_Tools_). Isso fara' com que todas as figuras rtornem ao centro da janela de ca^mera. Voce^ pode ver um dodecaedro e uma protubera^ncia do trevo (*note Figure: figtrefdodec.). Brinque com a protubera^ncia do trevo e o dodecaedro. Fac,a experie^ncias com alguns outros boto~es no painel de ferramentas (_Tools_). Tente colorir o trevo com o painel de apare^ncia (_Appearance_). Para um tutorial sobre criar seus pro'prios objetos para chama'-los dentro do Geomview, veja `doc/oogltour' distribuido com Geomview. As coisas naquele arquivo ira~o ser incorporadas em futuras verso~es desse manual. [image src="figs/trefdodecinter.png"] Figure 2.6: Trevo e Dodecaedro.  File: geomview-pt_BR, Node: Interaction, Next: OOGL File Formats, Prev: Tutorial, Up: Top 3 Interaction ************* Esse capi'tulo descreve como voce^ interage com Geomview atrave's do mouse e do teclado. * Menu: * Starting Geomview:: Iniciando o Geomview. * Command Line Options:: Opc,o~es de Linha de Comando. * Basic Interaction:: Interac,o~es Ba'sicas: O Painel Principal. * Loading:: Chamando Objetos Dentro do Geomview. * Mouse Motions:: Usando o Mouse para Manipular Objetos. * Appearance:: Modificando a Forma de Ver as Coisas. * Cameras:: Ca^meras. * Saving:: Gravando seu Trabalho. * Commands:: O Painel de Comandos. * Keyboard Shortcuts:: Atalhos de Teclado.  File: geomview-pt_BR, Node: Starting Geomview, Next: Command Line Options, Prev: Interaction, Up: Interaction 3.1 Starting Geomview ===================== A forma usual para iniciar o Geomview e' digitar `geomview ' em uma janela de shell ( significa pressionar a tecla "Enter"). Esse procedimento carrega o Geomview na memo'ria do computador em uns poucos segundos; uma ou mais janelas ira~o aparecer e voce^ pode comec,ar a interagir com o Geomview imediatamente. E' tambe'm possi'vel especificar ac,o~es para o Geomview executar no momento de iniciar fornecendo argumentos na linha de comando do shell. Veja *Note Command Line Options::.  File: geomview-pt_BR, Node: Command Line Options, Next: Basic Interaction, Prev: Starting Geomview, Up: Interaction 3.2 Command Line Options ======================== Aqui esta~o as opc,o~es de linha de comando que o Geomview permite: `-b R G b' Escolhe a cor de fundo da janela de ca^mera para valores fornecidos de R G b. `-c ARQUIVO' Interpreta os comandos GCL em ARQUIVO, que pode ser o si'mbolo especial `-' para a entrada padra~o. Paa uma descric,a~o de GCL, veja *Note GCL::. `-c COMANDO' Comandos podem tambe'm serem fornecidos literalmente, como em -c "(ui-panel main off)" Uma vez que COMANDO inclui pare^ntesis, que possuem significado especial para o shell, COMANDO deve receber apo'strofo. Multiplas opc,o~es -C sa~o permitidas. `-wins N' Faz com que Geomview mostre inicialmente N janelas de ca^mera. `-wpos LARGURA,ALTURA[@XMIN,YMIN]' Especifica a localizac,a~o inicial e o tamanho da primeira janela de ca^mera. Os valores para LARGURA, ALTURA, XMIN, e YMIN esta~o em coordenadas de tela (pixel). `-M[cg][ps[un|in|in6]] PIPENOME|TCPPORT' A opc,a~o `-M' aceita modificadores: um sufixo `g' espera dados geome'tricos (o padra~o), enquanto um sufixo `c' espera comandos GCL. Um `p' implica que a conecc,a~o pode usar um pipe nomeado (o padra~o para tudo exceto para "NeXT"), enquanto `s' implica no uso de um "UNIX-domain socket" (o padra~o em "NeXT"). Uma vez que na versa~o 1.9 do Geomview "Internet domain sockets" sa~o tambe'm suportados; use `sin' para fazer o Geomview escutar uma porta IPv4 fornecida por TCPPORT, ou use `sin6' para fazer Geomview escute uma porta IPv6 (tambe'm como especificado em TCPPORT). `sun' e' um sino^nimo para `s', i.e. use o "Unix domain socket" com o nome PIPENOME. Se PIPENOME inicia com uma barra ('/'), enta~o esse nome e' assumido ser um caminho absoluto, de outra forma o pipe nomeado ou socket e' criado sob o direto'rio `${TMPDIR}/geomview/'. Escutando fluxo de comando em portas TCP pode ser um risco de seguranc,a, como Geomview por si mesmo na~o toma nenhum tipo de precauc,a~o de seguranc,a, Geomview simplesmente executa todos os comandos alimentados a ele atrave's do socket de rede. Isso tambe'm implica entrada e sai'da para unidades de armazenamento locais devem ser permitidas remotamente. Exemplos: `-M NOME_DE_OBJETO' Mostra (possivelmente mudando dinamicamente) geometria enviada de programas `geomstuff' ou `togeomview'. Essa opc,a~o "-M" escuta o pipe nomeado `/tmp/geomview/nome_de_objeto'; voce^ pode conseguir o mesmo efeito com os comandos de shell abaixo: mkdir /tmp/geomview mknod /tmp/geomview/nome_de_objeto p (assumindo que o direto'rio e o pipe nomeado na~o existam atualmente), enta~o executando o comando GCL: (geometry nome_de_objeto < /tmp/geomview/nome_de_objeto) (*note `(geometry ...)': geometry.) `-Mc PIPENOME' Como `-M' acima, mas espera comandos GCL, em lugar de dados geome'tricos OOGL, na conecc,a~o. `-Mcs nome' Le^ comandos a partir do "UNIX-domain socket" nomeado. `/tmp/geomview/nome' `-Mcsin 40000' Le^ comandos a partir da porta IPv4 `40000'. Geomview por si mesmo na~o toma qualquer precauc,a~o de seguranc,a, de forma que "-Mcsin 40000" pode ser um risco de seguranc,a. `-noopengl' Desabilita o uso de OpenGL para (possivelmente) conversa~o acelerada de hardware, mesmo que o bina'rio do Geomview tenha suporte a OpenGL compilado internamente. "-noopengl" tambe'm desabilita o suporte a transpare^ncia e texturas na janelas de ca^mera. Instanta^neos "RenderMan" ainda tera~o a transpare^ncia correta e suporte a alguma textura limitada. `-nopanels' Inicia sem mostrar nenhum painel, somente a janelas gra'ficas. Paine'is podem ser invocados mais tarde da forma usual com as teclas de atalho `Px' ou com comando `ui-panel'. Veja *Note `(ui-panel ...)': ui-panel. `-noinit' Na~o le^ nenum arquivo de inicializac,a~o. Por padra~o, geomview le^ o arquivo `.geomview' do systema, seguido daqueles em `${HOME}/.geomview' e em `./.geomview'. `-e MODULO' Inicial um mo'dulo externo; MODULO e' o nome associado ao mo'dulo chamado, aparecendo no painel principal no navegador de "Applications", como definido pelo comando `emodule-define'. Veja *Note `(emodule-define ...)': emodule-define. `-start MODULE ARGS ...' Como -e mas permite a voce^ enviar argumentos para o mo'dulo externo. "-" sinaliza o fim da lista de argumentos; o "-" pode ser omitido se for o u'ltimo argumento na linha de comando do Geomview. `-run COAMANDO-SHELL ARGS ...' Como "-start" mas toma o caminho de arquivos do executa'vel do mo'dulo externo em lugar do nome do mo'dulo. Os caminhos de arquivo de todos os direto'rios de mo'dulos conhecidos sa~o anexados ao final do caminho de busca do UNIX quando for invocado o COMANDO-SHELL.  File: geomview-pt_BR, Node: Basic Interaction, Next: Loading, Prev: Command Line Options, Up: Interaction 3.3 Basic Interaction: The Main Panel ===================================== Normalmente quando voce^ invoca Geomview, tre^s janelas aparecem: O painel principal (_Main_), o painel de ferramentas (_Tools_), e uma janela de ca^mera. Geomview tem muitas outras janelas mas muitas coisas podem ser realizadas com essas tre^s de forma que por padra~o as outras na~o aparecem. Essa sec,a~o do manual introduz alguns conceitos ba'sicos que sa~o usados nas sec,o~es restantes do manual e descreve o painel principal (_Main_). [image src="figs/main.png"] Figure 3.1: The Main Panel Geomview pode mostrar um nu'mero arbitra'rio de objetos simultaneamente. O navegador _Targets_ no painel principal (_Main_) mostra uma lista de todos os objetos dos quais Geomview atualmente abertos. Esse navegador tem uma linha para cada objeto que voce^ tiver chamado, adicionalmente algumas linhas para outros objetos. Um desses outros objetos e' chamado `World' e corresponde a a todos os objetos atualmente chamados, tratados como se eles fossem um objeto. A maioria das operac,o~eos que voce^ pode fazer sobre um objeto, tais como aplicar um movimento ou mudar uma cor, pode tambe'm ser feita para o objeto "World". O navegador de alvos (_Targets_) tambe'm possui uma entrada para cada ca^mera. Por padra~o existe somente uma ca^mera; e' possi'vel adicionar mais delas atrave's da entrada _New Camera_ do painel principal (_Main_) via menu _File_. Geomview trata ca^meras na maioria das vezes como trata objetos geome'tricos. Por exemplo, voce^ pode mover ca^meras pelas proximidades e adiciona'-las e apaga'-las como objetos geome'tricos. Ca^meras na~o sa~o mostradas na tela como um objeto que voce^ ve^. Cada ca^mera tem uma janela de ca^mera separada que mostra a visa~o como vista atrave's da lente daquela ca^mera. (E' passi'vel para cada ca^mera mostrar uma representac,a~o geome'trica de outras ca^meras. Veja *Note Cameras::.) Devido ao fato de Geomview tratar ca^meras e objetos geome'tricos muito similarmente, o termo "objeto" nessa documentac,a~o e' usado para referir-se a qualquer dos dois indistintamente. Quando precisamos distingu"ir entre os dois tipos de objetos, usamos o termo ""geom"" para denotar um objeto geome'trico e a palavra "ca^mera" para denotar uma ca^mera. O objeto que esta' selecionado (luminosidade alta) no navegador "_Targets_" e' chamado objeto alvo. Esse e' o objeto que recebe quaisquer ac,o~es que voce^ faz com o mouse ou com o teclado. Voce^ pode mudar o objeto alvo selecionando uma linha diferente no navegador de alvos (_Targets_). Outro caminho de modificar o objeto alvo e' colocar o cursor do mouse diretamente sobre um geom na janela de ca^mera e rapidamente dar um duplo clique no bota~o direito do mouse. Esse processo e' chamado "selecionar"; o objeto selecionado torna-se o novo alvo. Objetos do Geomview sa~o todos conhecidos por dois nomes, ambos dos quais sa~o mostrados no navegador de alvos (_Targets_). O primeiro nome la' fornecido, que aparece entre colche^tes ([ ]), e' um nome curto atribuido pelo Geomview quando voce^ chama o objeto. Esse nome consiste da letra `g' para geometria e da letra `c' para ca^meras, seguindo por um nu'mero. O segundo nome e' maior e mais descritivo; por padra~o esse e' o nome do arquivo do qual o objeto foi chamado. Os dois nomes sa~o equivalentes ate' no que diz respeito ao Geomview; em qualquer ponto onde voce^ precisar especificar um nome voce^ pode fornecer qualquer dos dois. Para manipular um objeto, esteja certo de que aquele objeto que voce^ quer mover seja o objeto alvo, e coloque o cursor do mouse em uma janela de ca^mera. Movimentos sa~o aplicados pressionando ou o bota~o esquerdo ou o bota~o do meio do mouse e movendo o mouse. Existem muitos modos de movimento diferentes, cada modo de movimento aplicando um diferente tipo de movimento. O navegador de modos de movimento (_MOTION MODE_) no painel principal indica o modo de movimento atual. O padra~o e' a rotac,a~o ("Rotate"). Voce^ pode mudar o modo corrente de movimento selecionando um no modo de movimento no navegador de modos de movimento (_MOTION MODE_), ou usando o painel de ferramentas (_Tools_). Para maiores informac,o~es sobre modos de movimento, veja *Note Mouse Motions::. O navegador de mo'dulos (_Modules_) lista mo'dulos externos do Geomview. Um mo'dulo externo e' um programa separado que interage com Geomview para extender suas funcionalidades. Para informac,o~es sobre mo'dulos externos, veja *Note Modules::. A barra de menu no topo do painel principal oferece menus para operac,o~es comuns. Para criar novas janelas, chame novos objetos, grave os objetos ou outras informac,o~es, ou saia do geomview, veja o menu _File_. Para copiar ou apagar objetos, veja o menu _Edit_. Voce^ pode chamar qualquer painel a partir do menu _Inspect_. O menu _Space_ permite a voce^ escolher se geomview trabalha no modo Euclidiano, Hiperbolico ou Esfe'rico. O modo Euclideano e' usado por padra~o. Para detalhes sobre a utilizac,a~o do modo espac,o _Hyperbolic_ e do modo _Spherical_, veja *Note Non-Euclidean Geometry::. A maioria das ac,o~es que voce^ pode fazer atrave's dos paine'is do Geomview possuem equivalentes atalhos de teclado de forma que voce^ pode fazer a mesma ac,a~o atave's de digitac,a~o de uma sequ"e^ncia de teclas no teclado. Isso e' u'til para usua'rios avanc,ados que esta~o familiarizados com as capacidades do Geomview e querem trabalhar rapidamente sem ter montanhas de paine'is amontoando-se na tela. Atalhos de teclado sa~o usualmente indicados ente colche^tes ([ ]) pro'ximo ao item correspondente em um apinel. Por exemplo, o atalho de teclado para o modo _Rotate_ e' 'r'; isso e' indicado par "[r]" que aparece antes da palavra "Rotate" no navegador _MOTION MODE_. Para usar esse atalaho de teclado, apenas pressione a tecla `r' enquanto o cursor do mouse estiver em qualquer janela do Geomview. Na~o e' necessa'rio pressionar a tecla `' posteriormente. Alguns atalhos de teclado consistem em mais de uma tecla. Nesses caso apenas digite as teclas uma apo's a outra, sem pressionar `' posteriormente ou entre as teclas pressionadas. Atalhos de teclado sa~o sensi'veis a` caixa alta/baixa. Muitas teclas de atalho podem ser precedidas de um para^metro nume'rico. Por exemplo, digitando `ae' muda o estado do desenho de arestas, enquanto `1ae' sempre habilita o desenho de arestas. O campo _keyboard_ no canto superior esquerdo do painel principal (_Main_), imediatamente acima da palavra "Targets", ecoa o estado atual das teclas de atalho. Para uma lista de todas as teclas de atalho, pressione a telca _`?'_.  File: geomview-pt_BR, Node: Loading, Next: Mouse Motions, Prev: Basic Interaction, Up: Interaction 3.4 Loading Objects Into Geomview ================================= Existem muitos caminhos para chamar um objeto dentro do Geomview. No painel de arquivos (_Files_) Se voce^ clicar no bota~o _Load_ no painel principal do Geomview (_Main_), o painel de arquivos (_Files_) ira' aparecer. [image src="figs/myfilelist.png"] Figure 3.2: O Painel de Arquivos. Esse painel permite que voce^ selecione um arquivo a partir de uma variedade de direto'rios. O topo do painel e' um navegador de arquivos padra~o do Motif. Abaixo deste esta' uma lista de direto'rios no caminho de busca padra~o do Geomview; clique sobre um desses para navegar entre os arquivos naquele direto'rio. Para selecionar um arquivo, duplo-clique sobre o seu nome no navegador no canto superior direito, ou clique sobre o seu nome e pressione a tecla , ou ainda digite o nome do arquivo dentro da caixa de texto na parte inferior do navegador e pressione a tecla . Se o arquivo selecionado contiver dados geome'tricos OOGL, esse arquivo ira' ser adicionado ao navegador de alvos (_Targets_) do geomview. Se esse arquivo contiver comandos GCL em lugar de conter dados geome'tricos OOGL, o arquivo sera' interpretado. Veja *Note GCL::. Quando o apinel de arquivos (_Files_) aparecer pela primeira vez, o direto'rio selecionado no navegador de direto'rios e' o direto'rio atual -- que corresponde ao direto'rio a partir do qual voce^ chamou o Geomview. O navegador de arquivos mostra _todos_ os arquivos nesse direto'rio, incluindo os que na~o sa~o arquivos do Geomview. Se voce^ tentar chamar u arquivo que na~o contenha nem um objeto OOGL nem comandos do Geomview, o Geomview ira' mostrar uma mensagem de errp. O navegador de direto'rios tambe'm lista um segundo e um terceiro direto'rios adicionalmente ale'm do direto'rio atual. O segundo, que termina em `data/geom', e' o direto'rio de exemplos de dados do Geomview. Esse direto'rio conte'm uma grande variedade de amostras de objetos. Esse direto'rio tambe'm conte'm muitos subdireto'rios. Em particular, os subdireto'rios `hyperbolic' e o subdireto'rio `spherical' possuem amostras de objetos hiperbo'licos e esfe'ricos, respectivamente. Entradas no navegador de direto'rios sa~o vistas apenas como entradas de arquivos; para visualizar um subdireto'rio, clique sobre o nome do referido direto'rio. O terceiro direto'rio mostrado mostrado no navegador de direto'rio, que termina em `geom', conte'm muitos subdireto'rios com outros arquivos do Geomview dentro deles. Esses arquivos sa~o usados menos frequ"e^ntemente que os outros no direto'rio `data/geom'. Voce^ pode mudar a lista de direto'rios mostra no navegador de direto'rios do painel de arquivos (_Files_) usando o comando `set-load-path'; Veja *Note `(set-load-path ...)': set-load-path. a tecla de atalho `<': Se voce^ digitar `<' em qualquer janela do Geomview, o painel _Load_ ira' aparecer. Esse painel e' uma pequena versa~o do painel de arquivos (_Files_); o painel _Load_ conte'm um campo de texto no qual voce^ o nome de um arquivo a ser chamado (ou um comando GCL entre pare^ntesis). Apo's digitar o nome do arquivo a ser chamado, aperte a tecla `'; Geomview ira' chamar o arquivo como se voce^ o tivesse chamado com o bota~o _Add_ no painel de arquivos (_Files_). Se, apo's fazer surgir o pequeno painel _Load_ com `<', voce^ decidir que quer usar o grande painel de arquivos (_Files_) apo's tudo, pressione o bota~o _File Browser_. [image src="figs/load.png"] Figure 3.3: The Load Panel. comandos para chamar objetos geome'tricos: Os comandos GCL `load', `geometry', `new-geometry', e `read' permitem a voce^ chamar um objeto dentro do Geomview; veja *Note GCL::. Veja *Note `(load ...)': load. Veja *Note `(new-geometry ...)': new-geometry. Veja *Note `(read ...)': read.  File: geomview-pt_BR, Node: Mouse Motions, Next: Appearance, Prev: Loading, Up: Interaction 3.5 Using the Mouse to Manipulate Objects ========================================= Geomview permite a voce^ manipular objetos com o mouse. Existem seis diferentes modos de movimento do mouse: rotac,a~o (_Rotate_), translac,a~o (_Translate_), vo^o da ca^mera (_Cam Fly_), zoom da ca^mera (_Cam Zoom_), homotetia de um objeto geome'trico (_Geom Scale_), e o'rbita de ca^mera (_Cam Orbit_). O painel de ferramentas tem um bota~o para cada um desses modos; para tracar os modos, clique sobre o bota~o correspondente. voce^ pode tambe'm selecionar um modo atrave's do navegador de modos de movimento (_Motion Mode_) no painel principal (_Main_). Essa sec,a~o descreve a interac,a~o ba'sica com o mouse. Para detalhes, veja *Note Commands::. [image src="figs/tools.png"] Figure 3.4: O Painel de Ferramentas. Cada um dos modos de movimento usa um paradigma comum para como o movimento e' aplicado. Em particular, cada modo de movimento depende do objeto alvo (_target_) atual e do atual objeto do centro (_center_. O obejto alvo atual e o atual objeto do centro sa~o explicados nos para'grafos seguintes. O objeto alvo atual e' mostrado no campo _Target_ no painel de ferramentas (_Tools_). Isso e' o mesmo que o objeto selecionado no navegador de alvos (_Targets_) no painel principal (_Main_), e voce^ pode mudar o alvo ou selecionando um novo objeto no navegador, digitando uma nova entrada no campo, ou selecionando um objeto na janela de ca^mera duplo-clicando no bota~o direito do mouse com o cursor sobre o objeto. O atual objeto do centro e' mostrado no campo _Center_ no painel de ferramentas(_Tools_). Seu valor padra~o e' a palavra especial "target", que significa que o odbjeto do centro e' o objeto que estiver designado como objeto alvo. Voce^ pode mudar o objeto atual do centro para qualquer objeto digitando seu nome no campo _Center_. A ori'gem do objeto do centro e' mantido fixo no modo rotac,a~o _Rotate_ e no modo _Orbit_. Normalmente o objeto do centro e' um dos objetos geome'tricos (geoms) existentes listados no navegador de alvos (_Targets_), o centro atual das rotac,o~es e' a ori'gem daquele sistema de coordenadas daquele objeto. E' possi'vel, todavia, selecionar um ponto arbitra'rio de interesse sobre um objeto como o centro. Para detalhes, veja *Note Point of Interest::. Isso tambe'm e' possi'vel mudando o bota~o _BBox Center_ para escolher o centro de movimento como sendo o centro do objeto atual da caixa associada. Uma vez modificado o centro da caixa geome'trica ativa associada ira' tornar-se o centro do movimento, se voce^ selecionar outro objeto, enta~o o centro do movimento ira' tornar-se o centro da caixa associada a` aquele objeto. Nada modificac,a~o ocorrera' quando uma ca^mera ou o mundo (_World_) for selecionado, voce^ tem que digitar a palavra `target' no campo _Center_ para retornar ao valor padra~o. Voce^ aplica um movimento de mouse pressionando ou o bota~o esquerdo ou o bota~o do meio do mouse com o cursor em uma janela de ca^mera e movendo o mouse. A maioria dos modos de movimento possui ine'rcia (_inertia_), que significa que se voce^ soltar o bota~o enquanto move o mouse, o movimento ira' continuar. Para imaginar a ine'rcia pode ser u'til imaginar o cursor do mouse como sendo uma alc,a; quando voce^ pressiona um bota~o do mouse para baixo, o mouse agarra firmemente no objeto alvo e voce^ pode mover esse objeto. Quando voce^ libera o bota~o do mouse, a alc,a libera o objeto. Liberando o bota~o do mouse enquanto move o mesmo e' como abandonar o objeto -- o objeto continua movendo-se independentemente do mouse. Ine'rcia pode ser desligada; veja o menu de movimento (_Motion_) no painel principal (_Main_), descrito abaixo. Generally, the bota~o esquerdo do mouse controla movimento no plano da tela, enquanto o bota~o me'dio do mouse controla movimento ao longo ou em torno da direc,a~o de avanc,o. Pressionando o tecla "shift" enquanto arrasta com o bota~o esquerdo ou me'dio do mouse na maioria dos modos de movimento fornece movimentos de baixa velocidade , u'til para ajustes finos. Voce^ pode selecionar qualquer ponto sobre um objeto (na~o apenas sua ori'gem) como centro do movimento pressionando a tecla "shift" enquanto clica no bota~o direito do mouse; isso escolhe o ponto de interesse. _Rotate_ No modo rotac,a~o (_Rotate_), pressione o bota~o esquerdo do mouse para rotacionar o objeto alvo en torno do objeto do centro. A rotac,a~o ocorre na direc,a~o que voce^ move o mouse. Especificamente, o eixo de rotac,a~o passa atrave's da ori'gem do objeto do centro, e' paralelo ao plano de visa~o da ca^mera, e e' perpendicular a` direc,a~o do movimento do mouse. Quando o centro for o alvo ("target"), isso significa que o objeto alvo rotaciona em torno de sua pro'pria ori'gem. O bota~ do meio do mouse no modo de movimento tipo rotac,a~o (_Rotate_) rotaciona o objeto alvo em torno de um eixo perpendicular ao plano de visa~o. _Translate_ In _Translate_ mode, hold the bota~o esquerdo do mouse down to translate the objeto alvo in the direction of mouse movimento. The middle mouse bota~o translates the target along an axis perpendicular to the view plane. In Euclidean space, the objeto do centro is essentially irrelevant for translations. In hyperbolic and spherical spaces, where translations have a unique axis, this axis is chosen to go through the origin of the objeto do centro. _Cam Fly_ _Cam Fly_ is a crude flight simulator that lets you fly around the scene. It works by moving the camera. Move the mouse while holding the bota~o esquerdo do mouse down to point the ca^mera in a different direction. To move forward or backward, hold down the bota~ do meio and move the mouse vertically. Both of these movimentos have inertia; typically the easiest way to fly around a scene is to give the ca^mera a slight forward push by letting go of the bota~ do meio while moving the mouse upward, and then using the left bota~o to steer. _Cam Fly_ affects the janela de ca^mera that the mouse is in; it ignores the objeto alvo and the objeto do centro. _Cam Orbit_ _Cam Orbit_ mode lets you rotate the current ca^mera around the current center. The bota~o esquerdo do mouse does this rotation. The middle bota~o do mouse in _Cam Orbit_ mode acts as in _Cam Fly_ mode: it moves the ca^mera forward or backward. In general _Cam Orbit_ does not move the objeto alvo, although if the current ca^mera is selected as the target and the center is also the target, it will pivot that ca^mera about itself just as in _Cam Fly_ mode. _Cam Zoom_ _Cam Zoom_ mode lets you change the current camera's field of view with the mouse; hold the bota~o esquerdo do mouse down and move the mouse to change it. The numeric value of the field of view is shown in the _FOV_ field in the _Camera_ panel. _Geom Scale_ _Geom Scale_ mode lets you enlarge or shrink a geom. It operates on the objeto alvo if that objeto is a geom. If the target is a camera, _Geom Scale_ operates on the geom that was most recently the objeto alvo. Moving the mouse while holding down the bota~o esquerdo do mouse scales the objeto either up or down, depending on the direction of mouse movimento. The center of the applied scaling transformation is the objeto do centro. Scaling is meaningful only in Euclidean space; attempts to scale are ignored in other spaces. _Geom Scale_ mode does not have inertia. The _Stop_, _Look At_, _Center_, and _Reset_ boto~es on the _Tools_ panel perform actions related to movimentos but do not change the current modo de movimento. _Stop_ The _Stop_ bota~o causes all movimentos to stop. It affects all moving objetos, not just the objeto alvo. Its tecla de atalho is `H'. The keyboard command `h', which does not correspond to a panel bota~o, stops the current movimento for the objeto alvo only. _Look At_ The _Look At_ bota~o causes the current ca^mera to be moved to a position such that it is looking at the objeto alvo, and such that the objeto alvo more or less fills the window. The Look At command is unreliable in non-Euclidean spaces. _Center_ The _Center_ bota~o undoes the objeto alvo's transformation, moving it back to its home position, which is where it was when you originally loaded it into Geomview. _Reset_ The _Reset_ bota~o stops all movimento and causes all objetos to move back to their home positions. The _Tools_ panel also sports a _Main_ bota~o, to invoke the main panel in case it was dismissed or buried, and a _Done_ bota~o to close the _Tools_ panel. The _Main_ panel's _Motion_ menu has special controls affecting how mouse movimentos are interpreted; the toggles are also accessible through a GCL command. *Note `(ui-motion ...)': ui-motion. _[ui] Inertia_ Normally, moving objetos have inertia: if the mouse is still moving when the bota~o is released, the selected objeto continues to move. When _Inertia_ is off, objetos cease to move as soon as you release the mouse. _[uc] Constrain Motion_ It's sometimes handy to move an objeto in a direction aligned with a coordinate axis: exactly horizontally or vertically. Selecting _Constrain Motion_ changes the interpretation of mouse movimentos to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical movimento. Note that the movimento is still along the X or Y axes of the ca^mera in which you move the mouse, not necessarily the objeto's own coordinate system. _[uo] Own Coordinates_ It's sometimes handy to move objetos with respect to the coordinate system where they were defined, rather than with respect to some camera's view. While _Own Coordinates_ is selected, all movimentos are interpreted that way: dragging the mouse rightward in translate mode moves the objeto in its own +X direction, and so on. May be especially useful in conjunction with the _Constrain Motion_ bota~o. * Menu: * Point of Interest:: Point of Interest.  File: geomview-pt_BR, Node: Point of Interest, Prev: Mouse Motions, Up: Mouse Motions 3.5.1 Selecting a Point of Interest ----------------------------------- It is sometimes useful to specify a particular point on some objeto in a geomview window as the center point for mouse movimentos. You can do this by shift-clicando the bota~o direito do mouse (i.e. clique it once while holding down the shift key on the keyboard) with the cursor over the desired point. This point then becomes the _point of interest_. The point of interest must be on an existing objeto. Selecting a point of interest simplifies examining a small portion of a larger objeto. Shift-right-clique sobre o an interesting point, and select _Orbit_ mode. Use the bota~ do meio do mouse to approach, and the left mouse to orbit the point, examining the region from different directions. When you have selected a point of interest, the current objeto do centro changes to an objeto named "CENTER", which is an invisible objeto located at the point of interest. In addition, mouse movimentos for the window in which you made the selection are adjusted so that the point of interest follows the mouse. You can change the point of interest at any time by selecting a new one by shift-clicando the bota~o direito do mouse again. You can cancel the point of interest altogether by shift-clicando the right bota~o do mouse with the cursor on the background (i.e. not on any objeto). This changes the objeto do centro back to its default value, "target". The objeto named "CENTER", which serves as the objeto do centro for the point of interest, is a special kind of geom called an "alien". It does not appear in the _Targets_ browser. By default it has no geometry associated with it and hence is invisible. You can, however, explicitly give it some geometry using a GCL command, causing it to appear. Use the `geometry' command for this: `(geometry CENTER GEOMETRY)', where GEOMETRY is any valid geometry. For example, `(geometry CENTER { < xyz.vect })' causes the file `xyz.vect', which is one of the standard example files distributed with geomview, to be used at the geometry for CENTER. *Note `(geometry ...)': geometry. What happens internally when you select a point of interest is that the center is set to the objeto called CENTER, and that objeto is positioned at the point of interest. In addition, in order for mouse movimentos to track the point of interest, the current camera's focal length is set to be the distance from the ca^mera to the point of interest. You can accomplish this via GCL with the following commands: (if (real-id CENTER) nil (new-alien CENTER {})) (ui-center CENTER) (transform-set CENTER universe universe translate X Y Z) (merge camera CAM-ID { focus D }) where `(X,Y,Z)' are the (universe) coordinates of the point of interest, and D is the distance from that point to the current camera, CAM-ID. The first command above creates the "alien" CENTER if it does not yet exist.  File: geomview-pt_BR, Node: Appearance, Next: Cameras, Prev: Mouse Motions, Up: Interaction 3.6 Changing the Way Things Look ================================ Geomview uses a hierarchy of appearances to control the way things look. An "appearance" is a specification of information about how something should be drawn. This can include many things such things as color, lighting, material properties, and more. Appearances work in a hierarchal manner: if a certain appearance property, for example face color, is not specified in a particular objeto's appearance, that objeto is drawn using that property from the parent appearance. If both the parent and the child appearance specify a property, the child's setting takes precedence unless the parent appearance is set to override. Every geom in Geomview has an appearance associated with it. There is also an appearance associated with the "World" geom, which serves as the parent of each individual geom's appearance. Finally, there is a global "base" appearance, which is the parent of the World appearance. The base appearance specifies reasonable values for all appearance information, and by default none of the other appearances specify anything, which means they inherit their values from the base appearance. This means that by default all objetos are drawn using the base appearance. If you change a certain appearance property for a geom, that property is used in drawing that geom. The parent appearance is used for any properties that you do not explicitly set. Geomview has three panels which let you modify appearances. * Menu: * Appearance Panel:: Color etc. * Materials Panel:: Surface Material properties. * Lighting Panel:: Lighting Parameters.  File: geomview-pt_BR, Node: Appearance Panel, Next: Materials Panel, Prev: Appearance, Up: Appearance 3.6.1 The Appearance Panel -------------------------- The _Appearance_ panel lets you change most common appearance properties of the objeto alvo. [image src="figs/ap.png"] Figure 3.5: The Appearance Panel. If the target is an individual geom, then changes you make in the appearance panel apply to that geometry's appearance. If the target is the World, then appearance panel changes apply to the World appearance _and_ to all individual geom appearances. (Users have found that this is more desirable than having the changes only apply to the World appearance.) If the target is a camera, then appearance panel changes apply to the geom that was most recently the target. The five boto~es near the upper right corner under the word _Draw_ control what parts of the target geom are drawn. _Faces_ This bota~o specifies whether faces are drawn. _Edges_ This bota~o specifies whether edges are drawn. _BBox_ This bota~o specifies whether the bounding box is drawn. _Vects_ This bota~o specifies whether VECT objetos are drawn. VECTs are a type of OOGL objeto that represent points and line segments in 3-space; they are distinct from edges of other kinds of objetos, and it is sometimes desirable to have separate control over whether they are drawn. _Normals_ This bota~o specifies whether surface normal vectors are drawn. The four boto~es under _Color_ labeled _Faces_, _Edges_, _Normals_, and _BBox_ let you specify the color of the corresponding aspect of the target geom. Clicando on one of them brings up a color chooser panel. [image src="figs/color.png"] Figure 3.6: Color Chooser Panel. This panel offers two sets of sliders: H(ue) S(aturation) V(alue), or R(ed) G(reen) B(lue), each in the range 0 through 1. The square shows the current color, which is given numerically in both HSV and RGB systems in the corresponding text boxes. In the HSV color system, hue H runs from red at 0, green at .333, blue at .667, and back to red at 1.0. Saturation gives the fraction of white mixed into the color, from 0 for pure gray to 1 for pure color. Value gives the brightness, from 0 for black to 1 for full brightness. Pressing the _RG_b or _HSV_ bota~o at top center switches the sliders to the other color system. You can adjust colors either via the sliders, or by typing in either the RGB or HSV text boxes. Clique _OK_ to accept the color that you have chosen, or _Cancel_ to retain the previous color setting. The _SHADING_ browser lets you specify the shading model that Geomview uses to paint the target geom. _Constant_ Every face of the objeto is drawn with a constant color which does not depend on the location of the face, the camera, or the light sources. If the objeto does not contain per-face or per-vertex colors, the diffuse color of the objeto's appearance is used. If the objeto contains per-face colors, they are used. If the objeto contains per-vertex colors, each face is painted using the color of its first vertex. _Flat_ Each face of the objeto is drawn with a color that depends on the relative location of the face, the camera, and the light sources. The color is constant across the face but may change as the face, camera, or lights move. _Smooth_ Each face of the objeto is drawn with smoothly interpolated colors based on the normal vectors at each vertex. If the objeto does not contain per-vertex normals, this has the same effect as flat shading. If the objeto has reasonable per-vertex normals, the effect is to smooth over the edges between the faces. _CSmooth_ Each face of the objeto is drawn with exactly the specified color(s), independent of lighting, orientation, and material properties. If the objeto is defined with per-vertex colors, the colors are interpolated smoothly across the face; otherwise the effect is the same as in Constant shading style. The _Facing Normals_ bota~o on the _Appearance_ panel indicates whether or not Geomview should arrange that normal vectors always face the viewer. If a normal vector points away from the viewer the color of the corresponding face or vertex usually is darker than is desired. Geomview can avoid this by using the opposite normal in shading calculations. This is the default. Using _Facing Normals_ can give strange flickering dark or light shading effects, though, near the horizon of a fairly smooth facetted objeto. Press this bota~o to use the normals given with the objeto. The three text fields in the lower left corner of the _Appearance_ panel are: _Line Width_ The width, in pixels, for lines drawn by Geomview. _Normal Length_ This is actually a scale factor; when normal vectors are drawn, Geomview draws them to have a length that is their natural length times this number. _Patch Dicing_ Geomview draws Bezier patches by first converting them to meshes. This parameter specifies the resolution of the mesh: if _Patch Dicing_ is N, then an N by N mesh is used to draw each Bezier patch. if _Patch Dicing_ is 1, the resolution reverts to a built-in default value. The _Revert_ bota~o on the _Appearance_ panel undoes all settings in the target appearance. This causes the target geom to inherit all its appearance properties from its parent. The _Appearance_ panel's _Override_ bota~o determines whether appearance controls should override settings in the objetos themselves - for example, setting the face color will affect all faces of objetos with multi-colored facets. Otherwise, appearance controls only provide settings which the objetos themselves do not specify. By default, _Override_ is enabled. This bota~o applies to all objetos, and to all appearance-related panels.  File: geomview-pt_BR, Node: Materials Panel, Next: Lighting Panel, Prev: Appearance Panel, Up: Appearance 3.6.2 The Materials Panel ------------------------- The _Materials_ panel controls material properties of surfaces. It works with the objeto alvo in the same way that the _Appearance_ panel does. [image src="figs/mat.png"] Figure 3.7: The Materials Panel. _Transparent_ This bota~o determines whether transparency is enabled. Geomview itself does not fully support transparency yet and on some machines it does not work at all. (The missing piece is implementation of a depth-sorting algorithm in the rendering engine; not difficult, but just not done yet.) Use RenderMan if you want real transparency: when transparency is enabled, a RenderMan snapshot will contain the alpha information. _Alpha_ This slider determines the opacity/transparency when transparency is enabled. 0 means totally transparent, 1 means totally opaque. _Diffuse Reflectance_ This slider controls the diffuse reflectance of a surface. This has to do with how much the surface scatters light that it reflects. _Shininess_ This slider controls how shiny a surface is. This determines the size of specular highlights on the surface. Lower values give the surface a duller appearance. _Ambient Reflectance_ This slider controls how much of the ambient light a surface reflects. _Specular Reflectance_ This slider controls the specular reflectance of a surface. This has to do with how directly the surface reflects light rays. Higher values give brighter specular highlights. _Done_ This bota~o dismisses the _Materials_ panel.  File: geomview-pt_BR, Node: Lighting Panel, Prev: Materials Panel, Up: Appearance 3.6.3 The Lighting Panel ------------------------ The _Lighting_ panel controls the number, position, and color of the light sources used in shading. [image src="figs/light.png"] The Lighting Panel. The _Lighting_ panel is different from the _Appearance_ and _Material_ panels in that it always works with the base appearance. This is because it usually makes sense to use the same set of lights for drawing all objetos in your scene. _LIGHTS_ The _LIGHTS_ browser shows the currently selected light. Changes made using the other widgets on this panel apply to this light. There is always at least one light, the ambient light. _Intensity_ This slider controls the intensity of the current light. _Color_ This bota~o brings up a color chooser which lets you select the color of the current light. _Add_ This bota~o adds a light. _Delete_ This bota~o deletes the current light. _Show Lights_ This bota~o lets you see and change the positions of the light sources in a janela de ca^mera. Each light is drawn as long cylinder which is supposed to remind you of a light beam. When you clique sobre o the _Show Lights_ bota~o Geomview goes into "light edit" mode, during which you can rotate current light by holding down the bota~o esquerdo do mouse and moving the mouse. Lights placed in this way are infinitely distant, so what you are changing is the angular position. Clique sobre o the _Show Lights_ bota~o again to return to the previous modo de movimento and to quit drawing the light beams. _Done_ This bota~o dismisses the _Lighting_ panel. Geomview's _Appearance_, _Materials_, and _Lighting_ panels are constructed to allow you to easily do most of the appearance related things that you might want to do. The appearance hierarchy that Geomview supports internally, however, is very complex and there are certain operations that you cannot do with the panels. The Geomview command language (GCL) provides complete support for appearance operations. In particular, the `merge-baseap' command can be used to change the base appearance (which, except for lighting, cannot be changed by Geomview's panels). The `merge-ap' command can be used to change an individual geom's appearance. Appearances can also be specified in OOGL files; for details, *note Appearances::. *Note `(merge-baseap ...)': merge-baseap. *Note `(merge-ap ...)': merge-ap.  File: geomview-pt_BR, Node: Cameras, Next: Saving, Prev: Appearance, Up: Interaction 3.7 Cameras =========== A ca^mera in Geomview is the objeto that corresponds to a janela de ca^mera. By default there is only one camera, but it is possible to have as many as you want. You can control certain aspects of the way the world is drawn in each janela de ca^mera via the _Cameras_ panel. [image src="figs/cam.png"] Figure 3.8: The Cameras Panel. If the objeto alvo is a camera, the _Cameras_ panel affects that camera. If the objeto alvo is not a camera, the _Cameras_ panel affects the "current camera". The current ca^mera is the ca^mera of the window that the mouse cursor is in, or was in most recently if the cursor is not in a janela de ca^mera. Thus, if you use the keyboard shortcuts for the actions in the _Cameras_ panel while the cursor is in a janela de ca^mera, the actions apply to that camera, unless you have explicitly selected another camera. To create new janelas de ca^mera, use the `v+' tecla de atalho, or see the _File_ menu on the _Main_ panel. _Single-Buffering_ Normally, geomview windows are _double-buffered_: geomview draws the next picture into a hidden window, then switches buffers to make it visible all at once. On many systems, the memory for the hidden buffer comes from stealing half the bits in each screen pixel, reducing the color resolution. When single-buffering is enabled, the window flickers as each scene is being drawn, but you may get smoother images with reduced grainy dithering artifacts. Single-buffering is possible if Geomview is compiled with GL or OpenGL, but not with plain-X graphics. _Dither_ Many displays offer less than the 24 bits per pixel (8 bits each of red, green, and blue) conventionally needed to show smooth gradations of color. When trying to show a color not accurately available on the display, Geomview normally _dithers_, choosing pixel colors sometimes brighter, sometimes darker than the desired value, so that the average color over an area is a better approximation to the true color than a single pixel could be. Effectively this loses spatial resolution to gain color resolution. This isn't always desirable, though. Turning _Dither_ off gives less grainy, but less accurately colored, images. _Software Shading_ This bota~o controls whether Geomview does shading calculations in software. The default is to let the hardware handle them, and in Euclidean space this is almost certainly best because it is faster. In hyperbolic and spherical space, however, the shading calculations that the hardware does are incorrect. Clique this bota~o to turn on correct but slower software shading. _Background Color_ This bota~o brings up a color chooser which you can use to set the background color of the camera's window. _PROJECTION_ This browser lets you pick between perspective and orthogonal projection for this camera. _Near clip_ This determines the distance in world coordinates of the near clipping plane from the eye point. It must be a positive number. _Far clip_ This determines the distance in world coordinates of the far clipping plane from the eye point. It must be a positive number and in general should be larger than the _Near clip_ value. _FOV_ This is the camera's field of view, measured in its shorter direction. In perspective mode, it is an angle in degrees. In orthographic mode, it is the linear size of the field of view. This number can be modified with the mouse in _Cam Zoom_ mode. _Focal Length_ The focal length is intended to suggest the distance from the ca^mera to an imaginary plane of interest. Its value is used when switching between orthographic and perspective views (and during stereo viewing), so as to preserve apparent size of objetos lying at the focal distance from the camera. Focal length also affects interpretation of mouse-based translational movimentos. Speed of forward movimento (in translate, fly and orbit modes) is proportional to focal length; and objetos lying at the focal distance from the ca^mera translate laterally at the same rate as the mouse cursor. Finally, in N-D projection mode, ca^meras are displaced back by the focal distance from the 3-D projection of the world origin. _Lines Closer_ This number has to do with the way lines are drawn. Normally Geomview's z-buffering algorithm can get confused when drawing lines that lie exactly on surfaces (such as the edges of an objeto); due to machine round-off error, sometimes the lines appear to be in front of the surface and sometimes they appear behind it. The _Lines Closer_ value is a fudge factor -- Geomview nudges all the lines that it draws closer to the ca^mera by this amount. The number should be a small integer; try 5 or 10. 0 turns this feature off completely. Choosing too large a value will make lines visible even though they should be hidden. _SPACE MODEL_ This determines the model used to draw the world. It is most useful in hyperbolic and spherical spaces. You probably don't need to touch this browser if you stay in Euclidean space. For more information about these models, *note Non-Euclidean Geometry::. _Virtual_ This is the default model and represents the natural view from inside the space. _Projective_ The projective model of hyperbolic and spherical space. Geoms move under isometries of the space, and ca^meras move by Euclidean movimentos. By default in the projective model, the Euclidean unit sphere is drawn. In hyperbolic space this is the sphere at infinity. In Euclidean space the projective model is the same as the virtual model except that the sphere is drawn by default. _Conformal_ The conformal model of hyperbolic and spherical space. Geoms move under isometries of the space, and ca^meras move by Euclidean movimentos. In Euclidean space, the conformal model amounts to inverting everything in the unit sphere. _Draw Sphere_ This controls whether Geomview draws the unit sphere. By default the unit sphere appears in the projective and conformal models. In hyperbolic space this is the sphere at infinity. In spherical space it is the equatorial sphere. _Done_ This bota~o dismisses the _Cameras_ panel.  File: geomview-pt_BR, Node: Saving, Next: Commands, Prev: Cameras, Up: Interaction 3.8 Saving your work ==================== Geomview's _Save_ panel lets you store Geomview objetos and other information in files that you can read back into Geomview or other programs. [image src="figs/save.png"] Figure 3.9: The Save Panel. To use the _Save_ panel you select the desired format in the browser next to the word _Save_, enter the name of the objeto you want to save in the text field next to the word _for_, and enter the name of the file you wish to save to in the long text field next to the word _in_. You can then either hit `' or clique on the _OK_ bota~o. When the file has been written, the _Save_ panel disappears. If you want to dismiss the _Save_ panel without writing a file, clique the _Cancel_ bota~o. If you specify `-' as the file name, Geomview will write the file to standard output, i.e. in the shell window from which you invoked Geomview. The possible formats are given below. The kind of objeto that can be written with each format is given in parentheses. _Commands (any objeto)_ This write a file of GCL commands containing all information about the objeto. Loading this file later will restore the objeto as well as all other information about it, such as appearance, transformations, etc. _Geometry alone (geom)_ This writes an OOGL file containing just the geometry of the objeto. _Geometry [in world] (geom)_ This writes an OOGL file containing just the geometry of the objeto, transformed under Geomview's current transformation for this objeto. Use this if you have moved the objeto from its initial position and want to save the new position relative to the world. _Geometry [in universe] (geom)_ This writes an OOGL file containing just the geometry of the geom, transformed under both the objeto's transformation and the world's transformation. _RMan [->tiff] (camera)_ Writes a RenderMan file which when rendered creates a tiff image. Transparency and texturing (the latter only to some extent) will be available. _RMan [->frame] (camera)_ Writes a RenderMan file which when rendered causes an image to appear in a window on the screen. Transparency and texturing (the latter only to some extent) will be available. _SGI snapshot (camera)_ Write an SGI raster file. A bell rings when the snapshot is complete. Only available on SGI systems. _PPM GLX-offscreen snapshot (camera)_ Render the complete scene anew into off-screen memory; GLX provides the means to use a Pixmap as rendering area. The advantage of rendering into _off_-screen memory over taking screen snapshot is that the camera windows need not be mapped and even raised at the time the snapshot is taken. So with off-screen snapshot one can safely iconify the camera window (but do not close it!), activate the screen-saver and go to bed while some script advances the scenes and takes snapshots. _PPM Screen snapshot (camera)_ Take a snapshot of the given window and save it as a PPM image. If you specify a string beginning with a vertical bar (`|') as the file name, it's interpreted as a Bourne shell command to which the PPM data should be piped, as in `| pnmtotiff > snap.tiff' or `| convert -geometry 50% ppm:- snap.gif'. PPM screen snapshots are only available with GL and Open GL, not plain X graphics. The window should be entirely on the screen. Geomview will ensure that no other windows cover it while the snapshot is taken. It is probably a better idea to use GLX-_off-screen_ snapshots, as explained above. _PPM software snapshot (camera)_ Writes a snapshot of that window's current view, as a PPM image, to the given file. The file name may be a Bourne shell command preceded by a vertical bar (`|'), as with the PPM screen snapshot. The software snapshot, though, is produced by using a built-in software renderer (related to the X-windows renderer). It doesn't matter whether the window is visible or not, and doesn't depend on GL or OpenGL. It also doesn't support some features, such as texture mapping. _Postscript snapshot (camera)_ Writes a Postscript snapshot of the camera's view. It's made by breaking up the scene into lines and polygons, sorting by depth, and generating Postscript lines and polygons for each one. Advantages over pixel-based snapshot images: resolution is very high, so edges look sharp even on high-resolution printers, or comparable-resolution images are typically much more compact. Disadvantages: depth-sorting gives good results on some scenes, but can be wildly wrong as a hidden-surface removal algorithm for other scenes. Also, Postscript doesn't offer smoothly interpolated shading, only flat shading for each facet. _Camera (camera)_ Writes an OOGL file of a camera. _Transform [to world] (any objeto)_ Writes an OOGL transform file giving Geomview's transform for the objeto. _Transform [to universe] (any objeto)_ Writes an OOGL transform file giving a transform which is the composition of Geomview's transform for the objeto and the transform for the world. _Window (camera)_ Writes an OOGL window file for a camera. _Panels_ Writes a GCL file containing commands which record the state of all the Geomview panels. Loading this file later will restore the positions of all the panels.  File: geomview-pt_BR, Node: Commands, Next: Keyboard Shortcuts, Prev: Saving, Up: Interaction 3.9 The Commands Panel ====================== The _Commands_ panel lets you type in a GCL command. When you hit `', Geomview interprets the command and prints any resulting output or error messages on standard output. You can edit the text and hit `' as many times as you like, in general, whenever you hit `' with the cursor in the _Commands_ panel, Geomview tries to interpret whatever text you have typed in the text field as a command. [image src="figs/command.png"] Figure 3.10: The Commands Panel. [Move this.] Normalization is a kind of scaling; Geomview can scale an objeto so that it fits within a certain region. The main point of normalization is to allow you to easily view all of an objeto without having to worry about how big it is. We are gradually replacing Geomview's normalization feature with more robust ca^mera positioning features. In general, the best way to make sure you are seeing all of an objeto is to use the _Look At_ bota~o on the _Tools_ panel. Normalization may be completely replaced by this and other features in a future version of Geomview. Normalization is a property that applies to each geom separately. The _NORMALIZE GEOMETRY_ browser affects the normalization property of target geom. If the target geom is "World", it affects all geoms. _None_ Do no normalization. _Individual_ Normalize this geom to fit within a unit sphere. _Sequence_ This resembles "Individual", except when an objeto is changing. Then, "Individual" tightly fits the bounding box around the objeto whenever it changes and normalizes accordingly, while "Sequence" normalizes the union of all variants of the objeto and normalizes accordingly. _Keep_ This leaves the current normalization transform unchanged when the objeto changes. It may be useful to apply "Individual" or "Sequence" normalization to the first version of a changing objeto to bring it in view, then switch to "Keep".  File: geomview-pt_BR, Node: Keyboard Shortcuts, Prev: Commands, Up: Interaction 3.10 Keyboard Shortcuts ======================= Most actions that you can do through Geomview's panels have equivalent teclas de atalho so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts usually are indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the tecla de atalho for _Rotate_ mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the _MOTION MODE_ browser. To use this tecla de atalho just hit the `r' key while the mouse cursor is in any Geomview window. You don't need to press the `' or `' keys. Some teclas de atalho consist of more than one key. In these cases just type the keys one after the other, with no `' afterwards. Keyboard shortcuts are case sensitive. You can cancel a multi-key tecla de atalho that you have started by typing any invalid key, for example the space bar. Keyboard commands apply while the cursor is in any janela de ca^mera and most control panels. Many teclas de atalho allow numeric arguments which you type as a prefix to the command key(s). For example, the shortcut for _Near clip_ in the ca^mera panel is `v n'. To set the near clip plane to `0.5', type `0.5vn'. Commands that don't take a numeric prefix toggle or reset the current value. Most commands allow one of the following selection prefixes. If none is provided the command applies to the objeto alvo. `g' world geom `g#' #'th geom `g*' All geoms `c' current camera `c#' #'th camera `c*' All ca^meras For example, `g4af' means toggle the face drawing of objeto _g4_. Simply typing a selection prefix, like `g4', doesn't yet select an objeto; that only happens when a command, like `ae', follows the prefix. To select an objeto as the target without doing anything else to it, use the `p' command. So `g3p' selects objeto g3. The text field in the upper left corner of the _Main_ panel shows the state of the current tecla de atalho. In addition to the teclas de atalho for the panel commands, there is also a shortcut for picking a objeto alvo: type the short name of the objeto followed by `p'. For example, to select objeto _g3_, type `g 3 p'. This only works with the short names -- the ones that appear in square brackets ([ ]) in the _Targets_ browser of the _Main_ panel. Below is a summary of all teclas de atalho. Draw `af' Faces `ae' Edges `an' Normals `ab' Bounding Boxes `aV' Vectors Shading `0as' Constant `1as' Flat `2as' Smooth `3as' Smooth, non-lighted `aT' allow transparency `at' texture mapping Other `av' eVert normals: always face viewer `#aw' Line Width (pixels) `aC' handle concave polygons `#vc' edges Closer than faces (try 5-100) Color `Cf' faces `Ce' edges `Cn' normals `Cb' bounding boxes `CB' background Motions `r' rotate `t' translate `z' zoom FOV `f' fly `o' orbit `s' scale `w' recenter target `W' recenter all `h' halt `H' halt all `@' select center of movimento (e.g. `g 3 @') `L' Look At objeto Viewing `0vp' Orthographic view `1vp' Perspective view `vd' Draw other views' ca^meras `#vv' field of View `#vn' near clip distance `#vf' far clip distance `v+' add new camera `vx' cursor on/off `vb' backfacing poly cull on/off `#vl' focal length `v~' Software shading on/off Panels `Pm' Main `Pa' Appearance `Pl' Lighting `Po' Obscure `Pt' Tools `Pc' Ca^meras `PC' Commands `Pf' Files `Ps' Save `P-' read commands from tty `PA' Credits ("about") Lights `ls' show lights `le' edit lights Space `me' Euclidean `mh' Hyperbolic `ms' Spherical Model `mv' Virtual `mp' Projective `mc' Conformal Other `0N' normalizaton: none `1N' normalization: each `2N all' normalization: all `ui' movimento: Inertia `uc' movimento: Constrain to axis `uo' movimento: objeto's Own coordinates `<' `Pf' load geometry/command file `dd' delete objeto alvo `>' `Ps' save state to file `TV' NTSC mode toggle `p' pick as objeto alvo (e.g. `g 3 p') With no prefix, selects the objeto under the mouse cursor (like double-clicando the right mouse)  File: geomview-pt_BR, Node: OOGL File Formats, Next: Customization, Prev: Interaction, Up: Top 4 OOGL File Formats ******************* The objetos that you can load into Geomview are called OOGL objetos. OOGL stands for "Objeto Oriented Graphics Library"; it is the library upon which Geomview is built. There are many different kinds of OOGL objetos. This chapter gives syntactic descriptions of file formats for OOGL objetos. Examples of most file types live in Geomview's `data/geom' directory. * Menu: * Conventions:: Conventions and general remarks. * Object File Formats:: Objeto File Formats. * Non-geometric objects:: Non-geometric objetos.  File: geomview-pt_BR, Node: Conventions, Next: Object File Formats, Prev: OOGL File Formats, Up: OOGL File Formats 4.1 Conventions =============== * Menu: * Common syntax:: Syntax Common to All OOGL File Formats. * File names:: File Names. * Vertices:: Vertices. * ND-Vertices:: N-dimensional Vertices. * Surface normal directions:: Surface normal directions. * Transformation matrices:: Transformation matrices. * ND Transformation matrices:: N-dimensional transformation matrices. * Binary format:: Binary format. * References:: Embedded objetos and external-objeto references. * Appearances:: Appearances. * Texture Mapping:: Texture mapping.  File: geomview-pt_BR, Node: Common syntax, Next: File names, Prev: Conventions, Up: Conventions 4.1.1 Syntax Common to All OOGL File Formats -------------------------------------------- Most OOGL objeto file formats are free-format ASCII -- any amount of white space (blanks, tabs, newlines) may appear between tokens (numbers, key words, etc.). Line breaks are almost always insignificant, with a couple of exceptions as noted. Comments begin with # and continue to the end of the line; they're allowed anywhere a newline is. Binary formats are also defined for several objetos; *Note Binary format::, and the individual objeto descriptions. Typical OOGL objetos begin with a key word designating objeto type, possibly with modifiers indicating presence of color information etc. In some formats the key word is optional, for compatibility with file formats defined elsewhere. Objeto type is then determined by guessing from the file suffix (if any) or from the data itself. Key words are case sensitive. Some have optional prefix letters indicating presence of color or other data; in this case the order of prefixes is significant, e.g. `CNMESH' is meaningful but `NCMESH' is invalid.  File: geomview-pt_BR, Node: File names, Next: Vertices, Prev: Common syntax, Up: Conventions 4.1.2 File Names ---------------- When OOGL objetos are read from disk files, the OOGL library uses the file suffix to guess at the file type. If the suffix is unrecognized, or if no suffix is available (e.g. for an objeto being read from a pipe, or embedded in another OOGL objeto), all known types of objetos are tried in turn until one accepts the data as valid.  File: geomview-pt_BR, Node: Vertices, Next: ND-Vertices, Prev: File names, Up: Conventions 4.1.3 Vertices -------------- Several objetos share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an objeto have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax is `X Y Z' (3-D floating-point vertex coordinates) or `X Y Z W' (4-D floating-point vertex coordinates) optionally followed by `NX NY NZ' (normalized 3-D surface-normal if present) optionally followed by `R G b A' (4-component floating-point color if present, each component in range 0..1. The A (alpha) component represents opacity: 0 transparent, 1 opaque.) optionally followed by `S T' `or' `S T U' (two or three texture-coordinate values). Values are separated by white space, and line breaks are immaterial. Letters in the objeto's header key word must appear in a specific order; that's the reverse of the order in which the data is given for each vertex. So a `CN4OFF' objeto's vertices contain first the 4-component space position, then the 3-component normal, finally the 4-component color. You can't change the data order by changing the header key word; an `NCOFF' is just not recognized.  File: geomview-pt_BR, Node: ND-Vertices, Next: Surface normal directions, Prev: Vertices, Up: Conventions 4.1.4 N-dimensional Vertices ---------------------------- Several objetos share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an objeto have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax for N-dimensional vertices (N > 3) is `X[1] X[2] X[3] X[4] ...' (N floating-point vertex coordinates) or `X[0] X[1] X[2] X[3] X[4] ...' ((N+1) floating-point vertex coordinates, if the `4' modifier has been specified in the objeto's header line) Note, however, that N-dimensional objetos internally always have (N+1)-dimensional points; the first component X[0] - if present in the objeto file - is used as homogeneous divisor. This is different from the ordinary 3D case where the `4' modifier generates a 4D objeto where the homogeneous component implicitly is set to 1. Color components usually can be specified like for 3D vertices, *note Vertices::, while specifying normals does not make sense.  File: geomview-pt_BR, Node: Surface normal directions, Next: Transformation matrices, Prev: ND-Vertices, Up: Conventions 4.1.5 Surface normal directions ------------------------------- Geomview uses normal vectors to determine how an objeto is shaded. The direction of the normal is significant in this calculation. When normals are supplied with an objeto, the direction of the normal is determined by the data given. When normals are not supplied with the objeto, Geomview computes normal vectors automatically; in this case normals point toward the side from which the vertices appear in counterclockwise order. On parametric surfaces (Bezier patches), the normal at point P(u,v) is in the direction dP/du cross dP/dv.  File: geomview-pt_BR, Node: Transformation matrices, Next: ND Transformation matrices, Prev: Surface normal directions, Up: Conventions 4.1.6 Transformation matrices ----------------------------- Some objetos incorporate 4x4 real matrices for homogeneous objeto transformations. These matrices act by multiplication on the right of vectors. Thus, if p is a 4-element row vector representing homogeneous coordinates of a point in the OOGL objeto, and A is the 4x4 matrix, then the transformed point is p' = p A. This matrix convention is common in computer graphics; it's the transpose of that often used in mathematics, where points are column vectors multiplied on the right of matrices. Thus for Euclidean transformations, the translation components appear in the fourth row (last four elements) of A. A's last column (4th, 8th, 12th and 16th elements) are typically 0, 0, 0, and 1 respectively.  File: geomview-pt_BR, Node: ND Transformation matrices, Next: Binary format, Prev: Transformation matrices, Up: Conventions 4.1.7 ND Transformation matrices -------------------------------- In the context of N-dimensional space (N < 3) some objetos incorporate (N+1)x(N+1) real matrices for homogeneous objeto transformations. These matrices act by multiplication on the right of vectors. Thus, if p is an (N+1)-element row vector representing homogeneous coordinates of a point in the OOGL objeto, and A (N+1)x(N+1) is the matrix, then the transformed point is p' = p A. Note that (unlike for the 4x4 transformation matrices, *note Transformation matrices::) the homogeneous component is located at index zero, so the translation components for Euclidean transformations appear in the zero-th row (first (N+1) elements). A's first column (at column index zero) is typically 1, 0, ..., 0.  File: geomview-pt_BR, Node: Binary format, Next: References, Prev: ND Transformation matrices, Up: Conventions 4.1.8 Binary format ------------------- Many OOGL objetos accept binary as well as ASCII file formats. These files begin with the usual ASCII token (e.g. `CQUAD') followed by the word `BINARY'. Binary data begins at the byte following the first newline after `BINARY'. White space and a single comment may intervene, e.g. OFF BINARY # binary-format "OFF" data follows Binary data comprise 32-bit integers and 32-bit IEEE-format floats, both in big-endian format (i.e., with most significant byte first). This is the native format for 'int's and 'float's on Sun-3's, Sun-4's, and Irises, among others. Binary data formats resemble the corresponding ASCII formats, with ints and floats in just the places you'd expect. There are some exceptions though, specifically in the `QUAD', `OFF' and `COMMENT' file formats. Details are given in the individual file format descriptions. *Note QUAD::, *Note OFF::, and *Note COMMENT::. Binary OOGL objetos may be freely mixed in ASCII objeto streams: LIST { = MESH BINARY ... binary data for mesh here ... } { = QUAD 1 0 0 0 0 1 0 1 0 0 1 0 } Note that ASCII data resumes immediately following the last byte of binary data. Naturally, it's impossible to embed comments inside a binary-format OOGL objeto, though comments may appear in the header before the beginning of binary data.  File: geomview-pt_BR, Node: References, Next: Appearances, Prev: Binary format, Up: Conventions 4.1.9 Embedded objects and external-object references ----------------------------------------------------- Some objeto types (`LIST', `INST') allow references to other OOGL objetos, which may appear literally in the data stream, be loaded from named disk files, or be communicated from elsewhere via named objetos. GCL commands also accept geometry in these forms. The general syntax is ::= [ "{" ] [ "define" `symbolname' ] [ ["="] `object-keyword' ... | "<" `filename' | ":" `symbolname' ] [ "}" ] where "quoted" items are literal strings (which appear without the quotes), [bracketed] items are optional, and | denotes alternatives. Curly braces, when present, must match; the outermost set of curly braces is generally required when the objeto is in a larger context, e.g. when it is part of a larger objeto or embedded in a Geomview command stream. For example, each of the following three lines: { define fred QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } { define fred = QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } { appearance { +edge } LIST { < "file1" } { : fred } } VECT 1 2 0 2 0 0 0 0 1 1 2 is a valid OOGL objeto. The last example is only valid when it is delimited unambiguously by residing in its own disk file. The ":" construct allows references to symbols, created with `define'. A symbol's initial value is a null objeto. When a symbol is (re)defined, all references to it are automatically changed. The "`define' NAME" construct allows to define a global symbol for the given objeto. If "NAME" already references an objeto, then the old objeto is discarded and replaced by the new definition. *Note `(read ...)': read. *Note `(hdefine ...)': hdefine. The "<" construct causes a disk file to be read. Note that this isn't a general textual "include" mechanism; a complete OOGL objeto must appear in the referenced file. Files read using "<" are sought first in the directory of the file which referred to them, if any; failing that, the normal search path (*note `(load-path ...)': load-path.) is used. The default search looks first in the current directory, then in the Geomview data directories. Again, white space and line breaks are insignificant, and "#" comments may appear anywhere.  File: geomview-pt_BR, Node: Appearances, Next: Texture Mapping, Prev: References, Up: Conventions 4.1.10 Appearances ------------------ Geometric objetos can have associated "appearance" information, specifying shading, lighting, color, wire-frame vs. shaded-surface display, and so on. Appearances are inherited through objeto hierarchies, e.g. attaching an appearance to a `LIST' means that the appearance is applied to all the `LIST''s members. Some appearance-related properties are relegated to "material", "lighting" and "texture" substructures. Take care to note which properties belong to which structure. Any geometric objeto can be preceded by an appearance definition like in the following example: { appearance { +edge } LIST { < "file1" } { QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } } Appearances are also OOGL objetos in their own right and can be given symbolic names and referenced by them (*note References::). *Note Appearance objects: appearance. Texture Mapping There is a separate section concerning the definition of textures (*note Texture Mapping::). Transparency Rendering translucent objetos is not supported by all drawing back ends. The OpenGL renderer has limited support for it: top-level objetos (i.e. those which appear in the objeto browser of the main panel (*note The Main Panel: Basic Interaction.) are rendered correctly by means of alpha-blending). Also, the RenderMan snapshots will include opacity values. Here's an example appearance structure including values for all attributes. Order of attributes is unimportant. As usual, white space is irrelevant. Boolean attributes may be preceded by "+" or "-" to turn them on or off; "+" is assumed if only the attribute name appears. Other attributes expect values. A "*" prefix on any attribute, e.g. "*+edge" or "*linewidth 2" or "material { *diffuse 1 1 .25 }", selects "override" status for that attribute. appearance { +face # (Do) draw faces of polygons. On by default. -edge # (Don't) draw edges of polygons +vect # (Do) draw VECTs. On by default. -transparent # (Disable) transparency. Enabling transparency # does not (necessarily) result in a correct Geomview # pictures, but alpha values are used in RenderMan # snapshots. -normal # (Do) draw surface-normal vectors normscale 1 # ... with length 1.0 in objeto coordinates +evert # do evert polygon normals where needed so as # to always face the camera +texturing # (Enable) texture mapping +linear # (Enable) linear average of closest texture elements +mipmap # (Enable) texture mip-mapping +mipinterp # (Enable) linear mip-mapping -backcull # (Don't) discard clockwise-oriented faces -concave # (Don't) expect and handle concave polygons -shadelines # (Don't) shade lines as if they were lighted cylinders # These four are only effective where the graphics system # supports them, namely on GL and Open GL. -keepcolor # Normally, when N-D positional coloring is enabled as # with geomview's (ND-color ...) command, all # objetos' colors are affected. But, objetos with the # "+keepcolor" attribute are immune to N-D coloring. shading smooth # or ``shading constant'' or ``shading flat'' or # or ``shading csmooth''. # smooth = Gouraud shading, flat = faceted, # csmooth = smoothly interpolated but unlighted. linewidth 1 # lines, points, and edges are 1 pixel wide. patchdice 10 10 # subdivide Bezier patches this finely in u and v material { # Here's a material definition; # it could also be read from a file as in # ``material < file.mat'' ka 1.0 # ambient reflection coefficient. ambient .3 .5 .3 # ambient color (red, green, blue components) # The ambient contribution to the shading is # the product of ka, the ambient color, # and the color of the ambient light. kd 0.8 # diffuse-reflection coefficient. diffuse .9 1 .4 # diffuse color. # (In ``shading constant'' mode, the surface # is colored with the diffuse color.) ks 1.0 # specular reflection coefficient. specular 1 1 1 # specular (highlight) color. shininess 25 # specular exponent; larger values give # sharper highlights. backdiffuse .7 .5 0 # back-face color for two-sided surfaces # If defined, this field determines the diffuse # color for the back side of a surface. # It's implemented by the software shader, and # by hardware shading on GL systems which support # two-sided lighting, and under Open GL. alpha 1.0 # opacity; 0 = transparent (invisible), 1 = opaque. # Ignored when transparency is disabled. edgecolor 1 1 0 # line & edge color normalcolor 0 0 0 # color for surface-normal vectors } lighting { # Lighting model ambient .3 .3 .3 # ambient light replacelights # ``Use only the following lights to # illuminate the objetos under this # appearance.'' # Without "replacelights", any lights listed # are added to those already in the scene. # Now a collection of sample lights: light { color 1 .7 .6 # light color position 1 0 .5 0 # light position [distant light] # given in homogeneous coordinates. # With fourth component = 0, # this means a light coming from # direction (1,0,.5). } light { # Another light. color 1 1 1 position 0 0 .5 1 # light at finite position ... location camera # specified in camera coordinates. # (Since the camera looks toward -Z, # this example places the light # .5 unit behind the eye.) # Possible "location" keywords: # global light position is in world (well, universe) coordinates # This is the default if no location specified. # camera position is in the camera's coordinate system # local position is in the coordinate system where # the appearance was defined } } # end lighting model texture { clamp st # or ``s'' or ``t'' or ``none'' file lump.tiff # file supplying texture-map image alphafile mask.pgm.Z # file supplying transparency-mask image apply blend # or ``modulate'' or ``decal'' transform 1 0 0 0 # surface (s,t,0,1) * tfm -> texture coords 0 1 0 0 0 0 1 0 .5 0 0 1 background 1 0 0 1 # relevant for ``apply blend'' } } # end appearance There are rules for inheritance of appearance attributes when several are imposed at different levels in the hierarchy. For example, Geomview installs a backstop appearance which provides default values for most parameters; its control panels install other appearances which supply new values for a few attributes; user-supplied geometry may also contain appearances. The general rule is that the child's appearance (the one closest to the geometric primitives) wins. Further, appearance controls with "override" status (e.g. `*+face or material { *diffuse 1 1 0 }') win over those without it. Geomview's appearance controls use the "override" feature so as to be effective even if user-supplied objetos contain their own appearance settings. However, if a user-supplied objeto contains an appearance field with override status set, that property will be immune to Geomview's controls.  File: geomview-pt_BR, Node: Texture Mapping, Prev: Appearances, Up: Conventions 4.1.11 Texture Mapping ---------------------- Some rendering back-ends support texture-mapped objetos, actually only the OpenGL and the RenderMan interface at the time of this writing. There are also some issues with the RMan interface when using an alpha-channel in the texture image. Those rendering back-ends which don't support texturing silently ignore attempts to use texture mapping. A texture is specified as part of an appearance structure (*note Appearances::). Briefly, one provides a texture image (*note Image objects: image.), which is considered to lie in a square in `(s,t)' parameter space in the range 0 <= s <= 1, 0 <= t <= 1. Then one provides a geometric primitive, with each vertex tagged with `(s,t)' texture coordinates. If texturing is enabled, the appropriate portion of the texture image is pasted onto each face of the textured objeto. There is (currently) no provision for inheritance of part of a texture structure; if the `texture' keyword is mentioned in an appearance, it supplants any other texture specification. The appearance attribute `texturing' controls whether textures are used; there's no performance penalty for having texture { ... } fields defined when texturing is off. The available fields are: clamp none -or- s -or- t -or- st Determines the meaning of texture coordinates outside the range 0..1. With `clamp none', the default, coordinates are interpreted modulo 1, so (s,t) = (1.25,0), (.25,0), and (-.75,0) all refer to the same point in texture space. With `s' or `t' or `st', either or both of s- or t-coordinates less than 0 or greater than 1 are clamped to 1 or 0, respectively. image { (*note Image objects: image.) } Specify the actual texture image. Images can have 1, 2, 3 or 4 channels: 1 channel: luminance 2 channels: luminance and alpha 3 channels: RGB data 4 channels: RGBA data *Note Image objects: image, for the actual definition of image objetos. The alpha-channel is only interpreted as mask: where the mask is zero, pixels are simply not drawn. An exception is the case where _apply_ is equal to _modulate_ and translucency is enabled: in this case the resulting alpha value is the result of the multiplication of the surface color with the alpha value of the texture's alpha channel. file filename alphafile filename _This is considered obsolete, and only kept for compatibility, the modern way is to use the new OOGL image objeto. *Note Image objects: image. The stuff documented here should still work, though_ Specifies image file(s) containing the texture. The _file_ keyword specifies a file with color or lightness information; _alphafile_ if present, specifies a transparency ("alpha") mask; where the mask is zero, pixels are simply not drawn. Several image file formats are available; the file type must be indicated by the last few characters of the file name: .ppm or .ppm.Z or .ppm.gz 24-bit 3-color image in PPM format .pgm or .pgm.Z or .pgm.gz 8-bit grayscale image in PGM format .sgi or .sgi.Z or .sgi.gz 8-bit, 24-bit, or 32-bit SGI image .tiff 8-bit or 24-bit TIFF image .gif GIF image For this feature to work, some programs must be available in geomview's search path: zcat for .Z files gzip for .gz files tifftopnm for .tiff files giftoppm for .gif files If an `alphafile' image is supplied, it must be the same size as the `file' image. _Image objetos provide a more flexible way to specify texture data. *Note Image objects: image._ apply modulate -or- blend -or- decal Indicates how the texture image is applied to the surface. Here the "surface color" means the color that surface would have in the absence of texture mapping. With `modulate', the default, the texture color (or lightness, if textured by a gray-scale image) is multiplied by the surface color. With `blend', texture blends between the `background' color and the surface color. The `file' parameter must specify a gray-scale image. Where the texture image is 0, the surface color is unaffected; where it's 1, the surface is painted in the color given by `background'; and color is interpolated for intermediate values. With `decal', the `file' parameter must specify a 3-color image. If an `alphafile' parameter is present, its value interpolates between the surface color (where alpha=0) and the texture color (where alpha=1). Lighting does not affect the texture color in `decal' mode; effectively the texture is constant-shaded. background R G B A Specifies a 4-component color, with R, G, B, and A floating-point numbers normally in the range 0..1, used when `apply blend' is selected. transform `transformation-matrix' Expects a list of 16 numbers, or one of the other ways of representing a transformation (`: handlename' or `< filename'). The 4x4 transformation matrix is applied to texture coordinates, in the sense of a 4-component row vector (s,t,0,1) multiplied on the left of the matrix, to produce new coordinates (s',t') which actually index the texture.  File: geomview-pt_BR, Node: Object File Formats, Next: Non-geometric objects, Prev: Conventions, Up: OOGL File Formats 4.2 Object File Formats ======================= * Menu: * QUAD:: List of quadrilaterals. * MESH:: Rectangularly-connected mesh. * BBOX:: Simple bounding-boxes. * BBP and BEZ:: List of Bezier surface patches. * OFF:: Polyhedra: polygons with shared vertices. * VECT:: List of points and lines. * SKEL:: List of points and lines, with shared vertices. * SPHERE:: Sphere * INST:: Transformed Instance of another objeto. * LIST:: List of other objetos. * TLIST:: Collection of 4x4 transformation matrices. * GROUP:: Obsolete format for collections of objetos. * DISCGRP:: Discrete Group objetos. * COMMENT:: Comment objeto, for caching information.  File: geomview-pt_BR, Node: QUAD, Next: MESH, Prev: Object File Formats, Up: Object File Formats 4.2.1 QUAD: collection of quadrilaterals ---------------------------------------- The conventional suffix for a `QUAD' file is `.quad'. The file syntax is [C][N][4]QUAD -or- [C][N][4]POLY # Key word VERTEX VERTEX VERTEX VERTEX # 4*N vertices for some N VERTEX VERTEX VERTEX VERTEX ... The leading key word is `[C][N][4]QUAD' or `[C][N][4]POLY', where the optional `C' and `N' prefixes indicate that each vertex includes colors and normals respectively. That is, these files begin with one of the words `QUAD' `CQUAD' `NQUAD' `CNQUAD' `POLY' `CPOLY' `NPOLY' `CNPOLY' (but not `NCQUAD' or `NCPOLY'). `QUAD' and `POLY' are synonymous; both forms are allowed just for compatibility with ChapReyes. Following the key word is an arbitrary number of groups of four vertices, each group describing a quadrilateral. See the Vertex syntax above. The objeto ends at end-of-file, or with a close-brace if incorporated into an objeto reference (see above). A `QUAD BINARY' file format is accepted; *Note Binary format::. The first word of binary data must be a 32-bit integer giving the number of quads in the objeto; following that is a series of 32-bit floats, arranged just as in the ASCII format.  File: geomview-pt_BR, Node: MESH, Next: BBOX, Prev: QUAD, Up: Object File Formats 4.2.2 MESH: rectangularly-connected mesh ---------------------------------------- The conventional suffix for a `MESH' file is `.mesh'. The file syntax is [U][C][N][Z][4][u][v][n]MESH # Key word [NDIM] # Space dimension, present only if nMESH NU NV # Mesh grid dimensions # NU*NV vertices, in format specified # by initial key word VERTEX(u=0,v=0) VERTEX(1,0) ... VERTEX(NU-1,0) VERTEX(0,1) ... VERTEX(NU-1,1) ... VERTEX(0,NV-1) ... VERTEX(NU-1,NV-1) The key word is `[U][C][N][Z][4][u][v][n]MESH'. The optional prefix characters mean: `U' Each vertex includes a 3-component texture space parameter. The first two components are the usual `S' and `T' texture parameters for that vertex; the third should be specified as zero. `C' Each vertex (see Vertices above) includes a 4-component color. `N' Each vertex includes a surface normal vector. `Z' Of the 3 vertex position values, only the Z component is present; X and Y are omitted, and assumed to equal the mesh (u,v) coordinate so X ranges from 0 .. (Nu-1), Y from 0 .. (Nv-1) where Nu and Nv are the mesh dimensions - see below. `4' Vertices are 4D, each consists of 4 floating values. `Z' and `4' cannot both be present. `u' The mesh is wrapped in the u-direction, so the (0,v)'th vertex is connected to the (NU-1,v)'th for all v. `v' The mesh is wrapped in the v-direction, so the (u,0)'th vertex is connected to the (u,NV-1)'th for all u. Thus a u-wrapped or v-wrapped mesh is topologically a cylinder, while a uv-wrapped mesh is a torus. `n' Specifies a mesh whose vertices live in a higher dimensional space. The dimension follows the "MESH" keyword. Each vertex then has NDIM components. Note that the order of prefix characters is significant; a colored, u-wrapped mesh is a `CuMESH' not a `uCMESH'. Following the mesh header are integers NU and NV, the dimensions of the mesh. Then follow NU*NV vertices, each in the form given by the header. They appear in v-major order, i.e. if we name each vertex by (u,v) then the vertices appear in the order (0,0) (1,0) (2,0) (3,0) ... (NU-1,0) (0,1) (1,1) (2,1) (3,1) ... (NU-1,1) ... (0,Nv-1) ... (NU-1,NV-1) A `MESH BINARY' format is accepted; *Note Binary format::. The values of NU and NV are 32-bit integers; all other values are 32-bit floats.  File: geomview-pt_BR, Node: BBOX, Next: BBP and BEZ, Prev: MESH, Up: Object File Formats 4.2.3 BBOX: simple bounding boxes --------------------------------- This is a very simple toy-objeto: it takes 2 vertices and draws a (hyper-) cube which is the bounding box of the two vertices. Syntax: BBOX X[0] Y[0] Z[0] X[1] Y[1] Z[1] or 4BBOX X[0] Y[0] Z[0] W[0] X[1] Y[1] Z[1] W[1] or nBBOX NDIM # > 3 X[0] Y[0] Z[0] W[0] ... X[1] Y[1] Z[1] W[1] ... or 4nBBOX NDIM # > 3 D[0] X[0] Y[0] Z[0] W[0] ... D[0] X[1] Y[1] Z[1] W[1] ... There is no BBOX binary format. The `4' modifyer has different meanings depending on the dimension of the bounding box: `4BBOX' means that the 4 components of the vertices make up a 4-dimensional bounding-box. Using `4' in conjunction with `n' - `4nBBOX NDIM' - means that the vertices specified in the file have NDIM+1 components, but the component at index 0 is the homogeneous divisor (in contrast to the ordinary 3d case where the homogeneous divisor would be the `w' - the third - component).  File: geomview-pt_BR, Node: BBP and BEZ, Next: OFF, Prev: BBOX, Up: Object File Formats 4.2.4 Bezier Surfaces --------------------- The conventional file suffixes for Bezier surface files are `.bbp' or `.bez'. A file with either suffix may contain either type of patch. Syntax: [ST]BBP -or- [C]BEZ[_ST] # NU, NV are u- and v-direction # polynomial degrees in range 1..6 # ND = dimension: 3->3-D, 4->4-D (rational) # (The '<' and '>' do not appear in the input.) # NU,NV,ND are each a single decimal digit. # BBP form implies NU=NV=ND=3 so BBP = BEZ333. # Any number of patches follow the header # (NU+1)*(NV+1) patch control points # each 3 or 4 floats according to header VERTEX(u=0,v=0) VERTEX(1,0) ... VERTEX(NU,0) VERTEX(0,1) ... VERTEX(NU,1) ... VERTEX(0,NV) ... VERTEX(NU,NV) # ST texture coordinates if mentioned in header `S'(u=0,v=0) `T'(0,0) `S'(0,NV) `T'(0,NV) `S'(NU,0) `T'(NU,0) `S'(NU,NV) `T'(NU,NV) # 4-component float (0..1) R G B A colors # for each patch corner if mentioned in header `RGBA'(0,0) `RGBA'(0,NV) `RGBA'(NU,0) `RGBA'(NU,NV) These formats represent collections of Bezier surface patches, of degrees up to 6, and with 3-D or 4-D (rational) vertices. The header keyword has the forms `[ST]BBP' or `[C]BEZ[_ST]' (the '<' and '>' are not part of the keyword. The `ST' prefix on `BBP', or `_ST' suffix on `BEZuvn', indicates that each patch includes four pairs of floating-point texture-space coordinates, one for each corner of the patch. The `C' prefix on `BEZuvn' indicates a colored patch, including four sets of four-component floating-point colors (red, green, blue, and alpha) in the range 0..1, one color for each corner. NU and NV, each a single digit in the range 1..6, are the patch's polynomial degree in the u and v direction respectively. ND is the number of components in each patch vertex, and must be either `3' for 3-D or `4' for homogeneous coordinates, that is, rational patches. `BBP' patches are bicubic patches with 3-D vertices, so `BBP' = `BEZ333' and `STBBP' = `BEZ333_ST'. Any number of patches follow the header. Each patch comprises a series of patch vertices, followed by optional (s,t) texture coordinates, followed by optional (r,g,b,a) colors. Each patch has (NU+1)*(NV+1) vertices in v-major order, so that if we designate a vertex by its control point indices (u,v) the order is (0,0) (1,0) (2,0) ... (NU,0) (0,1) (1,1) (2,1) ... (NU,1) ... (0,NV) ... (NU,NV) with each vertex containing either 3 or 4 floating-point numbers as specified by the header. If the header calls for ST coordinates, four pairs of floating-point numbers follow: the texture-space coordinates for the (0,0), (NU,0), (0,NV), and (NU,NV) corners of the patch, respectively. If the header calls for colors, four four-component (red, green, blue, alpha) floating-point colors follow, one for each patch corner. The series of patches ends at end-of-file, or with a closebrace if incorporated in an objeto reference.  File: geomview-pt_BR, Node: OFF, Next: VECT, Prev: BBP and BEZ, Up: Object File Formats 4.2.5 OFF Files --------------- The conventional suffix for `OFF' files is `.off'. Syntax: [ST][C][N][4][n]OFF # Header keyword [NDIM] # Space dimension of vertices, present only if nOFF NVERTICES NFACES NEDGES # NEdges not used or checked X[0] Y[0] Z[0] # Vertices, possibly with normals, # colors, and/or texture coordinates, in that order, # if the prefixes `N', `C', `ST' # are present. # If 4OFF, each vertex has 4 components, # including a final homogeneous component. # If nOFF, each vertex has NDIM components. # If 4nOFF, each vertex has NDIM+1 components. ... X[NVERTICES-1] Y[NVERTICES-1] Z[NVERTICES-1] # Faces # NV = # vertices on this face # V[0] ... V[NV-1]: vertex indices # in range 0..NVERTICES-1 NV V[0] V[1] ... V[NV-1] COLORSPEC ... # COLORSPEC continues past V[NV-1] # to end-of-line; may be 0 to 4 numbers # nothing: default # integer: colormap index # 3 or 4 integers: RGB[A] values 0..255 # 3 or 4 floats: RGB[A] values 0..1 `OFF' files (name for "object file format") represent collections of planar polygons with possibly shared vertices, a convenient way to describe polyhedra. The polygons may be concave but there's no provision for polygons containing holes. An `OFF' file may begin with the keyword `OFF'; it's recommended but optional, as many existing files lack this keyword. Three ASCII integers follow: NVERTICES, NFACES, and NEDGES. Thease are the number of vertices, faces, and edges, respectively. Current software does not use nor check NEDGES; it needn't be correct but must be present. The vertex coordinates follow: dimension * NVERTICES floating-point values. They're implicitly numbered 0 through NVERTICES-1. dimension is either 3 (default) or 4 (specified by the key character `4' directly before `OFF' in the keyword). Following these are the face descriptions, typically written with one line per face. Each has the form N VERT1 VERT2 ... VERTN [COLOR] Here N is the number of vertices on this face, and VERT1 through VERTN are indices into the list of vertices (in the range 0..NVERTICES-1). The optional COLOR may take several forms. Line breaks are significant here: the COLOR description begins after VERTN and ends with the end of the line (or the next # comment). A COLOR may be: nothing the default color one integer index into "the" colormap; see below three or four integers RGB and possibly alpha values in the range 0..255 three or four floating-point numbers RGB and possibly alpha values in the range 0..1 For the one-integer case, the colormap is currently read from the file `cmap.fmap' in Geomview's `data' directory. Some better mechanism for supplying a colormap is likely someday. The meaning of "default color" varies. If no face of the objeto has a color, all inherit the environment's default material color. If some but not all faces have colors, the default is gray (R,G,B,A=.666). A `[ST][C][N][n]OFF BINARY' format is accepted; *Note Binary format::. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions (and texture coordinates or vertex colors or normals if `COFF'/`NOFF'/`CNOFF'/`STCNOFF'/etc. format). Exception: each face's vertex indices are followed by an integer indicating how many color components accompany it. Face color components must be floats, not integer values. Thus a colorless triangular face might be represented as int int int int int 3 17 5 9 0 while the same face colored red might be int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0  File: geomview-pt_BR, Node: VECT, Next: SKEL, Prev: OFF, Up: Object File Formats 4.2.6 VECT Files ---------------- The conventional suffix for `VECT' files is `.vect'. Syntax: [4]VECT NPOLYLINES NVERTICES NCOLORS NV[0] ... NV[NPOLYLINES-1] # number of vertices # in each polyline NC[0] ... NC[NPOLYLINES-1] # number of colors supplied # in each polyline VERT[0] ... VERT[NVERTICES-1] # All the vertices # (3*NVertices floats) COLOR[0] ... COLOR[NCOLORS-1] # All the colors # (4*NColors floats, RGBA) `VECT' objetos represent lists of polylines (strings of connected line segments, possibly closed). A degenerate polyline can be used to represent a point. A `VECT' file begins with the key word `VECT' or `4VECT' and three integers: NLINES, NVERTICES, and NCOLORS. Here NLINES is the number of polylines in the file, NVERTICES the total number of vertices, and NCOLORS the number of colors as explained below. Next come NLINES 16-bit integers NV[0] NV[1] NV[2] ... NV[NLINES-1] giving the number of vertices in each polyline. A negative number indicates a closed polyline; 1 denotes a single-pixel point. The sum (of absolute values) of the NV[I] must equal NVERTICES. Next come NLINES more 16-bit integers NC[I]: the number of colors in each polyline. Normally one of three values: 0 No color is specified for this polyline. It's drawn in the same color as the previous polyline. 1 A single color is specified. The entire polyline is drawn in that color. abs(NV[I]) Each vertex has a color. Either each segment is drawn in the corresponding color, or the colors are smoothly interpolated along the line segments, depending on the implementation. Next come NVERTICES groups of 3 or 4 floating-point numbers: the coordinates of all the vertices. If the keyword is 4VECT then there are 4 values per vertex. The first abs(NV[0]) of them form the first polyline, the next abs(NV[1]) form the second and so on. Finally NCOLORS groups of 4 floating-point numbers give red, green, blue and alpha (opacity) values. The first NC[0] of them apply to the first polyline, and so on. A VECT BINARY format is accepted; *note Binary format::. The binary format exactly follows the ASCII format, with 32-bit Big-Endian integers where ordinary integer numbers appear, and with 16-bit Big-Endian integers where 16-bit integers appear; 32-bit Big-Endian floats where real values appear. BIG FAT NOTE: The vertex counts NV[I] and the color counts NC[I] are 16-bit Big-Endian integers.  File: geomview-pt_BR, Node: SKEL, Next: SPHERE, Prev: VECT, Up: Object File Formats 4.2.7 SKEL Files ---------------- `SKEL' files represent collections of points and polylines, with shared vertices. The conventional suffix for `SKEL' files is `.skel'. Syntax: [C][4][n]SKEL [NDIM] # Vertex dimension, present only if nSKEL NVERTICES NPOLYLINES X[0] Y[0] Z[0] # Vertices # if 4SKEL, each vertex has 4 components # if nSKEL, each vertex has NDim components # if C[4][n]SKEL vertex coordinates are # followed by an RGBA color specification ... X[NVERTICES-1] Y[NVERTICES-1] Z[NVERTICES-1] # Polylines # NV = # vertices on this polyline (1 = point) # V[0] ... V[NV-1]: vertex indices # in range 0..NVERTICES-1 NV V[0] V[1] ... V[NV-1] [COLORSPEC] ... # COLORSPEC continues past V[NV-1] # to end-of-line; may be nothing, or 3 or 4 numbers. # nothing: default color # 3 or 4 floats: RGB[A] values 0..1 The syntax resembles that of `OFF' files, with a table of vertices followed by a sequence of polyline descriptions, each referring to vertices by index in the table. Each polyline has an optional color. For `nSKEL' objetos, each vertex has NDIM components. For `4nSKEL' objetos, each vertex has NDIM+1 components; the final component is the homogeneous divisor. A [4][N]SKEL BINARY format is accepted; *Note Binary format::. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions. Exception: each polyline's vertex indices are followed by an integer indicating how many color components accompany it. Polyline color components must be floats, not integer values. Thus a colorless polyline with 3 vertices might be represented as int int int int int 3 17 5 9 0 while the same polyline colored red might be int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0  File: geomview-pt_BR, Node: SPHERE, Next: INST, Prev: SKEL, Up: Object File Formats 4.2.8 SPHERE Files ------------------ The conventional suffix for `SPHERE' files is `.sph'. [ST][E|H|S]SPHERE # Keyword # auto-generated texture co-ordinates, only allowed with _ST_SPHERE objetos [SINUSOIDAL|CYLINDRICAL|RECTANGULAR|STEREOGRAPHIC|ONEFACE] # next four fields are required RADIUS XCENTER YCENTER ZCENTER The key word is `[ST][E|H|S]SPHERE'. The optional prefix characters mean: `ST' The sphere carries automatically generated texture co-ordinates. See below. `E' The sphere lives in Euclidean space. `H' The sphere lives in Hyperbolic space. *Note Non-Euclidean Geometry::. `S' The sphere lives in spherical space. *Note Non-Euclidean Geometry::. Sphere objetos are drawn using meshes which are rectangular in a polar co-ordinate system, with the equatorial plane parallel to the `x,y'-plane. Their smoothness, and the time taken to draw them, depends on the setting of the dicing level, 10x10 by default. From Geomview, the Appearance panel, the `ad' keyboard command, or a `dice nu nv' Appearance attribute sets this. Texture co-ordinates are generated for `STSPHERE' objetos; the keyword following the initial `STSPHERE' keyword defines the way this is done. It follows the conventions of the `mktxmesh' Perl-script which comes with the _Orrery_. SINUSOIDAL sinusoidal equal-area projection CYLINDRICAL cylindrical proj: S is the longitude, T is the latitude RECTANGULAR rectangular proj: S is the longitude, T is `sin(latitude)' (i.e. `z' co-ordinate in the sphere's co-ordinate system) STEREOGRAPHIC stereographic projection from the south (`z=-1') pole ONEFACE stretch orthographic view of `+y' hemisphere over both, mirroring  File: geomview-pt_BR, Node: INST, Next: LIST, Prev: SPHERE, Up: Object File Formats 4.2.9 INST Files ---------------- The conventional suffix for a `INST' file is `.inst'. There is no INST BINARY format. An `INST' applies a 4x4 (or (N+1)x(N+1) in the context of ND-viewing) transformation to another OOGL objeto. It begins with `INST' followed by these sections which may appear in any order: geom OOGL-OBJECT specifies the OOGL objeto to be instantiated. *Note References::, for the syntax of an OOGL-OBJECT. The keyword `unit' is a synonym for `geom'. transform ["{"] `4x4 transform' ["}"] specifies a single transformation matrix. Either the matrix may appear literally as 16 numbers, or there may be a reference to a "transform" objeto, i.e. "<" file-containing-4x4-matrix or ":" symbol-representing-transform-object Another way to specify the transformation is transforms OOGL-OBJECT The OOGL-OBJECT must be a `TLIST' objeto (list of transformations) objeto, or a `LIST' whose members are ultimately `TLIST' objetos. In effect, the `transforms' keyword takes a collection of 4x4 matrices and replicates the `geom' objeto, making one copy for each 4x4 matrix. If no `transform' nor `transforms' keyword appears, no transformation is applied (actually the identity is applied). You could use this for, e.g., wrapping an appearance around an externally-supplied objeto, though a single-membered LIST would do this more efficiently. *Note Transformation matrices::, for the matrix format. When replicating a single geometry by means of a `TLIST' objeto (see `transforms' above) it may be useful to transform texture co-ordinates by another list of transformations; that list can be specified by txtransforms TLIST-OBJECT The number of texture transformations must match the number of geometry transformations. The `SPHERE' objeto (*note Sphere Objetos: SPHERE.) uses this technique to generate an entire textured sphere out of some fraction of a sphere (usually one octant). A single (N+1)-dimensional transformation can be specified by ntransform ["{"] N+1 N+1 `(N+1)x(N+1) floats' ["}"] This gives a single N+1-dimensional transformation matrix. Either the matrix may appear literally as (N+1)x(N+1) numbers, or there may be a reference to an `ntransform' objeto, i.e. "<" file-containing-(N+1)x(N+1)-matrix or ":" symbol-representing-ntransform-object *Note ND Transformation matrices::, for the matrix format. Two more INST fields are accepted: `location' and `origin'. Note that `location' as well as `origin' are ignored if this `INST' objeto carries an `ntransform'. Also, if ND-viewing is active (`ND-axes' command, *note GCL::) then `INST' objetos with `origin' unequal to `local' will not be drawn, though the `location' stuff may work (or not). location [global or camera or ndc or screen or local] Normally an INST specifies a position relative to its parent objeto; the `location' field allows putting an objeto elsewhere. * `location global' attaches the objeto to the global (a.k.a. universe) coordinate system - the same as that in which geomview's World objetos, alien geometry, and ca^meras are placed. * `location camera' places the objeto relative to the camera. (Thus if there are multiple views, it may appear in a different spatial position in each view.) The center of the camera's view is along its negative Z axis; positive X is rightward, positive Y upward. Normally the units of ca^mera space are the same as global coordinates. When a ca^mera is reset, the global origin is at (0,0,-3.0). * `location ndc' places the objeto relative to the normalized unit cube into which the camera's projection (perspective or orthographic) maps the visible world. X, Y, and Z are each in the range from -1 to +1, with Z = -1 the near and Z = +1 the far clipping plane, and X and Y increasing rightward and upward respectively. Thus something like INST transform 1 0 0 0 0 1 0 0 0 0 1 0 -.9 -.9 -.999 1 location ndc geom < label.vect pastes `label.vect' onto the lower left corner of each window, and in front of nearly everything else, assuming `label.vect''s contents lie in the positive quadrant of the X-Y plane. It's tempting to use -1 rather than -.999 as the Z component of the position, but that may put the objeto just nearer than the near clipping plane and make it (partially) invisible, due to floating-point error. * `location screen' places the objeto in screen coordinates. The range of Z is still -1 through +1 as for ndc coordinates; X and Y are measured in pixels, and range from (0,0) at the _lower left_ corner of the window, increasing rightward and upward. `location local' is the default; the objeto is positioned relative to its parent. origin [global or camera or ndc or screen or local] x y z The `origin' field translates the contents of the INST to place the origin at the specified point of the given coordinate system. Unlike `location', it doesn't change the orientation, only the choice of origin. Both `location' and `origin' can be used together. So for example { INST location screen origin ndc 0 0 -.99 geom { < xyz.vect } transform { 100 0 0 0 0 100 0 0 0 0 -.009 0 0 0 0 1 } } places xyz.vect's origin in the center of the window, just beyond the near clipping plane. The unit-length X and Y edges are scaled to be just 100 screen units - pixels - long, regardless of the size of the window. * Menu: * INST Examples:: Some example of `INST' Files.  File: geomview-pt_BR, Node: INST Examples, Prev: INST, Up: INST 4.2.9.1 INST Examples ..................... Here are some examples of `INST' files INST unit < xyz.vect transform { 1 0 0 0 0 1 0 0 0 0 1 0 1 3 0 1 } { appearance { +edge material { edgecolor 1 1 0 } } INST geom < mysurface.quad } {INST transform {: T} geom { } } geom { # stuff replicated by all the above matrices ... } } This one resembles the `origin' example in the section above, but makes the X and Y edges be 1/4 the size of the window (1/4, not 1/2, since the range of ndc X and Y coordinates is -1 to +1). { INST location ndc geom { < xyz.vect } transform { .5 0 0 0 0 .5 0 0 0 0 -.009 0 0 0 -.99 1 } }  File: geomview-pt_BR, Node: LIST, Next: TLIST, Prev: INST, Up: Object File Formats 4.2.10 LIST Files ----------------- The conventional suffix for a `LIST' file is `.list'. A list of OOGL objetos Syntax: LIST OOGL-OBJECT OOGL-OBJECT ... Note that there's no explicit separation between the oogl-objetos, so they should be enclosed in curly braces ({ }) for sanity. Likewise there's no explicit marker for the end of the list; unless appearing alone in a disk file, the whole construct should also be wrapped in braces, as in: { LIST { QUAD ... } { < xyz.quad } } A `LIST' with no elements, i.e. `{ LIST }', is valid, and is the easiest way to create an empty objeto. For example, to remove a symbol's definition you might write { define somesymbol { LIST } }  File: geomview-pt_BR, Node: TLIST, Next: GROUP, Prev: LIST, Up: Object File Formats 4.2.11 TLIST Files ------------------ The conventional suffix for a `TLIST' file is `.grp' ("group") or or `.prj' ("projective" matrices). Collection of 4x4 matrices, used in the `transforms' section of and `INST' objeto. Syntax: TLIST # key word <4x4 matrix (16 floats)> ... # Any number of 4x4 matrices `TLIST's are used only within the `transforms' clause of an `INST' objeto. They cause the `INST's `geom' objeto to be instantiated once under each of the transforms in the `TLIST'. The effect is like that of a `LIST' of `INST's each with a single transform, and all referring to the same objeto, but is more efficient. Be aware that a `TLIST' is a kind of geometry objeto, distinct from a `transform' objeto. Some contexts expect one type of objeto, some the other. For example in INST transform { : MYT } geom { ... } MYT must be a transform objeto, which might have been created with the GCL (read transform { define myT 1 0 0 1 ... }) while in INST transforms { : MYTS } geom { ... } or INST transforms { LIST {: MYTS} {< more.prj} } geom { ... } MYTS must be a geometry objeto, defined e.g. with (read geometry { define MYTS { TLIST 1 0 0 1 ... } }) A `TLIST BINARY' format is accepted. Binary data begins with a 32-bit integer giving the number of transformations, followed by that number of 4x4 matrices in 32-bit floating-point format. The order of matrix elements is the same as in the ASCII format.  File: geomview-pt_BR, Node: GROUP, Next: DISCGRP, Prev: TLIST, Up: Object File Formats 4.2.12 GROUP Files ------------------ This format is obsolete, but is still accepted. It combined the functions of `INST' and `TLIST', taking a series of transformations and a single Geom (`unit') objeto, and replicating the objeto under each transformation. GROUP ... < matrices > ... unit { OOGL-OBJECT } is still accepted and effectively translated into INST transforms { TLIST ... ... } unit { OOGL-OBJECT }  File: geomview-pt_BR, Node: DISCGRP, Next: COMMENT, Prev: GROUP, Up: Object File Formats 4.2.13 DISCGRP Files -------------------- This format is for discrete groups, such as appear in the theory of manifolds or in symmetry patterns. This format has its own man page. See discgrp(5).  File: geomview-pt_BR, Node: COMMENT, Prev: DISCGRP, Up: Object File Formats 4.2.14 COMMENT Objects ---------------------- The COMMENT objeto is a mechanism for encoding arbitrary data within an OOGL objeto. It can be used to keep track of data or pass data back and forth between external modules. Syntax: COMMENT # key word NAME TYPE # individual name and type specifier { ... } # arbitrary data The data, which must be enclosed by curly braces, can include anything except unbalanced curly braces. The TYPE field can be used to identify data of interest to a particular program through naming conventions. `COMMENT' objetos are intended to be associated with other objetos through inclusion in a `LIST' objeto. (*Note LIST::.) The "#" OOGL comment syntax does not suffice for data exchange since these comments are stripped when an OOGL objeto is read in to Geomview. The `COMMENT' objeto is preserved when loaded into Geomview and is written out intact. Here is an example associating a WorldWide Web URL with a piece of geometry: { LIST { < Tetrahedron} {COMMENT GCHomepage HREF { http://www.geomview.org/ }} } A binary `COMMENT' format is accepted. Its format is not consistent with the other OOGL binary formats. *Note Binary format::. The `name' and `type' are followed by N BYTE1 BYTE2 ... BYTEN instead of data enclosed in curly braces.  File: geomview-pt_BR, Node: Non-geometric objects, Prev: Object File Formats, Up: OOGL File Formats 4.3 Non-geometric objects ========================= The syntax of these objetos is given in the form used in *Note References::, where "quoted" items should appear literally but without quotes, square bracketed ([ ]) items are optional, and | separates alternative choices. * Menu: * appearance:: Appearance objetos. * image:: Image objetos. * transform:: Transformation matrices. * ntransform:: N-dimensional transformation matrices. * camera:: Ca^meras. * window:: Windows.  File: geomview-pt_BR, Node: appearance, Next: image, Prev: Non-geometric objects, Up: Non-geometric objects 4.3.1 Appearance Objects ------------------------ Appearances are OOGL objetos of their own right, which simply means that it is possible to give them symbolic names (*note References::). There are other sections dealing with appearance details. *Note Appearances::.  File: geomview-pt_BR, Node: image, Next: transform, Prev: appearance, Up: Non-geometric objects 4.3.2 Image Objects ------------------- Image objetos are used to specify pixmap data for either textures (*note Texture Mapping::), or for background images of ca^meras (*note Camera objects: camera.). At the time of this writing images are comprised of 1 to 4 channels, a channel provides a single number in the range from 0 to `maxval' for each pixel; and `maxval' is tied to 255. The interpretation of the image data depending on the number of channels is like follows: #Channels Channel No. Interpretation -------------------------------------------------------------------------- 1 1 greyscale or luminance data 2 1 greyscale or luminance data ` ' 2 alpha channel (0: transparent, `maxval': opaque) 3 1 red channel `' 2 green channel `' 3 blue channel 4 1 red channel `' 2 green channel `' 3 blue channel `' 4 alpha channel (0: transparent, `maxval': opaque) Image data can be specified inline (embedded into the current data stream) or via file references; in both cases the data is read in and interpreted at the time the image objeto is parsed. _This is different from the old (and deprecated) texture image specification, where the the image data on-disk would eventually be re-read by Geomview_. The general syntax of image objetos is like follows: ::= [ "{" ] (curly brace, generally needed to make the end of the objeto unambiguous.) [ "image" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines an image named , setting its value from the stuff which follows) | "<" (meaning: read image from that file) | ":" (meaning: use variable NAME, defined elsewhere; if undefined the image carries no data) | (actual stuff defining the image; image data must come last, after defining the width and height and number of channels) "width" (width of the image, auto-detected from image data if possible) "height" (height of the image, auto-detected from image data if possible) "channels" (number of channels, auto-detected from image data and `data' specifications, if possible) "maxval" (unsupported, must be `255' if specified) "data DESTMASK [FILTER] [{] < FILENAME [}]" "data DESTMASK [FILTER] DATASIZE [{][\n]LITERAL_IMAGE_DATA[}]" (either external or embedded image data, see below for a detailed description of the meaning of _MASK_ and _FILTER_. An image can (and has, in general) multiple data sections.) [ "}" ] (matching curly brace) Details concerning the image data specification: `DESTMASK' This is a bit-field describing where the specified image data should be placed in the destination pixmap. The bit-field is specified by an integer in one of the known formats (decimal, octal, hexadecimal). The channels of the source data are always enumbered consecutively. If, e.g. `FILENAME' or `LITERAL_IMAGE_DATA' specify a three-channel (probably RGB ...) image and `DESTMASK' equals `0xD' (i.e. bit 1 is 0), then the 3rd channel of the source pixmap would be placed in the 4th channel of the destination image objeto (the alpha channel), the 2nd source channel would determine the `blue' destination value and the 1st source channel the `red' destination value. The number of channels of the source data always has to match the number of bits set in `DESTMASK'. Exception: if the source pixmap has only one channel, then it can be used to fill any number of destination channels; all channels specified in `DESTMASK' are filled with the data of the single channel source pixmap. Geomview knows the following symbolic constants, which can be used instead of specifying the `DESTMASK' bit-field numerically: `LUMINANCE' same as `1', `0x1', `\01' `LUMINANCE_ALPHA' same as `3', `0x3', `\03' `RGB' same as `7', `0x7', `\07' `RGBA' same as `15', `0xf', `\017' `ALPHA' depends on the context: the absolute number of channels must be known; i.e. `data ALPHA ...' must be prepended by something determining the number of channels of the image, e.g. ... data RGB ... data ALPHA ... is valid, but data ALPHA ... is not valid, because Geomview has not means to determine the destination channel from the context. `AUTO' PGM image data is interpreted as single grey-scale channel, RGB PNM data as RGB image data. `AUTO' cannot work with `raw' image data. `FILTER' The `FILTER' specification is optional. If it is missing, then Geomview tries to determine the image type from the `FILENAME' suffix. If there is no suffix or the suffix is unknown, or for embedded image data, Geomview is able to auto-detectc SGI image file formats (for historical reasons ...) and NetPBM image formats (for practical reasons). The auto-detection of NetPBM formats includes the new "PAM" image format which allows (among other things) to store an alpha channel together with the luminance or RGB data. Likewise, the final output of any of the specified filters must either be in SGI image file format, or specify a PAM, PNM or PGM image. If the image file format cannot be determined by either the filenmae suffix or the filter specification or by auto-deteciong of SGI or NetPBM data, then Geomview assume that it is raw-data. See below. The decompression filters may be prepended to either one of the know image formats or an explicitly specified filter, e.g. the following is valid: data LUMINANCE raw.gzip { < gzippedgreymapfile } The above should be equivalent to data LUMINANCE raw { < greymapfile }, provided that the decompressed data carries single channel data, with the first pixel corresponding to the lower-left corner (because of the `raw' image format, see below). Geomview has builtin knowledge for the following filters/suffixes: Data Decompression `z' `gz' `gzip' data is piped through `gzip -dc' `bz2' `bzip2' data is piped through `bzip2 -dc' Image Formats `tiff' `tif' `TIFF' image file format. Only supported if the `tifftopnm' executable can be fond in the current excution path. `png' `PNG' image file format. Only supported if the `pngtopnm' executable can be fond in the current excution path. `jpg' `jpeg' `JPEG' image file format. Only supported if the `jpegtopnm' executable can be fond in the current excution path. `gif' `GIF' image file format. Only supported if the `giftoppm' executable can be fond in the current excution path. `raw' Raw image data; the number of channels must match the number of bits set in `DESTMASK'. Pixels are specified with 1 byte per channel. The pixels are organized in rows as `liminance[-alpha]' or `RGB[A]' samples. The left-most pixel is the first pixel in each data-row, the top-most image row must come first (this is just the same as the NetPBM convention, the image co-ordinate systems has its origin in the left/top corner, as usual). Explicitly Specified Filters If none of the suffixes specified above should match, then the suffix/filter is interpreted as an external filter program; the filter program must read from `STDIN' and write to `STDOUT'. The output must either be in SGI image format, or in PNM or PGM format. Otherwise the output data is interpreted as raw image data (see above). Something like the following should work, provided that the program `${HOME}/bin/bububfilter' exists, is executable and does something useful: ... data RGB "${HOME}/bin/bububfilter.bzip2" 7 { # binary data follows bububub } ... Note that - prior to feeding the data to the `bububfilter' - Geomview will try to decompress the stuff with `bzip2 -dc'. Missing image data: Normally, the number of image channels is determined automatically from the image `data' specifications; if the image specification carries an explicit number of channels via the `channels' keyword which exceeds the number of channels found in the image `data' specifications, or if the union of all `DESTMASK' specfications has holes, then missing luminance and RGB channels are initialized to 0, and a missing alpha-channel is initialized to `maxval', i.e. omitting the alpha channel data for an RGBA image is just the same as defining an RGB image.  File: geomview-pt_BR, Node: transform, Next: ntransform, Prev: image, Up: Non-geometric objects 4.3.3 Transform Objects ----------------------- Where a single 4x4 matrix is expected - as in the `INST' `transform' field, the camera's `camtoworld' transform and the Geomview `xform*' commands - use a transform objeto. Note that a transform is distinct from a `TLIST', which is a type of geometry. `TLIST's can contain one or more 4x4 transformations; "transform" objetos must have exactly one. Why have both? In many places - e.g. ca^mera positioning - it's only meaningful to have a single transform. Using a separate objeto type enforces this. Syntax for a transform objeto is ::= [ "{" ] (curly brace, generally needed to make the end of the objeto unambiguous.) [ "transform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) (interpreted as a 4x4 homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "}" ] (matching curly brace) The whole should be enclosed in { braces }. Braces are not essential if exactly one of the above items is present, so e.g. a 4x4 array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used: # Example 1: A GCL command to define a transform # called "fred" (read transform { transform define fred 1 0 0 0 0 1 0 0 0 0 1 0 -3 0 1 1 } ) # Example 2: A camera objeto using transform # "fred" for camera positioning # Given the definition above, this puts the camera at # (-3, 0, 1), looking toward -Z. { camera halfyfield 1 aspect 1.33 camtoworld { : fred } }  File: geomview-pt_BR, Node: ntransform, Next: camera, Prev: transform, Up: Non-geometric objects 4.3.4 ND-Transform Objects -------------------------- Where - in the context of ND-viewing - a single (N+1)x(N+1) matrix is expected - as in the `INST' `ntransform' field, or the `ND-xform*' (*note GCL::) commands - use an `ntransform' objeto. `ntransform' are NROWS x NCOLS transformation matrix where usually NROWS = N+1 in the context of N-dimensional objetos and viewing. The homogeneous component of an `ntransform' sits at column zero (in contrast to ordinary `transform' objetos where it is located at column three). `ntransform' objetos operate on points of any dimension: if a point is to be transformed by an `ntransform' objeto and the dimension of the point does not match the number of rows of the `ntransform' objeto, then either the point is implicitly padded with zeros to match NROWS or the matrix is implicitly padded with ones down its diagonal (and zeros everywhere else) such that it will operate as identity on the excess dimensions of the input point. Syntax for an `ntransform' objeto is ::= [ "{" ] (curly brace, generally needed to make the end of the objeto unambiguous.) [ "ntransform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) NROWS NCOLS (number of rows and columns of the matrix, typically N+1 N+1, but any dimensions are possible) (interpreted as a NROWS x NCOLS homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the top row -- in contrast to the ordinary transform objetos where the translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "}" ] (matching curly brace) The whole should be enclosed in { braces }. Braces are not necessarily essential, so e.g. two integers - NROWS NCOLS - followed by a NROWS x NCOLS array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used: # Example 1: A GCL command to define a `6x6' transform called # "fred", a mere translation by the vector `-3 0 1 1 0'. This # transform is meant for a five dimensional space, with an homogeneous # component a index zero. (read ntransform { ntransform define fred 6 6 1 -3 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 } ) # Example 2: Set the ND-xform of an objeto -- a geometry or a camera # cluster. Given the definition above, this puts the objeto at (-3 0 1 1 # 0) in the five dimensional space. (ND-xform-set focus : fred) # or (ND-xform-set g1 : fred)  File: geomview-pt_BR, Node: camera, Next: window, Prev: ntransform, Up: Non-geometric objects 4.3.5 cameras ------------- A ca^mera objeto specifies the following properties of a camera: position and orientation specified by either a camera-to-world or world-to-camera transformation; this transformation does not include the projection, so it's typically just a combination of translation and rotation. Specified as a transform objeto, typically a 4x4 matrix. "focus" distance Intended to suggest a typical distance from the ca^mera to the objeto of interest; used for default ca^mera positioning (the ca^mera is placed at (X,Y,Z) = (0,0,focus) when reset) and for adjusting field-of-view when switching between perspective and orthographic views. window aspect ratio True aspect ratio in the sense /. This normally should agree with the aspect ratio of the camera's window. Geomview normally adjusts the aspect ratio of its ca^meras to match their associated windows. near and far clipping plane distances Note that both must be strictly greater than zero. Very large / distance ratios cause Z-buffering to behave badly; part of an objeto may be visible even if somewhat more distant than another. field of view Specified in either of two forms. `fov' is the field of view - in degrees if perspective, or linear distance if orthographic - in the _shorter_ direction. `halfyfield' is half the projected Y-axis field, in world coordinates (not angle!), at unit distance from the camera. For a perspective camera, halfyfield is related to angular field: halfyfield = tan( Y_axis_angular_field / 2 ) while for an orthographic one it's simply: halfyfield = Y_axis_linear_field / 2 This odd-seeming definition is (a) easy to calculate with and (b) well-defined in both orthographic and perspective views. background color Arguably not a property of a camera, but of the scene. Nevertheless, as there is no "background" OOGL objeto, and the background color should not be a property of the drawing device, it can be specified here. At the time of this writing, however, the GUI always overrides the background color with its own settings. background image Same reasoning as above, only that the GUI does not override this setting. The image is centered at NDC co-ordinates `(0,0,-1)'; it is not resized, just painted behind everything else as is. *Note Image objetos: image. The syntax for a ca^mera is: ::= [ "camera" ] (optional keyword) [ "{" ] (opening brace, generally required) [ "define" ] "<" | ":" | (or any number of the following, in any order...) "perspective" {"0" | "1"} (default 1) (otherwise orthographic) "stereo" {"0" | "1"} (default 0) (otherwise mono) "worldtocam" (see transform syntax above) "camtoworld" (no point in specifying both camtoworld and worldtocam; one is constrained to be the inverse of the other) "halfyfield" (default tan 40/2 degrees) "fov" (angular field-of-view if perspective, linear field-of-view otherwise. Measured in whichever direction is smaller, given the aspect ratio. When aspect ratio changes -- e.g. when a window is reshaped -- "fov" is preserved.) "frameaspect" (X/Y) (default 1.333) "near" (default 0.1) "far" (default 10.0) "focus" (default 3.0) "bgcolor" (default 1/3 1/3 1/3 1) "bgimage" { } (default no background image) [ "}" ] (matching closebrace)  File: geomview-pt_BR, Node: window, Prev: camera, Up: Non-geometric objects 4.3.6 window ------------ A window objeto specifies size, position, and other window-system related information about a window in a device-independent way. The syntax for a window objeto is: window ::= [ "window" ] (optional keyword) [ "{" ] (curly brace, often required) (any of the following, in any order) "size" (size of the window) "position" (position & size) "noborder" (specifies the window should have no window border) "pixelaspect" (specifies the true visual aspect ratio of a pixel in this window in the sense xsize/ysize, normally 1.0. For stereo hardware which stretches the display vertically by a factor of 2, ``pixelaspect 0.5'' might do. The value is used when computing the projection of a camera associated with this window.) [ "}" ] (matching closebrace) Window objetos are used in the Geomview `window' and `ui-panel' commands to set default properties for future windows or to change those of an existing window. *Note `(window ...)': window. *Note `(ui-panel ...)': ui-panel.  File: geomview-pt_BR, Node: Customization, Next: Modules, Prev: OOGL File Formats, Up: Top 5 Customization: `.geomview' files ********************************** When Geomview is started, it loads and executes commands in a system-wide startup file named `.geomview'. This file is in the `data' subdirectory of the Geomview distribution directory and contains GCL commands to configure Geomview in a way common to all users on the system. Next, Geomview looks for the file `~/.geomview' (`~' stands for your home directory). You can use this to configure your own default Geomview behavior to suit your tastes. After reading `~/.geomview', Geomview looks for a file named `.geomview' in the current directory. If such a file exists Geomview reads it, unless it is the same as `~/.geomview' (which would be the case if you are running Geomview from your home directory). You can use the current directory's `.geomview' to create a Geomview customization specific to a certain project. You can use `.geomview' files to control all kinds of things about Geomview. They can contain any valid GCL statements. Especially useful is the `ui-panel' command which controls the initial placement of Geomview's panels. For an example see the system-wide `.geomview' file mentioned above. *Note GCL::. *Note `(ui-panel ...)': ui-panel. It is a good idea to enclose all the commands you put in a `.geomview' file in a `progn' statement in order to cause Geomview to execute them all at once. Otherwise Geomview might execute them sequentially over the first few refresh cycles after starting up. To change, e.g. the focus policy of the janela de ca^mera such that they pick up the focus policy of the window manager (instead of being activated when the mouse cursor crosses the window), you could put the following in your `~/.geomview' file: (progn (ui-cam-focus focus-change) ... # other stuff ) You can put any valid `GCL' command into your `.geomview' files,*note GCL::. *Note `(progn ...)': progn. *Note `(ui-cam-focus ...)': ui-cam-focus.  File: geomview-pt_BR, Node: Modules, Next: GCL, Prev: Customization, Up: Top 6 External Modules ****************** An external module is a program that interacts with Geomview. A module communicates with Geomview through GCL and can control any apsect of Geomview that you can control through Geomview's user interface. In many cases an external module is a specialized program that implements some mathematical algorithm that creates a geometric objeto that changes shape as the algorithm progresses. The module informs Geomview of the new objeto shape at each step, so the objeto appears to evolve with time in the Geomview window. In this way Geomview serves as a _display engine_ for the module. An external module may be interactive. It can respond to mouse and keyboard events that take place in a Geomview window, thus extending the capability of Geomview itself. * Menu: * Interface:: How External Modules Interface with Geomview. * Example1:: Simple External Module. * Example2:: Simple External Module with FORMS Control Panel. * XForms:: The XForms library. * Example3:: External Module with Bi-Directional Communication. * Example4:: Simple Tcl/Tk Module Demonstrating Picking. * Module Installation:: Module Installation.  File: geomview-pt_BR, Node: Interface, Next: Example1, Prev: Modules, Up: Modules 6.1 How External Modules Interface with Geomview ================================================ External modules appear in the _Modules_ browser in Geomview's _Main_ panel. To run a module, clique the bota~o esquerdo do mouse on the module's entry in the browser. While the module is running, an additional line for that module will appear in red in the browser. This line begins with a number in brackets, which indicates the _instace_ number of the module. (For some modules it makes sense to have more than one instance of the module running at the same time.) You can kill an external module by clicando on its red instance entry. By default when Geomview starts, it displays all the modules that have been installed on your system. For instructions on installing a module on your system so that it will appear in the _Modules_ browser every time Geomview is run by anyone on your system, *Note Module Installation::. When Geomview invokes an external module, it creates pipes connected to the module's standard input and output. (Pipes are like files except they are used for communication between programs rather than for storing things on a disk.) Geomview interprets anything that the module writes to its standard output as a GCL command. Likewise, if the external module requests any data from Geomview, Geomview writes that data to the module's standard input. Thus all a module has to do in order to communicate with Geomview is write commands to standard output and (optionally) receive data on standard input. Note that this means that the module cannot use standard input and output for communicating with the user. If a module needs to communicate with the user it can do so either through a control panel of its own or else by responding to certain events that it finds out about from Geomview.  File: geomview-pt_BR, Node: Example1, Next: Example2, Prev: Interface, Up: Modules 6.2 Example 1: Simple External Module ===================================== This section gives a very simple external module which displays an oscillating mesh. To try out this example, make a copy of the file `example1.c' (it is distributed with Geomview in the `doc' subdirectory) in your directory and compile it with the command cc -o example1 example1.c -lm Then put the line (emodule-define "Example 1" "./example1") in a file called `.geomview' in your current directory. Then invoke Geomview; it is important that you compile the example program, create the `.geomview' file, and invoke Geomview all in the same directory. You should see "Example 1" in the _Modules_ browser of Geomview's _Main_ panel; clique sobre o this entry in the browser to start the module. A surface should appear in your janela de ca^mera and should begin oscillating. You can stop the module by clicando on the red "[1] Example 1" line in the _Modules_ browser. /* * example1.c: oscillating mesh * * This example module is distributed with the Geomview manual. * If you are not reading this in the manual, see the "External * Modules" chapter of the manual for more details. * * This module creates an oscillating mesh. */ #include #include /* F is the function that we plot */ float F(x,y,t) float x,y,t; { float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); } main(argc, argv) char **argv; { int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t, dt; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Geomview setup. We begin by sending the command * (geometry example { : foo}) * to Geomview. This tells Geomview to create a geom called * "example" which is an instance of the handle "foo". */ printf("(geometry example { : foo })\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) { UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); } } /* UpdateMesh sends one mesh iteration to Geomview. This consists of * a command of the form * (read geometry { define foo * MESH * ... * }) * where ... is the actual data of the mesh. This command tells * Geomview to make the value of the handle "foo" be the specified * mesh. */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; { int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry { define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include #include /* for struct timeval below */ #include "forms.h" /* for FORMS library */ FL_FORM *OurForm; FL_OBJECT *VelocitySlider; float dt; /* F is the function that we plot */ float F(x,y,t) float x,y,t; { float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); } /* SetVelocity is the slider callback procedure; FORMS calls this * when the user moves the slider bar. */ void SetVelocity(FL_OBJECT *obj, long val) { dt = fl_get_slider_value(VelocitySlider); } /* Quit is the "Quit" bota~o callback procedure; FORMS calls this * when the user cliques the "Quit" bota~o. */ void Quit(FL_OBJECT *obj, long val) { exit(0); } /* create_form_OurForm() creates the FORMS panel by calling a bunch of * procedures in the FORMS library. This code was generated * automatically by the FORMS designer program; normally this code * would be in a separate file which you would not edit by hand. For * simplicity of this example, however, we include this code here. */ create_form_OurForm() { FL_OBJECT *obj; FL_FORM *form; OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0); obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,""); VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0, 340.0,40.0,"Velocity"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_object_align(obj,FL_ALIGN_TOP); fl_set_call_back(obj,SetVelocity,0); obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_call_back(obj,Quit,0); fl_end_form(); } main(argc, argv) char **argv; { int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t; int fdmask; static struct timeval timeout = {0, 200000}; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Forms panel setup. */ foreground(); create_form_OurForm(); fl_set_slider_bounds(VelocitySlider, 0.0, 1.0); fl_set_slider_value(VelocitySlider, dt); fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2"); /* Geomview setup. */ printf("(geometry example { : foo })\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) { fdmask = (1 << fileno(stdin)) | (1 << qgetfd()); select(qgetfd()+1, &fdmask, NULL, NULL, &timeout); fl_check_forms(); UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); } } /* UpdateMesh sends one mesh iteration to Geomview */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; { int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry { define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include "lisp.h" /* We use the OOGL lisp library */ #include "pickfunc.h" /* for PICKFUNC below */ #include "3d.h" /* for 3d geometry library */ /* boxstring gives the OOGL data to define the little box that * we draw at the pick point. NOTE: It is very important to * have a newline at the end of the OFF objeto in this string. */ char boxstring[] = "\ INST\n\ transform\n\ .04 0 0 0\n\ 0 .04 0 0\n\ 0 0 .04 0\n\ 0 0 0 1\n\ geom\n\ OFF\n\ 8 6 12\n\ \n\ -.5 -.5 -.5 # 0 \n\ .5 -.5 -.5 # 1 \n\ .5 .5 -.5 # 2 \n\ -.5 .5 -.5 # 3 \n\ -.5 -.5 .5 # 4 \n\ .5 -.5 .5 # 5 \n\ .5 .5 .5 # 6 \n\ -.5 .5 .5 # 7 \n\ \n\ 4 0 1 2 3\n\ 4 4 5 6 7\n\ 4 2 3 7 6\n\ 4 0 1 5 4\n\ 4 0 4 7 3\n\ 4 1 2 6 5\n"; progn() { printf("(progn\n"); } endprogn() { printf(")\n"); fflush(stdout); } Initialize() { extern LObject *Lpick(); /* This is defined by PICKFUNC below but must */ /* be used in the following LDefun() call */ LInit(); LDefun("pick", Lpick, NULL); progn(); { /* Define handle "littlebox" for use later */ printf("(read geometry { define littlebox { %s }})\n", boxstring); /* Express interest in pick events; see Geomview manual for explanation. */ printf("(interest (pick world * * * * nil nil nil nil nil))\n"); /* Define "pick" objeto, initially the empty list (= null objeto). * We replace this later upon receiving a pick event. */ printf("(geometry \"pick\" { LIST } )\n"); /* Make the "pick" objeto be non-pickable. */ printf("(pickable \"pick\" no)\n"); /* Turn off normalization, so that our pick objeto will appear in the * right place. */ printf("(normalization \"pick\" none)\n"); /* Don't draw the pick objeto's bounding box. */ printf("(bbox-draw \"pick\" off)\n"); } endprogn(); } /* The following is a macro call that defines a procedure called * Lpick(). The reason for doing this in a macro is that that macro * encapsulates a lot of necessary stuff that would be the same for * this procedure in any program. If you write a Geomview module that * wants to know about user pick events you can just copy this macro * call and change the body to suit your needs; the body is the last * argument to the macro and is delimited by curly braces. * * The first argument to the macro is the name of the procedure to * be defined, "Lpick". * * The next two arguments are numbers which specify the sizes that * certain arrays inside the body of the procedure should have. * These arrays are used for storing the face and path information * of the picked objeto. In this module we don't care about this * information so we declare them to have length 1, the minimum * allowed. * * The last argument is a block of code to be executed when the module * receives a pick event. In this body you can refer to certain local * variables that hold information about the pick. For details see * Example 3 in the Extenal Modules chapter of the Geomview manual. */ PICKFUNC(Lpick, 1, 1, { handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge); }, /* version for picking Nd-objects (not documented here) */) handle_pick(picked, p, vert, v, edge, e) int picked; /* was something actually picked? */ int vert; /* was the pick near a vertex? */ int edge; /* was the pick near an edge? */ HPoint3 *p; /* coords of pick point */ HPoint3 *v; /* coords of picked vertex */ HPoint3 e[2]; /* coords of endpoints of picked edge */ { Normalize(&e[0]); /* Normalize makes 4th coord 1.0 */ Normalize(&e[1]); Normalize(p); progn(); { if (!picked) { printf("(geometry \"pick\" { LIST } )\n"); } else { /* * Put the box in place, and color it magenta if it's on a vertex, * yellow if not. */ printf("(xform-set pick { 1 0 0 0 0 1 0 0 0 0 1 0 %g %g %g 1 })\n", p->x, p->y, p->z); printf("(geometry \"pick\"\n"); if (vert) printf("{ appearance { material { diffuse 1 0 1 } }\n"); else printf("{ appearance { material { diffuse 1 1 0 } }\n"); printf(" { LIST { :littlebox }\n"); /* * If it's on an edge and not a vertex, mark the edge * with cyan boxes at the endpoins and a black line * along the edge. */ if (edge && !vert) { e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z; e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z; printf("{ appearance { material { diffuse 0 1 1 } }\n\ LIST\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { VECT\n\ 1 2 1\n\ 2\n\ 1\n\ %f %f %f\n\ %f %f %f\n\ 1 1 0 1\n\ }\n\ }\n", e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z, e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z); } printf(" }\n }\n)\n"); } } endprogn(); } Normalize(HPoint3 *p) { if (p->w != 0) { p->x /= p->w; p->y /= p->w; p->z /= p->w; p->w = 1; } } main() { Lake *lake; LObject *lit, *val; extern char *getenv(); Initialize(); lake = LakeDefine(stdin, stdout, NULL); while (!feof(stdin)) { /* Parse next lisp expression from stdin. */ lit = LSexpr(lake); /* Evaluate that expression; this is where Lpick() gets called. */ val = LEval(lit); /* Free the two expressions from above. */ LFree(lit); LFree(val); } } The code begins by defining procedures `progn()' and `endprogn()' which begin and end a Geomview `progn' group. The purpose of the Geomview `progn' command is to group commands together and cause Geomview to execute them all at once, without refreshing any graphics windows until the end. It is a good idea to group blocks of commands that a module sends to Geomview like this so that the user sees their cumulative effect all at once. Procedure `Initialize()' does various things needed at program startup time. It initializes the lisp library by calling `LInit()'. Any program that uses the lisp library should call this once before calling any other lisp library functions. It then calls `LDefun' to tell the library about our `pick' procedure, which is defined further down with a call to the `PICKFUNC' macro. Then it sends a bunch of setup commands to Geomview, grouped in a `progn' block. This includes defining a handle called `littlebox' that stores the geometry of the little box. Next it sends the command (interest (pick world * * * * nil nil nil nil nil)) which tells Geomview to notify us when a pick event happens. The syntax of this `interest' statement merits some explanation. In general `interest' takes one argument which is a (parenthesized) expression representing a Geomview function call. It specifies a type of call that the module is interested in knowing about. The arguments can be any particular argument values, or the special symbols `*' or `nil'. For example, the first argument in the `pick' expression above is `world'. This means that the module is interested in calls to `pick' where the first argument, which specifies the coordinate system, is `world'. A `*' is like a wild-card; it means that the module is interested in calls where the corresponding argument has any value. The word `nil' is like `*', except that the argument's value is not reported to the module. This is useful for cutting down on the amount of data that must be transmitted in cases where there are arguments that the module doesn't care about. The second, third, fourth, and fifth arguments to the `pick' command give the name, pick point coordinates, vertex coordinates, and edge coordinates of a pick event. We specify these by `*''s above. The remaining five arguments to the `pick' command give other information about the pick event that we do not care about in this module, so we specify these with `nil''s. For the details of the arguments to `pick', *Note GCL::. The `geometry' statement defines a geom called `pick' that is initially an empty list, specified as ` { LIST } '; this is the best way of specifying a null geom. The module will replace this with something useful by sending Geomview another `geometry' command when the user picks something. Next we arrange for the `pick' objeto to be non-pickable, and turn normalization off for it so that Geomview will display it in the size and location where we put it, rather than resizing and relocating it to fit into the unit cube. The next function in the file, `Lpick', is defined with a strange looking call to a macro called `PICKFUNC', defined in the header file `pickfunc.h'. This is the function for handling pick events. The reason we provide a macro for this is that that macro encapsulates a lot of necessary stuff that would be the same for the pick-handling function in any program. If you write a Geomview module that wants to know about user pick events you can just copy this macro call and change it to suit yours needs. In general the syntax for `PICKFUNC' is PICKFUNC(NAME, BLOCK, NDBLOCK) where NAME is the name of the procedure to be defined, in this case `Lpick'. The next argument, BLOCK, is a block of code to be executed when a pick event occurs. If BLOCK contains a return statement, then the returned value must be a pointer to a Lisp-objeto, that is of type `LObject *'. The last argument has the same functionality as the BLOCK argument, but is only invoked when picking objetos in a higher dimensional world. `PICKFUNC' declares certain local variables in the body of the procedure. When the module receives a `(pick ...)' statement from Geomview, the procedure assigns values to these variables based on the information in the `pick' call (variables corresponding to `nil''s in the `(interest (pick ...))' are not given values). There is also a second variant of the `PICKFUNC' macro with a slightly different syntax: DEFPICKFUNC(HELPSTR, COORDSYS, ID, POINT, PN, VERTEX, VN, EDGE, EN, FACE, FN, PPATH, PPN, VI, EI, EIN, FI, BODY, NDBODY) `DEFPICKFUNC' can be used as well as `PICKFUNC', there is no functional differene with the exception that the name of the C-function is tied to `Lpick' when using `DEFPICKFUNC' and that the `(help pick)' GCL-command (*note `(help ...)': help.) would respond with echoing HELPSTR. The table below lists all variables defined in `PICKFUNC' In the context of ND-viewing `float' variants of the arguments apply: the BODY execution block sees the `HPoint3' variables, and the NDBODY block sees only flat one-dimensional arrays of `float'-type. In the ND-viewing context the co-ordinates passed to the pick function are still the 3-dimensional co-ordinates of the ca^mera view-port where the pick occurred, but padded with zeroes on transformed back to the co-ordinate system specified by the second argument of the `pick' command. `char *coordsys;' A string specifying the coordinate system in which coordinates are given. In this example, this will always be `world' because of the `interest' call above. `char *id;' A string specifying the name of the picked geom. `HPoint3 point; int pn;' `float *point; int pn;' `point' is an `HPoint3' structure giving the coordinates of the picked point. `HPoint3' is a homogeneous point coordinate representation equivalent to an array of 4 floats. `pn' tells how many coordinates have been written into this array; it will always be either `0', `4' or greater than `4'. If it is greater than `4', then the NDBODY instruction block is invoked and in this case `point' is a flat array of `pn' many `float's. A value of zero means no point was picked, i.e. the user clicado the bota~o direito do mouse while the cursor was not pointing at a geom. In this case the ordinary BLOCK 3d instruction block is executed. `HPoint3 vertex; int vn;' `float *vertex; int vn;' `vertex' is an `HPoint3' structure giving the coordinates of the picked vertex, if the pick point was near a vertex. `vn' tells how many coordinates have been written into this array; it will always be either `0' or greater equal `4'. A value of zero means the pick point was not near a vertex. In the context of ND-viewing `vertex' will be an array of `vn' `float's and `vn' will be equal to `pn'. `HPoint3 edge[2]; int en;' `float *edge; int en;' `edge' is an array of two `HPoint3' structures giving the coordinates of the endpoints of the picked edge, if the pick point was near an edge. `en' tells how many coordinates have been written into this array; it will always be `0' or greater equal `8'. A value of zero means the pick point was not near an edge. In the context of ND-viewing `edge' will be a flat one-dimensional array of `en' many `float's: the first `pn' `float's define the first vertex, and the second `pn' many `float's define the second vertex; `en' will be two times `pn'. In this example module, the remaining variables will never be given values because their values in the `interest' statement were specified as `nil'. `HPoint3 face[]; int fn;' `float *face; int fn;' `face' is a variable length array of FN `HPoint3''s. `face' gives the coordinates of the vertices of the picked face. `fn' tells how many coordinates have been written into this array; it will always be either `0' or a multiple of `pn'. A value of zero means the pick point was not near a face. In the context of ND-viewing `face' is a flat one-dimensional array of `fn' many floats of which each vertex occupies `pn' many components. `int ppath[]; int ppn;' `ppath' is an array of MAXPATHLEN `int''s. `ppath' gives the path through the OOGL heirarchy to the picked primitive. `pn' tells how many integers have been written into this array; it will be at most MAXPATHLEN. A path of {3,1,2}, for example, means that the picked primitive is "subobjeto number 2 of subobjeto number 1 of objeto 3 in the world". `int vi;' `vi' gives the index of the picked vertex in the picked primitive, if the pick point was near a vertex. `int ei[2]; int ein' The `ei' array gives the indices of the endpoints of the picked edge, if the pick point was near a vertex. `ein' tells how many integers were written into this array. It will always be either 0 or 2; a value of 0 means the pick point was not near an edge. `int fi;' `fi' gives the index of the picked face in the picked primitive, if the pick point was near a face. The `handle_pick' procedure actually does the work of dealing with the pick event. It begins by normalizing the homogeneous coordinates passed in as arguments so that we can assume the fourth coordinate is 1. It then sends GCL commands to define the `pick' objeto to be whatever is appropriate for the kind of pick recieved. See *note OOGL File Formats::, and *note GCL::, for an explanation of the format of the data in these commands. The main program, at the bottom of the file, first calls `Initialize()'. Next, the call to `LakeDefine' defines the `Lake' that the lisp library will use. A `Lake' is a structure that the lisp library uses internally as a type of communiation vehicle. (It is like a unix stream but more general, hence the name.) This call to `LakeDefine' defines a `Lake' structure for doing I/O with `stdin' and `stdout'. The third argument to `LakeDefine' should be `NULL' for external modules (it is used by Geomview). Finally, the program enters its main loop which parses and evaluates expressions from standard input.  File: geomview-pt_BR, Node: Example4, Next: Module Installation, Prev: Example3, Up: Modules 6.6 Example 4: Simple Tcl/Tk Module Demonstrating Picking ========================================================= It's not necessary to write a Geomview module in C. The only requirement of an external module is that it send GCL commands to its standard output and expect responses (if any) on its standard input. An external module can be written in C, perl, tcl/tk, or pretty much anything. As an example, assuming you have Tcl/Tk version 4.0 or later, here's an external module with a simple GUI which demonstrates interaction with geomview. This manual doesn't discuss the Tcl/Tk language; see the good book on the subjeto by its originator John Ousterhout, published by Addison-Wesley, titled _Tcl and the Tk Toolkit_. The `#!' on the script's first line causes the system to interpret the script using the Tcl/Tk `wish' program; you might have to change its first line if that's in some location other than /usr/local/bin/wish4.0. Or, you could define it as a module using (emodule-define "Pick Demo" "wish pickdemo.tcl") in which case `wish' could be anywhere on the UNIX search path. #! /usr/local/bin/wish4.0 # We use "fileevent" below to have "readsomething" be called whenever # data is available from standard input, i.e. when geomview has sent us # something. It promises to include a trailing newline, so we can use # "gets" to read the geomview response, then parse its nested parentheses # into tcl-friendly {} braces. proc readsomething {} { if {[gets stdin line] < 0} { puts stderr "EOF on input, exiting..." exit } regsub -all {\(} $line "\{" line regsub -all {\)} $line "\}" line # Strip outermost set of braces set stuff [lindex $line 0] # Invoke handler for whichever command we got. Could add others here, # if we asked geomview for other kinds of data as well. switch [lindex $stuff 0] { pick {handlepick $stuff} rawevent {handlekey $stuff} } } # Fields of a "pick" response, from geomview manual: # (pick COORDSYS GEOMID G V E F P VI EI FI) # The pick command is executed internally in response to pick # events (right mouse double clique). # # COORDSYS = coordinate system in which coordinates of the following # arguments are specified. This can be: # world: world coord sys # self: coord sys of the picked geom (GEOMID) # primitive: coord sys of the actual primitive within # the picked geom where the pick occurred. # GEOMID = id of picked geom # G = picked point (actual intersection of pick ray with objeto) # V = picked vertex, if any # E = picked edge, if any # F = picked face # P = path to picked primitive [0 or more] # VI = index of picked vertex in primitive # EI = list of indices of endpoints of picked edge, if any # FI = index of picked face # Report when user picked something. # proc handlepick {pick} { global nameof selvert seledge order set obj [lindex $pick 2] set xyzw [lindex $pick 3] set fv [lindex $pick 6] set vi [lindex $pick 8] set ei [lindex $pick 9] set fi [lindex $pick 10] # Report result, converting 4-component homogeneous point into 3-space point. set w [lindex $xyzw 3] set x [expr [lindex $xyzw 0]/$w] set y [expr [lindex $xyzw 1]/$w] set z [expr [lindex $xyzw 2]/$w] set s "$x $y $z " if {$vi >= 0} { set s "$s vertex #$vi" } if {$ei != {}} { set s "$s edge [lindex $ei 0]-[lindex $ei 1]" } if {$fi != -1} { set s "$s face #$fi ([expr [llength $fv]/3]-gon)" } msg $s } # Having asked for notification of these raw events, we report when # the user pressed these keys in the geomview graphics windows. proc handlekey {event} { global lastincr switch [lindex $event 1] { 32 {msg "Pressed space bar"} 8 {msg "Pressed backspace key"} } } # # Display a message on the control panel, and on the terminal where geomview # was started. We use ``puts stderr ...'' rather than simply ``puts ...'', # since Geomview interprets anything we send to standard output # as a GCL command! # proc msg {str} { global msgtext puts stderr $str set msgtext $str update } # Load objeto from file proc loadobject {fname} { if {$fname != ""} { puts "(geometry thing < $fname)" # Be sure to flush output to ensure geomview receives this now! flush stdout } } # Build simple "user interface" # The message area could be a simple label rather than an entry box, # but we want to be able to use X selection to copy text from it. # The default mouse bindings do that automatically. entry .msg -textvariable msgtext -width 45 pack .msg frame .f label .f.l -text "File to load:" pack .f.l -side left entry .f.ent -textvariable fname pack .f.ent -side left -expand true -fill x bind .f.ent { loadobject $fname } pack .f # End UI definition. # Call "readsomething" when data arrives from geomview. fileevent stdin readable {readsomething} # Geomview initialization puts { (interest (pick primitive)) (interest (rawevent 32)) # Be notified when user presses space (interest (rawevent 8)) # or backspace keys. (geometry thing < hdodec.off) (normalization world none) } # Flush to ensure geomview receives this. flush stdout wm title . {Sample external module} msg "Click right mouse in graphics window"  File: geomview-pt_BR, Node: Module Installation, Prev: Example4, Up: Modules 6.7 Module Installation ======================= This section tells how to install an external module so you can invoke it within Geomview. There are two ways to install a module: you can install a _private_ module so that the module is available to you whenever you run Geomview, or you can install a _system_ module so that the module is available to all users on your system whenever they run Geomview. * Menu: * Private Module Installation:: Per-user modules. * System Module Installation:: System-wide modules.  File: geomview-pt_BR, Node: Private Module Installation, Next: System Module Installation, Prev: Module Installation, Up: Module Installation 6.7.1 Private Module Installation --------------------------------- The `emodule-define' command arranges for a module to appear in Geomview's _Modules_ browser. The command takes two string arguments; the first is the name that will appear in the _Modules_ browser. The second is the shell command for running the module; it may include arguments (*note `(emodule-define ...)': emodule-define.). Geomview executes this command in a subshell when you clique sobre o the module's entry in the browser. For example (emodule-define "Foo" "/u/home/modules/foo -x") adds a line labeled "Foo" to the _Modules_ browser which causes the command "/u/home/modules/foo -x" to be executed when selected. You may put `emodule-define' commands in your `~/.geomview' file to arrange for certain modules to be available every time you run Geomview; *Note Customization::. You can also execute `emodule-define' commands from the _Commands_ panel to add a module to an already running copy of Geomview. There are several other GCL commands for controlling the entries in the _Modules_ browser; for details, *Note GCL::.  File: geomview-pt_BR, Node: System Module Installation, Prev: Private Module Installation, Up: Module Installation 6.7.2 System Module Installation -------------------------------- To install a module so that it is available to all Geomview users do the following 1. Create a file called `.geomview-MODULE' where `MODULE' is the name of the module. This file should contain a single line which is an `emodule-define' command for that module: (emodule-define "New Module" "newmodule") The first argument, `"New Module"' above, is the string that will appear in the _Modules_ browser. The second string, `"newmodule"' above, is the Bourne shell command for invoking the module. It may include arguments, and you may assume that the module is on the $path searched by the shell. 2. Put a copy of the `.geomview-MODULE' and the module executable itself in Geomview's `modules/' directory, where `' is your system type. After these steps, the new module should appear, in alphabetical position, in the _Modules_ browser of Geomview's _Main_ panel next time Geomview is run. The reason this works is that when Geomview is invoked it processes all the `.geomview-*' files in its `modules' directory. It also remembers the pathname of this directory and prepends that path to the $path of the shell in which it invokes such a module.  File: geomview-pt_BR, Node: GCL, Next: Non-Euclidean Geometry, Prev: Modules, Up: Top 7 GCL: the Geomview Command Language ************************************ GCL has the syntax of lisp - i.e. an expression of the form (f a b ...) means pass the values of a, b, ... to the function f. GCL is very limited and is by no means an implementation of lisp. It is simply a language for expressing commands to be executed in the order given, rather than a programming language. It does not support variable or function definition. GCL is the language that Geomview understands for files that it loads as well as for communication with other programs. To execute a GCL command interactively, you can bring up the _Commands_ panel which lets you type in a command; Geomview executes the command when you hit the key. Output from such commands is printed to standard output. Alternately, you can invoke Geomview as `geomview -c -' which causes it to read GCL commands from standard input. GCL functions return a value, and you can nest function calls in ways which use this returned value. For example (f (g a b)) evaluates `(g a b)' and then evaluates `(f x)' where `x' is the result returned by `(g a b)'. Geomview maintains these return values internally but does not normally print them out. To print out a return value pass it to the `echo' function. For example the `geomview-version' function returns a string representing the version of Geomview that is running, and (echo (geomview-version)) prints out this string. Many functions simply return `t' for success or `nil' for failure; this is the case if the documentation for the function does not indicate otherwise. These are the lisp symbols for true and false, respectively. (They correspond to the C variables `Lt' and `Lnil' which you are likely to see if you look at the source code for Geomview or some of the external modules.) In the descriptions of the commands below several references are made to "OOGL" formats. OOGL is the data description language that Geomview uses for describing geometry, ca^meras, appearances, and other basic objetos. For details of the OOGL formats, *Note OOGL File Formats::. (Or equivalently, see the oogl(5) manual page, distributed with Geomview in the file man/cat5/oogl.5. The GCL commands and argument types are listed below. Most of the documentation in this section of the manual is available within Geomview via the `?' and `??' commands. The command `(? COMMAND)' causes Geomview to print out a one-line summary of the syntax of COMMAND, and `(?? COMMAND)' prints out an explanation of what COMMAND does. You can include the wild-card character `*' in COMMAND to print information for a group of commands matching a pattern. For example, `(?? *emodule*)' will print all information about all commands containing the string `emodule'. `(? *)' will print a short list of all commands. * Menu: * Argument Conventions:: Conventions used in describing argument types. * GCL Reference:: Documentation for each GCL command.  File: geomview-pt_BR, Node: Argument Conventions, Next: GCL Reference, Prev: GCL, Up: GCL 7.1 Conventions Used In Describing Argument Types ================================================= The following symbols are used to describe argument types in the documentation for GCL functions. `APPEARANCE' is an OOGL appearance specification. `CAM-ID' is an ID that refers to a camera. `CAMERA' is an OOGL ca^mera specification. `GEOM-ID' is an ID that refers to a geometry. `GEOMETRY' is an OOGL geometry specification. `ID' is a string which names a geometry or camera. Besides those you create, valid ones are: ``World, world, worldgeom, g0'' the collection of all geom's `target' selected objeto alvo (cam or geom) `center' selected center-of-movimento objeto `targetcam' last selected target camera `targetgeom' last selected target geom `focus' ca^mera where cursor is (or most recently was) `allgeoms' all geom objetos `allcams' all ca^meras ``default, defaultcam, prototype'' future ca^meras inherit default's settings The following IDs are used to name coordinate systems, e.g. in `pick' and `write' commands: ``World, world, worldgeom, g0'' the world, within which all other geoms live. `universe' the universe, in which the World, lights and ca^meras live. Ca^meras' world2cam transforms might better be called universe2cam, etc. `self' "this Geomview objeto". Transform from an objeto to `self' is the identity; writing its geometry gives the objeto itself with no enclosing transform; picked points appear in the objeto's coordinates. `primitive' (for `pick' only) Picked points appear in the coordinate system of the lowest-level OOGL primitive. A name is also an acceptable id. Given names are made unique by appending numbers if necessary (i.e. `foo<2>'). Every geom is also named g[n] and every ca^mera is also named c[n] (`g0' is always the worldgeom): this name is used as a prefix to keyboard commands and can also be used as a GCL id. Numbers are reused after an objeto is deleted. Both names are shown in the Objeto browser. `STATEMENT' represents a function call. Function calls have the form `(func arg1 arg2 ... )', where `func' is the name of the function and `arg1', `arg2', ... are the arguments. `TRANSFORM' is an OOGL 4x4 transformation matrix. `NTRANSFORM' is an OOGL (N+1)x(N+1) transformation matrix. `WINDOW' is an OOGL winddow specification.  File: geomview-pt_BR, Node: GCL Reference, Prev: Argument Conventions, Up: GCL 7.2 GCL Reference Guide ======================= * Menu: * shell:: `(! SHELLCOMMAND)' * lt:: `(< EXPR1 EXPR2)' * eq:: `(= EXPR1 EXPR2)' * gt:: `(> EXPR1 EXPR2)' * help:: `(? COMMAND)' * morehelp:: `(?? COMMAND)' * emodule-run:: `(| NAME)' * all:: `(all geometry|camera|emodule)' * and:: `(and EXPR1 EXPR2)' * ap-override:: `(ap-override [on|off])' * backcolor:: `(backcolor CAM-ID R G B)' * background-image:: `(background-image CAM-ID [FILENAME])' * bbox-color:: `(bbox-color GEOM-ID R G B)' * bbox-draw:: `(bbox-draw GEOM-ID [yes|no])' * camera:: `(camera CAM-ID [CAMERA])' * camera-draw:: `(camera-draw CAM-ID [yes|no])' * camera-prop:: `(camera-prop { geometry object } [projective])' * camera-reset:: `(camera-reset CAM-ID)' * car:: `(car LIST)' * cdr:: `(cdr LIST)' * clock:: `(clock)' * command:: `(command INFILE [OUTFILE])' * copy:: `(copy [ID] [name])' * cursor-still:: `(cursor-still [INT])' * cursor-twitch:: `(cursor-twitch [INT])' * delete:: `(delete ID)' * dice:: `(dice GEOM-ID N)' * dimension:: `(dimension [N])' * dither:: `(dither CAM-ID {on|off|toggle})' * draw:: `(draw CAM-ID)' * dump-handles:: `(dump-handles)' * echo:: `(echo ...)' * emodule-clear:: `(emodule-clear)' * emodule-define:: `(emodule-define NAME SHELL-COMMAND ...)' * emodule-defined:: `(emodule-defined `modulename')' * emodule-isrunning:: `(emodule-isrunning NAME)' * emodule-path:: `(emodule-path)' * emodule-run:: `(| NAME)' * emodule-sort:: `(emodule-sort)' * emodule-start:: `(emodule-start NAME)' * emodule-transmit:: `(emodule-transmit NAME LIST)' * escale:: `(escale GEOM-ID FACTOR)' * event-keys:: `(event-keys {on|off})' * event-mode:: `(event-mode MODESTRING)' * event-pick:: `(event-pick {on|off})' * evert:: `(evert GEOM-ID [yes|no])' * exit:: `(exit)' * ezoom:: `(ezoom GEOM-ID FACTOR)' * freeze:: `(freeze CAM-ID)' * geometry:: `(geometry GEOM-ID [GEOMETRY])' * geomview-version:: `(geomview-version)' * hdefine:: `(hdefine geometry|camera|... NAME VALUE)' * hdelete:: `(hdelete [geometry|camera|...] name)' * help:: `(? COMMAND)' * hmodel:: `(hmodel CAMID {virtual|projective|conformal})' * hsphere-draw:: `(hsphere-draw CAMID [yes|no])' * if:: `(if TEST EXPR1 [EXPR2])' * inhibit-warning:: `(inhibit-warning STRING)' * input-translator:: `(input-translator "#pfx" "sh-command")' * interest:: `(interest (COMMAND [args]))' * lines-closer:: `(lines-closer CAM-ID DIST)' * load:: `(load filename [command|geometry|camera])' * load-path:: `(load-path)' * look:: `(look [objectID] [camID])' * look-encompass:: `(look-encompass [objID] [camID])' * look-encompass-size:: `(look-encompass-size [view clip near far])' * look-recenter:: `(look-recenter [objID] [camID])' * look-toward:: `(look-toward [objID] [camID] [origin|center])' * merge:: `(merge {window|camera} CAM-ID { WIN or CAM ... })' * merge-ap:: `(merge-ap GEOM-ID APPEARANCE)' * merge-base-ap:: `(merge-base-ap APPEARANCE)' * merge-baseap:: `(merge-baseap APPEARANCE)' * morehelp:: `(?? COMMAND)' * name-object:: `(name-object ID NAME)' * ND-axes:: `(ND-axes CAMID [CLUSTER [Xidx Yidx Zidx [Widx]]])' * ND-color:: `(ND-color CAMID ...' * ND-xform:: `(ND-xform OBJID [ntransform { ... }])' * ND-xform-get:: `(ND-xform-get ID [from-ID])' * ND-xform-set:: `(ND-xform-set OBJID [ntransform { ... }])' * new-alien:: `(new-alien name [GEOMETRY])' * new-camera:: `(new-camera name [CAMERA])' * new-center:: `(new-center [id])' * new-geometry:: `(new-geometry name [GEOMETRY])' * new-reset:: `(new-reset)' * NeXT:: `(NeXT)' * normalization:: `(normalization GEOM-ID {each|none|all|keep})' * not:: `(not EXPR)' * or:: `(or EXPR1 EXPR2)' * pick:: `(pick COORDSYS GEOMID G V E F P VI EI FI)' * pick-invisible:: `(pick-invisible [yes|no])' * pickable:: `(pickable GEOM-ID {yes|no})' * position:: `(position objectID otherID)' * position-at:: `(position-at objectID otherID [center | origin])' * position-toward:: `(position-toward objID othID [center|origin])' * progn:: `(progn STATEMENT [ ... ])' * quit:: `(quit)' * quote:: `(quote EXPR)' * rawevent:: `(rawevent dev val x y t)' * rawpick:: `(rawpick CAMID X Y)' * read:: `(read geometry|camera|... {GEOM or CAM or ...})' * real-id:: `(real-id ID)' * redraw:: `(redraw CAM-ID)' * regtable:: `(regtable)' * rehash-emodule-path:: `(rehash-emodule-path)' * replace-geometry:: `(replace-geometry GEOM-ID PART GEOMETRY)' * rib-display:: `(rib-display [frame|tiff] FILEPREFIX)' * rib-snapshot:: `(rib-snapshot CAM-ID [filename])' * scale:: `(scale GEOM-ID FACTOR [FACTORY FACTORZ])' * scene:: `(scene CAM-ID [GEOMETRY])' * set-clock:: `(set-clock TIME)' * set-conformal-refine:: `(set-conformal-refine CMX [N [EDGES]])' * set-emodule-path:: `(set-emodule-path (PATH1 ... PATHN))' * set-load-path:: `(set-load-path (PATH1 ... PATHN))' * set-motionscale:: `(set-motionscale X)' * setenv:: `(setenv name string)' * sgi:: `(sgi)' * shell:: `(! SHELLCOMMAND)' * sleep-for:: `(sleep-for TIME)' * sleep-until:: `(sleep-until TIME)' * snapshot:: `(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])' * soft-shader:: `(soft-shader CAM-ID {on|off|toggle})' * space:: `(space {euclidean|hyperbolic|spherical})' * stereowin:: `(stereowin CAM-ID [no|horizontal|...] [gap])' * time-interests:: `(time-interests delta initial prefix [suffix])' * transform:: `(transform objectID centerID frameID [rotate|...] ...)' * transform-incr:: `(transform-incr objectID centerID frameID ...)' * transform-set:: `(transform-set objectID centerID frameID ...)' * ui-cam-focus:: `(ui-cam-focus {focus-change|mouse-cross})' * ui-center:: `(ui-center ID)' * ui-center-origin:: `(ui-center-origin {origin|bbox-center})' * ui-emotion-program:: `(ui-emotion-program PROGRAM)' * ui-emotion-run:: `(ui-emotion-run EMODULE)' * ui-freeze:: `(ui-freeze {on|off})' * ui-html-browser:: `(ui-html-browser BROWSER)' * ui-motion:: `(ui-motion {inertia|...} {on|off})' * ui-panel:: `(ui-panel PANELNAME {on|off} [WINDOW])' * ui-pdf-viewer:: `(ui-pdf-viewer VIEWER)' * ui-target:: `(ui-target ID [yes|no])' * uninterest:: `(uninterest (COMMAND [args]))' * update:: `(update [timestep_in_seconds])' * update-draw:: `(update-draw CAM-ID [timestep_in_seconds])' * window:: `(window CAM-ID WINDOW)' * winenter:: `(winenter CAM-ID)' * write:: `(write command|geometry|... FILENAME ...)' * write-comments:: `(write-comments FILENAME GEOMID PICKPATH)' * write-handle:: `(write-handle PREFIX FILENAME HANDLE)' * write-sexpr:: `(write-sexpr FILENAME LISPOBJECT)' * xform:: `(xform ID TRANSFORM)' * xform-incr:: `(xform-incr ID TRANSFORM)' * xform-set:: `(xform-set ID TRANSFORM)' * zoom:: `(zoom CAM-ID FACTOR)'  File: geomview-pt_BR, Node: shell, Next: lt, Prev: GCL Reference, Up: GCL Reference 7.2.1 ! ------- `!' is a synonym for `shell'. *Note shell::.  File: geomview-pt_BR, Node: lt, Next: eq, Prev: shell, Up: GCL Reference 7.2.2 < ------- `(< EXPR1 EXPR2)' Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.  File: geomview-pt_BR, Node: eq, Next: gt, Prev: lt, Up: GCL Reference 7.2.3 = ------- `(= EXPR1 EXPR2)' Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.  File: geomview-pt_BR, Node: gt, Next: help, Prev: eq, Up: GCL Reference 7.2.4 > ------- `(> EXPR1 EXPR2)' Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.  File: geomview-pt_BR, Node: help, Next: morehelp, Prev: gt, Up: GCL Reference 7.2.5 ? ------- `(? [command])' Gives one-line usage summary for `command'. Command may include `*'s as wildcards; see also *Note `(?? ...)': morehelp. One-line command help; lists names only if multiple commands match. `?' is a synonym for *Note `(help ...)': help.  File: geomview-pt_BR, Node: morehelp, Next: emodule-run, Prev: help, Up: GCL Reference 7.2.6 ?? -------- `(?? command)' `command' may include `*' wildcards. Prints more info than `(? command)'. `??' is a synonym for *Note `morehelp': morehelp.  File: geomview-pt_BR, Node: emodule-run, Next: all, Prev: morehelp, Up: GCL Reference 7.2.7 | ------- `|' `|' is a synonym for `emodule-run'.  File: geomview-pt_BR, Node: all, Next: and, Prev: emodule-run, Up: GCL Reference 7.2.8 all --------- `(all geometry)' returns a list of names of all geometry objetos. Use e.g. `(echo (all geometry))' to print such a list. `(all camera)' returns a list of names of all ca^meras. `(all emodule defined)' returns a list of all defined external modules. `(all emodule running)' returns a list of all running external modules.  File: geomview-pt_BR, Node: and, Next: ap-override, Prev: all, Up: GCL Reference 7.2.9 and --------- `(and EXPR1 EXPR2)' Evaluate `EXPR1' and `EXPR2' and return `t' if both return non-`nil', otherwise return `nil'.  File: geomview-pt_BR, Node: ap-override, Next: backcolor, Prev: and, Up: GCL Reference 7.2.10 ap-override ------------------ `(ap-override [on|off])' Selects whether appearance controls should override objetos' own settings. On by default. With no arguments, returns current setting.  File: geomview-pt_BR, Node: backcolor, Next: background-image, Prev: ap-override, Up: GCL Reference 7.2.11 backcolor ---------------- `(backcolor CAM-ID R G B)' Set the background color of CAM-ID; R G B are numbers between 0 and 1.  File: geomview-pt_BR, Node: background-image, Next: bbox-color, Prev: backcolor, Up: GCL Reference 7.2.12 background-image ----------------------- `(background-image CAM-ID [FILENAME])' Use the given image as the background of camera CAM-ID (which must be a real camera, not `default' or `allcams'). Centers the image on the window area. Works only with GL and OpenGL graphics. Use "" for filename to remove background. With no filename argument, returns name of that window's current background image, or "". Any file type acceptable as a texture is allowed, e.g. .ppm.gz, .sgi, etc.  File: geomview-pt_BR, Node: bbox-color, Next: bbox-draw, Prev: background-image, Up: GCL Reference 7.2.13 bbox-color ----------------- `(bbox-color GEOM-ID R G B)' Set the bounding-box color of GEOM-ID; R G B are numbers between 0 and 1.  File: geomview-pt_BR, Node: bbox-draw, Next: camera, Prev: bbox-color, Up: GCL Reference 7.2.14 bbox-draw ---------------- `(bbox-draw GEOM-ID [yes|no])' Say whether GEOM-ID's bounding-box should be drawn; defaults to `yes' if second argument is omitted.  File: geomview-pt_BR, Node: camera, Next: camera-draw, Prev: bbox-draw, Up: GCL Reference 7.2.15 camera ------------- `(camera CAM-ID [CAMERA])' Specify data for CAM-ID; CAMERA is a string giving an OOGL ca^mera specification. If no camera CAM-ID exists, it is created; in this case, the second argument is optional, and if omitted, a default ca^mera is used. *Note `(new-camera ...)': new-camera.  File: geomview-pt_BR, Node: camera-draw, Next: camera-prop, Prev: camera, Up: GCL Reference 7.2.16 camera-draw ------------------ `(camera-draw CAM-ID [yes|no])' Say whether or not ca^meras should be drawn in CAM-ID; `yes' if omitted.  File: geomview-pt_BR, Node: camera-prop, Next: camera-reset, Prev: camera-draw, Up: GCL Reference 7.2.17 camera-prop ------------------ `(camera-prop { geometry object } [projective])' Specify the objeto to be shown when drawing other ca^meras. By default, this objeto is drawn with its origin at the camera, and with the ca^mera looking toward the objeto's -Z axis. With the `projective' keyword, the camera's viewing projection is also applied to the objeto; this places the objeto's Z=-1 and Z=+1 at near and far clipping planes, with the viewing area -1<={X,Y}<=+1. Example: (camera-prop { < cube } projective)  File: geomview-pt_BR, Node: camera-reset, Next: car, Prev: camera-prop, Up: GCL Reference 7.2.18 camera-reset ------------------- `(camera-reset CAM-ID)' Reset CAM-ID to its default value.  File: geomview-pt_BR, Node: car, Next: cdr, Prev: camera-reset, Up: GCL Reference 7.2.19 car ---------- `(car LIST)' returns the first element of LIST.  File: geomview-pt_BR, Node: cdr, Next: clock, Prev: car, Up: GCL Reference 7.2.20 cdr ---------- `(cdr LIST)' returns the list obtained by removing the first element of LIST.  File: geomview-pt_BR, Node: clock, Next: command, Prev: cdr, Up: GCL Reference 7.2.21 clock ------------ `(clock)' Returns the current time, in seconds, as shown by this stream's clock. *Note `(set-clock ...)': set-clock. *Note `(sleep-until ...)': sleep-until.  File: geomview-pt_BR, Node: command, Next: copy, Prev: clock, Up: GCL Reference 7.2.22 command -------------- `(command INFILE [OUTFILE])' Read commands from INFILE; send corresponding responses (e.g. anything written to filename `-') to OUTFILE, stdout by default.  File: geomview-pt_BR, Node: copy, Next: cursor-still, Prev: command, Up: GCL Reference 7.2.23 copy ----------- `(copy [ID] [name])' Copies an objeto or camera. If ID is not specified, it is assumed to be targetgeom. If name is not specified, it is assumed to be the same as the name of ID.  File: geomview-pt_BR, Node: cursor-still, Next: cursor-twitch, Prev: copy, Up: GCL Reference 7.2.24 cursor-still ------------------- `(cursor-still [INT])' Sets the number of microseconds for which the cursor must not move to register as holding still. If INT is not specified, the value will be reset to the default.  File: geomview-pt_BR, Node: cursor-twitch, Next: delete, Prev: cursor-still, Up: GCL Reference 7.2.25 cursor-twitch -------------------- `(cursor-twitch [INT])' Sets the distance which the cursor must not move (in x or y) to register as holding still. If INT is not specified, the value will be reset to the default.  File: geomview-pt_BR, Node: delete, Next: dice, Prev: cursor-twitch, Up: GCL Reference 7.2.26 delete ------------- `(delete ID)' Delete objeto or ca^mera ID.  File: geomview-pt_BR, Node: dice, Next: dimension, Prev: delete, Up: GCL Reference 7.2.27 dice ----------- `(dice GEOM-ID N)' Dice any Bezier patches within GEOM-ID into NxN meshes; default 10. See also the appearance attribute *Note `patchdice': Appearances, which makes this command obsolete.  File: geomview-pt_BR, Node: dimension, Next: dither, Prev: dice, Up: GCL Reference 7.2.28 dimension ---------------- `(dimension [N])' Sets or reads the space dimension for N-dimensional viewing. (Since calculations are done using homogeneous coordinates, this means matrices are (N+1)x(N+1).) With no arguments, returns the current dimension, or 0 if N-dimensional viewing has not been enabled.  File: geomview-pt_BR, Node: dither, Next: draw, Prev: dimension, Up: GCL Reference 7.2.29 dither ------------- `(dither CAM-ID {on|off|toggle})' Turn dithering on or off in that camera.  File: geomview-pt_BR, Node: draw, Next: dump-handles, Prev: dither, Up: GCL Reference 7.2.30 draw ----------- `(draw CAM-ID)' Draw the view in CAM-ID, if it needs redrawing. *Note `(redraw ...)': redraw.  File: geomview-pt_BR, Node: dump-handles, Next: echo, Prev: draw, Up: GCL Reference 7.2.31 dump-handles ------------------- `(dump-handles)' Dump the list of currently active handles to stdout. This function is intended for internal debugging use only.  File: geomview-pt_BR, Node: echo, Next: emodule-clear, Prev: dump-handles, Up: GCL Reference 7.2.32 echo ----------- `(echo ...)' Write the given data to the special file `-'. Strings are written literally; lisp expressions are evaluated and their values written. If received from an external program, `echo' sends to the program's input. Otherwise writes to geomview's own standard output (typically the terminal).  File: geomview-pt_BR, Node: emodule-clear, Next: emodule-define, Prev: echo, Up: GCL Reference 7.2.33 emodule-clear -------------------- `(emodule-clear)' Clears the geomview application (external module) browser.  File: geomview-pt_BR, Node: emodule-define, Next: emodule-defined, Prev: emodule-clear, Up: GCL Reference 7.2.34 emodule-define --------------------- `(emodule-define NAME SHELL-COMMAND ...)' Define an external module called NAME, which then appears in the external-module browser. The SHELL-COMMAND string is a UNIX shell command which invokes the module. See *Note `(emodule-run ...)': emodule-run. for discussion of external modules.  File: geomview-pt_BR, Node: emodule-defined, Next: emodule-isrunning, Prev: emodule-define, Up: GCL Reference 7.2.35 emodule-defined ---------------------- `(emodule-defined `modulename')' If the given external-module name is known, returns the name of the program invoked when it's run as a quoted string; otherwise returns nil. `(echo (emodule-defined `name'))' prints the string.  File: geomview-pt_BR, Node: emodule-isrunning, Next: emodule-path, Prev: emodule-defined, Up: GCL Reference 7.2.36 emodule-isrunning ------------------------ `(emodule-isrunning NAME)' Returns Lt if the emodule NAME is running, or Lnil if it is not running. NAME is searched for in the names as they appear in the browser and in the shell commands used to execute the external modules (not including arguments).  File: geomview-pt_BR, Node: emodule-path, Next: emodule-run, Prev: emodule-isrunning, Up: GCL Reference 7.2.37 emodule-path ------------------- `(emodule-path)' Returns the current search path for external modules. Note: to actually see the value returned by this function you should wrap it in a call to echo: `(echo (emodule-path))'. *Note `(set-emodule-path ...)': set-emodule-path.  File: geomview-pt_BR, Node: emodule-run, Next: emodule-sort, Prev: emodule-path, Up: GCL Reference 7.2.38 emodule-run ------------------ `(emodule-run SHELL-COMMAND ARGS...)' Runs the given SHELL-COMMAND (a string containing a UNIX shell command) as an external module. The module's standard output is taken as geomview commands; responses (written to filename `-') are sent to the module's standard input. The shell command is interpreted by /bin/sh, so e.g. I/O redirection may be used; a program which prompts the user for input from the terminal could be run with: (emodule-run yourprogram <&2) If not already set, the environment variable $MACHTYPE is set to the name of the machine type. Input and output connections to geomview are dropped when the shell command terminates. Clicando on a running program's module-browser entry sends the signal SIGHUP to the program. For this to work, programs should avoid running in the background; those using FORMS or GL should call foreground() before the first FORMS or winopen() call. *Note `(emodule-define ...)': emodule-define. *Note `(emodule-start ...)': emodule-start.  File: geomview-pt_BR, Node: emodule-sort, Next: emodule-start, Prev: emodule-run, Up: GCL Reference 7.2.39 emodule-sort ------------------- `(emodule-sort)' Sorts the modules in the application browser alphabetically.  File: geomview-pt_BR, Node: emodule-start, Next: emodule-transmit, Prev: emodule-sort, Up: GCL Reference 7.2.40 emodule-start -------------------- `(emodule-start NAME)' Starts the external module NAME, defined by emodule-define. Equivalent to clicando on the corresponding module-browser entry.  File: geomview-pt_BR, Node: emodule-transmit, Next: escale, Prev: emodule-start, Up: GCL Reference 7.2.41 emodule-transmit ----------------------- `(emodule-transmit NAME LIST)' Places LIST into external module NAME's standard input. NAME is searched for in the names of the modules as they appear in the External Modules browser and then in the shell commands used to execute the external modules. Does nothing if modname is not running.  File: geomview-pt_BR, Node: escale, Next: event-keys, Prev: emodule-transmit, Up: GCL Reference 7.2.42 escale ------------- `(escale GEOM-ID FACTOR)' Same as scale but multiplies by exp(scale). Obsolete.  File: geomview-pt_BR, Node: event-keys, Next: event-mode, Prev: escale, Up: GCL Reference 7.2.43 event-keys ----------------- `(event-keys {on|off})' Turn keyboard events on or off to enable/disable teclas de atalho.  File: geomview-pt_BR, Node: event-mode, Next: event-pick, Prev: event-keys, Up: GCL Reference 7.2.44 event-mode ----------------- `(event-mode MODESTRING)w' Set the mouse event (movimento) mode; MODESTRING should be one of the following strings: 1. `"[r] Rotate"' 2. `"[t] Translate"' 3. `"[z] Cam Zoom"' 4. `"[s] Geom Scale"' 5. `"[f] Cam Fly"' 6. `"[o] Cam Orbit"' 7. `"[le] Edit Lights"'  File: geomview-pt_BR, Node: event-pick, Next: evert, Prev: event-mode, Up: GCL Reference 7.2.45 event-pick ----------------- `(event-pick {on|off})' Turn picking on or off.  File: geomview-pt_BR, Node: evert, Next: exit, Prev: event-pick, Up: GCL Reference 7.2.46 evert ------------ `(evert GEOM-ID [yes|no])' Set the normal eversion state of GEOM-ID. If the second argument is omitted, toggle the eversion state.  File: geomview-pt_BR, Node: exit, Next: ezoom, Prev: evert, Up: GCL Reference 7.2.47 exit ----------- `(exit)' Terminates geomview.  File: geomview-pt_BR, Node: ezoom, Next: freeze, Prev: exit, Up: GCL Reference 7.2.48 ezoom ------------ `(ezoom GEOM-ID FACTOR)' Same as zoom but multiplies by exp(zoom). Obsolete.  File: geomview-pt_BR, Node: freeze, Next: geometry, Prev: ezoom, Up: GCL Reference 7.2.49 freeze ------------- `(freeze CAM-ID)' Freeze CAM-ID; drawing in this camera's window is turned off until it is explicitly redrawn with `(redraw CAM-ID)', after which time drawing resumes as normal.  File: geomview-pt_BR, Node: geometry, Next: geomview-version, Prev: freeze, Up: GCL Reference 7.2.50 geometry --------------- `(geometry GEOM-ID [GEOMETRY])' Specify the geometry for GEOM-ID. GEOMETRY is a string giving an OOGL geometry specification. If no objeto called GEOM-ID exists, it is created; in this case the GEOMETRY argument is optional, and if omitted, the new objeto GEOM-ID is given an empty geometry.  File: geomview-pt_BR, Node: geomview-version, Next: hdefine, Prev: geometry, Up: GCL Reference 7.2.51 geomview-version ----------------------- `(geomview-version)' Returns a string representing the version of geomview that is running.  File: geomview-pt_BR, Node: hdefine, Next: hdelete, Prev: geomview-version, Up: GCL Reference 7.2.52 hdefine -------------- `(hdefine `geometry'|`camera'|`window'|`appearance'|`image'|`transform'|`ntransform' name value)' Sets the value of a handle of a given type. (hdefine ) is generally equivalent to (read { define }) except that the assignment is done when hdefine is executed, (possibly not at all if inside a conditional statement), while the `read ... define' performs assignment as soon as the text is read. *Note References::. *Note `(read ...)': read. *Note `(hdelete ...)': hdelete.  File: geomview-pt_BR, Node: hdelete, Next: help, Prev: hdefine, Up: GCL Reference 7.2.53 hdelete -------------- `(hdelete [`geometry'|`camera'|`window'|`appearance'|`image'|`transform'|`ntransform'] name)' Deletes the given handle. Note that the handle will not actually be deleted in case there are still other objetos referring to the handle, but once those objetos are gone, the handle will also automatically go away. The objeto the handle referes to (if any) will only be deleted if there are no other references to that objeto. If the optional first argument is omitted, then the first handle matching NAME will be deleted, regardless of the type of the objeto it is attached to. It is not an error to call this function with a non-existent handle, but it is an error to call this funcion with the name of a non-global handle, i.e. one that was not created by `(hdefine ...)' or `(read ... { define ...})'. *Note References::. *Note `(read ...)': read. *Note `(hdefine ...)': hdefine.  File: geomview-pt_BR, Node: help, Next: hmodel, Prev: hdelete, Up: GCL Reference 7.2.54 help ----------- `(help [command])' Command may include `*'s as wildcards; see also *Note `(?? ...)': help. One-line command help; lists names only if multiple commands match.  File: geomview-pt_BR, Node: hmodel, Next: hsphere-draw, Prev: help, Up: GCL Reference 7.2.55 hmodel ------------- `(hmodel CAMID {virtual|projective|conformal})' Set the model used to display geometry in this camera. *Note `(space ...)': space.  File: geomview-pt_BR, Node: hsphere-draw, Next: if, Prev: hmodel, Up: GCL Reference 7.2.56 hsphere-draw ------------------- `(hsphere-draw CAMID [yes|no])' Say whether to draw a unit sphere: the sphere at infinity in hyperbolic space, and a reference sphere in Euclidean and spherical spaces. If the second argument is omitted, `yes' is assumed.  File: geomview-pt_BR, Node: if, Next: inhibit-warning, Prev: hsphere-draw, Up: GCL Reference 7.2.57 if --------- `(if TEST EXPR1 [EXPR2])' Evaluates TEST; if TEST returns a non-nil value, returns the value of EXPR1. If TEST returns nil, returns the value of EXPR2 if EXPR2 is present, otherwise returns nil.  File: geomview-pt_BR, Node: inhibit-warning, Next: input-translator, Prev: if, Up: GCL Reference 7.2.58 inhibit-warning ---------------------- `(inhibit-warning STRING)' Inhibit warning inhbits geomview from displaying a particular warning message determined by STRING. At present there are no warning messages that this applies to, so this command is rather useless.  File: geomview-pt_BR, Node: input-translator, Next: interest, Prev: inhibit-warning, Up: GCL Reference 7.2.59 input-translator ----------------------- `(input-translator "#prefix_string" "Bourne-shell-command")' Defines an external translation program for special input types. When asked to read a file which begins with the specified string, geomview invokes that program with standard input coming from the given file. The program is expected to emit OOGL geometric data to its standard output. In this implementation, only prefixes beginning with # are recognized. Useful as in (input-translator "#VRML" "vrml2oogl")  File: geomview-pt_BR, Node: interest, Next: lines-closer, Prev: input-translator, Up: GCL Reference 7.2.60 interest --------------- `(interest (COMMAND [args]))' Allows you to express interest in a command. When geomview executes that command in the future it will echo it to the communication pool from which the interest command came. COMMAND can be any command. Args specify restrictions on the values of the arguments; if args are present in the interest command, geomview will only echo calls to the command in which the arguments match those given in the interest command. Two special argument values may appear in the argument list. `*' matches any value. `nil' matches any value but supresses the reporting of that value; its value is reported as `nil'. The purpose of the interest command is to allow external modules to find out about things happening inside geomview. For example, a module interested in knowing when a geom called `foo' is deleted could say `(interest (delete foo))' and would receive the string `(delete foo)' when foo is deleted. Picking is a special case of this. For most modules interested in pick events the command `(interest (pick world))' is sufficient. This causes geomview to send a string of the form `(pick world ...)' every time a pick event (right mouse double clique). See the *Note `(pick ...)': pick. command for details.  File: geomview-pt_BR, Node: lines-closer, Next: load, Prev: interest, Up: GCL Reference 7.2.61 lines-closer ------------------- `(lines-closer CAM-ID DIST)' Draw lines (including edges) closer to the ca^mera than polygons by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default. If DIST is too small, a line lying on a surface may be dotted or invisible, depending on the viewpoint. If DIST is too large, lines may appear in front of surfaces that they actually lie behind. Good values for DIST vary with the scene, viewpoint, and distance between near and far clipping planes. This feature is a kludge, but can be helpful.  File: geomview-pt_BR, Node: load, Next: load-path, Prev: lines-closer, Up: GCL Reference 7.2.62 load ----------- `(load filename [command|geometry|camera])' Loads the given file into geomview. The optional second argument specifies the type of data it contains, which may be `command' (geomview commands), `geometry' (OOGL geometric data), or `camera' (OOGL ca^mera definition). If omitted, attempts to guess about the file's contents. Loading geometric data creates a new visible objeto; loading a camera opens a new window; loading a command file executes those commands.  File: geomview-pt_BR, Node: load-path, Next: look, Prev: load, Up: GCL Reference 7.2.63 load-path ---------------- `(load-path)' Returns the current search path for command, geometry, etc. files. Note: to actually see the value returned by this function you should wrap it in a call to echo: `(echo (load-path))'. *Note `(set-load-path ...)': set-load-path.  File: geomview-pt_BR, Node: look, Next: look-encompass, Prev: load-path, Up: GCL Reference 7.2.64 look ----------- `(look [objectID] [cameraID])' Rotates the named ca^mera to point toward the center of the bounding box of the named objeto (or the origin in hyperbolic or spherical space). In Euclidean space, moves the ca^mera forward or backward until the objeto appears as large as possible while still being entirely visible. Equivalent to progn ( (look-toward [objectID] [cameraID] {center | origin}) [(look-encompass [objectID] [cameraID])] ) If objectID is not specified, it is assumed to be World. If cameraID is not specified, it is assumed to be targetcam.  File: geomview-pt_BR, Node: look-encompass, Next: look-encompass-size, Prev: look, Up: GCL Reference 7.2.65 look-encompass --------------------- `(look-encompass [objectID] [cameraID])' Moves cameraID backwards or forwards until its field of view surrounds objectID. This routine works only in Euclidean space. If objectID is not specified, it is assumed to be the world. If cameraID is not specified, it is assumed to be the targetcam. *Note `(look-encompass-size ...)': look-encompass-size.  File: geomview-pt_BR, Node: look-encompass-size, Next: look-recenter, Prev: look-encompass, Up: GCL Reference 7.2.66 look-encompass-size -------------------------- `(look-encompass-size [view-fraction clip-ratio near-margin far-margin])' Sets/returns parameters used by (look-encompass). view-fraction is the portion of the janela de ca^mera filled by the objeto, clip-ratio is the max allowed ratio of near-to-far clipping planes. The near clipping plane is 1/near-margin times closer than the near edge of the objeto, and the far clipping plane is far-margin times further away. Returns the list of current values. Defaults: .75 100 0.1 4.0  File: geomview-pt_BR, Node: look-recenter, Next: look-toward, Prev: look-encompass-size, Up: GCL Reference 7.2.67 look-recenter -------------------- `(look-recenter [objectID] [cameraID])' Translates and rotates the ca^mera so that it is looking in the -z direction (in objectID's coordinate system) at the center of objectID's bounding box (or the origin of the coordinate system in non-Eudlidean space). In Euclidean space, the ca^mera is also moved as close as possible to the objeto while allowing the entire objeto to be visible. Also makes sure that the y-axes of objectID and cameraID are parallel.  File: geomview-pt_BR, Node: look-toward, Next: merge, Prev: look-recenter, Up: GCL Reference 7.2.68 look-toward ------------------ `(look-toward [objectID] [cameraID] [origin | center])' Rotates the named ca^mera to point toward the origin of the objeto's coordinate system, or the center of the objeto's bounding box (in non-Euclidean space, the origin will be used automatically). Default objectID is the world, default camera is targetcam, default location to point towards is the center of the bounding box. geomview-1.9.4/doc/geomview-pt_BR-20000644000175000001440000026217610663305733013765 00000000000000This is ../../doc/geomview-pt_BR, produced by makeinfo version 4.8 from ../../doc/geomview-pt_BR.texi. INFO-DIR-SECTION Graphics Applications START-INFO-DIR-ENTRY * Geomview: (geomview-pt_BR). Programa interativo de visualizac,a~o tridimensional. END-INFO-DIR-ENTRY  File: geomview-pt_BR, Node: merge, Next: merge-ap, Prev: look-toward, Up: GCL Reference 7.2.69 merge ------------ `(merge {window|camera} CAM-ID { WINDOW or CAMERA ... })' Modify the given window or camera, changing just those properties specified in the last argument. E.g. (merge camera `Camera' { far 20 }) sets Camera's far clipping plane to 20 while leaving other attributes untouched.  File: geomview-pt_BR, Node: merge-ap, Next: merge-base-ap, Prev: merge, Up: GCL Reference 7.2.70 merge-ap --------------- `(merge-ap GEOM-ID APPEARANCE)' Merge in some appearance characteristics to GEOM-ID. Appearance parameters include surface and line color, shading style, line width, and lighting.  File: geomview-pt_BR, Node: merge-base-ap, Next: merge-baseap, Prev: merge-ap, Up: GCL Reference 7.2.71 merge-base-ap -------------------- `(merge-base-ap APPEARANCE)' `merge-base-ap' is a synonym for *Note `merge-baseap': merge-baseap.  File: geomview-pt_BR, Node: merge-baseap, Next: morehelp, Prev: merge-base-ap, Up: GCL Reference 7.2.72 merge-baseap ------------------- `(merge-baseap APPEARANCE)' Merge in some appearance characteristics to the base default appearance (applied to every geom before its own apperance). Lighting is typically included in the base appearance.  File: geomview-pt_BR, Node: morehelp, Next: name-object, Prev: merge-baseap, Up: GCL Reference 7.2.73 morehelp --------------- `(morehelp command)' `command' may include `*' wildcards. Prints more info than *Note `(help command)': help.  File: geomview-pt_BR, Node: name-object, Next: ND-axes, Prev: morehelp, Up: GCL Reference 7.2.74 name-object ------------------ `(name-object ID NAME)' Assign a new NAME (a string) to ID. A number is appended if that name is in use (for example, `foo' -> `foo<2>'). The new name, possibly with number appended, may be used as objeto's id thereafter.  File: geomview-pt_BR, Node: ND-axes, Next: ND-color, Prev: name-object, Up: GCL Reference 7.2.75 ND-axes -------------- `(ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex [Windex]]])' In our model for N-D viewing (enabled by (dimension)), objetos in N-space are viewed by N-dimensional _camera clusters_. Each real janela de ca^mera belongs to some cluster, and shows & manipulates a 3-D axis-aligned projected subspace of the N-space seen by its cluster. Moving one ca^mera in a cluster affects its siblings. The ND-axes command configures all this. It specifies a camera's cluster membership, and the set of N-space axes which become the 3-D camera's X, Y, and Z axes. Axes are specified by their indices, from 1 to N for an N-dimensional space. Cluster CLUSTERNAME is implicitly created if not previously known. In principle it is possible to map the homogeneous component of a conformal 4 point to some other index; this would be done by specifying 0 for one of `Xindex', `Yindex' or `Zindex' and giving `Windex' some positive value. This is probably not useful because Geomview does not support non-Euclidean geometries for in higher dimensions. To read a camera's configuration, use `(echo (ND-axes CAMID))'. The return value is an array of 4 integers, the last one should 0.  File: geomview-pt_BR, Node: ND-color, Next: ND-xform, Prev: ND-axes, Up: GCL Reference 7.2.76 ND-color --------------- `(ND-color CAMID' [ (( [ID] (x1 x2 ... xN) v r g b a v r g b a ... ) ((x1 ... xN) v r g b a v r g b a ...) ...)] ) Specifies a function, applied to each N-D vertex, which determines the colors of N-dimensional objetos as shown in camera CAMID. Each coloring function is defined by a vector (in ID's coordinate system) [x1 ... xN] and by a sequence of value (v)/color(r g b a) tuples, ordered by increasing v. The inner product v = P.[x] is linearly interpolated in this table to give a color. If ID is omitted, the (xi) vector is assumed in universe coordinates. The ND-color command specifies a list of such functions; each vertex is colored by their sum (so e.g. green intensity could indicate projection along one axis while red indicated another. An empty list, as in (ND-color CAMID ()), suppresses coloring. With no second argument, (ND-color CAMID) returns that camera's color-function list. Even when coloring is enabled, objetos tagged with the `keepcolor' appearance attribute are shown in their natural colors.  File: geomview-pt_BR, Node: ND-xform, Next: ND-xform-get, Prev: ND-color, Up: GCL Reference 7.2.77 ND-xform --------------- `(ND-xform OBJID [ntransform { idim odim ... }])' Concatenate the given ND-transform with the current ND-transform of the objeto (apply the ND-transform to objeto ID, as opposed to simply setting its ND-transform). Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.  File: geomview-pt_BR, Node: ND-xform-get, Next: ND-xform-set, Prev: ND-xform, Up: GCL Reference 7.2.78 ND-xform-get ------------------- `(ND-xform-get ID [from-ID])' Returns the N-D transform of the given objeto in the coordinate system of from-ID (default `universe'), in the sense * Transform = . Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.  File: geomview-pt_BR, Node: ND-xform-set, Next: new-alien, Prev: ND-xform-get, Up: GCL Reference 7.2.79 ND-xform-set ------------------- `(ND-xform-set OBJID [ntransform { idim odim ... }])' Sets the N-D transform of the given objeto. In dimension N, this is an (N+1)x(N+1) matrix, so in that case idim and odim are expected to be both equal to (N+1). Note that all ca^meras in a camera-cluster have the same N-D transform. Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.  File: geomview-pt_BR, Node: new-alien, Next: new-camera, Prev: ND-xform-set, Up: GCL Reference 7.2.80 new-alien ---------------- `(new-alien name [GEOMETRY])' Create a new alien (geom not in the world) with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new alien is given an empty geometry. If an objeto with that name already exists, the new alien is given a unique name. The light beams that are used to move around the lights are an example of aliens. They're drawn but are not controllable the way ordinary objetos are: they don't appear in the objeto browser and the user can't move them with the normal movimento modes.  File: geomview-pt_BR, Node: new-camera, Next: new-center, Prev: new-alien, Up: GCL Reference 7.2.81 new-camera ----------------- `(new-camera name [CAMERA])' Create a new ca^mera with the given name (a string). If a ca^mera with that name already exists, the new objeto is given a unique name. If CAMERA is omitted a default ca^mera is used.  File: geomview-pt_BR, Node: new-center, Next: new-geometry, Prev: new-camera, Up: GCL Reference 7.2.82 new-center ----------------- `(new-center [id])' Stop id, then set id's transform to the identity. Default id is target. Also, if the id is a camera, calls (look-recenter World id). The main function of the call to (look-recenter) is to place the ca^mera so that it is pointing parallel to the z axis toward the center of the world.  File: geomview-pt_BR, Node: new-geometry, Next: new-reset, Prev: new-center, Up: GCL Reference 7.2.83 new-geometry ------------------- `(new-geometry name [GEOMETRY])' Create a new geom with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new objeto is given an empty geometry. If an objeto with that name already exists, the new objeto is given a unique name.  File: geomview-pt_BR, Node: new-reset, Next: NeXT, Prev: new-geometry, Up: GCL Reference 7.2.84 new-reset ---------------- `(new-reset)' Equivalent to `(progn (new-center ALLGEOMS)(new-center ALLCAMS))'.  File: geomview-pt_BR, Node: NeXT, Next: normalization, Prev: new-reset, Up: GCL Reference 7.2.85 NeXT ----------- `(NeXT)' Returns `t' if running on a NeXT, `nil' if not. A relict from ancient work-station year.  File: geomview-pt_BR, Node: normalization, Next: not, Prev: NeXT, Up: GCL Reference 7.2.86 normalization -------------------- `(normalization GEOM-ID {each|none|all|keep})' Set the normalization status of GEOM-ID. `none' suppresses all normalization. `each' normalizes the objeto's bounding box to fit into the unit sphere, with the center of its bounding box translated to the origin. The box is scaled such that its long diagonal, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2. `all' resembles `each', except when an objeto is changing (e.g. when its geometry is being changed by an external program). Then, `each' tightly fits the bounding box around the objeto whenever it changes and normalizes accordingly, while `all' normalizes the union of all variants of the objeto and normalizes accordingly. `keep' leaves the current normalization transform unchanged when the objeto changes. It may be useful to apply `each' or `all' normalization apply to the first version of a changing objeto to bring it in view, then switch to `keep'.  File: geomview-pt_BR, Node: not, Next: or, Prev: normalization, Up: GCL Reference 7.2.87 not ---------- `(not EXPR)' Evaluates `EXPR'; if `EXPR' returns a non-`nil' value, returns nil, if `EXPR' returns `nil', return `t'.  File: geomview-pt_BR, Node: or, Next: pick, Prev: not, Up: GCL Reference 7.2.88 or --------- `(or EXPR1 EXPR2)' Evaluates `EXPR1'; if `EXPR1' returns non-`nil', return its value, if `EXPR1' returns `nil', evaluate `EXPR2' and return its value.  File: geomview-pt_BR, Node: pick, Next: pick-invisible, Prev: or, Up: GCL Reference 7.2.89 pick ----------- `(pick COORDSYS GEOMID G V E F P VI EI FI)' The pick command is executed internally in response to pick events (right mouse double clique). COORDSYS = coordinate system in which coordinates of the following arguments are specified. This can be: `world' world coord sys `self' coord sys of the picked geom (GEOMID) `primitive' coord sys of the actual primitive within the picked geom where the pick occurred. GEOMID = id of picked geom G = picked point (actual intersection of pick ray with objeto) V = picked vertex, if any E = picked edge, if any F = picked face P = path to picked primitive [0 or more] VI = index of picked vertex in primitive EI = list of indices of endpoints of picked edge, if any FI = index of picked face External modules can find out about pick events by registering interest in calls to `pick' via the `interest' command. In the ND-viewing context the co-ordinates are actually ND-points. They correspond to the 3D points of the pick relative to the sub-space defined by the viewport of the ca^mera where the pick occurred. The co-ordinates are then padded with zeroes and transformed back to the co-ordinate system defined by COORDSYS.  File: geomview-pt_BR, Node: pick-invisible, Next: pickable, Prev: pick, Up: GCL Reference 7.2.90 pick-invisible --------------------- `(pick-invisible [yes|no])' Selects whether picks should be sensitive to objetos whose appearance makes them invisible; default yes. With no arguments, returns current status.  File: geomview-pt_BR, Node: pickable, Next: position, Prev: pick-invisible, Up: GCL Reference 7.2.91 pickable --------------- `(pickable GEOM-ID {yes|no})' Say whether or not GEOM-ID is included in the pool of objetos that could be returned from the pick command.  File: geomview-pt_BR, Node: position, Next: position-at, Prev: pickable, Up: GCL Reference 7.2.92 position --------------- `(position objectID otherID)' Set the transform of objectID to that of otherID.  File: geomview-pt_BR, Node: position-at, Next: position-toward, Prev: position, Up: GCL Reference 7.2.93 position-at ------------------ `(position-at objectID otherID [center | origin])' Translate objectID to the center of the bounding box or the origin of the coordinate system of otherID (parallel translation). Default is center.  File: geomview-pt_BR, Node: position-toward, Next: progn, Prev: position-at, Up: GCL Reference 7.2.94 position-toward ---------------------- `(position-toward objectID otherID [center | origin])' Rotate objectID so that the center of the bounding box or the origin of the coordinate system of the otherID lies on the positive z-axis of the first objeto. Default is the center of the bounding box.  File: geomview-pt_BR, Node: progn, Next: quit, Prev: position-toward, Up: GCL Reference 7.2.95 progn ------------ `(progn STATEMENT [ ... ])' evaluates each STATEMENT in order and returns the value of the last one. Use progn to group a collection of commands together, forcing them to be treated as a single command.  File: geomview-pt_BR, Node: quit, Next: quote, Prev: progn, Up: GCL Reference 7.2.96 quit ----------- `(quit)' `quit' is a synonym for *Note `exit': exit.  File: geomview-pt_BR, Node: quote, Next: rawevent, Prev: quit, Up: GCL Reference 7.2.97 quote ------------ `(quote EXPR)' returns the symbolic lisp expression EXPR without evaluating it.  File: geomview-pt_BR, Node: rawevent, Next: rawpick, Prev: quote, Up: GCL Reference 7.2.98 rawevent --------------- `(rawevent dev val x y t)' Enter the specified raw event into the event queue. The arguments directly specify the members of the event structure used internally by geomview. This is the lowest level event handler and is not intended for general use.  File: geomview-pt_BR, Node: rawpick, Next: read, Prev: rawevent, Up: GCL Reference 7.2.99 rawpick -------------- `(rawpick CAMID X Y)' Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordinates. This is a low-level procedure not intended for external use.  File: geomview-pt_BR, Node: read, Next: real-id, Prev: rawpick, Up: GCL Reference 7.2.100 read ------------ `(read {geometry|camera|appearance|image|ntransform|transform|command} {GEOMETRY or CAMERA or ...})' Read and interpret the text in ... as containing the given type of data. Useful for defining objetos using OOGL reference syntax, e.g. (geometry thing { INST transform : T geom : fred }) (read geometry { define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 }) (read transform { define T . If no filename specified, see *Note `(rib-display ...': rib-display. for an explanation of the filename used.  File: geomview-pt_BR, Node: scale, Next: scene, Prev: rib-snapshot, Up: GCL Reference 7.2.108 scale ------------- `(scale GEOM-ID FACTOR [FACTORY FACTORZ])' Scale GEOM-ID, multiplying its size by FACTOR. The factors should be positive numbers. If FACTORY and FACTORZ are present and non-zero, the objeto is scaled by FACTOR in x, by FACTORY in y, and by FACTORZ in z. If only FACTOR is present, the objeto is scaled by FACTOR in x, y, and z. Scaling only really makes sense in Euclidean space. Mouse-driven scaling in other spaces is not allowed; the scale command may be issued in other spaces but should be used with caution because it may cause the data to extend beyond the limits of the space.  File: geomview-pt_BR, Node: scene, Next: set-clock, Prev: scale, Up: GCL Reference 7.2.109 scene ------------- `(scene CAM-ID [GEOMETRY])' Make CAM-ID look at GEOMETRY instead of at the universe.  File: geomview-pt_BR, Node: set-clock, Next: set-conformal-refine, Prev: scene, Up: GCL Reference 7.2.110 set-clock ----------------- `(set-clock TIME)' Adjusts the clock for this command stream to read TIME (in seconds) as of the moment the command is received. *Note `(sleep-until ...)': sleep-until. *Note `(clock ...)': clock.  File: geomview-pt_BR, Node: set-conformal-refine, Next: set-emodule-path, Prev: set-clock, Up: GCL Reference 7.2.111 set-conformal-refine ---------------------------- `(set-conformal-refine CMX [N [SHOWEDGES]])' Sets the parameters for the refinement algorithm used in drawing in the conformal model. CMX is the cosine of the maximum angle an edge can bend before it is refined. Its value should be between -1 and 1; the default is 0.95; decreasing its value will cause less refinement. N is the maximum number of iterations of refining; the default is 6. SHOWEDGES, which should be `no' or `yes', determines whether interior edges in the refinement are drawn.  File: geomview-pt_BR, Node: set-emodule-path, Next: set-load-path, Prev: set-conformal-refine, Up: GCL Reference 7.2.112 set-emodule-path ------------------------ `(set-emodule-path (PATH1 ... PATHN))' Sets the search path for external modules. The PATHi should be pathnames of directories containing, for each module, the module's executable file and a .geomview- file which contains an (emodule-define ...) command for that module. This command implicitly calls (rehash-emodule-path) to rebuild the application brower from the new path setting. The special directory name `+' is replaced by the existing path, so e.g. (set-emodule-path (mydir +)) prepends mydir to the path.  File: geomview-pt_BR, Node: set-load-path, Next: set-motionscale, Prev: set-emodule-path, Up: GCL Reference 7.2.113 set-load-path --------------------- `(set-load-path (PATH1 ... PATHN))' Sets search path for command, geometry, etc. files. The PATHi are strings giving the pathnames of directories to be searched. The special directory name `+' is replaced by the existing path, so e.g. (set-load-path (mydir +)) prepends mydir to the path.  File: geomview-pt_BR, Node: set-motionscale, Next: setenv, Prev: set-load-path, Up: GCL Reference 7.2.114 set-motionscale ----------------------- `(set-motionscale X)' Set the movimento scale factor to X (default value 0.5). These commands scale their movimento by an amount which depends on the distance from the frame to the center and on the size of the frame. Specifically, they scale by dist + scaleof(frame) * motionscale where dist is the distance from the center to the frame and motionscale is the movimento scale factor set by this function. Scaleof(frame) measures the size of the frame objeto.  File: geomview-pt_BR, Node: setenv, Next: sgi, Prev: set-motionscale, Up: GCL Reference 7.2.115 setenv -------------- `(setenv name string)' sets the environment variable `name' to the value STRING; the name is visible to geomview (as in pathnames containing `$name') and to processes it creates, e.g. external modules.  File: geomview-pt_BR, Node: sgi, Next: shell, Prev: setenv, Up: GCL Reference 7.2.116 sgi ----------- `(sgi)' Returns `t' if running on an sgi machine, `nil' if not. A relict from the old work-station years.  File: geomview-pt_BR, Node: shell, Next: sleep-for, Prev: sgi, Up: GCL Reference 7.2.117 shell ------------- `(shell SHELL-COMMAND)' Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is `!'.  File: geomview-pt_BR, Node: sleep-for, Next: sleep-until, Prev: shell, Up: GCL Reference 7.2.118 sleep-for ----------------- `(sleep-for TIME)' Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; `sleep-for' inside `progn' won't delay execution of the rest of the progn's contents.  File: geomview-pt_BR, Node: sleep-until, Next: snapshot, Prev: sleep-for, Up: GCL Reference 7.2.119 sleep-until ------------------- `(sleep-until TIME)' Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; `sleep-until' inside `progn' won't delay execution of the rest of the progn's contents. Time is measured according to this stream's clock, as set by `set-clock'; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME.  File: geomview-pt_BR, Node: snapshot, Next: soft-shader, Prev: sleep-until, Up: GCL Reference 7.2.120 snapshot ---------------- `(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])' Save a snapshot of CAM-ID in the FILENAME (a string). The FORMAT argument is optional; it may be "ppmscreen" (the default), "ps", "ppm", "sgi" (on SGI machines), "ppmosmesa" (if built with libOSMesa) or "ppmosglx". A "ppmscreen" snapshot is created by reading the image directly from the given window; the window is popped above other windows and redrawn first, then its contents are written as a PPM format image. A "ppmosmesa" snapshot is drawn by Mesa's software renderer into a memory buffer in RAM. A "ppmosglx" snapshot is rendered into a GLX Pixmap buffer, which is also off-screen but may or may not reside in video RAM. Rendering may or may not be accelerated. The problem with on-screen snapshots is that the window must be mapped and not obscured by other windows. So on-screen snapshots will not work in the background, or when a screen safer is active. With "ps", dumps a Postscript picture representing the view from that window; hidden-surface removal might be incorrect. With "ppm", dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the FILENAME argument begins with "|", it's interpreted as a `/bin/sh' command to which the PPM or PS data should be piped. Optional XSIZE and YSIZE values are relevant only for "ppm" formats, and render to a window of that size (or scaled to that size, with aspect fixed, if only XSIZE is given)  File: geomview-pt_BR, Node: soft-shader, Next: space, Prev: snapshot, Up: GCL Reference 7.2.121 soft-shader ------------------- `(soft-shader CAM-ID {on|off|toggle})' Select whether to use software or hardware shading in that camera.  File: geomview-pt_BR, Node: space, Next: stereowin, Prev: soft-shader, Up: GCL Reference 7.2.122 space ------------- `(space {euclidean|hyperbolic|spherical})' Set the space associated with the world.  File: geomview-pt_BR, Node: stereowin, Next: time-interests, Prev: space, Up: GCL Reference 7.2.123 stereowin ----------------- `(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])' Configure CAM-ID as a stereo window. no: entire window is a single pane, stereo disabled horizontal: split left/right: left is stereo eye#0, right is #1. vertical: split top/bottom: bottom is eye#0, top is #1. colored: panes overlap, red is stereo eye#0, cyan is #1. A gap of `gapsize' pixels is left between subwindows; if omitted, subwindows are adjacent. If both layout and gapsize are omitted, e.g. (stereowin CAM-ID), returns current settings as a `(stereowin ...)' command list. This command doesn't set stereo projection; use `merge camera' or `camera' to set the stereyes transforms, and `merge window' or `window' to set the pixel aspect ratio & window position if needed.  File: geomview-pt_BR, Node: time-interests, Next: transform, Prev: stereowin, Up: GCL Reference 7.2.124 time-interests ---------------------- `(time-interests deltatime initial prefix [suffix])' Indicates that all interest-related messages, when separated by at least `deltatime' seconds of real time, should be preceded by the string `prefix' and followed by `suffix'; the first message is preceded by `initial'. All three are printf format strings, whose argument is the current clock time (in seconds) on that stream. A `deltatime' of zero timestamps every message. Typical usage: (time-interests .1 `(set-clock %g)' `(sleep-until %g)') or (time-interests .1 `(set-clock %g)' "(sleep-until %g) (progn (set-clock %g)" ")") or (time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))".  File: geomview-pt_BR, Node: transform, Next: transform-incr, Prev: time-interests, Up: GCL Reference 7.2.125 transform ----------------- `(transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [bbox-center|origin] [dt [`smooth']])' Apply a movimento (rotation, translation, scaling) to objeto `objectID'; that is, construct and concatenate a transformation matrix with objectID's transform The 3 IDs involved are the objeto that moves, the center of movimento, and the frame of reference in which to apply the movimento. The center is easiest understood for rotations: if centerID is the same as objectID then it will spin around its own axes; otherwise the moving objeto will orbit the objeto do centro. Normally frameID, in whose coordinate system the (mouse) movimentos are interpreted, is `focus', the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the `space' command to change spaces. With type `rotate' x, y, and z are floats specifying angles in RADIANS. For types `translate' and `translate-scaled' x, y, and z are floats specifying distances in the coordinate system of the objeto do centro. The next field is optional and may consist of the keyword `bbox-center' or the keyword `origin' and modifies the location of the origin of OBJECTID's co-ordinate frame: `bbox-center' temporarily translates OBJECTID's co-ordinate frame to the center of OBJECTID's bounding box. `origin' is the default (and means not to modify OBJECTID's co-ordinate frame) and `bbox-center' is only valid in Euclidean space. The optional `dt' field allows a simple form of animation; if present, the objeto moves by just that amount during approximately `dt' seconds, then stops. If present and followed by the `smooth' keyword, the movimento is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the movimento is applied immediately.  File: geomview-pt_BR, Node: transform-incr, Next: transform-set, Prev: transform, Up: GCL Reference 7.2.126 transform-incr ---------------------- `(transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center] [dt [smooth]])' Apply continuing movimento: construct a transformation matrix and concatenate it with the current transform of objectID every refresh (sets objectID's incremental transform). Same syntax as transform. If optional `dt' argument is present, the objeto is moved at each time step such that its average movimento equals one instance of the movimento per `dt' seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds.  File: geomview-pt_BR, Node: transform-set, Next: ui-cam-focus, Prev: transform-incr, Up: GCL Reference 7.2.127 transform-set --------------------- `(transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center])' Set objectID's transform to the constructed transform. Same syntax as transform.  File: geomview-pt_BR, Node: ui-cam-focus, Next: ui-center, Prev: transform-set, Up: GCL Reference 7.2.128 ui-cam-focus -------------------- `(ui-cam-focus [focus-change|mouse-cross])' Set the focus policy for the janelas de ca^mera. The default is `mouse-cross': a ca^mera is made the active ca^mera (for interactive mouse events) when the mouse cursor crosses the window. Because this means it can become complicated to activate a specific ca^mera (in the context of multiple janelas de ca^mera) there is also the option to only change the ca^mera focus when the window-manager decides to give it the focus for input events. So, after specifying `focus-change' it depends on the focus-change configuration of your window-manager when a ca^mera becomes the active ca^mera for mouse-interaction. To change this behaviour permanently you could, e.g., place the following line in your `${HOME}/.geomview' file (*note Customization::): (progn (ui-cam-focus focus-change) ... # other stuff )  File: geomview-pt_BR, Node: ui-center, Next: ui-center-origin, Prev: ui-cam-focus, Up: GCL Reference 7.2.129 ui-center ----------------- `(ui-center ID)' Set the center for user interface (i.e. mouse) controlled movimentos to objeto ID.  File: geomview-pt_BR, Node: ui-center-origin, Next: ui-emotion-program, Prev: ui-center, Up: GCL Reference 7.2.130 ui-center-origin ------------------------ `(ui-center-origin [origin|bbox-center])' Set the origin of the coordinate system of the `CENTER' objeto for user interface (i.e. mouse) controlled movimentos. The keyword `origin' means to use the origin of the coordinate system of the currently selected objeto, while `bbox-center' means to use the center of the bouding box of the current objeto. The keyword `bbox-center' makes no sense if the geometry is non-Euclidean. Using either `bbox-center' or `origin' does not make a difference if the objeto do centro is not a _geometry_, e.g. if it is a camera. Same holds if the World is the currently selected objeto.  File: geomview-pt_BR, Node: ui-emotion-program, Next: ui-emotion-run, Prev: ui-center-origin, Up: GCL Reference 7.2.131 ui-emotion-program -------------------------- `(ui-emotion-program PROGRAM)' This is an obsolete command. Use its new eqivalent *Note `emodule-define': emodule-define. instead.  File: geomview-pt_BR, Node: ui-emotion-run, Next: ui-freeze, Prev: ui-emotion-program, Up: GCL Reference 7.2.132 ui-emotion-run ---------------------- `(ui-emotion-run EMODULE)' This is an obsolete command. Use its new eqivalent *Note `emodule_start': emodule-start. instead.  File: geomview-pt_BR, Node: ui-freeze, Next: ui-html-browser, Prev: ui-emotion-run, Up: GCL Reference 7.2.133 ui-freeze ----------------- `(ui-freeze {on|off})' Toggle updating user interface panels. Off by default.  File: geomview-pt_BR, Node: ui-html-browser, Next: ui-motion, Prev: ui-freeze, Up: GCL Reference 7.2.134 ui-html-browser ----------------------- `(ui-html-browser BROWSER)' Use BROWSER for viewing the HTML-version of the manual when the `Manual (HTML)' menu item is selected in the `Help'-menu. If the `(ui-html-browser...)' command was never executed, then the default is to use the browser stored in the `WEBBROWSER' environment variable. If the environment variable is unset then the default is compile-time dependent.  File: geomview-pt_BR, Node: ui-motion, Next: ui-panel, Prev: ui-html-browser, Up: GCL Reference 7.2.135 ui-motion ----------------- `(ui-motion {inertia|constrain|own-coordinates} {on|off})' Enable or disable certain properties of mouse-controlled movimento. The purpose of this command is to give access to the respective toggles of the _Main_ panel's _Motion_ menu through GCL commands. *Note Mouse Motions::. `inertia' Normally, moving objetos have inertia: if the mouse is still moving when the bota~o is released, the selected objeto continues to move. When `inertia' is off, objetos cease to move as soon as you release the mouse. `constrain' It's sometimes handy to move an objeto in a direction aligned with a coordinate axis: exactly horizontally or vertically. Calling `(ui-motion constrain on)' changes the interpretation of mouse movimentos to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical movimento. Note that the movimento is still along the X or Y axes of the ca^mera in which you move the mouse, not necessarily the objeto's own coordinate system. `own-coordinates' It's sometimes handy to move objetos with respect to the coordinate system where they were defined, rather than with respect to some camera's view. When `(ui-motion own-coordinates on)' has been called, all movimentos are interpreted that way: dragging the mouse rightward in translate mode moves the objeto in its own +X direction, and so on. May be especially useful in conjunction with the `(ui-motion constrain on)' command.  File: geomview-pt_BR, Node: ui-panel, Next: ui-pdf-viewer, Prev: ui-motion, Up: GCL Reference 7.2.136 ui-panel ---------------- `(ui-panel PANELNAME {on|off} [WINDOW])' Do or don't display the given user-interface panel. Case is ignored in panel names. Current PANELNAMES are: geomview main panel tools movimento controls appearance appearance controls cameras ca^mera controls lighting lighting controls obscure obscure controls (doesn't seem to exist any more) materials material properties controls command command entry box credits geomview credits By default, the `geomview' and `tools' panels appear when geomview starts. If the optional Window is supplied, a `position' clause (e.g. (ui-panel obscure on { position xmin xmax ymin ymax }) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. `(ui-panel obscure on {')} causes interactive positioning.  File: geomview-pt_BR, Node: ui-pdf-viewer, Next: ui-target, Prev: ui-panel, Up: GCL Reference 7.2.137 ui-pdf-viewer --------------------- `(ui-pdf-viewer VIEWER)' Use the executable VIEWER for viewing the PDF-version of the manual when the `Manual (PDF)' menu-item is selected in the `Help'-menu. If the `(ui-pdf-viewer ...)' command was never executed, then the default is to use the browser stored in the `PDFVIEWER' environment variable. If the environment variable is unset then the default is compile-time dependent.  File: geomview-pt_BR, Node: ui-target, Next: uninterest, Prev: ui-pdf-viewer, Up: GCL Reference 7.2.138 ui-target ----------------- `(ui-target ID [yes|no])' Set the target of user actions (the selected line of the objeto alvo browser) to ID. The second argument specifies whether to make ID the current objeto regardless of its type. If `no', then ID becomes the current objeto of its type (geom or camera). The default is `yes'. This command may result in a change of modos de movimento based on target choice.  File: geomview-pt_BR, Node: uninterest, Next: update, Prev: ui-target, Up: GCL Reference 7.2.139 uninterest ------------------ `(uninterest (COMMAND [args]))' Undoes the effect of an `interest' command. (COMMAND [args]) must be identical to those used in the *Note `interest': interest. command.  File: geomview-pt_BR, Node: update, Next: update-draw, Prev: uninterest, Up: GCL Reference 7.2.140 update -------------- `(update [timestep_in_seconds])' Apply each incremental movimento once. Uses timestep if it's present and nonzero; otherwise movimentos are proportional to elapsed real time.  File: geomview-pt_BR, Node: update-draw, Next: window, Prev: update, Up: GCL Reference 7.2.141 update-draw ------------------- `(update-draw CAM-ID [timestep_in_seconds])' Apply each incremental movimento once and then draw CAM-ID. Applies `timestep' seconds' worth of movimento, or uses elapsed real time if `timestep' is absent or zero.  File: geomview-pt_BR, Node: window, Next: winenter, Prev: update-draw, Up: GCL Reference 7.2.142 window -------------- `(window CAM-ID WINDOW)' Specify attributes for the window of CAM-ID, e.g. its size or initial position, in the OOGL Window syntax. The special CAM-ID `default' specifies properties of future windows (created by *Note `camera': camera. or *Note `new-camera': new-camera.).  File: geomview-pt_BR, Node: winenter, Next: write, Prev: window, Up: GCL Reference 7.2.143 winenter ---------------- `(winenter CAM-ID)' Tell geomview that the mouse cursor is in the window of CAM-ID. This function is for development purposes and is not intended for general use.  File: geomview-pt_BR, Node: write, Next: write-comments, Prev: winenter, Up: GCL Reference 7.2.144 write ------------- `(write {command|geometry|camera|transform|ntransform|window} FILENAME [ID|(ID ...)] [self|world|universe|otherID])' write description of ID in given format to FILENAME. Last parameter chooses coordinate system for geometry & transform: self: just the objeto, no transformation or appearance (geometry only) world: the objeto as positioned within the World. universe: objeto's position in universal coordinates; includes Worldtransform other ID: the objeto transformed to otherID's coordinate system. A filename of `-' is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, `-' means geomview's standard output (*note `(command ...)': command.). The ID can either be a single id or a parenthesized list of ids, like `g0' or `(g2 g1 dodec.off)'.  File: geomview-pt_BR, Node: write-comments, Next: write-handle, Prev: write, Up: GCL Reference 7.2.145 write-comments ---------------------- `(write-comments FILENAME GEOMID PICKPATH)' write OOGL COMMENT objetos in the GEOMID hierarchy at the level of the pick path to FILENAME. Specifically, COMMENTS at level (a b c ... f g) will match pick paths of the form (a b c ... f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the `pick' command) is a list of integer counters specifying a subpart of a hierarchical OOGL objeto. Descent into a complex objeto (LIST or INST) adds a new integer to the path. Traversal of simple objetos increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire string of zero, one, or more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses. Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objetos, which can be attached to other OOGL objetos via the LIST type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned.  File: geomview-pt_BR, Node: write-handle, Next: write-sexpr, Prev: write-comments, Up: GCL Reference 7.2.146 write-handle -------------------- `(write-handle PREFIX FILENAME HANDLE)' Writes the objeto underlying the given handle to FILENAME. This function is intended for internal debugging use only.  File: geomview-pt_BR, Node: write-sexpr, Next: xform, Prev: write-handle, Up: GCL Reference 7.2.147 write-sexpr ------------------- `(write-sexpr FILENAME LISPOBJECT)' Writes the given LISPOBJECT to FILENAME. This function is intended for internal debugging use only.  File: geomview-pt_BR, Node: xform, Next: xform-incr, Prev: write-sexpr, Up: GCL Reference 7.2.148 xform ------------- `(xform ID TRANSFORM)' Concatenate TRANSFORM with the current transform of the objeto (apply TRANSFORM to objeto ID).  File: geomview-pt_BR, Node: xform-incr, Next: xform-set, Prev: xform, Up: GCL Reference 7.2.149 xform-incr ------------------ `(xform-incr ID TRANSFORM)' Apply continual movimento: concatenate TRANSFORM with the current transform of the objeto every refresh (set objeto ID's incremental transform to TRANSFORM).  File: geomview-pt_BR, Node: xform-set, Next: zoom, Prev: xform-incr, Up: GCL Reference 7.2.150 xform-set ----------------- `(xform-set ID TRANSFORM)' Overwrite the current objeto transform with TRANSFORM (set objeto ID's transform to TRANSFORM).  File: geomview-pt_BR, Node: zoom, Prev: xform-set, Up: GCL Reference 7.2.151 zoom ------------ `(zoom CAM-ID FACTOR)' Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number.  File: geomview-pt_BR, Node: Non-Euclidean Geometry, Next: Mathematica, Prev: GCL, Up: Top 8 Non-Euclidean Geometry ************************ Geomview supports hyperbolic and spherical geometry as well as Euclidean geometry. The three boto~es at the bottom of the _Main_ panel are for setting the current geometry type. In each of the three geometries, three models are supported: _Virtual_, _Projective_, and _Conformal_. You can change the current model with the _Model_ browser on the _Camera_ panel. Each Geomview ca^mera has its own model setting. The default model is all three spaces is _Virtual_. This corresponds to the ca^mera being in the same space as, and moving under the same set of transformations as, the geometry itself. In Euclidean space _Virtual_ is the most useful model. The other models were implemented for hyperbolic and spherical spaces and just happen to work in Eucldiean space as well: _Projective_ is the same as _Virtual_ but by default displays the unit sphere, and _Conformal_ displays everything inverted in the unit sphere. In hyperbolic space, the _Projective_ model setting gives a view of the projective ball model of hyperbolic 3-space imbedded in Euclidean space. The ca^mera is initially outside the unit ball. In this model, the ca^mera moves by Euclidean movimentos and geometry moves by hyperbolic movimentos. _Conformal_ model is similar but shows the conformal ball model instead. In spherical space, the _Projective_ model gives a view of half of the 3-sphere imbedded in Euclidean 3-space. Spherical movimentos give rise to projective transformations in the _Projective_ model, and to Moebius transformations in the _Conformal_ model. In both of these models the ca^mera moves by Euclidean movimentos. In _Projective_ and _Conformal_ models, the unit sphere is drawn by default. You can turn it off and on at will using the _Draw Sphere_ bota~o in the _Camera_ panel. In the _Conformal_ model, polygons and edges are subdivided as necessary to make them look curved. The parameters which determine this subdivision can be set with the `set-conformal-refine' GCL command. *Note `(set-conformal-refine ...)': set-conformal-refine. There are several sample hyperbolic space objetos in the `data/geom/hyperbolic' subdirectory of the Geomview directory. Likewise, the subdirectory `data/geom/spherical' contains several sample spherical space objetos.  File: geomview-pt_BR, Node: Mathematica, Next: Installation, Prev: Non-Euclidean Geometry, Up: Top 9 Mathematica Graphics in Geomview or RenderMan *********************************************** Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc. There are two ways to do this. 1. Use Mathematica to write a graphics objeto to a file in OOGL format or in RIB format. 2. Use Geomview as the default display for all 3D graphics output in Mathematica. You can also use these packages to save Mathematica graphics in RenderMan (RIB) format. Since the format of Mathematica graphics objetos is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either of the above you must install this package. * Menu: * OOGL.m:: Generating OOGL files in Mathematica. * Geomview.m:: Geomview as Mathematica's Default 3D Display. * RenderMan:: Generating RenderMan files in Mathematica. * Remote Display:: Using Geomview and Mathematica on different computers. * Package Details:: Some details about the packages. * Package Installation:: Installing the Mathematica->Geomview package.  File: geomview-pt_BR, Node: OOGL.m, Next: Geomview.m, Prev: Mathematica, Up: Mathematica 9.1 Using Mathematica to generate OOGL files ============================================ The package `OOGL.m' allows Mathematica to write graphics objetos in OOGL format. To use it, give the command `<< OOGL.m' to Mathematica to load the package. The `WriteOOGL[FILE,GRAPHICS]' command writes an OOGL description of the 3D graphics objeto GRAPHICS to the file named FILE. This package also provides the `Geomview' command which sends a 3D graphics objeto to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the `Geomview' command. `Geomview[GRAPHICS]' Sends the 3D graphics objeto GRAPHICS to Geomview as a geom named `Mathematica'. Subsequent usage of `Geomview[GRAPHICS]' replaces the `Mathematica' objeto in Geomview with the new GRAPHICS. ``Geomview[NAME,GRAPHICS]'' Sends the 3D graphics objeto GRAPHICS to Geomview as a geom named NAME. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objetos at once and allow independent control over them. % math Mathematica 2.0 for SGI Iris Copyright 1988-91 Wolfram Research, Inc. -- GL graphics initialized -- In[1] := <"riemann"] This displays the graphics `%3' on the remote host named `riemann'. `Geomview' recognizes the string `"local"' as a value for `$DisplayHost'; it forces the graphics to be displayed on the local machine. In addition to knowing the name of the machine you want to run Geomview on, `Geomview' needs to know the type of that machine (the setting of the CPU variable that corresponds to the machine; *note Source Code Installation::). By default, `Geomview' assumes that it is the same kind of computer as the one you are running Mathematica on. The `MachType' option lets you explicitly specify the type of the `DisplayHost' computer; it should be one of the strings `"sgi"' or `"next"' or `"x11"'. You can use `SetOptions' to change the default `DisplayHost' and `MachType'. For example, In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"] arranges for `Geomview' to run Geomview on an SGI workstation named `riemann'.  File: geomview-pt_BR, Node: Chunks, Prev: Networked Geomview, Up: Remote Display 9.4.2 Transporting Mathematica Files to Geomview by Hand -------------------------------------------------------- The auxilliary function `WriteChunk' is for those who can only use Mathematica on a computer that Geomview isn't installed on. `WriteChunk[FILE, GRAPHICS]' generates a file named FILE which contains the graphics objeto GRAPHICS in the format accepted by `math2oogl'. You can transfer that file to a computer that has Geomview installed on it and then use the programs `math2oogl', `oogl2ri'b, and `geomview' directly from the shell. These programs are distributed in the `bin/' subdirectory of the Geomview directory, and may have been installed so that they are on your `path'. In[1]:= < mma.oogl to convert it to the OOGL file `mma.oogl' which you can then view using Geomview. This is the equivalent of the `WriteOOGL' command. For a result equivalent to the `Geomview' or `Show' commands, type math2oogl -togeomview Mathematica geomview < mychunk The `WriteRI'b command can be emulated from the shell as math2oogl < mychunk | oogl2rib -n mma.tiff  File: geomview-pt_BR, Node: Package Details, Next: Package Installation, Prev: Remote Display, Up: Mathematica 9.5 Details of the Mathematica->Geomview Package ================================================ The `OOGL.m' package uses the external program `math2oogl' to convert `Graphics3D' objetos to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica. The converter will sometimes handle colored SurfaceGraphics objetos correctly that Mathematica does not handle correctly, which means that Geomview[objeto] sometimes works where Show[objeto] will give errors. The converter supports the `Polygon', `Line', and `Point' graphics primitives, `RGBColor Graphics3D' directives, and `SurfaceGraphics' objetos with or without `RGBColor' directives, and lists of any combination of these. It silently ignores all other directives. The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib). In the `WriteOOGL' and `WriteRI'b commands, filename can either be a string containing a filename, an `OutputStream' objeto, or a string starting with a `!' to send the output to a command. Objeto can be a `Graphics3D' objeto, a `SurfaceGraphics' objeto, or a list of these. The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host.  File: geomview-pt_BR, Node: Package Installation, Prev: Package Details, Up: Mathematica 9.6 Installing the Mathematica Packages ======================================= If Geomview is properly installed on your system according to the instructions in *Note Installation::, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed. In this section, the phrase _Geomview installation_ refers any of the procedures in *Note Installation::. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution. 1. The relevant mathematica files are `OOGL.m', `Geomview.m', and `BezierPlot.m'; Mathematica must be able to find these files. They are distributed in the `$GEOMROOT/mathematica' subdirectory of the binary distributions, and in the `$GEOMROOT/src/bin/geomutil/math2oogl' subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the `$Path' variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path. The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (`MMAPACKAGEDIR'). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the `$Path' variable each time you run Mathematica. 2. The package `OOGL.m' needs to be able to invoke the programs `geomview', `math2oogl', and `oogl2ri'b. The Geomview installation procedure installs these programs into a directory that you specify for executables (`BINDIR'). Ideally, this directory should be on your shell's `$path'. More specifically, it should be on the `$path' of the shell in which Mathematica runs; the directory `/usr/local/bin' is usually a good choice. You can see the list of directories on this path by giving the command `!echo $path' in Mathematica. If for some reason you can't arrange for `geomview', `math2oogl', and `oogl2ri'b to be in a directory on the shell's `$path', you can modify `OOGL.m' to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables `$GeomviewPath' and `$GeomRoot', which are defined near the top of the file. Change `$GeomviewPath' to the absolute pathname of the `geomview' shell script on your system. Change `$GeomRoot' to the absolute pathname of the `$GEOMROOT' directory on your system. If you do this, you should also make sure there are copies of `geomview', `math2oogl', and `oogl2ri'b in the `$GEOMROOT/bin/'. 3. The `geomview' shell script, which `OOGL.m' uses to invoke Geomview, needs to be able to find the geomview executable file ( called `gvx'). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the `geomview' script are correct.  File: geomview-pt_BR, Node: Installation, Next: Support, Prev: Mathematica, Up: Top 10 Installation *************** What you do to install Geomview depends on which kind of computer you have and on whether you have the source distribution or the binary distribution. In general, if you don't care about looking at Geomview's source code, you should get one of the binary distribution. The binary installation is much easier and quicker than compiling and installing the source code. * Menu: * Unix Binary Installation:: Installing the Unix Binary Distribution * Source Code Installation:: Compiling and Installing the Source Code Distribution.  File: geomview-pt_BR, Node: Unix Binary Installation, Next: Source Code Installation, Prev: Installation, Up: Installation 10.1 Installing the Unix Binary Distribution ============================================ If you have just obtained a copy of the binary distribution for a Unix system (Linux, SGI, Solaris, HP, etc), you should be able to run Geomview and make use of most of its features immediately after unpacking it by `cd''ing to the directory that it is in and typing `geomview'. In order to fully install Geomview so that you can run it from any directory and use all of its features, follow the steps in this section. In particular, you must go through this installation procedure in order to use Geomview to display Mathematica graphics. Geomview is distributed in a directory that contains various files and subdirectories that Geomview needs at run-time, such as data files and external modules. It also contains other things distributed with Geomview, such as documentation and (in the soure-code distribution) source-code. We refer to the root directory of this tree as the `$GEOMROOT' directory. This is the directory called `Geomview' that is created when you unpack the distribution file. To install Geomview on your system, arrange for the `$GEOMROOT' directory to be in a permanent place. Then, in a shell window, `cd' to that directory and type `install'. This runs a shell script which does the installation after asking you several questions about where you want to install the various components of Geomview. After running the `install' script you should now be able to run Geomview from any directory on your system. (You may need to give the `rehash' command in any shells on your computer that were started up before you did the installation.) The `install' script puts copies of the files in `$GEOMROOT/bin/' and `$GEOMROOT/man' into the directories you specified for executables and man pages, respectively. Once you have done the installation you can cut down one the disk space required by Geomview by removing some files from these directories, since copies have been installed elsewhere. You should first test that your installed Geomview works properly because once you remove these files from their distribution directories you will not be able to do the installation again. In particular, the files you can remove are `$GEOMROOT/bin/': (where `' is the type of system you are on, e.g. `linux', `sgi', `hpux', etc). Remove all files from here except `gvx', which is the geomview executable file. DO NOT REMOVE `gvx'. It is not installed elsewhere. `$GEOMROOT/man': You can remove all the files in this directory. * Menu: * Unix Binary Detail::  File: geomview-pt_BR, Node: Unix Binary Detail, Prev: Unix Binary Installation, Up: Unix Binary Installation 10.1.1 Details of the Unix Binary Installation ---------------------------------------------- The `install' script should be self-explanatory; just run it and answer the questions. This section gives some details for system administrators and other users who may want to know more about the installation. The installation is actually done by `make'; the `install' script queries the user for the settings of the following `make' variables and then invokes `make install'. `GEOMROOT': the absolute pathname of the Geomview root directory. The `geomview' shell script, which is what users invoke to run Geomview, uses this to set various environment variables that Geomview needs. It is very important that this be an _absolute_ pathname -- i.e. it should start with a '/'. `BINDIR': a directory where executable files are installed. The `geomview' shell script goes here, as well as various other auxiliary programs that can be used in conjunction with `geomview'. This should be a directory that is on users' `$path'. These auxiliary programs are distributed in the `$GEOMROOT/bin/' directory; if you specify this directory for `BINDIR', they are left in that directory. `MANDIR': a directory where Unix manual pages are installed. These are distributed in the `$GEOMROOT/man' subdirectory; if you specify this directory for `MANDIR', they are left in that directory. `MMAPACKAGEDIR': a directory where Mathematica packages are installed. This should be a directory that Mathematica searches for packages that it loads; you can see what directories your Mathematica searches by looking at the value of the `$Path' variable in a Mathematica session. The installation process will install some packages there which allow you to use Geomview to display Mathematica graphics. These packages are distributed in the `$GEOMROOT/mathematica' subdirectory; if you specify this directory for `MMAPACKAGEDIR', or if you specify the empty string for `MMAPACKAGEDIR', the packages are left in that directory. For more details about the way these Mathematica packages connect to Geomview, *note Package Installation::.  File: geomview-pt_BR, Node: Source Code Installation, Prev: Unix Binary Installation, Up: Installation 10.2 Compiling and Installing the Source Code Distribution ========================================================== The main reason to get the source code distribution is to look at and/or work with the source code. If you are only concered with _using_ Geomview it is better to get the binary distribution. It takes anywhere from a few minutes to an hour or more to compile the entire source distribution, depending on what kind of computer you have. Let `$GEOMROOT' denote the full pathname of the Geomview source code directory; this is the directory called `Geomview' that is created when you unpack the distribution. This directory contains the Geomview source code as well as various other files and subdirectories that Geomview needs when it runs. Before doing any compilation you should edit the file `$GEOMROOT/makefiles/mk.site.default'. This file defines some `make' variables which specify your local configuration. This includes the pathnames of the directories into which Geomview will be installed, and possibly some other settings as well. There are comments in the file telling you what to do. This file is included by every Makefile in the source tree, so the settings you specify here are used throughout the source. If you will be compiling for multiple systems, you can do them all in the same directory tree. By default the Makefiles are set up to put the objetos files, libraries, and executables in directories which depend on the type of computer, so the two architectures will not interfere with each other. The Makefiles use a variable called `CPU' to determine the type of machine. Before doing any compilation you must arrange for this variable to have a value. There are two ways you can do this. 1. If you will always be compiling Geomview on the same type of computer edit the file `$GEOMROOT/makefiles/Makedefs.global' to set the `CPU' variable to one of the values `linux', `FreeBSD', `sgi', `hpux', `hpux-gcc', `solaris', `sun4os4' (for Suns with SunOS 4, not Solaris), `rs6000', or `alpha'. If you're using a type of system not in this list, make up a new value for CPU, and write a `mk.' file for it patterned after the other `mk.*' in the `makefiles' subdirectory. 2. If you will be compiling on more than one type of computer you can set a shell environment variable named `CPU' to one of the values above and the Makefiles will inherit the value from the environment. Note that many of the Makefiles refer to a variable called `MACHTYPE'; this variable tells which type of graphics system to compile Geomview for. The `mk.' files set this variable for you; in most cases its value is `x11', which specifies that Geomview should be compiled for X windows. Once you have configured your source tree by editing the files as described above and setting the `CPU' variable, you can compile and install Geomview by typing `make install' in the `$GEOMROOT' directory. You can also type `make all', or equivalently just `make', to compile without installing, and then type `make install' later to install. You can use these same `make' comands in any subdirectory in the tree to recompile and/or install a part of Geomview or a module. If you want to modify the complier flags used during compilation, edit the file `$GEOMROOT/makefiles/Makedefs.global'; the `COPTS' variable specifies the flags passed to the C compiler (cc).  File: geomview-pt_BR, Node: Support, Next: Contributing, Prev: Installation, Up: Top Getting Technical Support for Geomview ************************************** There are several ways to get support for Geomview. 1. Visit the Geomview web site, `http://www.geomview.org'. It contains the latest documentation, news about development, and FAQ (Frequently Asked Questions) list. 2. Send email to the geomview-users@lists.sourceforge.net mailing list. This is a mailing list for discussing any issues related to using Geomview. To join the list, send an empty note with 'subscribe' in the subjeto line to geomview-users-request@lists.sourceforge.net (mailto:geomview-users-request@lists.sourceforge.net), or visit the list web page at `http://lists.sourceforge.net/mailman/listinfo/geomview-users'. 3. Contract with Geometry Technologies for support. Geometry Technologies is a contract support and programming company that emerged from the Geometry Center, where Geomview was written. For more information visit the Geometry Technologies web site at `http://www.geomtech.com'.  File: geomview-pt_BR, Node: Contributing, Next: Function Index, Prev: Support, Up: Top Contributing to Geomview's Development ************************************** If you are interested in contributing to the development of Geomview, there are several things you can do: 1. *Volunteer programming work*. If you are a programmer and make an improvement to Geomview, contact the other geomview authors by sending a note to the `geomview-users' mailing list (see `http://lists.sourceforge.net/mailman/listinfo/geomview-users'). 2. *Contract with Geometry Technologies*. Geometry Technologies, Inc. is a consulting firm that provides contract technical support and custom programming services in the area of 3D graphics. This includes a wide range of services related to 3D graphics, included but not limited to applications involving Geomview. To the extent that resources allow, Geometry Technologies supports the developement of Geomview; in particular it hosts the `http://www.geomview.org' web site, and its staff make ongoing improvements to Geomview itself. If you are in a position to pay for technical support or custom programming work, contracting with Geometry Technologies indirectly supports Geomview. You can also contract with with Geometry Technologies to have particular features that you want added to Geomview, or to port Geomview to a new platform. For more information see Geometry Technologies web site at `http://www.geomtech.com'. Thank you.  File: geomview-pt_BR, Node: Function Index, Next: List of Figures, Prev: Contributing, Up: Top Function Index ************** [index] * Menu: * !, shell <1>: shell. (line 6) * !, shell: shell. (line 6) * <: lt. (line 6) * =: eq. (line 6) * >: gt. (line 6) * ?: help. (line 6) * ??: morehelp. (line 6) * all: all. (line 6) * all camera: all. (line 8) * all emodule defined: all. (line 11) * all emodule running: all. (line 14) * all geometry: all. (line 6) * and: and. (line 6) * ap-override: ap-override. (line 6) * backcolor: backcolor. (line 6) * background-image: background-image. (line 6) * bbox-color: bbox-color. (line 6) * bbox-draw: bbox-draw. (line 6) * camera: camera. (line 6) * camera-draw: camera-draw. (line 6) * camera-prop: camera-prop. (line 6) * camera-reset: camera-reset. (line 6) * car: car. (line 6) * cdr: cdr. (line 6) * clock: clock. (line 6) * command: command. (line 6) * copy: copy. (line 6) * cursor-still: cursor-still. (line 6) * cursor-twitch: cursor-twitch. (line 6) * delete: delete. (line 6) * dice: dice. (line 6) * dimension: dimension. (line 6) * dither: dither. (line 6) * draw: draw. (line 6) * dump-handles: dump-handles. (line 6) * echo: echo. (line 6) * emodule-clear: emodule-clear. (line 6) * emodule-define: emodule-define. (line 6) * emodule-defined: emodule-defined. (line 6) * emodule-isrunning: emodule-isrunning. (line 6) * emodule-path: emodule-path. (line 6) * emodule-run, | <1>: emodule-run. (line 6) * emodule-run, |: emodule-run. (line 6) * emodule-sort: emodule-sort. (line 6) * emodule-start: emodule-start. (line 6) * emodule-transmit: emodule-transmit. (line 6) * escale: escale. (line 6) * event-keys: event-keys. (line 6) * event-mode: event-mode. (line 6) * event-pick: event-pick. (line 6) * evert: evert. (line 6) * exit: exit. (line 6) * ezoom: ezoom. (line 6) * freeze: freeze. (line 6) * geometry: geometry. (line 6) * geomview-version: geomview-version. (line 6) * hdefine: hdefine. (line 6) * hdelete: hdelete. (line 6) * help: help. (line 6) * hmodel: hmodel. (line 6) * hsphere-draw: hsphere-draw. (line 6) * if: if. (line 6) * inhibit-warning: inhibit-warning. (line 6) * input-translator: input-translator. (line 6) * interest: interest. (line 6) * lines-closer: lines-closer. (line 6) * load: load. (line 6) * load-path: load-path. (line 6) * look: look. (line 6) * look-encompass: look-encompass. (line 6) * look-encompass-size: look-encompass-size. (line 6) * look-recenter: look-recenter. (line 6) * look-toward: look-toward. (line 6) * merge: merge. (line 6) * merge-ap: merge-ap. (line 6) * merge-base-ap: merge-base-ap. (line 6) * merge-baseap: merge-baseap. (line 6) * morehelp: morehelp. (line 6) * name-object: name-object. (line 6) * ND-axes: ND-axes. (line 6) * ND-color: ND-color. (line 6) * ND-xform: ND-xform. (line 6) * ND-xform-get: ND-xform-get. (line 6) * ND-xform-set: ND-xform-set. (line 6) * new-alien: new-alien. (line 6) * new-camera: new-camera. (line 6) * new-center: new-center. (line 6) * new-geometry: new-geometry. (line 6) * new-reset: new-reset. (line 6) * NeXT: NeXT. (line 6) * normalization: normalization. (line 6) * not: not. (line 6) * or: or. (line 6) * pick: pick. (line 6) * pick-invisible: pick-invisible. (line 6) * pickable: pickable. (line 6) * position: position. (line 6) * position-at: position-at. (line 6) * position-toward: position-toward. (line 6) * progn: progn. (line 6) * quit: quit. (line 6) * quote: quote. (line 6) * rawevent: rawevent. (line 6) * rawpick: rawpick. (line 6) * read: read. (line 6) * real-id: real-id. (line 6) * redraw: redraw. (line 6) * regtable: regtable. (line 6) * rehash-emodule-path: rehash-emodule-path. (line 6) * replace-geometry: replace-geometry. (line 6) * rib-display: rib-display. (line 6) * rib-snapshot: rib-snapshot. (line 6) * scale: scale. (line 6) * scene: scene. (line 6) * set-clock: set-clock. (line 6) * set-conformal-refine: set-conformal-refine. (line 6) * set-emodule-path: set-emodule-path. (line 6) * set-load-path: set-load-path. (line 6) * set-motionscale: set-motionscale. (line 6) * setenv: setenv. (line 6) * sgi: sgi. (line 6) * shell, ! <1>: shell. (line 6) * shell, !: shell. (line 6) * sleep-for: sleep-for. (line 6) * sleep-until: sleep-until. (line 6) * snapshot: snapshot. (line 6) * soft-shader: soft-shader. (line 6) * space: space. (line 6) * stereowin: stereowin. (line 6) * time-interests: time-interests. (line 6) * transform: transform. (line 6) * transform-incr: transform-incr. (line 6) * transform-set: transform-set. (line 6) * ui-cam-focus: ui-cam-focus. (line 6) * ui-center: ui-center. (line 6) * ui-center-origin: ui-center-origin. (line 6) * ui-emotion-program: ui-emotion-program. (line 6) * ui-emotion-run: ui-emotion-run. (line 6) * ui-freeze: ui-freeze. (line 6) * ui-html-browser: ui-html-browser. (line 6) * ui-motion: ui-motion. (line 6) * ui-panel: ui-panel. (line 6) * ui-pdf-viewer: ui-pdf-viewer. (line 6) * ui-target: ui-target. (line 6) * uninterest: uninterest. (line 6) * update: update. (line 6) * update-draw: update-draw. (line 6) * window: window. (line 6) * winenter: winenter. (line 6) * write: write. (line 6) * write-comments: write-comments. (line 6) * write-handle: write-handle. (line 6) * write-sexpr: write-sexpr. (line 6) * xform: xform. (line 6) * xform-incr: xform-incr. (line 6) * xform-set: xform-set. (line 6) * zoom: zoom. (line 6) * |, emodule-run <1>: emodule-run. (line 6) * |, emodule-run: emodule-run. (line 6)  File: geomview-pt_BR, Node: List of Figures, Prev: Function Index, Up: Top List of Figures *************** * Menu: * Figure 2.1: Initial Geomview ...: figinitial. * Figure 2.2: Olhando para o Mundo.: figlookatworld. * Figure 2.3: A Painel Apare^ncia.: figappearance. * Figure 2.4: Painel de Escolha ...: figcolorchooser. * Figure 2.5: O Painel de Arquivos.: figfilespanel. * Figure 2.6: Trevo e Dodecaedro.: figtrefdodec. * Figure 3.1: The Main Panel: figmainpanel. * Figure 3.2: O Painel de Arquivos.: figmyfilelist. * Figure 3.3: The Load Panel.: figloadpanel. * Figure 3.4: O Painel de ...: figtools. * Figure 3.5: The Appearance Panel.: figap. * Figure 3.6: Color Chooser Panel.: figcolorchooserpanel. * Figure 3.7: The Materials Panel.: figmatpanel. * Figure 3.8: The Cameras Panel.: figcamerapanel. * Figure 3.9: The Save Panel.: figsavepanel. * Figure 3.10: The Commands Panel.: figcommandpanel. geomview-1.9.4/doc/geomview-pt_BR.html/0000777000175000001440000000000010663302002014676 500000000000000geomview-1.9.4/doc/geomview-pt_BR.html/figtrefdodec.html0000644000175000001440000000011010663302002020115 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/Copying.html0000644000175000001440000011526110663302002017116 00000000000000 Copying - Manual do Geomview

Next: , Previous: Distrib, Up: Top


Copying

     NOTA: Geomview é distribuído sob a LICENÇA PÚBLICA GERAL
     MENOR.  Para os propósitos dessa licença  nós pensamos em Geomview como se ele
     fosse uma "biblioteca", e dos módulos externos do Geomview como "programas que
     se comunicam com a biblioteca".  Fazemos isso porque queremos especificamente
     permitir que programas proprietários e módulos usem o Geomview.

GNU LESSER PUBLIC LICENSE

Version 2.1, February 1999
     Licença Pública Geral Menor do GNU
     
     This is an unofficial translation of the GNU Lesser General Public
     License into Portuguese. It was not published by the Free Software Foundation,
     and does not legally state the distribution terms for software that uses the
     GNU LGPL–only the original English text of the GNU LGPL does that. However,
     we hope that this translation will help Portuguese speakers understand the
     GNU LGPL better.
     
     Esta é uma tradução não-oficial da GNU Lesser General Public
     License para o Português. Ela não é publicada pela Free Software Foundation
     e não traz os termos de distribuição legal do software que usa a GNU LGPL – estes termos estão contidos apenas no texto da GNU LGPL original em inglês.
     No entanto, esperamos que esta tradução ajudará no
     melhor entendimento da GNU LGPL em Português.
     
     Versão 2.1, Fevereiro de 1999
     
     Copyright © 1991, 1999 Free Software Foundation, Inc.
     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA [Estados Unidos da América]
     
     É permitido a qualquer pessoa copiar e distribuir cópias
     sem alterações deste documento de licença, sendo vedada, entretanto, sua modificação.
     
     [Esta é a primeira versão da GPL Menor a ser lançada. Ela também constitui
     a sucessora da Licença Pública de Biblioteca do GNU, daí o número 2.1. da versão].
     
     [This is the first released version of the Lesser GPL.  It also counts
      as the successor of the GNU Library Public License, version 2, hence
      the version number 2.1.]

Introdução

As licenças da maioria dos softwares são elaboradas para suprimir sua liberdade de compartilhá-los e modificá-los. As Licenças Públicas do GNU, ao contrário, têm o objetivo de assegurar sua liberdade para compartilhar e modificar softwares livres para garantir que o software seja livre para todos os seus usuários.

A presente Licença Pública Geral Menor se aplica a alguns pacotes de software especialmente designados - normalmente bibliotecas - da Free Software Foundation e de outros autores que decidam utilizá-la. Você pode utilizá-la também, mas recomendamos que antes, você analise cuidadosamente se esta licença, ou a Licença Pública Geral comum, é a melhor estratégia a ser adotada em cada caso específico, tendo como base as explicações abaixo.

Quando falamos de software livre, estamos nos referindo a liberdade de uso e não de gratuidade de preço. Nossas Licenças Públicas Gerais são elaboradas para garantir que você tenha liberdade para distribuir cópias de software livre (cobrando por esse serviço se você assim o desejar); que você receba código-fonte ou o obtenha, se quiser; que você modifique o software e utilize partes dele em novos programas livres; e que você tenha ciência de que pode praticar estes atos.

A fim de proteger seus direitos, é necessário que façamos restrições que proíbam distribuídores de negar estes direitos a você ou de pedir que você que renuncie a eles. Essas restrições se traduzem em determinadas responsabilidades que você deverá assumir, se vier a distribuir cópias da biblioteca ou modificá-la.

Por exemplo, se você distribuir cópias da biblioteca, seja gratuitamente ou mediante um valor, terá de conceder a seus receptores todos os direitos que estamos concedendo a você. Você terá de garantir que eles, também, recebam ou possam obter o código fonte. Se você ligar outro código com a biblioteca, você deve fornecer os arquivos-objeto completos para os receptores, de modo que eles possam ligá-los novamente com a biblioteca após terem feito mudanças na biblioteca e recompilado a mesma. E você terá de exibir a eles esses termos, para que eles conheçam seus direitos.

Protegemos seus direitos através de um método que envolve dois passos: (1) estabelecemos direitos autorais sobre a biblioteca e (2) oferecemos a você esta licença, que dá a você permissão para copiar, distribuir e/ou modificar a biblioteca.

Para proteger cada distribuidor, queremos deixar bem claro que não há nenhuma garantia para a biblioteca livre. Além disso, se a biblioteca for modificada por alguém e passada adiante, os receptores devem saber que o que eles têm não é a versão original, de modo que a reputação do autor original não será afetada por problemas que possam ser introduzidos por outros.

Por fim, as patentes de software representam uma ameaça constante para a existência de qualquer programa livre. Queremos assegurar que uma empresa não possa efetivamente restringir os usuários de um programa livre por ter obtido uma licença restritiva de um titular de direitos de patente. Por isso, insistimos que qualquer licença de patente obtida para alguma versão da biblioteca seja consistente com a plena liberdade de uso, especificada nesta licença.

A maior parte dos softwares do GNU, incluindo algumas bibliotecas, está coberta pela Licença Pública Geral comum do GNU. A presente Licença Pública Geral Menor do GNU se aplica a determinadas bibliotecas designadas, sendo bastante diferente da Licença Pública Geral comum. Usamos esta licença para determinadas bibliotecas, a fim de permitir a ligação dessas bibliotecas a programas não-livres.

Quando um programa é ligado a uma biblioteca, seja estaticamente ou usando uma biblioteca compartilhada, essa combinação das duas é em termos legais uma obra combinada, uma derivação da biblioteca original. Por essa razão, a Licença Pública Geral comum somente permite essa ligação se a combinação como um todo atender a seus critérios de liberdade. A Licença Pública Geral Menor permite critérios mais flexíveis para a ligação de outros códigos à biblioteca.

Chamamos esta licença de Licença Pública Geral "Menor" porque ela faz Menos para proteger a liberdade do usuário do que a Licença Pública Geral comum. Ela também oferece a outros desenvolvedores de software livre uma Menor vantagem na competição com com programas não livres. Essas desvantagens são o motivo pelo qual usamos a Licença Pública Geral comum para muitas bibliotecas. Por outro lado, em determinadas circunstâncias especiais, a licença Menor oferece vantagens.

Por exemplo, em raras ocasiões, pode existir uma necessidade especial de se incentivar a mais ampla utilização possível de uma determinada biblioteca, para que ela se torne um padrão de fato. Para conseguir isso, deve-se permitir que programas não-livres utilizem a biblioteca. Um caso mais freqüente ocorre quando uma biblioteca livre desempenha a mesma função de bibliotecas não-livres amplamente usadas. Nesse caso, existem poucas vantagens em restringir a biblioteca livre somente para software livre, então utilizamos a Licença Pública Geral Menor.

Em outros casos, a permissão para usar uma determinada biblioteca em programas não-livres possibilita que um maior número de pessoas use um amplo leque de softwares livres. Por exemplo, a permissão para usar a Biblioteca C do GNU permite que muito mais pessoas usem todo o sistema operacional do GNU, bem como sua variante, o sistema operacional do GNU/Linux.

Mesmo protegendo a liberdade dos usuários em menor grau, a Licença Pública Geral Menor garante ao usuário de um programa que esteja ligado à Biblioteca a liberdade e os meios para executar o programa, usando uma versão modificada da Biblioteca.

Seguem abaixo os termos e condições exatos para a cópia, distribuição e modificação. Preste muita atenção à diferença entre uma "obra baseada na biblioteca" e uma "obra que usa a biblioteca". O primeiro contém código que é derivado da biblioteca, enquanto o segundo tem de ser combinado à biblioteca para que possa ser executado.

TERMOS E CONDIÇÕES PARA CÓPIA, DISTRIBUIÇÃO E MODIFICAÇÃO

  1. O presente Contrato de Licença se aplica a qualquer biblioteca de software ou a outro programa que contenha um aviso colocado pelo titular dos direitos autorais ou outra parte autorizada, informando que ela pode ser distribuída nos termos desta Licença Pública Geral Menor (também denominada "esta Licença"). Cada licenciado doravante será denominado "você".

    Uma "biblioteca" significa uma coleção de funções de software e/ou dados preparados, de forma a serem convenientemente ligados com programas de aplicação (que usam algumas dessas funções e dados) para formar executáveis.

    O termo "Biblioteca", abaixo, refere-se a qualquer biblioteca de software ou obra que tenha sido distribuída de acordo com esses termos. Uma "obra baseada na Biblioteca" significa tanto a Biblioteca como qualquer obra derivada, nos termos da legislação autoral: isto é, uma obra contendo a Biblioteca ou parte dela, seja sem alterações ou com modificações e/ou traduzida diretamente para outra linguagem. (Doravante, o termo "modificação" inclui, sem reservas, o termo "tradução").

    O "código-fonte" de uma obra significa o formato preferencial da obra para que sejam feitas modificações na mesma. Para uma biblioteca, o código-fonte completo significa todo o código fonte para todos os módulos contidos na mesma, além de quaisquer arquivos de definição de interface associados, além dos scripts utilizados para controlar a compilação e a instalação da biblioteca.

    Outras atividades que não a cópia, distribuição e modificação não são cobertas por esta Licença; elas estão fora de seu escopo. O ato de executar um programa usando a Biblioteca não tem restrições, e o resultado gerado a partir desse programa encontra-se coberto somente se seu conteúdo constituir uma obra baseada na Biblioteca (independente do uso da Biblioteca em uma ferramenta para escrevê-lo). Na verdade, isto dependerá daquilo que a Biblioteca faz e o que o programa que usa a biblioteca faz.

  2. Você pode copiar e distribuir cópias sem alterações do código-fonte completo da Biblioteca ao recebê-lo, em qualquer meio ou mídia, desde que publique, ostensiva e adequadamente, um aviso de direitos autorais (ou copyright) apropriado e uma notificação sobre a exoneração de garantias; mantenha intactas as informações, avisos ou notificações referentes a esta Licença e à ausência de qualquer garantia; e distribua uma cópia desta Licença junto com a Biblioteca.

    Você poderá cobrar um valor pelo ato físico de transferir uma cópia, e você pode oferecer, se quiser, a proteção de uma garantia em troca de um valor.

  3. Você pode modificar sua cópia ou cópias da Biblioteca ou qualquer parte dela, formando, assim, uma obra baseada na Biblioteca, bem como copiar e distribuir essas modificações ou obra, em conformidade com a Cláusula 1 acima, desde que atenda, ainda, a todas as seguintes condições:
    1. A obra modificada tem de ser, por si só, uma biblioteca de software.
    2. Você tem de fazer com que os arquivos modificados contenham avisos, em destaque, de que você modificou os arquivos e a data de qualquer modificação.
    3. Você tem de fazer com que a obra como um todo seja licenciada, sem nenhum custo, a todos os terceiros, de acordo com esta Licença.
    4. Se um dispositivo, na Biblioteca modificada, se referir a uma função ou a uma tabela de dados a ser fornecida por um programa de aplicação que usa esse dispositivo, outro que não um argumento transmitido quando o dispositivo é invocado, nesse caso, você terá de fazer um esforço de boa-fé para assegurar que, no caso de uma aplicação que não forneça essa função ou tabela, o dispositivo ainda assim opere, e irá realizar qualquer parte de sua finalidade que permanecer significativa.

      (Por exemplo, uma função de uma biblioteca para computar raízes quadradas tem uma finalidade que é completamente bem definida independentemente da aplicação. Por essa razão, a letra d, da Cláusula 2, exige que qualquer função ou tabela fornecida pela aplicação, usada por essa função, tem de ser opcional: se a aplicação não fornecê-la, a função de raízes quadradas deverá ainda assim computar raízes quadradas).

    Essas exigências se aplicam à obra modificada como um todo. Se partes identificáveis dessa obra não forem derivadas da Biblioteca e puderem ser consideradas razoavelmente, em si, como obras independentes e separadas, nesse caso, esta Licença e seus termos não se aplicarão a essas partes quando você distribui-las como obras separadas. Todavia, quando você distribuir essas mesmas partes como partes de um todo, que por si seja uma obra baseada na Biblioteca, a distribuição desse todo deverá ser realizada de acordo com esta Licença, cujas respectivas permissões para outros licenciados extendem-se à integralidade deste todo, dessa forma, a toda e qualquer parte, independentemente de quem a escreveu.

    Assim, esta cláusula não tem a intenção de afirmar direitos ou contestar os seus direitos sobre uma obra escrita inteiramente por você; a intenção é, antes, de exercer o direito de controlar a distribuição de obras derivadas ou obras coletivas baseadas na Biblioteca.

    Além disto, a simples agregação de outra obra, que não seja baseada na Biblioteca, à Biblioteca (ou a uma obra baseada na Biblioteca) em um volume de meio ou mídia de armazenamento ou distribuição, não inclui esta outra obra no âmbito desta Licença.

  4. Você poderá optar por aplicar os termos da Licença Pública Geral do GNU ao invés desta Licença, para uma determinada cópia da Biblioteca. Para tanto, você deverá alterar todos os avisos ou notificações que se refiram a esta Licença, para que eles se refiram à Licença Pública Geral comum do GNU, versão 2, ao invés desta Licença. (Se uma versão mais nova do que a versão 2 da Licença Pública Geral comum do GNU tiver sido gerada, então você poderá especificar essa versão, se preferir). Não faça nenhuma outra alteração nesses avisos ou notificações.

    Uma vez que essa alteração tenha sido feita em uma determinada cópia, ela é irreversível para esta cópia, passando a Licença Pública Geral comum do GNU a ser aplicada para todas as cópias e obras derivadas subseqüentes, feitas a partir dessa cópia.

    Essa opção é útil quando você desejar copiar parte do código da Biblioteca em um programa que não seja uma biblioteca.

  5. Você poderá copiar e distribuir a Biblioteca (ou uma parte ou obra derivada dela, de acordo com a Cláusula 2) em código-objeto ou formato executável, sob as Cláusulas 1 e 2 acima, desde que inclua todo o código-fonte correspondente, passível de leitura pela máquina, que deve ser distribuído sob os termos das Cláusulas 1 e 2 acima, em um meio ou mídia costumeiramente utilizado para o intercâmbio de software.

    Se a distribuição do código-objeto for feita pela oferta de acesso para cópia a partir de um local designado, então a permissão de acesso equivalente para copiar o código-fonte a partir do mesmo local atende a exigência de distribuição do código-fonte, mesmo que terceiros não sejam levados a copiar a fonte junto com o código-objeto.

  6. Um programa que não contenha nenhum derivativo de qualquer parte da Biblioteca, mas que seja desenhado para operar com a Biblioteca ao ser compilado ou ligado a ela, é chamado de uma "obra que usa a Biblioteca". Essa obra, isoladamente, não é uma obra derivada da Biblioteca e, portanto, fica de fora do âmbito desta Licença.

    Entretanto, a ligação de uma "obra que usa a Biblioteca" com a Biblioteca constitui um executável que é um derivado da Biblioteca (pois contém partes da Biblioteca), e não uma "obra que usa a Biblioteca". O executável é, assim, coberto por esta Licença. A Cláusula 6 estabelece os termos para a distribuição desses executáveis.

    Quando uma "obra que usa a Biblioteca" usar material de um arquivo de cabeçalho que é parte da Biblioteca, o código-objeto para a obra poderá ser uma obra derivada da Biblioteca, mesmo que o código-fonte não o seja. Para que isto seja verdade, é especialmente importante se a obra pode ser ligada sem a Biblioteca, ou se a obra é, em si mesma, uma biblioteca. O limiar para que isto seja verdade não é definido com precisão pela lei.

    Se um arquivo-objeto usar somente parâmetros numéricos, layouts e accessors da estrutura de dados, bem como pequenas macros e pequenas funções inline (dez linhas ou menos de extensão), então o uso do arquivo-objeto não é restrito, independente de ser ele legalmente uma obra derivada. (Executáveis contendo este código-objeto mais partes da Biblioteca continuam submetidos aos termos da Cláusula 6).

    Do contrário, se a obra for um derivado da Biblioteca, você poderá distribuir o código objeto da obra sob os termos da Cláusula 6. Quaisquer executáveis contendo esta obra também se submetmem à Cláusula 6, estejam ou não diretamente ligados à Biblioteca em si.

  7. Como exceção à Cláusula acima, você também pode combinar ou ligar uma "obra que usa a Biblioteca" à Biblioteca para produzir uma obra contendo partes da Biblioteca e distribuí-la de acordo com os termos de sua escolha, desde que estes termos permitam modificações na obra para uso próprio por parte do cliente e engenharia reversa para depuração dessas modificações.

    Em cada cópia da obra, você terá de colocar um aviso, em destaque, de que a Biblioteca foi usada e que ela e seu uso estão cobertos por esta Licença. Você deverá fornecer uma cópia desta Licença. Se, durante a execução, a obra exibir avisos ou notificações de direitos autorais (ou copyright), você terá de incluir, entre eles, o aviso de direitos autorais (ou copyright) referente à Biblioteca, bem como uma referência direcionando o usuário para a cópia desta Licença. Além disso, você dever tomar ao menos uma das seguintes providências:

    1. Incluir na obra todo o código-fonte da Biblioteca, passível de leitura pela máquina, incluindo quaisquer modificações que foram usadas na obra (as quais devem ser distribuídas conforme as Cláusulas 1 e 2 acima); e, se a obra for um executável ligado à Biblioteca, com toda a "obra que usa a Bilblioteca" passível de leitura pela máquina, como código-objeto e/ou código-fonte, de modo que o usuário possa modificar a biblioteca e, depois, religar para produzir um executável modificado contendo a Biblioteca modificada. (Fica entendido que o usuário que modificar o conteúdo dos arquivos de definições da Biblioteca não necessariamente será capaz de recompilar a aplicação para usar as definições modificadas).
    2. Usar um mecanismo adequado de biblioteca compartilhada para ligar com a Biblioteca. Um mecanismo adequado é aquele que (a) usa, ao tempo da execução, uma cópia da biblioteca já presente no sistema do computador do usuário, e (2) irá operar adequadamente com uma versão modificada da biblioteca, se o usuário instalar uma, desde que a versão modificada seja compatível com a interface da versão com a qual a obra foi feita.
    3. Incluir na obra uma oferta por escrito, válida por pelo menos 3 anos, oferencendo ao mesmo usuário os materiais especificados na letra "a" da Cláusula 6 acima, por um custo não superior ao custo de fazer esta distribuição.
    4. Se a distribuição da obra for feita com a permissão de acesso para copiar, a partir de um local designado, oferecer acesso equivalente para copiar os materiais acima especificados, a partir do mesmo local.
    5. Certificar-se se o usuário já recebeu uma cópia desses materiais ou de que você já enviou uma cópia a esse usuário.

    Para um executável, o formato exigido da "obra que usa a Biblioteca" deve incluir quaisquer dados e programas utilitários necessários para reprodução do executável a partir dele. Todavia, como uma exceção especial, os materiais a serem distribuídos não necessitam incluir algo que seja normalmente distribuído (tanto no formato fonte quanto binário) com os componentes mais importantes (compilador, kernel, e assim por diante) do sistema operacional no qual executável é executado, a menos que esse componente, em si, acompanhe o executável.

    Pode ocorrer que essa exigência contradiga as restrições da licença de outras bibliotecas proprietárias que normalmente não acompanham o sistema operacional. Essa contradição significa que você não pode utilizar ambas e a Biblioteca juntas em um executável distribuído por você.

  8. Você pode colocar dispositivos da biblioteca que sejam uma obra baseada na Biblioteca lado-a-lado em uma única biblioteca junto com outros dispositivos de bibliotecas, desde que uma distribuição separada da obra baseada na Biblioteca e dos outros dispositivos de bibliotecas seja, de outro modo, permitida e desde que você tome uma das seguintes providências:
    1. Incluir na biblioteca combinada uma cópia dessa obra baseada na Biblioteca sem a combinação com quaisquer outros dispositivos de biblioteca. Essa cópia tem de ser distribuída de acordo com as condições das cláusulas acima.
    2. Junto com a biblioteca combinada, fornecer um aviso, em destaque, sobre o fato de que parte dela é uma obra baseada na Biblioteca, e explicando onde encontrar o formato não combinado incluso dessa mesma obra.
  9. Você não poderá copiar, modificar, sublicenciar, ligar, ou distribuir a Biblioteca, exceto conforme expressamente disposto nesta Licença. Qualquer tentativa de, de outro modo, copiar, modificar, sublicenciar, ligar ou distribuir a Biblioteca é inválida, e automaticamente terminará seus direitos sob esta Licença. Todavia, terceiros que tiverem recebido cópias ou direitos de você, de acordo com esta Licença, não terão seus direitos rescindidos, enquanto estes terceiros mantiverem o seu pleno cumprimento.
  10. Você não é obrigado a aceitar esta Licença, uma vez que você não a assinou. Entretanto, nada mais concede a você permissão para modificar ou distribuir a Biblioteca ou suas obras derivadas. Esses atos são proibidos por lei se você não aceitar esta Licença. Portanto, ao modificar ou distribuir a Biblioteca (ou qualquer obra baseada na Biblioteca), você manifesta sua aceitação desta Licença para fazê-lo, bem como de todos os seus termos e condições para cópia, distribuição ou modificação da Biblioteca ou obras nela baseadas.
  11. A cada vez que você redistribuir a Biblioteca (ou qualquer obra nela baseada), o receptor automaticamente recebe uma licença do licenciante original para copiar, distribuir, ligar ou modificar a Biblioteca, sujeito a estes respectivos termos e condições. Você não poderá impor quaisquer restrições adicionais ao exercício, pelos receptores, dos direitos concedidos por este instrumento. Você não tem responsabilidade de promover o cumprimento desta licença por parte de terceiros.
  12. Se, como resultado de uma sentença judicial ou alegação de violação de patente, ou por qualquer outro motivo (não restrito às questões de patentes), forem impostas a você condições (tanto através de mandado judicial, contrato ou qualquer outra forma) que contradigam as condições desta Licença, você não estará desobrigado quanto às condições desta Licença. Se você não puder atuar como distribuidor de modo a satisfazer simultaneamente suas obrigações sob esta Licença e quaisquer outras obrigações pertinentes, então, como conseqüência, você não poderá distribuir a Biblioteca de nenhuma forma. Por exemplo, se uma licença sob uma patente não permite a redistribuição por parte de todos aqueles que tiverem recebido cópias, direta ou indiretamente de você, sem o pagamento de royalties, então, a única forma de cumprir tanto com esta exigência quanto com esta licença será deixar de distribuir, por completo, a Biblioteca.

    Se qualquer parte desta Cláusula for considerada inválida ou não executável, sob qualquer circunstância específica, o restante da cláusula deverá continuar a ser aplicado e a cláusula, como um todo, deverá ser aplicada em outras circunstâncias.

    Esta cláusula não tem a finalidade de induzir você a infringir quaisquer patentes ou direitos de propriedade, nem de contestar a validade de quaisquer reivindicações deste tipo; a única finalidade desta cláusula é proteger a integridade do sistema de distribuição do software livre, o qual é implementado mediante práticas de licenças públicas. Muitas pessoas têm feito generosas contribuições à ampla gama de software distribuído através desse sistema, confiando na aplicação consistente deste sistema; cabe ao autor/doador decidir se deseja distribuir software através de qualquer outro sistema e um licenciado não pode impor esta escolha.

    Esta cláusula visa deixar absolutamente claro o que se acredita ser uma conseqüência do restante desta Licença.

  13. Se a distribuição e/ou uso da Biblioteca for restrito em determinados países, tanto por patentes ou por interfaces protegidas por direito autoral, o titular original dos direitos autorais que colocar a Biblioteca sob esta Licença poderá acrescentar uma limitação geográfica de distribuição explícita excluindo esses países, de modo que a distribuição seja permitida somente nos países ou entre os países que não foram excluídos dessa forma. Nesse caso, esta Licença passa a incorporar a limitação como se esta tivesse sido escrita no corpo desta Licença
  14. A Free Software Foundation [Fundação Software Livre] poderá de tempos em tempos publicar versões revisadas e/ou novasda Licença Pública Geral Menor. Essas novas versões serão semelhantes em espírito à presente versão, podendo, porém, ter diferenças nos detalhes, para tratar de novos problemas ou preocupações.

    Cada versão recebe um número distinto de versão. Se a Biblioteca especificar um número de versão desta Licença, aplicável à Biblioteca ou a "qualquer versão posterior", você terá a opção de seguir os termos e condições tanto daquela versão como de qualquer versão posterior publicada pela Free Software Foundation. Se a Biblioteca não especificar um número de licença da versão, você poderá escolher qualquer versão já publicada pela Free Software Foundation.

  15. Se você desejar incorporar partes da Biblioteca em outros programas livres cujas condições de distribuição sejam incompatíveis com estas, escreva ao autor para solicitar permissão. Para software cujos direitos autorais pertencerem à Free Software Foundation, escreva à Fundação; algumas vezes, fazemos exceções nesse sentido. Nossa decisão será guiada pelos dois objetivos de preservar a condição livre de todos os derivados de nosso software livre e de promover o compartilhamento e reutilização de softwares, de modo geral.

    EXCLUSÃO DE GARANTIA

  16. COMO A BIBLIOTECA É LICENCIADA SEM CUSTO, NÃO HÁ NENHUMA GARANTIA PARA A BIBLIOTECA, NO LIMITE PERMITIDO PELA LEI APLICÁVEL. EXCETO QUANDO DE OUTRA FORMA ESTABELECIDO POR ESCRITO, OS TITULARES DOS DIREITOS AUTORAIS E/OU OUTRAS PARTES FORNECEM A BIBLIOTECA "NO ESTADO EM QUE SE ENCONTRA", SEM NENHUMA GARANTIA DE QUALQUER TIPO, TANTO EXPRESSA COMO IMPLÍCITA, INCLUINDO, DENTRE OUTRAS, AS GARANTIAS IMPLÍCITAS DE COMERCIABILIDADE E ADEQUAÇÃO PARA UMA FINALIDADE ESPECÍFICA. O RISCO INTEGRAL QUANTO À QUALIDADE E DESEMPENHO DA BIBLIOTECA É ASSUMIDO POR VOCÊ. CASO A BIBLIOTECA CONTENHA DEFEITOS, VOCÊ ARCARÁ COM OS CUSTOS DE TODOS OS SERVIÇOS, REPAROS OU CORREÇÕES NECESSÁRIAS.
  17. EM NENHUMA CIRCUNSTÂNCIA, A MENOS QUE EXIGIDO PELA LEI APLICÁVEL OU ACORDADO POR ESCRITO, QUALQUER TITULAR DE DIREITOS AUTORAIS OU QUALQUER OUTRA PARTE QUE POSSA MODIFICAR E/OU REDISTRIBUIR A BIBLIOTECA, CONFORME PERMITIDO ACIMA, SERÁ RESPONSÁVEL PARA COM VOCÊ POR DANOS, INCLUINDO ENTRE OUTROS QUAISQUER DANOS GERAIS, ESPECIAIS, FORTUITOS OU EMERGENTES, ADVINDOS DO USO OU IMPOSSIBILIDADE DE USO DA BIBLIOTECA (INCLUINDO, ENTRE OUTROS, PERDA DE DADOS, DADOS SENDO GERADOS DE FORMA IMPRECISA, PERDAS SOFRIDAS POR VOCÊ OU TERCEIROS OU A IMPOSSIBILIDADE DA BIBLIOTECA DE OPERAR COM QUALQUER OUTRO SOFTWARE), MESMO QUE ESSE TITULAR, OU OUTRA PARTE, TENHA SIDO AVISADO SOBRE A POSSIBILIDADE DESSES DANOS.

FINAL DOS TERMOS E CONDIÇÕES

Como Aplicar Estes Termos para Suas Novas Bibliotecas

Se você desenvolver uma nova biblioteca e quiser que ela seja da maior utilidade possível para o público, nós recomendamos fazer dela um software livre que todos possam redistribuir e modificar. Você pode fazer isto permitindo a redistribuição sob estes termos (ou, alternativamente, sob os termos da Licença Pública Geral comum)

Para fazer isto, anexe as notificações seguintes à biblioteca. É mais seguro anexá-las ao começo de cada arquivo-fonte, de modo a transmitir do modo mais eficiente a exclusão de garantia; e cada arquivo deve ter ao menos a linha de "direitos autorais reservados" e uma indicação de onde a notificação completa se encontra.

     uma linha para informar o nome da biblioteca e uma breve idéia do que ela faz.
     Direitos Autorais Reservados (C) <ano>  nome do autor
     
     Esta biblioteca é software livre; você pode redistribuí-la e/ou
     modificá-la sob os termos da Licença Pública Geral
     Menor do GNU conforme publicada pela Free Software Foundation; tanto a
     versão 2.1 da Licença, ou (a seu critério) qualquer versão posterior.
     
     Esta biblioteca é distribuído na expectativa de que seja útil,
     porém, SEM NENHUMA GARANTIA; nem mesmo a garantia implícita de
     COMERCIABILIDADE OU ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública
     Geral Menor do GNU para mais detalhes.
     
     Você deve ter recebido uma cópia da Licença Pública Geral Menor
     do GNU junto com esta biblioteca; se não, escreva para a Free Software
     Foundation, Inc., no endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.

Inclua também informações sobre como contatar você por correio eletrônico e por meio postal. Você também pode solicitar a seu empregador (se você for um programador) ou a sua instituição acadêmica, se for o caso, para assinar uma "renúncia de direitos autorais" sobre a biblioteca, se necessário. Segue um exemplo; altere os nomes:

     A Yoyodyne Ltda., neste ato, renuncia a todos eventuais direitos autorais sobre a
     biblioteca 'Frob' (uma biblioteca para ajustar fechaduras), escrita por James
     Random Hacker.
     
     <Assinatura de Ty Coon>, 1 de abril de 1990
     Ty Coon, Presidente

Isso é tudo! geomview-1.9.4/doc/geomview-pt_BR.html/quote.html0000644000175000001440000000316110663302002016636 00000000000000 quote - Manual do Geomview

Next: , Previous: quit, Up: GCL Reference


7.2.97 quote

(quote EXPR)
returns the symbolic lisp expression EXPR without evaluating it.
geomview-1.9.4/doc/geomview-pt_BR.html/Unix-Binary-Detail.html0000644000175000001440000001015010663302002021042 00000000000000 Unix Binary Detail - Manual do Geomview

10.1.1 Details of the Unix Binary Installation

The install script should be self-explanatory; just run it and answer the questions. This section gives some details for system administrators and other users who may want to know more about the installation.

The installation is actually done by make; the install script queries the user for the settings of the following make variables and then invokes make install.

GEOMROOT:
the absolute pathname of the Geomview root directory. The geomview shell script, which is what users invoke to run Geomview, uses this to set various environment variables that Geomview needs. It is very important that this be an absolute pathname — i.e. it should start with a '/'.
BINDIR:
a directory where executable files are installed. The geomview shell script goes here, as well as various other auxiliary programs that can be used in conjunction with geomview. This should be a directory that is on users' $path. These auxiliary programs are distributed in the $GEOMROOT/bin/<MACHTYPE> directory; if you specify this directory for BINDIR, they are left in that directory.
MANDIR:
a directory where Unix manual pages are installed. These are distributed in the $GEOMROOT/man subdirectory; if you specify this directory for MANDIR, they are left in that directory.
MMAPACKAGEDIR:
a directory where Mathematica packages are installed. This should be a directory that Mathematica searches for packages that it loads; you can see what directories your Mathematica searches by looking at the value of the $Path variable in a Mathematica session. The installation process will install some packages there which allow you to use Geomview to display Mathematica graphics. These packages are distributed in the $GEOMROOT/mathematica subdirectory; if you specify this directory for MMAPACKAGEDIR, or if you specify the empty string for MMAPACKAGEDIR, the packages are left in that directory. For more details about the way these Mathematica packages connect to Geomview, see Package Installation.
geomview-1.9.4/doc/geomview-pt_BR.html/pick_002dinvisible.html0000644000175000001440000000343310663302002021063 00000000000000 pick-invisible - Manual do Geomview

Next: , Previous: pick, Up: GCL Reference


7.2.90 pick-invisible

(pick-invisible [yes|no])
Selects whether picks should be sensitive to objetos whose appearance makes them invisible; default yes. With no arguments, returns current status.
geomview-1.9.4/doc/geomview-pt_BR.html/dimension.html0000644000175000001440000000347510663302002017476 00000000000000 dimension - Manual do Geomview

Next: , Previous: dice, Up: GCL Reference


7.2.28 dimension

(dimension [N])
Sets or reads the space dimension for N-dimensional viewing. (Since calculations are done using homogeneous coordinates, this means matrices are (N+1)x(N+1).) With no arguments, returns the current dimension, or 0 if N-dimensional viewing has not been enabled.
geomview-1.9.4/doc/geomview-pt_BR.html/merge_002dap.html0000644000175000001440000000350510663302002017650 00000000000000 merge-ap - Manual do Geomview

Next: , Previous: merge, Up: GCL Reference


7.2.70 merge-ap

(merge-ap GEOM-ID APPEARANCE)
Merge in some appearance characteristics to GEOM-ID. Appearance parameters include surface and line color, shading style, line width, and lighting.
geomview-1.9.4/doc/geomview-pt_BR.html/ND_002dxform_002dset.html0000644000175000001440000000414210663302002021044 00000000000000 ND-xform-set - Manual do Geomview

Next: , Previous: ND-xform-get, Up: GCL Reference


7.2.79 ND-xform-set

(ND-xform-set OBJID [ntransform { idim odim ... }])
Sets the N-D transform of the given objeto. In dimension N, this is an (N+1)x(N+1) matrix, so in that case idim and odim are expected to be both equal to (N+1). Note that all câmeras in a camera-cluster have the same N-D transform. Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.
geomview-1.9.4/doc/geomview-pt_BR.html/lines_002dcloser.html0000644000175000001440000000413710663302002020554 00000000000000 lines-closer - Manual do Geomview

Next: , Previous: interest, Up: GCL Reference


7.2.61 lines-closer

(lines-closer CAM-ID DIST)
Draw lines (including edges) closer to the câmera than polygons by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default. If DIST is too small, a line lying on a surface may be dotted or invisible, depending on the viewpoint. If DIST is too large, lines may appear in front of surfaces that they actually lie behind. Good values for DIST vary with the scene, viewpoint, and distance between near and far clipping planes. This feature is a kludge, but can be helpful.
geomview-1.9.4/doc/geomview-pt_BR.html/figcolorchooser.html0000644000175000001440000000011310663302002020662 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/image.html0000644000175000001440000003541610663302002016573 00000000000000 image - Manual do Geomview

Next: , Previous: appearance, Up: Non-geometric objects


4.3.2 Image Objects

Image objetos are used to specify pixmap data for either textures (see Texture Mapping), or for background images of câmeras (see Camera objects).

At the time of this writing images are comprised of 1 to 4 channels, a channel provides a single number in the range from 0 to maxval for each pixel; and maxval is tied to 255. The interpretation of the image data depending on the number of channels is like follows:

#Channels Channel No. Interpretation
1 1 greyscale or luminance data
2 1 greyscale or luminance data
2 alpha channel (0: transparent, maxval: opaque)
3 1 red channel
2 green channel
3 blue channel
4 1 red channel
2 green channel
3 blue channel
4 alpha channel (0: transparent, maxval: opaque)

Image data can be specified inline (embedded into the current data stream) or via file references; in both cases the data is read in and interpreted at the time the image objeto is parsed. This is different from the old (and deprecated) texture image specification, where the the image data on-disk would eventually be re-read by Geomview.

The general syntax of image objetos is like follows:

     <image> ::=
       [ "{" ]             (curly brace, generally needed to make
                            the end of the objeto unambiguous.)
       [ "image" ]          (optional keyword; unnecessary if the type
                            is determined by the context, which it
                            usually is.)
       [ "define" <name> ]
                            (defines an image named <name>, setting
                            its value from the stuff which follows)
       |
           "<" <filename>   (meaning: read image from that file)
       |
           ":" <name>       (meaning: use variable name,
                            defined elsewhere; if undefined the image
                            carries no data)
       |
                            (actual stuff defining the image; image data
                            must come last, after defining the width and
                            height and number of channels)
     
           "width"          (width of the image, auto-detected from image data
                            if possible)
     
           "height"         (height of the image, auto-detected from image data
                            if possible)
     
           "channels"       (number of channels, auto-detected from image data
                            and data specifications, if possible)
     
           "maxval"         (unsupported, must be 255 if specified)
     
           "data DESTMASK [FILTER] [{] < FILENAME [}]"
           "data DESTMASK [FILTER] DATASIZE [{][\n]LITERAL_IMAGE_DATA[}]"
                            (either external or embedded image data, see below
                            for a detailed description of the meaning of
                            MASK and FILTER. An image can (and
                            has, in general) multiple data sections.)
     
       [ "}" ]             (matching curly brace)

Details concerning the image data specification:

`DESTMASK'
This is a bit-field describing where the specified image data should be placed in the destination pixmap. The bit-field is specified by an integer in one of the known formats (decimal, octal, hexadecimal). The channels of the source data are always enumbered consecutively. If, e.g. `FILENAME' or `LITERAL_IMAGE_DATA' specify a three-channel (probably RGB ...) image and `DESTMASK' equals 0xD (i.e. bit 1 is 0), then the 3rd channel of the source pixmap would be placed in the 4th channel of the destination image objeto (the alpha channel), the 2nd source channel would determine the `blue' destination value and the 1st source channel the `red' destination value.

The number of channels of the source data always has to match the number of bits set in `DESTMASK'. Exception: if the source pixmap has only one channel, then it can be used to fill any number of destination channels; all channels specified in `DESTMASK' are filled with the data of the single channel source pixmap.

Geomview knows the following symbolic constants, which can be used instead of specifying the `DESTMASK' bit-field numerically:

LUMINANCE
same as `1', `0x1', `\01'
LUMINANCE_ALPHA
same as `3', `0x3', `\03'
RGB
same as `7', `0x7', `\07'
RGBA
same as `15', `0xf', `\017'
ALPHA
depends on the context: the absolute number of channels must be known; i.e. `data ALPHA ...' must be prepended by something determining the number of channels of the image, e.g.
               ...
               data RGB ...
               data ALPHA
               ...
          

is valid, but

               <no other channel or image data specification>
               data ALPHA ...
               <whatever else ...>
          

is not valid, because Geomview has not means to determine the destination channel from the context.

AUTO
PGM image data is interpreted as single grey-scale channel, RGB PNM data as RGB image data. AUTO cannot work with `raw' image data.

`FILTER'
The `FILTER' specification is optional. If it is missing, then Geomview tries to determine the image type from the `FILENAME' suffix. If there is no suffix or the suffix is unknown, or for embedded image data, Geomview is able to auto-detectc SGI image file formats (for historical reasons ...) and NetPBM image formats (for practical reasons). The auto-detection of NetPBM formats includes the new PAM image format which allows (among other things) to store an alpha channel together with the luminance or RGB data. Likewise, the final output of any of the specified filters must either be in SGI image file format, or specify a PAM, PNM or PGM image. If the image file format cannot be determined by either the filenmae suffix or the filter specification or by auto-deteciong of SGI or NetPBM data, then Geomview assume that it is raw-data. See below.

The decompression filters may be prepended to either one of the know image formats or an explicitly specified filter, e.g. the following is valid:

          data LUMINANCE raw.gzip { < gzippedgreymapfile }
     

The above should be equivalent to

          data LUMINANCE raw { < greymapfile },
     

provided that the decompressed data carries single channel data, with the first pixel corresponding to the lower-left corner (because of the `raw' image format, see below).

Geomview has builtin knowledge for the following filters/suffixes:

Data Decompression
`z'
`gz'
`gzip'
data is piped through `gzip -dc'
`bz2'
`bzip2'
data is piped through `bzip2 -dc'

Image Formats
`tiff'
`tif'
TIFF image file format. Only supported if the tifftopnm executable can be fond in the current excution path.
`png'
PNG image file format. Only supported if the pngtopnm executable can be fond in the current excution path.
`jpg'
`jpeg'
JPEG image file format. Only supported if the jpegtopnm executable can be fond in the current excution path.
`gif'
GIF image file format. Only supported if the giftoppm executable can be fond in the current excution path.
`raw'
Raw image data; the number of channels must match the number of bits set in `DESTMASK'. Pixels are specified with 1 byte per channel. The pixels are organized in rows as `liminance[-alpha]' or `RGB[A]' samples. The left-most pixel is the first pixel in each data-row, the top-most image row must come first (this is just the same as the NetPBM convention, the image co-ordinate systems has its origin in the left/top corner, as usual).

Explicitly Specified Filters
If none of the suffixes specified above should match, then the suffix/filter is interpreted as an external filter program; the filter program must read from STDIN and write to STDOUT. The output must either be in SGI image format, or in PNM or PGM format. Otherwise the output data is interpreted as raw image data (see above).

Something like the following should work, provided that the program ${HOME}/bin/bububfilter exists, is executable and does something useful:

               ...
               data RGB "${HOME}/bin/bububfilter.bzip2" 7 { # binary data follows
               bububub
               }
               ...
          

Note that – prior to feeding the data to the `bububfilter' – Geomview will try to decompress the stuff with `bzip2 -dc'.

Missing image data: Normally, the number of image channels is determined automatically from the image data specifications; if the image specification carries an explicit number of channels via the channels keyword which exceeds the number of channels found in the image data specifications, or if the union of all `DESTMASK' specfications has holes, then missing luminance and RGB channels are initialized to 0, and a missing alpha-channel is initialized to maxval, i.e. omitting the alpha channel data for an RGBA image is just the same as defining an RGB image. geomview-1.9.4/doc/geomview-pt_BR.html/System-Module-Installation.html0000644000175000001440000000627610663302002022661 00000000000000 System Module Installation - Manual do Geomview

6.7.2 System Module Installation

To install a module so that it is available to all Geomview users do the following

1.
Create a file called .geomview-module where module is the name of the module. This file should contain a single line which is an emodule-define command for that module:
          (emodule-define "New Module" "newmodule")
     

The first argument, "New Module" above, is the string that will appear in the Modules browser. The second string, "newmodule" above, is the Bourne shell command for invoking the module. It may include arguments, and you may assume that the module is on the $path searched by the shell.

2.
Put a copy of the .geomview-module and the module executable itself in Geomview's modules/<CPU> directory, where <CPU> is your system type.

After these steps, the new module should appear, in alphabetical position, in the Modules browser of Geomview's Main panel next time Geomview is run. The reason this works is that when Geomview is invoked it processes all the .geomview-* files in its modules directory. It also remembers the pathname of this directory and prepends that path to the $path of the shell in which it invokes such a module. geomview-1.9.4/doc/geomview-pt_BR.html/Surface-normal-directions.html0000644000175000001440000000433010663302002022517 00000000000000 Surface normal directions - Manual do Geomview

4.1.5 Surface normal directions

Geomview uses normal vectors to determine how an objeto is shaded. The direction of the normal is significant in this calculation.

When normals are supplied with an objeto, the direction of the normal is determined by the data given.

When normals are not supplied with the objeto, Geomview computes normal vectors automatically; in this case normals point toward the side from which the vertices appear in counterclockwise order.

On parametric surfaces (Bezier patches), the normal at point P(u,v) is in the direction dP/du cross dP/dv. geomview-1.9.4/doc/geomview-pt_BR.html/ND-Transformation-matrices.html0000644000175000001440000000506010663302002022613 00000000000000 ND Transformation matrices - Manual do Geomview

4.1.7 ND Transformation matrices

In the context of N-dimensional space (N < 3) some objetos incorporate (N+1)x(N+1) real matrices for homogeneous objeto transformations. These matrices act by multiplication on the right of vectors. Thus, if p is an (N+1)-element row vector representing homogeneous coordinates of a point in the OOGL objeto, and A (N+1)x(N+1) is the matrix, then the transformed point is p' = p A.

Note that (unlike for the 4x4 transformation matrices, see Transformation matrices) the homogeneous component is located at index zero, so the translation components for Euclidean transformations appear in the zero-th row (first (N+1) elements). A's first column (at column index zero) is typically 1, 0, ..., 0. geomview-1.9.4/doc/geomview-pt_BR.html/Pronunciation.html0000644000175000001440000000407110663302002020332 00000000000000 Pronunciation - Manual do Geomview

Next: , Previous: Platforms, Up: Top


How to Pronounce “Geomview“

A palavra 'Geomview' é uma combinação da primeira sílaba da palavra 'geometry', e da palavra 'view'. Os autores pronunciam Geomview como uma palavra oxítona, isto é, tonicidade na primeira sílaba.

       GE-om-view

Algumas pessoas colocam a tonicidade na segunda sílaba, onde Geomview cai na palavra 'geometry', mas os autores originais, que criaram o nome, preferem a pronúncia com tonicidade na primeira sílaba. geomview-1.9.4/doc/geomview-pt_BR.html/not.html0000644000175000001440000000334210663302002016302 00000000000000 not - Manual do Geomview

Next: , Previous: normalization, Up: GCL Reference


7.2.87 not

(not EXPR)
Evaluates EXPR; if EXPR returns a non-nil value, returns nil, if EXPR returns nil, return t.
geomview-1.9.4/doc/geomview-pt_BR.html/ntransform.html0000644000175000001440000001320210663302002017667 00000000000000 ntransform - Manual do Geomview

Next: , Previous: transform, Up: Non-geometric objects


4.3.4 ND-Transform Objects

Where – in the context of ND-viewing – a single (N+1)x(N+1) matrix is expected – as in the INST ntransform field, or the ND-xform* (see GCL) commands – use an ntransform objeto.

ntransform are NRows x NCols transformation matrix where usually NRows = N+1 in the context of N-dimensional objetos and viewing. The homogeneous component of an ntransform sits at column zero (in contrast to ordinary transform objetos where it is located at column three). ntransform objetos operate on points of any dimension: if a point is to be transformed by an ntransform objeto and the dimension of the point does not match the number of rows of the ntransform objeto, then either the point is implicitly padded with zeros to match NRows or the matrix is implicitly padded with ones down its diagonal (and zeros everywhere else) such that it will operate as identity on the excess dimensions of the input point.

Syntax for an ntransform objeto is

     <ntransform> ::=
       [ "{" ]             (curly brace, generally needed to make
                            the end of the objeto unambiguous.)
     
        [ "ntransform" ]    (optional keyword; unnecessary if the type
                            is determined by the context, which it
                            usually is.)
     
        [ "define" <name> ]
                            (defines a transform named <name>, setting
                            its value from the stuff which follows)
     
          NRows NCols
                            (number of rows and columns of the matrix,
                            typically N+1 N+1, but any dimensions
                            are possible)
          <NRows x NCols floating-point numbers>
                            (interpreted as a NRows x NCols
                            homogeneous transform given row by row, intended
                            to apply to a row vector multiplied on its LEFT,
                            so that e.g. Euclidean translations appear in the
                            top row -- in contrast to the ordinary
                            transform objetos where the translations appear
                            in the bottom row)
        |
           "<" <filename>  (meaning: read transform from that file)
        |
           ":" <name>      (meaning: use variable <name>,
                           defined elsewhere; if undefined the initial
                           value is the identity transform)
     
      [ "}" ]             (matching curly brace)

The whole should be enclosed in { braces }. Braces are not necessarily essential, so e.g. two integers – NRows NCols – followed by a NRows x NCols array of floats standing alone may but needn't have braces.

Some examples, in contexts where they might be used:

     # Example 1: A GCL command to define a 6x6 transform called
     # "fred", a mere translation by the vector -3 0 1 1 0. This
     # transform is meant for a five dimensional space, with an homogeneous
     # component a index zero.
     
     (read ntransform { ntransform  define fred
              6 6
              1 -3 0 1 1 0
              0  1 0 0 0 0
              0  0 1 0 0 0
              0  0 0 1 0 0
              0  0 0 0 1 0
              0  0 0 0 0 1
         }
     )
     # Example 2: Set the ND-xform of an objeto -- a geometry or a camera
     # cluster. Given the definition above, this puts the objeto at (-3 0 1 1
     # 0) in the five dimensional space.
     
     (ND-xform-set focus : fred)
     
     # or
     
     (ND-xform-set g1 : fred)
geomview-1.9.4/doc/geomview-pt_BR.html/Common-syntax.html0000644000175000001440000000521210663302002020254 00000000000000 Common syntax - Manual do Geomview

Next: , Previous: Conventions, Up: Conventions


4.1.1 Syntax Common to All OOGL File Formats

Most OOGL objeto file formats are free-format ASCII — any amount of white space (blanks, tabs, newlines) may appear between tokens (numbers, key words, etc.). Line breaks are almost always insignificant, with a couple of exceptions as noted. Comments begin with # and continue to the end of the line; they're allowed anywhere a newline is.

Binary formats are also defined for several objetos; See Binary format, and the individual objeto descriptions.

Typical OOGL objetos begin with a key word designating objeto type, possibly with modifiers indicating presence of color information etc. In some formats the key word is optional, for compatibility with file formats defined elsewhere. Objeto type is then determined by guessing from the file suffix (if any) or from the data itself.

Key words are case sensitive. Some have optional prefix letters indicating presence of color or other data; in this case the order of prefixes is significant, e.g. CNMESH is meaningful but NCMESH is invalid. geomview-1.9.4/doc/geomview-pt_BR.html/figmatpanel.html0000644000175000001440000000011610663302002017765 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/stereowin.html0000644000175000001440000000466410663302002017531 00000000000000 stereowin - Manual do Geomview

Next: , Previous: space, Up: GCL Reference


7.2.123 stereowin

(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])
Configure CAM-ID as a stereo window. no: entire window is a single pane, stereo disabled
horizontal: split left/right: left is stereo eye#0, right is #1.
vertical: split top/bottom: bottom is eye#0, top is #1.
colored: panes overlap, red is stereo eye#0, cyan is #1.

A gap of gapsize pixels is left between subwindows; if omitted, subwindows are adjacent. If both layout and gapsize are omitted, e.g. (stereowin CAM-ID), returns current settings as a (stereowin ...) command list. This command doesn't set stereo projection; use merge camera or camera to set the stereyes transforms, and merge window or window to set the pixel aspect ratio & window position if needed.

geomview-1.9.4/doc/geomview-pt_BR.html/dither.html0000644000175000001440000000316510663302002016764 00000000000000 dither - Manual do Geomview

Next: , Previous: dimension, Up: GCL Reference


7.2.29 dither

(dither CAM-ID {on|off|toggle})
Turn dithering on or off in that camera.
geomview-1.9.4/doc/geomview-pt_BR.html/figcommandpanel.html0000644000175000001440000000011310663302002020617 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/dump_002dhandles.html0000644000175000001440000000331110663302002020527 00000000000000 dump-handles - Manual do Geomview

Next: , Previous: draw, Up: GCL Reference


7.2.31 dump-handles

(dump-handles)
Dump the list of currently active handles to stdout. This function is intended for internal debugging use only.
geomview-1.9.4/doc/geomview-pt_BR.html/hsphere_002ddraw.html0000644000175000001440000000346210663302002020546 00000000000000 hsphere-draw - Manual do Geomview

Next: , Previous: hmodel, Up: GCL Reference


7.2.56 hsphere-draw

(hsphere-draw CAMID [yes|no])
Say whether to draw a unit sphere: the sphere at infinity in hyperbolic space, and a reference sphere in Euclidean and spherical spaces. If the second argument is omitted, yes is assumed.
geomview-1.9.4/doc/geomview-pt_BR.html/ui_002dpdf_002dviewer.html0000644000175000001440000000425010663302002021304 00000000000000 ui-pdf-viewer - Manual do Geomview

Next: , Previous: ui-panel, Up: GCL Reference


7.2.137 ui-pdf-viewer

(ui-pdf-viewer VIEWER)
Use the executable VIEWER for viewing the PDF-version of the manual when the `Manual (PDF)' menu-item is selected in the `Help'-menu. If the (ui-pdf-viewer ...) command was never executed, then the default is to use the browser stored in the PDFVIEWER environment variable. If the environment variable is unset then the default is compile-time dependent.
geomview-1.9.4/doc/geomview-pt_BR.html/INST.html0000644000175000001440000002110010663302002016247 00000000000000 INST - Manual do Geomview

Next: , Previous: SPHERE, Up: Object File Formats


4.2.9 INST Files

The conventional suffix for a INST file is .inst.

There is no INST BINARY format.

An INST applies a 4x4 (or (N+1)x(N+1) in the context of ND-viewing) transformation to another OOGL objeto. It begins with INST followed by these sections which may appear in any order:

     geom oogl-object

specifies the OOGL objeto to be instantiated. See References, for the syntax of an oogl-object. The keyword unit is a synonym for geom.

     transform   ["{"] 4x4 transform ["}"]

specifies a single transformation matrix. Either the matrix may appear literally as 16 numbers, or there may be a reference to a "transform" objeto, i.e.

         "<" file-containing-4x4-matrix

or

         ":" symbol-representing-transform-object

Another way to specify the transformation is

     transforms
         oogl-object

The oogl-object must be a TLIST objeto (list of transformations) objeto, or a LIST whose members are ultimately TLIST objetos. In effect, the transforms keyword takes a collection of 4x4 matrices and replicates the geom objeto, making one copy for each 4x4 matrix.

If no transform nor transforms keyword appears, no transformation is applied (actually the identity is applied). You could use this for, e.g., wrapping an appearance around an externally-supplied objeto, though a single-membered LIST would do this more efficiently.

See Transformation matrices, for the matrix format.

When replicating a single geometry by means of a TLIST objeto (see `transforms' above) it may be useful to transform texture co-ordinates by another list of transformations; that list can be specified by

     txtransforms
         TLIST-object

The number of texture transformations must match the number of geometry transformations. The SPHERE objeto (see Sphere Objetos) uses this technique to generate an entire textured sphere out of some fraction of a sphere (usually one octant).

A single (N+1)-dimensional transformation can be specified by

     ntransform ["{"] N+1 N+1 (N+1)x(N+1) floats ["}"]

This gives a single N+1-dimensional transformation matrix. Either the matrix may appear literally as (N+1)x(N+1) numbers, or there may be a reference to an `ntransform' objeto, i.e.

         "<" file-containing-(N+1)x(N+1)-matrix

or

         ":" symbol-representing-ntransform-object

See ND Transformation matrices, for the matrix format.

Two more INST fields are accepted: location and origin.

Note that location as well as origin are ignored if this INST objeto carries an ntransform. Also, if ND-viewing is active (ND-axes command, see GCL) then INST objetos with origin unequal to local will not be drawn, though the location stuff may work (or not).

     location [global or camera or ndc or screen or local]

Normally an INST specifies a position relative to its parent objeto; the location field allows putting an objeto elsewhere.

  • location global attaches the objeto to the global (a.k.a. universe) coordinate system – the same as that in which geomview's World objetos, alien geometry, and câmeras are placed.
  • location camera places the objeto relative to the camera. (Thus if there are multiple views, it may appear in a different spatial position in each view.) The center of the camera's view is along its negative Z axis; positive X is rightward, positive Y upward. Normally the units of câmera space are the same as global coordinates. When a câmera is reset, the global origin is at (0,0,-3.0).
  • location ndc places the objeto relative to the normalized unit cube into which the camera's projection (perspective or orthographic) maps the visible world. X, Y, and Z are each in the range from -1 to +1, with Z = -1 the near and Z = +1 the far clipping plane, and X and Y increasing rightward and upward respectively. Thus something like
              INST  transform  1 0 0 0  0 1 0 0  0 0 1 0  -.9 -.9 -.999 1
                    location ndc
                    geom < label.vect
         

    pastes label.vect onto the lower left corner of each window, and in front of nearly everything else, assuming label.vect's contents lie in the positive quadrant of the X-Y plane. It's tempting to use -1 rather than -.999 as the Z component of the position, but that may put the objeto just nearer than the near clipping plane and make it (partially) invisible, due to floating-point error.

  • location screen places the objeto in screen coordinates. The range of Z is still -1 through +1 as for ndc coordinates; X and Y are measured in pixels, and range from (0,0) at the lower left corner of the window, increasing rightward and upward.

location local is the default; the objeto is positioned relative to its parent.

     origin [global or camera or ndc or screen or local] x y z

The origin field translates the contents of the INST to place the origin at the specified point of the given coordinate system. Unlike location, it doesn't change the orientation, only the choice of origin. Both location and origin can be used together.

So for example

     { INST
       location screen
       origin ndc 0 0 -.99
       geom { < xyz.vect }
       transform { 100 0 0 0  0 100 0 0  0 0 -.009 0   0 0 0 1 }
     }

places xyz.vect's origin in the center of the window, just beyond the near clipping plane. The unit-length X and Y edges are scaled to be just 100 screen units – pixels – long, regardless of the size of the window.

geomview-1.9.4/doc/geomview-pt_BR.html/TLIST.html0000644000175000001440000000670510663302002016407 00000000000000 TLIST - Manual do Geomview

Next: , Previous: LIST, Up: Object File Formats


4.2.11 TLIST Files

The conventional suffix for a TLIST file is .grp ("group") or or .prj ("projective" matrices).

Collection of 4x4 matrices, used in the transforms section of and INST objeto.

Syntax:

     TLIST			# key word
     
     <4x4 matrix (16 floats)>
     ...				# Any number of 4x4 matrices

TLISTs are used only within the transforms clause of an INST objeto. They cause the INSTs geom objeto to be instantiated once under each of the transforms in the TLIST. The effect is like that of a LIST of INSTs each with a single transform, and all referring to the same objeto, but is more efficient.

Be aware that a TLIST is a kind of geometry objeto, distinct from a transform objeto. Some contexts expect one type of objeto, some the other. For example in

     INST transform { : myT } geom { ... }

myT must be a transform objeto, which might have been created with the GCL

     (read transform { define myT 1 0 0 1 ... })

while in

       INST transforms { : myTs } geom { ... }
       or
       INST transforms { LIST {: myTs} {< more.prj} } geom { ... }

myTs must be a geometry objeto, defined e.g. with

       (read geometry { define myTs { TLIST 1 0 0 1 ... } })

A TLIST BINARY format is accepted. Binary data begins with a 32-bit integer giving the number of transformations, followed by that number of 4x4 matrices in 32-bit floating-point format. The order of matrix elements is the same as in the ASCII format. geomview-1.9.4/doc/geomview-pt_BR.html/figfilespanel.html0000644000175000001440000000011110663302002020301 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/GROUP.html0000644000175000001440000000405510663302002016400 00000000000000 GROUP - Manual do Geomview

Next: , Previous: TLIST, Up: Object File Formats


4.2.12 GROUP Files

This format is obsolete, but is still accepted. It combined the functions of INST and TLIST, taking a series of transformations and a single Geom (unit) objeto, and replicating the objeto under each transformation.

     GROUP ... < matrices > ... unit { oogl-object }

is still accepted and effectively translated into

     INST
     	transforms { TLIST ... <matrices> ... }
     	unit { oogl-object }
geomview-1.9.4/doc/geomview-pt_BR.html/Cameras.html0000644000175000001440000002045010663302002017054 00000000000000 Cameras - Manual do Geomview

Next: , Previous: Appearance, Up: Interaction


3.7 Cameras

A câmera in Geomview is the objeto that corresponds to a janela de câmera. By default there is only one camera, but it is possible to have as many as you want. You can control certain aspects of the way the world is drawn in each janela de câmera via the Cameras panel.

figs/cam.png

Figure 3.8: The Cameras Panel.

If the objeto alvo is a camera, the Cameras panel affects that camera. If the objeto alvo is not a camera, the Cameras panel affects the current camera. The current câmera is the câmera of the window that the mouse cursor is in, or was in most recently if the cursor is not in a janela de câmera. Thus, if you use the keyboard shortcuts for the actions in the Cameras panel while the cursor is in a janela de câmera, the actions apply to that camera, unless you have explicitly selected another camera.

To create new janelas de câmera, use the v+ tecla de atalho, or see the File menu on the Main panel.

Single-Buffering
Normally, geomview windows are double-buffered: geomview draws the next picture into a hidden window, then switches buffers to make it visible all at once. On many systems, the memory for the hidden buffer comes from stealing half the bits in each screen pixel, reducing the color resolution. When single-buffering is enabled, the window flickers as each scene is being drawn, but you may get smoother images with reduced grainy dithering artifacts. Single-buffering is possible if Geomview is compiled with GL or OpenGL, but not with plain-X graphics.
Dither
Many displays offer less than the 24 bits per pixel (8 bits each of red, green, and blue) conventionally needed to show smooth gradations of color. When trying to show a color not accurately available on the display, Geomview normally dithers, choosing pixel colors sometimes brighter, sometimes darker than the desired value, so that the average color over an area is a better approximation to the true color than a single pixel could be. Effectively this loses spatial resolution to gain color resolution. This isn't always desirable, though. Turning Dither off gives less grainy, but less accurately colored, images.
Software Shading
This botão controls whether Geomview does shading calculations in software. The default is to let the hardware handle them, and in Euclidean space this is almost certainly best because it is faster. In hyperbolic and spherical space, however, the shading calculations that the hardware does are incorrect. Clique this botão to turn on correct but slower software shading.
Background Color
This botão brings up a color chooser which you can use to set the background color of the camera's window.
PROJECTION
This browser lets you pick between perspective and orthogonal projection for this camera.
Near clip
This determines the distance in world coordinates of the near clipping plane from the eye point. It must be a positive number.
Far clip
This determines the distance in world coordinates of the far clipping plane from the eye point. It must be a positive number and in general should be larger than the Near clip value.
FOV
This is the camera's field of view, measured in its shorter direction. In perspective mode, it is an angle in degrees. In orthographic mode, it is the linear size of the field of view. This number can be modified with the mouse in Cam Zoom mode.
Focal Length
The focal length is intended to suggest the distance from the câmera to an imaginary plane of interest. Its value is used when switching between orthographic and perspective views (and during stereo viewing), so as to preserve apparent size of objetos lying at the focal distance from the camera. Focal length also affects interpretation of mouse-based translational movimentos. Speed of forward movimento (in translate, fly and orbit modes) is proportional to focal length; and objetos lying at the focal distance from the câmera translate laterally at the same rate as the mouse cursor. Finally, in N-D projection mode, câmeras are displaced back by the focal distance from the 3-D projection of the world origin.
Lines Closer
This number has to do with the way lines are drawn. Normally Geomview's z-buffering algorithm can get confused when drawing lines that lie exactly on surfaces (such as the edges of an objeto); due to machine round-off error, sometimes the lines appear to be in front of the surface and sometimes they appear behind it. The Lines Closer value is a fudge factor — Geomview nudges all the lines that it draws closer to the câmera by this amount. The number should be a small integer; try 5 or 10. 0 turns this feature off completely. Choosing too large a value will make lines visible even though they should be hidden.
SPACE MODEL
This determines the model used to draw the world. It is most useful in hyperbolic and spherical spaces. You probably don't need to touch this browser if you stay in Euclidean space. For more information about these models, see Non-Euclidean Geometry.
Virtual
This is the default model and represents the natural view from inside the space.
Projective
The projective model of hyperbolic and spherical space. Geoms move under isometries of the space, and câmeras move by Euclidean movimentos. By default in the projective model, the Euclidean unit sphere is drawn. In hyperbolic space this is the sphere at infinity. In Euclidean space the projective model is the same as the virtual model except that the sphere is drawn by default.
Conformal
The conformal model of hyperbolic and spherical space. Geoms move under isometries of the space, and câmeras move by Euclidean movimentos. In Euclidean space, the conformal model amounts to inverting everything in the unit sphere.

Draw Sphere
This controls whether Geomview draws the unit sphere. By default the unit sphere appears in the projective and conformal models. In hyperbolic space this is the sphere at infinity. In spherical space it is the equatorial sphere.
Done
This botão dismisses the Cameras panel.
geomview-1.9.4/doc/geomview-pt_BR.html/bbox_002ddraw.html0000644000175000001440000000341010663302002020033 00000000000000 bbox-draw - Manual do Geomview

Next: , Previous: bbox-color, Up: GCL Reference


7.2.14 bbox-draw

(bbox-draw GEOM-ID [yes|no])
Say whether GEOM-ID's bounding-box should be drawn; defaults to yes if second argument is omitted.
geomview-1.9.4/doc/geomview-pt_BR.html/ui_002dtarget.html0000644000175000001440000000411410663302002020051 00000000000000 ui-target - Manual do Geomview

Next: , Previous: ui-pdf-viewer, Up: GCL Reference


7.2.138 ui-target

(ui-target ID [yes|no])
Set the target of user actions (the selected line of the objeto alvo browser) to ID. The second argument specifies whether to make ID the current objeto regardless of its type. If no, then ID becomes the current objeto of its type (geom or camera). The default is yes. This command may result in a change of modos de movimento based on target choice.
geomview-1.9.4/doc/geomview-pt_BR.html/DISCGRP.html0000644000175000001440000000326110663302002016575 00000000000000 DISCGRP - Manual do Geomview

Next: , Previous: GROUP, Up: Object File Formats


4.2.13 DISCGRP Files

This format is for discrete groups, such as appear in the theory of manifolds or in symmetry patterns. This format has its own man page. See discgrp(5). geomview-1.9.4/doc/geomview-pt_BR.html/hdelete.html0000644000175000001440000000502610663302002017115 00000000000000 hdelete - Manual do Geomview

Next: , Previous: hdefine, Up: GCL Reference


7.2.53 hdelete

(hdelete [geometry|camera|window|appearance|image|transform|ntransform] name)
Deletes the given handle. Note that the handle will not actually be deleted in case there are still other objetos referring to the handle, but once those objetos are gone, the handle will also automatically go away. The objeto the handle referes to (if any) will only be deleted if there are no other references to that objeto.

If the optional first argument is omitted, then the first handle matching name will be deleted, regardless of the type of the objeto it is attached to. It is not an error to call this function with a non-existent handle, but it is an error to call this funcion with the name of a non-global handle, i.e. one that was not created by (hdefine ...) or (read ... { define ...}). See References. See (read ...). See (hdefine ...).

geomview-1.9.4/doc/geomview-pt_BR.html/ezoom.html0000644000175000001440000000314210663302002016631 00000000000000 ezoom - Manual do Geomview

Next: , Previous: exit, Up: GCL Reference


7.2.48 ezoom

(ezoom GEOM-ID FACTOR)
Same as zoom but multiplies by exp(zoom). Obsolete.
geomview-1.9.4/doc/geomview-pt_BR.html/input_002dtranslator.html0000644000175000001440000000432510663302002021502 00000000000000 input-translator - Manual do Geomview

Next: , Previous: inhibit-warning, Up: GCL Reference


7.2.59 input-translator

(input-translator "#prefix_string" "Bourne-shell-command")
Defines an external translation program for special input types. When asked to read a file which begins with the specified string, geomview invokes that program with standard input coming from the given file. The program is expected to emit OOGL geometric data to its standard output. In this implementation, only prefixes beginning with # are recognized. Useful as in
            (input-translator "#VRML" "vrml2oogl")
     
geomview-1.9.4/doc/geomview-pt_BR.html/background_002dimage.html0000644000175000001440000000417610663302002021357 00000000000000 background-image - Manual do Geomview

Next: , Previous: backcolor, Up: GCL Reference


7.2.12 background-image

(background-image CAM-ID [FILENAME])
Use the given image as the background of camera CAM-ID (which must be a real camera, not default or allcams). Centers the image on the window area. Works only with GL and OpenGL graphics. Use "" for filename to remove background. With no filename argument, returns name of that window's current background image, or "". Any file type acceptable as a texture is allowed, e.g. .ppm.gz, .sgi, etc.
geomview-1.9.4/doc/geomview-pt_BR.html/camera.html0000644000175000001440000001642410663302002016737 00000000000000 camera - Manual do Geomview

Next: , Previous: ntransform, Up: Non-geometric objects


4.3.5 cameras

A câmera objeto specifies the following properties of a camera:

position and orientation
specified by either a camera-to-world or world-to-camera transformation; this transformation does not include the projection, so it's typically just a combination of translation and rotation. Specified as a transform objeto, typically a 4x4 matrix.
"focus" distance
Intended to suggest a typical distance from the câmera to the objeto of interest; used for default câmera positioning (the câmera is placed at (X,Y,Z) = (0,0,focus) when reset) and for adjusting field-of-view when switching between perspective and orthographic views.
window aspect ratio
True aspect ratio in the sense <Xsize>/<Ysize>. This normally should agree with the aspect ratio of the camera's window. Geomview normally adjusts the aspect ratio of its câmeras to match their associated windows.
near and far clipping plane distances
Note that both must be strictly greater than zero. Very large <far>/<near> distance ratios cause Z-buffering to behave badly; part of an objeto may be visible even if somewhat more distant than another.
field of view
Specified in either of two forms.
`fov'
is the field of view – in degrees if perspective, or linear distance if orthographic – in the shorter direction.
`halfyfield'
is half the projected Y-axis field, in world coordinates (not angle!), at unit distance from the camera. For a perspective camera, halfyfield is related to angular field:
halfyfield = tan( Y_axis_angular_field / 2 )

while for an orthographic one it's simply:

halfyfield = Y_axis_linear_field / 2

This odd-seeming definition is (a) easy to calculate with and (b) well-defined in both orthographic and perspective views.

background color
Arguably not a property of a camera, but of the scene. Nevertheless, as there is no "background" OOGL objeto, and the background color should not be a property of the drawing device, it can be specified here. At the time of this writing, however, the GUI always overrides the background color with its own settings.
background image
Same reasoning as above, only that the GUI does not override this setting. The image is centered at NDC co-ordinates (0,0,-1); it is not resized, just painted behind everything else as is. See Image objetos.

The syntax for a câmera is:

     <camera> ::=
     
        [ "camera" ]                 (optional keyword)
         [ "{" ]                    (opening brace, generally required)
             [ "define" <name> ]
     
             "<" <filename>
           |
             ":" <name>
           |
                                     (or any number of the following,
                                      in any order...)
     
             "perspective"  {"0" | "1"}            (default 1)
                                             (otherwise orthographic)
     
             "stereo"       {"0" | "1"}            (default 0)
                                             (otherwise mono)
     
             "worldtocam" <transform>        (see transform syntax above)
     
             "camtoworld" <transform>
                                     (no point in specifying both
                                      camtoworld and worldtocam; one is
                                      constrained to be the inverse of                                                the other)
     
             "halfyfield" <half-linear-Y-field-at-unit-distance>
                                     (default tan 40/2 degrees)
     
             "fov"           (angular field-of-view if perspective,
                              linear field-of-view otherwise.
                              Measured in whichever direction is smaller,
                              given the aspect ratio.  When aspect ratio
                              changes -- e.g. when a window is reshaped --
                              "fov" is preserved.)
     
             "frameaspect" <aspect-ratio>    (X/Y) (default 1.333)
     
             "near"  <near-clipping-distance>        (default 0.1)
     
             "far"   <far-clipping-distance>         (default 10.0)
     
             "focus" <focus-distance>                (default 3.0)
     
             "bgcolor" <float RGB(A) color>          (default 1/3 1/3 1/3 1)
     
             "bgimage" { <image specification> }     (default no background image)
     
          [ "}" ]                           (matching closebrace)

Next: , Previous: bbox-draw, Up: GCL Reference


7.2.15 camera

(camera CAM-ID [CAMERA])
Specify data for CAM-ID; CAMERA is a string giving an OOGL câmera specification. If no camera CAM-ID exists, it is created; in this case, the second argument is optional, and if omitted, a default câmera is used. See (new-camera ...).
geomview-1.9.4/doc/geomview-pt_BR.html/real_002did.html0000644000175000001440000000367310663302002017476 00000000000000 real-id - Manual do Geomview

Next: , Previous: read, Up: GCL Reference


7.2.101 real-id

(real-id ID)
Returns a string canonically identifying the given ID, or nil if the objeto does not exist. Examples: (if (real-id fred) (delete fred)) deletes fred if it exists but reports no error if it doesn't, and (if (= (real-id targetgeom) (real-id World)) () (delete targetgeom)) deletes targetgeom if it is different from the World.
geomview-1.9.4/doc/geomview-pt_BR.html/emodule_002disrunning.html0000644000175000001440000000376210663302002021624 00000000000000 emodule-isrunning - Manual do Geomview

Next: , Previous: emodule-defined, Up: GCL Reference


7.2.36 emodule-isrunning

(emodule-isrunning NAME)
Returns Lt if the emodule NAME is running, or Lnil if it is not running. NAME is searched for in the names as they appear in the browser and in the shell commands used to execute the external modules (not including arguments).
geomview-1.9.4/doc/geomview-pt_BR.html/Loading.html0000644000175000001440000001533410663302002017063 00000000000000 Loading - Manual do Geomview

Next: , Previous: Basic Interaction, Up: Interaction


3.4 Loading Objects Into Geomview

Existem muitos caminhos para chamar um objeto dentro do Geomview.

No painel de arquivos (Files)
Se você clicar no botão Load no painel principal do Geomview (Main), o painel de arquivos (Files) irá aparecer.
figs/myfilelist.png

Figure 3.2: O Painel de Arquivos.

Esse painel permite que você selecione um arquivo a partir de uma variedade de diretórios. O topo do painel é um navegador de arquivos padrão do Motif. Abaixo deste está uma lista de diretórios no caminho de busca padrão do Geomview; clique sobre um desses para navegar entre os arquivos naquele diretório.

Para selecionar um arquivo, duplo-clique sobre o seu nome no navegador no canto superior direito, ou clique sobre o seu nome e pressione a tecla <Enter>, ou ainda digite o nome do arquivo dentro da caixa de texto na parte inferior do navegador e pressione a tecla <Enter>.

Se o arquivo selecionado contiver dados geométricos OOGL, esse arquivo irá ser adicionado ao navegador de alvos (Targets) do geomview. Se esse arquivo contiver comandos GCL em lugar de conter dados geométricos OOGL, o arquivo será interpretado. Veja GCL.

Quando o apinel de arquivos (Files) aparecer pela primeira vez, o diretório selecionado no navegador de diretórios é o diretório atual — que corresponde ao diretório a partir do qual você chamou o Geomview. O navegador de arquivos mostra todos os arquivos nesse diretório, incluindo os que não são arquivos do Geomview. Se você tentar chamar u arquivo que não contenha nem um objeto OOGL nem comandos do Geomview, o Geomview irá mostrar uma mensagem de errp.

O navegador de diretórios também lista um segundo e um terceiro diretórios adicionalmente além do diretório atual. O segundo, que termina em data/geom, é o diretório de exemplos de dados do Geomview. Esse diretório contém uma grande variedade de amostras de objetos. Esse diretório também contém muitos subdiretórios. Em particular, os subdiretórios hyperbolic e o subdiretório spherical possuem amostras de objetos hiperbólicos e esféricos, respectivamente. Entradas no navegador de diretórios são vistas apenas como entradas de arquivos; para visualizar um subdiretório, clique sobre o nome do referido diretório.

O terceiro diretório mostrado mostrado no navegador de diretório, que termina em geom, contém muitos subdiretórios com outros arquivos do Geomview dentro deles. Esses arquivos são usados menos freqüêntemente que os outros no diretório data/geom.

Você pode mudar a lista de diretórios mostra no navegador de diretórios do painel de arquivos (Files) usando o comando set-load-path; Veja (set-load-path ...).

a tecla de atalho <:
Se você digitar < em qualquer janela do Geomview, o painel Load irá aparecer. Esse painel é uma pequena versão do painel de arquivos (Files); o painel Load contém um campo de texto no qual você o nome de um arquivo a ser chamado (ou um comando GCL entre parêntesis). Após digitar o nome do arquivo a ser chamado, aperte a tecla <Enter>; Geomview irá chamar o arquivo como se você o tivesse chamado com o botão Add no painel de arquivos (Files). Se, após fazer surgir o pequeno painel Load com <, você decidir que quer usar o grande painel de arquivos (Files) após tudo, pressione o botão File Browser.
figs/load.png

Figure 3.3: The Load Panel.


comandos para chamar objetos geométricos:
Os comandos GCL load, geometry, new-geometry, e read permitem a você chamar um objeto dentro do Geomview; veja GCL. Veja (load ...). Veja (new-geometry ...). Veja (read ...).
geomview-1.9.4/doc/geomview-pt_BR.html/figappearance.html0000644000175000001440000000011110663302002020256 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/QUAD.html0000644000175000001440000000623610663302002016241 00000000000000 QUAD - Manual do Geomview

Next: , Previous: Object File Formats, Up: Object File Formats


4.2.1 QUAD: collection of quadrilaterals

The conventional suffix for a QUAD file is .quad.

The file syntax is

        [C][N][4]QUAD  -or-  [C][N][4]POLY		   # Key word
        vertex  vertex  vertex  vertex  # 4*N vertices for some N
        vertex  vertex  vertex  vertex
        ...

The leading key word is [C][N][4]QUAD or [C][N][4]POLY, where the optional C and N prefixes indicate that each vertex includes colors and normals respectively. That is, these files begin with one of the words

QUAD CQUAD NQUAD CNQUAD POLY CPOLY NPOLY CNPOLY

(but not NCQUAD or NCPOLY). QUAD and POLY are synonymous; both forms are allowed just for compatibility with ChapReyes.

Following the key word is an arbitrary number of groups of four vertices, each group describing a quadrilateral. See the Vertex syntax above. The objeto ends at end-of-file, or with a close-brace if incorporated into an objeto reference (see above).

A QUAD BINARY file format is accepted; See Binary format. The first word of binary data must be a 32-bit integer giving the number of quads in the objeto; following that is a series of 32-bit floats, arranged just as in the ASCII format. geomview-1.9.4/doc/geomview-pt_BR.html/transform_002dincr.html0000644000175000001440000000451610663302002021122 00000000000000 transform-incr - Manual do Geomview

Next: , Previous: transform, Up: GCL Reference


7.2.126 transform-incr

(transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center] [dt [smooth]])
Apply continuing movimento: construct a transformation matrix and concatenate it with the current transform of objectID every refresh (sets objectID's incremental transform). Same syntax as transform. If optional dt argument is present, the objeto is moved at each time step such that its average movimento equals one instance of the movimento per dt seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds.
geomview-1.9.4/doc/geomview-pt_BR.html/ui_002dcenter.html0000644000175000001440000000352710663302002020052 00000000000000 ui-center - Manual do Geomview

Next: , Previous: ui-cam-focus, Up: GCL Reference


7.2.129 ui-center

(ui-center ID)
Set the center for user interface (i.e. mouse) controlled movimentos to objeto ID.
geomview-1.9.4/doc/geomview-pt_BR.html/write.html0000644000175000001440000000513310663302002016634 00000000000000 write - Manual do Geomview

Next: , Previous: winenter, Up: GCL Reference


7.2.144 write

(write {command|geometry|camera|transform|ntransform|window} FILENAME [ID|(ID ...)] [self|world|universe|otherID])
write description of ID in given format to FILENAME. Last parameter chooses coordinate system for geometry & transform: self: just the objeto, no transformation or appearance (geometry only) world: the objeto as positioned within the World. universe: objeto's position in universal coordinates; includes Worldtransform other ID: the objeto transformed to otherID's coordinate system.

A filename of - is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, - means geomview's standard output (see (command ...)).

The ID can either be a single id or a parenthesized list of ids, like g0 or (g2 g1 dodec.off).

geomview-1.9.4/doc/geomview-pt_BR.html/exit.html0000644000175000001440000000305610663302002016455 00000000000000 exit - Manual do Geomview

Next: , Previous: evert, Up: GCL Reference


7.2.47 exit

(exit)
Terminates geomview.
geomview-1.9.4/doc/geomview-pt_BR.html/figcamerapanel.html0000644000175000001440000000011110663302002020427 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/ui_002dcenter_002dorigin.html0000644000175000001440000000467510663302002022014 00000000000000 ui-center-origin - Manual do Geomview

Next: , Previous: ui-center, Up: GCL Reference


7.2.130 ui-center-origin

(ui-center-origin [origin|bbox-center])
Set the origin of the coordinate system of the CENTER objeto for user interface (i.e. mouse) controlled movimentos. The keyword origin means to use the origin of the coordinate system of the currently selected objeto, while bbox-center means to use the center of the bouding box of the current objeto. The keyword bbox-center makes no sense if the geometry is non-Euclidean. Using either bbox-center or origin does not make a difference if the objeto do centro is not a geometry, e.g. if it is a camera. Same holds if the World is the currently selected objeto.
geomview-1.9.4/doc/geomview-pt_BR.html/ND_002dxform.html0000644000175000001440000000376110663302002017611 00000000000000 ND-xform - Manual do Geomview

Next: , Previous: ND-color, Up: GCL Reference


7.2.77 ND-xform

(ND-xform OBJID [ntransform { idim odim ... }])
Concatenate the given ND-transform with the current ND-transform of the objeto (apply the ND-transform to objeto ID, as opposed to simply setting its ND-transform). Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.
geomview-1.9.4/doc/geomview-pt_BR.html/hdefine.html0000644000175000001440000000457510663302002017115 00000000000000 hdefine - Manual do Geomview

Next: , Previous: geomview-version, Up: GCL Reference


7.2.52 hdefine

(hdefine geometry|camera|window|appearance|image|transform|ntransform name value)
Sets the value of a handle of a given type.
            (hdefine  <type>  <name>  <value>)
     

is generally equivalent to

            (read <type>  { define <name> <value> })
     

except that the assignment is done when hdefine is executed, (possibly not at all if inside a conditional statement), while the read ... define performs assignment as soon as the text is read. See References. See (read ...). See (hdelete ...).

geomview-1.9.4/doc/geomview-pt_BR.html/regtable.html0000644000175000001440000000330110663302002017262 00000000000000 regtable - Manual do Geomview

Next: , Previous: redraw, Up: GCL Reference


7.2.103 regtable

(regtable)
shows the registry table
geomview-1.9.4/doc/geomview-pt_BR.html/Interaction.html0000644000175000001440000000557210663302002017770 00000000000000 Interaction - Manual do Geomview

Next: , Previous: Tutorial, Up: Top


3 Interaction

Esse capítulo descreve como você interage com Geomview através do mouse e do teclado.

geomview-1.9.4/doc/geomview-pt_BR.html/progn.html0000644000175000001440000000344710663302002016635 00000000000000 progn - Manual do Geomview

Next: , Previous: position-toward, Up: GCL Reference


7.2.95 progn

(progn STATEMENT [ ... ])
evaluates each STATEMENT in order and returns the value of the last one. Use progn to group a collection of commands together, forcing them to be treated as a single command.
geomview-1.9.4/doc/geomview-pt_BR.html/GCL-Reference.html0000644000175000001440000004600310663302002020004 00000000000000 GCL Reference - Manual do Geomview

Previous: Argument Conventions, Up: GCL


7.2 GCL Reference Guide

geomview-1.9.4/doc/geomview-pt_BR.html/eq.html0000644000175000001440000000315310663302002016107 00000000000000 eq - Manual do Geomview

Next: , Previous: lt, Up: GCL Reference


7.2.3 =

(= EXPR1 EXPR2)
Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.
geomview-1.9.4/doc/geomview-pt_BR.html/Distrib.html0000644000175000001440000000647410663302002017113 00000000000000 Distrib - Manual do Geomview

Next: , Previous: Intro, Up: Top


Distribution

Geomview é um software livre; isso significa que qualquer um é livre para usá-lo e livre para redistribuí-lo sob certas condições. Geomview não é de domínio público; é protegido por direitos autorais e existem restrições sobre sua distribuição, mas essas restrições são montadas de forma a permitir qualquer coisa que um bom cidadão colaborador possa querer fazer. O que não é permitido é para tentar previnir outros de compartilhamento adicional de qualquer versão do Geomview que eles possam pegar de você. As condições precisas podem ser encontradas na Licença Geral Menor do GNU que acompanha o Geomview e também aparece acompanhando essa seção.

Uma forma de acessar uma cópia do Geomview é a partir de alguém que já possua o Geomview. Você não precisa perguntar por nossa permissão para fazer isso, ou informar qualquer coisa; apenas faça a cópia. Se você tiver acesso à internet, você pode pegar a mais recente versão do Geomview em http://www.geomview.org.

Você também pode receber Geomview quando você compra um computador. Fabricantes de computadores estão livres para distribuir cópias sob os mesmos termos que são aplicados a qualquer pessoa. Esses termos requerem que os fabricantes forneçam a você o código completo, incluindo qualquer mudanças que eles tenham feito, e permitam a você que redistribua o Geomview recebido deles nos termos usuais da Licença Pública Geral Menor do GNU. Em outras palavras, o programa deve ser livre para você quando você o receber, não apenas livre para o fabricante. geomview-1.9.4/doc/geomview-pt_BR.html/rib_002ddisplay.html0000644000175000001440000000450510663302002020373 00000000000000 rib-display - Manual do Geomview

Next: , Previous: replace-geometry, Up: GCL Reference


7.2.106 rib-display

(rib-display [frame|tiff] FILEPREFIX)
Set Renderman display to framebuffer (popup screen window) or a TIFF format disk file. FILEPREFIX is used to construct names of the form prefixNNNN.suffix. (i.e. foo0000.rib) The number is incremented on every call to rib-snapshot and reset to 0000 when rib-display is called. TIFF files are given the same prefix and number as the RIB file (i.e. foo0004.rib generates foo0004.tiff). The default FILEPREFIX is geom and the default format is TIFF. (Note that geomview just generates a RIB file, which must then be rendered.)
geomview-1.9.4/doc/geomview-pt_BR.html/Argument-Conventions.html0000644000175000001440000001107510663302002021571 00000000000000 Argument Conventions - Manual do Geomview

Next: , Previous: GCL, Up: GCL


7.1 Conventions Used In Describing Argument Types

The following symbols are used to describe argument types in the documentation for GCL functions.

appearance
is an OOGL appearance specification.
cam-id
is an id that refers to a camera.
camera
is an OOGL câmera specification.
geom-id
is an id that refers to a geometry.
geometry
is an OOGL geometry specification.
id
is a string which names a geometry or camera. Besides those you create, valid ones are:
World, world, worldgeom, g0
the collection of all geom's
target
selected objeto alvo (cam or geom)
center
selected center-of-movimento objeto
targetcam
last selected target camera
targetgeom
last selected target geom
focus
câmera where cursor is (or most recently was)
allgeoms
all geom objetos
allcams
all câmeras
default, defaultcam, prototype
future câmeras inherit default's settings

The following ids are used to name coordinate systems, e.g. in pick and write commands:

World, world, worldgeom, g0
the world, within which all other geoms live.
universe
the universe, in which the World, lights and câmeras live. Câmeras' world2cam transforms might better be called universe2cam, etc.
self
"this Geomview objeto". Transform from an objeto to self is the identity; writing its geometry gives the objeto itself with no enclosing transform; picked points appear in the objeto's coordinates.
primitive
(for pick only) Picked points appear in the coordinate system of the lowest-level OOGL primitive.

A name is also an acceptable id. Given names are made unique by appending numbers if necessary (i.e. foo<2>). Every geom is also named g[n] and every câmera is also named c[n] (g0 is always the worldgeom): this name is used as a prefix to keyboard commands and can also be used as a GCL id. Numbers are reused after an objeto is deleted. Both names are shown in the Objeto browser.

statement
represents a function call. Function calls have the form (func arg1 arg2 ... ), where func is the name of the function and arg1, arg2, ... are the arguments.
transform
is an OOGL 4x4 transformation matrix.
ntransform
is an OOGL (N+1)x(N+1) transformation matrix.
window
is an OOGL winddow specification.
geomview-1.9.4/doc/geomview-pt_BR.html/normalization.html0000644000175000001440000000516310663302002020373 00000000000000 normalization - Manual do Geomview

Next: , Previous: NeXT, Up: GCL Reference


7.2.86 normalization

(normalization GEOM-ID {each|none|all|keep})
Set the normalization status of GEOM-ID.
none
suppresses all normalization.
each
normalizes the objeto's bounding box to fit into the unit sphere, with the center of its bounding box translated to the origin. The box is scaled such that its long diagonal, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2.
all
resembles each, except when an objeto is changing (e.g. when its geometry is being changed by an external program). Then, each tightly fits the bounding box around the objeto whenever it changes and normalizes accordingly, while all normalizes the union of all variants of the objeto and normalizes accordingly.
keep
leaves the current normalization transform unchanged when the objeto changes. It may be useful to apply each or all normalization apply to the first version of a changing objeto to bring it in view, then switch to keep.
geomview-1.9.4/doc/geomview-pt_BR.html/References.html0000644000175000001440000001012410663302002017557 00000000000000 References - Manual do Geomview

Next: , Previous: Binary format, Up: Conventions


4.1.9 Embedded objects and external-object references

Some objeto types (LIST, INST) allow references to other OOGL objetos, which may appear literally in the data stream, be loaded from named disk files, or be communicated from elsewhere via named objetos. GCL commands also accept geometry in these forms.

The general syntax is

      <oogl-object>  ::=
     	[ "{" ]
     	    [ "define" symbolname ]
     	    [ ["="] object-keyword ...
     		 | "<" filename
     		 | ":" symbolname ]
     	[ "}" ]

where "quoted" items are literal strings (which appear without the quotes), [bracketed] items are optional, and | denotes alternatives. Curly braces, when present, must match; the outermost set of curly braces is generally required when the objeto is in a larger context, e.g. when it is part of a larger objeto or embedded in a Geomview command stream.

For example, each of the following three lines:

     	{ define fred   QUAD 1 0 0  0 0 1  0 1 0  1 0 0 }
     
     	{ define fred = QUAD 1 0 0  0 0 1  0 1 0  1 0 0 }
     
     	{ appearance { +edge } LIST { < "file1" } { : fred } }
     
     	VECT 1 2 0   2 0   0 0 0   1 1 2

is a valid OOGL objeto. The last example is only valid when it is delimited unambiguously by residing in its own disk file.

The ":" construct allows references to symbols, created with define. A symbol's initial value is a null objeto. When a symbol is (re)defined, all references to it are automatically changed.

The "define NAME" construct allows to define a global symbol for the given objeto. If "NAME" already references an objeto, then the old objeto is discarded and replaced by the new definition. See (read ...). See (hdefine ...).

The "<" construct causes a disk file to be read. Note that this isn't a general textual "include" mechanism; a complete OOGL objeto must appear in the referenced file.

Files read using "<" are sought first in the directory of the file which referred to them, if any; failing that, the normal search path (see (load-path ...)) is used. The default search looks first in the current directory, then in the Geomview data directories.

Again, white space and line breaks are insignificant, and "#" comments may appear anywhere. geomview-1.9.4/doc/geomview-pt_BR.html/ND_002daxes.html0000644000175000001440000000561010663302002017411 00000000000000 ND-axes - Manual do Geomview

Next: , Previous: name-object, Up: GCL Reference


7.2.75 ND-axes

(ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex [Windex]]])
In our model for N-D viewing (enabled by (dimension)), objetos in N-space are viewed by N-dimensional camera clusters. Each real janela de câmera belongs to some cluster, and shows & manipulates a 3-D axis-aligned projected subspace of the N-space seen by its cluster. Moving one câmera in a cluster affects its siblings.

The ND-axes command configures all this. It specifies a camera's cluster membership, and the set of N-space axes which become the 3-D camera's X, Y, and Z axes. Axes are specified by their indices, from 1 to N for an N-dimensional space. Cluster CLUSTERNAME is implicitly created if not previously known.

In principle it is possible to map the homogeneous component of a conformal 4 point to some other index; this would be done by specifying 0 for one of Xindex, Yindex or Zindex and giving Windex some positive value. This is probably not useful because Geomview does not support non-Euclidean geometries for in higher dimensions.

To read a camera's configuration, use (echo (ND-axes CAMID)). The return value is an array of 4 integers, the last one should 0.

geomview-1.9.4/doc/geomview-pt_BR.html/set_002dload_002dpath.html0000644000175000001440000000407710663302002021272 00000000000000 set-load-path - Manual do Geomview

7.2.113 set-load-path

(set-load-path (PATH1 ... PATHN))
Sets search path for command, geometry, etc. files. The PATHi are strings giving the pathnames of directories to be searched. The special directory name + is replaced by the existing path, so e.g. (set-load-path (mydir +)) prepends mydir to the path.
geomview-1.9.4/doc/geomview-pt_BR.html/emodule_002drun.html0000644000175000001440000000665210663302002020415 00000000000000 emodule-run - Manual do Geomview

Next: , Previous: morehelp, Up: GCL Reference


7.2.7 |

|
| is a synonym for emodule-run.

Next: , Previous: emodule-path, Up: GCL Reference


7.2.38 emodule-run

(emodule-run SHELL-COMMAND ARGS...)
Runs the given SHELL-COMMAND (a string containing a UNIX shell command) as an external module. The module's standard output is taken as geomview commands; responses (written to filename -) are sent to the module's standard input. The shell command is interpreted by /bin/sh, so e.g. I/O redirection may be used; a program which prompts the user for input from the terminal could be run with:
            (emodule-run  yourprogram  <&2)
     

If not already set, the environment variable $MACHTYPE is set to the name of the machine type. Input and output connections to geomview are dropped when the shell command terminates. Clicando on a running program's module-browser entry sends the signal SIGHUP to the program. For this to work, programs should avoid running in the background; those using FORMS or GL should call foreground() before the first FORMS or winopen() call. See (emodule-define ...). See (emodule-start ...).

geomview-1.9.4/doc/geomview-pt_BR.html/Appearance-Panel.html0000644000175000001440000001763110663302002020604 00000000000000 Appearance Panel - Manual do Geomview

Next: , Previous: Appearance, Up: Appearance


3.6.1 The Appearance Panel

The Appearance panel lets you change most common appearance properties of the objeto alvo.

figs/ap.png

Figure 3.5: The Appearance Panel.

If the target is an individual geom, then changes you make in the appearance panel apply to that geometry's appearance. If the target is the World, then appearance panel changes apply to the World appearance and to all individual geom appearances. (Users have found that this is more desirable than having the changes only apply to the World appearance.) If the target is a camera, then appearance panel changes apply to the geom that was most recently the target.

The five botões near the upper right corner under the word Draw control what parts of the target geom are drawn.

Faces
This botão specifies whether faces are drawn.
Edges
This botão specifies whether edges are drawn.
BBox
This botão specifies whether the bounding box is drawn.
Vects
This botão specifies whether VECT objetos are drawn. VECTs are a type of OOGL objeto that represent points and line segments in 3-space; they are distinct from edges of other kinds of objetos, and it is sometimes desirable to have separate control over whether they are drawn.
Normals
This botão specifies whether surface normal vectors are drawn.

The four botões under Color labeled Faces, Edges, Normals, and BBox let you specify the color of the corresponding aspect of the target geom. Clicando on one of them brings up a color chooser panel.

figs/color.png

Figure 3.6: Color Chooser Panel.

This panel offers two sets of sliders: H(ue) S(aturation) V(alue), or R(ed) G(reen) B(lue), each in the range 0 through 1. The square shows the current color, which is given numerically in both HSV and RGB systems in the corresponding text boxes.

In the HSV color system, hue H runs from red at 0, green at .333, blue at .667, and back to red at 1.0. Saturation gives the fraction of white mixed into the color, from 0 for pure gray to 1 for pure color. Value gives the brightness, from 0 for black to 1 for full brightness.

Pressing the RGb or HSV botão at top center switches the sliders to the other color system. You can adjust colors either via the sliders, or by typing in either the RGB or HSV text boxes.

Clique OK to accept the color that you have chosen, or Cancel to retain the previous color setting.

The SHADING browser lets you specify the shading model that Geomview uses to paint the target geom.

Constant
Every face of the objeto is drawn with a constant color which does not depend on the location of the face, the camera, or the light sources. If the objeto does not contain per-face or per-vertex colors, the diffuse color of the objeto's appearance is used. If the objeto contains per-face colors, they are used. If the objeto contains per-vertex colors, each face is painted using the color of its first vertex.
Flat
Each face of the objeto is drawn with a color that depends on the relative location of the face, the camera, and the light sources. The color is constant across the face but may change as the face, camera, or lights move.
Smooth
Each face of the objeto is drawn with smoothly interpolated colors based on the normal vectors at each vertex. If the objeto does not contain per-vertex normals, this has the same effect as flat shading. If the objeto has reasonable per-vertex normals, the effect is to smooth over the edges between the faces.
CSmooth
Each face of the objeto is drawn with exactly the specified color(s), independent of lighting, orientation, and material properties. If the objeto is defined with per-vertex colors, the colors are interpolated smoothly across the face; otherwise the effect is the same as in Constant shading style.

The Facing Normals botão on the Appearance panel indicates whether or not Geomview should arrange that normal vectors always face the viewer. If a normal vector points away from the viewer the color of the corresponding face or vertex usually is darker than is desired. Geomview can avoid this by using the opposite normal in shading calculations. This is the default. Using Facing Normals can give strange flickering dark or light shading effects, though, near the horizon of a fairly smooth facetted objeto. Press this botão to use the normals given with the objeto.

The three text fields in the lower left corner of the Appearance panel are:

Line Width
The width, in pixels, for lines drawn by Geomview.
Normal Length
This is actually a scale factor; when normal vectors are drawn, Geomview draws them to have a length that is their natural length times this number.
Patch Dicing
Geomview draws Bezier patches by first converting them to meshes. This parameter specifies the resolution of the mesh: if Patch Dicing is n, then an n by n mesh is used to draw each Bezier patch. if Patch Dicing is 1, the resolution reverts to a built-in default value.

The Revert botão on the Appearance panel undoes all settings in the target appearance. This causes the target geom to inherit all its appearance properties from its parent.

The Appearance panel's Override botão determines whether appearance controls should override settings in the objetos themselves – for example, setting the face color will affect all faces of objetos with multi-colored facets. Otherwise, appearance controls only provide settings which the objetos themselves do not specify. By default, Override is enabled. This botão applies to all objetos, and to all appearance-related panels. geomview-1.9.4/doc/geomview-pt_BR.html/escale.html0000644000175000001440000000335110663302002016736 00000000000000 escale - Manual do Geomview

Next: , Previous: emodule-transmit, Up: GCL Reference


7.2.42 escale

(escale GEOM-ID FACTOR)
Same as scale but multiplies by exp(scale). Obsolete.
geomview-1.9.4/doc/geomview-pt_BR.html/ui_002dmotion.html0000644000175000001440000000653010663302002020074 00000000000000 ui-motion - Manual do Geomview

Next: , Previous: ui-html-browser, Up: GCL Reference


7.2.135 ui-motion

(ui-motion {inertia|constrain|own-coordinates} {on|off})
Enable or disable certain properties of mouse-controlled movimento. The purpose of this command is to give access to the respective toggles of the Main panel's Motion menu through GCL commands. See Mouse Motions.
inertia
Normally, moving objetos have inertia: if the mouse is still moving when the botão is released, the selected objeto continues to move. When inertia is off, objetos cease to move as soon as you release the mouse.
constrain
It's sometimes handy to move an objeto in a direction aligned with a coordinate axis: exactly horizontally or vertically. Calling (ui-motion constrain on) changes the interpretation of mouse movimentos to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical movimento. Note that the movimento is still along the X or Y axes of the câmera in which you move the mouse, not necessarily the objeto's own coordinate system.
own-coordinates
It's sometimes handy to move objetos with respect to the coordinate system where they were defined, rather than with respect to some camera's view. When (ui-motion own-coordinates on) has been called, all movimentos are interpreted that way: dragging the mouse rightward in translate mode moves the objeto in its own +X direction, and so on. May be especially useful in conjunction with the (ui-motion constrain on) command.
geomview-1.9.4/doc/geomview-pt_BR.html/time_002dinterests.html0000644000175000001440000000462710663302002021135 00000000000000 time-interests - Manual do Geomview

Next: , Previous: stereowin, Up: GCL Reference


7.2.124 time-interests

(time-interests deltatime initial prefix [suffix])
Indicates that all interest-related messages, when separated by at least deltatime seconds of real time, should be preceded by the string prefix and followed by suffix; the first message is preceded by initial. All three are printf format strings, whose argument is the current clock time (in seconds) on that stream. A deltatime of zero timestamps every message. Typical usage:
(time-interests .1 (set-clock %g) (sleep-until %g)) or
(time-interests .1 (set-clock %g) "(sleep-until %g) (progn (set-clock %g)" ")") or
(time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))".
geomview-1.9.4/doc/geomview-pt_BR.html/scene.html0000644000175000001440000000322310663302002016575 00000000000000 scene - Manual do Geomview

Next: , Previous: scale, Up: GCL Reference


7.2.109 scene

(scene CAM-ID [GEOMETRY])
Make CAM-ID look at GEOMETRY instead of at the universe.
geomview-1.9.4/doc/geomview-pt_BR.html/inhibit_002dwarning.html0000644000175000001440000000360510663302002021245 00000000000000 inhibit-warning - Manual do Geomview

Next: , Previous: if, Up: GCL Reference


7.2.58 inhibit-warning

(inhibit-warning STRING)
Inhibit warning inhbits geomview from displaying a particular warning message determined by STRING. At present there are no warning messages that this applies to, so this command is rather useless.
geomview-1.9.4/doc/geomview-pt_BR.html/Binary-format.html0000644000175000001440000000624210663302002020216 00000000000000 Binary format - Manual do Geomview

4.1.8 Binary format

Many OOGL objetos accept binary as well as ASCII file formats. These files begin with the usual ASCII token (e.g. CQUAD) followed by the word BINARY. Binary data begins at the byte following the first newline after BINARY. White space and a single comment may intervene, e.g.

     OFF BINARY	# binary-format "OFF" data follows

Binary data comprise 32-bit integers and 32-bit IEEE-format floats, both in big-endian format (i.e., with most significant byte first). This is the native format for 'int's and 'float's on Sun-3's, Sun-4's, and Irises, among others.

Binary data formats resemble the corresponding ASCII formats, with ints and floats in just the places you'd expect. There are some exceptions though, specifically in the QUAD, OFF and COMMENT file formats. Details are given in the individual file format descriptions. See QUAD, See OFF, and See COMMENT.

Binary OOGL objetos may be freely mixed in ASCII objeto streams:

     LIST
     { = MESH BINARY
     ... binary data for mesh here ...
     }
     { = QUAD
     	1 0 0   0 0 1   0 1 0  0 1 0
     }

Note that ASCII data resumes immediately following the last byte of binary data.

Naturally, it's impossible to embed comments inside a binary-format OOGL objeto, though comments may appear in the header before the beginning of binary data. geomview-1.9.4/doc/geomview-pt_BR.html/new_002dreset.html0000644000175000001440000000332510663302002020064 00000000000000 new-reset - Manual do Geomview

Next: , Previous: new-geometry, Up: GCL Reference


7.2.84 new-reset

(new-reset)
Equivalent to (progn (new-center ALLGEOMS)(new-center ALLCAMS)).
geomview-1.9.4/doc/geomview-pt_BR.html/merge_002dbase_002dap.html0000644000175000001440000000352610663302002021233 00000000000000 merge-base-ap - Manual do Geomview

Next: , Previous: merge-ap, Up: GCL Reference


7.2.71 merge-base-ap

(merge-base-ap APPEARANCE)
merge-base-ap is a synonym for merge-baseap.
geomview-1.9.4/doc/geomview-pt_BR.html/List-of-Figures.html0000644000175000001440000000536510663302002020430 00000000000000 List of Figures - Manual do Geomview

Previous: Function Index, Up: Top


List of Figures

geomview-1.9.4/doc/geomview-pt_BR.html/lt.html0000644000175000001440000000320410663302002016116 00000000000000 lt - Manual do Geomview

Next: , Previous: shell, Up: GCL Reference


7.2.2 <

(< EXPR1 EXPR2)
Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.
geomview-1.9.4/doc/geomview-pt_BR.html/quit.html0000644000175000001440000000315510663302002016466 00000000000000 quit - Manual do Geomview

Next: , Previous: progn, Up: GCL Reference


7.2.96 quit

(quit)
quit is a synonym for exit.
geomview-1.9.4/doc/geomview-pt_BR.html/morehelp.html0000644000175000001440000000465010663302002017320 00000000000000 morehelp - Manual do Geomview

Next: , Previous: help, Up: GCL Reference


7.2.6 ??

(?? command)
command may include * wildcards. Prints more info than (? command). ?? is a synonym for morehelp.

Next: , Previous: merge-baseap, Up: GCL Reference


7.2.73 morehelp

(morehelp command)
command may include * wildcards. Prints more info than (help command).
geomview-1.9.4/doc/geomview-pt_BR.html/load.html0000644000175000001440000000415010663302002016417 00000000000000 load - Manual do Geomview

Next: , Previous: lines-closer, Up: GCL Reference


7.2.62 load

(load filename [command|geometry|camera])
Loads the given file into geomview. The optional second argument specifies the type of data it contains, which may be command (geomview commands), geometry (OOGL geometric data), or camera (OOGL câmera definition). If omitted, attempts to guess about the file's contents. Loading geometric data creates a new visible objeto; loading a camera opens a new window; loading a command file executes those commands.
geomview-1.9.4/doc/geomview-pt_BR.html/freeze.html0000644000175000001440000000334710663302002016767 00000000000000 freeze - Manual do Geomview

Next: , Previous: ezoom, Up: GCL Reference


7.2.49 freeze

(freeze CAM-ID)
Freeze CAM-ID; drawing in this camera's window is turned off until it is explicitly redrawn with (redraw CAM-ID), after which time drawing resumes as normal.
geomview-1.9.4/doc/geomview-pt_BR.html/ui_002dhtml_002dbrowser.html0000644000175000001440000000426110663302002021663 00000000000000 ui-html-browser - Manual do Geomview

Next: , Previous: ui-freeze, Up: GCL Reference


7.2.134 ui-html-browser

(ui-html-browser BROWSER)
Use BROWSER for viewing the HTML-version of the manual when the `Manual (HTML)' menu item is selected in the `Help'-menu. If the (ui-html-browser...) command was never executed, then the default is to use the browser stored in the WEBBROWSER environment variable. If the environment variable is unset then the default is compile-time dependent.
geomview-1.9.4/doc/geomview-pt_BR.html/index.html0000644000175000001440000000772410663302002016621 00000000000000 Manual do Geomview

Manual do Geomview

Next: , Previous: (dir), Up: (dir)


Programa interativo de visualização tridimensional.

geomview-1.9.4/doc/geomview-pt_BR.html/echo.html0000644000175000001440000000371610663302002016425 00000000000000 echo - Manual do Geomview

Next: , Previous: dump-handles, Up: GCL Reference


7.2.32 echo

(echo ...)
Write the given data to the special file -. Strings are written literally; lisp expressions are evaluated and their values written. If received from an external program, echo sends to the program's input. Otherwise writes to geomview's own standard output (typically the terminal).
geomview-1.9.4/doc/geomview-pt_BR.html/camera_002dprop.html0000644000175000001440000000427510663302002020366 00000000000000 camera-prop - Manual do Geomview

Next: , Previous: camera-draw, Up: GCL Reference


7.2.17 camera-prop

(camera-prop { geometry object } [projective])
Specify the objeto to be shown when drawing other câmeras. By default, this objeto is drawn with its origin at the camera, and with the câmera looking toward the objeto's -Z axis. With the projective keyword, the camera's viewing projection is also applied to the objeto; this places the objeto's Z=-1 and Z=+1 at near and far clipping planes, with the viewing area -1<={X,Y}<=+1. Example: (camera-prop { < cube } projective)
geomview-1.9.4/doc/geomview-pt_BR.html/soft_002dshader.html0000644000175000001440000000331510663302002020371 00000000000000 soft-shader - Manual do Geomview

Next: , Previous: snapshot, Up: GCL Reference


7.2.121 soft-shader

(soft-shader CAM-ID {on|off|toggle})
Select whether to use software or hardware shading in that camera.
geomview-1.9.4/doc/geomview-pt_BR.html/Object-File-Formats.html0000644000175000001440000000623310663302002021200 00000000000000 Object File Formats - Manual do Geomview

4.2 Object File Formats

geomview-1.9.4/doc/geomview-pt_BR.html/transform_002dset.html0000644000175000001440000000365610663302002020766 00000000000000 transform-set - Manual do Geomview

Next: , Previous: transform-incr, Up: GCL Reference


7.2.127 transform-set

(transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center])
Set objectID's transform to the constructed transform. Same syntax as transform.
geomview-1.9.4/doc/geomview-pt_BR.html/Appearances.html0000644000175000001440000002516710663302002017735 00000000000000 Appearances - Manual do Geomview

Next: , Previous: References, Up: Conventions


4.1.10 Appearances

Geometric objetos can have associated "appearance" information, specifying shading, lighting, color, wire-frame vs. shaded-surface display, and so on. Appearances are inherited through objeto hierarchies, e.g. attaching an appearance to a LIST means that the appearance is applied to all the LIST's members.

Some appearance-related properties are relegated to "material", "lighting" and "texture" substructures. Take care to note which properties belong to which structure. Any geometric objeto can be preceded by an appearance definition like in the following example:

     {
        appearance { +edge }
        LIST { < "file1" } { QUAD 1 0 0  0 0 1  0 1 0  1 0 0 }
     }

Appearances are also OOGL objetos in their own right and can be given symbolic names and referenced by them (see References). See Appearance objects.

Texture Mapping
There is a separate section concerning the definition of textures (see Texture Mapping).
Transparency
Rendering translucent objetos is not supported by all drawing back ends. The OpenGL renderer has limited support for it: top-level objetos (i.e. those which appear in the objeto browser of the main panel (see The Main Panel) are rendered correctly by means of alpha-blending). Also, the RenderMan snapshots will include opacity values.

Here's an example appearance structure including values for all attributes. Order of attributes is unimportant. As usual, white space is irrelevant. Boolean attributes may be preceded by "+" or "-" to turn them on or off; "+" is assumed if only the attribute name appears. Other attributes expect values.

A "*" prefix on any attribute, e.g. "*+edge" or "*linewidth 2" or "material { *diffuse 1 1 .25 }", selects "override" status for that attribute.

     appearance {
       +face               # (Do) draw faces of polygons.  On by default.
       -edge               # (Don't) draw edges of polygons
       +vect               # (Do) draw VECTs.  On by default.
       -transparent        # (Disable) transparency. Enabling transparency
                           # does not (necessarily) result in a correct Geomview
                           # pictures, but alpha values are used in RenderMan
                           # snapshots.
       -normal             # (Do) draw surface-normal vectors
       normscale 1         # ... with length 1.0 in objeto coordinates
     
       +evert              # do evert polygon normals where needed so as
                           #   to always face the camera
     
       +texturing          # (Enable) texture mapping
       +linear             # (Enable) linear average of closest texture elements
       +mipmap             # (Enable) texture mip-mapping
       +mipinterp          # (Enable) linear mip-mapping
       -backcull           # (Don't) discard clockwise-oriented faces
       -concave            # (Don't) expect and handle concave polygons
       -shadelines	      # (Don't) shade lines as if they were lighted cylinders
     		      # These four are only effective where the graphics system
     		      # supports them, namely on GL and Open GL.
     
       -keepcolor	      # Normally, when N-D positional coloring is enabled as
     		      # with geomview's (ND-color ...) command, all
     		      # objetos' colors are affected.  But, objetos with the
     		      # "+keepcolor" attribute are immune to N-D coloring.
     
       shading smooth      # or ``shading constant'' or ``shading flat'' or
                           # or ``shading csmooth''.
                           # smooth = Gouraud shading, flat = faceted,
                           # csmooth = smoothly interpolated but unlighted.
     
       linewidth 1         # lines, points, and edges are 1 pixel wide.
     
       patchdice 10 10     # subdivide Bezier patches this finely in u and v
     
       material {         # Here's a material definition;
                           # it could also be read from a file as in
                           #  ``material < file.mat''
     
           ka  1.0         # ambient reflection coefficient.
           ambient .3 .5 .3 # ambient color (red, green, blue components)
                           # The ambient contribution to the shading is
                           # the product of ka, the ambient color,
                           # and the color of the ambient light.
     
           kd  0.8         # diffuse-reflection coefficient.
           diffuse .9 1 .4 # diffuse color.
                             # (In ``shading constant'' mode, the surface
                             # is colored with the diffuse color.)
     
           ks 1.0          # specular reflection coefficient.
           specular 1 1 1  # specular (highlight) color.
           shininess  25   # specular exponent; larger values give
                           # sharper highlights.
     
           backdiffuse .7 .5 0 # back-face color for two-sided surfaces
                             # If defined, this field determines the diffuse
                             # color for the back side of a surface.
                             # It's implemented by the software shader, and
                             # by hardware shading on GL systems which support
                             # two-sided lighting, and under Open GL.
     
           alpha   1.0     # opacity; 0 = transparent (invisible), 1 = opaque.
                           # Ignored when transparency is disabled.
     
           edgecolor   1 1 0  # line & edge color
     
           normalcolor 0 0 0  # color for surface-normal vectors
       }
     
       lighting {         # Lighting model
     
           ambient  .3 .3 .3  # ambient light
     
           replacelights   # ``Use only the following lights to
                           # illuminate the objetos under this
                           # appearance.''
                           # Without "replacelights", any lights listed
                           # are added to those already in the scene.
     
                           # Now a collection of sample lights:
           light {
               color  1 .7 .6      # light color
               position  1 0 .5 0  # light position [distant light]
                                   # given in homogeneous coordinates.
                                   # With fourth component = 0,
                                   # this means a light coming from
                                   # direction (1,0,.5).
           }
     
           light {                        # Another light.
               color 1 1 1
               position  0 0 .5 1  # light at finite position ...
               location camera     # specified in camera coordinates.
                                   # (Since the camera looks toward -Z,
                                   # this example places the light
                                   # .5 unit behind the eye.)
               # Possible "location" keywords:
               #  global    light position is in world (well, universe) coordinates
               #             This is the default if no location specified.
               #  camera   position is in the camera's coordinate system
               #  local    position is in the coordinate system where
               #                   the appearance was defined
           }
       }                   # end lighting model
       texture {
             clamp st               # or ``s'' or ``t'' or ``none''
             file lump.tiff         # file supplying texture-map image
             alphafile mask.pgm.Z   # file supplying transparency-mask image
             apply blend            # or ``modulate'' or ``decal''
             transform  1 0 0 0     # surface (s,t,0,1) * tfm -> texture coords
                        0 1 0 0
                        0 0 1 0
                       .5 0 0 1
     
             background 1 0 0 1     # relevant for ``apply blend''
       }
     }                     # end appearance

There are rules for inheritance of appearance attributes when several are imposed at different levels in the hierarchy.

For example, Geomview installs a backstop appearance which provides default values for most parameters; its control panels install other appearances which supply new values for a few attributes; user-supplied geometry may also contain appearances.

The general rule is that the child's appearance (the one closest to the geometric primitives) wins. Further, appearance controls with "override" status (e.g. *+face or material { *diffuse 1 1 0 }) win over those without it.

Geomview's appearance controls use the "override" feature so as to be effective even if user-supplied objetos contain their own appearance settings. However, if a user-supplied objeto contains an appearance field with override status set, that property will be immune to Geomview's controls. geomview-1.9.4/doc/geomview-pt_BR.html/BBP-and-BEZ.html0000644000175000001440000001334310663302002017265 00000000000000 BBP and BEZ - Manual do Geomview

Next: , Previous: BBOX, Up: Object File Formats


4.2.4 Bezier Surfaces

The conventional file suffixes for Bezier surface files are .bbp or .bez. A file with either suffix may contain either type of patch.

Syntax:

       [ST]BBP -or- [C]BEZ<Nu><Nv><Nd>[_ST]
     			# Nu, Nv are u- and v-direction
     			# polynomial degrees in range 1..6
     			# Nd = dimension: 3->3-D, 4->4-D (rational)
     			# (The '<' and '>' do not appear in the input.)
     			# Nu,Nv,Nd are each a single decimal digit.
     			# BBP form implies Nu=Nv=Nd=3 so BBP = BEZ333.
     
     		# Any number of patches follow the header
     			# (Nu+1)*(Nv+1) patch control points
     			# each 3 or 4 floats according to header
       vertex(u=0,v=0)  vertex(1,0) ... vertex(Nu,0)
       vertex(0,1)			   ... vertex(Nu,1)
       ...
       vertex(0,Nv)		   ... vertex(Nu,Nv)
     
     			# ST texture coordinates if mentioned in header
       S(u=0,v=0)	T(0,0)	S(0,Nv) T(0,Nv)
       S(Nu,0)	T(Nu,0)	S(Nu,Nv) T(Nu,Nv)
     
     			# 4-component float (0..1) R G B A colors
     			# for each patch corner if mentioned in header
       RGBA(0,0)   RGBA(0,Nv)
       RGBA(Nu,0)  RGBA(Nu,Nv)

These formats represent collections of Bezier surface patches, of degrees up to 6, and with 3-D or 4-D (rational) vertices.

The header keyword has the forms [ST]BBP or [C]BEZ<Nu><Nv><Nd>[_ST] (the '<' and '>' are not part of the keyword.

The ST prefix on BBP, or _ST suffix on BEZuvn, indicates that each patch includes four pairs of floating-point texture-space coordinates, one for each corner of the patch.

The C prefix on BEZuvn indicates a colored patch, including four sets of four-component floating-point colors (red, green, blue, and alpha) in the range 0..1, one color for each corner.

Nu and Nv, each a single digit in the range 1..6, are the patch's polynomial degree in the u and v direction respectively.

Nd is the number of components in each patch vertex, and must be either 3 for 3-D or 4 for homogeneous coordinates, that is, rational patches.

BBP patches are bicubic patches with 3-D vertices, so BBP = BEZ333 and STBBP = BEZ333_ST.

Any number of patches follow the header. Each patch comprises a series of patch vertices, followed by optional (s,t) texture coordinates, followed by optional (r,g,b,a) colors.

Each patch has (Nu+1)*(Nv+1) vertices in v-major order, so that if we designate a vertex by its control point indices (u,v) the order is

          (0,0) (1,0) (2,0) ...  (Nu,0)
          (0,1) (1,1) (2,1) ...  (Nu,1)
          ...
          (0,Nv)            ...  (Nu,Nv)

with each vertex containing either 3 or 4 floating-point numbers as specified by the header.

If the header calls for ST coordinates, four pairs of floating-point numbers follow: the texture-space coordinates for the (0,0), (Nu,0), (0,Nv), and (Nu,Nv) corners of the patch, respectively.

If the header calls for colors, four four-component (red, green, blue, alpha) floating-point colors follow, one for each patch corner.

The series of patches ends at end-of-file, or with a closebrace if incorporated in an objeto reference. geomview-1.9.4/doc/geomview-pt_BR.html/appearance.html0000644000175000001440000000367610663302002017613 00000000000000 appearance - Manual do Geomview

4.3.1 Appearance Objects

Appearances are OOGL objetos of their own right, which simply means that it is possible to give them symbolic names (see References). There are other sections dealing with appearance details. See Appearances. geomview-1.9.4/doc/geomview-pt_BR.html/Installation.html0000644000175000001440000000431010663302002020137 00000000000000 Installation - Manual do Geomview

Next: , Previous: Mathematica, Up: Top


10 Installation

What you do to install Geomview depends on which kind of computer you have and on whether you have the source distribution or the binary distribution.

In general, if you don't care about looking at Geomview's source code, you should get one of the binary distribution. The binary installation is much easier and quicker than compiling and installing the source code.

geomview-1.9.4/doc/geomview-pt_BR.html/car.html0000644000175000001440000000315210663302002016246 00000000000000 car - Manual do Geomview

Next: , Previous: camera-reset, Up: GCL Reference


7.2.19 car

(car LIST)
returns the first element of LIST.
geomview-1.9.4/doc/geomview-pt_BR.html/position.html0000644000175000001440000000326610663302002017353 00000000000000 position - Manual do Geomview

Next: , Previous: pickable, Up: GCL Reference


7.2.92 position

(position objectID otherID)
Set the transform of objectID to that of otherID.
geomview-1.9.4/doc/geomview-pt_BR.html/BBOX.html0000644000175000001440000000616010663302002016235 00000000000000 BBOX - Manual do Geomview

Next: , Previous: MESH, Up: Object File Formats


4.2.3 BBOX: simple bounding boxes

This is a very simple toy-objeto: it takes 2 vertices and draws a (hyper-) cube which is the bounding box of the two vertices.

Syntax:

       BBOX
       x[0] y[0] z[0]
       x[1] y[1] z[1]

or

       4BBOX
       x[0] y[0] z[0] w[0]
       x[1] y[1] z[1] w[1]

or

       nBBOX
       Ndim # > 3
       x[0] y[0] z[0] w[0] ...
       x[1] y[1] z[1] w[1] ...

or

       4nBBOX
       Ndim # > 3
       d[0] x[0] y[0] z[0] w[0] ...
       d[0] x[1] y[1] z[1] w[1] ...

There is no BBOX binary format. The 4 modifyer has different meanings depending on the dimension of the bounding box: 4BBOX means that the 4 components of the vertices make up a 4-dimensional bounding-box. Using 4 in conjunction with n4nBBOX NDim – means that the vertices specified in the file have NDim+1 components, but the component at index 0 is the homogeneous divisor (in contrast to the ordinary 3d case where the homogeneous divisor would be the w – the third – component). geomview-1.9.4/doc/geomview-pt_BR.html/rawpick.html0000644000175000001440000000333010663302002017137 00000000000000 rawpick - Manual do Geomview

Next: , Previous: rawevent, Up: GCL Reference


7.2.99 rawpick

(rawpick CAMID X Y)
Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordinates. This is a low-level procedure not intended for external use.
geomview-1.9.4/doc/geomview-pt_BR.html/figmainpanel.html0000644000175000001440000000012110663302002020124 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/cursor_002dstill.html0000644000175000001440000000351010663302002020611 00000000000000 cursor-still - Manual do Geomview

Next: , Previous: copy, Up: GCL Reference


7.2.24 cursor-still

(cursor-still [INT])
Sets the number of microseconds for which the cursor must not move to register as holding still. If INT is not specified, the value will be reset to the default.
geomview-1.9.4/doc/geomview-pt_BR.html/Mouse-Motions.html0000644000175000001440000003247110663302002020225 00000000000000 Mouse Motions - Manual do Geomview

Next: , Previous: Loading, Up: Interaction


3.5 Using the Mouse to Manipulate Objects

Geomview permite a você manipular objetos com o mouse. Existem seis diferentes modos de movimento do mouse: rotação (Rotate), translação (Translate), vôo da câmera (Cam Fly), zoom da câmera (Cam Zoom), homotetia de um objeto geométrico (Geom Scale), e órbita de câmera (Cam Orbit). O painel de ferramentas tem um botão para cada um desses modos; para tracar os modos, clique sobre o botão correspondente. você pode também selecionar um modo através do navegador de modos de movimento (Motion Mode) no painel principal (Main).

Essa seção descreve a interação básica com o mouse. Para detalhes, veja Commands.

figs/tools.png

Figure 3.4: O Painel de Ferramentas.

Cada um dos modos de movimento usa um paradigma comum para como o movimento é aplicado. Em particular, cada modo de movimento depende do objeto alvo (target) atual e do atual objeto do centro (center. O obejto alvo atual e o atual objeto do centro são explicados nos parágrafos seguintes.

O objeto alvo atual é mostrado no campo Target no painel de ferramentas (Tools). Isso é o mesmo que o objeto selecionado no navegador de alvos (Targets) no painel principal (Main), e você pode mudar o alvo ou selecionando um novo objeto no navegador, digitando uma nova entrada no campo, ou selecionando um objeto na janela de câmera duplo-clicando no botão direito do mouse com o cursor sobre o objeto.

O atual objeto do centro é mostrado no campo Center no painel de ferramentas(Tools). Seu valor padrão é a palavra especial "target", que significa que o odbjeto do centro é o objeto que estiver designado como objeto alvo. Você pode mudar o objeto atual do centro para qualquer objeto digitando seu nome no campo Center. A orígem do objeto do centro é mantido fixo no modo rotação Rotate e no modo Orbit. Normalmente o objeto do centro é um dos objetos geométricos (geoms) existentes listados no navegador de alvos (Targets), o centro atual das rotações é a orígem daquele sistema de coordenadas daquele objeto. É possível, todavia, selecionar um ponto arbitrário de interesse sobre um objeto como o centro. Para detalhes, veja Point of Interest.

Isso também é possível mudando o botão BBox Center para escolher o centro de movimento como sendo o centro do objeto atual da caixa associada. Uma vez modificado o centro da caixa geométrica ativa associada irá tornar-se o centro do movimento, se você selecionar outro objeto, então o centro do movimento irá tornar-se o centro da caixa associada à aquele objeto. Nada modificação ocorrerá quando uma câmera ou o mundo (World) for selecionado, você tem que digitar a palavra target no campo Center para retornar ao valor padrão.

Você aplica um movimento de mouse pressionando ou o botão esquerdo ou o botão do meio do mouse com o cursor em uma janela de câmera e movendo o mouse. A maioria dos modos de movimento possui inércia (inertia), que significa que se você soltar o botão enquanto move o mouse, o movimento irá continuar. Para imaginar a inércia pode ser útil imaginar o cursor do mouse como sendo uma alça; quando você pressiona um botão do mouse para baixo, o mouse agarra firmemente no objeto alvo e você pode mover esse objeto. Quando você libera o botão do mouse, a alça libera o objeto. Liberando o botão do mouse enquanto move o mesmo é como abandonar o objeto — o objeto continua movendo-se independentemente do mouse. Inércia pode ser desligada; veja o menu de movimento (Motion) no painel principal (Main), descrito abaixo.

Generally, the botão esquerdo do mouse controla movimento no plano da tela, enquanto o botão médio do mouse controla movimento ao longo ou em torno da direção de avanço.

Pressionando o tecla "shift" enquanto arrasta com o botão esquerdo ou médio do mouse na maioria dos modos de movimento fornece movimentos de baixa velocidade , útil para ajustes finos.

Você pode selecionar qualquer ponto sobre um objeto (não apenas sua orígem) como centro do movimento pressionando a tecla "shift" enquanto clica no botão direito do mouse; isso escolhe o ponto de interesse.

Rotate
No modo rotação (Rotate), pressione o botão esquerdo do mouse para rotacionar o objeto alvo en torno do objeto do centro. A rotação ocorre na direção que você move o mouse. Especificamente, o eixo de rotação passa através da orígem do objeto do centro, é paralelo ao plano de visão da câmera, e é perpendicular à direção do movimento do mouse. Quando o centro for o alvo ("target"), isso significa que o objeto alvo rotaciona em torno de sua própria orígem.

O botã do meio do mouse no modo de movimento tipo rotação (Rotate) rotaciona o objeto alvo em torno de um eixo perpendicular ao plano de visão.

Translate
In Translate mode, hold the botão esquerdo do mouse down to translate the objeto alvo in the direction of mouse movimento. The middle mouse botão translates the target along an axis perpendicular to the view plane.

In Euclidean space, the objeto do centro is essentially irrelevant for translations. In hyperbolic and spherical spaces, where translations have a unique axis, this axis is chosen to go through the origin of the objeto do centro.

Cam Fly
Cam Fly is a crude flight simulator that lets you fly around the scene. It works by moving the camera. Move the mouse while holding the botão esquerdo do mouse down to point the câmera in a different direction. To move forward or backward, hold down the botã do meio and move the mouse vertically. Both of these movimentos have inertia; typically the easiest way to fly around a scene is to give the câmera a slight forward push by letting go of the botã do meio while moving the mouse upward, and then using the left botão to steer.

Cam Fly affects the janela de câmera that the mouse is in; it ignores the objeto alvo and the objeto do centro.

Cam Orbit
Cam Orbit mode lets you rotate the current câmera around the current center. The botão esquerdo do mouse does this rotation. The middle botão do mouse in Cam Orbit mode acts as in Cam Fly mode: it moves the câmera forward or backward.

In general Cam Orbit does not move the objeto alvo, although if the current câmera is selected as the target and the center is also the target, it will pivot that câmera about itself just as in Cam Fly mode.

Cam Zoom
Cam Zoom mode lets you change the current camera's field of view with the mouse; hold the botão esquerdo do mouse down and move the mouse to change it. The numeric value of the field of view is shown in the FOV field in the Camera panel.
Geom Scale
Geom Scale mode lets you enlarge or shrink a geom. It operates on the objeto alvo if that objeto is a geom. If the target is a camera, Geom Scale operates on the geom that was most recently the objeto alvo. Moving the mouse while holding down the botão esquerdo do mouse scales the objeto either up or down, depending on the direction of mouse movimento. The center of the applied scaling transformation is the objeto do centro.

Scaling is meaningful only in Euclidean space; attempts to scale are ignored in other spaces.

Geom Scale mode does not have inertia.

The Stop, Look At, Center, and Reset botões on the Tools panel perform actions related to movimentos but do not change the current modo de movimento.

Stop
The Stop botão causes all movimentos to stop. It affects all moving objetos, not just the objeto alvo. Its tecla de atalho is H.

The keyboard command h, which does not correspond to a panel botão, stops the current movimento for the objeto alvo only.

Look At
The Look At botão causes the current câmera to be moved to a position such that it is looking at the objeto alvo, and such that the objeto alvo more or less fills the window.

The Look At command is unreliable in non-Euclidean spaces.

Center
The Center botão undoes the objeto alvo's transformation, moving it back to its home position, which is where it was when you originally loaded it into Geomview.
Reset
The Reset botão stops all movimento and causes all objetos to move back to their home positions.

The Tools panel also sports a Main botão, to invoke the main panel in case it was dismissed or buried, and a Done botão to close the Tools panel.

The Main panel's Motion menu has special controls affecting how mouse movimentos are interpreted; the toggles are also accessible through a GCL command. See (ui-motion ...).

[ui] Inertia
Normally, moving objetos have inertia: if the mouse is still moving when the botão is released, the selected objeto continues to move. When Inertia is off, objetos cease to move as soon as you release the mouse.
[uc] Constrain Motion
It's sometimes handy to move an objeto in a direction aligned with a coordinate axis: exactly horizontally or vertically. Selecting Constrain Motion changes the interpretation of mouse movimentos to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical movimento. Note that the movimento is still along the X or Y axes of the câmera in which you move the mouse, not necessarily the objeto's own coordinate system.
[uo] Own Coordinates
It's sometimes handy to move objetos with respect to the coordinate system where they were defined, rather than with respect to some camera's view. While Own Coordinates is selected, all movimentos are interpreted that way: dragging the mouse rightward in translate mode moves the objeto in its own +X direction, and so on. May be especially useful in conjunction with the Constrain Motion botão.
geomview-1.9.4/doc/geomview-pt_BR.html/evert.html0000644000175000001440000000330010663302002016621 00000000000000 evert - Manual do Geomview

Next: , Previous: event-pick, Up: GCL Reference


7.2.46 evert

(evert GEOM-ID [yes|no])
Set the normal eversion state of GEOM-ID. If the second argument is omitted, toggle the eversion state.
geomview-1.9.4/doc/geomview-pt_BR.html/Modules.html0000644000175000001440000000604710663302002017117 00000000000000 Modules - Manual do Geomview

Next: , Previous: Customization, Up: Top


6 External Modules

An external module is a program that interacts with Geomview. A module communicates with Geomview through GCL and can control any apsect of Geomview that you can control through Geomview's user interface.

In many cases an external module is a specialized program that implements some mathematical algorithm that creates a geometric objeto that changes shape as the algorithm progresses. The module informs Geomview of the new objeto shape at each step, so the objeto appears to evolve with time in the Geomview window. In this way Geomview serves as a display engine for the module.

An external module may be interactive. It can respond to mouse and keyboard events that take place in a Geomview window, thus extending the capability of Geomview itself.

geomview-1.9.4/doc/geomview-pt_BR.html/replace_002dgeometry.html0000644000175000001440000000356710663302002021427 00000000000000 replace-geometry - Manual do Geomview

Next: , Previous: rehash-emodule-path, Up: GCL Reference


7.2.105 replace-geometry

(replace-geometry GEOM-ID PART-SPECIFICATION GEOMETRY)
Replace a part of the geometry for GEOM-ID.
geomview-1.9.4/doc/geomview-pt_BR.html/figmyfilelist.html0000644000175000001440000000011010663302002020337 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/ui_002dfreeze.html0000644000175000001440000000350710663302002020050 00000000000000 ui-freeze - Manual do Geomview

Next: , Previous: ui-emotion-run, Up: GCL Reference


7.2.133 ui-freeze

(ui-freeze {on|off})
Toggle updating user interface panels. Off by default.
geomview-1.9.4/doc/geomview-pt_BR.html/emodule_002ddefine.html0000644000175000001440000000406510663302002021037 00000000000000 emodule-define - Manual do Geomview

Next: , Previous: emodule-clear, Up: GCL Reference


7.2.34 emodule-define

(emodule-define NAME SHELL-COMMAND ...)
Define an external module called NAME, which then appears in the external-module browser. The SHELL-COMMAND string is a UNIX shell command which invokes the module. See (emodule-run ...) for discussion of external modules.
geomview-1.9.4/doc/geomview-pt_BR.html/geomview_002dversion.html0000644000175000001440000000334210663302002021457 00000000000000 geomview-version - Manual do Geomview

Next: , Previous: geometry, Up: GCL Reference


7.2.51 geomview-version

(geomview-version)
Returns a string representing the version of geomview that is running.
geomview-1.9.4/doc/geomview-pt_BR.html/History.html0000644000175000001440000001013410663302002017140 00000000000000 History - Manual do Geomview

Next: , Previous: Copying, Up: Top


History of Geomview's Development

Geomview was originally written at the Geometry Center at the University of Minnesota in Minneapolis. The Geometry Center was a research and education center funded by the National Science Foundation, with a mission to promote research and communication of mathematics. Much of the work there involved the use of computers to help visualize mathematical concepts.

The project that eventually led to Geomview began in the summer of 1988 with the work of Pat Hanrahan on a viewing program called MinneView. Shortly thereafter Charlie Gunn begin developing OOGL (Object Oriented Graphics Language) in conjunction with MinneView. Many people contributed to OOGL and MinneView, including Stuart Levy, Mark Meuer, Tamara Munzner, Steve Anderson, Mario Lopez, Todd Kaplan.

In 1991 the staff of the Geometry Center began work on a new improved version of OOGL, and a new and improved viewing program, which they called Geomview. At that time essentially the only game in town for interactive 3D graphics was Silicon Graphics (SGI), so Geomview was developed initially on SGI workstations, using IRIS GL. The first version was finished in January of 1992. It immediately became very popular among visitors to the Geometry Center, and through the Center's ftp archive (this was before the web) people at other institutions began using it too.

In addition to SGI workstations the Geometry Center had quite a few NeXT stations, so soon after Geomview was running on SGIs the staff developed a version for NeXTStep as well. By this time there were several thousand people using it around the world.

A few years later the staff ported Geomview to X windows and OpenGL, and eventually, with the demise of NeXT, the NeXT version fell by the wayside.

In its mission to foster communication among researchers and educators, the Geometry Center developed a web site, www.geom.umn.edu, in late 1993. It was one of the first 300 web sites in existence. A part of the web site was of course devoted to Geomview, and helped to spread the word about its existence.

The Geometry Center closed its "brick and mortar" facilities in August of 1998 (NSF cut its funding), but the web site continued to exist, and Geomview continued to be very popular around the world. In December of 1999 some of the former Geometry Center staff set up http://www.geomview.org as a permanent home on the web for Geomview.

Geomview's original authors, as well as a number of other volunteers around the world, are still actively involved in using and developing Geomview.

geomview-1.9.4/doc/geomview-pt_BR.html/look.html0000644000175000001440000000441210663302002016445 00000000000000 look - Manual do Geomview

Next: , Previous: load-path, Up: GCL Reference


7.2.64 look

(look [objectID] [cameraID])
Rotates the named câmera to point toward the center of the bounding box of the named objeto (or the origin in hyperbolic or spherical space). In Euclidean space, moves the câmera forward or backward until the objeto appears as large as possible while still being entirely visible. Equivalent to
          progn (
          	(look-toward [objectID] [cameraID] {center | origin})
          	[(look-encompass [objectID] [cameraID])]
          )
     

If objectID is not specified, it is assumed to be World. If cameraID is not specified, it is assumed to be targetcam.

geomview-1.9.4/doc/geomview-pt_BR.html/Unix-Binary-Installation.html0000644000175000001440000001171310663302002022307 00000000000000 Unix Binary Installation - Manual do Geomview

10.1 Installing the Unix Binary Distribution

If you have just obtained a copy of the binary distribution for a Unix system (Linux, SGI, Solaris, HP, etc), you should be able to run Geomview and make use of most of its features immediately after unpacking it by cd'ing to the directory that it is in and typing geomview.

In order to fully install Geomview so that you can run it from any directory and use all of its features, follow the steps in this section. In particular, you must go through this installation procedure in order to use Geomview to display Mathematica graphics.

Geomview is distributed in a directory that contains various files and subdirectories that Geomview needs at run-time, such as data files and external modules. It also contains other things distributed with Geomview, such as documentation and (in the soure-code distribution) source-code. We refer to the root directory of this tree as the $GEOMROOT directory. This is the directory called Geomview that is created when you unpack the distribution file.

To install Geomview on your system, arrange for the $GEOMROOT directory to be in a permanent place. Then, in a shell window, cd to that directory and type install. This runs a shell script which does the installation after asking you several questions about where you want to install the various components of Geomview.

After running the install script you should now be able to run Geomview from any directory on your system. (You may need to give the rehash command in any shells on your computer that were started up before you did the installation.)

The install script puts copies of the files in $GEOMROOT/bin/<CPU> and $GEOMROOT/man into the directories you specified for executables and man pages, respectively. Once you have done the installation you can cut down one the disk space required by Geomview by removing some files from these directories, since copies have been installed elsewhere. You should first test that your installed Geomview works properly because once you remove these files from their distribution directories you will not be able to do the installation again.

In particular, the files you can remove are

$GEOMROOT/bin/<MACHTYPE>:
(where <MACHTYPE> is the type of system you are on, e.g. linux, sgi, hpux, etc). Remove all files from here except gvx, which is the geomview executable file. DO NOT REMOVE gvx. It is not installed elsewhere.
$GEOMROOT/man:
You can remove all the files in this directory.
geomview-1.9.4/doc/geomview-pt_BR.html/RenderMan.html0000644000175000001440000001174610663302002017364 00000000000000 RenderMan - Manual do Geomview

Next: , Previous: Geomview.m, Up: Mathematica


9.3 Using Mathematica to generate RenderMan files

In addition to the WriteOOGL and Geomview commands described above, the package OOGL.m also defines the command WriteRIb which writes a 3D graphics objeto to a RenderMan RIB file: WriteRIB[file, graphics] writes graphics to file file. RenderMan is a commercial rendering system available from Pixar, Inc., which can produce extremely high quality images.

     In[1] := <<OOGL.m
     
     In[2] := <<Graphics/Polyhedra.m
     
     In[3] := Graphics3D[Cube[]]
     
     Out[3] := -Graphics3D-
     
     In[4] := WriteRIB["cube.rib", %3]
     
     Out[4] := -Graphics3D-

This generates the file math.rib. This is a ready-to-render RIB file of the given geometry, using a default câmera position, lighting, and the “plastic” shader. In a shell window, type render cube.rib to generate the image file mma.tiff. Of course, you need to have RenderMan installed for this to work. A shortcut to render from inside Mathematica is WriteRIB["!render", foo].

WriteRIb works by first converting the Mathematica graphics objeto to OOGL format using WriteOOGL and then calls an external program oogl2rib to convert OOGL to RIB format. The oogl2rib program takes several options which you can specify in a string as an optional third argument to WriteRIb. The default option string is " -n mma.tiff ", which indicates that the RIB file should generate a rendered TIFF file named mma.tiff. A particularly useful option is -g, which tells oogl2rib to convert only the geometry into a RIB fragment. You can insert that fragment into a full RIB file of your own making with câmera positions and shaders of your choice, to harness the full power of RenderMan.

The full usage of oogl2rib is:

     oogl2rib [-n name] [-B r,g,b] [-w width] [-h height] [-fgb] [infile] [outfile]

By default it reads from stdin and writes to stdout. Either infile or outfile may be -, which means use stdin/stdout. The options are:

-n name
Use name for the name of the rendered TIFF file (default "geom.tiff") or framebuffer window (default "geom.rib").
-B r,g,b
Use background color (r,g,b). Each component ranges from 0 to 1. Default: none.
-w width -h height
Rendered frame will be width by height pixels.
-f
RIB file renders to on-screen framebuffer instead of TIFF file.
-g
Output only the geometry in RIB format.
-b
Output only a Quick Renderman clip objeto. Ignores -nBwhf.
geomview-1.9.4/doc/geomview-pt_BR.html/Mathematica.html0000644000175000001440000000650210663302002017720 00000000000000 Mathematica - Manual do Geomview

Next: , Previous: Non-Euclidean Geometry, Up: Top


9 Mathematica Graphics in Geomview or RenderMan

Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc.

There are two ways to do this.

  1. Use Mathematica to write a graphics objeto to a file in OOGL format or in RIB format.
  2. Use Geomview as the default display for all 3D graphics output in Mathematica.
You can also use these packages to save Mathematica graphics in RenderMan (RIB) format.

Since the format of Mathematica graphics objetos is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either of the above you must install this package.

geomview-1.9.4/doc/geomview-pt_BR.html/position_002dtoward.html0000644000175000001440000000363110663302002021315 00000000000000 position-toward - Manual do Geomview

Next: , Previous: position-at, Up: GCL Reference


7.2.94 position-toward

(position-toward objectID otherID [center | origin])
Rotate objectID so that the center of the bounding box or the origin of the coordinate system of the otherID lies on the positive z-axis of the first objeto. Default is the center of the bounding box.
geomview-1.9.4/doc/geomview-pt_BR.html/Geomview_002em.html0000644000175000001440000001154110663302002020167 00000000000000 Geomview.m - Manual do Geomview

Next: , Previous: OOGL.m, Up: Mathematica


9.2 Using Geomview as Mathematica's Default 3D Display

The package Geomview.m arranges for Geomview to be the default display program for 3D graphics in Mathematica. To load it, give the command << Geomview.m to Mathematica. Thereafter, whenever you display 3D graphics with Plot3D or Show, Mathematica will send the graphics to Geomview.

Loading Geomview.m implicitly loads OOGL.m as well, so you can use the Geomview and WriteOOGL as described above after loading Geomview.m. You do not have to separately load OOGL.m.

     % math
     Mathematica 2.0 for SGI Iris
     Copyright 1988-91 Wolfram Research, Inc.
      -- GL graphics initialized --
     
     In[1] := <<Geomview.m
     
     In[2] := Plot3D[x^2 + y^2, {x, -2, 2}, {y, -2, 2}]
     
     Out[2] := -SurfaceGraphics-

This invokes geomivew and loads the graphics objeto into it.

     In[3] := Plot3D[{x*y + 6, RGBColor[0,x,y]}, {x,0,1}, {y,0,1}]
     
     Out[3] := -SurfaceGraphics-

This replaces the previous Geomview objeto by the new objeto.

     In[4] := Geomview[{%2,%3}]
     
     Out[4] := {-SurfaceGraphics-, -SurfaceGraphics-}

This displays both objetos at once. You also can have more than one Mathematica objeto at a time on display in Geomview, and have separate control over them, by using the Geomview command with a name, See OOGL.m.

     In[5] := Graphics3D[ {RGBColor[1,0,0], Line[{ {2,2,2},{1,1,1} }] }]
     
     Out[5] := -Graphics3D-
     
     In[6] := Geomview["myline", %5]

This addes the Line specified in In[5] to the existing Geomview display. It can be controlled independently of the "Mathematica" objeto, which is currently the list of two plots.

     In[7] := <<GL.m

If you're on an SGI, loading GL.m returns Mathematica to its usual 3D graphics display. The following plot will appear in a normal static Mathematica window.

     In[8] := ParametricPlot3D[{Sin[x],Sin[y],Sin[x]*Cos[y]}, {x,0,Pi},{y,0,Pi}]
     
     Out[8] := -Graphics3D-

We can return to Geomview graphics at any time by reloading Geomview.m.

     In[9] := <<Geomview.m
     
     In[10] := Show[%8]
     
     Out[10] := -Graphics3D-
     
     In[11] := ParametricPlot3D[
     	   {(2*(Cos[u] + u*Sin[u])*Sin[v])/(1 + u^2*Sin[v]^2),
     	   (2*(Sin[u] - u*Cos[u])*Sin[v])/(1 + u^2*Sin[v]^2),
     	   Log[Tan[v/2]] + (2*Cos[v])/(1 + u^2*Sin[v]^2)},
     	  {u,-4,4},{v,.01,Pi-.01}]
     
     Out[11] := -Graphics3D-

This last plot is Kuen's surface, a surface of constant negative curvature. Parametrization from Alfred Gray's Modern Differential Geometry of Curves and Surfaces textbook. geomview-1.9.4/doc/geomview-pt_BR.html/Command-Line-Options.html0000644000175000001440000002241010663302002021373 00000000000000 Command Line Options - Manual do Geomview

3.2 Command Line Options

Aqui estão as opções de linha de comando que o Geomview permite:

`-b r g b'
Escolhe a cor de fundo da janela de câmera para valores fornecidos de r g b.
`-c arquivo'
Interpreta os comandos GCL em arquivo, que pode ser o símbolo especial - para a entrada padrão. Paa uma descrição de GCL, veja GCL.
`-c comando'
Comandos podem também serem fornecidos literalmente, como em
          -c "(ui-panel main off)"
     

Uma vez que comando inclui parêntesis, que possuem significado especial para o shell, comando deve receber apóstrofo. Multiplas opções -c são permitidas.

`-wins n'
Faz com que Geomview mostre inicialmente n janelas de câmera.
`-wpos largura,altura[@xmin,ymin]'
Especifica a localização inicial e o tamanho da primeira janela de câmera. Os valores para largura, altura, xmin, e ymin estão em coordenadas de tela (pixel).
`-M[cg][ps[un|in|in6]] PIPENOME|TCPPORT'
A opção `-M' aceita modificadores: um sufixo `g' espera dados geométricos (o padrão), enquanto um sufixo `c' espera comandos GCL. Um `p' implica que a conecção pode usar um pipe nomeado (o padrão para tudo exceto para "NeXT"), enquanto `s' implica no uso de um "UNIX-domain socket" (o padrão em "NeXT"). Uma vez que na versão 1.9 do Geomview "Internet domain sockets" são também suportados; use `sin' para fazer o Geomview escutar uma porta IPv4 fornecida por TCPPORT, ou use `sin6' para fazer Geomview escute uma porta IPv6 (também como especificado em TCPPORT). `sun' é um sinônimo para `s', i.e. use o "Unix domain socket" com o nome PIPENOME. Se PIPENOME inicia com uma barra ('/'), então esse nome é assumido ser um caminho absoluto, de outra forma o pipe nomeado ou socket é criado sob o diretório ${TMPDIR}/geomview/.

Escutando fluxo de comando em portas TCP pode ser um risco de segurança, como Geomview por si mesmo não toma nenhum tipo de precaução de segurança, Geomview simplesmente executa todos os comandos alimentados a ele através do socket de rede. Isso também implica entrada e saída para unidades de armazenamento locais devem ser permitidas remotamente.

Exemplos:

-M nome_de_objeto
Mostra (possivelmente mudando dinamicamente) geometria enviada de programas geomstuff ou togeomview. Essa opção "-M" escuta o pipe nomeado /tmp/geomview/nome_de_objeto; você pode conseguir o mesmo efeito com os comandos de shell abaixo:
               mkdir /tmp/geomview
               mknod /tmp/geomview/nome_de_objeto p
          

(assumindo que o diretório e o pipe nomeado não existam atualmente), então executando o comando GCL:

               (geometry nome_de_objeto  < /tmp/geomview/nome_de_objeto)
          

(see (geometry ...))

-Mc pipenome
Como `-M' acima, mas espera comandos GCL, em lugar de dados geométricos OOGL, na conecção.
-Mcs nome
Lê comandos a partir do "UNIX-domain socket" nomeado. /tmp/geomview/nome
-Mcsin 40000
Lê comandos a partir da porta IPv4 `40000'. Geomview por si mesmo não toma qualquer precaução de segurança, de forma que "-Mcsin 40000" pode ser um risco de segurança.

`-noopengl'
Desabilita o uso de OpenGL para (possivelmente) conversão acelerada de hardware, mesmo que o binário do Geomview tenha suporte a OpenGL compilado internamente. "-noopengl" também desabilita o suporte a transparência e texturas na janelas de câmera. Instantâneos "RenderMan" ainda terão a transparência correta e suporte a alguma textura limitada.
`-nopanels'
Inicia sem mostrar nenhum painel, somente a janelas gráficas. Painéis podem ser invocados mais tarde da forma usual com as teclas de atalho Px ou com comando ui-panel. Veja (ui-panel ...).
`-noinit'
Não lê nenum arquivo de inicialização. Por padrão, geomview lê o arquivo .geomview do systema, seguido daqueles em ${HOME}/.geomview e em ./.geomview.
`-e modulo'
Inicial um módulo externo; modulo é o nome associado ao módulo chamado, aparecendo no painel principal no navegador de "Applications", como definido pelo comando emodule-define. Veja (emodule-define ...).
`-start module args ...'
Como -e mas permite a você enviar argumentos para o módulo externo. "–" sinaliza o fim da lista de argumentos; o "–" pode ser omitido se for o último argumento na linha de comando do Geomview.
`-run coamando-shell args ...'
Como "-start" mas toma o caminho de arquivos do executável do módulo externo em lugar do nome do módulo. Os caminhos de arquivo de todos os diretórios de módulos conhecidos são anexados ao final do caminho de busca do UNIX quando for invocado o comando-shell.
geomview-1.9.4/doc/geomview-pt_BR.html/new_002dcenter.html0000644000175000001440000000375210663302002020226 00000000000000 new-center - Manual do Geomview

Next: , Previous: new-camera, Up: GCL Reference


7.2.82 new-center

(new-center [id])
Stop id, then set id's transform to the identity. Default id is target. Also, if the id is a camera, calls (look-recenter World id). The main function of the call to (look-recenter) is to place the câmera so that it is pointing parallel to the z axis toward the center of the world.
geomview-1.9.4/doc/geomview-pt_BR.html/figinitial.html0000644000175000001440000000010610663302002017614 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/camera_002ddraw.html0000644000175000001440000000340210663302002020332 00000000000000 camera-draw - Manual do Geomview

Next: , Previous: camera, Up: GCL Reference


7.2.16 camera-draw

(camera-draw CAM-ID [yes|no])
Say whether or not câmeras should be drawn in CAM-ID; yes if omitted.
geomview-1.9.4/doc/geomview-pt_BR.html/pick.html0000644000175000001440000000615610663302002016436 00000000000000 pick - Manual do Geomview

Next: , Previous: or, Up: GCL Reference


7.2.89 pick

(pick COORDSYS GEOMID G V E F P VI EI FI)
The pick command is executed internally in response to pick events (right mouse double clique).
COORDSYS
= coordinate system in which coordinates of the following arguments are specified. This can be:
world
world coord sys
self
coord sys of the picked geom (GEOMID)
primitive
coord sys of the actual primitive within the picked geom where the pick occurred.

GEOMID
= id of picked geom
G
= picked point (actual intersection of pick ray with objeto)
V
= picked vertex, if any
E
= picked edge, if any
F
= picked face
P
= path to picked primitive [0 or more]
VI
= index of picked vertex in primitive
EI
= list of indices of endpoints of picked edge, if any
FI
= index of picked face

External modules can find out about pick events by registering interest in calls to pick via the interest command.

In the ND-viewing context the co-ordinates are actually ND-points. They correspond to the 3D points of the pick relative to the sub-space defined by the viewport of the câmera where the pick occurred. The co-ordinates are then padded with zeroes and transformed back to the co-ordinate system defined by COORDSYS.

geomview-1.9.4/doc/geomview-pt_BR.html/Non_002dEuclidean-Geometry.html0000644000175000001440000001016710663302002022367 00000000000000 Non-Euclidean Geometry - Manual do Geomview

Next: , Previous: GCL, Up: Top


8 Non-Euclidean Geometry

Geomview supports hyperbolic and spherical geometry as well as Euclidean geometry. The three botões at the bottom of the Main panel are for setting the current geometry type.

In each of the three geometries, three models are supported: Virtual, Projective, and Conformal. You can change the current model with the Model browser on the Camera panel. Each Geomview câmera has its own model setting.

The default model is all three spaces is Virtual. This corresponds to the câmera being in the same space as, and moving under the same set of transformations as, the geometry itself.

In Euclidean space Virtual is the most useful model. The other models were implemented for hyperbolic and spherical spaces and just happen to work in Eucldiean space as well: Projective is the same as Virtual but by default displays the unit sphere, and Conformal displays everything inverted in the unit sphere.

In hyperbolic space, the Projective model setting gives a view of the projective ball model of hyperbolic 3-space imbedded in Euclidean space. The câmera is initially outside the unit ball. In this model, the câmera moves by Euclidean movimentos and geometry moves by hyperbolic movimentos. Conformal model is similar but shows the conformal ball model instead.

In spherical space, the Projective model gives a view of half of the 3-sphere imbedded in Euclidean 3-space. Spherical movimentos give rise to projective transformations in the Projective model, and to Moebius transformations in the Conformal model. In both of these models the câmera moves by Euclidean movimentos.

In Projective and Conformal models, the unit sphere is drawn by default. You can turn it off and on at will using the Draw Sphere botão in the Camera panel. In the Conformal model, polygons and edges are subdivided as necessary to make them look curved. The parameters which determine this subdivision can be set with the set-conformal-refine GCL command. See (set-conformal-refine ...).

There are several sample hyperbolic space objetos in the data/geom/hyperbolic subdirectory of the Geomview directory. Likewise, the subdirectory data/geom/spherical contains several sample spherical space objetos. geomview-1.9.4/doc/geomview-pt_BR.html/ui_002demotion_002drun.html0000644000175000001440000000365010663302002021513 00000000000000 ui-emotion-run - Manual do Geomview

Next: , Previous: ui-emotion-program, Up: GCL Reference


7.2.132 ui-emotion-run

(ui-emotion-run EMODULE)
This is an obsolete command. Use its new eqivalent emodule_start instead.
geomview-1.9.4/doc/geomview-pt_BR.html/dice.html0000644000175000001440000000343010663302002016404 00000000000000 dice - Manual do Geomview

Next: , Previous: delete, Up: GCL Reference


7.2.27 dice

(dice GEOM-ID N)
Dice any Bezier patches within GEOM-ID into NxN meshes; default 10. See also the appearance attribute patchdice, which makes this command obsolete.
geomview-1.9.4/doc/geomview-pt_BR.html/ui_002dpanel.html0000644000175000001440000000521310663302002017663 00000000000000 ui-panel - Manual do Geomview

Next: , Previous: ui-motion, Up: GCL Reference


7.2.136 ui-panel

(ui-panel PANELNAME {on|off} [WINDOW])
Do or don't display the given user-interface panel. Case is ignored in panel names. Current PANELNAMEs are:
geomview
main panel
tools
movimento controls
appearance
appearance controls
cameras
câmera controls
lighting
lighting controls
obscure
obscure controls (doesn't seem to exist any more)
materials
material properties controls
command
command entry box
credits
geomview credits
By default, the geomview and tools panels appear when geomview starts. If the optional Window is supplied, a position clause (e.g. (ui-panel obscure on { position xmin xmax ymin ymax }) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. (ui-panel obscure on {)} causes interactive positioning.
geomview-1.9.4/doc/geomview-pt_BR.html/write_002dsexpr.html0000644000175000001440000000342310663302002020443 00000000000000 write-sexpr - Manual do Geomview

Next: , Previous: write-handle, Up: GCL Reference


7.2.147 write-sexpr

(write-sexpr FILENAME LISPOBJECT)
Writes the given LISPOBJECT to FILENAME. This function is intended for internal debugging use only.
geomview-1.9.4/doc/geomview-pt_BR.html/position_002dat.html0000644000175000001440000000356410663302002020426 00000000000000 position-at - Manual do Geomview

Next: , Previous: position, Up: GCL Reference


7.2.93 position-at

(position-at objectID otherID [center | origin])
Translate objectID to the center of the bounding box or the origin of the coordinate system of otherID (parallel translation). Default is center.
geomview-1.9.4/doc/geomview-pt_BR.html/xform_002dset.html0000644000175000001440000000335210663302002020077 00000000000000 xform-set - Manual do Geomview

Next: , Previous: xform-incr, Up: GCL Reference


7.2.150 xform-set

(xform-set ID TRANSFORM)
Overwrite the current objeto transform with TRANSFORM (set objeto ID's transform to TRANSFORM).
geomview-1.9.4/doc/geomview-pt_BR.html/Function-Index.html0000644000175000001440000012303710663302002020340 00000000000000 Function Index - Manual do Geomview

Next: , Previous: Contributing, Up: Top


Function Index

Table of Contents

geomview-1.9.4/doc/geomview-pt_BR.html/emodule_002dstart.html0000644000175000001440000000357310663302002020745 00000000000000 emodule-start - Manual do Geomview

Next: , Previous: emodule-sort, Up: GCL Reference


7.2.40 emodule-start

(emodule-start NAME)
Starts the external module NAME, defined by emodule-define. Equivalent to clicando on the corresponding module-browser entry.
geomview-1.9.4/doc/geomview-pt_BR.html/zoom.html0000644000175000001440000000316110663302002016465 00000000000000 zoom - Manual do Geomview

Previous: xform-set, Up: GCL Reference


7.2.151 zoom

(zoom CAM-ID FACTOR)
Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number.
geomview-1.9.4/doc/geomview-pt_BR.html/update_002ddraw.html0000644000175000001440000000351110663302002020365 00000000000000 update-draw - Manual do Geomview

Next: , Previous: update, Up: GCL Reference


7.2.141 update-draw

(update-draw CAM-ID [timestep_in_seconds])
Apply each incremental movimento once and then draw CAM-ID. Applies timestep seconds' worth of movimento, or uses elapsed real time if timestep is absent or zero.
geomview-1.9.4/doc/geomview-pt_BR.html/set_002demodule_002dpath.html0000644000175000001440000000457210663302002022005 00000000000000 set-emodule-path - Manual do Geomview

7.2.112 set-emodule-path

(set-emodule-path (PATH1 ... PATHN))
Sets the search path for external modules. The PATHi should be pathnames of directories containing, for each module, the module's executable file and a .geomview-<modulename> file which contains an (emodule-define ...) command for that module. This command implicitly calls (rehash-emodule-path) to rebuild the application brower from the new path setting. The special directory name + is replaced by the existing path, so e.g. (set-emodule-path (mydir +)) prepends mydir to the path.
geomview-1.9.4/doc/geomview-pt_BR.html/new_002dcamera.html0000644000175000001440000000362110663302002020171 00000000000000 new-camera - Manual do Geomview

Next: , Previous: new-alien, Up: GCL Reference


7.2.81 new-camera

(new-camera name [CAMERA])
Create a new câmera with the given name (a string). If a câmera with that name already exists, the new objeto is given a unique name. If CAMERA is omitted a default câmera is used.
geomview-1.9.4/doc/geomview-pt_BR.html/backcolor.html0000644000175000001440000000341410663302002017441 00000000000000 backcolor - Manual do Geomview

Next: , Previous: ap-override, Up: GCL Reference


7.2.11 backcolor

(backcolor CAM-ID R G B)
Set the background color of CAM-ID; R G B are numbers between 0 and 1.
geomview-1.9.4/doc/geomview-pt_BR.html/interest.html0000644000175000001440000000603010663302002017334 00000000000000 interest - Manual do Geomview

Next: , Previous: input-translator, Up: GCL Reference


7.2.60 interest

(interest (COMMAND [args]))
Allows you to express interest in a command. When geomview executes that command in the future it will echo it to the communication pool from which the interest command came. COMMAND can be any command. Args specify restrictions on the values of the arguments; if args are present in the interest command, geomview will only echo calls to the command in which the arguments match those given in the interest command. Two special argument values may appear in the argument list. * matches any value. nil matches any value but supresses the reporting of that value; its value is reported as nil.

The purpose of the interest command is to allow external modules to find out about things happening inside geomview. For example, a module interested in knowing when a geom called foo is deleted could say (interest (delete foo)) and would receive the string (delete foo) when foo is deleted.

Picking is a special case of this. For most modules interested in pick events the command (interest (pick world)) is sufficient. This causes geomview to send a string of the form (pick world ...) every time a pick event (right mouse double clique). See the (pick ...) command for details.

geomview-1.9.4/doc/geomview-pt_BR.html/sleep_002dfor.html0000644000175000001440000000354510663302002020053 00000000000000 sleep-for - Manual do Geomview

Next: , Previous: shell, Up: GCL Reference


7.2.118 sleep-for

(sleep-for TIME)
Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; sleep-for inside progn won't delay execution of the rest of the progn's contents.
geomview-1.9.4/doc/geomview-pt_BR.html/event_002dmode.html0000644000175000001440000000405410663302002020216 00000000000000 event-mode - Manual do Geomview

Next: , Previous: event-keys, Up: GCL Reference


7.2.44 event-mode

(event-mode MODESTRING)w
Set the mouse event (movimento) mode; MODESTRING should be one of the following strings:
  1. "[r] Rotate"
  2. "[t] Translate"
  3. "[z] Cam Zoom"
  4. "[s] Geom Scale"
  5. "[f] Cam Fly"
  6. "[o] Cam Orbit"
  7. "[le] Edit Lights"
geomview-1.9.4/doc/geomview-pt_BR.html/emodule_002dsort.html0000644000175000001440000000342610663302002020574 00000000000000 emodule-sort - Manual do Geomview

Next: , Previous: emodule-run, Up: GCL Reference


7.2.39 emodule-sort

(emodule-sort)
Sorts the modules in the application browser alphabetically.
geomview-1.9.4/doc/geomview-pt_BR.html/Package-Installation.html0000644000175000001440000001376510663302002021506 00000000000000 Package Installation - Manual do Geomview

Previous: Package Details, Up: Mathematica


9.6 Installing the Mathematica Packages

If Geomview is properly installed on your system according to the instructions in See Installation, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed.

In this section, the phrase Geomview installation refers any of the procedures in See Installation. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution.

  1. The relevant mathematica files are OOGL.m, Geomview.m, and BezierPlot.m; Mathematica must be able to find these files. They are distributed in the $GEOMROOT/mathematica subdirectory of the binary distributions, and in the $GEOMROOT/src/bin/geomutil/math2oogl subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the $Path variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path.

    The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (MMAPACKAGEDIR). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the $Path variable each time you run Mathematica.

  2. The package OOGL.m needs to be able to invoke the programs geomview, math2oogl, and oogl2rib. The Geomview installation procedure installs these programs into a directory that you specify for executables (BINDIR). Ideally, this directory should be on your shell's $path. More specifically, it should be on the $path of the shell in which Mathematica runs; the directory /usr/local/bin is usually a good choice. You can see the list of directories on this path by giving the command !echo $path in Mathematica.

    If for some reason you can't arrange for geomview, math2oogl, and oogl2rib to be in a directory on the shell's $path, you can modify OOGL.m to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables $GeomviewPath and $GeomRoot, which are defined near the top of the file. Change $GeomviewPath to the absolute pathname of the geomview shell script on your system. Change $GeomRoot to the absolute pathname of the $GEOMROOT directory on your system. If you do this, you should also make sure there are copies of geomview, math2oogl, and oogl2rib in the $GEOMROOT/bin/<CPU>.

  3. The geomview shell script, which OOGL.m uses to invoke Geomview, needs to be able to find the geomview executable file ( called gvx). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the geomview script are correct.
geomview-1.9.4/doc/geomview-pt_BR.html/Platforms.html0000644000175000001440000000624710663302002017460 00000000000000 Platforms - Manual do Geomview

Next: , Previous: History, Up: Top


Supported Platforms

Geomview 1.9 pode – em princípio – compilar e executarsobre qualquer claramente recente sistemas operacionais semelhantes ao Unix. Especificamente, Geomview executa sobre Linux e sobre Cygwin (Cygwin emula um ambiente semelhante ao SystemV Unix environment sob o Microsoft Windows). Desafortunadamente Geomview compila com MacOS X (Darwin), mas aparentemente comunicações com Geomview por meio de pipes e sockets causam falha de segmentacão. Sinta-se livre para consertar essa falha! Veja Contributing, para detalhes. geomview-1.9.4/doc/geomview-pt_BR.html/setenv.html0000644000175000001440000000350510663302002017007 00000000000000 setenv - Manual do Geomview

Next: , Previous: set-motionscale, Up: GCL Reference


7.2.115 setenv

(setenv name string)
sets the environment variable name to the value string; the name is visible to geomview (as in pathnames containing $name) and to processes it creates, e.g. external modules.
geomview-1.9.4/doc/geomview-pt_BR.html/window.html0000644000175000001440000000734410663302002017017 00000000000000 window - Manual do Geomview

Previous: camera, Up: Non-geometric objects


4.3.6 window

A window objeto specifies size, position, and other window-system related information about a window in a device-independent way.

The syntax for a window objeto is:

     window ::=
     
     	[ "window" ]			(optional keyword)
     	  [ "{" ]			(curly brace, often required)
     
     	    			(any of the following, in any order)
     
     		"size"  <xsize> <ysize>
     				(size of the window)
     
     		"position"  <xmin> <xmax> <ymin> <ymax>
     				(position & size)
     
     
     		"noborder"
     				(specifies the window should
     				 have no window border)
     
     		"pixelaspect"  <aspect>
     			    (specifies the true visual aspect ratio
     			     of a pixel in this window in the sense
     			     xsize/ysize, normally 1.0.
     			     For stereo hardware which stretches the
     			     display vertically by a factor of 2,
     			     ``pixelaspect 0.5'' might do.
     			     The value is used when computing the
     			     projection of a camera associated with
     			     this window.)
     
     	  [ "}" ]			(matching closebrace)

Window objetos are used in the Geomview window and ui-panel commands to set default properties for future windows or to change those of an existing window. See (window ...). See (ui-panel ...).

Next: , Previous: update-draw, Up: GCL Reference


7.2.142 window

(window CAM-ID WINDOW)
Specify attributes for the window of CAM-ID, e.g. its size or initial position, in the OOGL Window syntax. The special CAM-ID default specifies properties of future windows (created by camera or new-camera).
geomview-1.9.4/doc/geomview-pt_BR.html/OOGL_002em.html0000644000175000001440000000761610663302002017155 00000000000000 OOGL.m - Manual do Geomview

Next: , Previous: Mathematica, Up: Mathematica


9.1 Using Mathematica to generate OOGL files

The package OOGL.m allows Mathematica to write graphics objetos in OOGL format. To use it, give the command << OOGL.m to Mathematica to load the package. The WriteOOGL[file,graphics] command writes an OOGL description of the 3D graphics objeto graphics to the file named file.

This package also provides the Geomview command which sends a 3D graphics objeto to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the Geomview command.

Geomview[graphics]
Sends the 3D graphics objeto graphics to Geomview as a geom named Mathematica. Subsequent usage of Geomview[graphics] replaces the Mathematica objeto in Geomview with the new graphics.
Geomview[name,graphics]
Sends the 3D graphics objeto graphics to Geomview as a geom named name. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objetos at once and allow independent control over them.
     % math
     Mathematica 2.0 for SGI Iris
     Copyright 1988-91 Wolfram Research, Inc.
      -- GL graphics initialized --
     
     In[1] := <<OOGL.m
     
     In[2] := Plot3D[Sin[x + Sin[y]], {x,-2,2},{y,-2,2}]
     
     Out[2] := -Graphics3D-

This displays graphics in the usual Mathematica way here.

     In[3] := WriteOOGL["math.oogl", %2]
     
     Out[3] := -Graphics3D-

This displays nothing new but writes the file math.oogl. You can now load that file into Geomview on any computer. Alternately, you can use the Geomview command to start up a copy of Geomview from within Mathematica.

     In[5] := Geomview[%2]
     
     Out[5] := -Graphics3D-
geomview-1.9.4/doc/geomview-pt_BR.html/Saving.html0000644000175000001440000001653310663302002016737 00000000000000 Saving - Manual do Geomview

Next: , Previous: Cameras, Up: Interaction


3.8 Saving your work

Geomview's Save panel lets you store Geomview objetos and other information in files that you can read back into Geomview or other programs.

figs/save.png

Figure 3.9: The Save Panel.

To use the Save panel you select the desired format in the browser next to the word Save, enter the name of the objeto you want to save in the text field next to the word for, and enter the name of the file you wish to save to in the long text field next to the word in. You can then either hit <Enter> or clique on the OK botão. When the file has been written, the Save panel disappears. If you want to dismiss the Save panel without writing a file, clique the Cancel botão.

If you specify - as the file name, Geomview will write the file to standard output, i.e. in the shell window from which you invoked Geomview.

The possible formats are given below. The kind of objeto that can be written with each format is given in parentheses.

Commands (any objeto)
This write a file of GCL commands containing all information about the objeto. Loading this file later will restore the objeto as well as all other information about it, such as appearance, transformations, etc.
Geometry alone (geom)
This writes an OOGL file containing just the geometry of the objeto.
Geometry [in world] (geom)
This writes an OOGL file containing just the geometry of the objeto, transformed under Geomview's current transformation for this objeto. Use this if you have moved the objeto from its initial position and want to save the new position relative to the world.
Geometry [in universe] (geom)
This writes an OOGL file containing just the geometry of the geom, transformed under both the objeto's transformation and the world's transformation.
RMan [->tiff] (camera)
Writes a RenderMan file which when rendered creates a tiff image. Transparency and texturing (the latter only to some extent) will be available.
RMan [->frame] (camera)
Writes a RenderMan file which when rendered causes an image to appear in a window on the screen. Transparency and texturing (the latter only to some extent) will be available.
SGI snapshot (camera)
Write an SGI raster file. A bell rings when the snapshot is complete. Only available on SGI systems.
PPM GLX-offscreen snapshot (camera)
Render the complete scene anew into off-screen memory; GLX provides the means to use a Pixmap as rendering area. The advantage of rendering into off-screen memory over taking screen snapshot is that the camera windows need not be mapped and even raised at the time the snapshot is taken. So with off-screen snapshot one can safely iconify the camera window (but do not close it!), activate the screen-saver and go to bed while some script advances the scenes and takes snapshots.
PPM Screen snapshot (camera)
Take a snapshot of the given window and save it as a PPM image. If you specify a string beginning with a vertical bar (|) as the file name, it's interpreted as a Bourne shell command to which the PPM data should be piped, as in `| pnmtotiff > snap.tiff' or `| convert -geometry 50% ppm:- snap.gif'.

PPM screen snapshots are only available with GL and Open GL, not plain X graphics. The window should be entirely on the screen. Geomview will ensure that no other windows cover it while the snapshot is taken. It is probably a better idea to use GLX-off-screen snapshots, as explained above.

PPM software snapshot (camera)
Writes a snapshot of that window's current view, as a PPM image, to the given file. The file name may be a Bourne shell command preceded by a vertical bar (|), as with the PPM screen snapshot. The software snapshot, though, is produced by using a built-in software renderer (related to the X-windows renderer). It doesn't matter whether the window is visible or not, and doesn't depend on GL or OpenGL. It also doesn't support some features, such as texture mapping.
Postscript snapshot (camera)
Writes a Postscript snapshot of the camera's view. It's made by breaking up the scene into lines and polygons, sorting by depth, and generating Postscript lines and polygons for each one. Advantages over pixel-based snapshot images: resolution is very high, so edges look sharp even on high-resolution printers, or comparable-resolution images are typically much more compact. Disadvantages: depth-sorting gives good results on some scenes, but can be wildly wrong as a hidden-surface removal algorithm for other scenes. Also, Postscript doesn't offer smoothly interpolated shading, only flat shading for each facet.
Camera (camera)
Writes an OOGL file of a camera.
Transform [to world] (any objeto)
Writes an OOGL transform file giving Geomview's transform for the objeto.
Transform [to universe] (any objeto)
Writes an OOGL transform file giving a transform which is the composition of Geomview's transform for the objeto and the transform for the world.
Window (camera)
Writes an OOGL window file for a camera.
Panels
Writes a GCL file containing commands which record the state of all the Geomview panels. Loading this file later will restore the positions of all the panels.
geomview-1.9.4/doc/geomview-pt_BR.html/ap_002doverride.html0000644000175000001440000000337410663302002020374 00000000000000 ap-override - Manual do Geomview

Next: , Previous: and, Up: GCL Reference


7.2.10 ap-override

(ap-override [on|off])
Selects whether appearance controls should override objetos' own settings. On by default. With no arguments, returns current setting.
geomview-1.9.4/doc/geomview-pt_BR.html/NeXT.html0000644000175000001440000000334010663302002016316 00000000000000 NeXT - Manual do Geomview

Next: , Previous: new-reset, Up: GCL Reference


7.2.85 NeXT

(NeXT)
Returns t if running on a NeXT, nil if not. A relict from ancient work-station year.
geomview-1.9.4/doc/geomview-pt_BR.html/cursor_002dtwitch.html0000644000175000001440000000351610663302002020772 00000000000000 cursor-twitch - Manual do Geomview

Next: , Previous: cursor-still, Up: GCL Reference


7.2.25 cursor-twitch

(cursor-twitch [INT])
Sets the distance which the cursor must not move (in x or y) to register as holding still. If INT is not specified, the value will be reset to the default.
geomview-1.9.4/doc/geomview-pt_BR.html/gt.html0000644000175000001440000000320110663302002016106 00000000000000 gt - Manual do Geomview

Next: , Previous: eq, Up: GCL Reference


7.2.4 >

(> EXPR1 EXPR2)
Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.
geomview-1.9.4/doc/geomview-pt_BR.html/Basic-Interaction.html0000644000175000001440000002313610663302002021003 00000000000000 Basic Interaction - Manual do Geomview

Next: , Previous: Command Line Options, Up: Interaction


3.3 Basic Interaction: The Main Panel

Normalmente quando você invoca Geomview, três janelas aparecem: O painel principal (Main), o painel de ferramentas (Tools), e uma janela de câmera. Geomview tem muitas outras janelas mas muitas coisas podem ser realizadas com essas três de forma que por padrão as outras não aparecem. Essa seção do manual introduz alguns conceitos básicos que são usados nas seções restantes do manual e descreve o painel principal (Main).

figs/main.png

Figure 3.1: The Main Panel

Geomview pode mostrar um número arbitrário de objetos simultaneamente. O navegador Targets no painel principal (Main) mostra uma lista de todos os objetos dos quais Geomview atualmente abertos. Esse navegador tem uma linha para cada objeto que você tiver chamado, adicionalmente algumas linhas para outros objetos. Um desses outros objetos é chamado World e corresponde a a todos os objetos atualmente chamados, tratados como se eles fossem um objeto. A maioria das operaçõeos que você pode fazer sobre um objeto, tais como aplicar um movimento ou mudar uma cor, pode também ser feita para o objeto "World".

O navegador de alvos (Targets) também possui uma entrada para cada câmera. Por padrão existe somente uma câmera; é possível adicionar mais delas através da entrada New Camera do painel principal (Main) via menu File. Geomview trata câmeras na maioria das vezes como trata objetos geométricos. Por exemplo, você pode mover câmeras pelas proximidades e adicioná-las e apagá-las como objetos geométricos. Câmeras não são mostradas na tela como um objeto que você vê. Cada câmera tem uma janela de câmera separada que mostra a visão como vista através da lente daquela câmera. (É passível para cada câmera mostrar uma representação geométrica de outras câmeras. Veja Cameras.)

Devido ao fato de Geomview tratar câmeras e objetos geométricos muito similarmente, o termo objeto nessa documentação é usado para referir-se a qualquer dos dois indistintamente. Quando precisamos distingüir entre os dois tipos de objetos, usamos o termo "geom" para denotar um objeto geométrico e a palavra câmera para denotar uma câmera.

O objeto que está selecionado (luminosidade alta) no navegador "Targets" é chamado objeto alvo. Esse é o objeto que recebe quaisquer ações que você faz com o mouse ou com o teclado. Você pode mudar o objeto alvo selecionando uma linha diferente no navegador de alvos (Targets). Outro caminho de modificar o objeto alvo é colocar o cursor do mouse diretamente sobre um geom na janela de câmera e rapidamente dar um duplo clique no botão direito do mouse. Esse processo é chamado selecionar; o objeto selecionado torna-se o novo alvo.

Objetos do Geomview são todos conhecidos por dois nomes, ambos dos quais são mostrados no navegador de alvos (Targets). O primeiro nome lá fornecido, que aparece entre colchêtes ([ ]), é um nome curto atribuido pelo Geomview quando você chama o objeto. Esse nome consiste da letra `g' para geometria e da letra `c' para câmeras, seguindo por um número. O segundo nome é maior e mais descritivo; por padrão esse é o nome do arquivo do qual o objeto foi chamado. Os dois nomes são equivalentes até no que diz respeito ao Geomview; em qualquer ponto onde você precisar especificar um nome você pode fornecer qualquer dos dois.

Para manipular um objeto, esteja certo de que aquele objeto que você quer mover seja o objeto alvo, e coloque o cursor do mouse em uma janela de câmera. Movimentos são aplicados pressionando ou o botão esquerdo ou o botão do meio do mouse e movendo o mouse. Existem muitos modos de movimento diferentes, cada modo de movimento aplicando um diferente tipo de movimento. O navegador de modos de movimento (MOTION MODE) no painel principal indica o modo de movimento atual. O padrão é a rotação ("Rotate"). Você pode mudar o modo corrente de movimento selecionando um no modo de movimento no navegador de modos de movimento (MOTION MODE), ou usando o painel de ferramentas (Tools). Para maiores informações sobre modos de movimento, veja Mouse Motions.

O navegador de módulos (Modules) lista módulos externos do Geomview. Um módulo externo é um programa separado que interage com Geomview para extender suas funcionalidades. Para informações sobre módulos externos, veja Modules.

A barra de menu no topo do painel principal oferece menus para operações comuns.

Para criar novas janelas, chame novos objetos, grave os objetos ou outras informações, ou saia do geomview, veja o menu File.

Para copiar ou apagar objetos, veja o menu Edit.

Você pode chamar qualquer painel a partir do menu Inspect.

O menu Space permite a você escolher se geomview trabalha no modo Euclidiano, Hiperbolico ou Esférico. O modo Euclideano é usado por padrão. Para detalhes sobre a utilização do modo espaço Hyperbolic e do modo Spherical, veja Non-Euclidean Geometry.

A maioria das ações que você pode fazer através dos painéis do Geomview possuem equivalentes atalhos de teclado de forma que você pode fazer a mesma ação atavés de digitação de uma seqüência de teclas no teclado. Isso é útil para usuários avançados que estão familiarizados com as capacidades do Geomview e querem trabalhar rapidamente sem ter montanhas de painéis amontoando-se na tela. Atalhos de teclado são usualmente indicados ente colchêtes ([ ]) próximo ao item correspondente em um apinel. Por exemplo, o atalho de teclado para o modo Rotate é 'r'; isso é indicado par "[r]" que aparece antes da palavra "Rotate" no navegador MOTION MODE. Para usar esse atalaho de teclado, apenas pressione a tecla r enquanto o cursor do mouse estiver em qualquer janela do Geomview. Não é necessário pressionar a tecla <Enter> posteriormente.

Alguns atalhos de teclado consistem em mais de uma tecla. Nesses caso apenas digite as teclas uma após a outra, sem pressionar <Enter> posteriormente ou entre as teclas pressionadas. Atalhos de teclado são sensíveis à caixa alta/baixa.

Muitas teclas de atalho podem ser precedidas de um parâmetro numérico. Por exemplo, digitando ae muda o estado do desenho de arestas, enquanto 1ae sempre habilita o desenho de arestas.

O campo keyboard no canto superior esquerdo do painel principal (Main), imediatamente acima da palavra "Targets", ecoa o estado atual das teclas de atalho.

Para uma lista de todas as teclas de atalho, pressione a telca ?. geomview-1.9.4/doc/geomview-pt_BR.html/Example1.html0000644000175000001440000002335110663302002017160 00000000000000 Example1 - Manual do Geomview

Next: , Previous: Interface, Up: Modules


6.2 Example 1: Simple External Module

This section gives a very simple external module which displays an oscillating mesh. To try out this example, make a copy of the file example1.c (it is distributed with Geomview in the doc subdirectory) in your directory and compile it with the command

     cc -o example1 example1.c -lm

Then put the line

     (emodule-define "Example 1" "./example1")

in a file called .geomview in your current directory. Then invoke Geomview; it is important that you compile the example program, create the .geomview file, and invoke Geomview all in the same directory. You should see "Example 1" in the Modules browser of Geomview's Main panel; clique sobre o this entry in the browser to start the module. A surface should appear in your janela de câmera and should begin oscillating. You can stop the module by clicando on the red "[1] Example 1" line in the Modules browser.

     
     /*
      * example1.c: oscillating mesh
      *
      * This example module is distributed with the Geomview manual.
      * If you are not reading this in the manual, see the "External
      * Modules" chapter of the manual for more details.
      *
      * This module creates an oscillating mesh.
      */
     
     #include <math.h>
     #include <stdio.h>
     
     /* F is the function that we plot
      */
     float F(x,y,t)
          float x,y,t;
     {
       float r = sqrt(x*x+y*y);
       return(sin(r + t)*sqrt(r));
     }
     
     main(argc, argv)
          char **argv;
     {
       int xdim, ydim;
       float xmin, xmax, ymin, ymax, dx, dy, t, dt;
     
       xmin = ymin = -5;             /* Set x and y            */
       xmax = ymax = 5;              /*    plot ranges         */
       xdim = ydim = 24;             /* Set x and y resolution */
       dt = 0.1;                     /* Time increment is 0.1  */
     
       /* Geomview setup.  We begin by sending the command
        *            (geometry example { : foo})
        * to Geomview.  This tells Geomview to create a geom called
        * "example" which is an instance of the handle "foo".
        */
       printf("(geometry example { : foo })\n");
       fflush(stdout);
     
       /* Loop until killed.
        */
       for (t=0; ; t+=dt) {
         UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t);
       }
     }
     
     /* UpdateMesh sends one mesh iteration to Geomview.  This consists of
      * a command of the form
      *    (read geometry { define foo
      *       MESH
      *       ...
      *    })
      * where ... is the actual data of the mesh.  This command tells
      * Geomview to make the value of the handle "foo" be the specified
      * mesh.
      */
     UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t)
          float xmin, xmax, ymin, ymax, t;
          int xdim, ydim;
     {
       int i,j;
       float x,y, dx,dy;
     
       dx = (xmax-xmin)/(xdim-1);
       dy = (ymax-ymin)/(ydim-1);
     
       printf("(read geometry { define foo \n");
       printf("MESH\n");
       printf("%1d %1d\n", xdim, ydim);
       for (j=0, y = ymin; j<ydim; ++j, y += dy) {
         for (i=0, x = xmin; i<xdim; ++i, x += dx) {
           printf("%f %f %f\t", x, y, F(x,y,t));
         }
         printf("\n");
       }
       printf("})\n");
       fflush(stdout);
     }
     

The module begins by defining a function F(x,y,t) that specifies a time-varying surface. The purpose of the module is to animate this surface over time.

The main program begins by defining some variables that specify the parameters with which the function is to be plotted.

The next bit of code in the main program prints the following line to standard output

     (geometry example { : foo })

This tells Geomview to create a geom called example which is an instance of the handle foo. Handles are a part of the OOGL file format which allow you to name a piece of geometry whose value can be specified elsewhere (and in this case updated many times); for more information on handles, See OOGL File Formats. In this case, example is the title by which the user will see the objeto in Geomview's objeto browser, and foo is the internal name of the handle that the objeto is a reference to.

We then do fflush(stdout) to ensure that Geomview receives this command immediately. In general, since pipes may be buffered, an external module should do this whenever it wants to be sure Geomview has actually received everything it has printed out.

The last thing in the main program is an infinite loop that cycles through calls to the procedure UpdateMesh with increasing values of t. UpdateMesh sends Geomview a command of the form

     (read geometry { define foo
     MESH
     24 24
     ...
     })

where ... is a long list of numbers. This command tells Geomview to make the value of the handle foo be the specified mesh. As soon as Geomview receives this command, the geom being displayed changes to reflect the new geometry.

The mesh is given in the format of an OOGL MESH. This begins with the keyword MESH. Next come two numbers that give the x and y dimensions of the mesh; in this case they are both 24. This line is followed by 24 lines, each containing 24 triples of numbers. Each of these triples is a point on the surface. Then finally there is a line with "})" on it that ends the "{" which began the define statement and the "(" that began the command. For more details on the format of MESH data, see MESH.

This module could be written without the use of handles by having it write out commands of the form

     (geometry example {
     MESH
     24 24
     ...
     })

This first time Geomview receives a command of this form it would create a geom called example with the given MESH data. Subsequent (geometry example ...) commands would cause Geomview to replace the geometry of the geom example with the new MESH data. If done in this way there would be no need to send the initial (geometry example { : foo }) command as above. The handle technique is useful, however, because it can be used in more general situations where a handle represents only part of a complex geom, allowing an external module to replace only that part without having to retransmit the entire geom. For more information on handles, see GCL. See References. See (hdefine ...). See (read ...).

The module loops through calls to UpdateMesh which print out commands of the above form one after the other as fast as possible. The loop continues indefinitely; the module will terminate when the user kills it by clicando on its instance line in the Modules browser, or else when Geomview exits.

Sometimes when you terminate this module by clicando on its instance entry the Modules browser, Geomview will kill it while it is in the middle of sending a command to Geomview. Geomview will then receive only a piece of a command and will print out a cryptic but harmless error message about this. When a module has a user interface panel it can use a "Quit" botão to provide a more graceful way for the user to terminate the module. See the next example.

You can run this module in a shell window without Geomview to see the commands it prints out. You will have to kill it with ctrl-C to get it to stop. geomview-1.9.4/doc/geomview-pt_BR.html/hmodel.html0000644000175000001440000000336010663302002016752 00000000000000 hmodel - Manual do Geomview

Next: , Previous: help, Up: GCL Reference


7.2.55 hmodel

(hmodel CAMID {virtual|projective|conformal})
Set the model used to display geometry in this camera. See (space ...).
geomview-1.9.4/doc/geomview-pt_BR.html/write_002dcomments.html0000644000175000001440000000553610663302002021136 00000000000000 write-comments - Manual do Geomview

Next: , Previous: write, Up: GCL Reference


7.2.145 write-comments

(write-comments FILENAME GEOMID PICKPATH)
write OOGL COMMENT objetos in the GEOMID hierarchy at the level of the pick path to FILENAME. Specifically, COMMENTS at level (a b c ... f g) will match pick paths of the form (a b c ... f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the pick command) is a list of integer counters specifying a subpart of a hierarchical OOGL objeto. Descent into a complex objeto (LIST or INST) adds a new integer to the path. Traversal of simple objetos increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire string of zero, one, or more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses.

Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objetos, which can be attached to other OOGL objetos via the LIST type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned.

geomview-1.9.4/doc/geomview-pt_BR.html/ui_002dcam_002dfocus.html0000644000175000001440000000537210663302002021117 00000000000000 ui-cam-focus - Manual do Geomview

Next: , Previous: transform-set, Up: GCL Reference


7.2.128 ui-cam-focus

(ui-cam-focus [focus-change|mouse-cross])
Set the focus policy for the janelas de câmera. The default is mouse-cross: a câmera is made the active câmera (for interactive mouse events) when the mouse cursor crosses the window. Because this means it can become complicated to activate a specific câmera (in the context of multiple janelas de câmera) there is also the option to only change the câmera focus when the window-manager decides to give it the focus for input events. So, after specifying focus-change it depends on the focus-change configuration of your window-manager when a câmera becomes the active câmera for mouse-interaction. To change this behaviour permanently you could, e.g., place the following line in your ${HOME}/.geomview file (see Customization):
          (progn
            (ui-cam-focus focus-change)
            ... # other stuff
          )
     
geomview-1.9.4/doc/geomview-pt_BR.html/GCL.html0000644000175000001440000001201210663302002016101 00000000000000 GCL - Manual do Geomview

Next: , Previous: Modules, Up: Top


7 GCL: the Geomview Command Language

GCL has the syntax of lisp – i.e. an expression of the form (f a b ...) means pass the values of a, b, ... to the function f. GCL is very limited and is by no means an implementation of lisp. It is simply a language for expressing commands to be executed in the order given, rather than a programming language. It does not support variable or function definition.

GCL is the language that Geomview understands for files that it loads as well as for communication with other programs. To execute a GCL command interactively, you can bring up the Commands panel which lets you type in a command; Geomview executes the command when you hit the <Enter> key. Output from such commands is printed to standard output. Alternately, you can invoke Geomview as geomview -c - which causes it to read GCL commands from standard input.

GCL functions return a value, and you can nest function calls in ways which use this returned value. For example

     (f (g a b))

evaluates (g a b) and then evaluates (f x) where x is the result returned by (g a b). Geomview maintains these return values internally but does not normally print them out. To print out a return value pass it to the echo function. For example the geomview-version function returns a string representing the version of Geomview that is running, and

     (echo (geomview-version))

prints out this string.

Many functions simply return t for success or nil for failure; this is the case if the documentation for the function does not indicate otherwise. These are the lisp symbols for true and false, respectively. (They correspond to the C variables Lt and Lnil which you are likely to see if you look at the source code for Geomview or some of the external modules.)

In the descriptions of the commands below several references are made to "OOGL" formats. OOGL is the data description language that Geomview uses for describing geometry, câmeras, appearances, and other basic objetos. For details of the OOGL formats, See OOGL File Formats. (Or equivalently, see the oogl(5) manual page, distributed with Geomview in the file man/cat5/oogl.5.

The GCL commands and argument types are listed below. Most of the documentation in this section of the manual is available within Geomview via the ? and ?? commands. The command (? command) causes Geomview to print out a one-line summary of the syntax of command, and (?? command) prints out an explanation of what command does. You can include the wild-card character * in command to print information for a group of commands matching a pattern. For example, (?? *emodule*) will print all information about all commands containing the string emodule. (? *) will print a short list of all commands.

geomview-1.9.4/doc/geomview-pt_BR.html/Authors.html0000644000175000001440000000405310663302002017127 00000000000000 Authors - Manual do Geomview

Previous: History, Up: History


Authors

Tamara Munzner, Stuart Levy, e Mark Phillips são os autores originais do Geomview. Celeste Fowler, Charlie Gunn, e Nathaniel Thurston também fazem contribuições sgnificativas. Daniel Krech e Scott Wisdom fizeram o NeXTStep e a adaptação do RenderMan, e Daeron Meyer e Tim Rowley fizeram a adaptação para o X windows. Muitos outros membros do estado maior do Geometry Center, bem como muitas pessoas em muitos lugares, também contribuíram.

Mark Phillips escreveu essse manual, com ajuda substancial de Stuart Levy e Tamara Munzner. Incontáveis usuários do Geomview também foram de grande ajuda por meio da leitura do manual e indicando nossos enganos. geomview-1.9.4/doc/geomview-pt_BR.html/write_002dhandle.html0000644000175000001440000000357110663302002020541 00000000000000 write-handle - Manual do Geomview

Next: , Previous: write-comments, Up: GCL Reference


7.2.146 write-handle

(write-handle PREFIX FILENAME HANDLE)
Writes the objeto underlying the given handle to FILENAME. This function is intended for internal debugging use only.
geomview-1.9.4/doc/geomview-pt_BR.html/SPHERE.html0000644000175000001440000000765010663302002016476 00000000000000 SPHERE - Manual do Geomview

Next: , Previous: SKEL, Up: Object File Formats


4.2.8 SPHERE Files

The conventional suffix for SPHERE files is .sph.

     [ST][E|H|S]SPHERE # Keyword
     # auto-generated texture co-ordinates, only allowed with STSPHERE objetos
     [SINUSOIDAL|CYLINDRICAL|RECTANGULAR|STEREOGRAPHIC|ONEFACE]
     # next four fields are required
     Radius
     Xcenter Ycenter Zcenter

The key word is [ST][E|H|S]SPHERE. The optional prefix characters mean:

`ST'
The sphere carries automatically generated texture co-ordinates. See below.
`E'
The sphere lives in Euclidean space.
`H'
The sphere lives in Hyperbolic space. See Non-Euclidean Geometry.
`S'
The sphere lives in spherical space. See Non-Euclidean Geometry.

Sphere objetos are drawn using meshes which are rectangular in a polar co-ordinate system, with the equatorial plane parallel to the x,y-plane. Their smoothness, and the time taken to draw them, depends on the setting of the dicing level, 10x10 by default. From Geomview, the Appearance panel, the <N>ad keyboard command, or a dice nu nv Appearance attribute sets this.

Texture co-ordinates are generated for STSPHERE objetos; the keyword following the initial STSPHERE keyword defines the way this is done. It follows the conventions of the mktxmesh Perl-script which comes with the Orrery.

SINUSOIDAL
sinusoidal equal-area projection
CYLINDRICAL
cylindrical proj: s is the longitude, t is the latitude
RECTANGULAR
rectangular proj: s is the longitude, t is sin(latitude) (i.e. z co-ordinate in the sphere's co-ordinate system)
STEREOGRAPHIC
stereographic projection from the south (z=-1) pole
ONEFACE
stretch orthographic view of +y hemisphere over both, mirroring
geomview-1.9.4/doc/geomview-pt_BR.html/emodule_002dpath.html0000644000175000001440000000403310663302002020534 00000000000000 emodule-path - Manual do Geomview

Next: , Previous: emodule-isrunning, Up: GCL Reference


7.2.37 emodule-path

(emodule-path)
Returns the current search path for external modules. Note: to actually see the value returned by this function you should wrap it in a call to echo: (echo (emodule-path)). See (set-emodule-path ...).
geomview-1.9.4/doc/geomview-pt_BR.html/Example2.html0000644000175000001440000002505710663302002017166 00000000000000 Example2 - Manual do Geomview

Next: , Previous: Example1, Up: Modules


6.3 Example 2: Simple External Module with FORMS Control Panel

This section gives a new version of the above module — one that includes a user interface panel for controlling the velocity of the oscillation. We use the FORMS library by Mark Overmars for the control panel. The FORMS library is a public domain user interface toolkit for IRISes; for more information See Forms.

To try out this example, make a copy of the file example2.c (distributed with Geomview in the doc subdirectory) in your directory and compile it with the command

     cc -I/u/gcg/ngrap/include -o example2 example2.c \
       -L/u/gcg/ngrap/lib/sgi -lforms -lfm_s -lgl_s -lm

You should replace the string /u/gcg/ngrap above with the pathname of the Geomview distribution directory on your system. (The forms library is distributed with Geomview and the -I and -L options above tell the compiler where to find it.)

Then put the line

     (emodule-define "Example 2" "./example2")

in a file called .geomview in the current directory and invoke Geomview from that directory. Clique sobre o the "Example 2" entry in the Modules browser to invoke the module. A small control panel should appear. You can then control the velocity of the mesh oscillation by moving the slider.

     
     /*
      * example2.c: oscillating mesh with FORMS control panel
      *
      * This example module is distributed with the Geomview manual.
      * If you are not reading this in the manual, see the "External
      * Modules" chapter of the manual for an explanation.
      *
      * This module creates an oscillating mesh and has a FORMS control
      * panel that lets you change the speed of the oscillation with a
      * slider.
      */
     
     #include <math.h>
     #include <stdio.h>
     #include <sys/time.h>           /* for struct timeval below */
     
     #include "forms.h"              /* for FORMS library */
     
     FL_FORM *OurForm;
     FL_OBJECT *VelocitySlider;
     float dt;
     
     /* F is the function that we plot
      */
     float F(x,y,t)
          float x,y,t;
     {
       float r = sqrt(x*x+y*y);
       return(sin(r + t)*sqrt(r));
     }
     
     /* SetVelocity is the slider callback procedure; FORMS calls this
      * when the user moves the slider bar.
      */
     void SetVelocity(FL_OBJECT *obj, long val)
     {
       dt = fl_get_slider_value(VelocitySlider);
     }
     
     /* Quit is the "Quit" botão callback procedure; FORMS calls this
      * when the user cliques the "Quit" botão.
      */
     void Quit(FL_OBJECT *obj, long val)
     {
       exit(0);
     }
     
     /* create_form_OurForm() creates the FORMS panel by calling a bunch of
      * procedures in the FORMS library.  This code was generated
      * automatically by the FORMS designer program; normally this code
      * would be in a separate file which you would not edit by hand.  For
      * simplicity of this example, however, we include this code here.
      */
     create_form_OurForm()
     {
       FL_OBJECT *obj;
       FL_FORM *form;
       OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0);
       obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,"");
       VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0,
                                               340.0,40.0,"Velocity");
         fl_set_object_lsize(obj,FL_LARGE_FONT);
         fl_set_object_align(obj,FL_ALIGN_TOP);
         fl_set_call_back(obj,SetVelocity,0);
       obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit");
         fl_set_object_lsize(obj,FL_LARGE_FONT);
         fl_set_call_back(obj,Quit,0);
       fl_end_form();
     }
     
     main(argc, argv)
          char **argv;
     {
       int xdim, ydim;
       float xmin, xmax, ymin, ymax, dx, dy, t;
       int fdmask;
       static struct timeval timeout = {0, 200000};
     
       xmin = ymin = -5;             /* Set x and y            */
       xmax = ymax = 5;              /*    plot ranges         */
       xdim = ydim = 24;             /* Set x and y resolution */
       dt = 0.1;                     /* Time increment is 0.1  */
     
       /* Forms panel setup.
        */
       foreground();
       create_form_OurForm();
       fl_set_slider_bounds(VelocitySlider, 0.0, 1.0);
       fl_set_slider_value(VelocitySlider, dt);
       fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2");
     
     
       /* Geomview setup.
        */
       printf("(geometry example { : foo })\n");
       fflush(stdout);
     
       /* Loop until killed.
        */
       for (t=0; ; t+=dt) {
         fdmask = (1 << fileno(stdin)) | (1 << qgetfd());
         select(qgetfd()+1, &fdmask, NULL, NULL, &timeout);
         fl_check_forms();
         UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t);
       }
     }
     
     /* UpdateMesh sends one mesh iteration to Geomview
      */
     UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t)
          float xmin, xmax, ymin, ymax, t;
          int xdim, ydim;
     {
       int i,j;
       float x,y, dx,dy;
     
       dx = (xmax-xmin)/(xdim-1);
       dy = (ymax-ymin)/(ydim-1);
     
       printf("(read geometry { define foo \n");
       printf("MESH\n");
       printf("%1d %1d\n", xdim, ydim);
       for (j=0, y = ymin; j<ydim; ++j, y += dy) {
         for (i=0, x = xmin; i<xdim; ++i, x += dx) {
           printf("%f %f %f\t", x, y, F(x,y,t));
         }
         printf("\n");
       }
       printf("})\n");
       fflush(stdout);
     }
     

The code begins by including some header files needed for the event loop and the FORMS library. It then declares global variables for holding a pointer to the slider FORMS objeto and the velocity dt. These are global because they are needed in the slider callback procedure SetVelocity, which forms calls every time the user moves the slider bar. SetVelocity sets dt to be the new value of the slider.

Quit is the callback procedure for the Quit botão; it provides a graceful way for the user to terminate the program.

The procedure create_panel calls a bunch of FORMS library procedures to set up the control panel with slider and botão. For more information on using FORMS to create interface panels see the FORMS documentation. In particular, FORMS comes with a graphical panel designer that lets you design your panels interactively and generates code like that in create_panel.

This example's main program is similar to the previous example, but includes extra code to deal with setting up and managing the FORMS panel.

To set up the panel we call the GL procedure foreground to cause the process to run in the foreground. By default GL programs run in the background, and for various reasons external modules that use FORMS (which is based on GL) need to run in the foreground. We then call create_panel to create the panel and fl_set_slider_value to set the initial value of the slider. The call to fl_show_form causes the panel to appear on the screen.

The first three lines of the main loop, starting with

     fdmask = (1 << fileno(stdin)) | (1 << qgetfd());

check for and deal with events in the panel. The call to select imposes a delay on each pass through the main loop. This call returns either after a delay of 1/5 second or when the next GL event occurs, or when data appears on standard input, whichever comes first. The timeout variable specifies the amount of time to wait on this call; the first member (0 in this example) gives the number of seconds, and the second member (200000 in this example) gives the number of microseconds. Finally, fl_check_forms() checks for and processes any FORMS events that have happened; in this case this means calling SetVelocity if the user has moved the slider or calling Quit if the user has clicado on the Quit botão.

The purpose of the delay in the loop is to keep the program from using excessive amounts of CPU time running around its main loop when there are no events to be processed. This is not so crucial in this example, and in fact may actually slow down the animation somewhat, but in general with external modules that have event loops it is important to do something like this because otherwise the module will needlessly take CPU cycles away from other running programs (such as Geomview!) even when it isn't doing anything.

The last line of the main loop in this example, the call to UpdateMesh, is the same as in the previous example. geomview-1.9.4/doc/geomview-pt_BR.html/set_002dconformal_002drefine.html0000644000175000001440000000443010663302002022640 00000000000000 set-conformal-refine - Manual do Geomview

Next: , Previous: set-clock, Up: GCL Reference


7.2.111 set-conformal-refine

(set-conformal-refine CMX [N [SHOWEDGES]])
Sets the parameters for the refinement algorithm used in drawing in the conformal model. CMX is the cosine of the maximum angle an edge can bend before it is refined. Its value should be between -1 and 1; the default is 0.95; decreasing its value will cause less refinement. N is the maximum number of iterations of refining; the default is 6. SHOWEDGES, which should be no or yes, determines whether interior edges in the refinement are drawn.
geomview-1.9.4/doc/geomview-pt_BR.html/redraw.html0000644000175000001440000000333710663302002016772 00000000000000 redraw - Manual do Geomview

Next: , Previous: real-id, Up: GCL Reference


7.2.102 redraw

(redraw CAM-ID)
States that the view in CAM-ID should be redrawn on the next pass through the main loop or the next invocation of draw.
geomview-1.9.4/doc/geomview-pt_BR.html/scale.html0000644000175000001440000000423710663302002016575 00000000000000 scale - Manual do Geomview

Next: , Previous: rib-snapshot, Up: GCL Reference


7.2.108 scale

(scale GEOM-ID FACTOR [FACTORY FACTORZ])
Scale GEOM-ID, multiplying its size by FACTOR. The factors should be positive numbers. If FACTORY and FACTORZ are present and non-zero, the objeto is scaled by FACTOR in x, by FACTORY in y, and by FACTORZ in z. If only FACTOR is present, the objeto is scaled by FACTOR in x, y, and z. Scaling only really makes sense in Euclidean space. Mouse-driven scaling in other spaces is not allowed; the scale command may be issued in other spaces but should be used with caution because it may cause the data to extend beyond the limits of the space.
geomview-1.9.4/doc/geomview-pt_BR.html/Example3.html0000644000175000001440000006145710663302002017173 00000000000000 Example3 - Manual do Geomview

Next: , Previous: XForms, Up: Modules


6.5 Example 3: External Module with Bi-Directional Communication

The previous two example modules simply send commands to Geomview and do not receive anything from Geomview. This section describes a module that communicates in both directions. There are two types of communication that can go from Geomview to an external module. This example shows asynchronous communication — the module needs to be able to respond at any moment to expressions that Geomview may emit which inform the module of some change of state within Geomview.

(The other type of communication is synchronous, where a module sends a request to Geomview for some piece of information and waits for a response to come back before doing anything else. The main GCL command for requesting information of this type is (write ...). This module does not do any synchronous communication.)

In ansynchronous communication, Geomview sends expressions that are essentially echoes of GCL commands. The external module sends Geomview a command expressing interest in a certain command, and then every time Geomview executes that command, the module receives a copy of it. This happens regardless of who sent the command to Geomview; it can be the result of the user doing something with a Geomview panel, or it may have come from another module or from a file that Geomview reads. This is how a module can find out about and act on things that happen in Geomview.

This example uses the OOGL lisp library to parse and act on the expressions that Geomview writes to the module's standard input. This library is actually part of Geomview itself — we wrote the library in the process of implementing GCL. It is also convenient to use it in external modules that must understand a of subset of GCL — specifically, those commands that the module has expressed interest in.

This example shows how a module can receive user pick events, i.e. when the user cliques the botão direito do mouse with the cursor over a geom in a Geomview janela de câmera. When this happens Geomview generates an internal call to a procedure called pick; the arguments to the procedure give information about the pick, such as what objeto was picked, the coordinates of the picked point, etc. If an external module has expressed interest in calls to pick, then whenever pick is called Geomview will echo the call to the module's standard input. The module can then do whatever it wants with the pick information.

This module is the same as the Nose module that comes with Geomview. Its purpose is to illustrate picking. Whenever you pick on a geom by clicando the botão direito do mouse on it, the module draws a little box at the spot where you clicado. Usually the box is yellow. If you pick a vertex, the box is colored magenta. If you pick a point on an edge of an objeto, the module will also highlight the edge by drawing cyan boxes at its endpoints and drawing a yellow line along the edge.

Note that in order for this module to actually do anything you must have a geom loaded into Geomview and you must clique the botão direito do mouse with the cursor over a part of the geom.

     
     /*
      * example3.c: external module with bi-directional communication
      *
      * This example module is distributed with the Geomview manual.
      * If you are not reading this in the manual, see the "External
      * Modules" chapter of the manual for an explanation.
      *
      * This module is the same as the "Nose" program that is distributed
      * with Geomview.  It illustrates how a module can find out about
      * and respond to user pick events in Geomview.  It draws a little box
      * at the point where a pick occurrs.  The box is yellow if it is not
      * at a vertex, and magenta if it is on a vertex.  If it is on an edge,
      * the program also marks the edge.
      *
      * To compile:
      *
      *   cc -I/u/gcg/ngrap/include -g -o example3 example3.c \
      *      -L/u/gcg/ngrap/lib/sgi -loogl -lm
      *
      * You should replace "/u/gcg/ngrap" above with the pathname of the
      * Geomview distribution directory on your system.
      */
     
     #include <stdio.h>
     #include "lisp.h"               /* We use the OOGL lisp library */
     #include "pickfunc.h"           /* for PICKFUNC below */
     #include "3d.h"                 /* for 3d geometry library */
     
     /* boxstring gives the OOGL data to define the little box that
      * we draw at the pick point.  NOTE:  It is very important to
      * have a newline at the end of the OFF objeto in this string.
      */
     char boxstring[] = "\
     INST\n\
     transform\n\
     .04 0 0 0\n\
     0 .04 0 0\n\
     0 0 .04 0\n\
     0 0 0 1\n\
     geom\n\
     OFF\n\
     8 6 12\n\
     \n\
     -.5 -.5 -.5     # 0   \n\
     .5 -.5 -.5      # 1   \n\
     .5  .5 -.5      # 2   \n\
     -.5  .5 -.5     # 3   \n\
     -.5 -.5  .5     # 4   \n\
     .5 -.5  .5      # 5   \n\
     .5  .5  .5      # 6   \n\
     -.5  .5  .5     # 7   \n\
     \n\
     4 0 1 2 3\n\
     4 4 5 6 7\n\
     4 2 3 7 6\n\
     4 0 1 5 4\n\
     4 0 4 7 3\n\
     4 1 2 6 5\n";
     
     progn()
     {
       printf("(progn\n");
     }
     
     endprogn()
     {
       printf(")\n");
       fflush(stdout);
     }
     
     Initialize()
     {
       extern LObject *Lpick();  /* This is defined by PICKFUNC below but must */
       			    /* be used in the following LDefun() call */
       LInit();
       LDefun("pick", Lpick, NULL);
     
       progn(); {
         /* Define handle "littlebox" for use later
          */
         printf("(read geometry { define littlebox { %s }})\n", boxstring);
     
         /* Express interest in pick events; see Geomview manual for explanation.
          */
         printf("(interest (pick world * * * * nil nil nil nil nil))\n");
     
         /* Define "pick" objeto, initially the empty list (= null objeto).
          * We replace this later upon receiving a pick event.
          */
         printf("(geometry \"pick\" { LIST } )\n");
     
         /* Make the "pick" objeto be non-pickable.
          */
         printf("(pickable \"pick\" no)\n");
     
         /* Turn off normalization, so that our pick objeto will appear in the
          * right place.
          */
         printf("(normalization \"pick\" none)\n");
     
         /* Don't draw the pick objeto's bounding box.
          */
         printf("(bbox-draw \"pick\" off)\n");
     
       } endprogn();
     }
     
     /* The following is a macro call that defines a procedure called
      * Lpick().  The reason for doing this in a macro is that that macro
      * encapsulates a lot of necessary stuff that would be the same for
      * this procedure in any program.  If you write a Geomview module that
      * wants to know about user pick events you can just copy this macro
      * call and change the body to suit your needs; the body is the last
      * argument to the macro and is delimited by curly braces.
      *
      * The first argument to the macro is the name of the procedure to
      * be defined, "Lpick".
      *
      * The next two arguments are numbers which specify the sizes that
      * certain arrays inside the body of the procedure should have.
      * These arrays are used for storing the face and path information
      * of the picked objeto.  In this module we don't care about this
      * information so we declare them to have length 1, the minimum
      * allowed.
      *
      * The last argument is a block of code to be executed when the module
      * receives a pick event.  In this body you can refer to certain local
      * variables that hold information about the pick.  For details see
      * Example 3 in the Extenal Modules chapter of the Geomview manual.
      */
     PICKFUNC(Lpick, 1, 1,
     {
       handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge);
     },
     /* version for picking Nd-objects (not documented here) */)
     
     handle_pick(picked, p, vert, v, edge, e)
          int picked;                /* was something actually picked?     */
          int vert;                  /* was the pick near a vertex?        */
          int edge;                  /* was the pick near an edge?         */
          HPoint3 *p;                /* coords of pick point               */
          HPoint3 *v;                /* coords of picked vertex            */
          HPoint3 e[2];              /* coords of endpoints of picked edge */
     {
       Normalize(&e[0]);             /* Normalize makes 4th coord 1.0 */
       Normalize(&e[1]);
       Normalize(p);
       progn(); {
         if (!picked) {
           printf("(geometry \"pick\" { LIST } )\n");
         } else {
           /*
            * Put the box in place, and color it magenta if it's on a vertex,
            * yellow if not.
            */
           printf("(xform-set pick { 1 0 0 0  0 1 0 0  0 0 1 0  %g %g %g 1 })\n",
                  p->x, p->y, p->z);
           printf("(geometry \"pick\"\n");
           if (vert) printf("{ appearance { material { diffuse 1 0 1 } }\n");
           else printf("{ appearance { material { diffuse 1 1 0 } }\n");
           printf("  { LIST { :littlebox }\n");
     
           /*
            * If it's on an edge and not a vertex, mark the edge
            * with cyan boxes at the endpoins and a black line
            * along the edge.
            */
           if (edge && !vert) {
             e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z;
             e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z;
             printf("{ appearance { material { diffuse 0 1 1 } }\n\
       LIST\n\
        { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\
        { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\
        { VECT\n\
               1 2 1\n\
               2\n\
               1\n\
               %f %f %f\n\
               %f %f %f\n\
               1 1 0 1\n\
        }\n\
       }\n",
                    e[0].x, e[0].y, e[0].z,
                    e[1].x, e[1].y, e[1].z,
                    e[0].x, e[0].y, e[0].z,
                    e[1].x, e[1].y, e[1].z);
           }
           printf("    }\n  }\n)\n");
         }
     
       } endprogn();
     
     }
     
     Normalize(HPoint3 *p)
     {
       if (p->w != 0) {
         p->x /= p->w;
         p->y /= p->w;
         p->z /= p->w;
         p->w = 1;
       }
     }
     
     main()
     {
       Lake *lake;
       LObject *lit, *val;
       extern char *getenv();
     
       Initialize();
     
       lake = LakeDefine(stdin, stdout, NULL);
       while (!feof(stdin)) {
     
         /* Parse next lisp expression from stdin.
          */
         lit = LSexpr(lake);
     
         /* Evaluate that expression; this is where Lpick() gets called.
          */
         val = LEval(lit);
     
         /* Free the two expressions from above.
          */
         LFree(lit);
         LFree(val);
       }
     }
     

The code begins by defining procedures progn() and endprogn() which begin and end a Geomview progn group. The purpose of the Geomview progn command is to group commands together and cause Geomview to execute them all at once, without refreshing any graphics windows until the end. It is a good idea to group blocks of commands that a module sends to Geomview like this so that the user sees their cumulative effect all at once.

Procedure Initialize() does various things needed at program startup time. It initializes the lisp library by calling LInit(). Any program that uses the lisp library should call this once before calling any other lisp library functions. It then calls LDefun to tell the library about our pick procedure, which is defined further down with a call to the PICKFUNC macro. Then it sends a bunch of setup commands to Geomview, grouped in a progn block. This includes defining a handle called littlebox that stores the geometry of the little box. Next it sends the command

     (interest (pick world * * * * nil nil nil nil nil))

which tells Geomview to notify us when a pick event happens.

The syntax of this interest statement merits some explanation. In general interest takes one argument which is a (parenthesized) expression representing a Geomview function call. It specifies a type of call that the module is interested in knowing about. The arguments can be any particular argument values, or the special symbols * or nil. For example, the first argument in the pick expression above is world. This means that the module is interested in calls to pick where the first argument, which specifies the coordinate system, is world. A * is like a wild-card; it means that the module is interested in calls where the corresponding argument has any value. The word nil is like *, except that the argument's value is not reported to the module. This is useful for cutting down on the amount of data that must be transmitted in cases where there are arguments that the module doesn't care about.

The second, third, fourth, and fifth arguments to the pick command give the name, pick point coordinates, vertex coordinates, and edge coordinates of a pick event. We specify these by *'s above. The remaining five arguments to the pick command give other information about the pick event that we do not care about in this module, so we specify these with nil's. For the details of the arguments to pick, See GCL.

The geometry statement defines a geom called pick that is initially an empty list, specified as { LIST } ; this is the best way of specifying a null geom. The module will replace this with something useful by sending Geomview another geometry command when the user picks something. Next we arrange for the pick objeto to be non-pickable, and turn normalization off for it so that Geomview will display it in the size and location where we put it, rather than resizing and relocating it to fit into the unit cube.

The next function in the file, Lpick, is defined with a strange looking call to a macro called PICKFUNC, defined in the header file pickfunc.h. This is the function for handling pick events. The reason we provide a macro for this is that that macro encapsulates a lot of necessary stuff that would be the same for the pick-handling function in any program. If you write a Geomview module that wants to know about user pick events you can just copy this macro call and change it to suit yours needs.

In general the syntax for PICKFUNC is

     PICKFUNC(name, block, NDblock)

where name is the name of the procedure to be defined, in this case Lpick. The next argument, block, is a block of code to be executed when a pick event occurs. If block contains a return statement, then the returned value must be a pointer to a Lisp-objeto, that is of type LObject *. The last argument has the same functionality as the block argument, but is only invoked when picking objetos in a higher dimensional world.

PICKFUNC declares certain local variables in the body of the procedure. When the module receives a (pick ...) statement from Geomview, the procedure assigns values to these variables based on the information in the pick call (variables corresponding to nil's in the (interest (pick ...)) are not given values).

There is also a second variant of the PICKFUNC macro with a slightly different syntax:

     DEFPICKFUNC(helpstr, coordsys, id,
       point, pn, vertex, vn, edge, en, face, fn, ppath, ppn,
       vi, ei, ein, fi,
       body, NDbody)

DEFPICKFUNC can be used as well as PICKFUNC, there is no functional differene with the exception that the name of the C-function is tied to Lpick when using DEFPICKFUNC and that the (help pick) GCL-command (see (help ...)) would respond with echoing helpstr.

The table below lists all variables defined in PICKFUNC In the context of ND-viewing float variants of the arguments apply: the body execution block sees the HPoint3 variables, and the NDbody block sees only flat one-dimensional arrays of float-type.

In the ND-viewing context the co-ordinates passed to the pick function are still the 3-dimensional co-ordinates of the câmera view-port where the pick occurred, but padded with zeroes on transformed back to the co-ordinate system specified by the second argument of the pick command.

char *coordsys;
A string specifying the coordinate system in which coordinates are given. In this example, this will always be world because of the interest call above.
char *id;
A string specifying the name of the picked geom.
HPoint3 point; int pn;
float *point; int pn;
point is an HPoint3 structure giving the coordinates of the picked point. HPoint3 is a homogeneous point coordinate representation equivalent to an array of 4 floats. pn tells how many coordinates have been written into this array; it will always be either 0, 4 or greater than 4. If it is greater than 4, then the NDbody instruction block is invoked and in this case point is a flat array of pn many floats. A value of zero means no point was picked, i.e. the user clicado the botão direito do mouse while the cursor was not pointing at a geom. In this case the ordinary block 3d instruction block is executed.
HPoint3 vertex; int vn;
float *vertex; int vn;
vertex is an HPoint3 structure giving the coordinates of the picked vertex, if the pick point was near a vertex. vn tells how many coordinates have been written into this array; it will always be either 0 or greater equal 4. A value of zero means the pick point was not near a vertex. In the context of ND-viewing vertex will be an array of vn floats and vn will be equal to pn.
HPoint3 edge[2]; int en;
float *edge; int en;
edge is an array of two HPoint3 structures giving the coordinates of the endpoints of the picked edge, if the pick point was near an edge. en tells how many coordinates have been written into this array; it will always be 0 or greater equal 8. A value of zero means the pick point was not near an edge. In the context of ND-viewing edge will be a flat one-dimensional array of en many floats: the first pn floats define the first vertex, and the second pn many floats define the second vertex; en will be two times pn.

In this example module, the remaining variables will never be given values because their values in the interest statement were specified as nil.

HPoint3 face[]; int fn;
float *face; int fn;
face is a variable length array of fn HPoint3's. face gives the coordinates of the vertices of the picked face. fn tells how many coordinates have been written into this array; it will always be either 0 or a multiple of pn. A value of zero means the pick point was not near a face. In the context of ND-viewing face is a flat one-dimensional array of fn many floats of which each vertex occupies pn many components.
int ppath[]; int ppn;
ppath is an array of maxpathlen int's. ppath gives the path through the OOGL heirarchy to the picked primitive. pn tells how many integers have been written into this array; it will be at most maxpathlen. A path of {3,1,2}, for example, means that the picked primitive is "subobjeto number 2 of subobjeto number 1 of objeto 3 in the world".
int vi;
vi gives the index of the picked vertex in the picked primitive, if the pick point was near a vertex.
int ei[2]; int ein
The ei array gives the indices of the endpoints of the picked edge, if the pick point was near a vertex. ein tells how many integers were written into this array. It will always be either 0 or 2; a value of 0 means the pick point was not near an edge.
int fi;
fi gives the index of the picked face in the picked primitive, if the pick point was near a face.

The handle_pick procedure actually does the work of dealing with the pick event. It begins by normalizing the homogeneous coordinates passed in as arguments so that we can assume the fourth coordinate is 1. It then sends GCL commands to define the pick objeto to be whatever is appropriate for the kind of pick recieved. See see OOGL File Formats, and see GCL, for an explanation of the format of the data in these commands.

The main program, at the bottom of the file, first calls Initialize(). Next, the call to LakeDefine defines the Lake that the lisp library will use. A Lake is a structure that the lisp library uses internally as a type of communiation vehicle. (It is like a unix stream but more general, hence the name.) This call to LakeDefine defines a Lake structure for doing I/O with stdin and stdout. The third argument to LakeDefine should be NULL for external modules (it is used by Geomview). Finally, the program enters its main loop which parses and evaluates expressions from standard input. geomview-1.9.4/doc/geomview-pt_BR.html/snapshot.html0000644000175000001440000000622610663302002017345 00000000000000 snapshot - Manual do Geomview

Next: , Previous: sleep-until, Up: GCL Reference


7.2.120 snapshot

(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])
Save a snapshot of CAM-ID in the FILENAME (a string). The FORMAT argument is optional; it may be "ppmscreen" (the default), "ps", "ppm", "sgi" (on SGI machines), "ppmosmesa" (if built with libOSMesa) or "ppmosglx". A "ppmscreen" snapshot is created by reading the image directly from the given window; the window is popped above other windows and redrawn first, then its contents are written as a PPM format image. A "ppmosmesa" snapshot is drawn by Mesa's software renderer into a memory buffer in RAM. A "ppmosglx" snapshot is rendered into a GLX Pixmap buffer, which is also off-screen but may or may not reside in video RAM. Rendering may or may not be accelerated. The problem with on-screen snapshots is that the window must be mapped and not obscured by other windows. So on-screen snapshots will not work in the background, or when a screen safer is active. With "ps", dumps a Postscript picture representing the view from that window; hidden-surface removal might be incorrect. With "ppm", dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the FILENAME argument begins with "|", it's interpreted as a /bin/sh command to which the PPM or PS data should be piped. Optional XSIZE and YSIZE values are relevant only for "ppm" formats, and render to a window of that size (or scaled to that size, with aspect fixed, if only XSIZE is given)
geomview-1.9.4/doc/geomview-pt_BR.html/Example4.html0000644000175000001440000001756410663302002017174 00000000000000 Example4 - Manual do Geomview

Next: , Previous: Example3, Up: Modules


6.6 Example 4: Simple Tcl/Tk Module Demonstrating Picking

It's not necessary to write a Geomview module in C. The only requirement of an external module is that it send GCL commands to its standard output and expect responses (if any) on its standard input. An external module can be written in C, perl, tcl/tk, or pretty much anything.

As an example, assuming you have Tcl/Tk version 4.0 or later, here's an external module with a simple GUI which demonstrates interaction with geomview. This manual doesn't discuss the Tcl/Tk language; see the good book on the subjeto by its originator John Ousterhout, published by Addison-Wesley, titled Tcl and the Tk Toolkit.

The `#!' on the script's first line causes the system to interpret the script using the Tcl/Tk `wish' program; you might have to change its first line if that's in some location other than /usr/local/bin/wish4.0. Or, you could define it as a module using

       (emodule-define  "Pick Demo"  "wish pickdemo.tcl")

in which case `wish' could be anywhere on the UNIX search path.

     #! /usr/local/bin/wish4.0
     
     # We use "fileevent" below to have "readsomething" be called whenever
     # data is available from standard input, i.e. when geomview has sent us
     # something.  It promises to include a trailing newline, so we can use
     # "gets" to read the geomview response, then parse its nested parentheses
     # into tcl-friendly {} braces.
     
     proc readsomething {} {
       if {[gets stdin line] < 0} {
             puts stderr "EOF on input, exiting..."
             exit
       }
       regsub -all {\(} $line "\{" line
       regsub -all {\)} $line "\}" line
       # Strip outermost set of braces
       set stuff [lindex $line 0]
       # Invoke handler for whichever command we got.  Could add others here,
       # if we asked geomview for other kinds of data as well.
       switch [lindex $stuff 0] {
             pick     {handlepick $stuff}
             rawevent {handlekey $stuff}
       }
     }
     
     # Fields of a "pick" response, from geomview manual:
     #     (pick COORDSYS GEOMID G V E F P VI EI FI)
     #          The pick command is executed internally in response to pick
     #          events (right mouse double clique).
     #
     #          COORDSYS = coordinate system in which coordinates of the following
     #              arguments are specified.   This can be:
     #               world: world coord sys
     #               self:  coord sys of the picked geom (GEOMID)
     #               primitive: coord sys of the actual primitive within
     #                   the picked geom where the pick occurred.
     #          GEOMID = id of picked geom
     #          G = picked point (actual intersection of pick ray with objeto)
     #          V = picked vertex, if any
     #          E = picked edge, if any
     #          F = picked face
     #          P = path to picked primitive [0 or more]
     #          VI = index of picked vertex in primitive
     #          EI = list of indices of endpoints of picked edge, if any
     #          FI = index of picked face
     
     # Report when user picked something.
     #
     proc handlepick {pick} {
       global nameof selvert seledge order
       set obj [lindex $pick 2]
       set xyzw [lindex $pick 3]
       set fv [lindex $pick 6]
       set vi [lindex $pick 8]
       set ei [lindex $pick 9]
       set fi [lindex $pick 10]
     
       # Report result, converting 4-component homogeneous point into 3-space point.
       set w [lindex $xyzw 3]
       set x [expr [lindex $xyzw 0]/$w]
       set y [expr [lindex $xyzw 1]/$w]
       set z [expr [lindex $xyzw 2]/$w]
       set s "$x $y $z "
       if {$vi >= 0} {
             set s "$s  vertex #$vi"
       }
       if {$ei != {}} {
             set s "$s  edge [lindex $ei 0]-[lindex $ei 1]"
       }
       if {$fi != -1} {
             set s "$s  face #$fi ([expr [llength $fv]/3]-gon)"
       }
       msg $s
     }
     
     
     # Having asked for notification of these raw events, we report when
     # the user pressed these keys in the geomview graphics windows.
     
     proc handlekey {event} {
       global lastincr
       switch [lindex $event 1] {
         32 {msg "Pressed space bar"}
          8 {msg "Pressed backspace key"}
       }
     }
     
     
     #
     # Display a message on the control panel, and on the terminal where geomview
     # was started.  We use ``puts stderr ...'' rather than simply ``puts ...'',
     # since Geomview interprets anything we send to standard output
     # as a GCL command!
     #
     proc msg {str} {
       global msgtext
       puts stderr $str
       set msgtext $str
       update
     }
     
     # Load objeto from file
     proc loadobject {fname} {
       if {$fname != ""} {
             puts "(geometry thing < $fname)"
             # Be sure to flush output to ensure geomview receives this now!
             flush stdout
       }
     }
     
     
     # Build simple "user interface"
     
     # The message area could be a simple label rather than an entry box,
     # but we want to be able to use X selection to copy text from it.
     # The default mouse bindings do that automatically.
     
     entry .msg -textvariable msgtext -width 45
     pack .msg
     
     frame .f
     
       label .f.l -text "File to load:"
       pack .f.l -side left
     
       entry .f.ent -textvariable fname
       pack .f.ent -side left -expand true -fill x
       bind .f.ent <Return> { loadobject $fname }
     
     pack .f
     
     
     # End UI definition.
     
     
     # Call "readsomething" when data arrives from geomview.
     
     fileevent stdin readable {readsomething}
     
     # Geomview initialization
     
     puts {
             (interest (pick primitive))
             (interest (rawevent 32))	# Be notified when user presses space
             (interest (rawevent 8))		# or backspace keys.
             (geometry thing < hdodec.off)
             (normalization world none)
     }
     # Flush to ensure geomview receives this.
     flush stdout
     
     wm title . {Sample external module}
     
     msg "Click right mouse in graphics window"
geomview-1.9.4/doc/geomview-pt_BR.html/Intro.html0000644000175000001440000000613310663302002016576 00000000000000 Intro - Manual do Geomview

Next: , Previous: Top, Up: Top


Introduction to Geomview

Geomview é um programa interativo para visualizar e manipular objetos geométricos, originalmente escrito pelos membros do estado maior do Geometry Center na Universidade de Minesota (EUA), começando em 1991. O Geomview pode ser usado como um visualizador independente para objetos estáticos ou como um mecanismo de visualização para outros programas que produzem dinamicamente mudanças geométricas. Geomview roda sobre muitos tipos de computadores Unix, incluindo Linux, SGI, Sun, e HP. Geomview também executa com Cygwin. Esse manual descreve Geomview em sua versão 1.9.

Geomview é um software livre, disponível sob os termos da Licença Pública Geral Menor do GNU ; veja Copying para detalhes.

Geomview e esse manual podem ser encontrados em http://www.geomview.org.

É permitido fazer cópias desse manual.

Se você tiver dúvidas ou comentários sobre o Geomview ou esse manual, considere inscrever-se na lista de correio eletrônico geomview-users, que é um fórum no qual usuários do Geomview comunicam-se para responder outras questões e para compartilhar notícias sobre o que eles estão fazendo com o Geomview. Os autores do Geomview participam dessa lista e algumas vezes enviam respostas a questionamentos existentes. Para assinar a lista, visite a página da lista no sítio http://lists.sourceforge.net/mailman/listinfo/geomview-users. geomview-1.9.4/doc/geomview-pt_BR.html/delete.html0000644000175000001440000000320210663302002016737 00000000000000 delete - Manual do Geomview

Next: , Previous: cursor-twitch, Up: GCL Reference


7.2.26 delete

(delete ID)
Delete objeto or câmera ID.
geomview-1.9.4/doc/geomview-pt_BR.html/emodule_002dtransmit.html0000644000175000001440000000372410663302002021447 00000000000000 emodule-transmit - Manual do Geomview

Next: , Previous: emodule-start, Up: GCL Reference


7.2.41 emodule-transmit

(emodule-transmit NAME LIST)
Places LIST into external module NAME's standard input. NAME is searched for in the names of the modules as they appear in the External Modules browser and then in the shell commands used to execute the external modules. Does nothing if modname is not running.
geomview-1.9.4/doc/geomview-pt_BR.html/Networked-Geomview.html0000644000175000001440000000726510663302002021234 00000000000000 Networked Geomview - Manual do Geomview

Next: , Previous: Remote Display, Up: Remote Display


9.4.1 Using a Networked Geomview Host

The Geomview command looks at the DISPLAY or REMOTEHOST environment variables to try to determine if you are logged in from another computer. If either of these indicates that you are, Geomview will attempt to run Geomview on that computer. In order for this to work, your network must be configured such that the Mathematica computer can successfully rsh to the Geomview computer without giving a password.

You can also explicitly set the DisplayHost option to the Geomview command to a string which is the desired hostname, for example:

     In[1] := << OOGL.m
     
     In[2] := Plot3D[Sin[x + Sin[y]], {x,-2,2},{y,-2,2}]
     
     Out[2] := -Graphics3D-
     
     In[3] := Geomview[%3, DisplayHost->"riemann"]

This displays the graphics %3 on the remote host named riemann.

Geomview recognizes the string "local" as a value for $DisplayHost; it forces the graphics to be displayed on the local machine.

In addition to knowing the name of the machine you want to run Geomview on, Geomview needs to know the type of that machine (the setting of the CPU variable that corresponds to the machine; see Source Code Installation). By default, Geomview assumes that it is the same kind of computer as the one you are running Mathematica on. The MachType option lets you explicitly specify the type of the DisplayHost computer; it should be one of the strings "sgi" or "next" or "x11".

You can use SetOptions to change the default DisplayHost and MachType. For example,

     In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"]

arranges for Geomview to run Geomview on an SGI workstation named riemann. geomview-1.9.4/doc/geomview-pt_BR.html/Private-Module-Installation.html0000644000175000001440000000610210663302002022773 00000000000000 Private Module Installation - Manual do Geomview

6.7.1 Private Module Installation

The emodule-define command arranges for a module to appear in Geomview's Modules browser. The command takes two string arguments; the first is the name that will appear in the Modules browser. The second is the shell command for running the module; it may include arguments (see (emodule-define ...)). Geomview executes this command in a subshell when you clique sobre o the module's entry in the browser. For example

     (emodule-define "Foo" "/u/home/modules/foo -x")

adds a line labeled "Foo" to the Modules browser which causes the command "/u/home/modules/foo -x" to be executed when selected.

You may put emodule-define commands in your ~/.geomview file to arrange for certain modules to be available every time you run Geomview; See Customization. You can also execute emodule-define commands from the Commands panel to add a module to an already running copy of Geomview.

There are several other GCL commands for controlling the entries in the Modules browser; for details, See GCL. geomview-1.9.4/doc/geomview-pt_BR.html/Module-Installation.html0000644000175000001440000000402510663302002021365 00000000000000 Module Installation - Manual do Geomview

Previous: Example4, Up: Modules


6.7 Module Installation

This section tells how to install an external module so you can invoke it within Geomview. There are two ways to install a module: you can install a private module so that the module is available to you whenever you run Geomview, or you can install a system module so that the module is available to all users on your system whenever they run Geomview.

geomview-1.9.4/doc/geomview-pt_BR.html/copy.html0000644000175000001440000000341310663302002016453 00000000000000 copy - Manual do Geomview

Next: , Previous: command, Up: GCL Reference


7.2.23 copy

(copy [ID] [name])
Copies an objeto or camera. If ID is not specified, it is assumed to be targetgeom. If name is not specified, it is assumed to be the same as the name of ID.
geomview-1.9.4/doc/geomview-pt_BR.html/event_002dkeys.html0000644000175000001440000000333110663302002020242 00000000000000 event-keys - Manual do Geomview

Next: , Previous: escale, Up: GCL Reference


7.2.43 event-keys

(event-keys {on|off})
Turn keyboard events on or off to enable/disable teclas de atalho.
geomview-1.9.4/doc/geomview-pt_BR.html/Overview.html0000644000175000001440000001212410663302002017306 00000000000000 Overview - Manual do Geomview

Next: , Previous: Pronunciation, Up: Top


1 Overview

O principal objetivo do Geomview é mostrar objetos cuja geometria é fornecida, permitindo controle interativo sobre detalhes tais como ponto de visão, velocidade de movimento, aparência de superfícies e linhas, e assim por diante. Geomview pode manusear qualquer número de objetos e permite controle coletivo ou separado sobre eles.

A maneira mais simples de usar Geomview é como um visualizador independente para ver e manipular objetos. Geomview pode mostrar objetos descritos em uma variedade de formatos de arquivo. Geomview é acompanhado com uma larga variedade de objetos como exemplo, e você pode criar seus próprios objetos.

Você pode também usar Geomview para manusear os dados a serem mostrados provenientes de outro programa que está sendo executado simultâneamente. Como o outro programa modifica os dados, a imágem no geomview reflete as modificaçòes. Programas que geram objetos e utilizam o Geomview para mostrá-los são chamados módulos externos. Módulos externos podem controlar quase todos os aspéctos do Geomview. A idéia aqui é que muitos aspéctos de visualização e partes da interação de programas geométricos são independentes do conteúdo geométrico e podem ser coletados conjuntamente em uma peça simples de programa que pode ser usada em uma larga variedade de situações. O autor de um módulo externo pode concentrar-se sobre a implementação dos algorítmos desejados e deixar os aspéctos de visualização ao Geomview. Geomview é acompanhado por uma coleção de módulos externos a título de exemplo, e esse manual descreve como escrever seu próprio módulo externo.

Geomview é o produto de um esforço no Geometry Center para disponibilizar um software de geometria interativa que é particularmente apropriado para pesquisa matemática e educação. Em particular, Geomview pode mostrar coisas no espaço hiperbólico e no espaço esférico bem como no espaço Euclidiano.

Geomview permite múltiplos objetos que são controlados independentemente e câmeras. As câmeras fornecem controle interativo para movimento, aparências (incluindo iluminação, sombreamento, e materiais), selecionando um objeto, aresta ou nível de vértice, instantâneos em um arquivo de imagem SGI ou no formato Renderman RIB, a adição ou apagamento de objetos é possível através da manipulação direta do mouse, painéis de controle, e teclas de atalho via teclado.

Geomview suporta os seguintes tipos de dados simples: poliedros com vértices compartilhados (.off), quadriláteros, malhas retangulares, vetores, e ajustes em superfícies de Bezier de grau arbitrário incluindo ajustes racionais. Hierarquías de objetos podem ser construídas com listas de objetos e instâncias de objeto(s) transformado(s) por uma ou mais matrizes 4x4. Porções arbitrárias de modificações de hierarquías podem ser transmitidas por meio da criação de referências nomeadas.

Geomview pode mostrar saídas gráficas tridimensionais provenientes do Mathematica e do Maple. geomview-1.9.4/doc/geomview-pt_BR.html/Keyboard-Shortcuts.html0000644000175000001440000002062310663302002021237 00000000000000 Keyboard Shortcuts - Manual do Geomview

Previous: Commands, Up: Interaction


3.10 Keyboard Shortcuts

Most actions that you can do through Geomview's panels have equivalent teclas de atalho so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts usually are indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the tecla de atalho for Rotate mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the MOTION MODE browser. To use this tecla de atalho just hit the r key while the mouse cursor is in any Geomview window. You don't need to press the <Enter> or <SPACE> keys.

Some teclas de atalho consist of more than one key. In these cases just type the keys one after the other, with no <Enter> afterwards. Keyboard shortcuts are case sensitive. You can cancel a multi-key tecla de atalho that you have started by typing any invalid key, for example the space bar.

Keyboard commands apply while the cursor is in any janela de câmera and most control panels.

Many teclas de atalho allow numeric arguments which you type as a prefix to the command key(s). For example, the shortcut for Near clip in the câmera panel is v n. To set the near clip plane to `0.5', type 0.5vn. Commands that don't take a numeric prefix toggle or reset the current value.

Most commands allow one of the following selection prefixes. If none is provided the command applies to the objeto alvo.

g
world geom
g#
#'th geom
g*
All geoms
c
current camera
c#
#'th camera
c*
All câmeras

For example, g4af means toggle the face drawing of objeto g4.

Simply typing a selection prefix, like g4, doesn't yet select an objeto; that only happens when a command, like ae, follows the prefix. To select an objeto as the target without doing anything else to it, use the p command. So g3p selects objeto g3.

The text field in the upper left corner of the Main panel shows the state of the current tecla de atalho.

In addition to the teclas de atalho for the panel commands, there is also a shortcut for picking a objeto alvo: type the short name of the objeto followed by p. For example, to select objeto g3, type g 3 p. This only works with the short names — the ones that appear in square brackets ([ ]) in the Targets browser of the Main panel.

Below is a summary of all teclas de atalho.

Draw
af
Faces
ae
Edges
an
Normals
ab
Bounding Boxes
aV
Vectors

Shading
0as
Constant
1as
Flat
2as
Smooth
3as
Smooth, non-lighted
aT
allow transparency
at
texture mapping

Other
av
eVert normals: always face viewer
#aw
Line Width (pixels)
aC
handle concave polygons
#vc
edges Closer than faces (try 5-100)

Color
Cf
faces
Ce
edges
Cn
normals
Cb
bounding boxes
CB
background

Motions
r
rotate
t
translate
z
zoom FOV
f
fly
o
orbit
s
scale
w
recenter target
W
recenter all
h
halt
H
halt all
@
select center of movimento (e.g. g 3 @)
L
Look At objeto

Viewing
0vp
Orthographic view
1vp
Perspective view
vd
Draw other views' câmeras
#vv
field of View
#vn
near clip distance
#vf
far clip distance
v+
add new camera
vx
cursor on/off
vb
backfacing poly cull on/off
#vl
focal length
v~
Software shading on/off

Panels
Pm
Main
Pa
Appearance
Pl
Lighting
Po
Obscure
Pt
Tools
Pc
Câmeras
PC
Commands
Pf
Files
Ps
Save
P-
read commands from tty
PA
Credits ("about")

Lights
ls
show lights
le
edit lights

Space
me
Euclidean
mh
Hyperbolic
ms
Spherical

Model
mv
Virtual
mp
Projective
mc
Conformal

Other
0N
normalizaton: none
1N
normalization: each
2N all
normalization: all
ui
movimento: Inertia
uc
movimento: Constrain to axis
uo
movimento: objeto's Own coordinates
<
Pf
load geometry/command file
dd
delete objeto alvo
>
Ps
save state to file
TV
NTSC mode toggle
p
pick as objeto alvo (e.g. g 3 p) With no prefix, selects the objeto under the mouse cursor (like double-clicando the right mouse)
geomview-1.9.4/doc/geomview-pt_BR.html/File-names.html0000644000175000001440000000356110663302002017465 00000000000000 File names - Manual do Geomview

Next: , Previous: Common syntax, Up: Conventions


4.1.2 File Names

When OOGL objetos are read from disk files, the OOGL library uses the file suffix to guess at the file type.

If the suffix is unrecognized, or if no suffix is available (e.g. for an objeto being read from a pipe, or embedded in another OOGL objeto), all known types of objetos are tried in turn until one accepts the data as valid. geomview-1.9.4/doc/geomview-pt_BR.html/winenter.html0000644000175000001440000000331410663302002017334 00000000000000 winenter - Manual do Geomview

Next: , Previous: window, Up: GCL Reference


7.2.143 winenter

(winenter CAM-ID)
Tell geomview that the mouse cursor is in the window of CAM-ID. This function is for development purposes and is not intended for general use.
geomview-1.9.4/doc/geomview-pt_BR.html/if.html0000644000175000001440000000352210663302002016100 00000000000000 if - Manual do Geomview

Next: , Previous: hsphere-draw, Up: GCL Reference


7.2.57 if

(if TEST EXPR1 [EXPR2])
Evaluates TEST; if TEST returns a non-nil value, returns the value of EXPR1. If TEST returns nil, returns the value of EXPR2 if EXPR2 is present, otherwise returns nil.
geomview-1.9.4/doc/geomview-pt_BR.html/event_002dpick.html0000644000175000001440000000325010663302002020215 00000000000000 event-pick - Manual do Geomview

Next: , Previous: event-mode, Up: GCL Reference


7.2.45 event-pick

(event-pick {on|off})
Turn picking on or off.
geomview-1.9.4/doc/geomview-pt_BR.html/Starting-Geomview.html0000644000175000001440000000445410663302002021062 00000000000000 Starting Geomview - Manual do Geomview

Next: , Previous: Interaction, Up: Interaction


3.1 Starting Geomview

A forma usual para iniciar o Geomview é digitar geomview <Enter> em uma janela de shell (<Enter> significa pressionar a tecla "Enter"). Esse procedimento carrega o Geomview na memória do computador em uns poucos segundos; uma ou mais janelas irão aparecer e você pode começar a interagir com o Geomview imediatamente.

É também possível especificar ações para o Geomview executar no momento de iniciar fornecendo argumentos na linha de comando do shell. Veja Command Line Options. geomview-1.9.4/doc/geomview-pt_BR.html/emodule_002ddefined.html0000644000175000001440000000375410663302002021207 00000000000000 emodule-defined - Manual do Geomview

7.2.35 emodule-defined

(emodule-defined modulename)
If the given external-module name is known, returns the name of the program invoked when it's run as a quoted string; otherwise returns nil. (echo (emodule-defined name)) prints the string.
geomview-1.9.4/doc/geomview-pt_BR.html/emodule_002dclear.html0000644000175000001440000000334610663302002020674 00000000000000 emodule-clear - Manual do Geomview

Next: , Previous: echo, Up: GCL Reference


7.2.33 emodule-clear

(emodule-clear)
Clears the geomview application (external module) browser.
geomview-1.9.4/doc/geomview-pt_BR.html/Source-Code-Installation.html0000644000175000001440000001340210663302002022247 00000000000000 Source Code Installation - Manual do Geomview

10.2 Compiling and Installing the Source Code Distribution

The main reason to get the source code distribution is to look at and/or work with the source code. If you are only concered with using Geomview it is better to get the binary distribution. It takes anywhere from a few minutes to an hour or more to compile the entire source distribution, depending on what kind of computer you have.

Let $GEOMROOT denote the full pathname of the Geomview source code directory; this is the directory called Geomview that is created when you unpack the distribution. This directory contains the Geomview source code as well as various other files and subdirectories that Geomview needs when it runs.

Before doing any compilation you should edit the file $GEOMROOT/makefiles/mk.site.default. This file defines some make variables which specify your local configuration. This includes the pathnames of the directories into which Geomview will be installed, and possibly some other settings as well. There are comments in the file telling you what to do. This file is included by every Makefile in the source tree, so the settings you specify here are used throughout the source.

If you will be compiling for multiple systems, you can do them all in the same directory tree. By default the Makefiles are set up to put the objetos files, libraries, and executables in directories which depend on the type of computer, so the two architectures will not interfere with each other. The Makefiles use a variable called CPU to determine the type of machine. Before doing any compilation you must arrange for this variable to have a value. There are two ways you can do this.

  1. If you will always be compiling Geomview on the same type of computer edit the file $GEOMROOT/makefiles/Makedefs.global to set the CPU variable to one of the values linux, FreeBSD, sgi, hpux, hpux-gcc, solaris, sun4os4 (for Suns with SunOS 4, not Solaris), rs6000, or alpha. If you're using a type of system not in this list, make up a new value for CPU, and write a mk.<CPU> file for it patterned after the other mk.* in the makefiles subdirectory.
  2. If you will be compiling on more than one type of computer you can set a shell environment variable named CPU to one of the values above and the Makefiles will inherit the value from the environment.

Note that many of the Makefiles refer to a variable called MACHTYPE; this variable tells which type of graphics system to compile Geomview for. The mk.<CPU> files set this variable for you; in most cases its value is x11, which specifies that Geomview should be compiled for X windows.

Once you have configured your source tree by editing the files as described above and setting the CPU variable, you can compile and install Geomview by typing make install in the $GEOMROOT directory. You can also type make all, or equivalently just make, to compile without installing, and then type make install later to install.

You can use these same make comands in any subdirectory in the tree to recompile and/or install a part of Geomview or a module.

If you want to modify the complier flags used during compilation, edit the file $GEOMROOT/makefiles/Makedefs.global; the COPTS variable specifies the flags passed to the C compiler (cc). geomview-1.9.4/doc/geomview-pt_BR.html/set_002dmotionscale.html0000644000175000001440000000422210663302002021256 00000000000000 set-motionscale - Manual do Geomview

Next: , Previous: set-load-path, Up: GCL Reference


7.2.114 set-motionscale

(set-motionscale X)
Set the movimento scale factor to X (default value 0.5). These commands scale their movimento by an amount which depends on the distance from the frame to the center and on the size of the frame. Specifically, they scale by dist + scaleof(frame) * motionscale where dist is the distance from the center to the frame and motionscale is the movimento scale factor set by this function. Scaleof(frame) measures the size of the frame objeto.
geomview-1.9.4/doc/geomview-pt_BR.html/merge.html0000644000175000001440000000370510663302002016604 00000000000000 merge - Manual do Geomview

Next: , Previous: look-toward, Up: GCL Reference


7.2.69 merge

(merge {window|camera} CAM-ID { WINDOW or CAMERA ... })
Modify the given window or camera, changing just those properties specified in the last argument. E.g.
          	(merge camera Camera { far 20 })
     

sets Camera's far clipping plane to 20 while leaving other attributes untouched.

geomview-1.9.4/doc/geomview-pt_BR.html/figtools.html0000644000175000001440000000011110663302002017317 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/or.html0000644000175000001440000000331710663302002016124 00000000000000 or - Manual do Geomview

Next: , Previous: not, Up: GCL Reference


7.2.88 or

(or EXPR1 EXPR2)
Evaluates EXPR1; if EXPR1 returns non-nil, return its value, if EXPR1 returns nil, evaluate EXPR2 and return its value.
geomview-1.9.4/doc/geomview-pt_BR.html/all.html0000644000175000001440000000420310663302002016247 00000000000000 all - Manual do Geomview

Next: , Previous: emodule-run, Up: GCL Reference


7.2.8 all

(all geometry)
returns a list of names of all geometry objetos. Use e.g. `(echo (all geometry))' to print such a list.
(all camera)
returns a list of names of all câmeras.
(all emodule defined)
returns a list of all defined external modules.
(all emodule running)
returns a list of all running external modules.
geomview-1.9.4/doc/geomview-pt_BR.html/bbox_002dcolor.html0000644000175000001440000000345310663302002020223 00000000000000 bbox-color - Manual do Geomview

Next: , Previous: background-image, Up: GCL Reference


7.2.13 bbox-color

(bbox-color GEOM-ID R G B)
Set the bounding-box color of GEOM-ID; R G B are numbers between 0 and 1.
geomview-1.9.4/doc/geomview-pt_BR.html/Lighting-Panel.html0000644000175000001440000001044110663302002020302 00000000000000 Lighting Panel - Manual do Geomview

Previous: Materials Panel, Up: Appearance


3.6.3 The Lighting Panel

The Lighting panel controls the number, position, and color of the light sources used in shading.

figs/light.png

The Lighting Panel.

The Lighting panel is different from the Appearance and Material panels in that it always works with the base appearance. This is because it usually makes sense to use the same set of lights for drawing all objetos in your scene.

LIGHTS
The LIGHTS browser shows the currently selected light. Changes made using the other widgets on this panel apply to this light. There is always at least one light, the ambient light.
Intensity
This slider controls the intensity of the current light.
Color
This botão brings up a color chooser which lets you select the color of the current light.
Add
This botão adds a light.
Delete
This botão deletes the current light.
Show Lights
This botão lets you see and change the positions of the light sources in a janela de câmera. Each light is drawn as long cylinder which is supposed to remind you of a light beam. When you clique sobre o the Show Lights botão Geomview goes into "light edit" mode, during which you can rotate current light by holding down the botão esquerdo do mouse and moving the mouse. Lights placed in this way are infinitely distant, so what you are changing is the angular position. Clique sobre o the Show Lights botão again to return to the previous modo de movimento and to quit drawing the light beams.
Done
This botão dismisses the Lighting panel.

Geomview's Appearance, Materials, and Lighting panels are constructed to allow you to easily do most of the appearance related things that you might want to do. The appearance hierarchy that Geomview supports internally, however, is very complex and there are certain operations that you cannot do with the panels. The Geomview command language (GCL) provides complete support for appearance operations. In particular, the merge-baseap command can be used to change the base appearance (which, except for lighting, cannot be changed by Geomview's panels). The merge-ap command can be used to change an individual geom's appearance. Appearances can also be specified in OOGL files; for details, see Appearances. See (merge-baseap ...). See (merge-ap ...). geomview-1.9.4/doc/geomview-pt_BR.html/OFF.html0000644000175000001440000001455410663302002016123 00000000000000 OFF - Manual do Geomview

Next: , Previous: BBP and BEZ, Up: Object File Formats


4.2.5 OFF Files

The conventional suffix for OFF files is .off.

Syntax:

     [ST][C][N][4][n]OFF	# Header keyword
     [Ndim]		# Space dimension of vertices, present only if nOFF
     NVertices  NFaces  NEdges   # NEdges not used or checked
     
     x[0]  y[0]  z[0]	# Vertices, possibly with normals,
     			# colors, and/or texture coordinates, in that order,
     			# if the prefixes N, C, ST
     			# are present.
     			# If 4OFF, each vertex has 4 components,
     			# including a final homogeneous component.
     			# If nOFF, each vertex has Ndim components.
     			# If 4nOFF, each vertex has Ndim+1 components.
     ...
     x[NVertices-1]  y[NVertices-1]  z[NVertices-1]
     
         			# Faces
         			# Nv = # vertices on this face
         			# v[0] ... v[Nv-1]: vertex indices
         			#		in range 0..NVertices-1
     Nv  v[0] v[1] ... v[Nv-1]  colorspec
     ...
         			# colorspec continues past v[Nv-1]
         			# to end-of-line; may be 0 to 4 numbers
         			# nothing: default
         			# integer: colormap index
         			# 3 or 4 integers: RGB[A] values 0..255
     			# 3 or 4 floats: RGB[A] values 0..1

OFF files (name for "object file format") represent collections of planar polygons with possibly shared vertices, a convenient way to describe polyhedra. The polygons may be concave but there's no provision for polygons containing holes.

An OFF file may begin with the keyword OFF; it's recommended but optional, as many existing files lack this keyword.

Three ASCII integers follow: NVertices, NFaces, and NEdges. Thease are the number of vertices, faces, and edges, respectively. Current software does not use nor check NEdges; it needn't be correct but must be present.

The vertex coordinates follow: dimension * Nvertices floating-point values. They're implicitly numbered 0 through NVertices-1. dimension is either 3 (default) or 4 (specified by the key character 4 directly before OFF in the keyword).

Following these are the face descriptions, typically written with one line per face. Each has the form

     N  Vert1 Vert2 ... VertN  [color]

Here N is the number of vertices on this face, and Vert1 through VertN are indices into the list of vertices (in the range 0..NVertices-1).

The optional color may take several forms. Line breaks are significant here: the color description begins after VertN and ends with the end of the line (or the next # comment). A color may be:

nothing
the default color
one integer
index into "the" colormap; see below
three or four integers
RGB and possibly alpha values in the range 0..255
three or four floating-point numbers
RGB and possibly alpha values in the range 0..1

For the one-integer case, the colormap is currently read from the file cmap.fmap in Geomview's data directory. Some better mechanism for supplying a colormap is likely someday.

The meaning of "default color" varies. If no face of the objeto has a color, all inherit the environment's default material color. If some but not all faces have colors, the default is gray (R,G,B,A=.666).

A [ST][C][N][n]OFF BINARY format is accepted; See Binary format. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions (and texture coordinates or vertex colors or normals if COFF/NOFF/CNOFF/STCNOFF/etc. format).

Exception: each face's vertex indices are followed by an integer indicating how many color components accompany it. Face color components must be floats, not integer values. Thus a colorless triangular face might be represented as

     int int int int int
     3   17   5   9   0

while the same face colored red might be

     int int int int int float float float float
      3  17   5   9   4   1.0   0.0   0.0   1.0
geomview-1.9.4/doc/geomview-pt_BR.html/look_002dtoward.html0000644000175000001440000000402210663302002020410 00000000000000 look-toward - Manual do Geomview

Next: , Previous: look-recenter, Up: GCL Reference


7.2.68 look-toward

(look-toward [objectID] [cameraID] [origin | center])
Rotates the named câmera to point toward the origin of the objeto's coordinate system, or the center of the objeto's bounding box (in non-Euclidean space, the origin will be used automatically). Default objectID is the world, default camera is targetcam, default location to point towards is the center of the bounding box.
geomview-1.9.4/doc/geomview-pt_BR.html/ND_002dxform_002dget.html0000644000175000001440000000404010663302002021025 00000000000000 ND-xform-get - Manual do Geomview

Next: , Previous: ND-xform, Up: GCL Reference


7.2.78 ND-xform-get

(ND-xform-get ID [from-ID])
Returns the N-D transform of the given objeto in the coordinate system of from-ID (default universe), in the sense <point-in-ID-coords> * Transform = <point-in-from-ID-coords>. Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.
geomview-1.9.4/doc/geomview-pt_BR.html/Non_002dgeometric-objects.html0000644000175000001440000000465610663302002022320 00000000000000 Non-geometric objects - Manual do Geomview

4.3 Non-geometric objects

The syntax of these objetos is given in the form used in See References, where "quoted" items should appear literally but without quotes, square bracketed ([ ]) items are optional, and | separates alternative choices.

geomview-1.9.4/doc/geomview-pt_BR.html/Appearance.html0000644000175000001440000000654710663302002017553 00000000000000 Appearance - Manual do Geomview

Next: , Previous: Mouse Motions, Up: Interaction


3.6 Changing the Way Things Look

Geomview uses a hierarchy of appearances to control the way things look. An appearance is a specification of information about how something should be drawn. This can include many things such things as color, lighting, material properties, and more. Appearances work in a hierarchal manner: if a certain appearance property, for example face color, is not specified in a particular objeto's appearance, that objeto is drawn using that property from the parent appearance. If both the parent and the child appearance specify a property, the child's setting takes precedence unless the parent appearance is set to override.

Every geom in Geomview has an appearance associated with it. There is also an appearance associated with the "World" geom, which serves as the parent of each individual geom's appearance. Finally, there is a global "base" appearance, which is the parent of the World appearance.

The base appearance specifies reasonable values for all appearance information, and by default none of the other appearances specify anything, which means they inherit their values from the base appearance. This means that by default all objetos are drawn using the base appearance.

If you change a certain appearance property for a geom, that property is used in drawing that geom. The parent appearance is used for any properties that you do not explicitly set.

Geomview has three panels which let you modify appearances.

geomview-1.9.4/doc/geomview-pt_BR.html/Support.html0000644000175000001440000000522010663302002017153 00000000000000 Support - Manual do Geomview

Next: , Previous: Installation, Up: Top


Getting Technical Support for Geomview

There are several ways to get support for Geomview.

  1. Visit the Geomview web site, http://www.geomview.org. It contains the latest documentation, news about development, and FAQ (Frequently Asked Questions) list.
  2. Send email to the geomview-users@lists.sourceforge.net mailing list. This is a mailing list for discussing any issues related to using Geomview. To join the list, send an empty note with 'subscribe' in the subjeto line to geomview-users-request@lists.sourceforge.net, or visit the list web page at http://lists.sourceforge.net/mailman/listinfo/geomview-users.
  3. Contract with Geometry Technologies for support. Geometry Technologies is a contract support and programming company that emerged from the Geometry Center, where Geomview was written. For more information visit the Geometry Technologies web site at http://www.geomtech.com.
geomview-1.9.4/doc/geomview-pt_BR.html/look_002dencompass.html0000644000175000001440000000415210663302002021104 00000000000000 look-encompass - Manual do Geomview

Next: , Previous: look, Up: GCL Reference


7.2.65 look-encompass

(look-encompass [objectID] [cameraID])
Moves cameraID backwards or forwards until its field of view surrounds objectID. This routine works only in Euclidean space. If objectID is not specified, it is assumed to be the world. If cameraID is not specified, it is assumed to be the targetcam. See (look-encompass-size ...).
geomview-1.9.4/doc/geomview-pt_BR.html/Vertices.html0000644000175000001440000000655510663302002017277 00000000000000 Vertices - Manual do Geomview

Next: , Previous: File names, Up: Conventions


4.1.3 Vertices

Several objetos share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an objeto have the same format, specified by the header key word.

All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on).

The syntax is

`x y z'
(3-D floating-point vertex coordinates) or
`x y z w'
(4-D floating-point vertex coordinates)

optionally followed by

`nx ny nz'
(normalized 3-D surface-normal if present)

optionally followed by

`r g b a'
(4-component floating-point color if present, each component in range 0..1. The a (alpha) component represents opacity: 0 transparent, 1 opaque.)

optionally followed by

`s t'
`or'
`s t u'

(two or three texture-coordinate values).

Values are separated by white space, and line breaks are immaterial.

Letters in the objeto's header key word must appear in a specific order; that's the reverse of the order in which the data is given for each vertex. So a `CN4OFF' objeto's vertices contain first the 4-component space position, then the 3-component normal, finally the 4-component color. You can't change the data order by changing the header key word; an `NCOFF' is just not recognized. geomview-1.9.4/doc/geomview-pt_BR.html/rehash_002demodule_002dpath.html0000644000175000001440000000441210663302002022455 00000000000000 rehash-emodule-path - Manual do Geomview

Next: , Previous: regtable, Up: GCL Reference


7.2.104 rehash-emodule-path

(rehash-emodule-path)
Rebuilds the application (external module) browser by reading all .geomview-* files in all directories on the emodule-path. Primarily intended for internal use; any applications defined by (emodule-define ...) commands outside of the .geomview-* files on the emodule-path will be lost. Does not sort the entries in the brower. See (emodule-sort). See (emodule-define ...).
geomview-1.9.4/doc/geomview-pt_BR.html/Chunks.html0000644000175000001440000000667710663302002016753 00000000000000 Chunks - Manual do Geomview

9.4.2 Transporting Mathematica Files to Geomview by Hand

The auxilliary function WriteChunk is for those who can only use Mathematica on a computer that Geomview isn't installed on. WriteChunk[file, graphics] generates a file named file which contains the graphics objeto graphics in the format accepted by math2oogl.

You can transfer that file to a computer that has Geomview installed on it and then use the programs math2oogl, oogl2rib, and geomview directly from the shell. These programs are distributed in the bin/<CPU> subdirectory of the Geomview directory, and may have been installed so that they are on your path.

     In[1]:= <<OOGL.m
     
     In[2]:= Plot3D[ Sin[x + Sin[y]], {x,-2,2}, {y,-2,2} ]
     
     Out[2]= -SurfaceGraphics-
     
     In[3]:= WriteChunk["mychunk",%2]

This writes the file mychunk which contains a description of the graphics objeto. You can then transfer this file to a system with Geomview and type

     math2oogl < mychunk > mma.oogl

to convert it to the OOGL file mma.oogl which you can then view using Geomview. This is the equivalent of the WriteOOGL command.

For a result equivalent to the Geomview or Show commands, type

     math2oogl -togeomview Mathematica geomview < mychunk

The WriteRIb command can be emulated from the shell as

     math2oogl < mychunk | oogl2rib -n mma.tiff

geomview-1.9.4/doc/geomview-pt_BR.html/Commands.html0000644000175000001440000000744210663302002017250 00000000000000 Commands - Manual do Geomview

Next: , Previous: Saving, Up: Interaction


3.9 The Commands Panel

The Commands panel lets you type in a GCL command. When you hit <Enter>, Geomview interprets the command and prints any resulting output or error messages on standard output. You can edit the text and hit <Enter> as many times as you like, in general, whenever you hit <Enter> with the cursor in the Commands panel, Geomview tries to interpret whatever text you have typed in the text field as a command.

figs/command.png

Figure 3.10: The Commands Panel.

[Move this.] Normalization is a kind of scaling; Geomview can scale an objeto so that it fits within a certain region. The main point of normalization is to allow you to easily view all of an objeto without having to worry about how big it is. We are gradually replacing Geomview's normalization feature with more robust câmera positioning features. In general, the best way to make sure you are seeing all of an objeto is to use the Look At botão on the Tools panel. Normalization may be completely replaced by this and other features in a future version of Geomview.

Normalization is a property that applies to each geom separately. The NORMALIZE GEOMETRY browser affects the normalization property of target geom. If the target geom is "World", it affects all geoms.

None
Do no normalization.
Individual
Normalize this geom to fit within a unit sphere.
Sequence
This resembles "Individual", except when an objeto is changing. Then, "Individual" tightly fits the bounding box around the objeto whenever it changes and normalizes accordingly, while "Sequence" normalizes the union of all variants of the objeto and normalizes accordingly.
Keep
This leaves the current normalization transform unchanged when the objeto changes. It may be useful to apply "Individual" or "Sequence" normalization to the first version of a changing objeto to bring it in view, then switch to "Keep".
geomview-1.9.4/doc/geomview-pt_BR.html/camera_002dreset.html0000644000175000001440000000326710663302002020530 00000000000000 camera-reset - Manual do Geomview

Next: , Previous: camera-prop, Up: GCL Reference


7.2.18 camera-reset

(camera-reset CAM-ID)
Reset CAM-ID to its default value.
geomview-1.9.4/doc/geomview-pt_BR.html/XForms.html0000644000175000001440000000430010663302002016713 00000000000000 XForms - Manual do Geomview

Next: , Previous: Example2, Up: Modules


6.4 The XForms Library

XForms is a handy and relatively simple user interface toolkit for X11. Many Geomview external modules, including the examples in this manual, use XForms to create and manage control panels. XForms is available from http://www.nongnu.org/xforms/. XForms is free-ware. If you wish you may use any other interface toolkit instead of XForms in an external module. We chose FORMS because it is free and relatively simple.

There is a complete autoconf'ed package `gvemod-xforms-example' available from Geomview's Sourceforge.NET page. geomview-1.9.4/doc/geomview-pt_BR.html/ui_002demotion_002dprogram.html0000644000175000001440000000374510663302002022363 00000000000000 ui-emotion-program - Manual do Geomview

Next: , Previous: ui-center-origin, Up: GCL Reference


7.2.131 ui-emotion-program

(ui-emotion-program PROGRAM)
This is an obsolete command. Use its new eqivalent emodule-define instead.
geomview-1.9.4/doc/geomview-pt_BR.html/figlookatworld.html0000644000175000001440000000011210663302002020521 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/space.html0000644000175000001440000000326610663302002016602 00000000000000 space - Manual do Geomview

Next: , Previous: soft-shader, Up: GCL Reference


7.2.122 space

(space {euclidean|hyperbolic|spherical})
Set the space associated with the world.
geomview-1.9.4/doc/geomview-pt_BR.html/LIST.html0000644000175000001440000000460010663302002016253 00000000000000 LIST - Manual do Geomview

Next: , Previous: INST, Up: Object File Formats


4.2.10 LIST Files

The conventional suffix for a LIST file is .list.

A list of OOGL objetos

Syntax:

     LIST
         oogl-object
         oogl-object
         ...

Note that there's no explicit separation between the oogl-objetos, so they should be enclosed in curly braces ({ }) for sanity. Likewise there's no explicit marker for the end of the list; unless appearing alone in a disk file, the whole construct should also be wrapped in braces, as in:

        { LIST { QUAD ... } { < xyz.quad } }

A LIST with no elements, i.e. { LIST }, is valid, and is the easiest way to create an empty objeto. For example, to remove a symbol's definition you might write

        { define somesymbol  { LIST } }
geomview-1.9.4/doc/geomview-pt_BR.html/Tutorial.html0000644000175000001440000003675110663302002017317 00000000000000 Tutorial - Manual do Geomview

Next: , Previous: Overview, Up: Top


2 Tutorial

Esse capítulo conduzirá você através de alguns usos elementares do Geomview. Trabalhando do começo ao fim desse capítulo de frente a um computador onde você pode tentar acompanhar os exemplos fornecidos aqui você pegará um pouco do que você pode fazer com Geomview.

Para iniciar o Geomview, coloque seu usuário e sua senha no computador e abra uma janela de shell. Uma janela de shell é uma janela na qual você pode digitar comandos Unix; o prompt na janela usualmente termina com um '%'. Na janela de shell (o cursor do mouse deve estar posicionado sobre a janela) digite o seguinte (<Enter> aqui significa pressione a tecla "Enter"):

     geomview tetra dodec <Enter>

Esse comando inicia o geomview e chama dois objetos exemplo, um tetraedro e um dodecaedro. Após poucos segundos três janelas irão aparecer; see Figure.

figs/initial.png

Figure 2.1: Initial Geomview display.

O painel à esquerda é o painel de controle principal do Geomview; Esse painel é chamado de painel Main (principal). O painel menor ao centro é o painel Tools (de ferramentas) e serve para selecionar diferentes tipos de movimentos. A janela do lado direito é a janela de câmera e nessa janela você vê um tetraedro largo e um dodecaedro que está parcialmente obscurecido pelo tetraedro.

Geomview tem alguns painéis mais por padrão ele mostra somente esses três. iremos descrever alguns aspéctos desses três e alguns dos outros nesse tutorial. Você pode ler mais sobre esses e outros painéis nos capítulos adiante neste manual.

Coloque o cursor do mouse na janela de câmera e pressione e mantenha pressionado o botão esquerdo do mouse. Agora, enquanto mantém pressionado o botão, lentamente mova o mouse com movimentos pequenos. Você verá a figura rotacionar na direção na qual você mover o mouse. Se você liberar o botão do mouse enquanto move o mesmo, a figura continua girando. Para parar o movimento de rotação, mantenha o mouse sobre a figura e pressione rapdamente o botão esquerdo do mesmo.

Geomview utiliza o modelo da esfera de vidro para os movimentos iniciados através do mouse. Isso significa que você está supondo o objeto como estando dentro de uma esfera invisível e o cursor do mouse como sendo uma alça fora da esfera provida de uma ventosa. Quando você mantém pressionado o botão esquerdo do mouse, a ventosa da alça gruda na esfera; quando você libera o botão do mouse, a ventosa da alça libera a esfera. Movendo o mouse enquanto mantém pressionado o botão faz com que a esfera (e conceqüêntemente o objeto) mova-se na mesma direção que o mouse.

Adicionalmente para os dois sólidos que estão atualmente na tela você pode também ver duas molduras de fios em forma de caixa na janela de câmera. Essas são as "caixas associadas" dos dois objetos. Por padrão Geomview coloca uma caisa associada em torno de cada objeto que é mostrada de forma que você tenha uma idéia de o quanto grande o objeto é.

Note que quando você move o mouse em torno do tetraedro e do dodecaedro eles se movem como se fossem uma única figura. Isso ocorre porque por padrão o que você está movendo atualmente é o "World" (mundo). Para mover um dos objetos individualmente em lugar de o mundo como um todo, mova o cursor do mouse para o navegador de alvos (Targets) no painel principal (Main). Clique (qualquer botão) sobre a palavra tetra. Isso faz com que o tetraedro seja o "objeto alvo". Agora mova o cursor de volta à janela de câmera e você poderá rotacionar apenas o tetraedro.

O movimento que você aplicou até agora foi a rotação, porque esse é o modo de modo de movimento selecionado no painel de ferramentas (Tools). Para efetuar o movimento de translação em lugar do movimento de rotação, clique sobre o botão translação (Translate). Agora quando você mover o mouse na janela de câmera enquanto mantém pressionado o botão esquerdo, o tetraedro (que deve ser ainda o objeto alvo de antes) irá ser transladado na direção que você move o mouse. Note que você pode transladas o tetraedro na direção da borda da janela enquanto você mantém pressionado o botão esquerdo do mouse. Se você liberar o botão do mouse enquanto move o mesmo, o tetraedro irá continuar o movimento sozinho. O tetraedro mover-se-á ao contrário do que ocorria antes muito rapidamente de forma que é muito fácil perder o rastro de onde ele se encontra.

Se você acidentalmente perder o tetraedro através de translação para muito longe da visão da janela, você pode pegá-lo de vlta através de um clique sobre o botão Centro (Center) no painel de ferramentas (Tools). Isso fará com que o tetraedro retorne para a sua posição inicial.

Clique sobre o botão Centro (Center) para trazer o tetraedro ao centro da janela de câmera, e então coloque-o em uma posição de forma que você possa ver completamente o dodecaedro.

Seu mundo agora tem dois objetos que estão um ao lado do outro. Você pode ver o dodecaedro no meio da janela de câmera e pode ver parte do tetraedro parcialmente fora da janela de câmera. Volte para o navegador de alvos (Targets) no painel principal (Main) e clique sobre o "World" para selecionar o referido mundo novamente. Agora clique sobre o botão "Olhar Para" (Look At) no painel de ferramentas (Tools). Você pode ver o dodecaedro e o tetraedro ajustando-se ao meio da janela (figura see figlookatworld). O botão "Olhar Para" (Look At) posiciona a câmera em uma posição tal que o objeto alvo fique centrado na janela.

figs/fig2.png

Figure 2.2: Olhando para o Mundo.

Agora coloque o cursor sobre o meio do dodecaedro e dê sobre ele um duplo clique com o botão direito do mouse. Isso significa clicar no mouse para baixo e para cima duas vezes em uma rápida sucessão. Note que o dodecaedro torna-se o objeto alvo; você pode ver isso no navegador de alvos (Targets) do painel principal (Main). Um duplo clique no botão direito do mouse sobre um objeto é outra forma de fazer esse objeto tornar-se o objeto alvo.
figs/ap.png

Figure 2.3: A Painel Aparência.

Vá para o menu Inspect no topo do painel principal (Main) e selecione Aparência (Appearance). Isso faz aparecer o painel "Aparência" (Appearance). Quando ele aparece, se estiver parcialmente obscurecido por outra janela do Geomview você pode movê-lo para um lado arrastando sua moldura com o botão do meio do mouse pressionado.

O painel Aparência (Appearance) permite a você controlar várias coisas sobre a maneira como o Geomview desenha objetos. Note os botões rotulados com [af] Faces e [ae] Edges (arestas). Clique sobre o [ae] Edges uma vez, e note que Geomview está agora ressalta/destaca as arestas do dodecaedro. Clique sobre o [ae] Edges novamente e as arestas desaparecem. Clique muitas vezes e assista as arestas indo e voltando. Quando você tiver feito isso o suficiente, deixe as arestas habilitadas e clique sobre o botão [af] Faces. Essa ação alterna entre exibir ou não as faces. Clique sobre o botão novamente para de forma que a exibição das face fique habilitada.

Agora clique sobre o botão [Cf] Faces sob a palavra COLOR. Um painel de escolha de cores aparecerá (see Figure).

figs/color.png

Figure 2.4: Painel de Escolha de Cores.

Note os três botões deslizantes, H, S, e V, controlando a matiz (hue), saturação, e valor (iluminação). Clicando sobre o botão HSV fornece um diferente conjunto de botões deslizantes, um para vermelho (red), outro para verde (green), e outro para azul ( blue). Valores numéricos para ambos os sistemas de cores RGB e HSV podem ser vistos ou editados na parte inferior do painel. A cor iinicial do dodecaedro foi especificada no arquivo dodec que você chamou quando iniciamos o Geomview. A cor que você especificou com o painel de cores sobrescreveu as cores antigas. Você pode ajustar a intensidade da cor com o botão deslizante Intensity. Quando você encontrar uma cor que você gosta, clique sobre o botão Done.

Agora coloque o cursor do mouse em algum lugar sobre sobre o fundo cinza da janela de câmera e duplo-clique no botão direito; isso seleciona "World" como objeto alvo. Clique no botão Look At para para olhar para o mundo novamente.

Note que no painel de Aparência (Appearance) as escolhas dos botões se modificavam à medida que o lado esquerdo também mudava com o dodecaedro. Isso ocoore porque o painel Appearance sempre mostra as escolhas para o objeto alvo, que agora é o mundo, o qual ainda tem suas escolhas padrão.

Clique sobre o botão [ab] BBox sob a palavra Draw. A caixa associada desaparece. agora pona o cursor de volta na janela de câmera. No teclado, digite as teclas a b. Note que a caixa associada aparece novamente. a b é o atalho de teclado para o botão que alterna entre a exibição ou não da caixa associada; a seqüência de caracteres "[ab]" aparece sobre o botão para indicar isso. A maioria dos botões do Geomview possuem atalhos de teclado que você pode usar se preferir. Isso será últil quando você estiver familiarizado com o Geomview e não quiser ter de se mover entre uma montanha de painéis.

Agora selecione o tetraedro, use qualquer das duas formas: duplo-clicando o botão direito do mouse sobre o tetraedro, ou selecionando "tetra" no navegador de alvos (Targets). Então clique sobre o botão Delete do menu Edit no painel principal (Main). O tetraedro deve desaparecer. Essa é a forma de você se livrar de um objeto.

Você pode também chamar objetos de dentro do Geomview. Clique sobre o menu File no painel principal (Main) e escolha abrir (Open). O painel de arquivos (Files) irá aparecer. Abaixo do meio desse painel, onde se lê Path List, temos um navegador com três linhas detro dele; a segunda linha é um diretório com montanhas de exemplos do Geomview dentro dele. Clique sobre aquela segunda linha; see Figure. Role para baixo na lista de arquivos até você ver tref.off. Clique sobre aquela linha, e então clique sobre o botão OK. Um grande tubo em forma de trevo irá aparecer em sua janela. Clique sobre o botão Hide no painel Files para dispensar o painel.

figs/secondlinelist.png

Figure 2.5: O Painel de Arquivos.

Agora clique sobre o botão Reset no painel de ferramentas (Tools). Isso fará com que todas as figuras rtornem ao centro da janela de câmera. Você pode ver um dodecaedro e uma protuberância do trevo (see Figure).

Brinque com a protuberância do trevo e o dodecaedro. Faça experiências com alguns outros botões no painel de ferramentas (Tools). Tente colorir o trevo com o painel de aparência (Appearance).

Para um tutorial sobre criar seus próprios objetos para chamá-los dentro do Geomview, veja doc/oogltour distribuido com Geomview. As coisas naquele arquivo irão ser incorporadas em futuras versões desse manual.

figs/trefdodecinter.png

Figure 2.6: Trevo e Dodecaedro.

geomview-1.9.4/doc/geomview-pt_BR.html/sgi.html0000644000175000001440000000322410663302002016263 00000000000000 sgi - Manual do Geomview

Next: , Previous: setenv, Up: GCL Reference


7.2.116 sgi

(sgi)
Returns t if running on an sgi machine, nil if not. A relict from the old work-station years.
geomview-1.9.4/doc/geomview-pt_BR.html/Interface.html0000644000175000001440000000644210663302002017406 00000000000000 Interface - Manual do Geomview

Next: , Previous: Modules, Up: Modules


6.1 How External Modules Interface with Geomview

External modules appear in the Modules browser in Geomview's Main panel. To run a module, clique the botão esquerdo do mouse on the module's entry in the browser. While the module is running, an additional line for that module will appear in red in the browser. This line begins with a number in brackets, which indicates the instace number of the module. (For some modules it makes sense to have more than one instance of the module running at the same time.) You can kill an external module by clicando on its red instance entry.

By default when Geomview starts, it displays all the modules that have been installed on your system.

For instructions on installing a module on your system so that it will appear in the Modules browser every time Geomview is run by anyone on your system, See Module Installation.

When Geomview invokes an external module, it creates pipes connected to the module's standard input and output. (Pipes are like files except they are used for communication between programs rather than for storing things on a disk.) Geomview interprets anything that the module writes to its standard output as a GCL command. Likewise, if the external module requests any data from Geomview, Geomview writes that data to the module's standard input. Thus all a module has to do in order to communicate with Geomview is write commands to standard output and (optionally) receive data on standard input. Note that this means that the module cannot use standard input and output for communicating with the user. If a module needs to communicate with the user it can do so either through a control panel of its own or else by responding to certain events that it finds out about from Geomview. geomview-1.9.4/doc/geomview-pt_BR.html/clock.html0000644000175000001440000000341610663302002016577 00000000000000 clock - Manual do Geomview

Next: , Previous: cdr, Up: GCL Reference


7.2.21 clock

(clock)
Returns the current time, in seconds, as shown by this stream's clock. See (set-clock ...). See (sleep-until ...).
geomview-1.9.4/doc/geomview-pt_BR.html/COMMENT.html0000644000175000001440000000610310663302002016602 00000000000000 COMMENT - Manual do Geomview

Previous: DISCGRP, Up: Object File Formats


4.2.14 COMMENT Objects

The COMMENT objeto is a mechanism for encoding arbitrary data within an OOGL objeto. It can be used to keep track of data or pass data back and forth between external modules.

Syntax:

     COMMENT                 # key word
     
     name type   # individual name and type specifier
     { ... }             # arbitrary data

The data, which must be enclosed by curly braces, can include anything except unbalanced curly braces. The type field can be used to identify data of interest to a particular program through naming conventions.

COMMENT objetos are intended to be associated with other objetos through inclusion in a LIST objeto. (See LIST.) The "#" OOGL comment syntax does not suffice for data exchange since these comments are stripped when an OOGL objeto is read in to Geomview. The COMMENT objeto is preserved when loaded into Geomview and is written out intact.

Here is an example associating a WorldWide Web URL with a piece of geometry:

     { LIST
      { < Tetrahedron}
      {COMMENT GCHomepage HREF { http://www.geomview.org/ }}
     }

A binary COMMENT format is accepted. Its format is not consistent with the other OOGL binary formats. See Binary format. The name and type are followed by

     N Byte1 Byte2 ... ByteN

instead of data enclosed in curly braces. geomview-1.9.4/doc/geomview-pt_BR.html/rib_002dsnapshot.html0000644000175000001440000000361610663302002020567 00000000000000 rib-snapshot - Manual do Geomview

Next: , Previous: rib-display, Up: GCL Reference


7.2.107 rib-snapshot

(rib-snapshot CAM-ID [filename])
Write Renderman snapshot (in RIB format) of CAM-ID to <filename>. If no filename specified, see (rib-display ... for an explanation of the filename used.
geomview-1.9.4/doc/geomview-pt_BR.html/OOGL-File-Formats.html0000644000175000001440000000456210663302002020535 00000000000000 OOGL File Formats - Manual do Geomview

Next: , Previous: Interaction, Up: Top


4 OOGL File Formats

The objetos that you can load into Geomview are called OOGL objetos. OOGL stands for “Objeto Oriented Graphics Library”; it is the library upon which Geomview is built.

There are many different kinds of OOGL objetos. This chapter gives syntactic descriptions of file formats for OOGL objetos.

Examples of most file types live in Geomview's data/geom directory.

geomview-1.9.4/doc/geomview-pt_BR.html/Remote-Display.html0000644000175000001440000000436610663302002020347 00000000000000 Remote Display - Manual do Geomview

Next: , Previous: RenderMan, Up: Mathematica


9.4 Using Geomview and Mathematica on Different Computers

It is possible to use Geomview to display graphics generated by Mathematica running on a different computer. If you want to use Mathematica on a computer that is not networked with your Geomview computer, you can write out chunk files in Mathematica which you transfer to the Geomview computer and then translate to OOGL format for displaying in Geomview.

geomview-1.9.4/doc/geomview-pt_BR.html/new_002dalien.html0000644000175000001440000000441310663302002020031 00000000000000 new-alien - Manual do Geomview

Next: , Previous: ND-xform-set, Up: GCL Reference


7.2.80 new-alien

(new-alien name [GEOMETRY])
Create a new alien (geom not in the world) with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new alien is given an empty geometry. If an objeto with that name already exists, the new alien is given a unique name. The light beams that are used to move around the lights are an example of aliens. They're drawn but are not controllable the way ordinary objetos are: they don't appear in the objeto browser and the user can't move them with the normal movimento modes.
geomview-1.9.4/doc/geomview-pt_BR.html/MESH.html0000644000175000001440000001147110663302002016240 00000000000000 MESH - Manual do Geomview

Next: , Previous: QUAD, Up: Object File Formats


4.2.2 MESH: rectangularly-connected mesh

The conventional suffix for a MESH file is .mesh.

The file syntax is

     [U][C][N][Z][4][u][v][n]MESH # Key word
     [Ndim]                 # Space dimension, present only if nMESH
     Nu Nv            # Mesh grid dimensions
                                  # Nu*Nv vertices, in format specified
                                  # by initial key word
     vertex(u=0,v=0)  vertex(1,0)  ... vertex(Nu-1,0)
     vertex(0,1) ...    vertex(Nu-1,1)
     ...
     vertex(0,Nv-1) ... vertex(Nu-1,Nv-1)

The key word is [U][C][N][Z][4][u][v][n]MESH. The optional prefix characters mean:

`U'
Each vertex includes a 3-component texture space parameter. The first two components are the usual S and T texture parameters for that vertex; the third should be specified as zero.
`C'
Each vertex (see Vertices above) includes a 4-component color.
`N'
Each vertex includes a surface normal vector.
`Z'
Of the 3 vertex position values, only the Z component is present; X and Y are omitted, and assumed to equal the mesh (u,v) coordinate so X ranges from 0 .. (Nu-1), Y from 0 .. (Nv-1) where Nu and Nv are the mesh dimensions – see below.
`4'
Vertices are 4D, each consists of 4 floating values. Z and 4 cannot both be present.
`u'
The mesh is wrapped in the u-direction, so the (0,v)'th vertex is connected to the (Nu-1,v)'th for all v.
`v'
The mesh is wrapped in the v-direction, so the (u,0)'th vertex is connected to the (u,Nv-1)'th for all u. Thus a u-wrapped or v-wrapped mesh is topologically a cylinder, while a uv-wrapped mesh is a torus.
`n'
Specifies a mesh whose vertices live in a higher dimensional space. The dimension follows the "MESH" keyword. Each vertex then has Ndim components.

Note that the order of prefix characters is significant; a colored, u-wrapped mesh is a CuMESH not a uCMESH.

Following the mesh header are integers Nu and Nv, the dimensions of the mesh.

Then follow Nu*Nv vertices, each in the form given by the header. They appear in v-major order, i.e. if we name each vertex by (u,v) then the vertices appear in the order

     (0,0) (1,0) (2,0) (3,0) ...  (Nu-1,0)
     (0,1) (1,1) (2,1) (3,1) ...  (Nu-1,1)
     ...
     (0,Nv-1)		...  (Nu-1,Nv-1)

A MESH BINARY format is accepted; See Binary format. The values of Nu and Nv are 32-bit integers; all other values are 32-bit floats. geomview-1.9.4/doc/geomview-pt_BR.html/Customization.html0000644000175000001440000001027210663302002020352 00000000000000 Customization - Manual do Geomview

Next: , Previous: OOGL File Formats, Up: Top


5 Customization: .geomview files

When Geomview is started, it loads and executes commands in a system-wide startup file named .geomview. This file is in the data subdirectory of the Geomview distribution directory and contains GCL commands to configure Geomview in a way common to all users on the system.

Next, Geomview looks for the file ~/.geomview (~ stands for your home directory). You can use this to configure your own default Geomview behavior to suit your tastes.

After reading ~/.geomview, Geomview looks for a file named .geomview in the current directory. If such a file exists Geomview reads it, unless it is the same as ~/.geomview (which would be the case if you are running Geomview from your home directory). You can use the current directory's .geomview to create a Geomview customization specific to a certain project.

You can use .geomview files to control all kinds of things about Geomview. They can contain any valid GCL statements. Especially useful is the ui-panel command which controls the initial placement of Geomview's panels. For an example see the system-wide .geomview file mentioned above. See GCL. See (ui-panel ...).

It is a good idea to enclose all the commands you put in a .geomview file in a progn statement in order to cause Geomview to execute them all at once. Otherwise Geomview might execute them sequentially over the first few refresh cycles after starting up.

To change, e.g. the focus policy of the janela de câmera such that they pick up the focus policy of the window manager (instead of being activated when the mouse cursor crosses the window), you could put the following in your ~/.geomview file:

     (progn
       (ui-cam-focus focus-change)
       ... # other stuff
     )

You can put any valid GCL command into your .geomview files,see GCL. See (progn ...). See (ui-cam-focus ...). geomview-1.9.4/doc/geomview-pt_BR.html/help.html0000644000175000001440000000473110663302002016435 00000000000000 help - Manual do Geomview

Next: , Previous: gt, Up: GCL Reference


7.2.5 ?

(? [command])
Gives one-line usage summary for command. Command may include *s as wildcards; see also (?? ...). One-line command help; lists names only if multiple commands match. ? is a synonym for (help ...)

Next: , Previous: hdelete, Up: GCL Reference


7.2.54 help

(help [command])
Command may include *s as wildcards; see also (?? ...) One-line command help; lists names only if multiple commands match.
geomview-1.9.4/doc/geomview-pt_BR.html/cdr.html0000644000175000001440000000311610663302002016251 00000000000000 cdr - Manual do Geomview

Next: , Previous: car, Up: GCL Reference


7.2.20 cdr

(cdr LIST)
returns the list obtained by removing the first element of LIST.
geomview-1.9.4/doc/geomview-pt_BR.html/Package-Details.html0000644000175000001440000000623010663302002020417 00000000000000 Package Details - Manual do Geomview

9.5 Details of the Mathematica->Geomview Package

The OOGL.m package uses the external program math2oogl to convert Graphics3D objetos to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica.

The converter will sometimes handle colored SurfaceGraphics objetos correctly that Mathematica does not handle correctly, which means that Geomview[objeto] sometimes works where Show[objeto] will give errors.

The converter supports the Polygon, Line, and Point graphics primitives, RGBColor Graphics3D directives, and SurfaceGraphics objetos with or without RGBColor directives, and lists of any combination of these. It silently ignores all other directives.

The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib).

In the WriteOOGL and WriteRIb commands, filename can either be a string containing a filename, an OutputStream objeto, or a string starting with a ! to send the output to a command. Objeto can be a Graphics3D objeto, a SurfaceGraphics objeto, or a list of these.

The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host. geomview-1.9.4/doc/geomview-pt_BR.html/look_002dencompass_002dsize.html0000644000175000001440000000436110663302002022526 00000000000000 look-encompass-size - Manual do Geomview

Next: , Previous: look-encompass, Up: GCL Reference


7.2.66 look-encompass-size

(look-encompass-size [view-fraction clip-ratio near-margin far-margin])
Sets/returns parameters used by (look-encompass). view-fraction is the portion of the janela de câmera filled by the objeto, clip-ratio is the max allowed ratio of near-to-far clipping planes. The near clipping plane is 1/near-margin times closer than the near edge of the objeto, and the far clipping plane is far-margin times further away. Returns the list of current values. Defaults: .75 100 0.1 4.0
geomview-1.9.4/doc/geomview-pt_BR.html/figap.html0000644000175000001440000000011110663302002016557 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/read.html0000644000175000001440000000442610663302002016421 00000000000000 read - Manual do Geomview

Next: , Previous: rawpick, Up: GCL Reference


7.2.100 read

(read {geometry|camera|appearance|image|ntransform|transform|command} {GEOMETRY or CAMERA or ...})
Read and interpret the text in ... as containing the given type of data. Useful for defining objetos using OOGL reference syntax, e.g.
          (geometry  thing { INST  transform : T    geom : fred })
          (read  geometry  { define fred
             QUAD
             1 0 0  0 1 0  0 0 1  1 0 0
          })
          (read  transform { define T <myfile})
     

See References. See (hdefine ...). See (hdelete ...).

geomview-1.9.4/doc/geomview-pt_BR.html/Texture-Mapping.html0000644000175000001440000001670510663302002020542 00000000000000 Texture Mapping - Manual do Geomview

Previous: Appearances, Up: Conventions


4.1.11 Texture Mapping

Some rendering back-ends support texture-mapped objetos, actually only the OpenGL and the RenderMan interface at the time of this writing. There are also some issues with the RMan interface when using an alpha-channel in the texture image. Those rendering back-ends which don't support texturing silently ignore attempts to use texture mapping. A texture is specified as part of an appearance structure (see Appearances). Briefly, one provides a texture image (see Image objects), which is considered to lie in a square in (s,t) parameter space in the range 0 <= s <= 1, 0 <= t <= 1. Then one provides a geometric primitive, with each vertex tagged with (s,t) texture coordinates. If texturing is enabled, the appropriate portion of the texture image is pasted onto each face of the textured objeto.

There is (currently) no provision for inheritance of part of a texture structure; if the texture keyword is mentioned in an appearance, it supplants any other texture specification.

The appearance attribute texturing controls whether textures are used; there's no performance penalty for having texture { ... } fields defined when texturing is off.

The available fields are:

     clamp   none  -or-  s  -or-  t  -or-  st
       Determines the meaning of texture coordinates outside the range 0..1.
       With clamp none, the default, coordinates are interpreted
       modulo 1, so (s,t) = (1.25,0), (.25,0), and (-.75,0) all refer to
       the same point in texture space.  With s or t or
       st, either or both of s- or t-coordinates less than 0 or
       greater than 1 are clamped to 1 or 0, respectively.
     
     image { <image specification> (see Image objects) }
       Specify the actual texture image. Images can have 1, 2, 3 or 4 channels:
         1 channel:  luminance
         2 channels: luminance and alpha
         3 channels: RGB data
         4 channels: RGBA data
     
       See Image objects, for the actual definition of image
       objetos. The alpha-channel is only interpreted as mask: where the mask
       is zero, pixels are simply not drawn. An exception is the case where
       apply is equal to modulate and translucency is enabled:
       in this case the resulting alpha value is the result of the
       multiplication of the surface color with the alpha value of the
       texture's alpha channel.
     
     file      filename
     alphafile filename
       This is considered obsolete, and only kept for compatibility,
       the modern way is to use the new OOGL image objeto. See Image objects.
       The stuff documented here should still work, though
     
       Specifies image file(s) containing the texture.
     
       The file keyword specifies a file with color or lightness information;
       alphafile if present, specifies a transparency ("alpha") mask;
       where the mask is zero, pixels are simply not drawn.
       Several image file formats are available; the file type must be
       indicated by the last few characters of the file name:
         .ppm or .ppm.Z or .ppm.gz  24-bit 3-color image in PPM format
         .pgm or .pgm.Z or .pgm.gz  8-bit grayscale image in PGM format
         .sgi or .sgi.Z or .sgi.gz  8-bit, 24-bit, or 32-bit SGI image
         .tiff                      8-bit or 24-bit TIFF image
         .gif                       GIF image
       For this feature to work, some programs must be available in
       geomview's search path:
         zcat  for .Z files
         gzip  for .gz files
         tifftopnm for .tiff files
         giftoppm for .gif files
     
       If an alphafile image is supplied, it must be the same size
       as the file image.
     
       Image objetos provide a more flexible way to specify texture
       data. See Image objects.
     
     apply   modulate  -or-  blend  -or-  decal
       Indicates how the texture image is applied to the surface.
       Here the "surface color" means the color that surface would have
       in the absence of texture mapping.
     
       With modulate, the default, the texture color (or lightness,
       if textured by a gray-scale image) is multiplied by the surface color.
     
       With blend, texture blends between the background color
       and the surface color.  The file parameter must specify a
       gray-scale image.  Where the texture image is 0, the surface color is
       unaffected; where it's 1, the surface is painted in the color given
       by background; and color is interpolated for intermediate values.
     
       With decal, the file parameter must specify a
       3-color image.  If an alphafile parameter is present,
       its value interpolates between the surface color (where alpha=0)
       and the texture color (where alpha=1).  Lighting does not affect the
       texture color in decal mode; effectively the texture is
       constant-shaded.
     
     background  R G B A
       Specifies a 4-component color, with R, G, B, and A floating-point
       numbers normally in the range 0..1, used when apply blend
       is selected.
     
     transform transformation-matrix
       Expects a list of 16 numbers, or one of the other ways of representing
       a transformation (: handlename or < filename).
       The 4x4 transformation matrix is applied to texture coordinates,
       in the sense of a 4-component row vector (s,t,0,1) multiplied on
       the left of the matrix, to produce new coordinates (s',t')
       which actually index the texture.
geomview-1.9.4/doc/geomview-pt_BR.html/Transformation-matrices.html0000644000175000001440000000470210663302002022316 00000000000000 Transformation matrices - Manual do Geomview

4.1.6 Transformation matrices

Some objetos incorporate 4x4 real matrices for homogeneous objeto transformations. These matrices act by multiplication on the right of vectors. Thus, if p is a 4-element row vector representing homogeneous coordinates of a point in the OOGL objeto, and A is the 4x4 matrix, then the transformed point is p' = p A. This matrix convention is common in computer graphics; it's the transpose of that often used in mathematics, where points are column vectors multiplied on the right of matrices.

Thus for Euclidean transformations, the translation components appear in the fourth row (last four elements) of A. A's last column (4th, 8th, 12th and 16th elements) are typically 0, 0, 0, and 1 respectively. geomview-1.9.4/doc/geomview-pt_BR.html/ND_002dcolor.html0000644000175000001440000000550010663302002017565 00000000000000 ND-color - Manual do Geomview

Next: , Previous: ND-axes, Up: GCL Reference


7.2.76 ND-color

(ND-color CAMID
[ (( [ID] (x1 x2 ... xN) v r g b a v r g b a ... ) ((x1 ... xN) v r g b a v r g b a ...) ...)] ) Specifies a function, applied to each N-D vertex, which determines the colors of N-dimensional objetos as shown in camera CAMID. Each coloring function is defined by a vector (in ID's coordinate system) [x1 ... xN] and by a sequence of value (v)/color(r g b a) tuples, ordered by increasing v. The inner product v = P.[x] is linearly interpolated in this table to give a color. If ID is omitted, the (xi) vector is assumed in universe coordinates. The ND-color command specifies a list of such functions; each vertex is colored by their sum (so e.g. green intensity could indicate projection along one axis while red indicated another. An empty list, as in (ND-color CAMID ()), suppresses coloring. With no second argument, (ND-color CAMID) returns that camera's color-function list. Even when coloring is enabled, objetos tagged with the keepcolor appearance attribute are shown in their natural colors.
geomview-1.9.4/doc/geomview-pt_BR.html/VECT.html0000644000175000001440000001144310663302002016244 00000000000000 VECT - Manual do Geomview

Next: , Previous: OFF, Up: Object File Formats


4.2.6 VECT Files

The conventional suffix for VECT files is .vect.

Syntax:

     [4]VECT
     NPolylines  NVertices  NColors
     
     Nv[0] ... Nv[NPolylines-1]     # number of vertices
                                                # in each polyline
     
     Nc[0] ... Nc[NPolylines-1]     # number of colors supplied
                                                # in each polyline
     
     Vert[0] ... Vert[NVertices-1]  # All the vertices
                                                # (3*NVertices floats)
     
     Color[0] ... Color[NColors-1]  # All the colors
                                                # (4*NColors floats, RGBA)

VECT objetos represent lists of polylines (strings of connected line segments, possibly closed). A degenerate polyline can be used to represent a point.

A VECT file begins with the key word VECT or 4VECT and three integers: NLines, NVertices, and NColors. Here NLines is the number of polylines in the file, NVertices the total number of vertices, and NColors the number of colors as explained below.

Next come NLines 16-bit integers

Nv[0] Nv[1] Nv[2] ... Nv[NLines-1]

giving the number of vertices in each polyline. A negative number indicates a closed polyline; 1 denotes a single-pixel point. The sum (of absolute values) of the Nv[i] must equal NVertices.

Next come NLines more 16-bit integers Nc[i]: the number of colors in each polyline. Normally one of three values:

0
No color is specified for this polyline. It's drawn in the same color as the previous polyline.
1
A single color is specified. The entire polyline is drawn in that color.
abs(Nv[i])
Each vertex has a color. Either each segment is drawn in the corresponding color, or the colors are smoothly interpolated along the line segments, depending on the implementation.

Next come NVertices groups of 3 or 4 floating-point numbers: the coordinates of all the vertices. If the keyword is 4VECT then there are 4 values per vertex. The first abs(Nv[0]) of them form the first polyline, the next abs(Nv[1]) form the second and so on.

Finally NColors groups of 4 floating-point numbers give red, green, blue and alpha (opacity) values. The first Nc[0] of them apply to the first polyline, and so on.

A VECT BINARY format is accepted; see Binary format. The binary format exactly follows the ASCII format, with 32-bit Big-Endian integers where ordinary integer numbers appear, and with 16-bit Big-Endian integers where 16-bit integers appear; 32-bit Big-Endian floats where real values appear. BIG FAT NOTE: The vertex counts Nv[i] and the color counts Nc[i] are 16-bit Big-Endian integers. geomview-1.9.4/doc/geomview-pt_BR.html/set_002dclock.html0000644000175000001440000000374110663302002020041 00000000000000 set-clock - Manual do Geomview

Next: , Previous: scene, Up: GCL Reference


7.2.110 set-clock

(set-clock TIME)
Adjusts the clock for this command stream to read TIME (in seconds) as of the moment the command is received. See (sleep-until ...). See (clock ...).
geomview-1.9.4/doc/geomview-pt_BR.html/INST-Examples.html0000644000175000001440000000467610663302002020046 00000000000000 INST Examples - Manual do Geomview

Previous: INST, Up: INST


4.2.9.1 INST Examples

Here are some examples of INST files

     INST
          unit < xyz.vect
          transform {
             1 0 0 0
             0 1 0 0
             0 0 1 0
             1 3 0 1
          }
     { appearance { +edge  material { edgecolor 1 1 0 } }
         INST geom < mysurface.quad }
     {INST transform {: T} geom {<dodec.off}}
     { INST
          transforms
              { LIST
          	{ < some-matrices.prj }
          	{ < others.prj }
          	{ TLIST <still more of them> }
     
              }
          geom
              { # stuff replicated by all the above matrices
          	...
              }
     }

This one resembles the origin example in the section above, but makes the X and Y edges be 1/4 the size of the window (1/4, not 1/2, since the range of ndc X and Y coordinates is -1 to +1).

     { INST
       location ndc
       geom { < xyz.vect }
       transform { .5 0 0 0  0 .5 0 0  0 0 -.009 0   0 0 -.99 1 }
     }
geomview-1.9.4/doc/geomview-pt_BR.html/figloadpanel.html0000644000175000001440000000010710663302002020123 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/figcolorchooserpanel.html0000644000175000001440000000013010663302002021701 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/Conventions.html0000644000175000001440000000601410663302002020006 00000000000000 Conventions - Manual do Geomview

4.1 Conventions

geomview-1.9.4/doc/geomview-pt_BR.html/uninterest.html0000644000175000001440000000345410663302002017706 00000000000000 uninterest - Manual do Geomview

Next: , Previous: ui-target, Up: GCL Reference


7.2.139 uninterest

(uninterest (COMMAND [args]))
Undoes the effect of an interest command. (COMMAND [args]) must be identical to those used in the interest command.
geomview-1.9.4/doc/geomview-pt_BR.html/Point-of-Interest.html0000644000175000001440000001132410663302002020767 00000000000000 Point of Interest - Manual do Geomview

Previous: Mouse Motions, Up: Mouse Motions


3.5.1 Selecting a Point of Interest

It is sometimes useful to specify a particular point on some objeto in a geomview window as the center point for mouse movimentos. You can do this by shift-clicando the botão direito do mouse (i.e. clique it once while holding down the shift key on the keyboard) with the cursor over the desired point. This point then becomes the point of interest. The point of interest must be on an existing objeto.

Selecting a point of interest simplifies examining a small portion of a larger objeto. Shift-right-clique sobre o an interesting point, and select Orbit mode. Use the botã do meio do mouse to approach, and the left mouse to orbit the point, examining the region from different directions.

When you have selected a point of interest, the current objeto do centro changes to an objeto named "CENTER", which is an invisible objeto located at the point of interest. In addition, mouse movimentos for the window in which you made the selection are adjusted so that the point of interest follows the mouse.

You can change the point of interest at any time by selecting a new one by shift-clicando the botão direito do mouse again. You can cancel the point of interest altogether by shift-clicando the right botão do mouse with the cursor on the background (i.e. not on any objeto). This changes the objeto do centro back to its default value, "target".

The objeto named "CENTER", which serves as the objeto do centro for the point of interest, is a special kind of geom called an "alien". It does not appear in the Targets browser. By default it has no geometry associated with it and hence is invisible. You can, however, explicitly give it some geometry using a GCL command, causing it to appear. Use the geometry command for this: (geometry CENTER geometry), where geometry is any valid geometry. For example, (geometry CENTER { < xyz.vect }) causes the file xyz.vect, which is one of the standard example files distributed with geomview, to be used at the geometry for CENTER. See (geometry ...).

What happens internally when you select a point of interest is that the center is set to the objeto called CENTER, and that objeto is positioned at the point of interest. In addition, in order for mouse movimentos to track the point of interest, the current camera's focal length is set to be the distance from the câmera to the point of interest. You can accomplish this via GCL with the following commands:

     (if (real-id CENTER) nil (new-alien CENTER {}))
     (ui-center CENTER)
     (transform-set CENTER universe universe translate x y z)
     (merge camera cam-id { focus d })

where (x,y,z) are the (universe) coordinates of the point of interest, and d is the distance from that point to the current camera, cam-id. The first command above creates the "alien" CENTER if it does not yet exist. geomview-1.9.4/doc/geomview-pt_BR.html/load_002dpath.html0000644000175000001440000000356210663302002020027 00000000000000 load-path - Manual do Geomview

Next: , Previous: load, Up: GCL Reference


7.2.63 load-path

(load-path)
Returns the current search path for command, geometry, etc. files. Note: to actually see the value returned by this function you should wrap it in a call to echo: (echo (load-path)). See (set-load-path ...).
geomview-1.9.4/doc/geomview-pt_BR.html/and.html0000644000175000001440000000333410663302002016245 00000000000000 and - Manual do Geomview

Next: , Previous: all, Up: GCL Reference


7.2.9 and

(and EXPR1 EXPR2)
Evaluate EXPR1 and EXPR2 and return t if both return non-nil, otherwise return nil.
geomview-1.9.4/doc/geomview-pt_BR.html/transform.html0000644000175000001440000001546410663302002017525 00000000000000 transform - Manual do Geomview

Next: , Previous: image, Up: Non-geometric objects


4.3.3 Transform Objects

Where a single 4x4 matrix is expected – as in the INST transform field, the camera's camtoworld transform and the Geomview xform* commands – use a transform objeto.

Note that a transform is distinct from a TLIST, which is a type of geometry. TLISTs can contain one or more 4x4 transformations; "transform" objetos must have exactly one.

Why have both? In many places – e.g. câmera positioning – it's only meaningful to have a single transform. Using a separate objeto type enforces this.

Syntax for a transform objeto is

     <transform> ::=
       [ "{" ]             (curly brace, generally needed to make
                            the end of the objeto unambiguous.)
     
        [ "transform" ]    (optional keyword; unnecessary if the type
                            is determined by the context, which it
                            usually is.)
        [ "define" <name> ]
                           (defines a transform named <name>, setting
                            its value from the stuff which follows)
     
           <sixteen floating-point numbers>
                           (interpreted as a 4x4 homogeneous transform
     		       given row by row, intended to apply to a
                            row vector multiplied on its LEFT, so that e.g.
                            Euclidean translations appear in the bottom row)
        |
           "<" <filename>  (meaning: read transform from that file)
        |
           ":" <name>      (meaning: use variable <name>,
                             defined elsewhere; if undefined the initial
                             value is the identity transform)
     
      [ "}" ]              (matching curly brace)

The whole should be enclosed in { braces }. Braces are not essential if exactly one of the above items is present, so e.g. a 4x4 array of floats standing alone may but needn't have braces.

Some examples, in contexts where they might be used:

     # Example 1: A GCL command to define a transform
     # called "fred"
     
     (read transform { transform  define fred
              1 0 0 0
              0 1 0 0
              0 0 1 0
             -3 0 1 1
         }
     )
     # Example 2:  A camera objeto using transform
     # "fred" for camera positioning
     # Given the definition above, this puts the camera at
     # (-3, 0, 1), looking toward -Z.
     
     { camera
             halfyfield 1
             aspect 1.33
             camtoworld { : fred }
     }

Next: , Previous: time-interests, Up: GCL Reference


7.2.125 transform

(transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [bbox-center|origin] [dt [smooth]])
Apply a movimento (rotation, translation, scaling) to objeto objectID; that is, construct and concatenate a transformation matrix with objectID's transform The 3 IDs involved are the objeto that moves, the center of movimento, and the frame of reference in which to apply the movimento. The center is easiest understood for rotations: if centerID is the same as objectID then it will spin around its own axes; otherwise the moving objeto will orbit the objeto do centro. Normally frameID, in whose coordinate system the (mouse) movimentos are interpreted, is focus, the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the space command to change spaces. With type rotate x, y, and z are floats specifying angles in RADIANS. For types translate and translate-scaled x, y, and z are floats specifying distances in the coordinate system of the objeto do centro.

The next field is optional and may consist of the keyword bbox-center or the keyword origin and modifies the location of the origin of objectID's co-ordinate frame: bbox-center temporarily translates objectID's co-ordinate frame to the center of objectID's bounding box. origin is the default (and means not to modify objectID's co-ordinate frame) and bbox-center is only valid in Euclidean space.

The optional dt field allows a simple form of animation; if present, the objeto moves by just that amount during approximately dt seconds, then stops. If present and followed by the smooth keyword, the movimento is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the movimento is applied immediately.

geomview-1.9.4/doc/geomview-pt_BR.html/draw.html0000644000175000001440000000332010663302002016433 00000000000000 draw - Manual do Geomview

Next: , Previous: dither, Up: GCL Reference


7.2.30 draw

(draw CAM-ID)
Draw the view in CAM-ID, if it needs redrawing. See (redraw ...).
geomview-1.9.4/doc/geomview-pt_BR.html/xform.html0000644000175000001440000000335610663302002016642 00000000000000 xform - Manual do Geomview

Next: , Previous: write-sexpr, Up: GCL Reference


7.2.148 xform

(xform ID TRANSFORM)
Concatenate TRANSFORM with the current transform of the objeto (apply TRANSFORM to objeto ID).
geomview-1.9.4/doc/geomview-pt_BR.html/SKEL.html0000644000175000001440000001035410663302002016241 00000000000000 SKEL - Manual do Geomview

Next: , Previous: VECT, Up: Object File Formats


4.2.7 SKEL Files

SKEL files represent collections of points and polylines, with shared vertices. The conventional suffix for SKEL files is .skel.

Syntax:

     [C][4][n]SKEL
     [NDim]                    # Vertex dimension, present only if nSKEL
     NVertices  NPolylines
     
     x[0]  y[0]  z[0]  # Vertices
     				    # if 4SKEL, each vertex has 4 components
     				    # if nSKEL, each vertex has NDim components
                                         # if C[4][n]SKEL vertex coordinates are
                                         # followed by an RGBA color specification
     ...
     x[NVertices-1]  y[NVertices-1]  z[NVertices-1]
     
                             # Polylines
                             # Nv = # vertices on this polyline (1 = point)
                             # v[0] ... v[Nv-1]: vertex indices                        #               in range 0..NVertices-1
     Nv  v[0] v[1] ... v[Nv-1]  [colorspec]
     ...
                             # colorspec continues past v[Nv-1]
                             # to end-of-line; may be nothing, or 3 or 4 numbers.
                             # nothing: default color
     			# 3 or 4 floats: RGB[A] values 0..1

The syntax resembles that of OFF files, with a table of vertices followed by a sequence of polyline descriptions, each referring to vertices by index in the table. Each polyline has an optional color.

For nSKEL objetos, each vertex has NDim components. For 4nSKEL objetos, each vertex has NDim+1 components; the final component is the homogeneous divisor.

A [4][n]SKEL BINARY format is accepted; See Binary format. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions.

Exception: each polyline's vertex indices are followed by an integer indicating how many color components accompany it. Polyline color components must be floats, not integer values. Thus a colorless polyline with 3 vertices might be represented as

     int int int int int
     3   17   5   9   0

while the same polyline colored red might be

     int int int int int float float float float
      3  17   5   9   4   1.0   0.0   0.0   1.0
geomview-1.9.4/doc/geomview-pt_BR.html/update.html0000644000175000001440000000343410663302002016766 00000000000000 update - Manual do Geomview

Next: , Previous: uninterest, Up: GCL Reference


7.2.140 update

(update [timestep_in_seconds])
Apply each incremental movimento once. Uses timestep if it's present and nonzero; otherwise movimentos are proportional to elapsed real time.
geomview-1.9.4/doc/geomview-pt_BR.html/xform_002dincr.html0000644000175000001440000000345610663302002020244 00000000000000 xform-incr - Manual do Geomview

Next: , Previous: xform, Up: GCL Reference


7.2.149 xform-incr

(xform-incr ID TRANSFORM)
Apply continual movimento: concatenate TRANSFORM with the current transform of the objeto every refresh (set objeto ID's incremental transform to TRANSFORM).
geomview-1.9.4/doc/geomview-pt_BR.html/look_002drecenter.html0000644000175000001440000000432610663302002020726 00000000000000 look-recenter - Manual do Geomview

Next: , Previous: look-encompass-size, Up: GCL Reference


7.2.67 look-recenter

(look-recenter [objectID] [cameraID])
Translates and rotates the câmera so that it is looking in the -z direction (in objectID's coordinate system) at the center of objectID's bounding box (or the origin of the coordinate system in non-Eudlidean space). In Euclidean space, the câmera is also moved as close as possible to the objeto while allowing the entire objeto to be visible. Also makes sure that the y-axes of objectID and cameraID are parallel.
geomview-1.9.4/doc/geomview-pt_BR.html/pickable.html0000644000175000001440000000340210663302002017251 00000000000000 pickable - Manual do Geomview

Next: , Previous: pick-invisible, Up: GCL Reference


7.2.91 pickable

(pickable GEOM-ID {yes|no})
Say whether or not GEOM-ID is included in the pool of objetos that could be returned from the pick command.
geomview-1.9.4/doc/geomview-pt_BR.html/figsavepanel.html0000644000175000001440000000010610663302002020141 00000000000000 geomview-1.9.4/doc/geomview-pt_BR.html/sleep_002duntil.html0000644000175000001440000000416510663302002020417 00000000000000 sleep-until - Manual do Geomview

Next: , Previous: sleep-for, Up: GCL Reference


7.2.119 sleep-until

(sleep-until TIME)
Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; sleep-until inside progn won't delay execution of the rest of the progn's contents. Time is measured according to this stream's clock, as set by set-clock; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME.
geomview-1.9.4/doc/geomview-pt_BR.html/shell.html0000644000175000001440000000452410663302002016614 00000000000000 shell - Manual do Geomview

Next: , Previous: GCL Reference, Up: GCL Reference


7.2.1 !

!
is a synonym for shell. See shell.

Next: , Previous: sgi, Up: GCL Reference


7.2.117 shell

(shell SHELL-COMMAND)
Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is !.
geomview-1.9.4/doc/geomview-pt_BR.html/Materials-Panel.html0000644000175000001440000000654010663302002020463 00000000000000 Materials Panel - Manual do Geomview

Next: , Previous: Appearance Panel, Up: Appearance


3.6.2 The Materials Panel

The Materials panel controls material properties of surfaces. It works with the objeto alvo in the same way that the Appearance panel does.

figs/mat.png

Figure 3.7: The Materials Panel.

Transparent
This botão determines whether transparency is enabled. Geomview itself does not fully support transparency yet and on some machines it does not work at all. (The missing piece is implementation of a depth-sorting algorithm in the rendering engine; not difficult, but just not done yet.) Use RenderMan if you want real transparency: when transparency is enabled, a RenderMan snapshot will contain the alpha information.
Alpha
This slider determines the opacity/transparency when transparency is enabled. 0 means totally transparent, 1 means totally opaque.
Diffuse Reflectance
This slider controls the diffuse reflectance of a surface. This has to do with how much the surface scatters light that it reflects.
Shininess
This slider controls how shiny a surface is. This determines the size of specular highlights on the surface. Lower values give the surface a duller appearance.
Ambient Reflectance
This slider controls how much of the ambient light a surface reflects.
Specular Reflectance
This slider controls the specular reflectance of a surface. This has to do with how directly the surface reflects light rays. Higher values give brighter specular highlights.
Done
This botão dismisses the Materials panel.
geomview-1.9.4/doc/geomview-pt_BR.html/new_002dgeometry.html0000644000175000001440000000374710663302002020605 00000000000000 new-geometry - Manual do Geomview

Next: , Previous: new-center, Up: GCL Reference


7.2.83 new-geometry

(new-geometry name [GEOMETRY])
Create a new geom with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new objeto is given an empty geometry. If an objeto with that name already exists, the new objeto is given a unique name.
geomview-1.9.4/doc/geomview-pt_BR.html/command.html0000644000175000001440000000327510663302002017125 00000000000000 command - Manual do Geomview

Next: , Previous: clock, Up: GCL Reference


7.2.22 command

(command INFILE [OUTFILE])
Read commands from INFILE; send corresponding responses (e.g. anything written to filename -) to OUTFILE, stdout by default.
geomview-1.9.4/doc/geomview-pt_BR.html/rawevent.html0000644000175000001440000000345110663302002017336 00000000000000 rawevent - Manual do Geomview

Next: , Previous: quote, Up: GCL Reference


7.2.98 rawevent

(rawevent dev val x y t)
Enter the specified raw event into the event queue. The arguments directly specify the members of the event structure used internally by geomview. This is the lowest level event handler and is not intended for general use.
geomview-1.9.4/doc/geomview-pt_BR.html/merge_002dbaseap.html0000644000175000001440000000360410663302002020503 00000000000000 merge-baseap - Manual do Geomview

Next: , Previous: merge-base-ap, Up: GCL Reference


7.2.72 merge-baseap

(merge-baseap APPEARANCE)
Merge in some appearance characteristics to the base default appearance (applied to every geom before its own apperance). Lighting is typically included in the base appearance.
geomview-1.9.4/doc/geomview-pt_BR.html/name_002dobject.html0000644000175000001440000000357410663302002020345 00000000000000 name-object - Manual do Geomview

Next: , Previous: morehelp, Up: GCL Reference


7.2.74 name-object

(name-object ID NAME)
Assign a new NAME (a string) to ID. A number is appended if that name is in use (for example, foo -> foo<2>). The new name, possibly with number appended, may be used as objeto's id thereafter.
geomview-1.9.4/doc/geomview-pt_BR.html/geometry.html0000644000175000001440000000363610663302002017343 00000000000000 geometry - Manual do Geomview

Next: , Previous: freeze, Up: GCL Reference


7.2.50 geometry

(geometry GEOM-ID [GEOMETRY])
Specify the geometry for GEOM-ID. GEOMETRY is a string giving an OOGL geometry specification. If no objeto called GEOM-ID exists, it is created; in this case the GEOMETRY argument is optional, and if omitted, the new objeto GEOM-ID is given an empty geometry.
geomview-1.9.4/doc/geomview-pt_BR.html/ND_002dVertices.html0000644000175000001440000000610210663302002020232 00000000000000 ND-Vertices - Manual do Geomview

4.1.4 N-dimensional Vertices

Several objetos share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an objeto have the same format, specified by the header key word.

All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on).

The syntax for N-dimensional vertices (N > 3) is

`x[1] x[2] x[3] x[4] ...'
(N floating-point vertex coordinates) or
`x[0] x[1] x[2] x[3] x[4] ...'
((N+1) floating-point vertex coordinates, if the 4 modifier has been specified in the objeto's header line)

Note, however, that N-dimensional objetos internally always have (N+1)-dimensional points; the first component x[0] – if present in the objeto file – is used as homogeneous divisor. This is different from the ordinary 3D case where the 4 modifier generates a 4D objeto where the homogeneous component implicitly is set to 1.

Color components usually can be specified like for 3D vertices, see Vertices, while specifying normals does not make sense. geomview-1.9.4/doc/geomview-pt_BR.html/Contributing.html0000644000175000001440000000612610663302002020154 00000000000000 Contributing - Manual do Geomview

Next: , Previous: Support, Up: Top


Contributing to Geomview's Development

If you are interested in contributing to the development of Geomview, there are several things you can do:

  1. Volunteer programming work.

    If you are a programmer and make an improvement to Geomview, contact the other geomview authors by sending a note to the geomview-users mailing list (see http://lists.sourceforge.net/mailman/listinfo/geomview-users).

  2. Contract with Geometry Technologies.

    Geometry Technologies, Inc. is a consulting firm that provides contract technical support and custom programming services in the area of 3D graphics. This includes a wide range of services related to 3D graphics, included but not limited to applications involving Geomview. To the extent that resources allow, Geometry Technologies supports the developement of Geomview; in particular it hosts the http://www.geomview.org web site, and its staff make ongoing improvements to Geomview itself. If you are in a position to pay for technical support or custom programming work, contracting with Geometry Technologies indirectly supports Geomview. You can also contract with with Geometry Technologies to have particular features that you want added to Geomview, or to port Geomview to a new platform. For more information see Geometry Technologies web site at http://www.geomtech.com.

Thank you. geomview-1.9.4/doc/geomview-pt_BR.texi0000644000175000001440000136435410663301745014577 00000000000000%%% -*-texinfo-*- \tolerance=2000 \input texinfo @iftex @letterpaper @end iftex @setfilename geomview-pt_BR @settitle Manual do Geomview @include version-pt_BR.texi @dircategory Graphics Applications @direntry * Geomview: (geomview-pt_BR). Programa interativo de visualiza@,{c}@~ao tridimensional. @end direntry @c baseado na vers@~{a}o 1.42 do cvs @titlepage @sp 1 @center @titlefont{Manual do Geomview} @sp 4 @center Vers@~ao @value{VERSION} do Geomview @sp 1 @center para GNU/Linux/Unix @sp 1 @center @value{UPDATED-MONTH} @comment 19 de Novembro de 2000 @sp 2 @center Mark Phillips et al. @sp 14 @center Tradutor para o Portugu@^es do Brasil @center Jorge Barros de Abreu @center http://usr.solar.com.br/~ficmatin @sp 2 @vskip 0pt plus 1filll @center Copyright @copyright{} 1992-1998 The Geometry Center @center Copyright @copyright{} 1998-2006 Stuart Levy, Tamara Munzner, Mark Phillips @center Copyright @copyright{} 2006-2007 Claus-Justus Heine @end titlepage @page @node Top, Intro, (dir), (dir) Programa interativo de visualiza@,{c}@~ao tridimensional. @menu * Intro:: Introdu@,{c}@~ao ao Geomview. * Distrib:: Como acessar a vers@~ao mais recente do Geomview. * Copying:: A Licen@,{c}a P@'ublica Geral Menor do GNU. * History:: Hist@'oria do Desenvolvimento do Geomview. * Platforms:: Plantaformas Suportadas. * Pronunciation:: Como Pronunciar ``Geomview''. * Overview:: Vis@~ao Geral do Geomview. * Tutorial:: Tutorial Introdut@'orio. * Interaction:: Interagindo com Geomview. * OOGL File Formats:: Formatos para Inser@,{c}@~ao de Dados Geom@'etricos. * Customization:: Modificando o comportamento do Geomview. * Modules:: Programas que usam Geomview para exibi@,{c}@~ao de imagens. * GCL:: GCL: a Linguagem de Comandos do Geomview. * Non-Euclidean Geometry:: Geometrias N@~ao Euclideanas. * Mathematica:: Gr@'aficos do Mathematica no Geomview ou no RenderMan. * Installation:: Instalando o Geomview no seu computador. * Support:: acessando o Suporte T@'ecnico para o Geomview. * Contributing:: Como contribuir com o Geomview. * Function Index:: Acesso r@'apido a cada fun@,{c}@~ao da GCL. * List of Figures:: Lista de Figuras. @end menu @node Intro, Distrib, Top, Top @unnumbered Introduction to Geomview Geomview @'{e} um programa interativo para visualizar e manipular objetos geom@'{e}tricos, originalmente escrito pelos membros do estado maior do Geometry Center na Universidade de Minesota (EUA), come@,{c}ando em 1991. O Geomview pode ser usado como um visualizador independente para objetos est@'{a}ticos ou como um mecanismo de visualiza@,{c}@~{a}o para outros programas que produzem dinamicamente mudan@,{c}as geom@'{e}tricas. Geomview roda sobre muitos tipos de computadores Unix, incluindo Linux, SGI, Sun, e HP. Geomview tamb@'{e}m executa com Cygwin. Esse manual descreve Geomview em sua vers@~{a}o 1.9. @refill Geomview @'{e} um @dfn{software} livre, dispon@'{i}vel sob os termos da Licen@,{c}a P@'{u}blica Geral Menor do GNU ; veja @ref{Copying} para detalhes. Geomview e esse manual podem ser encontrados em @uref{http://www.geomview.org}. @'{E} permitido fazer c@'{o}pias desse manual. Se voc@^{e} tiver d@'{u}vidas ou coment@'{a}rios sobre o Geomview ou esse manual, considere inscrever-se na lista de correio eletr@^{o}nico @file{geomview-users}, que @'{e} um f@'{o}rum no qual usu@'{a}rios do Geomview comunicam-se para responder outras quest@~{o}es e para compartilhar not@'{i}cias sobre o que eles est@~{a}o fazendo com o Geomview. Os autores do Geomview participam dessa lista e algumas vezes enviam respostas a questionamentos existentes. Para assinar a lista, visite a p@'{a}gina da lista no s@'{i}tio @uref{http://lists.sourceforge.net/mailman/listinfo/geomview-users}. @node Distrib, Copying, Intro, Top @unnumbered Distribution Geomview @'{e} um @dfn{software} livre; isso significa que qualquer um @'{e} livre para us@'{a}-lo e livre para redistribu@'{i}-lo sob certas condi@,{c}@~{o}es. Geomview n@~{a}o @'{e} de dom@'{i}nio p@'{u}blico; @'{e} protegido por direitos autorais e existem restri@,{c}@~{o}es sobre sua distribui@,{c}@~{a}o, mas essas restri@,{c}@~{o}es s@~{a}o montadas de forma a permitir qualquer coisa que um bom cidad@~{a}o colaborador possa querer fazer. O que n@~{a}o @'{e} permitido @'{e} para tentar previnir outros de compartilhamento adicional de qualquer vers@~{a}o do Geomview que eles possam pegar de voc@^{e}. As condi@,{c}@~{o}es precisas podem ser encontradas na Licen@,{c}a Geral Menor do GNU que acompanha o Geomview e tamb@'{e}m aparece acompanhando essa se@,{c}@~{a}o. Uma forma de acessar uma c@'{o}pia do Geomview @'{e} a partir de algu@'{e}m que j@'{a} possua o Geomview. Voc@^{e} n@~{a}o precisa perguntar por nossa permiss@~{a}o para fazer isso, ou informar qualquer coisa; apenas fa@,{c}a a c@'{o}pia. Se voc@^{e} tiver acesso @`{a} internet, voc@^{e} pode pegar a mais recente vers@~{a}o do Geomview em @uref{http://www.geomview.org}. Voc@^{e} tamb@'{e}m pode receber Geomview quando voc@^{e} compra um computador. Fabricantes de computadores est@~{a}o livres para distribuir c@'{o}pias sob os mesmos termos que s@~{a}o aplicados a qualquer pessoa. Esses termos requerem que os fabricantes forne@,{c}am a voc@^{e} o c@'{o}digo completo, incluindo qualquer mudan@,{c}as que eles tenham feito, e permitam a voc@^{e} que redistribua o Geomview recebido deles nos termos usuais da Licen@,{c}a P@'{u}blica Geral Menor do GNU. Em outras palavras, o programa deve ser livre para voc@^{e} quando voc@^{e} o receber, n@~{a}o apenas livre para o fabricante. @node Copying, History, Distrib, Top @unnumbered Copying @c cH: in my opinion the following paragraph is complete nonsense; programs @c which simply communicate with other programs by means of streams @c cannot inherit the restriction imposed by the GPL @smallexample NOTA: Geomview @'{e} distribu@'{i}do sob a LICEN@,{C}A P@'{U}BLICA GERAL MENOR. Para os prop@'{o}sitos dessa licen@,{c}a n@'{o}s pensamos em Geomview como se ele fosse uma "biblioteca", e dos m@'{o}dulos externos do Geomview como "programas que se comunicam com a biblioteca". Fazemos isso porque queremos especificamente permitir que programas propriet@'{a}rios e m@'{o}dulos usem o Geomview. @end smallexample @unnumbered GNU LESSER PUBLIC LICENSE @center Version 2.1, February 1999 @display Licen@,{c}a P@'{u}blica Geral Menor do GNU This is an unofficial translation of the GNU Lesser General Public License into Portuguese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU LGPL--only the original English text of the GNU LGPL does that. However, we hope that this translation will help Portuguese speakers understand the GNU LGPL better. Esta @'{e} uma tradu@,{c}@~{a}o n@~{a}o-oficial da GNU Lesser General Public License para o Portugu@^{e}s. Ela n@~{a}o @'{e} publicada pela Free Software Foundation e n@~{a}o traz os termos de distribui@,{c}@~{a}o legal do software que usa a GNU LGPL -- estes termos est@~{a}o contidos apenas no texto da GNU LGPL original em ingl@^{e}s. No entanto, esperamos que esta tradu@,{c}@~{a}o ajudar@'{a} no melhor entendimento da GNU LGPL em Portugu@^{e}s. Vers@~{a}o 2.1, Fevereiro de 1999 Copyright @copyright{} 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA [Estados Unidos da Am@'{e}rica] @'{E} permitido a qualquer pessoa copiar e distribuir c@'{o}pias sem altera@,{c}@~{o}es deste documento de licen@,{c}a, sendo vedada, entretanto, sua modifica@,{c}@~{a}o. [Esta @'{e} a primeira vers@~{a}o da GPL Menor a ser lan@,{c}ada. Ela tamb@'{e}m constitui a sucessora da Licen@,{c}a P@'{u}blica de Biblioteca do GNU, da@'{i} o n@'{u}mero 2.1. da vers@~{a}o]. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] @end display @unnumberedsec Introdu@,{c}@~{a}o As licen@,{c}as da maioria dos softwares s@~{a}o elaboradas para suprimir sua liberdade de compartilh@'{a}-los e modific@'{a}-los. As Licen@,{c}as P@'{u}blicas do GNU, ao contr@'{a}rio, t@^{e}m o objetivo de assegurar sua liberdade para compartilhar e modificar softwares livres para garantir que o software seja livre para todos os seus usu@'{a}rios. A presente Licen@,{c}a P@'{u}blica Geral Menor se aplica a alguns pacotes de software especialmente designados - normalmente bibliotecas - da Free Software Foundation e de outros autores que decidam utiliz@'{a}-la. Voc@^{e} pode utiliz@'{a}-la tamb@'{e}m, mas recomendamos que antes, voc@^{e} analise cuidadosamente se esta licen@,{c}a, ou a Licen@,{c}a P@'{u}blica Geral comum, @'{e} a melhor estrat@'{e}gia a ser adotada em cada caso espec@'{i}fico, tendo como base as explica@,{c}@~{o}es abaixo. Quando falamos de software livre, estamos nos referindo a liberdade de uso e n@~{a}o de gratuidade de pre@,{c}o. Nossas Licen@,{c}as P@'{u}blicas Gerais s@~{a}o elaboradas para garantir que voc@^{e} tenha liberdade para distribuir c@'{o}pias de software livre (cobrando por esse servi@,{c}o se voc@^{e} assim o desejar); que voc@^{e} receba c@'{o}digo-fonte ou o obtenha, se quiser; que voc@^{e} modifique o software e utilize partes dele em novos programas livres; e que voc@^{e} tenha ci@^{e}ncia de que pode praticar estes atos. A fim de proteger seus direitos, @'{e} necess@'{a}rio que fa@,{c}amos restri@,{c}@~{o}es que pro@'{i}bam distribu@'{i}dores de negar estes direitos a voc@^{e} ou de pedir que voc@^{e} que renuncie a eles. Essas restri@,{c}@~{o}es se traduzem em determinadas responsabilidades que voc@^{e} dever@'{a} assumir, se vier a distribuir c@'{o}pias da biblioteca ou modific@'{a}-la. Por exemplo, se voc@^{e} distribuir c@'{o}pias da biblioteca, seja gratuitamente ou mediante um valor, ter@'{a} de conceder a seus receptores todos os direitos que estamos concedendo a voc@^{e}. Voc@^{e} ter@'{a} de garantir que eles, tamb@'{e}m, recebam ou possam obter o c@'{o}digo fonte. Se voc@^{e} ligar outro c@'{o}digo com a biblioteca, voc@^{e} deve fornecer os arquivos-objeto completos para os receptores, de modo que eles possam lig@'{a}-los novamente com a biblioteca ap@'{o}s terem feito mudan@,{c}as na biblioteca e recompilado a mesma. E voc@^{e} ter@'{a} de exibir a eles esses termos, para que eles conhe@,{c}am seus direitos. Protegemos seus direitos atrav@'{e}s de um m@'{e}todo que envolve dois passos: (1) estabelecemos direitos autorais sobre a biblioteca e (2) oferecemos a voc@^{e} esta licen@,{c}a, que d@'{a} a voc@^{e} permiss@~{a}o para copiar, distribuir e/ou modificar a biblioteca. Para proteger cada distribuidor, queremos deixar bem claro que n@~{a}o h@'{a} nenhuma garantia para a biblioteca livre. Al@'{e}m disso, se a biblioteca for modificada por algu@'{e}m e passada adiante, os receptores devem saber que o que eles t@^{e}m n@~{a}o @'{e} a vers@~{a}o original, de modo que a reputa@,{c}@~{a}o do autor original n@~{a}o ser@'{a} afetada por problemas que possam ser introduzidos por outros. Por fim, as patentes de software representam uma amea@,{c}a constante para a exist@^{e}ncia de qualquer programa livre. Queremos assegurar que uma empresa n@~{a}o possa efetivamente restringir os usu@'{a}rios de um programa livre por ter obtido uma licen@,{c}a restritiva de um titular de direitos de patente. Por isso, insistimos que qualquer licen@,{c}a de patente obtida para alguma vers@~{a}o da biblioteca seja consistente com a plena liberdade de uso, especificada nesta licen@,{c}a. A maior parte dos softwares do GNU, incluindo algumas bibliotecas, est@'{a} coberta pela Licen@,{c}a P@'{u}blica Geral comum do GNU. A presente Licen@,{c}a P@'{u}blica Geral Menor do GNU se aplica a determinadas bibliotecas designadas, sendo bastante diferente da Licen@,{c}a P@'{u}blica Geral comum. Usamos esta licen@,{c}a para determinadas bibliotecas, a fim de permitir a liga@,{c}@~{a}o dessas bibliotecas a programas n@~{a}o-livres. Quando um programa @'{e} ligado a uma biblioteca, seja estaticamente ou usando uma biblioteca compartilhada, essa combina@,{c}@~{a}o das duas @'{e} em termos legais uma obra combinada, uma deriva@,{c}@~{a}o da biblioteca original. Por essa raz@~{a}o, a Licen@,{c}a P@'{u}blica Geral comum somente permite essa liga@,{c}@~{a}o se a combina@,{c}@~{a}o como um todo atender a seus crit@'{e}rios de liberdade. A Licen@,{c}a P@'{u}blica Geral Menor permite crit@'{e}rios mais flex@'{i}veis para a liga@,{c}@~{a}o de outros c@'{o}digos @`{a} biblioteca. Chamamos esta licen@,{c}a de Licen@,{c}a P@'{u}blica Geral "Menor" porque ela faz Menos para proteger a liberdade do usu@'{a}rio do que a Licen@,{c}a P@'{u}blica Geral comum. Ela tamb@'{e}m oferece a outros desenvolvedores de software livre uma Menor vantagem na competi@,{c}@~{a}o com com programas n@~{a}o livres. Essas desvantagens s@~{a}o o motivo pelo qual usamos a Licen@,{c}a P@'{u}blica Geral comum para muitas bibliotecas. Por outro lado, em determinadas circunst@^{a}ncias especiais, a licen@,{c}a Menor oferece vantagens. Por exemplo, em raras ocasi@~{o}es, pode existir uma necessidade especial de se incentivar a mais ampla utiliza@,{c}@~{a}o poss@'{i}vel de uma determinada biblioteca, para que ela se torne um padr@~{a}o de fato. Para conseguir isso, deve-se permitir que programas n@~{a}o-livres utilizem a biblioteca. Um caso mais freq@"{u}ente ocorre quando uma biblioteca livre desempenha a mesma fun@,{c}@~{a}o de bibliotecas n@~{a}o-livres amplamente usadas. Nesse caso, existem poucas vantagens em restringir a biblioteca livre somente para software livre, ent@~{a}o utilizamos a Licen@,{c}a P@'{u}blica Geral Menor. Em outros casos, a permiss@~{a}o para usar uma determinada biblioteca em programas n@~{a}o-livres possibilita que um maior n@'{u}mero de pessoas use um amplo leque de softwares livres. Por exemplo, a permiss@~{a}o para usar a Biblioteca C do GNU permite que muito mais pessoas usem todo o sistema operacional do GNU, bem como sua variante, o sistema operacional do GNU/Linux. Mesmo protegendo a liberdade dos usu@'{a}rios em menor grau, a Licen@,{c}a P@'{u}blica Geral Menor garante ao usu@'{a}rio de um programa que esteja ligado @`{a} Biblioteca a liberdade e os meios para executar o programa, usando uma vers@~{a}o modificada da Biblioteca. Seguem abaixo os termos e condi@,{c}@~{o}es exatos para a c@'{o}pia, distribui@,{c}@~{a}o e modifica@,{c}@~{a}o. Preste muita aten@,{c}@~{a}o @`{a} diferen@,{c}a entre uma "obra baseada na biblioteca" e uma "obra que usa a biblioteca". O primeiro cont@'{e}m c@'{o}digo que @'{e} derivado da biblioteca, enquanto o segundo tem de ser combinado @`{a} biblioteca para que possa ser executado. @unnumberedsec TERMOS E CONDI@,{C}@~{O}ES PARA C@'{O}PIA, DISTRIBUI@,{C}@~{A}O E MODIFICA@,{C}@~{A}O @enumerate 0 @item O presente Contrato de Licen@,{c}a se aplica a qualquer biblioteca de software ou a outro programa que contenha um aviso colocado pelo titular dos direitos autorais ou outra parte autorizada, informando que ela pode ser distribu@'{i}da nos termos desta Licen@,{c}a P@'{u}blica Geral Menor (tamb@'{e}m denominada "esta Licen@,{c}a"). Cada licenciado doravante ser@'{a} denominado "voc@^{e}". Uma "biblioteca" significa uma cole@,{c}@~{a}o de fun@,{c}@~{o}es de software e/ou dados preparados, de forma a serem convenientemente ligados com programas de aplica@,{c}@~{a}o (que usam algumas dessas fun@,{c}@~{o}es e dados) para formar execut@'{a}veis. O termo "Biblioteca", abaixo, refere-se a qualquer biblioteca de software ou obra que tenha sido distribu@'{i}da de acordo com esses termos. Uma "obra baseada na Biblioteca" significa tanto a Biblioteca como qualquer obra derivada, nos termos da legisla@,{c}@~{a}o autoral: isto @'{e}, uma obra contendo a Biblioteca ou parte dela, seja sem altera@,{c}@~{o}es ou com modifica@,{c}@~{o}es e/ou traduzida diretamente para outra linguagem. (Doravante, o termo "modifica@,{c}@~{a}o" inclui, sem reservas, o termo "tradu@,{c}@~{a}o"). O "c@'{o}digo-fonte" de uma obra significa o formato preferencial da obra para que sejam feitas modifica@,{c}@~{o}es na mesma. Para uma biblioteca, o c@'{o}digo-fonte completo significa todo o c@'{o}digo fonte para todos os m@'{o}dulos contidos na mesma, al@'{e}m de quaisquer arquivos de defini@,{c}@~{a}o de interface associados, al@'{e}m dos scripts utilizados para controlar a compila@,{c}@~{a}o e a instala@,{c}@~{a}o da biblioteca. Outras atividades que n@~{a}o a c@'{o}pia, distribui@,{c}@~{a}o e modifica@,{c}@~{a}o n@~{a}o s@~{a}o cobertas por esta Licen@,{c}a; elas est@~{a}o fora de seu escopo. O ato de executar um programa usando a Biblioteca n@~{a}o tem restri@,{c}@~{o}es, e o resultado gerado a partir desse programa encontra-se coberto somente se seu conte@'{u}do constituir uma obra baseada na Biblioteca (independente do uso da Biblioteca em uma ferramenta para escrev@^{e}-lo). Na verdade, isto depender@'{a} daquilo que a Biblioteca faz e o que o programa que usa a biblioteca faz. @item Voc@^{e} pode copiar e distribuir c@'{o}pias sem altera@,{c}@~{o}es do c@'{o}digo-fonte completo da Biblioteca ao receb@^{e}-lo, em qualquer meio ou m@'{i}dia, desde que publique, ostensiva e adequadamente, um aviso de direitos autorais (ou copyright) apropriado e uma notifica@,{c}@~{a}o sobre a exonera@,{c}@~{a}o de garantias; mantenha intactas as informa@,{c}@~{o}es, avisos ou notifica@,{c}@~{o}es referentes a esta Licen@,{c}a e @`{a} aus@^{e}ncia de qualquer garantia; e distribua uma c@'{o}pia desta Licen@,{c}a junto com a Biblioteca. Voc@^{e} poder@'{a} cobrar um valor pelo ato f@'{i}sico de transferir uma c@'{o}pia, e voc@^{e} pode oferecer, se quiser, a prote@,{c}@~{a}o de uma garantia em troca de um valor. @item Voc@^{e} pode modificar sua c@'{o}pia ou c@'{o}pias da Biblioteca ou qualquer parte dela, formando, assim, uma obra baseada na Biblioteca, bem como copiar e distribuir essas modifica@,{c}@~{o}es ou obra, em conformidade com a Cl@'{a}usula 1 acima, desde que atenda, ainda, a todas as seguintes condi@,{c}@~{o}es: @enumerate a @item A obra modificada tem de ser, por si s@'{o}, uma biblioteca de software. @item Voc@^{e} tem de fazer com que os arquivos modificados contenham avisos, em destaque, de que voc@^{e} modificou os arquivos e a data de qualquer modifica@,{c}@~{a}o. @item Voc@^{e} tem de fazer com que a obra como um todo seja licenciada, sem nenhum custo, a todos os terceiros, de acordo com esta Licen@,{c}a. @item Se um dispositivo, na Biblioteca modificada, se referir a uma fun@,{c}@~{a}o ou a uma tabela de dados a ser fornecida por um programa de aplica@,{c}@~{a}o que usa esse dispositivo, outro que n@~{a}o um argumento transmitido quando o dispositivo @'{e} invocado, nesse caso, voc@^{e} ter@'{a} de fazer um esfor@,{c}o de boa-f@'{e} para assegurar que, no caso de uma aplica@,{c}@~{a}o que n@~{a}o forne@,{c}a essa fun@,{c}@~{a}o ou tabela, o dispositivo ainda assim opere, e ir@'{a} realizar qualquer parte de sua finalidade que permanecer significativa. (Por exemplo, uma fun@,{c}@~{a}o de uma biblioteca para computar ra@'{i}zes quadradas tem uma finalidade que @'{e} completamente bem definida independentemente da aplica@,{c}@~{a}o. Por essa raz@~{a}o, a letra d, da Cl@'{a}usula 2, exige que qualquer fun@,{c}@~{a}o ou tabela fornecida pela aplica@,{c}@~{a}o, usada por essa fun@,{c}@~{a}o, tem de ser opcional: se a aplica@,{c}@~{a}o n@~{a}o fornec@^{e}-la, a fun@,{c}@~{a}o de ra@'{i}zes quadradas dever@'{a} ainda assim computar ra@'{i}zes quadradas). @end enumerate Essas exig@^{e}ncias se aplicam @`{a} obra modificada como um todo. Se partes identific@'{a}veis dessa obra n@~{a}o forem derivadas da Biblioteca e puderem ser consideradas razoavelmente, em si, como obras independentes e separadas, nesse caso, esta Licen@,{c}a e seus termos n@~{a}o se aplicar@~{a}o a essas partes quando voc@^{e} distribui-las como obras separadas. Todavia, quando voc@^{e} distribuir essas mesmas partes como partes de um todo, que por si seja uma obra baseada na Biblioteca, a distribui@,{c}@~{a}o desse todo dever@'{a} ser realizada de acordo com esta Licen@,{c}a, cujas respectivas permiss@~{o}es para outros licenciados extendem-se @`{a} integralidade deste todo, dessa forma, a toda e qualquer parte, independentemente de quem a escreveu. Assim, esta cl@'{a}usula n@~{a}o tem a inten@,{c}@~{a}o de afirmar direitos ou contestar os seus direitos sobre uma obra escrita inteiramente por voc@^{e}; a inten@,{c}@~{a}o @'{e}, antes, de exercer o direito de controlar a distribui@,{c}@~{a}o de obras derivadas ou obras coletivas baseadas na Biblioteca. Al@'{e}m disto, a simples agrega@,{c}@~{a}o de outra obra, que n@~{a}o seja baseada na Biblioteca, @`{a} Biblioteca (ou a uma obra baseada na Biblioteca) em um volume de meio ou m@'{i}dia de armazenamento ou distribui@,{c}@~{a}o, n@~{a}o inclui esta outra obra no @^{a}mbito desta Licen@,{c}a. @item Voc@^{e} poder@'{a} optar por aplicar os termos da Licen@,{c}a P@'{u}blica Geral do GNU ao inv@'{e}s desta Licen@,{c}a, para uma determinada c@'{o}pia da Biblioteca. Para tanto, voc@^{e} dever@'{a} alterar todos os avisos ou notifica@,{c}@~{o}es que se refiram a esta Licen@,{c}a, para que eles se refiram @`{a} Licen@,{c}a P@'{u}blica Geral comum do GNU, vers@~{a}o 2, ao inv@'{e}s desta Licen@,{c}a. (Se uma vers@~{a}o mais nova do que a vers@~{a}o 2 da Licen@,{c}a P@'{u}blica Geral comum do GNU tiver sido gerada, ent@~{a}o voc@^{e} poder@'{a} especificar essa vers@~{a}o, se preferir). N@~{a}o fa@,{c}a nenhuma outra altera@,{c}@~{a}o nesses avisos ou notifica@,{c}@~{o}es. Uma vez que essa altera@,{c}@~{a}o tenha sido feita em uma determinada c@'{o}pia, ela @'{e} irrevers@'{i}vel para esta c@'{o}pia, passando a Licen@,{c}a P@'{u}blica Geral comum do GNU a ser aplicada para todas as c@'{o}pias e obras derivadas subseq@"{u}entes, feitas a partir dessa c@'{o}pia. Essa op@,{c}@~{a}o @'{e} @'{u}til quando voc@^{e} desejar copiar parte do c@'{o}digo da Biblioteca em um programa que n@~{a}o seja uma biblioteca. @item Voc@^{e} poder@'{a} copiar e distribuir a Biblioteca (ou uma parte ou obra derivada dela, de acordo com a Cl@'{a}usula 2) em c@'{o}digo-objeto ou formato execut@'{a}vel, sob as Cl@'{a}usulas 1 e 2 acima, desde que inclua todo o c@'{o}digo-fonte correspondente, pass@'{i}vel de leitura pela m@'{a}quina, que deve ser distribu@'{i}do sob os termos das Cl@'{a}usulas 1 e 2 acima, em um meio ou m@'{i}dia costumeiramente utilizado para o interc@^{a}mbio de software. Se a distribui@,{c}@~{a}o do c@'{o}digo-objeto for feita pela oferta de acesso para c@'{o}pia a partir de um local designado, ent@~{a}o a permiss@~{a}o de acesso equivalente para copiar o c@'{o}digo-fonte a partir do mesmo local atende a exig@^{e}ncia de distribui@,{c}@~{a}o do c@'{o}digo-fonte, mesmo que terceiros n@~{a}o sejam levados a copiar a fonte junto com o c@'{o}digo-objeto. @item Um programa que n@~{a}o contenha nenhum derivativo de qualquer parte da Biblioteca, mas que seja desenhado para operar com a Biblioteca ao ser compilado ou ligado a ela, @'{e} chamado de uma "obra que usa a Biblioteca". Essa obra, isoladamente, n@~{a}o @'{e} uma obra derivada da Biblioteca e, portanto, fica de fora do @^{a}mbito desta Licen@,{c}a. Entretanto, a liga@,{c}@~{a}o de uma "obra que usa a Biblioteca" com a Biblioteca constitui um execut@'{a}vel que @'{e} um derivado da Biblioteca (pois cont@'{e}m partes da Biblioteca), e n@~{a}o uma "obra que usa a Biblioteca". O execut@'{a}vel @'{e}, assim, coberto por esta Licen@,{c}a. A Cl@'{a}usula 6 estabelece os termos para a distribui@,{c}@~{a}o desses execut@'{a}veis. Quando uma "obra que usa a Biblioteca" usar material de um arquivo de cabe@,{c}alho que @'{e} parte da Biblioteca, o c@'{o}digo-objeto para a obra poder@'{a} ser uma obra derivada da Biblioteca, mesmo que o c@'{o}digo-fonte n@~{a}o o seja. Para que isto seja verdade, @'{e} especialmente importante se a obra pode ser ligada sem a Biblioteca, ou se a obra @'{e}, em si mesma, uma biblioteca. O limiar para que isto seja verdade n@~{a}o @'{e} definido com precis@~{a}o pela lei. Se um arquivo-objeto usar somente par@^{a}metros num@'{e}ricos, layouts e accessors da estrutura de dados, bem como pequenas macros e pequenas fun@,{c}@~{o}es inline (dez linhas ou menos de extens@~{a}o), ent@~{a}o o uso do arquivo-objeto n@~{a}o @'{e} restrito, independente de ser ele legalmente uma obra derivada. (Execut@'{a}veis contendo este c@'{o}digo-objeto mais partes da Biblioteca continuam submetidos aos termos da Cl@'{a}usula 6). Do contr@'{a}rio, se a obra for um derivado da Biblioteca, voc@^{e} poder@'{a} distribuir o c@'{o}digo objeto da obra sob os termos da Cl@'{a}usula 6. Quaisquer execut@'{a}veis contendo esta obra tamb@'{e}m se submetmem @`{a} Cl@'{a}usula 6, estejam ou n@~{a}o diretamente ligados @`{a} Biblioteca em si. @item Como exce@,{c}@~{a}o @`{a} Cl@'{a}usula acima, voc@^{e} tamb@'{e}m pode combinar ou ligar uma "obra que usa a Biblioteca" @`{a} Biblioteca para produzir uma obra contendo partes da Biblioteca e distribu@'{i}-la de acordo com os termos de sua escolha, desde que estes termos permitam modifica@,{c}@~{o}es na obra para uso pr@'{o}prio por parte do cliente e engenharia reversa para depura@,{c}@~{a}o dessas modifica@,{c}@~{o}es. Em cada c@'{o}pia da obra, voc@^{e} ter@'{a} de colocar um aviso, em destaque, de que a Biblioteca foi usada e que ela e seu uso est@~{a}o cobertos por esta Licen@,{c}a. Voc@^{e} dever@'{a} fornecer uma c@'{o}pia desta Licen@,{c}a. Se, durante a execu@,{c}@~{a}o, a obra exibir avisos ou notifica@,{c}@~{o}es de direitos autorais (ou copyright), voc@^{e} ter@'{a} de incluir, entre eles, o aviso de direitos autorais (ou copyright) referente @`{a} Biblioteca, bem como uma refer@^{e}ncia direcionando o usu@'{a}rio para a c@'{o}pia desta Licen@,{c}a. Al@'{e}m disso, voc@^{e} dever tomar ao menos uma das seguintes provid@^{e}ncias: @enumerate a @item Incluir na obra todo o c@'{o}digo-fonte da Biblioteca, pass@'{i}vel de leitura pela m@'{a}quina, incluindo quaisquer modifica@,{c}@~{o}es que foram usadas na obra (as quais devem ser distribu@'{i}das conforme as Cl@'{a}usulas 1 e 2 acima); e, se a obra for um execut@'{a}vel ligado @`{a} Biblioteca, com toda a "obra que usa a Bilblioteca" pass@'{i}vel de leitura pela m@'{a}quina, como c@'{o}digo-objeto e/ou c@'{o}digo-fonte, de modo que o usu@'{a}rio possa modificar a biblioteca e, depois, religar para produzir um execut@'{a}vel modificado contendo a Biblioteca modificada. (Fica entendido que o usu@'{a}rio que modificar o conte@'{u}do dos arquivos de defini@,{c}@~{o}es da Biblioteca n@~{a}o necessariamente ser@'{a} capaz de recompilar a aplica@,{c}@~{a}o para usar as defini@,{c}@~{o}es modificadas). @item Usar um mecanismo adequado de biblioteca compartilhada para ligar com a Biblioteca. Um mecanismo adequado @'{e} aquele que (a) usa, ao tempo da execu@,{c}@~{a}o, uma c@'{o}pia da biblioteca j@'{a} presente no sistema do computador do usu@'{a}rio, e (2) ir@'{a} operar adequadamente com uma vers@~{a}o modificada da biblioteca, se o usu@'{a}rio instalar uma, desde que a vers@~{a}o modificada seja compat@'{i}vel com a interface da vers@~{a}o com a qual a obra foi feita. @item Incluir na obra uma oferta por escrito, v@'{a}lida por pelo menos 3 anos, oferencendo ao mesmo usu@'{a}rio os materiais especificados na letra "a" da Cl@'{a}usula 6 acima, por um custo n@~{a}o superior ao custo de fazer esta distribui@,{c}@~{a}o. @item Se a distribui@,{c}@~{a}o da obra for feita com a permiss@~{a}o de acesso para copiar, a partir de um local designado, oferecer acesso equivalente para copiar os materiais acima especificados, a partir do mesmo local. @item Certificar-se se o usu@'{a}rio j@'{a} recebeu uma c@'{o}pia desses materiais ou de que voc@^{e} j@'{a} enviou uma c@'{o}pia a esse usu@'{a}rio. @end enumerate Para um execut@'{a}vel, o formato exigido da "obra que usa a Biblioteca" deve incluir quaisquer dados e programas utilit@'{a}rios necess@'{a}rios para reprodu@,{c}@~{a}o do execut@'{a}vel a partir dele. Todavia, como uma exce@,{c}@~{a}o especial, os materiais a serem distribu@'{i}dos n@~{a}o necessitam incluir algo que seja normalmente distribu@'{i}do (tanto no formato fonte quanto bin@'{a}rio) com os componentes mais importantes (compilador, kernel, e assim por diante) do sistema operacional no qual execut@'{a}vel @'{e} executado, a menos que esse componente, em si, acompanhe o execut@'{a}vel. Pode ocorrer que essa exig@^{e}ncia contradiga as restri@,{c}@~{o}es da licen@,{c}a de outras bibliotecas propriet@'{a}rias que normalmente n@~{a}o acompanham o sistema operacional. Essa contradi@,{c}@~{a}o significa que voc@^{e} n@~{a}o pode utilizar ambas e a Biblioteca juntas em um execut@'{a}vel distribu@'{i}do por voc@^{e}. @item Voc@^{e} pode colocar dispositivos da biblioteca que sejam uma obra baseada na Biblioteca lado-a-lado em uma @'{u}nica biblioteca junto com outros dispositivos de bibliotecas, desde que uma distribui@,{c}@~{a}o separada da obra baseada na Biblioteca e dos outros dispositivos de bibliotecas seja, de outro modo, permitida e desde que voc@^{e} tome uma das seguintes provid@^{e}ncias: @enumerate a @item Incluir na biblioteca combinada uma c@'{o}pia dessa obra baseada na Biblioteca sem a combina@,{c}@~{a}o com quaisquer outros dispositivos de biblioteca. Essa c@'{o}pia tem de ser distribu@'{i}da de acordo com as condi@,{c}@~{o}es das cl@'{a}usulas acima. @item Junto com a biblioteca combinada, fornecer um aviso, em destaque, sobre o fato de que parte dela @'{e} uma obra baseada na Biblioteca, e explicando onde encontrar o formato n@~{a}o combinado incluso dessa mesma obra. @end enumerate @item Voc@^{e} n@~{a}o poder@'{a} copiar, modificar, sublicenciar, ligar, ou distribuir a Biblioteca, exceto conforme expressamente disposto nesta Licen@,{c}a. Qualquer tentativa de, de outro modo, copiar, modificar, sublicenciar, ligar ou distribuir a Biblioteca @'{e} inv@'{a}lida, e automaticamente terminar@'{a} seus direitos sob esta Licen@,{c}a. Todavia, terceiros que tiverem recebido c@'{o}pias ou direitos de voc@^{e}, de acordo com esta Licen@,{c}a, n@~{a}o ter@~{a}o seus direitos rescindidos, enquanto estes terceiros mantiverem o seu pleno cumprimento. @item Voc@^{e} n@~{a}o @'{e} obrigado a aceitar esta Licen@,{c}a, uma vez que voc@^{e} n@~{a}o a assinou. Entretanto, nada mais concede a voc@^{e} permiss@~{a}o para modificar ou distribuir a Biblioteca ou suas obras derivadas. Esses atos s@~{a}o proibidos por lei se voc@^{e} n@~{a}o aceitar esta Licen@,{c}a. Portanto, ao modificar ou distribuir a Biblioteca (ou qualquer obra baseada na Biblioteca), voc@^{e} manifesta sua aceita@,{c}@~{a}o desta Licen@,{c}a para faz@^{e}-lo, bem como de todos os seus termos e condi@,{c}@~{o}es para c@'{o}pia, distribui@,{c}@~{a}o ou modifica@,{c}@~{a}o da Biblioteca ou obras nela baseadas. @item A cada vez que voc@^{e} redistribuir a Biblioteca (ou qualquer obra nela baseada), o receptor automaticamente recebe uma licen@,{c}a do licenciante original para copiar, distribuir, ligar ou modificar a Biblioteca, sujeito a estes respectivos termos e condi@,{c}@~{o}es. Voc@^{e} n@~{a}o poder@'{a} impor quaisquer restri@,{c}@~{o}es adicionais ao exerc@'{i}cio, pelos receptores, dos direitos concedidos por este instrumento. Voc@^{e} n@~{a}o tem responsabilidade de promover o cumprimento desta licen@,{c}a por parte de terceiros. @item Se, como resultado de uma senten@,{c}a judicial ou alega@,{c}@~{a}o de viola@,{c}@~{a}o de patente, ou por qualquer outro motivo (n@~{a}o restrito @`{a}s quest@~{o}es de patentes), forem impostas a voc@^{e} condi@,{c}@~{o}es (tanto atrav@'{e}s de mandado judicial, contrato ou qualquer outra forma) que contradigam as condi@,{c}@~{o}es desta Licen@,{c}a, voc@^{e} n@~{a}o estar@'{a} desobrigado quanto @`{a}s condi@,{c}@~{o}es desta Licen@,{c}a. Se voc@^{e} n@~{a}o puder atuar como distribuidor de modo a satisfazer simultaneamente suas obriga@,{c}@~{o}es sob esta Licen@,{c}a e quaisquer outras obriga@,{c}@~{o}es pertinentes, ent@~{a}o, como conseq@"{u}@^{e}ncia, voc@^{e} n@~{a}o poder@'{a} distribuir a Biblioteca de nenhuma forma. Por exemplo, se uma licen@,{c}a sob uma patente n@~{a}o permite a redistribui@,{c}@~{a}o por parte de todos aqueles que tiverem recebido c@'{o}pias, direta ou indiretamente de voc@^{e}, sem o pagamento de royalties, ent@~{a}o, a @'{u}nica forma de cumprir tanto com esta exig@^{e}ncia quanto com esta licen@,{c}a ser@'{a} deixar de distribuir, por completo, a Biblioteca. Se qualquer parte desta Cl@'{a}usula for considerada inv@'{a}lida ou n@~{a}o execut@'{a}vel, sob qualquer circunst@^{a}ncia espec@'{i}fica, o restante da cl@'{a}usula dever@'{a} continuar a ser aplicado e a cl@'{a}usula, como um todo, dever@'{a} ser aplicada em outras circunst@^{a}ncias. Esta cl@'{a}usula n@~{a}o tem a finalidade de induzir voc@^{e} a infringir quaisquer patentes ou direitos de propriedade, nem de contestar a validade de quaisquer reivindica@,{c}@~{o}es deste tipo; a @'{u}nica finalidade desta cl@'{a}usula @'{e} proteger a integridade do sistema de distribui@,{c}@~{a}o do software livre, o qual @'{e} implementado mediante pr@'{a}ticas de licen@,{c}as p@'{u}blicas. Muitas pessoas t@^{e}m feito generosas contribui@,{c}@~{o}es @`{a} ampla gama de software distribu@'{i}do atrav@'{e}s desse sistema, confiando na aplica@,{c}@~{a}o consistente deste sistema; cabe ao autor/doador decidir se deseja distribuir software atrav@'{e}s de qualquer outro sistema e um licenciado n@~{a}o pode impor esta escolha. Esta cl@'{a}usula visa deixar absolutamente claro o que se acredita ser uma conseq@"{u}@^{e}ncia do restante desta Licen@,{c}a. @item Se a distribui@,{c}@~{a}o e/ou uso da Biblioteca for restrito em determinados pa@'{i}ses, tanto por patentes ou por interfaces protegidas por direito autoral, o titular original dos direitos autorais que colocar a Biblioteca sob esta Licen@,{c}a poder@'{a} acrescentar uma limita@,{c}@~{a}o geogr@'{a}fica de distribui@,{c}@~{a}o expl@'{i}cita excluindo esses pa@'{i}ses, de modo que a distribui@,{c}@~{a}o seja permitida somente nos pa@'{i}ses ou entre os pa@'{i}ses que n@~{a}o foram exclu@'{i}dos dessa forma. Nesse caso, esta Licen@,{c}a passa a incorporar a limita@,{c}@~{a}o como se esta tivesse sido escrita no corpo desta Licen@,{c}a @item A Free Software Foundation [Funda@,{c}@~{a}o Software Livre] poder@'{a} de tempos em tempos publicar vers@~{o}es revisadas e/ou novasda Licen@,{c}a P@'{u}blica Geral Menor. Essas novas vers@~{o}es ser@~{a}o semelhantes em esp@'{i}rito @`{a} presente vers@~{a}o, podendo, por@'{e}m, ter diferen@,{c}as nos detalhes, para tratar de novos problemas ou preocupa@,{c}@~{o}es. Cada vers@~{a}o recebe um n@'{u}mero distinto de vers@~{a}o. Se a Biblioteca especificar um n@'{u}mero de vers@~{a}o desta Licen@,{c}a, aplic@'{a}vel @`{a} Biblioteca ou a "qualquer vers@~{a}o posterior", voc@^{e} ter@'{a} a op@,{c}@~{a}o de seguir os termos e condi@,{c}@~{o}es tanto daquela vers@~{a}o como de qualquer vers@~{a}o posterior publicada pela Free Software Foundation. Se a Biblioteca n@~{a}o especificar um n@'{u}mero de licen@,{c}a da vers@~{a}o, voc@^{e} poder@'{a} escolher qualquer vers@~{a}o j@'{a} publicada pela Free Software Foundation. @item Se voc@^{e} desejar incorporar partes da Biblioteca em outros programas livres cujas condi@,{c}@~{o}es de distribui@,{c}@~{a}o sejam incompat@'{i}veis com estas, escreva ao autor para solicitar permiss@~{a}o. Para software cujos direitos autorais pertencerem @`{a} Free Software Foundation, escreva @`{a} Funda@,{c}@~{a}o; algumas vezes, fazemos exce@,{c}@~{o}es nesse sentido. Nossa decis@~{a}o ser@'{a} guiada pelos dois objetivos de preservar a condi@,{c}@~{a}o livre de todos os derivados de nosso software livre e de promover o compartilhamento e reutiliza@,{c}@~{a}o de softwares, de modo geral. @heading EXCLUS@~{A}O DE GARANTIA @item COMO A BIBLIOTECA @'{E} LICENCIADA SEM CUSTO, N@~{A}O H@'{A} NENHUMA GARANTIA PARA A BIBLIOTECA, NO LIMITE PERMITIDO PELA LEI APLIC@'{A}VEL. EXCETO QUANDO DE OUTRA FORMA ESTABELECIDO POR ESCRITO, OS TITULARES DOS DIREITOS AUTORAIS E/OU OUTRAS PARTES FORNECEM A BIBLIOTECA "NO ESTADO EM QUE SE ENCONTRA", SEM NENHUMA GARANTIA DE QUALQUER TIPO, TANTO EXPRESSA COMO IMPL@'{I}CITA, INCLUINDO, DENTRE OUTRAS, AS GARANTIAS IMPL@'{I}CITAS DE COMERCIABILIDADE E ADEQUA@,{C}@~{A}O PARA UMA FINALIDADE ESPEC@'{I}FICA. O RISCO INTEGRAL QUANTO @`{A} QUALIDADE E DESEMPENHO DA BIBLIOTECA @'{E} ASSUMIDO POR VOC@^{E}. CASO A BIBLIOTECA CONTENHA DEFEITOS, VOC@^{E} ARCAR@'{A} COM OS CUSTOS DE TODOS OS SERVI@,{C}OS, REPAROS OU CORRE@,{C}@~{O}ES NECESS@'{A}RIAS. @item EM NENHUMA CIRCUNST@^{A}NCIA, A MENOS QUE EXIGIDO PELA LEI APLIC@'{A}VEL OU ACORDADO POR ESCRITO, QUALQUER TITULAR DE DIREITOS AUTORAIS OU QUALQUER OUTRA PARTE QUE POSSA MODIFICAR E/OU REDISTRIBUIR A BIBLIOTECA, CONFORME PERMITIDO ACIMA, SER@'{A} RESPONS@'{A}VEL PARA COM VOC@^{E} POR DANOS, INCLUINDO ENTRE OUTROS QUAISQUER DANOS GERAIS, ESPECIAIS, FORTUITOS OU EMERGENTES, ADVINDOS DO USO OU IMPOSSIBILIDADE DE USO DA BIBLIOTECA (INCLUINDO, ENTRE OUTROS, PERDA DE DADOS, DADOS SENDO GERADOS DE FORMA IMPRECISA, PERDAS SOFRIDAS POR VOC@^{E} OU TERCEIROS OU A IMPOSSIBILIDADE DA BIBLIOTECA DE OPERAR COM QUALQUER OUTRO SOFTWARE), MESMO QUE ESSE TITULAR, OU OUTRA PARTE, TENHA SIDO AVISADO SOBRE A POSSIBILIDADE DESSES DANOS. @end enumerate @heading FINAL DOS TERMOS E CONDI@,{C}@~{O}ES @page @unnumberedsec Como Aplicar Estes Termos para Suas Novas Bibliotecas Se voc@^{e} desenvolver uma nova biblioteca e quiser que ela seja da maior utilidade poss@'{i}vel para o p@'{u}blico, n@'{o}s recomendamos fazer dela um software livre que todos possam redistribuir e modificar. Voc@^{e} pode fazer isto permitindo a redistribui@,{c}@~{a}o sob estes termos (ou, alternativamente, sob os termos da Licen@,{c}a P@'{u}blica Geral comum) Para fazer isto, anexe as notifica@,{c}@~{o}es seguintes @`{a} biblioteca. @'{E} mais seguro anex@'{a}-las ao come@,{c}o de cada arquivo-fonte, de modo a transmitir do modo mais eficiente a exclus@~{a}o de garantia; e cada arquivo deve ter ao menos a linha de "direitos autorais reservados" e uma indica@,{c}@~{a}o de onde a notifica@,{c}@~{a}o completa se encontra. @smallexample @var{uma linha para informar o nome da biblioteca e uma breve id@'{e}ia do que ela faz.} Direitos Autorais Reservados (C) @var{nome do autor} Esta biblioteca @'{e} software livre; voc@^{e} pode redistribu@'{i}-la e/ou modific@'{a}-la sob os termos da Licen@,{c}a P@'{u}blica Geral Menor do GNU conforme publicada pela Free Software Foundation; tanto a vers@~{a}o 2.1 da Licen@,{c}a, ou (a seu crit@'{e}rio) qualquer vers@~{a}o posterior. Esta biblioteca @'{e} distribu@'{i}do na expectativa de que seja @'{u}til, por@'{e}m, SEM NENHUMA GARANTIA; nem mesmo a garantia impl@'{i}cita de COMERCIABILIDADE OU ADEQUA@,{C}@~{A}O A UMA FINALIDADE ESPEC@'{I}FICA. Consulte a Licen@,{c}a P@'{u}blica Geral Menor do GNU para mais detalhes. Voc@^{e} deve ter recebido uma c@'{o}pia da Licen@,{c}a P@'{u}blica Geral Menor do GNU junto com esta biblioteca; se n@~{a}o, escreva para a Free Software Foundation, Inc., no endere@,{c}o 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. @end smallexample Inclua tamb@'{e}m informa@,{c}@~{o}es sobre como contatar voc@^{e} por correio eletr@^{o}nico e por meio postal. Voc@^{e} tamb@'{e}m pode solicitar a seu empregador (se voc@^{e} for um programador) ou a sua institui@,{c}@~{a}o acad@^{e}mica, se for o caso, para assinar uma "ren@'{u}ncia de direitos autorais" sobre a biblioteca, se necess@'{a}rio. Segue um exemplo; altere os nomes: @smallexample A Yoyodyne Ltda., neste ato, renuncia a todos eventuais direitos autorais sobre a biblioteca 'Frob' (uma biblioteca para ajustar fechaduras), escrita por James Random Hacker. , 1 de abril de 1990 Ty Coon, Presidente @end smallexample Isso @'{e} tudo! @node History, Platforms, Copying, Top @unnumbered History of Geomview's Development Geomview was originally written at the Geometry Center at the University of Minnesota in Minneapolis. The Geometry Center was a research and education center funded by the National Science Foundation, with a mission to promote research and communication of mathematics. Much of the work there involved the use of computers to help visualize mathematical concepts. The project that eventually led to Geomview began in the summer of 1988 with the work of Pat Hanrahan on a viewing program called MinneView. Shortly thereafter Charlie Gunn begin developing OOGL (Object Oriented Graphics Language) in conjunction with MinneView. Many people contributed to OOGL and MinneView, including Stuart Levy, Mark Meuer, Tamara Munzner, Steve Anderson, Mario Lopez, Todd Kaplan. In 1991 the staff of the Geometry Center began work on a new improved version of OOGL, and a new and improved viewing program, which they called Geomview. At that time essentially the only game in town for interactive 3D graphics was Silicon Graphics (SGI), so Geomview was developed initially on SGI workstations, using IRIS GL. The first version was finished in January of 1992. It immediately became very popular among visitors to the Geometry Center, and through the Center's ftp archive (this was before the web) people at other institutions began using it too. In addition to SGI workstations the Geometry Center had quite a few NeXT stations, so soon after Geomview was running on SGIs the staff developed a version for NeXTStep as well. By this time there were several thousand people using it around the world. A few years later the staff ported Geomview to X windows and OpenGL, and eventually, with the demise of NeXT, the NeXT version fell by the wayside. In its mission to foster communication among researchers and educators, the Geometry Center developed a web site, www.geom.umn.edu, in late 1993. It was one of the first 300 web sites in existence. A part of the web site was of course devoted to Geomview, and helped to spread the word about its existence. The Geometry Center closed its "brick and mortar" facilities in August of 1998 (NSF cut its funding), but the web site continued to exist, and Geomview continued to be very popular around the world. In December of 1999 some of the former Geometry Center staff set up @uref{http://www.geomview.org} as a permanent home on the web for Geomview. Geomview's original authors, as well as a number of other volunteers around the world, are still actively involved in using and developing Geomview. @menu * Authors:: Authors. @end menu @node Authors, , History, History @unnumberedsec Authors Tamara Munzner, Stuart Levy, e Mark Phillips s@~{a}o os autores originais do Geomview. Celeste Fowler, Charlie Gunn, e Nathaniel Thurston tamb@'{e}m fazem contribui@,{c}@~{o}es sgnificativas. Daniel Krech e Scott Wisdom fizeram o NeXTStep e a adapta@,{c}@~{a}o do RenderMan, e Daeron Meyer e Tim Rowley fizeram a adapta@,{c}@~{a}o para o X windows. Muitos outros membros do estado maior do Geometry Center, bem como muitas pessoas em muitos lugares, tamb@'{e}m contribu@'{i}ram. Mark Phillips escreveu essse manual, com ajuda substancial de Stuart Levy e Tamara Munzner. Incont@'{a}veis usu@'{a}rios do Geomview tamb@'{e}m foram de grande ajuda por meio da leitura do manual e indicando nossos enganos. @node Platforms, Pronunciation, History, Top @unnumbered Supported Platforms Geomview 1.9 pode -- em princ@'{i}pio -- compilar e executarsobre qualquer claramente recente sistemas operacionais semelhantes ao Unix. Especificamente, Geomview executa sobre Linux e sobre Cygwin (Cygwin emula um ambiente semelhante ao SystemV Unix environment sob o Microsoft Windows). Desafortunadamente Geomview compila com MacOS X (Darwin), mas aparentemente comunica@,{c}@~{o}es com Geomview por meio de pipes e sockets causam falha de segmentac@~{a}o. Sinta-se livre para consertar essa falha! Veja @ref{Contributing}, para detalhes. @c Geomview runs on a wide variety of Unix systems. It has been tested on @c each of the following systems: Linux, FreeBSD, SGI, Sun either (Sun-OS @c 4.1.x and Solaris), HP RISC, Dec Alpha, RS/6000, and NeXT. Precompiled @c distributions are available for all of these systems. Using either @c OpenGL or the generic X11 renderer it can probably be compiled on other @c Unix systems as well. @c There is not a version of Geomview for Microsoft Windows. The main @c reason for this is that at the time when Geomview was written, personal @c computers were not fast enough to make interactive 3D graphics feasible, @c and by the time fast-enough PCs came around, the Geometry Center, @c where Geomview was developed, was in the process of being closed. The @c staff started work on a port to Windows but was not able to finish it @c before the Center shut down. @c If you would like to see a version of Geomview for Windows, @c you can contribute to its development in several ways. @c @xref{Contributing}, for details. @c There is also no version of Geomview for Macintosh. @node Pronunciation, Overview, Platforms, Top @unnumbered How to Pronounce ``Geomview`` A palavra 'Geomview' @'{e} uma combina@,{c}@~{a}o da primeira s@'{i}laba da palavra 'geometry', e da palavra 'view'. Os autores pronunciam Geomview como uma palavra ox@'{i}tona, isto @'{e}, tonicidade na primeira s@'{i}laba. @display GE-om-view @end display Algumas pessoas colocam a tonicidade na segunda s@'{i}laba, onde Geomview cai na palavra 'geometry', mas os autores originais, que criaram o nome, preferem a pron@'{u}ncia com tonicidade na primeira s@'{i}laba. @comment @comment @node node-name, next, previous, up @comment @comment **************************************************************** @node Overview, Tutorial, Pronunciation, Top @chapter Overview O principal objetivo do Geomview @'{e} mostrar objetos cuja geometria @'{e} fornecida, permitindo controle interativo sobre detalhes tais como ponto de vis@~{a}o, velocidade de movimento, apar@^{e}ncia de superf@'{i}cies e linhas, e assim por diante. Geomview pode manusear qualquer n@'{u}mero de objetos e permite controle coletivo ou separado sobre eles. A maneira mais simples de usar Geomview @'{e} como um visualizador independente para ver e manipular objetos. Geomview pode mostrar objetos descritos em uma variedade de formatos de arquivo. Geomview @'{e} acompanhado com uma larga variedade de objetos como exemplo, e voc@^{e} pode criar seus pr@'{o}prios objetos. Voc@^{e} pode tamb@'{e}m usar Geomview para manusear os dados a serem mostrados provenientes de outro programa que est@'{a} sendo executado simult@^{a}neamente. Como o outro programa modifica os dados, a im@'{a}gem no geomview reflete as modifica@,{c}òes. Programas que geram objetos e utilizam o Geomview para mostr@'{a}-los s@~{a}o chamados @emph{m@'{o}dulos externos}. M@'{o}dulos externos podem controlar quase todos os asp@'{e}ctos do Geomview. A id@'{e}ia aqui @'{e} que muitos asp@'{e}ctos de visualiza@,{c}@~{a}o e partes da intera@,{c}@~{a}o de programas geom@'{e}tricos s@~{a}o independentes do conte@'{u}do geom@'{e}trico e podem ser coletados conjuntamente em uma pe@,{c}a simples de programa que pode ser usada em uma larga variedade de situa@,{c}@~{o}es. O autor de um m@'{o}dulo externo pode concentrar-se sobre a implementa@,{c}@~{a}o dos algor@'{i}tmos desejados e deixar os asp@'{e}ctos de visualiza@,{c}@~{a}o ao Geomview. Geomview @'{e} acompanhado por uma cole@,{c}@~{a}o de m@'{o}dulos externos a t@'{i}tulo de exemplo, e esse manual descreve como escrever seu pr@'{o}prio @emph{m@'{o}dulo externo}. Geomview @'{e} o produto de um esfor@,{c}o no @dfn{Geometry Center} para disponibilizar um @dfn{software} de geometria interativa que @'{e} particularmente apropriado para pesquisa matem@'{a}tica e educa@,{c}@~{a}o. Em particular, Geomview pode mostrar coisas no espa@,{c}o hiperb@'{o}lico e no espa@,{c}o esf@'{e}rico bem como no espa@,{c}o Euclidiano. Geomview permite m@'{u}ltiplos objetos que s@~{a}o controlados independentemente e c@^{a}meras. As c@^{a}meras fornecem controle interativo para movimento, apar@^{e}ncias (incluindo ilumina@,{c}@~{a}o, sombreamento, e materiais), selecionando um objeto, aresta ou n@'{i}vel de v@'{e}rtice, instant@^{a}neos em um arquivo de imagem SGI ou no formato Renderman RIB, a adi@,{c}@~{a}o ou apagamento de objetos @'{e} poss@'{i}vel atrav@'{e}s da manipula@,{c}@~{a}o direta do mouse, pain@'{e}is de controle, e teclas de atalho via teclado. Geomview suporta os seguintes tipos de dados simples: poliedros com v@'{e}rtices compartilhados (.off), quadril@'{a}teros, malhas retangulares, vetores, e ajustes em superf@'{i}cies de Bezier de grau arbitr@'{a}rio incluindo ajustes racionais. Hierarqu@'{i}as de objetos podem ser constru@'{i}das com listas de objetos e inst@^{a}ncias de objeto(s) transformado(s) por uma ou mais matrizes 4x4. Por@,{c}@~{o}es arbitr@'{a}rias de modifica@,{c}@~{o}es de hierarqu@'{i}as podem ser transmitidas por meio da cria@,{c}@~{a}o de refer@^{e}ncias nomeadas. Geomview pode mostrar sa@'{i}das gr@'{a}ficas tridimensionais provenientes do Mathematica e do Maple. @comment **************************************************************** @node Tutorial, Interaction, Overview, Top @chapter Tutorial Esse cap@'{i}tulo conduzir@'{a} voc@^{e} atrav@'{e}s de alguns usos elementares do Geomview. Trabalhando do come@,{c}o ao fim desse cap@'{i}tulo de frente a um computador onde voc@^{e} pode tentar acompanhar os exemplos fornecidos aqui voc@^{e} pegar@'{a} um pouco do que voc@^{e} pode fazer com Geomview. Para iniciar o Geomview, coloque seu usu@'{a}rio e sua senha no computador e abra uma janela de shell. Uma janela de shell @'{e} uma janela na qual voc@^{e} pode digitar comandos Unix; o prompt na janela usualmente termina com um '%'. Na janela de shell (o cursor do mouse deve estar posicionado sobre a janela) digite o seguinte (@kbd{@key{Enter}} aqui significa pressione a tecla "Enter"): @example geomview tetra dodec @key{Enter} @end example Esse comando inicia o geomview e chama dois objetos exemplo, um tetraedro e um dodecaedro. Ap@'{o}s poucos segundos tr@^{e}s janelas ir@~{a}o aparecer; @pxref{figinitial, Figure}. @float Figure,figinitial @image{figs/initial} @caption{Initial Geomview display.} @end float O painel @`{a} esquerda @'{e} o painel de controle principal do Geomview; Esse painel @'{e} chamado de painel @emph{Main} (principal). O painel menor ao centro @'{e} o painel @emph{Tools} (de ferramentas) e serve para selecionar diferentes tipos de movimentos. A janela do lado direito @'{e} a janela de c@^{a}mera e nessa janela voc@^{e} v@^{e} um tetraedro largo e um dodecaedro que est@'{a} parcialmente obscurecido pelo tetraedro. Geomview tem alguns pain@'{e}is mais por padr@~{a}o ele mostra somente esses tr@^{e}s. iremos descrever alguns asp@'{e}ctos desses tr@^{e}s e alguns dos outros nesse tutorial. Voc@^{e} pode ler mais sobre esses e outros pain@'{e}is nos cap@'{i}tulos adiante neste manual. Coloque o cursor do mouse na janela de c@^{a}mera e pressione e mantenha pressionado o bot@~{a}o esquerdo do mouse. Agora, enquanto mant@'{e}m pressionado o bot@~{a}o, lentamente mova o mouse com movimentos pequenos. Voc@^{e} ver@'{a} a figura rotacionar na dire@,{c}@~{a}o na qual voc@^{e} mover o mouse. Se voc@^{e} liberar o bot@~{a}o do mouse enquanto move o mesmo, a figura continua girando. Para parar o movimento de rota@,{c}@~{a}o, mantenha o mouse sobre a figura e pressione rapdamente o bot@~{a}o esquerdo do mesmo. Geomview utiliza o modelo da @emph{esfera de vidro} para os movimentos iniciados atrav@'{e}s do mouse. Isso significa que voc@^{e} est@'{a} supondo o objeto como estando dentro de uma esfera invis@'{i}vel e o cursor do mouse como sendo uma al@,{c}a fora da esfera provida de uma ventosa. Quando voc@^{e} mant@'{e}m pressionado o bot@~{a}o esquerdo do mouse, a ventosa da al@,{c}a gruda na esfera; quando voc@^{e} libera o bot@~{a}o do mouse, a ventosa da al@,{c}a libera a esfera. Movendo o mouse enquanto mant@'{e}m pressionado o bot@~{a}o faz com que a esfera (e conceq@"{u}@^{e}ntemente o objeto) mova-se na mesma dire@,{c}@~{a}o que o mouse. Adicionalmente para os dois s@'{o}lidos que est@~{a}o atualmente na tela voc@^{e} pode tamb@'{e}m ver duas molduras de fios em forma de caixa na janela de c@^{a}mera. Essas s@~{a}o as "caixas associadas" dos dois objetos. Por padr@~{a}o Geomview coloca uma caisa associada em torno de cada objeto que @'{e} mostrada de forma que voc@^{e} tenha uma id@'{e}ia de o quanto grande o objeto @'{e}. Note que quando voc@^{e} move o mouse em torno do tetraedro e do dodecaedro eles se movem como se fossem uma @'{u}nica figura. Isso ocorre porque por padr@~{a}o o que voc@^{e} est@'{a} movendo atualmente @'{e} o "World" (mundo). Para mover um dos objetos individualmente em lugar de o mundo como um todo, mova o cursor do mouse para o navegador de alvos (@emph{Targets}) no painel principal (@emph{Main}). Clique (qualquer bot@~{a}o) sobre a palavra @emph{tetra}. Isso faz com que o tetraedro seja o "objeto alvo". Agora mova o cursor de volta @`{a} janela de c@^{a}mera e voc@^{e} poder@'{a} rotacionar apenas o tetraedro. O movimento que voc@^{e} aplicou at@'{e} agora foi a rota@,{c}@~{a}o, porque esse @'{e} o modo de modo de movimento selecionado no painel de ferramentas (@emph{Tools}). Para efetuar o movimento de transla@,{c}@~{a}o em lugar do movimento de rota@,{c}@~{a}o, clique sobre o bot@~{a}o transla@,{c}@~{a}o (@emph{Translate}). Agora quando voc@^{e} mover o mouse na janela de c@^{a}mera enquanto mant@'{e}m pressionado o bot@~{a}o esquerdo, o tetraedro (que deve ser ainda o objeto alvo de antes) ir@'{a} ser transladado na dire@,{c}@~{a}o que voc@^{e} move o mouse. Note que voc@^{e} pode transladas o tetraedro na dire@,{c}@~{a}o da borda da janela enquanto voc@^{e} mant@'{e}m pressionado o bot@~{a}o esquerdo do mouse. Se voc@^{e} liberar o bot@~{a}o do mouse enquanto move o mesmo, o tetraedro ir@'{a} continuar o movimento sozinho. O tetraedro mover-se-@'{a} ao contr@'{a}rio do que ocorria antes muito rapidamente de forma que @'{e} muito f@'{a}cil perder o rastro de onde ele se encontra. Se voc@^{e} acidentalmente perder o tetraedro atrav@'{e}s de transla@,{c}@~{a}o para muito longe da vis@~{a}o da janela, voc@^{e} pode peg@'{a}-lo de vlta atrav@'{e}s de um clique sobre o bot@~{a}o Centro (@emph{Center}) no painel de ferramentas (@emph{Tools}). Isso far@'{a} com que o tetraedro retorne para a sua posi@,{c}@~{a}o inicial. Clique sobre o bot@~{a}o Centro (@emph{Center}) para trazer o tetraedro ao centro da janela de c@^{a}mera, e ent@~{a}o coloque-o em uma posi@,{c}@~{a}o de forma que voc@^{e} possa ver completamente o dodecaedro. Seu mundo agora tem dois objetos que est@~{a}o um ao lado do outro. Voc@^{e} pode ver o dodecaedro no meio da janela de c@^{a}mera e pode ver parte do tetraedro parcialmente fora da janela de c@^{a}mera. Volte para o navegador de alvos (@emph{Targets}) no painel principal (@emph{Main}) e clique sobre o "World" para selecionar o referido mundo novamente. Agora clique sobre o bot@~{a}o "Olhar Para" (@emph{Look At}) no painel de ferramentas (@emph{Tools}). Voc@^{e} pode ver o dodecaedro e o tetraedro ajustando-se ao meio da janela (figura @pxref{figlookatworld}). O bot@~{a}o "Olhar Para" (@emph{Look At}) posiciona a c@^{a}mera em uma posi@,{c}@~{a}o tal que o objeto alvo fique centrado na janela. @float Figure,figlookatworld @image{figs/fig2} @caption{Olhando para o Mundo.} @end float Agora coloque o cursor sobre o meio do dodecaedro e d@^{e} sobre ele um duplo clique com o bot@~{a}o direito do mouse. Isso significa clicar no mouse para baixo e para cima duas vezes em uma r@'{a}pida sucess@~{a}o. Note que o dodecaedro torna-se o objeto alvo; voc@^{e} pode ver isso no navegador de alvos (@emph{Targets}) do painel principal (@emph{Main}). Um duplo clique no bot@~{a}o direito do mouse sobre um objeto @'{e} outra forma de fazer esse objeto tornar-se o objeto alvo. @float Figure,figappearance @image{figs/ap} @caption{A Painel Apar@^{e}ncia.} @end float V@'{a} para o menu @emph{Inspect} no topo do painel principal (@emph{Main}) e selecione Apar@^{e}ncia (@emph{Appearance}). Isso faz aparecer o painel "Apar@^{e}ncia" (@emph{Appearance}). Quando ele aparece, se estiver parcialmente obscurecido por outra janela do Geomview voc@^{e} pode mov@^{e}-lo para um lado arrastando sua moldura com o bot@~{a}o do meio do mouse pressionado. O painel Apar@^{e}ncia (@emph{Appearance}) permite a voc@^{e} controlar v@'{a}rias coisas sobre a maneira como o Geomview desenha objetos. Note os bot@~{o}es rotulados com @emph{[af] Faces} e @emph{[ae] Edges} (arestas). Clique sobre o @emph{[ae] Edges} uma vez, e note que Geomview est@'{a} agora ressalta/destaca as arestas do dodecaedro. Clique sobre o @emph{[ae] Edges} novamente e as arestas desaparecem. Clique muitas vezes e assista as arestas indo e voltando. Quando voc@^{e} tiver feito isso o suficiente, deixe as arestas habilitadas e clique sobre o bot@~{a}o @emph{[af] Faces}. Essa a@,{c}@~{a}o alterna entre exibir ou n@~{a}o as faces. Clique sobre o bot@~{a}o novamente para de forma que a exibi@,{c}@~{a}o das face fique habilitada. Agora clique sobre o bot@~{a}o @emph{[Cf] Faces} sob a palavra @emph{COLOR}. Um painel de escolha de cores aparecer@'{a} (@pxref{figcolorchooser, Figure}). @float Figure,figcolorchooser @image{figs/color} @caption{Painel de Escolha de Cores.} @end float @ifset forms Coloque o cursor no hex@'{a}gono de cor nesse painel e pressione o bot@~{a}o esquerdo do mouse. Lentamente mova o mouse em torno desse ponto. Isso arrasta o pequeno ponto negro em volta para escolher uma nova cor para o dodecaedro. @end ifset @ifclear forms Note os tr@^{e}s bot@~{o}es deslizantes, @emph{H}, @emph{S}, e @emph{V}, controlando a matiz (@emph{hue}), satura@,{c}@~{a}o, e valor (ilumina@,{c}@~{a}o). Clicando sobre o bot@~{a}o @emph{HSV} fornece um diferente conjunto de bot@~{o}es deslizantes, um para vermelho (@emph{red}), outro para verde (@emph{green}), e outro para azul (@emph{ blue}). Valores num@'{e}ricos para ambos os sistemas de cores RGB e HSV podem ser vistos ou editados na parte inferior do painel. @end ifclear A cor iinicial do dodecaedro foi especificada no arquivo @file{dodec} que voc@^{e} chamou quando iniciamos o Geomview. A cor que voc@^{e} especificou com o painel de cores sobrescreveu as cores antigas. Voc@^{e} pode ajustar a intensidade da cor com o bot@~{a}o deslizante @emph{Intensity}. Quando voc@^{e} encontrar uma cor que voc@^{e} gosta, clique sobre o bot@~{a}o @emph{Done}. Agora coloque o cursor do mouse em algum lugar sobre sobre o fundo cinza da janela de c@^{a}mera e duplo-clique no bot@~{a}o direito; isso seleciona "World" como objeto alvo. Clique no bot@~{a}o @emph{Look At} para para olhar para o mundo novamente. Note que no painel de Apar@^{e}ncia (@emph{Appearance}) as escolhas dos bot@~{o}es se modificavam @`{a} medida que o lado esquerdo tamb@'{e}m mudava com o dodecaedro. Isso ocoore porque o painel @emph{Appearance} sempre mostra as escolhas para o objeto alvo, que agora @'{e} o mundo, o qual ainda tem suas escolhas padr@~{a}o. Clique sobre o bot@~{a}o @emph{[ab] BBox} sob a palavra @emph{Draw}. A caixa associada desaparece. agora pona o cursor de volta na janela de c@^{a}mera. No teclado, digite as teclas @kbd{a }b. Note que a caixa associada aparece novamente. @kbd{a }b @'{e} o atalho de teclado para o bot@~{a}o que alterna entre a exibi@,{c}@~{a}o ou n@~{a}o da caixa associada; a seq@"{u}@^{e}ncia de caracteres "[ab]" aparece sobre o bot@~{a}o para indicar isso. A maioria dos bot@~{o}es do Geomview possuem atalhos de teclado que voc@^{e} pode usar se preferir. Isso ser@'{a} @'{u}ltil quando voc@^{e} estiver familiarizado com o Geomview e n@~{a}o quiser ter de se mover entre uma montanha de pain@'{e}is. Agora selecione o tetraedro, use qualquer das duas formas: duplo-clicando o bot@~{a}o direito do mouse sobre o tetraedro, ou selecionando "tetra" no navegador de alvos (@emph{Targets}). Ent@~{a}o clique sobre o bot@~{a}o @emph{Delete} do menu @emph{Edit} no painel principal (@emph{Main}). O tetraedro deve desaparecer. Essa @'{e} a forma de voc@^{e} se livrar de um objeto. Voc@^{e} pode tamb@'{e}m chamar objetos de dentro do Geomview. Clique sobre o menu @emph{File} no painel principal (@emph{Main}) e escolha abrir (@emph{Open}). O painel de arquivos (@emph{Files}) ir@'{a} aparecer. @c Abaixo do meio desse painel, onde se l@^{e} @emph{Path List}, temos um navegador com tr@^{e}s linhas detro dele; a segunda linha @'{e} um diret@'{o}rio com montanhas de exemplos do Geomview dentro dele. Clique sobre aquela segunda linha; @pxref{figfilespanel, Figure}. Role para baixo na lista de arquivos at@'{e} voc@^{e} ver @file{tref.off}. Clique sobre aquela linha, e ent@~{a}o clique sobre o bot@~{a}o @emph{OK}. Um grande tubo em forma de trevo ir@'{a} aparecer em sua janela. Clique sobre o bot@~{a}o @emph{Hide} no painel @emph{Files} para dispensar o painel. @float Figure,figfilespanel @image{figs/secondlinelist} @caption{O Painel de Arquivos.} @end float Agora clique sobre o bot@~{a}o @emph{Reset} no painel de ferramentas (@emph{Tools}). Isso far@'{a} com que todas as figuras rtornem ao centro da janela de c@^{a}mera. Voc@^{e} pode ver um dodecaedro e uma protuber@^{a}ncia do trevo (@pxref{figtrefdodec, Figure}). Brinque com a protuber@^{a}ncia do trevo e o dodecaedro. Fa@,{c}a experi@^{e}ncias com alguns outros bot@~{o}es no painel de ferramentas (@emph{Tools}). Tente colorir o trevo com o painel de apar@^{e}ncia (@emph{Appearance}). Para um tutorial sobre criar seus pr@'{o}prios objetos para cham@'{a}-los dentro do Geomview, veja @file{doc/oogltour} distribuido com Geomview. As coisas naquele arquivo ir@~{a}o ser incorporadas em futuras vers@~{o}es desse manual. @float Figure,figtrefdodec @image{figs/trefdodecinter} @caption{Trevo e Dodecaedro.} @end float @comment **************************************************************** @node Interaction, OOGL File Formats, Tutorial, Top @chapter Interaction Esse cap@'{i}tulo descreve como voc@^{e} interage com Geomview atrav@'{e}s do mouse e do teclado. @menu * Starting Geomview:: Iniciando o Geomview. * Command Line Options:: Op@,{c}@~{o}es de Linha de Comando. * Basic Interaction:: Intera@,{c}@~{o}es B@'{a}sicas: O Painel Principal. * Loading:: Chamando Objetos Dentro do Geomview. * Mouse Motions:: Usando o Mouse para Manipular Objetos. * Appearance:: Modificando a Forma de Ver as Coisas. * Cameras:: C@^{a}meras. * Saving:: Gravando seu Trabalho. * Commands:: O Painel de Comandos. * Keyboard Shortcuts:: Atalhos de Teclado. @end menu @comment ================================================================ @node Starting Geomview, Command Line Options, Interaction, Interaction @section Starting Geomview A forma usual para iniciar o Geomview @'{e} digitar @kbd{geomview @key{Enter}} em uma janela de shell (@key{Enter} significa pressionar a tecla "Enter"). Esse procedimento carrega o Geomview na mem@'{o}ria do computador em uns poucos segundos; uma ou mais janelas ir@~{a}o aparecer e voc@^{e} pode come@,{c}ar a interagir com o Geomview imediatamente. @'{E} tamb@'{e}m poss@'{i}vel especificar a@,{c}@~{o}es para o Geomview executar no momento de iniciar fornecendo argumentos na linha de comando do shell. Veja @ref{Command Line Options}. @comment ================================================================ @node Command Line Options, Basic Interaction, Starting Geomview, Interaction @section Command Line Options Aqui est@~{a}o as op@,{c}@~{o}es de linha de comando que o Geomview permite: @table @samp @item -b @var{r} @var{g} @var{}b Escolhe a cor de fundo da janela de c@^{a}mera para valores fornecidos de @var{r} @var{g} @var{}b. @c added by jorge @c -b 0 0 1 - azul @c -b 0 0 0 - preto @c -b 1 1 1 - branco @c -b 0.5 0.5 0.5 - cinza @item -c @var{arquivo} Interpreta os comandos GCL em @var{arquivo}, que pode ser o s@'{i}mbolo especial @file{-} para a entrada padr@~{a}o. Paa uma descri@,{c}@~{a}o de GCL, veja @ref{GCL}. @item -c @var{comando} Comandos podem tamb@'{e}m serem fornecidos literalmente, como em @example -c "(ui-panel main off)" @end example Uma vez que @var{comando} inclui par@^{e}ntesis, que possuem significado especial para o shell, @var{comando} deve receber ap@'{o}strofo. Multiplas op@,{c}@~{o}es @var{-c} s@~{a}o permitidas. @item -wins @var{n} Faz com que Geomview mostre inicialmente @var{n} janelas de c@^{a}mera. @item -wpos @var{largura},@var{altura}[@@@var{xmin},@var{ymin}] Especifica a localiza@,{c}@~{a}o inicial e o tamanho da primeira janela de c@^{a}mera. Os valores para @var{largura}, @var{altura}, @var{xmin}, e @var{ymin} est@~{a}o em coordenadas de tela (pixel). @item -M[cg][ps[un|in|in6]] @var{PIPENOME}|@var{TCPPORT} A op@,{c}@~{a}o @samp{-M} aceita modificadores: um sufixo @samp{g} espera dados geom@'{e}tricos (o padr@~{a}o), enquanto um sufixo @samp{c} espera comandos GCL. Um @samp{p} implica que a conec@,{c}@~{a}o pode usar um pipe nomeado (o padr@~{a}o para tudo exceto para "NeXT"), enquanto @samp{s} implica no uso de um "UNIX-domain socket" (o padr@~{a}o em "NeXT"). Uma vez que na vers@~{a}o 1.9 do Geomview "Internet domain sockets" s@~{a}o tamb@'{e}m suportados; use @samp{sin} para fazer o Geomview escutar uma porta IPv4 fornecida por @var{TCPPORT}, ou use @samp{sin6} para fazer Geomview escute uma porta IPv6 (tamb@'{e}m como especificado em @var{TCPPORT}). @samp{sun} @'{e} um sin@^{o}nimo para @samp{s}, i.e. use o "Unix domain socket" com o nome @var{PIPENOME}. Se @var{PIPENOME} inicia com uma barra ('/'), ent@~{a}o esse nome @'{e} assumido ser um caminho absoluto, de outra forma o pipe nomeado ou socket @'{e} criado sob o diret@'{o}rio @file{$@{TMPDIR@}/geomview/}. @b{Escutando fluxo de comando em portas TCP pode ser um risco de seguran@,{c}a, como Geomview por si mesmo n@~{a}o toma nenhum tipo de precau@,{c}@~{a}o de seguran@,{c}a, Geomview simplesmente executa todos os comandos alimentados a ele atrav@'{e}s do socket de rede. Isso tamb@'{e}m implica entrada e sa@'{i}da para unidades de armazenamento locais devem ser permitidas remotamente.} Exemplos: @table @code @item -M @var{nome_de_objeto} Mostra (possivelmente mudando dinamicamente) geometria enviada de programas @code{geomstuff} ou @code{togeomview}. Essa op@,{c}@~{a}o "-M" escuta o pipe nomeado @file{/tmp/geomview/nome_de_objeto}; voc@^{e} pode conseguir o mesmo efeito com os comandos de shell abaixo: @example mkdir /tmp/geomview mknod /tmp/geomview/nome_de_objeto p @end example (assumindo que o diret@'{o}rio e o pipe nomeado n@~{a}o existam atualmente), ent@~{a}o executando o comando GCL: @example (geometry nome_de_objeto < /tmp/geomview/nome_de_objeto) @end example (@pxref{geometry,@code{(geometry @dots{})}}) @item -Mc @var{pipenome} Como @samp{-M} acima, mas espera comandos GCL, em lugar de dados geom@'{e}tricos OOGL, na conec@,{c}@~{a}o. @item -Mcs nome L@^{e} comandos a partir do "UNIX-domain socket" nomeado. @file{/tmp/geomview/nome} @item -Mcsin 40000 L@^{e} comandos a partir da porta IPv4 @samp{40000}. Geomview por si mesmo n@~{a}o toma qualquer precau@,{c}@~{a}o de seguran@,{c}a, de forma que "-Mcsin 40000" pode ser um risco de seguran@,{c}a. @end table @item -noopengl Desabilita o uso de OpenGL para (possivelmente) convers@~{a}o acelerada de hardware, mesmo que o bin@'{a}rio do Geomview tenha suporte a OpenGL compilado internamente. "-noopengl" tamb@'{e}m desabilita o suporte a transpar@^{e}ncia e texturas na janelas de c@^{a}mera. Instant@^{a}neos "RenderMan" ainda ter@~{a}o a transpar@^{e}ncia correta e suporte a alguma textura limitada. @item -nopanels Inicia sem mostrar nenhum painel, somente a janelas gr@'{a}ficas. Pain@'{e}is podem ser invocados mais tarde da forma usual com as teclas de atalho @kbd{Px} ou com comando @code{ui-panel}. Veja @ref{ui-panel, @code{(ui-panel @dots{})}}. @item -noinit N@~{a}o l@^{e} nenum arquivo de inicializa@,{c}@~{a}o. Por padr@~{a}o, geomview l@^{e} o arquivo @file{.geomview} do systema, seguido daqueles em @file{$@{HOME@}/.geomview} e em @file{./.geomview}. @item -e @var{modulo} Inicial um m@'{o}dulo externo; @var{modulo} @'{e} o nome associado ao m@'{o}dulo chamado, aparecendo no painel principal no navegador de "Applications", como definido pelo comando @code{emodule-define}. Veja @ref{emodule-define, @code{(emodule-define @dots{})}}. @item -start @var{module} @var{args} @dots{} Como -e mas permite a voc@^{e} enviar argumentos para o m@'{o}dulo externo. "--" sinaliza o fim da lista de argumentos; o "--" pode ser omitido se for o @'{u}ltimo argumento na linha de comando do Geomview. @item -run @var{coamando-shell} @var{args} @dots{} Como "-start" mas toma o caminho de arquivos do execut@'{a}vel do m@'{o}dulo externo em lugar do nome do m@'{o}dulo. Os caminhos de arquivo de todos os diret@'{o}rios de m@'{o}dulos conhecidos s@~{a}o anexados ao final do caminho de busca do UNIX quando for invocado o @var{comando-shell}. @end table @comment ================================================================ @node Basic Interaction, Loading, Command Line Options, Interaction @section Basic Interaction: The Main Panel Normalmente quando voc@^{e} invoca Geomview, tr@^{e}s janelas aparecem: O painel principal (@emph{Main}), o painel de ferramentas (@emph{Tools}), e uma janela de c@^{a}mera. Geomview tem muitas outras janelas mas muitas coisas podem ser realizadas com essas tr@^{e}s de forma que por padr@~{a}o as outras n@~{a}o aparecem. Essa se@,{c}@~{a}o do manual introduz alguns conceitos b@'{a}sicos que s@~{a}o usados nas se@,{c}@~{o}es restantes do manual e descreve o painel principal (@emph{Main}). @c @float Figure,figmainpanel @image{figs/main} @caption{The Main Panel} @end float @c Geomview pode mostrar um n@'{u}mero arbitr@'{a}rio de objetos simultaneamente. O navegador @emph{Targets} no painel principal (@emph{Main}) mostra uma lista de todos os objetos dos quais Geomview atualmente abertos. Esse navegador tem uma linha para cada objeto que voc@^{e} tiver chamado, adicionalmente algumas linhas para outros objetos. Um desses outros objetos @'{e} chamado @code{World} e corresponde a a todos os objetos atualmente chamados, tratados como se eles fossem um objeto. A maioria das opera@,{c}@~{o}eos que voc@^{e} pode fazer sobre um objeto, tais como aplicar um movimento ou mudar uma cor, pode tamb@'{e}m ser feita para o objeto "World". O navegador de alvos (@emph{Targets}) tamb@'{e}m possui uma entrada para cada c@^{a}mera. Por padr@~{a}o existe somente uma c@^{a}mera; @'{e} poss@'{i}vel adicionar mais delas atrav@'{e}s da entrada @emph{New Camera} do painel principal (@emph{Main}) via menu @emph{File}. Geomview trata c@^{a}meras na maioria das vezes como trata objetos geom@'{e}tricos. Por exemplo, voc@^{e} pode mover c@^{a}meras pelas proximidades e adicion@'{a}-las e apag@'{a}-las como objetos geom@'{e}tricos. C@^{a}meras n@~{a}o s@~{a}o mostradas na tela como um objeto que voc@^{e} v@^{e}. Cada c@^{a}mera tem uma janela de c@^{a}mera separada que mostra a vis@~{a}o como vista atrav@'{e}s da lente daquela c@^{a}mera. (@'{E} pass@'{i}vel para cada c@^{a}mera mostrar uma representa@,{c}@~{a}o geom@'{e}trica de outras c@^{a}meras. Veja @ref{Cameras}.) Devido ao fato de Geomview tratar c@^{a}meras e objetos geom@'{e}tricos muito similarmente, o termo @dfn{objeto} nessa documenta@,{c}@~{a}o @'{e} usado para referir-se a qualquer dos dois indistintamente. Quando precisamos disting@"{u}ir entre os dois tipos de objetos, usamos o termo "@dfn{geom}" para denotar um objeto geom@'{e}trico e a palavra @dfn{c@^{a}mera} para denotar uma c@^{a}mera. O objeto que est@'{a} selecionado (luminosidade alta) no navegador "@emph{Targets}" @'{e} chamado objeto alvo. Esse @'{e} o objeto que recebe quaisquer a@,{c}@~{o}es que voc@^{e} faz com o mouse ou com o teclado. Voc@^{e} pode mudar o objeto alvo selecionando uma linha diferente no navegador de alvos (@emph{Targets}). Outro caminho de modificar o objeto alvo @'{e} colocar o cursor do mouse diretamente sobre um geom na janela de c@^{a}mera e rapidamente dar um duplo clique no bot@~{a}o direito do mouse. Esse processo @'{e} chamado @dfn{selecionar}; o objeto selecionado torna-se o novo alvo. Objetos do Geomview s@~{a}o todos conhecidos por dois nomes, ambos dos quais s@~{a}o mostrados no navegador de alvos (@emph{Targets}). O primeiro nome l@'{a} fornecido, que aparece entre colch@^{e}tes ([ ]), @'{e} um nome curto atribuido pelo Geomview quando voc@^{e} chama o objeto. Esse nome consiste da letra `g' para geometria e da letra `c' para c@^{a}meras, seguindo por um n@'{u}mero. O segundo nome @'{e} maior e mais descritivo; por padr@~{a}o esse @'{e} o nome do arquivo do qual o objeto foi chamado. Os dois nomes s@~{a}o equivalentes at@'{e} no que diz respeito ao Geomview; em qualquer ponto onde voc@^{e} precisar especificar um nome voc@^{e} pode fornecer qualquer dos dois. Para manipular um objeto, esteja certo de que aquele objeto que voc@^{e} quer mover seja o objeto alvo, e coloque o cursor do mouse em uma janela de c@^{a}mera. Movimentos s@~{a}o aplicados pressionando ou o bot@~{a}o esquerdo ou o bot@~{a}o do meio do mouse e movendo o mouse. Existem muitos modos de movimento diferentes, cada modo de movimento aplicando um diferente tipo de movimento. O navegador de modos de movimento (@emph{MOTION MODE}) no painel principal indica o modo de movimento atual. O padr@~{a}o @'{e} a rota@,{c}@~{a}o ("Rotate"). Voc@^{e} pode mudar o modo corrente de movimento selecionando um no modo de movimento no navegador de modos de movimento (@emph{MOTION MODE}), ou usando o painel de ferramentas (@emph{Tools}). Para maiores informa@,{c}@~{o}es sobre modos de movimento, veja @ref{Mouse Motions}. O navegador de m@'{o}dulos (@emph{Modules}) lista m@'{o}dulos externos do Geomview. Um m@'{o}dulo externo @'{e} um programa separado que interage com Geomview para extender suas funcionalidades. Para informa@,{c}@~{o}es sobre m@'{o}dulos externos, veja @ref{Modules}. @ifset forms O bot@~{a}o @emph{Load} no painel principal @emph{Main} faz surgir o painel de arquivos (@emph{Files}) para chmar um arquivo. O arquivo pode conter ou um geom, ou uma c@^{a}mera, ou comandos GCL. Para detalhes, veja @ref{Loading}. O bot@~{a}o @emph{Delete} faz com que o objeto alvo seja apagado. Geomview seleciona outro objeto para ser o novo alvo. Voc@^{e} pode apagar c@^{a}meras da mesma forma que geoms dessa forma. Se voc@^{e} pressionar o bot@~{a}o delete @emph{Delete} enquanto o objeto alvo for "World", Geomview aagar@'{a} todos os geoms. Os tr@^{e}s bot@~{o}es na parte de baixo do painel principal (@emph{Main}), rotulados @emph{Euclidean}, @emph{Hyperbolic}, e @emph{Spherical}, permitem a voc@^{e} modificar a geometria do espa@,{c}o que Geomview mostra. Por padr@~{a}o @emph{Euclidean} @'{e} selecionado. Para detalhes sobre como usar espa@,{c}os @emph{Hyperbolic} e @emph{Spherical}, veja @ref{Non-Euclidean Geometry}. @end ifset @ifclear forms A barra de menu no topo do painel principal oferece menus para opera@,{c}@~{o}es comuns. Para criar novas janelas, chame novos objetos, grave os objetos ou outras informa@,{c}@~{o}es, ou saia do geomview, veja o menu @emph{File}. Para copiar ou apagar objetos, veja o menu @emph{Edit}. Voc@^{e} pode chamar qualquer painel a partir do menu @emph{Inspect}. O menu @emph{Space} permite a voc@^{e} escolher se geomview trabalha no modo Euclidiano, Hiperbolico ou Esf@'{e}rico. O modo Euclideano @'{e} usado por padr@~{a}o. Para detalhes sobre a utiliza@,{c}@~{a}o do modo espa@,{c}o @emph{Hyperbolic} e do modo @emph{Spherical}, veja @ref{Non-Euclidean Geometry}. @end ifclear A maioria das a@,{c}@~{o}es que voc@^{e} pode fazer atrav@'{e}s dos pain@'{e}is do Geomview possuem equivalentes atalhos de teclado de forma que voc@^{e} pode fazer a mesma a@,{c}@~{a}o atav@'{e}s de digita@,{c}@~{a}o de uma seq@"{u}@^{e}ncia de teclas no teclado. Isso @'{e} @'{u}til para usu@'{a}rios avan@,{c}ados que est@~{a}o familiarizados com as capacidades do Geomview e querem trabalhar rapidamente sem ter montanhas de pain@'{e}is amontoando-se na tela. Atalhos de teclado s@~{a}o usualmente indicados ente colch@^{e}tes ([ ]) pr@'{o}ximo ao item correspondente em um apinel. Por exemplo, o atalho de teclado para o modo @emph{Rotate} @'{e} 'r'; isso @'{e} indicado par "[r]" que aparece antes da palavra "Rotate" no navegador @emph{MOTION MODE}. Para usar esse atalaho de teclado, apenas pressione a tecla @kbd{r} enquanto o cursor do mouse estiver em qualquer janela do Geomview. N@~{a}o @'{e} necess@'{a}rio pressionar a tecla @kbd{@key{Enter}} posteriormente. Alguns atalhos de teclado consistem em mais de uma tecla. Nesses caso apenas digite as teclas uma ap@'{o}s a outra, sem pressionar @kbd{@key{Enter}} posteriormente ou entre as teclas pressionadas. Atalhos de teclado s@~{a}o sens@'{i}veis @`{a} caixa alta/baixa. Muitas teclas de atalho podem ser precedidas de um par@^{a}metro num@'{e}rico. Por exemplo, digitando @code{ae} muda o estado do desenho de arestas, enquanto @code{1ae} sempre habilita o desenho de arestas. O campo @emph{keyboard} no canto superior esquerdo do painel principal (@emph{Main}), imediatamente acima da palavra "Targets", ecoa o estado atual das teclas de atalho. @ifset forms O bot@~{a}o rotulado @emph{?} pr@'{o}ximo ao canto superior direito do painel principal (@emph{Main}) faz com que Geomview mostre uma lista de todos os atalhos de teclado na sa@'{i}da padr@~{a}o. O bot@~{a}o @emph{Quit} no painel principal encerra o Geomview. @end ifset @ifclear forms Para uma lista de todas as teclas de atalho, pressione a telca @emph{@code{?}}. @end ifclear @comment ================================================================ @node Loading, Mouse Motions, Basic Interaction, Interaction @section Loading Objects Into Geomview Existem muitos caminhos para chamar um objeto dentro do Geomview. @table @asis @item No painel de arquivos (@emph{Files}) Se voc@^{e} clicar no bot@~{a}o @emph{Load} no painel principal do Geomview (@emph{Main}), o painel de arquivos (@emph{Files}) ir@'{a} aparecer. @float Figure,figmyfilelist @image{figs/myfilelist} @caption{O Painel de Arquivos.} @end float Esse painel permite que voc@^{e} selecione um arquivo a partir de uma variedade de diret@'{o}rios. O topo do painel @'{e} um navegador de arquivos padr@~{a}o do Motif. Abaixo deste est@'{a} uma lista de diret@'{o}rios no caminho de busca padr@~{a}o do Geomview; clique sobre um desses para navegar entre os arquivos naquele diret@'{o}rio. Para selecionar um arquivo, duplo-clique sobre o seu nome no navegador no canto superior direito, ou clique sobre o seu nome e pressione a tecla @key{Enter}, ou ainda digite o nome do arquivo dentro da caixa de texto na parte inferior do navegador e pressione a tecla @key{Enter}. @refill Se o arquivo selecionado contiver dados geom@'{e}tricos OOGL, esse arquivo ir@'{a} ser adicionado ao navegador de alvos (@emph{Targets}) do geomview. Se esse arquivo contiver comandos GCL em lugar de conter dados geom@'{e}tricos OOGL, o arquivo ser@'{a} interpretado. Veja @ref{GCL}. Quando o apinel de arquivos (@emph{Files}) aparecer pela primeira vez, o diret@'{o}rio selecionado no navegador de diret@'{o}rios @'{e} o diret@'{o}rio atual --- que corresponde ao diret@'{o}rio a partir do qual voc@^{e} chamou o Geomview. O navegador de arquivos mostra @emph{todos} os arquivos nesse diret@'{o}rio, incluindo os que n@~{a}o s@~{a}o arquivos do Geomview. Se voc@^{e} tentar chamar u arquivo que n@~{a}o contenha nem um objeto OOGL nem comandos do Geomview, o Geomview ir@'{a} mostrar uma mensagem de errp. O navegador de diret@'{o}rios tamb@'{e}m lista um segundo e um terceiro diret@'{o}rios adicionalmente al@'{e}m do diret@'{o}rio atual. O segundo, que termina em @file{data/geom}, @'{e} o diret@'{o}rio de exemplos de dados do Geomview. Esse diret@'{o}rio cont@'{e}m uma grande variedade de amostras de objetos. Esse diret@'{o}rio tamb@'{e}m cont@'{e}m muitos subdiret@'{o}rios. Em particular, os subdiret@'{o}rios @file{hyperbolic} e o subdiret@'{o}rio @file{spherical} possuem amostras de objetos hiperb@'{o}licos e esf@'{e}ricos, respectivamente. Entradas no navegador de diret@'{o}rios s@~{a}o vistas apenas como entradas de arquivos; para visualizar um subdiret@'{o}rio, clique sobre o nome do referido diret@'{o}rio. O terceiro diret@'{o}rio mostrado mostrado no navegador de diret@'{o}rio, que termina em @file{geom}, cont@'{e}m muitos subdiret@'{o}rios com outros arquivos do Geomview dentro deles. Esses arquivos s@~{a}o usados menos freq@"{u}@^{e}ntemente que os outros no diret@'{o}rio @file{data/geom}. Voc@^{e} pode mudar a lista de diret@'{o}rios mostra no navegador de diret@'{o}rios do painel de arquivos (@emph{Files}) usando o comando @code{set-load-path}; Veja @ref{set-load-path, @code{(set-load-path @dots{})}}. @item a tecla de atalho @kbd{<}: Se voc@^{e} digitar @kbd{<} em qualquer janela do Geomview, o painel @emph{Load} ir@'{a} aparecer. Esse painel @'{e} uma pequena vers@~{a}o do painel de arquivos (@emph{Files}); o painel @emph{Load} cont@'{e}m um campo de texto no qual voc@^{e} o nome de um arquivo a ser chamado (ou um comando GCL entre par@^{e}ntesis). Ap@'{o}s digitar o nome do arquivo a ser chamado, aperte a tecla @kbd{@key{Enter}}; Geomview ir@'{a} chamar o arquivo como se voc@^{e} o tivesse chamado com o bot@~{a}o @emph{Add} no painel de arquivos (@emph{Files}). Se, ap@'{o}s fazer surgir o pequeno painel @emph{Load} com @kbd{<}, voc@^{e} decidir que quer usar o grande painel de arquivos (@emph{Files}) ap@'{o}s tudo, pressione o bot@~{a}o @emph{File Browser}. @float Figure,figloadpanel @image{figs/load} @caption{The Load Panel.} @end float @item comandos para chamar objetos geom@'{e}tricos: Os comandos GCL @code{load}, @code{geometry}, @code{new-geometry}, e @code{read} permitem a voc@^{e} chamar um objeto dentro do Geomview; veja @ref{GCL}. Veja @ref{load, @code{(load @dots{})}}. Veja @ref{new-geometry, @code{(new-geometry @dots{})}}. Veja @ref{read, @code{(read @dots{})}}. @refill @end table @comment ================================================================ @node Mouse Motions, Appearance, Loading, Interaction @section Using the Mouse to Manipulate Objects Geomview permite a voc@^{e} manipular objetos com o mouse. Existem seis diferentes modos de movimento do mouse: rota@,{c}@~{a}o (@emph{Rotate}), transla@,{c}@~{a}o (@emph{Translate}), v@^{o}o da c@^{a}mera (@emph{Cam Fly}), zoom da c@^{a}mera (@emph{Cam Zoom}), homotetia de um objeto geom@'{e}trico (@emph{Geom Scale}), e @'{o}rbita de c@^{a}mera (@emph{Cam Orbit}). O painel de ferramentas tem um bot@~{a}o para cada um desses modos; para tracar os modos, clique sobre o bot@~{a}o correspondente. voc@^{e} pode tamb@'{e}m selecionar um modo atrav@'{e}s do navegador de modos de movimento (@emph{Motion Mode}) no painel principal (@emph{Main}).@refill Essa se@,{c}@~{a}o descreve a intera@,{c}@~{a}o b@'{a}sica com o mouse. Para detalhes, veja @ref{Commands}. @float Figure,figtools @image{figs/tools} @caption{O Painel de Ferramentas.} @end float Cada um dos modos de movimento usa um paradigma comum para como o movimento @'{e} aplicado. Em particular, cada modo de movimento depende do objeto alvo (@emph{target}) atual e do atual objeto do centro (@emph{center}. O obejto alvo atual e o atual objeto do centro s@~{a}o explicados nos par@'{a}grafos seguintes. O objeto alvo atual @'{e} mostrado no campo @emph{Target} no painel de ferramentas (@emph{Tools}). Isso @'{e} o mesmo que o objeto selecionado no navegador de alvos (@emph{Targets}) no painel principal (@emph{Main}), e voc@^{e} pode mudar o alvo ou selecionando um novo objeto no navegador, digitando uma nova entrada no campo, ou selecionando um objeto na janela de c@^{a}mera duplo-clicando no bot@~{a}o direito do mouse com o cursor sobre o objeto. O atual objeto do centro @'{e} mostrado no campo @emph{Center} no painel de ferramentas(@emph{Tools}). Seu valor padr@~{a}o @'{e} a palavra especial "target", que significa que o odbjeto do centro @'{e} o objeto que estiver designado como objeto alvo. Voc@^{e} pode mudar o objeto atual do centro para qualquer objeto digitando seu nome no campo @emph{Center}. A or@'{i}gem do objeto do centro @'{e} mantido fixo no modo rota@,{c}@~{a}o @emph{Rotate} e no modo @emph{Orbit}. Normalmente o objeto do centro @'{e} um dos objetos geom@'{e}tricos (geoms) existentes listados no navegador de alvos (@emph{Targets}), o centro atual das rota@,{c}@~{o}es @'{e} a or@'{i}gem daquele sistema de coordenadas daquele objeto. @'{E} poss@'{i}vel, todavia, selecionar um ponto arbitr@'{a}rio de interesse sobre um objeto como o centro. Para detalhes, veja @ref{Point of Interest}. Isso tamb@'{e}m @'{e} poss@'{i}vel mudando o bot@~{a}o @emph{BBox Center} para escolher o centro de movimento como sendo o centro do objeto atual da caixa associada. Uma vez modificado o centro da caixa geom@'{e}trica ativa associada ir@'{a} tornar-se o centro do movimento, se voc@^{e} selecionar outro objeto, ent@~{a}o o centro do movimento ir@'{a} tornar-se o centro da caixa associada @`{a} aquele objeto. Nada modifica@,{c}@~{a}o ocorrer@'{a} quando uma c@^{a}mera ou o mundo (@emph{World}) for selecionado, voc@^{e} tem que digitar a palavra @code{target} no campo @emph{Center} para retornar ao valor padr@~{a}o. Voc@^{e} aplica um movimento de mouse pressionando ou o bot@~{a}o esquerdo ou o bot@~{a}o do meio do mouse com o cursor em uma janela de c@^{a}mera e movendo o mouse. A maioria dos modos de movimento possui in@'{e}rcia (@emph{inertia}), que significa que se voc@^{e} soltar o bot@~{a}o enquanto move o mouse, o movimento ir@'{a} continuar. Para imaginar a in@'{e}rcia pode ser @'{u}til imaginar o cursor do mouse como sendo uma al@,{c}a; quando voc@^{e} pressiona um bot@~{a}o do mouse para baixo, o mouse agarra firmemente no objeto alvo e voc@^{e} pode mover esse objeto. Quando voc@^{e} libera o bot@~{a}o do mouse, a al@,{c}a libera o objeto. Liberando o bot@~{a}o do mouse enquanto move o mesmo @'{e} como abandonar o objeto --- o objeto continua movendo-se independentemente do mouse. In@'{e}rcia pode ser desligada; veja o menu de movimento (@emph{Motion}) no painel principal (@emph{Main}), descrito abaixo. Generally, the bot@~{a}o esquerdo do mouse controla movimento no plano da tela, enquanto o bot@~{a}o m@'{e}dio do mouse controla movimento ao longo ou em torno da dire@,{c}@~{a}o de avan@,{c}o. Pressionando o tecla "shift" enquanto arrasta com o bot@~{a}o esquerdo ou m@'{e}dio do mouse na maioria dos modos de movimento fornece movimentos de baixa velocidade , @'{u}til para ajustes finos. Voc@^{e} pode selecionar qualquer ponto sobre um objeto (n@~{a}o apenas sua or@'{i}gem) como centro do movimento pressionando a tecla "shift" enquanto clica no bot@~{a}o direito do mouse; isso escolhe o ponto de interesse. @table @emph @item Rotate No modo rota@,{c}@~{a}o (@emph{Rotate}), pressione o bot@~{a}o esquerdo do mouse para rotacionar o objeto alvo en torno do objeto do centro. A rota@,{c}@~{a}o ocorre na dire@,{c}@~{a}o que voc@^{e} move o mouse. Especificamente, o eixo de rota@,{c}@~{a}o passa atrav@'{e}s da or@'{i}gem do objeto do centro, @'{e} paralelo ao plano de vis@~{a}o da c@^{a}mera, e @'{e} perpendicular @`{a} dire@,{c}@~{a}o do movimento do mouse. Quando o centro for o alvo ("target"), isso significa que o objeto alvo rotaciona em torno de sua pr@'{o}pria or@'{i}gem. O bot@~{a} do meio do mouse no modo de movimento tipo rota@,{c}@~{a}o (@emph{Rotate}) rotaciona o objeto alvo em torno de um eixo perpendicular ao plano de vis@~{a}o. @item Translate In @emph{Translate} mode, hold the bot@~{a}o esquerdo do mouse down to translate the objeto alvo in the direction of mouse movimento. The middle mouse bot@~{a}o translates the target along an axis perpendicular to the view plane. In Euclidean space, the objeto do centro is essentially irrelevant for translations. In hyperbolic and spherical spaces, where translations have a unique axis, this axis is chosen to go through the origin of the objeto do centro. @item Cam Fly @emph{Cam Fly} is a crude flight simulator that lets you fly around the scene. It works by moving the camera. Move the mouse while holding the bot@~{a}o esquerdo do mouse down to point the c@^{a}mera in a different direction. To move forward or backward, hold down the bot@~{a} do meio and move the mouse vertically. Both of these movimentos have inertia; typically the easiest way to fly around a scene is to give the c@^{a}mera a slight forward push by letting go of the bot@~{a} do meio while moving the mouse upward, and then using the left bot@~{a}o to steer. @emph{Cam Fly} affects the janela de c@^{a}mera that the mouse is in; it ignores the objeto alvo and the objeto do centro. @item Cam Orbit @emph{Cam Orbit} mode lets you rotate the current c@^{a}mera around the current center. The bot@~{a}o esquerdo do mouse does this rotation. The middle bot@~{a}o do mouse in @emph{Cam Orbit} mode acts as in @emph{Cam Fly} mode: it moves the c@^{a}mera forward or backward. In general @emph{Cam Orbit} does not move the objeto alvo, although if the current c@^{a}mera is selected as the target and the center is also the target, it will pivot that c@^{a}mera about itself just as in @emph{Cam Fly} mode. @item Cam Zoom @emph{Cam Zoom} mode lets you change the current camera's field of view with the mouse; hold the bot@~{a}o esquerdo do mouse down and move the mouse to change it. The numeric value of the field of view is shown in the @emph{FOV} field in the @emph{Camera} panel. @item Geom Scale @emph{Geom Scale} mode lets you enlarge or shrink a geom. It operates on the objeto alvo if that objeto is a geom. If the target is a camera, @emph{Geom Scale} operates on the geom that was most recently the objeto alvo. Moving the mouse while holding down the bot@~{a}o esquerdo do mouse scales the objeto either up or down, depending on the direction of mouse movimento. The center of the applied scaling transformation is the objeto do centro. Scaling is meaningful only in Euclidean space; attempts to scale are ignored in other spaces. @emph{Geom Scale} mode does not have inertia. @end table The @emph{Stop}, @emph{Look At}, @emph{Center}, and @emph{Reset} bot@~{o}es on the @emph{Tools} panel perform actions related to movimentos but do not change the current modo de movimento. @table @emph @item Stop The @emph{Stop} bot@~{a}o causes all movimentos to stop. It affects all moving objetos, not just the objeto alvo. Its tecla de atalho is @kbd{H}. The keyboard command @kbd{h}, which does not correspond to a panel bot@~{a}o, stops the current movimento for the objeto alvo only. @item Look At The @emph{Look At} bot@~{a}o causes the current c@^{a}mera to be moved to a position such that it is looking at the objeto alvo, and such that the objeto alvo more or less fills the window. The Look At command is unreliable in non-Euclidean spaces. @item Center The @emph{Center} bot@~{a}o undoes the objeto alvo's transformation, moving it back to its home position, which is where it was when you originally loaded it into Geomview. @item Reset The @emph{Reset} bot@~{a}o stops all movimento and causes all objetos to move back to their home positions. @end table The @emph{Tools} panel also sports a @emph{Main} bot@~{a}o, to invoke the main panel in case it was dismissed or buried, and a @emph{Done} bot@~{a}o to close the @emph{Tools} panel. The @emph{Main} panel's @emph{Motion} menu has special controls affecting how mouse movimentos are interpreted; the toggles are also accessible through a GCL command. @xref{ui-motion, @code{(ui-motion @dots{})}}. @table @emph @item [ui] Inertia Normally, moving objetos have inertia: if the mouse is still moving when the bot@~{a}o is released, the selected objeto continues to move. When @emph{Inertia} is off, objetos cease to move as soon as you release the mouse. @item [uc] Constrain Motion It's sometimes handy to move an objeto in a direction aligned with a coordinate axis: exactly horizontally or vertically. Selecting @emph{Constrain Motion} changes the interpretation of mouse movimentos to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical movimento. Note that the movimento is still along the X or Y axes of the c@^{a}mera in which you move the mouse, not necessarily the objeto's own coordinate system. @item [uo] Own Coordinates It's sometimes handy to move objetos with respect to the coordinate system where they were defined, rather than with respect to some camera's view. While @emph{Own Coordinates} is selected, all movimentos are interpreted that way: dragging the mouse rightward in translate mode moves the objeto in its own +X direction, and so on. May be especially useful in conjunction with the @emph{Constrain Motion} bot@~{a}o. @end table @comment ================================================================ @menu * Point of Interest:: Point of Interest. @end menu @node Point of Interest, , Mouse Motions, Mouse Motions @subsection Selecting a Point of Interest It is sometimes useful to specify a particular point on some objeto in a geomview window as the center point for mouse movimentos. You can do this by shift-clicando the bot@~{a}o direito do mouse (i.e. clique it once while holding down the shift key on the keyboard) with the cursor over the desired point. This point then becomes the @emph{point of interest}. The point of interest must be on an existing objeto. Selecting a point of interest simplifies examining a small portion of a larger objeto. Shift-right-clique sobre o an interesting point, and select @emph{Orbit} mode. Use the bot@~{a} do meio do mouse to approach, and the left mouse to orbit the point, examining the region from different directions. When you have selected a point of interest, the current objeto do centro changes to an objeto named "CENTER", which is an invisible objeto located at the point of interest. In addition, mouse movimentos for the window in which you made the selection are adjusted so that the point of interest follows the mouse. You can change the point of interest at any time by selecting a new one by shift-clicando the bot@~{a}o direito do mouse again. You can cancel the point of interest altogether by shift-clicando the right bot@~{a}o do mouse with the cursor on the background (i.e. not on any objeto). This changes the objeto do centro back to its default value, "target". The objeto named "CENTER", which serves as the objeto do centro for the point of interest, is a special kind of geom called an "alien". It does not appear in the @emph{Targets} browser. By default it has no geometry associated with it and hence is invisible. You can, however, explicitly give it some geometry using a GCL command, causing it to appear. Use the @code{geometry} command for this: @code{(geometry CENTER @var{geometry})}, where @var{geometry} is any valid geometry. For example, @code{(geometry CENTER @{ < xyz.vect @})} causes the file @file{xyz.vect}, which is one of the standard example files distributed with geomview, to be used at the geometry for CENTER. @xref{geometry, @code{(geometry @dots{})}}. What happens internally when you select a point of interest is that the center is set to the objeto called CENTER, and that objeto is positioned at the point of interest. In addition, in order for mouse movimentos to track the point of interest, the current camera's focal length is set to be the distance from the c@^{a}mera to the point of interest. You can accomplish this via GCL with the following commands: @example (if (real-id CENTER) nil (new-alien CENTER @{@})) (ui-center CENTER) (transform-set CENTER universe universe translate @var{x} @var{y} @var{z}) (merge camera @var{cam-id} @{ focus @var{d} @}) @end example @noindent where @code{(@var{x},@var{y},@var{z})} are the (universe) coordinates of the point of interest, and @var{d} is the distance from that point to the current camera, @var{cam-id}. The first command above creates the "alien" CENTER if it does not yet exist. @comment ================================================================ @node Appearance, Cameras, Mouse Motions, Interaction @section Changing the Way Things Look Geomview uses a hierarchy of appearances to control the way things look. An @dfn{appearance} is a specification of information about how something should be drawn. This can include many things such things as color, lighting, material properties, and more. Appearances work in a hierarchal manner: if a certain appearance property, for example face color, is not specified in a particular objeto's appearance, that objeto is drawn using that property from the parent appearance. If both the parent and the child appearance specify a property, the child's setting takes precedence unless the parent appearance is set to override. Every geom in Geomview has an appearance associated with it. There is also an appearance associated with the "World" geom, which serves as the parent of each individual geom's appearance. Finally, there is a global "base" appearance, which is the parent of the World appearance. The base appearance specifies reasonable values for all appearance information, and by default none of the other appearances specify anything, which means they inherit their values from the base appearance. This means that by default all objetos are drawn using the base appearance. If you change a certain appearance property for a geom, that property is used in drawing that geom. The parent appearance is used for any properties that you do not explicitly set. Geomview has three panels which let you modify appearances. @menu * Appearance Panel:: Color etc. * Materials Panel:: Surface Material properties. * Lighting Panel:: Lighting Parameters. @end menu @comment ---------------------------------------------------------------- @node Appearance Panel, Materials Panel, Appearance, Appearance @subsection The Appearance Panel The @emph{Appearance} panel lets you change most common appearance properties of the objeto alvo. @float Figure,figap @image{figs/ap} @caption{The Appearance Panel.} @end float If the target is an individual geom, then changes you make in the appearance panel apply to that geometry's appearance. If the target is the World, then appearance panel changes apply to the World appearance @emph{and} to all individual geom appearances. (Users have found that this is more desirable than having the changes only apply to the World appearance.) If the target is a camera, then appearance panel changes apply to the geom that was most recently the target. The five bot@~{o}es near the upper right corner under the word @emph{Draw} control what parts of the target geom are drawn. @table @emph @item Faces This bot@~{a}o specifies whether faces are drawn. @item Edges This bot@~{a}o specifies whether edges are drawn. @item BBox This bot@~{a}o specifies whether the bounding box is drawn. @item Vects This bot@~{a}o specifies whether VECT objetos are drawn. VECTs are a type of OOGL objeto that represent points and line segments in 3-space; they are distinct from edges of other kinds of objetos, and it is sometimes desirable to have separate control over whether they are drawn. @item Normals This bot@~{a}o specifies whether surface normal vectors are drawn. @end table The four bot@~{o}es under @emph{Color} labeled @emph{Faces}, @emph{Edges}, @emph{Normals}, and @emph{BBox} let you specify the color of the corresponding aspect of the target geom. Clicando on one of them brings up a color chooser panel. @float Figure,figcolorchooserpanel @image{figs/color} @caption{Color Chooser Panel.} @end float This panel offers two sets of sliders: H(ue) S(aturation) V(alue), or R(ed) G(reen) B(lue), each in the range 0 through 1. The square shows the current color, which is given numerically in both HSV and RGB systems in the corresponding text boxes. In the HSV color system, hue H runs from red at 0, green at .333, blue at .667, and back to red at 1.0. Saturation gives the fraction of white mixed into the color, from 0 for pure gray to 1 for pure color. Value gives the brightness, from 0 for black to 1 for full brightness. Pressing the @emph{RG}b or @emph{HSV} bot@~{a}o at top center switches the sliders to the other color system. You can adjust colors either via the sliders, or by typing in either the RGB or HSV text boxes. Clique @emph{OK} to accept the color that you have chosen, or @emph{Cancel} to retain the previous color setting. The @emph{SHADING} browser lets you specify the shading model that Geomview uses to paint the target geom. @table @emph @item Constant Every face of the objeto is drawn with a constant color which does not depend on the location of the face, the camera, or the light sources. If the objeto does not contain per-face or per-vertex colors, the diffuse color of the objeto's appearance is used. If the objeto contains per-face colors, they are used. If the objeto contains per-vertex colors, each face is painted using the color of its first vertex. @item Flat Each face of the objeto is drawn with a color that depends on the relative location of the face, the camera, and the light sources. The color is constant across the face but may change as the face, camera, or lights move. @item Smooth Each face of the objeto is drawn with smoothly interpolated colors based on the normal vectors at each vertex. If the objeto does not contain per-vertex normals, this has the same effect as flat shading. If the objeto has reasonable per-vertex normals, the effect is to smooth over the edges between the faces. @item CSmooth Each face of the objeto is drawn with exactly the specified color(s), independent of lighting, orientation, and material properties. If the objeto is defined with per-vertex colors, the colors are interpolated smoothly across the face; otherwise the effect is the same as in Constant shading style. @end table The @emph{Facing Normals} bot@~{a}o on the @emph{Appearance} panel indicates whether or not Geomview should arrange that normal vectors always face the viewer. If a normal vector points away from the viewer the color of the corresponding face or vertex usually is darker than is desired. Geomview can avoid this by using the opposite normal in shading calculations. This is the default. Using @emph{Facing Normals} can give strange flickering dark or light shading effects, though, near the horizon of a fairly smooth facetted objeto. Press this bot@~{a}o to use the normals given with the objeto. The three text fields in the lower left corner of the @emph{Appearance} panel are: @table @emph @item Line Width The width, in pixels, for lines drawn by Geomview. @item Normal Length This is actually a scale factor; when normal vectors are drawn, Geomview draws them to have a length that is their natural length times this number. @item Patch Dicing Geomview draws Bezier patches by first converting them to meshes. This parameter specifies the resolution of the mesh: if @emph{Patch Dicing} is @var{n}, then an @var{n} by @var{n} mesh is used to draw each Bezier patch. if @emph{Patch Dicing} is 1, the resolution reverts to a built-in default value. @end table The @emph{Revert} bot@~{a}o on the @emph{Appearance} panel undoes all settings in the target appearance. This causes the target geom to inherit all its appearance properties from its parent. The @emph{Appearance} panel's @emph{Override} bot@~{a}o determines whether appearance controls should override settings in the objetos themselves -- for example, setting the face color will affect all faces of objetos with multi-colored facets. Otherwise, appearance controls only provide settings which the objetos themselves do not specify. By default, @emph{Override} is enabled. This bot@~{a}o applies to all objetos, and to all appearance-related panels. @comment ---------------------------------------------------------------- @node Materials Panel, Lighting Panel, Appearance Panel, Appearance @subsection The Materials Panel The @emph{Materials} panel controls material properties of surfaces. It works with the objeto alvo in the same way that the @emph{Appearance} panel does. @float Figure,figmatpanel @image{figs/mat} @caption{The Materials Panel.} @end float @table @emph @item Transparent This bot@~{a}o determines whether transparency is enabled. Geomview itself does not fully support transparency yet and on some machines it does not work at all. (The missing piece is implementation of a depth-sorting algorithm in the rendering engine; not difficult, but just not done yet.) Use RenderMan if you want real transparency: when transparency is enabled, a RenderMan snapshot will contain the alpha information. @item Alpha This slider determines the opacity/transparency when transparency is enabled. 0 means totally transparent, 1 means totally opaque. @item Diffuse Reflectance This slider controls the diffuse reflectance of a surface. This has to do with how much the surface scatters light that it reflects. @item Shininess This slider controls how shiny a surface is. This determines the size of specular highlights on the surface. Lower values give the surface a duller appearance. @item Ambient Reflectance This slider controls how much of the ambient light a surface reflects. @item Specular Reflectance This slider controls the specular reflectance of a surface. This has to do with how directly the surface reflects light rays. Higher values give brighter specular highlights. @item Done This bot@~{a}o dismisses the @emph{Materials} panel. @end table @comment ---------------------------------------------------------------- @node Lighting Panel, , Materials Panel, Appearance @subsection The Lighting Panel The @emph{Lighting} panel controls the number, position, and color of the light sources used in shading. @float @image{figs/light} @caption{The Lighting Panel.} @end float The @emph{Lighting} panel is different from the @emph{Appearance} and @emph{Material} panels in that it always works with the base appearance. This is because it usually makes sense to use the same set of lights for drawing all objetos in your scene. @table @emph @item LIGHTS The @emph{LIGHTS} browser shows the currently selected light. Changes made using the other widgets on this panel apply to this light. There is always at least one light, the ambient light. @item Intensity This slider controls the intensity of the current light. @item Color This bot@~{a}o brings up a color chooser which lets you select the color of the current light. @item Add This bot@~{a}o adds a light. @item Delete This bot@~{a}o deletes the current light. @item Show Lights This bot@~{a}o lets you see and change the positions of the light sources in a janela de c@^{a}mera. Each light is drawn as long cylinder which is supposed to remind you of a light beam. When you clique sobre o the @emph{Show Lights} bot@~{a}o Geomview goes into "light edit" mode, during which you can rotate current light by holding down the bot@~{a}o esquerdo do mouse and moving the mouse. Lights placed in this way are infinitely distant, so what you are changing is the angular position. Clique sobre o the @emph{Show Lights} bot@~{a}o again to return to the previous modo de movimento and to quit drawing the light beams. @item Done This bot@~{a}o dismisses the @emph{Lighting} panel. @end table Geomview's @emph{Appearance}, @emph{Materials}, and @emph{Lighting} panels are constructed to allow you to easily do most of the appearance related things that you might want to do. The appearance hierarchy that Geomview supports internally, however, is very complex and there are certain operations that you cannot do with the panels. The Geomview command language (GCL) provides complete support for appearance operations. In particular, the @code{merge-baseap} command can be used to change the base appearance (which, except for lighting, cannot be changed by Geomview's panels). The @code{merge-ap} command can be used to change an individual geom's appearance. Appearances can also be specified in OOGL files; for details, @pxref{Appearances}. @xref{merge-baseap,@code{(merge-baseap @dots{})}}. @xref{merge-ap,@code{(merge-ap @dots{})}}. @comment ================================================================ @node Cameras, Saving, Appearance, Interaction @section Cameras A c@^{a}mera in Geomview is the objeto that corresponds to a janela de c@^{a}mera. By default there is only one camera, but it is possible to have as many as you want. You can control certain aspects of the way the world is drawn in each janela de c@^{a}mera via the @emph{Cameras} panel. @float Figure,figcamerapanel @image{figs/cam} @caption{The Cameras Panel.} @end float If the objeto alvo is a camera, the @emph{Cameras} panel affects that camera. If the objeto alvo is not a camera, the @emph{Cameras} panel affects the @dfn{current camera}. The current c@^{a}mera is the c@^{a}mera of the window that the mouse cursor is in, or was in most recently if the cursor is not in a janela de c@^{a}mera. Thus, if you use the keyboard shortcuts for the actions in the @emph{Cameras} panel while the cursor is in a janela de c@^{a}mera, the actions apply to that camera, unless you have explicitly selected another camera. To create new janelas de c@^{a}mera, use the @kbd{v+} tecla de atalho, or see the @emph{File} menu on the @emph{Main} panel. @table @emph @item Single-Buffering Normally, geomview windows are @emph{double-buffered}: geomview draws the next picture into a hidden window, then switches buffers to make it visible all at once. On many systems, the memory for the hidden buffer comes from stealing half the bits in each screen pixel, reducing the color resolution. When single-buffering is enabled, the window flickers as each scene is being drawn, but you may get smoother images with reduced grainy dithering artifacts. Single-buffering is possible if Geomview is compiled with GL or OpenGL, but not with plain-X graphics. @item Dither Many displays offer less than the 24 bits per pixel (8 bits each of red, green, and blue) conventionally needed to show smooth gradations of color. When trying to show a color not accurately available on the display, Geomview normally @emph{dithers}, choosing pixel colors sometimes brighter, sometimes darker than the desired value, so that the average color over an area is a better approximation to the true color than a single pixel could be. Effectively this loses spatial resolution to gain color resolution. This isn't always desirable, though. Turning @emph{Dither} off gives less grainy, but less accurately colored, images. @item Software Shading This bot@~{a}o controls whether Geomview does shading calculations in software. The default is to let the hardware handle them, and in Euclidean space this is almost certainly best because it is faster. In hyperbolic and spherical space, however, the shading calculations that the hardware does are incorrect. Clique this bot@~{a}o to turn on correct but slower software shading. @item Background Color This bot@~{a}o brings up a color chooser which you can use to set the background color of the camera's window. @item PROJECTION This browser lets you pick between perspective and orthogonal projection for this camera. @item Near clip This determines the distance in world coordinates of the near clipping plane from the eye point. It must be a positive number. @item Far clip This determines the distance in world coordinates of the far clipping plane from the eye point. It must be a positive number and in general should be larger than the @emph{Near clip} value. @item FOV This is the camera's field of view, measured in its shorter direction. In perspective mode, it is an angle in degrees. In orthographic mode, it is the linear size of the field of view. This number can be modified with the mouse in @emph{Cam Zoom} mode. @item Focal Length The focal length is intended to suggest the distance from the c@^{a}mera to an imaginary plane of interest. Its value is used when switching between orthographic and perspective views (and during stereo viewing), so as to preserve apparent size of objetos lying at the focal distance from the camera. Focal length also affects interpretation of mouse-based translational movimentos. Speed of forward movimento (in translate, fly and orbit modes) is proportional to focal length; and objetos lying at the focal distance from the c@^{a}mera translate laterally at the same rate as the mouse cursor. Finally, in N-D projection mode, c@^{a}meras are displaced back by the focal distance from the 3-D projection of the world origin. @item Lines Closer This number has to do with the way lines are drawn. Normally Geomview's z-buffering algorithm can get confused when drawing lines that lie exactly on surfaces (such as the edges of an objeto); due to machine round-off error, sometimes the lines appear to be in front of the surface and sometimes they appear behind it. The @emph{Lines Closer} value is a fudge factor --- Geomview nudges all the lines that it draws closer to the c@^{a}mera by this amount. The number should be a small integer; try 5 or 10. 0 turns this feature off completely. Choosing too large a value will make lines visible even though they should be hidden. @item SPACE MODEL This determines the model used to draw the world. It is most useful in hyperbolic and spherical spaces. You probably don't need to touch this browser if you stay in Euclidean space. For more information about these models, @pxref{Non-Euclidean Geometry}. @table @emph @item Virtual This is the default model and represents the natural view from inside the space. @item Projective The projective model of hyperbolic and spherical space. Geoms move under isometries of the space, and c@^{a}meras move by Euclidean movimentos. By default in the projective model, the Euclidean unit sphere is drawn. In hyperbolic space this is the sphere at infinity. In Euclidean space the projective model is the same as the virtual model except that the sphere is drawn by default. @item Conformal The conformal model of hyperbolic and spherical space. Geoms move under isometries of the space, and c@^{a}meras move by Euclidean movimentos. In Euclidean space, the conformal model amounts to inverting everything in the unit sphere. @end table @item Draw Sphere This controls whether Geomview draws the unit sphere. By default the unit sphere appears in the projective and conformal models. In hyperbolic space this is the sphere at infinity. In spherical space it is the equatorial sphere. @item Done This bot@~{a}o dismisses the @emph{Cameras} panel. @end table @comment ================================================================ @node Saving, Commands, Cameras, Interaction @section Saving your work Geomview's @emph{Save} panel lets you store Geomview objetos and other information in files that you can read back into Geomview or other programs. @float Figure,figsavepanel @image{figs/save} @caption{The Save Panel.} @end float To use the @emph{Save} panel you select the desired format in the browser next to the word @emph{Save}, enter the name of the objeto you want to save in the text field next to the word @emph{for}, and enter the name of the file you wish to save to in the long text field next to the word @emph{in}. You can then either hit @kbd{@key{Enter}} or clique on the @emph{OK} bot@~{a}o. When the file has been written, the @emph{Save} panel disappears. If you want to dismiss the @emph{Save} panel without writing a file, clique the @emph{Cancel} bot@~{a}o. If you specify @file{-} as the file name, Geomview will write the file to standard output, i.e. in the shell window from which you invoked Geomview. The possible formats are given below. The kind of objeto that can be written with each format is given in parentheses. @table @emph @item Commands @asis{(any objeto)} This write a file of GCL commands containing all information about the objeto. Loading this file later will restore the objeto as well as all other information about it, such as appearance, transformations, etc. @item Geometry alone @asis{(geom)} This writes an OOGL file containing just the geometry of the objeto. @item Geometry [in world] @asis{(geom)} This writes an OOGL file containing just the geometry of the objeto, transformed under Geomview's current transformation for this objeto. Use this if you have moved the objeto from its initial position and want to save the new position relative to the world. @item Geometry [in universe] @asis{(geom)} This writes an OOGL file containing just the geometry of the geom, transformed under both the objeto's transformation and the world's transformation. @item RMan [->tiff] @asis{(camera)} Writes a RenderMan file which when rendered creates a tiff image. Transparency and texturing (the latter only to some extent) will be available. @item RMan [->frame] @asis{(camera)} Writes a RenderMan file which when rendered causes an image to appear in a window on the screen. Transparency and texturing (the latter only to some extent) will be available. @item SGI snapshot @asis{(camera)} Write an SGI raster file. A bell rings when the snapshot is complete. Only available on SGI systems. @item PPM GLX-offscreen snapshot @asis{(camera)} Render the complete scene anew into off-screen memory; GLX provides the means to use a Pixmap as rendering area. The advantage of rendering into @emph{off}-screen memory over taking screen snapshot is that the camera windows need not be mapped and even raised at the time the snapshot is taken. So with off-screen snapshot one can safely iconify the camera window (but do not close it!), activate the screen-saver and go to bed while some script advances the scenes and takes snapshots. @item PPM Screen snapshot @asis{(camera)} Take a snapshot of the given window and save it as a PPM image. If you specify a string beginning with a vertical bar (@kbd{|}) as the file name, it's interpreted as a Bourne shell command to which the PPM data should be piped, as in @samp{| pnmtotiff > snap.tiff} or @samp{| convert -geometry 50% ppm:- snap.gif}. PPM screen snapshots are only available with GL and Open GL, not plain X graphics. The window should be entirely on the screen. Geomview will ensure that no other windows cover it while the snapshot is taken. It is probably a better idea to use GLX-@emph{off-screen} snapshots, as explained above. @item PPM software snapshot @asis{(camera)} Writes a snapshot of that window's current view, as a PPM image, to the given file. The file name may be a Bourne shell command preceded by a vertical bar (@kbd{|}), as with the PPM screen snapshot. The software snapshot, though, is produced by using a built-in software renderer (related to the X-windows renderer). It doesn't matter whether the window is visible or not, and doesn't depend on GL or OpenGL. It also doesn't support some features, such as texture mapping. @item Postscript snapshot @asis{(camera)} Writes a Postscript snapshot of the camera's view. It's made by breaking up the scene into lines and polygons, sorting by depth, and generating Postscript lines and polygons for each one. Advantages over pixel-based snapshot images: resolution is very high, so edges look sharp even on high-resolution printers, or comparable-resolution images are typically much more compact. Disadvantages: depth-sorting gives good results on some scenes, but can be wildly wrong as a hidden-surface removal algorithm for other scenes. Also, Postscript doesn't offer smoothly interpolated shading, only flat shading for each facet. @item Camera @asis{(camera)} Writes an OOGL file of a camera. @item Transform [to world] @asis{(any objeto)} Writes an OOGL transform file giving Geomview's transform for the objeto. @item Transform [to universe] @asis{(any objeto)} Writes an OOGL transform file giving a transform which is the composition of Geomview's transform for the objeto and the transform for the world. @item Window @asis{(camera)} Writes an OOGL window file for a camera. @item Panels Writes a GCL file containing commands which record the state of all the Geomview panels. Loading this file later will restore the positions of all the panels. @end table @comment ================================================================ @node Commands, Keyboard Shortcuts, Saving, Interaction @section The Commands Panel The @emph{Commands} panel lets you type in a GCL command. When you hit @kbd{@key{Enter}}, Geomview interprets the command and prints any resulting output or error messages on standard output. You can edit the text and hit @kbd{@key{Enter}} as many times as you like, in general, whenever you hit @kbd{@key{Enter}} with the cursor in the @emph{Commands} panel, Geomview tries to interpret whatever text you have typed in the text field as a command. @float Figure,figcommandpanel @image{figs/command} @caption{The Commands Panel.} @end float @ifset forms The @emph{Obscure} panel is for relatively obscure things that don't really belong on any of the other panels. In the present version of Geomview, the @emph{Obscure} panel includes the @emph{NORMALIZE GEOMETRY} browser, which controls the kind of geometry normalization that Geomview does, and several bot@~{o}es affecting movimento style. @float Figure,figobscurepanel @image{figs/obscure} @caption{The Obscure Panel.} @end float @end ifset [Move this.] Normalization is a kind of scaling; Geomview can scale an objeto so that it fits within a certain region. The main point of normalization is to allow you to easily view all of an objeto without having to worry about how big it is. We are gradually replacing Geomview's normalization feature with more robust c@^{a}mera positioning features. In general, the best way to make sure you are seeing all of an objeto is to use the @emph{Look At} bot@~{a}o on the @emph{Tools} panel. Normalization may be completely replaced by this and other features in a future version of Geomview. Normalization is a property that applies to each geom separately. The @emph{NORMALIZE GEOMETRY} browser affects the normalization property of target geom. If the target geom is "World", it affects all geoms. @table @emph @item None Do no normalization. @item Individual Normalize this geom to fit within a unit sphere. @item Sequence This resembles "Individual", except when an objeto is changing. Then, "Individual" tightly fits the bounding box around the objeto whenever it changes and normalizes accordingly, while "Sequence" normalizes the union of all variants of the objeto and normalizes accordingly. @item Keep This leaves the current normalization transform unchanged when the objeto changes. It may be useful to apply "Individual" or "Sequence" normalization to the first version of a changing objeto to bring it in view, then switch to "Keep". @end table @comment ================================================================ @node Keyboard Shortcuts, , Commands, Interaction @section Keyboard Shortcuts Most actions that you can do through Geomview's panels have equivalent teclas de atalho so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts usually are indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the tecla de atalho for @emph{Rotate} mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the @emph{MOTION MODE} browser. To use this tecla de atalho just hit the @kbd{r} key while the mouse cursor is in any Geomview window. You don't need to press the @kbd{@key{Enter}} or @kbd{@key{SPACE}} keys. Some teclas de atalho consist of more than one key. In these cases just type the keys one after the other, with no @kbd{@key{Enter}} afterwards. Keyboard shortcuts are case sensitive. You can cancel a multi-key tecla de atalho that you have started by typing any invalid key, for example the space bar. Keyboard commands apply while the cursor is in any janela de c@^{a}mera and most control panels. Many teclas de atalho allow numeric arguments which you type as a prefix to the command key(s). For example, the shortcut for @emph{Near clip} in the c@^{a}mera panel is @kbd{v n}. To set the near clip plane to @samp{0.5}, type @kbd{0.5vn}. Commands that don't take a numeric prefix toggle or reset the current value. Most commands allow one of the following selection prefixes. If none is provided the command applies to the objeto alvo. @table @kbd @item g world geom @item g# #'th geom @item g* All geoms @item c current camera @item c# #'th camera @item c* All c@^{a}meras @end table For example, @kbd{g4af} means toggle the face drawing of objeto @emph{g4}. Simply typing a selection prefix, like @kbd{g4}, doesn't yet select an objeto; that only happens when a command, like @kbd{ae}, follows the prefix. To select an objeto as the target without doing anything else to it, use the @kbd{p} command. So @kbd{g3p} selects objeto g3. The text field in the upper left corner of the @emph{Main} panel shows the state of the current tecla de atalho. In addition to the teclas de atalho for the panel commands, there is also a shortcut for picking a objeto alvo: type the short name of the objeto followed by @kbd{p}. For example, to select objeto @emph{g3}, type @kbd{g 3 p}. This only works with the short names --- the ones that appear in square brackets ([ ]) in the @emph{Targets} browser of the @emph{Main} panel. Below is a summary of all teclas de atalho. @table @asis @item Draw @table @kbd @item af Faces @item ae Edges @item an Normals @item ab Bounding Boxes @item aV Vectors @end table @item Shading @table @kbd @item 0as Constant @item 1as Flat @item 2as Smooth @item 3as Smooth, non-lighted @item aT allow transparency @item at texture mapping @end table @item Other @table @kbd @item av eVert normals: always face viewer @item #aw Line Width (pixels) @item aC handle concave polygons @item #vc edges Closer than faces (try 5-100) @end table @item Color @table @kbd @item Cf faces @item Ce edges @item Cn normals @item Cb bounding boxes @item CB background @end table @item Motions @table @kbd @item r rotate @item t translate @item z zoom FOV @item f fly @item o orbit @item s scale @item w recenter target @item W recenter all @item h halt @item H halt all @item @@ select center of movimento (e.g. @kbd{g 3 @@}) @item L Look At objeto @end table @item Viewing @table @kbd @item 0vp Orthographic view @item 1vp Perspective view @item vd Draw other views' c@^{a}meras @item #vv field of View @item #vn near clip distance @item #vf far clip distance @item v+ add new camera @item vx cursor on/off @item vb backfacing poly cull on/off @item #vl focal length @item v~ Software shading on/off @end table @item Panels @table @kbd @item Pm Main @item Pa Appearance @item Pl Lighting @item Po Obscure @item Pt Tools @item Pc C@^{a}meras @item PC Commands @item Pf Files @item Ps Save @item P- read commands from tty @item PA Credits ("about") @end table @item Lights @table @kbd @item ls show lights @item le edit lights @end table @item Space @table @kbd @item me Euclidean @item mh Hyperbolic @item ms Spherical @end table @item Model @table @kbd @item mv Virtual @item mp Projective @item mc Conformal @end table @item Other @table @kbd @item 0N normalizaton: none @item 1N normalization: each @item 2N all normalization: all @item ui movimento: Inertia @item uc movimento: Constrain to axis @item uo movimento: objeto's Own coordinates @item < @item Pf load geometry/command file @item dd delete objeto alvo @item > @item Ps save state to file @item TV NTSC mode toggle @item p pick as objeto alvo (e.g. @kbd{g 3 p}) With no prefix, selects the objeto under the mouse cursor (like double-clicando the right mouse) @end table @end table @comment **************************************************************** @node OOGL File Formats, Customization, Interaction, Top @chapter OOGL File Formats The objetos that you can load into Geomview are called OOGL objetos. OOGL stands for ``Objeto Oriented Graphics Library''; it is the library upon which Geomview is built. There are many different kinds of OOGL objetos. This chapter gives syntactic descriptions of file formats for OOGL objetos. Examples of most file types live in Geomview's @file{data/geom} directory. @menu * Conventions:: Conventions and general remarks. * Object File Formats:: Objeto File Formats. * Non-geometric objects:: Non-geometric objetos. @end menu @comment ================================================================ @node Conventions, Object File Formats, OOGL File Formats, OOGL File Formats @section Conventions @menu * Common syntax:: Syntax Common to All OOGL File Formats. * File names:: File Names. * Vertices:: Vertices. * ND-Vertices:: @var{N}-dimensional Vertices. * Surface normal directions:: Surface normal directions. * Transformation matrices:: Transformation matrices. * ND Transformation matrices:: @var{N}-dimensional transformation matrices. * Binary format:: Binary format. * References:: Embedded objetos and external-objeto references. * Appearances:: Appearances. * Texture Mapping:: Texture mapping. @end menu @comment ---------------------------------------------------------------- @node Common syntax, File names, Conventions, Conventions @subsection Syntax Common to All OOGL File Formats Most OOGL objeto file formats are free-format ASCII --- any amount of white space (blanks, tabs, newlines) may appear between tokens (numbers, key words, etc.). Line breaks are almost always insignificant, with a couple of exceptions as noted. Comments begin with # and continue to the end of the line; they're allowed anywhere a newline is. Binary formats are also defined for several objetos; @xref{Binary format}, and the individual objeto descriptions. Typical OOGL objetos begin with a key word designating objeto type, possibly with modifiers indicating presence of color information etc. In some formats the key word is optional, for compatibility with file formats defined elsewhere. Objeto type is then determined by guessing from the file suffix (if any) or from the data itself. Key words are case sensitive. Some have optional prefix letters indicating presence of color or other data; in this case the order of prefixes is significant, e.g. @code{CNMESH} is meaningful but @code{NCMESH} is invalid. @comment ---------------------------------------------------------------- @node File names, Vertices, Common syntax, Conventions @subsection File Names When OOGL objetos are read from disk files, the OOGL library uses the file suffix to guess at the file type. If the suffix is unrecognized, or if no suffix is available (e.g. for an objeto being read from a pipe, or embedded in another OOGL objeto), all known types of objetos are tried in turn until one accepts the data as valid. @comment ---------------------------------------------------------------- @node Vertices, ND-Vertices, File names, Conventions @subsection Vertices Several objetos share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an objeto have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax is @table @samp @item @var{x} @var{y} @var{z} (3-D floating-point vertex coordinates) or @item @var{x} @var{y} @var{z} @var{w} (4-D floating-point vertex coordinates) @end table optionally followed by @table @samp @item @var{nx} @var{ny} @var{nz} (normalized 3-D surface-normal if present) @end table optionally followed by @table @samp @item @var{r} @var{g} @var{}b @var{a} (4-component floating-point color if present, each component in range 0..1. The @var{a} (alpha) component represents opacity: 0 transparent, 1 opaque.) optionally followed by @item @var{s} @var{t} @item or @item @var{s} @var{t} @var{u} @end table (two or three texture-coordinate values). Values are separated by white space, and line breaks are immaterial. Letters in the objeto's header key word must appear in a specific order; that's the reverse of the order in which the data is given for each vertex. So a @samp{CN4OFF} objeto's vertices contain first the 4-component space position, then the 3-component normal, finally the 4-component color. You can't change the data order by changing the header key word; an @samp{NCOFF} is just not recognized. @comment ---------------------------------------------------------------- @node ND-Vertices, Surface normal directions, Vertices, Conventions @subsection @var{N}-dimensional Vertices Several objetos share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an objeto have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax for @var{N}-dimensional vertices (@var{N} > 3) is @table @samp @item @var{x[1]} @var{x[2]} @var{x[3]} @var{x[4]} @dots{} (@var{N} floating-point vertex coordinates) or @item @var{x[0]} @var{x[1]} @var{x[2]} @var{x[3]} @var{x[4]} @dots{} (@var{(N+1)} floating-point vertex coordinates, if the @code{4} modifier has been specified in the objeto's header line) @end table Note, however, that @var{N}-dimensional objetos internally always have @var{(N+1)}-dimensional points; the first component @var{x[0]} -- if present in the objeto file -- is used as homogeneous divisor. This is different from the ordinary 3D case where the @code{4} modifier generates a 4D objeto where the homogeneous component implicitly is set to 1. Color components usually can be specified like for 3D vertices, @pxref{Vertices}, while specifying normals does not make sense. @comment ---------------------------------------------------------------- @node Surface normal directions, Transformation matrices, ND-Vertices, Conventions @subsection Surface normal directions Geomview uses normal vectors to determine how an objeto is shaded. The direction of the normal is significant in this calculation. When normals are supplied with an objeto, the direction of the normal is determined by the data given. When normals are not supplied with the objeto, Geomview computes normal vectors automatically; in this case normals point toward the side from which the vertices appear in counterclockwise order. On parametric surfaces (Bezier patches), the normal at point P(u,v) is in the direction dP/du cross dP/dv. @comment ---------------------------------------------------------------- @node Transformation matrices, ND Transformation matrices, Surface normal directions, Conventions @subsection Transformation matrices Some objetos incorporate 4x4 real matrices for homogeneous objeto transformations. These matrices act by multiplication on the right of vectors. Thus, if p is a 4-element row vector representing homogeneous coordinates of a point in the OOGL objeto, and A is the 4x4 matrix, then the transformed point is p' = p A. This matrix convention is common in computer graphics; it's the transpose of that often used in mathematics, where points are column vectors multiplied on the right of matrices. Thus for Euclidean transformations, the translation components appear in the fourth row (last four elements) of A. A's last column (4th, 8th, 12th and 16th elements) are typically 0, 0, 0, and 1 respectively. @comment ---------------------------------------------------------------- @node ND Transformation matrices, Binary format, Transformation matrices, Conventions @subsection ND Transformation matrices In the context of @var{N}-dimensional space (@var{N} < 3) some objetos incorporate @var{(N+1)}x@var{(N+1)} real matrices for homogeneous objeto transformations. These matrices act by multiplication on the right of vectors. Thus, if p is an @var{(N+1)}-element row vector representing homogeneous coordinates of a point in the OOGL objeto, and A @var{(N+1)}x@var{(N+1)} is the matrix, then the transformed point is p' = p A. Note that (unlike for the 4x4 transformation matrices, @pxref{Transformation matrices}) the homogeneous component is located at index @b{zero}, so the translation components for Euclidean transformations appear in the @b{zero}-th row (first @var{(N+1)} elements). A's first column (at column index zero) is typically 1, 0, @dots{}, 0. @comment ---------------------------------------------------------------- @node Binary format, References, ND Transformation matrices, Conventions @subsection Binary format Many OOGL objetos accept binary as well as ASCII file formats. These files begin with the usual ASCII token (e.g. @code{CQUAD}) followed by the word @code{BINARY}. Binary data begins at the byte following the first newline after @code{BINARY}. White space and a single comment may intervene, e.g. @example OFF BINARY # binary-format "OFF" data follows @end example Binary data comprise 32-bit integers and 32-bit IEEE-format floats, both in big-endian format (i.e., with most significant byte first). This is the native format for 'int's and 'float's on Sun-3's, Sun-4's, and Irises, among others. Binary data formats resemble the corresponding ASCII formats, with ints and floats in just the places you'd expect. There are some exceptions though, specifically in the @code{QUAD}, @code{OFF} and @code{COMMENT} file formats. Details are given in the individual file format descriptions. @xref{QUAD}, @xref{OFF}, and @xref{COMMENT}. Binary OOGL objetos may be freely mixed in ASCII objeto streams: @example LIST @{ = MESH BINARY @dots{} binary data for mesh here @dots{} @} @{ = QUAD 1 0 0 0 0 1 0 1 0 0 1 0 @} @end example Note that ASCII data resumes immediately following the last byte of binary data. Naturally, it's impossible to embed comments inside a binary-format OOGL objeto, though comments may appear in the header before the beginning of binary data. @comment ---------------------------------------------------------------- @node References, Appearances, Binary format, Conventions @subsection Embedded objects and external-object references Some objeto types (@code{LIST}, @code{INST}) allow references to other OOGL objetos, which may appear literally in the data stream, be loaded from named disk files, or be communicated from elsewhere via named objetos. GCL commands also accept geometry in these forms. The general syntax is @example ::= [ "@{" ] [ "define" @code{symbolname} ] [ ["="] @code{object-keyword} @dots{} | "<" @code{filename} | ":" @code{symbolname} ] [ "@}" ] @end example where "quoted" items are literal strings (which appear without the quotes), [bracketed] items are optional, and | denotes alternatives. Curly braces, when present, must match; the outermost set of curly braces is generally required when the objeto is in a larger context, e.g. when it is part of a larger objeto or embedded in a Geomview command stream. For example, each of the following three lines: @example @{ define fred QUAD 1 0 0 0 0 1 0 1 0 1 0 0 @} @{ define fred = QUAD 1 0 0 0 0 1 0 1 0 1 0 0 @} @{ appearance @{ +edge @} LIST @{ < "file1" @} @{ : fred @} @} VECT 1 2 0 2 0 0 0 0 1 1 2 @end example @noindent is a valid OOGL objeto. The last example is only valid when it is delimited unambiguously by residing in its own disk file. The ":" construct allows references to symbols, created with @code{define}. A symbol's initial value is a null objeto. When a symbol is (re)defined, all references to it are automatically changed. The "@code{define} NAME" construct allows to define a global symbol for the given objeto. If "NAME" already references an objeto, then the old objeto is discarded and replaced by the new definition. @xref{read,@code{(read @dots{})}}. @xref{hdefine,@code{(hdefine @dots{})}}. The "<" construct causes a disk file to be read. Note that this isn't a general textual "include" mechanism; a complete OOGL objeto must appear in the referenced file. Files read using "<" are sought first in the directory of the file which referred to them, if any; failing that, the normal search path (@pxref{load-path, @code{(load-path @dots{})}}) is used. The default search looks first in the current directory, then in the Geomview data directories. Again, white space and line breaks are insignificant, and "#" comments may appear anywhere. @comment ---------------------------------------------------------------- @node Appearances, Texture Mapping, References, Conventions @subsection Appearances Geometric objetos can have associated "appearance" information, specifying shading, lighting, color, wire-frame vs. shaded-surface display, and so on. Appearances are inherited through objeto hierarchies, e.g. attaching an appearance to a @code{LIST} means that the appearance is applied to all the @code{LIST}'s members. Some appearance-related properties are relegated to "material", "lighting" and "texture" substructures. Take care to note which properties belong to which structure. Any geometric objeto can be preceded by an appearance definition like in the following example: @example @{ appearance @{ +edge @} LIST @{ < "file1" @} @{ QUAD 1 0 0 0 0 1 0 1 0 1 0 0 @} @} @end example Appearances are also OOGL objetos in their own right and can be given symbolic names and referenced by them (@pxref{References}). @xref{appearance, Appearance objects}. @table @b @item Texture Mapping There is a separate section concerning the definition of textures (@pxref{Texture Mapping}). @item Transparency Rendering translucent objetos is not supported by all drawing back ends. The OpenGL renderer has limited support for it: top-level objetos (i.e. those which appear in the objeto browser of the main panel (@pxref{Basic Interaction, The Main Panel}) are rendered correctly by means of alpha-blending). Also, the RenderMan snapshots will include opacity values. @end table Here's an example appearance structure including values for all attributes. Order of attributes is unimportant. As usual, white space is irrelevant. Boolean attributes may be preceded by "+" or "-" to turn them on or off; "+" is assumed if only the attribute name appears. Other attributes expect values. A "*" prefix on any attribute, e.g. "*+edge" or "*linewidth 2" or "material @{ *diffuse 1 1 .25 @}", selects "override" status for that attribute. @example appearance @{ +face # (Do) draw faces of polygons. On by default. -edge # (Don't) draw edges of polygons +vect # (Do) draw VECTs. On by default. -transparent # (Disable) transparency. Enabling transparency # does not (necessarily) result in a correct Geomview # pictures, but alpha values are used in RenderMan # snapshots. -normal # (Do) draw surface-normal vectors normscale 1 # @dots{} with length 1.0 in objeto coordinates +evert # do evert polygon normals where needed so as # to always face the camera +texturing # (Enable) texture mapping +linear # (Enable) linear average of closest texture elements +mipmap # (Enable) texture mip-mapping +mipinterp # (Enable) linear mip-mapping -backcull # (Don't) discard clockwise-oriented faces -concave # (Don't) expect and handle concave polygons -shadelines # (Don't) shade lines as if they were lighted cylinders # These four are only effective where the graphics system # supports them, namely on GL and Open GL. -keepcolor # Normally, when N-D positional coloring is enabled as # with geomview's (ND-color ...) command, all # objetos' colors are affected. But, objetos with the # "+keepcolor" attribute are immune to N-D coloring. shading smooth # or ``shading constant'' or ``shading flat'' or # or ``shading csmooth''. # smooth = Gouraud shading, flat = faceted, # csmooth = smoothly interpolated but unlighted. linewidth 1 # lines, points, and edges are 1 pixel wide. patchdice 10 10 # subdivide Bezier patches this finely in u and v material @{ # Here's a material definition; # it could also be read from a file as in # ``material < file.mat'' ka 1.0 # ambient reflection coefficient. ambient .3 .5 .3 # ambient color (red, green, blue components) # The ambient contribution to the shading is # the product of ka, the ambient color, # and the color of the ambient light. kd 0.8 # diffuse-reflection coefficient. diffuse .9 1 .4 # diffuse color. # (In ``shading constant'' mode, the surface # is colored with the diffuse color.) ks 1.0 # specular reflection coefficient. specular 1 1 1 # specular (highlight) color. shininess 25 # specular exponent; larger values give # sharper highlights. backdiffuse .7 .5 0 # back-face color for two-sided surfaces # If defined, this field determines the diffuse # color for the back side of a surface. # It's implemented by the software shader, and # by hardware shading on GL systems which support # two-sided lighting, and under Open GL. alpha 1.0 # opacity; 0 = transparent (invisible), 1 = opaque. # Ignored when transparency is disabled. edgecolor 1 1 0 # line & edge color normalcolor 0 0 0 # color for surface-normal vectors @} lighting @{ # Lighting model ambient .3 .3 .3 # ambient light replacelights # ``Use only the following lights to # illuminate the objetos under this # appearance.'' # Without "replacelights", any lights listed # are added to those already in the scene. # Now a collection of sample lights: light @{ color 1 .7 .6 # light color position 1 0 .5 0 # light position [distant light] # given in homogeneous coordinates. # With fourth component = 0, # this means a light coming from # direction (1,0,.5). @} light @{ # Another light. color 1 1 1 position 0 0 .5 1 # light at finite position @dots{} location camera # specified in camera coordinates. # (Since the camera looks toward -Z, # this example places the light # .5 unit behind the eye.) # Possible "location" keywords: # global light position is in world (well, universe) coordinates # This is the default if no location specified. # camera position is in the camera's coordinate system # local position is in the coordinate system where # the appearance was defined @} @} # end lighting model texture @{ clamp st # or ``s'' or ``t'' or ``none'' file lump.tiff # file supplying texture-map image alphafile mask.pgm.Z # file supplying transparency-mask image apply blend # or ``modulate'' or ``decal'' transform 1 0 0 0 # surface (s,t,0,1) * tfm -> texture coords 0 1 0 0 0 0 1 0 .5 0 0 1 background 1 0 0 1 # relevant for ``apply blend'' @} @} # end appearance @end example There are rules for inheritance of appearance attributes when several are imposed at different levels in the hierarchy. For example, Geomview installs a backstop appearance which provides default values for most parameters; its control panels install other appearances which supply new values for a few attributes; user-supplied geometry may also contain appearances. The general rule is that the child's appearance (the one closest to the geometric primitives) wins. Further, appearance controls with "override" status (e.g. @code{*+face or material @{ *diffuse 1 1 0 @}}) win over those without it. Geomview's appearance controls use the "override" feature so as to be effective even if user-supplied objetos contain their own appearance settings. However, if a user-supplied objeto contains an appearance field with override status set, that property will be immune to Geomview's controls. @comment ---------------------------------------------------------------- @node Texture Mapping, , Appearances, Conventions @subsection Texture Mapping Some rendering back-ends support texture-mapped objetos, actually only the OpenGL and the RenderMan interface at the time of this writing. There are also some issues with the RMan interface when using an alpha-channel in the texture image. Those rendering back-ends which don't support texturing silently ignore attempts to use texture mapping. A texture is specified as part of an appearance structure (@pxref{Appearances}). Briefly, one provides a texture image (@pxref{image, Image objects}), which is considered to lie in a square in @code{(s,t)} parameter space in the range 0 <= s <= 1, 0 <= t <= 1. Then one provides a geometric primitive, with each vertex tagged with @code{(s,t)} texture coordinates. If texturing is enabled, the appropriate portion of the texture image is pasted onto each face of the textured objeto. There is (currently) no provision for inheritance of part of a texture structure; if the @code{texture} keyword is mentioned in an appearance, it supplants any other texture specification. The appearance attribute @code{texturing} controls whether textures are used; there's no performance penalty for having texture @{ @dots{} @} fields defined when texturing is off. The available fields are: @example clamp none -or- s -or- t -or- st Determines the meaning of texture coordinates outside the range 0..1. With @code{clamp none}, the default, coordinates are interpreted modulo 1, so (s,t) = (1.25,0), (.25,0), and (-.75,0) all refer to the same point in texture space. With @code{s} or @code{t} or @code{st}, either or both of s- or t-coordinates less than 0 or greater than 1 are clamped to 1 or 0, respectively. image @{ (@pxref{image, Image objects}) @} Specify the actual texture image. Images can have 1, 2, 3 or 4 channels: 1 channel: luminance 2 channels: luminance and alpha 3 channels: RGB data 4 channels: RGBA data @xref{image, Image objects}, for the actual definition of image objetos. The alpha-channel is only interpreted as mask: where the mask is zero, pixels are simply not drawn. An exception is the case where @emph{apply} is equal to @emph{modulate} and translucency is enabled: in this case the resulting alpha value is the result of the multiplication of the surface color with the alpha value of the texture's alpha channel. file filename alphafile filename @emph{This is considered obsolete, and only kept for compatibility, the modern way is to use the new OOGL image objeto. @xref{image, Image objects}. The stuff documented here should still work, though} Specifies image file(s) containing the texture. The @emph{file} keyword specifies a file with color or lightness information; @emph{alphafile} if present, specifies a transparency ("alpha") mask; where the mask is zero, pixels are simply not drawn. Several image file formats are available; the file type must be indicated by the last few characters of the file name: .ppm or .ppm.Z or .ppm.gz 24-bit 3-color image in PPM format .pgm or .pgm.Z or .pgm.gz 8-bit grayscale image in PGM format .sgi or .sgi.Z or .sgi.gz 8-bit, 24-bit, or 32-bit SGI image .tiff 8-bit or 24-bit TIFF image .gif GIF image For this feature to work, some programs must be available in geomview's search path: zcat for .Z files gzip for .gz files tifftopnm for .tiff files giftoppm for .gif files If an @code{alphafile} image is supplied, it must be the same size as the @code{file} image. @emph{Image objetos provide a more flexible way to specify texture data. @xref{image, Image objects}.} apply modulate -or- blend -or- decal Indicates how the texture image is applied to the surface. Here the "surface color" means the color that surface would have in the absence of texture mapping. With @code{modulate}, the default, the texture color (or lightness, if textured by a gray-scale image) is multiplied by the surface color. With @code{blend}, texture blends between the @code{background} color and the surface color. The @code{file} parameter must specify a gray-scale image. Where the texture image is 0, the surface color is unaffected; where it's 1, the surface is painted in the color given by @code{background}; and color is interpolated for intermediate values. With @code{decal}, the @code{file} parameter must specify a 3-color image. If an @code{alphafile} parameter is present, its value interpolates between the surface color (where alpha=0) and the texture color (where alpha=1). Lighting does not affect the texture color in @code{decal} mode; effectively the texture is constant-shaded. background R G B A Specifies a 4-component color, with R, G, B, and A floating-point numbers normally in the range 0..1, used when @code{apply blend} is selected. transform @code{transformation-matrix} Expects a list of 16 numbers, or one of the other ways of representing a transformation (@code{: handlename} or @code{< filename}). The 4x4 transformation matrix is applied to texture coordinates, in the sense of a 4-component row vector (s,t,0,1) multiplied on the left of the matrix, to produce new coordinates (s',t') which actually index the texture. @end example @comment ================================================================ @node Object File Formats, Non-geometric objects, Conventions, OOGL File Formats @section Object File Formats @menu * QUAD:: List of quadrilaterals. * MESH:: Rectangularly-connected mesh. * BBOX:: Simple bounding-boxes. * BBP and BEZ:: List of Bezier surface patches. * OFF:: Polyhedra: polygons with shared vertices. * VECT:: List of points and lines. * SKEL:: List of points and lines, with shared vertices. * SPHERE:: Sphere * INST:: Transformed Instance of another objeto. * LIST:: List of other objetos. * TLIST:: Collection of 4x4 transformation matrices. * GROUP:: Obsolete format for collections of objetos. * DISCGRP:: Discrete Group objetos. * COMMENT:: Comment objeto, for caching information. @end menu @comment ---------------------------------------------------------------- @node QUAD, MESH, Object File Formats, Object File Formats @subsection QUAD: collection of quadrilaterals The conventional suffix for a @code{QUAD} file is @file{.quad}. The file syntax is @example [C][N][4]QUAD -or- [C][N][4]POLY # Key word @var{vertex} @var{vertex} @var{vertex} @var{vertex} # 4*N vertices for some N @var{vertex} @var{vertex} @var{vertex} @var{vertex} @dots{} @end example The leading key word is @code{[C][N][4]QUAD} or @code{[C][N][4]POLY}, where the optional @code{C} and @code{N} prefixes indicate that each vertex includes colors and normals respectively. That is, these files begin with one of the words @code{QUAD} @code{CQUAD} @code{NQUAD} @code{CNQUAD} @code{POLY} @code{CPOLY} @code{NPOLY} @code{CNPOLY} (but not @code{NCQUAD} or @code{NCPOLY}). @code{QUAD} and @code{POLY} are synonymous; both forms are allowed just for compatibility with ChapReyes. Following the key word is an arbitrary number of groups of four vertices, each group describing a quadrilateral. See the Vertex syntax above. The objeto ends at end-of-file, or with a close-brace if incorporated into an objeto reference (see above). A @code{QUAD BINARY} file format is accepted; @xref{Binary format}. The first word of binary data must be a 32-bit integer giving the number of quads in the objeto; following that is a series of 32-bit floats, arranged just as in the ASCII format. @comment ---------------------------------------------------------------- @node MESH, BBOX, QUAD, Object File Formats @subsection MESH: rectangularly-connected mesh The conventional suffix for a @code{MESH} file is @file{.mesh}. The file syntax is @example [U][C][N][Z][4][u][v][n]MESH # Key word [@var{Ndim}] # Space dimension, present only if nMESH @var{Nu} @var{Nv} # Mesh grid dimensions # @var{Nu}*@var{Nv} vertices, in format specified # by initial key word @var{vertex}(u=0,v=0) @var{vertex}(1,0) @dots{} @var{vertex}(@var{Nu}-1,0) @var{vertex}(0,1) @dots{} @var{vertex}(@var{Nu}-1,1) @dots{} @var{vertex}(0,@var{Nv}-1) @dots{} @var{vertex}(@var{Nu}-1,@var{Nv}-1) @end example The key word is @code{[U][C][N][Z][4][u][v][n]MESH}. The optional prefix characters mean: @table @samp @item U Each vertex includes a 3-component texture space parameter. The first two components are the usual @code{S} and @code{T} texture parameters for that vertex; the third should be specified as zero. @item C Each vertex (see Vertices above) includes a 4-component color. @item N Each vertex includes a surface normal vector. @item Z Of the 3 vertex position values, only the Z component is present; X and Y are omitted, and assumed to equal the mesh (u,v) coordinate so X ranges from 0 .. (Nu-1), Y from 0 .. (Nv-1) where Nu and Nv are the mesh dimensions -- see below. @item 4 Vertices are 4D, each consists of 4 floating values. @code{Z} and @code{4} cannot both be present. @item u The mesh is wrapped in the u-direction, so the (0,v)'th vertex is connected to the (@var{Nu}-1,v)'th for all v. @item v The mesh is wrapped in the v-direction, so the (u,0)'th vertex is connected to the (u,@var{Nv}-1)'th for all u. Thus a u-wrapped or v-wrapped mesh is topologically a cylinder, while a uv-wrapped mesh is a torus. @item n Specifies a mesh whose vertices live in a higher dimensional space. The dimension follows the "MESH" keyword. Each vertex then has @var{Ndim} components. @end table Note that the order of prefix characters is significant; a colored, u-wrapped mesh is a @code{CuMESH} not a @code{uCMESH}. Following the mesh header are integers @var{Nu} and @var{Nv}, the dimensions of the mesh. Then follow @var{Nu}*@var{Nv} vertices, each in the form given by the header. They appear in v-major order, i.e. if we name each vertex by (u,v) then the vertices appear in the order @example (0,0) (1,0) (2,0) (3,0) @dots{} (@var{Nu}-1,0) (0,1) (1,1) (2,1) (3,1) @dots{} (@var{Nu}-1,1) @dots{} (0,Nv-1) @dots{} (@var{Nu}-1,@var{Nv}-1) @end example A @code{MESH BINARY} format is accepted; @xref{Binary format}. The values of @var{Nu} and @var{Nv} are 32-bit integers; all other values are 32-bit floats. @comment ---------------------------------------------------------------- @node BBOX, BBP and BEZ, MESH, Object File Formats @subsection BBOX: simple bounding boxes This is a very simple toy-objeto: it takes 2 vertices and draws a (hyper-) cube which is the bounding box of the two vertices. Syntax: @example BBOX @var{x}[0] @var{y}[0] @var{z}[0] @var{x}[1] @var{y}[1] @var{z}[1] @end example or @example 4BBOX @var{x}[0] @var{y}[0] @var{z}[0] @var{w}[0] @var{x}[1] @var{y}[1] @var{z}[1] @var{w}[1] @end example or @example nBBOX @var{Ndim} # > 3 @var{x}[0] @var{y}[0] @var{z}[0] @var{w}[0] @dots{} @var{x}[1] @var{y}[1] @var{z}[1] @var{w}[1] @dots{} @end example or @example 4nBBOX @var{Ndim} # > 3 @var{d}[0] @var{x}[0] @var{y}[0] @var{z}[0] @var{w}[0] @dots{} @var{d}[0] @var{x}[1] @var{y}[1] @var{z}[1] @var{w}[1] @dots{} @end example There is no BBOX binary format. The @code{4} modifyer has different meanings depending on the dimension of the bounding box: @code{4BBOX} means that the 4 components of the vertices make up a 4-dimensional bounding-box. Using @code{4} in conjunction with @code{n} -- @code{4nBBOX @var{NDim}} -- means that the vertices specified in the file have @var{NDim+1} components, but the component at index 0 is the homogeneous divisor (in contrast to the ordinary 3d case where the homogeneous divisor would be the @code{w} -- the third -- component). @comment ---------------------------------------------------------------- @node BBP and BEZ, OFF, BBOX, Object File Formats @subsection Bezier Surfaces The conventional file suffixes for Bezier surface files are @file{.bbp} or @file{.bez}. A file with either suffix may contain either type of patch. Syntax: @example [ST]BBP -or- [C]BEZ<@var{Nu}><@var{Nv}><@var{Nd}>[_ST] # @var{Nu}, @var{Nv} are u- and v-direction # polynomial degrees in range 1..6 # @var{Nd} = dimension: 3->3-D, 4->4-D (rational) # (The '<' and '>' do not appear in the input.) # @var{Nu},@var{Nv},@var{Nd} are each a single decimal digit. # BBP form implies @var{Nu}=@var{Nv}=@var{Nd}=3 so BBP = BEZ333. # Any number of patches follow the header # (@var{Nu}+1)*(@var{Nv}+1) patch control points # each 3 or 4 floats according to header @var{vertex}(u=0,v=0) @var{vertex}(1,0) @dots{} @var{vertex}(@var{Nu},0) @var{vertex}(0,1) @dots{} @var{vertex}(@var{Nu},1) @dots{} @var{vertex}(0,@var{Nv}) @dots{} @var{vertex}(@var{Nu},@var{Nv}) # ST texture coordinates if mentioned in header @code{S}(u=0,v=0) @code{T}(0,0) @code{S}(0,@var{Nv}) @code{T}(0,@var{Nv}) @code{S}(@var{Nu},0) @code{T}(@var{Nu},0) @code{S}(@var{Nu},@var{Nv}) @code{T}(@var{Nu},@var{Nv}) # 4-component float (0..1) R G B A colors # for each patch corner if mentioned in header @code{RGBA}(0,0) @code{RGBA}(0,@var{Nv}) @code{RGBA}(@var{Nu},0) @code{RGBA}(@var{Nu},@var{Nv}) @end example These formats represent collections of Bezier surface patches, of degrees up to 6, and with 3-D or 4-D (rational) vertices. The header keyword has the forms @code{[ST]BBP} or @code{[C]BEZ<@var{Nu}><@var{Nv}><@var{Nd}>[_ST]} (the '<' and '>' are not part of the keyword. The @code{ST} prefix on @code{BBP}, or @code{_ST} suffix on @code{BEZuvn}, indicates that each patch includes four pairs of floating-point texture-space coordinates, one for each corner of the patch. The @code{C} prefix on @code{BEZuvn} indicates a colored patch, including four sets of four-component floating-point colors (red, green, blue, and alpha) in the range 0..1, one color for each corner. @var{Nu} and @var{Nv}, each a single digit in the range 1..6, are the patch's polynomial degree in the u and v direction respectively. @var{Nd} is the number of components in each patch vertex, and must be either @code{3} for 3-D or @code{4} for homogeneous coordinates, that is, rational patches. @code{BBP} patches are bicubic patches with 3-D vertices, so @code{BBP} = @code{BEZ333} and @code{STBBP} = @code{BEZ333_ST}. Any number of patches follow the header. Each patch comprises a series of patch vertices, followed by optional (s,t) texture coordinates, followed by optional (r,g,b,a) colors. Each patch has (@var{Nu}+1)*(@var{Nv}+1) vertices in v-major order, so that if we designate a vertex by its control point indices (u,v) the order is @example (0,0) (1,0) (2,0) @dots{} (@var{Nu},0) (0,1) (1,1) (2,1) @dots{} (@var{Nu},1) @dots{} (0,@var{Nv}) @dots{} (@var{Nu},@var{Nv}) @end example @noindent with each vertex containing either 3 or 4 floating-point numbers as specified by the header. If the header calls for ST coordinates, four pairs of floating-point numbers follow: the texture-space coordinates for the (0,0), (@var{Nu},0), (0,@var{Nv}), and (@var{Nu},@var{Nv}) corners of the patch, respectively. If the header calls for colors, four four-component (red, green, blue, alpha) floating-point colors follow, one for each patch corner. The series of patches ends at end-of-file, or with a closebrace if incorporated in an objeto reference. @comment ---------------------------------------------------------------- @node OFF, VECT, BBP and BEZ, Object File Formats @subsection OFF Files The conventional suffix for @code{OFF} files is @file{.off}. Syntax: @example [ST][C][N][4][n]OFF # Header keyword [@var{Ndim}] # Space dimension of vertices, present only if nOFF @var{NVertices} @var{NFaces} @var{NEdges} # NEdges not used or checked @var{x}[0] @var{y}[0] @var{z}[0] # Vertices, possibly with normals, # colors, and/or texture coordinates, in that order, # if the prefixes @code{N}, @code{C}, @code{ST} # are present. # If 4OFF, each vertex has 4 components, # including a final homogeneous component. # If nOFF, each vertex has @var{Ndim} components. # If 4nOFF, each vertex has @var{Ndim}+1 components. @dots{} @var{x}[@var{NVertices}-1] @var{y}[@var{NVertices}-1] @var{z}[@var{NVertices}-1] # Faces # @var{Nv} = # vertices on this face # @var{v}[0] @dots{} @var{v}[@var{Nv}-1]: vertex indices # in range 0..@var{NVertices}-1 @var{Nv} @var{v}[0] @var{v}[1] @dots{} @var{v}[@var{Nv}-1] @var{colorspec} @dots{} # @var{colorspec} continues past @var{v}[@var{Nv}-1] # to end-of-line; may be 0 to 4 numbers # nothing: default # integer: colormap index # 3 or 4 integers: RGB[A] values 0..255 # 3 or 4 floats: RGB[A] values 0..1 @end example @code{OFF} files (name for "object file format") represent collections of planar polygons with possibly shared vertices, a convenient way to describe polyhedra. The polygons may be concave but there's no provision for polygons containing holes. An @code{OFF} file may begin with the keyword @code{OFF}; it's recommended but optional, as many existing files lack this keyword. Three ASCII integers follow: @var{NVertices}, @var{NFaces}, and @var{NEdges}. Thease are the number of vertices, faces, and edges, respectively. Current software does not use nor check @var{NEdges}; it needn't be correct but must be present. The vertex coordinates follow: dimension * @var{Nvertices} floating-point values. They're implicitly numbered 0 through @var{NVertices}-1. dimension is either 3 (default) or 4 (specified by the key character @code{4} directly before @code{OFF} in the keyword). Following these are the face descriptions, typically written with one line per face. Each has the form @example @var{N} @var{Vert1} @var{Vert2} @dots{} @var{VertN} [@var{color}] @end example @noindent Here @var{N} is the number of vertices on this face, and @var{Vert1} through @var{VertN} are indices into the list of vertices (in the range 0..@var{NVertices}-1). The optional @var{color} may take several forms. Line breaks are significant here: the @var{color} description begins after @var{VertN} and ends with the end of the line (or the next # comment). A @var{color} may be: @table @asis @item nothing the default color @item one integer index into "the" colormap; see below @item three or four integers RGB and possibly alpha values in the range 0..255 @item three or four floating-point numbers RGB and possibly alpha values in the range 0..1 @end table For the one-integer case, the colormap is currently read from the file @file{cmap.fmap} in Geomview's @file{data} directory. Some better mechanism for supplying a colormap is likely someday. The meaning of "default color" varies. If no face of the objeto has a color, all inherit the environment's default material color. If some but not all faces have colors, the default is gray (R,G,B,A=.666). A @code{[ST][C][N][n]OFF BINARY} format is accepted; @xref{Binary format}. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions (and texture coordinates or vertex colors or normals if @code{COFF}/@code{NOFF}/@code{CNOFF}/@code{STCNOFF}/etc. format). Exception: each face's vertex indices are followed by an integer indicating how many color components accompany it. Face color components must be floats, not integer values. Thus a colorless triangular face might be represented as @example int int int int int 3 17 5 9 0 @end example while the same face colored red might be @example int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0 @end example @comment ---------------------------------------------------------------- @node VECT, SKEL, OFF, Object File Formats @subsection VECT Files The conventional suffix for @code{VECT} files is @file{.vect}. Syntax: @example [4]VECT @var{NPolylines} @var{NVertices} @var{NColors} @var{Nv[0]} @dots{} @var{Nv[NPolylines-1]} # number of vertices # in each polyline @var{Nc[0]} @dots{} @var{Nc[NPolylines-1]} # number of colors supplied # in each polyline @var{Vert[0]} @dots{} @var{Vert[NVertices-1]} # All the vertices # (3*NVertices floats) @var{Color[0]} @dots{} @var{Color[NColors-1]} # All the colors # (4*NColors floats, RGBA) @end example @code{VECT} objetos represent lists of polylines (strings of connected line segments, possibly closed). A degenerate polyline can be used to represent a point. A @code{VECT} file begins with the key word @code{VECT} or @code{4VECT} and three integers: @var{NLines}, @var{NVertices}, and @var{NColors}. Here @var{NLines} is the number of polylines in the file, @var{NVertices} the total number of vertices, and @var{NColors} the number of colors as explained below. Next come @var{NLines} @b{16-bit} integers @center @var{Nv[0]} @var{Nv[1]} @var{Nv[2]} @dots{} @var{Nv[NLines-1]} giving the number of vertices in each polyline. A negative number indicates a closed polyline; 1 denotes a single-pixel point. The sum (of absolute values) of the @var{Nv[i]} must equal @var{NVertices}. Next come @var{NLines} more @b{16-bit} integers @var{Nc[i]}: the number of colors in each polyline. Normally one of three values: @table @asis @item 0 No color is specified for this polyline. It's drawn in the same color as the previous polyline. @item 1 A single color is specified. The entire polyline is drawn in that color. @item abs(@var{Nv[i]}) Each vertex has a color. Either each segment is drawn in the corresponding color, or the colors are smoothly interpolated along the line segments, depending on the implementation. @end table Next come @var{NVertices} groups of 3 or 4 floating-point numbers: the coordinates of all the vertices. If the keyword is @var{4VECT} then there are 4 values per vertex. The first abs(@var{Nv[0]}) of them form the first polyline, the next abs(@var{Nv[1]}) form the second and so on. Finally @var{NColors} groups of 4 floating-point numbers give red, green, blue and alpha (opacity) values. The first @var{Nc[0]} of them apply to the first polyline, and so on. A @var{VECT BINARY} format is accepted; @pxref{Binary format}. The binary format exactly follows the ASCII format, with 32-bit Big-Endian integers where ordinary integer numbers appear, and with @b{16-bit} Big-Endian integers where 16-bit integers appear; 32-bit Big-Endian floats where real values appear. @b{BIG FAT NOTE:} The vertex counts @var{Nv[i]} and the color counts @var{Nc[i]} are @b{16-bit} Big-Endian integers. @comment ---------------------------------------------------------------- @node SKEL, SPHERE, VECT, Object File Formats @subsection SKEL Files @code{SKEL} files represent collections of points and polylines, with shared vertices. The conventional suffix for @code{SKEL} files is @file{.skel}. Syntax: @example [C][4][n]SKEL [@var{NDim}] # Vertex dimension, present only if nSKEL @var{NVertices} @var{NPolylines} @var{x}[0] @var{y}[0] @var{z}[0] # Vertices # if 4SKEL, each vertex has 4 components # if nSKEL, each vertex has NDim components # if C[4][n]SKEL vertex coordinates are # followed by an RGBA color specification @dots{} @var{x}[@var{NVertices}-1] @var{y}[@var{NVertices}-1] @var{z}[@var{NVertices}-1] # Polylines # @var{Nv} = # vertices on this polyline (1 = point) # @var{v}[0] @dots{} @var{v}[@var{Nv}-1]: vertex indices # in range 0..@var{NVertices}-1 @var{Nv} @var{v}[0] @var{v}[1] @dots{} @var{v}[@var{Nv}-1] [@var{colorspec}] @dots{} # @var{colorspec} continues past @var{v}[@var{Nv}-1] # to end-of-line; may be nothing, or 3 or 4 numbers. # nothing: default color # 3 or 4 floats: RGB[A] values 0..1 @end example The syntax resembles that of @code{OFF} files, with a table of vertices followed by a sequence of polyline descriptions, each referring to vertices by index in the table. Each polyline has an optional color. For @code{nSKEL} objetos, each vertex has @var{NDim} components. For @code{4nSKEL} objetos, each vertex has @var{NDim+1} components; the final component is the homogeneous divisor. A @var{[4][n]SKEL BINARY} format is accepted; @xref{Binary format}. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions. Exception: each polyline's vertex indices are followed by an integer indicating how many color components accompany it. Polyline color components must be floats, not integer values. Thus a colorless polyline with 3 vertices might be represented as @example int int int int int 3 17 5 9 0 @end example while the same polyline colored red might be @example int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0 @end example @comment ---------------------------------------------------------------- @node SPHERE, INST, SKEL, Object File Formats @subsection SPHERE Files The conventional suffix for @code{SPHERE} files is @file{.sph}. @example [ST][E|H|S]SPHERE # Keyword # auto-generated texture co-ordinates, only allowed with @emph{ST}SPHERE objetos [SINUSOIDAL|CYLINDRICAL|RECTANGULAR|STEREOGRAPHIC|ONEFACE] # next four fields are required @var{Radius} @var{Xcenter} @var{Ycenter} @var{Zcenter} @end example The key word is @code{[ST][E|H|S]SPHERE}. The optional prefix characters mean: @table @samp @item ST The sphere carries automatically generated texture co-ordinates. See below. @item E The sphere lives in Euclidean space. @item H The sphere lives in Hyperbolic space. @xref{Non-Euclidean Geometry}. @item S The sphere lives in spherical space. @xref{Non-Euclidean Geometry}. @end table Sphere objetos are drawn using meshes which are rectangular in a polar co-ordinate system, with the equatorial plane parallel to the @code{x,y}-plane. Their smoothness, and the time taken to draw them, depends on the setting of the dicing level, 10x10 by default. From Geomview, the Appearance panel, the @code{ad} keyboard command, or a @code{dice nu nv} Appearance attribute sets this. Texture co-ordinates are generated for @code{STSPHERE} objetos; the keyword following the initial @code{STSPHERE} keyword defines the way this is done. It follows the conventions of the @command{mktxmesh} Perl-script which comes with the @emph{Orrery}. @table @var @item SINUSOIDAL sinusoidal equal-area projection @item CYLINDRICAL cylindrical proj: @var{s} is the longitude, @var{t} is the latitude @item RECTANGULAR rectangular proj: @var{s} is the longitude, @var{t} is @code{sin(latitude)} (i.e. @code{z} co-ordinate in the sphere's co-ordinate system) @item STEREOGRAPHIC stereographic projection from the south (@code{z=-1}) pole @item ONEFACE stretch orthographic view of @code{+y} hemisphere over both, mirroring @end table @comment ---------------------------------------------------------------- @node INST, LIST, SPHERE, Object File Formats @subsection INST Files The conventional suffix for a @code{INST} file is @file{.inst}. There is no INST BINARY format. An @code{INST} applies a 4x4 (or @var{(N+1)}x@var{(N+1)} in the context of ND-viewing) transformation to another OOGL objeto. It begins with @code{INST} followed by these sections which may appear in any order: @example geom @var{oogl-object} @end example @noindent specifies the OOGL objeto to be instantiated. @xref{References}, for the syntax of an @var{oogl-object}. The keyword @code{unit} is a synonym for @code{geom}. @example transform ["@{"] @code{4x4 transform} ["@}"] @end example @noindent specifies a single transformation matrix. Either the matrix may appear literally as 16 numbers, or there may be a reference to a "transform" objeto, i.e. @example "<" file-containing-4x4-matrix @end example or @example ":" symbol-representing-transform-object @end example Another way to specify the transformation is @example transforms @var{oogl-object} @end example The @var{oogl-object} must be a @code{TLIST} objeto (list of transformations) objeto, or a @code{LIST} whose members are ultimately @code{TLIST} objetos. In effect, the @code{transforms} keyword takes a collection of 4x4 matrices and replicates the @code{geom} objeto, making one copy for each 4x4 matrix. If no @code{transform} nor @code{transforms} keyword appears, no transformation is applied (actually the identity is applied). You could use this for, e.g., wrapping an appearance around an externally-supplied objeto, though a single-membered LIST would do this more efficiently. @xref{Transformation matrices}, for the matrix format. When replicating a single geometry by means of a @code{TLIST} objeto (see @samp{transforms} above) it may be useful to transform texture co-ordinates by another list of transformations; that list can be specified by @example txtransforms @var{TLIST-object} @end example The number of texture transformations must match the number of geometry transformations. The @code{SPHERE} objeto (@pxref{SPHERE, Sphere Objetos}) uses this technique to generate an entire textured sphere out of some fraction of a sphere (usually one octant). A single @var{(N+1)}-dimensional transformation can be specified by @example ntransform ["@{"] @var{N+1} @var{N+1} @code{(N+1)x(N+1) floats} ["@}"] @end example @noindent This gives a single @var{N+1}-dimensional transformation matrix. Either the matrix may appear literally as @var{(N+1)}x@var{(N+1)} numbers, or there may be a reference to an @samp{ntransform} objeto, i.e. @example "<" file-containing-@var{(N+1)}x@var{(N+1)}-matrix @end example or @example ":" symbol-representing-ntransform-object @end example @xref{ND Transformation matrices}, for the matrix format. Two more INST fields are accepted: @code{location} and @code{origin}. Note that @code{location} as well as @code{origin} are ignored if this @code{INST} objeto carries an @code{ntransform}. Also, if ND-viewing is active (@code{ND-axes} command, @pxref{GCL}) then @code{INST} objetos with @code{origin} unequal to @code{local} will not be drawn, though the @code{location} stuff may work (or not). @example location [global or camera or ndc or screen or local] @end example Normally an INST specifies a position relative to its parent objeto; the @code{location} field allows putting an objeto elsewhere. @itemize @bullet @item @code{location global} attaches the objeto to the global (a.k.a. universe) coordinate system -- the same as that in which geomview's World objetos, alien geometry, and c@^{a}meras are placed. @item @code{location camera} places the objeto relative to the camera. (Thus if there are multiple views, it may appear in a different spatial position in each view.) The center of the camera's view is along its negative Z axis; positive X is rightward, positive Y upward. Normally the units of c@^{a}mera space are the same as global coordinates. When a c@^{a}mera is reset, the global origin is at (0,0,-3.0). @item @code{location ndc} places the objeto relative to the normalized unit cube into which the camera's projection (perspective or orthographic) maps the visible world. X, Y, and Z are each in the range from -1 to +1, with Z = -1 the near and Z = +1 the far clipping plane, and X and Y increasing rightward and upward respectively. Thus something like @example INST transform 1 0 0 0 0 1 0 0 0 0 1 0 -.9 -.9 -.999 1 location ndc geom < label.vect @end example pastes @code{label.vect} onto the lower left corner of each window, and in front of nearly everything else, assuming @code{label.vect}'s contents lie in the positive quadrant of the X-Y plane. It's tempting to use -1 rather than -.999 as the Z component of the position, but that may put the objeto just nearer than the near clipping plane and make it (partially) invisible, due to floating-point error. @item @code{location screen} places the objeto in screen coordinates. The range of Z is still -1 through +1 as for ndc coordinates; X and Y are measured in pixels, and range from (0,0) at the @emph{lower left} corner of the window, increasing rightward and upward. @end itemize @code{location local} is the default; the objeto is positioned relative to its parent. @example origin [global or camera or ndc or screen or local] x y z @end example The @code{origin} field translates the contents of the INST to place the origin at the specified point of the given coordinate system. Unlike @code{location}, it doesn't change the orientation, only the choice of origin. Both @code{location} and @code{origin} can be used together. So for example @example @{ INST location screen origin ndc 0 0 -.99 geom @{ < xyz.vect @} transform @{ 100 0 0 0 0 100 0 0 0 0 -.009 0 0 0 0 1 @} @} @end example places xyz.vect's origin in the center of the window, just beyond the near clipping plane. The unit-length X and Y edges are scaled to be just 100 screen units -- pixels -- long, regardless of the size of the window. @menu * INST Examples:: Some example of @code{INST} Files. @end menu @comment ................................................................ @node INST Examples, , INST, INST @subsubsection INST Examples Here are some examples of @code{INST} files @example INST unit < xyz.vect transform @{ 1 0 0 0 0 1 0 0 0 0 1 0 1 3 0 1 @} @end example @example @{ appearance @{ +edge material @{ edgecolor 1 1 0 @} @} INST geom < mysurface.quad @} @end example @example @{INST transform @{: T@} geom @{ @} @} geom @{ # stuff replicated by all the above matrices @dots{} @} @} @end example This one resembles the @code{origin} example in the section above, but makes the X and Y edges be 1/4 the size of the window (1/4, not 1/2, since the range of ndc X and Y coordinates is -1 to +1). @example @{ INST location ndc geom @{ < xyz.vect @} transform @{ .5 0 0 0 0 .5 0 0 0 0 -.009 0 0 0 -.99 1 @} @} @end example @comment ---------------------------------------------------------------- @node LIST, TLIST, INST, Object File Formats @subsection LIST Files The conventional suffix for a @code{LIST} file is @file{.list}. A list of OOGL objetos Syntax: @example LIST @var{oogl-object} @var{oogl-object} @dots{} @end example Note that there's no explicit separation between the oogl-objetos, so they should be enclosed in curly braces (@{ @}) for sanity. Likewise there's no explicit marker for the end of the list; unless appearing alone in a disk file, the whole construct should also be wrapped in braces, as in: @example @{ LIST @{ QUAD @dots{} @} @{ < xyz.quad @} @} @end example A @code{LIST} with no elements, i.e. @code{@{ LIST @}}, is valid, and is the easiest way to create an empty objeto. For example, to remove a symbol's definition you might write @example @{ define somesymbol @{ LIST @} @} @end example @comment ---------------------------------------------------------------- @node TLIST, GROUP, LIST, Object File Formats @subsection TLIST Files The conventional suffix for a @code{TLIST} file is @file{.grp} ("group") or or @file{.prj} ("projective" matrices). Collection of 4x4 matrices, used in the @code{transforms} section of and @code{INST} objeto. Syntax: @example TLIST # key word <4x4 matrix (16 floats)> @dots{} # Any number of 4x4 matrices @end example @code{TLIST}s are used only within the @code{transforms} clause of an @code{INST} objeto. They cause the @code{INST}s @code{geom} objeto to be instantiated once under each of the transforms in the @code{TLIST}. The effect is like that of a @code{LIST} of @code{INST}s each with a single transform, and all referring to the same objeto, but is more efficient. Be aware that a @code{TLIST} is a kind of geometry objeto, distinct from a @code{transform} objeto. Some contexts expect one type of objeto, some the other. For example in @example INST transform @{ : @var{myT} @} geom @{ @dots{} @} @end example @noindent @var{myT} must be a transform objeto, which might have been created with the GCL @example (read transform @{ define myT 1 0 0 1 @dots{} @}) @end example @noindent while in @example INST transforms @{ : @var{myTs} @} geom @{ @dots{} @} or INST transforms @{ LIST @{: @var{myTs}@} @{< more.prj@} @} geom @{ @dots{} @} @end example @noindent @var{myTs} must be a geometry objeto, defined e.g. with @example (read geometry @{ define @var{myTs} @{ TLIST 1 0 0 1 @dots{} @} @}) @end example A @code{TLIST BINARY} format is accepted. Binary data begins with a 32-bit integer giving the number of transformations, followed by that number of 4x4 matrices in 32-bit floating-point format. The order of matrix elements is the same as in the ASCII format. @comment ---------------------------------------------------------------- @node GROUP, DISCGRP, TLIST, Object File Formats @subsection GROUP Files This format is obsolete, but is still accepted. It combined the functions of @code{INST} and @code{TLIST}, taking a series of transformations and a single Geom (@code{unit}) objeto, and replicating the objeto under each transformation. @example GROUP @dots{} < matrices > @dots{} unit @{ @var{oogl-object} @} @end example is still accepted and effectively translated into @example INST transforms @{ TLIST @dots{} @dots{} @} unit @{ @var{oogl-object} @} @end example @comment ---------------------------------------------------------------- @node DISCGRP, COMMENT, GROUP, Object File Formats @subsection DISCGRP Files This format is for discrete groups, such as appear in the theory of manifolds or in symmetry patterns. This format has its own man page. See discgrp(5). @comment ---------------------------------------------------------------- @node COMMENT, , DISCGRP, Object File Formats @subsection COMMENT Objects The COMMENT objeto is a mechanism for encoding arbitrary data within an OOGL objeto. It can be used to keep track of data or pass data back and forth between external modules. Syntax: @example COMMENT # key word @var{name} @var{type} # individual name and type specifier @{ @dots{} @} # arbitrary data @end example The data, which must be enclosed by curly braces, can include anything except unbalanced curly braces. The @var{type} field can be used to identify data of interest to a particular program through naming conventions. @code{COMMENT} objetos are intended to be associated with other objetos through inclusion in a @code{LIST} objeto. (@xref{LIST}.) The "#" OOGL comment syntax does not suffice for data exchange since these comments are stripped when an OOGL objeto is read in to Geomview. The @code{COMMENT} objeto is preserved when loaded into Geomview and is written out intact. Here is an example associating a WorldWide Web URL with a piece of geometry: @example @{ LIST @{ < Tetrahedron@} @{COMMENT GCHomepage HREF @{ http://www.geomview.org/ @}@} @} @end example A binary @code{COMMENT} format is accepted. Its format is not consistent with the other OOGL binary formats. @xref{Binary format}. The @code{name} and @code{type} are followed by @example @var{N} @var{Byte1} @var{Byte2} @dots{} @var{ByteN} @end example instead of data enclosed in curly braces. @comment ================================================================ @node Non-geometric objects, , Object File Formats, OOGL File Formats @section Non-geometric objects The syntax of these objetos is given in the form used in @xref{References}, where "quoted" items should appear literally but without quotes, square bracketed ([ ]) items are optional, and | separates alternative choices. @menu * appearance:: Appearance objetos. * image:: Image objetos. * transform:: Transformation matrices. * ntransform:: N-dimensional transformation matrices. * camera:: C@^{a}meras. * window:: Windows. @end menu @comment ---------------------------------------------------------------- @node appearance, image, Non-geometric objects, Non-geometric objects @subsection Appearance Objects Appearances are OOGL objetos of their own right, which simply means that it is possible to give them symbolic names (@pxref{References}). There are other sections dealing with appearance details. @xref{Appearances}. @node image, transform, appearance, Non-geometric objects @subsection Image Objects Image objetos are used to specify pixmap data for either textures (@pxref{Texture Mapping}), or for background images of c@^{a}meras (@pxref{camera, Camera objects}). At the time of this writing images are comprised of 1 to 4 channels, a channel provides a single number in the range from 0 to @code{maxval} for each pixel; and @code{maxval} is tied to 255. The interpretation of the image data depending on the number of channels is like follows: @multitable @columnfractions 0.2 0.2 0.6 @headitem #Channels @tab Channel No. @tab Interpretation @item 1 @tab 1 @tab greyscale or luminance data @item 2 @tab 1 @tab greyscale or luminance data @item @code{ } @tab 2 @tab alpha channel (0: transparent, @code{maxval}: opaque) @item 3 @tab 1 @tab red channel @item @code{} @tab 2 @tab green channel @item @code{} @tab 3 @tab blue channel @item 4 @tab 1 @tab red channel @item @code{} @tab 2 @tab green channel @item @code{} @tab 3 @tab blue channel @item @code{} @tab 4 @tab alpha channel (0: transparent, @code{maxval}: opaque) @end multitable Image data can be specified inline (embedded into the current data stream) or via file references; in both cases the data is read in and interpreted at the time the image objeto is parsed. @emph{This is different from the old (and deprecated) texture image specification, where the the image data on-disk would eventually be re-read by Geomview}. The general syntax of image objetos is like follows: @example ::= [ "@{" ] (curly brace, generally needed to make the end of the objeto unambiguous.) [ "image" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines an image named , setting its value from the stuff which follows) | "<" (meaning: read image from that file) | ":" (meaning: use variable @var{name}, defined elsewhere; if undefined the image carries no data) | (actual stuff defining the image; image data must come last, after defining the width and height and number of channels) "width" (width of the image, auto-detected from image data if possible) "height" (height of the image, auto-detected from image data if possible) "channels" (number of channels, auto-detected from image data and @code{data} specifications, if possible) "maxval" (unsupported, must be @code{255} if specified) "data DESTMASK [FILTER] [@{] < FILENAME [@}]" "data DESTMASK [FILTER] DATASIZE [@{][\n]LITERAL_IMAGE_DATA[@}]" (either external or embedded image data, see below for a detailed description of the meaning of @emph{MASK} and @emph{FILTER}. An image can (and has, in general) multiple data sections.) [ "@}" ] (matching curly brace) @end example @b{Details concerning the image data specification:} @table @samp @item DESTMASK This is a bit-field describing where the specified image data should be placed in the destination pixmap. The bit-field is specified by an integer in one of the known formats (decimal, octal, hexadecimal). The channels of the source data are always enumbered consecutively. If, e.g. @samp{FILENAME} or @samp{LITERAL_IMAGE_DATA} specify a three-channel (probably RGB @dots{}) image and @samp{DESTMASK} equals @code{0xD} (i.e. bit 1 is 0), then the 3rd channel of the source pixmap would be placed in the 4th channel of the destination image objeto (the alpha channel), the 2nd source channel would determine the @samp{blue} destination value and the 1st source channel the @samp{red} destination value. The number of channels of the source data always has to match the number of bits set in @samp{DESTMASK}. @b{Exception:} if the source pixmap has only one channel, then it can be used to fill any number of destination channels; all channels specified in @samp{DESTMASK} are filled with the data of the single channel source pixmap. Geomview knows the following symbolic constants, which can be used instead of specifying the @samp{DESTMASK} bit-field numerically: @table @code @item LUMINANCE same as @samp{1}, @samp{0x1}, @samp{\01} @item LUMINANCE_ALPHA same as @samp{3}, @samp{0x3}, @samp{\03} @item RGB same as @samp{7}, @samp{0x7}, @samp{\07} @item RGBA same as @samp{15}, @samp{0xf}, @samp{\017} @item ALPHA depends on the context: the absolute number of channels must be known; i.e. @samp{data ALPHA @dots{}} must be prepended by something determining the number of channels of the image, e.g. @example ... data RGB ... data ALPHA ... @end example is valid, but @example data ALPHA ... @end example is not valid, because Geomview has not means to determine the destination channel from the context. @item AUTO PGM image data is interpreted as single grey-scale channel, RGB PNM data as RGB image data. @code{AUTO} cannot work with @samp{raw} image data. @end table @item FILTER The @samp{FILTER} specification is optional. If it is missing, then Geomview tries to determine the image type from the @samp{FILENAME} suffix. If there is no suffix or the suffix is unknown, or for embedded image data, Geomview is able to auto-detectc SGI image file formats (for historical reasons @dots{}) and NetPBM image formats (for practical reasons). The auto-detection of NetPBM formats includes the new @dfn{PAM} image format which allows (among other things) to store an alpha channel together with the luminance or RGB data. Likewise, the final output of any of the specified filters must either be in SGI image file format, or specify a PAM, PNM or PGM image. If the image file format cannot be determined by either the filenmae suffix or the filter specification or by auto-deteciong of SGI or NetPBM data, then Geomview assume that it is raw-data. See below. The decompression filters may be prepended to either one of the know image formats or an explicitly specified filter, e.g. the following is valid: @example data LUMINANCE raw.gzip @{ < gzippedgreymapfile @} @end example The above should be equivalent to @example data LUMINANCE raw @{ < greymapfile @}, @end example provided that the decompressed data carries single channel data, with the first pixel corresponding to the lower-left corner (because of the @samp{raw} image format, see below). Geomview has builtin knowledge for the following filters/suffixes: @table @b @item Data Decompression @table @samp @item z @item gz @item gzip data is piped through @samp{gzip -dc} @item bz2 @item bzip2 data is piped through @samp{bzip2 -dc} @end table @item Image Formats @table @samp @item tiff @item tif @code{TIFF} image file format. Only supported if the @code{tifftopnm} executable can be fond in the current excution path. @item png @code{PNG} image file format. Only supported if the @code{pngtopnm} executable can be fond in the current excution path. @item jpg @item jpeg @code{JPEG} image file format. Only supported if the @code{jpegtopnm} executable can be fond in the current excution path. @item gif @code{GIF} image file format. Only supported if the @code{giftoppm} executable can be fond in the current excution path. @item raw Raw image data; the number of channels must match the number of bits set in @samp{DESTMASK}. Pixels are specified with 1 byte per channel. The pixels are organized in rows as @samp{liminance[-alpha]} or @samp{RGB[A]} samples. The left-most pixel is the first pixel in each data-row, the top-most image row must come first (this is just the same as the NetPBM convention, the image co-ordinate systems has its origin in the left/top corner, as usual). @end table @item Explicitly Specified Filters If none of the suffixes specified above should match, then the suffix/filter is interpreted as an external filter program; the filter program must read from @code{STDIN} and write to @code{STDOUT}. The output must either be in SGI image format, or in PNM or PGM format. Otherwise the output data is interpreted as raw image data (see above). Something like the following should work, provided that the program @file{$@{HOME@}/bin/bububfilter} exists, is executable and does something useful: @example ... data RGB "$@{HOME@}/bin/bububfilter.bzip2" 7 @{ # binary data follows bububub @} ... @end example Note that -- prior to feeding the data to the @samp{bububfilter} -- Geomview will try to decompress the stuff with @samp{bzip2 -dc}. @end table @end table @b{Missing image data:} Normally, the number of image channels is determined automatically from the image @code{data} specifications; if the image specification carries an explicit number of channels via the @code{channels} keyword which exceeds the number of channels found in the image @code{data} specifications, or if the union of all @samp{DESTMASK} specfications has holes, then missing luminance and RGB channels are initialized to 0, and a missing alpha-channel is initialized to @code{maxval}, i.e. omitting the alpha channel data for an RGBA image is just the same as defining an RGB image. @node transform, ntransform, image, Non-geometric objects @subsection Transform Objects Where a single 4x4 matrix is expected -- as in the @code{INST} @code{transform} field, the camera's @code{camtoworld} transform and the Geomview @code{xform*} commands -- use a transform objeto. Note that a transform is distinct from a @code{TLIST}, which is a type of geometry. @code{TLIST}s can contain one or more 4x4 transformations; "transform" objetos must have exactly one. Why have both? In many places -- e.g. c@^{a}mera positioning -- it's only meaningful to have a single transform. Using a separate objeto type enforces this. Syntax for a transform objeto is @example ::= [ "@{" ] (curly brace, generally needed to make the end of the objeto unambiguous.) [ "transform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) (interpreted as a 4x4 homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "@}" ] (matching curly brace) @end example The whole should be enclosed in @{ braces @}. Braces are not essential if exactly one of the above items is present, so e.g. a 4x4 array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used: @example # Example 1: A GCL command to define a transform # called "fred" (read transform @{ transform define fred 1 0 0 0 0 1 0 0 0 0 1 0 -3 0 1 1 @} ) @end example @example # Example 2: A camera objeto using transform # "fred" for camera positioning # Given the definition above, this puts the camera at # (-3, 0, 1), looking toward -Z. @{ camera halfyfield 1 aspect 1.33 camtoworld @{ : fred @} @} @end example @comment ---------------------------------------------------------------- @node ntransform, camera, transform, Non-geometric objects @subsection ND-Transform Objects Where -- in the context of ND-viewing -- a single (N+1)x(N+1) matrix is expected -- as in the @code{INST} @code{ntransform} field, or the @code{ND-xform*} (@pxref{GCL}) commands -- use an @code{ntransform} objeto. @code{ntransform} are @var{NRows} x @var{NCols} transformation matrix where usually @var{NRows} = @var{N+1} in the context of @var{N}-dimensional objetos and viewing. The homogeneous component of an @code{ntransform} sits at column zero (in contrast to ordinary @code{transform} objetos where it is located at column three). @code{ntransform} objetos operate on points of any dimension: if a point is to be transformed by an @code{ntransform} objeto and the dimension of the point does not match the number of rows of the @code{ntransform} objeto, then either the point is implicitly padded with zeros to match @var{NRows} or the matrix is implicitly padded with ones down its diagonal (and zeros everywhere else) such that it will operate as identity on the excess dimensions of the input point. Syntax for an @code{ntransform} objeto is @example ::= [ "@{" ] (curly brace, generally needed to make the end of the objeto unambiguous.) [ "ntransform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) @var{NRows} @var{NCols} (number of rows and columns of the matrix, typically @var{N+1} @var{N+1}, but any dimensions are possible) <@var{NRows} x @var{NCols} floating-point numbers> (interpreted as a @var{NRows} x @var{NCols} homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the @b{top} row -- in contrast to the ordinary transform objetos where the translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "@}" ] (matching curly brace) @end example The whole should be enclosed in @{ braces @}. Braces are not necessarily essential, so e.g. two integers -- @var{NRows} @var{NCols} -- followed by a @var{NRows} x @var{NCols} array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used: @example # Example 1: A GCL command to define a @code{6x6} transform called # "fred", a mere translation by the vector @code{-3 0 1 1 0}. This # transform is meant for a five dimensional space, with an homogeneous # component a index zero. (read ntransform @{ ntransform define fred 6 6 1 -3 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 @} ) @end example @example # Example 2: Set the ND-xform of an objeto -- a geometry or a camera # cluster. Given the definition above, this puts the objeto at (-3 0 1 1 # 0) in the five dimensional space. (ND-xform-set focus : fred) # or (ND-xform-set g1 : fred) @end example @comment ---------------------------------------------------------------- @node camera, window, ntransform, Non-geometric objects @subsection cameras A c@^{a}mera objeto specifies the following properties of a camera: @table @asis @item position and orientation specified by either a camera-to-world or world-to-camera transformation; this transformation does not include the projection, so it's typically just a combination of translation and rotation. Specified as a transform objeto, typically a 4x4 matrix. @item "focus" distance Intended to suggest a typical distance from the c@^{a}mera to the objeto of interest; used for default c@^{a}mera positioning (the c@^{a}mera is placed at (X,Y,Z) = (0,0,focus) when reset) and for adjusting field-of-view when switching between perspective and orthographic views. @item window aspect ratio True aspect ratio in the sense /. This normally should agree with the aspect ratio of the camera's window. Geomview normally adjusts the aspect ratio of its c@^{a}meras to match their associated windows. @item near and far clipping plane distances Note that both must be strictly greater than zero. Very large / distance ratios cause Z-buffering to behave badly; part of an objeto may be visible even if somewhat more distant than another. @item field of view Specified in either of two forms. @table @samp @item fov is the field of view -- in degrees if perspective, or linear distance if orthographic -- in the @emph{shorter} direction. @item halfyfield is half the projected Y-axis field, in world coordinates (not angle!), at unit distance from the camera. For a perspective camera, halfyfield is related to angular field: @center halfyfield = tan( Y_axis_angular_field / 2 ) while for an orthographic one it's simply: @center halfyfield = Y_axis_linear_field / 2 @end table This odd-seeming definition is (a) easy to calculate with and (b) well-defined in both orthographic and perspective views. @item background color Arguably not a property of a camera, but of the scene. Nevertheless, as there is no "background" OOGL objeto, and the background color should not be a property of the drawing device, it can be specified here. At the time of this writing, however, the GUI always overrides the background color with its own settings. @item background image Same reasoning as above, only that the GUI does not override this setting. The image is centered at NDC co-ordinates @code{(0,0,-1)}; it is not resized, just painted behind everything else as is. @xref{image, Image objetos}. @end table The syntax for a c@^{a}mera is: @example ::= [ "camera" ] (optional keyword) [ "@{" ] (opening brace, generally required) [ "define" ] "<" | ":" | (or any number of the following, in any order@dots{}) "perspective" @{"0" | "1"@} (default 1) (otherwise orthographic) "stereo" @{"0" | "1"@} (default 0) (otherwise mono) "worldtocam" (see transform syntax above) "camtoworld" (no point in specifying both camtoworld and worldtocam; one is constrained to be the inverse of the other) "halfyfield" (default tan 40/2 degrees) "fov" (angular field-of-view if perspective, linear field-of-view otherwise. Measured in whichever direction is smaller, given the aspect ratio. When aspect ratio changes -- e.g. when a window is reshaped -- "fov" is preserved.) "frameaspect" (X/Y) (default 1.333) "near" (default 0.1) "far" (default 10.0) "focus" (default 3.0) "bgcolor" (default 1/3 1/3 1/3 1) "bgimage" @{ @} (default no background image) [ "@}" ] (matching closebrace) @end example @comment ---------------------------------------------------------------- @node window, , camera, Non-geometric objects @subsection window A window objeto specifies size, position, and other window-system related information about a window in a device-independent way. The syntax for a window objeto is: @example window ::= [ "window" ] (optional keyword) [ "@{" ] (curly brace, often required) (any of the following, in any order) "size" (size of the window) "position" (position & size) "noborder" (specifies the window should have no window border) "pixelaspect" (specifies the true visual aspect ratio of a pixel in this window in the sense xsize/ysize, normally 1.0. For stereo hardware which stretches the display vertically by a factor of 2, ``pixelaspect 0.5'' might do. The value is used when computing the projection of a camera associated with this window.) [ "@}" ] (matching closebrace) @end example Window objetos are used in the Geomview @code{window} and @code{ui-panel} commands to set default properties for future windows or to change those of an existing window. @xref{window, @code{(window @dots{})}}. @xref{ui-panel, @code{(ui-panel @dots{})}}. @comment **************************************************************** @node Customization, Modules, OOGL File Formats, Top @chapter Customization: @file{.geomview} files When Geomview is started, it loads and executes commands in a system-wide startup file named @file{.geomview}. This file is in the @file{data} subdirectory of the Geomview distribution directory and contains GCL commands to configure Geomview in a way common to all users on the system. Next, Geomview looks for the file @file{~/.geomview} (@file{~} stands for your home directory). You can use this to configure your own default Geomview behavior to suit your tastes. After reading @file{~/.geomview}, Geomview looks for a file named @file{.geomview} in the current directory. If such a file exists Geomview reads it, unless it is the same as @file{~/.geomview} (which would be the case if you are running Geomview from your home directory). You can use the current directory's @file{.geomview} to create a Geomview customization specific to a certain project. You can use @file{.geomview} files to control all kinds of things about Geomview. They can contain any valid GCL statements. Especially useful is the @code{ui-panel} command which controls the initial placement of Geomview's panels. For an example see the system-wide @file{.geomview} file mentioned above. @xref{GCL}. @xref{ui-panel, @code{(ui-panel @dots{})}}. It is a good idea to enclose all the commands you put in a @file{.geomview} file in a @code{progn} statement in order to cause Geomview to execute them all at once. Otherwise Geomview might execute them sequentially over the first few refresh cycles after starting up. To change, e.g. the focus policy of the janela de c@^{a}mera such that they pick up the focus policy of the window manager (instead of being activated when the mouse cursor crosses the window), you could put the following in your @file{~/.geomview} file: @example (progn (ui-cam-focus focus-change) @dots{} # other stuff ) @end example You can put any valid @code{GCL} command into your @file{.geomview} files,@pxref{GCL}. @xref{progn,@code{(progn @dots{})}}. @xref{ui-cam-focus,@code{(ui-cam-focus @dots{})}}. @comment **************************************************************** @node Modules, GCL, Customization, Top @chapter External Modules An external module is a program that interacts with Geomview. A module communicates with Geomview through GCL and can control any apsect of Geomview that you can control through Geomview's user interface. In many cases an external module is a specialized program that implements some mathematical algorithm that creates a geometric objeto that changes shape as the algorithm progresses. The module informs Geomview of the new objeto shape at each step, so the objeto appears to evolve with time in the Geomview window. In this way Geomview serves as a @emph{display engine} for the module. An external module may be interactive. It can respond to mouse and keyboard events that take place in a Geomview window, thus extending the capability of Geomview itself. @menu * Interface:: How External Modules Interface with Geomview. * Example1:: Simple External Module. * Example2:: Simple External Module with FORMS Control Panel. * XForms:: The XForms library. * Example3:: External Module with Bi-Directional Communication. * Example4:: Simple Tcl/Tk Module Demonstrating Picking. * Module Installation:: Module Installation. @end menu @node Interface, Example1, Modules, Modules @section How External Modules Interface with Geomview External modules appear in the @emph{Modules} browser in Geomview's @emph{Main} panel. To run a module, clique the bot@~{a}o esquerdo do mouse on the module's entry in the browser. While the module is running, an additional line for that module will appear in red in the browser. This line begins with a number in brackets, which indicates the @emph{instace} number of the module. (For some modules it makes sense to have more than one instance of the module running at the same time.) You can kill an external module by clicando on its red instance entry. By default when Geomview starts, it displays all the modules that have been installed on your system. For instructions on installing a module on your system so that it will appear in the @emph{Modules} browser every time Geomview is run by anyone on your system, @xref{Module Installation}. When Geomview invokes an external module, it creates pipes connected to the module's standard input and output. (Pipes are like files except they are used for communication between programs rather than for storing things on a disk.) Geomview interprets anything that the module writes to its standard output as a GCL command. Likewise, if the external module requests any data from Geomview, Geomview writes that data to the module's standard input. Thus all a module has to do in order to communicate with Geomview is write commands to standard output and (optionally) receive data on standard input. Note that this means that the module cannot use standard input and output for communicating with the user. If a module needs to communicate with the user it can do so either through a control panel of its own or else by responding to certain events that it finds out about from Geomview. @node Example1, Example2, Interface, Modules @section Example 1: Simple External Module This section gives a very simple external module which displays an oscillating mesh. To try out this example, make a copy of the file @file{example1.c} (it is distributed with Geomview in the @file{doc} subdirectory) in your directory and compile it with the command @example cc -o example1 example1.c -lm @end example Then put the line @example (emodule-define "Example 1" "./example1") @end example @noindent in a file called @file{.geomview} in your current directory. Then invoke Geomview; it is important that you compile the example program, create the @file{.geomview} file, and invoke Geomview all in the same directory. You should see "Example 1" in the @emph{Modules} browser of Geomview's @emph{Main} panel; clique sobre o this entry in the browser to start the module. A surface should appear in your janela de c@^{a}mera and should begin oscillating. You can stop the module by clicando on the red "[1] Example 1" line in the @emph{Modules} browser. @example @comment #include "example1.c" /* * example1.c: oscillating mesh * * This example module is distributed with the Geomview manual. * If you are not reading this in the manual, see the "External * Modules" chapter of the manual for more details. * * This module creates an oscillating mesh. */ #include #include /* F is the function that we plot */ float F(x,y,t) float x,y,t; @{ float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); @} main(argc, argv) char **argv; @{ int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t, dt; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Geomview setup. We begin by sending the command * (geometry example @{ : foo@}) * to Geomview. This tells Geomview to create a geom called * "example" which is an instance of the handle "foo". */ printf("(geometry example @{ : foo @})\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) @{ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); @} @} /* UpdateMesh sends one mesh iteration to Geomview. This consists of * a command of the form * (read geometry @{ define foo * MESH * ... * @}) * where ... is the actual data of the mesh. This command tells * Geomview to make the value of the handle "foo" be the specified * mesh. */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; @{ int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry @{ define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include #include /* for struct timeval below */ #include "forms.h" /* for FORMS library */ FL_FORM *OurForm; FL_OBJECT *VelocitySlider; float dt; /* F is the function that we plot */ float F(x,y,t) float x,y,t; @{ float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); @} /* SetVelocity is the slider callback procedure; FORMS calls this * when the user moves the slider bar. */ void SetVelocity(FL_OBJECT *obj, long val) @{ dt = fl_get_slider_value(VelocitySlider); @} /* Quit is the "Quit" bot@~{a}o callback procedure; FORMS calls this * when the user cliques the "Quit" bot@~{a}o. */ void Quit(FL_OBJECT *obj, long val) @{ exit(0); @} /* create_form_OurForm() creates the FORMS panel by calling a bunch of * procedures in the FORMS library. This code was generated * automatically by the FORMS designer program; normally this code * would be in a separate file which you would not edit by hand. For * simplicity of this example, however, we include this code here. */ create_form_OurForm() @{ FL_OBJECT *obj; FL_FORM *form; OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0); obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,""); VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0, 340.0,40.0,"Velocity"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_object_align(obj,FL_ALIGN_TOP); fl_set_call_back(obj,SetVelocity,0); obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_call_back(obj,Quit,0); fl_end_form(); @} main(argc, argv) char **argv; @{ int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t; int fdmask; static struct timeval timeout = @{0, 200000@}; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Forms panel setup. */ foreground(); create_form_OurForm(); fl_set_slider_bounds(VelocitySlider, 0.0, 1.0); fl_set_slider_value(VelocitySlider, dt); fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2"); /* Geomview setup. */ printf("(geometry example @{ : foo @})\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) @{ fdmask = (1 << fileno(stdin)) | (1 << qgetfd()); select(qgetfd()+1, &fdmask, NULL, NULL, &timeout); fl_check_forms(); UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); @} @} /* UpdateMesh sends one mesh iteration to Geomview */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; @{ int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry @{ define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include "lisp.h" /* We use the OOGL lisp library */ #include "pickfunc.h" /* for PICKFUNC below */ #include "3d.h" /* for 3d geometry library */ /* boxstring gives the OOGL data to define the little box that * we draw at the pick point. NOTE: It is very important to * have a newline at the end of the OFF objeto in this string. */ char boxstring[] = "\ INST\n\ transform\n\ .04 0 0 0\n\ 0 .04 0 0\n\ 0 0 .04 0\n\ 0 0 0 1\n\ geom\n\ OFF\n\ 8 6 12\n\ \n\ -.5 -.5 -.5 # 0 \n\ .5 -.5 -.5 # 1 \n\ .5 .5 -.5 # 2 \n\ -.5 .5 -.5 # 3 \n\ -.5 -.5 .5 # 4 \n\ .5 -.5 .5 # 5 \n\ .5 .5 .5 # 6 \n\ -.5 .5 .5 # 7 \n\ \n\ 4 0 1 2 3\n\ 4 4 5 6 7\n\ 4 2 3 7 6\n\ 4 0 1 5 4\n\ 4 0 4 7 3\n\ 4 1 2 6 5\n"; progn() @{ printf("(progn\n"); @} endprogn() @{ printf(")\n"); fflush(stdout); @} Initialize() @{ extern LObject *Lpick(); /* This is defined by PICKFUNC below but must */ /* be used in the following LDefun() call */ LInit(); LDefun("pick", Lpick, NULL); progn(); @{ /* Define handle "littlebox" for use later */ printf("(read geometry @{ define littlebox @{ %s @}@})\n", boxstring); /* Express interest in pick events; see Geomview manual for explanation. */ printf("(interest (pick world * * * * nil nil nil nil nil))\n"); /* Define "pick" objeto, initially the empty list (= null objeto). * We replace this later upon receiving a pick event. */ printf("(geometry \"pick\" @{ LIST @} )\n"); /* Make the "pick" objeto be non-pickable. */ printf("(pickable \"pick\" no)\n"); /* Turn off normalization, so that our pick objeto will appear in the * right place. */ printf("(normalization \"pick\" none)\n"); /* Don't draw the pick objeto's bounding box. */ printf("(bbox-draw \"pick\" off)\n"); @} endprogn(); @} /* The following is a macro call that defines a procedure called * Lpick(). The reason for doing this in a macro is that that macro * encapsulates a lot of necessary stuff that would be the same for * this procedure in any program. If you write a Geomview module that * wants to know about user pick events you can just copy this macro * call and change the body to suit your needs; the body is the last * argument to the macro and is delimited by curly braces. * * The first argument to the macro is the name of the procedure to * be defined, "Lpick". * * The next two arguments are numbers which specify the sizes that * certain arrays inside the body of the procedure should have. * These arrays are used for storing the face and path information * of the picked objeto. In this module we don't care about this * information so we declare them to have length 1, the minimum * allowed. * * The last argument is a block of code to be executed when the module * receives a pick event. In this body you can refer to certain local * variables that hold information about the pick. For details see * Example 3 in the Extenal Modules chapter of the Geomview manual. */ PICKFUNC(Lpick, 1, 1, @{ handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge); @}, /* version for picking Nd-objects (not documented here) */) handle_pick(picked, p, vert, v, edge, e) int picked; /* was something actually picked? */ int vert; /* was the pick near a vertex? */ int edge; /* was the pick near an edge? */ HPoint3 *p; /* coords of pick point */ HPoint3 *v; /* coords of picked vertex */ HPoint3 e[2]; /* coords of endpoints of picked edge */ @{ Normalize(&e[0]); /* Normalize makes 4th coord 1.0 */ Normalize(&e[1]); Normalize(p); progn(); @{ if (!picked) @{ printf("(geometry \"pick\" @{ LIST @} )\n"); @} else @{ /* * Put the box in place, and color it magenta if it's on a vertex, * yellow if not. */ printf("(xform-set pick @{ 1 0 0 0 0 1 0 0 0 0 1 0 %g %g %g 1 @})\n", p->x, p->y, p->z); printf("(geometry \"pick\"\n"); if (vert) printf("@{ appearance @{ material @{ diffuse 1 0 1 @} @}\n"); else printf("@{ appearance @{ material @{ diffuse 1 1 0 @} @}\n"); printf(" @{ LIST @{ :littlebox @}\n"); /* * If it's on an edge and not a vertex, mark the edge * with cyan boxes at the endpoins and a black line * along the edge. */ if (edge && !vert) @{ e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z; e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z; printf("@{ appearance @{ material @{ diffuse 0 1 1 @} @}\n\ LIST\n\ @{ INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox @}\n\ @{ INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox @}\n\ @{ VECT\n\ 1 2 1\n\ 2\n\ 1\n\ %f %f %f\n\ %f %f %f\n\ 1 1 0 1\n\ @}\n\ @}\n", e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z, e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z); @} printf(" @}\n @}\n)\n"); @} @} endprogn(); @} Normalize(HPoint3 *p) @{ if (p->w != 0) @{ p->x /= p->w; p->y /= p->w; p->z /= p->w; p->w = 1; @} @} main() @{ Lake *lake; LObject *lit, *val; extern char *getenv(); Initialize(); lake = LakeDefine(stdin, stdout, NULL); while (!feof(stdin)) @{ /* Parse next lisp expression from stdin. */ lit = LSexpr(lake); /* Evaluate that expression; this is where Lpick() gets called. */ val = LEval(lit); /* Free the two expressions from above. */ LFree(lit); LFree(val); @} @} @comment #end include @end example The code begins by defining procedures @code{progn()} and @code{endprogn()} which begin and end a Geomview @code{progn} group. The purpose of the Geomview @code{progn} command is to group commands together and cause Geomview to execute them all at once, without refreshing any graphics windows until the end. It is a good idea to group blocks of commands that a module sends to Geomview like this so that the user sees their cumulative effect all at once. Procedure @code{Initialize()} does various things needed at program startup time. It initializes the lisp library by calling @code{LInit()}. Any program that uses the lisp library should call this once before calling any other lisp library functions. It then calls @code{LDefun} to tell the library about our @code{pick} procedure, which is defined further down with a call to the @code{PICKFUNC} macro. Then it sends a bunch of setup commands to Geomview, grouped in a @code{progn} block. This includes defining a handle called @code{littlebox} that stores the geometry of the little box. Next it sends the command @example (interest (pick world * * * * nil nil nil nil nil)) @end example @noindent which tells Geomview to notify us when a pick event happens. The syntax of this @code{interest} statement merits some explanation. In general @code{interest} takes one argument which is a (parenthesized) expression representing a Geomview function call. It specifies a type of call that the module is interested in knowing about. The arguments can be any particular argument values, or the special symbols @code{*} or @code{nil}. For example, the first argument in the @code{pick} expression above is @code{world}. This means that the module is interested in calls to @code{pick} where the first argument, which specifies the coordinate system, is @code{world}. A @code{*} is like a wild-card; it means that the module is interested in calls where the corresponding argument has any value. The word @code{nil} is like @code{*}, except that the argument's value is not reported to the module. This is useful for cutting down on the amount of data that must be transmitted in cases where there are arguments that the module doesn't care about. The second, third, fourth, and fifth arguments to the @code{pick} command give the name, pick point coordinates, vertex coordinates, and edge coordinates of a pick event. We specify these by @code{*}'s above. The remaining five arguments to the @code{pick} command give other information about the pick event that we do not care about in this module, so we specify these with @code{nil}'s. For the details of the arguments to @code{pick}, @xref{GCL}. The @code{geometry} statement defines a geom called @code{pick} that is initially an empty list, specified as @code{ @{ LIST @} }; this is the best way of specifying a null geom. The module will replace this with something useful by sending Geomview another @code{geometry} command when the user picks something. Next we arrange for the @code{pick} objeto to be non-pickable, and turn normalization off for it so that Geomview will display it in the size and location where we put it, rather than resizing and relocating it to fit into the unit cube. The next function in the file, @code{Lpick}, is defined with a strange looking call to a macro called @code{PICKFUNC}, defined in the header file @file{pickfunc.h}. This is the function for handling pick events. The reason we provide a macro for this is that that macro encapsulates a lot of necessary stuff that would be the same for the pick-handling function in any program. If you write a Geomview module that wants to know about user pick events you can just copy this macro call and change it to suit yours needs. In general the syntax for @code{PICKFUNC} is @example PICKFUNC(@var{name}, @var{block}, @var{NDblock}) @end example @noindent where @var{name} is the name of the procedure to be defined, in this case @code{Lpick}. The next argument, @var{block}, is a block of code to be executed when a pick event occurs. If @var{block} contains a return statement, then the returned value must be a pointer to a Lisp-objeto, that is of type @code{LObject *}. The last argument has the same functionality as the @var{block} argument, but is only invoked when picking objetos in a higher dimensional world. @code{PICKFUNC} declares certain local variables in the body of the procedure. When the module receives a @code{(pick @dots{})} statement from Geomview, the procedure assigns values to these variables based on the information in the @code{pick} call (variables corresponding to @code{nil}'s in the @code{(interest (pick @dots{}))} are not given values). There is also a second variant of the @code{PICKFUNC} macro with a slightly different syntax: @example DEFPICKFUNC(@var{helpstr}, @var{coordsys}, @var{id}, @var{point}, @var{pn}, @var{vertex}, @var{vn}, @var{edge}, @var{en}, @var{face}, @var{fn}, @var{ppath}, @var{ppn}, @var{vi}, @var{ei}, @var{ein}, @var{fi}, @var{body}, @var{NDbody}) @end example @code{DEFPICKFUNC} can be used as well as @code{PICKFUNC}, there is no functional differene with the exception that the name of the C-function is tied to @code{Lpick} when using @code{DEFPICKFUNC} and that the @code{(help pick)} GCL-command (@pxref{help, @code{(help @dots{})}}) would respond with echoing @var{helpstr}. The table below lists all variables defined in @code{PICKFUNC} In the context of ND-viewing @code{float} variants of the arguments apply: the @var{body} execution block sees the @code{HPoint3} variables, and the @var{NDbody} block sees only flat one-dimensional arrays of @code{float}-type. In the ND-viewing context the co-ordinates passed to the pick function are still the 3-dimensional co-ordinates of the c@^{a}mera view-port where the pick occurred, but padded with zeroes on transformed back to the co-ordinate system specified by the second argument of the @code{pick} command. @table @asis @item @code{char *coordsys;} A string specifying the coordinate system in which coordinates are given. In this example, this will always be @code{world} because of the @code{interest} call above. @item @code{char *id;} A string specifying the name of the picked geom. @item @code{HPoint3 point; int pn;} @item @code{float *point; int pn;} @code{point} is an @code{HPoint3} structure giving the coordinates of the picked point. @code{HPoint3} is a homogeneous point coordinate representation equivalent to an array of 4 floats. @code{pn} tells how many coordinates have been written into this array; it will always be either @code{0}, @code{4} or greater than @code{4}. If it is greater than @code{4}, then the @var{NDbody} instruction block is invoked and in this case @code{point} is a flat array of @code{pn} many @code{float}s. A value of zero means no point was picked, i.e. the user clicado the bot@~{a}o direito do mouse while the cursor was not pointing at a geom. In this case the ordinary @var{block} 3d instruction block is executed. @item @code{HPoint3 vertex; int vn;} @item @code{float *vertex; int vn;} @code{vertex} is an @code{HPoint3} structure giving the coordinates of the picked vertex, if the pick point was near a vertex. @code{vn} tells how many coordinates have been written into this array; it will always be either @code{0} or greater equal @code{4}. A value of zero means the pick point was not near a vertex. In the context of ND-viewing @code{vertex} will be an array of @code{vn} @code{float}s and @code{vn} will be equal to @code{pn}. @item @code{HPoint3 edge[2]; int en;} @item @code{float *edge; int en;} @code{edge} is an array of two @code{HPoint3} structures giving the coordinates of the endpoints of the picked edge, if the pick point was near an edge. @code{en} tells how many coordinates have been written into this array; it will always be @code{0} or greater equal @code{8}. A value of zero means the pick point was not near an edge. In the context of ND-viewing @code{edge} will be a flat one-dimensional array of @code{en} many @code{float}s: the first @code{pn} @code{float}s define the first vertex, and the second @code{pn} many @code{float}s define the second vertex; @code{en} will be two times @code{pn}. @end table In this example module, the remaining variables will never be given values because their values in the @code{interest} statement were specified as @code{nil}. @table @asis @item @code{HPoint3 face[]; int fn;} @item @code{float *face; int fn;} @code{face} is a variable length array of @var{fn} @code{HPoint3}'s. @code{face} gives the coordinates of the vertices of the picked face. @code{fn} tells how many coordinates have been written into this array; it will always be either @code{0} or a multiple of @code{pn}. A value of zero means the pick point was not near a face. In the context of ND-viewing @code{face} is a flat one-dimensional array of @code{fn} many floats of which each vertex occupies @code{pn} many components. @item @code{int ppath[]; int ppn;} @code{ppath} is an array of @var{maxpathlen} @code{int}'s. @code{ppath} gives the path through the OOGL heirarchy to the picked primitive. @code{pn} tells how many integers have been written into this array; it will be at most @var{maxpathlen}. A path of @{3,1,2@}, for example, means that the picked primitive is "subobjeto number 2 of subobjeto number 1 of objeto 3 in the world". @item @code{int vi;} @code{vi} gives the index of the picked vertex in the picked primitive, if the pick point was near a vertex. @item @code{int ei[2]; int ein} The @code{ei} array gives the indices of the endpoints of the picked edge, if the pick point was near a vertex. @code{ein} tells how many integers were written into this array. It will always be either 0 or 2; a value of 0 means the pick point was not near an edge. @item @code{int fi;} @code{fi} gives the index of the picked face in the picked primitive, if the pick point was near a face. @end table The @code{handle_pick} procedure actually does the work of dealing with the pick event. It begins by normalizing the homogeneous coordinates passed in as arguments so that we can assume the fourth coordinate is 1. It then sends GCL commands to define the @code{pick} objeto to be whatever is appropriate for the kind of pick recieved. See @pxref{OOGL File Formats}, and @pxref{GCL}, for an explanation of the format of the data in these commands. The main program, at the bottom of the file, first calls @code{Initialize()}. Next, the call to @code{LakeDefine} defines the @code{Lake} that the lisp library will use. A @code{Lake} is a structure that the lisp library uses internally as a type of communiation vehicle. (It is like a unix stream but more general, hence the name.) This call to @code{LakeDefine} defines a @code{Lake} structure for doing I/O with @code{stdin} and @code{stdout}. The third argument to @code{LakeDefine} should be @code{NULL} for external modules (it is used by Geomview). Finally, the program enters its main loop which parses and evaluates expressions from standard input. @comment **************************************************************** @node Example4, Module Installation, Example3, Modules @section Example 4: Simple Tcl/Tk Module Demonstrating Picking It's not necessary to write a Geomview module in C. The only requirement of an external module is that it send GCL commands to its standard output and expect responses (if any) on its standard input. An external module can be written in C, perl, tcl/tk, or pretty much anything. As an example, assuming you have Tcl/Tk version 4.0 or later, here's an external module with a simple GUI which demonstrates interaction with geomview. This manual doesn't discuss the Tcl/Tk language; see the good book on the subjeto by its originator John Ousterhout, published by Addison-Wesley, titled @emph{Tcl and the Tk Toolkit}. The @samp{#!} on the script's first line causes the system to interpret the script using the Tcl/Tk @samp{wish} program; you might have to change its first line if that's in some location other than /usr/local/bin/wish4.0. Or, you could define it as a module using @example (emodule-define "Pick Demo" "wish pickdemo.tcl") @end example in which case @samp{wish} could be anywhere on the UNIX search path. @example #! /usr/local/bin/wish4.0 # We use "fileevent" below to have "readsomething" be called whenever # data is available from standard input, i.e. when geomview has sent us # something. It promises to include a trailing newline, so we can use # "gets" to read the geomview response, then parse its nested parentheses # into tcl-friendly @{@} braces. proc readsomething @{@} @{ if @{[gets stdin line] < 0@} @{ puts stderr "EOF on input, exiting..." exit @} regsub -all @{\(@} $line "\@{" line regsub -all @{\)@} $line "\@}" line # Strip outermost set of braces set stuff [lindex $line 0] # Invoke handler for whichever command we got. Could add others here, # if we asked geomview for other kinds of data as well. switch [lindex $stuff 0] @{ pick @{handlepick $stuff@} rawevent @{handlekey $stuff@} @} @} # Fields of a "pick" response, from geomview manual: # (pick COORDSYS GEOMID G V E F P VI EI FI) # The pick command is executed internally in response to pick # events (right mouse double clique). # # COORDSYS = coordinate system in which coordinates of the following # arguments are specified. This can be: # world: world coord sys # self: coord sys of the picked geom (GEOMID) # primitive: coord sys of the actual primitive within # the picked geom where the pick occurred. # GEOMID = id of picked geom # G = picked point (actual intersection of pick ray with objeto) # V = picked vertex, if any # E = picked edge, if any # F = picked face # P = path to picked primitive [0 or more] # VI = index of picked vertex in primitive # EI = list of indices of endpoints of picked edge, if any # FI = index of picked face # Report when user picked something. # proc handlepick @{pick@} @{ global nameof selvert seledge order set obj [lindex $pick 2] set xyzw [lindex $pick 3] set fv [lindex $pick 6] set vi [lindex $pick 8] set ei [lindex $pick 9] set fi [lindex $pick 10] # Report result, converting 4-component homogeneous point into 3-space point. set w [lindex $xyzw 3] set x [expr [lindex $xyzw 0]/$w] set y [expr [lindex $xyzw 1]/$w] set z [expr [lindex $xyzw 2]/$w] set s "$x $y $z " if @{$vi >= 0@} @{ set s "$s vertex #$vi" @} if @{$ei != @{@}@} @{ set s "$s edge [lindex $ei 0]-[lindex $ei 1]" @} if @{$fi != -1@} @{ set s "$s face #$fi ([expr [llength $fv]/3]-gon)" @} msg $s @} # Having asked for notification of these raw events, we report when # the user pressed these keys in the geomview graphics windows. proc handlekey @{event@} @{ global lastincr switch [lindex $event 1] @{ 32 @{msg "Pressed space bar"@} 8 @{msg "Pressed backspace key"@} @} @} # # Display a message on the control panel, and on the terminal where geomview # was started. We use ``puts stderr @dots{}'' rather than simply ``puts @dots{}'', # since Geomview interprets anything we send to standard output # as a GCL command! # proc msg @{str@} @{ global msgtext puts stderr $str set msgtext $str update @} # Load objeto from file proc loadobject @{fname@} @{ if @{$fname != ""@} @{ puts "(geometry thing < $fname)" # Be sure to flush output to ensure geomview receives this now! flush stdout @} @} # Build simple "user interface" # The message area could be a simple label rather than an entry box, # but we want to be able to use X selection to copy text from it. # The default mouse bindings do that automatically. entry .msg -textvariable msgtext -width 45 pack .msg frame .f label .f.l -text "File to load:" pack .f.l -side left entry .f.ent -textvariable fname pack .f.ent -side left -expand true -fill x bind .f.ent @{ loadobject $fname @} pack .f # End UI definition. # Call "readsomething" when data arrives from geomview. fileevent stdin readable @{readsomething@} # Geomview initialization puts @{ (interest (pick primitive)) (interest (rawevent 32)) # Be notified when user presses space (interest (rawevent 8)) # or backspace keys. (geometry thing < hdodec.off) (normalization world none) @} # Flush to ensure geomview receives this. flush stdout wm title . @{Sample external module@} msg "Click right mouse in graphics window" @end example @comment **************************************************************** @node Module Installation, , Example4, Modules @section Module Installation This section tells how to install an external module so you can invoke it within Geomview. There are two ways to install a module: you can install a @emph{private} module so that the module is available to you whenever you run Geomview, or you can install a @emph{system} module so that the module is available to all users on your system whenever they run Geomview. @menu * Private Module Installation:: Per-user modules. * System Module Installation:: System-wide modules. @end menu @comment ---------------------------------------------------------------- @node Private Module Installation, System Module Installation, Module Installation, Module Installation @subsection Private Module Installation The @code{emodule-define} command arranges for a module to appear in Geomview's @emph{Modules} browser. The command takes two string arguments; the first is the name that will appear in the @emph{Modules} browser. The second is the shell command for running the module; it may include arguments (@pxref{emodule-define,@code{(emodule-define @dots{})}}). Geomview executes this command in a subshell when you clique sobre o the module's entry in the browser. For example @example (emodule-define "Foo" "/u/home/modules/foo -x") @end example @noindent adds a line labeled "Foo" to the @emph{Modules} browser which causes the command "/u/home/modules/foo -x" to be executed when selected. You may put @code{emodule-define} commands in your @file{~/.geomview} file to arrange for certain modules to be available every time you run Geomview; @xref{Customization}. You can also execute @code{emodule-define} commands from the @emph{Commands} panel to add a module to an already running copy of Geomview. There are several other GCL commands for controlling the entries in the @emph{Modules} browser; for details, @xref{GCL}. @comment ---------------------------------------------------------------- @node System Module Installation, , Private Module Installation, Module Installation @subsection System Module Installation To install a module so that it is available to all Geomview users do the following @table @asis @item 1. Create a file called @file{.geomview-@var{module}} where @file{@var{module}} is the name of the module. This file should contain a single line which is an @code{emodule-define} command for that module: @example (emodule-define "New Module" "newmodule") @end example The first argument, @code{"New Module"} above, is the string that will appear in the @emph{Modules} browser. The second string, @code{"newmodule"} above, is the Bourne shell command for invoking the module. It may include arguments, and you may assume that the module is on the $path searched by the shell. @item 2. Put a copy of the @file{.geomview-@var{module}} and the module executable itself in Geomview's @file{modules/} directory, where @file{} is your system type. @end table After these steps, the new module should appear, in alphabetical position, in the @emph{Modules} browser of Geomview's @emph{Main} panel next time Geomview is run. The reason this works is that when Geomview is invoked it processes all the @file{.geomview-*} files in its @file{modules} directory. It also remembers the pathname of this directory and prepends that path to the $path of the shell in which it invokes such a module. @comment **************************************************************** @node GCL, Non-Euclidean Geometry, Modules, Top @chapter GCL: the Geomview Command Language GCL has the syntax of lisp -- i.e. an expression of the form (f a b @dots{}) means pass the values of a, b, @dots{} to the function f. GCL is very limited and is by no means an implementation of lisp. It is simply a language for expressing commands to be executed in the order given, rather than a programming language. It does not support variable or function definition. GCL is the language that Geomview understands for files that it loads as well as for communication with other programs. To execute a GCL command interactively, you can bring up the @emph{Commands} panel which lets you type in a command; Geomview executes the command when you hit the @key{Enter} key. Output from such commands is printed to standard output. Alternately, you can invoke Geomview as @code{geomview -c -} which causes it to read GCL commands from standard input. GCL functions return a value, and you can nest function calls in ways which use this returned value. For example @example (f (g a b)) @end example evaluates @code{(g a b)} and then evaluates @code{(f x)} where @code{x} is the result returned by @code{(g a b)}. Geomview maintains these return values internally but does not normally print them out. To print out a return value pass it to the @code{echo} function. For example the @code{geomview-version} function returns a string representing the version of Geomview that is running, and @example (echo (geomview-version)) @end example prints out this string. Many functions simply return @code{t} for success or @code{nil} for failure; this is the case if the documentation for the function does not indicate otherwise. These are the lisp symbols for true and false, respectively. (They correspond to the C variables @code{Lt} and @code{Lnil} which you are likely to see if you look at the source code for Geomview or some of the external modules.) In the descriptions of the commands below several references are made to "OOGL" formats. OOGL is the data description language that Geomview uses for describing geometry, c@^{a}meras, appearances, and other basic objetos. For details of the OOGL formats, @xref{OOGL File Formats}. (Or equivalently, see the oogl(5) manual page, distributed with Geomview in the file man/cat5/oogl.5. The GCL commands and argument types are listed below. Most of the documentation in this section of the manual is available within Geomview via the @code{?} and @code{??} commands. The command @code{(? @var{command})} causes Geomview to print out a one-line summary of the syntax of @var{command}, and @code{(?? @var{command})} prints out an explanation of what @var{command} does. You can include the wild-card character @code{*} in @var{command} to print information for a group of commands matching a pattern. For example, @code{(?? *emodule*)} will print all information about all commands containing the string @code{emodule}. @code{(? *)} will print a short list of all commands. @menu * Argument Conventions:: Conventions used in describing argument types. * GCL Reference:: Documentation for each GCL command. @end menu @node Argument Conventions, GCL Reference, GCL, GCL @section Conventions Used In Describing Argument Types The following symbols are used to describe argument types in the documentation for GCL functions. @table @code @item @var{appearance} is an OOGL appearance specification. @item @var{cam-id} is an @var{id} that refers to a camera. @item @var{camera} is an OOGL c@^{a}mera specification. @item @var{geom-id} is an @var{id} that refers to a geometry. @item @var{geometry} is an OOGL geometry specification. @item @var{id} is a string which names a geometry or camera. Besides those you create, valid ones are: @table @code @item @code{World, world, worldgeom, g0} the collection of all geom's @item target selected objeto alvo (cam or geom) @item center selected center-of-movimento objeto @item targetcam last selected target camera @item targetgeom last selected target geom @item focus c@^{a}mera where cursor is (or most recently was) @item allgeoms all geom objetos @item allcams all c@^{a}meras @item @code{default, defaultcam, prototype} future c@^{a}meras inherit default's settings @end table The following @var{id}s are used to name coordinate systems, e.g. in @code{pick} and @code{write} commands: @table @code @item @code{World, world, worldgeom, g0} the world, within which all other geoms live. @item universe the universe, in which the World, lights and c@^{a}meras live. C@^{a}meras' world2cam transforms might better be called universe2cam, etc. @item self "this Geomview objeto". Transform from an objeto to @code{self} is the identity; writing its geometry gives the objeto itself with no enclosing transform; picked points appear in the objeto's coordinates. @item primitive (for @code{pick} only) Picked points appear in the coordinate system of the lowest-level OOGL primitive. @end table A name is also an acceptable id. Given names are made unique by appending numbers if necessary (i.e. @code{foo<2>}). Every geom is also named g[n] and every c@^{a}mera is also named c[n] (@code{g0} is always the worldgeom): this name is used as a prefix to keyboard commands and can also be used as a GCL id. Numbers are reused after an objeto is deleted. Both names are shown in the Objeto browser. @item @var{statement} represents a function call. Function calls have the form @code{(func arg1 arg2 @dots{} )}, where @code{func} is the name of the function and @code{arg1}, @code{arg2}, @dots{} are the arguments. @item @var{transform} is an OOGL 4x4 transformation matrix. @item @var{ntransform} is an OOGL (N+1)x(N+1) transformation matrix. @item @var{window} is an OOGL winddow specification. @end table @node GCL Reference, , Argument Conventions, GCL @section GCL Reference Guide @c @table @code @menu * shell:: @code{(! SHELLCOMMAND)} * lt:: @code{(< EXPR1 EXPR2)} * eq:: @code{(= EXPR1 EXPR2)} * gt:: @code{(> EXPR1 EXPR2)} * help:: @code{(? COMMAND)} * morehelp:: @code{(?? COMMAND)} * emodule-run:: @code{(| NAME)} * all:: @code{(all geometry|camera|emodule)} * and:: @code{(and EXPR1 EXPR2)} * ap-override:: @code{(ap-override [on|off])} * backcolor:: @code{(backcolor CAM-ID R G B)} * background-image:: @code{(background-image CAM-ID [FILENAME])} * bbox-color:: @code{(bbox-color GEOM-ID R G B)} * bbox-draw:: @code{(bbox-draw GEOM-ID [yes|no])} * camera:: @code{(camera CAM-ID [CAMERA])} * camera-draw:: @code{(camera-draw CAM-ID [yes|no])} * camera-prop:: @code{(camera-prop @{ geometry object @} [projective])} * camera-reset:: @code{(camera-reset CAM-ID)} * car:: @code{(car LIST)} * cdr:: @code{(cdr LIST)} * clock:: @code{(clock)} * command:: @code{(command INFILE [OUTFILE])} * copy:: @code{(copy [ID] [name])} * cursor-still:: @code{(cursor-still [INT])} * cursor-twitch:: @code{(cursor-twitch [INT])} * delete:: @code{(delete ID)} * dice:: @code{(dice GEOM-ID N)} * dimension:: @code{(dimension [N])} * dither:: @code{(dither CAM-ID @{on|off|toggle@})} * draw:: @code{(draw CAM-ID)} * dump-handles:: @code{(dump-handles)} * echo:: @code{(echo @dots{})} * emodule-clear:: @code{(emodule-clear)} * emodule-define:: @code{(emodule-define NAME SHELL-COMMAND @dots{})} * emodule-defined:: @code{(emodule-defined @code{modulename})} * emodule-isrunning:: @code{(emodule-isrunning NAME)} * emodule-path:: @code{(emodule-path)} * emodule-run:: @code{(| NAME)} * emodule-sort:: @code{(emodule-sort)} * emodule-start:: @code{(emodule-start NAME)} * emodule-transmit:: @code{(emodule-transmit NAME LIST)} * escale:: @code{(escale GEOM-ID FACTOR)} * event-keys:: @code{(event-keys @{on|off@})} * event-mode:: @code{(event-mode MODESTRING)} * event-pick:: @code{(event-pick @{on|off@})} * evert:: @code{(evert GEOM-ID [yes|no])} * exit:: @code{(exit)} * ezoom:: @code{(ezoom GEOM-ID FACTOR)} * freeze:: @code{(freeze CAM-ID)} * geometry:: @code{(geometry GEOM-ID [GEOMETRY])} * geomview-version:: @code{(geomview-version)} * hdefine:: @code{(hdefine geometry|camera|@dots{} NAME VALUE)} * hdelete:: @code{(hdelete [geometry|camera|@dots{}] name)} * help:: @code{(? COMMAND)} * hmodel:: @code{(hmodel CAMID @{virtual|projective|conformal@})} * hsphere-draw:: @code{(hsphere-draw CAMID [yes|no])} * if:: @code{(if TEST EXPR1 [EXPR2])} * inhibit-warning:: @code{(inhibit-warning STRING)} * input-translator:: @code{(input-translator "#pfx" "sh-command")} * interest:: @code{(interest (COMMAND [args]))} * lines-closer:: @code{(lines-closer CAM-ID DIST)} * load:: @code{(load filename [command|geometry|camera])} * load-path:: @code{(load-path)} * look:: @code{(look [objectID] [camID])} * look-encompass:: @code{(look-encompass [objID] [camID])} * look-encompass-size:: @code{(look-encompass-size [view clip near far])} * look-recenter:: @code{(look-recenter [objID] [camID])} * look-toward:: @code{(look-toward [objID] [camID] [origin|center])} * merge:: @code{(merge @{window|camera@} CAM-ID @{ WIN or CAM @dots{} @})} * merge-ap:: @code{(merge-ap GEOM-ID APPEARANCE)} * merge-base-ap:: @code{(merge-base-ap APPEARANCE)} * merge-baseap:: @code{(merge-baseap APPEARANCE)} * morehelp:: @code{(?? COMMAND)} * name-object:: @code{(name-object ID NAME)} * ND-axes:: @code{(ND-axes CAMID [CLUSTER [Xidx Yidx Zidx [Widx]]])} * ND-color:: @code{(ND-color CAMID @dots{}} * ND-xform:: @code{(ND-xform OBJID [ntransform @{ @dots{} @}])} * ND-xform-get:: @code{(ND-xform-get ID [from-ID])} * ND-xform-set:: @code{(ND-xform-set OBJID [ntransform @{ @dots{} @}])} * new-alien:: @code{(new-alien name [GEOMETRY])} * new-camera:: @code{(new-camera name [CAMERA])} * new-center:: @code{(new-center [id])} * new-geometry:: @code{(new-geometry name [GEOMETRY])} * new-reset:: @code{(new-reset)} * NeXT:: @code{(NeXT)} * normalization:: @code{(normalization GEOM-ID @{each|none|all|keep@})} * not:: @code{(not EXPR)} * or:: @code{(or EXPR1 EXPR2)} * pick:: @code{(pick COORDSYS GEOMID G V E F P VI EI FI)} * pick-invisible:: @code{(pick-invisible [yes|no])} * pickable:: @code{(pickable GEOM-ID @{yes|no@})} * position:: @code{(position objectID otherID)} * position-at:: @code{(position-at objectID otherID [center | origin])} * position-toward:: @code{(position-toward objID othID [center|origin])} * progn:: @code{(progn STATEMENT [ @dots{} ])} * quit:: @code{(quit)} * quote:: @code{(quote EXPR)} * rawevent:: @code{(rawevent dev val x y t)} * rawpick:: @code{(rawpick CAMID X Y)} * read:: @code{(read geometry|camera|@dots{} @{GEOM or CAM or @dots{}@})} * real-id:: @code{(real-id ID)} * redraw:: @code{(redraw CAM-ID)} * regtable:: @code{(regtable)} * rehash-emodule-path:: @code{(rehash-emodule-path)} * replace-geometry:: @code{(replace-geometry GEOM-ID PART GEOMETRY)} * rib-display:: @code{(rib-display [frame|tiff] FILEPREFIX)} * rib-snapshot:: @code{(rib-snapshot CAM-ID [filename])} * scale:: @code{(scale GEOM-ID FACTOR [FACTORY FACTORZ])} * scene:: @code{(scene CAM-ID [GEOMETRY])} * set-clock:: @code{(set-clock TIME)} * set-conformal-refine:: @code{(set-conformal-refine CMX [N [EDGES]])} * set-emodule-path:: @code{(set-emodule-path (PATH1 @dots{} PATHN))} * set-load-path:: @code{(set-load-path (PATH1 @dots{} PATHN))} * set-motionscale:: @code{(set-motionscale X)} * setenv:: @code{(setenv name string)} * sgi:: @code{(sgi)} * shell:: @code{(! SHELLCOMMAND)} * sleep-for:: @code{(sleep-for TIME)} * sleep-until:: @code{(sleep-until TIME)} * snapshot:: @code{(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])} * soft-shader:: @code{(soft-shader CAM-ID @{on|off|toggle@})} * space:: @code{(space @{euclidean|hyperbolic|spherical@})} * stereowin:: @code{(stereowin CAM-ID [no|horizontal|@dots{}] [gap])} * time-interests:: @code{(time-interests delta initial prefix [suffix])} * transform:: @code{(transform objectID centerID frameID [rotate|@dots{}] @dots{})} * transform-incr:: @code{(transform-incr objectID centerID frameID @dots{})} * transform-set:: @code{(transform-set objectID centerID frameID @dots{})} * ui-cam-focus:: @code{(ui-cam-focus @{focus-change|mouse-cross@})} * ui-center:: @code{(ui-center ID)} * ui-center-origin:: @code{(ui-center-origin @{origin|bbox-center@})} * ui-emotion-program:: @code{(ui-emotion-program PROGRAM)} * ui-emotion-run:: @code{(ui-emotion-run EMODULE)} * ui-freeze:: @code{(ui-freeze @{on|off@})} * ui-html-browser:: @code{(ui-html-browser BROWSER)} * ui-motion:: @code{(ui-motion @{inertia|@dots{}@} @{on|off@})} * ui-panel:: @code{(ui-panel PANELNAME @{on|off@} [WINDOW])} * ui-pdf-viewer:: @code{(ui-pdf-viewer VIEWER)} * ui-target:: @code{(ui-target ID [yes|no])} * uninterest:: @code{(uninterest (COMMAND [args]))} * update:: @code{(update [timestep_in_seconds])} * update-draw:: @code{(update-draw CAM-ID [timestep_in_seconds])} * window:: @code{(window CAM-ID WINDOW)} * winenter:: @code{(winenter CAM-ID)} * write:: @code{(write command|geometry|@dots{} FILENAME @dots{})} * write-comments:: @code{(write-comments FILENAME GEOMID PICKPATH)} * write-handle:: @code{(write-handle PREFIX FILENAME HANDLE)} * write-sexpr:: @code{(write-sexpr FILENAME LISPOBJECT)} * xform:: @code{(xform ID TRANSFORM)} * xform-incr:: @code{(xform-incr ID TRANSFORM)} * xform-set:: @code{(xform-set ID TRANSFORM)} * zoom:: @code{(zoom CAM-ID FACTOR)} @end menu @node shell, lt, GCL Reference, GCL Reference @subsection ! @findex !, shell @findex shell, ! @table @code @item ! is a synonym for @code{shell}. @xref{shell}. @end table @node lt, eq, shell, GCL Reference @subsection < @findex < @table @code @item (< EXPR1 EXPR2) Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. @end table @node eq, gt, lt, GCL Reference @subsection = @findex = @table @code @item (= EXPR1 EXPR2) Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. @end table @node gt, help, eq, GCL Reference @subsection > @findex > @table @code @item (> EXPR1 EXPR2) Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. @end table @node help, morehelp, gt, GCL Reference @subsection ? @findex ? @table @code @item (? [command]) Gives one-line usage summary for @code{command}. Command may include @code{*}s as wildcards; see also @ref{morehelp, @code{(?? @dots{})}}. One-line command help; lists names only if multiple commands match. @code{?} is a synonym for @ref{help, @code{(help @dots{})}} @end table @node morehelp, emodule-run, help, GCL Reference @subsection ?? @findex ?? @table @code @item (?? command) @code{command} may include @code{*} wildcards. Prints more info than @code{(? command)}. @code{??} is a synonym for @ref{morehelp, @code{morehelp}}. @end table @node emodule-run, all, morehelp, GCL Reference @subsection | @findex |, emodule-run @findex emodule-run, | @table @code @item | @code{|} is a synonym for @code{emodule-run}. @end table @node all, and, emodule-run, GCL Reference @subsection all @findex all @table @code @findex all geometry @item (all geometry) returns a list of names of all geometry objetos. Use e.g. @samp{(echo (all geometry))} to print such a list. @findex all camera @item (all camera) returns a list of names of all c@^{a}meras. @findex all emodule defined @item (all emodule defined) returns a list of all defined external modules. @findex all emodule running @item (all emodule running) returns a list of all running external modules. @end table @node and, ap-override, all, GCL Reference @subsection and @findex and @table @code @item (and EXPR1 EXPR2) Evaluate @code{EXPR1} and @code{EXPR2} and return @code{t} if both return non-@code{nil}, otherwise return @code{nil}. @end table @node ap-override, backcolor, and, GCL Reference @subsection ap-override @findex ap-override @table @code @item (ap-override [on|off]) Selects whether appearance controls should override objetos' own settings. On by default. With no arguments, returns current setting. @end table @node backcolor, background-image, ap-override, GCL Reference @subsection backcolor @findex backcolor @table @code @item (backcolor CAM-ID R G B) Set the background color of CAM-ID; R G B are numbers between 0 and 1. @end table @node background-image, bbox-color, backcolor, GCL Reference @subsection background-image @findex background-image @table @code @item (background-image CAM-ID [FILENAME]) Use the given image as the background of camera CAM-ID (which must be a real camera, not @code{default} or @code{allcams}). Centers the image on the window area. Works only with GL and OpenGL graphics. Use "" for filename to remove background. With no filename argument, returns name of that window's current background image, or "". Any file type acceptable as a texture is allowed, e.g. .ppm.gz, .sgi, etc. @end table @node bbox-color, bbox-draw, background-image, GCL Reference @subsection bbox-color @findex bbox-color @table @code @item (bbox-color GEOM-ID R G B) Set the bounding-box color of GEOM-ID; R G B are numbers between 0 and 1. @end table @node bbox-draw, camera, bbox-color, GCL Reference @subsection bbox-draw @findex bbox-draw @table @code @item (bbox-draw GEOM-ID [yes|no]) Say whether GEOM-ID's bounding-box should be drawn; defaults to @code{yes} if second argument is omitted. @end table @node camera, camera-draw, bbox-draw, GCL Reference @subsection camera @findex camera @table @code @item (camera CAM-ID [CAMERA]) Specify data for @var{CAM-ID}; @var{CAMERA} is a string giving an OOGL c@^{a}mera specification. If no camera @var{CAM-ID} exists, it is created; in this case, the second argument is optional, and if omitted, a default c@^{a}mera is used. @xref{new-camera, @code{(new-camera @dots{})}}. @end table @node camera-draw, camera-prop, camera, GCL Reference @subsection camera-draw @findex camera-draw @table @code @item (camera-draw CAM-ID [yes|no]) Say whether or not c@^{a}meras should be drawn in CAM-ID; @code{yes} if omitted. @end table @node camera-prop, camera-reset, camera-draw, GCL Reference @subsection camera-prop @findex camera-prop @table @code @item (camera-prop @{ geometry object @} [projective]) Specify the objeto to be shown when drawing other c@^{a}meras. By default, this objeto is drawn with its origin at the camera, and with the c@^{a}mera looking toward the objeto's -Z axis. With the @code{projective} keyword, the camera's viewing projection is also applied to the objeto; this places the objeto's Z=-1 and Z=+1 at near and far clipping planes, with the viewing area -1<=@{X,Y@}<=+1. Example: (camera-prop @{ < cube @} projective) @end table @node camera-reset, car, camera-prop, GCL Reference @subsection camera-reset @findex camera-reset @table @code @item (camera-reset CAM-ID) Reset CAM-ID to its default value. @end table @node car, cdr, camera-reset, GCL Reference @subsection car @findex car @table @code @item (car LIST) returns the first element of LIST. @end table @node cdr, clock, car, GCL Reference @subsection cdr @findex cdr @table @code @item (cdr LIST) returns the list obtained by removing the first element of LIST. @end table @node clock, command, cdr, GCL Reference @subsection clock @findex clock @table @code @item (clock) Returns the current time, in seconds, as shown by this stream's clock. @xref{set-clock, @code{(set-clock @dots{})}}. @xref{sleep-until, @code{(sleep-until @dots{})}}. @end table @node command, copy, clock, GCL Reference @subsection command @findex command @table @code @item (command INFILE [OUTFILE]) Read commands from INFILE; send corresponding responses (e.g. anything written to filename @code{-}) to OUTFILE, stdout by default. @end table @node copy, cursor-still, command, GCL Reference @subsection copy @findex copy @table @code @item (copy [ID] [name]) Copies an objeto or camera. If ID is not specified, it is assumed to be targetgeom. If name is not specified, it is assumed to be the same as the name of ID. @end table @node cursor-still, cursor-twitch, copy, GCL Reference @subsection cursor-still @findex cursor-still @table @code @item (cursor-still [INT]) Sets the number of microseconds for which the cursor must not move to register as holding still. If INT is not specified, the value will be reset to the default. @end table @node cursor-twitch, delete, cursor-still, GCL Reference @subsection cursor-twitch @findex cursor-twitch @table @code @item (cursor-twitch [INT]) Sets the distance which the cursor must not move (in x or y) to register as holding still. If INT is not specified, the value will be reset to the default. @end table @node delete, dice, cursor-twitch, GCL Reference @subsection delete @findex delete @table @code @item (delete ID) Delete objeto or c@^{a}mera ID. @end table @node dice, dimension, delete, GCL Reference @subsection dice @findex dice @table @code @item (dice GEOM-ID N) Dice any Bezier patches within @var{GEOM-ID} into NxN meshes; default 10. See also the appearance attribute @ref{Appearances, @code{patchdice}}, which makes this command obsolete. @end table @node dimension, dither, dice, GCL Reference @subsection dimension @findex dimension @table @code @item (dimension [N]) Sets or reads the space dimension for N-dimensional viewing. (Since calculations are done using homogeneous coordinates, this means matrices are (N+1)x(N+1).) With no arguments, returns the current dimension, or 0 if N-dimensional viewing has not been enabled. @end table @node dither, draw, dimension, GCL Reference @subsection dither @findex dither @table @code @item (dither CAM-ID @{on|off|toggle@}) Turn dithering on or off in that camera. @end table @node draw, dump-handles, dither, GCL Reference @subsection draw @findex draw @table @code @item (draw CAM-ID) Draw the view in CAM-ID, if it needs redrawing. @xref{redraw, @code{(redraw @dots{})}}. @end table @node dump-handles, echo, draw, GCL Reference @subsection dump-handles @findex dump-handles @table @code @item (dump-handles) Dump the list of currently active handles to stdout. This function is intended for internal debugging use only. @end table @node echo, emodule-clear, dump-handles, GCL Reference @subsection echo @findex echo @table @code @item (echo @dots{}) Write the given data to the special file @code{-}. Strings are written literally; lisp expressions are evaluated and their values written. If received from an external program, @code{echo} sends to the program's input. Otherwise writes to geomview's own standard output (typically the terminal). @end table @node emodule-clear, emodule-define, echo, GCL Reference @subsection emodule-clear @findex emodule-clear @table @code @item (emodule-clear) Clears the geomview application (external module) browser. @end table @node emodule-define, emodule-defined, emodule-clear, GCL Reference @subsection emodule-define @findex emodule-define @table @code @item (emodule-define NAME SHELL-COMMAND @dots{}) Define an external module called NAME, which then appears in the external-module browser. The SHELL-COMMAND string is a UNIX shell command which invokes the module. See @ref{emodule-run, @code{(emodule-run @dots{})}} for discussion of external modules. @end table @node emodule-defined, emodule-isrunning, emodule-define, GCL Reference @subsection emodule-defined @findex emodule-defined @table @code @item (emodule-defined @code{modulename}) If the given external-module name is known, returns the name of the program invoked when it's run as a quoted string; otherwise returns nil. @code{(echo (emodule-defined @code{name}))} prints the string. @end table @node emodule-isrunning, emodule-path, emodule-defined, GCL Reference @subsection emodule-isrunning @findex emodule-isrunning @table @code @item (emodule-isrunning NAME) Returns Lt if the emodule NAME is running, or Lnil if it is not running. NAME is searched for in the names as they appear in the browser and in the shell commands used to execute the external modules (not including arguments). @end table @node emodule-path, emodule-run, emodule-isrunning, GCL Reference @subsection emodule-path @findex emodule-path @table @code @item (emodule-path) Returns the current search path for external modules. Note: to actually see the value returned by this function you should wrap it in a call to echo: @code{(echo (emodule-path))}. @xref{set-emodule-path, @code{(set-emodule-path @dots{})}}. @end table @node emodule-run, emodule-sort, emodule-path, GCL Reference @subsection emodule-run @findex emodule-run, | @findex |, emodule-run @table @code @item (emodule-run SHELL-COMMAND ARGS@dots{}) Runs the given SHELL-COMMAND (a string containing a UNIX shell command) as an external module. The module's standard output is taken as geomview commands; responses (written to filename @code{-}) are sent to the module's standard input. The shell command is interpreted by /bin/sh, so e.g. I/O redirection may be used; a program which prompts the user for input from the terminal could be run with: @example (emodule-run yourprogram <&2) @end example If not already set, the environment variable $MACHTYPE is set to the name of the machine type. Input and output connections to geomview are dropped when the shell command terminates. Clicando on a running program's module-browser entry sends the signal SIGHUP to the program. For this to work, programs should avoid running in the background; those using FORMS or GL should call foreground() before the first FORMS or winopen() call. @xref{emodule-define, @code{(emodule-define @dots{})}}. @xref{emodule-start, @code{(emodule-start @dots{})}}. @end table @node emodule-sort, emodule-start, emodule-run, GCL Reference @subsection emodule-sort @findex emodule-sort @table @code @item (emodule-sort) Sorts the modules in the application browser alphabetically. @end table @node emodule-start, emodule-transmit, emodule-sort, GCL Reference @subsection emodule-start @findex emodule-start @table @code @item (emodule-start NAME) Starts the external module NAME, defined by emodule-define. Equivalent to clicando on the corresponding module-browser entry. @end table @node emodule-transmit, escale, emodule-start, GCL Reference @subsection emodule-transmit @findex emodule-transmit @table @code @item (emodule-transmit NAME LIST) Places LIST into external module NAME's standard input. NAME is searched for in the names of the modules as they appear in the External Modules browser and then in the shell commands used to execute the external modules. Does nothing if modname is not running. @end table @node escale, event-keys, emodule-transmit, GCL Reference @subsection escale @findex escale @table @code @item (escale GEOM-ID FACTOR) Same as scale but multiplies by exp(scale). Obsolete. @end table @node event-keys, event-mode, escale, GCL Reference @subsection event-keys @findex event-keys @table @code @item (event-keys @{on|off@}) Turn keyboard events on or off to enable/disable teclas de atalho. @end table @node event-mode, event-pick, event-keys, GCL Reference @subsection event-mode @findex event-mode @table @code @item (event-mode MODESTRING)w Set the mouse event (movimento) mode; MODESTRING should be one of the following strings: @enumerate @item @code{"[r] Rotate"} @item @code{"[t] Translate"} @item @code{"[z] Cam Zoom"} @item @code{"[s] Geom Scale"} @item @code{"[f] Cam Fly"} @item @code{"[o] Cam Orbit"} @item @code{"[le] Edit Lights"} @end enumerate @end table @node event-pick, evert, event-mode, GCL Reference @subsection event-pick @findex event-pick @table @code @item (event-pick @{on|off@}) Turn picking on or off. @end table @node evert, exit, event-pick, GCL Reference @subsection evert @findex evert @table @code @item (evert GEOM-ID [yes|no]) Set the normal eversion state of GEOM-ID. If the second argument is omitted, toggle the eversion state. @end table @node exit, ezoom, evert, GCL Reference @subsection exit @findex exit @table @code @item (exit) Terminates geomview. @end table @node ezoom, freeze, exit, GCL Reference @subsection ezoom @findex ezoom @table @code @item (ezoom GEOM-ID FACTOR) Same as zoom but multiplies by exp(zoom). Obsolete. @end table @node freeze, geometry, ezoom, GCL Reference @subsection freeze @findex freeze @table @code @item (freeze CAM-ID) Freeze CAM-ID; drawing in this camera's window is turned off until it is explicitly redrawn with @code{(redraw CAM-ID)}, after which time drawing resumes as normal. @end table @node geometry, geomview-version, freeze, GCL Reference @subsection geometry @findex geometry @table @code @item (geometry GEOM-ID [GEOMETRY]) Specify the geometry for GEOM-ID. GEOMETRY is a string giving an OOGL geometry specification. If no objeto called GEOM-ID exists, it is created; in this case the GEOMETRY argument is optional, and if omitted, the new objeto GEOM-ID is given an empty geometry. @end table @node geomview-version, hdefine, geometry, GCL Reference @subsection geomview-version @findex geomview-version @table @code @item (geomview-version) Returns a string representing the version of geomview that is running. @end table @node hdefine, hdelete, geomview-version, GCL Reference @subsection hdefine @findex hdefine @table @code @item (hdefine @code{geometry}|@code{camera}|@code{window}|@code{appearance}|@code{image}|@code{transform}|@code{ntransform} name value) Sets the value of a handle of a given type. @example (hdefine ) @end example is generally equivalent to @example (read @{ define @}) @end example except that the assignment is done when hdefine is executed, (possibly not at all if inside a conditional statement), while the @code{read @dots{} define} performs assignment as soon as the text is read. @xref{References}. @xref{read, @code{(read @dots{})}}. @xref{hdelete, @code{(hdelete @dots{})}}. @end table @node hdelete, help, hdefine, GCL Reference @subsection hdelete @findex hdelete @table @code @item (hdelete [@code{geometry}|@code{camera}|@code{window}|@code{appearance}|@code{image}|@code{transform}|@code{ntransform}] name) Deletes the given handle. Note that the handle will not actually be deleted in case there are still other objetos referring to the handle, but once those objetos are gone, the handle will also automatically go away. The objeto the handle referes to (if any) will only be deleted if there are no other references to that objeto. If the optional first argument is omitted, then the first handle matching @var{name} will be deleted, regardless of the type of the objeto it is attached to. It is not an error to call this function with a non-existent handle, but it is an error to call this funcion with the name of a non-global handle, i.e. one that was not created by @code{(hdefine @dots{})} or @code{(read @dots{} @{ define @dots{}@})}. @xref{References}. @xref{read,@code{(read @dots{})}}. @xref{hdefine,@code{(hdefine @dots{})}}. @end table @node help, hmodel, hdelete, GCL Reference @subsection help @findex help @table @code @item (help [command]) Command may include @code{*}s as wildcards; see also @ref{help, @code{(?? @dots{})}} One-line command help; lists names only if multiple commands match. @end table @node hmodel, hsphere-draw, help, GCL Reference @subsection hmodel @findex hmodel @table @code @item (hmodel CAMID @{virtual|projective|conformal@}) Set the model used to display geometry in this camera. @xref{space, @code{(space @dots{})}}. @end table @node hsphere-draw, if, hmodel, GCL Reference @subsection hsphere-draw @findex hsphere-draw @table @code @item (hsphere-draw CAMID [yes|no]) Say whether to draw a unit sphere: the sphere at infinity in hyperbolic space, and a reference sphere in Euclidean and spherical spaces. If the second argument is omitted, @code{yes} is assumed. @end table @node if, inhibit-warning, hsphere-draw, GCL Reference @subsection if @findex if @table @code @item (if TEST EXPR1 [EXPR2]) Evaluates TEST; if TEST returns a non-nil value, returns the value of EXPR1. If TEST returns nil, returns the value of EXPR2 if EXPR2 is present, otherwise returns nil. @end table @node inhibit-warning, input-translator, if, GCL Reference @subsection inhibit-warning @findex inhibit-warning @table @code @item (inhibit-warning STRING) Inhibit warning inhbits geomview from displaying a particular warning message determined by STRING. At present there are no warning messages that this applies to, so this command is rather useless. @end table @node input-translator, interest, inhibit-warning, GCL Reference @subsection input-translator @findex input-translator @table @code @item (input-translator "#prefix_string" "Bourne-shell-command") Defines an external translation program for special input types. When asked to read a file which begins with the specified string, geomview invokes that program with standard input coming from the given file. The program is expected to emit OOGL geometric data to its standard output. In this implementation, only prefixes beginning with # are recognized. Useful as in @example (input-translator "#VRML" "vrml2oogl") @end example @end table @node interest, lines-closer, input-translator, GCL Reference @subsection interest @findex interest @table @code @item (interest (COMMAND [args])) Allows you to express interest in a command. When geomview executes that command in the future it will echo it to the communication pool from which the interest command came. @var{COMMAND} can be any command. Args specify restrictions on the values of the arguments; if args are present in the interest command, geomview will only echo calls to the command in which the arguments match those given in the interest command. Two special argument values may appear in the argument list. @code{*} matches any value. @code{nil} matches any value but supresses the reporting of that value; its value is reported as @code{nil}. The purpose of the interest command is to allow external modules to find out about things happening inside geomview. For example, a module interested in knowing when a geom called @code{foo} is deleted could say @code{(interest (delete foo))} and would receive the string @code{(delete foo)} when foo is deleted. Picking is a special case of this. For most modules interested in pick events the command @code{(interest (pick world))} is sufficient. This causes geomview to send a string of the form @code{(pick world @dots{})} every time a pick event (right mouse double clique). See the @ref{pick, @code{(pick @dots{})}} command for details. @end table @node lines-closer, load, interest, GCL Reference @subsection lines-closer @findex lines-closer @table @code @item (lines-closer CAM-ID DIST) Draw lines (including edges) closer to the c@^{a}mera than polygons by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default. If DIST is too small, a line lying on a surface may be dotted or invisible, depending on the viewpoint. If DIST is too large, lines may appear in front of surfaces that they actually lie behind. Good values for DIST vary with the scene, viewpoint, and distance between near and far clipping planes. This feature is a kludge, but can be helpful. @end table @node load, load-path, lines-closer, GCL Reference @subsection load @findex load @table @code @item (load filename [command|geometry|camera]) Loads the given file into geomview. The optional second argument specifies the type of data it contains, which may be @code{command} (geomview commands), @code{geometry} (OOGL geometric data), or @code{camera} (OOGL c@^{a}mera definition). If omitted, attempts to guess about the file's contents. Loading geometric data creates a new visible objeto; loading a camera opens a new window; loading a command file executes those commands. @end table @node load-path, look, load, GCL Reference @subsection load-path @findex load-path @table @code @item (load-path) Returns the current search path for command, geometry, etc. files. Note: to actually see the value returned by this function you should wrap it in a call to echo: @code{(echo (load-path))}. @xref{set-load-path, @code{(set-load-path @dots{})}}. @end table @node look, look-encompass, load-path, GCL Reference @subsection look @findex look @table @code @item (look [objectID] [cameraID]) Rotates the named c@^{a}mera to point toward the center of the bounding box of the named objeto (or the origin in hyperbolic or spherical space). In Euclidean space, moves the c@^{a}mera forward or backward until the objeto appears as large as possible while still being entirely visible. Equivalent to @example progn ( (look-toward [objectID] [cameraID] @{center | origin@}) [(look-encompass [objectID] [cameraID])] ) @end example If objectID is not specified, it is assumed to be World. If cameraID is not specified, it is assumed to be targetcam. @end table @node look-encompass, look-encompass-size, look, GCL Reference @subsection look-encompass @findex look-encompass @table @code @item (look-encompass [objectID] [cameraID]) Moves cameraID backwards or forwards until its field of view surrounds objectID. This routine works only in Euclidean space. If objectID is not specified, it is assumed to be the world. If cameraID is not specified, it is assumed to be the targetcam. @xref{look-encompass-size, @code{(look-encompass-size @dots{})}}. @end table @node look-encompass-size, look-recenter, look-encompass, GCL Reference @subsection look-encompass-size @findex look-encompass-size @table @code @item (look-encompass-size [view-fraction clip-ratio near-margin far-margin]) Sets/returns parameters used by (look-encompass). view-fraction is the portion of the janela de c@^{a}mera filled by the objeto, clip-ratio is the max allowed ratio of near-to-far clipping planes. The near clipping plane is 1/near-margin times closer than the near edge of the objeto, and the far clipping plane is far-margin times further away. Returns the list of current values. Defaults: .75 100 0.1 4.0 @end table @node look-recenter, look-toward, look-encompass-size, GCL Reference @subsection look-recenter @findex look-recenter @table @code @item (look-recenter [objectID] [cameraID]) Translates and rotates the c@^{a}mera so that it is looking in the -z direction (in objectID's coordinate system) at the center of objectID's bounding box (or the origin of the coordinate system in non-Eudlidean space). In Euclidean space, the c@^{a}mera is also moved as close as possible to the objeto while allowing the entire objeto to be visible. Also makes sure that the y-axes of objectID and cameraID are parallel. @end table @node look-toward, merge, look-recenter, GCL Reference @subsection look-toward @findex look-toward @table @code @item (look-toward [objectID] [cameraID] [origin | center]) Rotates the named c@^{a}mera to point toward the origin of the objeto's coordinate system, or the center of the objeto's bounding box (in non-Euclidean space, the origin will be used automatically). Default objectID is the world, default camera is targetcam, default location to point towards is the center of the bounding box. @end table @node merge, merge-ap, look-toward, GCL Reference @subsection merge @findex merge @table @code @item (merge @{window|camera@} CAM-ID @{ WINDOW or CAMERA @dots{} @}) Modify the given window or camera, changing just those properties specified in the last argument. E.g. @example (merge camera @code{Camera} @{ far 20 @}) @end example sets Camera's far clipping plane to 20 while leaving other attributes untouched. @end table @node merge-ap, merge-base-ap, merge, GCL Reference @subsection merge-ap @findex merge-ap @table @code @item (merge-ap GEOM-ID APPEARANCE) Merge in some appearance characteristics to GEOM-ID. Appearance parameters include surface and line color, shading style, line width, and lighting. @end table @node merge-base-ap, merge-baseap, merge-ap, GCL Reference @subsection merge-base-ap @findex merge-base-ap @table @code @item (merge-base-ap APPEARANCE) @code{merge-base-ap} is a synonym for @ref{merge-baseap, @code{merge-baseap}}. @end table @node merge-baseap, morehelp, merge-base-ap, GCL Reference @subsection merge-baseap @findex merge-baseap @table @code @item (merge-baseap APPEARANCE) Merge in some appearance characteristics to the base default appearance (applied to every geom before its own apperance). Lighting is typically included in the base appearance. @end table @node morehelp, name-object, merge-baseap, GCL Reference @subsection morehelp @findex morehelp @table @code @item (morehelp command) @code{command} may include @code{*} wildcards. Prints more info than @ref{help, @code{(help command)}}. @end table @node name-object, ND-axes, morehelp, GCL Reference @subsection name-object @findex name-object @table @code @item (name-object ID NAME) Assign a new NAME (a string) to ID. A number is appended if that name is in use (for example, @code{foo} -> @code{foo<2>}). The new name, possibly with number appended, may be used as objeto's id thereafter. @end table @node ND-axes, ND-color, name-object, GCL Reference @subsection ND-axes @findex ND-axes @table @code @item (ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex [Windex]]]) In our model for N-D viewing (enabled by (dimension)), objetos in N-space are viewed by N-dimensional @emph{camera clusters}. Each real janela de c@^{a}mera belongs to some cluster, and shows & manipulates a 3-D axis-aligned projected subspace of the N-space seen by its cluster. Moving one c@^{a}mera in a cluster affects its siblings. The ND-axes command configures all this. It specifies a camera's cluster membership, and the set of N-space axes which become the 3-D camera's X, Y, and Z axes. Axes are specified by their indices, from 1 to N for an N-dimensional space. Cluster CLUSTERNAME is implicitly created if not previously known. In principle it is possible to map the homogeneous component of a conformal 4 point to some other index; this would be done by specifying 0 for one of @code{Xindex}, @code{Yindex} or @code{Zindex} and giving @code{Windex} some positive value. This is probably not useful because Geomview does not support non-Euclidean geometries for in higher dimensions. To read a camera's configuration, use @code{(echo (ND-axes CAMID))}. The return value is an array of 4 integers, the last one should 0. @end table @node ND-color, ND-xform, ND-axes, GCL Reference @subsection ND-color @findex ND-color @table @code @item (ND-color CAMID [ (( [ID] (x1 x2 @dots{} xN) v r g b a v r g b a @dots{} ) ((x1 @dots{} xN) v r g b a v r g b a @dots{}) @dots{})] ) Specifies a function, applied to each N-D vertex, which determines the colors of N-dimensional objetos as shown in camera CAMID. Each coloring function is defined by a vector (in ID's coordinate system) [x1 @dots{} xN] and by a sequence of value (v)/color(r g b a) tuples, ordered by increasing v. The inner product v = P.[x] is linearly interpolated in this table to give a color. If ID is omitted, the (xi) vector is assumed in universe coordinates. The ND-color command specifies a list of such functions; each vertex is colored by their sum (so e.g. green intensity could indicate projection along one axis while red indicated another. An empty list, as in (ND-color CAMID ()), suppresses coloring. With no second argument, (ND-color CAMID) returns that camera's color-function list. Even when coloring is enabled, objetos tagged with the @code{keepcolor} appearance attribute are shown in their natural colors. @end table @node ND-xform, ND-xform-get, ND-color, GCL Reference @subsection ND-xform @findex ND-xform @table @code @item (ND-xform OBJID [ntransform @{ idim odim @dots{} @}]) Concatenate the given ND-transform with the current ND-transform of the objeto (apply the ND-transform to objeto ID, as opposed to simply setting its ND-transform). Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3. @end table @node ND-xform-get, ND-xform-set, ND-xform, GCL Reference @subsection ND-xform-get @findex ND-xform-get @table @code @item (ND-xform-get ID [from-ID]) Returns the N-D transform of the given objeto in the coordinate system of from-ID (default @code{universe}), in the sense * Transform = . Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3. @end table @node ND-xform-set, new-alien, ND-xform-get, GCL Reference @subsection ND-xform-set @findex ND-xform-set @table @code @item (ND-xform-set OBJID [ntransform @{ idim odim @dots{} @}]) Sets the N-D transform of the given objeto. In dimension N, this is an (N+1)x(N+1) matrix, so in that case idim and odim are expected to be both equal to (N+1). Note that all c@^{a}meras in a camera-cluster have the same N-D transform. Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3. @end table @node new-alien, new-camera, ND-xform-set, GCL Reference @subsection new-alien @findex new-alien @table @code @item (new-alien name [GEOMETRY]) Create a new alien (geom not in the world) with the given name (a string). @var{GEOMETRY} is a string giving an OOGL geometry specification. If @var{GEOMETRY} is omitted, the new alien is given an empty geometry. If an objeto with that name already exists, the new alien is given a unique name. The light beams that are used to move around the lights are an example of aliens. They're drawn but are not controllable the way ordinary objetos are: they don't appear in the objeto browser and the user can't move them with the normal movimento modes. @end table @node new-camera, new-center, new-alien, GCL Reference @subsection new-camera @findex new-camera @table @code @item (new-camera name [CAMERA]) Create a new c@^{a}mera with the given name (a string). If a c@^{a}mera with that name already exists, the new objeto is given a unique name. If @var{CAMERA} is omitted a default c@^{a}mera is used. @end table @node new-center, new-geometry, new-camera, GCL Reference @subsection new-center @findex new-center @table @code @item (new-center [id]) Stop id, then set id's transform to the identity. Default id is target. Also, if the id is a camera, calls (look-recenter World id). The main function of the call to (look-recenter) is to place the c@^{a}mera so that it is pointing parallel to the z axis toward the center of the world. @end table @node new-geometry, new-reset, new-center, GCL Reference @subsection new-geometry @findex new-geometry @table @code @item (new-geometry name [GEOMETRY]) Create a new geom with the given name (a string). @var{GEOMETRY} is a string giving an OOGL geometry specification. If @var{GEOMETRY} is omitted, the new objeto is given an empty geometry. If an objeto with that name already exists, the new objeto is given a unique name. @end table @node new-reset, NeXT, new-geometry, GCL Reference @subsection new-reset @findex new-reset @table @code @item (new-reset) Equivalent to @code{(progn (new-center ALLGEOMS)(new-center ALLCAMS))}. @end table @node NeXT, normalization, new-reset, GCL Reference @subsection NeXT @findex NeXT @table @code @item (NeXT) Returns @code{t} if running on a NeXT, @code{nil} if not. A relict from ancient work-station year. @end table @node normalization, not, NeXT, GCL Reference @subsection normalization @findex normalization @table @code @item (normalization GEOM-ID @{each|none|all|keep@}) Set the normalization status of GEOM-ID. @table @code @item none suppresses all normalization. @item each normalizes the objeto's bounding box to fit into the unit sphere, with the center of its bounding box translated to the origin. The box is scaled such that its long diagonal, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2. @item all resembles @code{each}, except when an objeto is changing (e.g. when its geometry is being changed by an external program). Then, @code{each} tightly fits the bounding box around the objeto whenever it changes and normalizes accordingly, while @code{all} normalizes the union of all variants of the objeto and normalizes accordingly. @item keep leaves the current normalization transform unchanged when the objeto changes. It may be useful to apply @code{each} or @code{all} normalization apply to the first version of a changing objeto to bring it in view, then switch to @code{keep}. @end table @end table @node not, or, normalization, GCL Reference @subsection not @findex not @table @code @item (not EXPR) Evaluates @code{EXPR}; if @code{EXPR} returns a non-@code{nil} value, returns nil, if @code{EXPR} returns @code{nil}, return @code{t}. @end table @node or, pick, not, GCL Reference @subsection or @findex or @table @code @item (or EXPR1 EXPR2) Evaluates @code{EXPR1}; if @code{EXPR1} returns non-@code{nil}, return its value, if @code{EXPR1} returns @code{nil}, evaluate @code{EXPR2} and return its value. @end table @node pick, pick-invisible, or, GCL Reference @subsection pick @findex pick @table @code @item (pick COORDSYS GEOMID G V E F P VI EI FI) The pick command is executed internally in response to pick events (right mouse double clique). @table @var @item COORDSYS = coordinate system in which coordinates of the following arguments are specified. This can be: @table @code @item world world coord sys @item self coord sys of the picked geom (@var{GEOMID}) @item primitive coord sys of the actual primitive within the picked geom where the pick occurred. @end table @item GEOMID = id of picked geom @item G = picked point (actual intersection of pick ray with objeto) @item V = picked vertex, if any @item E = picked edge, if any @item F = picked face @item P = path to picked primitive [0 or more] @item VI = index of picked vertex in primitive @item EI = list of indices of endpoints of picked edge, if any @item FI = index of picked face @end table External modules can find out about pick events by registering interest in calls to @code{pick} via the @code{interest} command. In the ND-viewing context the co-ordinates are actually ND-points. They correspond to the 3D points of the pick relative to the sub-space defined by the viewport of the c@^{a}mera where the pick occurred. The co-ordinates are then padded with zeroes and transformed back to the co-ordinate system defined by @var{COORDSYS}. @end table @node pick-invisible, pickable, pick, GCL Reference @subsection pick-invisible @findex pick-invisible @table @code @item (pick-invisible [yes|no]) Selects whether picks should be sensitive to objetos whose appearance makes them invisible; default yes. With no arguments, returns current status. @end table @node pickable, position, pick-invisible, GCL Reference @subsection pickable @findex pickable @table @code @item (pickable GEOM-ID @{yes|no@}) Say whether or not GEOM-ID is included in the pool of objetos that could be returned from the pick command. @end table @node position, position-at, pickable, GCL Reference @subsection position @findex position @table @code @item (position objectID otherID) Set the transform of objectID to that of otherID. @end table @node position-at, position-toward, position, GCL Reference @subsection position-at @findex position-at @table @code @item (position-at objectID otherID [center | origin]) Translate objectID to the center of the bounding box or the origin of the coordinate system of otherID (parallel translation). Default is center. @end table @node position-toward, progn, position-at, GCL Reference @subsection position-toward @findex position-toward @table @code @item (position-toward objectID otherID [center | origin]) Rotate objectID so that the center of the bounding box or the origin of the coordinate system of the otherID lies on the positive z-axis of the first objeto. Default is the center of the bounding box. @end table @node progn, quit, position-toward, GCL Reference @subsection progn @findex progn @table @code @item (progn STATEMENT [ @dots{} ]) evaluates each STATEMENT in order and returns the value of the last one. Use progn to group a collection of commands together, forcing them to be treated as a single command. @end table @node quit, quote, progn, GCL Reference @subsection quit @findex quit @table @code @item (quit) @code{quit} is a synonym for @ref{exit, @code{exit}}. @end table @node quote, rawevent, quit, GCL Reference @subsection quote @findex quote @table @code @item (quote EXPR) returns the symbolic lisp expression EXPR without evaluating it. @end table @node rawevent, rawpick, quote, GCL Reference @subsection rawevent @findex rawevent @table @code @item (rawevent dev val x y t) Enter the specified raw event into the event queue. The arguments directly specify the members of the event structure used internally by geomview. This is the lowest level event handler and is not intended for general use. @end table @node rawpick, read, rawevent, GCL Reference @subsection rawpick @findex rawpick @table @code @item (rawpick CAMID X Y) Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordinates. This is a low-level procedure not intended for external use. @end table @node read, real-id, rawpick, GCL Reference @subsection read @findex read @table @code @item (read @{geometry|camera|appearance|image|ntransform|transform|command@} @{GEOMETRY or CAMERA or @dots{}@}) Read and interpret the text in @dots{} as containing the given type of data. Useful for defining objetos using OOGL reference syntax, e.g. @example (geometry thing @{ INST transform : T geom : fred @}) (read geometry @{ define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 @}) (read transform @{ define T . If no filename specified, see @ref{rib-display, @code{(rib-display @dots{}}} for an explanation of the filename used. @end table @node scale, scene, rib-snapshot, GCL Reference @subsection scale @findex scale @table @code @item (scale GEOM-ID FACTOR [FACTORY FACTORZ]) Scale GEOM-ID, multiplying its size by FACTOR. The factors should be positive numbers. If FACTORY and FACTORZ are present and non-zero, the objeto is scaled by FACTOR in x, by FACTORY in y, and by FACTORZ in z. If only FACTOR is present, the objeto is scaled by FACTOR in x, y, and z. Scaling only really makes sense in Euclidean space. Mouse-driven scaling in other spaces is not allowed; the scale command may be issued in other spaces but should be used with caution because it may cause the data to extend beyond the limits of the space. @end table @node scene, set-clock, scale, GCL Reference @subsection scene @findex scene @table @code @item (scene CAM-ID [GEOMETRY]) Make CAM-ID look at GEOMETRY instead of at the universe. @end table @node set-clock, set-conformal-refine, scene, GCL Reference @subsection set-clock @findex set-clock @table @code @item (set-clock TIME) Adjusts the clock for this command stream to read @var{TIME} (in seconds) as of the moment the command is received. @xref{sleep-until, @code{(sleep-until @dots{})}}. @xref{clock, @code{(clock @dots{})}}. @end table @node set-conformal-refine, set-emodule-path, set-clock, GCL Reference @subsection set-conformal-refine @findex set-conformal-refine @table @code @item (set-conformal-refine CMX [N [SHOWEDGES]]) Sets the parameters for the refinement algorithm used in drawing in the conformal model. CMX is the cosine of the maximum angle an edge can bend before it is refined. Its value should be between -1 and 1; the default is 0.95; decreasing its value will cause less refinement. N is the maximum number of iterations of refining; the default is 6. SHOWEDGES, which should be @code{no} or @code{yes}, determines whether interior edges in the refinement are drawn. @end table @node set-emodule-path, set-load-path, set-conformal-refine, GCL Reference @subsection set-emodule-path @findex set-emodule-path @table @code @item (set-emodule-path (PATH1 @dots{} PATHN)) Sets the search path for external modules. The PATHi should be pathnames of directories containing, for each module, the module's executable file and a .geomview- file which contains an (emodule-define @dots{}) command for that module. This command implicitly calls (rehash-emodule-path) to rebuild the application brower from the new path setting. The special directory name @code{+} is replaced by the existing path, so e.g. (set-emodule-path (mydir +)) prepends mydir to the path. @end table @node set-load-path, set-motionscale, set-emodule-path, GCL Reference @subsection set-load-path @findex set-load-path @table @code @item (set-load-path (PATH1 @dots{} PATHN)) Sets search path for command, geometry, etc. files. The PATHi are strings giving the pathnames of directories to be searched. The special directory name @code{+} is replaced by the existing path, so e.g. (set-load-path (mydir +)) prepends mydir to the path. @end table @node set-motionscale, setenv, set-load-path, GCL Reference @subsection set-motionscale @findex set-motionscale @table @code @item (set-motionscale X) Set the movimento scale factor to X (default value 0.5). These commands scale their movimento by an amount which depends on the distance from the frame to the center and on the size of the frame. Specifically, they scale by dist + scaleof(frame) * motionscale where dist is the distance from the center to the frame and motionscale is the movimento scale factor set by this function. Scaleof(frame) measures the size of the frame objeto. @end table @node setenv, sgi, set-motionscale, GCL Reference @subsection setenv @findex setenv @table @code @item (setenv name string) sets the environment variable @code{name} to the value @var{string}; the name is visible to geomview (as in pathnames containing @code{$name}) and to processes it creates, e.g. external modules. @end table @node sgi, shell, setenv, GCL Reference @subsection sgi @findex sgi @table @code @item (sgi) Returns @code{t} if running on an sgi machine, @code{nil} if not. A relict from the old work-station years. @end table @node shell, sleep-for, sgi, GCL Reference @subsection shell @findex !, shell @findex shell, ! @table @code @item (shell SHELL-COMMAND) Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is @code{!}. @end table @node sleep-for, sleep-until, shell, GCL Reference @subsection sleep-for @findex sleep-for @table @code @item (sleep-for TIME) Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; @code{sleep-for} inside @code{progn} won't delay execution of the rest of the progn's contents. @end table @node sleep-until, snapshot, sleep-for, GCL Reference @subsection sleep-until @findex sleep-until @table @code @item (sleep-until TIME) Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; @code{sleep-until} inside @code{progn} won't delay execution of the rest of the progn's contents. Time is measured according to this stream's clock, as set by @code{set-clock}; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME. @end table @node snapshot, soft-shader, sleep-until, GCL Reference @subsection snapshot @findex snapshot @table @code @item (snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]]) Save a snapshot of @var{CAM-ID} in the @var{FILENAME} (a string). The @var{FORMAT} argument is optional; it may be "ppmscreen" (the default), "ps", "ppm", "sgi" (on SGI machines), "ppmosmesa" (if built with libOSMesa) or "ppmosglx". A "ppmscreen" snapshot is created by reading the image directly from the given window; the window is popped above other windows and redrawn first, then its contents are written as a PPM format image. A "ppmosmesa" snapshot is drawn by Mesa's software renderer into a memory buffer in RAM. A "ppmosglx" snapshot is rendered into a GLX Pixmap buffer, which is also off-screen but may or may not reside in video RAM. Rendering may or may not be accelerated. The problem with on-screen snapshots is that the window must be mapped and not obscured by other windows. So on-screen snapshots will not work in the background, or when a screen safer is active. With "ps", dumps a Postscript picture representing the view from that window; hidden-surface removal might be incorrect. With "ppm", dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the @var{FILENAME} argument begins with "|", it's interpreted as a @code{/bin/sh} command to which the PPM or PS data should be piped. Optional @var{XSIZE} and @var{YSIZE} values are relevant only for "ppm" formats, and render to a window of that size (or scaled to that size, with aspect fixed, if only @var{XSIZE} is given) @end table @node soft-shader, space, snapshot, GCL Reference @subsection soft-shader @findex soft-shader @table @code @item (soft-shader CAM-ID @{on|off|toggle@}) Select whether to use software or hardware shading in that camera. @end table @node space, stereowin, soft-shader, GCL Reference @subsection space @findex space @table @code @item (space @{euclidean|hyperbolic|spherical@}) Set the space associated with the world. @end table @node stereowin, time-interests, space, GCL Reference @subsection stereowin @findex stereowin @table @code @item (stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize]) Configure CAM-ID as a stereo window. no: entire window is a single pane, stereo disabled@* horizontal: split left/right: left is stereo eye#0, right is #1.@* vertical: split top/bottom: bottom is eye#0, top is #1.@* colored: panes overlap, red is stereo eye#0, cyan is #1. A gap of @code{gapsize} pixels is left between subwindows; if omitted, subwindows are adjacent. If both layout and gapsize are omitted, e.g. (stereowin CAM-ID), returns current settings as a @code{(stereowin @dots{})} command list. This command doesn't set stereo projection; use @code{merge camera} or @code{camera} to set the stereyes transforms, and @code{merge window} or @code{window} to set the pixel aspect ratio & window position if needed. @end table @node time-interests, transform, stereowin, GCL Reference @subsection time-interests @findex time-interests @table @code @item (time-interests deltatime initial prefix [suffix]) Indicates that all interest-related messages, when separated by at least @code{deltatime} seconds of real time, should be preceded by the string @code{prefix} and followed by @code{suffix}; the first message is preceded by @code{initial}. All three are printf format strings, whose argument is the current clock time (in seconds) on that stream. A @code{deltatime} of zero timestamps every message. Typical usage:@* (time-interests .1 @code{(set-clock %g)} @code{(sleep-until %g)}) or@* (time-interests .1 @code{(set-clock %g)} "(sleep-until %g) (progn (set-clock %g)" ")") or@* (time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))". @end table @node transform, transform-incr, time-interests, GCL Reference @subsection transform @findex transform @table @code @item (transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [bbox-center|origin] [dt [@code{smooth}]]) Apply a movimento (rotation, translation, scaling) to objeto @code{objectID}; that is, construct and concatenate a transformation matrix with objectID's transform The 3 IDs involved are the objeto that moves, the center of movimento, and the frame of reference in which to apply the movimento. The center is easiest understood for rotations: if centerID is the same as objectID then it will spin around its own axes; otherwise the moving objeto will orbit the objeto do centro. Normally frameID, in whose coordinate system the (mouse) movimentos are interpreted, is @code{focus}, the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the @code{space} command to change spaces. With type @code{rotate} x, y, and z are floats specifying angles in RADIANS. For types @code{translate} and @code{translate-scaled} x, y, and z are floats specifying distances in the coordinate system of the objeto do centro. The next field is optional and may consist of the keyword @code{bbox-center} or the keyword @code{origin} and modifies the location of the origin of @var{objectID}'s co-ordinate frame: @code{bbox-center} temporarily translates @var{objectID}'s co-ordinate frame to the center of @var{objectID}'s bounding box. @code{origin} is the default (and means not to modify @var{objectID}'s co-ordinate frame) and @code{bbox-center} is only valid in Euclidean space. The optional @code{dt} field allows a simple form of animation; if present, the objeto moves by just that amount during approximately @code{dt} seconds, then stops. If present and followed by the @code{smooth} keyword, the movimento is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the movimento is applied immediately. @end table @node transform-incr, transform-set, transform, GCL Reference @subsection transform-incr @findex transform-incr @table @code @item (transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center] [dt [smooth]]) Apply continuing movimento: construct a transformation matrix and concatenate it with the current transform of objectID every refresh (sets objectID's incremental transform). Same syntax as transform. If optional @code{dt} argument is present, the objeto is moved at each time step such that its average movimento equals one instance of the movimento per @code{dt} seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds. @end table @node transform-set, ui-cam-focus, transform-incr, GCL Reference @subsection transform-set @findex transform-set @table @code @item (transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center]) Set objectID's transform to the constructed transform. Same syntax as transform. @end table @node ui-cam-focus, ui-center, transform-set, GCL Reference @subsection ui-cam-focus @findex ui-cam-focus @table @code @item (ui-cam-focus [focus-change|mouse-cross]) Set the focus policy for the janelas de c@^{a}mera. The default is @code{mouse-cross}: a c@^{a}mera is made the active c@^{a}mera (for interactive mouse events) when the mouse cursor crosses the window. Because this means it can become complicated to activate a specific c@^{a}mera (in the context of multiple janelas de c@^{a}mera) there is also the option to only change the c@^{a}mera focus when the window-manager decides to give it the focus for input events. So, after specifying @code{focus-change} it depends on the focus-change configuration of your window-manager when a c@^{a}mera becomes the active c@^{a}mera for mouse-interaction. To change this behaviour permanently you could, e.g., place the following line in your @file{$@{HOME@}/.geomview} file (@pxref{Customization}): @example (progn (ui-cam-focus focus-change) @dots{} # other stuff ) @end example @end table @node ui-center, ui-center-origin, ui-cam-focus, GCL Reference @subsection ui-center @findex ui-center @table @code @item (ui-center ID) Set the center for user interface (i.e. mouse) controlled movimentos to objeto ID. @end table @node ui-center-origin, ui-emotion-program, ui-center, GCL Reference @subsection ui-center-origin @findex ui-center-origin @table @code @item (ui-center-origin [origin|bbox-center]) Set the origin of the coordinate system of the @code{CENTER} objeto for user interface (i.e. mouse) controlled movimentos. The keyword @code{origin} means to use the origin of the coordinate system of the currently selected objeto, while @code{bbox-center} means to use the center of the bouding box of the current objeto. The keyword @code{bbox-center} makes no sense if the geometry is non-Euclidean. Using either @code{bbox-center} or @code{origin} does not make a difference if the objeto do centro is not a @emph{geometry}, e.g. if it is a camera. Same holds if the World is the currently selected objeto. @end table @node ui-emotion-program, ui-emotion-run, ui-center-origin, GCL Reference @subsection ui-emotion-program @findex ui-emotion-program @table @code @item (ui-emotion-program PROGRAM) This is an obsolete command. Use its new eqivalent @ref{emodule-define, @code{emodule-define}} instead. @end table @node ui-emotion-run, ui-freeze, ui-emotion-program, GCL Reference @subsection ui-emotion-run @findex ui-emotion-run @table @code @item (ui-emotion-run EMODULE) This is an obsolete command. Use its new eqivalent @ref{emodule-start, @code{emodule_start}} instead. @end table @node ui-freeze, ui-html-browser, ui-emotion-run, GCL Reference @subsection ui-freeze @findex ui-freeze @table @code @item (ui-freeze @{on|off@}) Toggle updating user interface panels. Off by default. @end table @node ui-html-browser, ui-motion, ui-freeze, GCL Reference @subsection ui-html-browser @findex ui-html-browser @table @code @item (ui-html-browser BROWSER) Use @var{BROWSER} for viewing the @var{HTML}-version of the manual when the @samp{Manual (HTML)} menu item is selected in the @samp{Help}-menu. If the @code{(ui-html-browser...)} command was never executed, then the default is to use the browser stored in the @code{WEBBROWSER} environment variable. If the environment variable is unset then the default is compile-time dependent. @end table @node ui-motion, ui-panel, ui-html-browser, GCL Reference @subsection ui-motion @findex ui-motion @table @code @item (ui-motion @{inertia|constrain|own-coordinates@} @{on|off@}) Enable or disable certain properties of mouse-controlled movimento. The purpose of this command is to give access to the respective toggles of the @emph{Main} panel's @emph{Motion} menu through GCL commands. @xref{Mouse Motions}. @table @code @item inertia Normally, moving objetos have inertia: if the mouse is still moving when the bot@~{a}o is released, the selected objeto continues to move. When @code{inertia} is off, objetos cease to move as soon as you release the mouse. @item constrain It's sometimes handy to move an objeto in a direction aligned with a coordinate axis: exactly horizontally or vertically. Calling @code{(ui-motion constrain on)} changes the interpretation of mouse movimentos to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical movimento. Note that the movimento is still along the X or Y axes of the c@^{a}mera in which you move the mouse, not necessarily the objeto's own coordinate system. @item own-coordinates It's sometimes handy to move objetos with respect to the coordinate system where they were defined, rather than with respect to some camera's view. When @code{(ui-motion own-coordinates on)} has been called, all movimentos are interpreted that way: dragging the mouse rightward in translate mode moves the objeto in its own @var{+X} direction, and so on. May be especially useful in conjunction with the @code{(ui-motion constrain on)} command. @end table @end table @node ui-panel, ui-pdf-viewer, ui-motion, GCL Reference @subsection ui-panel @findex ui-panel @table @code @item (ui-panel PANELNAME @{on|off@} [WINDOW]) Do or don't display the given user-interface panel. Case is ignored in panel names. Current @var{PANELNAMEs} are: @table @asis @item geomview main panel @item tools movimento controls @item appearance appearance controls @item cameras c@^{a}mera controls @item lighting lighting controls @item obscure obscure controls (doesn't seem to exist any more) @item materials material properties controls @item command command entry box @item credits geomview credits @end table By default, the @code{geomview} and @code{tools} panels appear when geomview starts. If the optional Window is supplied, a @code{position} clause (e.g. (ui-panel obscure on @{ position xmin xmax ymin ymax @}) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. @code{(ui-panel obscure on @{})@} causes interactive positioning. @end table @node ui-pdf-viewer, ui-target, ui-panel, GCL Reference @subsection ui-pdf-viewer @findex ui-pdf-viewer @table @code @item (ui-pdf-viewer VIEWER) Use the executable @var{VIEWER} for viewing the @var{PDF}-version of the manual when the @samp{Manual (PDF)} menu-item is selected in the @samp{Help}-menu. If the @code{(ui-pdf-viewer @dots{})} command was never executed, then the default is to use the browser stored in the @code{PDFVIEWER} environment variable. If the environment variable is unset then the default is compile-time dependent. @end table @node ui-target, uninterest, ui-pdf-viewer, GCL Reference @subsection ui-target @findex ui-target @table @code @item (ui-target ID [yes|no]) Set the target of user actions (the selected line of the objeto alvo browser) to ID. The second argument specifies whether to make ID the current objeto regardless of its type. If @code{no}, then ID becomes the current objeto of its type (geom or camera). The default is @code{yes}. This command may result in a change of modos de movimento based on target choice. @end table @node uninterest, update, ui-target, GCL Reference @subsection uninterest @findex uninterest @table @code @item (uninterest (COMMAND [args])) Undoes the effect of an @code{interest} command. (COMMAND [args]) must be identical to those used in the @ref{interest, @code{interest}} command. @end table @node update, update-draw, uninterest, GCL Reference @subsection update @findex update @table @code @item (update [timestep_in_seconds]) Apply each incremental movimento once. Uses timestep if it's present and nonzero; otherwise movimentos are proportional to elapsed real time. @end table @node update-draw, window, update, GCL Reference @subsection update-draw @findex update-draw @table @code @item (update-draw CAM-ID [timestep_in_seconds]) Apply each incremental movimento once and then draw CAM-ID. Applies @code{timestep} seconds' worth of movimento, or uses elapsed real time if @code{timestep} is absent or zero. @end table @node window, winenter, update-draw, GCL Reference @subsection window @findex window @table @code @item (window CAM-ID WINDOW) Specify attributes for the window of CAM-ID, e.g. its size or initial position, in the OOGL Window syntax. The special CAM-ID @code{default} specifies properties of future windows (created by @ref{camera, @code{camera}} or @ref{new-camera, @code{new-camera}}). @end table @node winenter, write, window, GCL Reference @subsection winenter @findex winenter @table @code @item (winenter CAM-ID) Tell geomview that the mouse cursor is in the window of CAM-ID. This function is for development purposes and is not intended for general use. @end table @node write, write-comments, winenter, GCL Reference @subsection write @findex write @table @code @item (write @{command|geometry|camera|transform|ntransform|window@} FILENAME [ID|(ID @dots{})] [self|world|universe|otherID]) write description of ID in given format to FILENAME. Last parameter chooses coordinate system for geometry & transform: self: just the objeto, no transformation or appearance (geometry only) world: the objeto as positioned within the World. universe: objeto's position in universal coordinates; includes Worldtransform other ID: the objeto transformed to otherID's coordinate system. A filename of @code{-} is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, @code{-} means geomview's standard output (@pxref{command, @code{(command @dots{})}}). The ID can either be a single id or a parenthesized list of ids, like @code{g0} or @code{(g2 g1 dodec.off)}. @end table @node write-comments, write-handle, write, GCL Reference @subsection write-comments @findex write-comments @table @code @item (write-comments FILENAME GEOMID PICKPATH) write OOGL COMMENT objetos in the GEOMID hierarchy at the level of the pick path to FILENAME. Specifically, COMMENTS at level (a b c @dots{} f g) will match pick paths of the form (a b c @dots{} f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the @code{pick} command) is a list of integer counters specifying a subpart of a hierarchical OOGL objeto. Descent into a complex objeto (LIST or INST) adds a new integer to the path. Traversal of simple objetos increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire string of zero, one, or more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses. Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objetos, which can be attached to other OOGL objetos via the LIST type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned. @end table @node write-handle, write-sexpr, write-comments, GCL Reference @subsection write-handle @findex write-handle @table @code @item (write-handle PREFIX FILENAME HANDLE) Writes the objeto underlying the given handle to @var{FILENAME}. This function is intended for internal debugging use only. @end table @node write-sexpr, xform, write-handle, GCL Reference @subsection write-sexpr @findex write-sexpr @table @code @item (write-sexpr FILENAME LISPOBJECT) Writes the given LISPOBJECT to FILENAME. This function is intended for internal debugging use only. @end table @node xform, xform-incr, write-sexpr, GCL Reference @subsection xform @findex xform @table @code @item (xform ID TRANSFORM) Concatenate TRANSFORM with the current transform of the objeto (apply TRANSFORM to objeto ID). @end table @node xform-incr, xform-set, xform, GCL Reference @subsection xform-incr @findex xform-incr @table @code @item (xform-incr ID TRANSFORM) Apply continual movimento: concatenate TRANSFORM with the current transform of the objeto every refresh (set objeto ID's incremental transform to TRANSFORM). @end table @node xform-set, zoom, xform-incr, GCL Reference @subsection xform-set @findex xform-set @table @code @item (xform-set ID TRANSFORM) Overwrite the current objeto transform with TRANSFORM (set objeto ID's transform to TRANSFORM). @end table @node zoom, , xform-set, GCL Reference @subsection zoom @findex zoom @table @code @item (zoom CAM-ID FACTOR) Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number. @end table @comment **************************************************************** @node Non-Euclidean Geometry, Mathematica, GCL, Top @chapter Non-Euclidean Geometry Geomview supports hyperbolic and spherical geometry as well as Euclidean geometry. The three bot@~{o}es at the bottom of the @emph{Main} panel are for setting the current geometry type. In each of the three geometries, three models are supported: @emph{Virtual}, @emph{Projective}, and @emph{Conformal}. You can change the current model with the @emph{Model} browser on the @emph{Camera} panel. Each Geomview c@^{a}mera has its own model setting. The default model is all three spaces is @emph{Virtual}. This corresponds to the c@^{a}mera being in the same space as, and moving under the same set of transformations as, the geometry itself. In Euclidean space @emph{Virtual} is the most useful model. The other models were implemented for hyperbolic and spherical spaces and just happen to work in Eucldiean space as well: @emph{Projective} is the same as @emph{Virtual} but by default displays the unit sphere, and @emph{Conformal} displays everything inverted in the unit sphere. In hyperbolic space, the @emph{Projective} model setting gives a view of the projective ball model of hyperbolic 3-space imbedded in Euclidean space. The c@^{a}mera is initially outside the unit ball. In this model, the c@^{a}mera moves by Euclidean movimentos and geometry moves by hyperbolic movimentos. @emph{Conformal} model is similar but shows the conformal ball model instead. In spherical space, the @emph{Projective} model gives a view of half of the 3-sphere imbedded in Euclidean 3-space. Spherical movimentos give rise to projective transformations in the @emph{Projective} model, and to @tex M\"{o}bius @end tex @ifnottex Moebius @end ifnottex transformations in the @emph{Conformal} model. In both of these models the c@^{a}mera moves by Euclidean movimentos. In @emph{Projective} and @emph{Conformal} models, the unit sphere is drawn by default. You can turn it off and on at will using the @emph{Draw Sphere} bot@~{a}o in the @emph{Camera} panel. In the @emph{Conformal} model, polygons and edges are subdivided as necessary to make them look curved. The parameters which determine this subdivision can be set with the @code{set-conformal-refine} GCL command. @xref{set-conformal-refine,@code{(set-conformal-refine @dots{})}}. There are several sample hyperbolic space objetos in the @file{data/geom/hyperbolic} subdirectory of the Geomview directory. Likewise, the subdirectory @file{data/geom/spherical} contains several sample spherical space objetos. @comment **************************************************************** @node Mathematica, Installation, Non-Euclidean Geometry, Top @chapter Mathematica Graphics in Geomview or RenderMan Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc. There are two ways to do this. @enumerate @item Use Mathematica to write a graphics objeto to a file in OOGL format or in RIB format. @item Use Geomview as the default display for all 3D graphics output in Mathematica. @end enumerate You can also use these packages to save Mathematica graphics in RenderMan (RIB) format. Since the format of Mathematica graphics objetos is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either of the above you must install this package. @menu * OOGL.m:: Generating OOGL files in Mathematica. * Geomview.m:: Geomview as Mathematica's Default 3D Display. * RenderMan:: Generating RenderMan files in Mathematica. * Remote Display:: Using Geomview and Mathematica on different computers. * Package Details:: Some details about the packages. * Package Installation:: Installing the Mathematica->Geomview package. @end menu @comment ================================================================ @node OOGL.m, Geomview.m, Mathematica, Mathematica @section Using Mathematica to generate OOGL files The package @file{OOGL.m} allows Mathematica to write graphics objetos in OOGL format. To use it, give the command @code{<< OOGL.m} to Mathematica to load the package. The @code{WriteOOGL[@var{file},@var{graphics}]} command writes an OOGL description of the 3D graphics objeto @var{graphics} to the file named @var{file}.@refill This package also provides the @code{Geomview} command which sends a 3D graphics objeto to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the @code{Geomview} command. @table @code @item Geomview[@var{graphics}] Sends the 3D graphics objeto @var{graphics} to Geomview as a geom named @code{Mathematica}. Subsequent usage of @code{Geomview[@var{graphics}]} replaces the @code{Mathematica} objeto in Geomview with the new @var{graphics}. @item @code{Geomview[@var{name},@var{graphics}]} Sends the 3D graphics objeto @var{graphics} to Geomview as a geom named @var{name}. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objetos at once and allow independent control over them. @end table @example % math Mathematica 2.0 for SGI Iris Copyright 1988-91 Wolfram Research, Inc. -- GL graphics initialized -- In[1] := <"riemann"] @end example @noindent This displays the graphics @code{%3} on the remote host named @code{riemann}.@refill @code{Geomview} recognizes the string @code{"local"} as a value for @code{$DisplayHost}; it forces the graphics to be displayed on the local machine.@refill In addition to knowing the name of the machine you want to run Geomview on, @code{Geomview} needs to know the type of that machine (the setting of the CPU variable that corresponds to the machine; @pxref{Source Code Installation}). By default, @code{Geomview} assumes that it is the same kind of computer as the one you are running Mathematica on. The @code{MachType} option lets you explicitly specify the type of the @code{DisplayHost} computer; it should be one of the strings @code{"sgi"} or @code{"next"} or @code{"x11"}.@refill You can use @code{SetOptions} to change the default @code{DisplayHost} and @code{MachType}. For example, @example In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"] @end example @noindent arranges for @code{Geomview} to run Geomview on an SGI workstation named @code{riemann}.@refill @comment ---------------------------------------------------------------- @node Chunks, , Networked Geomview, Remote Display @subsection Transporting Mathematica Files to Geomview by Hand The auxilliary function @code{WriteChunk} is for those who can only use Mathematica on a computer that Geomview isn't installed on. @code{WriteChunk[@var{file}, @var{graphics}]} generates a file named @var{file} which contains the graphics objeto @var{graphics} in the format accepted by @file{math2oogl}.@refill You can transfer that file to a computer that has Geomview installed on it and then use the programs @file{math2oogl}, @file{oogl2ri}b, and @file{geomview} directly from the shell. These programs are distributed in the @file{bin/} subdirectory of the Geomview directory, and may have been installed so that they are on your @code{path}. @example In[1]:= < mma.oogl @end example @noindent to convert it to the OOGL file @file{mma.oogl} which you can then view using Geomview. This is the equivalent of the @code{WriteOOGL} command. For a result equivalent to the @code{Geomview} or @code{Show} commands, type @example math2oogl -togeomview Mathematica geomview < mychunk @end example @noindent The @code{WriteRI}b command can be emulated from the shell as @example math2oogl < mychunk | oogl2rib -n mma.tiff @end example @noindent @comment ================================================================ @node Package Details, Package Installation, Remote Display, Mathematica @section Details of the Mathematica->Geomview Package The @file{OOGL.m} package uses the external program @file{math2oogl} to convert @code{Graphics3D} objetos to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica. The converter will sometimes handle colored SurfaceGraphics objetos correctly that Mathematica does not handle correctly, which means that Geomview[objeto] sometimes works where Show[objeto] will give errors. The converter supports the @code{Polygon}, @code{Line}, and @code{Point} graphics primitives, @code{RGBColor Graphics3D} directives, and @code{SurfaceGraphics} objetos with or without @code{RGBColor} directives, and lists of any combination of these. It silently ignores all other directives. The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib). In the @code{WriteOOGL} and @code{WriteRI}b commands, filename can either be a string containing a filename, an @code{OutputStream} objeto, or a string starting with a @code{!} to send the output to a command. Objeto can be a @code{Graphics3D} objeto, a @code{SurfaceGraphics} objeto, or a list of these.@refill The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host. @comment ================================================================ @node Package Installation, , Package Details, Mathematica @section Installing the Mathematica Packages If Geomview is properly installed on your system according to the instructions in @xref{Installation}, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed. In this section, the phrase @emph{Geomview installation} refers any of the procedures in @xref{Installation}. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution. @enumerate @item The relevant mathematica files are @file{OOGL.m}, @file{Geomview.m}, and @file{BezierPlot.m}; Mathematica must be able to find these files. They are distributed in the @file{$GEOMROOT/mathematica} subdirectory of the binary distributions, and in the @file{$GEOMROOT/src/bin/geomutil/math2oogl} subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the @code{$Path} variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path. The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (@code{MMAPACKAGEDIR}). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the @code{$Path} variable each time you run Mathematica. @item The package @file{OOGL.m} needs to be able to invoke the programs @file{geomview}, @file{math2oogl}, and @file{oogl2ri}b. The Geomview installation procedure installs these programs into a directory that you specify for executables (@code{BINDIR}). Ideally, this directory should be on your shell's @code{$path}. More specifically, it should be on the @code{$path} of the shell in which Mathematica runs; the directory @file{/usr/local/bin} is usually a good choice. You can see the list of directories on this path by giving the command @code{!echo $path} in Mathematica. If for some reason you can't arrange for @file{geomview}, @file{math2oogl}, and @file{oogl2ri}b to be in a directory on the shell's @code{$path}, you can modify @file{OOGL.m} to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables @code{$GeomviewPath} and @code{$GeomRoot}, which are defined near the top of the file. Change @code{$GeomviewPath} to the absolute pathname of the @file{geomview} shell script on your system. Change @code{$GeomRoot} to the absolute pathname of the @file{$GEOMROOT} directory on your system. If you do this, you should also make sure there are copies of @file{geomview}, @file{math2oogl}, and @file{oogl2ri}b in the @file{$GEOMROOT/bin/}. @item The @file{geomview} shell script, which @file{OOGL.m} uses to invoke Geomview, needs to be able to find the geomview executable file ( called @file{gvx}). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the @file{geomview} script are correct. @end enumerate @comment **************************************************************** @node Installation, Support, Mathematica, Top @chapter Installation What you do to install Geomview depends on which kind of computer you have and on whether you have the source distribution or the binary distribution. In general, if you don't care about looking at Geomview's source code, you should get one of the binary distribution. The binary installation is much easier and quicker than compiling and installing the source code. @menu * Unix Binary Installation:: Installing the Unix Binary Distribution * Source Code Installation:: Compiling and Installing the Source Code Distribution. @end menu @comment ================================================================ @node Unix Binary Installation, Source Code Installation, Installation, Installation @section Installing the Unix Binary Distribution If you have just obtained a copy of the binary distribution for a Unix system (Linux, SGI, Solaris, HP, etc), you should be able to run Geomview and make use of most of its features immediately after unpacking it by @code{cd}'ing to the directory that it is in and typing @code{geomview}. In order to fully install Geomview so that you can run it from any directory and use all of its features, follow the steps in this section. In particular, you must go through this installation procedure in order to use Geomview to display Mathematica graphics. Geomview is distributed in a directory that contains various files and subdirectories that Geomview needs at run-time, such as data files and external modules. It also contains other things distributed with Geomview, such as documentation and (in the soure-code distribution) source-code. We refer to the root directory of this tree as the @file{$GEOMROOT} directory. This is the directory called @file{Geomview} that is created when you unpack the distribution file. To install Geomview on your system, arrange for the @file{$GEOMROOT} directory to be in a permanent place. Then, in a shell window, @code{cd} to that directory and type @code{install}. This runs a shell script which does the installation after asking you several questions about where you want to install the various components of Geomview. After running the @code{install} script you should now be able to run Geomview from any directory on your system. (You may need to give the @code{rehash} command in any shells on your computer that were started up before you did the installation.) The @file{install} script puts copies of the files in @file{$GEOMROOT/bin/} and @file{$GEOMROOT/man} into the directories you specified for executables and man pages, respectively. Once you have done the installation you can cut down one the disk space required by Geomview by removing some files from these directories, since copies have been installed elsewhere. You should first test that your installed Geomview works properly because once you remove these files from their distribution directories you will not be able to do the installation again. In particular, the files you can remove are @table @asis @item @file{$GEOMROOT/bin/}: (where @file{} is the type of system you are on, e.g. @file{linux}, @file{sgi}, @file{hpux}, etc). Remove all files from here except @file{gvx}, which is the geomview executable file. DO NOT REMOVE @file{gvx}. It is not installed elsewhere. @item @file{$GEOMROOT/man}: You can remove all the files in this directory. @end table @comment ================================================================ @menu * Unix Binary Detail:: @end menu @node Unix Binary Detail, , Unix Binary Installation, Unix Binary Installation @subsection Details of the Unix Binary Installation The @code{install} script should be self-explanatory; just run it and answer the questions. This section gives some details for system administrators and other users who may want to know more about the installation. The installation is actually done by @code{make}; the @code{install} script queries the user for the settings of the following @code{make} variables and then invokes @code{make install}. @table @asis @item @code{GEOMROOT}: the absolute pathname of the Geomview root directory. The @code{geomview} shell script, which is what users invoke to run Geomview, uses this to set various environment variables that Geomview needs. It is very important that this be an @emph{absolute} pathname --- i.e. it should start with a '/'. @item @code{BINDIR}: a directory where executable files are installed. The @code{geomview} shell script goes here, as well as various other auxiliary programs that can be used in conjunction with @code{geomview}. This should be a directory that is on users' @file{$path}. These auxiliary programs are distributed in the @file{$GEOMROOT/bin/} directory; if you specify this directory for @code{BINDIR}, they are left in that directory. @item @code{MANDIR}: a directory where Unix manual pages are installed. These are distributed in the @file{$GEOMROOT/man} subdirectory; if you specify this directory for @code{MANDIR}, they are left in that directory. @item @code{MMAPACKAGEDIR}: a directory where Mathematica packages are installed. This should be a directory that Mathematica searches for packages that it loads; you can see what directories your Mathematica searches by looking at the value of the @code{$Path} variable in a Mathematica session. The installation process will install some packages there which allow you to use Geomview to display Mathematica graphics. These packages are distributed in the @file{$GEOMROOT/mathematica} subdirectory; if you specify this directory for @code{MMAPACKAGEDIR}, or if you specify the empty string for @code{MMAPACKAGEDIR}, the packages are left in that directory. For more details about the way these Mathematica packages connect to Geomview, @pxref{Package Installation}. @end table @comment ================================================================ @node Source Code Installation, , Unix Binary Installation, Installation @section Compiling and Installing the Source Code Distribution The main reason to get the source code distribution is to look at and/or work with the source code. If you are only concered with @emph{using} Geomview it is better to get the binary distribution. It takes anywhere from a few minutes to an hour or more to compile the entire source distribution, depending on what kind of computer you have. Let @file{$GEOMROOT} denote the full pathname of the Geomview source code directory; this is the directory called @file{Geomview} that is created when you unpack the distribution. This directory contains the Geomview source code as well as various other files and subdirectories that Geomview needs when it runs. Before doing any compilation you should edit the file @file{$GEOMROOT/makefiles/mk.site.default}. This file defines some @code{make} variables which specify your local configuration. This includes the pathnames of the directories into which Geomview will be installed, and possibly some other settings as well. There are comments in the file telling you what to do. This file is included by every Makefile in the source tree, so the settings you specify here are used throughout the source. If you will be compiling for multiple systems, you can do them all in the same directory tree. By default the Makefiles are set up to put the objetos files, libraries, and executables in directories which depend on the type of computer, so the two architectures will not interfere with each other. The Makefiles use a variable called @code{CPU} to determine the type of machine. Before doing any compilation you must arrange for this variable to have a value. There are two ways you can do this. @enumerate @item If you will always be compiling Geomview on the same type of computer edit the file @file{$GEOMROOT/makefiles/Makedefs.global} to set the @code{CPU} variable to one of the values @file{linux}, @file{FreeBSD}, @file{sgi}, @file{hpux}, @file{hpux-gcc}, @file{solaris}, @file{sun4os4} (for Suns with SunOS 4, not Solaris), @file{rs6000}, or @file{alpha}. If you're using a type of system not in this list, make up a new value for CPU, and write a @file{mk.} file for it patterned after the other @file{mk.*} in the @file{makefiles} subdirectory. @item If you will be compiling on more than one type of computer you can set a shell environment variable named @code{CPU} to one of the values above and the Makefiles will inherit the value from the environment. @end enumerate @noindent Note that many of the Makefiles refer to a variable called @code{MACHTYPE}; this variable tells which type of graphics system to compile Geomview for. The @file{mk.} files set this variable for you; in most cases its value is @file{x11}, which specifies that Geomview should be compiled for X windows. Once you have configured your source tree by editing the files as described above and setting the @code{CPU} variable, you can compile and install Geomview by typing @code{make install} in the @file{$GEOMROOT} directory. You can also type @code{make all}, or equivalently just @code{make}, to compile without installing, and then type @code{make install} later to install. You can use these same @code{make} comands in any subdirectory in the tree to recompile and/or install a part of Geomview or a module. If you want to modify the complier flags used during compilation, edit the file @file{$GEOMROOT/makefiles/Makedefs.global}; the @code{COPTS} variable specifies the flags passed to the C compiler (cc). @comment ********************************************************* @node Support, Contributing, Installation, Top @unnumbered Getting Technical Support for Geomview There are several ways to get support for Geomview. @enumerate @item Visit the Geomview web site, @uref{http://www.geomview.org}. It contains the latest documentation, news about development, and FAQ (Frequently Asked Questions) list. @item Send email to the geomview-users@@lists.sourceforge.net mailing list. This is a mailing list for discussing any issues related to using Geomview. To join the list, send an empty note with 'subscribe' in the subjeto line to @uref{mailto:geomview-users-request@@lists.sourceforge.net,geomview-users-request@@lists.sourceforge.net}, or visit the list web page at @uref{http://lists.sourceforge.net/mailman/listinfo/geomview-users}. @item Contract with Geometry Technologies for support. Geometry Technologies is a contract support and programming company that emerged from the Geometry Center, where Geomview was written. For more information visit the Geometry Technologies web site at @uref{http://www.geomtech.com}. @end enumerate @comment ############################################################ @node Contributing, Function Index, Support, Top @unnumbered Contributing to Geomview's Development If you are interested in contributing to the development of Geomview, there are several things you can do: @enumerate @item @strong{Volunteer programming work}. If you are a programmer and make an improvement to Geomview, contact the other geomview authors by sending a note to the @file{geomview-users} mailing list (see @uref{http://lists.sourceforge.net/mailman/listinfo/geomview-users}). @item @strong{Contract with Geometry Technologies}. Geometry Technologies, Inc. is a consulting firm that provides contract technical support and custom programming services in the area of 3D graphics. This includes a wide range of services related to 3D graphics, included but not limited to applications involving Geomview. To the extent that resources allow, Geometry Technologies supports the developement of Geomview; in particular it hosts the @uref{http://www.geomview.org} web site, and its staff make ongoing improvements to Geomview itself. If you are in a position to pay for technical support or custom programming work, contracting with Geometry Technologies indirectly supports Geomview. You can also contract with with Geometry Technologies to have particular features that you want added to Geomview, or to port Geomview to a new platform. For more information see Geometry Technologies web site at @uref{http://www.geomtech.com}. @end enumerate Thank you. @comment **************************************************************** @node Function Index, List of Figures, Contributing, Top @unnumbered Function Index @printindex fn @comment **************************************************************** @contents @node List of Figures, , Function Index, Top @unnumbered List of Figures @listoffloats Figure @bye @c LocalWords: Geomview RenderMan texinfo letterpaper setfilename geomview sp @c LocalWords: settitle texi dircategory direntry titlepage titlefont vskip @c LocalWords: Munzner uref Hanrahan MinneView OOGL Meuer Kaplan SGI NeXT GPL @c LocalWords: SGIs NeXTStep OpenGL Geomview's unnumberedsec Gunn Krech MacOS @c LocalWords: Daeron Cygwin SystemV FreeBSD Solaris Precompiled emph Heine @c LocalWords: Renderman Mathematica pxref smallexample Yoyodyne Thurston GCL @c LocalWords: xref Bezier var emodule iconify PPM NCMESH NCOFF RGBA geomview-1.9.4/doc/stamp-10000644000175000001440000000014110665240663012242 00000000000000@set UPDATED 23 August 2007 @set UPDATED-MONTH August 2007 @set EDITION 1.9.4 @set VERSION 1.9.4 geomview-1.9.4/doc/geomview0000644000175000001440000001463510663305733012615 00000000000000This is ../../doc/geomview, produced by makeinfo version 4.8 from ../../doc/geomview.texi. INFO-DIR-SECTION Graphics Applications START-INFO-DIR-ENTRY * Geomview: (geomview). The interactive 3D viewing program. END-INFO-DIR-ENTRY  Indirect: geomview-1: 240 geomview-2: 300126  Tag Table: (Indirect) Node: Top240 Node: Intro1648 Node: Distrib2996 Node: Copying4451 Node: History32924 Node: Authors35689 Node: Platforms36363 Node: Pronunciation36919 Node: Overview37442 Node: Tutorial40137 Ref: figinitial40977 Ref: figlookatworld44938 Ref: figappearance45388 Ref: figcolorchooser46391 Ref: figfilespanel48975 Ref: figtrefdodec49639 Node: Interaction49721 Node: Starting Geomview50501 Node: Command Line Options51074 Node: Basic Interaction55736 Ref: figmainpanel56298 Node: Loading61644 Ref: figmyfilelist61989 Ref: figloadpanel64801 Node: Mouse Motions65141 Ref: figtools65768 Node: Point of Interest74718 Node: Appearance77712 Node: Appearance Panel79490 Ref: figap79743 Ref: figcolorchooserpanel81203 Node: Materials Panel85477 Ref: figmatpanel85784 Node: Lighting Panel87215 Node: Cameras89738 Ref: figcamerapanel90116 Node: Saving96401 Ref: figsavepanel96671 Node: Commands102038 Ref: figcommandpanel102597 Node: Keyboard Shortcuts104137 Node: OOGL File Formats109606 Node: Conventions110299 Node: Common syntax111081 Node: File names112288 Node: Vertices112754 Node: ND-Vertices114214 Node: Surface normal directions115471 Node: Transformation matrices116209 Node: ND Transformation matrices117118 Node: Binary format118015 Node: References119522 Node: Appearances121955 Node: Texture Mapping130988 Node: Object File Formats136656 Node: QUAD137730 Node: MESH139093 Node: BBOX141731 Node: BBP and BEZ142877 Node: OFF146136 Node: VECT150157 Node: SKEL152969 Node: SPHERE155320 Node: INST157177 Node: INST Examples163002 Node: LIST164069 Node: TLIST164901 Node: GROUP166496 Node: DISCGRP167038 Node: COMMENT167326 Node: Non-geometric objects168777 Node: appearance169472 Node: image169850 Node: transform180154 Node: ntransform182776 Node: camera186485 Node: window191252 Node: Customization192630 Node: Modules194717 Node: Interface196092 Node: Example1198005 Node: Example2205459 Node: XForms214031 Node: Example3214732 Node: Example4236103 Node: Module Installation242338 Node: Private Module Installation242937 Node: System Module Installation244197 Node: GCL245612 Node: Argument Conventions248716 Node: GCL Reference251463 Node: shell260797 Node: lt260950 Node: eq261185 Node: gt261416 Node: help261653 Node: morehelp262025 Node: emodule-run262283 Node: all262433 Node: and262892 Node: ap-override263120 Node: backcolor263424 Node: background-image263669 Node: bbox-color264295 Node: bbox-draw264546 Node: camera264814 Node: camera-draw265235 Node: camera-prop265482 Node: camera-reset266136 Node: car266333 Node: cdr266493 Node: clock266676 Node: command266957 Node: copy267236 Node: cursor-still267546 Node: cursor-twitch267883 Node: delete268219 Node: dice268384 Node: dimension268697 Node: dither269122 Node: draw269316 Node: dump-handles269533 Node: echo269799 Node: emodule-clear270245 Node: emodule-define270467 Node: emodule-defined270929 Node: emodule-isrunning271331 Node: emodule-path271767 Node: emodule-run272178 Node: emodule-sort273404 Node: emodule-start273630 Node: emodule-transmit273940 Node: escale274409 Node: event-keys274622 Node: event-mode274854 Node: event-pick275310 Node: evert275491 Node: exit275745 Node: ezoom275885 Node: freeze276076 Node: geometry276383 Node: geomview-version276826 Node: hdefine277074 Node: hdelete277778 Node: help278844 Node: hmodel279127 Node: hsphere-draw279385 Node: if279750 Node: inhibit-warning280077 Node: input-translator280469 Node: interest281137 Node: lines-closer282617 Node: load283293 Node: load-path283907 Node: look284289 Node: look-encompass285036 Node: look-encompass-size285558 Node: look-recenter286242 Node: look-toward286886 Node: merge287431 Node: merge-ap287858 Node: merge-base-ap288179 Node: merge-baseap288429 Node: morehelp288789 Node: name-object289040 Node: ND-axes289415 Node: ND-color290793 Node: ND-xform292030 Node: ND-xform-get292507 Node: ND-xform-set292989 Node: new-alien293557 Node: new-camera294299 Node: new-center294658 Node: new-geometry295124 Node: new-reset295582 Node: NeXT295794 Node: normalization296019 Node: not297247 Node: or297482 Node: pick297739 Node: pick-invisible299309 Node: pickable299638 Node: position299915 Node: position-at300126 Node: position-toward300477 Node: progn300898 Node: quit301234 Node: quote301397 Node: rawevent301592 Node: rawpick301983 Node: read302289 Node: real-id302973 Node: redraw303468 Node: regtable303736 Node: rehash-emodule-path303913 Node: replace-geometry304553 Node: rib-display304822 Node: rib-snapshot305585 Node: scale305948 Node: scene306701 Node: set-clock306905 Node: set-conformal-refine307254 Node: set-emodule-path307957 Node: set-load-path308692 Node: set-motionscale309158 Node: setenv309804 Node: sgi310142 Node: shell310363 Node: sleep-for310659 Node: sleep-until311013 Node: snapshot311637 Node: soft-shader313344 Node: space313586 Node: stereowin313795 Node: time-interests314736 Node: transform315608 Node: transform-incr317762 Node: transform-set318581 Node: ui-cam-focus318936 Node: ui-center320017 Node: ui-center-origin320264 Node: ui-emotion-program321083 Node: ui-emotion-run321394 Node: ui-freeze321684 Node: ui-html-browser321908 Node: ui-motion322464 Node: ui-panel324269 Node: ui-pdf-viewer325366 Node: ui-target325922 Node: uninterest326468 Node: update326783 Node: update-draw327092 Node: window327445 Node: winenter327861 Node: write328159 Node: write-comments329253 Node: write-handle330632 Node: write-sexpr330946 Node: xform331227 Node: xform-incr331476 Node: xform-set331803 Node: zoom332062 Node: Non-Euclidean Geometry332283 Node: Mathematica334704 Node: OOGL.m336201 Node: Geomview.m338113 Node: RenderMan340828 Node: Remote Display343459 Node: Networked Geomview344196 Node: Chunks346060 Node: Package Details347564 Node: Package Installation349012 Node: Installation353389 Node: Unix Binary Installation354539 Node: Unix Binary Detail357805 Node: Source Code Installation360676 Node: Support364737 Node: Contributing365897 Node: Function Index367472 Node: List of Figures379228  End Tag Table geomview-1.9.4/doc/example1.c0000644000175000001440000000373610455700774012733 00000000000000/* * example1.c: oscillating mesh * * This example module is distributed with the geomview manual. * If you are not reading this in the manual, see the "External * Modules" chapter of the manual for more details. * * This module creates an oscillating mesh. */ #include #include /* F is the function that we plot */ float F(x,y,t) float x,y,t; { float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); } main(argc, argv) char **argv; { int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t, dt; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Geomview setup. We begin by sending the command * (geometry example { : foo}) * to geomview. This tells geomview to create a geom called * "example" which is an instance of the handle "foo". */ printf("(geometry example { : foo })\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) { UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); } } /* UpdateMesh sends one mesh iteration to geomview. This consists of * a command of the form * (read geometry { define foo * MESH * ... * }) * where ... is the actual data of the mesh. This command tells * geomview to make the value of the handle "foo" be the specified * mesh. */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; { int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry { define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include #include /* for struct timeval below */ #include "forms.h" /* for FORMS library */ FL_FORM *OurForm; FL_OBJECT *VelocitySlider; float dt; /* F is the function that we plot */ float F(x,y,t) float x,y,t; { float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); } /* SetVelocity is the slider callback procedure; FORMS calls this * when the user moves the slider bar. */ void SetVelocity(FL_OBJECT *obj, long val) { dt = fl_get_slider_value(VelocitySlider); } /* Quit is the "Quit" button callback procedure; FORMS calls this * when the user clicks the "Quit" button. */ void Quit(FL_OBJECT *obj, long val) { exit(0); } /* create_form_OurForm() creates the FORMS panel by calling a bunch of * procedures in the FORMS library. This code was generated * automatically by the FORMS designer program; normally this code * would be in a separate file which you would not edit by hand. For * simplicity of this example, however, we include this code here. */ create_form_OurForm() { FL_OBJECT *obj; FL_FORM *form; OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0); obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,""); VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0, 340.0,40.0,"Velocity"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_object_align(obj,FL_ALIGN_TOP); fl_set_call_back(obj,SetVelocity,0); obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_call_back(obj,Quit,0); fl_end_form(); } main(argc, argv) char **argv; { int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t; int fdmask; static struct timeval timeout = {0, 200000}; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Forms panel setup. */ foreground(); create_form_OurForm(); fl_set_slider_bounds(VelocitySlider, 0.0, 1.0); fl_set_slider_value(VelocitySlider, dt); fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2"); /* Geomview setup. */ printf("(geometry example { : foo })\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) { fdmask = (1 << fileno(stdin)) | (1 << qgetfd()); select(qgetfd()+1, &fdmask, NULL, NULL, &timeout); fl_check_forms(); UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); } } /* UpdateMesh sends one mesh iteration to geomview */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; { int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry { define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include "lisp.h" /* We use the OOGL lisp library */ #include "pickfunc.h" /* for PICKFUNC below */ #include "3d.h" /* for 3d geometry library */ /* boxstring gives the OOGL data to define the little box that * we draw at the pick point. NOTE: It is very important to * have a newline at the end of the OFF object in this string. */ char boxstring[] = "\ INST\n\ transform\n\ .04 0 0 0\n\ 0 .04 0 0\n\ 0 0 .04 0\n\ 0 0 0 1\n\ geom\n\ OFF\n\ 8 6 12\n\ \n\ -.5 -.5 -.5 # 0 \n\ .5 -.5 -.5 # 1 \n\ .5 .5 -.5 # 2 \n\ -.5 .5 -.5 # 3 \n\ -.5 -.5 .5 # 4 \n\ .5 -.5 .5 # 5 \n\ .5 .5 .5 # 6 \n\ -.5 .5 .5 # 7 \n\ \n\ 4 0 1 2 3\n\ 4 4 5 6 7\n\ 4 2 3 7 6\n\ 4 0 1 5 4\n\ 4 0 4 7 3\n\ 4 1 2 6 5\n"; progn() { printf("(progn\n"); } endprogn() { printf(")\n"); fflush(stdout); } Initialize() { extern LObject *Lpick(); /* This is defined by PICKFUNC below but must */ /* be used in the following LDefun() call */ LInit(); LDefun("pick", Lpick, NULL); progn(); { /* Define handle "littlebox" for use later */ printf("(read geometry { define littlebox { %s }})\n", boxstring); /* Express interest in pick events; see geomview manual for explanation. */ printf("(interest (pick world * * * * nil nil nil nil nil))\n"); /* Define "pick" object, initially the empty list (= null object). * We replace this later upon receiving a pick event. */ printf("(geometry \"pick\" { LIST } )\n"); /* Make the "pick" object be non-pickable. */ printf("(pickable \"pick\" no)\n"); /* Turn off normalization, so that our pick object will appear in the * right place. */ printf("(normalization \"pick\" none)\n"); /* Don't draw the pick object's bounding box. */ printf("(bbox-draw \"pick\" off)\n"); } endprogn(); } /* The following is a macro call that defines a procedure called * Lpick(). The reason for doing this in a macro is that that macro * encapsulates a lot of necessary stuff that would be the same for * this procedure in any program. If you write a geomview module that * wants to know about user pick events you can just copy this macro * call and change the body to suit your needs; the body is the last * argument to the macro and is delimited by curly braces. * * The first argument to the macro is the name of the procedure to * be defined, "Lpick". * * The next two arguments are numbers which specify the sizes that * certain arrays inside the body of the procedure should have. * These arrays are used for storing the face and path information * of the picked object. In this module we don't care about this * information so we declare them to have length 1, the minimum * allowed. * * The last argument is a block of code to be executed when the module * receives a pick event. In this body you can refer to certain local * variables that hold information about the pick. For details see * Example 3 in the Extenal Modules chapter of the geomview manual. */ PICKFUNC(Lpick, { handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge); }, /* ND-stuff */) handle_pick(picked, p, vert, v, edge, e) int picked; /* was something actually picked? */ int vert; /* was the pick near a vertex? */ int edge; /* was the pick near an edge? */ HPoint3 *p; /* coords of pick point */ HPoint3 *v; /* coords of picked vertex */ HPoint3 e[2]; /* coords of endpoints of picked edge */ { Normalize(&e[0]); /* Normalize makes 4th coord 1.0 */ Normalize(&e[1]); Normalize(p); progn(); { if (!picked) { printf("(geometry \"pick\" { LIST } )\n"); } else { /* * Put the box in place, and color it magenta if it's on a vertex, * yellow if not. */ printf("(xform-set pick { 1 0 0 0 0 1 0 0 0 0 1 0 %g %g %g 1 })\n", p->x, p->y, p->z); printf("(geometry \"pick\"\n"); if (vert) printf("{ appearance { material { diffuse 1 0 1 } }\n"); else printf("{ appearance { material { diffuse 1 1 0 } }\n"); printf(" { LIST { :littlebox }\n"); /* * If it's on an edge and not a vertex, mark the edge * with cyan boxes at the endpoins and a yellow line * along the edge. */ if (edge && !vert) { e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z; e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z; printf("{ appearance { material { diffuse 0 1 1 } }\n\ LIST\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { VECT\n\ 1 2 1\n\ 2\n\ 1\n\ %f %f %f\n\ %f %f %f\n\ 1 1 0 1\n\ }\n\ }\n", e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z, e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z); } printf(" }\n }\n)\n"); } } endprogn(); } Normalize(HPoint3 *p) { if (p->w != 0) { p->x /= p->w; p->y /= p->w; p->z /= p->w; p->w = 1; } } main() { Lake *lake; LObject *lit, *val; extern char *getenv(); Initialize(); lake = LakeDefine(stdin, stdout, NULL); while (!feof(stdin)) { /* Parse next lisp expression from stdin. */ lit = LSexpr(lake); /* Evaluate that expression; this is where Lpick() gets called. */ val = LEval(lit); /* Free the two expressions from above. */ LFree(lit); LFree(val); } } geomview-1.9.4/doc/example4.tcl0000644000175000001440000000703607730233164013267 00000000000000#! /usr/local/bin/wish4.0 proc readsomething {} { if {[gets stdin line] < 0} { puts stderr "EOF on input, exiting..." exit } # Translate geomview's lisp-style ()'s into tcl-friendly {} braces. regsub -all {\(} $line "\{" line regsub -all {\)} $line "\}" line # Strip outermost set of braces set stuff [lindex $line 0] # invoke handler for whichever command we got switch [lindex $stuff 0] { pick {handlepick $stuff} rawevent {handlekey $stuff} } } # Having asked for notification of these raw events, we report when # the user pressed these keys in the geomview graphics windows. proc handlekey {event} { global lastincr switch [lindex $event 1] { 32 {msg "Pressed space bar"} 8 {msg "Pressed backspace key"} # Backspace: decrement it. } } # Fields of a "pick" response, from geomview manual: # (pick COORDSYS GEOMID G V E F P VI EI FI) # The pick command is executed internally in response to pick # events (right mouse double click). # # COORDSYS = coordinate system in which coordinates of the following # arguments are specified. This can be: # world: world coord sys # self: coord sys of the picked geom (GEOMID) # primitive: coord sys of the actual primitive within # the picked geom where the pick occurred. # GEOMID = id of picked geom # G = picked point (actual intersection of pick ray with object) # V = picked vertex, if any # E = picked edge, if any # F = picked face # P = path to picked primitive [0 or more] # VI = index of picked vertex in primitive # EI = list of indices of endpoints of picked edge, if any # FI = index of picked face # User picked something. # proc handlepick {pick} { global nameof selvert seledge order set obj [lindex $pick 2] set xyzw [lindex $pick 3] set fv [lindex $pick 6] set vi [lindex $pick 8] set ei [lindex $pick 9] set fi [lindex $pick 10] # Report result. set w [lindex $xyzw 3] set x [expr [lindex $xyzw 0]/$w] set y [expr [lindex $xyzw 1]/$w] set z [expr [lindex $xyzw 2]/$w] set s "$x $y $z " if {$vi >= 0} { set s "$s vertex #$vi" } if {$ei != {}} { set s "$s edge [lindex $ei 0]-[lindex $ei 1]" } if {$fi != -1} { set s "$s face #$fi ([expr [llength $fv]/4]-gon)" } msg $s } proc loadobject {fname} { if {$fname != ""} { puts "(geometry thing < $fname)" # Be sure to flush output to ensure geomview receives this now! flush stdout } } # # Display a message on the control panel # proc msg {str} { global msgtext puts stderr $str set msgtext $str update } # Build "user interface" # This doesn't need to be an entry box, but we want to be able to # use X selection to copy text from it. entry .msg -textvariable msgtext -width 30 pack .msg -fill x -expand true frame .f label .f.l -text "File to load:" pack .f.l -side left entry .f.ent -textvariable fname pack .f.ent -side left -expand true -fill x pack .f bind .f.ent { loadobject $fname } # End UI definition. # Call "readsomething" when data arrives from geomview. fileevent stdin readable {readsomething} # Geomview initialization puts { (interest (pick primitive)) (interest (rawevent 32)) (interest (rawevent 8)) (geometry thing < hdodec.off) (normalization world none) } flush stdout wm title . {Sample external module} msg "Click right mouse in graphics window" geomview-1.9.4/doc/Makefile.am0000644000175000001440000000655210663324474013106 00000000000000PSIMAGES = figs/ap.ps figs/command.ps figs/light.ps figs/mat.ps\ figs/secondlinelist.ps figs/cam.ps figs/fig2.ps figs/load.ps\ figs/myfilelist.ps figs/tools.ps figs/color.ps figs/initial.ps\ figs/main.ps figs/save.ps figs/trefdodecinter.ps EPSIMAGES = $(PSIMAGES:.ps=.eps) PDFIMAGES = $(PSIMAGES:.ps=.pdf) PNGIMAGES = $(PSIMAGES:.ps=.png) LANGUAGES = "" "-pt_BR" man_MANS = geomview.5gv lisp.3gv oogl.5gv EXTRA_DIST = geomview.pdf geomview.html\ geomview-pt_BR.pdf geomview-pt_BR.html\ README README.gvplot oogltour oogltour-pt_BR\ example1.c example2.c example3.c example4.tcl\ OOGL.m.txt motion.tex $(man_MANS)\ $(PSIMAGES) $(PNGIMAGES) $(PDFIMAGES) $(EPSIMAGES) AM_MAKEINFOFLAGS = --no-validate info_TEXINFOS = geomview.texi geomview-pt_BR.texi infoimgdir = $(infodir) nobase_infoimg_DATA = $(PNGIMAGES) geomview_pt_BR_texi_MAKEINFOFLAGS = --enable-encoding --lang=pt dochtmldir = $(docdir)/html doc_DATA = geomview.pdf geomview-pt_BR.pdf geomview.pdf: $(PDFIMAGES) geomview.ps: $(EPSIMAGES) geomview.dvi: $(EPSIMAGES) geomview.html: $(PNGIMAGES) geomview-pt_BR.pdf: $(PDFIMAGES) geomview-pt_BR.ps: $(EPSIMAGES) geomview-pt_BR.dvi: $(EPSIMAGES) geomview-pt_BR.html: $(PNGIMAGES) TEXINPUTS = $(srcdir):.: all-local: htdocs pdf htdocs/*.html htdocs/figs/*.png: htdocs htdocs: geomview.html geomview-pt_BR.html if test -d $@; then rm -rf $@; fi for loc in $(LANGUAGES); do \ if test -d $(srcdir)/geomview$${loc}.html; then \ htmldir=$(srcdir)/geomview$${loc}.html; \ else \ htmldir=geomview$${loc}.html; \ fi; \ loc2=`echo $${loc}|$(SED) -e 's/-//g'`; \ $(MKDIR_P) $@/$${loc2}; \ cp -R $${htmldir}/. $@/$${loc2}/.; \ $(MKDIR_P) $@/$${loc2}/figs; \ chmod 0755 $@/$${loc2}/figs; \ for f in $(PNGIMAGES); do \ test -f $(srcdir)/$$f && f=$(srcdir)/$$f; \ cp $$f $@/$${loc2}/figs/; \ done; \ done; \ chmod 0755 $@; \ find $@ -type f -exec chmod 644 \{\} \; install-data-local: htdocs $(MKDIR_P) $(DESTDIR)$(dochtmldir) cp -pR htdocs/. $(DESTDIR)$(dochtmldir)/. chmod 0755 $(DESTDIR)$(dochtmldir) find $(DESTDIR)$(dochtmldir) -type d -exec chmod 0755 \{\} \; find $(DESTDIR)$(dochtmldir) -type f -exec chmod 644 \{\} \; uninstall-local: rm -rf $(DESTDIR)$(dochtmldir) .ps.eps: @D=`dirname $@`; $(MKDIR_P) $$D $(PS2EPSI) $< $@ .eps.pdf: @D=`dirname $@`; $(MKDIR_P) $$D $(EPSTOPDF) $< .pdf.png: $(MKDIR_P) figs $(PDFIMAGESPROG) $< $(<:.pdf=) $(PNMTOPNG) $(<:.pdf=-000.ppm) > $@ -rm -f $(<:.pdf=-000.ppm) # Anoyingly, automake includes XXX~ files into the distro, caused by a # somewhat broken dist-info: target. dist-hook: html pdf rm -rf `find $(distdir) -name '*~'` MAINTAINERCLEANFILES = \ $(PNGIMAGES) $(PDFIMAGES) $(EPSIMAGES) geomview.pdf geomview-pt_BR.pdf distclean-local: -rm -rf htdocs maintainerclean-local: -for loc in $(LANGUAGES); do rm -rf geomview$${loc}.html; done # # override to disable deletion of .pdf, .html by the user. # mostlyclean-aminfo: -for loc in $(LANGUAGES); do \ rm -rf \ geomview$${loc}.aux geomview$${loc}.cp geomview$${loc}.cps \ geomview$${loc}.fn geomview$${loc}.fns geomview$${loc}.ky \ geomview$${loc}.kys geomview$${loc}.log geomview$${loc}.pg \ geomview$${loc}.pgs geomview$${loc}.tmp geomview$${loc}.toc \ geomview$${loc}.tp geomview$${loc}.tps geomview$${loc}.vr \ geomview$${loc}.vrs geomview$${loc}.dvi geomview$${loc}.ps ; \ done geomview-1.9.4/doc/Makefile.in0000644000175000001440000007320610665240474013116 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = doc DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/stamp-1 $(srcdir)/stamp-vti \ $(srcdir)/version-pt_BR.texi $(srcdir)/version.texi mdate-sh \ texinfo.tex ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = INFO_DEPS = $(srcdir)/geomview $(srcdir)/geomview-pt_BR am__TEXINFO_TEX_DIR = $(srcdir) DVIS = geomview.dvi geomview-pt_BR.dvi PDFS = geomview.pdf geomview-pt_BR.pdf PSS = geomview.ps geomview-pt_BR.ps HTMLS = geomview.html geomview-pt_BR.html TEXINFOS = geomview.texi geomview-pt_BR.texi TEXI2DVI = texi2dvi TEXI2PDF = $(TEXI2DVI) --pdf --batch MAKEINFOHTML = $(MAKEINFO) --html AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) DVIPS = dvips am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man3dir)" \ "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(docdir)" \ "$(DESTDIR)$(infoimgdir)" am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; man3dir = $(mandir)/man3 man5dir = $(mandir)/man5 NROFF = nroff MANS = $(man_MANS) docDATA_INSTALL = $(INSTALL_DATA) nobase_infoimgDATA_INSTALL = $(install_sh_DATA) DATA = $(doc_DATA) $(nobase_infoimg_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ PSIMAGES = figs/ap.ps figs/command.ps figs/light.ps figs/mat.ps\ figs/secondlinelist.ps figs/cam.ps figs/fig2.ps figs/load.ps\ figs/myfilelist.ps figs/tools.ps figs/color.ps figs/initial.ps\ figs/main.ps figs/save.ps figs/trefdodecinter.ps EPSIMAGES = $(PSIMAGES:.ps=.eps) PDFIMAGES = $(PSIMAGES:.ps=.pdf) PNGIMAGES = $(PSIMAGES:.ps=.png) LANGUAGES = "" "-pt_BR" man_MANS = geomview.5gv lisp.3gv oogl.5gv EXTRA_DIST = geomview.pdf geomview.html\ geomview-pt_BR.pdf geomview-pt_BR.html\ README README.gvplot oogltour oogltour-pt_BR\ example1.c example2.c example3.c example4.tcl\ OOGL.m.txt motion.tex $(man_MANS)\ $(PSIMAGES) $(PNGIMAGES) $(PDFIMAGES) $(EPSIMAGES) AM_MAKEINFOFLAGS = --no-validate info_TEXINFOS = geomview.texi geomview-pt_BR.texi infoimgdir = $(infodir) nobase_infoimg_DATA = $(PNGIMAGES) geomview_pt_BR_texi_MAKEINFOFLAGS = --enable-encoding --lang=pt dochtmldir = $(docdir)/html doc_DATA = geomview.pdf geomview-pt_BR.pdf TEXINPUTS = $(srcdir):.: MAINTAINERCLEANFILES = \ $(PNGIMAGES) $(PDFIMAGES) $(EPSIMAGES) geomview.pdf geomview-pt_BR.pdf all: all-am .SUFFIXES: .SUFFIXES: .dvi .eps .html .pdf .png .ps .texi $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs $(srcdir)/geomview: geomview.texi $(srcdir)/version.texi restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && cd $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ done; \ else :; fi && \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $(srcdir)/geomview.texi; \ then \ rc=0; \ cd $(srcdir); \ else \ rc=$$?; \ cd $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc .texi.dvi: TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2DVI) $< .texi.pdf: TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2PDF) $< .texi.html: rm -rf $(@:.html=.htp) if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $(@:.html=.htp) $<; \ then \ rm -rf $@; \ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ else \ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ exit 1; \ fi $(srcdir)/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-vti $(srcdir)/stamp-vti: geomview.texi $(top_srcdir)/configure @(dir=.; test -f ./geomview.texi || dir=$(srcdir); \ set `$(SHELL) $(srcdir)/mdate-sh $$dir/geomview.texi`; \ echo "@set UPDATED $$1 $$2 $$3"; \ echo "@set UPDATED-MONTH $$2 $$3"; \ echo "@set EDITION $(VERSION)"; \ echo "@set VERSION $(VERSION)") > vti.tmp @cmp -s vti.tmp $(srcdir)/version.texi \ || (echo "Updating $(srcdir)/version.texi"; \ cp vti.tmp $(srcdir)/version.texi) -@rm -f vti.tmp @cp $(srcdir)/version.texi $@ mostlyclean-vti: -rm -f vti.tmp maintainer-clean-vti: @MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi $(srcdir)/geomview-pt_BR: geomview-pt_BR.texi $(srcdir)/version-pt_BR.texi restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && cd $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ done; \ else :; fi && \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $(srcdir)/geomview-pt_BR.texi; \ then \ rc=0; \ cd $(srcdir); \ else \ rc=$$?; \ cd $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc $(srcdir)/version-pt_BR.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-1 $(srcdir)/stamp-1: geomview-pt_BR.texi $(top_srcdir)/configure @(dir=.; test -f ./geomview-pt_BR.texi || dir=$(srcdir); \ set `$(SHELL) $(srcdir)/mdate-sh $$dir/geomview-pt_BR.texi`; \ echo "@set UPDATED $$1 $$2 $$3"; \ echo "@set UPDATED-MONTH $$2 $$3"; \ echo "@set EDITION $(VERSION)"; \ echo "@set VERSION $(VERSION)") > 1.tmp @cmp -s 1.tmp $(srcdir)/version-pt_BR.texi \ || (echo "Updating $(srcdir)/version-pt_BR.texi"; \ cp 1.tmp $(srcdir)/version-pt_BR.texi) -@rm -f 1.tmp @cp $(srcdir)/version-pt_BR.texi $@ mostlyclean-1: -rm -f 1.tmp maintainer-clean-1: @MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-1 $(srcdir)/version-pt_BR.texi .dvi.ps: TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ $(DVIPS) -o $@ $< uninstall-dvi-am: @$(NORMAL_UNINSTALL) @list='$(DVIS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ rm -f "$(DESTDIR)$(dvidir)/$$f"; \ done uninstall-html-am: @$(NORMAL_UNINSTALL) @list='$(HTMLS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ done uninstall-info-am: @$(PRE_UNINSTALL) @if test -d '$(DESTDIR)$(infodir)' && \ (install-info --version && \ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ done; \ else :; fi @$(NORMAL_UNINSTALL) @list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ else :; fi); \ done uninstall-pdf-am: @$(NORMAL_UNINSTALL) @list='$(PDFS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ done uninstall-ps-am: @$(NORMAL_UNINSTALL) @list='$(PSS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ rm -f "$(DESTDIR)$(psdir)/$$f"; \ done dist-info: $(INFO_DEPS) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; \ for base in $$list; do \ case $$base in \ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$base; then d=.; else d=$(srcdir); fi; \ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ if test -f $$file; then \ relfile=`expr "$$file" : "$$d/\(.*\)"`; \ test -f $(distdir)/$$relfile || \ cp -p $$file $(distdir)/$$relfile; \ else :; fi; \ done; \ done maintainer-clean-aminfo: @list='$(INFO_DEPS)'; for i in $$list; do \ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ done install-man3: $(man3_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.3*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 3*) ;; \ *) ext='3' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \ done uninstall-man3: @$(NORMAL_UNINSTALL) @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.3*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 3*) ;; \ *) ext='3' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man3dir)/$$inst"; \ done install-man5: $(man5_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)" @list='$(man5_MANS) $(dist_man5_MANS) $(nodist_man5_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.5*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 5*) ;; \ *) ext='5' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst"; \ done uninstall-man5: @$(NORMAL_UNINSTALL) @list='$(man5_MANS) $(dist_man5_MANS) $(nodist_man5_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.5*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 5*) ;; \ *) ext='5' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man5dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man5dir)/$$inst"; \ done install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) test -z "$(docdir)" || $(MKDIR_P) "$(DESTDIR)$(docdir)" @list='$(doc_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(docDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(docdir)/$$f'"; \ $(docDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(docdir)/$$f"; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(docdir)/$$f'"; \ rm -f "$(DESTDIR)$(docdir)/$$f"; \ done install-nobase_infoimgDATA: $(nobase_infoimg_DATA) @$(NORMAL_INSTALL) test -z "$(infoimgdir)" || $(MKDIR_P) "$(DESTDIR)$(infoimgdir)" @$(am__vpath_adj_setup) \ list='$(nobase_infoimg_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__vpath_adj) \ echo " $(nobase_infoimgDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(infoimgdir)/$$f'"; \ $(nobase_infoimgDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(infoimgdir)/$$f"; \ done uninstall-nobase_infoimgDATA: @$(NORMAL_UNINSTALL) @$(am__vpath_adj_setup) \ list='$(nobase_infoimg_DATA)'; for p in $$list; do \ $(am__vpath_adj) \ echo " rm -f '$(DESTDIR)$(infoimgdir)/$$f'"; \ rm -f "$(DESTDIR)$(infoimgdir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-info dist-hook check-am: all-am check: check-am all-am: Makefile $(INFO_DEPS) $(MANS) $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(infoimgdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: $(DVIS) html: html-am html-am: $(HTMLS) info: info-am info-am: $(INFO_DEPS) install-data-am: install-data-local install-docDATA install-info-am \ install-man install-nobase_infoimgDATA install-dvi: install-dvi-am install-dvi-am: $(DVIS) @$(NORMAL_INSTALL) test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)" @list='$(DVIS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(dvidir)/$$f'"; \ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(dvidir)/$$f"; \ done install-exec-am: install-html: install-html-am install-html-am: $(HTMLS) @$(NORMAL_INSTALL) test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)" @list='$(HTMLS)'; for p in $$list; do \ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ if test -d "$$d$$p"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \ else \ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \ fi; \ done install-info: install-info-am install-info-am: $(INFO_DEPS) @$(NORMAL_INSTALL) test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)" @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; \ for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ if test -f $$ifile; then \ relfile=`echo "$$ifile" | sed 's|^.*/||'`; \ echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \ $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \ else : ; fi; \ done; \ done @$(POST_INSTALL) @if (install-info --version && \ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ done; \ else : ; fi install-man: install-man3 install-man5 install-pdf: install-pdf-am install-pdf-am: $(PDFS) @$(NORMAL_INSTALL) test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)" @list='$(PDFS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pdfdir)/$$f'"; \ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pdfdir)/$$f"; \ done install-ps: install-ps-am install-ps-am: $(PSS) @$(NORMAL_INSTALL) test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)" @list='$(PSS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(psdir)/$$f'"; \ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(psdir)/$$f"; \ done installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-1 \ maintainer-clean-aminfo maintainer-clean-generic \ maintainer-clean-vti mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-1 mostlyclean-aminfo mostlyclean-generic \ mostlyclean-libtool mostlyclean-vti pdf: pdf-am pdf-am: $(PDFS) ps: ps-am ps-am: $(PSS) uninstall-am: uninstall-docDATA uninstall-dvi-am uninstall-html-am \ uninstall-info-am uninstall-local uninstall-man \ uninstall-nobase_infoimgDATA uninstall-pdf-am uninstall-ps-am uninstall-man: uninstall-man3 uninstall-man5 .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool dist-hook dist-info distclean distclean-generic \ distclean-libtool distclean-local distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-docDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man3 install-man5 install-nobase_infoimgDATA \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-1 maintainer-clean-aminfo \ maintainer-clean-generic maintainer-clean-vti mostlyclean \ mostlyclean-1 mostlyclean-aminfo mostlyclean-generic \ mostlyclean-libtool mostlyclean-vti pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-docDATA uninstall-dvi-am \ uninstall-html-am uninstall-info-am uninstall-local \ uninstall-man uninstall-man3 uninstall-man5 \ uninstall-nobase_infoimgDATA uninstall-pdf-am uninstall-ps-am geomview.pdf: $(PDFIMAGES) geomview.ps: $(EPSIMAGES) geomview.dvi: $(EPSIMAGES) geomview.html: $(PNGIMAGES) geomview-pt_BR.pdf: $(PDFIMAGES) geomview-pt_BR.ps: $(EPSIMAGES) geomview-pt_BR.dvi: $(EPSIMAGES) geomview-pt_BR.html: $(PNGIMAGES) all-local: htdocs pdf htdocs/*.html htdocs/figs/*.png: htdocs htdocs: geomview.html geomview-pt_BR.html if test -d $@; then rm -rf $@; fi for loc in $(LANGUAGES); do \ if test -d $(srcdir)/geomview$${loc}.html; then \ htmldir=$(srcdir)/geomview$${loc}.html; \ else \ htmldir=geomview$${loc}.html; \ fi; \ loc2=`echo $${loc}|$(SED) -e 's/-//g'`; \ $(MKDIR_P) $@/$${loc2}; \ cp -R $${htmldir}/. $@/$${loc2}/.; \ $(MKDIR_P) $@/$${loc2}/figs; \ chmod 0755 $@/$${loc2}/figs; \ for f in $(PNGIMAGES); do \ test -f $(srcdir)/$$f && f=$(srcdir)/$$f; \ cp $$f $@/$${loc2}/figs/; \ done; \ done; \ chmod 0755 $@; \ find $@ -type f -exec chmod 644 \{\} \; install-data-local: htdocs $(MKDIR_P) $(DESTDIR)$(dochtmldir) cp -pR htdocs/. $(DESTDIR)$(dochtmldir)/. chmod 0755 $(DESTDIR)$(dochtmldir) find $(DESTDIR)$(dochtmldir) -type d -exec chmod 0755 \{\} \; find $(DESTDIR)$(dochtmldir) -type f -exec chmod 644 \{\} \; uninstall-local: rm -rf $(DESTDIR)$(dochtmldir) .ps.eps: @D=`dirname $@`; $(MKDIR_P) $$D $(PS2EPSI) $< $@ .eps.pdf: @D=`dirname $@`; $(MKDIR_P) $$D $(EPSTOPDF) $< .pdf.png: $(MKDIR_P) figs $(PDFIMAGESPROG) $< $(<:.pdf=) $(PNMTOPNG) $(<:.pdf=-000.ppm) > $@ -rm -f $(<:.pdf=-000.ppm) # Anoyingly, automake includes XXX~ files into the distro, caused by a # somewhat broken dist-info: target. dist-hook: html pdf rm -rf `find $(distdir) -name '*~'` distclean-local: -rm -rf htdocs maintainerclean-local: -for loc in $(LANGUAGES); do rm -rf geomview$${loc}.html; done # # override to disable deletion of .pdf, .html by the user. # mostlyclean-aminfo: -for loc in $(LANGUAGES); do \ rm -rf \ geomview$${loc}.aux geomview$${loc}.cp geomview$${loc}.cps \ geomview$${loc}.fn geomview$${loc}.fns geomview$${loc}.ky \ geomview$${loc}.kys geomview$${loc}.log geomview$${loc}.pg \ geomview$${loc}.pgs geomview$${loc}.tmp geomview$${loc}.toc \ geomview$${loc}.tp geomview$${loc}.tps geomview$${loc}.vr \ geomview$${loc}.vrs geomview$${loc}.dvi geomview$${loc}.ps ; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/doc/geomview-10000644000175000001440000111213610663305733012747 00000000000000This is ../../doc/geomview, produced by makeinfo version 4.8 from ../../doc/geomview.texi. INFO-DIR-SECTION Graphics Applications START-INFO-DIR-ENTRY * Geomview: (geomview). The interactive 3D viewing program. END-INFO-DIR-ENTRY  File: geomview, Node: Top, Next: Intro, Prev: (dir), Up: (dir) Geomview, the interactive 3D viewing program. * Menu: * Intro:: Introduction to Geomview. * Distrib:: How to get the latest Geomview distribution. * Copying:: The GNU Lesser Public License. * History:: History of Geomview's Development. * Platforms:: Supported Platforms. * Pronunciation:: How to Pronounce ``Geomview''. * Overview:: Overview of Geomview. * Tutorial:: Introductory Tutorial. * Interaction:: Interacting with Geomview. * OOGL File Formats:: Formats for Geometry Input. * Customization:: Modifying the behavior of Geomview. * Modules:: Programs that use Geomview for graphics display. * GCL:: GCL: the Geomview Command Language. * Non-Euclidean Geometry:: Non-Euclidean Geometry. * Mathematica:: Mathematica Graphics in Geomview or RenderMan. * Installation:: Installing Geomview on your computer. * Support:: Getting Technical Support for Geomview. * Contributing:: How to contribute to Geomview. * Function Index:: A node for each GCL function. * List of Figures:: List of Figures.  File: geomview, Node: Intro, Next: Distrib, Prev: Top, Up: Top Introduction to Geomview ************************ Geomview is an interactive program for viewing and manipulating geometric objects, originally written by staff members of the Geometry Center at the University of Minnesota, starting in 1991. It can be used as a stand-alone viewer for static objects or as a display engine for other programs which produce dynamically changing geometry. It runs on many kinds of Unix computers, including Linux, SGI, Sun, and HP. It also runs with Cygwin. This manual describes Geomview version 1.9. Geomview is free software, available under the terms of the GNU Lesser Public License; *note Copying:: for details. Geomview and this manual are available for download from `http://www.geomview.org'. Permission is granted to make copies of this manual. If you have questions or comments about Geomview or this manual, consider joining in the `geomview-users' mailing list, which is a forum in which users of Geomview communicate to answer each others' questions and to share news about what they are doing with Geomview. The Geomview authors participate in this list and sometimes post answers to questions there. To join the list, visit the list web page at `http://lists.sourceforge.net/mailman/listinfo/geomview-users'.  File: geomview, Node: Distrib, Next: Copying, Prev: Intro, Up: Top Distribution ************ Geomview is "free software"; this means that everyone is free to use it and free to redistribute it on certain conditions. Geomview is not in the public domain; it is copyrighted and there are restrictions on its distribution, but these restrictions are designed to permit everything that a good cooperating citizen would want to do. What is not allowed is to try to prevent others from further sharing any version of Geomview that they might get from you. The precise conditions are found in the GNU Lesser Public License that comes with Geomview and also appears following this section. One way to get a copy of Geomview is from someone else who has it. You need not ask for our permission to do so, or tell any one else; just copy it. If you have access to the Internet, you can get the latest distribution version of Geomview at `http://www.geomview.org'. You may also receive Geomview when you buy a computer. Computer manufacturers are free to distribute copies on the same terms that apply to everyone else. These terms require them to give you the full sources, including whatever changes they may have made, and to permit you to redistribute the Geomview received from them under the usual terms of the General Public License. In other words, the program must be free for you when you get it, not just free for the manufacturer.  File: geomview, Node: Copying, Next: History, Prev: Distrib, Up: Top Copying ******* NOTE: Geomview is distributed under the GNU LESSER GENERAL PUBLIC LICENSE. For the purposes of this license we think of Geomview as if it were a "library", and of Geomview external modules as "programs that link with the library". We do this because we specifically want to allow proprietary programs and modules to use Geomview. GNU LESSER PUBLIC LICENSE ************************* Version 2.1, February 1999 Copyright (C) 1991, 1999 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. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble ======== The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software-to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages-typically libraries-of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION =============================================================== 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a. The modified work must itself be a software library. b. You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c. You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d. If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. ^L Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a. Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b. Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c. Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d. If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e. Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a. Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b. Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY =========== 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS =========================== How to Apply These Terms to Your New Programs ============================================= If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ONE LINE TO GIVE THE LIBRARY'S NAME AND A BRIEF IDEA OF WHAT IT DOES. Copyright (C) NAME OF AUTHOR This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it!  File: geomview, Node: History, Next: Platforms, Prev: Copying, Up: Top History of Geomview's Development ********************************* Geomview was originally written at the Geometry Center at the University of Minnesota in Minneapolis. The Geometry Center was a research and education center funded by the National Science Foundation, with a mission to promote research and communication of mathematics. Much of the work there involved the use of computers to help visualize mathematical concepts. The project that eventually led to Geomview began in the summer of 1988 with the work of Pat Hanrahan on a viewing program called MinneView. Shortly thereafter Charlie Gunn begin developing OOGL (Object Oriented Graphics Language) in conjunction with MinneView. Many people contributed to OOGL and MinneView, including Stuart Levy, Mark Meuer, Tamara Munzner, Steve Anderson, Mario Lopez, Todd Kaplan. In 1991 the staff of the Geometry Center began work on a new improved version of OOGL, and a new and improved viewing program, which they called Geomview. At that time essentially the only game in town for interactive 3D graphics was Silicon Graphics (SGI), so Geomview was developed initially on SGI workstations, using IRIS GL. The first version was finished in January of 1992. It immediately became very popular among visitors to the Geometry Center, and through the Center's ftp archive (this was before the web) people at other institutions began using it too. In addition to SGI workstations the Geometry Center had quite a few NeXT stations, so soon after Geomview was running on SGIs the staff developed a version for NeXTStep as well. By this time there were several thousand people using it around the world. A few years later the staff ported Geomview to X windows and OpenGL, and eventually, with the demise of NeXT, the NeXT version fell by the wayside. In its mission to foster communication among researchers and educators, the Geometry Center developed a web site, www.geom.umn.edu, in late 1993. It was one of the first 300 web sites in existence. A part of the web site was of course devoted to Geomview, and helped to spread the word about its existence. The Geometry Center closed its "brick and mortar" facilities in August of 1998 (NSF cut its funding), but the web site continued to exist, and Geomview continued to be very popular around the world. In December of 1999 some of the former Geometry Center staff set up `http://www.geomview.org' as a permanent home on the web for Geomview. Geomview's original authors, as well as a number of other volunteers around the world, are still actively involved in using and developing Geomview. * Menu: * Authors:: Authors.  File: geomview, Node: Authors, Prev: History, Up: History Authors ======= Tamara Munzner, Stuart Levy, and Mark Phillips are the original authors of Geomview. Celeste Fowler, Charlie Gunn, and Nathaniel Thurston also made significant contributions. Daniel Krech and Scott Wisdom did the NeXTStep and RenderMan port, and Daeron Meyer and Tim Rowley did the port to X windows. Many other Geometry Center staff members, as well as several people elsewhere, also contributed. Mark Phillips wrote this manual, with substantial help from Stuart Levy and Tamara Munzner. Countless Geomview users have also been of great help by reading it and pointing out mistakes.  File: geomview, Node: Platforms, Next: Pronunciation, Prev: History, Up: Top Supported Platforms ******************* Geomview 1.9 should - in principle - compile and run on any fairly recent Unix-like operating system. Specifically, it runs on Linux and on Cygwin (Cygwin emulates a SystemV Unix-like environment under Microsoft Windows). Unluckily Geomview compiles with MacOS X (Darwin), but seemingly communicating with Geomview by means of pipes and sockets cause segmentation faults. Feel free to fix that! *Note Contributing::, for details.  File: geomview, Node: Pronunciation, Next: Overview, Prev: Platforms, Up: Top How to Pronounce "Geomview" *************************** The word 'Geomview' is a combination of the first syllable of the word 'geometry', and the word 'view'. The authors pronounce it with the accent on the first syllable GE-om-view Some people put the accent on the second syllable, where it falls in the word 'geometry', but the original authors, who invented the name, prefer the accent-on-first-syllable pronunciation.  File: geomview, Node: Overview, Next: Tutorial, Prev: Pronunciation, Up: Top 1 Overview ********** Geomview's main purpose is to display objects whose geometry is given, allowing interactive control over details such as point of view, speed of movement, appearance of surfaces and lines, and so on. Geomview can handle any number of objects and allows both separate and collective control over them. The simplest way to use Geomview is as a stand-alone viewer to see and manipulate objects. It can display objects described in a variety of file formats. It comes with a wide variety of example objects, and you can create your own objects. You can also use Geomview to handle the display of data coming from another program that is running simultaneously. As the other program changes the data, the Geomview image reflects the changes. Programs that generate objects and use Geomview to display them are called _external modules_. External modules can control almost all aspects of Geomview. The idea here is that many aspects of the display and interaction parts of geometry software are independent of the geometric content and can be collected together in a single piece of software that can be used in a wide variety of situations. The author of the external module can then concentrate on implementing the desired algorithms and leave the display aspects to Geomview. Geomview comes with a collection of sample external modules, and this manual describes how to write your own. Geomview is the product of an effort at the Geometry Center to provide interactive geometry software that is particularly appropriate for mathematics research and education. In particular, Geomview can display things in hyperbolic and spherical space as well as Euclidean space. Geomview allows multiple independently controllable objects and cameras. It provides interactive control for motion, appearances (including lighting, shading, and materials), picking on an object, edge or vertex level, snapshots in SGI image file or Renderman RIB format, and adding or deleting objects is provided through direct mouse manipulation, control panels, and keyboard shortcuts. Geomview supports the following simple data types: polyhedra with shared vertices (.off), quadrilaterals, rectangular meshes, vectors, and Bezier surface patches of arbitrary degree including rational patches. Object hierarchies can be constructed with lists of objects and instances of object(s) transformed by one or many 4x4 matrices. Arbitrary portions of changing hierarchies may be transmitted by creating named references. Geomview can display 3-D graphics output from Mathematica and Maple.  File: geomview, Node: Tutorial, Next: Interaction, Prev: Overview, Up: Top 2 Tutorial ********** This chapter leads you through some of the basics of using Geomview. Work through this chapter in front of a computer where you can try out the examples given here to get a feel for what you can do with Geomview. To start Geomview, login to the computer and get a shell window. A shell window is a window in which you can type Unix commands; the prompt in the window usually ends with a '%'. In the shell window (the mouse cursor must be in the window) type the following (`' here means hit the "Enter" key): geomview tetra dodec This command starts up Geomview and loads two example objects, a tetrahedron and a dodecahedron. After a few seconds three windows should appear; *note Figure: figinitial. [image src="figs/initial.png"] Figure 2.1: Initial Geomview display. The panel on the left is Geomview's main control panel; it's called the _Main_ panel. The skinny panel in the middle is the _Tools_ panel and is for selecting different kinds of motions. The window on the right is the camera window and in it you see a large tetrahedron and a dodecahedron which is partially obscured by the tetrahedron. Geomview has lots of panels but by default it displays only these three. We'll describe some aspects of these and a couple of the others in this tutorial. You can read more about these and other panels in the later chapters of this manual. Put the mouse cursor in the camera window and press down and hold the left mouse button. Now, while holding down the button, slowly move the mouse around. You should see the picture rotate in the direction you move the mouse. If you lift up on the mouse button while moving the mouse, the picture continues rotating. To stop it, hold the mouse very still and click down and up on the left mouse button. Geomview uses the _glass sphere_ model for mouse-based motion. This means you are supposed to think of the object as being inside an invisible sphere and the mouse cursor is a gripper outside the sphere. When you hold down the left mouse button, the gripper grabs the sphere; when you let go of the button, the gripper releases the sphere. Moving the mouse while holding the button down causes the sphere (and hence the object) to move in the same direction as the mouse. In addition to the two solids you should also see two wire-frame boxes in the camera window. These are the "bounding boxes" of the two objects. By default Geomview puts a bounding box around each object that it displays so that you have an idea of how large it is. Notice that as you move the mouse around the tetrahedron and dodecahedron move as a unit. That is because by default what you are actually moving is the "World". To move an individual object instead of the whole world, move the mouse cursor to the _Targets_ browser in the _Main_ panel. Click (any button) on the word _tetra_. This makes the tetrahedron be the "target object". Now move the cursor back to the camera window and you can rotate just the tetrahedron. The motion that you have been applying up to now has been rotation, because that is the motion mode that is selected in the _Tools_ panel. To translate instead, click on the _Translate_ button. Now when you move the mouse in the camera window while holding down the left button, the tetrahedron (which should still be the target object from before) will translate in the direction you move the mouse. Notice that you can translate it beyond the edge of the window as long as you keep holding the left mouse button down. If you lift up on the mouse button while moving the mouse, the tetrahedron will keep going. It moves rather rapidly so it is very easy to lose track of where it is. If you accidentally lose the tetrahedron by translating it too far out of the view of the window, you can get it back by clicking on the _Center_ button in the _Tools_ panel. This causes it to come back to its initial position. Click on the _Center_ button to bring the tetrahedron home, and then translate it off to one side so that you can completely see the dodecahedron. Your world now has two objects in it that are beside each other. You should see the dodecahedron in the middle of the window and maybe part of the tetrahedron off to one side. Go back to the _Targets_ browser in the _Main_ panel and click on "World" to select the whole world again. Now click on the _Look At_ button in the _Tools_ panel. You should see the dodecahedron and the tetrahedron in the middle of the window next to each other (*note Figure: figlookatworld.). The _Look At_ button positions the camera in such a way that the target object is centered in the window. [image src="figs/fig2.png"] Figure 2.2: Looking at the world. Now put the cursor over the middle of the dodecahedron and double-click the right mouse button. This means click it down-and-up two times in rapid succession. Notice that the dodecahedron becomes the target object; you can see this in the _Targets_ browser in the _Main_ panel. Double-clicking the right mouse button on an object is another way to make it the target object. [image src="figs/ap.png"] Figure 2.3: The Appearance Panel. Go to the _Inspect_ menu at the top of the _Main_ panel and select _Appearance_. This brings up the _Appearance_ panel. When it appears, if it partially obscures another Geomview window you can move it off to one side by dragging its frame with the middle mouse button down. The _Appearance_ panel lets you control various things about the way Geomview draws objects. Note the buttons labeled _[af] Faces_ and _[ae] Edges_. Click on the _[ae] Edges_ one, and notice that Geomview is now drawing the edges of the dodecahedron. Click on it again and the edges go away. Click several times and watch the edges come and go. When you've had enough of this, leave the edges on and click the _[af] Faces_ button. This toggles the faces on and off. Click the button again to turn them back on. Now click on the _[Cf] Faces_ button under the word _COLOR_. A color chooser panel should appear (*note Figure: figcolorchooser.). [image src="figs/color.png"] Figure 2.4: Color Chooser Panel. Note the three sliders, _H_, _S_, and _V_, controlling the color's hue, saturation, and value (lightness). Clicking the _HSV_ button gives a different set of sliders, one each for red, green, and blue. Numerical values for both RGB and HSV color systems can be seen or edited at the bottom of the panel. The dodecahedron's previous colors were specified in the file `dodec' that you loaded when we started Geomview. The color that you specify with the color panel overrides the old colors. You can adjust the intensity of the color with the _Intensity_ slider. When you find a color that you like, click the _Done_ button. Now put the cursor somewhere over the gray background and double-click the right mouse button; this picks "World" as the target object. Click the _Look At_ button to look at the world again. Notice that in the _Appearance_ panel the settings of the buttons have changed from the way you left them with the dodecahedron. That's because the _Appearance_ panel always displays the settings for the target object, which is now the world, which still has its default settings. Click on the _[ab] BBox_ button under the word _Draw_. The bounding boxes go away. Now put the cursor back in the camera window. At the keyboard, type the keys `a 'b. Notice that the bounding boxes come back. `a 'b is the keyboard shortcut for the bounding box toggle button; the string "[ab]" appears on the button to indicate this. Most of Geomview's buttons have keyboard shortcuts that you can use instead if you want. This is useful once you are familiar with Geomview and don't want to have to move around among lots of panels. Now select the tetrahedron, either by double-clicking the right mouse button on it, or by selecting "tetra" in the _Targets_ browser. Then click on the _Delete_ button in the _Main_ panel. The tetrahedron should disappear. This is how you get rid of an object. You can also load objects from within Geomview. Click on the _File_ menu in the _Main_ panel and choose _Open_. The _Files_ panel will appear. Below the middle of this panel is a browser with three lines in it; the second line is a directory with lots of Geomview example files in it. Click on that second line; *note Figure: figfilespanel. Scroll down in the list of files until you see `tref.off'. Click on that line, and then click on the _OK_ button. A large trefoil-shaped tube will appear in your window. Click the _Hide_ button in the _Files_ panel to dismiss the panel. [image src="figs/secondlinelist.png"] Figure 2.5: The Files Panel. Now click on the _Reset_ button in the _Tools_ panel. This causes everything to return to its home position. You should see a dodecahedron and a trefoil knot (*note Figure: figtrefdodec.). Play around with the trefoil knot and the dodecahedron. Experiment with some of the other buttons in the _Tools_ panel. Try coloring the trefoil knot with the _Appearance_ panel. For a tutorial on how to create your own objects to load into Geomview, see file `doc/oogltour' distributed with Geomview. The things in that file will be incorporated into a future version of this manual. [image src="figs/trefdodecinter.png"] Figure 2.6: Trefoil and Dodecahedron.  File: geomview, Node: Interaction, Next: OOGL File Formats, Prev: Tutorial, Up: Top 3 Interaction ************* This chapter describes how you interact with Geomview through the mouse and keyboard. * Menu: * Starting Geomview:: Starting Geomview. * Command Line Options:: Command Line Options. * Basic Interaction:: Basic Interaction: The Main Panel. * Loading:: Loading Objects Into Geomview. * Mouse Motions:: Using the Mouse to Manipulate Objects. * Appearance:: Changing the Way Things Look. * Cameras:: Cameras. * Saving:: Saving your work. * Commands:: The Commands Panel. * Keyboard Shortcuts:: Keyboard Shortcuts.  File: geomview, Node: Starting Geomview, Next: Command Line Options, Prev: Interaction, Up: Interaction 3.1 Starting Geomview ===================== The usual way to start Geomview is to type `geomview ' in a shell window ( means hit the "Enter" key). It may take Geomview a few seconds to start up; one or more windows will appear and you can begin interacting with Geomview immediately. It is also possible to specify actions for Geomview to perform at startup time by giving arguments in the shell command line. *Note Command Line Options::.  File: geomview, Node: Command Line Options, Next: Basic Interaction, Prev: Starting Geomview, Up: Interaction 3.2 Command Line Options ======================== Here are the command line options that Geomview allows: `-b R G b' Set the window background color to the given R G b values. `-c FILE' Interpret the GCL commands in FILE, which may be the special symbol `-' for standard input. For a description of GCL, *Note GCL::. `-c COMMAND' Commands may also be supplied literally, as in -c "(ui-panel main off)" Since COMMAND includes parentheses, which have special meaning to the shell, COMMAND must be quoted. Multiple -C options are allowed. `-wins NWINS' Causes Geomview to initially display NWINS camera windows. `-wpos WIDTH,HEIGHT[@XMIN,YMIN]' Specifies the initial location and size of the first camera window. The values for WIDTH, HEIGHT, XMIN, and YMIN are in screen (pixel) coordinates. `-M[cg][ps[un|in|in6]] PIPENAME|TCPPORT' The `-M' option accepts modifiers: a `g' suffix expects geometry data (the default), while a `c' suffix expects GCL commands. A `p' implies the connection should use a named pipe (the default on everything except on the NeXT), while `s' implies using a UNIX-domain socket (the default on the NeXT). Since version 1.9 of Geomview Internet domain sockets are also supported; use `sin' to make Geomview listen on the IPv4 port given by TCPPORT, or use `sin6' to make Geomview listen on an IPv6 port (also as specified by TCPPORT). `sun' is a synonym for `s', i.e. use the Unix domain socket with the name PIPENAME. If PIPENAME starts with a slash ('/'), then it is assumed to be an absolute pathname, otherwise the named pipe or socket is created below `${TMPDIR}/geomview/'. Listening to command streams on TCP ports can be a security risk, as Geomview itself does not take any security precautions, it simply executes all commands fed to it through the network socket. This also implies that disk-io can be initiated remotely. Examples: `-M OBJECTNAME' Display (possibly dynamically changing) geometry sent from the programs `geomstuff' or `togeomview'. This actually listens to the named pipe `/tmp/geomview/objectname'; you can achieve the same effect with the shell commands: mkdir /tmp/geomview mknod /tmp/geomview/objectname p (assuming the directory and named pipe don't already exist), then executing the GCL command: (geometry objectname < /tmp/geomview/objectname) (*note `(geometry ...)': geometry.) `-Mc PIPENAME' Like `-M' above, but expects GCL commands, rather than OOGL geometry data, on the connection. `-Mcs fred' Read commands from the UNIX-domain socket named. `/tmp/geomview/fred' `-Mcsin 40000' Read commands from the IPv4 port `40000'. Geomview itself does not take any security precautions, so this can be a security risk. `-noopengl' Disable the use of OpenGL for (possibly) hardware accelerated rendering, even if the Geomview binary has support for OpenGL compiled in. This also disables the support for transparency and textures in the camera windows. RenderMan snapshots still will have correct transparency and some limited texture support. `-nopanels' Start up displaying no panels, only graphics windows. Panels may be invoked later as usual with the `Px' keyboard shortcuts or with the `ui-panel' command. *Note `(ui-panel ...)': ui-panel. `-noinit' Read no initialization files. By default, geomview reads the system-wide `.geomview' file, followed by those in `${HOME}/.geomview' and `./.geomview'. `-e MODULE' Start an external module; MODULE is the name associated with the module, appearing in the main panel's Applications browser, as defined by the `emodule-define' command. *Note `(emodule-define ...)': emodule-define. `-start MODULE ARGS ...' Like -e but allows you to pass arguments to the external module. "-" signals the end of the argument list; the "-" may be omitted if it would be the last argument on the Geomview command line. `-run SHELL-COMMAND ARGS ...' Like -start but takes the pathname of executable of the external module instead of the module's name. The pathnames of all known module directories are appended to the UNIX search path when invoking SHELL-COMMAND.  File: geomview, Node: Basic Interaction, Next: Loading, Prev: Command Line Options, Up: Interaction 3.3 Basic Interaction: The Main Panel ===================================== Normally when you invoke Geomview, three windows appear: the _Main_ panel, the _Tools_ panel, and one camera window. Geomview has many other windows but most things can be done with these three and so by default the others do not appear. This section of the manual introduces some basic concepts that are used throughout the rest of the manual and describes the _Main_ panel. [image src="figs/main.png"] Figure 3.1: The Main Panel Geomview can display an arbitrary number of objects simultaneously. The _Targets_ browser in the _Main_ panel displays a list of all the objects that Geomview currently knows about. This browser has a line for each object that you have loaded, plus some lines for other objects. One of the other objects is called `World' and corresponds to the all the currently loaded objects, treated as if they were one object. Most of the operations that you can do to one object, such as applying a motion or changing a color, can also be done to the "World" object. The _Targets_ browser also has an entry for each camera. By default there is only one camera; it is possible to add more of them via the _New Camera_ entry of the _Main_ panel's _File_ menu. Geomview treats cameras in much the same way as it does geometric objects. For example, you can move cameras around and add them and delete them just as with geometric objects. Cameras do not usually show up in the display as an object that you see. Each camera has a separate camera window which displays the view as seen by that camera. (It is possible for each camera to display a geometric representation of other cameras. *Note Cameras::.) Because Geomview treats cameras and geometric objects very similarly, the term "object" in this documentation is used to refer to either one. When we need to distinguish between the two kinds of objects, we use the term "geom" to denote a geometric object and the word "camera" to denote a camera. The object which is selected (highlighted) in the _Targets_ browser is called the "target" object. This is the object that receives any actions that you do with the mouse or keyboard. You can change the target object by selecting a different line in the _Targets_ browser. Another way to change the target object is to put the mouse cursor directly over a geometry in a camera window and rapidly double-click the right mouse button. This process is called "picking"; the picked object becomes the new target. Geomview objects are all known by two names, both of which are shown in the _Targets_ browser. The first name given there, which appears in square brackets ([ ]), is a short name assigned by Geomview when you load the object. It consists of the letter `g' for geometries and `c' for cameras, followed by a number. The second name is a longer more descriptive name; by default this is the name of the file that the object was loaded from. The two names are equivalent as far as Geomview is concerned; at any point where you need to specify a name you can give either one. To manipulate an object, make sure you that the object you want to move is the target object, and put the mouse cursor in a camera window. Motions are applied by holding down either the left or middle mouse button and moving the mouse. There are several different motion "modes", each for applying a different kind of motion. The _MOTION MODE_ browser in the _Main_ panel indicates the current motion mode. The default is "Rotate". You can change the current motion mode by selecting a new one in the _MOTION MODE_ browser, or by using the _Tools_ panel. For more information about motion modes, *Note Mouse Motions::. The _Modules_ browser lists Geomview external modules. An external module is a separate program that interacts with Geomview to extend its functionality. For information on external modules, *Note Modules::. The menu bar at the top of the main panel offers menus for common operations. To create new windows, load new objects, save objects or other information, or quit from geomview, see the _File_ menu. To copy or delete objects, see the _Edit_ menu. You can invoke any panel from the _Inspect_ menu. The _Space_ menu lets you choose whether geomview operates in Euclidean, Hyperbolic, or Spherical mode. Euclidean mode is selected by default. For details about using _Hyperbolic_ and _Spherical_ spaces, *Note Non-Euclidean Geometry::. Most actions that you can do through Geomview's panels have equivalent keyboard shortcuts so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts are usually indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the keyboard shortcut for _Rotate_ mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the _MOTION MODE_ browser. To use this keyboard shortcut, just hit the `r' key while the mouse cursor is in any Geomview window. Do not hit the `' key afterwards. Some keyboard shortcuts consist of more than one key. In these cases just type the keys one after the other, with no `' afterwards. Keyboard shortcuts are case sensitive. Many keyboard shortcuts can be preceded by a numeric parameter. For example, typing `ae' toggles the state of drawing edges, while `1ae' always enables edge drawing. The _keyboard_ field in the upper left corner of the _Main_ panel echos the current state of keyboard shortcuts. For a list of all keyboard shortcuts, press the _`?'_ key.  File: geomview, Node: Loading, Next: Mouse Motions, Prev: Basic Interaction, Up: Interaction 3.4 Loading Objects Into Geomview ================================= There are several ways to load an object into Geomview. the _Files_ panel If you click the _Load_ button in Geomview's _Main_ panel, the _Files_ panel will appear. [image src="figs/myfilelist.png"] Figure 3.2: The Files Panel. This panel lets you select a file from a variety of directories. The top of the panel is a standard Motif file browser. Below this is a list of directories on Geomview's standard search path; click on one of these to browse files in that directory. To select a file, double-click on its name in the browser at upper right, or click on its name and press the key, or type the file's name into the text box at the bottom of the browser and press . If the selected file contains OOGL geometric data, it will be added to the geomview _Targets_ browser. If it contains GCL commands instead, the file will be interpreted. *Note GCL::. When the _Files_ panel first appears, the directory selected in the directory browser is the current directory -- the one from which you invoked Geomview. The file browser shows _all_ the files in this directory, including ones that are not Geomview files. If you try to load a file that doesn't contain either an OOGL object or Geomview commands, Geomview will print out an error message. The directory browser also lists a second and third directory in addition to the current directory. The second one, which ends in `data/geom', is the Geomview example data directory. This contains a wide variety of sample objects. It also contains several subdirectories. In particular, the `hyperbolic' and `spherical' subdirectories have sample hyperbolic and spherical objects, respectively. Directory entries in the browser look just like file entries; to view a subdirectory, click on it. The third directory shown in the directory browser, which ends in `geom', contains several subdirectories with other Geomview files in them. These are used less frequently than the ones in the `data/geom' directory. You can change the list of directories shown the _Files_ panel's directory browser by using the `set-load-path' command; *note `(set-load-path ...)': set-load-path. the `<' keyboard shortcut: If you type `<' in any Geomview window, the _Load_ panel will appear. This is a small version of the _Files_ panel; it contains a text field in which you can enter the name of a file to load (or a GCL command surrounded by parentheses). After typing the name of the file to load, type `'; Geomview will load the file as if you had loaded it with the _Add_ button in the _Files_ panel. If, after bringing up the small load panel with `<', you decide you want to use the larger _Files_ panel after all, press the _File Browser_ button. [image src="figs/load.png"] Figure 3.3: The Load Panel. geometry loading commands: The `load', `geometry', `new-geometry', and `read' GCL commands allow you to load an object into Geomview; *Note GCL::. *Note `(load ...)': load. *Note `(new-geometry ...)': new-geometry. *Note `(read ...)': read.  File: geomview, Node: Mouse Motions, Next: Appearance, Prev: Loading, Up: Interaction 3.5 Using the Mouse to Manipulate Objects ========================================= Geomview lets you manipulate objects with the mouse. There are six different mouse motion modes: _Rotate_, _Translate_, _Cam Fly_, _Cam Zoom_, _Geom Scale_, and _Cam Orbit_. The tools panel has a button for each of these modes; to switch modes, click on the corresponding button. You can also select these through the _Motion Mode_ browser on the _Main_ panel. This section describes basic mouse interaction. For details, *note Commands::. [image src="figs/tools.png"] Figure 3.4: The Tools Panel. Each of the motion modes uses a common paradigm for how the motion is applied. In particular, each depends on the current _target_ object and the current _center_ object. These are explained in the following paragraphs. The current target object is shown in the _Target_ field in the _Tools_ panel. This is the same as the selected object in the _Targets_ browser in the _Main_ panel, and you can change it by either selecting a new object in the browser, by typing a new entry in the field, or by picking an object in a camera window by double-clicking the right mouse button with the cursor over the object. The current center object is shown in the _Center_ field in the _Tools_ panel. Its default value is the special word "target", which means that the center object is whatever the target object is. You can change the center to any object by typing it in the _Center_ field. The origin of the center object is held fixed in _Rotate_ and _Orbit_ modes. Normally the center object is one of the existing geoms listed in the _Targets_ browser, and the actual center of rotations is the origin of that object's coordinate system. It is possible, however, to select an arbitrary point of interest on an object as the center. For details, *note Point of Interest::. It is also possible to toggle the button _BBox Center_ to set the center of motion to the center of the current object's bounding box. Once toggled the active geometry's bounding box center will become the center of motion, if you select another object, then the center of motion will become the center of that object's bounding box. Nothing changes when a camera or the _World_ is selected, you have to type in the word `target' in the _Center_ field the reset to the default. You apply a mouse motion by holding down either the left or middle mouse button with the cursor in a camera window and moving the mouse. Most of the modes have _inertia_, which means that if you let go of the button while moving the mouse, the motion will continue. It may be helpful to imagine the mouse cursor as being a gripper; when you hold a mouse button down, it grips the target object and you can move it. When you let go of the mouse button, the gripper releases the object. Letting go of the mouse button while moving the mouse is like throwing the object -- the object continues moving independent of the mouse. Inertia can be turned off; see the _Main_ panel's _Motion_ menu, described below. Generally, the left mouse button controls motion in the screen plane, while the middle mouse controls motion along or around the forward direction. Pressing the shift key while dragging with left or middle mouse buttons in most motion modes gives slow-speed motions, useful for fine adjustment. You can pick any point on an object (not just its origin) as the center of motion by holding down the shift key while clicking the right mouse button; this chooses a point of interest. _Rotate_ In _Rotate_ mode, hold the left mouse button down to rotate the target object about the center object. Rotation proceeds in the direction that you move the mouse. Specifically, the axis of rotation passes through the origin of the center object, is parallel to the camera view plane, and is perpendicular to the direction of motion of the mouse. When the center is "target", this means that the target object rotates about its own origin. The middle mouse button in _Rotate_ mode rotates the target object about an axis perpendicular to the view plane. _Translate_ In _Translate_ mode, hold the left mouse button down to translate the target object in the direction of mouse motion. The middle mouse button translates the target along an axis perpendicular to the view plane. In Euclidean space, the center object is essentially irrelevant for translations. In hyperbolic and spherical spaces, where translations have a unique axis, this axis is chosen to go through the origin of the center object. _Cam Fly_ _Cam Fly_ is a crude flight simulator that lets you fly around the scene. It works by moving the camera. Move the mouse while holding the left mouse button down to point the camera in a different direction. To move forward or backward, hold down the middle button and move the mouse vertically. Both of these motions have inertia; typically the easiest way to fly around a scene is to give the camera a slight forward push by letting go of the middle button while moving the mouse upward, and then using the left button to steer. _Cam Fly_ affects the camera window that the mouse is in; it ignores the target object and the center object. _Cam Orbit_ _Cam Orbit_ mode lets you rotate the current camera around the current center. The left mouse button does this rotation. The middle mouse button in _Cam Orbit_ mode acts as in _Cam Fly_ mode: it moves the camera forward or backward. In general _Cam Orbit_ does not move the target object, although if the current camera is selected as the target and the center is also the target, it will pivot that camera about itself just as in _Cam Fly_ mode. _Cam Zoom_ _Cam Zoom_ mode lets you change the current camera's field of view with the mouse; hold the left mouse button down and move the mouse to change it. The numeric value of the field of view is shown in the _FOV_ field in the _Camera_ panel. _Geom Scale_ _Geom Scale_ mode lets you enlarge or shrink a geom. It operates on the target object if that object is a geom. If the target is a camera, _Geom Scale_ operates on the geom that was most recently the target object. Moving the mouse while holding down the left mouse button scales the object either up or down, depending on the direction of mouse motion. The center of the applied scaling transformation is the center object. Scaling is meaningful only in Euclidean space; attempts to scale are ignored in other spaces. _Geom Scale_ mode does not have inertia. The _Stop_, _Look At_, _Center_, and _Reset_ buttons on the _Tools_ panel perform actions related to motions but do not change the current motion mode. _Stop_ The _Stop_ button causes all motions to stop. It affects all moving objects, not just the target object. Its keyboard shortcut is `H'. The keyboard command `h', which does not correspond to a panel button, stops the current motion for the target object only. _Look At_ The _Look At_ button causes the current camera to be moved to a position such that it is looking at the target object, and such that the target object more or less fills the window. The Look At command is unreliable in non-Euclidean spaces. _Center_ The _Center_ button undoes the target object's transformation, moving it back to its home position, which is where it was when you originally loaded it into Geomview. _Reset_ The _Reset_ button stops all motion and causes all objects to move back to their home positions. The _Tools_ panel also sports a _Main_ button, to invoke the main panel in case it was dismissed or buried, and a _Done_ button to close the _Tools_ panel. The _Main_ panel's _Motion_ menu has special controls affecting how mouse motions are interpreted; the toggles are also accessible through a GCL command. *Note `(ui-motion ...)': ui-motion. _[ui] Inertia_ Normally, moving objects have inertia: if the mouse is still moving when the button is released, the selected object continues to move. When _Inertia_ is off, objects cease to move as soon as you release the mouse. _[uc] Constrain Motion_ It's sometimes handy to move an object in a direction aligned with a coordinate axis: exactly horizontally or vertically. Selecting _Constrain Motion_ changes the interpretation of mouse motions to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical motion. Note that the motion is still along the X or Y axes of the camera in which you move the mouse, not necessarily the object's own coordinate system. _[uo] Own Coordinates_ It's sometimes handy to move objects with respect to the coordinate system where they were defined, rather than with respect to some camera's view. While _Own Coordinates_ is selected, all motions are interpreted that way: dragging the mouse rightward in translate mode moves the object in its own +X direction, and so on. May be especially useful in conjunction with the _Constrain Motion_ button. * Menu: * Point of Interest:: Point of Interest.  File: geomview, Node: Point of Interest, Prev: Mouse Motions, Up: Mouse Motions 3.5.1 Selecting a Point of Interest ----------------------------------- It is sometimes useful to specify a particular point on some object in a geomview window as the center point for mouse motions. You can do this by shift-clicking the right mouse button (i.e. click it once while holding down the shift key on the keyboard) with the cursor over the desired point. This point then becomes the _point of interest_. The point of interest must be on an existing object. Selecting a point of interest simplifies examining a small portion of a larger object. Shift-right-click on an interesting point, and select _Orbit_ mode. Use the middle mouse button to approach, and the left mouse to orbit the point, examining the region from different directions. When you have selected a point of interest, the current center object changes to an object named "CENTER", which is an invisible object located at the point of interest. In addition, mouse motions for the window in which you made the selection are adjusted so that the point of interest follows the mouse. You can change the point of interest at any time by selecting a new one by shift-clicking the right mouse button again. You can cancel the point of interest altogether by shift-clicking the right mouse button with the cursor on the background (i.e. not on any object). This changes the center object back to its default value, "target". The object named "CENTER", which serves as the center object for the point of interest, is a special kind of geom called an "alien". It does not appear in the _Targets_ browser. By default it has no geometry associated with it and hence is invisible. You can, however, explicitly give it some geometry using a GCL command, causing it to appear. Use the `geometry' command for this: `(geometry CENTER GEOMETRY)', where GEOMETRY is any valid geometry. For example, `(geometry CENTER { < xyz.vect })' causes the file `xyz.vect', which is one of the standard example files distributed with geomview, to be used at the geometry for CENTER. *Note `(geometry ...)': geometry. What happens internally when you select a point of interest is that the center is set to the object called CENTER, and that object is positioned at the point of interest. In addition, in order for mouse motions to track the point of interest, the current camera's focal length is set to be the distance from the camera to the point of interest. You can accomplish this via GCL with the following commands: (if (real-id CENTER) nil (new-alien CENTER {})) (ui-center CENTER) (transform-set CENTER universe universe translate X Y Z) (merge camera CAM-ID { focus D }) where `(X,Y,Z)' are the (universe) coordinates of the point of interest, and D is the distance from that point to the current camera, CAM-ID. The first command above creates the "alien" CENTER if it does not yet exist.  File: geomview, Node: Appearance, Next: Cameras, Prev: Mouse Motions, Up: Interaction 3.6 Changing the Way Things Look ================================ Geomview uses a hierarchy of appearances to control the way things look. An "appearance" is a specification of information about how something should be drawn. This can include many things such things as color, lighting, material properties, and more. Appearances work in a hierarchal manner: if a certain appearance property, for example face color, is not specified in a particular object's appearance, that object is drawn using that property from the parent appearance. If both the parent and the child appearance specify a property, the child's setting takes precedence unless the parent appearance is set to override. Every geom in Geomview has an appearance associated with it. There is also an appearance associated with the "World" geom, which serves as the parent of each individual geom's appearance. Finally, there is a global "base" appearance, which is the parent of the World appearance. The base appearance specifies reasonable values for all appearance information, and by default none of the other appearances specify anything, which means they inherit their values from the base appearance. This means that by default all objects are drawn using the base appearance. If you change a certain appearance property for a geom, that property is used in drawing that geom. The parent appearance is used for any properties that you do not explicitly set. Geomview has three panels which let you modify appearances. * Menu: * Appearance Panel:: Color etc. * Materials Panel:: Surface Material properties. * Lighting Panel:: Lighting Parameters.  File: geomview, Node: Appearance Panel, Next: Materials Panel, Prev: Appearance, Up: Appearance 3.6.1 The Appearance Panel -------------------------- The _Appearance_ panel lets you change most common appearance properties of the target object. [image src="figs/ap.png"] Figure 3.5: The Appearance Panel. If the target is an individual geom, then changes you make in the appearance panel apply to that geometry's appearance. If the target is the World, then appearance panel changes apply to the World appearance _and_ to all individual geom appearances. (Users have found that this is more desirable than having the changes only apply to the World appearance.) If the target is a camera, then appearance panel changes apply to the geom that was most recently the target. The five buttons near the upper right corner under the word _Draw_ control what parts of the target geom are drawn. _Faces_ This button specifies whether faces are drawn. _Edges_ This button specifies whether edges are drawn. _BBox_ This button specifies whether the bounding box is drawn. _Vects_ This button specifies whether VECT objects are drawn. VECTs are a type of OOGL object that represent points and line segments in 3-space; they are distinct from edges of other kinds of objects, and it is sometimes desirable to have separate control over whether they are drawn. _Normals_ This button specifies whether surface normal vectors are drawn. The four buttons under _Color_ labeled _Faces_, _Edges_, _Normals_, and _BBox_ let you specify the color of the corresponding aspect of the target geom. Clicking on one of them brings up a color chooser panel. [image src="figs/color.png"] Figure 3.6: Color Chooser Panel. This panel offers two sets of sliders: H(ue) S(aturation) V(alue), or R(ed) G(reen) B(lue), each in the range 0 through 1. The square shows the current color, which is given numerically in both HSV and RGB systems in the corresponding text boxes. In the HSV color system, hue H runs from red at 0, green at .333, blue at .667, and back to red at 1.0. Saturation gives the fraction of white mixed into the color, from 0 for pure gray to 1 for pure color. Value gives the brightness, from 0 for black to 1 for full brightness. Pressing the _RG_b or _HSV_ button at top center switches the sliders to the other color system. You can adjust colors either via the sliders, or by typing in either the RGB or HSV text boxes. Click _OK_ to accept the color that you have chosen, or _Cancel_ to retain the previous color setting. The _SHADING_ browser lets you specify the shading model that Geomview uses to paint the target geom. _Constant_ Every face of the object is drawn with a constant color which does not depend on the location of the face, the camera, or the light sources. If the object does not contain per-face or per-vertex colors, the diffuse color of the object's appearance is used. If the object contains per-face colors, they are used. If the object contains per-vertex colors, each face is painted using the color of its first vertex. _Flat_ Each face of the object is drawn with a color that depends on the relative location of the face, the camera, and the light sources. The color is constant across the face but may change as the face, camera, or lights move. _Smooth_ Each face of the object is drawn with smoothly interpolated colors based on the normal vectors at each vertex. If the object does not contain per-vertex normals, this has the same effect as flat shading. If the object has reasonable per-vertex normals, the effect is to smooth over the edges between the faces. _CSmooth_ Each face of the object is drawn with exactly the specified color(s), independent of lighting, orientation, and material properties. If the object is defined with per-vertex colors, the colors are interpolated smoothly across the face; otherwise the effect is the same as in Constant shading style. The _Facing Normals_ button on the _Appearance_ panel indicates whether or not Geomview should arrange that normal vectors always face the viewer. If a normal vector points away from the viewer the color of the corresponding face or vertex usually is darker than is desired. Geomview can avoid this by using the opposite normal in shading calculations. This is the default. Using _Facing Normals_ can give strange flickering dark or light shading effects, though, near the horizon of a fairly smooth facetted object. Press this button to use the normals given with the object. The three text fields in the lower left corner of the _Appearance_ panel are: _Line Width_ The width, in pixels, for lines drawn by Geomview. _Normal Length_ This is actually a scale factor; when normal vectors are drawn, Geomview draws them to have a length that is their natural length times this number. _Patch Dicing_ Geomview draws Bezier patches by first converting them to meshes. This parameter specifies the resolution of the mesh: if _Patch Dicing_ is N, then an N by N mesh is used to draw each Bezier patch. if _Patch Dicing_ is 1, the resolution reverts to a built-in default value. The _Revert_ button on the _Appearance_ panel undoes all settings in the target appearance. This causes the target geom to inherit all its appearance properties from its parent. The _Appearance_ panel's _Override_ button determines whether appearance controls should override settings in the objects themselves - for example, setting the face color will affect all faces of objects with multi-colored facets. Otherwise, appearance controls only provide settings which the objects themselves do not specify. By default, _Override_ is enabled. This button applies to all objects, and to all appearance-related panels.  File: geomview, Node: Materials Panel, Next: Lighting Panel, Prev: Appearance Panel, Up: Appearance 3.6.2 The Materials Panel ------------------------- The _Materials_ panel controls material properties of surfaces. It works with the target object in the same way that the _Appearance_ panel does. [image src="figs/mat.png"] Figure 3.7: The Materials Panel. _Transparent_ This button determines whether transparency is enabled. Geomview itself does not fully support transparency yet and on some machines it does not work at all. (The missing piece is implementation of a depth-sorting algorithm in the rendering engine; not difficult, but just not done yet.) Use RenderMan if you want real transparency: when transparency is enabled, a RenderMan snapshot will contain the alpha information. _Alpha_ This slider determines the opacity/transparency when transparency is enabled. 0 means totally transparent, 1 means totally opaque. _Diffuse Reflectance_ This slider controls the diffuse reflectance of a surface. This has to do with how much the surface scatters light that it reflects. _Shininess_ This slider controls how shiny a surface is. This determines the size of specular highlights on the surface. Lower values give the surface a duller appearance. _Ambient Reflectance_ This slider controls how much of the ambient light a surface reflects. _Specular Reflectance_ This slider controls the specular reflectance of a surface. This has to do with how directly the surface reflects light rays. Higher values give brighter specular highlights. _Done_ This button dismisses the _Materials_ panel.  File: geomview, Node: Lighting Panel, Prev: Materials Panel, Up: Appearance 3.6.3 The Lighting Panel ------------------------ The _Lighting_ panel controls the number, position, and color of the light sources used in shading. [image src="figs/light.png"] The Lighting Panel. The _Lighting_ panel is different from the _Appearance_ and _Material_ panels in that it always works with the base appearance. This is because it usually makes sense to use the same set of lights for drawing all objects in your scene. _LIGHTS_ The _LIGHTS_ browser shows the currently selected light. Changes made using the other widgets on this panel apply to this light. There is always at least one light, the ambient light. _Intensity_ This slider controls the intensity of the current light. _Color_ This button brings up a color chooser which lets you select the color of the current light. _Add_ This button adds a light. _Delete_ This button deletes the current light. _Show Lights_ This button lets you see and change the positions of the light sources in a camera window. Each light is drawn as long cylinder which is supposed to remind you of a light beam. When you click on the _Show Lights_ button Geomview goes into "light edit" mode, during which you can rotate current light by holding down the left mouse button and moving the mouse. Lights placed in this way are infinitely distant, so what you are changing is the angular position. Click on the _Show Lights_ button again to return to the previous motion mode and to quit drawing the light beams. _Done_ This button dismisses the _Lighting_ panel. Geomview's _Appearance_, _Materials_, and _Lighting_ panels are constructed to allow you to easily do most of the appearance related things that you might want to do. The appearance hierarchy that Geomview supports internally, however, is very complex and there are certain operations that you cannot do with the panels. The Geomview command language (GCL) provides complete support for appearance operations. In particular, the `merge-baseap' command can be used to change the base appearance (which, except for lighting, cannot be changed by Geomview's panels). The `merge-ap' command can be used to change an individual geom's appearance. Appearances can also be specified in OOGL files; for details, *note Appearances::. *Note `(merge-baseap ...)': merge-baseap. *Note `(merge-ap ...)': merge-ap.  File: geomview, Node: Cameras, Next: Saving, Prev: Appearance, Up: Interaction 3.7 Cameras =========== A camera in Geomview is the object that corresponds to a camera window. By default there is only one camera, but it is possible to have as many as you want. You can control certain aspects of the way the world is drawn in each camera window via the _Cameras_ panel. [image src="figs/cam.png"] Figure 3.8: The Cameras Panel. If the target object is a camera, the _Cameras_ panel affects that camera. If the target object is not a camera, the _Cameras_ panel affects the "current camera". The current camera is the camera of the window that the mouse cursor is in, or was in most recently if the cursor is not in a camera window. Thus, if you use the keyboard shortcuts for the actions in the _Cameras_ panel while the cursor is in a camera window, the actions apply to that camera, unless you have explicitly selected another camera. To create new camera windows, use the `v+' keyboard shortcut, or see the _File_ menu on the _Main_ panel. _Single-Buffering_ Normally, geomview windows are _double-buffered_: geomview draws the next picture into a hidden window, then switches buffers to make it visible all at once. On many systems, the memory for the hidden buffer comes from stealing half the bits in each screen pixel, reducing the color resolution. When single-buffering is enabled, the window flickers as each scene is being drawn, but you may get smoother images with reduced grainy dithering artifacts. Single-buffering is possible if Geomview is compiled with GL or OpenGL, but not with plain-X graphics. _Dither_ Many displays offer less than the 24 bits per pixel (8 bits each of red, green, and blue) conventionally needed to show smooth gradations of color. When trying to show a color not accurately available on the display, Geomview normally _dithers_, choosing pixel colors sometimes brighter, sometimes darker than the desired value, so that the average color over an area is a better approximation to the true color than a single pixel could be. Effectively this loses spatial resolution to gain color resolution. This isn't always desirable, though. Turning _Dither_ off gives less grainy, but less accurately colored, images. _Software Shading_ This button controls whether Geomview does shading calculations in software. The default is to let the hardware handle them, and in Euclidean space this is almost certainly best because it is faster. In hyperbolic and spherical space, however, the shading calculations that the hardware does are incorrect. Click this button to turn on correct but slower software shading. _Background Color_ This button brings up a color chooser which you can use to set the background color of the camera's window. _PROJECTION_ This browser lets you pick between perspective and orthogonal projection for this camera. _Near clip_ This determines the distance in world coordinates of the near clipping plane from the eye point. It must be a positive number. _Far clip_ This determines the distance in world coordinates of the far clipping plane from the eye point. It must be a positive number and in general should be larger than the _Near clip_ value. _FOV_ This is the camera's field of view, measured in its shorter direction. In perspective mode, it is an angle in degrees. In orthographic mode, it is the linear size of the field of view. This number can be modified with the mouse in _Cam Zoom_ mode. _Focal Length_ The focal length is intended to suggest the distance from the camera to an imaginary plane of interest. Its value is used when switching between orthographic and perspective views (and during stereo viewing), so as to preserve apparent size of objects lying at the focal distance from the camera. Focal length also affects interpretation of mouse-based translational motions. Speed of forward motion (in translate, fly and orbit modes) is proportional to focal length; and objects lying at the focal distance from the camera translate laterally at the same rate as the mouse cursor. Finally, in N-D projection mode, cameras are displaced back by the focal distance from the 3-D projection of the world origin. _Lines Closer_ This number has to do with the way lines are drawn. Normally Geomview's z-buffering algorithm can get confused when drawing lines that lie exactly on surfaces (such as the edges of an object); due to machine round-off error, sometimes the lines appear to be in front of the surface and sometimes they appear behind it. The _Lines Closer_ value is a fudge factor -- Geomview nudges all the lines that it draws closer to the camera by this amount. The number should be a small integer; try 5 or 10. 0 turns this feature off completely. Choosing too large a value will make lines visible even though they should be hidden. _SPACE MODEL_ This determines the model used to draw the world. It is most useful in hyperbolic and spherical spaces. You probably don't need to touch this browser if you stay in Euclidean space. For more information about these models, *note Non-Euclidean Geometry::. _Virtual_ This is the default model and represents the natural view from inside the space. _Projective_ The projective model of hyperbolic and spherical space. Geoms move under isometries of the space, and cameras move by Euclidean motions. By default in the projective model, the Euclidean unit sphere is drawn. In hyperbolic space this is the sphere at infinity. In Euclidean space the projective model is the same as the virtual model except that the sphere is drawn by default. _Conformal_ The conformal model of hyperbolic and spherical space. Geoms move under isometries of the space, and cameras move by Euclidean motions. In Euclidean space, the conformal model amounts to inverting everything in the unit sphere. _Draw Sphere_ This controls whether Geomview draws the unit sphere. By default the unit sphere appears in the projective and conformal models. In hyperbolic space this is the sphere at infinity. In spherical space it is the equatorial sphere. _Done_ This button dismisses the _Cameras_ panel.  File: geomview, Node: Saving, Next: Commands, Prev: Cameras, Up: Interaction 3.8 Saving your work ==================== Geomview's _Save_ panel lets you store Geomview objects and other information in files that you can read back into Geomview or other programs. [image src="figs/save.png"] Figure 3.9: The Save Panel. To use the _Save_ panel you select the desired format in the browser next to the word _Save_, enter the name of the object you want to save in the text field next to the word _for_, and enter the name of the file you wish to save to in the long text field next to the word _in_. You can then either hit `' or click on the _OK_ button. When the file has been written, the _Save_ panel disappears. If you want to dismiss the _Save_ panel without writing a file, click the _Cancel_ button. If you specify `-' as the file name, Geomview will write the file to standard output, i.e. in the shell window from which you invoked Geomview. The possible formats are given below. The kind of object that can be written with each format is given in parentheses. _Commands (any object)_ This write a file of GCL commands containing all information about the object. Loading this file later will restore the object as well as all other information about it, such as appearance, transformations, etc. _Geometry alone (geom)_ This writes an OOGL file containing just the geometry of the object. _Geometry [in world] (geom)_ This writes an OOGL file containing just the geometry of the object, transformed under Geomview's current transformation for this object. Use this if you have moved the object from its initial position and want to save the new position relative to the world. _Geometry [in universe] (geom)_ This writes an OOGL file containing just the geometry of the geom, transformed under both the object's transformation and the world's transformation. _RMan [->tiff] (camera)_ Writes a RenderMan file which when rendered creates a tiff image. Transparency and texturing (the latter only to some extent) will be available. _RMan [->frame] (camera)_ Writes a RenderMan file which when rendered causes an image to appear in a window on the screen. Transparency and texturing (the latter only to some extent) will be available. _SGI snapshot (camera)_ Write an SGI raster file. A bell rings when the snapshot is complete. Only available on SGI systems. _PPM GLX-offscreen snapshot (camera)_ Render the complete scene anew into off-screen memory; GLX provides the means to use a Pixmap as rendering area. The advantage of rendering into _off_-screen memory over taking screen snapshot is that the camera windows need not be mapped and even raised at the time the snapshot is taken. So with off-screen snapshot one can safely iconify the camera window (but do not close it!), activate the screen-saver and go to bed while some script advances the scenes and takes snapshots. _PPM Screen snapshot (camera)_ Take a snapshot of the given window and save it as a PPM image. If you specify a string beginning with a vertical bar (`|') as the file name, it's interpreted as a Bourne shell command to which the PPM data should be piped, as in `| pnmtotiff > snap.tiff' or `| convert -geometry 50% ppm:- snap.gif'. PPM screen snapshots are only available with GL and Open GL, not plain X graphics. The window should be entirely on the screen. Geomview will ensure that no other windows cover it while the snapshot is taken. It is probably a better idea to use GLX-_off-screen_ snapshots, as explained above. _PPM software snapshot (camera)_ Writes a snapshot of that window's current view, as a PPM image, to the given file. The file name may be a Bourne shell command preceded by a vertical bar (`|'), as with the PPM screen snapshot. The software snapshot, though, is produced by using a built-in software renderer (related to the X-windows renderer). It doesn't matter whether the window is visible or not, and doesn't depend on GL or OpenGL. It also doesn't support some features, such as texture mapping. _Postscript snapshot (camera)_ Writes a Postscript snapshot of the camera's view. It's made by breaking up the scene into lines and polygons, sorting by depth, and generating Postscript lines and polygons for each one. Advantages over pixel-based snapshot images: resolution is very high, so edges look sharp even on high-resolution printers, or comparable-resolution images are typically much more compact. Disadvantages: depth-sorting gives good results on some scenes, but can be wildly wrong as a hidden-surface removal algorithm for other scenes. Also, Postscript doesn't offer smoothly interpolated shading, only flat shading for each facet. _Camera (camera)_ Writes an OOGL file of a camera. _Transform [to world] (any object)_ Writes an OOGL transform file giving Geomview's transform for the object. _Transform [to universe] (any object)_ Writes an OOGL transform file giving a transform which is the composition of Geomview's transform for the object and the transform for the world. _Window (camera)_ Writes an OOGL window file for a camera. _Panels_ Writes a GCL file containing commands which record the state of all the Geomview panels. Loading this file later will restore the positions of all the panels.  File: geomview, Node: Commands, Next: Keyboard Shortcuts, Prev: Saving, Up: Interaction 3.9 The Commands Panel ====================== The _Commands_ panel lets you type in a GCL command. When you hit `', Geomview interprets the command and prints any resulting output or error messages on standard output. You can edit the text and hit `' as many times as you like, in general, whenever you hit `' with the cursor in the _Commands_ panel, Geomview tries to interpret whatever text you have typed in the text field as a command. [image src="figs/command.png"] Figure 3.10: The Commands Panel. [Move this.] Normalization is a kind of scaling; Geomview can scale an object so that it fits within a certain region. The main point of normalization is to allow you to easily view all of an object without having to worry about how big it is. We are gradually replacing Geomview's normalization feature with more robust camera positioning features. In general, the best way to make sure you are seeing all of an object is to use the _Look At_ button on the _Tools_ panel. Normalization may be completely replaced by this and other features in a future version of Geomview. Normalization is a property that applies to each geom separately. The _NORMALIZE GEOMETRY_ browser affects the normalization property of target geom. If the target geom is "World", it affects all geoms. _None_ Do no normalization. _Individual_ Normalize this geom to fit within a unit sphere. _Sequence_ This resembles "Individual", except when an object is changing. Then, "Individual" tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while "Sequence" normalizes the union of all variants of the object and normalizes accordingly. _Keep_ This leaves the current normalization transform unchanged when the object changes. It may be useful to apply "Individual" or "Sequence" normalization to the first version of a changing object to bring it in view, then switch to "Keep".  File: geomview, Node: Keyboard Shortcuts, Prev: Commands, Up: Interaction 3.10 Keyboard Shortcuts ======================= Most actions that you can do through Geomview's panels have equivalent keyboard shortcuts so that you can do the same action by typing a sequence of keys on the keyboard. This is useful for advanced users who are familiar with Geomview's capabilities and want to work quickly without having to have lots of panels cluttering up the screen. Keyboard shortcuts usually are indicated in square brackets ([ ]) near the corresponding item in a panel. For example, the keyboard shortcut for _Rotate_ mode is 'r'; this is indicated by "[r]" appearing before the word "Rotate" in the _MOTION MODE_ browser. To use this keyboard shortcut just hit the `r' key while the mouse cursor is in any Geomview window. You don't need to press the `' or `' keys. Some keyboard shortcuts consist of more than one key. In these cases just type the keys one after the other, with no `' afterwards. Keyboard shortcuts are case sensitive. You can cancel a multi-key keyboard shortcut that you have started by typing any invalid key, for example the space bar. Keyboard commands apply while the cursor is in any camera window and most control panels. Many keyboard shortcuts allow numeric arguments which you type as a prefix to the command key(s). For example, the shortcut for _Near clip_ in the camera panel is `v n'. To set the near clip plane to `0.5', type `0.5vn'. Commands that don't take a numeric prefix toggle or reset the current value. Most commands allow one of the following selection prefixes. If none is provided the command applies to the target object. `g' world geom `g#' #'th geom `g*' All geoms `c' current camera `c#' #'th camera `c*' All cameras For example, `g4af' means toggle the face drawing of object _g4_. Simply typing a selection prefix, like `g4', doesn't yet select an object; that only happens when a command, like `ae', follows the prefix. To select an object as the target without doing anything else to it, use the `p' command. So `g3p' selects object g3. The text field in the upper left corner of the _Main_ panel shows the state of the current keyboard shortcut. In addition to the keyboard shortcuts for the panel commands, there is also a shortcut for picking a target object: type the short name of the object followed by `p'. For example, to select object _g3_, type `g 3 p'. This only works with the short names -- the ones that appear in square brackets ([ ]) in the _Targets_ browser of the _Main_ panel. Below is a summary of all keyboard shortcuts. Draw `af' Faces `ae' Edges `an' Normals `ab' Bounding Boxes `aV' Vectors Shading `0as' Constant `1as' Flat `2as' Smooth `3as' Smooth, non-lighted `aT' allow transparency `at' texture mapping Other `av' eVert normals: always face viewer `#aw' Line Width (pixels) `aC' handle concave polygons `#vc' edges Closer than faces (try 5-100) Color `Cf' faces `Ce' edges `Cn' normals `Cb' bounding boxes `CB' background Motions `r' rotate `t' translate `z' zoom FOV `f' fly `o' orbit `s' scale `w' recenter target `W' recenter all `h' halt `H' halt all `@' select center of motion (e.g. `g 3 @') `L' Look At object Viewing `0vp' Orthographic view `1vp' Perspective view `vd' Draw other views' cameras `#vv' field of View `#vn' near clip distance `#vf' far clip distance `v+' add new camera `vx' cursor on/off `vb' backfacing poly cull on/off `#vl' focal length `v~' Software shading on/off Panels `Pm' Main `Pa' Appearance `Pl' Lighting `Po' Obscure `Pt' Tools `Pc' Cameras `PC' Commands `Pf' Files `Ps' Save `P-' read commands from tty `PA' Credits ("about") Lights `ls' show lights `le' edit lights Space `me' Euclidean `mh' Hyperbolic `ms' Spherical Model `mv' Virtual `mp' Projective `mc' Conformal Other `0N' normalizaton: none `1N' normalization: each `2N all' normalization: all `ui' motion: Inertia `uc' motion: Constrain to axis `uo' motion: object's Own coordinates `<' `Pf' load geometry/command file `dd' delete target object `>' `Ps' save state to file `TV' NTSC mode toggle `p' pick as target object (e.g. `g 3 p') With no prefix, selects the object under the mouse cursor (like double-clicking the right mouse)  File: geomview, Node: OOGL File Formats, Next: Customization, Prev: Interaction, Up: Top 4 OOGL File Formats ******************* The objects that you can load into Geomview are called OOGL objects. OOGL stands for "Object Oriented Graphics Library"; it is the library upon which Geomview is built. There are many different kinds of OOGL objects. This chapter gives syntactic descriptions of file formats for OOGL objects. Examples of most file types live in Geomview's `data/geom' directory. * Menu: * Conventions:: Conventions and general remarks. * Object File Formats:: Object File Formats. * Non-geometric objects:: Non-geometric objects.  File: geomview, Node: Conventions, Next: Object File Formats, Prev: OOGL File Formats, Up: OOGL File Formats 4.1 Conventions =============== * Menu: * Common syntax:: Syntax Common to All OOGL File Formats. * File names:: File Names. * Vertices:: Vertices. * ND-Vertices:: N-dimensional Vertices. * Surface normal directions:: Surface normal directions. * Transformation matrices:: Transformation matrices. * ND Transformation matrices:: N-dimensional transformation matrices. * Binary format:: Binary format. * References:: Embedded objects and external-object references. * Appearances:: Appearances. * Texture Mapping:: Texture mapping.  File: geomview, Node: Common syntax, Next: File names, Prev: Conventions, Up: Conventions 4.1.1 Syntax Common to All OOGL File Formats -------------------------------------------- Most OOGL object file formats are free-format ASCII -- any amount of white space (blanks, tabs, newlines) may appear between tokens (numbers, key words, etc.). Line breaks are almost always insignificant, with a couple of exceptions as noted. Comments begin with # and continue to the end of the line; they're allowed anywhere a newline is. Binary formats are also defined for several objects; *Note Binary format::, and the individual object descriptions. Typical OOGL objects begin with a key word designating object type, possibly with modifiers indicating presence of color information etc. In some formats the key word is optional, for compatibility with file formats defined elsewhere. Object type is then determined by guessing from the file suffix (if any) or from the data itself. Key words are case sensitive. Some have optional prefix letters indicating presence of color or other data; in this case the order of prefixes is significant, e.g. `CNMESH' is meaningful but `NCMESH' is invalid.  File: geomview, Node: File names, Next: Vertices, Prev: Common syntax, Up: Conventions 4.1.2 File Names ---------------- When OOGL objects are read from disk files, the OOGL library uses the file suffix to guess at the file type. If the suffix is unrecognized, or if no suffix is available (e.g. for an object being read from a pipe, or embedded in another OOGL object), all known types of objects are tried in turn until one accepts the data as valid.  File: geomview, Node: Vertices, Next: ND-Vertices, Prev: File names, Up: Conventions 4.1.3 Vertices -------------- Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax is `X Y Z' (3-D floating-point vertex coordinates) or `X Y Z W' (4-D floating-point vertex coordinates) optionally followed by `NX NY NZ' (normalized 3-D surface-normal if present) optionally followed by `R G b A' (4-component floating-point color if present, each component in range 0..1. The A (alpha) component represents opacity: 0 transparent, 1 opaque.) optionally followed by `S T' `or' `S T U' (two or three texture-coordinate values). Values are separated by white space, and line breaks are immaterial. Letters in the object's header key word must appear in a specific order; that's the reverse of the order in which the data is given for each vertex. So a `CN4OFF' object's vertices contain first the 4-component space position, then the 3-component normal, finally the 4-component color. You can't change the data order by changing the header key word; an `NCOFF' is just not recognized.  File: geomview, Node: ND-Vertices, Next: Surface normal directions, Prev: Vertices, Up: Conventions 4.1.4 N-dimensional Vertices ---------------------------- Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax for N-dimensional vertices (N > 3) is `X[1] X[2] X[3] X[4] ...' (N floating-point vertex coordinates) or `X[0] X[1] X[2] X[3] X[4] ...' ((N+1) floating-point vertex coordinates, if the `4' modifier has been specified in the object's header line) Note, however, that N-dimensional objects internally always have (N+1)-dimensional points; the first component X[0] - if present in the object file - is used as homogeneous divisor. This is different from the ordinary 3D case where the `4' modifier generates a 4D object where the homogeneous component implicitly is set to 1. Color components usually can be specified like for 3D vertices, *note Vertices::, while specifying normals does not make sense.  File: geomview, Node: Surface normal directions, Next: Transformation matrices, Prev: ND-Vertices, Up: Conventions 4.1.5 Surface normal directions ------------------------------- Geomview uses normal vectors to determine how an object is shaded. The direction of the normal is significant in this calculation. When normals are supplied with an object, the direction of the normal is determined by the data given. When normals are not supplied with the object, Geomview computes normal vectors automatically; in this case normals point toward the side from which the vertices appear in counterclockwise order. On parametric surfaces (Bezier patches), the normal at point P(u,v) is in the direction dP/du cross dP/dv.  File: geomview, Node: Transformation matrices, Next: ND Transformation matrices, Prev: Surface normal directions, Up: Conventions 4.1.6 Transformation matrices ----------------------------- Some objects incorporate 4x4 real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is a 4-element row vector representing homogeneous coordinates of a point in the OOGL object, and A is the 4x4 matrix, then the transformed point is p' = p A. This matrix convention is common in computer graphics; it's the transpose of that often used in mathematics, where points are column vectors multiplied on the right of matrices. Thus for Euclidean transformations, the translation components appear in the fourth row (last four elements) of A. A's last column (4th, 8th, 12th and 16th elements) are typically 0, 0, 0, and 1 respectively.  File: geomview, Node: ND Transformation matrices, Next: Binary format, Prev: Transformation matrices, Up: Conventions 4.1.7 ND Transformation matrices -------------------------------- In the context of N-dimensional space (N < 3) some objects incorporate (N+1)x(N+1) real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is an (N+1)-element row vector representing homogeneous coordinates of a point in the OOGL object, and A (N+1)x(N+1) is the matrix, then the transformed point is p' = p A. Note that (unlike for the 4x4 transformation matrices, *note Transformation matrices::) the homogeneous component is located at index zero, so the translation components for Euclidean transformations appear in the zero-th row (first (N+1) elements). A's first column (at column index zero) is typically 1, 0, ..., 0.  File: geomview, Node: Binary format, Next: References, Prev: ND Transformation matrices, Up: Conventions 4.1.8 Binary format ------------------- Many OOGL objects accept binary as well as ASCII file formats. These files begin with the usual ASCII token (e.g. `CQUAD') followed by the word `BINARY'. Binary data begins at the byte following the first newline after `BINARY'. White space and a single comment may intervene, e.g. OFF BINARY # binary-format "OFF" data follows Binary data comprise 32-bit integers and 32-bit IEEE-format floats, both in big-endian format (i.e., with most significant byte first). This is the native format for 'int's and 'float's on Sun-3's, Sun-4's, and Irises, among others. Binary data formats resemble the corresponding ASCII formats, with ints and floats in just the places you'd expect. There are some exceptions though, specifically in the `QUAD', `OFF' and `COMMENT' file formats. Details are given in the individual file format descriptions. *Note QUAD::, *Note OFF::, and *Note COMMENT::. Binary OOGL objects may be freely mixed in ASCII object streams: LIST { = MESH BINARY ... binary data for mesh here ... } { = QUAD 1 0 0 0 0 1 0 1 0 0 1 0 } Note that ASCII data resumes immediately following the last byte of binary data. Naturally, it's impossible to embed comments inside a binary-format OOGL object, though comments may appear in the header before the beginning of binary data.  File: geomview, Node: References, Next: Appearances, Prev: Binary format, Up: Conventions 4.1.9 Embedded objects and external-object references ----------------------------------------------------- Some object types (`LIST', `INST') allow references to other OOGL objects, which may appear literally in the data stream, be loaded from named disk files, or be communicated from elsewhere via named objects. GCL commands also accept geometry in these forms. The general syntax is ::= [ "{" ] [ "define" `symbolname' ] [ ["="] `object-keyword' ... | "<" `filename' | ":" `symbolname' ] [ "}" ] where "quoted" items are literal strings (which appear without the quotes), [bracketed] items are optional, and | denotes alternatives. Curly braces, when present, must match; the outermost set of curly braces is generally required when the object is in a larger context, e.g. when it is part of a larger object or embedded in a Geomview command stream. For example, each of the following three lines: { define fred QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } { define fred = QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } { appearance { +edge } LIST { < "file1" } { : fred } } VECT 1 2 0 2 0 0 0 0 1 1 2 is a valid OOGL object. The last example is only valid when it is delimited unambiguously by residing in its own disk file. The ":" construct allows references to symbols, created with `define'. A symbol's initial value is a null object. When a symbol is (re)defined, all references to it are automatically changed. The "`define' NAME" construct allows to define a global symbol for the given object. If "NAME" already references an object, then the old object is discarded and replaced by the new definition. *Note `(read ...)': read. *Note `(hdefine ...)': hdefine. The "<" construct causes a disk file to be read. Note that this isn't a general textual "include" mechanism; a complete OOGL object must appear in the referenced file. Files read using "<" are sought first in the directory of the file which referred to them, if any; failing that, the normal search path (*note `(load-path ...)': load-path.) is used. The default search looks first in the current directory, then in the Geomview data directories. Again, white space and line breaks are insignificant, and "#" comments may appear anywhere.  File: geomview, Node: Appearances, Next: Texture Mapping, Prev: References, Up: Conventions 4.1.10 Appearances ------------------ Geometric objects can have associated "appearance" information, specifying shading, lighting, color, wire-frame vs. shaded-surface display, and so on. Appearances are inherited through object hierarchies, e.g. attaching an appearance to a `LIST' means that the appearance is applied to all the `LIST''s members. Some appearance-related properties are relegated to "material", "lighting" and "texture" substructures. Take care to note which properties belong to which structure. Any geometric object can be preceded by an appearance definition like in the following example: { appearance { +edge } LIST { < "file1" } { QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } } Appearances are also OOGL objects in their own right and can be given symbolic names and referenced by them (*note References::). *Note Appearance objects: appearance. Texture Mapping There is a separate section concerning the definition of textures (*note Texture Mapping::). Transparency Rendering translucent objects is not supported by all drawing back ends. The OpenGL renderer has limited support for it: top-level objects (i.e. those which appear in the object browser of the main panel (*note The Main Panel: Basic Interaction.) are rendered correctly by means of alpha-blending). Also, the RenderMan snapshots will include opacity values. Here's an example appearance structure including values for all attributes. Order of attributes is unimportant. As usual, white space is irrelevant. Boolean attributes may be preceded by "+" or "-" to turn them on or off; "+" is assumed if only the attribute name appears. Other attributes expect values. A "*" prefix on any attribute, e.g. "*+edge" or "*linewidth 2" or "material { *diffuse 1 1 .25 }", selects "override" status for that attribute. appearance { +face # (Do) draw faces of polygons. On by default. -edge # (Don't) draw edges of polygons +vect # (Do) draw VECTs. On by default. -transparent # (Disable) transparency. Enabling transparency # does not (necessarily) result in a correct Geomview # pictures, but alpha values are used in RenderMan # snapshots. -normal # (Do) draw surface-normal vectors normscale 1 # ... with length 1.0 in object coordinates +evert # do evert polygon normals where needed so as # to always face the camera +texturing # (Enable) texture mapping +linear # (Enable) linear average of closest texture elements +mipmap # (Enable) texture mip-mapping +mipinterp # (Enable) linear mip-mapping -backcull # (Don't) discard clockwise-oriented faces -concave # (Don't) expect and handle concave polygons -shadelines # (Don't) shade lines as if they were lighted cylinders # These four are only effective where the graphics system # supports them, namely on GL and Open GL. -keepcolor # Normally, when N-D positional coloring is enabled as # with geomview's (ND-color ...) command, all # objects' colors are affected. But, objects with the # "+keepcolor" attribute are immune to N-D coloring. shading smooth # or ``shading constant'' or ``shading flat'' or # or ``shading csmooth''. # smooth = Gouraud shading, flat = faceted, # csmooth = smoothly interpolated but unlighted. linewidth 1 # lines, points, and edges are 1 pixel wide. patchdice 10 10 # subdivide Bezier patches this finely in u and v material { # Here's a material definition; # it could also be read from a file as in # ``material < file.mat'' ka 1.0 # ambient reflection coefficient. ambient .3 .5 .3 # ambient color (red, green, blue components) # The ambient contribution to the shading is # the product of ka, the ambient color, # and the color of the ambient light. kd 0.8 # diffuse-reflection coefficient. diffuse .9 1 .4 # diffuse color. # (In ``shading constant'' mode, the surface # is colored with the diffuse color.) ks 1.0 # specular reflection coefficient. specular 1 1 1 # specular (highlight) color. shininess 25 # specular exponent; larger values give # sharper highlights. backdiffuse .7 .5 0 # back-face color for two-sided surfaces # If defined, this field determines the diffuse # color for the back side of a surface. # It's implemented by the software shader, and # by hardware shading on GL systems which support # two-sided lighting, and under Open GL. alpha 1.0 # opacity; 0 = transparent (invisible), 1 = opaque. # Ignored when transparency is disabled. edgecolor 1 1 0 # line & edge color normalcolor 0 0 0 # color for surface-normal vectors } lighting { # Lighting model ambient .3 .3 .3 # ambient light replacelights # ``Use only the following lights to # illuminate the objects under this # appearance.'' # Without "replacelights", any lights listed # are added to those already in the scene. # Now a collection of sample lights: light { color 1 .7 .6 # light color position 1 0 .5 0 # light position [distant light] # given in homogeneous coordinates. # With fourth component = 0, # this means a light coming from # direction (1,0,.5). } light { # Another light. color 1 1 1 position 0 0 .5 1 # light at finite position ... location camera # specified in camera coordinates. # (Since the camera looks toward -Z, # this example places the light # .5 unit behind the eye.) # Possible "location" keywords: # global light position is in world (well, universe) coordinates # This is the default if no location specified. # camera position is in the camera's coordinate system # local position is in the coordinate system where # the appearance was defined } } # end lighting model texture { clamp st # or ``s'' or ``t'' or ``none'' file lump.tiff # file supplying texture-map image alphafile mask.pgm.Z # file supplying transparency-mask image apply blend # or ``modulate'' or ``decal'' transform 1 0 0 0 # surface (s,t,0,1) * tfm -> texture coords 0 1 0 0 0 0 1 0 .5 0 0 1 background 1 0 0 1 # relevant for ``apply blend'' } } # end appearance There are rules for inheritance of appearance attributes when several are imposed at different levels in the hierarchy. For example, Geomview installs a backstop appearance which provides default values for most parameters; its control panels install other appearances which supply new values for a few attributes; user-supplied geometry may also contain appearances. The general rule is that the child's appearance (the one closest to the geometric primitives) wins. Further, appearance controls with "override" status (e.g. `*+face or material { *diffuse 1 1 0 }') win over those without it. Geomview's appearance controls use the "override" feature so as to be effective even if user-supplied objects contain their own appearance settings. However, if a user-supplied object contains an appearance field with override status set, that property will be immune to Geomview's controls.  File: geomview, Node: Texture Mapping, Prev: Appearances, Up: Conventions 4.1.11 Texture Mapping ---------------------- Some rendering back-ends support texture-mapped objects, actually only the OpenGL and the RenderMan interface at the time of this writing. There are also some issues with the RMan interface when using an alpha-channel in the texture image. Those rendering back-ends which don't support texturing silently ignore attempts to use texture mapping. A texture is specified as part of an appearance structure (*note Appearances::). Briefly, one provides a texture image (*note Image objects: image.), which is considered to lie in a square in `(s,t)' parameter space in the range 0 <= s <= 1, 0 <= t <= 1. Then one provides a geometric primitive, with each vertex tagged with `(s,t)' texture coordinates. If texturing is enabled, the appropriate portion of the texture image is pasted onto each face of the textured object. There is (currently) no provision for inheritance of part of a texture structure; if the `texture' keyword is mentioned in an appearance, it supplants any other texture specification. The appearance attribute `texturing' controls whether textures are used; there's no performance penalty for having texture { ... } fields defined when texturing is off. The available fields are: clamp none -or- s -or- t -or- st Determines the meaning of texture coordinates outside the range 0..1. With `clamp none', the default, coordinates are interpreted modulo 1, so (s,t) = (1.25,0), (.25,0), and (-.75,0) all refer to the same point in texture space. With `s' or `t' or `st', either or both of s- or t-coordinates less than 0 or greater than 1 are clamped to 1 or 0, respectively. image { (*note Image objects: image.) } Specify the actual texture image. Images can have 1, 2, 3 or 4 channels: 1 channel: luminance 2 channels: luminance and alpha 3 channels: RGB data 4 channels: RGBA data *Note Image objects: image, for the actual definition of image objects. The alpha-channel is only interpreted as mask: where the mask is zero, pixels are simply not drawn. An exception is the case where _apply_ is equal to _modulate_ and translucency is enabled: in this case the resulting alpha value is the result of the multiplication of the surface color with the alpha value of the texture's alpha channel. file filename alphafile filename _This is considered obsolete, and only kept for compatibility, the modern way is to use the new OOGL image object. *Note Image objects: image. The stuff documented here should still work, though_ Specifies image file(s) containing the texture. The _file_ keyword specifies a file with color or lightness information; _alphafile_ if present, specifies a transparency ("alpha") mask; where the mask is zero, pixels are simply not drawn. Several image file formats are available; the file type must be indicated by the last few characters of the file name: .ppm or .ppm.Z or .ppm.gz 24-bit 3-color image in PPM format .pgm or .pgm.Z or .pgm.gz 8-bit grayscale image in PGM format .sgi or .sgi.Z or .sgi.gz 8-bit, 24-bit, or 32-bit SGI image .tiff 8-bit or 24-bit TIFF image .gif GIF image For this feature to work, some programs must be available in geomview's search path: zcat for .Z files gzip for .gz files tifftopnm for .tiff files giftoppm for .gif files If an `alphafile' image is supplied, it must be the same size as the `file' image. _Image objects provide a more flexible way to specify texture data. *Note Image objects: image._ apply modulate -or- blend -or- decal Indicates how the texture image is applied to the surface. Here the "surface color" means the color that surface would have in the absence of texture mapping. With `modulate', the default, the texture color (or lightness, if textured by a gray-scale image) is multiplied by the surface color. With `blend', texture blends between the `background' color and the surface color. The `file' parameter must specify a gray-scale image. Where the texture image is 0, the surface color is unaffected; where it's 1, the surface is painted in the color given by `background'; and color is interpolated for intermediate values. With `decal', the `file' parameter must specify a 3-color image. If an `alphafile' parameter is present, its value interpolates between the surface color (where alpha=0) and the texture color (where alpha=1). Lighting does not affect the texture color in `decal' mode; effectively the texture is constant-shaded. background R G B A Specifies a 4-component color, with R, G, B, and A floating-point numbers normally in the range 0..1, used when `apply blend' is selected. transform `transformation-matrix' Expects a list of 16 numbers, or one of the other ways of representing a transformation (`: handlename' or `< filename'). The 4x4 transformation matrix is applied to texture coordinates, in the sense of a 4-component row vector (s,t,0,1) multiplied on the left of the matrix, to produce new coordinates (s',t') which actually index the texture.  File: geomview, Node: Object File Formats, Next: Non-geometric objects, Prev: Conventions, Up: OOGL File Formats 4.2 Object File Formats ======================= * Menu: * QUAD:: List of quadrilaterals. * MESH:: Rectangularly-connected mesh. * BBOX:: Simple bounding-boxes. * BBP and BEZ:: List of Bezier surface patches. * OFF:: Polyhedra: polygons with shared vertices. * VECT:: List of points and lines. * SKEL:: List of points and lines, with shared vertices. * SPHERE:: Sphere * INST:: Transformed Instance of another object. * LIST:: List of other objects. * TLIST:: Collection of 4x4 transformation matrices. * GROUP:: Obsolete format for collections of objects. * DISCGRP:: Discrete Group objects. * COMMENT:: Comment object, for caching information.  File: geomview, Node: QUAD, Next: MESH, Prev: Object File Formats, Up: Object File Formats 4.2.1 QUAD: collection of quadrilaterals ---------------------------------------- The conventional suffix for a `QUAD' file is `.quad'. The file syntax is [C][N][4]QUAD -or- [C][N][4]POLY # Key word VERTEX VERTEX VERTEX VERTEX # 4*N vertices for some N VERTEX VERTEX VERTEX VERTEX ... The leading key word is `[C][N][4]QUAD' or `[C][N][4]POLY', where the optional `C' and `N' prefixes indicate that each vertex includes colors and normals respectively. That is, these files begin with one of the words `QUAD' `CQUAD' `NQUAD' `CNQUAD' `POLY' `CPOLY' `NPOLY' `CNPOLY' (but not `NCQUAD' or `NCPOLY'). `QUAD' and `POLY' are synonymous; both forms are allowed just for compatibility with ChapReyes. Following the key word is an arbitrary number of groups of four vertices, each group describing a quadrilateral. See the Vertex syntax above. The object ends at end-of-file, or with a close-brace if incorporated into an object reference (see above). A `QUAD BINARY' file format is accepted; *Note Binary format::. The first word of binary data must be a 32-bit integer giving the number of quads in the object; following that is a series of 32-bit floats, arranged just as in the ASCII format.  File: geomview, Node: MESH, Next: BBOX, Prev: QUAD, Up: Object File Formats 4.2.2 MESH: rectangularly-connected mesh ---------------------------------------- The conventional suffix for a `MESH' file is `.mesh'. The file syntax is [U][C][N][Z][4][u][v][n]MESH # Key word [NDIM] # Space dimension, present only if nMESH NU NV # Mesh grid dimensions # NU*NV vertices, in format specified # by initial key word VERTEX(u=0,v=0) VERTEX(1,0) ... VERTEX(NU-1,0) VERTEX(0,1) ... VERTEX(NU-1,1) ... VERTEX(0,NV-1) ... VERTEX(NU-1,NV-1) The key word is `[U][C][N][Z][4][u][v][n]MESH'. The optional prefix characters mean: `U' Each vertex includes a 3-component texture space parameter. The first two components are the usual `S' and `T' texture parameters for that vertex; the third should be specified as zero. `C' Each vertex (see Vertices above) includes a 4-component color. `N' Each vertex includes a surface normal vector. `Z' Of the 3 vertex position values, only the Z component is present; X and Y are omitted, and assumed to equal the mesh (u,v) coordinate so X ranges from 0 .. (Nu-1), Y from 0 .. (Nv-1) where Nu and Nv are the mesh dimensions - see below. `4' Vertices are 4D, each consists of 4 floating values. `Z' and `4' cannot both be present. `u' The mesh is wrapped in the u-direction, so the (0,v)'th vertex is connected to the (NU-1,v)'th for all v. `v' The mesh is wrapped in the v-direction, so the (u,0)'th vertex is connected to the (u,NV-1)'th for all u. Thus a u-wrapped or v-wrapped mesh is topologically a cylinder, while a uv-wrapped mesh is a torus. `n' Specifies a mesh whose vertices live in a higher dimensional space. The dimension follows the "MESH" keyword. Each vertex then has NDIM components. Note that the order of prefix characters is significant; a colored, u-wrapped mesh is a `CuMESH' not a `uCMESH'. Following the mesh header are integers NU and NV, the dimensions of the mesh. Then follow NU*NV vertices, each in the form given by the header. They appear in v-major order, i.e. if we name each vertex by (u,v) then the vertices appear in the order (0,0) (1,0) (2,0) (3,0) ... (NU-1,0) (0,1) (1,1) (2,1) (3,1) ... (NU-1,1) ... (0,Nv-1) ... (NU-1,NV-1) A `MESH BINARY' format is accepted; *Note Binary format::. The values of NU and NV are 32-bit integers; all other values are 32-bit floats.  File: geomview, Node: BBOX, Next: BBP and BEZ, Prev: MESH, Up: Object File Formats 4.2.3 BBOX: simple bounding boxes --------------------------------- This is a very simple toy-object: it takes 2 vertices and draws a (hyper-) cube which is the bounding box of the two vertices. Syntax: BBOX X[0] Y[0] Z[0] X[1] Y[1] Z[1] or 4BBOX X[0] Y[0] Z[0] W[0] X[1] Y[1] Z[1] W[1] or nBBOX NDIM # > 3 X[0] Y[0] Z[0] W[0] ... X[1] Y[1] Z[1] W[1] ... or 4nBBOX NDIM # > 3 D[0] X[0] Y[0] Z[0] W[0] ... D[0] X[1] Y[1] Z[1] W[1] ... There is no BBOX binary format. The `4' modifyer has different meanings depending on the dimension of the bounding box: `4BBOX' means that the 4 components of the vertices make up a 4-dimensional bounding-box. Using `4' in conjunction with `n' - `4nBBOX NDIM' - means that the vertices specified in the file have NDIM+1 components, but the component at index 0 is the homogeneous divisor (in contrast to the ordinary 3d case where the homogeneous divisor would be the `w' - the third - component).  File: geomview, Node: BBP and BEZ, Next: OFF, Prev: BBOX, Up: Object File Formats 4.2.4 Bezier Surfaces --------------------- The conventional file suffixes for Bezier surface files are `.bbp' or `.bez'. A file with either suffix may contain either type of patch. Syntax: [ST]BBP -or- [C]BEZ[_ST] # NU, NV are u- and v-direction # polynomial degrees in range 1..6 # ND = dimension: 3->3-D, 4->4-D (rational) # (The '<' and '>' do not appear in the input.) # NU,NV,ND are each a single decimal digit. # BBP form implies NU=NV=ND=3 so BBP = BEZ333. # Any number of patches follow the header # (NU+1)*(NV+1) patch control points # each 3 or 4 floats according to header VERTEX(u=0,v=0) VERTEX(1,0) ... VERTEX(NU,0) VERTEX(0,1) ... VERTEX(NU,1) ... VERTEX(0,NV) ... VERTEX(NU,NV) # ST texture coordinates if mentioned in header `S'(u=0,v=0) `T'(0,0) `S'(0,NV) `T'(0,NV) `S'(NU,0) `T'(NU,0) `S'(NU,NV) `T'(NU,NV) # 4-component float (0..1) R G B A colors # for each patch corner if mentioned in header `RGBA'(0,0) `RGBA'(0,NV) `RGBA'(NU,0) `RGBA'(NU,NV) These formats represent collections of Bezier surface patches, of degrees up to 6, and with 3-D or 4-D (rational) vertices. The header keyword has the forms `[ST]BBP' or `[C]BEZ[_ST]' (the '<' and '>' are not part of the keyword. The `ST' prefix on `BBP', or `_ST' suffix on `BEZuvn', indicates that each patch includes four pairs of floating-point texture-space coordinates, one for each corner of the patch. The `C' prefix on `BEZuvn' indicates a colored patch, including four sets of four-component floating-point colors (red, green, blue, and alpha) in the range 0..1, one color for each corner. NU and NV, each a single digit in the range 1..6, are the patch's polynomial degree in the u and v direction respectively. ND is the number of components in each patch vertex, and must be either `3' for 3-D or `4' for homogeneous coordinates, that is, rational patches. `BBP' patches are bicubic patches with 3-D vertices, so `BBP' = `BEZ333' and `STBBP' = `BEZ333_ST'. Any number of patches follow the header. Each patch comprises a series of patch vertices, followed by optional (s,t) texture coordinates, followed by optional (r,g,b,a) colors. Each patch has (NU+1)*(NV+1) vertices in v-major order, so that if we designate a vertex by its control point indices (u,v) the order is (0,0) (1,0) (2,0) ... (NU,0) (0,1) (1,1) (2,1) ... (NU,1) ... (0,NV) ... (NU,NV) with each vertex containing either 3 or 4 floating-point numbers as specified by the header. If the header calls for ST coordinates, four pairs of floating-point numbers follow: the texture-space coordinates for the (0,0), (NU,0), (0,NV), and (NU,NV) corners of the patch, respectively. If the header calls for colors, four four-component (red, green, blue, alpha) floating-point colors follow, one for each patch corner. The series of patches ends at end-of-file, or with a closebrace if incorporated in an object reference.  File: geomview, Node: OFF, Next: VECT, Prev: BBP and BEZ, Up: Object File Formats 4.2.5 OFF Files --------------- The conventional suffix for `OFF' files is `.off'. Syntax: [ST][C][N][4][n]OFF # Header keyword [NDIM] # Space dimension of vertices, present only if nOFF NVERTICES NFACES NEDGES # NEdges not used or checked X[0] Y[0] Z[0] # Vertices, possibly with normals, # colors, and/or texture coordinates, in that order, # if the prefixes `N', `C', `ST' # are present. # If 4OFF, each vertex has 4 components, # including a final homogeneous component. # If nOFF, each vertex has NDIM components. # If 4nOFF, each vertex has NDIM+1 components. ... X[NVERTICES-1] Y[NVERTICES-1] Z[NVERTICES-1] # Faces # NV = # vertices on this face # V[0] ... V[NV-1]: vertex indices # in range 0..NVERTICES-1 NV V[0] V[1] ... V[NV-1] COLORSPEC ... # COLORSPEC continues past V[NV-1] # to end-of-line; may be 0 to 4 numbers # nothing: default # integer: colormap index # 3 or 4 integers: RGB[A] values 0..255 # 3 or 4 floats: RGB[A] values 0..1 `OFF' files (name for "object file format") represent collections of planar polygons with possibly shared vertices, a convenient way to describe polyhedra. The polygons may be concave but there's no provision for polygons containing holes. An `OFF' file may begin with the keyword `OFF'; it's recommended but optional, as many existing files lack this keyword. Three ASCII integers follow: NVERTICES, NFACES, and NEDGES. Thease are the number of vertices, faces, and edges, respectively. Current software does not use nor check NEDGES; it needn't be correct but must be present. The vertex coordinates follow: dimension * NVERTICES floating-point values. They're implicitly numbered 0 through NVERTICES-1. dimension is either 3 (default) or 4 (specified by the key character `4' directly before `OFF' in the keyword). Following these are the face descriptions, typically written with one line per face. Each has the form N VERT1 VERT2 ... VERTN [COLOR] Here N is the number of vertices on this face, and VERT1 through VERTN are indices into the list of vertices (in the range 0..NVERTICES-1). The optional COLOR may take several forms. Line breaks are significant here: the COLOR description begins after VERTN and ends with the end of the line (or the next # comment). A COLOR may be: nothing the default color one integer index into "the" colormap; see below three or four integers RGB and possibly alpha values in the range 0..255 three or four floating-point numbers RGB and possibly alpha values in the range 0..1 For the one-integer case, the colormap is currently read from the file `cmap.fmap' in Geomview's `data' directory. Some better mechanism for supplying a colormap is likely someday. The meaning of "default color" varies. If no face of the object has a color, all inherit the environment's default material color. If some but not all faces have colors, the default is gray (R,G,B,A=.666). A `[ST][C][N][n]OFF BINARY' format is accepted; *Note Binary format::. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions (and texture coordinates or vertex colors or normals if `COFF'/`NOFF'/`CNOFF'/`STCNOFF'/etc. format). Exception: each face's vertex indices are followed by an integer indicating how many color components accompany it. Face color components must be floats, not integer values. Thus a colorless triangular face might be represented as int int int int int 3 17 5 9 0 while the same face colored red might be int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0  File: geomview, Node: VECT, Next: SKEL, Prev: OFF, Up: Object File Formats 4.2.6 VECT Files ---------------- The conventional suffix for `VECT' files is `.vect'. Syntax: [4]VECT NPOLYLINES NVERTICES NCOLORS NV[0] ... NV[NPOLYLINES-1] # number of vertices # in each polyline NC[0] ... NC[NPOLYLINES-1] # number of colors supplied # in each polyline VERT[0] ... VERT[NVERTICES-1] # All the vertices # (3*NVertices floats) COLOR[0] ... COLOR[NCOLORS-1] # All the colors # (4*NColors floats, RGBA) `VECT' objects represent lists of polylines (strings of connected line segments, possibly closed). A degenerate polyline can be used to represent a point. A `VECT' file begins with the key word `VECT' or `4VECT' and three integers: NLINES, NVERTICES, and NCOLORS. Here NLINES is the number of polylines in the file, NVERTICES the total number of vertices, and NCOLORS the number of colors as explained below. Next come NLINES 16-bit integers NV[0] NV[1] NV[2] ... NV[NLINES-1] giving the number of vertices in each polyline. A negative number indicates a closed polyline; 1 denotes a single-pixel point. The sum (of absolute values) of the NV[I] must equal NVERTICES. Next come NLINES more 16-bit integers NC[I]: the number of colors in each polyline. Normally one of three values: 0 No color is specified for this polyline. It's drawn in the same color as the previous polyline. 1 A single color is specified. The entire polyline is drawn in that color. abs(NV[I]) Each vertex has a color. Either each segment is drawn in the corresponding color, or the colors are smoothly interpolated along the line segments, depending on the implementation. Next come NVERTICES groups of 3 or 4 floating-point numbers: the coordinates of all the vertices. If the keyword is 4VECT then there are 4 values per vertex. The first abs(NV[0]) of them form the first polyline, the next abs(NV[1]) form the second and so on. Finally NCOLORS groups of 4 floating-point numbers give red, green, blue and alpha (opacity) values. The first NC[0] of them apply to the first polyline, and so on. A VECT BINARY format is accepted; *note Binary format::. The binary format exactly follows the ASCII format, with 32-bit Big-Endian integers where ordinary integer numbers appear, and with 16-bit Big-Endian integers where 16-bit integers appear; 32-bit Big-Endian floats where real values appear. BIG FAT NOTE: The vertex counts NV[I] and the color counts NC[I] are 16-bit Big-Endian integers.  File: geomview, Node: SKEL, Next: SPHERE, Prev: VECT, Up: Object File Formats 4.2.7 SKEL Files ---------------- `SKEL' files represent collections of points and polylines, with shared vertices. The conventional suffix for `SKEL' files is `.skel'. Syntax: [C][4][n]SKEL [NDIM] # Vertex dimension, present only if nSKEL NVERTICES NPOLYLINES X[0] Y[0] Z[0] # Vertices # if 4SKEL, each vertex has 4 components # if nSKEL, each vertex has NDim components # if C[4][n]SKEL vertex coordinates are # followed by an RGBA color specification ... X[NVERTICES-1] Y[NVERTICES-1] Z[NVERTICES-1] # Polylines # NV = # vertices on this polyline (1 = point) # V[0] ... V[NV-1]: vertex indices # in range 0..NVERTICES-1 NV V[0] V[1] ... V[NV-1] [COLORSPEC] ... # COLORSPEC continues past V[NV-1] # to end-of-line; may be nothing, or 3 or 4 numbers. # nothing: default color # 3 or 4 floats: RGB[A] values 0..1 The syntax resembles that of `OFF' files, with a table of vertices followed by a sequence of polyline descriptions, each referring to vertices by index in the table. Each polyline has an optional color. For `nSKEL' objects, each vertex has NDIM components. For `4nSKEL' objects, each vertex has NDIM+1 components; the final component is the homogeneous divisor. A [4][N]SKEL BINARY format is accepted; *Note Binary format::. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions. Exception: each polyline's vertex indices are followed by an integer indicating how many color components accompany it. Polyline color components must be floats, not integer values. Thus a colorless polyline with 3 vertices might be represented as int int int int int 3 17 5 9 0 while the same polyline colored red might be int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0  File: geomview, Node: SPHERE, Next: INST, Prev: SKEL, Up: Object File Formats 4.2.8 SPHERE Files ------------------ The conventional suffix for `SPHERE' files is `.sph'. [ST][E|H|S]SPHERE # Keyword # auto-generated texture co-ordinates, only allowed with _ST_SPHERE objects [SINUSOIDAL|CYLINDRICAL|RECTANGULAR|STEREOGRAPHIC|ONEFACE] # next four fields are required RADIUS XCENTER YCENTER ZCENTER The key word is `[ST][E|H|S]SPHERE'. The optional prefix characters mean: `ST' The sphere carries automatically generated texture co-ordinates. See below. `E' The sphere lives in Euclidean space. `H' The sphere lives in Hyperbolic space. *Note Non-Euclidean Geometry::. `S' The sphere lives in spherical space. *Note Non-Euclidean Geometry::. Sphere objects are drawn using meshes which are rectangular in a polar co-ordinate system, with the equatorial plane parallel to the `x,y'-plane. Their smoothness, and the time taken to draw them, depends on the setting of the dicing level, 10x10 by default. From Geomview, the Appearance panel, the `ad' keyboard command, or a `dice nu nv' Appearance attribute sets this. Texture co-ordinates are generated for `STSPHERE' objects; the keyword following the initial `STSPHERE' keyword defines the way this is done. It follows the conventions of the `mktxmesh' Perl-script which comes with the _Orrery_. SINUSOIDAL sinusoidal equal-area projection CYLINDRICAL cylindrical proj: S is the longitude, T is the latitude RECTANGULAR rectangular proj: S is the longitude, T is `sin(latitude)' (i.e. `z' co-ordinate in the sphere's co-ordinate system) STEREOGRAPHIC stereographic projection from the south (`z=-1') pole ONEFACE stretch orthographic view of `+y' hemisphere over both, mirroring  File: geomview, Node: INST, Next: LIST, Prev: SPHERE, Up: Object File Formats 4.2.9 INST Files ---------------- The conventional suffix for a `INST' file is `.inst'. There is no INST BINARY format. An `INST' applies a 4x4 (or (N+1)x(N+1) in the context of ND-viewing) transformation to another OOGL object. It begins with `INST' followed by these sections which may appear in any order: geom OOGL-OBJECT specifies the OOGL object to be instantiated. *Note References::, for the syntax of an OOGL-OBJECT. The keyword `unit' is a synonym for `geom'. transform ["{"] `4x4 transform' ["}"] specifies a single transformation matrix. Either the matrix may appear literally as 16 numbers, or there may be a reference to a "transform" object, i.e. "<" file-containing-4x4-matrix or ":" symbol-representing-transform-object Another way to specify the transformation is transforms OOGL-OBJECT The OOGL-OBJECT must be a `TLIST' object (list of transformations) object, or a `LIST' whose members are ultimately `TLIST' objects. In effect, the `transforms' keyword takes a collection of 4x4 matrices and replicates the `geom' object, making one copy for each 4x4 matrix. If no `transform' nor `transforms' keyword appears, no transformation is applied (actually the identity is applied). You could use this for, e.g., wrapping an appearance around an externally-supplied object, though a single-membered LIST would do this more efficiently. *Note Transformation matrices::, for the matrix format. When replicating a single geometry by means of a `TLIST' object (see `transforms' above) it may be useful to transform texture co-ordinates by another list of transformations; that list can be specified by txtransforms TLIST-OBJECT The number of texture transformations must match the number of geometry transformations. The `SPHERE' object (*note Sphere Objects: SPHERE.) uses this technique to generate an entire textured sphere out of some fraction of a sphere (usually one octant). A single (N+1)-dimensional transformation can be specified by ntransform ["{"] N+1 N+1 `(N+1)x(N+1) floats' ["}"] This gives a single N+1-dimensional transformation matrix. Either the matrix may appear literally as (N+1)x(N+1) numbers, or there may be a reference to an `ntransform' object, i.e. "<" file-containing-(N+1)x(N+1)-matrix or ":" symbol-representing-ntransform-object *Note ND Transformation matrices::, for the matrix format. Two more INST fields are accepted: `location' and `origin'. Note that `location' as well as `origin' are ignored if this `INST' object carries an `ntransform'. Also, if ND-viewing is active (`ND-axes' command, *note GCL::) then `INST' objects with `origin' unequal to `local' will not be drawn, though the `location' stuff may work (or not). location [global or camera or ndc or screen or local] Normally an INST specifies a position relative to its parent object; the `location' field allows putting an object elsewhere. * `location global' attaches the object to the global (a.k.a. universe) coordinate system - the same as that in which geomview's World objects, alien geometry, and cameras are placed. * `location camera' places the object relative to the camera. (Thus if there are multiple views, it may appear in a different spatial position in each view.) The center of the camera's view is along its negative Z axis; positive X is rightward, positive Y upward. Normally the units of camera space are the same as global coordinates. When a camera is reset, the global origin is at (0,0,-3.0). * `location ndc' places the object relative to the normalized unit cube into which the camera's projection (perspective or orthographic) maps the visible world. X, Y, and Z are each in the range from -1 to +1, with Z = -1 the near and Z = +1 the far clipping plane, and X and Y increasing rightward and upward respectively. Thus something like INST transform 1 0 0 0 0 1 0 0 0 0 1 0 -.9 -.9 -.999 1 location ndc geom < label.vect pastes `label.vect' onto the lower left corner of each window, and in front of nearly everything else, assuming `label.vect''s contents lie in the positive quadrant of the X-Y plane. It's tempting to use -1 rather than -.999 as the Z component of the position, but that may put the object just nearer than the near clipping plane and make it (partially) invisible, due to floating-point error. * `location screen' places the object in screen coordinates. The range of Z is still -1 through +1 as for ndc coordinates; X and Y are measured in pixels, and range from (0,0) at the _lower left_ corner of the window, increasing rightward and upward. `location local' is the default; the object is positioned relative to its parent. origin [global or camera or ndc or screen or local] x y z The `origin' field translates the contents of the INST to place the origin at the specified point of the given coordinate system. Unlike `location', it doesn't change the orientation, only the choice of origin. Both `location' and `origin' can be used together. So for example { INST location screen origin ndc 0 0 -.99 geom { < xyz.vect } transform { 100 0 0 0 0 100 0 0 0 0 -.009 0 0 0 0 1 } } places xyz.vect's origin in the center of the window, just beyond the near clipping plane. The unit-length X and Y edges are scaled to be just 100 screen units - pixels - long, regardless of the size of the window. * Menu: * INST Examples:: Some example of `INST' Files.  File: geomview, Node: INST Examples, Prev: INST, Up: INST 4.2.9.1 INST Examples ..................... Here are some examples of `INST' files INST unit < xyz.vect transform { 1 0 0 0 0 1 0 0 0 0 1 0 1 3 0 1 } { appearance { +edge material { edgecolor 1 1 0 } } INST geom < mysurface.quad } {INST transform {: T} geom { } } geom { # stuff replicated by all the above matrices ... } } This one resembles the `origin' example in the section above, but makes the X and Y edges be 1/4 the size of the window (1/4, not 1/2, since the range of ndc X and Y coordinates is -1 to +1). { INST location ndc geom { < xyz.vect } transform { .5 0 0 0 0 .5 0 0 0 0 -.009 0 0 0 -.99 1 } }  File: geomview, Node: LIST, Next: TLIST, Prev: INST, Up: Object File Formats 4.2.10 LIST Files ----------------- The conventional suffix for a `LIST' file is `.list'. A list of OOGL objects Syntax: LIST OOGL-OBJECT OOGL-OBJECT ... Note that there's no explicit separation between the oogl-objects, so they should be enclosed in curly braces ({ }) for sanity. Likewise there's no explicit marker for the end of the list; unless appearing alone in a disk file, the whole construct should also be wrapped in braces, as in: { LIST { QUAD ... } { < xyz.quad } } A `LIST' with no elements, i.e. `{ LIST }', is valid, and is the easiest way to create an empty object. For example, to remove a symbol's definition you might write { define somesymbol { LIST } }  File: geomview, Node: TLIST, Next: GROUP, Prev: LIST, Up: Object File Formats 4.2.11 TLIST Files ------------------ The conventional suffix for a `TLIST' file is `.grp' ("group") or or `.prj' ("projective" matrices). Collection of 4x4 matrices, used in the `transforms' section of and `INST' object. Syntax: TLIST # key word <4x4 matrix (16 floats)> ... # Any number of 4x4 matrices `TLIST's are used only within the `transforms' clause of an `INST' object. They cause the `INST's `geom' object to be instantiated once under each of the transforms in the `TLIST'. The effect is like that of a `LIST' of `INST's each with a single transform, and all referring to the same object, but is more efficient. Be aware that a `TLIST' is a kind of geometry object, distinct from a `transform' object. Some contexts expect one type of object, some the other. For example in INST transform { : MYT } geom { ... } MYT must be a transform object, which might have been created with the GCL (read transform { define myT 1 0 0 1 ... }) while in INST transforms { : MYTS } geom { ... } or INST transforms { LIST {: MYTS} {< more.prj} } geom { ... } MYTS must be a geometry object, defined e.g. with (read geometry { define MYTS { TLIST 1 0 0 1 ... } }) A `TLIST BINARY' format is accepted. Binary data begins with a 32-bit integer giving the number of transformations, followed by that number of 4x4 matrices in 32-bit floating-point format. The order of matrix elements is the same as in the ASCII format.  File: geomview, Node: GROUP, Next: DISCGRP, Prev: TLIST, Up: Object File Formats 4.2.12 GROUP Files ------------------ This format is obsolete, but is still accepted. It combined the functions of `INST' and `TLIST', taking a series of transformations and a single Geom (`unit') object, and replicating the object under each transformation. GROUP ... < matrices > ... unit { OOGL-OBJECT } is still accepted and effectively translated into INST transforms { TLIST ... ... } unit { OOGL-OBJECT }  File: geomview, Node: DISCGRP, Next: COMMENT, Prev: GROUP, Up: Object File Formats 4.2.13 DISCGRP Files -------------------- This format is for discrete groups, such as appear in the theory of manifolds or in symmetry patterns. This format has its own man page. See discgrp(5).  File: geomview, Node: COMMENT, Prev: DISCGRP, Up: Object File Formats 4.2.14 COMMENT Objects ---------------------- The COMMENT object is a mechanism for encoding arbitrary data within an OOGL object. It can be used to keep track of data or pass data back and forth between external modules. Syntax: COMMENT # key word NAME TYPE # individual name and type specifier { ... } # arbitrary data The data, which must be enclosed by curly braces, can include anything except unbalanced curly braces. The TYPE field can be used to identify data of interest to a particular program through naming conventions. `COMMENT' objects are intended to be associated with other objects through inclusion in a `LIST' object. (*Note LIST::.) The "#" OOGL comment syntax does not suffice for data exchange since these comments are stripped when an OOGL object is read in to Geomview. The `COMMENT' object is preserved when loaded into Geomview and is written out intact. Here is an example associating a WorldWide Web URL with a piece of geometry: { LIST { < Tetrahedron} {COMMENT GCHomepage HREF { http://www.geomview.org/ }} } A binary `COMMENT' format is accepted. Its format is not consistent with the other OOGL binary formats. *Note Binary format::. The `name' and `type' are followed by N BYTE1 BYTE2 ... BYTEN instead of data enclosed in curly braces.  File: geomview, Node: Non-geometric objects, Prev: Object File Formats, Up: OOGL File Formats 4.3 Non-geometric objects ========================= The syntax of these objects is given in the form used in *Note References::, where "quoted" items should appear literally but without quotes, square bracketed ([ ]) items are optional, and | separates alternative choices. * Menu: * appearance:: Appearance objects. * image:: Image objects. * transform:: Transformation matrices. * ntransform:: N-dimensional transformation matrices. * camera:: Cameras. * window:: Windows.  File: geomview, Node: appearance, Next: image, Prev: Non-geometric objects, Up: Non-geometric objects 4.3.1 Appearance Objects ------------------------ Appearances are OOGL objects of their own right, which simply means that it is possible to give them symbolic names (*note References::). There are other sections dealing with appearance details. *Note Appearances::.  File: geomview, Node: image, Next: transform, Prev: appearance, Up: Non-geometric objects 4.3.2 Image Objects ------------------- Image objects are used to specify pixmap data for either textures (*note Texture Mapping::), or for background images of cameras (*note Camera objects: camera.). At the time of this writing images are comprised of 1 to 4 channels, a channel provides a single number in the range from 0 to `maxval' for each pixel; and `maxval' is tied to 255. The interpretation of the image data depending on the number of channels is like follows: #Channels Channel No. Interpretation -------------------------------------------------------------------------- 1 1 greyscale or luminance data 2 1 greyscale or luminance data ` ' 2 alpha channel (0: transparent, `maxval': opaque) 3 1 red channel `' 2 green channel `' 3 blue channel 4 1 red channel `' 2 green channel `' 3 blue channel `' 4 alpha channel (0: transparent, `maxval': opaque) Image data can be specified inline (embedded into the current data stream) or via file references; in both cases the data is read in and interpreted at the time the image object is parsed. _This is different from the old (and deprecated) texture image specification, where the the image data on-disk would eventually be re-read by Geomview_. The general syntax of image objects is like follows: ::= [ "{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "image" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines an image named , setting its value from the stuff which follows) | "<" (meaning: read image from that file) | ":" (meaning: use variable NAME, defined elsewhere; if undefined the image carries no data) | (actual stuff defining the image; image data must come last, after defining the width and height and number of channels) "width" (width of the image, auto-detected from image data if possible) "height" (height of the image, auto-detected from image data if possible) "channels" (number of channels, auto-detected from image data and `data' specifications, if possible) "maxval" (unsupported, must be `255' if specified) "data DESTMASK [FILTER] [{] < FILENAME [}]" "data DESTMASK [FILTER] DATASIZE [{][\n]LITERAL_IMAGE_DATA[}]" (either external or embedded image data, see below for a detailed description of the meaning of _MASK_ and _FILTER_. An image can (and has, in general) multiple data sections.) [ "}" ] (matching curly brace) Details concerning the image data specification: `DESTMASK' This is a bit-field describing where the specified image data should be placed in the destination pixmap. The bit-field is specified by an integer in one of the known formats (decimal, octal, hexadecimal). The channels of the source data are always enumbered consecutively. If, e.g. `FILENAME' or `LITERAL_IMAGE_DATA' specify a three-channel (probably RGB ...) image and `DESTMASK' equals `0xD' (i.e. bit 1 is 0), then the 3rd channel of the source pixmap would be placed in the 4th channel of the destination image object (the alpha channel), the 2nd source channel would determine the `blue' destination value and the 1st source channel the `red' destination value. The number of channels of the source data always has to match the number of bits set in `DESTMASK'. Exception: if the source pixmap has only one channel, then it can be used to fill any number of destination channels; all channels specified in `DESTMASK' are filled with the data of the single channel source pixmap. Geomview knows the following symbolic constants, which can be used instead of specifying the `DESTMASK' bit-field numerically: `LUMINANCE' same as `1', `0x1', `\01' `LUMINANCE_ALPHA' same as `3', `0x3', `\03' `RGB' same as `7', `0x7', `\07' `RGBA' same as `15', `0xf', `\017' `ALPHA' depends on the context: the absolute number of channels must be known; i.e. `data ALPHA ...' must be prepended by something determining the number of channels of the image, e.g. ... data RGB ... data ALPHA ... is valid, but data ALPHA ... is not valid, because Geomview has not means to determine the destination channel from the context. `AUTO' PGM image data is interpreted as single grey-scale channel, RGB PNM data as RGB image data. `AUTO' cannot work with `raw' image data. `FILTER' The `FILTER' specification is optional. If it is missing, then Geomview tries to determine the image type from the `FILENAME' suffix. If there is no suffix or the suffix is unknown, or for embedded image data, Geomview is able to auto-detectc SGI image file formats (for historical reasons ...) and NetPBM image formats (for practical reasons). The auto-detection of NetPBM formats includes the new "PAM" image format which allows (among other things) to store an alpha channel together with the luminance or RGB data. Likewise, the final output of any of the specified filters must either be in SGI image file format, or specify a PAM, PNM or PGM image. If the image file format cannot be determined by either the filenmae suffix or the filter specification or by auto-deteciong of SGI or NetPBM data, then Geomview assume that it is raw-data. See below. The decompression filters may be prepended to either one of the know image formats or an explicitly specified filter, e.g. the following is valid: data LUMINANCE raw.gzip { < gzippedgreymapfile } The above should be equivalent to data LUMINANCE raw { < greymapfile }, provided that the decompressed data carries single channel data, with the first pixel corresponding to the lower-left corner (because of the `raw' image format, see below). Geomview has builtin knowledge for the following filters/suffixes: Data Decompression `z' `gz' `gzip' data is piped through `gzip -dc' `bz2' `bzip2' data is piped through `bzip2 -dc' Image Formats `tiff' `tif' `TIFF' image file format. Only supported if the `tifftopnm' executable can be fond in the current excution path. `png' `PNG' image file format. Only supported if the `pngtopnm' executable can be fond in the current excution path. `jpg' `jpeg' `JPEG' image file format. Only supported if the `jpegtopnm' executable can be fond in the current excution path. `gif' `GIF' image file format. Only supported if the `giftoppm' executable can be fond in the current excution path. `raw' Raw image data; the number of channels must match the number of bits set in `DESTMASK'. Pixels are specified with 1 byte per channel. The pixels are organized in rows as `liminance[-alpha]' or `RGB[A]' samples. The left-most pixel is the first pixel in each data-row, the top-most image row must come first (this is just the same as the NetPBM convention, the image co-ordinate systems has its origin in the left/top corner, as usual). Explicitly Specified Filters If none of the suffixes specified above should match, then the suffix/filter is interpreted as an external filter program; the filter program must read from `STDIN' and write to `STDOUT'. The output must either be in SGI image format, or in PNM or PGM format. Otherwise the output data is interpreted as raw image data (see above). Something like the following should work, provided that the program `${HOME}/bin/bububfilter' exists, is executable and does something useful: ... data RGB "${HOME}/bin/bububfilter.bzip2" 7 { # binary data follows bububub } ... Note that - prior to feeding the data to the `bububfilter' - Geomview will try to decompress the stuff with `bzip2 -dc'. Missing image data: Normally, the number of image channels is determined automatically from the image `data' specifications; if the image specification carries an explicit number of channels via the `channels' keyword which exceeds the number of channels found in the image `data' specifications, or if the union of all `DESTMASK' specfications has holes, then missing luminance and RGB channels are initialized to 0, and a missing alpha-channel is initialized to `maxval', i.e. omitting the alpha channel data for an RGBA image is just the same as defining an RGB image.  File: geomview, Node: transform, Next: ntransform, Prev: image, Up: Non-geometric objects 4.3.3 Transform Objects ----------------------- Where a single 4x4 matrix is expected - as in the `INST' `transform' field, the camera's `camtoworld' transform and the Geomview `xform*' commands - use a transform object. Note that a transform is distinct from a `TLIST', which is a type of geometry. `TLIST's can contain one or more 4x4 transformations; "transform" objects must have exactly one. Why have both? In many places - e.g. camera positioning - it's only meaningful to have a single transform. Using a separate object type enforces this. Syntax for a transform object is ::= [ "{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "transform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) (interpreted as a 4x4 homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "}" ] (matching curly brace) The whole should be enclosed in { braces }. Braces are not essential if exactly one of the above items is present, so e.g. a 4x4 array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used: # Example 1: A GCL command to define a transform # called "fred" (read transform { transform define fred 1 0 0 0 0 1 0 0 0 0 1 0 -3 0 1 1 } ) # Example 2: A camera object using transform # "fred" for camera positioning # Given the definition above, this puts the camera at # (-3, 0, 1), looking toward -Z. { camera halfyfield 1 aspect 1.33 camtoworld { : fred } }  File: geomview, Node: ntransform, Next: camera, Prev: transform, Up: Non-geometric objects 4.3.4 ND-Transform Objects -------------------------- Where - in the context of ND-viewing - a single (N+1)x(N+1) matrix is expected - as in the `INST' `ntransform' field, or the `ND-xform*' (*note GCL::) commands - use an `ntransform' object. `ntransform' are NROWS x NCOLS transformation matrix where usually NROWS = N+1 in the context of N-dimensional objects and viewing. The homogeneous component of an `ntransform' sits at column zero (in contrast to ordinary `transform' objects where it is located at column three). `ntransform' objects operate on points of any dimension: if a point is to be transformed by an `ntransform' object and the dimension of the point does not match the number of rows of the `ntransform' object, then either the point is implicitly padded with zeros to match NROWS or the matrix is implicitly padded with ones down its diagonal (and zeros everywhere else) such that it will operate as identity on the excess dimensions of the input point. Syntax for an `ntransform' object is ::= [ "{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "ntransform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) NROWS NCOLS (number of rows and columns of the matrix, typically N+1 N+1, but any dimensions are possible) (interpreted as a NROWS x NCOLS homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the top row -- in contrast to the ordinary transform objects where the translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "}" ] (matching curly brace) The whole should be enclosed in { braces }. Braces are not necessarily essential, so e.g. two integers - NROWS NCOLS - followed by a NROWS x NCOLS array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used: # Example 1: A GCL command to define a `6x6' transform called # "fred", a mere translation by the vector `-3 0 1 1 0'. This # transform is meant for a five dimensional space, with an homogeneous # component a index zero. (read ntransform { ntransform define fred 6 6 1 -3 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 } ) # Example 2: Set the ND-xform of an object -- a geometry or a camera # cluster. Given the definition above, this puts the object at (-3 0 1 1 # 0) in the five dimensional space. (ND-xform-set focus : fred) # or (ND-xform-set g1 : fred)  File: geomview, Node: camera, Next: window, Prev: ntransform, Up: Non-geometric objects 4.3.5 cameras ------------- A camera object specifies the following properties of a camera: position and orientation specified by either a camera-to-world or world-to-camera transformation; this transformation does not include the projection, so it's typically just a combination of translation and rotation. Specified as a transform object, typically a 4x4 matrix. "focus" distance Intended to suggest a typical distance from the camera to the object of interest; used for default camera positioning (the camera is placed at (X,Y,Z) = (0,0,focus) when reset) and for adjusting field-of-view when switching between perspective and orthographic views. window aspect ratio True aspect ratio in the sense /. This normally should agree with the aspect ratio of the camera's window. Geomview normally adjusts the aspect ratio of its cameras to match their associated windows. near and far clipping plane distances Note that both must be strictly greater than zero. Very large / distance ratios cause Z-buffering to behave badly; part of an object may be visible even if somewhat more distant than another. field of view Specified in either of two forms. `fov' is the field of view - in degrees if perspective, or linear distance if orthographic - in the _shorter_ direction. `halfyfield' is half the projected Y-axis field, in world coordinates (not angle!), at unit distance from the camera. For a perspective camera, halfyfield is related to angular field: halfyfield = tan( Y_axis_angular_field / 2 ) while for an orthographic one it's simply: halfyfield = Y_axis_linear_field / 2 This odd-seeming definition is (a) easy to calculate with and (b) well-defined in both orthographic and perspective views. background color Arguably not a property of a camera, but of the scene. Nevertheless, as there is no "background" OOGL object, and the background color should not be a property of the drawing device, it can be specified here. At the time of this writing, however, the GUI always overrides the background color with its own settings. background image Same reasoning as above, only that the GUI does not override this setting. The image is centered at NDC co-ordinates `(0,0,-1)'; it is not resized, just painted behind everything else as is. *Note Image objects: image. The syntax for a camera is: ::= [ "camera" ] (optional keyword) [ "{" ] (opening brace, generally required) [ "define" ] "<" | ":" | (or any number of the following, in any order...) "perspective" {"0" | "1"} (default 1) (otherwise orthographic) "stereo" {"0" | "1"} (default 0) (otherwise mono) "worldtocam" (see transform syntax above) "camtoworld" (no point in specifying both camtoworld and worldtocam; one is constrained to be the inverse of the other) "halfyfield" (default tan 40/2 degrees) "fov" (angular field-of-view if perspective, linear field-of-view otherwise. Measured in whichever direction is smaller, given the aspect ratio. When aspect ratio changes -- e.g. when a window is reshaped -- "fov" is preserved.) "frameaspect" (X/Y) (default 1.333) "near" (default 0.1) "far" (default 10.0) "focus" (default 3.0) "bgcolor" (default 1/3 1/3 1/3 1) "bgimage" { } (default no background image) [ "}" ] (matching closebrace)  File: geomview, Node: window, Prev: camera, Up: Non-geometric objects 4.3.6 window ------------ A window object specifies size, position, and other window-system related information about a window in a device-independent way. The syntax for a window object is: window ::= [ "window" ] (optional keyword) [ "{" ] (curly brace, often required) (any of the following, in any order) "size" (size of the window) "position" (position & size) "noborder" (specifies the window should have no window border) "pixelaspect" (specifies the true visual aspect ratio of a pixel in this window in the sense xsize/ysize, normally 1.0. For stereo hardware which stretches the display vertically by a factor of 2, ``pixelaspect 0.5'' might do. The value is used when computing the projection of a camera associated with this window.) [ "}" ] (matching closebrace) Window objects are used in the Geomview `window' and `ui-panel' commands to set default properties for future windows or to change those of an existing window. *Note `(window ...)': window. *Note `(ui-panel ...)': ui-panel.  File: geomview, Node: Customization, Next: Modules, Prev: OOGL File Formats, Up: Top 5 Customization: `.geomview' files ********************************** When Geomview is started, it loads and executes commands in a system-wide startup file named `.geomview'. This file is in the `data' subdirectory of the Geomview distribution directory and contains GCL commands to configure Geomview in a way common to all users on the system. Next, Geomview looks for the file `~/.geomview' (`~' stands for your home directory). You can use this to configure your own default Geomview behavior to suit your tastes. After reading `~/.geomview', Geomview looks for a file named `.geomview' in the current directory. If such a file exists Geomview reads it, unless it is the same as `~/.geomview' (which would be the case if you are running Geomview from your home directory). You can use the current directory's `.geomview' to create a Geomview customization specific to a certain project. You can use `.geomview' files to control all kinds of things about Geomview. They can contain any valid GCL statements. Especially useful is the `ui-panel' command which controls the initial placement of Geomview's panels. For an example see the system-wide `.geomview' file mentioned above. *Note GCL::. *Note `(ui-panel ...)': ui-panel. It is a good idea to enclose all the commands you put in a `.geomview' file in a `progn' statement in order to cause Geomview to execute them all at once. Otherwise Geomview might execute them sequentially over the first few refresh cycles after starting up. To change, e.g. the focus policy of the camera window such that they pick up the focus policy of the window manager (instead of being activated when the mouse cursor crosses the window), you could put the following in your `~/.geomview' file: (progn (ui-cam-focus focus-change) ... # other stuff ) You can put any valid `GCL' command into your `.geomview' files,*note GCL::. *Note `(progn ...)': progn. *Note `(ui-cam-focus ...)': ui-cam-focus.  File: geomview, Node: Modules, Next: GCL, Prev: Customization, Up: Top 6 External Modules ****************** An external module is a program that interacts with Geomview. A module communicates with Geomview through GCL and can control any apsect of Geomview that you can control through Geomview's user interface. In many cases an external module is a specialized program that implements some mathematical algorithm that creates a geometric object that changes shape as the algorithm progresses. The module informs Geomview of the new object shape at each step, so the object appears to evolve with time in the Geomview window. In this way Geomview serves as a _display engine_ for the module. An external module may be interactive. It can respond to mouse and keyboard events that take place in a Geomview window, thus extending the capability of Geomview itself. * Menu: * Interface:: How External Modules Interface with Geomview. * Example1:: Simple External Module. * Example2:: Simple External Module with FORMS Control Panel. * XForms:: The XForms library. * Example3:: External Module with Bi-Directional Communication. * Example4:: Simple Tcl/Tk Module Demonstrating Picking. * Module Installation:: Module Installation.  File: geomview, Node: Interface, Next: Example1, Prev: Modules, Up: Modules 6.1 How External Modules Interface with Geomview ================================================ External modules appear in the _Modules_ browser in Geomview's _Main_ panel. To run a module, click the left mouse button on the module's entry in the browser. While the module is running, an additional line for that module will appear in red in the browser. This line begins with a number in brackets, which indicates the _instace_ number of the module. (For some modules it makes sense to have more than one instance of the module running at the same time.) You can kill an external module by clicking on its red instance entry. By default when Geomview starts, it displays all the modules that have been installed on your system. For instructions on installing a module on your system so that it will appear in the _Modules_ browser every time Geomview is run by anyone on your system, *Note Module Installation::. When Geomview invokes an external module, it creates pipes connected to the module's standard input and output. (Pipes are like files except they are used for communication between programs rather than for storing things on a disk.) Geomview interprets anything that the module writes to its standard output as a GCL command. Likewise, if the external module requests any data from Geomview, Geomview writes that data to the module's standard input. Thus all a module has to do in order to communicate with Geomview is write commands to standard output and (optionally) receive data on standard input. Note that this means that the module cannot use standard input and output for communicating with the user. If a module needs to communicate with the user it can do so either through a control panel of its own or else by responding to certain events that it finds out about from Geomview.  File: geomview, Node: Example1, Next: Example2, Prev: Interface, Up: Modules 6.2 Example 1: Simple External Module ===================================== This section gives a very simple external module which displays an oscillating mesh. To try out this example, make a copy of the file `example1.c' (it is distributed with Geomview in the `doc' subdirectory) in your directory and compile it with the command cc -o example1 example1.c -lm Then put the line (emodule-define "Example 1" "./example1") in a file called `.geomview' in your current directory. Then invoke Geomview; it is important that you compile the example program, create the `.geomview' file, and invoke Geomview all in the same directory. You should see "Example 1" in the _Modules_ browser of Geomview's _Main_ panel; click on this entry in the browser to start the module. A surface should appear in your camera window and should begin oscillating. You can stop the module by clicking on the red "[1] Example 1" line in the _Modules_ browser. /* * example1.c: oscillating mesh * * This example module is distributed with the Geomview manual. * If you are not reading this in the manual, see the "External * Modules" chapter of the manual for more details. * * This module creates an oscillating mesh. */ #include #include /* F is the function that we plot */ float F(x,y,t) float x,y,t; { float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); } main(argc, argv) char **argv; { int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t, dt; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Geomview setup. We begin by sending the command * (geometry example { : foo}) * to Geomview. This tells Geomview to create a geom called * "example" which is an instance of the handle "foo". */ printf("(geometry example { : foo })\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) { UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); } } /* UpdateMesh sends one mesh iteration to Geomview. This consists of * a command of the form * (read geometry { define foo * MESH * ... * }) * where ... is the actual data of the mesh. This command tells * Geomview to make the value of the handle "foo" be the specified * mesh. */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; { int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry { define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include #include /* for struct timeval below */ #include "forms.h" /* for FORMS library */ FL_FORM *OurForm; FL_OBJECT *VelocitySlider; float dt; /* F is the function that we plot */ float F(x,y,t) float x,y,t; { float r = sqrt(x*x+y*y); return(sin(r + t)*sqrt(r)); } /* SetVelocity is the slider callback procedure; FORMS calls this * when the user moves the slider bar. */ void SetVelocity(FL_OBJECT *obj, long val) { dt = fl_get_slider_value(VelocitySlider); } /* Quit is the "Quit" button callback procedure; FORMS calls this * when the user clicks the "Quit" button. */ void Quit(FL_OBJECT *obj, long val) { exit(0); } /* create_form_OurForm() creates the FORMS panel by calling a bunch of * procedures in the FORMS library. This code was generated * automatically by the FORMS designer program; normally this code * would be in a separate file which you would not edit by hand. For * simplicity of this example, however, we include this code here. */ create_form_OurForm() { FL_OBJECT *obj; FL_FORM *form; OurForm = form = fl_bgn_form(FL_NO_BOX,380.0,120.0); obj = fl_add_box(FL_UP_BOX,0.0,0.0,380.0,120.0,""); VelocitySlider = obj = fl_add_valslider(FL_HOR_SLIDER,20.0,30.0, 340.0,40.0,"Velocity"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_object_align(obj,FL_ALIGN_TOP); fl_set_call_back(obj,SetVelocity,0); obj = fl_add_button(FL_NORMAL_BUTTON,290.0,75.0,70.0,35.0,"Quit"); fl_set_object_lsize(obj,FL_LARGE_FONT); fl_set_call_back(obj,Quit,0); fl_end_form(); } main(argc, argv) char **argv; { int xdim, ydim; float xmin, xmax, ymin, ymax, dx, dy, t; int fdmask; static struct timeval timeout = {0, 200000}; xmin = ymin = -5; /* Set x and y */ xmax = ymax = 5; /* plot ranges */ xdim = ydim = 24; /* Set x and y resolution */ dt = 0.1; /* Time increment is 0.1 */ /* Forms panel setup. */ foreground(); create_form_OurForm(); fl_set_slider_bounds(VelocitySlider, 0.0, 1.0); fl_set_slider_value(VelocitySlider, dt); fl_show_form(OurForm, FL_PLACE_SIZE, TRUE, "Example 2"); /* Geomview setup. */ printf("(geometry example { : foo })\n"); fflush(stdout); /* Loop until killed. */ for (t=0; ; t+=dt) { fdmask = (1 << fileno(stdin)) | (1 << qgetfd()); select(qgetfd()+1, &fdmask, NULL, NULL, &timeout); fl_check_forms(); UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t); } } /* UpdateMesh sends one mesh iteration to Geomview */ UpdateMesh(xmin, xmax, ymin, ymax, xdim, ydim, t) float xmin, xmax, ymin, ymax, t; int xdim, ydim; { int i,j; float x,y, dx,dy; dx = (xmax-xmin)/(xdim-1); dy = (ymax-ymin)/(ydim-1); printf("(read geometry { define foo \n"); printf("MESH\n"); printf("%1d %1d\n", xdim, ydim); for (j=0, y = ymin; j #include "lisp.h" /* We use the OOGL lisp library */ #include "pickfunc.h" /* for PICKFUNC below */ #include "3d.h" /* for 3d geometry library */ /* boxstring gives the OOGL data to define the little box that * we draw at the pick point. NOTE: It is very important to * have a newline at the end of the OFF object in this string. */ char boxstring[] = "\ INST\n\ transform\n\ .04 0 0 0\n\ 0 .04 0 0\n\ 0 0 .04 0\n\ 0 0 0 1\n\ geom\n\ OFF\n\ 8 6 12\n\ \n\ -.5 -.5 -.5 # 0 \n\ .5 -.5 -.5 # 1 \n\ .5 .5 -.5 # 2 \n\ -.5 .5 -.5 # 3 \n\ -.5 -.5 .5 # 4 \n\ .5 -.5 .5 # 5 \n\ .5 .5 .5 # 6 \n\ -.5 .5 .5 # 7 \n\ \n\ 4 0 1 2 3\n\ 4 4 5 6 7\n\ 4 2 3 7 6\n\ 4 0 1 5 4\n\ 4 0 4 7 3\n\ 4 1 2 6 5\n"; progn() { printf("(progn\n"); } endprogn() { printf(")\n"); fflush(stdout); } Initialize() { extern LObject *Lpick(); /* This is defined by PICKFUNC below but must */ /* be used in the following LDefun() call */ LInit(); LDefun("pick", Lpick, NULL); progn(); { /* Define handle "littlebox" for use later */ printf("(read geometry { define littlebox { %s }})\n", boxstring); /* Express interest in pick events; see Geomview manual for explanation. */ printf("(interest (pick world * * * * nil nil nil nil nil))\n"); /* Define "pick" object, initially the empty list (= null object). * We replace this later upon receiving a pick event. */ printf("(geometry \"pick\" { LIST } )\n"); /* Make the "pick" object be non-pickable. */ printf("(pickable \"pick\" no)\n"); /* Turn off normalization, so that our pick object will appear in the * right place. */ printf("(normalization \"pick\" none)\n"); /* Don't draw the pick object's bounding box. */ printf("(bbox-draw \"pick\" off)\n"); } endprogn(); } /* The following is a macro call that defines a procedure called * Lpick(). The reason for doing this in a macro is that that macro * encapsulates a lot of necessary stuff that would be the same for * this procedure in any program. If you write a Geomview module that * wants to know about user pick events you can just copy this macro * call and change the body to suit your needs; the body is the last * argument to the macro and is delimited by curly braces. * * The first argument to the macro is the name of the procedure to * be defined, "Lpick". * * The next two arguments are numbers which specify the sizes that * certain arrays inside the body of the procedure should have. * These arrays are used for storing the face and path information * of the picked object. In this module we don't care about this * information so we declare them to have length 1, the minimum * allowed. * * The last argument is a block of code to be executed when the module * receives a pick event. In this body you can refer to certain local * variables that hold information about the pick. For details see * Example 3 in the Extenal Modules chapter of the Geomview manual. */ PICKFUNC(Lpick, 1, 1, { handle_pick(pn>0, &point, vn>0, &vertex, en>0, edge); }, /* version for picking Nd-objects (not documented here) */) handle_pick(picked, p, vert, v, edge, e) int picked; /* was something actually picked? */ int vert; /* was the pick near a vertex? */ int edge; /* was the pick near an edge? */ HPoint3 *p; /* coords of pick point */ HPoint3 *v; /* coords of picked vertex */ HPoint3 e[2]; /* coords of endpoints of picked edge */ { Normalize(&e[0]); /* Normalize makes 4th coord 1.0 */ Normalize(&e[1]); Normalize(p); progn(); { if (!picked) { printf("(geometry \"pick\" { LIST } )\n"); } else { /* * Put the box in place, and color it magenta if it's on a vertex, * yellow if not. */ printf("(xform-set pick { 1 0 0 0 0 1 0 0 0 0 1 0 %g %g %g 1 })\n", p->x, p->y, p->z); printf("(geometry \"pick\"\n"); if (vert) printf("{ appearance { material { diffuse 1 0 1 } }\n"); else printf("{ appearance { material { diffuse 1 1 0 } }\n"); printf(" { LIST { :littlebox }\n"); /* * If it's on an edge and not a vertex, mark the edge * with cyan boxes at the endpoins and a black line * along the edge. */ if (edge && !vert) { e[0].x -= p->x; e[0].y -= p->y; e[0].z -= p->z; e[1].x -= p->x; e[1].y -= p->y; e[1].z -= p->z; printf("{ appearance { material { diffuse 0 1 1 } }\n\ LIST\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { VECT\n\ 1 2 1\n\ 2\n\ 1\n\ %f %f %f\n\ %f %f %f\n\ 1 1 0 1\n\ }\n\ }\n", e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z, e[0].x, e[0].y, e[0].z, e[1].x, e[1].y, e[1].z); } printf(" }\n }\n)\n"); } } endprogn(); } Normalize(HPoint3 *p) { if (p->w != 0) { p->x /= p->w; p->y /= p->w; p->z /= p->w; p->w = 1; } } main() { Lake *lake; LObject *lit, *val; extern char *getenv(); Initialize(); lake = LakeDefine(stdin, stdout, NULL); while (!feof(stdin)) { /* Parse next lisp expression from stdin. */ lit = LSexpr(lake); /* Evaluate that expression; this is where Lpick() gets called. */ val = LEval(lit); /* Free the two expressions from above. */ LFree(lit); LFree(val); } } The code begins by defining procedures `progn()' and `endprogn()' which begin and end a Geomview `progn' group. The purpose of the Geomview `progn' command is to group commands together and cause Geomview to execute them all at once, without refreshing any graphics windows until the end. It is a good idea to group blocks of commands that a module sends to Geomview like this so that the user sees their cumulative effect all at once. Procedure `Initialize()' does various things needed at program startup time. It initializes the lisp library by calling `LInit()'. Any program that uses the lisp library should call this once before calling any other lisp library functions. It then calls `LDefun' to tell the library about our `pick' procedure, which is defined further down with a call to the `PICKFUNC' macro. Then it sends a bunch of setup commands to Geomview, grouped in a `progn' block. This includes defining a handle called `littlebox' that stores the geometry of the little box. Next it sends the command (interest (pick world * * * * nil nil nil nil nil)) which tells Geomview to notify us when a pick event happens. The syntax of this `interest' statement merits some explanation. In general `interest' takes one argument which is a (parenthesized) expression representing a Geomview function call. It specifies a type of call that the module is interested in knowing about. The arguments can be any particular argument values, or the special symbols `*' or `nil'. For example, the first argument in the `pick' expression above is `world'. This means that the module is interested in calls to `pick' where the first argument, which specifies the coordinate system, is `world'. A `*' is like a wild-card; it means that the module is interested in calls where the corresponding argument has any value. The word `nil' is like `*', except that the argument's value is not reported to the module. This is useful for cutting down on the amount of data that must be transmitted in cases where there are arguments that the module doesn't care about. The second, third, fourth, and fifth arguments to the `pick' command give the name, pick point coordinates, vertex coordinates, and edge coordinates of a pick event. We specify these by `*''s above. The remaining five arguments to the `pick' command give other information about the pick event that we do not care about in this module, so we specify these with `nil''s. For the details of the arguments to `pick', *Note GCL::. The `geometry' statement defines a geom called `pick' that is initially an empty list, specified as ` { LIST } '; this is the best way of specifying a null geom. The module will replace this with something useful by sending Geomview another `geometry' command when the user picks something. Next we arrange for the `pick' object to be non-pickable, and turn normalization off for it so that Geomview will display it in the size and location where we put it, rather than resizing and relocating it to fit into the unit cube. The next function in the file, `Lpick', is defined with a strange looking call to a macro called `PICKFUNC', defined in the header file `pickfunc.h'. This is the function for handling pick events. The reason we provide a macro for this is that that macro encapsulates a lot of necessary stuff that would be the same for the pick-handling function in any program. If you write a Geomview module that wants to know about user pick events you can just copy this macro call and change it to suit yours needs. In general the syntax for `PICKFUNC' is PICKFUNC(NAME, BLOCK, NDBLOCK) where NAME is the name of the procedure to be defined, in this case `Lpick'. The next argument, BLOCK, is a block of code to be executed when a pick event occurs. If BLOCK contains a return statement, then the returned value must be a pointer to a Lisp-object, that is of type `LObject *'. The last argument has the same functionality as the BLOCK argument, but is only invoked when picking objects in a higher dimensional world. `PICKFUNC' declares certain local variables in the body of the procedure. When the module receives a `(pick ...)' statement from Geomview, the procedure assigns values to these variables based on the information in the `pick' call (variables corresponding to `nil''s in the `(interest (pick ...))' are not given values). There is also a second variant of the `PICKFUNC' macro with a slightly different syntax: DEFPICKFUNC(HELPSTR, COORDSYS, ID, POINT, PN, VERTEX, VN, EDGE, EN, FACE, FN, PPATH, PPN, VI, EI, EIN, FI, BODY, NDBODY) `DEFPICKFUNC' can be used as well as `PICKFUNC', there is no functional differene with the exception that the name of the C-function is tied to `Lpick' when using `DEFPICKFUNC' and that the `(help pick)' GCL-command (*note `(help ...)': help.) would respond with echoing HELPSTR. The table below lists all variables defined in `PICKFUNC' In the context of ND-viewing `float' variants of the arguments apply: the BODY execution block sees the `HPoint3' variables, and the NDBODY block sees only flat one-dimensional arrays of `float'-type. In the ND-viewing context the co-ordinates passed to the pick function are still the 3-dimensional co-ordinates of the camera view-port where the pick occurred, but padded with zeroes on transformed back to the co-ordinate system specified by the second argument of the `pick' command. `char *coordsys;' A string specifying the coordinate system in which coordinates are given. In this example, this will always be `world' because of the `interest' call above. `char *id;' A string specifying the name of the picked geom. `HPoint3 point; int pn;' `float *point; int pn;' `point' is an `HPoint3' structure giving the coordinates of the picked point. `HPoint3' is a homogeneous point coordinate representation equivalent to an array of 4 floats. `pn' tells how many coordinates have been written into this array; it will always be either `0', `4' or greater than `4'. If it is greater than `4', then the NDBODY instruction block is invoked and in this case `point' is a flat array of `pn' many `float's. A value of zero means no point was picked, i.e. the user clicked the right mouse button while the cursor was not pointing at a geom. In this case the ordinary BLOCK 3d instruction block is executed. `HPoint3 vertex; int vn;' `float *vertex; int vn;' `vertex' is an `HPoint3' structure giving the coordinates of the picked vertex, if the pick point was near a vertex. `vn' tells how many coordinates have been written into this array; it will always be either `0' or greater equal `4'. A value of zero means the pick point was not near a vertex. In the context of ND-viewing `vertex' will be an array of `vn' `float's and `vn' will be equal to `pn'. `HPoint3 edge[2]; int en;' `float *edge; int en;' `edge' is an array of two `HPoint3' structures giving the coordinates of the endpoints of the picked edge, if the pick point was near an edge. `en' tells how many coordinates have been written into this array; it will always be `0' or greater equal `8'. A value of zero means the pick point was not near an edge. In the context of ND-viewing `edge' will be a flat one-dimensional array of `en' many `float's: the first `pn' `float's define the first vertex, and the second `pn' many `float's define the second vertex; `en' will be two times `pn'. In this example module, the remaining variables will never be given values because their values in the `interest' statement were specified as `nil'. `HPoint3 face[]; int fn;' `float *face; int fn;' `face' is a variable length array of FN `HPoint3''s. `face' gives the coordinates of the vertices of the picked face. `fn' tells how many coordinates have been written into this array; it will always be either `0' or a multiple of `pn'. A value of zero means the pick point was not near a face. In the context of ND-viewing `face' is a flat one-dimensional array of `fn' many floats of which each vertex occupies `pn' many components. `int ppath[]; int ppn;' `ppath' is an array of MAXPATHLEN `int''s. `ppath' gives the path through the OOGL heirarchy to the picked primitive. `pn' tells how many integers have been written into this array; it will be at most MAXPATHLEN. A path of {3,1,2}, for example, means that the picked primitive is "subobject number 2 of subobject number 1 of object 3 in the world". `int vi;' `vi' gives the index of the picked vertex in the picked primitive, if the pick point was near a vertex. `int ei[2]; int ein' The `ei' array gives the indices of the endpoints of the picked edge, if the pick point was near a vertex. `ein' tells how many integers were written into this array. It will always be either 0 or 2; a value of 0 means the pick point was not near an edge. `int fi;' `fi' gives the index of the picked face in the picked primitive, if the pick point was near a face. The `handle_pick' procedure actually does the work of dealing with the pick event. It begins by normalizing the homogeneous coordinates passed in as arguments so that we can assume the fourth coordinate is 1. It then sends GCL commands to define the `pick' object to be whatever is appropriate for the kind of pick recieved. See *note OOGL File Formats::, and *note GCL::, for an explanation of the format of the data in these commands. The main program, at the bottom of the file, first calls `Initialize()'. Next, the call to `LakeDefine' defines the `Lake' that the lisp library will use. A `Lake' is a structure that the lisp library uses internally as a type of communiation vehicle. (It is like a unix stream but more general, hence the name.) This call to `LakeDefine' defines a `Lake' structure for doing I/O with `stdin' and `stdout'. The third argument to `LakeDefine' should be `NULL' for external modules (it is used by Geomview). Finally, the program enters its main loop which parses and evaluates expressions from standard input.  File: geomview, Node: Example4, Next: Module Installation, Prev: Example3, Up: Modules 6.6 Example 4: Simple Tcl/Tk Module Demonstrating Picking ========================================================= It's not necessary to write a Geomview module in C. The only requirement of an external module is that it send GCL commands to its standard output and expect responses (if any) on its standard input. An external module can be written in C, perl, tcl/tk, or pretty much anything. As an example, assuming you have Tcl/Tk version 4.0 or later, here's an external module with a simple GUI which demonstrates interaction with geomview. This manual doesn't discuss the Tcl/Tk language; see the good book on the subject by its originator John Ousterhout, published by Addison-Wesley, titled _Tcl and the Tk Toolkit_. The `#!' on the script's first line causes the system to interpret the script using the Tcl/Tk `wish' program; you might have to change its first line if that's in some location other than /usr/local/bin/wish4.0. Or, you could define it as a module using (emodule-define "Pick Demo" "wish pickdemo.tcl") in which case `wish' could be anywhere on the UNIX search path. #! /usr/local/bin/wish4.0 # We use "fileevent" below to have "readsomething" be called whenever # data is available from standard input, i.e. when geomview has sent us # something. It promises to include a trailing newline, so we can use # "gets" to read the geomview response, then parse its nested parentheses # into tcl-friendly {} braces. proc readsomething {} { if {[gets stdin line] < 0} { puts stderr "EOF on input, exiting..." exit } regsub -all {\(} $line "\{" line regsub -all {\)} $line "\}" line # Strip outermost set of braces set stuff [lindex $line 0] # Invoke handler for whichever command we got. Could add others here, # if we asked geomview for other kinds of data as well. switch [lindex $stuff 0] { pick {handlepick $stuff} rawevent {handlekey $stuff} } } # Fields of a "pick" response, from geomview manual: # (pick COORDSYS GEOMID G V E F P VI EI FI) # The pick command is executed internally in response to pick # events (right mouse double click). # # COORDSYS = coordinate system in which coordinates of the following # arguments are specified. This can be: # world: world coord sys # self: coord sys of the picked geom (GEOMID) # primitive: coord sys of the actual primitive within # the picked geom where the pick occurred. # GEOMID = id of picked geom # G = picked point (actual intersection of pick ray with object) # V = picked vertex, if any # E = picked edge, if any # F = picked face # P = path to picked primitive [0 or more] # VI = index of picked vertex in primitive # EI = list of indices of endpoints of picked edge, if any # FI = index of picked face # Report when user picked something. # proc handlepick {pick} { global nameof selvert seledge order set obj [lindex $pick 2] set xyzw [lindex $pick 3] set fv [lindex $pick 6] set vi [lindex $pick 8] set ei [lindex $pick 9] set fi [lindex $pick 10] # Report result, converting 4-component homogeneous point into 3-space point. set w [lindex $xyzw 3] set x [expr [lindex $xyzw 0]/$w] set y [expr [lindex $xyzw 1]/$w] set z [expr [lindex $xyzw 2]/$w] set s "$x $y $z " if {$vi >= 0} { set s "$s vertex #$vi" } if {$ei != {}} { set s "$s edge [lindex $ei 0]-[lindex $ei 1]" } if {$fi != -1} { set s "$s face #$fi ([expr [llength $fv]/3]-gon)" } msg $s } # Having asked for notification of these raw events, we report when # the user pressed these keys in the geomview graphics windows. proc handlekey {event} { global lastincr switch [lindex $event 1] { 32 {msg "Pressed space bar"} 8 {msg "Pressed backspace key"} } } # # Display a message on the control panel, and on the terminal where geomview # was started. We use ``puts stderr ...'' rather than simply ``puts ...'', # since Geomview interprets anything we send to standard output # as a GCL command! # proc msg {str} { global msgtext puts stderr $str set msgtext $str update } # Load object from file proc loadobject {fname} { if {$fname != ""} { puts "(geometry thing < $fname)" # Be sure to flush output to ensure geomview receives this now! flush stdout } } # Build simple "user interface" # The message area could be a simple label rather than an entry box, # but we want to be able to use X selection to copy text from it. # The default mouse bindings do that automatically. entry .msg -textvariable msgtext -width 45 pack .msg frame .f label .f.l -text "File to load:" pack .f.l -side left entry .f.ent -textvariable fname pack .f.ent -side left -expand true -fill x bind .f.ent { loadobject $fname } pack .f # End UI definition. # Call "readsomething" when data arrives from geomview. fileevent stdin readable {readsomething} # Geomview initialization puts { (interest (pick primitive)) (interest (rawevent 32)) # Be notified when user presses space (interest (rawevent 8)) # or backspace keys. (geometry thing < hdodec.off) (normalization world none) } # Flush to ensure geomview receives this. flush stdout wm title . {Sample external module} msg "Click right mouse in graphics window"  File: geomview, Node: Module Installation, Prev: Example4, Up: Modules 6.7 Module Installation ======================= This section tells how to install an external module so you can invoke it within Geomview. There are two ways to install a module: you can install a _private_ module so that the module is available to you whenever you run Geomview, or you can install a _system_ module so that the module is available to all users on your system whenever they run Geomview. * Menu: * Private Module Installation:: Per-user modules. * System Module Installation:: System-wide modules.  File: geomview, Node: Private Module Installation, Next: System Module Installation, Prev: Module Installation, Up: Module Installation 6.7.1 Private Module Installation --------------------------------- The `emodule-define' command arranges for a module to appear in Geomview's _Modules_ browser. The command takes two string arguments; the first is the name that will appear in the _Modules_ browser. The second is the shell command for running the module; it may include arguments (*note `(emodule-define ...)': emodule-define.). Geomview executes this command in a subshell when you click on the module's entry in the browser. For example (emodule-define "Foo" "/u/home/modules/foo -x") adds a line labeled "Foo" to the _Modules_ browser which causes the command "/u/home/modules/foo -x" to be executed when selected. You may put `emodule-define' commands in your `~/.geomview' file to arrange for certain modules to be available every time you run Geomview; *Note Customization::. You can also execute `emodule-define' commands from the _Commands_ panel to add a module to an already running copy of Geomview. There are several other GCL commands for controlling the entries in the _Modules_ browser; for details, *Note GCL::.  File: geomview, Node: System Module Installation, Prev: Private Module Installation, Up: Module Installation 6.7.2 System Module Installation -------------------------------- To install a module so that it is available to all Geomview users do the following 1. Create a file called `.geomview-MODULE' where `MODULE' is the name of the module. This file should contain a single line which is an `emodule-define' command for that module: (emodule-define "New Module" "newmodule") The first argument, `"New Module"' above, is the string that will appear in the _Modules_ browser. The second string, `"newmodule"' above, is the Bourne shell command for invoking the module. It may include arguments, and you may assume that the module is on the $path searched by the shell. 2. Put a copy of the `.geomview-MODULE' and the module executable itself in Geomview's `modules/' directory, where `' is your system type. After these steps, the new module should appear, in alphabetical position, in the _Modules_ browser of Geomview's _Main_ panel next time Geomview is run. The reason this works is that when Geomview is invoked it processes all the `.geomview-*' files in its `modules' directory. It also remembers the pathname of this directory and prepends that path to the $path of the shell in which it invokes such a module.  File: geomview, Node: GCL, Next: Non-Euclidean Geometry, Prev: Modules, Up: Top 7 GCL: the Geomview Command Language ************************************ GCL has the syntax of lisp - i.e. an expression of the form (f a b ...) means pass the values of a, b, ... to the function f. GCL is very limited and is by no means an implementation of lisp. It is simply a language for expressing commands to be executed in the order given, rather than a programming language. It does not support variable or function definition. GCL is the language that Geomview understands for files that it loads as well as for communication with other programs. To execute a GCL command interactively, you can bring up the _Commands_ panel which lets you type in a command; Geomview executes the command when you hit the key. Output from such commands is printed to standard output. Alternately, you can invoke Geomview as `geomview -c -' which causes it to read GCL commands from standard input. GCL functions return a value, and you can nest function calls in ways which use this returned value. For example (f (g a b)) evaluates `(g a b)' and then evaluates `(f x)' where `x' is the result returned by `(g a b)'. Geomview maintains these return values internally but does not normally print them out. To print out a return value pass it to the `echo' function. For example the `geomview-version' function returns a string representing the version of Geomview that is running, and (echo (geomview-version)) prints out this string. Many functions simply return `t' for success or `nil' for failure; this is the case if the documentation for the function does not indicate otherwise. These are the lisp symbols for true and false, respectively. (They correspond to the C variables `Lt' and `Lnil' which you are likely to see if you look at the source code for Geomview or some of the external modules.) In the descriptions of the commands below several references are made to "OOGL" formats. OOGL is the data description language that Geomview uses for describing geometry, cameras, appearances, and other basic objects. For details of the OOGL formats, *Note OOGL File Formats::. (Or equivalently, see the oogl(5) manual page, distributed with Geomview in the file man/cat5/oogl.5. The GCL commands and argument types are listed below. Most of the documentation in this section of the manual is available within Geomview via the `?' and `??' commands. The command `(? COMMAND)' causes Geomview to print out a one-line summary of the syntax of COMMAND, and `(?? COMMAND)' prints out an explanation of what COMMAND does. You can include the wild-card character `*' in COMMAND to print information for a group of commands matching a pattern. For example, `(?? *emodule*)' will print all information about all commands containing the string `emodule'. `(? *)' will print a short list of all commands. * Menu: * Argument Conventions:: Conventions used in describing argument types. * GCL Reference:: Documentation for each GCL command.  File: geomview, Node: Argument Conventions, Next: GCL Reference, Prev: GCL, Up: GCL 7.1 Conventions Used In Describing Argument Types ================================================= The following symbols are used to describe argument types in the documentation for GCL functions. `APPEARANCE' is an OOGL appearance specification. `CAM-ID' is an ID that refers to a camera. `CAMERA' is an OOGL camera specification. `GEOM-ID' is an ID that refers to a geometry. `GEOMETRY' is an OOGL geometry specification. `ID' is a string which names a geometry or camera. Besides those you create, valid ones are: ``World, world, worldgeom, g0'' the collection of all geom's `target' selected target object (cam or geom) `center' selected center-of-motion object `targetcam' last selected target camera `targetgeom' last selected target geom `focus' camera where cursor is (or most recently was) `allgeoms' all geom objects `allcams' all cameras ``default, defaultcam, prototype'' future cameras inherit default's settings The following IDs are used to name coordinate systems, e.g. in `pick' and `write' commands: ``World, world, worldgeom, g0'' the world, within which all other geoms live. `universe' the universe, in which the World, lights and cameras live. Cameras' world2cam transforms might better be called universe2cam, etc. `self' "this Geomview object". Transform from an object to `self' is the identity; writing its geometry gives the object itself with no enclosing transform; picked points appear in the object's coordinates. `primitive' (for `pick' only) Picked points appear in the coordinate system of the lowest-level OOGL primitive. A name is also an acceptable id. Given names are made unique by appending numbers if necessary (i.e. `foo<2>'). Every geom is also named g[n] and every camera is also named c[n] (`g0' is always the worldgeom): this name is used as a prefix to keyboard commands and can also be used as a GCL id. Numbers are reused after an object is deleted. Both names are shown in the Object browser. `STATEMENT' represents a function call. Function calls have the form `(func arg1 arg2 ... )', where `func' is the name of the function and `arg1', `arg2', ... are the arguments. `TRANSFORM' is an OOGL 4x4 transformation matrix. `NTRANSFORM' is an OOGL (N+1)x(N+1) transformation matrix. `WINDOW' is an OOGL winddow specification.  File: geomview, Node: GCL Reference, Prev: Argument Conventions, Up: GCL 7.2 GCL Reference Guide ======================= * Menu: * shell:: `(! SHELLCOMMAND)' * lt:: `(< EXPR1 EXPR2)' * eq:: `(= EXPR1 EXPR2)' * gt:: `(> EXPR1 EXPR2)' * help:: `(? COMMAND)' * morehelp:: `(?? COMMAND)' * emodule-run:: `(| NAME)' * all:: `(all geometry|camera|emodule)' * and:: `(and EXPR1 EXPR2)' * ap-override:: `(ap-override [on|off])' * backcolor:: `(backcolor CAM-ID R G B)' * background-image:: `(background-image CAM-ID [FILENAME])' * bbox-color:: `(bbox-color GEOM-ID R G B)' * bbox-draw:: `(bbox-draw GEOM-ID [yes|no])' * camera:: `(camera CAM-ID [CAMERA])' * camera-draw:: `(camera-draw CAM-ID [yes|no])' * camera-prop:: `(camera-prop { geometry object } [projective])' * camera-reset:: `(camera-reset CAM-ID)' * car:: `(car LIST)' * cdr:: `(cdr LIST)' * clock:: `(clock)' * command:: `(command INFILE [OUTFILE])' * copy:: `(copy [ID] [name])' * cursor-still:: `(cursor-still [INT])' * cursor-twitch:: `(cursor-twitch [INT])' * delete:: `(delete ID)' * dice:: `(dice GEOM-ID N)' * dimension:: `(dimension [N])' * dither:: `(dither CAM-ID {on|off|toggle})' * draw:: `(draw CAM-ID)' * dump-handles:: `(dump-handles)' * echo:: `(echo ...)' * emodule-clear:: `(emodule-clear)' * emodule-define:: `(emodule-define NAME SHELL-COMMAND ...)' * emodule-defined:: `(emodule-defined `modulename')' * emodule-isrunning:: `(emodule-isrunning NAME)' * emodule-path:: `(emodule-path)' * emodule-run:: `(| NAME)' * emodule-sort:: `(emodule-sort)' * emodule-start:: `(emodule-start NAME)' * emodule-transmit:: `(emodule-transmit NAME LIST)' * escale:: `(escale GEOM-ID FACTOR)' * event-keys:: `(event-keys {on|off})' * event-mode:: `(event-mode MODESTRING)' * event-pick:: `(event-pick {on|off})' * evert:: `(evert GEOM-ID [yes|no])' * exit:: `(exit)' * ezoom:: `(ezoom GEOM-ID FACTOR)' * freeze:: `(freeze CAM-ID)' * geometry:: `(geometry GEOM-ID [GEOMETRY])' * geomview-version:: `(geomview-version)' * hdefine:: `(hdefine geometry|camera|... NAME VALUE)' * hdelete:: `(hdelete [geometry|camera|...] name)' * help:: `(? COMMAND)' * hmodel:: `(hmodel CAMID {virtual|projective|conformal})' * hsphere-draw:: `(hsphere-draw CAMID [yes|no])' * if:: `(if TEST EXPR1 [EXPR2])' * inhibit-warning:: `(inhibit-warning STRING)' * input-translator:: `(input-translator "#pfx" "sh-command")' * interest:: `(interest (COMMAND [args]))' * lines-closer:: `(lines-closer CAM-ID DIST)' * load:: `(load filename [command|geometry|camera])' * load-path:: `(load-path)' * look:: `(look [objectID] [camID])' * look-encompass:: `(look-encompass [objID] [camID])' * look-encompass-size:: `(look-encompass-size [view clip near far])' * look-recenter:: `(look-recenter [objID] [camID])' * look-toward:: `(look-toward [objID] [camID] [origin|center])' * merge:: `(merge {window|camera} CAM-ID { WIN or CAM ... })' * merge-ap:: `(merge-ap GEOM-ID APPEARANCE)' * merge-base-ap:: `(merge-base-ap APPEARANCE)' * merge-baseap:: `(merge-baseap APPEARANCE)' * morehelp:: `(?? COMMAND)' * name-object:: `(name-object ID NAME)' * ND-axes:: `(ND-axes CAMID [CLUSTER [Xidx Yidx Zidx [Widx]]])' * ND-color:: `(ND-color CAMID ...' * ND-xform:: `(ND-xform OBJID [ntransform { ... }])' * ND-xform-get:: `(ND-xform-get ID [from-ID])' * ND-xform-set:: `(ND-xform-set OBJID [ntransform { ... }])' * new-alien:: `(new-alien name [GEOMETRY])' * new-camera:: `(new-camera name [CAMERA])' * new-center:: `(new-center [id])' * new-geometry:: `(new-geometry name [GEOMETRY])' * new-reset:: `(new-reset)' * NeXT:: `(NeXT)' * normalization:: `(normalization GEOM-ID {each|none|all|keep})' * not:: `(not EXPR)' * or:: `(or EXPR1 EXPR2)' * pick:: `(pick COORDSYS GEOMID G V E F P VI EI FI)' * pick-invisible:: `(pick-invisible [yes|no])' * pickable:: `(pickable GEOM-ID {yes|no})' * position:: `(position objectID otherID)' * position-at:: `(position-at objectID otherID [center | origin])' * position-toward:: `(position-toward objID othID [center|origin])' * progn:: `(progn STATEMENT [ ... ])' * quit:: `(quit)' * quote:: `(quote EXPR)' * rawevent:: `(rawevent dev val x y t)' * rawpick:: `(rawpick CAMID X Y)' * read:: `(read geometry|camera|... {GEOM or CAM or ...})' * real-id:: `(real-id ID)' * redraw:: `(redraw CAM-ID)' * regtable:: `(regtable)' * rehash-emodule-path:: `(rehash-emodule-path)' * replace-geometry:: `(replace-geometry GEOM-ID PART GEOMETRY)' * rib-display:: `(rib-display [frame|tiff] FILEPREFIX)' * rib-snapshot:: `(rib-snapshot CAM-ID [filename])' * scale:: `(scale GEOM-ID FACTOR [FACTORY FACTORZ])' * scene:: `(scene CAM-ID [GEOMETRY])' * set-clock:: `(set-clock TIME)' * set-conformal-refine:: `(set-conformal-refine CMX [N [EDGES]])' * set-emodule-path:: `(set-emodule-path (PATH1 ... PATHN))' * set-load-path:: `(set-load-path (PATH1 ... PATHN))' * set-motionscale:: `(set-motionscale X)' * setenv:: `(setenv name string)' * sgi:: `(sgi)' * shell:: `(! SHELLCOMMAND)' * sleep-for:: `(sleep-for TIME)' * sleep-until:: `(sleep-until TIME)' * snapshot:: `(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])' * soft-shader:: `(soft-shader CAM-ID {on|off|toggle})' * space:: `(space {euclidean|hyperbolic|spherical})' * stereowin:: `(stereowin CAM-ID [no|horizontal|...] [gap])' * time-interests:: `(time-interests delta initial prefix [suffix])' * transform:: `(transform objectID centerID frameID [rotate|...] ...)' * transform-incr:: `(transform-incr objectID centerID frameID ...)' * transform-set:: `(transform-set objectID centerID frameID ...)' * ui-cam-focus:: `(ui-cam-focus {focus-change|mouse-cross})' * ui-center:: `(ui-center ID)' * ui-center-origin:: `(ui-center-origin {origin|bbox-center})' * ui-emotion-program:: `(ui-emotion-program PROGRAM)' * ui-emotion-run:: `(ui-emotion-run EMODULE)' * ui-freeze:: `(ui-freeze {on|off})' * ui-html-browser:: `(ui-html-browser BROWSER)' * ui-motion:: `(ui-motion {inertia|...} {on|off})' * ui-panel:: `(ui-panel PANELNAME {on|off} [WINDOW])' * ui-pdf-viewer:: `(ui-pdf-viewer VIEWER)' * ui-target:: `(ui-target ID [yes|no])' * uninterest:: `(uninterest (COMMAND [args]))' * update:: `(update [timestep_in_seconds])' * update-draw:: `(update-draw CAM-ID [timestep_in_seconds])' * window:: `(window CAM-ID WINDOW)' * winenter:: `(winenter CAM-ID)' * write:: `(write command|geometry|... FILENAME ...)' * write-comments:: `(write-comments FILENAME GEOMID PICKPATH)' * write-handle:: `(write-handle PREFIX FILENAME HANDLE)' * write-sexpr:: `(write-sexpr FILENAME LISPOBJECT)' * xform:: `(xform ID TRANSFORM)' * xform-incr:: `(xform-incr ID TRANSFORM)' * xform-set:: `(xform-set ID TRANSFORM)' * zoom:: `(zoom CAM-ID FACTOR)'  File: geomview, Node: shell, Next: lt, Prev: GCL Reference, Up: GCL Reference 7.2.1 ! ------- `!' is a synonym for `shell'. *Note shell::.  File: geomview, Node: lt, Next: eq, Prev: shell, Up: GCL Reference 7.2.2 < ------- `(< EXPR1 EXPR2)' Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.  File: geomview, Node: eq, Next: gt, Prev: lt, Up: GCL Reference 7.2.3 = ------- `(= EXPR1 EXPR2)' Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.  File: geomview, Node: gt, Next: help, Prev: eq, Up: GCL Reference 7.2.4 > ------- `(> EXPR1 EXPR2)' Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings.  File: geomview, Node: help, Next: morehelp, Prev: gt, Up: GCL Reference 7.2.5 ? ------- `(? [command])' Gives one-line usage summary for `command'. Command may include `*'s as wildcards; see also *Note `(?? ...)': morehelp. One-line command help; lists names only if multiple commands match. `?' is a synonym for *Note `(help ...)': help.  File: geomview, Node: morehelp, Next: emodule-run, Prev: help, Up: GCL Reference 7.2.6 ?? -------- `(?? command)' `command' may include `*' wildcards. Prints more info than `(? command)'. `??' is a synonym for *Note `morehelp': morehelp.  File: geomview, Node: emodule-run, Next: all, Prev: morehelp, Up: GCL Reference 7.2.7 | ------- `|' `|' is a synonym for `emodule-run'.  File: geomview, Node: all, Next: and, Prev: emodule-run, Up: GCL Reference 7.2.8 all --------- `(all geometry)' returns a list of names of all geometry objects. Use e.g. `(echo (all geometry))' to print such a list. `(all camera)' returns a list of names of all cameras. `(all emodule defined)' returns a list of all defined external modules. `(all emodule running)' returns a list of all running external modules.  File: geomview, Node: and, Next: ap-override, Prev: all, Up: GCL Reference 7.2.9 and --------- `(and EXPR1 EXPR2)' Evaluate `EXPR1' and `EXPR2' and return `t' if both return non-`nil', otherwise return `nil'.  File: geomview, Node: ap-override, Next: backcolor, Prev: and, Up: GCL Reference 7.2.10 ap-override ------------------ `(ap-override [on|off])' Selects whether appearance controls should override objects' own settings. On by default. With no arguments, returns current setting.  File: geomview, Node: backcolor, Next: background-image, Prev: ap-override, Up: GCL Reference 7.2.11 backcolor ---------------- `(backcolor CAM-ID R G B)' Set the background color of CAM-ID; R G B are numbers between 0 and 1.  File: geomview, Node: background-image, Next: bbox-color, Prev: backcolor, Up: GCL Reference 7.2.12 background-image ----------------------- `(background-image CAM-ID [FILENAME])' Use the given image as the background of camera CAM-ID (which must be a real camera, not `default' or `allcams'). Centers the image on the window area. Works only with GL and OpenGL graphics. Use "" for filename to remove background. With no filename argument, returns name of that window's current background image, or "". Any file type acceptable as a texture is allowed, e.g. .ppm.gz, .sgi, etc.  File: geomview, Node: bbox-color, Next: bbox-draw, Prev: background-image, Up: GCL Reference 7.2.13 bbox-color ----------------- `(bbox-color GEOM-ID R G B)' Set the bounding-box color of GEOM-ID; R G B are numbers between 0 and 1.  File: geomview, Node: bbox-draw, Next: camera, Prev: bbox-color, Up: GCL Reference 7.2.14 bbox-draw ---------------- `(bbox-draw GEOM-ID [yes|no])' Say whether GEOM-ID's bounding-box should be drawn; defaults to `yes' if second argument is omitted.  File: geomview, Node: camera, Next: camera-draw, Prev: bbox-draw, Up: GCL Reference 7.2.15 camera ------------- `(camera CAM-ID [CAMERA])' Specify data for CAM-ID; CAMERA is a string giving an OOGL camera specification. If no camera CAM-ID exists, it is created; in this case, the second argument is optional, and if omitted, a default camera is used. *Note `(new-camera ...)': new-camera.  File: geomview, Node: camera-draw, Next: camera-prop, Prev: camera, Up: GCL Reference 7.2.16 camera-draw ------------------ `(camera-draw CAM-ID [yes|no])' Say whether or not cameras should be drawn in CAM-ID; `yes' if omitted.  File: geomview, Node: camera-prop, Next: camera-reset, Prev: camera-draw, Up: GCL Reference 7.2.17 camera-prop ------------------ `(camera-prop { geometry object } [projective])' Specify the object to be shown when drawing other cameras. By default, this object is drawn with its origin at the camera, and with the camera looking toward the object's -Z axis. With the `projective' keyword, the camera's viewing projection is also applied to the object; this places the object's Z=-1 and Z=+1 at near and far clipping planes, with the viewing area -1<={X,Y}<=+1. Example: (camera-prop { < cube } projective)  File: geomview, Node: camera-reset, Next: car, Prev: camera-prop, Up: GCL Reference 7.2.18 camera-reset ------------------- `(camera-reset CAM-ID)' Reset CAM-ID to its default value.  File: geomview, Node: car, Next: cdr, Prev: camera-reset, Up: GCL Reference 7.2.19 car ---------- `(car LIST)' returns the first element of LIST.  File: geomview, Node: cdr, Next: clock, Prev: car, Up: GCL Reference 7.2.20 cdr ---------- `(cdr LIST)' returns the list obtained by removing the first element of LIST.  File: geomview, Node: clock, Next: command, Prev: cdr, Up: GCL Reference 7.2.21 clock ------------ `(clock)' Returns the current time, in seconds, as shown by this stream's clock. *Note `(set-clock ...)': set-clock. *Note `(sleep-until ...)': sleep-until.  File: geomview, Node: command, Next: copy, Prev: clock, Up: GCL Reference 7.2.22 command -------------- `(command INFILE [OUTFILE])' Read commands from INFILE; send corresponding responses (e.g. anything written to filename `-') to OUTFILE, stdout by default.  File: geomview, Node: copy, Next: cursor-still, Prev: command, Up: GCL Reference 7.2.23 copy ----------- `(copy [ID] [name])' Copies an object or camera. If ID is not specified, it is assumed to be targetgeom. If name is not specified, it is assumed to be the same as the name of ID.  File: geomview, Node: cursor-still, Next: cursor-twitch, Prev: copy, Up: GCL Reference 7.2.24 cursor-still ------------------- `(cursor-still [INT])' Sets the number of microseconds for which the cursor must not move to register as holding still. If INT is not specified, the value will be reset to the default.  File: geomview, Node: cursor-twitch, Next: delete, Prev: cursor-still, Up: GCL Reference 7.2.25 cursor-twitch -------------------- `(cursor-twitch [INT])' Sets the distance which the cursor must not move (in x or y) to register as holding still. If INT is not specified, the value will be reset to the default.  File: geomview, Node: delete, Next: dice, Prev: cursor-twitch, Up: GCL Reference 7.2.26 delete ------------- `(delete ID)' Delete object or camera ID.  File: geomview, Node: dice, Next: dimension, Prev: delete, Up: GCL Reference 7.2.27 dice ----------- `(dice GEOM-ID N)' Dice any Bezier patches within GEOM-ID into NxN meshes; default 10. See also the appearance attribute *Note `patchdice': Appearances, which makes this command obsolete.  File: geomview, Node: dimension, Next: dither, Prev: dice, Up: GCL Reference 7.2.28 dimension ---------------- `(dimension [N])' Sets or reads the space dimension for N-dimensional viewing. (Since calculations are done using homogeneous coordinates, this means matrices are (N+1)x(N+1).) With no arguments, returns the current dimension, or 0 if N-dimensional viewing has not been enabled.  File: geomview, Node: dither, Next: draw, Prev: dimension, Up: GCL Reference 7.2.29 dither ------------- `(dither CAM-ID {on|off|toggle})' Turn dithering on or off in that camera.  File: geomview, Node: draw, Next: dump-handles, Prev: dither, Up: GCL Reference 7.2.30 draw ----------- `(draw CAM-ID)' Draw the view in CAM-ID, if it needs redrawing. *Note `(redraw ...)': redraw.  File: geomview, Node: dump-handles, Next: echo, Prev: draw, Up: GCL Reference 7.2.31 dump-handles ------------------- `(dump-handles)' Dump the list of currently active handles to stdout. This function is intended for internal debugging use only.  File: geomview, Node: echo, Next: emodule-clear, Prev: dump-handles, Up: GCL Reference 7.2.32 echo ----------- `(echo ...)' Write the given data to the special file `-'. Strings are written literally; lisp expressions are evaluated and their values written. If received from an external program, `echo' sends to the program's input. Otherwise writes to geomview's own standard output (typically the terminal).  File: geomview, Node: emodule-clear, Next: emodule-define, Prev: echo, Up: GCL Reference 7.2.33 emodule-clear -------------------- `(emodule-clear)' Clears the geomview application (external module) browser.  File: geomview, Node: emodule-define, Next: emodule-defined, Prev: emodule-clear, Up: GCL Reference 7.2.34 emodule-define --------------------- `(emodule-define NAME SHELL-COMMAND ...)' Define an external module called NAME, which then appears in the external-module browser. The SHELL-COMMAND string is a UNIX shell command which invokes the module. See *Note `(emodule-run ...)': emodule-run. for discussion of external modules.  File: geomview, Node: emodule-defined, Next: emodule-isrunning, Prev: emodule-define, Up: GCL Reference 7.2.35 emodule-defined ---------------------- `(emodule-defined `modulename')' If the given external-module name is known, returns the name of the program invoked when it's run as a quoted string; otherwise returns nil. `(echo (emodule-defined `name'))' prints the string.  File: geomview, Node: emodule-isrunning, Next: emodule-path, Prev: emodule-defined, Up: GCL Reference 7.2.36 emodule-isrunning ------------------------ `(emodule-isrunning NAME)' Returns Lt if the emodule NAME is running, or Lnil if it is not running. NAME is searched for in the names as they appear in the browser and in the shell commands used to execute the external modules (not including arguments).  File: geomview, Node: emodule-path, Next: emodule-run, Prev: emodule-isrunning, Up: GCL Reference 7.2.37 emodule-path ------------------- `(emodule-path)' Returns the current search path for external modules. Note: to actually see the value returned by this function you should wrap it in a call to echo: `(echo (emodule-path))'. *Note `(set-emodule-path ...)': set-emodule-path.  File: geomview, Node: emodule-run, Next: emodule-sort, Prev: emodule-path, Up: GCL Reference 7.2.38 emodule-run ------------------ `(emodule-run SHELL-COMMAND ARGS...)' Runs the given SHELL-COMMAND (a string containing a UNIX shell command) as an external module. The module's standard output is taken as geomview commands; responses (written to filename `-') are sent to the module's standard input. The shell command is interpreted by /bin/sh, so e.g. I/O redirection may be used; a program which prompts the user for input from the terminal could be run with: (emodule-run yourprogram <&2) If not already set, the environment variable $MACHTYPE is set to the name of the machine type. Input and output connections to geomview are dropped when the shell command terminates. Clicking on a running program's module-browser entry sends the signal SIGHUP to the program. For this to work, programs should avoid running in the background; those using FORMS or GL should call foreground() before the first FORMS or winopen() call. *Note `(emodule-define ...)': emodule-define. *Note `(emodule-start ...)': emodule-start.  File: geomview, Node: emodule-sort, Next: emodule-start, Prev: emodule-run, Up: GCL Reference 7.2.39 emodule-sort ------------------- `(emodule-sort)' Sorts the modules in the application browser alphabetically.  File: geomview, Node: emodule-start, Next: emodule-transmit, Prev: emodule-sort, Up: GCL Reference 7.2.40 emodule-start -------------------- `(emodule-start NAME)' Starts the external module NAME, defined by emodule-define. Equivalent to clicking on the corresponding module-browser entry.  File: geomview, Node: emodule-transmit, Next: escale, Prev: emodule-start, Up: GCL Reference 7.2.41 emodule-transmit ----------------------- `(emodule-transmit NAME LIST)' Places LIST into external module NAME's standard input. NAME is searched for in the names of the modules as they appear in the External Modules browser and then in the shell commands used to execute the external modules. Does nothing if modname is not running.  File: geomview, Node: escale, Next: event-keys, Prev: emodule-transmit, Up: GCL Reference 7.2.42 escale ------------- `(escale GEOM-ID FACTOR)' Same as scale but multiplies by exp(scale). Obsolete.  File: geomview, Node: event-keys, Next: event-mode, Prev: escale, Up: GCL Reference 7.2.43 event-keys ----------------- `(event-keys {on|off})' Turn keyboard events on or off to enable/disable keyboard shortcuts.  File: geomview, Node: event-mode, Next: event-pick, Prev: event-keys, Up: GCL Reference 7.2.44 event-mode ----------------- `(event-mode MODESTRING)w' Set the mouse event (motion) mode; MODESTRING should be one of the following strings: 1. `"[r] Rotate"' 2. `"[t] Translate"' 3. `"[z] Cam Zoom"' 4. `"[s] Geom Scale"' 5. `"[f] Cam Fly"' 6. `"[o] Cam Orbit"' 7. `"[le] Edit Lights"'  File: geomview, Node: event-pick, Next: evert, Prev: event-mode, Up: GCL Reference 7.2.45 event-pick ----------------- `(event-pick {on|off})' Turn picking on or off.  File: geomview, Node: evert, Next: exit, Prev: event-pick, Up: GCL Reference 7.2.46 evert ------------ `(evert GEOM-ID [yes|no])' Set the normal eversion state of GEOM-ID. If the second argument is omitted, toggle the eversion state.  File: geomview, Node: exit, Next: ezoom, Prev: evert, Up: GCL Reference 7.2.47 exit ----------- `(exit)' Terminates geomview.  File: geomview, Node: ezoom, Next: freeze, Prev: exit, Up: GCL Reference 7.2.48 ezoom ------------ `(ezoom GEOM-ID FACTOR)' Same as zoom but multiplies by exp(zoom). Obsolete.  File: geomview, Node: freeze, Next: geometry, Prev: ezoom, Up: GCL Reference 7.2.49 freeze ------------- `(freeze CAM-ID)' Freeze CAM-ID; drawing in this camera's window is turned off until it is explicitly redrawn with `(redraw CAM-ID)', after which time drawing resumes as normal.  File: geomview, Node: geometry, Next: geomview-version, Prev: freeze, Up: GCL Reference 7.2.50 geometry --------------- `(geometry GEOM-ID [GEOMETRY])' Specify the geometry for GEOM-ID. GEOMETRY is a string giving an OOGL geometry specification. If no object called GEOM-ID exists, it is created; in this case the GEOMETRY argument is optional, and if omitted, the new object GEOM-ID is given an empty geometry.  File: geomview, Node: geomview-version, Next: hdefine, Prev: geometry, Up: GCL Reference 7.2.51 geomview-version ----------------------- `(geomview-version)' Returns a string representing the version of geomview that is running.  File: geomview, Node: hdefine, Next: hdelete, Prev: geomview-version, Up: GCL Reference 7.2.52 hdefine -------------- `(hdefine `geometry'|`camera'|`window'|`appearance'|`image'|`transform'|`ntransform' name value)' Sets the value of a handle of a given type. (hdefine ) is generally equivalent to (read { define }) except that the assignment is done when hdefine is executed, (possibly not at all if inside a conditional statement), while the `read ... define' performs assignment as soon as the text is read. *Note References::. *Note `(read ...)': read. *Note `(hdelete ...)': hdelete.  File: geomview, Node: hdelete, Next: help, Prev: hdefine, Up: GCL Reference 7.2.53 hdelete -------------- `(hdelete [`geometry'|`camera'|`window'|`appearance'|`image'|`transform'|`ntransform'] name)' Deletes the given handle. Note that the handle will not actually be deleted in case there are still other objects referring to the handle, but once those objects are gone, the handle will also automatically go away. The object the handle referes to (if any) will only be deleted if there are no other references to that object. If the optional first argument is omitted, then the first handle matching NAME will be deleted, regardless of the type of the object it is attached to. It is not an error to call this function with a non-existent handle, but it is an error to call this funcion with the name of a non-global handle, i.e. one that was not created by `(hdefine ...)' or `(read ... { define ...})'. *Note References::. *Note `(read ...)': read. *Note `(hdefine ...)': hdefine.  File: geomview, Node: help, Next: hmodel, Prev: hdelete, Up: GCL Reference 7.2.54 help ----------- `(help [command])' Command may include `*'s as wildcards; see also *Note `(?? ...)': help. One-line command help; lists names only if multiple commands match.  File: geomview, Node: hmodel, Next: hsphere-draw, Prev: help, Up: GCL Reference 7.2.55 hmodel ------------- `(hmodel CAMID {virtual|projective|conformal})' Set the model used to display geometry in this camera. *Note `(space ...)': space.  File: geomview, Node: hsphere-draw, Next: if, Prev: hmodel, Up: GCL Reference 7.2.56 hsphere-draw ------------------- `(hsphere-draw CAMID [yes|no])' Say whether to draw a unit sphere: the sphere at infinity in hyperbolic space, and a reference sphere in Euclidean and spherical spaces. If the second argument is omitted, `yes' is assumed.  File: geomview, Node: if, Next: inhibit-warning, Prev: hsphere-draw, Up: GCL Reference 7.2.57 if --------- `(if TEST EXPR1 [EXPR2])' Evaluates TEST; if TEST returns a non-nil value, returns the value of EXPR1. If TEST returns nil, returns the value of EXPR2 if EXPR2 is present, otherwise returns nil.  File: geomview, Node: inhibit-warning, Next: input-translator, Prev: if, Up: GCL Reference 7.2.58 inhibit-warning ---------------------- `(inhibit-warning STRING)' Inhibit warning inhbits geomview from displaying a particular warning message determined by STRING. At present there are no warning messages that this applies to, so this command is rather useless.  File: geomview, Node: input-translator, Next: interest, Prev: inhibit-warning, Up: GCL Reference 7.2.59 input-translator ----------------------- `(input-translator "#prefix_string" "Bourne-shell-command")' Defines an external translation program for special input types. When asked to read a file which begins with the specified string, geomview invokes that program with standard input coming from the given file. The program is expected to emit OOGL geometric data to its standard output. In this implementation, only prefixes beginning with # are recognized. Useful as in (input-translator "#VRML" "vrml2oogl")  File: geomview, Node: interest, Next: lines-closer, Prev: input-translator, Up: GCL Reference 7.2.60 interest --------------- `(interest (COMMAND [args]))' Allows you to express interest in a command. When geomview executes that command in the future it will echo it to the communication pool from which the interest command came. COMMAND can be any command. Args specify restrictions on the values of the arguments; if args are present in the interest command, geomview will only echo calls to the command in which the arguments match those given in the interest command. Two special argument values may appear in the argument list. `*' matches any value. `nil' matches any value but supresses the reporting of that value; its value is reported as `nil'. The purpose of the interest command is to allow external modules to find out about things happening inside geomview. For example, a module interested in knowing when a geom called `foo' is deleted could say `(interest (delete foo))' and would receive the string `(delete foo)' when foo is deleted. Picking is a special case of this. For most modules interested in pick events the command `(interest (pick world))' is sufficient. This causes geomview to send a string of the form `(pick world ...)' every time a pick event (right mouse double click). See the *Note `(pick ...)': pick. command for details.  File: geomview, Node: lines-closer, Next: load, Prev: interest, Up: GCL Reference 7.2.61 lines-closer ------------------- `(lines-closer CAM-ID DIST)' Draw lines (including edges) closer to the camera than polygons by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default. If DIST is too small, a line lying on a surface may be dotted or invisible, depending on the viewpoint. If DIST is too large, lines may appear in front of surfaces that they actually lie behind. Good values for DIST vary with the scene, viewpoint, and distance between near and far clipping planes. This feature is a kludge, but can be helpful.  File: geomview, Node: load, Next: load-path, Prev: lines-closer, Up: GCL Reference 7.2.62 load ----------- `(load filename [command|geometry|camera])' Loads the given file into geomview. The optional second argument specifies the type of data it contains, which may be `command' (geomview commands), `geometry' (OOGL geometric data), or `camera' (OOGL camera definition). If omitted, attempts to guess about the file's contents. Loading geometric data creates a new visible object; loading a camera opens a new window; loading a command file executes those commands.  File: geomview, Node: load-path, Next: look, Prev: load, Up: GCL Reference 7.2.63 load-path ---------------- `(load-path)' Returns the current search path for command, geometry, etc. files. Note: to actually see the value returned by this function you should wrap it in a call to echo: `(echo (load-path))'. *Note `(set-load-path ...)': set-load-path.  File: geomview, Node: look, Next: look-encompass, Prev: load-path, Up: GCL Reference 7.2.64 look ----------- `(look [objectID] [cameraID])' Rotates the named camera to point toward the center of the bounding box of the named object (or the origin in hyperbolic or spherical space). In Euclidean space, moves the camera forward or backward until the object appears as large as possible while still being entirely visible. Equivalent to progn ( (look-toward [objectID] [cameraID] {center | origin}) [(look-encompass [objectID] [cameraID])] ) If objectID is not specified, it is assumed to be World. If cameraID is not specified, it is assumed to be targetcam.  File: geomview, Node: look-encompass, Next: look-encompass-size, Prev: look, Up: GCL Reference 7.2.65 look-encompass --------------------- `(look-encompass [objectID] [cameraID])' Moves cameraID backwards or forwards until its field of view surrounds objectID. This routine works only in Euclidean space. If objectID is not specified, it is assumed to be the world. If cameraID is not specified, it is assumed to be the targetcam. *Note `(look-encompass-size ...)': look-encompass-size.  File: geomview, Node: look-encompass-size, Next: look-recenter, Prev: look-encompass, Up: GCL Reference 7.2.66 look-encompass-size -------------------------- `(look-encompass-size [view-fraction clip-ratio near-margin far-margin])' Sets/returns parameters used by (look-encompass). view-fraction is the portion of the camera window filled by the object, clip-ratio is the max allowed ratio of near-to-far clipping planes. The near clipping plane is 1/near-margin times closer than the near edge of the object, and the far clipping plane is far-margin times further away. Returns the list of current values. Defaults: .75 100 0.1 4.0  File: geomview, Node: look-recenter, Next: look-toward, Prev: look-encompass-size, Up: GCL Reference 7.2.67 look-recenter -------------------- `(look-recenter [objectID] [cameraID])' Translates and rotates the camera so that it is looking in the -z direction (in objectID's coordinate system) at the center of objectID's bounding box (or the origin of the coordinate system in non-Eudlidean space). In Euclidean space, the camera is also moved as close as possible to the object while allowing the entire object to be visible. Also makes sure that the y-axes of objectID and cameraID are parallel.  File: geomview, Node: look-toward, Next: merge, Prev: look-recenter, Up: GCL Reference 7.2.68 look-toward ------------------ `(look-toward [objectID] [cameraID] [origin | center])' Rotates the named camera to point toward the origin of the object's coordinate system, or the center of the object's bounding box (in non-Euclidean space, the origin will be used automatically). Default objectID is the world, default camera is targetcam, default location to point towards is the center of the bounding box.  File: geomview, Node: merge, Next: merge-ap, Prev: look-toward, Up: GCL Reference 7.2.69 merge ------------ `(merge {window|camera} CAM-ID { WINDOW or CAMERA ... })' Modify the given window or camera, changing just those properties specified in the last argument. E.g. (merge camera `Camera' { far 20 }) sets Camera's far clipping plane to 20 while leaving other attributes untouched.  File: geomview, Node: merge-ap, Next: merge-base-ap, Prev: merge, Up: GCL Reference 7.2.70 merge-ap --------------- `(merge-ap GEOM-ID APPEARANCE)' Merge in some appearance characteristics to GEOM-ID. Appearance parameters include surface and line color, shading style, line width, and lighting.  File: geomview, Node: merge-base-ap, Next: merge-baseap, Prev: merge-ap, Up: GCL Reference 7.2.71 merge-base-ap -------------------- `(merge-base-ap APPEARANCE)' `merge-base-ap' is a synonym for *Note `merge-baseap': merge-baseap.  File: geomview, Node: merge-baseap, Next: morehelp, Prev: merge-base-ap, Up: GCL Reference 7.2.72 merge-baseap ------------------- `(merge-baseap APPEARANCE)' Merge in some appearance characteristics to the base default appearance (applied to every geom before its own apperance). Lighting is typically included in the base appearance.  File: geomview, Node: morehelp, Next: name-object, Prev: merge-baseap, Up: GCL Reference 7.2.73 morehelp --------------- `(morehelp command)' `command' may include `*' wildcards. Prints more info than *Note `(help command)': help.  File: geomview, Node: name-object, Next: ND-axes, Prev: morehelp, Up: GCL Reference 7.2.74 name-object ------------------ `(name-object ID NAME)' Assign a new NAME (a string) to ID. A number is appended if that name is in use (for example, `foo' -> `foo<2>'). The new name, possibly with number appended, may be used as object's id thereafter.  File: geomview, Node: ND-axes, Next: ND-color, Prev: name-object, Up: GCL Reference 7.2.75 ND-axes -------------- `(ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex [Windex]]])' In our model for N-D viewing (enabled by (dimension)), objects in N-space are viewed by N-dimensional _camera clusters_. Each real camera window belongs to some cluster, and shows & manipulates a 3-D axis-aligned projected subspace of the N-space seen by its cluster. Moving one camera in a cluster affects its siblings. The ND-axes command configures all this. It specifies a camera's cluster membership, and the set of N-space axes which become the 3-D camera's X, Y, and Z axes. Axes are specified by their indices, from 1 to N for an N-dimensional space. Cluster CLUSTERNAME is implicitly created if not previously known. In principle it is possible to map the homogeneous component of a conformal 4 point to some other index; this would be done by specifying 0 for one of `Xindex', `Yindex' or `Zindex' and giving `Windex' some positive value. This is probably not useful because Geomview does not support non-Euclidean geometries for in higher dimensions. To read a camera's configuration, use `(echo (ND-axes CAMID))'. The return value is an array of 4 integers, the last one should 0.  File: geomview, Node: ND-color, Next: ND-xform, Prev: ND-axes, Up: GCL Reference 7.2.76 ND-color --------------- `(ND-color CAMID' [ (( [ID] (x1 x2 ... xN) v r g b a v r g b a ... ) ((x1 ... xN) v r g b a v r g b a ...) ...)] ) Specifies a function, applied to each N-D vertex, which determines the colors of N-dimensional objects as shown in camera CAMID. Each coloring function is defined by a vector (in ID's coordinate system) [x1 ... xN] and by a sequence of value (v)/color(r g b a) tuples, ordered by increasing v. The inner product v = P.[x] is linearly interpolated in this table to give a color. If ID is omitted, the (xi) vector is assumed in universe coordinates. The ND-color command specifies a list of such functions; each vertex is colored by their sum (so e.g. green intensity could indicate projection along one axis while red indicated another. An empty list, as in (ND-color CAMID ()), suppresses coloring. With no second argument, (ND-color CAMID) returns that camera's color-function list. Even when coloring is enabled, objects tagged with the `keepcolor' appearance attribute are shown in their natural colors.  File: geomview, Node: ND-xform, Next: ND-xform-get, Prev: ND-color, Up: GCL Reference 7.2.77 ND-xform --------------- `(ND-xform OBJID [ntransform { idim odim ... }])' Concatenate the given ND-transform with the current ND-transform of the object (apply the ND-transform to object ID, as opposed to simply setting its ND-transform). Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.  File: geomview, Node: ND-xform-get, Next: ND-xform-set, Prev: ND-xform, Up: GCL Reference 7.2.78 ND-xform-get ------------------- `(ND-xform-get ID [from-ID])' Returns the N-D transform of the given object in the coordinate system of from-ID (default `universe'), in the sense * Transform = . Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.  File: geomview, Node: ND-xform-set, Next: new-alien, Prev: ND-xform-get, Up: GCL Reference 7.2.79 ND-xform-set ------------------- `(ND-xform-set OBJID [ntransform { idim odim ... }])' Sets the N-D transform of the given object. In dimension N, this is an (N+1)x(N+1) matrix, so in that case idim and odim are expected to be both equal to (N+1). Note that all cameras in a camera-cluster have the same N-D transform. Note that ND-transforms have their homogeneous coordinate at index 0, while 3D transform have it at index 3.  File: geomview, Node: new-alien, Next: new-camera, Prev: ND-xform-set, Up: GCL Reference 7.2.80 new-alien ---------------- `(new-alien name [GEOMETRY])' Create a new alien (geom not in the world) with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new alien is given an empty geometry. If an object with that name already exists, the new alien is given a unique name. The light beams that are used to move around the lights are an example of aliens. They're drawn but are not controllable the way ordinary objects are: they don't appear in the object browser and the user can't move them with the normal motion modes.  File: geomview, Node: new-camera, Next: new-center, Prev: new-alien, Up: GCL Reference 7.2.81 new-camera ----------------- `(new-camera name [CAMERA])' Create a new camera with the given name (a string). If a camera with that name already exists, the new object is given a unique name. If CAMERA is omitted a default camera is used.  File: geomview, Node: new-center, Next: new-geometry, Prev: new-camera, Up: GCL Reference 7.2.82 new-center ----------------- `(new-center [id])' Stop id, then set id's transform to the identity. Default id is target. Also, if the id is a camera, calls (look-recenter World id). The main function of the call to (look-recenter) is to place the camera so that it is pointing parallel to the z axis toward the center of the world.  File: geomview, Node: new-geometry, Next: new-reset, Prev: new-center, Up: GCL Reference 7.2.83 new-geometry ------------------- `(new-geometry name [GEOMETRY])' Create a new geom with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new object is given an empty geometry. If an object with that name already exists, the new object is given a unique name.  File: geomview, Node: new-reset, Next: NeXT, Prev: new-geometry, Up: GCL Reference 7.2.84 new-reset ---------------- `(new-reset)' Equivalent to `(progn (new-center ALLGEOMS)(new-center ALLCAMS))'.  File: geomview, Node: NeXT, Next: normalization, Prev: new-reset, Up: GCL Reference 7.2.85 NeXT ----------- `(NeXT)' Returns `t' if running on a NeXT, `nil' if not. A relict from ancient work-station year.  File: geomview, Node: normalization, Next: not, Prev: NeXT, Up: GCL Reference 7.2.86 normalization -------------------- `(normalization GEOM-ID {each|none|all|keep})' Set the normalization status of GEOM-ID. `none' suppresses all normalization. `each' normalizes the object's bounding box to fit into the unit sphere, with the center of its bounding box translated to the origin. The box is scaled such that its long diagonal, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2. `all' resembles `each', except when an object is changing (e.g. when its geometry is being changed by an external program). Then, `each' tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while `all' normalizes the union of all variants of the object and normalizes accordingly. `keep' leaves the current normalization transform unchanged when the object changes. It may be useful to apply `each' or `all' normalization apply to the first version of a changing object to bring it in view, then switch to `keep'.  File: geomview, Node: not, Next: or, Prev: normalization, Up: GCL Reference 7.2.87 not ---------- `(not EXPR)' Evaluates `EXPR'; if `EXPR' returns a non-`nil' value, returns nil, if `EXPR' returns `nil', return `t'.  File: geomview, Node: or, Next: pick, Prev: not, Up: GCL Reference 7.2.88 or --------- `(or EXPR1 EXPR2)' Evaluates `EXPR1'; if `EXPR1' returns non-`nil', return its value, if `EXPR1' returns `nil', evaluate `EXPR2' and return its value.  File: geomview, Node: pick, Next: pick-invisible, Prev: or, Up: GCL Reference 7.2.89 pick ----------- `(pick COORDSYS GEOMID G V E F P VI EI FI)' The pick command is executed internally in response to pick events (right mouse double click). COORDSYS = coordinate system in which coordinates of the following arguments are specified. This can be: `world' world coord sys `self' coord sys of the picked geom (GEOMID) `primitive' coord sys of the actual primitive within the picked geom where the pick occurred. GEOMID = id of picked geom G = picked point (actual intersection of pick ray with object) V = picked vertex, if any E = picked edge, if any F = picked face P = path to picked primitive [0 or more] VI = index of picked vertex in primitive EI = list of indices of endpoints of picked edge, if any FI = index of picked face External modules can find out about pick events by registering interest in calls to `pick' via the `interest' command. In the ND-viewing context the co-ordinates are actually ND-points. They correspond to the 3D points of the pick relative to the sub-space defined by the viewport of the camera where the pick occurred. The co-ordinates are then padded with zeroes and transformed back to the co-ordinate system defined by COORDSYS.  File: geomview, Node: pick-invisible, Next: pickable, Prev: pick, Up: GCL Reference 7.2.90 pick-invisible --------------------- `(pick-invisible [yes|no])' Selects whether picks should be sensitive to objects whose appearance makes them invisible; default yes. With no arguments, returns current status.  File: geomview, Node: pickable, Next: position, Prev: pick-invisible, Up: GCL Reference 7.2.91 pickable --------------- `(pickable GEOM-ID {yes|no})' Say whether or not GEOM-ID is included in the pool of objects that could be returned from the pick command.  File: geomview, Node: position, Next: position-at, Prev: pickable, Up: GCL Reference 7.2.92 position --------------- `(position objectID otherID)' Set the transform of objectID to that of otherID. geomview-1.9.4/doc/geomview-20000644000175000001440000023473410663305733012760 00000000000000This is ../../doc/geomview, produced by makeinfo version 4.8 from ../../doc/geomview.texi. INFO-DIR-SECTION Graphics Applications START-INFO-DIR-ENTRY * Geomview: (geomview). The interactive 3D viewing program. END-INFO-DIR-ENTRY  File: geomview, Node: position-at, Next: position-toward, Prev: position, Up: GCL Reference 7.2.93 position-at ------------------ `(position-at objectID otherID [center | origin])' Translate objectID to the center of the bounding box or the origin of the coordinate system of otherID (parallel translation). Default is center.  File: geomview, Node: position-toward, Next: progn, Prev: position-at, Up: GCL Reference 7.2.94 position-toward ---------------------- `(position-toward objectID otherID [center | origin])' Rotate objectID so that the center of the bounding box or the origin of the coordinate system of the otherID lies on the positive z-axis of the first object. Default is the center of the bounding box.  File: geomview, Node: progn, Next: quit, Prev: position-toward, Up: GCL Reference 7.2.95 progn ------------ `(progn STATEMENT [ ... ])' evaluates each STATEMENT in order and returns the value of the last one. Use progn to group a collection of commands together, forcing them to be treated as a single command.  File: geomview, Node: quit, Next: quote, Prev: progn, Up: GCL Reference 7.2.96 quit ----------- `(quit)' `quit' is a synonym for *Note `exit': exit.  File: geomview, Node: quote, Next: rawevent, Prev: quit, Up: GCL Reference 7.2.97 quote ------------ `(quote EXPR)' returns the symbolic lisp expression EXPR without evaluating it.  File: geomview, Node: rawevent, Next: rawpick, Prev: quote, Up: GCL Reference 7.2.98 rawevent --------------- `(rawevent dev val x y t)' Enter the specified raw event into the event queue. The arguments directly specify the members of the event structure used internally by geomview. This is the lowest level event handler and is not intended for general use.  File: geomview, Node: rawpick, Next: read, Prev: rawevent, Up: GCL Reference 7.2.99 rawpick -------------- `(rawpick CAMID X Y)' Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordinates. This is a low-level procedure not intended for external use.  File: geomview, Node: read, Next: real-id, Prev: rawpick, Up: GCL Reference 7.2.100 read ------------ `(read {geometry|camera|appearance|image|ntransform|transform|command} {GEOMETRY or CAMERA or ...})' Read and interpret the text in ... as containing the given type of data. Useful for defining objects using OOGL reference syntax, e.g. (geometry thing { INST transform : T geom : fred }) (read geometry { define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 }) (read transform { define T . If no filename specified, see *Note `(rib-display ...': rib-display. for an explanation of the filename used.  File: geomview, Node: scale, Next: scene, Prev: rib-snapshot, Up: GCL Reference 7.2.108 scale ------------- `(scale GEOM-ID FACTOR [FACTORY FACTORZ])' Scale GEOM-ID, multiplying its size by FACTOR. The factors should be positive numbers. If FACTORY and FACTORZ are present and non-zero, the object is scaled by FACTOR in x, by FACTORY in y, and by FACTORZ in z. If only FACTOR is present, the object is scaled by FACTOR in x, y, and z. Scaling only really makes sense in Euclidean space. Mouse-driven scaling in other spaces is not allowed; the scale command may be issued in other spaces but should be used with caution because it may cause the data to extend beyond the limits of the space.  File: geomview, Node: scene, Next: set-clock, Prev: scale, Up: GCL Reference 7.2.109 scene ------------- `(scene CAM-ID [GEOMETRY])' Make CAM-ID look at GEOMETRY instead of at the universe.  File: geomview, Node: set-clock, Next: set-conformal-refine, Prev: scene, Up: GCL Reference 7.2.110 set-clock ----------------- `(set-clock TIME)' Adjusts the clock for this command stream to read TIME (in seconds) as of the moment the command is received. *Note `(sleep-until ...)': sleep-until. *Note `(clock ...)': clock.  File: geomview, Node: set-conformal-refine, Next: set-emodule-path, Prev: set-clock, Up: GCL Reference 7.2.111 set-conformal-refine ---------------------------- `(set-conformal-refine CMX [N [SHOWEDGES]])' Sets the parameters for the refinement algorithm used in drawing in the conformal model. CMX is the cosine of the maximum angle an edge can bend before it is refined. Its value should be between -1 and 1; the default is 0.95; decreasing its value will cause less refinement. N is the maximum number of iterations of refining; the default is 6. SHOWEDGES, which should be `no' or `yes', determines whether interior edges in the refinement are drawn.  File: geomview, Node: set-emodule-path, Next: set-load-path, Prev: set-conformal-refine, Up: GCL Reference 7.2.112 set-emodule-path ------------------------ `(set-emodule-path (PATH1 ... PATHN))' Sets the search path for external modules. The PATHi should be pathnames of directories containing, for each module, the module's executable file and a .geomview- file which contains an (emodule-define ...) command for that module. This command implicitly calls (rehash-emodule-path) to rebuild the application brower from the new path setting. The special directory name `+' is replaced by the existing path, so e.g. (set-emodule-path (mydir +)) prepends mydir to the path.  File: geomview, Node: set-load-path, Next: set-motionscale, Prev: set-emodule-path, Up: GCL Reference 7.2.113 set-load-path --------------------- `(set-load-path (PATH1 ... PATHN))' Sets search path for command, geometry, etc. files. The PATHi are strings giving the pathnames of directories to be searched. The special directory name `+' is replaced by the existing path, so e.g. (set-load-path (mydir +)) prepends mydir to the path.  File: geomview, Node: set-motionscale, Next: setenv, Prev: set-load-path, Up: GCL Reference 7.2.114 set-motionscale ----------------------- `(set-motionscale X)' Set the motion scale factor to X (default value 0.5). These commands scale their motion by an amount which depends on the distance from the frame to the center and on the size of the frame. Specifically, they scale by dist + scaleof(frame) * motionscale where dist is the distance from the center to the frame and motionscale is the motion scale factor set by this function. Scaleof(frame) measures the size of the frame object.  File: geomview, Node: setenv, Next: sgi, Prev: set-motionscale, Up: GCL Reference 7.2.115 setenv -------------- `(setenv name string)' sets the environment variable `name' to the value STRING; the name is visible to geomview (as in pathnames containing `$name') and to processes it creates, e.g. external modules.  File: geomview, Node: sgi, Next: shell, Prev: setenv, Up: GCL Reference 7.2.116 sgi ----------- `(sgi)' Returns `t' if running on an sgi machine, `nil' if not. A relict from the old work-station years.  File: geomview, Node: shell, Next: sleep-for, Prev: sgi, Up: GCL Reference 7.2.117 shell ------------- `(shell SHELL-COMMAND)' Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is `!'.  File: geomview, Node: sleep-for, Next: sleep-until, Prev: shell, Up: GCL Reference 7.2.118 sleep-for ----------------- `(sleep-for TIME)' Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; `sleep-for' inside `progn' won't delay execution of the rest of the progn's contents.  File: geomview, Node: sleep-until, Next: snapshot, Prev: sleep-for, Up: GCL Reference 7.2.119 sleep-until ------------------- `(sleep-until TIME)' Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; `sleep-until' inside `progn' won't delay execution of the rest of the progn's contents. Time is measured according to this stream's clock, as set by `set-clock'; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME.  File: geomview, Node: snapshot, Next: soft-shader, Prev: sleep-until, Up: GCL Reference 7.2.120 snapshot ---------------- `(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])' Save a snapshot of CAM-ID in the FILENAME (a string). The FORMAT argument is optional; it may be "ppmscreen" (the default), "ps", "ppm", "sgi" (on SGI machines), "ppmosmesa" (if built with libOSMesa) or "ppmosglx". A "ppmscreen" snapshot is created by reading the image directly from the given window; the window is popped above other windows and redrawn first, then its contents are written as a PPM format image. A "ppmosmesa" snapshot is drawn by Mesa's software renderer into a memory buffer in RAM. A "ppmosglx" snapshot is rendered into a GLX Pixmap buffer, which is also off-screen but may or may not reside in video RAM. Rendering may or may not be accelerated. The problem with on-screen snapshots is that the window must be mapped and not obscured by other windows. So on-screen snapshots will not work in the background, or when a screen safer is active. With "ps", dumps a Postscript picture representing the view from that window; hidden-surface removal might be incorrect. With "ppm", dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the FILENAME argument begins with "|", it's interpreted as a `/bin/sh' command to which the PPM or PS data should be piped. Optional XSIZE and YSIZE values are relevant only for "ppm" formats, and render to a window of that size (or scaled to that size, with aspect fixed, if only XSIZE is given)  File: geomview, Node: soft-shader, Next: space, Prev: snapshot, Up: GCL Reference 7.2.121 soft-shader ------------------- `(soft-shader CAM-ID {on|off|toggle})' Select whether to use software or hardware shading in that camera.  File: geomview, Node: space, Next: stereowin, Prev: soft-shader, Up: GCL Reference 7.2.122 space ------------- `(space {euclidean|hyperbolic|spherical})' Set the space associated with the world.  File: geomview, Node: stereowin, Next: time-interests, Prev: space, Up: GCL Reference 7.2.123 stereowin ----------------- `(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])' Configure CAM-ID as a stereo window. no: entire window is a single pane, stereo disabled horizontal: split left/right: left is stereo eye#0, right is #1. vertical: split top/bottom: bottom is eye#0, top is #1. colored: panes overlap, red is stereo eye#0, cyan is #1. A gap of `gapsize' pixels is left between subwindows; if omitted, subwindows are adjacent. If both layout and gapsize are omitted, e.g. (stereowin CAM-ID), returns current settings as a `(stereowin ...)' command list. This command doesn't set stereo projection; use `merge camera' or `camera' to set the stereyes transforms, and `merge window' or `window' to set the pixel aspect ratio & window position if needed.  File: geomview, Node: time-interests, Next: transform, Prev: stereowin, Up: GCL Reference 7.2.124 time-interests ---------------------- `(time-interests deltatime initial prefix [suffix])' Indicates that all interest-related messages, when separated by at least `deltatime' seconds of real time, should be preceded by the string `prefix' and followed by `suffix'; the first message is preceded by `initial'. All three are printf format strings, whose argument is the current clock time (in seconds) on that stream. A `deltatime' of zero timestamps every message. Typical usage: (time-interests .1 `(set-clock %g)' `(sleep-until %g)') or (time-interests .1 `(set-clock %g)' "(sleep-until %g) (progn (set-clock %g)" ")") or (time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))".  File: geomview, Node: transform, Next: transform-incr, Prev: time-interests, Up: GCL Reference 7.2.125 transform ----------------- `(transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [bbox-center|origin] [dt [`smooth']])' Apply a motion (rotation, translation, scaling) to object `objectID'; that is, construct and concatenate a transformation matrix with objectID's transform The 3 IDs involved are the object that moves, the center of motion, and the frame of reference in which to apply the motion. The center is easiest understood for rotations: if centerID is the same as objectID then it will spin around its own axes; otherwise the moving object will orbit the center object. Normally frameID, in whose coordinate system the (mouse) motions are interpreted, is `focus', the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the `space' command to change spaces. With type `rotate' x, y, and z are floats specifying angles in RADIANS. For types `translate' and `translate-scaled' x, y, and z are floats specifying distances in the coordinate system of the center object. The next field is optional and may consist of the keyword `bbox-center' or the keyword `origin' and modifies the location of the origin of OBJECTID's co-ordinate frame: `bbox-center' temporarily translates OBJECTID's co-ordinate frame to the center of OBJECTID's bounding box. `origin' is the default (and means not to modify OBJECTID's co-ordinate frame) and `bbox-center' is only valid in Euclidean space. The optional `dt' field allows a simple form of animation; if present, the object moves by just that amount during approximately `dt' seconds, then stops. If present and followed by the `smooth' keyword, the motion is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the motion is applied immediately.  File: geomview, Node: transform-incr, Next: transform-set, Prev: transform, Up: GCL Reference 7.2.126 transform-incr ---------------------- `(transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center] [dt [smooth]])' Apply continuing motion: construct a transformation matrix and concatenate it with the current transform of objectID every refresh (sets objectID's incremental transform). Same syntax as transform. If optional `dt' argument is present, the object is moved at each time step such that its average motion equals one instance of the motion per `dt' seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds.  File: geomview, Node: transform-set, Next: ui-cam-focus, Prev: transform-incr, Up: GCL Reference 7.2.127 transform-set --------------------- `(transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [origin|bbox-center])' Set objectID's transform to the constructed transform. Same syntax as transform.  File: geomview, Node: ui-cam-focus, Next: ui-center, Prev: transform-set, Up: GCL Reference 7.2.128 ui-cam-focus -------------------- `(ui-cam-focus [focus-change|mouse-cross])' Set the focus policy for the camera windows. The default is `mouse-cross': a camera is made the active camera (for interactive mouse events) when the mouse cursor crosses the window. Because this means it can become complicated to activate a specific camera (in the context of multiple camera windows) there is also the option to only change the camera focus when the window-manager decides to give it the focus for input events. So, after specifying `focus-change' it depends on the focus-change configuration of your window-manager when a camera becomes the active camera for mouse-interaction. To change this behaviour permanently you could, e.g., place the following line in your `${HOME}/.geomview' file (*note Customization::): (progn (ui-cam-focus focus-change) ... # other stuff )  File: geomview, Node: ui-center, Next: ui-center-origin, Prev: ui-cam-focus, Up: GCL Reference 7.2.129 ui-center ----------------- `(ui-center ID)' Set the center for user interface (i.e. mouse) controlled motions to object ID.  File: geomview, Node: ui-center-origin, Next: ui-emotion-program, Prev: ui-center, Up: GCL Reference 7.2.130 ui-center-origin ------------------------ `(ui-center-origin [origin|bbox-center])' Set the origin of the coordinate system of the `CENTER' object for user interface (i.e. mouse) controlled motions. The keyword `origin' means to use the origin of the coordinate system of the currently selected object, while `bbox-center' means to use the center of the bouding box of the current object. The keyword `bbox-center' makes no sense if the geometry is non-Euclidean. Using either `bbox-center' or `origin' does not make a difference if the center object is not a _geometry_, e.g. if it is a camera. Same holds if the World is the currently selected object.  File: geomview, Node: ui-emotion-program, Next: ui-emotion-run, Prev: ui-center-origin, Up: GCL Reference 7.2.131 ui-emotion-program -------------------------- `(ui-emotion-program PROGRAM)' This is an obsolete command. Use its new eqivalent *Note `emodule-define': emodule-define. instead.  File: geomview, Node: ui-emotion-run, Next: ui-freeze, Prev: ui-emotion-program, Up: GCL Reference 7.2.132 ui-emotion-run ---------------------- `(ui-emotion-run EMODULE)' This is an obsolete command. Use its new eqivalent *Note `emodule_start': emodule-start. instead.  File: geomview, Node: ui-freeze, Next: ui-html-browser, Prev: ui-emotion-run, Up: GCL Reference 7.2.133 ui-freeze ----------------- `(ui-freeze {on|off})' Toggle updating user interface panels. Off by default.  File: geomview, Node: ui-html-browser, Next: ui-motion, Prev: ui-freeze, Up: GCL Reference 7.2.134 ui-html-browser ----------------------- `(ui-html-browser BROWSER)' Use BROWSER for viewing the HTML-version of the manual when the `Manual (HTML)' menu item is selected in the `Help'-menu. If the `(ui-html-browser...)' command was never executed, then the default is to use the browser stored in the `WEBBROWSER' environment variable. If the environment variable is unset then the default is compile-time dependent.  File: geomview, Node: ui-motion, Next: ui-panel, Prev: ui-html-browser, Up: GCL Reference 7.2.135 ui-motion ----------------- `(ui-motion {inertia|constrain|own-coordinates} {on|off})' Enable or disable certain properties of mouse-controlled motion. The purpose of this command is to give access to the respective toggles of the _Main_ panel's _Motion_ menu through GCL commands. *Note Mouse Motions::. `inertia' Normally, moving objects have inertia: if the mouse is still moving when the button is released, the selected object continues to move. When `inertia' is off, objects cease to move as soon as you release the mouse. `constrain' It's sometimes handy to move an object in a direction aligned with a coordinate axis: exactly horizontally or vertically. Calling `(ui-motion constrain on)' changes the interpretation of mouse motions to allow this; approximately-horizontal or approximately-vertical mouse dragging becomes exactly horizontal or vertical motion. Note that the motion is still along the X or Y axes of the camera in which you move the mouse, not necessarily the object's own coordinate system. `own-coordinates' It's sometimes handy to move objects with respect to the coordinate system where they were defined, rather than with respect to some camera's view. When `(ui-motion own-coordinates on)' has been called, all motions are interpreted that way: dragging the mouse rightward in translate mode moves the object in its own +X direction, and so on. May be especially useful in conjunction with the `(ui-motion constrain on)' command.  File: geomview, Node: ui-panel, Next: ui-pdf-viewer, Prev: ui-motion, Up: GCL Reference 7.2.136 ui-panel ---------------- `(ui-panel PANELNAME {on|off} [WINDOW])' Do or don't display the given user-interface panel. Case is ignored in panel names. Current PANELNAMES are: geomview main panel tools motion controls appearance appearance controls cameras camera controls lighting lighting controls obscure obscure controls (doesn't seem to exist any more) materials material properties controls command command entry box credits geomview credits By default, the `geomview' and `tools' panels appear when geomview starts. If the optional Window is supplied, a `position' clause (e.g. (ui-panel obscure on { position xmin xmax ymin ymax }) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. `(ui-panel obscure on {')} causes interactive positioning.  File: geomview, Node: ui-pdf-viewer, Next: ui-target, Prev: ui-panel, Up: GCL Reference 7.2.137 ui-pdf-viewer --------------------- `(ui-pdf-viewer VIEWER)' Use the executable VIEWER for viewing the PDF-version of the manual when the `Manual (PDF)' menu-item is selected in the `Help'-menu. If the `(ui-pdf-viewer ...)' command was never executed, then the default is to use the browser stored in the `PDFVIEWER' environment variable. If the environment variable is unset then the default is compile-time dependent.  File: geomview, Node: ui-target, Next: uninterest, Prev: ui-pdf-viewer, Up: GCL Reference 7.2.138 ui-target ----------------- `(ui-target ID [yes|no])' Set the target of user actions (the selected line of the target object browser) to ID. The second argument specifies whether to make ID the current object regardless of its type. If `no', then ID becomes the current object of its type (geom or camera). The default is `yes'. This command may result in a change of motion modes based on target choice.  File: geomview, Node: uninterest, Next: update, Prev: ui-target, Up: GCL Reference 7.2.139 uninterest ------------------ `(uninterest (COMMAND [args]))' Undoes the effect of an `interest' command. (COMMAND [args]) must be identical to those used in the *Note `interest': interest. command.  File: geomview, Node: update, Next: update-draw, Prev: uninterest, Up: GCL Reference 7.2.140 update -------------- `(update [timestep_in_seconds])' Apply each incremental motion once. Uses timestep if it's present and nonzero; otherwise motions are proportional to elapsed real time.  File: geomview, Node: update-draw, Next: window, Prev: update, Up: GCL Reference 7.2.141 update-draw ------------------- `(update-draw CAM-ID [timestep_in_seconds])' Apply each incremental motion once and then draw CAM-ID. Applies `timestep' seconds' worth of motion, or uses elapsed real time if `timestep' is absent or zero.  File: geomview, Node: window, Next: winenter, Prev: update-draw, Up: GCL Reference 7.2.142 window -------------- `(window CAM-ID WINDOW)' Specify attributes for the window of CAM-ID, e.g. its size or initial position, in the OOGL Window syntax. The special CAM-ID `default' specifies properties of future windows (created by *Note `camera': camera. or *Note `new-camera': new-camera.).  File: geomview, Node: winenter, Next: write, Prev: window, Up: GCL Reference 7.2.143 winenter ---------------- `(winenter CAM-ID)' Tell geomview that the mouse cursor is in the window of CAM-ID. This function is for development purposes and is not intended for general use.  File: geomview, Node: write, Next: write-comments, Prev: winenter, Up: GCL Reference 7.2.144 write ------------- `(write {command|geometry|camera|transform|ntransform|window} FILENAME [ID|(ID ...)] [self|world|universe|otherID])' write description of ID in given format to FILENAME. Last parameter chooses coordinate system for geometry & transform: self: just the object, no transformation or appearance (geometry only) world: the object as positioned within the World. universe: object's position in universal coordinates; includes Worldtransform other ID: the object transformed to otherID's coordinate system. A filename of `-' is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, `-' means geomview's standard output (*note `(command ...)': command.). The ID can either be a single id or a parenthesized list of ids, like `g0' or `(g2 g1 dodec.off)'.  File: geomview, Node: write-comments, Next: write-handle, Prev: write, Up: GCL Reference 7.2.145 write-comments ---------------------- `(write-comments FILENAME GEOMID PICKPATH)' write OOGL COMMENT objects in the GEOMID hierarchy at the level of the pick path to FILENAME. Specifically, COMMENTS at level (a b c ... f g) will match pick paths of the form (a b c ... f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the `pick' command) is a list of integer counters specifying a subpart of a hierarchical OOGL object. Descent into a complex object (LIST or INST) adds a new integer to the path. Traversal of simple objects increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire string of zero, one, or more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses. Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objects, which can be attached to other OOGL objects via the LIST type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned.  File: geomview, Node: write-handle, Next: write-sexpr, Prev: write-comments, Up: GCL Reference 7.2.146 write-handle -------------------- `(write-handle PREFIX FILENAME HANDLE)' Writes the object underlying the given handle to FILENAME. This function is intended for internal debugging use only.  File: geomview, Node: write-sexpr, Next: xform, Prev: write-handle, Up: GCL Reference 7.2.147 write-sexpr ------------------- `(write-sexpr FILENAME LISPOBJECT)' Writes the given LISPOBJECT to FILENAME. This function is intended for internal debugging use only.  File: geomview, Node: xform, Next: xform-incr, Prev: write-sexpr, Up: GCL Reference 7.2.148 xform ------------- `(xform ID TRANSFORM)' Concatenate TRANSFORM with the current transform of the object (apply TRANSFORM to object ID).  File: geomview, Node: xform-incr, Next: xform-set, Prev: xform, Up: GCL Reference 7.2.149 xform-incr ------------------ `(xform-incr ID TRANSFORM)' Apply continual motion: concatenate TRANSFORM with the current transform of the object every refresh (set object ID's incremental transform to TRANSFORM).  File: geomview, Node: xform-set, Next: zoom, Prev: xform-incr, Up: GCL Reference 7.2.150 xform-set ----------------- `(xform-set ID TRANSFORM)' Overwrite the current object transform with TRANSFORM (set object ID's transform to TRANSFORM).  File: geomview, Node: zoom, Prev: xform-set, Up: GCL Reference 7.2.151 zoom ------------ `(zoom CAM-ID FACTOR)' Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number.  File: geomview, Node: Non-Euclidean Geometry, Next: Mathematica, Prev: GCL, Up: Top 8 Non-Euclidean Geometry ************************ Geomview supports hyperbolic and spherical geometry as well as Euclidean geometry. The three buttons at the bottom of the _Main_ panel are for setting the current geometry type. In each of the three geometries, three models are supported: _Virtual_, _Projective_, and _Conformal_. You can change the current model with the _Model_ browser on the _Camera_ panel. Each Geomview camera has its own model setting. The default model is all three spaces is _Virtual_. This corresponds to the camera being in the same space as, and moving under the same set of transformations as, the geometry itself. In Euclidean space _Virtual_ is the most useful model. The other models were implemented for hyperbolic and spherical spaces and just happen to work in Eucldiean space as well: _Projective_ is the same as _Virtual_ but by default displays the unit sphere, and _Conformal_ displays everything inverted in the unit sphere. In hyperbolic space, the _Projective_ model setting gives a view of the projective ball model of hyperbolic 3-space imbedded in Euclidean space. The camera is initially outside the unit ball. In this model, the camera moves by Euclidean motions and geometry moves by hyperbolic motions. _Conformal_ model is similar but shows the conformal ball model instead. In spherical space, the _Projective_ model gives a view of half of the 3-sphere imbedded in Euclidean 3-space. Spherical motions give rise to projective transformations in the _Projective_ model, and to Moebius transformations in the _Conformal_ model. In both of these models the camera moves by Euclidean motions. In _Projective_ and _Conformal_ models, the unit sphere is drawn by default. You can turn it off and on at will using the _Draw Sphere_ button in the _Camera_ panel. In the _Conformal_ model, polygons and edges are subdivided as necessary to make them look curved. The parameters which determine this subdivision can be set with the `set-conformal-refine' GCL command. *Note `(set-conformal-refine ...)': set-conformal-refine. There are several sample hyperbolic space objects in the `data/geom/hyperbolic' subdirectory of the Geomview directory. Likewise, the subdirectory `data/geom/spherical' contains several sample spherical space objects.  File: geomview, Node: Mathematica, Next: Installation, Prev: Non-Euclidean Geometry, Up: Top 9 Mathematica Graphics in Geomview or RenderMan *********************************************** Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc. There are two ways to do this. 1. Use Mathematica to write a graphics object to a file in OOGL format or in RIB format. 2. Use Geomview as the default display for all 3D graphics output in Mathematica. You can also use these packages to save Mathematica graphics in RenderMan (RIB) format. Since the format of Mathematica graphics objects is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either of the above you must install this package. * Menu: * OOGL.m:: Generating OOGL files in Mathematica. * Geomview.m:: Geomview as Mathematica's Default 3D Display. * RenderMan:: Generating RenderMan files in Mathematica. * Remote Display:: Using Geomview and Mathematica on different computers. * Package Details:: Some details about the packages. * Package Installation:: Installing the Mathematica->Geomview package.  File: geomview, Node: OOGL.m, Next: Geomview.m, Prev: Mathematica, Up: Mathematica 9.1 Using Mathematica to generate OOGL files ============================================ The package `OOGL.m' allows Mathematica to write graphics objects in OOGL format. To use it, give the command `<< OOGL.m' to Mathematica to load the package. The `WriteOOGL[FILE,GRAPHICS]' command writes an OOGL description of the 3D graphics object GRAPHICS to the file named FILE. This package also provides the `Geomview' command which sends a 3D graphics object to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the `Geomview' command. `Geomview[GRAPHICS]' Sends the 3D graphics object GRAPHICS to Geomview as a geom named `Mathematica'. Subsequent usage of `Geomview[GRAPHICS]' replaces the `Mathematica' object in Geomview with the new GRAPHICS. ``Geomview[NAME,GRAPHICS]'' Sends the 3D graphics object GRAPHICS to Geomview as a geom named NAME. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objects at once and allow independent control over them. % math Mathematica 2.0 for SGI Iris Copyright 1988-91 Wolfram Research, Inc. -- GL graphics initialized -- In[1] := <"riemann"] This displays the graphics `%3' on the remote host named `riemann'. `Geomview' recognizes the string `"local"' as a value for `$DisplayHost'; it forces the graphics to be displayed on the local machine. In addition to knowing the name of the machine you want to run Geomview on, `Geomview' needs to know the type of that machine (the setting of the CPU variable that corresponds to the machine; *note Source Code Installation::). By default, `Geomview' assumes that it is the same kind of computer as the one you are running Mathematica on. The `MachType' option lets you explicitly specify the type of the `DisplayHost' computer; it should be one of the strings `"sgi"' or `"next"' or `"x11"'. You can use `SetOptions' to change the default `DisplayHost' and `MachType'. For example, In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"] arranges for `Geomview' to run Geomview on an SGI workstation named `riemann'.  File: geomview, Node: Chunks, Prev: Networked Geomview, Up: Remote Display 9.4.2 Transporting Mathematica Files to Geomview by Hand -------------------------------------------------------- The auxilliary function `WriteChunk' is for those who can only use Mathematica on a computer that Geomview isn't installed on. `WriteChunk[FILE, GRAPHICS]' generates a file named FILE which contains the graphics object GRAPHICS in the format accepted by `math2oogl'. You can transfer that file to a computer that has Geomview installed on it and then use the programs `math2oogl', `oogl2ri'b, and `geomview' directly from the shell. These programs are distributed in the `bin/' subdirectory of the Geomview directory, and may have been installed so that they are on your `path'. In[1]:= < mma.oogl to convert it to the OOGL file `mma.oogl' which you can then view using Geomview. This is the equivalent of the `WriteOOGL' command. For a result equivalent to the `Geomview' or `Show' commands, type math2oogl -togeomview Mathematica geomview < mychunk The `WriteRI'b command can be emulated from the shell as math2oogl < mychunk | oogl2rib -n mma.tiff  File: geomview, Node: Package Details, Next: Package Installation, Prev: Remote Display, Up: Mathematica 9.5 Details of the Mathematica->Geomview Package ================================================ The `OOGL.m' package uses the external program `math2oogl' to convert `Graphics3D' objects to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica. The converter will sometimes handle colored SurfaceGraphics objects correctly that Mathematica does not handle correctly, which means that Geomview[object] sometimes works where Show[object] will give errors. The converter supports the `Polygon', `Line', and `Point' graphics primitives, `RGBColor Graphics3D' directives, and `SurfaceGraphics' objects with or without `RGBColor' directives, and lists of any combination of these. It silently ignores all other directives. The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib). In the `WriteOOGL' and `WriteRIB' commands, filename can either be a string containing a filename, an `OutputStream' object, or a string starting with a `!' to send the output to a command. Object can be a `Graphics3D' object, a `SurfaceGraphics' object, or a list of these. The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host.  File: geomview, Node: Package Installation, Prev: Package Details, Up: Mathematica 9.6 Installing the Mathematica Packages ======================================= BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. The installed Mathematica data-files can be found in `PREFIX/share/geomview/Mathematica/'. If Geomview is properly installed on your system according to the instructions in *Note Installation::, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed. In this section, the phrase _Geomview installation_ refers any of the procedures in *Note Installation::. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution. 1. The relevant mathematica files are `OOGL.m', `Geomview.m', and `BezierPlot.m'; Mathematica must be able to find these files. They are distributed in the `PREFIX/share/geomview/Mathematica' subdirectory of the binary distributions, and in the `TOPSRCDIR/src/bin/geomutil/math2oogl' subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the `$Path' variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path. The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (`MMAPACKAGEDIR'). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the `$Path' variable each time you run Mathematica. 2. The package `OOGL.m' needs to be able to invoke the programs `geomview', `math2oogl', and `oogl2rib'. The Geomview installation procedure installs these programs into a directory that you specify for executables (`BINDIR'). Ideally, this directory should be on your shell's `$PATH'. More specifically, it should be on the `$PATH' of the shell in which Mathematica runs; the directory `/usr/local/bin' is usually a good choice. You can see the list of directories on this path by giving the command `!echo $path' in Mathematica. If for some reason you can't arrange for `geomview', `math2oogl', and `oogl2rib' to be in a directory on the shell's `$path', you can modify `OOGL.m' to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables `$GeomviewPath' and `$GeomRoot', which are defined near the top of the file. Change `$GeomviewPath' to the absolute pathname of the `geomview' shell script on your system. Change `$GeomRoot' to the absolute pathname of the `$GEOMROOT' directory on your system. If you do this, you should also make sure there are copies of `geomview', `math2oogl', and `oogl2ri'b in the `$GEOMROOT/bin/'. 3. The `geomview' shell script, which `OOGL.m' uses to invoke Geomview, needs to be able to find the geomview executable file ( called `gvx'). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the `geomview' script are correct.  File: geomview, Node: Installation, Next: Support, Prev: Mathematica, Up: Top 10 Installation *************** BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. What you do to install Geomview depends on which kind of computer you have and on whether you have the source distribution or the binary distribution. In general, if you don't care about looking at Geomview's source code, you should get one of the binary distribution. The binary installation is much easier and quicker than compiling and installing the source code. * Menu: * Unix Binary Installation:: Installing the Unix Binary Distribution * Source Code Installation:: Compiling and Installing the Source Code Distribution.  File: geomview, Node: Unix Binary Installation, Next: Source Code Installation, Prev: Installation, Up: Installation 10.1 Installing the Unix Binary Distribution ============================================ BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. If you have just obtained a copy of the binary distribution for a Unix system (Linux, SGI, Solaris, HP, etc), you should be able to run Geomview and make use of most of its features immediately after unpacking it by `cd''ing to the directory that it is in and typing `geomview'. In order to fully install Geomview so that you can run it from any directory and use all of its features, follow the steps in this section. In particular, you must go through this installation procedure in order to use Geomview to display Mathematica graphics. Geomview is distributed in a directory that contains various files and subdirectories that Geomview needs at run-time, such as data files and external modules. It also contains other things distributed with Geomview, such as documentation and (in the soure-code distribution) source-code. We refer to the root directory of this tree as the `$GEOMROOT' directory. This is the directory called `Geomview' that is created when you unpack the distribution file. To install Geomview on your system, arrange for the `$GEOMROOT' directory to be in a permanent place. Then, in a shell window, `cd' to that directory and type `install'. This runs a shell script which does the installation after asking you several questions about where you want to install the various components of Geomview. After running the `install' script you should now be able to run Geomview from any directory on your system. (You may need to give the `rehash' command in any shells on your computer that were started up before you did the installation.) The `install' script puts copies of the files in `$GEOMROOT/bin/' and `$GEOMROOT/man' into the directories you specified for executables and man pages, respectively. Once you have done the installation you can cut down one the disk space required by Geomview by removing some files from these directories, since copies have been installed elsewhere. You should first test that your installed Geomview works properly because once you remove these files from their distribution directories you will not be able to do the installation again. In particular, the files you can remove are `$GEOMROOT/bin/': (where `' is the type of system you are on, e.g. `linux', `sgi', `hpux', etc). Remove all files from here except `gvx', which is the geomview executable file. DO NOT REMOVE `gvx'. It is not installed elsewhere. `$GEOMROOT/man': You can remove all the files in this directory. * Menu: * Unix Binary Detail::  File: geomview, Node: Unix Binary Detail, Prev: Unix Binary Installation, Up: Unix Binary Installation 10.1.1 Details of the Unix Binary Installation ---------------------------------------------- BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. The `install' script should be self-explanatory; just run it and answer the questions. This section gives some details for system administrators and other users who may want to know more about the installation. The installation is actually done by `make'; the `install' script queries the user for the settings of the following `make' variables and then invokes `make install'. `GEOMROOT': the absolute pathname of the Geomview root directory. The `geomview' shell script, which is what users invoke to run Geomview, uses this to set various environment variables that Geomview needs. It is very important that this be an _absolute_ pathname -- i.e. it should start with a '/'. `BINDIR': a directory where executable files are installed. The `geomview' shell script goes here, as well as various other auxiliary programs that can be used in conjunction with `geomview'. This should be a directory that is on users' `$path'. These auxiliary programs are distributed in the `$GEOMROOT/bin/' directory; if you specify this directory for `BINDIR', they are left in that directory. `MANDIR': a directory where Unix manual pages are installed. These are distributed in the `$GEOMROOT/man' subdirectory; if you specify this directory for `MANDIR', they are left in that directory. `MMAPACKAGEDIR': a directory where Mathematica packages are installed. This should be a directory that Mathematica searches for packages that it loads; you can see what directories your Mathematica searches by looking at the value of the `$Path' variable in a Mathematica session. The installation process will install some packages there which allow you to use Geomview to display Mathematica graphics. These packages are distributed in the `$GEOMROOT/mathematica' subdirectory; if you specify this directory for `MMAPACKAGEDIR', or if you specify the empty string for `MMAPACKAGEDIR', the packages are left in that directory. For more details about the way these Mathematica packages connect to Geomview, *note Package Installation::.  File: geomview, Node: Source Code Installation, Prev: Unix Binary Installation, Up: Installation 10.2 Compiling and Installing the Source Code Distribution ========================================================== BUG: This section is out of date. `Geomview' follows the GNU-installation habits, data goes to `PREFIX/share/geomview/', user executables to `PREFIX/bin/', private executables to `PREFIX/libexec/geomview/', libraries to `PREFIX/lib/' where `PREFIX' denotes the installation prefiex specified for the `TOPSRCDIR/configure' script. Please have a look at the files `TOPSRCDIR/INSTALL' and `TOPSRCDIR/INSTALL.Geomview' for installation instructions. The main reason to get the source code distribution is to look at and/or work with the source code. If you are only concered with _using_ Geomview it is better to get the binary distribution. It takes anywhere from a few minutes to an hour or more to compile the entire source distribution, depending on what kind of computer you have. Let `$GEOMROOT' denote the full pathname of the Geomview source code directory; this is the directory called `Geomview' that is created when you unpack the distribution. This directory contains the Geomview source code as well as various other files and subdirectories that Geomview needs when it runs. Before doing any compilation you should edit the file `$GEOMROOT/makefiles/mk.site.default'. This file defines some `make' variables which specify your local configuration. This includes the pathnames of the directories into which Geomview will be installed, and possibly some other settings as well. There are comments in the file telling you what to do. This file is included by every Makefile in the source tree, so the settings you specify here are used throughout the source. If you will be compiling for multiple systems, you can do them all in the same directory tree. By default the Makefiles are set up to put the objects files, libraries, and executables in directories which depend on the type of computer, so the two architectures will not interfere with each other. The Makefiles use a variable called `CPU' to determine the type of machine. Before doing any compilation you must arrange for this variable to have a value. There are two ways you can do this. 1. If you will always be compiling Geomview on the same type of computer edit the file `$GEOMROOT/makefiles/Makedefs.global' to set the `CPU' variable to one of the values `linux', `FreeBSD', `sgi', `hpux', `hpux-gcc', `solaris', `sun4os4' (for Suns with SunOS 4, not Solaris), `rs6000', or `alpha'. If you're using a type of system not in this list, make up a new value for CPU, and write a `mk.' file for it patterned after the other `mk.*' in the `makefiles' subdirectory. 2. If you will be compiling on more than one type of computer you can set a shell environment variable named `CPU' to one of the values above and the Makefiles will inherit the value from the environment. Note that many of the Makefiles refer to a variable called `MACHTYPE'; this variable tells which type of graphics system to compile Geomview for. The `mk.' files set this variable for you; in most cases its value is `x11', which specifies that Geomview should be compiled for X windows. Once you have configured your source tree by editing the files as described above and setting the `CPU' variable, you can compile and install Geomview by typing `make install' in the `$GEOMROOT' directory. You can also type `make all', or equivalently just `make', to compile without installing, and then type `make install' later to install. You can use these same `make' comands in any subdirectory in the tree to recompile and/or install a part of Geomview or a module. If you want to modify the complier flags used during compilation, edit the file `$GEOMROOT/makefiles/Makedefs.global'; the `COPTS' variable specifies the flags passed to the C compiler (cc).  File: geomview, Node: Support, Next: Contributing, Prev: Installation, Up: Top Getting Technical Support for Geomview ************************************** There are several ways to get support for Geomview. 1. Visit the Geomview web site, `http://www.geomview.org'. It contains the latest documentation, news about development, and FAQ (Frequently Asked Questions) list. 2. Send email to the geomview-users@lists.sourceforge.net mailing list. This is a mailing list for discussing any issues related to using Geomview. To join the list, send an empty note with 'subscribe' in the subject line to geomview-users-request@lists.sourceforge.net (mailto:geomview-users-request@lists.sourceforge.net), or visit the list web page at `http://lists.sourceforge.net/mailman/listinfo/geomview-users'. 3. Contract with Geometry Technologies for support. Geometry Technologies is a contract support and programming company that emerged from the Geometry Center, where Geomview was written. For more information visit the Geometry Technologies web site at `http://www.geomtech.com'.  File: geomview, Node: Contributing, Next: Function Index, Prev: Support, Up: Top Contributing to Geomview's Development ************************************** If you are interested in contributing to the development of Geomview, there are several things you can do: 1. *Volunteer programming work*. If you are a programmer and make an improvement to Geomview, contact the other geomview authors by sending a note to the `geomview-users' mailing list (see `http://lists.sourceforge.net/mailman/listinfo/geomview-users'). 2. *Contract with Geometry Technologies*. Geometry Technologies, Inc. is a consulting firm that provides contract technical support and custom programming services in the area of 3D graphics. This includes a wide range of services related to 3D graphics, included but not limited to applications involving Geomview. To the extent that resources allow, Geometry Technologies supports the developement of Geomview; in particular it hosts the `http://www.geomview.org' web site, and its staff make ongoing improvements to Geomview itself. If you are in a position to pay for technical support or custom programming work, contracting with Geometry Technologies indirectly supports Geomview. You can also contract with with Geometry Technologies to have particular features that you want added to Geomview, or to port Geomview to a new platform. For more information see Geometry Technologies web site at `http://www.geomtech.com'. Thank you.  File: geomview, Node: Function Index, Next: List of Figures, Prev: Contributing, Up: Top Function Index ************** [index] * Menu: * !, shell <1>: shell. (line 6) * !, shell: shell. (line 6) * <: lt. (line 6) * =: eq. (line 6) * >: gt. (line 6) * ?: help. (line 6) * ??: morehelp. (line 6) * all: all. (line 6) * all camera: all. (line 8) * all emodule defined: all. (line 11) * all emodule running: all. (line 14) * all geometry: all. (line 6) * and: and. (line 6) * ap-override: ap-override. (line 6) * backcolor: backcolor. (line 6) * background-image: background-image. (line 6) * bbox-color: bbox-color. (line 6) * bbox-draw: bbox-draw. (line 6) * camera: camera. (line 6) * camera-draw: camera-draw. (line 6) * camera-prop: camera-prop. (line 6) * camera-reset: camera-reset. (line 6) * car: car. (line 6) * cdr: cdr. (line 6) * clock: clock. (line 6) * command: command. (line 6) * copy: copy. (line 6) * cursor-still: cursor-still. (line 6) * cursor-twitch: cursor-twitch. (line 6) * delete: delete. (line 6) * dice: dice. (line 6) * dimension: dimension. (line 6) * dither: dither. (line 6) * draw: draw. (line 6) * dump-handles: dump-handles. (line 6) * echo: echo. (line 6) * emodule-clear: emodule-clear. (line 6) * emodule-define: emodule-define. (line 6) * emodule-defined: emodule-defined. (line 6) * emodule-isrunning: emodule-isrunning. (line 6) * emodule-path: emodule-path. (line 6) * emodule-run, | <1>: emodule-run. (line 6) * emodule-run, |: emodule-run. (line 6) * emodule-sort: emodule-sort. (line 6) * emodule-start: emodule-start. (line 6) * emodule-transmit: emodule-transmit. (line 6) * escale: escale. (line 6) * event-keys: event-keys. (line 6) * event-mode: event-mode. (line 6) * event-pick: event-pick. (line 6) * evert: evert. (line 6) * exit: exit. (line 6) * ezoom: ezoom. (line 6) * freeze: freeze. (line 6) * geometry: geometry. (line 6) * geomview-version: geomview-version. (line 6) * hdefine: hdefine. (line 6) * hdelete: hdelete. (line 6) * help: help. (line 6) * hmodel: hmodel. (line 6) * hsphere-draw: hsphere-draw. (line 6) * if: if. (line 6) * inhibit-warning: inhibit-warning. (line 6) * input-translator: input-translator. (line 6) * interest: interest. (line 6) * lines-closer: lines-closer. (line 6) * load: load. (line 6) * load-path: load-path. (line 6) * look: look. (line 6) * look-encompass: look-encompass. (line 6) * look-encompass-size: look-encompass-size. (line 6) * look-recenter: look-recenter. (line 6) * look-toward: look-toward. (line 6) * merge: merge. (line 6) * merge-ap: merge-ap. (line 6) * merge-base-ap: merge-base-ap. (line 6) * merge-baseap: merge-baseap. (line 6) * morehelp: morehelp. (line 6) * name-object: name-object. (line 6) * ND-axes: ND-axes. (line 6) * ND-color: ND-color. (line 6) * ND-xform: ND-xform. (line 6) * ND-xform-get: ND-xform-get. (line 6) * ND-xform-set: ND-xform-set. (line 6) * new-alien: new-alien. (line 6) * new-camera: new-camera. (line 6) * new-center: new-center. (line 6) * new-geometry: new-geometry. (line 6) * new-reset: new-reset. (line 6) * NeXT: NeXT. (line 6) * normalization: normalization. (line 6) * not: not. (line 6) * or: or. (line 6) * pick: pick. (line 6) * pick-invisible: pick-invisible. (line 6) * pickable: pickable. (line 6) * position: position. (line 6) * position-at: position-at. (line 6) * position-toward: position-toward. (line 6) * progn: progn. (line 6) * quit: quit. (line 6) * quote: quote. (line 6) * rawevent: rawevent. (line 6) * rawpick: rawpick. (line 6) * read: read. (line 6) * real-id: real-id. (line 6) * redraw: redraw. (line 6) * regtable: regtable. (line 6) * rehash-emodule-path: rehash-emodule-path. (line 6) * replace-geometry: replace-geometry. (line 6) * rib-display: rib-display. (line 6) * rib-snapshot: rib-snapshot. (line 6) * scale: scale. (line 6) * scene: scene. (line 6) * set-clock: set-clock. (line 6) * set-conformal-refine: set-conformal-refine. (line 6) * set-emodule-path: set-emodule-path. (line 6) * set-load-path: set-load-path. (line 6) * set-motionscale: set-motionscale. (line 6) * setenv: setenv. (line 6) * sgi: sgi. (line 6) * shell, ! <1>: shell. (line 6) * shell, !: shell. (line 6) * sleep-for: sleep-for. (line 6) * sleep-until: sleep-until. (line 6) * snapshot: snapshot. (line 6) * soft-shader: soft-shader. (line 6) * space: space. (line 6) * stereowin: stereowin. (line 6) * time-interests: time-interests. (line 6) * transform: transform. (line 6) * transform-incr: transform-incr. (line 6) * transform-set: transform-set. (line 6) * ui-cam-focus: ui-cam-focus. (line 6) * ui-center: ui-center. (line 6) * ui-center-origin: ui-center-origin. (line 6) * ui-emotion-program: ui-emotion-program. (line 6) * ui-emotion-run: ui-emotion-run. (line 6) * ui-freeze: ui-freeze. (line 6) * ui-html-browser: ui-html-browser. (line 6) * ui-motion: ui-motion. (line 6) * ui-panel: ui-panel. (line 6) * ui-pdf-viewer: ui-pdf-viewer. (line 6) * ui-target: ui-target. (line 6) * uninterest: uninterest. (line 6) * update: update. (line 6) * update-draw: update-draw. (line 6) * window: window. (line 6) * winenter: winenter. (line 6) * write: write. (line 6) * write-comments: write-comments. (line 6) * write-handle: write-handle. (line 6) * write-sexpr: write-sexpr. (line 6) * xform: xform. (line 6) * xform-incr: xform-incr. (line 6) * xform-set: xform-set. (line 6) * zoom: zoom. (line 6) * |, emodule-run <1>: emodule-run. (line 6) * |, emodule-run: emodule-run. (line 6)  File: geomview, Node: List of Figures, Prev: Function Index, Up: Top List of Figures *************** * Menu: * Figure 2.1: Initial Geomview ...: figinitial. * Figure 2.2: Looking at the world.: figlookatworld. * Figure 2.3: The Appearance Panel.: figappearance. * Figure 2.4: Color Chooser Panel.: figcolorchooser. * Figure 2.5: The Files Panel.: figfilespanel. * Figure 2.6: Trefoil and ...: figtrefdodec. * Figure 3.1: The Main Panel: figmainpanel. * Figure 3.2: The Files Panel.: figmyfilelist. * Figure 3.3: The Load Panel.: figloadpanel. * Figure 3.4: The Tools Panel.: figtools. * Figure 3.5: The Appearance Panel.: figap. * Figure 3.6: Color Chooser Panel.: figcolorchooserpanel. * Figure 3.7: The Materials Panel.: figmatpanel. * Figure 3.8: The Cameras Panel.: figcamerapanel. * Figure 3.9: The Save Panel.: figsavepanel. * Figure 3.10: The Commands Panel.: figcommandpanel. geomview-1.9.4/doc/oogl.5gv0000644000175000001440000015503610600605202012415 00000000000000 OOGL(5gv) OOGL(5gv) NAME OOGL - File formats for OOGL geometric objects NOTE The material in this manual page also appears in the Geomview manual. DESCRIPTION OOGL File Formats ***************** The objects that you can load into Geomview are called OOGL objects. OOGL stands for "Object Oriented Graphics Library"; it is the library upon which Geomview is built. There are many different kinds of OOGL objects. This chapter gives syntactic descriptions of file formats for OOGL objects. Examples of most file types live in Geomview's `data/geom' directory. Conventions =========== Syntax Common to All OOGL File Formats -------------------------------------- Most OOGL object file formats are free-format ASCII --- any amount of white space (blanks, tabs, newlines) may appear between tokens (numbers, key words, etc.). Line breaks are almost always insignificant, with a couple of exceptions as noted. Comments begin with # and continue to the end of the line; they're allowed anywhere a newline is. Binary formats are also defined for several objects; *Note Binary format::, and the individual object descriptions. Typical OOGL objects begin with a key word designating object type, possibly with modifiers indicating presence of color information etc. In some formats the key word is optional, for compatibility with file formats defined elsewhere. Object type is then determined by guessing from the file suffix (if any) or from the data itself. Key words are case sensitive. Some have optional prefix letters indicating presence of color or other data; in this case the order of prefixes is significant, e.g. `CNMESH' is meaningful but `NCMESH' is invalid. File Names ---------- When OOGL objects are read from disk files, the OOGL library uses the file suffix to guess at the file type. If the suffix is unrecognized, or if no suffix is available (e.g. for an Geometry Center Thu Dec 12 02:36:08 CST 1996 1 OOGL(5) OOGL(5) object being read from a pipe, or embedded in another OOGL object), all known types of objects are tried in turn until one accepts the data as valid. Vertices -------- Several objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax is `X Y Z' (3-D floating-point vertex coordinates) or `X Y Z W' (4-D floating-point vertex coordinates) optionally followed by `NX NY NZ' (normalized 3-D surface-normal if present) optionally followed by `R G B A' (4-component floating-point color if present, each component in range 0..1. The A (alpha) component represents opacity: 0 transparent, 1 opaque.) optionally followed by `S T' `or' `S T U' (two or three texture-coordinate values). Values are separated by white space, and line breaks are immaterial. Letters in the object's header key word must appear in a specific order; that's the reverse of the order in which the data is given for each vertex. So a `CN4OFF' object's vertices contain first the 4-component space position, then the 3-component normal, finally the 4-component color. You can't change the data order by changing the header key word; an `NCOFF' is just not recognized. Surface normal directions ------------------------- Geometry Center Thu Dec 12 02:36:08 CST 1996 2 OOGL(5) OOGL(5) Geomview uses normal vectors to determine how an object is shaded. The direction of the normal is significant in this calculation. When normals are supplied with an object, the direction of the normal is determined by the data given. When normals are not supplied with the object, Geomview computes normal vectors automatically; in this case normals point toward the side from which the vertices appear in counterclockwise order. On parametric surfaces (Bezier patches), the normal at point P(u,v) is in the direction dP/du cross dP/dv. Transformation matrices ----------------------- Some objects incorporate 4x4 real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is a 4-element row vector representing homogeneous coordinates of a point in the OOGL object, and A is the 4x4 matrix, then the transformed point is p' = p A. This matrix convention is common in computer graphics; it's the transpose of that often used in mathematics, where points are column vectors multiplied on the right of matrices. Thus for Euclidean transformations, the translation components appear in the fourth row (last four elements) of A. A's last column (4th, 8th, 12th and 16th elements) are typically 0, 0, 0, and 1 respectively. Binary format ------------- Many OOGL objects accept binary as well as ASCII file formats. These files begin with the usual ASCII token (e.g. `CQUAD') followed by the word `BINARY'. Binary data begins at the byte following the first newline after `BINARY'. White space and a single comment may intervene, e.g. OFF BINARY # binary-format "OFF" data follows Binary data comprise 32-bit integers and 32-bit IEEE-format floats, both in big-endian format (i.e., with most significant byte first). This is the native format for 'int's and 'float's on Sun-3's, Sun-4's, and Irises, among others. Binary data formats resemble the corresponding ASCII formats, with ints and floats in just the places you'd expect. There are some exceptions though, specifically in the `QUAD', `OFF' and `COMMENT' file formats. Details are given in the individual file format descriptions. *Note QUAD::, *Note OFF::, and *Note COMMENT::. Binary OOGL objects may be freely mixed in ASCII object streams: Geometry Center Thu Dec 12 02:36:08 CST 1996 3 OOGL(5) OOGL(5) LIST { = MESH BINARY ... binary data for mesh here ... } { = QUAD 1 0 0 0 0 1 0 1 0 0 1 0 } Note that ASCII data resumes immediately following the last byte of binary data. Naturally, it's impossible to embed comments inside a binary-format OOGL object, though comments may appear in the header before the beginning of binary data. Embedded objects and external-object references ----------------------------------------------- Some object types (`LIST', `INST') allow references to other OOGL objects, which may appear literally in the data stream, be loaded from named disk files, or be communicated from elsewhere via named objects. Gcl commands also accept geometry in these forms. The general syntax is ::= [ "{" ] [ "define" `symbolname' ] [ "appearance" `appearance' ] [ ["="] `object-keyword' ... | "<" `filename' | ":" `symbolname' ] [ "}" ] where "quoted" items are literal strings (which appear without the quotes), [bracketed] items are optional, and | denotes alternatives. Curly braces, when present, must match; the outermost set of curly braces is generally required when the object is in a larger context, e.g. when it is part of a larger object or embedded in a Geomview command stream. For example, each of the following three lines: { define fred QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } { appearance { +edge } LIST { < "file1" } { : fred } } VECT 1 2 0 2 0 0 0 0 1 1 2 is a valid OOGL object. The last example is only valid when it is delimited unambiguously by residing in its own disk file. The "<" construct causes a disk file to be read. Note that this isn't a general textual "include" mechanism; a complete OOGL object must appear in the referenced file. Geometry Center Thu Dec 12 02:36:08 CST 1996 4 OOGL(5) OOGL(5) Files read using "<" are sought first in the directory of the file which referred to them, if any; failing that, the normal search path (set by Geomview's `load-path' command) is used. The default search looks first in the current directory, then in the Geomview data directories. The ":" construct allows references to symbols, created with `define'. A symbol's initial value is a null object. When a symbol is (re)defined, all references to it are automatically changed; this is a crucial part of the support for interprocess communication. Some future version of the documentation should explain this better... Again, white space and line breaks are insignificant, and "#" comments may appear anywhere. Appearances ----------- Geometric objects can have associated "appearance" information, specifying shading, lighting, color, wireframe vs. shaded-surface display, and so on. Appearances are inherited through object hierarchies, e.g. attaching an appearance to a `LIST' means that the appearance is applied to all the `LIST''s members. Some appearance-related properties are relegated to "material" and "lighting" substructures. Take care to note which properties belong to which structure. Here's an example appearance structure including values for all attributes. Order of attributes is unimportant. As usual, white space is irrelevant. Boolean attributes may be preceded by "+" or "-" to turn them on or off; "+" is assumed if only the attribute name appears. Other attributes expect values. A "*" prefix on any attribute, e.g. "*+edge" or "*linewidth 2" or "material { *diffuse 1 1 .25 }", selects "override" status for that attribute. appearance { +face # (Do) draw faces of polygons. On by default. -edge # (Don't) draw edges of polygons +vect # (Do) draw VECTs. On by default. -transparent # (Disable) transparency. enabling transparency # does NOT result in a correct Geomview picture, # but alpha values are used in RenderMan snapshots. -normal # (Do) draw surface-normal vectors normscale 1 # ... with length 1.0 in object coordinates +evert # do evert polygon normals where needed so as # to always face the camera -texturing # (Disable) texture mapping -backcull # (Don't) discard clockwise-oriented faces Geometry Center Thu Dec 12 02:36:08 CST 1996 5 OOGL(5) OOGL(5) -concave # (Don't) expect and handle concave polygons -shadelines # (Don't) shade lines as if they were lighted cylinders # These four are only effective where the graphics system # supports them, namely on GL and Open GL. -keepcolor # Normally, when N-D positional coloring is enabled as # with geomview's (ND-color ...) command, all # objects' colors are affected. But, objects with the # "+keepcolor" attribute are immune to N-D coloring. shading smooth # or "shading constant" or "shading flat" or # or "shading csmooth". # smooth = Gouraud shading, flat = faceted, # csmooth = smoothly interpolated but unlighted. linewidth 1 # lines, points, and edges are 1 pixel wide. patchdice 10 10 # subdivide Bezier patches this finely in u and v material { # Here's a material definition; # it could also be read from a file as in # "material < file.mat" ka 1.0 # ambient reflection coefficient. ambient .3 .5 .3 # ambient color (red, green, blue components) # The ambient contribution to the shading is # the product of ka, the ambient color, # and the color of the ambient light. kd 0.8 # diffuse-reflection coefficient. diffuse .9 1 .4 # diffuse color. # (In "shading constant" mode, the surface # is colored with the diffuse color.) ks 1.0 # specular reflection coefficient. specular 1 1 1 # specular (highlight) color. shininess 25 # specular exponent; larger values give # sharper highlights. backdiffuse .7 .5 0 # back-face color for two-sided surfaces # If defined, this field determines the diffuse # color for the back side of a surface. # It's implemented by the software shader, and # by hardware shading on GL systems which support # two-sided lighting, and under Open GL. alpha 1.0 # opacity; 0 = transparent (invisible), 1 = opaque. # Ignored when transparency is disabled. edgecolor 1 1 0 # line & edge color normalcolor 0 0 0 # color for surface-normal vectors } Geometry Center Thu Dec 12 02:36:08 CST 1996 6 OOGL(5) OOGL(5) lighting { # Lighting model ambient .3 .3 .3 # ambient light replacelights # "Use only the following lights to # illuminate the objects under this # appearance." # Without "replacelights", any lights listed # are added to those already in the scene. # Now a collection of sample lights: light { color 1 .7 .6 # light color position 1 0 .5 0 # light position [distant light] # given in homogeneous coordinates. # With fourth component = 0, # this means a light coming from # direction (1,0,.5). } light { # Another light. color 1 1 1 position 0 0 .5 1 # light at finite position ... location camera # specified in camera coordinates. # (Since the camera looks toward -Z, # this example places the light # .5 unit behind the eye.) # Possible "location" keywords: # global light position is in world (well, universe) coordinates # This is the default if no location specified. # camera position is in the camera's coordinate system # local position is in the coordinate system where # the appearance was defined } } # end lighting model texture { clamp st # or "s" or "t" or "none" file lump.tiff # file supplying texture-map image alphafile mask.pgm.Z # file supplying transparency-mask image apply blend # or "modulate" or "decal" transform 1 0 0 0 # surface (s,t,0,1) * tfm -> texture coords 0 1 0 0 0 0 1 0 .5 0 0 1 background 1 0 0 1 # relevant for "apply blend" } } # end appearance There are rules for inheritance of appearance attributes when several are imposed at different levels in the hierarchy. For example, Geomview installs a backstop appearance which provides Geometry Center Thu Dec 12 02:36:08 CST 1996 7 OOGL(5) OOGL(5) default values for most parameters; its control panels install other appearances which supply new values for a few attributes; user-supplied geometry may also contain appearances. The general rule is that the child's appearance (the one closest to the geometric primitives) wins. Further, appearance controls with "override" status (e.g. *+face or material { *diffuse 1 1 0 }) win over those without it. Geomview's appearance controls use the "override" feature so as to be effective even if user-supplied objects contain their own appearance settings. However, if a user-supplied object contains an appearance field with override status set, that property will be immune to Geomview's controls. Texture Mapping --------------- Some platforms support texture-mapped objects. (On those which don't, attempts to use texture mapping are silently ignored.) A texture is specified as part of an appearance structure, as in *Note Appearances::. Briefly, one provides a texture image, which is considered to lie in a square in `(s,t)' parameter space in the range 0 <= s <= 1, 0 <= t <= 1. Then one provides a geometric primitive, with each vertex tagged with `(s,t)' texture coordinates. If texturing is enabled, the appropriate portion of the texture image is pasted onto each face of the textured object. There is (currently) no provision for inheritance of part of a texture structure; if the `texture' keyword is mentioned in an appearance, it supplants any other texture specification. The appearance attribute `texturing' controls whether textures are used; there's no performance penalty for having texture { ... } fields defined when texturing is off. The available fields are: clamp none -or- s -or- t -or- st Determines the meaning of texture coordinates outside the range 0..1. With `clamp none', the default, coordinates are interpreted modulo 1, so (s,t) = (1.25,0), (.25,0), and (-.75,0) all refer to the same point in texture space. With `s' or `t' or `st', either or both of s- or t-coordinates less than 0 or greater than 1 are clamped to 1 or 0, respectively. file filename alphafile filename Specifies image file(s) containing the texture. The `file' file's image specifies color or lightness information; the `alphafile' if present, specifies a transparency ("alpha") mask; where the mask is zero, pixels are simply not drawn. Several image file formats are available; the file type must be Geometry Center Thu Dec 12 02:36:08 CST 1996 8 OOGL(5) OOGL(5) indicated by the last few characters of the file name: .ppm or .ppm.Z or .ppm.gz 24-bit 3-color image in PPM format .pgm or .pgm.Z or .pgm.gz 8-bit grayscale image in PGM format .sgi or .sgi.Z or .sgi.gz 8-bit, 24-bit, or 32-bit SGI image .tiff 8-bit or 24-bit TIFF image .gif GIF image (Though 4-channel TIFF images are possible, and could represent both color and transparency information in one image, that's not supported in geomview at present.) For this feature to work, some programs must be available in geomview's search path: zcat for .Z files gzip for .gz files tifftopnm for .tiff files giftoppm for .gif files If an `alphafile' image is supplied, it must be the same size as the `file' image. apply modulate -or- blend -or- decal Indicates how the texture image is applied to the surface. Here the "surface color" means the color that surface would have in the absence of texture mapping. With `modulate', the default, the texture color (or lightness, if textured by a gray-scale image) is multiplied by the surface color. With `blend', texture blends between the `background' color and the surface color. The `file' parameter must specify a gray-scale image. Where the texture image is 0, the surface color is unaffected; where it's 1, the surface is painted in the color given by `background'; and color is interpolated for intermediate values. With `decal', the `file' parameter must specify a 3-color image. If an `alphafile' parameter is present, its value interpolates between the surface color (where alpha=0) and the texture color (where alpha=1). Lighting does not affect the texture color in `decal' mode; effectively the texture is constant-shaded. background R G B A Specifies a 4-component color, with R, G, B, and A floating-point numbers normally in the range 0..1, used when `apply blend' is selected. transform `transformation-matrix' Expects a list of 16 numbers, or one of the other ways of representing a transformation (`: handlename' or `< filename'). The 4x4 transformation matrix is applied to texture coordinates, in the sense of a 4-component row vector (s,t,0,1) multiplied on the left of the matrix, to produce new coordinates (s',t') which actually index the texture. Geometry Center Thu Dec 12 02:36:08 CST 1996 9 OOGL(5) OOGL(5) Object File Formats =================== QUAD: collection of quadrilaterals ---------------------------------- The conventional suffix for a `QUAD' file is `.quad'. The file syntax is [C][N][4]QUAD -or- [C][N][4]POLY # Key word VERTEX VERTEX VERTEX VERTEX # 4*N vertices for some N VERTEX VERTEX VERTEX VERTEX ... The leading key word is `[C][N][4]QUAD' or `[C][N][4]POLY', where the optional `C' and `N' prefixes indicate that each vertex includes colors and normals respectively. That is, these files begin with one of the words `QUAD' `CQUAD' `NQUAD' `CNQUAD' `POLY' `CPOLY' `NPOLY' `CNPOLY' (but not `NCQUAD' or `NCPOLY'). `QUAD' and `POLY' are synonymous; both forms are allowed just for compatibility with ChapReyes. Following the key word is an arbitrary number of groups of four vertices, each group describing a quadrilateral. See the Vertex syntax above. The object ends at end-of-file, or with a closebrace if incorporated into an object reference (see above). A `QUAD BINARY' file format is accepted; *Note Binary format::. The first word of binary data must be a 32-bit integer giving the number of quads in the object; following that is a series of 32-bit floats, arranged just as in the ASCII format. MESH: rectangularly-connected mesh ---------------------------------- The conventional suffix for a `MESH' file is `.mesh'. The file syntax is [U][C][N][Z][4][u][v][n]MESH # Key word [NDIM] # Space dimension, present only if nMESH NU NV # Mesh grid dimensions # NU*NV vertices, in format specified # by initial key word VERTEX(u=0,v=0) VERTEX(1,0) ... VERTEX(NU-1,0) VERTEX(0,1) ... VERTEX(NU-1,1) ... VERTEX(0,NV-1) ... VERTEX(NU-1,NV-1) Geometry Center Thu Dec 12 02:36:08 CST 1996 10 OOGL(5) OOGL(5) The key word is `[U][C][N][Z][4][u][v][n]MESH'. The optional prefix characters mean: `U' Each vertex includes a 3-component texture space parameter. The first two components are the usual `S' and `T' texture parameters for that vertex; the third should be specified as zero. `C' Each vertex (see Vertices above) includes a 4-component color. `N' Each vertex includes a surface normal vector. `Z' Of the 3 vertex position values, only the Z component is present; X and Y are omitted, and assumed to equal the mesh (u,v) coordinate so X ranges from 0 .. (Nu-1), Y from 0 .. (Nv-1) where Nu and Nv are the mesh dimensions -- see below. `4' Vertices are 4D, each consists of 4 floating values. `Z' and `4' cannot both be present. `u' The mesh is wrapped in the u-direction, so the (0,v)'th vertex is connected to the (NU-1,v)'th for all v. `v' The mesh is wrapped in the v-direction, so the (u,0)'th vertex is connected to the (u,NV-1)'th for all u. Thus a u-wrapped or v-wrapped mesh is topologically a cylinder, while a uv-wrapped mesh is a torus. `n' Specifies a mesh whose vertices live in a higher dimensional space. The dimension follows the "MESH" keyword. Each vertex then has NDIM components. Note that the order of prefix characters is significant; a colored, u-wrapped mesh is a `CuMESH' not a `uCMESH'. Following the mesh header are integers NU and NV, the dimensions of the mesh. Then follow NU*NV vertices, each in the form given by the header. They appear in v-major order, i.e. if we name each vertex by (u,v) then the vertices appear in the order (0,0) (1,0) (2,0) (3,0) ... (NU-1,0) (0,1) (1,1) (2,1) (3,1) ... (NU-1,1) ... (0,Nv-1) ... (NU-1,NV-1) A `MESH BINARY' format is accepted; *Note Binary format::. The values of NU and NV are 32-bit integers; all other values are 32-bit floats. Bezier Surfaces --------------- Geometry Center Thu Dec 12 02:36:08 CST 1996 11 OOGL(5) OOGL(5) The conventional file suffixes for Bezier surface files are `.bbp' or `.bez'. A file with either suffix may contain either type of patch. Syntax: [ST]BBP -or- [C]BEZ[_ST] # NU, NV are u- and v-direction # polynomial degrees in range 1..6 # ND = dimension: 3->3-D, 4->4-D (rational) # (The '<' and '>' do not appear in the input.) # NU,NV,ND are each a single decimal digit. # BBP form implies NU=NV=ND=3 so BBP = BEZ333. # Any number of patches follow the header # (NU+1)*(NV+1) patch control points # each 3 or 4 floats according to header VERTEX(u=0,v=0) VERTEX(1,0) ... VERTEX(NU,0) VERTEX(0,1) ... VERTEX(NU,1) ... VERTEX(0,NV) ... VERTEX(NU,NV) # ST texture coordinates if mentioned in header `S'(u=0,v=0) `T'(0,0) `S'(0,NV) `T'(0,NV) `S'(NU,0) `T'(NU,0) `S'(NU,NV) `T'(NU,NV) # 4-component float (0..1) R G B A colors # for each patch corner if mentioned in header `RGBA'(0,0) `RGBA'(0,NV) `RGBA'(NU,0) `RGBA'(NU,NV) These formats represent collections of Bezier surface patches, of degrees up to 6, and with 3-D or 4-D (rational) vertices. The header keyword has the forms `[ST]BBP' or `[C]BEZ[_ST]' (the '<' and '>' are not part of the keyword. The `ST' prefix on `BBP', or `_ST' suffix on `BEZuvn', indicates that each patch includes four pairs of floating-point texture-space coordinates, one for each corner of the patch. The `C' prefix on `BEZuvn' indicates a colored patch, including four sets of four-component floating-point colors (red, green, blue, and alpha) in the range 0..1, one color for each corner. NU and NV, each a single digit in the range 1..6, are the patch's polynomial degree in the u and v direction respectively. ND is the number of components in each patch vertex, and must be either `3' for 3-D or `4' for homogeneous coordinates, that is, rational patches. Geometry Center Thu Dec 12 02:36:08 CST 1996 12 OOGL(5) OOGL(5) `BBP' patches are bicubic patches with 3-D vertices, so `BBP' = `BEZ333' and `STBBP' = `BEZ333_ST'. Any number of patches follow the header. Each patch comprises a series of patch vertices, followed by optional (s,t) texture coordinates, followed by optional (r,g,b,a) colors. Each patch has (NU+1)*(NV+1) vertices in v-major order, so that if we designate a vertex by its control point indices (u,v) the order is (0,0) (1,0) (2,0) ... (NU,0) (0,1) (1,1) (2,1) ... (NU,1) ... (0,NV) ... (NU,NV) with each vertex containing either 3 or 4 floating-point numbers as specified by the header. If the header calls for ST coordinates, four pairs of floating-point numbers follow: the texture-space coordinates for the (0,0), (NU,0), (0,NV), and (NU,NV) corners of the patch, respectively. If the header calls for colors, four four-component (red, green, blue, alpha) floating-point colors follow, one for each patch corner. The series of patches ends at end-of-file, or with a closebrace if incorporated in an object reference. Info file: geomview, -*-Text-*- produced by texinfo-format-buffer from file: geomview.tex OFF Files --------- The conventional suffix for `OFF' files is `.off'. Syntax: [ST][C][N][4][n]OFF # Header keyword [NDIM] # Space dimension of vertices, present only if nOFF NVERTICES NFACES NEDGES # NEdges not used or checked X[0] Y[0] Z[0] # Vertices, possibly with normals, # colors, and/or texture coordinates, in that order, # if the prefixes `N', `C', `ST' # are present. # If 4OFF, each vertex has 4 components, # including a final homogeneous component. # If nOFF, each vertex has NDIM components. # If 4nOFF, each vertex has NDIM+1 components. ... X[NVERTICES-1] Y[NVERTICES-1] Z[NVERTICES-1] Geometry Center Thu Dec 12 02:36:08 CST 1996 13 OOGL(5) OOGL(5) # Faces # NV = # vertices on this face # V[0] ... V[NV-1]: vertex indices # in range 0..NVERTICES-1 NV V[0] V[1] ... V[NV-1] COLORSPEC ... # COLORSPEC continues past V[NV-1] # to end-of-line; may be 0 to 4 numbers # nothing: default # integer: colormap index # 3 or 4 integers: RGB[A] values 0..255 # 3 or 4 floats: RGB[A] values 0..1 `OFF' files (name for "object file format") represent collections of planar polygons with possibly shared vertices, a convenient way to describe polyhedra. The polygons may be concave but there's no provision for polygons containing holes. An `OFF' file may begin with the keyword `OFF'; it's recommended but optional, as many existing files lack this keyword. Three ASCII integers follow: NVERTICES, NFACES, and NEDGES. Thse are the number of vertices, faces, and edges, respectively. Current software does not use nor check NEDGES; it needn't be correct but must be present. The vertex coordinates follow: dimension * NVERTICES floating-point values. They're implicitly numbered 0 through NVERTICES-1. dimension is either 3 (default) or 4 (specified by the key character `4' directly before `OFF' in the keyword). Following these are the face descriptions, typically written with one line per face. Each has the form N VERT1 VERT2 ... VERTN [COLOR] Here N is the number of vertices on this face, and VERT1 through VERTN are indices into the list of vertices (in the range 0..NVERTICES-1). The optional COLOR may take several forms. Line breaks are significant here: the COLOR description begins after VERTN and ends with the end of the line (or the next # comment). A COLOR may be: nothing the default color one integer index into "the" colormap; see below three or four integers RGB and possibly alpha values in the range 0..255 three or four floating-point numbers RGB and possibly alpha values in the range 0..1 For the one-integer case, the colormap is currently read from the file `cmap.fmap' in Geomview's `data' directory. Some better Geometry Center Thu Dec 12 02:36:08 CST 1996 14 OOGL(5) OOGL(5) mechanism for supplying a colormap is likely someday. The meaning of "default color" varies. If no face of the object has a color, all inherit the environment's default material color. If some but not all faces have colors, the default is gray (R,G,B,A=.666). A `[ST][C][N][n]OFF BINARY' format is accepted; *Note Binary format::. It resembles the ASCII format in almost the way you'd expect, with 32-bit integers for all counters and vertex indices and 32-bit floats for vertex positions (and texture coordinates or vertex colors or normals if `COFF'/`NOFF'/`CNOFF'/`STCNOFF'/etc. format). Exception: each face's vertex indices are followed by an integer indicating how many color components accompany it. Face color components must be floats, not integer values. Thus a colorless triangular face might be represented as int int int int int 3 17 5 9 0 while the same face colored red might be int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0 VECT Files ---------- The conventional suffix for `VECT' files is `.vect'. Syntax: [4]VECT NPOLYLINES NVERTICES NCOLORS NV[0] ... NV[NPOLYLINES-1] # number of vertices # in each polyline NC[0] ... NC[NPOLYLINES-1] # number of colors supplied # in each polyline VERT[0] ... VERT[NVERTICES-1] # All the vertices # (3*NVertices floats) COLOR[0] ... COLOR[NCOLORS-1] # All the colors # (4*NColors floats, RGBA) `VECT' objects represent lists of polylines (strings of connected line segments, possibly closed). A degenerate polyline can be used to represent a point. A `VECT' file begins with the key word `VECT' or `4VECT' Geometry Center Thu Dec 12 02:36:08 CST 1996 15 OOGL(5) OOGL(5) and three integers: NLINES, NVERTICES, and NCOLORS. Here NLINES is the number of polylines in the file, NVERTICES the total number of vertices, and NCOLORS the number of colors as explained below. Next come NLINES integers NV[0] NV[1] NV[2] ... NV[NLINES-1] giving the number of vertices in each polyline. A negative number indicates a closed polyline; 1 denotes a single-pixel point. The sum (of absolute values) of the NV[I] must equal NVERTICES. Next come NLINES more integers Nc[i]: the number of colors in each polyline. Normally one of three values: 0 No color is specified for this polyline. It's drawn in the same color as the previous polyline. 1 A single color is specified. The entire polyline is drawn in that color. abs(NV[I]) Each vertex has a color. Either each segment is drawn in the corresponding color, or the colors are smoothly interpolated along the line segments, depending on the implementation. The sum of the NC[I] must equal NCOLORS. Next come NVERTICES groups of 3 or 4 floating-point numbers: the coordinates of all the vertices. If the keyword is 4VECT then there are 4 values per vertex. The first abs(NV[0]) of them form the first polyline, the next abs(NV[1]) form the second and so on. Finally NCOLORS groups of 4 floating-point numbers give red, green, blue and alpha (opacity) values. The first NC[0] of them apply to the first polyline, and so on. A VECT BINARY format is accepted; *Note Binary format::. The binary format exactly follows the ASCII format, with 32-bit ints where integers appear, and 32-bit floats where real values appear. SKEL Files ---------- `SKEL' files represent collections of points and polylines, with shared vertices. The conventional suffix for `SKEL' files is `.skel'. Syntax: Geometry Center Thu Dec 12 02:36:08 CST 1996 16 OOGL(5) OOGL(5) [4][n]SKEL [NDIM] # Vertex dimension, present only if nSKEL NVERTICES NPOLYLINES X[0] Y[0] Z[0] # Vertices # (if nSKEL, each vertex has NDim components) ... X[NVERTICES-1] Y[NVERTICES-1] Z[NVERTICES-1] # Polylines # NV = # vertices on this polyline (1 = point) # V[0] ... V[NV-1]: vertex indices # in range 0..NVERTICES-1 NV V[0] V[1] ... V[NV-1] [COLORSPEC] ... # COLORSPEC continues past V[NV-1] # to end-of-line; may be nothing, or 3 or 4 numbers. # nothing: default color # 3 or 4 floats: RGB[A] values 0..1 The syntax resembles that of `OFF' files, with a table of vertices followed by a sequence of polyline descriptions, each referring to vertices by index in the table. Each polyline has an optional color. For `nSKEL' objects, each vertex has NDIM components. For `4nSKEL' objects, each vertex has NDIM+1 components; the final component is the homogeneous divisor. No `BINARY' format is implemented as yet for `SKEL' objects. SPHERE Files ------------ The conventional suffix for `SPHERE' files is `.sph'. SPHERE RADIUS XCENTER YCENTER ZCENTER Sphere objects are drawn using rational Bezier patches, which are diced into meshes; their smoothness, and the time taken to draw them, depends on the setting of the dicing level, 10x10 by default. From Geomview, the Appearance panel, the `ad' keyboard command, or a `dice nu nv' Appearance attribute sets this. INST Files ---------- The conventional suffix for a `INST' file is `.inst'. There is no INST BINARY format. An `INST' applies a 4x4 transformation to another OOGL object. It Geometry Center Thu Dec 12 02:36:08 CST 1996 17 OOGL(5) OOGL(5) begins with `INST' followed by these sections which may appear in any order: geom OOGL-OBJECT specifies the OOGL object to be instantiated. *Note References::, for the syntax of an OOGL-OBJECT. The keyword `unit' is a synonym for `geom'. transform ["{"] `4x4 transform' ["}"] specifies a single transformation matrix. Either the matrix may appear literally as 16 numbers, or there may be a reference to a "transform" object, i.e. "<" file-containing-4x4-matrix or ":" symbol-representing-transform-object> Another way to specify the transformation is transforms OOGL-OBJECT The OOGL-OBJECT must be a `TLIST' object (list of transformations) object, or a `LIST' whose members are ultimately `TLIST' objects. In effect, the `transforms' keyword takes a collection of 4x4 matrices and replicates the `geom' object, making one copy for each 4x4 matrix. If no `transform' nor `transforms' keyword appears, no transformation is applied (actually the identity is applied). You could use this for, e.g., wrapping an appearance around an externally-supplied object, though a single-membered LIST would do this more efficiently. *Note Transformation matrices::, for the matrix format. Two more INST fields are accepted: `location' and `origin'. location [global or camera or ndc or screen or local] Normally an INST specifies a position relative to its parent object; the `location' field allows putting an object elsewhere. * `location global' attaches the object to the global (a.k.a. universe) coordinate system -- the same as that in which geomview's World objects, alien geometry, and cameras are placed. * `location camera' places the object relative to the camera. (Thus if there are multiple views, it may appear in a different spatial position in each view.) The center of the camera's view is along its negative Z axis; positive X is rightward, positive Y upward. Normally the units of camera space are the same as global coordinates. When a camera is reset, the global origin is at (0,0,-3.0). * `location ndc' places the object relative to the normalized unit cube into which the camera's projection (perspective or orthographic) maps the visible world. X, Y, and Z are each in the range from -1 to +1, with Z = -1 the near and Z = +1 the far clipping plane, and X and Y increasing rightward and upward respectively. Thus something like INST transform 1 0 0 0 0 1 0 0 0 0 1 0 -.9 -.9 -.999 1 location ndc geom < label.vect pastes `label.vect' onto the lower left corner of each window, Geometry Center Thu Dec 12 02:36:08 CST 1996 18 OOGL(5) OOGL(5) and in front of nearly everything else, assuming `label.vect''s contents lie in the positive quadrant of the X-Y plane. It's tempting to use -1 rather than -.999 as the Z component of the position, but that may put the object just nearer than the near clipping plane and make it (partially) invisible, due to floating-point error. * `location screen' places the object in screen coordinates. The range of Z is still -1 through +1 as for ndc coordinates; X and Y are measured in pixels, and range from (0,0) at the *lower left* corner of the window, increasing rightward and upward. `location local' is the default; the object is positioned relative to its parent. origin [global or camera or ndc or screen or local] x y z The `origin' field translates the contents of the INST to place the origin at the specified point of the given coordinate system. Unlike `location', it doesn't change the orientation, only the choice of origin. Both `location' and `origin' can be used together. So for example { INST location screen origin ndc 0 0 -.99 geom { < xyz.vect } transform { 100 0 0 0 0 100 0 0 0 0 -.009 0 0 0 0 1 } } places xyz.vect's origin in the center of the window, just beyond the near clipping plane. The unit-length X and Y edges are scaled to be just 100 screen units -- pixels -- long, regardless of the size of the window. INST Examples ............. Here are some examples of `INST' files INST unit < xyz.vect transform { 1 0 0 0 0 1 0 0 0 0 1 0 1 3 0 1 } { appearance { +edge material { edgecolor 1 1 0 } } INST geom < mysurface.quad } {INST transform {: T} geom { } } geom { # stuff replicated by all the above matrices ... } } This one resembles the `origin' example in the section above, but makes the X and Y edges be 1/4 the size of the window (1/4, not 1/2, since the range of ndc X and Y coordinates is -1 to +1). { INST location ndc geom { < xyz.vect } transform { .5 0 0 0 0 .5 0 0 0 0 -.009 0 0 0 -.99 1 } } LIST Files ---------- The conventional suffix for a `LIST' file is `.list'. A list of OOGL objects Syntax: LIST OOGL-OBJECT OOGL-OBJECT ... Note that there's no explicit separation between the oogl-objects, so they should be enclosed in curly braces ({ }) for sanity. Likewise there's no explicit marker for the end of the list; unless appearing alone in a disk file, the whole construct should also be wrapped in braces, as in: { LIST { QUAD ... } { < xyz.quad } } A `LIST' with no elements, i.e. `{ LIST }', is valid, and is the easiest way to create an empty object. For example, to remove a symbol's definition you might write { define somesymbol { LIST } } TLIST Files ----------- Geometry Center Thu Dec 12 02:36:08 CST 1996 20 OOGL(5) OOGL(5) The conventional suffix for a `TLIST' file is `.grp' ("group") or or `.prj' ("projective" matrices). Collection of 4x4 matrices, used in the `transforms' section of and `INST' object. Syntax: TLIST # key word <4x4 matrix (16 floats)> ... # Any number of 4x4 matrices `TLIST's are used only within the `transforms' clause of an `INST' object. They cause the `INST's `geom' object to be instantiated once under each of the transforms in the `TLIST'. The effect is like that of a `LIST' of `INST's each with a single transform, and all referring to the same object, but is more efficient. Be aware that a `TLIST' is a kind of geometry object, distinct from a `transform' object. Some contexts expect one type of object, some the other. For example in INST transform { : MYT } geom { ... } MYT must be a transform object, which might have been created with the gcl (read transform { define myT 1 0 0 1 ... }) while in INST transforms { : MYTS } geom { ... } or INST transforms { LIST {: MYTS} {< more.prj} } geom { ... } MYTS must be a geometry object, defined e.g. with (read geometry { define MYTS { TLIST 1 0 0 1 ... } }) A `TLIST BINARY' format is accepted. Binary data begins with a 32-bit integer giving the number of transformations, followed by that number of 4x4 matrices in 32-bit floating-point format. The order of matrix elements is the same as in the ASCII format. GROUP Files ----------- This format is obsolete, but is still accepted. It combined the functions of `INST' and `TLIST', taking a series of transformations and a single Geom (`unit') object, and replicating the object under each transformation. GROUP ... < matrices > ... unit { OOGL-OBJECT } is still accepted and effectively translated into INST transforms { TLIST ... ... } Geometry Center Thu Dec 12 02:36:08 CST 1996 21 OOGL(5) OOGL(5) unit { OOGL-OBJECT } DISCGRP Files ------------- This format is for discrete groups, such as appear in the theory of manifolds or in symmetry patterns. This format has its own man page. See discgrp(5). COMMENT Objects --------------- The COMMENT object is a mechanism for encoding arbitrary data within an OOGL object. It can be used to keep track of data or pass data back and forth between external modules. Syntax: COMMENT # key word NAME TYPE # individual name and type specifier { ... } # arbitrary data The data, which must be enclosed by curly braces, can include anything except unbalanced curly braces. The TYPE field can be used to identify data of interest to a particular program through naming conventions. `COMMENT' objects are intended to be associated with other objects through inclusion in a `LIST' object. (*Note LIST::.) The "#" OOGL comment syntax does not suffice for data exchange since these comments are stripped when an OOGL object is read in to Geomview. The `COMMENT' object is preserved when loaded into Geomview and is written out intact. Here is an example associating a WorldWide Web URL with a piece of geometry: { LIST { < Tetrahedron} {COMMENT GCHomepage HREF { http://www.geomview.org }} } A binary `COMMENT' format is accepted. Its format is not consistent with the other OOGL binary formats. *Note Binary format::. The `name' and `type' are followed by N BYTE1 BYTE2 ... BYTEN instead of data enclosed in curly braces. Geometry Center Thu Dec 12 02:36:08 CST 1996 22 OOGL(5) OOGL(5) Non-geometric objects ===================== The syntax of these objects is given in the form used in *Note References::, where "quoted" items should appear literally but without quotes, square bracketed ([ ]) items are optional, and | separates alternative choices. Transform Objects ----------------- Where a single 4x4 matrix is expected -- as in the `INST' `transform' field, the camera's `camtoworld' transform and the Geomview `xform*' commands -- use a transform object. Note that a transform is distinct from a `TLIST', which is a type of geometry. `TLIST's can contain one or more 4x4 transformations; "transform" objects must have exactly one. Why have both? In many places -- e.g. camera positioning -- it's only meaningful to have a single transform. Using a separate object type enforces this. Syntax for a transform object is ::= [ "{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "transform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" ] (defines a transform named , setting its value from the stuff which follows) (interpreted as a 4x4 homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the bottom row) | "<" (meaning: read transform from that file) | ":" (meaning: use variable , defined elsewhere; if undefined the initial value is the identity transform) [ "}" ] (matching curly brace) The whole should be enclosed in { braces }. Braces are not essential if exactly one of the above items is present, so e.g. a 4x4 array of floats standing alone may but needn't have braces. Geometry Center Thu Dec 12 02:36:08 CST 1996 23 OOGL(5) OOGL(5) Some examples, in contexts where they might be used: # Example 1: A gcl command to define a transform # called "fred" (read transform { transform define fred 1 0 0 0 0 1 0 0 0 0 1 0 -3 0 1 1 } ) # Example 2: A camera object using transform # "fred" for camera positioning # Given the definition above, this puts the camera at # (-3, 0, 1), looking toward -Z. { camera halfyfield 1 aspect 1.33 camtoworld { : fred } } cameras ------- A camera object specifies the following properties of a camera: position and orientation specified by either a camera-to-world or world-to-camera transformation; this transformation does not include the projection, so it's typically just a combination of translation and rotation. Specified as a transform object, typically a 4x4 matrix. "focus" distance Intended to suggest a typical distance from the camera to the object of interest; used for default camera positioning (the camera is placed at (X,Y,Z) = (0,0,focus) when reset) and for adjusting field-of-view when switching between perspective and orthographic views. window aspect ratio True aspect ratio in the sense /. This normally should agree with the aspect ratio of the camera's window. Geomview normally adjusts the aspect ratio of its cameras to match their associated windows. near and far clipping plane distances Note that both must be strictly greater than zero. Very large / distance ratios cause Z-buffering to behave badly; part of an object may be visible even if somewhat more distant than another. field of view Specified in either of two forms. `fov ' is the field of view -- in degrees if perspective, or linear Geometry Center Thu Dec 12 02:36:08 CST 1996 24 OOGL(5) OOGL(5) distance if orthographic -- in the *shorter* direction. `halfyfield ' is half the projected Y-axis field, in world coordinates (not angle!), at unit distance from the camera. For a perspective camera, halfyfield is related to angular field: halfyfield = tan( Y_axis_angular_field / 2 ) while for an orthographic one it's simply: halfyfield = Y_axis_linear_field / 2 This odd-seeming definition is (a) easy to calculate with and (b) well-defined in both orthographic and perspective views. The syntax for a camera is: ::= [ "camera" ] (optional keyword) [ "{" ] (opening brace, generally required) [ "define" ] "<" | ":" | (or any number of the following, in any order...) "perspective" {"0" | "1"} (default 1) (otherwise orthographic) "stereo" {"0" | "1"} (default 0) (otherwise mono) "worldtocam" (see transform syntax above) "camtoworld" (no point in specifying both camtoworld and worldtocam; one is constrained to be the inverse of the other) "halfyfield" (default tan 40/2 degrees) "fov" (angular field-of-view if perspective, linear field-of-view otherwise. Measured in whichever direction is smaller, given the aspect ratio. When aspect ratio changes -- e.g. when a window is reshaped -- Geometry Center Thu Dec 12 02:36:08 CST 1996 25 OOGL(5) OOGL(5) "fov" is preserved.) "frameaspect" (X/Y) (default 1.333) "near" (default 0.1) "far" (default 10.0) "focus" (default 3.0) [ "}" ] (matching closebrace) window ------ A window object specifies size, position, and other window-system related information about a window in a device-independent way. The syntax for a window object is: window ::= [ "window" ] (optional keyword) [ "{" ] (curly brace, often required) (any of the following, in any order) "size" (size of the window) "position" (position & size) "noborder" (specifies the window should have no window border) "pixelaspect" (specifies the true visual aspect ratio of a pixel in this window in the sense xsize/ysize, normally 1.0. For stereo hardware which stretches the display vertically by a factor of 2, "pixelaspect 0.5" might do. The value is used when computing the projection of a camera associated with this window.) [ "}" ] (matching closebrace) Geometry Center Thu Dec 12 02:36:08 CST 1996 26 OOGL(5) OOGL(5) Window objects are used in the Geomview `window' and `ui-panel' commands to set default properties for future windows or to change those of an existing window. Geometry Center Thu Dec 12 02:36:08 CST 1996 27 geomview-1.9.4/doc/oogltour0000644000175000001440000004531310653573024012641 00000000000000Tutorial: The OOGL Geom File Formats (and Geomview along the way) OOGL stands for Object Oriented Graphics Library. An OOGL object is called a Geom. There is a text file format for each kind of Geom. You can load a text file into any program that uses OOGL. Geomview is an interactive 3D object viewer built on top of OOGL. (Geomview runs on Silicon Graphics, NextStep, and X-Windows platforms.) There are Geomview notes in brackets interspersed throughout this guide telling you what to do in Geomview to see what we're talking about. Later notes assume you both know how to do and have done what previous notes told you about. All of the files referred to in this document are in the directory of sample OOGL files that comes with Geomview. The OOGL File Formats section of the Geomview manual is a complete reference for the syntax of file formats. This tutorial is an attempt to lead you more gently into the world of OOGL. ---------------------------------------------------------------------- ---------------------------------------------------------------------- QUAD We start with a very simple object: a square. Specifically, the unit square in the xy plane at z=0. ---------------------------------------------------------------------- "square.quad": QUAD -1 -1 0 1 -1 0 1 1 0 -1 1 0 ---------------------------------------------------------------------- The header "QUAD" identifies the file type. (You can also use the header "POLY" for this type for historical reasons.) A QUAD file is a list of 4*n vertices where n is the number of quadrilaterals. This file only contains one quadrilateral. You can also use this format to specify triangles: just use a degenerate quadrilateral where two of the four vertices are identical. The vertices in this file are simple: just the x,y, and z coordinates of the point. [GEOMVIEW: Type "geomview square.quad" from a shell window on a Silicon Graphics Iris. Spin the square around with the left mouse after geomview loads it. Feel free to play with geomview a while if the fancy strikes you during this tutorial. ] The next file has more complex vertices that include a color with a point. ---------------------------------------------------------------------- "csquare.quad": CQUAD -1 -1 0 1 0 0 1 1 -1 0 0 1 0 1 1 1 0 0 1 0 1 -1 1 0 1 0 0 1 ---------------------------------------------------------------------- It's got the same points as the previous square, but with two red and two green corners. The header is now "CQUAD" to indicate that its vertices contain color information as well as point information. Colors are specified by (r,g,b,a) 4-tuples of floating point numbers between 0 and 1. Any color that can be displayed on a computer screen can be encoded by some combination of red, green and blue. The fourth component, alpha, represents opacity: 0 is transparent and 1 is opaque. The X, NextStep, and some SGI platforms ignore alpha information entirely, but a Renderman snapshot will use the alpha information if transparency is enabled. Some SGI platforms use the alpha information, but the picture is guaranteed to be incorrect. [geomview: Delete the current object by hitting the Delete button. To load csquare.quad, hit the Load Button and type "csquare.quad" (hit RETURN when you're done typing) into the popup box that appears. (If you're browsing and are not sure about file names, you can use the File Browser Button to look around in a directory.) You're probably wondering why it's all one color. The default shading mode is flat shading, where each polygon or polygonal face is the same color. The other two shading modes, constant and smooth, will both display multicolored faces where the colors smoothly interpolated between vertices. Constant shading ignores all lighting information, while smooth shading interpolates lighting as well as coloring between the vertices. To change shading mode, first open up the Appearance panel by clicking on the Appearance line in the More Panels browser. Now switch from mode to mode by clicking on different lines in the Shading browser. ] Time to move on to bigger and better things. "dodec.quad": QUAD 0 0 0.794654 0 0.491123 0.794654 0.356822 0.491123 0.794654 0.467086 0.151765 0.794654 0 0 0.794654 -0.467086 0.151765 0.794654 -0.356822 0.491123 0.794654 4.89153e-09 0.491123 0.794654 0 0 0.794654 -0.288675 -0.397327 0.794654 -0.57735 -0.187593 0.794654 -0.467086 0.151766 0.794654 0 0 0.794654 0.288675 -0.397327 0.794654 4.36694e-09 -0.607062 0.794654 -0.288675 -0.397327 0.794654 0 0 0.794654 0.467086 0.151766 0.794654 0.57735 -0.187592 0.794654 0.288675 -0.397327 0.794654 0 0.710761 0.35538 0 0.491123 0.794654 -0.356822 0.491123 0.794654 -0.467086 0.642889 0.491123 . . . < 55 lines of numbers deleted> Now we've got a more interesting object: a dodecahedron. Since dodecahedra have 5-sided faces, each of its 12 faces is actually made out of 5 quadrilaterals for a total of 20 quadrilaterals in this Quad object. [geomview: Delete the square and load "dodec.quad". Since the 5 quadilaterals on each face all fit together perfectly, the fact that there are indeed many of them on each face is only apparent when the edges are drawn. To turn on edge drawing, hit the Edges button on the Appearance panel. ] OFF There is a much more efficient way of representing a dodecahedron. "dodec.off": OFF 20 12 30 1.214124 0.000000 1.589309 0.375185 1.154701 1.589309 -0.982247 0.713644 1.589309 -0.982247 -0.713644 1.589309 0.375185 -1.154701 1.589309 1.964494 0.000000 0.375185 0.607062 1.868345 0.375185 -1.589309 1.154701 0.375185 -1.589309 -1.154701 0.375185 0.607062 -1.868345 0.375185 1.589309 1.154701 -0.375185 -0.607062 1.868345 -0.375185 -1.964494 0.000000 -0.375185 -0.607062 -1.868345 -0.375185 1.589309 -1.154701 -0.375185 0.982247 0.713644 -1.589309 -0.375185 1.154701 -1.589309 -1.214124 0.000000 -1.589309 -0.375185 -1.154701 -1.589309 0.982247 -0.713644 -1.589309 5 0 1 2 3 4 5 0 5 10 6 1 5 1 6 11 7 2 5 2 7 12 8 3 5 3 8 13 9 4 5 4 9 14 5 0 5 15 10 5 14 19 5 16 11 6 10 15 5 17 12 7 11 16 5 18 13 8 12 17 5 19 14 9 13 18 5 19 18 17 16 15 The "OFF" header tells us it's a polylist file. The second line in the file tells us that there are 20 vertices, 12 faces, and 30 edges. (The OOGL libraries presently don't use the edges value, so you can just use 0 if you don't happen know the number of edges.) The next 20 lines give a list of vertices. The last 12 lines specify the faces: the first number is the number of vertices in that face. Since our polyhedron happens to be regular, all faces have the same number of vertices (in this case, 5). The rest of the numbers on the line are indices into the above list of vertices. Besides being far more compact, the Polylist file format embeds connectivity information in the Geom. OOGL has no way of knowing whether any two quadrilaterals in a Quad object are connected. But with a Polylist, OOGL can interpolate normals across connected faces. The normals of an object are used to calculate shading information. Interpolated normals make an object look smooth instead of faceted. This is often desirable if you are trying to approximate a curved surface by breaking it up into small pieces. [geomview: Go ahead and load "dodec.off" without deleting the other one. Now you've got two Geoms in your world. Most actions apply to the currently picked object. When you start up geomview, the currently picked object is the whole world. You can independently control any object in the world by picking it as the target of your actions. Double-clicking the right mouse button when the mouse is over an object picks it: double-clicking the right mouse over empty space picks the whole world. You can also pick objects by clicking on the appropriate line in the Object browser. The two dodecahedra are probably superimposed. Pick one of them as your target, click on the "Translate" line in the motion browser, and move the picked object away from the center of the world with the left mouse. (To return to "Rotate" mode, click the appropriate line in the motion browser.) Now pick the whole world again and draw the normals by hitting the "Normals" button on the Appearance panel. Switch between Flat and Smooth Shading modes (by clicking in the Shading browser) and notice that the Polylist changes but the Quad doesn't. Sometimes using the mouse to click on browser lines and buttons is cumbersome. The bracketed characters shown on the control panels are keyboard shortcuts that duplicate the effect of using the mouse to click on that line or button. For instance, "an" (the "a" stands for "appearance") toggles drawing normals and "t" switches the motion to translation. In a further shortcut, you can use the prefix of an object ("g" or "c" followed by a number, as shown in brackets in the Object browser) before most commands to simultaneously pick an object and do some action to it. For instance, "g0r" lets you immediately rotate the world. ] Let's compare two ways of coloring a Polylist. facecube.off: # off file with per face color OFF 8 6 12 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 -1.0 -1.0 -1.0 1.0 -1.0 -1.0 -1.0 4 0 2 3 1 .05 .8 .1 .75 4 4 5 7 6 .2 .05 .8 .75 4 0 4 6 2 .9 .9 .02 .75 4 1 3 7 5 .0 .7 .4 .75 4 0 1 5 4 .1 .4 .7 .75 4 2 6 7 3 .7 .7 0 .75 vertcube.off: # off file with per vertex colors COFF 8 6 12 1.0 1.0 1.0 .05 .8 .1 .75 1.0 1.0 -1.0 .2 .05 .8 .75 1.0 -1.0 1.0 .9 .9 .02 .75 1.0 -1.0 -1.0 .0 .7 .4 .75 -1.0 1.0 1.0 .1 .4 .7 .75 -1.0 1.0 -1.0 .7 .7 0 .75 -1.0 -1.0 1.0 0. 0. 0. .75 -1.0 -1.0 -1.0 1. 1. 1. .75 4 0 2 3 1 4 4 5 7 6 4 0 4 6 2 4 1 3 7 5 4 0 1 5 4 4 2 6 7 3 Everything following a "#" is a comment for humans to read and is ignored by OOGL. The header for a plain Polylist file is optional, but if you have anything besides points in a vertex you do need a proper header. The object is the unit cube, which has 8 vertices, 6 faces, and 12 edges. The first has per-face coloring and the second has per-vertex coloring. A subtle point: the header for vertcube.off is "COFF" as you would expect but the header for facecube.off is just "OFF" because the header refers only to the structure of the vertices, not the entire file. [geomview: Delete everything by picking the world and hitting the Delete Object button. Now load "facecube.off" and "vertcube.off". Translate one of them away from the center so that you can see what you're doing. Switch both Polylists between Constant, Flat, and Smooth Shading modes. Shading is done according to light sources that you have control over. To play with the lights, open the Light panel by clicking on the Light line in the Inspect pull-down menu. When you hit the Show Lights button, you will see light beams that you can drag around to move the lights. You can also add, delete, change the intensity of, and change the color of lights. ] MESH The vertices of a Mesh file are connected in a rectangular grid. tent.mesh: CMESH 3 3 0 0 0 1 0 0 1 1 0 1 0 1 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 2 1 0 0 0 1 1 0 2 0 1 0 0 1 1 2 1 0 1 0 1 2 2 0 0 0 1 1 The "CMESH" header tells us that this is a Mesh file and each vertex contains both point and color information. The second line means that both the u and v dimensions of the mesh are 3, so there will be 3*3 = 9 vertices. Each vertex that's not on an outer edge is connected to its 4 surrounding neighbots by an edge. In "tent.mesh", only the point (1,1,1) is an inside point. The 9 vertices, when named (u,v), are specified in v-major order, just like an array in C: (0,0)---(1,0)---(2,0) | | | (0,1)---(1,1)---(2,1) | | | (0,2}---(1,2)---(2,2) [geomview: Delete everything and load "tent.mesh". Go into Smooth Shading mode to see each vertex with its own color so that it's obvious how the points in the file correspond with the image in the viewer. ] If you want the mesh to be closed along either (or both) of the u or v edges, insert either a "u" or "v" in the header just before the "MESH". "wraptent.mesh" CuMESH 3 3 0 0 0 1 0 0 1 1 0 1 0 1 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 2 1 0 0 0 1 1 0 2 0 1 0 0 1 1 2 1 0 1 0 1 2 2 0 0 0 1 1 [geomview: Load "wraptent.mesh" and compare the two Meshes, translating them apart from each other as necessary. ] There's an extremely efficient way to describe a mesh when the x and y coordinates match the u and v coordinates of every point. "ztent.mesh": ZMESH 3 3 0 1 0 0 1 0 0 1 0 "ztent.mesh" is exactly the same shape as "tent.mesh", although its vertices don't have any colors. The header "ZMESH" means that only the z-coordinate of each point is specified and the x and y coordinates of each point are set equal to its (u,v) position in the grid. [geomview: Load "ztent.mesh" to verify that it's really the same shape as "tent.mesh" ] VECT A Vect is a collection of polylines, which are lines with 1 or more vertices. Here's a file specifying an "X" and the x-axis in red, a "Y" and the y-axis in green, and a "Z" and the z-axis in blue. "xyz.vect": VECT 8 19 3 2 2 2 2 2 3 2 4 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 0 0 0 0 1 0 -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 0 0 0 0 0 1 -.05 .25 1 .05 .25 1 -.05 .05 1 .05 .05 1 1 0 0 1 0 1 0 1 0 .6 1 1 The header is always "VECT": no letters can be tacked on the front. The second line means that there are 8 polylines, which have a total of 19 vertices and 3 colors. There is no indexing into a list of vertices like a polylist: every single vertex must be specified separately. The third line lists the number of vertices in each polyline. In "xyz.vect", the only polylines with more than 2 vertices are the upper part of the "Y", which has 3, and the "Z", which has 4. The fourth line lists the number of colors in each polyline. When a polyline has no colors it inherits the previously set color. Next come the 19 vertices: only points are allowed. Finally, the 3 colors are given on the last three lines. [geomview: Delete everything, load and look at "xyz.vect". Do the same thing for all the remaining examples. ] BEZ For those who already understand how to create parametric surface patches, the syntax of Bezier surface patches is described in the OOGL man page. The art of constructing parametric surfaces is not easily explained: thus, it is beyond the scope of this tutorial to discuss them. Lists and Insts are complex Geoms that can be used to create a hierarchical tree of objects. LIST A List is just a collection of other Geoms. "ref.list": LIST < xyz.vect < dodec.quad { = QUAD -1 -1 0 1 -1 0 1 1 0 -1 1 0} The header is always exactly "LIST". The first two subgeoms refer to other files, using the syntax " < filename ". We have omitted the optional surrounding braces. The third is a literal, or in-line, object. Although this particular syntax would still work if we left off the surrounding braces and equal sign, very similar syntax would not so we follow the "when in doubt, use braces" rule. [geomview: Geomview looks for filenames in the current directory, the pathname in the GEOMDATA environment variable, and the same directory as the file that it's currently reading. ] INST An Inst is one or more 4x4 transforms applied to another Geom. These matrices can represent all of the 3D transformations such as rotation, translation, scaling, shearing and perspective. We use 4x4 matrices instead of 3x3 matrices so that we can use homogenous coordinates and concatenate all transformations without treating translations as special cases that require adding instead of multiplying. 4x4 matrices can also be used for such operations such as 4D rotation or projective hyperbolic transformations. A linear algebra or computer graphics textbook is a good place to start if you are unfamiliar with these ideas. "ref.inst": INST geom { < ref.list } transforms { = TLIST 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 2 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 2 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } The header is always exactly "INST". The value following the "geom" keyword is a filename reference to "ref.list", which is the List we saw above. It could also be an in-line Geom or a handle. We surround the value with braces to avoid ambiguity. The value of the "transforms" keyword is an in-line TList. It could also be a filename reference or a handle. (See the OOGL File Formats section of the Geomview manual for specifics.) A TList is actually a full-fledged Geom, but we don't ever load a file like "foo.tlist" into the viewer because TLists are just a collection of transforms with no associated subgeom, so there's nothing to see. A transform is exactly 16 numbers. The first three are a translations: 2 units in the x, y and z directions, respectively. The last is just the identity. The length of the TList is the number of instantiations of the unit: in this case, 4. If we could not use instantiation, we would have had to compute 4 entirely new Geoms, since the actual points in space of an object are different if you move it. Since the unit of an Inst can be another Inst, you can build up a complex hierarchy. For instance, to build a solar system you only need to generate one sphere. All the planets can be scaled and translated instantiations of that single Geom. "warp.inst": INST transform { 1 0 0 0 0 9 0 0 0 0 3 0 0 0 0 1 } geom { < dodec.off } This Inst has a single transform instead of a list of them. Thus we use the keyword "transform" instead of "transforms". A transform is not a Geom, so there is no header before the 16 numbers. We could also have a handle here. (Handles are documented in the OOGL File Formats section of the Geomview manual.) Finally, we have "dodec.off" as our unit. The order of the geom and the transform/transforms is irrelevant. Postscripts: OOGL: This tutorial doesn't document binary files or object appearances. See the OOGL File Formats section of the Geomview manual for details. White space in OOGL files is mostly for the benefit of human readers. "ZMESH 3 3 0 1 0 0 1 0 0 1 0" is a legal OOGL file. The only exception is that there cannot be a line break between the last vertex index for an OFF face and the next 4 color floats. Geomview: When a Geom is loaded, it is automatically normalized to fit inside a unit cube centered around the origin. The default camera viewpoint is at {0,0,-3} looking toward the origin. To see the unaltered size and position of an object, pick the None line in the Normalization browser in the Inspect pull-down menu. In general it doesn't matter what the coordinate range of an object is as long as the entire file is consistent: {0,1}, {-1,1}, {0,100}, {-1000,-500}, {17,36} are all valid ranges. geomview-1.9.4/doc/geomview.5gv0000644000175000001440000014440010600605137013277 00000000000000 Geomview(5gv) Geomview(5gv) NAME Geomview - Geomview command language NOTE The material in this manual page also appears in the Geomview manual. DESCRIPTION gcl: the Geomview Command Language ********************************** Gcl has the syntax of lisp -- i.e. an expression of the form (f a b ...) means pass the values of a, b, ... to the function f. Gcl is very limited and is by no means an implementation of lisp. It is simply a language for expressing commands to be executed in the order given, rather than a programming language. It does not support variable or function definition. Gcl is the language that Geomview understands for files that it loads as well as for communication with other programs. To execute a gcl command interactively, you can bring up the *Commands* panel which lets you type in a command; Geomview executes the command when you hit the return key. Output from such commands is printed to standard output. Alternately, you can invoke Geomview as `geomview -c -' which causes it to read gcl commands from standard input. Gcl functions return a value, and you can nest function calls in ways which use this returned value. For example (f (g a b)) evaluates `(g a b)' and then evaluates `(f x)' where `x' is the result returned by `(g a b)'. Geomview maintains these return values internally but does not normally print them out. To print out a return value pass it to the `echo' function. For example the `geomview-version' function returns a string representing the version of Geomview that is running, and (echo (geomview-version)) prints out this string. Many functions simply return `t' for success or `nil' for failure; this is the case if the documentation for the function does not indicate otherwise. These are the lisp symbols for true and false, respectively. (They correspond to the C variables `Lt' and `Lnil' which you are likely to see if you look at the source code for Geomview or some of the external modules.) In the descriptions of the commands below several references are made to "OOGL" formats. OOGL is the data description language that Geomview uses for describing geometry, cameras, appearances, and other basic objects. For details of the OOGL formats, *Note OOGL File Formats::. (Or equivalently, see the oogl(5) manual page, distributed with Geomview in the file man/cat5/oogl.5. The gcl commands and argument types are listed below. Most Geometry Center Thu Dec 12 02:41:23 CST 1996 1 Geomview(5) Geomview(5) of the documentation in this section of the manual is available within Geomview via the `?' and `??' commands. The command `(? COMMAND)' causes Geomview to print out a one-line summary of the syntax of COMMAND, and `(?? COMMAND)' prints out an explanation of what COMMAND does. You can include the wild-card character `*' in COMMAND to print information for a group of commands matching a pattern. For example, `(?? *emodule*)' will print all information about all commands containing the string `emodule'. `(? *)' will print a short list of all commands. Conventions Used In Describing Argument Types ============================================= The following symbols are used to describe argument types in the documentation for gcl functions. `APPEARANCE' is an OOGL appearance specification. `CAM-ID' is an ID that refers to a camera. `CAMERA' is an OOGL camera specification. `GEOM-ID' is an ID that refers to a geometry. `GEOMETRY' is an OOGL geometry specification. `ID' is a string which names a geometry or camera. Besides those you create, valid ones are: ``World, world, worldgeom, g0'' the collection of all geom's `target' selected target object (cam or geom) `center' selected center-of-motion object `targetcam' last selected target camera `targetgeom' last selected target geom `focus' camera where cursor is (or most recently was) Geometry Center Thu Dec 12 02:41:23 CST 1996 2 Geomview(5) Geomview(5) `allgeoms' all geom objects `allcams' all cameras ``default, defaultcam, prototype'' future cameras inherit default's settings The following IDs are used to name coordinate systems, e.g. in `pick' and `write' commands: ``World, world, worldgeom, g0'' the world, within which all other geoms live. `universe ' the universe, in which the World, lights and cameras live. Cameras' world2cam transforms might better be called universe2cam, etc. `self' "this Geomview object". Transform from an object to `self' is the identity; writing its geometry gives the object itself with no enclosing transform; picked points appear in the object's coordinates. `primitive' (for `pick' only) Picked points appear in the coordinate system of the lowest-level OOGL primitive. A name is also an acceptable id. Given names are made unique by appending numbers if necessary (i.e. `foo<2>'). Every geom is also named g[n] and every camera is also named c[n] (`g0' is always the worldgeom): this name is used as a prefix to keyboard commands and can also be used as a gcl id. Numbers are reused after an object is deleted. Both names are shown in the Object browser. `STATEMENT' represents a function call. Function calls have the form `(func arg1 arg2 ... )', where `func' is the name of the function and `arg1', `arg2', ... are the arguments. `TRANSFORM' is an OOGL 4x4 transformation matrix. `WINDOW' is an OOGL winddow specification. Gcl Reference Guide =================== Geometry Center Thu Dec 12 02:41:23 CST 1996 3 Geomview(5) Geomview(5) `! is a synonym for `shell'' `(< EXPR1 EXPR2)' Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. `(= EXPR1 EXPR2)' Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. `(> EXPR1 EXPR2)' Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should be either both integers or floats, or both strings. `(? [command])' Gives one-line usage summary for `command'. Command may include `*'s as wildcards; see also `??' One-line command help; lists names only if multiple commands match. ? is a synonym for `help' `(?? command) `command' may include `*' wildcards' Prints more info than `(? command)'. ?? is a synonym for `morehelp'. `| is a synonym for `emodule-run'.' `(all geometry) returns a list of names of all geometry objects.' Use e.g. `(echo (all geometry))' to print such a list. `(all camera) returns a list of names of all cameras.' `(all emodule defined) returns a list of all defined external modules.' `(all emodule running) returns a list of all running external modules.' `(ap-override [on|off])' Selects whether appearance controls should override objects' own settings. On by default. With no arguments, returns current setting. `(backcolor CAM-ID R G B)' Set the background color of CAM-ID; R G B are numbers between 0 and 1. `(background-image CAM-ID [FILENAME])' Use the given image as the background of camera CAM-ID (which must be a real camera, not `default' or `allcams'). Centers the image on the window area. Works only with GL and OpenGL graphics. Use "" for filename to remove background. With no filename argument, returns name of that window's current background image, or "". Any file type acceptable as a texture is allowed, e.g. .ppm.gz, .sgi, etc. `(bbox-color GEOM-ID R G B)' Set the bounding-box color of GEOM-ID; R G B are numbers between 0 and 1. `(bbox-draw GEOM-ID [yes|no])' Say whether GEOM-ID's bounding-box should be drawn; `yes' if omitted. Geometry Center Thu Dec 12 02:41:23 CST 1996 4 Geomview(5) Geomview(5) `(camera CAM-ID [CAMERA])' Specify data for CAM-ID; CAMERA is a string giving an OOGL camera specification. If no camera CAM-ID exists, it is created; in this case, the second argument is optional, and if omitted, a default camera is used. See also: new-camera. `(camera-draw CAM-ID [yes|no])' Say whether or not cameras should be drawn in CAM-ID; `yes' if omitted. `(camera-prop { geometry object } [projective])' Specify the object to be shown when drawing other cameras. By default, this object is drawn with its origin at the camera, and with the camera looking toward the object's -Z axis. With the `projective' keyword, the camera's viewing projection is also applied to the object; this places the object's Z=-1 and Z=+1 at near and far clipping planes, with the viewing area -1<={X,Y}<=+1. Example: (camera-prop { < cube } projective) `(camera-reset CAM-ID)' Reset CAM-ID to its default value. `(car LIST)' returns the first element of LIST. `(cdr LIST)' returns the list obtained by removing the first element of LIST. `(clock)' Returns the current time, in seconds, as shown by this stream's clock. See also set-clock and sleep-until. `(command INFILE [OUTFILE])' Read commands from INFILE; send corresponding responses (e.g. anything written to filename `-') to OUTFILE, stdout by default. `(copy [ID] [name])' Copies an object or camera. If ID is not specified, it is assumed to be targetgeom. If name is not specified, it is assumed to be the same as the name of ID. `(cursor-still [INT])' Sets the number of microseconds for which the cursor must not move to register as holding still. If INT is not specified, the value will be reset to the default. `(cursor-twitch [INT])' Sets the distance which the cursor must not move (in x or y) to register as holding still. If INT is not specified, the value will be reset to the default. `(delete ID)' Delete object or camera ID. Geometry Center Thu Dec 12 02:41:23 CST 1996 5 Geomview(5) Geomview(5) `(dice GEOM-ID N)' Dice any Bezier patches within GEOM-ID into NxN meshes; default 10. See also the appearance attribute `dice', which makes this command obsolete. `(dimension [N])' Sets or reads the space dimension for N-dimensional viewing. (Since calculations are done using homogeneous coordinates, this means matrices are (N+1)x(N+1).) With no arguments, returns the current dimension, or 0 if N-dimensional viewing has not been enabled. `(dither CAM-ID {on|off|toggle})' Turn dithering on or off in that camera. `(draw CAM-ID)' Draw the view in CAM-ID, if it needs redrawing. See also `redraw'. `(echo ...)' Write the given data to the special file `-'. Strings are written literally; lisp expressions are evaluated and their values written. If received from an external program, `echo' sends to the program's input. Otherwise writes to geomview's own standard output (typically the terminal). `(emodule-clear)' Clears the geomview application (external module) browser. `(emodule-define NAME SHELL-COMMAND ...)' Define an external module called NAME, which then appears in the external-module browser. The SHELL-COMMAND string is a UNIX shell command which invokes the module. See emodule-run for discussion of external modules. `(emodule-defined `modulename')' If the given external-module name is known, returns the name of the program invoked when it's run as a quoted string; otherwise returns nil. `(echo (emodule-defined `name'))' prints the string. `(emodule-isrunning NAME)' Returns Lt if the emodule NAME is running, or Lnil if it is not running. NAME is searched for in the names as they appear in the browser and in the shell commands used to execute the external modules (not including arguments). `(emodule-path)' Returns the current search path for external modules. Note: to actually see the value returned by this function you should wrap it in a call to echo: (echo (emodule-path)). See also set-emodule-path. `(emodule-run SHELL-COMMAND ARGS...)' Runs the given SHELL-COMMAND (a string containing a UNIX shell command) as an external module. The module's standard output Geometry Center Thu Dec 12 02:41:23 CST 1996 6 Geomview(5) Geomview(5) is taken as geomview commands; responses (written to filename `-') are sent to the module's standard input. The shell command is interpreted by /bin/sh, so e.g. I/O redirection may be used; a program which prompts the user for input from the terminal could be run with: (emodule-run yourprogram <&2) If not already set, the environment variable $MACHTYPE is set to the name of the machine type. Input and output connections to geomview are dropped when the shell command terminates. Clicking on a running program's module-browser entry sends the signal SIGHUP to the program. For this to work, programs should avoid running in the background; those using FORMS or GL should call foreground() before the first FORMS or winopen() call. See also emodule-define, emodule-start. `(emodule-sort)' Sorts the modules in the application browser alphabetically. `(emodule-start NAME)' Starts the external module NAME, defined by emodule-define. Equivalent to clicking on the corresponding module-browser entry. `(emodule-transmit NAME LIST)' Places LIST into external module NAME's standard input. NAME is searched for in the names of the modules as they appear in the External Modules browser and then in the shell commands used to execute the external modules. Does nothing if modname is not running. `(escale GEOM-ID FACTOR)' Same as scale but multiplies by exp(scale). Obsolete. `(event-keys {on|off})' Turn keyboard events on or off to enable/disable keyboard shortcuts. `(event-mode MODESTRING)' Set the mouse event (motion) mode; MODESTRING should be one of the following strings: 1. "[r] Rotate" 2. "[t] Translate" 3. "[z] Cam Zoom" 4. "[s] Geom Scale" 5. "[f] Cam Fly" 6. "[o] Cam Orbit" 7. "[le] Edit Lights" `(event-pick {on|off})' Turn picking on or off. `(evert GEOM-ID [yes|no])' Set the normal eversion state of GEOM-ID. If the second argument is omitted, toggle the eversion state. `(exit)' Terminates geomview. `(ezoom GEOM-ID FACTOR)' Same as zoom but multiplies by exp(zoom). Obsolete. `(freeze CAM-ID)' Geometry Center Thu Dec 12 02:41:23 CST 1996 7 Geomview(5) Geomview(5) Freeze CAM-ID; drawing in this camera's window is turned off until it is explicitly redrawn with `(redraw CAM-ID)', after which time drawing resumes as normal. `(geometry GEOM-ID [GEOMETRY])' Specify the geometry for GEOM-ID. GEOMETRY is a string giving an OOGL geometry specification. If no object called GEOM-ID exists, it is created; in this case the GEOMETRY argument is optional, and if omitted, the new object GEOM-ID is given an empty geometry. `(geomview-version)' Returns a string representing the version of geomview that is running. `(hdefine `geometry'|`camera'|`transform'|`window' name value)' Sets the value of a handle of a given type. (hdefine ) is generally equivalent to (read { define }) except that the assignment is done when hdefine is executed, (possibly not at all if inside a conditional statement), while the `read ... define' performs assignment as soon as the text is read. `(help [command])' Command may include `*'s as wildcards; see also `??' One-line command help; lists names only if multiple commands match. `(hmodel CAMID {virtual|projective|conformal})' Set the model used to display geometry in this camera; see also `space'. `(hsphere-draw CAMID [yes|no])' Say whether to draw a unit sphere: the sphere at infinity in hyperbolic space, and a reference sphere in Euclidean and spherical spaces. If the second argument is omitted, `yes' is assumed. `(if TEST EXPR1 [EXPR2])' Evaluates TEST; if TEST returns a non-nil value, returns the value of EXPR1. If TEST returns nil, returns the value of EXPR2 if EXPR2 is present, otherwise returns nil. `(inhibit-warning STRING)' Inhibit warning inhbits geomview from displaying a particular warning message determined by STRING. At present there are no warning messages that this applies to, so this command is rather useless. `(input-translator "#prefix_string" "Bourne-shell-command")' Defines an external translation program for special input types. When asked to read a file which begins with the specified string, geomview invokes that program with standard input coming from the given file. Geometry Center Thu Dec 12 02:41:23 CST 1996 8 Geomview(5) Geomview(5) The program is expected to emit OOGL geometric data to its standard output. In this implementation, only prefixes beginning with # are recognized. Useful as in (input-translator "#VRML" "vrml2oogl") `(interest (COMMAND [args]))' Allows you to express interest in a command. When geomview executes that command in the future it will echo it to the communication pool from which the interest command came. COMMAND can be any command. Args specify restrictions on the values of the arguments; if args are present in the interest command, geomview will only echo calls to the command in which the arguments match those given in the interest command. Two special argument values may appear in the argument list. `*' matches any value. `nil' matches any value but supresses the reporting of that value; its value is reported as `nil'. The purpose of the interest command is to allow external modules to find out about things happening inside geomview. For example, a module interested in knowing when a geom called `foo' is deleted could say `(interest (delete foo))' and would receive the string `(delete foo)' when foo is deleted. Picking is a special case of this. For most modules interested in pick events the command `(interest (pick world))' is sufficient. This causes geomview to send a string of the form `(pick world ...)' every time a pick event (right mouse double click). See the `pick' command for details. `(lines-closer CAM-ID DIST)' Draw lines (including edges) closer to the camera than polygons by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default. If DIST is too small, a line lying on a surface may be dotted or invisible, depending on the viewpoint. If DIST is too large, lines may appear in front of surfaces that they actually lie behind. Good values for DIST vary with the scene, viewpoint, and distance between near and far clipping planes. This feature is a kludge, but can be helpful. `(load filename [command|geometry|camera])' Loads the given file into geomview. The optional second argument specifies the type of data it contains, which may be `command' (geomview commands), `geometry' (OOGL geometric data), or `camera' (OOGL camera definition). If omitted, attempts to guess about the file's contents. Loading geometric data creates a new visible object; loading a camera opens a new window; loading a command file executes those commands. `(load-path)' Returns the current search path for command, geometry, etc. files. Note: to actually see the value returned by this function you should wrap it in a call to echo: (echo (load-path)). Geometry Center Thu Dec 12 02:41:23 CST 1996 9 Geomview(5) Geomview(5) See also set-load-path. `(look [objectID] [cameraID])' Rotates the named camera to point toward the center of the bounding box of the named object (or the origin in hyperbolic or spherical space). In Euclidean space, moves the camera forward or backward until the object appears as large as possible while still being entirely visible. Equivalent to progn ( (look-toward [objectID] [cameraID] {center | origin}) [(look-encompass [objectID] [cameraID])] ) If objectID is not specified, it is assumed to be World. If cameraID is not specified, it is assumed to be targetcam. `(look-encompass [objectID] [cameraID])' Moves cameraID backwards or forwards until its field of view surrounds objectID. This routine works only in Euclidean space. If objectID is not specified, it is assumed to be the world. If cameraID is not specified, it is assumed to be the targetcam. See also (look-encompass-size). `(look-encompass-size [view-fraction clip-ratio near-margin far-margin])' Sets/returns parameters used by (look-encompass). view-fraction is the portion of the camera window filled by the object, clip-ratio is the max allowed ratio of near-to-far clipping planes. The near clipping plane is 1/near-margin times closer than the near edge of the object, and the far clipping plane is far-margin times further away. Returns the list of current values. Defaults: .75 100 0.1 4.0 `(look-recenter [objectID] [cameraID])' Translates and rotates the camera so that it is looking in the -z direction (in objectID's coordinate system) at the center of objectID's bounding box (or the origin of the coordinate system in non-Eudlidean space). In Euclidean space, the camera is also moved as close as possible to the object while allowing the entire object to be visible. Also makes sure that the y-axes of objectID and cameraID are parallel. `(look-toward [objectID] [cameraID] [origin | center])' Rotates the named camera to point toward the origin of the object's coordinate system, or the center of the object's bounding box (in non-Euclidean space, the origin will be used automatically). Default objectID is the world, default camera is targetcam, default location to point towards is the center of the bounding box. `(merge {window|camera} CAM-ID { WINDOW or CAMERA ... } )' Modify the given window or camera, changing just those properties specified in the last argument. E.g. (merge camera `Camera' { far 20 }) sets Camera's far clipping plane to 20 while leaving Geometry Center Thu Dec 12 02:41:23 CST 1996 10 Geomview(5) Geomview(5) other attributes untouched. `(merge-ap GEOM-ID APPEARANCE)' Merge in some appearance characteristics to GEOM-ID. Appearance parameters include surface and line color, shading style, line width, and lighting. `merge-base-ap is a synonym for merge-baseap.' `(merge-baseap APPEARANCE)' Merge in some appearance characteristics to the base default appearance (applied to every geom before its own apperance). Lighting is typically included in the base appearance. `(morehelp command)' `command' may include `*' wildcards. Prints more info than `(help command)'. `(name-object ID NAME)' Assign a new NAME (a string) to ID. A number is appended if that name is in use (for example, `foo' -> `foo<2>'). The new name, possibly with number appended, may be used as object's id thereafter. `(ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex]])' In our model for N-D viewing (enabled by (dimension)), objects in N-space are viewed by N-dimensional *camera clusters*. Each real camera window belongs to some cluster, and shows & manipulates a 3-D axis-aligned projected subspace of the N-space seen by its cluster. Moving one camera in a cluster affects its siblings. The ND-axes command configures all this. It specifies a camera's cluster membership, and the set of N-space axes which become the 3-D camera's X, Y, and Z axes. Axes are specified by their indices, from 0 to N-1 for an N-dimensional space. Cluster CLUSTERNAME is implicitly created if not previously known. To read a camera's configuration, use `(echo (ND-axes CAMID))'. `(ND-color CAMID' [ (( [ID] (x0 x1 x2 ... xn) v r g b a v r g b a ... ) ((x0 ... xn) v r g b a v r g b a ...) ...)] ) Specifies a function, applied to each N-D vertex, which determines the colors of N-dimensional objects as shown in camera CAMID. Each coloring function is defined by a vector (in ID's coordinate system) [x0 x1 ... xn] and by a sequence of value (v)/color(r g b a) tuples, ordered by increasing v. The inner product v = P.[x] is linearly interpolated in this table to give a color. If ID is omitted, the (xi) vector is assumed in universe coordinates. The ND-color command specifies a list of such functions; each vertex is colored by their sum (so e.g. green intensity could indicate projection along one axis while red indicated another. An empty list, as in (ND-color CAMID ()), suppresses coloring. With no second argument, (ND-color CAMID) returns that camera's Geometry Center Thu Dec 12 02:41:23 CST 1996 11 Geomview(5) Geomview(5) color-function list. Even when coloring is enabled, objects tagged with the `keepcolor' appearance attribute are shown in their natural colors. `(ND-xform OBJID [ntransform { idim odim ... }])' Sets or returns the N-D transform of the given object. In dimension N, this is an (N+1)x(N+1) matrix. Note that all cameras in a camera-cluster have the same N-D transform. `(ND-xform-get ID [from-ID])' Returns the N-D transform of the given object in the coordinate system of from-ID (default `universe'), in the sense * Transform = `(new-alien name [GEOMETRY])' Create a new alien (geom not in the world) with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new alien is given an empty geometry. If an object with that name already exists, the new alien is given a unique name. The light beams that are used to move around the lights are an example of aliens. They're drawn but are not controllable the way ordinary objects are: they don't appear in the object browser and the user can't move them with the normal motion modes. `(new-camera name [CAMERA])' Create a new camera with the given name (a string). If a camera with that name already exists, the new object is given a unique name. If CAMERA is omitted a default camera is used. `(new-center [id])' Stop id, then set id's transform to the identity. Default id is target. Also, if the id is a camera, calls (look-recenter World id). The main function of the call to (look-recenter) is to place the camera so that it is pointing parallel to the z axis toward the center of the world. `(new-geometry name [GEOMETRY])' Create a new geom with the given name (a string). GEOMETRY is a string giving an OOGL geometry specification. If GEOMETRY is omitted, the new object is given an empty geometry. If an object with that name already exists, the new object is given a unique name. `(new-reset)' Equivalent to (progn (new-center ALLGEOMS)(new-center ALLCAMS)) `(NeXT)' Returns t if running on a NeXT, nil if not Geometry Center Thu Dec 12 02:41:23 CST 1996 12 Geomview(5) Geomview(5) `(normalization GEOM-ID {each|none|all|keep})' Set the normalization status of GEOM-ID. `none' suppresses all normalization. `each' normalizes the object's bounding box to fit into the unit sphere, with the center of its bounding box translated to the origin. The box is scaled such that its long diagonal, sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2. `all' resembles `each', except when an object is changing (e.g. when its geometry is being changed by an external program). Then, `each' tightly fits the bounding box around the object whenever it changes and normalizes accordingly, while `all' normalizes the union of all variants of the object and normalizes accordingly. `keep' leaves the current normalization transform unchanged when the object changes. It may be useful to apply `each' or `all' normalization apply to the first version of a changing object to bring it in view, then switch to `keep'. `(pick COORDSYS GEOMID G V E F P VI EI FI)' The pick command is executed internally in response to pick events (right mouse double click). COORDSYS = coordinate system in which coordinates of the following arguments are specified. This can be: world: world coord sys self: coord sys of the picked geom (GEOMID) primitive: coord sys of the actual primitive within the picked geom where the pick occurred. GEOMID = id of picked geom G = picked point (actual intersection of pick ray with object) V = picked vertex, if any E = picked edge, if any F = picked face P = path to picked primitive [0 or more] VI = index of picked vertex in primitive EI = list of indices of endpoints of picked edge, if any FI = index of picked face External modules can find out about pick events by registering interest in calls to `pick' via the `interest' command. `(pick-invisible [yes|no])' Selects whether picks should be sensitive to objects whose appearance makes them invisible; default yes. With no arguments, returns current status. `(pickable GEOM-ID {yes|no})' Say whether or not GEOM-ID is included in the pool of objects that could be returned from the pick command. Geometry Center Thu Dec 12 02:41:23 CST 1996 13 Geomview(5) Geomview(5) `(position objectID otherID)' Set the transform of objectID to that of otherID. `(position-at objectID otherID [center | origin])' Translate objectID to the center of the bounding box or the origin of the coordinate system of otherID (parallel translation). Default is center. `(position-toward objectID otherID [center | origin])' Rotate objectID so that the center of the bounding box or the origin of the coordinate system of the otherID lies on the positive z-axis of the first object. Default is the center of the bounding box. `(progn STATEMENT [ ... ])' evaluates each STATEMENT in order and returns the value of the last one. Use progn to group a collection of commands together, forcing them to be treated as a single command. `quit is a synonym for `exit'' `(quote EXPR)' returns the symbolic lisp expression EXPR without evaluating it. `(rawevent dev val x y t)' Enter the specified raw event into the event queue. The arguments directly specify the members of the event structure used internally by geomview. This is the lowest level event handler and is not intended for general use. `(rawpick CAMID X Y)' Process a pick event in camera CAMID at location (X,Y) given in integer pixel coordinates. This is a low-level procedure not intended for external use. `(read {geometry|camera|transform|command} {GEOMETRY or CAMERA or ...})' Read and interpret the text in ... as containing the given type of data. Useful for defining objects using OOGL reference syntax, e.g. (geometry thing { INST transform : T geom : fred }) (read geometry { define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 }) (read transform { define T . If no filename specified, see `rib-display' for explanation of the filename used. `(scale GEOM-ID FACTOR [FACTORY FACTORZ])' Scale GEOM-ID, multiplying its size by FACTOR. The factors should be positive numbers. If FACTORY and FACTORZ are present and non-zero, the object is scaled by FACTOR in x, by FACTORY in y, and by FACTORZ in z. If only FACTOR is present, the object is scaled by FACTOR in x, y, and z. Scaling only really makes sense in Euclidean space. Mouse-driven scaling in other spaces is not allowed; the scale command may be issued in other spaces but should be used with caution because it may cause the data to extend beyond the limits of the space. `(scene CAM-ID [GEOMETRY])' Make CAM-ID look at GEOMETRY instead of at the universe. `(set-clock TIME)' Adjusts the clock for this command stream to read TIME (in seconds) as of the moment the command is received. See also sleep-until, clock. `(set-conformal-refine CMX [N [SHOWEDGES]])' Sets the parameters for the refinement algorithm used in drawing in the conformal model. CMX is the cosine of the maximum angle an edge can bend before it is refined. Its value should be between Geometry Center Thu Dec 12 02:41:23 CST 1996 15 Geomview(5) Geomview(5) -1 and 1; the default is 0.95; decreasing its value will cause less refinement. N is the maximum number of iterations of refining; the default is 6. SHOWEDGES, which should be `no' or `yes', determines whether interior edges in the refinement are drawn. `(set-emodule-path (PATH1 ... PATHN))' Sets the search path for external modules. The PATHi should be pathnames of directories containing, for each module, the module's executable file and a .geomview- file which contains an (emodule-define ...) command for that module. This command implicitly calls (rehash-emodule-path) to rebuild the application brower from the new path setting. The special directory name `+' is replaced by the existing path, so e.g. (set-emodule-path (mydir +)) prepends mydir to the path. `(set-load-path (PATH1 ... PATHN))' Sets search path for command, geometry, etc. files. The PATHi are strings giving the pathnames of directories to be searched. The special directory name `+' is replaced by the existing path, so e.g. (set-load-path (mydir +)) prepends mydir to the path. `(set-motionscale X)' Set the motion scale factor to X (default value 0.5). These commands scale their motion by an amount which depends on the distance from the frame to the center and on the size of the frame. Specifically, they scale by dist + scaleof(frame) * motionscale where dist is the distance from the center to the frame and motionscale is the motion scale factor set by this function. Scaleof(frame) measures the size of the frame object. `(setenv name string) sets the environment variable `name' to the value' STRING; the name is visible to geomview (as in pathnames containing `$name') and to processes it creates, e.g. external modules. `(sgi)' Returns t if running on an sgi machine, nil if not `(shell SHELL-COMMAND)' Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview waits for it to complete and will be unresponsive until it does. A synonym is `!'. `(sleep-for TIME)' Suspend reading commands from this stream for TIME seconds. Commands already read will still be executed; `sleep-for' inside `progn' won't delay execution of the rest of the progn's contents. `(sleep-until TIME)' Suspend reading commands from this stream until TIME (in seconds). Commands already read will still be executed; `sleep-until' inside `progn' won't delay execution of the rest of the progn's contents. Geometry Center Thu Dec 12 02:41:23 CST 1996 16 Geomview(5) Geomview(5) Time is measured according to this stream's clock, as set by `set-clock'; if never set, the first sleep-until sets it to 0 (so initially (sleep-until TIME) is the same as (sleep-for TIME)). Returns the number of seconds until TIME. `(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])' Save a snapshot of CAM-ID in the FILENAME (a string). The FORMAT argument is optional; it may be `ppmscreen', `sgi', `ps', or `ppm'. A `ppmscreen' snapshot is created by reading the image directly from the given window; the window is popped above other windows and redrawn first, then its contents are written as a PPM format image. With `ps', dumps a Postscript picture representing the view from that window; hidden-surface removal might be incorrect. With `ppm', dumps a PPM-format image produced by geomview's internal software renderer; this may be of arbitrary size. If the FILENAME argument begins with the vertical bar `|', it's interpreted as a /bin/sh command to which the PPM or PS data should be piped. Optional XSIZE and YSIZE values are relevant only for `ppm' format, and render to a window of that size (or scaled to that size, with aspect fixed, if only XSIZE is given) `(soft-shader CAM-ID {on|off|toggle})' Select whether to use software or hardware shading in that camera. `(space {euclidean|hyperbolic|spherical})' Set the space associated with the world. `(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])' Configure CAM-ID as a stereo window. no: entire window is a single pane, stereo disabled horizontal: split left/right: left is stereo eye#0, right is #1. vertical: split top/bottom: bottom is eye#0, top is #1. colored: panes overlap, red is stereo eye#0, cyan is #1. A gap of `gapsize' pixels is left between subwindows; if omitted, subwindows are adjacent. If both layout and gapsize are omitted, e.g. (stereowin CAM-ID), returns current settings as a `(stereowin ...)' command list. This command doesn't set stereo projection; use `merge camera' or `camera' to set the stereyes transforms, and `merge window' or `window' to set the pixel aspect ratio & window position if needed. `(time-interests deltatime initial prefix [suffix])' Indicates that all interest-related messages, when separated by at least `deltatime' seconds of real time, should be preceded by the string `prefix' and followed by `suffix'; the first message is preceded by `initial'. All three are printf format strings, whose argument is the current clock time (in seconds) on that stream. A `deltatime' of zero timestamps every message. Typical usage: (time-interests .1 `(set-clock %g)' `(sleep-until %g)') or (time-interests .1 `(set-clock %g)' "(sleep-until %g) (progn (set-clock %g)" ")") or (time-interests .1 "(set-clock %g)" "(if (> 0 (sleep-until %g)) (" "))". Geometry Center Thu Dec 12 02:41:23 CST 1996 17 Geomview(5) Geomview(5) `(transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt] [`smooth'])' Apply a motion (rotation, translation, scaling) to object `objectID'; that is, construct and concatenate a transformation matrix with objectID's transform The 3 IDs involved are the object that moves, the center of motion, and the frame of reference in which to apply the motion. The center is easiest understood for rotations: if centerID is the same as objectID then it will spin around its own axes; otherwise the moving object will orbit the center object. Normally frameID, in whose coordinate system the (mouse) motions are interpreted, is `focus', the current camera. Translations can be scaled proportional to the distance between the target and the center. Support for spherical and hyperbolic as well as Euclidean space is built-in: use the `space' command to change spaces. With type `rotate' x, y, and z are floats specifying angles in RADIANS. For types `translate' and `translate-scaled' x, y, and z are floats specifying distances in the coordinate system of the center object. The optional `dt' field allows a simple form of animation; if present, the object moves by just that amount during approximately `dt' seconds, then stops. If present and followed by the `smooth' keyword, the motion is animated with a 3t^2-2t^3 function, so as to start and stop smoothly. If absent, the motion is applied immediately. `(transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt])' Apply continuing motion: construct a transformation matrix and concatenate it with the current transform of objectID every refresh (sets objectID's incremental transform). Same syntax as transform. If optional `dt' argument is present, the object is moved at each time step such that its average motion equals one instance of the motion per `dt' seconds. E.g. (transform-incr World World World rotate 6.28318 0 0 10.0) rotates the World about its X axis at 1 turn (2pi radians) per 10 seconds. `(transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z)' Set objectID's transform to the constructed transform. Same syntax as transform. `(ui-center ID)' Set the center for user interface (i.e. mouse) controlled motions to object ID. `ui-emotion-program is an obsolete command.' Use its new eqivalent `emodule-define' instead. `ui-emotion-run is an obsolete command.' Use its new eqivalent `emodule_start' instead. `(ui-freeze [on|off])' Toggle updating user interface panels. Off by default. `(ui-panel PANELNAME {on|off} [ WINDOW ] )' Do or don't display the given user-interface panel. Geometry Center Thu Dec 12 02:41:23 CST 1996 18 Geomview(5) Geomview(5) Case is ignored in panel names. Current PANELNAMEs are: geomview main panel tools motion controls appearance appearance controls cameras camera controls lighting lighting controls obscure obscure controls materials material properties controls command command entry box credits geomview credits By default, the `geomview' and `tools' panels appear when geomview starts. If the optional Window is supplied, a `position' clause (e.g. (ui-panel obscure on { position xmin xmax ymin ymax }) sets the panel's default position. (Only xmin and ymin values are actually used.) A present but empty Window, e.g. `(ui-panel obscure on {})' causes interactive positioning. `(ui-target ID [yes|no])' Set the target of user actions (the selected line of the target object browser) to ID. The second argument specifies whether to make ID the current object regardless of its type. If `no', then ID becomes the current object of its type (geom or camera). The default is `yes'. This command may result in a change of motion modes based on target choice. `(uninterest (COMMAND [args]))' Undoes the effect of an `interest' command. (COMMAND [args]) must be identical to those used in the `interest' command. `(update [timestep_in_seconds])' Apply each incremental motion once. Uses timestep if it's present and nonzero; otherwise motions are proportional to elapsed real time. `(update-draw CAM-ID [timestep_in_seconds])' Apply each incremental motion once and then draw CAM-ID. Applies `timestep' seconds' worth of motion, or uses elapsed real time if `timestep' is absent or zero. `(window CAM-ID WINDOW)' Specify attributes for the window of CAM-ID, e.g. its size or initial position, in the OOGL Window syntax. The special CAM-ID `default' specifies properties of future windows (created by `camera' or `new-camera'). `(winenter CAM-ID)' Tell geomview that the mouse cursor is in the window of CAM-ID. This function is for development purposes and is not intended for general use. `(write {command,geometry,camera,transform,window} FILENAME [ID|(ID ...)] [self|world|universe|otherID])' write description of ID in given format to FILENAME. Last parameter chooses coordinate system for geometry & transform: Geometry Center Thu Dec 12 02:41:23 CST 1996 19 Geomview(5) Geomview(5) self: just the object, no transformation or appearance (geometry only) world: the object as positioned within the World. universe: object's position in universal coordinates; includes Worldtransform other ID: the object transformed to otherID's coordinate system. A filename of `-' is a special case: data are written to the stream from which the 'write' command was read. For external modules, the data are sent to the module's standard input. For commands not read from an external program, `-' means geomview's standard output. (See also the `command' command.) The ID can either be a single id or a parenthesized list of ids, like `g0' or `(g2 g1 dodec.off)'. `(write-comments FILENAME GEOMID PICKPATH)' write OOGL COMMENT objects in the GEOMID hierarchy at the level of the pick path to FILENAME. Specifically, COMMENTS at level (a b c ... f g) will match pick paths of the form (a b c ... f *) where * includes any value of g, and also any values of possible further indices h,i,j, etc. The pick path (returned in the `pick' command) is a list of integer counters specifying a subpart of a hierarchical OOGL object. Descent into a complex object (LIST or INST) adds a new integer to the path. Traversal of simple objects increments the counter at the current level. Individual COMMENTS are enclosed by curly braces, and the entire string of zero, one, or more COMMENTS (written in the order in which they are encountered during hierarchy traversal) is enclosed by parentheses. Note that arbitrary data can only be passed through the OOGL libraries as full-fledged OOGL COMMENT objects, which can be attached to other OOGL objects via the LIST type as described above. Ordinary comments in OOGL files (i.e. everything after '#' on a line) are ignored at when the file is loaded and cannot be returned. `(write-sexpr FILENAME LISPOBJECT)' Writes the given LISPOBJECT to FILENAME. This function is intended for internal debugging use only. `(xform ID TRANSFORM)' Concatenate TRANSFORM with the current transform of the object (apply TRANSFORM to object ID). `(xform-incr ID TRANSFORM)' Apply continual motion: concatenate TRANSFORM with the current transform of the object every refresh (set object ID's incremental transform to TRANSFORM). `(xform-set ID TRANSFORM)' Overwrite the current object transform with TRANSFORM (set Geometry Center Thu Dec 12 02:41:23 CST 1996 20 Geomview(5) Geomview(5) object ID's transform to TRANSFORM). `(zoom CAM-ID FACTOR)' Zoom CAM-ID, multiplying its field of view by FACTOR. FACTOR should be a positive number. Info file: geomview, -*-Text-*- produced by texinfo-format-buffer from file: geomview.tex Geometry Center Thu Dec 12 02:41:23 CST 1996 21 geomview-1.9.4/doc/geomview.pdf0000644000175000001440000332620610663301504013360 00000000000000%PDF-1.4 %ÐÔÅØ 3 0 obj << /Length 493 /Filter /FlateDecode >> stream xÚµSMoÓ@½çWìq-u·;;ûy„ˆ‚*"!a¸«¸MÔ4‰\»~=3»¦é¡âP"Å£Ý7ÏóÞ<ƒ0ô‘ˆˆ:»ÅÕÝÂÌÇ· ˜+‡–žÏ^)¾Sð·nEü*ÚBðº]œ_D+¬ÑÁ'/Úka4Ú»¤Æ Úï_äÛ¾Q ÷w Zù°é4 £“+>ì»ANݶùÖ^ž_x`t6˜£“PÁëèÑÍ|Äe#qQwáfJDù¹I(ûážøn¿«ç ³F¦g>HÙ eƒFXø®÷CÅ}ÚQÓægA*šÂM3Cë«_M7aÊÆÚd‰sGÐÁêÀ¬·¥aÕ „¿­Ðkžj»Ý*¢“ýXŸ¤¤®DÁiôLdjk0ªåþÐØ$L¸¹Ys=¼wÚF›„!ïSÅ^U3ƒyj¦BmÐø'À¯¤ñ9ãÁiï¼§¥3 r¶ŠþRµ]Wã¹.Ë 7úq8V•˲’]c³K9ÌöXÐ)’‘1ð&þKUø2UIÑúBUò‘&§²¯y'ïû‡c“œ<«ÂZŽWWÔTWQ+*'Nίª{Î$#ÎNˆnx +Ýòº7‡ûjÕ9¹ô_ŒyɺÙUr]Æ_n»ÇЫËSþ§SŠßõ¾¹]Ïü‹7íâ7a # endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 1 0 obj << /Font << /F72 6 0 R /F51 9 0 R /F60 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 16 0 obj << /Length 178 /Filter /FlateDecode >> stream xÚ…¹ Ã0D{}…J bE«Ã²ÚR« )Œ£8"ØÆØ¿ùÈÑ™mfw3,`°åØHɬ2âËù‰`QI$’dçÐö¨g–[ÀîŽ5¤L+­~Qîv!@¯îŒî¥…X+‘µ6à*Ú §™b •žÊN¾©¨0¤ˆ§ aC)%é~¡¦"#oó¢ ý¨'C¹Ÿ>ø!Ôå¼¼bNÛ”m^±ÏoDb endstream endobj 15 0 obj << /Type /Page /Contents 16 0 R /Resources 14 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 14 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 19 0 obj << /Length 1637 /Filter /FlateDecode >> stream xÚ…WM“Û6 ½ï¯ð­òÌJ+ŠúloÍ´Ûí¤‰sJ3S­Íµ•Ø’£uöß dÉÖ6ãƒHGV Ÿ~j‘ù‹Dk/ “d±>ÜøVüõFÙ‘KîXå×ÕÍÝï‘Z(ßËüL-VÏ#«Í'ç¡\©ÓÖKåTK—†›Ž†ë¥«œ¶€°\ºZk§­ð {’¬Vl|)̉¶%Q¬`ùyõçÍo«O?B •kÈI°P‰¨(´ã4ô”£²&t¤f Ì'Øë3Þ$âåJ†÷†°ê€°öØO@zéò]z>áSxWLv¹:Èœ¢‘o^Ú¹x°×ªsò‘‘õ#ûv[çxÐwž1­emdœÌ(gÛ›ÞÈà—Ð8"&û¼tÈÌ–ðñNŽ]±iõ´t£ÈùÒ›]· >·b®ª‹­‹»ã²J{*òå²l8ßï_—n¨BÜÎ%³mkJ‘=áJ¼9M›ÿã+-AÁlxb™º‘•êY¶¶;Ù½%ik{Ø;Œ8ÑÔ"Ë[Ñ>ïŒÀh=[7E;ÂÓôœU–ý囪Ío§×ùº„¿>;3õq¢Jæ¨,Sy0 œö­ˆ×kÒÃ,Mö®ÙˆZÞÈB.:…â¨:ùžÉi·ò³Š0‹±û¹²Ú×r<Ó7âÉ õì™8¯`PG¦Œ8i&â¦ÜÖQÚOíá~âTíÎØá±&Ö‚v¦(žvÂ6rîW›ÉÖ,༖ƒb-Ã6k‚–,’­l™òúu™j‡"êØyhegSJ‹‡ß; 饼yׯlVú™…¾Ë⻌ÖÕ¡÷XGl资d«(×{µéá…ÊwÞ3ÅpT÷}É ªînÅÖgÅ9Ÿ+ <.Ó¯B“ž\çû¦’QÝ•B)t*ˆü,~÷º•ìàÍ]nµã„D)š/7dNGtcÙÆ0Ö5`ÛçÙØL>›àhÏˈ™–áE_èu(' *¤¬š˜rsþOÖTdALip¬9›¯ j±_E^$,zØÌß—%½€¼`>?íí>vófHºú”.ì*EñÐÈáf‘M%ßÿýQïÅ= Sžæ ÀÓ¾O¨Ð(Ö|B9<ö_øòîpûQ,#Ü¿¨ƒÊO¼XÇá"Š©Üd±F¡#1/Šá çŽgŠøµAœþé]uä7ÀÝ~¾•ÖùÖHÐÃ+l™ïÅqœL°ÍêAï‡Ø²ÐÓ¾VSl’_@È>d(˜y±o„Knšy:ÊTϦèm6I(2H¨-aöCtÉ~V«Ìò+ ƒ g1R;õáÞWùÆ*±åÂw:¥&%Ôé" C/âT|'‘ùnÐsÇŠâ»`ì»kƒð®m?ßÝN'ɵëêíU·¥R/‹³äÍuËÕëÍ ™DòÚ ÐØxQ¹õü J¦{”ê|(šiÚè_?1¡iô7˜”Åò¯}óDÚ\L*P¸èó?hlØÙZ¡Mÿ—ÙsžA{ meŸWèU&ÊÙYbÈXþÖ ÝCKð‘‚$Ð8‡ƒM ¸†ÕÈ¥5¨ºVæ³}òÙTp†É@Þ”[¾¿EÙíyCî7Æ@OP¥ûv:ê–N¹ÃÁwè¨tæükÛà #òYGä>˜è çv Úº™¶9õ=•ú™ÕÿIN9ÐËŸ¾/š51¦Þr‡î!E÷À¸ùæIšcøà Á\nëšq‚"—uR¼¿ôº¸GÇžÖI8ímág]®½;D`ҵŔkLÞ÷BP¬Àê7À ¾€Æ·ÎôT[‘÷Æ›]^KLb-‰G2]¯/U»ê¸D²è´CÌ6vf¶ãáÄ…ÒI( ùèÔ“­—΢öDù¤•eIª7˜L¶óŽÉTᶘùÔºGö d:³„`ƒ5a$¨4ö>³RÚâ€e1Õ4~lm£¢,z#F,Âxj3ï;Ãÿ S\> ÷®ÐsZõ/•ô{VËz…ìYFÇ1šyüéíÈÀ^‘F'ÐÃ<ÉäÈ…˜á¶—ù›þæ†aì¥=ãù:‚¿÷c•™ 262ª€ÓxMÕÕkCok¼Ò´wx¥”8yµ(Ÿ«»ë×>ÒßôXñÌ«3èÍ€¤ŽkƒCÁ¹ÿ,!¬ endstream endobj 18 0 obj << /Type /Page /Contents 19 0 R /Resources 17 0 R /MediaBox [0 0 612 792] /Parent 13 0 R /Annots [ 22 0 R 23 0 R 27 0 R ] >> endobj 22 0 obj << /Type /Annot /Border [0 0 0] /Rect [107.6364 558.269 190.6667 569.1781] /Subtype /Link /A << /S /GoTo /D (Copying) >> >> endobj 23 0 obj << /Type /Annot /Border [0 0 0] /Rect [387.2438 542.4326 518.9697 552.4325] /Subtype /Link /A << /S /URI /URI (http://www.geomview.org) >> >> endobj 27 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 444.4002 433.6326 454.4002] /Subtype /Link /A << /S /URI /URI (http://lists.sourceforge.net/mailman/listinfo/geomview-users) >> >> endobj 20 0 obj << /D [18 0 R /XYZ 90 720 null] >> endobj 21 0 obj << /D [18 0 R /XYZ 90 720 null] >> endobj 17 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 31 0 obj << /Length 1590 /Filter /FlateDecode >> stream xÚWKÛ6¾ï¯ðQÖŠDêaµ·¾‚A›ÃEQô µhK‰,¹ÃýõiÙÖ¢Å+r8œç7Ãq¼Šà/^Ñ*×:,’<_íŽO‘¿<ŲÚÇfÎòÝËÓ»ŸÒxGañêe#ä¥ú3ø¡íЬãàu²ð¿é»õ_/?¯•…i’& ¹4Ÿ~|ñªR¥þËdy´&W«8U ¢Ùšl›„±NRo X1¬7` …6êÞpVmÃÄÓÝ÷¦?®U|Å%œ×ÀÍ(·ÓùíL…¹Îµ8¸Ü%ׯ~o×j 2@dɧ 6dø’d"åÛõFGq`kPIRŽ$²ìà:Qr8ƒuiùØ|Eă.¸ë;ãͦï~0B±=§Ñ±ˆœ²«p‘>ºá®xz…Iqe‘Ö¼Nðß’o«M¬TX¤q+ÆiÄE-:Î0 ôݱÁ˜¨²q4$õèg…á·€£1\o]ïjLÏÒcÎx''3ð‹·zÑáäÙÚðâ„ö½¶ÍŽ·Ug{Ü ]B Â󡯵§‰òP9άœÓ9]h€RpŒ²C8‹ZiY02yýV¾óŒ,IÀ$f÷Fâ|fÔ¨«•!ÙÍ¡»æ‘ Àü"à Ҝf86¢áZ€Iøt‡[_9Á“:Nƒ?Ip àü¿bÚNh¢ÌÉ.mr™Ã®mþ¡óŽégBöÔV³-dÄò´#<{Î6ø}nç8 º^n”mÛû5"˜¹Rb‡Ë\~œ|¸9>bÃBPúBPêVquŠa£ƒ=¬'$@.>ër(Óž=¼ð†õ cCØB¿Ço¼Ü·ÁÖäü–Tˆ”£ °À›©c…lž’^‚ƒh¦E¼ÔfÉÍk@v AR«›b–Gaäi„´Þ“tì`ÕÂ÷qŠ¬ï¡±ÏK õ*‚»²ãÅîÙ0 ã²--W›œ-¿öÜ‚àø¶'z|}Iá%ß“°Zìý$¨sÂ3Ÿ¯R„Y‘<”dzqÐómæŒ<¡ªùHõ(Q[{úæÝ»óùÀ8,€°siÓd“Þ­5éã[°æfÀ{ˆÖpÑotQ„ fYW÷<ÄúšÑ“céÞØÌ:ìC€14Ž7"ÜçÚt¼ºb6¯““Íé’'ë@p¦Òà{OqM˜L£:Aú¾ÜÙi$¼]²<‹Šj›FRÜл _L0ØÔ'+§0ùž<2‰VÄWÔ‚RHèÂ,ÍرKC}_ä²h}s~¦C)v A\Àûç-ñŠÜÅ#¸PƒùãÓóQ1ñ¶l ÐQŸÈ¨˜e ¹èU„Å¥µ-o H 㳌1ØvíDQ¥¸Ï qx`;ÜÔ4Õ|ŒÑHj6Þ\mïšWæyq¦ç2Ö2:Í[µeÂÕCÏ•@À–Ga#sX-‹7~$÷U!ƒŽf2O(ŸºÊÏjbŽƒ°OãT¶Bþ)§¨®¿4T£·¶»êP¶Ìùiö¶£ ¾#‰ >tÌ0-‘’òۣ̊0€£ÝLý‰¼? å‘P‡˜|˜™øê¦rÜðF¼+O1Q¯Sòöû!Œp§ 1áS32í3¿<ŠÃâó)@¸ùJ²àî±:Êocx'´’ßOKõ€KZû¿›1N endstream endobj 30 0 obj << /Type /Page /Contents 31 0 R /Resources 29 0 R /MediaBox [0 0 612 792] /Parent 13 0 R /Annots [ 37 0 R ] >> endobj 37 0 obj << /Type /Annot /Border [0 0 0] /Rect [372.4397 532.2707 504.1655 542.2707] /Subtype /Link /A << /S /URI /URI (http://www.geomview.org) >> >> endobj 32 0 obj << /D [30 0 R /XYZ 90 720 null] >> endobj 33 0 obj << /D [30 0 R /XYZ 90 720 null] >> endobj 29 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F55 36 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 40 0 obj << /Length 426 /Filter /FlateDecode >> stream xÚ…“Ën£0†÷y ++s›Ý´"£©¢´J¨f1š…Nk•`dLÓ¼}l£’©Z±°ýŸÛw~ ý! C˜‘$åaXùe†ìm¡3SnŠÙõ2B0 2Šý¤IQýõnEëãÔ;ñÆGÞ“ÿ¯¸Ç0"Ñ=Ïä,ÎòbaüÈ9å’”@ŒtkC§¢D–D´~ˆ4Œ¾5Ìõ2D …Y58…I–E`1$(êÖ÷EþÃ×##ï‡WÎŽæÅ;sV¼S’ïzÅ*#ôMŤ¹ªgfK׿²Ê·Û|cÅ|o~®ÌãáñfõûvpHÛ¬-%q`<Ôr¾ÞæÐ×jxKqÙ¼íe+:fyÄÞ…aÍKÖt6ùÈÆpó2­˜îGm5·Q®¦péwdÒ6¤æ˜×|'©<ͯ¬ÜT_MaoŠÉ†ÖæuU_»EÀ¼•âIÒCçÀé§$õ¸Ï‘«ç ‹”3ñÕ+qiÖŽ•´¿4«kYÉ÷¼¤u}²Ú([*>£Ñ™Â®¨ñ[É™ÒóGáÃ>£A“å•QœmÐý/ï$õ endstream endobj 39 0 obj << /Type /Page /Contents 40 0 R /Resources 38 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 41 0 obj << /D [39 0 R /XYZ 90 720 null] >> endobj 28 0 obj << /D [39 0 R /XYZ 90 720 null] >> endobj 38 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F31 44 0 R >> /ProcSet [ /PDF /Text ] >> endobj 47 0 obj << /Length 3147 /Filter /FlateDecode >> stream xÚ…ZÛnÜH}ÏWøme Öè~Ù<%Adá 6Î3ó w«ÛZw·’:Ž1?¿$ë¢¶ì €[ªbY,òð¢Äý‹/êè¢LÓ°ÎÊòbµéðý«XŸ®ˆâÊ'ywóê—y|GaÕñÅÍf¶ÉÍú÷àÓ¯ß.¯Ò4 ®?|½Œƒ¯èÏ¿y$ ¾Ðã·w—Wqpýù½ñC0ѯDz•¤e^ùåŸ7ÿxõáÆ ’'ÉÏDe’§²–ÉE\†Iœg*kQeaœf¹'k™‘¬,ÅׯXÒ2¾|#ÞAJz½¦·Ïï?°„$عâ< £"*.Hú°.ÊTöþÏe•í0výGMÂø5ž>^VYÐ2Ç[Úx8ÑŸfxÄ\\×53¹¸Ši·¤ “ÅyXåY%»¾ï—I<´¦ÛÞñó$äy&eR]DašT ]AØ"ò…½JÃ(²‹+ð(Ζ…y–ç¤_¦"ÉÌDHs”4ÚÌÞo&–êÿ4ƒNȉûÓæ×ÍÄ*‰ÝëóaâÀE–UYÓÓ0Î#˜S®ŒnD¬³ýqG«uã/üܬx¼Õ ¿ž:›” M#×L6ùÌÿùöòª(Ê Jâ8&¾Q‰÷o|’·"y@R„iãZ?|烵t]ô#[)£nÄ¸$‚}7Míl¦¿"§Þ FQ ž×Ý8 ,ûíÉ;øñB¾ó[Òýì1gö#[hG#­¯½~£Ü1J¸ã ²Ã¨\Ö½ˆ-£'0ài±/Õ¤2!â;~ÛÉ_U‚΃Uzhv»Þš…œfM«Â¹†3‘ù÷›;pœ«UN Â’½fì8¸O00»¶‘q£{½/ç‡3èŽ×²tÄÂóŸ®®CÄg{ޱWݳ9'u0AñiX¤E:×~³ ûxZAõÂkì‡s¡Zåna´»|€øÂ×pkîP„ïV"þZsžà™ŽC:ygv°Ö°dA¾ìsSVºmˆ©œöü÷–L©²j$Ø ÿº0gaš ( ³4'OJ¢BØ}Úf™ò ­Hç°ÄÖaœTðÈQYT’]ŸëõUÁ†aiѾ·VCoãS´¢Qû°Æ-uÛƒQUTÀ¡‰`jîU'̧q[' ÅIù³,‚—ð€~¥?«LT)Èñ®] }·çÝM@©ƒó ýÑì;éTÄ€Ó &ãugÓG¹×#Ê¥sѰœK€\év¢ŽA3=ºiayé#a¦Îl¢Ã®uS˜´C­m³Ä‘/qHä4NÏ{À¶3#Kœqòó …WQ6ßFL¡<Ñ%Z_Ê&Vÿ½Ù­ùåÁcµ•®„Ï\%'()Ip¥AâC]ÅËoãipBBx‰ó³G¾é×(ŒÔ‡QL,úü¥sá4BH¯jD.~°’_ #ê«Ö¤ W`É vî4 >o°ÔÅtzÙIFx—¶ \͕ɿ'ß'ü­q™3'u5ç²gÜ>yeJ.)Yô÷nýLö´FpKÓ 0[tA[SžçÁÿÚÇ®¢”Jk'-˜Bó¢t}ˆ¢Ô|xÕ9o9ÌL™£Y‡,BžÜÒ@á…EÞÓ¶\MIç¸î! tÆ+'#‰§0™h6\-”4ds¶µì5¾xĹ{éwÎì¹è•ðhÚ!c UeôûcÑ· @÷,̓·¶áVøÞ]x^!º;SIO§¶rØIG’ö£é<¾ÔmM)w€”ÂhÝ ®åmbç ÙÇoúµ)©‹…ì#?Ï>òYtäEjøÝ¸l½¿=ÓDD3‰«:áßœÎÇœic—ëï— ø¬åÁ™ò²¾VàÃÅíG .–ù2‡dơԮö"÷ä6©Íj?·¨ù>Ígòhî-\YSåy‡êBJY½õ‹]9Û“¬²ÝJ5HGí’ï;tãx±Ôâµfué¾Õö¼Ì™Ù,Ì×¥h!~éõ,{»hì'íý9”ý~]j›ÓÚ[¡IM~šß&Eê»EúÔxk(ê¾ÝÜeKÊåi‘Xãg.“9oçç_Œþ\Ò0ý-ŒEžG„¶?èf­ 6ñ ¼‡¶>6£ýrÆïýAåòÏäêàÎ~&UY00ÂÈÓNÑ”Ðþþ`!ÓÄ›í$7°}žö*hPn¨ñ©ÑEš‚®©ÃÇIq¹¢œ} \ˆz ¬ùY¶áLÛP9Ét?üm\NhŽbåÚée¤~è4}c7D×rU?•i¹Êp$x6UêíYkoèowF3{ÿ£©d÷ÀgM;-…÷g>§•û:“Zû‘€S¢"ËGÕîÎæ{IúbS'‹‚´Ûé2\ ÊZ ¹¦uÁá†gVTsMxDN‹(Þ˜¡Þ›ÒõíÂóoœB%>NéMíšib¶cd€m;4ûðyg·¡µÊa¾¶\‘LQ‹äêIeNä6‡æ-Ã+DØ*÷“?+"O›ü+†¹'æÿ‘H ƒÕh½ÓKˆvçøkÃS{õ<"ýº*‡<Ù¼'Ãã°CVù¯:ÿ²nõ” endstream endobj 46 0 obj << /Type /Page /Contents 47 0 R /Resources 45 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 48 0 obj << /D [46 0 R /XYZ 90 720 null] >> endobj 45 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F60 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 51 0 obj << /Length 3483 /Filter /FlateDecode >> stream xÚZݓ۶÷_áéK¨‹!HðëÑql÷:'Ÿ'Óiú‰”Ž5%ª$Õóõ¯ï~%*vjÏœ` ,ûñÛÕËþ«—eô2O’°Ôyþr{xI÷çJžÖ@±öI~xxñý»T½TQXF¥zù°›MòPý#xÿáÓj$IpÿöãJߟ_±G¿Àã§VkÜß½"|P}Òuœäid«>üíÅÛÇHÇ_cI¾×¬Ð¡JtJ¼nVq<êet›Ñ4Gàƒþì±³ ÿôõ€\Ž=oÇæ?ø^Ícm³­qß"*éß!qw˜Ís2c}ÄwGn?"I[­è%ôáj­“8xx¬ûz×õ¶ÿÈ*Jƒ'oÕæ84ƒÌ2â4FæèíÉ[ rZ«$TiÄ'…œ˜0‰Óiû´b…:Ø!=?¦ã­÷CÓ¹¿Ûñïø(3µ(¤ 2oúg;¬â<8[ܹi?ØØâ@çd{s‚Â9ŸØ$/$v%dïܶ«W]¡ØiSÂÛy:›9 'æ„xh€ô÷HéºbmŽüKBnVd'9„4£Ò v¦MÃ,Êcšö§(Ñ™˜<²=âæžP,¦¯ñ|u Km[ä´²˜è<ºCÍOm³îÞôÝè€/¦ñ<0Ë'—ƒ¢}ÀÒVÕñ™ö"³v}E:oP|ÏÜ÷­ñÓôìô›µO¶¥m¯Ý¾=qþ‚{Ø7:Ž‚û+EÏ#PtlXÁ"e‹[¡=XùµŽX»ÂòFóÖO*ªU¼_d”†„)âš÷[„ÂÓ (Ú¦NÆŽ)™®ãXáÔ êSÕC³?‚¥¡¤Kuãœt”m éQÿFnÆš{«/q¬Ëfâ’Œ¨QozRmh¸3„g8CâŽí fz_ë·Žùy ýâyd°ÙßVE²l#gòê1O—g•dùä0`|ëvBžúRO6µÌÂ#Y@Þ®ªå]”>þ¢eæ þC3z‹?; ÉD›;ëz™èêÜbèS:fæØ×$ÓzÁ5d´í9ñ}oÃ-cOˆð·ÇéÄHÆè.ËÄ›€Û|òšäñ3ÙhÅCâã¦wÝ6È2ádHÀm¸µÆÇI×éMö¯f”Ã&ý|æ édà×¹Cæž;eÑáѰπÙÚÉV¿iòNAÉ·yû {•— P‰;†_çÃéˆ)²uÜA‚ß¶Þ›–8‡†uÑf:yè5ücW¤Ýï6Xvýgt‘*²¤ `¼S0Å)ˆßâ¬ë›=­&ÎîB5®Nl¨ˆo8¦ôÂ*±cÁ•’{‚!DFç 9 ôP)£ ëÂ>ï¸'x€b&ÖÞt¶#Ÿ2ŽÓaŸiB {ä5E­ËÇ–£¾„;îGï»à$D7½Xÿì @ÂØ6ÆSá&É»ŒƒÐ÷àûúÆp‹Î¨ç¤šê”¥ŠT÷lÏÎïcßäîàõ_&9ý<Ã~_däha‡Žv†ß|a€,»CÀ}&pŽ/A»ÅÅ&M…ánn©8QG-ØiÄþ“éœjˆš‘ ÞF¿á0á"«aP”¢·¹Cw뼂…}™=Yʱ”ˆ!J²$‚“ÿEhf`: ó8·÷ŒÙâ”q‚ãû£ Ë0ÎËR(¦3…mxÑ™¾´ ìÛxΜýÆÁF`dÕM§>È\¸ˆ£cÂSß<×(^/äPɲßÓ*ÁÙ‡ö¦ R÷µÀhNpœQú‘ ü9ò±§!Wãn÷ظp*öá ‡¥uVDÁÝÈ£¦eœÉ­¡B„MåÅCµdì$ࢾ‘»Y…û$jý(ð×Ùx=ðàd¬ØB×gHÐ6Èxã”’€9f/“v¸ŠX~‡qíÁ³ÚÑÚ¾p¤(³f¹cÇUàÆÔ½ˆU â]§ ÖK{6‡ IDàxöNs@ÜV øÌÉO^ŠÍ@®Ú6gC"ÆP>õ¸AÇCs-Àiî]þy ;¸ [ P(\ŠfíÜézŠ;|e}’8$t³·[p°@wKïð¹dA¬’WÙdë :BŸËÒ’RQ˜ë­/8ÛÈ7ŒæèÄWpÛ;t›äõs8µµ¤ÙjÁiD_3 {í-»L‚› r°dƒ’|æ 6ViqÄðÏUÎi•ãüøm›ˆÔÇmwî­bçDððä x¼ÒØx) e¤î wÝ_ØŒp]ÇCfþN² €†sÔG³igõšˆÃ9ƒÃg¯Ç¦¾äµ—N"‹.½°šyá§Ç®]¬÷¸Ë‹Î×S¨P’H2ýìŠÙõáƒ#à†ƒA+ ÅXh3Ê0^ºIüóê:ë>¾¿çŠ#jâ—¦ÈßOL=»@IÇÛçu˳óÓÍL{’Éæè.Ko—i”1©+-BÏrº-UŸÒ­,Œh3­†ÒñzXÜ]ò—Ú ÒÛé¿c’y͚ǘõÝ4÷ËLPE˜M­b)ô±N#ÁYøà§׌Ñ!=ïÅ!ˆù¬!åKWö‹Ê)rRöï–SÑ•UAEùÁÎ.l]f›T猪TÜW³'F¬ k×DiÉxà·?øŽíN’‹‚f¢j‰Ib‹"‡É±5þнCš9!ÔïÝ,×À"˜_€¼­Ò\RsÇØ²¤oœ×ÅîåZ¼Âêᑤr• {…l…Í¡Þ!Ë jœ [Þ  ¤ä¥Òiz+{¯´5Ñ®k?ÒÅ_ö„n¡ÈMÕݶS±;‡“G呂çÎÅÿå.×Tî®.l¦Ädq§²líªÚ¸Øbe'*Â(Šo.ÙÚ,Ϲ1PÌ9í"ÆmÈÉÕÆZªWÅ:„@øÇÕ¥<Ë3¡àãÉÊå %*TðïÿÜÙ ^Rè°(‹rn€àE¨ü2EUMžÁ% åi¨‹D3Gˆ¢óDjÑŠ«¢ÿߢÒݸÚÚFs˜ÖV&åÕÊwüÍT¨xw)¥­K¢ÝÌœ\] ¢£Ã1Ã%5êpÏ2+T+Ô¼{u ÎaJÆÀÕÌn¬ŸùjE•oxW¬Þè€úÊ–5&ˆÃ!Kä ™è,F‰ƒcµSEÂùá-2÷ëOQ ÒàõxñG~¦o~–Ü=ÜýüAÈÞ­’o$ò,xó3Õ¿ß}x?e­)8ˆ=ÝwéÒô×»>=ßáë®Wý‰Vu‹¾»{ózUêÙ;‹zT**[†*.xkꀩ[NŽ“åÊzœdÁë½Ä£Ãì‡Ì‰€icÃ.ö¡ iÌ}¸ëd W¼H }4ýÎ ìØsñý§G€)1~vA[Ñ~þîo0ªéE™s '(;Ò®±yjÍ–Š4 Ý®DÅgWÛM$GÂð£}€‹eCòí™c’r Š6Â…$nQ%{|$ëmþëÊB@"g8ŠÌvàÀA)š‘D;ÂÔ}x±t—½Õœ½kÀÓG{O‹·ælÂZ-Y쥊¯VS¯u<¿µ×Þe56戒È// ï÷(L;tüŽwÑ)œ.ùô"ÿs7–göäe á#Ñ_K WÖažºÈóõ…as ñ€ÖÁ[cõu¹Ò*­qeÕÊÅu‘qå²¥¨™Æøüí2y¦@w^œ+ ˬÌÿD„"ÁƱ U¨yµáõòTX$ß2æå­å(_äEùǘ!™¢.»3cA"Z'þ¤bä“þm…%òq,øccRÆ_2·eÊü=_+¦ˆÍ(kžúúdzÿs-XÍ•_ÀÈ$£´m´$©§EXÄyz+ÙNž>†“Ú#õâì*.ûmVêÜ;$%Íü•Øä9ÝNЄ¡ïÉ}d¯¦q"NÚcúúÉ»ÆãϹ®¾ø€žEi_~(à…HÜ1gÐÒXr6Ú3ì—Ô¦þR»‹…QªHr—€ß&þV¥8« endstream endobj 50 0 obj << /Type /Page /Contents 51 0 R /Resources 49 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 52 0 obj << /D [50 0 R /XYZ 90 720 null] >> endobj 49 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 56 0 obj << /Length 3433 /Filter /FlateDecode >> stream xÚZYÜÆ~ׯXä%\@3æ}8Ov`'#ˆÖŒ8½3œ]BrLr"ï¿O}UÕG\I é£ºº»ú«“›ÜÅô/¹kâ»*ËöM^Uw‡ó›X‡?¼I´µ#Š]HòýÛo~,’»$Þ7q“Ü=œVLŽÿ‰þöó/÷»,Ë¢w?¼¿O¢÷?ÐÿÂHý“š¿|¿K¢w?ýU‰ÐH"ýL¤»4«Š&ªîÿûð7?<¸ƒiú¥£‚äKgM’d_ÆqzWÖù>Éò‚OüðÜb?"NCâ”XÕD3ÑŸ”důØWie)Þut‹ÉL/[ܲb_–eýÕÜÞÞïŠ$‰I$uÔöã=ý|äÁ4šhŸb;ÙÆ4ßïòªŒ–Q~ÍútŠhÅ•H÷i= Å<žæ‰ÿÌÔÊhïïÀKÇIÆ™jœ>hï¹»áöL}Ãg¨øÈUÔò¹Ü“ž%Ù'q’ßí’lŸ±å&|¶êqÄ…—‰E^G×FŽí„^-Ï-S·Úm§3÷÷´mRFßmI=)ª}Š¿Vìþ¢ØãÑÌíQšã`O!2O‹ø /ž¤é¾i²Ï¨Þçya)Î|w3ˆX°AÛÑ¥§/m|·K›|Ÿ•ÕZ¾ö퀅F°PBšÝÿî ]èÐÚz`¼ÄÀ‚Gï0^MüJOÏh/ Ãúöž/¦Á$z6:ÕÝ r6€ËË}[h·sew.T$‚q=ˆ¦:ÈãI™‰¦’¼V7}¢¶L俥ìP¦Ñ…9N`Øá™æ$¿ÝBÇÉ›Lô¨ã;ðÅi¡hs×Y-óô6Ò:¬¤Œçßl"‡YÏ0¿±Kçf˜{³¬6.2/“q&õ'UÏ#õzº]FmD@£ 0bFAJFHéÍð„4O­Õºßoqÿ½Ún0'§h8Ð[pÉÃñÀ È[¬ï´ §ÆõhÍÎQÈ Š‘µw}©’/Õwçn1Nø°úþZLÃ9@Ÿ7Õ(®Ðþz;¼ý[¬‹fÖ×2Þ““->»¤"E.ò’ZÅ>ËÓâ+9¾g©M‡–Ÿ‚ŸÑzÜtI9‘oQ²˜üŸPœ€¼4+¡ øQ]£=?ÈŽ7&‡F bܸàdí©&6´úÄ+Ï2 ýÁ £,§Òrãl>X æ _Ñ6ce³/«r­ r@qa§Ñ0!£BÝ(â­ ÿÉÄd‚éŒ,×÷ÃUúˆ˜çñÊGû ÇQÒÈZ"¬^}/»8´~‘ÉIÎWûµçài¯| Ìön[Æà fÐtƒu”¸V™GÖB>^ã]}VÐ~ó,‡a(ul¸œ¦Ò¼·NýOFîÑDN­ñ0 ìгÒÒZŒöíÌg(D¦r†Z@óaê0³èá®ì?™d”ßÐÀcû±ß¾»{¸Î¤,…5uÄÒðDC“­ Ûr±.=nò dï¶eÍyÛïäåÖö}ò´„muF ‚¤#Wº°—í†'ø“\àÐ}Þˆÿ¡EŒ°£´Cpt*|fjÜàFã>´‡qÑÍGè´zªV>ÚèÚÍÛNó !š ²ý DGþ²•3ºØø¹;j¿³/MmfHƒ?ëwò4z@ÛjšÃ¢ÜN·º8†5L&“ÆÈÓdÎ2|µ§ iÝCS;ŒÀ`ûò,¾´ÌÈÂOÄ2'×ü—¨l ¯ xå59GÝŠÎ'Á5™ >à€_µót:‚%>¦·{=CUžd°[VT“åçfÆjîµ\—͸ Ǭê¯@{íQHúVµ@«µ˜1‡è‚_Б ÆkPÇäì=nXº§m_§¹ÝVì7õ2‹Ø?2+ÜÅ[±+Â='Qíái+Lé¸w-¹ èßNÖªŸ@=8Ä¥‡¸ Àsm¥õêå•’5™V~´:!¬ü.hÓ9ãhV™Ê¥Zf“zÛA³×l”;oAÞÆ»/v ,£û¬X”­´‰Ljp¶bEaC˺ÈÖá˲Œ£_Ùa_%K;kš’ÀpºV94Äz.ïøòêOò„Ó“N$SJTŸV¥¿”éϳ]„VKt‹BÃ2£, |<îì¯*DX¥t@ð*§Ùbo@«öY•‰…S­S g¬rY:gUGZ}=3-~ Ò±r…пìúÉ­]`Ïz¸Ž×™ÓŠ*Q׊ÆEÐÃÖ«£ø¡ÙÒ— dôØ;/G¦/#h³Ž¹±9à:³~mŒ¥¥ÙRº1¼’wb!™ïÎúH%¶:i_Y8ô¦;[íåãdK¶yŒŠÉ¨aÂVpIMvïÓ^¶”§óÉ©ø FSI¤‡†3WMIb¦Žv–1—%ƒ˜l]7Úõzzê¤u7vM«U~Wó訇ƒŽ±1å… +tT’ø­…7V¢"xµr“aÄR„A‘LHX–J@"Å?ñ¸í0ÛµýhÝ:õ>J6nSEg’>ɉñù3Œý¬ðFñÓ¼ü‰Y–räÒWÓZßç@>+ìö%+Cñeî¦WÓ™Ü‘È U3r'ö‰O2¨ÛXXk)„×KX[*{{l1×¥£¢7žf¼¬í‘¢ÉÌ៴ž0 ©ÉðŒ(ýÒ ¨]àdëíã.Oú^H™\0ä¸í$ÖNoÝCÚd Ûkó€·»ÝIÇBðÀkofhuË*•«&dƬÝ\Ú¤n¹Ë­Ðqe$–.“)+®!e1»q¢¿ZýµÒ93˜áë¾ÃçÏ$¢0CW 2©÷ÍyZ‘”çŠ$¢. ¢7`ƒ•ŠÛЬ5‹qÕ¤k„¼YTAçI(èÜ*a˜.aTB^èá3—U´Çqž¸9_i*ÏŒòë°’ÞÇWƒ³D 2zˆA29ÏÊ£b¹åÉš#§ƒá™ŽÖþéŃg¸0ƒ¥³ÂöV²e/¾[x‘3ò5¶ŠíŸ *ŠÂñÙ€„r!^ÇQîbóêƒü: ×ŸWeЮšn¾âÉ“‚ p}–«+ÂûªP­ß#<åÂÑ_¯gõJR£‡e¸ù(çAPR]aG/}Þ¤(}y©¨¤†ïIœ5ôVÛyì‚;Ÿ…V•’Z«¤S¦ZiœÌ¡ë­¬Å¯åu}[‚+Pxv[Ïî(yŠ™øcÈYÐ`“ ‰/f–#¥ÿ1(TIÖxK–5Íúh<Ë`£™ŽÕ½ÐøÁù¢£|\Ñ|Tz‡C34Gì9÷ ×v=ø™xÒš††B‹=­›Uéhýz¨ÍN—8w#[¾œÈ ÏI·hIP×™ä]`ˆÀáã³Y,„´Z!ö²7å/©ça–ßA#L_k|ñàlºa³”|° 0“eÕo·Q¢óO2MÑÿ0gþœà¢§<‘À$ÆŸ­Ü³FÆÎ¯¿ºÐÊX@FSA…E£KzÛßù£ä¤ÝIA­A †ž6tƒM©ð6ZæØJÏÁ¢.Ãp¡›ZÆW­Ÿ¹[û!³ßY5]}ö`ƒ@Äx W ™ aÇS—^Kj²CiWQ¶ñ2ÜLœ"öóvœÚ·¢ë﹞"ÞÊʼ.¢t3ŸZfÇåkW$åªBUi :k¥L"¾ô–iO+Êy/cI®Oòë• ½«3 )ÿá‡&`U¥Ž­Š0à‚™{ùø{^Tp¦ÿö~Wd1×Á³ÊfãÕë¢Æl}ÙÄR‘)gh.­³cT¹Ú—S°ŒI’»Dç±Ëݵ¢Ï]q^:›N|¢%É„ZBÝÉ™ÏqÑ¿vPå;ôÝ.Õ¿gÚ%Õ¾ M·Ïä”õGÂJçíˆÿ\€ê£ñæ·’°Í•µ>ébõÛì¤JÖ_¸jiÙJ×¹T G ýE™D? òyyguÉò6½ßXîBQ««¤sŸ+j§uuóI: ¢!_~¨q £.ý[˜£Lù<µý Nw«T ž¡ÑÊMJà V˜;ÖáaÝÔšÙ_å†/2sS“•JîdO˜â5ì6+qÞùä?æÖâÊL’›ä…‹úg¡acž£Üߊk{ïÝù+o^Ù¸…É:k¨‹²¤Ò»°g©ó†ÓÙ2=ŽB#AÎ-&êÅþÕßÿ(çú endstream endobj 55 0 obj << /Type /Page /Contents 56 0 R /Resources 54 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 57 0 obj << /D [55 0 R /XYZ 90 720 null] >> endobj 54 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 60 0 obj << /Length 3389 /Filter /FlateDecode >> stream xÚÙŽã¸ñ}¾¢‘'50VDQ'ò”M&ÉÍ"Ó‹ È&mÉnedÉ‘äõôß§.R”-w/fhñ(ɺ«hõÁõPF¹Öa™äùÃîø!’á/”´6±ñA¾{þðÛ?¥êAEa•êáy¿@ò\ý+øó?=n´ÖÁÓ§Ï*øü þüG’àGhþôÝãFOßÿA€°¡ú@7±ÎÓ2(ÿýüןžÝAÒ8~ï¨òÞY•RaEñCV$¡ÒIJ'žzØ7σ ñÒ5÷FÔ<í³O¬€Y(!•[—@*é ÎÚ8îÃNÆnIgù·¨9Kt«"ƒÍª­GKO˜%zFεë^†~öáù§Ðåaª“˜€ž_˜³p“TçA'eFÜIÊ<èz Á‘¦Ãû1ƒ™8 €‡aÀ†Õ%) Ð!±($4Ûó—†Q¾Lsd¼Cs ÊM²3r¿»žwá›Ëf¢ã÷Üñ@±«§uŠÌj–žÒºÉ^Æ Çï¡n_yd‹¯¼ÂšüŠœøcPÜPÈ¦Õ Ùi„}–Pˆ@H4àK_-$bܱl *‡ÓQh¹Þh}¥ pÁÊå+á \7i6`VÎÊ?IóËcšÁ –Q&Ö3 ·­ç| {¾Œ+tPÑN,fB¡¶u›r¢ü0‘Ä¿ˆ Y¹m"q}â¥ç‰Ö‹Ð“Îë²ÙϬÑãDt; æèEfFJÍJ,gxª½uê÷#ªä6¢Ê¯#ªÜ# G•BSV¸›cû*PÇ!t7¢T„ŒGÙžöƒ lmäÅû¬Íï%°š00)¢àL…Z–}–lI‘»áVÌv6N ö¨Üì·ã¤Á­ðì&_²f Þà+žqGC&° 9rÇ;aZ8óKíÛhO±gÜŸçcp 'Ï1? ó°Ù21‘RŽ\0~x¨¡#TwËs(cq‘zaȆÙqHtÅBëm´‘Ê 49—Â%ðÁ·ª­ILŠ g»;²#¦Ô’òæîÀ+¶Žƒ&´Þ 6Ô!ú í׈µ ë´ìžÌ¦õÈêò‚åÁ D‰Ê½rö\¹ ;\ÑD¢üÝ¥¥*^zÉ;°]€U·ÌÄQ² êš™Ö ?qšø‰èbéóü$tÌË%‰ßš…2'H*¹ Ùm`ok c¿Ÿp'ŠÿÌ`ËZ^-Šé½,Ô ÂžÕä‚i‘€­ë])ži¡{âÄqöèC&l‰Pþ)=YH¸`Øì¼(GðpÊùFQ…$]Ì]§›Cg¦ºâþ‰Êk»ûÑü"´Œ!?¡c¼ËÀã< fï,F¯­m= §oNK.˜§Î{Ç%gH¡ÁÁ bv5ëŠ0„óÓ8çŒ8´GªÑc‹4Ø85C´`’ 5Ü%qê<zÏñå†úÈI›-ÖEÎcóVñ¨hl˶\2_ §—Æ™3Á¨ðƒ;W¸ÁÎ*ûH6Ò ÷N¤SS»â¯f•‘]œÓôlÛ(hÛ;vµ—Þ‚A×õ–+3F>½%xðJõdk_l-ž ˆÖX—çíF'«Þ¬«¤ü`ËœØq?ŽË0)A5×#o¬•q±ŽÅ÷Sù…~9®©Û=÷=Ãí#e á³ÅF¤8äç ÉiEøVÞ\qMÎ?³š†óR­U[)Išy"G—’JU#G:ÏtósÞG‘)²äÚŸþ+…,Ð endstream endobj 59 0 obj << /Type /Page /Contents 60 0 R /Resources 58 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 61 0 obj << /D [59 0 R /XYZ 90 720 null] >> endobj 58 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 64 0 obj << /Length 3503 /Filter /FlateDecode >> stream xÚ­ÙnãÈñ}¾ÂÈËR€¥e7›Wò4Ì& vƒÌL€ ÉC[¢lîP¤—¤Æë¿O]}P¢=A0û¨î®®»ª¥nRøS7uzSfÙ®6ey³?½IeøË%­-@lc>½ùþÇ\ݨtW§µºùt\lòéðÏäO?}Þl³,K>¼û¸QÉÇwðïo8b’¿Bóó›­J>¼ÿ£aC%ô€nuVæuRoþýé/oÞ}òˆäZ Uù®J©]‘¦ú¦¨ÌNe&'Œß—Z%Óy¿Ñeò€½4±=w›mž'¿4{DtæÁ¥ÊÊ]ƒ]œ¡=át3ñÀÐw0ôÌÀýFWÉùÔŒíÞv<ôhG{jæ׌nñífkÒ<9ØÙ BóxÞϸù(u÷zÆŽÏr «’¯²„èI”Ùªl§ò”y³§':mˆÏÍò4ìaÊd:Ù®ãæ‰÷Cèaâ!ÛXÁËh‘´}×Xß0Ø1ì÷s;ô|Tf* \žÎMÏ ºg)^XÑ·óã2Ñö¸ò~~€ý”\`†‘Øzåâó/C‘;OÒɆÄê"ùűŸy¹ÝÉ¢V®‚õÄ"ÂŒôiYDšÃ-¯›{;DNä*ѹO =r§•³Zê`m×=ó åÏDèë0´3|Ašµ»>‘tŒ_vp™ZÁßýÆÒK"cﺘèU–ìÑÙ;Úþž‡‰ž­À\«A¥j µ%àÆp(u`ªbIC)p[y5Ó>´wHI;ŠÎÀÐSKBPL^$;Œ¬\÷hñ:cÉÁÝmä‘™(‡4Vì6¨Â¹òû廲J+Úïg'+,óOØh½~ßâLÒñÒŠ¯ Kí‰ÎÃH4µüA¾ÁÀºYGMâÌ29x/>WEðp;>o€thæÕž Nb ødX ¢ãy–M†}±h#Ì~ V%éÈÚ˜õ1H]òMq†tàÐx8š›ñ4q“¸ ß+F<0bkŠ"yÛËep€@`Ï ©Awx“5I¥síÌ-Á&¿ð ÛMÃÿKlnùûä$Vmù"vÃÌ^ÍÒ3wHÆn³õû"¢À¶µ¼ÃálPænSf‚âT;O´¯vÜѵQ¶‹*Ï–BŽ„/Š4y t5°³™öì&EkyfÒoàø "—pø†&aÀ›}õ×C÷–—AŠq×N8I&D:§jrÞ~8!KïˆÝáh$4nàhÈ‹ñÆàóuìó³Rïò2ÏAðæ¿˜E\”eˆ Êþ¾ ]DˬлB•f)JàPÈ ç7ÐŽx³‚UYíêL¯!ÍT™ÃŠ vòäÎ]°œ8=ð÷‘<6k7šd²Õ ÏYþ,•ØžƒŠÕ¤bäÌïe;féys8Ÿ”»ÎDñk”H<¶\0/ë%¥‚Q3$*‹"—rÅŒá¨ãus°GÆBuëÂÛžºô 's QÜ´Ý{ÉTÚQ &¿""‡FÐ"‚;õ¡í½Ä‰mÔÂÎte¦Û}½DNžvÃåÞ²¾áy¼3â|ùÀ/œ$ÍP 7¼›g·9œüÉßM¼ i哜B±ŽRH‡#Þö°âŽ Ä\!f·F# qÜPP¹bkÍ¢tïÀÑvQ´]%bÕNQ$ÑJtMwa ±ÃnÍYÿÝ#“¬„H•âì UV€gägq€ÙË èC‰²Îl´I&°+WÊÝ­GFXQqñ3C“¨•e0¸CVš!¢VÃÈÍSŸ‚­/²·BÈVr’VÒÄk눎¬^zˆxEecáòŒ½¨‰@#K¦ÛÉàKÏÞ}‹ª‘7†yS£Üë2’KÉoœ°>¢¯éž×®lQ7‹ ‚㿌 ¶>ˆ:÷>ZCLÀ:½÷  7Š„‡óèâ ì6q¼Ì.|Hè²Û¢³A 7èÒ6÷¤ðª~˜…|ž—y£´vékj5 -mC!6Üe›AÛS ùl˜à LxèìÕF Á„¥ö$žÕ7‚ÖÞ²ÐZ^ÅRßPøp<š’ËÆæØŒžK‚ÊšÉh)·âd#˜ çiÀ~„œ[b.r|1„ãIœu‰Cç,ËÈ©5Æ$o!^”8ÏG*l .Yƒ9rè›ËC˜Õëòhì÷tß|W+S/­™uQÙžyz´½“xd£ ½tu!ÁÚY+£Ë˜ÛÇÇѳ›Foé'IÓÈ;Ÿ@˜ú‹« s;6öà#sãpÊ{ffˆ9ãâƒO5¶Úä^ô4Ý—1 ¹Ãþ¥Ì;ìpŽ23¶{Mˆ2eG¸íï‘xâSÄ>Ï“‹½µÉÈÀ.Zº\€ÇtÚ¥…œósÍ¡½Z‘è;˜ÔD¦„ äg‡‰IõEJ‚#¯BmØHá'c³Ž -ýÕSÞ? ñ©$ìBK¤SÊfq•—œôââ8Ùʉ”*@¿¹¨)4kÑÏZŠc´s­ÆÕL;*3äØ5Üž=8K4…ˆH÷XP‘P®r¬ÄÞº6;¥óêȃàk¡³¬üS ¬ëzw¥¯çhNQ”ÿ5j@( 5YYóBšoi>u- ×÷”DAwÈý9Ç@ âÊRÏq c\ù‡D‹FæÀ­çNäŸÝŽ77à#wAÔ/i›©\ÂtáRã£ÎØøôæþ¢lŒr*&ж<}u7²54‘,ª;d>òà²2Ò"çŽ\Hñ®+F`)åhîÁ ¡Iy/éGU¥¯«L3ïë®ÃNœ…h¯ºð‰uÌÔÀÀÊMäՒ˸ÊJÙv Ô¡Á;QBÈ…¼•»Q•4®,ªŠV\Wqá’·e¨°QÈÀ=UNäÌ©ŸÚ±¥‚ÌysŠ[F «D ª„à °mN1±w¶.ï¢ÕB,˜Ô\3mqf-{ %,ñ¦\æ!w¾ ¹UÅNCL° îPFò:ùìà èXþøð¹$‡éÁŽ1ywŒâ9XzjØ`’h§/ôÑ @ˆfyY‡!±ÆyDÄ"½(A@:†ug­’·‚ä9`G¡¿eï2«D8½o$´ ë|9Ê*ŒË¤ ã¼±"*ÒˆX"YâàFªÈêÖåá²åO.âaGvù~»HrqaGAª=Hÿ1¼ˆ­é ¥Uîw6U+îwâÜa4òuçU—MÏÓìãî\g€ï$óóYÞÊ,r&Nm`º£pà !ÛÏ>Њâ @.ºÊà¶_ׯŒ'zp8Ø—w@ÚYZ8])ñc˜qQ$±ä×áP¶ä³dh=‰£fîË×µPQ 4N¬ïZ,œv†–’XnBþëÕ·¥"öƒYÁF­ŸfÛuOޢᦅäLÙ Tgƒ–Ðx×UU¨øBN~ø^…²Àå­XöͯyÍÖg¤wDEazý ͼ|ræÂƒ(Ë. ™áˆÊJv²'®`~Õë´¬õÒ(î}žä,¼uºŸ¦«¸þB=’°2@¡÷L¯‘Ø€¶™¿Ô-Wµø½­k¼Ôg-×įwzv’"ÕØ5ç‘'Ù’]z™Ü·þˆÖøÜInÑ~²Î`á ñÂÍcLÎqX*ŽÔgl]!á¥fAZD$»Ô\ÊšNÍxÀÝ¿àpa)_ЯÔ÷aÒQˆr>_ ûx/ø÷ìc±yÆæEa³ýUF?É£ŠK´åVãqÕUWµæÄÛ½×bÒ…µe¼š«ëì^ñ¼ñ¼üë€ê…”¥Þ—š}@U]×+ íjw±ÕQMÍÉŸ¯©â´Ý‡'{ìsq¿Š}ôŽd&O²DÐõ‘X{ß;›ŠÌ~Ñ ?vÁ<Ür2k½¦QûWôòÝ9GGYšÝK™k’Tig»¸.Å„œÏ­Ë.•¢D³o½Å3øêË6Â…»›ÈhâNeV¤+¾êk†¦CówŒkàà#?³øÇU+¯¨Î•kN…Fn„{ î$NÀ—^©k5¢ÿµîEöÑ¿ì*yv'¸ €ÃóPDÎ!ÛTª%zÑÃ1¾dD¤~Ñà¾Þªäq ‹öݬ]Sô› ÿ jù³¨ÙR`ÈY±üg«ªQiMçýHÅb\¯ä§7ix™;*”qIW „ü•â_.Qà 0'ž"}Lë(Õ¼*¤å®ÎUýÍ\;».¨4z‚S¢¨SE•Tµ¨¤®à tmój¾_ïTj\±âº ™®U†ùµÒÔ»¢ªÊ ÎzWYºßa‹€Ê\jÞÄŒã°ûÑžHÌŠ¤oÄš‚pÞ;B{ôÈ‹\Ü¿•ÑÛ´Ý«ÿõÏTpöH*ŽÛ¶3južü™²Í2¹]}G@ÞäŠs'Ì‹óôË,˜h~cÝ|”w'úmQô²›«'›åÚ'޹¢Ü´rÐ)7+‚ðo›ž oiþ'¿¹¸±}wvÎ"§_y¡.±S#—«ÅõåsýàŸ ¼sä_=<óøëUȬâj'åðÐnBpFåØ GT]ö cüR~Ëï”r¼Dÿ0èMêxêVø{3ÿ#,·¥ÏƒÈSÄowT©ß þÒÿ#s endstream endobj 63 0 obj << /Type /Page /Contents 64 0 R /Resources 62 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 65 0 obj << /D [63 0 R /XYZ 90 720 null] >> endobj 62 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 68 0 obj << /Length 3258 /Filter /FlateDecode >> stream xÚ…ZKãÆ¾ï¯˜[4ÀHáû‘›¬ F¯FœCK¤4ôJ¤LR™Ÿúªª›MгÆÃ~TWWW×»>ô>”ÁCÇ»2Éó‡ÃåC Ã_>„ÚÚÄÖùþó‡¿þ†a°+ƒ2|ø|œ!ù\ýgóãO¿˜Pžòa ªêäÛv£môs>È›€/®Æ²’@Yx²"Š&QEwÛ4H7PÞ›?`0H\=ÓØ› §ælã0ÛûeU˜1„¯»ÉôÁ´˜âÃP÷Ƽ& =X`8ä­CÜw}‘9«:*çfÏ÷ÉÜÄDwªi²—^£Ôý’öðåBFH,I{ÖNãøNÂÙqÛñ÷¬¯Ì%c ©XvÁ>&Ot•öc#¶@ð ²:,ÿ²v`\aRŠÇ¢¯¸(jø*‰¾i-$¼cR(d¨žãf1}^¬“keJ!óXÐ v¡'+! Ê Z„uW¶!uiƱ®à¼óâwÇYy+Œãwm@$†˜!j»)wÁ/Q<;/&–þƧ»2Lʹ™0j&¾;X7 ÓÍR™“_E[°Çžq[µNŠx©€õÁ¤‘ ¸ª ÂßH¡ks±œgHä^ÛÚµLÊ»¶ày)ÍIœ±:´wŸ„©¥šZ#Èr{¢BS¾Aß³’lCEb ˜[›Ï/ªŸÀÄ{Þœ¾ ‚½3Qi\±ÐæêÝàªbã[O‹†“Í‹ »„ÝXÂŽV¢$/¬ q#ôt Uì–u5Ù."!šÇP{“Bçkã¢$a÷Òw—IRl,%ñFœ/:À Ó1a£w÷€… aÇ’µµ4HsG;d´ÅQI?ÎW4Ú·ñ5òQã#–g:ò½ý‰Êœå_Ù½,Hà| IBŸÔ䶺¢þz…”˜¦ß$£¯àÑ̬(¾±€ß‚0±(¬©Ä¼YªncQ²pÌÔû­ Ò±SiÁýO‚2…Õ“j¢çTB΢绨HÓ¹hË($!‚]’ì%ÑpÖ¡t\KãBä·cq¬š£ÇRL7í×f—Ï´_?ËX¸Ñ©®—ÑwtMuÖoÕóe>e@]ÇoD#Ðüœï}ŠåyO Ÿ“<»÷¯¼µ•“`„/¾Q„Ï‹l N‘Ç›ïlø%†ÜÐå:J‡#òWµ`€laxù!Å‹û2fÒQíçLv2> ]³Ú‘ò„ûB6Ó²ßFYâñSà?F—!­Œ:+¥“ýV…§iVWú²¹éšŠqæª`Y,ªÄñêY ߪ¤'ft¤P}V¤#ÀE˜w8Og…¬AéTÖ'S½ /m ªJ7mdyâaæRª ÁdèVŽÇ¢[5Inéö=‘¦÷ü5¬mäØ*õ<9:÷jª@|õÑ:Xï,wÇ›±9¢)NVc>vû‹îáà][5šëœÜäÚA𰉮>i!jåº8ÁÐ<ä>hsª¾(ÖΪ?§/Òõ‹H±ä~l”q 5¶Q¸ 㲘Û0PkûQ24)€DqJ‡G‰0Š½Â †ûú]ËÅZ÷Cçë¬0¢í„€“0bÊ;ºœ;€˜´R×Gh“z}íŠqäÌ5¥Âù§ãû‘çmT¿¸ÇéóT·%m&Œ2ˆñÒj©‘Ï]=šÆ\,€ŽB‘.qPD^ù,µÎ»¨¼ëm‰Tk°~9@ MQàGä`… uÖ…”Øóµ‘B튽3®ø€yinÞSÎ(¶Äðß…Ï£¤nâQÒYÑÝû,;HUÏ[0CaÕ &”.üWÙâÈ’ÅÛap¥ij7ñsÝP[ô¹¥ATûy“ÜY_/_U!ø:áD 9hœH ‘YÉrêþÐ &Å:Ý"¦!qÛ¥ò§’ËÔ6Ê I|†DZPl™`í¨½\„}4²2ÖØG)Ø5jl)œ(Rž{ð…p×Yì¦Ç^Gl½b¯¶g+j•ØfËÍ` ÛÒ¢ÓN…j§>Åý ²€×ŠJ©J”±'N‚ï[ÍNs\а ‘‚Š4ÈÄïÐ"hÁI²xWŒ)Åæb™…úd¤.‹¾EzµE\®á”vsñØ‹ý¯ßG{tø=É]5W‹W,вœ¬˜ÁFw°´“‚HÌØ\'k%6¢¯"Ùî AÛàŠá’N¨‰~ž«¤v7©Iè‚1´=U¬4šTšfq)DQxVÏ™ $îßÕâE\—‚Q­ø=y°99f,ßbÆB¤ùò6qÕÛ(¬¤Ùc¤²å·r…!¼Áуltð¹™Å‰O6‹¯ßÖl3—°)ì’’ìRÒ.%¯“ñNIÃ^"+½à2+׃ˬœ4¥­oQYy÷š\¸\K¢=?îXœ²“JšÝÃiž8òŽ´"Ɔø¤ Óã¹£ÕÚc€L9jî=c¢#¹i.osSú/Òy]aÎgTÍÈöþÀùj\5S¦Ï±H˜p¶Sš`ä³b&1|^ã~Pj‘>W22YµÙ#’ HyÙ`Î#··¬ µ‡ÑëÚ[©n»œbŸ0Xª¿‘ÃÅE¤I†}oéÜIhäõ¥“Ʋ5¨bW|B»šj‡‘½ÐÈ¿À»n%¿ ˜¦xËžyuz‘¡I-¸–•ªpÅ…W´.1 ‡âfÅîf~Œ/`„q-h:…EGFø¹‚ºü€P¸ç=nK ­™YŒŠR“Ålm s£¦éÔtÜá 6(=ªÝļ³åŒ"/*ªb$VUu¥È?,ÛÙŸBýmŠJ endstream endobj 67 0 obj << /Type /Page /Contents 68 0 R /Resources 66 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 69 0 obj << /D [67 0 R /XYZ 90 720 null] >> endobj 66 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 72 0 obj << /Length 3378 /Filter /FlateDecode >> stream xÚ­ZÝs£8Ÿ¿"uO¤*ö > Ô>9Ž3ñ­ÇÎ9dgRw÷@lS‹Á x³ùﯿ²Cföá*UFj5­V«û×-uaߺˆì‹Àu‡‘ëý'[È¿RÒÇÀd¹Ž?}¾õÕ…²‡‘©‹x{"$ÞüÛú²x¼¸®kͧ—Êz˜ÂÏ )žuÍÇë˲泉0aCYÈ´Öã:~d)uùßøŸŸ¦q«‰ï8?ÓY~¦¬Rj8²mçbzCåz>©<Û^¼À³’âÒ ­7î@™Ð*+ЬÉÊ‚‰¥p6»¬Æ–oÕ)ê¿îXôÀ^¤±|#@  þ¼ôGV’gB‡)èy,Òb {ݽ8+^R~½sè’&¥~S3üŸd†KPZÉñ‘V–åV•½ìHwI9rÊlMœÀ y&¡¿.yþ”íÌD$¸ÐÌœƒ, mîwêãú̹“ys˜„ý„Èfóg2ý©U}—È:`Ïzkv,ß“­ƒ‡Z訓ë;`™²Ña/HvyS…µE&}©Ú…!—Ba€„m•ÊKu¹%ÎWüI*ßduS¡¼ç#ÎJëAzýV³Ïï¹ÿºËÖøâ®oq+!øÉþ§´Kâ +0ð¬U aýèrÏ9ˆ£!h´±U‹#"$éâW‚‡—?Ь¯­ ?ÅBZr°K'ÑÁ˜Bš%±c8²^Ò"­Ê£hO3”îU68]èˆú|ÔHNʺˆ{¥<õþ@û5ÛH‹A1ƒ=Ú0ìÛ ÝdÚ …OFÆÙð{ä‚ 0< F˜´KŠŒo­Ü”J€ÃU›J2Òi­u*z±¾,êLÈ ÷Þed®¤ÅVs}Z©Èp#Œ"5²2ÈÄ|ǃ¼rnFˆ¸„ °£ôùySó&ï&]·†Îdê^V/êÔ„ŸÊatT vtÃ%ä9áá ª(´;é»-A¦÷»H¯â`pƒÔëT=ìy´ÉöB¦’G(èi®"suN6ŸI_™ÙXÔ©@|ÍrѢ͢H®!ÌsL¼(|8êCÆ>Óç0úÜËG h$'v…¢Ûé ´,®x€a†Û'Ȇ‘ÿØÊ³ž©[æT”Kq#X M*í7 x'Äå#WU>·…Æ^J}B/‹µ<˜±÷`>Mäø1qâ#H`×L8(WâPÂ# mxž;Rk§ëÍNžÖÀ0“aïN`VAÈ=ÄÄP¼:ޱ Y‡Ð³öëC÷ê:;{©èüLGøV ŒONdwhçDïÒ^%9±+ã+Æ1C'W’Tò3k„/~@·Ï·¾cÞÑ9Ž=ù~:£ªÿž“{<8#m™Žrs.LŒµô†­r>sýÀV{â+.NÛ{œÿôèÊ6”Fy0S2¤3Xgh{ï W,º·ež—„§ÚÙ\[dQ2(F‚­Ú+4|KŸƒéÒ„'«ù2@Æ0X1IO%G> œÆF$%ÁÚÛíw¦Ž>451Äú¼1‡¢S€?j‹G‡®% wù{½ù_¹Å»E®Z6¤ÌQUË ÕÙò,¦ä³*¥l8R„A—Š lœáö…%<Øw‚ôÿW`*‹`ØîüÍu"#:‘ŽC%ù¿;I:æÖ9QÄ3=5•%Ê¡Ë{¼IH|6DuŇmÐ{(·”/x“+©Î8»º€\öGõ‡gœ¸œ 2b.À;›zÇ-B™°·ã¹,¯¹WŠ´xí“rÇäY—ÍÎ8Qà8eýT‹§«Ñ—*ÙË ¯\PcÓ¸®ƒŸÁÇu‡”ƒŽûQ8ãiRÛ’O{‚ËåþÀEÖ3ݤÁ °½$ivL©õÝ¿ ÉWR©QT 07’#-˜pÀñÚñ„düÎ-º–¾Þguûz[Ïüœ÷ŸÊ¸À¼1¼Ä7n²®"Iõmœÿ"<_âá/2îÜ ,Aæ®hOÐB|ï­÷;W½’¬3ž¶åŒþXÒ¾\¥=÷|Nù(F£ÏÆ«ñ |B¢oÍôàÉ7deÝ Ý³nWSy}y˔ɀI¾L¯˜ßMWÂÃÒ<\Ú‡È ËUÊãZã'>wÝ¢¼¥|ã†~Œ*ã!NõÆ5©ìZOWL—glÓï1)3ýž>—ű^Ò \?1ÿøþ~>ëu²É˜?­ãWôhdÍǤì7>fàÅ*JûŽê¶æº™÷ÛÝtÁ­%Z„_œa‘%Âb\Äo*†Rgòæ·Õ,¦%/¾0–ˆÉòþ©WãÕìËj0 ­»åü†–þÀýñâæ³X»¬5ïQ 6j<›{`ݯxàç·ÙÍ”‰¬¼Þ£·¡¯ìw5 Båýíº,³‚…úÎ/„É… <ÛŽgtš ¾Íâ»åcŒ¸»’Ћñ9^á×ÙâæŠ›h»‰ºßñ¾b%ÿqÃH¾”ÁÙWp!ÚÁ«¾]™-&óÇ›Ù⋸ìõcÌÅ2Ö® Úú&:µönòjßœ‚ÌÕЦ!®Ÿ_§«~‡¾nò»ëÿÓyÀ;°·PŠëúx³=<ð8åJ˜™õÄo&óñJÓ•õ¸º_’·ù^4¦ .D¯ï>üŠîí²7D…6ö[àÂοǬ6rÚH½—Š1áãëx1™2öoE¨t'L$Ú·Ñ{ú}Z>ùîW6¿án«§{°$9ȇ0qp`M™Jqz‹?„#ñì·é<¡âøß?Îcr½Ç¯Œ!®’¥`c²8é©…È uçsn,¦öàö1sÑF1Fý6›ˆŸ÷jÊ[<“ÿ6Zvÿx4Y®VÓI<[.†ú‹þߎ endstream endobj 71 0 obj << /Type /Page /Contents 72 0 R /Resources 70 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 73 0 obj << /D [71 0 R /XYZ 90 720 null] >> endobj 70 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 76 0 obj << /Length 836 /Filter /FlateDecode >> stream xÚ…UI¯›0¾çWp4RàaÖp„`‚+b§Ø$ŠÚžZõRõÿ_;‹É{QSU‘2«Çß,d”ÁOFm5E‘¶eÓDßï² þµ“KÀ#ùèÒûÝÛXÉHfi›µ2ò?Ÿ‚ø_ÄɬqR…˜•‹¥p þÔ”âìÚlj³>'d¤@'®I^äU+dóŸvÊ?Tyþ?¬èò°iYgeTÊTeEˆeÆI]gB›8)óƒ0–)¢º*ãYZMȈÅ­ŸW½¨ýiwÁ}ò¨©Äd纲gÙr‡}œ²~RïêK|€ˆK|(„¿ºì×m‚’åõAœ;t½£ÐŠ3D°ƒƒØ™o˜:Š”ô _4jõŠcàÕÄÌlXøæ;+;ÇôBøÎÚûm€†WȺÞb‰¯jÕ-EÏÞÄϺëçÀSËüݮ̌ñ£U„Ç~¹cØ/Bjsœ×Z~TCÔŸ”!ŒÝ¼…Ìᘨ£FsR9ÆÑŽ{f]ôh㣧ÂÍßœ20¸&€C(íÃ÷ç?>cª •¾¹XqÒjÓõz¦)ƒ) Ìê_îо÷Ö¡âkVeŠ…ªÐyŒõÛÉsòªdÚã#©ð’Ð.ägësQ.+þuÁŠÓ,‹XûmŒøM ¨*ë xš–Öq]8ŠzÄÐmk{RåÕñÝÚ„àh  ”ç˜ð2‘õ~!×üéEê ¹c› G:&#ìn¢í°.*8L±[¯PCïð^Aï¹Ê ê6lYaùí½'º/¤‰%Þ#päÃÉaB£¿Ñ&ì!÷|B]©Úì§GVºõ8½B÷Ø`0.°IìFá²À>o,RM¸9 ØN+ÖŽ&âª]èÅÙ™³R,\¿sŸÁöõC"äô…{ZÔ¥¼MÉ2-Ê:Ç/Sû¾Î2ø„åMzh«’Â(ƒpšŠáåe·œ‹Ýf‡ý0h¯aKl_Î?!ܹš endstream endobj 75 0 obj << /Type /Page /Contents 76 0 R /Resources 74 0 R /MediaBox [0 0 612 792] /Parent 78 0 R >> endobj 77 0 obj << /D [75 0 R /XYZ 90 720 null] >> endobj 74 0 obj << /Font << /F51 9 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 81 0 obj << /Length 2045 /Filter /FlateDecode >> stream xÚµXmoã¸þ¾¿"í—•D'êŲº‡¼AvãC.ÄÎA¯@i›¶…È¢!Éëó¿ï¼Q–½º½E "‡Ãá3Ãy£ÕUê* ®Ò(ò³8M¯ÛwßÞ)ÝÇM—åãìÝŸu¥? 2u5[ ™-ÿá}~|ÜDQä=ÜMÊ›ÞÁ¿g¤ÄÞ _>n”÷0¹&(™õ&ŒÂ$óT4øçìçww³I††Y¾›†W*ö£x Øá(öU'öÞ"åKšx "±<ïvÅ‘‡³Á…ÚÈtÅQª-Ñ‘Ÿm~E‹„}Å”GCg ɱ®I„ÞÖ¨ê¥QÁì*óU8Šæd–I#ï8GžÝódi¾â”  Öñ{%‰\Ëçü×Õq0мk O—@Zö> ÂWÔ0%—ocYä?x2N¬€k6 OhëÊè†ÍÖ0…Ày¶®‘˜ÏµÞý€ŒØîåCPžq[Á´#_\£µÈ<‘¯’€]î vˆW±I–®gkJÐ1 2¦ú-†rÌé…K«Ê¦ÐHꀗ$ëJICÝð„á¨Ø|%(`>âjá,ñHzƒ.@Ø7"X;Œ <”N)ׯÜÄQ Þw†wC ¸ÇKô¼ØÁDZ‚KPG¦£õè6ošq®™§2ËÜ™¿©ÈQð:šÜ–Ì€³r锨XÜŒ»0äi@.FAz¿I`QÎ5ÎÁ X,Éj9Ûªp.ˆì{rAS‰q \ieÒmœi<$[fÈ+¶"ë–O>2í³Ã\žÀŒâ”‰œK1åí° ­ÊšøAåÓÑ@²8†ó‡92Î3º jÐr‡.Êùâ.eÄN¶ lÓM£hÛax°²E2¹^{O°PÚ&_—jìŶ¢Þ±n“ coÒ0·Ü/k½2â‚,Àág<èy¨îM«oÇÃNZmqS&›GE‘®«†i˜ðkœXš±s¢GU Ùó[ âBÆÍ@(„ª=Á” œ‘¡ûéx-/,¥ªS2<:`â! è¿/Š6×°ƒw J¤W˜÷ ÆÎ‡¾P£X GrV«`8bm\bË 7¤l±äÕîÂDL%¸RíôÅ©ç²vË‚J‡þ(S`B(í+‰Ÿ†Pô˜cE5©Ð ÖNé=‚ãØOÒdô=¹#4Š…¡È%ªH WGºf’$ûœkÆ7éeù{@]7ݰIœñcEv+x¾ϞFC?H¡*ž] æUŒaLÛ–sŠÏ* SÀ ‡1jŽü4ƒðŽq,qlK83 ÔIFˆ¿ëü«£lZ¦yaö¾æi©·²@^Aþ̫ܬx˜/­P¼yZ“ïÒšZ Gª}/ðãa0"°·vW¹ÞÈ.̶·˜¦xúãÑèê§ÅUùÉ0HäöN¨ ½o6¶¿=ÿF¶B2ÁB%Éo“×gm„ÈåGµ]5¨ŸxzÄ2†ª8ÀT7P©vMý1]Zak—ùêxν/©Œœ]–¤Ý®¢íu©8x0uív~6¥©°Dàäi?ÇâÐsþ¸#Õ‚)'ì½ÞqƒùñâÀO­M¦b¡ƒÃ.5\±‘ÉaO¯Þ_MUSÞB¶ðpײ\<Åù\‚PíÏ=9.u¡g9Ôw€þ 78ݬ%//Ànì®°Ë8ä…ÜÄ\xöµYí‹ë>ÓÀ!Ìó÷ÉìþËËŒ'ãÇW¡ŽŸŸÇ³×N4¸»Ûa¾šKXùvWäôŠBslíÝsü/wÏ·÷pÀøãäa2{=·ý§Éìñn:•É—gÁ&^6~žMn_ÆB~zy~ú2½ƒ®àʼ©1=Ž{†€SàŸ¹q×7$H¾­u¾¸4΋ú⮹ßzu¡‹U­Ûl´Ë•YH—çIªÏñÿ…ÅnÞ]«;æÂ1åâs%EäPåÍEÚÿ^ÈöXþÀ"rR.|&gð&jõ€(4‹ /´ÏF\cãtä1?J¥_ÆϖÒ_ˆR`Û¬ÝÛ„I[ðÀÖ»:tžAÃnk…SÍú©·6 “ZÅ3C?êÒ-?‹\³( ˜ áêl7Oè=L¯š7>s>}y}G ®á-¿e‘œQqÉV}hêö™G‘g‹k~6ær> endobj 82 0 obj << /D [80 0 R /XYZ 90 720 null] >> endobj 79 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F67 85 0 R /F31 44 0 R >> /ProcSet [ /PDF /Text ] >> endobj 88 0 obj << /Length 3376 /Filter /FlateDecode >> stream xÚ…ZYsÛF~÷¯Pí‹¡* ÷¾9òZqb[)K›uÕfF$D"Z‘ýö5ƒ Ùå*qnt÷ôñuã³þÅgUtV$IX¥Eq¶Ú½ˆdøË‹XZ—°âÒ_òÓÝ‹Wo³ø,ŽÂ*ªâ³»‡Ù!wëÿ?7£é‡§óË$I‚þ¯ë~w®Šàëy4õùe<¾yê u¿ž«2¨Û~ v8Pw8bÎ/•*¢4ˆÓóÿÝýòâ_w޶L©QKNÉ/ÔY\„*ÎR!?/Ó0NÒLÈ F˜‰"c&Š4¸&ºz¢0‰…—Ç—¸ž¾©¿â°cû°=ƒ„ ĪÊ0ºè£N<øqœXðBÐ#wú§7M§ÛO²„F¡mŽå6ük¶5/º¶çö;úAþˆ=Xt剻xýtoıw ßÒ06B‰Ö~@ytýÒØ¬#¯qÆYļ6@cZÀr$»ëj½‡;†SÚf Ï/Kã|4-Êá)†› ®=¬pvËÕÝš4·†Ã+mš^hZ‰zÀEÈÕº–½÷ÌüŒ·œxsâ*TðÎE-‚ÛÂ8¸…}À]rgGj^ñö¼“9 \4&,.P¾  ÞÚ–—jþÙ5ãhD&pÌôü‹¦4ô»ÞÈé úI¤àƒ"–6V,å2wèKšåbé*ñæÓH V[æ¡›Vô1¸Ñ<‹H5î"åv’‚âÀ#’Ô°î L§ ²GUì(ú–5‘/q~Òí‘5È}J«žÈD©àrGùLÏ¿îkížÏûÚŒfÖ|ãÃø>·µ0+Y`-ûµUß­jûE#ÒÀCâüQ 'åàu*ö:wD}’{ДåÁŸ–¤•á9‰–Žç5Y_‘op h"ðõÖÉ:Äd’úÆ„[¾‚÷â‰{0A8h£;Þ@6Š_D…ʈƒƒuÏ;2&ñ–¸*K=ÝÊw·,¶KDz'<2Ú~€ëNâŠüþF¦l¸ó³îPz‹tÑ*ùÕüƒ 4݆;,¹Í ¾D>ƒ0ÐbqÎúšßa¨dšFÁí–\¼±žvx*g­ßÈuE—0´M½ä®Éx;¶¨{rl´yÓÈØÚžì‘¶a½öÍõ{îüeÀ1YüY¯ØqÓ17CcÝ”˜ïõ QѶdx¸ý½î6¤úœó}› £Z÷ÆÇûŽÄ:œÍ?¨µqÝI\@“b¿^÷û¶¶È$Í=¡5]±Áä¹ÇŽ&—Ëí£Èòû%Á5¦p)Dͪ=¬iᆽe“ ò¾þút^¦àM—øÑâzÐr?ÔVÕ2\ðÌ:hÍOš‰Ã)»7$ï›õêó)ù~S[§…#¯»µ¿Ž¬Ëy{9SMÏ~ßï'eúæSÓ“é®Q üª÷-IîyWómî+®ª˜[ì:¡ADýG'<@ÆM–‘f1côˆŽav޳hîM ?Y:)£š:òA«¥óÐCOjæäÓÊ b"Ÿu277èóÞ£ÀòÂéµñ'çÏóÜšGšøàcprò8ÐÙànðšˆì ‰ØÞr4(›çžkyâ*âÉSã𢇦0š¥ 3‰‘^ –PH³#Ÿ =TÓxQ"•›‡…}'~;m÷»8Ð#/Ò{èÅ÷7öÞõÊ4VV¸/yà ÀïYn“ÜCj°ê¶i]Ôìåìk¨l"ê—Ì]#šÔõ;tk(y•àäß LÓÝ BÑÐ9õÀ“eá-(D©ŽK„ÍüQïT†,£ÅÔÙF"(›Hƒz·á]ï>½»:߇|øU™š'ÀþÒa4KŒ[îc>•G‡ØÁýÄÁèLÌá,ީʪàvÖrdO<‡öŽ¿àÆIŠï0Ë=óÜ9èÜhS·²Ó‹u+¶‡š'<“•¥‚÷÷(ž¾Nƒz×£YÑŽò‹~X¼x“=aûÈ!EÙQFƒ1¤ÊÐfÍ–ìû°ÙÚ¾t% P¦qŽùåÈ“fÏËmB1)<Ì¢BM,w‚O8„:êc.$‡¡%)Z/ðïé*¥Ê­DBL˜o37IéFÔÍA²‰‘wøà„àl™ÖbMòGG?´ë×h%+Ž**`ØR©®áh«éþ±iyÆöøêpŒ '…7ÎccIop‚ì 6~æ.ÀŽ5Ãðòy+œ¿Étð/x>at x9O£tÎݶHq]ï›eû…>k`§[<Ûƒ™ùµ³×!}ûP·¢÷¶Î”XÇØpN3c³®àvgfä6…ŠfãH¤\’D€jÆÉ©$~=¤ Ç8+‰ðf¶ð—3Ž“š0¤xKc¶ze'ˆqB³Æàš t•Ÿ½•EW˜?D7)#ßtph¢nô|| 7â~C—óS^¤Ó"¸¯¥â2–ˆteNȇ&˜–œâÈZÒ™´˜”Æû¸ÀÅóI-¹©) hÉ´¥vúoqRhyÝ ôå²%{Í›ötQ†;”ï H @ƒT­öÎçã=+IôYaPZÃ(ëÖìÝzNuñàž ¾S²Äšì¿Ûº=ºÌD‰ö¦Á¸ŸjëSÛ§'3šƒ0ÖkJ-žÅå #‰ë¹ÂU:®’²<Ñ\\ÔÒ²VmÏÎcÍ}$€«äʯ’ÇYVE•ƒ$ð[ÿXª¤ga¡ %+î—x}‘Bv'ŸØõƒ«^øJ©Â´,«ï}¤ «,OeŃ^5-'5Uæ+WR–_£l£á.Ç ´‹’G*~Äèû–­¨£*ç—½¢»ÉK¹›¼ \]¢M{Š"àZ /äP7̰îâ”­Âp9õÀØ¡¢pÕs³þ»œ.iqùÌ…É3ŠZ¶9ÏAMìÌýþÓó ×K´6ˆè(Ë©*-ŽD8°&„¢‚wö%¦ß¸"*W¦ñëRŸƒé†y® [`ç¤É‰øïk• ©ÓeUž>­Xý‡¹“§hø nù±¶žùþøÕ+V*,Ê¢:SYbùé &`Ú{úrë.ý…ü|7·±“É׳ÿç«Wú¦Òa?lŽ©QYfqRQsòçÖ-P334¢ˆçÔX@ª' (^pØénzM‘êHÂA¿sø$ ,´0Û8z/ £ŽÞ*'M%gI¨"2U*.¬§·M ÷š ¥b„lQ‘Q­Þº(w!㣧Р€\Õ¢$ÖᇠŒ²*ünà嬰æ§y79X+5µÔѬyQNì,¬˜Y˜ÌßÁ‰zë ÕvÅi©- &yr ê3ï94+.­`Â÷~*°öR~8vu,$âê];¾ÿ¦a’æÊ¾ÄaYeÏ^àjD0Ëï¶qƪTý¸¬,fFɳ…`)SÏ*Ò‰W‘¦J‹(£åì7ʯZŠ6û‘wi®$¶n‘LZ†*Fµóƒá× ÙbŸÀüÊX¸ä|®\¶ÇH–bF”ËÃ$Jû±¥‚JÇÁÕV“ÛmdÑ5qÞɬ»©(çЭîœy´q8˜þ?P•¼P³d˜Eålïí¶,?Æ~¨Ÿ¼ÐJúÆŒ@ãÎunŸì]J.k˜—ØßhF0|0'ÅŸyNЏnoþ«æ¾GNõU´ˆ‘œÄËÝi\%ùôêÖ£z££—& ¶ìð\}­nyù#$sµ=žÕfÔÏKñ¿§7'0.gé{)Ñ_xz›Y•XTi¦©-Þ¶òbTå6Q/ÕôT{?-èŒ8,“ùC7.~P›qê¿v ÷„]rOÔ­|÷lø@!æ[W!+Û†¤aò+T¨Î–1%NLoøƒ,¥Ÿÿ$ƒƒptSØ›U4뎇¸žïµ6ÓAŽÞ¦*®gŸCI‰—4†IØ„ÚxÈw³ø$l†µD­¿8ûdÏ„HêÿËCIí endstream endobj 87 0 obj << /Type /Page /Contents 88 0 R /Resources 86 0 R /MediaBox [0 0 612 792] /Parent 78 0 R /Annots [ 91 0 R ] >> endobj 91 0 obj << /Type /Annot /Border [0 0 0] /Rect [122.7879 254.3131 254.5137 264.3131] /Subtype /Link /A << /S /URI /URI (http://www.geomview.org) >> >> endobj 89 0 obj << /D [87 0 R /XYZ 90 720 null] >> endobj 90 0 obj << /D [87 0 R /XYZ 90 720 null] >> endobj 92 0 obj << /D [87 0 R /XYZ 90 213.3708 null] >> endobj 86 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 95 0 obj << /Length 764 /Filter /FlateDecode >> stream xÚ…UÛn›@}÷W¸o‹(Ër}mÚDª5’Ý‹”䨨Y ‚%ÄêÏw.‹ClKQ¤°ìœ=çÌ0–sþä<óç‰R^&É|UÍ|»ý<“våÂB¾,gŸ¯"9—¾—ù™œ/7ï’,×wbÑ;R4㉨[S¬W)%na·ÌͦnaQ9®@²0…Œœ‡å÷Ù·åáÞ(>b†SjI0—‰È(´Ôâ4ô¤ #K y)yà•Dâ¶>¹@­êɱBð H=.¢,×E]9 îEá• ŽúJH/ãE‡›O­ûr[ø‡Pà‘ƒ4BïVºAg ŽÿãØ ÔU£'¡|/kŽ·ý[žÚ>!¤bÏ/¥ÛÒ¾¶#Óýd& ‡~íô«[âEÏxÞ^V7.:Ò¥òdä³ô¢ÍF[€E¡èö¡Œ•ç¸)œ[pÝù.}ïËÀ¤&/Ñ轓*q‡á¡‘A4Šé8#©Íì0ê_yç ?RÔ%fÞ#ŸW£»¹÷#ÿr¿´}/¨d=»°í‡æ_ 9ªÛ‘𘄛‚Zö7€ãäœgq& ¢û¢ÑìzW½w:!$ hùíFΞ®®±lý‡|^טs (H’hs˜lŒ~…ÁgMUZ×· Ó(NtÜK¨üLimžðÛÄM¾ú¹àå_~ ™_óv JHã÷ñ¯½a Q,¸¸EF,.Vè ü­™”T×c»Nµ äѶ8‚Ø`ꊎ£`E=é³bó~ý±/ºèÀ¹–“Å@0ﻂ—,mKÀE6ÀœªÌY695–! ”( bq夡õ£´¨ÃWhóššø™¼òÒ<Ñ(úÄ9pþh2Â,ñ2b_y¡J$Ž>˜VžŒÇÎÏŒïÓ„hÐÝeÍBiH=bÙl­°öÐlM¾µ2ÀÕ“ù-S/‹³÷,Ï ñ÷ËÓ„Èò‚jë†Á˜eZcü¥¡_žõh»¡¡XvÞH÷?SǬš endstream endobj 94 0 obj << /Type /Page /Contents 95 0 R /Resources 93 0 R /MediaBox [0 0 612 792] /Parent 78 0 R /Annots [ 98 0 R ] >> endobj 98 0 obj << /Type /Annot /Border [0 0 0] /Rect [402.2107 600.7098 518.9697 611.6189] /Subtype /Link /A << /S /GoTo /D (Contributing) >> >> endobj 96 0 obj << /D [94 0 R /XYZ 90 720 null] >> endobj 97 0 obj << /D [94 0 R /XYZ 90 720 null] >> endobj 93 0 obj << /Font << /F51 9 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 102 0 obj << /Length 605 /Filter /FlateDecode >> stream xÚ…TMo›@½ûWpc‘e–åëZ)MÕS¤rkzÀ6¶QÖläßùXlDZE2›™ÇÌ{oŸ ^Œà•±—'ITš<÷Vï‹Ø•ÿ-ÀBD„·ïÕâÛ<ˆ£2.Á«6†Të?ê§ t¡¦ L£FKÏD½ö(ÛÙ#>ºU#Í7HÌKcß«S‹¬ƒš¨„Úd‰V«_‹çêB)Õú+ÒùÌ:×䑆Ô8ÖYa"\•άq±Îk|¾öHy…rž])#X( ]$yï :§‹(F¼ ÚÑÈqʵäÇZ þŬµâ/-Ú0бPµTVÔ&x¡–Ôíê±µõ2e7‚wâ%½öƒée ¨QúÃy¿ÇR½Ü;J^œh…ígŽØØ6²›# =ûOØÖ±ª»«œ…¢¤’ÒXôßÌÃ<ø7÷íGAhŒqa.jJɸ³Ž7•òÓŽ2lj‘8Ÿ.h [µj:Zììãæ¢=øJ?8Ût&wöl I²(Îu‚r2ÌKiXÎË3bB1$<µÍÄÐPCº¸`%[¿Ù3£µ:`®s‘m´d®³b9Ïè> endobj 103 0 obj << /D [101 0 R /XYZ 90 720 null] >> endobj 104 0 obj << /D [101 0 R /XYZ 90 720 null] >> endobj 100 0 obj << /Font << /F51 9 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 107 0 obj << /Length 2579 /Filter /FlateDecode >> stream xÚ•Ë’ã¶ñ¾_17SU#…}ó:k׺Êå”3—TœF„DfùAjùúô ¤áxkkFw£ßÝ“ÜÅð—ÜUñ]™e»J•åÝ¡ÿËö—‰¬¶± A>>|øÛOyr—Ä»*®’»‡ã’‡úßÑ>o’h6›mÙÍ6˲(ù~³UJE¿=mÒ}dìS ð¼Ù¦•Šã()7ÿyøåçOÍ<ú¯9àñÌpi^DÏGw"âcof+·Úî„k7B ðu'e鮃ŸðÜâþI.›´òz8&Ý  J"ÉvI³$ã€g³;Ðs#Ò½µ¼S›Y·ÝÄôÔ  > ñ†7µЬmÆ*(üHûwÊhÂ%ï™úº8Áó^„€”ëd¥LÔh«bkK4BLžg{ô21Ä2|á¥úZ2I¦#ÁÑ è©4`àQÅÀ÷È¿ã°Ûl‹"_3(† b@>Ѝajá3=ˆµà­‘IÂó¸ÈÅò]| ‘\³*ïs‰îY×87»9ƒ¬æUk 8!Éʈ‰ƒ·!8V7VÑáÆj`gnL7wD'Qàß ˆàÅ{ñCƒrHU4µý¹3¿v2pì| 7ÐÝô2ÉuÃø©kâ-Í8˜«`«»qTO°Ñ gl6$+WÀ³ a·ÝÂu4ÄK示õÏ d»ª8”Ï6³è3úJžE´\Ôˆv:ûˆ‚{Å¢´bUµ·ÔƒmÛAmæ)†úÕŒæiH´¥gÏ(ÄW>&ó?âDa03üym¯çé–Q \ÂÁs‹öynëUâ`¢–(óÃÐ|ŽüKL¿ “ö>¤ŠÉ-â›In÷|Cü—Ö¯ˆq¼ð‡w<ú°uCˆ”ÏlFrUÄëV¬è=ÿÚì3&ŠÞNѵ;º6òYm®¸X­yæY@‚Ð@Û 3€ëÍeâT…QàÈ¿µžµf}¸l€¨b HzR~9ÜAùÚñdAÚïš-]Ò ô4-8ûÁ/"¾ dù.ûÀ.=¹u! %Ü»™ñ2u¯›½BSWqý H;¸Þ0p¤àµgäHL$Ñ 2OÆ_•{ð~<Á´¨ÊeÛË9pmB޲ϞVMÓ°üü&°ÆŒ5«*á„Åy}¢Piô4ÊÑ_A‰á“ E[Ú_µ.<ðf W8ÆÁæê+‚Œ~ßXžy%÷«ÞâcR iÂÔR+©°VRûÝ ­˜àÍËlì 1Ì«sr|’jA+…VYíÒLU}z jIÈà„,9|ެê‹Ï4“co…K5(âŽ÷t×ÓìÖ‚NKFÁu(¸ÈYÒx-gìÄð±8,ókQQ~J¡Ì@ðÚhþ; ¶'^²¾Ó$ä“:~]ñäŽ7'„ðN{·ê$ bŽ LÊ[i; z¦~KÀW˜Þ fPXQ$æ”kÍZ)DF£’œ½½6Rr >ípUÆ0T¨À¯{®¯™ Ìsà[R-.ØöŒÍ%[X,…|<2‚êQ¸©…6ù#S ƒÞm†ÑüÉA‹|º„çÖH¹â@îy%hâǹ.–¢?ÀËk^]1T`ât‚+VSu(dæŸ{Ñ3ZÂRUU"%àÑbi´üùVG…ä^ôvä½[{{?’ÜÅÿ9¯ø”·š6 ¯ZW”‹s"¦â™±úó1+0§v8]c¦dèãDk©c d{IDsƒ˜¶9ëŒÛˆ7¹•ª¬Ûöm-nNbôKdQÜâïJ¤ÆàWVëu*^ ë'U¸úIQµºœ_Uà$0ÅÊGHâ[÷¾J4&P Á¾d±zRûÕî'Hû(,™$¨]´TûA¹é¢zXuÊ­†[Ô=½¾IXpûÙ¶U‹µ óŒ4\þÂGY;DWœR(œ§fäñB.…'-ÿ ËŸ?3‚¥™¢£«±ÁÂÁï‘ÙÞñþ;n~þ¸öú#%sÆ=³ªò8ðͺþúJ°C .ƒÔäsÝ|¶:=+—±,W’cp%o¸œþ®[»¸“èGnàÊë‡5o}_ÅB`8“9šî½yǯ>Œi\dÄ@¹î›á|[>-A&—eÆ:ºþ8-Ââ8¢¨»%ssè•ë4ÚãuMyEËu ÅóMßo¶eR9R>©1µ%øxÁLcLÄÜh{¥œØÍ!E}-Ž WïFL÷@t±#BûœE¢žtMI° üÜ• T(\'ÉVp´›5^êK©Ue#æÑ:d^pû#ÝþŸ{¨Ôì“õ 6qq£g?$ñØ^æy{ŒkT[’Øjy[›“Åùfª°ÉƒpW‡³Ø´Ît1 âÆ*Ý·¿-‰›åAă¿Ö:~ŠR:.|-™ª> endobj 108 0 obj << /D [106 0 R /XYZ 90 720 null] >> endobj 109 0 obj << /D [106 0 R /XYZ 90 720 null] >> endobj 105 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 113 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/initial.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 114 0 R /BBox [0.00000000 0.00000000 488.00000000 237.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 115 0 R >>/XObject << /R8 116 0 R >>>> /Length 117 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`bi`ªg62¶4Ð3QÐ54Ò3·4³TÐ5Õ3´´42‡¨·PpÉç BŽ > endobj 115 0 obj << /Type /ExtGState /OPM 1 >> endobj 116 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 1022 /Height 498 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 1022 /Colors 3 >> /Length 21550 >> stream xœíÝ¿ª$IzþñXÉ—!§1ú ¦Á04¬c¬±ÍÂÐmè º1æ\\íÎÀ"k¬11Žü1väj¯@ _1ñëÜì̈7߈Œ?oD|?FQ'++3êTå9O>••õ³ÿû¿ÿsf÷3¢?°¢?°¢?°¢? ®Ÿýìg½‡KÛ?ÑP×#úÿû¿ÿ{%ÿîw¿ûöÛo¿þúë €jÿ{,ÿ«¯¾"ú˜sm©ÿ8¶èÿøôË_þ²àåãÿåc±Û¿ÌâËç’K.¹¬}YûïØcù¿ÿýï‰þ¦µrÇ\{„¿û¸=RòÏÈö¨ì¶Ç[|ÉÐF½¿c%ÿíßþ-­?€™­Ü17n2ž‘‚O´çÿe’ûŒ«êß1Z“[¼cnÙ)ž¿.¹ä’K.ë]îÿÞÒú˜ÙâsÕ~[¨õ·ð‘K.¹ärÖË}óõ-­?€¹Ñ1Wú/⯗jýË©óüÀÒ‚o‰þ¦EÇܬ=ºóŒ<–SéÓØ°¬7oÞÿÞýL‹Ž¹ ¹=RŠ=#¥>í×Òý3Ö\rÉ%—y—¿`¿üéOÙý¥ùè¿M¡õ0?:æR.Û#%áùÝíÏ$|kþÓ¦ôm¹s*”ú;¶ÿgû»Mô0›Å;f×°=*õŒÜyº þ÷¥o?œI¹È_žóß1ý;Õû9÷­ ­?€UŒØ1Ú)Õ{Fnþ÷ÝÿË´|H˜ÛW?‰Ýzg±‡Ka¶Æn®ºãȱ‚R·ƒÇbÛûÁ~6¿ZË®c·=R2øŒlô2øv§ èõ–# «úw;{9´þ–3\Çúï÷"ˆþP–þþÝÚm"ÑÀÌbóo~ó›~ƒÒ«W¯äöH)øé Gë¥m­?gø°ŠXÇLôOòüüüOÿôOr{¤üô­?·oý9À%Ä:fýÿë¿þ«ãØFñ/ÿò/Ký]óú;Z(ÖÀrb3Ñ_oý+ןÖŠ£õ°Mëÿúõë~Ôî~t¤­?ŒˆÖÀr4­Çèÿüüüöí[Íœí¹ÖFDë`9úÖ¿ýÁ?>R'EÿfƒÜÖFDë`9úÖŸè¿‹þ´þ0 ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°œ;­ÿÓÓÓËËËy™±éš[÷îDÿÇZö·*רG룣õ°œ;­¿×‡Tœ˜çfôßA¿¿‘16Z­?€åÜlýÝUôßÚ÷ýÝ_v FÿÔب΃9Ïy­?ŒˆÖÀrn¶þ>.Ÿô>Üïo:\q"u°•¯ýc£:&8çyl´þ0"Z˹¬¿ýÏ3¯8Ñ_9ñ<6Z­?€åÜoýÝUÙ¿Í?bôß/ÖfBë`9EÎð‹þ—üØþ±ÓúÀèhý,§Hë»n'úßêy´þ0:ZË)u^ế²½-Ð,úïo ž†È…Î;$Œ?66Z­?€åðm¾yhý`t´þ–s§õ¯mÄèO룠õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°}ëÿüüÜe„IÑ¿ñ iý`\´þ–£lý{å~—ýÛ’ÖÆEë`9šÖ2Z­?€åhZÈhý`D´þ–Cë­?ŒˆÖÀrhýï£õ€ÑúX­ÿ}´þ0"ZË¡õ¿ÖFDë`9í[ÿ§§§óÄ———²«(»@­?ŒˆÖÀr:¶þõzÇèO룠õ°œŽÇúŸúö†À6ÝϳÍégØO9ßë¼Úhý`D´þ–c§õ?¤ùCÖ¿œx˜Ö £õ°S­ÿù¦`²¿œcý—hý,ÇNëï>þ°>úï—Ð=úÓúÀ(hý,ÇNë¯/õc3Ä–\­?ŒˆÖÀrì´þIÇó8ŽõÜCë`9vZ÷ñÉyçöÙÏ ŸáÇ}¼oЭ?ŒˆÖÀrý6߯½¾ŒÖFDë`9[ÿT±ãþ»£õ€ÑúXÎX­û¯ëÒ õ€ÑúXÎ@­¿Y´þ0"ZË«õ·‰ÖFDë`9´þ÷ÑúÀˆhý,‡Öÿ>ZQBëÿøÓÜoœpM™85­¿¶8xûö­¿Bë#Jhý·?ÍÅù}ޝ¿þºÆÂXðþýûÇe½ÍüñgD_6kZ¢ÿÙ»wï¶·Dhý`Di­ÿ¶—àç.uéÛ-_>—\riárÛÃ/¾dÿ§#5ú;Eë¿•ÜxýúµÛ Eë#JnýÿkKÙg‚²K`Á~¿Æfž”8õ­?Ñ#DÿÃo’ÖÌÊlý‹ÃGr?0±z›yjâ¤õÏ@ëÈoý·V†K.¹ä²ËåþoÙ·´þ•ÑúÀnµþþ÷sÉ%—k^ú¿By‰“Ö?­?Lànëÿø_ÛcØVw'qÒúg õ€ Ümýÿk+ñbÞ¼ys'qÒúg õ€ hýKñÓ¯¥ûù¹ä’Ëý¥ûé kÛæþ/Oð/—ìNëÿôôôòò"_—çÔß½Z˜@™Öÿw·OÙñ-gøL*¸m~[è¾û¿ëìÿßlý÷5iÒÅÃ\ö¥}öóìÅæ×;/$ö0•«kÿ»ÕüÞ.¬r`ú[3QÒªrÙú_þ*¶å¸‰ZÿÑúÀÊ·þ©#xÜå~ë¯Icwâév—sÊÔGØýBÎÓóÈ¿ åðô ¬ñ»U.Sž¢_ˆæ^Â#©fÕÃÑ´þÂç¥Ñú‹Ö&På ?Iqç«M^ö~ògÒåáq%­Qžóy-IË-¶ÁïV9ÈØ˜ÏOJÙ‡“wS©§Ø‚Ëmóü Œ-ÇÑúŒÖ&0ê~Ü)pì3D,‹¯ëÓÛå!ÕÈ…Êñh†\òv½öïV^ŽüKÓü2/ŸaØÊå%Œ‹3üý7´þ0QÏ븉¶eœ×?áANÖ&0pëÅ‘û õ'úohý`´þ¹¿™Å[ÿwïÞ%<ÈÐúÀÐhýD5hýõwoßú“ûÏhý3<þÑö€þþïÿ¾÷  õ ©Úú{ʀƭ?d´þz[ô?ç†ÇM‰þ²ù¸ü‰°1 ›ðˆhýDÕný³—Ó õ‡ŒÖ_o çT!Ü ™¥6Ò2­¿¿óÖÓä]>2Áû÷ïï,K.¹¬qYjÛtö"î/‡Ö¿;Z½}b8¤á&m¬¶…¦µþ_ýôÍ»9üÿ¿ö«_Ç{ÓöO€)·ÍR‹¢õïŽÖ_O&¦ÉÀ(Ü<ÓZÿ/¾øbgÿ¿¶Ý`àÿ—ëýû÷Ûã­ÿÓÓÓvýåå%ãî÷ª‡Ö_/é‚iâ`ßšÛfαþžŸÛ}èÉ ™W¯^m¹¶‰oÞ¼1Ûú‚{FŽ·ý­¿(öÁAá3…s$ À²e7ÌäcýýõsOmëDצõ?œÎÛýdñcUck ÎYv »-ë|±)—ߪöÐOÓšhý õ×»&HÿÝ¥f}{mdo8ëDÿF­,fUþÊžÇps03åU?Jh- £Ò øò$‰°ŒÖßZ½›a‚ôß^Ù¸Ãn@%w6™u¢¿kÖúë3YÑ¿Ô`Æþe5ŒþN³Ö߯goß¾u´þ)î‡ Òmâ~ »¥ÜÜXÖ‰þ[ÿ؉ð’\²-ÿ0†ûG¼h;=Ÿ<³<ýæÈ/¿{èÎØä™SÛK‘_E‡ñ_¾äJ½PJ³ÖŸèôîÝ»ýï‡Ö_£H˜ˆôsš8Ò^߬/cO OpsHúJìu¢¿ëÛú¶qgµA6¸Šâü\®H9³þúý‘»Ð/¼ÔØ‚3¤ŽPý«þæÑKãÖß7Üð^¿~í>þýÐúk ÷“Íâ,Çýv4Jí¯ýÛµþ‡)±´}HuÙY6¶Fa5¢lEî”#/G%O.${ü‡á)Ÿ”¤±å 5ö6‘òU$ßK9½4ný‰þ{±èïhýEeÃÿ$1ëËØ8+¸Q¬ýÍÖ¯Òá+òªF?à'¸ÃòkGÿýõD3¶Ã¢?’ÐúwD럧x˜ ýËæ‹û1ì¸Ò›Ã:Ñßܱþ¥–ñè¿MqWñúòWw9±Þ9¼?Ðæ‰Ãê²Ó<Ñ8´þÑúç©&HÿëÄý˜5wŠoëDg°õ_'úkfVFÿsÎvöØäéDÜDëß­žJabñôOÖ—­°'PcX'ú[lýÝDóM  ±Qé¯ßŒþîã ÿþxc Î:H!Žk~™I¿y¢¿)´þÑúç©&V;íq?Ï”»•>ò¾NôwÖZ÷!~y7ƒìÁy/‘o.²×!dÇýö·ž§»ø/$8ýÎȃSŽ-îƒc;/$ixšè/¬+¸›-ÑßZÿŽhýóÔ± 4AL!ë×0Áž@½×ü:Ñ¿QëK–“¥å±aÝ[ÿJÂÛ­žab¦ôOÜoiÄÝ€ª¯öu¢¿kÓúã’åÿ–džutoý‰þ´þ©Ú„‰¡Ó?qß‚!vj¿Î׉þ´þVXþ÷oylXGßÖ?xÞyÊKè«å„ƒý‚ÇÑD럧Y˜(ý“õí3¸'Ðà¾Nôw Zÿàa÷^¥ÿvÂë­ô¼^ãÿË÷zýÆRÉãÜØ0 2Õúk>2®ÿ ¹ýW,­ž–aÂrú'îËÂn@›×ö:ÑŸÖÀÌë/Ÿ¼ër†¡£¿£õ5ÖÒ?‰&½öš½ª×‰þŽcý ÁTëïB'†R¾- ÜË,Zÿ<íÃDð‡÷Ï{˜Ü?ŸÆé¿ñ‹yèOë` ¦Z}©›!¸X³hýóô ê¢ÿ|ZFÿö¯áu¢¿£õ0S­Òñ<Žcýãhý[®ºY‚!÷ϪMúïòê]'úÓúƒ…Öß‰ß <"H>ÃÏy±6Ñúçé&z¥rÿÜj§ÿ^¯Ûu¢¿£õ0„î­¶!z}­žîa¢KŠ"úÏ­jôïønU÷­µb­ÿóós‡áXRÇÖ?Iìè AÑúç±&g)rÿ *¥ÿ¾G©YØZk+Óú“û´4Pë?Ê×uiÐúç1&bgJ)>rÿ:Чÿó ²ñ™©Œl­Uký ™W¯^ ÑúO†Ö?©0ŒVÇ@î_MÁô_ûÅ™7†Žƒ©¤Ø±þÐÆóóó@­ÿLhýóX ¾F­äóÏ?¯·pôÝwßÕ[x—­ÃÔÖZgø0’îgøY­ka¢Þ±ÔTþkº_ü[øŠË•Nýgø0„qÏð3Zÿ<ÖÂDl¥7Cî_Ùô_éYv0½ÆS­?€‘ÐúwDëŸÇZ˜Çãr² ú¯,/ú˯7ƒ[ÇLÑßÑúøÌ×Ñö†Ö¿#Zÿ<ÖÂÄåJ3FEîGjú¯ñ:¼ÏÚÖZ­?€k}£ÿóóóÁiý;¢õÏc-LhVšôQ`>Ú /é#¿š¡©­c²èïhýö™¯±C§õïˆÖ?µ0¡ŒþúQùÃÓÿÅ_„¥XÛZk õpÍfô§õoŒÖ?µ0Q6u‘û±§LÿDÿŽhý\³ý­[´þy¬…‰‚©‹Ü3Mú'úwDëàšÍèOëß­ka‚誈þÆÕmýýÿ†¹‘ °›ÑßÑú·EëŸÇZ˜(•ºÈýˆ¹LÿDÿŽê¶þÓGÿwïÞñvV`3úÓú7FëŸÇZ˜(’ºÈýÉéŸèßQ‹ÖÖÿÃИÍèïê·þÝûòip´þ©¬… ¢? ú›Õ¢õ'ú×ðôôtžøòòÒ~$µmtÊG7ŠØ«ýñ윟—mbðVazPÇÖŸÜDëŸÊZ˜¸ŸºÈýÐÒ?Ñ¿#Zÿ|½¢0ôïM‘mFÿ¼Qž»ŒGÔë·a3ú»š­ÿ¦ï×™mƒ12Œ ­¿žµ0q3u‘û¡KÿDÿŽhýóu‰þ±ìx?Sš5GôvØòv†ˆþ1C´þ›Ž™{ÿ5ÆF†±¡õ׳&ˆþh†èo­¾öÑceª<ŠHý=çÏñŸßû­ÿþñ§»Èƒ2Òú·ïðÀ ã0Ö_ÃZ˜¸“ºÈýHLÿDÿŽhýóuŒþBì³Ù‘Ï!ûó±'EùdYø\ÇÍèï‚þúž‘Ö¿{æ62ŒÃtZ ka";u‘û‘çœþ‰þÑúçküŸ¸Hã«_ˆþ_âf–@"ïù&9 ãL Ü—A­ÿÍÔˆ^Ñ?ï—#G´Œ9/?m,ܽHô¿gñèŸ7sÙWõXÇúk¢ÿá¾´þ›¢¿£õY y©‹Ü;éŸèßQŸÖ_þ_ÒG;(úË­|0”ßœS¾ûýè¯gð9ú§~l—è3ú_>k­ÿ?üÃ?hV‘íÿñý9úùå—U‡ñÍ7߇±¡õ׳&2R¹÷íÓ?Ñ¿£n­?Ñ?U‘èY½O6Q˜r9§,/úß?j‹èß½õ7ý?ùä“ü±Ô0’¢¿£õY DtAô7¢ëï¯>íGô?Ó4å‡:ü²b/XÆ7ôúGÔ1ú¥¾ÔÇþ®ÂÇ|­ÿÜﯔJÿ´þY ©©‹ÜR¶ôOôï¨ëþOô"úß9^èüclºÓÉŽþòaT×[–Í“{Òú{[î÷ФZÿ‚¬…‰¤ÔEîGY>ýý;²ÒúÇnµÌNô—ç”[çàœ ¢¿0ÎËCóõÈ}œéƒÇÞÈ•sL^ô×üZJ­·¬^Ÿ1uCµþûÌ}ˆãz#FZ™µ0¡O]ä~ÔðHÿDÿŽL´þD ¢ÿèïNq_Ø ÐÈ~:òrç.EØŒþ¦ZÿsàÎKÿ©Ñ?¸–ûéŸÖ¿ ka‚辈þ}Ñúç3{^ýa<òå›,Dÿ¤ãò…ƒ|R+ÿ¤1ýo¥õïý«Þë_äó¾´þY ÊÔõù矷ôÝwßý{¡õÏgüÛ|ùèíÍU .?Ú›´´Ô1ýo¢õÃÔÇ|­¿ÈZ˜Ð¬”¾µ¿çëÀÚÖ1Yôw´þ:FI~—7¯P¯118`yžŒw‚kiý/Gűþ2Zÿà0LEZ™µ0Aô‡Dÿ^hýóu CÊ+Üš:1éSªW¿?KóšsÅ$í*hä½Câ²~«E|“Íèoªõwý>æëzGGë/²&.WJîGrú·¶uLýßæ›¡W’?äûЪp¯XVÎÖ%ú ã .§oôF›:¢¿ÙÖÿ&Ù ~ÄèOë/³&ä•’ûÑ’þ­m“E¾Í7GÇ0ät5ÿå6IŸˆÍÐ+úŸï›GXH³èjÒ}ïø&›ÑßZëŸçð^ÁˆÑßÑú‹¬… ¢?ì ú·×­õ÷WJå°.úF %ÿj~~î5€)[ÿàÇFŒþ´þ2kaBX)¹íÅÒ¿µ­c²èߺõŸÑëx¼Ú;æ~7cëÌèƒFGë/²&b+%÷£—`ú7µuôO }Zÿ9ýöfjýÝ)©ýiýeÖÂÑÖý[¢õÏGôÚ›¦õwðãhýEÖÂDp¥ä~ôuNÿv¶ŽŽã©Ö?ÑhošÖÿ|&PÿE¼#FZ™µ0q^)¹Ò¿‘­£ïxj õÏGôÚ›£õ¾`ÄèïhýEÖÂÑ6ýÛ õÏGôÚ³Ðúûz>û!Èßü5bô§õ—Y ‡•’ûaÇ>ý[Ø:”7…Ö?ÑhÏBë¿}ýVÆø/¿ñwÄèïhýEÖÂÄ~¥ä~X³¥ÿî[‡þ¦±Ðúç#úíiý·[õ;ç“ùg1úÓúˬ… ¢?,#ú×FëŸè´g§õ?ö‚gò‰Í{þQy÷" Ô_O^—èoü¼þµõ­¿^ƒ0AîÏf'÷{¤ÿlEÒÿ:ÑßÑúobÿMý•—Ó‰…ÙÎež‹Ÿ?;µð›†©èž«fc™x»×6³&©»”×Xê]èUw^þe+|¹4×D÷Öÿrb3v¢?­¿Œèo“µÐ¿Ç@¢¿­-«•÷ÙìD ¡cëï²¾úªž¾C¢õ×#úd9÷{¤ÿTD%Zÿbbe0dD$éÕúã€Ö_¯A˜øÃþðgög÷—³û¹ß#ýëýÏÿüϧŸ~z9ëDZÿ2bE@@ôG’^­?hýõÚDÿÇ%éÿÒ(¡€KÜÿ¸$ú+Ñú£3¢?΄?í[ÿׯ_ß|8wlƒ12Œ ­¿^›0Aú¿4bî÷Hÿ‚‚¹ß­ýiýÑ ÑgÊèߦõÛÅÛ·oM cCë¯×2ú;Òȸ¡€3ŸûÑ?EõֿŃÀà|ôï= Øb­õo¿_êé!úwÆa:­¿FãèïHÿ›#÷{¤ÿ½-÷;¢Šº­ßw¨ ÍTëß=sÆa:­¿FûèïHÿÌ”û=Ò¿·ÏýŽèŸ¢nëeÑú÷Æa:­¿F³0Añ¿7_èßc FåïVŠþµZ(‹Ö¿ï0Óiý5ºD·vúŸ;÷{+§ÿJ•¿[)ú;ZCèÞúùå—åMÀ7ß|ã¯ÈÑ¿×06´þz½¢¿[2ý¯ú÷Ü8ä~GôODë`$Ý[ÿ¤ÌýÉ'Ÿèg~øñÇõÑ?uáE†±¡õ×ëýÝbéµÜï-•þϹßýÑúÉX­íèÿ˜?iù~±´þµ ˦ÿ5CÿÞ ;µs¿[)úÓúÃ(­¿Ð>ú_ôm¡RôOÚIȈþŽÖ_Ô=ú»ÙÓ?¹ß›;ýs¿#ú§«ØúsRÙÌž×_ý·¨­‰þ‡„âÑ¿_q9³£õ¯€è_¹oâôOô/¥bë￳ÍÃÀ ü—øö̾Ýy”ÖßS¶þû9ËFÿÃGÊ‘Ðú—e!ú»Ó?¡?f¾€XîwDÿtu[¾¥—x‘LlŸSß·õß'r9úç,ýƒŸ4Ðì-Ðú—Õ8L,’þÉý²™Ò³ÜïVŠþ[Rd¼HfuÈîúèï_ƒ¶þ‡8.DÿØœ¥¢¿ð cÍH´þÙ‰þnŠôOè×›`@ÈýŽèŸ¥Qëÿø÷Ðæñ` ?üðƒOxþErÎ×ùû§|RüùϾŸíW¿úÕ¿þ뿦8õ?Îdë¿×ý€DZþ˜ŠþnðôOîO5tú—s¿#úgiÔúýqFôŸ˜&úo)?8qÄÖÿœÅƒÑ?Ù‡ŽþŽÖ_d-ú»1Ó?¡ÿŽw.s¿#úgi×ú¿¼¼øéOOO€¶Ù¶9cw|LϘ"¯:8sÒB Œþû_µðÔ'­h»{ê³=ÖØl]6µ‰þÎRë/zy67xô§õ—µó¥rÿ}c¥ÿ.¹ß­ý[´þš}˜gÿc^Ð'ú[vŽþ‡Ä¼ýxžît9>¸÷Ø ”§Fÿùv.£¿ø‚ÓmýÏ9àÇÑú‹ˆþ7‘ûK(ýýëiÚúWþþGa —ˆþeGÿà” ì;ÞDôoý™Öÿ²Ëæ9Ì9bô§õ—ÙŒþn„ôOè¯Áþ€&÷;¢®n­ÿ¾ˆÝnJŠþÁbw9wÆû»†ʺ<Ö_ˆþ±‰úybϸ‹t¤yEe,¼ýñH ÈÑËý±›Æjý…¾zå‰8þŽÖ_d6ú;ÛéŸÜ_åô¯ÌýŽèŸ«Oë¿O<‡ë5¢¿°:wÚçAA ¢¿‹ä£m\^?$þ› ™C›èïÌ´þ1Ýøió•^´þ².abèôOèoÃà@ßÜïVŠþ­[ÿXįý“Vwç¨!èÅ¢¬D?Ü=).ŸwbÅÖ"ŒäN»ú-,ý¹?xë@­öÉõƒþŽÖ_d<ú;céŸÜß’©ô¯ÏýŽèC·Ö¿HôwñÄguDÿ6Jµþ±Æy¢P´Êûó¢4óÇöUˆþ®Nôw½[ÿ¼ïÓ ýiýeö£¿³‘þ ý½XØHÊýŽèÃØ­¿#ú¬Í?ÊeÆZüËù÷SÜÕ~Ñÿñt»Ÿ’}ìŽÛ £´þå±ø#FGë/"úkûûêžþ‰þÍÐúý»é{†Ÿ›éüò¢¿‹D!÷»ÄèﺶþyÉ>h¿¨‚Ñ?øžƒfoÖ¿¬^ab ôOî· cú7’ûÝJÑ¿CëïJ|Ì7vÓy9I«‹Í²úž×_Óú+¯ëß"Ð,dš¯ô åXÿË#yô{‡?bôw´þ¢Q¢¿ë‘þ ýÖ´ßHÍýŽèO·óúÒÒùhiw: bvô-VÞÓõý6_å±ûû½ÄËêå±þ±èRög† ðsÉ~ë_$ú³ûˆÑŸÖ_6PôwmÓ?¹ß¦–é?#÷;¢ÿ=&¾ÍW“­Éßó¹<Öß”ùŠùªò¢¿=¸qZÿ˯ñÄ‚{©è/ìœ\î0Ðú—5VôwMÒ?¡ß¾;y¹ßýï±u^Ñ>Dÿ‰ÉÑ_Èô£ë'úË‘½Hô¿ó¦­qÄÍôOîEÕôo0÷»•¢£ÖßO?Ø gúØQÑbm¢ÿˆ­ÿåQ:÷£¿òŒ¢òiý 1ú»:éŸÐ?¢;Ù¹ßýokÔúOuèâeŠþHBë¾IyF ›Ñ?é›bã§õ/‹èï‘ûÇU<ýý;jÔú“êpFôŸ­ÿá&ý™@ïDÿÔo;ÓÑúW0hôwEÓ?¹tÓÿÜïˆþ·µkýƒ§F‰‰nåÆ#-,v–Fè]FÿÃ917±_µpHXÞ³ÃA>Ùhý·›ROÿŸý3r¿ÜK¡õ/¨o˜èžþ ý3¹¿`9÷»Þ[kíZýw0ù+š¯pÒ,³Fz žÊ©äè/Ÿƒß]¥yýó"ÌÉ“›Ößß”ñµ_yÑ?;÷oû*´þ ýݽôOîŸÏô3÷;¢ M[}ŠR~{+ÑhBôßN¢Ÿým¾E¢?²-ÒúËò¾ë75úßý{~´þeý]Vú'ôÏ-cà~îwDÿºµþ‡oMº vÁ)ÛSÜ霡û;©h0ÿÉË´y0Ò(bÑÿœø3vübwÙ®k^!ö<3k‘Ö_—û]ѯôÊCë_ÜÑß%¦rÿ ’Ò‘Üïˆþ%ôiý/”Ïhýcˌͣ†f™dÁ<Áèü݉þy¯žñ<Ó·þõ$EÿJc õ/«{˜hYüúW£Ü¢òw¶Öú´þçwŠDÿà2õ¡ír¥Á²ÎÑ_ó ?ßTäÙ<|Θ'ZoúÖ¿}ôï2Œ ­¿^÷0Ѭø'÷¯é2ýRù;[kÝZÿÑÿp«&¦Ë§Ž!úWÕ>úæÑGÿýÝyº5&ný›‘£¯a¦Óúkt¥¢¿Ó?¹eBú/•ûÑ¿i[Í<±£;b+%ú—ŒþçÙ‚Ÿq·[ÿàtÍ+Ó‘þ&ný›(ú;ZQ÷0Q0ú»Pú'ôÃ;ïÌýŽè_ÈT­ÿÍ`Gôo,é¼þÊ/ÌP$úkV wýý3Dë¿(úÓúË,„‰zéŸÜ½}ú.÷;mÝZ×éc¾±Ö?x>æ[Uvô×TïÙóeg¯!ú ¹ßÑúï ý­¿ÈB˜(ýÝOéŸÐ˜Ç@ÙÜïˆþåt;¯ÿþÈéìÖß…òܶØó<Âñß/W§tt‘Cƒ‚ÙŠ›o𾇉Á…Ä^!ëŸ-ýþóŸËwüÕ¯~åhý2Pô§õ—YÅ£ÿßýÝß•] &³* ¢)&¾ÍW“žIØó¹ŒþW›èß²õ—߬¨çý»cCë¯g!LþŽô¸â¹ßýË1z^ÿ3¢ÿ|ˆþ›¬õï¸ÝÇÑßÂ06´þzFÂÅ?š´òwf¶Öªš¶þ~º|pÎZÌŠè?±™ZÑúë ÿhcÜÊß™ÙZ«j×ú·y<Ñb3µþ{±w)óÎúZéÍÌà' „¯ÈÈCë¯g$LýÑÑ߸v­“‡ƒ‘ý'6këó3K÷ï’´XáÊ}´þzFÂÑmýkz¬¿Ÿ®<¼ÇEZ«ÃÌÙ'{)8Ò’]â‡&Vä ?òÙúùˆH/·þÁÏ,or¡I%Ý%Ïöâß(ïäm&´þzvÂéµ û¥­µgøÙȧV=úsJÐ9úÇN½/ß´Ÿ‡èßÑô­¿²YWN,ûÇ!{Ihýõì„ ¢?j#úÛ×í¼þADÿ¥ÑÿÜåïyÐ š™¾õ^u—/¿ù¢?­¿ÌN˜¨ýéÔÈýŽè_Z·Ö?øfô2ú_¾·|W½Ôü.þ™¿ý­‡åÇXôW œ‚OJìЋşšû¦oý]ü€áÚvýü ßÏÙ2úg¿Úiýõì„ ¢?ª"úÁîyý…wöƒËéuýrT„˽`ô¿úßùµþŽÖ_d*LPü£’ *glk­¤[ë/DMÊ—ïXpúaDÿ‚GÿÃÝ‹ÿ€½ZÿóÛM‡›\ä(Á-p_Þ%2úŸLBë¯g*LýQ ÑæZÿØ¿" ­¿<˜¤Q‘/]$úŸg‹“—E¾Ky*‰þeMßú'ÝÔ˜ò]Saº­¿žµ0AúGqsä~gok­ÁVëŸúoÕHôWþHô?H:¯ÿe”¹ýÏ—…âºVhýõ75¦Œþ7Lë¯g-LýQÑ ÝZwõA؃Ôè[~½ëšµý÷²£ÿÓé£Õ‡ùƒKp‘Ofó¼Ô0qëïâ'õ2òâ9¿ÂÝil÷_ê´þzÖÂÄc¥Ÿ}öYñÅýWV#úÿý÷]¶S[k ÝÎë>ìu?q#g2ùÀ¡óò«¸f~IöòC bºBßæœ?8Ex*y^Š›µõdžÖ_ÏZ˜¨ýéU•*¢%&¾ÍW“·Èdó¹Œþ׬­?6´þzÖ„_)gùD)•ÎéÙqëH½i,vÏë@ôŸÑb´þÓ£õ׳&êEGú_O½£ü‰þ•4mýýôó!r¦?ÜÓ úOŒÖz´þzÖÂĶRŠÜWïk¼ˆþ•´kýÛ< „è?1ZÿéÑúëY DDôN»Ö¿ÉÃÁHˆþ›©õ÷¥—m0F†±¡õ׳&ö+%ýãŽz¹ßØ:ô7¥é±þ~ºüeXÛõÃqAš{qDÐX‚Ñ?vr¤ý/ã•ÐÝL­ÇÌýø=l»ÄF†±¡õ׳&+-žþ‰þë(ý÷'ò·°u(o‹‰3üxò™:cßÇä®N_ ³‚ßæ«üÎ5—rŠO´7_ëßþ( ÿHÑ¿û0Óiý5¬…‰ÚÑß­—þ¿ÒÇå¹P¯jåïllÊ›ÆÒí¼þgyÑ¿ø÷Ô ™Ëè¿Iz¢y X0_ëß=sÆa:­¿†µ0q^)Åÿ>÷{sDC¥ª•¿3³uôO ÝZù+±œ"úkö%«Øî%Ÿ]4鎇٠w'ú»Ó+Ä_Ñ|#[ökz·þ_~ù¥fÙ¶ÿ¦rôï5Œ ­¿žµ0Aô/‹è_ Ñ¿ Cçõ/ýcÁN¸®ŸY¾ J±èþð†üÈx®c×/Ÿw(MÜú?2÷'Ÿ|¢YK†üQý» cCë¯g-LWJúϳÏýÞéðRíÜï,mÇSCŸÖ_åï·þÁ™c‹+N¿3xÁèïB‰ÿ2ú+?!pó5½¹[ÿGæ~„cÍŠ’øÅ&EÿöÃØÐúëY DÿRιߛ# ʈþãêÖú7ˆþÁÓÂhbßa9±ô™tÚœeÌW¾5é©$úW2}ëOô§õ׳&b+%ý'‰å~oŽŒÓ ÷;c[G¯ñÔ0më¯é5±O^pùÐký/ŸJ¢%´þJEÿý@ã¤õ/ÎZ˜ úAô/ˆèß’‰Ö;Â;)ú§?Ø#¶.Òá}w¢ÿåË)x/ù¾Dÿ‚hý[4?,¤Hô? u¨´þÅY ÂJ˦ÿ‰£¿œû½9bbPÙèÌýÎÞÖ1YôïÐú»Ûó=,'¶ØóuÍ?ò…Ù Wê¼þÊçÝÝ~ @Ö?è˧‰þŽÖ_d-L4‹þnÒô¯ÉýÞIñ Måïìm“E×þ¼þûã°î0ÑéŽíq§|¶ŸÜÁ®ǦY~l8+øm¾‡çBÿT&½ Gë ‡þmžA£?­¿ÌZ˜WJñ/;çþý«ôüãáÖ9Ââ^›ÊßÙÛ:&‹þ&¾ÍWÀS FÌÖ£ ýÛœƒFGë/²&.WJúì£ìõ¹ß˜#,nšå~goë˜,ú; ßæ+ úO‰è?1Z—ú·ùý˜/­¿ÌZ˜ úgÛr¿æ•¹íÌ‘=¢ãñÔдõ÷Ó“B|Þ½0¢ÿÄoýSCÿv¯Ž'÷ôc~,Ö¿8kaB³Ò‚éšèÿø½å½ ûsDÆ–¹ßÙÛ:&‹þ®Aëßæñ` Dÿ‰-Ûúß9Þ¦FôWγ-­qÖÂDãèï&Jÿ‹#úÏý[´þMFBôŸØ‚­°éߪtͨ ð³M—ÜQ¡õ/ÎZ˜Ð¬ô1ÏgŸ}VjDÿ9Œþßÿ½æEhjë˜,ú;Z´'DÿËOwè¿êÁſַ’Ë/H]ÚaÊ¿-Õú_ž²ó<1¨àÇ|Ñ?8€sîw´þuX í£¿#ý¯låOôïˆÖÝÄ¢¿æ©Ñ_øZ€âŠGÿ–ƒ/eÖÿò3µ-£ÿ9è+‡·Ÿ‡Ö¿8kaBýópÄ?6£ÿ§Ÿ~ª–Z©’µ­µZt#DÿóW¼܉þÂÝ‹(»ðƃ/eÖ_¨Õ÷34ˆþÁ”¯yGâ0­qÖÂD—èïHÿ#+~”?Ñ¿#Zt“ý/¿·+¶Ã §gÍ7¸í‡|S"8†Ãýï ^øªã–lýûFÿXÄ÷óÇpÞUØf¦õ/ËZ˜HJ]ÿp¥+—ø"lÉÚÖZ­?º‰}›¯ðõºçt»¾Ìñ—‹ Fÿ¤1죯Á÷z‹`ÁÖßõ>àçpvÎóœî@ Zÿ⬅ ¢?Rý{§Zt“ýƒ XHÆû‰û…ùåŦŽA?CÙÁÇÜÒ:­¿³ñ1_å›îþAl´—ÃØÐúëY ©©‹ô¿¸â¹ßý»¢õG7çè/Ür3=ËY¹Ø^Ñ?uðÂÒšY§õßt<¹çeî?O˜ŸÖ¿8ka‚è$DÿŽã©ÖÝ£ÿy¶âéYsw³Ñ_÷¢¿‘Ö¯ýWz]q›ðhý˲&2RéY5r¿#úwEënzµþÙ‹(ú/rÀ³Ôúï)Cöù^w¢Rå/ÏLë_–µ0‘—ºJ¥¢ÿXJEÿÃw÷ý;¢õG7‡èÿÈÁœš÷Ûóö?&-j».$øØ/£¥ÁÇ jfÙÖ/uà~ë¯t¹ßBë_–µ0Aô‡Ñ¿ïxj õG7IÑßí>ðú’~rÏÔs˜¦¿ìNë)´ìç1(ëù²ƒ?ìBÄö(j[¼õßÓï´‰þ7÷@6´þzÖÂDvê"ý¯¦RîwDÿ®hýÑMì¼þËê{t~Y´þš€ÚÑ¿ÈqGZ=ka‚è%¢÷ñÔ@ënˆþš~EëtyÐRßæ{4ZZÿ⬅‰;©‹ô¿Žz¹ßý»¢õG7D?Üht´þ‚ØsoFÿRhý‹³&²S×üÇüÕ_ýU‘1ýí+ýÿ÷ÿ÷oþæo‰þÑú£¢ÿÄhý3ŒýiýeÖÂD^êzä~¥Hú'úÛW$ú?r¿¿rHÿDÿŽhýÑ Ñb´þÆþŽÖ_d-LXˆþŽôo[ÁÊß_!úÛAën„è/œÌ>ÕÏΦÞwºžŒuåÝÑ&Zÿ ãFZ™µ0‘‘º¶ÜïQüO¯låïíÓ?Ñ¿#Zt‹þÁm<úß<¥æLçöñ¦oý5kÉýÛcCë¯g-L‰þŽôoUñÊß#úAën„è/ŸD?I›T}óm ¢ÿfˆÖ_³ŠlúèßeZ=ka"5ur¿Gñ?±•¿·¥¢G´þè&;ú_~·—û¸€ß¾ Ø}ü}·çskï+,<8<ù¦ý£;|]×åºbƒ”gæÛ|Ïî´þÍÈÑ¿×0Óiý5¬…‰¤ÔÌýŽè?µzÑß}HÿDÿŽhýÑM0úÒöùzì\øI×…ãs×åî ÓƒÑ߉û$8òóÚ˜¸õof èOë/³&ŠDGúŸTÕÜïˆþÐú£›ìè|7 iºœ†Ï÷Í>è_9Í›Áy„Gí:õýÞ|­¿•¶wˆþ݇±¡õ׳&ô©KÈýÞýôOô·æ~ôr¿÷HÿDÿŽhýÑÍ9ú GÌk"þaùIÑ?xìMFôß/M?€ó—$8§ 4ñ?®Uëß+p»£¿…alhýõ¬… SÑß‘þ-©]ù{Dÿ¾hýÑM0úŸgÓGÿ`ÆU&o:ü&;ú_øò“ —ow]p®GúŸ©õG­¿žµ0¡L]¯^½Ò,â& *ï‡~ ú÷BënŠ·þw¢¿¼ÌËãs4#W à‘K±±50Së Z=ka‚袿µ­µZtsˆþ !d÷âóµþyóÕn86>æëÑú‚Ö_ÏZ˜Ð¬ôòPŸ=Òÿšå~ïðý¾gÖ¶ŽÉ¢¿£õG{yÑß}|{pºÓÜó°–ý2• ?58ÃyÀÊcýƒáþüƒãX­ÿ}´þzÖÂÄåJ“r¿#úÏ¢qôwWéßÚÖ1Yô§õG±óú'éRiãÒ¬­ì³½>S!¬Wª0Q¿AÑúëY Å£¿#ý¯}îwDÿNhýÑM^ô¿<öÌÚú ɸË^¨¼ÒŒ†çEZ™µ0!¯4#÷;¢ÿøºD'¦k[ÇdÑŸÖd·þšcoÐ×Ä­ìà«Ø1iûû&ž?Ç’}")aù‡í“‹“ÑúëY 5¢¿»þ‰þ}ÝŒþy¹ßý{ õG7EøMë´þòù .'ºøÇK4”+Õ|ýÎ?´þ2kaBXivîwÿ#ëUù{±ôomë˜,úÓú£¢ÿĦoýÏ?æEÿìä·ü¤9e´þzÖÂD¥èï(þ‡Õ«ò÷ˆþÑú£!úëóóµi…Ö?¶°`ô§õ—Y ±•ÞÉýþ™úó?ÿóüaý„ôßÞýÊÿ/þâ/—üã³—Lÿ¦¶Ž^ã©ÖÝÄ¢ÒÇ÷£?;5¬Ðúý­¿Žµ0\ivî?LÄNæsžhMl7€è_,ú[‹û_ÌëDGëöòZÿ½ìèXTF¤NZWvô׌38Ow+´þ¥r¿·…rZZÿ«.µöˆþ÷¢¿ñÄÐìU½Nô×¶þü~ ­?î¸ÙúŸ§gð#Üë°ŠóÄÚÑ_3ÎØ<ÝMßú—ÍýžOç#FGë/j&æÈý~7€ô‡ß¢ÇŠûm^ÛëD§lý¿øâ‹ýiýqGê~ FÿË,[Åå½ÊFÿ¤;Ê¡±f­ÿû÷ï·›šµþ5r¿÷èœá‡Ö¿ìЦÉ+@ƒWø:Ñ?íXÏÏíhý‘+õ¼þIó=Ï™ôñÙ=yº¼.åê.[>æ{XÎ>qn7½yó¦Mëï#õ!C'§Ëw/ý«Ø·þ±qÐúÔ&Lû±‚Ú¯óu¢¿Óëï¯s¬?îËø6ßý7š#aÜ.ˆ ·ºS^?¬ôò݆ú\(”dž-_?3¶ðñ̤ŢÿãéÖÜ=éXÿ-ý§Fÿ;­¿Î[­®ÿq»›x?úŸïÑL9 õ/¨A˜ ÷cU_íëDÎðƒ„èÑeDÿ2ð3?Ö è;ÃOÙèïhýEµÃ¹«©÷š_'ú;Îðƒöˆþøñ‡ôþbn5~†ŸC^?/¿Mô8<èH3q¿@Zÿ‚ê…‰Ø)§É(@L,ý»{'ý\'úÓú£¢ÿÄÚDÿŽ­¿¿.—ë-£ÿ~‡+±ëÁ+.+ú;ZQ¥0»ï4ÕØÖ‰þŽÖíý'&Ì÷þÏ7 ÑúoÎõ¿>úo2>æk'úÓúËj„ r?à*lëDZt@ôŸX›èß½õßÜ<Ö¿œÔè_­qÅùؔÝÖ‰þŽÖíý'vyrÏ-ý§ÛoýË~ÌwCëO럽´ir ªàF±Nô§õGDÿ‰µ‰þÓœág3hôw´þ¢‚a¢ÒGÑ•úÈû:ÑßÑú£=¢ÿÄ4_éõHùþ©?Lt#´þ.ò\^ìèÿýœe£ÿ~áœáÇš"a‚“ù—îï¯ýiýÑÑbm¢¿cýKá¼þ´þI³M“E€Rnn,ëDGëöˆþÓDÿ‡ÿüÏÿIßæ»GëïnD÷ñ¡;.ô>€œû­Qw¹Ƚá¬ý]ÕÖŸH‡˜-úó"™Ò!úëŸeã­¿‹|‰ïMòAöIÑß¾iø­AÙa‚ÜdËÛ|Ö‰þµZÿ6À|,·þþJÙô¿%ò‚ÑsyxÏ­Aya‚ÜÜ”±­ý]Ößÿ£€<–[¯Túßçò£?­¿¬`¾Ÿ&|mÜĦÙú*¶þPœÖß»Ÿþ¡¼lôáç­AIaB8á4ÉhIHùî´­­ý]ÖŠ3Õú{wÒÿ9‹Óú¯Üú¯;€öØ÷hýŒÄZëïå¥ÿ`1ú;Z‘2L¬9€^Ø 7´þFb°õ÷RÓ,‹s†Ÿ5[ÿ¤cdÐM·Nô§õ0›­¿§OÿBþ1ú;ZÑe˜àC½@3òæ¶Nôw´þ†`¶õ/¥Æ?‡±¡õדÄãC½@[yo²M³Ikýý²@[ÿfäèßk‡é´þ9cšØ´òVY¦õ'÷h©cëßÌ@ÑŸÖ_L ÂÑÓ$ À²e7Ì­ÿãßm‘X­—a¦ÓúkOÞûLá4ñ°oÍmónëÿ¸ÞeÜàhý›ã0Ö_C8q¸þœâjXpó¼ÕúûûpÉ%—\ö½¤õo6ŒÃtZ e˜˜&XcYm ÍoýËŽã±Ö¯¿þºøbØQu3¯Ýú÷úDÓ!úwƆÖ_OsÁ4©ÑRé­Ö¿ßî<2A…0ÂGWçoHÕÖ¿ã™ öÑßÂ06´þzþœ!.tÚËS‰hCþ€¯¿2ÇvšÓúo}LÙË-TZ>—\rÙ÷Ò}ØÃÿþ}åWjýD믷åC›)ú'´þÿÙ•†²e‚JËÐ]ÕÍ<5ú»ßMþôôô¸|yyy\y\nòÓý Âü­ç%Ü\»¼^y0z´þ0¢´Ö¿Ë@©Yë/we¦¿ý…ûÞY ­?Œ(¡õ€9iý“¢¿/ãݮ߿9à{z}ô.?6˜Øƒhý`D ­?Ì¡qëÈâ­JÊè/¯÷<1i$´þ0"ZË)ÛúŸoMÊåF¢¿K|çÖFDë`9íõßï!Ìýiý`´þ–ÓøXÿéøq´þ0ZËáXÿûƒ¡õ€ÑúXNß3ü*öŒƒmbŸ4МY(81¸? £õ€ÑúXNÁÖÿæmÿ^ðVÎë‹ õ°œEZÿí8Ÿóá^ò06´þ0"ZË™¬õßúÇõ}²ß&êg‡±¡õ€ÑúXÎL­ì#¼{óÐúÀ”hý,gšÖ_“éóf£õ€)ÑúXέ¿2Ð;uôßÏIëS¢õ°œiZÿöÃØÐúÀˆhý,çNëߌý{ ã0ÖÆBë`9wZÿfŠþ´þ0 ZË¡õÏÆa:­?Œ…ÖÀrhý³‡q˜Nëc¡õ°Zÿìa¦ÓúÀXhý,'£õ~~î2ÔCôï>Œ ­?ŒˆÖÀrR[ÿ^Û}ý- cCë#¢õ°œ¤ÖA´þ0"ZËyÍÇŸ9ÿ÷ÎOZ[ÿ-¯Óú€Y´þ–óš_|ñÅ~ ­ªCë—ýiý 6ZËÙ:foK®D½Cë¿÷æÍ›Œè|†èeí[ÿ໵D³ÙGáXÿ§§§ÇåËËKl9—3è=¥YζÆýüçëáùXÿí¦¼è|†èem­ìÝZ¢?€Ù(Ïð£‰ãÊÈ~Iýýlrô/8°Ø+áÇÛþ'ý ¬­õßÛW6D³QžágkÐå~}?Å_ÙGäóÄs1œ'v¯Ôè¾cl°Ï÷ªq†cý žý±þÛD¢?€™%µþÊèY½Âw0 ÇÖââ;y«“ï®yóúÀˆ8Àå$µþ©Wö’ö4-~lßCØKÉ84(5ús^gø°œÔcýïDÿýúè»×ýè^ò6]3€m"­?ŒˆÖÀròZÿ`ÈÖ·þÁ‰—Ýüá^‡›„{é—,ß%öXhý`D´þ–“q†Ÿ¤ÃfJM<ÏP0ús¬?,ˆÖÀrR[ýuåÁ/?Œ+Üëfô—y9lWù ?´þP­?€å<¯¿’~uµFë#¢õ°œŒÖ?†èOë¡õ°}ëï>> æàr†â”kl00Z­?€å([hý`D´þ–£lý! õ€ÑúX­ÿ}´þ0"ZË¡õ¿ÖFDë`9´þ÷ÑúÀˆhý,‡Öÿ>Z­?€åÐúßGë#¢õ°Zÿûhý`D´þ–Cë­?ŒˆÖÀräÖÿùùùqùöíÛ~4͇~ÖÆBë`9Bëïs¿#úÇ£?­?Œ‚ÖÀrbóïÿûžÃ­? „ÖÀr‚óãzïqŠÖFAë`9çŽÙÿäòÎ¥ÿM–mýyŠ£õ°–CÇ\vá¿¡_ýuñÅTo„e[Þ‡€Jhý,äÜ1—â»êG°®±ð"j°Tëoá} .¹ä’˹/ƒ·‰þf³uÌÛ1åe/·`]iùÆGx¿õ/ûtÛd-ß­%ú˜šïß¿¯´|¬ë-ÿ¾ª#,Òú—bÿ}5~·–è`6 Ù{“ËnýG|—ƒK.¹ä²Áe³wk‰þ€ºxdÍÞ­%úêâ}è‹è¬…è,áÿ«æ>¿endstream endobj 117 0 obj 71 endobj 120 0 obj << /Length 2175 /Filter /FlateDecode >> stream xÚ­ÙŽ«FöÝ_"E¥˜PÉS&ËÕ”QFÓÑh”ä¶±MšðíÛ?gƒs&òƒ‹Sg¯Sg)ÄðSAÞ˜(³ÞÛ—U,àç•’Õ06S”<®¾üÁ©@ÅQg*xÜϘ<î~ ¿=æ§µ ûb½Qa»ÞcBýÕzc­ ש ϸ۴e^­7:Ëœ UºþýñÇÕ÷£`§õ§TC”[ݼ”´rVtKR)cé¦×—hP#5zЃÕá×VÝFE‰7>ËL±I¸]k^›ð ôï`EÈ>|[ë4lÎŒÑ[”x>ù»k^¿`Ôf?`­GØSÞ•Ûn¾îÊ0 }WPè€Jÿ«ÁËÿAW7(ñ™Q‰qÛ ÷ z´ ŒGk•‰”‹ùÙF@ÌO}AG‡%|ּܓ5ÚÖ3„”ÓY˜óçi^NtÒƒ×cѼ¼¸‘saÛ#Û7axî™c2î#êD^CÿWëxÿP~@®…0;ÇÑŠ;  ¢¶¨»p‹jÉûF¢ø•\B´vjƒfƒÙâù7ŒôZöGÆxW°OêCYÀ)¡$e!z-ˆó qŒÒAz ¶õyÛóòÝ äȃNû ÜÕaÕÊš{Kr,æ2F-x Þñâ@P‘•‹ôcQU¼|¥ Û5(š",ñá7‚…„£»™N?(fØP¯ŒÏ … 6£ &iB•"•v6Dë´Ã3(·>òçx ˆC‘„Сo'øð¨îýR—yS|ñ’×rQUø5ì¤ñxõÿÔ‚»Öä‘©ø)ʲ‰ˆuîÎyU½ñGQï:!(ñlŽK1†O}øðù87‰møO3Mäak8 X΃A¿Å.3Gš†/tÏ»!¿™À¶£xÒ¹ëùëip~”×âg2Ašbð•§Q4Ù(TûÓb5h*î:,y-àD¬lFY’P·‘¶Úqd²”ïÇñºVd>R6õóIg™ÅZðçê×ßã`uãǕоb‰T–éàe¥ãÈ¥.Õêß«MªžpÜLYRy12sáä&Yd¼e3¾¯×˜ÊÈñí]M9£’¿SÓ KÒtæE…5Q'štõÞhÒµ\*|ˆöm¦—ÄmB.XyÝqzÀ+{ÞÂHavzÖè(U©m‘ÓgK]ä5”íxðf}ÉQ u9ëÜ_1„ãHL"ÏTÞ0d¿Zâ \«1 'Dv€ÂŠyí@Ÿ¾Íy¹kvÅv!P”öê¯CU[áÆ:—F>I²ÿ?F–›)Ï›`HÖQlµút´NHHôß«ëÈò6Z!P£ØÙ”tµ6NîGëF9¸*Néô¼QÓn jÔ–{,Hö˜½FEUö1!žxy[`_yƒkd-^“猆ŇÅÇy_‚°R*t·”{ûkµw”뉅ȃÐËçŽz´šå¡à»52—f£ÁÚEtÄ`›‹÷g÷Üßì¥3Íž,ƒûÛ1I3TB„q—Z •ÛžKãD.˜Ý‘ŠLµæ')yû5C¸ü×qe ä›ÂñjAÐRÀ©Òö¤Áñ6SÄ… ä–!:è‡ò@å®`muêF—TÁ°×Tİ1â}R—†¨K4ÈýóR ⺃ÈzGÕåË÷/*ø®™ÜçÓB!Rem|ÐÁ~2 òfн šŠ9Œ´6QšâU»ç%šÖö ˜ßiPÃó\6$ˡ٠ðÏ©)À66+=d¢ÄX¹(,öá‰n%·IBŠüxh;¥*ö=¯D„‰Ó¥›úÐ1ÝÁ¼6[RÚFøO%b*ö=\8o¡m+v8ãØ©–ê©”—ŸrŒr“Î1êÐÌXâå4 ø‚€tËÏ ;:3¿çÝsYSMÄÉ(väá¼.È îKñ_fÙ%ÞçL¤HDéþïØ¤ rh±Ëâ!y­8¸êîY¦S¿d)1f[ÔPDóIg—·ý8Ï*^þ+Ã%©‡L |æTøÑȉ7}ÙÔCüE’0Shc¬Oæ®äÀÓê¦ÖŠ#O_f„µ% Ê"¶È­f(<ø½ØÜá<:Yˆ”RX^†HøÒ%Sñ_•c6>°—! T»¤y&æ"…‹¥æšª„w\‰–Ê ·Ê2û¤”LO1×ö¸Ís n6OÝe¦(¤<ñÕ—Žp½í²æ÷gà1Ó”ƒ¦èL¨¥4£VËq/7>(pn›cÇ4Ogžãh=註bŸŸ«Ë^)ÿƒÝIÒ˜0iêJÈàs•sò¬R}gøôbY…„mÁþjѦ'ªÚÅýò>y?ä݉ ¶Ô¸hyÒÉLDƒ-áÂè<6%sBô³·áÏ‘JOD`îéE *5:ü/šÊìå%ˆÚ"ȈfxƒAÙò†Ïd!T/Út;ÚqN™áÁÈÀÕ™=Aò«ÁìÝnìyÈ'CÄA=#ÎÇ9§ë{¡ú³D—Í8úâ&ðN–W£7‚Dák¢-7‘”Nðû* h8aëðÔ]Ç`Á©o‘ŽM%«ÁµˆÁ…¡|D“ç‚»1É©§lK¯Œ>ü'‹ÅÎÊdJž.I*8³–‡Ê‹~üIh)ÜðLOOVµ0é乀’N ~àcÂË3izkÑåms&7ª †ª‘·Xy´j(ì–"±š`«.I×'Γ˜Ð†Þ Á”ÔzŠ:üÄdU<£¤F©•yËœ@v©ˆ~kîµx‰,:ƒæ‰÷{¦œ±©Ê½Ä¥RÔƒðfA«¥ÀfõϪÃ- endstream endobj 119 0 obj << /Type /Page /Contents 120 0 R /Resources 118 0 R /MediaBox [0 0 612 792] /Parent 131 0 R /Annots [ 129 0 R ] >> endobj 129 0 obj << /Type /Annot /Border [0 0 0] /Rect [432.8488 519.4377 481.2125 529.1346] /Subtype /Link /A << /S /GoTo /D (figinitial) >> >> endobj 121 0 obj << /D [119 0 R /XYZ 90 720 null] >> endobj 122 0 obj << /D [119 0 R /XYZ 90 720 null] >> endobj 130 0 obj << /D [119 0 R /XYZ 90 508.4082 null] >> endobj 118 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F14 125 0 R /F3 128 0 R /F52 26 0 R /F54 112 0 R >> /XObject << /Im1 113 0 R >> /ProcSet [ /PDF /Text ] >> endobj 132 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/fig2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 133 0 R /BBox [0.00000000 0.00000000 208.00000000 208.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 134 0 R >>/XObject << /R8 135 0 R >>>> /Length 136 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`d`a3tõ,-Í , °Z —|®@ PUendstream endobj 133 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150404) /ModDate (D:20070503150404) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 134 0 obj << /Type /ExtGState /OPM 1 >> endobj 135 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 435 /Height 435 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 435 >> /Length 4414 >> stream xœíMrÛF†©Šsƒ8 ËEm³ò&Îd3«ØÊX¹/¢‹h”‹`2+p¡Ê̬½Ê&É,ÇWñC ÿh4úk¼K–HŠ@«_>x˜ ¸Qˆ¾»ŸO‘Z¯χ*³çSµÏý¸„¿\5ñÜ+D•Yý…‹jAŸF`€Jß”Ÿ>Ôžù¾ã‘EÆ?姇ֳÓ..uh7ÏÖ .c.BTzuž"‰fÐèÕyöÁ»ËRàëV¯Î3×.?võºˆï¨3{0<³ï¬`¿q)œ3ë:¼ª22<£,ÌŨÃTw0žªÛ?Œó¬]€Ê¡Y™ƒx:tC°ÜYtWÆ.rä©aÙæž:̃ü3ÔWfxvòì8x03&¡ x¦dvýfxÖÌÇ„Y©â|œrÇÜ9çͳzã8Õ3y:Úmd½É{:ˆ6Lé6y+ªFÖ_ëÐ]’ïP–Ø>¼{ÞHßx>x„Í3i6úYj¦ó ÌœnéhffÿðÝ(´ÌÚn™…òL?òd<ôÉÐfV‰ByÄmš›åꢨŸ•%ÉkQ¦­’[fÒ̪ûtDÏZ OƳAß4š2Å¡lÎìšÝnPfü¶$y-Öï–VyŸ ä9ŒŒ4³uߌè™)‘Û3ËVMÍÄÅÌL¹ÁÐL_‹-3ùÕ…Kf²gJfTÏôå>9<Ó7ƒÖÌŒi6¯è 123¿³ý)-©‹~/…Af²gÕ?S=3R3<ì©?8nsqάëŽÞ³ëoÃëð±þ•™Íï2=ŸÄÿVäø±z颸ºÎ¬Ú~"³ä9V¯Am3«Š ž¥ÏQÛo„gésÔŽÏàYúÀ3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~Dðì|‰Dök 0<;®=g« 0Q<[yÎòË,‚g+OZ~™-ïÙ~åYË/³(}¶ê´å—Y ÏÖ·ü2‹´ß¸âÄå—YÏÖœ¹ü2‹v|¶ÚÔå—Y,ÏY(bžYkîòË,šg«M^~™Å<߸Îìå—YDÏVš¾ü2‹{^ùË/³¨ž­2ùeûÿÏâÏ`~™Eöl…)Ì/³øÿO{óË,ºgÈl&«¼$ò$æ—Y|ÏbÏb~™­òº«¸¯ŸË.³5<›øÔ/ÿlœY˳i™½Þ…g8yVÞ qhœáäÙùUqAf¬<;_îĤÐòËŒgeqõ¬Ø…gøxV qW}¦‹–_fL<+‹ËëKq™bZ~™1ñ¬Å+qí³ ¢å—ÏΗÎ3ònH~™ñðìÚfM ºhùeÆÂ³²<+vóÀ&ž¯=öúÒôyã˜_f<«Ú¬>:›ÔhùeÆÀ³²þ÷Nº…Z~™1ð¬n3Ù³b7wœáàYÙôXßg×ÝÌp†ƒgu›õ{äFË/³ä=kÚL©3Aj´ü2Kݳsk–êY±›7ΤïYÙvØ]!÷Ù… Z~™%îYYØ=#˜–_f‰{Ö¶™^g‚Ðhùe–¶g·6SŽÎˆûŽùe–¶gå­¿î„Ög¢ØÍg÷¬k3›gÅnú8“¶geÿ¥Ùg£-¿ÌRö¬k3s¯‘Ðhùe–°geß]¯„Ùgc_’_f {Ö·™Ã³b7uœIÙ3©Í¬uV1F´ü2K׳óeгQ–_fÉzv–zëµ¥ËF¿6$¿ÌRõL¶Ìzt6Ú´ü2KÕ3¹Íœu&Æ4Z~™%êYYŒô¬ØMg’õ¬TzËÝg#DË/³4=SÚ̹×8®ÑòË,MÏ”6óÕ™-¿Ì’ôLm³ÏŠ}œIÓ³Rë,ýµ ú‡ß´ü2Kѳó…äÙ@£å—Y‚ž•ÚuUxCË/³=ÓÚÌ{t6¢ÑòË,=ÏJ½¯,¯¡¼6$¿Ì’óL·lŒgÞFË/³ä<ÓÛlLŸy-¿ÌRóLßgç™Ï´ü2KÍ3ýØÌùZÑÇhùe–˜gf›  í;æ—Ybž™m6ªÎ„§ÑòË,-Ï,m6Ö3g£å—YRž-]õÕåŘ>ÅŽ0Î$晥;ªþý|N£å—YJž™eö²ýübÔªì[Çü2KÉ3£Í¾ì¿þbr£å—YBž•zG½T®>ÜiÖÐòË,!Ïô6ûR»>Üj»±àLJžémöÒü–ÁZ³‰–_fÉx6dÙ¸VÛ[gòììë²þã…¿Ó,¢å—Y*žGX6¦ÕÌÐòË,ÏÔ6³tY·Õ¶Y"ž•#-nµÝ˜p&ÏÊ1]6êXÍ-¿ÌÒðìL°l¨ÕôÐòË, Ï”2óvY»Õ´ÐòË, Ïä6c™¿ÕvÃàLž•¤.>V»÷­Œ=ix&µÙhË|­–{f x&µÙÈ.ë±·šZ~™­ïÙdËÜ®í†À™<+'u™ÿXm70Î$àY¿Ï8Å2×äÎ?Î$àY×fä.ë1[Mj´ü2[Û³®Í&[foµ{ï8³¾gå¬.s«åœÙÊžµmöÕÇì­¶ó €3k{Ö–ÙŒ*“P[­-¿ÌÖõìÌ2³Õî=àÌÊž5¯y9§Ç<Çj÷îpfeÏÊ –é­¶s€3ëzV·Y˜.ë‘ZíÞ9άëÙ9¸ej«åšÙŠž•a»Ìr¬vïgÖôl!Ë”V»w €3kzV†ï²ž¶ÕòÌl5ÏÊå,“Zm—cfË{|‰T²ËlqÏšÐÔy»>õÏËZÖµÚ=<›¼"!çvÆr¹.“x!rÌlyÏú•‰[nÇ}¹¼em«íòË,’gÝ «öÇ/9.³~|ñïì2‹èY¿Ö+éÈ,²øžÙ¬ã˜<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ãÇf<‹ù§Yþì›ñ,Ú’¾®Hýçá×°Ï"fV‹å¶Ïbý)iéÉay3ˆ kØŒg+dÖ®8tnðÌÏ_Úõ»áÙÞÒH„ÌmCž%@˜Ü¶ãÙÞº¢{4›¾0;BÛñÌžÙ½ÉÉÝmE¾AùQ¶íY8ÍÄÍ4x gfáÞN(^f[ö,¨f­hð,¶Ì‚Zv3 žÑYXbe¶]Ïþ ÿy¯àY@¬™çžÄÌì¯%Þˆòž…ÃÈlË*îàY0ŒÌžQΆÀ³`è™-¤™¿Á³PX2[¢ÏúóŽöAùQ6êÙbšyÿ‹ ž‘02[Ȳ}A~”mz¶ fÂc<#¡d¶¤eÍÙ× ‚ü(›ôlYÍÜ¢Á3rf‹œc<#¡d¶øÚ¢Á3Rf Q>ì¡Á3RfËk&¡Á3}fË<ÏHt™E±LØEƒg$¤Ì"Xæ0 ž‘¸eK3«hðŒD—Y$Ë„í¼#<#ÑfO3›hðŒD›YŒc3÷ÙxF¢É,¦fÂ4 ž‘¨3‹jÙe¹Ì¶äYdÍŒÐà‰*³8g@<¦Á3mf±Y&³íxömtË íl<#Qg¶rhðŒÄ5³¿Å·L¨gCà‰ã·¿­ã™,<#q|ûϹ}öþ—)ûôF<£püæ_3={'Š_&< }6™«go‹–}_\ªË?¨ûïyðŒÂÕ³oŠbòÃß5‘—_‰ü´Dfòìú´ŸfÙûKÑ_~¡V»FÏæ¡yvùÌý­ã6‹­f‹ žÑÐ=Ÿ¹,ûžYa?V[4³zæ2í=íÄ–ëXÍ<£axf7ÒdòE?V[6³Ízf1ØdîV«"ƒgs±x¦›6Õ±[«©–Y"ƒg4lž©¦½£÷˜ëXmé̶ì™d}oѺ¼ðl>ÇýÑâYgÚŒ&3[Í¥<£qÍÌæYcÚÌ&SZ­9²lf÷¬2mÒ1™óXÍ<£Qý.ÓŸö»ÂYV]~ªºhfÛñlÿ§}’ßÇŠ žÑ¨7×.ZXÏ~®—¹lfòLüaŸæBöYí™=2xF£ù[vÑBn}›FxF£ý›.VÓ~½itDÏh´™-ÝhÞÈàÛß(³î;¾Ögq2Û–gvÑ‚yæÛðŒH÷77m4¿fðŒF—™U´@{Ž‘Á3ýß¶5ÚÃòÇfÍ ‚ü(›óÌnZF«#ûï3 )3[£Ù8֛ƙmÏ3›hÁ<{ƒ÷ó †’™eœslö@ð¾¹ÁPÞKË"Z€c•Ù¼?u8”Ì,6ÿ­ÝчgÁPßr‰F«ÛÌŸ <#¡½«iÚÜsŽ·c3x -³ðÖ´< ˆþžâæ¾ã¼FëN[Á³`™ß1ϳ¶ÍàY@ôÌl6§Ïn›Fx#3S´9{Ž]dð,Gã–·Ïfmo– ÏBaxf1mzh]› o0ðŒ„%3£Ñ¦Ÿsì7— <#aÉÌm²gJdžhà kf¡MÞ46+s "ȲeÏ Ñ&î9ê‘9Ãg$¬™é¦M<ç¨m›ÕÙäGÙ´gaÍ™#xFž™¾ï8霣¹ilVhDeÛžé¦Mõlä/OÃ3®Ì„êÚ„sŽŽÈl Á3žÌ„dÛ„=ÇŸÆÿ¶<£qô7ÛèGgd–ˆà¡ÌDc9´Ÿ ¯õ†g4Fdvåê9G_dFHðŒÆ¸Ì‚¯uï¾6y™ðláÕî]W¦/ž-½Þ½ýëK„g‹¯xoûrÎáÙòkÞ›_ÍZ<‹°ê½þżÅÁ³ëÞ«Ÿg. žEYù^þ4wað,ÊÊÃfÏ¢¬}ßÿ;{Yð,Òê÷žQY9³:/xFcí̪ÀàÕ3øoWÂrà»!lÇ3ËoÆD'̳f;žåÆ<ËxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆÞ³NðŒ•gפ®žýx½öÏpõìtýTo…x„g 8~¬?}]göŒ>ã@Õg¢É ûLÀ~#?p|ÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆók ¢yö¸öxÀTϾ{Æ…ÃEòÌÉéÑw/Xÿ”wžùàç$üSÞzvzp^® xtߋ˗Go"µgÞØ¯™…|a¦üêàÆÿ0©ð endstream endobj 136 0 obj 57 endobj 139 0 obj << /Length 3215 /Filter /FlateDecode >> stream xÚµ]ã¶ñý~Å¢O^ଊ’Èö©94AŠ&O AÓ­­]+§µ IÎæþ}ç‹eËÎå¡8à–‘œá|ÏÐê!‡êÁç•1™·Uõ°{û øó%£-¬Ø¦K¾yúð×o õ òÌç^=<½,yÚÿgóéPŸÕfj·j3îy°ëÚ®ýÌÓ=ñâýx± ‘xØË·éÐð #æ¼ “pEAŸÏéÀ1#z•Ú‡­É³¼pLôwMÿö¨+_VmÞMÈÁYhuäœb· ±W™³ºFàQ¯]=ެãéРżm¡-¥ÎŒ)ö7àÛ7#~éTWwÚ>׬ûô;±o¸­`óÂÞväÓhQSeúY gÒ¤XŽ[U™ÒÆ.å9žOÀ@ÔG´ÆWÀNù{ íE!z8ó%@Eiöü¸«ûµ!xA=òÇgºu-@4¦»¶ûù”úÈÛ#›L\óŒº%‹ˆá󆙨ƒÅ¢pHÔ [‡X½¢È-‘˜ojüÔ¡±µÂ‹fàoýyg*Uro!}Ò‚)U±ùéô ¯ãü, ªÍñuɃ’xÎÑÞÎâ|¶èÎp Ê §H/öÍb€©J„ˆ wõ9Î,ô„A¿äEN94Ç H‘³ ÝM°KÉÙ=ÿ§‚N<òªŠG*L4à´ê·ÄwîÛaFÐLÖkìb_ V·½ì÷°Ý*°¨=±ÏCÒkÕl>4FÒßIÁ0ö™ÚÈÓÙ‡á·yH4BÐaÝe>Òá‘U8ò}¾Ýö‡ñîøõ™Ýnú¢€Ò­WÄ’3©ßš¡W*·O™ýÞ‘|V QMÎRRË…õÐ,xÌD§D)&7Aþ²dŠ¬Ò•–r¡3yÆèrÇ⦬£+ø*›•¹«î¡ó™)K%+Èþçxm#ÿI¤¸Öá1aÌ78–$ͤåü}ôBÒ { ‡À®^›HÐjлm¾?B–AžÈ©™Jœ ;Ðàd#µ8Iò[!—ö‘Ÿãqp³xÂ@öK.ö¦«¦fêhxË,, !Ç{ÉŸ¢*Õ‡fOb“Å _ÈÛGA¾f³H9Ú ”ð)Š&Ï7’à5IÐrP&(eZXtÌda²ZŸQ‹üN꣙uÞ‰íÃ5äø5¾NÎI‹en…Û¾Âh—•Eá¾ÚWüDõÁuå4í!QTú« üÃz¬—›,Å&ÉÁ”¬UÙ«P…fúÊcºÂõœZñ! ŸÓÈ©©)”ædš²Ž†½Cʆ$¢ûÇuU€ÕJ±ÐelЃ`ë›W*S”™…{ »ž« }T¯Í4®±×¸¬ªŠè؇E`%bvú"Y©•È_º{4Ϭ¼ ?ÔùVHe(½*dቌ2fl˜~ùæS‡ÛwÈÎÏŒ˜S1ÌŲÚp& ᚯLrH€‰¤ökT+Ÿ'}` :dc½J¸Êœ³Õ¬£…õËÒ ±½ÕŸIdÊÁ )¢;N”5 « ”gÀ‘b¦öÖ-™'¤»Ìc úZÚПOI *†°‚¡TYé¼ÿS¦ žàÇ9ŠTd.‰B.:lü €‡Ò:ÊC[ qa©ä[ƒÄ¬9EªBÄâFÀe(ä|KB)ÿTOÂs¯³¼*Ë%Ëv:]§¼«!æv|Bò-¦¼RzSKg¢;Ç/sr “«¸m%år”™rB‰YõéD®>ä"Ö¡ý;(I†¿Ç :ƒ.LbPsäo/-U[¶ð+ ·†X~3 ¶—µV…¾QÊÊͽ‹dY-Å`;–ì&;É‘š=on‹*qŦu^eÆF« ïØ£U÷ÝxÃ!9SšÛÉå1æ¡>ŽêO¤ø8²y× °TMûU•x¦»toµ©2U¹ U$úÁ+iÌÔU'ìºÑ'²>«Š<ºúÄMb·\Ö³BÑXüÅR—¡,J]Æ×¡ ¡­èÑt@j®ø‚ ±k¿$!ÔÌ8;Ì3)X¸Î‚'I¿CÿôJ³@ñÚùK\r#=Ä=b€–˜§Ãê¤NÄÝIX-d‰„ €×&ø½–ñðe€r$=ç¥ f+©ö{ÛQ S¥ ¨¹Æàƒˆƒ`jCNë]š5Vk ·wó!I}rÑs6‰N¬T®Ž6Ðt„•Vö·Ü‚ÕÞ¥.†â}åþsc9Þ«¨zÑy–êtP CšËüÛõ±>çp§po¸ÑBéä„$z*hÝÜb`ÚË×yTXé¦/ä.°v-·¦WºMç“$¯Ç˼’ºO‹œR§¸9i ï¼|ñ†°ìIé+Óþ¸¨¸«¬g™Ì*ÑQ%,¤#„ö×¾å×÷Ÿæ†Ó¬ÒG¸üPOIŸŽ¢1!>Q Û…—é´°)ÁßùpÜô…5õø%ôTè.t}h¦ðÅb*‚o Ò›x—†1" ïv»ËwzYx@™xYœÔd.»¹ç÷ªVè^°F¨*ƒ›+Ë[ÀÕPDzÎKùJž"¶+è.9ÁâîΨÖøœþ<É@èŽÈ©¢ O—+¾¾™…†ÕéËB>;œPžjµ""`Î i&¥®ˆ‘6fBšMÅŠ™®% ¦Ì”q!L~jŽ7»¯*§*ó¥ñWá”oï#©rÀaʯMD@_ÀmÚ›‰H•WL²²q­åBaÌE­–vŽ/•2j|KëÓ¦íóBÕÚv j-j½ˆâœîýÈ Ù{Jÿ)I¬¤@Ö‡ì…aøÆ¥+÷5BQ.v2S_‹ÅEÏh¨Ê¥Æ;! áÇkÖ;ý9¼ÂÌÏAÉV~ǰnØ8´^ZvÀ™_reð*åÙ$€;¶¸,ªûc“¼zÆw!lª÷I3·6»”`¬hXœ§®™š.}Emšë¦û®×m)þL¹/=}áÛN%-ñ!4ÐrLª0œs™ƒe —y÷çsÎbph+‚âíNM.„JưàÂÖâƒà™o;øžÎ+\…–¤8mB.›W÷ÙžÝæžï°–MºŠë—˪«”…ÊÝôÄ*³e|s¿ß‚[¯v§è| 8è°×T”·®tOœÏÊ2zôÿÕg:ª qùŠ Ïä‡1äUq´¹Ûi\‘t;aj7õkÝJE òLº=°t°Íü(뜽Sþ*§!ÒêàüÿM’þß›<êb3­–¼&ËsS¬„ÀØFÌë!Çe¾¨þL³ÀçÅf°#zD‹^¦“X|^†Ù®mæ´s7 ÅÏ?¡[²›c•²Aíbù-cWÂúU±pFJÒ8U$ÇiÁž¶ÙàK¼öï“Ûó‡Ù #¼0=Ì쮓˧?§òùƒ‡À_‡?”vüâw^ÉŠõŸR…ÈÂoÛWŠWt³Ñ™¾Ä ¹_¦ OL1¯üŒ+.ûüWÇ!XÉSÁS¥¶k½s›ébUïñ÷ô¼š÷+¹©Qú*M/ÕÅbƒ†}hÍ|’×jŽçYŽÔyB ò:4á•Iòe'_v@ÔÚ$Âj“9¯W~L Ë®á’hù# ù­W 7ý×U) ’ÿ·¡Þ¼ endstream endobj 138 0 obj << /Type /Page /Contents 139 0 R /Resources 137 0 R /MediaBox [0 0 612 792] /Parent 131 0 R /Annots [ 141 0 R ] >> endobj 141 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 89.6265 138.1421 100.5356] /Subtype /Link /A << /S /GoTo /D (figlookatworld) >> >> endobj 140 0 obj << /D [138 0 R /XYZ 90 720 null] >> endobj 137 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 143 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/ap.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 144 0 R /BBox [0.00000000 0.00000000 156.00000000 182.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 145 0 R >>/XObject << /R8 146 0 R >>>> /Length 147 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjf¢g6´0²2uôŒ--LLtMÀ cˆz —|®@ Ž¿?endstream endobj 144 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150401) /ModDate (D:20070503150401) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 145 0 obj << /Type /ExtGState /OPM 1 >> endobj 146 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 326 /Height 381 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 326 >> /Length 5936 >> stream xœí];rä8Í9ʸmµ;'ѹ€Ž¡ˆ 92ö­ ´CK†N ·­qç$±Å€ÌDâK€A¾ ©ªH? 3Aþ7 àøÇ·úëóu§i!¾ž'¿þr¾>á±Ïúk¼B,|þzÐøxwý¸žµWŸ…ϧEÞ Ü,YPjü|º_¹¯‰=¥Æ£å¼¯É"5>ïU?:ÃÊžRã/o¿ç†ßVö´]ýž»¿óxÁ_¾Yj”Û¢KµÔÎ~‹…©[jLÚr‡xô²纰@ÛwXÔ£FiËÏóz„K3+ Ïø¼§/Ÿ¯Ægè•Æ   ùj|ü¼[9&©ñAÂ5*çwòa¶è}-‰¿IÅÚÁŽj\ˆy_ëöJÓ»^Lÿxk…Ôȇ2ïö– +L’ï¦ù¡!îßù{!Ji†Õ”45>Ó“z~·Ô¨Oþy­—ïèÀJ)€aÃäêâ Áhæ™Ô”T52§’DJ®œÜîÐ K¾¡bmépV#58‰jä~gj¤Ô¸ù!%Üuº5 5NÿrÕhÉÔ¨ëé\ƒM;,70’[n`ˆ£Æ±lKiôuwÞÜð7Õ·ÙÝ]ûf#ôCØsc¶A>t½ÕØ'»«±S„ÔH—°]"¤FFä­Fj–Ûjü’£¬¯¯‡Ç0w{=Ør¬q±`Ôøþù4ñù°ˆxr,ïΓu­˜Ô8±ùü=»ãÔyøçk"ø×’˜÷øüߣè”øs ï›iœtyÓ˜·ŸÿL‘ü…Æ©­y¨ñ÷Ñu:|ÀOÖR?Ôøû{äòdýŸ¬ßÕh|ûQe³Å‘söo²+çNCcòÙO•ZRãMc\¶ñ¦1 ·mÜj,‚[Ep«±*¨qé/ô’aùÎVûveÓø¿´Â2¡qÕÛúI¿c„Ô(ýÆlyúàÑl Dã˺OûÊ‘EÂjyÒ¡G!“F¯C4†Ž6DãÔÇÿ©}ŠÔç0qè¿tµhäÛLjRãT}Gs6kqý¾|}|šëý¨wU‚ÆÑYÄõ“dxÔ8UsÂ1jVçÏ#¯Ô¦€Z ËùjTǩߩ(†QºfãúÏ}ºiÄgFªD´m\øð)Íÿõ‚AóŒ¿fÒh¯“FZj-ê<Ý ×÷Ñsf‘¶Q×MR¥°õŽ”>t%ß`ññZ4º¯™ït£àQ£Ú.(Fôy„Õhä ÐÈÛ0Þ¤m¨ÔE#°’ÞÓB|“Q¶Ñœ ©Ôk4êÚ§F²3ßéF!“Æ5:›lЍ|.¼V¶ÔbùšÕ¤Ñ×ÄÄØÆQ5ˆž9˵ìúeT»ÚÞÄà~£ëšùNw#ÞOæ(&2/æ ³k#L:<ë|øšñëðÄaÃ(&}WˆÅ¨î÷¨àáñ¸&Òwç{8+ù®‰ú¸ýEЇÇ­Æ"¸ÕX·‹à;¼¥ÿHVcƆÂ8 9'/ª± ‹g¡1²m<ú¨NÙ6}T§Ã­Æ"¸ÕX·‹ ¨FæHó´ ÜYØ+j´’Ráù# F dƒÐ?¾n5bþ@ûêiž‚{Û8`ˆs Ph¬‚ýjÄ9rä–PÖ€E˜:¥1F(d™½Lc~ɵ= Zy4¢&†þ²#%N¨¬FàôuLcLKC£ôãõ}yÕ9¥#Ûo”š˜PÏšöÑ/eì…ÊèQŒÔáxƒ“º¤ñ¢cjßH5Õt_ÖÃã©æÐxI5úGª©ÆæºjtŒTu6ÚÒ£ ‹Ü¸¬]#Uװן&yY5©.‹Ü=ä[Nî/ËÚO¦ñªjª>–µ«1ž‘*ÜjŒ†s¤Š›>ˆuâ²jGª*k¤jŒëðˆjL¼§OÿÌçÙÆ4Ïrçé˜iÍÄ&Hº½TrÕ˜U©™- ÷Ò0â´ÊÂB£'~‹/ o?ÒU¯ì^jäþPr@xbw[¥Ž¢q¹+Z¶›­»˜×¿}…^“›Ffn¥=™[é‚6Õë*ùÚ&ª1»¥–œŸDfÕ°'âÑ۰̳*D¬:¶îN+÷hbx¥FæÖ¦‘]åµ dÕKØF õB¢Ñ—mÄw8)Óá±*52·AqÏÌŽrÙHU#…@cÌ]Lò4±R+{$u\%›£+„岑®F ›F ÐÈ$hµÔŽ‚Ò66«‘×1¶ÀM#›œTý&±M ²ôÌtKML!5¾£¢‘¦ä˜î n¢¿ŠSÕ¢r«.õÂÔ<øit ¸U ©1ÉãtÓèPcšß®-&¸‚q©1 ­Ä©'îºÇ¶1ÍÄ©¤±·–ú§ Öj5ª1>:»L"Bj<1hhɱò¦èC4f2Ú±)Uõh,¤FbMjrlQWÕtL#r_e Z,JM®ÏiTMŽï––4V]¨?gшœpú¸D¢ÕH½@¯¿Ðø›|ge¬ÒuµhTŸF Õ•ÄtV¶Ø…t>Õ¸Ù_©wR#:K<R¼—F‹–üøòs52Æb¥Ö„:+õ^jÄçL|¡ËÁûh´&éØp!ó:3”`ÓÈ$(Ð8@ÓÔh¼F)•šxéqãòŽ*Çu"lbRÕˆÏ~=ø`¥6&^P£EŸ*X R«8€ß6jÿn:¶¨‘|ˆ¨ÔÄw¤Ûá •ZÄöÑCfKN#g'ÆM¶QD=Óúghbœ’Ü¡Šij4–ÊÝáAž^f¥§m˜QLáO£ùEX4byD÷[ÆÆnxÃù‘4Êê‘n@|~cœÔÃW5^ÒmׄxׄXzk¨$61/”Þ¨Š&ÐØ›¿1ŠÆäõ¬hA5F|{4ÎÚ+»·el ü/¦a UþþãÔ¤»5RyéD=³^ìpíuÇqj¦8<@§>ÀôJ×m0è6Nýƒ>=°¶z»\¥iì-NýŸ»#¿qÁP’Æ~[j < åÄEPUÐ(71$‘]ÑèÓ_YóW5PWýâáMŒí  ë2J«±™8u[ùõãÔ# ˆ,¢¤µüÆâÔáãÙŠŒöòëÇ©kÑ]º’ÔˆGvG6*N͈{¦Ä( r‡1ZGûéªTAèiˆƒÜø€BÎ|êmžÇl5Z‹2ãÔºÓËû½dóƒf4éó©·zsÕ˜L£ŠS§Óˆ~™R©£hT¶Þ6ú6¢h¬¬F>óÓ¸´3.i„;JÉþF\a²<™-u:Iq4âå)¶›Ç`Ðlk£ç1³ß˜¥Fé‡Fcb J¯Z9hÄá+ËßH¶µÉó˜ĵB¦Ñ§vÓˆ;6Ü6ª_¦ÚF½ ÙßÈøØàyl3N½b¥&WL6Ãv[‰S—@æ|ê46§.€¼ùÔ[<}ûIGGò7Z£f”c=}{¿](nQúSK¨Gcqê–üIh*N½ëûSïºÇ~[ê]÷ØoK½ëo5Á­Æ"¸ÕXñjÿqܘzw´¬FÁo d<ÐXòÉ®{LP#aRò S1ÎU‚bƒ‹ÖÕˆ<#fÖ§>ø˜¬ F¿–¸Ñz´®Fì`Iå† 4¿i œI@*7$&Ÿ¸i4ÓÈÌ1L¨ò'Rc"’+m} ¾æ¬‰¬«Pyó;±C ±< ÖÕÈ*aj¥›F[„KÒ”Ÿ¡R§ö›ž|â´œF³ýxA6¯F4ŠIëðú¢hD•šAÍ«ÑB‘&÷OÞÄĪ‘Á¦1”|B;<ó2Š9w‡'¬Æ@ÞjZòI¡Ž¶Œ–ÕDRòI¯4Vô7Ú:®›{Ò©wÇDãÞ¾ìÓû½ûãCýjš˜bjô?tœ4òy·hÞîIPR1÷,=3*{x®DcEc0ߢ4šÑ›¿14}Ô‚µ7ïwT¿ÕÄQdØœþÔx—P#ºi›«Ã¥oPe2¬òØ%7®¢Fë6hf]9»îлõ¸q5®dÕÂŽ ðXÕ_Ó}j’Ξ—Ƙéå]#Ù¶« 71#Y>1Ãd*µ“6hFó±ɶߎ{$Ä,ÌjØBcú]¿e8\%‘£FÜyh$} /Pú®ß‡!Ë6šóµˆà´äÓˆ—ר‰‘«ÆU*"v£¡M /+¨1¹‰9~5†bTº±Fo¸o†mâN#Éña¶1ñ®ß‡Á«ÆÈUšNšVU.R=<›hŒlÅIb1ÛæR†‡[‹À“Kùç/<=-ÉÇU¼ß¦U$´&û2j$)¿f1]ÚGBsa¨'lp5 w½±hçŽ/õĈíäeÔ¸~ðÒȆS¸ž›1qhøÔxPça¢b1hq Ô#Ff|j uÈCº¬` ð…GÉQ±ÇQ8hdžñ¨ýj g ]c'-ЈGšŽ–Z¤ù ì›UiøÕO#95jb|ýFî#¡MŒ¦ÑÕÄ$«I˜°xgA{#p7ÁüH,¾Æ@,Æì7Ñës^€Ž™{b@î𤪑ÒÖ#1µÛ÷gÎ _pq“y4Æ>­lȶ?g”ݬ·7x#’9ª1äÞ‰ÆdÛÈb1ú¸ˆïÕ”±º ju Ç¢¸Í²;ÊQ#ŘCc²ú`z#àZÝvÐÅ,ÛˆÎ]l©]ï ^k¶ãÕ«FÖÐ~£Ôv8š^|ksüj ?TÕ49<³ÍdìÏü»Šux‚W‡3J§¶Æbngl‹Åœ´ –GoþƃЛ÷û Üj,‚[Ep«±n5Á­Æ"¸ÕX·‹àVcÜj,§soç~’™®…áTc&/×T²G9ºJz EGð¨ñ¦1·‹àZjxÚ‰»¤#Ék©1i.|*Rc[ \O:¾¥Àœí(‰Þƒ5&\™™Æ@Î Ïåã'ŠþÛ¹SÛ`hŒ¼¥Ân„Õ˜ý[hôgpåÑX$ŸBq(dºáí£"$ÛÆ*jŒ¢Ñ}¢¶ Û‘F“ gŽ!|?£Û˜E£™“#\kPçÀrmõ)™ó]³W†ekãæ"¹hD™pæ˜ÃÔR#š“ã¡QÈ“â4’$©  ‚F³œ˜Çª©ÑáT#;hDeÂ6*€U\BºG1?÷Þã¿]ªñ8ûR£jsõÓBÑý”Ôr„9Ó} IK:UãˆïÖ½äጃ›¡r4v¦F•N±4Ú¸ÕÈhÔ"ñ=Ót =˜lÔu!Û¸nWcB—ë4r#¦Ñ,ÀO÷۪ƌz+!Ç,Jš'EÞ#Š‚@#¦r]Ž^ßMA¾ÿFD55âòúsr,$’Fä½™PœF5ßnÏM£2yy4Ž0ªF+`ä )¹½Š÷.D „ ™4šBœFüÕOcÅ™4]”Ð1O ïÝÂ;“i¥(‹FÔ|ùÖ£›˜Š37/ !Õs°i”œÕ8Î2$ÓÈû6d¡^¹îå Û¨N FüKD#Ð †häpó°UÕˆf"X4B£W™ÛZVe4Ö‰©4âåA£R.†¸° ª«Ñš¥·9O ïÝâ4ö“ߨlãˆ'X4FÌ“Z~1ÿíâÚ6¶Aã.3${£¡üF(O¨«FŽÒ4:ÂÊÁÄ<ÄnÔS£}½KK´M`ç7šÿeÐkdP×^GbžZ xP‰š.k̉ ¹€>#ƒšFÔB4ê - *a°Gƒj(èÌLé[¸6c‘RÿÖ{E}Ž®Õhþ[4*%N°i”›^—€žÕh™¨”ø ‰©‘/ö¶IýeÛi©A¢Q«4…F³X@Ù¶ ÒHýÄ»énKؘ3¦‰é/¿‘X8B£é²îø€5æŒìðô—m+ÀÛãÞÒïXêÓØY¶­TûƒÑzj9RããÛ·™Æ¯¶Ñ*eÙ&Äã ~DåNC#L<~ ä7–¤ÑÁEcƹeϧ.¡Æ²-5¶N&ÔÁi\ (ÒÍíæ©õ€sBÄp]Ãù94zf"°•¦0n, j}D»Úp~cê(Fè^æÿ¬ïÓ§qä›s^Ô†Õ˜´Íˆ™ P>h¬‘më‰0@ú ±†­óµhDÖÏ6¹ÓXKÎ&fþ 41œF­XÓÄ(lbjÎD;<@ ¨¡bP‡Ç,i­ÃsÖ™Ñx™-Vê3ÎDpõb;Rã‘hO'ͶÝ{fÛî½Çþò!ÿêoAoÙ¶ÐÞÓ‹NŠÖž^tR¡ÆGƒÐ›‚¨Æ·£ê„°Õx³˜K¿Ž>¢s‚©ñõèã9-ˆÿúº_¹/£F'>_}k¯‚ J¾ xY¾ü,(5~>9_ð:åI]ýbaRã«÷B¼‚ý5`áAãø?’K¾åendstream endobj 147 0 obj 67 endobj 150 0 obj << /Length 972 /Filter /FlateDecode >> stream xÚVÉŽÛF½ë+tla»W6™œ’86$†È!È¢83´$R![1æïSKS‹GÁ»º–WÛã襂?½¬Ô2X++²Ù/To:½å ‘_ªü´Z¼yçõR+Y©J/WWNV›¿ÄÏOõ!Ó"¶Y®Å˜åÖZa¾ÏrçœXe¥G¼Æ®Þe¹©*ï…QÙß«_¿¬N½1w ýsç¬Yæ&x\Jo>ìÍòí°øã¬‚~¾•€V®ÝÒ™RÚpïºGÄ9¶˜€F³ðâ·€1l»¤¬QGN5>,Y}ÉPmÁn#1E•%]¥+ŠòqÈL j¹ J`ÕŽàÅÕÉ Ê›ã8’“þ¿ø˜Ë늴“ê¾Û€Ýf×&퇗Þ6 ~Ó6è N7`„Ù=Ԙ؆ß7b½ks²Øupj0±íKç#^>>!¾Hùæšk›k+µWe½ŽVH{±¦aˆC/Á-Å u_î1^[÷éØìº=oñèDYŒÀç2jÀsÊŒRÈÖŽ¬Í"BåÉ?t“TGš_¨$&T9RÎðÒ´tžºâCDmºMIQEê87œSç±:M‡2 xî7Ã*%Ö¤Ã*ÞЂõ¥§XãŒ=’id£¬|!>Ï›ø‚Óâ™jpD-Ö=¿LíŒñ k“ât Î$Ëã.—Ç/½ö$Šù­² ñ'NÉâjÝl)Ë2¸d°¯Ú7XB~#tn '²öºÄ¿×ˆ¾¿ÚTÒàú@#Bwðý„oïŽûiÛ½;WØ 3èæ¡§Û=ù˜æ’‚ä4çx´‚¨ç3vË‹ÏÜäÈBZRâi2F¾#f©1ä3 âB×[fÚ¾9á«u7˜ &úÅò—£#gz>“/°¾vF:ëB¢^ËÔû Ájmdé|q—`m"ØÕ²"¬¶ë¾IÂO˜ã×í»â×’‚¼§ý TúeÇ7†É•ÒørýtÀnñÑÄ›c¤:ñ¾eòXG UÐ÷€C¶3†¿ +£Æ±Öª’ª2óF½6ΰI êcœB¿áˆS»K¼0”Ò»bNë=g΋ egÉ ¾¬Ee’-R¢© }‰?LY{A“yu&J” ¿Ý—S‰Dí‚y¥EPq_–öÿá¬`‹òîæ—…ž–¬g(¸(.XA߃4…ÄÓãô’EÝk`¾Iù@\á¿týÌÂa=5ówdD'·_í5†|ß2ËÓg¾k¿Ì‹÷ÖtQ endstream endobj 149 0 obj << /Type /Page /Contents 150 0 R /Resources 148 0 R /MediaBox [0 0 612 792] /Parent 131 0 R >> endobj 151 0 obj << /D [149 0 R /XYZ 90 720 null] >> endobj 142 0 obj << /D [149 0 R /XYZ 90 684.1345 null] >> endobj 152 0 obj << /D [149 0 R /XYZ 90 342.3674 null] >> endobj 148 0 obj << /Font << /F51 9 0 R /F54 112 0 R >> /XObject << /Im2 132 0 R /Im3 143 0 R >> /ProcSet [ /PDF /Text ] >> endobj 153 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/color.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 154 0 R /BBox [0.00000000 0.00000000 106.00000000 104.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 155 0 R >>/XObject << /R8 156 0 R >>>> /Length 157 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h`j4406R0Ô³´43°T0ц… .ù\@!Ùendstream endobj 154 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150406) /ModDate (D:20070503150406) /Title (blah-000.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 155 0 obj << /Type /ExtGState /OPM 1 >> endobj 156 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 220 /Height 215 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 220 /Colors 3 >> /Length 2968 >> stream xœí=’Ô:…ïÛ èBV@$L2UÄ,ƒd’Þ9 ªf“±žg0ãÑèÏWÖ•tu}¾ªqu«Õú±NI¶¥ùPÆËßïß¿[$ýððpww×"q0„Ömº¤ÿñãÇ'Q.ï_¿~-x\J¿$»U@<}û[·é’þׯ_ÿ‰r •þö«OŒ¢]›.)¿yóÆwJÙ<è±P¤%š¶iÜ)WµâˆcÏ£«½¸Sj(%Žç9ºãÆûŒS.jmaÎxDµwÊE­®°q¹\¢ÚK:¥Ôu¢5³á×2p”:.­¹6k}j«(Ëœ²~†uÙ·îå®ãHµ©Û!;e}êÓ5Ü?^ñi…°Mù3/_¾¸élÞ×Ï)‹h ÝÊ€H¹C´M—&ã4mMg§\E  ÒÁ)™¢$§eçsJˆR%NI-;“Sfévën©pÃÀ)Ÿ•ž ÏEJ”nx‹×æ1蔥7xÜ_çŒ&ÖÍSÕn8Lˆ»îPÔ{hqJf®^äR§döÝ´§°¼²·OO%ͼ;lM¶û£Õå”E¢tóæ;eQß͉| /“pœ’ß“(rÊÝ,=–¼Eœ²´fŠõT¢$†SºoçpÊhÑó”:%¦8íà¸X©Å)Q䔜¥g„¸ÄÇà컦¸÷=\§|Vz’; 8å³:À)‡§|Vz‚Sê µSòS€S‚?´vʦ4á”àMòp:GœrÊY%™9Þýeø:Γ7%‰¤&Õ¦9§\ï¾,ï]µn·d*ÙN ‹`CH%å:¥«Ô?¢¼½½õ²ÄºoЇÕ)]‰?uß[ÐãÇý‹NÅÍÍM¸½Àåry&J×EQ¾|ù²w1Áiøõë×*ÊgòDé΀è¯SB” ×ëõÝ»w›S²fß®S.ŠXz`?~,ÇM”Üë”ä8%D dñDI‡r–®?!…­¶4˜S*¬^È:R] Ehkµµ„R³mU]E¨jµ­„RIõ¢@”!ªZ-%J‚Sž U­§PÕjpJzÎXU­§ ›(Û]4PÕjpJúT¹é¨CU«õvÊ%õõÅ·oßWí)G//ˆ2$U…­½Vú´Z?§\«·ÕÊ{Ûˆ’C¦ÕܳקÕú9e(Ž0¤%U­ÖÉ)wkâv®›.¯£=~*~*‘h³g¦¯ÊÑÊF-'_N/\‰(½@‘†óèä”yQºÂá×™ªD™ÆÌ(J‘† £Å)Suö~d)E.ÊT‡˜ï+uŠ’sÎwÃ=T8%%fy¥¢ôBfe'bC”^Rz2ìÑê2>|L™ê¹ò(lˆ’Óaª˜}‹ôªDV?˜šú(e¦„­EI=¯S2ç(ùñõ,0œb½Dø ¢ä7"¿áÂÂh¹£ã†§&¤aè%• Ô,Êð£”ñë¼£Ã9ç» ç{ßH;ݷJD9<%$€ÈuÊhä¦ÅvQÕjpJDîèd"¯@”pÊ ßûœRˆR8¥¥,pJ JYà”@”²´rÊëõ:¨F\ÄEÙ§ÊME©ªÕ„RUÝRÈŠ²[•Û‰R[«I:%R`J 8¥YÞ¿?ºGøþý;œÒ,‹(?þ<ºżxñb¼S®%‚¬³"3¢à”¥,Ÿ>}Z[ÄŒ(©Ò)Kt¥GQ¾zõ*üèíÛ·•5LñóçÏF)e=cÆDY딣Dy½^‡àGŽfg“¢$…NÉ,‰lÝÖnÌTv0)JN Qò1)J‚SNIQ 8e4'ˆ²&EIpÊ©1)JŒ)çÆ¤( N95&E §œ“¢$8åÔ˜å°{ߥ&EI£ž‚(E0)JNÉ\D²ˆ’¿Ü¢TËNÙhYD©ENÉÆìbL”4Ä)¡HYŒ‰ktì`F”„ÕŒf0#J8¥̈’à”f0#J¬f´€±%¶„uß³co‰­ŒSæ·›÷P~ßo®e¾&/žSýSB´÷9<̈RÃ2_“¢”žr÷ÿòM!ÊY 1)JjñegpGgˆ²3Šî}C”"˜¥®ÕŒ€(;§Üg®e¾&E §ô™k™¯IQÒ(§Ä‚FAŒ‰rŒSB‘²%aŽ̈«í`F”„5:0¶p «§ÇÞÂ1ªqÊÔ³‡wòUŽÂ5e&/ U9%D™¢Ûš2“¢$ñ5:³?º–AáH“¢Äó”@”-Àó”U@”-hµšÑåî#•¥“ Jñë”eDɧá“ç‹™@”^L‚([ÜÑ(= J> ïèð÷o(½˜Q¶Û!¢Ü€(ù(º÷ Qn1 ¢Tò”D¹Å$ˆNy…kÊLŠ’à”|®)3)ÊaN‰e:‚%á3À˜(±FÇfDIX͆§ê0è”X‰65‹ :%D9/ë-³N¹®}±ÉɬSB”Ó‘%Á)Á(à”@pJ 8%Pœ¨ã¤N¹ýƒŠm‘à~êÅÙýbfí‡l¦™øüL3JÃ9£SzÒÙ]E´EÈ|q÷ßXífÊÜ,U‘LwkZzêŽqF§,:³E[*d"L-J~‚"trʰ¯¡½.,Õe¤¾bC”©tDDYš¸)§Œ¶ewÀrCÂsA ]Ö‹23ÓSWŠÒ}»›'~åÏ/¬©5§Ì7a>Â1_i!JJ·PiRE¦[:f-Í”_S槆aNIYÍí~½ƒ(ù#0N©*Ey,¼]M™µ8Æ0§¬«1ÏDÉÉTVÍ"ôsJ/$Sçpºs¬Ë¨屦œè¤º‘Ýp‘×dZj§¬<¥¢äq9•*Í´§(wN:E©bLÙh¢C13&†(S_d–Š“i4ñÒp~¦™¬&ÓJÎ8ûÊQá”ôøû ¦©^ƒ*®SåhqÊ-d}}¼ïÖŒ)rÎxï(çŒO åÀ):à”@pJ 8%Pœ¨N Ôaß)±eõ¤˜uJ(r^l:%˜ƒN fÇ Sb'ß© ·—&N QÎKt{i;N‰KBÓë”@ö¯SB”Ó§ê€SuÀ):ú9%sµüú‚¿OAˆrRÊœòöövuG÷("ÊèÛow£k!ÊÝõÝö(Š@å+°Ëq§„"A#:åÀƒ3Pì”Ëg#Ë ÎASº;ЖS®¯qıç1甂¬¦Û"e0ЦmwJñ<Ö‘ti†vmwJo7Àú#=n¨µí›…ãìÇÖmúä”íf6[¥úÓ´Mÿ‰Uü3èÆendstream endobj 157 0 obj 62 endobj 160 0 obj << /Length 3011 /Filter /FlateDecode >> stream xÚZ[oÜ6~ϯ0öÅ2QEŠÔeû”8MÚE7ÝmŒ‹6ÀÊ3òŒä•4uýï÷ÜHI6íz<EžëwŽ¢Îø§ÎÊä,OÓ¸4y~¶=¾JdúË+%£ ¬Ø,—¼½zõÕ{«ÎT—I©Î®nVD®v¿D—‡êöBES}±QÑp±IÓ4Ò½Øc¢«‹"Nø¶šª½Øè²´6ÒêâóÕß^}så¶Zÿk¸ä¼e…‰Uj,ñv×t;8½¿ÐEt§Ytãþ„6Ú"ÏUÇGX–G¿ãûš×6È9û_•òpêy}ßɲ±ÙÉè7ßóëÝ»«ý¾éö<ÑL#¯ºCu¤=9ð8ÁóAhãPˆ›2ߺÇþ4Ê–k˜>M¸¶ïP’  JceVÉŽ/ÜÅôR™9Ûè$β"£Wp¼ù™¥üt'I‘=\ôæööÂ*ü©úÛmy†÷®doKØ[Ù{ RÅ… _P{ ü·5Þ?-ŠY8M*€kè2š†žÖ¢l†Gª¨[óÜt@ut{y¬®QH†tÄ+øH<ãϨDøòCÝY¿@”øºã;Ò l$ymÊ,.3•¯eÚÃy`º¿ÕÄ0Ê~ÄA ³ÊD{´ÿÔ^ƒ©=sSßüÜÓ¹‹ÈgÒ„Êl\X•‰8©n`ib¢Ï@)/£÷9ˆ€•1µ¡b“[·½ê‚‡hX”þˆZˆ³Û‡‰š".JO”®n£Ëõ²EÙ~ák‚6á7súœ«X§úåÛ4Î ¿ï5kÊ(gI¶Ö^MÔõ¨Œ††If©šøÁ›DSßñL3òoç">°#ãB'0Ü/HYø!ÆiØßðáÓAŽä„¶ºcÛ©³æÁôz¤ ²4©y(KزDrð\í+rƒÛËŽàa\8Öt™GûžÙØñqÂ0:ºt–Ù8&Yzí"#Fy¸EËĦæÈô‹ˆ\~ÇÓìQ9<ËŠ†È›»Ã¾–~öâêø„ság%Žn‡ ˆ𖺣ø°?ð#ê9”Э^Ì֜HîŠ&±¬@¯8Dm âÛÖ Š ?eñ£²…ø³Ñé üY£?+Ùî ›NqçêГS¿ßûàâæù^þ¾ÿáÇÐÑi£þ|Æ3Þˆ0ú¶—SÙ÷zÊ8=»ðÀ‹¯U]Ý:{Èã$ÓÅÚÆCjÙŸI™€|êªæýšØÄ9R]?ÄtªÐ±Ím’JâÜh‹  ¦éõØùu›åº{L}ßìQöƒ¡ŽáÁ<äE§@&-튗ÈôëþŒ—Ç‘ˆŠÝÙÿñd–eãÌÂ^ ÷ÕwGsö®õÏà%†k€bQEð†„°!û²¾Q—Ÿifuã‹P,žñXìb&ääâRˆ`ŒRb­4Ü™½«m¯Ãf F”[è¾ Ùo+ñŠ •<¶*u@ãSˆF(ßûÀkfOP(ü–`9Ú¹ûOO2µ¦·E\Z0.…{»ì¿§/|ßç#ÏpשF*iÂB«&Ra55„Úåç• ൘R!6J”VÈÀfåÚ+Ñã#ì錩«‰úȆ©¤\hP×ÅSQcŽÉœœ¿ý„´‚ÂÑÀL¢ìã`‡Ä÷ çM*oJôƒà¦ÁÄÁ¡fQò6Oy ÄƶÙ9{ùaÔZeTWRÀÖ;©dÏžgêNÀ¢2àYYn )„uÝžÜé˜RÁ·>âÄ‘=‰qÙ†qI)Qæ=”h•ç—0Øï§?þˆøð–×9¬„/¾ýô\ð†áxOןê£ÞVÝLU@JâC/£#¼†#à¥ÑLõ.ˆ©jJç‚ÆŽã©?òê&-´ Y˜p©Á©¡Àß ¹KÙ•båIH×Ie[jÂÏ}w>Άú÷†™Ì‰õÃä›Z&)çøc&p/©9ËWa!·qæ_…s)`*‡¯‰Ñ‚3võÂÆI’fë²ÄüU—!¨L÷Â+ÓÕ¡¾-q¤íšðˆÈ<ÝH!+sáó‚;ñ)‹¯zœµÞJìÒ@:ôÃäJig-Jbßx&#wã^ê²ù"„éÒ’sJ€±eú çP'œÜaýÍôkôlë\R¾oLƒÈ5ÆTøW¿ŒAøjŸƒ´rnb>CªÀŽ¢W†ë¼VÃÈWáX¶ø ’ç«ø“Ë7jøåïßͶšdíiܧKëïý8ñbjÄÀï²ä<—¼2Mf4O–…VRR£–¾(­Ò¾ ¶å0mOô}Øø"Ö¨E™c¤‚ƒeöÆ#).Œ\ VB¹¹ P¸“F( ¼}–ϵt3ÎÄdxâdƒ¥ò©e tÓ…?ÈN3¦Iá ª[Ò’TTÍ4ޱ}Ž Ö&>Ôìµ$Aú(‰Û¹^IìôÝùävã<.‚y!*߬U0¿)é¿8¬ßTƒø—ð|”Ïñìk° íå[7>€…n½7þ»¸tÁÿ A3Z endstream endobj 159 0 obj << /Type /Page /Contents 160 0 R /Resources 158 0 R /MediaBox [0 0 612 792] /Parent 131 0 R /Annots [ 162 0 R ] >> endobj 162 0 obj << /Type /Annot /Border [0 0 0] /Rect [182.5758 548.0152 230.9395 558.9243] /Subtype /Link /A << /S /GoTo /D (figcolorchooser) >> >> endobj 161 0 obj << /D [159 0 R /XYZ 90 720 null] >> endobj 163 0 obj << /D [159 0 R /XYZ 90 537.5918 null] >> endobj 158 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F52 26 0 R /F67 85 0 R >> /XObject << /Im4 153 0 R >> /ProcSet [ /PDF /Text ] >> endobj 164 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/secondlinelist.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 165 0 R /BBox [0.00000000 0.00000000 158.00000000 270.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 166 0 R >>/XObject << /R8 167 0 R >>>> /Length 168 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjn©g62³4×3ª2¶´01¶P0Ô3´´42(·PpÉç B€Mendstream endobj 165 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150403) /ModDate (D:20070503150403) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 166 0 obj << /Type /ExtGState /OPM 1 >> endobj 167 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 329 /Height 562 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 329 >> /Length 6026 >> stream xœí;–ܶE᡼ԑ:Ô¼–Uò& atÒIžƒ{J*’×ê(”"§o*¯È"€‹ÿï€Y÷´Ý]E²ˆË£ âKÔo‚…Ñoâߨîo;2¹Þî?1ýøº8ùãsðçc9AdÿóüÜ‘Šìbqr}Òrè?îAµ 3âãÛÊdìˆ76rU܈?6&?þàŸúŸÕJÉäè`Žü#Ä‚¢bòëN™ä„z ¨˜ü­ ±Âú}CQ1ª =Y%H|.½Þ¯“þ¢éÙÊîàõ†ªƒ‹s“%'8«‚†‰Õb³8y_¶Ëcr;Ñv®÷¯÷ó,ÿŸKîõª=«Å_é¯oê™”îÓÉ$“†“÷ËobòÝóò,*crÍÞµL:H.¹ý]è¿×~LÚNÚÿ\(&í†Î»ÉÇŽ¯¤Ì9‰‹«ôõš™¬É¯¦_ß#I!Tî>—äz¿šx2i9¹xn2i9ix , “†“¥LÚç}O0IßžÂIÊäò«–IÇK›É“—7Â(Œ%ºì>{hÏúäÙµcçÜb&ab&AJ2ind&ÃJ0iyÉL•bÒ³Ýeò‡¨öímø0è®?¡ë½[ìß®™|_Fl?¾Ý›3^ýØ~V¯7´C3ùßõ0ï®Ö¿ë4¶oY?>Ä_ƒã9¬þóï2”-~_\îýÒ1õýïe¦ÀæärÃìdîNše73Y©•IZŸd&+ÅL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢”bòòøs»ÜÄý?VX)&¥}'Ṵ̀’LÞèKv2¬"&ïYýöÈðËŸû[6V+—I»ÿäÿ,­$“ëïur1sº£&±“¶ÊËn²…ETÁ$;éU“²Äa' •1¹Ù¸Õ‚„;±¸Ý÷¡ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢”`òû°À¡?Éë“ìdL¯†U)&ÿ´?Î’ú$,'ãL²“A9N2“•b&Qb&Qb&Qb&Qb&QªdÒœŒRvGúv`ðøÌ]FvÞW2ÙÝIó£ÙN>~2SŪŽÉ>FO[‚¤5¤ŽI9éBO¸Éiô­ž=$·=¦‘¹Db;ucΑ/ s>ÒE¨hŽÇ$q’Î ºÿ¯.Íݵmw6x$Ç…Nä/]¢*&IØž¹A­t—1}ÈÆšº@Œˆì?5©ŠÉV'×ÉD'}úµ:Vø?;¡“;0©r¬ï@²ÏxmA}'3˜Ô9QÝé©3æáqÒ{¼{`p¿ð99ØÈ*&•‰ª\ö•8¦tú}¼g›b2¸ß*i&t2—ÉGµDè—º†òxk8©kAä£[-èbŸã¦­²¢®Mëdm»ÛºßuÙÛŠ¯}´YQ!ú‚¬yæ¾içÞ©è%ÆÌ?—¤Ìqþ·ám%ÆøN0•¸%îŸD‰™D‰™D‰™D©É×½ã;’J˜d#c*`’•-žÓ‹3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰RÖºjÉ%™cϰi[D4k½ 9Ï'g3ÎI=Ií Nf¬a¹’~IÎ|'sÖ°ºl‹‘Ù÷¿îâžÖô²z,&!çì¨ÌuÕ.j¢¾o.dp2~ø¦!ÓIÌ9;ªI¹Eß»œ‰Ìôo=î"¢íçì¨2&e¦&+yzÜAænÌ9;ª’IcŸÉí¨ú˶œ„œ³£òËn¯“žG!¬J ì> 9gGÕ'}3éÇ3[ÿ™Jœü6ŽšioÌ ×#Åì“Ö‚¸Ý ÷¡ÄL¢ÄL¢ÄL¢e²ïJº)è©ØS.28Æd×ËY—üînÚ!éJ%"Ž3Ùo¾þcºûwñ²¼ùòÏú[ì“t¥RÇ™ÜÇÉ/âúbÇ5·“¾ˆg`ò,N&˜¼têfÄuGþ5“žK©ˆ“L²“›ÒNŽfr G½ I›½£™½ºŠRg²ÙI5¼$ßrr0“[4ú•NšöËGd$÷v2ñp&óœÜƈU%é±´,¼Ü¬/†D)íäX&_ÅUn}M8YöFÈã„”' Ùa”Šx4“¯*,Ÿ“êxß°3jD†–]t£TÄ£™|Ñ[“¹[˜n§ :)“)ñp&éö2'Íábáe¨´“£ï“R×Ô}2”«UÙ=ÚÉ“7¼—†“¿db¹NZ%Ž3]©s‰SÏälN: ®é6Ž\ß­o-Hošì>q2¬“Rwöñ÷ÉR'G-¸–º³ÉA ®¥"Ýg^™»(íäØ>ó39ÉL扙D‰™DéÐLfõ™—?ÆVv¨TºWmb&óœ¤ÓŽsÕâd°WíLFd>d©ÁÉêvw'Õ´»££æ$jã»_ô&ãó•W·»;©ÂÉøèCà ðçj#>&“Û»œÑ³ï÷²Áù\mÄ'`2>ú@r·ääÌLŒ>èÜÍL69é±m:&ãµ¹ZáFŒú¤ûÝ/Á'Øj#®gr6'Z¤£¾?Fh7…ó[ŸZÐÄ÷ɰ:üÛ¦tèû¤W£GNÄäàчó09J'dr˜I”˜I”˜I”@LZ\\\ÈÑs3ºxÇ0©êo3:©Z‹îf¤ LêɈ£œŒH÷`x6…`Rwýá¦wö}0Öo±Þ·×åLZ}*u}‰ÒÔÔ¯ >úéÉÄDÜÔ?9ÌÉòчÈ ˆ˜|¼?ßÒiô!v(âöúäÜNÊnÝàÍ‘ƒÚ83”8éчÁ%Nvgx-ÈŠÃ}] :d»^ïNë|}AóŽ>ŽÉiGŽÆä(ÉAb&Qb&Qb&Q‚0y©/,­ŠŸz‹ë3/«[ÖWDý“êqôŠŸÉÉ$“îý¼ANV¥Ý|°!Pÿ¤ŽB?Ó¯úoìOvßt“WöÇóÜèC0 ó8+øòê=¨ÏÜpRužêg5H§–Ñ-£Ì°»ep£¡$¬ÿiðU‹dtaRþ@u¥ÎnãrÜú 7ú`ÜÂý˜ft]–=˜¤—`=k voYO;íéµ’(sR~éd“ö³Î?7ÉzLF´“(f²LȲۈÂýjœ¨“v–ÜÙI;[wq2¿>IïÝÒIZâÐ[{‡GåêD‰ã?ÎûëdAG®l$¯OnRñêÝ´ã_Ö“V›jABÝš±¡+^¡ãdtýjA‡lwçæÎŠ\Òùú‚r3&z”â„LæfLð(ÅüLFV—JÓ3[]v*ÍÎd(®#:9þ»H|qÑIf2OÈv÷C´¡Ö/®ì>sÙ_Ô}2²/è!Òâð+Ëg˜“nŠÀÚ8U&ãáöp2®IœL3©{óUߘÙx%óïn™‘åLGH ¡C ˜´{òUîö÷¶ôÊÝ‘ù¥²ÓÄì—·ñÏ>'ížB÷mu\£ÆošÐû>û`\”ÏI:ÂÐWÁèéàSé“-“2i\—µÇah« ÏÜ.uhâ6'“q'õ°ÃD¢l¼\Ÿù¤NZ¡t²t£Ž£mG…`òb:xš¾è¸*F.j©cá}¢-`ÈÚ,º(<€Ž«rô!và¥)`lÿ¤·‹°.Ót}Â`[ÀØ>s'¶í:;ÄU3ú@»ÿ„ßÉú€w`²N½úÌ·,c²SÄmLÎédøo_'k˜Râ$GìÜ÷}Kœ &Õ‚‚‰»÷IY!¢h ¸c»»%§ì?úÐí¢.}A€€G@Ã}˜lØsô3\Áý“(qÿ$JÌ$JÌ$JÌ$Jøyæ>YÇd´Ë jæ¾–áãåú;¦´OŸyO'/7ròÑ›ŠÏ:A­F1Ù—JZ¹J5™ØnNf>û Ãv… K ØÃy/×Ií=·ºq.Ì!µéÑ Ÿ¡Cæ™n¾¹Ý1î\ÔTÇK¦“¤Ã3BpõõÙ3SÛ„géýS×­zn¢ÑçŽ>ÐÞ ·M˜¬áØ· ;Ïܾ ÑÙI’»Izî?¢öƒx«pLÚ@È+èë¤/=sÓEeå£0)ܵ–h¼'C—P\ J9ér:/“FábÝö{•8BëlNî Åßö/q²™TäÙ„êøZ*3禷N™˜Q3>1“ZÑì Ž«¶Ý Ï#`_¬Qî×ÌeÒí×äþÉ“¾ˆãL¾Š~J´{&]©Tk1Âd׫ù妰WÒ•ŠGc’U (“¬1“(1“(%ÊVsú&]©xÄñúdG½FÙŸÑÉDÄq&Õ˜ÅñOvŠ_B;þ!g¡•Z_\uI…“¡’ˆãL¾¨`®/3¸ …~}Yöü“W]Ò%ád¨(â &—³]E‰“Þ$×>f!#Ës²4é‚p2Tq’Éå\¿ÌÁÉ„bNþº7_×Èrœ,Oº œ •Eœ`òq1è¤xD–v²&é‚p2TqœÉWÙ²D:¹–̯)'«’.'Ce'˜ü)Õ(¤“K ç%ÍdMÒád¨,âä}òqA8'רòî“åI„“¡²ˆ3ÊîŸëŒ“Wy¦¼²»4é‚p2TqV}ò§(sòêßñòå*t=1¯>Y–tQ8*‰8³ó³ÄÉPä÷¸HË%·S’tQ8*‰8YvwSºìžM Lv}Ç5¡‘ L² Ä}æ(1“(1“(1“(1“(1“(1“(1“(1“(E™ü40°ƒ(s®;™ÒUOË`&[t†“Q&ù¦Ñw!ò™d'#²d&kÅL¢ÄL¢„dÒ¿bÏÍ}ÓçñÖÁB2©ž°¦âNžÈS(“öŠ=!'#Ž+8“äAõËcÍò=aò¢Ž8‰àLÚ+I+;h'­õ,N (“ëoÂ]MEn“» «ÓÎ ü}r}µüŠ:)è^§þ>)„ñe!'Õ:*gQ&åz¼Nò}2(ƒÉK'3˜d'-Ý-©erºUΆê“ð:™Å$;Ip’™,3‰3‰3‰3‰3‰3‰3‰3‰R“'lW“ì$ß'Qâû$JÌ$J-Lþ="àiõ¿&ÙIª€“¹LÞ.jyi+²Ë{`ðøì P#“Ý4?z@'3™ìcdð´3ÙÈä2§o}Àá"ÔW«y|úíE˜_é÷xQÇ©Î9è¼@ß~AÏñ˜`8JÍL'oöõ•ÏÖ.õl‰µÁs 9.t"ûø1jbrîñ –ÂÀS˜o]7zÁ6Ö’=a;Ù7“yL¶:)gìûœ4öé×êXáÿìtNî¤ʱ¾É>ãµõôNfö A<±í2ÿ“Þã݃ûÅœÌ쟲8ú¥]â˜ЂÁ>Þ³–8þýô¸ÌgR>½¤^Úµ ÃI] "ÝjA7ûô‹¬eE)\ šÔÉúv·u)¾+³·_ý8»"jlw²êƾª²·ú\bÌèúwXP&eŽó¿ o+1Æw‚)ÔtŸð´â>s”Çq¬Õ.ʃ<ò¢-Lvwò8¦¶1ÙÇÈS9™É¤|4[>©½6êtG¤|{3+ìÛûí°ò©eóy¢ùŸZnf’8é´ßtûÄ×Äólðh¯ë2­šçmNÒuèÝÎZ¼Á:ÄÝh¯M`.1³šçµ8¹5¤½Nû¯çÖH&UŽöHö©.Œ©Õ4CåÄ‹Ð/oÔ\ýGxœôïhäøiÕÂäßÒDU.ûJÓ R8Ç{¶¿ÄÉgRùÉ—v-ÈpRׂÈG·ZÐÅ>éÖC7Ó Þî¶r¡/SÚۦϸYBΟ´r¡/Sz3ꩬcÒj‹øš&Þmgv’û'‹Åý“(1“(1“(1“(µ0É«/™ªf’´TËäˆX'W“#_L~çTÎ$+$^%f%f%f¥"&¯#"<²™d#Êe’L)“IVøû»Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&QJ3y1§“ú§’žc‚i“RLªGåÔÇ3õðÇs+ÅäöBÊIVšI2)_.GCWœú©ûiÙ'Sò>I–53Y2ŸRò<ûlÊ(»Çë<Ï,z®{.eÕ'õ²=“ê店\”WŸ$_›/åv2¿ì9y¹±“«²ë“ù%Îó:™ÙÆ Õ‚„rSð¤Nr»"î B‰™D‰™D‰™D‰™D‰™D)Á$?}Â8Á$;“ñ@g’I~°;¨OÂr2Î$;”ã$3Y)f%f%f%f%f¥J&£Ó0rvy Ÿy¢¡}ó•LvwÒüè!Ìb²‘ÁÓÁÈJ&í…‰;¯°ïIƒžãF'† S5“t>Kïö'rŽŸËÉ&UØû¬°<Ùgœ{ˆª˜lu²p…}ãDÂÿÙ ÜÉÒö=iÁÉ &uNÜe…}w¿ð99ØÈ*&•‰û¬°ïßo•4:™Ë$]þ¾ï ûÞ4Œ‰Is:YÛî¶.Äw]ö¶âkmVTˆ¾ =VØŸ¾:„É=VØŸþŸ%îŸD‰™D‰™D‰™D©I^>¢&ÙȘ ˜de‹çô¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢äa’¿ì¡N.“£#:¨®|Ÿ‰ï“(qÙ3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰RŠÉÊ¥—žp†[ŠÉïUž|zB®“L²“™b&Qb&QÊbòSÉ—·;Yœd»“Ìb²$ëú]¼bj I¢™¼ŠÝ¼‚ê\Iæ2™iÍws²,Év5&™Ë$;™J’™D%ÉL¢’d&QI2“¨$«˜T+UßF8'«‘5Ü+€;©×î1Ö…I$YÁ¤þZP½„ˆ•ÐI}-3'r²”IM¢ZâÇNï¤.µÔÓI’t2Ér&£”ôeÒXð²­¸Ó›I{±P’åLš×fA²Cî¶¿g´³“¾¯6íÀ¤³xJ§çF´V ëàä¶Ag:cU³>Lî›»enz!¬þLªÕÍÉ“l½OîUâXL’={9éÖõL5—ݻׂ&v²±>Ù¹f.qvr² ÄimãP+;;)׷ݘ,©q»’$÷¡’d&QI&ß?þ`&ë“$LþwyÏLÖ&¹0ùvÿ»Þ'…øÁLÖ&¹2yÿûûê$ß'ë“\7'#ewþ£Ê0'Ë’lWc’™ewÁ3ß(' “lWc’yõÉ’‡çAN–&Ù®Æ$yþ$J<%f%f¥$“uËË>§“üŒDüŒJÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$J¼N/L“ßFGtXYL~Ï‘E™üüƒZ~“a»?Þ";ŸI #“ÁÄ[l÷é#jÄÆä½äÿ¼‰øþgù¹#õÛ¿0ùý·xñýO£„w'YýW«3!endstream endobj 168 0 obj 69 endobj 169 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/trefdodecinter.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 170 0 R /BBox [0.00000000 0.00000000 224.00000000 236.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 171 0 R >>/XObject << /R8 172 0 R >>>> /Length 173 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`ddl¦g6265R0Ô3µ473S0Ö³´430ƒ¨µPpÉç BP/{endstream endobj 170 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150409) /ModDate (D:20070503150409) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 171 0 obj << /Type /ExtGState /OPM 1 >> endobj 172 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 466 /Height 490 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 466 >> /Length 6036 >> stream xœí½‹$Iz‡cýEP2e®¹Æ:m-,²úXKpά%DîyÜ:+³áœ“)£1åL;rNÐhÌAc ÁîÉZóÎìÿ`¥ŠüŒï¬ˆ7"~ùþŠîªÊ¬ÊÌzŸz"¿¢ª>°|"~ þðüH´ œ´Äˆ|xH?|é½<‹ëãùB}‰y~{Ez½öC¿¾'c9ô yþz¶48&ÚW"DVKŸ¿æ ÂE’\-m½,|)q‘kÐÝÒªvƒS- ÉÕÒ·Á}Îù|!¹YêÛ—á}˜Î.âK‘Ï-KÝÛQ¼ÅÛ(Þ}ÙÐZ–fM™S5ÏÂçÒLDßöy#f+S,uNùa™HnÄ›‡}ì‘Óßv'u’‰G‹Ï¥…ȃúågqÜÒ¡?#ÁçDŠÀ4j©†T¾Þã–Îå:P´é)Þçi#nE€4ÏÒëë=n©Z­¥žÚÓ7ba­ S›hè~oÂvÿ:B›âòôím¥<ðAù`Jh©R¬½ˆsµ´Â eÈöD©û/4PH—?0¤¥,5!½±¦lÖÊ(¼FJ{ÆJaž®©™~­MI‹61c–`H—Œ­Ñ´¥œœÄ,5 ²¥$b©c¸méwÏÏÇÇæ}Oy¹’óŒñÙ-}óüµdûæÙýnùÚ3œS9ÞÂûFHK%ÙOÄ7Óøïøù郄ývþ0âõöÿµ^ Îyš»b>!•¾2ÒÑóô“ìu=#•ÛIléðy2¶xÙÒáódì—²¥Ã‡-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKáRÏÒ§R:I^•šP=KŸÊ-ä R°Z-}õÄLSS²X-}%˜ibŠÖª¦¥‚™¦¥l©ªZÊL“R¸Ru-e¦ )]¨Ê–2ÓhŠ×©¶¥Ì4’òeªni¦Ûü8ÚQ¡Jõ-%cê™K×\k‰ÀÒÊLS¦Ý+Ö*5¢°´ÓìIöǵN‰H,-Ïôþrìy]a­T!K #½‰Îé…k5¤$––dzý» ©LXkˆÈÒr‹,úˆÞí7?F'ty]dy§R}êž/åädKÍ…¼ý}x¿\o’Þy¨Ä£ë2‰f¦šÅ(z ¼ÞºÔZì›–ú~»uIA©Åäº7ܘڥd]Zé½ãVfv®Úª¸TGa†X—:Îë]î@—|tl[‘Cu•eK 1-tÊÏÖb¦Î¢Œbi ¦…Ê´…ê.É0–ÞÌôÞyóæ4„ê)È8–ÞÆ´PÑ©¯YêÚKÌ¿î7 •±¡þªüLìøÞà#YjíF'.|=C×XP D5ì*=0F²Ô¸¸ðwÛ¾F% ¢Iëë­ÄX–Š ·î>Ö*CõÆ7zÒ,ˆÎÄdvÉX‰Ö*CÜúzë0œ¥™§îæc<õÊBõ–aÎ2¼¥æè QPµÐec15ætkähèø–êãCDIŠ8Sq k윀¥êD©Š$¦2y\£g,ÝoLŸCs>ºÐÀ&’d¬ñóÿ–®;ÞYD«˜¦ôíİt¾C”¨(Î4©{$ˆ¥ÓïŠÔ"JTä0M@šÖ·ÆÒÀ¦‘I”¨p0=®ibßNK%ÒþˆdšÚ·ÇÒD¢Ä@Eò®Œˆ0MîÛ‰cé] Qz "ƒiizßNKïÄ·®³ÙÑ&@…Íôòwžú™fô턱ôŠÔq:» ¢Ó‹>¤^¦9};Q,•Dí. *Ñv@…ÊtþÐU¦¦Y};Q,‘L¢MŠéò¹H¯¥n¦y};A,]ˆêH;":ïʬ ä'êbšÛ·ÄÒ©Ê´›VwÊ{GÐQ©·Ë+¶¥Q•iO’^óg±®NƒHM¦ùä0,UnL;#:1†‰ ñíž—¶¥*Ñ•i_Íîœ?K¦1¢º¦~>Ø–:öHôÊôcœ¨Î´1ÒV–êD'¦}•LªLOj©‰T¼trÐèhúAÚÈR‹hây޳3=§¥a¤#U˜žÒR@IûAÚÆRDIw¦g´“èÆôŒ–2ÒäÙic)*Ñ•éù,½!¤#]˜žÏR\Iû@Joé€%™žÎÒ? ˜žÐR?Òñ‰J¦ç³ZÒ’[Ú8B zez6KïЉ ñ—³YÊHsFd§…¥?èwñˆ>&ƒié[¡wÆÞâÍú˜LdDvè-½J*³Ce¤ÁÙ¡·tAº1…$šõѧðˆì4³T¬PW¤XD}L¡-•y•T~œæ;ÇPpK…dŠ*©‡)¼¥B¼[®ñˆº™"ZªGj3E´Ô‘¨“éi,Å$êbzK‘¾Ö¿Vý,–¢u0´ôNؼ¸Dm¦€–žKÒFH‰-µ‘"µ˜žÂRl¢’ékå”ð),ÅGªjzKщLñ,56xÅ;|¢SÓK‹”ÔRSÒ3Õ˜ZzR¤SxKÿ¦ÔÌ:Ï´HZz¢ S8K­£H¿ÿÓ`®[Ó g©Ž´ Qш)!RRKýb¹nuaŠgi[¤_l·è™.gÃá,><±„œèÚ=r¨³¦p–*HmÅÙRb¤&Pb¨SÓ liD0}ýÏÒuû¨ ¢ ˜~‡gi¤> 2¤P¯Mï_£ZÚ Qr¦FÐ=ƒ[JI4 T†ê{ñž1ƒ[Jˆ4N””é{ñäÑtlK鈦•¡ƒúþI¸™miD)™þ–)mÁ·„HÓ‰2õi:¬¥W¤TDs€ÊPAõh:®¥wÿ\jú‘ä%d féÝïÿªÔ BÉ*Cõ—ß95ØÒ>%`zŒ( Ó_þ˽2ØÒ>Õ™%JÀôA€”ÜÒÚH•© •)½¥u™ÞF´2Ó_„Dêb:²¥¢*Ó[ÊÔƒ*‰^+S)ù'×®H«1-A´Ó+Q¤äߨòé¿‹_×aZ¨L¨’( ¥W¤òÃüU˜–#Z…éDtFê`:²¥wÓU¦%‰V`ºuk:²¥3RñëÂHË•) •)±¥ÛÏO”eZžha¦3QDK÷¹/xd°P™rP¢3RÓq-ÝÞ‹r‡‘j-ÇT'Z)©¥ QQŠi= 2E ®D‰RZª4»B:ŒT—h¦Q@K5IËhZ›h ¦RÓA-5ˆд>P™¡ÚD+#¥³ToveneJCôF¦¢0–š’Š™R•9u'J†”ÌRÑ›ÎÊP=ÎÔIÔÁtHK]H3¥*sª‡h]¤ä–ªD'¤G˜Ò=ÄT!Jˆ”ÊR'Ñ£š¶ z„©OR KHs™¶*“ ÕKÔ>g dé¦íˆf2õ6»•‘Yê#:#Í`Ú¨L:ÔQK½H3™¶&šÎT%J‹´µ¥ Ò4¦íÊ$AÕˆþÎvEª3ÏRçNé’tMû šÆ´!RKý’fhÚ Ñ¦:Ql© éÓ?Ìצý•‰@ÕˆR#%±4Ôî¾¾,HÃLû"aj´4$ék!¾_nú™öTÆU'JŽ”ÔÒR/Ó‰ú™Æ‰Žoi°Ý R7Ó>Ê8¡ÚD‰‘RX‘4¢i¿DÝLZD‡µ4ŽÔÁ´g¢.¦¢ÄH ,µ»"À´o 2Tƒh ¤–F%U‘êLû'j0uŵ4 ©Ât 2;T“h¤õ-MhwÝLG!º3õ…³4AR'ÒqˆnLû@ZÝÒ¤n¤Ó‘€ÊH¨>¢h–&µ»ÓшJ¦ÑFHÉ, Jj _•Z Âü·5d% fiZ»+ ¦Œôpê[z é€L3ˆ‚X#z6¤÷¶u™¯£HGoy-¤Qj¤µ-½^MP3‘Ç4“èÐ–Š‰iœ(#-K¯¹$ ši€(¤¥×Ü_쇜© ÂÒ¹áÕ±šD‡Þ@2‘†$E±t¾c Ši–¤H–®™±"# JŠféš‹MT¼þ_íî8Ló$}'^à,²#ÝÚb¤aIk#me©£Ý} HcDÅ•)¶¥ÛS ¤Ã0Í•ôŠtäo';!R…¨éüOÉ@–®Kš†tL¦ù’ÖEZÙÒ"M‘”-í;ÙGâÄ–Á´„¤À–ލi I-PÓ"’žÈÒáªD[!íÌÒñZ^?Ò ¢È–§iIÏdéÀH36ŽÎeiçL I mé`š’ÚÒ±4Í"ÃR›é„ô³ÿ0ƒ4F” i3KÝH?Âd:"Ò\¢À–^‰ZH;fZLR\K%Q¤ÙDa-ýl¾†iQ:¤ýXú"~žo ‰4‘èy,}™þc õÀ J féË6dA: Ó,¢„H›õœ‘¾hƒÆÒÔ‰4Lô;ßè, !}±ùvÉ4‹(%R"KïìG8>3TË« M%úÎKn$K—W™†t¨–×ÔËå㼆¡AZýÛɼšæ íiQJ¤D–æµ¼c" ¾ó“ÊÒ2-owL3$>ÒDˆ´þ÷ñbjš)©dú.@nDKq‘¦%DJðÝöZÞË¿Y#úbšMT¼ÈýKhzÂbÚ7Òoíã&s¶ÏÓ!%³ôV¤]15ˆ~kÙܲÚ{ꆃbivË;}GךnH%ÑùûiL ¢0–fk:ÅŠÉ´S¤ë»šDÑ,MFº|iNÇšîD¿ÝÚL-¢'µTü¼~R¿šnHÿ¤5™ÚDq,ÍcºU¦[MÝDM¤Ê÷àÐ"%ù•ácH»ÕÔƒTgê"zVKýšö†ôOæ…©“(¥XL}’z*D,ÍDº•¦o¤Q…©›èy-õ"í‚©_R±-¹‡(’¥Hš$]ÜGÉÒ\¤+ÓáN î%zfK;f&ª{²IÊÒ£L‡Cª~Õ®EÊRMcDÅÇm«×&zKÇÒ4‚ôã¾iç Šei¾¦sm.ÿ¢ì©›èÖP¸‰bYz@Ó©8ÑÓ¤[¿1'ÑÓXlzûD Ú)™¥™^DOLý’îÛ¹R7Q0K]BMo—H-¢êo„H¤¢h–ÑtŽÎ´?¤ú¾¼ø‰ÂYÒÔÇô25c½0u5ÅG¼|ãåƒf馗¹ë©ET¼öó³4ŸéԳ쥦¢ !>x–æ®N—¾‚/½"umŽ”ÖÒ¢•€ óu;Ç–™OK•‘9Ls‰zŸàësP‘¨õÂí‘…fÓÄR}\:Ôl¤Îgx¬*Páxåú¸Rsia©9*™i¤þÊU'êzéʨb3i`©£¬iPó‰šO Ô€¨ûµ/cƶÔ10‰éHCE#*@×¥ž7jÊîŒðÿ¢«/;Ò`ɨˆú5×ÒëK wÃBÍÄzQ§íËÐimšÙ4´–·ã“™Ê¤r½ˆ8P*EE £ZÞÛ΄š†õ-¢"PA-ÙLEë2©è&)Q Æ´4väzJ>Ô«k¤”î4?_ †´4z~iΦpa¤´ŠŠ@F´4~xM>Ô· Rr¢þ* hé~7¾ðÙL!¥(Ãx–*÷R>ê¤ï’zV·ÃYšÔINMÓPãê'·§Z b4K,|Ô<¤íxŠ[ßèi³ °Ô8–ºðëÃâPs6jp×­mBoÐüYÔ·ÔÚ¶KŸÆ.ןܨÕF¾S¾ô¤Qï$§¾¥·n­¯?êÇšˆ´iƒ»ÅWŽ,-±ÿµýì«kø`Â:¶qƒ»ÇSq,-¶GíÇš€´ž2î’ ciÑc$ûo4kXcH»â)ã,Ê(––?êec—ÿØOWY±´ÎqLåÕ%V©ñˆþxÊ8 3†¥õŽL«Xé“§Œ]š!,õî‚•‰Fµ_xžØ;ë#XZjB'É–Ö:y’Š'×hΗ2Q+õN®‘XÊD©vrü|)g ÎùRΚqÏ—2Q_ªÔˆÂR&êM"XÊD©r ¼¶¥L4˜§À+[ÊD#©p ¼®¥L4šò§À«ZÊDRüxMK™hRJŸ¯h)MLáSàõ,e¢É){ ¼ÞùR&šž¢§ÀëõjàädK9RÏRN£°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸ì–¾yþš-Eˆ´ôêæÕÒoä]¶tü\-}¾^Ɇ÷zõ-?O?MWŸOHy]й. RÞâ…oñÂ…÷Ká–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ËÒ·­—ˆsk K¿l½<œÛ£Yúå¾ \vKýàŸ#9 &²[ê}„x æ'Fd¶ôº½ë¿<Šðx¾P_"D¤¥ÁwÅ£çP'Bäj),ÿ)è|Úendstream endobj 173 0 obj 67 endobj 176 0 obj << /Length 1988 /Filter /FlateDecode >> stream xÚ­XYoä¸~÷¯häeÕ@š#^¢´yÚÝ™dƒdø%ȈܒmÅê¦#©ÇëŸ:HZr«m ¸y”ŠÅ:¿¢Üäð'7U¾qZ‹Ê8·Ù®ò°üp%Ãh»9É·×W>Y¹‘¹¨òJn®oL®›dïëǭ̦v»“Ù°Ýi­3õõvgŒÉ®·¥ÎN¸ë‡®î·;UUÖfJmÿyýÃÕ÷×é`«Ô{¢!É{²ÉÜÀ¶Ù¥RKþÕoU™=d¥ÉF³o÷ø3ášÎ¦{°å}¾Æ4ÀJ}ß6øë¿‡½ªÈÚ.RòEáÓdýÌãÆãMoúvGÌûfû­rÙCw„á]8`vØÐÝÝoUÅr˜ìàOcع!¥MþȬão7‘(6ójp³“|ßÔBÚœ ’d*T6¢$m¼.Jt¼Ã/Aqj®¸"y¥-h9ü.,tk…SNŠ©†z‘Ò"/òâ-F•(J-EwdAƒZ˜ÜÌɵ‚«™H½u.«‡­…¶Ó¸Æ_WÂyüà†L<@ûãšØî¬VÀæÉ¬Aš}ßíñ“œõ¿)$8›Îºpèw ò©]ÎãJ…›™ø¿¯Œ¢JËh…¿Ôdѵsv&wBº\úÆc}ŒWíYÆØì:ú¤6lÙäùÎcÔ‘?áW ¯6ÝX?>BL»¬­#>v#óC Ãð>"Lžq ¦Œá|‡®áUË uÃ߀ÉlöïàÍ‚B F€*EeME·ü;¦âmËlOŸÛ*«ûÑó¨÷uÛ/,'²È³[wð&|âˆ'»õg6Aô/]û„.¤döqæ-ð‘ÔÓýº?ƒaŒ“U°á'TP¿ê+Ky} …›ué ‹î"…3ÒýÜe§Éh¡á1%7r pÐå¸*CYeʘZ~|ÄÐmW…PFX°{ Då|óRVÈ˲\*q5('œ”&Pžßè©CŸŽ×‹uL Æ·œH“;û’Éa|Ÿ½ôaJžë°²PãósãN2¹Ë…-Á-–¹|={í´”ìœ4šî‡È ŠO:när í¦?à€Ý“v¸Fìý±aŠô­–:…/ kÞnºtØÊúsçHÌ2)J/~ Ÿ’>€ês‹Áã²/TÄ≩ÛßêÃ#Gj¡‚_siúÅe\¸ üN˜vt™}Œ­ãŠËÛ‰²™ê‰WXñ®ÞµE}¨¨†ö52Q¥¦*ìÆ–•0ª=ÀÁh{OÝnN¸‚Qβßa-Z–S ûZ­¨p AVpR¢{Os†!쌮²¿x ¥Ò÷=‹Õ°+çV(¢'9ÐæôÌw+Æ+ R›ºžÄZ@ t”îcônUéì_«È#J¥ì1 í­ð··kÁXQJ³âWtã|Å…T¥È…ðÈ 6È‹pBTDZX.SJLdmøf†"pʬԥº rHi2)íÇ?¯&3)¬*Ý|àR®eöMr×]Ð*ÃSšÛ‘±§,×µƒØ2…%'‚´”Þ[Æ&.Ñj…ÌfÅ_d2'g*ú†TÄÎCE³Z‹ØB^Ô É” Ù»f½``Ø„bàJ&é.È*O¨ñ‚bÝ…z‚ü=_º!tˆyqŒ°Àw®€µ®ô;8-$ƒÿ¤8‡6 ʪ(+Ûßþt°›ïüÕÏoµEJV<¶8Ë8€Ç”€‰ýú~ê +?aÏRÛ^Ä|­ÐwlùªÝ4µÒù{к6µ:¨öB c;­âè@”­VL ¬{û0µ„,3ï(<žåûu{C>Rëgx 4+¬ r_ŸÆ¤/˜·_PíðÀäK94:´Óiˆûàd•Q¯¼¢£z HøÞ‚u8=yWG ž?(þ‚‚ÂßS@ö»§tŠ<ê€ç’kaש-jO=@š†àH’à³§¼»GLóknóçeÖ%%BFw´oöR™Mt»9áŠÏŸ3¼äôÅ™,U.JSV YV*m¢{W–3† l¬! ”ˆ¡{á6†ß-~Bÿª19"Æ2 ìlHئKÈefO 8)Ÿ(Žd3ƒïF‡² ‹M°z‚u/ýº’+²ïaòÛ¬fàf7kH¦ þý f ÂÁ_/üòEã‹ÌN¡ÊŦ2¸â yŽ/òˆq¬¼ã”·ødóÌ'S€x¹CzÞÑ3èhƒÐ\èdèþæ h§ÐE|Jùæ‘;'üÇïõqÏ+k5% :«/Ý'82@ËÞùÞÒø8Rax[@×Ó €>šŸðpSn¤Ž1Ÿáb‚ÜDá‹n/P1‰X?zÕÛK–ܰã¨có¼ÿ9žòÒ“ã €`Ú”jˆ”èÜïô«VkTB®ó¨ÆÆï?x×Oþ4¬)êŠSE„_×È<À€ièØÛ†—ÙL^½ôD]¼ B¤:Cl}‰ÚHr±‘§èý¼Œ bâÉ ij¦!ÿ„Þ§דA¹q§×ÎiŽÎ¯^‚î¹LÌ Ç-UßÓðâù\ð¢Œ1-Ä và^/1M™°Å©îâù/byl< endstream endobj 175 0 obj << /Type /Page /Contents 176 0 R /Resources 174 0 R /MediaBox [0 0 612 792] /Parent 131 0 R /Annots [ 178 0 R 180 0 R ] >> endobj 178 0 obj << /Type /Annot /Border [0 0 0] /Rect [281.4965 587.3049 329.6836 597.0019] /Subtype /Link /A << /S /GoTo /D (figfilespanel) >> >> endobj 180 0 obj << /Type /Annot /Border [0 0 0] /Rect [442.4852 173.8378 490.8489 184.7469] /Subtype /Link /A << /S /GoTo /D (figtrefdodec) >> >> endobj 177 0 obj << /D [175 0 R /XYZ 90 720 null] >> endobj 179 0 obj << /D [175 0 R /XYZ 90 536.8234 null] >> endobj 174 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F54 112 0 R >> /XObject << /Im5 164 0 R >> /ProcSet [ /PDF /Text ] >> endobj 184 0 obj << /Length 228 /Filter /FlateDecode >> stream xÚ…=OÃ0†wÿ çÁ®ïÃIÍ¥lHÞCÔ¤4¢­!‚ÿ B–¬óÝ£×÷ öå Ž^·Ì.JÛêÍAùsûEá¹²…°?‘ë¤ë€½‹>¢NÛ_!©„›]÷jÞc&c™èÊXd– uš§±ÛK1†Äæ)Ý«Ûôýq úcµ·Ër¤-{v­4ZܽÊêá‚ÔœÿÐK‹ï]ƒt²XÏuÏi¨äÊ£™-Bµy‚°-í<îO–ݱ¯Á*³%ôæ2Ý®@3Ý×Ä|,·ûþ ÐU˜ endstream endobj 183 0 obj << /Type /Page /Contents 184 0 R /Resources 182 0 R /MediaBox [0 0 612 792] /Parent 131 0 R >> endobj 185 0 obj << /D [183 0 R /XYZ 90 720 null] >> endobj 181 0 obj << /D [183 0 R /XYZ 90 684.1345 null] >> endobj 182 0 obj << /Font << /F51 9 0 R >> /XObject << /Im6 169 0 R >> /ProcSet [ /PDF /Text ] >> endobj 188 0 obj << /Length 3571 /Filter /FlateDecode >> stream xÚ­ZmoÛFþî_a„"†ûÂ%Ù~¹^.í¹HR_í\GK´EDU’Žì»Þ¿yÙ]’ò:QA‹Üggçå™YŠÓþ‰Ó"9Í”Š e§‹ÍIb‡?œ{5Šù˜äo—'¯~HÅ©Hâ")Äéåí„Éåò*z½*w3õÕl.¢v6WJEêÛÙ\kmg2‡©¶\ôu³Íež%i$õìúò§“7—þÅ©”Ÿ IžÊ–ÉS‘ÅR¤ÚÊfr ¥S’MÍæ©‘(† AJ¤ëº?[”äp‰ ™Æ"—ÌårUw°.©£ÅLfÑ +w°([V2]´5Œß࣊ÈS¢lð‘=“>¢6š{¾©A7…W°\àUÏ“ûº_ñÕNêfƒO¬«=3ï‘{ ÜDtgiûUÅz§H6;Zn—x¡¢ȉ˜>¢ÀYÔ”íˆcVêTÇJé”aâL%V¥1>'P±*ºèË–¤®ñïöØg)ˆŒïyU}DEÓýþM‹"2WVÓ •L³è¾»/×xi@w `‰?ò\OZ¥KZÊ@ŠÃ‘ñ½ðÀÇÚémϸ…ôt㸠Ç-¿bÑL6M&°jQHE»Ƥ|"ú4 cÈêtëTƒ¡ÆªÈYK«CW@”d…95°Þ\ähÀœ\]'§K0öŸNì³{´üXðÚ͉Lâ4OXŸ\œüsðÏq>bI>¡N³¸ÈZÅè½*N %I¼7[Ü›žö¥ý„¨"–)ðùª²ŽýÔ6êa‡«»¨,%”K¾¸zùm½µëüy×ã¾4Ûîú%ìÊ»Š -e)> 5YGÏ:ºÏ-ä)C\I«ÍµtLŸb6ɘíuƒ7n½K†lv±™‰~F×¥„Rá¶;·ý£j­>ʶšX‰þ´= A³c4¾íøïVlÛê ÒÐ×.•ƒ/}KÆŒA²4J“Dÿ æ‚8Q‰‹Ëó›êƒhIniZ4Ö‚ÝåIÀ 9‰)o>›X^Ìæ¹É£ ç½ÓÓ  €)ËqÉ€qÊXé‡;Fú.ˆ.šuc+‡ˆ‘[‚“{|ïÊ›t"¹‚ô\(3Z$ew¡ˆ0°_ ¿àã AÖúÞ­¤ã€ žYµH¿x'ÏïDfinëuPBzÏD:èX¨|ݹkÇêÎÄ îLRöxsoñ>‰œIFÖÚñCuP"C5J§Æß¡×#2Õ#”­ªpÆ‚Q$O¢ýª¦Í]ñ[d©A[H:¡íEgóÀÂå,’h‚Š9ŠÛÀÃuv.¸RxâPÑüãEVœ~x·Uªcih·Gé£ëK²a,(]Ö€€‚¶ÒSèO£f¹Žœõ–ü3ÑÔKð!º¹=o•ÀÞž¤ØYˆ|&ø ré,&xºù˜0Ÿ2|®í‘Ùtòãë·>S .\²Iþ$[´MòTO¤ e G÷9iŸ2ôÙžŽË×óP+1ÎãÞLI‹X¥ƒ¿°à#γìi˜rÓà| 4’É\Fpl‘Ž&ä¢Î×uås ÂGJ„þìÆ”–}=jMã;„¾¢H'ô0O!¾|ƒÕã}=ß•ÛjÍC›ñ^5··öƒ•Á<Äõ‚dXTÁX µ„Ðé c«  žS¨ÚRÈñ(PP¤&S*c‹l-´óèk‰î%Óì©¶²Ý.B‘Ôô"Œms ’…ÃPJ8‹Ú”5£„gKô—¡uϳ<6Yr]ŽX¿4.ÊR(ô=°>`2àlÓûJÁbÓw÷k B»q8Ÿ†~@WBŠC÷8ˆù6réÜãå”í÷˵Ã3.oûnXŒ6±Q €/õY@]ÈmÓ™.Ûì?Cv˳©Óf±I„<ðÚòÞZƒl¡ŠÌÁ2˺¯aÍ®0‚ð_w»µõó`¦-â"ÕN2]né%W"¸Ե(¹–iKW=ŽëY§dƒæ&Ä—+yסä}½ìWÏ£Œð¸ Ài’‡WU}·êƒb¥±ªÝÒ]ý5°6*P›:ø$\æùÑ2=>ÇgÍ®Àœ`Liebd“š±–\_Vtb›uï"N¯ U‹Òb‹¢°Å\tõ¿m—) rƒ.À—µã0“$F¹š÷L:±-ˆ&F«èrT%£pOг/_F˽mÚ #@((²‘Qa©tÞ Í/›îá”°2&Ûe„gBÁ¼>ÇÌ<5¬)ÁéÛ¾P(ïe¼>>Ç1‹Ó,uT¾öt ‹)+[ Á˜¤¾ï®~ð] LÕ®¦âî…ÔÛ²¯|tÉ UÕ_Þ]-vÝÕýöÏÿ›ëë c¢j’Ì-äüìüÍûïß½ ½@g€àüþü¬w^¾>?ÿù—Ëãa™Á–mî¯f”)‹–Pi¿ýówÁl8‰=/˜›OŠ|ËG`‹jG-'¨‚6¼%´!è†U Õþ<ÔãG‚pm£5ÆB·°»£ªx}wï0|CÖñ0Ž:$ÌÜÙüÆeek³L,˾ä+4²¡ÒL|Í­vsn©RÞ^b4X÷h‹èP$í]Ô¨©Ã¨YC8 ®8ó)”sæÅQ Öj€Ì¸nZ/WnÝ´´nªžvuréÏŒœ2}Ï”ÏTœi,¥·ñݱB֛ݺ{|×­ÆþÒvk»z6•'ÊñLaR—®BuK\, ¼ŠzêðƒX¢t-c¢@˜\ï\Ž#¼©ö¹¥“Kâ’#ÏÐ17WC†l¤'Lh˜fYÝ¡W»ž‡ÝÃö="zO„¿]ZÓÀ!çÜ 9LŸHÝQJWéS¥p÷PÚ¶¹Íô¿¾?ûmî€kõoM7dLTM '϶w=ñà·¬œ3ð|cÙî–…°2b¾½˜‰Q¥ciXó­õ9¨¸ I˜Ç0ìq”÷ÑÌ]Ç9û^<~ÌÀYdrh¿­z~š×M¨ ¶œ; 9†u³'¥6QáÅÚ鴱όŠXêá´}µüæÒ$šçÃÃáíÖIœ)ábqΛÆDî‰^X§j\c’œPrš6þpJk>°ÐZBµÝõ.ÝjÍ㌦àɳsxâ£æQ{žbO©pdÚ¼¤¡Ty°.:‡Å×”ê€Õ/Xæ3^ª±;>dß´üK!A?auC€+µš !è\L3ªÊ ÏšâÀ±Ò‰ýTcÐm’† I'º…ûÆþ–ö÷ì1ÌÅÛÏ¡Ÿ Ízªc§'Vct½dâç÷@ <›Íå—ìÁÙ±+³ž X¥Ì¾8¦ÝgâÚúDŠúøÓ=né\‡ Ï Ñ™Òß\±4™9>œ¢‘Äâ VJd33Î#àâWªˆø­K<ñ:<{~ŠA‘ÌW>0ºÅ$j§Àh21Ú='oD¬‰?ÁóùÄ®$f/9» Ö%PŸk_LÁ¼ ?óH\ϸÅЈüý¡3­NóVÁO·.;;‚¦üâÕ ‚-”µ¡j͆‹ºçÈC{­±Ñ烪Oð8ïÂ@×NÔA½9ô‰$5²à7‰Ê®©~ëí<µÔúÕD¼ä­*Ъv_ßa%î3­„w‹%R¢ˆvõnüVj‘ÕGòƒü “üeš=»ð‡P»,y|t®îzLä`Žô²¿üçòÝùßÏ~ùï+÷!Ô« ×%‘…oÙCÊTMmj\gÊ5Aù@ó-D7Vïbh)9RÂïvÒ@×·U¹Ám–Šƒ!hí’Ž ΙÂAKDŸà„W Þ”–]µ¸où›>‡ÁAT)oÞ‡™à”aC§Ä,8á°qøÆÐ_Ÿq†Ã>ëú‡ #ÿ¹ m›ž/ú!ðçLw<òôSAj×V•÷Ãg,sž±[àÃíì3Õƒ†ÍÙ ‚½¹€•Œ»¯2þec+x…ÔçKÜŠ‘¤_¡›{þLÑ’yÌ—ø®z>ô$8ðé|ü›?#ú*µ•d ¦P„ upkî|£ßñ©r‚ýÆóº mÞ¢5 †S¸qç²wG ¤rþn¦¯¦Ÿ—„̇Žÿ› œyÁ3ùôë[w8ô?°ÒTý endstream endobj 187 0 obj << /Type /Page /Contents 188 0 R /Resources 186 0 R /MediaBox [0 0 612 792] /Parent 198 0 R /Annots [ 192 0 R 194 0 R ] >> endobj 192 0 obj << /Type /Annot /Border [0 0 0] /Rect [293.485 555.3568 513.0913 566.2659] /Subtype /Link /A << /S /GoTo /D (Command Line Options) >> >> endobj 194 0 obj << /Type /Annot /Border [0 0 0] /Rect [372.7368 460.4206 502.0854 471.3297] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 189 0 obj << /D [187 0 R /XYZ 90 720 null] >> endobj 190 0 obj << /D [187 0 R /XYZ 90 720 null] >> endobj 191 0 obj << /D [187 0 R /XYZ 90 646.0405 null] >> endobj 193 0 obj << /D [187 0 R /XYZ 90 544.5665 null] >> endobj 186 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F67 85 0 R /F14 125 0 R /F3 128 0 R /F52 26 0 R /F55 36 0 R /F53 197 0 R >> /ProcSet [ /PDF /Text ] >> endobj 202 0 obj << /Length 2872 /Filter /FlateDecode >> stream xÚµYmÛÆþî_q( ˜LšûN&ýÒ¤‰ã©ä ˆtOâIìQ¤@R9_ƒþ÷ÎììR¤´wg£¨ýáVû2;3;óÌ ÙUÿÙU™_!²RsµÞ¿ÈýôÝ æG)ìHç[¾¹~ñú{Å®Xž•yÉ®®oD®7¿$ßîìaÅ’±Z¥,éW©"_­R)eò¶]ñ–z»ë®]¥¼0¹J¸Zýzý×ß]O+Οc ·DxãsÞ˜4™Îs~¥ ™1!•ã0ý¯{ý½6‹½*Ë˼⸧»ùWµ[»¯hïRfÉ3•—ò*e"c*'ÁÿR‡$·+n’¸H>æ*?€˜&é†RßÀŽÆ¯n`üwÔkÛ„¹5jhgÛm ‹í0ZØVÝ)Tcï·NÅ Ò2iæ¶Ç=8wŽqfÁ㡪ݶ·ûÁ˵З,2m$ó:À‡ñx{SRY¡à´WW#Çd– £ýž±C‚¿ÕÕ}”žÉ¸ááêl•j‘'×;`·ʼnR'`3GÛxõ‰R%M=ŒU;бó½à)3À¡(—òãƒnV`;er@ãÛIE3ÿŒÉ udçëõ¸?¼b¼~ÚH˜0™TŸ|ù5ˆä .ìŽtãÚ¶4°ôìuõÛÊóÒ(½—†ç"+da–â –L½L&ÕÇœ gë‘üîÞ™zãŽ&P;nàŒ‘èàihvM&¶¶X²¾Š)„™)KŒè,—Âñ±¿ÛÔ=J¢–Š™àþ®í6‘½smºÕCL©iìzô2KþuÆ÷Aêv b1í¥†Ág{¯¢ýH0•ØvCË(µ»„§D²šØ‘0Îg»öåHëΉ uÞLÓÕ'0MtÝWð›ÃKÂÒ®jcê¨>;ÇqâxþNo¾}G»|šÏy6éUL°zë™Ájò§§_ÃAЗ<áRuŽéœ›,7%¿R’e¹*8‚6PtË3`Ÿö¥ó‘ÈsI9ø¹ò±Õ HMã_œµQðá×W4°[¯lÆô9Óàû/™Z0‰FӾ瘾$èÕÆbOšrŒ`% ä"+…’>‚­c!ŒçYÁB;Ô‡ê1h:3ÆÏ¹%¾«ï<øSÄÁÎKSúB=ƒ=¨‘ÖÃR3‰½¡ ˆ¡‘ •_É :ìH›ÜÛ|òÞ¶v53o`Ó·8ñŽvžá”£U&øª<§§MãÑâOòþý›w£LVñ³À½Œ¬hGÉz Æä}±mt’±1ˆX±çS>ÿ8½(ÞöâÁÐ#þð%eŒëÄi¦Ûﶘr ½E rr0nˆU7úûßÞþ#%DÃSŽ’C¿>t.®ñeèýG¿ÒNPè¥;‡®¨‰ù¹ˆ†ËǤeÛò¢,&“‰i’i‘ˆ‚—ª¬ýóÈþ=¥Íó'¥Šœ_êTäò¤RÈ?> Þ~øMÒ!JºÞ[0¬E5ÂŒD$ñ(›§Z„dé%d@Lí Ú¦sDŽå{ºªýã'UsKSî…)¡BÖ 3©µ:K‚:ŸŒvòxøe]rþ0ËÈ ÑC{¸î´x8EQ{D>À†W³ƒ]p˜ÚkÆéÛ½OnBÞ…+ÖŸôõ¹¸®¯‡»Ì'u¥ó<—K+xÞÓ¶ë·MÔ>X¦¤,çæ‡§¹ºÈïíMC~/ríƒ:ŽUrü »%Ûy?% Ì¥oÞÑ:ÚT×Óc唃†ú&nšJû‘Ð΢>6÷¨Ûû[ìzM/ï‹,D«)mC}@'‡U_ãß-¾ƒàh6Rû\I²v®ÔÉþê@òžnˆXDL<°³ÍOYØÁ×=ýH Arí´¨œ@?ÔM¸bC4ë€Px;â S.YphS°®ªrg‡˜X>“v^2眡ŸÞ„CjàbŠ£Šf*o×´FybjÛOè÷Ǿ¼C¨:"dVF{K¿ïë–œÀåæƒwóŸæ¯õãÊ9ÊBMù~kîó®Ïµ&F]êˆ9<× î£Å{BE»×]ߟÍ!1z8Ø…Õ8Öˆ…Y“ï=Á¦žòíqþz°q¬>GŽÓãádì3½OŸÅHõù.}°mÕ ÿƒKÿ<º'F;ËáïÜ®ãÆiñ¡v©¹¢"¡£áÁNi@ãðOcmàÊSXÝ:¿<¸vM¦éæ£F O>8w"¹¬ÂÄÍTˆÀº^·#ßÄL¦d@Û7BÅ¿ÇëhWÍÜ×®2d&ÔÍ]sf‚Ò?|Šp™•|ªÝ‰™‚øŽà‹.Óu?…•ÑsÔy#ìœÅR)n!ýMÇ:u&mÑ”/TØyJOÙ Tf*yQœÙDuQ¹0­³²”PÂE¦ /©\¦}é|c¤¸$­\˜Ð¾tAe9a'{ûF¯(~:œÚú`Ê„¸¨a„Ì #–ìÇj˜°ï9ö/ Rφr¨|±?×- Hì-slÍÍJ –Ër–Á)#ƒ[*£‰kж©ÿmI©¸écÎäeÐí â+’ohuSÝZTt3¾Âö“L¶s4lg8ò}e7p@sÃÃ@AaŸÞ×êÙ€WHsÞ$|^Ù“]²3\ƒ8XTXPqCIk×4]ú}D…j˃ ŽÇ]7¸ _"”¸©xúÊeÆ8‰éÿáýßýçõ“l–&z:âÙtáóÑk8ø«)ÃgOÓ×ܧ§\ÙYž.EùåÉaõ|?xßmŽM¼–V™%ž…šB þX¬‘Ú%Ûî/ɪw}§†&ö> ß§¬æk³Z6AŒrêÁî)÷§â~¤X€il«â…Άq@õžÔSUèSÒSz)5_¶‰9^²ñ*4cy}¦ë3±Êú íÃxsÔ! 5ÛajŽ€/CNh’?\ç¬  ­ÝôË`;¥ÌÎaxbý¾ ¶Oe»ÈAõÌcôc1I@ᦊ)üUd*iˆ1~q!8 MÝÆ­É eëG–ûˆ PàU`ð`q¬,À$À3i­…}é|c¬µvA0 „ôñ©:3>`:ÝU¢^’«óŽD+X9“E*™ Ês#Á*l{N’ r³P%t ñex1ŒèÇÌX¾žÇ x´ý⢱…™OŸ=²,š_™ŒÌ, &…“º`êñ^ž¤áãŒO¶°ÆÇ×^c§oB—ô!6\G—] ·=îgŸ›üJØ;ÕW0·@4\Œ#Zw%– AÒ?DC`fÀmýŽßcT6 õS4ÊÌh {¨·­m|ÇDHŽk2^?Ê<ŸÕÕøÁ©¤ŠþRÑWº§]Ñ—NšÁU_c¡ÇÍkÁ‹âÿ.7 óBL1-|©D§Úeìöõ8V^ÀÚ X{iîÉZšMäà\QFþ…]B>°DÐS¨OêZô[WÓ·­hÂ}²ò;ß]¢gù¦ž <^g~¶·÷Ç6Úl׊MÁwØUM“®} ñI—g9¸3ÃÏñy½ôùRgP=êó\'×°¾+‰SØ9ú±KBpð³;ú@-túæÑçÑȱˆ?}­šZ.ó剀mh:†¸«n!k¶›XÇ)bª1e'qñ9æ3ž!P`×áì¥TþL¸Å6 îZFŸ…¨† l<1üQ÷þû„«gë J—ØõÑïSªÓnf†³òîÒÚ±iO#JWÜkºýîÔµá£î=~Zt£EOÀOŒ$ŽX¢Áv½´ÝY > endobj 204 0 obj << /Type /Annot /Border [0 0 0] /Rect [227.0792 538.3309 395.2915 549.24] /Subtype /Link /A << /S /GoTo /D (geometry) >> >> endobj 205 0 obj << /Type /Annot /Border [0 0 0] /Rect [166.9941 285.8456 334.8731 296.7547] /Subtype /Link /A << /S /GoTo /D (ui-panel) >> >> endobj 206 0 obj << /Type /Annot /Border [0 0 0] /Rect [258.9332 195.372 454.388 206.2811] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 203 0 obj << /D [201 0 R /XYZ 90 720 null] >> endobj 200 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F67 85 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 210 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/main.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 211 0 R /BBox [0.00000000 0.00000000 190.00000000 148.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 212 0 R >>/XObject << /R8 213 0 R >>>> /Length 214 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hi`ªg64±°PÐ5Ò3·41Œõ,-Í Ì!ª-\ò¹oÊåendstream endobj 211 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150408) /ModDate (D:20070503150408) /Title (blah-000.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 212 0 obj << /Type /ExtGState /OPM 1 >> endobj 213 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 397 /Height 310 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 397 /Colors 3 >> /Length 6911 >> stream xœí;²å4׆õ ¥ÓŽšPEG$=†ÑI''`ôH:‚*F@)Sùw¡¿.KKW/y?OÕqùȲ.¶üîW²lÿÏØæ¿¿ÿþ{FÒüñÇï¿ÿþéÓ§‰€ü>ï2ÈÈ?þøŸN=þÿöÛo."u®ÀðôY²diayØ‘á){éøO§‚ £8W`lÊ`³™q™?Òÿå—_^ù©y<*€Hܘy—ù#åï¾û.á§ü–,Y²¼jHUÚOY((K–,ŸséUèl›²~ê±a¸…(Û¦¬Ÿzl˜4Y ÇÛ·o“¶)ë§FMVðÙ_~ë”%K–ç¥û·oeíÚ<+—޲Ÿú£{ÿwî÷˜dàµùû éGgåñ²Uá§,TÆ2P\Ü¿ó§Îéè¸?þ|NçqZç§’Ðs®êQ™Åø2,Î=wŽÅU Çv 7«Î:¯Í8µ@ògDs"‚h›ù©£Ùù:\"ç’ØQÉþòÜìØ¯Îµg|%³ý”R§Ü×£½™ŸJ6”çi=g‚ZOº¯:¶3ªƒN)±ã§Üë®ß~JÓJr&?~$¬¸ü/p¼K.ýs„Üz3Å‚iª/'˜‹£L¼xlsûÛd ÉŒ†TGn BQ…Š e0 ~Jª€¾ÜÅúuµK¡©%7%×/Ñ©¸.ÊÜ×[e:.ÒˆsÕr%﬎¾TB A97âž~J?zï9g¬×láÊtyƒ#„kÖ5ûjò]é§ôÕ/¦æ¹ðØÊUÓWG>zÍb¤/ÒvÈ×fÑžŸÓqFü”2× r­f[d,—r“j3ÅßÏ8NÎMÄI¦£9ÅËFNöÂc«OS(X›NUe]´x7)'^›ÇU¬©¯!?U¥SGÞ~Êe. a¯±Ú$äÄ9/sñõ4›)}‚šDš)e²mÓom3Sú¬7¢è§”:eËO³ xäÝï§4M§S§Ü×cÚ 7>»*M}èÔìc«—˜Q:Õ#‘E锳ÞŸ:ÿ»‡ŸJ]¦ÁO¹T‹wê £a=¨WÃϬòG¸ ½HU`ñ±ÕÿH$Ë\ýÎê´mº‡HyŠ×fð3,¤ãŒø©6zæOyŽÎTrSn—s`­Ö$C„v¹NÉÅK¦|Äœ}lå4«¬œ¦:ÅMšÃ(þ6:uÏû}+Pä6r`æOIA¤€Ÿ*T@‘Z~Jª\Î?¥ß?i¦ú)R­ðS`¶ŸjN§ÅOù\5Ÿ²–Ÿþåòí°dÉ2XŽº6ÉëOGòSŸÿ;þÝ×/gù Ÿ¿N(ïä(˜bàµ9*)ÉO}øð!Ȳj `ÞOùޤçÕø”ÇkØcå§Ÿ~Z]@xnÞ¼ysø©#ðíÛ·¯têÜÃD§`%///?ÿüóùË¡>ü•N®ÜW?õ×_]Rbx*~ýõ×ÇÒë”ö~ßá§Ð)XÀY§œrþ”ÃOÀBðS`üX?ÖÁO€uðS`üX?ÖYá§~øá‡8ðË—/ðÇÒGð+cÉ囌9£$“êµ’ãZ®ˆ|œ«Î NÙ-Yá§rç~N)“K2¤H6úþ¬½B‰ÿšB(›¦Øçc…NÙd‘ŸÒ7”4èÔØ"í®S3ŽÉ êØÄœŸ:wÖ†_iÁÖ#— $£:;šdã@Md9|Hù…£×_B9r[QsÂ*·® Ŧ8¶…€’+ýT²·å^7 yWZ2£Iý¾bvÊÈúõQåw©S0ª„ÉmåÔèÔÔ³SYä§‚œ(M­óbËå+d4O§rÙ¹¨¡Ë&‡'é¬EPHåiª*aOsÆ\ٺ佔á0‹~êÌÔž‹\’:åòý¾d"Aúktê\N}u4% BÐ)Èak|jìYßB§ŽWRâa,vRkW:¾ ÓféA§lbÎO=§Ni"+u*¾P; ß\B9=æü”»é8zÕ’+›~}ˆN¹×樿TA “ÚŠ*h‡æÀVtj=¶ü”ûÚ&~üˆ‹„gÀ¦NôSwuþÌ¡Sð ØÔ)7ÐO¡S3H~¨î–Ÿ¥;jzËÚíBN§’š=sŸ¡Õž?ÕËU:Uü”æÍ®g›:ÕVªþÎ^u4lê”ÃO¹D§r }÷¯. ÜC§F} |/ÊŸZÇz:·õÜÏ”†P{œ“ñçÂóÛï§ÎõM†»T¥ðS½\¨SBµé>îAó˜`î¤(O–…±ÈNòUЯà§zY¬SC~Kõ‰è½›ÿy "ËýPáúŒ7ɳPÎZu(ªF›^TUv`¾ct*?Ö©s‹áø©^®Ò©¶*·§†˜Åá|a÷!:U,çpj‹<Öáî5>¥Ñ©`_C~JÿÃe¹ó²‘NÉ~'© 1åÝûuJYÎdWBÖ©ÚqqtªS§äŠ\é§”£ýú›—°£NMÍÍ…bL™6êï¼£SþßE~ ªEãA£Q4/mÎbõÑ×èBJRÛÂ÷Õ)7aÝá§Š Sqdk:å¢Öü› w:šuJîMÌw,6ç%\ã§â¦ƒN4ˆÈ¿çɘ tJ(gq8I_#÷ºQ%»`¹@›Ni˨|ÇòŒÏ÷Å”ïD§Щr‘6 š¥¡ùt´%Ò³ËlêÔ:?%üŽ¡Sgô=}oNÞQÞdA§ªÆ’„¾^­™ª*:Õ~ªãóÑy JÛ™µ@qì¼*µÚ2 S=XñSA¸c|*OÑR/È6«2#0Y`9NƒGKæ²X§Š¥b|JÀ–ŸJ‚NÅ(/9akm`Õ0péߜôhîU隆6ï階êwbS§˜?UÆæû§r£ÂÂ^¹KWíÊ™LçZJ[[tÊÿ‹ŸÒbù}ž¹a}O§Óæ,Щx÷\!‘e:µjßþwrè”ÿêçzðSð~tx|k¿J¤ÜU~ʯXûѨ‚çáÑÚ/)Çû§šA§Ãû§ªA§ƒŸªX ~ªt `1ø©jÐ)€Å৪A§ƒŸªX ~ªt `1ø©jÐ)€Å৪A§3ÑO}üøqaEVƒN,c–Ÿº·H9t `!SüÀ@¦ø)€à§À:ø)°~ ¬ƒŸëLœ?OÈÇ~·h0plBÌŸ‚a¼¼¼4ë \¾ ÍòSmí¶¦ù¼Ó`À“k ýÍîÙ@§ ¥Ná§ t :ÁOÁtÐ)è?• ù tåšÅ²NÉß»¿„ø»ßò—Àk¿>6µ5à§ ,;m6ÛÇŒëÔÀ‹|Irõ6éÓ×o½ üTtªtª t*?U yÚÎ…c«yn7G4~Žì~ŽÄ1ØhjÙQ§‚ë?è §ÒE-áü¯{}B…ÝãBj“ ºLS lKÍ-?U@þqË­+£ëÉ–jó÷­ŠuÊeÎB|Om çÜ‹áéS[ß8ñSŠgBþuÒGË]7À¸N!E‹‘»Jk[B\Y§r¹W5­b¸f/·¼qâ§ û}NüuŠÿÍ]qüóÖ­1®SÊß¡ø_ý©T¦`M§’µsW4NüT¹ßç­AŽ&dçµ)7Ö)Í©TŸr‘š;ŽõSÉjºU?U@n4n²N ᱯNUõûrivÊG2S :¥Œ3üTÙOý ŽJæ¢w×\ ±©Nµ@ߊ~JØ}H‚úõªâYÓ)üTèW¾D·Ÿ…hÉQ YÚÜþ>g^§âÀ/¯ç—¸Òå}ìuDÖÈŠ«iHµ ºTÓŠÓÃkSsKÀO-ⶨË:[€ŸšEîø A§ üÔDr¶ùÙ@§ üL‚NðS0t :Yí§&WŒÂ÷f “u~êÝ»w3*[РS48³ÈO „ï!€uðS`üX?ÖÁO€uÆû)æÂ<3ÌŸ‚NÍŸò3J'Õ,óòòÒ3}F‘`/rMhŠŸâˆç„çf “uÏ÷9a柊÷ïß÷ëmæ&÷¥ƒxÇãeøU!rÖò{þA`’Nå>pÞ±öí©ë?LðTïË_¦SSü”æjâœÿmS%tj3tJÿ):§á»2S©Õ©­u­¨Sg=Ê…_駦êÔùS?¹8U¹·%ò´\¨SÉ$Í;v‚N¹ :µÂOŸ?;ÎìGЩd„Ü.ů›ÅûÆÅãS‚Nåõqr À‰Ÿí+6°†Äwÿ˜£¬S‡ ›¬ø)ù­G"£tªøÅWe|ØB§\¾¯§o*Åõø¤=‰lÇ2šî§rz4O§ª²ëé<>-ót*gO‚Ý«®íX­r}Ì\.BŸÔE:¨h»·N"•ÛjÈO Ñ)——§žìЩìø©\;‰ Ø¢8)Müœ°¢SçøÍ:µŸrè”ìèTµþ¨ÿâJ¢öT:å2yyÉíè#à§´Ù¡S ì~¿¯SJŠzœ\A¤\½N­ðSnÄ8znSœNUv¹ø °ûü)ŸR®ëÍ—&‘íP>7cn|Ê5ݲmÖ©\²²,&‹9vŸ®o:ÿÂÛmq|*WAW#¾Öû}E ù© Æy¶çû¶¶˜Ï2rÃý”ñ6ý­óIt rlì§hs·ÏÞ~*yg$GînKqÇeäî(?- t*¸;òÂ@AÛÉ¢¯§ao?¥Ÿ‰çW4ù4iÎh[É92OÎl’ç:¹’ôèO““s­a{?¥?ÇÊ Ç蔦êÔ1Y©y>ú ·òSÁܹb³K†)!.šîpnß¹ùÉÖ)§i³Oz ót*–§†­Ü.Ǻ¦ÁØްÀ}üTqp§ÁO)Ÿcp‘®ÉÅФIKuÓtJóJ°5Iîw®¶ÁЊÜÇO èCœØ\šT1Sš©À Òÿxk’!'7Èç¼'¹•Ÿš¡SÁV¦ÈwŽÐ)=;êTG¯SçÝ9ûø© ?¥‰“sõ¹LÑ)I:GKhºn?• ×4T‡T½?5^§ªŠN ,ž?¥!ÂÒdýl,{OÞ ?å.GÏù©ä.Œ£ë¹P§4¦¦yªZ–½'Ï-˜?uîÞ7û)—jmG²qaâKéö³Ëôi¦ƒóÑ“ûÉDr †ñ) ËÞ“·z>ºæRGŒÃó}àÙø}žµý¾tÊ8èx¶÷S~“ÜG‹Á`o:ž½ýTmma/Ð)ðìí§:*€Ngo?¥ì¾ÅýAaGå UíØÖ¼±°†¹]0r¿OžÅ(çööS 7õŠ·ÿ÷Ò©{Ïf0òþ)têr¶÷Sè:% èT 2òôº†Ùê0[ù)yžçG£SÉŽa.}yj_C|—é[ã ¥É÷ÅÎû§’Ïl®½!sUÜÇOi†iouL¦sÕz±T7núvÞ?œ‘ä)Hž#tj÷ñSE RZ÷\:‹ÃJu¿¦oê½.ÅõdÊèÔnå§ÒE-У Gt*Çv:ìžëZÞïLÍæ)ü”f¬*¸Ì7¡S1ÖÞ?[$WsfÑ©fîï§„6aY§”ÿ¢S2cß?Õ£Sñ²¶.ÏÌ­ü”+4ÔêT.ýyëšÜÑ)áïŸä,wŽÜÝOÓîã§Üi€ ¾ÂÏÈ-Fî?ÆéYË£‰ï22$Wá~€‘ùèÉøÉáÌÞø4-à>~*@Óh1Æáù>ðÜÇO ®;:et <Ûû)¿)¶î²;‚MÐ)ðìí§jk {Ngo?ÕQqØt <{û)M÷-yM¿à ™÷|ß!y«Î)Æ h+ÙÛO›‹<É 7+Ïež8…Å\øÜŒ|ÞÑ©Ålï§fèTq^2¬aNTwšÄbnå§äy’N¡Sá ²8ö’'FTíD{Z®Õ)5¿¢™µÛÜ$ É}ü”üÜɧG§ÑG–7='ót*”Ûç 4 B’ûø©†‡`üT2r.Yaì#ÞS˜[2ï} Ås$o­ ¯jäV~jN%ï ieNîÚ¨ºët{ì¼JØ+Øš~JŠou¥ŸbM£Š—LÿiÙB§Šgêç¶~ꆨҩdøp“ŸË‹¶p­N[Wr/y_tª[ù)×=ޤ“K6^×ôûä…hO‹ùSÊfປ$¹Ÿr¯ ‚:]ÏE­çžTCa=Y6Mú¹BÞSóуS£?³UM’ÜÇOÕ‚Ó¶Ï÷çV~ª tÊ>èx¶÷S~S•â´íëA§À³·Ÿª­-ì:ž½ýTGÅaÐ)ðà§À.Suª8@©ŸaçòÓ'QœÀU›ZbmH?v™§Sš1ÊZ¦_ g¸N­,|ø)°ËTЧôè”°ûÆ&¾¸ð à§À.ëuª8™3§nÅÇnŽpÍ“^I»—,C°¢ß±§ðÂdýIà§À.óæ£ ÄõÇœ‘ŸÐÊ%•Ô©ª2hžÍš]øæ ?vY¯SÊGÿŠãèB|9ÙÚ2è#Œ-|®À“ÀO]Ö¼wxÔ¥._ÏÊd¯Ò©Ú ©Í?v™÷>πᗺfw³:¥ßý~:åðSP˾~ª9Ùtê–ý>üT3\§m1yQµaÇ)œÿ­JêXä&·cQ§&>×7œ~ ì²X§ÜiDùKý¼„ $¾ò…ð/§ ‚‰Ë 4>c è]Nþ‚Ÿ»ð|ßp–(?vA§úÑôû샟» SCÈõ:7?vA§ÀƒŸ» SàÁO]¿ªyŒ¹gpºvßóÍ»†¼Úv¼üØeñû§ŒëTçl€MïôyðS`—Åïu¹D§zr©ÊÂOÁ.Ô©â„O½I*ðh¹9îÉ}…ēœ7kÌá,æ•+¤™ùè¯RD§žŠ«ÞëÒüÔËy]è¦å|IF8£ð%YMaäŠ\õè ~ ìr¡N垕Ӈ˗nñÁX­4ÐØ±ÜS5Å'gƒŸ»\õ¾ùÊðà§À.èxðS`t <ø)° :üØ~ ì2ûýS~¥êÕ.ò]¹!÷ì¸ñƒŸ»Ì{¾Ïe>„—c™NéÕsªœYÓJüØeÁsÈžâe¹R§”/ÆB§~ ,°æ¹™y¦üˆLîdýK¦ä§rÊšìâ¬ãcO—L|%ø)°Ëz*>Ô¢Ô)y&z®Ê÷Æä4QŸõ}V‚Ÿ»\¢SÊGgŠÚ‘LVŸ{­NU=ÿÜSÎKº„û©ÏŸ?{y:68ü|å*?u¦Y§‚¤®ÿª¼šuJSÎdœ•\ì§>|øpÞ?g.÷SqxC¿OØ+È"œ­Sšræâ¬d¥ŸúôéÓ±õÕø”Çk˜ÃOÁWÖßï¨SEáÈeQÜk¬NUí(Wa9zœ\Íîµ~êØúöíÛW:ÅøĬŸ?U5ŽǬŸ>#‡Ëy)³+ú©ÇÑzyy9"ÔŽORõJ§¸ßI.™~îi:Dî¤ÂV‰KiÑÇy¹”‚äŠ-¯ÇåÌ%þå¢/w ý¾£gwŽoå~Ì‚çûÀ³L§ó§ t <ò8z UÉMø)˜:že:åðSP :žâ¼„³åÂñS0t <ËtÊá§ t <šyžIòs‚@‡Ÿ‚© SàY¦S?µ SàQ>7óçŸ!×û)å”yØ:E›ÙšÏ͸±~Š÷<ŒÒ)ÚÌî:¥?¡×ø©¶J¾ôëÔŒRÁF,õS“êöiÖ©…Yä§üX<- :E›3+üÀXÆû)€±à§À:ø)°~ ¬3ÀOù§ufÓè§)XF‹ŸB¤`%Õ~ê±íš’ÀSá§ÎùXLÙOyÁbÉ’%Ëk—Y?5VÙ|úôix²`‡©—yÖO Ìà±|T`Fâ`¯Snކ„~ê¸Ó7vyT`Rú,Y²¼vé¾Ú‘ÇrFúÿù)ŸÍ Ž LJ.gêeþÿ:`™ÿ‚C„endstream endobj 214 0 obj 67 endobj 217 0 obj << /Length 2753 /Filter /FlateDecode >> stream xÚ•YYãÆ~ß_1ÈK(`E³’Mç)»ñÀŽ`¶zDΈ^JœÔNæß§®nR•Ý`€aÕÝÕu|UÕRwü©»*»+I+[–w»Ã›L†?½QÒÚÅvIòîþÍ7ru§²´Ê*uwÿx¶É}ýkò~ïŸ7*™šÍV%ÃfkŒIÌ·›­µ6ùxÜhSƒßMmÜlµ+³<ÑÅæ÷û¿¿ùî>œký%Öäš·Rß)›[há­p6UÆæÄ›I‘)³Ùæ…IÞùølqdl–9²góÇEüöÇo™þ{û†Iðí‘[?ál:¼Ã¥p@|ªJ•v†Îÿ±¾ë^aeU&/ûæÈ­WKÂŽŽTBrúL£ŸðÃSß7ýa£Ëä3Ò€_Þ‚d•M¦=Œ н´Çú=Ò¾ŒD“Q“¬'çñ²6*•»Ó@öŘ@‘F?á]Ü¢mU–¥Öš —cm¶§(:·åZå 16r¤ö<ÔµÀ°ð× Ünü™Þ3Í…ñ c¶1¿à#bÌoø,”[ï릦 †'ax†<ìumTÓxÆ× ðôs¤@³‡ÌæÒÜA:ÎäÉ?dO[0f#)ƒ |i¶ $måËNKÖ hË֧Ϭϖw¸à)¿ôCW¯f&-*£„ŒÀ™Øõà ϜíôŒ…‡©¿¸G°NšŒYÊ,wqÊœÇ&0¿¸=› ®¦|N'(+L"¶WêJ²¨É¬¤U‡ÌébšIÚGý‹˜† Éúã¢-‡…wdæ:K~èÉ'aòIøÆË$‚žB´X‰¹bB³íäaÂB N9©9É—ólœ 34›%ã):Œq|uå´¢{å´ˆ×{þzI#€œ¼Ïç-0<‘œ/¡{ò¥AŽÑƒNíØ•˜zN³ðBÈþÊõùvËè¬ÏSgÈøU°à?­Yož–:Fƒ_6¬.ì\_¢±Væm1¾ˆÀ~í…)tö\¡=»4ÏD7•6©¶Ú|}´²Pä®·ÀÔfŽý-H(¥¦™#ƒs ¯<ôØËêa±Óy†^TÉ;¡_f´ØÇ$ý=«IL±Ù;É ¨3û~éàúö¢Æ€Ã(åü_@ûyIZØ’÷#§ s8Cö”¾®¹qè™"‡´ËìýÀù¼¬¿Y=i ¹WaJüT§€ Þ£;Ò™_SX‘§@­¬“pŠâFff¦V-@Ù•þºLšèÙçŸÇµ½yªœG ÿCËâ\;ĤYV…|å0Có‰lß ’ïÃÁgõ\‘qU!@ŒjÌ/PvG@Ã×£9ÊI¸úØÊä40;ÊJ^FpRRœŽûMܯcAÓÈÌf=hcÓ€ ]‡fŽNrés!1Ž =çIóxî 8ÚÌ€m3®0‰æÐ/SÙÅ+H‘<ò¸‡jˆÂ(ïÀá6‹Æá ¤a®nºf’}çé?NÁÿ'Ù‚Ž(°’…™ýZEx!@ΕXG{¦|Ý÷K"9–®ºT\ºâ@ä‚ 4 á8OCûøtƒ§gþb~_R8íÚ†]0bÅú§ÂÁ^Ö\%ƒ8IöÒ‰*">èRMº}¾C th}º(.Ÿ4pˆÒcì!Æ7qÀöóëw&{¡J>˜;®åÿºàœf/›³ƒ  I©ç¤} ¶9+ÆÖ•®Šà·,Ï>ü_{~휢õ"E‡ÞRØg 6·KÎK“äלšçaù ☗¬2¶âsÉKØZó;¶æÒ&?‡-›ËgR(×U•C‚`5–뀋4qñ€»$YÀ(ÜŸ›]H² Tð%7~}ƒíøû[#“z µ~uÉ6¨Lg<®¼äFº/qz½!ò›‚5(©úŒJuVçIÎ;FO<&37ªË rh8dKÛy’l ±¢û̬¼ íç9i呱=´½FðÃÊ’RÉÈa«©êòóW¨ }#Ó[-Õi‘çÞÓCú^é Ø›£Ñît8¯oül­PGøljÙ«g+šG²icc–L›µ³¹ÃäÕhÛ¶€Ü‡<*(Nu(­Ðnåm‚^á8ÂÑ{`œ®Õ›¹b?㫵RUÅ­|yµ|/Ñ.Õò6 ¹º9ò íYÝó6!õÑè꺎È_.ß•xX—Ø é¿–Gã¦=¢™á(†¼{û„ÖÑá‡tWÊ =HÓ÷FzŒ9¹R¥ú¿ª'WêKÕ-¼ï e ‹ªV4£2€É†²lòpp'LjÝeɳVKR~Åïf 𠾄íë\§p1Ä;€~»ogl”Mü„´‚éèDNo›?ìA;/µýzó4.ÍLü%ð†y²m@ û+#b=ù«±.-”¾xH ÕQIy•Ó ÎHªIPD™”4‹Ü,]l_ƒ˜“åLÜs”“ÌEÀw6X6ùM™ß$æ¦n‡Ygô¾‡çÍÕÒÀ#ž?g¹‚F.¤f$I‹þ ¶G¯Õ endstream endobj 216 0 obj << /Type /Page /Contents 217 0 R /Resources 215 0 R /MediaBox [0 0 612 792] /Parent 198 0 R /Annots [ 221 0 R ] >> endobj 221 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 192.397 236.1516 203.306] /Subtype /Link /A << /S /GoTo /D (Cameras) >> >> endobj 218 0 obj << /D [216 0 R /XYZ 90 720 null] >> endobj 219 0 obj << /D [216 0 R /XYZ 90 720 null] >> endobj 220 0 obj << /D [216 0 R /XYZ 90 599.2528 null] >> endobj 215 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F54 112 0 R /F52 26 0 R /F55 36 0 R >> /XObject << /Im7 210 0 R >> /ProcSet [ /PDF /Text ] >> endobj 225 0 obj << /Length 4200 /Filter /FlateDecode >> stream xÚ­Z[ܶ~ß_±è‹5@F/ºµEÛ8©S8Aã})\ÕŽ´³Š5ÒXÒx³ÿ¾çBRÔ Çë"Á;/‡äá¹|çâ6?q[&·¹Rq©óüvw¸ILõÇaJ[è±õ»üíîæß¥âV$q™”âöîaEä®~ýý±:nD47›­ˆÆÍV)©?m¶ZëèM¿‘4Õnn‡~³•Ež¤‘Ì7î~¸y}ç&N¥|iiØå+Ö–:J§´¶]uÀUÁü¸=µ=,µpUO\Uõ5’h¤m´u÷Ìßõp‚ïû®ÙîF×Â×n#óè#œ¡¢áòØîi§<”&¥áMÏî±bž‡>Þló,‹î° ‰´w8Žð1 “"š²¡Ñ¦ÑvÚU]×ÔÈ?Ø|êoŽN¨X¤ ŸËqY0ízoƬ¦t\䪀±8äÏ|zócÃ…c»Ã]}Ät¼5×÷›mšF¿0`–™ëïií -~8àò•Ò ¹¾y25Õ¸oæk.ãR–²X)Ü÷ÍpÀ¥níOצž¸¡Í,À.|„>=uo×'ËèÙl’eæ°BF}u ŠÓ7Ëf Ž™š‡®~¢#¾š7óô¸š­í¹Ý s_¯¸_ÈXé\ößmò¨mR8¬ö8¯­*óX–B®Ïúž%‡¥¶`tQD j–àD d™GÿI„§™?P8ŒžpžýL'Þó§t¦HdQ¢Ïx!Ë,ªŽGbõªFÖ8ÝÏÑЛ>ªÑ®¥>áêLÐæÉ.4MÞsñôƒOaænMʵ;ÆÀ¶PМzdIJj¢!í¾·›Bá9 IABe'†¸O'†Ððä1”6†•Ï8Ôž>º¡2-ÿ”(œø²ŽÌt¸÷nè§v²< 1—tºf^ .´ýü·=¸¼‡ 0CG·…iÍ– 2ƒ*cJ´¸Wüý@¤ °ØRÒ<㉺npšÔŽ…Ê `¨Þ‰˜ÉŠÕŒ°ùTçÑÝôbsÉöƒ,5Ó`ÕÄÈü­¸¡£^{Ç ¨: £é[7QQö޳êÐæ‘>Ø> FÙš-%ÌnÎ7Z:´î Ër}Zóë¼´–Kxt<ÄT âAÇ®ñFUó%‰39a*ÄãÊLØ!ó«YŽmãp@¿’”Ž¡D‡<‘\^ÛøÄ2HV ͧ°*]îšÞ:5e&†öPÞUEPI°Ck:,çÉnmôTN ÓÑeÂ\@ª½ü8’CØxØ¥lw|‹„•NûðÃÍ@üJspÿÓÑóX8˃ñ•ñX,xà²݆ê]eL¼µ”ܧiᜠú†ý›ÐX´õnÚúB‘Û:T}‹ÀãÔU¨ÑXEÔBÀvW¦0ÆZJ%Áíœ ðcY§/^üaº½7tX %™©,Ói¼]0&6|öaT‹f"iܼñò– ÷ƒû“yŠó’îË,‰ˆ73—± Çò%ÆÂÚÝiœÐ`É´$ÿ‹uÒ$ÆÇ#Ã*nHX¯œ'ÚdQFoB¬ìÀ2ãÌSÆE;'ï5Ï`Í–‡ɶýž¿k Rè䔎™—‚ikf®Lí¸Eªugú]òkï‰k3BnjJøì &¤*çYôÐJ F¥MÊf°ŒUÇSÕ-ùi¡XÕ­ lûÀf”#׸(Î2iQéB@(sé€ÓA3ü µ$N2ðú_K „0u†p €]ì ±€(Œø3Ù¥=Ö•(NØteûÔå# DÍÉ5ÀïÁÊ0º 2:e–Æe*ì.Þþ#îÞÀ¿Ÿ~„å&"z‹åo_‡A£ã#K½F@W@ãV'éþ^Ç®¹Ž•*„]OÅ6:b$±HJÓïX9Ëܹ™@4ÛX?tInœ%@™Çb>ÂÃ2.³5BDQ£¬f™^¡]¤S7 49ð„üR@Ld‘Äy ›üZ9ùy˜Ñd‡$NÆÐíëå×DBZq™•ùZMþMÎÍ2ØJöOÜÕöWæ„u#gW…wd­rŽŽðw u)Ô踖¯Êr‹š/P–+ú|Üh(==\°ùe•K¾o:X«Õµ•¡ûd«èR£E¼ºãd<ÚUÇ “Ám×ÎÞ OIw~D×Kö‚Jýg™¹H?âWjà¿0@q{6Zb4e-°ÛcµÎ7C¦çš,¶€–n [O(,‡>— €­ìeøAQöéÈ㜇:b9`i0ÒÕ£ˆþɰxD:„:xS´ÒMÌ…™Ô€ýO¤nôpDj?£Y»ø5²O2ëß›p˜Þ•¸ÛïesŽ]í8õ ÝÃIíÝBÀ0ŒccnµøÕå»pssà~æ:+«Ðv/SXøödñ¼R.q8KêÑEŽtIµ, ¯„ŒB®¹LT_éË„O!×)8Cm½áÏ”Œ›9Z¢5ÁcªÄù ÏÓš«ªW¸’WøìEš\·mñî³8Ü¢ó´Ï¤Ë*²¿‹ÄRêô«Ó¿ïq‚¤V9H Î0ãlóú>ß>Ĩœvàm×ý™×æÞl¶×jFÅëàj /óÿã&å7eÈ‹8Í`3܃Any-BhÅ4˜\–e5áÌ2FCÒ!¿/¾¢‘‰™'ÑùÅ£üð¼KжàšbAÉßÏx6uH$0žmà‹—GM«D-|Èòµ¼_µ‹ÇОË8Q¹å«QLÿ9*1~9ý…rà’jùža2©lZ©ObÞ>Áï+ÂÇ÷^„ofôßãÑc};p¶ ë­3R ^…>{åšBßâEJ¦‰%Ã:Ф²`÷x‘ƒ’Y $ž‹4`ñÓÍûÉm èò‡3ø ¡f,ÊRÞnd§F\Ñݼ»ù——®³$·>M ê6G5âs3 æà½¼î7 /» '\_kákªÊßu­MZëš•J@¬#rZl^8܆„, ˆA‘ÇõEÔ0‡ð@1ÄÈOZH3& ºuœèsÌýŽ¢•ˆ/êu@-Bâ!Lܰ´lºšØš<¤}?†åÓq1»&—hž\ÁvË;ÅÑ?ô…¬¶T_ñ* ˆ’yðU ±”"Vz{4LvR³r§Ø—¯c(£:iJq½|àÖs•dkѽ”ÙK OiC/ÙDy¹XóhRsò×y9ï†Í{™ïf>·\³M™XËå®PîMË4.ÖoyõéT[þþ%ŒƒU沫Σ+¶{è?þ¨cB• endstream endobj 224 0 obj << /Type /Page /Contents 225 0 R /Resources 223 0 R /MediaBox [0 0 612 792] /Parent 198 0 R /Annots [ 227 0 R 228 0 R 229 0 R ] >> endobj 227 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 464.9268 267.6972 475.8358] /Subtype /Link /A << /S /GoTo /D (Mouse Motions) >> >> endobj 228 0 obj << /Type /Annot /Border [0 0 0] /Rect [197.3638 422.4399 338.0609 433.349] /Subtype /Link /A << /S /GoTo /D (Modules) >> >> endobj 229 0 obj << /Type /Annot /Border [0 0 0] /Rect [214.927 302.0606 441.8818 312.9697] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 226 0 obj << /D [224 0 R /XYZ 90 720 null] >> endobj 223 0 obj << /Font << /F51 9 0 R /F55 36 0 R /F54 112 0 R /F52 26 0 R /F67 85 0 R /F14 125 0 R /F3 128 0 R >> /ProcSet [ /PDF /Text ] >> endobj 233 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/myfilelist.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 234 0 R /BBox [0.00000000 0.00000000 138.00000000 270.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 235 0 R >>/XObject << /R8 236 0 R >>>> /Length 237 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hln¤g62³4×3S0Ö3µ473S0Ô3´´42¨¶PpÉç BpVæendstream endobj 234 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150405) /ModDate (D:20070503150405) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 235 0 obj << /Type /ExtGState /OPM 1 >> endobj 236 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 286 /Height 562 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 286 >> /Length 5500 >> stream xœí½uܺ…qKy©#)t^KŽ˜ÜT†%ܬœ0’×R íÈõ¼áþ6~’ÀðlÙš’l}Hÿ, Ä_´úóãu§@ŽP¬tŸÏ“=Ÿ_ƒ?âšXß÷O¬t?¯ö\_Ã^ýk{.ÝÇ·™˜À»+¤çãÿØ?“+’ž£ciïgªq4=Ï{ñ܉W$=?aû~:}Y\Qô„Ú÷;nׯûÏ×@é¾8ôøëð»h¹‚íw¨tÓÎäГ•rGºýÊ0—άwßÄLK =nÊKZoÏ×tžoiµ¯Ðßx)Ý3-ÅôáCÓ#-éÈž(=†=S™ÖÐóæyÛ¶²è¹ªœžig{úµAíHmý¿IU¢Ç>t~óÑ3¯x&•sÓÖãol1žGϳYÄç7‡!ÔÎÕ¬Aúoülü!sé±ì™¶4é±ì1˜i JÉy&=vÂozèÇví¡ôL¿Jéq ²éé²b6j³ò©Ürõج‹={zÔžGÍ=ŠéAbz°bô˜K™µf)aÓ#—Jç£çÓ5çõõðk*«®.Ö„J§éyûø6ùt=@öê[`yW "´b¢gréñïm3¾ÎeêïçdÜÏyËõýGÔ”þ7_öûr³gâè¿?GÔ’Þü®ðÍöLu´`{ˆ®ö˜-ÓCu£ç“÷0=TLÓÅô@1=PLÓÅô@1=PLÓ£g˜_Æa×§SŒéÉlÏéŠÒ3Ò·g´'žëž6ÎûÛôrýx÷n¥Ò£w®Éùÿî¥çö{¤öL®œeG+¡gÒyìÉl¹È’ûW='³'—Y5ŸÄž zo–†ý€p÷ŸsAñ;ÓÅô@1=PLÓ¡çý°ÀŽÓwò>BÏ íy1Ê£ç»ýõ;׃°ìÁôœÞ¦‡Šébz ˜(¦Šé*¢G^½IS`Ãa\Vëszƒ »ïiVóåËà7iz=½Ø#P† ËõÊÀEË¥\óÏmI1=ëÝñ­©Ðeíu{~Õq‡óY.Þ-ë‹é!—ÙoÉ-ŸGzÑ]ŒF~Öz¹‰‘Ò¨R“šWñõU‘l$Ë=è«ýƒJϰÇÞÛ¬ȸÖÐ3Èâ ÷¿gÎÖX¯6¬=©ÿGbN‚ZäR°g°²$WÅ×Ñã\_7vkᲫӜÉ÷í}©’uô¯L’ ëÜzÍ©t{ÌÀܾ´î Ûs»ên—N_ K·G¸ ¹öè5A{¬ÀìYKÝ¡H~)h¢=VÉÂôeË³Ç ¬=º¤žÝÀ¹½^M­ìÑ»“Þh©O¥;ž‹G\0 `¹SDÏR’Ý€´(VMJÿld½ ›Úö«dŸ=¤N7ØóP4èêÆÓfÐZØS@m—ÓçAû!»øÜK?t½¡ÿäÁ†Ý2@Ñ-ü »z/G!œ#“ ôxe'lÎÓºo×˲Æ»wlaq©β =’pcYq}©m¬`–ÜßÅý=PLÓÅô@eÒó²w|‡+‡žó¹“CÏÙţà˜(¦Šébz ˜(¦Šébz ˜(¦Šébz ˜(¦*i û>T½Ë L­”tû Æ`±Åí1ƪ¢´Y@tnŽ99D‰³ È‘Bd$å2ð™ñÈj±¢\=uÍSâƒ9éÎã ¼´6–É´§R¢yʤG.ÑՀ㼮û3»Ã+$š§E¦7òÚ³lRu窔hž é1ÖøéY¶ZQËž:‰æ)½åòÚ£ì©X÷ÔI4OYÇ=êC¨j&ÕÃÝTÍéG̓(i Ôm½¢ëžv>ç ‹ÏØ¡˜(¦Šé‚ôl<ÿÊw7 =To¯¹_`˜žmC¼Íóî.Ú#ïÄ bôl8ðrãø.§O¿n¿ÅNy§£g'{žÄåQm'ˆFèiÙž=ÃaFd׈䫙÷抑@ÏÙíÉ£gÜ÷Ëë¨NR½²)ìzCóV×rèyºZVáì4D>=ÚžQŸÏ+{–»F½Ù#KOíQËô-’¥J°'‹ EÏ8Ðw~úO¯"[âÑïtÞ{².Oz "‰YîQÞŸ*qì±÷6ëÏ&ö¬R‚=±ãžÁ´ÇCIÀ¹½êXôÚó".2¿—<{*ô9G‚H9î,k–[²…eQz9o]Kì3ìQùì‘[;U³|_§j‘D)›š =òª ¶çQ“¹sÍŸ*UÍÞ ÒZ®R{„Ú©=4Ü|{êTÍ ÒZ®eºŠA¹ãÙ¹¨q¤å©=ÆAÙ%³î©Ør‚Hª{ŒŠÙ×€“%ªYÓ¸‘k>ª¹3ìù#s˵§ÞqO ˆÄã£íò7ì¤MÒÍ–Õ°¯µGe¶dTï¨سË9—u¤˜jÏÖªCÏ*ÉË\Ö=›Ó#/©š‹z±çàÞÂÖí9¸·°u{˜¦§,¦§2=¾AZôp6|¤fŒ-K³‡ô]ŒÂóvþ¼bÜ|uzho‹é«68Î/±G¦D“ôœ’V°§¸¿Ç-£ýÁ€èÀÿõšöÀ<‘*ô÷¨ròäI†ëØcïmúÌhp¦í\2i2zN…"ô  9¼.ßžý=Õ'ÿ-´‡¤c÷4gÖµ'vεÑ俉U³Uµ j¦J’,M=o'«AÉÝGMОeçªfêQ’-‚=ó’ºöÄ[®R{„9Ú¹ÈaL&kÓ£ó-k¼ÖÓ#æ«Oþ›oió^öDëó€"RÝàÉe9’ Õ·¬ºx§ª9á¸Ç°Èß°«÷BWÈvþÎÕƒ­ì¢í¼¬œª7컜s¹à7uÎµŽžU 0ß‹=›Óãg¾{¸¿çøº'Yëö0=LO$¦Ñ'=úhÉ:g(8€AôIÑ[x=-ÓÓ€=-ÓcôŽäÔKŸa©çÄ­ ¢Sz,{ä)±ïÿª z¥ÇèÎ1û7¬×UAôJÕ#h÷Ϥííi›Ú[èÒC>¯ ¢[zŒÎTÚc¹—=Ócø1ø«å-«æÆéqëâ}ö†éIѪ#ľéIÑÖö0=÷LO• î—ž*A0=0¦ÁôÀ :¥Çl–ÌS £{¬ðÀ°szí)nÜÀñm]ÝÒ3>=NEõêÛé¥üä‘,½Ó#ïB¤G•ŒP¥C è°ÃÔ“øîéªÇ™v8 ç-í÷Iß×z§çx{˜ž3Ò“äQïôÈi&d mUÍÔ·ÆN¢[zT£=zvAúY…©*ê5ì-Ó³µ:§gk1=IA0=0¦ÁôÀ ˜Óƒè”ž:S[¦§ÎÔ~è! öëLm›žÃ;S›¦çøÎÔ¶éÜß#skÒ¦‡é‰Ñ+=Çw¦¶MÏá©-Ó³µ:§gk1=IA0=0¦ÁôÀ ˜Óƒ`z`L ‚éAôJ<‘úqrf;ãÄ3V5#ˆNé1ÏØCý¨9ݧþ :¥gé´±ûuÌ·"±sÑ+=ÇÛÃôôM9]fØžz§Çªš½öduŸúƒè”§aسaÃÞ2=[«wz6Ó“Óƒ`z`L ‚éA0=0¦ÁôÀ ˜D¯ôß™Ú2= t¦¶LOVwØ û{Ž·‡é雞c;S›¦çøÎÔ–éi 3µez¶Vïôl,¦')¦ÁôÀ ˜Óƒ`z`=ÓS::%#ˆžé9Ö¦§mz.r‘ÿœky`ð|;¿y^jv²ŠüS¯èQî„ÏØ…zórÏ¿<µžr’}âÞ>=ÈŒþ² £u®NWgï†ÐCb{¦]GÝ‚,÷-5džXaO ˆèQ‘]½…Ë«ÐÝ_äÞuá¾Ö ¢zšõ;’·iú0ÿìÉñ(Dô`{èÕ,r P˜K”qÅUsØž£é™+CõÆÌ[ßÒ/?º_‘NÖ¢>ÕH-ÐíÙX öNÏ‘|Ý'ïÔ š §m{ާG<]æ—C;4—Ç@ éq]Ó˜VüJЬ8ïX9A$Ñ3%wyöør½uÅ [š=ùyGÂÈ "ž)±?济¢¸TOåÃ[Š=%yGÂÈ "JÏ ¨i˜c‹ÛS–w$Œ¬ bô¼È3ªöÜÚ¥—˜=…yGÂÈ "JÏo1Tµgj´ãô”å #+ˆ„ºg²¢=·¸Òêž’¼#ad‘Ôrý¾}¨dÏE&•Öråç #+ˆÄãžß™!>éA)†Ÿ.BϤ÷äæ ##ˆä£æßyöøÝ™"#Ç©GÍyyGÃÈ"¡åÚNñ–k­¡gûÎÔp`;v¦‚(¸¿‰{ ¡˜(¦Šébz ˜(¦Šébz  =v¤Èi¢ç¤ö\ô•S¦ÇÑEö@zÎW½ ‘NÛÃôbz ˜¨šôÈÛñÌ…£ûaû‰+«&=ú.=²ÛÓºQUéÑ›é>{À‚ÆTr£Ù0ßø:èŽÐ3èGË7¬êôXÓuš·,j{èÍÕ «*=·ß„}›§k°÷Ä&U¿î¹½›~A{–ýª7{Ö×=¸Çç‚â3v(¦ŠéÊ¥g¯;«ZÐËŸlzöÆÖ€.{¢ôDn »#½Ñóç$û×wŸ= ôœÃžk9KéÙcB‹ƒõ ¼ö$Ñs^{˜žYLÓÅô@1=PLÓÅô@1=P«èiýÃz­¢ç´öpÝ3‹ë(¦Šébz VÒc (¹…‹ Yݽ©\IÏæö˜_mÅžDz¶q'˜ìþÇYëè!Ó£QÈ£ÔG20Õót$²ÒIc Ï¯õåáyhýö¤ÓCì± OŸ°á<[ž<IÀ é¨Ö@BööÛÛ“~εØCG€ÑÄ;gmâ.´G‘Ñ‘xÁ„Ⱥ}ìI?çZc¹êØc¬ÓïÕ¶ÂÿÝ;¢‡Ž\u6¤£Z=#\Z¼Mz~¨aú­*®ùâ³Ç»½»apýaö$ÑóC:CÆOºU³Y*ßÓ‘Œ ÃU³½ûÐúìI§G ?•oí†Ý°Çût¤¥aì4F]~¡îX 6ìÍÑã=ç²âó…k/Ë.Re€jž±[f¾ã4ï±[Ni79ø «*=ÖƒÂ|Ï ó.Ë)mîÃÈÖ‰û{ ¸¿ª¯þžÝÕWÏî꪿guÕß³¿ºêïÙ_=õ÷ žú{POý=¨£þž=ì°ÕQϾÆÈÒvÓßs„?]ö÷ì§Þú{vVwý=ûŠû{ ¸¿Šébz ˜¨5ôœâVÿbzNáN1=GÄz„Šè9"ЃT@ÏÃq¥|zN&žý Šébz ˜¨,z½o%ÓsJw’é9§;©ô°øù\PLÓÅô@1=PLÓÅô@1=PLÓÅô@1=Pqz¬çùÇ/5<ªi•bô¨ÿjc„o{‡ŠÑ³ !Ùs¯ŠÒCFW껤¹qZ ĵﹹEë¹c‘±Ùž!ÜžûkîB -—s—€ç~ ï=w ¤ãy»šô¨··µ÷mOÂq¹ÙÊ|+_îØž´–+dÏ0Þ¹=iÇ=éUóÙ“xÔjØ…²HopOöð9WX|ÆÅô@1=PLÓÅô@Eè9Óˆx)zóQ„žÚcÜA¥ç7rz–=˜žÓÛÃôP1=PLÓÅô@1=PkèÉë l¸Lóc­Ïé_ &ì¾§Y…/O’r­¡§{è|Ør•3ZÀþfÀžLzÖ»ã[S¡sÚë¶#àŒð½„5k•¼f“3¯¥°× =C˜Ó¸hO.‚ÈKG‚>¯aPÛÑ‹ºÔ{o³ ¶'ž²y-õöž+AÃMÕ¼„Dì1/"ÑK‘&%{<ŸVÐ#“¥ØWþäVƆb¤ß%ÉRÆR%ëˆÝÆd[¯©¬-{ÌÀHJé‰Úã™×Rí\Yö7!×½ &h²§=¾y-—Åôxrté1Ê–gX5ztI=»r{= cmœ`0¯è/ßÈ숾‹§Â²  –—ÒS4¯%jiýŒ´ {‚U²ÏR§ìy(tuãi3h­_N(ž×RÇ'”kºa'ò”‡šÐ¬ud©{d0:rA °–ž ®ÞÏyZ÷í YV`X›x*=‰å]˘iO^â9Z›x*=絇é 'ÎôÀÄ™˜8Ó/¢‡Þ”iÞ߶žùÎtrojb ’—IÚ7:Ç/ Ç¸¥×Êf=ÎéN¬‡Ø“Kf†Þækd²Æ³ñ$%Nì!™Äϧþ•kѳÜà-È,5é±o &žOY ë\u粟™RÍßY¶ Ç¹sxuÕìLB]eϲ€N.`ԛгÕÎ¥&: OS©HšäbÎ œøÚº§~ÕlÑCÖÔ·Ç=$±´ºåÚ°aoÞ•Ç=Õ ÃUsu{rªæµGÍÔŸjöÈùlĸ=Y ;Ÿs…ç3v˜8Ó'ô¼}|czì¥=Wf®ôü;}fzÌ¥Wz>®¯ÓÎu}ùdzÌ¥?þÞ^¿ÜìáºÇ^:Õ=b±´\éw1Ø“—xŽÖ&žØreÜã•oOfâ9Z›xÚqOÎpÙöä&ž£µ‰óø(ßÅô@1=PQzÊfǺ#{xT|X<*Šébz ˜(¦Šébz ˜(¦Šébz ˜(ž; Ë¡ççѵ%‹ž¯GÇÓš z¾~òý£é ›øñ Vv/\:MOp ñŠVw®Xéfz®íVøçUàõ}ÿDJ7Ñó ~x}ߊ”îJ èÿV.fendstream endobj 237 0 obj 69 endobj 240 0 obj << /Length 1919 /Filter /FlateDecode >> stream xÚ­XKoÔH¾Ï¯˜¶7ý´Ý»7X@ PvE¤=°œŒ“1xÆÁ6„Hûã·m=ã¤E‘2íêG}]]¯[­%ü©µ—ëÌám–­¯v+ÄŸW*´‘L‡<»X=}éÔZIá¥Wë‹ëÙ"›Ñómq«¨/ãDEmœc"ó[œXk£×ûXçÐÕW}ÕìãDç™t‘ÎãoV/.FÅNëÇ áSl™^++ŒMuÀ–æV(ca3AÙ8q©‰Þ6ŦÂïý  Ì\t~' ÿè üUßqÀ6°£¿ÒèUÙ`ïeߪò±̦¼P:7¤÷b[¶%šÂFEËËc»ÃuÊoh0IͶº‹u(»ïXBŠax 33 ‹=ÿ6Ú¹èSy…‹õ,¬ØÎ8ž§æ®û DmîN îTf>' ý–ÐñŽìtG*Yžy˜€ã^V0®.»¥½ëLèÔ…·€3˜³&…J g3jPN²Ï¼¾ÿ*ºGØÍWþ  Õ¨è ¡fi¿]„—å`mŸ­oc‡[‡`®eˆ>ÕÆË¯è¯=ú#j¨Âï‚Ížt‹¦vîì`›wbÞ/é5RHgü’mTtj•ÿÁ8-\nÍÏA.¤ô‹g@[»«j>Ä€)DÐü<ŠÛ[ˆÍ,*‹V ¡ùe =ˆ*îà¬J1îž¾Þåë?šÕ_KÙAÙL¤Rj€” ï´ ØoÐæCL@XªHSŽp+‡yYÕòŽ%ÆÚƒï—õÁ}S‘ÙT…8«:Üaa ÂaüU—}O<Ì…ø«C°ó€‚»þ‘ÊbŠ®*øÂ¡?§pÐn«²§HeasÍ“7mŽ#²iGÿé ý¤©·heÆAz;Ÿ|œv79•£s´:¢ÝZC à‡öÓÓ¨ å™ Ëß5¨¥ºæ/ܹ^¶ ná®ã„ ³ÌDÏÊšÅ<¨ßªŽTÖU×s‹À¦MÕh šýÒžÆ «†Id‰q:êÆ`ʃXîÀ)lù›Î¸ßþ_©Œ®êjÈ؉Ñ~Ù`E„ˆ²bx"¡‡R,ôŒÆ Ï`»BUí'KýÒ–NOÿ>ÎM4uX¥œf‡ÅÔ­ÓoDY?ÙôÈ(O lÓ`]ÖeBh÷9í:i÷0¡PپؕܪBï`”¹APßs'jRBË"òê›-Õ™€¨ ], ÖásqQE° `a8íÙeQzÛ–]Çâ1ã+»†’¦– ä8£ î¥0>ç´²=¦ÊB®uºÖ’´2óÕ—Õ‡r½Nñf&ß!ÁÊ{½Þ­´„4ëÒAP¯ÞCjiǸd2]“2ŸYCYÉd¨0ƒfi„ÍsK_‘X¤ÚñA°R‰Ô:óKÁNÖ$°3cjm Èmž§žÐVK¥%Öy(³&CN~ƱHž§Øc@Þ£ó Õã€âôF';ºõ“pÔèÅnŒ=7™f6Ñrù½ç¯KrLrßï\Õ”¶â€Ì«Z`G¼ 4. U¥ÈÔõñˆ“¨`êÅ~ möÓ÷ôÀ .ýÀ;UÂäXã}&$ò‘ÿ}àã’ÉtÍïœh&0÷zça rëmúKÁNÖ<õN“*aSC`3“ê‡Ó€:3wNN»¬à¸hé,ýïôfL„€!⣮> ņNk'Œ½jØ?‹ ]¢cáù9´_½å 74»Ù•} I‘D›¢/ NòôžEÄǨž–ò šË £€Á.²ƒ›±’ŽW’{´^dÞæ^ÄY†w(e7HŽ–ŒéÁ5 q’ÜÒm‚)І€P`àÄfŠLi’ôüKæCóx2OÇÒWÏßbÀåvçK ‰7wÜ´wL'ÖêÔœ½àçÉæpß2gF͉ܱnŸ·T ûp°¼¸¾/Ë“œlµÐ}x¬×J¡‡‚•¨{rÇ%Ó |øtÁ‡îÌÿ|“}< ÉÓãMØ’'·f“ÁåʹØ…›ó0ì1¬'ËMãIÃÅÛ;…xâ{îß#±‚*ïdúÐmÍÁÝ»ìgn2pªXo–n2¨Ý¡E '‘C©)ÚƒlÂöœÌé´+àfÀËîyN7Þ¿ñÂW¯ö<ÓÀvi ö<ƒf²Gž·/‰Q’8´Qj\Û/t)j6¤KG¬ˆ¬%pë^±}Í|çpzH…ȰÑðôšŸˆ@R­7Ðé"ð¦Máұ³©èIÏC¦eF–¸Xàtôðƒ°ÊC™[âøKoRMÈk Ï*ÜÁc·+ö›8¸ÊÙ#S¸n2‹ÕøìÅú¾öó—²’"k€Á,“´tWéñ©ã?lûõ endstream endobj 239 0 obj << /Type /Page /Contents 240 0 R /Resources 238 0 R /MediaBox [0 0 612 792] /Parent 198 0 R /Annots [ 244 0 R ] >> endobj 244 0 obj << /Type /Annot /Border [0 0 0] /Rect [242.2063 145.1938 371.555 156.1029] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 241 0 obj << /D [239 0 R /XYZ 90 720 null] >> endobj 242 0 obj << /D [239 0 R /XYZ 90 720 null] >> endobj 243 0 obj << /D [239 0 R /XYZ 90 606.4743 null] >> endobj 238 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F54 112 0 R /F14 125 0 R /F3 128 0 R >> /XObject << /Im8 233 0 R >> /ProcSet [ /PDF /Text ] >> endobj 245 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/load.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 246 0 R /BBox [0.00000000 0.00000000 264.00000000 60.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 247 0 R >>/XObject << /R8 248 0 R >>>> /Length 249 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`dfb¢g630PÐ5Ò3¶´01QÐ5Ð3# S¨z —|®@ ŠÅendstream endobj 246 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150405) /ModDate (D:20070503150405) /Title (blah-000.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 247 0 obj << /Type /ExtGState /OPM 1 >> endobj 248 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 551 /Height 125 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 551 /Colors 3 >> /Length 2068 >> stream xœíÝ=rÛ8Pæ:ªÒæ)R¥ñLêÃ#Hã*…O6Uγœ ËPüE©÷f#Ë4Q3øòI´÷]¹¼«ÿûýû÷Sÿüùóíííz½n19i…íz»M»…¯_¿þKúë>$ëÈi?äóF£1íØT…ä3‡ ø—:o¤Ò~ig ­vUØbÓ®çÿþýûM×Ùâ1ê' ra»M»žùãÇ]'|Ãh4Æõc'x†»N 5FãÑÇ)íJ3Úuêo$¯W<”~¥í:õ76ºœ€Gp¹\+Íh×Iu9uxøÝ/4ƳŽÕŸw±JÛiÛ9‚`¾ëü\}ÛkØ6–p§}Kôë.í !´ ë”ð“0*ª?¿¯Óž'þcþoß¾µçi>©É×uŸÀ¬ð ›Õ§²Ñ´ûºo§˜­`õæ³sv;Rב:‹lÝu"S§úÕuDpZåtêöM¶ct‰xh¿·Ø>`öþúN©œ˜®3õâ×=vÿ}·§8ºsv¥ª ýÀë»NçÎÙdê ë'6½Ó޽!48OUH׉|ÔÎÁK8¦èT#=&è‰iN`v§möä˜Í° ®³(uªVâÅw¥Egð¶¢<šÙ®™:euÙ‡ì¨;I×KÈûǦ8‡˜®Óþò]gpéÓ–v×Ügv§üh§ ®sŸE]g0ÒúÞÄ\íšiàqœó¶„O€´ü¾ÎÔ !]gæ –®3õH(C׉ÿq]àü6í:Adöè:'·u×¹{ž{ºNxÔpÏÝãõ53F£qzLµÓ6¶~ž©®þŽ@}hûÍX©YI¸Ó¦šjªë<==uòŽ?m¡ë„·ì‚›Ïu‚Hõ/_¾ä^ gñùóç¦ë4w^.—›Ôi¿—'u¸[HêO²4Ás“:í|*]€Ú]gþ6]€5Ú]'Üó6ñû:•®À k»Îû÷ïwZùñüúõkâ»%œÉÁ–°°Æô9Ê·¶ëµ%•ìåååÓ§Oì~&ÇV¸û³ç(Ÿ®“C½]ÖcÉ©3±ÂB^â˜s”/Y×ñÖǘ?~„‘©“ÿLN¯°„—8òåKÖu¤Î©³žÔÓÐu6'uÖ“:pºÎæ¤ÎzRN#Gש£çëëk}=†ÂÈ÷§ŠüÙ]l”:Íyè<ýþÉœ=½kRgpòÙWvÑ+>»Bà@rtÙ­giê´›oÉÁ“»uzÞôÏf'¯¯¯{/àvë:çHy°ˆ®³ŠÔXdÏ®SoÙ1ÙyØÝÇ/š¹ú?/ãH€Eöì:ÇJö´Ím©°ˆ®sÏ´Rà>ûwfãnGEûÎÎvßžaýñÕÐ'Lýïvæïß ÆÎ]§ºÝÖ÷½L©ë¬´×iîioå9ïïˆù)©pŸ‚>×Ù"]úO¦|‡ÔØÎuþƒ¤ÀvNÞubR'òK©°^¡]§Ê~5AÌ£K€•Jì:ÕWNÏþ”ÔXoU×yzz ý¦=ú;lŒYÔušdùÛuêÔiŽ ß¨üÍiÆÅw)ÁÍ;lÁõz}À®È€Hñ]§ír¹Ü¤NøhÇÿK€i‹>×iîü—:w_ÃÀÚí6Ðn¿¯ÀÒuÈG× Ÿ|]çùù9ùê8¢Í»ŽÈ ±m×€H ºDÒuÈG× ]€|tòÑuÈG× ]€|tòÑuÈG× ]€|tòÑuÈgqשiï5p` ºÎõzÝgœHl× ·F£Ñh\?†í: …Ú´ÅÌ$·Ý¦=Úu’?Lx³Nð.\J¶Ý¦=ÐušK RͨǴ3F£q‹±I-æÿ×u¶»| Iæ ¡M7í¿]òøÚì€ôendstream endobj 249 0 obj 69 endobj 250 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/tools.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 251 0 R /BBox [0.00000000 0.00000000 54.00000000 258.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 252 0 R >>/XObject << /R8 253 0 R >>>> /Length 254 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`jl®g5251 õ --Œ ´¡%D±…‚K>W _™«endstream endobj 251 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150406) /ModDate (D:20070503150406) /Title (Bildschirmphoto5.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 252 0 obj << /Type /ExtGState /OPM 1 >> endobj 253 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 112 /Height 537 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 112 /Colors 3 >> /Length 6633 >> stream xœí ”Åy€»gfïs¤] s!âˆM ¶9mç qˆ vŒ1†ØNHBœ‡<۱͋—Gˆ¯Ä&Ævޝ>x¶yðˆ8b$΀d$:VÇîêZ¤]í½;3»ùg µÝÕÕÕÕwWOÿ߃QoW}SÕU=S]cö÷÷f___Ü1Ôæþýû㎡¦0÷íÛÇMX¶lyÄ¡$ˆþ~×jmîÝ»×¶jùòá†S+ôõq*·¹gÏžê+V¬´fgg÷ÚsàèÈøÔ±‘ñÙÙ¹ˆbÔ˜–¦†Ö¦úe‹ò§,ëjkn´VÎÍÍÙ´š½½½ÖÒÊ•«¬…áщ'^Ü584a´I"›Íœ{úò³O[fýù̶½KZßH5wïÞ ÿ¬ZµÚú{ËÎþç·ï/–f#3a,^Ðvñ¹§u¶5Ãò÷~îÂÓ»¬õæ®]»àŸÕ«{àõ©—z7ïàwK{Nê:}åâÖæÆ¦†Üätq`p¸ÿÈÐþCǰâ»àÌÕp|™-_Ýwøé­{l+cÙ½¡¾î=—cUÿ›nÿá'ÞófX0wîÜÙÓs ,õ¼öà¦mÎCœÔÝÙsòÂå‹òí- S3EøÊoùªj‡ŽŽô >Špq¸ê’u­M¦iÖ×eáø3…Rå$@ù‚”¬? #“1üØfMv_ØÑrÍåçf2™_nÞuç}~þÆË^ »Ýóà3ÐÙÎÔo=ëÔeù¶¦–¦F '›˜š™¶œÎÍ ʼn©Â‹;ú á (ô’óN_”o53fSC]{scå=+7…“b©43Sªœ³œ«áÑÉGž~)WW¯ÉîW¼yí«—ÂÂꮲÐRår¹cÿáŸ?¹Õ™Ïž“»aë¶–8SKc}6“™.'§ c“ÓpFx»Æ'§·ï9ýx{ƒ…küš•‹3¦Y—Ët´ÂÙr•·¬ÜŒBV¦f £ÓpÈ宾#¿|vK{~¡&»Ãeô†+~úåoÞûÐëB±që¶Þƒ¶L65Ö¯Y¾è´åÝõu9è447Öç²8ÓL¡8>9ÅüB“·}ï¡WzfJºV'/êü­³O…âËdt´4Ôÿ™¹r)™ƒ¢o᱑ ÈdøÉ-»µuûÂEK=wo¨ËB„êk÷žeåæeºPªž½¥©\_ÝwÄm÷¼û"Ð::1µþ¦Ï™SÓXu×OŸ<>f¯ïu¹ì¥ç¯éηÁAá}Ÿ Þ7p oÚñQˆ³ïf^Ü1gB2ÊBá=[Ù9cÓuÙl÷‚ÖÆú:(òPd*õlN7xl ®l­Í ÷oxñÐ@ß‚ùYrîÞÖÜPM“ßýŒž%ÖJ¸šÁÙ[›^¯Ý[v¸íþî·ŸeÕú‹¯ù s´rݼã{ÿãÌ$´æP˜Aâ©Ë»ÝDìê„êðÝŸjÈ™u ¾$ÚÎõá?¸ðøø¼‹Ðþ56äÀ&6!WSÓÅ#C#…b©£¥ñ›lšÌw/ì¾´«Ív|ÐÞîÀgnüÃzìx¹=ù—ïopfòÈÐØ­¸. p¬3O±xi÷¸ÜÀÅóöï<ÒZ?ÛÜÚ!%œë–÷_6<YÊ,Ê·56ÔPBá²e”oG -g;[ïøÞ†ºâX¾{‰ÛîÐëæžâ™mûdv·ÎÞÕÑRMí?2,>;ðé½ ^ßqíÇÌÃGG`éK?xÔÁžÇ>û'¿ õê6ô¶ óĦÂiŽMÂe.O·ßóàâöúö|—¼A»Ž~áO¯›„ ÑÕÙAxŸ¬ èW¼6< ítn>õï?[ØPèìZâ¶û¹kùBŸ- õÞÝ:ûâoÜýì?4,>;ðw|¼^ù¡[ÌþÃC°ôå>æŒ`ß¡¡?ºtÝykW@W ê8]¾¸ÓJ:2<™‡‹N.óÜöýß¾ï¡UKv,Xä[ä ¶ì:ðõ¿½zt|:SiUàtf¥ß0W¹_†*5 º2Ð߸éö{WvflYÂÝ}ʼnlVÙ¼c@°;pëuWÀëU¾ÕÜ3ð,}å¿9BŸhoiºùš‹¡‚˜ U‚†þäî(’ÐLMÏà¿ÙÙò¾/oy~uOO[çBçA$y꥽߽íƒ3•þí¯Ÿzw›—{‚©k?{Ï'5u,\öîÂu|q¾Õswà×–…¾÷¦Oš;ö†¥¯Þû87ˆ­;û×_ñï|ËZ«_hÖ¡M,WÃ-Ÿ¸ö3ß^Ý2¾dÕš¦–v¡4žÛùÀBU*Í­]Å¿ ÜÝ?ÅíÊßu~O»-Kè»<:R¹ä”? ±®§‚Ý[Þ9¼~àæ¿7·î>KÿvßÜ Ž¼²ÿè W^ð»þZ¦tîá&6—Æý'm¾ë§K#Ö¬X´pÉŠ\}÷ 2üüÉm~ýf³|o}[3›>®i×5¸RWîÐ ¥·~ôËo{SWûü,Å»;ð7ï»^oüøm拯–?|þÚýÿËÍçÜììáÁ×vì;xæÚÓ.:«gÝšep­<|lî6<ÿêÆM›:³“‹ºt/;¥¥} ú£Ç¶<û·”— Pd¬ •ÿ€a¹ú‡™L¡X„š±öê¸âì%í ë³;ð±÷^¯vëçÍg·í…¥;Ä ”ŠÅ‰Ñ¡Þ}‡‡&F‹ÙÂ\.gšé¶ìtW³ÙšïêèZ 6³óïŽýòüö¾}ƒ2[v7N¿åÌSÚæ7€ñîüåÕÃë_}úŸÌ[ÊŸ‡~ã'Oºcn®T*ÍLŽ MŸ™š˜-2¹ºúÆæÆ–Ž–ö|}Sk6›5‚ÝË£ÃGzáU¼Y3´}'÷À«V»ÿùú·Áë-ŸûgóñÿÛKßz`£ø@pÃR*Š…° ˆòÕ4WV³¹ºJ8þÌäx±8#Þ,—«¯ojójµûGÿð­ðúÉ/|Ñ|ä™í°ôŸ?Û$>!æ†ß¿^o»ý«æƒËŸÚý×/Hh ®û½²Ðüâ×ÌžØK?xèé¸CJ6ï{×ðzÇ¿~üà °ô?wHÉæº«Þ ¯_¹ó[oýëõÄURùÒýO“P46oÞüØ®)W¡ëÖ­‹9ÀDq÷ÝwÃ+ Eƒ„"#+® q…èë=NÝ…Ây¯¿þz_Û‡‹Çy­8ý ¸ú[Á)1NŠ E†„"CB‘!¡ÈPdH(2hBóùüÐÐónëeRÝ•Ä'œŽÝ@òÔ¾Àê ‘»2x ’p…²ÁÈ¿òD*´Z@Ø5Ö²µ xÂj[ãž3*ç–Ü8ª¼->v3ɶP[pÂêž3*î–Ü8Ã*Ά8J#>¡’+¹qâ4Jâ‚YÝ>ÑBÙ#Ä&Ô³Ê'H¨ ) ¥Û¤\,BÆÌ 5:¡ÆüÆQ¦Ér T¿ýPA'DAœt§„ E†„"CB‘!¡ÈPdH(2$ŠŒºÐXº(1NBã6äWh¼qÊ %$!¡ÈPdH(2$Š E†„"CB‘!¡ÈPdH(2$-„ÚÆ"XàŽâ cX(-„V /Û$ô5Ö‚`ªÁŒóáî%EƒŽÖB} ˆu®4\F{…ŠÖB¹IÁ‡Ï…ŠîBãuÝ–¹ÃíH¨ýOµêväð¨¡t å#nåmí;»¸•7潄!²2(&ÙB=•GO²…ÑvÚeH¼PÝ ¡ÈPdH(2$Y¡Öv„ÃI¨˜u ¿B}}Mì8tŠ E†„"CB‘AÊýh2µà”P²Y…ª<2˜%TfÚ1ñ~§†f %¡Fô%T<œÆ¹eâš;äk¨ü„LžÃiœ©‰¹•w·0&›Ò™PJ( Åì‡ \P•~(®Ð´_CËÕ5Ö‚d í­ÊϤɰ,"½†J^XÝöJÈ%Ôà5ÐÜ+¬L+oÌ7žâ¿SJ\Ͻ¼Ûõ´ˆíÓ¦$vÚeˆ¿Ê×$Š E†„"CB‘¡i†B¦B†¦ Š EƇP«-ó$åo²PØ&å]+ßBPÐWe?Zf× Ód7‚Û#¤ò»ûÚ+:¡Ü¯7<ÎøÉið£Õ²Pç±,± Á° ÃeÔ…çH#AB埑wî+ˆÇvƒ7,Cò GVB¤BÙõ’ßԻ凛%®5A’Â{&x#“]BBÙ?%…Šwa%$U(J•ç®T>E‚…Ê´àjog`zUyv½ü5”MòÕÁr뇺5ÙÜxÄ­¼S‚¡ž÷Kb¡nìoêƒ?¡2wŸ$ÔˆàÓ&A[왚,èã;dH(2$Š E†„"CB‘!¡ÈPdH(2$Š E†„"CB‘!¡ÈPdH(2$Š E†„"CB‘Q*ùCØâÑ'‹„ u>¡O$„F|5àFÓ'6‰„"DÂ&šÏw†x…¡¡a6VÐÎÎp#EÂ&Õ¬PÓ4ææÐ"I»P°iå4ÕB«6-PœÆ/”͆-‡òÐ×qæAÍ©‚P;MµP8;{ EiÒ+Ôvºi”H¨QK’Q“Bƒ`Y)$4(¶rMBÕá^vI¨"Ül“РØ2OBAU>¬*o¹°îpH¨ ‚k…²7Î ˆûÿ)j¨Þ yÞM¥W¨-ž8t.iZE`Ö×ç&$Ô7âBF¡Aâö¼DÄ"´Úoc‰§Û$½äÕ6®êÜ]»˜±Ê\hp¬¼$©c/@¡FÅ) E‹J(Ú]C±ˆE¨F­<:4ú™Ô O¡ñFÂ&‘P„HØ$E¡±<0ÀªC$êBãzüÂ)T“H,…nPdH(2$ŠŒ¢Pç4ÔžS{þv â¤Öyæç›l?@6êB}ýTDÀT¿HþðDÊþŠ„ó7O ¹&ÿ©[0 ¦¨ÚæžË­PKs¡#"øj¸ý*/‡å,Ÿ#ÏpJ¨ß•29—‰Þ ±P·Ÿ ñ<—x„:ðDæÇUä‘*ˆ„sU÷wtPZI¡òÁ;ì†ÖBîòƒçŠPÃ¥õ4xí¸³UÅjåÙ“zVy·¾JÔUÞse,(TU,H(2ÑÝzF‰-˜(c£G!¡ÈPd}ë ¶xô‰Ä"aBiî;Lj ƒÙÐ'6)Ðx‡hé ›P¿£Š=bÛ"Áî+6©¦„"ÎXÅ:¬^BÙÉ©<óÌÇI¨/õÚ ­F/#Ô¦> ¡~aÒN¨-'òyC¨Â<ƒz e3)ÊÝW¨Ú<ƒ µåP ÔmKD¡¾vƦ…PgdžÑÛ¶¤k¨=gNœ+Ýž '¡ö ¸9±UmÁü$T*'Tåíx õ,w‚ml[’P‘)v†+™þ •Ê uì툟RÇšËÁ ¡j7*Ò.T&,¿¤W(âg‘ì¡Rz/ïY—ý~øX…„ò‘¯Y6R-Ô³3ï´“”~ÚD¨Ø–Ð u(IB=+)ŠPÉîš8HÝ…Jö ‚ õÕù|ø­µPù>V@¡~o%œ¡š õÛ] "TÁ¦÷í×Q¨Bç_Y¨²Í*¶B W?ÔðÓ·gQ\%KõÃF½„*ß•ÒPdh°2©ÎžBã„M"¡‘°I4÷B$êB5™qNŸH,…nPdH(2$ŠLP¡nÏö«=óÒ¼ ‚ MÐψ Ô- …Xê‘°I4X !6)¨Ðê ›„ 4®a®úDÂ&‘P„HؤÚÊ^ BM˜P·@°„:/¬~£MŒPñ\$Ô_ˆ,Ê’P3TPï°XPûOi£¤0oŠd6BíoTªÔHhê’P¿3çè"”[*%§Ë¨±ÊÛªõUbêÙäǶ%b£ä|JYrª‚˜…z^þ#êÔ'!»BÅu*¡\w2ȶ ‰-ö™zMvÆ-„:Ãe7ˆ²„Îñ¦+õu) Fi^ž ºmnc•ön“§Mg„‚íµêt{ùMÉ[8„úŠ[!b¡¾ŠgÀiؤZûp„[—Åx…Vƒ“ÌIdBQÞZ6©Ö>`–Šxña“jö+Y_'Fh5\ t¡X$Lhlè ›DB"a“H(B$l Cˆ„M¢áŒ‘°I4à!6‰„"DÂ&ÑÜw‘X¨ ÕdÆ9}"±PJ¸AB‘!¡ÈPdH(2Bu›ƒ@p^A¨‚•¾æ&ÀªÕ,â“*LŽ›PÁÄVlªÛÄ8ìÑ‚Là$>©íȶWn$ΰ„RBNÝdœ˜xȘ?ñŸ$òSCóçÀD™k _¨Â´Wâl„'ÔmŠ)„ºÉ%¡$T¡2S… G#ÔÐðŠØÊ+çÇó¤ÝÜVÞ˜¯Ûê‡"CB‘¡[OdèÃdH(2$™@ßzÆ‚-}"±H˜Pšû“Úè C6ô‰„M¢Áb‘°I¡ Åxz€„žéád¡òÏ#úŒ„M A¨ÚÈW^ÆH¨ªM GÞªòþGÇ$4ø¨ìùùL·P¬1îLVñ…ª=ʃPÜ'Nä3­%4Œç/*N¥Ð0ŸfIe+/˜bÆmî î\+¼ÍЄÚÎ✞ÄKk´B¹S}ÈüÉNçÃ[‰#”;-ŽçšùP·™ —2Ë#¦*/¸HE Ôíêá6uçJæ€q4JâR±Pö˜¶·eî‚£P®>çÐ*jRm 5_C™ã¨E'¡¸““´–PÊ$…Ù±?á…¿†Ý]({ü¤¶ò褺é½S ‰”ÞËŽz„Bß nä¼ ˜…xUp'ôˆd50œÎÏgŠ¿Sr‹ØŽì¥¾„VÃU€—CÊDì —ì¥¸•—Œž‹{–H(2©}žBã„M"¡‘°I4÷B$êB5™qNŸH,…nPdH(2$Š ¦PÁÔUÜI=¸GP›gD2ñÙÅ!I‚,Ô×ô8¾Ž<µÃ&I¨Û”5Üùs‚ÇàyvAHnt›Pŧ$c?»s¥|¯tl©êY=#q? e ¡U¨Êó F)ñBk¼ÛêØ#CB‘!¡ÈÐÇwȤûæHýW ØÐ—tȤþkdlÒ=Ð!R<'Ò:X,4R×± O¡ñFÂ&‘P„HØ$šû! u¡šÌ8§O$ŠB 7H(2$Š EƇÐ(çð;õBž7ås9Œ9l¡úÙ  B3Û¸m€BP¡žE@mÚ¶ìضì"9Uwî<<Ühñ;÷ K¨ÚÔ]òÓ;9ó)9å’ø¼âÝeмJ•÷µÀpú)™y¡lo-JY–?¡ìŸ’BÅ»` už¥º^¼šPnÄò%TàBá8¶5n¥O TÐRù F±•÷U_‚¬T¨Œ…Æp •_¶lù±­”i1» G뿤•7„Èlòç ;BŠŒ¦·ž~‘-U ëEgõ¬ÐÇ_Øi”ŸÐ);­¼fbV{¬§™ BQ¥o?çTƒúȳ¯œØÎe’b>•‚÷ÆŸ—œ·Æ`…(”…¾uýMq‡QSü?žYÿendstream endobj 254 0 obj 62 endobj 257 0 obj << /Length 3327 /Filter /FlateDecode >> stream xÚ­ZÝÛ6ß¿Âo•ˆ¿©ö^Ú´ R4hï²÷ÐÛ pÚµ²Vãµ¶’wÿû›áú°él{8ˆ)j4çã7Ãå«þñUY¬¬”¬T֮0ý銇Qùœä»ë«—¯5_ñ‚•EÉW×L®77Ù«mõ¸æÙP¯sžuë\J™É¯×¹R*{»_ ¯ºênhÚý:Î:åúÃõW?\ k!ž Iž“+ËLQˆ•qŠq©´—ðz ²)m² ÈÙtõJ:´<=Ñ‹[v-ÊzìñeÝá¼Îªléi×ôCOTôÓûMßµûM ß£ ½`¸mºib±:ŒÛjöáëͦAMzMáÄТž`û9—Œë‚>l––>à]Mzƹ"¹Ž“[ç~®g_÷DÔ©ñc?ö»z%ÏŽHßÜ­…Ͷ0cˬÞoz"Fi÷4üJ Ç!æÇ!Œb–K;@Á7ÕP½¼¯Û‡@»8:Í™Vª ¤_…Õ›°Ò´ç"{Sç^-¹ä† íøR=ÀdýŒRû}Áê¬Ëê?ª‡Ç]M(Ie ^K µ¤„-áÊH5$Êl¨š}˜ _›MàøyVÑ5õ€'ñD“íGúí«ä‚n%hoá8tö[8¦ž¥Nú-œ¨ƒ¶4¥qþhI |Afû_G„·»Ù»LÜâÚÙÆ%Y.l»©ý{ظ“x»§oPÖªš»ÃÎà<4‹ô®ïÓç]r&J­Ã!nŸëî¶Ýõ¤Ü2avJ¦HÇ«ÓÆš¥N’ KVÈBVýã¶îš;Øýóf«Êb© —^GJŠ Í°B%GMãd,KIðx:~Ž¢¥+P%¹—"ù žUÀDòð¸Eu[û?$UZ܃Œné d乆ÉB˜¥±ÿŠð¡=ÀY•Á]pôàÍ'î1±•jÜäòªžpˆ§÷ ˆR6¨_ϼeÆ’ö§–ê˜- 6øºñ¶O³aNª˜#«çà}> ^êÛ“àFªÒš¡ìÒnCö×\‚É4û{â‰&ŽÒ8&aóV=ä»¶Úäì8±W°Bþx×zPñPíQ›M¡‚ŸÕ§ðZZÎ ° ÀÙ%3š{ü ¼ýëÆéò9ahŸ3D‘Þ׿ãž!½3Î%>¨ì7µ=î‘g^DÓÌÊ“òXÝ×d²\¸Ó-qW2Å7LüBÕ0’å3ºTåpÊ^QF­™ƒð”‚I:õo©ƒ,™4Ò J‚O=Ú* ¸ë>F¥¶îÃ×^зRîÄìÞ‚_\ËC|€äâmñчؤ¤v*­þ²¤PvEI}|ÆÕ>X9.ù&: bÀEMXA‚òñC®ƒ¹Có™¨eÙæ˜r&Ö ?­5ø¯Ú$]Ù29Æ¿…'{ñŽÍnG²ùÂ4@¡ªÃXï@¾®!C€Âa,QqV ˆ|K@õ@ÐlÀ%²¾iÂÀF°(¹ÁÒ°R+óg¸MYòt˜òòXPç¥ ¤*HRÿ1ЦÂ9— 4AôãQ„ó('Š+T°ŽÅ<)Š Õ—´éâT ™í«‡0Bõà/–ÍBÌ“³ŠŠT"ÀøitÑv4®è%šÚ+”è'š¦ý?øè'úC‡îÓ¼åÕúìôDc*kÂN¶5…ËÖâÉìÛÃÐsiÌèT`BÜýTLæÆ†-ãÈ[„ m€0Nb=”¿i*¸­+L†KVÂÕʱÒEi<즀ôá¨Ç±=ù–9¨ V {"ÊúÀ÷ûÕ͇bµ@ùãUøøˆQ“ñ²«‡+Q0í´‰»«÷WŸg‡À2ŸóôÁT®,„Æ"ä†qe°kˆì^Àök(j†)…¦…•%+,,ýÿvÆÓ »Ð¥,ArT¦Ç—¢pêR¾)a=´÷™ÚÑ#¼Í‹Œ‰‰/šLQ„d%w'5îÜ?x‘U=ýbØ@G*ÊÉKñÁ° ƒ-yaü… |ul@ãè2 âr“à1¸~‹Ax“Âàý ·@x‹¨w|ãª(cBk%2%€Ø±ùbD$ZŠt@„n¬€ô‡Å1h¤úè;‘!BÉ‚3e_-!ZGÎëeDÆ×þ8Ô±$3cÈ_SbÁO=‘#û:Ì{Å&‘,«Ä¬fVظ»TÈM!–ÚJn|D£õïÁ«±ÿ'4…•°)‚¬ô<Æ)ÜJÕÝ“šN“cΔv™ŸËYF§ó1À˜p(³ö0)5Ôß#äîCt %ð;Fni3,\ö]·Ö"kT¾u)) àu^ð3ƒåó0ý>†²XIøV:ã0l¼|ûP®¾o!¾|©é, ÛÒº Þý!ÔY¸'ÉàÚâzêÁ‹ŸÈ¨@¿àδЧÜs€È¦0n*Ùñh‡.—Áñ)+a[cQx; 9ò›;Åuº@'תŒ¸Å/ñlŸàEŠF)gý/x‚—ÒÌñÜ=Ïk_ó/ñƒËNƉ]Lkg]ÆóÎ3¦ˆËwõ… ;fl™¾yxDcgäTåPÿð¼ôHdÑ}'¸é ‚]¢(‡ì‡¼Èþ7v§2•æŠá»±-25ɾÁ«‚í¼8”*#WBÌ98î Åa¤Ëç„©âðŒaêžå´ôs3!»„p–Ê? ë¼8+ÿ|0!_¨ÿFºç„>gH`æ“Òš.ºãsJ‹dÏ-Æ.ÔӱǦ5+ ø?1ª? þa±mŽËì&„‚`Že´)2ˆ §Û“„“¼8štå=Žtùœ0±‘s†APHfï£9žaáÙIµ#e„‘î99Î.:¨(Tä$içAíSH¾ˆ¯Q•†òþ¨M!άÀ¤æî9eF²çöpÆîO©rÊG„oçÄUŽtùœð‹ .Ò-U)C³§(èáfÌè“b¢íšÓgvèa8¹,);ŒtÏ }Îpìè¼| ˆ‹+&•òˆ"2•c!ECʆ-hP·‘Ù?{L®¾­{ë´‹òŒ=¸¢LÚMõu”èÏ=Bù›p²eiä –_ñŽˆš‚rÞ ¥\ü#™±i]ï⟟,®»ÂÕš W:]{¸ß ê’%¯x^îG°ý®@Ï»uho.ºŸA$ê¢ÝùÒŸÒQ˜±&mg—o)ãWس…Á»Š:©ÚL·(Õ¥~E°;u•ïú”€þ-5˜ïJáõñâÞÿÉœìØÒéïÆ?¸ ýpûŸ¡YV^ÿø—8ÁÛk†ÍxŸO»‘EG ûí/ùº“õ†ªÓxa.]1)H³ ö] &µt0G¤Êgd)àsÂl7P@ÉJÚÖM¬B8Èï•$ë¥ï•ÔáxŠm!òâµR$Ëgt)ètÊn!¸èç,N: endstream endobj 256 0 obj << /Type /Page /Contents 257 0 R /Resources 255 0 R /MediaBox [0 0 612 792] /Parent 198 0 R /Annots [ 259 0 R 260 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R ] >> endobj 259 0 obj << /Type /Annot /Border [0 0 0] /Rect [371.3352 526.9244 522 537.8335] /Subtype /Link /A << /S /GoTo /D (set-load-path) >> >> endobj 260 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 514.3798 189.4184 523.5313] /Subtype /Link /A << /S /GoTo /D (set-load-path) >> >> endobj 262 0 obj << /Type /Annot /Border [0 0 0] /Rect [337.7863 228.1623 471.2341 239.0714] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 263 0 obj << /Type /Annot /Border [0 0 0] /Rect [502.606 228.1623 522 239.0714] /Subtype /Link /A << /S /GoTo /D (load) >> >> endobj 264 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 215.0116 277.2832 225.9207] /Subtype /Link /A << /S /GoTo /D (load) >> >> endobj 265 0 obj << /Type /Annot /Border [0 0 0] /Rect [305.6834 215.0116 497.518 225.9207] /Subtype /Link /A << /S /GoTo /D (new-geometry) >> >> endobj 266 0 obj << /Type /Annot /Border [0 0 0] /Rect [147.6002 201.861 297.9337 212.77] /Subtype /Link /A << /S /GoTo /D (read) >> >> endobj 267 0 obj << /Type /Annot /Border [0 0 0] /Rect [404.494 89.6265 522 100.5356] /Subtype /Link /A << /S /GoTo /D (Commands) >> >> endobj 268 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 77.0819 126.3637 86.2334] /Subtype /Link /A << /S /GoTo /D (Commands) >> >> endobj 258 0 obj << /D [256 0 R /XYZ 90 720 null] >> endobj 261 0 obj << /D [256 0 R /XYZ 90 388.3196 null] >> endobj 230 0 obj << /D [256 0 R /XYZ 90 184.1342 null] >> endobj 255 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F54 112 0 R /F14 125 0 R /F3 128 0 R /F72 6 0 R >> /XObject << /Im9 245 0 R >> /ProcSet [ /PDF /Text ] >> endobj 276 0 obj << /Length 2211 /Filter /FlateDecode >> stream xÚ•Y[£F~ï_aíËb©M¨¢.°“d¤‰´É^,­VÙ<`CÛd0t0Nwÿû=—ªlÜh¤6Ô)êÜ¿sêŒX%ðO¬òdeÓ4Εµ«ýé!qË_„{ÚÀŽÍt˧íÃ7ŸµX‰$Γ\¬¶O³C¶åÏÑ·Çây-¢¡ZoDÔ¯7išFéßÖ¥Tô¥]Ë H}±ê®]odf¥Éú—íßoc-åÑ~…S©\mR©c« núæËI$«ïº‡Ž{ð 4‰²Z¥6‹¬Æçúp5ú 5PQË"5t´=‹#l×Yu¨IÔ5gV÷¨eÑVMŒz ab¡¬¦“¿/öH?Â^#¢î “hðgÂÚ M×±…vâóKÞ!¢3o»œ§oÿì»î¾}.zø¬(ëÉ7<Ák×ó3òìP˜~Ž^‚ ÷Ú3xF¿6uUÆk°«‰¾ Ÿ–TÜ6áF¤±Ð ›YõþÒÐÓã½U¨¿%ý¥ŒÊꔳ¬X »Jd'SV6°L°°¿ôäŽ!d ŽT3Gæ"Ne’ƒÅ‘ÿ\µˆ•ß<óz*b¥ßÛí@'ýZíQŽYméepÎA1p…Æ»¢À³NDêŽß£ U ‘¿(Jke³;¢ˆ(ưvÕ—*6yjLœIÐ`fô‚#6eƒ¾’ËŠºõ¡S2±^£±é‘í ‘LÑ4ôÅ xFчžûxæ¨×±Æó-•ë%#Ñ:¸ÝAÏ·&‡E 6ø%E]xÚè¥uT'6žt¬–ì.k©„³åvmmô~€ø¹ò¶ÿ_"TÕ””›¶±°ÖL™uÈ ‘`‰W'£nûs¼Ò°“MšÀ!Nq¶„!)Ü£ Cö¾R±Ô¹™{ÿ\œ8BÀq&*Îüë\l¢sàFûaŒ‰Ñ#•?ª[¦Üo‚Ý@,$ٲї-‘ÇÒå>ØõNÊž¹~ÌÝJ°jHä¿ì¶¦2á$¹lþGg²ÖYã Åé.üBZ´þ…Ð Þ D(4wFM0’E;<꟫œÑó3'sãâŸÄ>0±\æQð…—ÉCæÊC°N6Â$ 0•ƒM٠Θnu Þøy ±0¥C²ÃjÁGµÕ ¿»ôíß®X!8V˜4Á”¥úœ«Ì¨¿/…d!Æ‹gTšìù5È [Z§Ë ôÚÑ þaïœ\Ôp%„]Œae¨o°<_•âÓ.$ÃfïC¡vy‡À‡A]xî‘p8zTƒ•SG¥˜8à¡ÃÐ9 _ÀÝüäd´Çµsçº$’ôwü3í†I³±T>Àbs‹aÝ•\çÍÀH‹†G," ²ÑùÈVmGˆj=DÝ…å<‘ÚåÞ·÷K¡M®Å"·×(¸Ç2ÑùŸc™éwà8¾ {Ë꩸ aðøkb„þ™7_CzÍN‘š‹™Ôq2~Òïìë¢aÊ †\‡Ñ[:Qå¼0 š/4YÒÚ`iåØúŒõnv’Ì D~|Ò#J t ©zd‰9ßÈhAÍb`šY\¥ð«|ãÏô% ›ìNªf™p}ê¨ F=t×V_ùⶽȴ/¦ä^çÑ©{¿0qO¸“]#<-q Íô:Dìø·h=¾dÓöÆñÞMˆ{Ä h^DBÝË$Œ»ÄÈôd’¶Z_ev’

Çup¥ÃætrSI˜]©àö.ã |±£.±»J†>!Í=Y¾bMj©7óÿÜ¿t/9pîêû*¤ªŽpÁû€ùÒQlôÊà}calë¦aêŽÂ…uíN“Ù;V,~K¶„/ýDKJ‹É“AT:ÚxS·¾Ì4cõÄŠÒvÃqÚ¡ÀÚmêNqZÞrO°…{,‘š‹‰KµÇ¿ì&­?À˜Iv,t—F‡Ã]u2ê^ÔÀYÞqè²1jç5|ÿcG·Ú±c¸j|ÏN?rÁK‹wY7|êéžñý_ßm0 ¡´Uþ¶öŸ®o&·Ÿyc¡ Ç¥ïD¸šç“*X•,Ö ÀöXLïÓø×Ï,L>œ3Ä­Àd®kT†»~ùB–ã0)Œ¼f÷­¹ìY<^¦—»WXhºÂ5ïÝÞ^fòzhI8¥ÄDMç®0âh¡ãåé–ðŸ 8†ïûÂôÎŽW¢ endstream endobj 275 0 obj << /Type /Page /Contents 276 0 R /Resources 274 0 R /MediaBox [0 0 612 792] /Parent 281 0 R /Annots [ 279 0 R 280 0 R ] >> endobj 279 0 obj << /Type /Annot /Border [0 0 0] /Rect [430.3947 170.8966 522 181.8056] /Subtype /Link /A << /S /GoTo /D (Point of Interest) >> >> endobj 280 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 157.7459 184.9395 168.6549] /Subtype /Link /A << /S /GoTo /D (Point of Interest) >> >> endobj 277 0 obj << /D [275 0 R /XYZ 90 720 null] >> endobj 278 0 obj << /D [275 0 R /XYZ 90 684.1345 null] >> endobj 274 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F52 26 0 R >> /XObject << /Im10 250 0 R >> /ProcSet [ /PDF /Text ] >> endobj 285 0 obj << /Length 3134 /Filter /FlateDecode >> stream xÚ½ÛŽã¶õ}¿bЗÊÀX•x‘Ää-A¶Ø¢‹éEÑôAkklemË•ä.Ð﹑¢dM6 Šb€/‡‡‡<÷Cçüå.{(µN)ˇÝùM&ÃßäÒÚÄ6ùæéÍÞÚü!ÏR—¹üáéy†äiÿäÛc}ÝäÉØl¶yÒo¶ZëDµÙc’w—ª`ª¯wcÛ]6[U•™Mt¾ùçÓŸÞ|÷6¶J}‰4ùmyf`Ú<•Ism,ø÷M¥“î›»2!Z¯§ÏÒÃO•œa6O<@ãG„^ú€gÇîûöÿ ºïpþE€éZ¼cÓó´òÔ<<ÔÉÔÙCï÷ˆ×oŽ£w$}€þm=U/íxÄ[|Øæ|æm®ÓÜf̘£…n{wë=*Ü×d:úé[ãÇ$»š¶6qÿ…Î'㡚F¸}¦‰Oþp(ÞnshÒͶ°Eò¾F†èžyË ÒÈAQ*uÎw7ðBÕU&Ÿp¯O Ì61³µ+S­J âGn/M?¶´Œg’¡ó´0 A ûÈ7gT•ºÂ•ó»{9¶;Üô”Xœ‰,:?Òfñ°õÈsí3?#<Š˜± ØŒ âÐñ·Hl|@þ2;± ›Šàr1tË0z9,/%䆫0o‚ø"9/^ÆN':u6?í®cmésólþ]$ïà:Ï“s-J ó $qK<¡Î±9]ŸQ4OÜ;þ¶çú,áå#¥MâÁMÌEáëǹW#0šæÙŠr{½N@8ð5N‚¨› C~…¬³k‡G¬6 $A3b vQ,½ ÷ˆ&iñbŒ‚Ú+³AÛ蜰t¬ûC3r»ƒSY›üÔìd ¾ìyýD)tv"iÔ‰d`#× Û9ãtò7>ì ÌŸü–(x8 ‚7;x1³Ú™pzhN§§ƒš¬b™Ò°¡œôÊÌïy°oNMÍ280Šstl´Ê$nF´ƒ`ìø‹ºß׈š ŸvŠ4¥Yc&š%´(8h› oz‹Ê£Ãf;ð÷Ô~”{ÅíÝ3«ï—OÕÆÙÿD+ŽÚ¢eD)Z3xÊî¨n/ÁF‚N¸4·díÜôkmfŽ-õ.Í$ ¾V‘ÀA'h®DJoýÅÓ±gîÇ,×_³qNØ‘MW¬´Ê‹´t¹Ëû¾&ƒ¶f¢•KuLôµ›£úþ~XuEjò2÷¸Ùê­Yÿ*µê³Ü§Ø»G>ÂävÞ®´‘1Ú/. ÈbiIÙ—è¬H³¢rÀŒ \(Úê \w}Â|Æ0÷*ÕÄ£ÂJT  ³â÷q>òöéëNÃx{­|ã=ß®oäà4Ê|ª/49 \ÀZ˜[¼—½hÇÚ-uÄ&Ⱥ ™<íÝ9g¢†êSGfšuOg'˨õLŽÑÁtý jJÝo„À2ÄØÓ¡8¾D¿…tNd/r"ó/}àðà}"Ñ ²i3³Ç÷y†Ägî°í¡æ±Õ‡CëQP@ÇyŽÂ;7±år“ÓFþÞT1™}‰ò͹ÄžpÏ‹ù«üàŠL2ÜÞ¡e"Ýá4y´í ö<–ñ»†G^5‰å36OÌgÏ<0  †Õx֟šñ,†k•=j¦ADzáÆ•c±Ø#S¥ÐáQ‡mc×z“ˆà,óËï 2þ˜ÙìÒI'"’Úq`ü™€E!°$d6ıÐ&äÏudçgž ¡˜ÆÀ‰¨s‹ôB»,J/tå¼7Îb!u±º,Öd´äc¤ML>åq$8Þ(‹orö^ÇvàÉ*ãqãã÷nðÑ;NÖüYrO°î´Úà9¨k•¥Á‡e –åZÓ²6%•¼ØØ¬Y~[¦E–yËÿX‘—U)0_Æ©mZå…ñÞÄk*гÈCÔ£JÉ-ƒT‹A€–¿ÝjÖpÌgÍQ4|ûïé 5ÁLa›,áÁ'í¥Ý_#D›œç¸Ô98Ã<öeWÖÝPîÑäKìŠí;†±{äQTÚ%?tcl;B^9”Â[Ùq°x†òÎÈ7™¢ ¿Ûö^A¡íÑAµP7eX… 1“Ï _ L®§l´Ê’¿NñëÎ{4\;ðÐàž Å¼¤Û´X%õ¿QܱEêœã¹âÖ#à 8,ñäÕkÄ]O†…PzÔ¸ëJ¨¾›¢â…VÕ /PøÀ¸vÀµ†¨Í´P48²¶R“DDr~©TÍÃŸÚæ…1Æat9qÛ;I>°ŒTÛÝ ¨…â1Úx…câÉYBåof^©d,ªª,£&Ê\!?"q–E!Fwîî>q¾õÑ¥š¤ ƒòŠþ»Uû’–ªôæER¾5T€æVýbLxÛ™eº)aÂç…¡éZ”\9 Ö¨×“j±ÅÌRÐ8‰·b “äi5ªßË%„oì&ÓÀØ25EYOÞÞ—ºÐˆ½nÛWLµJË2\Ó/´Õ¥^Úê`]崿ɶÒxÍÕ@?䃳¸îŒ]Ø]²)xs¯ªÎFB ´j‰°Hƒ´y=”3ÒªÁwšr¦Uï¹õÞp«ò´¬ŒcmÊtß*T~ a8±Tm§Œî·¸ÔR›B`~íà¯J8V¬±.Ôs@Í#O¢}&ey/Äå6èJ]‡¥ØÈí¾Þ+^ý8!7š‹ñº0©)‹Eö.úÔEâú"Ê:Š|îC¦Tp ‰_¯*Eˆ)©Jg•%›ð@¶ÃO«VrÊy• é Ël©Gña_¨+Ħ$ÊäjŸÜýÿD|ioÞ]8ìý­ ľ!«¯eb¸Ö;’¤¬ˆ Njr .zÊøU½wl•ñ%”0µìy? \ßÇu j|Ú€í­CT Pœàrû^ÙCºÆ:­Æ8«³rɽ˜m üa¶Ÿ `Ãõ"lD qCÐ¥ÐAy€’ÃpÃëÄñœÔ죂%nÎÊìÛÝ&L($²ÛxlWEn’£vðõŸuøŸ Î!Ðz-k z‰j)>N2§ïbßuwù+ìë·øºbª"y+b‘c­~åâЊ̳2uÚúÄ„BÑ’mà³ëo"ÜØƒ0Ö¶!‘3¥JBãŒwÆÁØH@¥‘uNÍ(¨§([Pi¼ëT1¥ä68>È}aÜU_ È Ú,ÕÚ.|ß áï?âv* /k†ª³:¨‰Š2FåÑìSf&y?+#HH`ÔšÙÃÑ ÕTÅÁJÖ¦—†%Ÿ%Ñ^Å»"µ³'„(ïkî{qeJH[¬ÄÆÊémƒÝÅÓü¢1ã•Yj–GÑH(´~ö{Þ dfí”5—<ì#»ÒMJ€ÁhÆG÷5EP£©¦HÝ8ð0ÿÒH‹÷"B2wj0Â`ý؆tÝ#$Vßp= ùºv~™¤ëÂ’)q²wŽ3»†#mðC=YÁúk~1Ùç‹¿´ˆµòhÒ6ü<НtXÛôú€ œ¬aQF)ðèná1Vñ®šÔp-…$ëiÅLâ£d;]©·|V/ÄN'ò¼ïšì ߋЦdñ6¹ãµ[Go¢(-ÈÓ¨–§Q„ tÄ!Œ ‰‡D+ü‹ê]Ú,íÈÌ´¯C0z»r9T"Ó“wì@‚ÛHBY-Ž[‚§÷5:=Ïo´—e’aäÚkÿZ½+ŽnÈièBýŒÓ0Ešç!Aªƒ™Øqòæ"_èfÿäöùé‰#cï›ëÑ·¦…¡ä/%˜n±L¨MÆO£8p¸t}ô¬O›ûRlßGÑžø/DÑjFÌùŸ»n]·-“ïûô›¢2@ÆD2(ðõ{<Ô‡v\ÍœlªlQ¬$£Œ²ÖY=èfVrTáƒB#„Î}^iÜWrjîÏÍ…ŽC^Øgwëï‡Ç®QÞ·<í³SsvïÂ#–³SýØÎ!t÷¡XÌoÅÅTÞÀi®¬yWU9{l°{¯ÆËÝÌ+õ°3iæ ',@®ñëŸÙÍŸã%Vtlгˆ— œ@MÚF-ù®“SjH“Cå™dvßžÖU[§®(Ýr˯ø2Y@i³¹Ûär‘žx¯ ØÍk~8ýLÚ:{dÃaú­$½K‡Ÿúßpý÷º†€ endstream endobj 284 0 obj << /Type /Page /Contents 285 0 R /Resources 283 0 R /MediaBox [0 0 612 792] /Parent 281 0 R >> endobj 286 0 obj << /D [284 0 R /XYZ 90 720 null] >> endobj 283 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 289 0 obj << /Length 3024 /Filter /FlateDecode >> stream xÚ•ZYã¸~Ÿ_ÑokmE%“™É³ i$ÀnæAm«mmËRC–ǘ¿u‘:Ì> ´)ªH‹u|U”º‰áOÝñMfLTØ,»ÙßÅÒýøNIk›)ÉßîÞýåc¢nTq¡nîf“Üí~[½?”OkµªõF­úõƳ2?®7ÖÚÕÏíZçðª/·Cݵëγ8Y½þz÷Ïwîü‰֯±†$¯ñ¦l¥q¬oÒÜFÊØ„8.€«xµ'[`VxU«²AN`;&Q‘ÊŠÖ¥ –GŸ$«Àþ¾dÈlå$‰²4×2d×ÁV3^æ„‹ó²ÝÀíc‡bù†ÿ*îó8”ý¾²î~½ew o‡[~Q6ç;ï<ª~ѦE¢í¹ïÝH>äûf£âD˜CÃD*‰ù·¸G îKœæ«úÄ¿'êmdùjǽ%½-Æå°]âj,âAÈpÏ2dJº¥IjÌ,›S÷Êä(„,]ղʥnn¡Ö$ÕŽ÷Ï7I3–$\‹;f-(YeË{:²î<ðs=œè}c¸ë÷óZ±D„†äsÕmH‹TšFI–s5ÊV›ï! ²iƒÊ õ5(_íª(45pG*/Ø`å íó%~E&»uÿŽ$‰Dìb&"·Ê¬~^)vŽÌ’-X§°«¦NÜúNb?ãƒIèø÷BÉ  :|ä•vÊP耣éËdæÿÇÊVÍŽ_wüû­®.üú‚jt@·ÍKºî˜—m§²‡3íO0 ŽW‡®a=Õ¹ ív÷0p/ qG_qÏ=v û4 £QÞ°ë u€j´;nù(&öÎËHƒ_/g:þeA¢Ö¶{yUÌtw¨BJNÂÄùÄ k¨wðm¤`]gÞö ,-9 é@I»3‘L龡yÑË w Í"q~XË6/|¤L±–&š ÐT!eÖ¶ˆL¡3Q±k‚«…ÿ é£.¢Ì$BëuƒkÝ~œ\ùõ<³Ø# U¿ ­¦E6¹ÎüT¶S!…ís´72OC#?UëDƒ6t8h§_¶´zS=o¤‹A©^}!gÌ';[må0¯­ÖÎjm<±Zè®Zœã¿ì(˜çãñö5îü‘©KþaŸÜQ)·Ÿîîž8öåPÉZ]˯¼_·ñ"h°É ç3!¸HXm½÷ÕôÐðKé “ÄYóã¾êÈ2"A(Ü=FNsÊ®'ÃåmP£3 m%Ò_{:?öÀÑe*vQà Ò–A@ ‚O”*U,¤…†gbØy.{Æ–øpÁÓdžÇÎE6ÚWÓ k>áàÅXÊž$\ÄÙêv~¤;û 2Õ• ø´Ë¡nF¥!OÓìÜ„¨S;ö< c޽âö±óÞŸÙy{ßÂqˆ¦NÇT ,¥v$‚x ò¸O¢ûÒµ[xDµº mnWMŽ˜“ßø@âQ'?¡c‡>Uއ15¾¦¸¿×áÇ;¢¥×:èÅÃÜŠ"àþSãÀŽIN­róûùæ8Ö=yKbæåÑKá1ÖZà±ÃÆ\³}téG~1@MqÁ‹}3egÙhá—1R·{d㌈QÃÄ-ª6¶ê–i?àÛmSïÜZeË´CÉþ$’†êø4ÈJ·ñ× ¦âDz—F½§4 ' ÏJÑ- Ö*·lúÁˆãE‘¼%Ô„|ŽQ6. '3€\ä¤ÚNÐ/¹(c"ƒr¬ú·UF.ÝБɳl ïž*JuêÂÖ—¡c¡‡`6sç%ƒ^Ä¡}Fö™.ýƒ¦ µú+BŒ`.g·ëWgvîý}Õ¢¢†æÑ‘*|y‹Vž¸¤(´ù4ãt ÿy­NÕð ¨ë8±(™“N¹ ¾„…2uœ8Ðu·Î2Os ®˜G‰MR!Ÿa ZÈÅû‡®gì‰\HÖï¹ê«¦Ä$’C6ÒV/ÐYq°ÃÌ šÇn[”’œ++¤Ï¬ 0çÓÌãʳpæQù”—êFôrÚÏÓ­—ôÓa¹øEu×QØø-êžDI¢ó«'@¸-%¡¡@ 'ÄZv&½ƒH š§¡{‚Pl@Z”6äØ8²ø©ÖtÄØ>Î9vÑq ÿxËéz+ù7øHÉž\¥Ñ#ö²“ú‡YÆ^‡ØQ‡Gr;ß%o/û8Ê©àà[Tƒƒ É6Íæ§E&öyÁ?‚Çe:s§)žMÅ&Næž—c«RAöTÌZؘ ˜Q `i®3‡W™A‘«!ë>¯2õÙÀ ûl¿zO‚4†í¶k…;2?¥çÂãÜαǫž¬‹ª´öxTiÙ8Ou—ÊèëFÈ@Á鯍sP>Ó>¦!_Òä?‘–ÍCƒI ††$`pƒêU³6©5ÁÈóòôVE¹òÅ–©™Ã!1¦±aŽÜ!Ã<,Z?î8¦2®ãß{‡>.•Iz™§•¡¢4§ÚÐŒYÂÅ¥dAêÚ’“äÙ*œá"Þ 6ì§01}1¾ñCfÞbž‡rÀ[î¥r 6–|Jòç2H,B~h„ŸNg{¡îúˆ£„Böe¨VÑ4§…Z_h‹’¿,PíÔ¡ég.*“Ò¢ÌY–sÚ£ßf-Â<·dêM]bðl*_¯¤a9ÛÍ–‡4ê]U¶oœKs²¯à¡7ÇÄØ¦¯ƒ« BKŠˆIÛÞy-";I'Y]_9“¤2 á æ0'kHw •P°KÈd2.޵{Q¯ý´÷%)Ú£/nì÷ò¤Vœ¹Ž}莕«h³¡ù§, 8òâª2µ×dœCì(ÍGoø2)Î3Lÿ3)åõa¬ÆÒÛ±4]ïë¡…Z}ç1d©åŽo2_礆=LÀ*>a1%V»/ÂY¿‹ßª`Êäo…ÙEìÓ‘©ŽÅÙùà)ÌÝ>Å©xè$„¶¤¼Ö8¡ … ©f×DqNØ)‘8Ò1]¬{Q5Å—æ²Í0wáRØX¥Iº0ëç¤i˜Úü­i„‰#›YL#¬Áõ‰ëåð”ytÒ'î(C,l0w,üRú¤:´¸CYÓ-V/ I—©[/øîQÄý¾nerðµ\oNqUãR‡Ü“ CÃÀ_Woc¨TàíV‹bPíÎâXŸ8Ìï|ˆ¡_b»¯«Ý­„EwÉFÕÉÐ5&‹Æ—ÌÿÞµÕ3ºn1V_ëº1>+Û6¯+I ˆ…èååüzj üxB:áUR§xÈ:¿aT¹)Þ¤qZ¨ðÊ?œBsCØ™ÎÍÆšºˆtêÈŽã58TkHQQ£cÃ*žKÖUó4½`¤c0¡ä¨w’¦ n°szõbãåmRH6]S¼wSõrI¦¬R[,²´Z ¤‹O$A…|yVw­! µd¿ç"j†5/‰8ØæK] )·[‡]ÃÚƒ’Œ±Ü¡'ÖéZ;ãj;ü|‚®÷8à3>kŸBùªÞ“Y°ß/ŽÛjù}Mà¨!ß½ýEif5~@F¯'xºÍ”0ð¥Áõ„”ÂWò²EÀ›DŠõ©Ÿ{"çßpÃõfvB_Ŷ©Üèêêú« UÀÚ ¨e¢ÁÆÃŸNxºÍ”0ôýÄÕ„>ß½ Ï*ö“Nâ3oç+צb`ùR¨žÉâ_Xn8C—çcÑa/ÀÁ YXWœÄË‚€îÿ+?¢¢X¾:*Ü/L¨n½µÌ}ø1¹ÎõÉ P^U+¾–:T[ðÌIŒÐ¼*ÅÏßrvÈ<Á;ùþ`¼Pñ™-÷¶}.›ð¹’µÈ‰Ãï2Çú 0þ¿  9>¥"msºñhåŠÛz£«Äcy·ç}ح؄Í#;^Їoû|jȾ£œ… ).?©±þ㌓$“íü›ÉÕ§–bHãkþ'_;sÍ¥ŠDÎÿlÁ­ endstream endobj 288 0 obj << /Type /Page /Contents 289 0 R /Resources 287 0 R /MediaBox [0 0 612 792] /Parent 281 0 R /Annots [ 291 0 R 292 0 R ] >> endobj 291 0 obj << /Type /Annot /Border [0 0 0] /Rect [450.0532 148.553 522 158.25] /Subtype /Link /A << /S /GoTo /D (ui-motion) >> >> endobj 292 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 134.7963 190.6062 145.7053] /Subtype /Link /A << /S /GoTo /D (ui-motion) >> >> endobj 290 0 obj << /D [288 0 R /XYZ 90 720 null] >> endobj 287 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F67 85 0 R >> /ProcSet [ /PDF /Text ] >> endobj 296 0 obj << /Length 3575 /Filter /FlateDecode >> stream xÚÅZYÜÆ~ׯòb¢aØ/'Oä AlÖ¶aw†;C›C.H®Vë ÿ=uuó˜^I~ X6û¨®®®ã«â¨— ü©—eò27&.mž¿<\^$Òýë %­=ÌØ/§|qóâO_¦ê¥Jâ2)ÕË›»‘›ãÑësu¿SÑTïö*v{cLd>ßí­µÑߺ.`h¨SÓw»½.ò$ŒÙý|ó÷onüÆ©Öc §x³Þ²ÂÆÊØ”xûñ8;ü L¥EôÚÈƒŠÆiØ¥:ªšŽG¾ê‰;ài{Ø4³$•‰Ušð‰ÿ6}6ÂQ²2û Ò«§æBÇ—î3ìTuGøÿÄSÏ"¢Ù=Êäþ«y´êx´¿ÝíÓ4ú¥>à´‰;¬x.m7Ú½o›SWù屙Ϋedvh}WÁmÁiA°«ƒUï›n.+tDÇyçà­Z>ŒM ®šßz¾Ü ‡ZÓÐÏOw<ÔXݪ¦6Šwû"QÑÛº¥QP‹&œDö«ËÔ6‹“n=a=ë;º7`©%pl çû ™™TÃ׸ÄRá%¡sØé\nèT$ÐY¸ç\§kqL8«F¦k`MF]j'þŠÕÖGý?ùŽQñFÒeïÄLŽLµÇ@6¤ÒÛ6ãŸáÍ&×ý@Þãr¢Ø>íÏ=JwyÌɼÜ{b]]˜Bàž€F™F—þaDÖËŒTn¨N'¹)¾%uª¢ÿ#Ϭ߃£*à”k5nK‚üóÀ[®ØÍˆÝ Ù$¨KšëèëÝ‹Ésú¹šð%›/x>÷7,|짦m¹·j{wZ[sã{~_ðüA&¿¯…Ýëf³CÅö>Tó†]Hèçæ€Ek,R° 4Â|±ÀñÊó8u«F¯ Äס²ãxÇSÁ„jš0VCƒ¢GÊt6œä<ŠŸËž GDáÈpMÀCÐÄñitÊN$.qÈV÷ÞQjÛ<Ëf÷Û‹ûýæQ¼íë¸'|¤Æßéz­ÊÑõ²‚ë•®s…B9¢+RYö®ÅŒ=[?K"ÆGçGÐ{"e{¢È×ÔÝ•aûÀÞç‚I'HŒÄîÓÈòV“}жïî‰[+Û”ácýS¢,8zÔ‡´ „Ž!×I µ:.Üõ›³Ð–=?]4ã7ÐqzªÏXBÚšè]ã=Æx0}‡Ù´uH+6§$ ÐeΑ˜”€O÷aE€€^fƹï†bl.VÑʲ<ò})‹?˜ Ð ‘cª.=bA÷ZO:åB«‰_è * OЋ F‚‘3ÄÛ=-–p@Ý;f7¾Œ)˜9ìÓ™\"› îF£Fü5§BÔØ’ aÏÅ©WA.yÝëU|ä}¼·‚öµÝh+5ÓÈ=žôÑÅP½¼£À®Mê‚ñƒç:w3¾g’+¼ÂÑï•Ä\•Ç*Óv¥:…É@%˜á¢®¥6úªÂ#>ñ AAl‰CL€›Ž1˜”ö0ÓrùBa9‡yæ¯ðHåR…Œ§7ÒÕ·›Ú/ޏÜ·¨Ž.½eÐê>d§>ÛÅ8×;íµLÈÔ˜çc.DHÙ»‚æxMXĸr:¬|Á h%€6QëÂ-véF%úšcXB'êÃÂJ&Wlj„vŸ/À¬[¤ ƒÎ÷¬*ØL‹'tõ#¿÷ÝnIÁ“ÿöžÝÉ&P”¶ ä LnAׯsì] p|­NU#)už/rk•šL¹XãøÝ‡¤€Åá8ùW«®oÛNý©žê ̉T±½„ëûPIxÎ$‘Õå¢fZæ+T£¢m8¸ŽÈ'’2•ji™m°b5òVfhlq ö‘²k9PìâÕ®Ò¬®lœÜñóY Å~+Kâ6:˹Qâ랯Bž·~/A5sr_¸ášNÏBòJ½ F_dÁªÒOYèã²Kã->þúúÜJÍųß5lîBóLÃ¥n¨8ÂeHó~ñ§\¬Ï9³EæfýÒÁÏ5nñÄ~@±l‰uÖ%Ÿ/œ®CšI pà6?mWšØ(åÌc§ß‘âÎÒ¡fùf¥*W¥Úð¹v½yœþÓ?ó>%™ ?ÉñätcSI’‹Íý=‡UÄE©ß®L–`0 /^ñÛt³“8„ö—Åe™n€ßj'ù%\ê—¤ö§ò‚ÒûûÖ9ä`°VÚÆ) ‘‰PŸë/üxÿô[ü®>ÐÿïsÒTy':õÊQ à™G`¡¥®VÚÿq›cÎ\Në :… ›»™ŸI(²T/,í³_åñ&9,=vô±6e(«]á#Y6HúX‡£ü¸x"\)µ»Ö›q"dÊ5"A4$þO-â¹·ú‘ïJäü©ÙÎMÜhFùBªšø)¶½uhk„·émï‡Þ@^}Ì}oëzû+-­s0> endobj 298 0 obj << /Type /Annot /Border [0 0 0] /Rect [227.1819 121.265 395.3943 132.1741] /Subtype /Link /A << /S /GoTo /D (geometry) >> >> endobj 297 0 obj << /D [295 0 R /XYZ 90 720 null] >> endobj 282 0 obj << /D [295 0 R /XYZ 90 493.535 null] >> endobj 294 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F52 26 0 R /F72 6 0 R /F67 85 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 299 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/ap.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 300 0 R /BBox [0.00000000 0.00000000 156.00000000 182.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 301 0 R >>/XObject << /R8 302 0 R >>>> /Length 303 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjf¢g6´0²2uôŒ--LLtMÀ cˆz —|®@ Ž¿?endstream endobj 300 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150401) /ModDate (D:20070503150401) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 301 0 obj << /Type /ExtGState /OPM 1 >> endobj 302 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 326 /Height 381 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 326 >> /Length 5936 >> stream xœí];rä8Í9ʸmµ;'ѹ€Ž¡ˆ 92ö­ ´CK†N ·­qç$±Å€ÌDâK€A¾ ©ªH? 3Aþ7 àøÇ·úëóu§i!¾ž'¿þr¾>á±Ïúk¼B,|þzÐøxwý¸žµWŸ…ϧEÞ Ü,YPjü|º_¹¯‰=¥Æ£å¼¯É"5>ïU?:ÃÊžRã/o¿ç†ßVö´]ýž»¿óxÁ_¾Yj”Û¢KµÔÎ~‹…©[jLÚr‡xô²纰@ÛwXÔ£FiËÏóz„K3+ Ïø¼§/Ÿ¯Ægè•Æ   ùj|ü¼[9&©ñAÂ5*çwòa¶è}-‰¿IÅÚÁŽj\ˆy_ëöJÓ»^Lÿxk…Ôȇ2ïö– +L’ï¦ù¡!îßù{!Ji†Õ”45>Ó“z~·Ô¨Oþy­—ïèÀJ)€aÃäêâ Áhæ™Ô”T52§’DJ®œÜîÐ K¾¡bmépV#58‰jä~gj¤Ô¸ù!%Üuº5 5NÿrÕhÉÔ¨ëé\ƒM;,70’[n`ˆ£Æ±lKiôuwÞÜð7Õ·ÙÝ]ûf#ôCØsc¶A>t½ÕØ'»«±S„ÔH—°]"¤FFä­Fj–Ûjü’£¬¯¯‡Ç0w{=Ør¬q±`Ôøþù4ñù°ˆxr,ïΓu­˜Ô8±ùü=»ãÔyøçk"ø×’˜÷øüߣè”øs ï›iœtyÓ˜·ŸÿL‘ü…Æ©­y¨ñ÷Ñu:|ÀOÖR?Ôøû{äòdýŸ¬ßÕh|ûQe³Å‘söo²+çNCcòÙO•ZRãMc\¶ñ¦1 ·mÜj,‚[Ep«±*¨qé/ô’aùÎVûveÓø¿´Â2¡qÕÛúI¿c„Ô(ýÆlyúàÑl Dã˺OûÊ‘EÂjyÒ¡G!“F¯C4†Ž6DãÔÇÿ©}ŠÔç0qè¿tµhäÛLjRãT}Gs6kqý¾|}|šëý¨wU‚ÆÑYÄõ“dxÔ8UsÂ1jVçÏ#¯Ô¦€Z ËùjTǩߩ(†QºfãúÏ}ºiÄgFªD´m\øð)Íÿõ‚AóŒ¿fÒh¯“FZj-ê<Ý ×÷Ñsf‘¶Q×MR¥°õŽ”>t%ß`ññZ4º¯™ït£àQ£Ú.(Fôy„Õhä ÐÈÛ0Þ¤m¨ÔE#°’ÞÓB|“Q¶Ñœ ©Ôk4êÚ§F²3ßéF!“Æ5:›lЍ|.¼V¶ÔbùšÕ¤Ñ×ÄÄØÆQ5ˆž9˵ìúeT»ÚÞÄà~£ëšùNw#ÞOæ(&2/æ ³k#L:<ë|øšñëðÄaÃ(&}WˆÅ¨î÷¨àáñ¸&Òwç{8+ù®‰ú¸ýEЇÇ­Æ"¸ÕX·‹à;¼¥ÿHVcƆÂ8 9'/ª± ‹g¡1²m<ú¨NÙ6}T§Ã­Æ"¸ÕX·‹ ¨FæHó´ ÜYØ+j´’Ráù# F dƒÐ?¾n5bþ@ûêiž‚{Û8`ˆs Ph¬‚ýjÄ9rä–PÖ€E˜:¥1F(d™½Lc~ɵ= Zy4¢&†þ²#%N¨¬FàôuLcLKC£ôãõ}yÕ9¥#Ûo”š˜PÏšöÑ/eì…ÊèQŒÔáxƒ“º¤ñ¢cjßH5Õt_ÖÃã©æÐxI5úGª©ÆæºjtŒTu6ÚÒ£ ‹Ü¸¬]#Uװן&yY5©.‹Ü=ä[Nî/ËÚO¦ñªjª>–µ«1ž‘*ÜjŒ†s¤Š›>ˆuâ²jGª*k¤jŒëðˆjL¼§OÿÌçÙÆ4Ïrçé˜iÍÄ&Hº½TrÕ˜U©™- ÷Ò0â´ÊÂB£'~‹/ o?ÒU¯ì^jäþPr@xbw[¥Ž¢q¹+Z¶›­»˜×¿}…^“›Ffn¥=™[é‚6Õë*ùÚ&ª1»¥–œŸDfÕ°'âÑ۰̳*D¬:¶îN+÷hbx¥FæÖ¦‘]åµ dÕKØF õB¢Ñ—mÄw8)Óá±*52·AqÏÌŽrÙHU#…@cÌ]Lò4±R+{$u\%›£+„岑®F ›F ÐÈ$hµÔŽ‚Ò66«‘×1¶ÀM#›œTý&±M ²ôÌtKML!5¾£¢‘¦ä˜î n¢¿ŠSÕ¢r«.õÂÔ<øit ¸U ©1ÉãtÓèPcšß®-&¸‚q©1 ­Ä©'îºÇ¶1ÍÄ©¤±·–ú§ Öj5ª1>:»L"Bj<1hhɱò¦èC4f2Ú±)Uõh,¤FbMjrlQWÕtL#r_e Z,JM®ÏiTMŽï––4V]¨?gшœpú¸D¢ÕH½@¯¿Ðø›|ge¬ÒuµhTŸF Õ•ÄtV¶Ø…t>Õ¸Ù_©wR#:K<R¼—F‹–üøòs52Æb¥Ö„:+õ^jÄçL|¡ËÁûh´&éØp!ó:3”`ÓÈ$(Ð8@ÓÔh¼F)•šxéqãòŽ*Çu"lbRÕˆÏ~=ø`¥6&^P£EŸ*X R«8€ß6jÿn:¶¨‘|ˆ¨ÔÄw¤Ûá •ZÄöÑCfKN#g'ÆM¶QD=Óúghbœ’Ü¡Šij4–ÊÝáAž^f¥§m˜QLáO£ùEX4byD÷[ÆÆnxÃù‘4Êê‘n@|~cœÔÃW5^ÒmׄxׄXzk¨$61/”Þ¨Š&ÐØ›¿1ŠÆäõ¬hA5F|{4ÎÚ+»·el ü/¦a UþþãÔ¤»5RyéD=³^ìpíuÇqj¦8<@§>ÀôJ×m0è6Nýƒ>=°¶z»\¥iì-NýŸ»#¿qÁP’Æ~[j < åÄEPUÐ(71$‘]ÑèÓ_YóW5PWýâáMŒí  ë2J«±™8u[ùõãÔ# ˆ,¢¤µüÆâÔáãÙŠŒöòëÇ©kÑ]º’ÔˆGvG6*N͈{¦Ä( r‡1ZGûéªTAèiˆƒÜø€BÎ|êmžÇl5Z‹2ãÔºÓËû½dóƒf4éó©·zsÕ˜L£ŠS§Óˆ~™R©£hT¶Þ6ú6¢h¬¬F>óÓ¸´3.i„;JÉþF\a²<™-u:Iq4âå)¶›Ç`Ðlk£ç1³ß˜¥Fé‡Fcb J¯Z9hÄá+ËßH¶µÉó˜ĵB¦Ñ§vÓˆ;6Ü6ª_¦ÚF½ ÙßÈøØàyl3N½b¥&WL6Ãv[‰S—@æ|ê46§.€¼ùÔ[<}ûIGGò7Z£f”c=}{¿](nQúSK¨Gcqê–üIh*N½ëûSïºÇ~[ê]÷ØoK½ëo5Á­Æ"¸ÕXñjÿqܘzw´¬FÁo d<ÐXòÉ®{LP#aRò S1ÎU‚bƒ‹ÖÕˆ<#fÖ§>ø˜¬ F¿–¸Ñz´®Fì`Iå† 4¿i œI@*7$&Ÿ¸i4ÓÈÌ1L¨ò'Rc"’+m} ¾æ¬‰¬«Pyó;±C ±< ÖÕÈ*aj¥›F[„KÒ”Ÿ¡R§ö›ž|â´œF³ýxA6¯F4ŠIëðú¢hD•šAÍ«ÑB‘&÷OÞÄĪ‘Á¦1”|B;<ó2Š9w‡'¬Æ@ÞjZòI¡Ž¶Œ–ÕDRòI¯4Vô7Ú:®›{Ò©wÇDãÞ¾ìÓû½ûãCýjš˜bjô?tœ4òy·hÞîIPR1÷,=3*{x®DcEc0ߢ4šÑ›¿14}Ô‚µ7ïwT¿ÕÄQdØœþÔx—P#ºi›«Ã¥oPe2¬òØ%7®¢Fë6hf]9»îлõ¸q5®dÕÂŽ ðXÕ_Ó}j’Ξ—Ƙéå]#Ù¶« 71#Y>1Ãd*µ“6hFó±ɶߎ{$Ä,ÌjØBcú]¿e8\%‘£FÜyh$} /Pú®ß‡!Ë6šóµˆà´äÓˆ—ר‰‘«ÆU*"v£¡M /+¨1¹‰9~5†bTº±Fo¸o†mâN#Éña¶1ñ®ß‡Á«ÆÈUšNšVU.R=<›hŒlÅIb1ÛæR†‡[‹À“Kùç/<=-ÉÇU¼ß¦U$´&û2j$)¿f1]ÚGBsa¨'lp5 w½±hçŽ/õĈíäeÔ¸~ðÒȆS¸ž›1qhøÔxPça¢b1hq Ô#Ff|j uÈCº¬` ð…GÉQ±ÇQ8hdžñ¨ýj g ]c'-ЈGšŽ–Z¤ù ì›UiøÕO#95jb|ýFî#¡MŒ¦ÑÕÄ$«I˜°xgA{#p7ÁüH,¾Æ@,Æì7Ñës^€Ž™{b@î𤪑ÒÖ#1µÛ÷gÎ _pq“y4Æ>­lȶ?g”ݬ·7x#’9ª1äÞ‰ÆdÛÈb1ú¸ˆïÕ”±º ju Ç¢¸Í²;ÊQ#ŘCc²ú`z#àZÝvÐÅ,ÛˆÎ]l©]ï ^k¶ãÕ«FÖÐ~£Ôv8š^|ksüj ?TÕ49<³ÍdìÏü»Šux‚W‡3J§¶Æbngl‹Åœ´ –GoþƃЛ÷û Üj,‚[Ep«±n5Á­Æ"¸ÕX·‹àVcÜj,§soç~’™®…áTc&/×T²G9ºJz EGð¨ñ¦1·‹àZjxÚ‰»¤#Ék©1i.|*Rc[ \O:¾¥Àœí(‰Þƒ5&\™™Æ@Î Ïåã'ŠþÛ¹SÛ`hŒ¼¥Ân„Õ˜ý[hôgpåÑX$ŸBq(dºáí£"$ÛÆ*jŒ¢Ñ}¢¶ Û‘F“ gŽ!|?£Û˜E£™“#\kPçÀrmõ)™ó]³W†ekãæ"¹hD™pæ˜ÃÔR#š“ã¡QÈ“â4’$©  ‚F³œ˜Çª©ÑáT#;hDeÂ6*€U\BºG1?÷Þã¿]ªñ8ûR£jsõÓBÑý”Ôr„9Ó} IK:UãˆïÖ½äጃ›¡r4v¦F•N±4Ú¸ÕÈhÔ"ñ=Ót =˜lÔu!Û¸nWcB—ë4r#¦Ñ,ÀO÷۪ƌz+!Ç,Jš'EÞ#Š‚@#¦r]Ž^ßMA¾ÿFD55âòúsr,$’Fä½™PœF5ßnÏM£2yy4Ž0ªF+`ä )¹½Š÷.D „ ™4šBœFüÕOcÅ™4]”Ð1O ïÝÂ;“i¥(‹FÔ|ùÖ£›˜Š37/ !Õs°i”œÕ8Î2$ÓÈû6d¡^¹îå Û¨N FüKD#Ð †häpó°UÕˆf"X4B£W™ÛZVe4Ö‰©4âåA£R.†¸° ª«Ñš¥·9O ïÝâ4ö“ߨlãˆ'X4FÌ“Z~1ÿíâÚ6¶Aã.3${£¡üF(O¨«FŽÒ4:ÂÊÁÄ<ÄnÔS£}½KK´M`ç7šÿeÐkdP×^GbžZ xP‰š.k̉ ¹€>#ƒšFÔB4ê - *a°Gƒj(èÌLé[¸6c‘RÿÖ{E}Ž®Õhþ[4*%N°i”›^—€žÕh™¨”ø ‰©‘/ö¶IýeÛi©A¢Q«4…F³X@Ù¶ ÒHýÄ»énKؘ3¦‰é/¿‘X8B£é²îø€5æŒìðô—m+ÀÛãÞÒïXêÓØY¶­TûƒÑzj9RããÛ·™Æ¯¶Ñ*eÙ&Äã ~DåNC#L<~ ä7–¤ÑÁEcƹeϧ.¡Æ²-5¶N&ÔÁi\ (ÒÍíæ©õ€sBÄp]Ãù94zf"°•¦0n, j}D»Úp~cê(Fè^æÿ¬ïÓ§qä›s^Ô†Õ˜´Íˆ™ P>h¬‘më‰0@ú ±†­óµhDÖÏ6¹ÓXKÎ&fþ 41œF­XÓÄ(lbjÎD;<@ ¨¡bP‡Ç,i­ÃsÖ™Ñx™-Vê3ÎDpõb;Rã‘hO'ͶÝ{fÛî½Çþò!ÿêoAoÙ¶ÐÞÓ‹NŠÖž^tR¡ÆGƒÐ›‚¨Æ·£ê„°Õx³˜K¿Ž>¢s‚©ñõèã9-ˆÿúº_¹/£F'>_}k¯‚ J¾ xY¾ü,(5~>9_ð:åI]ýbaRã«÷B¼‚ý5`áAãø?’K¾åendstream endobj 303 0 obj 67 endobj 306 0 obj << /Length 2501 /Filter /FlateDecode >> stream xÚ­YKÛȾûW ö²`1ìÉæÞÃk8XA `ds葨cŠHÊòìbÿ{êÕ$¥¡Æ>Ĭfwuuu=¿j«‡þª‡"yȉ ›çÛã›D¦?¿Q2ZÅzNò×Í›¿üœª•ÄER¨‡ÍþŠÉf÷ïèýÁŸV*ÊÕZEÝjmŒ‰ÌO«µµ6úÔ¬´ƒ¥Îo‡ªmVkíò$Œ]ýgó·76ãÁ©Öß I¾C¶ÌÙX›’lûŽÌ£-ŠækI¹¨&Aùi8àTUðÑÃP'Q_<7´üûHJ^€ðPò®êßlåkßµGÙx"™åƒ¢^óIõ‰Îi+Ö‹ÚîE>˜,F ÓxˆWëü¦7U=Q6åeíëªlæ´<þãOÜCûôƒ›ÏÕz[6à¬/º³aè|ÓïÛî¸&¯¹=ñÜT_Ê®/—¾hkíÁ¤¤”,¿VJ›,ÉàL<êëjY=ãOý¾¤F£c«­Ð"¯õ:ˆ=E?–Ý“ˆ²ÿìü’.‰•K a th„…Ó­ŠMj”ÐýÁl÷íöÜ/qµiìD0S/2T:ÎUþ.tík¸ØAÀ_»ÏåPv墖T¬µ6“š’%ùÒ8×¹u¿ÀçŠâí7y<ÿx,Z=‹ W7V‘ãÄ&Á5|‡Q›Ø)‚aL¾ù°ú‚A˜ÚñáKpK´Wâæ lû1"mŽp'#an‹[xëg&  „_rìÞ¥‡ _ä.¥ðCG:ö!öé®­y’o ƒ ²÷3öÜá–p©”µŸÑ]Þ5Ka`0ÐáOð˜g’k[.:ƸåÊ1(䆔? ‹îQI”0VäFHiI/¹«ÊéŽ~5Íaãw±ùAÐìœöX†ËËì¡=×ð¹ãÏ\¢ ‹v¤·K³_mAzÄu4¨F« Ÿó®¼F'\â!ºEÿÖd‚ðÔ?~ögqøÂ¨¦D=ýdn붃Tl38¨z:­‡Lý”·+BÖ°½§kOáNðAÚd¤ ¶†oôǶ+æ:zwc^òáØuYQúŒÄ„‹áסiñsæç¾#-Ñ5ú#eR’ );lQTN¹bÆc; î™}q?,xùDeBÖa')ün¬‹€PÇ'ç¯ÈøÈ>¨¨A{çj—Œz×® ÏÅ9<’Õ‚:z9•ÈЗKt®D‘vL’ãÃçɳ9ˆ½¶ö¯´à†ßÿ´·~ìyeŒ:Re±Uéœ]Ë×|X™¬„ÕŽû,ˆ$۹猙(î­«%W’„»¨ÙZPÇXã•!wFì¡ô};ÆìóŸöL'‘º¥$±Á¼°œ×sb+.ãI-î‡V©w7Œ½r&$-ZíŸùx/‡ß÷2£8û.hd ªÆôò£Ô>®ÃÀ¡/Mÿ<¿ž§N]ÉÖÞ׸¡5uÙ _V¾oÓ7QWr M)ÀjR:eHÒuÕ(Ug¬Ì…‘?ßöƒcÞK\ôTROžp¢À™–Oà]•&8PÞ /”÷<‰= Ü3œØV w¼éÂ`¢Â=Ë )úó2,¼ª^xÖq··‚¬£† ÏÍ»,£nñ¥ŒlGXL°“_qÿoUxÓX‚uÐØe¹uß ë~E‡l»z±©ÓŪþ° Ü­U¡â³õ8ÓX ]]5¥tº;qÇ6ï§kÓ¥BZJ|“ûŠKÂv= ¸äœ)•×]EÀjwæÚÁêwi\dS/_ É Ó}#ÅdÑÏq¾®§ØžSFÇ@NUàÈ?OuûÈ¢¼Ð+:†Ë¿ÛH¾_´¶Nâ,Ëò×í“8›/#2¹ ˜i‹J>È-VÒ³Ì]§(#ܺY‹Í}šÄ6K³k…O.&y宾ï%‰ ãÔ„Á^ó";Á䔉©¨ŠcASÔ·¬'ÿú²J7Õçy; Ó ù(0¸ îC ö¾9Ð|+Ò5¶Xtžïgƒ]¹÷TØñù0Í74˜hRyKL¦ã*Ô7|ê¡_B_´ò-£€Ï²A&%¹òœ›;Òñû']¶gaàháAû@Jdžb]§[ªiAßd@âc›ŽÒw©`]DêwA ¢ì’óø ÔÜ›ûF>'T‚<1)»à_‹‰ó9 „¿ºÀ`†ðÊ‹õáÆP_6Påb0º1Û}—ÿDWq§‹/ÅøÁY¬òD0T3ÖãÝ/„.b"Ы˜%Ÿ€F"dk'ØH\^`=Ò*| 3ÂÁ@8* ë--ˆp[æøMÍÖÝ™N.ŠQ*JÎFÞM`~¡bàô7à’¨ð+}8ÊY8Ñrh8„ù”kíU³üËòàT3³¯]Ë“ÒИ; j(ªm5ÔÏL*¸jÉ/Ü+Ï  ‚C èè KîD÷-Có)4ó”{ë€äF±qöÈH„^ÞÙ¾–¼ûæñ#Œ‰(AÔã‡kXm¸Û51Ògô¯ ³<¿¼Ã#NX›&›Q†ÏÓèø*ã©ä+ÝyxÉã̘b,Leož­Š|¬ŒØÌ¦x^Jù&¥„Ã3KÅÙÁÞ4ì½RñÚ8Ò'*ÚÍêðUîôaü>¶á•7…W>z­pöÕº˯¸".Syváeã×wO%w¤k§â"MnÂì¶sâùý å_ endstream endobj 305 0 obj << /Type /Page /Contents 306 0 R /Resources 304 0 R /MediaBox [0 0 612 792] /Parent 281 0 R >> endobj 307 0 obj << /D [305 0 R /XYZ 90 720 null] >> endobj 308 0 obj << /D [305 0 R /XYZ 90 494.4285 null] >> endobj 309 0 obj << /D [305 0 R /XYZ 90 122.8104 null] >> endobj 304 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F67 85 0 R /F55 36 0 R /F72 6 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 310 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/color.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 311 0 R /BBox [0.00000000 0.00000000 106.00000000 104.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 312 0 R >>/XObject << /R8 313 0 R >>>> /Length 314 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h`j4406R0Ô³´43°T0ц… .ù\@!Ùendstream endobj 311 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150406) /ModDate (D:20070503150406) /Title (blah-000.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 312 0 obj << /Type /ExtGState /OPM 1 >> endobj 313 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 220 /Height 215 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 220 /Colors 3 >> /Length 2968 >> stream xœí=’Ô:…ïÛ èBV@$L2UÄ,ƒd’Þ9 ªf“±žg0ãÑèÏWÖ•tu}¾ªqu«Õú±NI¶¥ùPÆËßïß¿[$ýððpww×"q0„Ömº¤ÿñãÇ'Q.ï_¿~-x\J¿$»U@<}û[·é’þׯ_ÿ‰r •þö«OŒ¢]›.)¿yóÆwJÙ<è±P¤%š¶iÜ)WµâˆcÏ£«½¸Sj(%Žç9ºãÆûŒS.jmaÎxDµwÊE­®°q¹\¢ÚK:¥Ôu¢5³á×2p”:.­¹6k}j«(Ëœ²~†uÙ·îå®ãHµ©Û!;e}êÓ5Ü?^ñi…°Mù3/_¾¸élÞ×Ï)‹h ÝÊ€H¹C´M—&ã4mMg§\E  ÒÁ)™¢$§eçsJˆR%NI-;“Sfévën©pÃÀ)Ÿ•ž ÏEJ”nx‹×æ1蔥7xÜ_çŒ&ÖÍSÕn8Lˆ»îPÔ{hqJf®^äR§döÝ´§°¼²·OO%ͼ;lM¶û£Õå”E¢tóæ;eQß͉| /“pœ’ß“(rÊÝ,=–¼Eœ²´fŠõT¢$†SºoçpÊhÑó”:%¦8íà¸X©Å)Q䔜¥g„¸ÄÇà컦¸÷=\§|Vz’; 8å³:À)‡§|Vz‚Sê µSòS€S‚?´vʦ4á”àMòp:GœrÊY%™9Þýeø:Γ7%‰¤&Õ¦9§\ï¾,ï]µn·d*ÙN ‹`CH%å:¥«Ô?¢¼½½õ²ÄºoЇÕ)]‰?uß[ÐãÇý‹NÅÍÍM¸½Àåry&J×EQ¾|ù²w1Áiøõë×*ÊgòDé΀è¯SB” ×ëõÝ»w›S²fß®S.ŠXz`?~,ÇM”Üë”ä8%D dñDI‡r–®?!…­¶4˜S*¬^È:R] Ehkµµ„R³mU]E¨jµ­„RIõ¢@”!ªZ-%J‚Sž U­§PÕjpJzÎXU­§ ›(Û]4PÕjpJúT¹é¨CU«õvÊ%õõÅ·oßWí)G//ˆ2$U…­½Vú´Z?§\«·ÕÊ{Ûˆ’C¦ÕܳקÕú9e(Ž0¤%U­ÖÉ)wkâv®›.¯£=~*~*‘h³g¦¯ÊÑÊF-'_N/\‰(½@‘†óèä”yQºÂá×™ªD™ÆÌ(J‘† £Å)Suö~d)E.ÊT‡˜ï+uŠ’sÎwÃ=T8%%fy¥¢ôBfe'bC”^Rz2ìÑê2>|L™ê¹ò(lˆ’Óaª˜}‹ôªDV?˜šú(e¦„­EI=¯S2ç(ùñõ,0œb½Dø ¢ä7"¿áÂÂh¹£ã†§&¤aè%• Ô,Êð£”ñë¼£Ã9ç» ç{ßH;ݷJD9<%$€ÈuÊhä¦ÅvQÕjpJDîèd"¯@”pÊ ßûœRˆR8¥¥,pJ JYà”@”²´rÊëõ:¨F\ÄEÙ§ÊME©ªÕ„RUÝRÈŠ²[•Û‰R[«I:%R`J 8¥YÞ¿?ºGøþý;œÒ,‹(?þ<ºżxñb¼S®%‚¬³"3¢à”¥,Ÿ>}Z[ÄŒ(©Ò)Kt¥GQ¾zõ*üèíÛ·•5LñóçÏF)e=cÆDY딣Dy½^‡àGŽfg“¢$…NÉ,‰lÝÖnÌTv0)JN Qò1)J‚SNIQ 8e4'ˆ²&EIpÊ©1)JŒ)çÆ¤( N95&E §œ“¢$8åÔ˜å°{ߥ&EI£ž‚(E0)JNÉ\D²ˆ’¿Ü¢TËNÙhYD©ENÉÆìbL”4Ä)¡HYŒ‰ktì`F”„ÕŒf0#J8¥̈’à”f0#J¬f´€±%¶„uß³co‰­ŒSæ·›÷P~ßo®e¾&/žSýSB´÷9<̈RÃ2_“¢”žr÷ÿòM!ÊY 1)JjñegpGgˆ²3Šî}C”"˜¥®ÕŒ€(;§Üg®e¾&E §ô™k™¯IQÒ(§Ä‚FAŒ‰rŒSB‘²%aŽ̈«í`F”„5:0¶p «§ÇÞÂ1ªqÊÔ³‡wòUŽÂ5e&/ U9%D™¢Ûš2“¢$ñ5:³?º–AáH“¢Äó”@”-Àó”U@”-hµšÑåî#•¥“ Jñë”eDɧá“ç‹™@”^L‚([ÜÑ(= J> ïèð÷o(½˜Q¶Û!¢Ü€(ù(º÷ Qn1 ¢Tò”D¹Å$ˆNy…kÊLŠ’à”|®)3)ÊaN‰e:‚%á3À˜(±FÇfDIX͆§ê0è”X‰65‹ :%D9/ë-³N¹®}±ÉɬSB”Ó‘%Á)Á(à”@pJ 8%Pœ¨ã¤N¹ýƒŠm‘à~êÅÙýbfí‡l¦™øüL3JÃ9£SzÒÙ]E´EÈ|q÷ßXífÊÜ,U‘LwkZzêŽqF§,:³E[*d"L-J~‚"trʰ¯¡½.,Õe¤¾bC”©tDDYš¸)§Œ¶ewÀrCÂsA ]Ö‹23ÓSWŠÒ}»›'~åÏ/¬©5§Ì7a>Â1_i!JJ·PiRE¦[:f-Í”_S槆aNIYÍí~½ƒ(ù#0N©*Ey,¼]M™µ8Æ0§¬«1ÏDÉÉTVÍ"ôsJ/$Sçpºs¬Ë¨屦œè¤º‘Ýp‘×dZj§¬<¥¢äq9•*Í´§(wN:E©bLÙh¢C13&†(S_d–Š“i4ñÒp~¦™¬&ÓJÎ8ûÊQá”ôøû ¦©^ƒ*®SåhqÊ-d}}¼ïÖŒ)rÎxï(çŒO åÀ):à”@pJ 8%Pœ¨N Ôaß)±eõ¤˜uJ(r^l:%˜ƒN fÇ Sb'ß© ·—&N QÎKt{i;N‰KBÓë”@ö¯SB”Ó§ê€SuÀ):ú9%sµüú‚¿OAˆrRÊœòöövuG÷("ÊèÛow£k!ÊÝõÝö(Š@å+°Ëq§„"A#:åÀƒ3Pì”Ëg#Ë ÎASº;ЖS®¯qıç1甂¬¦Û"e0ЦmwJñ<Ö‘ti†vmwJo7Àú#=n¨µí›…ãìÇÖmúä”íf6[¥úÓ´Mÿ‰Uü3èÆendstream endobj 314 0 obj 62 endobj 317 0 obj << /Length 1582 /Filter /FlateDecode >> stream xÚÅKÛDø¾¿"7iíz<3~À‰n Z„(H¡€ƒã8‰»Ž'ØN·ù÷|ÇNÚŠCµÒzßû=‹þÄ" ‰”A¦’dQîB{üt'ìÊ òru÷â-" ²0‹ÕvBdµùÓ{ØçÇ¥ðúré ¯]úRJO~»ô•RÞc³ŒR¸jó¢¯L³ô£4 µ'õòïÕOw¯WcE7Dûç"œ’ÑÂT$*F !¯ÌÝo$ô) D¨àZ-”VA,"Vã‡jw5Ú5Pž `£I í­ö°±ß Fâ•y›7…=üÕ̆^ ‹U™ü(Â0d&[ÀÕ‰×ïK\€iò`w„Õó]ÕñUÞð·€fÿª÷~NyÍ€Œe÷(šŽ}Ã÷ µÏ›]i)žñÀœøö€ùYYªÆ Ç„H§-A£¬¬4Þó¦´¢ê|&}Áæõ… „¶š÷,¥# ž÷¼râ—}{þ;<–79¢E} ï×[K ®Ñ”ˆxeJ¼®,M§®ÿX¦Ò3Zoîñ(™Zñ( QŒ”Ý »¯-‰# …º#0˜9A3Ì;çyÖ?&ýQ-`y‘°5Ä…³éD0¾½-0€ V“ Ö"!DÈü djú‘Ò$Rȉ‘×5/*䱩Þc´m0r{áœå»å£œ¤dæýêð÷Ζö­À`Äp{oc)m͉XÚÀIÀb˜ÜÓÐA#qÔ@Âì++™õoê ¥-¬6ë <É´®K‡D"òÆ AiµÝ—LÓeÍÈcr»s%âši€+¸²&Íèö¦+°”˜Ì¥THr©R`|ïÊž×ΰÌùCÔòTÚ{ > j tËi|×.‚ž‰jfGŠò(œ™2Ãõ(TÜMnÅ~¦2i)Q2]?§|[²u¸}pi¡B;$<®Ç Ïå–*Ì èê@Æ[BBP CüÁÑú„{Ót¼Ìc'‹3k~¸ÁlplùÙW»=ÉÈÐ$µi*–ÈÉ•ðñá@™¬bÚÍ\VGYÄZº¬~Õ.5Èö<—Ú2„üO3 Y¶]kjf÷Ì…VǼí¹FùRE€•ofËM¼u½Kðɉƒ¡^»Ž‰úµ”[Ïu¶^«®–À5‘¶ï.H©õ*»9½4X V{Jz`¼F«ö½ixKyoýCn¨¬»/Ñ+Y²!18˜ìȲ͋ ¤âqšQ²`B<ßÔÊwbBŠñ\õ_ov_U):ÙLsøÿë¦Iè—/͇¯¨ZïÊÀšhØ>2TudHåÖ`D~à“ªû(T›/ðæÛeƒ$©EÿÙ^U(âEuu¥:.‹kÕçJõý¨z ·¯V h@O­½wlÅÞ¢SZª9û‰JÖHaà7 äüéÑ_^ÏsO¡ 7Ý?˜šž> endobj 318 0 obj << /D [316 0 R /XYZ 90 720 null] >> endobj 319 0 obj << /D [316 0 R /XYZ 90 684.1345 null] >> endobj 315 0 obj << /Font << /F51 9 0 R /F54 112 0 R >> /XObject << /Im11 299 0 R >> /ProcSet [ /PDF /Text ] >> endobj 322 0 obj << /Length 2483 /Filter /FlateDecode >> stream xÚYYsÜÆ~ׯà[À*-Œ9p9Om‰Œ«Çd©Êçaˆwaa5€ÉŸ¾Ç4•”ª¸ƒéžžé‹þ©‹<ºH s›¦Åá]$Ó_Þ)m€c3gùp÷î»±ºPQ˜G¹º¸{X¹Ûþ;¸Ú»ã¥ †òr£‚îrcŒ Ì÷—kmpÓ\ê H+†ªm.7:K£80ÉåîþþîÇ»qãXëWŽöÇt8kôÅF¥*Lm‚LßÝ”¾ø¡}÷¯‰½¥Š,íElt˜(Íj|¬v'P£+Q˜>R#®ÚºÍ®ö0ߢ"Aۣƥ~FM]T2D¢Šp¦ÊCÇš6¹ÛW°H›<8ÎXy¦ý-RFŒ¨d³Q0 ÔGüÓòDOƒHiø·¯«mÙõp\“§ÁõoQJø«˜|‹n ý9Bõ3Që“?RÞ)†M;dÉ‚_d>ò<Ûiù'u%Q–²?ø…5Ló‘Þ“a6Š}°Q&Tq”yJW\ê4ØÃZâEÛ`Ø—8HÈ.®Ù•LŽxr@‡t-ž~' Un‹²à7ßó‘‘µÿãäºÙç¾%ëö3AB*N]çUe³ä€¶±I𸯠$ùÓŠ˜] ¿"AV„äÁé0º–ÂÈ¡Uêç)d †#*°º‡õiÐÂáèóúV|fˆ‚¶<ÿ nøéúgBæà58ô<ïezMq®h»®$ö#ïDB+ü»cŽ¡|gA=yÙ=ã|ôf*•1ØoP÷œÏA.„ñõígR:Úý¹ÊкyV…’:×Á5óv§F‚æÈóØ•[¸Y#d¢(Øž,›%GJÉv÷õ¸—§« L’Tè®Ùòš{GNÿ²böÜ‘j’„„‡¿ SJØŒ­ nšå„ሠ¥a–]ÅÈA‡%éä(“²>"/ƾIbÈ‚òj(™BvD±O«ÌW1åtsÑÕ&µ“M‘)âŸJ~08Ò‘Ë5¼î:‡âŸÙ3¸ þbÈ eoëàè³,`iXƒÀÎ ÅIfÁÏ1Fa|Oq´#  c2í{º~CùAãr±Ç çËÊ©gœ(æT×Ӳ޶Ía[? ‚Ÿ»åÉÐ- FVšPbƒuPžì¼<%&Œ @dÇc™oYÆRàËá»g™pæ‘Ú†Q¤ba…$²Ac¯ÈÔYhp©ÈD_ !. ã¹Û# ‰*®ñVçFBršrÇV*o©sDo'“ÐDë]Í=nFX‘°KÃØ¤ù‚>í•Ó¯—™  2pÂq>ú·¿£?{ rÒA`(y¥¬à“¿VN²Ø~JFRne>Ý ¸n?½·qª’ýQúLµsÙc&Ç/Óæ"è¸^.S3öðç‰1ù:$¯êjÊa/’…iy¤üó§Uè0KtU€Ž‚ápøÛ+eUê³½U1L;ax¦¶æÄÓ{J¾nÒPÛ]Å{ôjúÂ5´…yìuåšâ2†ýë5LZ›äg tåàÐI|Ê’'cü~¥D}ê‚FÇaf#½„`15ŠÜ—Ò×½q·ž@,I¼:·×(ío?Ü€¬àp5!ÄqhÒ1Ê)?r‡Cég\yoê"3=9?ú#A©,|¶zxfÂRÈÑýÞmGlíÀñ¶¬=/ÕP}òæƒ4Œ®ÊGqâxSœÛa‚²/¬8:’Ì]Ù:סÊÔY´Ï›˜Áu»R"a'»…kV…øðFyb%mÓ®V™†IþecþÈÈìÀFCAsn Í)Uam$qá„b¿—ÅÀØâï– øè†×=VÔÚÁÈ1[Ág’¦ ’¡¤†"Ïãž[Hî•‘gÛRoÆ…†™šVÖoËãDäžq¥€c’·é”‹lªƒz¼ëp»Š-KåQsZ íŽÁ.äRÕ8òQ”J’u¸ …²í&µ/©üIÈ ¦¾c‰Pb7ÜHn^ìªG“{¨Ú‚ç&Šs2Y Æ`w²9¥;ÍŒ†‘´Áv¢"¯"¼Â,$Íž`Ä…ô_ú5ÝÝQè:HŒ„Ôˆ‚»çáŒ[ª9ÙÙ¨\§^ìÓ“Ñ0dE˜lÕm|”Dœ©^ê)‘(,–(Å_ÊÞ>ÉnÏÏ¥óláL)ëù›>â…þ Rbuã%Ȭ £ëÌq Ä­oµqrTbªÿ™\cóì,žq†®ñð[ "@`»~X«ùÓ‰W3ÜÆç­ T%6úˆ›¹oIs£¶65K´ã‡¼öQk^©h$n%Û5ü ™c–?ÿø¾ õ%ƒÖyxˆÃš­äÌ3Û¾+k¸?IÓ°‚Z’—“[SÆ/&øË¸Î£¹’Ø`DvL-H]$.¾.Ô?=HÂÆ m{B€¾ºÑý&Q†j=‹•˜ÎH<5Ëûk!\tüàÔûK¼¿eNÂ^ºv&ü­ \0èÙ`'‹< Ì«éÒ"¼­àCÇɼïuj “³Ñ´ºoGê-t±¢îÿ«:3¶pVe|+gWÀª¸:ãï¬ðÉe—“Í¥¿áKIý,KÅY¾——€$Þü‘ƒ³ ï]ïSŠ<®8yÞ3Sqêp¦F”-ÉG÷%Ù|7=½¡òÓT7¾Í>ñE;{Å 3iu§=W*) ?«8Eí…¾‘gWÔnH¡Ãø$6VÇÝçëT’Ò3A6ñWEô„LÉó¥<£òîâ!æ<ÈË ‡Å‚ÛìèIFq¡IâÙÓHÂI–Až½Ú•Ž{t—»¯Ëµœýfw1Ó¯û÷‹è6k*Álåö]6f …IÍu²ÍšÔ­äI)VÞ÷Jÿæ Cÿ„yþj8 ¶é²ùM~õÿE¸N|Ó­nºu"…€&Vp‹K¨J'‹Þ»a 8ŽÊ'W Óø!Å¢3¿ؘÙñù›™üó>p÷ó§ó4åÒÿ²õ._ÏðTšÎ ß©ö`Ó\=J#š¡´IáâÚ‚º 3~éì ƒCåŸo¡2ÅŒ}à•ª¦V-Š \®P´G33R}_ÑîÍî˪©ûÒI4=Û—4VM#Žç-Nó¶å®gt˜^I渕W=Þt­ž#ý¯¨Æ ¬{¬¸Oý³<ޱ2EðØ9Ï#xÆ ‰lVÆÝÙ«ýÕòbh–·ð1 ðËSíúÿiû/tvÝ• endstream endobj 321 0 obj << /Type /Page /Contents 322 0 R /Resources 320 0 R /MediaBox [0 0 612 792] /Parent 325 0 R >> endobj 323 0 obj << /D [321 0 R /XYZ 90 720 null] >> endobj 324 0 obj << /D [321 0 R /XYZ 90 684.1345 null] >> endobj 320 0 obj << /Font << /F51 9 0 R /F54 112 0 R >> /XObject << /Im12 310 0 R >> /ProcSet [ /PDF /Text ] >> endobj 326 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/mat.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 327 0 R /BBox [0.00000000 0.00000000 128.00000000 148.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 328 0 R >>/XObject << /R8 329 0 R >>>> /Length 330 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hdn44±0Ö3R0Ö³´43°TÐ5Ô3µ477„(¶PpÉç B^"¤endstream endobj 327 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150402) /ModDate (D:20070503150402) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 328 0 obj << /Type /ExtGState /OPM 1 >> endobj 329 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 265 /Height 309 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 265 >> /Length 2925 >> stream xœí=–£8…Õ˜=LÚQOX+ð9SIoÀ˨ĉƒÙC{•Õœã8íhÖ3xèé_€ÐïzzÊF˜‚ë!¤kÕ7Fšôýç*~=o‰vä`݆‡K¯+wâõf}<ùåõ<†ÔQÊwb|bß@Ô'“øGê:ççÈ„k[Føäy™™x^Îü­&rïL^#8 ×D¨ ……‰OçÅ´e}ŸQX˜°]L+»ˆ²·µû{Õ˜0W­µ];¬ûkkð#טX³Re=`6Z$W‡¾ü3Œ‰yHWþ~é‰Y¸Ø³jDéû»”Œ]ñŽŒ/¶3GueîCÍã„— ɉa·ö3!á9Ô”F¬bb<=¶2ÁO´‡òc<ùbÙcú­•̉„Lðƒä7*þ‡^ Ò‹Ó(jCóab‚;1û›ÓÜÀÕÉ#%hg aù:&®ò._šÇã¡Jô Ð ¦'Úß«ü›W2¡8Á=“™˜ñ—É—ÎáD†“CbBúÍk™P·û021;çÃr^,kÈ‹s11€(YyíP¼P™PªFc}™ ¼¿REûÚ!ÎWt¯˜¸8íÉ‘®=Qº¶1Ë1±ˆ˜˜åeB^xb&/NÌ„a¹ÎÄËÜÕ»eï†_õ°íï`‘y¹`âÁ{üŸŸCsÒ¨‹ey©²î¯­@0ñs\íÔã·áÿŸSjà5øõOæÊ¥?ÿãCìûè?ƒÎêÄýé™àÆY™¸³_ʵƒ3ñ;÷n¥×c¿”ö;±­2ñcź¿›f"܉;{'&¸îlv¢a&‚d0¡}&V:AL“ˆ 1ÊÇD×ëÏ\k9Wshr¢ãOÈÇD;Ö1ÇÑFs¢W~“¦ŒL9ß°Û ç&22ÑÃÞñŸœÞžÿyÎ *‹áëäͳ‰”ñgÎz9ѱù_ÏÄóùðqÙ©NàÍã9™˜Ž[¢X"+e¤9Ñ›f½v 'æº}yʨlƒ¼NÌ¿.+PG 3¡—0ÐÊ6(ˆ –»=!œ@»¥9¡ìòJ©×¿9˜>w­Æ4”mÚž°m>s×½¨ÉÅU•Åjc6/_E龃îE' bDL€ˆ 1:÷Ðu[g"؈֙7¢q&V©i&V‰˜ bDL€ˆ 1"&@Ĉ˜¹˜¸ÞªiDIZc{·tz¹˜@òÀŒYó‹ÐßS¨7N&pð Ô 5R—.&f ¦!iü'äÕq$ °L?µ ÞÚ\jù™˜O ø|g'Ðð.œhüðiqi ¥ÈWíDš¢*]Öÿ/ yêcÀbukQ¦³g+( Ä LLK&ÄKX#hs©µ• Æ´Aliõe‰ò–â`„— »vÀ)V÷9±T1º]ÖÆÇêö®öL5¦TEúkÌ^zGö3¤)>IÆú°«(rO¹TöR0¿ƒ­¬&¾v;0ê½þûŽ(N|ðã­ý^ô‹œ;5 ÖÏDT'ŒLD:Ô{&Šwb>»S0ñW„ÝÝ£¿}+ÄwÂÂDYNÜ?´—'bWÜ_Ò+vˆÅ2‘܉6˜Ø|ÓÒÝö»ybÔqœ &ˆ‰QĈ˜ bTRÆöCNÜžŠ gØ8å}LJ#y•ê^´x#R1Q‡¨oDL€ˆ P2&´k´x?m/ÒÎË„ÞdwBNI¤ŠàEºÂy™Ð öý7äEPÉQNÄ“‡ ÖGÓ訉:X´E]<'JzG> Ñ9ùìPâ"ž@I<'8Q„“BÓìK¦€é1\âÈTYŠRŸ=A9+³ãû N &ÄêD@§”ž3gÅо›™`Ì℺ĸBQ¼Lìr¢¼žƒ ±çØ ½Æ´;QUÏÁ„Ù ÃU”!Ô WQt :,‚ˉªï;¢è½…{Ñú {ÑIÔ?ò÷m¯ø)Ä:ó˜G¤ww¸³‚ÿîÞOÇï-,gåÎ 7ztˆ;™p^VæÄN&r¢&ðWnغ¶z[L ÎÕýy{"Òlo-Ì{·Cј yïò+ÅAÙ;,êÛ L ^Y©þæ,’þ}Ì2œHô7g‘º~ÏMN g¢MûΖ«\¡L,ùk°$ÇÞÇT(Ø %´”×­@&pæJsbË÷vËS K$Ýà„ç*W&V÷Œ”©0&Dm &íº¶jL/²bÚÔ¥žèsY‘6{§¨¨!ë¼w…9‘ñ^´e'¨ÂÓY¼({7©¸ìÝqr§úXqãÇÉêû(.{wœÜ㌇8Q,«œØ|uoŒ‰3: Æ˜ˆã1ALŒ"&@Ĉ˜ bT®Tß©î;œ©¾”÷¢ÅGÎR1Q¼”½Ã¢¾m1"&@²w…*Cö®yÕÎD< bDL€$&~^ž™‰xݶ홙Ž`âç°à"1¸ëc,*î¥%¥MÂ411=ÏÆn ¿Åšà„|”hf7cùV¥ŽîLLp}x1…‰s9ñzc“ÚµÃê„Èï[œèæÙ µØ¿á[¦uwŒsn“çÚas¥QmNç”´À¸nJyÚγ£s:_Kou²œwVCÐ µ‘ ”ßw:¡Ì‘»œâ¥(fòº•0òû.'Ô9rçEê·ôoŠÔÃ>4—†¸¿ïÛ2á©1 åO¿kLÛº)åe9(õDæ%wÔê¹êEu™Í !ÎÀtò1_Ì-+æZjVQÉoP´,N¬ÌòZëZ„å:AýŒú¬„ˆ 1"&@Ĉ˜ ΄S³20qN# Lü‘{—2Icâ3÷e“ÂÄ-÷þd”ÌÄÛëÌÄ„UÏ›«´"¹daµ§QÕèÉÜ23ñ¼XÃnöÒš7çqŽLÜœfNÄülòÉs ¤IÿÁÚKžendstream endobj 330 0 obj 68 endobj 333 0 obj << /Length 2370 /Filter /FlateDecode >> stream xÚµYK“Û¸¾Ï¯Ð-T•É%H€ SÇ[Nmv-måäÀ‘ ŠTHjÆvþ|úð¡áìd]•rÕèF?¾î†Å&†bSĦQ!µÞìÏw±›~¸nE8'y·»ûîƒGE\ˆÍî¸8dwø{ðǪ¼lE0˜m(‚n¦i¤o·¡”2øØl“–ºr?ضنI®c¤zûÏÝŸïþ´«$yM4$yM6KX–›,—‘H¥"w•Av@+ç´‰ˆ¤9ŽD¶ZåÞ6'R«àǶ;—uï6.˜hJ&nãý/?Ðådøßf×ùfY¤eQ¸í¸\¶Jÿ”ýmö<³ÂZi9u[/e³E:P{ÍL-|7ü»ÇÙr0=.Èà©2Cå‰;'©ûÅCÚé¾÷4í ÷hÍб “4Tš›P¤‘P1›¾¯Úk [lõ²ëH¤“Áo U9ðJÌDp&¡jžzD†ähµçMeý´MÀ¸ü¥gÚc¹tƒGëE}¢ƒøb"ˆÐñTðñèDbjº#Ômžñ¦ž¾ éƒÖ²ÓÎDBˆ KE*‰—ª8"sÐZ(µ“¤@Øl:¿ÀRã˜Ø·uKK`ŽãK$]ç¯Ú; ÙÆèªHu„qI¤n[ë¸ñ5»Á|æï+_IР¬ë/‰'%1k’lí§ˆ“í™øž5M ×Þ’[ñʨ ·§º–¦•Æ™÷[Ç“ˆè:“þP®²Þ_ë7FõÑÚw –&¤øU£8>˜c‰:­r?üÂò0“ ‰ŠrQ¬`Oªb”’#³†BE”©D»#ö¨Wïd]< `ýIáKÿˆ…²{\}X„ ó‚C‰Ÿ¼•‚&Q{ª8$hf®F¶ CD¬"©…öŠËH0\SòM·þ hH ±[ÔØ©rß)‘a1Sl‘!ƒýЍŠk$ø[òy¾íБñ³?·˜aͪÙ:GÆ0˜ƒ;ã~*üË Ë’"ø4YϼGwÄ{_ 'ÊЮùɵÊÝÑg~#¬xS5 UO–ĆÑ|ï3i‘©À,—"«4.Ç4Ǭ1õtƙτÁÒÔ‡©¶yάnQ ±p¹6G·Ýú´_lþŒõ +e¤!™~[ªË#™¨õ\ÇÉÆO¼]ã¦"â"CwÌ£$gý`¼ªÊƒ¿YÎ[„'ë™6‹ã䜢ž,"å€ÎKºD¥ððb?‚önùØze¡qö?tä˜[Üf½AWWaóÛÚe'i鮂¤ýÑg<¥ƒHÏ žpúMÆHÀý/‡Ó0eDa‚¤5@SƒŸÙ,ú8ÁÿƒS`-Ò0ý,+ãçãˆJ{Øàùu† m‰à â¾¾7¨ {!V]9Àä0Ñ•ìΡƒÐ)X›¦’è¡D ÎŠ}þ=U†vLI¯ÛTï¬Ú Ó,›«%ÍtðÎ|¥œGØ)ˆØa[G÷¼sôq#"u¾(xÃL3–P¿ød[–6à g3š¾2=GJ¨ ï|¶²N€K®!wWžÍÔÃÅÅ–‰–€w‹‰?Ž;fÔÖÔPƒ …Z: WØ¥MÇU¼LdÙÒ·$sëÁEÞ۽×ro-ô3Òí¶¾jPË)Ò:õˆÜ¬ÅS ‚‰b¦uwDzY;]f‘úWO/"Çþ†÷c9}{X*‰ò\fK#½pd®s_yEs%E6WXARö‡ÑÐòïRÇÒ¹+(»oÆc¾ÚÑ!`Ž=:*,ò ù’ãåMWŒU¾7âºu$äh~/»@(ßúÀÄèvT“ Ûqý•«Hè$_b\gÅÞàQ¦Adž«¥ú5ôeÁTÒúv ½¬¯†+(œ¡üÌÒ%Þ¼Üigiâ5ò3¥¢Gˆë5¤2RJç+Íuþ÷…zô—&"ýÖÎ:½¬·ÖÀòŠ®/©«Î(òbïJL.‡i5ñEúð¡qÙÌàpí Ô¾ ›W­( ó\¯v ¾+ÇfÎôÏ+NÏÉO¾Š¸Mq$me:ëé:¾œñ~r#¢o”Á™Z·@ž5Œù×·ìs„ÓüQj. wׯ²/¼×yòÍï&E±ZLŠàwý»TÍÙýþŠ—¶‡Õó¥Ð,ÄÚ“PNPCÌÓmÃo2¿É˜Žiž©)öœ‡®­{&[¯öZœ·hˆp—eØ·Sþô‘ßY'HšÏ=')ö³|ò$˜»é?zOa(Ùö£'^î°ÿ0%×¾00ŸËó¥6fÐíòÆa–Úsp°uñ {~&A¢'K^ £;KW.®%tvgÀËÙq=c=ehX™.7¸ׄÁUÝך$ ‰ áÓ¾H ¾ÌÐþ4_\tÚ1D Â!kb̦ä÷²ñªpðXþÞî$0’Q› $zj⦀ÝñöêKíâqÆ"Q!4&ºX9¥ÃòŠ¡ãE¹Å7©Ùд¬Éµ[¦lð SÝtü²Í%)Jžw¸ý 3¥ä‚^3¼Y ='BÿsìeEV̳&H1Öçå}MOS(ÃÎÕ8`¨É ÌÎb—0‘,VÛy;Ïž2½ö<ÝžÃ5€de÷HúlëúìôÚ¶§°3uÉïØYÎP«wM€N6 | ª@MÄøN @”q6N#¤Íèoâe©k`uüÎíÈG±#á{i|ÚB?R6¦^S4:eÉâµd?U¡ÄÇR³¸úŠ%¡Ë/Ô iW- ƒ ÓíÙ=n»ƒyòyN¢¢Ü¸=òxàøþÙaœÄÁÇ)è¡·íÜFF\˜²x(¦QZHñyjqQîâÞ½AàÿÞü{üß™þÄÄ“ø_3ß}> endobj 334 0 obj << /D [332 0 R /XYZ 90 720 null] >> endobj 335 0 obj << /D [332 0 R /XYZ 90 332.6078 null] >> endobj 336 0 obj << /D [332 0 R /XYZ 90 275.8498 null] >> endobj 331 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F55 36 0 R /F72 6 0 R >> /XObject << /Im13 326 0 R >> /ProcSet [ /PDF /Text ] >> endobj 337 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/light.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 338 0 R /BBox [0.00000000 0.00000000 144.00000000 82.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 339 0 R >>/XObject << /R8 340 0 R >>>> /Length 341 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hbb¢g¶02Õ3SÐ5Ò3¶´011Ì-Í,Ì!Ê-\ò¹~Aendstream endobj 338 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150402) /ModDate (D:20070503150402) /Title (blah-000.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 339 0 obj << /Type /ExtGState /OPM 1 >> endobj 340 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 301 /Height 172 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 301 /Colors 3 >> /Length 3115 >> stream xœí=’Ô<†›£n!'  "’½Ç ™dîÀ^€d#¨ÚlJDÊU>úÖhdYjIÝRË~Ÿ*\ƒ­‘-¯¿þŸWÍ«åßïß¿5ª~~~~zzº\.•Ð×õºñ¢ÉçÏŸÿy¸üÿÝ»w‚ÃEB¿âõcˆaŸá'â5;5þyLÂo€lÍôÁn¼Ôÿýû÷›<Ô˜ÇÒH¦F¯/5¿ÿ>’‡n†b¨7 TŒç¡…Åãe~ìíæá2A<‚‹½Ý<\&(]ÌàÌÜÝÝEco7¥.f¸Ù?õŒáÙ†ôwßÏZßóÍrjäóð¹ùÑΗ‚Aö½'¡Ëo¾YNË‚<´ÐJ”‡þ^?ôëáŸ@yxxðëYøúåa´Y\ ץώ¯+ŽM]ßKÔ(½t3N ŠÍ”‡zBÑS¡‡Lé¥Ë$Û¿ σ<¤Û]Ó9ò†ëÞù2ÆŸ´~ö Ðfo~;räaªüåÞ¿ýýotR`rt8ÇÌÃÒÛküËæá¶@Â(æ$pHÒ}¿7d(™s —n“Jðz’_ :G0;Ù¾·öRÎÙPyHÞ6€Ÿ‡ÝÂ3S0;Ù=>>rF˜æé; ýæ÷pdÊz8—ŸÝÙí½©K{ݿժ+aàvÓol¢Âè:q÷¬åaõ·fô0±2׿Öv’ëmkcýÿNäaÑ¢ú…ëæ¸·ÂWuºÐ|yÝ ºÁ–o»!Ll-ÐèaШ`å/ëþ|[¾eÇÃ`‡‚”ûÌyèw)ºÕ,û9ú§²™“²“övY×Ïuklàv3±¨Ñ–V{˜h¾“åávCÅßa«ÖH‹‡´ßÀ¢—¬‡ªÛÍh¢ønk[dz`nïæËÃjéÐû¥+[‹Vš¸‡zÛÍ=£ßô°bãýìs¢<ô§’IE‘ÍàØö¿SxØÿªŒ‘ë@`Eñø0+|PªùçÏŸJ5û¸åßóPý~šÄu‹µžmùÄÕ|xxNøº?¿pŸ?GÚCêyi‹Ú‡FØöã=\·d–¤^Ž~y¸÷Þ~éDÀC#ÛCÒÎÃàH¹vuáØâyü ²ÏÃÃjŽí!áyü4ðÐÇöPåý¥Ùû÷+nð>øÓxh„c{H²ï/mô°åÁs%ࡎí¡âû¼ÀC%;Çö´óп@Ø»vŸu žc{¨{|Xñ¢) šáØ’jîíO2Çoéÿxh„c{¨ž‡‚y <4±=¤YòpÔ»Œà¡\?v-ËÚ-9XðpŽ<%!ÁC3,ý˜¯V<$í<$‰Ÿ.<˜‡ü§rÀÁv?MâºÅZ϶|`Ýöñy¯[@Â3câþÒ±VÒï=Ðïy‹½ýÒ‰€‡@‰®y8êþl)à!PÏxþ°x”Àó‡ÀC ž?,%ðüað(ç €‡@‰¹Ÿ?ä%¦|Þ‚JSx”˜ïy‹ä!8³æá¶|à!Pb¾<ÄùRp<¦þp^]m“²6êV !Úsæ{þЯ':UxèXÖÀzë¢ÍVýìaOüUçƒç Ððpºý[×cMµÂÑÁËzˆç3ÀC‚‡ 0=$<˜_:‹‡Öò£Pq¾4Ãpiçú¡È9&u¦;ñó4üõÙù< áúaË÷Óø{}‰s’‰L4<¤ÛvEûQ⺅_,ººš]‡Ó/: ä¡ <î/­y(<$xØòPxHð°ä¡ ðàaÈCà!ÁÇ2ÀC‚‡ ôÎC›¯R–<¬¢k[B‚‡ð°–NyØ©5€‡ð°‚yhó÷FôòÐíÉOGà¡ÁV8 .˜n‚R–l°—0ñ=´ÙŠõl…5tóP ò€ñ ò€ñ ò€ñ4å¡ÍóÂLJMBBd)ÎÃeÚ˜%àÐä¡ÿ’S€8ù> stream xÚ­ÉrÛ6ôî¯Ð‘š±p—ö”&m’N2“&ê©é¦  …¤âq¿¾oHJ¡k»íxÆðÞ¾ X ø V¹X¥Qäçqš®ŠúJXð—«À®6pb3?òÓöêÙ/2XÂÏE¬¶û3"ÛÝÞ‹R×7èõ&ðºõ&Š"/úa½‰ãØ{Ӭà ¶:U ¦mÖ›0K…ô¢lýçö׫Ÿ·ãÅ2 b ,ð_ð–d±D±$Þ¶ë4ždè)ä®ékxŠ ºAЀœ\Š(S?® "?‚åÜ–¦GrïÄ= Ë“y;íd¼ÆÃ¹ðnKø¢ýa\uŒ8tªP T¡êha.îø˜»vÜT7•Þù á0÷^é¶^‡©÷Í8â·|Ú =}Vß3hË—|°GÑA·gR6í&L"o‚ÓUuÇ_ý <r‹‚Ò©D@~@¯À{SØÃwkw…¥¥š/PeD®%Ei&R«E@õ˜Æ‰Ñóž±$vÈxz¶…G[ËÇíšûbï–DSUJ“ ÑOBŠm‰·g¡W›¾­v@jtá„#†­DËúXéÚš}î\ Û=ÿ*>½sÒP„”ºˆõG’ø˜ª4CY3¾±ôàrAPönr&<Ž”Ðzs`ïûñ¥3gêíÌ'$$v¸xšx7'gÌÌûŒ~ÝÛ ³µ6‰’ÜšvðAƒè2μß{ÍHaç|½S 1{þ%üöt.SB2‘ +‡@訊¿f®æ®˜"óM”A°aTóéïb‹ýö0 ¢3D’£…|£N˜ŒÇ>ŒwìtÇ’´o(Ýá’=pÁ@·¦ª8­õ2)\ˆ"¸©BZ¥âr‰}ÛÕŠ’eàù69å¸Í”r?„A>_‡’býX’Òþ)­‰y>Ë3¯¯Ìnžšòtr\Èݵ±É,#w¤EK:-\Ü ¿w°xö˜œôÙP¸B„e›ò¾c…Ž;Ë_Ò»`MrvÂVåí 8•áǨyŸD(ÔNÛó© ½óPº¤B4”]ûë„%wïŸ`Ù¥i06úÇ[$ÂKcE"X6žuúaD¸ ?ïIY¨3ß…6`ËôhPÂtùBX#˜œ‚¨™¿f¨˜‰1˜Çú[œ*Šì%»•¬ð¹Þ­)Úæ!#úÜ4¾mÑäT´í'¿­¥ÄB¢jKî`¾Ù6¿ò Å[(ÿ©ªæúÇÍ©·ÑŠó—cèiù·¾¡.¬AÇ’Ù,Ô56œÿ)ÎG÷&Íîœb–]$¥Òä¼¾㉠Œ&Á"äJRX7F7³ © Ú2çO.ÈÏ‚¢9Ýé ½åi1udíÈ™›9e£2‘ê¿U$L½kŒ +@®Lƒm³—f“WÁº·2µPÊ¢Ž¥ë\jNˆJj†^KÍn¿ YìLáȶ4Óõ.‰+-#ÛAGÑn‹QèLæ6Ów6¿UTVcWÉå} ·Î#Ãfž@G¥$Î4¡÷šÃ^w¼ a RW'm‘§˜ ó„Æ¨Î‘›šøÈ7llnýè .Î-óàòÙθâé& —¢ló~ÉE&>L)™%üNA2FªZ,$qîCvlÕ8!US‡˜†+PŠ3„)9L$Èƾ ¨‘X ý‡ª/aPâ!üî­9pC F¤4Åì¼GjtµÄ´E™ÕÑ¢Àa䃿Zà¦r@êK¢Æ~,Ó|ITè/Ä”ír Ô¡Ó\CKO{'Na¯Ý5V•ÐÍ®½P×mcÁ4šN´Q§0Š] [Ü¡PAÀy3¾=u…îù²$¡^£Çn’ÔÏ"™Ÿ;n_ªœ¾{ ù:>väb‰Ÿ¦‘Ä—Žgoê ^½l¯~[z Dìç1h> endobj 345 0 obj << /D [343 0 R /XYZ 90 720 null] >> endobj 346 0 obj << /D [343 0 R /XYZ 90 373.4643 null] >> endobj 342 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F72 6 0 R >> /XObject << /Im14 337 0 R >> /ProcSet [ /PDF /Text ] >> endobj 347 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/cam.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 348 0 R /BBox [0.00000000 0.00000000 100.00000000 288.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 349 0 R >>/XObject << /R8 350 0 R >>>> /Length 351 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h``4²07Õ3RÐ5Ö³´43°T0Ò3¶´05‚(¶PpÉç B^3¦endstream endobj 348 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150403) /ModDate (D:20070503150403) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 349 0 obj << /Type /ExtGState /OPM 1 >> endobj 350 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 210 /Height 599 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 210 >> /Length 5585 >> stream xœí];’Ü8Åe]Yru‚6Æ¢£ˆµû±ÑŽŒ½ƒt9´dô äŽ5îœd#¶X$€ÌDÄŸ@U>©ë¢Px|`ÈX¨‡ÃêïÐáßï*‹³ý~Ý(ýþâý÷¡nŽ÷ÿwV£Ÿ7J·g?éÛ9 ½á}¼ì* ŒÑY´J/ñoc¢Uºº.µA•^{µ›†8˜h•~mùøt01*ùlù`6üÖ¶¾xjôÉQ‰·#—Y<¯­öÕhkhŽJI%7Æ­Gõ|ï^#|íÿP»*1*±%¿…4…ï\5z…ØÞ|¨|•^7>¯­9ª„(mµÉWi'ÓœRšJ·Ú䫹 ð–tÿpi¦‰¦7ÕŽ*J¯GÜÈì?`š“’È©ŽJtñÃ)™VŒTúõPäË¡£Ð¹$§©ôJêûÃQ‰¶;"ë²i6ÇaR9™sùŠÎIªJ®~•h«Ò"ÙlP ävTÂ2'ªD þáQ‰¶1–’~°o’8Y•î5!\ã-!å¨dì'1%Ƶx|1µè—”¹P~¼b«L8È‘7Úè×/õBÏÑC/ˆJ N}•©GP‰IwUúÍ{¾Þ߯ñ`Ýjî9â«‘UéÇÇËÆí6P`ñâIoïûl*mÌþP_ïÙ÷‘ý¹cn¯ÿ{u…Šñ¯ÝùéNiÓkzJß¾ÿ½ywJ›¸©ô×Õ•*Â/õX¼G „û%Qi< ¯Òç¤Ü[͇W)‰Ò·?Õ*Å׿—Ò”W)‡’¨Ô¢’•®ÀAiÙÖ“¼s©´lt–R­UZÎÏj ¥ãÑ‹¶*ÝOèÙY¢tÚÚàö´'íx¯Z«uVcàPÚÎ÷§«¸€“ª¿›$[¨KiåŸUc•,%ç„’s Nr&¥û®*š¨R\ö4Jö³TÒ= ¤¤lÒiãX¼(JMUÚ[—«’ΤÇPB-Õ6<Æ<4µxðd²”ìÕ¤´=O)ÔbxÓ~ žTÓðàyŽ3Qè5zØžou”ÐyÖÇ}ÅÈH\Í3‚¨tD%5…JßrÏ¡R £9TJÇð*¥CTšÏ£RZ jìRxTš’Ò=`Pi¾Æ·*ÍMIT¢Ò ÈP xjqz¢/úøPq\A6:¡éj÷£»y3TòE­r)9ñ–vI†œ™9*yâ+Ù”hy~JÈÏiÝÈ~J)*!ÿæþ ¼sëýkAˆå¨ o­ ú¥K¶™QœÆ©~4¥•êD=hàTê¸fÂ[\¼ÆÍÄQò¹œsTR \•Ö·½¬è›¸7î1®¢\8‚P2U¨¬Œ¯(s…w¡T[%s‘‚ø ªqJµ¯%ç{s-%RbËc)‘œ1”Rû%×< +›ÉfjŠ®|&^ƒ A_Ú¦_º?Sl,µ­¯±~Èί e#~™—½RÒÑC-•bÀ|S|ÖQéìËOÂyyȤTI¥“5yàW"[e¾4*D¥pªRRXg„Uš‘QX¥™ñ<‘‹™!*ÍQiˆJ3@Tš¢Ò •f€¨4D¥ *ÍQiˆJ3@Tš¢Ò •f€¨4D¥ *ÍQiˆJ3@TšO¥Ú‡:I¿JÒ±cÕ]S ïjgnÉ­³¿‹[í›·ž9¤Ò_6“¦ä­/^ÎfqÓv…~>%ŸJI”|ûU<©4¿gÓA’U›I`CƒËïé,°Jߥ´èUúLJàž,¦¬HJI*éºèÓj6…ØV[âaJ`÷‰)mìrËŠ¤”v-]#öt[RîÎgKÌžY•Éâˈm™é×’=ŸŽ…Ó’0”ÔNa{O\•ðñLJY*)n×Íâ¥Ä3›ÉiÇ=U:¾2$U€Rb¿„¿_Sý’©Æ©ypöuÑ­žNY‘”|*µâ¨_ÒÍ_Kö½½NFüþh­³½¬ºG!-+’’G%¸úý´«õ"®q(½–"Ë |MÍMZUú%¾`ÿ°•Ï^m“V|YO5_š¢Ò •f€¨4âëw›Ï2J„µÓð³ðZÒ–~Å*ÅqJqN¯p#h„Ìk)¶¨Î”Jú%¾¼À°µN½_O5_š¢Ò •fÀS©ô fûóšÚeÁ¯¤ôvè†ýAè&Ò:þٹ¿,;‰¤„TúÎô?ÝA¹fTŠæ¦áïu¼H¤¤Žq‹(ùT:§Dg/g”˜-ä'rÜL*ä "\Ⱥ#'7\md)e­!‚®B x†¼”ô܈wûÀ –»\9Žè’„²Õ)\mÁüÎ=”¸8Q‰dçr›ó˜©R,%» |»’2™J`5‘þf”[[ZÜðZ¨| ”h{à SIgm_ U´ËŒ·xæÈa+V°B‡±x%›fa)­ŠT! k€÷¦']QJЄóÑËŸæö˜‡¼5DÔˆoô0þ.O€w‘|`Ý‘ùƒ¹áj#-ÀŒkˆ‚˜n Ñ9æ[CtЧš/M QiˆJ3@Tšr·(ä±B#‡(§ž—ÎP$s¨•ï!"Cl;¹€¥dæ?ÔÑU@©Ì‡^žÔÂ¥Þ9%ôS þR³óýKŒÓk±þ.诵S_rÌ·áÎO)Ñ÷àÎ#ImO^xjj©ØÉ¡÷ï,ö¬²¯¥%D Z¿J梠?Á÷|Ò$s|Û«SJ!§——’ò¬F±ßhÞ„)%úñˆЧtz(yÕQ1Jé~³ /N¥©(Eª´(ßB ÷¶Û$OÒ•Ì}OP¤Ò˜ÓÀ$²(ÙYƒR¬J±”°g2›Rj©¤kmWù€³=É÷ÃÜ9½aƒø.òk®¦’¡—0”lÍ"VöÈ%Sʸ–ˆsÇ«<Ì8ƒìÇøƒm°ÚµT•’{§íbJ«%]¨’âwÏNîa/%ÿAŸ=¥”Ó/ñ»çvJ¦_r)¹€1€R®yHPÉZUmû#®ìèA_*Î9kÄuöÅÞJ5n•gÄT"0IÞÿá‚2j¨ä©EbuØU“R¬JÞ(yz@’kPýUúžó…íñOJSQŠTI …UÇóFÁ÷±`ÊA‘J«‰ ësdKªàþƒ9)Ÿ0(Si±Uæê„^¦U0“Άr•àÕ?2¢<”`ŸzÈ»’þVÙ>x]Ì'õÁ|Jé*JJïxgüÓŸòÍŒv¶´Ô|Jé*™‚׆Òýq±áÅ…Ó…O-5ŸRƵ¢¤_jnz¶Žh¢c”’>)ù”*«´æY9êTŠE=‹wŒ›S(1 N¿×E€RË(e¨d¦ópa–lXÞAóà”šO)«_Òç×cÄwNöú q¥iÙ¼…FW¸}ËõeæPªt-Ùec÷e ¢ÚÆ•M©šÅ[lx÷a\ ÆHX€}Î¥T±_Bw\ÅÛ¶À¯¸…))ô±´0â•ÇxÙu©„#ñ(‰J£#N¥²EÜMñÆT6F¥2'[K|ã)E¨ôö­O Ó‘¯Ò ”ÞŠTúÞ§’IøÇ×ðâTšŠR¤Jzº€`æöÖæn&“Ù(¥*y*´z(1ÙûQŠU)D‰0SSJP 8 4JÉÞ3á8v¬Ó]UÉr()}ø˜O¬š= =(%©dþàÛƒ<)éãcª”G ¶Ã.”ꨤ#CI7ÄÑUN)Áô.”òTr(#¬Ió©’Ó#h—©4¥H•øè²IÁx˜uêÕrõ•ªä« ‰‚¯ ¥9¥X•"(ET¶¦3¶†JvÿPJ:‰? 0ô>¦Xmn•¼&‚R‚J‹3Æq4¹q&/Cg¨.¥$•ÌŸó€bNx|–R—RŠJJº^¥ƒ+OIŸˆº”*©ä¥„ƒ¯ŒJÙ¸L¥¥Û"ÊÍym•8ó`«~b ¥6æ!W%Έ›>#®4-œ¯2¥¼Ñ¡àAÍŽÕEåÑÃДbUÂ-ÄvGþZç_%q(U©iåò ó%”Ë;_‚‰¾6Ñü2/¹Fó%Ó“ú–ëÆT·6¥²ùï0™® ”7_"+²@¥ÌÅÄh`Úê/¤¥²ù’C‰[Xß ©F©`$®•ÐüÈŽ¹Ý±.(áJ•jSÒÞóÇQ‰,é­F©l¾äX¼$J¤Z”´J__>^ÒçKN¿„hJ$ÍWH-JZ¥¯·÷/Ñ*¹öWà£Nƒ…ØUõ(©÷Û‹íZº=½g®@@¥Û‹OwJ¿óGW p-}Ù)%Í—v§KÍ!ó%”k6J¢Ò@•P®Ù(Å©4æê÷•ÆdT RŸúå W¥Ï}ª—…L•¦ÂÓî_š ¢Ò •f€¨4X•Ýø W¥Ù¹*ý¼ºFå *½_]Ÿ*@*}ùýÿ¬J^|¼‡Ž^“i•B_€p´J/Þê}‹Œôï¬F›JïÁ“ò®ÂÇûã¤F7J‡ÿ*ðìendstream endobj 351 0 obj 68 endobj 354 0 obj << /Length 2377 /Filter /FlateDecode >> stream xÚ¥Y[oÜ6~ϯ0ö%2ÑòªËö)M»A)úP‹Ešz${Ôj¤YIc×ÿ¾çBr¤ÙNPðPäáá¹~ç‘WþÉ«R\åZ§¥Éó«íþðÓ¼‘~´ŠÍœäû›7ÿü·•WR¤¥(åÕÍÝ‚ÉMõ9ù°s‡k™LõõF&ÃõFkè]oŒ1ÉOݵ*`ipÛ©é»ë*ra]^¹ùÏ›oâÁV©×DC’ÙÌ™lYaR©eÙúDë<î\›§™ ˜#åÍ®Af'·°ã8M(­Ñ}MwïWðyà¡c‚-êÝ·pˆÿTy²ÃSQÛ¤ƒ]pñq×lÑ";æÐÖ“gû„³ý‘©FÜQ·5qž˜`Ž»šÇþDÖŒfú;Þ9 ¨ :m¤N¥ì¢íq€š$a°›Úfïw4“z-ì¹ FÚ˜<µ¥*‰Ýûk+“ªúZ£âI·h76*~:Ø-Z3hGæ$ÑÄÿ0ÒTÿ 9*f°ñ²h2 &CÇ×Ks}»­~Ýõ°Û–É'Ø î~AØ…ÏXfµ”?9hȃFi僦æ×Á–Šéc@ºîÞ/‡`Â13¬÷cC J†ÀiŒ(EáÀÁ¹y¸ð*Ú£|Ã6˜ç/« "À’Û ¬EçcÓU”/À÷)S™üè¼è­¬7~I¾PYB…ß x⾎?ŸnI—{þ ãŸà»å“"RÛYFÎÙŽÇC0 QWL=õ¼<Ô{œE{t~)8cEAÊNÁ€!ŠSñì-áDíö v–Éw§T%‚6ÀæmËòþÁŸ½§ñ‰“JˆÔX+}p0Pëù`ÌtªKSú³ØÃc>Öý}òÐÔ,À=Ã\M¼®6 ¶v©~ãs]̪…Œ*-ÊÌŸ÷ÕüHs•‡\žÅRRWè„i±B ùgJ]hO²g]ªúI%Õ‘±Ÿ#ÉÃá‰þiBhâìÌA®ãÁУÊᥠ$†PŒÔËÜ™[?ñx×·¸P†ØÌØ,£y;g$~ÕÇL°*&®¶wÏîûãè'guWd09ÙŸxÁÎ3¡DµBR0‘KF^?`ir¤pí96s©O÷ˆò:Vs%mÜ€çåˆ&¿ i0ךØh´O¼Ff'ǶÇ;“±çÅè.7ñDô~8ï›H‡ÓÑ#¯Gõs®÷ÇÖ!„䊴˜!(Z%3ɇ˜©k€ö(bY_I]mS)…]f.$Ü ™«ÒÒÙeæê€ñÞ5áÌžcN–ž0¬r%„Áa¨Âx´EQ€û¹—Cê˜2L뺊´,R‘X ¥‰5”ƒÿ9g©Ð¢=†s°ÍŠŽ¦¢sÂ}m-sDKª6ßPˆ軿Õ)4l™ì›‘k­o_ž^©²TgºðŒÉm>ÏE0:µÂ_äM ¬R¥VÑ&“i¡,7@'<[ߎkÒØ2-µ ÑôЛŠð¢ÿv[žY³´ÜY@òÝû P¹§ø0o@\»§€ËyVšÈo£e"碀å×™P•QÆ3¢£¤õxƒmßÓpÜN„NÒp`"EÛr#’#tàÊ 0`9–0p‡…³UvÖ³ÕŽ"£A.O¨eRù› ÷ýèz•Ü`Áol°€Âù¦ƒ$'x¿øµ¡n ŒŒS£ŸÙ9ÏøÔÂÇþÔkàç#ªæºÙÌÔóoÕc×­ÍÍ. ÃW“sÁeaá‰Yn{BÔ³¥}ò|ìžMÝ#\"Š$â@Æ&GàÒ(\”û™É,ˆ„ó¦Ò¤í,Òðé:”¡ŸøÓò½gàûx_Æ<7Ò îM(ƒžtÙÅÑyýžL›¨…Rˆžp÷~ÛoŠ>Á\sÿaMüCS!8hfùªº§Ž€kMÍ +Žæ…»p­…q AìáGËë¶¥ ¶Ÿ:&:P,NÍöH] ö,'Ô^ôŒ€Ø©ÊuJ¸²Ü×›[7Ö Ê ìl"ýò¾Íµwt9(…¿uüq¤Ö¥JŽÁW„E¥d,*QQ¼•p¯áicY„1voŒ65ÓGì@Cmý$ºì¢g•˜6Ô;sÌ£&Þ<€ãy[ÊxC{çº QC£Å¹"_¦b Åýc Ì‚óíÈK×u;bÐcs-  Ö®ÂÀ=B©…çÖ½ØmJ|¼p Æ<}R>Žã\xôΞ]®qÊu¡DØz¢üâ2Lê­é~áZŒo¶a9Þz´*ìËœ² ïŸK‘‘ÙÆÈSÐCAîy:ª†#£`â`†\îð…ÑH .ÃѦR‰se Ü)¬Ôê5£Fº×”¹døUF-áOiS¥Ö͉ès’õGôH±0!Þ5Є¹àñg2dCp@áó_–Íš©\jà$µt-þÝkâ^2dS¸æ0mRm Æ’(³À4xýâ—x¢9^uòÁù ôZ½$ S© 埜¡•“ó‡Dú&P‚ß•ú *ö~™â -÷~Ö&¿Ç÷uœŒ½X<¦çà8ö]5c×3­[—lõQS‰äû'^¯ê;‡ðßÎÏçNfµ¹¦k)?øùÇÕ<» utRþöÊ‹ÍÄÔExØ$8kn}÷‹+Ô{ˆ‚ Ò·Ô8éüöÐ(rõFÆaåÔŠÜ?îtþ½œþwâز󺯲HÈÆîèŽ?ôílò™ÆÚ¿¾ê±ý­oU³w|ío#ÿ[Ÿž¤ñY;ZÝsŒ>çû#L=4nñ¤±öУmj” ÷aÌ J û\j‹wùì…çÄ‚¿ýO¿K endstream endobj 353 0 obj << /Type /Page /Contents 354 0 R /Resources 352 0 R /MediaBox [0 0 612 792] /Parent 325 0 R /Annots [ 356 0 R 357 0 R 358 0 R ] >> endobj 356 0 obj << /Type /Annot /Border [0 0 0] /Rect [107.1877 205.6486 284.9677 216.5576] /Subtype /Link /A << /S /GoTo /D (Appearances) >> >> endobj 357 0 obj << /Type /Annot /Border [0 0 0] /Rect [311.6422 205.6486 498.5132 216.5576] /Subtype /Link /A << /S /GoTo /D (merge-baseap) >> >> endobj 358 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 192.4979 257.9092 203.407] /Subtype /Link /A << /S /GoTo /D (merge-ap) >> >> endobj 355 0 obj << /D [353 0 R /XYZ 90 720 null] >> endobj 222 0 obj << /D [353 0 R /XYZ 90 137.8457 null] >> endobj 352 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 364 0 obj << /Length 1776 /Filter /FlateDecode >> stream xÚ•X[œ6~ß_1 .ÄØC“4Qª¶i••Z©é Þ¦Àd²ÿ¾çbÃ0%ÛV+-æØ>×ï\˜d'à/Ùbg”Š‹Ô˜]u¸Žüé&q«ND—G^Þݼx£“]"âBÉîîaÅä®þ=xµ/aL6Œ’`#¥T ¾ £4Mƒw](sØÊjjú.Œdn„Rþq÷ýÍww³`-åWTûkQ.Ur)­c“fxèÅ»C¢w¯û›_–3Èèß,HD ÛéN¥yœ%’ÍxÓ<žÀŒÁ¢i bxÉÉ ÜíáÅm¼*h(˜42áçPAÙÙ6F£@‹(Éâ"ÏsbûîNåàà°·n]vâuFZÚ ¹:b‡‘{Œ™RÍRoA%'Y%Ö¥+ëLK“KЄÂ7ñb¨“Tæ +w¤Y¬¥ñçeÇÆ&A‹²MP~‰"éÕä´"éåt­[F™ÈŸ³=ÉT@‹<¥âD À?=!eР@©Ô©Ÿx]òÄ:È*·HÓÏyE%±TÿÝ':΀ȦO@/ò Ø' Ï´÷‚õ%§äJÀ+sªNÃàYqn0¿Å‡[Ú˜$6…PŒ˜LL¢+ð.¡w° ×+±ï•±È’µëÑËéâ>ZO¸Ñ{ÿ€Ït*ÒÎMWc`Päù‚"ãšÙןÙ‹”Óà)ýÀ¼2˜¢=5óÞ9”#¶`:3ØÙÕ÷3 ¶}rì½.Ê× W€B#JƒÚÀàƒç >¤uü,ù±ö0‘ÎøNº9ߘàŒ1ƒ$€˜§N#¢ ‡ªà'¤‚kàÅÀ®eê´w‹O¸MRž E€]_5&Ç¡“ûaªN“Ó÷!do®¸p×6g~ô¢È.¼J(¦‰TúÿÔ£t¾™;(æì•nZD0¬$. SDpÀgÇÏÒôŽwïE¸V3o=üÛ’K v [ EŠšÖ±…ON‰Þ+Sº:…4×…ºÈe%Æ^wB¦­¥P¸–°TÉ`_âÛgDܶ_Ž-„´j0¡œÈ‹S£u%ÐÖL-»ÞgÒÜaWÀãΓ`WSõ¥MAêÞ…¹2–7'G9Y&wöÌhºô)n¬|Jª¡Éi\f1^t5°™UÙ- ˬp`øìð"/Ï@?_ÚÏ7[ˆ*b-”çÁé@©c* Š¬ï¸ç4YQ-\ÀŽõš~½A¤ ©)|¡~ÓPT·´‘2Îg‹K)§†BÙ¹J[À-ô>Ï(Ç&7žï%—·-ùE¬D±Ù›’ Þb Å'…A$qª5CãCÓ=¶6‚K/OÔÎ l Ô&΄kC~ê‡CÙpó½æYðHZôÂ{ƒ¨Ju¶YGÞ*‡mOd PŠÄYX÷§{4ÍF÷NO¬=ÿÕ_é–Z‚–|F¸ &–mÝê¡ôàÆW.S⋟UT'P/ÖÆçôüÐH‰[MÏo%7š}ƒv×¶ó-lvÇR¬™þeÖ¹™*ÜÞ[×íîQÐ<‰ ¾c÷ °ôÂwG×?7>_›{F5ë×¶|ÙÕ»«NØw•žë=6=!œ;,Cǧ‘ÿ55‘Ï=_ é’ãÐîôܘ––ÎíQÁš\„[¨äi°–]qü¬/³Èn€x²<2úÊFÕ•±|mÕ¾D(aã5fÑÖ÷ µOÃF™Ìñâ(ðθ® Ö<6_l{ËÃò`ëSEuóÑËpª¾%Ûa9sû–Êt&pµ6iðëž¹‚0æÒÒÁh«oÏ`?9£!5wMxÚ®äÜÁ5FMê›Ìò«2Ï×€©nÈòeøpƒÞ(=÷•‡Â²]«Ás ÷¾ArÍcV„nÑÌÚ„äÒW3Wéq/ü=‹‘ÇÍaÝ5a]Ä ~ļR™ÂDÃèf …Χ5µ^ä;¸:¼ˆª)³öX-]”XSƒèv“ƈÑTIð!ôo†Ñ<Fiò><÷ñŒ1'1tM²è½õÆ^V9fäeÕŽ0vÕø&–Z„.ð,~à%bŸïY¶íÞþpË·\|h·ëÝâLsÌ~Ë>²Ê¦‹~ãÑ|z¤ñ¯"{¶;ÖÒs Û¥szݠߟkQ¾yR!†€ÁèYÚ“÷ —%FfyÀ1Ý6ÉtÌÃ# 7dÊ4  $:/ ¼Eýá‹z‘òQh¿(8ÎWakEHÁo-|W™+sD¤u#ÇL¢  Þ„Ú}² <áÉ­ê»ËiÔAý¡ºHs(›G [S&à‡DÏ[0d¹BAoüåÅð¤D‚£ຜÐøÁAçz÷©ÃU¼¥>€Í¥¾â¡ˆái)ÜøëÐßÒ“… endstream endobj 363 0 obj << /Type /Page /Contents 364 0 R /Resources 362 0 R /MediaBox [0 0 612 792] /Parent 325 0 R >> endobj 365 0 obj << /D [363 0 R /XYZ 90 720 null] >> endobj 366 0 obj << /D [363 0 R /XYZ 90 684.1345 null] >> endobj 362 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F55 36 0 R /F67 85 0 R /F52 26 0 R >> /XObject << /Im15 347 0 R >> /ProcSet [ /PDF /Text ] >> endobj 369 0 obj << /Length 3036 /Filter /FlateDecode >> stream xÚ•ZYÜÆ~ׯØ7q ÃûHÞ¼’ †D‹<$ÎwÈáÐâ’£Õþñ©¯ªºI®¸: @ÓGuwÝ׿ñ蟓{7iºy”¦7‡ó O—?¾ðu´'ˆýä§»û9öo|Ïͽܿ¹;®.¹+ÿëÜžŠËÎw¦j·÷a·ÃÐ ÿ¾ÛGQä¼ívAF[Cq˜š¾Ûíƒ,õb'òwÿ»ûõÅ›;ûpßB ßÂÍR7ñ¼à&É"×£˜1œz`:#0<®=°z Ù;`¯oûA¦ &…8®C1Uí£ì8ýi'NÑ´Å}K •@‚B@L§y­lÆ @èTê<î²ÈyE©ïü"0ôΙ/l*Ũ#$|猭'é]â‘-I%Aù¡ëÇžH¡l¦S5Œ ¹bJ¸~žgt€x=ò‰^BGxABqzæMCó®&€Às ÓæsÕÊìÖŒ2{Æ­šš3ã¯Ë÷t`hêKÜÐ6èst†ç8Ãð¾S‚)ÃG€Wƒ\Á|+ÀD?§Ijnöÿ5½ÕØ U u3Âh¯æÕWXÎéQÙžNŤ#‚ kyÌù$ϵ.ª€/ƒ¬ô"m€YOI¾d¨ 5£¹–î™­Õ4UzÉeàë>7VÀ†¤7 ô‰HYm“Ð"ÍãA‰Äd,o[&k6­MW·zb!Tœï¯8\Ê §NåîöY8o~÷ü)&ËòYÿ > “¶Y I䌗[ )í5C5Zt¯ê ’„‰ ’Ô©‹¦“ÑA¬ÃÁtìÛ+ßÝw.T%pî5c÷r’!›ËäÊ6ú¨¥<Ýà:²×êdmëÁÌúd®Üe¡ƒ•¡SCøšÙ%LÕk6»M«‹ÝÀ÷"µºì„"DNËg…eµµ¤êB=€#AŸŠF‡lc×IÆ­P¥àä¤0côÕWˆ™Y•z¼9³¢Ó!w‹¶}¸™O”íýÜMƒÄgÔ?ôÇéuuØÅ ãÌùp*°V2§0ª·˜«;^i‚ˆ. ˆ ;MÐLEŸ™èiè[Šœ‡“aÍdGƒØt¡8Sö¢Ì†A´4ž xœž½–¥CÑ®­1A…k™‘È–0°™»k¥N”–±3ã׎бk‹Ðá‡ì°=‰£Å°­¦yÍg³JóÖb±ÃÍ­®Ì 8ï’D±//uòûrh›²*t…Ìò`Ï7ã–mŠïÊÅ~Ø/õã´pˆÕ0Ì8Q«Ìø fï´rx _@®¬êV›ié$sçXŒäawqŽ$79r<^æ«a¯r-{æ Xvâ´p†¹0'‡†äùdµô_m}ê­xù5 0•4äè³ÉAÙ¤¡(­îÐ2tÇT¨ï„dìi¼Iâù–SbÆb)±·Òcv½éý`}ßa">ÅQàܶÄ‚ÿ¸,€b£Î`iW¤$S¯¿âÜdb6ñ”HmúÒÇ0ñ­dL©òjXlõP÷Éî aø%Ó¶ýÍìØß0!?‡5yºüj| „§Î-G†t3^¤ ;<"p`?Pë.^¹È°@€•4I¼‰äHL¿§n©Ñ4ŠaÁBZî(ôµëžPÒËRð”7p3 €{QXº ý¢èÒ6BŽGîIy/x¶T¼T­x`Q”¢öß/þkÄÎû_ßÜÞÑñ·ïßý¨2‘€¤>3³EÔ›pæ!½ ³0DLR¥†Kn‚w ¾öêìšÍcä%ëEhÌ 7¥5[1{Z½Òû8vþP á´o%éú–! I•‡âûùý®‚òœç¹rÖÏ-žgn˜æ±fÂìÈ'¢*ò­ç¦ã¼ÌñzœŠî 3 ¾o?´K<âóƒDxJ)ô6è€&seW1®4"\9É5~k—–­©¼ç¦i®vd]? ì=И¥öhDŠ€ OI9Pe¸ZeNr€“€ëhýØÞËŠÌÅÎB%ˆ/½r$¨ûµ:}¿Þ¥)ËF}àÈuyÆf¼ Wò ÒdÎ%DŒ61”]æ»³Ò èIMŰ·hZä ’‰0aÀ^zÞ|Äxþærw)ëVž>àØܘ$»a P8l䈉J¡±BL(èAˆ‘—.„ˆ™"&…ü¨ŒÍ,=,‹ôøøJtrT­cÖz/qju&§„Ýc}n\ÛrF#5µÅPWÏÛ~ÑÍyCe¢È ¢ÀXílìHª¿¢,Qꦞ-'LÁ[mk¥ån…þµ ç=þû÷×<øÊ›PMÞh¹n¥IãÙ­½T(*o¢Š¹Evôû Ô0o¸ 8çªm™RihG±Ï2Ák“i2X! “i”Í")’Œ‹” ¥·iZ°º û-錗EŠ:-«°0гØH¹ì!D‰d®äcØ£G‘H7ÒðÁu5ïêª=][L¥Jƒ§"{áT7 AEŽÎ—“Im¿ Í1£xv”4æÁnx‹êæO›ˆçš-d ?›Ï²ãv‡H-%ˆ'éƒjùó–f Ó±Û8fˆkð ¡PŸ} :úK̤Y¹ú¹ ½ãÀõò$W¾-ÎÚ@2ë+Æü§ç$ó¼Y¼{n’æ¾^dÆÚ²Ì $ª=‰üÀ ¼• ö·]ì9UW‘ߟDÁ×F©s,¸ÈÁ¼•{hœ°d°¦.µêʱ¡(†ÖëÚp bšs~.~ 0›¿nèÍ:ca»[õ¦!rL+†GQjéŽvªË¬Qh)Ѷ‡zbéÛIõÝòʱPN¸E±¢e÷@Mt$U³ÍOkX]èñ´. +=G&‹<Ь–;y'2Ù Ò¸©¨ýd”Ì Ö6Êðw/öì-%;ʹîT¿8·W«Þ\`–$˯éÿÕ¢‚U¸B_™tÎ9n¥9ù£‚Ã>t"‡­æÇ³ä¾.'ç¿Ê˜GÙm-·st=Vj–\º&ªÞÚöæ}ÑD.æ‡æ|1÷çLÕƒL{Ÿø)Y ûÙd ˜ „§h´c¿)ÄEï“ëVGaØT˜R@¢~Ÿ:«ý}1k"ÚCÑ™MVy\!µî1Qég‰óA5eyÜÖ{Mš¢qYÕÌEí«#ÂpKèt“ú5ßù:1¾AiƒÊ'ª&ÌåÛ£ý’ᇬmøL·mñ0ç|´·¬‹€ÝÞêØaYTkCmÁO}š%;õÜ5‚ÅV˜VŸ ¡dháªcKrµÙEdL²­ÈH«‡«õ5½Ô,û8ÊÈ8ëo[–³v“ÓD²–$uÞí_Ëùg+^ÚJMÒd Kô€6œEÙÌ^3±hD§$\v>ÌZ26dI´ŽI¸¸uí'°§+Q bî±ÿZ&–ØÄùcVò6—F‹¯/x~YV%T MÝt?Tþ&e9ôü|èÇêG;Zs­³Y©r s*¿!Ño© hJªÅ›¦1à¥Ë¯&Zå°ÒpÕïeâj´|+ùGÉŽ‹·Øy÷å'K¾ä—ª?Ëg6[ ¼Üì@ÿÉ’áFu¾ƒ )!ÐÖü!–•9ѤIÍ 5³Êç8[G){§JÁKÅßFÖ4_Œ™”rÓb«’qõYtwjÕkÒuÛßïÆëpœ{ÐÈÐò½±ÍÀL÷0ȶò Ÿ? Xý¿¯¥ª^Áš‰ÎÕ ÎJ · ïIšPj†d®î匈ŠÛÉ'ÓbÀú Mǽ~°²X l-Ü÷4 ÑOº›)ž~ç ƒYËBª<ÛU;+òYT 3.ƒí”ÒÞ\=ê¬hS¿f%¼Ã‘1X”DA2'¹Ã‘¿~ðSœUàÆlìÏ_W9c°]Y-ÌNrÉ’ÿ¾AK®´ïî¶›iàFIœj}aœ‚;·Ïz„$tÓ< ž6ôI¨FÆŸ1eÕ/ëJg%œøÃ*ü%?æ)â_Öš—áûj+ bø ŽÿMó‡~ endstream endobj 368 0 obj << /Type /Page /Contents 369 0 R /Resources 367 0 R /MediaBox [0 0 612 792] /Parent 325 0 R >> endobj 370 0 obj << /D [368 0 R /XYZ 90 720 null] >> endobj 367 0 obj << /Font << /F51 9 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 371 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/save.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 372 0 R /BBox [0.00000000 0.00000000 178.00000000 262.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 373 0 R >>/XObject << /R8 374 0 R >>>> /Length 375 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hna g6232Õ3SÐ5Ð3¶´01¶PÐ5Ò3·4³4…h°PpÉç Bž¼uendstream endobj 372 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150408) /ModDate (D:20070503150408) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 373 0 obj << /Type /ExtGState /OPM 1 >> endobj 374 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 371 /Height 547 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 371 >> /Length 6057 >> stream xœí;’Ü8E1˜=ŒÛVËì(BcÑ鈱kå”SÆìa´9´Zµ™’Õë™äÀÃÿCðdÞ›Re&Á$ožAüøqëâïXò7¦@n£·Ç#¦/‹ç?þ>>– DÒñpL#©B,ž¯/BZ6ЃÛkÁ4fÙÇ·•óØo°¼PqË>>ïœ|ƃ㱚.9ïÌs<„XðVœ¿0ýðžZÞŠóoÑ"#ÔB¿íx+ÎCEFñG©3/çþ“-Ê-! ¯ÎK6­ë—až ¿.Ë¿åq¾o€êe߯“ËãŒLY¿ŒjÑú¦žó—ÅäÜðüáW=ç›Ûð¼ó5s©åüEç+K&ó•| Ûû§çÚÙÍæ¯Êóõ<…Zqn_Œ~õ~›ê_eþþtù¼vÆürþb:öòÕÿmn¦ïå—õ_ˆgÊ[ˆ3/æ¼sËóåÛñåZ/†×$‹y&Î ÏK9··ûÕâüEeå:+yy¶œ|å|ùS˹ãºÍ9-¤è"‹´ÿ¹|'Îzór‹Îµ«éyóÉJŠœåsHб|mçÎÙ•äÜ\Î[(Á¹å:8o çžå.ç?ü.ÞÞºwQôræñeø—kο.ý.>¾=.9½úX %hÎÿ\WCÿý½vÙý¶õ…þñ!þÓ9ž'Ðô÷ÒuEü¶z¾ä?ðütMK¢Ýó%cççk²Ê-àü|MVùœŸ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pί8çÓö4O³xüƒÚ(ι4zó¶·Q‚󙾄çmTÀù#£™·ìfyz¼ÅWP§<ÎuÞ²8-ÿCuJp¾þ©ç‹ÕÈg©œóEðüˆJË-d T©bÎáùas.Ï¡ð¼Z%œï†ïeÅÁÞD¨oáêùÎùÎùÎùÎùÎùåü¯naÝNÿ&¯£œÃóVzýEÞ$8ÿ·ýa¨F¿ Óó(çð¼‰lÏÁùùçüçüçüçüªâ<ÜD!;äi_1¸þá¦iÈö”*ÎÏóÜühÏ·ÇÁÍ4V ç‘c(ËÓ‚m|¶ æb¸þN5œËNDÓ¼ÑÖunÚºìÒ®ur™ZA®-äïA}hM3:äyÒ­Îz“¹9!»Úÿ7â|÷\˜ }äû¿ggÅŒ Yë[‹,Ïo’Ÿ“£Ùû)êcóõ©3úÖY W花 ‘47ÉNPœ^è®iÏמvÏ4ýšìÇûY3›žÞ”êçBè.EIÏU~á[‘¤¯­JŠsõòJž§97 ÆaËßv0K°3`žáM™žïçÍQ-¯à\ÓMŠ)æ"_ýCpOv±s¨?®gç-úç24浜«B é:·-2òµ¾Y×Ñý§IYpÖ¦ Yþ —ÏÍ"æ•öb/†5¯RçÖ+zǽ”XxË3's.ïÆ² }¸ºPÎ/ÔŸó œó œó œó«ˆóWîèîª|Îay+es"ô?ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8çWÆüç²_hÞö˜»¦\q†öŒù'î è,f÷Üè} å̯9˜îÇIèK®²æ•êɰ¬íÙÝêQ{º 眻®VÖ<¢“:å?¥ÅÑ;ÙkÁ¹ëjq.—èÌ“Œ’pŸ9PsDZíºZ%œË,…Ìîõ|_¥CÞºëjUqn¤ø9ß×:ýÈ-Ï9w]­Ür‹×s=63à9{~ιëj”ÏÕ›Ð9ÔZ…sh@ס“be ­ÒÅGwhÊŠ^¡¾…_¨Wä8ç8ç8çW„ó!f(^×üå.Ú4D„>E£Žq>­ó)ÿå.Ú4B„>Å£ŽsÞ}×6öé/ñiyóåûúWPÏ»GèS"ê8ç݈FÿE¼oO—òÜõ…8¿“çqÎ'f#úGÔòÙŒp<%¢NrÏË•ö¼!çsÓoÈð| Z½ ꆊ\=EL"ê¶œwòÜlFq^Û:½¢7íy;ÎÛZnx¾Ç¬_éöÜuN¹EM~6{æ'›åôeSoÏi¿}Ê5Ú7Dдs«×Óž§87Û…œøX<ïré«??Ÿes‰9ƒ ͻّQçäç³Aó¼w&ڟ픆¢ž«à=žoÇaÌŽiùª›uÝ´”ˆ:'?x¾}|_tæVYQ*PV$msÆÌ»v7WNÏQä\½<ÙscN“$ç‚ö!3p²sîúçºòúhn¹ßówO~îñ’æ3xþ^˜ŸÏ"·ÐIW%æ-7<ÿ%cJxnŸ'}SÕóyî:§^ÑôUY«:\ôöœ–\R¬ÌÏ­þÂx~…ú–¸ç£é(çð¼\àœ_ ò󎺫çWh'º›ç༵À9¿À9¿X9o~¥‘íyxÏ꺟Ž{¡­¢y]:+çÃzn]zÚ/ÇÍÉyû êFžGŒíãyº^QˆìI6V‘çÖ¨:©VÔ5.ò0Æäܺ–oמnÜ¥n&:ùc@Î…Qå<é ÷g;¥­Š<Ÿ­gÙ *fÏ*:›Ρév¿çkô=Šç{`ž¼ÅŒÙøcÔ9b@ÏI¡Äh½°cîèy-ç*þo$™ã¹“§ÐÂ7ÍDò<ÅyÑ${_äyè*T\ô:0ç“°|uN>½=÷•ͲâzœVë\ßs(ê[Z õŠüçü:Ú_±¯.îyežº¶çµýûꮞƒóÖçübå\]o(ûšH¨-‚ö6×½Ïu,ª®ë´á-¬œËãdö\íÕ¨ÞÒVc­õÎ'ç²jƒ›s³~\î›Ô¤L£yžWß’Ý6'k!…˜‡ñ|¯üTË»{žU¯˜Ý6'kÂèÏùxô9y‹Qƒo`0žçGê϶¹ÆU¤çÐÙ|åzNÂ,­^õü<àù÷4[+ð{îrN+Í·W¦çWæ\ÛómáÌï¹á¥* šµç3=†ótçÊs§m® ç¦ç&çêFñ<«‹/oñµÍÉ#æ?‡Z¿½ýyRås]ZÀó¼~\Žçþ¶¹ýP{•·ÅäÁ¼5ÏE÷¸m.Ô·ð뮞ƒóÖçüçüçüçüçüêÐNÔb¥]wm›ã7×ÞóÝÝ µÍ]~Üœ§ŽKWµ¨:®¡±ÈZA´¹Òö\8˜çì¶9zrm'†öPÚ6G ²¾²­ó=79WG`{~Žõoñå-¾¶9Z¼™=÷zÏ¡'yNy Gàðr’Zõãr<´Í©ahÆ[+?7·ô|[<~Ûê[Z õŠüçüçüçüçüçüçübn'ʹ³։]¶ñüü+OSÌí¡ã{Îà>ó¸¹:σjæyÞî‰yÜÜž*«ó¬•Å^_=©Vz]‡ã/(Ïó=¡*ÕèÁs«Âvß—?oÃó¶ãæ¬Æ wåöž«–ògßÙêÍÑ·…FÍ4nŽxnc/DÒsÇü6 kŸòèLÏ/“Ÿ—Îi©~âúti5ƱžCouÏ›Ž›sþØeE²°¨¬¹Oî£Ü˜SV$†ë.-çª[}‹?³(Tb7Ô·šDKÏÑ_ÖóS8oT¾«çW¨?¿›çW¨?¿›ç༵À9¿À9¿l'*P–çÆ>ÝK+]Û¢®ÿOÖ€í¡*öÜs%6¢çW7w7Ï›Ž›#5'Þ ”¶ÑKÏ÷ö@Y“"ÍöM¡Ôzúé q›3šçW'åyNÛ±œÖ[šëµŠ¯*êÆÍÑŸ0˵?­·÷9QÏzû&ñUEÝ|Ü\wÏõ.' ÊóÖãæúzN-7jχò¼õ¸¹–ÇTì9Ù!‰g8Ï›ßo®×9”šHOöVóßçÐÖ÷›ëWVÂèÔ±5ÙÍÚóqÊŠOZßrN¶² õŠuõœ·8ç8ç8ç8ç8çW‡v¢†Ww5žG $vb¼ôRy­ÊßÚ²Ö×suu](æqs¢mÁ÷®žŸ1n®Õð´<ÏÍ Zå3ÓœaÚg0¢}¥­÷²qOÈ!vUÇÁ=nÎüŽª´mΣ>R{üAà¿ GÛ…s­?µÍµ:–´ûÛõåö©Å Üÿì¬Ù)?x¾¦…Úæ8󖣞ëñ¬9çÆQÒ¡Îƹ¬ž·7çC½jÚæynüéÇyqÛÜ@çPÃó¼s¨õñœ—·Í±çç±²"ÝX^YÑúx§ü¼£P߯»z~sΧý¹ÍC–À9¿žžóçüçüçübn'ªŠ1ÜÖ´Í¢´(r4ñF;æöКU#—{-=/"üÄê¨ãæžÛóÆãæ‚©jjjÉI­ªžiØ67ÑuBýµuÔBOÈIVÊk´ã7N•;ÔUe¤öç¹ms³S·h¯cŽpWʬpä7H¥Ç%DSÏgåi²þ\ º¶ÜX…Ä%ŒA0™ëüãæ©zf=i–ç¯tá¡v"–ïDÊs½R¡ç¨O¹ßœ7•½0~%ž¿Gï •ôœŒ¥ÂÝk˜sAŠ=7£>å~s¾TûØ ó–ý·©_‘­< ê¹›õYq¹™J½ç¨O7çOµ]RGN´Õžg¶Íé=¦Î¡¾'{»‡nΛJö¨§–ÜZÇr<ßNBê…áyfÛœÌÏåm’ÃeE×ÙnŽçþ¨/Sßó|4¥=¿H½â#jù¬’ˆÐ§DÔlœ×5‘5ðE£Žq¤çÐIçüçüŠ–[P´08D„>Å‹°Ñòy½þХޡOñ¨ãœ«½/â{Å®¿T|FˆïdgÆ¥„«ÃZª xUAÔqÎ?©PÞ?>SÕ!¼Z>ö]n!ÏóÚ-Õ{^uçËÆÞEçñ}û´¶©,úž±…ÃZª X’u’óeS¿Ì~Ùªöü—ø]¬ñçx~$BKÇ<Ï:Áùv<‚ßs±ÅŸöüX„–ŽzžuœóWYMÐÁóµTòšòü`„–Ž{žu‚óŸb+kvð|)~Js~,BKÇ=ω:™ŸoÇÄîù{^~~$BKG=Ï‹:£Üòs}Ãêù»Üa^¹¥>BKÇ<Ï:«|þSÔzþž^Éѧ/ïB—»óÊçµZª xUAԙס?ë<¯:‚Gôäê2÷:´.BKu¯*ˆ:Yné­t¹eDÕs>ÂÅ=!BŸª9‡NÚ‰øÎùÎùÎùÎùÎùÎùÎùÎùáü÷ŽaÝPº> Â9äŠ ‰rÏ›Éôœsœó œó œó œó œó œó«9ç×½be£ª9ç—õüm¾€8¿f.Ä8Gà œÃó‚]sþ]sþ]õá<6«râ“­&ÍZôDœo“]Ö¹~Ïù9Ÿô„¿ÅªôÜ,ÍÊhŸ‡s:­ðMi/'T%©öMùJ7˜çË- Ïí·ÏŠ.ç“0óñês¨1 ±»ç=¯C­9ÜÝü|Ö·®9TVôë‰8FOÅù çüçüçüº6çõBôÕ…9¿ªåæJ ý¸øÎùÎùÎùÎùÎùÎùÕóQš ©îœ_ÛóÄÝ*ü€ó!ïÍ—§:[àüÉ=çeçüçüçüçü…óýní¹=}öhß«cé–;šFá¼Ðš§÷¼ çõžOºoœgƒ7õ¼)çt°JØ/ÀÖ1‘v7§Ÿ•ÝÓhœÓζF½žÛŸÕãŠÆÒ0œ¯­®âéLÏ#ÝÍGÒpœ—y® W]ÊŸÄó–ù9< œÑpœ[ÃQ’Âyh(Ëhs:X¥Ôsç³7.+¢¾¥L£p~ €Ë œó œó œó œó œó œó œó œó벜z#ç,]“óK[~MΟPÝ9Bs~s~s~s~s~s~es~Ù©pFTç°¼¥²8‡NR„sè$s~s~s~s~s~s~s~s~s~s~s~s~¥8·îäS5àH«‘çܹ£­ënÍ]±ž\qιUüžCEJp® ¥w)ê¶µb»…­5È€i‡R"?—ùJøöµž™@F½<’’å–ýÖÌz¾5¦?0VFù|CwÑιz¹¦ÂóRå”ÏÉDæKùÏ‹”Yn yœe +³|ž…çIå^‡†ÊŠBù.rfê[zõŠüçüçüçüçüçüŠr~í{7 %:©D”sxÞJƽ»œ_xΑd‡KpÏ›ÈöœŸ/pÎ/pÎ/pÎ/pί*Îíe¤5–^¯1›Kª8?Ïsó£Oâyç‘#)ê¯hõp6}SË«8§ ûúfYêîkò¤ZIçýýìt¨£·LØÒö͉PºÑ)OÝ0j¢Iò[¸·j%çV× Ú!À×wÎí1Z1cCY=®äyçêh6ØÍŧ™&Û=ëÜ…FþOWŒmˆ¤¹IvÊ€ªàÜðÂêRõ|ígðÜHÓ¯É~¼Ÿ5³9¹ Ýø€:ƹVס(žbvjÃtšñÚú¡¤8W/¯äyšsÃ`a¶üm³;æÞt‘éùöÖò Î5ÝÂ잨øê‚{²‹Cýét=;oÑ?—¡1¯å\u~¾/2ª¬¨VX×ѽ§IYpÖ¦ 5>#XVt<7‹˜Wòü„úûØ‹½8bވƟ[¯èÛRbÃÑÁ1Cg:™sù{7–•¸àÛ@ɧç#ߨIºuý¹3 u ݹþ\^%fú­9Twæ|Ts~q~í›Ú ¤|Îay+es"ô?ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç—Ãù?{GtýÏæü¿½#º¿þ…üœ]ÈÏù…r ¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿28ÿ=k¿Ò«ÑM"Éà<ûï'?ºI$YœgBsú¯›D’Åù-ŽtœHÀ9$àœ?pÎ 8礜s5‡ùÞ~Sí‘lsü‰È¬glžïû·çl‹GRʹž …LDÙ~SIÏ9þlîyçšnwÒ1nÏ…ÈsQ*’BΣˆuáܘäXÎ-Û‰s{ʼ@$…œ›‡kÖ/o1&BfŒÄôÜ™’9ÉΩÊxÏ¡Î<¹ä‡Ççùþ^ÿì9TÛs>DÞ¢&·Ô³fvã\ÍoºEŠäP~ÞùjqNR:{ž(?+·ŒRV¼šç‡Êç}®‰ÂçоžgŸC]‡RÓûx.'9soÎóËŠ¨oáŽDsþççϨWäˆdáüáôƒó?ï>ƒs†Hœ<žÖ¼Eˆ7pÎÉô÷úôÛêùäç‘,ù¹ØÏ åô#½E$9œgoþô#½G$è—Ë/ôËå8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç—Ãù·Þ=,ÎßzÇó29ÿãÂyPo±TÈ£¸eŠóØ¢_ äèCÄ-Û9ÿø|<6ðNÅÃ÷x‹:ºrþýÚž·¤à”°ìÁ9Ä­ÿ†—jÇendstream endobj 375 0 obj 72 endobj 378 0 obj << /Length 1904 /Filter /FlateDecode >> stream xÚíX[oÛ6~ï¯ÈÛ( ÖDQÔe{ZÓ´è°K†®Œ-ÇjdÑÓ%™ÿýÎ…”e[iÚ—= bŠ<<<×ïR^Dð'/Šè"S*,’,»Xn_Enúá•t£P,¦$¯o_}ÿVË …ETÈ‹Ûõ“ÛÕGqµ1»@о R´ÁB)%ÔÁ"Iñ¾ â–Z³ì+Û‹8Ï"-’8øtûó«ëÛñ`Ç/‰†$/É&“,L£(¾Hó$”*Ñ$a]5 É×|Q$úéyT¹ßP´¥}")–H_ôípT¶n«õ,JÙ:õaÈÛ{O[¹ƒÍÉìtlš »õÜhvØâÿ;4×x. ±AqjųŽÍ VZHJ±_PŽ4ÝÖÔ5«ñTö¾l„… ¾[4UB3¡mù,,´JEÄßýТ%;¦­ü‡koa0¬C[:NERñpiIwŒ•ºd ê}'‚ÎÐâjTt²]ÕÜ»cÝÌœ–µA›ßãq*!áç1Щ0õÀ2áÌSEFKoÍC@&£ùšlRvn_ÕUwõa ùHä ïîÙ÷›É'Qíy¢Ûoë¢{2Ï̵Z•MˆŠ@è&ÓÐ]hº¡L’œÔ»ùd©ø)ˆÑ>R\'‹_sý‹crÿ#©‰n)ú`±*û1Lɬ½K ¤ ¨NâTlÙæ+¯_Íë{&WnƒeúIþð†gö„ó¶­‘¼ÅR¼ïy?‹†çu=G¬É”Ž®áß ²Ú/æBaçÍ rjXòð B¢Yq´v»ÑqHZq×~Ñ,Ù&™‰b”‚_iu×Ú;ÌrŠ“=óE½ló]Ï#Ø”î4‚Œ”Mb‡eRnÜ ŠAØËȶµ‚qf´¬ÖL½'›’P™èz2ýž¿ÐVHr=«V¥i¹×Ôâ-)ØòâÖrò)ÖvŒÓW¤(¯n;ôüÍgÉ'Â:¢Z•5­\"à€‰Ù>§U`„oÆa”k0Ó´<)#ÝbJø¥z0Ò=W±rþùø›E¥¸r@¶¬«1Œw~Â2ê÷h¡ý§K^EÖÆ’TÙ©’*KB ’LEŸ)wžì%ÏØ¡†óÇiXh@–#ˆù£jûbÿ pMq$çˆMòx„?VÂJ`†ºgÒ9ÉÉ”TÃpÜ–»¶äˆàêäNa,‚AcúàÅm~¬Ê'­[(*sIÒxñÞCgxqqÜùZd(AʯÂ䂘h ¾ÿ\âÏ’râ±üó¡::¡S!ÏÁ±â³7 °yte I欦•°kþe|ïž!Â;Ü0Żʃ‚q\ÏM±È¡I{WrÁîæ ÂÙ^äXb b·‚_Uçò£o+Ä„8‰Hz\ónÀ¹Ó³!‡b(p$x¬òóæÊñ:?ÿÎ Ž'ÀG5oV lJå3Yˆ×®Œ'q;Ö†Ú¬þ¸úŒujt£ŸK:ŒCÁ»qRDËúûá|R5yŠ-x2™šÒ#qSœX24ûš!Ë®¤Òƒ˜¶yO0ÇJë0»®–¼ÿÔþ<;)K‡_nxqÏ$˜ÜuÓpXÕ@¿—`S*?¨¿›±=‰A–‹̸â¤&‘‚ã]Ë­á3Yƒ$3Yƒ }—J KwÈW8m:žuË8ôn ugâßy–AŸÎûÇG]¹ë}húãN‘°Ç;æ+×z®øêpp¤ëÝ%Ƈ˜ü†þñÊ6®€áOFCKØVo·ŒÿÓ L:Ž8Uàì¹Í°PÚ¹K1+yáØ83—"¨Öéµ´crê\a½jf;nV³í©ÜÞ»;“×í²g,¡«†{sžòøåíŽ)2èRê0Ž¢ä8ÒßPU6O,ð ¦N”ßzMŠ2¶1ô{}kk7ûäï§ÜóM.°œBTr`¡ö®A‰ò“gœKŒ‡”ÄÿVÁõ)tð¯÷¼F¹—!GË­ fËEvT.PƒúÝ¿˜¶ãI.j¹¿ó/6&ÈÈ÷mñitáÌYtQmU’Bz¾áö³b4£Õ¡4Aäø__V¸N¯vþa ÷ñ7[ ø±jÞø( «¥©O‚óP-?«ô‡¡—iSNJÃßTJzÛV#¯39¥ø`c›òk[vª$(@ß[—«Ê7ÈÛªã;ÛDî)$ÜTªrÇø ƒn¨š oFD‡…’ÚÑïLs€œQÑ,†Z¨’4v÷“"Ì ¼ó¤*,âHÑVâ®ÃR‰(É噼uÏ÷É=ÎÚïr>7(jÀ²s¢aH¡Œs>€ê ‚våE|ú®›³.¬HR§Ò™ïúcæºH槇ÁšñÃEJ¤&7ùÈù¤·>tay•fñp!öÎ7Ÿ½ã䳓V YWcºò[,Rñ“ ]bÔ‡wÒ˜ûÌÂE®Ã¬q”‹Á!¢–þvÜ–Æ¿~AšÅÃ!7¸¸Xw>CL$³îB~"¿»X·öžªíֽϸ»õ¿Eÿ endstream endobj 377 0 obj << /Type /Page /Contents 378 0 R /Resources 376 0 R /MediaBox [0 0 612 792] /Parent 382 0 R /Annots [ 380 0 R ] >> endobj 380 0 obj << /Type /Annot /Border [0 0 0] /Rect [147.6002 559.3583 374.555 570.2673] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 379 0 obj << /D [377 0 R /XYZ 90 720 null] >> endobj 381 0 obj << /D [377 0 R /XYZ 90 125.3011 null] >> endobj 376 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 385 0 obj << /Length 1887 /Filter /FlateDecode >> stream xÚ­XÛŽÛ6}÷Wø-2)¼ŠR›&‹¤¶E\E Z[^+‘¥¬­›¿ï\H]6Úhƒ¼äpHΜ9œ!%×þä:k§u’çÖ»ÓJxñÇ•ô­4â©ÊÛÕ³—V®¥Hr‘Ëõö0[d»=?wõå&–Q·‰µÖ‘þac¢WÍFe0Ô»¾j›M¬2'ldôæýöõêÅvØØ*õˆiŸFãŒVëX«­”Hlª^P¯ÞN“î°d<]“2¯^»$w‚è°3¨¥àù¢Ùh'ˆrÇ£ÆJ—˜”Súw3v²&;ÃRA´¬uYëD®9ÚKÁv‰B#â ìmç˜WíÑYÚŽQ^"˜S`—Už=×?/f;•+B…¸ÁÒÒ÷-;Äš¦Ñïƒ|îá4ÔåH£âÌí¬ÍQIdóÓ.±®÷2ò„2à§SfNãÇkÀg¾oÔ²4É•r‹µLç9•(Ntݸ{+Ý\N!›¾:°î˜` ó Mƒ„Ê~IJ[Õù̲ÇÝP€¸Îmþ?ý¸T´E{ï”{Êi·l@ÁbÊ—aj>·‰³"¿«GjiýŒNR ÜfËžÍncAµ^òB§‰5çì"[R›(íÝu”ÌrÒ#üÍ“q1œ„kW6XIIó/¿¹šÑ_&2 é5^2pP.X÷„—b&çíùXr µoVGWe{¢âRx/¬s©êÚ·˜ù8׊±Ì@{z‚p#ÉÍsO¡ÞÝžý†#Qï{ÚÊRzìr™dP~ça¤ÛÁ?ºYž%™¤±L6{Ú ,¿°è€—ð…T/GdAFuÆÆ@§j†«Hû‘Jêž(ð 0l¢Ä ²ÎçÑݰp%ä`¶g¾0Þ<†Ëâ™;E祷rôPšjj¾4b¶Ò\“cNH~ÎǪñå:t›€™ã¬ç«ð®Ð¸ dÞ¯>l}k) 8Ðù9rp$¿ f±9Ð}‹m†˜žùð-äM­†HÞÃ]Úg¼]ò%™~“¥SŠÏ¨'ЛŽ)D¶F×ÜÔ:`¡,ùÌ‚öæC‰‡yÇwmÌôV.—¤B<¸Poèr’À*¹Yà?5%v&.a·& …k->y–Ô5Oï8^tÚ;?mú|úÒ*žWø©•aµ 8 ¬åË=²ªã*ºÛ.ù9…ŠXIÉç{Ïib$¥FHÅݬl¢ãÍÎWN>,;†ˆø«/ûÝ"iã‘Wî^'æGô écÏÚŒh›ðlðľ%&·§ÿ@aJ”a`rpÛÈëë+¿aá4“Cw7Ð}®è%S0¤÷çžu¦©ùS'ÞwŸY•’Ôƒ>IXß·wd!·/mWïßôŒ‚׸GŽR;‹=£lt #×Wo¸j+*,@‡*†¯= ¨0ãÄŽvè½S(DøXËŸ+”ÍßàOñk lÔ/ãù©H¦ë’¾bhúòÒìùˆ-^žÐ¡Üwô(ÜQ}ºá<]á(îÆjc’1‹‰*N3ý6~2ó)hÌaé”ÅÜ™è8ÿ®àltjÇ·òž•øcK™ åèFGwèTT±±Aì«¢æe¦…¾ÂìGNãp†?Gàí:üÒô”†‘… ÎŽ–5ãíkÁåGv†ãÕ•5€?~óo÷ÇÓ?ßë}¸±â£ò_± Ç endstream endobj 384 0 obj << /Type /Page /Contents 385 0 R /Resources 383 0 R /MediaBox [0 0 612 792] /Parent 382 0 R >> endobj 386 0 obj << /D [384 0 R /XYZ 90 720 null] >> endobj 387 0 obj << /D [384 0 R /XYZ 90 684.1345 null] >> endobj 383 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F14 125 0 R /F3 128 0 R /F52 26 0 R >> /XObject << /Im16 371 0 R >> /ProcSet [ /PDF /Text ] >> endobj 390 0 obj << /Length 2877 /Filter /FlateDecode >> stream xÚÅZmÛ¸þž_±ýP¬ ¬UQ¢ÞRà€»¢]ä ÁeÈP®MÛjlÉäuè1’l¥MRŠVÔpHgÎ euÁŸº)£›Â°Íñ謽íÀ^Ϲ*ØG’E`Z’¤A1ÏL"wO¢ D™ÂÞÖé4Öiö6€\[¯žy°Ç*Nd?Aš–RËÝ¡¼6 Hæ ÂÓƒtf0µX".'E"n~ŒÜÂÝà±wÈEé÷ö«P›Ð¢ïï_±ëjsìv(ûïÜlô€ÆbwÐôû{˜öÓZӑư=rmxò–¹*‚yÈãÔ’ZŠÛŽÇ ãÔÛÛC6í­ç• !4‡£_²·²è[1Ý,Ö&Žb?x'ÚÜîÖ=wlÓC÷ÞäÝ;ð†msÿúòAgÜ­È ”‘Xñ6b¸‘Ѿ.ÍZlâ @M0#N_{KìóQ²µ0˜Úž¹£b·Û0D_R´jåÐq'.‡¦}þ3ÂwÊ=Ç–2bп&ß3£43¡†'rñ(‰xñ$Ê!g²L0üþ®úìÝΑI¦ã'º2Kénìi­LhH èŒ#mÍæ—,m+ÓcÆE“ŒCNG(å>¯–€ñB]f…xÒÙ¬gÃ8Ë2a㸻Lò(̳DO)žÎRÊ„7méãRàR³Ã|Â亀±7Ÿ¼ØÀpå1™ëêp!Ž¡ShúÑ‹å6ǧá÷3­´f¯-ƒk;Ÿ“Ö´ 0Žbw|´@' ¾Ó;lö’J6Ws/¹øªsq ™HNtºNNlW™ß§¨@½Þ3 §=ãóiá–ä<J p„dâ8W”AÇr&f2§kËÅyv½,µ“$<ždQŽ°Ô…¼Nšpßt–»ªþЉžçnÖ‰B-ȇ¨§À™´l…×#»3ÀÔÕ™Y: Îi°møÉÁ6s(‘^È`ö–›{2·ž‡wuìeVÆ%mE÷3/§—R*¼ç$ÅN<ˆÔ7è½]~´#…vß%ÞÿÞÁ2$¿…S#~\Ãó,AÅca[ùs_§kq¦¼1iΉ½±·êyBt×ÄÍŒï`Ì»7Üg”xú ¢¼Úp×3—'ž‚§Aö•Sò…ä²€ô¨¼ ´¶Uí‹ô¤ÈÜù†– ·ÚW+³çŽGLg±A'k¦NP% …*ÅÃÿkÖ<ãBA2E\AUƒÇ*rNâ´ðZË©¿CO šëõ‚cSéïp@;-„ù5÷†õR•Y˜ —ÒiüÔœZ9:`ï,ejгâ¤÷àÌ‹4Î ’I]äÝ0ƒ3,Ò×Md%ÀØi?Låƒ:Ò1æy ›ÔELjÁ¾Š²Ž8øÇœÚ“¬³<ÎÆj‡ÀꨓëCßôÕfÃßÃQ‰:[eaTøòïVªX©fg%Š“0Ê¢A âþxâ—t÷Ó·R §Ñ¹q<^.GBm«Y™â(U^º”ã6”=k°r¡•³0KóÔ¹ö4Y~é¡™víȰ£ÀŠP²KÒÔÙ‚{ä e˜öò“ý'4ÞŽªBY“í×w<Ò$lSVo*áú0w²·-I ìÐWçxZ %—sQ9U”ЃØÃ©×ü:$"Ú§}”<´„‘JuÕ :ž­AµìÆrp"ýTö|!Õ€¸VÝÚÙ2Òg^:J câg^¸åæeÂ¥#Iʦy ²V2 Rwå Ù¶¯­.#ebñpƒœÕWR_D6œ£mÏÜmæBé¨î‚*a¦WBœûÃ)Àj.ª*¥Ã"K&I÷ò¢Èš98º óÄ™ë¸_”÷1íLÏ­!ÒÃ1Âxƒl«S;*•ðÌ01—ÔeÁH†Îa{è…ÎëZæò™S2 ‹|×PD|üµÎ&w¬ðÊ1[r[Ïü2ÄMñ^ëtÚíøÊ'c)¢¾\]3ý蕱’Êdt•ý¨¢çÉZ“Übf‹”iè¤üb¦ø“8þ¦D㎅T‰³Ö#÷¦Á9ùÈ ô™â‘ÈWŽ©·A’Êó²žýo,±ÄwÈ#©0;'ç¼ÝÝI$ƒL*-/ªbrMNã„™`}òyþš?[=z;§¿¿t ðÈ3öKÊ-€0‘Û8wR§Ww®Áh$¦w"P†¤G÷Y`ùË‹¬ù Çì¥l+%ÅpÅ”D” ([êê[¡ðÓ˃ªuç¦èwÃdÔ5µhz̹›*cèzª¼}¨r#³pà¾ãÈ&ÕRéKÍ‚ª/Vˆ8ƒôµ$\C$|ýù¡$AH-“Þ^Œ¸2ª̾k˜B VVRìnrùдã*.qðƾ0æáôù-»6´bÇC&ßCfC<ÝxPÙñ-µbÓõ ÌݸÔý½c…¯„Rð Xuÿ•K!+úpÌŒs¹ޤ›µB¾e"ãj|sq+Ë`ÜÀ$#R`Â[¹,Ðe¯e˜;Ó8¢°µx͵eYrî(y„ƒ2®+~¤— (n_.¨ß_Q¤\s‚(Þ65â!¸ôø7âEMG‘€Tµ“ãI·Ó;RK/(”S|?Õø ª.$W±EhÄ÷(³¨V%z9:Â*–ôË•rHij*Á“<øñòÆTÆ7×7:´ û³Ý/ÍpI§ÔÌÕ0Wûï^Îm©eÏAú>ñïðæŸ¿d“µ©2A"åºBÀãÂin˜êƒòÖ)©{öOÍ'~ívôÅó(CžF·´.¯Ÿñ÷Úín â5{k¡|ב?.É&º;÷3‰ÿÍOŽ endstream endobj 389 0 obj << /Type /Page /Contents 390 0 R /Resources 388 0 R /MediaBox [0 0 612 792] /Parent 382 0 R >> endobj 391 0 obj << /D [389 0 R /XYZ 90 720 null] >> endobj 388 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 392 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/command.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 393 0 R /BBox [0.00000000 0.00000000 216.00000000 106.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 394 0 R >>/XObject << /R8 395 0 R >>>> /Length 396 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`dh–R0403Õ32tôÌ-Í,!ª,\ò¹ôú2endstream endobj 393 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150401) /ModDate (D:20070503150401) /Title (blah-000.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 394 0 obj << /Type /ExtGState /OPM 1 >> endobj 395 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 450 /Height 222 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 450 /Colors 3 >> /Length 2179 >> stream xœíÝ1rÓL€aqZW´œ€‚Š&ànÒ¸àä4T9AZ*ÎóëGd#˲$ûÛ•%ùyfØIŒYK™ÉÇkÙwïê_þü)±õËËËóóóããc‰ÍF•žBõþ_¿~}£õç?~̸ÖG_o›N ûþV«Õ:¼–žBõþ?~üø7FÓ­yGuú{ ûÎS”›BõΟ>}êÖhÞǨ^OÀ n¥èê¯Ñf¾Z­V«õÜÚž–ý5º„£´Z­Öe®íëŸÏ5ZÏ× °j½Ó²¿FëùZè]P+µÛíz§åÙÍõ.¨æÁnþ¾«ÕzŸk=>þDñÝš1šn™T£/á×¶ž½R\î9ß»”rM¡öÓô—Kk4~ñ}€ûñüúžù,sãt Míçé驽OêËùj4øµhŸjûd–¯9òu3,J®ëBõwè”oÏöÝš}ÖT£i€6ç°º©´º†E™¡F'ŽÑªõ¼¦=AëšJë:ZX¦…Ôhõú½¼¦2ƒzŸì§?ØùàÒûLÜÿÜio>°0@}uá×btŒ¶ïpúqu2é®»Ïðþñ»Ã6X£—þPS{~OÿZ\4C«±YvÝÇçîÜC_‚0:á £vÑ“¼¥ÔèÄGíÜùÒ½zŒfœ¡¿0†gèðou64LaºáKCfth,«F/£íÇÎU£3¤èE£v4E§ŸÐ6¥F§?á[PŽ>dGýØYjôÜÌÊ>"¯HÎ1:Z©À€ÑmºŽí=ôaWÔhÕ7¼ª¬³2øñèÝ¦ì ›R`Ó/.¥F¯yßh£·L;¿UâÂèÓÉ›¢Îueï=`Ø_©œƒŸ©.â}£GG_åûZ÷Cƒ.¢F޾R£ÀåJ×èôÔ(°>¥k´1q˜ªQ`•ŠÖèÕû\S£Í]§ü£ëã_7ÿ?Q­VëŠÖ4û²ì–k ÕhóGõçíùš~ )(}Q¦Ë8:rmÕ®ÑölýŒ><5 4Ö2F Öèu#OµŒÑªPž›¡§“T½¦_6ì½¥w8 ¿TsÎ jtx†vNC½‚ctâý§˜»F›ÑVýn§#/Ig¢F^k4%×éU_Šu¸6 ¬R®1Úþ zy:> stream xÚ­Ûnã6ö=_á·ÒÀXIQwŸºi´˜ÝÎb ³ó ØŠ­‰d¥’(%.Ì}BÀŽ’©mŒ·£R°˜eléyJØ®D™i“Áã&ÞÒ¼Æu%rX‘äÌ4ˆS†½_g‰"c‘0Ô(Dð·ßà¡«·¼&Hoቿå39¶9ñ\Ì7QâèÝëµµ‚ñ%‰vÈ‘¦­™¨h^pÚXq¦q‹²Ù}éμßÜ|*Ûþõ‰ïaÜæ€`Ó²’ŽTÞ%ÁLŸ4Ê ýªhj²”²8ça÷äòLýH5ÈzoÁ”Ÿ R|ûêñ2¦žŽåç¢íðíEžâÑ›O„Ú_d­ÒÌZ¥€µWñ-/NxâY«ôŒµ0EÖz'KpLYKö™#‘°Aš‚ü,sƒÕ’ÏÒ›‡‚×B,b³ïʾ$?É› â Þe”k£x—´d”0¬I8€Øöƒò .gªˤ"tš„ ΈŸ·”˜ãûò¸kÎÏy|úõ ëLrÝ5è†Ïƒ'M‚—™’< żzpÙù lãâL­ˆ—_ $~JM –}ù–S—ÛÛ†£IN4±÷·”qà£5ËÖƒ:ÏÕÓ*Ÿl›vÇs–&Ü'¡÷ŽpJ޾˜ñÌ^„Å4Æ«,¾É*‹15÷ù±¨: ÅJ¼m&!Ž£wðFƒxB-îU€QË`ÈÞðdå‚6èu×SâŰÖ>‹0bboÍ1¼`ˆ4Î'ÖÂ5. Î*È3#¤j.oHMMšj"[Gˆ„[Kµ¸f>¥â’¼Z]sò$òn­1ž‚Ç$Ì«%õ@®ºHªŒÁ#ÄÝKØ+ÑeƒáºfÍÛ=§ugþÂ=)ŠGŒ‘Yι"æ²”#xâóàúQÚìÓçœ?¬­˜wz¸£ˆ °ïá­#¿5ƒNJÚ3Ê2Ye‘KÓ„HL]ÇYºŠ#í2Î韛$Q‘JœY%±‰@O– ¿_|ø¯vPZüzá/Ÿ±Îˆ¤sjU_¨82™IÃBuñŸ‹ÕÇr3…I%ˆ^ÙÈÙ˜:ø‘Ñ.!:®uÌÑ4÷9dµK£Ô½"²S˜„쌙 Â‘VV¶N[öÆå’¦€ngÚ®6¶¿áH}äØPõƒY9Ðm9gs‡P²« —Z,gÚU °ŒÇ>D’ÚÀ‚bŽï[öËß…må°îÀÉè¸Ü!§ˆ›¾}… M[þm†5§ùÝXÒÁ#½S$T¨.ÜÍÝ^ÊnoxÅVüwiÒo¬¥¶T;Á Ø•=“Š?ü*ƒg-BZY«¿hÊ‚g°N¯´Å‹Êýu@n¦0ŸÄäeÐIɯÄä ¢e^×äSsPNEÖ¤ášê4}ÞÀªŒšY³ :ô·è½PKÒ&Ü?§²XTåUíX…:ö xmÅjKÁÈoœ°Â>§da*vQ‚)ÆÌÂÆБ.êŒ6Q&ý¢Î@°‰¬’n¥S<­^Á‰ 7S˜Otf|Ù€³Ïì78ÑÉ ®/ѯŠìæS­‘ œsè¿Û$3îKZ£“™Òœ±wAr¢\Ja›èÔ†|›Z>®†3 Q_ÆàœË^öA}•”KaŸ5.ucµ1KÝ WmIZ³†¿Ï¸uÞ<òa‡•8(°2‘NãäQ닼¦ÜcN“CNñÅ—=“Ä/åq¡ˆ¡—ÿà tÒRhöwóP0L~@QP¸ßqñJÅY”MŠñý/µ´«P¡¥ÆdœD.IÈYSò€tþ\îOÄ&~rF)dL­S)Þˆÿå,òHRÇj.º(„"%#4o|äÃ?©}E’ôœ“óë.‚º;ÑNü jº¼*ÿÌ}¶ËŽ¿TïÆâŽÚ ;^£2@†!9)®çúöêq&@÷)ÚMïx,Âòã¶Ÿ ÍB—úb9î½m$³t¦:(Ø>ðH±}I¯Ü´‚϶h©T‚I ÜßÙ£“©k*¡áx8ÃÖ§܆ŠÅ‘¹¯üIw<a‡˜'ÑDèõª«Íi¾;9Sä]É=9­ó»§T†eŠ1ÉsçO¸™©±RêÍÉä#Ä×ÁÌ©pÄô£áÝ3¡Ø¶¾Á +9÷z1½¡“‡"ØÄq¹çq9¾Qbg ˆQU[x@­ì[*þNcÛi³»âV¥oq}{c² êÕÎÕ[i+n‹¼?ù7ðÔ„9¼À]{Qûúæ\rÏž´ø°×“n/†Îîßüày2ü¡!-þVB°÷Eh2à«7KIæàâ ÷=ø€¤ fLî“mRòÎ Y¿ï‚G€•î4üÈ‘Nk±tòë‡]AH =1êÅWüé!|Iac±ÕëdˆNÃçOîûT !NCA…í[l5ôïKh'~X+$o!ÔÁE¨ÂB¨#Aö=ÿÎc0§çJ%K rkù( 1{—"n%¿Ñ(õ=j1Ü*¨ÜÓçÂmôŒ ²“vü'Cóp¨Ð r&¹{¡`H·¸"Â1{ÂŽ'9{ó•5V–”¯”­œy–ØÈb4cÙ-ñwÐ$ˆR>Ü&Ñøðºø ¶;ÄÚÿúÁæD endstream endobj 398 0 obj << /Type /Page /Contents 399 0 R /Resources 397 0 R /MediaBox [0 0 612 792] /Parent 382 0 R >> endobj 400 0 obj << /D [398 0 R /XYZ 90 720 null] >> endobj 273 0 obj << /D [398 0 R /XYZ 90 431.4867 null] >> endobj 401 0 obj << /D [398 0 R /XYZ 90 332.786 null] >> endobj 397 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F72 6 0 R /F14 125 0 R /F3 128 0 R >> /XObject << /Im17 392 0 R >> /ProcSet [ /PDF /Text ] >> endobj 404 0 obj << /Length 3326 /Filter /FlateDecode >> stream xÚÅZY“ÛÆ~ß_ÁЦDs$OŽ-»d[V"mU*QT,‰%a‘€»’}ú\ì¡Ä•ÔV-€9zzzº¿>†jÁŸZdÑÂfÖ¹ÅúpIó‡ %o+±ùóåž‹ÕBEaejqy=!r¹y|³ËKtÅr¥‚f¹2ÆæË•µ6xY-u ]M¾îʺZ®tê¢8°Éòýå/.û…c­c ‡<Æ›Š,tÛE’ÚPƒ?×Í!ß—¿æÌ‚¢ lñ©‚œǦ>o.(šþÌÍÝö•w2ôˆ»Ü—MÕAWs{‘¯—0sÇ„·$…úÀ}-~Ǽ!:Ôµ‡×ÏËÔár•X\î ”lÄŽ7blÆYœÂÖi ¯ß¼úú'œÿæÿ_^à´ÅÊ$6ŒM–.VÊ„*ŽøL¾ñúÕÇÀÀKxy³tIðwYh"±$ Mfœ¬s…œÖ(‚[œÚú3Õ làŸ‘2´¡5þï–´?–SÁïU$8"ǽ–¿Ò+ŽfHt€‚ì%N+x©co}Íëuy³-:nób¡YàËÛ¡Hš‚EÂý…DgåU{íÇ"1²Š5Rëóg°Ü]ÆfðT¢©ªKLTÛ¢eg°ŠM¼ÄSHâàK€á–XlÁ=§¶¸>¡`TsÅÃG>†9õw¼³6ÿk\‡P Ëüëk&tÿ/«1÷ˆ†0fE)2ìxr’•ƒ%hÚØyãi‚7¥ÑkŽQ¢`S󓆂³NßßûCª)*»)‹ÛgBõH€ÓgpÒº› ¶€IàI‚7ˆYuÅ:ýp‘4ú3‚HŠ‚x‡d©nºÕ¦Øi|`šå¡5¿÷ÖiŽÞ1Å÷0>õp€Š#ûHÎe„ÆùHžI*]mzA!C]qè™eîùq6‹¤Qð—æ¤P|bC¦ UAeI=ŒqcÓš4 hw,aþ»™ •ƒd,õÞà FŒuÇžy66qh”w/Ÿ`#LqŸ’¹4ÏþäYææ¡»äDˆ”ž¯0뚯b цKŸìÖÞ¡(ÞßS z¼Må¼H[ULŒÎ•.U¨LìC¹W¯ÿK¬Z¾þÝœ†–o_ÌæÕi˜fiòp%’‘ÃdÁ%&853BXn”ˆ”;Zç#|†*’¤Ù8T)ð31«_NK©á¢iÄœ"”òÞï>q‘§¨D^TÍ=¡®îå#\"ÍtHšé«Gx?Ô¼Ix%C8QL‹î y¡-Çqð.% „謟¢ÕJ²¬AÈ4 ëÄ(Z šÀenêê™x˜Òã™!J¡–« MÌT~Ç¡ÖÕŽ*x"7eÁ'‰¥ ! µÒj—¥\¶ßß(Zˆõ0ÛÐ ¯/Þ½›‹hñÅ̽Å˃Pe™^.tÆ)V¸añöâ¯Ã•BOq5"I× fÖIRä×…$+BƒBö^TKEs?«°1xªß”×Mbv"Iø,!f!¸—0iN]¨5ìp5’¹Çý)EÈÞ“<|6©0Þ/9T™(½o»Bðá“ñ«Žæí_–i|ðÍ‹{ùü’sy"£‹Ž°î”ºÿì\†àYêÔ°®ÒÀå¿Ih³ÌòæëÂD¤ñúx9µ#ßÒõxB1O$Ñ»O©”/Þ2DF@R#KqRI·`„‰tn¸lÓ… Môl%I %ó¶¯hÁçxq8ºÂÏXJê×½»])¼)¼ 4gõº¢D ’³ëÉ¥û ·þŒ£¬“ˆGTõ¬u$à·´{Ð<´ÎB€Ñàg"•ý÷pà)®Æ$ïH¿®JCã I¹†ICèó2:Pœ1›…©KbâÔ¹8yÈ<Œ4›G~ÝyOÓpNE¹£¯äYˆ©<‹à8}ØÛŠF4Ãùs°ÙÊëfÕBÇ9’ÐôŽ’Õ-ñv;©,rÍ!Æ—µDô¼?È%Ÿöt“¶Âî!€ÞûjñŒñr{·ËåmTú°w ²§ŽHv¾ŒŠ#}ÒOĦI?±]õýà ¢Š™õ¾cÜ»>—¯\×ò;L\Žû¡.9Ëèv.÷µìÆ:[Þ0*¾éŸ ßù!¡5ß“òJ4‚*æ\ ý,—…;ÊÑ‹IˆBïç¡^Î JLú½ÈÄøšË¡häαOÉ}¬å°‰§ ‹®gáz5×(öÝ`ÌžVwªQÞ-ÌIåUZÝShYÙ(»›péÀî}”ˆ-Ä$ŠåÀ&Wrɇ7Û“/Ýþ„Ö½õÄËá÷Ù ¥8Äë›äEDÏ3Á#è—´¨Ôu?ÉÌZž”ÏKm¬ gOcÌó½$1ÉÇP,ü;²ð†‡óè °ŠîºÒl’ú¨ø˜7L t=ŸRkc!¥Žü]ÀÏt C%…, ÖTy𽓠"寙“«B\Ík¡Oš†ÂB±—âC;—½(¥ 91>e¼‘{§9TFY”ö¥a’—detp!ÒÓCàDŽ„2ºýrö¼ –´/±Œä4Xª×wHu+èÿ×lÆ®Á}ı¶À3Íòî RS>Õ|öœïò¦ê7#C’’¦í›YÉh<›d$˜ÄßÔÔ»Öï; (ôvå^+q¯97ÇN‹!Ø>$X½9È#ú\Ÿßl·{ÁWgü¡›¿SÓŒ ØY cïû‚ïÀCÀf!L]XËù~„*ŽC3zÁ_Á†ëzA‚§[îl{”«¾ÙùǦ@±|ê“PüÉU/…~Õ¯X GüÃ$Î’7~Úfàæ‰Ð‚àÞ_–þj”®{ë»rf'¼-F—¾g7Ááœ2FþÇ=Ôm¿¹¥Èˆ~«4ü„h†ðüñö«ÇøêEÊ_Nû÷ÓþúÎ/ŸžNý8ù3eOýI¬å†ÜùÓ—û"QMWÀPüß­AóE endstream endobj 403 0 obj << /Type /Page /Contents 404 0 R /Resources 402 0 R /MediaBox [0 0 612 792] /Parent 382 0 R >> endobj 405 0 obj << /D [403 0 R /XYZ 90 720 null] >> endobj 406 0 obj << /D [403 0 R /XYZ 90 486.1799 null] >> endobj 402 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F52 26 0 R /F72 6 0 R /F67 85 0 R /F14 125 0 R /F3 128 0 R >> /ProcSet [ /PDF /Text ] >> endobj 409 0 obj << /Length 1671 /Filter /FlateDecode >> stream xÚ•XÉnãF½û+ä*1½rIN±3Lå`ar˜™C[¢–˜"’²- Ÿ®®j.6Ç¢¡ƒZÍb-¯«^U‹Ï˜ýðYÊf±”aªâx¶:\1Ú¾¿â´ZX‰E_äzyõãÍgœ…)Kùl¹(Y®?7;sœó Éæ Tó…”2?ÍJ©àc1‰}T™U³/‹ùB$1ÓŠç_—¿]½_¶†µ—\‘—¾Eñ3ߢD…\*í|[ý†žG ã0bLXµ óKž£Ó+s€¬³5¼5[(F:²Vy ÍS'þaž¨ ¤8]ÌOæpÌ-îÇ;48t+Ò¡•Vdp«ÌfÌ-…ZiïÖÁ©3…U\ƒ14åv›g´¶Û;ZoìÚ¬œë¸±¶•ä÷Å=-7ô}7_hüãý]5äŠê»ÂS*¡:ÇüµKÊ„dBÄL¤:LÒ(± E¡°GÏn÷Öœ2%?[W¸¶1ˆ88Ûã¢Gyüªwyç¦KxíXùÍ/Œ+»~zÒ ßßCÌÙØ ðØ‚ Gøj@Eõ‡Ü¼A¥˜¢òöPâÜcyi²fùVÍîöÕY8V^xÆØowø§Äú ɰ¼lÛä¦i*w§‘©r{.aÎoÈúæ²õ&{jN½†q€Î‚—šWRò¯Þ¬6Ž.»“ai âövQ`½ÓŸC&„~æÈð\£ÄƬ(€‡}ægÕt ¾3—]û}_t0ý½rƒ¾Ö¡‹:ÔžèèZéôsº¹l}ç²bw.àÝæ…ƒãz N;®Ùäçm‰ 5އՄ“Zo3jŠ7y‰7ßÊ î ÛÂñXÓžo—ÚgÌãõ2ß⩼œžh7úxöHn²©ˆLW9¡Ñn>pC†)Þ¢~BË£yäeߣ½æºþ×]@— endstream endobj 408 0 obj << /Type /Page /Contents 409 0 R /Resources 407 0 R /MediaBox [0 0 612 792] /Parent 382 0 R >> endobj 410 0 obj << /D [408 0 R /XYZ 90 720 null] >> endobj 407 0 obj << /Font << /F51 9 0 R /F67 85 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 413 0 obj << /Length 811 /Filter /FlateDecode >> stream xÚW[o›0}ϯ@êÃ@ÔæÈžÖv«¶)U#-êÖ=8@€•àȸ¤íÃ~û|c--M)±’sÎww Ø Z `ÅAà-Â8¶ÒÝ ¨¯ofP\fá>59]ÏŽÏ#hAà-ÀZëídý´ÏJ´w MsÇ…6qÜ ìàƒã†ahm?a?”Ò 7Žë'1ˆì0q~­¿Í>¯ÿG¾¯“ÆM^j›ÇOµÁ0öæøÖ< =„‘TxÊéžû)S l6(åRo ‚o™7MƱ\#Ï d§„=Ba|iÅŒpÓJࡈxðÑK ˜"Ê`ó1Pw•êQ)A myvjv@tþƒÿó¬ÚxÇ3Úç<Š—üíÊœf«§¹0º7GÄzDL6,5mõ mÊãŒê 1>TF.`ó¾›d“QDŠÜH¾/P~¼•Õµ¹;¥ž¥D¼'þ‹9¦(BqVš#_ÿÑ ±b¼Õ2>TÆ%ß±X-†ÓoåçË¡ÇÏ× ¢·™™Wxc¾Ã öÀÄŠ±P£tÌ &>öc¨,Çås‹Çî‰àh¸}¸ðØŒ{¥>KÕö7Rå‰(åþÆq£ÈþÝÇê?ƒôªÊUSOQÐíõÒ. ¯„D,¦’êTFÇøÌËš°­¸ç9i÷"½Ïl°t⇷ðv™žöAÿ BN˾Y9•öïT‘¢hi‚ZsG]g4’üΆ5UõU~˜B×èéš)ÓºÚËSÆ-¼¥bËÉé5…Ø`õlŸóúvVµŒ0Í͇o7ÖÆƒ}?ªzI( ”e’¾É²®“;¡ºîô.§·¤Åý4kŽ1Ku0ac~ßÚ¢´â™+¤C¼‹b×÷*â·lõ(Ìhª£®6H/œjqK¶:o ZNðX›Ý?Úì~g-ÄG‡èj&ÙI<,¢ÄK~{Ëx5ÅËÔ¼6bÅ|Í!7˜ù•uµÓï =æ‘Z!=èÉ^–kxÓ&Sàé^VE)—ã«çpƒ;å妿j³šv•_Üå×NÂ’.o-˜ÌáS=üÙpUðÿgœRØ endstream endobj 412 0 obj << /Type /Page /Contents 413 0 R /Resources 411 0 R /MediaBox [0 0 612 792] /Parent 415 0 R >> endobj 414 0 obj << /D [412 0 R /XYZ 90 720 null] >> endobj 411 0 obj << /Font << /F51 9 0 R /F67 85 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 418 0 obj << /Length 919 /Filter /FlateDecode >> stream xÚ­W[oÓ0~߯¨x!‘H;vÓ „Ó&@°MZ5€/q›°$®rÙ…_í”´ëФ)uŽÏ÷û šòÍâ`…¡“(š%åQ`Žoyò¤„7y¿<:>£h†?b4[®v”,ÓoÎIÆ6.rZîzÈ©]/ C'|íz„çcåâ…|U³¤ÍEåzxÔ!±ûcùéèt¹¦Q‘§ÜæÑ"‘?<›/ˆBBÃË€Û·ƒÑ@[!Jà_²JÚ’6ú®r¯¿á¡ØGxjå«qågy!µ*MÑÜŒk¾bàà;øÇm4c­Ù×\s–ê`&[פ. ‰³ªå3¼€m '˜öÎ""5Oó¶Ñ¾40Wðð Á>E´¿òâ V?ÂQ/ÁndFŽèÚCÚpäÓˆ.¬µIV„À¸¹yuÇÌÏù:Sà>øƒÑ),âÞdßkÿ¹0P¬àã@‚B© QÙÕy½€%0ÜÚâÒ‚Èi'+½PKyÊe¥Z[Zfã7*7LC¤Ê .™€eS¶à¥Œ×yŠÃÞÔŽù"¥”¾4ðwãð×9Ø×v¬˜`Öf\ï¥j ®GçÎϾáÉÆ?µ=•‰M¿®VV—ÏyPÓ¾h³žImíÃà|œ@%ÀXÕ™J‘_êJ]TfüU¢rÑËÑ¿ç[d.KP&Nf_|®ËœÅâ°Õdßå㨥hÿhÿXmãª`™½—»d"–L¶¦­tÙJ{©Æ[ù„†Û‰‰ÀBö J‡ÅôÒÌß‹ûªŸÎºMÕ0œsp k‡›Æî„;ÌëÍ!‚½ÁbÏ)D¿3¬¹(‹åñX5nQª tD䛂Û{/MÇÈNÉÁ|µ•0À^kµ÷'Oô¡µ‡ÞÚxÈfn3(KÓ¥F1a-&ùÿ,¯ÇñÏ—W'Ho?^ŒÃÄz]Ø6,i16¹ÜçV ¹Ã …ÑâI|ä«ýø¨CØý”¿ö1Cxîãh»®Í'ˆ¶é AL|BI8Üâ$Rä|…’CÁVB¨®9ÄãáœÄ:d2ÑtE6Z¬Ÿ3`ÙÓ²5#Šr}Œ©| }ùc®»‚úäàæÓ©Íø0@^¹QŸ.Ê1pX«SQöc™.ùí6µˆAt7:¤°—¹ ´Šõ`½ÝV5¾èu­ßrá{í7’B\¡ endstream endobj 417 0 obj << /Type /Page /Contents 418 0 R /Resources 416 0 R /MediaBox [0 0 612 792] /Parent 415 0 R >> endobj 419 0 obj << /D [417 0 R /XYZ 90 720 null] >> endobj 416 0 obj << /Font << /F51 9 0 R /F67 85 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 422 0 obj << /Length 2712 /Filter /FlateDecode >> stream xÚµYÝoÛÈÏ_aôB»\~5O7IsÍ%6ڇ˥EJæ™"’²­Cÿø›¯]­d:) ¢ýÎÎÌÎüff­."ø§.Šè"‹ã°0Yv±Ú¾Šdùþ•’Ñ(–>ÉÛ›W?¾OÔ…ŠÂ"*ÔÅÍú„ÉMõkpuWî*˜êÅRÃbÇq`þºXc‚/_`çÃ'\4Á{7mm'¹ úa[Nãb©MªMD‹ßn~~õîÆ‰“hý=‘ä¹Ä™¾PY¨UbDâ47¡ŠMB›Å2I5G’eIð¾iA¶Z&‹"ú颂- PFìÜ`*]„…Ž4q½¹#ÕTÐßÿ$ø½^!ÔW§;âÄ“ÃBçA¿çɪìx€BôeÅ“¦Cš —xá¸ßâòCS?òj9È©tX‰,Z"$6* KŸ<ÉÒàwV¾™ÆðÙE©`œÊ®‚9I®ƒ5Ê0 Pe‡*‰øê¿‚I¿ˆ¶Gž|ÁÈphjÖ¢®Ø/> ä+wÍjdªOÍ-Ò•üøË¦j&ù"2øMk?80Íf;ð 0gÇâ>¢øE³Zè F|²•ïÔ€F‰ƒÛ}ƒ¶›BRTp(Ú¦afr{¿dk“ˆÑa°%£ƒŽEpà• ¹|TŒ;ðÜ"íÝã^W<ë×øk¬âÊ3SÒõdEpãt’Y5 ¼×6ÍVIŒçA%{"„e´Œ+ŽYà»[’ÞK§¸wÍS¶w0,7 ”4âm¸¼î‘d:Rã2‘{Ï;â v÷„ãw&ǶI»£TíÑ]&4Á$•ÅPg6—¸A÷ ?QÁë£Fÿ,Ð>èX…Q–B€ ÈU9•?nj`1‰ c !}ÍÇ’Û b‹œÐ1ä¯ËL7ªñk€œ,LRø|>Ì£\[HSA¨ÐªqpÕã¬[@(?, "j™j4èÍÛã‘}F Å´4Ì Ù†Hªøf~}8r*Ÿ2ùÀ-Ý…!¬AÏãŸÚ–ˆFK†£ sJÓR¤8ì51Ä“^B^€÷4Ž ’ò—~„ÓtœI,áè „yÑsYç§.;2 …6mº ©—kJTLðÓõÕG›<ÿ“; É¶ßÓ|â9º*Ò>ROr¸+W2ü%Ñ-údÙÝ—sP;•·ì‚*¸DÈŽ‚ÎzêcÛ¸ñœà¢Œ*‚mI¾Ï“r'1HK ·Ç y”X>Rpô÷nMÂßèˆDEý=ÅÈ-™£FìøÙ9="X‘­+KïB¼+‹À)ko°•÷£¨·1c˜²õ@'œéDÖä妛 ªÑ `ÊEl¼ÄÍ”S?Ý þYõû #ÄåúiU[8ò°(J9­ë!åQjUÁ£ÉV ),x×°!ýùûÇÆJòéÎ)ëÜUœëVqÈ´q·R3¦LýóôYw’‰-zžæVº7:!åԇ׃°+Û¶O‰… Ûñðxg¯k8²+ùÇ÷S¹a\ëÎ/ÿÛ¦ãºìR†pÁˆóRŽ¢q; ܘ(ªïØ[ñª”14&êšñ¡Åóºí Þ_\[>õyygyh´J/LjÂÈUM²1•éºñŽMO+h\V» v&&à•~d†˜Úƒ'Ћeܶ' ¶ªÄS²6TíƒQ@¬ .åÁn`y롉0`‡!§¥²¦¤{ù(®ÕÓŠï„*‚3û­°ZÛ0ÆÉt'«Îx89Ú^ªÔh¶>-ÛKTPsÍ©³ð{»¹n©ñ$|GìÂ$§ Ô~uS'%NžC ² q;2ºC @Cå;Ó!!ϳûÕ—÷´å˜u|RUOŽ÷Ö Þ ϘãVò>FÉfï*vñ;Ü[P J<«éÇ=,¤O¶²N¢f}„}¨v¸Ø ^äY‘×¶µckµˆÆ/"ÿ?È ŠÔ¹ÁÈSî»`ÀÍîH³,kHî“”ó`t( µÙኌ:§¯ÞUüÀ£ßQÊì;‚XØQŇ&xâ…ÖÚnš8V`íW®ÇY'Ú6GVrãºìÈ“7èû–m§E¨“ø´æ¹ÝSüÎõ^‘pþ|õ Š¢ð%°%iú°ü-Û¦²NyÞ-a°Ô<^<ëŽ4wGïònig>—[±õ÷›˜„|‘Ó ·3…_›"…4*°5Ôød„£õ@NÏû•¼(VÚu±m›ˆ8òü¾p¹©ýwœïmv­å|ÿK9aê`?Ä*7{>xœ-â§Ð6þ¤‡wï<µ`;7>®±UPN6£ôQÜhFþÝw³œËØñÿ åªKÉɃ|@¡Ùêy>ËM }ˆËÛ¶æÄLI»M™Wˆ*z;¢ß~&GàºôV®\P¶)-+_È ž9#Ä‘¦2<âf¥ Òåg Ú‘œè·rUå%º8Šøu$"q1Ü’|)oWÑœ˜ä ’ú ºï¸…v'pdq©Î˜e(œðk*ýŽbJRœ­Ð}yâ‘Ö¼±Õegr¯µ›y~¬\&+e÷»ØYÐÈŸFÌ ñO|õ¨~£cþĸö˜$Êfžqu´o‡d¸…’7VÒ˜bÙæùJ$ó!1ÞîõÎ6£íeÑŒ˜‘@„™š•Í/¸zRe‘~ÚůÀÅ–8°¼ê§¹Û÷ÃÚ½jÖË µ–‹Mj,LìÊT 5|`H5¿B!‘“t!Ïæè{ø*Aõ3IÂŒgƒÖïJN\S <0ùͲfÚ“·&™r®„ãÊÚˆªòïÖt¾?Þø×R{¼»à‚+¢OJ­3Ìä·¹4Cצ2 &GŒÂqÉûŽýàþÜóÄ[”Páw3ô{¹ÎŠW¦~ÔWÓ"#…Ðïܱ«a¶_3U ËÄdÜ~=¸*öVÜÕ°šMWNõ8£ý]äˆyî¼—. hPÍfß´-g~áÁ™yι†w”GêXøõ륛¹±´ÿ’ÿ俞œê££02ün+oÔivR…QÅRa 3ô`‰?ÌÁÎC ýËñ¡Z«8¡‹‹)HÿæRuB¸B(XÊ56îïÎ4Í$¼»2ê÷¹!ö_/¥¡àZP…:ÓøŠQ„\åÿ¨ý<Ζ†y˜§yrÔR©”·ù¿jÉoiX$pÝrw|y€èʈíÂóº?¾¿åǬ‡¹â—gyÍù§TG! endstream endobj 421 0 obj << /Type /Page /Contents 422 0 R /Resources 420 0 R /MediaBox [0 0 612 792] /Parent 415 0 R /Annots [ 427 0 R 428 0 R ] >> endobj 427 0 obj << /Type /Annot /Border [0 0 0] /Rect [378.4216 462.1484 522 473.0575] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 428 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 449.6038 126.3637 459.3007] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 423 0 obj << /D [421 0 R /XYZ 90 720 null] >> endobj 424 0 obj << /D [421 0 R /XYZ 90 720 null] >> endobj 425 0 obj << /D [421 0 R /XYZ 90 579.1247 null] >> endobj 426 0 obj << /D [421 0 R /XYZ 90 553.6535 null] >> endobj 429 0 obj << /D [421 0 R /XYZ 90 342.9007 null] >> endobj 430 0 obj << /D [421 0 R /XYZ 90 242.4267 null] >> endobj 420 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F67 85 0 R >> /ProcSet [ /PDF /Text ] >> endobj 434 0 obj << /Length 2681 /Filter /FlateDecode >> stream xÚ½Y[Ûº~ϯطÈèŠG©[h“æÅAòE‹" PÅ–m%²´•äìî9¾s!©‹é$'ŠV´8‡3ß\$o"ø“7Et“)% e7ÛӳȼþüLšQáœä/wÏ~zȉ"*äÍÝ~Áän÷>xy,ï72«M(ƒ~*¥ýÇM¨µÞ¾…™ŸÁ—:x 㺩ì\]*ÇaÆ:uÈ͇»¿=ûë'‰ão Œ$ß!qšk!•NHâã>?½N³9‘‘Š0EŠöå/‚öÉ<å%K¾::V…YóIn !uzJ%d±‚þ%Q gÇÓ6õ¯¤§ëI…¯x0àË3õûr[…øË-aŠzÏÏûÞ¡b²¸F؃´wêX¤I J‘ Jœ+¡»Qù][6 ž˜Õ¾kšnçÁþ›Ëõ™>1C©A·Úò‹¿Sƒ=+î`ôÏ c)â$Ö†ò£W!TªRCQú”ŸŠ"/r§ûPÆYFªÖáOÒîÁ°² k«7¯)d‚Š-Ç| UÊz"Lƒm×t=Qõøô«þ&ó(¨Êí˜Íê«"»–Ÿ}IT,X$„ ´89q2?±„#§Z.Ë«›BD04ºA” ºè±$3¡Þv§ÙÉ'q®¯<'ÅY‰vŠÞÛÝ—ÛzÄ—OÆÓ#^:¡†ûÒ-w*ÂIiÃlùŸs%&«5‡pF©Šä6Ú$i­¼àÛV;°ÕŽ>¥J`)S¹ðö0ŽDªS¿w,~±X–o)t¢õrp?ëì‡OB³o»81à×j»T¨8O—BÎ;sëÇ#ÂVep}¬dz»~ãŠldý®†÷m9Ò/›$ ÊæìL ÍAÑÒþ¾ÉPá¹2Xö† (™T¬'[È­Å<kŸˆÞ‘“l•±Í²5+q—º­ ›¾*?»YP×'òžr´²÷¸EÙx¥ÿ¥mp$" @Mà0!·:V<î>nÂ$ >U$Ûø|Zp´;•;·'Îèà³óƒ'~Á—Ôïø× Qé<Œ¼…jtzXRŒGp@&&\`1jÀL ˶FÆ~Wõ/EwO*x>˜£ØsôÕ'•95 ½Œ'3ëaµ4 tŒÆ~]õü‹$„i¾I‡³ó¨•r, ýÀÏCÍb˜å{tm¹Å9Ãg&®»ÓG„c©‚ws+™ÔëÝqVˆ8³¾ôò~ûúµÏç”ÆÀ6ùq¤[OƒOvãíøÜ€ÅêÇz[ÑÄmÆâ’-ˆ4ª@•-Õ:íÚé¯?±êJâ‚ä•€dká5†”&É£šo9xßvµƒúê-e6·.&ë–Ü»yº”ÓI­ŸÑS:0El¼3•ÿDÄèÎà­QÁÁ˜‚íóѾArñWɈ·Ä³$ü1Ù!þr¨âX m{àTÂò10ãcUºµì¦fñÆH_àt†â™?v¤¹PQbÍæÍË+Öˆv0…(Ú 9:OÆÀfS@B¡åÊÛÎfλCëÒVÞ9 GmØ®"†\FŸ´@jIÿ5ÓËHâñ•±ÉšùxB8Ì ŠIBˆÀíTµ 0-A³¢C¡T3š$ ÎâÑN¨ È×1’âÞ·#Ûw©zä:XCðÀoIotÛw’(G4À cž'pˉ3£†ˆÄˆo8ëͬ J×í fO4üöÁ¹ÜÑy?âOÖ¾0xmñ–²ZË«z\z ßópî÷“‡‡­)5´*8j•›Ã5TˆÀ]fiü¹1DNRŽ ÀƒRŽ(x¨É³™?­^'ã÷ÇYüEÖƒp<”'ƒ@H»'w4¡ÀCc¸2Ñlku„hi€çÈó¤À¹)Dsç¦ð~M){°ÑÔXþ‹_â5q&­(€²ÅC4ö¤8—<ïî„ ¿#…ç¡ïÎæwüfìD8g1_¥\ç”sîlH·Ø<­f‚Jàò ; ~¾8´‚¹mGÚãóÕ˜› Ù š¯GïµÑÞZcPàbÙ¤QŽ1&])n—Ùš‘ËÍ›z¶tÏ6[\Þ']wG›ï=¹â¥|\ˆà)±29´^¢ÒEr!s™O D€dÀÈdîÀøïË[ÒE@’^Áàü¥ý“¿Ô›ÊjªïêÁ(1‚v#åFúƒWVÀìXI«@!Ä•J t˜. L‰\+¹ é×ô¦±rùê59­aÁß‘WȆëJßc|Î5ÉpWU\ÄÐp€8ýýŠŽœRHå jgUÄߣòlUëER¤‰¼ìV}SåHä7ÖxnÏð1JDgV\i[—÷û}ï%ÊE°£ßþ“ðQE&ÜP3‰Ÿï$y!’$·‚j¿óI;bKÙ¹Ô³G‚i|œ"4Á"¼ººh²6É}Œ%ƒT+ȇ/Ѹl Á>í¿nªeµÿ¦±*Æ´w±Í~é)††D)G?¼ÈE–ý žêÌWaš‘QMˆ·_õ-UÞX9 }Ù¨”T<ÒEŠá3ïÈÒìÿgÜ…H‹ÌwdÎË3) U¬Ê¹¥Ñ/ðhÙ”+©(0ezµ¾†¬òJýå»'ÈÆ“L. ÉW^ÄBÅ·ã]Ð40¾Ò2¤9Ê1Ï5­_^,¿7§h ™Ýeà3ºÝY—f‚,•Î 9S[ugÿdRˆ|­ËçAeµiA¶@IXÁ­|î°ë¡œ­Ïružß÷¸Žœ+Ê”‹äieÿÄóê?·å`¨Žu¯h±|T” EÉ×À†Q¤’¯álp¨ì·w–rt©IA] |èW¶—€;¯Û3K„±m5>gzp.oãè•v8e*'Ûmhêm=6&ï®'ã 7ä£Éåõlü¥iÝ+9ß8ç´qv“ØRQqpήÌ¿·X²àÀA6þ˜·ÅÈ^m[̶ q»¦¶õ.±©.ŽÑ â"ÓåÒé–Û|ÒjýLc4”©†0ž ¥ò?t1Ðôìc˜£ 焞/b— ¹ÞbO‡ÕB Ų¿I©{™¡¸5f»ç˜UŒ…pN1?“„ÄRWHŒRX‘CìñàstáœÐs¦K†(­ë7SļlqâU=¹ÂHÜ×7cƒ» §æòŒ]»fÉ©´?lË@èí—@]eNÅm}Ñ6IUðîL_¹ÓÑvt\›î·Eú ñ¿–y{ûѲóñsÕQoøKmø¥—àÓ©Sçjî†_± ,@5il\“»D\·VýɦHp4¹QQÇKIocß׆ëpœZÞ\…Ó'Sà!ÜN*6_ñ Ûó¬Øu+àâT—€ƒ¿í¬ùM"Ïp«5§æØaQ®l¶ç†Pd¹ŽQÿ8NXÆE¶0¸¸È¹Ñ„ƒáL~SϱPŸ…F¥aq©I´þhö‰¡0¢7·ÇÞŽK÷üœS®t„ÓÔX‡ç®š¾hÁ”\é¼_¯$°;n·‚]Ã^X¸ø/¬ùâ endstream endobj 433 0 obj << /Type /Page /Contents 434 0 R /Resources 432 0 R /MediaBox [0 0 612 792] /Parent 415 0 R /Annots [ 440 0 R 441 0 R ] >> endobj 440 0 obj << /Type /Annot /Border [0 0 0] /Rect [413.2164 173.6116 522 184.5206] /Subtype /Link /A << /S /GoTo /D (Vertices) >> >> endobj 441 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 161.0669 126.3637 170.7639] /Subtype /Link /A << /S /GoTo /D (Vertices) >> >> endobj 435 0 obj << /D [433 0 R /XYZ 90 720 null] >> endobj 436 0 obj << /D [433 0 R /XYZ 90 430.9548 null] >> endobj 442 0 obj << /D [433 0 R /XYZ 90 152.1006 null] >> endobj 432 0 obj << /Font << /F51 9 0 R /F67 85 0 R /F52 26 0 R /F55 36 0 R /F72 6 0 R /F101 439 0 R >> /ProcSet [ /PDF /Text ] >> endobj 445 0 obj << /Length 3384 /Filter /FlateDecode >> stream xÚÍZësÛÆÿî¿B“~8aÜ ´ù ;v¢Žm¥;™Ž“0 ‘ˆIB€–”þóÝÇÝ @)™v2Ϙ‡ÃÞÞÞÞ>~»8‹àŸ8Ë¢³D©0ÓIr¶Ü½ˆìôçÂŽæ@1Z¼xùÖˆ3…Y”‰³Åí€Ébõ1x½Éïf"h‹Ù\õl®” ô׳¹Ö:¸¾†7ß½ÃI¼…q¹-ÜCªƒªÞåm3›KK9ûyñ·o^#ås#És‹HÃk}§:JûÇ ˆC2ïAV™Á ¶ VQ×L€cz×ò¸9àqï¶xZ¿Âõipã5±a†í¦àAõi67&ø¥X"I{³Fß¹ý«Ý –)‹{Þ` 0»Ú¢éI€Ò1Ë/¸„V/ÛªnPqgsÁÇœ  ñíä‡vF[iÞ¢x$D¾Eùÿ—! I ZP‘Aáá >ÄÁ2o¸àWû 5œpµ%ºƒûK‚ªÜ£H­åRÍH#ð_^¯zœ ^Ó”«îá†5Jˆ÷´ÿr,78£YÈ ;sÝ2Êf¥ dQˆ$¯y Õ ³¬,qQ/·,LA3ðßçûÒ,¹ªWE¯^¦±ÈˆË5ªMgÁYKNÊ)ÚeSm¥ÆÓå¨0ùSd¢W$䯥wâÑ’›‚2q+”U,^­Ê[~5º˜ûaFl¢Ã ¾ Cž/­$¥•Þó_¡ºjk§eµ?mW+äýru`--ëªiرñbx¹ú?¤¶—oy+#ðFtF¸©BeŒ">:Ľýƒ›Ä*XÌ2Ôù¾¹…ÓÂôíý¥MŒ=~KïÊ%i°á†nž„±R|U7Õ®Àk6ÇþØðl¹wÎAJ¾#“ aÞÚ…úAó .Pý8ájïU±b‹FÙ‘`ãݯZû¢:4C!\X¶<ßÂÉÙ¹„åƒç¯ü\ÈÑfa­¤˜²mÊin%µØòÃ'4‘GïÐÓÀ|Û–èBÛrÉÛÑ[÷‹þF6¢²5R®7ÎÌê–‚Jj2¸N˜ò,84hÏìŽ$¨c\Gæœs~Ôs:ض`oÚ÷vªm\!rÞ·ê &ÔÅ]ítÛØ8A¹Ü¯A.¡ƒMµƒá.XËb"[Bg+²¼uZE<8²ÊùñØñºþr2¢ëk üï,o‰”” òýŠ\2Eé$Š}Åi´ÄSÿdÈ-Ó~ '¹XtŸÅb|š˜.½;çço<)þ\†üv±qRÃ÷VXýÀtKëÍÒ™ oAVG»t«™t·sþï^ŸéýĉQÌo]SjØx'm0é%2(Ûs›Äâ¨KN8&Ÿß7643"+7“rÔÅɶØóðàtY¬x‚¢«IñR6Åq&Wˆ £Ku'Å‘ú½¤y]LŸ}{Øí9[Ç 'Ûµ¡yìë$*f9»’ 꾇+ëájílŸÌ â@ñNõb"Œßà -·åª „™ÓQÕ$aÁp©»œ­R¸Ø‰ÕØÞš“Ý7¿;B¸¢tÛ:¶·äú5B7œwqædúìºÍTNXâ¥ñe­N Îåü–4 ¿è+¸ôÒ!Œ· ·Z¦ð7 cÜN·› Nש ‰ãZRߊ©E̳1zë¬k× ƒGb¡UŸ–rÃÇW„ô¶S&]°QÿRð¶Ä†b¯Áb ¶Q` eÀïÅ ã„ß2èðÂŒ"6Ü£÷¶Ó°áiÈÒ¦WVý>ýáµtÁ«-Z«ÌÍô¹a¹‘Ƹ"³S¦@!RK1_•`5 Ø5ƒ;ÀÉwù²èL`j“, U‹£Mä þKS‰¶$’# M$ÕÙEÃ!ÕÊpœ:Ë};MH-Tê4‹íŽx¸iÑe¨¥––ìÏS¬L˜ÈÄQ}ò€©NÝU<œàc’ß(úï‚K‰¥t—B€’¢ äþPe€YŸBt¢$S%£§pŒ’rtg´¯Î!lWOPn‚ˆ‹I0Úb˜( ·QÀÉ|iÙz`)ÅSÀ„®&¸Ï‰:†™°)t&b2½.6ˆ6mÒÁX” Fš°öŽ—Ò„Ç|?i”i ²üŒR=o”qæv›s¬.|¶ç=Ð ’1¶%¨k«‹¤!­yÁDýAv&£$ÌL&a„u],ãÊ}Îýu C]í<¼ädb¡êêÚîϳPwBƒÒ€ƒÄIú‡9äÿ_„€@('Qi/¢«bïV£ ùÞÐ5+‘Á5GêÈÑNC¥äèv<–ŽDô‰ýþ¹ãŸË¤ðÕƒ‚**¡3Ó¡g| œPpOÍ´ÏÖ´ñ E7Ù«`p’ËoœáD§qÌ:`ó^:ÀaÌËYÊŽC±=»gæ¶<•~¶gÃàš¯­ŠÆ=T‘˜"á™2D$NôQÙ¼O7ÕK=fg}AŒ¯‹“kyÀËN§Ö‚/MÙʤlxívæŠoF¡­#^1]îè1Ò­ÜKçµjHHIçG¿O'¼MFaGλÝTîXÅØò¶$•¿1¥e˜h-NÔ¤£Ú$I»š(I‚7T¹“P]³mg£DÍ<|}Cµ LØf.­Þ“‰³PJ%—FæTSŸŽp3ôàŸ"¡O@54ëbj¨äÿ¸¨)ÃÔ铵˜«[ÁµFu3l]žÛP×;7:É„·w{˜x¬ÜÊåñk5²Ršü•+þÊ‚m$klÎ5¦íöÑ–Rý+Ã’i¤÷#$5}ˆæ÷ÖS)×S¯ ßSu„{&bp¯–Âï¿¡Éú>'oFY`þ¿¦Ï?Y:ÑuÅYnLrH£ÏH¼òÁ´ýúÑ6üæÞ ívøæòè__QÔ¸â){}ôÑ }®pˆ1VY¯“:\Ò8I|÷`MØñ¾¤ŠðI ‘ýШzyÓ,•\?ûsì™m¨`¹`«pÒI4Tº:íõßÿyùí¤ç¦p#= "xÓÛŠŠy÷m&áN¼ð¸%sµ.€tXpJ8µÉ<|}uõáòÿšFŒ‰}°A˜ž ´5¹°éŠ@Aî¤AEëÒFZ”$oœ‰!È&'tn2{”¶à֜ؗ˜­{/6ŒËdà~;œ'¨Ë/»Ë¾*ºGŸsXGÃ;·œœªÝk«¹óf*ºº>õ U suÞXs½Á”»Ÿk;¡{7¨‚«ºl8Æ»客ò;Û€‘ðSÕ©&vß¾td-Gý\¢´oÝ»MôMÿ9ªŽl_]lЭö\o¯™Š3¾¾¢×W¼E·%µ%Þ÷Æ~Q›¹`ÅéúÁ©—zYË'¬ìÿ£'jää] ^?RŽ8œ¯8‹1ÂéµÜ—­ ù‹ÑWŒëÔwNm…F_hqºxè!‚’°.‰²¡ÎÖzcQýDS,ɺ\ÂÒæÔ¢—Žb„¶®·p2J¦™/ &8á·Ø0Ã.Î@‰ §ŠPd™Û#ûThW]_ðõõû÷o>,¦˜i¨$£´kV ½u_²a¬À–žÑYðmáÚ¶y¹m˜0¯»EëÒ}ŽƒÇ”•¿Ý·1ü¦E†úímÅè&N0+α=ðm–uéoÔâï4†I3Tß͸T‡£N—1@ÚŠ—TŸ(Õ=ݼO8ùGAÇ ‡¥z‚¥:Ôà<üˆ6‚7>twb‚8:U(#©¢N”Üžî9QÇ m‰Šk0¡+¨ÒB°nóœ®<ݳŒNêÊX]¡õ‹€µeŽ´¥Ž…Õœ"RésÚòtÏ ;fØÓ¡)òÆåH{ÚÄ¡IÁŸÑž§{V ÃiKÓâÆßÎ%>B$‘1ü|áúnV±˜ï’qã'ƒÈ¤£ ©Ã(9ùtžnÞ'œò˜CƯ$u¦BÀƒñ°™Â¿|xg“î¸ÄË\hº¿MQ]é…¼õ ¶pEñ®|p°K uÖx'žlÚºà?Õj¾>ñ½ €f<ï®nSäß \¿áŸ÷on¾€`{)ÿ~àõ endstream endobj 444 0 obj << /Type /Page /Contents 445 0 R /Resources 443 0 R /MediaBox [0 0 612 792] /Parent 415 0 R /Annots [ 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R ] >> endobj 449 0 obj << /Type /Annot /Border [0 0 0] /Rect [382.1209 367.7336 522 378.6426] /Subtype /Link /A << /S /GoTo /D (Transformation matrices) >> >> endobj 450 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 354.5829 175.381 365.492] /Subtype /Link /A << /S /GoTo /D (Transformation matrices) >> >> endobj 451 0 obj << /Type /Annot /Border [0 0 0] /Rect [108.7526 134.5011 252.7024 145.4102] /Subtype /Link /A << /S /GoTo /D (QUAD) >> >> endobj 452 0 obj << /Type /Annot /Border [0 0 0] /Rect [277.6085 134.5011 411.1038 145.4102] /Subtype /Link /A << /S /GoTo /D (OFF) >> >> endobj 453 0 obj << /Type /Annot /Border [0 0 0] /Rect [456.5807 134.5011 522 145.4102] /Subtype /Link /A << /S /GoTo /D (COMMENT) >> >> endobj 454 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 121.3504 198.9395 132.2595] /Subtype /Link /A << /S /GoTo /D (COMMENT) >> >> endobj 446 0 obj << /D [444 0 R /XYZ 90 720 null] >> endobj 447 0 obj << /D [444 0 R /XYZ 90 617.6819 null] >> endobj 448 0 obj << /D [444 0 R /XYZ 90 469.3821 null] >> endobj 431 0 obj << /D [444 0 R /XYZ 90 319.8702 null] >> endobj 443 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F55 36 0 R /F52 26 0 R /F53 197 0 R >> /ProcSet [ /PDF /Text ] >> endobj 460 0 obj << /Length 2571 /Filter /FlateDecode >> stream xÚ½Y[Û¸~ϯÌËÊèX+ŠÔm6)¦I0Eš È´}ÈæA¶8¶:²4+Ë™ vóß{nÔÅVf¶-P°(ò<<—ïœC©³~ê, έýÌ$ÉÙz÷,îÛgJZK XŽIþtýìÇ7‘:SŸ™:»¾™,r]|ò^mó»…ò:»X*¯],µÖž¹\,1Þ‡0òövï ´Ëʺ—ÔxM»Ë»ýbš84^¤Ÿ¯ÿòìõuÏN†O1Œ$3‡cŽ•Jý$Ë¢³85¾Ò&"¾}ß_ÀôÈ[•uÞ>p»È»œ[7MËÝo¹µµ­åÎ^…¥Ò¾ŠÅ·¹Î_yÊ ~üíï/ÿ…=Õàˆfƒ­ñÜe½9Ö# z$‹c=þø&gÖ~¡&oP­aäë$KéìÆÇ¥ýg ­X{¯w àÆØ- ±¾¥Np° #qBÅöšÄ>•×7ì×ζ8TçÕrB¿FSLb¯íO̰õšû9ï+ÔšÍðcƒÞ¦ÁH·8·C1eð@³gâŸÁÁeõ ²eÚ7QÁ.¸ø»«×s<„!4ÓT¨.æŠ}•¥¡P\½lL¨€'ÅÜåèÈUƒ¼ßsOkoìH.Ô‡Dgóhù­c™8Ñ’vúj˜Þ=Zb¹FÿÛ²¸Ð¦´i|ÉïDn`Ìâ+‘oe¦ÎR‘˳æ˜q˜otH¶oÀd:4]ì`lÃÖ¾km¾6L” mÀR Âò‚Ñ(Zt?|©s‡|´nQîoyàç@ܘ¥CË‚¯·<8YÞ¹2ŠöPóñ—„ÆrYû7|[‘í=‡.tÈ/èj9· ƒ­ qÈqh¦Ïqüí«w‚-ØÙìvà.{îÉy‹FÞÖDaï¶7–O`;çÛSˆaö˜ABÙO3 Ý(2];hÙØÚ¢ i¹ý£]þU¶ÙÏ™¹Êü( ÓIdxÞ4ðôžùK//_° E~þL„ú‰#ìù¯çÜøL¤ÎÉ„4žö¦¬­Ðïv«¦bëæ³›|:qþ™›ÌáòÖ>Ü7m1ÍCð<*Uñtßd÷ç²ñ d_´íÌ~ŽöòQ&•Ç·±<~_–Áv9£(­|“©D æ|nEa…)~ÁàÞtâs †¾ ~lÁÌ×AæP²ì,Z¢XÈu Q•£pB{|¢=bí÷ZQCKߢÉÛ΢i–Lµã’Årh4w¸SÙ@ˆCôQ…¿9Q±Ÿ©^¿Í‰ šQ.¶nztrûVäätåâÜAL ñú•Ë[Ê3ÈËå ”LŸ ¦æÑ;I8%Ë‘sPvv ¤hv –k¤Øþ$ž‘"ΤP™ˆB‡‰ši‘— cP¶uá:N)}ÁçzÂ;ö¬€ñ>øÁ´Rž‚Y6¸§µ¤é²EÆŽû>áªy- H8r§‹—2!ç׊2ÌËØˆÑ†¥E}_ñ˜³aÃßðß#á˜!ÂV±XÌî9ÇÅæ]ÞýœØ….ÐT4¶'s‡¡~·}à[±ÓÅ(è96„#Ùæ­£hhâ—ÒÞ󀋣œåa¸ ˆ>Š2f LRžŽXùšïî*·þ… 佇’YgKÓšInÄE…Ë~»mëtõ%ÇlØ—³9AÑl\`rŒ¤'k¢b‘ Σzq¦l•˜sÅ$÷ž¬€¾èÇÒÒót\ ÿ93cÎ [Î)EÅwéþƒ-6Öͦ%Õc’çî0šªó ­P\øÛ#üüãõ«ëÉ‘Âé@øØ€ëUG+Ìà.AŽ0B‡ 9<¾,"„ë½$ÐXŒ¾ãSoE€ÐdcbìAäªu ·ä-–_ÜMMÈëÂ6W ¼“q¸˜\F [•;ˆcB{ ZQêpXbC‘ò°‡Õg°lÕ—½tGQÃ]ÃŒ–®JfG­‡2´$_¼åŽIâ>C‚:㺠ÿþ”fÖÿ¡>žÅ„Kbîè­ ™J€ˆ•ÀëÑg¨e¤WÞº¿Æ ¹zÃ5 /0¹©ö”•„Þà´ëÁYqj3+…(ð£$S}º@1sm|k' ²¶Ì{ÉÌ1!W88BÊ-»Œ‹¢½6¯Â š¦åbæ4Ð(e;‹(nê(ƒ³Cšu¨*ü$ñOJÖêÑÔ”¯{ædn´熽1«+†²­Ú(ÒØ ¶pNrrß0¯#Xœt„›u”âXNIM³ëËG©$¥žq m@Solñ_X{¤ÆYê÷õl´¯SåìáýË¿¾žµ{í'i’=nøJæ,?n(8enX6kQúµC2N[౩š•Kôá•Ì.kæÒ=16(M£Yaœàº¤ †î{|.ð¯næN Iª7ÎŽ’Ô§1ã_ YqàÐ)¯ÚÉ­æªÈÏ^òìy4Çô3‹ŽOzÁ˜ßMÒZ sÅNmªb:w’⥸0^”ûµ\X¢Úd¥uØh-åhR4H§‹´)[ëÙÒ¤¾‰££r½¦|àL ‚b”I” ÞGk¿P¨ÔªkdægqH_  —FG_)ÙrL7ómåd9º3„²˜`Î?ô+ø®¡øV¤¨Ï„ǘŒo,OPatÌ4:_é8šp=óm¥§{ŠíÓfå}rÜc>bå‡|ö éõtOòq²à÷ä…ƒø¶÷.8Á‡L kv‘¤ö >ù@¥Àmb(¹ŸdO÷Ô NdI²Íüa”œÞ‡ÍpÖßfàÐÜ…®òu¦æ0¿jä‡}_Åó— |¥û¬qË£¤Hˇ|ö÷˜:M¼)š`Å8)Ÿ˜`xøÄ„ l%í‘~3ÔÎÝ„“áþgÙ¯ô‡ÿ  F™ \úŸâiÙÇØê@€ópÍtfž¸ZŠu,|+Ì—yÝŸp÷Ó¤–…’2h÷nô!UJçø´tæË·žtޝŧ°£2ur__|/ÙEËÿ7’û6Ô endstream endobj 459 0 obj << /Type /Page /Contents 460 0 R /Resources 458 0 R /MediaBox [0 0 612 792] /Parent 415 0 R /Annots [ 463 0 R 464 0 R ] >> endobj 463 0 obj << /Type /Annot /Border [0 0 0] /Rect [184.263 107.2355 334.1365 118.1446] /Subtype /Link /A << /S /GoTo /D (read) >> >> endobj 464 0 obj << /Type /Annot /Border [0 0 0] /Rect [361.2478 107.2355 518.9697 118.1446] /Subtype /Link /A << /S /GoTo /D (hdefine) >> >> endobj 461 0 obj << /D [459 0 R /XYZ 90 720 null] >> endobj 462 0 obj << /D [459 0 R /XYZ 90 570.6061 null] >> endobj 458 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 468 0 obj << /Length 3344 /Filter /FlateDecode >> stream xÚ½ÙnãFò}¾Â˜<„Ê {ûâ•äŹ³H`lÆ»/³y %Êb†’äß·Žn’’Ú¶°X, ˜ÍfuuUuÝ-u%áO]ò*3F6Ë®–ÛWÒMx¥Ü(ˆxòÍí«¿ý¨+%E! uu»>Br»z}»)÷  Õ"VQ·ˆ1‘ýr[k£›øòã/8i£`\7•ÉmÔvÛrè±¶©¶Qb¿ßþýÕ÷·#9‰Ö/Œ /Q¬¤…Ïö*Í­PÆ&DöuôÑ@IdÔUå F¶ˆ}½»Gb“žcÊ atšÃÖˆâõׯÐÑv†E–: ²«}ßî7 Goòo©l×ü±Þñä°a¢L¢¢Ê««–CÛ=2T»>‡B4ðÖ¸]6õ7Ù8ž£Án²üDû˜ÑLJÑÿŒJ0)@<À‰@ œ ¶BBÈ ÕV ¤âÿr'©‰®qcã” K0Ø-«>ÄêDí¬æÇŠÙ«†®&mß{¸“è§+¬âøaɸ‘Sð\ÄÿGüWñç²'ShI[—C)~‰MAÞmÓv4†hñ/^w%jš5Iô±gµˆ3{´gµŠûCG1ˆtૺßc”/Ña¾$•dMÑ·ülwéõ‰H9=@6UÔ»#M­ÝižºrM}ÐEË ”FøµK ý*‰6uÕÍÜj=f%oñ{Uâ^àÆ9ø°¡t¾¶… …Ö£êѳ0wJH<«.ç ð™Â<‚ÝHšÉ€S‚_~~wÌlRð™‡bó§0ƒ"MžÖ½ÀxSñø˜¶Ø{)Ò\ç§Þ`éRĺçdµâP]­ø8ï%mãæ6AíWZãÖ/ò¥a˜û´îóžño«- ûŽõÁw?:& [BÈ;Ä»–Õ5Ÿìs ^§â®jÈ Ü?µN>ÝPÏSBÚWLޱ©î§Õ Б&@›–ùÅÎ,~Òim§)8ys1Ê·!$9xòD_Œcô O¤ä&³µçƒW"Sëæ‘T “\îz‡êSìS*# ÇÖàD&¤”/K†JJÒîú¡;xƒFÃ:t•w…)$!·‹ìäƒ ;VêhÉJ#™ >ÑNÛÁ}æ¬Å'r˜Iê`Õó²;žiZŸÙÏPΊ |="’ù'ú²èšC¼‹…H â;–×ý,èRÄMfwà‰)Ò‚'ÍRçi´Ÿ²¸j…vÁœŠàR¿ê)‹D$+o]®¤¢TŒ“~\ÚÔưžPÁ†³èxhbÝ6èZéÃáCõ©Üî›êËpú&²¢HýÇŸœzfBåêDJ@þ˜(=ÞT«{7óW(‘ß›/øš¯×P«×~åâÿ¼þŽGŠr|((Æf¯f>«ŽaÏ0L„ÆA6ÿ ÙBäIr"¬“xM9™bIÙWÓ·<º¹Á>Ä<“›±[åê „™Šáºã §ÅÃà„—&ºz,çñ•R ÊK‡c¦¡2º¯}R8" ~¤Bx 3mS»|sWn] `9ùJä(Tâ–Eªò+ÆK‰t`ÎãY‘ÏTYWœ'œ©½JÁQY q¿°ú‰Êz„‹ç€"õáQeœX¡DÁ”½J pEbÃ*Re2|*´ øŸÄœ5ò\`ÃgNX Ìö`/1p†ÎÙ” ™è'ôL–œ¾É L½ Ëî%RÎd º2ÉòÜõy˜ß“•+ó0’2ðŽ ̉²3«$Ã+‡äÀké2áâ9`¨[w†Éq¥ XýÜ%¤'JÃhE  «O>¿r9åÇ‘ª?yÚ¹ÝT¸:ðŠ™(>K~°½êu”4M“Nü‰uѪÒðnç³v÷Ù1ŽWFú<-Ç^>9)û„¡ˆƒ>®x¦–H¨±á M*E–ʧÚa,žÃK'蜚yÝI!er’Ã3Ô ,Εâ×÷|63Ž\#TëW.8tžk^’wþŒ‹4WP“ˆTÉ'­ÛÃÅsÀ`çïádß!íåtˆAýtêlX„`ÔïÉÈÀe=^¬s¿¹ø @':ŸDì¥v¾Î‚äL²ÆÖ‚Ú±šÂšîZ–Œñ8§ÐvTN Ÿ6áx,±`¼ê|%ý0§ìŽKÒŒw¢¿GŸ˜æÔPÕ ÷`ñ .d%§èŽÒbÐè ßSC˜ÖàûϬ²UWz¢m!r-MÀ…¸8_ØYœãÒéYªKS i$ä…"ƒPü„+áâ9`(U9C8õÓM®9~:rŽTv~¹’;3m»Y“-ê‘‘Œ–ãmƒ‡tæ¸Gƒ\oÊøn¼©"ËbësiGRÈè’\''×Èe±Uö÷òë‚‹)t³½Ÿ/÷ý¦\䡞uXêݲ9¬&wÝîÇn[=xFîã"@I>jÞI-Ä‘$Õ>T=?UÜêÿœ­Î‚‡*wüäªÉ_™©ƒ4&0G.\(?ùC=B"Âõüwî’ ÈMØÍ¨â…­0ÝDïaÉ6Ž.ô P›¢¡†±øÎÒ"ºéX  §÷tÂ> Ô]¹;Œ¦(êÔp¯ žª;·£3s—xÐFGת?” ž8ìþà» äñ«»ƒ0©]¿v]…0IÜåã5Ñ7î§©H!RM”ÎxE´|]çO:Õ¾3ò‚ûÑ–Îff¸îÆvÀiEœ*©ü؇y¾aU¸•j»`— ¸HÕÅ 8Ø\©GAÅ|êL‚¬YûvÌ+˜ä–§É?â³ã/-¤}æ« ñ =©v¾D µ;hwápð7¬×¬GBÀ±þ2×ÎŽgÈ)lǸ‚|ŸÍž {ø!qÅ«àÝý"àT¡ÀƒTŸföLÝpvs{ô­ÖàE\Xr"ÉÔåÇþEðÒDXH½Ÿ?v¥Æ[•IÛ]çèv½Ÿ·’þ‚˽ |­twüª·Ü™§FP“b™ý/xòmÒ7/â ŽR¨c¥„VZ],›'`.ïMÁ?, i=Ô+Ò,§òš‹Äªÿ7‘4Ð!æÊx”¾HØ+wl¼I÷ã•ÔU®Ë3!Í©EºŠKè$xŒéüZð¯pZ¡Êر—?e E8ÊöA&%Jåò[‚v~eÊâëjŽ!—œ‰2çϼ«Wõ~(‡ƒó8>²óQ9L®i•ƒ6+i„Ì uì‚Îû±ä¬û£óx³¦¨œåY}ÆÐ˜³×rR‰ï«®|àÂö<¤><÷móxßîлRSõfÇówn1þ^£D(ÇÜ>ß{÷ùÚÁŸØ>„þÍGjÑ_ÆÚ¿¾ÿöö¿cbpEuµÃ‹h)6«ûò®©¦'èå£à©ïw˜wl܆ÕÇ…ªÛcÕz‰P í·ÝUpP}ÙÕÍã´uWõ‡ÆÕŽÃ’˶ëHXø‚?4 _©œ¶p,¶¡"Ê Qè"ñÅ Ä@ð –W]uµžõr<|<[ÀEͱÑ[+²"×ø36(¸Ôœ¿}½¤þÒ[w G#!GûGÈ꽨ÁŽüéÐ1§¿A9Õ=ÇÖ= ¦E endstream endobj 467 0 obj << /Type /Page /Contents 468 0 R /Resources 466 0 R /MediaBox [0 0 612 792] /Parent 478 0 R /Annots [ 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R ] >> endobj 470 0 obj << /Type /Annot /Border [0 0 0] /Rect [330.9606 668.2565 505.6202 679.1656] /Subtype /Link /A << /S /GoTo /D (load-path) >> >> endobj 471 0 obj << /Type /Annot /Border [0 0 0] /Rect [226.1643 403.667 388.345 414.5761] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 472 0 obj << /Type /Annot /Border [0 0 0] /Rect [419.3706 403.667 522 414.5761] /Subtype /Link /A << /S /GoTo /D (appearance) >> >> endobj 473 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 390.5163 157.2728 401.4254] /Subtype /Link /A << /S /GoTo /D (appearance) >> >> endobj 474 0 obj << /Type /Annot /Border [0 0 0] /Rect [502.606 358.0336 522 368.9427] /Subtype /Link /A << /S /GoTo /D (Texture Mapping) >> >> endobj 475 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 344.8829 333.3883 355.792] /Subtype /Link /A << /S /GoTo /D (Texture Mapping) >> >> endobj 476 0 obj << /Type /Annot /Border [0 0 0] /Rect [397.4205 286.1667 522 297.0758] /Subtype /Link /A << /S /GoTo /D (Basic Interaction) >> >> endobj 477 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 273.016 213.6416 283.9251] /Subtype /Link /A << /S /GoTo /D (Basic Interaction) >> >> endobj 469 0 obj << /D [467 0 R /XYZ 90 720 null] >> endobj 359 0 obj << /D [467 0 R /XYZ 90 604.033 null] >> endobj 466 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F53 197 0 R >> /ProcSet [ /PDF /Text ] >> endobj 484 0 obj << /Length 1415 /Filter /FlateDecode >> stream xÚ•W[“›6~ß_Á$¶'F îå%Í¥ít’¿µY„­#Án¶ýó•@ˆ°l:;³–áèÜ¿ï”w„^Eàˆ’Ä˪;¨ßî}ò¥„?y{ºûîCxGx ¼Sá(9ål¾âfl[²óƒ-ßùQmÑ÷;!´ýüY¾ùø»zˆ¶ä™–Ä|IÑ–ñ ·bç‡è¢mïþ:ýv÷þd݉Ãð%‡•È‚ÇáÔã!ÓÐ;¤Š{¿_ïäåx+j܈+kPÖ=?ˆ’Zƒ1‚ôkåk¹ó©¼£¯þ cøŽÉÿÁð=çøQ+íx3bo©g$k½èjWb"Ã*7JRªCÉh0i{N%©/æ8h=|²óßÒÔpÎã9­qK¬áð"D½á7äp)šD14ær6|êWêØ°òé´ú!&¡]º®½® ÉI®ã×:ð`u9§Ò^'ñ¶5Âå#~ÒzUö†S{Õ‡ W„ãy‘†hÐMK¾´§õ¥¿§uz_ãsIÆZ ¢Zu…›FÝZ(Í›’Öó¯ ?WhäúHdêðE+g…ö¿d‚ˆvÁ<)IEêV|Õþ(‚‘'C” pLeèqâ0˜ þôÆ"‚‚0F^|ˆA’¤º*ÚÈL¼ª›;Úøkù“ïiÝÞ¼\“i ŸU{ðxÆÙ-ëJ…­$™!²Þ´PR‰,žÛd·G*ˆÏ8•)7ýªÚm™~ÆêL–S&%‚pÅ ùÒXÐáZ«½Ê“µU4Ô²IqÅ9Q¹Xˆ«Áõ¢cò„EÝ@……Г†«EkI/W~ö$o焯t lž$–8ûöœÜXêÀX†|S/†À§œ|º¡ý,Xg@e\gu©Ã!E!“NMV'ddYãÂqs¥™Îˆx-©–²n¦A×4Œ·Âj©öšÝ$û³† Õ`sêý¹!ö•'a(CNS—vý!MÆJÆÝ ꩵ|ÚÛx´ºOþ;Ó8‚¶”Õf¨ôJ ám©ö›ôÀʧìT5:€4ŠS ô0«ê@Y¦yeÍ%zk­²%…r>Oò;ް aÕ%1v÷§w¾ÎŠž{c§g¬ªdž÷fT”+E ØLR$f=„ûÎ!¹œ¬4¼}Ûµ{çòÜ]ÕPÏ[|õÆVô•6жœž»–Ì ÓªêjÓ¤lV]S͵ÞQ·cÊÃ(™Õ¤ïþÞ•ü#Z\·›ÍªXQâ©Èêô^³6x¶Ù€5°iïÕù' wÜå#»IûÑ3GV‘¶,á~ÅB¶`bxd°<Ì&&u¼È¢ ‡®Ö$ –—Ž¡Šwin·1wwëYyo°+™/–3H~!óîÔ=ßÐ/¤4˜ànpÃÎÓà6»æÔlK?ÃÃè‡èÎ9} fX¼%ÿP¢+×k –ñ ‡Òó1I:#3ß–<’+=áÔÔ¿n>~‘ mÍò5•ω4ÜSÜ/7µ[nW¶+ÍîyÖ±r‚Í”ç¬rLÔLg;2ë¥mãµf‰û{×ÙG5 êqÓ7Ê1‡HnWNZnX+é÷õiNpuV»ˆñ¶(ÕL33&crÈÑL ,Bɹ "ý»ß— MˆVQ/'†[/œZŸÏeg×—ªaµÚR{NVžØ0*s2ówf³Xцg(ÐÎk‡E¨XÁ¶½Òp–wf÷2Ûö ïgb_G¿¦ÖN¿?Æ„±bMwÏ`­rÝ ¤n+ä´(:¹þß.Ð÷tÕ‹ä4#ÚÇ4h ``zLs­:ä×ú›æJÅr2O½þ9¼RLÃ:½C†‰Ýéûœ÷¶ý1„)Aß„û;ÙJ!7ö®4?8^J¹Z þKl~É endstream endobj 483 0 obj << /Type /Page /Contents 484 0 R /Resources 482 0 R /MediaBox [0 0 612 792] /Parent 478 0 R >> endobj 485 0 obj << /D [483 0 R /XYZ 90 720 null] >> endobj 482 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 488 0 obj << /Length 1232 /Filter /FlateDecode >> stream xÚ…Wao¤6ýž_±ÊIÍ®´¸6``ïtÚªW¥:5•šªR¯'fq˜›½UÕÿÞÛ¬MÈFQdãñ›ñ›çY²ÂðGV;¼ŠƒíÂ8^¥ÕÖ¯¯ˆžy`áÙ&ßß_}û’Áh‡wduŸ;Nî³Oë ÖlȺç¬ÛÁ:|»ñÂ0\ßÝÁ—Ÿ>/Ãõ˜‹’›‡$\˶b}·ñü0òÃ56Ÿï¾úñ~‚C}ÿ5ÀƒÉbßFLh€Hä'«(  B:âîžJˆ©O×d>LñúztMÿ‚/…Ø%ü÷ð ×¤²”-Bd-)Vê Q‹šwöêS˜Ð˜.»ç_Yóº§áýžëOO¬<ðNÍ÷≛튺[Ïk³zÂÜ)”Þ´ÒP€I0®|`éc&òüÐqµ Åz¤jÄjÐ; æ^ÎRn%AMs3éÒëDÆ3éÐö݈àád—,¢¿ÍÕ˜ñÒ—mµ»Bèä‚—™1éy[ I6F eáXÞ\€l–áiØšI ‹9ñ  [Üö7—¨š’Wpº&§ÙŽÌû#kùt€ouä¬Î.lb<Á‘g®Qï5òZCEŽO]Ï+ íXˆ´0!5lûgåD(IènEãQ&¦&C´K€>;„¡äV-_åVšEž½j¡J}!ŸúÑŠFÅqØÁÍ84Ò²3NufØ~×ð)ZÍ÷3Ùl³²)˜.H‚€Ý~t¦·lX*úÓ;‡úï5¦–Õ]™®û³0ˆúItâ¡äƒ0lQy?¹üç è²œÜ F˜úñ,¹¿œXkÅRbÃÅ»Ä9…°ýÈIìí¾–­Ië±09;Ç–jZ™¢ËDÇ ¼lYCÂÑ7Ïö\—•J«“ìŠk U«fßh„ÕvijÊÛgV7GiU.žöK®«ÖSž´¼ò´—­&Ï÷!ÉL˜þsÁ¨h •“áæ‹Ïúè|¬dÆËÑÇäÞ¡bõ F6èQ …×í°&ë©"–е¼)!P%üî½óåËïFäe]Î…(—e)tã`´‘¯Þ<¢, Ç¬ç3·òáoHs÷¬^GYYÝXÓp¤¡½¹¹`÷‡è yÐI¹v‚¿žÔâô<¤Rtƒ&;Ž#€QT–M2yÐØ¥I$+[Î2S3õ\ÜS^Ÿo û˜ô.¿È£s¹uKH—0Êm ‰ÆÛY=Ú¹QäÐôtØg[™Š(Ffw]±kvrèÔ¨í®‘PÀmøY3ájÁä÷¼|xú²Ó3‡ìŸUABDÃÐ_<³¡GªÝ£(d%÷pòÐü²ÍF¢vè^™º8´fžÊJ5kŽÂãíGçö¥â ±Îi;i­¦ÒË[Y]ð˜‰Ö¦Èp ‘-Þ":\Aæêƒ+"¤ÁE5 žsÅ#~„§Óù®–ÀäÖŠ^eÓRoý:Yð"YÈ‹da½ékaÇ%B‹§[Ê”RVñ–¹ÀМ è43—GÆt‘BsR:Ç5œÏo¢NçÂh{,¥|œ´š9½¹÷çö‚B™Å¿Zò0*à¼-v®‹&åȧn/9üŠÉfnø‰£ñ"Ù¥°•ÝØie6‰¿VÏüt„$*Ú¢ÿ««Â endstream endobj 487 0 obj << /Type /Page /Contents 488 0 R /Resources 486 0 R /MediaBox [0 0 612 792] /Parent 478 0 R >> endobj 489 0 obj << /D [487 0 R /XYZ 90 720 null] >> endobj 486 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 492 0 obj << /Length 2725 /Filter /FlateDecode >> stream xÚÅYÝã¶¿¿bÑ<œ|]©¢H}5m¤h® z8 ݧ^ˆÖ¦mådÉ•äsAþ÷Ì%Y–w“§b•H ‡óÅßÌÐê.„?u—‡w©ÖAnÒôn}xÊô§WJÞ| ð§$_?¼úÓ7±ºSa‡¹º{Ø^0yØ|ðþ¾/Ž+åõvå+¯]ùZkÏüyåc¼÷ïáËÛã¤ñ¾÷²²n¯iEß­üÈ$‘ñâtõñáÛWÿxĉ£è%‘dAâh*±J“ LUr—d&PÚÄ$÷ o‡Þ®j‹ „PaèUån߯€kì›®ì˦æQÙÉSÆç¦­6üú=p9Ûªºçá©.?Û¶³0­xfÝ4í¦¬‹ÞvW&q€*$™ RFNKä™Ò Ä]kï¶u…ÞŸ.xVå&39•“ zØêȳß[~ÙØmqªÄå–ŸuÃϪY£Iº£]—ÛÒnÔ äó•T¦æ]Û0ˆÓ—l:Ák^wsóɾO]oÏí‰r:þÖ-—7a_ïmkoì—çé„Kq<Ú¢-굌ÏE7˜µ¬í†˜øQ~Ê2Ç+!^¿,~Kåïó3³µDEkYïxth6¶Z³·?õ§VDú™(´ t¢£KºuUŽ¢>D@š[6-?ø¡{ýz>Õ_OÕMmavA˜-AI:ƒ¾ÜB™4¶ ºÓñX= ú‰þ¡!ËC±›ù…mYTÇ}1ò9ݧà¸;ÿ•0|q'paw,Z[¯Ÿ|\}s?Ö©ÀÕLóX‘w ¡we;ðЩ‚»¶×ÆBÄ.Œ„ÙTJp ¨„óG”Œ6ìNí¶pAˆøÔÝ÷÷á½1éhº•÷ÿvaäÉ¡¸Æ,‰ÒÏ&È”šƒV„Csàr‹üéª䊢“ø.F#¤1{TÔœë¾`®K»¨)¥i”΂>ˆ—ì©dAÀ:J‚n¸â±XÚµÍÉBµÌàÂ!­­ìç¢\ÝŽŽŸ‡ŽÄ€¿x@#” L YlŽ òÁ5HL0 Vϳ9òÈb°2 eE¡!f„x¾Ñ‘W¸—öù»¢,ßñ ©a4dõzߤ€a_ÔðXãX7[ᆥß(óH¨YÑ÷Äàñ4T²`pÍoM^!‹a%¤,ñ˜Ð©×0éFHz±„©Ñù¥õ6%lø=x˜„ƒì{.fÀs´~ª:žÃüOB~|Ù— LKêÀÎ{\ð„%çÆaÏ©‘¥BQSæþ¬/Dgë{4Væ½unÈûsiϸ0óPðºë‹ ECNÏ?"/æS×7GùæÌ/Î\€$ç}¹Æö<<¢N o¹±óÞ8a¶¸É©Bg1ùçU ‡'GŒ4 åmÛšy¡µãÌØ…ìßÁDß¾„o)š?ΘØA$\Ås¨ZQÛJHJ6 3mÀO-¿Âq˜êO‹Ö.ÒpáÄHOûc8ÂA…ÿOLT; œy z' ÷ÉM ¯‰îó”Áa³E7b=¼ù_2Í©ŒáÓü‰¼ˆÒ”.À‘ng›‰ÓOR4Ž4QT]Ã[:#ÌÑs¦y&Œè˜öGÒÁ2t6µI8*¡ÀêKÈšµ¤'Ÿæö: r›ç¸C®•ã®?‰Èèì‚%¾˜U³0–UoþÈ¥ gÓrhB[hÛ²¨$jTSÍð3/y³ ’Ž.T<)'Y”ê;!İæì ýÊVøè˜Î .À÷’¼Üœ qSšácã§PÒäj–cßZ„r€ÌrÀ ùØÜ’8¡¯©V‚31C¾ôû[ÎT9X] Vÿ¿ÄJœûo-Ä ²Á ”PuѨ—ñ£3NÚ!C¯Ýñ“£œè½XcëÊý4ÌF©Y±öjý²Xj8öDÿѹf™Ç¨xš+ÚË(ƒÇ»lù•Œv–ù[nD>ŒK}OlvI–zÿl0"΃2RåÜ# jlj/?N.;^ê‚•C)­æ,éV±÷£]»„«Õˆ:9¥‚NrAÍ_o†"D>xÃ8¡7¼”Њ?BÄ€C¢‡l“=È©ç$œŽm#r´ýÌp+Êð@ðÈ ‚§ËI§z±;¤Ð‚íÆhùäMrâpº”'çBiîl –e”y.- Rñìí=¬ríA7Ež¡0‡Îó§côSIѺ[:)(0@††œƒÜÿC9J‡YpȲ€H|îøÛ¤àóGšŽ?JÍÀeq‹F S)3°è侚d›dÛ “Í£FìB -Â-qÝåÖ“,Á½Ý€“-ñ~d]Ó¥ |¤|¾¬e`¶Äû»WW¼£ d{ò)DYéxq–¢ÆÝËÐKy7lDhKªG`pnK9ˆú.‡šfØÍ±lGi¤„Jµ. 0Ýp ‡"0ÝyH (–4ýî©c¨­]Ø™®Ì1ÒÿàÛpìYbžt ðæ—ú\L‘u¡&f¢Rˆ¤ú1Üì;Fºà ˜÷ (úp™ì€¢:AÓ 0¾¥Cë:.‹ ¾Û$šAŽMýºg”›BÙ®H6Hë¢'KTócyø±ÜÕT€[Bm‡îªq ðI)ÔèäÂ(øar,†IMî}uûª-dBM/>» Š®KN<]&Œ(á!µ/¤j(írÈ(LÏgÚfäÞSs>œO‚\GW?Dhç·8:SA¨c ¸“oc`D'×ëBåOÉ~˜3#ÔÂ$݈&P ùýÃW·´!Q?þsòÎe÷‰…¢›¹N*J‚XëZPaf7~4èü)á‚^× ]±ˆ'$WÞ×m‰EIL½þ=—C‡ÜI¸öyŠ Á‹CK0È8朢äEËþž{Ѩ@'饯K~tt/i|Íð—($;åé âÑ¢;EñN4Iõ\\“é@‡Qò’ƒº—ĽfèDE\ï¹·#ÄáŽ"ù¡UJâ*"‡³ˆ7í¸{º¡ÂÁUTú»~š‡Ýÿ(9¶vl êÅ =3bƆ/m©/Y¨tD©Ú#×eœŠz+JçnÌ#W® P§#¸“Q¸(D|gnÇ¿¼Ø=üÕ ±Ô¶†Ð5BˆýN^äRêê–úph”ëß˳_â…:T_éìšÛLõÈ4‚„Oà@?³aÎÆ $Õ[€ß &¿¾•–‡Òµ>t3˜JyAyÁ5úx{ÏjoWïѧžNêÎ…sÄ… VE‹æMB€…HýÆèTh¾\ˆ'9Q_ºp¿n(!4í†Ê ú±T*zÿ²-ŠF^\xÀ Ú*íºx¤2`ƒa©r"ºÖ¢Ûú_Ò/|¸`¨.Ø"κ:rwI@rÍ0žA³ÌˆÇ¢ëo´]\ÕIÛa WûРÜ}Þ}v2§ ýÕuo8œý¬®Ð endstream endobj 491 0 obj << /Type /Page /Contents 492 0 R /Resources 490 0 R /MediaBox [0 0 612 792] /Parent 478 0 R /Annots [ 494 0 R 495 0 R 496 0 R ] >> endobj 494 0 obj << /Type /Annot /Border [0 0 0] /Rect [381.01 142.2293 522 153.1383] /Subtype /Link /A << /S /GoTo /D (Appearances) >> >> endobj 495 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 129.0786 126.5337 139.9877] /Subtype /Link /A << /S /GoTo /D (Appearances) >> >> endobj 496 0 obj << /Type /Annot /Border [0 0 0] /Rect [341.3677 129.0786 483.3026 139.9877] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 493 0 obj << /D [491 0 R /XYZ 90 720 null] >> endobj 481 0 obj << /D [491 0 R /XYZ 90 230.1371 null] >> endobj 490 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 500 0 obj << /Length 2097 /Filter /FlateDecode >> stream xÚ­XYë¶~¿¿ÂÈKdÀREŠÚæ¶’¶¹Hàšä–h›YRµŒ¯ä¿÷pÕb:S ÁcŠ:<ËwV mBøC›<ܤQä$M7Åå]¨·_Þ!½òŸ“|¹÷§¯b´Aa‡9Úì &ûòïogÚn‘7°­¼nëGQä‘§­Oñ>~„7¾›Äû Ö¼bæ!#^Ó]èÐo}LL¼8Ûþ´ÿæÝ?öVã·$oiŒB¯É&ÉH€"Kµ÷gÖ.ƒR½úý1ŒÃBX1‚¦]ÿ¤MõgÞPÁã (¢­á±Q˶kÅ+‡­^àM-Þ„ÞQuZˆ82ù@ÅJÊÑò›£"oi7¨•ÚAU?ƒQåÓ UÓç¤0ñ®‹a´ú¾‡· ñ¸æ:œ™À@ÁsP|¤@ñQ 8T¾Hè ýDÇ(Ôá‹°˜Ý®[œ ‘W‚[c"¡¿—r—¦f†¢¿‘Gkõ,ƒ§…~´›a³ïsŠ®%a8÷)'öÔÓM‘4`j§–Ò •<-X )©Â¨à?†ˆYÔo|cãáNä’Ä‚–qD°‰$@:6íL¨Ðºï°G‡¡@F•+ ÖYl V¾àõÉå8e”iÒ¢QHwMÕ+U®g¦À*5? ÁS”ôZ/½!ÖcÏJž8AcèìÏ5ëºQ`áY¥K´fˆ“G‘â‘ô³—RZ B훪ÇF!šªŒãåÖÌ.àrU¢ÑøÅ,CLRMˆšƒ§'Sà™güêâ ‰•*â‰U¥ªÂØ’‰­ÚÀW*K®ç©¬,M“â¤Îò‰M\¢@CŽâ¡$3ñMñ'HhÛ8ñ(¯èx˜j«ƒ]Ê…¬ÔÌ©õî“;"ƒ,Ž“e¸½€#QœÆ µ8 uÓó›Î×Ëþ~kpP *£P@âuú;Xwá5V1Že “‹ £µŒ ñ ª¤|««–|(š¦+yMs¶‡ž—lÅ*ÍI/à @ àp©Å¿8¤bªlKaònŬdG:VÃîÔèÆk0«íÀ¸Ò%ïÒ”cÕ(R¤™õúYô¦~7¨$6þ2í£Ç»P¼ÚM›ë=Z—ÓK?Hõ[ý²ª4,ì(ª†´®Y꘨ªdlîéE¯Úì2:<Ò·´`öú„©qgÈô[ÆUY›Ÿ<4†¥ ˆÞ_ñöï|R±ÞÆÕZ‡¿¥Â©cpº[ŸA+ËHa¥…pNdÔ wì¾eÅÀ_YuÓn³'A‰/Eó 5±ú‹úùólKðàG^PѨþ:‹ÆÖóTE ‹G²$ÈRHh˜ ¤É׳¡ÊÒùsB5Y- Ä=C¡ï³0ªÑ‘ °Zþ µþI[ßZ Òh­(ô™ L2¼PÔ1ýYº·½g¨j¶I€_üQ‚·‹˜–ßVIOa梕#Þ¥•Z-Ö:Ð 3gúÊ–YŽõo´ ¢B´Õ¬êŸîæc‚ƒE€W 5 Ï#L)O„À¦c›ãlb6‡üù)fˆ  3²!€Jœâ\‚:=é´®F¨Ö²Ñ;R¯ÍPh,ë­Ú3u±‰œlþùáK]„éàY©—ìæ¢8H°½]Iì¿Sk\ì“ |’Äú˜Q¨ûþÃ} L ¥ÍçF­¾ V·¥•¬¦‡Š•OÚûq Vä«Û—(μ_C2 s¬‡ñËÎ…ª‚Èå+­Fö[uj5Jž™kê¹öm¥›ìýåô±;ÒÂŽ¡•I‡«y†EðÞiøP‰ÅåüóþŽ‡Î‚Å ›2Fäá£úòÌä²Ó›C†dªheJÏH×aÅÌÚ[7Yw5µ¿;“Í¡o*HÈõX:%í dĪ¢Í¥è¼âÃmçǦn´‹®tqf ïB¨fWµøøQ|¯š*“VZÔ »ŽŽ@`ÞÎÓ4Û`X@%Ð,™?£“ev í»í@Í,PšEK<þÿ&A0‰H¾ÁQ„Eš„¥óç„íïª+·Ô6ƒ²p•䶨÷ÃxÔIP6Åxaµ­ÜS•îÏÍX•æ7W—kӽ؋Y3žÎ®®š»šÍ„6ó¸ˆ|9EO3"Dò@ùtý´±£ÓÞ!çy·?;“cXfæûL8‡¶8²<3-^Ø l,S¿½bNZ¯‹Î¬™ßŠŸÎCmo@¼–ŸiDt½w)ë›Êþ T¸zA&>͹ö)tâ\ºû-d»h¡“Úv!Üð™”öÙä ѡ߫2²Ú=ìê‹zð{ú¸£=³WÖ™vº &[ÑÔ'ï…ú*?ØTìýJãéàpkc¯98{¯KѧLÞÖ÷–ŠšóGSó t0«±®ÐÚ&=D7xzüá&hÛË2ÖÄNðoÇÞég}wÀÄ?p­RäÏÂu† ¾ÿþ»9.'íéN…“C…ÓL…lÒàÔÑ[_Њ=ÖáÃÛ:ô'¾’;w:ˆ½¥æ>Hf†<“–Ͼ^Ï¢¤ÿoLŒ’ endstream endobj 499 0 obj << /Type /Page /Contents 500 0 R /Resources 498 0 R /MediaBox [0 0 612 792] /Parent 478 0 R /Annots [ 502 0 R 503 0 R 504 0 R 505 0 R ] >> endobj 502 0 obj << /Type /Annot /Border [0 0 0] /Rect [319.2519 484.45 491.0682 494.45] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 503 0 obj << /Type /Annot /Border [0 0 0] /Rect [153.1628 392.3952 324.9791 402.3952] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 504 0 obj << /Type /Annot /Border [0 0 0] /Rect [450.9778 247.7377 522 256.8286] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 505 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 234.587 210.4349 244.587] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 501 0 obj << /D [499 0 R /XYZ 90 720 null] >> endobj 498 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F67 85 0 R >> /ProcSet [ /PDF /Text ] >> endobj 508 0 obj << /Length 1343 /Filter /FlateDecode >> stream xÚ¥WËnÛ8Ýç+Œnb’*Y”éÌ¢Ô™ h ˜N´EYœH¤ Rv’¯Š=i;ÀÀ ÑÉû8ç^_ü‚ÉÚŸ,ÃÐ[ƒår²Ïo|=ý|è‘+V¸Ý%÷Û››(˜¾·ö×Ád›ôÙÆ?§¤°˜SŽfn0-gn†Sp7sÓoßÄ›‡¯õ$˜nÄgÈüY)-sÈÙ̃ÅL£õì×ö¯›/ÛÆh>¿æp½Äâñ¼ëqoé¯Àd±^‚Húíqœ$Âç ŠüéÊÝa>§EÂ)õœƒvnû¸Ù¨ÎáÕ~ ónzAä«4x\Ÿ6÷—Ñôáq´ZØñ@@ÓÆã)fj” È«éiªž'Z>;jÈh®_%=”0×ûòŠigwú=í2“¹‘(”Aó=ÏÈLÅL% N¶}xí\VÆ7ß.™”4ïB3Ï…i&„B4aݺâQâ—ó©þòR´]34—®ÑÓ  •§ÿ]) ô&+TŒÊ¦ËfýU%ÒE_ƒ­èlµUvgº‹46_Æ©ßZ±«_ª ´XinEðÎÔi|GدLZƘÔ弫Ù`ƒ\ž#iúÖ£À¯«>ÌáŽïm‡3ìl(±ÕwãC†~N•§±øÔŠ+£°F¡w\»uø­ÑØúä?L¯¿Å endstream endobj 507 0 obj << /Type /Page /Contents 508 0 R /Resources 506 0 R /MediaBox [0 0 612 792] /Parent 478 0 R /Annots [ 510 0 R ] >> endobj 510 0 obj << /Type /Annot /Border [0 0 0] /Rect [187.5261 510.7514 359.3424 520.7514] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 509 0 obj << /D [507 0 R /XYZ 90 720 null] >> endobj 506 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F67 85 0 R >> /ProcSet [ /PDF /Text ] >> endobj 513 0 obj << /Length 2555 /Filter /FlateDecode >> stream xÚÅYmsܶþî_¡™~/#"ðÅž|°»uŸ›HÎL«h¦§c|G^Hž,õ×w ðxÎr]u2š\,öåÙ—'þÄIÆO’(b™J’“bóŒÛåÏ„…°#oyuñì»7ZœÎ2ž‰“‹å‘‹Åep¶Ê·3ôå,A; £( ÔóY¨” Þ¿‡7þUðÆÕºt“TM»ÉûnJKÄ|vuñ×g¯/v´”1Œ[<Ë1Ç"âLju§Š‰HiÃö§UU¬fð½ò¢ßåëõ=ͪzQÞѰ_•vPÞõ»¶dÈàwo ®XL#õPõP¦,ÑŠ„¢JCÂ×q¼¿ž…± ~+‹.ŸÄÁ› ßQ$D‘E \qà£ÛŸ1×Às@32fi†wÚŸ`þ :ç§ á—?<§CŠfíNAÑ›#›šŽlp²Ä± ~ßå‹–¢ÓKÃJ´Ö#f˜ ‹£(3Ì\¬¬Z 8A¦Á-þ+Ͱ¯` È­É2:$¹ƒ…_¹ˆq|GëKXj¬õäöÄC%‚˜qÈÍ?}xùƒ/Vð!í‚3Ô[檎žÿòÑÓ‰Ní— ¥â= …[ÇŽoŒE€b„€ ìQÄ,2:” ò1³ ‡iwO’ÉíÝ«Ù^ÊSžxVp@õòìêr~u©®Œ BÁ5¦ ípxý÷÷?þ\Kpü‰¬øo¥5ñOMk/'S­FLhNF|[¶=º‚q<žhïŸÎÒ”ERDVZ– õíœøaU”Í–¨~tÍÆºÝÜÇd8P}Zf'—gŒùôzuBš‰õ60€ºú†Ö>g¸§É§™LÐÐE° …Ê«yÔÓ,¶’;Ô¹‡­$a™ì¡í@ßGn—¦rJÒØ‰¤bJGŽä)p+9 fÙš«‚ù®¬gÁ¸Ùöxã¦7÷œœ!2&ŽÔ™ï´lÌ[^/|d$Š>vdæ^õ(@™ÈôP™Û–xÎïÐꢄ|¯^àÿÂh®7 ,évyO“2/Pm+œ ní\Ü»£WU]¬ÜŽ<€°Q¶æµU<ì­1ú­;:¡- 0nÁa“ 4¬ôÈÔþ,O1"={qWu¨œT`¸2TJJ{a!±@tMÇÝT5ѧª_ÑÈ`¶…«fIkƒÂamdÆ~ûUÕ¡“^!¥37TÁ|´:xá†37Œ‚ù~x6?f¶üðÐ_¯Í +M¼WÓûXVŠ¥’ÖuvÌÕ¢”éL¤¹Z¦‡`2?;ÆliDíÕì¹4üçhìK »I¢G}(åÊm:Æ×„”qy.ŒïYp¿ivÝ Èñ„¶FÔËI„ñMGÛ‡ïr4¼uƒ¶l §\ذÅ,ÖRZêo;r0臹qf³Í{\WH¹ê‘ò½µaÜ€ïœ)c~ú3À¯s¤Žb¶ÏB))][N €+€h“*€¹‘{zó 0˜šæ¸ ¼œž­a¡±Í[û‰ ý» þGÉ¥&ÝÂèføÕ ~Õì¶$%2û&!9ììö UF0%BвbáÞ›é‘× ÐÊ|Ý’HÑE0t©21xhHnæ=$‰e›¯ˆTʃó²¤FF8øeèAG s÷À<·¦³Ïq³¥|c‡8@·ÍZcí,(”õ‚+2ÛÓ“ÃfÌ+Uj=u ‹{ÈËG†VÕ–b^\.\îó¶ºhZBí¦É,ìºhc)[x}xX"ÓÒ Ú².†ÄQó®$L'Rd3#‘  áµè—þä’…,É!þêíüåÏ^<ˆ‹U¬=iµŠŒÇ“ì]*k†¹¹eQR\s¦€ªyc;“‚/ÕD½5€ ¨è€ózTõ ûÂñFO±ú ^à*±ÊÔBJB!H,_s¯~ÔÆeqÇÒº åW0<%ëÛæ7VZNo¢2͸„ŒfÌ §~ö=v“‡M– Î)æŸÆ½w䦱¿ªÌ2Á4CˆÁ'y¿¹9Nyn%„¬]×ÓÌ&8ÁJÑìäà*•ÝV™`AŠ¿AœÃÅ“×pÅÏ8`€Ñh'˜ž‚c÷ýŽÑ<_tÇdœ“9o*ú>¿_6ã˜äT~ã2Üz'•Œ r€­ÚçQÑ!MEK zÝä½IÑN‹çõCŠÁ.·¹™ËÉ0z¸:òå9LÎpó[#ž·´Lñ|ë@*ŸBš1íØþÄ»×89ÿ ±½ƒÖ´* £;ÓÈÛ5…=ÖÂtêÚî17It°!‰¬>Û.Hÿ˜vÁ»×p»ÿg»`Sú/þeíõ4íLµŽ'í‚W¶Ôû'V{—»«ËÛ«ËúʈÄTÙǺS—¹ôUãš%Pn¹DwQm¼I'`l"\ø¸š…i¶?÷|k+áó²îÀNi¾…²¨¬{š4õС[Ò³Þ«uÒ"$ÌirÈÿ|7 c%‚ù­·F…OÒ$;lU¼CµšÑM[-&LœÄPor1nl?÷pJW4wÜøT(As‰³—o—ø­¿ï”’|×f9uýÍ¡ßb¶i¹lË¢ZV./W)ƒ¨v(=+‘ë¡KZõz)N>>ÖX‹ŒO3áíÙøÜK³Xêl_ñÝ÷üôö{ŽéŽï„X²,ËÆWþRÂ┈RûlhûüäãõÇ5¸;’¢l%tÁ…‡Db»@NW¦Ò§‚ªãŽ^mʼ~n>Ôh™Jþ2‰~‚ò'ŒGÜÍëÚýÆ´²àuNœ`ùÙ„ŠÚÞj¨T׻Ũ¨(­ÅG9Ýfßlj›‹á[9Ôðp·vtð‹Ž‚6·tyó}Ù 2H4Êè–ðŠraÕv=MzÛ Âbe1'Ur²ýl™Ô_R{¥¤±Mÿ!Wìvþ4“‚;;÷7¡ù¾‰~¬ÆY ‰¬Ýtñ(úépÏéD\­½ÌÐráÊ~¬ÕL´ݺ_Uô“‚ÅG!ô¡,»U³[Ûö3Èß6ŸFiöv_r•µr[³*“(ø7ýHØØdVCbϹ4¦p!¾Ð´Ï¾Â´£Á´ö—Œ}Mº%¿ÌÒè G6n~û»O„Ô¶‡#öÝ ×1ŸÛ_ºCבœºÎ¾[I?Xq™ŸBô+­ùÓKkz¿òðbCåÕ.l³ImëÍõôŒ¢oZæ:!ÿ|©ÆÎ endstream endobj 512 0 obj << /Type /Page /Contents 513 0 R /Resources 511 0 R /MediaBox [0 0 612 792] /Parent 518 0 R /Annots [ 516 0 R ] >> endobj 516 0 obj << /Type /Annot /Border [0 0 0] /Rect [313.3728 385.9278 495.0282 396.8369] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 514 0 obj << /D [512 0 R /XYZ 90 720 null] >> endobj 515 0 obj << /D [512 0 R /XYZ 90 668.8958 null] >> endobj 455 0 obj << /D [512 0 R /XYZ 90 640.6351 null] >> endobj 517 0 obj << /D [512 0 R /XYZ 90 350.6933 null] >> endobj 511 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F67 85 0 R >> /ProcSet [ /PDF /Text ] >> endobj 521 0 obj << /Length 2359 /Filter /FlateDecode >> stream xÚåXmoܸþž_a´N[X<ñM À%M®-zÐEîrªìÊö^v%W«µ½×?ßy!µ’,ÛëÄ×- x)r8œ7ΞþõÙëÓN«ÔC#ɧ¹RKÿÏ"Õ'Ò"щ¦Hñ“§°±"S™ò߀‚Ò¹èíê“Eí)–Gš¿¯f*¼I‚qnxé΢zƒSËv Ëu6Y+˜Ù–´|Ì<ëjµóÏ‘ª^{–UYá±-“ ç /æç×_ଋÞóbQá‚Ç?2Û¢)ÑG&¹QÙQ,µ6a‡×ëeÛ– ”-×°·f0 6ÛuIÄÑxXþk jksk²Éæ‚§Nl²=†W0’L1‡Ý nÝ,0rPÊ¢õ›é¬š·¾ç©†ô8g®QTÐúªFÇ_ "‹m&Ò$‹#™;ôV˜ƒoÅ?feÓ.çÁÆ@d£K›?sŠ ‚bŽâ]ð Ç´×´ß´~}Ɔ~N¤­‹–ãœ)à¥p¶|0“J%FXÈ÷]vÚ,•žƒ|‚‘RÂ@îºÏ<ÌÇSÌ‹ªª[–žS·ûÏÜ»1VÎ e23tçeÓ©Eÿá.»¨ý:—nvé)ŧq!>ñ?ƨD³á•릸äLD)f–S€–$º¶IÔÝ2 í¦$wc®€èÆ gÕþv‹n+Œñ–%Ç”!¾Á<͹¶i˪—gHÕþ”’f±ê»³\w®6t®7”ø`Ë“IcJ®TÖÓÄr$>¤€³ÚWÍbµâÁ•wª3"Ïôc}zõß÷éU­ÿÀ¬çãv-”Ë ìà/f‡¦Äؼá‰9Z†ø4Å06¦ [L>!:ªBps"ð]‚Œ^`HIŠD Ÿ×«º!`o¤™ÊMȼwzGS®¡ö93B1¯¶?¼î"ehãL8çBPâÜ0…¼rarãŠyu'Oƒ±2ƒ÷Rna]ç W*¤órqCºò7dYïï'®a‰Ô |W,Êfã—ŒÊÈçe3u¹Æšì~ÜAíïBs@‡D %ÕcêÕñH­.ÝlX~ ;Pnߎe0À0¾š D…÷TQÓÕÙqJèT í…¾5¡ÿ0ÅÆ¢ ÓûUw"uˆï2´oJ0ÎSw«Q„pŒ‘lR‰Ñ?ttîó¹W÷ú{Çãn‡$®,KÐ4~}P¡¢S–›U‚9³Ä©áu¹Š×p;¡«ù% DNŠeã=¹¥O˳Pž}¹ïUÅÚÊÂ'Ž^úô0 ¾?á÷ŽÇ·ZqŽ—j9½ Lè}_ôôGá_VÃüLáÖÏ{Ó÷<Ü0ˆ5n–Î*Kr<¡Æº?!°s—‰Ç¢|4T©Á”"—é-t?OJŒÂ=ôG°Cs-T–ŒJ2 /ÇÂ˱ðr,¼üí…— O<4°Nû÷Ãd¤4œËDìuOÓÊ ÊŽSÁ½ºMÇ)ôr"·F Cî»Iž`Ùu T‚(À_þå仿ÿ8Å=µÒlØÑ¥Æ:_¬§š¦bÎ×é²-P¤­xU–ã÷QÀ¼X³#hšaàè¤åÞ#iG÷ '^Jo3D9ß•ó–€$JhD?¼\Vô¦³c¡)óã“îGL­¹Š. |ŽÃ%«Æ²ÑÐ÷Ešxàíè’ý6C.ùqž(êt¹ïI»A–õïFå¾ NTcxøDe[Ý_»raeÒ=@5>ëjEýÕ'̸m—WΕ禊ýbô¨Pïqq2øèµl„eà¬Oá|lC÷Ò{½‡ß¾̘€Ì|w…BÃÝQ:RÉÝ·ÁD)ú¯±–Á yùv ãýs|šµÐ¦0¨¦v2Kñ1 Pi½­#Œ?g2œVQ=ƒµ›r3e4ÌKÐ4jí<(!|ª|£©¸ÑT]ùÛñÏGø%ܲ‹k8ÌÚèÿØðœ{/Ó­',>wÐ3Wæˆ3h¡÷ð «Xïš‚ÀQXåL“&z ¡‰} ‚ù¶{ÐÅÏ}Þv¥:E}_7ý$ –EÂË)úÚ/ \Ôg£‚ßâ1.êÉ, .öïeÑw;ê~1Z‹›ç“õÞ -‡› VÞOeý‘f7SìRár.ã‡ä㥰 …Vb÷4l~ýR6q (0ÏÔ£•“O£œ|å›Qqu ’E6ª­us`$˜ÿ¯P²¹þâˆr©HsëþG"ê+mtG`B-œ##}IdVFæ ´Û“,sº<<üžôùGO:5ì8ЩîPËtê£Øüú4l®bÓõwÞ€ôѶ’Oc+ù4¶’Oc+9¶ÕäMH§.Â÷ÿì endstream endobj 520 0 obj << /Type /Page /Contents 521 0 R /Resources 519 0 R /MediaBox [0 0 612 792] /Parent 518 0 R /Annots [ 523 0 R ] >> endobj 523 0 obj << /Type /Annot /Border [0 0 0] /Rect [303.4847 349.7624 491.4325 360.6715] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 522 0 obj << /D [520 0 R /XYZ 90 720 null] >> endobj 524 0 obj << /D [520 0 R /XYZ 90 328.2001 null] >> endobj 519 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F55 36 0 R /F67 85 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 527 0 obj << /Length 2548 /Filter /FlateDecode >> stream xÚÝZmoÛFþž_a ,]Íí¾“ QÓ(É¡öŹA–h›‰HʶÒ?3ûB‘òÊ–]ã „+rvÞvæÙÙY³ ÿØAJb!H*ãø`ºxEÝëo¯˜E@õI&§¯~ü¨Ø£$¥);8½09~ºÊ–c6jóqÄFõ8BŒä›q$¥}ù_>ý_ÊÑGóÜÿH䨪YÛŒ#.5—#ÍÇ_Oyõói§Žâü!…‘$ 1ïkÌ%\ÉH„TFmYN&_~C‰?~ÔqŸ\ÀaŠZû>ÏŠ…%rå)IÒ$r¤z=UÔèØ>Dˆoäg ØÏB¼5IÒ±>£_Cì8‡a’:¢Ûça³~6ߟ‡ÍÍ^lŒÇ !AŸ3®‰J¤~)§³çq:{§³çq:Ûvú!"¦DºqzL¨ÐÌL;½ÊkÌ~0Ðà“ŽÊÊ>'ˆ“/cžŒ~³çeVÃcmi. ZмBj²$!Ziæ•!íR¹ð P„Î s±Fùym¸‚7YcÇæóï” TŒ(‘°µj-Ì»¬,J ¹ôò%ðGñÃÌ~¶_«õ<`œ$\ðal¶(&r¡¬`+¡l ˜o6/ð)€2·/ÎÕ ˆË™qÜåæC<ªPÝÛ7A‡é„¤J ï° &&a›X»24©±Š¥³ÖJíô’ö1Eêj±´Z–Ö<ô OG­cpǦk³vOÝ¥0LrG½È¾ÙÏÖ”&AáW Oh>Êð[R„ Œwݲ48@We6·tÎe«ÞªEοÆ€ ôüg7|Ú@'®ãøþHÔI¬ˆ2êZg¡Üÿ˜õœ¶fÝQµ›Ü•ÆD‹D;F僢þ 2!’I»7G“4M½¬Ïº½q Ž'°Ñ²¤“gÔDY8‘bÄ8ëM˜XŠ!`lBÆ6$ê½¾ øÐØÐʧ~M We>ÃÜ8Ÿ]^Áü¿æî§8†e¿î¢ ,RƒDI%IX|×n¾e·Z:ªBŒ‰AGÁvTʽ秊I 'Ué §9Bƒ!¿Wí]㶦ôÒÍ€’gmç«[—G"!2r˜GVO¥²ái(ÑJª.ó2¯VŽÀ`ÖuÑTµýý;UÔ·JºàÆÄ¯³¦u,«-ÖUmQ —¥^ÛwbÖc‘5H©éèæÊ›WÛ¾ôÎÀq@K´u«Æè Ù}36€!2³oÎ=ž p!0¥ŒPJÙÖFºµ¸ º—ó _ ö-qRÿ´ï§AðL =¸—¹] Œ¢ Êî „A½É!v¥’àlnþxV—“ü{a76«ÑɪƟ¦™Ö„,¡fw×B$~w·:O+£›M%«faô6+¸I¾¹#nVðKßb"ãÏ \-· –Ig£LkV5~Îlæ÷Y¹ÉYí˜þ;˜š1…Ì>7Éùù2ˆ\¦òÙwhÅTN…0cp¹HUÇ7ÿ¾›¯Ç×CbÏGï{f¸˜ç͇F`¿K‘B%K·*Yç@;ÑÄy†._»µèå[f’^:¦6ô ñ²ܸã§¥Aá)f• °&á”%‡EÝÉzìƒ1 —\Á†“ÎNN¿N&ÿ°EdTÕ‘ýôuòó¿Þ†¶²•”7?¯‚ùÇIÌbŸ~Ç; Œ<Ÿëgâ3ÛƒÏÙ`¶]K–€7ÔöQðõ‚†hŽv³Q÷Û ð¿ñ±I'\–•[ž jK3¸ŽfEÛÂĘ£8â‹Ú¶Æ/«ùº¬f?þžå—uŽ)‹?0$ñYg奓ÆÑ!ˆ~ýäU0Vù ÷ÓŠ@SQ¿qöèXDŽìËèƒãîUghj6G¨u;åð$¯ûã †øãðíá–óÝ›YeŸeÕ:’å2‡ÏÀ1­gT”ËUK: èÿ.rËŽÀ×\f¿<›^9ÙGÇ›yî£iZ,ºÐ*.‹ÖBU¤%”ß, †d=x¤tî],çEÞÝH“~å·ò¼{ªËåÔñL„óYµeºËÀ[Àzç3¦`8‡†k"à¸ÛwÚûríâuµ8Ï]˜â^a’6Š+ŸÔÕ|^ÝlÅïUžÍÜNFƒ‹‚it 'O¦áþ¦Éßv1´5:Ûc%üz†Ú!Ô9m]Í=ÊeëN51#\Áá'då&˜ÝÂTΓÒùn^™Ž¨ ÷é as–7®¬¶=¹+ႯáÀ”UBÍ•/IÐ]«wôèúõ(³Í_s<ûy$} cvD7>ÜѪS1ÐæOàþp¢ìƒ};͆òY!hòtÇÒ#CœQºË±}Dòb`›ýÁR'I¼Õ™Ú¡7nƒóË)¿V>ì\8$©é‹9÷Y¶„Þ¥)‰c•x¨–}99uˆ‘ß¶+¿N+&YÛÕ^»¡Âò&Ÿ +`qåd0̬S»ª½7'÷¬3 ÒÍÊP|GP°E%ñØ+žæ×%Õ,`ëUõþ0³±a·ûÄ— °=yF¶)lËöð ÄË$l?Šª`í##ìÀ`÷­ímÓ›º…Ò«~µO®Ârå“ÏÂyU7÷”A¾ ØT ƒš£.}íõó÷×O“÷ƒde*V½·{”Âs0’…µØ£P{Dr1àx/k[k°‹·À'*†¨Û¾1k\·K2abÃ]™"ßÕù²vD¾Á‹¯!Îæ¶ÞÚë GŽ;>'¦¯÷½ð—ö’q{‚=Ïú"›‘rÐò­Gl>K±á5ó.k?Ê;¹--–¯øÔn6ˆm`ø®R/,|LÀÁüƒø¶ ½Çq/Íéܨhè®jûXÁÛ6ÚÝÊ2‡vž&>uÌø[w µ¾Á!¶¦á¸/yšnZï0¶ýËE¾jÓ$îšÃ¾)ˆÂgYUï«4¡¦ïiœIŠ aùÑ7»s)ͺÛŒ…þZîhF긻{â:HêC]°J@@&·AQØî¼¤^[šëIì ™VlV»‘oÎvW@iCtmï,Ìåq U´ÄxÈ-Pî3æ=õc@[¦ˆŒc_•/»\wwi؂֩»ÛÞæ/5Qº«èwĽ-ûãp#Ç;ŸãzÒ? Æéôç©M£|·–jê.ñ £V×ÁËÔaé-ìÍ»½žj;¬´òÚ+,„vP’MqÉ®ì·Äš¢œÎWæb§ÇÔÂʪÞÜÒq¨S‡!¸ÌçêfØÃ“Î|´7Ù½‹Á¢û+Œ'<* £_Ô,Í ºË{;¥6÷dî ÁŒå“å&/> endobj 528 0 obj << /D [526 0 R /XYZ 90 720 null] >> endobj 529 0 obj << /D [526 0 R /XYZ 90 549.3026 null] >> endobj 525 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F67 85 0 R /F55 36 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 532 0 obj << /Length 2542 /Filter /FlateDecode >> stream xÚ½Ûnã¸õ}¾"À>¬Ò¹¢Hê²@:ÓI»E‘)cš­b˱:¶Hv&é×÷Ü(Y:É»ÅEžûÍ£Ïbø§ÏŠø,3F6ËÎÛw±l~§e5ˆÙ1Èûù»/>Ó±*âBŸÍW#$óåMôa]>œëh_ÏtԞό1‘ýé|f­>}‚“?ý7mt ëzSù—ÜFM»-÷Ýù,±ib£ÔœßÎÿòîã¼'Ç%Ék#ÈkëØÂ±=Ks«´±ŽÈž¯+¼`“cØ$Q ‚ÄÌ›€Œ tfrxh+bý±¶°~þt5»vë”s+ß¾ÿø÷Ãã.t…ÉT…ÀÕ;À»¬å¾ê{•|É¢Ù4mµäTB¹_œ'Y´†åîðíbsX¢äÉ=ƒ®š*J»¨CÊ«}'D¯ä@d¶h¶xþÊ€£jwžäÑ >›é¤P.‹SX¥]ÌÆBpM¹§ûîgòa-ßÍ—D ÄØlð†Uï |äâ^ŒK¦=I‹è¾ß¬v´•Gw›ƒß“’„øËͲ^BÍ;p5=÷ mZ´åî^–±RZoL I”I²¦ K‘-ìha£ÝyjT%ªt#ãcÛ›éT%(¥«CHé:WÖÆÞôÊÝ2„.Ñ*¬ïê1ˆ¼ÁÞÊЊl‚ïC#ÊÁ@SfÃä)É¿¾¯÷ ƒòC Ôèºâµˆ—Z)8Hé PE; Ù¯ýÚEGfù}'{ Æœíày×lërÃ.«û¶5îØÚÒBÅ8øÈØú; ž8ð ÔhñÈ⦭H[d•ÍŽÚªL[ÎëG´ÓjóŒ±éíÊ\žR¦sÚ{0rm³b›GähÍ[”ÍÒ29¢MÅʶd¤šhÖNBí0gÞP9V?¡Ú\Ü{Â-‡nÏ7QüBßÔlm(¸«•Ñ:žM8v:{ˆUÓò­föGá;ˆ C%‰6cõÛð&5ã @Û(öfÛܽÏ6(ýŽí‡%Írn—dyn9’Ò]¹gðš¿ìÛR¬‹ì6ŽUPu*Ä–S.'Æôþýß‚ÖT¨L§ÆçºÌãšÑð[Œ`&‰îêÅáiYðÁ$-ãòÍ—z¿æH¸`;i÷õ‚/8þu,`¾Ì@éÖ§ªéOè÷!DZ«XéAŠÁÔ˜ª¼ÈН¢ä˜ªXiÈút=?A–ÑÊÁ𾑬rL2…F°I¼ž !ôe™Ã™Q6/ÜXÿ Fed!¶ø·÷D*±ðC>‚ÊÍ9}m6 ~ý…·|ôIL1€—Ëq ›Ym¢çÇéŽoéMŽw|h¯j.#äæ’]´>¦«§{£pg£äzÇÞ#Y¯(xQ@ýïDЏn&®‰åFw±ç"<»zÚÚ!—¼ ÆÂ=y1±1¾¯¹¸¿@½(¤*jZWØDBùæ#*&ç:dêq‡ÂUVÝÊcY®’<÷VÝ—#É$×%6ñ&ûCȪʒÌ{µFn~wêFˆCIÒ—-Ó ó¡´yã…Ìó4lñ..zœáæì^þÍ5]‘¬—U‹!.Ó>ÄÑQê ËŠŸ_ÄN¨#Š7Ô2™èt–³*K›zŽþ:±ŽãØ^ïñcÌ&Q ΗûþQ=BË]1ôœ§è†¢:s.{Ùnìð4*6±ùFYä2OA…T­èƒ»à±:¾šrq)ž8¥­Çfìñá£!BµúÁZ ý(ÉìP9g®w%ÜWÂí~\”Ù錋gUhÉ4wK2Ã+0MŠÜàãÊ›¬wDœŽåiÄsnge믙å^ý"ÈA¯:M£«ËÒ¿¸èêãò¾ ¶(:Žláµ&¬<“Ñ…‡}‘h/ÖÕâsµ Ù#žAéibÍŽõ¢!UEÞÿVs߆ð%¹Æ’Ï¿ –ÿ¼ ˱†™è¯éºúΫCK¬Ý–?wÁQÕm BN ‚ŠŒ½d¹«<–ZTg h-†µ_—Þ|ZêÄÆþÝØª¨¢ë[ÕO^ËW‚ùƒàÄ~ßMØJGlÑÏsÔ‰eüXÕ43"´4¶ÞUÍ¡›à} Õ»·PjK³ÙkáD<9–"Ásìcgn•ƒ¨ü²`ÿgÓX™Tßò~ÐSí¼H«4æÓ«'BCTx=b÷ñ/4ˆÑ RˆG6Ó¿Jˆù¿‘¤_ XùoH´² Ê(”‹rš‘ÿwð_*„õ endstream endobj 531 0 obj << /Type /Page /Contents 532 0 R /Resources 530 0 R /MediaBox [0 0 612 792] /Parent 518 0 R >> endobj 533 0 obj << /D [531 0 R /XYZ 90 720 null] >> endobj 456 0 obj << /D [531 0 R /XYZ 90 341.55 null] >> endobj 530 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F55 36 0 R /F67 85 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 536 0 obj << /Length 2895 /Filter /FlateDecode >> stream xÚÍZ[Û6~ϯlF^ĬxÓ%E’ I³( ìK6ÀjlÙVcKI3Éüû=’¶zfŠ>l`L‰äáá¹~ç(ò"…ò¢L/r­Eiòübux–º×_žI7ZŠåé’WWÏ~|cå…LE™–òâj3!rµþ”¼ÞU7 ™Œõb)“~±ÔZ'æÅbiŒI>|€™·¿áK“¼q³¯ýCa’®?Tã°X*“)“dfñùê_Ï~¹ ìX¥c—D8V§K“ £mv‘FHm,ñýžöã›,Ÿ,•ÂXc€6.yÇkfä wÓnÍÏ àÁ5ú¹«û±YÕ?u-ÿŽ»Æ½ÙT«i^,U)вÈ/–R iÓü©éžwAiUö½ êŒ%GªÒK.ç‹o|èL³¡Ñ¬nûBò»ÿŠ?]¿Žò)NË4{˜9™#rñ‹ ~ë¼Lš‘ägöì(Ýáà Œ­–¹• ©ÆÁqð¥ ïöɨ¤rD¸µ"©ß;ŸÑ©(R%§ÖQkHŠN!óX…úÃçj…êÿâM¦9j÷‹3*t5ɎС½¬Ï«õjL %›çÉËß_¿#~ÇÏs.· sOl Œt8÷õ…¬¾dVP¸(ôÜÇ#ú@De ëv=QÎ…BlèèRQS=@ê” Å¥.Š„"Ü:F²WiÓ€~Á°u:ˆQÏD`¤!TØÜb¨¨†™B¤ãÁ¸sêíÿž}ÏÖ¡H£f¨óNu%hsx±´äbÇ?ËÔ_”v†˜¶léùéæÈÇjlø”ý=j neÀ¼^ßâ}í£­NM2t›‘lÿð5áíš‚ÔÒó9ð[ä¤sûnÙjYB~®g6ɾwµ3óˆŠt©„2¹ù:Ê•ÒÁÇIÈ•³b°q¡¸­ëu{¹ ¼®”DQ´ëƒ×¬Â `3©õvˆm½! òÍYŽù&&œ¬œkœFßpªpDÍ®ÞPêÀíà¨9ØWñý LhÑÌÊÐ`AŠÿŒ:…J…ÒyvÄÐ.a¯ÎKݔ–'QßÆÃœÕn—.95!oÓ%m–Ü ¬®°2¹òp!¶ËÞ—ó€ò<Ÿ!æpƒ÷mV>7Ž{—^(oàcyÊÉf¤pØÝnwÑÅ+#ú/…´¥Ä ¡3r’æ˜V8•w.ë5.uÔÍ)( )Í3[¤A‰¥C@\Õ¹Õæ¸š<.ƒ¦^;L]B¥ÓY̹öÉùÌ3 M®ðÅ®ê«ÕXGѳLåi 41AA¾†ÂÁ­ ëté—5ˆP‰} PN…èJ˜"4ÎÁH½ÒóÑ´ç.w’?Q¬ÂW„6J;sUî¬ù|èR8…ûä4ÆÇEs&€Á†Sº_•¾ =«¾ñ˜‚5î!mÜ4«jÏÞ7cˆ ­{Lj FýÜ9ûæäÁYBÏË|ÎÀ8Nø # ï)2éY+fW ^nNh®’9Ó—ÈAdS‰½w½ìÉf&¥¡ŠB¥ÈÊÐØ8ÓŠ™¶vÖû-#¡X õàãíª¡c„|/‘—}ŽYÚR>Ö…¶ÓJõ×:Xï4ÈZ¡Uæ)¾¢U%¬¡ƒ„*%+çPM"~Pez?¸E­'ép¥*Õ©‰dH‚Oi*¤ò©ÙGHMË)6†½ÆÈûs¡×¤"/äœìû3xOæ¡l&L‚7jZ ¸“ÛºÔù;“ƒ03 B}:ëí›Á¥xcZŸ&ú]Êx_ѾŸŠÃÐOƒg(K¬Ìÿb¦9[y!R›©Ä …ú êyã'ƒ=ÚæŸ3OO•öZ E±.”›>gh•Ü”p(Ž$\\(²¥I~£ Õmº¦„P}ø1DS¤×l[ŸÑVU¨@tΆ%cHþ14 ›BâyìrK“Bè×¥™Ú„kî'àù,EÞzZËâ-m loŽrªsˆ´Yùd7Jù(Vµk>³&§ƒ,¦"':5ä7+Y~&[–z²›™òOÌäÚÇêÆW®? ÛmžOeÃþ¸×aTjZ¡€û¸ä\u—ÞG\ûö³J]×þ‚’hÀÖ£3êÌÜì*¸gåÓ OAäÁGl¨<›ÝG¶þüU]QĦ·ÄÕ'…QéKÏPµä^ØýßQ"Ò—Õ"ã4s"÷ᙿO{çÂ1øËr®p˜p^V ˆ7Lîn8~ÒÀU€èíí± gÑáq&¼®Ö¼eC(ãð=+ÔnsãÿF?0Bܲ6õxe\ˆ ²sÄÉWÎKÇmëDþ—êrVj½­;Òñ]èj½¸1e'3sJïÄëj¬¢¡q‚Š/™Þ¤´¢ Ç·yr¥“ß1 Óç£ÅÑJÌ[´Ÿ»+ùÚÆ¯ž¥4†[,`nö÷\õóËŠNôO»è¾ùâÛNüq:VÌîÀÙ¥^»Î1˜Ö#=]údDÁå aH|±j¿=‡Üúxœ$ :Ißi-=-?΄޲(_<Ñ)û¦ö¨(“YònÃ'ÑGøåúMRïÜLH`éñ;T–ü1éX•îÌÀãŠH+èr©åà°ç÷¡I5£“PEåvÖx ‡BåæÖ]Cí”ö PgVÌ{E˜ÌµËÁÚÆ£ôÒI• "Ö©)I 0å ‚Ÿ®o”Zj7¼Œ#ƒ¢r Ðý'ßbfÇPÙmJö`òDÓ‘o; ˜Ûž »ÆI(>ò'-™¼}þêùËŸE–eÔ®‘l¾øpþ‰ ¹9 endstream endobj 535 0 obj << /Type /Page /Contents 536 0 R /Resources 534 0 R /MediaBox [0 0 612 792] /Parent 518 0 R >> endobj 537 0 obj << /D [535 0 R /XYZ 90 720 null] >> endobj 534 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F67 85 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 540 0 obj << /Length 2542 /Filter /FlateDecode >> stream xÚµY[oÛ8~ï¯0U±Ê»¨ÎS´³ébXd ¬â(±vd+kÉióï÷\HYr䦺QyxÎÇs·<ð'rq”iæ&ËŽ«W"LÿýJ†Ñ V̆KÞ]¾zóÁÊ#)Ò\äòèòvDäòæ*9[÷Ç2éÊã™L6Ç3­ubÞÏŒ1ÉçÏðå÷O8i’0®ê2¾x“4›UѵÇ3eœ2‰³ÇóË?^½¿ìÙ±J=Ç0.yŽc) |6GΛTjc‰íS< VªÑJ:é Æ%W—ó«³ùÕùüj=ÿüáËöîãùéŸÿ »Ççh›ŠLÇí·Í$^!,Exä>©Z|æI±Xàtyß•7¿ϬÉEY3›šL ùàDú<À _7.œâ)Aäó¢\tU³fa>õ<¼zW­ á‘™¾…!ÝØü9=š)Ïܤ¬÷Åޱͫö%’Ê¥ÎHuä2àÊkàVûu³á©«}BYHR%“òá“MÙÚ«c•%× EMºÚ2—Ýfc'’Ó Ÿ}ôÉGþ¼w‹H¯Zó³¨iºi»=J0þŠgÇ@ç‘'qÜlaÅëÞNL|ƒ‰{:¯$•èNûá¥B»Zò~­f×ôίÀìéø@™ÌøFt„mx!wåEÍâ ò¸¨û„N&Þ˜j0e†×®oxá~.7]ùß ™ÜT‹OZŒsü˜îxü—Ï'‹'n˜•§T¦­H-{ +†Ä»Àn»!ãåI¾h˜Òæ]ϺèPÐû4ÁON†w¢n¢ìƒ¥ëÔ»ÏÕí”QB¤Â <Á: ‡¡ }\õfŠX˜5.¬8ÿItÎò©Óî‡é\\¤d€\DWø¦ìÚ”ÃÂØ¦$Þ¬LƒK— e2¸Hèœ ú=Þrt™hÍ"Œ“.)‹Z‰‘>¹-X_ó%FWldþDeq®õ¡ÁmCVÑà²àò†?\KÆCŠuOih‚`f㊎Fw<» Dé…E‡ýèHnÉ!jO}kÖ¾ †´-#KÈ(èLæ å5!¨4«ûH™¦«Q·ruBiíwÄ]·âåˆ*9Í-ãÉÞG£Å¥%¿ a£UŸ0ad® ë¦ Âù‡cëÀŒ¶ñC›N™ïåwo[6À‚ Žø®ûÁ » jE±¾C’ulö6Hk’Uu·dVèÀáá"ÄO¼t:±´mŸfyîÆ Z­;Œ9ö¹Á„”¶™Md6<óðSö…$¼µ{l|]VeY² tuÅ*Lc(ؘF¡ûÁȦ³¦!+ù‹¡ÁmÝ?0Dôlš©L=…‚ÃaMÄ8Ô‰~%ñ€>ÿ•ÔÚ¤V9 N3)%iÈŸ©˜t:ùòþìC“K>À5 ¾íÔÕáýgàgC²r¹ì¯Ôk"Ç¿¢\ã–ü¥tûXÍ9¬OÞ È$„ n˜œrû.µvò* nvÂÜ.âý{ê È|}ÖG ôRÊÃñ%²ó:ø|%²TJ§Æ tñØç#Å··? w ç•™ïÄtÙ>ð­9ÿgS?ÖÕš²Cé\rþâD~·ÉùFPÒ ï}¸ó@8eóDšN1Âñ:.Z;Vfr’¬T2µ}eñ Åz»ºFŠãæ–ŸQdÚ¹T ©ÇbÿmŸ@—<º\ût‹IAD6êùˆœiiŸFd (_s¿à®ŠÅ1Ì}­¸Q ]™üM¹ŠòÈ¿‡zxŠ3¼Õ—?ÆÚ¡¼Šu°N•QQ†“)Š.õyÈù¬ÊMh³‰ Ïò±öv}Q9…šï¨|" ŠO Y’’2ªÈ y"†O!oí³.°o“”›rŠ*d±à˜ÜC”¥&ëS5l\j“…’¤þ[ªâÕ ä°qä?p]o˜ì€Ê@‡Zh°¬§G*^NÞ„ô|…±{wA}€Åá4ÛBPô* Ð[…«m:H©¹Ý‹ÔŒZÛü®pà H¸AûhÈ ü? ƒ{USIJ—óçoLÒ9™í ~ˆy\áÿà Æ4(T³´q×v¬‹o\K耤±7朻½Dû¼üÖ »f«I­³K û­Ó{Z§U߀—ŽÚ‡SÚ‰y`ŸJ=m3´S¼Ì Üæ"Û«(“Ÿi—Á(\ÉþíJͧÎöy*ŒV;«W²{L]wžB±çéþ'ŽR¤-»4f\à+¨6}”F¨ßU´—ºJÁ±)ENr§¨–¼‚¹Ì‚®ÆÀÙ `žÊ»5¯£éASÍÊ!@b—; Ï|~Ÿ:zU<.ðvМðÈÐ0‹FÄmZê´ñwš…Ô (ê®_¦÷<ð~ð¦P×c'ÐC±n˜4@…¤a-Ý'>u9‹á¿úVÖ¼gíAdðá\±ã×§&R4Œ‹ë˜ŒQ3qۅűçÅ·N)#±÷ãžòÜà­Î „âÍØÂù¨›û½»¼ nŒ\ùß-»Ä‰XD‘îe¾×€ƒXÔ›lóÔåÊNyÃ-ÎiùF¾ãàÙ¸å‡êUÓC½'hzÞÏ€ÿµÎ¾ÌÏpNJ¨]][ÍtíMã¶³­ì=<ò]³ÑbMß¾­© ÔòV ¯øiÐ×;CÆŸôF†Ì¥ Ôì*×{UÐ9þâW×!®¬w(Æb™³5˜kùÛ¾áéÓ\q_G Qz”1_‘±m`Š~õA]ïw/*L†…,¾»ºe(ŒWOò 0Yï³äc÷z· ÚÐos_×|`ô~p‘ꛣœy¦hãþùÉf`YûEÍ}_Y`x©šm»W²ôœ†Kÿòžb endstream endobj 539 0 obj << /Type /Page /Contents 540 0 R /Resources 538 0 R /MediaBox [0 0 612 792] /Parent 518 0 R /Annots [ 542 0 R 543 0 R ] >> endobj 542 0 obj << /Type /Annot /Border [0 0 0] /Rect [375.4724 681.4072 522 692.3163] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 543 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 668.8626 126.6412 678.5595] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 541 0 obj << /D [539 0 R /XYZ 90 720 null] >> endobj 544 0 obj << /D [539 0 R /XYZ 90 519.1532 null] >> endobj 538 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F67 85 0 R /F55 36 0 R /F53 197 0 R >> /ProcSet [ /PDF /Text ] >> endobj 547 0 obj << /Length 3034 /Filter /FlateDecode >> stream xÚÍZ[Ûº~ϯX •јER¤œ‡$MÒ›âd Ø Z[k«±%Wön²ç×w.¤.6÷Òâ)XQÔœÎåÒò,…?yV¤gV)QhkÏÛg©ïþúLúÖ(æc’7ÏþôÞÈ3™Š"-äÙÅõd’‹åeòv]îf29T³¹LºÙ\)•è—³¹Ö:ùø¾üü7ìÔÉ{h×›*¼8´Ý¶<ìgóLç™Nò|öåâ/ÏÞ]ôì˜,{Œa$yǹÓB*mˆc ÌY—&¯™Ù=2^7ÀÝ*p·h7­¥Þ¨vÀ«MHÒEýk*5 ¢·%4Êl’‹5wâ<ô­™eEr¨;ßÇs´›; ÛÔM5^FÓD]9Ë\òÇBo†ÜÕa]¸E Tèa.N:’®¼Úÿšš?"ÌXY*Ò<Íažß^Ö°ÚO9QY¦„NSé)a>ÐY‘Úä]¹@ÞÖ ª4É-¶«îP}ç÷u¹çFÉÏäÏœBÃAþH§Õ>f…º6æºêÚ ßíyµöšŸ –¶ _5?À7M[H«¹WzÌ )¨nÑø®Xq)ƒ—ÊÕHØø–M¨[Ò”°{Gl”› 3‚¶BÚ’ ¥B‚̽—©lš4Tò§!Kók†%R¤ÂPñ Ù$Ã[2i½)ZfVdYgúó»·QÍJØAg=Ùà–Í” ôÓžŸ²ó ÍD·3“ƒÜ7¤ è_(B|ðb^¬+þ‚±³Ûøå¡ˆ‘B¼BVWF¸L«q¼ò&k…5öÈÇiÓFÆF@בÂ'ï>Ê3³ðÁÇ’¾Ã/NÝ©aÏ€Þ‡”F¤j“åS Ï<û:0í“UÅѪñ&ƒ|4¾±oùÙ»6¨Œ5-@OFä989.óžäÓ¾‹±®°¤BŽ8‹q1îÆZ¨\™S?ÖEJ{¡9.¾¢ãÂWðݘãjH$QÇ ¦ê']Õ·Þyð­giØ(ŸVõT¿Âí¼©x Ò56mÖ%+©€°‡[5±%ÜØ©JRw}À…ï† ^Ò'#ÁÐè_FÖBÁ˜Š»¶0cï ‹û|Á cd°¨{m½Üí0¿ÜùÏm0¡)KdúÌRoþ„^|nzµ,ÍfçKB´)´”Sãz•)uȽæÛ’7Î_ÿ‚Iã1‰V…A½G`òÂÑ ”†mX,|š x-â|4 øªÏ^c ªp³óÜž“ €‘‚LX>€hO7FÐèé„Èõ§j™–¥ÕØ’ÂñÛåH8ß*xŸ ÷@;’ª\U,ªÉŽÑ……QÙD¢îéätBÍÛé9§a:öšœ¨®™”ˆ¤K®Ñå±À×"©¾³3¡t›@Òn6-¿=õhÚ¯?½ý@qù¿÷ó½àð ‘'M£²9­íWzS¯æï*• SŒÐò°"P€´ß†¤XE!U~¯2k¹*˜…;8zmgr†Ðµç¯à“C'̓¢#ùR€$‘¼¨)º7Âjr¿ÌAÒCÌ]4eOÇ* ÖQÄõ ‚Õ„¿oë ãffOÏŠœ :„bÎ,*Ÿ×zª«^в{…hKáÆàÈ+* +M“7P®Ó'¬ >‘`H¸E© üá7Žïå†ßN¢0wŸê[D5[€gEP؇Ÿy5(heqÌQ4ÇžóÓ—Ñ@å„-B'0Ä̠׃ßY{ÊBgÙq‰rãñ4-C¶MÕSj< È#éÄGðl@>£"øáe*E:T‹˜êø‚¹xX+»*¦k@Í™ÌäãF,…Q©Ž1UÔ\w÷Nìwìt™Â48 ˜'¬—!(rÅA 0ŒÊè¿€«äÓ_ßá9†5€Š°{ãíˆYËÆ¬a\°"WŠ+$yŸþ]ÞC:©7#ó„€ †v6è}Õ1˒ͦêC%ä?’¾uÉ?ùe@„žÑ,F¬šÅÂRõq ÷kØ/?hd¯F¥Œq©ÇøÄ-;Pãôs¼ì»¦È>ÛƒXôXPMÎ>Á—‚{Lñ6ÚèPÕÜ«÷\m²ûôŽ…ð¬oþ3¶Ž0nûjVì¿V›{€X®ò`ÊhÈdÂØÔMÑЧ»>æ–ß_ÆM9cò0LѰ˷_.õ—ËæKö8)]òT7ÆÕ¸°YÿÏÿ\ocëeZH+Cxøê¤›&Ï/›ä³?öÁö²ÞVÍ6ï¿ïº ÌôÀ/mƒ[õ5?›ac¦lͳB¸ªÒ‰矹\FsÜ”œÿÑ'@Ï}6T¥’ò=&J. W„ðÝ£æéâ¼Yžæîw™å·'ÍBz«•d%S1vt‚ð|ªMÚôНÊÅš[·£í¡S9"åÇ¢ÝîÚ6h3˜ç‘ÍzÚôdH±$àó̦öÁ…ÞŽìødE à*»`‡O“Ãb 呆̧ð˜uÀ·€?X‡ÚAeÑUg×£ãã0h>Å`wêòà……¶J-äpãÆ26ý†áß®¼½c"Âç/?¿yÄ ŒŠÍý®ZÔ×õ‚Î×ND1¬Ì*€tÊB-7¥àüu$J4Šˆ‚S¶( À-rŒ„Å„ˆô‘u<Á½8c#?žË@Z×:L6—x™|ÔYÝãé·Â:f"O¡ßE=6Ó“À9uÇ?PŽCBÕ=˜Œæ%p,ÝŸLýÄK=|˜C7§~ÖµïÙyŽø R$7 ßëæ0œæå‡ü©Œß>-ãŠ÷¸†Œ/­}ú|ïn\™¾a[_žúYút˜åœ­³†îˆðsW6+¯ÐôaR(ÉÔÿdfÇ‘ÊI¨6$`ú ìMç'AW¦GQª0 (u¼ƒ!JI,k¥ ZcÕÔ2—ú‘ 8¸ŠxÂVÊÿSÓðÈ!:Ÿ¢#×à””w0ãD·8.µÎcOÃ2ì¨ìôòµÀ‰ú¯ÃÇÃ\8(çúƒ?(usÇ®Übó;ƒ[)€ê9Ø:¼Ouq|†ªššå¼½žc”{Å=ÛÒ„+ï¦M ±Yy”‚š¾zðÖÜl¯B1;… x±ùø–p9hòIÁšGE Cfr‘™ fÏARåÔXRϾTË꺼ÙÆ€‡•ÅV#£ÊŠËz½Á“—=Šº|í=ñÖß:ù'cÅ×ü¨^ʆ3•B={7\qb]™Ú¾Àæ{…IM˜2%ß¾)Ô×13Ñx°–#þøþ}´*LÁÒûÓêiù‰e·ÌøêŸ×Ö¼^9ðP^ј zž”ãþB•†P±NN{Â%¼¢»ŠÑÖŸ‚ÿûf¸ 7´cÉÑ`_éÑÅÚp;@Gˆþ¾pIÉ*YtعóUþ>ÜšAÿ+úe^ ò^\o!;sO#èºbr¸@Gg#Ù¨oK›åp´æ{Â]§góPÒ%ÑÐ%M6ú¹ÃpÁ9Ü}p/ž —~Ų‰ ïüéL8ÙýxÒa¡Õñ½ÿ8&jc…0R†lÓÜwÆ¡2¼oñ¿½_1É¿†£¢AûîDûöžIú„Õ^ôÞÆ ‡ùé™B„-ÛGùíð£¬ù”Êëþ=^÷Ä•€÷=EŸÝôýZ°¢PÆü®ZàcY˜Ùº£üxŸj Lùc§-T>„óÇèo(Ɖ*ó Q˜"X»¯â÷Û#Ûœ â€?uý$ªŸ]€‡µ«ª©ÚO°¬oÑðIÍmºŽië?u25o endstream endobj 546 0 obj << /Type /Page /Contents 547 0 R /Resources 545 0 R /MediaBox [0 0 612 792] /Parent 551 0 R /Annots [ 549 0 R ] >> endobj 549 0 obj << /Type /Annot /Border [0 0 0] /Rect [313.1667 547.9577 494.9532 558.8668] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 548 0 obj << /D [546 0 R /XYZ 90 720 null] >> endobj 550 0 obj << /D [546 0 R /XYZ 90 487.335 null] >> endobj 545 0 obj << /Font << /F51 9 0 R /F55 36 0 R /F53 197 0 R /F72 6 0 R /F52 26 0 R /F67 85 0 R >> /ProcSet [ /PDF /Text ] >> endobj 554 0 obj << /Length 2832 /Filter /FlateDecode >> stream xÚkOÜHò{~Ò}ˆGŠûÜî‡íìé$BHÂm°ÒåX¤33†ñÆc³¶'À)?þªª»=öLa)Óî®®ª®w|/‚|/‹ö!X&“do¾zÙío¯¸]…ŽAÞ¿úûÅ÷xIJ(ã{ç×$ç‹‹à`™ßÎxгí,Bòí,”R''pòñ3nÊà¬Ëªp© šv•÷Ý,Œ¥Že “Ùåù¿^žì¨8~ŽayŽcI8–{:•Œ ©ˆí}$j³H¤P#È…¼¼žëË3øÿ×C|†Á»#|èñþ)¾à«Å²K/ÕÊ¢¹nZ¸¿Â[yop”þÊ ŸÏq»¸í‹Å/°¥EpVÛbB3fzóx'P¤ã‘,¸p èÈ.Bäó¬˜÷eSaŸ¥fyñ®¬s|ƒaú–¤¹Ë7¸‘·ùMaŽT¼£Bž²LgÉ„wŸÜs¼ï"DÞÒÝ eì°pÁ¸ŠŒ…¡Ô¥ Ú¢#i¯fq\Á+*ÜRý¾ ³ÞGm€’ã482¯é¹f]¢€À´ójÕ:»ßíeaÖwH Ÿ‚³ñ€ëf ¯f§¸¿ I@^3ïQ’2 îJà„Ћ8Ää²ÜPŽ3ëg7EÛ ¼9†*B4}ü¼Y×H½77Àõò.Œ£~Ç£¢í‹{sV¢½/¨1LÏ•mÎ`ë÷ˆ«†<¿ GäæÅMW’™ñ€Äg4LJ†\±Lè˜8?¼çÈXScXá ´|Ž^"¾„Ђt+´Ðª¬&AÒ†BœdFâ$ hQÎ ®3{y[˜Å5aª¼CŠ,æàÊ*i‚@&”­£ j™RÈ{ZݘݥEJ& NŒõB˜¨¯BqJ­Œ(š••b]ÒjIàØ¡¤m[Ïfa*yðe¶+&„1+òj?%ü4Æg©‘­ {sëÊ4B8“ÖYÔòÌc´ßg žT­‹Ža"QÁù¯YŠd‘ÆÄ,ïa+ãÞÝÄØª|XYþ!H(KkÍÚYH9˜œE³*o–†cÞˆgmq !ÅI]̺HÞÙ´#Ħ$ËÔÔÈË0«X=·ð Xç*QOìBÙßÌþF¾ä„(R¥¶Ø¸[–• ð°~iÅEÍWŶH)LØ]²P÷òañˆÜ¢à?öãñ8;Ä51õÐoäš.+a\m75VéM )›ÌYÄ® {˜È6ï|‘™¦là¡¡¾ ƒ‹ øÝè²÷.½R™q£Íç®ÃœwU؆om“ÅLd &°…˜§D×ïäÐiEbÛ¼§}€‚Èz8öGɈ}Œ 6°´›ÜEÙ›Ú•¶Ê×5mÁ†³éjfäÎørãÎ#´ U½FIT=åF•*ömyµ©ëmɆòN¦2y©l¼ŠµylŒäYöœdªÒä…kóÒC€XÏ«rá®äö »ÍM…lù®ÕËUûéeìÇÒÇ>îŽØÇOd?–"øô`©öÊ–'غ4ÿ@4äî6ØR0С„…fà³6Ø.ú섾I ²ŸšŸ‹cJÏdc^… ÐG·ÑÏë©)‡.Üú¤M)·ŠÛ›ƒ:¹Ø™¯ð4c’§À¦~#•>ÒœpáÐ7iÙA8jÎ3‡ä…±á…ö/cSÝÜRCÞÚ-*Y¹JvM3Ï·-®´áÁŽìHgOÚQÄâ8ƒçƒ¯kxêcfdÁœ×жÐyÇm’*H| «ÀŽÂõ‹pôêE‘Ûg~tÖÓ·#³‰™Ž³¿f6g €ž7›à“fãàFf“BØLäVÜ9ÛhWêêH÷*€¢‡ü¢3»¹;^ RsÛ{c³J•ëÎõæ³r]–£z 9šãå¥Cëzç!>á'¯oPîUÞ0ê‘ì óãú'‚LóŠ•"µ¨˜P6s‘M5Ò=˜^»XaK­¥I‘£'\3®)?5m‰6,EÜV¹ëøìÚœ†&K¾±Ø–Þ6 ¨F¹òãþ̓7e'Œ§Üá†,yO¢RìäíFÙÂô®Uc¦84‰«m'o_š× ËâÒJ(ÖT¾zkÎ×—¥ÒAŸ³­|*ó4ø]´ÎhwYÒ‘J ‡…$4ÿê ¢Æa°\ãž"öÃd‡à®-œSìmÆhd 7¢*6Q¨²¤ytÏ#séÊ oÝâ:_Wf‚ã©…i„ÞbU#9úvCS™ï¥“ïbцwûè7ö`õ0î0Hð4¯‹j¸é7žaßáÿ3_x;A`–'ÎblÅ{eôœÛj©Î›Õj¨$–6Í¢8úŽ·ñÑ,J¤kÍ(£U½6ÅMýÝ[“‹$Å=­ï÷om ™Ûj)ï)½–Wkm©°*\|¡qYv¾ñ¥-õg©FU¤LS×¢9`kh6óÀ¨ •iòT;žI•è¡€~¼ Pœq¹2z+TºÞ/8„ûâß;}¸£ÑaK\iœÒ´Íínð‚tâŸRøVN!ȲǘäËù1S‘J~æ=ÖVzjV“JÆœû˜zÊc;ÙÂÅdDoN;SnBË ž Œ^<¡?% ôDÛ¸M\dcÑRÀˆÅc.¦1¨j ‰¡®¾õ÷«¢óŽCd†Í’Ê3܎xiñ=·v7Êf› êÊuö/dÝ3>LìäÄö ú„ûûÖ 5[3Э7)β8ʆ.Ôó‡7¨o9K¢íêf€ýäè=²¼ÿÙk ÓQ´el4¯»†êh×áŽÒcB}»É&¼ AþØdtT˜× Á«ÃlタѹÆ/ÚQ_:jÇ7\½õ1“FLkí¡wH˜2‘s²Òêyøs6†d˜7e¿¦jñÍãtœ{ö~:œëø):yO`½YÖ–Å I§²ÅYFS;/úiÙ¶› ‡ÕYEƒ #@-Ö’û>-[/âOËV§ÃL”Þ¬#;>‡ö†þذz9¿p9Ó\ÄO WF‰Øò¥Π.rŠø=RÈÁPqÞ­ƒ‹aZ«¢’m*6_ò°tqæÞ¡ÓJ:Kydn"´­ŠL¾QÊ"žè­zn¹^LZº×Ý“C‚·å²{ËÊ ™ÿ WñŸ endstream endobj 553 0 obj << /Type /Page /Contents 554 0 R /Resources 552 0 R /MediaBox [0 0 612 792] /Parent 551 0 R /Annots [ 556 0 R 558 0 R 559 0 R 560 0 R 561 0 R ] >> endobj 556 0 obj << /Type /Annot /Border [0 0 0] /Rect [336.6896 681.4072 518.9697 692.3163] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 558 0 obj << /Type /Annot /Border [0 0 0] /Rect [343.4444 343.8292 522 354.7383] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 559 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 331.2846 189.4184 340.4361] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 560 0 obj << /Type /Annot /Border [0 0 0] /Rect [340.2294 311.9567 522 322.8658] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 561 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 299.4121 189.4184 308.5636] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 555 0 obj << /D [553 0 R /XYZ 90 720 null] >> endobj 557 0 obj << /D [553 0 R /XYZ 90 532.9255 null] >> endobj 552 0 obj << /Font << /F51 9 0 R /F55 36 0 R /F52 26 0 R /F72 6 0 R /F67 85 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 564 0 obj << /Length 3011 /Filter /FlateDecode >> stream xÚåZßoܸ~Ï_aø¥ZÄREŠ¥´}È¥¹œ‹C|ˆ _€*»òZ—µä®´çuýß;?H-µËµ—{)d)‰‡3ß|3²8IáŸ8)Ó“eI©Œ9™ß½Jíí¯¯„Å0#ö§|wõêÏßkq"Ò¤LKqru3rµ¸ŽÞÝV÷3 õ,ÑzgY©7³X)]\À“?âM}ãfU»‹BEÝú®úY,U.U”³ÏWÿxõþjTGKùœÂ8% ±ÞÓ8/T"2¥IãË«÷ Ê§÷>½ý F?œ¿Ã•÷7ªM’§)ˆY"tÊ»íÝ>EDƒn¹¦íß6ðßœ÷vO»Y¬óè×z>4]ËV¹¡ûw‰:i15_cs\çSÒûˆ´x‹zý&´mˆ{S–ù4À—5äGšœ›C°{ïºå*î¾`n *†D¤2O¼çÜWÏq/ Ã¥¢5 ŃÝIÃÅáIÛÙè*FØ´aßt'ÍþZY¤®†z‘ ”2ºtbê}š“e9ÃŒÏ/ÏÇÀ–è±ÇuÆy±?1@Ñí¹èt()yxý‰ÔºÙ9½´LiàŠöõSc‘F÷ÕÒîYgŒ-Ó„X›öÜFÄá>Î8ºm~#ŸTÂÊ›Dô>Ãzœážð\*›# =ØkCx,-—“r=ö‹#þ§%‚ Ô„™ð˜Ï¿R"|ÀŸn½E†É’,óÀ¦m†ç³ËÄ•%mÇ‘héæÎZû«ÒOÓ»|ŠQ&!AqºTrÒÃÚB0,]Ÿþ~ú (5çDxsðòúô¿0%Ú zºÂÑÐV%¥_UBdR|.±üÀ»£vMݾ ø*Æ·„±Æë-œ_)Lô¾!vŽŒ;ßBY8‰âÖ½i/F­ì‹«Æ«•Ä­ÜÌžÃ9zâù2¹í†Ti^†Y;Ô9sôšý6FïÓ¼%¾Æ=µ®³®oˆdùñoevnbÎS€-FŸ#ÃgxæNyËÍBr@ÙHRNÃ4¢ÅÍØÅ¦ƒâ³_Lh[aç•H>xø$kœþõ”]ò*רÇP5-Œ\7&ÙýØäjÏOÃñÇSÕÞºoìºýãÝ—n¯ëûuÝ×í€kÑòTÜ›Y–ËEŽ+|ˆ9ø1t^Qá%ÿyƒGdÓúHÈp|À±à¶D8 ÖpPSî'æq7}0ñîÓhxŽ÷Žy ™Cfßò†c¥IQ¹Ù€Xæå.¸ð"3ªHмPVÈÕçaæG…”<âà$Ú.½½‰ AF§Ô3K¦©¡ˆ‘ÀµJŽªŽáÕ¾KÇT—¨¶rÖ}¸íúÚfì4K”¦ñöŽœíÒ’«5¶‡r‰ìS°-e´YT[Ô®WA_ƒxVY®_`\UùQøè2b%Óè¼E,®B’É,-Dƒ™ÜÅEH™Sºô¡Ïwù©Fyš©œkíø‚±|šu*~‚8ñRËð“Õ³´L”ØkÑ8Ä*ö>׿N2ó£…M.«p;¯†Ý4õ”ríwo޲Œ §9ŠåwÕWt€vis^;öJî=,»q¹°®ü”ÚÂ«Ê ³<ÙG˜ê a¦ÈqŽÁo¶ÔÖ àš1û‡„ H2Eé"¾ gQ$€¡úE΢¡ˆyþ”³àùíhˆ# R» ьဠ!¥A8ǧÈ.%f~<ö{t­†ÎÄK‚ŸŠiãHµ§HR]ê01‡%j»jèê\ײ'¨?qYeëPj©,¶ Ü£Ÿ±·Ómà ËÒú<.¾Zð;#×|M‹²@…`%r^=Y&ì_ ÈÞ÷&ï™3ZZ§ËLØ>*X³ò9=^“/ ûl®Þî` ÖÂÔ}¼û©1R$ä~%zæÑ¼n³¼u}¾]öæÖBZ‡ˆãn‰ î\q\pu²YÙg ö^°±˜@nÒyìÒ¡b>o¼W€sâøH.÷Óòe}PúA˜à@%òc¸§ÅÞ¼@y nZ #$@1œóðú ÕÝ‘šÃê`Ü»¥ý(?Û±Õ1ØC˃B¿ÐYæo,PÓžÙØ8WûàçWÁ–°†Ú¡±T% Φ§óÏÛ]xd€ÛLÑßEˆÔœ~T¼J /êé²Ö#OuM*óSGSð"/$0ˆµàDø%çù¼ž¹:Êš´t¬‰Qªìdë<¹yYöÖ›c;Ûî„ÏûòÀ±ÂmP8ql¦j/17ØoR~ON ¯dSÒ¹Â>žB$^MûŸö N¤&ºrT!Æ>~é€lÞ»Uv+V~Ñ ËÄ1•g™Áçš}°BPh…Cέ¦ý¤¡â~ᦑšG»‹{ذ}I±QN5$û†jCyßoŠ<\¹¯ù7¯õôXàþ1{Ú®-Ìà‚ƒLï[8û¸(òÉõ]o&:ˆ’¡' ëG+â@‹Øfuã>sçG¢\(¯ÖšJ^$Z ×»üé‡÷Ÿ‚_³"J‹c±›©œb··S¦ ¬‚ÐGÒ)òBÉã¼ØŸÀÙCÓ êþ&Mt ¦º¤Ïʰ»Ï–´Â}ÄLÎ ªˆr³¯µ‚3ìŽøÊ’Ã8ï9­zß‚•W®rÌLíÖÁð‚£<ªÅûÿÞÔöIg1KŽŠx~°¬ÛzMUuŠl8»—[ Ÿß'!ý}¨mÕm†i»¶§”BmM‚8vŒ±ù0vu|„„¢múMEuÒã^!ÑQ˜°Xþ¢10ó<ÆbÞúÄËå¿@·AÉD¢ø?ñå¥+LâEsW·=˜É}:6o‰£ðA—õY Ž1ye¦ðØt|wß)$— gWß5±Äë©­°|aQø½WíÛýIYáÃ3PøøgüšhëmWqÕÑÀ<Ýôóå´Üïg1—ѲaNÑ{n/Ÿ÷Åj3••O™¶ð½õnnú*­ò#>(Ã>(& {k¿¡à_¡4ƒm^JÙf³•]‚‹à'Lê©Ôè}*2Œ8±ƒ(»ª>¸sÀ|üûÿ߯õYb2áüçe_(rû7)`ÕÃ/Úxg3vð£ y5Üã¯íÜÞleЧÔòoÁKŒ9§}ºI³OáQìáÇà3ÇÝe’çûÔ=©—áÿÒ‹x6 endstream endobj 563 0 obj << /Type /Page /Contents 564 0 R /Resources 562 0 R /MediaBox [0 0 612 792] /Parent 551 0 R /Annots [ 567 0 R 568 0 R 569 0 R ] >> endobj 567 0 obj << /Type /Annot /Border [0 0 0] /Rect [336.4011 508.6551 501.751 519.5641] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 568 0 obj << /Type /Annot /Border [0 0 0] /Rect [124.3379 261.5568 354.8533 272.4658] /Subtype /Link /A << /S /GoTo /D (Transformation matrices) >> >> endobj 569 0 obj << /Type /Annot /Border [0 0 0] /Rect [251.8664 162.441 410.3272 173.35] /Subtype /Link /A << /S /GoTo /D (SPHERE) >> >> endobj 565 0 obj << /D [563 0 R /XYZ 90 720 null] >> endobj 566 0 obj << /D [563 0 R /XYZ 90 629.8547 null] >> endobj 562 0 obj << /Font << /F51 9 0 R /F55 36 0 R /F52 26 0 R /F72 6 0 R /F67 85 0 R >> /ProcSet [ /PDF /Text ] >> endobj 572 0 obj << /Length 3282 /Filter /FlateDecode >> stream xÚ½ZÝ“Ü4Ï_±Å ÞºaÙ²ex8à ¸¢ÂCö ’ÀƒwÖ;câ±Û“ÍÂ?ý%7Ù«+€‚‘åv«[êþõ‡V_„ð¯¾pá…c匵ÛóP¦ß>Ó2ÚÅfJòÕõ³Ï¾Mô…• ¾¸¾›1¹¾}|½Ï—:è‹ËÚËMÇy~¹1Æ?þo¾û'Mð-ŒËªð™ šö÷Ýå&2id‚Ô]þzýïgÿºÄI¢èc#ÉŠÄÑTbm´²af.ÒÌ(›„äþä‹O.áó$¸¡6Û¦îó².ëÝ¥øìÛÔÎXh£c"X¿ý%LÂL·XJ+tBö5V‰²‘õŒ4pÒ«Œ"eµÕBöþ£Œþ‰fŒ6prm)rÍ déD%6L/60pÚÅôEÓ®qSeSà*¤Ís9šîápÓT›¶8¶EWÔ=OÝ·yÝÝílš›ßŠm¿*Â/‹ð²(–&¦#£âغ‹¾ˆmJ6ÓôzbgÝfJ¸âç yåm_6µx‡{äá›ßðàú2‹Á{t ºå#9î4ºÎ¬èðÿ¿Âó¿=æ;q©$Z*ÛD…¡ÉfÊ­8Ñ@÷1å΢r" ˆÍƒ~â‰Pb&LÓ¤šBAÁNl¨Â4Ìæ‡}Ù Ý›V}ÿâ%|~Í¿„ÚÕ-Lt<‘{²|»% ! ©ž¯´Éà¤Ø¢«fË›¾bNÆ¡í{oÌëÛ5~‘V‘Ž£ñ€ÿ¬¬•å²0ù8*9»ÌËtª½ŸþƒS^‰BÍ**X­'T­®«r!»/+aZ7=@C¶wT ­²ÍÑîk°Nã šÌîöb!„Ñ,Ôs à³æ)Ùÿ÷BØõ'7±g(Ñ'Tˆ'oy}ÔAÐ A­c ,`¢EÖ3HD©Ï›]ÕÜà¾ã2Åßm~(`Sfsõív>ÑmÛ¢¨çst(¿®fJ°yY’¤ËÀqºªPQ"BÒïƒ-˜ß‘k[R4îx6gJ~×t¥¤1© Ú!Ää#²á'}Ãß”½ð@ € Q#MÏïÖÿ9Ìfúת{rk—ÅO;é,±vH¢9­ ó‹Vþ™›lJCF)‰Êzê{ô?r<ù\ò¶³„“ƒâ~_´…GNEÊÀëAŸ™i€`ö‘*!M’¥ž´˜ÏŠÎ¸ëðQÞ÷m@¡=ž`ä²!{‹œ=W'{î…WÃS«ø!WoaFåM1¢È¹·¼ ”H¿mØ^Zôú²&)Xœî¡ã pàcég‡ò'¨ì&y§3A—Sx+ø ¦:8KyÏ“%î”Ýs† ½çÙ- AäÂ8OŸJ œ~âúŒ…¨Õ!b…ìGéq´æEwEs gÊé0ë'ZKY%‘ “Sä jnœêBæ_åÛ!Ã]5¥ØÇÿkK;ë¶ë=íHÞ=Ô)q”²…ààÜ–Ú¢š‚Ò7þ;9K8‘aC;šdQha×{üð$+a^…<ý—L/,òɘŽôT¡—ǪÌŠ™m5ž;™*‘6€PxBY@¦5D˜Èx6(ò–'ض2‚Cçè„&ã©\h‚phçGØ ô|`nM7„v>Š ã" Ô³¼WìUiì¨Ù° –b;Y´A›;þ(]ÛVܨÍ?%ÀKÅ ÂÅTfòªAÝÉ,ŠÛñ¸.vÓãÚ×ü"Ï©>°þœgf÷#TðÛŸùk¿"$1{Þ:Dbü_ÞÞú’xÉ šòzÅY¨É³(]Ç'ÛcQ~/¶˜—²0JM̈>løå”A- ŽªüÃ׸‰CŸ0Ûžn*øÞ?´eáw¿/9ÏØFye>ä¡âBÛÌ — mÒ|&G¿>#‘˜è0·x¬6”AÆ"\ é÷Ž ø¸ÚQ 6Èùe}†|øôÝàä( µ~õ6ãYÜRrþ}ů^É/ÇB¼~<B¹:A,¬kþBP@±ŽÐ$Ow(>Ö½ø°AÁ´|²Z×@Y­Rã½ÓEÅ?ë¢ø&Ú†¼†×yÍK|É?³U÷"×PlQø€7$õ-_3Í—ëBþj†ÆÔ$dfƒSîÊñºè«ÁêX2 s™Eu¨]äÁìJuq…x”G6F°Ž¬™M½â)b»…À¼“µˆ -¹¾›`» ¥0"ÃÀ·[¾ŸâØšEW”oRš`Ì·h$5Ûû,TĪʷìk]?¨*KçF%ýFƒ³c¿ˆŸ5dáò‡^Ê£þÐË3z¹QŽ'¦ç<-ž$÷£ù9΋NAÑ¥ÃaÒÊ_H9™ß•z÷Xó=…oÓhÑ×=æÈ¯v÷âX%‰ó&úaÞ©V©h›:}C‰NE ?·6Ûq–Î-¾—”¨ië1]œeDó 뾤>×~“”P²ö11Cæm3Íì<òC°@r*—(m33ßæâÝЉm¨¡3a’båXÈÂÚ]w:`óp5NFÍ:ý¤÷,1ˆàj[QAªp™õå ŽQá(I¤„Á¤æ÷Š 7¸ã·É)e¿OƒŸ7¯xs´uçu´Ž8Šã÷>O!‰­“Öáá8Ôâ4Ùðïɺ‚Ÿ7šÛ|Z.ÀZð8BºÜ/²¯ùGº¨’qÖCÏß‘‚vRPgášr_„Ó…Á͉LrÅõ†Š5JõØ}Âî<à8±`r¬²ä“ßÍ…­=‚?#Uiä³PMuÌ…vêaˆîÅ>‰Ãà?5*ö¡ŠE;‡Î>åz$Á?Jð”W|‘SJúŒ—tÍXeuõ§½—óæ±òN}©‹º·¥8E.%÷¹àÆJC±5ß¾†”ya’\$M¹õ|çR¨9œ›â??ûªY¿Õxíc³¿ÿ/?,f”¾µõEý'Áf磩Üì P»õ%bb•†¡cÆËfú÷5rÏ„LÞç‡cõèu(ù÷"ñù“Á_IË}%ªÇÄïÚÿ ö‹Ô0 endstream endobj 571 0 obj << /Type /Page /Contents 572 0 R /Resources 570 0 R /MediaBox [0 0 612 792] /Parent 551 0 R /Annots [ 574 0 R 575 0 R 576 0 R ] >> endobj 574 0 obj << /Type /Annot /Border [0 0 0] /Rect [124.3379 633.6495 375.0048 644.5586] /Subtype /Link /A << /S /GoTo /D (ND Transformation matrices) >> >> endobj 575 0 obj << /Type /Annot /Border [0 0 0] /Rect [434.4537 588.6603 522 599.5694] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 576 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 575.5096 133.2175 586.4187] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 573 0 obj << /D [571 0 R /XYZ 90 720 null] >> endobj 570 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F67 85 0 R /F60 12 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 579 0 obj << /Length 1348 /Filter /FlateDecode >> stream xÚ­WÝoÛ6Ï_a`•ÑŠEê«(ö°¡Ù:ëÃü`0E¦¥²åIr>äßïdI›eÃ`À¤Ž?ï‹wG9 à'gY0K”™N’Y±9 ˜üåDòÌ„?†ü°89=‹äL" 29[¬&LËß½¯òÝ\z™ûÒkæ¾RÊÓoç¾ÖÚûô V~úˆDíÁ¼¬Lÿ‘j¯n6y×ÎýPÇ¡ö’`þÇâ—“÷‹ƒ8Qþ“ÀqHŽ%–*a¤gqª…T:²b×M¹.·s`yÛeA“`2ø"ËP$8É—JÈ( צÞâ†w4ÜÝ7¦èèëѵµkòm»½'ûe¸Î‡AQÐ:PãåƒÐA €(qpµÜÆRúR e&ÂÚµc÷#""„Æ"LBe¡» œ›š5€rÿ)f7ó0õlˆÝ+‹ÐäXÛÒgiGåuW@3Ĥ°[¶ó0 1õŠö XíÝâºå·„¿z&Þ툶@z×û¶#Ð% r"Õ[À.ûƒ™ÓÖä ÍŠªÄàÞ•[tÝÁ¦Ó{zj¹rÒIæíq_ÙùëL@d»tNCÎàü‚³\£uxyÃŒZkº¼2 íjú úXYMqņ˰µ1,ÐR Õñ)DMË;SM©•5Ñú+œ³Î´6é×¶t¹Ñ;˜zï ­-m,ZL9¯F¿Ü ¾n²Djh%íñZà®Ðþgö£:VÞ‡_[_ˆý÷wùv˜ÔΨP"b¥2ËñgÓ°¼yÃ’YóÕ&àgyõŠÏ'ù&ISà,­,Ž“ÃXÀ õ9º"k]\}¦"R*žÞ¼žý Vc»8ò¸¹s§¨—ä&Ä€qd*ØJw¶šðŒ-ršlÜÈdŒ<Þà@òš:Ú@—Ñ%.ç82œš3p¾ÛÁÏ·˜oF‰ù5^EN³PªLSæÕ€ëE]ÕÍD쩺ãL†àÐ4› Hአ¡´°Ã6÷í¾Yå…íóå$g«ôHŸ×±?ßÒ¸x<>êáݲ^šBÔ«ÕãPµžéÙP;œÖ~[Oæóñóaw%N …«çƒí›²0­Ø5×Îê;vÖ\šoo™¶°2Ñî¶++öò¦n8 0aY£^™Í÷c~à>C©Ñ“ˆsÁÚÝa¢‰ ß±òÝ~Å7fW•Ä Áå=Gn/«M¥–rYßð´·Û3ÖBLõpÜœHBªÒÙË»ƒ£µ¸*1a¦\n ÍcS«Ù`¥¾Š­v@\éUFÐãhNœÜÇ9dQ.31Îô…€Â3°ãPi2Ô) ‘L¶“é°ՌɱҦž-NÔÌ@o¡¡·¸Üw„Øä_MN¯Äˆñ9 }½Çùû%ÆÄžu_Ü„*Š<~ÈS“„Û˜´}íì+,m‡4FÝ–£¾ˆHŸ!¯;P$Œbo[wD–§!“ÚÒfD<öÐiÁ¼± К¿è¤˜Ú®‚hçÄ)ß.i킾­Yk2$2YÚ¾*w|?K®´¾ä†¡v…„JD Å®~튆H$Œ ¹î* O‰(}>ÿ9»åª†ÛYÖ£'…#CýïO½àåðô_ö9ô/ßÓö Kp’a S>éâd@ ¥c•ÄÞYYñ«â¹î-ÚnŒ–Üp¸§vj=¡Všº= ïŠq~GôÞ~ÄæÎä£SŠ£¾’½¸·CáúþÓÉj“¨ïEU¶óªÀ„z%ú‡óß]ÈÆ endstream endobj 578 0 obj << /Type /Page /Contents 579 0 R /Resources 577 0 R /MediaBox [0 0 612 792] /Parent 551 0 R >> endobj 580 0 obj << /D [578 0 R /XYZ 90 720 null] >> endobj 581 0 obj << /D [578 0 R /XYZ 90 590.8883 null] >> endobj 582 0 obj << /D [578 0 R /XYZ 90 110.8719 null] >> endobj 577 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 585 0 obj << /Length 2515 /Filter /FlateDecode >> stream xÚ½Y[oÛÈ~ϯ0Ú‡PÀjʹqÈtQÀI›…‹ ‹Ý¨E·@i‰¶¸–D•¤b»‹ü÷žË EÊ£ØéCaÀŽÎÌœ9—ï\(/Rø“Ezá´…qîb¹}•úé»WÒæ@1“¼]¼úÃ{+/d*Š´‹›É&‹Õ?’wër?“I_Íæ2igs­ubÞÌæÆ˜äÇá—>à¤IÞøÞTá%7IÓn˾›Í•É”Iœœýsñ×WY ìX¥žcIžãX¦~6Yn„ÔÆÛ—Ìé¦îz樹Á§ž™a4׳¹µÉ¯Õ¯Œ{pê\fÂäZÑ6ŸáV»™Ê“¾|xƒpºšœ®En­.ûpõiÁÄ™+üb-¤MYÂMs»™7×ÀG?°pþçÓóO¨…žj"£¹Î„Ë@HžMIÄT«Éàök¸gÙ^¼¾ýà5 :þu×à3åù´M½¬{žìp²Ú—-ìæÐìx$ "¬zäýL¹¤¢ÕþW$]{F¢ä+õô´ëw@P¨¤kN™|ôG¯›ÃæV“#I¢sÉ2‘Tµ[næw…Q$5隆Ë^}óÈo×0nK2“ªã©_R›FÍAIÆe@/xÈoLý%¦i(aCÉÄ7pZÓò¸+w5IíJðÕ?Ôw8UÝ#C5k†d+úuÕV¯=—¨+|Vc=áĶlyÎ ˜ãr¿d·âp–¡FË1ùTŠA :Ë`ÿÀKÿG˜ÉÓä°Ãc+šC–2›”û=hƱêJ”r½»õ?¡úš]Åo5ª"3Iɯ«º»ãÑ/©4´­· í”g~¼_7›#GËf×õí&ØÇ™-7Xù6Ä_Ã?^îh·v`wóMâ ÄqÔ}ÇseÇÀS£ ¢Ða¬(r©¦> c•e¡‘Ÿøéo—æº8 ¾L¾çÇÃãÄ¿åjBò%Ž R¤ ¼)t]Æ­Zä  8=A·é†Ê kSí©îk°¹ÓQèµ*K*ÖÚ¶bLÛäI-‚C‹( ÀƒK39v,íÅ„bŽ^ÑH‘éÌ/ çtÌÊç™Í@÷õjæY(’rçñ˜dÁÀ‰{²Ù®fƒî™ð¬d¥‰¾áçr‚ eï7CÈŸTZˆÌæÙ *m‘˜"®ß’‚—ǰٲ!Îj¼¼Üî7•·¿¾ágË[6¸ÝgòyÞ³äŸ;†PÐ Þƒ­¿Ù¼öÆ» 'z§Û¡‹÷„ë¸ø÷g¢—m}»&­òë}[÷Õ Ì^Í~UÝÔ8îšmÕ=n¯Á¡çàö©kL­,$™Â1dÝÃ1Êe bÞEÑ pk3,ðÅÛ‘³ÉûßÙL»˜M!80+]Ж B›³ºA0ªÄR‡šp à»3{à—ìa\FílØ€<½/Î9ŸV¸zˆ&Ò´E8üWìX þåübqÛî£þMÙKî©^3Óg¡Ò¹à{¿‹íg…S.€ÊmK ¼íÀ¢\y~+J9–¬$¿|.Œ‘áZbßþú¿ü¾eˆDùxíí(æCîk{°hr[Îp ¦ª2W'¼­CxdXCé_ YÓÈOß5›O˜Ùª}.}ã+ƒãÁ€1ãb=‹‡Ž^Wü6ä\šbxL–¹F™'õm¹ë ]ÙF3Ãan=myʦúÈi.i–Í]}<é2p6´wRHÌ|ƒk@‚:wÿ[M‘M—-ޏ÷{~ÜU<¸oÚ!=Ö48?-ùžÔPˆµõÑheÆã›M%ªüO±üfH5ü‰—;âî°½ÆÜÇ(T|N[V]È'—‘_‡1•"6Aä…mŃÃë®x¢Ù…,ÝšdH‡û5åe0åƒw4£)„T:™U;ԽܔdÃÄÀgq;¬ÑX›?oLιâ+Æ4·ifTðà删<ŒóXxþÊsÀ‘:2Ç‘ŽÏ²åkÕ Š˜³ˆÂʺ­ší9_±…=s=Ê28UçÞÚrÞ̉VIQµ¯Ëþ†•¿J6ÝêX»'_Kt·5“1˜cés¨ÿp‡äm7°á©£BÕ²J+ó\xf»˜,8]¬}}jR+T‘Ú“\¢¸¦û«—ºóÕ–Nw!¡Ë0S-= Ý ª¨å§N¤r¨;Ï2œ‰¼°ƒÚnΔΙgÁòĈ٠UâH%XgQ­À,s‰F¾Œ*¹Ý„ëaŒô^JUÂø*TŽ éöÍ`“³÷U^$/³BØ"=é tåv°«XöíCÙõa&Cº[ûŒyÛ´~ª/#úÚ—;çÃê[\cr®#îñƒžqA­ÆÅÕ™Æ8]¼ =4j€0b–v¤Ç]í |!ã1ø3%´Û*àPûè Ž”$æP›÷õn\ej H8ϺB ¤YvŠÁÑtÉŠ!>o P¦³'÷‰î€Y6¬‡ê¡÷ÚÂÆÈÐXzUr }žJ°ý•ÌAœµ‰nÚc`é´¯F`C§ÔWpÔSC;ÊÀÐQ­£`Å…WrDŠÄG‘Ž;ob­I™æ†´rû¸ˆg ¯•|ùEÀ?ÞÔ à=ì$ I§.ϧ@Õ'&FgÁÈ iÑq¯-˜‘–|mAõg<ú~]C…Ïb1¥˜T¶ëò´–¾>QåSÍ'Õ¿Ox=ÔQ¾{´Þ}ˆ,X9fomú;q«hÔ$ $?ÒÉCžjŒj§X³èÄÒ˜׿x‰¸‰š”Êïɺˆ…v/0Q@NkŒ:Úh4+Ì./r÷MFŠ-be :íÍ·±´øYöGÝ»øMLcgŸ»IÌÝ~ó> 4X¬~™ôB¾ÕÜ » 9ã¹.ˆN-´úV‚JOÑäéWï‡OúNÁ}|ƒ<Òã'ø~>ˆ‰¯…¦ù×ܥŬ<õž˜Ú4”¢VËo2@¿ë¨|{™'>ç²P"Ëdþ’ö­„a€ÏEhšêäíÕÇËŸÿ-y ¨\UÍøy@5ý\§jh)¥:á/#Ëj ‡Zu¿¥t $%ñªìKò–j¿GP#yZ­æH‡Íõ:œêøí⧸ÑgNy+ÿ9‰¼º€jØ„ŽÜ—ö8L[ža?å8}Æg$|”ØKÀN†Ê!áO ›æøUkÅ ¯}ëV¹ìøe _¨Ž9Œmù‡p$ÕÐ8ˆôO˜ë$á\×=ÁI,Ôñ$ÏÛùž?¡ÕC—!aSÙÈbœ¯´ÓZêØ>¡†™ 'Qn1›úã„xæH”eHކ/$Ó .?½»¢{\1Í ¾"ÿêiã endstream endobj 584 0 obj << /Type /Page /Contents 585 0 R /Resources 583 0 R /MediaBox [0 0 612 792] /Parent 551 0 R >> endobj 586 0 obj << /D [584 0 R /XYZ 90 720 null] >> endobj 587 0 obj << /D [584 0 R /XYZ 90 481.4463 null] >> endobj 583 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F67 85 0 R /F72 6 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 590 0 obj << /Length 2472 /Filter /FlateDecode >> stream xÚ¥YYoÛH~ϯ0v_( ì°^Áb‰'q<ÈÄ[Á¬;ÍÙU”TvLóR[c’þ=Q ¿¨öÇέ²®°BHAª«ÇöñLÂ0:6Ò$а2µÖù‘~¸èN"âbq…ŸcŠŸ iÃÿ#2Çp k'"‰Ab$t`âsÔ֌ڿâÃõÝåÕ-´¡µ”äq‹/nǧ{³O¨3³uN-h]¾m*®m|š'ÈíAÃG¶å‡Àï¦Kúð(í€SGqèÈ2À~c=3F:CÒô¤Sš¢";Ì âááPñ`ÓÖa³3™Š~væ×Ey¿çOmÃk*y˜±¤¦hxGÏ:%VxCו}¬ª¬qþ‹„Œ£n¨Ë.šlÅ!qÙÔøåÂ’WHù>T ‘×dó0ktÝŸFY-…rôˆÕºªq¯Ñ(æÈÏIk`|“bMÁç˜ GKë`9^ü¬m¹Cäò³nøÑ®$8„Qí(³zœyÌ–nè3‰°‘W}¼Ñ=v–³1'ùa"ð¼}žGw‘€t•ºÓ=t¶Brpr ¦›â %‚8Á3>ÌÒÛÁ=@/æäFn/ÎÔÖ|0öu¨€Y«Rà£ö¾ÂøÓ5Úz‡ŒâÛk–BFã885YÃ9諚Ԇ&=N±uMH¢Ìð,r7#1D×QÂa’A¼Æõ€ˆ-¬œï<°kÆ9‹ˆ5Ù»²·<ËÕ‹ºœmÊ{·hºë+pÍ&8díI>œ“2‹˜í7kŠ µCs±Ä‡ð{åtàÍ _}ìˆh+$¿Òc“Æ`NAäÒȵ…§.ŠÓÇÊ ±×V: Žh¿ht­õ»eaÇÆWgs÷¢¤ÎÙï¨àK,ØÊŽg˜ýñÜb-T†Ç~Ú5e× Ý½€@®³ç“™s,ø˜ôqU},{:á-Ùºãý÷l…[tw˜€ÎŽUB—‡Ûͧ”ù“ï9+Lò?K úöh±ð—ÛO<Pû8@•ìðÂníž6üEŸ—û—SUËîl;8c€ögZÝ[ó¦^^üèÙ/J_]~Ë(ñùãíûG7ˮۼ}óf·Û‰ƒ.êfñÆ’M^Â3ëçKx&‡ôˆN m•bƒ\uÄ=&*2é‹jAKãjáäLŒËЭAá•…kÓÚ¸ŸöæiZ -…Q2z¬9;9(8Öϵg4Ñ)~}çªåñ|£«{â\ЕŠñ³¿4ÃÂ2>ÚÉXÏvrÏíä\!umvåÓÐ ÈlðOÁá,8Në“T?ýFýýà09¢Ê&©Ù¡—ø‚©ª'ì9g’ŽC‘†§ç›DÆN·'ÅŒ>Ÿù€ûn߇ ÕØ.-Ò(q剧ѱEènÝ ¡®Ïã >‰€O.~ûCAÇw²‡» €í“S'ÞßNúŽsrèÔüÇÆí„˺61¡y endstream endobj 589 0 obj << /Type /Page /Contents 590 0 R /Resources 588 0 R /MediaBox [0 0 612 792] /Parent 596 0 R /Annots [ 594 0 R 595 0 R ] >> endobj 594 0 obj << /Type /Annot /Border [0 0 0] /Rect [178.4838 279.3507 322.7924 290.2598] /Subtype /Link /A << /S /GoTo /D (LIST) >> >> endobj 595 0 obj << /Type /Annot /Border [0 0 0] /Rect [186.1771 128.6943 364.1717 139.6034] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 591 0 obj << /D [589 0 R /XYZ 90 720 null] >> endobj 592 0 obj << /D [589 0 R /XYZ 90 720 null] >> endobj 593 0 obj << /D [589 0 R /XYZ 90 540.5112 null] >> endobj 457 0 obj << /D [589 0 R /XYZ 90 482.1189 null] >> endobj 588 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F67 85 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 599 0 obj << /Length 2608 /Filter /FlateDecode >> stream xÚÕY[ÛÆ~÷¯Ü 0YΗ[À š AɾmüÀG³¹&©] íï¹ÌP¤Äõ¦hûP°†3gÎ}ÎùfV¬bø'Vy¼J•Šr¦«ÍáMì¦Þ7 "œ’üåöÍ¿3b%â(s±ºÝΘܖwÁ·ûâq-‚Á®CtëP)è›u¨µ>~„•ïÿ†“:øÆUmýG¦ƒ¶;C¿¥N¤Rµþtû㛿ގê)_SI®5NåJèH[§q’éH(mHc¡ªjšD?µM¸ÃoÛèg ;*üº¦&hï×!Pþú“‘Ð4½t ¸Nä‘™")·{ ÖF=î95k™Cñ…çÚ-ÿ{Ï´'jMÂŒ™ £…ªç-»êi-³À6üY5sNHº…!ø–Ž=ñ)9,¹¿X{ép•›(«$1QƒóÀŸ`"-N|î¨Â)ÙB¢\2C§üb7CÕ: $¨“³Òw0ü™TÝzÛ;Ûl,¹ïÓ;TDÇ,Z¨H˜˜ð±ØµLÒÀ\e&J´‘«Äˆ(3ƼF#]8%\0êš!ªðägqðŒªŽíhÀ‰"gŽI¢\ä ·¾]J%¥r˜)>1œƒ‹â?i©Õ×f¨´pÕ`xê’Œs5nuÉN¤Óüˆ¶èx®†-]Q×°râ÷0<¼ú\ û•tߟ -qv~é? öïíŠ ¦ðå1Ò ¶äø 8A*‰³y„M|Ç•åŒXMŠÎ••–Jf˜ŠúÍ¢Û„‚\ÒYâ¼òÏ%¿¡6ÊSðAB EW…$»ß4Å€ÕíÉY„ó`bÊ®­6|Â#–€ÅIE1ˆ@ ¡Ð&’˘ÔQœ 1­Qô¿àJõᢢF¥h¥J“à#Ö&üçŠd¼T˜Ò(Q*'ÖÄts|Ð ƒ.äáø\¶±T¹‚d7©5 !*¬aÊH¨<¶ê-ÚÿÜð2¬v{œ02e_Qä÷LÑW‡ÇúÄãƒ-šž‡Ã¼I¬«g*·ÂiÙö}u_ÓÑ"Û&™2´PLTE„ûhhO í)úÓtO®hk¤ß0)å÷‚ži1ÿ(Ÿ¯+¦LDãá3™Š2•¿T3GºpJ¸P`®Îë¦Ê¨næ¬ÙÝÏvk©LRô¡L†:1œ£;gúuUÔ2t–g3¥ªâH÷šÒ× Ý±…¦‰€f8¯Š¤X1·˜X{Û¹2¯¼àip{×Á=ŸìÒu…ñÚñ™ÃJäμ¯b)‹Å\çs–Óæ¡¨j8•U–ºa e3‡ãjÒ8J²Ì¼Ô=]8%\êˆW g±%ä±1ï>ÌJñÄî‰k*°HÉ-=`ôU°³,™œ[±lO÷š× ÑŠåâ¦rÏô¥â&¹¸ýp(v>6¹>þ~È5©lÈ{ É‹ª…íNÅÜ'p@QÉSX1p¦Ÿ$˦ڞxP}9üYCÁ#†X<¦=Õ0Iqæì¿¿ Ø;Û³$ª&–½Œ V#r È7‹òT½”q#]8%\ŠÕÃYÆ¡š”q‚Çw·ëLÖ+ì£ô¦‡ñï|ÂøôaÝ1qîòPCMzÅ2 ĬŒ€¾+eöótá”p Š]1ôEÇiƒñÑ)Àa?¸w¸c×\iJž®0mzÖ›€yªùœ‡±dnýkÁ‹“H Z˜ê½ž»j +ÎŽ¿qLNáãcEPˆÛ¦qW—$¥…cMÀ‹$´ü«yvvEÓØºÇ ý£˜.R©†EÞG=Uåxßs€WÃÍÊ×,@È+CxÔìjg:Ü–äp$ƒFàb;&Å[ Ê‹ñw‹Ûº% ¼óXµŠs™XxÈ{(¾<õRéUYdtìï(tÄPn¶#ÈË”+¡¶þ²4N_㹎$¶‡O,…m©°œ;«HiŒK/•è(KÔÅ¥‘nçØ0ùBŒÉf»ÇÎGg((|W¦„PʹãrO`@1é!èþrŠM˜—‘¢xæÁñ2˜i‰vÖ× ëêa¼o(A]3þîoœçÔE¯D”–ÄÜ+ÿð­¿úw4h‘äø Ãé ÿÕ,é§6ÂWš8 ~ð¾ÂâßY¾ô*I/tè‰ÛáDeF$ø›j»Ñã§~SøÇ¡Ö9¢>úãKQr·ô9ª n_¸Èÿ¾À0pùÈ®äÿ¢Æß×!órk^Âλw±g¾OÚÆÝ“ΆTø‚¢óׇÆëªp²ÚÇ‚^Hº=»c‘F)³©QêÂy£ïÊѼlRÝœ“Ìœ³ë¬m¦ž™m¯„Ó&|Z¨ç[ô¥Äp1ú?V=ýß«ÏݤÿßsÈÈ(M3ß¹Õ„«4½T0¢jßßó¥†WzwÅÙøsøk,4tX¤Ê—<Ç`§e³,Gⱘ·<1BØ·9vŒj©:ãk,Ó”£ŠýÐÙâà^˜à›ªü>!_Gƒº¹·nÞ¸¸›]È¡é©ÜøWW…”èž:âÌÞAšâ‘Ž%å·_üeå ²Ö5}˜Å–ê'\# ¦Çi/d=^¶¦ÂÑdÖ·8÷>“^:¤¤¸StM -4zls¸7¦ÆåØíÞ÷4“aY¯tb›' Éà ¡rû!i|Ç)™ s„cÆ0KÇÐã ƒXÍ`~Ò¸tQ×è?¸ÿ8*ÖéàŸSð ²"¨¡vl ÌÝ3°u,(S¼ÅóÇ*RÛdç÷9 ]ðaÔ6aYõî@ëaaÉËö œs„à ׉À½Ðâü=«I»Ø‡áÙôÂm¾?1Á÷–}úTÙçŪ D »<´Šó(øð1…î#´ÚÙ_¹tõ'NNü ÈäLºëÍK!èã^}¦¸Çý±c„>¸áfùµŸë“y­zOÿ3È“&¸¹ù™%D¤Íå±¾cš·ÿx˃Oë0É$ß¡°à+&NãÓ¶}Çcg¾_j¬¥:…c,Oø{(8A„Œ#™ =ï”Hg·½F üJ{ÏO¿8>6Åá¾ÚÛc‹ô%ë¹=䀳Mð“Mí#&4e¬<ØÓsÛ•ßx9ÝØ¾/:gZu©Õpz\¶ë\)¬´P«UãÝrºà³i<Ρøz¼w+б?žý]ý~'”v J8/¼/ú”øô•à —x£³{ æCL1Vå”­³¤·Ã—»Å*:8vПŽÍ–în3ÏôÃq»½r Ýžû×ì¦?u¬¤„Ñ]ÀŸ·ï½¶Um+„q/øHzß0 4ËòÊä©®…KLdåu·†{Wš endstream endobj 598 0 obj << /Type /Page /Contents 599 0 R /Resources 597 0 R /MediaBox [0 0 612 792] /Parent 596 0 R /Annots [ 602 0 R 603 0 R 604 0 R 605 0 R 606 0 R 607 0 R 608 0 R 609 0 R ] >> endobj 602 0 obj << /Type /Annot /Border [0 0 0] /Rect [395.81 662.279 522 673.188] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 603 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 649.7343 125.6452 659.4313] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 604 0 obj << /Type /Annot /Border [0 0 0] /Rect [261.0243 581.1119 429.4898 592.021] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 605 0 obj << /Type /Annot /Border [0 0 0] /Rect [308.6972 567.9612 488.1822 578.8703] /Subtype /Link /A << /S /GoTo /D (Appearances) >> >> endobj 606 0 obj << /Type /Annot /Border [0 0 0] /Rect [414.5194 526.2462 522 537.1553] /Subtype /Link /A << /S /GoTo /D (Texture Mapping) >> >> endobj 607 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 513.0956 181.6455 524.0046] /Subtype /Link /A << /S /GoTo /D (Texture Mapping) >> >> endobj 608 0 obj << /Type /Annot /Border [0 0 0] /Rect [406.1636 513.0956 522 524.0046] /Subtype /Link /A << /S /GoTo /D (camera) >> >> endobj 609 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 499.9449 131.8182 510.854] /Subtype /Link /A << /S /GoTo /D (camera) >> >> endobj 600 0 obj << /D [598 0 R /XYZ 90 720 null] >> endobj 601 0 obj << /D [598 0 R /XYZ 90 720 null] >> endobj 480 0 obj << /D [598 0 R /XYZ 90 626.8404 null] >> endobj 497 0 obj << /D [598 0 R /XYZ 90 558.8241 null] >> endobj 597 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F53 197 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 613 0 obj << /Length 2284 /Filter /FlateDecode >> stream xÚµXmoÛ8þÞ_aäËÊ@Íßô’]½¦EîÚ]`ëO×{²LǺ•%Ÿ$Ç n÷¿ß ‡”%GI_p‡5E‡Ãgžyaø,„|–†³XJ–ª8žå»¡›þýw£H,†"?-_|ÿZóY¦|¶ÜŒ”,ׂ¿n³ýœ™/xÐÌRÊ@]ÎJ©à—_`åÍ[œTÁk¥ñ‰ êf—uí|!T$T«ù§åß^\/{s´Ÿ3E&,C‹¹ ™Ðj%Šq©´5û‹ß°îx$S¬£o‚Åsêb„žãÞÿ’) Ò%$Ë/æÉIþ98T,Y,$ÁÑÇ“5„RÄÞäŦȳ®¨+Ÿ¯…m—ÝßeåM‡ª=ì÷ux8§Ô±rh­ÇÇ9[̺?/<;èd÷«ë÷ËwWïÿN_^ß¼]^ÿúÉ}ýÇ ~¤X¼þùêݵ[ýóÓÅTâùB寮–WïoþqÝõá#¹êÓÛ¹zûÛÍ»«7׿¡TPÚy®6D˜£–¹‡ÜYùÌ]ûYàÞzíIuF%‡lkŒ¶¬OòK¦‚ÉhòÅ îxŽc2á,Š ¬ã½6ÞôÌ‚.ƒ6ÄÏ´ySì‘lO¤WóûÕ‰æ8ë©©Ÿ²$MbWã]¹yÜ/PGBBäé)eR¥trŒÌ»ªù%ÏÜœ­Å®Ä-’rRxÖ÷l³>ÞÜž[S™&+-ý]Д]±/Í£¨…Lƒñʦº…aõû@òº H%Î:hómu~hÊÇ£&Ëû˜ 䈅Рó1×,NBòù+ƒ)6¤àj¶Ôtæ8Žæ4B¡¦*à<ûVët8qH—ÄííZÕ80v3nûy•ÿ¬«Kgà¨a^p`¶ÂÎ(aŠskà?']ÊBzö!?¡Qi–ðØé;‹wÂbÛ ºÜxóê~3úYØ»@ÃñsÄÆå—~B`Àʪ@Àniãç·^¾¡L"@î4ö8Y`ÖÎ ÚY·XtO!µÛú0?Ù°Ià¤ö%`²;#¦Æýù69óñŠEuĺ†ÄöÅ}o¾Z nxóKŠö‘YX‹Ë5M-ýZ•.æ‘p«9ÿ@ãÌ ŠÔ=n)¹Æ½Ùu5ÙŒÛ$$ùéVR¿£j<À:ÈÐf7!|Já.Œ¥õ‰¥´Xbh'!h@\ó®ŸØšû ¤ 'fi­¹F&‰æ¢9ÔhÐäÉγkPIiëC“ãþTø\£ÌÑF§’Î;¢êÌB×’ˆ¡n‡ÝÜâjqolÖ†õR yá`Ý{7'®}ða‰Ö 7¸d¤£À°[?7za é4¤]*Ð_|Ö ð‚MzRkÆ­Çîü|´?.ÖSGƒGà-™&§³e˜œ…Ûægcé°ØmÏQcã=G¨ [ĬgJBÂ`44õ*[Í-ˆvþW”}óöž)b*”üpAT!YŸ1aØWF ÊÿZ4¾&÷5!Ýïߘ>2 æ”ú˜Åøò§]áý«Ix¡>‡‘©#(óàÁ}—6qÚ9þP|µ4   ›Ð)ÆCEr¶¢à²lÖ4sî\Ä8"i:Æà9U*+†>*îw¹zxe’¤cx¨¿>Ø<ª¢AU±U©Ôªt똉p ³åÖ‰)|ŽâàY`mÅ—~"Ýâ’'nC´þEy©#ˆq¯'+Ѽíä;˜}újeÉÇÀ\Ú €zD|THlJ\úÁÉqú¢9ÔÜæoœY{ÝÐúî w.ôÊ'É+"ÅBÑÓwU̿ƭÝwgG¶=0£Ví¿›CæÊœ2ès’ˆ¥"åãkŸPêƒë]TÀñ]ƒ‹u‹-ªƒí€Î`6=“wãðª×±ö™jÌz2t ŸLx4¸vNO–àjš’ÿÁ0Çæ(…&ÖãNnIÀ ¬‰­‰§tC –ð;I×û Ù‹õŠx L­­ 2ú˜¨N8mqã®&µØ»’N!Ëm!>•2ÿÇRÁÝ›âœñ+„ +ºŒÂ€Šº’‹XL»KC¯ÆßHÙToÍ9¸D{™ëûaçlßL“ ¯†¬¯µO¶ø˜F³ûƒ÷ç6\ÞSb³ã`µíº-H°€í’Ö>1ù?—F ‹àa;²ëÛUÀMí0…+Ñé™›ìÝ¢tlÕú$‰¢èeüu-_YÒgV¹~?úveHP\@æá>†aŽóã»´øÇOŽÙ°ôfN𺢌m’³÷‰½BD¬QѬ‰‹¹ßR~Q·ïèpŒg–%êZUËä--{oà˜ZBYˆ¢ä´GèÝQ:á1J47¦‘«‰ ƒ¾ø¬&îÑäëqä˜7¦¶¡yWx|È2Ý·ÜqpD6"<‰a¼ÁŲ¤–Ü>[qOû0óº,È>éùféܧE"Pg¿_ßÛ‚ª.©³Ïw9$(ª:´þÕ!µ×¶ÉÖO=$l)8§ÆæaâÝ«¦Ù‘`NI¿‰¨œ2ÙãǦ+»ÒgÈiŠhÿpéÿdô_ô’b endstream endobj 612 0 obj << /Type /Page /Contents 613 0 R /Resources 611 0 R /MediaBox [0 0 612 792] /Parent 596 0 R >> endobj 614 0 obj << /D [612 0 R /XYZ 90 720 null] >> endobj 611 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F67 85 0 R /F53 197 0 R >> /ProcSet [ /PDF /Text ] >> endobj 617 0 obj << /Length 2391 /Filter /FlateDecode >> stream xÚµYmoÜ6þž_áo§²ª(R¢” 8E⺰#q?]ŠVÞÕÚB´Òž¤õËî¿ß¼z3í8­‹Yj8‡3ÏÌÐ⠀⠴”~ª´>Xm_†üõ•0£%p,Ç,ï.^ýð!"ðÓ ›‰‹õ¿¼Ÿ®³ÝBx]¾X ¯Y,¥”žz³X*¥¼aæè‰Êûã¢ÌíG¢¼ºÙf]»X†*•§£Åo¿¼zÑ«…á·F‡ÆáXc¡´Ax'ÊRE¤÷ɯ§Çg‡g?½Ç]燌̊¥¾ˆ>i›mñŒæYËgýìŸl©¤¯#ƒŽ¸P8·ðu¨CÃñ×O!²JÃÜ9Å í‹DÄß/ï X$xŽH—¨¥ˆcøi?•0˜Øö÷ÓóŸŸaáø¯YX¾¬…åË[X¾¬…?½{ʪÁ_3§~Ysê—7§~)sjkÎÿў"rª+|)õg,ºù ÀiÒ0„a’?©§°e¬¬wÈØz[¦P 3[[ì»]¾fîÌp·TüíªÉï—ÈÕ®²ÒÈw:¿½O¸  ?Q‘…åÇìF~"”Í+P=÷¿E…ëæ«ù*àiäÌIâ Ú\Üd·çv=À=Šãã&‡ $jÐùA˜â1}ƒÛNa¨©W8u’~ «Ò‡ã“‹÷Ÿ\ZIåËXÊA+iå] N+™+Y|Ž& ø‘ˆ-ªãëÖá©3i$~ÅÖlBùÓ ’b·¦5Ù‘¨YYö ‡Qmœmk,»‘Ã}¬þÂT'W½q™ A 9Ú®nLAê -Å̇+ÄÜöÅÛ»ÎøË™¯yª«¯r£|ÝZ £$ˆÓdQ”û-i–U+¤¤y1ÎØ„OÄ>SCœÞIñ'óÛ¢¥=_#SÒƒ.À°aèw¹jM!¹Ûcw”hvøÍ¨”¹©8nGM§ÜgÜ<ÁBC*œoyõÃÎ,10T :d-äš5ø(*æûŒ%̱¡™Hƒa0î£îµó̈a09¡Ê‡u÷8 æbð]‰¾Ë` tŒ#¬²p’1íÈÐŒFÔèêÀ$Z ÷8†sx Eo)ó9ó~\¿ê«oª«dzGwyÍí'ÕI„m¬¹ÎØË‹!—7<ͽ$ÌõzTÛÌi‹ÖˆÁü༼ìfÂu>ÒЀ€º™ë‹P‡8ç)<$ $¸Ä.[oè&džÐðïEŸÕ$ÝO^1qÈoÆÑCs»ÇNH x?øA1m†-ó7eã£m=¿¬Ï¹éiFéxµaɨý£¢RêtÀþU½e;㋆)ÞȪ:y$a5{˜µµÌQäOÀ‡p‰,èK¬@«+³Žn@ðh£g!ž,úpXĕޥ⛄¦0«FÏwˆ_Ôô²/t%12<Œð9JI9²Nãx>&6š4ž„-eÉ•Vaßv\ožý@1< ‡¡Oèü«ÿ;þú/ÿ¼å¤ïò5¶Ûl·¡?&!ýÏE¸°oH_<ê†2 ÓÛëC¿4¦ÜæÈJÿ†Ù}aNslÞ§ê9¾óäŽüúùg¦®œZ°?SôSpZ†èîüʰ:ù–PÌ2ó ÐÃsc»ZÞöM ÷ú!½­&ÃÛªÙ…¡pHšöx® úhã~}Ýáw}Å‘j€‚Æ@»>¡ãº0IõAÍœ\|a€sù K E9·8qÈ[T#˜GYXul•í[#ñ`²ÛnÏPІ÷ëOvþñ¨óO‡‡ ½¥ý%4z¾©Åÿá2ýÙÂh\ÜÌuçðô묵Â0Ð^]a jÖ••öÀeXD±¸6™yGz_’gy¶ýÁt†ì¢oì_Žÿ—j) endstream endobj 616 0 obj << /Type /Page /Contents 617 0 R /Resources 615 0 R /MediaBox [0 0 612 792] /Parent 596 0 R >> endobj 618 0 obj << /D [616 0 R /XYZ 90 720 null] >> endobj 615 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 621 0 obj << /Length 2036 /Filter /FlateDecode >> stream xÚåYYoÛF~ϯÒ¡€’ދǦOIc»N›Ø¨Õ§´@i‰’ØP¤À£–Sô¿wfgy)tkéCè»ËÙÙ™oÎ¥øŒÁÏ4›…RzZ…ál¹{Âìòû'ÜŽ\ p‡$/ONÎ|>ãÌÓLóÙb=b²X½s¾ÛÆû9wêdîr§œ»RJG=Ÿ»J)çòÞœÿˆ‹Ê9ƒqš%í$RNQî⺚»BB9a0ÿuñúÉé¢ÇâßF’ ‰åPb®B/`LÌ‚Hy\*ßÈý*®c’å–,‹*€ª”IUá8…q‘£PÇø–¡Ë}Oñ›¥CJé1É$ÈŠ&yy¡…¥x†37òB?ô= ¢à¡ì7“ü9÷”¯Ôø®<©ðñ'¤û©3„€aug¸ º²K'­iD8¸"tŒ»¬èu ËÛ²hà±ÙÒÒ¤,\qFð¡4†Ú]-§ÄR° ¢±êáÑcU¿ù &Ñ =ñàèæÁ)úñG¤ûÉCDä2àx™Öÿ¼2ð˜PÑHœÄW£kñ¡òDZ²(/Tþ‘3_˜`‹7 ñï³.WŸ0äêt½~ˆÇ’Ý€µ„÷VÔàág<Ð5>bz2ŠZ>‹‹³³)F’Ãi~ÁéÎÀ˜:¿0®2;^%Ø—`­=x¡v0ýæÙR(Çä4t‚=¹HQÖÉŠ6ƒ†¤Þ&Sbº­.—÷YØA[û|7i.°ºˆ´•99\6u| ÌB gi¤Íq›Öo…–ÎÚ¤Þ½I-J×ïCMÊ2Éç"7ëÉaÙ¸dÊöü#‰!‡ÃH‰ë­g‰;ßzT¼îóÍ'±ûÕÛóIež |=6;ªÙšÇÇfW’9—9b|GUƒº¢Å#ÇÐÖmj0Ю{h§2‚…¹õ ßkpÈ«”âáò Ëc¦ZÆÖÕqu] ä6k¥–¢Þby¶Û𲤸µ5<Ò á?±qßoþk¾|D²y`núˆ÷‚€·™÷õÕéùg”8Pï/:ql>QÁ8¿8û<( ߉£Œob\ ¥Ÿâ9hq ³P™ûÆ /‚••(þfZõ …>*¡f‡ªÜ%%m)Öø”àêÀ7ÄyÞjžÍ±¹2ûÍΦªi4^–5oÌÚƒÒYf@6FZØtÓ7œ%¡md¾ƒ†KëŠ&&‹$5MÈFþ=}(ôaœµþûêôzñæÅõ“ ¨ïã„-¨èÆêyi BÇe¯@En,Ûkž ~o¹"†Mbœ+rnSÓMÓ„Óãḫšíà­)b4Cžd(¤9 $è0ÕÔ»’¬".qiÙå&ÎÓp>JÈÆ’#ᔊp‹{#éÄö9 ®=>Ó¾…,KwiçËägûmüëÊü!C×…#‹òxÏÛ?¿|÷b’³TÀYÊ1gã(ñnŸ%•×_Ù¢PŽu_`R—†Ô°®]7…ñç “fæzϺÝ-ï¡Íé™Ä6 `™«–kAþfÊmt(p.ÈtÆ£@ ]a”©ñÄwÜ |ßò£‰‰¤†¼ÕnðûMÂÒ©(~a>3‰:â=çwXÄðÉ:Ždu¾Š»ÂÈ8®Žví­ñäú –^âè .‡TI “…þ@5†™ð,òoæ®ÏÕè°q~CæÄÅB´(1ùsÖ6FtèTw¡ZTTv`¢²"*S¬Ò±¤¶©ž]’¬ÍˆØ.Ô'h1CCò”]ÂDN“öŽí»³â ÌÁ½Ék0‡k«`L«ÉéKl†ÀP*ª±úb)ºîjoÒ½D@Él;ÃmY”ÿr_ˆ}‰9€^XeR¶†Es'‡¤²Sú.f²ÚXölŽ© —n¢ÛŒÈMfIûbƒàšjÔÚ]ÈÊÒË×Ởta<1ÝMmê ·A/˜q:òË΢û®0},RÇ–Út0OÀ(3šY}{æû²Ø Š,ÏBZü€É¹;‰›¨Öþ˜’pVáâÍÐGËb7Y)™€RÝVÊëÅ«‹·÷Ü®Ûtç–ñm™Ú¶N@PS'ÌS:ý —?/îÏäígL¬qBQŠFÞEƒñ¹oêN[l>(Q†‘?êSÀ1djÐï1Ó°ˆQr~AcÛçâëQok½Œ3*YHiwcN{û†Æí»«ó¹Éq8^›/R%ïKeÒoÓÊÔj6è‘ØPe IÒvr4¡ïu#ß,R´N©¡£´…¢Ý3hE÷PhS ªÄ&tÃzÃATvÊh1ø”v]ì’z›b^Ø€ÆL@oðÞ²b²¯ Ì^²²ŒêWš[újk>1b˜ãôvn.ï|eb7AÒUbi `øÑ& >—p.ø¿Ât.<®d _ÿùýå›Ó¿NnÒüä¦ß:59ÕšC|„¢»0=£3’CZÕJr*«¸ˆà’î —[Kð­‰,¥¤³*(uW¶­ $x·ŽÆÑ_Ùꨣl(«7UW˜šìùdsDkl>Ïó¦ #ßð…M žÞƒŒg¾÷>%¢Òã+zÀ†¸¼£qÏxžp[ÿw@ÏRj®GT"ûŽòtı8ÎÊd¶îÿÉé6¸ÃôwÎX©fòž/#úNݘߔúµRý ¥„1 endstream endobj 620 0 obj << /Type /Page /Contents 621 0 R /Resources 619 0 R /MediaBox [0 0 612 792] /Parent 596 0 R >> endobj 622 0 obj << /D [620 0 R /XYZ 90 720 null] >> endobj 619 0 obj << /Font << /F51 9 0 R /F53 197 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 625 0 obj << /Length 2367 /Filter /FlateDecode >> stream xÚ•YëÛ¸ÿž¿b‘/‘‹3+ŠÔk“¦¸´I6—úáî€Ò6½V¢‡!Q»Þlû¿ß ‡”%EIZXRäp8ß<èð«þñ«<¼J…`¹LÓ«]õ(tËŸq7[ÅzLòbóèϯb~ÅC–‡9¿Ú&L6û_ƒ¿ÕiÅ£Wk´«µ"׫µ”2xÿv^¿ÅE¼‚yQjÿ‘É i+eºÕ:’I$ƒ4]ý¾ùÇ£—›Aœ8о'0’,H%Ž„¼J2ɸ±™1†WÍ5[GKó<¹ZóŒE±°´ïÔL¤Y`Ž €2ôñ€CœZTªiéË4´y€Ek½/j˜ßŒ8f{eÔôÍ£Ûý·oªF²PTÛöðïP”F·KÊ$Ëó\8â't×±­×xÀ2’ ±`<É£MµŠÒà5³ZÜ‘S¤™iïݤ¡qïÞÁY­îpÚ‘¿í`Þ™þ· lj Б¾ª{$£Ôëþ¹8ED¾Þï–Ô—9“±ôÚ{w‹‰»E’³<ƒ®£˜É$#í*ºÎËT[ω ¨.ÝhúÜ[ Ø¥ë¥Ëy1!âÌ]ÿq^–÷ù€C†;:Võ*Ê‚¾Â¿[„,Ð-m4‡ájºV;¤:*DT­ËŽ 7.0~ÒV|v¾'fªGC7u…Cç)‹Ò<›"`gÅ…¸äË-z?<‚ÁÖ>ÖÙ(ß‚Ëò”e<ô´x_0X>q⨺Ù`ç8‘;¶©»§°•Òµ‡¹4Ü› ³LR‡ÇâÂwÃÀ²V¶m¡;:¬jõùT"ê‡ë ­““¬¾Àx{aß:#F‚AnÉga„ŒñF ·¹£üa½{·…¢ bɈ‚eóìÀùÖóË€Od9ÊO(±¾¿Ã«TvOרh;’ŽVªµ9‰tÞ¹”Õ]$‚ÉW´o‰hªãš1A§éëËí€Ç±²`.)˜LãúÈ— Ö‹3.¿©”%œÇÿ¤ e£ÖRÀîFŸ«¤ˆ¬Þ5Cüàfãˆ"¥¤ùbÊâYÈD˜xüýå‡ÍO?~øç¢ïb•4½äjd:…†û¼ÆÖœº#º£ò“¦¤”ëÔòátÙ>a‚'3kWåé¡RåaPö”;T ¹ r#ìþŒ€xý‚>¾ô<,ªÖ³I´08¨²ø<ä¢,§Ú´!ŠJ¸Á±W4Tó<Œ[%V–£ZcJ—´Yظ#NÁ„’p=L>Ć J°à·)½Û*u¾W/8MH&áé0¯'˜f«uÌe@…Ð&3˜6N}X¥ “ÕóI꺘l¯UÓø3žz ô/þGZôE¸ÚúãGDrG‚´÷A˜g Œ5ô …²ò»Š­:Wç5ÑZÔº–¬0^@ôö~WtS°.t`6´Zh»,Ë^#Þ"è/.Áf•‹ UugUµ5F¤qðø£Þj+\‚®‡à"·Ìÿ5@K õCÑàà^ºUy–8ñÍØ¶îLKhA¤ê0*,ÆcIhPŽó~»D²ÔÏÄ)ã3‡ž7ï>lܧyµ¤ô°)„Ž;„®Ð%Ö}ømx2E5h¯žtKr@úç,‹…˜×ÿÊ4wM Ü—ZKœf>Á¢ÄZ6ã·•GÆÞu‰¾ïd¼Ö®»,¼oî“§„ö5ìsF‹üi1 Sls‡IQWáÕCëù@Rô³obÆb°ÑÄ o"ʢQ² T]Cÿ)’DŽŸ³ÌѾBa™â‚µµó ]±ñRVt¾A+ê¡õ¡¿Âµh‹œ³\xSlÞ¾¬,•½ ŸðQ> ó¥zÂz™¼Ðº÷¸qÉÖu ¼±.jGV9èbEÀ–}ÍJ’ÇÿŸ N«+T2ÌXÈótÊÆv"F.å4õW{yVMëVlH{GÏJý [{º !‡›¹¯É—‰Y¥âa°ÀW&Lf2ÿÛëŠGô“:Õ6Š&9T=*´Ð­mþˆLŸÕΔ÷Þ`Ú[¦,…ÎÒ;ö ‘€@Hg¼¢4s­_cŽ…%Á›š(!ÜFçN¥¢N²£S´l—Ø Ã£ñžZED¾¦+œcly‰èÅŠû…y²rsò{鮣2¥jjÐò}I;Ø`àY*±öEkuq'ËåìÝëuCy°¯×KXûW£_8~é.•pt\ŸT«Ìž370gq‡îªé K¦ýÛù8ärŸ~œ”>ܯ\«nÔ™ø|P¨¯‚ÃJ—‡W¼°X¬`²,†7É:φÂõx‡¯¯ÿB²r|ˆÏ,ý+Ñ<~xL“ß¡¶g0þÆá®oÑ·¸¼mJ?ÐüF×€–ÒoÕZï±Ã9:ÇJ}"ïrüµ å³Kmç…tºv1ËY~§ÙRó¾VÕ¶¸é›¾c ÷ïeÉbl×PDÈÅDŸÁ½"†V¯æ„؆®Ïî|‚ÇYÓîŸú»j½Ó]§Z§^1—ÌÜŸœnƒ“.·#²½6ßýÞ4ÛûH¢FŸ3êݱØÝf©{î»þbóbÙKŽÝëá¬ð ,©Ÿ{‹X% ÁËgzDçœ2ÊÉ>´Däy`¶3vºtíËßfæhÚÑƱ…~¾wÖ8ØÊ;1PgúÃá ëš²lúy ØŠÁg]q6Z×îLÙ(”h}jŠÚªî«­n»ç– ÔõDÄòK+¹nO-øÒ)ª¦±¥ 'Ǧj00£s[Y)³;µ™nŠ[/bÛÜMq Μ(CýEˆ©ÓÉ£aXúº.û[ˆ*LF6JûÒ§²ð¬›ÚÐéðöå«÷iã½£œ5– PÉ»/û]Y쵪Gv(é•?H®Uëu›9}Ûã‘Båÿ!C Ÿñdºõø™ý¡(µ>ŸZÇVX¨ê›kw“VûEˆaéGv#¹–îþ–X׳X|Q$Û$S´…Ú–zh»ðšË.¿’ý)p:ºìôÝQ·úé4›õõ„l0QÛúR«Ïq—c{]›ÂÜÏl8²’àðç¥q”úõßK’N…·†2»£­è6YÎJ‘çŒÿGñ‰;VÊ endstream endobj 624 0 obj << /Type /Page /Contents 625 0 R /Resources 623 0 R /MediaBox [0 0 612 792] /Parent 596 0 R >> endobj 626 0 obj << /D [624 0 R /XYZ 90 720 null] >> endobj 627 0 obj << /D [624 0 R /XYZ 90 533.0434 null] >> endobj 623 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F53 197 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 630 0 obj << /Length 2286 /Filter /FlateDecode >> stream xÚ­koÛÈñ{~…qýPª¶\î.n¯À]zô8@c @sù@Sk‹ E $I5î¿ßÌÎ,MÒ´…q³óÞ™Ù‘!üäE^$J‰L'ÉE±{òòçW’Gk€XA~¼~õ—Ÿ¼¡ÈÂL^\ßN\o>o¶ù~%ƒÞ®Ö2hWk¥T /Wk­uðþ=ì¼}‡‹:øÆeeý$ÕAÓîò¾[­#G:HÒÕ§ë_^ýt=°c¢è%†ä%Že¨a[_Ä©RiãØ¾Þ'QÇ-ðÕT<ëP ·r¨àƒ«2¸ÁOÀ ¶.ª¦sâòvY#ç@6š5FDa£Hðža&¬¥"ÉÍ7-PÌ Dl»%Œ*©I%ƒÿ¶„Ј$J“£B“ YÁß—©V%YPövÇŒº)~Ó0@ÿj­3%Þ^ÃF’µ¶âä5(-蓦“·Íñà™VMüþJƒ¶v^ˆ”º>¯7è§õŸ­¼x¸½#¹9 ÛÓ¸¶ì ¼?òzQ>’õNõ0µ8ü %Ñ_ê,¡Š¥ƒýÐìøîØS¾ÛW¶{MS´MM÷Îa†£Œïã©_‘6-cè·+6ä™îÊ»­S,MÉ< |èÙ.ý\WšxÊíÀ‘ ~"Vi"/éû}Þ¾yGƒ¢ÙíPínÒ7ôÝØÛ²æƒ9oµyÝÝBÐXR%,òª²Œê»ÛÖn¾óÀQ,T(µþ54akóͯ›Þ?Z•>a;¼F £õÌ»%…³Ï„éØAòž|2Cθ;Æw~¿VK$_ÊŒ—¦Ó¿÷f¾äÀÕ VŽ.Ya?x‹ìlËlnþk‹žÆ‡Î]²¯5,“Ôß´qï›®ì˦F¬ ªf4oË/BˆêÖŽ\Íew»i¾Ø×ƒÃè»ÙÁ1ù¼†yô·µb”!%j•ÇUÓ|~PGsÌ[öÍõÄ’ßO@mD*!NÈoóêö|[Új3¶ÿL3y·Œ"…RKr!àªi="¦9ºnÄN´È ç+ðTX !z`ð€l)030Ð"eH-0à(÷1ÜÄ*¸úÇúz•©ÀyÊÊ}ˆé;Œ´qðâUä[ï#yn¬TêHü{ˆ€­ïJ¥(»hïìŒ CX…iO=-ºPÀnÁ¬áKÌwÅ(sú¸OÛãF׸Z «‘‰à^+ùüÏ/f{çO§§ñ%"MàÒ:⪴¶<‘¸”“¡ :í}’õ¾B/3CRuÎ"šx朊–òJ*²|”ØùçÕ‡kÀ§!×NÂÅ£Š*AòB@‚×èý2ÀdiT€‘‘p2§i2©;áÓ`ÚÒùÓ¢²ŒPFtLHiÒ΋Xȧ#ଂ´®#‰E* r»£Bv[àŠÙGèkp0¡ÏG¬Àß¼ûôš¦ûüÎÒH†êmîT'cVjîìV¡R‰c€n¥~¾´€1ñ¸ÇNrOe‰«D°$É nÍa…Lò¼›Ä8Lýåj €ƒyšI,X§x0}’_ $EežPÞz·3WÏàa¢¼Ó^ý«ÁPs|2–©Tˆ¶ ~ZÄ %=ÄÕ›¦ZFäJ7†r¬8H¹‹Ï3—µL† €ã£%#¨–)XèØy‘£4ZÊìÛ„ôìûE”`p=€,F½TÈT΃žy:è-q¨:¥KIÄi"Y®¾¤ŠÂðÕfÈWËÏÃ÷ëM¹³uÁWônë Q¸g l¸j²’ tz=2 J4½xÝÓ«¹³µmŒ¨ E õMͯ/¦~KÒ-_Æ5DûX‡ñTg/Ü•*œÄ¿o¡œ.4$v¨­Ü·h*|síè K2øßà Á`$.y³àœí^Y]m·Ñ3pƒ;§™¼=/fÍHB>1ñèŠ<ɾ/IŸŒ(,ËòÕ’…,GÁP‡"N£Y0¬×(ò«. C§ð:ÔÏ®¦5—W[z–bÌËO7HÉrÈb/F²LÇúY‰fOÍ’6ÇKàV˜%ö¢’èáÄ-‹Qóë'èìdg_6¡k¨8c|óú#¤(™)¨d:-lgôÀY •/ =3ñ;tvÜ"‹ï}Ìn<õ?•z$¸®ŒMöµŠT±‘O(ÒQt˜©÷Ã=A+o.ÝDí#‘ ÈNòÌ£ÜÛØÎ¿ó Ñ*9»žØ RaJ$r´QŒ-­þ0£]Eؽy([t Á·ÇxwÒïj«AØ–ËAu¬|±\|N7?Œý `0Å£%w÷`x,EE“†ß=ßp%g)Ê çGå0ðÅQ{¶N£ž_·ôà~tч6ž»AJñe„AY£7¸u7 z£~â¬jýpœ;?ÑQ×VÁÁrŒ‹¡ “&ú?”×Äöb‹{-¥&Nå”Û¿=û;·.¿'Ù$TQzæX¹gtÏ £O5Rîǽ—o°1Î,{ZW»ºimíÆÎZ’»ü3uqeŠ(‘zþ’å¶õ½L4Õ¤a4éÕù;@­%†þˆ¯±£ùvšÈó …Á"†N°fßsmˆ;ŸíùØ´›¿zbµ-l×a•ãÊ9kýyÏ L®jç{e½mweíussž÷Äš{$¬Õã¶,¶L±÷ÏÍßø|i endstream endobj 629 0 obj << /Type /Page /Contents 630 0 R /Resources 628 0 R /MediaBox [0 0 612 792] /Parent 634 0 R /Annots [ 633 0 R ] >> endobj 633 0 obj << /Type /Annot /Border [0 0 0] /Rect [333.5451 311.6937 463.5847 322.6028] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 631 0 obj << /D [629 0 R /XYZ 90 720 null] >> endobj 632 0 obj << /D [629 0 R /XYZ 90 359.2404 null] >> endobj 628 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 637 0 obj << /Length 1586 /Filter /FlateDecode >> stream xÚ½XKÛ6¾ï¯0¶‡ÊèŠEêµ ´i6@$@ã[šƒlѶZI4Dy×nšÿÞáKn6¹"Jæ ¿y~ÃÅ‹þáE-2BPA³l±i¯"óùï+lV!ì§[~]]=»KðG¨ˆ ¼Xm%«êCðr_–8Ø2ÄA¿ !½]†”ÒàÝ;øåõù‘w°®f_rð¾-± cšÆ4ÈŠåÇÕïW¯V#œ$ŽŸ,·xÇSÄq¡$Nè"Í)„& ÷Q˦9/AEÔý%XX„S”P Šã‘SµÿƒÞy]±mݱkýö¼+[öB¯?*é‹0&'‘v(´ Ð›Kýú²[ðƒ~•Úª©æý"Ø0ÔÝN¹šëÁh¼/›#ÓËmÏÂao>‰á¸ÝêåþÞìÍFÞ4üAXÓŸÝ¥ÙÔq!ŽŠò"·ž êÈ·€Ì2L)Þ¾äТ®Ï/’s7tÇvÍz}>7z¥Pù¥3öoxsl;áîͼéëÓÏ!ÃùPoTd=%гXf2ćèfÂk> –À&»MåÿÕµ“!œãÔýéú¹%»-з!< ¥ªª…PA9Þš“XYy³tJI6èRÝ—ïl/,íÍëÛì…tÌd_—놹ü*õ¥$¡îÑš®5¬L…èg“†Ž³mô~ÝÕC]6¾HMxºs±ŠuC=œg.œ8)Ž€À`"qÙŽ&Ÿ¯í$¦9<•3Êa³—³ƒNâcoK|Ý—va~wÈ q’<–t"Jr=­$N¢²•7f)䨷‡ÑŽ›J~¢Á&º<0¿«±°ƒß7rÑÈJ„UúwH\s&9ŠRb‹ò“cž –Ê×=h.ÕÌß§ ‚ÉÔ*üìSè’,~ÕSíD7 N5“JøÌö([7LÙ' Û¤«¥CÔw¡Íî–à•X²9‰3ÕGWÉF¨[ôBã Rüa RRS鿸0Ó÷HPµK¦ö¥¢)½šV%¡P’3É.‘ Ÿ2 '9eÛ˜¨“ä)ƒ*!=H*°Xf¼œõºôÁÉ€¨qžzñxN'¢qL]¢u5Ð&ͺzbsbõ”½ ®Do°ÊY“`Ń®®'ò« ÞPÊ(CŸ‡ÿwƲ†w̬ (IÉ,`í¨îEk”£›\wŒUÝòæ¤oD{#î—¦zࣛÖ2=ìŒSPj‹S7÷¼5BìT¶‡†‰ýZ/eª3•">ɘӰÔá‡}†‚ärØÛl6ÀÛz·W‰kíÁ(³Y5Xp ˆÜzk™ Åõ¶gÕõ£¬½ðñ…†ÝéjlÛÓ©($ú›œGd†œÕ¾.žtŠg†ßÒ„ä5Kö¸ÒRé=›] Ãè›ßú¼±í¡ööâ ŸÓéòqAçöôÒ’\ÅNzùë9² ¦·fIA—¡ ›YöéËÏj°˜WÆFiN°œ[  ‰xêó&þ–ˆø¬Ž ìÎ_Œfg|¯à#òß,}ÍÆôiÁQ^76¸K’tÖ×>[–‚:Ï¿¼æãñÌI‹ò}lŠþ=fUõö·ð4™–·nâêéÙÕM^î´Â¡?ÛÁÜùqc__Ú¿4ý¦¢¿ endstream endobj 636 0 obj << /Type /Page /Contents 637 0 R /Resources 635 0 R /MediaBox [0 0 612 792] /Parent 634 0 R >> endobj 638 0 obj << /D [636 0 R /XYZ 90 720 null] >> endobj 635 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F67 85 0 R /F53 197 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 641 0 obj << /Length 2418 /Filter /FlateDecode >> stream xÚ½Ymoã¸þî_á¶V"-)’zÙö ôåvÑCq‡â‚âö^€*¶lk+‹®¤ÄÉÝŸï¼²ä(ɶ ŠE‘ÃáÌ3Ï ¹ð'—¹X¦JE¹NÓåú°®ûŸ éZ!ŒÇCþx½xûÞÈ¥Q.r¹¼ÞN„\o~þ´/Ž+ôå*”A» •R~· µÖÁ7ßÀ—ÅN¼‡vU—þ%ÓmEß­ÂX'±2±úéú«Å—׃:&Ž_R‡Ìh5–2‹Ò<7Ë$Ó‘TÚÞ¿YÁd¬ëÛ®/Ûˆß>TweÃÍ~_rcSn«¦ê+ë>7ö®¼òƒªŽ[ÇÛ¾»˜ho>•ëÞMrÏ…¡â¶à‡ôØ=l*”*’F¤c%LsêKõ¶ ²S´:”Mz5wtÇb]F^nœDJHMrQ¯ÿÞoÁaW:å¶v}ë6ñÎõ´å†ÖžÈPcÝlûù ìä“Òß¾OÁi*à5tZ;§…±‰dnØi:B”)ú5 $QÁº80ôŠŽåLáŠM£D©œüºÆ~"à²`TÚi‚OÐCŸÐ{8¼Ã—#5uýÕ°Q?ªãÉ=¼ï¼·Ð¶umWqœªfÇbޏ”E9YP¶}u!Ànñ{e`cø±l‹wƒ…e$LBam,iVáÒ„O\¥h6ܰ¸\x†åú‚Œr ˜Cˆx ´ÎiE†AÅpƒ% Ê’à%ä ?ª³¼c4>pQc{þTá4ÚK Û o‡PÈáck'l.g} •^Ñ:YýÖ¦“•_Ô¸Àütë•ujü ‘ö€Soªpn£Mqö¾ "-“Õ~×ð‘Öâú¡¤“$øÖ¡›ý?F·›Rt,·˜ŠßÈÜIᓌÃm¢ãaëkØóƒ“7·}¯ºà«¶º\@OØ<ð‹HÓÌ_Ïž‰ÒXEЈ­¥ÒÙØ3Âc ¦¤›2+4T¢Œ±©·nJÚ$X$zºÁ¿p0–ÍflÞÀaùÙyõv;¦„CÂ1–è±!¹cSu°òºäQ["˜¿0\¡±¾ :üfÝÓsVbòó &ù'xVNñvƒ%›C€~ÛùiO…-·!•¸¹ºçwOçøÎ$d»ÊÅ8Åâ¿qæôêâû˜#p.&b’QëóúŠ2¯ŸÓ¿»úxõ=§SýÅÜvp¨¸W0|Ë,y‘ç(tÚ— ·ÚÁé·÷c´'a3lÛz}éÎ †ùöL‚vë[wDâL ny¿jÃk‘°SÕ¯ÑE{o3zÃG¨ž…ø.›é†ÇÉdÉ£t×Ww(¢ô{[1n)ÇP:°»–ªÀ}µæþ»ª<‘a¸ü¸ ZÎæ™ˆI=–=ID.ý¶Ž¬žN_×+àÊö– £ãœèj؃—¥Ap[Ù-Ãj {}NÃ>š …T9GÒÈHÅÒ“Êï^¤ïºêçщ@–§›ß¿(ìíœi£“ÏVèãk*Ù#U"¸Þ;Dû5˜j}n#ƒî-ý†m]ìÚ’)2Œ•ˆ¤È²©3OXb€ã娤Š2Òqa&É›–›\= G{JŽÈåMÇ='_Ü4Æ\ÄÇ”> 8Ñ2vqÍÆœµ@Âe;Á¸æLX̓ÙåëiÍWõÝeÕ7*+Ý`ÈŠkŒâ=KbëTîÌňï_UE_º횃- NφeSí¤”Œƒ­ïY×Õñ8bfE¬ Î-š’Gœ3’˱óûµÅ£Ö‚cX^n¸¬Eh•CaoãÒ;«ñ„ Ÿx{:èß Ü –hyb¿/nýÌ\g¿p†ø;žFúsPXÑîfãDÉ8‚#…þì¨CÎÑ x‘ü_ €Ü;ûŽI‰~N(²(IãdêË'ª ²4EhÇmŽÈÁnÄ÷”æn°Ø†$¨7б‰ÜfÏ~wñO¡X]¡€"ŠMý€eHä_´0dZe÷þ£J‡ V¸SÎb3A}Wu®äo2J¯‚ËÇŠbm;:8Z.¿Nç榀 UW.¬iÜp˜³ãó– ž \_Cpfv*Œë‡'£ñùòùÉéSz2Êk§ « ËÃÙ`(Ä´hÿÇlhEJð¡h¿›Ã!œèe&=äßÀrRçT*ã _cFö0ŽiáéØ>ÿÂÚšÁât×ÒöJ'§r3ü}`ós9$<ᘜK<˜S12ï´NîÑá–@»¨4RY¦¦>yª´ú…ĉ}î鉉„ƶzÈÁ-òàŒ1TO4­‹ ®Âäb!¢4Õê?õᾨ·Û 1GMiÔ$WòRQ*â ˆ’wEÊ¡_£kDâ\ ½h¡‹S9å?ó‘ø¥¸Ç8p2ÎÅ6ºO:x‹drG¯kΦ¶ÝQænlHŽT#ôüNþÝÕ4äWt‰bäÕÜ ƒhÖ½¥SŽ{y(ðí|²“j¨V±}®°˜Q)Þ¬*†£äã rÑÝNë\n¨ë'¢È* z©ì!œ?$ÈÆiޏlËú\{ôvtdØÝrJåOn>ßm©üò°ì—ÓQ}>z|á–(:ÚÑËÇË+deâÈ@ò[J  Â â-~øI,7 ±üj8Nòty›å(V‡…Bç²`¬¡–Iyϼ’†ƒ¸g5Ô@/hæ¬àjoù{¹Ëé0–€!M¥I¥P %öUí‚ï"ìPØŽ®Hû½¥j±8b\1ÍB¾ðmÕ¿qÐîªÃ‘JL-Ø;Éóÿ ´qªs0“PY¦PbýïpðñÈY´¢“Ÿ—~°€þ g¿š’^â‹J¦Ràâ©’Ól{ ^È€"‹Õëi;H|I[-²HÊ,j;co˜—™™æÖkúïTî®zC×C\;Ó¦Ã1,˃áJÑA¯¡2Í]yg…dY¸‹ªÌ1E÷ÀoÄ×ðtÔ> 1=ô%/äÎçYê·N(Œ¹9Ëå릺©UnæÒ‰/0GÀi€º"ˆU]±²Û£+ŸI†S\ûѨȃåß‹×ú! endstream endobj 640 0 obj << /Type /Page /Contents 641 0 R /Resources 639 0 R /MediaBox [0 0 612 792] /Parent 634 0 R >> endobj 642 0 obj << /D [640 0 R /XYZ 90 720 null] >> endobj 610 0 obj << /D [640 0 R /XYZ 90 579.4039 null] >> endobj 639 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 645 0 obj << /Length 1693 /Filter /FlateDecode >> stream xÚ•WK“Û6 ¾ï¯ðø$ϬR¢^›43iÚdÚI“C¶Óé$9Ðm+‘%W’íºIÿ{‚”¥]mÒŒâZÌ8üÄ,ã³$ Y&“d¶Ú]q»üéJØ‘þPäÇÛ«G/"1œe<³ÛõHÉmþÎ{¾Uû…ð:½ð…×,ü0 =y³ð¥”Þ›7°óò.JR»I*½ºÙ©®]øŒé¥bñáö׫Ÿo{s¢ ø–Á(ò?,ŽSÉD(#cñR­Aê}Ú4õlªr2zU—uƒ&Ì¢„Åœƒb2qòóY³Aiµ,Ï I¯ª;Dž¢¢ÐÔ{p'ñŒ¯9Ón½¦SVx…j§u 1÷–¨¼ÊF^·…5,Š½ÖœÐ•f ?Ü{­¨Ý¢G·ºÔ-ÎZ«QµtÒi9mÜãcÇ ”K¹WX€_0Ä/H˜$BŽâs+2‚8bIVâ>¾J£ˆ‰Td_Sš±4ެÀ›7/AÕ+²´^‘÷ÑùµêÐå E0œIvLED(âfØnëCy9L±…ÁÒ…Õ(ŸŸ%,ÍÒ;ôØcLô!(}ä¥&šø…Ñ onŸ ´vƒk—ëc±Òà† !K:$’T4é-AqhK5#U¼çB:uªeéK!HÀñµêw&^ýpy«á Å\T&ˆ5’À17pÙ|)à5zK¨ A†'¨g’2áSÝ`bõ¨q›´6´´š ¹Ì£‹î9Räz ¨°âÆL Ð#BNÝn§kÉÝ÷C. - WÜ /êt£1«ñûú§ç4XÕ¾AMÉÍmŠºJ;U@D³(ŒC[ Þóˆók~í ‰©r"#– h$ÿî¡I5¼ÛAøRâàϙ¶øÇ&•ðÒ<ó>+Œ¥_ÖÁœ¸„ƒ‚?ÆgyébÇ—3gB¾ÚØå’À§™)èÐ;‹ƒÄ~ëlÔw;gÈ#–e2œE1gZl€†Ù´Ï^Î NôÐû õª+€ÁÔôYȾfÇkZÜ5`”„wí•2a‡j?4c¢Ý÷rß²÷¾B´×¦u(ÄA<ÊëÛ­}š´g $ÆôoZZ/ -) öµ`¸«¯ÊÆÆ1ãf’³!K£ï…†™òÔ\üdeÞO¡§‘wsóƒ1R$ØàQÌB¨íFôÉÌéÄœf~šÁ3 Þc…pÚè¿$vS€Ïi:}U®×E¥í}O*ðå©»Û–ò9¤§Á'¹†×#I›( Ád$ï$Øojk~3¾ò›Jd N$ÑxÏÀÒ"UYÿ«Ãn©í"¶Nüš¦…ƒu]–54{h•÷ƒ@ÝJÇX!DM7Œ±P_HOy8&Ä|¯›vYxD@1rÞç9·Ž~±€‹ù¿ÐøCT€_ÊŽöúj õÒ7áé„»àJs*Zílë¶õ¦Qûm±Ø×¯Å‚_ÏñEšDßgÿ~ÓvuU?l’… R¢Ì»rÈñ¡kTÕ®áßÈSlnÖ–V[¥ý.M¡µØÔ{ù7x¾GÇÍ”„­>ºR˜CO°Ë,bð:þ?˜àÙl®î0Jgl§Q ÙJ÷ÇÖÉÞ™äðÔÖß§¯fø¤%ã{mvžgõil{£Û­Ú;¿AÉÄ=.lƒc{8§›£ÎÙùÿ;ob1 endstream endobj 644 0 obj << /Type /Page /Contents 645 0 R /Resources 643 0 R /MediaBox [0 0 612 792] /Parent 634 0 R /Annots [ 647 0 R ] >> endobj 647 0 obj << /Type /Annot /Border [0 0 0] /Rect [305.9943 557.7908 447.2065 568.6999] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 646 0 obj << /D [644 0 R /XYZ 90 720 null] >> endobj 643 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 650 0 obj << /Length 1189 /Filter /FlateDecode >> stream xÚV[oÛ6~ϯò°J@¤ˆ¢n²í°ü°¡-PZ¢,.²¨QR¯èßáM–y Xäááw¾sá!‘Â9›ÐÉ06q–9Åá*4âÇ+dF>høs•÷Û«Û‡9( 6á9Ûj²-?¹?Õ¤ó;PÏG®ð|Œ±ßy~ÇîǰòáW)ŒÝ³†ÚI»\ÈÐ{~§Qìæ‘÷eûËÕÏÛ‰NEÿEXª¬0ŽæŒQ)Ê"'Í@˜ã\ñ¾®9PÒw´®=JÜ{=ó ¼PºŸÃ$üýöø ­%%­ÈØ Z€ðY­ åGi€Ck3-%ðìrïåÄ/Öu¬Ýû%ëÒLÅ‘1µ@ôú6É€wu 5[åáEº/ÆÞÆCMæ€y¼Fÿ Þn_ð†‹ ±áÄìúíÃ{‰ôîY¥ùVW¬ [|qp1J»=;=5æ¿J¦Ç2ã¬b…Ly«m»ß!õéZäZ®¿;R<îÛRÏžå°¨àdd›8wœaMeC!G:‚:Õ¬ží¾c­¨ã,ˆq’: ÂÊ` ýý¤ù\7 ‰aU¹‡­¨¡BL°ÞÓ ÅDüöΠ…`CšðcÂ’ uBã@žs¬þS@J±{drÒ–ÜÃÈ=j¤eÏ€¬ ,H1Þ(Œw_¥ Û˜'·Â÷¢LŠä ßrâþI ©2ha/ÇŒ3WËÙg¨2Ø©:O?Sb+Ñ ˆ»…ë•AÚã­Y"2ÊàP[ aȱ$àS”»G_Y8õºÉ¤FŠfG¢— œrªâRã ÅPò ä­^%à òQ¶M[µ2‹I¨[*Ñ]t=>r¸©¯Q,é+”}_³¦²@ÕFµÐzÑFRöÞ£ô‰È¿“—c7PTd«<å#Åc[›nÝŸZ©.½ ÏZTIJbAcÆW‡M‹_%SyÐß™BYV5òDVÜœ¤¢äG]µww?®µ[÷Zõ\ü¶_óNoÒhÉ#=¹(§¦P'ÊùY,ä·×hÅ(š“éòÝè1¯Úê¡ LЙ‰,@9J—ÝIb‘ödwëïP›ÎTñ¦áàÐÞÀ3ƒ}Þ!J*& p8aé‹öÛÃY˜nŸg93=îþ¤'+å'iõê ­òÒ1¾Øq;Þ3ì³Õ³Æäy"0“Ÿ”ü‹¨u0}Î9à ä02W.ß©Ø\_ôN7}Ú¯ºf Ô|lJ…Y­qS“'º¼æ›w/rc¹éØ3m¦ˆ–žêPDœ‹<ÿÿô1šÑëG[íÒÔ¥¼æV|Ò·‡M5ÑÅoY{CÍú×ÞžWí¥JÛž®_Uà­*½=x6ö8¡ Öö=ÈV£*¨ xMDy$Âæ®fEm•…«nŸLxÖt 1†Ÿ¨à0Ù¡¨H1X 6JÑÍêׯ³´ÚW\òæؾ6Ò’¿ð4=÷\ň46›6æcOKë¬í4?tã0Ýê|í‡þ{>D/2]ÀKX[.=/ÜgÖƒ»Ñ> endobj 651 0 obj << /D [649 0 R /XYZ 90 720 null] >> endobj 652 0 obj << /D [649 0 R /XYZ 90 500.0913 null] >> endobj 648 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 655 0 obj << /Length 647 /Filter /FlateDecode >> stream xÚ…TM›0½çW =iq=þzlÕ]©ª´‡ÔÃ6–8Ú" M/ýïÁN–$TÆãçÇ›ç ø@”‹(UŠç:M£r;!ýk!J‘Œ!Ÿæ³"<9DóÕÉ|ùÂ>¯‹] ¬wq¬¥ÓãDkÍžžpçñ%5{À¸Ú¸ã"Ó¬i·EßʼnÔVj–©x1ÿ:û2?É1RÞL År¬tʵ26²™æ ´t÷ë ?m¤a‡ª^6þC Q)‡ l”HË•=à_<øîïþ…§VQ®«úÍgÊMÓ¹×¶(Ý‘ñÒÂD®Pdû5Ò Ë}¬ÙíïÊ‚œ3$ä\eJB¼S²UέÑ6àŠz9I&yfS }•ìŠÚm¦è py–(…n‰Xçõ÷¯ÉÚûËQx›¹•)Ú§8á»péVÅOnzì/´c×â¢Ùaoe̵}ut¢óÛ«¦ nì{:I¶ªlè†÷‹è|îˆ&Aô.c™22º¨ß\ØZ7]`hV>UÔôVþÃ*_ÖA5 aÈmRJ„Ž÷§ìù(Ö] „Ü ld™q£õ;Z:lŽg" ’lb/ÉÈÆgW&Þf dìr_5µŸð”£HÉAK¿~9+dqï³ôc(ÞÂÈãä]Ö#µàBˆ,àDäRýgÊO¸d œ¨éšdsÿ7zvW†J›r™ÊüLÀ„¥'ÜMW„ÁÖ±u蛲Á7j½aHŽ—¾Y`tï-»ðïê‰5¼ÈnùwÂÝ’Mèý ßýþn^ endstream endobj 654 0 obj << /Type /Page /Contents 655 0 R /Resources 653 0 R /MediaBox [0 0 612 792] /Parent 634 0 R /Annots [ 657 0 R 658 0 R 659 0 R ] >> endobj 657 0 obj << /Type /Annot /Border [0 0 0] /Rect [502.606 626.4217 522 636.1187] /Subtype /Link /A << /S /GoTo /D (window) >> >> endobj 658 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 612.665 240.0001 623.5741] /Subtype /Link /A << /S /GoTo /D (window) >> >> endobj 659 0 obj << /Type /Annot /Border [0 0 0] /Rect [267.2729 612.665 435.1518 623.5741] /Subtype /Link /A << /S /GoTo /D (ui-panel) >> >> endobj 656 0 obj << /D [654 0 R /XYZ 90 720 null] >> endobj 653 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 662 0 obj << /Length 2557 /Filter /FlateDecode >> stream xÚY[¯Û¸~ϯ8@"W¼èÂ}kƒÝ`‹EûE Š-ÛjlË•äœxö·w.¤LÙôº88À/ÙápøÍ -Ÿ2ø“O6{*µÖ”åÓrÿ&sÃ_ßH×J" Iþòü懟sù$3a3+Ÿž×3&Ï«OÉûm}\Èdl©LúEªµNò©1&yÆnßþ†SõTmwpSÿ^|~þ+ðV!o©sQ™ªeµØ4Ýþ[Û¼8Ú™¹¹1Ö‘¾eÁÿʤÙRf€Vj›T¼ùéyÚh®Ô#S É­-JзJæÆÙ¢¨ŒÚä¤E¾HóBá¶Ñ"üÛ·ðï·zÄíçÝÞ+ò’…:³jÚ;nƒX|ÃÅÞsJ+JÚ 4lƒfˆÙ,UF‰LW°3U‰ vF ÿ±õ&;‹€ÝªL¾á‘ÑÄ O´~‹dë~lVï W î–'Ðø]½rdõº+^Jl¾7KüœÈatû}}àe Å©Q;aç½kŸ¾àÅ­š@dwä%¼yÜ;%•ZÈ<ãMê}ª˜ìŽïéJØ\šW¸žX¤¨òŒVD¡§µýnËd:·Íè!³\dEîý`UuL¥ YG ‡Ó—E ç¶Bõlë±ë¡sf‚nÍ_¼‹^‹é°q·4BËZŒkÛ/t^pwÉ®©’•0ef¼} V4*Ó(p‚7–À@UÉX#åbtòÚïuÎ.Èuž€«à Úws"‰> ¯G!n30Aœ&üyÁÝÖHuöŠ±ÌŽèä$®Þíbžtš=UZ¸3º„cà®dƒf/hµ4!h¬€Â2Pü­ù>âå±:0¿ßÞµJ&;Ðtì¾Ü_w=7&a• »q*%l¥¯üþÃ:7ÀµV˜R¡¹ó,ÎÛS(﬿Go @TyÅ®-x9ª=m팧ÒѹòÀ¶Û»­!y;÷/ÐJ ç“E)¬–óƒúç¢ÒÈŽhY»³:yçvç5ú{KÎQw4-ÌlN}ÃcN9ã:ì½8ž«f]#ßÝÈý7®ˆÌùrÒʬy¶s ½èÁ#d;ÆäŽõ@Ð)“À½´õþehç^Þ›`™Ò%Ü“zÕâÍÙ`¿Š{JQ Uæ¯spg(8G”D~\²cŸUª¹ïìŒh‰]‡Ówu”…Ueô«r‹0Œ_‚a³<õý%* èH>¥a‡ÿ™SÅpÜ ƒñ/k¼Õ% ñOmË= d¶˜‚5ßÛa¸‡˜˜Ô∠#jÁÔF²# ÒÓT5Ea¤rÔR FÄgïzµ[…E.l™½0Èvò [Ø+Û!Œ¼lQÑ%îwËñð˜.ýnÅ#_ù\|ò›0Y—xp-dâ‚™ ZZ÷nYOæAož»tk´0 †|z&fäáp8ÃNüLᑇÂ>€ŒAé‘@Á“UsÈþt.™Eï#‡âØÈó¬{;ðTüNäÐ.ªòuy3*„fàæ’AÃ;ÞèT®ù ³Ó²iŸ”õ×”2À¬s¾#ÃQ¶îÖ/üÎÁx¦D.u1·cí0™,ØCþ@¨«’c:CÒ÷g©X¼5óH`rËÇ‚ðXL‘ÝÅD£ ó*Ó¢ë’Q‚š¸Œ¨ïv<€5¾’ߺ‰K(sƒ ŽV‡®9¦Ðíy(zD-ÒJ)ÈR›3Ûªa% }ÄgMv•­ñXMðxæÎ·fø»ó{(²(‘CA¿rŸý žâÐ>ÀW¾@]üäáx‰ŽË !½¤Ë9­ %xÔ%©ØD(á¤ÒàL•;S›ëC³‹± >ŸÇ,;Ê÷”ºâff ÅÁ!7¢Èí•ñ.牚•ÁM/-g¢-•‚õާ¸Ëš›D^`fñÌuoÿ#åÉ4¶óVÃæ0õ3SÏttª¥3ïwºg›sàE¶°ÓÕÓÖ`´$}iWÑ+J ÜÌ^«¯çn‡öi»iÛ+žõ\~ÁуLQ“|lšëu{¦‹âÉ`ü* ‚¢éà`¢KCÂÈ»È-ÃØëªZòçÓ‡÷¿~~Çm¤©7´Q“ȬºÖÖ@Í_檜iy´˜èi{Ë讹àd„¶Ê>2×D÷P†¨ÀÇfÉAƒì$^_ß<ãÐç>QžÌ×m©C[bÊ-µ¾ÞЬV$†T¨¤Vwl9Ñ¥!ad+· Ù–¤w v®ôU8úet'x‹ *L±»qýGä4‡Ëæf©>(¦Š’=YÚaéñ(‡¨ù÷q{NÙ¾LÚ0GœÉ¾ÔÝ·›­ß8ÿ„ïGOcã(H7|ž ™ÿžæÜsPØ2„öÓb^ë’¶~¹¿ë ì›õ”9Û k;OîÚ¸B»^_?ÓSÅÈ+Ô÷Pž)¡:•û°ŒoF›AÓ±îíÈßU¾|»Âtg8ùèvíòÌL)öÂ7\¾t%T_óÜ ghÊá!ªû¨²Ñ Kr€€ ç40€(ÕíWð˜DÜpcí”= .eó–`®¹•¬¹ `À*Ôï?¿Yðôå•À’ÁfT£µ{ŪW!ÛÌ×fTTáx ˆÍ©àØ8Ò—msp:ø4tØw³2ÈÊË!ôå)~ˆŠ2"\Ö¸]ÿñcLœzÎev1ðø&¨|’R˜Üä·U8äÂËzŸ®;ô­4'_ƒfºÜâ%BÆÀFÁÄâOžÚssOëµóÒ;Be½¨L¼S¯é²p% 4¦3+é§~ÀÅÎ¥‰Ç Oi¤³/$]Ñçt)T5½RÎóÀ5ªþá›ôî<äKØPž¿.V–ÅUåøÎçç×™™.…,Jõ¤¬*ƒÛq'3ótiHËÌnFæKþ¸D–Ó4ã¥Ì0Š FAµÉm¥–"ƒJ’‹ ö^n;Ñ¥!a,»aèr[£dòÑôÆ2‡|£²åLˆ!'º‡zÜ0œ¥¸ òLqmÎíOG½ÍY…î~±šÊ¯µÅÚÖfÒ>²ÚD÷HÛ[†ÿ—Õ´†$®û#«Mtõ¸aµšT•3Û /gJéµi<ÌËä34ȶeh[-o~–îñòm'ºG{ºe8U(÷–‡ endstream endobj 661 0 obj << /Type /Page /Contents 662 0 R /Resources 660 0 R /MediaBox [0 0 612 792] /Parent 675 0 R /Annots [ 668 0 R 669 0 R 670 0 R 671 0 R 672 0 R 673 0 R 674 0 R ] >> endobj 668 0 obj << /Type /Annot /Border [0 0 0] /Rect [284.0366 460.2367 417.7527 471.1457] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 669 0 obj << /Type /Annot /Border [0 0 0] /Rect [449.3929 460.2367 522 471.1457] /Subtype /Link /A << /S /GoTo /D (ui-panel) >> >> endobj 670 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 447.086 182.7274 457.995] /Subtype /Link /A << /S /GoTo /D (ui-panel) >> >> endobj 671 0 obj << /Type /Annot /Border [0 0 0] /Rect [437.1672 290.4733 522 301.3824] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 672 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 277.3226 131.0463 288.2317] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 673 0 obj << /Type /Annot /Border [0 0 0] /Rect [157.2897 277.3226 305.9019 288.2317] /Subtype /Link /A << /S /GoTo /D (progn) >> >> endobj 674 0 obj << /Type /Annot /Border [0 0 0] /Rect [332.1454 277.3226 518.9697 288.2317] /Subtype /Link /A << /S /GoTo /D (ui-cam-focus) >> >> endobj 663 0 obj << /D [661 0 R /XYZ 90 720 null] >> endobj 664 0 obj << /D [661 0 R /XYZ 90 720 null] >> endobj 660 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F84 667 0 R >> /ProcSet [ /PDF /Text ] >> endobj 680 0 obj << /Length 3161 /Filter /FlateDecode >> stream xÚÙŽÛFòÝ_1o¦‹Ë>xå-1&»^ØÁ X$¶GâˆÌH¤–¤<žýú­«y‰²ƒy U]]]U]7GÝEð§îòè.5&ÌmšÞíNo"?¿Qò¶Œí姇7û9Vw* ó(WwO3"ûß‚÷¥;oTЛ­ ÚÍÖ$?l¶ÖÚà¾úÔîÈ럚ÍV§ÁþÀ#-wˆSeƒ,ÞüñðÏ7÷S±ÖßcQ®ùNõJC­b+|'™ •±1ñl¶q¢ƒ{à¯eÆÒ˜3 ;g°³ÔhÉ¨Ðæ©!R?ְ˦¼èÁn"i³à„²f£¬«:~:~œÛæ€úq'ü=¼—®Üz£ó`T¢Ûá[/^ª¾äÃÿNÍi‡}©Š—® Ë‚… ZœkÚ5'Ø‘««ëG¡QJeBG|Ñ|”Ns8ª¡M_`SE^x¡/‘Ãærðˆï?ò‹«÷ü²sµ¼C5rÛÓ¦£ÇDЫü8wD~×££ yºþvFq¡'µ!Ê+.4—")È ºf1Ð\WSÁÛ Ù­16¸tSó¯P™tFÑ>¹-…t²`¢N»LMB§}@Þr¹"G·âçÈv‡°¢ãŸ$<‹©‰!`ib«ü&~tgº{ÖfåŽÕÿŠ=¯œIÖC‹Æ‡¿IxÒ"Rwâë€Ë;oüïG ’ãåC10¡ø^«#4àåqðg±ë…¬—ìPÒ¡*> !¼Ã&ê¢cºÉfCŽñ$äxņÎd^‡¶ ±ytà“I’%‰^)!ÇF9ú¼ žˆþÉóèƒßU^/¼€~a£ÂuáWPIð§ß@zøLD8‘T‰@ˆ•’!‡4€w…®axÚŠä£Îé:0 FàÉrœkÑe,4ü,¾§éQ0L¢ìë«“ÀªZ r FéuÇdpPµ}a÷ƒ[KÈ×èp$R '/ˆåPäW>bUψÙ­góFtœ¤ ;MZ‡6³ìAÔ}ÕñΞÑúPÕÅZºIU˜XË>´ 3ä"ŸçC€.Ç‚ƒÍ6ÍC•Y37”¬‘ëë$sûüœ¨Ñ.=EQ9äKö`‰ÑˆûHh²z#YU¬5¸„–?ôŒLQIˆ“°…4˜*J‚'6´Σ<Ù×GÞèÚýD4>ÒǪ›!i¨ÅÞ={+ýž»qŒ@NÂZÄ…ÑîÒàå\S‰4/c²Àø]ï)I<ŠÉA}Í=VG ˆ^Õ°ÝÜ}•ê…Ç — ÿñ)d;ÂȆÆ&Zʇqž°èIˆÈ „ þÑl ‹eн/dð9/Ž4E*ÉJ—`O ¢{/x•œ¯¢Õ’! ;J#xܯ¼õKýêŒk¬ûSµ ±eî“ nƈC*mˆ÷h‘ݲXsP•DaœæF< Ž•'½ZZ((u¤ÿ±Åœ¡&°CM@¯Ëë{Û­ò¢’ T->9¦°Â„‰B;ðp¦tF' ×§66™A‡ÆãÛËÈŠcÇ01D˜Äè¹kÌUûµ»cEÙá öœ-W'‘èþ‰,–à¶­aˆ€Ò÷MÍ{虌‘QæñëmÇDs¬Ö^ZÕ‹³[Vº(c½Êƒ_ËÊ×C‰úÆaó0ÎA’R§^jª©J@—N,Ub²Ý~O%@Õ ?lB½c$'ŽÖq6 4q¾ä€^ªãQÈŽÉ’•œ×bÑ6 Éh>R!ÇŠ`oÄx Šx(Yœ,8J‚Yf­ÇÑS$(Eª!›ˆŸÜÅ…ÊØ0ÙÖ2ÇɈ=Á‰¡ø„Ùû0þN¨—\r­ÁÛIŸcBx"äZBMTî—‹íWu×áñˆ=÷“4Œlìû{¢p°|lV w¹Ãý=Š£Ÿ7Äæ–] *ùPÛtáJ]sòùKG J(¥V¾eÝ=Oª ñÖP ÜÏ’2ñP:íÖã”d¦ N@þnù.\MQÎ&YÕXà"ìÊDa?‡ŽšìûÀ[\ïO[µ¬Î ‚c~Å AsŠuøo NÉ€NRís…~$”ÛG¸±ÑÆL°Öâ¡C5“èåE`#Ä+jª1B’›Qºƒª} ÅDûŠ÷}»Ÿû‰ #`¢xrT9Q¹^Yz¶kF¸®^}%‹ã-µ}‡“&”G‰r寑Ú2®Æ:>ÅQIÒñ.“õîŸM‹Ð]Xlœ¸E!\OlÈZûÛ–W¯ïȇ6™ˆ¼BqºÕ 3ï_[Gt%d†RYbÆ­1åÇÔØ3Z)ÜÜñÈQ›W/. †éÆ‹`‘Sħ(V“nO•'—Ín´œ¸@)ží¥fjƒ›ÐO1P›µP"3È2¯cáanØ`F*ø\Ë! MòPgZÝ™8 Ó(Ã!ˆM«“Aà€¶à­ 1¯È¡®>;ÊäÄ&Ç*H¥ADÜà"x žì s%>#¿ýàØ’¹ϯ ¥BzR5˜›[Í« Þ~£ Ä8¿§h»g¬ê3U­ü‹:N|i.=Ãq”csÊÿÿÂd2qqšÖ@—ÚüBõ Ïèø=R–ò>þúp«8ˉ Ϋ§ãC&;aá‡ÊK|aèŽ.õ8`“ùª¯çዊõ* ¦9_°uÀ[Ëï¾ÆH©ò§RWe Læq€X‡;^nd‹ãŸTòuϾ 0ù­ùK6¬ž‡y`/t%êô¥œ½R×ÃÍt¬vðýj„ °—¶êÇϼ…’hÆ¥ÐngOvƒ+”=úóE!€8Auãìú=’üÈË;. OlXVê$ø(ö2ä¾tìÁ²<¨žx+›|š]}xX¹ìë´—€Ãý÷Rt“ÒÜÆé8FŒ½£„0ªxEWÊN2¢ˆªâ…Ã#µ1ÆßËë1JÌ@û± ¦ÏK4Õ°*øðÄ Ç(·&µ:†9PA¦{¸k´«ý>DfÀNúÁÙ'.m¸ARÿá…ÇžôÚɳÉ‘+x‚-©ìP®ÎÏ/‡ûñßèð³ ÉãùX‹ Գ“»6ØÃC×ZV[~òj›e¨Qá}0bú4–qq1Nes?HƒsÛ»JˆãGfS¬0Ÿ3$@J|Ì÷DÝsz‘ÇÃs6¡5u !+Æ•©ó_ójóÞå\~>Ê€Vá¯xñs5]KèÛ8·ÙÃXÌM¾‘ooLZ³[@é\Ë)hðƒÄBKø£eŒjöÓ?Oâê»$îZ|o9â¾”ýcÌ[51#<6ÝnììÀ¥µâLZJ7‡®–ŽG[b VÜAO¿Ii¨ ý=ùÙ+zÏ8BÇÛ8œ½eûiŽVïõ%'Ãÿ#W¦g­Bá…ùQžv ÂÝÚýÆØ0hßc¾e²˜3*‘Å‹±‘øºÛŠ'Á4^ÑjoÔÂè ³ï;ü7w_' i¬ÖÅSa¦2í?½5«bA¤2•LÄòS tP.—÷Õ˜ý ÌõYQ¾-¬Î9ȸÚqË0ÒÂ±ÉøÙ§9áeW¾$UÒ'¥¾¼þÞ7V¾,%ÞÂ;\ª™·w»~ƒ‹ƒmÃOÏó_¡Ç:žÖô„ªÏâxÑ9>”…h`H†ã§-;LÅ¥çý?|Q endstream endobj 679 0 obj << /Type /Page /Contents 680 0 R /Resources 678 0 R /MediaBox [0 0 612 792] /Parent 675 0 R /Annots [ 683 0 R 684 0 R ] >> endobj 683 0 obj << /Type /Annot /Border [0 0 0] /Rect [469.2821 348.5868 522 358.2837] /Subtype /Link /A << /S /GoTo /D (Module Installation) >> >> endobj 684 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 334.83 238.2426 345.7391] /Subtype /Link /A << /S /GoTo /D (Module Installation) >> >> endobj 681 0 obj << /D [679 0 R /XYZ 90 720 null] >> endobj 231 0 obj << /D [679 0 R /XYZ 90 720 null] >> endobj 682 0 obj << /D [679 0 R /XYZ 90 510.2574 null] >> endobj 685 0 obj << /D [679 0 R /XYZ 90 175.1203 null] >> endobj 678 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F54 112 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 689 0 obj << /Length 1597 /Filter /FlateDecode >> stream xÚXYÛ6~ß_±p";k­(RW¶-Л òTE‘(W’mbu¸¯ä¿w†‡,9\')Ä£ápæ›› ¹à¹Î‚ë„R?cIr×Wa?^C-Ab9ùuuuû:"×$ð³ #׫õDɪxçý¶å»9ñd9_¯›/)¥^üj¾dŒy÷pðdOˆ×ðJŸ¿mçË0ñŠ=0+uÜ#JóÒxþaõÇÕýj…á×`£ˆw8ÆMHê'Y]Ç)ó e‘Bÿ>ˆ‚²n‹}U.‹r-@…‘7»âõ®2_df¸þm©ùd7 B=Ï24v–$ó“0VfDþA@¸þy†ºCy9¯ª²ÐüŒÂ ð8óY”Qð5ù›²­?Šòà²?b,3¢/´Rkû8S¯Ýwú+ßw˜üO¤æ¸]™#_¶(rœ§Ôó!¡$òVÛÓ«<̼Jõ#þm¼z£„ÚYˆöâR£‘Þõ¸Ž¶$7XÀ9`Hü `[B}ºà$bàJµNé¼­w¢ÒœÜZšjÐ*w§s¬Û®Ýt¼¾FL¼¼+¹4äÖΤ„²±ÿ›ªJ@U¿1ÍU¡ŠhúED)D£™À ñ„òæ 8zT鈅Yà‡Yv1¬ÆC<(¨éy:ÌWJ!ëqH7Sé,cê1ºx»ß¶ª_ ó©®—®à4„ ÌxÑŸnŽ7Ò¾¸qçÅ4&Ï^QÒwÖøRö“:#ÖŒ=«ÆÃO¦ÿí¤‚²xzy\Ì+I])÷]ƒ’½P?FÍK$¼¸°Ê:ü:©Z:!}ž¦Fç»æZ;ï6ùí¹ÍÇË1‚V0h ”vÇ(þZŒDc]ˆÚ?yç*·q^jÑÜX’?Ù›'îñÄ-âhiòÎU«¨|’°ã9cÁ{(N²uýgi‘Ù–4#mLƒÀÖè™KþÌÔ-%4 ”¥€&Õ º¬x³ÁÀ̃Ûsjàœ²ïñEÏß¾­ö§nu[.äÄ l8°CH02´µÝ( ´º´Õ`Ç\‚;P›#®©2]2=ôÍÎ7ÿ2ô#K‘G+׌÷ˆ¬m]£Ç–¯J(¶ þ[­”Ýѱ/?éŸWv´Ÿ‡†rÏy|÷Ž}±œæ¿,«ªw9l¯Útª¤éDhõÿ<`fð›ewØŠ|;M‡Ý3¢Çy“—Ï,Â-„φažÏÜ;ïÂÐÞu0ÖáÙ÷†Y*Øï eÍl˜‰ø?Aÿ,ÿ¤— endstream endobj 688 0 obj << /Type /Page /Contents 689 0 R /Resources 687 0 R /MediaBox [0 0 612 792] /Parent 675 0 R >> endobj 690 0 obj << /D [688 0 R /XYZ 90 720 null] >> endobj 687 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 693 0 obj << /Length 1197 /Filter /FlateDecode >> stream xÚµWKoã6¾çW H›Hõ´›Í¥Ån‹¢9Õ=u{P,Êf¢‡!щ…bÿ{g†¤,9R(Däpß|Ãǘ-<øc‹•·H‚À]…I²Ø”ž?]0=r@êü´¾¸ù±óÜ•·b‹u>r²Îþ²~Þ¥{›Y’Û³Û ‚ÀŠ´0 ­/°p4+̪ÒB­ß×¶ã'VvaAË-¢„…Ö2±ÿ^ÿvñe݃Š|ÿ=ب2ÛâfçúQ¸ˆ—¡Ë‚0"ðy^ÚÝ7/òZ™Õ #v‹À¯ãÇnà±o>Ù%²~¯ë½*) 5|EÁ3—ì"7ñ@×Ež¢èÓ -9SkyÝ('BÞy·j¦?òê.#PjúùaÌ £04~bòóç>K%¿ç*›c)ªkes,Ó£v'iw’3Qéi8 Â9 ¨€w­§0QxBªæ-¯²V 늫AÙ¯ É›TŠºÒ°jõý…×å³à/.lÈ×Zï„ö±©«V´ÒxÌç«¢4RcV–i•õV*ÚNã*•&§3>ó<*^ÃSm¾p\6)}2ž‹ªwWÏx â$²î¿üñë[ë®ë¾æ;m˜‘B<ÌøeÇ =)šÛ³ŒÓ<¤zC½Òb°PS5)yQ´3x‡¥¸LŸøY¬ç´8ð;Wèñ%Ð{©†ç>Ú=߈\ðì @*§©õ7Îñÿrþ(œ¿tã W2/êTÿ%o§Ò•œD¢Oÿ8¾2™¼ˆÎ¼‰ëÇÉpCì׎—¯³îvêÚÈŽJãîtMbžæÝà:lt{CfÝ+ÈŠÓ }t¯} _€}™å¨xùN»Š ïNu9‹ro€Yíø\û¦¡À@YMo­ÙÈ£GèñÎ36#Ö,ý,=~Vûƒ&WWcý+muï¼\ÁE|\öã)¸ø|cý>øñCÁ‡,ê;åôE.eÏ¥IR¿Ò¾ƒ L'õc¯å| Ï‹ý!/¯R ›ÿ]6ßò¼ó¼ Deá­¸Qú¤ºÆ[Ú8«Ä–Îôx4y$_Z$¢†o+*[·}(÷W¸{Ð6ãßàÈᢨ¶J”ªOŽíbµ¡f@a7x«Ø]Å«%$Œ`Æõ™J"„‹Í÷WZ_îÀ;^LªEˆûÚ@P*‘µ†%È)cî<Û<Øëv”ßVi¶åé†Ì]}¯ÆP'cº‰Ã -lªÉ a,­ºÕr|ú°‡&¼ZVÖ¤Ó÷Ó(÷˜ôj5O‰Ò2•zì•RˆsLCi(ÃÚ†ìŸmðËu[/EÉxB«NT?HÜ6™x@öð_ÿÌûÉ^¤‰ endstream endobj 692 0 obj << /Type /Page /Contents 693 0 R /Resources 691 0 R /MediaBox [0 0 612 792] /Parent 675 0 R >> endobj 694 0 obj << /D [692 0 R /XYZ 90 720 null] >> endobj 691 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 697 0 obj << /Length 3544 /Filter /FlateDecode >> stream xÚÍZÝÛÆ÷_qðK)Àb¹_ä2yjÇI×@}Eœ<ÐïÄD/$åó!èÿÞùÚ%)ñ,£èCqÀ‘»;ÜßÌJÝdð§nÊì¦0&-mQÜl/2éþí…’·5P¬§$½}ñçïºQYZf¥º¹½›Mr»ý|·«V*êÕZ%ÝjmŒIòoVkkmò>‡•«=¿mWk]$Ûtîi¸‡W(›x¿úåöo/^ßF¦œÖרF’¾õ”o¥|Z”¥»É½M•±Ž¸ÿ9sÙ}Ýê¡{ZÁ<.©?W‡d ðã~ܵ-¿ü>SÈç¹pÖʤ޹^\ZøÌÓ"·»ög²¤´ßËëXuBøÔÔ2ØòsÓ‘Hª¤oFeIÅ#È)wlªý¾Þ ³}j¥ÓÜ:’ÁµÃv˜µ&µyV áã®Ù¬´Ov¼Tà¸:âÓ'ͱªã¦æÞöNXÞ<âkuÜî©g18q•‚¸II¹Œõ…ºÀœ*RåU.Ì¥Bbç'šz_X!ù9UÉN” ™è7mÓÌ»°é Em]ŽÆjrÕ ÜÀMZç`“Bôî ¿ù‰?gÊŠúbó®í•|øˆ¢@i(MœN«Eá>2Á¾·'™¾åÎcu8c¦aáªdCr[BUùÙr.HVø‚TYû øhû_uòi…óîO<£ö0'騑)?’=ÊH#¡(Ùk-Æ/èÅLÔõã®îäs4)Ð&kdRÔ©qé^èO¼Ô¶jùè ¬d'Cs¨i!4¼o¡¯ôÉÌØv$l.‰C‹¼˜¼Àå üçI”i‹:çñ¹«l»ç%^Aga“÷u}s©±¥¹Éµ…íWÚEÃwéÖSÂ_z9á¢G-?>¼{÷†~âÝ}2ÝסámBJH»øe%;q¬Ô÷Bæ²ó]YgÓRër¶«'é®íêrB6áµ³&ù™¹£ƒc׌m*Ö¤W‹¾ÃäañéAɹÙÔzðöl縈͌˜rfiéfØKëãJ—¨jHòˆ\Ì 8Ó㇧¨òÐ7û=¿õt`õl%“´`[`{¿F[¸-Ÿo†/á@%âupIšÁ%¿Öd7òùGïØ§;¯Ø7„Ï…ö¸+RJ„ôŒ'ÖYꕟÒ–îßa'ºLÂ<{4$¡x=ÓÏ$^ˆ¥I©k˜4ÂçQ2ذtðµâGÄx^b÷FŽ&ðÞ¦,-]@8Èõ<^ÿ M ‰­Šl°Òš2Ù¶K’teše1¬ÜÝíOýa?lÛÓð\ð€|¾¢øoÁµû90›MD3È=ëDÝ|BM@ÿyn¤±iÁŸ’óÆÏšÃA|9ЭYÊ©7eq¦8€XžVÞ ùZã“Q ª€`s¬»jFgIß02PžœM3 =Ó3 âѱ#Fj UA1¬ÉõVæ­dµ@d‡ü“fát ý qå~×R÷¨r<'"…4»©RÐ Kn1Ž4kí#’p<‚þ·<4n:É‘‡N:m›t¿êùûŠmúD{Û?q'œ*}%§ºåÞš[¤ÚOvÝîy4ð*3[:ˆ®a¦'±iHN[€¿jMyXk‚ûªø}uX° «‡§íúø”Ñ8ÜAL´÷hŠÕA¾ëùYÉ÷ÍQÐű‘ G ó·a²xÛ×Zç°k@ùñH\÷Ø]œÁ4N‹tÀ}—Mžª¬î{X\?-t¡ÏPôl–"µ¥ÒÿÅfúhG[asôOÿG¨øqæŠØ—>5Z%1^L‚@€qKqLR»™£ûo9e›'y’×më»æXÉÝ‚xûúýKýÚògð\MÓtÞÍèù¼qq ªöktšÙxh²ØEÜV©Qf¸‹’Â%<öm4eh4Ô ÜAâ/|BÞãDR×—ͱ•>@Tø\2\øtÃIÈ2œ#¤¼E¹¬8À&ZÂW¿‰£Þ¼Ì­ÂÀz!r&5î ëD)íˆìc¶KµËÌô£R[˜€#Gw_Zá^ú‹d‰|vi³ýÄ”k›ü¥—Ä»™ª’îeù”&é$ lÆ ŸŒsûz…@Ñn¯ÈÁ€>,$h^“ÓãŠeˆÐ?ì%vOâ‘Àc\î¾> ‹Ì0HÂMa/[t-à0ÄÂYÞ ÀëZ\Ò9dˆœª¡3u\«ÀÞ{”Û(¢£ŒÊ3`O¤äÜ‘vl¢¾#I%¤1ÑÇxhýrë6¦²èDn´þQúÅ×»±H‚½¿Eî0„?¢É­-ÂsSªœ|À‡Á]¨¨†Wï§NÒ̽òs8÷w@R¨+y°Óš['P'¹ãšåPdV2ßLöqT¦ÿÌAKG0ºH½˜“cßS’ÙÉ•nbÎ9ã‹pô*ù4\ŒD%ÛB>©1ÐþvõÓ’Ÿ®g{Ú!lž˜æmòú}›peÑU pÄÆ¤ÿ®EDŠ<(¬m˜X0/MÉOò·Ç±ÚàÄFªq[ðڈߪæÍr2ÕÐ5„…’š}ÆswÁe[ï“ו”ûÄB³ääáú %9¸#p?Ã^ÐÝȳâ;ÃV²BîãJKp™ÐVf*ÆZE ¹ó>òp€„€âVŠÄ—»I*&©ÝÂâãù@ã1À«a·h^ GîC}IÑù墅åXi „a3l.ØÙñUœ=+T #ù˜/¡J:_†pôò—Ï$ã:·ê²f‹E>Vâúž«z:¸þó…|Œå¡´*ha-Ðк"À½¡âÿP‹RÒ~‚Mi=ÊÏ/—}ÅÞbæ‹«L츻PÌ4b,‡×PÃC©ˆ Î. =ÖLói¥PâÍ?Pþ²—€Fgý ]‡b…‰xõ-  —¦Æ–6P½âÒEMÑ@ sE.O­qå3%Å@¶žÒ-ÔÞ.¦Ã]¾¯7CvbSj~ýÀìbtûE¸|àB!ì2_(–8·šñºX(ºkÌ^N8 `ÆÙ47Z/]¥`Eò—2¦jâ•(Ï ¡P @â±¾ ÇàBša@‡ƒ­9-fš¨\ð~ê똆ñì¦cÌÒBQ\Ä9?çv9¹ Zªk†0a\1*<¸þ éêÿ*AúâÝ×ÿY:$I†/(\8¸ÑÈê šNTuòrŠuõd"Àl\íÙ‹»ìëkÛH–«yQ.YäJå¾™¢à¥¤?KmVêkÀÒ¥%$ü!PÐ…d•2èzªû‘k¿ŸÆªÅü¥ såy(šÌUª[AõP“A_žS ¸Ì{¢×4ÝdC„ÈÎd¬2—¥ ý³ägS‘icUw9õLÂM9V“ nUc=Ù‡”†¯g9†t‚Z`”-õŒjÑFŽøÜ»¯º¸-|Lÿùüy‰à JJ¯ÉóTks5£ÈSW–ùåÁCó£¤Þ€¸13Ös‘n[Á_Vɇ2c’Š .¦¢¬ñÂEjèê8VŒŽÒðð‘KtôZ‡‚&M!½“’”¬¼›rÓЭOµ_”~‰ÎF}‚þÁ}ßð#”ŽÖq’™LžusàÜÔxG5¯œXÍe|JrBá„ì¢ÐR¦ŠÝäÅ®똛›ß18Ê@#3žúxUr¢¾µÉ®9à´..£rœUw`<ùBxÆ+elŒ¥XxüBöÖí‹`áþV{®äÅjépª†˜+"Y¼}¦ë ¤ ?Ôìê‡NR™XÆGjšdÿÄDU'áØóá[˜|8ñ+Ÿ¹?/^á´Áû‰1 œÖv)/ÄÀúü÷1àFlƒ¿‘ÙÕƒAjÔ®Äí){ÂF{¤=8/…r|wä#Iûž8vt<ñÐUÇp^‡fËZ"À¦“vê¤*g {ñZ^J2J~1A¸Ï p…¢-,Øöå}¼-Àê‚‚Jµwæ¹ûø@·ž.ÝÇ_L¸t\¼‘X'úî'DÏ,ó{Ù¡Ê.~Çd þ¼ê”‰øé®q{9¡Ü³ã9,ü|ÁfYš9wMZìÚòÓÍR ‡MUZòë‡\½œåŸ-È-¶Q‰é$'&qæ|s b–ÉMzüy×s¿bˆtë)áÂö.' Òµ‹?QÎ@¾’Û âtW¸˜ð"—+ —s!™CÃÙÖãÝfÌêâ/@ v)•_&¡ ïøí5áEºk¼_NøeábIáSuMx‘î*. Oe™H/*d…‘ô2VÚ]Ø“/S«aê+R‹tט¾œpš{üaG–/ÝÔê,ÞˆSH§ñr¼Dí¹=ì:WtI mŽ×ûPî€Y†Å7¨`*¿îÆ3ÏÒb¬.MU+Ò-k¸”¦ I‘™XÂ~<«p„¿`X1ÁB‚¼¬N½>ÿe¡Ôièg8Gù=NuG¾¼ ?ÓYÅŸì´ˆDùç>•ü^èŽî¿é3é‘êfÏ`ä#á¼ÝqÇfÏ¡/¯q²i%—ïÆ±6[÷ñw@Ñn›f¨ì‰õmSŒ?%:;cQÇÿ†÷ endstream endobj 696 0 obj << /Type /Page /Contents 697 0 R /Resources 695 0 R /MediaBox [0 0 612 792] /Parent 675 0 R /Annots [ 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R 705 0 R ] >> endobj 699 0 obj << /Type /Annot /Border [0 0 0] /Rect [255.3493 626.1744 454.9229 637.0834] /Subtype /Link /A << /S /GoTo /D (OOGL File Formats) >> >> endobj 700 0 obj << /Type /Annot /Border [0 0 0] /Rect [314.576 323.7087 459.5761 334.6177] /Subtype /Link /A << /S /GoTo /D (MESH) >> >> endobj 701 0 obj << /Type /Annot /Border [0 0 0] /Rect [247.7829 118.558 373.8696 129.4671] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 702 0 obj << /Type /Annot /Border [0 0 0] /Rect [400.055 118.558 522 129.4671] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 703 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 105.4074 126.3637 116.3164] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 704 0 obj << /Type /Annot /Border [0 0 0] /Rect [153.6364 105.4074 311.8184 116.3164] /Subtype /Link /A << /S /GoTo /D (hdefine) >> >> endobj 705 0 obj << /Type /Annot /Border [0 0 0] /Rect [339.0911 105.4074 489.4246 116.3164] /Subtype /Link /A << /S /GoTo /D (read) >> >> endobj 698 0 obj << /D [696 0 R /XYZ 90 720 null] >> endobj 695 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 708 0 obj << /Length 2813 /Filter /FlateDecode >> stream xÚµYmoܸþž_a¤ª ni‰õ’ÚCrHqAÚØÀ¡¸;´²Dï ÖJ I{ŽþøÎ¹ÒZqï þ°9çå™:º á/º*«,ŽU‘dÙUuxÊôëHF[ ØÎIþrûêú½‰®¢Pa]ÝÞ/˜ÜÖ?ßîËã& &»ÙFÁ°ÙÆq¤o7Û$I‚w°ðÅ­DAW¶¼þ±ßluÔ'˜liy„ “EI›ŸoÿúêÝ­ÊhýßÄF’_!wš'*ŠCr?6-Jšà,àM£'ã0 qj3DÔÉŽ½¬âF\°O<4x¥vä¯fâ߻΃'Þ[!y‹dÕtð@Ç혮ïd*”xd4îÆ©ì*Ëíeš™D 7¸t2¿tœ*1:5áAï&rjeÃBK‰V™.ý*¥GáI £WÔ7¸÷jZEy”_m£XE&dèÅ l˪á¯çŠ„ÉïÜwÀS~iì#.$ýÒL£¢S¢ÌšÀ©2yA'Üô;5ï9)¸·Ž2Ð3pêOüñUÛâž Åi„­;¿lY.œw¶ÃqÕ6~z£ád/ç6“p¢Eº:Xì¼õÜ@HØ?¡@O3!Ö—åʘ"þÕÆ{ÄÊ„q¼´Ç VÜê" ¾³¨ý,øµA‹@§óTBG j„>Ø#'>’1„iabjRiÎΉ¿.8`Ô°§v†mý=¯²·t5ù÷ŽçJþ©ØG%¬2Ëž½ìà9ì.áòògçjp¹DÖG+OLäA8,›¬ù•fq’bhŸ˜¢ä¹£×Xå¨îgÆË?ä µ,w2xtŠuìPš.P¿ÄîĺƱc9<Þ‚'Òô“¬\}_z¿oÝåGD@f; ¦I,)~,w–×Ê;Š‚þ41“(Ppf?ªp­dŽ3 #ÜUÊqBv}–€/B6 ;Ü—•lÃË•m…Fd¨Dƒð¡™ ³å(Ðó(ðZHI ¯×"ÅÊeZëï(u3­ñÒ‘xs„«¬ •ç¡q€IƘÇó¼4Î#6lÏW³)â\“V€Š‘gpó,i# îaîÔòä#n/]"Éy‘lcÏ”<t|˜e6Ú#ƒ¥ñÀÄ‚òÆyŒ¨Ïx_±ô0, vg¿L‚û¸í E7;ú$?Ãó¸Xú?6yL˜›,¨ÈÎ&'Œ:u<éÖ°ç!.ùsÜ[Êñ0|¤»×yŠx²›Ã¦ïž'" "ý!/ër™ÉÏ÷†ñšöIÈíù®3­B8òü‘UB(.™ÎšÀœéÐLñD *á$‰”\ÍÄ1´¤$M³¹¿FE¨Ò"‹Äc«ih·ß®96X¼(ŠTèÜA;Òô<Ë-rÒC¥³„ ÄIª)AiÃá ¤>&—b©Â}18^ネÛŽd&Ðøõ–ošùZ Ē๴êâqD®!6ËÞO\…ÀL¼ßѧϴã†ìEÒiLŸìj.p‰c‡Ä·qÜòáÛÄš¡j-Ÿy*ÒyL¼n÷ "ûS55½ éÎgö"‡šY³Ì…ßgºÁ¥Ì(¡İ=Çóœ+ï;0¿Úÿ|Oûrâ¡uÕžjŸJBê BÈžíÈÄ©²:CÉE–:–þ~¨×€P­Â©ç|8ô-ÍX@ÙyAŸÒ2(TbkK`EJYlƒ(+ˆšrbå¦: ~Øä‰#8W÷Ï7¿GæŸàûóÇ>¢m¨Ð*9Òý°ó#¥â‡µûbé‡C9ÀY €Ý?!̳×Z:ßjU­Ö®™‚ÚÕåïßóq?…&¬›q(ÔOþA¦æe*h´Öì‘â ëW™1Ù2ziÔç•ÞêâD™Ä8ß©ûUÑ£ Ÿ Ò³è¾h@‰¹í¨›Ái¾šúá nIµ!²¸ß?7Õxéá¼…g]¿…c)ÒŽ®[%0™J|IXÞËjÕú„ËÊAªÐ™YxZ'PóöÃõézWí®;(æ× eN+k=ÿ:3/¿”pø)Š®—#phz™Ùeûý‚?äžëq×ÿöž‘A>ÿôã]{ÖË£âh½6×IÎÆâ²¹­yŠOU>µ-Ú„gï‡1:¥{.IŠu´ñÙünkR¦9ôoé̱k[çež/¾s©(§}çÛË4¿´ko3 -p‹˜©ÿþC•>‡cÃïDà­87XñTœq+ ÇÆ‰ñÉWÔtì›Q´S²G"16ç%~72¿.‘ˆTŸ_CHW°eýQ(õaµÈôé¼\3/Ø+Ï ±×öÃ*6 A¦Ánj½בvn²ýþëŒ\¦ì¨=PþÈq½æ%ÔHY×@qÝ<Æ7°‚7þs°ó(!¤Ç"U`‡ªÁÈ_ŒQ:&w™å&~Kê£<öÌ„HükïšVc•“.¸¡gØC­ÝÖöžÞ‰1Ü_¿cxá/ýZfÕµƒ×NʵF&+Š%Ì1Sù Ø]›‘µ€¾mmÍ«ážÅʤÚùƒÚ¯Qǽ–í"È+I1O¹?^´'žŸÜûλX#×ï¥þÅ…srÈ¥ %gè¼Kë!€îLHB._^¶•ÞÀ! ³ü²†à„Ú Û"ãæ’lÌÿ €øŽ2ü=¿ê/Ô™:Œ³_¥\ïž?Æ$Ð.è5Þ ï4Ë_b ChgE܃öKÜ<“|ñ¤jð¥è7ü;ÿ¥“/ÿ;‚ìùRþQqiO\âv ®ñ¥×5K–ȃ? ¤CnIÒ4]Zmä\~×ç~lï8wäGKΓ$»ΖÇ#AIM½¡y6K°ÈºìxÀÏÑ‹ÓÜQ>7Á>ư–oTùžÉø]]»çwÍý”é˜dѯºïbcz奷1êÁ/ŠÂÑ;rmµŠÝ+8rý†Îo]¨üÍeYô–'¼È(Nì¸çgz½ç懠=Ö~ÝsÍe—úf}’6ñ£ÍL9—P–ÇŽ€Kð»Ó„𷉬`¤ç÷EâRv§²U/ÿសÐEpP©ë' ¶¬½>&/.ãâh>ìþ­½X~Ïiô”¶â"ÍGºõ( ¤Ú—Ç ~Œ´>+Çñ˜:~’¾sº<¶eG¼úß-27Bj˜ì¸<æw¡Âà`_ºM_õž¯Ë"qÏ/Å ­Æ «ªºÝ¥ÆÇ£užòL{^ò¾»ô¥òyÆÖGà3^K"á¦SC榵ß-Z”? 6Vû?­sA9NuÓ )¶ýÿýƒ endstream endobj 707 0 obj << /Type /Page /Contents 708 0 R /Resources 706 0 R /MediaBox [0 0 612 792] /Parent 675 0 R /Annots [ 711 0 R ] >> endobj 711 0 obj << /Type /Annot /Border [0 0 0] /Rect [302.1517 455.6124 482.3944 466.5215] /Subtype /Link /A << /S /GoTo /D (Forms) >> >> endobj 709 0 obj << /D [707 0 R /XYZ 90 720 null] >> endobj 710 0 obj << /D [707 0 R /XYZ 90 544.1511 null] >> endobj 706 0 obj << /Font << /F51 9 0 R /F54 112 0 R /F52 26 0 R /F67 85 0 R /F72 6 0 R /F60 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 715 0 obj << /Length 952 /Filter /FlateDecode >> stream xÚÅV[oÚ0~ï¯@ì%P’ƹX·=t+Úªvl-›&mSdC¼†˜9N!šößg'6%€ª>Lˆ`|N¾ó›AËäК-϶¡ãy­`qbÊíû W:×зU.&'g#´€i Í!hMfIø]{Áeh ut ÑŽnÛ¶ÖÙÑÇÑ.¹`­$@K`\ÊoHG·<-Ìøf\ˆS¾ázÀцfççäêär²!åZÖ1ÚB¥†·µÍ€á ‡n«?p `;nÁþN‚8 9×rµWižž1¼@Fô†ïxž«uKÑŒÐr‘2š¬\ Õá”ø3E1Y•Ëî™p‚sÓ­¾a›À©±Õ戋ԈÚÎÜ5÷ Æ·7wå2ÆS i^nà£k_¼ UÆqøs¥ l¸¦§4ÇW—o'R÷+ç`–ßÅ8D´ö•YL t9dçu¾)ö£ò§2@‘ôv–%Ã$QÛ n%å˘°×5<˳ªæ¥ÇzUÖߥ6úaºæº—÷_€âk`ôí>hô¦Ð.Òkuÿ2 ÇuœF™±×²B~SVPé®Oón.ÈÔF•"–ÑDh¦¸ø‘0§2HâÅ®£âß#”¾C© ÆßC©¹CL¥º!IiQå:€q<…Á½L% 3ŠÎ÷jS(n€8dceÂ#”ì˜ÍRetAÐ!RSHºHÖH){ 8Ü €ˆèn鯞l7’ÌËoîM-™ÕX¨ŒUêaûsÄüÒŸCfHدö]sj½ºÔÚ•Ô~Î0kÈi[ÈÚ2|cªÿK~ƒ÷Ç>#ÇëYÉ=Úöh]Z0ŸÕŒE!_Ì_Ö´à³¥°«­¼,a‚ÔäÉS…•wPE4 ¢rIfÇ’·)i'ÍöåL2øôæÄµI¤J/ jÄ­ Üš£QîNX›XÉ7cdNäU¿ê̇(ÅóD'>§p!«7áÑ|DaUfÍ V$‹C5Ë«ÁLÑ ?d_ãX9aäœd{h ‘݉Bէʵ&¡ !/‚ºƒF²KñbÉÛgszól֫ YçY¡D{Õ9[¹‚°šœEˆ¢'÷ß¡j~ZwÕôíy]Pª×YÓ]G’©Ç{±?'{yt|ûão={`fXüÙ8Ä9Á]0†þ”¬%Ö—O–@ß-Ì^»Ý[ ùi–ªI"ì¾ßúw×Þ]Þö c¶x”—"kh˜ƒÁNämG(¶²þÈO\ÈÿèF,Ï endstream endobj 714 0 obj << /Type /Page /Contents 715 0 R /Resources 713 0 R /MediaBox [0 0 612 792] /Parent 717 0 R >> endobj 716 0 obj << /D [714 0 R /XYZ 90 720 null] >> endobj 713 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 720 0 obj << /Length 977 /Filter /FlateDecode >> stream xÚ¥VÝsÚ8Ï_ÁðÐ1)v$àÐ4i2íè%Î=ÜõÆãØtصå44ÍÿÞ•%¦&4-Ìàõj÷·ß+p Á·ú¨åZ–Ñ·]·&GH±GXQ:HèÛ"ï¼£“¡ƒ[}ÔÇ-oZñ¢µ÷ó`ÙÁ'kYG·,Kë½éè¶mk8x¨N°–±<¿bÝtµ¨f\çÀp\lk}ÜùÏûx4ðÖN9¦yÈm!Òà·¹í7¶±á¢S»Õ;µ lÙNéý4ösÂ}v÷? ¹çôùŒïÝáÈ]\_üádìŸ ÏÀ Ž-;Èmb:K·.F.Ǿ7ùtH? âØ¿ ÂE¥|Cøß$f!å«.Úhë¶cÛuPè@í\>4ˆ"ÿ®àœ•î€+ãÉõÕÅÈwëy“q×ì#u]GüÊTû¯‚òöÆX£­?ÈXïÙˆ…ñá‚6I#ʲD(ª<0{†…°U2“€–Y ²YØ•ò^`•âæ©Ñ³zu pdRôøX+£M¢û“GS.A"š(Ó+ ÷´ *ñ„¦ÝŠ *Í wµáFkb¥Þ¿öe%A¾h¬UÎNC)–ó¬• § ¹Ó\½°‚×:ð)Û&Ÿ§³zì]DUÓZí2t笣÷N:9–˜ •U¸4Rº h!¤Ÿ4+²¶cj‡!,¹–ƒJK&¤eÌ”­,HgV”íŠú7€*Ö ì2Lû%±”fIÎâ‚S¦’Òl9ªg00 hË’MÃŒ$¤*=Í×J #±ec{b* !ŒRY)Q ã\,RÏ1\Ó5ë*H½é æ˜Ì2V¤Q}šwb§NÊ©÷'E6üiú›·jÓˆdþÀÏ…BµRoʃn|Õ¬Ø@‡Ö–‚„æ/È^Ĉ?ëÙœ}]/0R„ úitñ~àß|øg xÞõmE¶A²ŒU-ÍvÍŠÕ‡…cÖÊuIXrOÉ×?.Ó2ƒm1þ ›h¸„gªMɶSòñF­Æ$ñ$\ý ×nÚÞŸši\äsŸóJM°©GŒ-%U¤œªf\Ð8&Ñow£Nðst&ßÔƒ¿>—…­"ÝG–µ6–Q)¾}«’Cc’2oy#á ú÷½j_f„O×ã²7›9‰á‚bu…×X5Ó+é¥zߎF?“¯Ôn®Ã9 e?ç{fRÐí2‚¾"²Ä/¹Ñv.ËêVûµ»ÿÿ ª¾ÚxZ ¬I²Tõy²>¥œdÁfIs¶3{êïìEyú· endstream endobj 719 0 obj << /Type /Page /Contents 720 0 R /Resources 718 0 R /MediaBox [0 0 612 792] /Parent 717 0 R >> endobj 721 0 obj << /D [719 0 R /XYZ 90 720 null] >> endobj 718 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 724 0 obj << /Length 2243 /Filter /FlateDecode >> stream xÚY[Û¸~ϯ,PÔnÆŠHêÚ;l‘l·Ø ØfÚ>t‹Æ’mMdÉ•èŒíþ÷žu±5“ Säá¹~<ç£n|ø§nRÿ&6ÆKƒ8¾Yï_ù2ýé•’Ñ (Vc’ïï^½yªå{©Ÿª›»Í„É]þ¯ÅŸvÙa©¶X®Ô¢]®Œ1‹èËU‹w°pr+jQg¯h–+/ò#LV´ÜÁD«`‘êå¿ïþòêÝ]¯T¨õ—ÔF’½õXo¥/ÔQr%§L’öxƒâ€ƒëØÜ¬”ñTè³e?ä™->Ýî?ôOû²¾]‚¨pqÚg'ž‡Ùó0{Ê˽›†Ø(§/2‘šŠÛTMf€¯—e¿%–þ”YYÛYU˜x5«À¯´¦”„àYЦìÊÛÇYycåoÏ"0?Ýæçž\GžñU@äù‰)¾ãöovZ¡áè¥74ú®~ΊÌÏW<Ð-«ó˜ÇùšëaˆÇ¡Ë6Hø þ×YÎܶE³/l+"~{ŠMY<Þ4È,Õß<«åH‡wÿüõÔ¿S¢ x×<¸žåµiÚÁ3ßùnÏÄkè¬oyøø–B¯_?Né_ˆüL(· € ^^ö§a? ÂË·§±ðrJß ?}AxtåÅ8±ÿE_ÚÞ—ÎHù}O¸ÓY\»š5ò·/„ð2Øÿ—ßH•çpÃo6Õ‘ÓTgóæh¯d†32/3;R$aˆ¤‰'“Þíñ:Ћ5&í>P /¶eݹ X=ãXA¾€Ì¾ÆÄ^aŽÏé{Ët]³Ça³[ÒP-àäɨe¿@²˜Ô ®M‘9“Òp`¢ÅgÔ„Èê¥N–§+Ö¿90y†¼r^²0t»ßãæ¿þíÃGq_Eå"bUùÚ kÚy™˜…å.Ž?‚$e4©yÔÛ´®²¶èprKÕà~*†@óy† âUf•Û ´øF‘p×Tc_ârÆ+ŠE+ »-„Þ6½:<è( ((w4ƒµô Š­@›Ç^m;ά¿ g=xÙ³£)ü%¶K 8 â&59ñ=åûXÆ)¡Û9Tº3Ã4èi€²¡xð-p-Š ×¼`”,ÉŽÙsg6£ß~/dQÖ¦²Ñ.v"L‘¥Š®²5ºâ/Zntˆ X1¢Rå…W–Z!PcÆIÚš$HÄ û¢jÖ¥=Ïy+Ò^š¦Fˆ!«AdzxBƒË5†a‡}–Xí©ëÒcýeft„ä4kÑêþð†îÈÁ jÏiy…¨dœ„¯lP—^Ä©‡¬õfíO´ç«(ú:¬L”z¾H@¶#[l7+@yДš—Qz~ê» ÐÉ‚>ö€^ð#ÄŠžx8`¬: ]³¹ ïªr”ûÔbÖ +Ð2H|=MÎ?ËYuuì©4Ö¢n‰É$ua Lj`clª/ë@ KÁ‰ˆéË‚ƒ‰Ÿ"eŠäŸ‘Ã3*F^¨ÜÑ@:kt46¸‹dÚ¥C¤­Ž•Éxm‹k+»¡ËÏ?¡I™Ô#œ˜Wœj|O§*š‚2…\d8ÐæÔ=åÝÌJÐ\Á1«¸m³½ÇM Ö “ÎÔQ£Í3>ž y¬½$V—khNmqÈꢚó'Pë°'†à¢«4» ¤’‡kJN;ž!Âï¸h=·³¨‹_’Ñ ¢ˆÕc;®SZj PË9ãyà!Bëiä{~”è©Ç× —®JÜ*DzþÉÌS .§Ñô¼ÐU¤€N$('@‚ZC|¿L ~¡Ú7ˆgaî©%f¶„ÄÀý»²Þòpä @0¿kw^¹}±Å\c&%¹Ww3¸¤ÑÄÐŽ§8‘ÒzÜã ÇcERè†%*Ç}ÁRØ 2<¬ÔÒ–ëcE#ìuÍ7R .=TÜøÔWðOdsÝà1²+×Tv# ^!Üët¹­Gò ¯Œ&  Ç³ΨTs¼ÚLßnQ˜„M”%›ûþ'[Û’ëNuæ­Ü²À`+}á(ßf¶G20ÚÜ[«òÓrœñÉä™ÂM32ñWà’…ŽÂ¾Ñ‘îZ¤ 2—¹SºŽ¡PŸ²ý¡*~/Ÿû û«QNâ·¡+÷.ªˆ¢µ ¯9¬éXŽ}ñ¹l¤´“0ÜIû°Á€Óŧޙ•õš{þb²Ë’§yfêâÕ.Gžv%6/Ü£Ñ8ÁçÄÚ¾!Æc{à_×Ý㘠¦‰lK‡šc7äïq4¦GÕKÉ»~Ô0ŠG)/ŠX~äÚEX&2œyrŠâ¡O7ýð“l~!÷Î52tU©ëRàfTlÛæПƒ›òtÄ㎒69JúK)2©Y]\â~cKõ…j|å)“W©peÔÈó*èUĽ9g®À$‹ïϼܧyJ›ÇÊ2r2#ŒwLßEÆœ,ךåÝâR2 ¶Ð}ܶµý œë»¦îæÒCqõØ× óƒçô~ŒÒ |°ë/oe†ÞPžve_¼¢”ýt‘äƒË®æM?üÄo%8® A}¹{¡„ŒæJ¹°öA(8NÛiŒf,ÿ'YJ±\u ðž+à/Žû®þ‹Ý PfÖž=mt‚]þº> endobj 725 0 obj << /D [723 0 R /XYZ 90 720 null] >> endobj 722 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 728 0 obj << /Length 3804 /Filter /FlateDecode >> stream xÚZ[¯ÛÆ~÷¯8}2X4/Ë[ú×6ZØmÚœ´’ ¥%ž#©’”åôÇwf¾Ù%)ò4ñ¬½ÌîÎîÎå›Y†wý…wEp—ű_˜,»Û^ÚüùE¨¥-Ql§$ßÞ¿xý. ïÂÀ/‚"¼»˜Mr¿ÿÉ{s(ϛЪÍ6ôºÍ6Žc/ýf³5Æxo©ã«í ½¦<¢ÿc»ÙF™·¿PãQº{jH²ÐxE¼ùåþ//ÞÞ;¦’(ú-¶™äwðæÆc“ß» qp d}ªåÞgâ.7Þ5¶ÊeC•=Ê{K,ÛÈcïÊ•š7Eõ…§©þèÑV7 Î2§Lt¤‚¿Ù&EêÝÛî]y<¢4´|´hº(Ký$ 휷ÑWÇj7(álÃqî'¦(”®>åÌÛž®„¹Ä+ÁÛ¾:–Ìón•elVŽæÀ+Ümã0¡Œâ»mûa@ÎeÏ÷Ç,º–/õñ`ëØjDkJ>Šˆæ=òõç^{Æö •ïµN±ÓæÓ‘†®."=J \Õƒ»º“–CբĻ/·9nm@¾NЀ‘e[½m¡Óyå’Ýbº¾L>`~Mõu ‚"ñÞÀ¯J†F…'Ý©ù—5w²9aâ{c嬬Lûr(1uyÆVe×ë¬J#“ ݲۣ±nø¸/ƒ,“×sE¿–ص'+-<ÿÏAhˆ®ë¾µ8¡]Ñ›SêSÕ^VeÔB&‘•Ñ/›$õÊ®.?©]ˆ³ØëÏ",¸ V6æBä7³J•E^)ŒŠìAûÐ̗Ϳ̂ŽhÑrå]—µ¥k”NND'gMü#‹ÈÉ17»SSƸ“œÝ‰Wþv;tü$A€"I¿èÝóüŒìÂQBƒ¿–§ó±¢±¡˜Eï±Å–;ç‚l÷r³4wˆ Óo×6û‰œE|f ‹¹›kM¨yuwÜÁ»‹þ‡º(¸0÷Ìnf:“ÊÎíÞ˜:³¼PAÔe±¯,Á¾èWn¼ÞuírƒbTïsÑÀ–w#P Û½»`TÊQà"Ê)3—V˜xÔÁ™‘¦Ú³´F´¬A÷»L£w%³‡Ia« \AU6Žäx”±kç‡ä¢<Òóú¾þYÛ]=<­nšÒFÓÜz¯ËŽúZíÒ«ù‡g"ßžæÉü„eÀëÀÛÆÞ÷h†ù ‚¿ð¾¯ôú«þè(²´º±Ð~’%Vþ~©Wm]D~Û$ÑdG`A-Kl¼‹•_˃òONñX+B±f@w †‹§¡¡Î›9wŸ%‹,w¼‘u?Or»OL8 b|=ã(ó³"Îè:ì"Â{X’hö/…l ¬Ð ánpVcN2Bé‚-IÄzó/Ρ:këdà™½iûرCàúƒÔµréù eF9į›p¦ÎÌ2qyj/V™dû¡!|iæ&ÛKï ÿަûë¡:.u>ÁFõBšJ€$1¿4¶m¥vEH)€áä¨å:)kaÕUv>-4-~¨CˆDJ”Dm**84iÙÁA ÷bHFgMž¤î×ÌxÓð*=TMÊ;‹ü/»šAsDîÓ—,ž¸‰,/®ü,à #<|¨ü2D/wê€yôÉ UÊÝÀçKJ« ýQtÿŠÚ^6KBzÕÙÔçİÏõ©ê¶™îð cúj ùA[Ø|¦@üôû¨àpªF­\KÈ@D„«®™tpÌäå(8'ÈF;Ε…çÆ™õGÓTˆtžÚr™å0·zÜ¢µKH9DE†‹û#zE…Ãa4ö·çq¬­©2&§Á•Op7°«£ÉCg;ÅõáaMi, —ONÚÆh’Û¯5GQ&"Q©½äN¨9‹w å”É7ßý€fáìi'ÔÜQBvlI?t| \jYס-oÔsˆÍ“ZvýEÁµ,Óž÷-À·\W×? rL=Aéjû¯[8Ë¿}óR‹ûÖZ®ájŸ xÍ#캳k·F=ŠÎ嚌Ó.×a0º°Ðš0K:š0n^XLÁ-Ïé<…™³Y5&浞‰‰ û¸D]×gŠ’ªUXssIæ“f[¸§«©ŒñbÓ…{0¦.•Â"ùؤ~‘Åé ”W.×ãÚ‹Þ­bbüeßÍiôDP¡(Pðt©Z³Ù&i¬×BèðGšíݦL¡c—%ñ>ÔŸ¤^v« Šå³ °›Ç2õï6èÊhBWr-yެÅü€«OÚè2!9…äG²‘£ö÷5íHwNs:ëÐQÜTÝh´+ô *ÇÏÀ$Òø€ÔKæý†ä~R˜Î(éZ£jØã½®é_u›{в‹q´ãûW˜uc!w]öÎmgù32õ­|‰³ V–«‡š†@Ô(kbpLºÚÔú1ÝôBdÅ¿Î"#3(ùNÐeS>®&%(0’ èÚ#r-7 (1eq0cÀDþ-9<¯.<ç¾T¶„7I»¨Hü¸ -¥É³À sGÒHݓ̣ÛN ‘¾›«øbBøÃpþæõëëõê7móØ\ü¶{|ýUB·×·<™4ôMnâžÙDG·ÂÓ<{±˜yzþ(a42;ûô’ÜíV[¸š®â‰èØÿü7ôÄw@Àþmæ+9ç°roîjóQ£Ôï²¾rqÔ×r§¤ EåFQ8‡ªÜë4è›oZ!®´ù]z*!›â xu¢&ñþµAPb"ÉKJ ÁÕI4ÌßELkaÕ(Oî ÎäÑ| “ÇQc=q[k¾4³¾”zlÔšB,¬Q½nÝD]úN*"o:U2)/]àGCÏ0¦´ÇÏ¢–:òßë)ŽÐ§¸ÍÆž_ªS»ßBM¶ê‹ÖüEä+C›k~‰¥{Â0ŸŽº¸5Ry_mUâãŒ3^7nR-8 ,øËþVaÃ8õ3Âåwqbü(ÊÓgŒˆ£ÛN Wv9¡d"$ëù ùÿXù}{¿0jaNü‡é ? âè~‹Ÿ( ý,Ïçìœé.WíäÛÈø&ÍøÌv|ðö«")dO/æÚ7¶SÕ :F(‚ßaâPü J= iÔ®pË·|I\ßþI~:¤¸†‰Bšï9Êý´ˆ û… "¼µON²ˆ—¦Þ•2oÝ"2Z¹í8Í© Ç@nîÜU_êVõ9Ê8¡pž{íºgf¢ELÅXžà­aõ¥»öd=6Î/~_AiÅ#4·®XÇîöRQCâ|ôÜ1›eX±„ŸK¼Ä«ô0éD±Lºä€ '}»wýƒz{MÌò@÷ ÒïºZ ¤Bî.1l~Xè|q\Ò'Y\25LìàæÆ,æó¤ZÙÔZê@@VS-ÌN²¸alÍgdÖ*3¡»øLŽÛÜÀ.±¬&”‰N24Ô­¶V¯-Ì#£¾ ñr"“’/µ#Ê•G]a—VÁ¨Ñ¦^;â8Æø+—¾ôtqªbq¯Ièêí•#Ñ?›ÿËÜ{aÙ?5»C·I"JÈ1ÉZþ5ó‹Ä& Ÿ½t{vÌÌñãŸ`)JÜï°gµ× Ê“L{N"y¨™H9Ùíâ&÷†£NÕõšÂE¤VÜb:®œ&é÷g27•;k²3š´ò(d;ëZ"$c"ÊNwªuÌâÉMZEÍ9èáóÕU*k~|+¢ÓjÙ¦dlÊš§ëõ¨PÆ=pÓµÖ4zVv44q1ÏpÚBŸ¬‹yÒ‘ÂÙ](= kÔÃL ©8…Oι¢ä… 瑟î-»‚q!VInÜëߪ0'䣴C~Ã/  ËrÀ±|E\skD­#pĹJݘ¶r)µÙ$ñó,Èæ¶.7yä>:ˆòp’täžs=uÜ‚'l¾:Œr Ëã  ¯ñˆùôücV…M´7Èރ߿ù€‚ÝU9{sÏcýŽÉ¤ÉüaƒÇ¬¦ê‰pnae™Å¡pk ò98GWõuL´bÏÛ5oi­NTL²’ÎxG…~ÀPæ*’•Ý€w9n˜í[>¥±¯SÅø0¡ëd³/jž”ƒE!æl !©£ú ,|qŸÕõàjòšŸ/XYÙ¯{(!A[ z ÈsWãLY¢sמm~(4±C°~ôk®4¨wòAo§~,»ýqz)<·æÊBÆtý Šq‹ 00nP©g½q++•?càT,Û VÆâqOfjôíŸ £ä\Ž«¤öû*\Ægùtö¦Bã{Å“öQ4úÂG¥d«×Í7éXªL?@Lc}ª_„ %‚m\ðW㇠Üb¬gÔB.• ¢0ÙHan"´µÚ7ær Ñ=þáOŸ,Ýø$Y˜uXÃ]Uî{NãG.¤)ðœÏ¿û,‹5~36R ^ªcv&):þÆ ¯\¸è±ÞìõiÍ>Ï>Ð{SÿàB@|€qJûÈfóÚ…ê·ìNÿŒþª4 endstream endobj 727 0 obj << /Type /Page /Contents 728 0 R /Resources 726 0 R /MediaBox [0 0 612 792] /Parent 717 0 R /Annots [ 731 0 R 732 0 R 734 0 R 735 0 R ] >> endobj 731 0 obj << /Type /Annot /Border [0 0 0] /Rect [295.3952 406.9462 461.4843 416.9462] /Subtype /Link /A << /S /URI /URI (http://www.nongnu.org/xforms/) >> >> endobj 732 0 obj << /Type /Annot /Border [0 0 0] /Rect [136.7273 352.1074 218.1516 361.8043] /Subtype /Link /A << /S /URI /URI (http://geomview.sourceforge.net) >> >> endobj 734 0 obj << /Type /Annot /Border [0 0 0] /Rect [502.606 184.8264 522 194.5234] /Subtype /Link /A << /S /GoTo /D (write) >> >> endobj 735 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 171.0697 228.2123 181.9788] /Subtype /Link /A << /S /GoTo /D (write) >> >> endobj 729 0 obj << /D [727 0 R /XYZ 90 720 null] >> endobj 730 0 obj << /D [727 0 R /XYZ 90 468.6191 null] >> endobj 733 0 obj << /D [727 0 R /XYZ 90 341.0516 null] >> endobj 726 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F54 112 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 739 0 obj << /Length 2502 /Filter /FlateDecode >> stream xÚ]oã¸ñ}E{¨²ˆ}Ù’·EºØ.ö°×}ñáPôú@KŒÅ®,’ÇÀýøÎõáÈI·’3Ãáp¾)‡7ü…7ëà&c¤éM¾øû»Pf  XŒIþ¶y÷ð÷exþ:X‡7›Ç “Mñ/ïc©w¡×é»Eè5w‹8޽Շ»E’$Þ'@<;LèÕªbü/ön¥^q`EèË4L¼ur÷ïÍÏï>mz¡–Qô–ØHò–Üa:¹Ye‰ÆÉ’„ß”NN²µGR<ƒUUg&D{¨¦ã…}dê¹ëà݃é­Mײ*؃cþÃÈá6ÚÍÅKm'®” n4Û†D83¸= ذzrÝŠaåH³?TNÌ=ý¯ï"0¯©wLðùãWŸg_H¡²Mبªµ É f‡“žHþº¿>e#ØoFGTE¼Ê@)2Öš-cïTêš9Pàfð­æzîÉ+<)…“ÄñHû1Émv¥sà8‚k²³Ât{ì0‹`JÄåÉÀN˜…~¢ ÀË5­md‡ˆâa‡iوآÏ'(‹KÄ‹‚n”€’ÛÆŸs½ßÊ!&I€QCæÖìS‡U@¡à CA@z£OŒØéNï´ð kÃ(žçvõŒ8ŒžQåÁ] %ÅÓ%-Tºêë3Ò`æD›÷ÍœF4ìlV¼å‹±t<]ñ¼JWÞaGž¬&õ/²Nöé‘6PoBæ‘ú7–Àp±ë[A¾IÇ[1¹Ô³ ü±í}xÎ-×~”Åéy%]‹‡– ÂT¦]¢˜9$‹ü0£·I}¨Xk¡rÁN–TU_C 㙆d1DË v+¬”–P³®$¿8Šrçí'ç4ôW«h5U5WmìpŠQùº7hA6oKªAœ×µÌ Ëã z=ÊÅ1÷ˆA5¨>æ$…‹³|ì²|<*V,á#Ö ñQ¥×s¥6í\:q šs8>&­ÚËLPlòdò¤X~šÎæÿ°­¾æIæœô…æœÑ¨'A»r×¢ål)vóNƒ–‰!x;!Æð;6î­p7ÎðëØVñrjøŽÚJP9tsâ8#nR´)Dwx\–MŠ›LÛ¾3.ì)ØìŽœ8%³–ªxÂÍ!,¥'ko‹)âÌÐÜ5ì“ó×· 0oF=C’r±ÇÑû ‰¶äÅ;ØÖó¯Lýëh¨ YüÂ_¢,ò z Tؤ!DñP™®sDRiê!R6²H*LZ~gà 5‚íuˆ‹¡wB->g°_Û#†?=0'œ/(šZ¾1ÖUåšbÙF%ƒãàÂŽqÀMÓÐ]r^ïú'êý¤C ¡2 !Æu‚®àU¶/ Ÿ±W»ÑSIùüYkbÿ'ù¦µQÜHr±C]ìDJû8Æ3Eþ~NS½Ï¬g|f #æéh »uÅà¥t½àëƒ##Û(ú¦a'ì]” ² Ç³¼¤Žî•“rð¸+ 2Rr”¡^ËEíTg‚¦Wnp0=u¦¥Qœ§Ï½‡·’_žU™z¨)ª¢»—O3´Ïl~O$ñvÚ©­¿õ4µMÑ7È °/ä wåHt™–‰››åü¬ƒÊ ØZ8$)éLåʈü¹ã‚^ʸ*Õð4&<ì\ïO«Êªbˆ‡««á €™<Íæˆpß™ðí<ÄNšŽÄÃçÞI8¹Ç¶fFôµhH¼élâè8ñÂRJt›œ€S~ì?†Ñ»-M/ßm)W øÃ™h_‹Ct§L®§‹2?]¯WÓ>áá=ñ\úi”FSÆï! DK÷Týüƒ`›Œ=2®ö¶ Ç9_g[³(L£sìR%ùý±69¿Nfnò~H›¹ŸÉóòtGP(èÞÏø­b*Ù'ØW°“Uƒ—ûsñ,ÇcúÅñŒîƒÕ§ N­ ú°Å9ið½=9š»çE«õúö“SïueüB·noE¯¥:tè7¸°³ÇñœrI_;]*UzÉÿË"sFèÏçÎ’½DÝb÷(—84v×à'¦PÝu›^i0´³/TÏ0XÐ- ¿Êµ{¸´âêå]r§¦GS‹+Ñ;šÈ·8½î0Ê퀗áÁºfWé³ßŸVl‹']wNsíE£NíDn׈QðÙçW”äTÛ›áEO`ÒŒøòÙWÓ:Q6åè´‰­ÎØi‰V¸£¹°'FÍÛ"Š Oºéôóý…b±Oª;õú9¶žáÔkó­M.J ß¿"î É±ó×k–´ù~éûCy=ä&Nµ±}&=˜Jø‘ —)lÌ™ÁâËÃña—ïj÷ð`ê¼:"ÙBRØÂNóÿe5àõïaœ\91†…·ø:9©2Û‡vgä„ÊÚ]åæûÕÆ?].nK{¬úpƒŒ–»3>û¶Ü'}µ.TWÖ}Æ'ÓëæŸÖ’>SçF\-þŒ2ö.(%’ÚsÛéý¼7N3øó϶ü.XLüó¿à!n¹ endstream endobj 738 0 obj << /Type /Page /Contents 739 0 R /Resources 737 0 R /MediaBox [0 0 612 792] /Parent 717 0 R >> endobj 740 0 obj << /D [738 0 R /XYZ 90 720 null] >> endobj 737 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 743 0 obj << /Length 718 /Filter /FlateDecode >> stream xÚ­VMo›@½ûW ç‚#±f¿À¤ê¥Q\¹I¥ÒS’6ÓàÅÂë$mÕÿÞ…]¶à¬ ©*ËfØ™÷æÍÌ.Z®ø@+p-cß·V›‘«–ïGPYŽˆpÚ!ïÂÑtN¡]¸´Â´CÆ×öù:ÚN Í“‰írâ`ŒmïlâBì áxj<ÐfQ.ýŸ‹‰ƒ|;ދżvïÄõ!±:¹ ?Œ.B-Š"ô’ì*Ä µuC8~PË›1¡µú“Œ­ò},4PDíñ6[ݧ{¶ë±Xñ}jOO¥+-Ji|Yœœ»<—wË$/¥y:­” AÄR×7%ÀqM= Çòz—›„—?ä]ž-˨¹ù›y»ÔI¦eñ´ãeÆîOöì¤É×JÁÕÕûOÒŠ#)g¡V’4cÉ Ï8ÏÍßx#^ ¡ÀG>ê–¬Ä<*P\FªCÓå®Ú­¬"cˆàR×¾¼ /Δ½P˜Lò4­È6Û¢ä㺈Nû½¶–uô Rª’Yò˜ëZŸéJ˜šD‘¶o>Wžå÷dÕhcMT£RN˜6„š cêÜj•“¼¾• oÕº[×D»¸üV>v,€—Û‰­¶9%û\"¹ÝK/µ z†z†}H]`/¤:L½%‹‘öÌdO%C½Á½NPIÒ5'¬]¤â±ÓËc¦ÁÂßÐÀ~OÓÔgì( ¢Æ1ó´«Âƒy4\¶yÈ«»£iÚeÑ¡4m¤ñ†4Ù1ó´«ò‡ÈéuvÏÔë{?ItcZ[Ý‚Dzª”š ·%Fµ*5yE¤“sPÝÖ¨:i¿é¾YqÛ–Å»S_h"þU/B%¤ëÚŠç7O+ð¸ú‘TuªŠL¦sŒÈß&)â¥ôÿÔÀC!Dišïwë*zÇãbÏÿIñ‚e<‹òìgò¢æêßçÄv² endstream endobj 742 0 obj << /Type /Page /Contents 743 0 R /Resources 741 0 R /MediaBox [0 0 612 792] /Parent 717 0 R >> endobj 744 0 obj << /D [742 0 R /XYZ 90 720 null] >> endobj 741 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 747 0 obj << /Length 1244 /Filter /FlateDecode >> stream xÚ­W]o£F}ϯ@–ªµ£eÂ7¸U_šd«l½ÛJõªÝ>ŒalÏfÐq¼Uþ{˜ ÁN"U‘Ã0Ÿçž{î‹mXòÏ6––º.ZzahÄÙ…¥ºï/lÕ2å s8å—õÅÕß6l -­¥m¬·Ú&ëäïùõç {^’…iÏÅÂt]wü¸0=Ï›ßÊG±ç §íø'¾0pžT²3m† Ùᇶ7_‹Ö/n×(ßq^‚]O™Àí qÛ®…ß3‚ÈC¶ëù x"Ñ ¶øóÕï›o$.Û—ËUNãû¯–oÉŸý“„(›ó«Ëvt½§EÛ‚gB¶”‘¤}ÙÛçw׿}øòùZõ’”T³RÇdU^=³Û÷„Dl£Ð¶0ÞCËÈv¥m† ÆvÀ,0‡+¦¨ð#- ”]‘5L€iÒ>«¬¡ŠŸr¯†¶<•–P¶S¼ÝmÅ€ª¶/Æi:´Ë0®„f»Èö­V:«;FËžãzž5šÑí=«ý1{¯Ž¬_Tûó—ÕJ[ïȵ$?õú\ðx±^ðo3Ѷ‘ç{ž~pÓx³mï1KRÕž¥´,S²á3 BttµKE5'ø(tBG?ؘËeå¶±µþ'VØž‘Rþ@pêL@¥ÍøAIóé©6þ«Ô<þäÔ¢”ÇíNLÜ>æ‚ v&m# XÐEí‹¶E+ EsAº_%üJ”ô3Ì*œŽØ#yŠ.)gèdø¾ `Ëõ^ÃSaà…Ès}¹³»DÎÞà!Žº§§âÀEªÜwyæÁhúšFãÀΉNóNÊ·›¶Í›÷ÜGK*Ãô8Šn’ååt54îg§‚Ðn·«Ñ Ó‚o§þ¥6D::&p$dÏ6hÚ@Ê9ƒ¹1¡]šÁ“jCzÖÞêC=¶j~š†M«»?×*ž:J^ëOøžŒX~î=ý2ÎÌz Þ¤½1S†Âf§ eü &­+¸6ùv ëE†Sú½ c%²‚ƒÝXÈ+1väÐþuá<'X<¿‚ÆéÁ PùKà —Èñ¼àÅô ÌáŠséÁ "äÛ‘=´ »½‚Ü(MÝ^oСFÞ91rÖKzö¾áìB™|ipìwÜKº¸“wú?î³ÜÈìQLY'¥4eœÙÝÕCU–Œ.y}ÉÑÓYEŸ(o Ga¸¿bÁÇEN/ïöZÖ—H|1I*Aúe²¶z!cjõ'Rõg‡Q褻EÞîS+„Îsø0£ß·ÚiS’ÖcœU·u[SqYAfñ¢Àa‹²‚|ÑŸvà\–›q¢,pFz;§’ýØâÝìØï΀Ó;çÈ+…FÐ’hF*žT)Øpš¦–õš©X¿gð€eœ•]õ(¦‹©¶+k¾u1Ïc ^r_¯\Yܪ.YçîÆäoxrÔá-;L\L¨ú&–ö:ëJäâiXìªLڮܭ(¸ß…¥4“Þ}‡Å•€2g#d².¦³õuõÉ þõ8Ÿ1À:Qóí8)ëê-Ϲ‚E}|ª;wÖ¤ŽÙkl 'mdò«X~ອìUÙ†Õ{ØÓx¯d’“˜nÇ¥eA¿“Bœú*ÿ @Ò endstream endobj 746 0 obj << /Type /Page /Contents 747 0 R /Resources 745 0 R /MediaBox [0 0 612 792] /Parent 749 0 R >> endobj 748 0 obj << /D [746 0 R /XYZ 90 720 null] >> endobj 745 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 752 0 obj << /Length 1330 /Filter /FlateDecode >> stream xÚ­W[oÛ6~ϯð¬µK!uµZ $[¶60ï) Z¢m-2)èâK‡ü÷‘")‰²¤Ã`ÀâõœïÜ>’pØN0ñmÛ ߟ„» ‡_. ll…Ñ^òóòâúÎ…Ìp²\kB–ÑÓôf‹ÒœxfÀi63lÛžzf†ã8Ó[6qT3pJP"æ¿Ð™aùÓ¨dƒI5³ׇÎ4ðgÏËß.n—5(ײ¾›/éÁmµqCË1]Ë[L¼…cBÛq+ôW3¶Ù†8+PLDe:墓<ްh[ÙXÑè$ZtÝ™J3â¨Ìd7ßÒ2‰D{‹öØäÆ1Ì´Mè¿a¹Å9>G€”¬2ÇRÒšfR|A³˜l:Ö(TrˆÜ‘¢b« b»w¨ˆ)ÁrnW¾(õtõ7 “… ¸`zOÔÒX"ÞѨL侃üF”¼/¤¯k‹ÐŠ–Ek÷0ž6ja9íÈÇaRËe¨w²Eß‹V‚ÉFùÎ;VîbïÊÝ”$ô€£N=¹d4¸R?Ê ØM¹ÃDö”óL±„†/z,BZ'¢´j%ûøˆÃ²Pá9l1éÚ%"2 /Ã!Ž÷XÇÀc.ìÎá€7õp¢¥ 2Q’×8ÓakÅÆìd¬0Œl²­­Ø"é°-U…u–Z^µXYp§ê' H"EçxÌC·G´KUVÛJqGÉ-#»ŠäxçKåt)Èh!R¢¤?Å®«QÃ5}Ë·u ÷7¿ßýùpó•™ø™›;׳œ}{Ìû§„Ðt\F‰ÚÔ–ÑG‚ÿ⢸̔|RÔ»”Ƥ}k|ÏB‹²‡› m0“? ø½ê^ç}_«<ÀY^¸&@Ž­&À‡ÈÔ$}ÎAZ( «jSU²ÅY…Hô®®«¶Ôoy¦  Ó넊¥U鼯V;£e°jÖ¢­…éÙÔÍŽÑgÆÂ ¶û€TzÒf%§ŒEaÁ’$9µ÷þÄQ¯²¦/Òµ"—© ·GV0¢E0Ê4bQfÚ‹!ýŽ6î‰ÿ¨4¸2¿Ç4‘$¿>ò|”Uy•v}RšE¹^{Â*—g†¿ð‡<§‹ß¿U¼J5á®™áÙƒÞÒ4à'ë™éðmw\&Q…}D5wÊpQz½98BœZ“øÏbð?gQdž·`R¼z•b°E|Ž:l+ $™@Õ‰fW%|n¨Œ K—±[Ù†ð%;×ݶÙéäîº!„;ªÙ—²ËX±æ».ùßó’Íd‰~ewÎËŠFxCɪ>ŸïÿXŠÖk­òeäòŒ4ÝWrNÔÕqÞµ¸ Tg‡Õ{È=ž›+zÔϺ4a·ËyçzÒD1r\¨Ø0¶•„¡ïU²’F™œ¿'Ìo^º8Fîýêö)iéëÄèȯFŽ‹.+ÈÐÈ ƒî§ºG€5íɳ5Õä’Å»_¹ìµI€ùÙsÈuLàùÞÄ ÓZ¸õ›È1ƒ´Ù“g’áɺõ8RŒö޾R`›–k3oºn` ‡ŸÔΚ§¦ù­•›0AÜQW•C7ÙÁpAòTiª±¥CF ¥);A ±Hv?Äì&™hƒQ¼^—ªr`_À^U@Æ6õ÷ÿÒq½P †L¹3®‘’¸(\zŸdq!²ßÈ"÷ÃÕNºÇRM!õE­ÃÒWÙK‡˜*Ãtqˆës礴2ëN—çäYšwPÕ¯1¤x!‰ }Ò³÷8‡jª2þ’tÌ endstream endobj 751 0 obj << /Type /Page /Contents 752 0 R /Resources 750 0 R /MediaBox [0 0 612 792] /Parent 749 0 R >> endobj 753 0 obj << /D [751 0 R /XYZ 90 720 null] >> endobj 750 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 756 0 obj << /Length 738 /Filter /FlateDecode >> stream xÚÝVßOÛ0~ï_‘! %UcìØNbÐö0Ä4&Æ&íx­S2Ò4 ¡”"þ÷9±Û9©[Š´½L•ê÷ùî|ç»/È‚â‡,­cÀHXÃIªí»R3W \ò)ê|¦ÈB0È%-%ÑèÒ>¾ Ùw\d—Ž‹1¶ýCÇ%„Ø'B0_JÇ™”›:®Ø£±™5â{±ADl:×Ñ×ÞI´rŠzÞkn׃ߞî7¢!™å‡ Lhã{ÿ 6&΃À „ „¢PÞ+M¡—ÚWB>s¹Úß—ã»/+!BrùÜèAJH[¿„×`.aî9îÇù‘œ6â§5ñ“.^¬‰GAØ5…¶›BÛM¡ÝMešWI›½g ‹‚Çeœù2$Í0‰+^¦uâµÍQš$÷ å€ZË®D®òúO& €}¼Ê”ßørvzµq¦|*ӧ瑜UÂÙûdZNZ†á–áÍ÷‰yT¨1Ÿ*ã‡YZU¿™ÎM÷nU &[>ô@}´, Xˆ°xñVÉ­D«åW?a*LkžE™`ÀþϰÑŸRº{Øô[Ä€yLÚÏ“ãÎË$@iûiª{yê–íÂó6He)l?»׿ G¦Tvr÷ïVy»|} ³7h¦F;ÐÛª¾X 6·ÌÞ õŦCÿÀRM&Gêþa¼Ò†"Uœ¥Š½e`…f=͆‘«^:2ÏŠê2él>*Êé¸V MêäÒvYß<­#ÎÒ¯5|ù1ÀRu¿hÕpM#½úk4-ØêQѳâ/¸E×)AxïÑÌ{‚/w‡.v‡*ÇrC–|c–Ö3Ø ù$NWùzcxÏâ;EÓýLLÞŸ}¿ùŇÕ–Vê]÷gqfþNß„e.AÃÛ¸Tð1¯x>k?,Ø~„§yZ¥«×³‚Õþ7ß\† endstream endobj 755 0 obj << /Type /Page /Contents 756 0 R /Resources 754 0 R /MediaBox [0 0 612 792] /Parent 749 0 R >> endobj 757 0 obj << /D [755 0 R /XYZ 90 720 null] >> endobj 754 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 760 0 obj << /Length 3036 /Filter /FlateDecode >> stream xÚZ[Ûº~ϯØ>EbE$E]ôá4=9H» túÐÓ­-¯…ØÒB’×›Sô¿wn¤$/“MŠ ‘DÉ™á\¾G]%ðG]•ÉUnL\¦y~µ9¾Hdøó %ok XÏIþ|óâÍ{«®T—I©®nv‹Mn¶ÿŠÞí«û•ŠÆzµVQ¿Zc¢ì«uš¦ÑÏ0ñèfTÔVžÿ{·Zë<Úž`ð@Ó Ø\¥QY®þ}ó×?ßx¦¬Öϱ$¾õœoe’XÛô*+ÒX™Ôó‡ê3oµþÄkøK½kÚú·Ä&ømÚ×<ïÝi”¿^_z‹ÌkebeÖÈyßdWÜ仺ÛùÝpþåùÿÐz¥âÔ¦éÕZg±ITJ»¼yÅ$Ÿª~ÝÚúqä·C3Üó[ýxß×ÃÐt-ïúîènÚ˜°q®s½äòÕšZ/ç2VK3.µò<e@…-±üóCu8U£p=î«ñ’×·nªøÍ=Ïûº—u×÷Íæ3ž9©ë®…nSõöG¥ã¹4ùtÈ/ ׌ÙÌB¶÷}íår/çîR¾áò2ªÛî¡þÿؽÆ#Cì‰X!Z{ËšÓþ78—Ms—.…µ¼ä±5)käå7FGt`ñhº…¯"ªïšvE¾N»‚¡/ø®€î70œlÚ;^‚A¤ïhݦޞ0^Hd`Ž–Î\êØ‚ƒ•û¾»k½©$HMœ+åÈ«vÚT«X•Y.Du»}vÛ,‰‹ÒÈpû ЏŸT³ è»Bi·ü^3W¨J…]^PÑ3Ë¢_œ Àˆ`߇¦>‡ØÎÒ8Ï‹r®Š¯UBv×w|ïãÕºHÜ%Ÿ…ÇÞ“îïé&ºA»>Åè€9UB´ÍÔ1·A¯QÑï‰NÅ耇Ž+24|uˆÑU³Ò.y¾›a™FcQ¢ ~2zÙT'”)~©Q¦ò(9bäg×nˆRHšѹQéSxº¯w“ÍïL—w!O;r~±§äKäÉ£Æd°9Y[‡¤g;ÁÂ2›/Ù}32F!¤6‰>à&#S4?+¦»cçG’m]ÉvPõ$Ô=Þb‚§F•~^yÑ¢„£ÇqvI0É9ƒèàÈ[zü AîS»M4Ý4Ï„L•xÁŸq¬–¤Ëa¶¡lAW…,ùYqâãà»—UtRíXØ»³ñ†„ds">N‡jÄч m°‘‹Ð¥fSÒbJšLÉÝ·ä•ôI]|Ö¤¤O={ T¤EÕœ »ÜÔê8ϲLüïCÛŒMuh~¯¿ür'e©eÍ–í¹4AÁlU}Ó‰’ÒD‹†‘ý;i†êmîž$$&npO€ù›=V8:¢…!íØAë,Í£²Œ¶oÖ’åRˆÑIY, ÅC¢ßÝe[ŠGØBÐÑ-Xõ_xÒ§1[ðàíp Å¿LÚÔ.²]£j¿™¨Pjb…ÄkðK)ÇÂâ£Àcf§Töþ×xh6+xv#Q33DG ¡¡®Ñ+‘fG ïQöÄ¡-Bœ[PœÔè­b ñŒÓ<@AŸ^eO`XžÅYbË|úðîoïýø.LM‘ŪÐÆz¬6®äìÈ8ltƒÞÊÐ8KR£Ñ$™„mJšTLsËö†Bîy„—ÉÉ ò›(<úIµ$ý6¤kXöZT1R²çqxšèsË5$µiˆ1ZH¬|‘Yqg¼æ•Ãå݇°fÐ:¡Bð?&\hmW?úÊ–¸¯z!Ã{Ds’CJò˜àšãpòêÄ4›!åù g‹‹ B¾¡þ4ÌîOUšˆû™@~µ¹ë½ 9J `&w`¦ â;PËŒ#q`ˆS#³Yeèáýª0"›ÚÕÑYøÁuP ”šêØ@ŒXÞ bïâ$VSyV5N ‰àóëHN%e¬´o»}¸±šzyÿí褌m¯à´ìªfâ$‰ápëëSÎáÓ3ã;TØËgp‘:Oyæ\µƒ“·’38†Ã‚/ì#Û8[Y¬Æ‡3ŽÊh=þ4““Pè 3gPÙP:Ö<§ì,N­¯G¥Ýn\;Û²X21ݯ™‹³W‘ÇßÜø(qBØf#]%ÚÙOÁܘÀ‘Z}ÛÕáÖzNS@²®Ã„_?Î UÜk¾\’ý-Δ¾&"v¹ÊµÐS;ƒºéâ‰tÖ‚§b¾æÍ´¶ñh†®¡2{\ÍSôÊõ2ó(¶‘2„¥ÈÊØ`Ù±Œä]/éƒ/¾#ô;UûÅEêÇ„šå¼û^SáV.Ò .<£±u}:›2Ρ’ùv …‹ÌÒ2›_“*¦k †y0ï3Á«—n˜‚<8~Üx¨!bK_Såân¢Ì—3$òÒÅ2¬­.‚´×oä@uw²y_ßO^5E•Iÿbvü2n9¥ïá»ÞAŸq‹‡ß}’ÇùÕK‹ àxÑ2]븘.¶:v§ÉBk«œ6¨Æ`xr°"j§yÜ‚Á [h(öø¶ÃÑÂq¦š‚.¬ÙTS >Ï‹ÎAï"W¡ÁŠ^eèZeCgÒº«ûkWœó]L{.Z«íK1% õR1œZæ íi{xöóجT¬\œRUŠ-¢žzÖî“îúÔ“Ô2D?žàãwÔüïf@¼™sÕ‡Qžx°U±.Lñ|««È}÷cñs‘ÎáäÆ÷ÔóY»ÞÛêH°Â’W6RHŠ·éX%ÙE§XBZãëSÌð„HDÑ’Ö PKÛ\ÐI?Ö+žf:ƨ¸ˆùêz‹Ûó똆ªxbɾ;—‹wsÊpWN®LôÏ\aÍ‹ž¦m)ÉqƒQÊ­ ©I;<”mœ~wÈ|9°ñé)Í¢¯¹Ò,:N0FèD56ÿŠâ Á©Ây¬•Öσ©¼4yÈOvˆ§^t¹-¶ø8€+jgËÿ{ù|ñÆ[ endstream endobj 759 0 obj << /Type /Page /Contents 760 0 R /Resources 758 0 R /MediaBox [0 0 612 792] /Parent 749 0 R >> endobj 761 0 obj << /D [759 0 R /XYZ 90 720 null] >> endobj 758 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 764 0 obj << /Length 3994 /Filter /FlateDecode >> stream xÚ­[[sܶ~÷¯Ð[W/KA&O­»i]73Q§IfJïr%ÆÔr‡Üµ¤túß{n/KJ¶«ñŒÄõààܾH]ÄðO]äñ…Ó:Ês›Û±T|¡¤´†ëa—?_½øã«.Tåq®.®v£I®¶?¯^݇Kµ:–—kµj/×ZëUúíåÚ³úî}‹Z틚ÛÿÞ\®·Úž ²¦æ*l¢ÌJÅñå¯W}ñýU Ê&ÉStc—Ï <ÍL¤´±DxñˆhNG *7«ã PSbÙ®pGÕæš?rcùé2ÉVåÿý )ÝQ—· ÿîiÜ­4Ñ‚,ˆìâªj¿æª:®¹m¨Ó€5/—q¾êšébvÕ¨s¹Á~ŒØ=Œ÷Œ•®wÕªn·À˜dÈ8s¥#ec>Ð}UK¯û”‹T¦RèþÐE|Äo.3½jäÜ 50¢<UÝqC³óJ.íõéVØÙñ€c3GœÊl”™Ìɺ‡jóqŽº$b–I¯—¼ÈOe9•%mT”ç¹»H Ît†Â3Qó@ B¿õ°ãŒTO¸¤Ž~~ûêݯB ö)®…a*ΦÔ§"m2=¢vFüC¿§¨=Ÿ©p]ØsšF&60‹Jᬦƫ›rî\ФÔ*aøuÙÜ–Çöaîh¬ŠTn¥cw,˜)·A— Èÿ¶ü%Vf„–k þÁɱ„ºT×åvVLR¥Î¤O‰I%Yê©&q-„„J­ö¤),õ€5ɪØsKy‹´Ñ¹"é\[WÝñ%30É’(IM6Ö§3%Å­Â.Ö&ÉWE7·Ø Hƒ2ÿÃÂò®XRþ;·5c£Ä%~Ìw0½Ky‡´3XËÿz-Å2›¤²CÚðq‡f¯ð;Dƒµãߎ·F“NiSí`¢‡ íZ¶Ã?p´ùêT×<ŽÏO˜‰ŽI ¨—7u0üTKÝ0|ÌOàA¤³8ó³-ا ~–8Ø´m¸¿¬Ñg4l”*ˆpÐO+Öž:ÚÅŽ–窲kTî·8É^º¿Å]ÀÖ?U^J︡SÌm;wœ:Σ87Ÿ£,&ƒ¢K¤ç†w[ì·¸VÂ[ ‹íEoműÒc6yš’ ŽâR1Ê+²¡븦ã¥G´éˆÏã=-tÏ û‘t”\.ZôêÅþZ¾w MïÈÌÏÙ GIÔoQIÓ(6y.½QkW¿±þe†Wñå<Ûf¿>àÆ2pÜ0 \.ºQ0·IBÍl„á' GDkSЄ,e'Ø`bIÒVýNE² :mzЬ¹H;ׯ­ª#W·†_  ä§ðòƒ ò5ÞV‹6ö{OH‘‚qâAhcõ»|ÑÖ°€ãY¯6çßÝ”­ sDLüÿÁÇ'`sª£xª¶ÊxïìÑ6R;›”â”W4òõDuª…´âØw0¬«0ùXD3Ù7T’ÇhF¡„!áަ؜8°+Ù­)A¡9÷ik¥«}y䙤‰Å¬"Yâ&b}fûè$HˆCÑšóF`Œuî|8òîw”ê ÈêœÍ4.»õü–µöè3°B¹¦¨àŠîØÄN!®—æcà3ôÛq®¹‚x ¿2Ïm±i1½"çò±h,û_ Å$„?þðêooþùþÕ‚ŸÊ”sÃHÍ.ìˆ÷zœë´·Åv$’,2ußñß³g£U”› ŒÐî´ßD7³±‹C§ê·õŠy³Õ•·ÂtTH¥üŠLZ‘¦Í‘5(c…:©-Ùp-Á¥i¬&zX‘4 ±)ïtˆC0·J÷ôàêÖž- ƒ¼½Æz´úpÀ0ôSµí»Ü“J}âˆh›zx%þu}è4ù8›F•èEÅd)ß@,Øh¨5L[c‚àj÷ìØÖtEûÀÕ½œ8´B‹œtFá¡<\oË5ÁkpG¯Õ†'*nå‹Ï,ó¦jG²öéc±dD¼ý¢bAáуL‰~¦¹n‹ÛhÎÿ€;w ôf䊣Wa,­EÊØë­×t5xÊå·OQ%v¹„!eу1àí0?"å$52YÎbsa‰¥Zþ£g¨ôÌ¢€¨¬2Ú ÈžGü†œìŽs,Ù4 ÓØ T‚1‡‚Ÿcc7tCDÙMˆ\ØÏÉlâ{ºÓÀ¡x*aUP)·Ý²—ùA|ãu¹/[Ÿú˜díÙQÜsJÜœÉJú û9Ö5Œ5Ò±šk…VM›|L­Ÿõ—ØÆ<,ugñQÙµd.Ä›à𙉔B=ê&øÆä1ßøäLï_/Î][í炪9Þ­Uü°j€9hâþväó’(sé GÆ Å 3ý‘¬ ZT,%—QšŠ[A3XA€ ¢×a'±Ý=‘èlj/à ]üýà~ÌøUL'eìXi Š÷…*Ö™nþdÜæÊæ_Ó€‡ÊT<òP´eŒ»¼8™4™€Lùø[œÝ˹#°„ÒåA–Á/YŸ9ú,žqÚÇ&hl3¯ðs>Uó¹8°@lMK®fÎgCÎç«òž}Õ)¤¶•¼ù7tô8(±’¨h*^/­Óð¯û®òñêך\§àMOÂF²;ñ ¼¦Ü‘“Ü‘ã4§A×JJò>sÊä\”ÚÜÇ ïþñà­¸ ož4ëxÎi2Ö)X¼.BH&X¹B‰ÝXè#üÚ–â°g]èöÃXZsFÆ—GN‡Ðúëdì@üADòðTü1‘[KDÀ'NŠÓ|$õ¿ÇÒ†y×^φ8ôüèe~F! I Æðß\ß”„)M$”vÀ:ïê)¬jÚp4!hÐ ~x!;dãØËÁ¶ÜÔïÄ8ñ ¨¤˜PgWnc~ˤ¨G m%iñbãâ ¬ Ý7¢xc[H-7öKÛSЄJÊ®þ5´t¼@?v•’?HudŒÑÓ”Çý›CÄÓ$3<…0%·:í]}LŽŠ$Š¢%ߟÆQëDzÔi¼Úµ”ˆ†ÒÛI”ý’3ŬV©Zà Ýq¢äZl'Öñ±Ô'¿1r()™ÇNØ¢Tìpˆ89O”V°ªÀƒ£ÈÇ9£¸Oùb3Iünßêq ô¬üŽ=æ¤6Ï"àfút/É”0sÀã‘ÌÓ½iZI#‰íÞo/™$ôóWDpæY¦}êû3ï¯&Ûµq¸¬s¼ZÈ' BÜFµ¿RvbŒ†²f¼¬-É›R`*“&ñ!LÂ׆*ôésè;è`×>Mn"—%ê,ÇÕ–}îL,YQwqŠ )7Gáh|¼A†qÇöo!¯«\ŠåäKñÉ-çðÛ>ç'©-­y5ZRAÜûƒ7¸ˆóƒ½…G„Þ$@Á¼õ·³‡š€>¥cž½þþÍS0(Íðܼ¡¸)ëCwœm&Žâ<¶Ÿ_6MÓn»‡YÌ6Mš=9Y5K6ê3;Í–˜Lá8ÔñY`Úaÿ•”»|*Ûcy?›Š4‘Nƒ5øœ©ž‡¢r{ý$ο`¢ç¡gWlž‡žÝóÐs8ೈЂ ,ü¼tëc2õ£ÕóHÀÿ7 Ó|íö&çöµä¬3‹"2aÒ‡fûð,)Ÿ÷¯—¦Ò6J“bð¾óbÛ(ÉÁ¿,ëÙˆ.©Ê]ˆ?$ßCE¼:êÊÔ pÈ Ì]סeŽ“1n»¯»ôKëÞIûÜ¢ä/wƒD2ßáy\!î¯-÷åÔkŠƒÿ¦Ó(&Ž b–òžÃèCñÑΧÂg¤°‚×GþX÷ Û×CÈH]hÐ|¬† Þ¥ Á[bÓÈæ™z*­¤“È™ Bå`ÖS'×(g@ÀE¹ wîO èFí·ÌEÍ$&Y€þ´ÍÅ8ÙèHe9Æ`ÁãÏÍÇE$b£X%>–zûêÝzÃXƒ_àžq²îümS’»È9ë.У<ÓÉÂÛ¦Ðo=ì8óZè|B$é§rpÚ.J"à€5ÌŸ‰õá×Kz·†—‘~à}•rgœŒ‰Ð¦#’ç8ù~O‘|>a°$DÃä2È 2V]:äY…_sxø½®•á¡éEÐNžñä:7ƒXÑg›BÈ8•ñL…g?Ýgn”v3Ø#rŵ|‰q«ým Öáû¤Ž‹„ÁŒV!È—ÁÒîü…Ïâ5š²`6ÓÔcÏ;ºl™¬—˜‘Ãe'ZìsœúÉr*²ÎúÅBò÷©,§¤¾µî§Ø´c@ü?Äuâ endstream endobj 763 0 obj << /Type /Page /Contents 764 0 R /Resources 762 0 R /MediaBox [0 0 612 792] /Parent 749 0 R /Annots [ 766 0 R 767 0 R ] >> endobj 766 0 obj << /Type /Annot /Border [0 0 0] /Rect [341.9997 668.2565 471.3483 679.1656] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 767 0 obj << /Type /Annot /Border [0 0 0] /Rect [297.7757 233.2559 444.0046 244.165] /Subtype /Link /A << /S /GoTo /D (help) >> >> endobj 765 0 obj << /D [763 0 R /XYZ 90 720 null] >> endobj 762 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F67 85 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 771 0 obj << /Length 3319 /Filter /FlateDecode >> stream xÚµZKs#·¾ï¯På’QÊDï÷äÄNâTbç°7LJ±8'&94I­vÊO?̃ ¥Rªo Ñèïëä] ò.Ôw^kŒ÷w»wuÌþùŒ_+¨±šVùÇw¿ÿ“•w²¡òîÃ㬓ëª?nÚý¬ÎÝýJVÇû•Öºr_Þ¯Œ1Õ7Pð)•Èjßn¹üïÃýJùjý ™[*>A†UÒT²–÷?~øë»o>äYY¥^›7V)L\-&î#¤6–&þ°iãtׯßã Ë¥Z/\]+ëÅ•O8Ý3.§ß?Ŭ̾©º,ê¡äñs¿‡ŸX|Þtøa*ÌkwX©ã’áqVCW‡þázúÿ‘\ÖœÿÔ ÔNÄiζJó\))¬ š¦û— ýþ¬c¿øýžg_1sO«†å­¤ÒÖ¼¡Û¡5~w³]vÚšZ”„©0Ò%aö F«ëªÝ—V¤kaê&ĺi%…N‡‘¹âé||~8£R;îþ©ÿ˜v“$güxhdžãšö±=wq>¸#\óžv ¿K›bU¨x×Üð=–Ë»#!á‚mærº½(8 ÍDRÆëªÅSá¼X†§nß Ï±øb2œM*ɧ K¥-HìêÈK”Õ$FŠÝqãöÜ{¬¥¸Æ/(Ôþã½uU»í¦œ‡8=ÚÈ»Uš|\¬£5´G«½‡Y|†êÒ’œñ×à«þYK Zw*J°iDcë$þ$3iEµŒuÎÝv{âž7Nö…»–¦þ™SY `nkR“öœŒ5Msþw3"YvQV´†—dßúó™ó\5îÃÀ¤P°—$$Yј:ÌUb&%YÁ±S!POgœ¨¬^úí–¿Úí vÞÒjNœ÷!NtÉÊKB•¦Í&K¬.Ú?á•O5¾(õKCÚSê£>(k€¨ivOYõ@â1T6­¶5·†™MU€ÈAˆß>bÏ5l ПÒè]›á +œ7åqe] Yg›eÞ #Ø2’y< Ú8¼_œýh\¸7;UÝ&~÷5këéúócQÍ*jñˆP` ékªŸ¶÷2öô€*ö3g£P´©±%”¦léÖ\¡ÝÇ>v”4™š=´l6JâS°fkòÜ®#ƒЕžØ;ì¹åÑÐ20< ¬ñQ¸uVv.\°,¥­T"¼f@¬s6ÖɆ¢ NÒgóÌhYèP5Â餸`Ø¥-qÅZ8øCç€ß_3Y8ƒéB»?qr³¬¸kÍæ½à¶¶±âÜè·$ª¨nšªéÆ™%ÀÓ¾©ž“±é¸[5^(oõ\ÐÛ~Ò?*Im#“cÿ´‰0É•€ÅîÏgÒK(yÙôÛnÖ,óó1MMU#{wâòý»½@½Ì» V+µœD…–AÛêÛýœø¸ñX’úÛÉŠM©,øN¤ÍÕñsñ×z•ió/O^I]‚0&¤&:ò¾«çYƒ¹î¼<Ïšl~\mï§´ÏÏçn}…¡v\šòcwáu°“‰,4"ÈÆ1ÔÙÍ:‡ S$ƒzr†°Ñ>Cð‘µ\i2¥ìÖ¡UGz ßYÊË¦Õ µàf0ÔÈÍ 1áfºnšmjÚf¸ê8'ÒŸ„¼X#Ьò¾£¥®ð )‘ïM®R;‰KR¦•K¤ +0)ÃŽ–¤ K3]Ä“²´s(à’Þ*8ŒÞßâeA( N…£ÏX ft¿<Ä”èr2«þ':€ü/":ÏQ·!gˆŠª½ÔÚÌj4­”Õ."™”ñÁGv¯8u©º˜=b$ØüãÇT‡µdÒ UÔ ´"dð=|*σ²_ÄèÉ*»¤Ã 5¿ûzõ±ï^W¿ Éú͆˃ÉÖ=ª ñ¤x£eÏ*G§ §ÈikoÃxö¨õUBvÎ+—xË)‰¼ ¤‡1ÌÞ>ÙH>³gveY¬‡çŠúèq¯øwRkLÖÈŒi~‚·7P¬[?u?¨—hÔ½cØòZ³"ˆaƒ"Î;Ñø0E0wqãyçau08£þ“y)а B;'ßvFÔ®vE°câƒ"â±ÎS2㘳7}æq¾†Ì)5g’±…«h›]-€˜ùEäh¤´pìÉWsÔŸj"5ÄŒbyæ·OôEŽ˜åX·K‹ >²ÅáçTó2RªÆÏ­ †ÛU´¨• p(@"J¼+k·PÛ9Bâ<2Bbbê” ÷Þ•“ s[$%·3B!R€%<R÷Æ€F´¯}ìóM“±‘YªŠ˜x‚Ç4_ö5ІÚe^VBø4¾ž"!ÎøéC 3œ½CàVCóƒz &ÁZ“ÍRó˜tV#LšZ-\§„åÝCPû™½‹*Í Vkob+B“o nEVÚ4Bë Jxs5”¬ûéKØ?£&€F \ »Š¥1¤|˜Q¡ºAŒhj­G²€µ×޳ï8uc|È“3ߦC§Æ qÄh–’AÇnØÍN|ì©áÛH›#€Ÿ1z‡ÿÇ `°NÊ¿/Ä NìzûèÏÄô}9JE6ǽ¦g@ºümÒufÜàà!Q/8 §"u€#/søÍì é¾ýˆ•RÂKpµ°­Š (…‰@Φƒo¿ñÚ‹v1¸ÉWèúÖ*¢=”æ8ñ®í÷‰“`÷l^)èÞR|%ß"†;X-Cw<玑r¨ü„ÝŽººÏýO¼œÜs”1ik;†É¸ptì°Ë:íÁ,|÷ÔywJŒyÙ¥ ;p¶:ßm³ëŽÝ©|jîS&w‘šíò… *)EwL š®.{Ôâ.ªi[Ô©µPF%+¸ï·E]ñB69öUfêÊi`ÁÍBufTý±}è~¸`ê¯3ulx­Y‘©cƒ+L=ÔVͨº'Ó¹¸…GP¾¨ËX¶©€¨U£Ö”Ì3‚‡hœN{÷X¾ÐB‡(¿Åòk4i£~[¾Vs©B>øo“xtR¢0FÏÀ_¹iŒSˆ@9)jãšBà v~êòñsÑpvÖ ä@ZÏ5R.&¸”õ’’kA+.`+wÓ;E6Kaé#¥Ö3Ž9‹ EìdAÃÙŽØ€ŽãBwç±+n)ªw¥ÀUðt†¥6°Þ%3Çìl#1ÑõW¯‘i£n‡«ð–¦á*–v8æó–¶ú°MWþ ó`ßr°ñmPµ²^ñµ‹í.'ùÎÅV¿òUÇUVÔ4zá%Ì©ú,<‹¾bPwIÕ1oŒ_A ì…BXñ{ aY60ð3êïÊJW}›–P”}k B_’ó1íS«/ǯÀftN¯Ù€U®7W¾C[þÉ7uð| Œcê™mS½ytC¹klÛù’JÞ>Ÿë,¹^žÈ@ÞM0^®AÁË&oÕ†sºvL] }óLiOø"…v<Ú¥â}ЇÉ)³P¡ÃBh“…èôxcõia¼lÍW^ Ÿ1ø¥WˆOvíys §‡ÛOy°Q1š)?AFEÅñwöØCéæ ä9%¸îO4biú,0pôÈ^§×`<’9zã'¸§Ìø:¿dß7¼v*8ÏO^9Y(øþû?ÿ-ÚtSš°¸˜Øt=Iíõ1" ¾‹Òûˆø´£ô‰òqè~ןã\¯€¾DÑ·m¨VešÃQ*aŸçˆ”äËé–gq¶ÑèuOù¥¦sàkÔðá—#?¡aÄóN˜Zû[ˆ—Ü­tk; ¿¢™÷Fb>õ—šôé£w$3k»”›.ÜÐ×ydƒWÙIüò+#kL|XöÖ->áæÿ~5ö¤¿_¨òm’0ʤíþÏ[^°aâÓÈîS»; _cŽxinc#> Û<}ôä4½O»¼…ò¹p£Òrå¾ì¸ \ã’^þæÕÅœžãûøwñ_ì·Å™‘=ÿˆšpäÅs`v ÞÒÉ=ž¨2Ñèäý©Ý\`rþúó²gÈÔù@|!:Ø­GÁm×å(‚Ä(‚}³œDzqû_Ó«s endstream endobj 770 0 obj << /Type /Page /Contents 771 0 R /Resources 769 0 R /MediaBox [0 0 612 792] /Parent 749 0 R >> endobj 772 0 obj << /D [770 0 R /XYZ 90 720 null] >> endobj 769 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 775 0 obj << /Length 3543 /Filter /FlateDecode >> stream xÚ•]oã6ò}…/÷° +E‰R÷ioÛ.R¤ÝMѶÅbÓ¶.²å“ä8¹_óEJv”Ý‹…)r8Î÷ Ï"øÏŠhf’$,´1³ÅöM$ÓobÍb>ùÇÝ›ëïÓxGañìnu‚änù9ø°)÷—qÐÛËy´—ó$I‚ì›Ë¹Ö:øžÜJìÊš×l.çÊËLÖ´ÜÁDªbÄ‘ºüãî‡7ßÝyªR¥¾F7‚L®ÎÏrƉN‰ðj×35Õ; ÁFxöù ]h8 ·­«ÇK•(N¢$è7pËã ︴Oø¥‚f…¿À™å‰}µÀ´/½d€G?ÑzF ÂÈÃñAÈpDfÙR€é¶ÚV½x…ÓyP½JˆìšÃGÃGÁ¨GÌæ±.€­qÆiÄÂ>"@‰WOt°³¥È»ä >µííS(|<À<5aEˆ2udòS1Øê³úãcMî¦D2`w÷›8V©Ðd‘Ÿqœ†Z)[”C‰ì}*²ÄË\45É´03CR—$a1eÑgÉD‹;€[îIó›ŠY-È^2S2v˜ðÄ5PÄ&fI4ÉÃ87Ú1-£ËžÒf«b”²!)ãKG%þ¨¯I9VY˜ëXy~O PÅ¡`˜ÞÖuÇÈ‘þ8ò÷¶$ž™¡Ò®½µÈ¶ã`BÖÝA ª¾·»“í ¯ªÎi{fñ¹ºŸhB®ƒv&YpƒÊGÁ±ªÑ¡EEPÖl ÉzÇÁ=1×2´­@Z†xª‘O…jçdGðùx™¦€ðd/û¿oKW-wÃI= 7¼GSÁóÄ ã"p´{KŽY3¶ûè”#߉E.×öO™·95ï•÷²«i/›„‘ÉŠ /›Î !¨?¹Xøb»Éµ7Ñ´ÝäÁª\€ó©ˆÖq Æc®4ìò«ÆˆÑåq§ŒÇ‰SƳ¦«1™ù+~u…J¸@‚˜ó3Ðß0K³3Oúºÿƒ¨èìqSî–µý„€‡))dˆÊ3Þ·dŽÞñÐÄ’Ü‘Ôc/ëú™'—~‡wˆ¹ =¹jÓ>ð4ÉO6±J£ÒW»5OÁbÜ~p®NL‹vpÎâÅb´Ô4σ¢P¥a¤‹ü”óÞDÁ£VÞ ̳ÛñæÑn˺úÓ(ØM³mÖÞÅÓ 9 ¨̦¥@±+{+ x:@zuÔNAãX T#Z#Âíè’bº´½q4•=œ?¤ãËÝ”e—m%´¤Z­FiŒWt‹–„ÓßMxUöYuü£‡Ô{Hò±è{qD‡YŠ•ûñíà¥+l·Þ§-¢g]¡×ߣX#NÉPûÄda\D.Ƽ¦ð­tœ:ëh@À÷þÇ.FŠ£#°6—'q£Úæàâáƒ‚ÎÆ1Æev­ä4rõ|;JžkßVž‘°²"Uã ^0~À4ƒ|Ù üŽ’8Xo™âʱ‰O^’8²à7-Ø:ù8K´5\0)âd–ƒÒ™4p‹–GÙ¶‡›'j…—_«4öùÓ'XùxË_ßWµ“.d/Ê:Öâï1,£mö¤` kVì±Ëµå4:¿hltXd¹™é€ÿÔú•²ÂÃÍÇ€}‰‰bJÊÄ^°]©(TErJÍÛ=Üרy‰p’í@‘a ?#Ó?Ü2÷L°Ö¨Æòsj¡ !Œ~•wîkÔ¾D8âݪJ)ýpžú ͧ.ÙU,‘e(˜X‘«b¿Ò{Ò&•:êÆÚ4¶¸eÙ—¬›•d>n•Ý5Â,B¾¯ÅÁ §Bk ôÆ@FéB3Ī@ [Ln›5e—[Éãu$dÂbïàÙ½4}'á‡Ì„8ÄÚŽÐÈ\Ûõ ³(1ÁžÊ  ¶Õy‹û»ÙAŽƒaÎþ¥ü's„<4*Ke¸˜,2ÁO,tÙD„’+$À÷Z¬9Í8Ñ8å3YQ$an”£ñ¶|°ßÚUµ³“´Å¡Ö&Ø¥ENø LÉHò…˜‘¦a–'ftÒdÈ0a”»z²gwï0[Ô\ZÀ™{NZêêR¢ÄŸFªX<°?Æœ¥PÁûI¤yeñWH«ä¾%ÿt}{¸”hKI[kGü(%Ø%: Ó$}Å.4\­êö2ÂKÞ“·x'íoÒ1€ä½ãþO-€¥€”üÓs¶K3BŽ"]×Ê›Pš•³zíÊÑMµ¨-F;£Ô]J@„ÎQ Û\b?:˜Ñ=1*Xßúdt;•7Ý#ë;œDd5­+>’à, lIå¯XÊ -Œõ;ïlHæ6‡¬¼…¨‚ íÊ.J‡¦¬8Ê+M’?k!h¤¯[Ü«œ:Eƒ?ËNy%Ÿ*ŒrùêÜbP6¸údV4ƒÑgñ|É}¨5gw7ןx@•ÀM ¶ð›®_NwƘùKâñc°"p5‡~™FKL÷‡ ïËü(ôˆMUí’3\Lß·ÖµX(oötq*•ýIAF¡ÉSw©nÓPÙ–Œß¥¥Sr„3"ßÎüé×ÛÛ×òb E ¼Ô4œERœ5‘ìy“WAy¼årJÆKer²ÍŠ ?%'Æ¡L1Uì¸ßU`8þhÁÀ…‘«tÔÍ™¯RÈw®…l𠕪Sõ>ÄZœQŒ»HDM?Œ9PãÙµ”=TÌgÁqÉ÷fÊ9ìËÖ_CªyÎ ¤w©y éL}Ê„n´úDäZ® ÁÉÉÚª¥Fì¤+¶tY î<ôÒ›‚‘Dg ¥aÆ‘1áNAFá&Co“ß=±Ú×d¢)æâqð /þRײànQ_ãÄÝÃþHõY°<8€o-;ÅæèûŠ\âšØ¥r´WNŽ HˆšŸ¡IŒ%ÎzJçæ"ŒUžpªÒ¿EÖ¤‰k^ÁXAY¸p¼öqXJkð{l+*´REþ6ô;E—ÇÊyÁi¯{¢À9W˜Ãö°q|çì@š]-gú0òß¹;.Þ„âÒBHL©eužR°s²T^P¤PE4¤"4)¿ÖÜ4«Ù·l “e7öC!¬rˆ|çUç©=Ðï% âLɇå^—É I1Mž-4Çv>eÀeò+‡ Ó‡g—†ž³€L¸ÿ”eàÚ]Á÷¶nŽ> endobj 777 0 obj << /Type /Annot /Border [0 0 0] /Rect [413.3913 507.8278 522 518.7369] /Subtype /Link /A << /S /GoTo /D (OOGL File Formats) >> >> endobj 778 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 494.6771 174.9687 505.5862] /Subtype /Link /A << /S /GoTo /D (OOGL File Formats) >> >> endobj 779 0 obj << /Type /Annot /Border [0 0 0] /Rect [220.2937 494.6771 349.3707 505.5862] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 776 0 obj << /D [774 0 R /XYZ 90 720 null] >> endobj 780 0 obj << /D [774 0 R /XYZ 90 376.2145 null] >> endobj 773 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 784 0 obj << /Length 1205 /Filter /FlateDecode >> stream xÚW[o£8~ï¯@Ý} Raq¸…j÷e;éª#:šF#­:ypÀ$žŽ 4ÍVýïkãã(¡ÛU8Á>ŸÏùÎÍ Ã?dDŽº®yahÄù…¯·$Kì°Ú[þ\\üvë#9väDÈX¤EòhÞlðn‚ÌŠL,dò‰åº®\O,Ïó̹XxÖ+È,p¦Ö¿°‰5 ͤ/³f¹/ü)òL专åâóÅ|q´ÊŸNß³[n0|Ú6¡™F‘o3ÏF®ç7æÿ2ʾI‹Š)©Š3+å”IvPo^^ÕsÅqLJ[š'Nµ¦í:ÈkPvœÅj'8)YNª -Ö]ý—F!ÛóÅármä;ŠDšÂ–Ç5©J%—UB %f´ K%þ®NÓõl7p§]Ì]ÝB"œ+ùr~«$Vh×ÅÎ+%“gZ »mÛ¾Ôn*È ”ËÍ{kðÄ×®ŽzÉɺ¬W ÞÂYvÿøáøÚ_¥‹`¡\z¹k@Ù¥4üR÷žrÇŠ’@1§œåCaÉQãìúL„Rdež¹¹¿ÿöéáïõï¯ùý—»O «Çwõ˜ƒµêñÖî`ž·w²@ϧ—c.6X' :)MKݬH,Ê39vpÂÅ„Ñ][÷NM twÖ‚±¡ 3œ#Éàt½°ç¬Öh «WÈq& ¥kö0îÈa]~ÿÐ.3.®¿<”É»¾5…ßßÞË“J³™²,c{9•úóÕÄ`ôf†¶¹‘²žÍD"F⥜ikâj%«­56v]ß%zÚõЮc¾®óÕ˜kow$¦)%‰lZ~苤Ða1x¿"çr8œ =ãYr DI¹EÔ‘Ò1€’dé5ôÌžÖ0Ã2©Úð”>ªfÞ&~Ð9pÇi.æï¹4uøPW5†ùw¯©¼…œq1ŠÂwMßËQ0à$˜Ç5ç2D#¹ÝîÙ4éºòæì1¸R[sǨnÌ’ñ6-Mk(I\Q}çi mN¤Á¦ÕO¡£ƒÖ©7°g3?2¦¡g;®HônÅ §_-ZÁjkŒUË4pmM»Þ?ë½þy¾êh\ƸœŸE#Éš| ëö,V*.Hcš_»šX³ßîÔÇwóûÑ@qÝ™9YŽ¥g‘NÄÓýa(§ÝŽ{²`¸Ž±Ýc2Zönâ`÷µøâhr¸> endobj 785 0 obj << /D [783 0 R /XYZ 90 720 null] >> endobj 782 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 788 0 obj << /Length 1007 /Filter /FlateDecode >> stream xÚ¥WmoÛ6þž_¡&*CŠÔÛ€íú®Å°Ea`2e$Ú,‰‚(Ûqƒü÷-R‘VNQäƒ)Þ=Ç{yîÈÃqìD”¢„E‘“–WXo¯¯ˆ^y á U~Ÿ]Ýþ‡`”à„8³Å‰‘Yvç¾_ñzJÜVL=â6SRꆿL=ƘûFBÜŠü9õüÈÍ6°YÅ 6Ÿ0—`6Ïþºú0ë½ |ÿ’ß‹ãþÐqB1òæ„1C„²àè½íлͻ߻"¯2ñÐ}Lê<]wËx~p NóE$ÀÑ)\\€'ãðÅ8Á=ÞÅ„ñ7ô‹¨e£-5BmŠö]÷‘Êj+š6¯–Ý7óRYÖ²•Ö^ÉR.E%äFuµÌ ²[QOÕ< ô¢FA>K|'ôDp˜B1”Äàm‚0ÔÁi„³TÍ€¼!j¬t$F4&ä4y;[îößô>O½܉‡º7„緓ݸ±ý«‘ËÆ¾½Ú˜Ù˜®ïõÄ µ«}Êõ):<¢óE'|œ˜öøíW‹'-9Â(C4¤þ¥£aAp€Ý'M7`º;Û³Zy²Eõì—é»7گǧŸqLdKaË´9Ï=»€Ìí1„¯‰aqƒG~&†Eß©7½åÿ@pB£BTËv¥ƒXlç·tî-ez䇋Q*=]À…#”ƝöФ>ίO|Û(®Ö"ÓCQj+Ùæ‹<åm.«nGêäµ+¡t´ ×Í ¶0Þ”ž€;#ŒÈÝJT¶@nz›Ýb£„v †©ªŒ[ƒ3×b¯Ì°</…,·¹Ð>-^¯òT+ï€Br§m¤×LõlæUV8B“á× 3ÎÝE±,äýáž=¨\ÁðOëdØåmº²²}ÛßdþòBM¿iESæ•©p´9gÒù•0„Ã(t|#?¢W]¹ä Q¶+®Ú(I‡$ ‚Ä&dÇ5“UËa”gHÏžŸ;§[|ýZoÚ^7n(„ÐÛ·¦o!I×iQyYû—FŽÀw/RÁà]À0gxÛ½îña0Þ4šx72‡ÃD(è.êÇ“†‡7’h`l¿yµoWý3SI CóÔ‚„Vo I6-„>ÂLSMÊïÿ6ü+K0ôƵl>¾ýUÛüظ(Üë­í%a§ÁŽ}µ‹£Ú›:ãðOÆ…~?ðås€D× endstream endobj 787 0 obj << /Type /Page /Contents 788 0 R /Resources 786 0 R /MediaBox [0 0 612 792] /Parent 781 0 R >> endobj 789 0 obj << /D [787 0 R /XYZ 90 720 null] >> endobj 786 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 792 0 obj << /Length 885 /Filter /FlateDecode >> stream xÚV[ã4~Ÿ_Ñ-<¤1q.½¬v5‹Á *ðà&ÎÔLbW¶ÓvXÍlj§cvªªÛçòù;/óÁ‹]²ØdÚå›Í¢lïØ~¼Ã ÅF#öUÞïï¾ýXàNÐ.Ùážž9ÙW¿GŽä´Â‘¦«GrgY­ß®â<Ï£{spu'8⤱ç?‹Uœn¢ª3›Íp¬ÌF‘â<ÂI±úsÿãÝý~DU¤ék¸{•ðÔŽñmv»b±Þ˜Ím¶àµ2ÆEô“ ••Äá/Zj+×R´ 1ƒÓà2ábœ!\$öö')J«Ñ¾íçš“–>Ãb°ÅåE^Ì=°T¾ ìâÍwöw¹œ9Èr”­³ôB§hÿ‘É-ÕòÉné#ãV|gl£‰—ó ­}>ÞÕI´&šNªN›àócÊ'“ʙы]IZRv¦j—7!j½@JW&Ö 9x¶gA‚ŸólgNÓÙ-;Ö@ÚkO à^vŠJ+2®©¬IIG²Ò5ÊœûnöG0l©RäDRb¥Rt.ÌÁ¾ŒÚm€*¢>6ÜQ<¦÷ ®ß„¸`— ĸ~“¯С¹I´!Á ¿VÚ˜âf‚ÏÕJqrµF¯/ú†iô|#q­I×€u+ÆÐÆ+SÀP)•)UÒiÑÍJÒ4Ohž¢lˆä‘…Z­÷PÏD²éÖælÂ_X¥¡öò"Ø÷¤|ô¼j£–c7£zÞþ>>/ë¨F‡jñ#»ML?iÞ._A5ùR¬rFk‚êsT#êJ$À’Q¯Ež<ÜĶ›ôz"úAËb3bò54˜úRxáÝ/Tw’ï¦dpû“õvRø<ø—ø÷¡qïpüúi,^ÆYßhn…}³Ä]oiC¥ú)Ýç%tæ‘BcUD7Aä40§žrcËΔ =ü˜Éɸ›¿¤š2ùyâ9Ô:ü‡ÙnJö7FAÁôÙG+/ЛWyV/ýK5ÌVªi¿sb.'ÉZè<> endobj 793 0 obj << /D [791 0 R /XYZ 90 720 null] >> endobj 790 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 796 0 obj << /Length 3136 /Filter /FlateDecode >> stream xÚµZmÛ¸þž_±H Db­ø"Rº+ ô— ‡¦ôÃ!à[»bK†$Ç»-®¿½óBÊ’Loö-¬)rDçõ™QÄUÿÄUž\Y¥â\[{µÚ=KÜô—g–@±“üðáÙõ«T\‰$Γ\\}¸lòaý1ºÙû…ˆúr±Q»X*¥"óÝb©µŽ~„…{¿"¢ºØòúÛf±”6Z`rKËL¤RèH$fñéÃOÏ~ü0p•Jù-¾‘$À¸3.DÛàÍ7YÑ-jÌBæÑWZÿ‚Ý›UϿǪßÀŽ•# †´@cšq7.Ñè¤É£Âz|ãHGð œ}X°CÙ„.Ž‹UÍs u¸xÛü-Oþˆ,äéŠÒd§+âà I|(œÖôXk°q,´’p¼Ã¾­`÷¯ñP†Ô¬Lœ aýœ'ä“.ànD,zÿà(vžâ]PžK•¤±Iu>uF´#™“Ô2PWj¢¢ÚŸ·l 2ÏY~¹ È›².I»eË3£eµ‡šƒ^Q×$Öã˲5m`ÛUáÞ;É‚²U2™ '«Ž4NþTî‚¢MãÌXsI´pø Z£+lŠÞIÎ$q–§v*9’>ZµÒ!™Ó 8ªIbCö 4²nKNËuy[ÕA7ƒì§­ñ¦³jH}»¢^9Ü ÅT]Ôw˜ÊT®£[4VZáç¹õà)~ ìi½,ZžC·¯yxAî/H‹¡’¥Ñµ!GRáîBwC>ã4Qjj­ŸñJ>—6pÔ¨³œ»TÚ…¸fç¤}Áñe¡)èfCÐÅu6¾–‚ùOøtwØ•¬VÉþD„ßEšr´BÒ_ A·ƒ óy žì‰êbWºÓ}ÈÃiº Ê–|ÏÝïÉQðàAÉ0Y?Ñ4¢ˆØZaž,i[›ÌÑ?.àìÂ…6>i7,â”îÐñR?&Û”|³tf£Ú›$¬àLm5%¸;žu¢K§‘ië´p2öD£8âYç2ÓÓLû“ylQ*k<àê\Ù ¤ŽW~IÒ„¯ZέLœ ,1S Þ ˆ¤KË#T;Ð-Ç„L~¾!²ü¾ôÈH(ˆX ?–¡-"h‘µÔ'`ÂY„~]ܹK ¡çWR9$o@Š“+€ú@÷­+oˆW¡ 4)…ÉuHµòž­ë0À9§\Gž‹±‡LÍ Ò„\Šcd—îðÙ»ëÆààR' ³Ì&n+²%þ&ñIŽ aÃ}Ññê4²´.»UÃ&§ÔìýâÔ'Áî_-2M@„¶¼/èÌý€™Î²Œ‡ùT–¯d–q¸ÎxÕ4ÏÝðúp½ivå5“u×·«¥–÷ÏQŸÁ8<­X¯YúY‚¸~ ÈÒ™+Î!º Èö¼ÝC Ê¥ð‘ëyèø4¶Òú¬Ãr¢œÖ7´±–Z=¶”KP¡ú#1Y"ë"±–1ؼ}z$Îbe×£‘LOæY‘ñm˜UÅŸ* MŽaàÎK©ÜZÍ<èÛÂDc@9`^O±ùÕõíB â&Û\R}½LâÄ$ê2•>O¢Ç-?3D¹Ó} 1£tŽ r„2ÁœV 2×\ž-ñ`™Ø™}þ¼È{º€JÄ¥¨ðr+.õçW0ð¾Lã èMÅÆd!ôÆ¡£@¸ÀÓòÓ¯¡Ós ¶“yÛùÏu<ô4Gçyî ýo‹ ƒ c.6q dAéØÍsº†…Cû¥‹ÂlHÈYMÖ•AòB¤’M¹Âl¤II•+* ´¨Q)©á««Ä9dâ }µs‹£BLyTA$ó4ƒàå½g§<Ï„X;@Å?&½ÙÑrDÌ“­BÝ6d1å+|„ùœ>œ%qŽ8ñ_AÈé/} dÆ¢ßs†·"Êμ&¶"2#quý…?Ð-Ç„Ëoˆ,`› ÅŸ)昪‹•M L¤Ö LÍÒ|0̃i ¥OY$¥ºìXpêm늢wžCâRÞIn€šv¡t ß©…¡÷À}QŸ`ݹoœ¾rC`ž6˜ W8|rÖ®Â"›ã)UâÍ [´tL´C}Œ€§&ØsÇSœöl\A~Ë'΃##H ¶iXtÝ«TKî^¥Úwî\NLXmú;µ8#¢×7ç¥q>"}à&Wlåz‡5Û­¿¾LY #”ÞV¥Û…:žú¢B•Í+aï_ƒ~Ï’¾õPlíe‘pë]ù%¯]; ”‹üJæ`PÒª‹5…£[Ž ƒ5Å|ÃKÝ~Ë?AYŸŸ§rAaK?; ’ØëSI:á6T.xºoq{¾!G“@C°Ë°é…ÆŽäÆÎû‡¡MMí%kæ­lnçŒûØþ…ßÑÕ!Ôà1¼ïOûšC÷[°q}ê(×]Æßßßw;u ½]CÎÙ©«<ÖͬP¹Wc£v¸ï> endobj 799 0 obj << /Type /Annot /Border [0 0 0] /Rect [201.9237 436.8466 396.5525 447.7557] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 800 0 obj << /Type /Annot /Border [0 0 0] /Rect [393.09 350.3377 522 361.2468] /Subtype /Link /A << /S /GoTo /D (Customization) >> >> endobj 801 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 337.7931 126.7695 347.49] /Subtype /Link /A << /S /GoTo /D (Customization) >> >> endobj 802 0 obj << /Type /Annot /Border [0 0 0] /Rect [207.1819 295.2 336.5305 306.1091] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 797 0 obj << /D [795 0 R /XYZ 90 720 null] >> endobj 686 0 obj << /D [795 0 R /XYZ 90 591.7587 null] >> endobj 798 0 obj << /D [795 0 R /XYZ 90 509.4825 null] >> endobj 803 0 obj << /D [795 0 R /XYZ 90 287.1414 null] >> endobj 794 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F54 112 0 R /F67 85 0 R >> /ProcSet [ /PDF /Text ] >> endobj 806 0 obj << /Length 491 /Filter /FlateDecode >> stream xÚSMOÜ0½ï¯È ÉÆŸÉºGT­Ä-7Z©ašˆ|) Pþ}glï6 T •Ö“™ç™÷fÆ2ð“‰I¦5w&Ë’]·Ñý°‘Ñb€`kÈE¾9¿¶2‘‚;ád’ß%ÉË[rY#•d©(“d¢LkMÒ/”cÈþì#’ôEâ7e*#å#8[žÁa•4DŠŒþÌ¿o®ò+«ÔG¼ò âéÖp©õÄ—ªK`úŒ$ÐáÙôèÔä«ÿ:ª¶ä©©ž´™ñ´¤é©rä ƒÃþ{tAØ’`ŽSP»Ãp5{µ{Í/Ú6K¬Éa@Z+P©äV9šQÿ] òbg}¤7UÜ9§#ø4Ôø!¤Y7Ýsíã¹ÐèûOýÔpmc¾n([PóNa#¸p $aFm¹K]–0©¹´",O‰}š*ßšeÀy¡[M8’ätP+R;ÁšªÎwF’‘;ßÖÃvÍQ‡.¢=ú ×=ábH3܇×Í>ÊfÚÏ\^bm¼\{ôdG( ÃîËW5‹Èv„Šh PËÔ•o‚8H$Þ„ç'‚½1­dŸKkõoa›ö"&‰k§uØÀÞoî« Wéñ®ïáð½zóFùþaþ§ž7 endstream endobj 805 0 obj << /Type /Page /Contents 806 0 R /Resources 804 0 R /MediaBox [0 0 612 792] /Parent 781 0 R >> endobj 807 0 obj << /D [805 0 R /XYZ 90 720 null] >> endobj 804 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 810 0 obj << /Length 3679 /Filter /FlateDecode >> stream xÚ­ÉŽãÆõÞ_!äD#šµp³†3± c wí[b·˜¡D™¤¦»‘ŸÏÛªX”¨0ˆÅZß¾Õ*ŸZ•É*7&.mž¯¶‡»Dº?Ü)im`Æ&œò÷û»/¿OÕJ%q™”juÿ8Ûä~÷kôv_Ö*ëõFEýzcŒ‰ò¯ÖkmôÃÛw_qϸ‡95¶¡·îkGîSÑ3Oz‹íîp¨Ž;îxWaÊÓ¹zÂi6ËòH%Åú÷ûŸî¾»÷P§Z/œrX®W*µJ­ –6VƦ„X¾Þ¤™v8äp@ò”0ú˜ñ¶ƒŽÃþ˜ (<Á;¡p_Rè­óب² 3á°5td’«¸Mçbcx=®uÕ ¾§Q÷È϶NÜú/Olâ:èàà‚òÕ×¶‡¦;ÎwñÇ<¬®?ðËoIšÈ„Š{7Yh«ƒ‡Ò g+žu¨«£À\àP‡ÓMç ë4‹ªöì(9 •,ÊÄ*MXÆD“š¨zƒÏ2z€§Uå ƒ‹lêp’c4Ÿóq;ƸÍ#ÌL“”©3šŸ‘¼"È*zåζ94c½ŽÒà%)PC—næ±ã±îÀøcw%Ç6ÔÔhkž"ìQޏ[˜kbMäãõˆ)àýãȃ ¡kkm‰È³íª Vò|öüC2´óAÙ1ÜxßvÄ*‚“ kHò¼VlLQDÏ  G­(Ðssbö Í’2º_&êxƵdbIÒÃl ±yèÁ½½-¨hÆ(’ ÚUØP¢AùQ.βQµ¨Æ$%G‘D§Ð)²[°¡[ÈLœdYÛ‹íÐ¥PÔwÃ’Ió8MŒ–'’ aõ¼GjnÑíîEêQd}B€” ^^O^½¡« UÌz~±ü|Íc?\ N­_Ý'óNæ@'ÄipQ*˜#Š\¬Š¼ 8rçºÒ¡8rՄȤ쪈Ë,#¯ öÛU›²` Û_†Zg±.Ó|•fEœ¥I‰ñÂw¿þž¬v[üt'‹Ÿ1ЈUYêÕáq(ÒÌu´w¿Üýs ?ü–›pOŠAÌ*ˈ©$ó³ÂÊé¸é¨mÃÑ¢ãO°Øiš‰6[V¬ÍrÛØÆ Álˆ½ƒòtH¶±p¸Ò¬zaÿº``Rä²õ74õe~¡á‹ R¶Â¬ ”ÒPà-)`8ÔÜôâìò-f™yuAË$·z ëÀmŒ;:¡È1˜}®k¤ÖåBÐê'}Šxà“;r<ñRìæâIL1½O¡-0÷D×@C¿;S„mÞ´xʃ¡£‘¥£àƒÍý¢h©\±ñZSo÷Ý+u§©›Ú,NwT`.>ŽŽ+N HËIÕ2 ÚÆyV–þg󒉆³×++a@iMf/Äè*1òFÄ}íEÞadÞ‰H÷õ©¯ ‘á +™JŸÍþ¨Nt}1Aò¡i%©_3AÒÐGŽã߈j±7¹in³¹C¥$ÖM÷‚ˆÂäú=9â:qfATgK"É”àgÇ+yÈ$èx?WG)fØTIÕd-–$c ¸š—\ónItR'Ö*q =hfàðR2 ÛçíV*|6§’—'äx@âœÃ±iÕCÇIé¡ðG ¦UC¡B_¥¡’¥ ‘#ùéroèØV΃cwó膧¤Fg%(‹6sÁ§"ƒÄgg£.«@œ>7*–Î%<9_²‡0Û—0”Ä(» ·–;V÷þ¹a„(‡z_ûfUÂcl{`ŠA1¼’ox »v˜!²`WÇþ<•]\æêU;¸°M¹óTåëç%rRqåꉪ8¼ò~Û®Ÿ­ïŽ;©xv×õÈ·ÜŦ»oª²‹q„IR$œ¹}·,Õzg¶‚–%c YæäòÝ-éUU¥¾Žâ^ËR¡¶)4Y&£¸ÈfÚæƒ«b0K)!*%*­ù…ŸA† NÕN5ÕF™®rò™‡j'-%–„57±NHÏßkHq®s'_ïߣ‡|w#Î5¶È>µhaÃfEÇ 2ù DÆà”>&íBhc®8VÒòüÜ:ê4'œ*.^ùb7Wº¡#péêÖí“ 39ßÛà§>LQ‡¢pG6K¦®{W%0hÿ+뾤§š*ÌuÕW3N+^–IÊ£­/b’æcJ´ìT_Áƒ€ö?b%gTVAºS=R#{@©ñóC¨uÜ61Hn< ¿¸ÍêËU™¬t©c­3‹µ$¸¸v §,_;ú‹×Ž ü–¿"¬,Mðö}ãJó¹öè_ áïˆE‘D'X—&Wµ¶Ò·|zêÂe£Ÿ÷9œ®7ä øW{/ˆÕ p6’O¸¸ ¯/>™©±DC°”ÙðvO-n˜òNp…3ØæL¶3ç»%¹y#5‰Òá^Æì¼ïç€òáìY±cÝ¡j-•’ö®@ìÔÎÚ®n†ì|õÀãlN¿”€%ýR|ϲ3No_™Üó½_â®÷È>_” S5U‚`fÕ?]†c<0UÃó ×LØòâ.­„‰ˆ¾l¶høQýÊ4ú¹dg¾ÒL&%ƒÍ>Ê áb¨¡Ë\3Å­:‡¿E²ðèfÕÜðBPÐ(Øí6 RK]ÓJ(Ä#t£ü±‹ÙÎûØT`Ëe¥bëëß,¹H¦_ÚøD•ú]¾¹Œ™Ô9®ù=†7’`_ï÷.~JÓXŸ¸™X€#¥êzÔa–,Ÿ§D‹$ÅË­ý¬ŠMjÔ´Ÿº‘=éT»YaMתtÙçá†~ø kåÜCI$V *y?Ö›¶‘¨U$frÿ*£<ÙI3M¯P®^Drñs‹B¥WwÜŒQ:ÃâëéxMôym0‹“©4޵^tª723íïÖˆA‹*Ô_É UøDà"k·qvrõm¬CÛ¤À›y¾æeí§>"u‚•åj\¤džifŠ?G8ÖÒæŽb€$\^o2VÿM.ó, Q¨¸¼P¶À þ–rh E‹@ 4-*Ù†j¼l¡œÀTÁýj½˜Ü«/¢JGâ/nз,§âêq‘466™¿$ýe&ðÎè¢fÆ8‡6ô@Dtp<‚>›^P]O}‡×¾¶Ð"ï¤øñ‘½ð­WfÉ|ùÁ…œâäŠÇÈixËMŠA„€£|%0Ý‚,)„Îã¼L‹¹F?þ¢>t»s[qK¬ ç…O+€Í-ÃvA'„Ö ]ŒåJ¡ÕT‰j%µ2Ey"Õ\n_“ ;ɹ4}a!€p¾&™«  ¸D¥c¥ë…7®$Àˆ§aéüºj É’Ígî€I{³¯bÐ;='iV^”¯‰’NîÝW)øÖ6Ãä©°)ÏWBR¦J{ÛŸy?Hpá÷q 26ÓÓ§jàÛ8LÍñ“¯HáGr?|£˜Ô`IÆh—¯R‡ üIÜ¿ð˜Z¾Ã´Ÿÿ… 7-ìj#é Û?QTt˜ílò,ºÇC_©ÕÃoìT+]˜ >A|ìÚ)@›¾’üü•°‹‚–QS1l–2îx%•Rऋ}ãB¿üÉãÁ—–âY¯S(Çù(9%å€xŠƒzx$ÄIÈrP¼¡Î/ B!˜;E\V _dZV§å«ÛúÆG)Y’> endobj 812 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 289.4992 289.9023 300.4083] /Subtype /Link /A << /S /GoTo /D (OOGL File Formats) >> >> endobj 811 0 obj << /D [809 0 R /XYZ 90 720 null] >> endobj 199 0 obj << /D [809 0 R /XYZ 90 720 null] >> endobj 813 0 obj << /D [809 0 R /XYZ 90 159.3913 null] >> endobj 808 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F54 112 0 R /F14 125 0 R /F3 128 0 R /F52 26 0 R /F67 85 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 817 0 obj << /Length 2155 /Filter /FlateDecode >> stream xÚÕÉnÛFôž¯0z DSÎpO‹Ñ(‚¦9´=Ð%±¡H•ÙÕß÷mÃŦcE:p–7óöm¤¯|øé«Ì¿J‚@ea’\‡W¾,~¥e´ˆõäÝÍ«¯Œô•öUægúêf;»äfó«w½Ï+íÙrµÖ^·ZAà%oWë0 ½÷×ÞòŠÝL‰cX-ÛÃÊ$Þ]ÅkÚ»g k·‡CÞlxáCÞÈî”ï,ŒãÄÓ~¶úýæ§W?Ü TGÆ<Ç‚óFÛñ×Óü:Œï]IæÄŠ’z†·û¶/Åy²hO“{Õæ¶|ƒ@Ú»[E±—×(,â\“qøóÚ¦t N¿™©€ü¹-j»z8"y÷Ǩ}™ïü/I{FÊ4°;m 5û꘠݊‰ÒîÜT^÷K¤/{£Í»]iŸ·…žî®Ù謓‘„uKRcôVè»Î#ïw€ó#Ÿ‚2×vŽjö.ØÔÐ-q®llÙýC² š4+“ ÙN{k’áÖíDæÂ“»¦°ÓËbFÞ/µƒ:ïí$—ÎÊQ樸YÌÜç¥ú'ü”9“¼œ m[œúç;æFFt¿/;ç5§®wÆåâ*Z&*Y¦³­c£cÊC‰­%ÌÞã,ï_lšy]£8/à §.@NñÀm0â½1Hå%xG!¾ blÊm~ª­D6™ÁM²pìZÛÚ󱼨ž¶',7OÝ$îMè¢ Ü h¿’À7ÓŽ$Àçµ€³×[ªMšñ¶,²›=@š,£KÚºnQç÷U³[ª8âD%&J¿Xqd*2~à‚ßw‚äÄнÁ…”ê ܘ$NÞàÀOi¾E¹l(ñæV.¢KÎî6[苹ÎX( ã1&QôfI¹Æhé,ZUñy‰!,³âÈ•PXÈ/Ýå«40辫ì¢ö!G*‰ƒd®ÿ‚ã?u ÂÒ ÷ÞcaC§›)"TP5.äTT»(«u7 ”Ër=OëêM­T—ûÝ©©îÊ®/Ÿ÷o‡ÜÄ>œBŠ٤ʅý7XӇĉ2ä¦@¨=Oí^.ø„/ˆ­PŽÔÕnOI³gjïðPárú-.Œl®Cã{×£_¿^*Ã(ä¢ú™‘¤&ù omú-id*I;‚ø–»;kao] æ®]ºšJ¨ãÈa$‰Þ!q³O]‰û²ÆòL§¾÷Õ’ºâ@ È©º¸Öžè¥Có(3,Тý@ÅqìÌ`58 Iª%ÑÞÍ* PºÎ4(v&']+jO ž&bâY%DDB@[¢+LUªc=Ôd åP‡A8k>Òü¾än2_E©¯çV3vœÀQšGço0"&\çb²ˆ² Ù.Œg½¬@·'¶ ƒ3ÁøQQ‹ð••"s…’£% 4jZþ–MQ·$ÜõÜðcfÁõUhêTÁÍLý¶ÃãÐp}& 7n™ò%;€ke^zÅÜÕCÍãç›Ç5‡Ë£…KA {ú—9±« û»Ë‹,ÔØþÉ’çrV¢L9CjÔÌ™j¸uÉõtŸ‡˜¸áu~äh«Qˆ˜¼åùƒ À$HLáNY6fmLÒ¥lÜëÏ=‡£Ÿk·lÒàPöt’šµÎÒ·®5©K6Ôš?ÂúðjpDÛ©î…ÀNÓÍùå{8!ÉÃqDn1{á 7( à·àŠž óÛÚÛ`\Éï=¢SòÇo¼¤“cDl.¾Œx±\jª?OãÊ-ù³œ;N´ÒPDÕÞR^!žÈ›àÄíxνù`Ĉ^ÃnÀ²îsztI¸u­Ôr¾Ö&UþXÿlÛö[óÝ’a¡ âÀ•‡h‘ ãhäý éG ]S6™×ƒT‘äFNýŠbø] I$¼A@²dQö ›6U~Ìж¼2E Ób@ PÔc=!ž,Ø^®Çt¨’,ަÁŸ¯4Û~N]–%'ppŸÔ Nn(Y|±ô$¹ì¬Îž2xêKá(w˜ENa ’$Kçr:Dòú21¿BÉ9†–3[›wÞzTìâ9~Ç]ò†'"uØkøÌº‚ëy#çéûë|Šò"º"$æŸO¤é–³Açðvå’»tå©wZ6´þ@+ ¢qöŠÃ<Ø’bBà{ïZNzTº$ãõ{Žx‚¢’/¤°ÿqÀ)ønQ%ñ¾Á³_ð(Ý[ˆÔ‡²±'ª®­ Ÿ<$QåK/ŸøAÉQÉâÇrØ Ý›g]‹’tâýˆ¥ö-÷4¶#‚aO.áÂ+® ¥ "–êa)‰F™ caÈßžšBZ˜n§ÝKèÎðšRjx¿Ó‹Î«5Œ]gü†]'H4D»,zPâÓ;ÍUV~â® z–KD? ªÞ™†+ÑœU‘mR1æÏvé©¡‘gTÜ|¢¡r¡NvxH&KÔäzÆöËbšŒ÷˜§ïɆ{ ¿ehÊ_ú¶íœdÎ2\{:ÈãU¯ÜŸi‘/Öj endstream endobj 816 0 obj << /Type /Page /Contents 817 0 R /Resources 815 0 R /MediaBox [0 0 612 792] /Parent 814 0 R >> endobj 818 0 obj << /D [816 0 R /XYZ 90 720 null] >> endobj 815 0 obj << /Font << /F51 9 0 R /F67 85 0 R /F55 36 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 821 0 obj << /Length 1607 /Filter /FlateDecode >> stream xÚÍXmoÛ6þž_á~“·ŠßD±otŠb-Ú|æƒg˱0ÛÊd»i€þøÝñHK²˜8R`Qäéx/Ï=<š2øã#›Œ”Ì*cFÓÕIæ§ÿ9á~”‚DÚùýâä·?4ñŒÙÌòÑż§äbv™œ-&7cžlËqÊ“fœJ)óbœ*¥’ó³÷/hf»™Ç0[Ö«±0É׊æxrKBg8®W«ÉzFï'k¹ÞM®QLå¹I8ÏÆWïNÞ^ì­ÖBó E†ŽåæÀ±¼PŒK¥cÛf²ÞÌëf…ûFA–g(å’qQ(ª 9VÃS$>œ¿'GÔ7åãÐ8—6èé ~²­ê5­Â¸©¾Á4£=û¦ûM…`™,„Ûtý”v~Étö§×#ºzŒbZf ¢‰ ~nÅŒ0ÂKpÐĿݫNV˜Âþ˜º'ˆ 7œ©\Ú~o«õ¬¾}(|Ù‘¸¡ØtVEAhVÉæfœÊÀ§Õ—Œ«)º7ÜãŠI•‹~z¥`"ÏÈ6Ãð{1Nu.¡žð÷4:ùTÎËßËõ´¤©ó]…³²Õ/YΠ~(m‘³ÂÚžb÷Ÿ“úg±Te+cr÷Ù³Åfs·§…MîV4OY‹íU¦.¼žÍ¢\.cÛ‰‚å2ç^Œ×|.ËCbEβB# ÕܺÊMn¹Ã{¹´+ᾡB4às9mh˜`œz¹t.\¿ÏÉudJGføÂEqh±’†eZ™žÅ>Û˳x¨BÁG*UPŠ8Ù'‚¾+T÷;ز!}6^Åòš%²Ùáêí_?qŠ …+÷ÇÒÙ'Wb[í®ñÔ 3ðàI5§'è…5· ,V­ÜÒ}¾ _áAå ¼ýWdZG…£¡Y_V6‹z¯K¿øwà\s›áîÛEéj Œ¼¡#éìp‘©ÖH)Ûòºl|YÕMàj®±’&[Ç…Ïi6¬¨Ù-º³ÔÉÆóß/.ýr~I4ñú4¹}ý“r‹ñÀ‡qqœÓ°“\ðr忘ˆÉ’f·uOÖ¥Uðâm„Å}Z;‚ôæB‡ð¨w.µ"wQ.\jÓÇSkþ_©V¶:^ÙoSÙmößü¤ì[ʾm³o{Ù·>û wÝ„s²Å£×ÚúÆÏ(óp¢ Û‚íÁ`[ D²^V±Ôµ æ™<<  ô;G€‚õxÐTê§–zKã§þ¼›R÷~õCY>¯¾bJÇÀ6©×eŠ&,Á‡j]Òä.„€NO˜qo8½Z¹yŒÞ-ÍãÝÏ%B„¾ÁÛ3Se*Õi0gµÛhÕò¾…´Üoë¢>u¦£]¡ ;0BÀXì{œ_޶¾>*ÿ¼ $³œ¥m@=–Ù\ëþ124³ÍK°\{`@{”*]ÙrS%Á™ÁÆKHQÜ×(¹´+k” {’âÔ(IãËUÝ”Ð*a{tõÃ-“—i´Bvh°´’I«zöFÚ¤ vÌÜ:Ÿv¸&ŽK—Zoδ{KEëeœý/)+BA­,úP_V¤taŠd=Y•nˆˆÇ|Þá‹qý ®¯Y;,‚mu³¤-Paëï`è•ÁµgŠWêE{¹8¸pìྸü4»‚mx§‰GÍz@|çø ûxœóeÖë_uδÒf$x­<ÔZH{¹´+ë_ {@€!´òµpÅok¢~ÙÏЕ§Ñ߉ËöAI@ï6Î4S‚«{ ¶—K»‚Γ>çZ7pqÉøms϶§ì¬N=ßz l§×‡xNÜm`$3ãÈŒŽ¦@fxüÆÉ,çLðüA.³Læ:\ôo«å,¨u„=Û¸L'ä4:ýˆœ@#g˼¿$òcĪ-PNàìΡt¤CszÏõ±?XQ@†}éDk‡kH´äƒ0¡òb<È‹¿ãñ§Š¿KJÀ.œklÌ2<¾Ä}ÜäÒ®`Œ› £—Xäfw¦ps·râÜ (Ï\#»vÄÈ9È3x¨ðþ;¬(‚Òû:s¼Óýþø;ìw€¯ÑzÿIZ9̲xâŸEÊU=Û-Ë´Ù­£› f­•]> endobj 825 0 obj << /Type /Annot /Border [0 0 0] /Rect [286.0848 529.7925 437.0547 540.7015] /Subtype /Link /A << /S /GoTo /D (shell) >> >> endobj 829 0 obj << /Type /Annot /Border [0 0 0] /Rect [221.7758 228.9955 393.394 239.9046] /Subtype /Link /A << /S /GoTo /D (morehelp) >> >> endobj 830 0 obj << /Type /Annot /Border [0 0 0] /Rect [456.5457 216.4509 522 226.1479] /Subtype /Link /A << /S /GoTo /D (help) >> >> endobj 831 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 202.6942 222.1457 213.6032] /Subtype /Link /A << /S /GoTo /D (help) >> >> endobj 833 0 obj << /Type /Annot /Border [0 0 0] /Rect [210.1154 127.4949 378.0247 138.404] /Subtype /Link /A << /S /GoTo /D (morehelp) >> >> endobj 822 0 obj << /D [820 0 R /XYZ 90 720 null] >> endobj 823 0 obj << /D [820 0 R /XYZ 90 595.3155 null] >> endobj 824 0 obj << /D [820 0 R /XYZ 90 569.5413 null] >> endobj 826 0 obj << /D [820 0 R /XYZ 90 517.9162 null] >> endobj 827 0 obj << /D [820 0 R /XYZ 90 443.323 null] >> endobj 828 0 obj << /D [820 0 R /XYZ 90 368.1238 null] >> endobj 768 0 obj << /D [820 0 R /XYZ 90 292.9245 null] >> endobj 832 0 obj << /D [820 0 R /XYZ 90 190.8179 null] >> endobj 834 0 obj << /D [820 0 R /XYZ 90 115.6186 null] >> endobj 819 0 obj << /Font << /F51 9 0 R /F67 85 0 R /F52 26 0 R /F72 6 0 R /F84 667 0 R >> /ProcSet [ /PDF /Text ] >> endobj 837 0 obj << /Length 1817 /Filter /FlateDecode >> stream xÚ½X[oÛ6~ï¯0úR ¨8’º·OišÒuè2t@Z`Š-ÛZl) ä8úãw.¤,'J›Û`@¢ÉÃsýΡÔDÂOMr9IÃPäQšN¦ëgÒ’/ž); `E0\òæôÙOïb5QRä2W“Óù“ÓÙ™w¸,.}åu¥(ÏøA†^úÊ¢(òŽO^1¥[šÇ@-›µ¯Sïªbšò¶¼èÇÍz]Ô3&œ5,YlŠ.‹’$õ”Rþ×ÓŸŸöRÇZÿH/\rW±TOT($hfK²H¨0ŠI±T 8šž™ÄIè«&ÑC“€Ñ´‘LBÚøEÆW’ P¶ìÌ •Ý»gÎ8‰” H¢bÉ65e·1 yÝúA¢R¯àתj;5s|'^]¬É€í>™NGžŽó(O5ç JìýUN‘Þµ¨žÎcï÷¶Ä™WŠ…£ý9¦l¨r¡UƒÖNÙrºlX[§:ì›ýÊ=݆ùŽQtª•=â… !{Æ¥Á¸©}ySZTeÄ)†Õ’‰¿ÐfbL@©Hd©a”‰$ã»Î›‚yMñd×a°÷bøŠå´2£«ð´Kix<9Ïí¸ ; îÓ \7³ÍÊ&Þ¬œWu9ûOõéOž¹äþ"U„ J›ÔD¼îÜ´Á/ì&Òü nœ¡CWÝÒ>ùöfS×U½ø´7(}ªÁ‘V˜ë®4u¯)j™‘•@BâeµÜG¥–:^ÉlÊ-6h>›¼ýñë'ÅŠáP?Ê4GW~ŒHƒŠ€þ#gG€¦Yâ‚Oa*àçvÙ=z€}¼ã¥ïç• xÝäÎc¬c-Â4´[º1®™ÐQjTsfyNþk °Ý:þâ â¸ÆŽËRáÀ­®Vc'ªL§œº/i¬ð°Òl+DjjϸêÐfT·@ç ¼Ÿßá:i$ÒLe÷Ç£’6 /ƒÆË\ù ki(×+|Îʇ*p¸*©f%ìYSkæó¯ ÔßÊ•+vÈ%ÆnCyËÞxýÈð4µ3—„AD. u!Ä¢ä%4n¸¡š±N¼vÙlÍx]ƒ+®ða@Ì\'t·¿è·¥Þ¶æ?-KÙ1”`½Ž >º`F» µ=ÇÓnnAðst³ê·eŸ¾:['k[V ³@ѹâ°jíK fÛ5C‚Åtcú؃•9£`äDEæ êá ú; ŸóbêC"]àcÚ¬Èâæ{/`OcÛÑÃÁû·,ã'&óëÍ##©sݬ H|u]ªi6h#‹­"+Ÿ¤Þ«$ ξ…É×£RÙbcv=39d³Æçù.4MkÅ ,éà¹EJë˜Õž´ìÒ©§:Gï;gAi ŠÏJíu±à4y¸ŸÈn°}MMþmw½{rôËÁ‡£ÇåûtÚæ¢E(„¤¬W78ÒÞ¶BDDÚ1p=á!58ûqP0Ží‚¹ÿrY¹ ¦!Dཉ½„ȤtÀó磥8:áyÍAåÀfzµÃ^ŒB[—P¼"áÛ@ãK7l.=dDBfIèÌÁÉ}7б "™¥ÀÀÔÞhMUß¶™_Ý=g±†¬mñÀžjékB_B´íÅG˜S¸—œ[tügà]DPª‡/ìÖ)õYÆ3ZG²peX¶²Ýë2)Xÿû‚¾*Ž¢¾W¢ÊzPÊ/ùÊbZ‡*ÜØÆ"ó,µ ™’‰è#Jqî6ÃGäõ×¥knölY¨vERÒ&‚k7Ðt/y’.õœpYRY¸o0A-ÏZ,þ¶ë…»ß,*k©²›>µf„¶fÆA5j°p\.éç mrÕôøèã¿YÔo• ÛÜ÷)íLÀM±xÍ }«ÆÃ>*0s|Dð5O|â×1O¿±8oìq\Ý)<û°À[ÿ¦ÚQÇj§þN endstream endobj 836 0 obj << /Type /Page /Contents 837 0 R /Resources 835 0 R /MediaBox [0 0 612 792] /Parent 814 0 R >> endobj 838 0 obj << /D [836 0 R /XYZ 90 720 null] >> endobj 839 0 obj << /D [836 0 R /XYZ 90 720 null] >> endobj 840 0 obj << /D [836 0 R /XYZ 90 531.2332 null] >> endobj 841 0 obj << /D [836 0 R /XYZ 90 463.1692 null] >> endobj 842 0 obj << /D [836 0 R /XYZ 90 390.8626 null] >> endobj 843 0 obj << /D [836 0 R /XYZ 90 333.828 null] >> endobj 844 0 obj << /D [836 0 R /XYZ 90 211.04 null] >> endobj 845 0 obj << /D [836 0 R /XYZ 90 142.976 null] >> endobj 835 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 848 0 obj << /Length 1960 /Filter /FlateDecode >> stream xÚµX[oÛ6~ï¯ÈÛd¬ÒDŠÔ¥]Ú.-2d+ÐfØÖ˃b3‰Y $9Y°õ¿ï\HY¶™:)6ˆ)êððœïÜ%bøE|%IT¨,;˜/Åvûò‘°«(Â)É‹“G?¼Òâ@ÄQâàälƒÉÉâCðò¢¼š‰`0³PÝ,L’$ÈžÌB¥TðúåñÞ.€ÆàvM»œÉ,¸®xO7Lô×írY6 Þ8. 9_•çH¦Ò4 „³O'??:<¥ÖRîÓ IvËäH¢4³Š¥¹ŠD¢4)–E(ޤÿBÏB&Á¼\â£éð‰‚ÿ%<ú‰qø‡oŸaYm ­³(c„:f†ï®f!`gæ(AuðÜ·X‹r(yuÖv–ž²Ëò”W !™ñ\«d¤“ÔÑ=õ±J£D‹5£Câ-ÊóÜ«@,Æ{«…Ô•µºŠlÌ»çÕ5O—ˆ5°a£Œ¤õ€Á mÉpQ‘¥Ó©j$µ>³n¶Eå;¥Š-S %•i…™w°t-æ‘ê¼²D¥eC¹7vR¥>(mâŸrþÚ1Þ®[ª§í%ŠÀlh•’Vƒ…);W\Ôh.*Vñµ¹¾ë™*|Ï¿%B›æGýP>Y$$ŸÇY±¤ ­]¹¸›ÇÍÒz\[ÚK”ÖÜ’¼„%×'᪥څ {]™›I_!U¥IRlõ®ƒÉe€UCnÓU©’$9—m$+ë™õÒ–_”Wx²®Ì‚ŸÉ­s¹Xo9´*ÆvÀViº¾.çt§}fÞ>N¶À­÷ÏBab_ñ¸ðûg^sh ©Eø{o¬CjÉ\&ÄkÀùÐwñ·1egw¨Ù‡ƽۜ×Âq5" ~Iø”c¥íцZXÇNTÊÖDJê!¹¯ «š’ BáÏÝq¯º÷êäºì\–âï½<þxü§Þ"J 'ɯ(BDJ+uoYîa£È¶8©Ž ¡¶¼üð/4Ð’« ˜ÂЧDz1ÆNèH°ˆøti”gù#ª#~s”ϵÎó•Kò>ëa—9‡üâ㘦I:&*ÛzM¹b]¾¶ê°„ò›Èìku8÷ÖáÎôfxXæ#“ŽãAEõ-G sP“V+áÜ‚ýÌЯ[ÃȺªí­×3§¬WÆß“Œ×Þ Eá èî­¹mÛŽÞ> endobj 850 0 obj << /Type /Annot /Border [0 0 0] /Rect [456.3502 619.8345 522 629.5315] /Subtype /Link /A << /S /GoTo /D (new-camera) >> >> endobj 851 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 606.0778 258.5397 616.9869] /Subtype /Link /A << /S /GoTo /D (new-camera) >> >> endobj 858 0 obj << /Type /Annot /Border [0 0 0] /Rect [147.6002 156.3496 316.0909 167.2587] /Subtype /Link /A << /S /GoTo /D (set-clock) >> >> endobj 859 0 obj << /Type /Annot /Border [0 0 0] /Rect [342.6001 156.3496 518.9697 167.2587] /Subtype /Link /A << /S /GoTo /D (sleep-until) >> >> endobj 849 0 obj << /D [847 0 R /XYZ 90 720 null] >> endobj 852 0 obj << /D [847 0 R /XYZ 90 592.9033 null] >> endobj 853 0 obj << /D [847 0 R /XYZ 90 529.2106 null] >> endobj 854 0 obj << /D [847 0 R /XYZ 90 399.1583 null] >> endobj 855 0 obj << /D [847 0 R /XYZ 90 337.8898 null] >> endobj 856 0 obj << /D [847 0 R /XYZ 90 273.894 null] >> endobj 857 0 obj << /D [847 0 R /XYZ 90 207.777 null] >> endobj 860 0 obj << /D [847 0 R /XYZ 90 143.1751 null] >> endobj 846 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 866 0 obj << /Length 1712 /Filter /FlateDecode >> stream xÚ¥XKsÛ6¾ûWèHMC– >ÒSb§wRõ`Íôàø“”Ć"4$eÅmúß»‹)Jb&’:ž1ÁÅb±o›øðÇ&‰?‰8÷E“t}ã[ò—fW.p¸C–÷󛟕lÂ|/ñ6™/„̳Gçv¥6Sæ´ùÔeN=u9çNôvê !œ·ŸÞ¥]OŽk æz= "ç¥ svÄt‹k½^«*#Â'UËr«–È&Â0rãÓ§ùo7æ½Ö2~d²œÆ=,³†…±ðÒy¨N@ÿùÔ•!wRo›)gÎ+ªÎ †Î÷ÇdH">ûÒOõ敬y¼¿{"£c‹5rWR\¯.ƒc»+Útõÿð(xÒã×DVU©}Û­W1âJðئ-Ðp…{'¸B¢ £ÙÕ¦›YL¡´Ã ƒ¾µ“öjL¡K5mƒÏn# \i VV˜ÎHÁÄÔEäuÀ£¸ÂV@k ­Ô|Pñ0ˆËtƒP±ay MvÀðPÖ1Ûk‹bH8ÌŒ°’ПŸ º,/ó6·ùzwÔîr{×Þ§}™Û¾Ì‡}¹»îʼ‹¬½&ÇÒ³--RkçÇüîšaTž]f3 I$Ž"{pá¼7Žø»@ã&Î…ªµÅÛF¹¡-ÈnÄ ˜î”Ã;™^“ôÇÛ>~VÒuLAé¢c-Œ:(ZÓ=³¯3ÒmM·¯¿à$ G« ƒ `îÅrãYp$X 8l eƒ) ô…Öj3È(3騲ƒ{m[Ï@Ú:‡“lÄ^(%ŸpU!qTkÍö`œíùÜ!ãȰ~*ªcÚ‹S˜x=æÓúñÝwÏ=½¡1rc†q´DŠcýE,=±ø@ÿ‘q¼çû‘þ§Q«ÉõÎ&NœG/,<ŒÓZ}±õ™ Ø¡®$¦ðÙalÆÚh¿>ôs£©,àz]QЇIJ¬šÂ|ETggì:Ç3•m†³kZ¡ÒT )°(«Ì’ºBŒëf£R»\‰ÝÉ™Û晴H/E¾+ª%ZëG‘QøÁô¦ÔÎèÈdÖªóÓm©Ìà¤+lÙ±¸Ëi‘ª}Ù6]Ë÷•^ëe^åzká—X×x¨¨TK‰ŽPaá>ÖÈJa0‘î(†€Lu‘véTÑ­œ…ž·Õè§Ñ y £–ƒa(¿~W\yPqâËÄy4^„~ìü‰¾hqŠŠcêú´Tõrÿ©C%³Á#Ð7³mm=Äãý…§ÓîS©®ía¢Ï[Œw³bÈDAøµÀ8r|â/ô:#\@ ¼HFòÐÕfʶŠ6$M•Ýòé÷ƒý4Ä•:sD7•Xå _^),Ãež]›ÜÉ0¹Íüˆ¿€œ›ÕpÀŽ·ïöø]}Ó‹Å·V/—eþïE©>ŸÆœcM4ÎÃ{†Ó"’ H4 |Ü~¡Tƒ_k”\Òþ+—™9U]7¯pßzË|(óyp®¯jµzê²Y-À( `vÊÇÖ-\%ŽÔ‘hÄ£zwvîe¥øléYu3CŽE)užÙ;ÈÍf ÷‡žñ¤Mú…f–OàÇ›|ÏåîÙÆZä‘°ƒêE€ÁD½^ehë4ÞÈØó}~è;êõèxãõ‘,N<Áb1‰™Ç±è÷úžÍðØq"ðºKÿÌÇë– endstream endobj 865 0 obj << /Type /Page /Contents 866 0 R /Resources 864 0 R /MediaBox [0 0 612 792] /Parent 814 0 R /Annots [ 873 0 R 877 0 R 878 0 R ] >> endobj 873 0 obj << /Type /Annot /Border [0 0 0] /Rect [298.6553 331.206 485.5718 342.115] /Subtype /Link /A << /S /GoTo /D (Appearances) >> >> endobj 877 0 obj << /Type /Annot /Border [0 0 0] /Rect [405.6032 91.7477 522 102.6568] /Subtype /Link /A << /S /GoTo /D (redraw) >> >> endobj 878 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 79.2031 189.4184 88.3546] /Subtype /Link /A << /S /GoTo /D (redraw) >> >> endobj 867 0 obj << /D [865 0 R /XYZ 90 720 null] >> endobj 868 0 obj << /D [865 0 R /XYZ 90 720 null] >> endobj 869 0 obj << /D [865 0 R /XYZ 90 610.4919 null] >> endobj 870 0 obj << /D [865 0 R /XYZ 90 532.9348 null] >> endobj 871 0 obj << /D [865 0 R /XYZ 90 457.499 null] >> endobj 872 0 obj << /D [865 0 R /XYZ 90 395.2138 null] >> endobj 874 0 obj << /D [865 0 R /XYZ 90 308.7485 null] >> endobj 875 0 obj << /D [865 0 R /XYZ 90 204.8901 null] >> endobj 876 0 obj << /D [865 0 R /XYZ 90 142.6049 null] >> endobj 864 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 882 0 obj << /Length 2064 /Filter /FlateDecode >> stream xÚ¥XKoÛ8¾çWäV¨´"E‰Rzê¦Ùni 4YìmŠ¥ØBlÉ«Güû)K¶’Æ-ÄÔpHÎó›!Å©â4ñOux‰Òút¾>ñ ùþD˜‘ îå÷›“ßþÅ©ð½ÄOÄéÍÝh“›ì‹s¾L73á´ùÌN=sƒ pôÙÌUJ9ïÏ/ϘÒ.'Ç1Pój=“Úù^0M8[f:Çqµ^§eƄ˴–E—.ME‘v„P³o7\ÜôR‡RþH/d9TLËSx>hf‹bå‰@…¤˜öPIÿ1sÃ(p²nŸw 2®HöÅ#É¡‘ÀŒ"ñâH$´ÕW?ôa©]ÖÀ·0ËF¶ µù>ˆ b‰Ðg¿ëÀ|,X%”`K4d8+4`ƒ3-ª;æ˜wumm[Îdâ´«GæHçmñ}&cÇl±$ £LüÝVüÛ´Y…ç¶ ~èÎͲ0w@ípÑœ.ª’Ï´óE‰Û·»ãaûô®dïÒqóY œeõB¯æóeÅ2xžw”[ÿAëóF…¢O¦\ A¬—Ð4@õ,mS¡“ö×4S¬BFDޝ>¤‹p R'Ô‰ö¡0IP wRtOK0's€±t9×mM[4|HZ¶ ÎÀñ$ë 4¬ÓÕ Èo0– °®ô/R"[&ØôÑÛ›1ÈÈã2Iø8äßga䤫.íÍp&v8¨y ÙRÔ<´ü¹Ù‰äÍKPKÒùpÇ\uN‘›<1ÛÜÕZvsú¥0dá00øD„“Õ¢Nׯ§ ´'eëR(M¸@F€ZAb¸š]VaÂiŽú%X€ÂqM§¾2,E‰´Ž’Rô°ÖÛ¢!~tL­A³Ñž ÕÈÁPýªaßi€Ê(ÑVሤ«ÐdÛ’3‚‘‰}‘ÖìÊÖ®eqøÓ¨ÅuH-Èø)Æ aÕS8z7×낎÷¢¤“>$ýõ•ï+r½;gl©_ë ÖÒº´> ÎqEcôIªxZâ¶È·L¥R»!Üg;µ8¬Ê%9*‚ÅB*j ÛeC‚‹ø¢ÒÜ- ¹‘µþY0UÏØ5Ë‘ÊüH³fù]Q¬¿zûñ‚qýçÅå¥{þéãÇ·Wï~„ß±<Æì‘¤ä"ø|èkQäsõ5ÆÃÈ]í ÂÕ"® )…óšwÛâÌ’£²iÉ<׿´tcЛC¶å’H“}TyÚ»îöì;[ÉhÒÉ®–>”wÃq ½YaL–ʼnƂ>~†T표òçßWþåQcU%W+¦Î+2áÚó„¸Û%Ú&&Û„Šºˆ„k`ußW†'M¤ý’S»¢Iœ„½fpß“ âVù‘ç ÀUè!PhzÐ1ö|îq¢>ÜÕ¹Îç¶5R1~éSc'·[SOõ &Lœ u¼È<Ñï*ìRc9Va¢éíù~¤‚ŠcÏWa2VÛ3(YÑp„¹ò=¥B=vݼÛUixlCyP!„¬Ï4Á‚­ó?‹âá Ð&{nâ'à&³ ‰´2]çG! v š¥¾Gƒñ¢7uIøTB$o¢©æƒüAù[Þ#µBPÙ–Œ7a ¾}jqƒºlöe±»™'++0L, mSW“Ø‚½pˆA뾟ªÎKHkÄ8-v#¸¦îÜšMŽÀç]5ìådî7 ßÞ`_ 1Ærbc•À­'2.,VÞTÀmÏÓQ M{Õ÷ô&ÞÍäHû'CÅÉS"à*µPæ,êÍu©Ùkuz¸Î ‘ø^¬EôLŽžIŒ¢©qЕe€~\-†µf]_ŽJŒÏ¹uhWÛ®>ÔÎeË¿váaÄ–@B¾Ÿ Hä&ù ³žƒŠ].^#¼H y.K´åj|@ÑŽ7(+C`$.9Úðn <¾.¦r2Q™8…n*ü ˆa/Í( Ž‹’ûDSÁ0¦¤f[°Ã#ú&Át¦¼™I%ežpp;.ñfµ¹$°xç5Ë|5y‡Ù•EðÆÆ<Ý€’?ðµ©3X¶ßϾ¼/5G`Ì‘Oè… pÀŠÑe¶Á¹´^ô/$¹É¦ß &G?“8›t:._pɯ&ˆá.\-{K׵јé 47š$5¨¦#g>,ËH8¼@Iv£8r®ª6?ƒ¡ñâõœð®õÃó©øéƒ@â›Fr³ÜJ·ÅÅt¢·täqËNÀ¶ÿèd/=ÀôH…§c¾fI¯V+³Ù¶N7<Âl§_³*eþ9¾LðYSò>«³_®Ñ“ÑðTDÄ! ãÁƒ >£^ç‡mlä{:°ViO‡°Ém¬ås‡ŒSmìÁ†ã6_u¡BòÇ—¦S—|?êëú B…1p©±…exåÞR\H}ÐÛjéE‘?Ökª·µ|?ÒëpC6ì6±ÝôÉv3~°p×hâ 2ËÁUV9o?¿¿>ö:û¹£EØ·%Ž®x|¿ ·)3`ïa[ñs^1Ĥ…©®ƒŽ­¿ù‰ƒ›W\Þ€bcú–ÊeżC$ÜÒ/Z&]ı‡RPPœéòŠkÆWªWf§¦å3Ò:ãM†ïOðY¾6½·fB²„b\¨ÿИ#ê endstream endobj 881 0 obj << /Type /Page /Contents 882 0 R /Resources 880 0 R /MediaBox [0 0 612 792] /Parent 892 0 R /Annots [ 887 0 R 891 0 R ] >> endobj 887 0 obj << /Type /Annot /Border [0 0 0] /Rect [299.2487 403.2866 484.1827 414.1957] /Subtype /Link /A << /S /GoTo /D (emodule-run) >> >> endobj 891 0 obj << /Type /Annot /Border [0 0 0] /Rect [260.7811 145.0279 472.6601 155.9369] /Subtype /Link /A << /S /GoTo /D (set-emodule-path) >> >> endobj 883 0 obj << /D [881 0 R /XYZ 90 720 null] >> endobj 884 0 obj << /D [881 0 R /XYZ 90 720 null] >> endobj 885 0 obj << /D [881 0 R /XYZ 90 628.4052 null] >> endobj 886 0 obj << /D [881 0 R /XYZ 90 532.9458 null] >> endobj 209 0 obj << /D [881 0 R /XYZ 90 477.5445 null] >> endobj 888 0 obj << /D [881 0 R /XYZ 90 385.4184 null] >> endobj 889 0 obj << /D [881 0 R /XYZ 90 301.5945 null] >> endobj 890 0 obj << /D [881 0 R /XYZ 90 219.2857 null] >> endobj 880 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 896 0 obj << /Length 2149 /Filter /FlateDecode >> stream xÚXÝoÛ8ï_a‡[X)¢D}õö¥›¦iͦH|‡¶ŠMÛBdÑ+ÉqƒÛýßo>HYŠÕ&)ÄÔp8œÎÇþÄ$ó'Iz™L’É|óÊ7ä»WÂŒ\àpû,¿Ï^¼ÄDø^ægb2[„ÌŸÓu¾ §USW8õÔ ÃÐIÞL])¥s~úñ SÚ5ð(UéÍ4Hœû‚iÂÙ3Ó)Žõf“W &|Ì+`Yíò²É8N!¢é×Ù¿_Í:­£ xÊ.dyÊ0!/öý`§Ò¡ŒÈ<£*¨QtªÊÔ™¾HUá48þÌD‘S«f;uƒÔÑ•Q .Êœ/~äïk´ºewUHOœV³Ð/¾¥ªòBA¿ ¯_ ¥ªE`*æž ‘—I`8`;Á‚óZñ€Õ©¦ ^Ë»ww@ çF“‹JõKƒ;MÜ ò=)D2qEè‰ÈçãoZvA^ÙÉ(qŠ Ãa×zS7‰33redv_ÛC/K^Ðw%Kh˜ŪšØζ¶«[e¸o‘ãWœÜâ9¡ßOº½~…©4sÍ,Ê[Í.N®È0hP­¸qM»ÌÛBã!‰È!%s³Y(bØØ…ÈPü±kˆ=qÀJ¤±^Õù†¿÷V¯b޵fáÌE[P2aÀ€ŠÝ¡Àx×ESÍ’–¸ÄŒÉæí®eiËZ›ÝÚµ³±Uõ¦¨ò’³l®w%%\@6¥6OQ§]Å<û‚ty3˜Ò÷‚H±çûalcÏW½Ø•Ê­Qˆ‚ó wõ¶6Þ Êoÿ (LGbÙ“{±Ä,ËœJ·<ÈËZå‹þ`ÿ´päaÌÆÃÀ7_“«I½ £€ùûiCù-<ÿqùW~˜ý÷Ó‹ÇÀÄ)>k³¸E¡fh7ÄÓ Q÷k4" h)-IB&€ ¹¥€ÛÚPo;\˜,cAT&<Ö(í–þ3eNeY*Eã¶ G4v 68©ÌRÉCw©=3äõA ðZoB‹1ëök…Aã÷jŠG³V˜ðH$|è'½ü¦ Êû¼U±W†±sZ"•\tGþY±,m¶Êù§F³«Šœh8¶¤1†Ü/ ShM˜‡wÌ–[ tåmc›œŒ#[F‘Ë\c" ΢aŠ=aš-V”r¸öèçþó‰?±Ó¯å=(ÅJúÎûiR¶3h·0k÷èÚÜý:fÊ¡ÁÂȇjÌéù>—·{ü§ CzäQ$ÿé—´EI˜6¾w+ÚeG>€B¥’µÕœšÌß•2{’H|Û^]_å†åƒ1;¸œDlI¸¦HGÕe˜qçÔSàk©»F±ª‰šV%îŠ(áöU\KÓù`€ý¸¶º¶Lc5x}yÃ{Ñ©À̾¨´É‹j¸Ñô‚sLbI¯ºÂÐG1üˆ¦$‰S€LÓ=(Óñ¹}ÆᙎÝw£lOËb'ñ %~&Îg5ìü®mi¤1zƒjÈWl©"  %d†kL>² ”—%ÁТpÖñ=eѱ@´<C‡ºQG. àÏ nžpiÇ÷¤G¿çRéÿÀ¥€™êö+aFVAê…™/%,ûLÁ¼"ÍŒ¥À¯ïŬ÷mÇçöÇ¢åH û–3@JÐÌ^jÌ™•„^¦œ—‰‡¦ô?̰K…7è€(îÝóiJ@®Ãö2Ó#ËÚïA…ȦDß7TJ…rp ;º¨Žo+ùã¼,æ¹9d˜¿¥òÜk æÞ“—[\™Õ˜ùS(‚ãŽìôþž#1Œ¾ïH £—z‘Ö²¼½<{™C[ÂùäÑ41hêàI‚<%ûi¸£qü:.*Ò¸Có$÷øœÜã…˜þ~ä ð?wÍE¨Šaì.;)õÊ‘Î8/‹ßu°¼£GBTM·ƒ†±:–{M½¥[9’ð½x9@ø0(Øä6RÄ"¥¥ŒËñYˆõÒ¸ikX½)z¡Ã.ùxq3{Q}*,Øk1à1”Á@°`T®™>Œ+˜·ÒbËÔÆ–Åwƒ+)‰Å@én¥2Œ¬>_6ñ—Ï%¯çxëqd‹¨®Á’êDQfáŽéÚÎ¥?㋉Ÿ®62P“R5LÌ›!#¡I$г ?%€^Lã+ñ‘`´þÛEÌDžK†ö‡h4{ŽÄ㈹ŒÏ3ÙS­bBQ '°ñY€ŸÙ<ÙGpþpµRñ˜3ÀÑßøV²3¯HHãÚB“Ì•cq±€Iï´½Äâ†#ïŽpnÝ5Âýº4éÛÎgjL'á«'p ñ³Ò69NÛ —¶Í<ÇSêàásòÖ”&œŸ]]ºïXË÷oOgW×/«ïµ¹é‡t^vIa³k­›~“(Û‚¤j,—)áXà¾mQËÆ óCñŽ„ÇO„W·6.tyxÛùÙ"ö¼y?…h¢6ÄË6ö»Žø05áñ/ß«ªuïÔƒñËÿtõ—^.ÿ~‘{gXÝÑcµi-wè(õÀ`AÓ-{Ñë t3—ÌfØ”´éº`hð´!¥:YÖ»‡· `îíœàÎf[¸RÕí|×Ú5?{ ò©S°ýI½ÈÿЊL¤_^½;»™]_üqŽ'°~„+¼Å¥æiHT9Ô%¦(ö{ÿɨÆFæeUö Ž ]¼óÆ)ˆYÒ‘·|tÝ–iï%ióêCãåAÍÑ>„©R(µ…U/géUªRCv¸µ™ _Ò„7æ|yq…æùõçú+K½ÖmުףïtvÍ@|ð,ñ­?CxQÚð¢ó³-ó: endstream endobj 895 0 obj << /Type /Page /Contents 896 0 R /Resources 894 0 R /MediaBox [0 0 612 792] /Parent 892 0 R /Annots [ 898 0 R 899 0 R 900 0 R ] >> endobj 898 0 obj << /Type /Annot /Border [0 0 0] /Rect [147.6002 531.0438 345.9722 541.9529] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 899 0 obj << /Type /Annot /Border [0 0 0] /Rect [375.9906 531.0438 522 541.9529] /Subtype /Link /A << /S /GoTo /D (emodule-start) >> >> endobj 900 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 518.4992 189.4184 527.6507] /Subtype /Link /A << /S /GoTo /D (emodule-start) >> >> endobj 897 0 obj << /D [895 0 R /XYZ 90 720 null] >> endobj 901 0 obj << /D [895 0 R /XYZ 90 509.8045 null] >> endobj 902 0 obj << /D [895 0 R /XYZ 90 452.5284 null] >> endobj 903 0 obj << /D [895 0 R /XYZ 90 382.1016 null] >> endobj 904 0 obj << /D [895 0 R /XYZ 90 285.3735 null] >> endobj 905 0 obj << /D [895 0 R /XYZ 90 227.4913 null] >> endobj 906 0 obj << /D [895 0 R /XYZ 90 170.2152 null] >> endobj 894 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 909 0 obj << /Length 1430 /Filter /FlateDecode >> stream xÚÛNãFô¯ˆö¥¶´v=¾Æ»O[ h+*$6/”åaHÆÉ{Ù“d¡é¿÷œ9c“@¶8)Ÿ9÷»a£þØ(FYùyœe£iuXðà ³'0¼]”ß&'¿ž'lÄ?r6š{L&³[çtÁ—.s´p=æ4®E‘“}r½8Ž‹ÓËOÑ Àx¨¨+7Ìœµ$s6„tŠçºª¸šà’+@™¯øÑâ4ÍÆR÷nòÇÉÙ¤×: ÷ìB”· cIä' `é8öY'ƼÈGq€îãúé8‰€9â|¸}º³ðŠlü«®«–rOŠ×‘z,)9I‰Ii­ã@#æÛ”—â9É 9ÅKkÎËÇ#„¤ƒ„Ô/…\5÷RÙ 1¥°rÎfR“ K9_èÖJÊ€:ò 7’²Üƒ y!ä zI˜¡ù×KÒˆòvíF!ž4ž¼¥œºsiå~†©aü=H±J#ÑéùO­¶uQü wì3’ÌOƒÒÔfI@E8qÇ‘³‚ZiqYbmM±Ê¤©!×öº¶…ZX„Zû½ÑË"oD¯½‘ôF£ÿ×øl×øFÛ¤>»úÓûú;…èöQ´[Ußå„oY±š v†Q~ÒT¼¤W±vñÕnZŽü1˺‰ùÒ&€Œ-övºqîl +è² U4êl’M`†zs¬àM?qÐa’³¼ê³àPès?JãWuÓ±çè¦wækP¾Îž5þ’Ú$ðãÀž€­IèæñР·³ÉõÍ‘£jiª•ƆD_#ó }ž,p6K¯Ó‹Ha枣¼zˆCÊÍÄÂß ^\cáܱIIxrz´ºéã„ÂäÓÑ0âŠÀWÈïâòPþš†~5êÅÈ_÷,ƒR‰Í"‚Ô4£@Õ4Í,E"UÓ³¾‡X%ÎßD© H„e¹S‚~ÌøÒ~ÈV·˜ºabJ0¶öâå´›“‚´³ÏØ#Sujß2êX&Hf3å­ S›0ÍÑûð‚‘ÇQvC@Þ˜¯•Ên„Ю5]^ð¬—Ö¼üˆSÔÁO0c˜çOV@÷PbCZu~ë œêCÁÚõ&±ì¦®¤]ÂnÜ>EE¡Ä@ÀõãóˆîÊ3,oa²×…‰KóZÒä÷Öø&šVÚ½jx¡ GÒZU“×dZßó­‡øîNÕô5 F,û´jwbÞ#ì~ôþtõÄå¤ ü®àÍ JÃ…ÛA>+Ö`OUŠ4zoBŠÃb&ho`± 4…T¢SúÔvj†ë§j½ÙòåRð†«©ØÊ ¾â·^Úvò­êÄAá¶t s×¼\‰L»ï€vÇu}è}åêÒ¹ÝFxÁÍ"P¾}Q(T¶×õPø_‰ÿ†A03 endstream endobj 908 0 obj << /Type /Page /Contents 909 0 R /Resources 907 0 R /MediaBox [0 0 612 792] /Parent 892 0 R >> endobj 910 0 obj << /D [908 0 R /XYZ 90 720 null] >> endobj 911 0 obj << /D [908 0 R /XYZ 90 608.186 null] >> endobj 912 0 obj << /D [908 0 R /XYZ 90 550.8053 null] >> endobj 913 0 obj << /D [908 0 R /XYZ 90 479.971 null] >> endobj 914 0 obj << /D [908 0 R /XYZ 90 435.438 null] >> endobj 915 0 obj << /D [908 0 R /XYZ 90 377.1483 null] >> endobj 207 0 obj << /D [908 0 R /XYZ 90 295.8905 null] >> endobj 916 0 obj << /D [908 0 R /XYZ 90 196.6336 null] >> endobj 465 0 obj << /D [908 0 R /XYZ 90 138.9499 null] >> endobj 907 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 919 0 obj << /Length 2693 /Filter /FlateDecode >> stream xÚ•YYÛ8~ϯ𣼈8"E‰Òd1Àn&³È`ö@Ò ôäA±Õ¶veÉ+ËÝÓ˜žÿ¾u´.Ç hQT±XU¬ã+Z®"ø“«—?À‰2N-êH¨D¯B™ˆ$1Ì¿:±QveSvE êÖϬ–å4ÄI"Ò8ËV©”B¦Q†1zÒçAðtáp!ËÍ¢ºË ž IBä<¼ÿP>”uKp22ÄéÓküš˜)ƒ¡ZI²)Á©¥Jf~ €IGB/ØÒÓÝzÎmIåmɵié[Vót7˜1\´¸ Cj[Ö%Ç“7šwA´ÛB ”0™ŠoÙÍÓÝ{ÎÐûàw?È^±ˆ€–ˇtL t­¨€¢ÿ¨]’ÆìI«šþ÷‹¹rµŠ ¥Eé°|³=È@;@eß=¿l ÎuÅËSÕlÛ§—âx,‹®h6åKuS½ôðrÂøÒøá§¥r€õòZiL ž/ø±´ 8ÿÆLÅØ§Ã0Ö‰GL¥®ØÅ:ö„‡¶µ[ˆ~˜ÇÁ?ZÒŽXPqÒ~o§)*6Î?-ÂvO72ÍiD'J`_¶Ó¤…GŒ*¤ÑvEÇÁvrù –´üôLq9úÔqÈy‰ìrF=¬ÜÓò.ú¾Ø`xì/ò€9Ѷ+:x?Z!¿„çöÈ+m7v#ró3+$±„ôdzwA[ †;±g;§Fª!nåýåâæ’Û1Ĺ„\e±0|#í3Nºvo/´‹‡¡ì‹i™Ž5C7ólòàwi6,:|´¢#™K§@…’—.á#Y–‘~ð°ú!ÁÕ~.ìfÓŠ…¹2R¤ˆp%,u Ùîæb—Z»†Áʱ|†Û& Ü3Ôdü5ðç% ¤ð¥k|Fm¾m®uE=Ž¥] f_à.5`]hñ£I>êÊ~ç÷ɶWûl©re€ë#B³@¨Óx†Eu’ @®P ÀNY~‰ZªpH¶è¦ÌF(-툒Û60ì7>%Û'È¢4Aè4Õtš,5HJÀ·Ê¬ _Q”ÅWÀ©§ ‡„ ºÌZ{&Ò,ze‘ÀàC¾ ¦ôt7˜1ƒúÄ Z!°É=Æ÷¤šÚm¡Ò š—8Ñ· çénÉ=gøeÃiì¢ „Ê Ãyº›Ì..QÖ Á[#£ò‰r„U¶qÁs¥QJg®§ƒ TœI‘%W|ÑÑ…CÂ%W˜1¼Þ(Ií˜^m”´m”|¿¶C*”Û£ ß¿~ú¦ŽæmKÅáÀÉat/ \é…º…M}Þ^»Â’ÀN«Äå¶?-n-Œ2Õœ˜qaŸ€Z¶®3¡û/]ËÒ.Aü=mÛM&4ºS¬‘«kM»£ /dK-û„ÙØE¥uQÍã{´ý'‹¥”8 Ì¯]v_v¿vÕýEù¤¶gˆIÚ¤9»Ñ?},„uÕ\në7þlmùÚ±ýñ OÖÕ©·7Ù°`g.}Pþ‡çÝã\ >Ö—Íh%;’]î!ïrTx¼‰ bÈN!œýÚØ8´HÌ?Püåïï´µû±êúsQ¿»ajõX¾lÚo Ôöo  %¶oñëL禃^ŠHÎι±£¢5-?·Mµ <œ£Û›ˆídÕØ…ñèž^8tðJŒfâÅÛ-­s´ñJzÊÀ}¯åsG —òùŒáW€\QÔBås:äIø7Éé§cÁ¨ÂÅR¬'É\å³då,ô € ivíÒË“…º¥T>e÷…L{–ל6µN{:r2ïÊpÛÑ­ÁŸ¾Ö{q9--žf>|ÿ\ž^šöÛrýGŸ×Ã'ƒáE÷µ-“ÀÎ|—Ao?¨k¢®^@ÄYc? fêÒ„$6‰i‚.’˜›Ø«jÜ?U?Žï¨h¸öw¶m]m&¬ ¾Lx½Ü&B¼)£J%K׌lñã\'œÅÀSЛ¾ÃÆqSW>´ ûÁPõÅ+¢Éláï=ø02te4t‘@RðG;àŠ·þ·¶-Ýï‘tI1îõ—š(¼œN]+î´äFà“™Ì,ã_œNçƒg~-Jà‚ÉE‰šG‰á(©ø¾ÆÇ„«@wï>Þ±0ïþý¯Ò «o ‰wö÷YºBíñH4ðÀÞïÞà[DeOA kgy²óW*çÎþpˆÓ?]5…KÍÓƒÍ\K­ò xõgtµÆ2q‰¢Œ—àLkÅmaòƒK·„äOÉPæ4º¸=Ýw´Ð4tʼn²Ͳ8…W;8v²”¼®µ{XA‘µ ©±³tàLWÙýŽ»¾ue»qË £{ªN¾%žzøÐP¯TµpÅáÿ;)ÒP endstream endobj 918 0 obj << /Type /Page /Contents 919 0 R /Resources 917 0 R /MediaBox [0 0 612 792] /Parent 892 0 R /Annots [ 921 0 R 922 0 R 923 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 932 0 R 933 0 R ] >> endobj 921 0 obj << /Type /Annot /Border [0 0 0] /Rect [355.6388 608.4335 518.9697 619.3426] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 922 0 obj << /Type /Annot /Border [0 0 0] /Rect [166.9941 595.2828 317.3276 606.1919] /Subtype /Link /A << /S /GoTo /D (read) >> >> endobj 923 0 obj << /Type /Annot /Border [0 0 0] /Rect [344.6004 595.2828 502.7823 606.1919] /Subtype /Link /A << /S /GoTo /D (hdelete) >> >> endobj 925 0 obj << /Type /Annot /Border [0 0 0] /Rect [459.76 406.0377 522 415.7347] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 926 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 392.281 247.5327 403.1901] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 927 0 obj << /Type /Annot /Border [0 0 0] /Rect [275.8704 392.281 427.3354 403.1901] /Subtype /Link /A << /S /GoTo /D (read) >> >> endobj 928 0 obj << /Type /Annot /Border [0 0 0] /Rect [455.6731 392.281 522 403.1901] /Subtype /Link /A << /S /GoTo /D (hdefine) >> >> endobj 929 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 379.1303 236.0851 390.0394] /Subtype /Link /A << /S /GoTo /D (hdefine) >> >> endobj 930 0 obj << /Type /Annot /Border [0 0 0] /Rect [378.4083 323.1927 522 334.1018] /Subtype /Link /A << /S /GoTo /D (help) >> >> endobj 932 0 obj << /Type /Annot /Border [0 0 0] /Rect [449.4303 254.7105 522 264.4074] /Subtype /Link /A << /S /GoTo /D (space) >> >> endobj 933 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 240.9538 227.6609 251.8628] /Subtype /Link /A << /S /GoTo /D (space) >> >> endobj 920 0 obj << /D [918 0 R /XYZ 90 720 null] >> endobj 924 0 obj << /D [918 0 R /XYZ 90 587.4805 null] >> endobj 931 0 obj << /D [918 0 R /XYZ 90 302.8458 null] >> endobj 934 0 obj << /D [918 0 R /XYZ 90 233.1514 null] >> endobj 935 0 obj << /D [918 0 R /XYZ 90 151.2155 null] >> endobj 917 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 939 0 obj << /Length 2920 /Filter /FlateDecode >> stream xÚYmÛÈ þž_±È}±‹³N½ß¡rIï°Er).Ûh.-´öØV– IÎfûëˇäH²W»w)Xf(É!r¨àʧ¿à*÷¯Ò0ôò(M¯Ö‡¾Nß½t´"ŠÕ”äÇ›ßýWïå~\ÝlϘÜl>.^ï‹ã2Xôv¹ ír†á"ý~¹Š¢hñóë·ßËL¿'‹1ÍÚæ°4éâs)sÁâ^ˆ^cÜE½‘‰·EM$»S±Y”$é"²å§›¿¾øËÍ ulÌïé’ÇŠ¥æ*=Ÿ4SÅ’,ò‚0ŠY±Ôƒ8†ÿÇÙr'á¢ÄC½/oyЯ¿(ÚZæwŒìe¦ö"‹Ú$ó#æú›û%s ·ñ&½Åº~¸ùõú—Ÿi9P.gVS/ñ}R‚b_L]ê†dY®Lš%M0Î&i@O{,e'¤lÓŽ"££°÷2»%Š–&ùa6ݱ*@óÀ|”g!8ù¢íËõ©âÑÓBx·®Ã'éÓLÕÙØÞ¶‡²¶tú‘Ÿ.nyW ^7xF¢±'Ó¯àG½Œ!Kky[ãUï÷¶µB&ñ8Œ!]#ÃKyñÖ…¼P²ã²›Ó£8B”ªÄKð÷¾ùVޏkt‚MW×äð¼ ¶W¿wk-ïFòËô©c¡*+byâ(ç^¼<Åd^fâì±/çS_>žúUÏ¡[Ô]Å‚ˆ7‘uÚgý9žø3saEߨ´/¿9¶v[~ùO×·dÖ—¢ÒË›S[[ÚcÕímU­Öð/¿Êóߨßü ª~À£³&¤ßPæ¾L@‰ô,*YsR"šZÞcÏivmqgÄ´=[ú¶ëÒq"­‰îÔ+_vÖ a¥¹î”*]ÑÝ–§6úr3çG­-àiŽh 3áYVïÁ]i0Ø íí(ÂJÖR—½R Xœ‘”gªa«{²â}+1Ή¡CnÌÈMÄ%ÜgükD;ݵß#Z@rl›Õ¹– k©fÏ3•£®G  À@y:µ5-¯ŽÖn'S[ʰ• bÌ6ø<¼~P´²8!rÔ›½&Gf2 „0ûej¥ž,4sZ=‚Û ²õ2ñþ=ë­<8еk™Ú=Î@¦,J@4r‚ Œ]™oN`äÿP" )(=¶æ÷s–â ,nCŠ ø~;§KSÎ$Ž)Ša®/“`C «ŸíÊzÀMP«›Ñèù)ZMû­]7»ºü¯:¾`8 ÈÞB›JH‹Nq°žC È÷L‘Ä™ç„~OÃPlb‚¡üúîíK}øÜ*Ó4»j‚7š§^G€æ4ñ§º œ±]ÿ‡+Ju g51óúý»w¯~y#ú,Ú]÷ ~*¾ªª‡{ÏÁ—ÐНÐCLÞÈùóäÏípšJ‹Î'€)‹½¼[Öò[ÈÏZë´1m‘]Hœs¬ Iײ¿DÒ©Ÿú-¸ô:ã’óZf¹Ê4A³Ü_°õ§vœ){ù½/+u/z°Š—bG^ú<å9(K*œjDÏŒD‚ Ð|ÑTÂl€$ÞÎhÓ9èpÛEñ3ç@¡²>+)êE©U´ˆã©Ÿ,QfÚ’‹uò2b G›qª$ö©#¥]#b×!£@¾‚å{x,Ä3U¯Èw…ö<¹lX÷•ñc/KÌe®¬C&.×À&u‰F]oLZ ÁyL‚à@OÖ‘m'¤dD'€ŠzÝ$c`åV&fq³t¨ñ.^§Ž,•ä4 ú½Rqb‚Gç5“é¦. à%Iò1¥rtD¾«VÁ»ª‰ '^ ÂuQU {rêG~8ÙNÖ¡øîxñša«­æ¼ô0µ‡Ô\Q"Ö-zÇÍD0OÛauWJê­e¥¬…®O ØžЉgÁ­‚xqÃUz#ïu+2ø&‰~jБ§T§gæ+`X¸´!b¤Ê#²Å}s|î&Ñs7ÉÅFH»•Vôœgr@.°±ÆÖŸæÂ/÷L–¥Jq`›ÊyIÏE­·"Èq©ÞìÖyìùaê & œÙÛø^…æÿÞ\";K=$çÖ½=i)j1g„—¤}wGbÓIkÅø ‚©Ê Žo×Gà’’^ºTÿ­ô’;%±+«ˆÝöVï\E7g¼00^˜Gæyë©d;:O¬A˜§T?œ*\l†±á’Œ3•êÛéÔ÷äå WßaïRo'3f\ð›(Äü“ò‘XݹfZdŒœ#ýÂ[LðDË+Rî)@¤À¯¶“ äa ‘DƒÑÚ§Á‚ðÜéuÓrÈ¿’¾¸ûfñn#8% †;Y°ÓÛ4UÏÕ´è§\ Ổ%é´òœw¾c¹¾“¸oÚj󜟡ï%&M'q½œW²vÈ2Q{5)³^žYêâÔYÏ6>Lf\çfä™çûipnWBJ£'L¹mJ?£÷ò#¿ƒÍÂL{P‡Y÷b/É㩵œmB±˜Éó¼§ ”ûTäÎÑ''Ú>`{*uʃ ¢"Ÿ¹&ÎÝ çŠ+LYš¶Üí'Sâ„'êv¼¤atQ-l˜î¶#«w‡JÚ9øàÑúÜöòó€‰#Ï$)A§AsŸÛÿd ^|"pd«)ÝÌ÷Gì öËwýúá/Ëeüqj·`ñI;ÁGþ¢™^ æ)íÆgÏ|Ôè~Odªø½8¤Ôr&óù(§mOÁ¶¾(«n¾ÅÊïéI -n(—µ¤ÑÕºj¤ puÌì–TÄßî\'üõ«w«km–¼¹þpóuÍã–³ "8ÊUyÖF¦wÑçkæfè5ÒºÝì+yWžbÙô˜‰2.–0¯|¸¨·…[XÒ¯¦­E«‡]£¥‰ýáóøAG¡ýN~¶ZMB*À] ñïY‹xé˜áb­T“ÌË£øÂL\ˆãå0 ÂÅ¿V\ÎŒ†Ã÷>"áïõNª©J‹…?˧ œNoœÙáwW*½2¸–i8Ú„çÝ@ [¹ â©“ÔÂE.¢+à+;ôüf{(då¥8¯(í¶XsùòQÄ&º±B+СéåAk=qìÚáeWÞNëÏ0A9;Éìœ\&`*ÌXüŸåu”rHZ1)w½•MÙP3m1[rf¶d!ßëvb_¶¶Jz˜”ŠbÑË[qàîî<”†Ã}˜nëâ?]Z/Äg3vŠ\¬¬ÝŠe{%¨jë9íj1>n«®vÞº™uUòwÇÁBù°UµÕÏ…œ4‡[[ŒíÒ¡´8ˆç€Ÿx =Oïòk­èda zyèTØ_úúžKrÿÿÿ_ endstream endobj 938 0 obj << /Type /Page /Contents 939 0 R /Resources 937 0 R /MediaBox [0 0 612 792] /Parent 892 0 R /Annots [ 944 0 R ] >> endobj 944 0 obj << /Type /Annot /Border [0 0 0] /Rect [254.267 209.4075 397.9035 220.3165] /Subtype /Link /A << /S /GoTo /D (pick) >> >> endobj 940 0 obj << /D [938 0 R /XYZ 90 720 null] >> endobj 941 0 obj << /D [938 0 R /XYZ 90 720 null] >> endobj 942 0 obj << /D [938 0 R /XYZ 90 605.5989 null] >> endobj 943 0 obj << /D [938 0 R /XYZ 90 469.0389 null] >> endobj 945 0 obj << /D [938 0 R /XYZ 90 195.5255 null] >> endobj 937 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 949 0 obj << /Length 2376 /Filter /FlateDecode >> stream xÚ­YÝÛ6Ï_á·Ê@¤ˆÔwîí’\±Ez. ôa»Z™¶••%W¢»Ù^îï|2mÓIÄ"9$g†¿ùÍ+1ü‹*^IUiQ,šÝ‹Øt?¾æ+‰Ðùçí‹WÿÊÄBÄQWbq»>Yävu¼ÙÖû¥´Z†"—a’$Añz¦iüøæýkîÑ[Qø ½jØ-eüÑrŸžXè ~»]ݯ¸ã}ÝƒÈæPoP,Íó"¢ZÞßþôâÝí¬u&å×ìB‘Kà ¹Iƒeư¼L#‘¤VD¨Ž¤ÿs¹ ³< :Ò°^¡ àé:\'e”‹$¡é¿ÅYÜ¡(Y²n;Õ×;㻆­ü¼W(=>n`l¬ïa’0kŸ8=+¢<ŽÁÐWd1{þ=¬>¡£%¸WáGlЧ,eÉŽíyø·X¤Ðß¡¶G=ðàæò8Àæ¢Á­94œ3ì5Ž}Ýñ´ %UCÁSZqw=nÐÚÑ(ïãÈï—!ìijZ£m9¡ÕèB60'-hR.õ¼ä%Jî•Á°Æ_ؼÖ5µšGš7¯Që~z ½YŽ@®Ú6hò–çìj^œ&>°Š¾–"ªLT 'ªgÑw^iU•A„ÂÆzV”|µ#¨¯&DÀKßæ¡ÌETd"9E5q$+™9Züò lòã{ØYÄÄýhÁ+4‚îdEÂTVÁ0úI!&3À>-’2*“òš…zgØ> Ñ.iuKøB}—y‘7kB „[ á žxdصZ«ê§A­µuøn¯„Iôñ— Êø3#õÁkÀm„-uU $ü°DÜR¿E›Aü„ŠŠ”"”ð·1û)ëí‘1H“Wh¶®O#€miF¯õ1NÂ$ËÐKøÓ»𥮩}茺÷¬±V¬Ñÿ€< ˆ˜@R &šõà)nÇš»l½»môê‰ÛOmË h4…–]~I,Ù{Û©>ófìštü‹<©>1Uæ3Ùt2LF¦q’†`–‰†§ôÎ*‹¨¬„‡ä“S’÷àwâ‹/±½Pò`zF¥hN¯HÊLÐ4¶­Âgõ qI>/9|©1m‡Cǹ …Ÿˆ`öÜhM„'”I¼æ¦$PZ~ë{zxíÍeT”EåPžj¶ƒEøP®EÄð]•v•ˆ+ªJ—?IœFyV‹´@æq‚õ ,EÃN 4Ë…® §Â»\ø f/CÉHˆ„wÓ á? ¹…ð{ÿ’ÅöTÅaÈ Yž‘VyT¦¢<1ÂSÈÍr_3ârAö¢ÒØ.z•R—À (=ÿv¢ì¨áá#xñæí½-)iBûÛcеÆ`Lr'à L„z.ç´JLžKÎxðË„>`Xüy °ü„S4_pA‰k6&¥Íå= bÕEYˆk&“4ûc^Ém1Eùá÷ ë/Uz ¤~kE\Íù‹³€æNô)æ—‘›¬ -U¿=7[ó»EKŸMáIF¥º–“ö´‹Mû­eX›¡‘ ì`Ý(S†¤IÜÐeðî°4MK®p«‡2h:Ja<É%2¹†ëõ‰W3ö”TQ‘"x„qAŽ™t'®_q7«^‚«ASb¥Gç(A€N…ΰí¸gö6Ló¸Öß;þ¢ÍŒrµùí ÌW^ÖŸÚ< Œ5‰“ÓŸ¶­Óš@©Ž£ãá¸å\8@·“îpâ¨:“ÜbGX~|÷;&„RJç6_@(o ׸ºª°„ÄZ’lØÃŽ6“cÍc¦ëPOähvÛÚsxsû¿KZÜøÌ?Úþ6þÏ÷¹›7R=dî}uê—÷Â¥î¯èìå˜ÐゼWå±§€¼yË#˜€ñ·4L¦Vä»Ý’ke.Ã+s-s¦ÕŒŒCïŽYÅ7Rœ‘ÙüŠÉ0vÈ+pÈ¥ÌX;¿¸;œ*'¨>ý¼ÁxM[*la`ÐLnçlVØ@êº(¬16´)¥¿·Í<ù†0ÀTèïg<ÿÇ<ôóyÉÔ"8àc'f™2…Áïšhýrüp ÿŽ{Z}¥“ëðDd©I"9І§“ây8ôîÆ'äz3ÓÍ[8‘¤Œƒ[.:KX‰¯‡­¹~aÑ2ô£z"*˜H™~ß!55]K ‚zÌ›¹kcØ)+sÂ7Ÿq3ù²dtãzÎ2WžVÐÞ—¾ ”ƒci=Y^Æd ÄeiR¼âç(È«tVœ˜Ž"~("åaâ(Tm²°Ää䛦=Æ"Š[-ÓŽŠ®Œ>gJzŒu M„²‚× k™Š(+¢*¢ hçJYm¤BWÌSž/æ-©óÜ(] ¹¨‚èå (ìUwoè(œÚ? 6s…nž‹ìˇR Æ(KªêÄ$_‘må¾fÔå‚׋줰‹^%½ü«¤NX•aóOõ]ˆ>3—Ì;äˆp=Öó!uí>$´BwõªÃ ¦5µžÛßF—”ž^ÑÍÖ\óe^ò‘&L 8 n¨Ù&ƒ2ÏçÛ/ްI\]=†üÊÚ1aËS)Ý—FÇJ\¯5›Û˜`EhÉѼòú¨¸µÌLôO<Aû‰qeŸƒ°‹æ³/0ßæÝÅŽd§ΕIï8ϤfÅX–0?NÞÕŸøƒž:£2ÊŠûç3õPÙ•|Òz္Ñ€/ÎÇw,>°®îç·LäÎïqî û¥SÐ:+pËÒ|ŠWŒµ¹èfÈÁ2ºÝù^ÉÍ#ZÇe¶¢‹ÞÊ(½à¾”PŸœ©ƒjµ1Cdÿ™øÙiÀí§îíÃ^üàcmW»04N\Cãd64¦²oHtAñq6˜P,¬é=ö± ¹êxee0• ]€3̃¥üÞL·¦áw×NšAñ§¡ÅÇù¶€}æq| Žøïom+õ¡Óþ­ ”‰ŠŒWqÌKÄ‘àž4Š-ÿ¾YÅ endstream endobj 948 0 obj << /Type /Page /Contents 949 0 R /Resources 947 0 R /MediaBox [0 0 612 792] /Parent 892 0 R /Annots [ 951 0 R 954 0 R ] >> endobj 951 0 obj << /Type /Annot /Border [0 0 0] /Rect [304.6597 489.9331 496.8418 500.8421] /Subtype /Link /A << /S /GoTo /D (set-load-path) >> >> endobj 954 0 obj << /Type /Annot /Border [0 0 0] /Rect [241.57 194.8552 460.5399 205.7643] /Subtype /Link /A << /S /GoTo /D (look-encompass-size) >> >> endobj 950 0 obj << /D [948 0 R /XYZ 90 720 null] >> endobj 270 0 obj << /D [948 0 R /XYZ 90 720 null] >> endobj 479 0 obj << /D [948 0 R /XYZ 90 569.6696 null] >> endobj 952 0 obj << /D [948 0 R /XYZ 90 476.9855 null] >> endobj 953 0 obj << /D [948 0 R /XYZ 90 285.6212 null] >> endobj 955 0 obj << /D [948 0 R /XYZ 90 181.9077 null] >> endobj 947 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 958 0 obj << /Length 2052 /Filter /FlateDecode >> stream xÚX[“›Æ~÷¯Ð›QÊp€nyÛ³ÞãrÊI\>[•Ç#`%b$T€,oœü÷ôIlÖ»¥*1ÌôôôtýM3Á‡_°ÈüE¢”—é$YäÛ¾t~HË w*òßÛÿù_,ßËü,XÜÞ(¹->:׳_N_.ÝÀi—®RÊI~\ºZkçÍõ»¹§ß€L‰mè-›í2Lœ/÷Α…®±Ýl·fWpÇ;³‘õÁ¬QLÇqâ¡¿ütûÓ‹›[ku†í E.7–„‹@y>ìL6§Ú ”Žhc‰‡æ„ô'K7Š•S“…`\è4ŸÝ–ŒÏËÝRãÀeáÔeàÔÞ”Ö¤øw?òë†æÃܾ§}lV”yÿöõ'vÓÇÜlËÖÀ;LDïI(¢Ä‹}v»"Ÿãq»L•Ó’ã:´¨††aãà]¥‰Ãî…F CMƒ4ŽA‚6,ŽSÀ–횉Œé¹³ž¢¹¡0×`dwkÜñ³‡¾hwÿäg}¸¡¯‘BçÐlÜ0znº·faˆpÚ† ßbã54^¢ ~èä!ÀWÓ¤‰vcÝ}7Ì#lɱ4D;òal#²9Iì–a664wò|Ü”;ã€6ÐFÉ#0wÅæa|åÜuÓŽ&Ìí½ÅͬٛŠíH'‰•j'÷·¼ÚxºØ:Ï´¡l³soÐÖ¢®ŠAÌÐxÈHÂ47´Ý‰eÚy+*n`ôÇÜW§»‹iwv‰ ½8ctÁÓÔBØ‚ïRç þÑRˆç8uL' ê¦]FæîÙ3ƒŽ\Õ%ô<7ÒqYêë5Ö í9žŸ¶Üg± õ "·èÄyZTA›ãĨÂj ûNT¯ÌÒñ,„0óíÙ z.QeLTâBü_—ßÉLÀ:ë’ùåÛ±ÚÍñ/¦¢¿Ù¼ë«ŸÝb¿ñã··¿¼þõ7n¤–±›WÜö<?‰ª~æ"ª¨0’÷ÐÎbëtl¯+>wüz$'Ùˆ]hL˜E0!ö|`NÚpmOEJýa3£çŽ~C§8jÚ· c¤lûŠè3³yJÝ„€êw?Ðþ V2SJžàµÚt=·jëÃvRüyø)]xko.Œaê%YþØÓQž3 É”Lؾž´¿ñã¦|ÝÐóÁX¹³«uœŽBØ×rz´f pÒO\^WHmûòØ·¯)t„rÆd >ÇÊGí)n¨›ªi ÕdÓ÷tÚ¬öËP 9Xîo9&÷f 8øy —øs ÿ®Á½>%õ\ø˜¥dysóëiÚ¹zÿþæêÃÕ/×7OK!Iæ$äB;€7[é5{Á/H»\:Ù-„D>€Ó*›UÞ±Õ­ð|ƒÈ$[=^âjPJa"5¢[ ÅãÛ=ØÊ¶ãMSlóáòPŒùB–`hÛ»ñ˜”â‘\XW»qNÞÔMûŠº)lÉŒïœõŒ{‹¯Wƒ”G:¬ûŒ®µÞpMzŸ ¤à! ­IÝsAµ2݈¬K0Í£çtê æ’·†w(^IØŒøôk °û-÷c¨šöüîDù©Æq°h t€—#° O.P¬œ;œ¹ºTˆÆýß~âãízI(…µp$º±Ä¥‘Ù’`×ÿ™»Å^ªÃSûg.€¬Ücö_*Dûçñ¤}«ô!@…ߨçáéa8=‰›¢Œ¹)J§ÜÃ7.S&1–d¢%pË{û±RÙ«†*®"ùÐŽÆÊ ™Äœ'e)½[+R&É3 Ð%f?Kd{¤’Ê^ÈɆ7ÔÇÅK{Ï]k¼’¤‹’Õ¸cΘRnJúŽ¸Â‘K©ySë&÷#`Û|ýƒª:¹º!ÆÛŸ—üÃÍL^ÓmLYÌ•/÷贌9u&RÁCÎ{.=ª šBs¹áoúïÆ/8tSÖ‚Ýœ/{ÿEhÙZAþÅ¡0àÖ ÑZsá.äckƸ8€òÉOeîsê3O§JŽU]Ø@ñ V†Iâ¼oÇïpŒ,‹[†–ú“€Äï| ³» ±0ô²D©E¦=D°•rG±9 ;SvJÀà$àHsû£-À|È»Èȃ‚!8Ë)3|œAr¾‡ ©^¤§B­`b+æNäfvq¡Îò0.úÙ¯Ù endstream endobj 957 0 obj << /Type /Page /Contents 958 0 R /Resources 956 0 R /MediaBox [0 0 612 792] /Parent 967 0 R /Annots [ 964 0 R 965 0 R 966 0 R ] >> endobj 964 0 obj << /Type /Annot /Border [0 0 0] /Rect [308.2661 235.2868 496.8421 246.1959] /Subtype /Link /A << /S /GoTo /D (merge-baseap) >> >> endobj 965 0 obj << /Type /Annot /Border [0 0 0] /Rect [422.9733 91.7477 522 102.6568] /Subtype /Link /A << /S /GoTo /D (help) >> >> endobj 966 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 79.2031 189.4184 88.3546] /Subtype /Link /A << /S /GoTo /D (help) >> >> endobj 959 0 obj << /D [957 0 R /XYZ 90 720 null] >> endobj 960 0 obj << /D [957 0 R /XYZ 90 720 null] >> endobj 961 0 obj << /D [957 0 R /XYZ 90 572.585 null] >> endobj 962 0 obj << /D [957 0 R /XYZ 90 461.3634 null] >> endobj 361 0 obj << /D [957 0 R /XYZ 90 356.6914 null] >> endobj 963 0 obj << /D [957 0 R /XYZ 90 284.9219 null] >> endobj 360 0 obj << /D [957 0 R /XYZ 90 225.697 null] >> endobj 956 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 970 0 obj << /Length 3043 /Filter /FlateDecode >> stream xÚZmoãÆþ~¿ÂŸz`1|'•´.g7ppw-yqü–h™ _’²u(úß;3Ïì’’éÔ-‚ó.wggggçå™Uü3þóÏVÞY†î*JÓ³uýÆÓáßÞøÚ[ÅrJòÍõ›/þûg¾ç®¼•v}Ääzsã¼Èw ߊÅÒwºÅ2 C'ýr±Œ¢Èùöý‡/12<MÁ}-Úz¤Îc‰1ßyÑ{î·u7 |È"Ùîó-“EI’:~à/n¯¿{sym¥Žƒà¿‹Iž, ÎüÐõèdz°$‹\?Œb9Xê²8üM£Å2NB§Ékþ,–-7w‹e8¿ëE"ESE‘*Ï ¼,v¿x±GËié¬^]@%ŸÞ}¼$_ù)_tE~? …ûÛÒv@ƒY<÷º^÷éb™ŠþleÌP#¤¼ûh|ìæý‡~}ùõ š¼ù±l6Å?Ù~äü,Îa?o~¹ÛÛÛWú(ŽržéÅN»ïЩ[Q«Õ~…á{ún•äÓ’'.ðñXOe³Å­hr± {4~·VrmJ³)ë¢é˶aYù߯ïá¾bŽV¼x`ýx‰XU3ݺßåësyWÌ9(Kµ€uˆÁ*`!Äv¸>|Ȳ¶1Ѫån^©£#¯%‡ŒâÔ8äzeM±&$hda­Þ÷dOýܤäö~`ÐeOñKÞpÍ^òéÈ"+î…ÎZcy—cÆz™¸GËkž@©VµÍ¶ÇÈЪ£­"7L½øXC}[kà ɯו e$:ßF9Hqqæô-ëî©ñŸ0J)°ä¬º¯$rŠ•"E¸¼@'?”½hÄ(@œDŒÔѸë‘= WãxL¬)êªuÁ`øÃœ©3ÞùÛ…*=s~<ŸÎuH9sÀŸù*ˆ(;&Cw0Ðë|Çû¦³ê߀Ěpʦ(; —²u¹·s`šûŽ­‚§}4¦¨ý„Fp‹ìÛ€áëbä3«…¦aCQ¼l‚¢ñ:ŒS²£™1ßѸ 6Ê¥ õúª\—#λ¦ð8†^r ªЗÀ"D|€vß›å¿5ˆœ‚)ͺ2#s'\—»Jì€ý3"ªPDAÑ.ßJQ1µ5•²Dmiå<´u»-š‚Àڜ¬¦ø4`¶Œ˜Â¤mƒt\çF¢¹›PV¥áPHgB+½µpm¡ Ó)_ñ™R b>'Ï=±§´ìÌÕ#ÖUùcÓ*x ’1ãóD¿›¸ëçþ³l³Å´‡Æ ¨1’ÝÏ‚Þ0u=/ 4*BšI·!e¾$4ðx‰³ÉÑê$=þô2O‚Qa¸Ržm7 ï)ͯRCóó+yI¸V+g[ŠÑR®™áoJæXòÃ+YO²½ç¡ø’#(í§PÚc‡¡lœKжŽLØóÚ˜s0í®k9=çwÕgˆÞ´ƒ÷™›yQr¬V‚é÷„–QšLãü:ü¥™ó­Ù¶­‘t ®DÒ”Ì VÔã“76r V+‡¶”‚ ªY^òÜÚD¡rSp|ã…ÛÂ:CŽ%˜gÖ™ Ðç‘!@HºÜŠç06·˜ö4[ãä׋,d¤ã» z97ñ4¡ô˜8ÍØ’U^®Å¨fc•ÍÙ^–¹q”øc‘çë‡BžÔjƒÂçìˆ1oæ'«²¦~c( |W "”Ä8žî«MiµVêî’j¸^ãõÝ´¸“GmB\Ç1¹­-Áës[À¡S债¾ßr,‚h÷•”}ãý¿Õ^b«½µ<¯T­-i_ñ¶"˪¶›Ö}¯}M¹aK…¼“È×ÍÕÅí8NG<øø<€Ï$u@Yxl"º½Ã'<©0á#šÍÍšüU$aœ‚x²Í¸‰š¥{‘ü%©l‰§úz•Tân’ø'Z|¦²o4L£—§oz††’@è÷Ï@Ù¾iކCɾ1!hôàÐ'1Ûìªr|éÖ‚hia‹B«núx´Åmgß5Â5!X˘6úp¬ä |×e3J)Þ:§#ûê™8Ä&«@7R4‘@À†¹$ò‚H+ù±¨ÓÕ¹¶£SN ˜$¥¶kSPäøwqÑ¿UÔ, Vg3@è~/Nt/O¾~¢(U£×'e)\Íý´Ð8.Ñd‡¯ú>ÁÄWo•7§i#$‚Zy®ÿ¬X¸†=ñÊöØ‹Ÿ›`œ$ä·*ÍLU‘hÙ¤Ñ3Nà•š‹ßm&·fX`^n’ZŠÎ1Js б&,ßjrjžè°j‹æN·T× î°ÌŽêFÞG hSt(ü“#iK+—íy7%ŽUà‡RîÎ?ÅòÅux¾ä»ñkÏoØ<þˆæ/¨kÿ¾ÈÈÕo·øs ÙjôIHxÚŒO“O)䟼|l”—¾ Ûb: 1˜\ŠfÇîÍí–)Œ#3YŽ¥S—sçŽ|Å×–dx˜§Vw"Kh¦†bÃJ'„ƒÜ˜H$öåÂF:#Èz„tÌ(ï-®‚ƒoF’]‰jŠ»¾Àº5”O&/–”ÓóýE+ ˜ŠòàÜÁLn¤ ¶nkÙ×Öú~lþ(ìÂô}¾Ë~À€¹Y ,h‚j|´¸ý yÓàÏÇ[L•½‘˜„/TTkÞ~bÃ)jŸn¶hÞמ|Q}‹~ánIuAÐmg®‘6\\ '5ù`bQ¬t”XÞ|Ò—žÜ‰>¯Z­Í˜X 1îäEÿüA¦*æbPgÞõìe‰§¡ü*ÒŽúèĵSç]ƒUE½l\ȜʾG Eô]?^!Eh˜bL5 PXjžÔãÌ„²éK3פûÝμ‚Ñ&“”8g“(W¥ZQÍ5<àf›yqv„ìMïÝvôÞ=ð^Û¹éë ™Þº+MØÈ8Èã^;Ï ò«•ŸW/eyœ ó°«°¡%©s ;׉'“¢Gã‹ÔGQÊŒ"vNÞý%òÇ“7ý#$À †|»•„Ë[‰N¹7</€ééQ~+Š$™ƒÏ±ëg¾©úí/Jy—7k- òßÝ^ÝY»¹šážpí²°]óäF]Á>T þ ’ôóU†ïnšùñ”©-3ò.ÇVôê_–xI 1þöÍwö§¥f ôãÜ¿Ì/ae ŠV{Ì]ÿo¿&½o›u>&ÄùqU;ÛrŒ¤bP’ X0ãêú²òãͯ´Â‹ IªÎNyqD2ä“Âû˜˜³ï6Ì£ˆ“žèðŠí¢ÓŸÏDN¥ç0óp0Ý-Œ x¢™e{uqŽŽD3¦ÚMd$RF±åÑ—õ®ÒͧN ÀG4¦¿ðÿlðjËä endstream endobj 969 0 obj << /Type /Page /Contents 970 0 R /Resources 968 0 R /MediaBox [0 0 612 792] /Parent 967 0 R >> endobj 971 0 obj << /D [969 0 R /XYZ 90 720 null] >> endobj 972 0 obj << /D [969 0 R /XYZ 90 720 null] >> endobj 973 0 obj << /D [969 0 R /XYZ 90 614.2137 null] >> endobj 974 0 obj << /D [969 0 R /XYZ 90 352.7864 null] >> endobj 975 0 obj << /D [969 0 R /XYZ 90 138.233 null] >> endobj 968 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 978 0 obj << /Length 2419 /Filter /FlateDecode >> stream xÚ­YmoÛÈþž_áo¡ÚGîò5h äl_àCb9Å!wh‹²Ø“H‡¤bûŠþ÷Î33¤(‰Nl·0`.wgwçõ™*8òé/8Êü£ÄZ/ “äèzýÊ×é?^:r‰Â“üxùꇟ¢à(ð½ÌÏ‚£ËÅÎ!—óÏÎñ2¿NWÌÜÀif®µÖIÞÎÜ0 ÷ÇÞÊL·$šcš-êõÌ$Î×RæçNˆŽ1®×뼚Ëć¼"’›M~²0Ž'0föûåϯN/®#c¾'H¾'X&^ìûæ(NC/°aÄ⟸]Ãl´ànAƒºYÿæG7s#›:ç5D·q$2æ¼Lïkeq™ÏLê|Å¿aoQByqè,ëu}STE½QêëzæeÝÌé²Êé>Ò æÖ "_ìÀ“ÎÊjÞ«õ^fü7ò¼[Bá+µ‚=QËr),ÍŸ4Yê-ßf=p÷ÃO‰9"ö|Ò.”ëFª\×X/ £yNu‘k}rÿ,Jw­ò?ˆ;áÛ½°c'™”5 ‹c?6ßvçjÆ93àœãœýÎÙœÛæò`†;Ã0#9 üÖ LäùÄh¯©˜™™ ‚-…;óâùVJhÕÄ+zÈ;Ä»‡%†[È£¹áЧÁ]twÙܵχº¶‡º‹Юêšаöoå|^ª µŽ¬ãyž þóTlCüRt-$ˆ“b|Î~x‚—p ‰¢bPyq©[zT¬d~øùlêœ)±N°QÖúzþFÙ Òe©<•â’oNà ëp2<Œ𰇂¿~7:híþÑã !K’¦Ï;ŽÜœuÞ5ãž uÚZ椡 Â#1bUå-ò/éƒÍ bŽÌ¹Œ%t8púÕ¦&ð€q†Œ!Ê/æz“Þ|Å ¤×ÈKMÖçp¥z(‰’hWËÅ—M¾’½0O-;¡,z›ÔW{ŸeÏÓyHeŠP¸}A´CB®”…ë|­E*´¥ÊReæJš‘±?_¯6ÛôÚ¥VGÉ€,äRmΈ¦o¬£8ðR›»:â$L•a$V˜ fdÔâ ~u#sÈŸ¯& w LÚ°ªŒîzeÞMEÏ. ʆ„²Ø~X_Ž #Ì,ŸPUnÏ_\Q¦¾@l%=† W$‹ê‰[Øzfªb¿`|}zññôòÓ¯Ï+'›‚õjØÇ5qF¬Ýéû ºëKC,ƒtJ¼…ÔÆRJ‚½ w3¶Þ æüàÙ’b“GJ»W„2,qg.ö‡ß†q#q&¢FcQmzI’öµÚûS®LØß‡¥Ìqñ‘(H{(ž~Tžõ’ØôH7™ÏK3§í”!™½Ú}Ïä•^\ÐÜûòÂý#•CAß<èq˜âJ@¯üÍB"$èp|]!MæœI¬M(ÁD‘ÅA:V¹ý¿Ä’5œ–• Â̳&Ü‹/fšj]Ä5ˆô×°0Òo¶5IQiÚ×{- 5‚j”i™ˆŸ‰l\ßvX{%ø¨ ÁûKc}J‹ñætH×=×Ì‹óaÔW‹0"ŽaòÅÆü/}7YÛBâ Û6C¾Ý‘XÇN)[YIÍ„ò Wå´vʘáDâ;—K[•7K.¸åÈ+IŽ‚íí”DCilg9»b°iÕxôæs6ÅìºàØrs¶Ñ”mµEN¬²„ÊO»w;==‹û|}»ÒI”Z¸½¡… d{xÝlOsŒCï& ¥«VÀH’ºÏRNë ó×µ´%M½“ùç.Q¶¤òÞÉhqœnš~îÀÚþj~+¸í"tßœÃôõˆÕ[ 꼑 î?}Ë ¹#¦€ÒA#Ä¿âÞŠu#ݪ~Þ¾O¿j‘‘uY r½Öƒ¤½ÙÏz[)41Þ Ñ¾ìÏ×®¥¢ä‰ôŇÕ¿2–š®h_š#ƒÝy­… ¹ÄÓ“$ +Ú°Ÿ%ß}<ýôîe92 $Tƒ@r$ÞG¼ñ‚` F2»ñŽÝ‚1´ É “Cé«ÇD kùp™TÓ—} Ðl–Ðzãæó™øi?mF M,,8tHZå¼|IÂT.òËFý’êq,r6™»,&ŒúܫͲèìw“v =ßøñ6=K®j×ã½DV¯ËŽÛñ‹áƒ!ªÖ|³ÚvØcsØÊsÀO4ƒ/ss³çæª:kp7Gö3ܽ¨º>Ö?—óç9ø/ÜÝÂ6JsNæ\ÊU2ÕêOz‘6vþº•—Ã/˜¬e›:mÔK˜L—š×5…$žŒ•ßõŒèS«œœ77EÇ{Rçݪ­ÙU}&Y<šûU2íA1Zq syôMV“£q 4+p„•RBÕ+íJþp›¢·² Toˆ×B&ÖÅj.3å\ã9´$qœµÎ¹`¦õgýkOLp†ìµÇ¬¡Yœ’ j¥@^I';°&ß1•5)¿AÊÎúÃVüH²Ê!ˆ ·ˆ…•ƒ¦S¦[ýnimÖw~¡?|Ý ={-ŸÁF_ó"'m«Xíò³å pþœJ‰ù}ä@´”yÃÁÜ#‚välã߀ [Þ¬Íwˆ£F契lw#Y~!¨9‹ËTK<=–¹Òí¸üø¶x6å†Å&Úâá½ïAdZ äDÛ8 öQ=‘Â^xJ‡î ÃV> U·eèHL„ÏîHßKLfGÝ×H˜m÷% o"/KHö%Â>!dÒ*DhÈÐa4tc¢øèûm’·a‘1¤1Cã$É’—ãn?Whâz3ü:'Ó£¶C„ü/ ä&/ endstream endobj 977 0 obj << /Type /Page /Contents 978 0 R /Resources 976 0 R /MediaBox [0 0 612 792] /Parent 967 0 R >> endobj 979 0 obj << /D [977 0 R /XYZ 90 720 null] >> endobj 980 0 obj << /D [977 0 R /XYZ 90 660.3611 null] >> endobj 981 0 obj << /D [977 0 R /XYZ 90 563.9228 null] >> endobj 982 0 obj << /D [977 0 R /XYZ 90 454.3338 null] >> endobj 861 0 obj << /D [977 0 R /XYZ 90 318.4434 null] >> endobj 983 0 obj << /D [977 0 R /XYZ 90 237.277 null] >> endobj 271 0 obj << /D [977 0 R /XYZ 90 140.8386 null] >> endobj 976 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 986 0 obj << /Length 2148 /Filter /FlateDecode >> stream xÚµ]sÛ6ò=¿Âo¥æ,”Hì=µ©“I'm:‰¦“›¶7ÃH´Ä3E:U۹ܿý)J†$§Žg p±À.ö{!yß¼Èâ «µÈk/æëg±ß<“~6Œéå»Ù³¯_¤òBÆ"‹3y1»Þ;d¶ø5z¾Êo'2êŠÉTFídªµŽì7“i’$ÑË篿aH·œç-šõDÙè’a2ºc¤ç8oÖë¼^0àu^Êr›/-1ÆFRéÉﳞ]Í®S¥ÎÝ QÎ]L&V˜8VÆ%Bê$¥ë5&Ó4þSÌ‘¹ø’&*78ºh‰7øc¢_£æÕœFk’på¡K¼=À‹®}˜¸$ *E¯®÷7éÞái‚8 ‹ÄšwüQçë‚gyÕùâ7k÷¸kCGm.Q€ —©ÔB¦1«q¬ º¸ãIÏD¯§yÇpN—%ß¿få ÝBX·ý™ÈèšNHÿëV]1ˆ¥?M½ô§J kUB\Yýw 0c4pG&3mIŠ›¢ããR5V&ÜNÅ"M5ßî·8áVÓñáCú={0p0–ËÕG`| —LA7\.Ûy›nB”VY ô„oÛféÅÓó1/ê®hY2ß¾~ýòêÍï­Çëן;,9W6ÚÄÎ Xg™0ÎéNYÂ?ïgO*¢ž“'3õ¶`Ci¶5ÙO€B"…Tiê·t¡S3£o2F‰^kˆ;plMFGƒ¡MÍcÎÃOÄÁûÙeˆ²ŒÈ2éÏ­Ë*(çX$ÎeÄ‘bÓ‘ƒ6=CEU’·ÀüºE'Fêy¹3!Üalû›){gÞ¡Ûçè£SiAg ¸}›| ËÛ'9’~¬fã©¡MÑ(¯J>!ùiOÿ)NÕ´kØ‹ûoãhÌÓWß³qÿ·Èç«ÏuSŸóªú|Sÿ÷E.ø®ènUð$@u’ÛîÂRsÝ30âG¹‘D½Ç,%äó¼%o¶·x ˆ%(ª YÕÆ‡¿ª8”A´ YšzåyÙ)nÌÊ﨤'„Ë$´Ö9îY!p”Ëñƒn…“ª©—<[ /ù²©é¸Kà(»ûØb>‹‚Ãý:¿ŸR¾ïÍ ®¹ÛžÉ©,6K{+úwÐÐ0õ*:Ųÿ:Ê)bÌ8{bC†á‡uy”E£ #Èä¯q˜qt<ÁbùS›QÒþÄ΄r$~:/M ˆéòé¬âA—/J·T84¨8™÷bF›³¡Á‡©‚JîÀU„S/ˆ u½ …¥`:d@dÞyÓ¾'sFJ·®­äjuÕ›~ÍÀÜë[’¬ònÁÅY/yµâëG£Gš8º[þ@ôÊ™V e Û³µ½ªJ¡”ieÆ;/< {ÏD†—Å‚·|èËx˜Ó=¯¸‡BŠÛŠ”še›¯Q½À¦ÑG}ö@-\LžûtÀÛ/ÚËåŠc\©TQXÆÈsŠb*Õ-xÉûá!yÛPé¾è`íá);…u ¸©ÖO¸hysÙñ8V¦Ï•Ê=ŸãFÁ§÷!³:÷|Þ´žûŠ'4¾Ì¬Š`t2º9/ß#£¤ÐÖœO¦ÈÈÐ(Áœ³• Î×0z"è«V¤±ÊCÇs+Ñ–9ç´ƒ‚e܇=ö,1¸9VCTørÂB)!S %@P:ú‚jƒê³³!¥*rTô®ñÅ\å,”øa>ß¶T#í’7ÂÍaé† ÜÖB6¾îåŽûÉ ±Ùãi_8?’š‚CæÈëžb½CßíXÝÞÁ…JÀ¶\å]c›Qñ: 8ÒëÇ-˜dÈö ¿Æiv6¨¦B»¾y!„N‚ ›ä´Khv]`ØŒóΛ,Y¨‚¥eb|‘ê[Œ)ÚøªÈ_ƒL»éøÃ»ü†½Àøº Ðsþ«pˆ¯&ô¾1â4ÕŽ±K@þï —ÅÝÉ— ÆÄ֪ʾÐ:Þ·[)œ´pÌöó_¸£díœ<ÑhÛqvúÃŒz-®ÞÿüöË1üóÅ–*ÌpþO¡·Í’>!‰ó÷ÿ'ø(áÉ:áœSç´"ÑÚ ÅJGq£Æˆ"S4"('ÔÓ`Ñ•ˆ‡ç–c}»66}y× ZhÙS"Š×¥‡«Ê/¹[,…ÉR÷g/ È:úQÃÇžêŽÜHZ!4£:Lë`}‹Ø …Fw¶: Û¶D£4™=aÛŽm›žøŒÐ´;Ë–œÎpªþ+W™3#½…Ôœ€v@ŽÌ¢ÜQ3‡2Ä;Qƒã˜$ Ø91uSS£â‚z> endobj 987 0 obj << /D [985 0 R /XYZ 90 720 null] >> endobj 988 0 obj << /D [985 0 R /XYZ 90 660.0341 null] >> endobj 989 0 obj << /D [985 0 R /XYZ 90 602.2544 null] >> endobj 990 0 obj << /D [985 0 R /XYZ 90 545.0806 null] >> endobj 991 0 obj << /D [985 0 R /XYZ 90 279.8328 null] >> endobj 992 0 obj << /D [985 0 R /XYZ 90 209.5084 null] >> endobj 946 0 obj << /D [985 0 R /XYZ 90 138.8809 null] >> endobj 984 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 995 0 obj << /Length 1709 /Filter /FlateDecode >> stream xÚµXYoÛF~÷¯ð#”,—§˜"/ÃERТHò@I+‰ ‡dõøïcwEÊ´-) XËåìÎÌ7ßÎÌR\ºð'.÷2ö}' âørQ\¸júë…P#$ì¾È³‹ï߆âR¸Nâ&âr¶l2[~´ÞlÒíDX­œØÂª'¶ïûVüjbA`ݼy÷ŠgÚ ÈH쬊‰[»Œç„µg¡78®Š"-—<ñ.-AdÝ¥k ¢(¶„L>Ï~º¸ž«CÏ{Î/q,ì;&‚؉\×»Œ¦#ü d÷îî~½úVüñõž¢ª5¶ðº ÉkôÞ·ÕÄö¦VU/ayV¦-»‹À4‡}m5¯ÈJþÝ#ZÙAÚàŒg-µ¼\fˆLʨ7¼ªZñ/îºQŠV0®ò¼šÀÂ=­Y³PZ¯;=€Æ´e‰ p£†c–Ö*xÍŒˆÙêEöÉ\:¬k¶ÉŽ È`ÅqÎk^)½>‚ Þs/ Yý¾ªóåSH»,6!$rE”ÔôŒøŽè²M¸Xå”öjd¾z^㘠òa?¥øÖÄï+*Õ¢10œŸ>¹¡«ôž1Å‘V|s ›Ý½¿½³8뻉…Ũß^è:¡£!ÖÛ:+²6Ûɳ™ÝÁó=/$p¢EâáDºh»4çÉ-2–U,±Ï1äü`åvøÞ`7ÂÙýFj~>Bœ­_7;xY×HÞ‘ØB„ŽçºÁ°'C1¤ËkÖ˜©Èk’é<Çà·oáüÎLÔ&ß§\]±LZ²ýg‡åú[X¦ÆBñ}`“O6%çÙÄh½ý6­Ò…<†_ÎW™2)<«­žÌ› „IWå`ÕxU-?¿€K·çd¬KyßÏùpˆÐØé)b¾âWݲ<öQGÎ'×ù¦æYÓÏfVR ²ÐÝBßUîÁt®ì•:êÍyžÊåZŽtú"’þ_aX™dFH?í}¯,(ç jʸ犭e—ë4¸hȨ·)l¨_…q…)³e”›žªkù]ÿ|‘€d ц¹¹N™° –댻DYãÚrÍ24æl¬MfÃÚþ{edž7‘ËpÞFÚÔ|…8€úu,.^ä„A¨ã²ËÒAû3²­9QMÕ‚¬$;ÖÍ$N¦á¢Ðm@XPx¡“$‰£È‰]ß#ÑÛR¥‘dc~¾²w™Üãzµ‰ ¸ûö´góU‹mÛuÙ(>×JbPóëUÃRJ13-±ú sÉy€]tÂѶÇVzÝ?ýDÅ%«Ž®° 7×÷jzoª2IfÞÞ‘Õ‘¸›ŽúÝ´Ò°ßT’¥ï3|ødZÓ'Uéu‘ëf3Æï£K—]“wMxÈé팪IT}»\¥Ú)é'ÇßÉ-u-(+l×xd)õëÚ¨ú‹Zêo&]]ö¾4tµ©ê³_ÐÛ´íšq*û€Ç˜(F˜Ï)’ç|Æ¥†k7×wïíÛ+6ù/&Þ?/#ž¹O.Þx!i"ÅÁÝ/L"(UËsêªÊ*.ƒ–‹¼[ö¬Õ]CЫ©Kœ¹s¥nÅKÞä½AÚ²§) h®ôÌU&-…mW›º‚í¥Îbäb¯û½^á¦Ï†ÿ5ÚžŠ6lèYUÄÄSW1¥Î 7.;ÞŠç_ä¢Õñ®0V·W/Ì3¦GQjk.suÿ0ZsËÅǘžÜ ”eŽþ¦ú/ÀX; endstream endobj 994 0 obj << /Type /Page /Contents 995 0 R /Resources 993 0 R /MediaBox [0 0 612 792] /Parent 967 0 R >> endobj 996 0 obj << /D [994 0 R /XYZ 90 720 null] >> endobj 997 0 obj << /D [994 0 R /XYZ 90 275.6565 null] >> endobj 998 0 obj << /D [994 0 R /XYZ 90 201.0097 null] >> endobj 999 0 obj << /D [994 0 R /XYZ 90 128.4842 null] >> endobj 993 0 obj << /Font << /F51 9 0 R /F55 36 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1002 0 obj << /Length 1873 /Filter /FlateDecode >> stream xÚXYs›H~÷¯Ð#ªŠX†SäÍkSÙʵ¶R•T’‚Fˆ-oœÿ¾} BIl—«ÌÐÓôôñõ1R#þÔ(vF‘çÙ±E£t}æùÛ™’Õ8&}–?çgü¨‘rìØ‰Õh¾<2_|´ž­’ÍXY­O”U'žçYÑÓñÄ÷}ëù³—O™Ò®€G㨺ZÝȺΙ¦¬fz†ëj½NÊ^&%°dÛ$C6? #K¹Áøóüï³Ù¼Ó:pÝßÙ…,§†EîHy¶–‰aáÔ·•çdXd£:.ý½ñ$=kz¹VÕä-Ró ÿ—“¤E•ÀQnßQàJ×±=/œ’¸ONàlð˼¢/ÈÀêËW¶/.Ø1U»Ò5¿xÖÇT—­‡Þ Cgè´ò3HSrèAt‚ÈŒÃTàpˆæã©gÕäË5.`‘`À<ƒ `Z`}5±uÔÔj+y®4/RÜ×åØi´ji˜$À $Bx«-¸ }3f’ þN>'1ÑþŒÎÄŸ‹OA/9'èôsßX>Í—5· Cs-_ʳïkŠ :¥NŠBÙ¾Ç `ïýn3¸/ô2ÙµXæ Ÿ˜Òqì%ãÔÚæ`"nÒEËõ(ÓÜù¿ÂÈs y<Ô|ñP ¶Õ ~õ(‚]§âð²j).¾t°Ó*tÔ \\à.D­b®v…™‚’R@©7¸‰A=`D`o%ìD‘Ú|ËÁbw*{nÁ]àâÞ wÚiæ !wÃ~‘ëFvKó…°oXw ß5 äÿ&( ÙáùÍñaÂóÉQ>Ƭi…á$éí!ã~ñ~5?) ½$ãóañ…„²JvT¶ßè*‚²›&¤IM$ã¼g>ÔUV²2WóóùìÕìõœ-ûÈTÛ¶yñ0°ëë1x8ÁZ»T€çÜ ´t’¢­+| ¬+ؤâ|Žÿàlx§ãqˆO†–;R¨.-x]ë½Z— ¿“ËqÑ;^óÙ7ð KÈ} áüã£JsÖ8(»ïhwøàkt54à^"³š‚¼ajÂÄ´‚ªÊy޹ÈÀ¥ÑÐò ÂdVÛm•i,COà5TÖ¿«SÆ ›¹6Œüd$i!Ö|¾Ò; 'T2+D!`Me ÙëôXX† Ë·9;ù~ˆö– 6qÔw|BÎ*~àƒü0?2ë¶7»±u»f:;ðxtØ‘«Ü‘ïFv†.ÎFp m÷æ§ŽoÒg˜O¢rWÐ\òJ²,²]Û¤¹è]Þ~Õžðû†&=ÔW©ðXY/žÚSß ”ö:¾ß){*•¶ç¡?vd¢Mí¹Õ÷wÕ òfïß^>¨È`öc–¦0ÃzÕM>4eK…-ã)ïy³á)×±ðnjÝp*˜0Í€ êðËMÞ®(±ÛÞwPaB¨0[š&»Šž·÷Ê–ðÔSöÕð‡šl ŽzÔ`¼ßePÔ¹´Nnô5Œ-¬ÑDÝ׉Œv;~ÜŠÓäò¥Õ~üðöéïÅ\O¸SsÉË¥÷Ò þC–`pnø]܉=]æF"çüR™Sämº?M™1sÇ€;sʶWÅ£ †랎I!˺׹Þ¡Þ\ïg²âv¨„"zPƒÔÔÎ%zÒ77?¶Ö2ú¸Ó}]Æñƒw©ðû½¡h.@îNè¯mÊPþmcŠlùAPpþ/°¹Ý2ï(*f§—Oìu±cÍWPC¬Ír«  ò¦‹C#P+zf©r`WÜYŠ^kG²iíýi IUËk¾uó/qká_V"$Ó¥® Ö·æ£ÛÅ⓼ÜP?KÇp'ùvÏ*)¹ÉÓorÑ?eîï™òáA9ø–f!ß¶°vyŽKÝÏÁü\Ò …:Î`éû¼LN‡ZD,n,¤ée@BËÞ?aå‰7ËÍ)Çô!šÑ lÝTîu³hÌd·O@+–PqØüs×?% ½”–<¼/h‚Ô¿D[¹‡O½þs?~Õ!®‘âó(¸)ÿ;‚9’”Ü÷n SŸ(ùó\·õí‚z—l6®÷eªïò5Lw%ÞïÈ™õÝ~•ò¯O?†âñýùìÍ«ÙüòƒÜqjöevyÞ§Ñ•áÇÃnÆÆN@ôÔR¹¹VmjFÂb´/îW胈×w{ÄÐà ìiÅR“¼ìnbGP [T?7Ý€íÈï2 á"i”ïæ®°¤ ã»úÔÝg¤5–ÝoDôSÄÁ‚쮊õYß¼yþ’Wµ^êZ—i7úˆ‰;™+µÙCr§vÇèØÓÀ :$øÀ‘ðÎ!?n`}çÇ‹×Ws³iàÃ;Où·8%‚NcYc&áªÃȱ§öX¦Ž” z™—º'©ÈVSŠûçÝùÅÐ1Š?vº‰—W5HÝoõX‚Lìÿ£u endstream endobj 1001 0 obj << /Type /Page /Contents 1002 0 R /Resources 1000 0 R /MediaBox [0 0 612 792] /Parent 967 0 R /Annots [ 1007 0 R ] >> endobj 1007 0 obj << /Type /Annot /Border [0 0 0] /Rect [256.7212 424.839 398.8426 435.748] /Subtype /Link /A << /S /GoTo /D (exit) >> >> endobj 1003 0 obj << /D [1001 0 R /XYZ 90 720 null] >> endobj 1004 0 obj << /D [1001 0 R /XYZ 90 720 null] >> endobj 1005 0 obj << /D [1001 0 R /XYZ 90 626.3745 null] >> endobj 676 0 obj << /D [1001 0 R /XYZ 90 543.8531 null] >> endobj 1006 0 obj << /D [1001 0 R /XYZ 90 460.7258 null] >> endobj 1008 0 obj << /D [1001 0 R /XYZ 90 416.4444 null] >> endobj 1009 0 obj << /D [1001 0 R /XYZ 90 360.2244 null] >> endobj 1010 0 obj << /D [1001 0 R /XYZ 90 277.097 null] >> endobj 272 0 obj << /D [1001 0 R /XYZ 90 207.1203 null] >> endobj 1000 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1013 0 obj << /Length 2545 /Filter /FlateDecode >> stream xÚY[sÛ6~ϯðÛR;!J$HvwRÇîx'M3Žf¶;i(‰’ÙJ¤†¤j{v÷¿ï¹ %QqR{b‚àÁÁ¹ã;ˆ¼ŠàW^åÑUªµÈã4½Zî^Evú÷WÒŽB Ç$?Ì_}w›È+‰<ÊåÕ|}Äd¾ú\?û™ úrÊ …Zë ý~Æqüxýî{žé€¦Ä1Ì–Ín¦ÒàŠçdðÈD×8nv»¢^ñÄ»¢’Í¡Ø YlLHefŸçÿ|u3÷R'J½¤’L(¦ÆŠÉÔçé•Éb!uœzÿû5J$îŒB©…L"Ö棶,@R £ o‹º[7ín›%Áø±*×U]òxοïž×Õ¶ô|OíªL¤yžÀn ð¦Ý>–å©ÚÒ¤BI¥¯L Ê¡^0MŸGº{ºpL8áÙs†¼ó²¯š’è #r~º/×e[ÖKò`÷ù5NgÁž|…‰>•Xk)R™K<á-O÷’Äç Qb†Žâ)“é$™‰ÌK&ót/ pÆðÌd`S‘(k3Ì‚Uùk$ãÚž7LXÛÅ”çQ.3‘ Ï/ÏÓ½$û9C6Æz¨S)´¡(Åüd‘ç±¼2±=•¹…–.NFá)Ãc“jkRÍckÒmÙÖ„éÁš­™žE‚J$ü±ØS¡èè^ûœ¡·æw·)-" å ׎©Š…‚¢@´©@ý•ý…@6:hI³bVø\Ù¢qT» 6©ʆ>ªM°ÂÒ»·—ÊM’ EêØÏ÷´c6<´¨Ý üèú¶¢ºÌ¯Ë¢nðµZ²˜0Ü>ó§Š|SÏTôÕ^žÇ û‡’¤û©h_ô²ŠAæ×¬1½w Lük–a0ncΑñÙgÙèÇAhÀv˜œa„B¡õ³w7P žtƒ •q.d¦¬¯œ.Àu¯‡Y2ö+èì »V6×Q€ N)b©+øAý *Xônd‹…‰¡HAhyÈ +,VF1t}ó|qt÷–?w ¦Åvů Šÿ’_†,]ÁÆ5Ï7ö‰2=Ø}=Zx²Î‚ïû¢ëø+IØÒN›‡)¬:FßozÚž¦[NªfϯM{ŽØ‡ím €ÚPȨdój®ý=²u§t³žŒW,¢q–Ú $·M• …¡ê Õ…ÀJ•ÐIúb`éq`mz’t±-¿:´6=’S@ßÉ¥6™l¶xlž+±<[ƒB(ê·`=ã zÆc=Šã'¤—Y¬[z ÷EÿðEõ³‘úÀ Øì\M+ÿ”X ”¨(è¸0Ö$QP÷¸ßb" Cʧޟ5à ú°ã¸Ãô9XçÐü¢õ–‡˜mí$N=óx8pmUoxºØZÆÂWgìR3èRËG2Ú_§k½Œ}‰†=UžQMPyÊ,q‚6jKR¯oZª!D›“žHKæ@Zï¯A9v— [èà&{µ+ÚÊ"-»'•ié ¯C¨€Y=AGè®°b\T–›*"Eí¬˜Ãš=ášjY ,GŸæj8´Ð*è,”?,°Z¼¹Ÿ‡?Ü\ßÝÞ]¿™ßA~o/Nîf~ÿï?qSµ.–Ö!…óPÛ{¬vú\o2Èé'ó€vÅ×à–Kf6ÖÌt½±WUpè`–¯¶leWVØOë¶Ø•ÿí«õú3+t{÷îæÃýÍíÝ/ßÖ”= ˜‚%ëUÙÂѯtªã†öXĹ¾á'uçÅnÀ>ÜLñG×vÂ{̤=Ow„Ú²´ü«z5Ôc×$Â'CN@’‚ó»ÛÛ©¿&¬Á€t02‚¶Îò¿óÄ€A§¨Ô·0q‡ïn`6ƒ¿`6^m¿‘ SgšEÍñIJ4õÀ=,{^Rû[‘Ò2ÁÀ£å6ðpŽnѧ½>†^ûÂÓ{øÝa Ã)æ©€öÌø>"4YÂ0¨œÒzصmƒ"ø±¾#eÌ­„8¦ãõ@ðpÁ7-~Ðd$ k®¥­åP.¨oêáp –a|–Ã7TüG~]2²ÌÈê†ÒJH£Ò˜]]ì¡'é§L”J‘ú+!ºGQiqØÙK@zíޭãÇÔ)D'ñN^6wi9u#aøÂ_ÏuÌõ+Ww•Áÿ6`Ĉ¼å¯'è‹1^kEq|‚X±rëlò‚1Ý+%,¾íý%œÝì‰Wð-S怒 Òx1à³ÖvÌh¼ÅýÝ<¥œvÑ(JĬûHŒ¡ü…U£¬Ë6œÄæx;ÆQ6ãX ¥{œY˜fËì&‚VÐ.œöüŽe’³žÊÀ/<[M_'|òØuó—.ž éÄÄã‹£Ô[ÇKnµRðY³+ì¢2Zĉ”'–”VT1\"JØè}Ó—üoqpþ¼¥Ãï¿ùžçˆÌÙ¶èGÍ®(øAÎŒéwT?_c*ÛjýÀ-Ƴ¦­]ï$z5úl ÉT“Ù–µo­|=Áß!´ú?!} ñ endstream endobj 1012 0 obj << /Type /Page /Contents 1013 0 R /Resources 1011 0 R /MediaBox [0 0 612 792] /Parent 1026 0 R /Annots [ 1015 0 R 1016 0 R 1017 0 R 1021 0 R 1022 0 R 1023 0 R ] >> endobj 1015 0 obj << /Type /Annot /Border [0 0 0] /Rect [167.2123 651.946 331.7153 662.8551] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 1016 0 obj << /Type /Annot /Border [0 0 0] /Rect [359.8606 651.946 518.9697 662.8551] /Subtype /Link /A << /S /GoTo /D (hdefine) >> >> endobj 1017 0 obj << /Type /Annot /Border [0 0 0] /Rect [166.9941 638.7953 325.1761 649.7044] /Subtype /Link /A << /S /GoTo /D (hdelete) >> >> endobj 1021 0 obj << /Type /Annot /Border [0 0 0] /Rect [240.2413 300.8023 427.2738 311.7114] /Subtype /Link /A << /S /GoTo /D (emodule-sort) >> >> endobj 1022 0 obj << /Type /Annot /Border [0 0 0] /Rect [455.6607 300.8023 522 311.7114] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 1023 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 287.6517 273.3579 298.5607] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 1014 0 obj << /D [1012 0 R /XYZ 90 720 null] >> endobj 1018 0 obj << /D [1012 0 R /XYZ 90 629.4868 null] >> endobj 879 0 obj << /D [1012 0 R /XYZ 90 531.8379 null] >> endobj 1019 0 obj << /D [1012 0 R /XYZ 90 461.0964 null] >> endobj 1020 0 obj << /D [1012 0 R /XYZ 90 402.8995 null] >> endobj 1024 0 obj << /D [1012 0 R /XYZ 90 278.3431 null] >> endobj 1025 0 obj << /D [1012 0 R /XYZ 90 220.7523 null] >> endobj 1011 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1029 0 obj << /Length 2731 /Filter /FlateDecode >> stream xÚ¥Y[oÜ6~ϯðÛÊèJ+Š’(5‹ÜÔ¹MR$tÓ4ò íQ£Ë@ÒÄq~ýž5ÒŒ'[ˆ)ò<÷óŽ: áŸ:ËÃ3£uÇÆœ­ëG¡L|¤dä…?%ùiõè_Ou¦Â su¶ºž²Ú¼÷žl‹Ý¹ò{î+¯;÷µÖžùñÜãØ{öä×yfØÅ1ÌÚ¶>Œ÷©ä9åÝ2Ñ·u]4žøµh€äf_Ü Yœ¦ÆS‘9ÿ°úåÑåjä:‰¢‡äB’SÁLt¦t‚d"XšÅÒqB‚™Ù‰èâÿæÜORíu%~\ù}SìzàoÛâ÷€l²¢©²@Q„±ÒtäŸav¥ìܶƒˆ}ñÒñ3ëæýuYÙ¦¨í UräLÿ‰ Ò0q€u•„l„ßϳøB#èÌxoH«¨»í@8›z=M’µhˆ&!`r†æhä€?ñàºí`¶Fòb –è¨öš—uXöq™$€©O]ÒE”ÃXÁ\H,ÿ{Q¸ÀDF ÅŸ¡Š+ç"(LA|Ø¥Ãuè<–ÿ¹÷hw95 ïÅ5‹ÓÃg¾ŽU`RmœrÓ¯óáGyĪÜÁØxvãéùÿ„K ­=öÞ(‰ƒP'gpm`r•£wã´:ñ`GæOéÂóä8”à­]eÛ0Ãà×èÖ*Lùû}‡†¿ò7e¿C1 ŒÍ;|Æw~Hª¢ô˜ýXGA¬¢|ÆÿBŽt ë$HòìHôC`¸)ìgf¶)H22_”™ Ï3= òÕ£t¿Iquï"Änv¥y¦ðÇŒ¢ÀÄæ¾|‘q¾è×Ee¿1;0-ñûìòõ!/<½x²zý†ÞóÇ;þâ?¾/_¼u×ï 7­®Sˆù(óö†s¹«ÐÊæ†—Ê¡ç)©ü"']áŽ;^yz®Tä]à eu`1à•ÕÖòàºXm×ó^Ȇ¨õjÃkWO¼ÆÁÕÒe>Y:œh9 ÂË`Kœd`RdžDÀ£`¾ëáþLŠù81!‹¡j3í½ã*:›•šËñ‡PuræÓβ¿Ð½ƒ;FÎÀãÚÆÿB] ú3 ÚÚ¹,â­Ào’xq.Á윃ÂQK¹a}£é6ü ÏIãùœSv˜,>à3^ âŽ&ÊïS]'»îpNvrMÎÓå#fÚ¡‹©–,È÷S¯˜Aç!(ÍNç©–ˆ‚…‡ J–xE%#_aLj¤åƒâžpûzÒ¤SZ8 œ+ É^7odÃ4¤;(wXce,.rŸ|yFVzAýe ' ƒä-*g^]|$¯íñ3÷ú1õ’ŽÁ—!$LURi/&èwÅšvÊÝÌížó7XÀKTáñ0§2ÔÍ’$$DØÚއRë`íF¶u¬YÓð·!4ƒskÕâ·hL»yŒ F¬ëñzIÉ€×ühN¢©êÂÙ >9®$^ö‡:K žð¬Q9‹Iƒ5†œˆ‹=rn¦ÀhO¹¦$0¡hU–n)ÿ!úÝòòºØS.ÂZKç:ž1li¯6ÀüÀ«ñx«[+Œ@CÁ4CËéÀÏô€-:ãäú;¼ªuº¥r(u¦*kIèñb­œx×ߨ…¹«…¶ùz-Œ&µiO!2ÆËÕ›wßWò^J¨MZ#ðŠºhÉØíGþ,WŠ.…ÿWc¢V(xzn} Ñ+«0’½ñL•è®Äb×ÿ-¥*ü?¥ÚB}ìÃÕës­¼ßŠ8ì€×"òêÅËËïÒëÅæ/jߣ E&åÅñZô¹F‰?â\&HÎdLXÊ.ˆ~¡vÑ‹Cç¼!íkù/äÑp™Ìp à6Sú(Ð’0€Gs¥½ô?-TY®¿0=7>xi!ü¢•G!¬ÀO“ª6ù<ÏÔ,Ù ´I%öઓ¤g¤Ø¬œdÅ_Š‚[hÀò'-„ÖYG ±NTÅ5¾§‡éü)á?=pÖE —&-«œ?Þ÷™Èî|rqµ¬>Hó“1H¢6%SQvÒë,ÈÓÜÌDXjäÝC"œÈ}÷yF:Í“#P|ªY•¦ÐQÄ¢â45÷hv¤ó§„ l8×,>ž€f#%PAÔ‘Á4wd8¼tâ ÜФsžT9Ò=Äóé£*OW¹C¿ž¹ÔQæjÊ ˜*šé,öhß^+0‹Ñ!pl¾.ÇÒñò¿R7^‰Nß>ýûåÏÏ.ß~øÎ¦ÉR™Ì&å!yvWÔ–ñº$«N(¯ tÇ»´'â9òÚÛœRD†ꆞ^Êa[ó̤+Å ;ðwÓޏup‰Ýg˜åøKaúÀSá«Àv¹­À`à©W05ű`¬¹+£:(S˜‘v¤©‹Ïe-ýMð£^eÇ/¢ŸKnÜÙ’iu‚d¾í°ÚIth8”^"SÇêÇk1½f‰÷b’OçI *Ù;›©Yš…<š©é݃À^ÁÛ¶ar_ñ_n¤` c/1u Äô×Ý1ã7ôÀ3“ÇK2oìºãêØæÏéÐaरüy[VÜ„!çî^v¸À«'½«'ï|%ç ±t_ÉÜÈ8qÔ‹n0r‚™‹m¼í Ï=»/¿3â>±”¼­5,ìcîÆÄÉ#²ãhÿbÏZT£ÕS²qî½…Õ篑5È0†Tà*•`z‚&kl]¶ ¶?˜{é%2΃01™‹¦]Ê/QS¡\8È×i¤&:ªRwÐu-h•)z¤Nl,¨´†T(ðþvk¥1Ò”"ж–žÿZ™œE!·GçÎÚ†øÔ$öç ~î$ »Õ,W &SÙCE#š [3ÜÝì©dXW@,};ê…ý°U¶›¸òÛÅê¹bƒ àyœ{…µâÿ©¹:„xîRxÑQEßòƒp£±^Àø¨Ëëè²â5Ò5a_Hzz\qol@ö6+øp±z^ÊýOΧY ŸX â´‘jÖ/E)å÷Œ¤Œ:´]IïPdÈú…'Ç(¸"`1†ýq&RNz<ÉÕbË =—“UÜü.„x¡ýÌ ‡âª’=“ç]¤ºÿµ¦àôÜŒ?IÙ[É…Ò(Ð:Ôþvá~`˜sM ]:5 àPõµŸ-ò 3Izú‹¥ªm9zHá:`ÞÕþ‹¾mG·ÉÈ~Ïñ7ÓŠˆ\)šýQ*6QÓËjÆ Ó,ˆtzòC´Kd}MÝ!õÅ0Zö`ÊÐÐ…ŽI¸Ÿ]w8±¬wôvÅ?¹ îI‹ªê2wv[ô[ß.ßç‹Ë»À>vzq C‹ìê¬tÑÓœ Cph„Ž ÁóaH›ºv :^ºÆ$Šý!1žÕL Çì€?!1ÀøÑtcÇîöõ;~©Z;HFÉ"<„꺓²CåE±wŸ§&Г¤‰óÔ–=5J3WöÈn¢ þ™f=W¸d|’Cj„1'<±:ƒiþÍöˆ°°ûVv¤…XqR§K ±¤žº¹õÇ—KÒeÓ†ÚýÔµ)—Kpª‚D룎þ‡£,Ü­¥rw„b{&`6ØJReÛ£j+¬®ÙûÐ’t endstream endobj 1028 0 obj << /Type /Page /Contents 1029 0 R /Resources 1027 0 R /MediaBox [0 0 612 792] /Parent 1026 0 R /Annots [ 1032 0 R 1035 0 R 1036 0 R ] >> endobj 1032 0 obj << /Type /Annot /Border [0 0 0] /Rect [254.035 635.0646 432.4129 645.9737] /Subtype /Link /A << /S /GoTo /D (rib-display) >> >> endobj 1035 0 obj << /Type /Annot /Border [0 0 0] /Rect [338.4246 348.8902 518.9697 359.7992] /Subtype /Link /A << /S /GoTo /D (sleep-until) >> >> endobj 1036 0 obj << /Type /Annot /Border [0 0 0] /Rect [166.9941 335.7395 315.1761 346.6486] /Subtype /Link /A << /S /GoTo /D (clock) >> >> endobj 1030 0 obj << /D [1028 0 R /XYZ 90 720 null] >> endobj 1031 0 obj << /D [1028 0 R /XYZ 90 720 null] >> endobj 1033 0 obj << /D [1028 0 R /XYZ 90 616.8376 null] >> endobj 1034 0 obj << /D [1028 0 R /XYZ 90 466.7222 null] >> endobj 862 0 obj << /D [1028 0 R /XYZ 90 412.904 null] >> endobj 1037 0 obj << /D [1028 0 R /XYZ 90 327.9359 null] >> endobj 893 0 obj << /D [1028 0 R /XYZ 90 206.5461 null] >> endobj 1027 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1040 0 obj << /Length 2377 /Filter /FlateDecode >> stream xÚ­Y[oܸ~ϯpÑ´;Œx‘(í>¥®»I‘¤‹f hû ÏhÆj4’!ibO}Ï…äHc9¶‘bxxHžëÇs¸ò"†ÿäE_X­En¬½Xï_ÅŽüõ•t_KàXŽYþ´zõæ/‰¼±Èã\^¬¶“MV›F—7ÅíBFC¹Xʨ[,µÖ‘ýy±4ÆD¿^~ø™)Ã ð”ø Ô²Ý/”¾UL“Ñ3]âw»ß͆ ŠXv‡b‡l&Mm$U¶ø÷꯯®VAêD©§ôB–‡ŠYu!µˆA3§Xš!µIH1+PE¥Ä¿z±LRõ倣eÝâOn–·ÑnP6°˜[ lªbǹ¢}ÿ'1lË Zwú"ù··«w’$„`:Ò>Á¤Änû‰C+Ò8ý@™Äì•ÏåЃ`}r•E·^¨ ä#:ŒÆÁmÇßk°>)…vßüÄÄFd|ð ý 0Ñ™ŽÜl ®ñ„¶•‘HuÙ¢ŠVl!ò¹[d&z‹hæ]…d]9’|è`AÕìzTM9ÖrWQ 5;0U¬HŠ›’¿É°0UìQë¨Ýâ/¨…v%‰;´´½gÁ Z^½X*Ré=ÛÏzéyÁj¬ü‘ý-¬É"Þå*jžxxâ‘'Ðʼ|$pXÛ”´ýãœ÷s‘™X+rT¨‡µQWÞÖÅÚ ”ÔÉŽ<rÑ‚°÷U?T”e<éìÎÕYÆ.hy¦;Ð8± G0Ií£ØÇòá잎۠º9ÍÀ¨ÂÈT:¹g5K„U¡±ON÷-¹4/‡ÇRËLä™N§aBhsĈ®@ íCXrš –eŠ ËdJ‰4Óæ„0S„ØB Y±é×E]~ ä öíPùU$í——B¨Jƒ’øMÁûb 7Lê).é"!T”µpê ÿ |ŸÄ~¨ñàÙo‹$…Ýn»X$(5B€’§9žõ ÷ûs™f²~;m~®•ÎâQÀçˆfD+öí¡Y¨EÅñ—¦rÉMÜ ,l„ƒ=³û­CÐdLú¡hÖŽ€öèà~sœ%l»Q¦óTû=Õ´5ÑÚ z ^aÒW;xæo’Ê*wúê¿þëPÏêÉÎ$cÁx.8b?ÉÃW…è QW› ôÈèGwŒ‹KØïmêÈ”óŒÜ³‰oR¡S©¿—ø¹°y€ K—ßI Ʋfjµºl·”c½,Tb¢?àOM² w“XìøCAð:Ÿ2B*þzýG ìtœÜ’ǧl ‡uÉ,;7ß²Pä-^:½Î#ÂÕBv㣜Õ:cÜ×ùÎr§/ÏŸ±o‹5å6M1Žó $ |Ó^~ãíïÒ5íÈ_’GŸÙ–cŒ •ñXu~‹±{ŠþÐ`ücñ(†µ‹aBkGز—‘³…‹Ìø¿Ùzø!O&ÎÓíÙE]Ù|c › `?tP¾¼¹{®©z¾¢'×u€„oTS;ö£8c6Æ`*mŠëù;G¸_™»4#ygäSVÄ*K]›6;Zá,Ä{^žŒ—§Ñ>ÛÉTjÌ” •g>í‹ãÉAΤօ;]õÕ5•™N,ÆÔ¥J•È4è6 ¼]h;Jì7  E§¸T¬UÃ4WÊŒ*3ǰnÙ©.µj–xY‹ß?jÖL¤:Õ6|8'»Q¡5\«w-A3ß}²åæ›—$ìÊbàŠAú/‡ð`qá,#­€ûÕNã­¼6T´BïùÌÍa\Çÿ@f¥.³vÕsK ]õTÖ°ýþZC×øZðü+íÃܦø©3_I䬤 ø¼Ç‰DuD[Ñð5"¾=BÕ”?ÍÆG¢Üm‰Ïºªž%t®Ì™(M;0öfpÖ['^YW땇†‚¦­©ZàP¹Ð*Χp‡‘Ýv_—|qx»<4ÜÊ!ÊG‚u‘pSÖ8¬ŸÀïbóó»«–—ûøñí§?¿Z¯îÃEqÀ ×à°2ð %©‹ºCúOï¿ð×éHà†S™ýà ÚP`}sMñ¦÷Þ—Ôóï°à©E5Ìö¸ÛÖõ,>ÓñªtðŸë–Pê–²tpwŽ+×8¸Ð[îšk<šÓÌ5/Tμ‘+—+·ºøwÓž*äž´K0"qª?6--:îy‹ªŸ¯•0YâSøwO6€ógâDdR¥O…\æBŽë•òv‰V}fØÕ¥ã'ýVï?^½¬ 1âÚ ô ÜP»ÅƇJÏß^z&†¤ÆA(ÉpЇ×ÎÍýiÊŠ'P·õöŠ \ìq»Å§ ó /»œ;»¨—s‰rQ…ð)6L¸«kj°„cJˆ>ÐÂ{–æ^±¶þe:‘œ:‡“[æaD¢ý%\5!I¹k}TL<âÞví®™ÛWK‘ªÌ‡$£fóz`}BK\®Œ&-ï=Ú¸î”aØ*'ò †Ouî©îJçè³Jxôn^_÷<çÝ;îyÔ? ¶õ#9”ŸçЪc~ݨŸ[#“ÛM€”ÿO>á×8Ýudô¨ÌUÜ›§.Ýâû”éèÅ1ä’l¾Š)“ÌBêF%¤Mf²Ì½€$Ð_²8³™u’Ñ`“_Ÿ’{Ão†úüIÎ+1çjþr çà™Ã+&|ÂÁÅ·™M1Â@|OSŒ}5ã4ÐD¼(ËómnŸÌ2-lÊŸS–ñ €ÉD¬S9µÜ¦<%]fGIç ¤bò@/ãzïÌŽrkvš”&ŽÇ‰U†ŒüÌ£Uµ§EÜ› óÃ6wÃÅzÝvøgúczl“®ÇÂÝpSÉíÈkGY×®'@9¾â[<´é…gw1 ¬oêç 5Ej‚¥ñͶ]ÍE)còQ{–ÆTYlùÈÆ«ÉåCçœh¡ *¾/uýàX Ê|³ôwK¸Úw-JÈÌêG»äÜri¿Ô¢ÂoÌ?„9ŽT5TBUô²f}ØŽÅ8Kxà%¼k×pCwv@ãÔ9½òÁ u—y o¢¨¿ªi€A~D‘ 3ðð°ÏyðnBrèõýúT¢uÓ˃ ýìæ´ÉY¡‡âÿÿÙþܙا endstream endobj 1039 0 obj << /Type /Page /Contents 1040 0 R /Resources 1038 0 R /MediaBox [0 0 612 792] /Parent 1026 0 R >> endobj 1041 0 obj << /D [1039 0 R /XYZ 90 720 null] >> endobj 269 0 obj << /D [1039 0 R /XYZ 90 720 null] >> endobj 1042 0 obj << /D [1039 0 R /XYZ 90 601.662 null] >> endobj 1043 0 obj << /D [1039 0 R /XYZ 90 480.0654 null] >> endobj 1044 0 obj << /D [1039 0 R /XYZ 90 400.042 null] >> endobj 1045 0 obj << /D [1039 0 R /XYZ 90 273.0837 null] >> endobj 863 0 obj << /D [1039 0 R /XYZ 90 190.9391 null] >> endobj 1038 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1048 0 obj << /Length 3076 /Filter /FlateDecode >> stream xÚÅZÛŽÛF}÷W 6Àš,šÝÍ«óäõÚÆžÍ 3À&qü@I”Ę"’²lgöß·nÍ‹†r2Ù…Ùl6ërªúTõ¨ þ©‹Ä»ˆŒq?Š.–»Gž ¿¤äj3æÃ)ÿ¸}ôôU .”ç&^¢.n×£EnWoÛt?SN›ÍæÊ©gscŒ=›Í}ßw^¿xóŒGÚ-ÌÉðF³j7Ó‘ó!ç1åyÒ ¼®v»´\ñÀ›´„)›CºÁi~FŽÒÉìÝíw^ÞvRZÿž^8å¾b‘¾PÆõ@3Q,Œ}W? Å"ÅÑô¿Òø¿7›¡qš2Ý7 ×¶ÂÁÅ#é¡‘ÀŒZ»q£¸Ô/^àÑ[ÛªUŸ_Í/ÿÉöxuùæå¿ž_½ä'o_}ÿÃÕó[¹ùñæòç—<ííO7—ðÕŸ_¾{÷TòÝ‘s‚È =t½TేnÒ™ŽøyÀsRþiP~´p/™çTkY8y]ƒ¢#Ÿ³ôø!0 e^^š:ïgS‹åú¾¶‹¢@²ÄÄÊ¡qŽìÊhQ«E[ç4Š‹À3Îíô£¬kûA´{ûÎí¤9чF¦§õç\ÌM¨\Ï„'VÞvY‰+¢#å ¸¾¬öm^‘‹oa$Nœœ&yÎ.Å@øÄ7‹Ùn²)<)?r?ñE”¿M ëF:²ºí1&wäàeeì艅Ï5_^6q£0‰fïB4[eëô·E‹Æ2õ…0rãØD\òfÒ gø€U&E‰\ùµáÔBZ¹ZiýU¥i6ù¤a´Å]`N.€Ý0Òá°èË T…ÎÍëK¾Ø!RÒ%âxKQEÐiÎz7 \ÀóCmZ0w¼v:‰Kß !ݘ*6þ˜ùšuX "ó¢å»#~ƒp ‘SàÓÅ÷7ðs•‘ )¥Sš]Õ“F6!DAø§´Ü§–ôƒ‡A›IœçSkÍMC'fì௛%|ãuPluë0 ú~!m³.aŸøº¦§+ô %ržßå¸ÎwDðr•×–˶%Ö8¬âÞ‹›Üî{¢ÚÅ< Ü P¾µUH"ó¿_ádBÌ·¸‘ÄÝZ¾R§spuó•çì!uÇçá1_¢žø å¤^ w`|±² g™GÒ}Å«7<‹è¬Tg«š6òcÉ¿xʇÇuÓ>Al€ÞÈI2ÖÒC!oÑ q–ïQ²UÉhŠ.À‹# е8…ÚIüs O¯¯ðZ;ëªÞ¥-ç”,Ñ‘› Àxf¬6iãÅMÆ¢p¤ IÞÈÞŽ©=ŠÕØ|+4IÚaƒ ãõ “t©2}ÜðI l )"@àˆ³ÅÐ`㌰”Y{wì9àdÅî©x åÖ~WÕŸäû€€Éì["Õϯ\™4?0I× ÃàOÙß ¤ ÝxL€¦ò]íëàË~I¢ÐÜ÷K,É#ñzQDd5åÛ ^Hyüõ›ùþg|d`îyh#l:k} ÏwŽ“ù½µ>-fÖ¡ü Â÷É$ÍräC‰¿¹µUMD;ifcÅBªZtœ0fu+yƒód“ pL¬ÙéðˆJ©UVñ(@n]¹9AZ^n&¾3üx'Qi¿l™)-˜.{(xã,º¤¯Y‰“@ÀTœè-⨮…fÇÃÇœ6ælZZcf”{à!‚ÁZ~K¦høA.¿í–òOÈ5†,8H¤B³QÓƒ]H^Xp¢žJ—»t¿·*SF®ËUidÍ‚¼~ÁòâÊŒÈH÷Y!¢,Oá çéü‰sSñ*æäáem¡D«œ”i]°(øJ02¡圪~›dÄ`1¡X )aý=î¹uu Ÿð#Âü·$\¥üsBhA&QëaƒQr‘œ·leF„οiÙNf'+´ðÿS-ü>_3?'I1N»}c–!„ôäŸDò5Y¶iÅ~{Âüâ á¢e`à°î3ÅOÙ…;Ö*qNˆ!ùÍ5ÎŽoh“OåSS¬ÅD>P÷娟¸ ‡î©@óɨ¨E3Aò›ë6ßl¥ÀÅÛ.)àM^.«ºÎ–-ñTõ%«À¸J‚¿¤agu°\E’‹N4â¹F~s5fÓñÑwHpxd_WdZM»bШ8„ê$TãôØßÙÜo‚1q{ZV—h|œßTë–ÝÜÓˆàþ¶X#€aBèó9¬Q­y0­ä4â:µÌllõô™Ô#b9—òÊ™¾Î ”~¯±£¸Å]“eÓ9§k§è>[o(VÐe˜é¥ÝdËuÉän êðX…„à¾Ú>–o œawÐ}gu*gPºTf§ÓrxPêÛýé"/Ÿ6ÛÉæ™q=£¬)–Yº¡’‰ Ê3É 7eâcî‘Ý×Aðôš(; òF¯ëþÅD‘¶)ς텺9+~fwHz†¡’Ûâq1ó=¥=ÛÛš‚‚Ž«ß ·3'T7‘ëźC«|o1åF6mütn%(û´«ô 9•DvÀ¼‹¦áú*2žÓ.–=kL¼YŸé h ÃQ¬¿N:‹Ýس…ø8G Ox"Ù ÉŠŽO R¤¥-ƒÍÀ?] •m"õ×òÂv&inN2‚ä;,ªµšê0É‘3¥´È¤µO°¥ƒTZâMþ9 ðVx¡ÁT`·l¹.•ïÇl%s©ó¿Ö_SØ1‚§ãçºX”1‡l ; Êé[ðãc" ~„͈W_þ™Ó%§ ØçÍ6…ìýGOoÜ;Lø­*ïªõú®­6›"ûÏà ²"[Z†Œ.ØfB`;4rŒ3Ø‘€,ÕýùŽuù–Wƒ ßÚJ£g#®+eùŽ×À ceu„;iâNú/[X‹…÷é2û£¶¥¹$ÄoÙaYä«,-ï¶ŸöY½¨Š|y×ìÁ"ù2-jÚÖâ]–o,ÿèI˜'ml• F¥9ÅvWˆŒ"ƒ;>ü¦pýbE¥ßÿ`5#V“ ŠJƒEÕÙæà”¹dÕÑúvˆÏ·eu·­êüsU¶iq÷!«[´æ2¨ª¨ Œz'7Pî@JxØY׋ª”ì°9 ä|0Šý¼8mx,å©m~ćGŘ²7T}Ïf󴱤]ï[îÍù“éxD Bx"§@ÃOô yÜ_fO¦jé¦7‡$üVy“ö5ôjŠºoi_@ “ i!§±âŠ\ÀXdëö)Mf/3q\³ •¼ÊÞÉ>uÉðO²0UA]‰Ð¿í;ß(wJPN¨ €³2¶ÔU}Ê\¤jÛj'S¥³Š#ü++IÅò}CǶOú•X,9š;/™@Q¾´Oû“Ùh¸8"ñ jQXØýͪ~ÆSö[vr§å}A)@{a±áÏ÷›W‰³Áö^t¸ãó†È5:°¯ÄÖ$ õÝ Ð–4S1û‘ ’@Yq÷?Å8Á«Eß.éË”®‹3š”?Éd¨4Ôlh÷½Øaâ›·ÝŸ¬¤Gg#I*S']â"‰‚dtR® ݃üºú<†Ë+^®ù‘ÅÓ–o )˜u‡VÞfV哱Õ=*‚n'ÄkQõ)Œj© ó&¢}Ž3XwwŠÖ:køf‰X‰=gIwµP<çñ†ýÓ’ù729µ¿ÓÍ[¾Ôà”í$·»®{.AÇ‘›±?QÎÌMàÉ»†–1¶ -àQ‰ÁƒpG¶­HûÁ8M®ªyMù¸åÊ…»+­T56oaS3ù¦ÿkŒ BÐ4 §áC¨fÂî/€ ld7_[™²Bä¹±êŽÆÎ/Â¥²1w~-»‰l•d+¿Æ*Ú|>+Ý'‰ ½U§'Ám–VolUõ®«%"Pϯ#W?¾o ìJUÇÉR?fÜ=œ«§Ü Œ-âί£ö|5°…½ÞñxC\K‡¼¡ä³‚︞ˆ¬óyº~óïüs¿.âj'†›`lE^”J(wåU9.Oº]$[a -Æô_!, endstream endobj 1047 0 obj << /Type /Page /Contents 1048 0 R /Resources 1046 0 R /MediaBox [0 0 612 792] /Parent 1026 0 R >> endobj 1049 0 obj << /D [1047 0 R /XYZ 90 720 null] >> endobj 1050 0 obj << /D [1047 0 R /XYZ 90 720 null] >> endobj 1051 0 obj << /D [1047 0 R /XYZ 90 395.1976 null] >> endobj 936 0 obj << /D [1047 0 R /XYZ 90 331.3624 null] >> endobj 1052 0 obj << /D [1047 0 R /XYZ 90 266.9211 null] >> endobj 1046 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1055 0 obj << /Length 3157 /Filter /FlateDecode >> stream xÚµZmÛÆþî_qP„Ì-÷…\® p㤸"ȇö€~p\€'QwŒ%Q )ß)Èï¼-Eé(ÛM[°ÈåìîÌì¼<3{ú&ƒú&d7ÞZœ÷7Ëí«L†?¾Òò”E:%ùËÝ«?þë©}s·>[änõ>ùî±Ú/t2Ô‹T'Ý"µÖ&þÍ"uÎ%ýîÇ7<2<MÏ0Z·Û…ñɧ†ÇtòÄDßás»ÝV»üXí€äáP= ™+ Ÿh›->ÜýíÕ÷w#×¹1_’ I^ æÍ¶*ÉD°¢tJ[—“`^!;†þ×ÿw‹4/@–_¶ÄyÚì¤Ç纣¡~!ï=2 ê3Sõ‚­Q¹±†6ù9˳¡ÙÖ°Îóû¡gÉWõf¨ð«¬Ù5CSmøÛ¾«×Í3?¿ïkxùëhÙîì´r¯Š,áAPg|d· _4Ëj†Ó"àU?U› ?àí¦L†(Ûvõæ­˜`Kr÷=þÀ!ÑïëEêK›<=ÆÓÝ1m_ï«î4õ~aBr” eã ÑWýpEsS!Nš;W¤Îˆ²§U—-IúÍ]Ò®ù·‹L’rs<ÜmýCÒ?¶ø¼Yñ—ûE š¨yš|W/IüU=RÁQÖyÊ~è²â9™La•É´Nådg²¥2&³B‡D`Jy¡Jã¢f úºn7Èv‹Ü<¡£!Nç‘¿>ò ²Ü #›šeÃ)[ØÈÆŸ`Ù¼c× J‹[üœi×ÁùÑ »Èh<Øôü ².éû*qé>Ã¥.J¥Cµb†O—¡[çB.\”!y‹f[S0êjb¨H*¶Ög¦•Ϭ?7µ=R4ìh7Y :î¶hµ6 §ŽæoµÅZÑ–Fk&­º4)v^? Vð—ÍÈ´¶ëΗp®h‡K<Ø2 ÙÛN¶Á¨,1wl¥-r¸ê)NÐ8  È^Eª!Á,™n]mÆòW¹Ë£ž¿ä’ºÔÑtÈÿ ~ý*iä=‡fÔ)n¨¶{q[øJÔŸPuwä.ŒLqæ¹CõaâœÄÍCÏy$yÇ ©DyS”ç#2RN`äSâ 0¤ôœZ !š).Ø×C '·üÈœüáAÎV Ï›ºÞ§‡ÝÐlÎfÔ¨½VÆëÓÚšg´ e@Ïá÷ËdlvM&£œÓúËBáß̱^ÊšüL-ðQö‘)T.1]i)â¶`ÕÆ°…³cøKnáG·˜¬0H¼W./£0ß|†iPc(L9Õ÷Ì‚Na8.7gþ`jÞ\,ÇgpLÞžGp9Ììÿl™_ÅhÆé“Žú<ò\ÚéÙF[ä' #ù¼†sŒÕS³h$8àóìñ•Ê•.ÈŒ?Ï-0OB‘–#›ÙDe‘ÓqpFßÃ/$×É»®q Ô–û=Rêkš;îËG¤˜â˦Úf€ œW^kÇESSH› ¤í(|îú5Gb0¨ígÑ«>Yd‡Ó Jºÿ¥^·ïØ—5ÂZ~³Éº«¶5¼ÌØöû®…ÔQÿF«mΞÒ"x½ú~>ðJ‚~¼Ë¯‚…ïïÛç”·ü­íš‡f'äïWÃì¦ý¶m‡Çÿz~»ÇP´½!˜%þ”ɶšvÇC¨Êh˜ )ï¾ÆØDZ&%o.Æû%#Pòéö`¡¡åÅ[€žyžüÍv9ÌcIˆ¯b†1rUB <Á8€`¦~ܺ‰X -9ˆT¢–6P'ù Å\8,q~È ¡Âƒ›Ìe!‡zW ,ˆ ©Èñ°9Ëë„LÑ+¾Âs‡ºyæ×§P =½TÌí»o{^7ÓdDƒwõ¹!p¼µ`&.$·ï¨:ÈëÎ ,͈C0*R f$â±´…çÈc®‰O˜ ^Ú´ãòcÉÄ5Ãi¥å"ÖÏ%Єk´'ûÁy\/Çd5› ÂãÇÅœdŽu|À‰ÈÜY#Y†èž›%róȯh›ø[Þ@£ÂÎe.!Öxë –K© %öÆæ®Ñ°! •”ƒ@AþNPa, Øà´Äù5'*šDÄ"¡ ƒë·»þ žKˆj-ý> endobj 1056 0 obj << /D [1054 0 R /XYZ 90 720 null] >> endobj 1057 0 obj << /D [1054 0 R /XYZ 90 720 null] >> endobj 1053 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1060 0 obj << /Length 2377 /Filter /FlateDecode >> stream xÚµYYä¶~ß_1@X ¬d‘ÔÅ}‹Ç“d'â`<@4jv·lI½=ãlþ{ê ut«½»F‚Å´x‹¬ª¯rÅMÿÄoR¥¥éMQ¿ íðOo„mù@áÏI¾¹óõïcq#Â@‡ZÜÜïLî·Þí!Þo0_xÝÆWJyé»E‘÷‡ÛïÞñÈpƒm5m½‘©÷¡ä1á˜èÛm]çÍ–¾Ë Ùó=’EI’zB‰ÍãýŸÞÜÝ§Ž¥ü”\Hr)X*o„ BÌ –dQ T“`i€Ç‘ô+$þ&?N@–;yÓïàp-‰]ã¯_6E‡‡•ɹÊ@©2 T(™ña®o»š‘´íÓ¦ÞËZ*L3˜Ž{ÊÛuym Ü‘[ÄaBìºvÈó‘XV‹–ßye¶éóÈœ^øóÊ»ü̽‡¶+÷eóñé©}ñygKþ°–›²Õúºm‡Ãã##¬Ì ˜Äi„¡\®úÝ3B¥Â½“Ð+Úf#3o(és„™’̳«ۡl±XÒ™W8p ÇAxÇb`V9¯¡AV,4È(ù€(ƒuDg‡`¤+_ìR[¬gLeø[¾Ä]SåJ€5´$ÀÛð-EQºÎ›…äiÚy~@•F^»c&íà+ö$ ™Ö˜ÈÀº— ÃÁhgvãýÇX= =\°üŠõ‡Û–£¨##MÚz.è¥{dé\×5‚üD‡‘÷=Ž’š Óõ¯ÓÒÊûKvùûN%^K1Û­x”Ô:È ÀYñˆŒÑsŠ$Hp|¦É»ýÑÂ8›àVeORû èã4É–ÞõÓîóä.Bþ®éŸŒ¶L«þ˜ ¤ d¢³+É5ýDríÍðŹ×üºÔšþ_Sëg&MŽ@ß“‘^‰0ÏÉAÃE(e꡵3£7†×r(qÛÚe˘iµ éÈÆ…tŒç¸&1!h5•ÌòògaE_ÁJÆX9–~Áów(-¨äØÿ"H¢$¼Öá6µýâ7{ó±n½ñ‹®íû/«qÈ\QRÆÃ²Ûx<Ðí…}öª¶*‹WÌ$š4CÁ-±’™.çþ‰Bï–ÒÇÉ…»,VÞ½[±uÀ@×ÉÕÀËU•¨0 Tºì8wMÒDZke‰ßÙ„™Š@%:^ÊÇ Ê9<„q ¿u¾5Üó'´s.Q0(¹ŒE|(Ô¬è£í(4 ¾%$„"ÌÃb!IÄM:Ï1uÏñ çN#N¨ùµò‡ù( &9v=î«2¨IUh ž'G?Óg¶3%Bzß°Ïæ#7ZPÚÕ¬,ç>8‚‰y°{Ù9êp:à‚®­ÝÉZ U×åªëùèæR ŠøµZÇÍ>lâ˜kcƒs͆ŸÞæí¢ü!QÁƒst"4 ͼq°h¢ý_&Âb¿5Õþà¹2ëÜAŸÛ-NT‹9—<¿ ¹½xhü(cÔÁ—jJ)Ø‘‡qÕÕšvÊ’PœÄ» vl¡…fØǸ9†èî0¼ðyè[¤ÍW^ȵ^€ç Tmˆwy[°Ã1é˜ ƒ{¶Ÿ?Là C7ï‹ÃP¿cвAéÏîl3h´L(´PùÆÜòÝàN4âIñ »WümöW"ñ2!L!w-î¤"ˆÚáxïŠD4:[œ4Ûž'Ȅ‰-æbûlA~P0ìñP» ¤é‰ gA øN†œ^Qí±ãÞd¯Ô;±­|wÄu“az<¦« dt[…ñ9Êqøi¦GðìÞ&dºZb–8Z>‹ŒØwQÛ´\"6¾³‹”#L'×oJõ¡wOåçjüX:_z)zAËžüÀ÷’6ïxjQ?º;ysv7¶o@nõÍÖÄ‘ëmá½Å(ya€F ìÈs5Šc¦{¶»’“^ªŠ¬löÌ»"XÖÎJ8™ÌÂ?W¯¢)7¢¿ý÷ÿúç»ÿ|ìM[(Íi Õ:…¼)Ýåõ+W“‹¨šÉè.O™ó÷.¸a@6VâFfÀ(ì5LòôìÑk¤óç„+Oz— ¯=ìŶTº=öC[—?“ÇuòK†¶¾ïÖl*‘Ê–,q -Çzð¹k÷ !‚(ŽÎªšË’1–ñ"|]f$^ÿ†?-8tÇÍ~8îvöþyeS±Z&gI ´N?u¥ÒS™l½M¡=?÷’Ö5çÑèï¿ýò:˜Ÿ~ 7ŠÙÓ‹cJyPÙÖXÑíòbæ è£õ}z\¶…Ùü²ê^»=©ï505>'öÌ’®Gêâ…̉úk¯² ÃkzÇ ßÒ§ÜÓoó¥¦ðù6ù¿½Zf.É@¬sì±ï9Q:e ‚³iÛmÝ[-¿|À…ª×ñbiì%”YŒåÖZø”T ˜á`x{÷—û»¿­  ²@$Ê]A.͆ט3ÏbÃöÊYŠiˆ EŽ{é›ð¸$…xË4ãÍb”a±ÆéÅly'ÆYo×Ü;½þ4ÖU¨¤&STãªBT å$(äšB„SÜÙÂ=8Mp%aÓ í8£dfgᇌ§ýñ þŠýaŠíß³áµÅŽÎ¦DŒËçâ•}ÏF4\Mo£ó œµ§Ù·\¦QiUV«ÈRSÃÐ=ΜdM›þH¾òø=ª5 íÍI[µâÀÁ6ŠYÝìÀ‡”|Õ™éhÝ£krÏ\FQ¡òr}éì¿Æwl¢]º"PI¨è 3[½ Dzm´¹ú¿Ö×~ endstream endobj 1059 0 obj << /Type /Page /Contents 1060 0 R /Resources 1058 0 R /MediaBox [0 0 612 792] /Parent 1026 0 R /Annots [ 1064 0 R ] >> endobj 1064 0 obj << /Type /Annot /Border [0 0 0] /Rect [318.9931 284.6452 488.7812 295.5542] /Subtype /Link /A << /S /GoTo /D (Customization) >> >> endobj 1061 0 obj << /D [1059 0 R /XYZ 90 720 null] >> endobj 1062 0 obj << /D [1059 0 R /XYZ 90 720 null] >> endobj 1063 0 obj << /D [1059 0 R /XYZ 90 534.4227 null] >> endobj 677 0 obj << /D [1059 0 R /XYZ 90 454.1256 null] >> endobj 1065 0 obj << /D [1059 0 R /XYZ 90 222.8662 null] >> endobj 1066 0 obj << /D [1059 0 R /XYZ 90 164.325 null] >> endobj 1058 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1069 0 obj << /Length 2609 /Filter /FlateDecode >> stream xÚÕYÝoܸÏ_á·hHIQéS“ºw)â¦H|H‹\€ÊZî®zZÉ'ic;½ûß;$¥]ËŽ¯÷Tˆ¸Ãáp8ó›Òâ,†⬈Ï2¥¢"ɲ³jÿ,¶äŸž ; #œ³¼º|ö‡¿hq&⨈ qv¹9r¹þ¼Þ•×+ŒfŠ _…J© {¹ “$ ¾{ýö%SÆðÕtû•Ì‚/5ÓDpÃL¯qÜí÷e»fÂÛ²–í¡Ü"[’¦Y ”\}¾üë³óK¯µ–ò[çB–…ƒÉùÁD’Ei˳4O"¡MÇ»ºênÃÊ´£éqßSk¤Y¤E¦adÞ—?­dÎgÀ" ÚŽ¿ÒL;ü©<ú†gÆáÎoÆþŽ)µ‚vqú‡ª©×Îvd¢h¦yü@» ìvË+#À.îG§Ý B¡"¡ã쉧ŽeœÛSw‹‚A\–äO½­Û%Y*Tžd–o æh8 ª´ð|ÝÈãÉÀø«äÏÏ÷c,™¸7meçë ~s¶0*’Û®d1Ã+0tW«PëàߦBâÈÄÚ훃Þ` Q€…ulªÒ*9:| RÊ «½cLHpAâLõ<§U`¢-x5SÂc´®Gü²n‰ŠÑø“Ô.÷öH0´+? îºc—Í$ºÀDòÇUž€§€sÚ„X¬êÐ÷vlÄæŽM£e”&¹8¶Ì@Œ3ª]hCܑۙ«1bÓd¡ƒmžÚe(%à)•$9‹p‰¤ÿÙí¤¥*8Ô!IÛw´gMÕ†×= ¶dŸr¿WH|2ŽâÄêþc¬c¶ïÆšt[\Hªÿýý»ïÞÿéXÄ’7½Æs[\îN`ߚ݀C]ú‚-'ˆ®qö@|â\ùЇùN¬ qngëÑŠjÍ ÌÏõ—•Nƒ²1-†Êxš-“8‰rpï™Îs°(ÀÒ!€¦g)Óó…sÆ…‚p_ øƒ©Ðr¨ÔƒHF*áñ'ï Ð1yhLÈ(’`:™ÈôØtk±´Î0Ÿað‚qMuKŠÉé9¥L£¢H$øCGË¥Áó…sÆ…sJG©ŠÓI jW·Îw£)×ˉ]iA¬±|Ä„áCû(xÓ%ðö‡–íu~ñîÏ?¼=ÿ¿.äáT§é·;c|¸Žo¸Iü?wË~üì°Šiy‚«¾Waѧ‘Žuñ \-_8g\‚«Ô‘LÓbød¸*»òpU®¦1_ÍÓѹ鉟ŒóŸ®ý¥Ûl~ýmÈ\Sºí¶±B×Ô:¬Ë‘¹µÔaÞ˜ÖGµŠ`YY—\—>Ã4CÄíë;n*pú ×ÝñØ·^ôé‘ÿ´âõ!oÈÝJQÿ8kðÿðªïtCýÐr·lÞݸopõ ®¢³¿zÿîã‡ó÷¿ÉƯ̫° r¬ Û°¼zÝü; Ú` Øc±g±J»fMc˜Êx~ pnK%µ«KCg®óĵÛß_^¼]l)e”g¾õ ¿øž¼wà§Çí» ©ÇÁáòìtmä›ÝÔôxfŽ{È i‘Ÿt„ÿZò BÅ®!¼(ÛJG· ¿ð ù%ƒÒ™Jgëç°¨ˆƒ½ëÁPS¢Ôþ¶·L°…˜º°Ñ·_–½å!wÇÀ¹¨·Ð"JåúóïMs½¤%¼ˆs¯ex¤ ßOàÖó†£Òi1óðÑ~‡ñ=0³Éì”ë¤8¹¯0У(zÈŒi=¶— ʼnLE7MHŽ`árÀ)Ô¤9dhžÆ·¾Y=Œf ‰ôð 4ÙYÉž(æ4OŒL¶uTÆŽI‡K»ÒÌi}rX¼¡†6-X=%mjïúY·d-øúkø’Ÿc¸ÜéBëãù+›/) e‚\Ǽ\¯¿Ô¤V;óüÈ›rYÇÙº¼j ÞM ¹¾Ù°j|»¶iÝdíéλçk³oÀ™@„dÎ&œõì°Á ÁΉšBk€/zfä¼ìLëÞ&ÌÉÝJ²½ +¾¤_×v#HÒc½?•ÀµÈ´k«ûïªÚ×2G7r c{=¹"p7h nÝš~¬Ë_ª®ƾ¬¡þÞ´aÕuýºnËÑ ¿þŽÊ|ŽöW³1d"ð‰ ” ¯êB‰±½#.ÆŠ4l“úîzz éÚ VΆå°¦° Ù+lkÂaÓ˜5‹´ç¦$”}°îœn°å\S[× –!ÚâãƒQø ªd*sˆL… Îa`ãw‹4—LP’¢•ìÇÄ,|&AZÏ3C@W:„¶ÍDÖIãYj=z”Œ3 ¹"ÄE`)›CÚ‘¾ÌÎ[#<–„CϘªÂËî\ºÖÊ~qR!É!ËU$-”r\ä$•ªžœ¾Ýáoï‹<¨f/‡¿i|0æ´ÕV‰Š’LÉ3©‹(Ë‹îž-œñ-4Ú÷ÄÝ"P;i|ºèæ©IÃürÇÓ…A2ŽGO‘GE ip¦ÜÒçcûÆ!î‰ÃCD‹† °J |1Ì`¿SBy,G°WÿÖõû²iîð­ *1B¹€¸¶]d§/rS1@Jz:v¯€@¬=:9W”øø¬R~ýéôô ¼§yÃJ°â‡±n^ÄŒ¬?§.¤ƒ.!¶`à °üƱ³tW7`¦÷Ä϶ƒ­Ïìp!'=™µsOg˜ÉPÚýgJ úÌ­Hí.ÿ€j» 䜉Ì-éã¬YjcE”çÊe†GœA‘Òõ[daL«x£zaÇxštþh™ªÉ@ø“ÔÇœßy(¥]À/”*¹ÀMSwÈޘ転ƔÖÿ”¤2È]™Nr½-ë§°YŒ©ÎâÂØ'WÏ7ãsl¥ý›AÇip¬}7D³šƒ¡]ß1/ÕžØÏ|Ì|¯A¦ @#OØkΕüY×ýäÊ`4Ù ç¶$a†Œ›ŒEw‰’o•sHP+º¦-éi²Yyk˨^¢BÅÔ^s}1LîXÖŽ$Ô_g0§ôA“ØWླ~ Qóƒ8JÁD£øþ‘¯aåÎ mÓÜ mÓäL‚E×>Ô •G™Ì]œTˆ\ö×–ÜOÕǵmp]£.ÈŒ¥u@Ì÷Ô¤¸ßøØžØmwtÖA+Ž"ø‚ÜÕÈ»zø#þfp×ëžfo=ÚÀiÍ]èœ`;,º»Âj2¿~|éR’awAê¨Hœo!1Çœûr»õ•hW³–ÈÆÆÀ3涬FBQ‘¯³¾Ð^é‘•ãYÔzj#3‘@éÏ"hÃrt#ûLJ¤ó_R”½¡%±Î ¥l:{6^oÿƒ£š‰”Á?™ZÞÎ2;Ío¦u qY•œ0z K-ü¥_ã›þ°¸Ê> endobj 1072 0 obj << /Type /Annot /Border [0 0 0] /Rect [404.8428 586.0176 522 596.9267] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 1073 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 572.8669 226.9942 583.776] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 1075 0 obj << /Type /Annot /Border [0 0 0] /Rect [404.8428 516.9293 522 527.8384] /Subtype /Link /A << /S /GoTo /D (emodule-start) >> >> endobj 1076 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 503.7786 221.6306 514.6877] /Subtype /Link /A << /S /GoTo /D (emodule-start) >> >> endobj 1079 0 obj << /Type /Annot /Border [0 0 0] /Rect [343.4732 257.0618 518.9697 267.9708] /Subtype /Link /A << /S /GoTo /D (Mouse Motions) >> >> endobj 1070 0 obj << /D [1068 0 R /XYZ 90 720 null] >> endobj 1071 0 obj << /D [1068 0 R /XYZ 90 634.7589 null] >> endobj 1074 0 obj << /D [1068 0 R /XYZ 90 565.0646 null] >> endobj 1077 0 obj << /D [1068 0 R /XYZ 90 495.9763 null] >> endobj 1078 0 obj << /D [1068 0 R /XYZ 90 440.6448 null] >> endobj 293 0 obj << /D [1068 0 R /XYZ 90 332.1044 null] >> endobj 1067 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F54 112 0 R /F72 6 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1083 0 obj << /Length 2338 /Filter /FlateDecode >> stream xÚ•Y[oÜ6~ϯð[8Ø•V$%QÊ[;»^$iÐõ®H Tž‘Çj5Ò@âØ´ýï=R#)·EEòܾs!#/"ø'/òèÂhæ±1ëÝ«ÈMÿüJºQÁ˜ä››WÿxŸÈ …y”Ë‹›ûÉ!7›/âÝC±_IaËU E· ´Ö¼Yq‹¾ûð†gìД8†Ù²Ý­”ÏIñÄDïpÜîvE³á‰E$ÛC±E²8MZ¯~¸ù÷««›AêD©?Ò IScÅdlÂ4ŠÔEšÅ¡ÔqBêµOM°nÛnS5…-{ä=·HâöR‡2‰Ø,×öuFH3Ñ·;RÒ¢º;•nåÔÛñËÛòï®%ã¬T†ÆÁ™ön$‰ø©\Ó9n÷Sea÷“tx¦ûU{‰ÝÚŽÍ—<^Ãßvê&šˆ¾AAQ[ –¹è=;w‡ß: Ù:×u<@BûP= Jѹù§ý>’1]nþ+:]aGÑVš»œX¡4ö'Õ\P•ÖiŒ¶'ƒó™¯Ø•]¾Á™Çª$!X§âv¦qŽž!$eš3äñ}”D‡*ص¶jÆë,÷¶J¹œÀ8‘ý¡À‘wä¤ÒÉCS뢮Éz:ÊŒyÖ‰ mÔ¢@Ëã jV*BìÖ•¶Üð&ûPX=!Ô tÙh0taÓé‹í¶j¶ž¾œZ:%iwí¡GnR‰®Ú>àQÿð¡2“¡_ÛNN)꺜 5‚•ÝøÅ‘Òâ) =‰Hfq1eUÙÞQ±8çœ º…Yy¯þÍÑ$“2ÊQüÑ•à0•\¾¥ÎÉÇ>BçÅFpèãQÊ¿m8ŒM*>(ó‘gï<Ø!%‰¯ñ_! ¤'&gHq3‡š§(šyHr?pví  K>›,›|) ²Ðd&?ë¶éÁçä“CAêÆ`>>jÍqK•£“v€@¬¶Å•‰Àq) ]›LÓFâ>E¥Æ¿)`$ÕÛ §^RtVQh’4ë‚[jVåóÛOW>½ýxŪüÒ6¿¶÷÷¿ñâ—ÛëO—ßÞþpN½Åq‰™Ycæ_Tµm^ÛÓWå¼ÁâK>0…n+†—>ºÊ.Àèâ²C4k—qÓžrlYƒ™L’qÝ-z·Xñ4Ü"Vڎ̶Á9Cñ…œüKˆi Éö.¯bðîÐQpbJZŠ2¥ÒAàó*‹…³9l¾Z,½&Užù-÷Þ8ƒçQŒÏC§ŠÖ·CãAY?Õw›Zì)"O!F›­«™µË³2¯‡:™»s G{¸¤Á5§ÓEdÌ qK ‚ÓöŸuÁU¯ÃJ9Ifœ°. +à¼EikJç@@%@æ&žMý¡Ö’í]¿>ïó<>}MÄÀiµ«™~\{ޏ‘!î»j0[ÞY>W½#*ŸEáƒËIwjE8PçJïŠSµ„ÌŠ| óϧbHä=‹ØÙÊü?„q~C šé ž^žÌâTà~€ÊÙóâ¡>N]ñS:Ó3Ì“x]IeÉ.Jö 2ƒ´)ï‹Êo±`eÆ×ÿyÞ4zeé«'r#N ± ½N®´ö± z.§d˜fÃq¶uØœŸ¥Uhbé«Å$t9:«4m\žìƒV.#°@³EÇ–r=¢ÑâúÞ¥˜L†±ÉK%7ƒt-â¢ÏQâ–ŠñÆ·$8UõüÛ~_—¢k`­X,¾Pÿ4øØ¡í+â¶lúX§Cq­ îÙàd 4ân)WkWù€wàk¯Ôp¹òâcX‰v±« €Ê¤Ñ¬·ýeI:ÀE–øîŠ}ÖjI8Áæ‘xÞUèxæÑq˜;âÜ’•(*÷ˆúm±:Û;Ê t$'j#syr-Œg€{íH†‹ÜCmùœ‰J`ìT&dìoñ¬úèPeb¸£Ê|j6§:‚šÒ ŽÃÔã*I`ÏœàŸ¹KÖöPỖ&N=Â&\¹TÐÎÄ[>p?dÉ~\±i/ààÆåno}†…m·UÃ)Û·Û”8€ ¡µÜquüºã• lyrAÁ¦†ÖaÔ…M8Æ¡ŠUü ¦:õqR¸nÚåun¤©¥òµ X7{aGÊ)ˆ+êë*zÊXnee"@,û^VéeÍ©—FJlhÁcEÎ|Zéá*ýRƒ;5÷æ>À„]º—›ÿ]_Ý^}÷—ÚØÿòý/¥ Aƒò™o<4[ÜÕåR·—õ+Ê|öB¾Øå}w&}¥‰özý2”œqÊfãz1Fוiƒ‡I>¤ÁÏ—@÷~‰ŸÑÌ Zà=Ë.g§A†öžO×Òk8î8PÒ‡µ§‡²áèVr6ɹ¢‘ˆÏÅLeþšõ±h¾A/~¾|Î_i¦:ñ ¿fpî|Ps&†´tj§bW•—êrmýà 4d§ÃàÇåh’!¹ÿ«¬÷g žŸ°ð:˜‰H•É`åX.u"Q%zö:ƒøfÛk•…I¦äôùbŒý0 _2¤ŒåÂíŸù½ ›íDiÑ”cÀÐ:Ÿ}V],½á$&vÜànÿL‡ãSÆß•〽.þRzJT<‚üEàE@ì®›dæ~xqË\™³Ó{LÓ=/‹ÎY[JÊ<nk—ï9u,¦44p¹w¤ÜØ>V$R3rµe†PÏQp§}W{ó²Œ1ू> endobj 1084 0 obj << /D [1082 0 R /XYZ 90 720 null] >> endobj 208 0 obj << /D [1082 0 R /XYZ 90 581.9363 null] >> endobj 1085 0 obj << /D [1082 0 R /XYZ 90 249.1662 null] >> endobj 1086 0 obj << /D [1082 0 R /XYZ 90 139.0839 null] >> endobj 1081 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F55 36 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1089 0 obj << /Length 2701 /Filter /FlateDecode >> stream xÚ­YKsÜ6¾ûWÌiÅ©2¹¾’“Ö”¶ü8D)WŠrFLfÈ)’òX^íß~Cj¨ÈJ¶\Ö€`èn|h|ÝT‹þ©E.Ò( r“¦‹ÕîE(ݼPÒòA‹üëòÅ?߯j¡Â sµ¸\O&¹,¯¼W7Å~©¼¡ZúÊë–~E^úÃÒ7Æx?½z÷÷ 7 Saz«v·Ô©÷¥æ>åXè¶ÛÝ®hJîxW4 ²¹-6(f’$õTd–Ÿ/ÿýâÍ¥Ó:Öú)»Pä)ÔIƒ$ õ"ÉLËÄd^WmŠ®-¶¤i߃eÚxí#¯¤cXêÌ»Û/}0Œ$ƒ¥ŸªØ»X£º°–ž¬¥Mª(íp‘¦¡©B*0±1"ó]š8G*¯a .^³×¼ôŠ}ÈÊŠj2Ûôúž»®jPågiax{¿óxÛ¹æA¸Oóv‚Ö _EI ’4ÇV âqñk‡Üi?ŠS¯EdÀ4}±°@ĸ*V‘wyƒ‰¯¬Öê¸ø¹îg}˜˜@ëÔúð®êg˜*S‰ÑJÚ»ÄåÑ+03©·Ô‘fˆ·’WÝd*?t0»xÎiÕðoÁ?+”¾aÀZÇd°ƒ¨ÇÄ1èU÷®ê¶±mphæ•vo{>)×è!Z¸’a EÇ ñna× ÏÕÖäå*`¤àµ(Á!è?”ûZYiÒ) p„¦¿*¿9x*‰¼ÛÌŒh ˜±£¿ý0·9t„ >Éöãà¡êpiˆ}¯>¾þá5ÛwUt›þ3BÿÏmŸÓvìÁ_t» ÷ÅÄ9€¼âFõkÈ¡g eø…ý™=ŽaEö¤9¥çôAf"¹j 5°èÄû©•¸æïí#ËÝPýHÏk6J𓪠‰M6µ¾.€0À˜ÕV°ÑŽbnËða»Õ,œêfžVåAftºˆ³ É FNp½EW'çgBìé„hÐÏÕêxÒ@ÃŽsû éáóKÁ«‡n4O©ì¡ ÆäAÁ†5›¹ œÜS&˜8 t’ª© 0wð¢DF>~ò þ åäAŒ…ƒW|ô¾÷Èía@%îêÀ¸ÚÿV7¿õÕªmJ>lß}ÐÎ÷èßí‚PYHˆ¡§#Ýj²-;¹Rˆ(b#¶['qÉ7QèýÒãÙHx¨'okµ—É×ò‹7Ï™ˆ¡.‡ÝÝ…BD°K´Í7‡•öG:Gáƒø{¼B»CÝ vDWz‹N^Ъ-_xm7Ô´ÆÃ£F³m‰MÎWW9I±ñ¯e‚†š…†_vÆèó0‚£,ï:ï_ØüÿM”ŽAO³ ‘P– p@ŒS+¾æ®¶YUØÊܽõå}IlQq`16*à·¢S]Í2‰HgAœi%QÝz`ÎbßÉNlîÉt–EÀ,lbP†`ƒ0¾á¼‰498ˆd6¾¿í-@© @Å%¿v~#_A eëYª©‘Öf:ùãL˜<µn¨E…âÚ¡Ú:è¶úŽŽÛ#q"fšæùSàÖ îCMx(Ûç@úPÀ4ºøðúã§gÁ÷çýˆHƒKR@‡^7íÐÕèŽÛbô®É™ì9ÈAÁ"tÑžƒ «ö’;«`#‘Ðòkì%G×ßd.šœ¿3·W¯ïq%¦‘‚õ³ÐÞ¾Ú®ïm·-ïo›úKÕõÕ=d Uò6mÿ^\‹1˜’”œ¯¬ºšŠ¤ÇtHÔF²)úÝÔŒyD Is†–IÄ[˜ÈÚIE|ù®°U|ÚSÅ¡ ]¹Ê,¾á*U;…ÖŒ·V"B¥ÏºáœRE^×ó|X×Sšé6¸Ô‡ËuwÜóþÁ­²’±¸Ãê0øœ—ßb§ôüŽØ§j‘•ŒÕIy±J8ßa2˜0áÏÙ^äCʤ ‹ýˆ¾°Ç(ɈR%ÕK©¥²I8²ÁS{Ç5;,ÉIÛ’mˆU~T^ŸTUiÙž_Zgy*HycŠr¸™arÉ„Éé4ó>-3c@†¦Š…À¨c£{Á_Gu8§†ñS íÔ…LhR sSó„^.1 >êá-†úÈCžeµ½—4qð'Œù4l[ÎîÔ ^¤ô‰§‘›¯ÝgÉÒ­ivµ•„E(–Š“J›˜ÛÄ]ŽøÙ1ñwÖaÞV’RQ1#ôNõÒÁ˜/åsps;ÝV QÒå2“<ˆ“,ŠëÏÖ®Ã@é|œát¯2æßLŒqðÍJJÆÈ,¦¢r12¸«Xè`/€z0Ú`:…ÜhsX9f;î^SUD7\ƒ¤<ŸØUšÏO³G2¸—Ï Fº¯FgØgN‹ðxW#öèÄ`î[%‚LZ¹§Ô>p’py„ãiHât])"ø»[à!äƒS#B9´Â{û‚ þéëf³•®ºä¡m7aÆ1ú*áj¬}ýÍÑQ·­ù~WüŒg”pO×z "ÐñÇÒ~9¬2Á\ `7álè„\ ?õ†£ôóä«@Y‡öû!Ýø²é›$BÖ«tj¦°/Û²Zízý'¤P§®œXlüÚã endstream endobj 1088 0 obj << /Type /Page /Contents 1089 0 R /Resources 1087 0 R /MediaBox [0 0 612 792] /Parent 1080 0 R /Annots [ 1092 0 R 1095 0 R 1096 0 R 1097 0 R 1099 0 R ] >> endobj 1092 0 obj << /Type /Annot /Border [0 0 0] /Rect [289.8427 585.9321 449.6308 596.8412] /Subtype /Link /A << /S /GoTo /D (interest) >> >> endobj 1095 0 obj << /Type /Annot /Border [0 0 0] /Rect [288.425 365.2603 442.3354 376.1694] /Subtype /Link /A << /S /GoTo /D (camera) >> >> endobj 1096 0 obj << /Type /Annot /Border [0 0 0] /Rect [457.0714 365.2603 522 376.1694] /Subtype /Link /A << /S /GoTo /D (new-camera) >> >> endobj 1097 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 352.1096 258.5397 363.0187] /Subtype /Link /A << /S /GoTo /D (new-camera) >> >> endobj 1099 0 obj << /Type /Annot /Border [0 0 0] /Rect [341.2065 106.1215 511.5097 117.0306] /Subtype /Link /A << /S /GoTo /D (command) >> >> endobj 1090 0 obj << /D [1088 0 R /XYZ 90 720 null] >> endobj 1091 0 obj << /D [1088 0 R /XYZ 90 647.8526 null] >> endobj 1093 0 obj << /D [1088 0 R /XYZ 90 578.0729 null] >> endobj 1094 0 obj << /D [1088 0 R /XYZ 90 509.5052 null] >> endobj 1098 0 obj << /D [1088 0 R /XYZ 90 344.2504 null] >> endobj 736 0 obj << /D [1088 0 R /XYZ 90 275.6827 null] >> endobj 1087 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1102 0 obj << /Length 2136 /Filter /FlateDecode >> stream xÚ­X[oÛ¸~ï¯p*Ô^Ýeõ-Mnvã¸H ìg÷A¶d[­,”Ü6çןùfHIv”îÉvaÀ$‡ÃáÜøq(禟sÛ‘çMb?Š.ÖûW¶&~åèÞ˜8Æ}–wËW?]Î…cOb;v.–›!Ëô?ÖÕ.9Œ«ÉFcÇR£±çyVôv4ö}ßúpuûV(ÍŽx2ô‰šUû‘Y_r¡9ÖWaºB¿Úï“2ÂmRËö˜lÁæ‡ad9^0úsù˫ٲÕ:pÝ¿² ,O ‹Ü Ç›Ød™6,œúÇó6,š@—ÿÿÁh„žõUa7øÏÆë í~Ï£rä‘+jhH~sû~#Ϻö$Œ<—¥ÿaöW•7°ßg%-b“¯ongw—ó™vÕl1¿y/3o®~ýx¹ü™V:zƒ“ÀÑ$´m²“lr[¢Ã[P0ÏZ,>ÜJïj1Ÿ“_gwKW+2,°>ekMüÀ·Rš–}ˆ •0Üå™JÔzäN­þ…œ4'Ë|«0þ®¬ÐÛn`ÓרdŠOæ Ã¹òÏ:h‡öâASI«]‹&By þa4Æ^lÄüa;þ:)ŠÇÑÔ·Þ@ƒ);bFswËYÈšS[d¢)BBÀé®Ð¸¤ØØ‹öt}·klÚÈ‚-‡Žºœñ¢VQÈÜ>iØÐÌröêg™$³á•Z¶¯6ÂÓyÊ£è䨽°·ªº'ªzOT¥¨{F¹å\ëëÎÄKezRš¼äx°Së˜fµÐé˜rôLÿ2 B+)Ž8û±èîÅä DÀžZ|ÀS¡%EÍ GZ&/3RŒ^õ©4‰uUׯ««Bï·ÁÕtÉ6$Í×}aày“¿ù„F”˶•üº®µÜi™mlNÌ ÙÜ6A=ÊqPfç†5)Í6ûáGe4;œ8¾3¥mXz¾þñ··%õõÙÇaµRdêYÈ©:R5œåúLPÛžN8½Ð;¸o´šy¹VÙž‰fõ÷Ù]êØz7S ;  húÑaFN}Õ&vZ„-²mëF6Ç©¤¿/yŠ5œÄÜ]Xz¥ÅgfY‹Jž¥2¿Ò ªá¸b¦VìSÉðk€O,Èî ÒVäÊ8ÃW7 ä8`缦ö¿,QU,Ž’·ÍCP·¯ŒEg¶Úm¥ÐÐÎLÈËN¥ªTÚG;?Ð  ®çæšÁ ‰x”9ö(:§= q– ÇF1†n…"çÖ\Ö¦À ²Z'ëHû,) :…œªµ@NV®‹ªî`20aÜ!i–ÔŒaQÝE±» Gc^pWqAä’Ï|ãӀŬrŽb¢Pȸ¾•&M"½uRJ§* =I§ˆlÕ²IÝæ&›UÇíÎŒõ]M¼º#j‘¯Ø=œ:æ.bm _fE1¦R&ÈÒ-çxäCÑQ€ô¡Áœk;Lž×vÈ»)R!×esñ$LÄ 5 ò’¦I„ÓlÇHJ3ÕÉ­ÊŠhœPýL kR„€Éi g Ý¥&qàF#¬Hj™J%Äk•k…S¡'2¬NsøIçm¡bJe,0÷ef°©|h¨ýŽQ()‹~IòukçCÄ®.©^î?â±´k-I6'ï'ºg^ÿëµtªR³È°È[üÐ7Ÿ\bÊ·e¥úõ&i¹ÞÜu'…‰í5Jy\AÚ†Ó$%ǯin›;$¶j䩲’A*kŽýºGŸÊóç׸}¿¸þÄvÿ™GX8ôÛ‘6w_ôôâeZÍ÷³ë›ßåÙÕ„yÖÏ—wïog/zvý†G¶€'IxNnÇ~r˜È0ÛÃmÜSmŽ8úúAg›K.•2dã…l‡ÞªÒŠ'E¢çO|/t•ñô™CfÅô„w"›-ùþÐ&!ií=ÑàWZ©\Ћ.)oxvpê]üŒz—wšéÿ¦Ò_róÖ%—74‘f+øj»å«”£¹Môç¾cå™÷C‰ %Z};¨嘬xÛÈ}\¼ûevµüû©86©y'ÉACìôâM„ðF{W¼Ö†a ÄåÎ\Â$÷¹ø§@t¤.Œ‘y¡ÆYð¾Úú<¦ÞÅt*1ý¶‘Z›ØÿŸÁü¶áç5´’2¾µ¼¿¼{¸^ÜÏ_¿«ª\'ϸ‹×¼HƒwpãÜc~Žb î¾4;©•å» u†ŠkfPŒÇ|*z_ùt U’& <} ?!ÏÖË=mïçú_%íS|cŸÁI?»x vô?Æãå%A”ÿ@$/ÆôB§*B? ¸1¯̰šr>¯Ê·£qèøà~šN|îW߉ÎÂOò$xØr(ü`è…> endobj 1103 0 obj << /D [1101 0 R /XYZ 90 720 null] >> endobj 1104 0 obj << /D [1101 0 R /XYZ 90 720 null] >> endobj 1105 0 obj << /D [1101 0 R /XYZ 90 440.9436 null] >> endobj 1106 0 obj << /D [1101 0 R /XYZ 90 367.8364 null] >> endobj 1107 0 obj << /D [1101 0 R /XYZ 90 296.8504 null] >> endobj 1108 0 obj << /D [1101 0 R /XYZ 90 225.2583 null] >> endobj 1109 0 obj << /D [1101 0 R /XYZ 90 141.1216 null] >> endobj 1100 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1112 0 obj << /Length 378 /Filter /FlateDecode >> stream xÚ…QÑn‚0}ç+xl“Ñõ¶@Å7Çæ²Åe‰áis8QÉŒ¢F¿~·½¸iö°”rîéáœSð%>à'Ò7Z‹$4Æÿ¬<ÙÁ_t»Á%å.ón‡ø E"ð³ù•H6{gé2_s`mÁ`h­™éó Cö˜Žú„´KävhÑT\¶/ v Rj÷MUåõŒ€Q^#e±Ë–Ʊa cþ‘={ÙëH©ÿrYÊß`Fù …Äd]°¸ Ðaä‚aí(·BäVD±f§Ý)4j`=ê²,PI+EíLd$O R)àà%xº§†ƒ4{ã:™«–##b)Ñ4„H’ØþXõ˜SÙ©ÝÐ6Úc»•½‰rm_Dz^àH&¬l·Ä™HÏ•¯f4læôÞ—ÅXS«t$tÈ€ ,’föØ+ž "Ú¡²CÃl·ËfÇå§Îqa#Új.ÓäÔÉš2m˶ÜsÇupíò¸TÆFœ/þM£l endstream endobj 1111 0 obj << /Type /Page /Contents 1112 0 R /Resources 1110 0 R /MediaBox [0 0 612 792] /Parent 1080 0 R >> endobj 1113 0 obj << /D [1111 0 R /XYZ 90 720 null] >> endobj 1114 0 obj << /D [1111 0 R /XYZ 90 720 null] >> endobj 1110 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1117 0 obj << /Length 2629 /Filter /FlateDecode >> stream xÚYI㸾÷¯¨[d ¬wjŽét̺ ˜ •­*kÚ¶ IîBæ¯ç-¤›î®ø`‰|$ßò½E⮀Ÿ¸+‹;§T^jçî6‡wEþòN„§5P¬ç$}x÷þïF܉"/‹RÜ=<-6yØþ’}ØU§•ȆzµY·Z+¥2ÿÃj­µÎþÙaj3áá¼Ù7[ø'ÒêÈ´?Ö톦^Wk)ÊÂeB¹Õ¯ÿx÷ñaäÎHù=þ‘äúNÞ —Kat¸€õ:Jº€_­•À+\DV€Qxi¶51é 1VtOä¼Pú¼€óisZ(]öµ‰Ë_`G¡²þŒR;Áu}Öâ͇ž'v+yÅ —™Šì‘鈫 ÓUÇ->ȬG"ÜlWwͦÚóô3 õн2]xA~ê} ‹£iýÀ²gzáF^g9¨VùìaWãõñ¾BåÂ|ßa‡Ò¡%5ë÷ñŒ—Ú#¤tV ‘CÒ¼›"W²(Ãà ΕÙV^eíQÏdtz õ‘Á¡im'íÁóæÜê*цpÙ¨—më=½4ÃŽŸn»„T27Æšè-J wHiŒÏªx‹Gä£En_È`"–#†·ÇïëïDiÃ^*BJÒX•:z­J“D¸ûÂ1Á œŠ°„nàÐ (\D"ÄU¸Z¿¬Øð»Š wUœ&‚+â Ý1DžK9#A_èðì£BCÑÑA9Z î­Ä‹mýT‘ÓßÓþSÙxº¤!ÐÚÉq¸?UvTžòà•2×Þ»·z—Ÿ,Ô(|7«p‚Ê6-ÀVˆäÓÇí49´3&‹ áÂÜãg ™7cšÔœ£4KÍ6(oƒ„»›õa·ðãWµ™VˆZx™Å–-뜤¡3M׿Ý:" 9½PlAv:ÚšŽBûïÕÐpœš30ÊÇ`8KXQÐò‡~4ä§Û¶„`/•Í>"¼nâ‚vàÄ•hvQyÏÌÂÚ.6)ÕNðùÐöANxø™ï€¢;§¡C°ïzî Éy.mã>„sÚÑÂ/¨Âº ëšÃi_"zЏô¶ QRËÜJ!—EaZ‹2$Kc"Uw!“Øc–¤e1Z>÷§˜Ha®Ä“^.ú ¯ßü‚ë«Ó,–™ tü§ÔŠ‚Ç^Ђ]mR-Ž\[=8`!E‹Ø'ÃíEæõæiDî­v3;PÞLVîÉyj­’Pädîä0ß2¹2—S¬äL7~Äx÷ÊÏ„¤xMšÓÙ¶éOûŠ4{Åœa‡oÂ6s•Ö该»î%”ÞŽIÇ÷ÂD!¹1`þ WÐ Œ¡ÊÈgŸ1ë¹%sXÈ>Òz5Y|ëÆ8(ë‡e'.oá)‘"IuìŸbÆ<¯s»XÔB@¾êË¥f×,£qr!£ï«]AA)´¿Rû=ûΘϧjðÿ3 ý¾2ðÔ>6çàt…¸u9œ¢ËÝŽ—âe†ûV0¹c޾Ȭ-¾ŸÂa’°úÇWŠxQó=CýZ{zUª[­_h&Y2#ˆº\SgŽ!§o¶pç¦û[·À"åì*‡ZÂþ _/|ûz·²>xô^½U' B[\Û•‚³ÞÈ:Ðáº[sCµ ÕmWM!'âT$¢vuÞÔ[uS7 l¸ )"µMÀ|¤·`‚ÜHµÿ-„ÂG3OÉü¯õzP¾Ô–€sϽNù-ZåKGþ7zAM‘}>í¸ó“Ô˜¥@cåÀ¹jÂÿí `m^ºÒ¼µÏ„½¡mªïÚK’½ì›×µ&7r:ôÏU KD‚<&´]ö¯Ï#ÀnTr÷wû\}Ø©Ý;¶bÇ@ÞЇJ1 éªc ZZR…/+”,0¼S>P}‰Y2eQ>ÞkÏL·_øusP¥½õàD§dêÝÀAi¼kb7[9Å0Æ­ÃØFª™v{U®¼qé¾!»6#9?õ¥Æ•õÎoȰâ3uËE$*Q! ¯‡õ†t _wõSs¬Ózë²øñÃOŒN[ áœÛªŸ§ÆýÅg.QP5;}§ È4~Å‚Ašœ}é©ÖYâkÝåfÈÕçz3°ø€3—K¨ò¿ü2Ug”äÌÊ5Õhш|õ¯÷¼æT=‡/=B^}²Ó 류Ý%ñÕn¤úö].7ãî&¿ÂçNy¹ 7åäFøÌv±,Ö)k¹ Rü¼£R%ÕYRð”(ýÐ[€Ì˜yêÔóÃÛ,„ÀØÿR(Áo·¶ÕP½Ç¯:ïw¯'à‚HX €€kÒ²¿Ì˜$ç‰Var¥¬Kt5ºš.2´-ŠPn±Ü†ä÷LœHmQ ±ÂÊ짆zbQâ/ ¢¡TÓî)_‡=a¿ÀORb ‚¼0Ò]I¬?ÅO¢)ÉxáFy±x¤ÏK[^ˆÜ€z“U3¦ºú¶Ŧ ZÒ”k%¾Ò*•2"%#Zäß\x¢gý‘žÇ_ endstream endobj 1116 0 obj << /Type /Page /Contents 1117 0 R /Resources 1115 0 R /MediaBox [0 0 612 792] /Parent 1080 0 R /Annots [ 1119 0 R ] >> endobj 1119 0 obj << /Type /Annot /Border [0 0 0] /Rect [190.2274 306.6128 413.6821 317.5218] /Subtype /Link /A << /S /GoTo /D (set-conformal-refine) >> >> endobj 1118 0 obj << /D [1116 0 R /XYZ 90 720 null] >> endobj 232 0 obj << /D [1116 0 R /XYZ 90 720 null] >> endobj 1115 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F54 112 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1122 0 obj << /Length 2511 /Filter /FlateDecode >> stream xÚÅY[oÛÈ~ϯðKQ 5YÎC.Ò—lZ#‹,RÄ.‚Âk ŒDKÜ¥D—¤Öë.úß{n¤Hyœ¦}haÀÏ\Îí;©‹þÔE‘^xc’Âz±Þ¿Jeú§WJF1PÄs’77¯~ÿ'§.Tši¡.nî›Üln£owåÃJECµŠUÔ­bcLT|³Š­µÑ÷åŸvÕ¿•C /k2ÙUGKwõºÇ Õ|êèŠ6k÷+G?×Õ#me÷ÕaËä@§À2•â'eòÕÝÍw¯þx3ñä´þw\#És¶½¾P>ÑÊÙ‘íÔ$if±]¬b—iäÙ›¸CμΈ͇Mö<‰ãƒ|ÇÏU û•QÑÏ0`6áÎvÈÅ…*“ys«<)tAç"óÌ9² Tçú‰§UÚÁ¤,»ªPš¤9JOsšõÑîiªç©G#ݰã‰~¢1ÎDß·“Rñê“Rø¡\£Ú~Z¹,*·§} nG ˆ¬¡/òò„+Ú#¿WŠO”ó–ïAãÀÍ[þŠ–QyL2ƒV&Q.ek}hð(‰' Ï Rà(’=(‘4X¤Ñ- 8±×'«8SæÅx(>KÞWäJBªºu]6<’ZÀ-„†å}@&ñºeWñþýSϾ¶_ò—%I…d_7åç†oŠÞs ÔèåÓ*jh®”¹¬+ú_vt'8y½d‚w‡ñ¢ ›§‡±p¾K|ª4³«:9öñ‰–}ø'Dl H%7òvuÏGÅE–¬Æ³¥P#YýדּìÜ2çp£3GÛã󱫰p‘|ÜŽX4.êy¾ýŒŽý8ª|=,7“å?¤ÊI#›"éÌF>\Áì{¦¹o»})ËËð)˜€ÃïÞðbT<‘&“†g\ë9×(µ°kƒøÊQ¬»JäZÝ—èMÍ ïuÿÐÅ<ñŸ,«›†æ-oóÜ#ø{{PrGÙ”1ܼ¬ æjRhžh§ØxÿºÊ Á€µ ôÀƒ²é[‘ek3ähDœ'ÈñäôB$«z6ò ø'[|ÅpÑvš¾>pHûHç®ú!u)¨ŠÍvr‘î熜‰U}MÖ±FíY°ƒãÉDø°ž:ŒMÖ7¬·^ U»èÇj=È Á—E›S6äÄh™º Œ†÷‡5‹‹LN$t¥þòeÞáXÄ ,Ö8º·5'Ö~¬É¢}5ìÐÃrôžÉA£ÛfR&|ºò0F‰†ƒñaË[s€Y íBxê åoÀÍ{^v/{[DWãí‚!E¼B¸xŸu Ÿ›z¼Ù€z¯?§liƒ€‹5ÉÃåd|®8»3Lœ8O>‚q¢ vrNK².N ;9Û^Ðéå¡o`ßö@vçZGo*ൠŒMKö·e®NYA%AfG8-S~&•µsgCè8Åw ¢À}ì'¸è‡ jÈj­@"‘pƒ™™MŒÍ4&³š>R&(õ–887·InóÑ`cТB†ÊÕ£FËÒr’³œùfGðšÚ QšÓ­1^µ'ÂŽ!½žÒÙD¬<äo`Y1!&©T¬…„è8.Ìä>sxb/‰ HMîPòƒÒÔô<×IݤãyOwoYPèg>+ôÒ2Yu‚1%Júã͘öwͼû¤*ÙÏKZ¯ÍþàüTz «@VË.»AÊ"Ïð)™W>Œ™»WŠáy^ËßCôêBÉËb®z.Yž˜ò¼B/óaúØ>'âL{/o“O™•ÐÅT$ÑT$âVHM…¡ì=‰ÀåÙ©‹ž-ŲC“îçÚ|…ÆíRD3‹œRå!éXǸÅ!aˆV‰³¶øjh5_‚ÖØ*¨£ÜòÂ×\ž€|2È)Gá}$s~©Müð‘$© NKUö•Xè…Ð ñè`µŠJ¹JÉ-ÒÑè = ß„ešÃI å…æItàvÄÀ¢0fÆÊ6ºÆBöód\?VTr€_zÈMŽ=¡¤Ï©â žžíÿwvé°öj<·«¸Íµ–¤”nü2TÇFaŒóÿ¡³$3ÎË‘çtÖ x©ËeÅGöÞ),ŠY-Ð&™V_M‘Ø|qæ]çPIhõ_{ðïÿŸdÅP!dÙyJ}‚“;ÉC`@±2?ëràD ÛÒ‚œ´Yñ•8`!¼7ωà¤@tà¥\¥”+2‡p`y+HÙ¡JpÏõ²¸Žv‰u6[&K:¡n*΀têGé<ç~(˜kjåÂý ¥¥ÒiÕcëkZn" Fg|Ná_¤‡Ã/ì ¸=õ °Ãã €j&Ù„Úxf9]+„°Èÿ¼aŽJ<µݘpÍÕQs&¿ÐdÅÏÏ#‰tÿÇÆ;u‘¥ŸÏéS§2•çkJEªj)Ì:n£@p 'BUÒÔY’ë3ò?7í`ÞÞ^ׇÛ_xæw"˜yº»†~ýå2Ö—úŸ—¿>ñàn¹?7T>‡gÄWžyÑtë ò÷çÅÑØ?ýR4ýB± ÿb9ë‰ÂÜ”œâ€Üû£Û mÌ~ÿB»ygùÔõŸ4ÿãgTg endstream endobj 1121 0 obj << /Type /Page /Contents 1122 0 R /Resources 1120 0 R /MediaBox [0 0 612 792] /Parent 1126 0 R >> endobj 1123 0 obj << /D [1121 0 R /XYZ 90 720 null] >> endobj 1124 0 obj << /D [1121 0 R /XYZ 90 720 null] >> endobj 1125 0 obj << /D [1121 0 R /XYZ 90 485.0718 null] >> endobj 1120 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R /F67 85 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1129 0 obj << /Length 1957 /Filter /FlateDecode >> stream xÚXëoÛ6ÿÞ¿"(TÞ,N|èUdÖv 2dÈÐd/ÅE¶µÊ’!+/Èÿ¾;%KŠÜ¤…>H$Ç»ß=)~àÁÃbï ”’Å* ’Õ+ÏN~Åí— n—äÝÅ«~ñù÷XìÅüàbÞcrq=sÞ/õzÂ:¸Ü©&®”Ò‰ßN\¥”ó›®ai™®pM× óIdǕٺ̒ N('+ð-œcì\MDäÜfé­––ûÇ´¸†mö@§À6îá—ñäòâ×W?_´:ùB<§5’Œ¨-ºjs±0Žýƒ RŒKååOŠ™¼œßyû#½ÿ¬²:=;;>½^ézÉÊr‘¿žÒÚ¡¸DñàTWLz\.g7õ6.‚ƒÈÈ.îšÁV—'.ÈËÌ@9ˆP¶Yç1ÜÚÉ&Ëz™á{±›2HCçꦦ;ÔÃî«—)}ü "ÆÜÿ±’õÂc’h‰"µ Œiásæ+[Ò7 ÜÆ¿&Xû†ÎHtA%ªrG³9j¢¯ñ&è^£"‚®"vêÒàîŠP0E! &÷=Bí8EW ÁÕº`(ß) zkÃdKƒ„|s}Óñzî è‘çü”÷f ]§ùvIgŠ›Cà:Õ“¶üo6(­ H“tÕÈc!xŒ… E6‘1ªŠ™KeRšè[éÑ‚ ,Ì¡œ®5ŠY[1Ö„’”º”ì£dƒ–Ô_·¢™rnùAo¸sX¨P ÜeFI u¹?E°qFœ‚ÐDOÏì ç?q!œ­ØEô#>¸ïKÃ)f(­tþØ f8Q`x… н¤çÜ6‹—0D9Zéw‡ÙÈý߆J9Ìî¹¾Ékâ ?Ðv³@á.9ØeÄ+3."a3˜JÄÜÁ ¬tÿÏdZØùÑØ|àÀåÀ Ùj4¶CáÖ8ìäê9ºBÓÅS 3ǬŽ+£Þƒè¯Hp¯Ð±ÒÕ$¾ç\#ïµ# xj´¥¹µñ¿E¥W4nÏøŒÃs!˜Œ¥ê;ü¢Wžet΂,öZ6C†;1tйÀ`/‰(§ _:9¦€ÈwÈæuL‰-eW ²™Å„ê˜ó‡ó8T(BôèȆÝ­{”ò›dP—ûŧÐ÷ûH€³T©ž×i…:xó#ÓphkieÀõw©NÄjÄ,Ê8/"Î&%$Æ'Jc(Å"¡«ÌïyY“‡JË2 o€k0ãʽßT©óe9šKÁ1b/j¨¬öˆ^J°‘4kžÓ„É­)™@…ÞAÞÔÆ˜ÃNÈÊ—JØpƒŒ+÷Sà)xšñNH;"ãÁ è }cìÓlµÎ³$«ÑŽhBHxÆÃMzÂÑè©Ø.yQ“2°1?RB¦ ¤è©-ç;Ä Íó)怀à-‰dçf0 ÒQÐÀTUܽ¿ªr¨t‘‚—TÕˆQ#ÞžuXG %ú–n[ÂQ¨}æ¢Á–Aì´ î&iz‰¬M€ÜÁ´Dަ)Óµvëy¯#Jk¨¶ó¢Qkñ€3ñoqL€*î4opìuIécÙ䀸9;¼)jÖº2=?ß6¸÷Ú&X¹Çõ âA¾ÐõäN‘1ÓJÁ„ôT?î©uÀ·i3ºòõ æÑ‡)Aøq~|B'´î#<Þ—ëm•-–5‘ñ8ŠÜ˜Û»F™ÏMUÃÁÇt“ê*YÚ»ÆI‘PÂðYfê3u]Û'Ò{a[eEVg:ÏþK¯mkä’VÔJɦûâƒNêè¨ï8Ãî ¶ˆÁÊå³ûO‚ÆßÓkûIXuîí‡Û̈ÇfiûtiÐõɶëìžßTs¤Mó÷¢ËVÔ»lIsɰX~6ŽmÓøÂv4¹»í‡5F¡uÜ]5iŸ.Z²_ÍåBÝ÷S“êî¹,¥½@׿*ò³7ÄÃýwÛž% íÇãwï˼¬fÞô~º½|ܙǛòŽEpôòËî·!¡J¡ýMÒ¦]–²ASQ˜ÞfåÍêneíCÜäžÄ¢|Õ¹ë´*†»Ã|%þjßÍåáPLå~ ‡ž€8Ýîã×¢‹5ôÉÿœ´å’Ÿ)¸(,ÞlÌjAÆÁ›²ð°Nȶnë|SuÒTï¥îV5\2W£²"óP]oˆËb7ÛïÎ`âIè˜ë±d«i­˜™ã On~àBZË züE°íJïH5TK8Ck®aPøìdRRhWen%èn3eg;]¼=ëª#™õö]Ù7ºím†d0 ù‚fÈmi{ðõÿ5@”Ü™„´¤¦€AY4;¥…ó4þµnš> Ý…Ë6ü-"˜åί»–ÎíŽü¶|ÊдýiRg¥ý·cú˜ŒØ-\Z ׿ZŒÒs e•aÌb¼–tEùÍØÒ='ëS†(ëx[v†+ù 2ýinÌl¾h39‡dí]ÚlqšéìÁ’ˆ)<Ó>…ç‘&/Û÷žûÜ•‘v Ø—_¯¶9HÔþ@õ/ôÿ›Ÿ–` endstream endobj 1128 0 obj << /Type /Page /Contents 1129 0 R /Resources 1127 0 R /MediaBox [0 0 612 792] /Parent 1126 0 R /Annots [ 1132 0 R ] >> endobj 1132 0 obj << /Type /Annot /Border [0 0 0] /Rect [225.1516 145.3913 379.9246 156.3004] /Subtype /Link /A << /S /GoTo /D (OOGL.m) >> >> endobj 1130 0 obj << /D [1128 0 R /XYZ 90 720 null] >> endobj 1131 0 obj << /D [1128 0 R /XYZ 90 557.9656 null] >> endobj 1127 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1135 0 obj << /Length 2164 /Filter /FlateDecode >> stream xÚ­ÛŽÛ¶ò=_a(Vα^u Ú‡&iƒíIÅf‹>8.ʵe[-neyw}‚üû™áZËÖ6 P0)r8ùÏüø gƒTÊ8Wi:˜mž0¿üé ÷³1@ŒA^^=yþ³æÎâœå|pµè ¹šO¢W+s3äQS Ç<ª‡c)e”¿ ñl˜fUlpÏ4%|ÎÜ”¶ßÔîèª]ß⺊ð»ò …Ý EÝ–ÅmZO㲨æçÉòè#œ)¥"®ØpzõË“Ÿ®Zδ_ãAþóI¦b.•vÌ_­J¸³:2óö6~øÆ[ qˆ"e±æ™šˆàmY¨!¡c™‚ÚÞÊ,*œP:WÅœè”U­Î<‚ój¢§}t$a–z°Æ†«/B$Qq_n›²ZÒΛÀ$ª%ójA0äeÁ#TéÚàî~˜É(ŽË¢ó†ÌPM8¹†! Df¶ÂMm×xÚQ˜ã}cžñX*¦`&c®Y0 …—˃%šk{B Ip7«‘‚¨p;Ї¸0†b@òXi(¸::sŠæßê·@4ÓúÈ,C¥(!ØošÝ`ƶþƒ¶Uô_XÛÕ™‡Þ¶ic¾q._@œJc¸~„¶0ÕãõÕ¶!öäªà»Kß·¸áÌvõíP'ÊÂ×obÐãK…hµðñ?_ÙÛÊ‹¨:ªÕx ‹?®í¼m\@9s餩:•3‘¡@}g‡ë¾Úç,E¯K(†%¬ÀFQ5¥ËZ:…ø‚+ÝkO+®î¯PÂ5FÂbK+¦šÓäÃ(AŽÚAô• Pâ Õ†§¦¸o¨œµ®µŸ|¼HyÜÅ+ÄœAQ>9ˆGfît#Q Æ•Èè×-ÆQWÉb,M5¦Zü ÈЕq˜‰ í»/Kó¥ÓLÂpZÁ&®S¢%×#! ök߬ôð‡. 7™ô¡ .§Xä‚ü¼t}œõk˜`ÜØ_bç)TØmýü[]6Åû÷oÞ>ò•ÌBQŒ*é«d¬’ü8‡ô¢ãmx€œÙ Õ*®0ÙâyôбÍBY^SG1÷µb¯ãÄ•ç:m—„¨nÈóö“sžeAþ $®’¤ëýùjUzRf”ØØÉw†n”Gf½µ4›¨Ûê ÅÕ† ÇœJ»Ù<"^í/ODr¨¯Ëó¾k(# µõ5a?nX`Å µ9¼‹¡Kc»È<´C…Yãy°ó—¾ßãÑØ‹n—¨ä(o‚å» _¥ÑåùKš ”ÚVóEŸ,²$fI®»¢x9!P Óµ5­TîAåº×„€i F}ˆ\_H.}žéÃ¥Ò˜e,X÷´¿ÇÔ,ó¯0éŽ= h4Ú÷ˆCmôi]‚S¾tEÙ‡žÇ‚ñÀ’‹;N±=ÈAm¹l}󔺗ÒNŸz ªºœ‰70d0“\åýàúíñöÅ¥ žA6êâ§:–§”Y÷mûŒ!á …0Rãº+sM<¹ÍEm=Ø¢ºw9zk5‹Ý”Q§Ôu è^GprS[yæ»paRMM© p¯ëÞÏ–«¾âê¯c³lªörƒÑ ýñ›:3~RT?ĨžZWœÖàÞœŸ_Øõ~UÌks|8d›‰<:üPqM^í®‹ÉtÚG«5ùíU¹::ÒzúÓЊëòú©ï+¿“¶ê_iî|‘˜³h‰Yܠ˺O¿qr¶ð³7‘p˜C úópñõ ~v ˜Ñí$;¸‰¨À©¡¡.Ì|ïâ.:…wÝ8Ë)̆ûzçÀOW"?þ}ʱêËÏŠŽ.ýóbÃj÷.â {|„‚:ý¨ÂÜmÔZîi&9Èî®*Þ­Zžùúµö`ô„h·¡¬ÁÇ¥ªô< ß!ø%ãÞéTÈýHï#—ê«úrö”v·Á¹ ¤h°ˆÂ=sB ôšVé-gNï:£ðjñœFÎÎ endstream endobj 1134 0 obj << /Type /Page /Contents 1135 0 R /Resources 1133 0 R /MediaBox [0 0 612 792] /Parent 1126 0 R >> endobj 1136 0 obj << /D [1134 0 R /XYZ 90 720 null] >> endobj 1137 0 obj << /D [1134 0 R /XYZ 90 343.3675 null] >> endobj 1133 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F54 112 0 R /F72 6 0 R /F67 85 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1140 0 obj << /Length 3398 /Filter /FlateDecode >> stream xÚ½Z[Û¸~ϯ˜æe5@¬%Å‹¤¼%Íe§ØtÚì,ŠÅ6@5¶l«cK†,g2ÿ¾çBR’‡“d[ 2⇇ç|çBË ÿäE).r¥ÒRçùÅrÿL¸æ»gÒ•0b1òúæÙ"-E)/nÖ³EnV¿'ÞV‡K™ õåB&ýåB)•”//ZëäC5@×¶Þc_54PYR‘‡½ïiê¶Y±A'M‹ß,yO‹uûˬH>7õ=÷vnõu»‚inC »À4)°Kjyùéæ/ÏÞÞ„3™,ûÖ©qÈwÛ:•J:ö€´=.Y”Àž0!›NÈtjKaaÞ͵£yº­Ó¾q“f»äE*J!ݤ[¯m2tøÍ“MÝÖ}…ŒÆÚ°e`¹ÙW*É?…Ôбs=ÿŠ‘&U‘êÜ–n›ý¾J‡f½Ž¤MZH` ü!…{-tr½fÊ–Ý©?Ö/ bDò€éNÜÓÖt=«ù äŠ.ÿÛ.Y‘§"7êb!U*`±úHó[˜|û€óà’µ,AFŽCµÛyXqëê(X¶(h R:´56Þ_ÂEu(.wpˆ\dÉ+î8â*[š>,Oƒ[ÂÍêg¢vêA4iuܨ=6«š«Dçò²îh>Æ®AÌOü¾êW¯þ'––ç/X^Ö]÷)v7R™TY]¾œ4¶ÇBf"Õ²—6Õe^N÷ŠÞ¸@Ô4…çÞóUY(ÿÜ‹2×s¶• íxÑýÐàMn¸ Ä€‡­ç.±¬âöÍ  ¡2ŒIþ]/';PÁ÷†^¿ÿ™+,°Ë–1©PZÏ}::jbZ[¤Æ /ïĦk\<Â(X[–Ö3ªjWŒRã‘ZnX‚´¾’al¢î/CÝ#ÕŽ;$Xpö=×㪛ëTÆïÚu›]‡’ù=þpë¨ëxñ³ëáÆ‘“Pá‘:‰tzZ)€s9gæštÊ<”@¹¬Î’Ç-DÒH2¥HFY$œäÏZÂ]VwŒ °Òéeí$AcG¦¦éZ7èdGl¹:BìÁ Ør…Vóh Åeƒ’òÀÓ7¨šì< …M»á¦Šø\c ’2 T!Iî*uæ°¹éWÜ]õ›Ó¾&~®¿‹Þ­ÉÀ¾˜™ð}MG×Q´ÌŒ<‡já1«Ón˜QJe§­ t^9‘´8TI“§RäÞb"ÑÌ $5¸òzîòÜlý0ŒaÇõ 3ìCOÖÉ­õywªÓÂÂñ¦ÅÔ<£÷øü;à%M´ù Á¢å!±å‰pBæÒkç'¿âëØŠJƒ_¨”=bË™4Ïòl Çç‹ÌFl¾½Æm é>¶Üèî›Õ°³L‹²ÈϹýö1·u³ÙQ86©ÍLy¾æzHŽž?Oát>kÚu³«¿õØŠlh!½ ìNÃâQ¬ l-È‚Ai²"ó+Ès!,vÑ×ëIäê',¦3(|=Û[–¥¹0Ð@)–ϧÎt.lKÇLË\Îuì5 ±V¨ŽëŠyàzã¾}]­Ž\$°¤0 âýã°BL+Á~4î}xßÅÇa•Á\N˜ƒp«"yK£¶µ—t3—(4¹  ƒÄFŽ Ä þä]tE@ P÷øÕA>„”^Mö¢Ùñ–ð¥æCE= ­R«ƒ:,¢aÈT xñ5bf¨U†¯rV ðè0’/D&?²“ˆîœ3嬎CR5ú½Þjôõ˧]ðÿ,Ûß8 Jƒ.mñçîR–QzÖÿz¬£7.ÒL„ÌËSK¡ï‰ÑŒaÌ"³û™UdVœ±ä´ ³ýYÊç#pÐÍVÞ]â<ÉËpÕˆ‰–Ät0“ii¬ .÷·îÞ;E)Êcû©¨DÉÔ@ ñÝ«¡ÒßqˆÝæÌ‚ÅM`Sfsq»=±b¨ijðžäjåýâÅ£x%fbÁý,taÿ8KœýŽó#mùCüˆgZ² Â7mrv ’™·ÐsiÿYè¨ðúób¢Q -Ur[RÜmzBZe™%ËnÇY¶Œn-ŠŽ JŠsïc®ÆhZóùÙæ«¨T¨°Æ&~+‰ØñlÒ]ÍÂ2y[y #ª9›ìÜÉv Å¡¯¯Ú Ù8ô˜ÚƒÁmœ Ì¿ò› ´/]‘ÙTØü,-ÒvÁÍK ¸VˆÌ Ûã¸ë4–']'¥R£Bø¶ýöJ3inÜm*¥ÕgqÓ£s“ý&IÁ±ÜL¼xo墲¢ÓÜ̼B¸<2£®èÓ’”}Œ-i€âàºÐù¶ckª4³a÷ý%¯Ç§ï.9³…=¿¼h€ïïYLbO¼1MÕsSrœfëzÛ‘³ìë1³èäµb3Ž p"°u@‹yr6ð+~TñQÍ 6^9Ó4£å»$5ÿJz`~ØkòÑô×…c4¯fa߯=øø€^¹§ 5r,dvÿˆ>ÝþÏTº8ùï'N¹€ÜE‚Ï}Õúø×‰OspW7O];êjÓÒqB³i~½×X¸Gî¬ÝYÃAS”‘›½<ÁïQeг4l¦ú×#R@ëaJ 7É{ÒPÀ6p;?ûNzXË-œ‘~àg bÆìéÅ™‘kŒ‹Yaüêñ‚G‰%YÝÐŲe†0tj ˜Þ iöþp8ÁˆÐ8½LeV(š~…—$ &±àk}ŽàHúÑÜz‚„’Ž‹cZŒ'¿GNÀ4÷¶(]¶¾«æxØUþm6p‡mH@]{¸þ ´ÕÞ¼`À-&”Ü"чhïO¸@G ‰’tð­bÙ›Uã<*fÝ$É”#G‚\÷”ɲÉÕš{Ç̸qÉ”j:Ù'¦fŒ‚öø MÁTëYKv³0Íx€L>Ϲ9,¶Û40o`g)ìù`5?½uæa <¿ô§é¹vv›åÄà3=/ðÂN_2—ÕƒÙÓ8“»0¢cyÔó 8W±ð¸±ÜžÚ»'¬ŠÐ… þ"†!ãÅ4në(w¡öª‘ºÝk)D7¥5sÁú*$'דKe]êÍj—=…¿ e.;“¹üª…“é¿u•Én;/øÊš°Õ5¾$ÑCTæ/DÜä^k±¼jüRÊe“îq*z9uQ…ñþ¸÷°Tèç”.ö„à$³E1…Iú+ŸËŠ?­IJ{ÄÌŽpêîìh½úHý‰Ás1ÁÈ+5æ&£! œW{ÃÓ•Åj@ÈBù`Ö©ãžoOÉÎ=ÁÝ¡Š’ïA”ÞÇB-à;fMÞ\ýò·Ÿ_ýÝZ#nóóŒÉynT”Ê;ëß~¸¾yûÓõ/7±õ¬¾õaˆûÜP¶¨ ©z.˜ˆB}S1ò»ó‘â·ðo— »â,‚£2mÇ·²!hξqà„ý þÚŒø•ªw½»n³A‘ ‘$­T ±VH]:ÊPQ}Ù‘ýó»¡Såö©?ÒpÒ¾Ðâq™6"¿ƒrcØÂ¯aS2c–}ý"*h2U£þ Aƒ¨K‡œ|šÍ¸A˜KÏr™ûÕGFàzjy\ä—=0¢s½þI/cMЈ–u.’«ÖMéÙóâZÜ–lõqNƒ·..?–ã‰Îâ›Ñ¨€¯ñ”q¢>žÓ䨒yY¡ñyÝyÕ›Ó,5'÷HBµ`%qš7XŽ^úÌÖâ*á­ÛmÀo/DÞÑ=©<ij:-dжþ½aØ#ýaGÞ…~ñŸm=v( D§CSKõMó9xAÞëÖ4§âSŒ¿ßYMÞxT9{oùíŽOjô„'P©vGÔvðÄù·°Îa×,›aÇ?ÀV°+_F=É<š½!ñá§.ŽôÖ¤y^U»%çºÖmâhbëÛ̺–ºüÍ,RSEÌ üV•;ëÐ?‚¹À|¤¢ÅWóÅMä½.`ç± 9-°³®áçKîÎë/U„gŠññã? ªà endstream endobj 1139 0 obj << /Type /Page /Contents 1140 0 R /Resources 1138 0 R /MediaBox [0 0 612 792] /Parent 1126 0 R >> endobj 1141 0 obj << /D [1139 0 R /XYZ 90 720 null] >> endobj 1142 0 obj << /D [1139 0 R /XYZ 90 302.3193 null] >> endobj 1143 0 obj << /D [1139 0 R /XYZ 90 194.0323 null] >> endobj 1138 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F67 85 0 R /F55 36 0 R /F72 6 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1146 0 obj << /Length 2828 /Filter /FlateDecode >> stream xÚYëoÛFÿž¿Â0.…³Xî‹ä¶¹|hÒ¸9´pP»8\¥%JâE"u$G-ú¿ßÌÎ.ÒÊö¬å>fwfçñ›YvÁ;ÓÑY"D¨e’œÍ6/"Ûýé³­)̘§|óâ›÷б(Ô‘fg7‹‘›ùmðv•m',hóÉ”õd*„ô·“©”2ø9kah•op,k ø˜™&M»¬ÍÒU1k°CE‰¿<¸4Ī̈́§Áç" ÑÊRÿ%/ç°ÌnÈ`XÆ"b’Oînþù⇛Ž'ÅùS\ãÛ|È6ci˜h­ÎâT†LHe˜ÿPÞ²» PÁ·ÿ ßׯé÷êêò§pƒ§M¦<EĤ[Ä}\W­xw{]”·_¨çïôƒ=û»» úúóËÅ”_ð¿.þÜSãnL_úW»öhƒ)Ê-ÞMOœI,¹Ì« ÿö¥°Û¿+ší:ÛÿX5íôÍy]䛬,Ï͵dÊ­¸¦L…±ÖÚìr³*ºÃ9’š &ð$ØCÃj@»ÊiÂÏ ý¨D|@Ÿ)Hø¥ð¶Žt”Ú9UI”Û)nW“jVmßµîhb™mŒŽÍýÐ!K™¶Ä­0|§žBÙ‰¡Ø”ë$TI¤¸È®œø½$ÓP‰Ä1_çÆ¨ªe‰òúÜÄÉUùQ»iëg,}'ÐiKéy¾®fÙúÜ»5S°5;1³û€As©ƒÏÙz—Óç,Ö³W,@#ºÓÿm U¾ cP$»Ùßå$ жßÁú”ܱl¯ÛKë`HåáR“PÄ*¥í‰HÐ÷i+º÷{Xœ¹WQq`N#>}ZWf-ÆÈñÍpÙÊß\ŽÑ3&Áßȱ|š\è C7/ðúŠÊöáñð÷t–’|(Ê¥sLË(Àm2³qNƒÕÂNrÊmßÁp±á°Úá$ <ƒs…®–zÜê]I¨¥8ësá˜{°›–¾» aÓŸÇ”|*ÒLŒ‹ñu•y>7Wm%¢F±¤óÈ2tî·¨4í2ÒPÀÊ*k©å•Ìü-RQG©1̵&†©Hõ‹Þâ´ðý+}“IÔ¸,»_»cáÚ^³ª®QyY@ç¬ð­·Ê S9ˆ±~ûS{êü0&²„‡*É™‚¨'©Â Ýfx»yÓáD(8&ˆÇ¼Îg­Q_!!4G!§Öí5œ²ÚÕ3ËÁ[2šyÏÓ‡²i³õšCUbøƒˆl³¥ÀdrÈ“ŒbØ9b#ž<Á¾›÷OÇ‘'P ºIdðýžÓ‘Þê½EëUþX‡ŠÖøjÝÏ£';Øaã|žq¯OB(ãÍïp0§vÓ9œñ©(çZ-¨‡Éf»3ˆ®¦ÎÌC¨*-Îa˜™µF¯¼Ce,mÈ1à ­Î2Geâ¼á†ß¬rŸ9¨Y …$øs6[Ýì·¹7Né0fÌù™jÛ¹R4‹µ»±¶¡Žž ™ÐȘ²]wˆµhqÍÞZÕ–"@ÿbO+ ½ÈôÐï`—±ìœ…9D qä¸{*.ư¸Ã³jC䇿¯”9[kcX¨–ñXÊͪ2ê:÷>{ÃN7D>°¯Ã~p&0¢ð:o–…Kò„;~ý`Ž+бXReþ¥õÓJB¢ñ3h¹9ç_ó’h ³Ø°B“à bÆÇñúß“TP¸ä1Dý’»Æ{¿* “Dºí¯óöj‹î±ñAé0‘hL Ã0Ô®2#y %<éc´çù"CË]·^î£\Š|®z©PJs8¯ô‚`ÐVv’zÔÀÆ$éd nXï')euÈ[guY§ÉëÜëFÑ—„,Ñâ;Ýʃ¦—ñ­ó¶¦2vÐ1#¨º%8ñ±g5º½¬\æPžÂ¿Q(U§â|3Ù@ Ðk¼c >OdÊv4³ùôõåê0ˆÎ`æOampÆT§ÇŒóS®ID‚e¶“p´=è×6¸!5Ðn@Ša$lÚªCÜ_šÿ€N7 ìf%:\lšŒ¿5^1˜Hநž€~n:*5À 3¨ß›ë.bÂ2#Ë$Féc÷fäA~ÀâŒ{ìÚ{ý1‹A+g!Ò.hMÈ?Û¡"k?²zO½ MÜ°ØÆŸ[Vâ± ^ÿª‹6»Ú•Ÿ¼†Š‚uòƘ¯¬æAÃ&'Ucƒ>=¬*jw¥Œ§_ï©…ŽËŒ"µ²e8#oÈð9;€'AŒ<Ž-ÎÆV—+ lœ¨q hÊWvމ*æ¸]˜žÓ`Žq„N•¤G»¥Ùq2ÇXáÄ»(Ö§°†ŽR`/|„4Æ'û¥­°øhÉ$ŒÒ.²{ 4Ù8¹Ì˼ÎZTW'Nì"IBÆ£øo“VT/}¶¬F¡YÔ9í~±/BÄà±³úàΤ¸hqE™aæî 7wáÛ.ûî@TC «{´îà?îvg­ï˜,1aX ¤ëj…þø¢XäNŠuDø$<†[‚=lP ±Í¨^°m1“Çž{ƒÖ¬ˆ!J¦IšŽEü»7—ßÕUB€üŠWÕríæ,TR:Uze!…ˆ*N" ÉR2QÉ ¤ÈÒ,ŒU±A‰x‡&\Ú±Š~3ú9¶Jæ²_6„jGì=m“@¨*é·°ä 8™i&—Öm¸’Ç@´Æçˆ8µà[d¶‚ ß ³Žµ_ú) $~ø/Èõÿ~"2v%C È!w2νº‡#ºI'dÅ»,MeÚ[ú#ñ„š^ML7 [óCLŽÎû1¼Ôx×#aš{ëîoo VA"Ѫ骈gXÈuªÇ·spXʰI ´ÍIH1°·¸§´Ñ𮨘»’.tø®ÒRAw9÷EùÍë·}óŒ{$ªÍîÞ¤Yó¢îJUïis“¼À¬îÞ‚̱£¬ljnT¸%1E:LSvà6¶$6{òBˆþ±û¡hW½$v.Ú”5†¥Ÿ1ù^²úxC&@?î²ÌÇÛ·ÉÂSiôJ–ôI^œ97\žîܽv¶tEßÄ PëÚÕ´/"rð¸>å‡\‹v°ð±SG¥c½ë jÈ‹ÉCI£lkì~¡c×PJǵ/O°êuc°dc5 E'ñ'.ÜcΠZ•ÿw‡ë>O@g³u¯qô®aŠ]‹Ñ[ŽO>Œ‡I:J0ÐëyԗA>®Ìm2óhm¡S¹:À~]=Äø|ûBéŽÛìÖö°O³ã*­¿ŠÊ$ìEìÙˆÿ£ªv½ª¼„Àí*©üB1Æ{ñLsœr–†pÛòQƒœ¶U¬lMg˜ÑBÇxøÀ€}¶ |¦J¡ËOC.5¢N-¹%ð¿|xFÞ“ †Ò1^ÌyÒ®J›8X‘K1E¿¬u¸—, Z% ¢í*_ÛwɬqÏ'ÿ Xbm endstream endobj 1145 0 obj << /Type /Page /Contents 1146 0 R /Resources 1144 0 R /MediaBox [0 0 612 792] /Parent 1126 0 R /Annots [ 1148 0 R ] >> endobj 1148 0 obj << /Type /Annot /Border [0 0 0] /Rect [172.5637 515.9512 406.6701 526.8603] /Subtype /Link /A << /S /GoTo /D (Source Code Installation) >> >> endobj 1147 0 obj << /D [1145 0 R /XYZ 90 720 null] >> endobj 1149 0 obj << /D [1145 0 R /XYZ 90 421.9181 null] >> endobj 1144 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F67 85 0 R /F55 36 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1153 0 obj << /Length 3373 /Filter /FlateDecode >> stream xÚYoÛÈù=¿Â}Z ˆhÎÁk[,Ðìv ÙM`{±Ò¥%JbM‰IÅ1ÐßïòÈ ü á\ß}ŽÕEê".RcÂܦéÅjÿ&’é‡7JFKرœnyw÷æò×X]¨(Ì£\]Ümf—Ü­??ïŠÇ… úr±TA»Xc‚üÇÅÒZüVô°´+÷¸Vô|¬hÈÛ®Z:º«VNØ :௮è²f¿ÐYð¥*Ÿxµ‘ÛoÊÃŽ @Pà˜ŠpIY³ø|÷Ï7ÿ¸hеþÕ¸ÅC¶ž’­T¦y_$™ •±1¿/únšm½€Kâàoü³^펇þøÿà&ÝV÷üµ<ÈÎ}öÕfƒH_þšD›h„¸Ôq©ó0µ†æ!RÃéÄ¿ ú¢ªñy˜  ÿö» a"øYK†—Ù)<­Ó0³*ž ¤Ÿ|8¥¡É´‘ƒ”Œ)á˜$°?âTAÒ†ÁÃp-¶´/kÔR›8ÔÚ‚T*1©wH€¶qð94“‡¶¡ÍT>|¸zî}—@>1åøÆÇb…ªõ°ˆ@ŒÀ$Á±+…¸¥wÐiòk?(ÜFE-÷ ú5Û¶Øó^LUªC£TG•ñ`«0¶6ŸcÛ7üK¦Ó:¾ úƒô>°q&F9¨hjhgæ/ØUßímPIãà¿%DÊ;ÈŒ)r!KJ.=1ŸN¨üÌÛ€Ñt *³d¦ Ñô„—4íƒhÈÓ@`+úx»#ê@ÿG8# ŸyKGÛÊ)^W¹MÛánŸMü¥… òºYmºé³d”M‹Bų"Ÿ3i›Øù¦Mý¼@ob£0Ê#+ßú.KÃî“遲7.h Ã,î”"%Õö\h"ÆÈU‡Þ L¨Øí4û@ÚÉ›W$n´€^„@ÌòR‘ç¡É%÷Ý\½û¹©Á÷±¯Ì’Pa¬œ)ÿën8‰B§¿5"á,Ìá\й9Ç…T…™NœˆnÁ¸‹Ué`ú fY˜ç&{ÅñƒA‚BW 0Ò”ƒA€Æä]sôÆ¥0—Êg^( ` ñù ÍÂQF“ðæ‡œ ï]W]/öG)†ñçâõ÷h÷(ã{æFœ¶Û1Ÿ„]†œ¾^÷|_WÕ%]Õ£}–\†ÛxTZ8ãmFÿÖŽQ¨ªúj´Éîò¡×Òg\îÅcÂð†î$/Y¶¿Qà_¬ÓÚPÔÄuöüý‘,úp\î‡CìÚ–„r_>ò Ç`rÖ+¦¦ƒŒßäQ@°{ÊKŸžxÄOÞ %Lu:ÉöàÞ÷Ì÷Gq´ç˜¢%È­`R½”@’ C9ŠCfcL2Ï}=(8Eõ2A :š<Ê=bJDŒ-$ÙVÍ%~‡ãüïkÀfƒkø³­ú’.žqÙºsg<…V˜>gÓûn®ßy Š»+‡{Î0Ä5.MáÊÖNñ)aãÀÉ”±™bÕÜL`úž£?À¼0‰@çZÔ¡ÃV®au†’ç@v¼®¦6L¸€˜(&æbå¡àøý–}}qðúOಆŠKÔìØ?ûÛ¾- oi‘¬Tõ)!‰h6Ù” œí¸‚£]¹Iv·|È[P@€U‘Có/>Ü`¸9}Ætx€†Õ3}9 ZèÈ!8ö²ÔˆÏÕIn?~ÁX“¦]@3ŸCé÷Æ'¬àÍ$|(GG)§çè³ „1•~Wé’(,IíkR0YæpLöýá2GÆgßF Uø„‘‰GÍFØj¡zµ/*©Á ¸D“ûB„™V²1V²Ï>-(©{À/ë8Þ‰4pêiHrv|âµPË:Œx@ñ¼³‡â ƒ¥RÁŸœ#ÀÚ<ñ$°w`M…S˜ØJ W^•™¿TŽü§Iõ@”O˜D݉A¨.&¾"1-^r)ÁÁ…xW$Ú –æ*Ë]Óõ¡¯ëyZ0 ·`®]_Pû¥¦9*ì¾àw`bîÀH½CÜXCŸDc›$cºgfÛuƒ¸GÂzðîÜõã™\ü‹™wTþÆ:å‚dy« 9`l°±éf=‹A|´(^“ºp¤{ÕtÓZœn’ƒÛHO‰-½e’d‚Å9µÜ:«¹ûðñöæç_®o.!mÛTÛc[úSp!C´GÖ&yЂ$æÇ®5¸K×,:AƒºM=$èàá‚×ê¡£Ô<ÈBÏ¿ÂTç!=O•ÍkÌo›ÛHêõï·wïMÌsà‰NFBÓIy‚c?œ<½€¾æqשCÜP3‰Ç”оÔ%v=ØÐÉI’2Ñ>Ôµ#Å)f#O’¢r`؉—kù>[%Êúš²‘b9QäÚÙmÊ øÒcJIkŠc‡õÛ×Ïýnzâóù1…Ú–~¿•[(cå~²O+n\–}̶£1B÷+-`d¶‘’zûql ·Òq¥MC„tÍ]œE€¿ÏT¿#GZž Ù=BD ˆbÅmb¼yMBÞò~®Ô¤Z8uA-+OÉ2½u8•§ry(¤wª˜Õ¦yáä%rºÅÿ9ìð½DÚ(TÄ¿Ÿ®çyÄgW q3ƒ/ Ùø™S\u WéÆžWÄaß·ð~y¡ëojêAå‘ቧiN¶Ñ7Ë3ºã« ð¢n×ëÅÌÛ3ÎSãpíl.Á‹Ž×\A¬èÓ)âšëò]Ù–ÅMP×;U£Î÷±–cõë‡F~=Yó„sQ~Mí3Ñ0ÊÕ“hª%’Æ#µ¦RvåštßõÜ ¯´Ønñ¸ŠÒ¬•ŽâK!ET¹Ô\FŽ–‡§ÏÌÁøåw¾ßóÚâ#ýô=”_“j·_²$¾æ¼*‡ zÓ' DöMðÛ«^fvML/ðŒ‚¥3²:Ö…`Áþ«ë9x DmÜ9M«äεGa6^‘ÏÛIh"*=Çuù(X×jŒ¨jD)Xpq°PÏr,Wè”ã0ùЕØ8 ª /Q&‚çOB"’"Ó©‘OJd:,}R‡Rê;C 7>«™(âg5œg±jð½4ÃÊa^ rQhg±é']<œÂ®»\ ¡Ëà)â½øè¼QãµüÔÎûԮߞ‘kw¬ûIÉïz³âwúR<0ƒð 9¼¯¶;Rþœ{ªÉñѯQKšR–¯åú|“[¾Ö`DÖ€n;%_‡!ùf±Ý³£ò§›þ/…×M&Œ³Lÿ¢ysÃ"VÂjKED‡µ1ÚêJƒ1ï{‘Ð(Fñðm¹)ÛŽ‘žW¬¼¹0=ÕÓ7‚5=7OªÜU ^M ‚ãȾ–*L·øS…a‡7U€¢€Rp£Ÿ`A²…B$ñ™ž— ¸#Ê`“/O€Q%q>C×—'¸}ßBúå…ˆ:x¼,6òÚ ˜Lz]<1è Œ½í0ÿÈ¡LôÄç7RøG¶Ð ¸|C5ðl¼c~À‰¬‰õè`ÜQGGm¹-Úõ˜äËfŠ1>ê—˜Tà‡½~¼¨þp²9¸Á†§@åùÏEÝ“]iÉßS «9Þºã¥ÏÇtͱ]‰Á¯ÅÃHQTÝSW‡u'tzòYÕµÞ endstream endobj 1152 0 obj << /Type /Page /Contents 1153 0 R /Resources 1151 0 R /MediaBox [0 0 612 792] /Parent 1126 0 R /Annots [ 1157 0 R 1158 0 R ] >> endobj 1157 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 212.2032 259.1902 223.1123] /Subtype /Link /A << /S /GoTo /D (Installation) >> >> endobj 1158 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 102.7772 262.1659 113.6863] /Subtype /Link /A << /S /GoTo /D (Installation) >> >> endobj 1154 0 obj << /D [1152 0 R /XYZ 90 720 null] >> endobj 1155 0 obj << /D [1152 0 R /XYZ 90 667.9075 null] >> endobj 1156 0 obj << /D [1152 0 R /XYZ 90 387.8256 null] >> endobj 1151 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F84 667 0 R /F53 197 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1162 0 obj << /Length 2912 /Filter /FlateDecode >> stream xÚZYoÛÊ~ϯp–€ˆæl$§·(¤¹nÚº6\èEoÒmWRJâþúžm¸È¤~gæÌv–ï,cuß:ññIjLämšž,7obéþí’¯P,ú$nÞœýìÔ‰Š#{urs7XäfõïÙLJ|7W³}1_¨Y=_cfþ÷ó…µvv‘ïaè¡ØàX¾/¡±¤O&;¯iêC¹l°ÃÎÊ-þêÙ9-Vmæ:›})‹¯”ŽD“¾—¤ÙîEÒLIšÐ·ã;G­ÁBŒggGNÎXE¾çˆg†žrÛìóõš™Äz¤h­še½ü#¨e‘AÅêÙ²Ú•=ˆãtWÛ™’Á<­•“FþFB½ï¯R²ÿ­¸•á-a×S·èÄ¡rƒ8· †|-ïºi¿Æ.UTh© ¨ï¯ÞüëûóO\c ›ÚÈ:“ 9¬ŠÁ†Õ ä F‹»ÑQð Õa½âÓÛæPLÂk„;Œ±ûY-¶‚NZX0ì!“zŽQ§¤€:›½_÷‚?5Ûæûbý8Ï B¾Î\q0o)§„Ï©ë|‹âÒ©%_[ñ'…;RŒôdG¹Œ älót§bØ!¦» Ê¿$¾¿Ožªöé¬9Ÿ8¦žqI{'›BGkhį<@VÚzzžYñ8Ûéhœn2qÞ¿n*ÊLnÂЛ¶Å›m8¸!Ñm#…ÝPô­j´Ú`ŽÔ)ˆsQ’93DÝ•µ1Zí&¼}ê!0÷î;ƒ]Ósç+G,V ÷Ûê<'nÜñ ¢¤Ëb2g‡…)$,3¾I]Ý£bäAì±}aåˆ!v»ŒuQ¦Ò´bë$Xb©8 ¤Ï†<"ÎZß­úLPÁÚ¤ÙD b£0UVÂý4*øË7=p©o£fƒÛŠS!Sf§»Zpâ©SµH`4«áŽNC!a¯t_ç!A!áTêÅE,ÀI;§²ïð&S½ˆ*S={ÉâiO”øI9-|ßxü€Š•ßrÀýSÞDÇ¥qàê‡ÏŸp#C£7â²döyUŸ1`ÃèÜ Æ–²ñHìîÓ¹ì fÄÞÃÌŽ‡@‹²³ ÎP™À†p¹•‰‚“1€ÜÔ».Æ{óçÑ€>‹“„{fFÍ.*ÔŽv»0Эµqí\—õ¨íŽÉ—Æ®;,øÏp¿gpœªrö¥óY}‹öè`hYá ‘GÇ1Ä,`¨b‡4Û'îÈš¿>”ü-Àð3Á­up¾MÝ~uѦ<œüT7pÎD¥"=ÕAOÏM}¶®–ùó´1dq¤²Øw ŽJÀcÎÌÚ˜6Ï™ð^r IÝhHâ[_±7¥a+ïÌQ$þ *™¯R’³`¢\H`˜ëœ·i² (˜3ˆk‘lËdûÅa:-a7Ü¢˜$±¾G¢/”l߇ÍeçeµaÏËqÙX–ÜF¿+–’a¼ÝMÄ EœÆ—Ûàw¿Po9Ê,‘}¾c`i΋W¹UW/ËbŒïEÚØœb|É­¼®é¶÷2»¿î„ö©H·¸ñ:wkã ÏŒp]Âù:wK«†:Ù䱋€îõ®U`¼ð&2™9 çºz•zÉ8ÓôǪûȃœPú^&~à¡X¯Ç±ZY¥± ÇŸÔ7k¡zÇËöbM/Æ›ª«ÄÜ=rß(ß²4Ò¦ ƒ_(Òõª°í¡ ìÕëö‹À›;P?AªQ ÓúÎJ@ô`}‡&Ø2¶òÛ¦Z‡ú $]¨¶¶aÔ/–Z3»!Xâi+¬é¹l*±Y—vhÇ©UK$;´…sq}Û’Ò€jÛ0-9#0ƒO’ ­ÞeÕoCy*e ^uª+…Á'ö«A >Ñš×UµÙÔˆ ¹w.pXø¡:­m0 kH±-òšIZ¾Q aÇÃÄ øeÁˆÌ_()øø0jäBihhóZn¥€ªmdCù‰Mº¤Ø¦œÀ0¸®)Í,˜f˜,[É[&㜳`¡m8ò ôä #äsY—;6&:–!Ña¡ŒÌ%øh¸¸»”ϲ¢€ÿ]:ƒa¥ésÕ:©"XgÌÓ°ƒ”¡?eâe%5îÂ×óO—×——7ßá1xù±xKÂNgºz#£>8`ŸÂbÆRÖBe› ‚JtÍ6íbrj¬*þ…ؤ ‚ÉÃñã@ºòu«vÜÁeH•m ?T£,—hjùÌ{ݘU»6l¸»’SNxÉ,rZ¹ñîϤ½/¿¿¼ÒåcÔÕº|3åò ¸o‡>ô*qû8\úô–×,»²L[‚£—»ìXéÕä¯þùÇÑ·#H6]Ïš¡=$€zXç1ý:Mã‰c`5¾È« Å&þiâØõ¤!ýµà8µLD*v‘KÜ„¸ä¡é”6fIã©ê¿oËañuçh‘av­€mÙq0žßÊã±ñRêöi¿`‹Í6v’û¶|ø•‰èû[‹4‡}÷:â{~.4]ÌÓ ™[²ÏD©ÈABÚ>-ßù6ªdàâ2Õ>ÆI¥"1bŸNÚ¸õy8âàª-)ëßÉ«‰÷[VuÏGáUþÐæº endstream endobj 1161 0 obj << /Type /Page /Contents 1162 0 R /Resources 1160 0 R /MediaBox [0 0 612 792] /Parent 1164 0 R >> endobj 1163 0 obj << /D [1161 0 R /XYZ 90 720 null] >> endobj 1160 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1167 0 obj << /Length 3081 /Filter /FlateDecode >> stream xÚíZmÛÆþî_q ˜"šÜårÉ (;Îõ '6liÑ(O¢$Ö:Q%)ŸïßwÞvIJ”}AÑ6 Ö¾Ïìì¼<3¼ø*‚ñU]Y­Ã<±öjy÷$’áObiÍaÅ|¸äùâɳL|GaåñÕb=:d±úkðb[fqЕ³y4³¹Ö:ˆ£ogó$I‚›}Û»Ì]UïgseM”qbf[üéÉË…'m”ús¸äœ;«®bªØ$Â]š%a¬CÜÅÑlnRÜ Ä üî ä·‚ÿ€#`n¨‡7TYhóÜ\Í• å’Ïßãí®¿•å#C‰Jðˆ+Ûª’* Z’È’ïmâÎLÊo®­0õÉq·áöõ¦hª^^$' rÏò4Ë ¹KM|»<ÌTš1÷ñ±÷[ÇEC "‰›ÏƯ2u~Æ‘*+ëVå¾îĺmÉjït —€mˆ KAÍÛõK'3ÿ|4I{èëÖ½j¸hÅ‚¥·aO¹®AmÓ4..=8Ü6K'ÒÅë7ïÞ¾øþæí³e½_W›cSN>u.$¶ѦyЃô̇.„vbTð†4'ŠVØÀ(fp£3¶oÜ\ðÚÛ}ýA&:þõ· :óíM¦iœ¹Û§4·þª7?½[|÷êÕÔEsêT¥ýE!f¾æŠÛÓtò°ßtF'üœÇEç Î$S\£XnW~Ît‰]O»UªÇš0Ð>Ôµ#Å‘6ñé03&E9†©MXz?ÓäµÊƒ|&4ÐÉ‚U̓äD ï|=uðbô°x9Z¶*Ey‘:‰­å Ô~íâR«–¸sË£*1v0®á–%NÖWèÐ'ã䀹ÜiVæ5KëÈ¿–PåK'ø“±”î·%蘠ŽþXèlOÎLHò[i·õ¥JÊ/C«¶kÈóÙÔµVô„x`çöRðÛ¸ÿ§V´ú·G$[ù<ÇôJ HnðX«ƒ—.;6B&è}³$¨Ö¼¦¿eþêýÓŽ§ˆóB¼¶&€poæ°îØ9£$íÛð`!\Y|úŒžþiËó¤rtJã¥ÃK>kU ‹Ö4ïÁw¬;y7ز)»ËWïKDˆšAÔ8–0ÎNIxnô‘¾¸U”½}2Øò/iþ‘4Ë‚.TõA‡†NbûŸG¯ýHÅšÁ- VØh|ã%T;2• ë“×uô½Õ3T­èÝt/ÒÞÁÉAˆŠ“PC¬C¬¨4ÌS# ÷GaŒÐXF'mB€Ò#MIEáAµÞï«OÜzN¢³âÃOàièßkÖì‹ÈýVÆ Âõo ['ÿlý§±uö[ÁÖɯ ö_±õ#±µýo`ëä+¶þÿÄÖö+¶þ7°µ 6D)QÜÃ윽þãØk6 Ô·ÄVµ/Wž/W“æ>Ø$ÞZ†:v%Ôt`Ú¤R੺Î;ŸLâÝ:áq&×ÅRnèÄ{ðAÐÛ Ù‰KÌ•à©b5éæ3rlo+ÕQ˜YmÏs«$‚Œ±Y ±{Ä™/þ®Qþ»Ý÷Fh{Çc×ngŸÁD,‘GŽñÒÁ‰O€|·zi¡#+Ñ<L° éD­|ГGÀÑb¿âÆ@m/Z''ô{H{ñÕÐ5ˆv’Ê6%ÚªNÅ}îÌzÕÞóÁÁoZ3€ßªfÎlaÙ¡h:ÎŽ‚— ºj`ý°Žs¯VtlS;" 9„Ív@tÂÏ2¥Â¥ìšxo8j.'MŸ@U²p¬(”f‰‘À¢‘¯€þ¤fPa¡ve·ãÀ_È’iɤ/Ûò¸äÔ·lúx²­œ«l/WúBcäeF¹þrã48`Ø¡UôõÅ"e¿¸a Çù2NxÝÆ)ÒÔB˜btÝTµˆÇ…¢V6÷^'Ú#ûôs‚•óŸC²õ{òú‰1} ¥Ä:ŽeÂ/Û༫îhCPf€!ò¾[Y+{8ÏÂÖOA?íó~˜+?ue³/ÐW˜D¢ßîèq<á<£½.Š][sëLšz]wÛ¡ïÄHu+ö¨Ä‘>4jºT¬_Àúûª£»Å£Ò]^.¯äòŠ „h,Ç»’@'Æ„‡°2Å£J¢5,E”sr ®1u¹Ëð…Aœ©âqqn¾tBf•4~n£$øGÉ›¼ÿ\Å‹ëW±/ÿ¹Å‚ªñ‘ M?‚‰Tè ò|8Ò5¥œQ¸wè4òµ*ŸNüîúåëß¾~½¸P\€Ð{¤K¦(@°in'yb½ Ô¼XõE1âZB4}ÍØi€*Ï.jçUZ´ÿB jBiýˆêÉ8’?eZ},…ŽcxÙ”R±Ò÷ÛrÏKúp †Sx€Ôâú#%T*ÈJµŠÇµ‡ÏÀhôÊÞø’щCæS(òš“ú¾¤“’zqåÜú²|Ã=ÇÆÞzF¸ßPkĸ›2WÜàq[v!y…T'4Úçà¿J݈Â9!º5ÓìÑ9t*¹S!ˆ Y¤ât¬¨ƒ/ x0#rï±ÙÙàqVbæÒÙw™`þ çDD,£è…?í¶$aCóž?;0–ùfR(ÀÒö ÀÖºÊ_xƒ¡3!›l€€3BÀòݧŒE«0Ê´cÅiÍ”­€4ó(ñ¨—20löQ çå'hšãÖ”†J£>×"þÉ´y^ªxè¡ãµ÷ÛÊE ìJt(å@rx8î+ëò§4)–‰rë3ìzÃ%vˆ NœñÛ RUc¨w‡[vÖRÜÅ¡AÝê$Ô°qŽ>Ýc§ðÚ¦%¡D$èþ.d7úÊ£ãþÀ0§å1Ewü¾õ^beË'ìÖz*3½ìB¾%ˆ¨èüv”´c!ÞÕ&t)‡DJ§é#T)œ0wª=ªJ1A&å8´§pɹ–¼ :%éØìŒÍ>û‰.7©Vp:Å>ü—ƒ˳/=Ø›\þÐïŠ=ºÈCKÅv)îLôòÛG^uWpÖJ}écN¤%iL‚ Òík<É¥QiÂUœÍ6å¶h·“_5²Ð¦Öy^ù0t'Ù}¢_V؇ÁmzûÝID§àj]:2aœžú‚AÄA í=žþµVïäØTài÷¥©ƒd®”SÇec,×õ £™=Ôêä³ioiÎa„ù¼iè|œï,pg–Ø À _êk—_t¤¦sxä‰à˥Šáú0¨ÎÓ<Ú7þvŽ-Ÿñà†Šõý"»*²¡JNÃ2}Ûøý‹7ïÿð¨¢2žŽZ"®_Á+?¾Ì{Nü®ØO‘µè.ô€¬TP‰ó$ ·Qÿ=ÛS©]ËS^/ðöÀš³tŸWQ„¨]8I §_•ÜQ¾Ê kujŠMÙrr'Pø/åð endstream endobj 1166 0 obj << /Type /Page /Contents 1167 0 R /Resources 1165 0 R /MediaBox [0 0 612 792] /Parent 1164 0 R >> endobj 1168 0 obj << /D [1166 0 R /XYZ 90 720 null] >> endobj 1159 0 obj << /D [1166 0 R /XYZ 90 720 null] >> endobj 1169 0 obj << /D [1166 0 R /XYZ 90 495.5127 null] >> endobj 1165 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F53 197 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1172 0 obj << /Length 3392 /Filter /FlateDecode >> stream xÚ¥ZëoÛÈÿž¿"œhî’ËGRHr>×í9rº¢‡^Ò-ñ,‘:ŠŠm |çµË‡©Äi ^îsfvæ7•zÀ?õ2 ^&aègQ’¼\î^Ò}÷BIk3æý)ï/Î~4ê¥ ü,ÈÔËÅí`“ÅêŸÞûM¾Ÿ)¯-fså5³y†ž ^ÏæQy—Õ¡Í·[ÏÛ²®fs˜ õTÏþµøë‹ó…;Úhý5âpÊ3¨‹ÓÈWadˆº¦8 ]{<Ù+–ØnK çóL§‘¼}œ¥‘çÏæIx×Õ:£0óqB}ä 2€vYÞ :ëJ¦·8Epæ;§³ïÑ–©·Ì¥wyl¹gUãø½tÃ"Þ6—YCw¼F˜ꈵ¥ š«ÐW&HDq]S¬@ iæÝà9ØN½ ’A½#æÊâ~<#ƒ+U,¨]Í“ª5êôë,ð~ T³¶(kü¾…ö¤i@üi£ÏJ¤¡ —mÝ”v÷Ã÷¸8*é p*±T#w%OáîÍà&˜Ü9~Õû% ’(€!*± ¢ˆâÈ+¶ú¼ßM:‚LE} k‚ ´ï¶>nepÛðÞb㵎…^Ç&oy¶\zÃ__$æÂnÔ¿Üðžöhîü¹'ñŠJ³Õ‘O0ÓMZæGä5 91¶œJ¢ÕŽoZ$Œóð¥‰ìÓMㇻižd7 ;æMWå¡¥[¾9¢\¸ÿ„Mhg¤ÁRÁ°­;]Æ>øá°î:Їea½WË]'ï 2Æ2³þüpZbɈ—{‹Þår*³Ác؃âqN³ ½/I\›Ð7I<’xñÀ°ulóáy`î>n¼®ÙÒ?\Cï‚ç|:¿‚k<åïç<<­%iàA ŸÃ´S_b.ÁÆR`ÁŒñ2ê…& à,ެÝNbαP÷òíMõÿŽC»¼šb$‰{’ö¨ ±' ¼sØh.PܨžIƒL(öÖ5–rP$KàдÕj²Š3!öã§ó/ÿqvØ€ß9[ g“†¬Ÿei𙔣³Ë†è!Ý$™C¼Ó‹š„:‡[±2æ[=…PŒÑ™18Œ, {T†àb÷ˆå癉ùÎÃDˆz°ÔuHyàaŠÈ’à”µA7¤i[Þ ó_‘ã(ˆ a-º¢¼e²G¹§Ùß‘ºØ¨Ô(é8}BÜsÆÛÞàu*x2Á¦Ã[™Ú?ãˆ]x²*0.î4#ìÃF/ó@« ÜM95Û;œ&×GƒOòç²?i%Pg‰d,Ö jÇ©PqêÂÛ4ЬH×þôþ‡ËOg˺º-×Ǧ˜¼ê ¤søx¤¤D ]ó¾w¨"£½..ÉB†äó¿ÀÅ9¡M±Ý×w2Ðò_ÇE/°gîÁ-ƱJ¿ÕÜ:V/?ü¼xûÓOSŒf‰Æ:îMзám®¸=}Næw‹žœã qœL¢á‰·ä ¹ÍQÄ]bèIaµŽÃ“I8êÚ‘üÈA¢ ˜˜“¬ÅfÒ2ÀÕF‰²îÀÂü”i@¤’¸b ñeƒÌž…‰½7ñÝ”b{;/öäKª¼Åˆ@yo8¡øýxÝDäŠÛ¥ôåÕÊ6,÷÷®ìÔðÕ ¨ºx d¸XBò”5"¥Ä™¦#çÅþ9 $ÿé¸(…þuÉ:NÓ¤`D…üZY3nsJ¯eÙ-múx`/¾ãï|µ+«rp•(Yf•gÖ`,²ÉñPØ÷›šûvd}üABÅðË=âÇFyüE²¸ðžC·]ݸԟª>¶½ ®°Þ 8×/è"ÝÕ\õ;1kÀô–í‘3ŸGX¹R]ÚÊÙ”ãH 8ˆ#ë›vù]ñõ¤ õ,L¬–LÙ C%ϲÈ|³ölP‘°pÝ.‘ ´Ô»A<‚#¤)QÀ~Fì) F¡G- ´ZK°Ñâø²f¶àa©qJ’ˆYô5Aƾø—Yž4e/Aµ©VCȆ±"SV.Û7À4«d9 %Zú¥¥É  †HÜØ+›Œa‹ ½›fZ6š¼_ƒ 쮯góÔ]ÄÄÄ6Ûþö(ÕzìßçÄy•賈Ê)½€óåéº$LjÄO¶üi“'ÂH©©Ñ)$ÁRVÓ×_ʰ–”Ø™‡MÁ‚1Aœ«zaGòT¹©€A–R.R ›ê´²YEÀûÏ÷ϲÀØXG¬®x):S &€|:N÷ å`åi´;ˆIð žÆ£"bYSàW°B– AÒNtU ²~«às7¬à‘ákÌeJG§½Ð{¨ ‰åœÇï{—B NÐÇ=ÙŸ42°Û³P-4ï“48œ€-ëb'˜tÕh`d WæÈo¢ÃîÅã‰-h² ‹u{ªïnXÇÑêÿ#&êR1)ÅkŒŠýˆR«oø<\}__4–sÇ«³W³yî\!í"ô¿»üÁØdöA°†«ÔðA*'HÞ< µXlŽDé—ç°/—¨?Té .äó[Óbs*;Ñ D±&‹Ÿa¹Q†•Ý¡åÒáb£È: PuÙ¶Õ:Ëü ç°È)¾ÅÞøÅ>߸1~qoâì¡Sľºí¥^<ûˆIj¹-s'vî›zM¡Íξ:AgKH-W¹×` .^Äý;«_ñÔ²’%uõ;†ò!ÚÀ8i"ýš’zBw Ï…N® v†à"ED¬ÆŠ®M/ðÕq€ ‡Ó¦ªa4.ˆHñ/½íÂ_ £V¯¸ûDe7ôM¬­~GÎèëÕuÇ‹R &—/s.®Ai?ˆÓq²%€$ðvŸÜtˆÑºµ‹P\>`¡ÿ<¶T4…uT;Ô’×âšE\ôp.=ÿ^cø¸Uéur²olCùYlFég)ÑÕàÕéÐ{5\–·Ï,Ò,Œõ¦¸4 NÙpì¹ØÖ=–Éö¹å]Që¶Ýr&‘Y(ºGïyxØkGH¬#­4ʆH|õö›‘X'f‰q@XsývFEüرcÄľ#ðIkz,O ó²Àšâ&÷pÞŸ·&`åÍÑýübÅ»ì$‘ Ê!iÖaœ}kyâ[Ëöh…âD‘$F” uzƒ Ýé-¯q:ЏþTGqŠÓQœ2z<–)R¢˜Dšb!ñ¹·ŽŽ²|ÖQr9®b‡V—ùYªFRÝ·öù¥ÿ¾àTvdÁ&Oé«{\¨ëÕÛoßÿííÅù ú‡7bßQb?5áÈ‘Rð¢žD½÷ƒ×:ì¹Ê;ß¹ƒÄx™s $¿=ûº#‡»æÔJ[sVCµŽB[²ÕÓpKõßóµ#±§Aóé÷ý†RñH°! ŒwEBßD+?¼Ð ¶¨¼‘÷À~žkl6‹æIÉÂEåÄw»S…æmë|uxÃF÷Ò .FèÎ,x©{`ƒ½&¼¿hvYºß¾þt¿&Á¯)&±Ÿ}0)+óIXc¨:‘TÁ¤­-rrNÎäÖM÷4Š‹8’Ú  ±7e D4–¥]¾öÝÇ~=T~˜ºŸØ€Íúo£Ak£‘ÿvONHOàsJ8ÌÒ8ø¥ŒÚAIÚ¢÷Ö)ûu?Îéýf 7¡9Kléö ©HA!-L±)?Zï»)Îè¬dRƒÅlèMšCyhÞ®A¨Så*`º§t¡ä¦ø—ç;ôSÙž¹Àf÷[2¤n›ËO¾pƒIcÇGrŠ•öI’„¹‚‹?ãû/|Îî, endstream endobj 1171 0 obj << /Type /Page /Contents 1172 0 R /Resources 1170 0 R /MediaBox [0 0 612 792] /Parent 1164 0 R >> endobj 1173 0 obj << /D [1171 0 R /XYZ 90 720 null] >> endobj 1174 0 obj << /D [1171 0 R /XYZ 90 516.5221 null] >> endobj 1170 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F53 197 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1177 0 obj << /Length 3711 /Filter /FlateDecode >> stream xÚ­ZëoÛ8ÿÞ¿"XùP3¢H½ö´Ý6èÞv[4)pÀî§Ør¬‹m’Ülþû›©‡åmwS$EÎ çñ›¡ôEú"/RcTnÓôbµJ÷ý -­%ÌX§¼¾yqù.Ö:Ty˜ë‹›Íh‘›õ/Á›mñ°ÐAW.–:hKcL ÃïKkmðþÐvÅnãEWÕ‡Å2Jã0 ´M¿Ýüøâíß:Ž¢o‡S¾E¬¬’0Œ.’Ì*mlL4ÞlËÉ+‘<<«E”÷‹8Š;2& Šf!3¢` ͪíšêÇ®\ó‹ÕàÛÊJÿF6€†hDl[tãæ¹zûñÃço.÷¼ÿªU!ïiB¥ÚÊ{ßñíñŬ+ ¥!)¯ººy‚§¿á*KÆ*ÒQ|±ÔFé8äs©6pÆOÈj}ć8h`­,(WÕæ‰{:Xg[µü°®DnZaS7³lÆ©JS“ ¹>¼úôêÍ?_]½ýáýç9öR«lì§¿„µ“0€¥içóÔ¦BPlYø8Lýû‡_ybQD&RQ”&cQàA€±;|/?ÇÍUÇö?°Òܲüp›S-ÃÞ¢‘á]¹é°•‘Váo·-¤çä¬3¨Å2½[dF¤–û&ã:rlš_—]Q¡õ¡Šg â¬J _0XìÒžb~Dz çh(¹çCÑ÷‰&S?ºä7E~ä—ÞâÁU}8ôz%K×øWÔ[ïqׯUù‚4¹¡ýð‰—èÍÛhMnºixà*ü¼åpâú 7åv]®Ø]¡3ËUÂ_>‘|F§Ê#âæØÇéà·—Üýà'hk¦¬˜Ø¨,5zÄÊŒ×óó¾ÅÊé‚ÈŠbÝMAÕ­26‰pê2JÜ¢&Ta–jš«CºŠË81Á9øÿJ´D÷dR8Þ:Ä4öþ}8ÈÎ×õ±¡#/yòAzë×PÛ…?>¤wSîUÃIk‰¤In#Õc…C̰L’L¨8wàÀmf­³š›Ÿ®?¿üp pSÝ›rö¨Cp!:ˆ6Ƀ–¤c~è ökGÁ'Ò<(Z!O À¸ûuÁö/<†6Åv_ßË@Ç¿ž ª3s[•$:û³æÖ³úþçë›W?ý4Çhž*“DIÏ(€yˆ% ”=µç÷ì_:ÙGý‘ÇEç ÎÄŽwÜ Xn£|§ºÄ®'ƒ·!RNpu¯}¨kGŠ#­ñAXc„Ÿ+—} H0q‘¶+ÚZžÉ‹ÀŒ»²ãFçÞi1ˆ‚ßñéKÊíš“é"ÀØÑ½jå–¯ZYU¶ÙõZÃ…lÊGqY7ÜýˆjUãz÷<þXApbz·wbªc'pH^ Ñ jƒË|¿á1õ øì êÃî‰{ùõƒ@S 𠈉LE|ðv„ EñÁ[:ç»9‰À ¦v¿Éš¼}dš*Ì©H~L—]Ÿúaâ€p'Q|>¯.c±¡Jòd ÜÏž'Â%Àšà}‡ÛƒC*îÉò[~„3Düþ¸-Qǰgƒ+ Ž£aé{¡Æ¾¢ùGŸÁË2©=£›!8‡u#/×n7ÏkÿP‰£¢±­4JÚª«$g Ïh ¤xœ~ϳ/Øz]J*{ É>¡ÛöÇ-+µ îéè×2¼áß•àZÎî¥jÑë#LJSÎW­Ê2ü‘ÊÙ=Ra9ÀÌ™WSù‹S›B—‚ŽZqöØ]“N€«\ :=§ ²7"ð9á;ýM‰híY5ìÕPä¹ÛúsO'3sšœ=Lt<Öc½uÆnt:tÕÎûq%îø>YÇqGáùÁÉÞlŸ|úÇUmzD9ê¡ÂÀR+ÃØXs^M¼Ðáu *çqoup£ƒ}–鹈øt>tM‰y“ÕYð_xâèêu ˆ¼=uÂŒ^y áNÛ­ËTp#ž>BÆš!Ÿ.^ß"¾ þ#\ôEÀÀK<œp®\%#'Lë€H°û›q§©ê3—ˆkRµ-öhIÒG¯¹Ÿï#µKP@{ÉPýdìB‡s\bÉRƒLd¨Ïò¢“Œ[„Sg~µh„,Í Ù„ÎJGqE˜ ¦bÑ‹œ•ÁFïYg½€däÄX8–ñiä’9‚™L ` Piî½'¸5ŽTZìçüãB3¾yKP[Bw£ÚI 㵦q9ЛO_摉Jt耹bØ`]vž‰½s¡¬·®xztØE±ÖؽüâuPžØImg MÈõÿÚ;”0'l˜“O ³q¾+ðû{¿h=O_³¤ECã@7DðÌ~*Ì|VEðíKäHÉÆ·t[çb ­Ëø¸vGw2НL}Dm™«ùÐ;RfÊ«åŠ0 žšÄö’˜¡ûøãs$~¬rmó±Ë× b•d1žJ¢²>ØtàŠñM[äv‰B¾¸D‘…}pÀ‡qp<€/“aœŠh]Ñ;Ømck¢b4[h;)'`§X„¦Ì;N"938ðÏx½=_FÐ*É}‰xüƒ·/ø·ênWß‚Pžþq?öôB· éÜž«ç'¡Ò‰·ÓsƬ¡éóõ ªn‹é Y„(Ýg VEa6¹ËwŠM÷éçª.´GkG$àãï³df*1ÉðŠÅfçîJðòÔ-øbòëëfë¡ ó0þÓK¶wÕl;U:ÓÉó—sÌlΰA3Ëþ4}¸ÞònµzFÍåù<×;Њöÿ*ÆãÁÖ­}Æ’œÓýÆ¡»Àçk.ˆâ.:ž( „\k‚k4wŒ ¯¹Ã"j´1‡qšAw¼È$l¤iôÜ}«ÁkäÄ¥÷M ž1œM˜ÝÄŒ..aG ö\ 2Qà‡Ýù»‡mqÞ•›Z†â¶¯êà;ŠŒÐul¹ê Í‚¦AØZÂ0(›#ùžŸQDˆa[‹#\C½>çF0Ùv/ù£¨½G/8€ güx–îáy ±‡ƒ-¼Aß8à­Ú——<ân£pðÑÅȪ“÷dƒ3RNðûW¿Ýß«¿ƒwüÇóŠ”fœ[I¤ºV„ŸuZ“ÛJ£#ÀMÓžŠM7ÈÈMïÐ)\8t%ïYNÒDéH›ž‘¿>ÓHîpºÝüE©ÆOÖ¢AuˆÂØóêâ.SÅuÇMŠÔôÁ+X˜*›Ò×qˆ)BþÔ%Rx²~'ÃÚb]`·¯•`÷|Ž „úà—ïC°Åũv½ûHÄ>ÆkË…D2ÄU‰”æyIÓkœVðO»-™l+7-T ZNpÕ@KªnѾr5ƒ¶™Ï@}èt…¬õ|>Wy’åß„øy–Û!ć…kQi‡â-òÁ…Ex‚d[žâ>e^}S?]õXApØ3ʃ©¸«>V.]‡t–`Uçòp 4ÎÌLmZtÚ£~ÄÒà ŽªƒSQïEÆÊ}ö_Pã«æ endstream endobj 1176 0 obj << /Type /Page /Contents 1177 0 R /Resources 1175 0 R /MediaBox [0 0 612 792] /Parent 1164 0 R /Annots [ 1179 0 R ] >> endobj 1179 0 obj << /Type /Annot /Border [0 0 0] /Rect [147.6002 628.8045 353.8731 639.7136] /Subtype /Link /A << /S /GoTo /D (Package Installation) >> >> endobj 1178 0 obj << /D [1176 0 R /XYZ 90 720 null] >> endobj 1150 0 obj << /D [1176 0 R /XYZ 90 614.6575 null] >> endobj 1175 0 obj << /Font << /F51 9 0 R /F52 26 0 R /F72 6 0 R /F53 197 0 R /F54 112 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1182 0 obj << /Length 1345 /Filter /FlateDecode >> stream xÚ•W[oëD~ï¯ÈÒ±¥f»wÛ€ *å •V$Ž8H8±“˜:q±†ü{fvvËñQAyð^fwf¾ùff#&~b’ñI¢Ët’L›+î—Ÿ¯„MAbz*òÝìêæ{#&‚³Œgb2[ž]2+~n×ùK,¢¾Œ§"jã©R*üËxªµŽÞo»>¯kØÏûªÙÆS™žFB§ñ³¯îfƒj#å[Æ¡È°Î¦š ¥³î§ “VFý:ïi´É·±L£ÍšeØ+¬ŠÐàgr^}äBÃJí&‰·å²lýɆ¾9}^cc£¼­ò¹?ƒ7.…²@§Ábyj±´Ó)¬qgð÷·?Ì><ÝyÑ3ç´a©×Iò+¸9µdwÕ º èÆ•|^ê˺ö"{tÂYÄ2(šL•0Lq™M¦B1a8Ŷw8½`Øð&%¸ƒKñ,Zµ.ìëjÑÑF‡÷bAƒ¾ÜÐ2‚ƒò \m6/•÷îËfƒ6¼Vd©@ãpc ó¦eÀ!e£ÙÚ‹ÿ9ŸeVéÔƒ²yf_ß>ýúÍÛð½#»0¶u|pFô´Ó¯+òwÆ€u–6mP2m¤9ð€6;•?«-~M´qXt¨GZ Fˆ…Óª÷âQ½óÊpËïŒ!t”PÊ»÷cˆ„‰TØ€Á5¶?åƒ3±Ã ý]ØÄ©ôú)•P쾤°¢›¯U¹§ýnÝ ÕuABsºÊ{‹ÀTp[|Âj¦3}Á¿ß¨œìƒÛ‰fî;æ Õ@ãyÈùL»S[r†£Î4 Q  ºš;{}~«4«¶>ÉW»6m„ó§[š9v;÷Ú…?Ü'¼¾¹//8. 4¼¯¶+:߯½Ð‘x0É;ºª7u *§à÷<¤ß`QNKˆ£p˶ðhTN°ôÜîŽ`ŒæÚ3B%`˜é4Æ$)˜É„ðBEx¥¥<ÊPviàK:‡¥@sH-ŒYAûÕv¨"9¦ZMËŸr ÖbíÜ¡råίF‹Eš0+yŠEþ\Ã*ß§Füœ* ¥Ñju'æ²–zhØ<š—Ê2£L¨O_Üß=>üüø8SeR­³cBE5ÐkÑ7í!Nu•1iô!NÁ+¼0Èkâ¨·ï¬„Õ £˜TZ}‚ÉgðЊ%Ò0Шؒ6gæß˜•/_¥ëµ}} ¿vClGá–i-’ScƸ'a˜fç6@§qä×À~•É úCÝA­é”ÒѾrÑkv}`ÁñˆI×$(Š’!êJ~á-˜%‡à&öÿ0/áL&á]Pç}é_W®¥R!œJÈÚŒ_”Â#C¬õ ±I4Ä ¤9”Ói—oh6 ©X*ýV€Rƹ0^ÊcOv¤Äå5¼ÅœæU6W3ÛÎ;ÑpÄ•Pgw[†QCß¶¼(.¾¹X–$—›Üu“›¦ ~íS€>/®ñ{’¸|GZ$ÜæOn×û ×˱–EÏÔ÷p©ÕâX0­æÐö`Bøô´nâ7\‹N.$íPÁͦ×r¡Ûl|«çò„ à]®õ¹N…/¶áù~eghE ÌòÙàé÷‘64^#W\]–Èd×¢ØÝ<À¨(—[ÕÍ<ÍÉ9>À3ßÁ›Ëõ¹§KàBhqO³_Æ.…?&5Ùx“ÊM(úħגI„G ]Æ œ¼ä]e±MYª’‹gxªŽ/·D¶óšæ™÷‘îìXÀH°ð?ë_½h endstream endobj 1181 0 obj << /Type /Page /Contents 1182 0 R /Resources 1180 0 R /MediaBox [0 0 612 792] /Parent 1164 0 R >> endobj 1183 0 obj << /D [1181 0 R /XYZ 90 720 null] >> endobj 1180 0 obj << /Font << /F51 9 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1186 0 obj << /Length 1333 /Filter /FlateDecode >> stream xÚ•VKÛ6¾ï¯ð-°âò©GOMƒî¢½1ri{ÐÚ´­Ä–‰^#ÿ¾3J+YZ,L‡£o^G¬8üĪà«L)Vè,[mNw<ˆ¿ß‰°J@#«ü±¾{x4b%8+x!VëÝÄÈzûOôd«êXDû8QJGë8W‘ÝÄ2‹ ­«MyÄ}¹Àþ|Ž8jZGÂ]ÓÒâ mœˆ¨9Å2^*{MÎs ]Äÿ­ÿ¾ûs= 5R¾ç ªÌÉäJdL £ƒ3i®™PÚg(®BðèSfÀ§B¸M¬dtèÊ48…)<å]7[Z?á Á­´N'·1…¨ËœqêQ¬¶µͲ¥°àºóÆ^0:¶íƒzÅ@—(ûÙ‘Ä5¤¾·!ÄþÞ¯Ç^D ±® + «D¤§B{„‚ÅIšòèkÕUhLÀgShˆ!ZÉ‚¿hçJWÏtÅC-ç¥÷·I–F±œk±JU±âš2 ¡ƒãQ¦½d¬Hµ+ÇqžDgÎ{x¸^¯lØÑ{Ö´û[4*7ÌÈ¢¸A3«»AoÍ$ësƒˆ"«Uýºñi©1t®ô5ÙQ4‡xKg;Gëmã3¼é3žø ‚º@$Q1a8•ÙÉGLƒn骦¾§‚¨‡Ôu¡Ÿ©t.¡t¶½•ã±9Ÿ,Y ÊzK‹ÇX}ÄŠøL’¹áq®£Öþ¸ôvèò¶?I룯ŽïÞ|0õùŽÈ,«ÎQ™&°47ª/Tjh õËëw€O ø¼=•Õ‘–Ø3EŠûy'—Î/Ú.´ð´´¸aZæ)Ô~÷÷¥67,ƒL DÞ1ïdƒQh7Þú.F*Ù[Vcû"DÙ“î1F•¿ž'<Â@….Ä¡$O§ÉÆYÆ*üß ïûz:öäbE+Ï YZDÛªÊɵ_(}Þ~Ò¦êªñ¾„O¶KtKŒ4þæz×P¸@à¢ÈLxVï!Ÿzö­ñ&â$W$næÐB£@AQ© Š•™«±û;ötvÁ Ü¢w 6®¶ÆN>t—çö¦­¨%ì:¬j²êKC,@Ϙè›ÝÐÛâ=¶:hºæ–k„,å\®L&ÀÓ\¾Á|ƒ^2V\àš¹A Ýk•Ûk2I²m»¤õø"è;¾PøhYý~áË_(ü[ê•’qÐ4sêíõÞ ÇÜ "ƒ*ŠãcdÓMUꂨ/0بÐ.^îßaûvçroòto'×À£Ï3ó~rGŠ ÏÚÜàèY án.ç]à$•SYûÓªÞ5ýˇ,G 7†¬aRÉüò,ƒÞäIæéíó ¦LÁ”ÈŠ)•«@åŸÂkˆ“QÙ÷Ð öêVÈ#4ɵô  Sâàþ¡n° ›}Õs*yÚÃEw9ãÄ›ëÈVCÎ=Ga‡¸vbøuâmŽh jî •JÚnÀ£Ï¯×ˆÙºËdb¢§WçÖcoË“3 àE Ÿð"„?°3Ê}å–Ž6–|€rؒۯś¤ji1 $ ?õv7<»Çè@ôí¬¿D֋áK~8,»~¬VÎÙŸ)ƒ¾-jäÑ©AvB]¨^Ï'?¿Ðé ¥xìé;¨NS‡Š³š@S}ú4|”fÖç%Wàý>oq­YQhèH.™é[Þ«%#½¥¿5·0¶:»90Ìýí¥À¾S ³¾ Js“¦½15t,~îC qK endstream endobj 1185 0 obj << /Type /Page /Contents 1186 0 R /Resources 1184 0 R /MediaBox [0 0 612 792] /Parent 1164 0 R /Annots [ 1189 0 R 1190 0 R 1191 0 R 1192 0 R ] >> endobj 1189 0 obj << /Type /Annot /Border [0 0 0] /Rect [253.8041 637.4761 385.5299 647.4761] /Subtype /Link /A << /S /URI /URI (http://www.geomview.org) >> >> endobj 1190 0 obj << /Type /Annot /Border [0 0 0] /Rect [111.6002 569.0369 322.0549 578.7339] /Subtype /Link /A << /S /URI /URI (mailto:geomview-users-request@lists.sourceforge.net) >> >> endobj 1191 0 obj << /Type /Annot /Border [0 0 0] /Rect [111.6002 555.5832 455.2328 565.5832] /Subtype /Link /A << /S /URI /URI (http://lists.sourceforge.net/mailman/listinfo/geomview-users) >> >> endobj 1192 0 obj << /Type /Annot /Border [0 0 0] /Rect [144.9942 499.9917 276.72 509.9917] /Subtype /Link /A << /S /URI /URI (http://www.geomtech.com) >> >> endobj 1187 0 obj << /D [1185 0 R /XYZ 90 720 null] >> endobj 1188 0 obj << /D [1185 0 R /XYZ 90 720 null] >> endobj 1184 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1195 0 obj << /Length 1713 /Filter /FlateDecode >> stream xÚWKoã6¾çWø¶2°fDRÏí­Ýîb{ ,ÚUlÙ&"‹†DÇͿﴣ£É†é`›Æ5®± >‚ßsB7ѸgfY–Ï—½Ô¡{ü…Dk·Ìþ+¡{+rïGX.ÀNû6ȽI‚×Qš¦C; âR p6+N‚@ùP‰úk°&éÓôX(¥ýD,rQˬ>ø´ÎˆÞÊzje™‹¢‚¥”h~_VYb»SŒ;þ¾àˆBÚÝÐp笆RIªáeΑ2“¢Jµòw ZXõBæÑËEZ\´,ÒŒÆö/Rð8ï_D!YPB¢D‘6€šµcRðïœãl!Ê ]§Éî&>püG1¸·ÃÈßÏhü7ž@«˜yx„ùõ£B*âÔߊó¿½?ÔÔ*+D–¹÷ÇEaV§±fX¥BVÒ“à«Ép ÊÔ1ÂÁZgFÇ÷þ™TIäí-hI)E‘¦j‘æè´ª¹`¶'ÈéVSB†á+{玟QªQŒö4¬Û­v­è[÷xhLwhzÚ5ýÖ>Þ›a*r–çBiU݈|¶‘nFä+›Þ3D‘ÁnÒç‡Îk¡ey“Äê$q,B Áƒãä=Êç=Ç×Ûöfnxcʧe¥“vÁ¡ÔÛÎî( fƒCVJ”U Ýaõ*»)§ð:¾ Â|zF9ÝÕRÜ|DiÒä.“"ÁX'fä†9H÷ц¹Ô¹ 4¥`S™!ZøÓíÇ' n›–¸Ê˜Ü„ÇÑ~ˆ†”‰kÜ$I coÇ»ñîãj ŽËhhॊ L©¢`ùOA|‡B’#Ö]8Ê/$åt^Í¥UEEE¹ç!í‰ÿÐ6<ÃÊ„Gõgþ†Èyo‚QG´ªRà IæEJíÞ‚ˆ7g³™½tC SyÎ×癇±á5Ú¸Á²k\»abD`IfQf’lâB•éT>˜œ6áô3~9ž>ò¤3sÇ¿9 ¾Ö3¶÷±EC}°Ýë¬?cÃ0_(À¦Ô} nËT±€9ý›•ØI`õ¡èD¢hD® *š-Ã*ˆ:w¾go“LAÎXn©y{c~ïf5ÝÁ4—(Ž;^«_\Z,1y ›"8ƒ%õJ)í£@çÅœ¥~‚6¢@‡4ƒ3ëSG3^5ŽG¼ÕršŒ¼â+ï©¡ UfÙu-2}î|q‰t«)áLq¹g8).çóY„Ê! ¸ÌõçׂÌ÷ç÷2ÈÙ—US0œžc÷øŒà(d¥:¡mmú ¯²¬Œ®8ÔüqiðËö;a¾±Q¢¦"öJÔôMž%ž'½k`œߤ¿ANŽÓ¿Û.Ä M}žžvó:4Çt¢÷ ?ÀRŠƒɋόêò©’cƒŒßø﵃§™¤d~Ç«ã #Ø¢ÚŽ×ùT9ÒtˤÉßFUlˆÑÕäáQOê2µõžœ4ÙÏé{]4³²ÀTÎ’PŽb:SClb:éñI`†–ïC Ïa6Ña§œ÷"¹­*uòÞ'føAˆDlíd÷¢±cö?ж°9©õm›P¿Ó’PɮϑhßLcwŽôrp&º¯#HÚmÛ¸Ó0?b„¼©;¨§ï, 'o6Ó`¥ÙÄGá†W‚üœ-þÐ)ñE¯' 3í5qÒ.àç|fé<Ò7<ô—·7³!u[ëÛßBÉ*LþÒƒ¥´ƒ¥?P¨ r3Zxºï®¾ R3âݾ.>/¸¥=n‘&îA•NE%U¶ÈT*r¥å;xéVSÂ<¿g8ƒç{±{ßV—B‰\WêFš;Pt3Ò\!û=ÃI­òRäu†oäZHUi¶ížz¬¶S$ý®,š` endstream endobj 1194 0 obj << /Type /Page /Contents 1195 0 R /Resources 1193 0 R /MediaBox [0 0 612 792] /Parent 1200 0 R /Annots [ 1197 0 R 1198 0 R 1199 0 R ] >> endobj 1197 0 obj << /Type /Annot /Border [0 0 0] /Rect [111.6002 581.5816 455.2328 592.4907] /Subtype /Link /A << /S /URI /URI (http://lists.sourceforge.net/mailman/listinfo/geomview-users) >> >> endobj 1198 0 obj << /Type /Annot /Border [0 0 0] /Rect [390.2741 497.0029 522 507.0029] /Subtype /Link /A << /S /URI /URI (http://www.geomview.org) >> >> endobj 1199 0 obj << /Type /Annot /Border [0 0 0] /Rect [230.8124 418.0988 362.5382 428.0988] /Subtype /Link /A << /S /URI /URI (http://www.geomtech.com) >> >> endobj 1196 0 obj << /D [1194 0 R /XYZ 90 720 null] >> endobj 99 0 obj << /D [1194 0 R /XYZ 90 720 null] >> endobj 1193 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F53 197 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1203 0 obj << /Length 3012 /Filter /FlateDecode >> stream xÚíKs7€ïþÊMª ±x€­lR›Ýxã=ë¶µš›,ó¡")ÛIùÇ/F36é†,ÉÞ’8•ƒ-¥ÙÍéï 0/‹ þž_X¥˜×Ö^ÌÖ¯x÷ë¯D÷·Iˆ˜À_¯_ý嵂3Ͻ¸¸~w’äzþŸË×WN_Þnf‡åvs5QJ]¾Ù\‰Ëyý9ü$´5—ˆ«ÿ^ÿûÕo×}!#eé«4!ùw±òBX&…ÑÝw©œfBiÓ}ß}—ð î¾N(ÿfÓ|—ðÚOk¦t%›O‡mU–)ãý݇hc”¸pÌW•îB¸í¶þðcH©Õå~Q¯Vm¸ÑÊ1㬠Ÿj‚ÿz5Vžü!†~yÿÿïÇAHBSVŠYÃÝE¥$³•p ® ÍÝÿHû¸ ¼ã*AótM;…àY]k™±ÊŸÔP©+ÔÍÒ5u̪:Å$7¦¸µ1®P5Kw·µÒeu½e\ºª¸µ1.¯ë4ô¿Ù{¸›lÚš?•w€Ÿré+Æ•¶sþéŒ|Ö0ÁŒçÌTGI0ˆ ÖGa»S¦#Ëêž°A0SI¦¬mkþÌÁQ°ï#˜vLUZ•„`1ª(HG –ÖÍF0#9Öµ5.`?‚}OÁxÅDeª²` ,FéhÁÒºÙfŸÌ[ßN0) öË(ØwL‡¹bhsyqÁú¨’`0)XV÷ÄÆ/£˜ÓÎVž{ÂÚK« ã¨ÏBPob׋ހ@‘ô¤£½IëfG>- “V´5¿”¦/Ýâµ^oç·«z²»Ý U¡¾ÖêÙɆ­HµLWW¤0_‘öQ¥)LG®HéºY:zEZÚÚ£ÕdÕ,]»µ·º°µG«ÓºÙáV9Á¸5í‚áïe«§C'bDÅœ õqȼW¦“jFƒJê¢N0שju¨N0©SV7=¸*S1c¤ïU¹gÓu½›æÚè  ãìyjƒZ{X´@$¤ mAZ7³ €åZéS ºã`󃼜×ï–›zž;á,³RŠg@ìÛ{Q¤  š°µ$Mަ™ÖÍh*ÃŒRž ¦6›åæýÐŒ½(ÒMØZ’&HGÓLëf4Ã,–Kì›ïëíº>ìþÈ Ã*'ÎgŒFÉǾɃ@‚<Ä@’éhòiÝŒ|˜Æ¡»ýx3§qßJ•Øè¢* Pr#UéhUÒº™*<Ìø¹é‰›Éöc½Û-çõÀð ™ÐáKžýð;Vd æÉ¤£™§u³• ´*,~»ëB¿–W‚o§³³íj»˜Ø‡Íðºzùæ¿æ¢}d+g¦â嫌0W¥*©Ó‘ªduÓáAjϸáU¯ÁûÝöv3Ÿ,×Ó÷c„­˜0J¼Œ1¥{R¤  ª°Å$UަšÖͨ6·ÓhÑŠôöíöóÛ»=³úìVí(øØ¶"xH€‡Hð  >­›—Žq%ª#øùnúiÕ¿nTM,j RŽÖ ­›M„÷Ìéîjï?Êì´žâŒ{.ÆeĽÇá sê§ü` .OÕÊ#Qy`:Rž¬n:†k˜’Ýy©V dW ¤Ø±"sH0‡Hæ Í<­›1¯4s¢;{Õ1¿ÙmoFæ(óر"sH0‡Hæ Í<­›1(ÃRòd?ßÕûú0½™vØó»9»§[U„  ذó$lކÖÍ`‡Ÿõ:îà»ñŒá·b£‹ª€@BÈT¤£UIëfª¨PÛu'¬fóQ•o¦JltQH¨¹‘ª€t´*iÝL)™µ¦UVÛÙ‡\Ù\ur£,_}fßÜ¢ в"õéh=Òº™B2y÷c£Çv½¼T¥4Ó^Œ‚ÜG‰ØÐ¢ Pò!•éh%Òº™\0kªnÄØÞ \¦–" :v<çðàÉjlqQHH‰ ¡pI@:Z’´n*‰hÛ ·»ýv7Ù–Cw+žûÂ$vª„Äá¤aÛ)Ð É9-šbvœYe=Ä|ø´<Ì÷VKæµ3/4F86©DÄá„aÇ) I8-zzº¹7Á[¡/*]…‰‚nÏFÿ=]IÕ†ÌëU}¨ŸølôK¹jq{ wLت}[ì‚V6q™=Y2Äžæ­ ö^‚´Ô‰GeÂ,@iÕ>:6_ÎêqžðDÇŽ#ÎØâ¢ °Ãô™P?Òjˆ ‚3Ç‹åºÞì›—hŒ:¿Ê€®‡EŽqÃ̃ÒOJ Ã7Þ3+]‹z7-´èÛZâFœPB”€™0'²jˆ.üRv·[ _°;dô-.  A 1L $­†bC]·ë›Ébº™¯êý¸®Ì@ÇVAƒ@4ìüÀÓw A&tZ Yp˜°à¢jëýV^pÔ³Åv-ž\"%˜öªìÐ1ŽP¨ ¢ :æAJJ!…ä¬rÝÝSñ™ïÙªºlzvg&ŽDb—Š|A 6# 2¡ˆÓjcî›'VÅ ãöQÆÁGû•y™·Á¡tcŠtA A¶£ 2¡tÓjÃtu˜2rË«ºW ls>ú…]¸ö)q…8דF#\a&ŒkV áfz2¾‡-r]îñ‡V%«¸ÔÏutF!Æ6!‚@"ì*dB!¦ÕˆÖ2m’ÃëÍô°çáèØª"hH€†Ç@ƒL(è´ºªX¥<öÕîm:_^ì;tšÁʦ™±Ãüú¸ Ìøåéwè.ÃþbÔIÝ!ˆ1Ž®›§|‡ÎQ/zk­tÕ4ekaC{‹Øj sšÛ[÷ÛÝx?l:¶ª aç…0ƒ A&tZ ­ ãJKûÃtˆôù.ïú.ƒ@‚1l:ÆdB§ÕÆJ3)ÍéÎ|ØM7ûõòp^ϵÄž‰‚@‚(l1FdB‰¦Õ¢R1-âdb?›®Æ;ž`ß·µ($¤€”0)@&TŠ´"… <ÁÛÔëÍaò¡þcÿ´:?_/Pè±mEè €)`ÐA&zZ Îsá ‡¾¡ Ç¶¡ƒ@:¤€A™PèiµaèÊsæ½{úÍrèyƒ:„Þ·­âÐO(Q A‡™0èY5ºãL8×ïéC3ôñù’NðûæÕ„¦È„ª‘VCÔ¨< ¡í½¬õç¡Iýxýöq«ü¾ÅEA@ !$† 2¡‚¤ÕAš“4¶{оþs»]cÇÓ±¹E5@ ¡d…©2¡j¤ÕûC”tÌÉî­¯Ë÷‡¼ÛÕõŸãró –› áïqS $ĉQ”8 *NZ G:Í´v­8ÿ*‹ƒ¿ŒU½Õ¡d‘a¤wÒ”e¸,}! ̄ɒU>5ïÞãº^„ËúÓ$Lb‡ïT?‹S}OŠDA A¶# 2¡DÓjØî/›'Ÿº¿—wÿvCÑ£žy~™T!™òöƒ$”‰Q”2 ªLZ ¸`Æyu@lu¸·±¡E@ ¡ä#„ÔdBuH« ë MwÃ7MŸÓíð}gŠ\A Á6Z7ÈdB¹¦Õ®œ3¯º÷~¹¹¹=´÷8­¦‡¡·½ŸÅ)†¾'E¢ [Œ™P¢iµa¢a–(¤Ž;ê!è÷‡ñäáC<ˆ,iâp DçèÀÿ4ûÚ° endstream endobj 1202 0 obj << /Type /Page /Contents 1203 0 R /Resources 1201 0 R /MediaBox [0 0 612 792] /Parent 1200 0 R /Annots [ 1209 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1229 0 R 1230 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R 1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R 1263 0 R 1264 0 R 1265 0 R 1266 0 R 1267 0 R 1268 0 R 1269 0 R 1270 0 R 1271 0 R 1272 0 R 1273 0 R 1274 0 R 1275 0 R 1276 0 R 1277 0 R 1278 0 R ] >> endobj 1209 0 obj << /Type /Annot /Border [0 0 0] /Rect [263.7508 631.0184 277.5739 638.5402] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1213 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 631.0184 297.0286 638.5402] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1214 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 590.5631 297.0286 596.3414] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1215 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 548.3643 297.0286 554.1427] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1216 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 506.1656 297.0286 511.9439] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1217 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 463.9668 297.0286 469.7451] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1218 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 453.4573 297.0286 459.2356] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1219 0 obj << /Type /Annot /Border [0 0 0] /Rect [263.7508 409.5151 277.5739 417.4852] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1220 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 409.5151 297.0286 417.4852] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1221 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 367.0624 297.0286 372.8407] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1222 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 356.5529 297.0286 362.3312] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1223 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 346.0434 297.0286 351.8217] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1224 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 333.5413 297.0286 341.3122] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1225 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 323.0318 297.0286 330.8027] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1226 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 314.5149 297.0286 320.2932] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1227 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 302.0129 297.0286 309.7837] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1228 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 259.5601 297.0286 265.3384] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1229 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 247.0581 297.0286 254.8289] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1230 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 238.5411 297.0286 244.3194] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1231 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 228.0316 297.0286 233.8099] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1232 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 185.8329 297.0286 191.6112] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1233 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 175.3234 297.0286 181.1017] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1234 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 162.8214 297.0286 170.5922] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1235 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 154.3044 297.0286 160.0827] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1236 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 143.7949 297.0286 149.5732] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1237 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 133.2854 297.0286 139.0637] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1238 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 122.7759 297.0286 128.5542] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1239 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 112.2664 297.0286 118.0447] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1240 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 99.7644 297.0286 107.5352] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1241 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 91.2474 297.0286 97.0257] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1242 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 80.7379 297.0286 86.5162] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1243 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 632.151 522 637.9293] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1244 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 621.3435 522 627.1218] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1245 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 610.536 522 616.3143] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1246 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 599.7285 522 605.5069] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1247 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 588.9211 522 594.6994] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1248 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 576.1211 522 583.8919] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1249 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 531.493 522 537.2713] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1250 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 520.6856 522 526.4639] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1251 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 509.8781 522 515.6564] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1252 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 499.0706 522 504.8489] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1253 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 486.2706 522 494.0414] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1254 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 475.4631 522 483.234] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1255 0 obj << /Type /Annot /Border [0 0 0] /Rect [488.7222 464.9047 502.5453 472.8748] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1256 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 464.9047 522 472.8748] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1257 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 455.8407 522 461.619] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1258 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 445.0332 522 450.8115] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1259 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 434.2257 522 440.004] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1260 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 423.4182 522 429.1966] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1261 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 410.6182 522 418.3891] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1262 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 401.8033 522 407.5816] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1263 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 389.0033 522 396.7741] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1264 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 380.1883 522 385.9667] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1265 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 369.3809 522 375.1592] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1266 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 358.5734 522 364.3517] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1267 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 314.1993 522 319.9777] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1268 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 267.8328 522 275.6036] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1269 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 257.0253 522 264.7961] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1270 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 212.3973 522 218.1756] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1271 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 201.5898 522 207.3681] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1272 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 188.7898 522 196.5606] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1273 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 179.9748 522 185.7531] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1274 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 167.1748 522 174.9457] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1275 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 122.5468 522 128.3251] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1276 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 109.7468 522 117.5176] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1277 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 98.9393 522 106.7101] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1278 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 90.1243 522 95.9027] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1204 0 obj << /D [1202 0 R /XYZ 90 720 null] >> endobj 1205 0 obj << /D [1202 0 R /XYZ 90 720 null] >> endobj 1201 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F31 44 0 R /F8 1208 0 R /F2 1212 0 R /F84 667 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1281 0 obj << /Length 3643 /Filter /FlateDecode >> stream xÚí]sÛ¸†ïó+Ü»df‰%¾øÑËN›™vÚí—;íL§ŠLÛêÊ’—’ãl~}I‰ _<±£N³ëÍžœcŸç1 %/òîyQç¥Ö¢6ey±¼{“üã9|•u†üêòÍ÷ï­¼¹¨óZ^\^Ÿ$¹¼úçÛ÷ï*óöa³Ü¯¶›w™Öúío7ïäÛ«æS÷_Ò”ö­´êÝ¿.÷æ7—c!«Tì[éCÂï¥TÒm 5|/Ee„ÔÆ¾—ß÷u¾¯åE%ê¢0}L÷uCZ©!ëÕ¦ÙeËõv×´Çè ‚m%¬)»¿Ó‡þò]&Kuò/9÷‡_ò¿ýëâáP•*·ö¢(jQWZõýî¨þ70ã2 <€QÐÅ0]ßN)« n]Š\UÅIÝƸ°î ëÞ[ “ìíâ*„¬¤PU)ŸGù| þï+’¸G%@F$&eMKéxIüº$¦•êdzA’ì~±¿ M1Ý·X›âåÏÒÀ51ª2 VHÇkà× 4ЕPV9 ¶?¦±âìc…kqTd$Ab¬$ޗĝH¢JQ”vt$k6ËíÝýb· m)J¡íK-H¼Cs¢t§8.tše;%ãÑzE²²‹¬Ëzm¶[}nB¾µì®+Ö|;„InîG‚ƒ@†v’Eéxv~Ý^^«r€×6Ëf³Ÿ›Õª»‰¨ì ¾Œ“œ]—¢œ!áŒM—*§9C:ž³_×çlkÛÁÓÕÄy¿}\´3ÓzÛÝåk_Í¥šb>v,Æiæ'8明eÔ nêmw!5¹>^æÿ¿©¿kÚ›™áZYQTU‘&oO6¬í¾°2>l` £‹Š*éx…üºÁ°aTwí7Õ¤G¶¸ é&U­åë¾Á‹ÉàZ• +¤ãeðë2hÕO&P†‹Ý¼¯w®0v)ÊÎØt–3¤ã9ûuÎÝÝz7™(=Îs˜_ûBïØª(ld`cçYØŽ‡í× `÷{FGØÛ¶¹mÖi„ÞïZ• +¤ãeðë3FSåÝt°ÿFºš?ÄgŒ›Å]“m?ü»YîÓå…) ‘ç6¾Ð´cÔÑ IzéX/‚ºþ ÑQFUlj~->53ËvÚSËtŸð“„±¡Q% Qù°J@:^ ¿n „1¢²£ËízÛ¦ËÆ³†‡¡“Q¦8ÆÀŠ0%ã=ðŠt¿ôª4NƒO×Ûö.ið, †NF5˜â «Á”Œ×À+h ´(ê¢>ñ »iöé–!àìZ iì¼TŠF éxÖ~ݶÔBÊÚƒ½K°g`»VEaC ;φt/Ï­¤mà ŒëR”32œ±é,gHÇsöëœUwYϵ8Ï\ d!ªÊ¦ÿ¯ÜUU« ¤ãUñëû†ª®»oDç§äö õ!dn¯@æÂè.c²éŒ'ËUeû™_Ü- ¤Ý£bna:Ö­ nè–-…*‡CŠïI߯–é ”³Ï[”9,ƯgȈ䢢"A:^$¿®=Sú°ÆeFI²Õæãj·ú°nÒ#(Sw¢|!á‹Í–ÊÐ|!ÏׯðU‡¥,=ò]Ì’M{‘_ ƒkeTdd@2¬ Ž—Á¯È Ë[ƒ ÛÝjþþ$Éð2¸VFe€@F$ÃÊéxüº ùaùKÈ-Ò‘5š¹ëX”92Ì€T–féxæ~]Ÿ¹¬k]sê¡§RŠÒÊ—uÁ§ØŽ‰±Å@šíI£9¶˜ŽeÔ Ø–‡%ªã)§ûv{³I-májlnTdô@V¬Ž×ïÜ1ÊþÅpLâÏñÕˆŸVûtÇxî;F©(eßÁ@F$ Òñ"ùuƒqFõÓa#í>=yÆqÆ57ª2z +VHÇëá× Æ™Z mÍq ùK|aª]<6›Í>݆ÉäÕ=Ï6q]Šò…@06]ªj–0d"ûÕæw·rB«á1Éžñݶ?HLÒ§_ÖLŒâ:v&Æi®'&¸b&ŠkPàZÉþ:¨×fó1mŒ|ýÆÈØÖ¨ÈH”() )…_¢<울Y¥çVÿKW|×ç¨$Sã@£™ò†x¥AŠ\”…›¾Ý6ëõwï2môÛ_ÌnŸÙª|ïµñnªJ”ªïºkÖ<æ1.ÃÀ€s˜îø7yhWÿ˜—Õ'uçp»8¾n˜®¯ûí4ÿÓ‚Ô|U?§uäí-!¶Í…2ÅqQt·nšûìzîQë´–À k®‰Q Q™P @&R¿¡€®»_´Bƒ›ýjv HÞ®cQÞÈðFoÈDòö«¼Uô´8npÒ»OéȈàZŒTõ¬‰Á¯Fˆ +QTûwÛë}¶»]\Í~:súÅ?r‹ò†@†7 xC&’·_àÝ×-ìp­¿_,Ó–ÒùV»ÆæFÕ€@F dE©™H5üjój躅±Ã–Ò¾i›íã*½³÷iÓÀ±‰10Và„ ¡f¢ªçt^!WÇ îKî¼Âñž{¿ºk²Uÿj×f·§>“7‘O"XÛoÄ·¨01ÀE Ðù¬‰4À¯F ý'7 ‡Qöíb³›ÿh†4p =Œ 0Å1ü…ÊCÒ÷Jðµé—ÏËSúÝï÷²M¿Ú= ן(YdÐb»¥–³l! ׯFÐí7©óa“e¢;ûÆÞ×»c9v)ÊÆØtŠ1d"ûÕˆ ¸ª­°ÅðQ>‹8|XõïäÏ®·Ë‡]:}êË ªþD~_äÁ@Z†1Š‘3Q2ÕæáUÙŸ>Ïåšzº˜3 ¸&F€@FdB)™Hüj„E.L5¼ÓdT Û¶«›¹[»WqähìI”(2D±ÅQÈDõ«DMÿÎܺpD›ã™”¬¡Q»˜™ªW¥Èóoo'’¤ç~þ(=dèa;¥V³ô IϯFÐÓÝýµžÿzíÃ&Ͱ{®?QºÈÐÅvSt!IׯFÐUݪz¼à^·Mó¹Iܧ]p]£ @ £2¡€L¤~5BYõg·Ç îíþn}h·»¹™×k:28v&Ê®ØhŠ+d"¹úÕ®yÙŸð.×ã¸~µŸö«íšU ¥d"ð«Í+ ë²_A¯Ý÷‹M³N{æÏ™‚­Œ‰€´'d¤Ös"`&J„ !BUô‹©jáê:û¸jçFø×»6v)ÊÆØtŠ1d"ûÕÆÝ­°VãÙ~ÑÞ¤O6{âpïz`Šcø ÿ”‡¤ï•"à‡ç䆋ýÆíož÷Ó+¿]ú$o×¶(pdˆ#©Í,rÈD2÷«ЭíWêî¯sïmM…<ù2àÚ•)%d"¥ð«R#Êbxå(E6ÿµt> endobj 1283 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 669.9832 297.0286 675.7616] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1284 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 659.4062 297.0286 665.1845] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1285 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 646.8366 297.0286 654.6074] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1286 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 638.2521 297.0286 644.0304] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1287 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 625.6825 297.0286 633.4533] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1288 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 615.1054 297.0286 622.8763] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1289 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 606.5209 297.0286 612.2992] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1290 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 595.9438 297.0286 601.7221] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1291 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 551.2593 297.0286 559.0302] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1292 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 540.6823 297.0286 548.4531] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1293 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 530.1052 297.0286 537.8761] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1294 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 519.5282 297.0286 527.299] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1295 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 508.9511 297.0286 516.722] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1296 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 464.0126 297.0286 471.7835] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1297 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 455.4281 297.0286 461.2064] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1298 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 444.851 297.0286 450.6294] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1299 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 434.274 297.0286 440.0523] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1300 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 421.7044 297.0286 429.4753] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1301 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 413.1199 297.0286 418.8982] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1302 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 402.5428 297.0286 408.3211] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1303 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 391.9658 297.0286 397.7441] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1304 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 381.3887 297.0286 387.167] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1305 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 368.8191 297.0286 376.59] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1306 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 360.2346 297.0286 366.0129] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1307 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 349.6575 297.0286 355.4358] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1308 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 339.0805 297.0286 344.8588] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1309 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 328.5034 297.0286 334.2817] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1310 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 285.8114 297.0286 291.5898] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1311 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 241.1269 297.0286 248.8978] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1312 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 230.5499 297.0286 238.3207] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1313 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 219.9728 297.0286 227.7437] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1314 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 209.3958 297.0286 217.1666] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1315 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 198.8187 297.0286 206.5895] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1316 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 188.2416 297.0286 196.0125] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1317 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 177.6646 297.0286 185.4354] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1318 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 132.7261 297.0286 140.497] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1319 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 122.1491 297.0286 129.9199] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1320 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 79.2031 297.0286 84.9814] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1321 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 682.1419 522 689.9128] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1322 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 673.6142 522 679.3926] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1323 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 663.094 522 668.8723] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1324 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 652.5738 522 658.3521] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1325 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 640.061 522 647.8318] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1326 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 629.5408 522 637.3116] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1327 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 619.0205 522 626.7914] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1328 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 608.5003 522 616.2711] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1329 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 597.9801 522 605.7509] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1330 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 555.4489 522 561.2272] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1331 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 544.9287 522 550.707] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1332 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 534.4084 522 540.1868] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1333 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 523.8882 522 529.6665] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1334 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 511.3754 522 519.1463] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1335 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 500.8552 522 508.6261] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1336 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 492.3275 522 498.1058] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1337 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 481.8073 522 487.5856] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1338 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 469.2945 522 477.0653] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1339 0 obj << /Type /Annot /Border [0 0 0] /Rect [488.7222 459.0233 502.5453 466.5451] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1340 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 459.0233 522 466.5451] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1341 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 448.254 522 456.0249] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1342 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 437.7338 522 445.5046] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1343 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 427.2135 522 434.9844] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1344 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 418.6858 522 424.4642] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1345 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 406.1731 522 413.9439] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1346 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 397.6454 522 403.4237] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1347 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 355.3682 522 361.1465] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1348 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 344.848 522 350.6263] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1349 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 334.3277 522 340.1061] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1350 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 323.8075 522 329.5858] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1351 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 281.5303 522 287.3086] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1352 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 271.0101 522 276.7884] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1353 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 258.4973 522 266.2682] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1354 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 247.9771 522 255.7479] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1355 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 239.4494 522 245.2277] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1356 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 228.9291 522 234.7075] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1357 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 218.4089 522 224.1872] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1358 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 207.8887 522 213.667] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1359 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 195.3759 522 203.1468] /Subtype /Link /A << /S /GoTo /D (133) >> >> endobj 1360 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 184.8557 522 192.6265] /Subtype /Link /A << /S /GoTo /D (133) >> >> endobj 1361 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 174.3354 522 182.1063] /Subtype /Link /A << /S /GoTo /D (133) >> >> endobj 1362 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 165.8077 522 171.586] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1363 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 153.295 522 161.0658] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1364 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 142.7747 522 150.5456] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1365 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 100.2436 522 106.0219] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1366 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 89.7234 522 95.5017] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1367 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 79.2031 522 84.9814] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1282 0 obj << /D [1280 0 R /XYZ 90 720 null] >> endobj 1279 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F31 44 0 R /F8 1208 0 R /F2 1212 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1370 0 obj << /Length 554 /Filter /FlateDecode >> stream xÚí–MÓ0†ïý9¦‡Ìzü56G$*Á9â€Ú¬¨–&¨-¢â×ã|´qâÄb¥]ÔCÛôͼÖs¯ma¹º(Tàk 7zà;ö¦ }¾$@3òð~ù\î¾!\e@IzŽt‡’YÖ]§Q÷ºi¯íQÐ}±8ç‘i€Y `dµÇùT\¾'0»ÀHõÈñߣðÏfq_;¶ÈÛF€û¢Ä½rqäc_â JRó+tÁA)Þ¦ì}‹z 7ŒÜLÚö‰s¹¯Ž‡0\6Îñ¥$âoŸºG&|9Bž0¡«j1B^¹x„ƾƒt¸å,¡Ž¥&$Ù¾ÜN<;¤’òùˆ(~Å i»´Ütñå ,7ƒ¿Þçö‚f勯=tâÀ´ñ˜ŸŠórN+õKc]zd]Ðë"ü= søû:³ôGVáÑÓ ˆQëöaft{.Év¢ý¬ª©ÉÀ áÿÉñØüĈ Ø ˵Ò“šœ¿Óöý¥ endstream endobj 1369 0 obj << /Type /Page /Contents 1370 0 R /Resources 1368 0 R /MediaBox [0 0 612 792] /Parent 1200 0 R /Annots [ 1372 0 R 1373 0 R 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R ] >> endobj 1372 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 684.1345 297.0286 689.9128] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1373 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 673.607 297.0286 679.3853] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1374 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 661.087 297.0286 668.8579] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1375 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 618.5032 297.0286 624.2815] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1376 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 684.1345 522 689.9128] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1377 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 672.068 522 677.8463] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1378 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 618.5032 522 624.2815] /Subtype /Link /A << /S /GoTo /D (136) >> >> endobj 1371 0 obj << /D [1369 0 R /XYZ 90 720 null] >> endobj 1368 0 obj << /Font << /F51 9 0 R /F31 44 0 R /F8 1208 0 R /F2 1212 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1381 0 obj << /Length 2242 /Filter /FlateDecode >> stream xÚí›]sÛ¶†ïó+tw¨™#⃠ػÄv\ŸãL¬Ì™NÛ Úflµ¶ä‘e{üï» ÔÒ@·IšIªÉLLQË]ïCì.@óQÿø¨ÊG¥”¬Re9:¿y•·§ÅÛ£ XL¨É›é«ÿ¼-øˆç¬Ê+>š~ܰJWåÚÕôâçl6þuúßW{ÓÎU!ÄP04ÙŒVŠ/™à…Âhð i£—ª°q¦ãJfõÙõ˜gÍx"Ë"[|t?wàÔb>–"[5ðƒg+8q‡¿–ó©˜TZ O¸GÅY®4·.œõr<à‹g÷ç+ü4[àÿsç…ß•:Ûo¬á ^ô0ÃãæÑE1!Q¸©à˜ãÝb”ÀR—î‡î}úÄ“ŸÕþx&¤‚±ªd.GZI–£P) Â~MÔìì&Ô°“t=0›q|ÄFÜ"ï… „&CÑ  ·Ì+cãìZÉîœÜ³³ûžÐaš+ýÍ©øwÿ‚QjüàRC “ÔP5eâ)JM:PS”†IÉ¥³c¹Ågþ ¦ËÐü2Ä‹,çU±åå Ì@$C,QÃK=Uˆ%ê)ÆÒ@4dI¬*„K•ûÇ0“¨ìp1:=Ý{ï2Ì»€Ö›Ãƒ—hà`ïøt/™(rf„6#eQMü­ jB “šÐ±*‚šOQMžGë1y°Ò¦®b‚o„Û¨Ž”†è%wSç³»•-¶—Om>ºŠißjŒ½wž=ø:…ãÙ¿îœù®•ýךkÛ©ßZýýš@¨šÒ0¯@Ý©¦6ô’Ìè¼XßuL¯ÖnB C…Ó†C«Þs°¢¥î¢š=yJqb€Ê×F|}ÏÖÕb|lªªª¶EÓ7Y4u3‚×{pŠ!†É)†ÄøWQ\Ÿ‡ÛœbxÁ”Â:½‡Üë|nž±+@ÍEÛƒ]׫î|›6BK{Ð~åJ|=~t¶ò88[ÃälE±³U°h¦î¢ò§C‚üÒHÈARûr´lWuýª/j¿tË€‹ûùyãzð_¸Tû=Ý.øÚôòˆçƒ©DæL«¯FL½îþ‡Ô£†)õzjÕ ÖƒÔ]L½¨ÚOËp¥Íñ/ê”Øû —G‘óš "G “ÈQTðO飼(réprÀ†6ܧӪK¦íÊÏŽÛ#»©ç¶&Œ›|û&ù_]Œê”‹&Á¢R«à]ÔU¬t8VeX!sŸ]yÞ‚õ¿æéÌ- ÔËvìÔ½šŠ;´vyW'ÃKŒX¤)i¶oª~b+éµ"‹Ø¥À¢R«àÎq´Æêкh endstream endobj 1380 0 obj << /Type /Page /Contents 1381 0 R /Resources 1379 0 R /MediaBox [0 0 612 792] /Parent 1200 0 R /Annots [ 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R 1404 0 R 1405 0 R 1406 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R ] >> endobj 1386 0 obj << /Type /Annot /Border [0 0 0] /Rect [441.9303 643.0884 450 653.051] /Subtype /Link /A << /S /GoTo /D (2) >> >> endobj 1387 0 obj << /Type /Annot /Border [0 0 0] /Rect [441.9303 610.7098 450 620.6725] /Subtype /Link /A << /S /GoTo /D (3) >> >> endobj 1388 0 obj << /Type /Annot /Border [0 0 0] /Rect [441.9303 575.5417 450 588.2939] /Subtype /Link /A << /S /GoTo /D (4) >> >> endobj 1389 0 obj << /Type /Annot /Border [0 0 0] /Rect [441.9303 545.9527 450 555.7958] /Subtype /Link /A << /S /GoTo /D (5) >> >> endobj 1393 0 obj << /Type /Annot /Border [0 0 0] /Rect [444.5454 529.5144 450 537.0901] /Subtype /Link /A << /S /GoTo /D (5) >> >> endobj 1394 0 obj << /Type /Annot /Border [0 0 0] /Rect [444.5454 503.213 450 510.6675] /Subtype /Link /A << /S /GoTo /D (6) >> >> endobj 1395 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 487.9411 450 497.6381] /Subtype /Link /A << /S /GoTo /D (13) >> >> endobj 1396 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 458.1819 450 470.934] /Subtype /Link /A << /S /GoTo /D (14) >> >> endobj 1397 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 444.5331 450 452.1088] /Subtype /Link /A << /S /GoTo /D (14) >> >> endobj 1398 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 412.6526 450 425.4048] /Subtype /Link /A << /S /GoTo /D (15) >> >> endobj 1399 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 383.0636 450 393.0262] /Subtype /Link /A << /S /GoTo /D (16) >> >> endobj 1400 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 350.685 450 360.6477] /Subtype /Link /A << /S /GoTo /D (17) >> >> endobj 1401 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 318.3065 450 328.2691] /Subtype /Link /A << /S /GoTo /D (18) >> >> endobj 1402 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 285.9279 450 295.8905] /Subtype /Link /A << /S /GoTo /D (24) >> >> endobj 1403 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 267.3684 450 276.9441] /Subtype /Link /A << /S /GoTo /D (24) >> >> endobj 1404 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 254.2177 450 263.9146] /Subtype /Link /A << /S /GoTo /D (24) >> >> endobj 1405 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 243.1882 450 250.764] /Subtype /Link /A << /S /GoTo /D (26) >> >> endobj 1406 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 227.9163 450 237.6133] /Subtype /Link /A << /S /GoTo /D (28) >> >> endobj 1407 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 214.7656 450 224.4626] /Subtype /Link /A << /S /GoTo /D (29) >> >> endobj 1408 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 201.6149 450 211.3119] /Subtype /Link /A << /S /GoTo /D (33) >> >> endobj 1409 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 188.4643 450 198.1612] /Subtype /Link /A << /S /GoTo /D (34) >> >> endobj 1410 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 175.3136 450 185.0105] /Subtype /Link /A << /S /GoTo /D (34) >> >> endobj 1411 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 164.2841 450 171.8599] /Subtype /Link /A << /S /GoTo /D (37) >> >> endobj 1412 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 149.0122 450 158.7092] /Subtype /Link /A << /S /GoTo /D (38) >> >> endobj 1413 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 137.9827 450 145.4373] /Subtype /Link /A << /S /GoTo /D (39) >> >> endobj 1414 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 122.7109 450 132.4078] /Subtype /Link /A << /S /GoTo /D (42) >> >> endobj 1415 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 111.6814 450 119.2571] /Subtype /Link /A << /S /GoTo /D (45) >> >> endobj 1416 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 96.4095 450 106.1064] /Subtype /Link /A << /S /GoTo /D (46) >> >> endobj 1382 0 obj << /D [1380 0 R /XYZ 90 720 null] >> endobj 1379 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F97 1385 0 R /F59 1392 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1419 0 obj << /Length 2508 /Filter /FlateDecode >> stream xÚíœÛrdžïõ¼ xñœgVw%ÊJdÒ±iUª’T!— €P@ЦüôéÙÝ™ismPŽÂ-Uà¢Ñ Íÿ±»ç€eþ±ƒ†!H#98_>£Ãå?có)XL±É˳g_+vÀ(ihÃÎ.S¤Œ®Î.þ:™Ïÿ~öÇg¯Ï‚/Åy-š3Ù gø“DHÍ]8÷™!:Ftäá”1®&§§oàÙäÝáT99vÏç ÷غ+ ®4r²rÖK÷8ÛܸOøÕqc°{¦-áLIø@Îûs0Õ¦ÿ¡·~û÷êl÷â½±—0¦VS‡Tì^F»)6L¨°ëЖrKw‚+º7!¼3Ù ¹Í£¸ºD5M/>a’R:9Z]r;ùÉ=´ÝÓÍ.±É ²j°/+ 5Rc‘õ'‹•üíñßðå¾}ƆPP"(™cq0›"»;î:“"G9˱kˆµbYJ¤´ÂS8üûØó7»ƒÌ# ¹ì2à¿óÉfå~ÊÉ‹Ø.úç§ðôôÍ»þ ÇóE;<;´b²ZËÛ9k›f. üáû9pÎjé¤*&2,ª‰G8#'r•Õ³. ª áÑAP>z|è IÛËt2[¶é„b k„ÊÞÞžÍ U AÃÊg@C®² •ÃEÐÐ%MàL œ½?´Òõ*Пq›ùy÷< ›á¤±l„í‘ßž%pP° `´+ò‡€Èàeé+ÆŠðI¸ØèX¶äÀ—ÂæÐÛAññ-ðÉ`²åÒe¾àL/æËöúú­Ù¢¯[ï]Ýj×›9 |Þ5áIÄèæ‰‚œåË‹T  ê+–D ¹Ê2V!ã†X©b)U¨7ºuÙírv>ÔkÔÜ ì\¸‚»n;l:€V×ix”v5W<z²¼øñ®ò‚ ‹¼`3¼ WY^Êá"/0¯Ô 3:¢^Î\I\Ï®o.q Ü#ѳ2\‚+ëRÁd äúÉÍ÷²Äø¯ƒ ‹Ä` Oƒ\e‰)‡‹ÄPÐSJˆ11'¯z.Î\ýqÌôð,gÝb@7ûq/ÎK¥É@iâÿg}–?žUa‘,P†ä*ËC9\àAÁôK¸é—çÁ<¼œ»% ÙúcÅVI7$œ(käØZï³@yjxaÃ^[z§ñ®rxUÂE¼Œ"\òX š¯×MÜLþy8…Çö⢽èI[Á¥&?¶ç››¾Ó™]/µw›vÝa¹˜vfzòã!ë§~ç›ÞfÝ^¶ëöºPÒ¸¡*ùo_óÉŠæÿÓUÑaQ4<ŠJ$EC®²¢•ÃEÑ4‡¸<ÖFÕ^|€áþÐ+Ö¥h1jóææ)|L {M ^¡*aȰH–\É$aÈU–°r¸H˜´¤‘,VÆpãÚ±u·¹uÍé0ÛùÆýÕpøÍ¯¯’ qNd£Çúóp˜¼U˜a&¬®2I˜«,Låp~SK ELCíÀ’_|>ÊÈýú°³C°Ìl 8  7ºöT½JUÈa2,»N.þaWYÈÊábÆ´¤ÌSv­þ €ýðâÕóž©®®‹HÝÜO¸W—ýÏÿ¸¥œÙE7‹ZÌ ¡™-Òm 4ÔæR_€YÑý UEG†Eѱ Ñ‘«¬èåpQtÚiD÷ÉÅU£×nMîëç¾ëìÕîÚ¡«ÛÅÌÉ»ø8=v/ÙäzX–ómî²oPÿ•”&óR¨ÿÍtVl?XU±‘aQl<ú±‘«¬ØåpAlhˆ6Ô‘°½ôòå©Û”þË õMw>féZ¿·ÙÏaV·Nç‹nÞ|µõ‚{û]¦?¶‚ÀÇ4_x™ÉAµ6,A±¥’N.°bW9(*á" ³6¦}é¡hé8h×=ßwÍê¥ëR‹³!C„Ûl›Š}Ô— N•.dX¤ Ë­“«#ØU–®r¸H—éŽmÉ@—ßîqgZŽcÚ>8!ˆŠ,}® äªâ† ‹¸aýur]»ÊâVqSžhpó»EïÝjÜÑY_³ŽçCeË,Ÿ5€)cc ÛÃÛ³ y¡ª !Ã"hXy­’ !WYÐÊá"hR#tàÌ ]ì?9ÖÞ}"jŒpþyç=YÔ©ª¤E»"hHy­“œEGYÌŠ±"e‚eU¬žaöí׎³ï^Wj(£Ð%FÄöÓyIª8!Ã"OXc\JÄ®²D•ÃE¤˜‰·ŒÒoW½=qP}b…´Îɸpøø›ïA®*nȰˆÖ_Û$nÈU·r8&$±‚A8 ŒÙ˜À`±ˆÜÀ›Ëdw³å‡\ã”p­Ç2YÌLÃPWI‰vEPr&¹4…e1)Æ II@Ä ŠÅ¥g¿ûîí²xi¨ÓÒ#B”ªQ† K˜mIŸæ »ÊV I3†4–ÇÆ=nËÞC-lp¤Q³Æ=ÿGYQ UC†Eưè&¹¢Š]e+‡‹ŒiWüxDÌ塚qýº;ä¿~ø¶Ú¸BÙÈØžw¯JªhWd ‰l’˨ÈQ–¨b¬”bD[†Ê£ß¸y ½uIÊ¥®£7ßE¦ŠÙ‹1MLÚ­_ “W¤J2,â„%Îð„\e*‡‹D K” ¨ ú]Ÿ£S·óûkÈO†Z¸{Î$ •û§O¼ýÊãG¼J 2,ƒ%̃\e‰)‡óGWD˜ðÅzŸNºÿ©£âª]õþáô¼c'uí^Ê}åž N”‘ãѶ_¼>U¼a/,¸InÜ`WY¼ÊábBbœpÞø¦I„ÃGÅó¸}µ;Ýf,sGƹá'¬9-ª,!Ã"KXÜ KÈU–¥r¸Ào ®±*°äûï·ËÙUû°šFÑóÒ~zð L,lX"kKê4YØUެJ¸H–UÐâ˜PCÜý2âC ƒ©)¿²ÿ¼Ua$¬¬IîÂ`WYÊá"H†cL,w2~Gqè§îK1Yë²ý”te÷ÉžœÉbã‡½Š 2,bƒu4ÉÝì*‹M9\ÄF5Ds+›?Mu>[†»ƒÌÒ·n!~Ì1¿S”«’‡ ‹äalrݻʒWÉ“šH£l Ϭú¹; |Ñþ9s?fìØAý^àyáªà!Ã"x˜›\wÀ®²àÝ·s#GÎ Öß6`¸‘ã‘Ër·7›î^˹{üÅÝõ¡û †¢lòC`ߺQr"E8…N®\S¶r½ÚOn¹¢ØÝþ>£ ïùC¯È¿Q&øôö="%…ÿµŸã‘¹û8†‘«ÝÇ–îã¸%…;ƒ4I~»‹ºÿ°÷ endstream endobj 1418 0 obj << /Type /Page /Contents 1419 0 R /Resources 1417 0 R /MediaBox [0 0 612 792] /Parent 1200 0 R /Annots [ 1421 0 R 1422 0 R 1423 0 R 1424 0 R 1425 0 R 1426 0 R 1427 0 R 1428 0 R 1429 0 R 1430 0 R 1431 0 R 1432 0 R 1433 0 R 1434 0 R 1435 0 R 1436 0 R 1437 0 R 1438 0 R 1439 0 R 1440 0 R 1441 0 R 1442 0 R 1443 0 R 1444 0 R 1445 0 R 1446 0 R 1447 0 R 1448 0 R 1449 0 R 1450 0 R 1451 0 R 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R ] >> endobj 1421 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 710.0373 450 720] /Subtype /Link /A << /S /GoTo /D (50) >> >> endobj 1422 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 693.599 450 701.0535] /Subtype /Link /A << /S /GoTo /D (50) >> >> endobj 1423 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 678.3271 450 688.0241] /Subtype /Link /A << /S /GoTo /D (50) >> >> endobj 1424 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 667.2976 450 674.8734] /Subtype /Link /A << /S /GoTo /D (50) >> >> endobj 1425 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 654.147 450 661.6015] /Subtype /Link /A << /S /GoTo /D (50) >> >> endobj 1426 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 640.9963 450 648.572] /Subtype /Link /A << /S /GoTo /D (51) >> >> endobj 1427 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 627.8456 450 635.4213] /Subtype /Link /A << /S /GoTo /D (51) >> >> endobj 1428 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 614.6949 450 622.2707] /Subtype /Link /A << /S /GoTo /D (52) >> >> endobj 1429 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 601.5442 450 609.12] /Subtype /Link /A << /S /GoTo /D (52) >> >> endobj 1430 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 586.2723 450 595.9693] /Subtype /Link /A << /S /GoTo /D (52) >> >> endobj 1431 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 573.1217 450 582.8186] /Subtype /Link /A << /S /GoTo /D (53) >> >> endobj 1432 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 559.971 450 569.5467] /Subtype /Link /A << /S /GoTo /D (54) >> >> endobj 1433 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 546.8203 450 556.396] /Subtype /Link /A << /S /GoTo /D (57) >> >> endobj 1434 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 533.6696 450 543.3666] /Subtype /Link /A << /S /GoTo /D (60) >> >> endobj 1435 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 520.5189 450 530.2159] /Subtype /Link /A << /S /GoTo /D (60) >> >> endobj 1436 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 507.3682 450 517.0652] /Subtype /Link /A << /S /GoTo /D (60) >> >> endobj 1437 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 494.2176 450 503.9145] /Subtype /Link /A << /S /GoTo /D (61) >> >> endobj 1438 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 483.1881 450 490.7638] /Subtype /Link /A << /S /GoTo /D (62) >> >> endobj 1439 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 470.0374 450 477.6132] /Subtype /Link /A << /S /GoTo /D (63) >> >> endobj 1440 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 456.8867 450 464.4625] /Subtype /Link /A << /S /GoTo /D (65) >> >> endobj 1441 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 443.736 450 451.3118] /Subtype /Link /A << /S /GoTo /D (66) >> >> endobj 1442 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 430.5854 450 438.1611] /Subtype /Link /A << /S /GoTo /D (67) >> >> endobj 1443 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 417.4347 450 425.0104] /Subtype /Link /A << /S /GoTo /D (68) >> >> endobj 1444 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 402.1628 450 411.8597] /Subtype /Link /A << /S /GoTo /D (70) >> >> endobj 1445 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 391.1333 450 398.7091] /Subtype /Link /A << /S /GoTo /D (70) >> >> endobj 1446 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 377.9826 450 385.5584] /Subtype /Link /A << /S /GoTo /D (71) >> >> endobj 1447 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 364.832 450 372.4077] /Subtype /Link /A << /S /GoTo /D (72) >> >> endobj 1448 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 351.6813 450 359.257] /Subtype /Link /A << /S /GoTo /D (72) >> >> endobj 1449 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 336.4094 450 346.1063] /Subtype /Link /A << /S /GoTo /D (72) >> >> endobj 1450 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 323.2587 450 332.9557] /Subtype /Link /A << /S /GoTo /D (73) >> >> endobj 1451 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 310.108 450 319.805] /Subtype /Link /A << /S /GoTo /D (73) >> >> endobj 1452 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 296.9573 450 306.6543] /Subtype /Link /A << /S /GoTo /D (73) >> >> endobj 1453 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 283.8067 450 293.5036] /Subtype /Link /A << /S /GoTo /D (77) >> >> endobj 1454 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 270.656 450 280.3529] /Subtype /Link /A << /S /GoTo /D (78) >> >> endobj 1455 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 259.6265 450 266.6568] /Subtype /Link /A << /S /GoTo /D (80) >> >> endobj 1456 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 246.4758 450 254.0516] /Subtype /Link /A << /S /GoTo /D (82) >> >> endobj 1457 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 214.1969 450 227.3475] /Subtype /Link /A << /S /GoTo /D (84) >> >> endobj 1420 0 obj << /D [1418 0 R /XYZ 90 720 null] >> endobj 1417 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F97 1385 0 R /F59 1392 0 R /F55 36 0 R /F84 667 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1460 0 obj << /Length 2730 /Filter /FlateDecode >> stream xÚí[o¹Çßó)Ô7ùA ï—EÛE7»I³HÐ`× }P$Å"Y†,' ¾äÌ<ŽxHwÇvv RFgÎÍÿÇsx…M¨ÿÃ&ŽNŒÄIc&‹í#:~÷ˆ ïfÞbM~8}ôø©bF‰£ŽMNßLãýûdwºü÷t½^ŸüçôçG?&gŠóV¸`rÏð “DHÍC¼pÑ><Ft‘ôÉŒ1®¦?ù×éo‡Õ>¼žÏ7'3aÔôåοòéòj¯.ÃE=~ê ôÈ”$ÜZí¯!8üÎ[jÓ¿èkÿú̃_ÔYëà'7_ú›j5UùÞù»ëuì> $»4,Èpì0Ü;î²: ®èµ¸åƒÉqÈë¤1*=r¢ ʹ^}Â|HJéôï»n§¼ÜBzzÎýk‡‚?öÒ¿÷4x£å•»ñ0tÇŸŸ‡½ñ›ùbÕú°>¼ ïÄô™·\…/µÛ«÷ëÕ‡!åà¥qe‰ÔT@„ôQ(þ«er$°#Ô_Nº;˜¾ƒÙ Øîõ‘»NÝ¢²À&l=VÒÕR"¥š5ჰ–óíÅf‡ù[ ¥œþê¯óáI^ÔŽúæ¬üŠÚ}þ 7!ÞÎ& À°ŠÔa¸Ba¨‡K4hC¸3z A 4ðÏ¡áZcçÓ§¡‰ÿã——¿ömÿÉ®Ï ûpÞàãÕ wÓùùjS$)¤GÅ3&SÔ%+êÓD VÙ‚‚;Q„ ¸B骇KxqC¬T1Y+$Y‹!Y§ìܧfÑJÍbúÃzöãz;c‹Ãz—Î}²Ûú¾™™†Ï׋yølÌÎÄìì‡'ÚÉt}aµ E»J®Ð6T—ÚeDIɇ6¤‘6$ËžÓÅæñ黡5 MÉ[\m†ÿc×p¶»óËÃÞ7‘ÐVÎúO^­¡›ónúJg¥–#¨#š9Ž$ùÂPS Ÿ2Ò‡šÝ õøÔa¸ FyQà ¤/ ¢¬õµM¨A3‚äªçþÎÎ7›ÐßÄ2ã”Ø±Xþþb9p„i k`]SšQ] úÂÀjÄcÌk›(£—‰ãYþy7ù™Øè¿u6üÐÁþ1؈·¶É0¬²µÂؾP6>w4ß­|HJYß—7Ã|÷³ ð“ß…yn==t93^ízNëg,;“'ýÁnx7?_öæ/æçgWó³Ui^\øn‹R¡Ã¬|=¤üš¿Û ü®ˆqÔN3„jÆ0D£Ý –ææöˆåmSàÅôÓ˜H§‰R¢9ïGW¹° siïÃ_«~Z-$¥4ÑðÏË.µ-‡4v;­][ì»iˆ¡ƒÚÙÿ-ŒÏ®¶«>áqç“]ß¾?^øÔhú±âeq,èÛœQêv{bh&Š·¨™‰€a5Á{ÎhYbà •¸/J,­!ÒðAáX¡ž=yÑ‹öKwÛßız´õ]vê• K+Wëe÷q©8 F$ýÆŠÓí® 8D}Zx»]Pnæ“H.à c«,u€¤ñiŒÇRGxJ *LCw›Žã©{ómQ$£¬M&aJÈ F%ð…bY—¹ÔŒ0CMâ’<òk< â3`\Iüs YK¾±±ØÃä5êÜVA…à` _(¨õxTi Mµ9-›þ¥Ä¢DIÎGï/޽šM“YÅŒbòƒbX‹”!ôCG«]®â²-ÿ:fˇ‡gÔ¹ (0¬" ÁÁ ¾PLëñ2¨œìN Æ•Ëï‹ÝMG¤b#÷¿»emr «\BN0./”Ëz¼Ì%µDiã—q5ðû"˜Rk”Á¼»o‹¢•l¢ «(B40/Åz¼„¢pŠHfr-7íZþß±–?¸Zžtn k ^úÂ@mÄË Z?*×:×r;äÌ~…´˜7 ‘–yóæÍ¤fG`XÅâÁ+â|¡8Öãeµ#Œ©\Â]Ä1L„/K8*o$4q¼ƒo‹relr «B.0/”Ãz¼Ì¡RÄi•§„ºuÀÄ âlöNöërû°V³^—cœÏ§a›ñÈæï?e,JÔd VƒšcŒ_(cõx™1ÙÑ¡2cqÙæuØ‚²ˆ½ ˆ-v›Ý¾Ø9Ô„ îF¼n1“E‘š”Ã*ePuŒ2à ¥¬/SÆÑZØL?¦ì¬{Z窫±³õ6mm9~lAY3ŽGnÒ‹·½É 0¬ruĸ¾Pnêñ27Ì‹í³KæFn^w[Eº*ø[¨‡Ý†,M9F¸•rÄæ6ª`”©É0¬ruÇ8¾PÎêñ2gT¡9¨‚²ÁYØü²Ÿ÷Ï-—i“BEñVh‹b5i†UÚ úmÀJ[=^¢;J8c Ƶ‹Å|›v^ÍK\ß«ówäêkÍ­%­Z°AÃl×Äg¬ø$ ô…ÁÖˆ—a3`#i›.Áv“¤Æ(#šòqÒíÿ;EËÔ÷ g´Luÿî±ÃZ¦½_¸/£¥qŒÊŒ–AÑ ûÝE+ž@©ú2TEQšTÃ*UPeŒ*à ¥ª/S¥(1ÊêhQªÒå~úËZÌŒ X_Н(O“/`Xå êñ|¡|Õãe¾„ñUÌ‚è_Å‘£ê&ôÈÏ×ü¶(~Q½&~À°ŠÄÃøBñ«ÇËøqI¤²¹hò8©¿XbøYGGüî~Q½&~À°ŠÄÃøBñ«ÇËø1F5`7|œï_lú§RûŸ(‘è ¸vb$ñn¡O 6†U!‚ÀŠ`=^B9K˜Ƶ€Å.>âŠ-³Ûn·ÜØ•»Åµ¦¨N‹.`Wƒ аHFð…ÒW—èsœ8År­ÀWÙ¢ÅÈÝÝÏ–DõZô»|„=à C¯,‘gü+¥¹Ä È»Ú^ÌB⛟/Óhã²> endobj 1462 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 710.0373 450 720] /Subtype /Link /A << /S /GoTo /D (85) >> >> endobj 1463 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 693.599 450 701.1747] /Subtype /Link /A << /S /GoTo /D (85) >> >> endobj 1464 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 678.3271 450 688.0241] /Subtype /Link /A << /S /GoTo /D (85) >> >> endobj 1465 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 654.147 450 661.1772] /Subtype /Link /A << /S /GoTo /D (89) >> >> endobj 1466 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 638.8751 450 648.572] /Subtype /Link /A << /S /GoTo /D (93) >> >> endobj 1467 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 614.6949 450 621.7252] /Subtype /Link /A << /S /GoTo /D (93) >> >> endobj 1468 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 598.817 450 609.726] /Subtype /Link /A << /S /GoTo /D (102) >> >> endobj 1469 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 588.3935 450 595.9693] /Subtype /Link /A << /S /GoTo /D (106) >> >> endobj 1470 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 575.2429 450 582.8186] /Subtype /Link /A << /S /GoTo /D (106) >> >> endobj 1471 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 559.971 450 569.6679] /Subtype /Link /A << /S /GoTo /D (106) >> >> endobj 1472 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 517.0611 450 526.3064] /Subtype /Link /A << /S /GoTo /D (108) >> >> endobj 1473 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 498.5015 450 508.1985] /Subtype /Link /A << /S /GoTo /D (108) >> >> endobj 1474 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 487.472 450 495.0478] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1475 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 474.3213 450 481.8971] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1476 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 461.1707 450 468.201] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1477 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 448.02 450 455.0503] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1478 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 434.8693 450 441.8996] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1479 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 421.7186 450 429.2944] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1480 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 408.5679 450 416.1437] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1481 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 394.5082 450 402.993] /Subtype /Link /A << /S /GoTo /D (110) >> >> endobj 1482 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 382.2666 450 389.8423] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1483 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 369.1159 450 376.6916] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1484 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 353.844 450 363.541] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1485 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 342.8145 450 350.3903] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1486 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 327.5426 450 337.2396] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1487 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 316.5132 450 324.0889] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1488 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 303.3625 450 310.9382] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1489 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 290.2118 450 297.2421] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1490 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 277.0611 450 284.6369] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1491 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 261.7892 450 270.9407] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1492 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 250.7598 450 257.79] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1493 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 237.6091 450 244.6394] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1494 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 224.4584 450 232.0341] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1495 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 211.3077 450 218.8835] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1496 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 198.157 450 205.7328] /Subtype /Link /A << /S /GoTo /D (112) >> >> endobj 1497 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 182.8851 450 192.0366] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1498 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 171.8557 450 179.4314] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1499 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 158.705 450 166.2807] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1500 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 145.5543 450 153.13] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1501 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 132.4036 450 139.9794] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1502 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 119.2529 450 126.8287] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1503 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 106.1023 450 113.678] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1504 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 92.9516 450 100.5273] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1505 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 77.6797 450 87.3766] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1461 0 obj << /D [1459 0 R /XYZ 90 720 null] >> endobj 1458 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F97 1385 0 R /F59 1392 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1509 0 obj << /Length 2455 /Filter /FlateDecode >> stream xÚíÝKs¹ð»?…ŽÒƒWŽ©ìö°'Ý’hil+¦HE?v?}0CaðW„nØÖË© ¶Ê¦´ÍnÛý+ƒÁPêD¦ÿÔI”'ÞïO.®ßÈ»o|£î^­RÄ Cþvþæ/¿Zu¢¤ˆ2ª“ów'V¡•V%Õùå?N¯>Ÿýëü·7¿œ/¹¬Ö­jSH«œRQ„àã‰Oߔƛ¹œZ}¶RRÊÓñâLûÓgêt7ý!R†ˆœʇ!•œÞù×ô&玿ùüêùßð¿ûöÿR0¤î:ãLi_jsjðü¿Â·ÂÀЇ‡ §®*5<¨lå½¢SH«ÞâÏE—^8_ü™ìïzw¶ÒáôòS"¸WéÛ§›q½¯iTÒ‰Á¤ïuŽò´´£å 9O÷úKxÂ\”§F½â)á+œ†Óez9N/þ)ÓŸLnǪ-¥„õiPí¶ø¯HTw=iš*q,)h1%ªd"A±ÅŠ'/… æGû] .뢼:aw|ÊíhZ‚@ö—Ò¹HN|½âÉú4Q 0@9ÆÓÕí~új»M¿\mßW-é(†èúBŒò¿z“ ²l°ÈE²áë6à t0±°ñ ››ôr}ø@-”ÒðÓ‡žÇ.”rC𢠅¦DA.R_¯ˆ2J(c`b Œ¨}zùi[•^e:¨§Y+å¶4]A ë ûL¹‚\¤+¾^q•Ö61h˜à"ãêv·?ÔU)µìÃÔ©ÊMiª‚@VvY)[U¹HU|½¢J"Uæ¿ArªkŠ•ƒsýRî±³_nGÓ²ž°¿”'ÈEzâë-žlTÂ¥‹'Åx:LÓßz{{=¯ÉÓë:.m…¶}!þ ~–þ– äüÜë'ásQ~õŠ„5Ò?˶ùíŤd½©î%9/‚B7ò:;QKÛšî u‡(w‹tÇ×+îœM—~1wËvùç³4jÛé×ÃêãüÅñÛšÃ(Elgøˆ·“Ær‹šÆ 5†=§ŒA.Ò_¯³ZhanªÆæÙðn²œ÷=kάˆ}½õƒo'…å5…A + ;N ƒ\¤0¾^f¢>Àìi«Ân®.¦k²Bºpè7üžu×tiSӲΰïJ¹ª3ÈE:ãëgiEµ‡ÙÒÝwV¿JtFXëû õº×˜Kóšú Õ‡(}‹ÔÇ×+ú”Þ{Uô-{ö_¯ªðlÚDÕá½äß–ô—Û×ô¬?ô@ùƒ\¤?¾ÞâoˆQ8í†âoÙáÿó¸lÛ]×úù¸CßÐé{ÛK¿Zà0wsQàõ ¸àÒgËY®!oý¿K×ûq¾ý“ÚqCè#ß+í‹,kÒƒ@–R èA.’_¯ÐóFmË\kóý÷ãîz\6qÿ¨^JXtì—Ïx)±ô§ Y`Øp ä"ñõ 0'…òC™L­`ÓIéÏÓYÚ—ÕçeûmBw›oìêwÐõ |ŒýÆÁ·Ì‘¹ MGÈ:¾RŽ 鈯W ÓÑ?SæH›oL'í/Çéàà–ÚMóónZ_™=ùÛIn¹[MnÈrÃöSÜ ɯW¸¥Âžî°æž¶ÍxèÐ~ hw}j:+q,3h»R¾ª¬d"‘±ÅŠ1-…× €lž7gÓ¡ÄÚº_¥·š¾ôzÝ­¶¥ƒM~ÈúC@ÈE äë‚Ò ë̪æã¦:Ö¥+ -û-ù—ër³šÚ Նݧ´A.R_oÑfâÈÀµ¦l·ùö‡q_ Ù¯§+‚/õ3iVhûí†Gb¹+-UÇ¡Â&¦ EŠ/VD%´—0…æ[Óeã»›´tÆô³WüÛ’s7›!µˆ<(Œ‹ÔÈ×+]é‹r†Ûฆ¹«·W‡ôÛ<À}™Æ¶õž{HI ý8÷j¹MKÈZÂÞ*ª– i‰¯W,ÙÔzÊÉmÑÒ4S~:¬ûõ6Ož›õ$kWÎ[9at쫵ûЄ,$l, r‘øzÒ DP¡Ks!Í'†Ò’ëxþŸXè{û¦Æ‹-ô—Ž5ÉA K Pä IޝWÈé œóetyÓ3Ïuã<^­.6»ùÅX²¢Jj×Ù=Ã¥AMaÈ ÃŽS )Œ¯W„)+¬revt„íÖ—}Óì§½ÞÌ­kÚƒ@ÖZHBªö i¯WìÉéÓL¨æ¾½Õ ñypý„Ð3ß0_šÓÔ¬.ì6¥ r‘ºøz‹.¢ÐÊ–3Þn@]Çógûðö³oKÿZ1xsQõ À´Þ—n(‡¿­\Í ÓµçüØÞîúf}{[¿ò´Ó}‚¾…ñý’r#š’ •„¥$A.R_¯HrZD5ÀDé¾UÒñqô«ú¡Ge)+ÿÏG:’MþWo²@– ¶‘b¹H6|½ÂfˆÂ;3 ¯±Ù³—1ï`‡!m¿ˆ|šÃX:Ó¤,-lµÒ²J r‘´øz…–qÂ) s[¨Ñ:ìŽwµ?]O«W“Ó+FÙO>é#šKƒšÂ †§„A.R_¯ÓF nr»¼m=îß×Ïð1HÛH¯t†éX“²äEr‘äøz…\ú¦Qª±öÉÍK©õ q€ßõÏ¢~Öýˆ¥9M]ÈêÂnSº ©‹¯·èRÑ åd9"æÕ]o§ù9nå3Ú”Œ"Ú~òâGª¥-JÈQº×Z‚æ¢(5êJa2-É %ÍQ¢Ù4À…¾¤äJkiFS²š°»”&ÈEjâëM^Š`#L{yþz·?Œ›>å½Î”·4¦) YYØiJä"eñõŠ,ë§!¦¼¼?íR­E®voÏVÖžþû¸ q >ãÕ8Ù§¼§Ù~XúÒ„,,l´Òª r‘°øzÖ0kËîƒÏ;ë¿ÿ=Ÿ \«ÛèAõqëe•ÌMj"+q¬1è9E¬d"…±Å 0£Ä á¹5ï»Ømêgƒ™~¸B¿øÄr›šÆ E†}§”A.’_¯8SAh ?}Èûξ¾›O£^B¼í!žs–[Ô4¬1ì9e r‘ÆøzÅXºÐS²œ!ô$¶z?2k0'œë|<úzñ®MN%ŽÕÝUZW1•L¤%¶ØB)*-ü,"iJǽ’RZåõEØ#)åv´(AG »KP‚L…ÒÇ7 endstream endobj 1508 0 obj << /Type /Page /Contents 1509 0 R /Resources 1507 0 R /MediaBox [0 0 612 792] /Parent 1506 0 R /Annots [ 1511 0 R 1512 0 R 1513 0 R 1514 0 R 1515 0 R 1516 0 R 1517 0 R 1518 0 R 1519 0 R 1520 0 R 1521 0 R 1522 0 R 1523 0 R 1524 0 R 1525 0 R 1526 0 R 1527 0 R 1528 0 R 1529 0 R 1530 0 R 1531 0 R 1532 0 R 1533 0 R 1534 0 R 1535 0 R 1536 0 R 1537 0 R 1538 0 R 1539 0 R 1540 0 R 1541 0 R 1542 0 R 1543 0 R 1544 0 R 1545 0 R 1546 0 R 1547 0 R 1548 0 R 1549 0 R 1550 0 R 1551 0 R 1552 0 R 1553 0 R 1554 0 R 1555 0 R 1556 0 R 1557 0 R 1558 0 R ] >> endobj 1511 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 710.0373 450 717.6131] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1512 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 696.8867 450 704.4624] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1513 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 683.736 450 691.3117] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1514 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 670.5853 450 678.161] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1515 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 655.3134 450 665.0104] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1516 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 642.1627 450 651.8597] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1517 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 631.1333 450 638.709] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1518 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 617.9826 450 625.5583] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1519 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 604.8319 450 612.4076] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1520 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 591.6812 450 599.257] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1521 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 578.5305 450 586.1063] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1522 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 563.2586 450 572.9556] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1523 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 552.2292 450 559.8049] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1524 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 536.9573 450 546.6542] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1525 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 525.9278 450 532.9581] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1526 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 512.7771 450 520.0628] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1527 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 499.6264 450 506.6567] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1528 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 486.4757 450 494.0515] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1529 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 471.2039 450 480.3554] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1530 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 458.0532 450 467.4601] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1531 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 447.0237 450 454.5995] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1532 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 433.873 450 441.4488] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1533 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 418.6011 450 428.2981] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1534 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 407.5717 450 415.1474] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1535 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 392.2998 450 401.9967] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1536 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 381.2703 450 388.846] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1537 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 365.9984 450 375.6954] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1538 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 352.8477 450 362.5447] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1539 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 341.8182 450 349.104] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1540 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 328.6676 450 336.2433] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1541 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 315.5169 450 323.0926] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1542 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 300.245 450 309.942] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1543 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 289.2155 450 296.7913] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1544 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 273.9436 450 283.6406] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1545 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 260.7929 450 270.4899] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1546 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 249.7635 450 257.3392] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1547 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 236.6128 450 244.1885] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1548 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 221.3409 450 230.4924] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1549 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 208.1902 450 217.3417] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1550 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 195.0395 450 204.7365] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1551 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 181.8889 450 191.5858] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1552 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 168.7382 450 178.4351] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1553 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 155.5875 450 165.2844] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1554 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 144.558 450 152.0125] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1555 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 131.4073 450 138.9831] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1556 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 118.2567 450 125.8324] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1557 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 102.9848 450 112.6817] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1558 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 91.9553 450 99.531] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1510 0 obj << /D [1508 0 R /XYZ 90 720 null] >> endobj 1507 0 obj << /Font << /F51 9 0 R /F59 1392 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1561 0 obj << /Length 2469 /Filter /FlateDecode >> stream xÚíÝMs¹à»…ŽÒ€ÁgŽ©Ú=ä“©Jr %Úf-%:$m׿×3â¯(tc-‹’«åª%7»eöSó±êB¦?ê"Ê ? "ï/nîÞÉã{§Ž¯)b!»~÷—_­ºPRDÕÅõ‡ «œÐF›’êúö_—_¯þsý÷w¿\çTVëV±1¤UM©(Bðñ§ÊÁS5/´òj¡¤”—÷Wêr•^_~[,7ëÕýø›¤4Ó„ô;»8¤ºãÛÿš¢{øâŸùÝùßð“¾ý¤Ï&õÏ n( JL-œþšãXéøÓ„cË”ÖO*[ù¨hEØÒª—…¹èÒ ç‹0õTØÍøey·Ú-kÌÆ QšÎì9ßQ°r_Z°0ƒõ¨Ñ,ÌEÁjÔ+°Â üàŠ+M¸Jc——‡Õ®jKu[?úv’رCMa%Ž §|•L$/¶XÑ奰ÁÂÄ8<åõqúº½[v¿×p)éR­»®«æf4%A K »KY‚\$&¾^Ñd½0ƒÁÊ<Õ´[í§áê@,µe|—t¾¥VnRS²Ê°ëJUe‹TÆ×+ÊŒ: ±(³GeÿXýóº¦Ê+¡”]Õ™ÞNR›;Õ¤,5l=E r‘Ôøz…Úä L´íî.3þoyXoï©yQÓW]?:/Î]h2‚@–¶•b¹HF|½ÂHyƒ†yÑ#£êL˜Ã4dÙnç5ÿµ¤À¹MÈ D”@ÈE äëÒ¤¥½‚93n«Ç‹V¥}T]ßükI„s›!Eˆ((„‹DÈ×ËmTÂ¥ ÂxDø9 ƒë›+í/«itJ-ûñåÛNù}-Èù{äð‡¹(zÅŸÂÒfQVü©ËÅx|ºN/¦µ¯ëýúýf:~­®ñ´Ö÷‘òûÞN›[Ô4¬1ì¹Ò¦j r‘ÆøzŘ³bð1cªb̺Ëåûôý¦j*•’Á÷¥ß‹¿T77­©Yu¨€R¹Hu|½¢Îj¡u,3kÔYÝ"‰Ûî×ÔAªO HçúÉÍ×Ã6÷ª‰ YlØ| ä"±ñõ ¶! 9šflCÛq"]ˆRQZ×Ùáh57¨) YaØq¥mUä"…ñõŠ0mÓæa5œ°Ãv\§}ÿ³ÜÝVWiÊ kûi…ï_óÏhR‚@–¶–¢¹HJ|½BIiá}ZŸgJÖc»íÇê¤è¼ð1öÑéÌo'ÕÍMkªƒ@V* ÔA.R_/«31 §)êæóÿM꾬ë;¾Acû‘äO±ã›;Ø"ˆÁG$‚˜‹"بW'Œ·å‚´è‘àö°"¾AǾÓöF_nZS²êP¥r‘êøzE Óí|ža—Ô-ë4¹ú:¾œ®y¸l­z1ˆ&º¾òro'ÝÍmkºƒ@Ö: ÜA.Ò_¯¸sR(o`ÂOÝ%l > } ~ÅÍÜ·&<dá! ä"áñõ <ã…ÔC™f:7pË[bªUqèÇo5ÕÎkʃ@VJ äA.R_¯ÈK…ÜÒ¢¤zo“ÏfU ú鎃>Á¾ÞpwìYÓ\‰cÉ¥]U\ÉD‚c‹oZ ¯5‚Ó§ànÇ=•ãlÛÏ5üÞæž5ÁA +Pä iޝWÐI/¬W8½§è>˜s©Á çC¿óŒ”ç5‘A ‹ ›N!ƒ\$2¾^F6D#ŒV`Ìœû4EìçWÓ”ººÛ^-ÒHwûe·˜/–‡OÕSf<áþt[+”šùCo¡8Î ö ™(1|±&(¡½Ä©ÐžŠ)l–7ÓëöTÚ‰ô ô}·?°W‘?ü¦dé`7);‹ÄÃ×+z\ézèY¿_ŒË¨õ¾(T¿· ;åûyͽe8÷§ Y`Øp ä"ñõ 0kÒ:;DæÛß/GYyB«ß‚Fµ~_çK€šûÑ,(l°Ò¾ r‘ øz”Q"¨ Ô¼­¿¿YÖÞ“Õ~ÏÝ[moå–5ÍA k Pæ iޝWÌé œó8KÆlîx∸&Û+á­ÑÞ+_,”[Ö4¬94@™ƒ\¤9¾^17^&¦LœjÞÌ߯ÓÞÍæá¨ïf\“UÏ!ßo8óŽCîS²Ð°ñ4ÈEBãëhR‹Á9˜P•:…¶½ÿ0ßc¼Ø­þ-•¹¯ßbä8ÓþYwñI#óGÜ4¬ìer‘FøzÙˆQhe-Ñ'FN¶ ¦­n JGaÆû¤úÐD»É{Ë rnõ‘pƒ¹(7zÅwB:ÀÍpâf<-¸]Þ.>SPdq°}ñþÜÕwîA²ˆ°©J‡*"ÈE"âëDn¼sÍàeNÝm×àO»Ôaà˜1:×—Cßgþì›x Ńͤð@._¯à1Qx7àÌe žrÑßWâš'u¿,æõ¸ÍÝjrƒ@–¶Ÿâ¹Hn|½ÂmwÁ5Nxó~úþ㚸Ҿ?Oàg¹Ò>·¯éYèò¹H|½âOÂ8<¬æíöý§ÕfC\üg•ê ¬·ZŸÍ-kšƒ@Ö ÌA.Ò_¯˜K?Òš ÌåùÍ*Ÿ€žjÛÄÓÍx$ÚžïprnTS²Ò°ó”4ÈEJãëei*z¡œ„+°T¤¤}™Ÿ™rXWG½hÇ;Ü:·—ÜçÊýiÃ@Ø£†À0¬Q¯ FH%aúÔyÓý¦i.íg{Î9ˆå5A k {®t¬ƒ\¤1¾^1æ¥6Ât©ó~ûöÃa¿öŸ–·óõ[õǨ{aúS+^z››ÓÔ¬.ì6¥ r‘ºøzE—õÂËS¤Î;õŸÇKkÛÓcÃú¨õÚç¨s¯šØ ņͧ°A._¯`3FX ›:ïîV»Õv¼·ñÛúžxæN¸ú™ž¹3·¥ÉªÄ±ª Ëª’‰4Å+¤•¦5¼•LÏ›ýãÔ¸¾›Î5.Öóÿ`äáþ‡}}¿_ iTß[{îÖDnFS²”°»jUK‹ÄÄ×+šTÚ:œ -hÚ-ï÷¶ãu¨wÕ1J =t=g¢æÆ4eA + ;MÉ‚\¤,¾^‘%íx­<Àr¬ñBˆõxnò†\ÊÓÁô›¿ ulC“Q‰cAWÓSET2‘†Øb™ÐøØAkq¦ó ¡ýt$X¿6>½îOŠxþ477¢…â8DØWd*ˆþTÐ endstream endobj 1560 0 obj << /Type /Page /Contents 1561 0 R /Resources 1559 0 R /MediaBox [0 0 612 792] /Parent 1506 0 R /Annots [ 1563 0 R 1564 0 R 1565 0 R 1566 0 R 1567 0 R 1568 0 R 1569 0 R 1570 0 R 1571 0 R 1572 0 R 1573 0 R 1574 0 R 1575 0 R 1576 0 R 1577 0 R 1578 0 R 1579 0 R 1580 0 R 1581 0 R 1582 0 R 1583 0 R 1584 0 R 1585 0 R 1586 0 R 1587 0 R 1588 0 R 1589 0 R 1590 0 R 1591 0 R 1592 0 R 1593 0 R 1594 0 R 1595 0 R 1596 0 R 1597 0 R 1598 0 R 1599 0 R 1600 0 R 1601 0 R 1602 0 R 1603 0 R 1604 0 R 1605 0 R 1606 0 R 1607 0 R 1608 0 R 1609 0 R 1610 0 R ] >> endobj 1563 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 710.0373 450 717.6131] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1564 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 696.8867 450 703.917] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1565 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 683.736 450 690.7663] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1566 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 668.4641 450 677.6156] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1567 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 657.4346 450 664.4649] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1568 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 644.2839 450 651.7385] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1569 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 631.1333 450 638.709] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1570 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 617.9826 450 625.0129] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1571 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 604.8319 450 611.8622] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1572 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 589.56 450 599.257] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1573 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 576.4093 450 586.1063] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1574 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 563.2586 450 572.9556] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1575 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 550.1079 450 559.5149] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1576 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 536.9573 450 546.3642] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1577 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 523.8066 450 533.5035] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1578 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 510.6559 450 519.8074] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1579 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 497.5052 450 506.9122] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1580 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 484.3545 450 493.506] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1581 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 473.3251 450 480.3554] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1582 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 458.0532 450 467.7501] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1583 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 447.0237 450 454.5995] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1584 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 433.873 450 441.4488] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1585 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 420.7223 450 428.2981] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1586 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 405.4504 450 415.1474] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1587 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 392.2998 450 401.9967] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1588 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 379.1491 450 388.846] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1589 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 365.9984 450 375.6954] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1590 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 352.8477 450 362.5447] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1591 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 341.8182 450 349.394] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1592 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 328.6676 450 335.6979] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1593 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 315.5169 450 323.0926] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1594 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 302.3662 450 309.942] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1595 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 287.0943 450 296.7913] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1596 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 273.9436 450 283.6406] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1597 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 262.9142 450 270.4899] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1598 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 249.7635 450 256.7938] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1599 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 234.4916 450 243.8985] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1600 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 223.4621 450 231.0379] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1601 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 208.1902 450 217.8872] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1602 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 195.0395 450 204.7365] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1603 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 181.8889 450 191.5858] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1604 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 170.8594 450 178.4351] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1605 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 155.5875 450 164.739] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1606 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 144.558 450 151.8437] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1607 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 131.4073 450 138.6931] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1608 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 118.2567 450 125.8324] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1609 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 105.106 450 112.6817] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1610 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 91.9553 450 99.531] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1562 0 obj << /D [1560 0 R /XYZ 90 720 null] >> endobj 1559 0 obj << /Font << /F51 9 0 R /F59 1392 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1613 0 obj << /Length 2728 /Filter /FlateDecode >> stream xÚíœKsã6Çïó)t‹t/Äö™dv·v’Tâœ69h$Ùf,º$yùô ؔрçaORËšª1E5»-üD7ÙŒÚlfèL AŒÔz¶¾yFûÓož±þhi-–ÐäÛ‹gû¾b3F‰¡†Í..g„3ÎW›ÿÎß6‹ß/þý컋è«â¼Í™”Â1fH]k3Óö$Ztá4á„ñz±d”Òù݂͛åÚ¾š¯n–—íbÉëùúîè~%ëÏŒüQE¸1•ý œ£¿Û‹”ò?ô'¾zü ¾âågªJ«–J rXÙ¬`ÝÛ@Úh·„† }ï;t²0ÁîE®è(h‚'gRŠyRFÙ¥Oæ>OÛý²tÚR,Õš9‘ô.Ç(‹"•(ƒ†9ÊFª#”A_e…xeµ Z¨2A3-ÛCsÕØ7öÉ©Ë:Õµpç§þ">ƒ]– &Ïà e'l@GSRÕHx6"dgëØ¹iOM»·¯—îÕ­=8´W‡…Ë„I†¤u*YýÊÊIë"(À0K  žDøBYÉÇ`©4‘B‰†—`q”Ü!3²Qõ4Ó|´îðÝq맭Ԍŭ3]󉸇Æ¿0ÌžP€òñ€˜&¦æ0çU#€n.íÉ·ÉÞ€ZÅ ç¤F {ç.1êùfuJ6 ,Î\L`=ÙÃd«H0ÌÒÕÇh¾PÚòñÚ„!T× oJ–¤­kºzì°êšè"ó´RóÙmù(J‘*`˜¥ ªŒQ|¡Tåã TñÊÖã¤KÚòï÷ô¸iQˆjî:Zrbè‹]ŽbT*b ³˜AÙ1Ì€/³|¼3Ɖ֚Ìij®³u™‰uYºþ§rjWÞ”¢¶(—0ÿéP~¥ú}·+ %rêÓìå(WA–"WÀ0ËÔã øB¹ÊǸ’¶öæ&ºÐµï–~ÚCr7Ÿ¥–WSÉþô…U«È0ÌòõÇx¾PÞòñÞlà~—Bš3Ü–Í~œºÌôý‰/¿ÿ4èQäi°ËâäÅh<¡0eƒ ,qJ4禊žÃtìv ¦×€ì³¡RÓök@Qš"WÀ0 Ô# øBÑÊÇØ¢šTš¼X…®üþk^í Òp¨u5õNŸ<1½ŠÀÃ,p·+ð…wOó“DH;ó¸IˆÎ„®‰¬©ïÙºâ‹ñjþCÛ5N—ßÝ­wî¨ÙlWûÅRèjþ²+ñ}ãÁÎl®©úÁ£h4tÍí³£P’A“ãú™'?îºóaäÑÆ~ø8 ˆ€Án zß¡ГN‰ýa"b:¥"Œr¿jhz_u_ =]ooüAã~¬W½Œ‡Õíµ?stgä¼ñ½ò±È‚Íß6Ý‹wþ6¶Ñg‚®k3[²ŠI}ðŸ·ûoµ¿ZíS\Ô’˜Zÿɰxü“(xÂ>))^æn°Ëb×› ÔÕIêo(tgÏ2µ2Úç;Á„MhýWà Iê×c³¿²À1µr‘„–¸îп}jýÏ«~©¦_³9tWmÝ{rþã/ÿã­~£LÚó;¿·&•íïBDõõ— ±L¬”) a.SŒp›ÞRr_¨ÞùxQpJmBᦜßüåÖÎ\Ïߺ¾Pœ:ì«£—Óqt¾±D¬Wßôï¼§/]cònwòŠþç‹æx»ëv|HJo,±µþ”êU+|Ú¢ZÀ0«>·‡,¥ð…ª•Ôâµ&2Ô­†ˆG¹=Žïm¶Ý¬?¾UÓ·i¥‰2{ŠÛ7NI\h˜w4Ún×VB\è ·/Š«¥MÀ,̽òcnÅý¦—1*œ”¿Ý‡;ÏÊ)¶‡~¡ÉŸ|îk„[·Oè´=$uöX*ŠéŒJ>ZQ`˜•Ž•Ûâ”’øB¥ÉÇ‹p\1Â8 Ó¤eF;^WþÖé‡ù[H[™ºMîíáM·×}s&aî½^¶]s!Ù[àTšª?u›•>Œ\Qz`˜•JI|¡Òçã ÒKMŒîËa'}È‘‹ZÚ™sô›êÚà ¢P¸¿ovqO±¿À™´þ½Ï_ûdéq7}굩„+zïÛ`¨@áó†Yà€¹b)€/T |¼8m Ijfª^Ÿ°°þb{Z5»c?ï]öéïzÓ¤•¦+V–ý ò‘óÊfW¿ôôÞfü„l}¥ƒz_ÿä$[­Ý{o•𝮶ÈrñDíh„0E€a¨ŒÛÊ•øBAÈÇ‹ pF”ªë„°Bþ/wSú¹uµs7]L§¡lM±þüOn³Ù™|賊¦í´ñ×ÛšF´H0Ì%ˆ¾P"ÎãÝë 0{CUZ÷Y‚v-eY8Zºo:öý“6ÙÔ`¬"•Qrêjø6DÍR[æúcy\©;O6á¡? †{1ÓÓÓÊ}˧/i¬à6?üºoÞû³ßvY~uøbO‡æµû$ÝÓVúÚÜVLÈ¿d®4 @ÃÜ,0VB¦…¾PáóñbÇ'¦®MT>j®VXÄRl(€ŸSv«œú\%õ×[lF¥ #S”f¥ µL®s@_¨´ùxñž–VbQó l(ÍŸÛÇØft/Ç'äÑíî°h‡‚ÿÒºáúùܯÓm¶‰ÛQÝTöÙ’~ÔŸe@… ´(0Ì 59™\Ë€¾P¡ÎãÝÏÄnTö«ø~!âÔ­3ym´²RFúÛp½|~½ïW6v~‰â—»[û„%X¿Vqò]¶`+ï®h­m¤°Œ°rŒKìO]^ŠŸ©˜a6ÂAòù0ÙK„þPIò1­$uMD¨Âžû¥A7z§C'Ëë»±<]Ïèo¬vÝ^·„øÖIèÿ˜Dg~{Ó·íéSZCÜŠæCdÁô¨$°Ë©LJ¹Êy²÷¼ Zü¯¦ endstream endobj 1612 0 obj << /Type /Page /Contents 1613 0 R /Resources 1611 0 R /MediaBox [0 0 612 792] /Parent 1506 0 R /Annots [ 1615 0 R 1616 0 R 1617 0 R 1618 0 R 1619 0 R 1620 0 R 1621 0 R 1622 0 R 1623 0 R 1624 0 R 1625 0 R 1626 0 R 1627 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R 1632 0 R 1633 0 R 1634 0 R 1635 0 R 1636 0 R 1637 0 R 1638 0 R 1639 0 R 1640 0 R 1641 0 R 1642 0 R 1643 0 R 1644 0 R 1645 0 R 1646 0 R 1647 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R 1652 0 R 1653 0 R 1654 0 R ] >> endobj 1615 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 710.0373 450 717.6131] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1616 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 696.8867 450 704.1724] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1617 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 681.6148 450 691.0217] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1618 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 668.4641 450 677.871] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1619 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 657.4346 450 664.7203] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1620 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 644.2839 450 651.8597] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1621 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 631.1333 450 638.709] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1622 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 617.9826 450 625.2683] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1623 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 602.7107 450 612.4076] /Subtype /Link /A << /S /GoTo /D (133) >> >> endobj 1624 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 589.56 450 599.257] /Subtype /Link /A << /S /GoTo /D (133) >> >> endobj 1625 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 576.4093 450 585.8163] /Subtype /Link /A << /S /GoTo /D (133) >> >> endobj 1626 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 565.3798 450 572.6656] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1627 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 550.1079 450 559.8049] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1628 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 536.9573 450 546.6542] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1629 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 525.9278 450 533.5035] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1630 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 512.7771 450 520.0628] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1631 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 499.6264 450 506.9122] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1632 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 486.4757 450 493.7615] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1633 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 473.3251 450 480.9008] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1634 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 458.0532 450 467.4601] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1635 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 447.0237 450 454.5995] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1636 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 433.873 450 441.4488] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1637 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 420.7223 450 428.2981] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1638 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 407.5717 450 414.602] /Subtype /Link /A << /S /GoTo /D (136) >> >> endobj 1639 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 375.6912 450 388.4434] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1640 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 330.162 450 340.1246] /Subtype /Link /A << /S /GoTo /D (138) >> >> endobj 1641 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 311.6024 450 321.2994] /Subtype /Link /A << /S /GoTo /D (138) >> >> endobj 1642 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 298.4517 450 308.1487] /Subtype /Link /A << /S /GoTo /D (139) >> >> endobj 1643 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 285.301 450 294.998] /Subtype /Link /A << /S /GoTo /D (140) >> >> endobj 1644 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 272.1504 450 281.8473] /Subtype /Link /A << /S /GoTo /D (141) >> >> endobj 1645 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 258.9997 450 268.6966] /Subtype /Link /A << /S /GoTo /D (141) >> >> endobj 1646 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 245.849 450 255.546] /Subtype /Link /A << /S /GoTo /D (142) >> >> endobj 1647 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 232.6983 450 242.3953] /Subtype /Link /A << /S /GoTo /D (143) >> >> endobj 1648 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 219.5476 450 229.2446] /Subtype /Link /A << /S /GoTo /D (143) >> >> endobj 1649 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 192.5779 450 202.5406] /Subtype /Link /A << /S /GoTo /D (145) >> >> endobj 1650 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 174.0184 450 183.7153] /Subtype /Link /A << /S /GoTo /D (145) >> >> endobj 1651 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 160.8677 450 170.5647] /Subtype /Link /A << /S /GoTo /D (146) >> >> endobj 1652 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 147.717 450 157.414] /Subtype /Link /A << /S /GoTo /D (147) >> >> endobj 1653 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 117.9578 450 130.71] /Subtype /Link /A << /S /GoTo /D (149) >> >> endobj 1654 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 85.5792 450 98.3314] /Subtype /Link /A << /S /GoTo /D (150) >> >> endobj 1614 0 obj << /D [1612 0 R /XYZ 90 720 null] >> endobj 1611 0 obj << /Font << /F51 9 0 R /F59 1392 0 R /F72 6 0 R /F97 1385 0 R /F52 26 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1657 0 obj << /Length 220 /Filter /FlateDecode >> stream xÚ­’=‚0†w~EGZîúÁQGItîfœ@bÄE?ß bâ iÇñö}š{‹ üBf‘RÂj"V^"èÚ绊{KÖ.J ƒ AX°È܉_cŽù`åª}ü¨ëäàvÑÆõfFÊ_¸ ™óH2ÔBéL^8´G‚"Õ’ŠÄêøÞ”·„c\_óI¸"o›êø §H Kc +HRæ¡Áaå÷dô~e“¯?›‹š-×üÈEK#ÈB>ŒÕÞGÜþ…ÓëøXø%¡¹a˜2š Îè&àáV¼šˆD endstream endobj 1656 0 obj << /Type /Page /Contents 1657 0 R /Resources 1655 0 R /MediaBox [0 0 612 792] /Parent 1506 0 R /Annots [ 1659 0 R ] >> endobj 1659 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 710.0373 450 720] /Subtype /Link /A << /S /GoTo /D (151) >> >> endobj 1658 0 obj << /D [1656 0 R /XYZ 90 720 null] >> endobj 1655 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F97 1385 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1660 0 obj << /S /GoTo /D (Intro) >> endobj 1662 0 obj (Introduction to Geomview) endobj 1663 0 obj << /S /GoTo /D (Distrib) >> endobj 1665 0 obj (Distribution) endobj 1666 0 obj << /S /GoTo /D (Copying) >> endobj 1668 0 obj (Copying) endobj 1669 0 obj << /S /GoTo /D (5) >> endobj 1671 0 obj (GNU LESSER PUBLIC LICENSE) endobj 1672 0 obj << /S /GoTo /D (5) >> endobj 1674 0 obj (Preamble) endobj 1675 0 obj << /S /GoTo /D (6) >> endobj 1677 0 obj (TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION) endobj 1678 0 obj << /S /GoTo /D (13) >> endobj 1680 0 obj (How to Apply These Terms to Your New Programs) endobj 1681 0 obj << /S /GoTo /D (History) >> endobj 1683 0 obj (History of Geomview's Development) endobj 1684 0 obj << /S /GoTo /D (Authors) >> endobj 1686 0 obj (Authors) endobj 1687 0 obj << /S /GoTo /D (Platforms) >> endobj 1689 0 obj (Supported Platforms) endobj 1690 0 obj << /S /GoTo /D (Pronunciation) >> endobj 1692 0 obj (How to Pronounce ``Geomview``) endobj 1693 0 obj << /S /GoTo /D (Overview) >> endobj 1695 0 obj (Overview) endobj 1696 0 obj << /S /GoTo /D (Tutorial) >> endobj 1698 0 obj (Tutorial) endobj 1699 0 obj << /S /GoTo /D (Interaction) >> endobj 1701 0 obj (Interaction) endobj 1702 0 obj << /S /GoTo /D (Starting Geomview) >> endobj 1704 0 obj (Starting Geomview) endobj 1705 0 obj << /S /GoTo /D (Command Line Options) >> endobj 1707 0 obj (Command Line Options) endobj 1708 0 obj << /S /GoTo /D (Basic Interaction) >> endobj 1710 0 obj (Basic Interaction: The Main Panel) endobj 1711 0 obj << /S /GoTo /D (Loading) >> endobj 1713 0 obj (Loading Objects Into Geomview) endobj 1714 0 obj << /S /GoTo /D (Mouse Motions) >> endobj 1716 0 obj (Using the Mouse to Manipulate Objects) endobj 1717 0 obj << /S /GoTo /D (Point of Interest) >> endobj 1719 0 obj (Selecting a Point of Interest) endobj 1720 0 obj << /S /GoTo /D (Appearance) >> endobj 1722 0 obj (Changing the Way Things Look) endobj 1723 0 obj << /S /GoTo /D (Appearance Panel) >> endobj 1725 0 obj (The Appearance Panel) endobj 1726 0 obj << /S /GoTo /D (Materials Panel) >> endobj 1728 0 obj (The Materials Panel) endobj 1729 0 obj << /S /GoTo /D (Lighting Panel) >> endobj 1731 0 obj (The Lighting Panel) endobj 1732 0 obj << /S /GoTo /D (Cameras) >> endobj 1734 0 obj (Cameras) endobj 1735 0 obj << /S /GoTo /D (Saving) >> endobj 1737 0 obj (Saving your work) endobj 1738 0 obj << /S /GoTo /D (Commands) >> endobj 1740 0 obj (The Commands Panel) endobj 1741 0 obj << /S /GoTo /D (Keyboard Shortcuts) >> endobj 1743 0 obj (Keyboard Shortcuts) endobj 1744 0 obj << /S /GoTo /D (OOGL File Formats) >> endobj 1746 0 obj (OOGL File Formats) endobj 1747 0 obj << /S /GoTo /D (Conventions) >> endobj 1749 0 obj (Conventions) endobj 1750 0 obj << /S /GoTo /D (Common syntax) >> endobj 1752 0 obj (Syntax Common to All OOGL File Formats) endobj 1753 0 obj << /S /GoTo /D (File names) >> endobj 1755 0 obj (File Names) endobj 1756 0 obj << /S /GoTo /D (Vertices) >> endobj 1758 0 obj (Vertices) endobj 1759 0 obj << /S /GoTo /D (ND-Vertices) >> endobj 1761 0 obj (N-dimensional Vertices) endobj 1762 0 obj << /S /GoTo /D (Surface normal directions) >> endobj 1764 0 obj (Surface normal directions) endobj 1765 0 obj << /S /GoTo /D (Transformation matrices) >> endobj 1767 0 obj (Transformation matrices) endobj 1768 0 obj << /S /GoTo /D (ND Transformation matrices) >> endobj 1770 0 obj (ND Transformation matrices) endobj 1771 0 obj << /S /GoTo /D (Binary format) >> endobj 1773 0 obj (Binary format) endobj 1774 0 obj << /S /GoTo /D (References) >> endobj 1776 0 obj (Embedded objects and external-object references) endobj 1777 0 obj << /S /GoTo /D (Appearances) >> endobj 1779 0 obj (Appearances) endobj 1780 0 obj << /S /GoTo /D (Texture Mapping) >> endobj 1782 0 obj (Texture Mapping) endobj 1783 0 obj << /S /GoTo /D (Object File Formats) >> endobj 1785 0 obj (Object File Formats) endobj 1786 0 obj << /S /GoTo /D (QUAD) >> endobj 1788 0 obj (QUAD: collection of quadrilaterals) endobj 1789 0 obj << /S /GoTo /D (MESH) >> endobj 1791 0 obj (MESH: rectangularly-connected mesh) endobj 1792 0 obj << /S /GoTo /D (BBOX) >> endobj 1794 0 obj (BBOX: simple bounding boxes) endobj 1795 0 obj << /S /GoTo /D (BBP and BEZ) >> endobj 1797 0 obj (Bezier Surfaces) endobj 1798 0 obj << /S /GoTo /D (OFF) >> endobj 1800 0 obj (OFF Files) endobj 1801 0 obj << /S /GoTo /D (VECT) >> endobj 1803 0 obj (VECT Files) endobj 1804 0 obj << /S /GoTo /D (SKEL) >> endobj 1806 0 obj (SKEL Files) endobj 1807 0 obj << /S /GoTo /D (SPHERE) >> endobj 1809 0 obj (SPHERE Files) endobj 1810 0 obj << /S /GoTo /D (INST) >> endobj 1812 0 obj (INST Files) endobj 1813 0 obj << /S /GoTo /D (INST Examples) >> endobj 1815 0 obj (INST Examples) endobj 1816 0 obj << /S /GoTo /D (LIST) >> endobj 1818 0 obj (LIST Files) endobj 1819 0 obj << /S /GoTo /D (TLIST) >> endobj 1821 0 obj (TLIST Files) endobj 1822 0 obj << /S /GoTo /D (GROUP) >> endobj 1824 0 obj (GROUP Files) endobj 1825 0 obj << /S /GoTo /D (DISCGRP) >> endobj 1827 0 obj (DISCGRP Files) endobj 1828 0 obj << /S /GoTo /D (COMMENT) >> endobj 1830 0 obj (COMMENT Objects) endobj 1831 0 obj << /S /GoTo /D (Non-geometric objects) >> endobj 1833 0 obj (Non-geometric objects) endobj 1834 0 obj << /S /GoTo /D (appearance) >> endobj 1836 0 obj (Appearance Objects) endobj 1837 0 obj << /S /GoTo /D (image) >> endobj 1839 0 obj (Image Objects) endobj 1840 0 obj << /S /GoTo /D (transform) >> endobj 1842 0 obj (Transform Objects) endobj 1843 0 obj << /S /GoTo /D (ntransform) >> endobj 1845 0 obj (ND-Transform Objects) endobj 1846 0 obj << /S /GoTo /D (camera) >> endobj 1848 0 obj (cameras) endobj 1849 0 obj << /S /GoTo /D (window) >> endobj 1851 0 obj (window) endobj 1852 0 obj << /S /GoTo /D (Customization) >> endobj 1854 0 obj (Customization: .geomview files) endobj 1855 0 obj << /S /GoTo /D (Modules) >> endobj 1857 0 obj (External Modules) endobj 1858 0 obj << /S /GoTo /D (Interface) >> endobj 1860 0 obj (How External Modules Interface with Geomview) endobj 1861 0 obj << /S /GoTo /D (Example1) >> endobj 1863 0 obj (Example 1: Simple External Module) endobj 1864 0 obj << /S /GoTo /D (Example2) >> endobj 1866 0 obj (Example 2: Simple External Module with FORMS Control Panel) endobj 1867 0 obj << /S /GoTo /D (XForms) >> endobj 1869 0 obj (The XForms Library) endobj 1870 0 obj << /S /GoTo /D (Example3) >> endobj 1872 0 obj (Example 3: External Module with Bi-Directional Communication) endobj 1873 0 obj << /S /GoTo /D (Example4) >> endobj 1875 0 obj (Example 4: Simple Tcl/Tk Module Demonstrating Picking) endobj 1876 0 obj << /S /GoTo /D (Module Installation) >> endobj 1878 0 obj (Module Installation) endobj 1879 0 obj << /S /GoTo /D (Private Module Installation) >> endobj 1881 0 obj (Private Module Installation) endobj 1882 0 obj << /S /GoTo /D (System Module Installation) >> endobj 1884 0 obj (System Module Installation) endobj 1885 0 obj << /S /GoTo /D (GCL) >> endobj 1887 0 obj (GCL: the Geomview Command Language) endobj 1888 0 obj << /S /GoTo /D (Argument Conventions) >> endobj 1890 0 obj (Conventions Used In Describing Argument Types) endobj 1891 0 obj << /S /GoTo /D (GCL Reference) >> endobj 1893 0 obj (GCL Reference Guide) endobj 1894 0 obj << /S /GoTo /D (shell) >> endobj 1896 0 obj (!) endobj 1897 0 obj << /S /GoTo /D (lt) >> endobj 1899 0 obj (<) endobj 1900 0 obj << /S /GoTo /D (eq) >> endobj 1902 0 obj (=) endobj 1903 0 obj << /S /GoTo /D (gt) >> endobj 1905 0 obj (>) endobj 1906 0 obj << /S /GoTo /D (help) >> endobj 1908 0 obj (?) endobj 1909 0 obj << /S /GoTo /D (morehelp) >> endobj 1911 0 obj (??) endobj 1912 0 obj << /S /GoTo /D (emodule-run) >> endobj 1914 0 obj (|) endobj 1915 0 obj << /S /GoTo /D (all) >> endobj 1917 0 obj (all) endobj 1918 0 obj << /S /GoTo /D (and) >> endobj 1920 0 obj (and) endobj 1921 0 obj << /S /GoTo /D (ap-override) >> endobj 1923 0 obj (ap-override) endobj 1924 0 obj << /S /GoTo /D (backcolor) >> endobj 1926 0 obj (backcolor) endobj 1927 0 obj << /S /GoTo /D (background-image) >> endobj 1929 0 obj (background-image) endobj 1930 0 obj << /S /GoTo /D (bbox-color) >> endobj 1932 0 obj (bbox-color) endobj 1933 0 obj << /S /GoTo /D (bbox-draw) >> endobj 1935 0 obj (bbox-draw) endobj 1936 0 obj << /S /GoTo /D (camera) >> endobj 1938 0 obj (camera) endobj 1939 0 obj << /S /GoTo /D (camera-draw) >> endobj 1941 0 obj (camera-draw) endobj 1942 0 obj << /S /GoTo /D (camera-prop) >> endobj 1944 0 obj (camera-prop) endobj 1945 0 obj << /S /GoTo /D (camera-reset) >> endobj 1947 0 obj (camera-reset) endobj 1948 0 obj << /S /GoTo /D (car) >> endobj 1950 0 obj (car) endobj 1951 0 obj << /S /GoTo /D (cdr) >> endobj 1953 0 obj (cdr) endobj 1954 0 obj << /S /GoTo /D (clock) >> endobj 1956 0 obj (clock) endobj 1957 0 obj << /S /GoTo /D (command) >> endobj 1959 0 obj (command) endobj 1960 0 obj << /S /GoTo /D (copy) >> endobj 1962 0 obj (copy) endobj 1963 0 obj << /S /GoTo /D (cursor-still) >> endobj 1965 0 obj (cursor-still) endobj 1966 0 obj << /S /GoTo /D (cursor-twitch) >> endobj 1968 0 obj (cursor-twitch) endobj 1969 0 obj << /S /GoTo /D (delete) >> endobj 1971 0 obj (delete) endobj 1972 0 obj << /S /GoTo /D (dice) >> endobj 1974 0 obj (dice) endobj 1975 0 obj << /S /GoTo /D (dimension) >> endobj 1977 0 obj (dimension) endobj 1978 0 obj << /S /GoTo /D (dither) >> endobj 1980 0 obj (dither) endobj 1981 0 obj << /S /GoTo /D (draw) >> endobj 1983 0 obj (draw) endobj 1984 0 obj << /S /GoTo /D (dump-handles) >> endobj 1986 0 obj (dump-handles) endobj 1987 0 obj << /S /GoTo /D (echo) >> endobj 1989 0 obj (echo) endobj 1990 0 obj << /S /GoTo /D (emodule-clear) >> endobj 1992 0 obj (emodule-clear) endobj 1993 0 obj << /S /GoTo /D (emodule-define) >> endobj 1995 0 obj (emodule-define) endobj 1996 0 obj << /S /GoTo /D (emodule-defined) >> endobj 1998 0 obj (emodule-defined) endobj 1999 0 obj << /S /GoTo /D (emodule-isrunning) >> endobj 2001 0 obj (emodule-isrunning) endobj 2002 0 obj << /S /GoTo /D (emodule-path) >> endobj 2004 0 obj (emodule-path) endobj 2005 0 obj << /S /GoTo /D (emodule-run) >> endobj 2007 0 obj (emodule-run) endobj 2008 0 obj << /S /GoTo /D (emodule-sort) >> endobj 2010 0 obj (emodule-sort) endobj 2011 0 obj << /S /GoTo /D (emodule-start) >> endobj 2013 0 obj (emodule-start) endobj 2014 0 obj << /S /GoTo /D (emodule-transmit) >> endobj 2016 0 obj (emodule-transmit) endobj 2017 0 obj << /S /GoTo /D (escale) >> endobj 2019 0 obj (escale) endobj 2020 0 obj << /S /GoTo /D (event-keys) >> endobj 2022 0 obj (event-keys) endobj 2023 0 obj << /S /GoTo /D (event-mode) >> endobj 2025 0 obj (event-mode) endobj 2026 0 obj << /S /GoTo /D (event-pick) >> endobj 2028 0 obj (event-pick) endobj 2029 0 obj << /S /GoTo /D (evert) >> endobj 2031 0 obj (evert) endobj 2032 0 obj << /S /GoTo /D (exit) >> endobj 2034 0 obj (exit) endobj 2035 0 obj << /S /GoTo /D (ezoom) >> endobj 2037 0 obj (ezoom) endobj 2038 0 obj << /S /GoTo /D (freeze) >> endobj 2040 0 obj (freeze) endobj 2041 0 obj << /S /GoTo /D (geometry) >> endobj 2043 0 obj (geometry) endobj 2044 0 obj << /S /GoTo /D (geomview-version) >> endobj 2046 0 obj (geomview-version) endobj 2047 0 obj << /S /GoTo /D (hdefine) >> endobj 2049 0 obj (hdefine) endobj 2050 0 obj << /S /GoTo /D (hdelete) >> endobj 2052 0 obj (hdelete) endobj 2053 0 obj << /S /GoTo /D (help) >> endobj 2055 0 obj (help) endobj 2056 0 obj << /S /GoTo /D (hmodel) >> endobj 2058 0 obj (hmodel) endobj 2059 0 obj << /S /GoTo /D (hsphere-draw) >> endobj 2061 0 obj (hsphere-draw) endobj 2062 0 obj << /S /GoTo /D (if) >> endobj 2064 0 obj (if) endobj 2065 0 obj << /S /GoTo /D (inhibit-warning) >> endobj 2067 0 obj (inhibit-warning) endobj 2068 0 obj << /S /GoTo /D (input-translator) >> endobj 2070 0 obj (input-translator) endobj 2071 0 obj << /S /GoTo /D (interest) >> endobj 2073 0 obj (interest) endobj 2074 0 obj << /S /GoTo /D (lines-closer) >> endobj 2076 0 obj (lines-closer) endobj 2077 0 obj << /S /GoTo /D (load) >> endobj 2079 0 obj (load) endobj 2080 0 obj << /S /GoTo /D (load-path) >> endobj 2082 0 obj (load-path) endobj 2083 0 obj << /S /GoTo /D (look) >> endobj 2085 0 obj (look) endobj 2086 0 obj << /S /GoTo /D (look-encompass) >> endobj 2088 0 obj (look-encompass) endobj 2089 0 obj << /S /GoTo /D (look-encompass-size) >> endobj 2091 0 obj (look-encompass-size) endobj 2092 0 obj << /S /GoTo /D (look-recenter) >> endobj 2094 0 obj (look-recenter) endobj 2095 0 obj << /S /GoTo /D (look-toward) >> endobj 2097 0 obj (look-toward) endobj 2098 0 obj << /S /GoTo /D (merge) >> endobj 2100 0 obj (merge) endobj 2101 0 obj << /S /GoTo /D (merge-ap) >> endobj 2103 0 obj (merge-ap) endobj 2104 0 obj << /S /GoTo /D (merge-base-ap) >> endobj 2106 0 obj (merge-base-ap) endobj 2107 0 obj << /S /GoTo /D (merge-baseap) >> endobj 2109 0 obj (merge-baseap) endobj 2110 0 obj << /S /GoTo /D (morehelp) >> endobj 2112 0 obj (morehelp) endobj 2113 0 obj << /S /GoTo /D (name-object) >> endobj 2115 0 obj (name-object) endobj 2116 0 obj << /S /GoTo /D (ND-axes) >> endobj 2118 0 obj (ND-axes) endobj 2119 0 obj << /S /GoTo /D (ND-color) >> endobj 2121 0 obj (ND-color) endobj 2122 0 obj << /S /GoTo /D (ND-xform) >> endobj 2124 0 obj (ND-xform) endobj 2125 0 obj << /S /GoTo /D (ND-xform-get) >> endobj 2127 0 obj (ND-xform-get) endobj 2128 0 obj << /S /GoTo /D (ND-xform-set) >> endobj 2130 0 obj (ND-xform-set) endobj 2131 0 obj << /S /GoTo /D (new-alien) >> endobj 2133 0 obj (new-alien) endobj 2134 0 obj << /S /GoTo /D (new-camera) >> endobj 2136 0 obj (new-camera) endobj 2137 0 obj << /S /GoTo /D (new-center) >> endobj 2139 0 obj (new-center) endobj 2140 0 obj << /S /GoTo /D (new-geometry) >> endobj 2142 0 obj (new-geometry) endobj 2143 0 obj << /S /GoTo /D (new-reset) >> endobj 2145 0 obj (new-reset) endobj 2146 0 obj << /S /GoTo /D (NeXT) >> endobj 2148 0 obj (NeXT) endobj 2149 0 obj << /S /GoTo /D (normalization) >> endobj 2151 0 obj (normalization) endobj 2152 0 obj << /S /GoTo /D (not) >> endobj 2154 0 obj (not) endobj 2155 0 obj << /S /GoTo /D (or) >> endobj 2157 0 obj (or) endobj 2158 0 obj << /S /GoTo /D (pick) >> endobj 2160 0 obj (pick) endobj 2161 0 obj << /S /GoTo /D (pick-invisible) >> endobj 2163 0 obj (pick-invisible) endobj 2164 0 obj << /S /GoTo /D (pickable) >> endobj 2166 0 obj (pickable) endobj 2167 0 obj << /S /GoTo /D (position) >> endobj 2169 0 obj (position) endobj 2170 0 obj << /S /GoTo /D (position-at) >> endobj 2172 0 obj (position-at) endobj 2173 0 obj << /S /GoTo /D (position-toward) >> endobj 2175 0 obj (position-toward) endobj 2176 0 obj << /S /GoTo /D (progn) >> endobj 2178 0 obj (progn) endobj 2179 0 obj << /S /GoTo /D (quit) >> endobj 2181 0 obj (quit) endobj 2182 0 obj << /S /GoTo /D (quote) >> endobj 2184 0 obj (quote) endobj 2185 0 obj << /S /GoTo /D (rawevent) >> endobj 2187 0 obj (rawevent) endobj 2188 0 obj << /S /GoTo /D (rawpick) >> endobj 2190 0 obj (rawpick) endobj 2191 0 obj << /S /GoTo /D (read) >> endobj 2193 0 obj (read) endobj 2194 0 obj << /S /GoTo /D (real-id) >> endobj 2196 0 obj (real-id) endobj 2197 0 obj << /S /GoTo /D (redraw) >> endobj 2199 0 obj (redraw) endobj 2200 0 obj << /S /GoTo /D (regtable) >> endobj 2202 0 obj (regtable) endobj 2203 0 obj << /S /GoTo /D (rehash-emodule-path) >> endobj 2205 0 obj (rehash-emodule-path) endobj 2206 0 obj << /S /GoTo /D (replace-geometry) >> endobj 2208 0 obj (replace-geometry) endobj 2209 0 obj << /S /GoTo /D (rib-display) >> endobj 2211 0 obj (rib-display) endobj 2212 0 obj << /S /GoTo /D (rib-snapshot) >> endobj 2214 0 obj (rib-snapshot) endobj 2215 0 obj << /S /GoTo /D (scale) >> endobj 2217 0 obj (scale) endobj 2218 0 obj << /S /GoTo /D (scene) >> endobj 2220 0 obj (scene) endobj 2221 0 obj << /S /GoTo /D (set-clock) >> endobj 2223 0 obj (set-clock) endobj 2224 0 obj << /S /GoTo /D (set-conformal-refine) >> endobj 2226 0 obj (set-conformal-refine) endobj 2227 0 obj << /S /GoTo /D (set-emodule-path) >> endobj 2229 0 obj (set-emodule-path) endobj 2230 0 obj << /S /GoTo /D (set-load-path) >> endobj 2232 0 obj (set-load-path) endobj 2233 0 obj << /S /GoTo /D (set-motionscale) >> endobj 2235 0 obj (set-motionscale) endobj 2236 0 obj << /S /GoTo /D (setenv) >> endobj 2238 0 obj (setenv) endobj 2239 0 obj << /S /GoTo /D (sgi) >> endobj 2241 0 obj (sgi) endobj 2242 0 obj << /S /GoTo /D (shell) >> endobj 2244 0 obj (shell) endobj 2245 0 obj << /S /GoTo /D (sleep-for) >> endobj 2247 0 obj (sleep-for) endobj 2248 0 obj << /S /GoTo /D (sleep-until) >> endobj 2250 0 obj (sleep-until) endobj 2251 0 obj << /S /GoTo /D (snapshot) >> endobj 2253 0 obj (snapshot) endobj 2254 0 obj << /S /GoTo /D (soft-shader) >> endobj 2256 0 obj (soft-shader) endobj 2257 0 obj << /S /GoTo /D (space) >> endobj 2259 0 obj (space) endobj 2260 0 obj << /S /GoTo /D (stereowin) >> endobj 2262 0 obj (stereowin) endobj 2263 0 obj << /S /GoTo /D (time-interests) >> endobj 2265 0 obj (time-interests) endobj 2266 0 obj << /S /GoTo /D (transform) >> endobj 2268 0 obj (transform) endobj 2269 0 obj << /S /GoTo /D (transform-incr) >> endobj 2271 0 obj (transform-incr) endobj 2272 0 obj << /S /GoTo /D (transform-set) >> endobj 2274 0 obj (transform-set) endobj 2275 0 obj << /S /GoTo /D (ui-cam-focus) >> endobj 2277 0 obj (ui-cam-focus) endobj 2278 0 obj << /S /GoTo /D (ui-center) >> endobj 2280 0 obj (ui-center) endobj 2281 0 obj << /S /GoTo /D (ui-center-origin) >> endobj 2283 0 obj (ui-center-origin) endobj 2284 0 obj << /S /GoTo /D (ui-emotion-program) >> endobj 2286 0 obj (ui-emotion-program) endobj 2287 0 obj << /S /GoTo /D (ui-emotion-run) >> endobj 2289 0 obj (ui-emotion-run) endobj 2290 0 obj << /S /GoTo /D (ui-freeze) >> endobj 2292 0 obj (ui-freeze) endobj 2293 0 obj << /S /GoTo /D (ui-html-browser) >> endobj 2295 0 obj (ui-html-browser) endobj 2296 0 obj << /S /GoTo /D (ui-motion) >> endobj 2298 0 obj (ui-motion) endobj 2299 0 obj << /S /GoTo /D (ui-panel) >> endobj 2301 0 obj (ui-panel) endobj 2302 0 obj << /S /GoTo /D (ui-pdf-viewer) >> endobj 2304 0 obj (ui-pdf-viewer) endobj 2305 0 obj << /S /GoTo /D (ui-target) >> endobj 2307 0 obj (ui-target) endobj 2308 0 obj << /S /GoTo /D (uninterest) >> endobj 2310 0 obj (uninterest) endobj 2311 0 obj << /S /GoTo /D (update) >> endobj 2313 0 obj (update) endobj 2314 0 obj << /S /GoTo /D (update-draw) >> endobj 2316 0 obj (update-draw) endobj 2317 0 obj << /S /GoTo /D (window) >> endobj 2319 0 obj (window) endobj 2320 0 obj << /S /GoTo /D (winenter) >> endobj 2322 0 obj (winenter) endobj 2323 0 obj << /S /GoTo /D (write) >> endobj 2325 0 obj (write) endobj 2326 0 obj << /S /GoTo /D (write-comments) >> endobj 2328 0 obj (write-comments) endobj 2329 0 obj << /S /GoTo /D (write-handle) >> endobj 2331 0 obj (write-handle) endobj 2332 0 obj << /S /GoTo /D (write-sexpr) >> endobj 2334 0 obj (write-sexpr) endobj 2335 0 obj << /S /GoTo /D (xform) >> endobj 2337 0 obj (xform) endobj 2338 0 obj << /S /GoTo /D (xform-incr) >> endobj 2340 0 obj (xform-incr) endobj 2341 0 obj << /S /GoTo /D (xform-set) >> endobj 2343 0 obj (xform-set) endobj 2344 0 obj << /S /GoTo /D (zoom) >> endobj 2346 0 obj (zoom) endobj 2347 0 obj << /S /GoTo /D (Non-Euclidean Geometry) >> endobj 2349 0 obj (Non-Euclidean Geometry) endobj 2350 0 obj << /S /GoTo /D (Mathematica) >> endobj 2352 0 obj (Mathematica Graphics in Geomview or RenderMan) endobj 2353 0 obj << /S /GoTo /D (OOGL.m) >> endobj 2355 0 obj (Using Mathematica to generate OOGL files) endobj 2356 0 obj << /S /GoTo /D (Geomview.m) >> endobj 2358 0 obj (Using Geomview as Mathematica's Default 3D Display) endobj 2359 0 obj << /S /GoTo /D (RenderMan) >> endobj 2361 0 obj (Using Mathematica to generate RenderMan files) endobj 2362 0 obj << /S /GoTo /D (Remote Display) >> endobj 2364 0 obj (Using Geomview and Mathematica on Different Computers) endobj 2365 0 obj << /S /GoTo /D (Networked Geomview) >> endobj 2367 0 obj (Using a Networked Geomview Host) endobj 2368 0 obj << /S /GoTo /D (Chunks) >> endobj 2370 0 obj (Transporting Mathematica Files to Geomview by Hand) endobj 2371 0 obj << /S /GoTo /D (Package Details) >> endobj 2373 0 obj (Details of the Mathematica->Geomview Package) endobj 2374 0 obj << /S /GoTo /D (Package Installation) >> endobj 2376 0 obj (Installing the Mathematica Packages) endobj 2377 0 obj << /S /GoTo /D (Installation) >> endobj 2379 0 obj (Installation) endobj 2380 0 obj << /S /GoTo /D (Unix Binary Installation) >> endobj 2382 0 obj (Installing the Unix Binary Distribution) endobj 2383 0 obj << /S /GoTo /D (Unix Binary Detail) >> endobj 2385 0 obj (Details of the Unix Binary Installation) endobj 2386 0 obj << /S /GoTo /D (Source Code Installation) >> endobj 2388 0 obj (Compiling and Installing the Source Code Distribution) endobj 2389 0 obj << /S /GoTo /D (Support) >> endobj 2391 0 obj (Getting Technical Support for Geomview) endobj 2392 0 obj << /S /GoTo /D (Contributing) >> endobj 2394 0 obj (Contributing to Geomview's Development) endobj 2395 0 obj << /S /GoTo /D (Function Index) >> endobj 2397 0 obj (Function Index) endobj 2400 0 obj << /Length 1123 /Filter /FlateDecode >> stream xÚíÚKoÛFà»äAÛ}?zKݺhàª[ÑaщY4$'Aÿ}vùØŒœ]·c7% X5œYz?È•XEý«­ŒÄIcª«›3:í~wƦ­•XÁŸÖg?\(V1Ju¬Z_Ÿ$Yoþ¨/·Ç»f%„¨ûëññbûæ}ÃêC׬X}ôû˜áªfJ6®_žý²Žå祅/GdxÅ á>å4"m%aBªiD¾ú0(£êÞo_›~\þÉûCVw ƒ¹nLú:²ZqEUnÈÎFYs⟰›•”ªþmïŸlï¶ín<ó_»þ¦á¦þv§ÿq|a3 )ì¸õ»¶á¶þ«±¢&Ó0ÜÉ0Œ#Lrëÿa¾Óz|0ÿðÙãðL¿OŽ1Býß¹ÒÊÊ­¦¼áeènŽ[ÁÀĿ× Ô1›²SaÖ å‰j©ˆ5'Ê'¢—}³ò"ûwÛ`õÍÑNÿ±woý¾é¨n<7i•š+ü•z8*vžò¢X˜ qš R¡bóå¢XÁ‰áF bÅ$v P¾¸½øví¡Ý_M;_‡îÙîÇ(ÏÕo `q\°ì×>%:Ïq‘(Ì…h¢ J4_.eŽ(£5JTNDÏûï”C =ZCµu?¼ÁwÓ ÷•¦‰úno™Yˆ>UOg¼fÁBBœ%Á‚T(Ø|¹–j"yæBU%zêÅv7£<Ɔê<Õ1*Th£ËûþÓŸ-ÊxvPd ³Œ!,ΓŒA*”q¾ÜÌX9A¸Qe¬gÆ•Ó}åuh»Û龫Ýo¯;ñ¦» 1íÛú&dì÷è•‚¿}ÔB-møßŽáŒ³[ s8O¸p‘ Sa8 å"NK ãÓÒÂ=œ.Àûªõ·[ƒÈé2 Ûa­U1¹¸{¾­5NQ/Ìê…ž¸Nê©P½ùrQ¯ÖÄáP½|¹Bø_0žƒÀ,c‹'—»`*”q¾\d¬±AÆ8µxpÙ·›¿s/&4ÑŠªEñóU<3(*YÅÐwIÅ ª8_.*–”hÃñK ™P¼L »ã‰g´;â„ ä§;[TðL (fCS"¹BS¡‚óå¢`nˆâÌ¢‚Õ²ˆû__Äs\$ ³D!¡’DA*”h¾\$Ê$†1”¨^q¿¯EÜ8ãE° 0 é[4 ›/ÁRF8§k’ wÝ!|ïÞ¢=Œ*sjùfÁSQçºHf©B<Â$©‚T(Õ|¹™ª´–Píð·› zÞÞŒ-µ}Øb‚ _¾‘n!úMǤƩ.I…9©'vdòB¦Â¤ÊE©Æ?2‡_¸„Ô߇ïe}¿º‡®{-Ë·ÏzÅ :(2YÆ–L~øS¡Œóå"c͈Ñ¿6`4Õqû¡ãÞ„ÅÐëô†Ë¢ŒÔ êG_ ˆ³[Ä ³8!™¼Ó‚©>ãü‰ß“ endstream endobj 2399 0 obj << /Type /Page /Contents 2400 0 R /Resources 2398 0 R /MediaBox [0 0 612 792] /Parent 1506 0 R /Annots [ 2403 0 R 2404 0 R 2405 0 R 2406 0 R 2407 0 R 2408 0 R 2409 0 R 2410 0 R 2411 0 R 2412 0 R 2413 0 R 2414 0 R 2415 0 R 2416 0 R 2417 0 R 2418 0 R ] >> endobj 2403 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 656.9074 522 666.6044] /Subtype /Link /A << /S /GoTo /D (18) >> >> endobj 2404 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 643.7567 522 653.4537] /Subtype /Link /A << /S /GoTo /D (20) >> >> endobj 2405 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 630.6061 522 640.303] /Subtype /Link /A << /S /GoTo /D (20) >> >> endobj 2406 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 617.4554 522 627.1523] /Subtype /Link /A << /S /GoTo /D (21) >> >> endobj 2407 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 604.3047 522 614.0016] /Subtype /Link /A << /S /GoTo /D (22) >> >> endobj 2408 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 591.154 522 600.851] /Subtype /Link /A << /S /GoTo /D (23) >> >> endobj 2409 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 578.0033 522 587.7003] /Subtype /Link /A << /S /GoTo /D (26) >> >> endobj 2410 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 564.8526 522 574.5496] /Subtype /Link /A << /S /GoTo /D (28) >> >> endobj 2411 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 551.702 522 561.3989] /Subtype /Link /A << /S /GoTo /D (29) >> >> endobj 2412 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 538.5513 522 548.2482] /Subtype /Link /A << /S /GoTo /D (30) >> >> endobj 2413 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 525.4006 522 535.0976] /Subtype /Link /A << /S /GoTo /D (35) >> >> endobj 2414 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 512.2499 522 521.9469] /Subtype /Link /A << /S /GoTo /D (36) >> >> endobj 2415 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 499.0992 522 508.7962] /Subtype /Link /A << /S /GoTo /D (37) >> >> endobj 2416 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 485.9486 522 495.6455] /Subtype /Link /A << /S /GoTo /D (40) >> >> endobj 2417 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 472.7979 522 482.4948] /Subtype /Link /A << /S /GoTo /D (43) >> >> endobj 2418 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 459.6472 522 469.3441] /Subtype /Link /A << /S /GoTo /D (45) >> >> endobj 2401 0 obj << /D [2399 0 R /XYZ 90 720 null] >> endobj 2402 0 obj << /D [2399 0 R /XYZ 90 720 null] >> endobj 2398 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F59 1392 0 R >> /ProcSet [ /PDF /Text ] >> endobj 712 0 obj [2 0 R /Fit] endobj 1391 0 obj << /Length1 753 /Length2 981 /Length3 532 /Length 1526 /Filter /FlateDecode >> stream xÚíRiTWF–‚ZZA¤>Ä( I$„„‰ ‚Š Ê˜y‘ÉL&œP¬ŠÕr´„Fk-ˆ[]€º T .¸àFTPZEÄ….t@=žâÏöWOßûóî½ßýÞ÷¾ûØÎá‘î(¹JI‚vçsù$—Ëø<Àœy<›DA„ÆHb BC à‹Å^`š‚I€'’'I„"‘ê ‹O k§$*Ha „r„N€*†Cà ’T`Ná‚3ú:’À ˜©dˆrY|>@1 ÂxŒ`yôi’JˆÞ¦Qú})RIŒ(àÚ/“‘(Ià)…J–Çt’¹ 2Zþ YÉ¥ŸŽ¨úèûú¨Ž¨0<å‚T©54¤€œD!E „ΆoÅÉ!ŠiT«2Á1ECàÎ÷äò<ßæ±$)¦…h8F+€Á“`è@%Œý:<¦Ëä3£ÝÞ¶¿Ž`•¢†€÷Ýó?ÄŒI¦óx\Ï™ýþ;à²`BA¢B/€P’Âb> A*` µjÅ\‚¤™À8³(IŠÕ7W¡7ðP3£!Ѿ<ë㇒ÚT÷Ià.2ÄVbŒƒj¡‚e¼J*|V,Ê=´²8=¸ðB‰'i”~ÇŠ³Ç2è}¸›|†_¦ÊÎGÁ/ŸÚdÚ,ÂvÓµ…îò@•ÂÛ‡Ò ©‘™ 6†!vœüM‘Ÿ¶+ÆÌ7­Í«©þLµeÍ=ãèVu™[ûu—·’Yì {À8´­5/¾võõ³ôÄŒºÛFëQ—»:VlÞá°8ëþ­ì3=¦’…¤±¨vD̦¶oŒÕõ‰7‡èÅYyr³+zßWV<ŽVÙ\ÇâoNmŒþY<-Rb9Êëò¬­z`2Ò×YíWQ*lÙr‘#nqÖ®—-[¢ ™-›ÙéX’?\QìˆûN-r÷VÏ­TùU«Z÷F,ž¸÷‚À÷¾º,‡=#®û5ûéØuæÏc_¾lú³7Ë¡²]‘êlb¿Ût¶›÷fÿdW·‡œ³<‹K« Îs„÷èÿ&ëÉY5ªsþÍi]r-¾²Ôîê/«]ŒÖI·*wëDù\·_Ë b‚µ&â9'ˆ¯š žüq¢2k³`¾4h^SÜ‘¨knµ¥N±-]ek(—J Ç–[’ -#œýlGù|>, ¦5 $¬7VÕk³%M.ìévÚ)ñÚRÿÊçîyÝLCYÛ/§t‹»Ë×sEMHõ~lv,´4.å‚wé~é/Æç¢Qi;‹C‹WªR:ÄV9%â½Oøf[ÓŽ>(?©Ì£²Á×ÐŒ85ì§K;èaÙá/ â¸Ôÿ#•ÕE´îîNMùzÐ'&þM½ßŽÛŠR¿Ïhï¸æé´fKbÝÜÐ"vP£Kï]ÑÙ0Ucm\~vž‘¸W¢oàåL‡uHˆÈq²CøÓFó®g:ûÖÔ·[.…ˆn]úßÌŸÛ™ßã{ëbf©íé¶µu7O’+å½ó"sâF(“w–9z71ìĆãp|ø˜´Gø±Ç¢©V.Ž&uCîK^ßÉÙo×Y»¯÷Ò˜ˆª ±ºíò¤¼Žë²qRk×ýMd%Ö…û çËÂÁ+÷‹Ýæ·."ðÙܧÙî¼eb†±0¡jãí‡?¥³{ÍNJµéýuamûÊ#ÓÅjm†hõÕ§»L½C}’ÑÒ½löoч}ê† ²b›^ÿÄÛrhÍ mXm©¨î¸#çHˆÓ"‹]5ö«2ǹDWU:a¡•üªŽ=6i#Ï]žVJ¨(ˆ¿°ñþ«3E¼¸Xÿü'8D(šT!T"ë/*~5^ endstream endobj 1392 0 obj << /Type /Font /Subtype /Type1 /Encoding 2419 0 R /FirstChar 58 /LastChar 58 /Widths 2420 0 R /BaseFont /NIMUXB+CMMI10 /FontDescriptor 1390 0 R >> endobj 1390 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /NIMUXB+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/period) /FontFile 1391 0 R >> endobj 2420 0 obj [278 ] endobj 2419 0 obj << /Type /Encoding /Differences [ 0 /.notdef 58/period 59/.notdef] >> endobj 1384 0 obj << /Length1 753 /Length2 981 /Length3 532 /Length 1529 /Filter /FlateDecode >> stream xÚí’m8TiÇ£¬mj¼mŠ]ÕSí\E˜3&£¶˜°ÔÈVÑ6æ<3s2sŽÎ ÍdÐ ¡ËV$Ôb±”^Öªé I6½*I‘«òz­R-¶=TW×Ú»ŸöÚs¾<÷}ÿŸÿó;ÿçÐæyùØ8!x0tÅ1¥ Ó–É|ÀÉäšÁ Ðh| •(Ž­*!0ìG˜ °¸€±„Çáò8 ðñP5J¤J°ˆo9&â'9$P‘¡R 备H(>¸…Jµ-p’É€÷Øð† H„CÄ–Âd)A0” …>ÆäމqÀ}ÛFÂBßÂ!¡ ¡À¢qLK@B"8&SŠ)tOœ< ’,ÿÖDs×0™ÌS(³Oêos¡•©ß)pyh˜@€#À&Jýá[8DÐ0ùÄ©»R(CEN˜D “mË`¿í£ WT/T)’±P¦€ã}ˆ!IÈüÆ9è...Þž«¿»Úñ¡—Å”kÕ¡0>¨Çk懚 ‰@U`=ÖÁ`’Bò}¿ šp˜ &Â“Ç B¨¦0H+‡"˜Å¨PEÓm1\Ind2‘@Œ”±{å,ôPòjpd¬Oùû‡8;ãª;°aqHcËp9ŒÈ¿Ea1åøÏBÆñ¾£d‚ª ˆÒÔ€‹c7¥ŸŠ/ŠrÉ¿uXÏRa‘y0¶¦"N›éhÛýÀÑäqºv-œó›qœñ&ôˆÑ¾ÞUÇ舘óÐü”“ær„=îžñeê ËÜý>úý¢îÀ ºWr.Uʳ»šæv„ž^ÜÁ‹¶ð ½âÕO™Ü<óÞ¤)E £ƒQ!Ñ76MË@tî£å”­Nƒ~OÚv_ÿ½Ç ÏÇ› ®Ì Üÿâ“?šÌ«Zo‡´P3væ&7XïVœÖ¿¨¨ZØÜ’qQóÂÛKg¶ùS{ìÔ¨é2žÑôÃÁ&ï69ìVD'³ä숨þž«m+uãÎŒ˜fdÜ¡íªV¥´TG«'¯ÌÖß³¦"[²Ô´ÊtéGsN: ÉŒ»ú¶ÜmÔL3n?êk4»(¼æè4µ¯n^=hp4{÷ÙiVÏ{4 —æÓ .8ãCNÚ¼aº§T˜Ú¼ÝŸë]»ùz¥—ªåN‡-ïyg±k»6ÀÊâÉ`ög¹Ç örü¸Ê™QÇéw?8”©åïhMå±x£…¥J=v‘64bŠlìäÅœgQ›$>¢ßÓÕ¹ ¢þôˆmÓ³NjCÕgPŸÍË“ŸÍqüBS¤Ýè–’s5VK¬_n Ù]}vFå E²ìõ×Ñ©šg¬Vs†ßô5Ôôµ7¶ÉãVú–ðŠ˜<ºŸÆwÊ\ÃÛ{Ï6cÇ&:ÃBIçÕÈ´7¦4f:m—×E7>(·«²zXƒŸ®¿¸¼›Íœº.`xhÈ¢G.ï›ú¼Û°‘ºÅj'Å=ö’‰nêÐY·½«±†ºƲ`…ÏLG¨7’´q’tîVé©ëÚì) pm׆}í,SÕ䑊9%¯ ï]£æš!®­~¾Îå5‘vûçœXíþ9–L<ÝÑí¦‘ŸöÏ,Ž¿YÞ¸1ðË­“nXßJúmL‹ÿqªªçaE-oÚ«ïJ¯ˆ›ÍW•õŠÙÅ•ÉVÃV)þIøN–†7î¬7r½¼èñ£kÍ+š5 ~¬›T¿Ô1¥¤6.JÇÚóDhiLšïÉIn5‰ÆWwµ,•=8dÃv Žï2Ú"]€RêíZyîv^ºÏ¥Ô ‹y³V Ìü¹M}@§; MpÛ¿]–÷ªe³k9õ§¬Ç….Žffÿš”ø°Òæh0rKW;¿ûB팡 ŒÓ>ùW¶ÿËÁKùuQí÷õqEÏ/)õî³ERCË›F:þÖùß2Âû!Jx0¹"Áz݉„ùÓÍèöü®+ $Œ…7ý’> endobj 1383 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /EEERNL+CMMI12 /ItalicAngle -14.04 /StemV 65 /XHeight 431 /FontBBox [-30 -250 1026 750] /Flags 4 /CharSet (/period) /FontFile 1384 0 R >> endobj 2422 0 obj [272 ] endobj 2421 0 obj << /Type /Encoding /Differences [ 0 /.notdef 58/period 59/.notdef] >> endobj 1211 0 obj << /Length1 907 /Length2 2704 /Length3 532 /Length 3343 /Filter /FlateDecode >> stream xÚíRy<”{ß&KŒrl-¢Ü“Ch˜cŒ}B#»™$¦™£1Ã̘ ¥D¶Èšee(Ç–P QRI$eI*{–Ð3Õ9§çéùó}ÿz?ï}ÿs_×÷ú]ßëþ~JP;GuSíhI£2Õ‘H=Àë  5%%s:H`’iÔ}&¨ uu‘€i 7 ‰Úz(]=´.D 0§ù³édo& b®úM„Lý@:™H XÓôãy À‘F$ƒL¶`J¡ßN0ÒY I‚D$2‘ ½ÉTü[+ª Àü Iþ—X Á ¨ðBª¼ˆ$•ÂH nKãõyIþ7BýjnH¡Øü¾Ùófô_U‚™Âþ«Nóód‚tK#tê¯RWðG4,H"úýZµb(d¢)Õ›ˆ™aIIvd&Ñð"Pàw¤’~ ÁÛ÷pW {{»½ß·ù½dG S™NlÿL¿i¿cäOÌ› ¸!4$OÈ{ÿþrÿ¥••H#‘©¼ë€Öt: áÝ B!H€L%AÄË × Ò˜¼#o$§/òm™ZZœHóó#|£0:<¤Ó~ºœFÿÁhgžøYG#y؇þ›B€{Ñé?  ³þMÁkËàýá?Íà ¤þd´øýüÃ`8•üWÿž·™-(D¥ ¨kò"(mƒFœú!1N©ÌïW™·µ¿±™·c ‰—}4¢~„ozmäÕP‹ü§¥BjüfÞu‰¶Uw{šÄÂû“ø)EmÔ†þÀ­”q¤ÅÇ…ÆN¬Ê1bOÚwYN…$fô®³<Ç9Áõr¸Y–ýÖ÷bøäo µÏç? ù=꼚Š/hË™¾?yÙNeŸÓ»¯ |Ín¬êæ¬m Î’CqŽ:÷‡2 ê ‘p5Z+Š{B"5Yû$<Ô7JäæÞÁZc ÔJ¾H^Êú‘Å- ’ÄF”ÈšŒÃ;ã%Q¿U~mí¸n’x;Òq¡‡‡Vá—¤#¯çï°ðèžÞöØ"Ëš‚Õ7â kJÚîCEc¨½>Öý…ˆéä|Zy-û îÖZÏÛk=2õ;<·¼Pý´* ­ÙŠ  r´Ýdî 4úõ8LïŽÛª°M]ɾKÞ»KL:Ô«) H»¾\)•ä¼³†'-s_¿yæãØ´Ñ£c;òªé¬x[W¢ DTÃ9×o§¾xVÝ6þð› Ï”åHLpš°ØŒÚ奮ÜbÓu¡½Öš·»œK|¸DI޹ÿ’&¬óCtÖ½bÅN“-«ÖW!ï2CÒ:°«O6ǧË>®qH ÆXÆ. yζ˜Ý ó¦[!þ-ºÂÒXÔªäŽdã8ŠÚˆFöå–˜æ€Í)ï¹’!¶!û#Rêw!hƒÆE/tJ+­¾ü±ƒïšZf6tŸûè¶ÓÐþÚÒ*rÇY‚QQÍ—ýÇ]´¶ïêœÖ_tfO<ÖG¢éؼÎñ¯hÂÃ.&$›è‰ÞVuº³c¨ó¢R‚±ª´œ@~®Ž×†½.N4}½Ãáw³yºçÅøûÒ²Ë!/V†}¾öJ,?Ó±¶ôвµf{çf<¾5í‰BºõZùäù¬GËwçΠBq¤=z2ù¯•×C6PVø¨ô“mRÃZgDý>Ø ÍÆpMÄ ¸‘¹‚é-îšhûáx•ùqê01*F¨ç¤~Lq‘í¬ìžƒ—ð›‰ØvžûÓ‡LÎ}<×È—+»Ù0³®µý U"w£+ã+q+õˆLP"3IÙcnòÁˤP» “®ÆkGó:3S%©g}‚á®oP!:t 4ûiãcKÜO£ä&/>ŠÓi=\û€›€“Ÿ›+Éyä2ÁÛ¬8îI/I>ë2Ï]úÝW÷Lx%çeõ5~ë„eœÁùÏfæ-£¥Ê)ö‚¸½LÆ…TH]ÑÁÓÇëù(”݉n]Ìઘ=@=®r«a`ø˜ä0Ø»ò&L¨†)è+f¹ëu¢ÞàØŸ1µ¸“Ù¸D=fbäâ¿ ž â-L}P?Fç•ÐÛ/ÏÒyÌ5ÄÙšžAù ÷ÙÄ6ÆÕ¥†.Xïî —Å6j|âÍ\mMî êì^n‘~ŽjF"·ól,Ø¢€ (YE÷˜_üRÚ`Ÿ[éú`SÞlr¯xÁ)ñM'‚‡guŸVÖSvjYÔ.8bªÙfê7`ss›®Íà6†J B°û/êæ y¾ÒÙÑwV£†£.™è—{Áðˆbçà(4fk¤j¡d„+áÌ@4žÕsÒ8öü[‰‹¥ÝcEY+%l÷‡z_.?ââ‡k+5Ý„¿ªÕÅÙ¦}l¼ 7]ÿ!¦ìI‡3ÒÞ6ö.âÜ­nKnèÚ§'r?ê$Úu6G±½”?Ì'í/~v’t.Òmfºj2†oö½¡TÏ-ñíÇɽÁŽœ±¶§ï•ê¸Ph‚Õ‹ÊD;Vp\`AÏŽxB3ǼËòdß‹$×¥µž ú( ëm^¸WV×`©q,"Æ: \–0S½»ÙGñyañÖíšûc]Ïͱ ‚Ã-C#ð§Æ7‡™®Þí0×-ÌxyîÏ&ïij}7 XÐfÅLá{Që×0Ø·¯ FûÌ%Ó½Ñßk}ÿy0¬½B4æI·RHKžpªN±j0_BmÛUF¹YØJl^Ê©Oì}ü±ƒâ¾žòVæBI‘ ÑÂà--ƒ½C·Çãòõ°øÄ¤g»N„Dá3(…è/V…цUI:W0xkÊgpY—õNÐ’ÙT4_C»t©)òKP÷ޝ§Îè¢-ò¾¤S«ì·NœˆÕë¹2Ÿa5ó+pyɪ*2Ô.{—ɘäA¬œË k"«]n)ÁÅ©{½·uòNaÀË–Éö¸-²W¤»§“Gr̶ݓ&ˆ¯íRNì>$›mÙmiB¬Æ )…­â¥–ï¯ögDŠUħ† չܭ£^¸åKç&g9†œ/]'mrãB«9ÛRÜ êœÇšø]ÜÞX±òøÌ©õd·ž3àn~¸ÉÆO%j!zJk2;*@¸þ®OÌ"»±ëÀw/_ëÀGŽÆ¬3$;‚©µs"ýÕÑ™âM/Ä‹Ÿîë…)`eÙŸðáÚ“2®^©¿G¿ìð™·P-DË~+˜eüŠÝQIõëO1 çJdT22•q:¤ƒ›-0'e$Hê§·°¨Õ‚³Q“ýg}Sâ À½œ5E5~Ì^³«>CG æþmUçÚ( ²¸vx…ѽ:]Eì°e›gµÄÔµ½5¬¿â=ç<ïùÔ#f—ûÜÇ}¹%ž…[ð‹¨P†‹Ý"5O)³Ï y˜š\ñ²ß(£pÓ»Ý๦Ƕ"ayçz]æ(.e©<"ƒu%½gè1à´o!ÚíµƧ#FéI&G^UžÀµJOYÕ¹Ÿè³ä2Û³Ýð#çÀˆ‡G°Þí/Û?2X¹_…ÏÏDöá^Ý+6º*/ëNl »{xR`¨:;BÑYù÷eAC<°4xH…¬nôãÏ‘( ÿÅ#Ïdh‡zú¼˜ï‘ƒ`I é¼ïÂãÓV¸³áú3Ö»”s×À[ŸÇÚ>]ì¿ÐÁŽEå¸à ±êy±'ßYÝLD¥ì‡šzVÆ@7âgY¯Ê)§DËøÆWEn0‹–.°žªÒâíEIL è‚ ÃWà«ÌLáM`Ãø–ÂƒÞæ<*'$³rzÄ}-¡&wÜà^*§í"áÆH`Ÿñ(7ác/ ïFVЩv 6éÕ½ ½½o5F[»±XTzÃü­Þ% ÈÀìçÝŽ¤8о½fËAwð õKæH½ñ5XìЩʶ»“ÛÕ#³°þ¥B)ß9¸üë}©²tÇ*”~’ˆêèžz£ó¥û ξ\¸åŽªœ]´|"ónó§7Ä6vÎ^oš©*ÌÕº«z}÷ƒ4¹SÙÙ×=>Ù§úp“1êá«ÒÉ.ì9`ÅíÕЧ¿Z[ þ‡äÿ þO) ΤùèÇ!ÿþÁ{ endstream endobj 1212 0 obj << /Type /Font /Subtype /Type1 /Encoding 2423 0 R /FirstChar 44 /LastChar 57 /Widths 2424 0 R /BaseFont /WEKQQP+CMR9 /FontDescriptor 1210 0 R >> endobj 1210 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /WEKQQP+CMR9 /ItalicAngle 0 /StemV 74 /XHeight 431 /FontBBox [-39 -250 1036 750] /Flags 4 /CharSet (/comma/zero/one/two/three/four/five/six/seven/eight/nine) /FontFile 1211 0 R >> endobj 2424 0 obj [285 0 0 0 514 514 514 514 514 514 514 514 514 514 ] endobj 2423 0 obj << /Type /Encoding /Differences [ 0 /.notdef 44/comma 45/.notdef 48/zero/one/two/three/four/five/six/seven/eight/nine 58/.notdef] >> endobj 1207 0 obj << /Length1 750 /Length2 984 /Length3 532 /Length 1533 /Filter /FlateDecode >> stream xÚí’{8TiÇ»!#•îréEž%™›†ftÙ—i°F…´uÌ9ÃÉÌ9ãÌŒf\Z)a»NŒ’6©•JJÙR - %•­Ë–’(%ºJ{°==«?wÿÚgÏùçýý~ß÷û~Î÷=Ö>{.Œ#î8&·gPàÂç{°¹¤Ó)ÖÖ.ÉQs…ä0ØlG°T!L@wâ°8,ŸàR†„Ê‹í€È p% ! ð!y("!=„p!ŠÈUTÀ‹ïÀðEdÀT ƒ`T(ÁHŠQhH˜NCmX!ý<Š@ l1m ã˜X`DD¡yáäiÉòo` 7wWˆÅ^dÀ~ ¨¯Æ«þà©BŽ€Ã —®D†ØøŒ*$çrHŒ ¹XˆöŒyTú¼¡>*sG•ìƒÊ…¡@‰eÈ`Áàá$d|ƒ´%‚¥ü»¡‹œù@(&÷SI@ÿ"¬_j2"U‚Ut*Î …äûyµzØYn˜‡Q,0YŽ"HE¡“VL D1ŠÁˆ J˜FÅp9¹ÁÄNPn•5ФäÅàð@Ÿòõwðx¸2ÊžÉöLiLwb'=æoB¡‚ L>ø«i|®E( ‚(!E[ ã×¥žMÈÙà–U{TÇVfª9_]¼©@ãLíhržt›(¼á‡˜wm2Z‡æNÜóÌó8 ±ZŒÏr£+¢´M÷Œ* §Øþœ.Ðëv}?ª2³¼t‚$#±M;«UZh×Õ`ÕÛQ¬“·¬átÐøÙÖ19wë?¾ÚöCM‹Ö ¶z´‡²:³h™Yñ¤y{ÕûÎ%x®Í®œ”Þ;¹_k\ÚXö»¡†”É}G³°OŸn«ýQCaì ›¥õßÏ^*àŒ5u¬ï½¶æ™wúÕã­æcÞõù¶ù_í ÜY¬e%¼»q¥ ¸íàÀ–ÇyºÜ„‰•f[¨­»šÔVÕ&ýSu'oÏß[²;rä9çòÐâ½sÆ£9¡Ëyì_“Gäe^|±¯&äÖ)ýeF–÷'—´›¢Øœ.±¬ó|zì­ÕäžµÞ´.lºDFÙ¼·uuím öbvd‡éܱŸœøš’%§qµß{íÁ[×ÝLÖï(“fl5kìº?΄—»‘høiü„©' -Otlþ¡'Ñßìðû”î˿Ù1íM®Aø†)IQi÷î”óݵÁq»‘RÖ½*K}¾¯¶»€§8|gtïÆË¼]5ÂÚã´¼&‡ó ×_ȹټ9¥¡ïàƒ¹WÎ×øÙÙXÀ©¥ÎÈËð1=8 Q#sÙÝü¹3¨)ÓW»>ÙšŸÞVàï­>8cÑßU½s[]îÄe¯4v4 Ç}’Æ] ä³|nÉV„a`âV¡iÀ"E$‚Æ6Žëõª-]|ªÔúÀX¶Ax¦èåÌÝëô ¢Gœ Î*Wk :OVK+ƒ<‹ºõZFáâHãîc"ׯz_Ýêùéî¥OvjÛÇÚÛV±£ŠJ—_Vgà?öë¶›lÎXóè ÷v ¹"‹)³3›ÆtLÑÏ‘²›­WÁ;óO>(qñŠÓí> endobj 1206 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /GSJMYP+CMMI9 /ItalicAngle -14.04 /StemV 74 /XHeight 431 /FontBBox [-29 -250 1075 750] /Flags 4 /CharSet (/period) /FontFile 1207 0 R >> endobj 2426 0 obj [285 ] endobj 2425 0 obj << /Type /Encoding /Differences [ 0 /.notdef 58/period 59/.notdef] >> endobj 666 0 obj << /Length1 900 /Length2 2416 /Length3 532 /Length 3036 /Filter /FlateDecode >> stream xÚíSi<”ý¶´0DÖ å)K–̆Á 0cÔë%5²Tbšy˜af±d-kdI²%‘R-ÈšŠÂ±§D–]JY¢’åLõvêô~<çÓùçùò\×}ý¯ÿõ»ïûQÙnƒ×2%1Žƒ8­…€"ÐÆÊÖP8DEà l ƒŽ%°A4€00@¦7 (´Ž.ZQ0 O?&ÅÌÔ0ê_Ez€) dRˆ:`E`“AσH x‘²ý €)• üz‚Y Ó$A!@¢ÙÀqÐB‡À¾&ÚGwezßiÇóGÉd²x¡5^Hu€‘Ä Sýè Y3xw¼$ÿP¿›ã8Tª5öÕþ[—þV'Ð(T¿¿ š'‡ 2+ dÒ—ÚƒßÃY$ ‡ö{u›@¥MénT€§(,Å$ÙPØD2ÀfrÀo4H'ýž×·o `ŽÜþŽš ô[ц@¡³mý<ÿåúUý #~b^{˜_à ‡#xBÞûãËé·ËÌéD‰Bçm„. 0™?o5xHðG: ô@_^`”Î`󎼞® &äë“×ô= r*ÓìaTr$s„²Î­8 ’Zì\V¤Vù+éøŒ½"-bõ[,¹Nï;×Çš~)؃/¨ð[q&DïwÓ”­òVÙfØäxaQÌÅôK‡ƒÞ³ó\ž£JºjZ=å‰ æH\´¥3h> =š öüU’\±Þ°‰òXË«ÉôO‚ÑH—,ÝØŽ‚^¼l÷D¿ú“Ø áÄŽ<sà³ k.ö²œý aT+û®´výÂH°_Zà‚à9'Í'μì$_ô¨äÒ#u²®ÐÁ-rÛ‹¢8>DN¿Ý™X=Ä5¿ÉÛÂùGÇj³Õk¤ƒì¢4CÈz Þ²I3÷Ï»µWƒD`Š*;u[7\òo•òX÷.ùÄÑØY«¦‡i‘S*šnÁ&EɾÍá}K0óÚƒÉA¦²Çž2ÞÖ kÔ´½ Á½ìÓk€ ÌÌy‰”½?šãÀÍÏ1 :ÜØùЩ6fàñá }õ­æWªgÎ2†ÞZ,× K¼É Ì·z0ÐлÉ!ÜÂ];]Ð,ùlµ*$Ø„<Ù“1LµÕ©æAÃìï\œöwZcAfíí/gìÉÀ·ÚõµK–lnI¼ÿ’Dˆ°’(ã×?+"éY»—Uÿ«ŸE+oͲØ}óª-Ëc\…½U¨¼—‰Èmˆ¢Ê\7RëyY/>©”¹æX<ʳU°7s<¨ÍM<ß0WŽÁ<@KŽD”Œ^þ”]Äû>‹m~÷SC_ÁšíIß?§i÷rá„Aka¦g‚ tôjŠL¢ûëô´!hû„]éQS¥‡dSmÖ;]ÚbWç*…oV¬•츸v¢¹ýé?ŒÌ«Dg€G]ø£÷]9¥k_Ñ`ΑÅ&;W/›»Gº.'žv ÙC9Jǰq2„wL\† ¬°rüV‚ÊÝ×iQQ¬›»ŽÞî¼5øôð5̘¤qNUf˜*hjDX°ž®Ÿ§±óŸüSkÝ-mf $ö„”õ¡…ÎF¸TDÁO/¥f^Ê« ¹ð  Y[ð”É[‚iµ9î5ÉõN'7ä}™(ŒmÄV ©4œN¶ëÅY¡¡¬úÍå¢\dua6]fu~µˆøñÔÁ`ñitÏñâkó¨H·.µ^ 2XÙ„¢s̼*âdw½“R üøÉÅà$êX§É&§¾m¶°Ýfbh}á»FòLÕ>©&#$ÑC3¢w¸UEƈ¢¹["»Ø§r…oªä[Q=iؽxçXÒÛ˜ÿlÚe´£ œöïJÞÉ/ü5ºüLý1äoƒŠN4-|¬Ž°Â—wBžÖºÉUfC‰&ÛªôöUÈœ¸à­a yž9x:[IU¸«§6ÿº!HÔY½QÀµ1îsï‘c]^GÚI4åD#²Ô®œQ=—p“\üüM%ŸB¯ Ee†.eXg …ƺ ŒyÌ-Ï›4«kÍ'-¶æ#t»#ëm=GþhRÞUÒ8’a™‘¬¨xC¼­ž¶iÆpËñ=eFvÏg¶…{tNí©–þ¼=DywÍ•rzYôæ¸´ØøØÅUa¯Ãªøɰ‹s†·©Áý¨'Ë2!š›FÝ-ÅV “߾áŠ;g•ï$Îä¤Õ™‘ܱuﬡÂÌ´&.RëMXšÛñj7Á%¿ñÜ¢R@6½æpÀ¥ªèeÒ8;&8òRRJ¿?·TŠð- 9ºnèzqÔÜ…çÊ :«ÔȽW25„¸™V‡Æt­ó9Ԙ˓=.K}êµç,ùw™úÝ)ú‚W4=ð‚÷¤¼¬÷b—UèDˆ”Îf£VW” IæiγQ ÜI{½SO+$ÎZ÷J„½p­ôJJéÔv¿#ÿº°d ŽÈÝå¾¶º¬Ù6µ/q¯cŸàG‡æøO—‡²£â±‚‚›äÖVèó û–¢l—CUò÷o× HcuNý1•z¿Oz~ä‹×ìÖl¥f¯RŠÀæààž$iò"äžâÙ„Žk¹C^HËú W[2c†ÂØÓÈ'ƒËö*åR†ãýYz҈•×ÎUÕsm|ƳR¼vjxéÜ^m”ßkqcHV¨Øz~iåBûO¹Ã¥‰…gê²?Hnïß»·$“,jþpÇœ.™±¬©ZsÊçno !ÿÏk5ÔW4£/êX§­þñ²äÁ\A¥«îûüóÚw¿A÷Rã>ošÜÒ j‰³Ê„y]ôÖ¦S¸¶´ÜEŸfÈí•è†% [c¯¬ãV=:ñ•UÇ©é¶Ë/Âß.#ß—[d¹¢ëäòð…û‡ÈÒYÆDV-¨ÄŸÂ`­|X†Šå$Ž«hã¾Ig¢“•Óæ]œŽr«l}$ôýo=²9V#Œ½¥'{}P]û¨ëÞ±3͘Ìë­Éåx@¶!­ ½NéYf-;äþÈ@ñâFyþÓbº–Œ\³_tzí§÷—й–âw_xÂù'Ì2$ u˜ JK]œî8Æ:U¬G¼\±mËá㉠žv±Ÿjx&©C6FF“NÖО{Fî „Ð†j‚Ñ÷NG—5<æ\çåšF"ú%µìÌpÎ2á£øa—¦Ò ›àÿáù¿Áÿ„‘ ˜lÀô€ü„ì:r endstream endobj 667 0 obj << /Type /Font /Subtype /Type1 /Encoding 2427 0 R /FirstChar 46 /LastChar 124 /Widths 2428 0 R /BaseFont /YCFOQY+CMTT12 /FontDescriptor 665 0 R >> endobj 665 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /YCFOQY+CMTT12 /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [-1 -234 524 695] /Flags 4 /CharSet (/period/less/greater/e/g/i/m/o/v/w/bar) /FontFile 666 0 R >> endobj 2428 0 obj [515 0 0 0 0 0 0 0 0 0 0 0 0 0 515 0 515 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 515 0 515 0 515 0 0 0 515 0 515 0 0 0 0 0 0 515 515 0 0 0 0 515 ] endobj 2427 0 obj << /Type /Encoding /Differences [ 0 /.notdef 46/period 47/.notdef 60/less 61/.notdef 62/greater 63/.notdef 101/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 109/m 110/.notdef 111/o 112/.notdef 118/v/w 120/.notdef 124/bar 125/.notdef] >> endobj 438 0 obj << /Length1 747 /Length2 1091 /Length3 532 /Length 1637 /Filter /FlateDecode >> stream xÚíRiXSW¦ q¬a±Ãà‰L H³a Žy „¥BL¡*ë%9„ ¹÷Æ›‹$ tjAJÛi§lS‹qÀºl¢±R[Ë'*®¨@ÁÚ±Ê3¬Ó§úsæWŸžóç|ß÷ž÷{Ï{>6Kà R©0”À)Ž€+ITðú˜H¸|›-!!B¡‚PP”¥^tÝWäí+òña°„ÐèIT•Nw‰Ç,ÈaD¢*b4‡QƒBBJÏAj5ˆž½¡ÑP ÉÍPÉe@‰*( U(ÎàÍjŠÀÓà÷,­ÌÒK£ÚPT•r”R¤ƒ4D­…syˆ+_”A›7'‚+ ñüï¿Î•åŠS±z üŸñs±àç˜v‰Du žÏåó4ÞÏO‰/´“â B‰âô`}B’ˆžAO A® ¸êÔÑšy\œ è+€6&¤$cö[ýüO6›b¼üŠà`B—ËñŽ—æô¢±~B~Þ/€Š,’„857&´Ïã4”vBT0Lý„"° £¼i[m¾tïÅ:+­såþ‚¯…Ç*¹cCv½dó…Xèòm¡mz€YvíAž2M8²¼)hKgn ¯pжs±ƒÇ…㊱„¤y]Õÿl_‚íÜqË´bTÓì9~Ùõáðf£ÕáÈ;¿=Ëï[Öô?ÊÏ|ç›Ó¢ ¥ë2Fbu[ä§0îöðGçß #ö¦š®e UígLËÛ¯\Ê4/® (©Ž²ˆJAöÍ‹ÜWÜæÓ‘‹ãªÓ[Î4Ù‹eÔªS­dlýÀ£TEÍÇå¢kÖ:äv…Ò­ì©Ë‹ãsBÙ§^Ÿøá^ûXOW \¨cò5©iï¬??zöHNqcR#n¿'¥üªÏTuÊa³§ŽXlc“\~µ86eKÞßoåkÃ¥{*'VÎ|\=Ý«Ç Jò2“kG‡NÄvFî§ÄSW2S|ºÉáÂ'F&ÏñH™”Ó³Ô{œ™ûèSÍU©%Ï;!þÕCýo-*}Õ7T±ç9{O|ÁšZç± nщãêŽ%Õ4Y'{íœÎ&÷º$G›?+mr3XeèíÐmt{ÀjÞð‡¸pqŽÕÿSò±œ EµÞ ß:GÜúª†ù­¨7ÐòÔ²Æ~²è^½ÅêO¼½UïÏL>ŸÍ»Œ­².Ü%ºh^s'Ñ­`f¾» §Ü𖶬«·tiþÛÒ…§W·bûž,µ¶ìmzÏI.©wâÌM.¬Mž­–výëùéw{ìAB|¼´%ŽÇR¥w|0:ùGwèônKGÜšì´à/öóJêî¬Jº}Ç7sº’ØÏù›¿îÞØÇ©›LéÛöß…œ2×VtW])Òn7ƒÁß¹žtÝñÓ9u0PÆŠ ë‘Á†1ݘyWs’V½{¾¾!?eÇ–V;¯ÑPÙ¼Š¾Õ7Ÿ:¯þ^·ÝêA›!:bEÛ„/éð¿+|}{é²'“'ŒžçkyÜë]—úrŠR…5¶N£Ö/«ªÓ!Àîè®…'-æÏ7³ÌOý×ü㫎ڊy?tÞL>lnvÔ­Y÷ôÄ,—mMÀl³˜Ñ—¯f¿ Ǿ;bô¸fÇ?ëž=‰œýýZ쮢ñ_ånîË>ÿ«ƒõ «ÏããpveàÛ†^Kݳ$?Ì*Ì•L'ºœ.=ÓwaѨô¶m•ãªÿæ~Óû®ÏÚH£:{ZxíÊGV‰KÊÿ²²¥~üÀŸêƒ 2Töp±1Y´IÉmÔ±’ìÀÒÚî¨oS}D†­¾8P서ÀHÉæ:†^¯·V¼Ú:8ì3ëØ™þ·‡š6Ü(V7‰Þä%—¼ö¨ÈÐsòPD\Óµš÷3Q¶ƒ~ÜÑ^~³D¨úr·€ŸÉZà¼Òjw3Êiã; -XëÁ|]Î¥möŸt»É–¯:¤ë>sãÀ¹ âëaƒuƒMÙM¬‚l¿ÿeUaFÎáI{ñ=ÖÅÑqŽ©Ñm–öÜ6o:ªàÿ‹ñÁ¯‚@¡†IBf2þ÷ÿlM endstream endobj 439 0 obj << /Type /Font /Subtype /Type1 /Encoding 2429 0 R /FirstChar 78 /LastChar 78 /Widths 2430 0 R /BaseFont /FATCDD+CMBXSL10 /FontDescriptor 437 0 R >> endobj 437 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /FATCDD+CMBXSL10 /ItalicAngle -9.46 /StemV 120 /XHeight 444 /FontBBox [-75 -250 1278 750] /Flags 4 /CharSet (/N) /FontFile 438 0 R >> endobj 2430 0 obj [900 ] endobj 2429 0 obj << /Type /Encoding /Differences [ 0 /.notdef 78/N 79/.notdef] >> endobj 196 0 obj << /Length1 1459 /Length2 8090 /Length3 532 /Length 8953 /Filter /FlateDecode >> stream xÚí—UX›Ûöîq·÷ࡸw)Š ‚ Z¬hq)¥8(nŠCqŠw+N±wè?kí³W{ö¾<çê<'¹ÉoÌ1ÇûÎ1¿9¿', : Ykg+ˆ’3 ÎÃÏË/×”ãøy8,,ònK8Ô¦` ‡ˆøÅÄø²¶€'ˆqaqAqa€¼³‹ÔÖ`—çø+I ëqƒ‚-aMK¸Ä Qlé9ƒ¡¸/@ÖÑ û× w€.Äâæ ±æÅáçXCÁp€Ä ÃáûË*ÌÆ ò¯°µ‡Ë¿‡.v?’„|.ˆÍu¶þð9à ÿ°¢Ž;baÿ°è_uFÔ•ýMˆ’r¿IÀ'ÿ›s~BIñø”~?€Où7 øTBAã7!4BAë7!´ÿ!Q„‚ÎoBÔý&Ä*õ~bEú¿ ¡gð!Îß!ô¬~Büñ‚Ö bM?ð¯mü~lÿ@„!»?áú"L8üŽ †ÓoD<Æ|°?aÃùDØpùºn B×ýD´þ"lxüž †×oDÜ}|Þ †Ïˆ°áû7þ÷¹”“sö~É#üÀóDøWù"B@ÿÿ-ìáæÁÿ¾ñ§ûßlE܈7Œ3?ã –µW^ ˜?VŠÎ‰,gÛ UÛ1Ù†2—ˆìX8¨îʹRcxS–NL°¾MïuGíÕê÷ì«ÒÏW® ©ÓÛžÛé¾MÔ†'éš>[.Œ—!û„-õSgBÈÚ+C%ÉF½YG}ûïuØôv0—:M<ë:3B…E •Òõ#ÂjXt‰R]K^ F,{%'¡-†ØG`5r-;·z<¾ÉÇÊ}ó`Žt ƈŽv§z= ÇÅ_8¤– öoúV'Â#&Ô¾‘½SžS_òiD“¯’ºcËx•ëNIÞÛ«é”i£¹ŽîfCay ŒZr¨Ã28aNªßàzºýaˆ‚§z#-¥ƒèEÍXúEÅÀº`£ô•`Ô:Ÿ@"Wär¤rJ‰IWý|Éå——>|æ+kcy¦´u7˜˜å3NZ™¬ÄÂBþ'*i²hÔbƒA{Ñ–ê<¦šÁÄǸYœÚ…2-¾z鳈„ ¿C>Ÿq)ÛLñ‡‡ÄH°úAÀªÚðЊ‰â¦™z~y,EÊÁãåV(„ÝqÝoq¾ŸT{p/^Ñm–Og¬´4éŠozª§êŸ ï«£ý0øˆiHéXo©%LÞ(Y#ë;æÁK‰N®ïK? ËùÍò²‡qÖæVÖ«Q¡bL15ç 2ô ¨Écâ”Ø„¸¯dv(‹]×L-ÂÞû`\¾4á¹±ßvygk¸¥Ýmuç–6÷bX·yÊ:#«L¯FeF…æhøÖùPª¹ÄJUE”?ã,JÞàb±CãO0ÏÄŽ}5¯»ú ÊÏhÝkæÎðÌS?Öc§¦ðL5´ikQ|YÙv°#K63¶ öMû})wMØ û¶[íç‚+ ü&ëðç¢Õ¤ùü{Ù÷SÞÄ兮ة_›”×çw+î¼ {ÎÅÃ'—¼Põ¾uþ•nlõðÏk™}éBO ´+!h–Öàâe©Ôðîwâ‡>n˜"_.ßÎÖÙM©îKEÛRíò„ˆDœ.Õì´p’œËo3ÆFM2såfM¥¯¾ÿ ØŒN^uXzè~.‘ÿ󤋌hô yº^ÕáØêóôã­ZGPÈLèŽØ+YèMJš.pÍü\y»›S½Õîß6Š™uù“¦ÇgÔë¹zOîìq²ú’6‡‘¸cM¨¨jætÝ¥Õ‡¶çU̳¯¦K©î¦ÝhzúHômÀ=cüEŒî#’¦Ê²àú´fë‡]{² Ä§Ç˜„ÉØ%A€|Ì(‘—¥¥á ö1ϰïºúP›…gÂ|=©jÌK‰<—g¸;ÒmÁž Ê—ͦS¦¢ð >kÑîšLG,4È‹€=þ¶ïK‹uN*ãÌÏ kú%xdÆ€ßr‡|ßtØÌjÀ%é'ü:æÕÓ,Ÿ;µûí¹¼ÁV%#š';ï ¹<,éÙ¦ÑeÔÍ>šýñž§ÍHÁ¿òüíãïƒJ6Ã/0~ejnfe€Ž{CI,1Ë ¾‘ËlômíMJ"M4r$ÎÓÌhõÛíYí¬Ï%^XzûçG®ÄçnN¤ÁHy t6£*wUÐ°Ž¡âoÞ¼îyçUÔßßø»ìîJ"î½}º¹ÏƒZ/œ¢àêðc|Î0¹¢lROòÊÚü>Gy˜9XTü ß;[”žCc}·4m×ö¼ìÛ ÅAyRÏ\Þ&â}U—ˆ7J²RƒoÅÕkB þ0ÉW˜Œc@ô}w¸ÅÓü Ë «YpÄ‚ÿF,i\ø}sõB©hwƒkˆÚ³æ@ÐæIT¥ßÇ™m ³»ôð."|F%Ò&~eQ.5*r(ú>²d.FgçÝÁ\Î×Äî—§×Ü#G+W|œTŠ»_}`6A üoÆã7Û¦„9½;´#yXJ|¢žŸ° XÄ(Ø¢„ ,áëH®Âs­ETín<6»’0™vœ>M‚á„CóÍéñƒÏ.×4‹Î§Ä|~¼‘#ê¦tnÞ-‰7§`÷E<¢p_¡RMêÓѰW]ø2÷ðe-Õ×qÖÆ®¶„u‡ÙUQóâêsÞƒÞp¸kÀfŒÒÞô–Ö.ûq,‰…M ¤­;kÉä{zÿÍjeÕ­UplÔå—P wÎb7Œšj9ë$?‰x%¤}M6õžóõå~-9ùÙ§è^“.ž§—Þé=Fçˆú5ð%öÓ=o¨<‡ ƒI'»vÃJµîólÅš1“‡Ut_¯ B,Ú agtµì9¦Ï‘!•ñÌ7¹Rý#îÕ¾®f‹šJ9 ²ÜóC(kIã)kèd~>º,ÎaËÅ·âîÀZ ¿äÙ‹2v`Áv™Ò{ÓÇ“óµÓfqtÃׄ2V‘áN³¥|: Ñ|šÝó¾æq½Ën–v–ÓE3§>Õ2Ò¥0A%åCO‹¾ÙÑÒ’ñ\û«¨\È“°Éö«‹ÓÚÆû¶NŽŽ÷"’Ͻnɺ;1‰á­Æ¼h”*gÙ©Ë7Çòy3’ö6–T·ªÄbÁ¨kâ†NY"_”ÕÅ}¾´®†6‡©« Q¯³Œé¶å÷VŸk«¥éjØ gú5kÒóÅÆÖu±¨¼¡üÁ[r‚y»ûÔ)aMzªÝFt*Ç-˜ƒ'‡ìÕ}Ô(¾î³l§ÚuÁCLb#-_f^5Ž¡„Uq„#ë’8wT¿íÁd&~‘WÚLü.V™1Ü#™Ï¨A‘·Ñõ¨8™Ôþsð˜Y×M”a<(ŽXPçà [Ó…FLšÙ}¨†¾»ƒÖõÜaýʳOëùìo9 Oß5ž·ºiøWc=±z{¿˜ërÖbeœ vˆ`œzŽ‘€öå´ÿ†'ò•Â&Ï+ì!ÿØHV])‘XN†gºïŠB8_Ñ3 IVÓàn%ÍÎY´MZM<Éš"^vºù²@@±ˆ.TÆrMDüý§s‰ k÷#(3ZЖÎvK¤ÕhƲÞëª%PC™~⤀”}!9Ù+²Ô™Å=! T4{ ˜{™1ï¨.]&OT¶Ww/Sª ’qp²AUh©t™­PDýAë‰éy1Zl Y–ó¥n¼ÚWrÄ% &¿ò|Om,±ïázˆ7ÏÉŠ×_±ßð³'ÌÄ×õ Š[ÜVý°CÏ"~ðØÎXÅ=ñaÉd?~½üÙûy~OÍ‚F3ÅΨÆò—QöK‰A#=+÷Ú gMOï~ë°Ô;½I£D"±~`RÍ«ÀhŸ7—Ì~¤hÀ¢ªFËkYÜ•´ “”úfæeÄuÇß8¼¶â~D¯®I™e~Ç!Sý3W»»4ÅHXʘ@ ™Íè {ÏÐxøÅ!¹áö¢RuÓ;öøÜà˜+Vªè—4µ+pâs,æ¸ÛûK8n“a”Õ¦sëþº*æD)u ìÝ–|ß™ j<¬ü¦G,¤¿`× Ã\ÇŸ+íæäGF–/}EÒÞŽUœÝÔˆ€ŸFFÏIåʼò´+rü¡k™Þº»#ÑZŽ_$[obõ›8AI[“Zé£9ÇI­hVŠæc%ñ«¼é›”íïf+ÈÎïb´{ëÉ_^÷Þ·v¬=HÒ=v&ÑL¨Íµ‰Ão¼×kfô ï bÁPH£Ö› qÇ÷oÞjù -à:_þTøÔ¢Ž¾ý¼=w—æ³³ïÒ˜Ò9ʦ»çúi`Ø`šJ;Ò` ²ÿå.£OÝk€3í4µL–Pž®Ól”döÈ à¥ß±`6öB¸TÚB®3Ií1 °K꥗E“ٚиª÷“qý„X+Зði-P"w™ôç—¢.a²OkÜËùå¨â·3²ös<ñ'ôª9;N¼Åéøðf9BK¬\;¿¼·Xè'ÕA@ª+<ùõH´ñ ˆ–Ò,"‘ô.èûâ='_ƒüõm6A(ü™¦úÒ7ßÞJ ¢¢>$Nâг­«Ùs}t@}w\ 5¢µo¯f’^%ør‡`vý`ñÕv‚ŒFŸõèzáû s¥~üœ·Ä@7{–Bà%¨H™T¬Ö’ù, —(8 (ûf(‹)cÝQªÊy|4ì=éDsZ(R£ïZ#½[Óg0Š[r’,'×ÉÛa„†££Ö:ñªØÆè²íÊ™òÅÓIÃÐYŽ´òfìcÛÏ.‘™†ôRcóx-æáȳëVø1ǸŒ Ç{Þ¹4^‰±ùš¨•(K/g쥼æ\³_çàоƮ9Éä¥zƒŸúúά¢û„â6¸pà{en,ÕðY¶¶J#ÚZ;Oök¹É›|ÞsVŸ½*5Ì]€î#^dÒmöîýRÉî#•%)(ŸËI8N þHaÝ6ÍDgéÓ•1gjLðQ ¿8ôújMôq’gA°e716|ÄÙÒDìvü4ª‘Ž9òrëqLBÍOº¼_ã]GŒ{ã¸=ã$aÈx0+Ž6qœÚß“­Aÿó#é-ïkƒ}Ø|Ûð/;âðcS«ûG/¶½E¿>¦yé:¢ Õ"\o?)û£Á:phé>¯Èw~+TLœ 9ôô)s„éI ð@¢þ"q<—\´ŠvíÚGé…Všê\¨ÕÁæÙ°éÇœzT†;m6­´¸pùö;FÆ­“D~|iAŽ†Ò”­•l:.4|'Ùêk7îût¬:­PÉqúEÆ&„y¤…ñÍJÇ—-‘ó+“zÏ2W=ŽÔ‹ViKÚ'Z¡o:&ŽVbÔ5Vým±Îß]…œáAÁ¢ÎoóÞBòâ‘q‘;$‰¯šMNåš¹ðr¥.‚9Ç-ÂïOä|³Uñ»HF`§ÚF³ÏµnCñiÅûQú(ò˜3Zq[é6­«Õ]HÌ”™À‚alóÅ;· ¼}ÓÇ!N»sÃT±AÌÖ‹N5¯DÇ„RJ[öª jó©SòñÙ¦ÚM¡dó,E‰Ë<é-M¯¯‡˜<´~²§9§‘¦î¬t½âßep 00-´(²”·~±3ãNg”|þè>–G58ô©éA’ºè!aK/Ι,O@t—ñÎ+ T 0áŽhC¹š|@É[XFë ù¹tOòÑ$Š®Z¦t°?IİŸ@ˆ›^ñ9'Áþ. ÕGMæ1‘ÍÉ¢Ôj¾õØ>”K ´I ë\ZÙ0ˆšÐ6Ö 0v_ų+…r朇ÂñPÀ»q3Jð©5ÙÙÇV©GD½µÎß°ÌTŽ5ÜE”³s@©„Ø<ÅÄpš ”rÄó¼ÌÕ„‚~¾¿îªiªýøÜg,‡vìë«yðqª×’*ök¾m´AôZ†bí£ŸGŽfîR·guÏ/ÕT5[Lë—Ÿ´¤i-ÙÎEY -Nkðñ϶s¤.…ã/áEp\¶Ö]]÷w­ÕHˆÕµ™´b›AÚƒ¿^ë£V¾%!ñŸë0ª.&~ò£Yò—PgƒNÇ[ZC•î[zîd[×Y–UÛ¶}?é)ã—3#ÜNaüÄ¡z/¦°Ÿ +BücY‡ÎŠÊ˜cú(5…ª¯Lk©7Y(· -,¹B©_S°·”ŒsÞþ¸9m01C¶¾ ʬl;Jè]Û%1Œ¨â<…s¤ç~±µ¥`U?«d;ËO Xáÿ 9eê<¹Ò¶.(pƒ:ðÅCêöìUT*¾ô0sZ˜Ekç&ß6_醳(`|8`5KX"Ž•áK =ì±À]¯h³Áñ±ùF# å•ˆ†I w$eP4ã¿/# ÎÊ÷Ä´@T±ºÐƒçÌà óÌÛ(HùUü,Å·,™I§N_é0È/ƒûrÖ.­9q¡êX؉\ïªar1R_L+×°°p\Øô—ü×Ü:ºMÞŠhªÛbÁAÙ¥çZÍ()-4A3òRã…\ ò"{5i©½I'àÓvˆ¤·"—h¼~˜¾éøç'[<¶È’‡©…–us)a8,äo‰Ëp²k6ÂÇ€v,Åõ”Ljç›E'¯;rËÔ¯?W{;î¡“Ga÷MŽÎ“œ&õ·njËÚ š:¤‰_ÙºË6ݱž{§Õù抅ÄÚ‚ëàã<À§ÐUiµK‡üw$SÄäõ¤*_wÔ”`®`Ù-<Ô%ŒÃYyHpë ­Á‰ÖÀ–Yƒ˜FwLá¥yDS\ŸçéuwVè˜hmb\¼§±lø…ð¦G\sK%C¤ í4ZÞËLi›½½¿d¨²§”½ÑyÚ-¬}¶ ›¿Æ0Ñ ­çk¤žÏˆIîJ~nóóÒøÚ}3vü4oŠÞX(Œ=,%ñ<Æfèi›oK¹7¥ð毗b^É8ù)½°|¨ µñ»÷ªj½ð²Y_ëŠoß…”Á=EgO¤.ð(0oÐõÝ$©ðAgÇÆHàEë¹ÏÄ «ånéC}& ÿ¥}$q#zCö2êØû Ëböù ^uº"fé »«k\g¡¦VݾS&¤Åþ«Ïéª;qM)°"5¥;¢£Zuü7ÀŽÊ‡nü9bŒgºé²CKÀv‰;ñ€a­/´u;¨aTúiæ1åu]Dt†×Æå·âüêJ®zWIð^»j&Ø¢åÎ?E¿;Òá¡WéÙS1zÏ— Ähà³|›;%‹:ÁôKEUdôu{bóé)neŽÀˆÎ,žÚfyk`¸ ÉjË ˜AOQÏ6²§Û/œ w…NãFºWjË®w@Ïh­òíŠj%­ÎÈ·\ªƒºôR?÷Řƒñë¥ú·Å-H¡cótCÃËXg&w4¯ Å3÷rŽèÚl>é!έùý…€yëCÂôÄ«±çV¹?(9 !UÛŠVC³jC'•ö³:Ófßëx@ñ 2Õ$7MO¯dlƒØX‘Ðz>&ÒÔXæ}²ͪé˜ÒI'ò#àÎtïNâ¹ÿùªÀyá»Q:DNòQ¥ë«QWdõ~Ó··v”€•ŽTãMðÅ…%n—ç%“ww_@¢Ì"E÷â¾­ÇnJ`= !~ŸýÛq§ ÁNÃiìÅù“ão¡ã[„åµîظ¸?øÅ_ ZÈ¿ëœÊ­Fy7궉µ” NQ¹¥¦»£Ä¢rz!AMÅI⺊‰ëì N ^«º+–­z"u-7 ½—œýÑ<õÕêN~.Н--VN‡ã³„þW´«-Ö]Y>úvDµî#jü\ûĈèñË–Z²¸m&æãU V°™¿ù8ŽæË+À˜ˆa"`–-¥Z{ޤ ý’ÿ)%Ä3fº»ž!öàh0‘Å.â3 ¬ÓGÚaœns12õ}ÓÛÒž;bxZ9\r\+6ÓÏ›á®Ô&ÍëRÄ57WY娙Y¨`¶ZO2¸b¨íªY^VýD°jx9ó™õKÄÆCVú“jÜjÛµòLL.d}SöxE—7+}‡ø€KÕH¾T’‡XÌ´·ÂÄD~™)è¹WLz÷òNþ¾›—~ÃAÏ^¥TáÉ\Å~›UA>å0î„RmTIŽhr¼4&W»ÐyÖLn© 0²ñ[‘^­ûÎ:u›/5(ÜHEÅàÒ[jÔgd!³Óbök¿ —ïäÓ×—KÎE\Ô¢QF•xâFWnkÏÂàªyc;ç(|¢í†ƒ®¡³£á¸ÔÓØ¹ß1Ÿ*6p{_G'kÞI0£ªò¥³ßcäFÐ>{OëŸ^3ùbGOåi—õúM†_ºp¯ý8•ð7S½)èÊ&.)ÊÙÙÓ|iÎe›áרNÑ ú IP‚‘"Z¨uºâ/¥Å÷” !ÝÖê¤IÅØ*’ë£z;$ì½Óòý¥Iæƒ`-u-VAÓÓ‡¡v A†¤ty^œ#5ÓKÛl)DÌ‘â‘!׉}NyPj´¨ÉV²€Úvñ‡¤w/}pÐì0¢¾¯YYo§˜°¾¤:¦º7±hš2ÛÁØw}¬zÝQá±J„Ó£+ΦHj:wb#¯E5Ø E ¯!R¸íÆ„|‡ŠödÇŽùùsó\Ý  Œ°®¢"W°ôù!·Â’%ØŽ¤¦Œô~!ꫯüêdëh—-ŸM­ñ$±0kÍ36€Ä zÉx`˜—Yh^H˜ß¢Z¹ˆñ=Õ&ç,É9Ž„Ï/—i{*33HXÅ›MÖieZ\ZôË„Z ;“äFÛ¶råhþô Üßí¤Û“û.’ù+ùƒxó·‚D\1næÙ¸ytRµRÁ®ZÂæ¸s/»‚ߨx&°ß:d·Ó^¡ŽïˆC rŠ“·¸tM´ÆÌ3Ðp×Ñ!Þ“~£ˆCrsBí¥®]0Ø-A?æa l¼Nk1,?ìà»nêëÑ«²âDø¢Ðœ‡æÙ»ú˜þJHw|»~c’tèç§™L»öªböåó#qø!ÕÓ_}ðf} ^\ûÞ¶ˆ+†ÚÎ!®2lsxQPÉóiƒÆ¶pW‰Õ×¼Ë+1lÆÈù2×úÒÏ0^Wî'I‹ú;6+`ÒÝå:‰Bô®8±œÄL\±0!ÛH£Æ¶å*;Š&eÓ¼ñET‘K5öDßÐO2y>ø ]mÛÐ.Žæ<Ȫ¶^käÑÉXkY­ád¢8Þ²¼TW^O9 üZ€W »È^P㟣VÔÁöÕïU–÷_¶æ7“ï?™§ ïW.öؘ˜|×~Dƒ>%´ðMƒ€K’knvä¯ ž@›ò°’$)9ýQ/üËÇøé·Z²²«jüiгY¼y¬5ìüî‰?`°ÉŒðµÕ‡>؇éëø†ÁRÈÔ>ã}˜œéÕz»îêÊRÄfµ œÿ\<×jS€Y4ºÃµ“‚q*ãž4‹ëü@cÍW«”Æúk §¡ßDý¹ù¤ó¦™eàc[CY÷ôÙ­ HÅUÁ¨w¥¨ÑTˆñzôuëçQ`Š3”Ô4¿%Ge»'øCÜ3DæF¦Ä…ãÌ3LU'ðÔÔÚÄW$6'©¹%ë¦]qéÜ™(I¶_kC-9FW#ï€ø7,EÆÀŸ<3¥d¹I 1„qÌžö1®eç›Ãö‰Š²|ÿÇ*›.`Ç+ú£G¬^µ㓦ù¦|‰ÆÅnZÂR”ã4ßç|´t̽àE¥êˆ']Ú>©` xô!¹÷ÛûªW¦Éu«ç”>ckº)>kPéÌ‚û1%c±w?*Œ§[Á]òâwÑÓüèÏð{§¬ èõ‡v½‡ž½iœb9mè “ $èœøï¼Ý›?)óA«F錟v²ŽçFµMY]¦CWÕÅ0ù1Ò`¥¼›üGÊýeBOn=2Þ“ssuµkî{\«¶+φ¨Ó⬨êÞâœ*}[9¯ÁªÔ¬l:‡Xùòâ6Ãà ¸…òƒ<‡"‹û\òBðäCá4i­ãÞ¿t·ÑƃK˜(Jýƒ}XìGˆVQ~ÊÌ3Í4¤ñÑoH‡)m)ÛuGŽÃÁg…_ö6úß}x6QÅ(Fw÷O|%§iø®BN)3#ÓyA_ÃõâxR/”´ c´¯nu|ò=†ß.>vAoq<µ?" sÔ-nWÄ2?è—Z]ýK"\s¼üXôúfIª‰œNõ× lu EÒgÈÇÃÙШPéÚe.Œ]Ç3€¨åØh»Œ¢©õ¨ŠqEu ò×{}Ó”ãöMÍDOˆRl|‰Èõ]M’ÊhÅ6w›Qv-NY¼iÅ ®éKœ¸5[ [“ôÝæåcƒ¬#á¬ÄÕù0n¿Dk…E‡‚ÓºÏtm9«^Xvý,e‡XÇ—y{kÓ¾@|‹ \‚N{s†é!àˆ€Àß¶¶ëÕcÁÛª˜ƒp.Q«Á€«5üÓ¦ÕÚ53ì’¶Š“uö ÎêP|)¼v /‘¦ Â©Pàœ²Šé™¼˜&«oʩ뵹R ̚ý ø´?&1=}åPb¨É0öÕʬˆ kn?J,øŽÚnöVáú Và{‚—ófk=I‹so½Ç‰6Ô’i4ç+úM?›Q9ˆcfz}-Xö0|Ò(æ %5‘‹œ Á›?‹.xÄÉQa¦DøÝè!òäŒ §»_Ò+…~nR8èY9+eÍ-Gí¡šQîP'§Ï ¤MUC'ÿi(të ü2/VÉ+O‰Jˆã( 6 ¶¿§ÊËÓákü?üàüÿÿO;B,ÝàÎN–n8ÿdêâ\ endstream endobj 197 0 obj << /Type /Font /Subtype /Type1 /Encoding 2431 0 R /FirstChar 12 /LastChar 122 /Widths 2432 0 R /BaseFont /HIEBMZ+CMB10 /FontDescriptor 195 0 R >> endobj 195 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /HIEBMZ+CMB10 /ItalicAngle 0 /StemV 108 /XHeight 444 /FontBBox [-62 -250 1011 750] /Flags 4 /CharSet (/fi/numbersign/comma/hyphen/period/one/six/colon/A/B/C/D/E/F/G/I/L/M/N/O/P/S/T/U/V/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 196 0 R >> endobj 2432 0 obj [556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 0 0 0 0 0 0 0 0 278 333 278 0 0 500 0 0 0 0 500 0 0 0 278 0 0 0 0 0 0 756 711 722 767 656 628 786 0 397 0 0 600 950 783 750 683 0 0 556 694 769 756 0 0 0 0 0 0 0 0 0 0 486 556 444 556 467 306 500 556 278 0 528 278 833 556 500 556 0 428 394 390 556 528 722 528 528 444 ] endobj 2431 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 35/numbersign 36/.notdef 44/comma/hyphen/period 47/.notdef 49/one 50/.notdef 54/six 55/.notdef 58/colon 59/.notdef 65/A/B/C/D/E/F/G 72/.notdef 73/I 74/.notdef 76/L/M/N/O/P 81/.notdef 83/S/T/U/V 87/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 127 0 obj << /Length1 849 /Length2 2301 /Length3 532 /Length 2902 /Filter /FlateDecode >> stream xÚí’y<ÔûÇÉRì©tÈϾÏb[ÈNv²RÆÌÃ,CCHÆ’ ‰ÊQCYB7FÖÈ^ˆ0éXËVT¶H9ÒêžÓ¹?ïýë¾îï÷Ïïý<Ÿïóýüžç‘•tpV5Â}@s"¬Š€"t['m…CdeMH ŠŒ%LQdP@èè £?@  ºê:º,`B #aýüÉ€‚‰âW‘`„IX4ŠØ¢Èþ žUÂÎD4$‡A#púz"pƒAR(ˆBƒE“ÐK€À¾ú±"ø­ïaLHЩPÌ2(°L*,‹"`@_̎Ⱥ d9ùo˜ú¹¸yg‡Â-ÏêÑß²(<ö¯<BI€-’?KÝÀïÖlA 6ÿsÖŠŒÂaÑF?À¿‡°ÁæX ˆqÀ’Ñþ€/  ~‹ƒÌÏ&Xmûffkåhæì¬ümšßR(,|,,èÏ¢_µßñƒY½!a)€' ‡#XBÖûÇ—×OW™ÐD –ÀZM$€"‘PaÖ^°H8ƒ° H@ Ë/ J ’YGVK"_" òu˜HMfô5ô´˜ÉÒ`f’6€9ü uæü'!XÞ`àD°´„¿ #ý‘Œü ÿÞ5cc"匪:PUÓdý\ hiÂ#ÿMˆ!‘@ùÛB²zÿûbY“A ˆ†üöŒˆÖ‹ ȨŽ/Ž2£÷—p)±ûÝOµ«llä¡>¿ÄŽ»õØú”ÒÄ=÷ÍÒla¾9®9‰Ó[¿Ó"{Í—ÎJÍdnÏ…zÏe‡×þ⾚m6$µA}Ã__=´öV“Ý~`¢»øò¯í¹Ëon8(˜{µsL’í¡ghÕÃk±H-wólœKBÜ=9uI'ÌSÅç5ÆO \Nãï£F$ìªQ]!6„mÒwå§o_›8â¹/‡‰ô"ˆPÓ­sv¸Ä 8ªnðªèÓ¦¾£xLh‚Ñ»ˆ'ßïMc îWÃ÷U ò·¼IG@÷˜~æô-Ýáþe±›½Fç„Ói/ÈÖð(­r¿:BÀùÐqÓ‚nk^·ƒ½¯òˆÌ8\¦XØ;®Î¿¤£)%ºx{µ½Õ p‚zœÏwÑ$AwŠ?ÄÔwSàˆ¾L}†ˆ’UñÃè™÷GC%ûÝ(ª©>ˆ}TzÖŽÊöÕÕqv=Þ ¬æÈÆ)ÿþ/ï± ýú–÷–ÝË|žû%ùà;éïDT²ê®|:I{*^swÐQ²¦¥Ýãùõj#Rº×a€žù~q±UÄñjY{ÉpÑXoÇ¥ 0ït2”ßeZo–!—rò®þ33FGÑ޲¤Í熡s_>"á{8áÝw·(m^:ÔYƒåZÑÝvy³#x=†*’^Ó£˜ür¬OÈá³[7Çñ¨=¶´w—yµò¥CÛívׯn”FBoÄ4¬ÈéÞ4½Õ¼*¶3œ+/(nÛ}ò¶å*—}Yv¸ÉЂqØF#ûP!èÝjá«ö`[;ƒ‘$*•k)_ D‹žV¹ˆYUý¦Y$w†Sœ¸ŸZ]^0Ò¶^é¤V‚” M›Ì7öåpÞ–Ô>Ïcm*½äÉo·;SP#bÆ6 Gϸ Ÿº±sÍŠl¼ùåæÌqñ¡ÒâÇ'â˜õòŽ—¡+ 5ŠÕ¾,î¨þàì!=m_¶TXí%Ãý©yÛ¯Um* Q3˜¸¦Ÿ"hÒ¹jœ|T­ËÆñ­|'MQ6Cœü¼)VE©RLèY™t í/´ŽÜ#‘õþ|ÇÞ°Ç<ôèå ÆÇUKÒ8H³Oš¾ÎӼѭ&~B›Ð@×Áþûö1ð„é‚=ÖñrêmüWòeü¥RyŸÒõ²ÆpooªéÙsYY¸]AŠszª('Üùˆ˜ÈísO· nº5[š¥¥2¤&ŸiÈU,šh̸îì6³í³„ÆûÕ9œcz¦@æ,v£Tð¹HŠé=Â&@j34“t*aot€z5·äó ©ÇÕ™V*ŠŠªö×®Éfàx+üæ[ƒž%sXûðºÍØþÒª¡V bi˶¯è/’–Nnâ‚sk×O½]$Ù5ŸT»mñdÚ…‘*°ü\ÑöiüïY4YÎÙ‹ g1¸ä¶Ý露¨Üâ­BÂé+!6ªgŠ:ùï/ f{åöNQ¯»¡çœ$=úâî{§k{ å ÊljT„l®F8ÄZ]a–9Ëw.,ŽŸèï}cqFøÐ’ºý¬âbÊÐS5ýÊd™Êlùà5±<ŽVº¦lRœ#ëqêÒIJTt¤¶éZrœ7^Í:Ës'ÀðÒ†s‘'»û"'3ƒ­ß8>LmŠ_·‚qâ–ðvo$|Tßr|Z .(×øD£ð9væð¹–N×´ÜÜçR/²b>•4Ý×N¶÷PØát¹šæŒ ÆP¦:\‘´îÞÚVF[[óø¼Nâ¡p› Ú•ÄY#ù#*vÙN”ËV{brÍSÛsI3O¹ÜÖ&íÌÚ[,o€thß[ï²#“ŒäåfœP}­G="UÁû²oÇúÐ}¥NÝ få‹ù<@¡Õÿ¶lBÄG‘«w3Õõ(J»Z„×Ç}Ç)ù&ÿÂc?3kdøˆ‰~8)µûItX"ŸåCWÊ*ÿY\^Œl£óa\žsÎ÷µ@ÊÍ5òdÙÒ¶Cþ}Óy²ÓÐyèюܯ„Šl8¸#¯øì¼~'þåg+9ÎÒ^ ß1{ñ»]¦Å³=G6{ÆQi Ä䃥ۻoújô5Y›}dtÔIt/nNxã¯ÝQ»}¼*n,QcLЊQ2ßýªýägqAÄ‘= ±£¯Ôpt!$ ÜñZ4²¾d}œ~çzµ¨•LÂ7zã=™ž–_¸ñÌ¼Ê ·q¨[¶§ƒ£k‘A^I¡¾îN"@  :-V¹I1ó%m3`§”&=º£.AJ6S—=j1غ)W[’Ìîb¾¥ëÌð|%R®r©`¡QÓW§4«ÈQ©Ûãó µªnß%|òŽðé(7>…­Ìıß6öxzmŸx©ZïæÝ±ßeÛ{·²X†àPfóDQV‹âÄ ³µ„. 'FËåH,¼Ç4i“õ!ÌñaÉÔ¹¦wø© ÏÑæû,¡'d#'ÿY-募@A÷u€š§Ë7YÇÌâ:ë­tøÚ¯T¾K\ânÞ¥–2µ/â8íßû°!q ¢Òí ñvû®yô”ž°==ÊïC;ìê·ÌÛt0+­r\šìeÈ{”‡·ß+b˜IM¿¸À3»¯0¥~ Ëõ®|%Äóùfž¼¬‘Ç.X±“!Ë¿\ÿ2ÞÿÂPÖÇýTŽbÃù²‰‡‘OýÅêx±{o+-Óa[S3/ͼ²u°‹õ"7Æ““Ÿ 4E¯éïŸ<üþ(¬Í~%Rnþ>ÿøŸ(€Æ(™ˆG‘!ÿ¾éy endstream endobj 128 0 obj << /Type /Font /Subtype /Type1 /Encoding 2433 0 R /FirstChar 65 /LastChar 116 /Widths 2434 0 R /BaseFont /MIQESS+CMR8 /FontDescriptor 126 0 R >> endobj 126 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /MIQESS+CMR8 /ItalicAngle 0 /StemV 76 /XHeight 431 /FontBBox [-36 -250 1070 750] /Flags 4 /CharSet (/A/C/E/P/S/e/n/r/t) /FontFile 127 0 R >> endobj 2434 0 obj [796 0 767 0 723 0 0 0 0 0 0 0 0 0 0 723 0 0 590 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 472 0 0 0 0 0 0 0 0 590 0 0 0 414 0 413 ] endobj 2433 0 obj << /Type /Encoding /Differences [ 0 /.notdef 65/A 66/.notdef 67/C 68/.notdef 69/E 70/.notdef 80/P 81/.notdef 83/S 84/.notdef 101/e 102/.notdef 110/n 111/.notdef 114/r 115/.notdef 116/t 117/.notdef] >> endobj 124 0 obj << /Length1 785 /Length2 766 /Length3 532 /Length 1323 /Filter /FlateDecode >> stream xÚíRmTUÎC€.éñÀÒ¢|]àÂî 첚‚b°®,¤P¢ÃÌÝ݉Ù˜%V\•,ÓPAÀH õ@âG¢dˆ(dI–‰‘8êQÂ<Í‚ž Ö¯N÷þ¹ï}žûÜç>ïõœ¥Rû…L2ŒdhΕ Á €·H04eÔ¤J†¿ òNþ SÅ#¥ÄôyKH/À˜ž¤LÏŒ>ÕÈAÄ0dé‰ÔepÜ[ $H£~"Åa‰‡ÒZ ?T&Aäãiˆ$3 ¡"9\4e€cû&&ZáÓ3"U+£#BÅã]ÃTIsq¦T?Éc5úgÍgÄ’àD‚ (OäçóÕŠ wEÐ8C´øËƲ˜I€ðRþr9ÈDI0À Þ°TB3ðɘ†a–¦¢ˆ H1Z›Ìbx ä(¨á,„g˜ü¯ØxC-à‹¯ c22ýà$ ¨,( ó߈¸‘e!Íý'>³çµ†äs†0â‚®K ’ûÞ¶Ãë÷­¨ºPc-òÛÙý¿tÙ~½üèÚ$aVËË–ÎÒr{†*ú65‹R:œã![ØC3>T%T:Ô6ì®^þq¶¼IrY-2­+ødêïb¯¡¨æ´··ïÌësnb¯—æÏöí™uö•2b0,±êäë—ììçÄn™óÚLE×^ÛžI¯ŠL=7/ºÍÚÖ:¿s¾;:J%2DxuhÞ°KÁô VhÒ/X™†•ÒZñKSöÏ]§:ÿè[ظ×djÖ Ûã%¥Û“Tn¼U¡qâJï.éOsÈþ!ç¸GúñˆQ¤$ÅÃü4k²rïZU[@άV—ÞÞ-«w¾?*l_ìªÏ–3u"·‹EŠÔÙª¨Ìý¾×]ëGгÍ5ŽG7œI›Qwú”Ï[-ྺÈ1>åôÜòd™ØÞEžZåº'ë×UÀ­Ïeòç9·­ó«{7+¿æt¬¾l‰Ízö†t¦M‹°Ë%ºØ¬$<­‚Ä.M‰w+7ÈtRÍ¥5ßûZ§9ps·M¾6ÙhXSZmc1·­H4ÿž•[½G„^u.÷éŸöNà;zÅ£Û:/Àö^ÇµÙÆ­±±åÀŠgߺ<Ü>TÞñÄ»¤X“'¨ilÜÛVßrLv¶Rx®w_Ìa^¡kX½Èµ®`aâúoâÊgÄ'~a{ýòú¼ÐV¥p¸P×¶ïGÊÊå÷dJÓPU­ëÝ‘#Î9«¬Î©ÝÔsåe½ÇjqÁc¼ªî+wûv1 ^w GR#‘þ†îøS%#qw$$‚“)v ®yänì,øÈ> endobj 123 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /SNLEYA+CMSY9 /ItalicAngle -14.035 /StemV 87 /XHeight 431 /FontBBox [-30 -958 1146 777] /Flags 4 /CharSet (/angbracketleft/angbracketright) /FontFile 124 0 R >> endobj 2436 0 obj [400 400 ] endobj 2435 0 obj << /Type /Encoding /Differences [ 0 /.notdef 104/angbracketleft/angbracketright 106/.notdef] >> endobj 111 0 obj << /Length1 1668 /Length2 14004 /Length3 532 /Length 14957 /Filter /FlateDecode >> stream xÚíºUX\ͺ¨KpîîîîîîׯÝ]Á%¸»w‡àîÜÝÙ̹֞ù÷Ú—ç\çt÷Åx¿’ï­ªQ5ÆE“+©Ò ›Ú$ìíœé™˜yˆDåÕ¤™™ˆ˜˜˜D`ÉÉE#gK{;1#g377 ‘ÀøóâóÇÃÎÁÃÌKN$jïà´4·p&¢¥þW%N"a[ÐÒÄÈŽHÞÈÙ`ûÙ‡‰‘ ‘ª½‰%ÀÙƒHØÆ†Hå_-œˆTN +À”–™™ÈÔÒÄ™È`niËø/'i;3{"Îÿ ›º8üï"WÐéSŠˆêßšÔDŸ’¦öv6D¦3XFûÏl€O—ÿ7´þgç.66 F¶ÿêþß3õ•ÙZÚxüw {[gHÞÞ´ûŸU5ÿ%'0µt±ýŸ¥ÒÎF6–&Âvæ6"zf6&¶ÿŠ[:IXºL•,M,ˆÌŒlœÿŽìLÿ§ÉçüýÛƒQ[FADIŽö¿—öß…JF–vÎj"¦¿µÿÍÌùs’€–îDߘ>g™ù³âç÷_éýdâv&ö¦–væD,ìDF@ ‘ìçMôIìD^ÌD–v¦w"€û§1#ƒ½óg¢Ï™ñ!2³Âþk]?—žÑìß±ÿB–O´ü‹¬Ÿhódc"bt0ìlfΣÌÿý¯%ÿO˜ˆÑÄÞÖÖèo„ˆÑÂÃÁ`÷Ÿûg[g ð7ò/{àŸ­„ÿ£È_â$býK\DŒb‰›ˆQü?Äù©.ñ—>ÓJþ¥Ï”RésÌÒés2éÓEö/}ºÈý¥Où¿ôé¢ð—>]ÿC\Ÿ.JéÓEù/}º¨ü¥OÕ¿ôé¢ö—>³kü¥Ïìšé3»Ö_úÌ®ýâþÌ®ó—>³L¬ÎÿÇ¢r³þ'þ.ëç^fü»¤ÜŸ‰ŒÿÒg"“¿7Óg&Óàg*À?ð_ ýüLhþü«Å?ðsâÿq[2}ŽÝêøédýü”²ù~ZÙþÅÏÈh÷ü´²ÿ~Z9ü?­ÿŸVÀà§•Ó?ðÓÊùøiåòü´rý~Z¹ýcß}Z¹ÿ?­<þÿ÷Ñ""bïîEÏÌÁJDÏÂÎô/)"nnŸÿ£¦‰ ðsG:ÿûüþ<¡þ7›Y~j€;ÀvyÁÞ„7Ø*åWh©¯xþTµ^ZqðïΆ4^†“ ^”9`Ó¤€à9Ùʲ)ùL¶’ÑÔŒ} û—°÷—*cÈòunº*ԅɉ®>èðÏÁÞ¯¶YË„{M´+¤w›®ÕrGÌœyØg‘ो o7¾Ö~ã[Ëp©¦¤’aõ~¶É%47ãÇžO%íóí— ‡1uÓïPß—±{×g¬×Ò¸£~ʃͧñ¿Â0Q»›mÃ2gX.kesK}Ô4|%fq]PJ[R@à,.vìC·š±‚@åŒ#>å…Ê>Ý)WkpcÐ œš«ºelH,Ïï’Á]€<ÝeÖëÌ|Ã;œ=d¢çyŽƒ›3+9Et4T¯gyžc tŽ™Ë#Ô7Ǧ ÄÈYzgzºüv‰q×øV*ùR-I„±U½ó¨k9 \B>Õ³†³ú9™A}‹30_¶—S}¹ú*[>V´YóôЯ¤-$ƒlF‘³/ã)…ÞyÿT2èÙ —)Ã3»‚GÒaiä »r§FrM3ª/?.ÿô:VhÖôb†Á$.°08ëÉå28öxêfyCC(è×Ó lÝqû1w„ÂNEƒ Ên§“¹\¾ÛÏF£´§UL‘ r«†×fªRŸ=/Ïj ‡›9]NQtB”Í0¤„œgÊ… Á«×*ã-EÜx=B®v„·û¾k<Õ?=väõû×l„Pqo‡Š“§¯dòÝ…msêÛzvÌþÌø*“J5]>°~¦7¹°gí ^UÒïøÊÐÑèœiƒ[ó úx ô´¢ð›„Ϥ¿ëô’tå—B˜a¬Y`ëtcœéì©“XÔžÕVªöçÜÂ|°ÛgbÓ]kŽ¡ß@à yù4ÔÚ¡NFº\p}hYijҸŒšúk–£Eh;'ì^GÏ#€6gª»æ1N¬&ô—U—ï>/šÜ¼+ÜE}Ɇ,¥þ0ÇÛd^>‡¼¼{¶×!©ú6EIÌ”¢4ɾŠsxë† {¨éZÏêv7Lßݽ1ŠM&G:O)-Å:ŽÉ5#.Æ·EÏW“ÔQoÖ'¹«Thð{—à(5zE_ù{tt¬«ÏúÒ†’ì\¸”ÇØÃw¨9^^L ƒ@¨£ûõ¹t¡ù¡ªQykÛà¼-ßÈëÃù‡]Ðh ÈG6i!îžiU5óÇâ©n•]ÈÅ®ÊWXŠ6S 0¿àñYæloRâõ˜§”?h&Ʀ ¿ãóõ~sgÛ˳{[2V˜¿\§*h;A3ª\8Å”!p©~£â”8ÕÜå ƒâY¸`¥`":P•z08ŠÓ4gƒ»{×n8þ9vUõ¨BN—7H»nÁŒöŽUÙÊÝ_˺ãSý‚ô5ŸT?–¡i~Ç|P=ÒãLD‘П`.ÝN})V’Ü›pÿö;>«¯¹t*œ*{Q–Ë k\ï72„_l·G¢0ŽÌ„m-ƒ7ÄÌk-^ñÙF6M¹^»ìh,ðzÏè‹q‰—sºêðþ½ª=Š$ÏÏ„8 ,&˜¾3Ir`¿âPÉ7ö¾&úå/ºEŶýÅ…ÚiþŪYðÁn– ±ÌÄiS>¨~[ca:WhVFG뙯ÇS3áÌq¿‰¡™ÎU ÝMÄ¹ÉøË™òshààÇb¯]!ã?Lå8=í[¿ <ÂÏI12p3€æýÐÄ•Ïè˜ÅxÛ £žO뎞’ÉJ§å};\F,aÔ»œªM±§×¶ßÏ%­!¾â0`ƒÇs1ŸÆàö6İ ÖRãL\ËFim£aâÂ"Ù ðî(“Ć™Ëÿ"gƒПÌì–ßù±Ø¤ç}ÏèÇ|ƒ9ˆi†žo1Vä)6©Íñ2e‰´EÊ.!«÷è^º,È+ÅbÂHäVºâÎŽµ( .`ÃTÒJ0^ÔIà`awf?LÀ%y½Ûõá3k‘W™ÀÞƒ#;ªAÕØ[óó›ôÛ¥ò>Å’Ìæ!­à|T÷¬÷ˆ<»;3²×pÁÙ±¥4Ú¢I;4_ ⃟þøXÒ¢*ì‚L_`'ÚÚb¯Ö,¾4Qàêódø ºAöà@LGxüe4sÆ(¹ä=àëþòþZ/HÔËEHsN© ö„ÄÔÅq­Až $¡fˆ«Òa.0@˜Ö©Öbš¥Å¤ätBÂ८ê)1I#¢%ФXåL‡”Þ$QÄÕéþÙsžŽ~¤BtH}Fßb"}ñ¬bÇ¢û¤+ÖÓ,¯ø –3ÒO?õŒ$˜¡Î¯¤—ùÊvÊ/ˆAqó’¤Û¨5æošx†gÂ¥Õ©|£­Äs…Ó†RÑ?QÎŽõä]Ï*ØRq‰IÐ.tíšê~¾¼–¨:g¶ŽÖ¼o‡è¿ø,?dGÑzó Á‘;$c(E†³ÔDÕ4Ь2n vƒBejm/‚â#Ñ<;2IEe¬0ŒÕ ±ç‰uÖHߟ#3Ÿò’Ô®gfû ù9¦£Ì°Q-£ôb1s õnÓsþǸFG2œ=ãðgw„OŒ½ƒ¹,+Ï»2 ˆ"t’½Bwˆ‚YÔ[¨èŸX“¯pCÏ…º¸ÿU*TN á~ú ¹D? y&ÝYò,÷ªE¡&ï‘x±TïÞ]Õ÷teÀq"vJ uz;vÄGÊó4UXX¿+õF÷ÃÈ/¦áýøBmKŒ7=-D÷a ¬c†`¾ã£É¹ÑóLNj#x×­®ãUêÌC¬b“¬¢g®©¥-zJ&Zÿ¨ýGÛ=É+£Mª ®’õÝÖ3†½`,qÁ”2ÛWO:F_^IÜ©;ZYOîù+A 2">c;wF"œÊØû…ÒcІ/Þ}ÐxÑûûK5‰³ñøç¨Ì¾àÉðè¯ðYþ‡ bþ@NsÍoù!]ðÞß ÆC¦»YE´ OްHÍ?ªLøâ£¨NsFÎ3á¥æ Õ’qH¨¢%¶ÜÕ=xÂI¯úàtú˜ $Ä–¦µá$u(Vɧ)࿸tö!ðƒß=ÄëXQaq/`JûƒBÁ™CG~,>êWÐÀ’[«¢Ëà`†[¢7'—™øYTayÓŸ–º|sö€~»ÏÁ;ÑtÅP›øµÉªgm¿$¸ç>QÔçc_až!Ç4œA“!~ìX„96îBUK?öÊ®8£È9ãrtßþlêÔ>Ô[ÒÇœ.§@…“‘24˜´~‘×klÉBƵV¦7Î/Ý0ï:x„di1š7Ûbƒ¬4˜©g¾žá)R7DÖï}g´,îP0{K /JÎ%ù†_"¡êÄ!ªàÈ_H†ž†žz®G,2.ìþ|u£üÒ̺€åTM‘ÞÆð¾ä ³çnðRÓæ3h[»÷"dY¼Œã(W{!˜ ŒX—kE+ÌÕûªñж@½v¨¯O£ó¸ˆyäàø½š1ƒˆ49ÛJ¨Ao‰fb ihmHoG>½ÒlÙ¨fqðˆz¯M…+~H“l(¨»Nñ³1¼n?úÖFAÁ¥žÏ÷Þy,‘DMŠSvñ|»ÒjåÛt¿ž¨„лï{¿xY*ˆ¨èijåîÆj¥. ÷¸PøýR°óÏq’·¦»× ']qÕæ8Ôo1mv¢Nˆ7›Ð£ô³Þ÷l¬<<Õu^ÎɲÁ"”rv'È U·Åà&kÎ¥o(:ã”·çÝKæÎðIº@8[ À6Íßàke~ÚWWffÁå/;×£,u2‡(ËLë¨ðL¢¶c¾À=¡þt“5¢¥˜rOõÕr±ã… |gâFý5#Ðç?S©¬]S¨ÁÁù‹Œ"Ô'Z²Ã¬r©5ó ÛBëbk!ž¼ (nÒ9]7¥h¦ÕV^ƒ¿Ï/òÜfœ ·”Ó¨"ÆcfW9¾ÍÇù…¢/û10(‡ŠW´K¬%ŽõÑ'¾1äT>‹Jfý×Üó†ÃçKßêÓ²zª 5扯Y¾¾ã9m›”@¿±3o™ÄLŒìG©.mÝwÕseTI\ü7 ðB“8ýೌ;3¯Æ{X‹þtg†D~)’è}Gý!ÝzáÎ]lý>çŒÃã.AŽ…¤ ˜ª*êÙWõƒ¯¦ía̸Œºí4ˆÒË¿Ö{fhv”{1Œ¼#š¿vS5khÿpOM¹nÚ ?š©Ô¨+ 1ù’9J¿Oû"5âSë^ǪÒD%ä)Ê\O01ÞDº¡ =b|SƒupbÌFaº%ÅbåŸìÊ|¡8¦¥f§?@óÚÝàZOóšðoõÁ1vô¡ á:éŒ|Vêµ7àôg-Dä'â~+î“Ç+¾³tj¬¥if nUAi'EC°Ÿ’Ë^‹É;2q£ˆ·ë>~ Çxh°MDÀçvÛ§v•‹?ÌŒyÉsnGGÚœýqø -rm&­ÉLAå{QÉé͉BV8Æ»›ÅIâS[dl•+-Éå‡â¥Ls~ )â!¿–¡Zñyüg½ÂvÅAgoŒ\<¦|ôÃF&µMá¬Í至l“m.NÔÿqêõ„!ðŠÛö‡îçÒŠ_`*Gƒ¥Å·ê¢êc ( ˆDîlÕv#ÝQ¨Nø-3Ï j¦µ{É]l×÷ÿš[‚yµêÔö š~ø0ýHÎ(ÔèêYJ(¼õôAí27&EFóu]ID¬<íÁÞ7!ºô·_¤bÙi7a#{bª‚š(l4HvÞýÀ+±Ÿˆ@±eq-¤ô8qð1>:ƒ~ñb’ìc.È™hû¨’4Í‘õÍ|ÜÏï›+\ ^ºž”;¾ ‚Døfó Z¡¨ÇÆÝεQ|“^„PB!üéî@µ¨©K¡» yë0IÈÔ/ë„ø_/©#…µ8mø%ØäŒƒÂnXoC«-0šÍºÝ7 I¼q5°‰£B}í×ᯄtcÑòý?B£É¡»K}:曊y&BÙzËùƒZe!Z7}¿”ޏü õ› … ëZ!”}úÛøDUƒÔ"o¸ÛáBúi¨n3‡6ÍMý_uxÒΛä¦á¼ìð¢r¯?°>ê·QrÐth™)¾©0´fx%•€i:NE0Wc2 í—$_Aü Ù ÔÅ3Z€Á PÏJälpÔì$Gú‹Šk“ËÚŸ€{1ò­cëþ¦[=; 9-ÕÕéj e#½Ø?Ü”ÏÐ"8”4³÷$08ú$â/ìC ,®µ›wŒÚWÃÞœ…ÝŒ¤¡¥Ýûlz"m,ƒÀåô¶YœKƒòÔºa´}PW©ÞL|úgùÞ^ÌÞo¢˜Þ&Âúk0ILùžâÈiÃîñ¦–VO/÷;8 ìr†¤þ©Hï(AÕ6‘Œ"…é¯R¦„²Z¨#ãuô×õq©‰Ù Šå!®õ1 n¼$£rI3‰sC³÷¼¡þÂz†Ýkõw.Ï_¯  t„óÊ*(œà¦ÀŠ`‰šIß x9JL²êá¾înW¾lËš«K ä»i®—5â|Uf¼äSשDÚŽœ×á/;np× ªçL÷,2ãô•söVפ©eŸñWW50š0¼Vl½t¥úûóêäb¶Ãà·0æúGgöñ¤ÎÓxUýìÑ´$cÛÂðá,ýª;p9ß-ëNxú­Sç=MŽ]s³ÖYAÞíÈ*É÷ÉFŽ¼È§'’ S™g­xù¨­, éòñù%YU¯Ð³Çó:œihâ2[izeâÊ¥â[­öB}Ì3©¿PÓÐqÝ1WÙÓSúPމÇ ¹OÅñ åÔξ+Ú\ÌÌbKho]íR*( ÆÂóŸÝÇJ£äz¨¢KA²Dh.@3™âi|[ÐjRÄéŠ3-#¶’ÅüýÊI`‚ìšÏ)CÁF®ö.–ŠÑû­,fd2$hdïFý§çñÎè®’ò«¹ 0ý«,X˜Ò[SJ )é3C,ºÔïQž|¨Å-©YÍBýí Áʆ{Oñ"O…P&.…˜¥`ÙPè*$Åà#œÑáñUs›¾o D¿”ªl &öÁ×Xbl/ vZ{n§í ¨ÎUÄ`hÔ×iÜÓ®°ÿø:šìÂn䳚òvÍm“" 9CÉ‘“;-§ÐejCd÷K8lÒÇÉXö_sº(‡lìOpÔ˜ÇýT­$KÂXBÊ;D‡êpüÓQ³ cáÝùUDH@U]'E=ׇ/w i€Ie’áA¬<™™2ô{´! œõÝ¥øSÙ¥8K‰;f­|ÞŠ€¦z!×]Ïøm­ÔÑb&—ÌÈÕ[sä`\xÏ]S“Ũ@²¿>QÜ:"uÝüí Ëi¿×_¯NOZ§R>¼3O?ÛÞù` Ú«8Hþ¡0µþ©— ‘ªM¦ÍÞ}ÉWtvG’ZuŒ?þά:®–øÐy:LÀx.¹_K¢GõX(ÎA•çö~ô~[Ö<¢L¦¹n.F5*ùÖ\ÿʢϚѫ5*NWìA®³Suê.ý’ö.­:tE©:\ï¨É¡=ê¥L?¼¿ˆðè̉fÍó>M%Á”dDó8Jè§ar„Ûêôxw¶ÄÓàø!F•;WC°c éaÑ2˜a freÿNcq_ís· oŸE™í¡Bhh/É_H’]-vÅ dqP7ìYˆpc»†‹ñQr·È ÒnC'qÈ 'ÉØÜý‡WÁFÁÓŸ^/È©zwCö› ?Oðß‹{e˜‡Qéú¶Ë#œ²%óºd_ôfZÖ*¶ÆL/ÔqUKºCQ½?^o˽kì_qh™ .Åæ—íhâûD£f3®k¸7§ð?&Glý%Ä_„ ±“IÓ‹“™ì\4÷üp—u8Eù”¡‰é¸€ÅÇ=ÜÖÄ1<4¶\çÍ#“•9—D¡‘ß#RV\„¾v?%¿õL Âk/ºÊœ$^[ã\½¼ß~?QzÿŽÒ¸åãà Gè4Àä(âä Ÿ7›l 3 •¶[>˒ט¢ç)±£1‹¡¤Žz‘ž3«3áÝéÿb>ŪŽÝñvø¡CL!ÿy*ö&U³D+` ËÒh¬w²¸l£:™7µob ¦x˜]ÎáR><hyM9ü…™ÈWdU²ùBÖ¢M.Qå[¨NÆá´´„Ze޽^D‘ƒfä‘ K#c*ÏÉõ'ÒèæáŽî%¼@ZÉ(sà!!¬@r1ê.ŒjÔxµGÙÏú’.K‡oºðGn7è7{på¾Í<2¢CmU“Û¿£+7Y‘h¡î‡!‰wñ·YA.¦°aŽ¥gfX¬»›‡ÙêZI;±+yRwõ¥ak¶¯KOWuX²%ˆ¦J‹´z^ã Fý2È)ë¯Dx'8—ú€“Ž.WK[]¡¹ïJ§«+3aÂüuòú†¥Ñž„“—£}gDtù s¼‰¦|88]"ŶH/ jºúB3šïCƳl8â.)Õ²IVÅ’±?õYŠÄqº¢tk¹…÷6¹Ú®{ú¸Ýí % uh|KÍÖö7tW£%»ä¤JåQ”7ap/,¿ˆ³N‹Zh+Jå5.¸Œ¼Ÿ 耀ˆzv ô™EijçR‡;ó½X)žüÒ¥‘‡úC×f÷áý,_9Ò›îÜùÝ:¥¾Âo‰°ïR”|¾$¿z˰ÇÁÜ‚Ê~{YÈÏŒp¾e(Agò®ÃqB¾—Ê'Âtt§J?Vf)ر{—Hâlrñìº~öš—œ–B«Û!ãWÂ`¹fiÿ¦Àµö½”¦Ø™H°,K˜¥ñ©Óg¶Ñ8@øK_ŠÿÐJªd;þì¶ÀâFz@ÁÄÔ|fŽH¹êùãúóI_ÎÑ 4Ѝ?åã+¡*X?Ú´þ+ú˜' г×WÙEÜô¤t®R¯¥Qÿ£©mž&šd5ËK©Q“Í—'<(çtk³/ß¾¤ÑôZ/ã‹ ¯lGsðm‘b†/_õ«TÊÈù5ËõÑŒ…»'Øãñº±ƒz±½XˆË gæÖ èlA~uŒ…€Ì^5Ù (£¬Hq7Ò™uA!³˜Á–>«tkó\ûZ&á«§aœÒÛð0u>ÎJ HõÞ™¼óš1-Âÿ Š$O^Gº:ó½tÙž¬ÝÿØ£[ ÞVê#™n|÷LAjÄjéBp…Š%¡Q¯Ëy³8˜Š·µCÀ«5Ó(U[. è)Cbx)“r»]$Õ5Åí[»\~ø¯ÀøDN|õE¡]‘ÄÒg&ÑerŒ×ÝIQ¢ÌýXañ|ž¨Öœ¥ú>ÖÊ;oÎßÎkŠêCX’˜1ém¹ÛZà`:½õÖÙÅà ¾¦!ô^…e›‡­¦sÀ/´©Xî½1Ÿ‰…žhÖ÷—ÈQ;vhy·6_3ÜÒ×\ËÙ•ÜË‘?¸š)*\¿âÄGæñ5}f`†d,ÿÆÕo(a"F$N-j¶Õ­`ãɉ©‘¯e ˆÄ]ò²ÕÖò;pÓ’¡­%äÇyŸ¤ŸWš9ÿ®¥Ï];g­ÐF3vä× Ë_ òä-'ÏBì8û<~µÓ÷¹ÖoòÃ.{mNóéU%ׇÆ.y› ¶ÂA/@P%þ¼ÐeŽëº ±ãŸoŽœg© ¬0£›ÉGGûvÞA—gÁoÇT8FYZ5ýèN?83ƒ1eÀlÉ»~98PŠŸ.¨1‹ô[}¤N>b%m¥¼NíñUqU¢wïíl¼PUŽÒ³Æ:„ñ$Ž›’;ÊTNÇßL@Ó•³—œ›è¸†-k‡È#?¨¤s¢ûSHdŠÌu…)ë8ësz_j,î/(Yˆ…ʨ(Z¿4!(¶‹•lKQšI-Îxíb#ݨ;j"#Ê‚d†Ç„`ü»É|*3å-<èèw˜r0æ=šL6h·†vÃîU#V* ˆÉA”9¥õmm/¿Ð>øPîôâ]¶E!xH¥‚³qXo}1z{ÓD ð{&ûŽ©dˆÒ÷Nù¯ó7G©® í H8n+Í¿*ûýDU«Õ¾[r‰t_–Dc7Ï×È‘yè´q·Š#}¸ÿPEü!@&K{„óÛŽêÑÄUÙ¼åS*¹Of†µ4{¿+inÖø}ík?#¥³ õ£ð÷ÐÉÝ-.{wV‘ÜÔM ˜IÁKü…ðNÿ¡óýx¬[ÛÜH΄åsGHüËsIûž÷a(û×)5A‘1eš¹ßL3n&Õc_0^Ûâ-yÌÇ^oMóÌ{wp!“Y`{¼À­HÈãM'ÉÂë(#Ù£k Ë¡ÀN tì'‹Î|ž…oÛÔ0.ʨ°çazÄB—ïãÊÍjÔ)…T=¶ú÷Œ\n"lÂ}j”¦¤o,å!§þØJ#ç]zbwB{qU86êÀ¡…‡ô)"2À;­½Dw|7d þ°ò~4¶ÑÛ‡ÛN‰Î%j„ „ôL¼—}ðòÔ¼@ÿ´Ë“f^PÚ-cWï#Øz`qô<3|Ál×¼4~)Ï‘ f©†6˜?e)„OëGú¢ˆ ­† ù ¹@èâäPüÚíp€:aµ·sö,tµ1ZYéÚ&H§tz«æÙ´`rz8J‡Yõ2]…3Éý™ÔîýcµÎá×$Â(™,»[B…"ÔÄÍõ~t¥ ºà.œ0q5½Æò±›´×rXjQñ]ÑùÌ%§º l¬}òÕkÙô4ÀÂ%¶X>Aˆ2T€Aª@¦¥kJùwž‹.‡Ÿ9Ö>éÞ(øÇò‹÷ŸêdþtÛi‡«D‡åP¹{Å’–iÆÂ¥»ÍLœ9…s9s—p, õ†+hm…êF…ìÛÛu’˜QGËca:òq‡s‘U#oI®l޼_ ø×n½¬o…¢¬„R•¯ïиr¥ŸVødšFç(*5([9€ý„_¤ù~øôÐ][@†جö.…ú=±˜¦`?;.‹- 'ŽÙ-±ú 5ªiÝ´Òâ)JJãó*ˆ2…„d³ oÏ­UŸ´ÕºÏNh€E ¥“Éc” “Àȃ8³¥û´<2pi=vœRÃ7TN,ãŸÃ]àð]’›–­¢nŸv‘i5¦xË64Aµ`#g[…±€¼Ï$pܱí_)BG¸Ì+GÖƒÙ§ U¨ Ýqnc„öŒl„ƹÖ¥ßpg¤¢ÑÚW§ö•$:~¸×#=Äl‡²6Äuïf =¯*‹Ú­zµâØ >÷—q–›ÔJºtt!+òL—„°*›Ó¯]iÏ0ñBºu_¤ß‚`ðk9G+ Å0GÀgZÚëE¾Q!ÏÞiUøÁMʶVu A_=f˜ðЙÞj ms/—¾‹Ân“ nì.HQh;µ¶sÅóÌ’ŠCn¼sò¡œ1Á,^1pç*§ürŒÊæF ìý1óÄ*óQŒ³Ú«cücçë£r¸}HåçÉóšÑ ‡K!ºæT> 7ÀŒpò~´Ä5X©MÛñ¦ø»4›&®_}øÖ(‡¿¥'ý82m£Õd–¸ÿÖ¼±8w”ñiÙib¨Uëõj‘–ø–ý^–ˆèN$Ô÷÷å(1¬HÈ'°’χ­Ó©¡O†E¢ÃPK`”Þ|5©íD?3w¾¢ƒ4È)3¢KcÄúèX\áÉ“¹ßH²e +ã“h@^§ŠKT¨ô­Ž(;šxgY³¼£X˜6­ H¨?ÀæšliÁ\ØM9³‚ŸÖ1ÃXárÏ'±—>&ÈwI㘙Ëw›–¡]* DkkŒ¼%P  -ñRm«\5’X¢ÌQò“:ƒV^лƷC(Ñc3䩾P½ÙzBÐ*ñvdð[÷–M2lK•Ö‰^â`ð/‹J¤Ý×½²§¾ ívûXõU‰tÄî=?"$¦sïåÿv“w¬ñ¥dl]eÓJº‚®>œÊ”WŒ|¨Œíšsö´N’ihÝ+ü(Çã<5»!¬¬¥†¡`ËCÿ[ÆŠ†R\ [‰‰²KQÃ;´Q%×/æçÄ׌(…¥.p  ¾‡Yiö`ÔÙ‘íÝ87Œ/7‰$9ïŕх¶ÇwIªÔ;ŒvçßygòM¥Ï4Ê 0©F!¾ìTÞ;KN/¹Ük¸4fQ„lÁ}_9©ÏF:­Õ½üĉصzҮﴚÈõJxÙŒ¿+¤ôõ³û¸ 9²¦áßD)‚ØlýT§˜S(:!ÇvÉ/K X۟עûѲX¦=l°ÀùÞ¯ aõ=4%Om—…æš&ʳ¬rn¢l‰ý²°ëb€ªˆãÛTg!r7Bw»Æÿê‡D çÇjºc>® :½ uÈ/0n4, FEÇ ì :&!BÎ]9& ²&Ós–‰²ÒSt3„ns´ChݛƇ³1b@CY"¦+$|]Åâhg„­lH®OfóŠÅ„á…Z Yh…”–/€ð¬‚}ô  {ë¡B®íïp%µr¾SiO ;³=ôxØð\)ìe \x_Kî±`ع§XÿloɤÇð ðéÿìä¨PÆ$ØûÚ7ëX¨ƒ‘ŽÿG§8Õ”æcÉ+ÃüxÙã—#‰Á”ç#ðü˜¡+ϸWÛÓé· /þH®¬&­ðê–­eÄT´¶íÿÖíPsЍóŽŽ^æÜa¡K§9¦  LÿûǦ›¹ÜõæÉn#‚‹ ÷)OV^ü—Ê>\ Öæª šCTs5†ä6¼Îõ䌉“9¢r!A=OE Ùñ×£øZS-]§ß$øÂÛ šc¤A†vÝÉö˜êÔ<Ƶ©¢`ÊT»yd>…ëÚã?B隟N&…3ÛJn NóeÞ“÷¸†£ÄäœÑ åp³'Ü&ð:7 ’Š ³ú®7S~uk.«FŽ‹†çVÀòém\sK«¬<+!ú?‘UãȶžcpðET-=‹;×ýÂ-8^!|3é©o~õ ÄçF:€ŠÊJ³¶©<îUãÜ2—½Ö(LCËAaMEbáÌnøžœõùžÁ€ÝzŽ‹¡ný6ÊÉ¢ëþuð"EðU‘}©×{R'¢¥Zø‰"df×aIpLƒ¨ !Ú¬¾Rk¾Æ œìÆ^Ë亚ÝÜŸžÒâX" #Z‚!h*È+â™Íò86]¼0|Av‘u_*DêÈ« ûºx úD38lt§r¡oi(“ÍÊþ‘æÃÿ¨l½…‚:©¬¨Ö@7­Õ²ïýF“×Öþ7´]Ëû"âÈ/-h©#=!ãØX ÷`æL/â‰öŸÚ)ɼ潯œNÍ\GQÂ)`XA”Õ'|ˆáðR‹"źԋbÔ˜³»äÒ{Uº‰„ÄÀÍP‰¾­ õ*Iüy0³HZ-þÁ¡±†¥"M£ æó÷ºMkn™Ã´7ÌúZ \•ýì¿þÜUA˜çÁgÕ¸H#u¦€^ r­m#$)9ê\Cgó9îa}Â2 m3ªÕÖa›þ:Áß/fˆ°V×jŽéyå4]é·sâ]+OSRž=1¬N ¾î7=¨¾dHaÛ‡Exi/zZîAóù¸i~7½òÖ‡p ‡íë­¯MÂ~dèqWç®ÒæÈÖ3(èŸÍÿãeà8‰ž9fà9™=Š;ÏÜ¡àQcÑ2$»'˜ÁÓ‹€RgdSÀ?±ž¹&4XT²º¥£§«70"´˜l×ꛊRà=¨ÛTÌ­¾`à‚DŽ˜›ŸrJ@ÚÙãõ]P@òo©Þt@óÐ:Œ B ÙŽÕY|ÚÞ ð¤y?œD¨‚G`s¼ØÏ1«#=ƒÒB„T,pë–Éx¢±G,†¬Ï@z·`gÙ d°þ­jÈL¯&©áèkŸp´­ÊÇã··¼¾Ô‰c£é”]+´Éœ¤œ<²KòICºs‡ ö~ÝÝAõö\©“m§y ’Dª×‹‹©?a \`ÚÕ–fÚÞÑÀb:X+Tì™·KÐj¯uîn8“³Ë½Iºù·a6Cõê 8*“î›À@ö/¢~‹¾JgŠXqÑùC|l”Æ’gáQ=£Œ_i™C‡¯XÛÞàŽ¨²õý ½^ËpÉËU W{?É8Ä@¢×Ó$ÖU™OåsþIH¯u„[§mmI𭮤Ê$züG*N[¹&§›K? ê,ùRi¤ÒC%4©TʇµÓô£@?Ý ŽðÈC}j7Þ•ÿá~Nì­Õ¹íù(F¡6ÓNLe_Yâ®X~H'øé„e‹yè8!&ŠNl÷%Çw oï‰2FK)Uu¢\cÅôDž’ú4"i%n¹‹~プg  >ϼñ`6¾ÙÏwv–zn¶?骨+oMS[P<%;ÅŽ¡ÿ©Õd¼Ûôc¦°riœ(ä©¿-Y{ðŠ·1ye™U·<”Yéo™ŠÞâ#bŒðLyçXUƒ> ¯îòªm'†³Mxañü•À´C£5áz æ»È{_iY›_:w’Âú‹æI3 Û!=!_°q>\†¸µÜVË[Ú" –úÛ-v2n0ÊÒ4§Þ̪X¦=·Ç*K¶)Üu5<$z’ÓvŸ—Éåä#GÓU¤_ü 형CŸ·­\[ÌþÀz@<ö}’ ›"ñ¸†1_ºÚ1®µz™QX]ë¡íp-øË™µ©ÝÃNrؼ£*#· Â’kĽ{WwÅ ñ—+Ì ¨=Pà<¤ÌârÖåbä×g'±Œ7±Ñö¸tÛo3ý€‚΢sLðüU»8/ƒg¥%?€˜i)\žª5ï´®  PNñ;¬TI²h4xv@ÛOÃFÅçŸT¶HçÛ]šóÄ‘\ÎÄéÍ+–ÖPmƒ\~†Mûæ=Ù³ê<˜ÑWsâê9ÊŠ†CÅAmNOÞyŒ5¬ô#Ó[ç|¶ÚÍB?âðT×Ö¾CŸ›ìEe)+Œ¢-›ñªÀuo×!SœW#ÿ M’}UÎÉõVªÂä²\öÄŒZº0”*ɵþ¤âH«ÃÓhÈûÆÍòô'Ä0<Ð±É WÍJÊ/™‰€¦ÊMj_HF6õœRé™÷°\e÷‚–#â"L W™”ÃÑ|ˆ"šéÌr*Ò|:UG|ÅŸ.r*†ê¨ÐMË^2Æò=†þÞ,?ª…Lðêö=Q”:퀂Ø)l³û´·H–¹e½³áwà¢æ±P,Ǻ-nVtu”oŠhÞ¦ ×ñåï¯BÍÒ®þ£­Åß-:÷ÿ¤eôüS(ùçý›òõ‘äs°‘{îkl[‡ôS]‰tx7@ Ã.ÞӰѯ»mª‘æ´D¿êmŠWæ«öäyTQ½Ð¼ýó£]·é)æ(ˆÇe¹vCëv­ES>J»ü‰P¤ä%À¨­uºó!®«7yù¡éç &㽎¡ pRôFd؊¯8z‚_F ÎÒš{,9ݵƒd$tM˜ ÔNý¥y{çK\Œ!­9LÙ‘F|¢ƒÀM-ÌoŒôÄ›¸úXŸacd€áÁÜ‹l[0›Ku‰"ò™’¯¬ëhÐá°‰c‘Zçé A¹FÝ1×±5«Þ}ÆÖÎwL=ÛÖœa=FŸò²Èa³hºà„§™K V…±èè?¨"‰}R."ýi£/à9ÓIDÍ$W~b”Ò5ê*uR”¼ÔNaaxtŠqv/Tóå(Ó¿c/f†­Ž4%3ñ•d?T÷xïØa¾<{U¥Aã›C®íY&í­lÿÙª`“àñíÚ†a±ÕÉèX_~o~ŽãYõ‚Dhé²ÉÕåßkù=Já–²ù=xÓ·ñäüÞÔß<(UÝçiä,Ó'¦ã±ñ›<§—³EDæäËDÅS£Aâû(©8Ká•g®­þ:•˜¼§¢ÐP…­œV.ú+4\øŠwÎÞ¬ý¿sܵln#h.)Ÿ‹Âu?òA"%5ÍAÄ3L ÀäÄ)9T  Àãti¨…À¼Í5I|@䯙Üwâ)tÚ­ÜÄ&$qMÔÐúQÐQMVç/i¥ªî©¢ù0GA~Æ@na—õ¬)ß,³¬ñµ¦ÐÕúêéЀ¯ÿÈë÷ƽgeÒî¾^D3^%½¡H\.èZp‘«Þœýj¼01^I$xÂM¨qyÃ[ød-z$¤JŽ<{¹iûDüº!5m÷ôîgÄ®,¬•­,ªø4ä¨Ìætô•§8SSsÚ$í¶àXêèüD\‡Âz©†ðîÏ×ÄÒ@MsD ^®×@ån‘Ù¾AÙ*zСTÐD'iðAf20žQ^z å¤ ôúv±|ç%ж½·ô¸aÖç’N³Çú½ÈæH<6$¹#è`<ëv6µÝZ%ù÷ ¼›µ¡šffùw‡¹IS¾|Û²ê›Ú6/ké¾ögÑôY:Öúù‰E[ ØE¯Ë6*’³îó?>tPÒ©ôYêóQÞú]¤ÒØ–¾åøÛ÷+qH­›†¤Â¸ÙÚšt¨t×Ëð~w¿Ìjâ•ë _Ù´m>„ʘþ~`ÿÿþ?щ Àèlok´†ý_©« endstream endobj 112 0 obj << /Type /Font /Subtype /Type1 /Encoding 2437 0 R /FirstChar 11 /LastChar 121 /Widths 2438 0 R /BaseFont /YJNBPL+CMTI10 /FontDescriptor 110 0 R >> endobj 110 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /YJNBPL+CMTI10 /ItalicAngle -14.04 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/ff/fi/fl/parenleft/parenright/comma/hyphen/three/four/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y) /FontFile 111 0 R >> endobj 2438 0 obj [613 562 588 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 409 409 0 0 307 358 0 0 0 0 0 511 511 0 0 0 0 0 0 0 0 0 0 0 0 743 704 716 755 678 653 774 743 386 525 769 627 897 743 767 678 767 729 562 716 0 743 999 743 743 613 307 0 307 0 0 0 511 460 460 511 460 307 460 511 307 307 460 256 818 562 511 511 460 422 409 332 537 460 664 464 486 ] endobj 2437 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl 14/.notdef 40/parenleft/parenright 42/.notdef 44/comma/hyphen 46/.notdef 51/three/four 53/.notdef 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T 85/.notdef 86/V/W/X/Y/Z/bracketleft 92/.notdef 93/bracketright 94/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y 122/.notdef] >> endobj 84 0 obj << /Length1 1763 /Length2 10779 /Length3 532 /Length 11773 /Filter /FlateDecode >> stream xÚí·UX\ͺ¶‹BphÜ¥q®ÁݦqwwÁ‚»[àÜ%hp·àÁƒøû›k­IÖü÷>Ú×nNú~«F=÷¨ªQ£¡&WVc5³7KÙC\˜,@~€¸‚š¼º: daC¡¦w›¸XÙC$L\Àü  êj`‡¶sósù99P¨âöžNV–.:qú:ñDíÀNV @ÁÄÅldb P³Y]æö®N/hÁÊí¯Pg°Û_&ÜЊè A½Ä^ˆÀ*þBPA‰‚ÚIþ›x nR/5“~!¨Õ‡‚*ɼ4]î… éò/MWx!hºâ AÓ•þM¼Ðtå‚橾4Oí… ‹£þBÐ<Í‚æi½4Oû… y:ÿ&>hžî AïÖÔÉdvù_›†ãßõÿ½m ÇëËîàƒ™¾4ôo²A“ÌþBhø/üg½ÿBh Å_½WË¿:ÕV!ôÞ­ÿB¨“Í_•²ý ¡Vv/}ÒY!!ÔÊþ/„Z9ü…P §¿ðŸøB5\þB¨†ë_Õpû ¡î/}S°zü…P Ï¿ªáõ/ü¿O/11{ofèõÌình*7·ïÿêru‚>ï.ÿz=@Àÿas+è™ {€A(‹sö ÷!Ö)ae~’“_é ×ñÎkz—¢B€·èFÎKÃÎ’h¤“jð8ˆ~)dƒ?G"öÞ/§ëÏ‘a¸*`¼¢m^½&+§R¤&Ä2—þ»G zÕ¡‡ÜŠ|:Q=ˆ®Ÿ87™ÞcD£BbñŠf‚ñTk}`Óœ3ö 0K‚Pû»¹^?æ+/î»z)ÆÉ< ÖÞÄÏÖ+q‘)Ìr¬Í›f %ïbK†äÙOWx ÕJ”q>#æœ8¥T+ Ð'VšŒÐÒUs®%6ÊFÞ_ŠÏ.kk'¡Dµô§6'¿z}ˆ_^Ú…ôåì„ð¡Ó¤ÕÒñÞè°!ßúH߇‹¥)í{Kðyö¯RØ×¦ÈÖ•“Íoµ1˜nˆqâî5×órI´×îlJ,J ü ¥Ù<Œ‘^Û+þT,ËðÁˆ¡¦ ñÆù|ºO½éÃo¬í_9¨ÞïPÂD#[»å=×ÑŽù/È‘˜×Â^á]é¤Ýr3ób†¨Ž ó<÷]–wn›F_ãX,ÙÜÙ¨2[÷ï´ÎÀ<7®-µ°ó8ˆÁµŽÃ£”RÕø <üÙ4RÊm.§/ž ˆ<â\rF%MŸ?‰EHhn@àß+=ùŽ+,T[O∌M´ó2ŽH’ÊGØÀN=ê÷–¦í]o`T"¢bNyNm§¿Sš´5d«”S é;õÎݽÅ`ÑmðË3RØQª‰,µ“»Ž¹³xñn÷‡õAL­bŸ3x>ûã··rÐpq5(C4àr‰q3–dÚ(ñ!݇YãeèXPS†ê‚QÃQhm³ZeKÕ²«èŸÚ¦î«sªKމëðNiIžIà9±‹»EÀNmÊ÷¦àÐ.Â';ˆ-ܰôT•áÜ  öÄØn(-$š> 4¿%~kˆ·øíÎ$ŒqPÖ‘+ßQ¶c](œKÌý*èÓNÖ—kˆó ÁQÀ’}µH†p ²ú€ºæ¯|j©ÅX­¥´ÅRÍJ”g²¹5ü U·©wV÷S‡ìðqö~°Æ=kïV±¡ZÆX`×í§¨aIJ²—[2Ája¸”¸»ÂªüC“íۦɀ«]1§¾o¾”³ÛÏk¤R‹p€¿4Ó­ý*`9Ê®†hy5M´|oθÛ/œC؉9KZ®¢ÁÖïOì³yìaiêqrQÍA[ÿÕBQ«i¡ˆÄÈoÚÒ8·=éBjQΪh…ÝeÌZ½©‰¸å¨™àf2ÃMa_@{ãX|!'êà}·y#há͹9Sûìaqd¼níÖ§ß‘*Öv&¹ÔÚ¿4Å}˜ózGºðÆGÁ Sc+–·ÁѨŠO8dÒ¨€"å —ëkãõMÙ˜ï›óc¤2į5-w7ØýËb]VÇo‚™Ã0k°Îè?n˜ÝŠ‹%^qÿ>HÈ2w!î©1SÚ$Ø¡í,Iÿlï•Mü$‡Ö ¸Í* W‘j$ú5óNfgéâÓ+eT0å³µíÃÿÇì|ÎÜ.o—ËÌïÞjŠ£|ç\ùQWì_0Uä´îÉ"góoËÔÚ/Hð 9P:&‹½!Ôl†ŒC5˜@5ù¢§÷˜]›ŽÔ¼jUW?õKûкýöç)Æ'ü4¹˜Tƒ"i‰ªŸò®XD ‹SšDݘ`]h€ô+sÄ cõ¯…£KAÓ×.ˆi¡#ÊäuÁ+¼ÑyŸ½m«€©4Ñy¶ææÖªpÁ˜¿¦bý)¸(-±“§ü÷¨k†ÝW‹«?4å9çV?u² æHOà‹1ºŸ\ ‹èX;ûݦ“Ðüdà""æ¼ê3Œë#ËéÎ}(?àüÁ«²±Çºƒ‹MÇ칡”qŽž%ÿE’•f<²6¿2¦¢vpJÿØÊÔÂ2“åZX–}°LÆâ48 Ë^ ¹Ækä½í¼æòN.!åbKë; *Ç&—8pÝPþðóñΙÁ§OŽÎ)³\r`]ü8ÄŽ¼èú¥rSy{úÃû<²«Å\ìäh–3£”Õý¬þwŒAß.ëô.¹¿h~d ‡Â*£>÷#”mMµÞ?¤ùt8P‡ú9pà§·œ"Nú)Œ¢ÿ-—%›U(ùÇáC?E¥|©ÞëºGëÊŠVÔï¢381¥ÀìÚ§Ó(Ú'œLsÅ–çΉq„)’<ßz­…FCB­Ä jç~Xݩӭ·^‚,ëä‹¿XêFøê{7>m!™>£!_6©Þ[2œ?¼Hò‘ˆ=YüÌS÷ù»ÞNYÞׂÿ:.-_öŠ`ÖÏ4£«bY‡ãå÷¿4DÖÓgBŒ5SEÌÁöƒÒXl£g"ÓÑ=æ¿„ug¡ÿÈé~ž(Ye[|¦)†ÕÀs²Oe:µÈ4‡ÿYóå}Í+:Oàm —…€fv4½?L #`ôÃŽ‹‰>ê• ä ½&·}g5#˜DqžìHRÛfík3"Þu˜dRV7ÐÊ Ô¸³X¬ènóç4S¤4ÕçdõYÉ3ß©úU¹ÇçÝøŒÖ±»]SF@×|s×_)>'È ®•f2(%˜ìè[H úÖ~1ÔÒ:oj ô@«¹€ FZÌlôµ¨¿~T‚mÝ:€%@Q1w…«|ð©ÎÊ}×'b°Wsøvöbÿ3Xf.{~ø®¨çÎý —¶)ù™ÿ†1p†á(i§Ë±Û˜0+­´N‚É(@s›8X‹¦B¸p¼»ƒÇ˜á âÛmÝÛCÉçIš¨ÊGÌ'1’Óˆ-?Õ§~¡áår/Ã$ÙÒP'ëÅ*È¢ö‹H i=W@ªv¨.㜷ä`jÿ6&‚è&#[dôµç+4^ë ßUƒ(ÄÙ(l5Ý­ëÁ¸¥7¥PñžÌ‚HO?ZÆúû~ „úoS50vÔlr¬¤c®G€ÚSÅõôS¤BÏrÃ`uÒÕg–‚ /¥Ê¢Cm"Xw4ê“"»¢ô}" ßÜø,Þ-Ê« ³-Ãï¡©Û$z1̧¯o³_)œ£3ÔÕ.ÉãìƒEåI[–ÆwEÌÆËû<¿A´È•š‘³ÂÀ“„Љy^÷Á©lm!VïÝ4sb­ìý†â"‘ÕÁ4«¹5µû9oìâYefçýè*±Qv}ï~#¨Œè€d‹)ßMr‘!Oòj@BØ=s+Xº+~\(<°ù¸eº–HìiwœHœO'UÝ;Yóu¼õCÕƒ 蓬pÝó>Bß94%P¼Ñý‡•¯îÃøî@ôq¥(U¦©ïÁŸÇ\^šÈº" ©tÿ=Z e-4Ò!ä#PBN ÉŠb;O!ØžÑwËÝR±hyކ ¹p—VúnÁje‹!ùûa^z¡¢qÂÄC—½QÌ'47âr KRŸ‚;G›ØÈÆ1<Á8S'Q„õÄunQ*àm½-wfÈ»­› ‰õ¡¡Gâ§Ý O÷þ%p/fWý´¼¤Ì¦Ím_5•4uÊ †D³YLŒo’3ÈeM«sòùyØZdEªŒ+ƒØ™j.ª¯YE4ðSJ”©ô´÷q«›ø÷ÿPr7RTÊ5…l²kÍ[Õ Üaµ=Ô¶]xÂL6Ü¿Ÿ¸…ÐÕ„}g·× 8ÅmpIqMç§o¡×›__ÅGÄ o­íO^âûZ7õxt•r SžV>hzFZ;³J9%‚Jšœ$IéãYg°#u¾5µwžŽ±‹å[rJ¥GÌ®7P0èJ ÕµkWqì ‡¹#*"âȺڨî6á[/þPe ò˜ ¸,¤6FÑB,/áÚ@S…cøõ5>÷6t"î`/ƒ©†’Ç+œ¨ú(^‘ª}õ\2²£ »$« ­Öáy(Í¥Õg¬Àè]ÉV”,Ý=JŽðdn`Y¦kL°í´0I ß12AÊEGùðëëV?(#XE@ìDÀÁcq΃qÔ,ÿc=£Z±bÑBMÆ?g W0–UbŸè=­*[_:ðBÖ1_€øÈšÞ ¯¬ü:á¤ÿ8ü/j3ÑÑKjûÆô©Øá—‹ûäB¯¬MÌvA Ó\êfÝ¡u ÁEg³š0x—^ôG_ĸé°#6Þ«zci"µaGŸÊk>ó¤ºTŽ!q¸6ðà»›J[¤®œØûLÎ×øùïhÄ)î§Já5òý¹1ÏÁz–?| ŸpÆâ]:Ö½Œ÷ôǜԛ5_oß°“J! ›?gߔß+î”4Ô®KíÔ{[_LÈ€îÌ@Q-Iè‹dwzHÜÎýv&ëGÖ·ef)x¦óïhº|aø»5kÄsî“)ÃØ®dÙ>º‰,#²¹…—loeªòºßæ èR4Z®‰è4š%P!Bê[ßçîØn3j³³‡€Íwа Q½Ø–Úζ7ë•tG‹°QÄ÷äBN$Ví8¼Z™b†ï£NÏ©•[ iÛ›Ò!iA”®Ïø4ìÝ&6—ã˜JãïBí ©Nºí:üáÆq(J‹ïmnŒ­ÛpþqJRVì}nõ›Ggî$ÎPW®è[:~z›iâ¡=ž¾LU‚tk8ªébûÁN €êhnŸ…óc¸W½ÕàåWˆ:áØö)O†ðañ BikßÛ ¢¬×g×'r¥<¡“a,7ÓZ™É7îž«÷®j®•¤îü™¿Eèy‹?ÙanckQ,ÔN˜Ü ç6ʤó¢ö¹âëQEkbæ ŠP ±´k?ÉÕ_Ûü Á¦7Œ† ýQèD`¼}$Œxœ°ÖXÍdã+¬:…ÕI5/è¨Æ3¼‚“ùnCÂr]+ä2$šd&%ˆ2säÏL$²Ê ó¡l æIŽ.2<9eù”ì×îýDm‰»F@ïÔ]®Þf ÌPxpKéü:[sÑŒñó»Lg¢)÷+Y]Ö !•â®M£’ÐYZÊ÷.¬g4û·1ÁEÛÂhXÑúÝÁiuþ¿ñÞÄ|'ŽøÂy.dÜ£l­©ÛòNUf칇ØŸô{íjnŠ5¿‡8»NpÐ?aP‘ݤ´}  ·±+£–"§ÁÏÔ„7® ÿ~AÂû³DÌ£0Ý{›ÀàP÷ °Lȱîà†öéÉ‘µoNðõo¹$ªó‚zb¶²`ùMA,Ž›0ýü•AûŸ¼²Uø'¡ÊDüe¹ œªÒéýXꇒ73I¿RUAÒ,A\C¬x54R-OÜëzÙwaJ1‹z¶ ™¨Av‚l·ÍD¢fŸö?ZÞX |;›¥%1"L~.ÛB‚âÅp¾eŸ>ulRS~lDþ¸cîDAJê¶Œ©ÙeÖQ@YG2:qÝkÀ¿¦KÏËà!‰:³„µ!+Çy½½‰O÷*:!¸ÃŸ¬姨 æÖÑ× ½¡ì2Q4®I@•ü⬷üãÌ:µÛL0¥ Éo ¸„ɦ–¸Vs£ÂL#mG*J{v$ã¨PüL…ôpN^Ló× åäáö)Z=å–6\õS³(ÒÛf p9œÀ¨Hä8½Âs–9ñ· –·™èoŒÌ|¢\äåŽ7MŠ©æw ñ·^ ’Ód ”ÅìÊ“í6V^¥:q‘nªÞWÙƒo ÓXxZ’© pØ­µC°ÐšÐ<å—4lÞF©z‰Ðü€·Xò|Ú…¹˜sþÓk}7ò±Yv*¾òÈ"Ìz…-êF:óCã;PŸ¤p;çÅIÓ™¯ÁZ+3ïîÛ‚Ê7¸ÞTÆ|¯MNÀoraÃÃо¸eö²¤–ò/и¸(àÈBœ]z-?æØûˆJ§t½£a)ß.¬Êë- "È¿{¨g]~ {¬WÌ|§×_¿# ÷Q“ý}WÄ'NªÅíHþ{é@¯w½“$3OáZ¯7Ç5šáKó9%!Ëzç ÑILBÒtšòKÚ?ÝøhçÖŸU’š«.ÝÔĽ­òRïÛ=RÌg“½o a"õ0ÐÔäí«zkœ+$íä~¤2¯¦;loßËÒ…ñÚÅ„;5Ê'teñøþ$}p  gœ_Yuð.æy¦:ÑÁFå=·ÛÀ³¥Vic°›>ÆÍ]Nîcá¥$hJÊ%_±€„0ßösl}‡†äºˆW]6¤æž!,&Nœ›&5c“ÿ¸-ü!&­$`ÄRÀ²~£=¶§+ù2ŠZGnÞ†é7é5K6ûV™W õJ¿½ÞÈM.›üVìô/ŸÅ®yËQ×[˜Cs®ïCÛÎ “Ö9]Hp&áäÉÄo­gš]—µ>ršÜ¸vt 0Yçó± ÙJ}ó´zô{g!¨O Riê„/ñõk†Ã'¸Â¦få¹¹(Ê{EZÏ]Ð ¥Â蛊=”¿b¾«¤¡‘üÝD`›z®g9¨mÝÑÈ7þªÈ¢Z];Cºäô­u´æ™Nó­ ¤¾ÌIJ<¥€|Qä‡éÏÖÒ}¦àl2Ú7ÕáåUKt¨šBε¾‡›8%¬%#X~¹f[‡èâ·¡ñ E èÒî»ñ¼­Æï_}~ì•{Š!~»G×÷£U‰Û%Q·¥¨ïLþiB£ÆN[ ÖZÁ§4äÇñOn£ÞœA¿°ú³ 4 “È!”&k¦wõrzŽ(F«0*m¬C¶¡–ÊXˆË×*AÛ‘Ÿ_MLÓë¹´’ÇÔ¢'k9è»m7¡ÞeGTÕ"™ |›A—î,ÀϹ"™ê¥—ˆ¢­@H¯Ïá½31~Ì&Ì tB­ˆFz“oùû–±÷Ë©ª‹-q¹C~ª”ŒÑÎq‡yqñFkÖ¬µ²‘ļ šÆûK{‰Þ|-ëǯîy¿V3*«M¿ã¬}-Æðmû^‡z9òsÒ§ý#PŸH̲8j›%Æ6†÷´æ‹ ßZp뱓ùðÆCx"þ+m™õ›oWHŠïÇc7Wr™š<§ˆñÓÉz•{Å^%Ó- ³ºÌb8Ù ª ‘rÜ¿ G0w… N^&Žà½æcŠ-pÉ«oZ>Šä½²QM¼:­D¥u¡Þ!ÞGï5ô…sGÎô?Æ»eýF$&–ÛÇCSÄ!xÂJ¿9;‹¶®?6£7VŸ²©¹³PøÓyj ÷©D9ê§f¥»ŠvW/;>õÍ¡3öScSøààºU2F8Í.3È?‡ÛÒÞrNÂL|ÏT?I6›¬Z«„|ã<¾œð«P€gkäK—è¸Hæ+ž!ÙÈeR}´«›·²÷“ꪯWnƒéh`Σ¾aö»ZyV¬ )¸£*Ì1×ÐðOºÏNÊÊ´óŠˆqÊU*^Ý{N‘“OX³¿ž&¥ÑSØŒP¡V‘Ý}ÓÂÙaQÿãe¿ºRÊQðvgW©ý#c´Ù*,n6ˆfÂE DÏ@‘S¸y—p€ò©1›¦å7WôqÆËˆžYžSKD’Ò7ÿUØ—¥is°|K€30Ä>ú-ƒ ÆÎhu¾ri3œçAè…Ðz¢|ßl5÷øI˜K™*hG!†‰#ç3§(L¸bP˜UbÎÃ÷ zOQ؈֥|L¬¢”£Ü?–”¢q/C'ŸÐö&ãI{$©BØ.öKÍãß_J‘«q8ÀS²KðcX£ \%¼¥&]Ìœ˜Í¡·ÍðyÕ<6ÖI•:Ž”•4ÇypôŽþøóWïËû4q ¾‘­¶ÐE9}µž{xÓf×nóµZgRõ'’<…å†4ïÚ,¶\ÑÍŸ$g¹-¦Æée4ŦvlÑnï¨Eé ‘¯¯M?i}ÎYX÷xå‘uñ}[ûÛWò‡°c›dW´~ˆjD1 Ò-jƺW(ZžÊôíCµàñ zh/Á¨&Ù—gcDUdÀŠÁý'^_jèÂÅpxî´lk(²5Éøâ›²ôÖ­I”3oª%Ã'·ûõÊ%jÚùA=êžMü3lC3×Ö=©kŽaXf,”·ùß>æiö¬B³É¿9.õØåØuÒŸÌÏlOˆs˜·vÊÚiÃU×=˜&Qéxâl¼Oü Ö龈{4ßͽðJÕãðzJz˜:~Ûk‘UŠ6Õ ë÷›X®À¤¯v·N{ãI|‡Ép¶Ýv¬k„Ž!_Ä2õ¥ÙÊÄ©®|o¢)^ÑÐM ÔÈ2À?8:"q‰Ø ')ò9‹Û=¬Ë ×êRãñxd^·¿é›Vöàœ–ñ;Àµ ¶ ¹fÙ§‹¬Þ~Þ?6ÀrH¼øF{ˆ}~‘"ZF ¦³Ç´2þmÞ¡úš„2"â|]»ŽQéÏÀgz®`.…j¸Çf·¡ì.küMBÍÂõßK»{Fu”9§/O¬Ü`6T†Š©ývû5¼ÄEûýÒ¶Z6)ÐùȆñ~XkÊ‚(í‚è,í•lšò𴾿ٱÿ4Sö`7u™)ËÓ6¦¼cÊô\+êǦÁ>AòÖ¦»È6ÖóªD¯ÿê×8¯¥íþ¦è”36£¦ô¨ìù"_¥òdäge3üJÐ!æbõíj@þªxPÃÏ'E*µ o”‡o®¨3È• ÉæO5o.íjI3šj)ùkÛrYdk…ÚÊ’„Ÿíu{¢ª’0>´Bj67ã,\X$4~è-Ü\’€S”°?Dµ¥ô0èÖ¾]?>¯ýAc‰×tXô»Ð0qc‚\`žæ¹$@†¥©š—yؤƒà@&ZºðЦþù¤åµJí;†Z€þW¦ð¥•ÃD-è›öÛ]®¤UBVáô`ÂLsù=òÎããƒêˆF å<ãtæ¶6á.’Šï~óú«â^ír.¯nÉt@ÒÂö®ë±çêÝNOt6ↆ狺 84Q=`%&úÑ\ó'$Ôäyox¿¹m"÷ˆ©yW§Ù~UW-ˆæÃª^MÂbåð}ÖøûJ‹ØüaÐôDš|[ˆk@Ë,#âi)™çéS0þ„Ú DBdåRÛÖF}?º‘³Àñ{nÝmÙë4m™˜Á‚Ýv]6­?+FYAû½=Ž_Ý[ 5ŸøäÜ›ßc†ŠÆcß(>ãçº7Þ)ÄÏ8 ׄHc¥rVðáË´ƒ-l8kEµ–~!j0lOt¤äcŠ&šV‘IVq¤á¸ƒ^mÉÅÌ’)„êeªnl^iõЧª´Aãûèúf÷ùc_¢rº&Cº‚Z U:aìà±Ðçe¢OÖ$Œ(‘¦³`M.*Ë‘'nùð0IøMú¥RWÇLÊ©¨®Í&tFE ‘¢°Òê¹›b~q‡¢vû¤ »³£ìþDû}D«“zXí‹dj’V²¸»¸.SN m?uÆXÞ^}¶kîbè ãH¢_4þN‚¾:~”Žcˆs‰«Fš¢ª»y6Õ§®9ŠúÁk­7ùKÏÍ•MgVr™/©zF°ºÞ/g'1KS~NI‹¯½Ž¦/¿ÜŒZ_l˜¥Íš4oèÃÄæ§áÇ~Í£}³µÄi†B'À:S%LŸv"3nc{Öì§"I$Ϭ $œWù2Ú… Ÿ–ÇÝÁ.ëî{gGSgócodÎ[œ~ÌÐØº€ß8g 7ÃSvÅÃ-o<¬þ¶ÇpAö§YµH4|çÓæÖ`äsv/ êk˜1×4">C4Í`·ÚžÓ‰aJZdHZÃ9ïÃmdû{“x «ÜýO»p2f WÍŽœÍ;ù÷Ž•4b™ôº±«n¿Ùr¯¸SÿóJ\Åç(OCÕ_ÛW„O.‡uóŸ –ldæÙ¥çĆ]š$[JéÔ6tÈÌ… OC‡Í`Z’Ø©*ýå…™$û\v/¤œéË~fâ-~‰2¡},Ÿ Uztæ„ÃcŽéš YkÑ%ºÛA Lú(}ìqc¶?Eþtbi™d±ø¦>N;û@„ÞGâ‡}ÆL+RZÇñ¯«øŸ^ÜÜÙxM5¿xŒy# “£*ñm­m¹{þ´F1§µ×wô””Zø<‡i+SýÊøÏ«ˆ;±; qèOñÍ‘dmô!ÝãêŠåk†ˆ®ˆ™–DSütÕÚ(³¥äN® +êÁÝ*‹ÞZ E¡—›¹‡ãŸ(•¢ZŠT2‘­¡9k,ýSÍf­YøŸ£¸M"Ñ–ö™CÚ_Š^ÛhøûÂuHÈb{¨ÔP…Q¬È:uÒ«ÏÓDÇ+}Zá¨UÀ“!í|Øœ°y0Ï´ØÒŒ ÒÔïUô¨H"ÉLP;ºÿq´UÙò°¢éØäÓn˜‰²:|‡ŒŸæØ"&wßTJ$>ínP:!^èÊàÏs³öüá{ʧÒ!“[‹…ݱC¦6tˆbÞÛA)N »êWn³i]9vUæ­F ¶,£<Ò}”yw®ï#š”¸Ò•õ_'ñí#ŒÒÇ4õ8Â4*¨½ô¼%_ HeÜp‡«t/‘Ãoùõ¡‚,EaŠÃ?ï:ß‹|9N0u^äñê8 }I'iñ6ŠuçTËoú*< í¥ì'ºêå›c]”_¯×‘J}j“’ßô—}…qwšžÓ2S…gªsü3ÒŒ£âh«Þµa9;<ê´+^¾´‘‡Úç¿Õ}m[31ÓÙPɨ-XwË{ X«éRï²MMî(÷>0»Ô ØyV©OcSÔv¾â…œ6Ó—D‹šÂÀ«{+‰ìÁ°±tÒ5Ëž^c(MÅ·e•鋘Çß.gDˆ˜<¾­];JžÑ”~´X¤ä\´N­2}»ºÝUTñ†gOi©åÜ™õ&p‘vwõQ[{êC%“¨>ª`z¸Â»uÖ ­sHZæ¶ó!qòÒ6€cš¯ôÒuEà’~œéŒZUs5ŸW–¯c’¾,®Â€E7†‹ _5s˜©X¬{íu©à¤lQÚÕ÷¬åƒÑ¨Ê/ðiÀObωZ‘¤[ØÂ]‘üf\¿¿ÅëyÄŸ…ò±Ç’·ƒK}?æ ¸€y¸IÌ£ñ } Çûý`Ÿ¦„DÅB‚'Ýß8ÞåĦägùž2ÈcÙ¹ ?¢ò[¬¶95n·O:̵‚åpfÂZ0ž¬åùDÉ–‡x—JÎþ|Æà%léÙjO Í‘óÓó9Fg:ñd™æÙ» {íʖݦu ¦BŸû‰p|hûå~‹-S°hêú®Æ³ÒË _¬í!¿G×sñÏö)f‚IÆeÞ«×:5 ÞËÚÆú‡!Åaï–ã²F¹QaÝÅÔÿpæw±gég|å€ïNžTp:ÂM8{s ”ohþ´ŽÚ¥‡ß%§¡›‚oòDÍ´ï_Èù‘À¦4jBxÓ|©özÑÃã½3’š DsH´/«è:Hþ¼wt Ü]QÐiÈW„Ÿo0uÊê³ë÷Á:08ËÁ© ÁêÜA:?]~§N›h4²x}v§P¢ö7XIMcGìÃí&oD^øöyæ{†IpL >[z[öxxêAæAa…£¼sRÒÄùFW¹Q9îD6~ÂôÛat~´Y~=E“÷µN@;jZå’›q,t¸bc2Ô¬n7ÝeâW3WRQpn›Š”!¤¾›ˆâJçë+vª1ÿй©ECÍÃñ,Õ¸±Á#èÏèõ›Ò/Y²Ê#KEï8¤fMXËËá¾R{>§~IÔ«æäð£‘ÓvM0En‰d1|O¥OR sXÖ‰¼RÄe9WNN½ ­¦Bú¼k{AgâË-Áž)3›Íš±©-Œª3`v÷ö£O¨žuž×w8wV~)ÇêØ¡„/ß>¿<j! ä}3‡¥4­NƒG*XË‹­—míýÜÚQ«Í‰noÔæô¶ç«×Hrço•ÖKw˜@žž‰òoëEÆõYãÔ›î¤úßãpÒ„zdÈ‘Ø ³1b¸÷Œ[…Õíj~îGÃ,þÜïÖ½qõSdô•.ªãÙAnHœ_…•Ž -‘.—°tAÎ7Iÿš“·ö‚ÂÖFƒb>ÂϺ ÄêøøH«9«z¼èð5Ð&Á~²®îƒÃu”šPCÝÕ-Ëá%'Š 9kUA“­¢ùù“Џ+ijÊ;l³«9Š@ÇwVb|04¤¦5IÆuô1‰µy(£í[3·»2:¨|ÇÉœr(UE£ô27ä]Ÿ¼‘ˆžÞN &”X[ö(áÌ¸ŠšÕóQ'«Y#ÉùÙÒÎÉËÃïygE1MP&ÆÒÞa¹Á  QôKÉ5ÛZÚë¦ì)[’wñv¿+ÈÑ­ª³»ŸÊ¼>èÔT•8˜zcQ$ ÝS¿‘yÊv3Cö És{#Ô È/¶‹HÆßâëÑî°OÐß¿7ní ´¶vEa£¦¥Öx£dUþ,žðœ…ó9ÑÝå"[øAÓšZu#w0ÂÚ™¿ôë|Ýÿ V6|ELð(_Œ›º“`“E¯|Ú›CƒAi˜¥·GA“•¿~™Z‡wV!‚#» Ö>`’&ÃÙD@T·ˆNñ™C¢+¯—(·t·mž™n)î缞´‹Jò_ÇqRæ%'°Y2]­~®Þ úrbPbfo™<)EoX~ »34¹Þœ\kˆÚæéµn–·åmšWÔSÈ”ÊÂÂO>òtÈkN¾Y”¡gý½.{tÉÑ#ši_K¯»Fµú–2Ø•”¶¯‡ ¹=¬ožàEë;]ÿHâµ§ÄKCµ­.Ú¤1x7棅3h>Õi¨bÏha两¸Z_?ÍÈÏ—Í ÖcãÓÿª9§¡†ãÄb èj€LpšG’¿©ª¶·à‡‰†GŒù+³[Áw㙼”;ZÔKjI:žî2\7D¾D®/îüùlÊX5¦ÂŽX'Ò•¿s£’a>¤‰×ÝP8ùa.­îÈ{²krlñ÷Ѿìâ}‘èduV4îƒi|w¹-{n×mêWí¢Kmåí3+^B§46 í$€2Íh‡oÂD^rÅ}£ß×Þ.׃(cÐÕ_J/ -˜QÁÐd¬MxoÞWî\·¨æ ª²!™d8WÅúf^t;Ðï|¢‘B±Ò<‘ä¼ó¡» Ý¿æe*“oÜy¿û¼1¼áÿ«Ù_=8 "JK•„¯(£¬[[ÂX‘ˆÒ/rv € i~÷5n‡¤LĆq qƔҒ~!ѧ KwàßìAÙ¬>º\ü æw6’±ã‘Þé(~…Cq9šLƒò“ó¦LØÈñXÍ„‡‘¹+¨â­a¢Këv#ãVƒ®—6;8;ô»Ô=<ÛÿÃÊÿ?Àÿ'Ù‚Mœ\ìíLœlPþ蜮 endstream endobj 85 0 obj << /Type /Font /Subtype /Type1 /Encoding 2439 0 R /FirstChar 35 /LastChar 122 /Widths 2440 0 R /BaseFont /WWRBQO+CMSLTT10 /FontDescriptor 83 0 R >> endobj 83 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /WWRBQO+CMSLTT10 /ItalicAngle -9.46 /StemV 69 /XHeight 431 /FontBBox [-20 -233 617 696] /Flags 4 /CharSet (/numbersign/quoteright/parenleft/parenright/asterisk/comma/hyphen/period/zero/one/two/three/four/five/seven/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 84 0 R >> endobj 2440 0 obj [525 0 0 0 525 525 525 525 0 525 525 525 0 525 525 525 525 525 525 0 525 0 0 0 0 0 0 0 0 0 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 0 525 525 525 0 525 525 525 525 525 525 0 525 0 0 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 ] endobj 2439 0 obj << /Type /Encoding /Differences [ 0 /.notdef 35/numbersign 36/.notdef 39/quoteright/parenleft/parenright/asterisk 43/.notdef 44/comma/hyphen/period 47/.notdef 48/zero/one/two/three/four/five 54/.notdef 55/seven 56/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 75/K/L/M/N/O/P 81/.notdef 82/R/S/T 85/.notdef 86/V/W/X/Y/Z/bracketleft 92/.notdef 93/bracketright 94/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 43 0 obj << /Length1 1884 /Length2 10990 /Length3 532 /Length 12036 /Filter /FlateDecode >> stream xÚí·UXœÍºv‹;'H qw Ü]ƒmܽq \‚\ƒ»»܃»Üùû[s­IÖü÷>ÚצOwÉ3ªÞz«¯¦$URe6±3JØÙ:3²2±òDåÕÔx¬L,H””¢Ž@Cg ;[1Cg /€•‡‡ ìb`c°rñrpñ²q QDíìAŽfæÎQÚ:q„m€ŽƆ¶yCgs  xcCk€ª±ÐͶ¨ü3  t:ºM˜XY&ÆÎ# ™…-ó?BÒ¶¦vîÅ&.öÿÓä ttKhÀ’´°¢‰­5`4EbV°×‚MþßúÏÉ%\¬­ mþ™þŸMú¿š m,¬AÿÝÁÎÆÞÅè·3:Úþg×ÏÀ¹ÉM,\lþ³UÚÙÐÚÂXØÖÌ`ùWdá$aá4Q²p668;ºÿ+Úšü§xÛþË€Y\YMFN‘þ_ó¿Ú” -lÕ@öÿžôŸÎÿŬo ÞG w€  +¸#øó?ÿéýG-q[c; [ðyàä::‚ÀLœOV€…­ Ðtû23ÙÚ9ƒ‡À[â 0µsDúçi²³˜ÁÍÖ†6ÿäÿŠ8Ì.vÎ@#ë·ç¿Ã=Ïÿ‰9XÌö†Ž@[k é_)ë§ÿÑ<±±á[ `6Ù›mß".ðXp;“·ˆÀìdmèdþ–|0{íÞ°ž-ðßÌ örv{kç9›;ÿê^¸©…ë_ØÅ èú— '¸®­Åß³~ügÖvuáùgÅÿN¹ÀÕ­NNo¸<ÐÁÅðm?¹ØÌfÿ¼ØàÓùïŒýŸ=:ý󲿅`-á7ïŽÈEßl'öF`3ñ7ØHâÀ:’oV‘z#°„ô™Ì«Ë½¸ºü«+¼¸ºâ¿é#¸ºÒ멼¸žê멽xíêo®®ñFàêŸß\]óÀÕµþM<\ÿ}tÿ×ßEÌo‘<ÞèÀãÿM¬,`}“¿ðŸ‡ù‚—cú‚×cö‚dþ‚Wdñ‚Õ,ÿB°“Õ_–²þ ÁVoo)++ØÊö/[Ùý…`+û¿ðŸ£õ‚­ÿÂŽþ_¶rþ ÁV.!ØÊõ/[¹½!ø[‰Ùý/[þB°•Ç_Ö02ü—Èÿ}ƒŠˆØ¹{2rÙÀ—'øHôþ_ÝŒ]Á—Œó}5oáÿaS ð• º‘çìŒù‚,¿×ûˆçN”ÀÒAŠ˜5Ä(ÔtN·!.ÄBZ Ë:ЭVk>”¦b¡íÂî’¸=:…·z)Iœù;Ä$Ͼìºì¦z4j^¤ÊƒvìÉnÞµÔÏ\sB*N­Ž'håõeœ÷e+ш©íÁÿ&…èÒq­íJ ââÖ”HµVùZMÅNª‚žìPʲ↞³2èc‚ÐH¿üÇ®Õó!áGü‹>Ľ1\D›HæBø¥@H*#1-ë/}½÷ýš­sÏ][Û§8žùRæÆ¼‘\—Æã …v‡» ‡ÎTJª+H–踅Q÷Ñq"ÖÊL75•˜óURÁ $¿L"·‰ùº-­öÜ­õQ|F',r†öÔAæcÅb°!9VcæKz¸+»PµÔÍW>âåszßÌ+I²w¬ó³ráÙ4švÍ#$¸â*£('õ|3U2©ûev?ÈD–÷—$êe­ž0\™áƒ.pŸ"bs¡“öÚ¢Ø×;«tÉB|&F¨[Ntòå6³‹>zåø‡mÍðI¸ºÊ­Uk‘´¼ËË™ìä#ì.É‚ŠôÅ^×ø6òDÇÄËa¦;R‹] Cl¬I袇„Ál̻¥Rnïþð͸Rù`“‡jÁà÷}­¦K†—i_s^„mÚj¦ë 9¬wâIóÅLûN»¢nÒïŸ(AÃÔ2|—Ú÷³:žÂqögN[[í„>ð"Z_N% kî½æ:¼ ÝWjô:l¯$;ú¯u„ÈûúS°^¦Ïs$ÖŸÕ¹@~Yò»~äó%ƒ” `°º=rÓ4­œ›ÜªõßMwÊf=<·÷±b¢s)Åšm ZÚÈöÅöxB}†ù¬AAÉh YdÀ­/ï“?ÜÕ® =Õ ã½™ÌG^”­LRÉÍg±o½ÍÉÝè÷¥µ³¤1­…•Î-ðsâV§£È`|.Ò<ÏfÛTŠYN´s¼«"9éV’²pÝ ‘$ðäʆ‡ÀÄŠeªª×°|/SQ®lh}(ÐD:ª{I“ÓŸåoo8׌I|$—M¾†°TØ«&­È¹ e9òAEñ›•^¡Ž:}±'U2¼M¬ë~e3åõA®¾çƳrœÊfÂs{aQvÒv®–¹ÉÏd9+\Š_,RøÊ,éyaØQø¢=½ëxî?19žýlú!ð³—FUëí/"»…¬‡1…àíÂlüPŽªÂHt¶hÍåZv:Ó ‚ÎO¹I?ø²‹\á’¹øl®áŒ‹~'$ñˆÃˆ!”Döa˜ÝxiòÏÄi<;’4h&U%·á}_ ®‘wàsHÇìXõ¯Ìö>JîV]‡Ñ¿Àzÿn ¥#ò¨s‰ âË2ð±¸êAû.]%¶'#VA¡G“ªu‚É»WiZÛ€^&úIuˆO‰ŸùÎ"Ùö¨ 奅÷x«¹ó}Çô"û ŸAä•qIÏžJÇ ÙÌîâ7 ~®ã­'nƒSDj˜¬|X=^øD’ë}th¹#Eä׉š‰CHÂn" ݇ÕPR"Fé]PHz×ö&Ãj¯mž%'ܳ¤t[ú,Š…Ý™À#rÏë;£þ29·­ò(ufÕì» 4wè†Ñ#I/¢Œ[QíÙ(qb!Ýc›/vÆG$O7ñ0ÁÄfН5#2Ý_|È#ó#¾/¡‚½!tvþ‘iÂCßTúýSÑŽÛiƒ 5VO^×ïp-x_}Ý æ"ä@Ïé¹ÜR‰|_X`‹‹„a‰\ú$2Cã4k)*dç{ûk‘‘˜5ebþxnÿþ”c$’V:®•¯¾ÿ¨ô†`ÚŒ’'ZfÑ·%ï©ïüÁ“a ê¬aÚǘ‹³‚¤Ä¬ÿ"5¤¡à`Ä'|¶6Fh•ÙÃÆ',±se>ÖÙlUc·Á~ åúÉÏBNÜÀB@äøþ¥†óÛGa öŠq–×/9·©Üwé-å0)’fi­E‹.›i)£Ž2™|?!§‡¤¥O)F|Àfm®7ä~Åìÿ©+Õ X¦¢írñòÈ™†1Æ-YyÁ’òsDph±ù]ÀR0ÿÛGøÃÜTg…­#õ/¦rM·jI°/„Ÿg㨛¼$uSiu:°Õ 7ÒwKiµ!i£ì2ÜÝ<·Èù#h;^\ë ÄÜhÜîn´L?aª!.ÖÅ<^&¬3w ‹:"rÎU†^rì¯è%–&&ÍmhJ¾øÝ¾¼‡Nºñ=\Rün5§^/ƒ:ƒ£Í‹`Ëk4¹ŒÇؾ~¶IÿGüçýÁ÷OÓ8ëøQöÓÕñÚê·‘Ë ^¿b„ù3¬¹E} º’ͶÜós®ýä—Ôå€t¬‹Ðün6ŽÊ_j­0žH÷S/Y7Ê}ôdå»@B/Ÿë>,ãÖÊ»§äðßÎÕ £á¬Â«8¬&t»Ÿy<º}•Õž c½sã;Ò”k^ðõfJ㢆2Qqìé"÷*äº!6÷ês Ч”ŽxÂD7ŒŠ³b #®ÕaØ9¯µº€lêÐëMoKn°öé-ê¼ †Rßp ²Ã÷¡GˆŽQTþnZ¹ »=€1éŸâèÖ?´â1{Š]! ªð”Y!¬ˆÄ¤§Šü´Š-–ëTKÚ¹ŸUÛ?É¿C8•ižDI³k4ÿ?\˜8D&m"ƒ¨¾ca ›¸1@“ÓÑÏÐ ÜÁÁ€^É^tßX•‰c1&z*p×ÊÊ-0Äžôýs·cüÁîsÄF$ˆrl”³¹+.¢Î×e`=£â&x{5.'ÛrÒ¼zì"²Å?¾bmà[ë²A4U¢“­ËÀ“ ßÚsïyõ]æ\Ÿ<º‡ð¦´{r|¹ÁsìQŠ”yš™åv‚.7…‹¯–dH¬i¿<6ﱃîz|{´•`¾âÇw1=A!ï­tü)zH¸™õ’¾n4†bÜ^`,•EŒ>lÕ‡îGGOR& ß=µ˜J¤”¥ÆéŽã’—wLÃ?ƒfyûVwñ50¡Çù~ê¯FºCÁl5 ®7J7•aˆÒü 1ôAÜÃýóMZßÀÊõN—M'F ÛÒF3+¹#{nš¤’ˆ‡ѧb+9Ýûè4‚ÅIÄö´t|³¾’lÆð’Ùâb‡qjÞÍÓ›I‰Ö3¨CJK`F¬g*+´<£I,+¨dÖÖl™—J} °/€jëÜÖL9IRë;$£ ޵Iƒ/ðX+ÿr7×Ù{Ì`铘[ÝÏ„ýÑ?á™P§˜Ïý–Ýb+oIyÈ Ï=ÆúÙërÃupš;N¡'5B½Ÿ j0öå~~ø «ÉèŒÉ†ŽæI;l Ýt a´eÄ`P€iÝ·òžÍj™Œ†ñ€Ã±†JoØÿzX#ñ@¾ÿ–‘"ïRs6’ÑÇ„nXg¼ º¿'¶¬SÛÂø¾nƒŸáD"¢MžôÖh-D{ü8úx! óFFJí û„È"ã)È;\ß{  Y’)P†íþôжÚQ$qŸ<|æçÚØêŽÒ‡hÞÉ^­ T.EûøImÈ:+SL¡ÒkGí‘èC8ªc؉ŠýE[á®±„ôˆ¡ÆlÓ2­{·5hEf×’NP"9?éu–Ztð@g©v=¥Ç¿Ãh‡ds ÍkÓ2È &Ú—¤)îEÁ{Q{í}§1êbø ÄÇk5’5É\r˜J”Ï'!X{´Š–V­k}&·Aǵ“LƒG¯¦0r8mtIÄå?&oÍ e£d3> (µ9i¨¡|K-Í3g/Zúæ jÒma¬Ör£KÖ4­Žä,Ö§çnö¬ˆš°ÊaÓŠ^o‹æÝåêa¬)€÷´7¿E¾ÍX¬z×µ ñúÄM½(û)»^P…¹•n½˜ÿ‹aIÓ¡¼GÅûƒPNCÁ8gX»tc·±qHÑ3¿[ås+†cd›ãïâWsŒ•ä+úÜùSœq…ˆã|ñOùZÙ¤u‹MeK:Ä̆ªã¿2B¤)2›ÍUÎV–§Utl!pŸÒv›o»ÕQÔ+]RGM ‘a°s­~‹°¹ÙT«¡–ç7L•‡=wÿymÔ$[àŽ_±­Ã¹ aášqºšÖÒàè­Öºë’ãú(h?W¡ü‘…<‡ÓQ›–"A¸>?š¼4xÀ.VWZ«²fÖFp1 c }ŸÙ½²fˆÃðÑ¢¢üÓ‰Pª<¾¹Ü·Ó¾@è­Z!Å1A‚¸¨ŠF÷I/ãh°LZYÝVùp&yªN@JѹͼÊè#.ÊT½j“>ZjÜî/™°¹úC­¨ëi“ó£?ŒÂ×™4Ä^0¬•¦ åJUË´áìÕäG ÇBŒ@hÁRÉ œb°³¨’w‘mÜí‹-\ØÛ¥™Í–r<C粟ùÞ¯ÇUH5`1ß ÙF,í©ä3ÑÓä­lÕý`hu·oC) Ø Î¥ †$WëŽZ¡²‰­IRÄ1á "EJB”ŸoŠªù@ìxTÈeRDþvõl$=ÅÝ5‘æÑ 'Íðçblù²*-2î6«_ñ.¢¬Îz ïfL·yt“â™6óX†B—j¿ÂÃëA§Ÿg|©ÑµègCZ‚0LntË*t¨£â€¹=¥í$áì_»ÁÒoa£ë:„²qQÓla¿¢Ýô3("v@]ÂÀ×ðAɺ‹Ù,ÂŽ õ|ì/úÁ2‚/Ã7=1M0*¦u70ê*Œ‚¼‹•9Q}Ø"ÝI{ÿÙ‡šõL l’å&ñp-‚âÀDZ݇Râý9µLÏ¡lœ§x³ÓÉÏ—Þ`±^ÕßføQøÓ§iÐ ™Iögq8ò²†Ô”îZö•ÄøüX)ûrZl§Ë”\Ö—œ]óËð–Ÿí~t×¥ØÅ.ls¸Ä2ì 3DÅÇ®pŠ˜GhY³ ™0c3.°Y¤ïNr Ž•Üá5³'Ø@ËÎèm´\”_MO®l6”ú¢jN,!g§ ×tϰT åpT Ì¡†“E~Á|Æè¯³ô••ž™½n§À­Fµ–ô‰ˆ^•“ácH/梮 ‰í5Ûpaö„@†˜¤ÍP¡êµBCùøTf ‹9½²·£`.Îð\©:ðnº… J WAA…ç‘F$’$AéÄŦBjß±)Nv£[o¯çØeÇHô(?{Fèµ¾H´.ú$uBheÁö„pžâÍCºâ—Œ?eÂz cŸìlÌQ%i`úGVŠ¿BŸlFUÃ3À5¿¾4JÂVNEׄ}^¤t:`nâSh›‘vk»Î§•Œ*% I:yÂè)¯_›7‡Í+àÙB[‹þkۧߣ& :­9û°×­àI¬ºHªA]܉¿\ÙKdÓÇ 6¡îCO‚§€ù*Öï§Ü¡:úM!o_&G£æ©ƒ×0‡›v§ÔÐÑpÿ¡î®D7ÒKí[sžçûwô[GáaI?_²î [-º€.Ä^F-3Й“äL*Ú»‰’%%òäHÚrÄL°ŒV$(ªÝ=FvùÏÜê’ϼ8‚æ¹þ2"Ñž-|C¼CZ=O/• /Åv‘¿&­í>¡ôf¢#Ú‹‰! Þâ97iaµâK¢â±Eùu7~èÖ¥¤3r|ù ßœ»@‰2¸m#6aµ,üö!qá£ïNÑ ¨ºÞbV[­i?Ì òÂ/Ë2ÒCªçøWåMž³± «Ê<%lñ.dzr[V«àvûãÌ&µl›ÙÌ×n…¸æmIhƒÄ„ÊÌ‘9¥KGuÁ˜E´mJ˜Œ¡€}·pÍ+/i›ªÅ<}¾_5„Ý$?Œ~éõÞ䦈Ԙ~Ýæèƒþ"CR’N+ÃAfï STÝH€fyÉ•«„ŸÆƒ®qäÁaÇ›GˆS“Aq™ú )\—6»TÛ2"æŽ} ÊwÞO¾Q°d‚&Ó– øçÌå åo^!âô ÝíR˜n£vÝÜZ;’œ»+U¡1ÆSêX…àµDÈ/m·´¤ã­‰ÿºhpz%˜–q°–¨ôòfUx¹Äý‚í *Ê’ÙÂÞUcsËr2Ï0Yƒ‡_#Æ$²0ißÑNÂpSôMƒ8PŠ>`häÖM)5$äñ_©ÀØX¬^™ k9³6Õ±&`nÒ‘‰ÊË-½…¯r¨¶D].Î0b’NŠfìY1;36ñ³È¡¾ÖåÄYn©b‘¿òбÄC{±ô‡ŠË€šƒ*Mˆúýœ¶³dpÍoldŠÀ6Åc„ìÑH9‡¼å™Ž\ "­«ÝàÙ´¶êþ†î(œXˆÜ¾ÚvÅåÒùÓ¦õŒ¸¡±\À×Ç \„ùiG…q× ƒY‡•nµÂçýw[ ü Ï5ÕF KÙa½Óæê§„qÙå}»;âÄëߺ â.œ>#:Æ¢Ì(\WO¿K%˜æ«‡aLlý}æv´™ö}îrÀ{‘¢“J!«ÿÉŒ6!Mâq?—mÍ<ãÒ»Bè+ݕ̟˜<ä6%؄ᛨÚ.‹,P—°K…á?nO¿PRPÈ  ˆ[{-ü2¤s † xQþY>¢kéâ-"ÆÆÁu6d_–ö ØÙgoîE+Ú?FøÀˆÑ÷Gë7®dêWó‡‹×'æÍØûH«œÈ’ûUðµQ '¿Æòùý)9B×,µEÉ V; ÈC¸¯Ä=É¢#ž jÞ …ŸNffD2¢aöoò‰0ø\¥A=é3‰‡ØiåX¾yMyê+†næ^êýÛÉß~[ó÷x‡óµ ×ÙÜ<ªqðzPâo¸T§›ð{ãeŸiøÓmǤÇV„+·¨p¸G{üè'§ä]«ÜWßQÚ:1kã:A—|ƒ%ôŠ:·ŒPDÿ¸j¼v9èO9$€š<2X7žÿIS^L´¢æÚ+Ï­Ì–¤!§h&L¦ý}ØŸ8)œo°õg m·" ’òéÒ¶=šn2ÍÁjÿ”Ù _Dí',ˆi̸ߢèìl¾¼ÜØ¿b6²ü°ç¿þ±7*j¿>Õ ´b8 ø«S¾Ì¤Ÿ Ð7©&à``Âèà“©Ï!'þ”—b9x‰q(‰[`+ÁmæÌœ¯Øõ“9;h[DªÝ,¡ÜÍÊh»ÐéâV\¤]ƒñËËŠPÄŠuY³£PoüË¥ÜFu)Cï–°éž(/Å·æðãöÏϼ]6"‹É&~6~äL½psQIŸ’g¡#}Ò{ADýîR®Onæe$£>ÈhIU¶ó~$hè:ùÕȨf_ 4Pdw2EiçwTßSg¼nq(¹ÝçœüÆSÓØ(±7BšüU±É|_?æ&b÷;ÑÓÃÎÆz47>Æ}È_Þ_3/÷×;=Ëñ¯\$Â鸯`؉÷ü¨¶ˆ˜J&luT˜?|žÉ«ŠD¡#ÀU$ª%F~¤Qž Lƒ,êÕùL.4P¸¡kð ³S^ê¶/í\È2Ôáö!‰O>‰/‘ŽÑØ…ÊÛÈÀÚxš*¯î³·T4 Õ£dóD¿»£šû¶¤¶’gÑÙÆÆ;>û˜æaÓ¸~EÚ~Å·¹ªqî‘@v‡…Á"Éôe¾5kATOåP=Ì ¤Nõ2øÒóÒËr|uä1åyGê3Ÿ÷¢n©Høö Ñ60Ëão+|~»°lw µ7Ü+öر~²ì¿Ÿrp ¡ãNé%ÑÉTPŒšøœê×DÇÏçí¢P,cÕ ‘Ö´ŒxºÜ¤‚¨gI‰‘Úʺ@—x–÷Ø„‘ïUYá~‰ßœ\Fì!*Æ$•·M°=O«6 ‹E¥z™:½KÚ¡øs]u10ûÑ…{Á§Ô _#¸±Àn¦Ô­¿€švtª}𧝇·œØ…Õ@ÌàLÙƒ…éë%%åbm¶ÝÖé¾dc-zº¦L 9ˆœé|‰Wˆ×˜ ƒ…5cÆX{EžËÀ[I=ÖÓSŠIÙcÑi1ÂO ©)JŠñIíÀ*ôºsLb·‚À«ú13”žÝ'¾ïÉ3ð¤¾NS’WVv)J¸vpÄÀ?á__ï…ÙVómçÂ[u*ðÚºb³ú@xŠŠ_T^&õ4]Éùº8–\ðv~“(¾œ±EÅ –‹#úº£ê\~à.°«ÃÉ­¹ñn+@YÀNà”¦«ùAÈ-ËVŒÇ9‰¥ÞMù±sv*I /¿œeôÓ`u9Çðï̓W Y,‘Ì>j™S#”¤´ØnÙ²ç-y±¶Ä߯J- 玱´^ÛðdqVa[6ZÁ:ì¶ZgÀ¸œYfgÂ|¥=§‹ý–¦îLYÍ×yÿÐ,þ%ÂöƦòúiX³ f;îÎïìÆsoæ\ÑJúW½{×Zô–ßw›éÙXç“}¶Ð©P¹¼>¯Engó‚§è¡3øPZ”f²Ò&1x[:[‹ uŒa&b ¢øÐëu'÷(è±öA'X—ôðVî4_ü‚ ÓÕßé$ტCLV©ü¢áæGç“þWü¦ŸîÒW—xúŒ´ž ‘œ}~ðñ¥s¬õDaMïµÇÜ?<£€˜¿¯ž„È#¶_qt~äò|QUùÛû§¢í»Š`³ØÑ`$É¥Ý ±÷In'Žº OÏtå·?I#ðŠY™DXµÑýÀUÈÙ\XƒOêz•QÞÆ·صîà2xȱkyôé§{×à×x‘9#‰,¤«Hv¿ sIVš¨ráE75›éhéÔœ’‹rîúµ–ZâTÙÔzõå K{Ï´±60‘,È)^ÒÖ0µ«uD’ _”ÉŒÉ)“º¶˜Ä-ž5š(9g|w B§›;ƒ`DÃ唯)Ô³Ú§Lƒw*§Óà£ãAãc?ËÝ“¯eóӬ½h;ƒΦ¼i4ò²®Kúõ/3¸ÈŸI ¹z îJjﻯ*²âàOœûò’¸1PlVˆ‡$\ß_wÄÇ=b1Ôì'ZwÔ·FxcDàÍ¿`LÕN¼„ïJ9&]Ä£7„Û´/\žtÝ"J­Læ$+­<ÝQâß³õ<Õÿáü(®a#ÛéXuU>rºUh ÏâšÅœ¸át_°ç¶Ö3hXd/k¢?šAÚÎ\i¨¶•{Ò™‡¦ì`/›Ìôuœÿ,óηe_ÊÓæ9:ÚÀ!°äa»í“–°Û²Ë^S¢9Y˜o÷ðËBœ¸îØlj×ï+oó?˜6“2}#@T[E÷3Íà4ÄI÷ýDžlؼø‰C:N•úå1¢ê˜ôåÃcðw}–M¯°¯ã¾Ð;Õ"þ†øtM|]Ûr…,XÞïÒf¤¦v¥¼P–ž-d©9€«t&¼gÓ§ó,µM•>sÄÌtdîÒõb ‡1Öî÷ÌÌHÍ£ÄìâîÄnz‚R 1Ç%.çáf-§E7ë¦ Oöï¨yêZéV<¶‘GWCÔµ;»¯I¡ËXŸ 3ùöÕvC¼³Æv´1©¡ „…âNV P"Rgbr4rº¹³|Âcè|y¯-ø_u\wÈgºqÕ W~äùUþc~zù›&o3ŽsÃÙ]Þå¾% ¤hA¿Ã•Iæaº³€6nÔV…õ›ÆüÏv ®Knʃþ"Ínº ÿãPû;ÈoìJiu_]ÔËáðô ‰Yì$NN¬Ùç³Ä?#Ká³u^7Ò{yfˆ+±†ùÜúo~ÿÞ,2ä]?Øg8fqF¼cÃÓoAMΑg`\Ët ä:áråW@á<[Öñ€‡-‘kÄ x½çS±xI¬/; ýà'ÚKKöB…ëXgDÑj`Lb²­?Åüù ׸Ícs­q›_ ]çÊ”ªÿ‰v!Z÷F€3¥SõãhœåMÖõ©ßùçÌ×°Tî½âŒöe9Ú>+³ÃSø¨úê‡Ù¹ 6€,á×µƒ¬ßpVä:^úLż%î)Yá¦% ð.ô’±_õ¢—6>"tÄJ¯UüÁ07d ÁiöI¯.ÈŒÓÛå3j¸¢öˆSÆZÄð¶Èo¡ |‚$š öï<´v] ÑÚ¸ô‘Ýz±âV{´!«…ø}äÖÔ¬–GûÓWΡ“ ˆzzû¸}˜´ßò¬½®š¨Äƒq¶WÈH`ÍíuñÉ LŽ0¬QÓ¥G)Ô;ÙêÈúÌ3ÖgÊh•Ì4„:‡WîH/Æ 'Õ/{•ÎWÈä}Þž»cͦû:lM>ê €·ð~¬\ƒ×ï4.ÌVáŒÌ#I9ü‘{»ÅCê…ø: %ˆyÉû}ËÊŠçiªà—óK,ääM [h¦¶Žíqµ<ô+|D€|wfx$ó¹ñ½À£G`¼¢¶±ŽhÍR„ÞûcÖ0ÙÄÑ:)ünˆM’,!ó3‚2i8uÌæ=ñù,Øxç2a”Nü³_ïÚAÞßjda@jšç)ÅF+æÎ²’9÷tÐ{ÕŒº{¤=õñ ËãrÕ9õ1FÕŽkäm!2TßÅÙt4¨Ê#“~WÖK.DV(û ·šìwÙ]óøüq°–$ãKdáž¾ÖT{šÅe—§#÷™è侘œÊØ»!sE ¡Ë¦H4;¨/VÛ)6*¢{àÂ(2ìØ¬MkQ47J¢$‡Ð"›ªCE²„Š®K1¡0¹B–C…#ˆ”ªOî7ÌòPÒÀ)?ýèRb]Bã)‹{¿\j–ÙÓ<«ñ»ƒeÊœ+ÐÜsà㨎w±„C":WKAÙ û-Ôµöj²vøxú„ïpÛ¢¹ø÷ó¾æEú‡íŸùwôȬ‰Ç—¾¹½{582ÚÎ:0f\¯¢Ø‚­$‡ÜVQEAaÇq¼×›Df7wÙÂFu²“¥i¾ãmzeÃ\ÄŸKt”T5xá/LAßËäüsí­;ðr‚2yªÅÿØjf´¬¼Ì|ùy·ë‰®»Tž}&˜Änp$‡¨a\|œ‰¤\iëïidîØnž‚# ÇõMOd<ö—øG>ç B£Cc©ê“´%»†‡ì`Wàkm¯70Ë> endobj 42 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /EQTJLO+CMTT9 /ItalicAngle 0 /StemV 74 /XHeight 431 /FontBBox [-6 -233 542 698] /Flags 4 /CharSet (/exclam/quotedbl/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/five/seven/nine/colon/semicolon/less/equal/greater/question/A/B/C/D/E/F/G/H/I/J/L/M/N/O/P/R/S/T/U/V/W/X/Y/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/bar) /FontFile 43 0 R >> endobj 2442 0 obj [525 525 0 0 0 0 525 525 525 0 0 525 525 525 525 525 525 525 525 0 525 0 525 0 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 0 525 525 525 525 525 525 525 525 0 0 0 0 0 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 ] endobj 2441 0 obj << /Type /Encoding /Differences [ 0 /.notdef 33/exclam/quotedbl 35/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period/slash/zero/one/two/three 52/.notdef 53/five 54/.notdef 55/seven 56/.notdef 57/nine/colon/semicolon/less/equal/greater/question 64/.notdef 65/A/B/C/D/E/F/G/H/I/J 75/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W/X/Y 90/.notdef 96/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef 124/bar 125/.notdef] >> endobj 35 0 obj << /Length1 1616 /Length2 11583 /Length3 532 /Length 12508 /Filter /FlateDecode >> stream xÚí—UX\Áº¦qwwîî!¸— 5îîš@àî\‚»Cpww÷ ™Þ{Ÿ³“³çræjžé¾é÷¯Zõ~µjUu75…Š:³¸™½ ð½½ 3; »@RQ] ÀΆDM-é4v±²·“2v ØùùÙâ®p;›¸@ÒÞÁÓÉÊÂÒ@'IÿN¼q[ “•©±@ÑØÅh ÃÔØ nojtñdˆÛØÔþq…3@ è trš± ±³̬L]&@ +;$Ö$’µ3·ðþ«læêðßMn@'gp(8$=ÑÌÞÎÆ`4GbU²»€à$ÿ7Býçàï]ml”Œmÿ1ü?ïÒÿÖnlkeãù_=ìm\]€NE{3 “ÝvÕþ+œ"ÐÌÊÕö?[e]Œm¬LÅí,l€f~.ž•­œß[yÍT¬\L-æÆ6ÎÀÖvfÿ|óþƒUGEZNKñ¿VõŸ*ÆVv.ž@ÛŸÞÿdö? ¾GNV=666vpGðû¿?ü‡LÚÎÔÞÌÊüXp󌜌=‘ÀϘ¸Þì+;3 èNÌÊbgï¾¾1¾s{'¤,*;€ÕÜêµ"€ÕÁØ hg4wùSeÿ¯ê¿Öôßen«¥§ƒ%ÐîO‰Àêt²ÿSà°ÚÛÿÍÜ`‹ûŸvîøí]þ]à*þ‡x¬ˆÀ*ù‡À.©?Iÿ›xÁš÷œ_æ•þ'€UöíòlWøC`»âÛ•þØ®üoâÛUþاö‡À>õ?Ä`ÕøC`ûÇ?¶kþ!°]ëíÚl×ù7ñƒíºrþ›Í­À‡è4EZš·7 ±NþVê'?YKïL’Zò³#´>Uåd]kÖ©qBHvŠimõ#éL¾‚ÕÌœ{“ð‡¸Ï ·:kè"æ *}nš:ü…鉾!ÔPö@ºmfäÁù®C#ãÅ2Õ݆[l•Â;oáÙg˜Ò…ù×?ÿØærŠÕ^’Av«B"Póp#vôéTÆ>ß~©p_?íûm‰°gm´ŠšÊÿ%[z.Uø‘ÞÃ|k ‰=D¾¤@ß<‹ønöõÒìOh©›ÇäÒ,›. î“1KÝò8 „å·Á/õD/¬$©í·¤&žtJ÷?’ÝFpÛ>sqù°y©U¡wˆp‹0ìhL„7h»[Sº æ4|×ßz¿èYéuJèó² ÇØuü%#ªìû¶/Ù"Øþ¥yçZ®mÂiãK!„ J ´He”Òu÷ú•@¿ëU]ë{DaA ¬&F‹ß9áUZŒ”lרŽ#ÚÅKµC”¿a:l&I%kG´›Õï—æÈFËô×1uª÷2‚W*’懆Zjx•îÕ¦PÐE0¤œ†£g´ª˜¥‹‘àpd¶Évz;©6ø{¦êô$ÆÔ’;:@ÃÊ>™ûd~ÊNšoKpò3» DŽ5Ó>{eY¤ûË ìð˜ç¿|ÄB³K¹kßU›Ö˜>'·ÿ–â }Ûð­õí5ˆ|&1”4È1NÓ¨ŒÌÛ0tóÑS ây… ¡p´kå*î§ù¢¦õÚß°Æ~Vq¸¡n…páÝQOÝ0DšqDR€€¸DŒÖ;Êfiîîé“zMT›\ÍI)•¼r»Ãßn¼x:ó‘i¨˜ˆ–¸ó2šªOü””~×§Ì+Ë gš#ãö »¶Ðç²Ä¡!a#±mÖqˆ6ÌÒØEäO±D-³%À䡚w€ø<×ä¡"'u£Y(±²é4ýÜef¹õ=4ºWMl•}°{¾ß—ñWÇ‘}Îz#fqä§ðüÚ(qíIܲ[ʇ}î´ê>Ë”±*L‚]Ðï/wJåm =&ß#£$šYP0Öã…ÕLŸ*LýŠu÷3ûÌÆ¿òð\Ó¸;æ“ÁmjVï‰Pž3xh ÒØ±žÿ…U Àxº>-4õà¸"?±åEŸiXüÐàzœ>­ÀseÃàUšw~ÇÏÖ$½gN©ä¿{¯‰®·7/ê—–‹uÖZ„{»©øŠ¦ßò=Ó•¡NvçM«1¼Õ ’D ynú÷´z{V3%ÕÒàõ2¦»Yv0ÖÖl„¯›g¢!Ç?TåõV’ˆ¤ŽÁÒÌ= >ª2ôŒü#°9û¾-^w ûª;}×èñG$¡l7-¿Ê7«ë«ÊeÂNFqBŽÁ5úFîn{`ï Ê—%ãs]£1­^VG}i"ÂG’J~¿±Ø^$ºÅeÞŸÔÌ~ñ SNKd’žúÌèâ°½C…p×&énJì»fuþóhÔ]84†IŸýÓäÆe'mìÚ ¿™}Vñ³´jcBú¥¼7ô[&J[m8{VÃ,w ‚=¡p–ô2Ff}`Ùíó:î©$|Û+t©ôÌþ ¯a¶Ü¦E ¾8œŒ|£{ö|tÉTÛÚÜ/‰ r¶Ä”·ãn„3MÖïÝo¦l°ˆÜÉ“ñIcš%ƒÙ {}’.Y¨ÎÚ¢PîQ‰ç£Ret~˵’uÍr.%y p §û«lR~HäGšKð¹âŠÅ‹É°§I3#Üܧ¬W–$´?ï¶)ùR¶¥ïÀ_Vf…Ä1QÇK!ˆ~ ‡X—ï*W“Ð÷’cWŒPÜ{RÃÛUL›™ÍÁgñ]#ÚÂîçrë €G4æÁ½¡t‘t‡ÎBñŠÇÔô¹9ÌÚߤõ÷¥‚öÉÌZœ‰ºU ‹¿ÿÀY„Õ<´9™ÂÇζ;lÀì2X«*R¹¬"‹1…%†+EwFþaâº-Jô†Æ®WÝí雿}!ÑreËY¥[EO€›D ]jü‰Ñöéy©8~û€º¦Ô×çÊ‘Ä{Cï[¹aÊï'AÇdãÛ7ãã)÷’>/˜î¥<Û3jaïË“r“Gt.”hÌBâE’Ìʯ?΀‘²Î{î´õl{±¬øô©–qyœ°ü÷Ì8>UzÜ4ÀÇÂC“éK/UD°'>‡¶G¨ô/3¿Ìl…ñ¹ê¨.x´Ö÷L?’Öc¨sâKXe÷*O±oøF“«v–·Pš/0 Uõ®CtKO¼'xákrõ ´[îywÂã͈qOXµƒõéþsËzõÌ¡xõQCT?Ð4¥ ÿ¬ ¬U÷d3¼ì*Öx4ë…æìѹ­Ø¦q+7v^I®«ò¤­7dŽd·J„©ÿÍÝHPêàà6iÝ œä÷Ý·©[œMàÕM£«l ?u„;>:‚µŠè„Sí£±X—rù:ÅÿðU¯'Ñ×ÿX)¥ŸV-gfyU»zÁ®H®´«­Í*'ˆæ ¨Îâ]yCÝQ(ÈJ7(h{‡¡Omª‘‚®8=7ü ð)ÂO… /Ý\áÁ·Í{OÉ ?üE=QÐsãz̉ j²ÍßúK"Vª™p¿ÄB(¶¦‘þÊI¡~‘X•zûd '%E¥,°ÁÙ",òI9Ðó€TÂü“œ÷Þ™9ú•»Ç.á{¯å¦¹…c. Då r_wU!Ñ´©ÏÃ÷2žØZ¶— *'æ°Ë¢–€½’ø–'/ª`Çâ&öØœ¶« QÛñ²~wEbjKÿ%rúòmûé¨SÔáͼ×ÁÁs@§ýÚ½¹úvyZš¢öMôíqÐoÖT}ró¦Ø`¼^C"n†m¹òS÷¼6ލÉÌ!Ža‚¯ˆzO¨ùg^ÔS³ÖNåÒïÒe°JÉÉY…?húüœW±ïÚ”H$íƒ ¨…2åÅ©^N’u½®þ.^=¤VD²žž¦€Üþ•Àˤ!Y3Ó#`>/àÇ ð|ðmå[q»>$Ë–µíòuÇ„f®/F„Rºì“#@õ eäËùöO MêBß錆Ïé(Ób‘ìu´$ÍBûÞ—#ÆXÜŸÓ;%hܘ¾ÂIÞI¡›Õ¤d£m*AÈ)Ý#'ß¿¨ TQ=¨^Žé`·}v/"[þ|/ºÆ³;9‘£Ü²XƲlåÍz@ƒØ9ù¶àMnak¶Ä$2š]-Õp – « ¦ŒLcÏøi_éY«h†©%ôlSëUþ|}$?;¨[tS‚BQ²˜xõËEB·ù§7=oé¡4Â/žèq1ÞÂùY¢Eý˜ ­.¥K5Ͷð{_;[¬±™‡÷aÖôäþ¡¸oó?—”[ä ™¼˜A$Z—ê†ú7÷ž8qxÊ 8»F~Lû¾+DÙ1Òú4©)ÊâhŽš¿Ãã/û&]êä6æ‹ìb 8iÌjh¾ö›Í2Qî×ϱ…´übû™jÜd×Pi±™ñ›ˆHüD&„©3®QV‘O“.¸˜>×4¥—ú)Ã]`a]Ïni•Xœ¬ßKOâ7ýÕöóH³‡m‡EÁÓ×èÌÛܸ€:œâPëæRâê¯\|‡òDÔhóëÌ4,ÆR&x yXsŽƒwÊ'°+Œ*˜' ñëìn—*é³Ô»! °b=󶤸zmª§–b°[Ÿ%ž“¢80~yJjd»˜éf¦Ô ø8Þkª;·-–/[„–â˜É'6„$ðÌüÝv4p¢{sØÜÇt”Ý-3/½ *äx¶ŽlBUù©Q1¸ùLs }C7½•nÚ$±+W²C¾¼Êˤ\—Ÿ-@µÜ^±éDGqÏÌǪ§6~aÀÒž)Bù2ä†õà!Ü(v+[#kl¾ íoð>J‚Ö)öPûƒ7AÈ”ž¨t-ì,š!½Gƹ:µQq—º­g,÷xXDÄH$½éžù¡é;õ+ô®!é­ÙžT´vÚúÃÛ]PP¾]ÆN 4ÌÛ—?Â!võ¶mK~ô¸8µùeŸJÂöÃþªx”•ý!W¥zÏÃ<†™©>¥ï”\Î e¶»H[ƒl"ƒ›'àÍÛºŒdÅòòÙ‹@åкü+ˇCŸƒqL¾˜b‡bͽ)<o޶fkõÁ°¾ÒiîÍoóL ³ü-ºõ‹Í¬ á¾úPðZ¦&0Vy¿ r 5+÷°(ô Œ­ýPÉ œÅå+¿ðå\¾Ÿä†Ù!.ºÖ‚=Ã~¾©Ñ¢ß%A«Ø¬“@œ[¢•!‡äu¥…¸ñˆ«3‡mû÷2 átdÏ vÅt`žê‰Žs×.™³.ÚÉ[ ÂÎÇ_‰]=Ê-\e@úNãÎ=¢MîJÙ<;5UXfß×YÑvñ“=ØgÖ²\5 Ÿv ÈÌXy·8 rÑ=#AÃx%ö$—‚ Œôúdü´»yûˆ"iPÍÀñôtzæSDé`{;åûØÀW‘²²ËãÏ0G¯ÏDQ<ùϵ Apûg¾þW žK†y1 ¡-¹¡Î’,ép´ìÑì8-¦¾>‚3Ô¹# ˆÝ¦±‚ó¤ª4\Êv²ú§\“k§ƒks?ܬ¥ŠCÁç_M^Ñ~›t ‹ÔÊð«›Náó©=¼ß=ŒÆùL^!ÅÑ{äÝ6Ê`Qb èà¡Èg]ó™Ãß‹È>ßã¥û!<,,w|-ýÝÕp%í\ØòwzË"Ÿäœ§‡ pøNdDÂYáñ¯ý,3ã»m+Øj"Tv=s-X%¼XÇnEòGµjn_ž9’|}Å&ñ ‘©îï\Ùé&†j‚Ò}wÙ-v%ü%‹ò*ܲ˼F²?.J;F(å½±¶U]iÝãb‡ÎìÖÓ‰cDácxD…£ûofM•ÆTÒñ FDBbžžá\‹‰¿™Oºe Á4?‹ >¶Ïß=Ó 8YîTž ‡k|/-ËŸ­½ r]>=Ó®Tét-8þðô)ŒÂ9£õ…»1º~•ˆséÈVÞ.X{¸j:smŒžÝ­:§êù6ù‹Ï”ÂáV ÕÖC†?EqcA1ñô~­Þ ÚGö.íy VƒÕcôHoèÙyB»-²(I±è3¶÷€ðWúS¥@ ±âш‹*‚õÕ»Œºvb‘#}!åÞ"’±7”1 Jæ6Ó楞þme 7/ xˆâ¥ä'¬2–®)·|s3ØŠœj½ö¼žë{“¾ÈsÉð .—Þz‘ï…d?0$7Nt°{÷ÉÔ*=<úÓX6:>»^›CÜåu/À=Z&š†¢/®G^ÝYÜÃÃÆ fÜK°ý4!FÏ<Ї˜~‚ñÆëØjëv]RGû¾‰ôZû4ÿFÐ%Ú‘D/è”´‚˰SÔ1«›Óü€ðaOµ™;šjWîL$Îi9‹œÖf^+L8÷óñ±EMar‰~{ a±2 Ää‹_HÍÞÔ)Ãû NþÝ5‡nžÓ$XÃFI¿±5û=iR¯÷ðK¥ä RXpU΢9Ò̮R¾½’šÎZ—ZK}ä­È_ó­uúS!àÆ'xQdQ=¢ËéŠÓÄ;ËXÝöTÔ}4cZÅÉOùiªßlÏð 3Olè!¹ˆü H·eú]}ÎÒ1HÈZ0°“(< ñ.Š â,E¸/= [¿È>" çà+AJéÆ++XæTd›ÆÑ8¾Í…}gOwÝüªV~£ LèJ¥– ‚m3ºþá8îÓ– 4CŽ6ñe>ÿoÇòä$ËxÑTœÓœø­ätõMqß§Ã\‡÷%¼Åsœo1l º]€vajNk]Èç|I{‡”ºè4¡úèÓ» öŽ>ìSc:ä#. .”tÆJ¢ûï§êKü§«—ìWÜ=~Š#e?H¬íج}`+3û¥ÚP4Ô7ï1 Œ*ÓHÎV$²4BkTû±Ð±;*%¡ÅC±`y›jâÒù”Ð@b$´`k`mÒ’Eá‰notFÂ~ϼ’+‰:ÚC")Ï>Ã:@E-^ßšTG#óÉJƘ]:?çï®ßEùКÿÖÁ5 ª¡³)]þlÜXþBâNÔeø‹¦RþDQý½ÃÅYIqQXЍ%ŠëCr­$ÍQ!y4µnïgþ^¸þ;«åSÑ©y-NsñbÂù×ÇW×ÃñT4$Ѷ„‹æ!êºÞ,GŠ´òõ„ÊBüLº.´UË/L^çK=ÏtO[zFšÃ:K.ÒeÙ)©Í¿?›éÉöÐÀ©*n*íø4Í¿¦0ô”†Y÷I¤°,°|<·GÎ{çÍQ„7tòÖê&¾f\>%CþQ÷ˆ_MŸ–&Õ¶§Ø VoÖ)ÚFÄ—²äþìݞʲ!Ä<ÍO>ã©Ão…B¼×ŠgRÿqYçKǨÿöšMR?^kîõæåt‡¸÷í"ÜŒ,|1©AÛÄE·†•ëZjf¦½ˆ¥ó«º`Ó¼¨$'‚x›©‹Ž†54Ç%§“IíÓiÇ ‰dÍÌ1Ä0í\ 4¾¢"§®.'´âÿ‚Ú” Îî÷רj‰.(W(Ԧ݅׺šz ŠÈÒÓÙ(Ô;Ê•hpË>Êy•cØA®oî{ÍÎüsùz©1\‘°¨ŸÕ29‹f¢¯§éÈwN¥ä#xU?¾Âz|`~&gPŒ½…^qì÷¤1hDL2»šW”žêd?»Ì¦RÖþ6†mPFâº)6r¶’4|jÛÞŽÔnžJ\©‰Üîµ¾]U¦ â –ûÌ`æK'ßÈ*,:µg†Jú\z{ó®­Xv§“ÌݵÒli‰ùšêKöI )/–»Ï‹Ç¥YM<•I/i ŽTü:oe}¼bæ?%r¬ ¢õ„.º,aý«?ï¢YèýÞéSE< ·¾=9•GŸI$ˆ)PËî»@ŠøkgFî¸äÝ{¹‹‰ !Jmê›íý,Ôgõ¢²frܨ©™Ä•Yý¡C¯ÍÏW/®åÛìøÇ=ʰ~ßáKÆÉ™-²ig·ÆâôÓY*3ØÍ„%˦7ù¦–ÍËFñimªFU|¹ùýŠå9™1!joXÖ¯RŽ%½÷‡j¸~7 /š—Øwù@ߟÐÂQN£D§ Þ_‰ |9ž–jUV¤5Crâ¸pV›ô `Ãy(» áÚCìÔóWP¿ÜL'ÂnòüתŒÎ¹{QË ^.=|[{OB¶sCeWÿ»íŠF „ît<¦ògà59ç…"ãY­”¸ÒÀŒ½KÄIÕþÜj¯ÔÈߌe3ß0ªŸ—_+ ® Ø‹ÔÙ5<“„0ÊïÉž…ëöZ¾IHS'¹%„;íýˆtfê Vk@w…|øøQ8Ue¹;„Ç€Âà0A¡‹ˆ)?Ð6ˆ1’ ]úÚ÷àg"Å5ü[Þ§bvÓI»ä˜ûâC£²Û]èÖµvúQßûéQ¦$×çþ~)zívN1"ÇvfH7÷Þ’òbn¤òþP¿0G Ö3ôJ*¶¶¾¦®ã›±»º#Û ,½¦Œ‚~¸V¨æÈR2…Ê¿ãy.¹è•î $ÛU§Hé›YØçæÜ¾‹–,M„¾“øÅÑD"ç7tŠ~ŽÍ\Oè2»5u‰Ò³*¥tL=²Y²Òµ¦½È>ÕDøõeϨð#¤öûñÏ0 ÔY=€‚)MÁ9‘‘Æ9‡®“ø;îÁ[KüóŸ­¥ÒþgËšÙ|}±#ùä燒ƪ$±éöšg·5†G§ïߣVŸ„l°úžá]…m=_$ Ë3ª-C»}ž¸V b?LÊûJ: <Š7˜»ìnˆÖý¿/ÞEßÑÚ*îú6¢,' «©·¦ºåÂê×¹2²8Ñ;¥Å¿²öº‹Ú§rcû4}¿Ÿ¢ lJ´â˜í¨’8²í›?cålyôHCpùH®à!ÖK¿ûRÛBIxÕh9Õªö'—Ý7Xy¹2¸ïUc×1ˮЬJ š%Ÿ92J,¡ £ä졜€§}!=ùErB*Șª:©3ïÁO4kÏË ñ$=Å{ú”9ˈ2´±æ=<ðqfÓ~¢V¶ìé6,#1ImBÑ”j·FU夑pEùk£Þ0ŒØîÚ^¬  ²Uß‘Ï?ë¡zŠŸ­bÅ÷]”ÛÌÄ–DFÖü]û”$¦ÜºÄHU$N_è8”+¼à@2´Ð0‘+p@… äSÎR2Ñ_:ÜÎmŸÒúøRMs‘÷9Ý‘v®]‘¤:æ‘·V;çDâÖà…[ßæ@ÈÅw0NãPhp3‚½lo¸@I,§;B¡Doµ ×Z?`2 #§co~‚©?û1lÞt«öAÜ£‹„À4^$XIŒÞø£Išûñh)}Æ"ºùF¬i¬YH0McÕGÂÑPéYÒ‰‹%ý42ÅäøI|»‚TÑ!Ö£4bu+ÄX`wHAýà$tâ«Rï-Ï ô“rv²QÅÓצþ–Cˆ­,•i?%ǽ¿<ÏQß¡%5ü§Í› À8Eݘ] ¼†¹QõÄ©ú©1&jMttZò´;J„3¹ ¯‡€ñï DR£¥Lm0nIפ‰ØV-< ½C…êvë·™ÀËS—ìãÞyKx ~ŸÙ¢j" „¦"ʳ5Ó©â @:B¿apŸ$˜r¯[Üç}=+ÀÍŒ 8ôë9b)DADHšTèl¸<hå+X£Šñÿ´&—|5¢ôÎÚKÕÂý(r"×·^„L›€|(v„Ó àü¥AÃ%fzJ§Q+6I;åŽ`?”0=œŽ÷Q®'X x漪11ÓìîÛAGQû‘ÍXBˆÝßöÝ®Ìdá9 ZZ…¨mÌ ïº†Œ2?t© „ã™cÍa2 ÖÜoZ—¡“i¾¡ƒÊè¶$_P—Ú¾GâïN ¤€püoøÂ£¤XO&['ÉÓ©—5Ípܱj沓 ãú¤•­_±¤€JéU¶•jL±>HºÛ9|ôJ‹S»ÝŒnm$V:}‹ûD]áè‰_ñ9¿Vnó°KÃnf¼‘Ñ«ô¥dµ‚ØðÒ禫ø$66ä‘¡Ý~A TÅÒ× aÒ±“2Ü«„¹Q4o9ÑøÑèµ@#þ=]Éjë´ø$ö{]Ïo¼z&‹ —UWÓN¯“p=gáÂYQ®jîõÈ’ë g˜UÞJr¶™\m¶,µ‰ ?G&¸ÒÆ,j•r’”Ò‡&-`ö ‘IwSFÎ!´i«-‹8EOp´¯pó­ (Ñ`œˆ€·UY¡Õ& 4 Æèý6ꂦE9ä·Ò3 ™¹ðŠl1%sì]Ùr“½õ¼‰¶×¹ajGÒÝ«SE4ÓUÙX'Ç~C‚»hÇPuHÑuŸm>ªk¿ÕO¢t~?L"¤¸?7Z¼¥uà‹êЉ°Sižµí3¥h´;V›°E¯-ÌŒ2Kv¼‡/2¹ƒ¢ð&KiС/U‘G’‘á»FUç‹f¬. fᦠs&;¸Èø°-P†Á­_ì9‡|PüQ2¥hÍi ÑÙ³>ÜMÁ Ê¡öÇF†ìW¼Z ¹K«)¬öGízô{¨›w޶eiÄ!åFz›i™:û< ø£LEãö÷"‹Þ$éÉ.£D\c_F—ƒ/ö(Gs‘‚¤ãÚ;»2øÕ¿K!”VÑ×ÈáÙqÌg´Ýƒ 7nlu»¤Ï¨I6­¡]ŸJ-oûùríÖ豉y/ˆ“>;áË›“­}²Ó è·mŽ^^ÿ¥œ ¨Uвz)·‘X-Y±!"ñŸè¾zNªèàëSy }°¼øè0e¨ ¿¶0sÌ©r‹€ìŽÅ“ÔL­Ã1•û£DV÷: ü¿¿3â—¯};“”RNk4ùz¢:3f“$f²×2¥Ø·I~¾ßÖg'­¬Ai,? ôW¾64Hjv¢tÅa/½t¼Ê½]s†ò 8&ÉX쥩űšäž/€8¬uVûµÖ3~ÄÉ{ämô`ûe/Ýœqû.fô°ˆp‚ÃjcÃKy½VÿÒh.%Om-–Êü‚^€hüª}füô£êý\,b[4 nQso®Æž71é'–l…ß_)?9h‹Ýð³òP©¢~æö›y•ÀÌ¿}z°ÈLAïV¨9ÁþÄ~kõ)¿š—¯*T5ÅeÄËbÉ]לS_§ç³ö+¾[¹Âo[nvÂgÊ~6Y»Š0#‚R(ÉÝZj¤|íÙ/ä&3Ô%íGÂVßZ‰ (a›¬¯4&…H>ð/H¢®àº6eš#ýºBÍ0é\×ABë´_]ÙF0ÚK“i½³ÂÔ=¥m¥›TZuª#æãel* ºV!Xô Ö2& 9i}Á² Ê ˆ Ìeó­qÖ)wŒ/ƒ*½ôÝø~t÷XQMÖáeEüt[FøQ9̲Î!>º¡Ya4ÏDyjÂbîPüÕÙ‚+A€ ›’ºY+ˆE¬nd 4ÙÁñ¬,`œé~t£‚=슣Ê7Sa‘ºåü0š?‚ˆ™¹éÌòûƒRψ³¶Ëíæ¡H™_Ü1QÇS{M½Ÿ­5ŠÃê‡je7F hÑÂvØÀâ#™ïs2h "#ˆ¦£+GÙNHÝ@tÇ帘 Á¡«öK(Ú“”<ˆ»€Š•˜a²À²e?Ù^ææºÖ§¥ÂKé¥yÇJÁI1Çß9?•zAj<™3»>¤ž÷¯KXb-©vCû­æeò‰"ob–ØM&åáôM¹/ß§ÂèÖ 3œÝ´«Ñó|”'huRöMÝ íÙ/hni î#¢AùiM¢:Œ¼›æ ÛÑ";7vä«;&GIDVX¬œÏ€~…ýè—–Y×rvé¸4*9>KE?“˜‡‡ÇÃTÀ“«[; ŒyàtÔŽ Žë§(l¨lå@WU…·JçÞ~*×Ûû4ˆó–*·ç¸1;>2ü1$ž‰ÈA!YØnÙŠpØÝïŒ:‹ßFWôJwéÞ‹½ ¹5fτïnU_ÎDwàÊNXÎ*OÚÚyÈ[¼GûÖ”+ ’m ¥ŽGjx/"ÙœøÅy\j¸‘Á¡ôªCûÛd„ÚKê=^»møÓ7ƒÕ+-Ø ¤ï[jº‹ \‚êâêQ•TØw0XˆØ4°6²èYèß§VÒ Hùñëg, —R˜·fÆÇkp¦šË8Éúƒý´#¤zû™‚{„lG‚Ã"õ™AÜ;Õ|µž…[‰3¤ΟlèÈÙ}NÛ„·"·0# N˜EN>òÙÝòÓß²G§HŽhóBÈ1þ±µ¡ 81ò¸¢=†ÒŽ­S¯½–Á-\äØéÊÇéMt×Ö7°õaõŽÔ.-M!%ÿTžë^‰[ûJq9°‚sðZ:zp!9f"«õØ®çôläqç°ž@öNÕô‘‚!‚ZX{ótÒ!†(¡Ð#ÂÚ¥&ôM+'j÷bر r%ÞÝ éË–3Tʶ›É30žÖæ2_8±‡ý}´½5 äÃxgj#…fhêV3ZJûqEc/Ú]àÊ´ˆþöáó2šš!§À¬9ÂMÊìdã–‘D…»3n°SÀf¬`íq½çb¹eè­ã¤ 3xÒ¯jI§ÐUKãkœ€=ƒB};Öé‘›~~as&[–yÕé¾eËøŽQ€aâíÁU‘j³l6å燉:õ•Î8®¶Ã'<˜nH^èBõݶ"$_"-[dõj Ò÷שԊ¢:Ù”Á¤pmVýÊQ{¬ç*ñ¢ožgc¼å:Iš²Î>Rξ÷ ŽcáE"¿R-¨ v.Ø_¨sX†ˆ yNhç0ˆŸüªûr JlÂ3TÀüŽéxT&…Ø0eeNTñ¨”vèÈ‚¯Ïc (¥sø+|ezéd°nQVj¯áŒ× ˆE{—–f0¯·5 BZ1… ¿QÞxq-½÷gÝÔöÝ-k0U^“˜Wí´Ñ˜¶T Û‘'"Ý!»brlhL?îïœß›1®Õþì¤aAXýuÎU|÷:7„qÒdÇÝ,È8&ïÅþTšøé™ò⛲±ctÑKÆQæu$‚ÇM{ý°”EQr-qœ-—YdŠþBH¯ÃsÒÞ:pÔËläTa-©ws7_^E¹U[j6X¯®Q/¦%¿K"ôU äáM´±ÙFt†Røïkc8¿!‚zâçCœrEx´sÕÐ"†ýtë^$©Z7ÑøGËÙô‚tà¯T~Z\æ|*]û¦%W9üMØ“öµ6î‘·3ª#ÊNÚOœ˜~«Üó0ÔfÌß2šMª3#8RŠ‹{s¤™KÑxŒíõÍ-Ôôâ—K>º å#“É?!‰‘ËãàÖTªlåçTF¥˜¼·c»z5x_±§•lB„¤ö,y7ˆ]J_úùã5S9„æ4» Ûÿá éÿðÿĦ6@c'{[c'ÒÿõmýN endstream endobj 36 0 obj << /Type /Font /Subtype /Type1 /Encoding 2443 0 R /FirstChar 12 /LastChar 121 /Widths 2444 0 R /BaseFont /YPEJWS+CMSL10 /FontDescriptor 34 0 R >> endobj 34 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /YPEJWS+CMSL10 /ItalicAngle -9.46 /StemV 79 /XHeight 431 /FontBBox [-62 -250 1123 750] /Flags 4 /CharSet (/fi/parenleft/parenright/hyphen/zero/one/two/four/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y) /FontFile 35 0 R >> endobj 2444 0 obj [556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 389 389 0 0 0 333 0 0 500 500 500 0 500 0 0 0 0 0 0 0 0 0 0 0 0 750 708 722 764 681 653 785 750 361 0 778 625 917 750 778 681 0 736 556 722 750 750 1028 750 750 611 278 0 278 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 0 392 394 389 556 528 722 528 528 ] endobj 2443 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 40/parenleft/parenright 42/.notdef 45/hyphen 46/.notdef 48/zero/one/two 51/.notdef 52/four 53/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 75/K/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W/X/Y/Z/bracketleft 92/.notdef 93/bracketright 94/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y 122/.notdef] >> endobj 25 0 obj << /Length1 2310 /Length2 15237 /Length3 532 /Length 16487 /Filter /FlateDecode >> stream xÚí·UXœÍ¶p‹»KÞÜÝ%¸Kp÷ÆÝÝ=hpw÷à.Á=ÜÝ݃ýý­½÷JÖþ/Ϲ:Ï.z̪·Þ1k–4ä$ŠÊôB&vF@q;[gzff€ˆœŠ 3€™‰Iœ\Ähèlag+jè ä0ss³„ì,f&6Ð9@ÄÎÞÃÑÂÌÜ@%BýO'N€ ÐÑÂØÐ gèl´alh P¶3¶:{0„¬­Jÿ<áP:]& ÌÌ cg€ÐÌÂñ')[S;ç…M\ìÿ§Éèè’PýK“’4±³µö˜Måí@o‚\þßÐú߃‹»X[ËÚü3ü¿fêÿj7´±°öøïv6ö.Î@G€œ ÐÑöwUþ—œÐÄÂÅæ·J9Z[ ÙšYLÿ²p·pš(Z8›œ]€ÿ mMþ·hæþeÀ(/"¥ª¢HûßEýW£¢¡…­³Š‡ý¿Gý§÷¿˜ùƒ¦ÇÑ ͚_fPGÐïÿ|Òý_/³5¶3±°5°°s  =@ËDì/f€…­ Ðt 32ØÚ9ƒ€æÄ`jçˆðOEYYŒ fkC›âÿb0:¸Ø9MŒ¬ÿÙŒ¶.6FÿTÞÌöO˜Àhbgmmèø'Ä `´:mÿĸŒ†6 ¨“!h¶þåþïý×*ùŸ0hCG ­5Ðô¯(óGÿWgÐÈNÿ ádõ'JÊÞÚÅéO”’±áŸ(s{sàŸ\Ø8þ%na÷Ç ”‹“µ¡“ùŸ(O £ÝŸ( ;[à¿™dïìö§äílîü«HÙÔÎåÏŒ±ƒtM-\ÿêÒuÕÿß ’uºþå ª5#ð?&‚¤jkñ·×?9[Ûýõ÷?ÃØXüg”$l tú3Y c ƒ‹áŸâs€ŒÍþ9‰€¤9Xÿ)ÐéŸÓéO$nøÇ‰ä-ô‡@ÎÂä+ò‡@²¢$*öoâ Šÿ!Ä™Iþ!“ÔÉHÿ!‹Ì¹Èþ!‹Ü¹Èÿ!‹Â¿‰ 䢸‡@._þÈEé\”ÿÈEå\TÿÈEí\ÔÿÈEã\4ÿMÜ ­?r1r44¶:ÿǾÝŒF ð.cnÖ÷þÏýÄýOŒ-,Œ-]þ Ü eÐaâèdlçøg‘qsü÷þÏw‚rø³Õ¸A9ý!PÆÿ&f&P&á?kï/üg«ü… k³¿äjþ‚-þBšå_r²ú ARÖ!ÈêO²Ì ÃšÑö/YÙý… +û¿ðŸð‚¬ÿÂöî_²rþ AV.!ÈÊõ/Y¹ýA•û_²òø AVžáWø?+ÃÌÂöÏrøË…ý¿ûýç:`}Åø¯…àlamò_%ù¿o9aa;w/z6= è~àdeí&Ÿÿèfìâ:³ÿõ tSþ›Z€®U ÐhŒ°4ogÌl™ÒZæ+V0]M.lÖ'_ß3Û‰´n]<*ã@³þ]ãwE:&Ê>ô>±Û ¾Sd‡÷— ñ‹‡¸Ô¹·}WƒýtÏV|ët9={Ò‡ Ôö¦_·§ìà 3ëce‰š…Y—ƒ'yŠT¢*°«$`½Ú® ½ÁœâéÖªa!ß)XI”ÐRÊÂÙÂÖÜпA­MùZ†ÁµÐ®\Ùu¸`ü.€ËMxÓ{2†ùÈ"œ½Øæ?r™1âÕ9&+Ê¿õT’SYèJuFW\Z¤#윅4DŽ‘’fc±¦ð,±;I//{bõ¢ÿ’ž(ÐVß›n|A”üØe!]‰y™›EÁ~jcR(õàfØìèÙ*&r®Ï{ááÇø¸@&æ?TŽ<¨‹ëL\ôfÕm@Ž0N)&Ó —2*—Td꘦t&£ç±j઀­z™ý;Ç5äúÂwXËM)¬`±./§Žq0Í*‰§œoO[¢BçCâÇ4EµØ:È«š\Ö@Ëz°Dš(ÍåÀ4k)}ePP;|ÙQÈI»}p,UÞæR}>°¶µØm.ÉÇOB‰á_ÑJ¨2ìÏÂPá¸EŽàŠ8¼ìh}± 0ÖÖöC”t¡ƒøÖ¹iÞOC§iÀ…A9Ùu9"ŠÜö¼Ô›óݧ>­³z ¬IäÒðvÂ÷Bô!"¥§¼)–àëï™ÿ±¹"u•ñs`BÒRq9qÈÇ(ë“êÎ5áŒÊ¶7X¿°c$bõÈì•çÑ$ 2Ç¥£d=.ç뎳²’Á©ˆ2Ë3U]þ{ÉòÓÖNM˳(tІ;Î~{[E?㦩®1îáîÖžÖ6ˆÜVƒ9OëOêÙ¡7$ÂåV~®Zu}NÝ€ÊO¿ÿͳ#j€ŒP¡\ˆ¼pÚVÐF𥆮¤ }KR Îï§ ý}¬j#­\‰$$*MÉž}ýœµ|‡W†ÓsO »‘ò'&œ¯éV½q-Ø©‘vû¿_=û¸aiÑa îà¹ðª2ITFû½~¦M 7LëÞ¶Y~¡étáÞŽNðB {÷(x”¥>})]mé|<ÎöDñžGìcŠJ®?ŒJ™~§z—”·âÏ:°ìr/>ÏÜô?Ú:"àÃj:ÎÚê¨~`ܶšä y«£—ÕŸù<õö+mhô£€ú©ÆÔó5¡È%´Ëà&» †«Àªér¬þEÓtœžc2˜š¼¤'$¹Un·ìS·½8ìoóç¸jÜÆ¤:0}W,À“Æâ©æ^Ÿl7 2zR´£ç½QµSŠÀÜܵ»d)F’K*"ÌvÍšêðFhÆ‚{S]É!^­¼–OƒƒÍâõ…‘Ë9œ+ÖT…êËvûéÂáÒê"{ö·,=!ËOØAÞÃj“NŒ.•êKü0íæm¿Ðþ²^XaŠ/lŽ4pÀ¨£“ÃÁ§kþŠB Z»„X"¸ÃàgŒ?ÚÙ>ø:l´(Ù6íTøÒx>ò®ÒXóIvœÏ™{¦Có?<¥¢›ä lÀd¤ú…ãÅ‘,ÑÕÖÖ±ï¤QSyc»¦oç•5wðòõÎ6g!ù€Œ<¹:¤Å”ÅÔ•|ÇaÛV Ùïe–Õ+aƺé3÷Ä»þÜ_®r¦Çò,sG6",¬_økðËà[#B]Ô6¬À‹)C_蘋jAƒ†CàÛ6Lâ×(‘œS=ù±lôUÙWô¸¸]8cOð|ô`¡†'qÏÔv|ÈvFÝþæŸ?u>Fg‡„Ÿ6]zÀ@(øÞñ0vôäÝöPêÂ~#G™¼ˆªÓ†Ê_¬];üØ¿Íÿ®l'DGH5@Ÿwêge>³/ =BßxDrVöX@9‚Õt&c ¦2Οr_“ì@,!æÅ ì§ï½ãn†Ë†Ö];:°óíÏ4,În)χÖÞ ´ ̆ƺG}iÂË„JÒÞ´uù®Ðì§H˜Æ¹J&ã,np$ÆÍDe€qV|bßÓÙ _Î+«Ž]8Éó’i‘©2lbÚ†Ê8ÒMÜì´A/} môƒ(hWS± ÄmÓú#*5›`|BÅ…ï ¥©Gã¨*ÃãóX/žùqÍ¿/…¿iÖÓ ²“q˜Ãée"C4NLu™få~=Áª»zˆ–êøhóŠDw$-ó9¼d"ûºÕ+A¹P™ i¢86‡ÝéŽô³‚±0ÆÛ/c±äR7Éך„%Ú+±‚÷'ð |ð!¾ëlaw:¾âoÔÆøÔôxÅÀ1Š8Ë_ Å$òA€m«I¢H Óšuõ¦ôCC÷£°l]vñóûŒ•[D€Þ欺]#?2 ø¯~>T³î©25©Wv®J,I¦¸=”3ãµx#îÚ¶ÎUÂ?¼‹!Kùù°ÿI1Õö–KÏ×ЋhÕnìc.;Mæ êxNcvµG¼RkFâ5á.©+›I©Ï{wonïÔ’cãRòüß4b)F>\°Å§‘Mv•1kðéÆc’àÿ²OUz£Ø.¼ød¤lsììâúÍh¶ïdw¯UadÏO½Íû™ºJ_p`L=@(5m}±Á‰KÉ?·Þ…’pDJu©f‡ _â bžø(Ýx¯ýuÒõ"wùÓú>Þy²º+õ2ûõÇÏ€¬½É2’ÔÛ³iAœ4½ŽÒâúaÛwÛ®¼4BÞ¾ Ö fÈ[£‰2ÚQìY©ú«ƒ¹M5SKºVÎæ†$Ç<†4e‘XVGG°‘…R»§¤~•‹üé¢&(¢™ÀûÁÉnõ€¢ôþõ2[Úq•f—àͯvµ üÚÕxϤ(ŸFžrPcމŸºG漈ƒ[ñøÖµ±£A›–#ëËD:é¯ñË•mµ)¥PãD¸´ƒ2`í׸6ẬÚ`Iý®â¤)³•¼Ûpu£à*S¤¬’-^74ùÉÖ€h¯qš\¯Œ Ñp²…õ4óÁ;/ë$·®nßÕðsdJ x´ä¾œâîÛ¤£WÕÃlûiæÁÅêÅucÜ×))ï¥]gIež@x»²­kâ(w$)œuù¡Ì'-á zì9üÎÖ #…Lö 8çÈô$­†“o~-qn_~‹.C(”XÃÈèÂdP&kB@\Ñ¿ÚV<®+ÆÜà°] Ýמœ&äÑ/~ṳ̈ì!q^åëi5K(ÙVQ¸Q‡H>/B}Œ ïHçû¢ËÚ÷j͘t aÌAã{00H‡½²ÿŽn…,STŒd¸ \¦K†*ÐS'x‹ÅêK ÇE·ˆÚ:¬b#€ýˆFØ6—[GR©Ša#GNd§Ý¥Qüò[ïÁÄË[ß%$óÒt{Ñ‚QXÿ¨}8+½öxg÷ ¢'ìª)naWâ`Z->”®¿àÀŽ¡IôO^«‰¤`ybÿш‡’'I5¦âOkzàøB9åß¿ÈÕtòçŸ 5ëaé…™å ˜‹TJ½ ½Øß€-Ha H1\Á¢”ÃÛRñ. ᚬçAÆa¹}¼ŠÏ- ýQʰ~ aæJ;F9g„§jtNHÚå®Ð€x<)éo;Gî =—ů4Ñp2ÞË7²š±˜þe*´éǃE¿}<ãk‰NZß…êB¸³jPÊȧLã•|XXƒc£â28f$G=rHpU¥ÇF;ŸˆG-Mì‚°§o=ö|3ZÐÄÞù'¤]‰’¬j  ;örgP Än!a›JÙR„ÌôiX¯5šºý<›qžˬ‘—­lå6?˜~>ðæè§‡ˆøœí„Té!i‚ÒÙ„¶XK‹žb ™4ׯç#$ÂŒ¥‚®Ç¿æƒéö—íñçý €:-ëýkmÒÂ<=F|Ƨ‡±+¬¢­w>f¤V‰V¬Çl°mF=q¬IRc4&»‹B›‘Êy‰(KìWSóYv£8FÌ` ×í<ýV“ç<«QLòävˆUı₨T½¹[kŸÚ+$ˆ¦ËpÂÙy(;¿Ïnø©x2|&œãòsÖ¹¢Òªüµd* €ok=`8æý„øí%KÍ6Jؘ*!I ÈIE,@ósáøM°ª[o­àóŒø„úQçõl¢„—PCAdÒúEü¼ ÎË6 ­#Ž¿˜ Ö'(ï*ЇºŒÑÍÀEbžiÓLñ‰òX³œ»÷=×w¹“Y‚4ú12ê²ÑÕ­+Ž[¾½ëEú½ MA’y϶W+èënn‚Ø+Ís¼bUsõLõ¡¬²Ëµ)Úì]Á€cj¾åÎ×ú÷”8‰¤„@àrî ,^ëểbä½R¾ð†øf*tß]çÅBw!=/+;+-g*? ¯Ïz1‰Cho<á8ê¾p’kh _Á¦çü±dRy•®Î¢{•›]kŠÞªïN‚|3çy, oïI/¡¿×9¦%s Êu¡ÇRFjK]+ë%˳Jëñ³ÎÛÜ"¦d´%9 4¤L7í…*ZTîü{bG5> –Ÿ—‘(Æ;¢hw™Øm徜*‹•€½¯¯{]š›ÀöÙ,³vŒæò# êɼzù/sìÝi³@^™o¼Âb#‰0”âÞúé›Ç{|ÍãèÁ”´ãzø!’Rò®Ï£î%HBÞ”(M»ìÅ%:ÒÂu¸ò‚©è%KJçÚø©G)ë~Îõ‹ÚâÚFˆ¸ì¾Ò>Õ)?ZÔàYµñ…ŠXž•‡Ò?› G¿ì'ü¶]3ciz°a~,~§\ Aþ9ÙÚ÷MÃ逇ŸóÊ“uàBW^0H@M Ånî+ב˔ªhÞN"$Ò’q…º1V{ëG?猛žKçW~¾ZÝ–!ç†RêƒöNð㓘Z2x5TÚÅØÀ†–K¼9u™INË€ iOJ•’Ôg#Á·9ƒÙÀIS|™žù¯*Òô‚Ò—½Å{â"¬Ô7­ùû4\„ñËËÀ½%§}wÀ`ÍF+†¥¬¬÷$ØqŠt6oÉ6µîQƈ»HFèH÷ß9¨P_¡šý˜ E&ߺÔɘ?.5Ñ1üÀ(¬îüz¾.×Íׯ¨.óTeÚÀ‡k¨i˜‹lºïcÐ'Y^;û¤Ð9Ì:G£½[4tiqÄÖÑš-)TßáòFiG1XЇ3~x¼0·«Î/×÷²—èfOsœdEƒÜàÐ÷9ÿê3£åªá…f:w,mý“TeIPÆ~ª.Šë—<øSB;7*Y­¶$öœ1Ø%’¹ùu<4‡l@ž”´-?e·k7°sïïÊUß9ñIC%^ÑW¹n_–´Æ“çܺª¬²¤³Ì'ò¼í†Ó±S•²´"Y–_çöÃçªÏºbÀ“6Öô¦}ÐWU0ñ}I“"4'Ø÷¨ŸV’¼™« ¯5Ї6[«Æ^ªñ[ä€C'´;¤ÛbwHGóèûsd dò`œÁXÙŸV·Œ¤˜æxœ¡a$\f¦ MgÞì8µÞÁ½½œ.™ø G^áZ‰„ÄÄ''ÇÝà‚Ã~óË/3ø;Ïý@éN¶Îù|kï›Iê–1¤¾¢xÔ6ê¿YÅ’Q±YÞ>¡C yˆt§gü¨ õL6÷ø¤9Nû²ZÿËãU⩤bçíti‰ÖT‹‡Z!“@°ˆ³u:ô>²úöA öY~òÕõ¨ì)®)ÇS[ÕÔýû3aóöÊœ´òVý€ú2õê‚z>íÑÚõ®F–\B & l¬ã÷¹* $ç@” /:0ý¦&QwºöôòéEy¿ÖÖ\ÈïGý]@*e¯¸œ¢¸ëjï\®Áxú¹DÕ!«ß¬ˆsþø­2TO·à„Cˆ³Ä§y±Ü¢“G)GKÁºI}ÑÓô1(ÈgÈÄ5P:VùŠ¡1þNàþ`禋÷ÝV¨Zï¤/Ðõ{¯:w£ûi«¾? @ƒcìì§^ËÇÍô0ñÇìùe ¿qº[æ«iwÙaš>HŠ|ï¤~êä}JøÈÕiO{dû¥ ïH€ÅîJÒëÌš^xIŽþ"U[Õ'ÁÀG·È~3x_0¹‰‘ƒ•M¡qýFKòÖ¼·¬4 ‡ã2©ð‹åU\‰7¹š‘ä "=?T2õ`87Ýp1m‡sb8¾¾É±%jè*UTàMJ¯Ž.ÄòÎsK옧¬½«£8{Þ¥o!¥Y0ŸIlªy¢ÖdÒøÁ0@¹àÈC/©üfxÎÇÜâ+áϹ7Ü”—Ã0›Šñ`´ì³¿äãj^{ŽW½òÆ\õ}>›*ÏY4½!QhŽŠ~5/l ˆ]ÊZ¶ßލ5L6c(/æV^• {Ãï!ŸúU=“Ž»Y û”õøkÎîR²ˆGK —Ü’ûãYfXq@9 p[¾Éà¤9g[®{TQ¢„¥±TÁœ›Ag¡&r×ö+£W†QVªÌõ$täÉ]‘‘¾Àò 炜W™ÂDÑà¨Ä1± ÉlÊ£ÂveöÂâ%o£ÕwÝšƒýøUF?áZ³RtâÖ¡n´Æ˜úзÑ@n7iËíÒÇB4~¤rÒ3ô}î㈬áf=;ýŒv'ÊœÈ05Ô.ÁlhÃè :hês‚°±É{Žö4‡ˆà× ¼æÇÇèŽf‡å³Œ¬°ýu`RÒ+ |Ó­JKÇËć([Û2,±›aAo¦Ãy÷ØÇSåkZêzsÝá¦|/ g׌µh“ÂßÜÇ'0ë3=¯1õ·Öß~ÌPêý ¬æB¾[ôT…¨ á°»¯ºí|Q¾úŠ_æ=n®Þ.äwÑ*ôùeÛ‰[ªR€¼«ifo‘YTœ%h,n µ¯°œä«à¬U•‡½I[¨‚Ó“ùCæü˵â ‚v´2•€ø~M{Aôé‰a©ÓƒíWÀ ʧ¨ÃÄc½’¡é*6ư ÂÎZìК$ºÊäbJ+š7 ŠÚy ýv¿5‰ÙÚê©í tñ¯Ï(Ê}ObÈ¿dÙj>~ ø^«Ð©ßÿÞ}_]jª°øàšÿƒª„é@ìàñ—QÄð˜ÂD§0ç¨]Ï\§f¸ÓÖ4¬–{’³·¤¢©ÅÀsLþY%~E7 õ˜÷é©M,DršWC…WÒ÷å(DúŸò.¶ÕÜãX’?|Y(âX#«y„àGØÝž¼†ÃÝøÈÖÂÃÌê’©ÒEºïâ<[ûkØO|1u9&u0]sÒñl’û«É®Ê-æs2lµÛvìmŸ5qf`·{HM¿ö©Î@mxíî¾2=îÅ+ &YBÜ º¯>"Aä7ÐæPÌ(œÕ$$T NÓÒÒÕ¢ðeɳy=?4 )\ÇáÝ^…N3ŠÖÎÞñØé7ÀXcz‡†U®±<ÀPsš¾C‹¸]Z)„H¡Â[a’yÚ!ù¼êÝ&"Œa}ó:Õ©õäæë¶ë#Hìvãu©¨ÊéZý ß–‡Ž5JuÛÆ'©ÒžA{Œ«ì¯±ÞfM:†ÓìnÍ6{gÑ@oßÃŒ|Wd°0JQay‰æ4‘Kç†@©ï³¾8@oÆ„[)-§i—ø\Ž%™Ûå¤C—‡Ë‹È™TßPaÁ§r޼9 ]a%±@° ÐP{÷û½R²äŽ¡O¢²g¼!ëRÉ÷@¸küÕáÌ·ohÑðcR‚s°&µà þs䀷æGu†ê…Øî\ï(¼I¦ â¦~·Âf’•SÂÃ{ôºa©Ë\â„þ­;=„keW²¾|ãóœl8à›ºn½MU¤0îÚëáÆNÔp¦bÔ#Ó¦ÞN*Îj`;Åh÷ŽÊ5>„Ïwš2´Š¸¢0ÌäDoØÖ0¼b_Ý2øäR±~šƒîá´9ýYó d8Oisvwgù:ÇJÿýÒ±B³øÎC†`…‡›E:ÛnºlºÅâµ% #ã&“|ì`]d` öX`]Ŧ$:`ªœ×Ü‹å|4ÖhœÅ‡ÐkÚá)Q«¥U9ýðp çµ(qý-½½­ n!ÿ³cáîiîÍql…k8weƒ£'dž㺺èÇ:¾êÚ´£gq›3©ŒðDz;GH%ÒŽ¸ýö-Û_Ïô]/&œxv{) ¶Æ¸Ë×5q02ždVèRÜÁû¼Áküš düGPg€Þ$ZUMA"óU1€ jð3oñ+ÎUÅ:¥|‡¯Ý1ÝþF¶Y£„¿»ñîc¢µÊ°—Ÿì‰©bCå¢â\³3Mëß=¬­ð$zåˆx ¤BGpÔ£%£5B|ïcAqaþª¬‹+ç*‹0T@Ú¸†,x2àˆ‹j÷Ä(ùî;‰eF俍3ˆ;Ót7ž5e›Áüøð$¤Pw@ÛdÈ€éb¢ÓŸÇâ®0Fx«Z%óâ¶›÷˜€“£{úäšÆ¸/c|Í yà‚-Æ_Vëùýê²n2ÀÖ–P~z¡PìAÈõœqT6juM²vÇ»pT¨ˆ³„[hõ-Œ0՞ϔô/ÍkRÁMÌò“PŒUsÏÓï$¿ÃHѬÎO ˜7™ÏôÒÆé­‰ð«6ËÆxÊS±ú†š›¼cÙ摤)èÔ¯Ø1‘?‘¹«ø,#Å3¾{¶ýƒO#z%Å æEF ÎYmÉXØ”2ן”ÀŽôhÊê$—‘|¨øœ³/²Æ› ÙÙ¿^øV=dÊo—•¨2ïb~4²s±¨¦;)°Å.ûñ_ps;ÆM©”gRx^8™¥šÑ½:R`8Xpqã¡)7SÕu•-CUiKô3xE*?EÞxܰ ¢þâšÁnÄ)ΪÕ§l4›û"ŠëŒŠ8fùÈ2%h„@Äð=tW=±òú cø„ýoQåê/Ð"Ï F£-Ò¼ Ûwáø€Æîƒß½ú°ZÁ°ÈÆYT%N±3~¯=dV<ÕqX<å뻟 BœYF›·6׉mÇ ýP $·‰Šã)Däö\×HÓ¬2Åðµa[?5¦«är[ÑîÅ¢âýüpê:‚ÜëuçyÈP¡=0s“ogþÁ“4P¦³ú*œô3ôî>$»_ÈD%±_~ì î þ˜f±Æ½4ÌQ€Òœ?—6}yœå*×g2ÏrŒžDý¬Îé”Â6}Ú½û^{Yr»u·uS‡òZ0ÀYóÒ.Ìd8@%$ß×ÈÐpçý\¹£ÄVABžT}}âù[b‹ó ŬлçÁkÄçëúo]¥7Á©²æå!5Yç4Ì[ȈݡÛU…-E­á;(·¥.ÒZ†íFY’eÏÛšo_±èTãW¯Dm=”›Ö;“N}°¥:33qU„ý³¹ú{;íaáÎÍ›ãäxߟҾ_Êç Ü N¢Ï¿¯K8Ðî‹R,éQ¬ãbQ¹†~µ .}ôǰàaÛv†û¸.X"³ÿÒÄC‹ÿfR¼ í¬qǰ®[rµ§µJXx4¿¢ì·`ÙHÀ=ŽÁ¿¯¬ÐÄGTô¨·Òçd‘ÝþÛ'A PİoâòBsÄÅ!(h!õ2>-Ûh fsEïcÅ< å­Í};|Ur óËrʳ+þ"œ…q`˜Í-I0Óp´Â*ò¶?BÔÇC?æ˜i¾Ö§Ù–IBƒÐâ[vn­-š¸³³§ˆ)ç46[©ÿAj;/ýè°Ó0çw˜þz¬dÔBêê ’±2=2ž÷°é ÓïM‡>ˆspܘ€ÑKssî¾_ gêù]Ùá,¡›f]4R³:(î [4PìÊØÏˆâ'üÏQhDkÁÎߌ=˜"Lß\ïÝsHÆ6‚òýçß¾®˜f32y艞-&?ÜìK´Ùåñj(“º#TMëÓmq|ÐuÛRR˜QŽ0ìrV‡­E ƒHßC«©!ÌI¤{r<¸t|[S¦È›’>ëA8ýd½ºûø(’ܼ—1¦÷>æäWÔf˜ÓðëZfóBïÐÄÁ)ÑCJ;Ÿµ¤N¼æ4×TÌÍCot æ}+Ë“« •ZHÈò·a˜Æé^™}m´y@ä÷+Í=ÊoÉ&Y‘rú¹5ä*ì*pCSJÞWÍ6Ì…šø[þ²­½úÆñ7ßúX¸µ5ˆq¤üb¤³Zû9éר˜ Dq” tj¨Òõ“N÷,|méÀµ¡K[ý™ZçbfzðÇ•øß•åK±W@BµÝÝ‚™8÷.Fo©,w’1vÄê³²ñ0ƒ±é" Y ƒ>r{8¥^© Õ2)Ï/ØÌ¬O|SÞA³¿ÂcñÔÑV §%¨÷>B²Ð× JÍô¼ÚLÌÛ<^ –"ôKœ´½¿i]+2®Ä9“›è©{*ì­ël †ì¢s䝨^äÜF‡`ó~Ëf"·Äè¯% ¨*EE„nA"Í3\ñòOHqÀ¡ÆÍLµ÷%î›n.D‹Få a^\/õ›-Z Û%ô–Gñ3ÏX1bõ× s£òJüä|È„Í; Sh%ŽTÃ{€üÕ•vˆq¸’Ô% Øsw]ÔUüôÁ€égñÓå×Ñ‘ù½ÖªGD>‚<uµ+¢qú‚%ßéÄoH\ãÒæ ÝMzÁÌÁÈb£aJWÒ5Ñw¥S1öüágcÛ_z!¸ÚËË>­JIØTN0Î~Hù=ù Ðd÷gêµ%£Ãü £?Û8´1u#“±GM©+VÂ'Ïm„”i’•õüIt-ópfà‘Wí¯°û»¨Ô¹vˆ8`žïÁ—ÓAEª3A¶” ¥®€‡z6Ð5Çh´,ò²ºZU ñ›Y)5l±0‡íCê8ŒÂ½çl?ßMç'¼øëxsÄ® Ëp‹lL)ð‡[s{§ÝùBÓKÌSÜ.ÃÂÖ{«+³c¿‡Õ©•µ#›ƒ˜öžþÂå‘õhû8÷Û^¶ünefM·3ÙL¡qi[Y6  ÷w.n¼OHÎkô‰ ¡{¹Xßèž%éÃüÞ“ƒdÄÕ Úñ'WÇ#XÀvìÂìÙ—£® Ÿ€tµ‡…]»Tü%»«ò°Dþ¸ÛÚ‡†Á3×yhDð/}ÀŽßëDô޹¯²‘Gª™~”Ÿ\3ˆXTvxÝÈYðˆÔJ-À 8ù¯™·dymW¿U&…Àd^déw|¹o¤ØDùãx7žnÏ–µƒ,>€Ì¤lNR¸.åXž¦´¡?]¹òíÀ³ 9â\².ÔÂÐuḟÔD$Ô@GúaŽ_dÜ¢Wùñ’>3ÈX3K$EL·§‚†-û `D¸“ÜzÑjoƬßïÊHÛp±ðb¬ÿ çaQ¤jÃöÍ^³H¾/ªNð.£í2efžÂ#qb.•«Ôz[Ë ÿùX!ãKAknÚ ³„Zú¹é™Dñ!ø1ÀuÌ]°ºÑ¡=mćÚ:o‹k´ ¦,öË@í \ë#²¢6NM5û]hr¯M”øKÜ•˜K±df–±uÊßê”Ô–¶9ùXÿ¦4½UUn ]¡‡tº@Œ˜[\(ýjvÏOú;p׼ěLoÌáÅ™5 ¸›Ðö‚Ú<·'IÜ+z÷¹xî¼uTúg¿·þ.gU0nó"?§zklŠ`ðm`~ñÓ$Ëb·ÒXmÃ=‰õZÆ,r&½u³an] ÷ˆ·Kt!cQÙ3Ã%¾çòÝ7… Ÿœ OÕ÷P˜SµÑê<É%Ÿ·((~àH/ZL1œÚNÐI"‹)ÒñÈl7\¤ÇTú´p\‹¤ ™ÝÇ5)/ ‘Mb–?C=¯jOn¾›D}„Kä Ü4(NNãîzûГ¡9©ØHý£ËØ#J Ð7Qhɪι­òë—P‡²V]Ò|;…wI¶¨³Êq…¥X,DWDXèÞ^¾TìíÉÀ§ù)¨abü±Œ¼ð§ÀàÔ>Àà×hÎ'+Kð‰v›Ò›hdƒüM_Ä«mMYAË€sŸá|­n}¼.û÷v¥¦Ó1¨Œ¦î­ÜegεÅþBmB<ß²ŒI*_c­ŠXÚbîë(¥ 8°¶ˆ¸é ZHÈ|Çù‘¬HÑxazóÔ‹ª& ºþÆUS˜ñ¸ÊZ‚»p¦9TÙ‡¶ÑߟÐ2Ëž0¤Éη|ï\è,|¬B(!ž´„5™ÄŠØæW1ü¹d7rá¢SXW`rtžŒð…#Á¹;ô!߃ c~ϬÂí‹ÝºBJáö}´àŽ SX©ymxâXÎΟÓy\«=¨ÜÈR“Ûñw:W D,:ºÌû_>÷qeáUä%KÈS´ËäbS–0¨ÊRŸÍ¾yátÝT^õ\gÚGqL,“ýˆ ÖkËN0Pj”ýM)rÖ´bkDcáÕ?gäSC£ÞS™Ê»Ç;*Z@Q›G,˜|þDjÀk/õë'jÊ«Ê4@s5Tw‹ÒòÞà@)õÍ‹¤êé-¶‹„Õ–@û:,4 “>èŸÿ¤ûgñÔ:èdéNéKôz³öÍú‰ö饸Hd eGkcÔáb~oíCšd½U"u E8§~1”ñÙ)½´£•ktL.0¸ËçÓý›ðTˆÐmG5>ø? àE‚ØHm¦·À|‡oÌ”ëú7º•ÖkNÃq“^Z?Pác‘'PÛͨXkZ‰‹¦·ýõ²ÔÝè‡Û®ïrqNZ³‡ ¾+ºÔçàÅIh0myºx4þæ6¯I=²ži&½mHjÙa²/œþh†jãÖVÓŽÉ£^ß¼Bs"ST§â®é™NfIì«1ªí,|’ 5(âØýØ ·³âÝ—_Ú‚€tá}flVhÀkt€â­/Ig%8µhºù©ŸD’`eZHünMÍ=zÊUþ|O\‰åÕ39`Éi… ˆ·½Û@+{²¶Ü`,…A¿¯Ÿùªè„I~¸apn’ˆÛûà-«÷Š—–6þ'Ë=Ç‚î O ïú–³áG?ÉÄ*µ^NÍ¢â\‚šƒc˜W0O‰\s |zÃç~Ä=CCZ1˜ÒmY­è_ó´Ñ¹n¤¿ãx,×p²!°`‰ñJóÑH©œük)Ô–ï©O¼ÍmWÛšö¬¿¤BžHThøÌMwé*õ1ñh¤=wpiUFÓˆáB;«÷â)#VÂ`ÞíÆõ;e\Ä4µÂœ—Þ\DïL”mÄ0 ¦4)&ÛVCÍ„aì¢Uu;ó8Õ»3‘»nY’ye\<þÚ±ÚüN³¾ìNYDo—õ7ë»çV¿9ÙµoJ”ú,Á^%[c½ñÑ›È Ì|¦e>4Ö5Þ›–›ÌChð@»W=>Ošfrc®½1š8ë½>,cnã‹ 92Kø0`Š1lnJ¾wð °˜{Hràíó2òôqsqZd²Ûj ¥)áÌtT½ŽïSZ…®oÀ„Ë`³Z°ø°nJñZ/ 1AAq*Ñ·é65Ö#Ö¥ÿZ–(÷¨«TŠý(û¹õ…á3£c±ÇEw§Ì9Ì>+-ú§´Ÿ_ÃIûðy Je˜!ø¹£ˆ‘R¦j•R÷}6lã· Íòì¿ .Ÿr“½€’o€/†8 ‘޽bªeö±_ø¦ú3›°œ¿›F zøÆôr¶yîAÄI“à~“ðØ!ÒK=|râ™ ¸›)h7›¦ìV½qðÛš>ãä7ÚòïFزŠ7ÐkwI!£+]I¥éé[}•Ñ;LêŽGÀ¸†âN´á+AÐ7+¦ ìêS~'0¯[É8 ûƇ¯àÏÖ!<†ǰHôí^}%TéÀÚ&¡nתÙ¹³oµõÐIØÛWf–Vý÷ ©ûbê²çø¶Å­òa —ïƒ~3^ר$üþ¬Ž÷êœâ©li½9sË•µÝƒúŽ?D$”Z“¬¹%ûÅÛL×HYÞ’@ª³î<¤Ý’JyÌø€ê®ù¸ôù©-Ò}O 7î‚3,ã‹OÑœbãr7‰ %E"þÊ•]ÒÍŠ¸SWæpuly§{å}…ÅG¦PÊsRžî DèÞ¶ ÎÈ\Œ"ϧ°ò*hs+óøã§WÌmøæ^¿–ù0Ê6oÇ,ó»XSZí!¹öXcQ xC ‹Š©tÖ/²»êZ1BÛÎM·*%yOý¦+¸š;É¥/üö%/Ip? “;†Þßà «Ço˺o°Î¡¢Öšy$Ö4S½‘šœé9ú¸—Ú2í*þUú»tAê¹ðuF‘§ \ÐÓ<±ìБ”reÁ'Á—N“ûòív/"‹kik„èP8|ZxJd5|Àñ¯ùº_ˆ~¬<Wß°—ÍàÛ°³Ä4a¿@ÆU{‡!(puDÿŒ—RýšÆYëæ3°,Ï«x;y!róõèϼ µ­¿k3×›\¥³ò,:^ûlŒoµ¾º‡lÁ£-Ëâ•UM?ió¬W’€‘†³s:‡XÈê)#Í]ºÐ†ã‹rØó<e~ÓžŽœmX=5I§³ÐŠÔÚÂ"C@õÜ›¬VOŽ¡WÆù‚úìۢʒôj†e®RªñZÜ«dÁ#ýÕà Û"^],¹'Wú‘ƪ69‘Drí-vEÚÏ÷FËÞƒ}ü.䙢ÁÕæmû$¯J—àî²âm‚gjAÔ/i3'"hœ3ýrMĪ V‚²®TÍ*éù£ÄWÑ ÕSýç^<§üÓy'×›bWnï§–,-gOdg{¿7~Å)S—ohJê) :áÖIŒ~O+~ñÝXIÕ­Ü«Œ-=`‡JÞ#m™¥²Š|Kû~nG7µÏ%”¨"B›¾ÏLI3ú:DËHí@ÌÏR}Ð’’ýd±E:Õ´PÄ,Ëw/©¹¼œV£âó(àå\B©4£m»›ŸaÝF5Æþ:)Ú3`‹HTû5T@¸ è;‰kí_Ä„ÖMêx‡’pwúñˆÐ²Mw1|ëè¹â ¥{˜nÏþɃæ+Á·’¥CõVc]Þ@Á1 W´õnN»ËåðB_¤±F0¥>ö³ÊŒk¤A]#;× ü l³;-;(všgR›!8¿,mry1!ŠeŒ¡Óy8‹HDö¤Ñ{Þ¯õ½«é?<^›ŸrÈu"ûÒÅËYhçà °¿%§Xm³Ðh¥‡F«ü 'úY'Ù–íñj¸Ù~ÓÿÄÿ€ÿO `l 4tt¶³1t´Bø? ÃËF endstream endobj 26 0 obj << /Type /Font /Subtype /Type1 /Encoding 2445 0 R /FirstChar 33 /LastChar 126 /Widths 2446 0 R /BaseFont /NCIUTP+CMTT10 /FontDescriptor 24 0 R >> endobj 24 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /NCIUTP+CMTT10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-4 -235 731 800] /Flags 4 /CharSet (/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde) /FontFile 25 0 R >> endobj 2446 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj 2445 0 obj << /Type /Encoding /Differences [ 0 /.notdef 33/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef] >> endobj 11 0 obj << /Length1 832 /Length2 965 /Length3 532 /Length 1553 /Filter /FlateDecode >> stream xÚí•iTW†Õ(HÀ¶JA©×…ºI kA "\@&7Éd‡ &"hÝÀ¤uA”Å´*‚èAEJ© T *‚ж EÜEN=´èÑâÏöWOgþÌwß÷~÷9ïwÏ›‰ Cì=Ed$ô! Úá ®À+ $ á„ÃcÛØxQ¥q’ðFiè x*%áž“«Ï•ïĶ^d´šÂ%RLóšÞkrž HáJ€”–BÓCå „ÄpH«9ÀS.Á½;b@0ŒT,qØD8FƒH(Á 6·—È“À©Y¤Œ~'ÅB*†ÓÈé€A‘„\ DPÌæ’ÌY!ù7 6÷QÊ娢·}_J騗«ß:HE´’† E"Z—Â~¸(Â•ŠªÊqÌ“È!°Gfqx3ùýル h!NcR Få1°o¢(L|} Ü_ï ?Û·sí¢8A/RGCÀ{ïî«‘÷5“…«@8Ãã!Œ‘yß}­pØ\#E8!|G€Rªf37ˆ©ø 8!‚*U 1—C4³0ÑÄ1I±{ÇŠÌ\ §09Äz§F÷ªýp#™ÌáK¼Y€‹’H Åd–Cñ‡ÿC­ü½âÇѤ*ÎÞÁØ»82¨âœœøñ3bJŠ‚Ýwû˜€ßÕbœ „*ˆ±›HÌmsÔíÖ£ ssêŽ ãštWŸxØd|!´4!Ňð³…%t-ÅÛ+-dº±ó1·ÝæÔË”ÀäÃ!óãÅšGB¿ÝÀ/ç4†X¨7iÒFôØN}äW¹zIzæ––q®åTë¾m“íš “×W›e‹ÚËrÎwÝm05#xÇŒIVNMùÆÍƒÇX¨›\›ð¢týž‹îØ“_n-ð[h㣙ª{˜FÐW÷Ù+ı:­PïYq½½eÍXћς’ËÃU­“&%Ú<ÿ)äˆê¥&a\ÜÍKÑÆõI)_® 2a—[ ªšë*7_lá¦nð=o½`|uëLéVÕ¶iŸKxwg)Ò—Z^Žº¿¸°Iü³ÝØêpÂë#¨,³d—µ÷㵫óÊÜ»[¤ÄsüµéaOsË*MÊF#泯7y¥vï7 ¬5Ò8(‹_¥•J·wp-Ú:gÕ6Ôùæ¶nP 2³ÌZ'\QÂN B}zŒR*Úî~SÍ;Þ¶–Ôdt <>¡²q= .ìgôÔ'jäsœŸí_0m¨ié™ãvcâŠjövîl1œôð÷.ÑžÁ+£¦ áßYì8;F$¥ß=qêReÕgV‰]…Ẋ=§½»šÓ–—?ðÐÀCǢȥ*Vë'«ž»˜qµ««¯ñ„0 gÌ»”¡wx™¯³ùtð©ICU±U«îÌÞ–ó‹õ©3žß\,Ëb±"†ÿ™ãæ-ˆr ê–Oø÷$ot|- »õ°ãºÝÈe_(Oék@ù|ahtFÀïFBëåY1»Ï·íÑ­4¯uì4HKÍûÊL·é,SYÙóz®†¶‘2¶õÔ‡m=ØÎÔ}ätË—ß/oŒ—ÉÓïÄ xƒº­Û5Têp®Y_P²h7Ú%xVxrjÊiþÊ$I}íë³\Kòò»ÛÆûÛê&v_+òU±¬¦”5&g.Êo—ù*r·ú…?8~‘c5a˜§û›b…±Ÿ_ÈþT_#Çñ—Ïk³ÌW´_ñçhœíb²Û ö;%?Ck”Éë:ë³±›™šÂÞ÷Ë/oLfxz•Uæ{EbðxñÝŽÇ܃C¢®Ø.µ ©qÕVÿŽöñeÍ«n/?¤ÍÓº5NOÕ³ŸùÞé|qÃÞÞKaBÞkÿ°M[{X±á£ŸŒ|xÛ4þf}Õ•ÚC÷ƒ¯;ܳMY£ÈÔÊJã†,ÍÂveg„šÍÚg}’óǶõ=Û>•c¶tÐè’¸Mc3´›GQç:´ü&1´Ä%$j|*öâ“MÓ†žhÑÏ£Xu÷Œî¥FðþáÃþ¿Á¢óûA)šT ”Œý,Z€ endstream endobj 12 0 obj << /Type /Font /Subtype /Type1 /Encoding 2447 0 R /FirstChar 13 /LastChar 105 /Widths 2448 0 R /BaseFont /MFGDOI+CMSY10 /FontDescriptor 10 0 R >> endobj 10 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /MFGDOI+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/circlecopyrt/bullet/angbracketleft/angbracketright) /FontFile 11 0 R >> endobj 2448 0 obj [1000 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 389 389 ] endobj 2447 0 obj << /Type /Encoding /Differences [ 0 /.notdef 13/circlecopyrt 14/.notdef 15/bullet 16/.notdef 104/angbracketleft/angbracketright 106/.notdef] >> endobj 8 0 obj << /Length1 2238 /Length2 16852 /Length3 532 /Length 18100 /Filter /FlateDecode >> stream xÚ¬·eT\Ͷp» Ú¸»»ÜÝ­qw !¸»»»‡àîNp înÀ×Ï9÷žäÜ÷ï7`0z®ZU5wUíU ‰’*ƒˆ™ƒ PÒÁÞ•…‘… &¯Â `adfE  s»Z9Ø‹»y,<<¬I  èè——ƒ—ƒ æàèåleaé  £ù'‰ bt¶25¶È»Zí@c˜ÛTL­€®^Œ[[€Ê?=\*@ ³;ÐŒ…`feê 0ZXÙ#0ý£$moîàúwØÌÍñ›ÜÎ. )õ¿4i I3{[/€ÐIÁ4äòÿ‡Öÿ\ÒÍÖVÁØîŸáÿY¨ÿ§ÙØÎÊÖëìÝ\Îy3 ³ýÿMÕþÛMhfåf÷[¥]m­LEì-l懬\$­0R+œ °Pu@¯Â©ŒIæ`„Ôf{ãIÎ^áLI„É»_Ò·uh‘ü¦àÔß,Ù3d£3´,’Y.f¾J(t¨Š¦z†ó~;¤<ñtÈ&ú“o¹ôEMtÍÖУÑ&An³&ÃÑÌÈœÁôfA¹ËRÇùŒ@ê(”ôîã&œ¡/âWâ‚`µ‹öËZ”æõ³¢ "êÀ¿ÒqNN‘œì€ Ž3QŒðõŽhŒcí¶žŽÒ|” ºü뜼„o7Ň t(ÓMa•ÒjÕf‘‚Ï{IžASæøÒXBù9´!H>Æê!NÌ50e( (80îîßi3È«:ëÆ|¼ùÞÊÏy&^ìÔtë;r °SÍ`+³“Ôm®àÈ/53-Áš×ykƒ…†¾R;sÆð‰ºnÀŒqÖÆšJöâ‹ ;O3ñ‘ÐË.G;å—Êe$ƒ%¿5ï¶ÝÐ>Õ.ÒÎ Á[k,ÑQÓ¸Rö®a0¥•·tÝ X ˜6¹ép7¦ÒVö’Áä᥿>áf;µ®Ý%+µŸd]·ùvO¤HÇL$Fâá 5;ýŽÉJ´×B51}0¤`\¨wŸûýpÃêƒâÄÀ%¶;°.NÀö¢&MÃn_ù.—WÀÀu¨Lªv”ßÞ¬–X‡óíLõ˜{lÎŨ\iöÛµ˜ÛŽ"„ÉûY­çn?5}âi £¨6OœÅ9‘“9î¶«KßüÍj‘¢gjæEò5òÆêlÄ›Ž ªÚÖ³y߸6µ‹nxŒµQUØíAÿX{öCRÐÉ"GÅ_QÂÁC–öéívyˆ)2ý Õ¥]¼a«ãQápþ¤§€`#±ÌÔ>À-ÓZNÜüç2ÊãpˆM5ÌþûÜìë×ÑÓ…å8Æ=wœþšªqß)0–l »–m D叨+ΨhØßw3Zâ ~~ñžÑ'é¾]ÐqŒe} 'ïÔ^K3‚6M”s‹M¬D;Ñsyß T;Zw·Ñ,Pæ6èÛêìXHK¹ÄT¡އš1l~‹o¡ÍŠCœž¿#bÊdÎ1¸x©˜¼¼±Œ”’ô-Xç!¡Yâ—§"Ã_Ÿ(–ºRCè k·Ó„U1 8K¶W¼„»¢pkAKB©SxdPÈ×EO8´µ¡à¿ì{ß%—Þ4ÈŽ$f0?C®Û³BÌeô¢-[Þ9{ ûDf‹>pZü–ýœ°WîÑvˆ«6+6‰—³>ëîÛ—KÜ.'€£„B] d壯7m¨q2+»µíôUhýý°‚ëD-XoI¾r¨ã¹ „¢.§øæ‹ñfŒ¸¢‚oa5…Ù†)gF¡èç ø˜©oöeOÅ×ð9XÕØgê²fò·0WÓNÐ:×f*Ù9ñ¹a‡Zhæ]î,ßF‘ëv#º#·3ñ:Ý6C'–4ØšÚ¦ÁQOr2u@\§ø£z |Š{F¾ÌÖØ.µ…|Õ¢98Z zùd§xš‚úbÃm?4Þvè(‹ð Ä=ìW¶š<ê1ÂÇ|:¾‡*_ô¬…þ…?U>‡¦™­?m*‘¨rò£± Ä|B?8XCdœEÉ?‡YXÛ£ELã-MÇN 7hXt_¶0Bß¶L-9¡ŒÔI.˜–Ž7ïåH²%ùí+ðëæ•iêe‡± Ð7 ”ªÆþ“lÈœÔ>Ò¤£¤;±îï½ÌF‚‡.Ãuz³vVC³,ƒ±QW—x´.©=ª¾ï‹^†ŒSÐ Mqòñ•OOã6â>sèÑäEeÀ‚FÓO¼¾¤7Ž‹¶eÛ«é´’Ñx?yÍ/TãýR`]``¦K»Œ‚e˜Ãô_‚p¶ç+%*ßpíB½¹üõq68P+\U’vuôÇê!I†Îj¨lL¿ãpZZÜJŽ- ÂT§ÀT¹IêNnmf‰™Õ—]JÛÊm¹×iíu;Ø>05#˜=áW––Ò´N[d]€ V‰ÆLìá TäLÙWÆûˆC{¸c]öªl;7µ 8èá–†­kÂ*ß©ö† ‹~ú鮾)ÕóÛ‰ßï–$ ìÚO8zòÐ$§© …¥ùe×l 0S[ž”B…íñRLJæõõ¶ „22ûÛ\F‚ðT%•5¬¶™‚­ !#ÑQ{iú…`Ñ*™ûú0ÍG2?ëàÐv#g/ v?íHÌäºóÙ`ÈPäOÀøÚõÎ8‡@é#–[jGî1®Ø:‘Å@D5ˆ¯èçÉlÊéWOÅÁ—ÒÙ÷ùè= ÒmÍ5bßï )Kj¯ÈÖß©œ)2§œ*ãaò$£Ýç«äýšÜŠh~öN’ìMÖÌŸetÂnv©0æ›]5C}qÆbì[#f„&·t™ÂÍüEƒ—B$³mZöX·a±)×`äk?†.?³~ìåþÎØ?_h@X„,¤(ßeQœ0‹­ð |®Ë1jGÊ—XWÑßò[¾Š r™dàS&6r¶Ø8­×Zò×ÉÏLCÜJާÝ"ÌŸ å0p±^â¨{qïZØb!òšÞ ÷&3ŠF üÚÈÖ7ÈI;ª·žªJ!Ø®z5… í~LPž§MXr&¹â—Y;Îç›7\b@»M©:W"Ï1BÎýP¯(H©J4Q…1ÿûËWùû‡·‹«ö9æ€ÍדbèªS#Ç,½YÐäVÉçý¶i?Ylô¤\ja÷dù§ä¾lx|PZÀÖìxÖ±³Ë†Þ >[zÈZvSN TYmí»6~”bUш[,«?à¡ü씥:å蟅èÉ\À]ÓÛÙzîÇ•@qéDÊçu×ËÜš¡ß¨,„Þ:ÏÆ¯¸ÒÀäÚ ¥ì¦z°ÁÕÅ ‰ë!0­pÑ¿'ôp–¥$V‘ýàœ¸ÄTjª*ÂÄJˆ÷ÖVô‚YÏ”¤A'_DýE2I9Îÿ­¶)—ÒàK…¾+{l¦ïAI°Þæwé¸Ä œÊç´½F6u›W’̾å³bˆQ‹­Ø=€‰ënxí ð¸f ÆŸ˜¼˜–õ)L¤›ÕïA|¾¿WÔÄ;†zš»Ê~/œÇqFÃÔˆ´¢1Ö2EÜlM6É-²}ë'_Ð)¨<ËôÄ£ËI”UZTë~Ógì-žýÍù |ÙQÇþµˆó¦ÓQ²ÞqªÔµK~¦Õáâ ­X䙩òØ„ïÕR3HAî´x23¨b›óóã÷äp²·ckʘÐÄ:Uv¡}܇»<.B…Ь•pDàŸ“âSM×i‹\«E³‚pÈ{¼ODÇNÃ*pÛ@w/ çeØÊhmp8¡€vŽ/¶:‚1;§‡‡OŠÐšÇ¹*ÃÕ¤rA†<ŠÓ&’ŽøýÜoßTnç(ŸJ «P«±gÞÓcD)=û‘ AXŠØÔ„&ŽUüìÂbÔk8„\KeWXâÊF¸¦¶o·ç ðÝßzÐV&Û˜•…‚à­LìqÐòXl¾üC ÉIe Ç—N­e|[uüV;¦V^Aiò dØcã}2¿OœŸXé‡è­N£7óñj–ÙÊ yö™;e†;,š*K åå¼ñ¨2$âSåŸÍ$vƒmìœëíì±É1¹°ryá‹oÄŒà8˜‡m—p¾L÷n*ç‹h<Ðjf‰5,¥¹.1ýzÒžÖ¼ëò.ŒÕ-ÙÀ"ëÜ[¶ºÁHs+I\l#[²VkÝã —ô&Ä`Eƒ±#”Þ\[ùÞƒžB1HükW·Hu?bÎü¾K¡äˆgºv̽ÙeŸøçGÇW‘eÉéOöPó[\b_1h™ˆ¿=ﮡU’P pØuµù"˜@W¬£“â8°m–aÄ…€ˆRò©hÉYó'ˆVP£?ïñU&Ê@Èn®ò;\Ûö™C;aÑ¢³£ÅòÀÕ?¸êR:D¢š£`Be*UÀ*‡ÕE¨óaÉK+‹J¡¹éÞÝÇðºÛW”éÅ7fïÏ)¼¶A˜A7ò¢½àfÊ‹Â!YjÔsÎà˜J˜ÎùŒ4ŠŽÙ`«ã‰¶¼×ÄÙ(MJß{ýþ¯$Ç/×—d^ÑËÝX¡>»ôt:¦,ª×O'Q‰­œt…ÃtÑ­çß.º”›'aÀŸž¥_ŠŠL5Å~§¾Á«ÆŒŽ¶$Ú'ÖQ}èÔ«=ùŽ;qCò¥§ ½Ðü§a\ÿÊÊ(_b…sºÆ’ÓÕm,•¬i´$ž8&‰¨êtLÞSî½¢‡aûÄQòL§[ó•ÀwàÙFâP±—fK-ïcŽxÎe£WAx‰`ÇM騚6˜Xñï7r ¦É)…74°Oyƒp=ï jþòBùð»þ&v/Nõ黽Rƒ/A¼«y?YõF¹ÝóãRcm©n&¡þé4ð ¯âÔ=—ãÄžìã[3¯¿ó£Úzq“­4Õ Q¿a+TÇ%yʰõ’Ûûž6ÿëýKFƒ:õ6}§¥T%ÉÀ{’ š‚è®ÀNbˆ·“>±ýØ’"±Vg¶5†Û€¥ˆ‹Ê±»Î ~©´0å¥éÝæ`˜¹}±¾ßǽý |žO¼B7E*—›Ò=‡‘¦ÔEgeìç× ho‘!z\èRóp{ ¤pç Õ÷ ];*r´Z,펕 ²‘î§*­‰©QÂ9»>ÉàðZ·ìò=QŠTõXTå’¸}Û%^ƒ\OøÀ,TÉFwHË!²BÒð‚=¹Jœ$üãÀKÙ ¹1t¥W6Ão˜IŒr܇¯aßsc¼o³üHœ¡ì+fEÀn_èI$>”¾¶Âž“ÎÚÄÈ£‹¯a oª×Îö¨ïˆå­úˆ;µmÓKöÕýj4пòçmºNM}’1;AÿS ‰™kûËØý²$’ ûƒ}mq¹ÒQçÕìÕR_$׊–ܨÄF8¤OoÞÀh|óþâ×›ê»n«,‚í…õ”¢£¹5æ_›„ñЃ@pT9ÂÍ $"—‹ûü$æ‡ðÀª‚št×MnÖ„€W79™ôôÝíB6^éÁ¨cíH94£3½Ð ×mŸ)8«M\!FkQ †³…òu³yø}t÷ñ†8Ç`[îXã+’ÆA"ébÃÜ /ñÂÚØ‘¼·®A‘zá^7´B¤À×tlîŒÄ‘’C€pè¬E¯ÿðôí¤¤«S+¾W¾iu„·†8œêƒG"…Ž­CQb¡ý˜<ë;I•ëÅÙ Äìʸ¸Ùo;Þ†/{¹¦ÔqFoL¢ÞÕnމ9Ëwñ‘äyV‚멯«´ƒ1}LퟦE"†î=ÇÊwY¿„“å2 zvbë/ Ò]©´u’ :çǔۆTÓöNx¡*Úñ §çæçÿÜW©EšyÆ€ý̵¼ûDç1ÎÞŒÍÌÞZÖ$‹1[ª¯@bÖ+,¤ê~fÁNŒØœËF4:PÒªS%-ôÝ¥—Çš¿B‡ aÁV~¦Ü튩å+Ò“nu’³Êúú— gè´îG‰ñ* Lôô^9Æx¦4C?µæÙä¢+2]É?Ç`Dqùið¢]—ÈV|m»ÞýXSĵ®19±tÁ,yà-ùS}LŸ}FººþwM½³®Æ9$Çïû³dÆ=¤{R¢Ô­|år¥ØJ›þwÿÓ}FŒßOvEn|W[©­Á‹C»§%ð¿d™Æ®xæJ†“Hn£jZ®ÃPeEj¢ñ>gOEµGàb¿~FQmœéÕ]~«ÃY }Ñ«N–úÖØ×0;Rò€Œ®Æ³™… ‘)®)â±£Dšºiuò$îY¯ ©”>$¿Áã=™ â¨î3òŠ;EV"]Õ-2"ü–‘õ¸O·£õ¦p1ÿ€6§ß&¡u[ŽTÿ!p(Kgìå[Ç«©mªÊüFРŽäù4À‡$Ùe1ÍÔ‰¨‰i>5J%7µ²9ÝÒùôM&´Rîkn™Ò‹É¤¾L¬ÚŽ£R ³Ói«³d*™z”áÊÆc„g¼QFˆöZ¦éÕ„ñÆCöÛØK™ã!vÍÌû©+m«OvY85ØÉ§®wW“j1Ü×®,ªfiU/œsDõ²D Û¯^¹|Ö˼ íÝ6)ŠÚ:`sÐ¥¥ªFN¬Q4d<†P3ù_ g0TnoÊ?¯["-·Ønq Çö‡Ô‡ÜÞ ¨’½^Ï´0dë±B‹äwÝfν mÎU©G.TáM„Ƶ˜àüE¾*ÿ.‚ ªÅ¼„¤Ù§ZJ@ ‘ûˆ%ËQlž_,á”GßE9eu6£Ph‰™0ÜÑ•+â­œ gÜX°Ifß2ÜyF›«ž‚óù‚kËÖp÷ê¶7Âs«ìÚZé¥ý¹ ´™šË¯êw¦¼x´m}ýÇòAô 黟®=­;Ž>ÁÐÈ1iÚ;ðê5jÕû_4ëPƒ³‰™2¦ ¡pÜ,]³l’v¤ oÿ¢§CvC"—?ÈB@ÚoâJÖÄ`ë}b¯5m—¬x‰è%(é„§R{…¤ö±åÙ~µi·É&© :ßæö  ŸÕâ‹þÉr\pEÆQ-ôû&»§:C+¼]¿µÌÛWÞg;i·'="·¾K?ê¾ÛŽ\{¬P¬/+jB ËðÀõ+-7ª°Žgù¢Œ‚ÁƒÔµÚY‡¥•oZíK§?Ú<NÉö¡—ä(ýýGv ú­¶_m ˜3„è.S¦~¥’dpM\æk'r¾á4X»Ñ#Ø<;¼š”ä“FšjW×¼òå2Ó¥f?¤äjk)Å™þ0¤˜È&à«¡õ]0ì_8_éØ8·è£V×$ç,Š¿V-e(–xzÚó¿ «Ç,âßn6²e3AU£ÐîÀˆ§øÜFþ0ÌiÞ¢äVDˆ0ª´wLášÊ7Lñ7ã2]™èÊ×`à:¿ˆ¤¶’¹~ñž`¤ÿ¨_×öMÕÅK©ñŒ@åW2¦¢²HÅÕuÃì,¹ÊŽ«Ì¥vð4^N•<›QõÓÐbZ“lNœðcšŽ(™å‡ËxúCˆØpïÖ¯ÓZšÝØ2FÔE>Ei¹ð܇Ä ŒÁé[û™&鉣ŒÁe,¯¯Ã– Ò_¢œ5ùÛá}Ê33óûe}häÅL!“wôrw¶(äÃ2Nh´mÞY‹ű5‡Î"ËÅI¬ÁqM%Jrwvóc-øÀ6õxVòÙ_Y¤­×Èɲ$ó‹[S‚LS$&—pvXnU€î›‘:çþJ_G/$0ì×Y›÷|‚ÙµéçÁ:lÛ³ÏHlèQS°f„„ÒÐg8Ä^Z„£óø(RaG*ò·#B¤×lÙÎ{Y+Ÿøó¦TqUWÕ~‚I4µ=V p¸iÀ8ü$Ýý8þ"µCÒþºGlÖÎ%M­\µJ}°úýÅíX Ãifp$íén‹;qÀӃ߂}¬¸ßõä—?“$rsN+…ÍŸi ‘E·üÉǵD÷»<4·…ç˜ÒÍØùûÄÂÓYuÖéºG–ÚkowÿìÊÅ›f[êÚïŽeårŸ=¦²}EA÷ªQ¡‹ùßÊG¸+Iç÷ŠÂÒØLâ¥YÀt“G&/-]Û¶b&}nA8yÁ꓇ÝÚS'«¦Š¯—&^ü:ZªUXf´Ê  Ä&þÀ>¯^Ü—ÅØ;U±-Ó^Ÿ±ôCZ^M×|ë<Î#FÝXhaYø|H5›°üã‘óøc¼A+­S¥‡[³ý” Ý­]–ÎF £°›Ç>R[ÄNHg8ƒ”ζzS À‹GùP§b2QDÿÜŸ¾-ý„Vû5›s=˜~Ý8Ü–ƒaGÔïªÍŠtwh#è¯QZI.™<­htù$:ëJrta™t–.]BD­ ò Öõ÷æ÷¬ÀrAûáLÙ\«2­|÷ .Y‡È& øYþ `T¯ZD]…$£§@ñ=îwƒD‘eŽ&º£ƒau¨®õ€ÀÀ†³g.¤=“z›o›Ž)2°¬ð[ÓÕ¸–ˆTÀL°è)Ä-Ž*©úò5•?8‘®\õ–>r‹ðGÙoIÏ:i¼D2ÜY®·Á:¸Û h>V›×²²n®´˜ïéu*X欲®;]ÒñøÂü† hÔ‘þìÊ5FGÆRoe4î¾)sh¯4tÄ6ÛÙ¢~©×^ëR8VƒCL¤Ÿ«[‰’D¯4~Šþ·(I“¯rˆ)&qâ_zùa÷ZÆö ”rÅFmÔ˜ÅlI–ÙmÓ`äl¨aqVëÓWµ.ʹªúÛI¨MÀf¯ª ƒòñ}*ñÎ<¤¡¿Ó%ò5’Ù|@yw†Èý)áJyL±Œ5æw²¼+ôæD,úÖcŒAôRrOÜ´yèÁ¬R‹ (çB þµ ȹ^z„¶(Sÿ:N—D°Êc_(ŽbpJ½ ™¥cÜn… ÏŽ™jÚß< 8§Ôä‡&Š¼Æ«ž”0t*å WÉKí÷¹Gå–¯üÜ úÁ*èÉÈ#S*üV]V…•¶—ÛÍ"gq3‘à.꬇ €Îx®  ™bì±¶Ñ%*-ë þl†>|ämeÚû<+}@ͬÐPG1¸}õûâ>÷°Q‹… BÄ‚ü˜ Ó^ßYšI}ÒœÊÅV?&m¹­÷&Z#·rŠúg–¯à'ú±–½õ”§Ï!lþÕ½oùPé½èû•}§ ¾V*Ô |ï@Ë„ovUª]ÎðD²öìh:X@!§¨þÂÄú&{»ðvýc‘_9Þ­BßÓÄaà*Ï3Ý1š‡ã ¿Ó8‹(ZCKW‡ž%$°Oó¤=½ÃÄZW›à+¬IV¡ß¥N]ØarÂnª1uŸMAÉ)×¾½ÅÙªæ0/Æ¢ÃRK u‘‹2U±èÝqšUFs‚(veYDåÑ©¯ºÄà â:n|ß(š‹ö™UP=ëG(}¦”õqpK‰oxMÞïÝ|e+¼[Üäkв´½zò=dîª9hÖrH§=@3ÊbêLH4ÈP[5kÎ+gÊ<}œ­'”Lƒ»ÌKh ÷£Ü<±ÈÍJ4e‹>A|pÒuйð} w,¬U+ Ñm‰ƒþî_Œ4»Ûu á]Âð¾®Z÷qfR t¿”‡°Š¨'[ªåTÊ4RcG?hªÏÚâ9e;Ïë"A}Gùe ¾E)™­p…÷™ºU<-;jt²¸{zmf„#$*9æ=ðiÚœZ´ÝPvδCµÉ–€8òGÃo¡µ N"–$;á¡&‘PC•y>zÎçûÄÊžit¾*ml„“‘óé&ØÄåºD&7^2rɵ`ýÌ¥ú¹.ggQh”ú©´‚E™n†nÖ=µ^ñ®Žw¢\·Í’„=¼‚:Ê8¢Å¸Ûp˜Tò·é¢ï õ™g$.³åÝÕ+æ¦!¡Àû$ ÂÕç„ rñF¡âDð`š·üQ-ÍŒìîB3Óe²ù«a}–ÇÛ¿±Âqé Û¢é8½n¼úÃëØû×õÌj3Mæa%z²¡*®ºí¾Ÿ“½ž^vÑ~&Š=jÂKZ- ª"¼í‘³>Eè-@é*Äó…Aœ:l„å3–'fâGEþTŽÁázë¥þc8)eºT10—]Xɬ„5ê9PÀ‘sMv±à'=>ÁFÄI¥&Œ4”&Z(9 ëûJ ̧” {MÕš(£Å¢}ãï¼³¿’ê@»¾VÍåŠrZÿø#ZÙÖD›·Â×â2¨ÇðÇÕÕsLÚ¼E‡àî6Œ´hÔÝïÛç ›0—(àùׯ»2SVfÎ~êQ¹y™6ß±¹V[¢éV°•I_ÜO$Õê²ë¸ß¹zå[¨ >œ‹YËÏx÷6I0‚!_(<`^Ž~í¢:ñŠ´ý8÷>Ä¿Šs¦öT°½mSe8ß<÷yCÀ¢ê#Ý}©Iº 9@{Ÿ¿"¨ zá“‹ßJ†å—ú ÐwÇ`ïÁáÝkÕ]¥½®lt/ú! Œì¥7/’1e”a‰û`~çE{þ9Ú‹`yLÚ0¶úAEöè`Œ'atöÈgïU¬s¦ƒ µ¸ßH€{QÙÚ‘¢w¦4ìžô‘àì´¬º¬oªÔð}-cÄ¢·ÎºÇާ,¤)½ZúÆŸ9Þ÷²zP±›—£ˆ,{ wÞõck;ÓÛy3ùé…ª>,;â‘ µÚkáøè3‰²[v|(¼JÄÎgFHÅ8¿†àkLÊ9<¡Úá‚XoŽŒk3/Ç}g.>3~±ÐÊ­&Â,ÔÑK/Mn\ù|7h[” {º!ìB@6–†)½ÐU~¤FA¤ÚpDÏážø9Þ¤¤tNîëPvJ>Óm båüõ='Öœr§!¡n%ÿ±¬W)žS²ŸÕÜž/~o†·õ˜tѤ$<×<¸­Ð×c¸oT*ãøt²i’‚gÙ™µ})bYÛµ— f‚N,‚ÈãͯÝ(³Ÿ÷é ‹%Æ|†² jCXsn_K!â׿>3,r™N™}Ú¦šó\CƒÓ Þñçæï6Ì;bùÈÉÛ« „-8³ ¼…R­ûù`Ȇ®•( N†ÕCpDÈOlœ‡ÕzÏk8ÄÏ•ŸFEÕ|žêQäLSÔæ}1¢u‰ ‡q÷mnèCGµ^éí¤Náqúî ƒÚ…µÅfÞcê`Sƒ[—Óç´d(ŽF ÿ%¬ÔÓ·…> µ 0+ýmðý«öKe2ö]ƒ¢¸Ô½MhFx­®0÷¼R7„.]4¯Q$ã`ÿ![wm[@ò˜üø¢´îB|!‚ã.Zo ø þ2>ïè;KÖ©z«»äê|}Z[ï¸o¾ÖœÆZ¯(T{ý®øWÈ,®0±p ˆôBò»tc«/줛uê±åTÀyÐ`š•a¥ÞΨ‡•‚oWÀŠFÐT¿æÕÉpa7fB1¾¢7ò:ÖÚ~{âûb&œb­eØÙY¼¤jRùƒ8}'m™6/¿ˆ%îáºTeÏ’tã9b½gê§ 4Q¢fÏ Qm§ùIº˜µ1J—d(CRYÏOs!Ìnp«òqø•ã9X†Ñžbkƒ€<Ë…ÍÔ¡N¨¢í•³¹²>…s!Úl4c/ ߨ}ÉÙ`3tǯ>84/g.=Ö!.›¹ž|Iä~åP æT™Ë3<ÊS¸È/$¤zÜØE`«„+~­b£ 1^Îæ©÷Áð ÆP|PpÛü–­f…nTy¡Qsß ï'B…‹:>W¡™@­™H m*Ì™cªÚ§=¦vœi"­\EYbT©Ün vÒdÌæÊèÌÄ?eLWŸ3èwÆE’‰‰û¼#4Ž<‹7Ï«nßû‚5)…ÙÂö |zÒu}ýŽGJ§¶ÿ"ѳT¡xÜXÒÚc“ ƒUèÏÒ/—O9y®á÷3^¨4¶‘`÷Ô[ä>Àоû=9ÞKî4Íç¦2rx©Šì´ß¤–oé€J}-p´‘˜Å}Œˆïr«¡aŠ+†¼ ažÛñ¾ÑÏKÍb’"bçAµ@"×lûx%WÏ 'ègQY«†“o º[FÙy%5+ƒ¡n »°¦6–ãÁ9ÐÞR°âÌÁÖÉ_ˆlaûûÝ6¶+ñYìÔyX¬#£8 ¨þ÷°KP2‹½†¥`ñ7u¥ìÙ›• S?±’vœÑš#”Ø}€ô×­ûLZr9å_¯{I¤o1Æn\¦Â @>1,ûpá~6±v %øëBÎ9·n\y.}`ü¬Ž`X¶h^”àuß ž?÷Ó9>Ò$£ ›±Oë•và›•óÃ×>t³Rm6¾ž8•ç·C¼ýæSQ©á!ѽÒ2¢Šw)ö0Ráb´œ ‚AúŒý-ëÝàý°*v¢h^E¬ »Ä;•Ÿ;£ðÜf=‰][ ÅÓ?0¶Ä!ÖÔÿd¨™1©HææÈA¦†![’#`H(C_€ÇC ,Â$üîŽ÷#éW.5G‚ĬjRÝ·9;Ì,Íܵù`eAÞ…;¬}Ó5M|ü$ ¢´v*._ßvΨqBØEo8¬H~Ø-DDûéˆ&º2l œ"U¨ÊóXfóé6ñ3~,‡P*¤¾ô òmÜ»÷*,8­Èôsª«šiú+á„—îGC”í›wÜ~ºüä cFžå+m¤ÓmÔ ãK58ˆX¼¯Fù %;¹hõ©ÈÇ×F|ß÷zq Ö^üdhäzNs÷»¦¯¿$»Âk©#;Ñ"Ú"˜D…,ëC·¾¹N@ÑÔ–[ö\ÕìÕ‰š­O#ýp‡Ï0´3¡4öÝé R!ªVüXzS¹V²¦Þp8²¹M ³·{`¯8þË_ÎŒyØ†Ô öCäÐg†žÑ¤öœ†ï¬õßb(=½'n *…ÿè„ÕzNÔlûøÙGŒZ’“¸å‡è$œ¹%Þ7Ujáp2^ûÒ“YC5A wn_ óBÔ9q…·üê̓¬ÈÝY-ÉL¿Ô ò1\œ/ö·Y1'ô›)f‡&&»qž™Ü1Ý1Б½;»øè ë]Ä>FãsŽ«1bÕð0ÄÐ{ÇW&•KEˆ1üDC˜qïvóáç|Ä4yƒÕµÄ7\{¥P3'J‚Z2-hœûŒÃÁ/^y4èG:ß$ë5ù< Y5`PÚJ­ÖÜ“3„²2îœyÀHÛÔ¼BÚ+µÃÛ§ª|‰¬§¶üÙQdëÖɸsKp;Š«âì ¡„R­IY¦ÓÇo…¤0²›eŠÌ¯8b0â'3a¯”vot–•Ü ¿fÃy©zP­6.¤FÍFÿÀ › ‹PG*Ž?‚×f¶¸š…ûùEu^Åá·¦¹0k;ÔøõvÊ4ʬ •è¾òe2‹kÚ&ÞÇuí%¹Ûýæ}Iæ/¹ûÔl„l‚жP·TH ëˆ1)åpe ñ½æ¨¼ux^Ñ>:ÏÕlÝÁo‰û¥b±Ø¦´²Òóh±›œâ‹ƒŽIÄð‘¥Ò¾Å#48nnû[ò[™Z\ž7=|[…IÏêv¦/ÂZßù'Æ`ªîCÕU”C£ª×Qâx¿MªYœ\xj\œÆØúÿ4lñ&ØDˆÖ•Ïvb®êeŒ® Uz™9õ9•ËÒ¬ÙNOl4qnQرúÝ'”ao^GfÜŒ)CX9™OZkë†âaRI2oX.Ï›v‹R¬ý€4⎞›£÷Q<ìÆ~ÉyI´ MJègïR¤ùZÚ)”èò&¶d F»$ܹD8z~…ÝjœDï°“4 wX6nbíLQÄÖÚªp8Ý£WD]{4m0ñŠEÁÌrlŽÀÛ‘·Rl[«™žtÏ2åL™Ê›*cš"ŠöYÉ-Üwدé Z$ËœÊÈ1=Ž.<_ÝüÞH!¶xÿåv%hê ôƒ/>ŠS ÿI/‰û´ëŽR^aé’%R`™†ƒ\Š}Ž3Jo3×si…6ê‘—û'@Dñ Š kφÂ-:FüÎ0‚è|éø¦´_OødMí4ØZþiÙDõî!“…³€ õx•¼kÓl[¾ X…±‰ºïnü;iÄq‹¾ qpj9×@¾IÑ }ñxí=µ?†‹nã)>€M%„†â♽-ÝÄ‹á›k=ÙP˜1sˬòôÃÃiˆñU½Î&‡T¢u›Ýßµ’[ˆ¹lBäì* ½:KRCöù;þÝ7#Ì!!YvÄ:P¼4½Ÿ/xÔÏ ¸%V…l FxÄ!øÚžHÎIŠãqƒObà7!Eù|Ð.BöçK"Í4µ“Mêè7%Ÿ1œnÖŒ׺¦¤LÂ:bõKŒ„Ž]e²‘É+„ $ê(ÌQt»ª‡ˆÈ‘¼±Ikšy„"øåžÁ‹È}ù›9Ñ¢ð¿iÙá饩Ì77rhÍωa¢Ê˜Ï˜AžðÜu˜ii×Ε\á%wÏVþP ã÷àŒ†p …ÙEÕßîöüÄ#ÖÍÙžÿƒ(Ý-ꓖň‰ C~0W*¿0ÌôO®€Ÿj½;–oøš°Ø¶[©kekÌÙÝϧ±™›ûJrT&¾Ó8†^}-ÈñÃõÔÃÃÇ´TØ]t@çZá`&ç†Ô{L=BßWßN”Ãn!¤ÈÑB8ù©T"#0¬ô0[åGƒ¯Ä¡¨å©úL¡’¨q ?›fªûÈM)‡Å¥÷,=E88½#¢ÌwžC§aCéê×O?N«0á8UœB>×& Æ¤X ÑLFf·±)<ä’e–Víc¥ÂMwÁ«À®Ÿb(×Ά, 9RLP ¦JœŠYÚl6o#ݧ|Kï<ûøí̵HÍÕæûV‡C4®”vpÅéÁb é·†DÃʯHbT™pÀg&¸ñ…ÜŽ“L:ÐÞòSO!çŸÌÓKuYIÚÝâ¹Yg¸E®QzMÇ2i“³²l©yft~ʧ&µôø¦†Pªm¥i~|è¾ZXäY¦†¢²ËøåÍÙIŠ¥ÆðùõbÖŠtì†e 0¡çq½eÊU$ÝZˆkhûNÁb¯¬ L ïôk¯¼†å1nËýíRÓÍþ±’–Ç}{è,íq¤ä0Ê¥÷ºþ‡8WÍzGÙBØ~8×Ar³ÜeNø×²T_lßñé´b GðçÁN˜S§üi¤¾®+LÏ,Ê £k‡‡ür Q~ˆÁ¶26\ñªVé=Ï“~f[eåÜv\ ž.GMí(Ô¥µFÄÓ™¸Hb¢˜5TN‹m|,¤ø)eGò,éõIQ&\Ì$˜N¦EÁ)îù7[³Â-¯44·d^©×)xÜ7ê&ö˜-‘"rWl:¿lºÍQïR¶÷ò¬³òÓ"DC<¤jôŒEö‡¬—˜Q/R)¸Ïã~¦l6µB´îˆ8–‰Z8×5äÁo]>Í‹5JY…|ê8,±4žYU‘÷ì†ùæl$@ïÚûF­>Ĉ” ‘l|$½’u­ Àýßä)ó®6m·þ½Gfs$œ@WºŸ]n ‰ï‘övñ›m:¦!LT]Ò4®’æ¼MµúV Ëô‡—pE«ä‹$"¶È™žU‚,'æj,%KèX>0 ÝמӞD¦÷žB©vk}†–äî3…IptԢɰú¿×¶Õ]‹zùk†ü$jz%[YJ¼ã?à1(;}—¾MbÀÃuçxX¶ñò‰Ž2>]ÎÇddÑ¡ Á±Äˆ´õÏ ë¨N?a´<ät¦NÜ`Æ¿_åu8·ÈA¡Àñ’I¦.9ÒkeäÆÜá•bk|/øxPK±—˜³Qý}²CàgE0¡ŠØÓw׈)߯bàó¾‹}Li{Aî`‘AB%¶Fâe¥¨×O¨üË£eø¿wq¼x*Ž£fƒ/„e-'P‡•?'ònÈqt}ˆu+O¿b<3.·¯ž.Å?\zÕ•¬oÒ÷‹° L-~‰ÊùÔ4/S‘Dú¥"Ù‡íe}Ç4­îαþ-ká³!%¶(¯‰qtT´v7‹»":ºÞœ”9ø™:‰ßÁ!‚vÊ}êþAþ0¾OÖf )5¢˜ §ñ¡²£a(¦ö ÝV°.÷ÙáÌÜF”}°³Ó7Ë75–¨&Žîùët™8¸yšî¬E Î8¿Ÿ[VJoÙ}ƒS²žZO88W·lÈG™TmãÜšZ ‚ôé™êîú‰7^Ôù<;®¨BÑiî)D‘…Á >]˜'Vðø²÷C‰çv©¦EЉ&ÿ¦QI¸(“ДxqÑG<•r?ðvnÆgNïÐz¿kåJ7µÆ>å§$<()‰°>õêTl„0Ÿ@™zêÍ=?ÈN/–Z¬†8ì=³åÜו ¡žlx9öï±ø("9d ¯m~ø÷À1&‘øfAóª¢6e£&1œ½ôÄ!ŠVoèh‚Mu½-Û*~!­ëÙ‹.Üž×d·ë/Î_\vÕÖþÙLhfe¸ÿ;a.66Cóò ë›Sã´:n3êÜ5 —›ŠY6Ž‹AOÀ H¿mÒ£K‚›P#ýx3 uÓL4eÿ· |vX¹˜w+»¶Q¾ §O¶¶]€ÝPç®É‰—}E«S‚nPl)¨¾š;ÏÈÉÜåfDÝÖôŸ˜Šžs"¯"ݧ:–à:¶GÞ¶öÄ Y¶•-u/lgƒßóvü]µ…Ä ª7Ïsx`Ú§¯ªGs¾¯mÛíݾٵÐbû}VvÝ!ˆ”ŒîtE7è}Í›&¥¿Pa Á)Ûtí° Ÿ@ÒOÇâQä(s §xtý@!(0²¥d±ÀØ£µ ÕÒ-]b(óÔà£Jwð`èx‹âm-¬ÕKܧV›%yR&ªQ ­3ñ>…!Ätûú Wx£[±Óù§þ‡¨.ÙËz•wÚ¶Ä÷ ’ºqð­T¼Á~Ô©)˜BSqU5kÊü*…¨jƒ%aõ!¤`v[ævsø½©¼03;¯º§CÔÆ-LÓüƒ‡0ÁUèØk8ʃ.©ë…CŠÇ¾üRÏš$.ëy¹kWz_ ZÊÍb|þj>ì ˜ûlµ‚$³ iÙ–0Ý L¸= è§©KvzöáXE»Ù-m‡§CttLòÔ‚hÒ:jê¥@Øy8Nk`»:ájuQÿ‡«Ç·½»èuÍZî-ËXÒt[ùšÕ׌Úki„œ·ú ÔTà©Îècû¹Ù~&qT&g0¦â%Ç,hõû76RÛ&Œ¦©Ø;F†«ÈóàzoöWg‘$c÷Üí;ÏV!ŸE˜NÙíêõCä«3×åÉjZ˜·kDBm£’‚—ÒÔæØe:IÀ:ïòàK)ÔÑOÖÀDá,öN·A¿p 'ùL´J;éwYeÏEY£ç=qɪ^ÞÈÐÛºp˜mŸ'Ùç(óMÚLL ýžgnž®SÔžêÇ£Bœë›ß\5õ¥*–ögAi|èn¸'üN'Ö:I=ÏäœØí+u‘¸!•“ïâO-Ç;xGíÖ¿ú ì>†'ýWiz„SN)x[møš_[»Ο¡Ë™•ÍH½ƒ ï@ªOòo× Ò›Â4,@/8rx%¤¤ »Ýl±7ÉMð€–¦›´ï·„tƒ}LC‚ˆ©)Ò逛ûæ<0ñÛÏ”A\ÍÂô {™qrj“ÃKèj¦Z´žQ1uý4½fê ¥çIúlR˜£¶m°çZ:²Jz¹Z|hcÚõâ{ññd0Lí®ôë¨28ìH¥èڭØL’iëØl¥"™ÅØ!D*IJf,‚VW¢Y¤aÞ/-%Ks_Ë!o‘r2ò˃£Š¸‡<År½â%?z¬¢­ØÆ«ôA84)`Ü\À¢zh`dûÆÔS%°RÉû" ¬Âä«PŒ–I“K–?®pf!^žO`A¯…ÐÅ– a’PSÒS­š‰¢º[Ì m&ªb‡ÐwÔ4Îú>ÞèB`(o•œäȲãõÔéM_]ä_Êvݧ¿®/y®n}"OW]»'=_\&fU7’á¸%O·ËòÆ»XÏtð+¢¬Zem'+´B§lébåà «ÅÅ`žRøžkÚª~™$$Š®EäòJ1 T,××>´\Ñ/\GÂUIÒ²Gè#‹àóF+%Bùíî˜ú#lœQ,BËi8úô™¦Ûˆ¢FáK>ëÊ/¸1 êý~0ÚA}ËêÏ¢ž0e]2ýXÞ&@á$ÅxÔ•ÐcQ&T‹'…‡ šìd‰ØwÏÆì;u 1DÎÞ¦e† ^Ò ¿~îMm…K8 hÇ<8`n öÈÑ’'­ØãòŸgR¶Ù}¯TíàÌçU·)ƒpÅåCS³âKØ‹b¥Àˆ¸_ÑÄþ)³`eTä{‹•Á$õÜ 0)wŽÁgäA¿+*+œÁšfÁ*•{(‚a1ÇMË0`V•å>oR°Ý¶3”¦+.*©‡è;ãf[à«Àߤ‰PÓáš oöeƒtñÖ¶$åä…xˆÅ˜bzÆ O /Ÿ‘w±÷Œ`KÎ+ä*áç8a’ðÖt£6Ѥ!‰xżù?a­&@ŽJV‘\‹‰b–¿¢òYû÷7ìNYÃyõ75ݯlµ/Ê>³~¡ýÔ'2Ø*ŠM¯À‘¸M†³eZ¶UÇøöÎdF§¹ªñô:3}½×¯1§ /©ðžÂ€,Á³ù: —Wä”vBÔ‡ï\‘ƵÝmf·=¯†ù±i¾i×eØ…e_Í©P½En~ –F׬œÀÌú£Ÿ—'oÕ[èx±oL9Jlšƒ„3 )ÅN·nõÎù~U y8].ã¼è-bŒ_Ö«y¼Æ‡Î*…\c[>‰AZÌÔqðÄo8ò>Œ¢Èè›,î’$á `žÿÓ٧ű~ÈGšðõf"á÷AöG(‰R©JÔ¹A²/qË‹$cp¬Úº5yŽÌÉn„Ç"—×!Ü~ŠST•‰¢mF¼Ee‘ï6VÄvØúl'z>YÜþyOPÁJËQùÛýj‚$~f‡%»·ojrƒC•öl¬NÓp79žNl‹`õ|DhļÉu‡/Ié£jJï<ò/Fè$–8½O¤' A»Ôõ”-°"8#ã¨Íè¯âˆ?þíÌû?pRd&rC"ÅBlÞK!Ä4æÑ&ÒØ3„ÑG2N,EX{ˆkÞDL$'uaäv;”B…1ºcÞ¯¤0f÷GÜo÷¹ïðMÒ³Üüɺâ eޝsèGßИîæ] ¾"–Úw2Œƒ½7ëî]A¼‰´g(ðÛ ³!Á+u»Ñ wŸímYFÖ]ùe ¡=bÊÿ8¿HÕørJ!óÖYŠüy¶)ì›eàªë 3ê‚ ÞÑ:"×L ?ö%ÈÒñ3ˆñŠ*Ì0¼¼­@¾D„'õ¬åR5#Ÿ“&RSñ¬é#T¹³:ö-o5̰ Ù°ÉØ´zZÚÀ èäÊgŸ+Í—@·¼ e~ÖÏãœð¼Ê¾+øˆëYèôî¶>uε-\J[ 91A]žŒÝâ·3Þ½¹ÞuñY 2³¤'Íû^–ŽÄºŒž7­Í'×êNù¤('aä/s‘C“Ÿªx-àY7'†/†¸¢“ñá¶MÑ¡8RÛy<·œ=ð¥æ YúL6®*•vg\Dìõ<€Dû‚`‹±>™Fñ|äÆÒåªáȃª0MõèVötå“2h ÃLÞx‹‡ŠÚêmîZÑ —ZÇ**>' _‹¡PñÖá4§±`²}9šóœS¯Å¥í.Ãk¾Ù®¬ì¥2>¨äË@äoQx:59¯˜‹9Ú8ˬ;¯“Ët¨°¦)Üów!&ÚÍc›Q½êS9ã1þ·b¡^yìÖ°Z}ÀÝü`Ÿt®ý=PÊã“ùø$»Q?…òô¢ÃÒ ô諘RCïúæë¿U‚][Õê»áV3m‚²¨ŽN—ÛžhYùãÆRæë¦‹ÚœSiʳª.‡ê¥ú>gÚóâõ×Ë™Q4ÝÙOO¾pÊÛù÷—a§ûõšÒl¯åù°§qó³àët5ʼ¿lMË‹M ¢%ïWœ’ Œ›9:‡\‚¤•ˆGø5¸àûn"±ÑRgÎØdlŠvÜ6ãŠÖº uNŽ×¬Î;±@x_!(Ö ¸Ñ×û˜eR(/ Ì管jC°Ï|Ô ùm_íöƒÄ¾xºŒÓÔÁQÆv«öÒ·ÊÉZªlÅT7%2á.Ý´TuGNŠ)Pa#ñ°9®/`¹Ä–[v;g§ˆN¶<¡èßÐÆp®E«IÖ78-c ôþªÓïãÝïfê*¼Xµ–U±à]õ2Gpgƺك謢ξ³àû¹¤Š‡ÆôÛ?Êó¼\¶`+28›’ZE6¡Î x«R¬G®ßÄÅ>½Q±MMÀ¹ºmÌ@}]%üL'«ÌØã¤ñ¯±qÆÙ~̳éqF¶p5ù‹qÙ_BX~DA{@%ÿlÆZ lî~{ŠóÅïKÅÑÍÁ’¡øCá0MM.ncú––^@È€²rù¯íIéåæá kW‰ gQà/dÇZðÀ=Ó£h«‰í±t’žmGܼÜÐG”rpÒÉÅ,ôçÕ;6mf‰ÄÃõZS ¥Ú¢Û0ÇÇ—~Ì„’¡#Z}!óvñ5/ºd¤-“ê/vú¡+û :%•ºöI%í‚FèONOf¶$>RVŒD)ø¿, + Þ¹ ÌGo§× Yò‚£è©ÂP»¾ër­ É„o½Éeû\‹Q~TÉ^]Å•äÃz=bɈIܨ% qxz]¨fä_ÞÁúuÛ1û—ÿÿ‰ $ %%ÄDcI‘€\”Õ endstream endobj 9 0 obj << /Type /Font /Subtype /Type1 /Encoding 2449 0 R /FirstChar 11 /LastChar 127 /Widths 2450 0 R /BaseFont /KTIOOL+CMR10 /FontDescriptor 7 0 R >> endobj 7 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /KTIOOL+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/ffi/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/dieresis) /FontFile 8 0 R >> endobj 2450 0 obj [583 556 556 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 500 833 500 833 778 278 389 389 500 0 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 0 778 0 472 0 750 708 722 764 681 653 785 750 361 514 778 625 917 750 778 681 778 736 556 722 750 750 1028 750 750 611 278 500 278 0 0 278 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 500 1000 0 0 500 ] endobj 2449 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl/ffi 15/.notdef 33/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk 43/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal 62/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright 94/.notdef 96/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash 125/.notdef 127/dieresis 128/.notdef] >> endobj 5 0 obj << /Length1 1880 /Length2 11971 /Length3 532 /Length 13011 /Filter /FlateDecode >> stream xÚíµU\\M›¯ ·  »;w î§qww×àîîÁÝ,ÜÝ%d÷óÎÌKfæðûŽöowŸôu¯Zõ¿ê^U«)HU„MíŒv¶ F^€¨¼ˆ& +€…‘‘‚BÔh²´³3y,<<,ags+3€…“——ƒ‘ jgïîhinP‹Òü3ˆ lt´41²È,€6à9LŒ¬*v&–@;#@ØÚ üÏNe ÐÑhʈÈÂ0µ4Œæ–¶ˆLÿIÛšÙ¸þ£lêlÿ_—\€ŽN`)5X’V4µ³µv˜Í™ìÀY@°ÉÿRÿsr gkk#›¦ÿW—þ×u#Kk÷ÿagcï :äíL޶ÿs¨ð?äDì¬ÿWŒ4ÈÈÚÒDØÖÜ`þ’¥“„¥ÐTÑdb03²vþ«´5ýŸ à¶ýK€INSK[VŽî?Ÿç¿.*YÚ‚TÝíÿ=í?£ÿÅ,o ¥@‡™‘™™<üý¯_zÿ#LÜÖÄÎÔÒ¼!88FŽŽFîˆà&€' ÀÒÖ躙mí@à[à–xÌìÿyœà'Îdö¯Ú +-ÿll&ðÍÖF6o%“ƒ³¸«ÿjÞ•ÙÙL&v66Fo“…»½Ðö­Ä `²ßhgúVâ09Y9Y¼U¸L@G»·8ÑÎøoæ`0\ß®s€—²pþ5âŸUØ9;¾ØþY–Ë_#ÀºNàÿ›Á²N@—¿\ÁÝdþ·%r€Um-ÿáþgÍÖvo7q‚U€Îà-ýï Û?í:ýs‚ߊà4á7'‰¼8EôÀboî„ø¿‰ ܉7GK¾¸Ro–~#pºìÓåÞœ.ÿFàt…7§þ7qƒÓßœ®ôFàtå7§«¼¸óªovQ{#°‹ú]4Þì¢ùF`­ØEûXÿs‡š[[ÍÞ ç^øïUpÌÛ®åÇ¿8Æäíp0ƒsLÿžö_øÏ®û ÁË6ÿ Áë¶ø Á ·ü ÁjV!ØéË_–²þ ÁVo’…leû‚­ìþB°•ý_øÏ~ü ÁVŽá?Çà/[þB°•ó_¶rù ÁV®½HÀVn!ØÊý/[yü ÿ÷«SDÄÎÍ“|dXÁGlÌÞ²ÌÞÿm ‰³£#Ðô¯%ð ø¿ØÌüºÝ€&ˆK v&|AV©Í!e>â3å0´"æ-q =³]H?ã!­‹Çdh×ê5+20Q÷`öˆ]Ÿð":½”&%ÎýâÒæ_ö\ ÷2<Úð5¯2äÝwíIïßw4ÏÝœp@~þ±6^–¤U8˜}1tœ§H-¦º·BÑ«ãÒØ›ÄÉ¥)‘a­\OÉF¢Œ–æPƺꊖ”½:èc ßJ÷ëÒ®Óã±>7ñÅà餺á½ìYŠ;ʶöcÜÄ=FŸ^iĶs®|ºVLÕ“±Î q‹ŽõUTæÕ5=H7½ºÛ~¹z.§Pûá3üGörÉp.ˈö®B5ˆº¸Jßé–ÕüN Cm…;¢‰‚ YÉצ0¾ÓÆYÔ˜öo€4d2JÜcÔêLòW6Ùà¥Ø…`ñçªFßt"§¸:Ô+‰¢š0³4REòùÝ鵦Ÿ'ãÉK"ƒˆœü…qbêhŸ¶ ÄÑ#¾ô4”‹'¢)€ÿ€†¢d$#,úÈ]yrúß5_WJLjsâ?lרQÝnO¸£0™Ë PÒØ ¼cÅ×UÓ#×Ôˆßg`1+\j¨¨£šAf±yÐåÏ•»øEQÂ*\cüÌ §ƒ$ «:íËŽ‡ÿK€Òµ7ÉE¡Js0ø&ç^ôêý×õ%ˆh3”]¤ÌÅüRÇôN–³E4ü6õmXѼÌÄ‘¼‡¯ÌH/šf Ëúƒú8xä³-pçs¾’\¦‡™#uhÑþºW•UÖ&ÌÁzæŸ#Zb ¾úæSVh\x x+xm£Î¶£0s bE—.=²K±c=—n¯äXKæœe çªúŽÂšà}Ï:äÜЊaIø–tتMÏŸ;V÷2d¤8“x8°|aÄŠÞÊs¢ã¤BË)”gEíØÚðŸ¼GetlvÀäö%"córÞ§±'Jœïî1A^ñUHvd;AxÀÙ³ÿä“„†ê$8d”½3"ÉkƒO·‹ÅpœÜ›7¡oú£ªÍO’Æ!(H)_|õ®œ/€â°2F‚¹ö•uÁý„ª²*xˆG¡ø¬Ùð,Œ?ÒÜ‚ëð¸p‡®ô(Ê÷ž°¿ìâ ‚’¥}=[&2¢åAP½Å|cSÎË÷æ¼:³ÂgÌ}#Æ3&y/Yõ9ÿC‹÷Tï¨BÀ’S_Ï'}øoÈ >%BŽ3•º‹ÐÖ\õ¹ëjNyڧ转9òlôáPÚd’H±'KÛKÙÇ™£}(&¥kÅ ëA;[R#W¡ÜË£‡Æ M¾:jC ,íä^‘·C¬á ÁN!΃‘t±uF÷%hUÚ-â7·-€3Ö9ŽÎ‘°§íÉÓh´¶¨¦«À 3ô‚éè—jyVO„zké[õO­´RŽ9ùˆnHLùa4˜1[:g£½·p²4%Yûãv¦œ^?‹ÊX” Ý *ÿ¨‘°*häɦ6ÛŸUóL`ŠO÷RÇ âý:âºjè˜9Htľ¼0KùiÕõt½‡µÍ!ƒ‡¬zÖ«¥ùà’uÆþ)&>U[ëRz“Pe_V€»;󆎖SغvÌÿ0_ëR±j©ô¬Ä1§ÎïáGÛïY…Hî$‚[zôºÃ̼—|  àæ BÙÁv¡ëQRÄú”G`?*½2(\u¬‚‚òÒZ"¥S¬T÷/ °±'“D‡‹]Ø>ñÌ¡®²ûÇŸõ}Ä\ëNù¼IP•x“©m@“ui…ÓúziÐÉZœ[Ú¤•“XÑ×ñûÆ2ÚC“×SÓœ ®ˆ)R#®ŽlœÕ÷7ŸêîE’×I¨¾®Cø—5ΡXu7!«œ_ê\Ūþt3.üÊ{n>Ä„úÁüùYãÏ V\‡e\äðú`¯õÉŸ) Þ´¯ó:9ñÑ1°“<wÓ²Ôî;õñ4VGSF– òŒ2#ˆyžÍоÔÊRµ>Ë:„žw¤‘à›1ôRD“«ó•†‰ Ƴ je >˜ÄÍ=ï3¹.V•è ![RߺŒ‰©‘ÀŸú²Ë¬k‡~Vä ùݲk½Âï>処q»ý˜’f­ {¥îV$Ï3œ¯l]Šû1Êw¨ÎÜŒƒÚsò‚ŠÖˆc^Äz•C§×dŠZ÷^S|d>“·ÃR¶˜…Y1tT›28‰Z©ñ‡¿›N”OÝÃà2C¤$SI;§X§tVW؃HÊžÒœNÁYR ]>˜ GøS:íØ&žˆd¥ÑžÀRY4;Ö]wbŒ¹«ÿ—Ío—Åf~š9ÙŠ¹¹âbžü|ÝÑÔæîÏ{:9^ñtƒ’4‚Ö×P™Šèn!´™¯¿ìKðÓ)OH]ûæÍ.}w>3”iì9ñ"$²æ¶ˆBbÊi/à-Êá.«Öÿ.R“7½î:e³»€¤ÊU‡4…·ToJäpç8Û†æÊ¢¤°Ê¦n>ÊmÍX¼|y‡|{Þ÷Ù¶^·pT.­^Tþs® ÜÎúÇ2`N ÃN_f=É`Sêʵv–ÍÔv™™íV#`0<+·mY&›Õ"z¢~¾|aŸ]‘ûR9ã•Ç}–Ɖs£ýýøÈÌÚÖ²J*)TA_§šsvo@í·ÃÆ<®ª³=åü/¢y®^¥AšFÒ¡Øé3îFrèˆ)2DW•]k*Í,ò5“·¸ê£æ"#,J¶Þ¼’ÌÐÃü—wãx}ñ[äDE–ÈPFÓ9Þþ5l!½Ïõã{b¿3ò¶m|:2côþ¨½Ê–ëˆVfU‰o·|y"Næ²Ä,]*RßZ%*¶¾Õ¾Ð¶†®Ãò† lsð?^Ó!ÿ\rFâ}×F¬Ò¦Ñ;¢ýB;àV¯ÒbôÞDi‘ÜäµÌACÂÕ£ÓÊÙBŒ8_. Î°èÙè¡‘íòu`AèSY@ŒÀQòêe‰ÌûÏROŽR=áM¢[Î.| þLßÇf£) ŽèEIÒ4r¶.Dâ?3Ë+ùK¥|CP„ê AÛ:ÅÒ´£Îg²Ûç J€»÷:8 Œ’ÚŒ´$“ÔCÉíT½âµOM1¶ïÕ|ÿ1I´Õ[ŽÀî¾HùK{ºigd=ˆ€“¯ÉtB¤è…£.9våqÞÀ¨ý&“à1}- Ûî2¦ke‘Ó0F'+»¦m¹®àÖmî;lŒ âôÝ;«2çÐþì ›õåJ,šbÄ)tlÂŒóÎ*Æøt Äõ¸ !$0ƒáåb(3+E¹ƒ ä9žõÆCJëÔÒž!#Â*Ö«Õ>TÄYÓèC üü4öU;ü”æ+^)KÌÄÞ— Ñ*%)Òòrœ,ž‘œËÃxæaˆ™ÁÜà­+’ÍßÁ#ýµŽeŠdq›€|Ïm‰X rp^Œ‚c¯¼ ×P¼”–Ð&~g þü’b2·3­+=#‡’¦³ DRËÙOF—3à R9c›‚5„î~Ýš×DÙÓ´‡bY®€½‡XBé0zx‚è^h;ã±ä'ËÛW Wb›L‘^„L2d{ -0/­l·Ó}°;\AÒóéÅM©Q¦¸³ŸêÒ_ãa;„“x4P²ÒÈ’r~*œ‚ÌŠ¼Uø¬eš†Ó|8‘HlĪ8¨L‰û‡Ü¦‚· #عÁm9(ä3)º>`ïe§ºP¹¼W¾.ÌÇUéj¿­a>àÔ%Wí€ ëLôÄäxh$ö®~‚M¥ç‡›[@'sÔ\¼=¼b¿CJ¨¬>§À^mÁ/@à-›…Ñšb9-^u *åÓ w0>ÖìàùÓ ‡¬ð®¦º³Ûäö)’@ 8Ðå•£îãÜ€–ÉYcéfÐo&ö/f*ÛýDÕPaÉ%ÁJó¶R‚ƒ°@½î‘¡{Äl,7:gÆ{§ª–¸›N ¥:òÉÅãY!U‚¦´+2š…8ЬžzcþµwtÙô.SÉЊ¸åù•ÒØ=ì":ß\Ñá8Gø3úÑt’M)Õµ÷&hÊÿv§Ž9Sº†¡VN¨2af­³F=®n`߉C.mæš6 …ªÈ™âüŒ…z´£¡@]f;Uö¬Ë“ÈV%¬Ldᣊsl¿|eB_½äï+2ÞñÈαd[ÿh¶ê§ÀqO<:¿Ê/¸æ»:V|Ù_çýzD—þ aÚÎ×Úfl~NWÉŠŽ_!‘^ª÷­\Ž}#"oe ¾âbÓF5íS"‘©>ÖlufÒ.á.¹¯ð‘†ø¦¶Ó&ÃËc›ÙtnDpØFÔXöÛ·w¢ºÁ­èît |>Â3¦v¤„mj3^Ú9º!”‘E~ÀöˆßÜûR'KiÎ[vÙ·Qæù•»q}èB˦ïÓuwÓ†«C°ŽìŸ£îqKÚ·zõÈ{ÞOèO ·^¾DÿúøÅÈã"lò›˜øpߦ úÎ(Á}©È‹T;°ÿå Y„çékê¸Þ2†ÅØ@-Rô <•0Æá)ÑŒýôœÍ£¾FV¥Ìާ(.ƼÖ¤Ïg·+m’·b}+ä骬g"È-ÙI¦…u4[²_À{˜³§5|:Œ¬ãË¥[†` Õoúígägî‰Þ\Û–ü™È¨ÍfŸ¼G¥! 6Þ‚k„%ÏS®)á”O{ÝÊt ;Ä‚ô“¢ª=ñ–‹XÎ襯@S¶–Ä`›÷¡¨¸Ù\þâÍÎVûqK€—¢]{=åK{ÂõÒvªÖ°ÈhÉÌ•fo,´ŠF¡Äƒ?¢ð„‡wTѽÂ+‰ÖN±'…Õ"@˜˜ Mûvs¢ZËv‡F9ß@.”­)«1Ñ51 h²ÒO±}µgPë@93‡'ß©©F2 @Këñû¼éZx‡šäËŸw++‰±ÁÛ”tyà|w&Ù¤jh²÷åÏÈ Rd±Š˜¦aåîªÝÏå‘™2R÷£(Úp¸ó‘Úý^דì P±"tí‹ÑÿºppêGq¤ßêÿ¡ðì¤Æ©š¶»<§k:â5'Zߨ'© =æR¯Ž ÙrŽ4/ÈTØÁ•þÐây7X¬ÒV×okEQÈ Õ¥èàö‚óôMAÅŽ#Ó¿©A¿Vá"½0qH+±Ý/.ªîäD£Âÿróçö¸ àZ@DÅêñ()’µÀ–Xç©7šc—8û ‹T_½Q¦ ï#²MxR¥úYp$—¢h;k%eË»ÁBtBÝ<ïŠo=:û:ñ|ÂÈó¤ß¾?•V ¡Hsâ!²ës$pž^î×ëw“˜k8ha•Ö}î…½ßUäÛzëËéÇcÙ 9…ÿâÀJj#@¥+…½‰©)>—.¢Îó¤~Š5컣@qþ#&!ÝòpݯVÔl¾V¯²*Åø£øG!ŒâáÐ ßZ­à<7̤Ï/Ê Æc‚J5®9²_A(<r x€† LíT7tLʘ~43§ëþÂŽKÂÞ+/ Qˆ3Œz¢_X)öAQ(ýñ_ ¢ô ÷ÔEU4!á‘–‹›íz‹B¡ ±æ»õ•DPZ ‡%²!º ñžòêbèJ„x‚ª7T?ßÝà\Æ® ÊP¿¬¤›5ŒS¸©ÚÍóK“cÄ{Ó±m¨¥*4­~¡«÷_ªn¼ŸRÆ-Í%"Ë!‹­}ñS×a¹ù#c«õ¬|}Ù¥£™W=bMìPS£Ž©Ü9TI·ÜÓ¹c,è?ÙÞ¶£ú½æG™è¶¹yÏ¥åÙd¾‹OI¡æ+°—ûÀûc·*ž%wp"K’ªrnÉoIic†6ËÆuu«ÚT@z/äQ‰–üëxÇÜÍÆTÅ0oÑvmÂ¥ƒ}–f[‘f.1_ŒDæo.Ôz —ý‡£²§´Êþ}vûAL‡•º[  Ì¢Íep¹ÝEu”QS9ò.×ÌÕ¸ ¥–=“ýŽ1r ‡£dDA#°àééØq}#áê{¯-sÄ㤾¼,DZ°$ÌÜizc¦ÓvÀ~K^NFœhâßáA̓ýåôÝ—À#Dû?ežS“¥^ $™I>J&#ÙÓš8 ‹JkE\É’J,B;FBQfôÑ CÌx®äO@üŠsôìe’w¢–ƒžœUH¿¨ÿlú³ÁâÌFúDIðãz0ôFïa~kŒAlæžt½oI÷‹Cs<`¿UÍzI{Înm);û٪߆JÈ•Î;`†æ. Ø^Þª44ežUZkÝþœ.N0Ã-CT{OïüS=Ü’'”ã÷ð0°»”‚Ši„Vo¾uVI¶Ôë3ïZ{£»½ ²ÃIîÚt7mWz±Æ7sˆ žì#øzr¬¨9ßdñjRL"œ­c¶//ß,ù/;DšG6ãÒŠô'Æh?ÕŽ®½’£_nøžúÄb A¬—ìñ©.DÀOk_7f^Ó'É 1ªu þIaÕpêŸdZŒd€cׂ(–[“¦·Ó[ 5H–V?¾ò,mýÉ ˜Ö» øI}xLRP³Þ½uÿšå<"N‡zla ™ˆÈô”QÄ»Ð{}ÍáÖ½ ŠW%—v}‹þ¾+‚œ¸´l¨zʶ|¾âÆ„äá×l´-›ÆÇÙÞ…ü_ÆïÔ/µ„·«ë'Šl¤³‰í®È _üÍðnŠã‘Äø™#ã‹è"b­Â-Àð>tH]Ûð‹ü‹(UäQßÅ”{Þ”kµZk›<^P&léÒénf½`‚JÑ.Àßá÷¼¼ÊçÑ­ƒ«?>›ô¯a¡ý½þA¼§rJ²q×x'Ù9‘ؽ 0[ÒaE «…þGDyÏ,ýçŽÊw­ø4s5XéËŽdÕ^é‘”O_p娠½÷ó(}}s3ž6¤‡|û+ †ÏdÔµtaY#Ñ LcqË9– +c©¦z=.Û³°îÝkCpFÔ\X‡÷Å{}Ê qßddñmP†™Ò³}ˆ¦½ãD½—l‹KppÞ]oÌó¤Uª gƒ‡B-I3[ÀÛ+ÏŠò‡iÁ“!%Ž+–äbî ¿ýUÌ98+™›u3κÑì§öB‘¶è‰‘ é$‡³ç€áª2ª]mà-þäZˆTS9'n›3 ªoRåvâ]kÄ¥rš©½é¦"“øÙO™Ô·ØŸ¬f5"ufÊ2ÿ.aî2¶:J<ÌQÐp•FR¾§2‚& ºˆÄÖ±¬ZK7ÞìúGÂE¬[€_†sšÝ~ç"€–Íœ“S!܀̶½cKÍy®á‚VBᑹ̵øP¡žUdNK™Í<´# ¦GÍ•‹’‘öœŠ¾Ý)‹ÆžR¿ÿ‰HôjTdCá+¢‹¾.vÎûƒŽ¦R qè¶¹g]Î’Øc`MÃW9Åj¦ ‡d°ð¨ˆ0÷¦‰wµñsžaç§éâ%n¸S[×è\ÉKkß‚Oç*hR=;­ tX %w¯ÈÖßOßÊUŠ×tÑô&¾¤ß_ŸÙžy}eç'}Wâ\Þ¿–YŸ2/B/»_¡ú>Šß¯+ºüh¹]O(2‰õ ÎEÙáò=Ú–Ýw¼ñi¸—ýh£Žƒ®ôg3h®8ÙÛ¼ Ð$;ŠYÀ‹<ƒ£©KÅ4/i *3¹ÏC}%‚g;ëAK:?ùRÕ:gÈ›­sû}›¼*-_›¨[®4<Ç)= ÚÚ|3ב´V" Z1Šng¦&x““ëSÚð)×éfýŠãýVúhVgjŒ_S)j.ï–èÖVš$%q‹x¶¹x\>¥z¸^ldA(PœÁÄi”“ŠŸuñ´ô Ñ…UæÅe+Ó¯Õ‹Nö“¶v?­¤XÝê) 6£ÅÐ7¬EhÇ|;Ï1Uöm©A$³i8ëËœeà°!6?ªÆo²ƒ¾£>úþÍþV¨åR HIRæ8§ÞÆÙøÉ£Î·4 ‘Äcç3ÂW£†ÉE¨Gô„CSØb‚#Ñ«¢ÁeæÔœ,É#úˆ}ªF² Ü=8Ïóð#A%JäK pvæïΖ©w<5©´×nGÚFÖ«M –œèý;éÆÁýôÖ÷ëöXd5ï â8|4)V_©µ¼¢H«[ûŒîvöXì³Ð¬†5üê®íõجNÄ—’çK‘‰|1¤Ú˜2yûºYþb¿¨ŠüWð±!ï7“h))±íäòg íñÃàvƒ W1½uÑç8âv=™ä¥C‚鸓ɸúÜ@Y’6Âøðº?É–¦ªnS¹‚oGa=p¦ƒp —;fœ‰´NvêÃàêIài¾Xy·‚¶~-¸âçcUôn¡.IxèÃhËWœK¢ãžX5Q˜;ἂ Zq¶¾5¢xþév¼K W?FåŒìoÐ_¡hßó §Ê~•™3‹ªÁv‰të^þ“rætˆØ7B's©Û`N[»\ì¢ÎdÓí’(&šàö#AËÆ¢»Ûùótä%³~ã‹Eh"éð£™]Íì[xX{ãl¥ÒH1¦…:̉T“¯·3ŠZhMsGž^ÙŸñí‹ ‰ÚOwO“f>2\‡š—S…Üî8?"¬Ï ·*kOs–41 Õš´¡,dÿ)®>ì™),»£qþVôÓ\ÿk–òÅøkC F'D%IJÄFýø­¢'W/¥‹%˜ £VY¾S7Élå‘Ñ•Q#Ù?eJ…›VYqøÎ´ñyM¤(SÂrã´–Ñ.(àš¡“Žœ~±9$ìþE„†D1 s¾w:hfàŸFs²çà¾éOH·.wZ À€Ì&®øÓN™@Éàr6ÔÞK>&÷CùÁå‡JK@¶’áo‰¦tñUk«ñïŸ3uœs%ÝQä¶„««Öv>'2'í3 ™Ê1ñÔß œÚêˆe½OÉÉ…½HR?BSs.Áݪ ÷_yeM÷—(ìM]®Ñ`Ã1Xí›Z,Ö¡ò:EG}'4b G¹1S9>3V°NzŸÐR¤F¬5ߑԖ$UK²)U”eêê"hû¢„òšGŸŸ†(6PX×ÀvD<˜­¤¯§×jE4­„Åeöœˆ=¥œ ˆ6féäê²EÑ1O°è6áóŠxZÐ}Î:D–l³ò½ZFÎ8Ÿ$x ¬Y?*e4)ºÕ¢¬“¾ “p/´«/û}‚±ÞâÇÿi*¹õôâл*µþt@ܱûˆæÚì:½ÚÉÉ…Úz ð$l'œˆTòz+¢Ë&Èàþ{·wÿñ³ì‘hÇ0ègÝ%)zxõwÓt³Ê&|ÇîÛí ‡ …ó½,ϨSÑÀ‘çÞ&€ÿ.¡‰þ°§kÐÖR¨TT+Ûø®;IçI zôS`™Ý¨bx+3 U ×VŒ.£gö¦\93¢Hš—Â.œC½!ú£¸öÆd  ÌïÍ“¿Óx‘§“!\DY]3£rDrøã¢ ,æÓßYáGö]u‚Zl.„›zþôÊ&ìxìªçU–Y îF’¹¸ûÀ7 êiŽí‚ÔÕZ'».¬tfráÅÛÇ©£&áŒa®‘º3ˆK¿¤>rI‰`T#¼j sÜ=Ö¸ÜÞè_ˆh˺‘äéÓH”{…ÒoPx}]zÇ_År'îðS'bïN¨=Ê©ý·‘ˆg_Á¯.M¼Íû1¦ïùa… YÆ;vœèÚ/ZËì^.´cÙ6q^þÙ7ÍAê¬:²V„-7‡ÌÄî-^»Fávn˜þdÆêì_q@îëë°%(äñ˜`ß癆ÉâLš ïùSDää ´[/wÈõ˜|ÞEè~kvãðì±>c,À¤Ïøþåú™‡A0OTWÂæ: B¢ŠožˆÄZã׃?Âmj§¨H>‘‹Næ Uäàf@™¡;¾l!˜C¢ÀýÌκÝuœÓÓtÄ–>‚hG´ŸôP‹ —Óóþ D¨§[W!8 ë†Í;Ñ ò‰ ߆F}ü²p›\ñжõé94éæJ7«&´@mšEÿ'·Ú¶*"˜FC…c^ØÂÕâµÝä‰NojÛÞ½¯%¯tc­õ°öPÊÐÞ †8±dYö!ÌaóªR´T0VÒ»ˆÓnsê+;;² §‘M¤vÛ¡­¼"ÏçÐÝx…3¨;Ÿèëä~føhŒ™Ÿ¨žöôŸ9‰„Ø2RþY ÒlP3Å@~7‹zÂÖeMù(<ÂÌÿ½‚Hýî#Í'žÏ?ûç>L«Ïrµ$3ýƒs®¸9è›!Aºz*|¹l²Ùñe– +ú al'ôª"> ÁF« ÍXؘ„¶ Iq°í' ©>=¥MLÓ"Y³Xýt!;§Ž¡B’Pf /ª–¬òÙF”œÓ ¬ NÂ%8&CȦ^+¶!Vš}šéžMÅ« t#ï_g},¨¿ =異Ï8ÄëNûs¥{ Hë0Ÿu€Ä#¤ìT¨Ë=0§ä©ýän¿¯>~é&ý4í>bû-I%¡°?’1ç ÞÞ'@卯Ûï""BæI¤ï¥hW‹tL{«cìf¹C\õŠˆò¹ƒ+TŒ÷áærÑwœoŠ@=Eà¾-Å÷üàËi5[‡‘£ =ªN©aRGr1ÅÜq 3ÊÇ!Ø•#…Pö¼}¥qheeÇz=/‰‚n^)"Iëü2aO UÆÖ¤¸ÒKsKîËD¡ýQKµ]ŸŸ2qL¾ÖfÀFçü¾Uð›þœJHH‡(–m|òf#Öâ™$_笃?kiˆñÕîKå‹àŠ|à@<Å'J­“kéÉU‹Ô³Œ.å6‹ÂÙ"Ÿù剰]OIb–x,j7‹ï¸ïGÈŠ?á;éà$ŒSeJ­µ±ãK l'hú‡4Í2+Q1ÜiIš—øÕZ0þpñ½h¥LOPý zö¾ZïkPØ@CtZÐ ž_ [ …}·ÒÔ?:ñϳ,ß›Îýkê.‚ç®Ä<ñÄn0µc¬€pŸr“ùž½Ë:D¾ºÒróÚ<Š’$…À¬N⸓±GÞX³{‘f$N!_ÀI»B"â+ò¼^ϸ‚ßÔw»²QúÜrÁ0¸{}v ž,äBU]øfÃe¶ØÈÝQ4ÔÕ[}‚Õ•ö<ç®–J¤øâIë·NÛq‹#»ÔVC™z ¸%Ê´¨„Y¨Ã–â2$F½v½OLeÉŸw1ϸ‘!ÑH·/è<í:rai÷¼mû®¿Ï‹óqŸvÄ…¡"P§®ÔøIºw±h£ktÃ'Ä1™7Nü­)'Ư€¡“æXš)%róWÒæ2{+ìóaÜd‡¢üˆ{­¯á¼fÙè"c”_9—ØïøÌv’ø|Ѱ#¿§Z@•¡J „¬Š…Óm^n´næå¯Öù‡?lìcÁ¤¥ŸWg{7oF §òÌÚ¹+eª;¡™À›£!üx‡}ð-Áyf5×úýÎ?绹¼´ø®iÖ”p-¯F%Öô›Àt¾pN<Šœ~¼Úg¡:´jâÒÙ%êÃ#§Ä“Õ„Wq ¨,ˆN#oÞ+Í–¨.ÄšnˆtEFr|ò_\g¾/h4}ÜúýÞKpű×7T÷=;ÓØ8Zr2ŽdëæLÓ¯(´1ìœ]¡žlš_ /JÎÒôÜqï3è#~¿ƒ›#«˜i~Y™ýŒ³c±DšèÂöxu‘¨©TÁz!®Ó›áN˜˜ÕÓ2…’>{PðE ¿«ƒ œç!ÿ‡‘6ên>¿Ç}³%Y-'´8a£ûþ¸;ûÌ0ë=“q?=+ì·à6ÈðÁÐÖ Ã\OoÎp*¤m ó;ÝA++ݘ9®§’h¡ňµjy®Ä?ÓÇgS}Uúkv”Ñ`ìþ2÷Šûå«„ƒ™½búþÞœMÙàøWrv¦3|–‰Î×+§Ö¦_^c«Ká#Ê]q ïb]‰Ëʤ˜¥úQã\—æod»¼OŒ^ÂZÖm¸,Ù¥ÏT>„ªâT°îh'–9Z85ç æœí Bò0\TrúîòÆXP'ÐÇ>!þФz©— IÆG/ ñ˰ÇKa¼†N&VVMóTÛ¦ZÀÀFÜÿuv)O$)8pwËr+¤›áFun!†²óñåU¢¶÷þ¡ÈO<°Àž…KÑõ¢9ø<÷¢€BO¾E/h|ÎlÕWÚc(LÀ Øæb3°L,Sˆwæ°X]3YyÉy2.šðá6ö’)€\Ó!Õ‹äü¶àš\üD$Ëìe ß;ˆ½,h¯#zBò|L&%1¯Ÿ¦|ÓSˆœ<_r•‘/VeT”®˜'?‡æüÝ3çužŒ*–C‹À1‘˦46€.Ï9…ø[ÆL‰Ýé įá>½¶_Ìx/ƒÖÝΟ9Ä<ôÔ·Yƒ]XztÈ%‹þdôмS¢Ð~dí—MŽÆM8§‘…‹Ký‹Ð)FñÉq¾½jzrŒx¡%ýNû…báJ ë=¡6<І»ýŒA¿ ÉdÎ-r}cqÿ×l" ³b,É-ºˆúËÏõaß¶°müñõ•L‡@W=rrLŒ¨GÁ‡ô˜Ñó ¡¦8ϱ‚=ªðn¤Êu*^%§Apóc(0V%¹r”;$;ï –X‹äæ©`ä9úÅ@ –Ñ舄®[“DA„h×8ŸröÃoó%wÔPÙø‚ß·Uâ…K]n+œPjJØÁõÊÂ{ì²½“Ï­„Ê> ï pb̰¬‰¯l‘;µïBe¾tã_Kx _EΕª\‘Ï3¹f*ÒÁ ²ÀkÕîi0ì4‹^…jLú•*ûB›ÚoIz¥þ&¸pËÓ`9€‚½±“!L®;’_Àv_ÿõk„eÏ%w3¡KjKÎŽjjS*BƒÊ˜A‘7åÇYÀeí\‘iRé’nHŸŸ%3Ê¢)»."S+0F$·Ã6ÑìÇ(ñE"§AÓîõåA\Ù n„Ž`ûØ»{©Ü¨®?Þpcô2_ÝÈöBÒøèoiyÙ>Å×óìÚH£;…+"Ìn’§ó–¬Ñ:¿{­ˆ 8%|yÕÍÅRgŒÆ«!;5ACƒ5±«:·tÒ£J•àëOö¡j™rìå´  ô-/_S[¾#·~k`†ÛVòº:Þ4àÀx[*¼l^±0vƯŒJng?A"ã4äÙ;Çe¥!*¶ŸÐ³wÄs =sâ<HJïkºQˆ´Tè1K –¸FÊJF7¨æ>'* ãųTáG”–™.èqо±zLÐ1ÊÈ/¶kÕG«a ”|L\yé%ÆG·im¬îæÁD ÿ^r¦ Ÿû«#%FŠ-g¯BV¤jÁéñ²~Ú¨0ªûpþ³áz5ücf¤‘rqá鄞lžñ…çêHˆb¸TЇ~ puÔÉ'¿{0 ÛE§êÀ°¾hê(ü92ppÍ&W…óûÁ0› ‡Â­–Ó‘Ç•Ûý'MZÒȹÑÍv~³ìt+D3êXЯ‚Ý­£e3iáŽ;=_Ï“mNJ㔆‡½}IõØWž‹ü–I<3â÷Új3:®õÆ3ŵcFÌmÛJ ƒrkyuâ–Ö£ô°Qýz?ÍÜhno1¾Ó–Cºl·5•Ùk¨b­í¾·?ePÆÈ¿ÿ·ÍTUéáWù}[þ®@e¬R×d!¿?i×ÎRu*`h¸ %1%mW~®çÕEÌ„9Ç‚Úyö>Á½Ü™9#ãÛE ¿ü£¿>Ų|’°ìt1ÁV+isæ¹'ÃØ/©’SþkRðEœKêÜÀH {L5E¸Œm¿/e^}òjîЖJHl× ÷Ïo‰;n¾š¶m¢ž¾5žÅül.«6nÂÌQ\4 «/“¤‘}•âW}7OØ—‰ö;E)2gÿ—þÙž9F¥p¡íˆ “[ŽUŸfe]àÏXží,ø€.¢·0 üD EʱPñ<ë‹·gJ"ôC(yÝ ëéÎ"—Ýi[X_i¨(€qIºDë'!>zP²ÏAõü¸?NOÊÕXø¹N˜àüñ‡ãü¸€)À+œÑ’ŽoÓ\OâÝuúInÊ{ÿ©KPR©üª9–æ“:™†@¾¡:¥Ñí$>nÅ^÷´så¾oKG%š»”»9åšé,õLÒ6FøûüØÖ9×ýrPÚ-È>ðêBVý`ù(ÎîX¡R%€ÀPö+ö> endobj 4 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /LXYZKL+CMBX12 /ItalicAngle 0 /StemV 109 /XHeight 444 /FontBBox [-53 -251 1139 750] /Flags 4 /CharSet (/ff/fi/exclam/quoteright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/equal/question/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/quotedblleft/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 5 0 R >> endobj 2452 0 obj [656 625 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 343 0 0 0 0 0 313 0 0 0 0 313 375 313 562 562 562 562 562 562 562 562 562 562 562 313 0 0 875 0 531 0 850 800 813 862 738 707 884 880 419 0 881 676 1067 880 845 769 845 839 625 782 865 850 1162 850 850 687 0 581 0 0 0 313 547 625 500 625 513 344 562 625 313 344 594 313 938 625 562 625 594 459 444 438 625 594 813 594 594 500 ] endobj 2451 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi 13/.notdef 33/exclam 34/.notdef 39/quoteright 40/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 61/equal 62/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 75/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z 91/.notdef 92/quotedblleft 93/.notdef 96/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 13 0 obj << /Type /Pages /Count 6 /Parent 2453 0 R /Kids [2 0 R 15 0 R 18 0 R 30 0 R 39 0 R 46 0 R] >> endobj 53 0 obj << /Type /Pages /Count 6 /Parent 2453 0 R /Kids [50 0 R 55 0 R 59 0 R 63 0 R 67 0 R 71 0 R] >> endobj 78 0 obj << /Type /Pages /Count 6 /Parent 2453 0 R /Kids [75 0 R 80 0 R 87 0 R 94 0 R 101 0 R 106 0 R] >> endobj 131 0 obj << /Type /Pages /Count 6 /Parent 2453 0 R /Kids [119 0 R 138 0 R 149 0 R 159 0 R 175 0 R 183 0 R] >> endobj 198 0 obj << /Type /Pages /Count 6 /Parent 2453 0 R /Kids [187 0 R 201 0 R 216 0 R 224 0 R 239 0 R 256 0 R] >> endobj 281 0 obj << /Type /Pages /Count 6 /Parent 2453 0 R /Kids [275 0 R 284 0 R 288 0 R 295 0 R 305 0 R 316 0 R] >> endobj 325 0 obj << /Type /Pages /Count 6 /Parent 2454 0 R /Kids [321 0 R 332 0 R 343 0 R 353 0 R 363 0 R 368 0 R] >> endobj 382 0 obj << /Type /Pages /Count 6 /Parent 2454 0 R /Kids [377 0 R 384 0 R 389 0 R 398 0 R 403 0 R 408 0 R] >> endobj 415 0 obj << /Type /Pages /Count 6 /Parent 2454 0 R /Kids [412 0 R 417 0 R 421 0 R 433 0 R 444 0 R 459 0 R] >> endobj 478 0 obj << /Type /Pages /Count 6 /Parent 2454 0 R /Kids [467 0 R 483 0 R 487 0 R 491 0 R 499 0 R 507 0 R] >> endobj 518 0 obj << /Type /Pages /Count 6 /Parent 2454 0 R /Kids [512 0 R 520 0 R 526 0 R 531 0 R 535 0 R 539 0 R] >> endobj 551 0 obj << /Type /Pages /Count 6 /Parent 2454 0 R /Kids [546 0 R 553 0 R 563 0 R 571 0 R 578 0 R 584 0 R] >> endobj 596 0 obj << /Type /Pages /Count 6 /Parent 2455 0 R /Kids [589 0 R 598 0 R 612 0 R 616 0 R 620 0 R 624 0 R] >> endobj 634 0 obj << /Type /Pages /Count 6 /Parent 2455 0 R /Kids [629 0 R 636 0 R 640 0 R 644 0 R 649 0 R 654 0 R] >> endobj 675 0 obj << /Type /Pages /Count 6 /Parent 2455 0 R /Kids [661 0 R 679 0 R 688 0 R 692 0 R 696 0 R 707 0 R] >> endobj 717 0 obj << /Type /Pages /Count 6 /Parent 2455 0 R /Kids [714 0 R 719 0 R 723 0 R 727 0 R 738 0 R 742 0 R] >> endobj 749 0 obj << /Type /Pages /Count 6 /Parent 2455 0 R /Kids [746 0 R 751 0 R 755 0 R 759 0 R 763 0 R 770 0 R] >> endobj 781 0 obj << /Type /Pages /Count 6 /Parent 2455 0 R /Kids [774 0 R 783 0 R 787 0 R 791 0 R 795 0 R 805 0 R] >> endobj 814 0 obj << /Type /Pages /Count 6 /Parent 2456 0 R /Kids [809 0 R 816 0 R 820 0 R 836 0 R 847 0 R 865 0 R] >> endobj 892 0 obj << /Type /Pages /Count 6 /Parent 2456 0 R /Kids [881 0 R 895 0 R 908 0 R 918 0 R 938 0 R 948 0 R] >> endobj 967 0 obj << /Type /Pages /Count 6 /Parent 2456 0 R /Kids [957 0 R 969 0 R 977 0 R 985 0 R 994 0 R 1001 0 R] >> endobj 1026 0 obj << /Type /Pages /Count 6 /Parent 2456 0 R /Kids [1012 0 R 1028 0 R 1039 0 R 1047 0 R 1054 0 R 1059 0 R] >> endobj 1080 0 obj << /Type /Pages /Count 6 /Parent 2456 0 R /Kids [1068 0 R 1082 0 R 1088 0 R 1101 0 R 1111 0 R 1116 0 R] >> endobj 1126 0 obj << /Type /Pages /Count 6 /Parent 2456 0 R /Kids [1121 0 R 1128 0 R 1134 0 R 1139 0 R 1145 0 R 1152 0 R] >> endobj 1164 0 obj << /Type /Pages /Count 6 /Parent 2457 0 R /Kids [1161 0 R 1166 0 R 1171 0 R 1176 0 R 1181 0 R 1185 0 R] >> endobj 1200 0 obj << /Type /Pages /Count 6 /Parent 2457 0 R /Kids [1194 0 R 1202 0 R 1280 0 R 1369 0 R 1380 0 R 1418 0 R] >> endobj 1506 0 obj << /Type /Pages /Count 6 /Parent 2457 0 R /Kids [1459 0 R 1508 0 R 1560 0 R 1612 0 R 1656 0 R 2399 0 R] >> endobj 2453 0 obj << /Type /Pages /Count 36 /Parent 2458 0 R /Kids [13 0 R 53 0 R 78 0 R 131 0 R 198 0 R 281 0 R] >> endobj 2454 0 obj << /Type /Pages /Count 36 /Parent 2458 0 R /Kids [325 0 R 382 0 R 415 0 R 478 0 R 518 0 R 551 0 R] >> endobj 2455 0 obj << /Type /Pages /Count 36 /Parent 2458 0 R /Kids [596 0 R 634 0 R 675 0 R 717 0 R 749 0 R 781 0 R] >> endobj 2456 0 obj << /Type /Pages /Count 36 /Parent 2458 0 R /Kids [814 0 R 892 0 R 967 0 R 1026 0 R 1080 0 R 1126 0 R] >> endobj 2457 0 obj << /Type /Pages /Count 18 /Parent 2458 0 R /Kids [1164 0 R 1200 0 R 1506 0 R] >> endobj 2458 0 obj << /Type /Pages /Count 162 /Kids [2453 0 R 2454 0 R 2455 0 R 2456 0 R 2457 0 R] >> endobj 2459 0 obj << /Type /Outlines /First 1661 0 R /Last 2396 0 R /Count 20 >> endobj 2396 0 obj << /Title 2397 0 R /A 2395 0 R /Parent 2459 0 R /Prev 2393 0 R >> endobj 2393 0 obj << /Title 2394 0 R /A 2392 0 R /Parent 2459 0 R /Prev 2390 0 R /Next 2396 0 R >> endobj 2390 0 obj << /Title 2391 0 R /A 2389 0 R /Parent 2459 0 R /Prev 2378 0 R /Next 2393 0 R >> endobj 2387 0 obj << /Title 2388 0 R /A 2386 0 R /Parent 2378 0 R /Prev 2381 0 R >> endobj 2384 0 obj << /Title 2385 0 R /A 2383 0 R /Parent 2381 0 R >> endobj 2381 0 obj << /Title 2382 0 R /A 2380 0 R /Parent 2378 0 R /Next 2387 0 R /First 2384 0 R /Last 2384 0 R /Count -1 >> endobj 2378 0 obj << /Title 2379 0 R /A 2377 0 R /Parent 2459 0 R /Prev 2351 0 R /Next 2390 0 R /First 2381 0 R /Last 2387 0 R /Count -2 >> endobj 2375 0 obj << /Title 2376 0 R /A 2374 0 R /Parent 2351 0 R /Prev 2372 0 R >> endobj 2372 0 obj << /Title 2373 0 R /A 2371 0 R /Parent 2351 0 R /Prev 2363 0 R /Next 2375 0 R >> endobj 2369 0 obj << /Title 2370 0 R /A 2368 0 R /Parent 2363 0 R /Prev 2366 0 R >> endobj 2366 0 obj << /Title 2367 0 R /A 2365 0 R /Parent 2363 0 R /Next 2369 0 R >> endobj 2363 0 obj << /Title 2364 0 R /A 2362 0 R /Parent 2351 0 R /Prev 2360 0 R /Next 2372 0 R /First 2366 0 R /Last 2369 0 R /Count -2 >> endobj 2360 0 obj << /Title 2361 0 R /A 2359 0 R /Parent 2351 0 R /Prev 2357 0 R /Next 2363 0 R >> endobj 2357 0 obj << /Title 2358 0 R /A 2356 0 R /Parent 2351 0 R /Prev 2354 0 R /Next 2360 0 R >> endobj 2354 0 obj << /Title 2355 0 R /A 2353 0 R /Parent 2351 0 R /Next 2357 0 R >> endobj 2351 0 obj << /Title 2352 0 R /A 2350 0 R /Parent 2459 0 R /Prev 2348 0 R /Next 2378 0 R /First 2354 0 R /Last 2375 0 R /Count -6 >> endobj 2348 0 obj << /Title 2349 0 R /A 2347 0 R /Parent 2459 0 R /Prev 1886 0 R /Next 2351 0 R >> endobj 2345 0 obj << /Title 2346 0 R /A 2344 0 R /Parent 1892 0 R /Prev 2342 0 R >> endobj 2342 0 obj << /Title 2343 0 R /A 2341 0 R /Parent 1892 0 R /Prev 2339 0 R /Next 2345 0 R >> endobj 2339 0 obj << /Title 2340 0 R /A 2338 0 R /Parent 1892 0 R /Prev 2336 0 R /Next 2342 0 R >> endobj 2336 0 obj << /Title 2337 0 R /A 2335 0 R /Parent 1892 0 R /Prev 2333 0 R /Next 2339 0 R >> endobj 2333 0 obj << /Title 2334 0 R /A 2332 0 R /Parent 1892 0 R /Prev 2330 0 R /Next 2336 0 R >> endobj 2330 0 obj << /Title 2331 0 R /A 2329 0 R /Parent 1892 0 R /Prev 2327 0 R /Next 2333 0 R >> endobj 2327 0 obj << /Title 2328 0 R /A 2326 0 R /Parent 1892 0 R /Prev 2324 0 R /Next 2330 0 R >> endobj 2324 0 obj << /Title 2325 0 R /A 2323 0 R /Parent 1892 0 R /Prev 2321 0 R /Next 2327 0 R >> endobj 2321 0 obj << /Title 2322 0 R /A 2320 0 R /Parent 1892 0 R /Prev 2318 0 R /Next 2324 0 R >> endobj 2318 0 obj << /Title 2319 0 R /A 2317 0 R /Parent 1892 0 R /Prev 2315 0 R /Next 2321 0 R >> endobj 2315 0 obj << /Title 2316 0 R /A 2314 0 R /Parent 1892 0 R /Prev 2312 0 R /Next 2318 0 R >> endobj 2312 0 obj << /Title 2313 0 R /A 2311 0 R /Parent 1892 0 R /Prev 2309 0 R /Next 2315 0 R >> endobj 2309 0 obj << /Title 2310 0 R /A 2308 0 R /Parent 1892 0 R /Prev 2306 0 R /Next 2312 0 R >> endobj 2306 0 obj << /Title 2307 0 R /A 2305 0 R /Parent 1892 0 R /Prev 2303 0 R /Next 2309 0 R >> endobj 2303 0 obj << /Title 2304 0 R /A 2302 0 R /Parent 1892 0 R /Prev 2300 0 R /Next 2306 0 R >> endobj 2300 0 obj << /Title 2301 0 R /A 2299 0 R /Parent 1892 0 R /Prev 2297 0 R /Next 2303 0 R >> endobj 2297 0 obj << /Title 2298 0 R /A 2296 0 R /Parent 1892 0 R /Prev 2294 0 R /Next 2300 0 R >> endobj 2294 0 obj << /Title 2295 0 R /A 2293 0 R /Parent 1892 0 R /Prev 2291 0 R /Next 2297 0 R >> endobj 2291 0 obj << /Title 2292 0 R /A 2290 0 R /Parent 1892 0 R /Prev 2288 0 R /Next 2294 0 R >> endobj 2288 0 obj << /Title 2289 0 R /A 2287 0 R /Parent 1892 0 R /Prev 2285 0 R /Next 2291 0 R >> endobj 2285 0 obj << /Title 2286 0 R /A 2284 0 R /Parent 1892 0 R /Prev 2282 0 R /Next 2288 0 R >> endobj 2282 0 obj << /Title 2283 0 R /A 2281 0 R /Parent 1892 0 R /Prev 2279 0 R /Next 2285 0 R >> endobj 2279 0 obj << /Title 2280 0 R /A 2278 0 R /Parent 1892 0 R /Prev 2276 0 R /Next 2282 0 R >> endobj 2276 0 obj << /Title 2277 0 R /A 2275 0 R /Parent 1892 0 R /Prev 2273 0 R /Next 2279 0 R >> endobj 2273 0 obj << /Title 2274 0 R /A 2272 0 R /Parent 1892 0 R /Prev 2270 0 R /Next 2276 0 R >> endobj 2270 0 obj << /Title 2271 0 R /A 2269 0 R /Parent 1892 0 R /Prev 2267 0 R /Next 2273 0 R >> endobj 2267 0 obj << /Title 2268 0 R /A 2266 0 R /Parent 1892 0 R /Prev 2264 0 R /Next 2270 0 R >> endobj 2264 0 obj << /Title 2265 0 R /A 2263 0 R /Parent 1892 0 R /Prev 2261 0 R /Next 2267 0 R >> endobj 2261 0 obj << /Title 2262 0 R /A 2260 0 R /Parent 1892 0 R /Prev 2258 0 R /Next 2264 0 R >> endobj 2258 0 obj << /Title 2259 0 R /A 2257 0 R /Parent 1892 0 R /Prev 2255 0 R /Next 2261 0 R >> endobj 2255 0 obj << /Title 2256 0 R /A 2254 0 R /Parent 1892 0 R /Prev 2252 0 R /Next 2258 0 R >> endobj 2252 0 obj << /Title 2253 0 R /A 2251 0 R /Parent 1892 0 R /Prev 2249 0 R /Next 2255 0 R >> endobj 2249 0 obj << /Title 2250 0 R /A 2248 0 R /Parent 1892 0 R /Prev 2246 0 R /Next 2252 0 R >> endobj 2246 0 obj << /Title 2247 0 R /A 2245 0 R /Parent 1892 0 R /Prev 2243 0 R /Next 2249 0 R >> endobj 2243 0 obj << /Title 2244 0 R /A 2242 0 R /Parent 1892 0 R /Prev 2240 0 R /Next 2246 0 R >> endobj 2240 0 obj << /Title 2241 0 R /A 2239 0 R /Parent 1892 0 R /Prev 2237 0 R /Next 2243 0 R >> endobj 2237 0 obj << /Title 2238 0 R /A 2236 0 R /Parent 1892 0 R /Prev 2234 0 R /Next 2240 0 R >> endobj 2234 0 obj << /Title 2235 0 R /A 2233 0 R /Parent 1892 0 R /Prev 2231 0 R /Next 2237 0 R >> endobj 2231 0 obj << /Title 2232 0 R /A 2230 0 R /Parent 1892 0 R /Prev 2228 0 R /Next 2234 0 R >> endobj 2228 0 obj << /Title 2229 0 R /A 2227 0 R /Parent 1892 0 R /Prev 2225 0 R /Next 2231 0 R >> endobj 2225 0 obj << /Title 2226 0 R /A 2224 0 R /Parent 1892 0 R /Prev 2222 0 R /Next 2228 0 R >> endobj 2222 0 obj << /Title 2223 0 R /A 2221 0 R /Parent 1892 0 R /Prev 2219 0 R /Next 2225 0 R >> endobj 2219 0 obj << /Title 2220 0 R /A 2218 0 R /Parent 1892 0 R /Prev 2216 0 R /Next 2222 0 R >> endobj 2216 0 obj << /Title 2217 0 R /A 2215 0 R /Parent 1892 0 R /Prev 2213 0 R /Next 2219 0 R >> endobj 2213 0 obj << /Title 2214 0 R /A 2212 0 R /Parent 1892 0 R /Prev 2210 0 R /Next 2216 0 R >> endobj 2210 0 obj << /Title 2211 0 R /A 2209 0 R /Parent 1892 0 R /Prev 2207 0 R /Next 2213 0 R >> endobj 2207 0 obj << /Title 2208 0 R /A 2206 0 R /Parent 1892 0 R /Prev 2204 0 R /Next 2210 0 R >> endobj 2204 0 obj << /Title 2205 0 R /A 2203 0 R /Parent 1892 0 R /Prev 2201 0 R /Next 2207 0 R >> endobj 2201 0 obj << /Title 2202 0 R /A 2200 0 R /Parent 1892 0 R /Prev 2198 0 R /Next 2204 0 R >> endobj 2198 0 obj << /Title 2199 0 R /A 2197 0 R /Parent 1892 0 R /Prev 2195 0 R /Next 2201 0 R >> endobj 2195 0 obj << /Title 2196 0 R /A 2194 0 R /Parent 1892 0 R /Prev 2192 0 R /Next 2198 0 R >> endobj 2192 0 obj << /Title 2193 0 R /A 2191 0 R /Parent 1892 0 R /Prev 2189 0 R /Next 2195 0 R >> endobj 2189 0 obj << /Title 2190 0 R /A 2188 0 R /Parent 1892 0 R /Prev 2186 0 R /Next 2192 0 R >> endobj 2186 0 obj << /Title 2187 0 R /A 2185 0 R /Parent 1892 0 R /Prev 2183 0 R /Next 2189 0 R >> endobj 2183 0 obj << /Title 2184 0 R /A 2182 0 R /Parent 1892 0 R /Prev 2180 0 R /Next 2186 0 R >> endobj 2180 0 obj << /Title 2181 0 R /A 2179 0 R /Parent 1892 0 R /Prev 2177 0 R /Next 2183 0 R >> endobj 2177 0 obj << /Title 2178 0 R /A 2176 0 R /Parent 1892 0 R /Prev 2174 0 R /Next 2180 0 R >> endobj 2174 0 obj << /Title 2175 0 R /A 2173 0 R /Parent 1892 0 R /Prev 2171 0 R /Next 2177 0 R >> endobj 2171 0 obj << /Title 2172 0 R /A 2170 0 R /Parent 1892 0 R /Prev 2168 0 R /Next 2174 0 R >> endobj 2168 0 obj << /Title 2169 0 R /A 2167 0 R /Parent 1892 0 R /Prev 2165 0 R /Next 2171 0 R >> endobj 2165 0 obj << /Title 2166 0 R /A 2164 0 R /Parent 1892 0 R /Prev 2162 0 R /Next 2168 0 R >> endobj 2162 0 obj << /Title 2163 0 R /A 2161 0 R /Parent 1892 0 R /Prev 2159 0 R /Next 2165 0 R >> endobj 2159 0 obj << /Title 2160 0 R /A 2158 0 R /Parent 1892 0 R /Prev 2156 0 R /Next 2162 0 R >> endobj 2156 0 obj << /Title 2157 0 R /A 2155 0 R /Parent 1892 0 R /Prev 2153 0 R /Next 2159 0 R >> endobj 2153 0 obj << /Title 2154 0 R /A 2152 0 R /Parent 1892 0 R /Prev 2150 0 R /Next 2156 0 R >> endobj 2150 0 obj << /Title 2151 0 R /A 2149 0 R /Parent 1892 0 R /Prev 2147 0 R /Next 2153 0 R >> endobj 2147 0 obj << /Title 2148 0 R /A 2146 0 R /Parent 1892 0 R /Prev 2144 0 R /Next 2150 0 R >> endobj 2144 0 obj << /Title 2145 0 R /A 2143 0 R /Parent 1892 0 R /Prev 2141 0 R /Next 2147 0 R >> endobj 2141 0 obj << /Title 2142 0 R /A 2140 0 R /Parent 1892 0 R /Prev 2138 0 R /Next 2144 0 R >> endobj 2138 0 obj << /Title 2139 0 R /A 2137 0 R /Parent 1892 0 R /Prev 2135 0 R /Next 2141 0 R >> endobj 2135 0 obj << /Title 2136 0 R /A 2134 0 R /Parent 1892 0 R /Prev 2132 0 R /Next 2138 0 R >> endobj 2132 0 obj << /Title 2133 0 R /A 2131 0 R /Parent 1892 0 R /Prev 2129 0 R /Next 2135 0 R >> endobj 2129 0 obj << /Title 2130 0 R /A 2128 0 R /Parent 1892 0 R /Prev 2126 0 R /Next 2132 0 R >> endobj 2126 0 obj << /Title 2127 0 R /A 2125 0 R /Parent 1892 0 R /Prev 2123 0 R /Next 2129 0 R >> endobj 2123 0 obj << /Title 2124 0 R /A 2122 0 R /Parent 1892 0 R /Prev 2120 0 R /Next 2126 0 R >> endobj 2120 0 obj << /Title 2121 0 R /A 2119 0 R /Parent 1892 0 R /Prev 2117 0 R /Next 2123 0 R >> endobj 2117 0 obj << /Title 2118 0 R /A 2116 0 R /Parent 1892 0 R /Prev 2114 0 R /Next 2120 0 R >> endobj 2114 0 obj << /Title 2115 0 R /A 2113 0 R /Parent 1892 0 R /Prev 2111 0 R /Next 2117 0 R >> endobj 2111 0 obj << /Title 2112 0 R /A 2110 0 R /Parent 1892 0 R /Prev 2108 0 R /Next 2114 0 R >> endobj 2108 0 obj << /Title 2109 0 R /A 2107 0 R /Parent 1892 0 R /Prev 2105 0 R /Next 2111 0 R >> endobj 2105 0 obj << /Title 2106 0 R /A 2104 0 R /Parent 1892 0 R /Prev 2102 0 R /Next 2108 0 R >> endobj 2102 0 obj << /Title 2103 0 R /A 2101 0 R /Parent 1892 0 R /Prev 2099 0 R /Next 2105 0 R >> endobj 2099 0 obj << /Title 2100 0 R /A 2098 0 R /Parent 1892 0 R /Prev 2096 0 R /Next 2102 0 R >> endobj 2096 0 obj << /Title 2097 0 R /A 2095 0 R /Parent 1892 0 R /Prev 2093 0 R /Next 2099 0 R >> endobj 2093 0 obj << /Title 2094 0 R /A 2092 0 R /Parent 1892 0 R /Prev 2090 0 R /Next 2096 0 R >> endobj 2090 0 obj << /Title 2091 0 R /A 2089 0 R /Parent 1892 0 R /Prev 2087 0 R /Next 2093 0 R >> endobj 2087 0 obj << /Title 2088 0 R /A 2086 0 R /Parent 1892 0 R /Prev 2084 0 R /Next 2090 0 R >> endobj 2084 0 obj << /Title 2085 0 R /A 2083 0 R /Parent 1892 0 R /Prev 2081 0 R /Next 2087 0 R >> endobj 2081 0 obj << /Title 2082 0 R /A 2080 0 R /Parent 1892 0 R /Prev 2078 0 R /Next 2084 0 R >> endobj 2078 0 obj << /Title 2079 0 R /A 2077 0 R /Parent 1892 0 R /Prev 2075 0 R /Next 2081 0 R >> endobj 2075 0 obj << /Title 2076 0 R /A 2074 0 R /Parent 1892 0 R /Prev 2072 0 R /Next 2078 0 R >> endobj 2072 0 obj << /Title 2073 0 R /A 2071 0 R /Parent 1892 0 R /Prev 2069 0 R /Next 2075 0 R >> endobj 2069 0 obj << /Title 2070 0 R /A 2068 0 R /Parent 1892 0 R /Prev 2066 0 R /Next 2072 0 R >> endobj 2066 0 obj << /Title 2067 0 R /A 2065 0 R /Parent 1892 0 R /Prev 2063 0 R /Next 2069 0 R >> endobj 2063 0 obj << /Title 2064 0 R /A 2062 0 R /Parent 1892 0 R /Prev 2060 0 R /Next 2066 0 R >> endobj 2060 0 obj << /Title 2061 0 R /A 2059 0 R /Parent 1892 0 R /Prev 2057 0 R /Next 2063 0 R >> endobj 2057 0 obj << /Title 2058 0 R /A 2056 0 R /Parent 1892 0 R /Prev 2054 0 R /Next 2060 0 R >> endobj 2054 0 obj << /Title 2055 0 R /A 2053 0 R /Parent 1892 0 R /Prev 2051 0 R /Next 2057 0 R >> endobj 2051 0 obj << /Title 2052 0 R /A 2050 0 R /Parent 1892 0 R /Prev 2048 0 R /Next 2054 0 R >> endobj 2048 0 obj << /Title 2049 0 R /A 2047 0 R /Parent 1892 0 R /Prev 2045 0 R /Next 2051 0 R >> endobj 2045 0 obj << /Title 2046 0 R /A 2044 0 R /Parent 1892 0 R /Prev 2042 0 R /Next 2048 0 R >> endobj 2042 0 obj << /Title 2043 0 R /A 2041 0 R /Parent 1892 0 R /Prev 2039 0 R /Next 2045 0 R >> endobj 2039 0 obj << /Title 2040 0 R /A 2038 0 R /Parent 1892 0 R /Prev 2036 0 R /Next 2042 0 R >> endobj 2036 0 obj << /Title 2037 0 R /A 2035 0 R /Parent 1892 0 R /Prev 2033 0 R /Next 2039 0 R >> endobj 2033 0 obj << /Title 2034 0 R /A 2032 0 R /Parent 1892 0 R /Prev 2030 0 R /Next 2036 0 R >> endobj 2030 0 obj << /Title 2031 0 R /A 2029 0 R /Parent 1892 0 R /Prev 2027 0 R /Next 2033 0 R >> endobj 2027 0 obj << /Title 2028 0 R /A 2026 0 R /Parent 1892 0 R /Prev 2024 0 R /Next 2030 0 R >> endobj 2024 0 obj << /Title 2025 0 R /A 2023 0 R /Parent 1892 0 R /Prev 2021 0 R /Next 2027 0 R >> endobj 2021 0 obj << /Title 2022 0 R /A 2020 0 R /Parent 1892 0 R /Prev 2018 0 R /Next 2024 0 R >> endobj 2018 0 obj << /Title 2019 0 R /A 2017 0 R /Parent 1892 0 R /Prev 2015 0 R /Next 2021 0 R >> endobj 2015 0 obj << /Title 2016 0 R /A 2014 0 R /Parent 1892 0 R /Prev 2012 0 R /Next 2018 0 R >> endobj 2012 0 obj << /Title 2013 0 R /A 2011 0 R /Parent 1892 0 R /Prev 2009 0 R /Next 2015 0 R >> endobj 2009 0 obj << /Title 2010 0 R /A 2008 0 R /Parent 1892 0 R /Prev 2006 0 R /Next 2012 0 R >> endobj 2006 0 obj << /Title 2007 0 R /A 2005 0 R /Parent 1892 0 R /Prev 2003 0 R /Next 2009 0 R >> endobj 2003 0 obj << /Title 2004 0 R /A 2002 0 R /Parent 1892 0 R /Prev 2000 0 R /Next 2006 0 R >> endobj 2000 0 obj << /Title 2001 0 R /A 1999 0 R /Parent 1892 0 R /Prev 1997 0 R /Next 2003 0 R >> endobj 1997 0 obj << /Title 1998 0 R /A 1996 0 R /Parent 1892 0 R /Prev 1994 0 R /Next 2000 0 R >> endobj 1994 0 obj << /Title 1995 0 R /A 1993 0 R /Parent 1892 0 R /Prev 1991 0 R /Next 1997 0 R >> endobj 1991 0 obj << /Title 1992 0 R /A 1990 0 R /Parent 1892 0 R /Prev 1988 0 R /Next 1994 0 R >> endobj 1988 0 obj << /Title 1989 0 R /A 1987 0 R /Parent 1892 0 R /Prev 1985 0 R /Next 1991 0 R >> endobj 1985 0 obj << /Title 1986 0 R /A 1984 0 R /Parent 1892 0 R /Prev 1982 0 R /Next 1988 0 R >> endobj 1982 0 obj << /Title 1983 0 R /A 1981 0 R /Parent 1892 0 R /Prev 1979 0 R /Next 1985 0 R >> endobj 1979 0 obj << /Title 1980 0 R /A 1978 0 R /Parent 1892 0 R /Prev 1976 0 R /Next 1982 0 R >> endobj 1976 0 obj << /Title 1977 0 R /A 1975 0 R /Parent 1892 0 R /Prev 1973 0 R /Next 1979 0 R >> endobj 1973 0 obj << /Title 1974 0 R /A 1972 0 R /Parent 1892 0 R /Prev 1970 0 R /Next 1976 0 R >> endobj 1970 0 obj << /Title 1971 0 R /A 1969 0 R /Parent 1892 0 R /Prev 1967 0 R /Next 1973 0 R >> endobj 1967 0 obj << /Title 1968 0 R /A 1966 0 R /Parent 1892 0 R /Prev 1964 0 R /Next 1970 0 R >> endobj 1964 0 obj << /Title 1965 0 R /A 1963 0 R /Parent 1892 0 R /Prev 1961 0 R /Next 1967 0 R >> endobj 1961 0 obj << /Title 1962 0 R /A 1960 0 R /Parent 1892 0 R /Prev 1958 0 R /Next 1964 0 R >> endobj 1958 0 obj << /Title 1959 0 R /A 1957 0 R /Parent 1892 0 R /Prev 1955 0 R /Next 1961 0 R >> endobj 1955 0 obj << /Title 1956 0 R /A 1954 0 R /Parent 1892 0 R /Prev 1952 0 R /Next 1958 0 R >> endobj 1952 0 obj << /Title 1953 0 R /A 1951 0 R /Parent 1892 0 R /Prev 1949 0 R /Next 1955 0 R >> endobj 1949 0 obj << /Title 1950 0 R /A 1948 0 R /Parent 1892 0 R /Prev 1946 0 R /Next 1952 0 R >> endobj 1946 0 obj << /Title 1947 0 R /A 1945 0 R /Parent 1892 0 R /Prev 1943 0 R /Next 1949 0 R >> endobj 1943 0 obj << /Title 1944 0 R /A 1942 0 R /Parent 1892 0 R /Prev 1940 0 R /Next 1946 0 R >> endobj 1940 0 obj << /Title 1941 0 R /A 1939 0 R /Parent 1892 0 R /Prev 1937 0 R /Next 1943 0 R >> endobj 1937 0 obj << /Title 1938 0 R /A 1936 0 R /Parent 1892 0 R /Prev 1934 0 R /Next 1940 0 R >> endobj 1934 0 obj << /Title 1935 0 R /A 1933 0 R /Parent 1892 0 R /Prev 1931 0 R /Next 1937 0 R >> endobj 1931 0 obj << /Title 1932 0 R /A 1930 0 R /Parent 1892 0 R /Prev 1928 0 R /Next 1934 0 R >> endobj 1928 0 obj << /Title 1929 0 R /A 1927 0 R /Parent 1892 0 R /Prev 1925 0 R /Next 1931 0 R >> endobj 1925 0 obj << /Title 1926 0 R /A 1924 0 R /Parent 1892 0 R /Prev 1922 0 R /Next 1928 0 R >> endobj 1922 0 obj << /Title 1923 0 R /A 1921 0 R /Parent 1892 0 R /Prev 1919 0 R /Next 1925 0 R >> endobj 1919 0 obj << /Title 1920 0 R /A 1918 0 R /Parent 1892 0 R /Prev 1916 0 R /Next 1922 0 R >> endobj 1916 0 obj << /Title 1917 0 R /A 1915 0 R /Parent 1892 0 R /Prev 1913 0 R /Next 1919 0 R >> endobj 1913 0 obj << /Title 1914 0 R /A 1912 0 R /Parent 1892 0 R /Prev 1910 0 R /Next 1916 0 R >> endobj 1910 0 obj << /Title 1911 0 R /A 1909 0 R /Parent 1892 0 R /Prev 1907 0 R /Next 1913 0 R >> endobj 1907 0 obj << /Title 1908 0 R /A 1906 0 R /Parent 1892 0 R /Prev 1904 0 R /Next 1910 0 R >> endobj 1904 0 obj << /Title 1905 0 R /A 1903 0 R /Parent 1892 0 R /Prev 1901 0 R /Next 1907 0 R >> endobj 1901 0 obj << /Title 1902 0 R /A 1900 0 R /Parent 1892 0 R /Prev 1898 0 R /Next 1904 0 R >> endobj 1898 0 obj << /Title 1899 0 R /A 1897 0 R /Parent 1892 0 R /Prev 1895 0 R /Next 1901 0 R >> endobj 1895 0 obj << /Title 1896 0 R /A 1894 0 R /Parent 1892 0 R /Next 1898 0 R >> endobj 1892 0 obj << /Title 1893 0 R /A 1891 0 R /Parent 1886 0 R /Prev 1889 0 R /First 1895 0 R /Last 2345 0 R /Count -151 >> endobj 1889 0 obj << /Title 1890 0 R /A 1888 0 R /Parent 1886 0 R /Next 1892 0 R >> endobj 1886 0 obj << /Title 1887 0 R /A 1885 0 R /Parent 2459 0 R /Prev 1856 0 R /Next 2348 0 R /First 1889 0 R /Last 1892 0 R /Count -2 >> endobj 1883 0 obj << /Title 1884 0 R /A 1882 0 R /Parent 1877 0 R /Prev 1880 0 R >> endobj 1880 0 obj << /Title 1881 0 R /A 1879 0 R /Parent 1877 0 R /Next 1883 0 R >> endobj 1877 0 obj << /Title 1878 0 R /A 1876 0 R /Parent 1856 0 R /Prev 1874 0 R /First 1880 0 R /Last 1883 0 R /Count -2 >> endobj 1874 0 obj << /Title 1875 0 R /A 1873 0 R /Parent 1856 0 R /Prev 1871 0 R /Next 1877 0 R >> endobj 1871 0 obj << /Title 1872 0 R /A 1870 0 R /Parent 1856 0 R /Prev 1868 0 R /Next 1874 0 R >> endobj 1868 0 obj << /Title 1869 0 R /A 1867 0 R /Parent 1856 0 R /Prev 1865 0 R /Next 1871 0 R >> endobj 1865 0 obj << /Title 1866 0 R /A 1864 0 R /Parent 1856 0 R /Prev 1862 0 R /Next 1868 0 R >> endobj 1862 0 obj << /Title 1863 0 R /A 1861 0 R /Parent 1856 0 R /Prev 1859 0 R /Next 1865 0 R >> endobj 1859 0 obj << /Title 1860 0 R /A 1858 0 R /Parent 1856 0 R /Next 1862 0 R >> endobj 1856 0 obj << /Title 1857 0 R /A 1855 0 R /Parent 2459 0 R /Prev 1853 0 R /Next 1886 0 R /First 1859 0 R /Last 1877 0 R /Count -7 >> endobj 1853 0 obj << /Title 1854 0 R /A 1852 0 R /Parent 2459 0 R /Prev 1745 0 R /Next 1856 0 R >> endobj 1850 0 obj << /Title 1851 0 R /A 1849 0 R /Parent 1832 0 R /Prev 1847 0 R >> endobj 1847 0 obj << /Title 1848 0 R /A 1846 0 R /Parent 1832 0 R /Prev 1844 0 R /Next 1850 0 R >> endobj 1844 0 obj << /Title 1845 0 R /A 1843 0 R /Parent 1832 0 R /Prev 1841 0 R /Next 1847 0 R >> endobj 1841 0 obj << /Title 1842 0 R /A 1840 0 R /Parent 1832 0 R /Prev 1838 0 R /Next 1844 0 R >> endobj 1838 0 obj << /Title 1839 0 R /A 1837 0 R /Parent 1832 0 R /Prev 1835 0 R /Next 1841 0 R >> endobj 1835 0 obj << /Title 1836 0 R /A 1834 0 R /Parent 1832 0 R /Next 1838 0 R >> endobj 1832 0 obj << /Title 1833 0 R /A 1831 0 R /Parent 1745 0 R /Prev 1784 0 R /First 1835 0 R /Last 1850 0 R /Count -6 >> endobj 1829 0 obj << /Title 1830 0 R /A 1828 0 R /Parent 1784 0 R /Prev 1826 0 R >> endobj 1826 0 obj << /Title 1827 0 R /A 1825 0 R /Parent 1784 0 R /Prev 1823 0 R /Next 1829 0 R >> endobj 1823 0 obj << /Title 1824 0 R /A 1822 0 R /Parent 1784 0 R /Prev 1820 0 R /Next 1826 0 R >> endobj 1820 0 obj << /Title 1821 0 R /A 1819 0 R /Parent 1784 0 R /Prev 1817 0 R /Next 1823 0 R >> endobj 1817 0 obj << /Title 1818 0 R /A 1816 0 R /Parent 1784 0 R /Prev 1811 0 R /Next 1820 0 R >> endobj 1814 0 obj << /Title 1815 0 R /A 1813 0 R /Parent 1811 0 R >> endobj 1811 0 obj << /Title 1812 0 R /A 1810 0 R /Parent 1784 0 R /Prev 1808 0 R /Next 1817 0 R /First 1814 0 R /Last 1814 0 R /Count -1 >> endobj 1808 0 obj << /Title 1809 0 R /A 1807 0 R /Parent 1784 0 R /Prev 1805 0 R /Next 1811 0 R >> endobj 1805 0 obj << /Title 1806 0 R /A 1804 0 R /Parent 1784 0 R /Prev 1802 0 R /Next 1808 0 R >> endobj 1802 0 obj << /Title 1803 0 R /A 1801 0 R /Parent 1784 0 R /Prev 1799 0 R /Next 1805 0 R >> endobj 1799 0 obj << /Title 1800 0 R /A 1798 0 R /Parent 1784 0 R /Prev 1796 0 R /Next 1802 0 R >> endobj 1796 0 obj << /Title 1797 0 R /A 1795 0 R /Parent 1784 0 R /Prev 1793 0 R /Next 1799 0 R >> endobj 1793 0 obj << /Title 1794 0 R /A 1792 0 R /Parent 1784 0 R /Prev 1790 0 R /Next 1796 0 R >> endobj 1790 0 obj << /Title 1791 0 R /A 1789 0 R /Parent 1784 0 R /Prev 1787 0 R /Next 1793 0 R >> endobj 1787 0 obj << /Title 1788 0 R /A 1786 0 R /Parent 1784 0 R /Next 1790 0 R >> endobj 1784 0 obj << /Title 1785 0 R /A 1783 0 R /Parent 1745 0 R /Prev 1748 0 R /Next 1832 0 R /First 1787 0 R /Last 1829 0 R /Count -14 >> endobj 1781 0 obj << /Title 1782 0 R /A 1780 0 R /Parent 1748 0 R /Prev 1778 0 R >> endobj 1778 0 obj << /Title 1779 0 R /A 1777 0 R /Parent 1748 0 R /Prev 1775 0 R /Next 1781 0 R >> endobj 1775 0 obj << /Title 1776 0 R /A 1774 0 R /Parent 1748 0 R /Prev 1772 0 R /Next 1778 0 R >> endobj 1772 0 obj << /Title 1773 0 R /A 1771 0 R /Parent 1748 0 R /Prev 1769 0 R /Next 1775 0 R >> endobj 1769 0 obj << /Title 1770 0 R /A 1768 0 R /Parent 1748 0 R /Prev 1766 0 R /Next 1772 0 R >> endobj 1766 0 obj << /Title 1767 0 R /A 1765 0 R /Parent 1748 0 R /Prev 1763 0 R /Next 1769 0 R >> endobj 1763 0 obj << /Title 1764 0 R /A 1762 0 R /Parent 1748 0 R /Prev 1760 0 R /Next 1766 0 R >> endobj 1760 0 obj << /Title 1761 0 R /A 1759 0 R /Parent 1748 0 R /Prev 1757 0 R /Next 1763 0 R >> endobj 1757 0 obj << /Title 1758 0 R /A 1756 0 R /Parent 1748 0 R /Prev 1754 0 R /Next 1760 0 R >> endobj 1754 0 obj << /Title 1755 0 R /A 1753 0 R /Parent 1748 0 R /Prev 1751 0 R /Next 1757 0 R >> endobj 1751 0 obj << /Title 1752 0 R /A 1750 0 R /Parent 1748 0 R /Next 1754 0 R >> endobj 1748 0 obj << /Title 1749 0 R /A 1747 0 R /Parent 1745 0 R /Next 1784 0 R /First 1751 0 R /Last 1781 0 R /Count -11 >> endobj 1745 0 obj << /Title 1746 0 R /A 1744 0 R /Parent 2459 0 R /Prev 1700 0 R /Next 1853 0 R /First 1748 0 R /Last 1832 0 R /Count -3 >> endobj 1742 0 obj << /Title 1743 0 R /A 1741 0 R /Parent 1700 0 R /Prev 1739 0 R >> endobj 1739 0 obj << /Title 1740 0 R /A 1738 0 R /Parent 1700 0 R /Prev 1736 0 R /Next 1742 0 R >> endobj 1736 0 obj << /Title 1737 0 R /A 1735 0 R /Parent 1700 0 R /Prev 1733 0 R /Next 1739 0 R >> endobj 1733 0 obj << /Title 1734 0 R /A 1732 0 R /Parent 1700 0 R /Prev 1721 0 R /Next 1736 0 R >> endobj 1730 0 obj << /Title 1731 0 R /A 1729 0 R /Parent 1721 0 R /Prev 1727 0 R >> endobj 1727 0 obj << /Title 1728 0 R /A 1726 0 R /Parent 1721 0 R /Prev 1724 0 R /Next 1730 0 R >> endobj 1724 0 obj << /Title 1725 0 R /A 1723 0 R /Parent 1721 0 R /Next 1727 0 R >> endobj 1721 0 obj << /Title 1722 0 R /A 1720 0 R /Parent 1700 0 R /Prev 1715 0 R /Next 1733 0 R /First 1724 0 R /Last 1730 0 R /Count -3 >> endobj 1718 0 obj << /Title 1719 0 R /A 1717 0 R /Parent 1715 0 R >> endobj 1715 0 obj << /Title 1716 0 R /A 1714 0 R /Parent 1700 0 R /Prev 1712 0 R /Next 1721 0 R /First 1718 0 R /Last 1718 0 R /Count -1 >> endobj 1712 0 obj << /Title 1713 0 R /A 1711 0 R /Parent 1700 0 R /Prev 1709 0 R /Next 1715 0 R >> endobj 1709 0 obj << /Title 1710 0 R /A 1708 0 R /Parent 1700 0 R /Prev 1706 0 R /Next 1712 0 R >> endobj 1706 0 obj << /Title 1707 0 R /A 1705 0 R /Parent 1700 0 R /Prev 1703 0 R /Next 1709 0 R >> endobj 1703 0 obj << /Title 1704 0 R /A 1702 0 R /Parent 1700 0 R /Next 1706 0 R >> endobj 1700 0 obj << /Title 1701 0 R /A 1699 0 R /Parent 2459 0 R /Prev 1697 0 R /Next 1745 0 R /First 1703 0 R /Last 1742 0 R /Count -10 >> endobj 1697 0 obj << /Title 1698 0 R /A 1696 0 R /Parent 2459 0 R /Prev 1694 0 R /Next 1700 0 R >> endobj 1694 0 obj << /Title 1695 0 R /A 1693 0 R /Parent 2459 0 R /Prev 1691 0 R /Next 1697 0 R >> endobj 1691 0 obj << /Title 1692 0 R /A 1690 0 R /Parent 2459 0 R /Prev 1688 0 R /Next 1694 0 R >> endobj 1688 0 obj << /Title 1689 0 R /A 1687 0 R /Parent 2459 0 R /Prev 1682 0 R /Next 1691 0 R >> endobj 1685 0 obj << /Title 1686 0 R /A 1684 0 R /Parent 1682 0 R >> endobj 1682 0 obj << /Title 1683 0 R /A 1681 0 R /Parent 2459 0 R /Prev 1670 0 R /Next 1688 0 R /First 1685 0 R /Last 1685 0 R /Count -1 >> endobj 1679 0 obj << /Title 1680 0 R /A 1678 0 R /Parent 1670 0 R /Prev 1676 0 R >> endobj 1676 0 obj << /Title 1677 0 R /A 1675 0 R /Parent 1670 0 R /Prev 1673 0 R /Next 1679 0 R >> endobj 1673 0 obj << /Title 1674 0 R /A 1672 0 R /Parent 1670 0 R /Next 1676 0 R >> endobj 1670 0 obj << /Title 1671 0 R /A 1669 0 R /Parent 2459 0 R /Prev 1667 0 R /Next 1682 0 R /First 1673 0 R /Last 1679 0 R /Count -3 >> endobj 1667 0 obj << /Title 1668 0 R /A 1666 0 R /Parent 2459 0 R /Prev 1664 0 R /Next 1670 0 R >> endobj 1664 0 obj << /Title 1665 0 R /A 1663 0 R /Parent 2459 0 R /Prev 1661 0 R /Next 1667 0 R >> endobj 1661 0 obj << /Title 1662 0 R /A 1660 0 R /Parent 2459 0 R /Next 1664 0 R >> endobj 2460 0 obj << /Names [(-1) 1382 0 R (-2) 1420 0 R (-3) 1461 0 R (-4) 1510 0 R (-5) 1562 0 R (-6) 1614 0 R (-7) 1658 0 R (10) 69 0 R (100) 765 0 R (101) 772 0 R (102) 776 0 R (103) 785 0 R (104) 789 0 R (105) 793 0 R (106) 797 0 R (107) 807 0 R (108) 811 0 R (109) 818 0 R (11) 73 0 R (110) 822 0 R (111) 838 0 R (112) 849 0 R (113) 867 0 R (114) 883 0 R (115) 897 0 R (116) 910 0 R (117) 920 0 R (118) 940 0 R (119) 950 0 R (12) 77 0 R (120) 959 0 R (121) 971 0 R (122) 979 0 R (123) 987 0 R (124) 996 0 R (125) 1003 0 R (126) 1014 0 R (127) 1030 0 R (128) 1041 0 R (129) 1049 0 R (13) 82 0 R (130) 1056 0 R (131) 1061 0 R (132) 1070 0 R (133) 1084 0 R (134) 1090 0 R (135) 1103 0 R (136) 1113 0 R (137) 1118 0 R (138) 1123 0 R (139) 1130 0 R (14) 89 0 R (140) 1136 0 R (141) 1141 0 R (142) 1147 0 R (143) 1154 0 R (144) 1163 0 R (145) 1168 0 R (146) 1173 0 R (147) 1178 0 R (148) 1183 0 R (149) 1187 0 R (15) 96 0 R (150) 1196 0 R (151) 1204 0 R (152) 1282 0 R (153) 1371 0 R (154) 2401 0 R (16) 103 0 R (17) 108 0 R (18) 121 0 R (19) 140 0 R (2) 20 0 R (20) 151 0 R (21) 161 0 R (22) 177 0 R (23) 185 0 R (24) 189 0 R (25) 203 0 R (26) 218 0 R (27) 226 0 R (28) 241 0 R (29) 258 0 R (3) 32 0 R (30) 277 0 R (31) 286 0 R (32) 290 0 R (33) 297 0 R (34) 307 0 R (35) 318 0 R (36) 323 0 R (37) 334 0 R (38) 345 0 R (39) 355 0 R (4) 41 0 R (40) 365 0 R (41) 370 0 R (42) 379 0 R (43) 386 0 R (44) 391 0 R (45) 400 0 R (46) 405 0 R (47) 410 0 R (48) 414 0 R (49) 419 0 R (5) 48 0 R (50) 423 0 R (51) 435 0 R (52) 446 0 R (53) 461 0 R (54) 469 0 R (55) 485 0 R (56) 489 0 R (57) 493 0 R (58) 501 0 R (59) 509 0 R (6) 52 0 R (60) 514 0 R (61) 522 0 R (62) 528 0 R (63) 533 0 R (64) 537 0 R (65) 541 0 R (66) 548 0 R (67) 555 0 R (68) 565 0 R (69) 573 0 R (7) 57 0 R (70) 580 0 R (71) 586 0 R (72) 591 0 R (73) 600 0 R (74) 614 0 R (75) 618 0 R (76) 622 0 R (77) 626 0 R (78) 631 0 R (79) 638 0 R (8) 61 0 R (80) 642 0 R (81) 646 0 R (82) 651 0 R (83) 656 0 R (84) 663 0 R (85) 681 0 R (86) 690 0 R (87) 694 0 R (88) 698 0 R (89) 709 0 R (9) 65 0 R (90) 716 0 R (91) 721 0 R (92) 725 0 R (93) 729 0 R (94) 740 0 R (95) 744 0 R (96) 748 0 R (97) 753 0 R (98) 757 0 R (99) 761 0 R (Appearance) 308 0 R (Appearance Panel) 309 0 R (Appearances) 359 0 R (Argument Conventions) 813 0 R (Authors) 92 0 R (BBOX) 524 0 R (BBP and BEZ) 529 0 R (Basic Interaction) 219 0 R (Binary format) 431 0 R (COMMENT) 457 0 R (Cameras) 222 0 R (Chunks) 1149 0 R (Command Line Options) 193 0 R (Commands) 273 0 R (Common syntax) 426 0 R (Contributing) 99 0 R (Conventions) 425 0 R (Copying) 28 0 R (Customization) 664 0 R (DISCGRP) 593 0 R (Distrib) 33 0 R (Example1) 685 0 R (Example2) 710 0 R (Example3) 733 0 R (Example4) 780 0 R (File names) 429 0 R (Forms) 712 0 R (Function Index) 1205 0 R (GCL) 199 0 R (GCL Reference) 823 0 R (GROUP) 592 0 R (Geomview.m) 1131 0 R (History) 90 0 R (INST) 566 0 R (INST Examples) 581 0 R (Installation) 1159 0 R (Interaction) 190 0 R (Interface) 682 0 R (Intro) 21 0 R (Keyboard Shortcuts) 406 0 R (LIST) 582 0 R (Lighting Panel) 346 0 R (List of Figures) 2402 0 R (Loading) 242 0 R (MESH) 517 0 R (Materials Panel) 335 0 R (Mathematica) 1124 0 R (Module Installation) 686 0 R (Modules) 231 0 R (Mouse Motions) 230 0 R (ND Transformation matrices) 448 0 R (ND-Vertices) 436 0 R (ND-axes) 973 0 R (ND-color) 974 0 R (ND-xform) 975 0 R (ND-xform-get) 980 0 R (ND-xform-set) 981 0 R (NeXT) 989 0 R (Networked Geomview) 1143 0 R (Non-Euclidean Geometry) 232 0 R (Non-geometric objects) 601 0 R (OFF) 456 0 R (OOGL File Formats) 424 0 R (OOGL.m) 1125 0 R (Object File Formats) 515 0 R (Overview) 109 0 R (Package Details) 1155 0 R (Package Installation) 1156 0 R (Platforms) 97 0 R (Point of Interest) 282 0 R (Private Module Installation) 798 0 R (Pronunciation) 104 0 R (QUAD) 455 0 R (References) 462 0 R (Remote Display) 1142 0 R (RenderMan) 1137 0 R (SKEL) 550 0 R (SPHERE) 557 0 R (Saving) 381 0 R (Source Code Installation) 1150 0 R (Starting Geomview) 191 0 R (Support) 1188 0 R (Surface normal directions) 442 0 R (System Module Installation) 803 0 R (TLIST) 587 0 R (Texture Mapping) 481 0 R (Transformation matrices) 447 0 R (Tutorial) 122 0 R (Unix Binary Detail) 1174 0 R (Unix Binary Installation) 1169 0 R (VECT) 544 0 R (Vertices) 430 0 R (XForms) 730 0 R (all) 839 0 R (and) 840 0 R (ap-override) 841 0 R (appearance) 480 0 R (backcolor) 842 0 R (background-image) 843 0 R (bbox-color) 844 0 R (bbox-draw) 845 0 R (camera) 610 0 R (camera-draw) 852 0 R (camera-prop) 853 0 R (camera-reset) 854 0 R (car) 855 0 R (cdr) 856 0 R (clock) 857 0 R (command) 860 0 R (copy) 868 0 R (cursor-still) 869 0 R (cursor-twitch) 870 0 R (delete) 871 0 R (dice) 872 0 R (dimension) 874 0 R (dither) 875 0 R (draw) 876 0 R (dump-handles) 884 0 R (echo) 885 0 R (emodule-clear) 886 0 R (emodule-define) 209 0 R (emodule-defined) 888 0 R (emodule-isrunning) 889 0 R (emodule-path) 890 0 R (emodule-run) 834 0 R (emodule-sort) 901 0 R (emodule-start) 902 0 R (emodule-transmit) 903 0 R (eq) 827 0 R (escale) 904 0 R (event-keys) 905 0 R (event-mode) 906 0 R (event-pick) 911 0 R (evert) 912 0 R (exit) 913 0 R (ezoom) 914 0 R (figap) 319 0 R (figappearance) 152 0 R (figcamerapanel) 366 0 R (figcolorchooser) 163 0 R (figcolorchooserpanel) 324 0 R (figcommandpanel) 401 0 R (figfilespanel) 179 0 R (figinitial) 130 0 R (figloadpanel) 261 0 R (figlookatworld) 142 0 R (figmainpanel) 220 0 R (figmatpanel) 336 0 R (figmyfilelist) 243 0 R (figsavepanel) 387 0 R (figtools) 278 0 R (figtrefdodec) 181 0 R (freeze) 915 0 R (geometry) 207 0 R (geomview-version) 916 0 R (gt) 828 0 R (hdefine) 465 0 R (hdelete) 924 0 R (help) 768 0 R (hmodel) 931 0 R (hsphere-draw) 934 0 R (if) 935 0 R (image) 497 0 R (inhibit-warning) 941 0 R (input-translator) 942 0 R (interest) 943 0 R (lines-closer) 945 0 R (load) 270 0 R (load-path) 479 0 R (look) 952 0 R (look-encompass) 953 0 R (look-encompass-size) 955 0 R (look-recenter) 960 0 R (look-toward) 961 0 R (lt) 826 0 R (merge) 962 0 R (merge-ap) 361 0 R (merge-base-ap) 963 0 R (merge-baseap) 360 0 R (morehelp) 832 0 R (name-object) 972 0 R (new-alien) 982 0 R (new-camera) 861 0 R (new-center) 983 0 R (new-geometry) 271 0 R (new-reset) 988 0 R (normalization) 990 0 R (not) 991 0 R (ntransform) 632 0 R (or) 992 0 R (pick) 946 0 R (pick-invisible) 997 0 R (pickable) 998 0 R (position) 999 0 R (position-at) 1004 0 R (position-toward) 1005 0 R (progn) 676 0 R (quit) 1006 0 R (quote) 1008 0 R (rawevent) 1009 0 R (rawpick) 1010 0 R (read) 272 0 R (real-id) 1018 0 R (redraw) 879 0 R (regtable) 1019 0 R (rehash-emodule-path) 1020 0 R (replace-geometry) 1024 0 R (rib-display) 1025 0 R (rib-snapshot) 1031 0 R (scale) 1033 0 R (scene) 1034 0 R (set-clock) 862 0 R (set-conformal-refine) 1037 0 R (set-emodule-path) 893 0 R (set-load-path) 269 0 R (set-motionscale) 1042 0 R (setenv) 1043 0 R (sgi) 1044 0 R (shell) 824 0 R (sleep-for) 1045 0 R (sleep-until) 863 0 R (snapshot) 1050 0 R (soft-shader) 1051 0 R (space) 936 0 R (stereowin) 1052 0 R (time-interests) 1057 0 R (transform) 627 0 R (transform-incr) 1062 0 R (transform-set) 1063 0 R (ui-cam-focus) 677 0 R (ui-center) 1065 0 R (ui-center-origin) 1066 0 R (ui-emotion-program) 1071 0 R (ui-emotion-run) 1074 0 R (ui-freeze) 1077 0 R (ui-html-browser) 1078 0 R (ui-motion) 293 0 R (ui-panel) 208 0 R (ui-pdf-viewer) 1085 0 R (ui-target) 1086 0 R (uninterest) 1091 0 R (update) 1093 0 R (update-draw) 1094 0 R (window) 652 0 R (winenter) 1098 0 R (write) 736 0 R (write-comments) 1104 0 R (write-handle) 1105 0 R (write-sexpr) 1106 0 R (xform) 1107 0 R (xform-incr) 1108 0 R (xform-set) 1109 0 R (zoom) 1114 0 R] /Limits [(-1) (zoom)] >> endobj 2461 0 obj << /Kids [2460 0 R] >> endobj 2462 0 obj << /Dests 2461 0 R >> endobj 2463 0 obj << /Type /Catalog /Pages 2458 0 R /Outlines 2459 0 R /Names 2462 0 R /PageMode /UseOutlines >> endobj 2464 0 obj << /Producer (pdfeTeX-1.30.5) /Creator (TeX) /CreationDate (D:20070823145323+02'00') /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.30.5-2.2 (Web2C 7.5.5) kpathsea version 3.5.5) >> endobj xref 0 2465 0000000000 65535 f 0000000692 00000 n 0000000587 00000 n 0000000015 00000 n 0000808839 00000 n 0000795547 00000 n 0000808679 00000 n 0000793948 00000 n 0000775568 00000 n 0000793789 00000 n 0000774939 00000 n 0000773105 00000 n 0000774777 00000 n 0000810127 00000 n 0000001149 00000 n 0000001041 00000 n 0000000783 00000 n 0000003665 00000 n 0000002935 00000 n 0000001218 00000 n 0000003563 00000 n 0000003614 00000 n 0000003076 00000 n 0000003216 00000 n 0000771576 00000 n 0000754805 00000 n 0000771414 00000 n 0000003374 00000 n 0000006583 00000 n 0000005814 00000 n 0000005427 00000 n 0000003757 00000 n 0000005712 00000 n 0000005763 00000 n 0000753685 00000 n 0000740893 00000 n 0000753523 00000 n 0000005554 00000 n 0000006634 00000 n 0000006424 00000 n 0000005918 00000 n 0000006532 00000 n 0000739597 00000 n 0000727278 00000 n 0000739436 00000 n 0000010112 00000 n 0000009953 00000 n 0000006726 00000 n 0000010061 00000 n 0000013926 00000 n 0000013767 00000 n 0000010204 00000 n 0000013875 00000 n 0000810237 00000 n 0000017690 00000 n 0000017531 00000 n 0000014018 00000 n 0000017639 00000 n 0000021399 00000 n 0000021240 00000 n 0000017771 00000 n 0000021348 00000 n 0000025222 00000 n 0000025063 00000 n 0000021480 00000 n 0000025171 00000 n 0000028800 00000 n 0000028641 00000 n 0000025303 00000 n 0000028749 00000 n 0000032486 00000 n 0000032327 00000 n 0000028869 00000 n 0000032435 00000 n 0000033653 00000 n 0000033494 00000 n 0000032578 00000 n 0000033602 00000 n 0000810348 00000 n 0000036017 00000 n 0000035858 00000 n 0000033733 00000 n 0000035966 00000 n 0000726058 00000 n 0000713999 00000 n 0000725894 00000 n 0000040032 00000 n 0000039589 00000 n 0000036133 00000 n 0000039874 00000 n 0000039925 00000 n 0000039716 00000 n 0000039976 00000 n 0000041343 00000 n 0000040968 00000 n 0000040124 00000 n 0000041241 00000 n 0000041292 00000 n 0000041095 00000 n 0000555482 00000 n 0000042326 00000 n 0000042109 00000 n 0000041423 00000 n 0000042220 00000 n 0000042273 00000 n 0000045284 00000 n 0000045067 00000 n 0000042407 00000 n 0000045178 00000 n 0000045231 00000 n 0000712894 00000 n 0000697650 00000 n 0000712730 00000 n 0000045378 00000 n 0000045800 00000 n 0000045979 00000 n 0000046026 00000 n 0000067791 00000 n 0000070508 00000 n 0000070067 00000 n 0000067811 00000 n 0000070344 00000 n 0000070397 00000 n 0000697275 00000 n 0000695668 00000 n 0000697111 00000 n 0000695094 00000 n 0000691909 00000 n 0000694932 00000 n 0000070199 00000 n 0000070450 00000 n 0000810461 00000 n 0000070667 00000 n 0000071072 00000 n 0000071249 00000 n 0000071296 00000 n 0000075913 00000 n 0000079556 00000 n 0000079229 00000 n 0000075933 00000 n 0000079503 00000 n 0000079361 00000 n 0000087665 00000 n 0000079651 00000 n 0000080064 00000 n 0000080241 00000 n 0000080288 00000 n 0000086427 00000 n 0000087781 00000 n 0000087500 00000 n 0000086447 00000 n 0000087612 00000 n 0000087723 00000 n 0000087905 00000 n 0000088316 00000 n 0000088495 00000 n 0000088542 00000 n 0000091722 00000 n 0000095227 00000 n 0000094834 00000 n 0000091742 00000 n 0000095116 00000 n 0000094966 00000 n 0000095169 00000 n 0000095362 00000 n 0000095789 00000 n 0000095966 00000 n 0000096013 00000 n 0000102242 00000 n 0000102262 00000 n 0000102687 00000 n 0000102864 00000 n 0000102911 00000 n 0000109150 00000 n 0000111785 00000 n 0000111239 00000 n 0000109170 00000 n 0000111674 00000 n 0000111379 00000 n 0000111727 00000 n 0000111527 00000 n 0000112382 00000 n 0000112440 00000 n 0000112217 00000 n 0000111908 00000 n 0000112329 00000 n 0000116844 00000 n 0000116190 00000 n 0000112538 00000 n 0000116622 00000 n 0000116675 00000 n 0000116728 00000 n 0000116330 00000 n 0000116786 00000 n 0000116484 00000 n 0000690858 00000 n 0000681620 00000 n 0000690695 00000 n 0000810579 00000 n 0000421492 00000 n 0000120584 00000 n 0000119952 00000 n 0000116999 00000 n 0000120531 00000 n 0000120100 00000 n 0000120241 00000 n 0000120384 00000 n 0000444690 00000 n 0000502933 00000 n 0000439096 00000 n 0000120690 00000 n 0000121105 00000 n 0000121284 00000 n 0000121331 00000 n 0000128454 00000 n 0000131738 00000 n 0000131308 00000 n 0000128474 00000 n 0000131574 00000 n 0000131627 00000 n 0000131680 00000 n 0000131440 00000 n 0000217009 00000 n 0000136805 00000 n 0000136165 00000 n 0000131884 00000 n 0000136752 00000 n 0000136313 00000 n 0000136455 00000 n 0000136596 00000 n 0000161307 00000 n 0000361772 00000 n 0000514020 00000 n 0000136949 00000 n 0000137372 00000 n 0000137549 00000 n 0000137596 00000 n 0000143299 00000 n 0000145752 00000 n 0000145319 00000 n 0000143319 00000 n 0000145588 00000 n 0000145641 00000 n 0000145694 00000 n 0000145451 00000 n 0000145899 00000 n 0000146315 00000 n 0000146494 00000 n 0000146541 00000 n 0000148821 00000 n 0000148841 00000 n 0000149251 00000 n 0000149438 00000 n 0000149485 00000 n 0000156330 00000 n 0000161365 00000 n 0000159758 00000 n 0000156350 00000 n 0000161196 00000 n 0000159954 00000 n 0000160097 00000 n 0000161249 00000 n 0000160239 00000 n 0000160377 00000 n 0000160510 00000 n 0000160643 00000 n 0000160789 00000 n 0000160925 00000 n 0000161061 00000 n 0000485397 00000 n 0000456454 00000 n 0000466586 00000 n 0000474515 00000 n 0000243493 00000 n 0000164360 00000 n 0000163816 00000 n 0000161524 00000 n 0000164249 00000 n 0000164302 00000 n 0000163956 00000 n 0000164103 00000 n 0000810697 00000 n 0000175609 00000 n 0000167864 00000 n 0000167699 00000 n 0000164484 00000 n 0000167811 00000 n 0000171531 00000 n 0000171064 00000 n 0000167959 00000 n 0000171478 00000 n 0000171204 00000 n 0000171340 00000 n 0000500164 00000 n 0000175666 00000 n 0000175282 00000 n 0000171626 00000 n 0000175556 00000 n 0000175414 00000 n 0000175796 00000 n 0000176209 00000 n 0000176386 00000 n 0000176433 00000 n 0000182572 00000 n 0000185455 00000 n 0000185174 00000 n 0000182592 00000 n 0000185286 00000 n 0000185339 00000 n 0000185397 00000 n 0000185585 00000 n 0000185996 00000 n 0000186175 00000 n 0000186222 00000 n 0000189402 00000 n 0000191308 00000 n 0000191085 00000 n 0000189422 00000 n 0000191197 00000 n 0000191250 00000 n 0000194207 00000 n 0000193984 00000 n 0000191420 00000 n 0000194096 00000 n 0000194149 00000 n 0000810815 00000 n 0000194319 00000 n 0000194734 00000 n 0000194911 00000 n 0000194958 00000 n 0000198086 00000 n 0000200838 00000 n 0000200557 00000 n 0000198106 00000 n 0000200669 00000 n 0000200722 00000 n 0000200780 00000 n 0000200973 00000 n 0000201389 00000 n 0000201568 00000 n 0000201615 00000 n 0000204942 00000 n 0000207351 00000 n 0000207128 00000 n 0000204962 00000 n 0000207240 00000 n 0000207293 00000 n 0000207474 00000 n 0000207889 00000 n 0000208066 00000 n 0000208113 00000 n 0000213901 00000 n 0000217067 00000 n 0000216379 00000 n 0000213921 00000 n 0000216956 00000 n 0000216527 00000 n 0000216673 00000 n 0000216820 00000 n 0000272010 00000 n 0000459861 00000 n 0000459745 00000 n 0000219253 00000 n 0000219030 00000 n 0000217173 00000 n 0000219142 00000 n 0000219195 00000 n 0000222683 00000 n 0000222518 00000 n 0000219401 00000 n 0000222630 00000 n 0000222766 00000 n 0000223186 00000 n 0000223363 00000 n 0000223410 00000 n 0000229670 00000 n 0000232074 00000 n 0000231675 00000 n 0000229690 00000 n 0000231963 00000 n 0000231807 00000 n 0000232016 00000 n 0000810933 00000 n 0000234359 00000 n 0000234136 00000 n 0000232168 00000 n 0000234248 00000 n 0000234301 00000 n 0000237631 00000 n 0000237466 00000 n 0000234508 00000 n 0000237578 00000 n 0000237726 00000 n 0000238137 00000 n 0000238316 00000 n 0000238363 00000 n 0000240754 00000 n 0000243608 00000 n 0000243328 00000 n 0000240774 00000 n 0000243440 00000 n 0000243551 00000 n 0000247386 00000 n 0000247163 00000 n 0000243756 00000 n 0000247275 00000 n 0000247328 00000 n 0000249446 00000 n 0000249281 00000 n 0000247529 00000 n 0000249393 00000 n 0000250598 00000 n 0000250433 00000 n 0000249541 00000 n 0000250545 00000 n 0000811051 00000 n 0000251857 00000 n 0000251692 00000 n 0000250692 00000 n 0000251804 00000 n 0000255507 00000 n 0000254744 00000 n 0000251951 00000 n 0000255169 00000 n 0000255222 00000 n 0000255275 00000 n 0000255333 00000 n 0000254884 00000 n 0000255027 00000 n 0000255391 00000 n 0000255449 00000 n 0000263748 00000 n 0000258958 00000 n 0000258374 00000 n 0000255612 00000 n 0000258789 00000 n 0000258842 00000 n 0000681307 00000 n 0000679384 00000 n 0000681142 00000 n 0000258514 00000 n 0000258652 00000 n 0000258900 00000 n 0000263806 00000 n 0000262554 00000 n 0000259089 00000 n 0000263579 00000 n 0000263632 00000 n 0000263690 00000 n 0000262726 00000 n 0000262879 00000 n 0000263029 00000 n 0000263168 00000 n 0000263306 00000 n 0000263443 00000 n 0000286947 00000 n 0000295873 00000 n 0000326189 00000 n 0000267107 00000 n 0000266576 00000 n 0000263924 00000 n 0000266996 00000 n 0000267049 00000 n 0000266716 00000 n 0000266854 00000 n 0000444806 00000 n 0000272067 00000 n 0000270625 00000 n 0000267200 00000 n 0000271957 00000 n 0000270813 00000 n 0000270957 00000 n 0000271100 00000 n 0000271239 00000 n 0000271378 00000 n 0000271522 00000 n 0000271665 00000 n 0000271812 00000 n 0000811169 00000 n 0000456507 00000 n 0000330471 00000 n 0000278902 00000 n 0000273834 00000 n 0000273669 00000 n 0000272173 00000 n 0000273781 00000 n 0000275394 00000 n 0000275229 00000 n 0000273916 00000 n 0000275341 00000 n 0000278960 00000 n 0000278282 00000 n 0000275476 00000 n 0000278849 00000 n 0000278430 00000 n 0000278569 00000 n 0000278709 00000 n 0000330529 00000 n 0000281983 00000 n 0000281231 00000 n 0000279053 00000 n 0000281930 00000 n 0000281387 00000 n 0000281523 00000 n 0000281663 00000 n 0000281798 00000 n 0000283826 00000 n 0000283501 00000 n 0000282077 00000 n 0000283773 00000 n 0000283633 00000 n 0000287063 00000 n 0000286556 00000 n 0000283920 00000 n 0000286836 00000 n 0000286889 00000 n 0000286688 00000 n 0000287005 00000 n 0000811287 00000 n 0000289999 00000 n 0000289608 00000 n 0000287168 00000 n 0000289888 00000 n 0000289740 00000 n 0000289941 00000 n 0000292968 00000 n 0000292745 00000 n 0000290116 00000 n 0000292857 00000 n 0000292910 00000 n 0000295929 00000 n 0000295708 00000 n 0000293085 00000 n 0000295820 00000 n 0000299187 00000 n 0000299022 00000 n 0000296046 00000 n 0000299134 00000 n 0000302452 00000 n 0000301916 00000 n 0000299293 00000 n 0000302341 00000 n 0000302056 00000 n 0000302199 00000 n 0000302394 00000 n 0000306087 00000 n 0000305697 00000 n 0000302582 00000 n 0000305977 00000 n 0000305829 00000 n 0000306030 00000 n 0000811405 00000 n 0000310159 00000 n 0000309130 00000 n 0000306217 00000 n 0000310048 00000 n 0000309294 00000 n 0000310101 00000 n 0000309442 00000 n 0000309594 00000 n 0000309745 00000 n 0000309897 00000 n 0000314080 00000 n 0000313381 00000 n 0000310289 00000 n 0000313969 00000 n 0000314022 00000 n 0000313529 00000 n 0000313673 00000 n 0000313831 00000 n 0000318187 00000 n 0000317560 00000 n 0000314197 00000 n 0000318134 00000 n 0000317708 00000 n 0000317869 00000 n 0000318002 00000 n 0000320016 00000 n 0000319735 00000 n 0000318306 00000 n 0000319847 00000 n 0000319900 00000 n 0000319958 00000 n 0000322928 00000 n 0000322705 00000 n 0000320109 00000 n 0000322817 00000 n 0000322870 00000 n 0000326247 00000 n 0000325598 00000 n 0000323045 00000 n 0000326025 00000 n 0000326078 00000 n 0000326131 00000 n 0000325738 00000 n 0000325877 00000 n 0000811523 00000 n 0000330587 00000 n 0000329053 00000 n 0000326364 00000 n 0000330365 00000 n 0000330418 00000 n 0000329241 00000 n 0000329377 00000 n 0000329516 00000 n 0000329660 00000 n 0000329806 00000 n 0000329951 00000 n 0000330095 00000 n 0000330231 00000 n 0000348696 00000 n 0000333236 00000 n 0000333071 00000 n 0000330706 00000 n 0000333183 00000 n 0000335980 00000 n 0000335815 00000 n 0000333343 00000 n 0000335927 00000 n 0000338356 00000 n 0000338191 00000 n 0000336074 00000 n 0000338303 00000 n 0000341122 00000 n 0000340899 00000 n 0000338451 00000 n 0000341011 00000 n 0000341064 00000 n 0000343976 00000 n 0000343595 00000 n 0000341228 00000 n 0000343865 00000 n 0000343918 00000 n 0000343727 00000 n 0000811641 00000 n 0000345913 00000 n 0000345748 00000 n 0000344081 00000 n 0000345860 00000 n 0000348754 00000 n 0000348531 00000 n 0000346032 00000 n 0000348643 00000 n 0000350959 00000 n 0000350634 00000 n 0000348860 00000 n 0000350906 00000 n 0000350766 00000 n 0000352534 00000 n 0000352311 00000 n 0000351041 00000 n 0000352423 00000 n 0000352476 00000 n 0000353967 00000 n 0000353355 00000 n 0000352627 00000 n 0000353914 00000 n 0000353503 00000 n 0000353638 00000 n 0000353772 00000 n 0000357936 00000 n 0000356687 00000 n 0000354049 00000 n 0000357830 00000 n 0000357883 00000 n 0000678692 00000 n 0000675371 00000 n 0000678528 00000 n 0000356867 00000 n 0000357005 00000 n 0000357143 00000 n 0000357278 00000 n 0000357411 00000 n 0000357543 00000 n 0000357683 00000 n 0000811759 00000 n 0000474217 00000 n 0000496009 00000 n 0000361941 00000 n 0000361284 00000 n 0000358042 00000 n 0000361719 00000 n 0000361825 00000 n 0000361424 00000 n 0000361573 00000 n 0000361883 00000 n 0000416290 00000 n 0000363890 00000 n 0000363725 00000 n 0000362047 00000 n 0000363837 00000 n 0000365428 00000 n 0000365263 00000 n 0000363985 00000 n 0000365375 00000 n 0000370353 00000 n 0000369135 00000 n 0000365510 00000 n 0000370300 00000 n 0000369315 00000 n 0000369467 00000 n 0000369605 00000 n 0000369742 00000 n 0000369880 00000 n 0000370019 00000 n 0000370161 00000 n 0000373725 00000 n 0000373342 00000 n 0000370448 00000 n 0000373614 00000 n 0000373667 00000 n 0000373474 00000 n 0000664826 00000 n 0000375053 00000 n 0000374888 00000 n 0000373855 00000 n 0000375000 00000 n 0000811877 00000 n 0000376358 00000 n 0000376193 00000 n 0000375135 00000 n 0000376305 00000 n 0000378929 00000 n 0000378764 00000 n 0000376440 00000 n 0000378876 00000 n 0000383834 00000 n 0000382909 00000 n 0000379024 00000 n 0000383665 00000 n 0000383718 00000 n 0000383065 00000 n 0000383230 00000 n 0000383776 00000 n 0000383397 00000 n 0000383531 00000 n 0000507178 00000 n 0000386688 00000 n 0000386523 00000 n 0000383940 00000 n 0000386635 00000 n 0000387747 00000 n 0000387582 00000 n 0000386783 00000 n 0000387694 00000 n 0000389319 00000 n 0000389154 00000 n 0000387829 00000 n 0000389266 00000 n 0000811995 00000 n 0000390977 00000 n 0000390812 00000 n 0000389401 00000 n 0000390924 00000 n 0000392043 00000 n 0000391878 00000 n 0000391059 00000 n 0000391990 00000 n 0000395407 00000 n 0000395242 00000 n 0000392125 00000 n 0000395354 00000 n 0000400033 00000 n 0000399564 00000 n 0000395489 00000 n 0000399980 00000 n 0000399704 00000 n 0000399842 00000 n 0000427150 00000 n 0000403704 00000 n 0000403539 00000 n 0000400139 00000 n 0000403651 00000 n 0000408112 00000 n 0000407422 00000 n 0000403798 00000 n 0000408001 00000 n 0000407570 00000 n 0000407717 00000 n 0000407863 00000 n 0000408054 00000 n 0000812113 00000 n 0000409669 00000 n 0000409504 00000 n 0000408218 00000 n 0000409616 00000 n 0000411004 00000 n 0000410839 00000 n 0000409751 00000 n 0000410951 00000 n 0000412217 00000 n 0000412052 00000 n 0000411086 00000 n 0000412164 00000 n 0000416464 00000 n 0000415516 00000 n 0000412299 00000 n 0000416237 00000 n 0000416348 00000 n 0000415672 00000 n 0000415821 00000 n 0000415962 00000 n 0000416102 00000 n 0000416406 00000 n 0000417319 00000 n 0000417154 00000 n 0000416582 00000 n 0000417266 00000 n 0000421603 00000 n 0000421161 00000 n 0000417401 00000 n 0000421439 00000 n 0000421293 00000 n 0000421545 00000 n 0000812231 00000 n 0000424159 00000 n 0000423994 00000 n 0000421758 00000 n 0000424106 00000 n 0000427324 00000 n 0000425953 00000 n 0000424265 00000 n 0000426808 00000 n 0000426861 00000 n 0000426919 00000 n 0000426117 00000 n 0000426977 00000 n 0000427035 00000 n 0000427092 00000 n 0000426257 00000 n 0000426399 00000 n 0000426533 00000 n 0000427208 00000 n 0000426666 00000 n 0000427266 00000 n 0000429902 00000 n 0000429340 00000 n 0000427442 00000 n 0000429452 00000 n 0000429505 00000 n 0000429558 00000 n 0000429616 00000 n 0000429674 00000 n 0000429732 00000 n 0000429789 00000 n 0000429845 00000 n 0000433218 00000 n 0000432036 00000 n 0000429995 00000 n 0000432761 00000 n 0000432192 00000 n 0000432332 00000 n 0000432814 00000 n 0000432872 00000 n 0000432930 00000 n 0000432988 00000 n 0000433046 00000 n 0000433103 00000 n 0000432471 00000 n 0000432615 00000 n 0000433160 00000 n 0000466471 00000 n 0000482484 00000 n 0000485689 00000 n 0000436187 00000 n 0000435116 00000 n 0000433323 00000 n 0000435676 00000 n 0000435729 00000 n 0000435782 00000 n 0000435840 00000 n 0000435898 00000 n 0000435955 00000 n 0000435264 00000 n 0000436013 00000 n 0000436071 00000 n 0000436129 00000 n 0000435408 00000 n 0000435543 00000 n 0000478459 00000 n 0000439328 00000 n 0000438437 00000 n 0000436292 00000 n 0000438874 00000 n 0000438927 00000 n 0000438980 00000 n 0000439038 00000 n 0000438577 00000 n 0000439154 00000 n 0000439212 00000 n 0000439270 00000 n 0000438723 00000 n 0000812349 00000 n 0000482602 00000 n 0000442634 00000 n 0000441651 00000 n 0000439421 00000 n 0000442233 00000 n 0000441799 00000 n 0000441948 00000 n 0000442091 00000 n 0000442286 00000 n 0000442344 00000 n 0000442402 00000 n 0000442460 00000 n 0000442518 00000 n 0000442576 00000 n 0000444864 00000 n 0000444238 00000 n 0000442727 00000 n 0000444350 00000 n 0000444403 00000 n 0000444460 00000 n 0000444518 00000 n 0000444575 00000 n 0000444632 00000 n 0000444748 00000 n 0000449743 00000 n 0000447731 00000 n 0000444957 00000 n 0000449458 00000 n 0000447943 00000 n 0000448088 00000 n 0000448227 00000 n 0000449511 00000 n 0000448369 00000 n 0000448507 00000 n 0000448645 00000 n 0000448783 00000 n 0000448919 00000 n 0000449055 00000 n 0000449569 00000 n 0000449189 00000 n 0000449324 00000 n 0000449627 00000 n 0000449685 00000 n 0000489298 00000 n 0000453399 00000 n 0000452849 00000 n 0000449848 00000 n 0000453119 00000 n 0000453172 00000 n 0000453225 00000 n 0000453283 00000 n 0000452981 00000 n 0000453341 00000 n 0000469433 00000 n 0000456739 00000 n 0000455961 00000 n 0000453504 00000 n 0000456401 00000 n 0000456101 00000 n 0000456565 00000 n 0000456623 00000 n 0000456249 00000 n 0000456681 00000 n 0000459918 00000 n 0000458965 00000 n 0000456832 00000 n 0000459524 00000 n 0000459577 00000 n 0000459630 00000 n 0000459687 00000 n 0000459803 00000 n 0000459113 00000 n 0000459260 00000 n 0000459393 00000 n 0000812467 00000 n 0000463526 00000 n 0000463135 00000 n 0000460011 00000 n 0000463247 00000 n 0000463300 00000 n 0000463353 00000 n 0000463411 00000 n 0000463469 00000 n 0000466644 00000 n 0000466132 00000 n 0000463632 00000 n 0000466244 00000 n 0000466297 00000 n 0000466355 00000 n 0000466413 00000 n 0000466529 00000 n 0000469491 00000 n 0000468978 00000 n 0000466749 00000 n 0000469090 00000 n 0000469143 00000 n 0000469201 00000 n 0000469259 00000 n 0000469317 00000 n 0000469375 00000 n 0000471713 00000 n 0000471374 00000 n 0000469584 00000 n 0000471486 00000 n 0000471539 00000 n 0000471597 00000 n 0000471655 00000 n 0000474574 00000 n 0000473773 00000 n 0000471818 00000 n 0000474047 00000 n 0000474102 00000 n 0000474157 00000 n 0000474276 00000 n 0000473909 00000 n 0000474336 00000 n 0000474396 00000 n 0000474456 00000 n 0000478758 00000 n 0000477295 00000 n 0000474668 00000 n 0000478344 00000 n 0000477477 00000 n 0000477622 00000 n 0000477764 00000 n 0000478399 00000 n 0000478518 00000 n 0000478578 00000 n 0000477907 00000 n 0000478055 00000 n 0000478200 00000 n 0000478638 00000 n 0000478698 00000 n 0000812586 00000 n 0000482661 00000 n 0000481665 00000 n 0000478852 00000 n 0000482254 00000 n 0000482309 00000 n 0000481820 00000 n 0000482364 00000 n 0000482424 00000 n 0000481966 00000 n 0000482113 00000 n 0000482542 00000 n 0000485748 00000 n 0000485226 00000 n 0000482767 00000 n 0000485342 00000 n 0000485451 00000 n 0000485510 00000 n 0000485570 00000 n 0000485629 00000 n 0000489417 00000 n 0000489012 00000 n 0000485854 00000 n 0000489128 00000 n 0000489183 00000 n 0000489238 00000 n 0000489357 00000 n 0000492988 00000 n 0000492762 00000 n 0000489523 00000 n 0000492878 00000 n 0000492933 00000 n 0000496187 00000 n 0000495553 00000 n 0000493094 00000 n 0000495839 00000 n 0000495894 00000 n 0000495949 00000 n 0000495690 00000 n 0000496068 00000 n 0000496128 00000 n 0000500223 00000 n 0000498972 00000 n 0000496281 00000 n 0000499869 00000 n 0000499924 00000 n 0000499145 00000 n 0000499290 00000 n 0000499984 00000 n 0000499433 00000 n 0000499577 00000 n 0000500044 00000 n 0000500104 00000 n 0000499720 00000 n 0000812711 00000 n 0000503112 00000 n 0000502762 00000 n 0000500342 00000 n 0000502878 00000 n 0000502992 00000 n 0000503052 00000 n 0000507237 00000 n 0000506001 00000 n 0000503218 00000 n 0000506883 00000 n 0000506938 00000 n 0000506174 00000 n 0000506998 00000 n 0000507058 00000 n 0000506318 00000 n 0000506459 00000 n 0000506600 00000 n 0000507118 00000 n 0000506740 00000 n 0000510075 00000 n 0000509549 00000 n 0000507331 00000 n 0000509665 00000 n 0000509720 00000 n 0000509775 00000 n 0000509835 00000 n 0000509895 00000 n 0000509955 00000 n 0000510015 00000 n 0000510867 00000 n 0000510641 00000 n 0000510181 00000 n 0000510757 00000 n 0000510812 00000 n 0000514074 00000 n 0000513672 00000 n 0000510961 00000 n 0000513965 00000 n 0000513809 00000 n 0000517060 00000 n 0000516774 00000 n 0000514181 00000 n 0000516890 00000 n 0000516945 00000 n 0000517000 00000 n 0000812836 00000 n 0000519611 00000 n 0000519217 00000 n 0000517178 00000 n 0000519496 00000 n 0000519551 00000 n 0000519354 00000 n 0000522182 00000 n 0000521951 00000 n 0000519705 00000 n 0000522067 00000 n 0000522122 00000 n 0000526084 00000 n 0000525793 00000 n 0000522313 00000 n 0000525909 00000 n 0000525964 00000 n 0000526024 00000 n 0000529537 00000 n 0000529125 00000 n 0000526215 00000 n 0000529422 00000 n 0000529262 00000 n 0000529477 00000 n 0000548618 00000 n 0000533715 00000 n 0000533110 00000 n 0000529655 00000 n 0000533540 00000 n 0000533595 00000 n 0000533655 00000 n 0000533256 00000 n 0000533398 00000 n 0000540430 00000 n 0000537013 00000 n 0000536842 00000 n 0000533848 00000 n 0000536958 00000 n 0000812961 00000 n 0000540545 00000 n 0000540259 00000 n 0000537096 00000 n 0000540375 00000 n 0000540485 00000 n 0000544357 00000 n 0000544126 00000 n 0000540652 00000 n 0000544242 00000 n 0000544297 00000 n 0000548678 00000 n 0000548270 00000 n 0000544477 00000 n 0000548563 00000 n 0000548407 00000 n 0000550396 00000 n 0000550225 00000 n 0000548798 00000 n 0000550341 00000 n 0000552871 00000 n 0000551894 00000 n 0000550479 00000 n 0000552761 00000 n 0000552816 00000 n 0000552058 00000 n 0000552218 00000 n 0000552406 00000 n 0000552603 00000 n 0000555535 00000 n 0000554760 00000 n 0000552965 00000 n 0000555427 00000 n 0000554915 00000 n 0000555112 00000 n 0000555267 00000 n 0000813086 00000 n 0000568701 00000 n 0000558736 00000 n 0000555642 00000 n 0000568591 00000 n 0000568646 00000 n 0000675049 00000 n 0000673231 00000 n 0000674885 00000 n 0000559467 00000 n 0000672757 00000 n 0000669129 00000 n 0000672594 00000 n 0000559606 00000 n 0000559745 00000 n 0000559884 00000 n 0000560023 00000 n 0000560162 00000 n 0000560301 00000 n 0000560440 00000 n 0000560579 00000 n 0000560718 00000 n 0000560857 00000 n 0000560996 00000 n 0000561135 00000 n 0000561274 00000 n 0000561413 00000 n 0000561552 00000 n 0000561691 00000 n 0000561830 00000 n 0000561969 00000 n 0000562108 00000 n 0000562247 00000 n 0000562386 00000 n 0000562525 00000 n 0000562664 00000 n 0000562803 00000 n 0000562942 00000 n 0000563081 00000 n 0000563220 00000 n 0000563359 00000 n 0000563497 00000 n 0000563634 00000 n 0000563771 00000 n 0000563904 00000 n 0000564038 00000 n 0000564171 00000 n 0000564305 00000 n 0000564439 00000 n 0000564573 00000 n 0000564706 00000 n 0000564840 00000 n 0000564974 00000 n 0000565108 00000 n 0000565242 00000 n 0000565375 00000 n 0000565514 00000 n 0000565648 00000 n 0000565781 00000 n 0000565915 00000 n 0000566048 00000 n 0000566182 00000 n 0000566316 00000 n 0000566450 00000 n 0000566584 00000 n 0000566718 00000 n 0000566852 00000 n 0000566986 00000 n 0000567120 00000 n 0000567254 00000 n 0000567388 00000 n 0000567522 00000 n 0000567656 00000 n 0000567790 00000 n 0000567924 00000 n 0000568058 00000 n 0000568192 00000 n 0000568326 00000 n 0000568459 00000 n 0000585070 00000 n 0000572559 00000 n 0000568834 00000 n 0000585015 00000 n 0000573452 00000 n 0000573591 00000 n 0000573730 00000 n 0000573869 00000 n 0000574008 00000 n 0000574147 00000 n 0000574286 00000 n 0000574425 00000 n 0000574564 00000 n 0000574703 00000 n 0000574842 00000 n 0000574981 00000 n 0000575119 00000 n 0000575257 00000 n 0000575396 00000 n 0000575535 00000 n 0000575673 00000 n 0000575811 00000 n 0000575950 00000 n 0000576089 00000 n 0000576228 00000 n 0000576367 00000 n 0000576505 00000 n 0000576642 00000 n 0000576781 00000 n 0000576920 00000 n 0000577059 00000 n 0000577198 00000 n 0000577337 00000 n 0000577476 00000 n 0000577615 00000 n 0000577754 00000 n 0000577893 00000 n 0000578032 00000 n 0000578171 00000 n 0000578310 00000 n 0000578448 00000 n 0000578587 00000 n 0000578724 00000 n 0000578858 00000 n 0000578992 00000 n 0000579125 00000 n 0000579259 00000 n 0000579392 00000 n 0000579526 00000 n 0000579660 00000 n 0000579794 00000 n 0000579928 00000 n 0000580062 00000 n 0000580195 00000 n 0000580329 00000 n 0000580463 00000 n 0000580597 00000 n 0000580731 00000 n 0000580865 00000 n 0000580999 00000 n 0000581133 00000 n 0000581272 00000 n 0000581406 00000 n 0000581539 00000 n 0000581673 00000 n 0000581807 00000 n 0000581941 00000 n 0000582075 00000 n 0000582209 00000 n 0000582343 00000 n 0000582476 00000 n 0000582610 00000 n 0000582744 00000 n 0000582878 00000 n 0000583012 00000 n 0000583146 00000 n 0000583280 00000 n 0000583414 00000 n 0000583548 00000 n 0000583682 00000 n 0000583815 00000 n 0000583949 00000 n 0000584083 00000 n 0000584217 00000 n 0000584350 00000 n 0000584483 00000 n 0000584617 00000 n 0000584751 00000 n 0000584883 00000 n 0000587027 00000 n 0000585826 00000 n 0000585190 00000 n 0000586972 00000 n 0000586017 00000 n 0000586156 00000 n 0000586294 00000 n 0000586432 00000 n 0000586571 00000 n 0000586705 00000 n 0000586838 00000 n 0000593618 00000 n 0000589471 00000 n 0000587147 00000 n 0000593563 00000 n 0000668806 00000 n 0000666991 00000 n 0000668641 00000 n 0000589851 00000 n 0000589982 00000 n 0000590114 00000 n 0000590246 00000 n 0000666668 00000 n 0000664856 00000 n 0000666503 00000 n 0000590378 00000 n 0000590510 00000 n 0000590641 00000 n 0000590774 00000 n 0000590906 00000 n 0000591039 00000 n 0000591172 00000 n 0000591305 00000 n 0000591437 00000 n 0000591570 00000 n 0000591703 00000 n 0000591836 00000 n 0000591969 00000 n 0000592101 00000 n 0000592234 00000 n 0000592367 00000 n 0000592500 00000 n 0000592633 00000 n 0000592766 00000 n 0000592899 00000 n 0000593032 00000 n 0000593165 00000 n 0000593298 00000 n 0000593431 00000 n 0000601737 00000 n 0000596318 00000 n 0000593728 00000 n 0000601682 00000 n 0000596779 00000 n 0000596907 00000 n 0000597039 00000 n 0000597172 00000 n 0000597305 00000 n 0000597437 00000 n 0000597569 00000 n 0000597702 00000 n 0000597835 00000 n 0000597966 00000 n 0000598099 00000 n 0000598232 00000 n 0000598364 00000 n 0000598496 00000 n 0000598629 00000 n 0000598762 00000 n 0000598895 00000 n 0000599028 00000 n 0000599161 00000 n 0000599294 00000 n 0000599427 00000 n 0000599559 00000 n 0000599692 00000 n 0000599825 00000 n 0000599958 00000 n 0000600091 00000 n 0000600224 00000 n 0000600356 00000 n 0000600488 00000 n 0000600621 00000 n 0000600754 00000 n 0000600885 00000 n 0000601018 00000 n 0000601151 00000 n 0000601283 00000 n 0000601416 00000 n 0000601549 00000 n 0000611125 00000 n 0000604684 00000 n 0000601872 00000 n 0000611070 00000 n 0000605208 00000 n 0000605336 00000 n 0000605468 00000 n 0000605601 00000 n 0000605733 00000 n 0000605865 00000 n 0000605998 00000 n 0000606130 00000 n 0000606264 00000 n 0000606398 00000 n 0000606531 00000 n 0000606665 00000 n 0000606799 00000 n 0000606932 00000 n 0000607066 00000 n 0000607199 00000 n 0000607331 00000 n 0000607465 00000 n 0000607599 00000 n 0000607733 00000 n 0000607866 00000 n 0000608000 00000 n 0000608134 00000 n 0000608266 00000 n 0000608400 00000 n 0000608534 00000 n 0000608668 00000 n 0000608802 00000 n 0000608936 00000 n 0000609070 00000 n 0000609204 00000 n 0000609336 00000 n 0000609470 00000 n 0000609604 00000 n 0000609738 00000 n 0000609871 00000 n 0000610005 00000 n 0000610139 00000 n 0000610272 00000 n 0000610404 00000 n 0000610538 00000 n 0000610672 00000 n 0000610805 00000 n 0000610938 00000 n 0000813211 00000 n 0000620818 00000 n 0000613784 00000 n 0000611247 00000 n 0000620763 00000 n 0000614344 00000 n 0000614478 00000 n 0000614612 00000 n 0000614745 00000 n 0000614878 00000 n 0000615012 00000 n 0000615146 00000 n 0000615279 00000 n 0000615413 00000 n 0000615547 00000 n 0000615680 00000 n 0000615814 00000 n 0000615948 00000 n 0000616082 00000 n 0000616216 00000 n 0000616350 00000 n 0000616484 00000 n 0000616618 00000 n 0000616752 00000 n 0000616886 00000 n 0000617020 00000 n 0000617154 00000 n 0000617287 00000 n 0000617421 00000 n 0000617555 00000 n 0000617689 00000 n 0000617822 00000 n 0000617956 00000 n 0000618090 00000 n 0000618223 00000 n 0000618357 00000 n 0000618491 00000 n 0000618623 00000 n 0000618757 00000 n 0000618891 00000 n 0000619025 00000 n 0000619159 00000 n 0000619293 00000 n 0000619427 00000 n 0000619561 00000 n 0000619695 00000 n 0000619829 00000 n 0000619963 00000 n 0000620097 00000 n 0000620230 00000 n 0000620364 00000 n 0000620498 00000 n 0000620632 00000 n 0000630484 00000 n 0000623454 00000 n 0000620903 00000 n 0000630429 00000 n 0000624014 00000 n 0000624148 00000 n 0000624281 00000 n 0000624414 00000 n 0000624548 00000 n 0000624682 00000 n 0000624816 00000 n 0000624949 00000 n 0000625083 00000 n 0000625217 00000 n 0000625348 00000 n 0000625482 00000 n 0000625616 00000 n 0000625750 00000 n 0000625884 00000 n 0000626018 00000 n 0000626152 00000 n 0000626286 00000 n 0000626419 00000 n 0000626553 00000 n 0000626687 00000 n 0000626821 00000 n 0000626954 00000 n 0000627088 00000 n 0000627222 00000 n 0000627356 00000 n 0000627489 00000 n 0000627623 00000 n 0000627757 00000 n 0000627890 00000 n 0000628024 00000 n 0000628158 00000 n 0000628291 00000 n 0000628425 00000 n 0000628559 00000 n 0000628693 00000 n 0000628827 00000 n 0000628961 00000 n 0000629095 00000 n 0000629229 00000 n 0000629363 00000 n 0000629497 00000 n 0000629631 00000 n 0000629764 00000 n 0000629897 00000 n 0000630031 00000 n 0000630165 00000 n 0000630298 00000 n 0000639264 00000 n 0000633379 00000 n 0000630569 00000 n 0000639209 00000 n 0000633867 00000 n 0000634001 00000 n 0000634135 00000 n 0000634269 00000 n 0000634402 00000 n 0000634536 00000 n 0000634670 00000 n 0000634803 00000 n 0000634937 00000 n 0000635071 00000 n 0000635202 00000 n 0000635336 00000 n 0000635470 00000 n 0000635604 00000 n 0000635738 00000 n 0000635872 00000 n 0000636006 00000 n 0000636140 00000 n 0000636274 00000 n 0000636408 00000 n 0000636542 00000 n 0000636676 00000 n 0000636809 00000 n 0000636943 00000 n 0000637076 00000 n 0000637210 00000 n 0000637343 00000 n 0000637477 00000 n 0000637611 00000 n 0000637743 00000 n 0000637877 00000 n 0000638011 00000 n 0000638143 00000 n 0000638277 00000 n 0000638411 00000 n 0000638545 00000 n 0000638679 00000 n 0000638813 00000 n 0000638945 00000 n 0000639077 00000 n 0000640009 00000 n 0000639688 00000 n 0000639386 00000 n 0000639954 00000 n 0000639825 00000 n 0000640105 00000 n 0000838540 00000 n 0000640149 00000 n 0000640194 00000 n 0000838441 00000 n 0000640240 00000 n 0000640273 00000 n 0000838342 00000 n 0000640319 00000 n 0000640347 00000 n 0000838202 00000 n 0000640387 00000 n 0000640433 00000 n 0000838118 00000 n 0000640473 00000 n 0000640502 00000 n 0000838019 00000 n 0000640542 00000 n 0000640626 00000 n 0000837935 00000 n 0000640667 00000 n 0000640733 00000 n 0000837795 00000 n 0000640779 00000 n 0000640833 00000 n 0000837726 00000 n 0000640879 00000 n 0000640907 00000 n 0000837627 00000 n 0000640955 00000 n 0000640995 00000 n 0000837528 00000 n 0000641047 00000 n 0000641097 00000 n 0000837429 00000 n 0000641144 00000 n 0000641173 00000 n 0000837330 00000 n 0000641220 00000 n 0000641249 00000 n 0000837189 00000 n 0000641299 00000 n 0000641331 00000 n 0000837105 00000 n 0000641387 00000 n 0000641425 00000 n 0000837006 00000 n 0000641484 00000 n 0000641525 00000 n 0000836907 00000 n 0000641581 00000 n 0000641635 00000 n 0000836808 00000 n 0000641681 00000 n 0000641731 00000 n 0000836668 00000 n 0000641783 00000 n 0000641841 00000 n 0000836599 00000 n 0000641897 00000 n 0000641947 00000 n 0000836459 00000 n 0000641996 00000 n 0000642045 00000 n 0000836375 00000 n 0000642100 00000 n 0000642141 00000 n 0000836276 00000 n 0000642195 00000 n 0000642235 00000 n 0000836192 00000 n 0000642288 00000 n 0000642327 00000 n 0000836093 00000 n 0000642373 00000 n 0000642401 00000 n 0000835994 00000 n 0000642446 00000 n 0000642483 00000 n 0000835895 00000 n 0000642530 00000 n 0000642569 00000 n 0000835811 00000 n 0000642626 00000 n 0000642665 00000 n 0000835671 00000 n 0000642721 00000 n 0000642759 00000 n 0000835545 00000 n 0000642809 00000 n 0000642841 00000 n 0000835461 00000 n 0000642893 00000 n 0000642952 00000 n 0000835362 00000 n 0000643001 00000 n 0000643032 00000 n 0000835263 00000 n 0000643079 00000 n 0000643108 00000 n 0000835164 00000 n 0000643158 00000 n 0000643201 00000 n 0000835065 00000 n 0000643265 00000 n 0000643311 00000 n 0000834966 00000 n 0000643373 00000 n 0000643417 00000 n 0000834867 00000 n 0000643482 00000 n 0000643529 00000 n 0000834768 00000 n 0000643581 00000 n 0000643615 00000 n 0000834669 00000 n 0000643664 00000 n 0000643732 00000 n 0000834570 00000 n 0000643782 00000 n 0000643814 00000 n 0000834486 00000 n 0000643868 00000 n 0000643904 00000 n 0000834345 00000 n 0000643962 00000 n 0000644002 00000 n 0000834261 00000 n 0000644045 00000 n 0000644100 00000 n 0000834162 00000 n 0000644143 00000 n 0000644198 00000 n 0000834063 00000 n 0000644241 00000 n 0000644289 00000 n 0000833964 00000 n 0000644339 00000 n 0000644375 00000 n 0000833865 00000 n 0000644417 00000 n 0000644447 00000 n 0000833766 00000 n 0000644490 00000 n 0000644521 00000 n 0000833667 00000 n 0000644564 00000 n 0000644595 00000 n 0000833568 00000 n 0000644640 00000 n 0000644673 00000 n 0000833428 00000 n 0000644716 00000 n 0000644747 00000 n 0000833359 00000 n 0000644799 00000 n 0000644833 00000 n 0000833260 00000 n 0000644876 00000 n 0000644907 00000 n 0000833161 00000 n 0000644951 00000 n 0000644983 00000 n 0000833062 00000 n 0000645027 00000 n 0000645059 00000 n 0000832963 00000 n 0000645105 00000 n 0000645139 00000 n 0000832879 00000 n 0000645185 00000 n 0000645221 00000 n 0000832754 00000 n 0000645281 00000 n 0000645323 00000 n 0000832670 00000 n 0000645372 00000 n 0000645411 00000 n 0000832571 00000 n 0000645455 00000 n 0000645489 00000 n 0000832472 00000 n 0000645537 00000 n 0000645575 00000 n 0000832373 00000 n 0000645624 00000 n 0000645665 00000 n 0000832274 00000 n 0000645710 00000 n 0000645738 00000 n 0000832190 00000 n 0000645783 00000 n 0000645810 00000 n 0000832091 00000 n 0000645862 00000 n 0000645913 00000 n 0000831951 00000 n 0000645959 00000 n 0000645996 00000 n 0000831867 00000 n 0000646044 00000 n 0000646109 00000 n 0000831768 00000 n 0000646156 00000 n 0000646210 00000 n 0000831669 00000 n 0000646257 00000 n 0000646336 00000 n 0000831570 00000 n 0000646381 00000 n 0000646420 00000 n 0000831471 00000 n 0000646467 00000 n 0000646548 00000 n 0000831372 00000 n 0000646595 00000 n 0000646669 00000 n 0000831247 00000 n 0000646727 00000 n 0000646767 00000 n 0000831163 00000 n 0000646833 00000 n 0000646881 00000 n 0000831079 00000 n 0000646946 00000 n 0000646993 00000 n 0000830939 00000 n 0000647035 00000 n 0000647090 00000 n 0000830855 00000 n 0000647149 00000 n 0000647215 00000 n 0000830728 00000 n 0000647267 00000 n 0000647307 00000 n 0000830644 00000 n 0000647351 00000 n 0000647373 00000 n 0000830545 00000 n 0000647414 00000 n 0000647436 00000 n 0000830446 00000 n 0000647477 00000 n 0000647499 00000 n 0000830347 00000 n 0000647540 00000 n 0000647562 00000 n 0000830248 00000 n 0000647605 00000 n 0000647627 00000 n 0000830149 00000 n 0000647674 00000 n 0000647697 00000 n 0000830050 00000 n 0000647747 00000 n 0000647769 00000 n 0000829951 00000 n 0000647811 00000 n 0000647835 00000 n 0000829852 00000 n 0000647877 00000 n 0000647901 00000 n 0000829753 00000 n 0000647951 00000 n 0000647983 00000 n 0000829654 00000 n 0000648031 00000 n 0000648061 00000 n 0000829555 00000 n 0000648116 00000 n 0000648153 00000 n 0000829456 00000 n 0000648202 00000 n 0000648233 00000 n 0000829357 00000 n 0000648281 00000 n 0000648311 00000 n 0000829258 00000 n 0000648356 00000 n 0000648383 00000 n 0000829159 00000 n 0000648433 00000 n 0000648465 00000 n 0000829060 00000 n 0000648515 00000 n 0000648547 00000 n 0000828961 00000 n 0000648598 00000 n 0000648631 00000 n 0000828862 00000 n 0000648673 00000 n 0000648697 00000 n 0000828763 00000 n 0000648739 00000 n 0000648763 00000 n 0000828664 00000 n 0000648807 00000 n 0000648833 00000 n 0000828565 00000 n 0000648879 00000 n 0000648907 00000 n 0000828466 00000 n 0000648950 00000 n 0000648975 00000 n 0000828367 00000 n 0000649026 00000 n 0000649059 00000 n 0000828268 00000 n 0000649111 00000 n 0000649145 00000 n 0000828169 00000 n 0000649190 00000 n 0000649217 00000 n 0000828070 00000 n 0000649260 00000 n 0000649285 00000 n 0000827971 00000 n 0000649333 00000 n 0000649363 00000 n 0000827872 00000 n 0000649408 00000 n 0000649435 00000 n 0000827773 00000 n 0000649478 00000 n 0000649503 00000 n 0000827674 00000 n 0000649554 00000 n 0000649587 00000 n 0000827575 00000 n 0000649630 00000 n 0000649655 00000 n 0000827476 00000 n 0000649707 00000 n 0000649741 00000 n 0000827377 00000 n 0000649794 00000 n 0000649829 00000 n 0000827278 00000 n 0000649883 00000 n 0000649919 00000 n 0000827179 00000 n 0000649975 00000 n 0000650013 00000 n 0000827080 00000 n 0000650064 00000 n 0000650097 00000 n 0000826981 00000 n 0000650147 00000 n 0000650179 00000 n 0000826882 00000 n 0000650230 00000 n 0000650263 00000 n 0000826783 00000 n 0000650315 00000 n 0000650349 00000 n 0000826684 00000 n 0000650404 00000 n 0000650441 00000 n 0000826585 00000 n 0000650486 00000 n 0000650513 00000 n 0000826486 00000 n 0000650562 00000 n 0000650593 00000 n 0000826387 00000 n 0000650642 00000 n 0000650673 00000 n 0000826288 00000 n 0000650722 00000 n 0000650753 00000 n 0000826189 00000 n 0000650797 00000 n 0000650823 00000 n 0000826090 00000 n 0000650866 00000 n 0000650891 00000 n 0000825991 00000 n 0000650935 00000 n 0000650961 00000 n 0000825892 00000 n 0000651006 00000 n 0000651033 00000 n 0000825793 00000 n 0000651080 00000 n 0000651109 00000 n 0000825694 00000 n 0000651164 00000 n 0000651201 00000 n 0000825595 00000 n 0000651247 00000 n 0000651275 00000 n 0000825496 00000 n 0000651321 00000 n 0000651349 00000 n 0000825397 00000 n 0000651392 00000 n 0000651417 00000 n 0000825298 00000 n 0000651462 00000 n 0000651489 00000 n 0000825199 00000 n 0000651540 00000 n 0000651573 00000 n 0000825100 00000 n 0000651614 00000 n 0000651637 00000 n 0000825001 00000 n 0000651691 00000 n 0000651727 00000 n 0000824902 00000 n 0000651782 00000 n 0000651819 00000 n 0000824803 00000 n 0000651866 00000 n 0000651895 00000 n 0000824704 00000 n 0000651946 00000 n 0000651979 00000 n 0000824605 00000 n 0000652022 00000 n 0000652047 00000 n 0000824506 00000 n 0000652095 00000 n 0000652125 00000 n 0000824407 00000 n 0000652168 00000 n 0000652193 00000 n 0000824308 00000 n 0000652246 00000 n 0000652281 00000 n 0000824209 00000 n 0000652339 00000 n 0000652379 00000 n 0000824110 00000 n 0000652431 00000 n 0000652465 00000 n 0000824011 00000 n 0000652515 00000 n 0000652547 00000 n 0000823912 00000 n 0000652591 00000 n 0000652617 00000 n 0000823813 00000 n 0000652664 00000 n 0000652693 00000 n 0000823714 00000 n 0000652745 00000 n 0000652779 00000 n 0000823615 00000 n 0000652830 00000 n 0000652863 00000 n 0000823516 00000 n 0000652910 00000 n 0000652939 00000 n 0000823417 00000 n 0000652989 00000 n 0000653021 00000 n 0000823318 00000 n 0000653067 00000 n 0000653095 00000 n 0000823219 00000 n 0000653142 00000 n 0000653171 00000 n 0000823120 00000 n 0000653218 00000 n 0000653247 00000 n 0000823021 00000 n 0000653298 00000 n 0000653331 00000 n 0000822922 00000 n 0000653382 00000 n 0000653415 00000 n 0000822823 00000 n 0000653463 00000 n 0000653493 00000 n 0000822724 00000 n 0000653542 00000 n 0000653573 00000 n 0000822625 00000 n 0000653622 00000 n 0000653653 00000 n 0000822526 00000 n 0000653704 00000 n 0000653737 00000 n 0000822427 00000 n 0000653785 00000 n 0000653815 00000 n 0000822328 00000 n 0000653858 00000 n 0000653883 00000 n 0000822229 00000 n 0000653935 00000 n 0000653969 00000 n 0000822130 00000 n 0000654011 00000 n 0000654035 00000 n 0000822031 00000 n 0000654076 00000 n 0000654099 00000 n 0000821932 00000 n 0000654142 00000 n 0000654167 00000 n 0000821833 00000 n 0000654220 00000 n 0000654255 00000 n 0000821734 00000 n 0000654302 00000 n 0000654331 00000 n 0000821635 00000 n 0000654378 00000 n 0000654407 00000 n 0000821536 00000 n 0000654457 00000 n 0000654489 00000 n 0000821437 00000 n 0000654543 00000 n 0000654579 00000 n 0000821338 00000 n 0000654623 00000 n 0000654649 00000 n 0000821239 00000 n 0000654692 00000 n 0000654717 00000 n 0000821140 00000 n 0000654761 00000 n 0000654787 00000 n 0000821041 00000 n 0000654834 00000 n 0000654863 00000 n 0000820942 00000 n 0000654909 00000 n 0000654937 00000 n 0000820843 00000 n 0000654980 00000 n 0000655005 00000 n 0000820744 00000 n 0000655051 00000 n 0000655079 00000 n 0000820645 00000 n 0000655124 00000 n 0000655151 00000 n 0000820546 00000 n 0000655198 00000 n 0000655227 00000 n 0000820447 00000 n 0000655285 00000 n 0000655325 00000 n 0000820348 00000 n 0000655380 00000 n 0000655417 00000 n 0000820249 00000 n 0000655467 00000 n 0000655499 00000 n 0000820150 00000 n 0000655550 00000 n 0000655583 00000 n 0000820051 00000 n 0000655627 00000 n 0000655653 00000 n 0000819952 00000 n 0000655697 00000 n 0000655723 00000 n 0000819853 00000 n 0000655771 00000 n 0000655801 00000 n 0000819754 00000 n 0000655860 00000 n 0000655901 00000 n 0000819655 00000 n 0000655956 00000 n 0000655993 00000 n 0000819556 00000 n 0000656045 00000 n 0000656079 00000 n 0000819457 00000 n 0000656133 00000 n 0000656169 00000 n 0000819358 00000 n 0000656214 00000 n 0000656241 00000 n 0000819259 00000 n 0000656283 00000 n 0000656307 00000 n 0000819160 00000 n 0000656351 00000 n 0000656377 00000 n 0000819061 00000 n 0000656425 00000 n 0000656455 00000 n 0000818962 00000 n 0000656505 00000 n 0000656537 00000 n 0000818863 00000 n 0000656584 00000 n 0000656613 00000 n 0000818764 00000 n 0000656663 00000 n 0000656695 00000 n 0000818665 00000 n 0000656739 00000 n 0000656765 00000 n 0000818566 00000 n 0000656813 00000 n 0000656843 00000 n 0000818467 00000 n 0000656896 00000 n 0000656931 00000 n 0000818368 00000 n 0000656979 00000 n 0000657009 00000 n 0000818269 00000 n 0000657062 00000 n 0000657097 00000 n 0000818170 00000 n 0000657149 00000 n 0000657183 00000 n 0000818071 00000 n 0000657234 00000 n 0000657267 00000 n 0000817972 00000 n 0000657315 00000 n 0000657345 00000 n 0000817873 00000 n 0000657400 00000 n 0000657437 00000 n 0000817774 00000 n 0000657494 00000 n 0000657533 00000 n 0000817675 00000 n 0000657586 00000 n 0000657621 00000 n 0000817576 00000 n 0000657669 00000 n 0000657699 00000 n 0000817477 00000 n 0000657753 00000 n 0000657789 00000 n 0000817378 00000 n 0000657837 00000 n 0000657867 00000 n 0000817279 00000 n 0000657914 00000 n 0000657943 00000 n 0000817180 00000 n 0000657995 00000 n 0000658029 00000 n 0000817081 00000 n 0000658077 00000 n 0000658107 00000 n 0000816982 00000 n 0000658156 00000 n 0000658187 00000 n 0000816883 00000 n 0000658232 00000 n 0000658259 00000 n 0000816784 00000 n 0000658309 00000 n 0000658341 00000 n 0000816685 00000 n 0000658386 00000 n 0000658413 00000 n 0000816586 00000 n 0000658460 00000 n 0000658489 00000 n 0000816487 00000 n 0000658533 00000 n 0000658559 00000 n 0000816388 00000 n 0000658612 00000 n 0000658647 00000 n 0000816289 00000 n 0000658698 00000 n 0000658731 00000 n 0000816190 00000 n 0000658781 00000 n 0000658813 00000 n 0000816091 00000 n 0000658857 00000 n 0000658883 00000 n 0000815992 00000 n 0000658932 00000 n 0000658963 00000 n 0000815893 00000 n 0000659011 00000 n 0000659041 00000 n 0000815809 00000 n 0000659084 00000 n 0000659109 00000 n 0000815710 00000 n 0000659170 00000 n 0000659213 00000 n 0000815570 00000 n 0000659263 00000 n 0000659329 00000 n 0000815486 00000 n 0000659374 00000 n 0000659435 00000 n 0000815387 00000 n 0000659484 00000 n 0000659555 00000 n 0000815288 00000 n 0000659603 00000 n 0000659669 00000 n 0000815148 00000 n 0000659722 00000 n 0000659796 00000 n 0000815064 00000 n 0000659853 00000 n 0000659905 00000 n 0000814980 00000 n 0000659950 00000 n 0000660021 00000 n 0000814881 00000 n 0000660075 00000 n 0000660140 00000 n 0000814797 00000 n 0000660199 00000 n 0000660255 00000 n 0000814657 00000 n 0000660306 00000 n 0000660339 00000 n 0000814532 00000 n 0000660402 00000 n 0000660462 00000 n 0000814463 00000 n 0000660519 00000 n 0000660579 00000 n 0000814379 00000 n 0000660642 00000 n 0000660716 00000 n 0000814280 00000 n 0000660762 00000 n 0000660821 00000 n 0000814181 00000 n 0000660872 00000 n 0000660931 00000 n 0000814097 00000 n 0000660984 00000 n 0000664730 00000 n 0000662224 00000 n 0000661019 00000 n 0000664620 00000 n 0000664675 00000 n 0000662496 00000 n 0000662629 00000 n 0000662762 00000 n 0000662894 00000 n 0000663027 00000 n 0000663160 00000 n 0000663291 00000 n 0000663424 00000 n 0000663557 00000 n 0000663689 00000 n 0000663822 00000 n 0000663955 00000 n 0000664088 00000 n 0000664221 00000 n 0000664354 00000 n 0000664487 00000 n 0000666903 00000 n 0000666878 00000 n 0000669041 00000 n 0000669016 00000 n 0000673080 00000 n 0000673009 00000 n 0000675283 00000 n 0000675258 00000 n 0000679125 00000 n 0000678924 00000 n 0000681537 00000 n 0000681512 00000 n 0000691525 00000 n 0000691184 00000 n 0000695449 00000 n 0000695306 00000 n 0000697536 00000 n 0000697507 00000 n 0000713640 00000 n 0000713275 00000 n 0000726812 00000 n 0000726485 00000 n 0000740404 00000 n 0000740053 00000 n 0000754411 00000 n 0000754053 00000 n 0000772594 00000 n 0000772197 00000 n 0000775406 00000 n 0000775190 00000 n 0000794972 00000 n 0000794533 00000 n 0000809673 00000 n 0000809278 00000 n 0000813336 00000 n 0000813453 00000 n 0000813573 00000 n 0000813693 00000 n 0000813816 00000 n 0000813915 00000 n 0000814016 00000 n 0000838624 00000 n 0000846267 00000 n 0000846308 00000 n 0000846348 00000 n 0000846461 00000 n trailer << /Size 2465 /Root 2463 0 R /Info 2464 0 R /ID [ ] >> startxref 846668 %%EOF geomview-1.9.4/doc/geomview-pt_BR0000644000175000001440000001472110663305733013615 00000000000000This is ../../doc/geomview-pt_BR, produced by makeinfo version 4.8 from ../../doc/geomview-pt_BR.texi. INFO-DIR-SECTION Graphics Applications START-INFO-DIR-ENTRY * Geomview: (geomview-pt_BR). Programa interativo de visualizac,a~o tridimensional. END-INFO-DIR-ENTRY  Indirect: geomview-pt_BR-1: 276 geomview-pt_BR-2: 299954  Tag Table: (Indirect) Node: Top276 Node: Intro1795 Node: Distrib3324 Node: Copying5022 Node: History38500 Node: Authors41271 Node: Platforms42030 Node: Pronunciation42692 Node: Overview43270 Node: Tutorial46448 Ref: figinitial47427 Ref: figlookatworld52236 Ref: figappearance52765 Ref: figcolorchooser54010 Ref: figfilespanel57079 Ref: figtrefdodec57830 Node: Interaction57906 Node: Starting Geomview58736 Node: Command Line Options59403 Node: Basic Interaction64653 Ref: figmainpanel65287 Node: Loading71492 Ref: figmyfilelist71898 Ref: figloadpanel75380 Node: Mouse Motions75764 Ref: figtools76610 Node: Point of Interest86272 Node: Appearance89313 Node: Appearance Panel91097 Ref: figap91354 Ref: figcolorchooserpanel92814 Node: Materials Panel97089 Ref: figmatpanel97400 Node: Lighting Panel98831 Node: Cameras101393 Ref: figcamerapanel101787 Node: Saving108105 Ref: figsavepanel108381 Node: Commands113750 Ref: figcommandpanel114315 Node: Keyboard Shortcuts115856 Node: OOGL File Formats121325 Node: Conventions122024 Node: Common syntax122812 Node: File names124025 Node: Vertices124497 Node: ND-Vertices125963 Node: Surface normal directions127226 Node: Transformation matrices127970 Node: ND Transformation matrices128885 Node: Binary format129788 Node: References131301 Node: Appearances133740 Node: Texture Mapping142779 Node: Object File Formats148453 Node: QUAD149533 Node: MESH150902 Node: BBOX153546 Node: BBP and BEZ154698 Node: OFF157963 Node: VECT161990 Node: SKEL164808 Node: SPHERE167165 Node: INST169028 Node: INST Examples174862 Node: LIST175935 Node: TLIST176773 Node: GROUP178374 Node: DISCGRP178922 Node: COMMENT179216 Node: Non-geometric objects180673 Node: appearance181375 Node: image181759 Node: transform192070 Node: ntransform194699 Node: camera198414 Node: window203193 Node: Customization204577 Node: Modules206674 Node: Interface208055 Node: Example1209980 Node: Example2217451 Node: XForms226036 Node: Example3226743 Node: Example4248145 Node: Module Installation254387 Node: Private Module Installation254992 Node: System Module Installation256264 Node: GCL257685 Node: Argument Conventions260796 Node: GCL Reference263557 Node: shell272897 Node: lt273056 Node: eq273297 Node: gt273534 Node: help273777 Node: morehelp274155 Node: emodule-run274419 Node: all274575 Node: and275041 Node: ap-override275275 Node: backcolor275585 Node: background-image275836 Node: bbox-color276468 Node: bbox-draw276725 Node: camera276999 Node: camera-draw277428 Node: camera-prop277682 Node: camera-reset278344 Node: car278547 Node: cdr278713 Node: clock278902 Node: command279189 Node: copy279474 Node: cursor-still279790 Node: cursor-twitch280133 Node: delete280475 Node: dice280647 Node: dimension280966 Node: dither281397 Node: draw281597 Node: dump-handles281820 Node: echo282092 Node: emodule-clear282544 Node: emodule-define282772 Node: emodule-defined283240 Node: emodule-isrunning283648 Node: emodule-path284090 Node: emodule-run284507 Node: emodule-sort285739 Node: emodule-start285971 Node: emodule-transmit286287 Node: escale286762 Node: event-keys286981 Node: event-mode287212 Node: event-pick287677 Node: evert287864 Node: exit288124 Node: ezoom288270 Node: freeze288467 Node: geometry288780 Node: geomview-version289229 Node: hdefine289483 Node: hdelete290193 Node: help291265 Node: hmodel291554 Node: hsphere-draw291818 Node: if292189 Node: inhibit-warning292522 Node: input-translator292920 Node: interest293594 Node: lines-closer295081 Node: load295764 Node: load-path296385 Node: look296773 Node: look-encompass297528 Node: look-encompass-size298056 Node: look-recenter298750 Node: look-toward299402 Node: merge299954 Node: merge-ap300387 Node: merge-base-ap300714 Node: merge-baseap300970 Node: morehelp301336 Node: name-object301593 Node: ND-axes301974 Node: ND-color303363 Node: ND-xform304606 Node: ND-xform-get305089 Node: ND-xform-set305577 Node: new-alien306152 Node: new-camera306903 Node: new-center307271 Node: new-geometry307744 Node: new-reset308208 Node: NeXT308426 Node: normalization308657 Node: not309891 Node: or310132 Node: pick310395 Node: pick-invisible311973 Node: pickable312308 Node: position312591 Node: position-at312808 Node: position-toward313165 Node: progn313592 Node: quit313934 Node: quote314103 Node: rawevent314304 Node: rawpick314701 Node: read315013 Node: real-id315703 Node: redraw316204 Node: regtable316478 Node: rehash-emodule-path316661 Node: replace-geometry317307 Node: rib-display317582 Node: rib-snapshot318351 Node: scale318720 Node: scene319479 Node: set-clock319689 Node: set-conformal-refine320044 Node: set-emodule-path320753 Node: set-load-path321494 Node: set-motionscale321966 Node: setenv322627 Node: sgi322971 Node: shell323198 Node: sleep-for323500 Node: sleep-until323860 Node: snapshot324490 Node: soft-shader326203 Node: space326451 Node: stereowin326666 Node: time-interests327613 Node: transform328491 Node: transform-incr330676 Node: transform-set331513 Node: ui-cam-focus331874 Node: ui-center332975 Node: ui-center-origin333231 Node: ui-emotion-program334062 Node: ui-emotion-run334379 Node: ui-freeze334675 Node: ui-html-browser334905 Node: ui-motion335467 Node: ui-panel337294 Node: ui-pdf-viewer338401 Node: ui-target338963 Node: uninterest339519 Node: update339840 Node: update-draw340161 Node: window340525 Node: winenter340947 Node: write341251 Node: write-comments342351 Node: write-handle343736 Node: write-sexpr344056 Node: xform344343 Node: xform-incr344598 Node: xform-set344934 Node: zoom345199 Node: Non-Euclidean Geometry345426 Node: Mathematica347870 Node: OOGL.m349373 Node: Geomview.m351291 Node: RenderMan354012 Node: Remote Display356651 Node: Networked Geomview357394 Node: Chunks359264 Node: Package Details360774 Node: Package Installation362228 Node: Installation366007 Node: Unix Binary Installation366673 Node: Unix Binary Detail369455 Node: Source Code Installation371842 Node: Support375419 Node: Contributing376585 Node: Function Index378166 Node: List of Figures389928  End Tag Table geomview-1.9.4/doc/version-pt_BR.texi0000644000175000001440000000014110663305731014415 00000000000000@set UPDATED 23 August 2007 @set UPDATED-MONTH August 2007 @set EDITION 1.9.4 @set VERSION 1.9.4 geomview-1.9.4/doc/mdate-sh0000755000175000001440000001255310665240474012477 00000000000000#!/bin/sh # Get modification time of a file or directory and pretty-print it. scriptversion=2005-06-29.22 # Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005 Free Software # Foundation, Inc. # written by Ulrich Drepper , June 1995 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No file. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: mdate-sh [--help] [--version] FILE Pretty-print the modification time of FILE. Report bugs to . EOF exit $? ;; -v | --v*) echo "mdate-sh $scriptversion" exit $? ;; esac # Prevent date giving response in another language. LANG=C export LANG LC_ALL=C export LC_ALL LC_TIME=C export LC_TIME # GNU ls changes its time format in response to the TIME_STYLE # variable. Since we cannot assume `unset' works, revert this # variable to its documented default. if test "${TIME_STYLE+set}" = set; then TIME_STYLE=posix-long-iso export TIME_STYLE fi save_arg1=$1 # Find out how to get the extended ls output of a file or directory. if ls -L /dev/null 1>/dev/null 2>&1; then ls_command='ls -L -l -d' else ls_command='ls -l -d' fi # A `ls -l' line looks as follows on OS/2. # drwxrwx--- 0 Aug 11 2001 foo # This differs from Unix, which adds ownership information. # drwxrwx--- 2 root root 4096 Aug 11 2001 foo # # To find the date, we split the line on spaces and iterate on words # until we find a month. This cannot work with files whose owner is a # user named `Jan', or `Feb', etc. However, it's unlikely that `/' # will be owned by a user whose name is a month. So we first look at # the extended ls output of the root directory to decide how many # words should be skipped to get the date. # On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. set x`ls -l -d /` # Find which argument is the month. month= command= until test $month do shift # Add another shift to the command. command="$command shift;" case $1 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac done # Get the extended ls output of the file or directory. set dummy x`eval "$ls_command \"\$save_arg1\""` # Remove all preceding arguments eval $command # Because of the dummy argument above, month is in $2. # # On a POSIX system, we should have # # $# = 5 # $1 = file size # $2 = month # $3 = day # $4 = year or time # $5 = filename # # On Darwin 7.7.0 and 7.6.0, we have # # $# = 4 # $1 = day # $2 = month # $3 = year or time # $4 = filename # Get the month. case $2 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac case $3 in ???*) day=$1;; *) day=$3; shift;; esac # Here we have to deal with the problem that the ls output gives either # the time of day or the year. case $3 in *:*) set `date`; eval year=\$$# case $2 in Jan) nummonthtod=1;; Feb) nummonthtod=2;; Mar) nummonthtod=3;; Apr) nummonthtod=4;; May) nummonthtod=5;; Jun) nummonthtod=6;; Jul) nummonthtod=7;; Aug) nummonthtod=8;; Sep) nummonthtod=9;; Oct) nummonthtod=10;; Nov) nummonthtod=11;; Dec) nummonthtod=12;; esac # For the first six month of the year the time notation can also # be used for files modified in the last year. if (expr $nummonth \> $nummonthtod) > /dev/null; then year=`expr $year - 1` fi;; *) year=$3;; esac # The result. echo $day $month $year # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: geomview-1.9.4/doc/stamp-vti0000644000175000001440000000014110665240662012703 00000000000000@set UPDATED 23 August 2007 @set UPDATED-MONTH August 2007 @set EDITION 1.9.4 @set VERSION 1.9.4 geomview-1.9.4/doc/texinfo.tex0000644000175000001440000072311510665240474013250 00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2006-10-04.17} % % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free % Software Foundation, Inc. % % This texinfo.tex file is free software; you can redistribute it and/or % modify it under the terms of the GNU General Public License as % published by the Free Software Foundation; either version 2, or (at % your option) any later version. % % This texinfo.tex file is distributed in the hope that it will be % useful, but WITHOUT ANY WARRANTY; without even the implied warranty % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this texinfo.tex file; see the file COPYING. If not, write % to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, % Boston, MA 02110-1301, USA. % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. (This has been our intent since Texinfo was invented.) % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://www.gnu.org/software/texinfo/ (the Texinfo home page), or % ftp://tug.org/tex/texinfo.tex % (and all CTAN mirrors, see http://www.ctan.org). % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \message{Basics,} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt} % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\undefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % For @cropmarks command. % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1 \unvbox#1 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarily, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as enviroments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At runtime, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Evironment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty out of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} %% Simple single-character @ commands % @@ prints an @ % Kludge this until the fonts are right (grr). \def\@{{\tt\char64}} % This is turned off because it was never documented % and you can use @w{...} around a quote to suppress ligatures. %% Define @` and @' to be the same as ` and ' %% but suppressing ligatures. %\def\`{{`}} %\def\'{{'}} % Used to generate quoted braces. \def\mylbrace {{\tt\char123}} \def\myrbrace {{\tt\char125}} \let\{=\mylbrace \let\}=\myrbrace \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \c \let\dotaccent = \. \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \t \let\ubaraccent = \b \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ptexi \else\ifx\temp\jmacro \j \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% \kern-.15em \TeX } % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on/off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in % Old definition--didn't work. %\parseargdef\need{\par % %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{\baselineskip=0pt% %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak %\prevdepth=-1000pt %}} \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @include file insert text of that file as input. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable \def\temp{\input #1 }% \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\next\centerH \else \let\next\centerV \fi \next{\hfil \ignorespaces#1\unskip \hfil}% } \def\centerH#1{% {% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }% } \def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} % @sp n outputs n lines of vertical space \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a \ character. % FYI, plain.tex uses \\ as a temporary control sequence (why?), but % this is not advertised and we don't care. Texinfo does not % otherwise define @\. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus } } % @bullet and @minus need the same treatment as @math, just above. \def\bullet{$\ptexbullet$} \def\minus{$-$} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @comma{} is so commas can be inserted into text without messing up % Texinfo's parsing. % \let\comma = , % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as \undefined, % borrowed from ifpdf.sty. \ifx\pdfoutput\undefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html % (and related messages, the final outcome is that it is up to the TeX % user to double the backslashes and otherwise make the string valid, so % that's what we do). % double active backslashes. % {\catcode`\@=0 \catcode`\\=\active @gdef@activebackslashdouble{% @catcode`@\=@active @let\=@doublebackslash} } % To handle parens, we must adopt a different approach, since parens are % not active characters. hyperref.dtx (which has the same problem as % us) handles it with this amazing macro to replace tokens. I've % tinkered with it a little for texinfo, but it's definitely from there. % % #1 is the tokens to replace. % #2 is the replacement. % #3 is the control sequence with the string. % \def\HyPsdSubst#1#2#3{% \def\HyPsdReplace##1#1##2\END{% ##1% \ifx\\##2\\% \else #2% \HyReturnAfterFi{% \HyPsdReplace##2\END }% \fi }% \xdef#3{\expandafter\HyPsdReplace#3#1\END}% } \long\def\HyReturnAfterFi#1\fi{\fi#1} % #1 is a control sequence in which to do the replacements. \def\backslashparens#1{% \xdef#1{#1}% redefine it as its expansion; the definition is simply % \lastnode when called from \setref -> \pdfmkdest. \HyPsdSubst{(}{\realbackslash(}{#1}% \HyPsdSubst{)}{\realbackslash)}{#1}% } \ifpdf \input pdfcolor \pdfcatalog{/PageMode /UseOutlines}% % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % without \immediate, pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \imagewidth \fi \ifdim \wd2 >0pt height \imageheight \fi \ifnum\pdftexversion<13 #1.pdf% \else {#1.pdf}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \atdummies \activebackslashdouble \def\pdfdestname{#1}% \backslashparens\pdfdestname \pdfdest name{\pdfdestname} xyz% }}% % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1}% % \let\linkcolor = \Blue % was Cyan, but that seems light? \def\endlink{\Black\pdfendlink} % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \def\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else % Doubled backslashes in the name. {\activebackslashdouble \xdef\pdfoutlinedest{#3}% \backslashparens\pdfoutlinedest}% \fi % % Also double the backslashes in the display string. {\activebackslashdouble \xdef\pdfoutlinetext{#1}% \backslashparens\pdfoutlinetext}% % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Thanh's hack / proper braces in bookmarks \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace % % Read toc silently, to get counts of subentries for \pdfoutline. \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % xx to do this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Right % now, I guess we'll just let the pdf reader have its way. \indexnofonts \setupdatafile \catcode`\\=\active \otherbackslash \input \jobname.toc \endgroup } % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \ifx\p\space\else\addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \fi \nextsp} \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable \leavevmode\Red \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \linkcolor #1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\linkcolor = \relax \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Default leading. \newdimen\textleading \textleading = 13.2pt % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % \def\setleading#1{% \normalbaselineskip = #1\relax \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % Set the font macro #1 to the font named #2, adding on the % specified font prefix (normally `cm'). % #3 is the font's design size, #4 is a scale factor \def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\undefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} %where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. This is the default in % Texinfo. % \def\definetextfontsizexi{ % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep} \setfont\texttt\ttshape{10}{\mainmagstep} \setfont\textbf\bfshape{10}{\mainmagstep} \setfont\textit\itshape{10}{\mainmagstep} \setfont\textsl\slshape{10}{\mainmagstep} \setfont\textsf\sfshape{10}{\mainmagstep} \setfont\textsc\scshape{10}{\mainmagstep} \setfont\textttsl\ttslshape{10}{\mainmagstep} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1} \setfont\deftt\ttshape{10}{\magstep1} \setfont\defttsl\ttslshape{10}{\magstep1} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000} \setfont\smalltt\ttshape{9}{1000} \setfont\smallbf\bfshape{10}{900} \setfont\smallit\itshape{9}{1000} \setfont\smallsl\slshape{9}{1000} \setfont\smallsf\sfshape{9}{1000} \setfont\smallsc\scshape{10}{900} \setfont\smallttsl\ttslshape{10}{900} \font\smalli=cmmi9 \font\smallsy=cmsy9 % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000} \setfont\smallertt\ttshape{8}{1000} \setfont\smallerbf\bfshape{10}{800} \setfont\smallerit\itshape{8}{1000} \setfont\smallersl\slshape{8}{1000} \setfont\smallersf\sfshape{8}{1000} \setfont\smallersc\scshape{10}{800} \setfont\smallerttsl\ttslshape{10}{800} \font\smalleri=cmmi8 \font\smallersy=cmsy8 % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3} \setfont\titleit\itbshape{10}{\magstep4} \setfont\titlesl\slbshape{10}{\magstep4} \setfont\titlett\ttbshape{12}{\magstep3} \setfont\titlettsl\ttslshape{10}{\magstep4} \setfont\titlesf\sfbshape{17}{\magstep1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\authorrm{\secrm} \def\authortt{\sectt} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2} \setfont\chapit\itbshape{10}{\magstep3} \setfont\chapsl\slbshape{10}{\magstep3} \setfont\chaptt\ttbshape{12}{\magstep2} \setfont\chapttsl\ttslshape{10}{\magstep3} \setfont\chapsf\sfbshape{17}{1000} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1} \setfont\secit\itbshape{10}{\magstep2} \setfont\secsl\slbshape{10}{\magstep2} \setfont\sectt\ttbshape{12}{\magstep1} \setfont\secttsl\ttslshape{10}{\magstep2} \setfont\secsf\sfbshape{12}{\magstep1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf} \setfont\ssecit\itbshape{10}{1315} \setfont\ssecsl\slbshape{10}{1315} \setfont\ssectt\ttbshape{12}{\magstephalf} \setfont\ssecttsl\ttslshape{10}{1315} \setfont\ssecsf\sfbshape{12}{\magstephalf} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000} \setfont\reducedtt\ttshape{10}{1000} \setfont\reducedbf\bfshape{10}{1000} \setfont\reducedit\itshape{10}{1000} \setfont\reducedsl\slshape{10}{1000} \setfont\reducedsf\sfshape{10}{1000} \setfont\reducedsc\scshape{10}{1000} \setfont\reducedttsl\ttslshape{10}{1000} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 % reset the current fonts \textfonts \rm } % end of 11pt text font size definitions % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep} \setfont\texttt\ttshape{10}{\mainmagstep} \setfont\textbf\bfshape{10}{\mainmagstep} \setfont\textit\itshape{10}{\mainmagstep} \setfont\textsl\slshape{10}{\mainmagstep} \setfont\textsf\sfshape{10}{\mainmagstep} \setfont\textsc\scshape{10}{\mainmagstep} \setfont\textttsl\ttslshape{10}{\mainmagstep} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf} \setfont\deftt\ttshape{10}{\magstephalf} \setfont\defttsl\ttslshape{10}{\magstephalf} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000} \setfont\smalltt\ttshape{9}{1000} \setfont\smallbf\bfshape{10}{900} \setfont\smallit\itshape{9}{1000} \setfont\smallsl\slshape{9}{1000} \setfont\smallsf\sfshape{9}{1000} \setfont\smallsc\scshape{10}{900} \setfont\smallttsl\ttslshape{10}{900} \font\smalli=cmmi9 \font\smallsy=cmsy9 % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000} \setfont\smallertt\ttshape{8}{1000} \setfont\smallerbf\bfshape{10}{800} \setfont\smallerit\itshape{8}{1000} \setfont\smallersl\slshape{8}{1000} \setfont\smallersf\sfshape{8}{1000} \setfont\smallersc\scshape{10}{800} \setfont\smallerttsl\ttslshape{10}{800} \font\smalleri=cmmi8 \font\smallersy=cmsy8 % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3} \setfont\titleit\itbshape{10}{\magstep4} \setfont\titlesl\slbshape{10}{\magstep4} \setfont\titlett\ttbshape{12}{\magstep3} \setfont\titlettsl\ttslshape{10}{\magstep4} \setfont\titlesf\sfbshape{17}{\magstep1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\authorrm{\secrm} \def\authortt{\sectt} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1} \setfont\chapit\itbshape{10}{\magstep2} \setfont\chapsl\slbshape{10}{\magstep2} \setfont\chaptt\ttbshape{12}{\magstep1} \setfont\chapttsl\ttslshape{10}{\magstep2} \setfont\chapsf\sfbshape{12}{\magstep1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000} \setfont\secit\itbshape{10}{\magstep1} \setfont\secsl\slbshape{10}{\magstep1} \setfont\sectt\ttbshape{12}{1000} \setfont\secttsl\ttslshape{10}{\magstep1} \setfont\secsf\sfbshape{12}{1000} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000} \setfont\ssecit\itbshape{10}{1000} \setfont\ssecsl\slbshape{10}{1000} \setfont\ssectt\ttbshape{10}{1000} \setfont\ssecttsl\ttslshape{10}{1000} \setfont\ssecsf\sfbshape{10}{1000} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000} \font\sseci=cmmi10 \font\ssecsy=cmsy10 % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000} \setfont\reducedtt\ttshape{9}{1000} \setfont\reducedbf\bfshape{10}{900} \setfont\reducedit\itshape{9}{1000} \setfont\reducedsl\slshape{9}{1000} \setfont\reducedsf\sfshape{9}{1000} \setfont\reducedsc\scshape{10}{900} \setfont\reducedttsl\ttslshape{10}{900} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 % reduce space between paragraphs \divide\parskip by 2 % reset the current fonts \textfonts \rm } % end of 10pt text font size definitions % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xword{10} \def\xiword{11} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% \wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{25pt}} \def\titlefont#1{{\titlefonts\rm #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % % I wish the USA used A4 paper. % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi % Define these so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000} \setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000} \setfont\shortconttt\ttshape{12}{1000} %% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic % \smartitalic{ARG} outputs arg in italics, followed by an italic correction % unless the following character is such as not to need one. \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else \ptexslash\fi\fi\fi} \def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} \def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} % like \smartslanted except unconditionally uses \ttsl. % @var is set to this for defun arguments. \def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} % like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitalicx} \let\i=\smartitalic \let\slanted=\smartslanted \let\var=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % @b, explicit bold. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } \def\samp#1{`\tclose{#1}'\null} \setfont\keyrm\rmshape{8}{1000} \font\keysy=cmsy9 \def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% \vbox{\hrule\kern-0.4pt \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% \kern-0.4pt\hrule}% \kern-.06em\raise0.4pt\hbox{\angleright}}}} % The old definition, with no lozenge: %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @file, @option are the same as @samp. \let\file=\samp \let\option=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null } % We *must* turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active % \global\def\code{\begingroup \catcode\rquoteChar=\active \catcode\lquoteChar=\active \let'\codequoteright \let`\codequoteleft % \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\realdash \let_\realunder \fi \codex } } \def\realdash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } \def\codex #1{\tclose{#1}\endgroup} % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is undesirable in % some manuals, especially if they don't have long identifiers in % general. @allowcodebreaks provides a way to control this. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg'}% \fi\fi } % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle option `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct.' \kbdinputstyle distinct \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\look}}\fi \else{\tclose{\kbdfont\look}}\fi} % For @indicateurl, @env, @command quotes seem unnecessary, so use \code. \let\indicateurl=\code \let\env=\code \let\command=\code % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. Perhaps eventually put in % a hypertex \special here. % \def\uref#1{\douref #1,,,\finish} \def\douref#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\undefined \def\Orb{\mathhexbox20D} \fi \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } %%% Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines \let\tt=\authortt} \parseargdef\title{% \checkenv\titlepage \leftline{\titlefonts\rm #1} % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\authorfont \leftline{#1}}% \fi } %%% Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\HEADINGSoff{% \global\evenheadline={\hfil} \global\evenfootline={\hfil} \global\oddheadline={\hfil} \global\oddfootline={\hfil}} \HEADINGSoff % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\undefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi \def\itemcontents{#1}% % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. Note that \everycr resets \everytab. \def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we encounter the problem it was intended to solve again. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi %% Test to see if parskip is larger than space between lines of %% table. If not, do nothing. %% If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\realdash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \undefined % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname\donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these in case \tex is in effect and \{ is a \delimiter again. % But can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. \let\{ = \mylbrace \let\} = \myrbrace % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control% words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\L \definedummyword\OE \definedummyword\O \definedummyword\aa \definedummyword\ae \definedummyword\l \definedummyword\oe \definedummyword\o \definedummyword\ss \definedummyword\exclamdown \definedummyword\questiondown \definedummyword\ordf \definedummyword\ordm % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\minus \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sc \definedummyword\t % % Commands that take arguments. \definedummyword\acronym \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % Hopefully, all control words can become @asis. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% % how to handle braces? \def\_{\normalunderscore}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\aa{aa}% \def\ae{ae}% \def\l{l}% \def\oe{oe}% \def\o{o}% \def\ss{ss}% \def\exclamdown{!}% \def\questiondown{?}% \def\ordf{a}% \def\ordm{o}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\registeredsymbol{R}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\minus{-}% \def\pounds{pounds}% \def\point{.}% \def\print{-|}% \def\result{=>}% \def\textdegree{degrees}% % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist } \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \ifvmode \dosubindsanitize \else \dosubindwrite \fi }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write will make \lastskip zero. The result is that sequences % like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % % ..., ready, GO: % \def\dosubindsanitize{% % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \skip0 = \lastskip \edef\lastskipmacro{\the\lastskip}% \count255 = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\skip0 glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\skip0 \fi % \dosubindwrite % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\count255>9999 \penalty\count255 \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\skip0 \fi } % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this frozes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \def\tempa{{\rm }}% \def\tempb{#1}% \edef\tempc{\tempa}% \edef\tempd{\tempb}% \ifx\tempc\tempd \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % \unnumberedno is an oxymoron, of course. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines this as the name of the chapter. % page headings and footings can use it. @section does likewise. % However, they are not reliable, because we don't use marks. \def\thischapter{} \def\thissection{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achive this, remember the "biggest" unnum. sec. we are currently in: \chardef\unmlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unmlevel \chardef\unmlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unmlevel \def\headtype{U}% \else \chardef\unmlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % \message{\putwordChapter\space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % \def\appendixnum{\putwordAppendix\space \appendixletter}% \message{\appendixnum}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } \outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } \outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. \outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } \outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading % NOTE on use of \vbox for chapter headings, section headings, and such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}% \bigskip \par\penalty 200\relax \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. %%% Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} %%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} \def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% \pchapsepmacro {% \chapfonts \rm % % Have to define \thissection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\thissection{#1}% \gdef\thischaptername{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \gdef\thischapternum{}% \gdef\thischapter{#1}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \gdef\thischapternum{}% \gdef\thischapter{}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \xdef\thischapternum{\appendixletter}% % We don't substitute the actual chapter name into \thischapter % because we don't want its macros evaluated now. And we don't % use \thissection because that changes with each section. % \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \xdef\thischapternum{\the\chapno}% \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt \hfill {\rm #1}\hfill}}\bigskip \par\nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\sectionheading#1#2#3#4{% {% % Switch to the right set of fonts. \csname #2fonts\endcsname \rm % % Insert space above the heading. \csname #2headingbreak\endcsname % % Only insert the space after the number if we have a section number. \def\sectionlevel{#2}% \def\temptype{#3}% % \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\thissection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \thissection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\thissection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\thissection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) \vskip-\parskip % % This is purely so the last item on the list is a known \penalty > % 10000. This is so \startdefun can avoid allowing breakpoints after % section headings. Otherwise, it would insert a valid breakpoint between: % % @section sec-whatever % @deffn def-whatever \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \jobname.toc } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \def\thischapter{}% \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % Normal (long) toc. \def\contents{% \startcontents{\putwordTOC}% \openin 1 \jobname.toc \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \jobname.toc \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, it should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @tex ... @end tex escapes into raw Tex temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain tex @ character. \envdef\tex{% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \escapechar=`\\ % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of \def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt \parindent = 0pt \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it by one command: \def\makedispenv #1#2{ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two synonyms: \def\maketwodispenvs #1#2#3{ \makedispenv{#1}{#3} \makedispenv{#2}{#3} } % @lisp: indented, narrowed, typewriter font; @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvs {lisp}{example}{% \nonfillstart \tt\quoteexpand \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenv {display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenv{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill \gobble } \let\Eflushright = \afterenvbreak % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \envdef\quotation{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \advance\rightskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\undefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % [Knuth] pp. 380,381,391 % Disable Spanish ligatures ?` and !` of \tt font \begingroup \catcode`\`=\active\gdef`{\relax\lq} \endgroup % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \catcode`\`=\active \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % \def\starttabbox{\setbox0=\hbox\bgroup} % Allow an option to not replace quotes with a regular directed right % quote/apostrophe (char 0x27), but instead use the undirected quote % from cmtt (char 0x0d). The undirected quote is ugly, so don't make it % the default, but it works for pasting with more pdf viewers (at least % evince), the lilypond developers report. xpdf does work with the % regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax `% \else \char'22 \fi } % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen0=\wd0 % the width so far, or since the previous tab \divide\dimen0 by\tabw \multiply\dimen0 by\tabw % compute previous multiple of \tabw \advance\dimen0 by\tabw % advance to next multiple of \tabw \wd0=\dimen0 \box0 \starttabbox }% } \catcode`\'=\active \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}% % \catcode`\`=\active \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}% % \gdef\quoteexpand{\rquoteexpand \lquoteexpand}% \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart % Easiest (and conventionally used) font for verbatim \tt \def\par{\leavevmode\egroup\box0\endgraf}% \catcode`\`=\active \tabexpand \quoteexpand % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \defargscommonending, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % \ifnum\lastpenalty=10002 \penalty2000 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil \endgraf \nobreak\vskip -\parskip \penalty 10002 % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remainnig is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } %%% Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } %%% Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } %%% Type: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % How we'll format the type name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % (plain.tex says that \dimen1 should be used only as global.) \parshape 2 0in \dimen0 \defargsindent \dimen2 % % Put the type name to the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% return value type \ifx\temp\empty\else \tclose{\temp} \fi #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. Let's try @var for that. \let\var=\ttslanted #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } \def\badparencount{% \errmessage{Unbalanced parentheses in @def}% \global\parencount=0 } \def\badbrackcount{% \errmessage{Unbalanced square braces in @def}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\undefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{% \begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % ... and \example \spaceisspace % % Append \endinput to make sure that TeX does not see the ending newline. % I've verified that it is necessary both for e-TeX and for ordinary TeX % --kasal, 29nov03 \scantokens{#1\endinput}% \endgroup } \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \. % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. \def\scanctxt{% \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other } \def\scanargctxt{% \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% \scanctxt \catcode`\\=\other } % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0% \else \expandafter\parsemargdef \argl;% \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\definedummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname #1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.blah for each blah % in the params list, to be ##N where N is the position in that list. % That gets used by \mbodybackslash (above). % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. \def\parsemargdef#1;{\paramno=0\def\paramlist{}% \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1% \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% % This defines the macro itself. There are six cases: recursive and % nonrecursive macros of zero, one, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \fi \fi} \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg) \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Just make them active and then expand them all to nothing. \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \thissection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\thissection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \writexrdef{pg}{\folio}% will be written later, during \shipout }% \fi } % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces \def\printedmanual{\ignorespaces #5}% \def\printedrefname{\ignorespaces #3}% \setbox1=\hbox{\printedmanual\unskip}% \setbox0=\hbox{\printedrefname\unskip}% \ifdim \wd0 = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax % Use the node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Use the actual chapter/section title appear inside % the square brackets. Use the real section title if we have it. \ifdim \wd1 > 0pt % It is in another manual, so we don't have it. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf \leavevmode \getfilename{#4}% {\turnoffactive % See comments at \activebackslashdouble. {\activebackslashdouble \xdef\pdfxrefdest{#1}% \backslashparens\pdfxrefdest}% % \ifnum\filenamelength>0 \startlink attr{/Border [0 0 0]}% goto file{\the\filename.pdf} name{\pdfxrefdest}% \else \startlink attr{/Border [0 0 0]}% goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \linkcolor \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd0 = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % if the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd1 > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not % insert empty discretionaries after hyphens, which means that it will % not find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, this % is a loss. Therefore, we give the text of the node name again, so it % is as if TeX is seeing it for the first time. \ifdim \wd1 > 0pt \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% \else % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via a macro so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi \fi \endlink \endgroup} % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs \message{\linenumber Undefined cross reference `#1'.}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value. % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR#1\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarily, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\undefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing this stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \nobreak\bigskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \line\bgroup \fi % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \egroup \bigbreak \fi % space after the image \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \thissection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\thissection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \thissection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % and i18n. % @documentlanguage is usually given very early, just after % @setfilename. If done too late, it may not override everything % properly. Single argument is the language abbreviation. % It would be nice if we could set up a hyphenation file here. % \parseargdef\documentlanguage{% \tex % read txi-??.tex file in plain TeX. % Read the file if it exists. \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \input txi-#1.tex \fi \closein 1 \endgroup } \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? In the current directory should work if nowhere else does.} % @documentencoding should change something in TeX eventually, most % likely, but for now just recognize it. \let\documentencoding = \comment % Page size parameters. % \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be so finicky about underfull hboxes, either. \hbadness = 2000 % Following George Bush, just get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{46\baselineskip}{6in}% {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {\voffset}{.25in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{51\baselineskip}{160mm} {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1 \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \catcode`\~=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\+=\other \catcode`\$=\other \def\normaldoublequote{"} \def\normaltilde{~} \def\normalcaret{^} \def\normalunderscore{_} \def\normalverticalbar{|} \def\normalless{<} \def\normalgreater{>} \def\normalplus{+} \def\normaldollar{$}%$ font-lock fix % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active @def@normalbackslash{{@tt@backslashcurfont}} % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % @def@normalturnoffactive{% @let\=@normalbackslash @let"=@normaldoublequote @let~=@normaltilde @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let<=@normalless @let>=@normalgreater @let+=@normalplus @let$=@normaldollar %$ font-lock fix @unsepspaces } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These look ok in all fonts, so just make them not special. @catcode`@& = @other @catcode`@# = @other @catcode`@% = @other @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore geomview-1.9.4/doc/OOGL.m.txt0000644000175000001440000004164007730233160012573 00000000000000 NOTE: This file is autogenerated from the Geomview manual. For references to things not in this file, see the manual. The manual is distributed in the "doc" subdirectory. Mathematica Graphics in Geomview or RenderMan ********************************************* Geomview comes with some Mathematica packages that let you use use Geomview to display Mathematica graphics. Mathematica is a commercial mathematical software system available from Wolfram Research, Inc. There are two ways to do this. 1. Use Mathematica to write a graphics object to a file in OOGL format or in RIB format. 2. Use Geomview as the default display for all 3D graphics output in Mathematica. You can also use these packages to save Mathematica graphics in RenderMan (RIB) format. Since the format of Mathematica graphics objects is different from the OOGL formats, both of these methods involve translating Mathematica graphics to OOGL format. Geomview is distributed with a Mathematica package which does this translation. Before doing either of the above you must install this package. Using Mathematica to generate OOGL files ======================================== The package `OOGL.m' allows Mathematica to write graphics objects in OOGL format. To use it, give the command `<< OOGL.m' to Mathematica to load the package. The `WriteOOGL[FILE,GRAPHICS]' command writes an OOGL description of the 3D graphics object GRAPHICS to the file named FILE. This package also provides the `Geomview' command which sends a 3D graphics object to Geomview. The first time you use this command it starts up a copy of Geomview. Later calls send the graphics to the same Geomview. There are two ways to use the `Geomview' command. `Geomview[GRAPHICS]' Sends the 3D graphics object GRAPHICS to Geomview as a geom named `Mathematica'. Subsequent usage of `Geomview[GRAPHICS]' replaces the `Mathematica' object in Geomview with the new GRAPHICS. ``Geomview[NAME,GRAPHICS]'' Sends the 3D graphics object GRAPHICS to Geomview as a geom named NAME. You can use multiple calls of this form with different names to cause Geomview to display several Mathematica objects at once and allow independent control over them. % math Mathematica 2.0 for SGI Iris Copyright 1988-91 Wolfram Research, Inc. -- GL graphics initialized -- In[1] := <"riemann"] This displays the graphics `%3' on the remote host named `riemann'. `Geomview' recognizes the string `"local"' as a value for `$DisplayHost'; it forces the graphics to be displayed on the local machine. In addition to knowing the name of the machine you want to run Geomview on, the `Geomview' needs to know the type of that machine (SGI or NeXT). By default, `Geomview' assumes that it is the same kind of computer as the one you are running Mathematica on. The `MachType' option lets you explicitly specify the type of the `DisplayHost' computer; it should be one of the strings `"sgi"' or `"next"'. You can use `SetOptions' to change the default `DisplayHost' and `MachType'. For example, In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"] arranges for `Geomview' to run Geomview on an SGI workstation named `riemann'. Transporting Mathematica Files to Geomview by Hand -------------------------------------------------- The auxilliary function `WriteChunk' is for those who can only use Mathematica on a non-Unix machine (Mac, PC) or a Unix machine that is not on a network with an SGI or NeXT. `WriteChunk[FILE, GRAPHICS]' generates a file named FILE which contains the graphics object GRAPHICS in the format accepted by `math2oogl'. You can transfer that file to a computer that has Geomview installed on it and then use the programs `math2oogl', `oogl2rib', and `geomview' directly from the shell. These programs are distributed in the `bin/sgi' (on SGIs) or `bin/next' (on NeXTs) subdirectory of the Geomview directory, and may have been installed so that they are on your `path'. In[1]:= < mma.oogl to convert it to the OOGL file `mma.oogl' which you can then view using Geomview. This is the equivalent of the `WriteOOGL' command. For a result equivalent to the `Geomview' or `Show' commands, type math2oogl -togeomview Mathematica geomview < mychunk The `WriteRIB' command can be emulated from the shell as math2oogl < mychunk | oogl2rib -n mma.tiff Details of the Mathematica->Geomview Package ============================================ The `OOGL.m' package uses the external program `math2oogl' to convert `Graphics3D' objects to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica. The converter will sometimes handle colored SurfaceGraphics objects correctly that Mathematica does not handle correctly, which means that Geomview[object] sometimes works where Show[object] will give errors. The converter supports the `Polygon', `Line', and `Point' graphics primitives, `RGBColor Graphics3D' directives, and `SurfaceGraphics' objects with or without `RGBColor' directives, and lists of any combination of these. It silently ignores all other directives. The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib). The math2oogl program has only been tested on SGIs and NeXTs, but could theoretically compile on any machine. The oogl2rib program depends on the OOGL (Object Oriented Graphics Language) libraries, which now only exist on SGI and NeXT machines. In the `WriteOOGL' and `WriteRIB' commands, filename can either be a string containing a filename, an `OutputStream' object, or a string starting with a `!' to send the output to a command. Object can be a `Graphics3D' object, a `SurfaceGraphics' object, or a list of these. The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host. Installing the Mathematica Packages =================================== If Geomview is properly installed on your system according to the instructions in *Note Installation::, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed. In this section, the phrase *Geomview installation* refers any of the procedures in *Note Installation::. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution. 1. The relevant mathematica files are `OOGL.m', `Geomview.m', and `BezierPlot.m'; Mathematica must be able to find these files. They are distributed in the `$GEOMROOT/mathematica' subdirectory of the binary distributions, and in the `$GEOMROOT/src/bin/geomutil/math2oogl' subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the `$Path' variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path. The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (`MMAPACKAGEDIR'). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the `$Path' variable each time you run Mathematica. 2. The package `OOGL.m' needs to be able to invoke the programs `geomview', `math2oogl', and `oogl2rib'. The Geomview installation procedure installs these programs into a directory that you specify for executables (`BINDIR'). Ideally, this directory should be on your shell's `$path'. More specifically, it should be on the `$path' of the shell in which Mathematica runs; the directory `/usr/local/bin' is usually a good choice. You can see the list of directories on this path by giving the command `!echo $path' in Mathematica. If for some reason you can't arrange for `geomview', `math2oogl', and `oogl2rib' to be in a directory on the shell's `$path', you can modify `OOGL.m' to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables `$GeomviewPath' and `$GeomRoot', which are defined near the top of the file. Change `$GeomviewPath' to the absolute pathname of the `geomview' shell script on your system. Change `$GeomRoot' to the absolute pathname of the `$GEOMROOT' directory on your system. If you do this, you should also make sure there are copies of `geomview', `math2oogl', and `oogl2rib' in the `$GEOMROOT/bin/sgi' (on an SGI) or `$GEOMROOT/bin/next' (on a NeXT) directory. 3. The `geomview' shell script, which `OOGL.m' uses to invoke Geomview, needs to be able to find the geomview executable file (which is called `gvx' on the SGI and `Geomview.app/Geomview' on the NeXT). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the `geomview' script are correct. geomview-1.9.4/doc/geomview-pt_BR.pdf0000644000175000001440000336627010663302002014363 00000000000000%PDF-1.4 %ÐÔÅØ 3 0 obj << /Length 670 /Filter /FlateDecode >> stream xÚµTMO1½çWìÑ+±^ô¨P!¨*ué¥Ò¶°"ÉFÎ.…øí±$Ôj)'ã÷Þ¼› >¼ð¬°RR¯¬-æËË?ßÍxŽ”°¾úW…ÿUüo§+À¯¬ˆGͬ>±¢ŒítÑü,¸×”;k ­5‚æú+¹hW¥ädje%­"×®†œvp²,¥ ÷}ÉI‡Û_å÷æ¬>ѼàŒzæ9cÜ•ÑÔj©"î—ÒIÒ…ÍS©#-¢JE8$O%îdâ‚õ4bËR8àê"Ia©V•0T2.#èº p¾MX§~¼¬Ïûž›`÷P_®ú‡xZ€¦ÌöxÒt8Ý`ÚÙÆD-³ñ@Å 5Ì€‹ÒS¥E6ùîRê§[´a±è× 5tcZÁ=NhRàŒP œ{¨Á°$½A?B{ yÓ8„‰HmhÓ&›ñ «ˆJA.l~”Ê ÒeÊ­iG¡Ýô‹H 3•¼‚ñàšÙHx6„›.§bÁ±”0lQRG1<¼ ÛöN©0/ööÞ-JG”ü®®w>º†E¤ sh$léòÕy`Äóá\ScŒƒ©Eä§×† ú'¬Èß ƒóe;B«S¯´ \©¢Òž%xL:Ö(ñEô7InL׊°Q)œ‹¹óDiØsÊJR& >Kfýš<®¨VZg}Ü{íö.9ÚÜîÝ…{íèÆð˜ºq­†¡õdŒaÈE N…Q}aû?ªJ¾­*WÁ1©’Ï `œbóÔŸw÷¥Sä G¼]î†-ßÓ ù|ýNuçYÃŒƒ}Fv× +]à…ê×›<Ô;åþ‹1oi7zRÅ—#Ê?^´»ëPí_˜iÿN|ˆ%ãû±êö¾™ýØkk endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 16 0 R >> endobj 1 0 obj << /Font << /F72 6 0 R /F51 9 0 R /F52 12 0 R /F60 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 19 0 obj << /Length 194 /Filter /FlateDecode >> stream xÚ…½Â0 „÷>EÆdh°‡’ &†lÀµEÐVjKž„ÿ­ò`Ÿ}úNF¡`¹RÒPž³¢Nà½>'øžÒàHÿ-K›ÌÖ‚4`Ù#Ó8—š4ýP¶Üq»IVö‹ÒY6-SiÎÄæ ’¨H?ö@Þž:W;‘*EÜ݈lÁ‡ªsƒãØÆ“âeõê£ï¯îâon ñâ.4wí‹1D¨/#ª)òªé}Û¸KÐòóÜ5ÉJÖ endstream endobj 18 0 obj << /Type /Page /Contents 19 0 R /Resources 17 0 R /MediaBox [0 0 612 792] /Parent 16 0 R >> endobj 17 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 22 0 obj << /Length 1873 /Filter /FlateDecode >> stream xÚXYsÛ6~÷¯Ð[©“&@€ Û§6ãºé$mfb?å˜Â­0•H™‡íø¡¿½{€$()ÇxÆÅâÃî·%1ü‰E/L’D¹2f±ÚÅnúß3áF!H„¾Èo×g¿k±q”ǹX\ßÍ”\¯ß/«¥Ì‚®YŠ ^†0\÷0\-Ct%NVË0I’ «ñ©‚+˜+pµÞáÆ‡²x„mF§I —®ÿ<»¼ñh)¿‡EŽ!¹&’B+9ÍT$¥È   `1À^Mx¦åš‡W`M$`°?"ÒCË€ídÅ„N¡]ÒÌvÁEMð>–ÉR‰“I¬ƒ~ÇÏ=ÙpӨ剒M[4–=à[ídmCB Ô·½Ý–϶á§tg«r›ú-üÖêÛe¨uð¹èê–g6ž+|\‚=Z®PPç -â nÊMˆWÇ»Š$:æ»R8e»£5ºÛ°®–è@ ™&ØWŠ-I²€·Ž[²ƒ›_×¾žÎ®[p‹-ë†W)´ù„þ ˽(;²PeùyS•dÒ¢iË5).Ü™ÅüŽ)Ýñ5ú *Èu‡:Èf:¾„ù›_a$Îyrö¡â}œÄK¥GƒEP<}.ó@么–¡R2ø›WNÒÐbfˆ±‚ç Ý ^0îhb4baÿº7¢E‘Äž§ ÍW=».œ»ªõ Lš““•Œ‘è~™“ gØfñKÇq`;¢!s"uO‘£éjžÁÛìxÈ.]£ÛaÕáÀáá]&«ÿǧ¹-{ ËçÔ}×ÀÙ'.ìE!b3qpß»Ã`¼?Èst$:TYÙ]¹²‘ Ò< ¯âžµ­&ŒÃ!çö)»¦©m#™–@ŽÃ̉{=L–ÏjëÛ¦8u»DÉ)@+ÈÒŽYÕÀJ".îŽB^¿Af”OÈy«m_Ž,×IðŠ3Xÿ´äro1ÿ¿±½ø²y,+Š?\áÓ¼ )”ÐÛ-o¹?¥3zå$òê† …;¸ÊÚ†]¬ˆžøŠ"Ê#ºŽPPÜÜ)…–«o•Ìì!ÀˆçR¥ýRe N%‹(*kë»Ñ<¢FË÷:Qß”ŒŒÊ‡M[Hž€½8Gâ)æ~ËiJ(âÖ&Rê…Œt–e´‰ÐÑ 8K(ßÞšKÆ[ÆÝbÁÒŸÝh«Ý8pÏWc°~tñâ‚ÅùÇ%ÊÛm9¬^Au§¾žÒÛ˜C‘«(Ne6gÕÚ¹éê¯ürè×Ï”Z‘‚Ž8…ÞF™(S:Åž¦iÙëkF¹Ð<Ñ+Dtï^Ô{ò…âróáœÁQÜ8®ªClR!ÃR=Ãv¢ç徇Mª<2Fæslcµ@cPuÔA|âZ9Ë+e2Ëîë¯soçîÅ1:F±«½+ÆHž—Ò!2ÁXUµª§ÆÖ®¹¡0>0Z4®ýt]êm” }A6šôv¬/ý©ëö?_\<>>FX*0±Du³9D£²<æË‘Ô $ó€?P†8œg’,‰¤’b"ÉD>ï”d*Ãø6Ú°Û/}ÛσÙ•CDÝÙç¹zìj¤oi+ÖEËíÏ<[¢±x¼y ’i–}4uGðïã/q±zB~]Ú)sçÖW±kI³±Éò£©×iÊÚIsQæ¼ï¸¼ùZÝqÅ«HTPÁf³ ‡hquÂËRÐÙt(ôY‰,ÎüOçlûPé\ÌÊ"rÝ#ï&þ j.ˆ ¤W$s™Î›ü @gÐŒßS®ÀQßö¾3ݧI¦8u‘xâ¥$t"ά&Ïö“Iì.ü‰Bc&Ä—†SŸËMS§Ý0ìXQØ~Wq5÷ uá–N6~ãQif°‚wú¨Ü~²Dõ”K^ÇÕYHèÒü‡K÷ªä0ÉS&¹ÛgQ\‰î›nj{Päar[]9 ;È<¨y¯oqhààž ¾ P5Ç‚Àü”Ïm`ûnÖŰ:&|žlÜ X“?:¸"v<;õ‚üÅÅJ¶Ô‘OÜLÁ»ÝôC²³îä)Ÿ}@Sy(ù´Cj¸œ¼=åíÁæhÞ’BÒò')×4ÊHZ³ÄÓÚû¸Ãïüê*Ρ‚÷‘@°Ñr£ÌŸý›ã‡oLQ ýDQbûæIí§˜ÚP‹âæ×ÓCúaåxCö¯'?LPþiç°Zæ14µq¤eòµª?ˆù"'굯īÔ¿ÚºoVÅTê"ªŠîbgË-dqZ-«»úâ8óÍÊ9$©4$5‡y\й`ç%ýHáXÔñÜÿ þåR endstream endobj 21 0 obj << /Type /Page /Contents 22 0 R /Resources 20 0 R /MediaBox [0 0 612 792] /Parent 16 0 R /Annots [ 28 0 R 29 0 R 30 0 R ] >> endobj 28 0 obj << /Type /Annot /Border [0 0 0] /Rect [163.1061 545.1183 246.1365 556.0274] /Subtype /Link /A << /S /GoTo /D (Copying) >> >> endobj 29 0 obj << /Type /Annot /Border [0 0 0] /Rect [357.4441 529.2819 489.17 539.2819] /Subtype /Link /A << /S /URI /URI (http://www.geomview.org) >> >> endobj 30 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 418.0988 433.6326 428.0988] /Subtype /Link /A << /S /URI /URI (http://lists.sourceforge.net/mailman/listinfo/geomview-users) >> >> endobj 23 0 obj << /D [21 0 R /XYZ 90 720 null] >> endobj 24 0 obj << /D [21 0 R /XYZ 90 720 null] >> endobj 20 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F55 27 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 34 0 obj << /Length 1869 /Filter /FlateDecode >> stream xÚ…XKoÛF¾ûWèHCr—"ÙžZ4 P4m:½4-°i™­DÚ|ØEýíof—ZJ”&¹;;;Ïof¯"ú‹WE´Ê” e«Ýñ&²ËÿÜÄömCŸäûÛ›·ïÓxGañêö~Æä¶ü#ø¡î‡®^ÇÁÝ8ÐÿºmÖÞþ¸ÒÉ6Luª‰/¨oÞÝNW¥Iò5a@r)M–¬â,Lbb-ÒlsÆJ§“4$E·Þ(""Ô¹*¤l’‡±ç³ªö¸N²à'*pxYoT± >G‰Zë,Á¢NÒ`¤ý£e˜ú sFi¬¬Î}{?¬“œ¸SÓ1Ó)´uÇöС~†üÕ·tUußCë ¯÷ „ûÅzgD˜'ú+ïÝžF§@'çD`Ò%;ÓEã>‘Œ<²˜æ¤&ßÎgÒ( Ìæ`%±ôxü¹c½V›8ÉBb­éM…q‰Y'žj›“bå)^øT…I’f«$Ló<ç|öbò3‚ÀÛ«Y°êÛ;yÙYUã`0=–Š`×6%Dû©h­µvÿ±-“öáz“êüŠÃ‰c#Ô7éÈÙLÜK!w¯-ÇÂ*ÑI˜è8¿®I<פát‘×›Ä:'¥˜þŽ»c÷S4¨tî<>¥ÛEßC‰²O¨X‡yA²Ì=Á—´*(ëΩ]#gÚ^\kÆ¡eÕ½çkzüKžcò£0è*ŽŽ¡›[kÎÚ–¹j 2-15º8ÓlCŠ;„ï…ÏLû†èô68'sèݧ“ysÍãöæÉ¯°R4·Î‘@‚²u0%'Û4(+yÞÃ:ÝÑÈ—}À˜yPuÇz CÒ’ž(÷ˆôi¬:¡ÙµuoÉŸFËl<ÊóNœÁ_Û`Wà ¦<žœ?K×™²µ×ÈÍmï±îèÆ™J[VéÞ|©: v]$Á/ˆå"pØ ÒhæI<.Ú–p 9ÎA–ÌɈ#å·‘·¡²ìì#ìL«ºìV;rØ æpUiyI´2†úð£±hY·BgJðbj":,¹lµÒ¢ô9.Òúóš]x ^-íóƒ£Jä„Õ 6<ÈUZèÊs V!¸[Ì„poøf5IÆ´|j(úK,K>Ë(â¿ëå¯À™½fJç]-÷÷K6± ÀW–DŒ·’’ˆZ§Â£qöµYÁˆÀ™úÆf/½þTï¦s°NFg?ñâǪiíu6´˜ôçOò2Y˜ÞÍ®å@4™æát³;äPr(ŽjIýÁ°3ïðïÉ(ŽdBóhNF¬ìÚåõ "D‘ e_- iC©šúU4[jW ÍÒ|¨èhÜ ¾àÕVQÓ ¦µá{EK¸›êrûX{‡[y=U7Ä­Êòyí{!dͺÁf's©äiûÑ3” &ø§M—Màô÷Úï[/ÜGp›4 “=<ï,TdJ…­VÁïë\%w‰–3 çàÎÎõ€½ Æè„iû‘º¨:­#$UQËàù¡£äUyC >P*Ì—MàeÏpCÐŽv¹qU¥[ Ó%ÄJ¨劂n "ô€…e‹Z<–á"qÚ>æƒú ’à7¹ æ äÙ›'œž\©VO¡¢ ØÇ!’ šjxE<Ìf ('mñnie°Š3šzzqž¢mY0¨‡jùë©á9;.ÃÏ’€<e½ ©ƒÍVi”‡ªP©Ì3ÔäÓ¶7ÏLtŸPF¬ÄŸ.Bƒ‡axüæíÛ———pORA¢°íöçÒ¨, ‹œÎÌ¥¹˜®&ºifóÉ%CH# Fn ‘GéÖ¦d½p¨Î®#06/¼Mk3HŽmã4Ÿ¾R°A Y#]1.[åÄr­‡V°Ä­s[#%wÇ¡¤óûuN%‚»[iÕàŠ-Ì'¤Ó—IBFZbíŠz’£Õ¼–ÜÄe÷'ð³Òë¢̧+¼Œcó ¢Ö.årÎ$YS^ÊzËzªÑÌÇR2êi³˜‰@J}Ö,cÁC3;ôš², Þ9ï§~‡èÄÂrWq?Œ"¥ÓS‘¢w¡vþºË&’¶kœ3N`j,_«ÄU¤äû„æÌþÜÈí'¯Ó8Tn¤AáHu"ã"ó:°ƒ]`ƒébKE†³bäÉ¢ñtèq*ž§6_ÃTS 0–î«zQø œôÑz¡æ8> ‘£Wá]D¯–ẜJ· ˜w¶…P©L"45,æ=6ØßÙ™ØÎ¬Î7nîXˆ!,ýÈÓ/3ò|µÏÁ¯þŸ£7¿'o‡þ¯§Ž´¥áå¦;¨)ñ–r SÕÜFÀ0ü{‡Æï6¶Ž5¯ÇÊ«æ^ŸixàÚwæhd¡¬\ýÃ×4àãÀE¾«w™ð®Ž+B&QظQ‘V^%·4¯¡;TXŽf^«—ú Tj÷Sš|MH‰#­¬½†¡+¬ÿéÁ,D endstream endobj 33 0 obj << /Type /Page /Contents 34 0 R /Resources 32 0 R /MediaBox [0 0 612 792] /Parent 16 0 R /Annots [ 37 0 R ] >> endobj 37 0 obj << /Type /Annot /Border [0 0 0] /Rect [246.2577 505.9693 377.9835 515.9693] /Subtype /Link /A << /S /URI /URI (http://www.geomview.org) >> >> endobj 35 0 obj << /D [33 0 R /XYZ 90 720 null] >> endobj 36 0 obj << /D [33 0 R /XYZ 90 720 null] >> endobj 32 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F55 27 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 40 0 obj << /Length 499 /Filter /FlateDecode >> stream xÚ…“ËnÛ0E÷þ Â+ ¨’¢^Ý9†´H PWi´LD-Q%¥¾¾>IÑNc$ÐBÃÑ;‡3È<”äIKšç nfȧ̰F±8—\W³«MŠF°D%Õá…IµŒV²‹IýmŒ£§ø{õP’Á”¦ÔxŽ :&gë*´I yd”¼&É À9$ØX;’¬ '4õ$† ‹l`LÔZ˜«M‚AË,³5¤€yY¦`A¤8³uÛ»jù16-Óè†Ëæ—à¿Ýé"I<Ü÷B÷Jì{IlH²‚P€a†Kkdõã73ÅSVì¥+×rçæ^·ŸVëí*v´tÙ{ëP”&Eú®ù×kãâ+oÖË[+Y”CLPa¤Ò ¹U}Yoï`lr)Šî™òR»w§d®,µè§{®µ×EÍÛ‘ÖŠjæÍÚ³:oÆ[ÍšéÄ›Kó­e3ÆN˜FüÈÃ-xaÁRk¿ƒ¡ñ$óØ…ìyÍæ|;umNTûáXþô\µánòm²¹™Ê“b ÓŽðçp‘pÂ3…C+jÖ„ã‹•Ÿ1O{ذ<ÌIhíûvR­lluÒpÝñZlñ¶¿ÔqÕˆ^¨àv|º[¹¼ƒbJ„>o qÐÓJÿ›œ~ögS¿#Õ endstream endobj 39 0 obj << /Type /Page /Contents 40 0 R /Resources 38 0 R /MediaBox [0 0 612 792] /Parent 16 0 R >> endobj 41 0 obj << /D [39 0 R /XYZ 90 720 null] >> endobj 31 0 obj << /D [39 0 R /XYZ 90 720 null] >> endobj 38 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F31 44 0 R >> /ProcSet [ /PDF /Text ] >> endobj 47 0 obj << /Length 2662 /Filter /FlateDecode >> stream xÚ­YYÛF~÷¯Ð#Œ¸<š¢øh“Y/&†³3“ÇZ­aB‘2Ûq€ýí[W”(' , xšdwu]ýÕW­xÁ¿xQD‹œFŒa]õÏåžßlQÜƺ¥lª0ê)©^zš<´œÿÿÓ›ª‚vÄ}öà3Ü®¹™3P7{vçl ¥ÑШW—]×¢M?èAvðÃÀWdõ€êU[tÄ`óv(»£ˆýˆšHLhA‹oŒ¹1íÖ¢ÀØ0Ò3&8¼¸C|¸ÿ³mêﵺáP5&ðÍoÔü*[ž¥V:Ùâ^’½¥ƒB¡è]–‚Úø¶Öªò3mæÍâ‹LAAÏíÉ·®fwÈ&Uý\|1‡§;ŸËú4ÉSôøxM"õ² ÅC6Ö¿O4–í8Ÿ’Ië῱eùÃ`e‡s(q [À‚(c$Rybœ1ƒ†NcÞÅþ³Ì¢(Э;cæÍŠR  EÁË3tPêó(³_ø[ièÌ iÿlœt'{Í">üÊÆÒªÐ%j-ëÏÈhm¼“ïœ|ůÑEZ¾±ëkíADWÊB¬´Ið Np‡À„dQ¢Í˜\Réxß$èoüÐöò ÁŒ÷´tì«~è*ñº¨N¾Ì5€¾;`8h%Ö_À!¾ý„Be<š˜h^¬ùµ©8¾Ç<èøýO~Ç족v¬æ¼AÆ¡ïxòà§fÊ“PrßJ=Ô'FàfR% 6á’¯ƒ«°^`'…ϨNIÖU€w^¦“”£)a‡Ú$œ|éÃ9[Þ¶Þb®{(R*à÷±?9Lì´õñ>ùƒÝhÏ0JÚ_9Ã)˜­ƒßpýž2’y Îð]4QšyΑ”¨Ÿ½zcô/Ä›fÕ±œ”òK,°ˆ_  è52œ© •›"T‚ ҥ煂U7 º8ÒÒ¼³­^Cí@ú@…øðÌáÂy™ “<Ù,¢0M6š»c2ºŽ|2ºJCˆ†Z¬¼‰€œÙ,qUa¦² tÀY ’±†´sv]™ë„¥m¨N2ƒjvìÔÕ: óM^LÓ3ƒ’$ É”à'L<îIJ-C­éÄ•7<ó! dBšFòþUÛH“èáG˜ór¹R* ¢$ŽcØ3Êùùé¿á´÷X©èãÓSSõ,ZÎ(_Ñ\W̺j§?püÂb£6Ä|™Ã<2Ù~ ó,çžãVj‰wÖ–tª¹ª!¢ØÓƒ> ü§Ñ”2Á®o­ö1 =Wiw`ÎØÒ Ah™³³'²=U\3øÑÔIÒ, U\ñ×s(ß–=OÞ—=E ‡L·hÖhÌuG7A=eªëVÊÆ‰×7<‹ËqcK† Ü™£xíÍL/ºrððŽÄŒš¤+·¯|†¡/AmÞßš‚tòH„Nt¤Yÿsp±õ°Ì ˜×«iƒ›¼¨õLWHr 1,dÐG$ [tޝ­-.¦ÂË(1¡¬Ïu ž&£qž´o­¡K–ÿ?íë^èØ+sf€1µ¶´ï´óऽ±º Iž†yž‹$Ì6›³s‡IŒ× Þ·jBü:ƒ¢çXmÙµ¶Ë§F>çâŽ}°ÌV€€Ï"ýúmGàmßàõE’³œpÚÑŸºÔœ"{_ïNµJNâ,}¦ [¯sÛëºïúñ¤1‚¤á:]§gy2£{?î¦éò—ý[µíüË’ ‘gå/¨ûÍE¼+ùølÖØ žËu_÷™¨Úްf¤’±e°î\r|àJŒS*LÕ:᪄*Í ÌƒPEŽþ›f™RSÎcáZ˜=»eŽy”eˆ3Åu/Â8Y/ÑÿEr ^å«uE,©¢gغ•9çݼö ¡Qáf±åFÏìpÒÛ£OT“ŽT`ÂePLóØK§¢ w-Á÷,…ç}†Š8¤ãÔJÖRäÓŒEe0~ÚkÏ­K¬vW–PW§ Åþ„…˜p玱 ƒdàK"ûÙ€¸cdR».‹&ýEçô  "ì™â;i6,³e)íÖ²îÒTýвUÄïË9Æ­åÀÆŽH²˜®ya]m§¤e¯M02¼zÀƒ)S%2ü‚@W+;÷ø¤êú[_\.yÝëóùü•Ë.x8€:\ö+ûi”ÍÛY¦s­ƒf ô›«Ù”Ÿ ùu–#h‰Y&Åðêª÷ŌޅL?záÅ8™£"A)¹þh S ÉgÀ%ÊÞëçJ|»†T´èåg$¼–üUn„Q¶° ö"XŸ&5?É:⃇QÐßœô®LHð…¤gŒ.ÚÏ•\xQÚUº>N›YŠñMÃvÈ@ý¡v³;N×K·{”çSê–Y.–Mn]²ïܺd3‘#å™Pœ0tí,íÖ#ÝtöºNú'¹ôîbÜ §žEù5_ÝR~~ïŒÕÈU¢°U§éÕþÕð?܃ƒ I,ïF"€uõm5Oq”r3¹ÕJ‰”6<êžU´gV@‚Ù¼f&>c©öšþ~öòÕ ´ñ *è÷ ¼A©zy¶=û Êšö»š•Úk?\QÒm&Ž®÷&ÀØ ˜¼VóŸï’]œpýHâ^wö׺'ÃrG:2¹@¯æjâk²–E³Eæþdî¾ÏÝ÷ëaiÔ°A;Túz£>´× ¸Îahg{傉/^“hªMv„ÇSî× sw5Øv©è±5wÕÌ:,ŒëÞÓåëI¼}µ…¥%$¤ú*½0*|šLQù'*’F •¤ôC‰®ù Ÿñ$©$ùn]ÃyPÒ!iÅ« wk鎊iŒ\{–>ú¿UN•„%Ó/;ç„ 'ìeo{³* å³we-³4§g—9‡NÞÑ*Ù ó—¸^9õ78v•ç›àmÛ÷œw?ÏOñÓlè®Ëe–wt¤{·ýô"år“tITI[C%ðA¨DÁT—"•©ÿ ¼Â˜ endstream endobj 46 0 obj << /Type /Page /Contents 47 0 R /Resources 45 0 R /MediaBox [0 0 612 792] /Parent 16 0 R >> endobj 48 0 obj << /D [46 0 R /XYZ 90 720 null] >> endobj 45 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F60 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 51 0 obj << /Length 3505 /Filter /FlateDecode >> stream xÚÙŽÛÈñÝ_1ÈX2Éæ™¨!e'`HvWWW×]ÕŠîBø‹îÊð.WêP&y~wêž…2üïg‘¼íbïƒüôáÙ‹_Òè. eXFwîH>Tÿ^¿ý¸Û+¥‚7¯Þï¢àý+ø÷7I‚wðúñ§Ý> Þüùg—(@ ·ºUž–A¶û燿<{õÁ’Æñ÷HE 5+’C¤’”h}ÜÅEÐîEpÂ×í’<êÝ>I‹`ª/Ÿ,_yÐ6G€Ëq2 ¯tUóÔƒ \TðÚŒÓàQ07Žf€V} cµKÃ0èHn…l9ö÷Òñûv"¬2Ñ6ðþ8ȆŸÂ4$Œ=n2è ¢è…:M/ûµãˆÿe-¿ͧP…»$I‚SÜ&î#uˆÒÅ8"|]±(÷X…&lcÓ1lÏ£UÍ›üF'b£?ÁDR_f9Ñ^e&‡šŽW5c¼bñøÜïïû b™dU?Ã3,™ aÎD¸ÀÛgýÆã2°Ü˜/$¤Ñ õ E¬ð¬c°ª¡cG‰E“)"*‹}  ášGå1OM‹Gûf(„1V.>ÆÈC¢0QКåïq!5ÄLóÈ£¨lCt§AÛ<ÇGNãÌl÷e–—mÓ”“YÍŒ]ãÅ©Y¬bP’cÃÆ‚AN‚¯†Wø.:LöVÙ1Ôô©9?Ès°’MøÀy=õã‰p PSœRó’EBéø•ŒW…©>‹°ŠÐR42‰t¨›©§]I“RÖHÃXvµe«°úª‡¦g«€ò^; Ô]/ r,”g¢ÿaÅ·Z¤º‹CÐéU’Rewñ!-Š‚NO”kq„nÒ›#?¥;ï˜DÀžà÷ªÈYRKÙ‚w¸ãL0q|HÒäÆ~Ñr?òUtLo4˜x©Ï$[ä§'[ø¬«®¸1 £å7\®E§€@•|?8/NndàiÒ{œßÔ{œ´PCMžÅy952¨…x2Mk_°¯,¤ÇzVH¼Õ!˲|ÉZ#è¶üU”’Žª(cUÑ’Â~£ãy‚•÷ªžê¡k.¬G^è\󤿌úØP¤©´õ1²›5OXhY”_ó›¶¢iëQ𼄌¹#™>ÇÁRÎ’M=¬9Í&_Q`%Õ#{äÑ­ØjŒøÔóæHþµgwz´¤"ðì(¤²×iÐUåΰoõš“‰ˆÊw;‰¼q þô+ Éi{%ÃYÕó¬Ð¹a‡5þû®Pë6”äOÙ%ažgÎ5Yä¼€½ì–`¶n™zd{’PcÔ }.VZ $Zôm‚€J 6À*^AœVÇ;ôG N^ùqòò2Ô¤³ŒSrVJæN0)Òà½asþ¿¤UmC!ÎI#18öüµØúlIn ¦ç…XZ"Ú>A UÄEqÃasføuO‘ËyCÑÈ“zà\RR¯=dŸà÷ÉÜjãÑ{=õQÛ¶ž [EàG?®1¤ÅÇP+kL ‘¯ß›”·Ã«ÜinÒÆ‘¿$ÏYºTäœ}_× ÜE’J4êN´ß9•Ê‘Tócá8œÐ=hT-Ëï1ÅZ=ãÔe3ShºPT1‘‘P¬SÍš{\Ù:ÉæšVV%¹dW8ÒC‹ê¾bԛꂖ³f·FãA‹¾YÆhQF"æKêµÑ8JÅ#=_S «=”KKjˆïuk2d6 ÊØë+þuyßy4ÑÖs–·’ëwƒ‹6çšRY>¶Hêb“A〞mkç xÍÏy'ILÁ* €JŒj©ìäò”ÂøipB,µÖ3mÐK®‹ùǃ¤E0ÐÄ\˜‹ì‹WÉmXðºí2 í·ã!óó®#–™,V/3›´nd`ìƒ+ˆ$QYÓk¥  Á˜ÕÜÛh*NÞR!ë¶óf¥ìyù«mN6ê]éÎs†ðë·jaJ}oÃ5}^6[Hõ›qä’3ÍzôuDŽ⨧ào5…ËØ¹|¿8Nâçç«L@°ÿÆ3w2QXsLoô¶®»nX”˜‡¯¸2ä÷ ÀÅfE¼l—®€ºJ©'ÄóèD%ÒœJ-ú•¤—gî©Ýqå¨õzg°D·çy• Z 5Îjµù¡ÉÎ%K«©È‰9Ü…¹˜ÿ ¢¸ä¬a¾¨š:õ¢ác&Ñ 9÷‚‡uô¡ËýøkòjWAè‹<_&„8­y ¯zó­ ÷$:CÙšÊMÒŽðIÚ´ÍõZ 'SÊ] ;OúºÔeÏ9ÅV:È~à×~"°ð:ÒrÕ¸^~ÂŒ¾¯'²8ÄääM_džÇ¶î¸z,¼8š¯dÃÊ6Sù£aÛ'æoMµžÉ ¶Á äžùw ­ÚAt¸“v”*¹´V*ædê8!)ÉJ÷G²„  ƒÈl¶Ò¼»¤~ ‹¡P‚ a«H"Çzé‚=)ŒA.4ú*z9Ýr)D~³-‰}-=²Q.5Ï+@³Á–ìfvÄËûZœ¤Êž¨˜½,hë37aàÓ=x‘ßY¬P²_ Zö,x{²á:ŠAÒ¡­”@¯ô|p˜Š bC{à„ë¦<ä ‹Ü\Akþ"uýæï!¤ ²Ûþ¼#Ksž…I:ɬøÄ´ð%«?+é¯î™’(÷ YFýI”m0B޲B@¡"qk!è ¼Ã×eCj÷ ’Šrã(3{¹'ášÉkHÍeç]â¬^oH¡?x×®(TSd-óï¨Ì ¸—ùup‡‘_kŽže¾h¸±pôdÏ0-[!SCý¨²À,KÞÀY§æ_ù7 qv(²üáßp–kÚ)Ò<&pÓ‚JËm¨¿Àíâ¯|¦÷ÔpLGôê&Iœ: Æ®y°~…ìyxU.ïƒþ þ›KQ˜d à> endobj 52 0 obj << /D [50 0 R /XYZ 90 720 null] >> endobj 49 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 56 0 obj << /Length 3549 /Filter /FlateDecode >> stream xÚ•ZYoÛH~ϯ0ö‰"†ìƒÇ¾ÅgE‰ó´Ù(‘ö0+ŠIÍó0û×·®n’•(0`5û¨®®®úê ã«þâ«<ºJµs“¦WÛæY$Ýÿ}Kk 3ÖÓ)×÷Ï^¼²ñU…y”ÇW÷3"÷心_ß}Z­µÖÁ›Û«8øx ÿ>` ÞCóÓõjo^ßÈ$lÄNzS×J§6ÒÕîÿõìöÞ3b•ú«8å^“Ì„±6–y­ºb·Z›ÄÛ¶Y©484üøTt·¸ø«‡¢Ç®$ØàÓf‡ÿÛ¡ÚâŠ>\­3ÃU´¯mqÝеü´+JxlŸÃSžUÃݯBCÕ5õžæ¸¶u·=ì¡£§ ¿­lvЦ5ÌAÁù×±cñ T4û „™2åm]ÔýsxÁWAÌ‘jÿ9ÒÑÊl žó¶Úã °Ù>TŸ°âŽ?VÖ" *†â‘È{Câ&6pXÊÂLÅ,h/ r Eߪæi‡²Ð©!Yh8oRï¹ 2ƒ%Û‚×ÓÉÛª—O4ÚÒËŠW0ÙÚK«–íMÁöÕ–æôL“=[ÜÏe¶ã!¹ ¤A/¿¸É~+‡F”&H& ŠŽd°öB˜Ü ²a’ ËÀVÍ,ÜIÿa@²»ú¯b¼ÜÏ^´<‹Ylé|û±NÂ8Ëõ• m–e´ÕçHi U¬À:&cÀ(°\í˜ wo„E}ä¡ 2¸ÙÒ»9Û/Ääb/8é+Œ„(Íqçë¥sh»½ßT¤¥ÓÐDñ‘¼žhïn<¿Ññkt< [C V‡€AúÅ& sHl­WËêñ€ŒwêÇ€sþD×FãxJ𣇧Œ¨ê' ”稢ÛÞ1»pî7õÖ{‰9°‰·yOˆFˆeÅÕnF÷$“ÄSÞiÙÛÚò¸R9 äaÀ‰ÈžÊÇ;$'Y$³& ³éDÞ‹ôãÁ‘ªÁ .}é¤ÕHWY §„<†"…%ÛæµNˆ'„\ÔˆBQï¨ÛçÌDëÑÏ‹nŠËCÑÖd6ƒÄdù·1öA š¸`?½°’ÆŸ°åuåHBŒ_ ¶&ýÑ[lÇx„èN*å·oœ¾"Ê»³ÁQ;·¬—tχÊÇnDŒ©,¢ËI~Bh®S…„•–&²™ô_ŸÚ-ŽÞðhÙò#…ÌØ˜øœŠ§8q`{‰ JqÎwÝ.£\ÞAf‚½€`>öÐzöo…ô ñ®Ø:´{²F˜]Ê*8ÃsnmFVîaÜ8úøtPò.nÂxV  )åI0] x+«´gÊÝ•ðF^x[8:qª‰ÓoÈ.q³Ã·ó8ò–7±sùC5F½%dä¿`®–³weá¼t—@ØðZr ,DƒB…êj7< ü ŽSä!ÊÀˆÊ&r›}WqÕ{ºßÑn½Ë'åÁ¯ÎºQn‹¸âr‚D öSß©!Œ"Ïc‡þ0=˜(W¢%J× ð;‰Ÿ¸ÃÇÐf=ª/2Fl?¥Ð‚ïÀ›RJ9±4YåŸÜŠìŒ·ýùà„îUF¢[hUß³)˜+\’äÀÏI’-ð.¨"øCLà娳›€ ö6£QÖŸ! ÞBD¤Üïõqây^}?BàK}mŠú›„wðH ¿GÞÊuWü3ÆÑe}•µ|G2ÿ„âÒ–Ì™ý«§â•¢}"CG]Vì:n6>ùB8²ÕHä;”WëÓµáy¥~?úŠ-šÚJþÑX°ì¡ZHaêT q.1ƒùò<£Æ©“¹P z0d¾^¼²jZ¡P*“$É@!‘ÁÈœYÆ *™Ñn$¾C¢©À.¤8ÈÕ~>|{,0ë84Ö$ßcš.Ü¡œ"-’Õ©ÚŸ>]ŸÁ mjçè£CỤÕü|éisBNŸ_Ì$&K‚;Þì‰@Ž»îZîܶ‚€MªFˆæ6Ašó(‹¿ ªÈ­Ôî€eÕI‘ÁaŠa¥ûΈ0_Ù¼ lËF­F‡QžI¶'”‘9ÏIø(âcm G¿r)Ú¾pKg Ï›#¸øô8ËB@è°2Ø j- rÉæþâ\X¼6‰Â x×*Ìlªép÷·¸äÃÛ»XN²Á-ÿP)òîÐù[¯oV H›Œ™06‰Â(AéÐ$iL”þfª0R6…Mp„în…öûUn‚—^ráê†)E*T±µWã|_±Y¢……Ó×/Ÿ3Aæíãý‡×ן^Ãri'\Z0^OiLÚ|J÷åØV”†IÞqZ“JÅÛ½%¡x™¼z}óòX.1vž'ïxl^ ‚°/:ÎÃXe|KXZ’DdiZ¥Uý$oý¸iGh-ѶR1F:-oö“rfAIH톼öQ4äÐEtM-¦áÐí¶û^zÞx¾ìâ«Ã|ma’Y}T£,ËI©Ã†4õ®ssþ.³(ÆJ‹?ê¾®ÙqÕ”ùw@’f.ƒØÉä¡T+éø¹”D§–TN«êÁuPx:´W6Ó”OÊ¿xÄÅÂW&¸&’? ”Õ×yÆ(H06 ŠÈCÛ5“ •öÐm_g4JMjÓš‘ 8î:ºÏqYÀ¨ë¥eÔÒ¸ E¦àGiª™º¶TÄaëÍR¹­$ÉBk³ãÔõUe’“è:%RWAÁFCAyãUåÄ©iÁÅÌ%$’8FKJ”„F¥—G(£p·7>9‘ÄñN6 !߉/ÞN‡\¹º¡ð÷›¾èØÖNáéÜ ¯d “Â\%7’BL ”žWgÅíŒù€ÍYùµK§Ê4ò¬/>% R±Åæor‹WÃÍË#â€('ø7Yįl> Pq®Qï±Tª]¢k€nºÿº9îìN××ûyäE½LÞcD9Ä`»êì‹”ˆ_$à¼å¢³OopŠ w¢sT¬^î!ñÂã%ôƒç’2l‰ÅGz–„y ÁɼDQqŠôïÆ„~zoéÎz±WBMN'÷µ+þU‚q¦O¢{Y)Á=¸ÜuVsć &}å9±â[„òR¸x,‹5K Ø=ŽCï\7Û\íðG×£µ¯z™Ç>u—‰‰\;¿pR„r4m–g=)+’ipdtÇA5ý¢.ˆ{¬¹ØF®/ISLús¸A‘¿åÄ¿•‡®ÂôÔ¿æÂC d¬âêËqÄc£ÅˆV9‹€•ÇÅYî%C€õÃÉ!-)‡•NRŽÁ¿4Âê|_Sî7æE¤’ea%漿V‹þi{ƒ¶R7¤ÐÃíç Ç+Î<¨æ 't8ÚžCË8ƒtÞÄæçÓyÜì8Gæöò{]_ªJ‡Qö}M„èß„Iª’£üo_MsH|,8^¨sãè¶uµ|ú ¶BE ( :X9°…©-¾M¤ \ìg•aŸÚó&>¸‚v) wœ¦z Ù-€¡‡ÒEˆvÿ„¢£AJ²YÚMEW þV>"°“ ÂF–¢p®RZ7gA4š? ¡úãëéÇ ;‘N]ºûeÜVÞ´Ê6»Q'‘¹%Ýå-$±e,ÔÏ×ü ¶dg‡-νJ´ï¿Æ/+xLR…¡8qHvLøñÁg ôDª½'ï ™4ø^6eÿò _oþsw_µK¯×϶Ž!íµ—W¦œ¨jª½ÏE5s‰KQí%ŽN´«¾ÕþsŸGŸOk R˘^8ªí »*µ>A°å ±^,¸8¼ôòñ¸²8ÌÀˆ2°çÈœªu:ǪwËà‚Ö—;Ìí¤W?¶ëoØË¹‰Mmöƒ[Œü Š6• O1¢÷8þíìBLËÑ?þ¸èeç'vç{ùTIÅÀ9ý|RZƒ_3…¾ú"¡Ù:#/pä’*þê áã2¥´I\Ý™VN?õ;¶š¾ØÉ…'üFk,Óó¹RfÊjœ˜3Túî†ä4‰> endobj 57 0 obj << /D [55 0 R /XYZ 90 720 null] >> endobj 54 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 60 0 obj << /Length 3496 /Filter /FlateDecode >> stream xÚ•َܸñÝ_1j`Z‘D›§xá ›EìÍK68’fVN«ÙÖá8~È·§.Òhl/Id±X¬»ŠÞ%ð—Þ5É]¥TÜäUu׎¯þ÷«TÞÎqA^¿{õ»?é]šÄMÒ¤wï7HÞuÿˆþôãϧ³R*úáÍÛS½}ÿþ†#yô¼þüútN£þü½áK!ÐzÎTU4Q}ú绿¼zóÎRdÙ×HE¯Ñš¦i\&IvWÖyœª¼ ŠÿºÂîˤçÓ9Wu¤—¾?îàÙ#y4SEÖžA®0ñ¿S‘$‘6²ˆ!Z„þ%ÉMšÀ úæJuüLˆú÷~ITrÊóœ×„تH¶á3«aá ‘¦y«¿´èºýœŸCÐ"óH+>ׄ·ç¾Ñ¸™÷ÀÒsªâ´HX¨=a[à”*é „©¿zrôïqªŒú ¢Syf—x p壙G×3ØL„¬<ÈkZ#¤Ä@X•DåI½˜íRZùÉʨ]=1òwd˜Ûdžð”zDÙ{õekFøõðpA1™…±ÃÒ¬IB&ãçÒøœ”ãN[Ñ2´a%ºGЩłA"É—E U8ÿÔOá§ìÓ$³aâO¯¡„¥ ý¡q°¿¶æzuM? ôÁ¹[Ò:ê'b· ™‘¥M‹{”íüûÊv“ž°°)ÀËÚ7?/ÃB&0ñˆ‹Åß@0T>4kñBÆ®ò<ÿ’É€&Úõ7>Ëõ|tÔÎ)¯Š)Ä'’CG’oÙ8¯JÜå„¶B0B à4DÆûiÒ#Ñ»4d;8´«XÙ§þ#Rñ¯S^JŸq eà)@ 𣬠À~ ¨T‘&x³=a)'¼ycgŽLÎ;iöÀþ@¸þ¦¯ž¶æÇÁ±òó™AdÃÑó‹áaôƒ¨“zÔ;0Å`+=ƒÄ­œ] €Ý-b:ê9-â².¼TqÒ YV–Iô÷SMÔÃÚp@Ø ¨Ê*b­0Är&eN·&RV‘Œ"£‡À²œÞL8zZ;ó"¶‡‘ôeq®öÐ}›~ö{Á¼ #DÅ“!Ý@6xsÀf¼]úE–wšŸ,7Ö}Ï­Àžñ¹(ØUÃsrôÿ•Øq°^Ì=6ü9ò¢°hÕ«CxlÏ#6„AN€f• ".ƒ]«LÝeqQ×5ÑFÇ'Êã,Í ÀsCg«*C'HÂD2¬Ãûme‚ÿ u²ÄÌ‹³‰Ù’öñ„Çgºd±îzfßhˆÝ–´‘î6†n 3kÀµax¨`}Ï’ÕéÎÒi¦~XÌ,à”‘@¬f†D—†,Ãw–÷ 1þíjxú•Ô’„" lr7ÒZÝɆ²ßŠfˆßW³ ˜Xö>risä8gó0¡Ó,Ø\>™+Ä«ƒå%Â×'ð̧A/ q(’Z@ÀAͯ‚~`…×-'+Û>ÉÏCVáBÈ˱7¯”Cr¶FmfƬÅ'òã0T쳯 nP•&‡@.ßFÓü`°E¾~,»7 ”Å(æœ4"â äÙµdJx‹¯ÀôXÍÑìe™]#³Ïy¦,è6T¨QdãçlÔ|ÇeêÏÖp3UX•ç9+V\HÉ Œé‰]/{y]éç²82â™±¸züú«–M$ u$Àuz ¥Íã½ «TZÆY“ª}ù¼«åŽÂ×\0ù%‚©@µU£LJ•sr9tPdºÂuÙHNíòŸpÓŠ”ö‹‰® ÄÅ­ [;Ž«LÒÖ‘?¬€×@Þ¹JÅ'À¸t3îf¡WM7ŽÐuHhá¡a8¶ˆ÷²ê2´.wfO¢;ç¹J_˜"¢+hÆÝu´AÎ6ƒÖy1¡ãÈy`§•‰}:ï>µý0‘j…F¥[3Ù—<»XvÐXÄnp@ÿÖ3k+ÒÄÜŠ‡«Nìð­ Ç®œ]=í!ÞÂU{‹”·£å³šV‚Ý‘¯³lNu€H‚ÔEÎGN‡÷§ Û´J²…Íbo„»tÑÛT•*;q6øÔ•¥™ó© L ®.,æQÉ‚†kØò «ˆøÅ_AªJ%'hà‹Mj„§ÐF½|Ùu0í¡ØK³añ~•®BbóFUZÿTæ»®=NQYŠÃyZÃ*Þð !Ò×y„m\ƒF’aßD.•ðù‰%|°Š†*^pöçzQ9•¶ÍÖu:~tÞkï8¥²DÀg:z¶÷Á‡RYØè¦ ˜¹ ù>yQ˜$.Á³weŠ™¼Œ / 0°F}~<Ù°#"‘(¾I~ Ù†­Ëp4Œ=0€M 9©¶½¢ø°{͆–‚O½Qˆ±«A@.‰JÕæö¦ø”Î66u-·©¦_±^_ÚŠlžÎ^/ä7ÐíóćN$yœ|ÙÜüˆ æ¶½âqÜLÉÖw˜NA%¢yÐÁjò}¤$Ë«}gÆ}ݬÀë¼j†@?y¥ÅþJ \“.Ua½=úºm=ÊNóðtõ‰;2«¾]›ÀVáEòÓI|Áý'Îä¢ UÏo×7IôˆÇÒó×,øºÚœH>+Õ°âæݸÖ,ªÆ¢…–‰Ý9#Vªj¸{Pt2鈟ûì®"awn´v·¹Ø.UqQ$é.D`Ä/’mé]$j#ÂÓó8'&UiM— +DÐòM1±wíŸÝ튎˾·"ÊÀ®ƒ\©à$âÙu… }¶¦Gªÿ»‡D¡ª’ÈëFîîϨÎÎ@:Ÿ-0•ÍM$—~™äÉ•ÉN*üïmüÝx² #èZn,ñÈOT¨{#@(L_9>N<ð¢K9²yªUË]B ykÔ+k©å>V¶7ëŒøó+!O‘7·;Aì3üâ1 ²¯ä:‚Ìg͘UÚ¢¶²¥#6¼O;Ö×ï»ÒÄÆ‚奾!äû”GÄñ÷asfg]I3æ[Ò¸œS_œ{ÏÒ&NUýíwÞÞs›px{§Ag6r1¸éx¼fã² aéHÈ8gY+°Àýõ¯3q¹OWøE—µüö3HyÖQ:àÛM"¤Nâ<'wÎÒ8ÉÓ”V¾ƒ¤€v~ž‚T;ß3ÿØ€Z“ðQƒÎŽü±i÷¿M†z y\ç~APº‚ õPgÑ[ \0{ÃØ'ä NÒs·ÁÊË…EV8_Iûœ¢È}Ÿ$/н®Âë*tðÕõ“¿ÅêNöޤ`UäáuylÒ3Ý“‹ÎÕ ƒ·öC'¿H°xÁUî%¸S]ÎG-¨1`JŽäIÐì…˜64èâ Êâ%0¬ÏýKQ‚ ä6$‘p~âè–ÙòÅó÷¼¬å,'ƒª}áÂ&q›ño …ºôÓHer’îk„ÉÄç{§í¼æGïúšô)¿qæ•$ûšF^¼Àý8á\&ÊaÖá|±¨îcÍGæø˜¼9šq|tÞw¾K¡†ÚM¶ ^€„f¸oýbÓȶ±»½y²ëörŸžÇFûm­“Zó¾£’§.mµÍwÙK|º.‡#ú°Ü:¶½2È;Qò^ºœEµ½÷(Ê  “û:\åùÌjé ;³x¾ñWeTް©;£õfü¬8ðÙßç—a¥p\”æs¤òk-¬X‚PšIÈUR‹ /Øš/íúÞþÎ`'^xƒÖV³-N‚²b˜çý¯.\ý"»þ% ‘¹K@L;P'åÀ»õŸ–Àô+™~‰¥6Á ÙýÓDJ_!°ïò/2Æž{¶ÀÎ'Yˆ2»Qß;OC®µÏŸ=?6É%„Dü¦M…N½ß6ûxŸí5/¬Ý”¤¬pklíùWu endstream endobj 59 0 obj << /Type /Page /Contents 60 0 R /Resources 58 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 61 0 obj << /D [59 0 R /XYZ 90 720 null] >> endobj 58 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 64 0 obj << /Length 3647 /Filter /FlateDecode >> stream xÚZ[œÈ~÷¯剖¦Y ”§õÊk%ZyØÎKœ•˜†ã@ÓÚëø!ùë9·* šž±W#M×åÔíÔ¹|çê&‚?uSD7&IÂBssèžEÒüïgJJ{ Øû$Ïß>ûáçTݨ(,¢Bݼ½_Lò¶úgðòÕ»Ý>I’à—ov*xóþý[tðŠïžïö*øå/? T€D¯€t'&-‚b÷¯·}öâ­ÛHÇOmIžÚ«R*Ì¢(¾ÉrªD§´ãÇ÷Ðt·°~5U'ØR ™ íû(Nviåy<·ÔœÇÿrSÏÕ©ÆaWddsÜÅ9MEG(¼’h§µزœ¢ªyXù>Rh‡®¸¥‚Z3ÔÍÔÜПyÈ¡ç%dÓLŸ–l¤uÏ0Zªf°»¡É€ÑÀ¿½JB•F|ƒc7Ôx=&8w%ú;ÜŽTx­ÃÐLÔÙcÖÍPvrи †$Iœ`e˜a`ÚÏHŠçÍÐþÛN›8¨ÿŒ½E°šð8skæT] Äåny_¥Ï i«ä$D÷Å}8ÔƒLÈ·8B÷’FŽÙȾ%^kÚ3vV sYqs‡\o¶@Ô2¥0v”V·Aûy—‚$U¶“®ÖƒëAÙ”V£¾­'!—æ»r¬ç¡Ç’‡’òá>ïZüß³ÌÊÐÚ„Q‘¬-væ4ˆv’¢SÜͺ.h›îÔ"Û±R> õCyMÌi>e’æx&ä—Ì#ÌÉ?Aå\sÏq9‹õGVQlã ñÜÎÆiÛN{°sébžq뾟7w-^€ã Š5 J#¼,Kn¿C©ÏzÜõU;Gp”_o â0,UÜEŒŽS;7YiZj©¹‰¨Yáš^Ö§í%0•ªÌ¨›8Ló<§³Ñ}b§ cƒáôúRÙ!,€dûÄäabŠxÉ¢lÓWgÔJâAÍÚѳi§­ÀïSzáËÇ-Á)½ ×sí¹akíÜJVˆ°vgK8ŒÿgëpƒwÝ¢S·‘§ÒÁ/¸Ð3oQôc¯Ò0ËÓĪ 3- wû,‹‚ìr½aØ`^h?Q{O–°ª‡ÙŸpw"Ëm)ÅZB­<‘èl/Úõ$OÁÈ -[éÊqû—{çž×´^ ggVzèe=”-+áÌÿó;Ù´Ñ} 3?/m;”™O #J\Öèõ›Ãˆú©AoñØå@ä1{!íß¿9Z½Â®ƒcijææJ¦@u[Y¼½Ñ1°¶_ó€IœH/qîʬnu±¢Z\ë†U)[Ø6]¤1¤%0¦¢K49_¬Ag‚Lu*ãºÏüK"=5ˆåÚ·ô,ËLù‰L'h)5ŽDcy=êX`lØ’$ÔμN–_‹eêÖ_]ÝàÂj ‘òm1ԣǤƒ ^Óu̲̖ԧxéü(Ês\â&Iÿϲ®q¤õî–Kr“£7TSo&õHðÉ…ì»i=£òøB$ô,o6ÙE²góÆÖ¨1 º²¹tìy[©PBóéÌ»Š3,&´`ccÞX¦°@X]³ŽL·mal¯˜,ðŒuo8¯ÜÑ¡¥Áâ:ñ&Dm*rx&x€yi‡xCö@ ?½+ŒÍ wæžyŽgžó%[êØB_¶ÑlIÁê|Ÿ¨Ýq&÷?:`ùÜ}o­£ÝÄPß×CÃ˦ E,Ô«å1îË¥iî8ùúÀ¾2@q­?OÅ'dŽì1¯Ã5t£5Ÿ„<ÑÖD½Ô­£?ö{ö¥mš'ì™{›`óÉ9Ì23ê+7Xˆå%_c0ìlT7Q6Zó™/BÏ¡ž8 ¹ŸÃ!!qqôúøûªzfµ7*é¦Ãzžˆà†•)ìâÆ(]Ä.¸ÝøPûÂè­ˆÃ<Öß Þx‚VP[¡Ã(ÉÔRoœéF“Èþ˜ŒãÚyй;Iœ~}Ÿ‚øAÌi× Ê;Ÿša R=YãuüÆñbK¶!$ˆ×T\«d!’ÚDK+>5-N£Ø‰€ ô\½jQqÉy×s¨6ð8vŬÒÄr9yc{.zǬšYØÂ>M¸ÎÅv¤À »ÏÝÖýŸ(~ÊN8î"M(_ÆcýQ˜~¶îv‹¨R\ùVŒÀÖM?#d©EþO8! <ˆ–¢€dÚǸ| ØþŒÿ¥S†lð {]D›­BY¨Ïw‚X*QYr3]Á„Ø;”qceáj`Púd*R¦A%¦Ë„6ʶ >H{cœ‘¾–q++LAíC¿‡Ø|Ÿ¦ÁÇzê™Ï„SÜ÷Μ—“ld™/:œ§yq±³ (1F85ŽBMÆ™Zg 7mŠc) 3„[X+6GÓÙ€()<)ðBFÞ‹a`lcÀŒ­›!㉽òs…'÷6}èQõìh1‘Éc5c "—]ÊQ|•Odg|¯³âV–çÏ>Åtï„&ÍJ…gÖ––t‹–¤Óìñ¦"OË L¿Yw‹5çPpÖ#T—3ïÞÄ¡*tö]I”^&FÁÀa%øuq;î¡”ÂBZ,ÇBk)ÿÈvcþ)MgÏVwb}Lê(3ë ‚ígišU‚†‡f&Ì áê)ã+©"tFªNçÎ] — v p´œç©!Côµ¬d§ÒenøÇ&‡Ãœµ1lrmÞF&ûû iç(¾œ!&üø Q))‰J¿+)%#äVUúMöéî)‹ƒ‡1w’µR©Ä„ ±Ú;¢Á†áJ4CY«ÀÈa”é…q¸¡Ëä‡wÖ‚ ñ<åfœ‰°) ZñNŒÊÕŒ˜çR̹TŸ‡¶‹„‘—Í`a††·»$¢Ä7P•ÔH_ýé,^¤­]Â>*–Ð÷Qâ½Hì¨'MÛF($‘¹…ZÂ(ò“½“jk³@h•%«PNµ5ÉœÀ¨¿4 :šrž\H=oý˜äÍ0¸xòœÚYïÆÎñµ W±…ƒAÅX,  „=.£?¿uLЂí9'ÜÛ»˜Ð3Ú9P 8×s4Pýx¶ D›‹užŸ öÈ­VöÚJm½ÃÙŠð€=—¥.¹ÑfD’â"ßLbf_ >ìÜ#ÖwL7# ¼KæËÄ`ˆÁ1Ž«dr@ekWf™+ý_T–ºx¸½ŽŸ:zå)$FüÙÇ’k¢Âr–&ãTÊà}9g:®´Ùv™«GBÔûk\‘K%hÝÒô¿móPº¨Ò-C¸‘.7 “huV?P!(Œlþ@ž¼ ÁNîðÐ,ÌõÃÏi¼x´ÖaV$9(Nú'!Y¼§¡‰M, Ôë$—¥QPïåËÑÆêàKÃ\¥ê›—yN“œ^É%P>¿—Kš±ƒßõì¹|L1L$^ ÜŠã<ÝY±}>¢¯£~É·ãïÖ šÍßHäk:lÆá–WX¤ÔQ0ö2\÷6³ýÆ3w¬Ÿy’Íìöv ͩġöß%JúExóÚnËP|\•NCeLñÄÑÏÀ³,Î9ýo”EŒJ?¶t‚ɱdüE®ìeý?:¬ÕLäíDÔð# §X5Ùür5òb§†Iº’èØM²LÒôüökßË ÿ‘ÝC/FÇ’¸ˆÃ­k¸|Ï (êqµTrSÜÊÚ`¢í·ÿ “ÂØ´îú µ#£²ï—öò0Pˆyy¶‹7êMR”aÃßaÌðEîW^®ù`Ë›æÀÌDd9í™HÛÜ$}¹“D˜¹cP=LâSæ×Tr-ÎØôåÖ#¯IC¯C¨Ùp\ÏE`oæY9XæÎ Rù”‚~,jrÑ`¢½WµN}g”r™,´)ûëÊÔŒ›éø¿IªÏ†²ñ&,ËàŠ“? ƒÅ\`‹+\ß7±¢Kò¨+ ëða^]9ÍðÞ¾ —»¤ít²›e ëf2V¹ïU*¼ý@Ld“e¡Öjå]gKV¬,™q…kΞ˜K{B†„¡3~ö-1jæ=´'üնͱdÙ2+¹úrºçÔ T8?ŠŸŸÍxÉ\à Q½Ö§êªYÆdG.b8g:EËÒ´(á¯Ò°Û³­nrÈ?€ÀI>m}²+àP\Z|ˆ„ òhIUÕôö/uÃÊo¼)–m7Àø¹€Ë.PSáúGù%¿›y7h²­¼²Â!ˆIŠ—\ft‹ 7¥-Ï仄ìúúÚw’·›ÇÇ•tfœÉýÛ¥eÒØ"T¢ãÜûÒ1¡OPö+Ï@}G :÷,+Œv¶:8?Aš óÕ7e:_=We%Ãü9Ž–«‹YÜÅñî*YÄF¹×^%äþÇå „ÈF+Þ¡ué¤MÌúFÒ„.LUü… %WÐ|­¬€Žî8ÉY™õÇœ«’½°P»v¾‰“šB|î–àÈ)¿$ %iÙÒKòhOäÿeŽÚæ7I¯Á¥M%JíûÍÄÆpæ²è¥âï@é—c`Ú„Tž‹î˜€.¿?©Ì&é@ó”Û‚ŽsqöÐø s{*ÌbæÆÜSºãê÷:HB©ê¶‘Ç|œá§¦¯LEöðøaû=”Qã'Gº-á°NLõÑIBOÔ,m.y8J~œTHÝ¢(.ýáÞ¾ P¹o´„t*³Àr¸¹aŽÏ††#,1CªZn`ý!vLÛ|&~-þÁil” endstream endobj 63 0 obj << /Type /Page /Contents 64 0 R /Resources 62 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 65 0 obj << /D [63 0 R /XYZ 90 720 null] >> endobj 62 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 68 0 obj << /Length 3529 /Filter /FlateDecode >> stream xÚ­ÙŽãÆñ}¿b' Ñl²›Gò”uÖÃp²»y‰€#qÆÜP¢–Çbí‡|{êêƒ%¯ƒ`€!Õ]]]]wUS=$ð§ªä¡È²¸ÒEñp8½Jdøß¯”¼íb‚¼~÷ê«oŒzPI\%•zx÷¼@òîøèÏß¿ßí³,‹¾{óv§¢·oàßßpDG?Àëû×»½Š¾ûökÂ!Ð÷ºO³ÔT‘Jvÿ|÷—WoÞ9JLšþ­òkÄ*¥âÕ Ð?Õƒü8» QQûigò¨>ÖñÈ2щIÞ|nóôc’f;“$Qý q6íÈ˽۷|½ƒã$4Üúþؾô{ aoLô¡™ü„à5`þ[ö*‹•IX2—iã-Ffÿ±æ' ¥…Ù§ÿ÷ t¨Yn–8œ¢·¹>ñºÁf\ÇŒ"c?òºÚ¾LŽ9';„üô_wž+ˆË!턺ø§bw$eRÒ‘þ„ÇN«è€K„JŠG8´ý#bIHÊø¬ùá¥ëŸû_pÛ›ÁÊQv9 ôëvÅ&ÙD °ðÿ°K‹è_;]d‘l{¡qœ-µ§PvCµ§¡E²æVÈ ˆa_ú-/"­J¢ŸýÓ oÄ^„£áŸÕZB8$Â×»B€]giô×¹níüÇÙ›íՀ؅W†`P6_ ta8ߌ“lmå¸ÁŒ Ô<á?ÚOiÔ xÓœilä}~b¹ÃÈÄš,P°,ubK&oÕíiÔó8w2›£"€|½Ñªè²Q°õ3ÃÿÃK{þyl{F ¹ñÞ–tíK’ »¹"(']Duð&»Á:3XÚh¹ÌÆ„¦”—&[ÚÊ2Wòu"ú€²Ï‡†50KvZƒCéOV4%w™ï‡öD“f+‹)ÉbR–Šº'>EæTÈRñ½8|èOhy(Îö\¼#±]UÄK𭼉_&Ò0LdEW&×ÀGäÈïfJ€ci‘ X—ø3Àýqn˜½Yhª2[ c.É<Ñ¡7)*@R©ºGO'Y‘ ÄB"‰õïÈ•Žö‘­/HôüßœyVë“ë8“xoÏÇudðqi‘° ÂrnÊ|ɱ£ó)E×§™€3—º4ilʲ´çÎhNÅ©Â| ˜k÷øo«/ ý`Ý;ê{Ý‘'§ÆÆ«$\3΂§!š}÷ïц  à?"7Yx†‘‡Â]X«]AÚNìAX¥Š8É- þœDj-™œÒ‡Ú[*b`kíÊ5J’e-E ·ðãª砢½ ù8Õ“~´v‚Ío`xXÉJAçÚ›å:‰¢#ʃuçŽýDÚÓ MCãÃÃ`µÀÒ+Ú»áðŽÍe¦°°é²$ý`!Œµd$Äl‰Ï-²@XC×Hz^¹™‘¼4)xO^icè2u»´5å)bxÄÍÍí4ÑLŽa‘ú ”ö¢£t|¦dàf!¯FÄŸ(ç XÚZG6ô¥aF ¡ÖÇr¡1Ø Ýà¤ß_‘žû2e"—NX^á`ƒÜeøÞtË9ßó I/0ì,¼Èqð@9èÒ0¡¹áädÃb•ìó]{hÎ^ò˜ÊçUý}Wf› ‰r,c¥]$yˆÓLÐrv|ͰÅv¶F¯s¾‹5 ˜:zJñ'Rj­giøT$Eô6^õÕ‘Ã[$`!df‘¤my‘ºïÓh#êó™\4B {|rœ.Ãl²èÜO_dkKVåbärÄ>4-‰‹ ÊQ§~°¹(Ža Æ›–bŒ^?íËOưÆÀ£åÛÈY‰!w½ÈÝ‘™jÏöRЂO2ºAÀ¨ÂÂd¶·ü$FýgÒ7T¦ž1Bàqñ¬ºðgÕùí³2¨Cþì’õ ÿ$\A&ø®2 R‡$Û:ñ* ¥` ë4îÖ<ƒÖ{«9Z™¡’f`Õ£Òê\KJ±Uä`Ê€Qjê;«¤ž.ÕÇr«‹Ú ^ÅÚ×7A:±nO:|-7¾Ž2颹ý+íV¿N¶æ‡y{vìî„‹°†8nyÒ{ „©˜hqx´†³tB¢OÕ÷@EAW£kx §R)—‹5—IêÅ‹^ ŽGMìQ7'w±ƒë((§‰¯„%W¸îC=Þ®þËìfÅRú^*¼ÞpË0óaÕ Â1ò²lNAWrþÞóëÈý ÇóS°©€Hm‡Øæ‰5h`¢‰Ñð\ú0R#,Žª<’ ‘»)qwƒíº¹…æÑKœ}9$B¾öBª5OW;e™íÏŒË¦à–‹+ö–Î<¿*Kè6T¶±åÊ7âåR„Z_¤¡™@µê*ã´dý’·jw¤¥£B€-×ÂkÆæC- ·5ì‰ëª"sUpVÜÉÝ‹«, “U ~[Š˜èpR.ç8úô,-Џ„Ôg©ÛC;ñŠ”À¡uÏ‚ö6QŠÕòÄ3$†µ¿K Ú4ð¬Wñº™úK|Ýv–k·àÂÇö7pô¹&y:äi.Ôƒû@`êåªð“W‘®=zœ¾5‰7„¶"íyrÕ4OÔçžÚJ¸ô9ü"Á-`ÖŸÙžIœîøaK‰T¦‚\ÐÀŸ›É NÐ1Â×¾?ÝR9‰£Œ$H³ˤÅÞo¦Uâz °¬k¦a³²HM—IZ}qq³‰ÅÄÚhsG—…«_¨'Q–W¨ çL3^nºNEÜ“ˆ‚áù:ÆÍò1…뻲3%G†,ÝÔ8¯®‰ÚÞ:Åþ&›û<׿¸ü `âéÚe1¿H],)÷Ò’£¤%oqCÅE„Âknÿ}ÃÍî²€Š!(c/±{nC¼KSTfÙøÝÄd†“ôç®7 êÀfrd;–*¬Nó¥%mäkä:„™ÚávöÂ÷e ¼vÒdOe‚[–öåÌÙÊ#ÏlðÁËM[/êé†5œñÈg+Ý: ÛÍ´ë £ BNóJðÕ­k Ã¨tRNÛ|¡…3½ƒÆ‹Ci$’ò‰¦²sÙy¾ÝsÛýv5ùH>ìÝÁ·@Röl]0q•FeÉZOþÐóâ"qåÕÍ\Îß*[íkäøÚ±‚ÿhï•gÇ|ûÊâú7½>g…ŸZÚ˜UÖ´¾Â b+û¡$P$—Ê7x{UÆZ%íýnm ̰es­Wúßýx¨cÕ9}‚ˤƒXO}ˆ†ºíQÆ\öqcðKÁÒü/ 4më¬ÅF‘Ç­>ßv-•J‹_i ™´´ 4ß·EÒçz.}á˜Ñqb²•›òÍ_%í%iHÙ!üKºÌܬyêS-3}ö×µÓZà¶û¼´˜q\ô¨‰«ñÇÐ\éoÌ[Wø–¸ÞQv»7¤éèö÷è|t†MïÝGaŠè¿äe!³ \<ςޟÎJIÓù½ùÌ>y“dœ¿v“u'X‰smû8Z3ÒîÀk6½Õy¯’8ËîõO7Zïr·ešŠQ«;°=ƒ×¶r…ͽ™v¢ÜŒ¾¾eðº{éÀw±ŒÜT}Po¤ƒíN«ï¼·Š%ìq«Øu߸ äÜžK¦B×A¿Ý·Nò]òÚ h endstream endobj 67 0 obj << /Type /Page /Contents 68 0 R /Resources 66 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 69 0 obj << /D [67 0 R /XYZ 90 720 null] >> endobj 66 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 72 0 obj << /Length 3407 /Filter /FlateDecode >> stream xÚ•ZIÛȾûWô‘,…E)2·8p‚ƒIÜ“KœÕ"ÝC%vs1 &=o«¢º4Ð"«^moýÞ+ª»þÔ]ÞóüPëãñît~“Jóoo”<íb’¼»ó‡¿êN¥‡:­ÕÝýçh’ûæŸÉ_úe·Ïó<ùðþãN%ßÿ¿c‹N~†Ç_Þíö*ùðß…T‚D?é>˳¢N”ÚýëþÇ7ïïÝNŠ,{m¯HòÚf•R‡2M³»²Ò•ë‚¶ü¼Àòæ²Ëªdv{—É´t—Oi–ïŠ4M̈ïç´PÜÎü0Lø{Ć'Ø~•  mñP0aÌô81ñÙtòÔYjœx–µ[™ –I¡ù„#aÚ®Çí5ÃøºK•ü†ÄíèÖ饽å©Í4akwFkö*?¨"eéàªG\uŸUÒt&Ø$ŸŽÚþ:šj¶+ ¶gÉÀÓ´£9uÃÅôL˜àÛNC¿Ù9NËìÙú•Ž‚t:O¨YÃè–'i¿Ù¦Á©á˜yœàYÏÂcE" E^#ç)`û´ûv‹$?eÙqiEoY+ù°üÌÌ”ãÆ¡Âü*ëjÁÀoíÖnåAçUNÛøûÒ„F&+2i8 ãØŽÜBü”Þ–v4yûÖ=â$ÿfÎ]Ntœ>ÓHÌë¥ÙLü;ZyLóØ}Jót§µNN¿Óž«´H‰ÃepßYµl/~Œt6v÷(XV†“%=ÐÈõl¿)¢ÏJbí8Ðÿ® Ø8vLQx9ÃóeϦ?ÇöF|3ð+ î‰%fÎÜ$=VÇ[RnlåÆVVpòÛk žŠ•JhÉ›§±\_3–¶SÖ¢T¦Qšxí^…Óä«×S aîÄ‘ñ”âOhïP‘$:âýwÚ5ªSY! €ê C…Zöð®C‘õHëd Í_PY¥‚ql&ð¼È¯í¶Œ·Mì¦éP qÝ…óƒÎt~—Šªªh0Ä>uȺú ¯kÄõ€%&¾ÉD•°ABˆ;䙪b»<‚´Ë2Mþ±«´~ôócaW ­›Ùm÷,‰“e{vÔpÊbÑËPVotâ)îEÍVK”]ÜTj|Åžs@:<Œ;y)PàtrÓø¶‹¼<±»8”U‘Ç’ìÙ#ï‰l/o0K vsæßí)«5 ®€ãâÞ.΃`oYnš¿±ÈØ"Ñ'Cü‚W²µˆ±]ÈQ¡hù1\ÑР·(ÂÔÒ€ˆšÍ˜áŒ3­øtøÀK[åÝ6øô(bz2£å½+ ¯å„ÿ¸e éÑpˆSzùŠ—ù³qRôY^ gâv«tȸºråVd¢³XÆ T¼t;žam«€@&ckVNÐâ´žoš1vÎÃYž"í¯Y¢¼g±»öqéœbIÛBI#é3}…­ÆÑuú#(µÒuì5Œx.VÉ{ÜQGAðÀÁªÈ8¿ø‚•á`Õx elFʤƉg¬ðÉOæöíTâî2-½íXs6éA«¬ŒUùU2±%ä[hJ^ ÿXu\¦p215ÌñБ4†p¼N>ãœ>‹99NsF4?Ùà4È'°£t~6 MB1Ò·L Æu DGy__{;äúó"O”îÍm$#`'9Ú"ÎS€€¼ŽÔûq˜çÊê í"¿`u=å”Öü}êó´ßžH©Oæb•‚phcû/ßï`l讌ûŒy–—‹¢ÅÞFPTç]ƵiXñÂÛÌÂð{Zñ@Ô+?²ª(bõª^ÃWy]¯1n]o!.E™Œ×r&<¡‘c¦Æªp±ÈãmJ¦•fO³°úžÈÁÛžr&û > æ­çä<€øw蔵¯ü©ÌáÒàým¿ÊF@ÂÒI"P†äîJÔŒq%…uúT ‡zë>íŒ޲³á×Ýu2‡Þ²ì¿‘Ÿî­›.ÄYò"]qQ²o-½(P‡u%ž¹ôx`C9#tPU‘IJª¾!1¤ $†rPX}dÐMP‘~9ÅÀa¤— ï&¤Ê l†–Žd;|õ ׳?—µ…Ð,ó°™%‚MŸyÏ…äÀÊÙé2u²¯#½*ö'ËN’sA¾cÛÍ‘‚tæ_ ç¹ ¤íj&q A¡*KîwU˜—A“üŠ+w*3ØåÈs Ù„¯N”6H»ÓˆÇÞ`ÅȬnÉù4£´(Lè¤X«ø¼ŒWñyžµ£²AÁ¡O( ÃÛv½À)™0öM„BÛ1nˆdE[íChÿOJá íãDâo8­µ) E‡ËªVéŠNÓlaʈKË Òʰ˜ÍWD4†e.qðS»H ìÛ‹ Ëù‰,'TÛAÜ»wcäÞ5£~Õ½WåÚ½UX‚ ¸a˜*v9Ösøˆ3•4ªHÕ«mÇö–ݳ‹Ö0óá;¿pø·­×ª´¹k»#*»vòxxøT%ï™Ùcû‚¿·•_Αt" 9fE&bhøt¤ÕÈ ¦“¤°XQÙbf_\> t•zÑÛ„ëJ!‰|¯KÙG& c¬ôíhˆ†gpŽó¬<ÅÚ^ *+zûÖ´¤s SWpö rô]½ˆ ûBx ™xòÿάƕቤwÊïR@¦ç›ìÅiVjÛðŽ’•TEJªÐoVS[œáBqxY€*£3^O§z+`bGNÒÂß {!³â‚…þÙ6ã…„æÙ¿x‹|ñ‘/é1¾\üäû-§ç x ¦ Qô¶!–Ì¥û¤RX]Œ”8ƒ¸Uƒ•ŠÃ¼s%ÎÜ>OúD6‚OŸÍw»#qÀûž’”#¦ÃT肨„»¨$|ð8[´Y‚ {¥Ìjà"oàÛ϶¯{²r#5\Õð‘–3Ã/q*Œj¤‘-3Jº•o’ÂeìpºkÅ{iT#›Ø@\2é3¸Š)¡ìÒö› ÖTu3uP€Éã¬C¥—þ W µ ‚füþZ *}V×)«zàÈ+Éü[0³Vö¾Ïb¹<‹, 'q†D—0+¥Z]Ä ±"„*GnµöêŠÍÐó(ŒHä Sð_ÞùºËÌiC²áqkzôçÙìÝ ö…å8œ2ÄëñõtRš‹Dž¬5Ñšä»GÆÈ=ÓLKÊ$(œ¡9ªìZ"ˆ¦6”Œò=LÕJVmutª}‘5VUÛéD¥iù⃠g`8¥Œjã‹Õ‰[}bÜA‚º¹Aâ ©,ÎíñA³álÈ,ëò&0Û`KP1ÐE¶ºfŠ]är¯Í÷/øÎºŒå¾0\àýc‡›e-œÂ4.NÊ]\g{þ•;§‘ÈH³«ü ÕñvINÅ%¹SGá´²çkûAÖ°YÊ•À2OBk]7"šCY§+S¢}»Ü,Ï®ñ›G"ˆ¸ƒ‹+Ö¤"E‰'èðröð{ »°a½(ɳ â™;Ø;pëÿ •s%­md*ûË•qAˆ™„èö¥òÓÉfAîâ|ìÜ)¤®T%àµ1 ¯8uU­ŽÍJp24L/Æ%±ácPÌÐyÄo,$ Ïð<ýlimZþ¥½v¸QœVìëÐuÐ]jã¼a'~ G²ë˜Û··i°æ×nè71Ž'âKu3¯¿J‘JÌÝ 5çî³Î÷¥Í_úè\„<ÌŒÖÙQ F¸X5+ ¸åY†‚fÜ=Éj‹÷’kL“gJáãœÍBÃ_²àáŠRªÌí™ Ýg7ÓlW1[º{ûî/ý_)Æg…ésª¼1óhœÙøtWÆ4þ»@·l2îCGhz.•áÖ­P¶iìRT²„ß-4‘g˜Ì‚ q=fÓ™pÃKwŸ:S~=ŽE#;èG¬ja716 ÛŽFœ¦¡ùãëÜ]ëì6ÃõÂ@•¥./ˆC”_n]\À)Ö‚e±Vnä.¨ Ý•Ÿ u¡ˆý„¾Wêpi–|lyàí¨ˆKù˜ICøƒ¡œÛbäó¡ )ò5 ¢ó¾K¦«²„ážÉCÂéæ· Ù—¦Žî–A”0‚‘H³Øï…œ\^ü(iâgX¸Ã·—3¸Â}aõ¼—ïÄ–Q¨õL¯nèægv.ÍÝ%òOh¸im„•£´ÂJóÀŠ8¦<“öÿgW GWWÓ2ÁM+ÉSiMš¿çú:›É¹XK±`}ƒú;M\¬Ýþ<êWÒ‡ð²^Ó=•k9𕉭zP? <!(×ÎJå 4™ö÷pø|óK5ì$åÁ)ù‡„IVõ]­}Í!z!•)Æ­ôo#.ˇ­ÿØ1Å endstream endobj 71 0 obj << /Type /Page /Contents 72 0 R /Resources 70 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 73 0 obj << /D [71 0 R /XYZ 90 720 null] >> endobj 70 0 obj << /Font << /F51 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 76 0 obj << /Length 3686 /Filter /FlateDecode >> stream xÚ•ÛnÛFö=_aìD Éáyr§õB±³±½(дÀ˜¢f)Ñ%©4›‡î¯ï¹Íp(SŽ‹ &9—3ç~…'ü OŠà$SÊ/â,;)·/þÏ‹PÞ–°bé.ysóâÕ»$< ¿Šðäæ~äfý«÷Óåíb©”òVç׋л>‡?q$ö>Àëí›Å2ôVg²_B]ÂÒe¤¢¤ðÂhñÛÍ?_œßXL’(ú®¸äGȆaè§A¤yì‡*Nå87óÚqà=ènt*ü ½uÅ£C ÏÜ[·=ë?öUSõ¼èý¸a¨¿.`aÕU[課Bï`M½ny{‰#Ÿ‚H-’ ðÚœÓýK˜ò×õ· š´{äKáÕ»5.É-AÜáAƒ ¸–óéô–(*ðç÷EœE^õ9 ŒZ†Ê“€eÕÄ3 hOzˆŠÞè-ÎT|BË èxv-Žþÿèf¨+B;Í<ƒSá Yº•$$Ë…^ضß!!¥æïá£í¶Ú=%ôÊýö¡#zy|ÐŒ .–í–_P ÀxP}«7¸Rß•µž£d¦-¨Œ$ŠDM@QuB˜yò)PÁ"Žc¯Ô¼”ޝ:+N^Wõ7ÝÉ;+‚"é2ÆDßÝž¨|É G]t0zhx;lieœñ¦¾k^;Ðt©}KkâçER­×xtÍ!êv<0êº R@Ø2'Ïš‘¢½Á_ÍëYp¼˜1Ý™eˆÓºêôZ`ÕÄè¯ GéuS#W*9.DF{x¦úV•æäaÜÍV†Hr%”³Û;¡ÆàåQéÓnÄlŽŽ¨Q ö°]?üÎg‘-Uˆª±-„§U…'‘ŸäyNà Mšô£0çäÌÕŸ‚06çhD%í~ÖŽÎÉD*›“OµGëbûAx àJ´-¤F*÷œ×ç׈×wA†Óѹçç>^ïÐ.;‚°á™x»ºgÓÇòóƒG Ë{Æ€£8bÍÌZR=PHL öÜY@»–wVòÈÛQD„†Nx-[«æäm;¥ùñu‘¤S.Mwƒ?³ÎtbѸ٢]£Û‘àYêÑ{ã «¥@ްGû“#†Z<òë9âQÓ¢l6°ÅDÎø …ëgñóP—Xƒ#,Ç™bm8;TKg‘{¥FnºƒÃZ~öu/º¨ òœG#›}fps‰D{?àñ¢Rjá¼ö‘e~íPT–³›+DøˆCC$©1NÖ[v±à4*7 !ë'B¸Š‹å+˜”±2•²Ë&õð®ïú¶!ŽLÊ¥Š·–&FÁ–G ;ñÝÊÞuÙ±/äÔÞò6ï·2Š ZýA´ÿO\ÒËœµp2ËÁq•X‡Œj-¼[ÍT8ÌÄeB¹\äS^†¸ÂÒÃkSCäœÎg¢Ÿwä"yX7¿'ùŠóÿ̳RY["äXëC,D`Å=— Ùðñh©qº |Z‚‡ªÛÖ;¶Äžç(b÷–F~dû·ì‰t^òVOHdËTAߪ*{¸`ç‘B[ûñ J‘âŠ(ŠÜŠFm?ˆŽ@ý¬K“¸á ›$@Úd‡F‘i/K$Taø)Ý )QìÉ8ÅÐR\ÙNž¬Þgø‹l‘ùœiO²é4Ú•*0¨ø… •FâE.áå4×¼1hß¡"˜³J™ë¿"w•¦VÇ>/˜úšiÉÓh¤ì[œÁÈ-Ð×m!%˜Ižf±©Ús °RL}=:ŠçZu>(α¦ÆÊ/ÀRŸ]•–µñ>Õ·²¡³v&ãÂANe¬¢%Ø(“ú7ðáö쓃Ib—TS‚ÖÆe"ÝÆM޼aÍ–/£JÖ(Žç__Ø·Ä*0ùø…Át%bP·Óœ×ïDçi¯ð!Îü Oznbd™sd¥§Ä4O6gXÿT~–Äéßå6ƒ#SÃ'Îâ'wr0ŠÅ¿C•@ä[øYþ|EZ;¬cŒÄPvƒièALerOŽ…Ó:Œ+yæ]޹_bvÕcƒ †ÌÊé“ðÜÊfú :œ$îÑŽžFb³‹´¼l;ã Ñžít|ÜšiVšsòå"Z‘×Á·êÛ›1äÌ•Pµ Õ¼²ìj—w¦?iý;ü©®$€ŸbÉyïy,‘¡â‘ëcÙdªpµâŒ[P­Ð®_á“fÇÉ£~뇬 z4dþÆË'ŽzLPÝÖ"ï]` ^PÜ3Û‚w©‹.­‘_n¬æ"pì6¡ºÄéRõ¦3‡cRòÕVSÜ£’ù1ûA@äV8CO |è±í‡ãO/\ða¶XµÅ//ú©ê0fãëûj×v ü,M %îMÝ‹â0§¬†àÃ4;¨:§cš^'ÈÍg§b— TãSZ«äW’Ø 2}¶Ó¡œd'U0|?@ä>¸0Q§cj$ã^[dÙ¼¢q‰9]ÑMë)¢UV Ôoe¬ï«nb›Rù†IâG!j×öæaÐÍgºeA£'_Ö‰½C=7Ì\1ˆ3é  ‡®½»*Ü 9ÍT2I²®ýÃ1ƒmYF³…Õõúã,›Qò˜™“¡›1©•ãŒUv˯;•yk¥ÔòN†Ú¦Ú|]¹ÇÏÊ>ÏRS® $AùÑ5 ³!³ã€âœ3´Žç º«_]Ô¹šìËÀúì8H¼†6 Æz?Ÿ°| …Qˆíokè‡×# q ¿Ý$ú€ê€5Ÿ9^½K"÷5*¿¯„#½ÿ5“[Öò ,’s­„>O½qÒCµ”\!ý,PÙ”ÍÔúàªêÁ0óMêÙø‘Y…Ç;ë89Þ@„æÑ>Ìe8ÃíŠüáfOý%UÃÛò»aq¿žë»Ú`BûÜûJ8BszÜh‡†yÍçîåK(ªÈÙAIe–ÌÝH. Üc\éEæ^¬í¥È!ñÔaè´Yvè6K’L¤â¯ëGýI»¦Ý;ɺ¦ee÷µ,hhÞxò¨è3í·Ië)9¼é[†w»O¾ÁJg|V'€XÒ§®¾ßS}ÂKÞ;ÕÎÜÕÎôH>4UØÄiŒ¹==e¯I§½>Ï‹yÆå}9¼œÃ𱿛¿“_ÚÈ'%‰6*HôB÷üHà8aŽxøém<íO%Ç““F«­;žš«UÐ :²–¶kc÷:6«4O›”ßM#UvrÏf˜–‘ÆÉ{e¨ÜáÄñh~ŠNäX“@´±ïŸÚ8úD M?ßà î‹Þògm¹í»W”“ÊWY¡ž°±vÕ=ƒ´¿¼°¿#’†~W’ãÏ;hº«ø:P~R"¸qk^S…LömCý i»…Eì'E½¢±…gÝ÷N®Ç kÒ@ýTƒ]úÝ,ŸÖtÓ»l2nî¸ý5¶ ôWο#ÂunÇïÑEâ×õ1¬&F3{ƒ+–DÜŽg¸…÷JR( ÌÇZó¯ #›½­è{4:•ïìèTåÝëïlt™Œùóž£ñ¡íF_ñž~z› 5 1RÞek‹ܶþ¤[ëgÜ(hÀfÏ·z"¼ÆJ½5bÅ.$ÔO_lÓ÷9ùx `tS·ÓÑB¬½äÖEŽb³®ç³t¸¹«Ý踿_#ôúƒ»¥Ž;(óµƒá\ lûž.6¢#÷¾01º/ü’ÇZžìí¶­½Š¯;89‰1Ú¢kEršÏz;þÍgùFδnêï³½÷èÛN£ƒ*V¨e=ØÆqÄÚ` ísV 9$„§f•°/Êü8È_4ý²€ëlu{MPÓÌø8Q~œ2à¿$rùA’èÚ‰Ó+¼Ë޽·üËHxO¼ŸN?ž^•78vq:—Õ.óÔ1ô¿óÃHЀxÈ1ðì /¬tÂýž$‘@uñfuqus~v*•7!‚Ý\ÈÓ©#_Âi9±t&Ï”ûCγ |=}‹<–“èg ïùð³ÛkCÉû½äã³ÔÏ©»i>…¾J± pfQüg¾¸‰|¦jqÚNw˹„òÏ·ïO¥àP™ŸeY1Õâÿ 0~™AÜü€îFø‹PCÕ†™/yîòŠ'Wï/nÎùýý$¾/Þ^xÀ¹•ÀY_Ìéáéd1_Àûi†Ï'ôßç+t„yBâùmõì|ÍüëöôòíB>S_Ïyæêöæ#É“?ß¡T¯>¢2òZu}ƒ™Üé›ó~±¼ÐHÝÕGó‹Þÿjjâ endstream endobj 75 0 obj << /Type /Page /Contents 76 0 R /Resources 74 0 R /MediaBox [0 0 612 792] /Parent 78 0 R >> endobj 77 0 obj << /D [75 0 R /XYZ 90 720 null] >> endobj 74 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 81 0 obj << /Length 1696 /Filter /FlateDecode >> stream xÚXKoã6¾çW=É@Äå[âQ–™”…-yõHè¶—½ý ýíeK^g7’ÃÑp8ÏV; jä®2F[U»?ÿ}’™üϓʳ8Ê5ËazúôâÔNIdP»éïé¯ßŠ×nޗƘâǽ*Æÿ¤ØâÓù°/UqJmf‰*©ÖRíB¡Ìþ÷é—§8]5qZÿHWdù‘²J)á¥Ô;_[¡Œu¤2)Ú 5™úgТ’EÊótJnͧfˆ7ê±_&@£oi—yW_7{]óÔ 1!Õ‡"~êç|Ð< Mæ½ìk[4þ6ÅÄGàz¥2B9É~AýÐ!ÃÕzç}iƒ‚Ãh8¤læ~ºr5( ¢7qµ°Á8Eÿ”y6Fs¢Ò•Î]Ï'v*ÚW¤¬Æç9âD¢ûiŒ]ÛwpÏG:hY e««rEŸÉ:¥©j!ƒ«¶Vêb÷ó|Þ“I¼ Åk34ù&eÊ1òøò9Î&rF+Qè¢ÝÔó2~¹pTg;Œù-‹¶Ç3ûG~KgüêD[ºV[½Ó¢r•§í¯RþŒiåj/µ‰UÀà¬}‘ºö4“–Ý1«‰ä#åÑ”cH.GWÞ§0"Û"ñÒoƒü^÷¾fî±fãUvгÂ9¶&ëp=ÐUѦæNéˆóo[Çd]æóÜ´{ò¿J#I²ª½ð!¬õûTÂx³µ[Ó³° ©áG«ùœ'/©kHƒšŽ#ZѱåÂZ¹ða?½¤¶KXzad}gPÈÕu1¤±ÍÓÔMñu §æÄD¸7Féám”¿ýþ¥¯"ÖwCRȲT˜Éñ(Yææ9t(ó1p™à´ß^†êKKI½ƒBb´¯Zª„L®mØhIÉž§ä™ÏéØ3áÒ& dM'´Q³}^}ãsP«IÃÞäêÀ—›Q͉H°uÌNýq!ånå¨`{è’Å[ZåÜ>ù²¬µB;yÛC\úšbäßg8ÐöÃïs‹Ü†ö5™‚°¾cŸ›/JëbËð‚¸+ùCÝ%Çe/g¨åk_`ô€£˜C`x¹ô³ªV¹™4¼h»jî r†!¡ =ð÷# :¨|Ï(JYâ9vÙ¸¢æ‰“ø%½R^à‚2õ”?8Å”å;)œ±vëˆæ‚¸ŠÊ9X}ÜÜ8¦\Y D’Õî>’(¹J?U?e !'Bt×N$`³c¨CË-š¢Oɶ¼ìKãF¹?Rõµn@kx30¾’ Ü1QFQŸM‡â6nàka" F>‡í[½É@îŒî–¡¸ÐMΉáõõE.º€¨hž·*²ç2Ð&p¡E]Õ9Ý÷œî–âa½_á2Nǹ屋Éðqa9‚üb~’^qiBò¦®ëzU)Ý»•Ò-•’äöìq”ÊQÙ-…·!>ê8Z}±E·Ô7î®°SüäÚeÆKã5Â,ÔÛyÄð)*ùlئšt¹Bî´ÙÌî¦pœ9¾Q%~‹å&壸{›þ„xÎÄH(òmGÞ fWþ<ÏŒS|þ¬i HBgê HÈØ¿ÏþPÕkoÕÐ~¾J'bUÀÐðˆ<½™=ïQ­–‘r̬KÊfÅ”¾&~[¥:ÿ=K$¡4šï‰#;gaùÝ€×´» 7¿Žœ†ÄpY4ÍÉä/CÚÉÞø Ön“Æ(uõTø3¡0j©0NK´ÚÖB{Sß¡í˜V­XåVÌ7ƒáQ€,‹ p¾~S¶™¶ðõöC3ð’r'X¡ËGÕêV¶¼ù–Ü׿,…óWÀ"Ð%‡¤žy›^ã93Slj<_~p Å´t¸mh·†§ù]€…êš\ÏÂfŠˆ zŒÔ’qÖd¤DѰÇþ0ÄeŸ† E똾yíàæñö+I†6×#ø% ï^e…±“à% •‹Á(á Ygù'xÈÐ^Ž™À ßi8/k<³òàžîøÀ;ƒbÞkÁâ4êê‰i!5>®o}—ßgþ45  endstream endobj 80 0 obj << /Type /Page /Contents 81 0 R /Resources 79 0 R /MediaBox [0 0 612 792] /Parent 78 0 R >> endobj 82 0 obj << /D [80 0 R /XYZ 90 720 null] >> endobj 79 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 85 0 obj << /Length 2419 /Filter /FlateDecode >> stream xÚÙnGòÝ_¡Ý— q2÷±P2å(°e­$X¬×@“Ó²Ç!§©9;þö­«ç (Ù ˆ=ÝÕUÕuWÙ?òàŸ”{Giºy”¦Gëí3O¶æËjó1ÈÉͳÏbÿÈ÷ÜÜËý£›Û ’›â¿ÎË‹·³y†Î«åõÌw®—ðç w"ç–oOfsßyu~*@¸ðºÐyqîøÑì7¿>[ÞôœÄAð-^ä!³ipäGn%0›d‘ë‡QLÌž¤¾…¿aš8 àb·Ár­jÞ[6­Æ?cçf–GŽ®í­~§jÅ«ëNÑ^ä\˜Yè;÷³$pÔ¬‡<)WL‚®3ò5\ï‹„ïç®d!1{ °a–Æ sàv:ëüy?‹ÒÀ‘Ã(1Ãô·š¹\ØÐíâÛ²Øév‹ßŠ¿+ƒ÷³8áÄYò‹ì¶z=‚rw]ÙèZÖÖɾÞfãÓÌ·(‹a¹U¥±Ò–›’N A²£7š†å :Š@—QGgYFbyç!únà`£³’ß¼¡óyäÇn&!ˆ5týØcƒÕ1KˆÊðS&Ì1,»Õ¦„¿$s PqàT àyÄ#Þ«YFf+Â÷Bmíá­úÓJ?® ’t[þmÌm‹üþZ%®> =‡p_k»ë†“–í °4qÐuC2S‚·¶6Ò-éhNñ¦’hk|â Ñ—¨—(%5GÙ:²\¾óÀ7E Ä¡ $²Ôùm–EíÙ$ ¦ó‚HQB†™ÂÇXøÔZª˜hÙ"W^7|]1p­‹²sþÎ ½YEÌäWÒÌDƬäm#×|­•RMíw^ìDz<WBâR›VרcÕ–ì4Ä©®P‡­>æ7„B ¿íôqv»PË5cÞ"'—$D1Ì̦=}Ù£UÞsDŽº-<ÇgO‰ H†9<'X˜s,¼D ë ®GöŠŸ%Ç0TÓ1ï¨ÊŠì³–†+ÓNMex+Äô’hª?tHA„G'1>4`2¤Ä#46tºô¤ ËÜ ü"C§É42Ì!¦fQŽ¡¡?\2FˆA{\Ôbbô@ý¹÷q5ß(a ̉І^àf~šMÝhmئ†ˆ(!fXûE7ÊÆC8S5¹6-3¿5#KŠÓñUë‚Tî·5i„²-[òa!)€[á„BÆhK‰r·FÅ­Ë!}´BT¨°ÂכΒ¹RÓ‡BË…¼!²R=@öoHö @²ú bÛ»#+°)· m‚·2ZއPK^ ‚ެ¤ú(_,"«AüeʪÖV+P˜<çõ½Y¿CîL!+›¥!ES´Ž¡Ïà j¶ÄÏòi´FÙ ÛåÜŠZÿhøö¼¿>òÖåm¹îÙUýÍó/هȢÈÖ®­‰@Ò•„SXâÝË]'‰×/u­6=³#^ëÊÔS=PCD( Ùª• ã³Ôw½EÕZ@®'‚>3]U@©a*‘v«ªÖêú/÷ºn¾²$,pý§ß|,bêS´"Ô²·®Ëv°ˆº4ƒ©Þuj"ïH~g â‚µkÙý{81%?Ü0Ë“ï1%«’ÊZÔç^·X¾Y?×{~ÞèOûLtЧp=8ïiOä¾3õÀñVDz½|Í‹‹åÅ/o_/Ä6W‹‹›ó…h´Ò[^lu³íUK?”@[Jˆ·Ù‘Öe;<ó ?:}ózyuz¾89uþbñbÉwÞˆÃÆ¿ß.Ng,°VBêzy’Ùøz€‡ÅAÂ?½ÎÎ/cbËëËå)cöS7É ~ûçgç§ —œšªé6­žÈð;=œEEnšæÁT4ì÷tí)OÒÓ¶óäÇÍGÝ´ýßögÑg£Öº´–zÕ[pŸ¸†pgv}¶úÛmô²åÁ;?u}¢¢—^pÀŸ[g3·aáØ^YCú}Ú‡x¢£ =¯Öî±-„NUèZ‘í8çßUŒjjk}·+­%…¡'›'ÌzbÖŽ½À÷¡¸ñ¡€ñR±ñë…{¨®Ã'‹ãdÚ„×TXSs }"´”P*¯°r&µIWM}#P©Y¥Ÿä<Þh4äÁÚöߪÌð~_œA}®Z}Án?g¢ž>÷ô¡íé 4T58‚MC)X¿gêÕ04‘Ãáz*סÁ»Q±3ö4£1øâ Ä¡Cx˜ÁÄû†è@ÐN¦°Íý:M\ˆo|‹$á64Îe¨Õñ‡&Áï¨)øe\ÍÛ˜;ûJ®>>µƒÃ[l„†LåˆEêE?ÔjKx}‡s-¡®M&šMR0¦-Û§Ç"¦l+ ²z?TIŽAb4#S£+r“/6FÀúYÂ*žB‘‰*¹&˃&,ƒ‚?ξ»«uõpBW­Kyv!ÜN[5d©kIÒ•õc!¤±,Mžâc‰ œì5ýèZÒóLg2;åYÅñéâ‘!·ŒÍ0m€: gk °k;eùÐ mÎ ûë3F.ó\Èo†I–"jˆÎ¿ôÜ|%¶ùbK’¸öóÅ_* ‚¯ÚBõ±•§h¯[ÐA=kcÇ[Ó·8ݪ¶Rã¤;R£î(²r=Pä²Ü÷kÅÎj³úa(_‡op”g>uMk;È[½þ¨Š®V úÚ(AõÅÓΦý_qª=Ž®TUØŒø‹Zÿ®×¼?-š¦¬TÛÕ{èÍ[ǘêgែ¨U]n¦[~ž{‡¸cd—µnÊÔ ÿBrbE×÷TCk‘mGƒŽØÿºù?ˆš; endstream endobj 84 0 obj << /Type /Page /Contents 85 0 R /Resources 83 0 R /MediaBox [0 0 612 792] /Parent 78 0 R >> endobj 86 0 obj << /D [84 0 R /XYZ 90 720 null] >> endobj 83 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F67 89 0 R /F31 44 0 R >> /ProcSet [ /PDF /Text ] >> endobj 92 0 obj << /Length 3530 /Filter /FlateDecode >> stream xÚZKsÜ6¾ûW¨öN•DóýØ›co%²åеYWmö ©&bBb¤È‡ýíÛ/€˜eo¹ÊC¼Ýî¯ Ågü‹Ïêè¬LÓ°ÎÊòl½{I÷¯bùº€þ”ïo_½þ!Ïâ(¬£:>»½?"rÛü;ø±›ŒŸVišúž/[½[%e𰊃®]]ÄÁãw½£æÃ*©‚¶×{˜°ÃŽvÀ³ºH’2Ê‚8_ýçö§Wÿ¸u¼åIò-îqÊsöËä,.Ã$Î3a¿¨²0N³\Ø&ÿ±eÎB”YpI|iâ0E–Çïp>O|×>àˆ}ûˆ-ƒŒŸ* ÔšäaT¤´§ÓîÍÚ‚U ? 5qC8¼éÕ÷ðñ$S¨×Z6`_(ÿfÛò¤KKWïèÅ#é`Ò[OÛíÈóg¼ûþ9t|HãÔüH;0÷=ªcìN“6 %GQã4ŒóˆÍ£³¦#ÛÃЪ=1Pé»)\]T Å[Ù4+«#Æ r ¼õ¸Å¶Ó6ÿŒíDëÔ¸ÆÑ-oª††?h¬⇵2žÖ'ª@B÷8 ¥jZY{ÇÂÉVlN]e|ºhDpZØŸ E¸ClOË3~XUà1Ô ²ÆŒÅÁ9êL¢ÃSÛòTÅ?»nš,IûŒæ_ô¤Qï´ê Ú‹4R2¡ˆ5‚kÖò…; eÍJ±t”xòY$þª¬ðІEkÚ N´È#2ƒ;‡(q+É@±ãYÒ#Ìûƒ;fj£LÃIjÆ Ý³%ò!S:°;²¹­’`­‰MÔÊw’m4ÿºÝú=Ó{覃B7ë¾0±ùAÎm+ÂãLVXϰ¶Öúµ;щ3€£ (åaž¦1Qº%îÓ,Ø£ €§¼~·,­ ‘J”4<Ðd{E¹ÐE`÷Þé$dšù΄K¼xà\mÔÀ ÈGqG48áŒ$8XtÞ‘{@7©–ÄuUqØéVöݲÚ.œÈžòÈiõÇÆ5ƒü~$W6ÜøQ ¨µE¾h–ü*þAºaà ÖÜfTÀ_š€=ƒ2ÐcqÌbͯ°L2Ë¢àÓ–ÞX$…žÉÙ…Þo¤H½¥CûnÑ".Éyö¨;6Z¼é¤¯±”]¼#Ö6ì¢7ð}syÍߢ< “çÁïíš›ÈÜŒ…)qßËQ¡¡mÉñpùµ6dÚ¨Å<@ò'ØèïÞ˜¼$päl¶¶-„ÞJRY¦qÀüÝă÷fÏÓí…b6xEƒ$ž:™îžrî)ëhO¥; MÁàHÑzA~ÏVé¦ÜK4¡Œ ¯Û ÌÈŸdt“ êæ ·‰‰WøÉ ¥W°d6X›“ !m8Òè¯G–´M£q4—K¤r)"ï)½Ç°ÛÈLº³–èÇþ½{ˆú þþ…èøÎ“ñ5) î àã-û|Ë-‰wÂètþr!lÔD (U¶pÏ7æ¢X*pðÀ|…‡õ£ä‡’¦à¸¥š™l°hùã(cÇ"vÁ‡D‰iî–Τ 1:þþÐ~&¼áŒd¿ddJLd6IŠS”8gÁ÷6ŠQ‚/&Ó9ì¤ö¢â'ÒÇÔÆ–Ws\òb5ßžÌV;ktaúE`H*gʇ©;5V5Úk4S“{ŒãC}óÕ,é ºGņ“”5l¹T’®ao¯èüñÓÊŒßs8à£Ã>fœ Þ88ÆÇ’Ýàù,üÌMH;NK+d{«¿Í 6á9ðò…Ñ%ÅË÷4ºÎ¹Ó-6í®³·l¿ÎgìüùÏ÷`äøØuÈ^!‹½o{1ƒ;[gJ-0¤6œÓÈÔ5í7)e83S¨è&qŽTÊ%iYÍ4ƒJê×CJÆ£’/va é¸;ã4› §€¯q 瘰¬m°ì1î\x`Ñ8¹æGåOe ³ò›ÙMÆ™ovp¨¢n‹ü@.þøøn~Cwç§{°N“8‘Àu=?P€¬ÂÌ!E ¨ ʰkÀ¬â+ŽÌ%›ÉÊÙH r¸x<¢%˜: E ”Z2o™þK@ =oXƒ½\”`doxÑžÊpƒî;¨RJ àƒL­õè3y/•K´Ù`P[ã$óF7ÍW]$¬ùw¡à‹iJžZ—]wÛö'‡™&b½Y0íçšEóÜ÷ôdDqð×cQSJñ¬.—:’ºþÂUZUÏ,—:­´*ƒu¯<n#\$Oü"yœWa]Öh÷úÛR!=ˤLdÆÝè.^H!{-vz4pÔ »TI˜UUýµMê°Î‹LfÜ«u×ó¡¥Ê|íJ* ò4€Ía2Üäâx‰~Qq¦Š0úþÀÞ Ü‡Q]ÄLJ½¦³)*9›¢î]]¢½ö”eÀµž,™C}âÜ0¶‹C¶ ÃåÔç5…+ÍŸí_Ýd„º\‹«ž(|z¤¼Q´²Ä=—jbã÷Ÿ^Nr½ BŠÞÝæ‰•4©l‰é@CJ\Ù—~犨\™ÆÝ¥>!„é„B®¿ÀÏÉ’SÁo·Z2©³å¤zþ´bíÆž=­À‡ŸÔ-?µù0!ߟ>zÅI–UYŸ%E½¾ F½‡/7í›ÇowÇvJŽ€Æ˜ýß_¿æ  wxõ¸9e%ɳ0Óò˜•gopnÚsVŽ|,g-ÄG¬ØTTÍÙŸà߸SÃüŽ"u‘”ïzç2“,°I…Ù>KDï$ÝÐãÉ#ålã¡„à< “ˆœÔ¿…ùô¨i½nC—0ÊiфѠ!±uñí\ú'Ï”9õqõŠŠD‡v- ÅIéßÞFžÎ¦Zâ pN¾©G^LÖ?M+4ëXtv¾Uù–K•¿’!ª£„ÞPUGò7%UeÉFžÜÕô…—0EûŸ3{ÿÐx—~1v,!=ϨCu|øÍÂ4+û[„E•°op4¢˜åÛ¸ã¤â[©«Q,ó¥ð9›˜W‹Ææ5§h’zÛÐKtüBôG*èÓco·—=ýw•GxJaXK·:=g 2æÞ‹;éiä_²uºàqоX§¾•¼KH¾Wf\(}´·D¿ð”QðvKás -¹t`™ ý(‰ÜªÁ±Óã@ŠÁhøsNH%/0JÀ<Á˜š¤«¬L|Cr÷ê‹à=5ÝËjòŽ*¿Ei´BqÉBY©ÅÃù´Ófàyqæ%þ«îÙS¸¤wd£ã¾®‚Ÿ1lm%{Zþù´ÖÆð翺©AÄÂoÜíË|¦Þšjü0xzuŸéÑ‹¶¨ô¢ö^¬x³½à„F~qÐM;òÓ b”[ß)ÇÆéã/—"ß·O^(§'o)ºÜv;®¯ü¶ѻÂ7Ìy.¡W§ù*û8aO^$³¥ï³”ÞÒ>>ç…¸fg´Ô— ë%¡&Þy×  â£ƒL" Ç+¶¯¬E°S×UrRìIÿ8( ï¡D ÆwÞ›€ÞYÚd÷QR’Ø7ñßVØ^kåþ -cù%ïþçR^S"/ ðì6LeAè“7;š’VÐ!H¼ª*)È'œÍÄa'õç±n~#‘hšdt¤éq0‘@åãq ï»½T,«\D_øx¶(ÅÕ# k'…#LqU²×%ÿ ’Rü¤Šúi/pÏÛw“Qú£ ]a¡ƒ}‡¦ ¸½êd¼oîÇ…ãå{ÂÀ/C;"â‚ó^ VͤG2x’€;O æ!‚u-#dwð»ør„ó;œLg³ œÓ*i‘¼ðË/[ö‘2Å›é‰ÒrûÄK.Û?Û¢'Ëœæ,FŽiãf#áèø¼¼˜qloºµ¼ð5h>n- b;l}õü‡˜«þaÁ›« endstream endobj 91 0 obj << /Type /Page /Contents 92 0 R /Resources 90 0 R /MediaBox [0 0 612 792] /Parent 78 0 R /Annots [ 95 0 R ] >> endobj 95 0 obj << /Type /Annot /Border [0 0 0] /Rect [122.7879 260.9828 254.5137 270.9828] /Subtype /Link /A << /S /URI /URI (http://www.geomview.org) >> >> endobj 93 0 obj << /D [91 0 R /XYZ 90 720 null] >> endobj 94 0 obj << /D [91 0 R /XYZ 90 720 null] >> endobj 96 0 obj << /D [91 0 R /XYZ 90 221.8595 null] >> endobj 90 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 99 0 obj << /Length 915 /Filter /FlateDecode >> stream xÚ…UÛŽÛ6}߯Pß(`¥Š"©Ëk7i€¢A¬“Èæ+Ë^6–èJrœE€|{çB)Ú]…‹CÎåÌ™RFüdTgQ©TZ벌šî* ÛŸ¯dX% ‘¬U~Ù\ýü«‘‘ÌÒ:«e´Ù=q²Ù~·§XŠã1NòRøaj·q¢”ï`÷`§`Ñʼn#¨ÔºÐBñ§ÍoW¯7K\“çÿ‡ U^B+óH–i.ЊJ§Ri !.%\¥ï€ÇNðк‘<Ï8ÈëÔÉ ¾i}Cr_µ˜É9Nt©„Lk^`ò•ðDÁ¶Å=-¾ñQÛ±xÛÁõðß`ȧ:3*ÊSSUè.ËBF9äLg9tà<;ýÆ>ßÝÁ(å"Ä%€_g¤Íi²X€ ‚Þ?X6{ ©ì»9¥’µ} ‰MÁd˜UB™HcÒB–V*•&ã,RY s]qt7ØÚÎb/èZxn›¢6¤é‘'ë‚ÒØ2–ï5yån×Öó÷}ï0éÊB¼¹$m3G¾Ë¤nž&u *…¹\^tù’É¿‘lμ ÌwäýŠCP£%~Ђý tƒîAÞŸgt=ŸÜe&»yÜŸÉ6;Ñ$±Æ‰‡ —–±¤nfœ¹¡ˆ”è̲¹„l=oáä‘‹2çÙ}à£÷X7çAÖÄÐàûäiò\önUv0ªÔÒs$`ÀJ‹·®üèw‹bŒ~ ÿ ‰XPGSâUKNì.¦Æì{»µÝ¾D/o(4V1¶gÞmxóèfú*š\ñvi¶?nà_—’‚¼¢yøQ*„­£ÔÇZåÂâtÚái€ËÕü(9#¢é]6ì]¦²Xk@÷=6Y&üÜßk–V]Š~æƒùöe‰KáˆUÚØGæ-ÀÛ\(˜Á}Æ?ò1—XiìiÄQRY%vïÓä7ãË¿Ü~ûuOØõ8£Êˆ[’±e_„üeS7¾—[¯4Úe¢¸ExgG—Úƒý‰c|ˆ¡²íßöù{£¡ÃT¡L÷kZåµÂÞ:^=:‹^²V¼ð(¾tˆD}¼ñœ#¢v÷ؾ½ûO×|…ªb°&øh÷-¿¢ÒäϱK%ÓJVydJ¸~Ëê¿ÌE/Y+^ÀþÒ!b¸fG~ PÐb;_W§3þ cY endstream endobj 98 0 obj << /Type /Page /Contents 99 0 R /Resources 97 0 R /MediaBox [0 0 612 792] /Parent 78 0 R /Annots [ 102 0 R 103 0 R ] >> endobj 102 0 obj << /Type /Annot /Border [0 0 0] /Rect [451.3635 586.1021 522 597.0111] /Subtype /Link /A << /S /GoTo /D (Contributing) >> >> endobj 103 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 573.5574 131.8182 583.2544] /Subtype /Link /A << /S /GoTo /D (Contributing) >> >> endobj 100 0 obj << /D [98 0 R /XYZ 90 720 null] >> endobj 101 0 obj << /D [98 0 R /XYZ 90 720 null] >> endobj 97 0 obj << /Font << /F51 9 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 107 0 obj << /Length 723 /Filter /FlateDecode >> stream xÚÅUMoÛ0 ½çWøˆ5}Ù’ÐeØe=ä¶ö :n`,±2'n·Ë~ûHQÎG[`ÛiÈAI“ŽÌüdV‹ÌjÍkcmÖìf"™¿Ídz* ¢¸ ù°š½ûXÊL ^‹Zf«Ç«$«õWö)äʱç¼ÐÚ°cÀS³Û!—,ôa„£oZrÞIm–mØåʲ§<`—ìÍy¡L¥“6¿_}žÝ¬NJ¥þC^£¶*“–+Yš„ºr†C©rB åµM¨á¼2à ²­Î!˜ \ù’`N9.C,ð>/Œ0lïø­GŠžO¶9Ø–±wä]û`´fk®>t»X ÑOØ@¦ªš©ëLñÒ9aGè”@r/|ÝÖ?`eÊA54ÛŸÚ;ûæ›Ô^{~b» °«SWð*–(”¼RUVHÍe)ˆ8È¡Hdmj6,qHP+öåÆúE}ÃЦûžd‡pF$)RÓù¥xC{äHäJ‚9‘ö˜ðÅø0:êýGì@ëJý5ÇG·Àäšu¬{DÈ`zÎÓOßÄ—;kä5YM·ökê7¬÷´~‘‡iîi.觹טÉýóØ9©$ÒYÀQÁ:Õ´Nˈ(ˆÆ'•,¹TNO±†6c»‰c´ 4¼Çƒµ‘C˜¬4—-¤Ç;Nœ>RÚ5“Ä–zêífì×wÒ¿ÑЭuD„}ƒ•ˆ°WD,Œa±ðTì¤-3i ñæŽ.}ýZãDWYsø]v)D®p— xµEÑÇB:ý›0){òE!lè‹Az[²¿-…4ÒæÚµh,ëÉ'U‹_’ö±Úæéˆv`ǹ+ãî5§4Ów+^ÎrÿYÆøó£´ endstream endobj 106 0 obj << /Type /Page /Contents 107 0 R /Resources 105 0 R /MediaBox [0 0 612 792] /Parent 78 0 R >> endobj 108 0 obj << /D [106 0 R /XYZ 90 720 null] >> endobj 109 0 obj << /D [106 0 R /XYZ 90 720 null] >> endobj 105 0 obj << /Font << /F51 9 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 112 0 obj << /Length 3261 /Filter /FlateDecode >> stream xÚ•ˎܸñ£p+¢H½r[Îf,v±1r‰³§EÏÐiµÚ’zÖëC¾=õ"%uküÀÄ&‹Å*Ö»8ê.ƒ?u×dw•ÖicªêîнÈdú¿/”Œö±_‚¼zûâ/+ÔÊÒ&kÔÝÛ÷+$oÛ'¯íy§’Éíö*v{­u¢þºÛc’_žvy¸áÉü±ÛçɲDÕ»ÿ¼ýÇ‹7oãáEž<¹¥¯ÊïT•æª0B_Y›TiS}j·/ÊIÑ9Ó°"ˆ¸æî ¯Ó Î ¿ÉU‘œØäOÜÚ#Oö÷ˆ=ùðMCL÷P&-Lô û#Aô®>y‡7aêä]–멈4„êhœ;,Ž(Gô#/ðצ?Xžx"%ƒÇS]R&ï{dæä^Fk_ÂJ]%g‰u~ò'\èñ†ðJ”NU‘ñ•úr1 ý0*ƒ‹ÙåMT¸ )^.ýý ­›ìñ1p3òäd½Œ=ßÿbrä4œË@ÀkO~üß®U²ýK¼"“°¶áö£\{,XlùÐB©d1ìz_³W\—ĵ=ƒL`ù÷p•®æà²uÜ8ƒˆÎD‹ÞÞ&OAEë»<-êšo”$„k 9U_¬ùƒw##¼G’Í£qÝè0mé¼ÑwüS.m²–‰D¾I—ïu*‰êXÁÅÁ>X¶Õ­`ïx3²Cç8+˜?^,Þ÷Ç‹ˆ…}£Óº)›µÎœ%ñYÀÑð•=;poÚDw¤ì8# ¢žA˺põ“¬¯±’tà׬8Û_ø;*²èÁ¶²(ÊŠCV&7¦,ŽÇ[%¸—†ÝËXVL‰=µFš+K¤Ûº¬Q2磓]^FºJ€Y:L­›•ã–ÙLpÛ…ïhgÔ;{ôŸ/ÁÎíDOm8#Ú."Ë`IFŽ‚ŸÐàs:bÝŸñÌ#1S]KQ%¨tÄãµD 7‡Xƒ¼Å†Ë­Iºi@˜%ìï¹t–'Ÿvà¥íà]ôŒ`˹±sd¢%ĪdªTh>ÂìEô ˜2ºÞ¶$t¨+ÁánVÈîlÙ„%@à$S„a²aWù à T™,†›qwÊý–KsŸøºÎä0_F¥G[Ša (°†nO/ Q‚_ Ä›!ØÕe € ¶zpÕ=GÑ`Õ4?oiÿÚÕZNŒôäA”3=³eA CùYÌ=r3 £ãmby·,1ÛA|;àÛö¥ƒN²@GícÐ!:‡ø%,]Ç¢ÆöÏ[áÉ/¬·&FC@Õ&c™À·¿Lƒhü¢ÛïK à³yàˆÆ) JÖGð={ ÂþÉŬc²a…¶z²çË ùQœœ%VÝtLi’׳ëBÒ)ÃóÐï·ìRÈ6ªÂ˜íßeÊd￸äax4ºJdÕw3{( œ<õø-cò4{%\ /úFüi`•Ÿi€}—él‡©ï¥<—I~/^PàÍo1é¼4S™mƒÄu‚G6ðòaÊ™ÊDÏNPQ ç;Ùà $Ñ\ñ™Ü#™Þ¬äÍf™7CÆš\à Y‘Û†«o/GÑt.Ñ}šåŸLÂV ^ë´0µLìö²rH+ªµ ûyv.(öË‘ ª¡cB¢p “k¿E‰R6g H¤„¯$„ܲíòÌ4«ჭ/Ã1.=>¨Å@È\ªÍ¤‹Ò1E¹øöMÈ/ñ¨£B-A6T‰èG]ÉÁo‘qÆ8‰Sv<¯]â!.µacI6dw¸ñó•~/Ô#/8;Ë)x"œjQárCzáYm@Bž0K^¬Œs}/\æå±"غ¯¦?ì=sÍ¢Ês q=H¥À`Èc‰ i’6’:ùCðu9ǪܬS@DǨÆXFãñ”Å’« *—ëH~—]pÿ¶[ÄÇ€Npr:ƒEö<ËÀn]ÕœSÂJNÕ±§<£l8®îûÖrV6Uݤr87bˆ€q[Ùø¦éàÚ䤲L¸ÈR ´ ©ŸÈFgff¿Õ»s–P ýÂ-ùÌ~Øb™Ó;sie’náZ(³í„؉~ä›™‡ZJé°ˆñ²'U@"|=H]f,¨XXŠuÓp2jÐlŸ.J¨!ËŠËÌú e&¯ù©c$3k"úCP<ò¿º¨ÒªèÕ½¡, nñŸÐs“³£‡¹¯8EÞÆ_r†ë²eKªä*àþêg|içlæsÒá%%D¤”ROœ9ð)"Zá Ut#…Fº-œb™¢ßꓤèœ[-ºh!baÁÀŸIòâ&­LU|së`šõvE $þ³…Sâ¯ê¸6Æ §Š˜òbË Ltã0¸§JíÒ/x‘Â,\ý\2Ô’Öð‹¦\ëå¨7Ãf¾Q§9D‡gÓ ’u4Ö,£Òižëje4`59ö—µÇvu·±*ïPõùsbªeŸÃóAfö30t#Ôœ³þl¤¹XÒ¬š*ÕYˆ&ÂPXÓð'nSÉëe 6“«*UeÒ´¹¾Aúb÷ tÞæÒmR§TZ* î±?I c`8ÔkaÿdÚÁm‘™iÓ”!l)þ–WMNRË+s‚½ž‚ª/œ§'/›UxΛ 9Ÿbˆ–ÎEçbEË‚d%$¿€ã•–9¨ŽÙÉáe“^”“?ÈVNÛöѵ[m/‡ ‡Oí¼éCC,øc„4æ¬Ü.t–Ý„gijî:ÃÄ¡÷#ºoÜpêyÎÑO®}³¬?úE§ó~eÅGOZ C90â¤{;Û¥öoõ)èè÷‹üO’¬!r/Í»ûY]è ’k‚ÑI¼ö¯Î¤É7X?ŽžêJ{êŸïElúƒ¼n"û'ªéj¯óÆãäÏÁýçMvÕÚÂê09Ï9-á‹9é\°´´ ÖüœÔŠZžÚ ÐW "‚Ë©×Ù‘ Vz0›m‡ð¤R2ã°oîúÓªA]ÃÉ‚âI¦¹?‹³K«Ý©¹éKg*VqôLžÞ2¸+_Ïí©eWÞ ¹ï²"óqúHf*ÏLMuþ´ar/7d–ÿ} q6x¢« Ìuúˆnð6úV F Ôè8{8xÊ-µ[pŸ„n=2…SÀwrçÆ ì¿\¥€™‚м,¿9ä@}d\­°ð´.»ÀãœïOã$o ¡éÝNȳ<-u]]¹7*½‹kIó?^æ>}mæ·”‚*`¾ÌÞl’þø¨_kò*øû¦…Ë(~[}3À‰÷þöÓ+üù’1XùH‹i#µ‹ÇTÁ‡YþϺ¸nbgër!Ä;óK¡ª³¤¿ —{ŠóYÔåBß2àü€A¾érÜ®6²õQé'ÙšØO?7H_ [–_o» R—8²]V&n?ÙÕzÕ áÅuZÑÊóŧF O¡…Ž~‰§]ºyÝ?o¾àçÁÇKx]›$€IrøHœ?P¿%:\âW§9L† Â< Å›#Ï}yÞŒOêYôãõð eÂJ“ŸÜl,C×àÒ®ñÇe£Y_=Ü=.º5yÒ´—) uV\®p¿Œ¨òÇEºãjÄj~Ç/¿Vp œÇƒ¤-ìÇë0Tê«YÇÝáeœÜפ‰R=÷ìªKà*ËÌ7[’¼»†)ø¾r”ûðÒ©K“j5Èúå¥ÂŽ5ºãnò!¿ì¶J]C€þt˜þ_ TWl*ña£ÅN0'̳äï@•¼MqyQ§úvn­ Ô_e%eþl㠡僀C.Éd¨B¥5–ßJG»°nCתŠë? ÇN|‡ð3ò˜Dßíw°R^Nsò9@]Wÿu¨ó#j:`ÕaOã2ÄÐV@«Ç÷RI ‘_x"< ã³ú4øÏnö÷W¡Ã|2؆ráWt ËB1tºBç2Ñ{?­^ÝìÀLb@uüý–ŒôóöÇ]Ó©ùž èÙèžIB`½PøA¹.ÜûüäïÛ+$Ù9n`aeÒò68Xùϸ•íg–ÿ‹0¸÷.&˜ EAcB=ÁY³míæÓåˆÖÕ–EiL9þ“ùIœwŸT^§uQ}¯5Ú‡UkÅòË™¬q#Òy´%%%EEZ—¯“'ê YåÇÀ*ù™®G'ÉWŒ<–—]4E !D]IFBõÏ–Ïiø±ÿžZ endstream endobj 111 0 obj << /Type /Page /Contents 112 0 R /Resources 110 0 R /MediaBox [0 0 612 792] /Parent 118 0 R >> endobj 113 0 obj << /D [111 0 R /XYZ 90 720 null] >> endobj 114 0 obj << /D [111 0 R /XYZ 90 720 null] >> endobj 110 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F54 117 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 119 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/initial.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 120 0 R /BBox [0.00000000 0.00000000 488.00000000 237.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 121 0 R >>/XObject << /R8 122 0 R >>>> /Length 123 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`bi`ªg62¶4Ð3QÐ54Ò3·4³TÐ5Õ3´´42‡¨·PpÉç BŽ > endobj 121 0 obj << /Type /ExtGState /OPM 1 >> endobj 122 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 1022 /Height 498 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 1022 /Colors 3 >> /Length 21550 >> stream xœíÝ¿ª$IzþñXÉ—!§1ú ¦Á04¬c¬±ÍÂÐmè º1æ\\íÎÀ"k¬11Žü1väj¯@ _1ñëÜì̈7߈Œ?oD|?FQ'++3êTå9O>••õ³ÿû¿ÿsf÷3¢?°¢?°¢?°¢? ®Ÿýìg½‡KÛ?ÑP×#úÿû¿ÿ{%ÿîw¿ûöÛo¿þúë €jÿ{,ÿ«¯¾"ú˜sm©ÿ8¶èÿøôË_þ²àåãÿåc±Û¿ÌâËç’K.¹¬}YûïØcù¿ÿýï‰þ¦µrÇ\{„¿û¸=RòÏÈö¨ì¶Ç[|ÉÐF½¿c%ÿíßþ-­?€™­Ü17n2ž‘‚O´çÿe’ûŒ«êß1Z“[¼cnÙ)ž¿.¹ä’K.ë]îÿÞÒú˜ÙâsÕ~[¨õ·ð‘K.¹ärÖË}óõ-­?€¹Ñ1Wú/⯗jýË©óüÀÒ‚o‰þ¦EÇܬ=ºóŒ<–SéÓØ°¬7oÞÿÞýL‹Ž¹ ¹=RŠ=#¥>í×Òý3Ö\rÉ%—y—¿`¿üéOÙý¥ùè¿M¡õ0?:æR.Û#%áùÝíÏ$|kþÓ¦ôm¹s*”ú;¶ÿgû»Mô0›Å;f×°=*õŒÜyº þ÷¥o?œI¹È_žóß1ý;Õû9÷­ ­?€UŒØ1Ú)Õ{Fnþ÷ÝÿË´|H˜ÛW?‰Ýzg±‡Ka¶Æn®ºãȱ‚R·ƒÇbÛûÁ~6¿ZË®c·=R2øŒlô2øv§ èõ–# «úw;{9´þ–3\Çúï÷"ˆþP–þþÝÚm"ÑÀÌbóo~ó›~ƒÒ«W¯äöH)øé Gë¥m­?gø°ŠXÇLôOòüüüOÿôOr{¤üô­?·oý9À%Ä:fýÿë¿þ«ãØFñ/ÿò/Ký]óú;Z(ÖÀrb3Ñ_oý+ןÖŠ£õ°Mëÿúõë~Ôî~t¤­?ŒˆÖÀr4­Çèÿüüüöí[Íœí¹ÖFDë`9úÖ¿ýÁ?>R'EÿfƒÜÖFDë`9úÖŸè¿‹þ´þ0 ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°œ;­ÿÓÓÓËËËy™±éš[÷îDÿÇZö·*רG룣õ°œ;­¿×‡Tœ˜çfôßA¿¿‘16Z­?€åÜlýÝUôßÚ÷ýÝ_v FÿÔب΃9Ïy­?ŒˆÖÀrn¶þ>.Ÿô>Üïo:\q"u°•¯ýc£:&8çyl´þ0"Z˹¬¿ýÏ3¯8Ñ_9ñ<6Z­?€åÜoýÝUÙ¿Í?bôß/ÖfBë`9EÎð‹þ—üØþ±ÓúÀèhý,§Hë»n'úßêy´þ0:ZË)u^ế²½-Ð,úïo ž†È…Î;$Œ?66Z­?€åðm¾yhý`t´þ–s§õ¯mÄèO룠õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°Zÿ<´þ0:ZË¡õÏC룣õ°}ëÿüüÜe„IÑ¿ñ iý`\´þ–£lý{å~—ýÛ’ÖÆEë`9šÖ2Z­?€åhZÈhý`D´þ–Cë­?ŒˆÖÀrhýï£õ€ÑúX­ÿ}´þ0"ZË¡õ¿ÖFDë`9í[ÿ§§§óÄ———²«(»@­?ŒˆÖÀr:¶þõzÇèO룠õ°œŽÇúŸúö†À6ÝϳÍégØO9ßë¼Úhý`D´þ–c§õ?¤ùCÖ¿œx˜Ö £õ°S­ÿù¦`²¿œcý—hý,ÇNëï>þ°>úï—Ð=úÓúÀ(hý,ÇNë¯/õc3Ä–\­?ŒˆÖÀrì´þIÇó8ŽõÜCë`9vZ÷ñÉyçöÙÏ ŸáÇ}¼oЭ?ŒˆÖÀrý6߯½¾ŒÖFDë`9[ÿT±ãþ»£õ€ÑúXÎX­û¯ëÒ õ€ÑúXÎ@­¿Y´þ0"ZË«õ·‰ÖFDë`9´þ÷ÑúÀˆhý,‡Öÿ>ZQBëÿøÓÜoœpM™85­¿¶8xûö­¿Bë#Jhý·?ÍÅù}ޝ¿þºÆÂXðþýûÇe½ÍüñgD_6kZ¢ÿÙ»wï¶·Dhý`Di­ÿ¶—àç.uéÛ-_>—\riárÛÃ/¾dÿ§#5ú;Eë¿•ÜxýúµÛ Eë#JnýÿkKÙg‚²K`Á~¿Æfž”8õ­?Ñ#DÿÃo’ÖÌÊlý‹ÃGr?0±z›yjâ¤õÏ@ëÈoý·V†K.¹ä²ËåþoÙ·´þ•ÑúÀnµþþ÷sÉ%—k^ú¿By‰“Ö?­?Lànëÿø_ÛcØVw'qÒúg õ€ Ümýÿk+ñbÞ¼ys'qÒúg õ€ hýKñÓ¯¥ûù¹ä’Ëý¥ûé kÛæþ/Oð/—ìNëÿôôôòò"_—çÔß½Z˜@™Öÿw·OÙñ-gøL*¸m~[è¾û¿ëìÿßlý÷5iÒÅÃ\ö¥}öóìÅæ×;/$ö0•«kÿ»ÕüÞ.¬r`ú[3QÒªrÙú_þ*¶å¸‰ZÿÑúÀÊ·þ©#xÜå~ë¯Icwâév—sÊÔGØýBÎÓóÈ¿ åðô ¬ñ»U.Sž¢_ˆæ^Â#©fÕÃÑ´þÂç¥Ñú‹Ö&På ?Iqç«M^ö~ògÒåáq%­Qžóy-IË-¶ÁïV9ÈØ˜ÏOJÙ‡“wS©§Ø‚Ëmóü Œ-ÇÑúŒÖ&0ê~Ü)pì3D,‹¯ëÓÛå!ÕÈ…Êñh†\òv½öïV^ŽüKÓü2/ŸaØÊå%Œ‹3üý7´þ0QÏ븉¶eœ×?áANÖ&0pëÅ‘û õ'úohý`´þ¹¿™Å[ÿwïÞ%<ÈÐúÀÐhýD5hýõwoßú“ûÏhý3<þÑö€þþïÿ¾÷  õ ©Úú{ʀƭ?d´þz[ô?ç†ÇM‰þ²ù¸ü‰°1 ›ðˆhýDÕný³—Ó õ‡ŒÖ_o çT!Ü ™¥6Ò2­¿¿óÖÓä]>2Áû÷ïï,K.¹¬qYjÛtö"î/‡Ö¿;Z½}b8¤á&m¬¶…¦µþ_ýôÍ»9üÿ¿ö«_Ç{ÓöO€)·ÍR‹¢õïŽÖ_O&¦ÉÀ(Ü<ÓZÿ/¾øbgÿ¿¶Ý`àÿ—ëýû÷Ûã­ÿÓÓÓvýåå%ãî÷ª‡Ö_/é‚iâ`ßšÛfαþžŸÛ}èÉ ™W¯^m¹¶‰oÞ¼1Ûú‚{FŽ·ý­¿(öÁAá3…s$ À²e7ÌäcýýõsOmëDצõ?œÎÛýdñcUck ÎYv »-ë|±)—ߪöÐOÓšhý õ×»&HÿÝ¥f}{mdo8ëDÿF­,fUþÊžÇps03åU?Jh- £Ò øò$‰°ŒÖßZ½›a‚ôß^Ù¸Ãn@%w6™u¢¿kÖúë3YÑ¿Ô`Æþe5ŒþN³Ö߯goß¾u´þ)î‡ Òmâ~ »¥ÜÜXÖ‰þ[ÿ؉ð’\²-ÿ0†ûG¼h;=Ÿ<³<ýæÈ/¿{èÎØä™SÛK‘_E‡ñ_¾äJ½PJ³ÖŸèôîÝ»ýï‡Ö_£H˜ˆôsš8Ò^߬/cO OpsHúJìu¢¿ëÛú¶qgµA6¸Šâü\®H9³þúý‘»Ð/¼ÔØ‚3¤ŽPý«þæÑKãÖß7Üð^¿~í>þýÐúk ÷“Íâ,Çýv4Jí¯ýÛµþ‡)±´}HuÙY6¶Fa5¢lEî”#/G%O.${ü‡á)Ÿ”¤±å 5ö6‘òU$ßK9½4ný‰þ{±èïhýEeÃÿ$1ëËØ8+¸Q¬ýÍÖ¯Òá+òªF?à'¸ÃòkGÿýõD3¶Ã¢?’ÐúwD럧x˜ ýËæ‹û1ì¸Ò›Ã:Ñßܱþ¥–ñè¿MqWñúòWw9±Þ9¼?Ðæ‰Ãê²Ó<Ñ8´þÑúç©&HÿëÄý˜5wŠoëDg°õ_'úkfVFÿsÎvöØäéDÜDëß­žJabñôOÖ—­°'PcX'ú[lýÝDóM  ±Qé¯ßŒþîã ÿþxc Î:H!Žk~™I¿y¢¿)´þÑúç©&V;íq?Ï”»•>ò¾NôwÖZ÷!~y7ƒìÁy/‘o.²×!dÇýö·ž§»ø/$8ýÎȃSŽ-îƒc;/$ixšè/¬+¸›-ÑßZÿŽhýóÔ± 4AL!ë×0Áž@½×ü:Ñ¿QëK–“¥å±aÝ[ÿJÂÛ­žab¦ôOÜoiÄÝ€ª¯öu¢¿kÓúã’åÿ–džutoý‰þ´þ©Ú„‰¡Ó?qß‚!vj¿Î׉þ´þVXþ÷oylXGßÖ?xÞyÊKè«å„ƒý‚ÇÑD럧Y˜(ý“õí3¸'Ðà¾Nôw Zÿàa÷^¥ÿvÂë­ô¼^ãÿË÷zýÆRÉãÜØ0 2Õúk>2®ÿ ¹ýW,­ž–aÂrú'îËÂn@›×ö:ÑŸÖÀÌë/Ÿ¼ër†¡£¿£õ5ÖÒ?‰&½öš½ª×‰þŽcý ÁTëïB'†R¾- ÜË,Zÿ<íÃDð‡÷Ï{˜Ü?ŸÆé¿ñ‹yèOë` ¦Z}©›!¸X³hýóô ê¢ÿ|ZFÿö¯áu¢¿£õ0S­Òñ<Žcýãhý[®ºY‚!÷ϪMúïòê]'úÓúƒ…Öß‰ß <"H>ÃÏy±6Ñúçé&z¥rÿÜj§ÿ^¯Ûu¢¿£õ0„î­¶!z}­žîa¢KŠ"úÏ­jôïønU÷­µb­ÿóós‡áXRÇÖ?Iìè AÑúç±&g)rÿ *¥ÿ¾G©YØZk+Óú“û´4Pë?Ê×uiÐúç1&bgJ)>rÿ:Чÿó ²ñ™©Œl­Uký ™W¯^ ÑúO†Ö?©0ŒVÇ@î_MÁô_ûÅ™7†Žƒ©¤Ø±þÐÆóóó@­ÿLhýóX ¾F­äóÏ?¯·pôÝwßÕ[x—­ÃÔÖZgø0’îgøY­ka¢Þ±ÔTþkº_ü[øŠË•Nýgø0„qÏð3Zÿ<ÖÂDl¥7Cî_Ùô_éYv0½ÆS­?€‘ÐúwDëŸÇZ˜Çãr² ú¯,/ú˯7ƒ[ÇLÑßÑúøÌ×Ñö†Ö¿#Zÿ<ÖÂÄåJ3FEîGjú¯ñ:¼ÏÚÖZ­?€k}£ÿóóóÁiý;¢õÏc-LhVšôQ`>Ú /é#¿š¡©­c²èïhýö™¯±C§õïˆÖ?µ0¡ŒþúQùÃÓÿÅ_„¥XÛZk õpÍfô§õoŒÖ?µ0Q6u‘û±§LÿDÿŽhý\³ý­[´þy¬…‰‚©‹Ü3Mú'úwDëàšÍèOëß­ka‚誈þÆÕmýýÿ†¹‘ °›ÑßÑú·EëŸÇZ˜(•ºÈýˆ¹LÿDÿŽê¶þÓGÿwïÞñvV`3úÓú7FëŸÇZ˜(’ºÈýÉéŸèßQ‹ÖÖÿÃИÍèïê·þÝûòip´þ©¬… ¢? ú›Õ¢õ'ú×ðôôtžøòòÒ~$µmtÊG7ŠØ«ýñ윟—mbðVazPÇÖŸÜDëŸÊZ˜¸ŸºÈýÐÒ?Ñ¿#Zÿ|½¢0ôïM‘mFÿ¼Qž»ŒGÔë·a3ú»š­ÿ¦ï×™mƒ12Œ ­¿žµ0q3u‘û¡KÿDÿŽhýóu‰þ±ìx?Sš5GôvØòv†ˆþ1C´þ›Ž™{ÿ5ÆF†±¡õ׳&ˆþh†èo­¾öÑceª<ŠHý=çÏñŸßû­ÿþñ§»Èƒ2Òú·ïðÀ ã0Ö_ÃZ˜¸“ºÈýHLÿDÿŽhýóuŒþBì³Ù‘Ï!ûó±'EùdYø\ÇÍèï‚þúž‘Ö¿{æ62ŒÃtZ ka";u‘û‘çœþ‰þÑúçküŸ¸Hã«_ˆþ_âf–@"ïù&9 ãL Ü—A­ÿÍÔˆ^Ñ?ï—#G´Œ9/?m,ܽHô¿gñèŸ7sÙWõXÇúk¢ÿá¾´þ›¢¿£õY y©‹Ü;éŸèßQŸÖ_þ_ÒG;(úË­|0”ßœS¾ûýè¯gð9ú§~l—è3ú_>k­ÿ?üÃ?hV‘íÿñý9úùå—U‡ñÍ7߇±¡õ׳&2R¹÷íÓ?Ñ¿£n­?Ñ?U‘èY½O6Q˜r9§,/úß?j‹èß½õ7ý?ùä“ü±Ô0’¢¿£õY DtAô7¢ëï¯>íGô?Ó4å‡:ü²b/XÆ7ôúGÔ1ú¥¾ÔÇþ®ÂÇ|­ÿÜﯔJÿ´þY ©©‹ÜR¶ôOôï¨ëþOô"úß9^èüclºÓÉŽþòaT×[–Í“{Òú{[î÷ФZÿ‚¬…‰¤ÔEîGY>ýý;²ÒúÇnµÌNô—ç”[çàœ ¢¿0ÎËCóõÈ}œéƒÇÞÈ•sL^ô×üZJ­·¬^Ÿ1uCµþûÌ}ˆãz#FZ™µ0¡O]ä~ÔðHÿDÿŽL´þD ¢ÿèïNq_Ø ÐÈ~:òrç.EØŒþ¦ZÿsàÎKÿ©Ñ?¸–ûéŸÖ¿ ka‚辈þ}Ñúç3{^ýa<òå›,Dÿ¤ãò…ƒ|R+ÿ¤1ýo¥õïý«Þë_äó¾´þY ÊÔõù矷ôÝwßý{¡õÏgüÛ|ùèíÍU .?Ú›´´Ô1ýo¢õÃÔÇ|­¿ÈZ˜Ð¬”¾µ¿çëÀÚÖ1Yôw´þ:FI~—7¯P¯118`yžŒw‚kiý/Gűþ2Zÿà0LEZ™µ0Aô‡Dÿ^hýóu CÊ+Üš:1éSªW¿?KóšsÅ$í*hä½Câ²~«E|“Íèoªõwý>æëzGGë/²&.WJîGrú·¶uLýßæ›¡W’?äûЪp¯XVÎÖ%ú ã .§oôF›:¢¿ÙÖÿ&Ù ~ÄèOë/³&ä•’ûÑ’þ­m“E¾Í7GÇ0ät5ÿå6IŸˆÍÐ+úŸï›GXH³èjÒ}ïø&›ÑßZëŸçð^ÁˆÑßÑú‹¬… ¢?ì ú·×­õ÷WJå°.úF %ÿj~~î5€)[ÿàÇFŒþ´þ2kaBX)¹íÅÒ¿µ­c²èߺõŸÑëx¼Ú;æ~7cëÌèƒFGë/²&b+%÷£—`ú7µuôO }Zÿ9ýöfjýÝ)©ýiýeÖÂÑÖý[¢õÏGôÚ›¦õwðãhýEÖÂDp¥ä~ôuNÿv¶ŽŽã©Ö?ÑhošÖÿ|&PÿE¼#FZ™µ0q^)¹Ò¿‘­£ïxj õÏGôÚ›£õ¾`ÄèïhýEÖÂÑ6ýÛ õÏGôÚ³Ðúûz>û!Èßü5bô§õ—Y ‡•’ûaÇ>ý[Ø:”7…Ö?ÑhÏBë¿}ýVÆø/¿ñwÄèïhýEÖÂÄ~¥ä~X³¥ÿî[‡þ¦±Ðúç#úíiý·[õ;ç“ùg1úÓúˬ… ¢?,#ú×FëŸè´g§õ?ö‚gò‰Í{þQy÷" Ô_O^—èoü¼þµõ­¿^ƒ0AîÏf'÷{¤ÿlEÒÿ:ÑßÑúobÿMý•—Ó‰…ÙÎež‹Ÿ?;µð›†©èž«fc™x»×6³&©»”×Xê]èUw^þe+|¹4×D÷Öÿrb3v¢?­¿Œèo“µÐ¿Ç@¢¿­-«•÷ÙìD ¡cëï²¾úªž¾C¢õ×#úd9÷{¤ÿTD%Zÿbbe0dD$éÕúã€Ö_¯A˜øÃþðgög÷—³û¹ß#ýëýÏÿüϧŸ~z9ëDZÿ2bE@@ôG’^­?hýõÚDÿÇ%éÿÒ(¡€KÜÿ¸$ú+Ñú£3¢?΄?í[ÿׯ_ß|8wlƒ12Œ ­¿^›0Aú¿4bî÷Hÿ‚‚¹ß­ýiýÑ ÑgÊèߦõÛÅÛ·oM cCë¯×2ú;Òȸ¡€3ŸûÑ?EõֿŃÀà|ôï= Øb­õo¿_êé!úwÆa:­¿FãèïHÿ›#÷{¤ÿ½-÷;¢Šº­ßw¨ ÍTëß=sÆa:­¿FûèïHÿÌ”û=Ò¿·ÏýŽèŸ¢nëeÑú÷Æa:­¿F³0Añ¿7_èßc FåïVŠþµZ(‹Ö¿ï0Óiý5ºD·vúŸ;÷{+§ÿJ•¿[)ú;ZCèÞúùå—åMÀ7ß|ã¯ÈÑ¿×06´þz½¢¿[2ý¯ú÷Ü8ä~GôODë`$Ý[ÿ¤ÌýÉ'Ÿèg~øñÇõÑ?uáE†±¡õ×ëýÝbéµÜï-•þϹßýÑúÉX­íèÿ˜?iù~±´þµ ˦ÿ5CÿÞ ;µs¿[)úÓúÃ(­¿Ð>ú_ôm¡RôOÚIȈþŽÖ_Ô=ú»ÙÓ?¹ß›;ýs¿#ú§«ØúsRÙÌž×_ý·¨­‰þ‡„âÑ¿_q9³£õ¯€è_¹oâôOô/¥bë￳ÍÃÀ ü—øö̾Ýy”ÖßS¶þû9ËFÿÃGÊ‘Ðú—e!ú»Ó?¡?f¾€XîwDÿtu[¾¥—x‘LlŸSß·õß'r9úç,ýƒŸ4Ðì-Ðú—Õ8L,’þÉý²™Ò³ÜïVŠþ[Rd¼HfuÈîúèï_ƒ¶þ‡8.DÿØœ¥¢¿ð cÍH´þÙ‰þnŠôOè×›`@ÈýŽèŸ¥Qëÿø÷Ðæñ` ?üðƒOxþErÎ×ùû§|RüùϾŸíW¿úÕ¿þ뿦8õ?Îdë¿×ý€DZþ˜ŠþnðôOîO5tú—s¿#úgiÔúýqFôŸ˜&úo)?8qÄÖÿœÅƒÑ?Ù‡ŽþŽÖ_d-ú»1Ó?¡ÿŽw.s¿#úgi×ú¿¼¼øéOOO€¶Ù¶9cw|LϘ"¯:8sÒB Œþû_µðÔ'­h»{ê³=ÖØl]6µ‰þÎRë/zy67xô§õ—µó¥rÿ}c¥ÿ.¹ß­ý[´þš}˜gÿc^Ð'ú[vŽþ‡Ä¼ýxžît9>¸÷Ø ”§Fÿùv.£¿ø‚ÓmýÏ9àÇÑú‹ˆþ7‘ûK(ýýëiÚúWþþGa —ˆþeGÿà” ì;ÞDôoý™Öÿ²Ëæ9Ì9bô§õ—ÙŒþn„ôOè¯Áþ€&÷;¢®n­ÿ¾ˆÝnJŠþÁbw9wÆû»†ʺ<Ö_ˆþ±‰úybϸ‹t¤yEe,¼ýñH ÈÑËý±›Æjý…¾zå‰8þŽÖ_d6ú;ÛéŸÜ_åô¯ÌýŽèŸ«Oë¿O<‡ë5¢¿°:wÚçAA ¢¿‹ä£m\^?$þ› ™C›èïÌ´þ1Ýøió•^´þ².abèôOèoÃà@ßÜïVŠþ­[ÿXįý“Vwç¨!èÅ¢¬D?Ü=).ŸwbÅÖ"ŒäN»ú-,ý¹?xë@­öÉõƒþŽÖ_d<ú;céŸÜß’©ô¯ÏýŽèC·Ö¿HôwñÄguDÿ6Jµþ±Æy¢P´Êûó¢4óÇöUˆþ®Nôw½[ÿ¼ïÓ ýiýeö£¿³‘þ ý½XØHÊýŽèÃØ­¿#ú¬Í?ÊeÆZüËù÷SÜÕ~Ñÿñt»Ÿ’}ìŽÛ £´þå±ø#FGë/"úkûûêžþ‰þÍÐúý»é{†Ÿ›éüò¢¿‹D!÷»ÄèﺶþyÉ>h¿¨‚Ñ?øžƒfoÖ¿¬^ab ôOî· cú7’ûÝJÑ¿CëïJ|Ì7vÓy9I«‹Í²úž×_Óú+¯ëß"Ð,dš¯ô åXÿË#yô{‡?bôw´þ¢Q¢¿ë‘þ ýÖ´ßHÍýŽèO·óúÒÒùhiw: bvô-VÞÓõý6_å±ûû½ÄËêå±þ±èRög† ðsÉ~ë_$ú³ûˆÑŸÖ_6PôwmÓ?¹ß¦–é?#÷;¢ÿ=&¾ÍW“­Éßó¹<Öß”ùŠùªò¢¿=¸qZÿ˯ñÄ‚{©è/ìœ\î0Ðú—5VôwMÒ?¡ß¾;y¹ßýï±u^Ñ>Dÿ‰ÉÑ_Èô£ë'úË‘½Hô¿ó¦­qÄÍôOîEÕôo0÷»•¢£ÖßO?Ø gúØQÑbm¢ÿˆ­ÿåQ:÷£¿òŒ¢òiý 1ú»:éŸÐ?¢;Ù¹ßýokÔúOuèâeŠþHBë¾IyF ›Ñ?é›bã§õ/‹èï‘ûÇU<ýý;jÔú“êpFôŸ­ÿá&ý™@ïDÿÔo;ÓÑúW0hôwEÓ?¹tÓÿÜïˆþ·µkýƒ§F‰‰nåÆ#-,v–Fè]FÿÃ917±_µpHXÞ³ÃA>Ùhý·›ROÿŸý3r¿ÜK¡õ/¨o˜èžþ ý3¹¿`9÷»Þ[kíZýw0ù+š¯pÒ,³Fz žÊ©äè/Ÿƒß]¥yýó"ÌÉ“›Ößß”ñµ_yÑ?;÷oû*´þ ýݽôOîŸÏô3÷;¢ M[}ŠR~{+ÑhBôßN¢Ÿým¾E¢?²-ÒúËò¾ë75úßý{~´þeý]Vú'ôÏ-cà~îwDÿºµþ‡oMº vÁ)ÛSÜ霡û;©h0ÿÉË´y0Ò(bÑÿœø3vübwÙ®k^!ö<3k‘Ö_—û]ѯôÊCë_ÜÑß%¦rÿ ’Ò‘Üïˆþ%ôiý/”Ïhýcˌͣ†f™dÁ<Áèü݉þy¯žñ<Ó·þõ$EÿJc õ/«{˜hYüúW£Ü¢òw¶Öú´þçwŠDÿà2õ¡ír¥Á²ÎÑ_ó ?ßTäÙ<|Θ'ZoúÖ¿}ôï2Œ ­¿^÷0Ѭø'÷¯é2ýRù;[kÝZÿÑÿp«&¦Ë§Ž!úWÕ>úæÑGÿýÝyº5&ný›‘£¯a¦Óúkt¥¢¿Ó?¹eBú/•ûÑ¿i[Í<±£;b+%ú—ŒþçÙ‚Ÿq·[ÿàtÍ+Ó‘þ&ný›(ú;ZQ÷0Q0ú»Pú'ôÃ;ïÌýŽè_ÈT­ÿÍ`Gôo,é¼þÊ/ÌP$úkV wýý3Dë¿(úÓúË,„‰zéŸÜ½}ú.÷;mÝZ×éc¾±Ö?x>æ[Uvô×TïÙóeg¯!ú ¹ßÑúï ý­¿ÈB˜(ýÝOéŸÐ˜Ç@ÙÜïˆþåt;¯ÿþÈéìÖß…òܶØó<Âñß/W§tt‘Cƒ‚ÙŠ›o𾇉Á…Ä^!ëŸ-ýþóŸËwüÕ¯~åhý2Pô§õ—YÅ£ÿßýÝß•] &³* ¢)&¾ÍW“žIØó¹ŒþW›èß²õ—߬¨çý»cCë¯g!LþŽô¸â¹ßýË1z^ÿ3¢ÿ|ˆþ›¬õï¸ÝÇÑßÂ06´þzFÂÅ?š´òwf¶Öªš¶þ~º|pÎZÌŠè?±™ZÑúë ÿhcÜÊß™ÙZ«j×ú·y<Ñb3µþ{±w)óÎúZéÍÌà' „¯ÈÈCë¯g$LýÑÑ߸v­“‡ƒ‘ý'6këó3K÷ï’´XáÊ}´þzFÂÑmýkz¬¿Ÿ®<¼ÇEZ«ÃÌÙ'{)8Ò’]â‡&Vä ?òÙúùˆH/·þÁÏ,or¡I%Ý%Ïöâß(ïäm&´þzvÂéµ û¥­µgøÙȧV=úsJÐ9úÇN½/ß´Ÿ‡èßÑô­¿²YWN,ûÇ!{Ihýõì„ ¢?j#úÛ×í¼þADÿ¥ÑÿÜåïyÐ š™¾õ^u—/¿ù¢?­¿ÌN˜¨ýéÔÈýŽè_Z·Ö?øfô2ú_¾·|W½Ôü.þ™¿ý­‡åÇXôW œ‚OJìЋşšû¦oý]ü€áÚvýü ßÏÙ2úg¿Úiýõì„ ¢?ª"úÁîyý…wöƒËéuýrT„˽`ô¿úßùµþŽÖ_d*LPü£’ *glk­¤[ë/DMÊ—ïXpúaDÿ‚GÿÃÝ‹ÿ€½ZÿóÛM‡›\ä(Á-p_Þ%2úŸLBë¯g*LýQ ÑæZÿØ¿" ­¿<˜¤Q‘/]$úŸg‹“—E¾Ky*‰þeMßú'ÝÔ˜ò]Saº­¿žµ0AúGqsä~gok­ÁVëŸúoÕHôWþHô?H:¯ÿe”¹ýÏ—…âºVhýõ75¦Œþ7Lë¯g-LýQÑ ÝZwõA؃Ôè[~½ëšµý÷²£ÿÓé£Õ‡ùƒKp‘Ofó¼Ô0qëïâ'õ2òâ9¿ÂÝil÷_ê´þzÖÂÄc¥Ÿ}öYñÅýWV#úÿý÷]¶S[k ÝÎë>ìu?q#g2ùÀ¡óò«¸f~IöòC bºBßæœ?8Ex*y^Š›µõdžÖ_ÏZ˜¨ýéU•*¢%&¾ÍW“·Èdó¹Œþ׬­?6´þzÖ„_)gùD)•ÎéÙqëH½i,vÏë@ôŸÑb´þÓ£õ׳&êEGú_O½£ü‰þ•4mýýôó!r¦?ÜÓ úOŒÖz´þzÖÂĶRŠÜWïk¼ˆþ•´kýÛ< „è?1ZÿéÑúëY DDôN»Ö¿ÉÃÁHˆþ›©õ÷¥—m0F†±¡õ׳&ö+%ýãŽz¹ßØ:ô7¥é±þ~ºüeXÛõÃqAš{qDÐX‚Ñ?vr¤ý/ã•ÐÝL­ÇÌýø=l»ÄF†±¡õ׳&+-žþ‰þë(ý÷'ò·°u(o‹‰3üxò™:cßÇä®N_ ³‚ßæ«üÎ5—rŠO´7_ëßþ( ÿHÑ¿û0Óiý5¬…‰ÚÑß­—þ¿ÒÇå¹P¯jåïllÊ›ÆÒí¼þgyÑ¿ø÷Ô ™Ëè¿Iz¢y X0_ëß=sÆa:­¿†µ0q^)Åÿ>÷{sDC¥ª•¿3³uôO ÝZù+±œ"úkö%«Øî%Ÿ]4鎇٠w'ú»Ó+Ä_Ñ|#[ökz·þ_~ù¥fÙ¶ÿ¦rôï5Œ ­¿žµ0Aô/‹è_ Ñ¿ Cçõ/ýcÁN¸®ŸY¾ J±èþð†üÈx®c×/Ÿw(MÜú?2÷'Ÿ|¢YK†üQý» cCë¯g-LWJúϳÏýÞéðRíÜï,mÇSCŸÖ_åï·þÁ™c‹+N¿3xÁèïB‰ÿ2ú+?!pó5½¹[ÿGæ~„cÍŠ’øÅ&EÿöÃØÐúëY DÿRιߛ# ʈþãêÖú7ˆþÁÓÂhbßa9±ô™tÚœeÌW¾5é©$úW2}ëOô§õ׳&b+%ý'‰å~oŽŒÓ ÷;c[G¯ñÔ0më¯é5±O^pùÐký/ŸJ¢%´þJEÿý@ã¤õ/ÎZ˜ úAô/ˆèß’‰Ö;Â;)ú§?Ø#¶.Òá}w¢ÿåË)x/ù¾Dÿ‚hý[4?,¤Hô? u¨´þÅY ÂJ˦ÿ‰£¿œû½9bbPÙèÌýÎÞÖ1YôïÐú»Ûó=,'¶ØóuÍ?ò…Ù Wê¼þÊçÝÝ~ @Ö?è˧‰þŽÖ_d-L4‹þnÒô¯ÉýÞIñ Måïìm“E×þ¼þûã°î0ÑéŽíq§|¶ŸÜÁ®ǦY~l8+øm¾‡çBÿT&½ Gë ‡þmžA£?­¿ÌZ˜WJñ/;çþý«ôüãáÖ9Ââ^›ÊßÙÛ:&‹þ&¾ÍWÀS FÌÖ£ ýÛœƒFGë/²&.WJúì£ìõ¹ß˜#,nšå~goë˜,ú; ßæ+ úO‰è?1Z—ú·ùý˜/­¿ÌZ˜ úgÛr¿æ•¹íÌ‘=¢ãñÔдõ÷Ó“B|Þ½0¢ÿÄoýSCÿv¯Ž'÷ôc~,Ö¿8kaB³Ò‚éšèÿø½å½ ûsDÆ–¹ßÙÛ:&‹þ®Aëßæñ` Dÿ‰-Ûúß9Þ¦FôWγ-­qÖÂDãèï&Jÿ‹#úÏý[´þMFBôŸØ‚­°éߪtͨ ð³M—ÜQ¡õ/ÎZ˜Ð¬ô1ÏgŸ}VjDÿ9Œþßÿ½æEhjë˜,ú;Z´'DÿËOwè¿êÁſַ’Ë/H]ÚaÊ¿-Õú_ž²ó<1¨àÇ|Ñ?8€sîw´þuX í£¿#ý¯låOôïˆÖÝÄ¢¿æ©Ñ_øZ€âŠGÿ–ƒ/eÖÿò3µ-£ÿ9è+‡·Ÿ‡Ö¿8kaBýópÄ?6£ÿ§Ÿ~ª–Z©’µ­µZt#DÿóW¼܉þÂÝ‹(»ðƃ/eÖ_¨Õ÷34ˆþÁ”¯yGâ0­qÖÂD—èïHÿ#+~”?Ñ¿#Zt“ý/¿·+¶Ã §gÍ7¸í‡|S"8†Ãýï ^øªã–lýûFÿXÄ÷óÇpÞUØf¦õ/ËZ˜HJ]ÿp¥+—ø"lÉÚÖZ­?º‰}›¯ðõºçt»¾Ìñ—‹ Fÿ¤1죯Á÷z‹`ÁÖßõ>àçpvÎóœî@ Zÿ⬅ ¢?Rý{§Zt“ýƒ XHÆû‰û…ùåŦŽA?CÙÁÇÜÒ:­¿³ñ1_å›îþAl´—ÃØÐúëY ©©‹ô¿¸â¹ßý»¢õG7çè/Ür3=ËY¹Ø^Ñ?uðÂÒšY§õßt<¹çeî?O˜ŸÖ¿8ka‚è$DÿŽã©ÖÝ£ÿy¶âéYsw³Ñ_÷¢¿‘Ö¯ýWz]q›ðhý˲&2RéY5r¿#úwEënzµþÙ‹(ú/rÀ³Ôúï)Cöù^w¢Rå/ÏLë_–µ0‘—ºJ¥¢ÿXJEÿÃw÷ý;¢õG7‡èÿÈÁœš÷Ûóö?&-j».$øØ/£¥ÁÇ jfÙÖ/uà~ë¯t¹ßBë_–µ0Aô‡Ñ¿ïxj õG7IÑßí>ðú’~rÏÔs˜¦¿ìNë)´ìç1(ëù²ƒ?ìBÄö(j[¼õßÓï´‰þ7÷@6´þzÖÂDvê"ý¯¦RîwDÿ®hýÑMì¼þËê{t~Y´þš€ÚÑ¿ÈqGZ=ka‚è%¢÷ñÔ@ënˆþš~EëtyÐRßæ{4ZZÿ⬅‰;©‹ô¿Žz¹ßý»¢õG7D?Üht´þ‚ØsoFÿRhý‹³&²S×üÇüÕ_ýU‘1ýí+ýÿ÷ÿ÷oþæo‰þÑú£¢ÿÄhý3ŒýiýeÖÂD^êzä~¥Hú'úÛW$ú?r¿¿rHÿDÿŽhýÑ Ñb´þÆþŽÖ_d-LXˆþŽôo[ÁÊß_!úÛAën„è/œÌ>ÕÏΦÞwºžŒuåÝÑ&Zÿ ãFZ™µ0‘‘º¶ÜïQüO¯låïíÓ?Ñ¿#Zt‹þÁm<úß<¥æLçöñ¦oý5kÉýÛcCë¯g-L‰þŽôoUñÊß#úAën„è/ŸD?I›T}óm ¢ÿfˆÖ_³ŠlúèßeZ=ka"5ur¿Gñ?±•¿·¥¢G´þè&;ú_~·—û¸€ß¾ Ø}ü}·çskï+,<8<ù¦ý£;|]×åºbƒ”gæÛ|Ïî´þÍÈÑ¿×0Óiý5¬…‰¤ÔÌýŽè?µzÑß}HÿDÿŽhýÑM0úÒöùzì\øI×…ãs×åî ÓƒÑ߉û$8òóÚ˜¸õof èOë/³&ŠDGúŸTÕÜïˆþÐú£›ìè|7 iºœ†Ï÷Í>è_9Í›Áy„Gí:õýÞ|­¿•¶wˆþ݇±¡õ׳&ô©KÈýÞýôOô·æ~ôr¿÷HÿDÿŽhýÑÍ9ú GÌk"þaùIÑ?xìMFôß/M?€ó—$8§ 4ñ?®Uëß+p»£¿…alhýõ¬… SÑß‘þ-©]ù{Dÿ¾hýÑM0úŸgÓGÿ`ÆU&o:ü&;ú_øò“ —ow]p®GúŸ©õG­¿žµ0¡L]¯^½Ò,â& *ï‡~ ú÷BënŠ·þw¢¿¼ÌËãs4#W à‘K±±50Së Z=ka‚袿µ­µZtsˆþ !d÷âóµþyóÕn86>æëÑú‚Ö_ÏZ˜Ð¬ôòPŸ=Òÿšå~ïðý¾gÖ¶ŽÉ¢¿£õG{yÑß}|{pºÓÜó°–ý2• ?58ÃyÀÊcýƒáþüƒãX­ÿ}´þzÖÂÄåJ“r¿#úÏ¢qôwWéßÚÖ1Yô§õG±óú'éRiãÒ¬­ì³½>S!¬Wª0Q¿AÑúëY Å£¿#ý¯}îwDÿNhýÑM^ô¿<öÌÚú ɸË^¨¼ÒŒ†çEZ™µ0!¯4#÷;¢ÿøºD'¦k[ÇdÑŸÖd·þšcoÐ×Ä­ìà«Ø1iûû&ž?Ç’}")aù‡í“‹“ÑúëY 5¢¿»þ‰þ}ÝŒþy¹ßý{ õG7EøMë´þòù .'ºøÇK4”+Õ|ýÎ?´þ2kaBXivîwÿ#ëUù{±ôomë˜,úÓú£¢ÿĦoýÏ?æEÿìä·ü¤9e´þzÖÂD¥èï(þ‡Õ«ò÷ˆþÑú£!úëóóµi…Ö?¶°`ô§õ—Y ±•ÞÉýþ™úó?ÿóüaý„ôßÞýÊÿ/þâ/—üã³—Lÿ¦¶Ž^ã©ÖÝÄ¢ÒÇ÷£?;5¬Ðúý­¿Žµ0\ivî?LÄNæsžhMl7€è_,ú[‹û_ÌëDGëöòZÿ½ìèXTF¤NZWvô׌38Ow+´þ¥r¿·…rZZÿ«.µöˆþ÷¢¿ñÄÐìU½Nô×¶þü~ ­?î¸ÙúŸ§gð#Üë°ŠóÄÚÑ_3ÎØ<ÝMßú—ÍýžOç#FGë/j&æÈý~7€ô‡ß¢ÇŠûm^ÛëD§lý¿øâ‹ýiýqGê~ FÿË,[Åå½ÊFÿ¤;Ê¡±f­ÿû÷ï·›šµþ5r¿÷èœá‡Ö¿ìЦÉ+@ƒWø:Ñ?íXÏÏíhý‘+õ¼þIó=Ï™ôñÙ=yº¼.åê.[>æ{XÎ>qn7½yó¦Mëï#õ!C'§Ëw/ý«Ø·þ±qÐúÔ&Lû±‚Ú¯óu¢¿Óëï¯s¬?îËø6ßý7š#aÜ.ˆ ·ºS^?¬ôò݆ú\(”dž-_?3¶ðñ̤ŢÿãéÖÜ=éXÿ-ý§Fÿ;­¿Î[­®ÿq»›x?úŸïÑL9 õ/¨A˜ ÷cU_íëDÎðƒ„èÑeDÿ2ð3?Ö è;ÃOÙèïhýEµÃ¹«©÷š_'ú;Îðƒöˆþøñ‡ôþbn5~†ŸC^?/¿Mô8<èH3q¿@Zÿ‚ê…‰Ø)§É(@L,ý»{'ý\'úÓú£¢ÿÄÚDÿŽ­¿¿.—ë-£ÿ~‡+±ëÁ+.+ú;ZQ¥0»ï4ÕØÖ‰þŽÖíý'&Ì÷þÏ7 ÑúoÎõ¿>úo2>æk'úÓúËj„ r?à*lëDZt@ôŸX›èß½õßÜ<Ö¿œÔè_­qÅùؔÝÖ‰þŽÖíý'vyrÏ-ý§ÛoýË~ÌwCëO럽´ir ªàF±Nô§õGDÿ‰µ‰þÓœág3hôw´þ¢‚a¢ÒGÑ•úÈû:ÑßÑú£=¢ÿÄ4_éõHùþ©?Lt#´þ.ò\^ìèÿýœe£ÿ~áœáÇš"a‚“ù—îï¯ýiýÑÑbm¢¿cýKá¼þ´þI³M“E€Rnn,ëDGëöˆþÓDÿ‡ÿüÏÿIßæ»GëïnD÷ñ¡;.ô>€œû­Qw¹Ƚá¬ý]ÕÖŸH‡˜-úó"™Ò!úëŸeã­¿‹|‰ïMòAöIÑß¾iø­AÙa‚ÜdËÛ|Ö‰þµZÿ6À|,·þþJÙô¿%ò‚ÑsyxÏ­Aya‚ÜÜ”±­ý]Ößÿ£€<–[¯Túßçò£?­¿¬`¾Ÿ&|mÜĦÙú*¶þPœÖß»Ÿþ¡¼lôáç­AIaB8á4ÉhIHùî´­­ý]ÖŠ3Õú{wÒÿ9‹Óú¯Üú¯;€öØ÷hýŒÄZëïå¥ÿ`1ú;Z‘2L¬9€^Ø 7´þFb°õ÷RÓ,‹s†Ÿ5[ÿ¤cdÐM·Nô§õ0›­¿§OÿBþ1ú;ZÑe˜àC½@3òæ¶Nôw´þ†`¶õ/¥Æ?‡±¡õדÄãC½@[yo²M³Ikýý²@[ÿfäèßk‡é´þ9cšØ´òVY¦õ'÷h©cëßÌ@ÑŸÖ_L ÂÑÓ$ À²e7Ì­ÿãßm‘X­—a¦ÓúkOÞûLá4ñ°oÍmónëÿ¸ÞeÜàhý›ã0Ö_C8q¸þœâjXpó¼ÕúûûpÉ%—\ö½¤õo6ŒÃtZ e˜˜&XcYm ÍoýËŽã±Ö¯¿þºøbØQu3¯Ýú÷úDÓ!úwƆÖ_OsÁ4©ÑRé­Ö¿ßî<2A…0ÂGWçoHÕÖ¿ã™ öÑßÂ06´þzþœ!.tÚËS‰hCþ€¯¿2ÇvšÓúo}LÙË-TZ>—\rÙ÷Ò}ØÃÿþ}åWjýD믷åC›)ú'´þÿÙ•†²e‚JËÐ]ÕÍ<5ú»ßMþôôô¸|yyy\y\nòÓý Âü­ç%Ü\»¼^y0z´þ0¢´Ö¿Ë@©Yë/we¦¿ý…ûÞY ­?Œ(¡õ€9iý“¢¿/ãݮ߿9à{z}ô.?6˜Øƒhý`D ­?Ì¡qëÈâ­JÊè/¯÷<1i$´þ0"ZË)ÛúŸoMÊåF¢¿K|çÖFDë`9íõßï!Ìýiý`´þ–ÓøXÿéøq´þ0ZËáXÿûƒ¡õ€ÑúXNß3ü*öŒƒmbŸ4МY(81¸? £õ€ÑúXNÁÖÿæmÿ^ðVÎë‹ õ°œEZÿí8Ÿóá^ò06´þ0"ZË™¬õßúÇõ}²ß&êg‡±¡õ€ÑúXÎL­ì#¼{óÐúÀ”hý,gšÖ_“éóf£õ€)ÑúXέ¿2Ð;uôßÏIëS¢õ°œiZÿöÃØÐúÀˆhý,çNëߌý{ ã0ÖÆBë`9wZÿfŠþ´þ0 ZË¡õÏÆa:­?Œ…ÖÀrhý³‡q˜Nëc¡õ°Zÿìa¦ÓúÀXhý,'£õ~~î2ÔCôï>Œ ­?ŒˆÖÀrR[ÿ^Û}ý- cCë#¢õ°œ¤ÖA´þ0"ZËyÍÇŸ9ÿ÷ÎOZ[ÿ-¯Óú€Y´þ–óš_|ñÅ~ ­ªCë—ýiý 6ZËÙ:foK®D½Cë¿÷æÍ›Œè|†èeí[ÿ໵D³ÙGáXÿ§§§ÇåËËKl9—3è=¥YζÆýüçëáùXÿí¦¼è|†èem­ìÝZ¢?€Ù(Ïð£‰ãÊÈ~Iýýlrô/8°Ø+áÇÛþ'ý ¬­õßÛW6D³QžágkÐå~}?Å_ÙGäóÄs1œ'v¯Ôè¾cl°Ï÷ªq†cý žý±þÛD¢?€™%µþÊèY½Âw0 ÇÖââ;y«“ï®yóúÀˆ8Àå$µþ©Wö’ö4-~lßCØKÉ84(5ús^gø°œÔcýïDÿýúè»×ýè^ò6]3€m"­?ŒˆÖÀròZÿ`ÈÖ·þÁ‰—Ýüá^‡›„{é—,ß%öXhý`D´þ–“q†Ÿ¤ÃfJM<ÏP0ús¬?,ˆÖÀrR[ýuåÁ/?Œ+Üëfô—y9lWù ?´þP­?€å<¯¿’~uµFë#¢õ°œŒÖ?†èOë¡õ°}ëï>> æàr†â”kl00Z­?€å([hý`D´þ–£lý! õ€ÑúX­ÿ}´þ0"ZË¡õ¿ÖFDë`9´þ÷ÑúÀˆhý,‡Öÿ>Z­?€åÐúßGë#¢õ°Zÿûhý`D´þ–Cë­?ŒˆÖÀräÖÿùùùqùöíÛ~4͇~ÖÆBë`9Bëïs¿#úÇ£?­?Œ‚ÖÀrbóïÿûžÃ­? „ÖÀr‚óãzïqŠÖFAë`9çŽÙÿäòÎ¥ÿM–mýyŠ£õ°–CÇ\vá¿¡_ýuñÅTo„e[Þ‡€Jhý,äÜ1—â»êG°®±ð"j°Tëoá} .¹ä’˹/ƒ·‰þf³uÌÛ1åe/·`]iùÆGx¿õ/ûtÛd-ß­%ú˜šïß¿¯´|¬ë-ÿ¾ª#,Òú—bÿ}5~·–è`6 Ù{“ËnýG|—ƒK.¹ä²Áe³wk‰þ€ºxdÍÞ­%úêâ}è‹è¬…è,áÿ«æ>¿endstream endobj 123 0 obj 71 endobj 126 0 obj << /Length 2213 /Filter /FlateDecode >> stream xÚ­XÝã¶ß¿Â(PDj…Ÿ¢t÷”¶IýB7}É%€ÎÒîê*[{’Kóп½óE™²µ¹8,°¦ÈáÌpf8óê‚?½©Ô&X›W.„Íþp§dúßwZF; Ø¥$¼¿ûü+¯7Z啪ôæþaÁä¾ù>ûÓSý¼ÕÙ©Ýît6nwÖÚ̼ÚîœsÙý¶´ÙW‡±«ûíÎT•÷™®¶?Ü{÷åý,Øó1ÕäV·`6:äF{'º¥Ëµužt3Û/ ¨Q'ЃÕá×§‚sk㌦_NS‹GÐÙ'„=§òŽ·1¹/Ë’ß(ciMƒ°y—¬u'Ó<¯Î•\"^¡Gؤºpu…]Ú´N´¨OøÄ :Ø„2kngŠž'Cö0ŒÇhÇ}Gº yýÏÓ1Ù‹ºã"ëÞ>Öc¹¸‚&=0»gŠßá¼x©‘_’Ò®I ·RB´Ì=Ô¿Ä,cB!s 3©¥y¾n1dADOû!çPp?lÔ!/½7DýwT¤¦P?”!ëÐHݾC›Ú² ¨„éîÃ`µªDž¯,¿?‹ca'‡ì™¹§óÅr(µþ-¯ñù¢Í$Q¡á&1Åqà_±À3¥ØºD]Z¿å\ÁBµÄÓlÄ^ïê9,zlJ±;üNOmßíw—ßd1Ýéy‚¶àüÓL€©ßW‹leÊŠæ%~!;ÊY’ÊGYþJl–åÚ½"źǎL4ò·\ÉKO~wDšŸ_¯ÅÚ[Á]ÁØ'ÅAÊdïè¶½|ž9ߊûC¼ÔQ$"€(ÖKº108ÖÌ9ÆõÌL†Ÿýþ3t‚uÙ_…òÖmH×\¤\¹S/¼Q^É¡öçq¢ÈQ’¤•è4Ìi×lÒ´ä ¬5üÄdaü”ë;uûxºáXÇÒb$> PaPóÏõ‘@QÍ+ ryìNBŸ2jÏdÀ˜µUF¯¸Òk·)óª("˜PA€)•Ûªd˜ðt Gl0¹+føJ¾%â÷wßÿ 6 `“oïdó*¹®*³9ÜŒ}'ú»Þýã_f–»”'a» yá‹d8Æ29n-:éø²®Þä¦ú¤šÎIÏ…mÕ´€ŠŠz«Ù’ݶ*sã50N,^Ó•îÄ…Ýã±ÃJ¿p ç¡&!÷vƒÄ& Ic”úº,žÚ½$Öäz˜"W…‚céïÖTõy0)U4;b¹¨ë ½óþÿfˆ±üjÿÜzY•¡†q‰ñƃ'Lå8l†ŽyÚüjÂGBÛ8 Á*yS,ý ff¹KyÞ„v"<Š~<¶“-€áJ÷iuYÞF·)ÈzW’®`óâåèÞir­U #Œt[¦”&Iç3v"šj çÆš§dåñ`Dô4Ã${‡xO2íá%äT¸·Ù»ö4ÈÌXñªˆe×)²Úf”ä|‘v>$ˆá Ó3žË¾oq;–'ç³/žÓ¶õ°P´.P&bêž«0¶Ž§1)êB¸€B×ÿe5ðwýLPŠ‘í\[_ó"Kj¯ÃË)©ËA2ƒÆ`çÒrÒzÎt»”p¥7¾eˆ¶úª{ô.ÞBÖ…«ŸŠXiƒgºêrÃuÉ£Ü÷3Khšq¹²ÜVþÍAoþ<$—kUJ³¥†NØ†ÍØn’6ˆw)õŠjZqDéÊåΕÅËVzÅõ áñ=! ?gxÓ ïy¡é"d¡h§>ù?اæ3‚)Á*ão‘fÝ%˜ƒ¦ xÍÜÙÀ7£›ˆèAËFP² KP ´x3 =¦Î¬TÈŸÂp?0P‡^¶<_öÝs- Ðý‚ß•Fæ5ƒã/ç>8‘–ÃWªù›üÁ€ìåK޾(Â-sNƒnnrq,t©Ž­¤K¨E0úRr‰;çC’Öc­„tâC7Ù¢¸vNæÎˆ,ÌP:•÷ è–Ìfí²A²aõÊéÀϘããùî·Øho=ö{Ó § JÉå””ƒÐ‡vëCÚê“'é¢:­@gó²_,œÂÝà±·Õ¨~ì]µtòº³gäDm,,Ñíé—ç º,¸tê"bÇï0÷0< \‹R‡I‚œ-³/˜ÅUGÅò0ìëf¸LvcÛî»>y²7mªp×j²ÿ‘o)?%Q¯[pÿ ?Ç–´œd6eŸ/¿Ïò436ÎÄ> v²á(¬jâ‰F ¥ž|ñ8$š,67‹æ\„µS¨ããˆìÄ~*}b¡H%wÎMÕ²»\5Ñðv‚¯·4R0å§—ψ†äÄ-éJ.‚ÀàA€ƒº§~œø“®•©®)#XÎB]$çã&(4æ¥Ðã<…ö¼y˜ã÷4ÜvÚâIšzß„Oz@]8ÔH.* KáúkIq"[ŽÒþRçÒ£Óçô¼|ž¥=topùú1S¦oÀâG!á/¹Ä rè]{ŒŸ1æe×é|è…©¦÷ë³a5\ {uûè†s=Ÿ0qÖJMÃ[.ÜöæX–ª'þÐ{Âi¼àA®* 3u²x”§I_ÞxC< ŠßøÆ+l¨ÚuõåiWÄÈM“™ðÓÍŒ–þ=öY endstream endobj 125 0 obj << /Type /Page /Contents 126 0 R /Resources 124 0 R /MediaBox [0 0 612 792] /Parent 118 0 R /Annots [ 135 0 R ] >> endobj 135 0 obj << /Type /Annot /Border [0 0 0] /Rect [405.1215 489.9999 453.4852 499.6969] /Subtype /Link /A << /S /GoTo /D (figinitial) >> >> endobj 127 0 obj << /D [125 0 R /XYZ 90 720 null] >> endobj 128 0 obj << /D [125 0 R /XYZ 90 720 null] >> endobj 136 0 obj << /D [125 0 R /XYZ 90 478.9704 null] >> endobj 124 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F14 131 0 R /F3 134 0 R /F52 12 0 R /F54 117 0 R >> /XObject << /Im1 119 0 R >> /ProcSet [ /PDF /Text ] >> endobj 139 0 obj << /Length 3785 /Filter /FlateDecode >> stream xÚ¥[[ܶ~÷¯XôIxT‰¤níSj¤E ¤I‘EúP7€<ÒnäjFkIã~hÿzÏi¤±Ó`F")òðÜÏGnúÀ_úP%…ÖqeŠâát~•Hó¿^¥òt„ÇpÈ_ýöYú&q•TéÃãÓb’ÇæÑ›Ÿê—CÍíá˜FãᨵŽÔïGcLôx(utÅÞaìêþpTU•e‘Jÿ|üË«¯Ý™RŸ# ‡|޶41ÐmòÒÄ©68ô¬\F’)SÑ€?itB¢±yœði¹¹–žì¦^ùôï5?¾ÇÇKÛ×ò™Œ8ýxÈ’$ªÏôÕ(½Òù220)ÍÚáZ锟s}9Ás{ùÉ/†\[úfê†KÍD#Ž)oû˜ê8Í– Ò¯«èm}˜ÿÃ$I+Oóf¸¶c#ö¶<ñáXä*úêy@šë×ÐçQ{!F ‰öMU4T½M”>˜BóNÏ<èÈç=ÄD»à©´^õ-¯TŸi.á m¾;sß½c–Ž´³<åIUÄÍ¡†bkc—щña3(*­W>O–': vĺ~FuÒyE¼ÌSá;šT½Å¤ÓÀ+tôs€’>wôÍ…¬µ O¢ïpL=úAhª5ïSG4™•U8OÏ4]ß}ªù}àŸ3kdÓöÒ@´ãì>Ì"|˜*Ns£)¸P;=þgŠ8® Ý;þ~ìhç»A…‰UVä2Å‹Ó ¤]K–Þ*‚´ã~.Ý©cÏ.õÌ3cSåʱN²#‰J—±Î³jí½?Ï*ý™crÂ3‹ùÝL‡:r¨Xs7H‹–ƺºÒ3/|œÅÂJC^¿‘uéÇ ª!%xoe9K7ùiÖ œŸfšëp‚FØ7Úw1$˜ôz®CºžÚm#gãþˆ;Ÿ¨_%qžçÅƒŠ³²dm£-‘&Æ*U‡}»›ž ¬ L²ŠNäÓ]Vœ¦W¡Á…1“‹3´ð^ÐŽûCè÷­Œ`ÈÓøžÆ?2מ,kWj5t”¬áÐ"; øHÆžc`‹Ö¥qYK¼ýçnÏù‚Në݇¾3w¾iͰ]~¶œM~›â`c@޳Š×ü^T:ÔÆF~ëÞó_šž‘«WaøÝгµêß3[?¬xTÜãQr’Ô²/ìw[,(¢`âuä~Í,6íó Ùxá•©XìÝ©FîÃúBà ûã c%ú7D“õfm¸ùa;§cK1¥OÁ>\%Ó¸c_y óEB!F4Ÿ6Sý.€Ð«?ñ3í™rGø‚¢aþ™p—üþ6ɉĉ³HbÓ!ž`_@½“­µ*N•ƒxJ$nië3Ûy€•Ò xJ„ ðÑ¥Mdm¹ ²Òô¹¼&`;âg­}X¹Ô)úUÓÙp"¦ÛŸ—6ð AK”ÁÄ-ÍÐÉÓäBÊÐw6.8‚pD‡ ÄÁ|l¾âjŽ›8ð"ë0«{yÛ2: ¸×ƒKzd&¨Fpè»Û|Þ/É\JmRÎ{®õÄ/ç¡§÷Ñ6Ø¥àƒò Í¨ÔøËߺh“rr‚=§ºûwͶP…ǰP]ÎN±õ*›i^fÑ×ÓĤdÑð>¨'I{T˜ö誈r©Óo¶R£,.T¡dÑÉQ÷hdRš-µ¼æ TÃYÑö⦌«¼*ï­]Åyi*ÑPr•sÊ@ª†/UÙ/ÓŠ“{ á0†ûf\z h÷9iû3·œ,ê@8ŽcOÝMÖB}R»lL¶)ÃÈÁï<Œ_égeœg¦XêU#Y؉?.U¸Iã¬ýB«w‘ÜwæýÎTØìœè‡ñì²A›dé}³ÁÎÙ9ëŸdB—“¡Kh–®º«W)œ¶‰ß jÀ‰žGNÝÀ¨±Ü’¯lt·¶øë@®âš‹ 0Ù’3ˆ$ÈeŠUœ6”YøøÆ-ôUv„¹“l~QÐ2Ð.3»¬˜"+=6œºñ§üÓŸy7Ž·n›QúØãµ!ëïzªp ¨‡eaàÀo“K‘¬>“Ez°ûºðN¢r™TÒPãÔ<,¨IÑï$Ô&“Kû­Û= ãh£´yt 㤼@#-!]$W1ÊSáWàr_ˆ8ð¶¢¹8-2™*¹‰=hÇ ««W=.ynµ½`þTU¨g¶^viŠ®yÊ·Slü‹ ±XIJ]¬ËÍd :ë—ÞÕià¾èãzUMËÈg5ÁÿNÆsÑ¢Ø8gˆd‰Ö©Òð ´^vpÛ%Ëk#‘õì˄Ϝ‰5RUßá›±&Õ·§\p‘ßöd„ûÍLµÄÙÆ:,tIÆ0dÏUªÌÄÚè…óbY$…Y:LQë;\ŽƒLžÂÈ{%õ³ÐÇ’!þ#; ¦Lb ~òÍœŠO@/¶å³©Ôj¥h°n%P§Jï‰EIÂß~VÅ”æ6RjÖ0ø,Š‡ÔæÙ“Ji[S_ob!ðÑžÁÁÆÎÇ‘ íéðu"þÌ.ï^‹Ôdq’z!RÊ ïÔK΋ïÔ•q(âÀ¯û~ªÊ ëÈãÛÃ8ƒÇ5nÀ“­ :9R•vQ:èÜ>wªí¦6a°-á‹û^CklX/²HÆX';°¶p^ÑrŸ«žÜY"4N.Õ€áY\T;åæ9´joeBóË”ö8o’Lšº›sb\šƒ‘· œáU gŸ‡õ2ãCDfî`Ï™;-·,ɘ•™Þ<†z› é_´ÄÒ†ëpÞC[&7š»ô¼—á«ÄðH ä¸Ç‡ "¢JçF‘¶„BÛÀÁ›è4vìn;ݽ‰¥aø{8hëüÛ&äÖˆžM;à>ûž ˜ãûö>ɼZë>•1›§2†¡ üÝ(•L¾‡ðç['ü¦°+qäšø„_Î}¡9̤x<éÁ¾`g=¼ZpÚ¿ÜL°~p~¿ÁŽiøDŠç’²µ*]T©•U±ŒŽL9.h…ˆ‹Uêi.Yýý¸±“!_ÅY`¥–ˆJg§u@Ÿ(W©/ž»Y&ëBîꂳ6›w – 5&·Ž’d•ãAþËÀ/§wôÛâ#„ž»^–NM;.[×\3°ç>„—¶—‡É6\ìݱÞÅ ¿§c€;7^°S¨¦Åä Óíñ‡’t˜ïDØ0ÕU@ÐÄ*l­áÍ)çáă™ó‹3&@ |18‚aKOüz¦™µ¿<±sÄÑ…Çei&>:‡ù¯ åwÎ]æ³è\´‰àŸ½nû`)ù‘k²¸Ç¯²t3 ^‰«Ô›|êˆ9öÀßú7ú&ï¸é!îÂ7™äoÚË j½…Ú`!o õ/rc1I,nƒå ¾ºr9‰žÚëÑʼnwá]ÄPcT¿ª&É®› ¤l¡cÃV? $v3÷á$}¾5RQ&<°P¥qÐíQ%I¬«õ=…éZ{¯‚[·wê®çô»nñª«?$\ÞÅ–6Oœ±ãMPöˆóÂæ]™ª2ëü2­QUhù•pø“M7r— [,½§ h º™2`TÖ“i•EE~€!À g`qA!<}³G=; Рã|pæçÅ•–Ü#„â^•¬¹à±9]°9ËwÌË;él°)|Àw*K{ñeзóÍeº¼Ü>Új¬Oä[·PÑ:R]‘ù™8vwˆ-ÌÁ·ÙÝÔUx’Ôqø0à§oK›‰G±±ÂÃÆ|æ|*Ì`›zwëWeî’5–eWp–xÛ8­ö¯ÔâÀ%ÎÆmþT ¼}ðg“q¨a•`Þ¥¤’¼5‚ü¿·%p!h|±œ˜ÕMðÂ6/ûÂÞ,]'$¬Lñì€üçTI®µ¤¨ä„¶Þ+dtºBñ•HJo÷ó=ìðÖþÐË¥~è¯1¦\ÇBÛeq-Ñb¤¾xK«à ƒzvñ¯\á­Iý+/RÁèÒ%F‡¯#½ÚS‹;¤à¿(¥ªÿçÔÂþWÃÿ:L endstream endobj 138 0 obj << /Type /Page /Contents 139 0 R /Resources 137 0 R /MediaBox [0 0 612 792] /Parent 118 0 R >> endobj 140 0 obj << /D [138 0 R /XYZ 90 720 null] >> endobj 137 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 141 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/fig2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 142 0 R /BBox [0.00000000 0.00000000 208.00000000 208.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 143 0 R >>/XObject << /R8 144 0 R >>>> /Length 145 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`d`a3tõ,-Í , °Z —|®@ PUendstream endobj 142 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150404) /ModDate (D:20070503150404) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 143 0 obj << /Type /ExtGState /OPM 1 >> endobj 144 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 435 /Height 435 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 435 >> /Length 4414 >> stream xœíMrÛF†©Šsƒ8 ËEm³ò&Îd3«ØÊX¹/¢‹h”‹`2+p¡Ê̬½Ê&É,ÇWñC ÿh4úk¼K–HŠ@«_>x˜ ¸Qˆ¾»ŸO‘Z¯χ*³çSµÏý¸„¿\5ñÜ+D•Yý…‹jAŸF`€Jß”Ÿ>Ôžù¾ã‘EÆ?姇ֳÓ..uh7ÏÖ .c.BTzuž"‰fÐèÕyöÁ»ËRàëV¯Î3×.?võºˆï¨3{0<³ï¬`¿q)œ3ë:¼ª22<£,ÌŨÃTw0žªÛ?Œó¬]€Ê¡Y™ƒx:tC°ÜYtWÆ.rä©aÙæž:̃ü3ÔWfxvòì8x03&¡ x¦dvýfxÖÌÇ„Y©â|œrÇÜ9çͳzã8Õ3y:Úmd½É{:ˆ6Lé6y+ªFÖ_ëÐ]’ïP–Ø>¼{ÞHßx>x„Í3i6úYj¦ó ÌœnéhffÿðÝ(´ÌÚn™…òL?òd<ôÉÐfV‰ByÄmš›åꢨŸ•%ÉkQ¦­’[fÒ̪ûtDÏZ OƳAß4š2Å¡lÎìšÝnPfü¶$y-Öï–VyŸ ä9ŒŒ4³uߌè™)‘Û3ËVMÍÄÅÌL¹ÁÐL_‹-3ùÕ…Kf²gJfTÏôå>9<Ó7ƒÖÌŒi6¯è 123¿³ý)-©‹~/…Af²gÕ?S=3R3<ì©?8nsqάëŽÞ³ëoÃëð±þ•™Íï2=ŸÄÿVäø±z颸ºÎ¬Ú~"³ä9V¯Am3«Š ž¥ÏQÛo„gésÔŽÏàYúÀ3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~À3~Dðì|‰Dök 0<;®=g« 0Q<[yÎòË,‚g+OZ~™-ïÙ~åYË/³(}¶ê´å—Y ÏÖ·ü2‹´ß¸âÄå—YÏÖœ¹ü2‹v|¶ÚÔå—Y,ÏY(bžYkîòË,šg«M^~™Å<߸Îìå—YDÏVš¾ü2‹{^ùË/³¨ž­2ùeûÿÏâÏ`~™Eöl…)Ì/³øÿO{óË,ºgÈl&«¼$ò$æ—Y|ÏbÏb~™­òº«¸¯ŸË.³5<›øÔ/ÿlœY˳i™½Þ…g8yVÞ qhœáäÙùUqAf¬<;_îĤÐòËŒgeqõ¬Ø…gøxV qW}¦‹–_fL<+‹ËëKq™bZ~™1ñ¬Å+qí³ ¢å—ÏΗÎ3ònH~™ñðìÚfM ºhùeÆÂ³²<+vóÀ&ž¯=öúÒôyã˜_f<«Ú¬>:›ÔhùeÆÀ³²þ÷Nº…Z~™1ð¬n3Ù³b7wœáàYÙôXßg×ÝÌp†ƒgu›õ{äFË/³ä=kÚL©3Aj´ü2Kݳsk–êY±›7ΤïYÙvØ]!÷Ù… Z~™%îYYØ=#˜–_f‰{Ö¶™^g‚Ðhùe–¶g·6SŽÎˆûŽùe–¶gå­¿î„Ög¢ØÍg÷¬k3›gÅnú8“¶geÿ¥Ùg£-¿ÌRö¬k3s¯‘Ðhùe–°geß]¯„Ùgc_’_f {Ö·™Ã³b7uœIÙ3©Í¬uV1F´ü2K׳óeгQ–_fÉzv–zëµ¥ËF¿6$¿ÌRõL¶Ìzt6Ú´ü2KÕ3¹Íœu&Æ4Z~™%êYYŒô¬ØMg’õ¬TzËÝg#DË/³4=SÚ̹×8®ÑòË,MÏ”6óÕ™-¿Ì’ôLm³ÏŠ}œIÓ³Rë,ýµ ú‡ß´ü2Kѳó…äÙ@£å—Y‚ž•ÚuUxCË/³=ÓÚÌ{t6¢ÑòË,=ÏJ½¯,¯¡¼6$¿Ì’óL·lŒgÞFË/³ä<ÓÛlLŸy-¿ÌRóLßgç™Ï´ü2KÍ3ýØÌùZÑÇhùe–˜gf›  í;æ—Ybž™m6ªÎ„§ÑòË,-Ï,m6Ö3g£å—YRž-]õÕåŘ>ÅŽ0Î$晥;ªþý|N£å—YJž™eö²ýübÔªì[Çü2KÉ3£Í¾ì¿þbr£å—YBž•zG½T®>ÜiÖÐòË,!Ïô6ûR»>Üj»±àLJžémöÒü–ÁZ³‰–_fÉx6dÙ¸VÛ[gòììë²þã…¿Ó,¢å—Y*žGX6¦ÕÌÐòË,ÏÔ6³tY·Õ¶Y"ž•#-nµÝ˜p&ÏÊ1]6êXÍ-¿ÌÒðìL°l¨ÕôÐòË, Ï”2óvY»Õ´ÐòË, Ïä6c™¿ÕvÃàLž•¤.>V»÷­Œ=ix&µÙhË|­–{f x&µÙÈ.ë±·šZ~™­ïÙdËÜ®í†À™<+'u™ÿXm70Î$àY¿Ï8Å2×äÎ?Î$àY×fä.ë1[Mj´ü2[Û³®Í&[foµ{ï8³¾gå¬.s«åœÙÊžµmöÕÇì­¶ó €3k{Ö–ÙŒ*“P[­-¿ÌÖõìÌ2³Õî=àÌÊž5¯y9§Ç<Çj÷îpfeÏÊ –é­¶s€3ëzV·Y˜.ë‘ZíÞ9άëÙ9¸ej«åšÙŠž•a»Ìr¬vïgÖôl!Ë”V»w €3kzV†ï²ž¶ÕòÌl5ÏÊå,“Zm—cfË{|‰T²ËlqÏšÐÔy»>õÏËZÖµÚ=<›¼"!çvÆr¹.“x!rÌlyÏú•‰[nÇ}¹¼em«íòË,’gÝ «öÇ/9.³~|ñïì2‹èY¿Ö+éÈ,²øžÙ¬ã˜<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ã<ãÇf<‹ù§Yþì›ñ,Ú’¾®Hýçá×°Ï"fV‹å¶Ïbý)iéÉay3ˆ kØŒg+dÖ®8tnðÌÏ_Úõ»áÙÞÒH„ÌmCž%@˜Ü¶ãÙÞº¢{4›¾0;BÛñÌžÙ½ÉÉÝmE¾AùQ¶íY8ÍÄÍ4x gfáÞN(^f[ö,¨f­hð,¶Ì‚Zv3 žÑYXbe¶]Ïþ ÿy¯àY@¬™çžÄÌì¯%Þˆòž…ÃÈlË*îàY0ŒÌžQΆÀ³`è™-¤™¿Á³PX2[¢ÏúóŽöAùQ6êÙbšyÿ‹ ž‘02[Ȳ}A~”mz¶ fÂc<#¡d¶¤eÍÙ× ‚ü(›ôlYÍÜ¢Á3rf‹œc<#¡d¶øÚ¢Á3Rf Q>ì¡Á3RfËk&¡Á3}fË<ÏHt™E±LØEƒg$¤Ì"Xæ0 ž‘¸eK3«hðŒD—Y$Ë„í¼#<#ÑfO3›hðŒD›YŒc3÷ÙxF¢É,¦fÂ4 ž‘¨3‹jÙe¹Ì¶äYdÍŒÐà‰*³8g@<¦Á3mf±Y&³íxömtË íl<#Qg¶rhðŒÄ5³¿Å·L¨gCà‰ã·¿­ã™,<#q|ûϹ}öþ—)ûôF<£püæ_3={'Š_&< }6™«go‹–}_\ªË?¨ûïyðŒÂÕ³oŠbòÃß5‘—_‰ü´Dfòìú´ŸfÙûKÑ_~¡V»FÏæ¡yvùÌý­ã6‹­f‹ žÑÐ=Ÿ¹,ûžYa?V[4³zæ2í=íÄ–ëXÍ<£axf7ÒdòE?V[6³Ízf1ØdîV«"ƒgs±x¦›6Õ±[«©–Y"ƒg4lž©¦½£÷˜ëXmé̶ì™d}oѺ¼ðl>ÇýÑâYgÚŒ&3[Í¥<£qÍÌæYcÚÌ&SZ­9²lf÷¬2mÒ1™óXÍ<£Qý.ÓŸö»ÂYV]~ªºhfÛñlÿ§}’ßÇŠ žÑ¨7×.ZXÏ~®—¹lfòLüaŸæBöYí™=2xF£ù[vÑBn}›FxF£ý›.VÓ~½itDÏh´™-ÝhÞÈàÛß(³î;¾Ögq2Û–gvÑ‚yæÛðŒH÷77m4¿fðŒF—™U´@{Ž‘Á3ýß¶5ÚÃòÇfÍ ‚ü(›óÌnZF«#ûï3 )3[£Ù8֛ƙmÏ3›hÁ<{ƒ÷ó †’™eœslö@ð¾¹ÁPÞKË"Z€c•Ù¼?u8”Ì,6ÿ­ÝчgÁPßr‰F«ÛÌŸ <#¡½«iÚÜsŽ·c3x -³ðÖ´< ˆþžâæ¾ã¼FëN[Á³`™ß1ϳ¶ÍàY@ôÌl6§Ïn›Fx#3S´9{Ž]dð,Gã–·Ïfmo– ÏBaxf1mzh]› o0ðŒ„%3£Ñ¦Ÿsì7— <#aÉÌm²gJdžhà kf¡MÞ46+s "ȲeÏ Ñ&î9ê‘9Ãg$¬™é¦M<ç¨m›ÕÙäGÙ´gaÍ™#xFž™¾ï8霣¹ilVhDeÛžé¦Mõlä/OÃ3®Ì„êÚ„sŽŽÈl Á3žÌ„dÛ„=ÇŸÆÿ¶<£qô7ÛèGgd–ˆà¡ÌDc9´Ÿ ¯õ†g4Fdvåê9G_dFHðŒÆ¸Ì‚¯uï¾6y™ðláÕî]W¦/ž-½Þ½ýëK„g‹¯xoûrÎáÙòkÞ›_ÍZ<‹°ê½þżÅÁ³ëÞ«Ÿg. žEYù^þ4wað,ÊÊÃfÏ¢¬}ßÿ;{Yð,Òê÷žQY9³:/xFcí̪ÀàÕ3øoWÂrà»!lÇ3ËoÆD'̳f;žåÆ<ËxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆÞ³NðŒ•gפ®žýx½öÏpõìtýTo…x„g 8~¬?}]göŒ>ã@Õg¢É ûLÀ~#?p|ÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆxÆók ¢yö¸öxÀTϾ{Æ…ÃEòÌÉéÑw/Xÿ”wžùàç$üSÞzvzp^® xtߋ˗Go"µgÞØ¯™…|a¦üêàÆÿ0©ð endstream endobj 145 0 obj 57 endobj 146 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/ap.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 147 0 R /BBox [0.00000000 0.00000000 156.00000000 182.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 148 0 R >>/XObject << /R8 149 0 R >>>> /Length 150 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjf¢g6´0²2uôŒ--LLtMÀ cˆz —|®@ Ž¿?endstream endobj 147 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150401) /ModDate (D:20070503150401) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 148 0 obj << /Type /ExtGState /OPM 1 >> endobj 149 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 326 /Height 381 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 326 >> /Length 5936 >> stream xœí];rä8Í9ʸmµ;'ѹ€Ž¡ˆ 92ö­ ´CK†N ·­qç$±Å€ÌDâK€A¾ ©ªH? 3Aþ7 àøÇ·úëóu§i!¾ž'¿þr¾>á±Ïúk¼B,|þzÐøxwý¸žµWŸ…ϧEÞ Ü,YPjü|º_¹¯‰=¥Æ£å¼¯É"5>ïU?:ÃÊžRã/o¿ç†ßVö´]ýž»¿óxÁ_¾Yj”Û¢KµÔÎ~‹…©[jLÚr‡xô²纰@ÛwXÔ£FiËÏóz„K3+ Ïø¼§/Ÿ¯Ægè•Æ   ùj|ü¼[9&©ñAÂ5*çwòa¶è}-‰¿IÅÚÁŽj\ˆy_ëöJÓ»^Lÿxk…Ôȇ2ïö– +L’ï¦ù¡!îßù{!Ji†Õ”45>Ó“z~·Ô¨Oþy­—ïèÀJ)€aÃäêâ Áhæ™Ô”T52§’DJ®œÜîÐ K¾¡bmépV#58‰jä~gj¤Ô¸ù!%Üuº5 5NÿrÕhÉÔ¨ëé\ƒM;,70’[n`ˆ£Æ±lKiôuwÞÜð7Õ·ÙÝ]ûf#ôCØsc¶A>t½ÕØ'»«±S„ÔH—°]"¤FFä­Fj–Ûjü’£¬¯¯‡Ç0w{=Ør¬q±`Ôøþù4ñù°ˆxr,ïΓu­˜Ô8±ùü=»ãÔyøçk"ø×’˜÷øüߣè”øs ï›iœtyÓ˜·ŸÿL‘ü…Æ©­y¨ñ÷Ñu:|ÀOÖR?Ôøû{äòdýŸ¬ßÕh|ûQe³Å‘söo²+çNCcòÙO•ZRãMc\¶ñ¦1 ·mÜj,‚[Ep«±*¨qé/ô’aùÎVûveÓø¿´Â2¡qÕÛúI¿c„Ô(ýÆlyúàÑl Dã˺OûÊ‘EÂjyÒ¡G!“F¯C4†Ž6DãÔÇÿ©}ŠÔç0qè¿tµhäÛLjRãT}Gs6kqý¾|}|šëý¨wU‚ÆÑYÄõ“dxÔ8UsÂ1jVçÏ#¯Ô¦€Z ËùjTǩߩ(†QºfãúÏ}ºiÄgFªD´m\øð)Íÿõ‚AóŒ¿fÒh¯“FZj-ê<Ý ×÷Ñsf‘¶Q×MR¥°õŽ”>t%ß`ññZ4º¯™ït£àQ£Ú.(Fôy„Õhä ÐÈÛ0Þ¤m¨ÔE#°’ÞÓB|“Q¶Ñœ ©Ôk4êÚ§F²3ßéF!“Æ5:›lЍ|.¼V¶ÔbùšÕ¤Ñ×ÄÄØÆQ5ˆž9˵ìúeT»ÚÞÄà~£ëšùNw#ÞOæ(&2/æ ³k#L:<ë|øšñëðÄaÃ(&}WˆÅ¨î÷¨àáñ¸&Òwç{8+ù®‰ú¸ýEЇÇ­Æ"¸ÕX·‹à;¼¥ÿHVcƆÂ8 9'/ª± ‹g¡1²m<ú¨NÙ6}T§Ã­Æ"¸ÕX·‹ ¨FæHó´ ÜYØ+j´’Ráù# F dƒÐ?¾n5bþ@ûêiž‚{Û8`ˆs Ph¬‚ýjÄ9rä–PÖ€E˜:¥1F(d™½Lc~ɵ= Zy4¢&†þ²#%N¨¬FàôuLcLKC£ôãõ}yÕ9¥#Ûo”š˜PÏšöÑ/eì…ÊèQŒÔáxƒ“º¤ñ¢cjßH5Õt_ÖÃã©æÐxI5úGª©ÆæºjtŒTu6ÚÒ£ ‹Ü¸¬]#Uװן&yY5©.‹Ü=ä[Nî/ËÚO¦ñªjª>–µ«1ž‘*ÜjŒ†s¤Š›>ˆuâ²jGª*k¤jŒëðˆjL¼§OÿÌçÙÆ4Ïrçé˜iÍÄ&Hº½TrÕ˜U©™- ÷Ò0â´ÊÂB£'~‹/ o?ÒU¯ì^jäþPr@xbw[¥Ž¢q¹+Z¶›­»˜×¿}…^“›Ffn¥=™[é‚6Õë*ùÚ&ª1»¥–œŸDfÕ°'âÑ۰̳*D¬:¶îN+÷hbx¥FæÖ¦‘]åµ dÕKØF õB¢Ñ—mÄw8)Óá±*52·AqÏÌŽrÙHU#…@cÌ]Lò4±R+{$u\%›£+„岑®F ›F ÐÈ$hµÔŽ‚Ò66«‘×1¶ÀM#›œTý&±M ²ôÌtKML!5¾£¢‘¦ä˜î n¢¿ŠSÕ¢r«.õÂÔ<øit ¸U ©1ÉãtÓèPcšß®-&¸‚q©1 ­Ä©'îºÇ¶1ÍÄ©¤±·–ú§ Öj5ª1>:»L"Bj<1hhɱò¦èC4f2Ú±)Uõh,¤FbMjrlQWÕtL#r_e Z,JM®ÏiTMŽï––4V]¨?gшœpú¸D¢ÕH½@¯¿Ðø›|ge¬ÒuµhTŸF Õ•ÄtV¶Ø…t>Õ¸Ù_©wR#:K<R¼—F‹–üøòs52Æb¥Ö„:+õ^jÄçL|¡ËÁûh´&éØp!ó:3”`ÓÈ$(Ð8@ÓÔh¼F)•šxéqãòŽ*Çu"lbRÕˆÏ~=ø`¥6&^P£EŸ*X R«8€ß6jÿn:¶¨‘|ˆ¨ÔÄw¤Ûá •ZÄöÑCfKN#g'ÆM¶QD=Óúghbœ’Ü¡Šij4–ÊÝáAž^f¥§m˜QLáO£ùEX4byD÷[ÆÆnxÃù‘4Êê‘n@|~cœÔÃW5^ÒmׄxׄXzk¨$61/”Þ¨Š&ÐØ›¿1ŠÆäõ¬hA5F|{4ÎÚ+»·el ü/¦a UþþãÔ¤»5RyéD=³^ìpíuÇqj¦8<@§>ÀôJ×m0è6Nýƒ>=°¶z»\¥iì-NýŸ»#¿qÁP’Æ~[j < åÄEPUÐ(71$‘]ÑèÓ_YóW5PWýâáMŒí  ë2J«±™8u[ùõãÔ# ˆ,¢¤µüÆâÔáãÙŠŒöòëÇ©kÑ]º’ÔˆGvG6*N͈{¦Ä( r‡1ZGûéªTAèiˆƒÜø€BÎ|êmžÇl5Z‹2ãÔºÓËû½dóƒf4éó©·zsÕ˜L£ŠS§Óˆ~™R©£hT¶Þ6ú6¢h¬¬F>óÓ¸´3.i„;JÉþF\a²<™-u:Iq4âå)¶›Ç`Ðlk£ç1³ß˜¥Fé‡Fcb J¯Z9hÄá+ËßH¶µÉó˜ĵB¦Ñ§vÓˆ;6Ü6ª_¦ÚF½ ÙßÈøØàyl3N½b¥&WL6Ãv[‰S—@æ|ê46§.€¼ùÔ[<}ûIGGò7Z£f”c=}{¿](nQúSK¨Gcqê–üIh*N½ëûSïºÇ~[ê]÷ØoK½ëo5Á­Æ"¸ÕXñjÿqܘzw´¬FÁo d<ÐXòÉ®{LP#aRò S1ÎU‚bƒ‹ÖÕˆ<#fÖ§>ø˜¬ F¿–¸Ñz´®Fì`Iå† 4¿i œI@*7$&Ÿ¸i4ÓÈÌ1L¨ò'Rc"’+m} ¾æ¬‰¬«Pyó;±C ±< ÖÕÈ*aj¥›F[„KÒ”Ÿ¡R§ö›ž|â´œF³ýxA6¯F4ŠIëðú¢hD•šAÍ«ÑB‘&÷OÞÄĪ‘Á¦1”|B;<ó2Š9w‡'¬Æ@ÞjZòI¡Ž¶Œ–ÕDRòI¯4Vô7Ú:®›{Ò©wÇDãÞ¾ìÓû½ûãCýjš˜bjô?tœ4òy·hÞîIPR1÷,=3*{x®DcEc0ߢ4šÑ›¿14}Ô‚µ7ïwT¿ÕÄQdØœþÔx—P#ºi›«Ã¥oPe2¬òØ%7®¢Fë6hf]9»îлõ¸q5®dÕÂŽ ðXÕ_Ó}j’Ξ—Ƙéå]#Ù¶« 71#Y>1Ãd*µ“6hFó±ɶߎ{$Ä,ÌjØBcú]¿e8\%‘£FÜyh$} /Pú®ß‡!Ë6šóµˆà´äÓˆ—ר‰‘«ÆU*"v£¡M /+¨1¹‰9~5†bTº±Fo¸o†mâN#Éña¶1ñ®ß‡Á«ÆÈUšNšVU.R=<›hŒlÅIb1ÛæR†‡[‹À“Kùç/<=-ÉÇU¼ß¦U$´&û2j$)¿f1]ÚGBsa¨'lp5 w½±hçŽ/õĈíäeÔ¸~ðÒȆS¸ž›1qhøÔxPça¢b1hq Ô#Ff|j uÈCº¬` ð…GÉQ±ÇQ8hdžñ¨ýj g ]c'-ЈGšŽ–Z¤ù ì›UiøÕO#95jb|ýFî#¡MŒ¦ÑÕÄ$«I˜°xgA{#p7ÁüH,¾Æ@,Æì7Ñës^€Ž™{b@î𤪑ÒÖ#1µÛ÷gÎ _pq“y4Æ>­lȶ?g”ݬ·7x#’9ª1äÞ‰ÆdÛÈb1ú¸ˆïÕ”±º ju Ç¢¸Í²;ÊQ#ŘCc²ú`z#àZÝvÐÅ,ÛˆÎ]l©]ï ^k¶ãÕ«FÖÐ~£Ôv8š^|ksüj ?TÕ49<³ÍdìÏü»Šux‚W‡3J§¶Æbngl‹Åœ´ –GoþƃЛ÷û Üj,‚[Ep«±n5Á­Æ"¸ÕX·‹àVcÜj,§soç~’™®…áTc&/×T²G9ºJz EGð¨ñ¦1·‹àZjxÚ‰»¤#Ék©1i.|*Rc[ \O:¾¥Àœí(‰Þƒ5&\™™Æ@Î Ïåã'ŠþÛ¹SÛ`hŒ¼¥Ân„Õ˜ý[hôgpåÑX$ŸBq(dºáí£"$ÛÆ*jŒ¢Ñ}¢¶ Û‘F“ gŽ!|?£Û˜E£™“#\kPçÀrmõ)™ó]³W†ekãæ"¹hD™pæ˜ÃÔR#š“ã¡QÈ“â4’$©  ‚F³œ˜Çª©ÑáT#;hDeÂ6*€U\BºG1?÷Þã¿]ªñ8ûR£jsõÓBÑý”Ôr„9Ó} IK:UãˆïÖ½äጃ›¡r4v¦F•N±4Ú¸ÕÈhÔ"ñ=Ót =˜lÔu!Û¸nWcB—ë4r#¦Ñ,ÀO÷۪ƌz+!Ç,Jš'EÞ#Š‚@#¦r]Ž^ßMA¾ÿFD55âòúsr,$’Fä½™PœF5ßnÏM£2yy4Ž0ªF+`ä )¹½Š÷.D „ ™4šBœFüÕOcÅ™4]”Ð1O ïÝÂ;“i¥(‹FÔ|ùÖ£›˜Š37/ !Õs°i”œÕ8Î2$ÓÈû6d¡^¹îå Û¨N FüKD#Ð †häpó°UÕˆf"X4B£W™ÛZVe4Ö‰©4âåA£R.†¸° ª«Ñš¥·9O ïÝâ4ö“ߨlãˆ'X4FÌ“Z~1ÿíâÚ6¶Aã.3${£¡üF(O¨«FŽÒ4:ÂÊÁÄ<ÄnÔS£}½KK´M`ç7šÿeÐkdP×^GbžZ xP‰š.k̉ ¹€>#ƒšFÔB4ê - *a°Gƒj(èÌLé[¸6c‘RÿÖ{E}Ž®Õhþ[4*%N°i”›^—€žÕh™¨”ø ‰©‘/ö¶IýeÛi©A¢Q«4…F³X@Ù¶ ÒHýÄ»énKؘ3¦‰é/¿‘X8B£é²îø€5æŒìðô—m+ÀÛãÞÒïXêÓØY¶­TûƒÑzj9RããÛ·™Æ¯¶Ñ*eÙ&Äã ~DåNC#L<~ ä7–¤ÑÁEcƹeϧ.¡Æ²-5¶N&ÔÁi\ (ÒÍíæ©õ€sBÄp]Ãù94zf"°•¦0n, j}D»Úp~cê(Fè^æÿ¬ïÓ§qä›s^Ô†Õ˜´Íˆ™ P>h¬‘më‰0@ú ±†­óµhDÖÏ6¹ÓXKÎ&fþ 41œF­XÓÄ(lbjÎD;<@ ¨¡bP‡Ç,i­ÃsÖ™Ñx™-Vê3ÎDpõb;Rã‘hO'ͶÝ{fÛî½Çþò!ÿêoAoÙ¶ÐÞÓ‹NŠÖž^tR¡ÆGƒÐ›‚¨Æ·£ê„°Õx³˜K¿Ž>¢s‚©ñõèã9-ˆÿúº_¹/£F'>_}k¯‚ J¾ xY¾ü,(5~>9_ð:åI]ýbaRã«÷B¼‚ý5`áAãø?’K¾åendstream endobj 150 0 obj 67 endobj 153 0 obj << /Length 1326 /Filter /FlateDecode >> stream xÚWKÛ6¾ï¯0z¢RøÔ£=¥)š¦ÜöÐm­¥õj£‡W’ƒ ‡þöÎCY²åÝ XÀ¢†Ãá§3ßpņߨd|“(e:I6»æ†“ùã QáÜåûíÍ«7Fl2ž‰Íö~d[üÍ~xÈ`c„‚õA¨”bòÛ ÔZ³m*vÄÙ®¯ò:e–äþÙþ|óÓvÚØHù4tù lqª#¡´±ØJÜ1a;„VŒê ÁXkʆî®÷o ëÄ“óx‰‰’XÅ£}C.‹-ÁC&’<þ Rͺ¾.Ö‚É,RÈç‚¥QvÚî#¼ÜÁ,½u¹«ºì`‹²¢ìÞú FM7LÙ±,1k;4} LÌòýË cÁ©)É^ﻞ¶ÝÕÕ¬<Izww`éç´mB!²È$&†‘Š„á.5îÀ\ÆÃ9Ë»+¬èL¦_MñûúYA ”`¿!ðЮD6øÎÔó|KýÇ-7œœôÜIGRKMN¿°?B¬Ùë@6®EWIÙ)¼p ÛÎ=9žS[Öîµ@JþÓ1"ÏycÇî„ðËçu ­I”¦©Ç» ’„ðÖÃH ìòDÏ@bÎþÄÚE¤)Ôü|t"a<¸“µ³˜?¡£ü&úRt!çÒc^½µÙì‘‹ì8Šk\§¸"}mIØ!Æìi²’ù‹Û¦¨%ª-ºp  y瞎ÌÊÁACáJ ‡vQYÓ+|Ë…ëþØŸÜ\%–ç ¦Œ‰ —›ØÿJ T( ÚÎÎTÌ»…s¿%»‡Œ¼©öGª=D"#x‘ç@4W‘Ñ\,¬èéä÷”Ë€óLQš½w‡pgøùj7:âij^¬vuQí¸Ã Õž‰8{.r¨e’œåÙÿ©ûŒ?_÷F/J V˜Ì 4TVÄ 1g»Ž´f*|š(÷<6ùY[®x€Mv7n=GÛgÁsêu`¤9îúï£W˜±#µ­\zìŸ/ÞÍÈB+ÈÑÄcÞúˆØeóÈçäÓ”nЙ5‡”Î2̲Wo¹ù±»ù}-ß×Ðã5ÐGü2ñ•O|{Ç0}°ëCî^?¦Î‰Îd{‡Z+D  ¥†3æZÚ=|×KÛuµS«‰…T:ý‚¹c?t½ã ¢tCšuí´¢·Â?¯ÊŸ\z¯…ʦâ¼Ý¢kMÖ¸!F?â¬ög×rfêÕõlG3ÕB¼Þ±aˆd5Ý1ªÑãÖôy ªÝщ"ê|ÃÛÁw³CµÇ³©0«v¹³9„(ÃŽ˧rñP¦†lùÓ²»¼ú|Ú~ÍcçåÝ-A¶oÂË©E}±¿Ã QbÌåÁVžR)ëo¹TŽܳ*È>] ƒg y€²øµKçbÏ{‹Î ,œµ4p3&l®ÝÌ—û2.G2øúý^µ`S1ãÕ~¦¤B_;[mÑ·ÑPùN:Ðm·Æ €ô«÷ V§§ïRü¤,ƒ{½¦µY‚A—H PÛ}9®^[”‰b®ÕBcíÖ{ÎîVöÕ^‰Û]uÈÉrõþÝ.Icù‹såæ'JœÝœTÌþhËT•øvùOÒÒìeáá,Yõe5ú‹R,#)´Xž‚—=*=R&´ÒÁíWÜ0›ÕS~€Ÿý­ÏÝê{›†¾šÐRPÜûüËü_¾Ò¥K¹ÜŒ2Ta:·¶Pgù> endobj 155 0 obj << /Type /Annot /Border [0 0 0] /Rect [355.502 655.1059 403.5401 666.0149] /Subtype /Link /A << /S /GoTo /D (figlookatworld) >> >> endobj 154 0 obj << /D [152 0 R /XYZ 90 720 null] >> endobj 156 0 obj << /D [152 0 R /XYZ 90 631.5317 null] >> endobj 151 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F54 117 0 R >> /XObject << /Im2 141 0 R >> /ProcSet [ /PDF /Text ] >> endobj 157 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/color.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 158 0 R /BBox [0.00000000 0.00000000 106.00000000 104.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 159 0 R >>/XObject << /R8 160 0 R >>>> /Length 161 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h`j4406R0Ô³´43°T0ц… .ù\@!Ùendstream endobj 158 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150406) /ModDate (D:20070503150406) /Title (blah-000.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 159 0 obj << /Type /ExtGState /OPM 1 >> endobj 160 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 220 /Height 215 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 220 /Colors 3 >> /Length 2968 >> stream xœí=’Ô:…ïÛ èBV@$L2UÄ,ƒd’Þ9 ªf“±žg0ãÑèÏWÖ•tu}¾ªqu«Õú±NI¶¥ùPÆËßïß¿[$ýððpww×"q0„Ömº¤ÿñãÇ'Q.ï_¿~-x\J¿$»U@<}û[·é’þׯ_ÿ‰r •þö«OŒ¢]›.)¿yóÆwJÙ<è±P¤%š¶iÜ)WµâˆcÏ£«½¸Sj(%Žç9ºãÆûŒS.jmaÎxDµwÊE­®°q¹\¢ÚK:¥Ôu¢5³á×2p”:.­¹6k}j«(Ëœ²~†uÙ·îå®ãHµ©Û!;e}êÓ5Ü?^ñi…°Mù3/_¾¸élÞ×Ï)‹h ÝÊ€H¹C´M—&ã4mMg§\E  ÒÁ)™¢$§eçsJˆR%NI-;“Sfévën©pÃÀ)Ÿ•ž ÏEJ”nx‹×æ1蔥7xÜ_çŒ&ÖÍSÕn8Lˆ»îPÔ{hqJf®^äR§döÝ´§°¼²·OO%ͼ;lM¶û£Õå”E¢tóæ;eQß͉| /“pœ’ß“(rÊÝ,=–¼Eœ²´fŠõT¢$†SºoçpÊhÑó”:%¦8íà¸X©Å)Q䔜¥g„¸ÄÇà컦¸÷=\§|Vz’; 8å³:À)‡§|Vz‚Sê µSòS€S‚?´vʦ4á”àMòp:GœrÊY%™9Þýeø:Γ7%‰¤&Õ¦9§\ï¾,ï]µn·d*ÙN ‹`CH%å:¥«Ô?¢¼½½õ²ÄºoЇÕ)]‰?uß[ÐãÇý‹NÅÍÍM¸½Àåry&J×EQ¾|ù²w1Áiøõë×*ÊgòDé΀è¯SB” ×ëõÝ»w›S²fß®S.ŠXz`?~,ÇM”Üë”ä8%D dñDI‡r–®?!…­¶4˜S*¬^È:R] Ehkµµ„R³mU]E¨jµ­„RIõ¢@”!ªZ-%J‚Sž U­§PÕjpJzÎXU­§ ›(Û]4PÕjpJúT¹é¨CU«õvÊ%õõÅ·oßWí)G//ˆ2$U…­½Vú´Z?§\«·ÕÊ{Ûˆ’C¦ÕܳקÕú9e(Ž0¤%U­ÖÉ)wkâv®›.¯£=~*~*‘h³g¦¯ÊÑÊF-'_N/\‰(½@‘†óèä”yQºÂá×™ªD™ÆÌ(J‘† £Å)Suö~d)E.ÊT‡˜ï+uŠ’sÎwÃ=T8%%fy¥¢ôBfe'bC”^Rz2ìÑê2>|L™ê¹ò(lˆ’Óaª˜}‹ôªDV?˜šú(e¦„­EI=¯S2ç(ùñõ,0œb½Dø ¢ä7"¿áÂÂh¹£ã†§&¤aè%• Ô,Êð£”ñë¼£Ã9ç» ç{ßH;ݷJD9<%$€ÈuÊhä¦ÅvQÕjpJDîèd"¯@”pÊ ßûœRˆR8¥¥,pJ JYà”@”²´rÊëõ:¨F\ÄEÙ§ÊME©ªÕ„RUÝRÈŠ²[•Û‰R[«I:%R`J 8¥YÞ¿?ºGøþý;œÒ,‹(?þ<ºżxñb¼S®%‚¬³"3¢à”¥,Ÿ>}Z[ÄŒ(©Ò)Kt¥GQ¾zõ*üèíÛ·•5LñóçÏF)e=cÆDY딣Dy½^‡àGŽfg“¢$…NÉ,‰lÝÖnÌTv0)JN Qò1)J‚SNIQ 8e4'ˆ²&EIpÊ©1)JŒ)çÆ¤( N95&E §œ“¢$8åÔ˜å°{ߥ&EI£ž‚(E0)JNÉ\D²ˆ’¿Ü¢TËNÙhYD©ENÉÆìbL”4Ä)¡HYŒ‰ktì`F”„ÕŒf0#J8¥̈’à”f0#J¬f´€±%¶„uß³co‰­ŒSæ·›÷P~ßo®e¾&/žSýSB´÷9<̈RÃ2_“¢”žr÷ÿòM!ÊY 1)JjñegpGgˆ²3Šî}C”"˜¥®ÕŒ€(;§Üg®e¾&E §ô™k™¯IQÒ(§Ä‚FAŒ‰rŒSB‘²%aŽ̈«í`F”„5:0¶p «§ÇÞÂ1ªqÊÔ³‡wòUŽÂ5e&/ U9%D™¢Ûš2“¢$ñ5:³?º–AáH“¢Äó”@”-Àó”U@”-hµšÑåî#•¥“ Jñë”eDɧá“ç‹™@”^L‚([ÜÑ(= J> ïèð÷o(½˜Q¶Û!¢Ü€(ù(º÷ Qn1 ¢Tò”D¹Å$ˆNy…kÊLŠ’à”|®)3)ÊaN‰e:‚%á3À˜(±FÇfDIX͆§ê0è”X‰65‹ :%D9/ë-³N¹®}±ÉɬSB”Ó‘%Á)Á(à”@pJ 8%Pœ¨ã¤N¹ýƒŠm‘à~êÅÙýbfí‡l¦™øüL3JÃ9£SzÒÙ]E´EÈ|q÷ßXífÊÜ,U‘LwkZzêŽqF§,:³E[*d"L-J~‚"trʰ¯¡½.,Õe¤¾bC”©tDDYš¸)§Œ¶ewÀrCÂsA ]Ö‹23ÓSWŠÒ}»›'~åÏ/¬©5§Ì7a>Â1_i!JJ·PiRE¦[:f-Í”_S槆aNIYÍí~½ƒ(ù#0N©*Ey,¼]M™µ8Æ0§¬«1ÏDÉÉTVÍ"ôsJ/$Sçpºs¬Ë¨屦œè¤º‘Ýp‘×dZj§¬<¥¢äq9•*Í´§(wN:E©bLÙh¢C13&†(S_d–Š“i4ñÒp~¦™¬&ÓJÎ8ûÊQá”ôøû ¦©^ƒ*®SåhqÊ-d}}¼ïÖŒ)rÎxï(çŒO åÀ):à”@pJ 8%Pœ¨N Ôaß)±eõ¤˜uJ(r^l:%˜ƒN fÇ Sb'ß© ·—&N QÎKt{i;N‰KBÓë”@ö¯SB”Ó§ê€SuÀ):ú9%sµüú‚¿OAˆrRÊœòöövuG÷("ÊèÛow£k!ÊÝõÝö(Š@å+°Ëq§„"A#:åÀƒ3Pì”Ëg#Ë ÎASº;ЖS®¯qıç1甂¬¦Û"e0ЦmwJñ<Ö‘ti†vmwJo7Àú#=n¨µí›…ãìÇÖmúä”íf6[¥úÓ´Mÿ‰Uü3èÆendstream endobj 161 0 obj 62 endobj 164 0 obj << /Length 1729 /Filter /FlateDecode >> stream xÚ­]oÛ6ð=¿ÂØ“Ì,¿$’{˲vè°­íí¥éÆVm¶éJvWôa¿}w°Kla®0™ë:d‰&ÊÁ²‹ËU»÷ rÃ+>'–@6RW‰ÍODgNY±Ú(‘ž Ê ™¡úoJÔ ^VmØ5„p¹`æ/È$P&n«Ëý2ze©…fZ`˜ÅDÅÉý£ þïV™ÑA !$':°rYk[¼ìQ謩¹,îлŸéÝ“³I©œ(š‹"Ð#†Q‹–'~òD`hÉ ¿š“©bFd+—mE!Œñ¥17ÃE[&Ñ,O0WÁ+;*>kxͤ–zå¿XÒX÷аoŽX'k5›æ1³~ ÂbEg+^3”øÄ×MtÓ¡ýˆñÔ€#$)JäÑD›!m,mˆnûˆ@…‚p×et"‘€GÁË^çiõÒÿ¦å:ù¾ Ûñc›Õø‹6¢l ܃+'Œb ¯#LÛ€'>NRd™S)i˜8nsšZfã“:XÛ¢i;ßün힪á6lÖÑiÍÚÄEB¾¥*sø›ê^ ÍuznñDÓžCñOEx?8·ï³cÂίXe\9(³‚Iå¨Ì¾Â£' —óušö‹cç×Êþ?œ¥B{¤üd€6õNéª"I48ßœ;6ÉαEº°ñnfl/Ðiû„Úh¸¼îÃm—È$V[ʶó”-¢¶Ì˜ÚœÅ*D9Ažªªéaæ7փˆºsïÓQxü‘1èÎ(¤¹B?´’A8>o)Ô•‚(qÚíÂC0…mÚ(ïŒ;8¡DîQoýâºx‡B©âEiLáÉ£ý¬K¡sÕ2of[¼J¡Í»±åQ©S»>_¿ŸçÓKU 3)³¾k £©RU´W›öÑŒ ÃNtî¸ ó}š3íªz*áR[÷¸,UÍ„ºÂqë‘zMÚ|N·Û]tUZL¥@m$•ªñt:B°ºÜªpâ˜âÕ©;:ÛûÍÁ?ïàWݵ¡¸ÇgÂÇCŸ›ªŠ„ìSyΞ§BEX;tX4Òa“;Mé Ê34þ/wE;FÜúLg»kÚÖ‡kÔýñ† =ÌIMjýßx`µöSCˆQ|N£ ÷ã¢Ý´è&¿Îàx ŠñÄÂÈî$&r> endobj 167 0 obj << /Type /Annot /Border [0 0 0] /Rect [188.394 242.2733 236.7577 253.1823] /Subtype /Link /A << /S /GoTo /D (figcolorchooser) >> >> endobj 165 0 obj << /D [163 0 R /XYZ 90 720 null] >> endobj 166 0 obj << /D [163 0 R /XYZ 90 684.1345 null] >> endobj 168 0 obj << /D [163 0 R /XYZ 90 231.8498 null] >> endobj 162 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R >> /XObject << /Im3 146 0 R /Im4 157 0 R >> /ProcSet [ /PDF /Text ] >> endobj 169 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/secondlinelist.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 170 0 R /BBox [0.00000000 0.00000000 158.00000000 270.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 171 0 R >>/XObject << /R8 172 0 R >>>> /Length 173 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjn©g62³4×3ª2¶´01¶P0Ô3´´42(·PpÉç B€Mendstream endobj 170 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150403) /ModDate (D:20070503150403) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 171 0 obj << /Type /ExtGState /OPM 1 >> endobj 172 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 329 /Height 562 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 329 >> /Length 6026 >> stream xœí;–ܶE᡼ԑ:Ô¼–Uò& atÒIžƒ{J*’×ê(”"§o*¯È"€‹ÿï€Y÷´Ý]E²ˆË£ âKÔo‚…Ñoâߨîo;2¹Þî?1ýøº8ùãsðçc9AdÿóüÜ‘Šìbqr}Òrè?îAµ 3âãÛÊdìˆ76rU܈?6&?þàŸúŸÕJÉäè`Žü#Ä‚¢bòëN™ä„z ¨˜ü­ ±Âú}CQ1ª =Y%H|.½Þ¯“þ¢éÙÊîàõ†ªƒ‹s“%'8«‚†‰Õb³8y_¶Ëcr;Ñv®÷¯÷ó,ÿŸKîõª=«Å_é¯oê™”îÓÉ$“†“÷ËobòÝóò,*crÍÞµL:H.¹ý]è¿×~LÚNÚÿ\(&í†Î»ÉÇŽ¯¤Ì9‰‹«ôõš™¬É¯¦_ß#I!Tî>—äz¿šx2i9¹xn2i9ix , “†“¥LÚç}O0IßžÂIÊäò«–IÇK›É“—7Â(Œ%ºì>{hÏúäÙµcçÜb&ab&AJ2ind&ÃJ0iyÉL•bÒ³Ýeò‡¨öímø0è®?¡ë½[ìß®™|_Fl?¾Ý›3^ýØ~V¯7´C3ùßõ0ï®Ö¿ë4¶oY?>Ä_ƒã9¬þóï2”-~_\îýÒ1õýïe¦ÀæärÃìdîNše73Y©•IZŸd&+ÅL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢”bòòøs»ÜÄý?VX)&¥}'Ṵ̀’LÞèKv2¬"&ïYýöÈðËŸû[6V+—I»ÿäÿ,­$“ëïur1sº£&±“¶ÊËn²…ETÁ$;éU“²Äa' •1¹Ù¸Õ‚„;±¸Ý÷¡ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢”`òû°À¡?Éë“ìdL¯†U)&ÿ´?Î’ú$,'ãL²“A9N2“•b&Qb&Qb&Qb&Qb&QªdÒœŒRvGúv`ðøÌ]FvÞW2ÙÝIó£ÙN>~2SŪŽÉ>FO[‚¤5¤ŽI9éBO¸Éiô­ž=$·=¦‘¹Db;ucΑ/ s>ÒE¨hŽÇ$q’Î ºÿ¯.Íݵmw6x$Ç…Nä/]¢*&IØž¹A­t—1}ÈÆšº@Œˆì?5©ŠÉV'×ÉD'}úµ:Vø?;¡“;0©r¬ï@²ÏxmA}'3˜Ô9QÝé©3æáqÒ{¼{`p¿ð99ØÈ*&•‰ª\ö•8¦tú}¼g›b2¸ß*i&t2—ÉGµDè—º†òxk8©kAä£[-èbŸã¦­²¢®Mëdm»ÛºßuÙÛŠ¯}´YQ!ú‚¬yæ¾içÞ©è%ÆÌ?—¤Ìqþ·ám%ÆøN0•¸%îŸD‰™D‰™D‰™D©É×½ã;’J˜d#c*`’•-žÓ‹3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰RÖºjÉ%™cϰi[D4k½ 9Ï'g3ÎI=Ií Nf¬a¹’~IÎ|'sÖ°ºl‹‘Ù÷¿îâžÖô²z,&!çì¨ÌuÕ.j¢¾o.dp2~ø¦!ÓIÌ9;ªI¹Eß»œ‰Ìôo=î"¢íçì¨2&e¦&+yzÜAænÌ9;ª’IcŸÉí¨ú˶œ„œ³£òËn¯“žG!¬J ì> 9gGÕ'}3éÇ3[ÿ™Jœü6ŽšioÌ ×#Åì“Ö‚¸Ý ÷¡ÄL¢ÄL¢ÄL¢e²ïJº)è©ØS.28Æd×ËY—üînÚ!éJ%"Ž3Ùo¾þcºûwñ²¼ùòÏú[ì“t¥RÇ™ÜÇÉ/âúbÇ5·“¾ˆg`ò,N&˜¼têfÄuGþ5“žK©ˆ“L²“›ÒNŽfr G½ I›½£™½ºŠRg²ÙI5¼$ßrr0“[4ú•NšöËGd$÷v2ñp&óœÜƈU%é±´,¼Ü¬/†D)íäX&_ÅUn}M8YöFÈã„”' Ùa”Šx4“¯*,Ÿ“êxß°3jD†–]t£TÄ£™|Ñ[“¹[˜n§ :)“)ñp&éö2'Íábáe¨´“£ï“R×Ô}2”«UÙ=ÚÉ“7¼—†“¿db¹NZ%Ž3]©s‰SÏälN: ®é6Ž\ß­o-Hošì>q2¬“Rwöñ÷ÉR'G-¸–º³ÉA ®¥"Ýg^™»(íäØ>ó39ÉL扙D‰™DéÐLfõ™—?ÆVv¨TºWmb&óœ¤ÓŽsÕâd°WíLFd>d©ÁÉêvw'Õ´»££æ$jã»_ô&ãó•W·»;©ÂÉøèCà ðçj#>&“Û»œÑ³ï÷²Áù\mÄ'`2>ú@r·ääÌLŒ>èÜÍL69é±m:&ãµ¹ZáFŒú¤ûÝ/Á'Øj#®gr6'Z¤£¾?Fh7…ó[ŸZÐÄ÷ɰ:üÛ¦tèû¤W£GNÄäàчó09J'dr˜I”˜I”˜I”@LZ\\\ÈÑs3ºxÇ0©êo3:©Z‹îf¤ LêɈ£œŒH÷`x6…`Rwýá¦wö}0Öo±Þ·×åLZ}*u}‰ÒÔÔ¯ >úéÉÄDÜÔ?9ÌÉòчÈ ˆ˜|¼?ßÒiô!v(âöúäÜNÊnÝàÍ‘ƒÚ83”8éчÁ%Nvgx-ÈŠÃ}] :d»^ïNë|}AóŽ>ŽÉiGŽÆä(ÉAb&Qb&Qb&Q‚0y©/,­ŠŸz‹ë3/«[ÖWDý“êqôŠŸÉÉ$“îý¼ANV¥Ý|°!Pÿ¤ŽB?Ó¯úoìOvßt“WöÇóÜèC0 ó8+øòê=¨ÏÜpRužêg5H§–Ñ-£Ì°»ep£¡$¬ÿiðU‹dtaRþ@u¥ÎnãrÜú 7ú`ÜÂý˜ft]–=˜¤—`=k voYO;íéµ’(sR~éd“ö³Î?7ÉzLF´“(f²LȲۈÂýjœ¨“v–ÜÙI;[wq2¿>IïÝÒIZâÐ[{‡GåêD‰ã?ÎûëdAG®l$¯OnRñêÝ´ã_Ö“V›jABÝš±¡+^¡ãdtýjA‡lwçæÎŠ\Òùú‚r3&z”â„LæfLð(ÅüLFV—JÓ3[]v*ÍÎd(®#:9þ»H|qÑIf2OÈv÷C´¡Ö/®ì>sÙ_Ô}2²/è!Òâð+Ëg˜“nŠÀÚ8U&ãáöp2®IœL3©{óUߘÙx%óïn™‘åLGH ¡C ˜´{òUîö÷¶ôÊÝ‘ù¥²ÓÄì—·ñÏ>'ížB÷mu\£ÆošÐû>û`\”ÏI:ÂÐWÁèéàSé“-“2i\—µÇah« ÏÜ.uhâ6'“q'õ°ÃD¢l¼\Ÿù¤NZ¡t²t£Ž£mG…`òb:xš¾è¸*F.j©cá}¢-`ÈÚ,º(<€Ž«rô!và¥)`lÿ¤·‹°.Ót}Â`[ÀØ>s'¶í:;ÄU3ú@»ÿ„ßÉú€w`²N½úÌ·,c²SÄmLÎédøo_'k˜Râ$GìÜ÷}Kœ &Õ‚‚‰»÷IY!¢h ¸c»»%§ì?úÐí¢.}A€€G@Ã}˜lØsô3\Áý“(qÿ$JÌ$JÌ$JÌ$Jøyæ>YÇd´Ë jæ¾–áãåú;¦´OŸyO'/7ròÑ›ŠÏ:A­F1Ù—JZ¹J5™ØnNf>û Ãv… K ØÃy/×Ií=·ºq.Ì!µéÑ Ÿ¡Cæ™n¾¹Ý1î\ÔTÇK¦“¤Ã3BpõõÙ3SÛ„géýS×­zn¢ÑçŽ>ÐÞ ·M˜¬áØ· ;Ïܾ ÑÙI’»Izî?¢öƒx«pLÚ@È+èë¤/=sÓEeå£0)ܵ–h¼'C—P\ J9ér:/“FábÝö{•8BëlNî Åßö/q²™TäÙ„êøZ*3禷N™˜Q3>1“ZÑì Ž«¶Ý Ï#`_¬Qî×ÌeÒí×äþÉ“¾ˆãL¾Š~J´{&]©Tk1Âd׫ù妰WÒ•ŠGc’U (“¬1“(1“(%ÊVsú&]©xÄñúdG½FÙŸÑÉDÄq&Õ˜ÅñOvŠ_B;þ!g¡•Z_\uI…“¡’ˆãL¾¨`®/3¸ …~}Yöü“W]Ò%ád¨(â &—³]E‰“Þ$×>f!#Ës²4é‚p2Tq’Éå\¿ÌÁÉ„bNþº7_×Èrœ,Oº œ •Eœ`òq1è¤xD–v²&é‚p2TqœÉWÙ²D:¹–̯)'«’.'Ce'˜ü)Õ(¤“K ç%ÍdMÒád¨,âä}òqA8'רòî“åI„“¡²ˆ3ÊîŸëŒ“Wy¦¼²»4é‚p2TqV}ò§(sòêßñòå*t=1¯>Y–tQ8*‰8³ó³ÄÉPä÷¸HË%·S’tQ8*‰8YvwSºìžM Lv}Ç5¡‘ L² Ä}æ(1“(1“(1“(1“(1“(1“(1“(1“(E™ü40°ƒ(s®;™ÒUOË`&[t†“Q&ù¦Ñw!ò™d'#²d&kÅL¢ÄL¢„dÒ¿bÏÍ}ÓçñÖÁB2©ž°¦âNžÈS(“öŠ=!'#Ž+8“äAõËcÍò=aò¢Ž8‰àLÚ+I+;h'­õ,N (“ëoÂ]MEn“» «ÓÎ ü}r}µüŠ:)è^§þ>)„ñe!'Õ:*gQ&åz¼Nò}2(ƒÉK'3˜d'-Ý-©erºUΆê“ð:™Å$;Ip’™,3‰3‰3‰3‰3‰3‰3‰3‰R“'lW“ì$ß'Qâû$JÌ$J-Lþ="àiõ¿&ÙIª€“¹LÞ.jyi+²Ë{`ðøì P#“Ý4?z@'3™ìcdð´3ÙÈä2§o}Àá"ÔW«y|úíE˜_é÷xQÇ©Î9è¼@ß~AÏñ˜`8JÍL'oöõ•ÏÖ.õl‰µÁs 9.t"ûø1jbrîñ –ÂÀS˜o]7zÁ6Ö’=a;Ù7“yL¶:)gìûœ4öé×êXáÿìtNî¤ʱ¾É>ãµõôNfö A<±í2ÿ“Þã݃ûÅœÌ쟲8ú¥]â˜ЂÁ>Þ³–8þýô¸ÌgR>½¤^Úµ ÃI] "ÝjA7ûô‹¬eE)\ šÔÉúv·u)¾+³·_ý8»"jlw²êƾª²·ú\bÌèúwXP&eŽó¿ o+1Æw‚)ÔtŸð´â>s”Çq¬Õ.ʃ<ò¢-Lvwò8¦¶1ÙÇÈS9™É¤|4[>©½6êtG¤|{3+ìÛûí°ò©eóy¢ùŸZnf’8é´ßtûÄ×Äólðh¯ë2­šçmNÒuèÝÎZ¼Á:ÄÝh¯M`.1³šçµ8¹5¤½Nû¯çÖH&UŽöHö©.Œ©Õ4CåÄ‹Ð/oÔ\ýGxœôïhäøiÕÂäßÒDU.ûJÓ R8Ç{¶¿ÄÉgRùÉ—v-ÈpRׂÈG·ZÐÅ>éÖC7Ó Þî¶r¡/SÚۦϸYBΟ´r¡/Sz3ꩬcÒj‹øš&Þmgv’û'‹Åý“(1“(1“(1“(µ0É«/™ªf’´TËäˆX'W“#_L~çTÎ$+$^%f%f%f¥"&¯#"<²™d#Êe’L)“IVøû»Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&Qb&QJ3y1§“ú§’žc‚i“RLªGåÔÇ3õðÇs+ÅäöBÊIVšI2)_.GCWœú©ûiÙ'Sò>I–53Y2ŸRò<ûlÊ(»Çë<Ï,z®{.eÕ'õ²=“ê店\”WŸ$_›/åv2¿ì9y¹±“«²ë“ù%Îó:™ÙÆ Õ‚„rSð¤Nr»"î B‰™D‰™D‰™D‰™D‰™D)Á$?}Â8Á$;“ñ@g’I~°;¨OÂr2Î$;”ã$3Y)f%f%f%f%f¥J&£Ó0rvy Ÿy¢¡}ó•LvwÒüè!Ìb²‘ÁÓÁÈJ&í…‰;¯°ïIƒžãF'† S5“t>Kïö'rŽŸËÉ&UØû¬°<Ùgœ{ˆª˜lu²p…}ãDÂÿÙ ÜÉÒö=iÁÉ &uNÜe…}w¿ð99ØÈ*&•‰û¬°ïßo•4:™Ë$]þ¾ï ûÞ4Œ‰Is:YÛî¶.Äw]ö¶âkmVTˆ¾ =VØŸ¾:„É=VØŸþŸ%îŸD‰™D‰™D‰™D©I^>¢&ÙȘ ˜de‹çô¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢ÄL¢äa’¿ì¡N.“£#:¨®|Ÿ‰ï“(qÙ3‰3‰3‰3‰3‰3‰3‰3‰3‰3‰RŠÉÊ¥—žp†[ŠÉïUž|zB®“L²“™b&Qb&QÊbòSÉ—·;Yœd»“Ìb²$ëú]¼bj I¢™¼ŠÝ¼‚ê\Iæ2™iÍws²,Év5&™Ë$;™J’™D%ÉL¢’d&QI2“¨$«˜T+UßF8'«‘5Ü+€;©×î1Ö…I$YÁ¤þZP½„ˆ•ÐI}-3'r²”IM¢ZâÇNï¤.µÔÓI’t2Ér&£”ôeÒXð²­¸Ó›I{±P’åLš×fA²Cî¶¿g´³“¾¯6íÀ¤³xJ§çF´V ëàä¶Ag:cU³>Lî›»enz!¬þLªÕÍÉ“l½OîUâXL’={9éÖõL5—ݻׂ&v²±>Ù¹f.qvr² ÄimãP+;;)׷ݘ,©q»’$÷¡’d&QI&ß?þ`&ë“$LþwyÏLÖ&¹0ùvÿ»Þ'…øÁLÖ&¹2yÿûûê$ß'ë“\7'#ewþ£Ê0'Ë’lWc’™ewÁ3ß(' “lWc’yõÉ’‡çAN–&Ù®Æ$yþ$J<%f%f¥$“uËË>§“üŒDüŒJÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$JÌ$J¼N/L“ßFGtXYL~Ï‘E™üüƒZ~“a»?Þ";ŸI #“ÁÄ[l÷é#jÄÆä½äÿ¼‰øþgù¹#õÛ¿0ùý·xñýO£„w'YýW«3!endstream endobj 173 0 obj 69 endobj 176 0 obj << /Length 3639 /Filter /FlateDecode >> stream xÚZK“ܶ¾ëWlåbN•—¾`Ÿ$[¶“8qb+ÎÁ²+Øî.mÎpErdE‡ä¯§_ ÁÌjíÚªhF÷×@_)øÓWV]UƤ6¯ª«íþ™’æ_žiyºŠëäÅ«gü¢ÐWZ¥VY}õêv5È«ÝÉg÷îa£“©Ù\ëdØ\c’ì“ÍužçÉ«Mm’#ööCëºÍufmQ$™ÙüøêÏÏ^¾š'.²ìC¬!ɇxÓ*‡îüª¬óT›¼ ÿÖ#oy]'ýȿӰÉêä§M^eICm6¹檤Ÿþ»)”Jzß¼æiec×¾wünÂ>|Œkò¥NKU`§þJhVLÖ©Æ'¦ˆŽR§¦È<Åw±1JXž1ó´ª&ÊP‚àr¡üþ üÐXÛž—:ÀòûÎP =w9þÙ»©}ϯU¡¢së2­*Ø6úþØÄ¦×Uš•µŸÆÒÀC‘• IÙM0óqp¯•QT©-o녊Ƽº6…Mk]–W×Ú¤ºP¬›o7E™¸®Gµ,3b´…ñºã¾=Ào0*ÎåGFRݨ䳮ÝΫÇ!ˆ©þ††[¤c­?® $Ód]xåøÇŠnI ²Zo{܆CCLʬÇ=ÿ"kím34¢šÜJ”=.ñç#tX°?!onÁP¸^áIÉY˜™±i®ªz-Ì]Ú‘£¶(KŽüغ™QY4I Zz~ùÏs­ ¤}ë7añ8#…ç€÷½ð»“ߟ TšÎÉ29“ˆìO,bj1éÜ!]Ù:Pw¿¢òu¸aü=~14íÔ*bûšŽ}@Kñ‹5ÄÓimiÞ¸?Äö¶àP€)þµ©Á‡nͦ:ÓÙcƒÙT™9\%Ëž F(âÑm’v×± >A MÎȇó:ƒÔáTO=§—OÑôXT^_oÈNðß/h-5¸€¬H¦ À`³Â‡qä%q‹M³}wïíÞÌA¦!”År=¸ñ‡´ðÖ“C´d/¨‰á9=ŠU°t¬¬ Œ“Xc«Å¬àÙ+ ׃£”¦a¥£¦9Ä…À—Í8Ãp=[ƒc²‹Á'(Tis–Ï$¦õãÿÖ[bš˨à ¹#×sŠsir ðÝËÃÚ@('Ç/FYÔ^<.€ƒœ@¸>“©Ó<«ôZ ˜ÍXu0>Ï“ýŠ«ÂVëœ=þ )»¼0×Þ°9üó}˜U9ÚþTq Aì{™Îk@ô3ÃÜÅÞb¿šWÐëbTÂG1»\-®ž[ÐZYDʃ˜›Ìñ¶ Q”vv10YZöw* Si< pt¾ðà]åì?Á ’EAÎAŠíâ̪R…Y±áA[qªqгB0ľèÝ]ïM^þvoj.ð­ô¼;™bßÈYK¬ŒQ¦Y9¡¾ÜµÓ…¨8¯rìŽ+Åç *à[‡v埜ô]Ú!kщz.þʉáFÊÊèõÆ”-~Ãx…—ãdAàï“ËÊôYÙý²œ¢3À0ç¥7°‘êo'™›1>ÙòhÀo¾&—}@©]ûvª<q}MÒÄÒÍG°q.ßÕ}KœaUâ(¯%à74ʽ۳;•ÛFîØ5þ78Ù—&ùÄ t nÂÜ™BC‘áäÓ9,¿ Æ2ʪžKÉ_šÚBV~^úËJ%àUŸ)óƒäÜØwQ™!ÙÄöïPfæâv¼9¦ë<'Å¡C;0á% œ¯láso¸vr‰S©{Ê3²'GhߨäÏQ‘›£‡…‹ÖZÃî®·( ¿à-ʬ.ÏÓ®2â@2ºÙt%ATËÌIÁäù mÅ;rÈs@‹¬]-½a ÉfONF¡ºÒ²€ä|>P¶‹#†ç.´õè,1Ì»ów7áÇ÷h›*ùº1ÉŽ–MZ¨,¸“ƒ\p|³çgK·6ð—³= C×™×KüˆdÓiÍV†¡ZùáÞ‹¤–8J<^†'±ª²ëœq® d‡jº»£¯MeN]{ðú\¬1{iuî)¦y¿!W附ÊÿH³—K(˜ª»ƒ¯iÑ× ÿ6ï"Â-ìúqºçÇhàŒsÌ Öû÷®IcÁt\yVœ¤rØâ–n'¥_¤£†;®÷Qz“A|yå/4§Ù€›Ôäµsùà3·{èäîà6ÛLwF®´ÈÖIÌùUdiqʈ1YZ©zÅGäV'ûgÃIù­‚\ðÛ¾>æ¾Üa¢9£ø³ÇIv~Nï!økH¹ç-ØQ0Ç•DÿS<–Ï' ø¯è ‡üµïÔA¶t›ö··QK/ÒZÏGK‘¬IÕæ+Åâ#QǨª|ðê­ w “ÍIØJÛ‹cö¼’³{\.žÕ $è9þæ/ÑkCeZ:_*«8þ?å%W1öÄ)ß œTO?ÇŸêãë|Œ Ï·•µ\gêµï0ä;N+´ß­ý‰²|ô3•SéšG•|œÀ6}pOÿ–û{Æ‚ã«J_LúªÝÅÍË´VõŒË•æu^ÿ¶3–ààõQ‡Œw(‹Ø‰%µ¿¬r}ÛI¾‡¿ÔCÈÿÛ¸¤| endstream endobj 175 0 obj << /Type /Page /Contents 176 0 R /Resources 174 0 R /MediaBox [0 0 612 792] /Parent 118 0 R /Annots [ 178 0 R ] >> endobj 178 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.3489 116.5339 332.708 126.2309] /Subtype /Link /A << /S /GoTo /D (figfilespanel) >> >> endobj 177 0 obj << /D [175 0 R /XYZ 90 720 null] >> endobj 174 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R /F67 89 0 R >> /ProcSet [ /PDF /Text ] >> endobj 180 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/trefdodecinter.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 181 0 R /BBox [0.00000000 0.00000000 224.00000000 236.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 182 0 R >>/XObject << /R8 183 0 R >>>> /Length 184 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`ddl¦g6265R0Ô3µ473S0Ö³´430ƒ¨µPpÉç BP/{endstream endobj 181 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150409) /ModDate (D:20070503150409) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 182 0 obj << /Type /ExtGState /OPM 1 >> endobj 183 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 466 /Height 490 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 466 >> /Length 6036 >> stream xœí½‹$Iz‡cýEP2e®¹Æ:m-,²úXKpά%DîyÜ:+³áœ“)£1åL;rNÐhÌAc ÁîÉZóÎìÿ`¥ŠüŒï¬ˆ7"~ùþŠîªÊ¬ÊÌzŸz"¿¢ª>°|"~ þðüH´ œ´Äˆ|xH?|é½<‹ëãùB}‰y~{Ez½öC¿¾'c9ô yþz¶48&ÚW"DVKŸ¿æ ÂE’\-m½,|)q‘kÐÝÒªvƒS- ÉÕÒ·Á}Îù|!¹YêÛ—á}˜Î.âK‘Ï-KÝÛQ¼ÅÛ(Þ}ÙÐZ–fM™S5ÏÂçÒLDßöy#f+S,uNùa™HnÄ›‡}ì‘Óßv'u’‰G‹Ï¥…ȃúågqÜÒ¡?#ÁçDŠÀ4j©†T¾Þã–Îå:P´é)Þçi#nE€4ÏÒëë=n©Z­¥žÚÓ7ba­ S›hè~oÂvÿ:B›âòôím¥<ðAù`Jh©R¬½ˆsµ´Â eÈöD©û/4PH—?0¤¥,5!½±¦lÖÊ(¼FJ{ÆJaž®©™~­MI‹61c–`H—Œ­Ñ´¥œœÄ,5 ²¥$b©c¸méwÏÏÇÇæ}Oy¹’óŒñÙ-}óüµdûæÙýnùÚ3œS9ÞÂûFHK%ÙOÄ7Óøïøù郄ývþ0âõöÿµ^ Îyš»b>!•¾2ÒÑóô“ìu=#•ÛIléðy2¶xÙÒáódì—²¥Ã‡-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKáRÏÒ§R:I^•šP=KŸÊ-ä R°Z-}õÄLSS²X-}%˜ibŠÖª¦¥‚™¦¥l©ªZÊL“R¸Ru-e¦ )]¨Ê–2ÓhŠ×©¶¥Ì4’òeªni¦Ûü8ÚQ¡Jõ-%cê™K×\k‰ÀÒÊLS¦Ý+Ö*5¢°´ÓìIöǵN‰H,-Ïôþrìy]a­T!K #½‰Îé…k5¤$––dzý» ©LXkˆÈÒr‹,úˆÞí7?F'ty]dy§R}êž/åädKÍ…¼ý}x¿\o’Þy¨Ä£ë2‰f¦šÅ(z ¼ÞºÔZì›–ú~»uIA©Åäº7ܘڥd]Zé½ãVfv®Úª¸TGa†X—:Îë]î@—|tl[‘Cu•eK 1-tÊÏÖb¦Î¢Œbi ¦…Ê´…ê.É0–ÞÌôÞyóæ4„ê)È8–ÞÆ´PÑ©¯YêÚKÌ¿î7 •±¡þªüLìøÞà#YjíF'.|=C×XP D5ì*=0F²Ô¸¸ðwÛ¾F% ¢Iëë­ÄX–Š ·î>Ö*CõÆ7zÒ,ˆÎÄdvÉX‰Ö*CÜúzë0œ¥™§îæc<õÊBõ–aÎ2¼¥æè QPµÐec15ætkähèø–êãCDIŠ8Sq k윀¥êD©Š$¦2y\£g,ÝoLŸCs>ºÐÀ&’d¬ñóÿ–®;ÞYD«˜¦ôíİt¾C”¨(Î4©{$ˆ¥ÓïŠÔ"JTä0M@šÖ·ÆÒÀ¦‘I”¨p0=®ibßNK%ÒþˆdšÚ·ÇÒD¢Ä@Eò®Œˆ0MîÛ‰cé] Qz "ƒiizßNKïÄ·®³ÙÑ&@…Íôòwžú™fô턱ôŠÔq:» ¢Ó‹>¤^¦9};Q,•Dí. *Ñv@…ÊtþÐU¦¦Y};Q,‘L¢MŠéò¹H¯¥n¦y};A,]ˆêH;":ïʬ ä'êbšÛ·ÄÒ©Ê´›VwÊ{GÐQ©·Ë+¶¥Q•iO’^óg±®NƒHM¦ùä0,UnL;#:1†‰ ñíž—¶¥*Ñ•i_Íîœ?K¦1¢º¦~>Ø–:öHôÊôcœ¨Î´1ÒV–êD'¦}•LªLOj©‰T¼trÐèhúAÚÈR‹hây޳3=§¥a¤#U˜žÒR@IûAÚÆRDIw¦g´“èÆôŒ–2ÒäÙic)*Ñ•éù,½!¤#]˜žÏR\Iû@Joé€%™žÎÒ? ˜žÐR?Òñ‰J¦ç³ZÒ’[Ú8B zez6KïЉ ñ—³YÊHsFd§…¥?èwñˆ>&ƒié[¡wÆÞâÍú˜LdDvè-½J*³Ce¤ÁÙ¡·tAº1…$šõѧðˆì4³T¬PW¤XD}L¡-•y•T~œæ;ÇPpK…dŠ*©‡)¼¥B¼[®ñˆº™"ZªGj3E´Ô‘¨“éi,Å$êbzK‘¾Ö¿Vý,–¢u0´ôNؼ¸Dm¦€–žKÒFH‰-µ‘"µ˜žÂRl¢’ékå”ð),ÅGªjzKщLñ,56xÅ;|¢SÓK‹”ÔRSÒ3Õ˜ZzR¤SxKÿ¦ÔÌ:Ï´HZz¢ S8K­£H¿ÿÓ`®[Ó g©Ž´ Qш)!RRKýb¹nuaŠgi[¤_l·è™.gÃá,><±„œèÚ=r¨³¦p–*HmÅÙRb¤&Pb¨SÓ liD0}ýÏÒuû¨ ¢ ˜~‡gi¤> 2¤P¯Mï_£ZÚ Qr¦FÐ=ƒ[JI4 T†ê{ñž1ƒ[Jˆ4N””é{ñäÑtlK鈦•¡ƒúþI¸™miD)™þ–)mÁ·„HÓ‰2õi:¬¥W¤TDs€ÊPAõh:®¥wÿ\jú‘ä%d féÝïÿªÔ BÉ*Cõ—ß95ØÒ>%`zŒ( Ó_þ˽2ØÒ>Õ™%JÀôA€”ÜÒÚH•© •)½¥u™ÞF´2Ó_„Dêb:²¥¢*Ó[ÊÔƒ*‰^+S)ù'×®H«1-A´Ó+Q¤äߨòé¿‹_×aZ¨L¨’( ¥W¤òÃüU˜–#Z…éDtFê`:²¥wÓU¦%‰V`ºuk:²¥3RñëÂHË•) •)±¥ÛÏO”eZžha¦3QDK÷¹/xd°P™rP¢3RÓq-ÝÞ‹r‡‘j-ÇT'Z)©¥ QQŠi= 2E ®D‰RZª4»B:ŒT—h¦Q@K5IËhZ›h ¦RÓA-5ˆд>P™¡ÚD+#¥³ToveneJCôF¦¢0–š’Š™R•9u'J†”ÌRÑ›ÎÊP=ÎÔIÔÁtHK]H3¥*sª‡h]¤ä–ªD'¤G˜Ò=ÄT!Jˆ”ÊR'Ñ£š¶ z„©OR KHs™¶*“ ÕKÔ>g dé¦íˆf2õ6»•‘Yê#:#Í`Ú¨L:ÔQK½H3™¶&šÎT%J‹´µ¥ Ò4¦íÊ$AÕˆþÎvEª3ÏRçNé’tMû šÆ´!RKý’fhÚ Ñ¦:Ql© éÓ?Ìצý•‰@ÕˆR#%±4Ôî¾¾,HÃLû"aj´4$ék!¾_nú™öTÆU'JŽ”ÔÒR/Ó‰ú™Æ‰Žoi°Ý R7Ó>Ê8¡ÚD‰‘RX‘4¢i¿DÝLZD‡µ4ŽÔÁ´g¢.¦¢ÄH ,µ»"À´o 2Tƒh ¤–F%U‘êLû'j0uŵ4 ©Ât 2;T“h¤õ-MhwÝLG!º3õ…³4AR'ÒqˆnLû@ZÝÒ¤n¤Ó‘€ÊH¨>¢h–&µ»ÓшJ¦ÑFHÉ, Jj _•Z Âü·5d% fiZ»+ ¦Œôpê[z é€L3ˆ‚X#z6¤÷¶u™¯£HGoy-¤Qj¤µ-½^MP3‘Ç4“èÐ–Š‰iœ(#-K¯¹$ ši€(¤¥×Ü_쇜© ÂÒ¹áÕ±šD‡Þ@2‘†$E±t¾c Ši–¤H–®™±"# JŠféš‹MT¼þ_íî8Ló$}'^à,²#ÝÚb¤aIk#me©£Ý} HcDÅ•)¶¥ÛS ¤Ã0Í•ôŠtäo';!R…¨éüOÉ@–®Kš†tL¦ù’ÖEZÙÒ"M‘”-í;ÙGâÄ–Á´„¤À–ލi I-PÓ"’žÈÒáªD[!íÌÒñZ^?Ò ¢È–§iIÏdéÀH36ŽÎeiçL I mé`š’ÚÒ±4Í"ÃR›é„ô³ÿ0ƒ4F” i3KÝH?Âd:"Ò\¢À–^‰ZH;fZLR\K%Q¤ÙDa-ýl¾†iQ:¤ýXú"~žo ‰4‘èy,}™þc õÀ J féË6dA: Ó,¢„H›õœ‘¾hƒÆÒÔ‰4Lô;ßè, !}±ùvÉ4‹(%R"KïìG8>3TË« M%úÎKn$K—W™†t¨–×ÔËå㼆¡AZýÛɼšæ íiQJ¤D–æµ¼c" ¾ó“ÊÒ2-owL3$>ÒDˆ´þ÷ñbjš)©dú.@nDKq‘¦%DJðÝöZÞË¿Y#úbšMT¼ÈýKhzÂbÚ7Òoíã&s¶ÏÓ!%³ôV¤]15ˆ~kÙܲÚ{ꆃbivË;}GךnH%ÑùûiL ¢0–fk:ÅŠÉ´S¤ë»šDÑ,MFº|iNÇšîD¿ÝÚL-¢'µTü¼~R¿šnHÿ¤5™ÚDq,ÍcºU¦[MÝDM¤Ê÷àÐ"%ù•ácH»ÕÔƒTgê"zVKýšö†ôOæ…©“(¥XL}’z*D,ÍDº•¦o¤Q…©›èy-õ"í‚©_R±-¹‡(’¥Hš$]ÜGÉÒ\¤+ÓáN î%zfK;f&ª{²IÊÒ£L‡Cª~Õ®EÊRMcDÅÇm«×&zKÇÒ4‚ôã¾iç Šei¾¦sm.ÿ¢ì©›èÖP¸‰bYz@Ó©8ÑÓ¤[¿1'ÑÓXlzûD Ú)™¥™^DOLý’îÛ¹R7Q0K]BMo—H-¢êo„H¤¢h–ÑtŽÎ´?¤ú¾¼ø‰ÂYÒÔÇô25c½0u5ÅG¼|ãåƒf馗¹ë©ET¼öó³4ŸéԳ쥦¢ !>x–æ®N—¾‚/½"umŽ”ÖÒ¢•€ óu;Ç–™OK•‘9Ls‰zŸàësP‘¨õÂí‘…fÓÄR}\:Ôl¤Îgx¬*Páxåú¸Rsia©9*™i¤þÊU'êzéʨb3i`©£¬iPó‰šO Ô€¨ûµ/cƶÔ10‰éHCE#*@×¥ž7jÊîŒðÿ¢«/;Ò`ɨˆú5×ÒëK wÃBÍÄzQ§íËÐimšÙ4´–·ã“™Ê¤r½ˆ8P*EE £ZÞÛ΄š†õ-¢"PA-ÙLEë2©è&)Q Æ´4väzJ>Ô«k¤”î4?_ †´4z~iΦpa¤´ŠŠ@F´4~xM>Ô· Rr¢þ* hé~7¾ðÙL!¥(Ãx–*÷R>ê¤ï’zV·ÃYšÔINMÓPãê'·§Z b4K,|Ô<¤íxŠ[ßèi³ °Ô8–ºðëÃâPs6jp×­mBoÐüYÔ·ÔÚ¶KŸÆ.ןܨÕF¾S¾ô¤Qï$§¾¥·n­¯?êÇšˆ´iƒ»ÅWŽ,-±ÿµýì«kø`Â:¶qƒ»ÇSq,-¶GíÇš€´ž2î’ ciÑc$ûo4kXcH»â)ã,Ê(––?êec—ÿØOWY±´ÎqLåÕ%V©ñˆþxÊ8 3†¥õŽL«Xé“§Œ]š!,õî‚•‰Fµ_xžØ;ë#XZjB'É–Ö:y’Š'×hΗ2Q+õN®‘XÊD©vrü|)g ÎùRΚqÏ—2Q_ªÔˆÂR&êM"XÊD©r ¼¶¥L4˜§À+[ÊD#©p ¼®¥L4šò§À«ZÊDRüxMK™hRJŸ¯h)MLáSàõ,e¢É){ ¼ÞùR&šž¢§ÀëõjàädK9RÏRN£°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸ì–¾yþš-Eˆ´ôêæÕÒoä]¶tü\-}¾^Ɇ÷zõ-?O?MWŸOHy]й. RÞâ…oñÂ…÷Ká–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ¶.l)\ØR¸°¥paKá–…-… [ ËÒ·­—ˆsk K¿l½<œÛ£Yúå¾ \vKýàŸ#9 &²[ê}„x æ'Fd¶ôº½ë¿<Šðx¾P_"D¤¥ÁwÅ£çP'Bäj),ÿ)è|Úendstream endobj 184 0 obj 67 endobj 187 0 obj << /Length 1126 /Filter /FlateDecode >> stream xÚ¥VKoÜ6¾ûWèV ¨h’¢D©7§­ƒôÒ´XôR7(#ÉŽÜ]qM­’œúÛ;ák¯‘Cax%‡óüød"àO&µHLžóZ“4‡+Åÿ\Éø–F¶Uy³»º¾-d"¯E-“Ýý™‘]û'ûñ“=¦’º4“̧YžçLýfZk¶K«œM¸ë|o÷i¦êº(˜Òé_»_®~Þ-Ž ¥^ íi Nç*ó†]¢Òõ»C‘üä®~[UÐηBöNò²ä¥T”Åmÿ€qúÐLqX!‹‚ýJI½OUÍl?t{Z·Q÷ƃîÓÔÃïçTUÌX Ž)&XNÁsUÁË̓óN™š5ûþ =¢‘J°pÆ}œC‰#½P4ÃÜéß´‚Y‡f!#}–Q®¹.„wèå÷´»cwŠºgÙç‚—˜=©Ñ vpN –mŒážľ¿=„÷“<Ù‘TïD!.Ƥ /*h9Ú¥²ÀÀÜ~¼—*¸fŽ ¬JžfE¥Ø»PšÑ­Y'TNõˆÅ Õ;ÐâiêBí±IÎTI&s. A>%H EC˜¸˜ŸwBj?L~³é»°ºCT‘HÖlŠÕ‰âÖÒóÑsñöh·sÇk>PTé¼ éVì´ÒŒBlRèü‡TEg$´)€ˆ²€¹åòQuXÝÍÚ¡F¶k=Ép»›1º­Ït°„ïcÐ1ïÞÜD×ýŒï\ÅHTÚä[¢Â%^|Þwéi¥&<ó5)¡€.«üQSUÆñÆ@¨uû@½'Y }Û˜Eó°QÑsv+qP’a ¨TÅeY˜óÚ£õ8œ®@^’ä¡ä“¿^h²ÌMÌïæx óÀ,þ I.Ô¦ÐÜTõYiB uΕ¨Ì9ÎßcúÖLjd½P¼"&üLÀ]C²z>A«¡}¿Ù撚V¯–ÉàŽAÕt¬dðåñØfI¨u˜Æ2Rí'”:^çK¶wÑ|ˆ^V3·âëÛ.öö?÷Ý—ï_G;±õ#º- û;–TÁ­äB‚ˆjÚºæÚ¹‡ýÉÁTºÐ€²â?/Hû;²‹±õ¡:ánõX©Ÿ#…u`Ââm‡¡ˆ N…T¾à0’»·êýhãz°ó· €´#™õOÁË2@†ðË—KQÏüº?4Îg4&-Ÿ;Άÿ41¦í endstream endobj 186 0 obj << /Type /Page /Contents 187 0 R /Resources 185 0 R /MediaBox [0 0 612 792] /Parent 190 0 R /Annots [ 189 0 R ] >> endobj 189 0 obj << /Type /Annot /Border [0 0 0] /Rect [249.2426 267.2576 297.6063 278.1667] /Subtype /Link /A << /S /GoTo /D (figtrefdodec) >> >> endobj 188 0 obj << /D [186 0 R /XYZ 90 720 null] >> endobj 179 0 obj << /D [186 0 R /XYZ 90 684.1345 null] >> endobj 185 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R >> /XObject << /Im5 169 0 R >> /ProcSet [ /PDF /Text ] >> endobj 194 0 obj << /Length 219 /Filter /FlateDecode >> stream xÚ…±N1 †÷<…GgH;Î¥é¥lHÙéwЪ­N´ÏOÒ„²Äñûÿ\9ÉAôÞ&‰Öå¦ç¢éf a~"7YÍV€œM.ä—_Cr÷„·›öM~ôÚŽÚxï‘Úˆf=÷x¬Ýaܶ{m8¥ƒ~Îê./ÌD{¿†Ï`¼ó6JS¡Ùý¡å ¯HóŸ9)mqÎ6Ä‹Õöµæû* ȶÍÙ"T 9wOšç8\$'tYJŽØõë ´}7–¯ƒý2ü"òQ¸ endstream endobj 193 0 obj << /Type /Page /Contents 194 0 R /Resources 192 0 R /MediaBox [0 0 612 792] /Parent 190 0 R >> endobj 195 0 obj << /D [193 0 R /XYZ 90 720 null] >> endobj 191 0 obj << /D [193 0 R /XYZ 90 684.1345 null] >> endobj 192 0 obj << /Font << /F51 9 0 R >> /XObject << /Im6 180 0 R >> /ProcSet [ /PDF /Text ] >> endobj 198 0 obj << /Length 3718 /Filter /FlateDecode >> stream xÚ­ZmÛ6þ¾¿Â8/°VøN±ýr½\Z¤hš\³9HSTkk7jmË‘í$—ëÝo¿II6½qÐ"ÁJ¦Fäp^ŸŠOüãÇ&VÊÂ)k'óÕ ÿ]ðp7ŠÙäï׿Ö|ÂYá˜ã“ëÛÑ$׋WÓGoªÍ%ŸîêËŸv—3)åT~q9SJMŸ¬/E ºj¾kÚõåL”–é©0—¯¯¿½x|ÖB|Š5$9æÍŠ ·…àZÞL© .•ö¼ÉË™6ÙÀ!pIL7pß´ðgœn„ ÊÂqü³<ÞnkÜ—šÎñuØ.¼3‘®0ÆØ‰(tY’(~bBúg8ÀóàY³ÛÃrË–´¨·8Õ¼«ß¡„†Ó·«@㟴(3x ìôçKee$m’dïâËíŠn¾‰û„ y×ÔïéAµë*?‚<¯ÊŠ)r‚OðZK·«vw\<”AÑóeµh ê@R›)V”¶,½ % V" |‹£>äôÅ®êðç®Á¿ë;˜Øjà~ÔÀ´dÀ"èÇÿ~BAÜ\”ÂOþLPŠémÛÁk+¯#Ùo÷Õ’nÑF«.Œ7ë~zq7È Žµtù9i{üVQzZ †„Ò‹¤¹kp+žC0…‡¤ ¸ÑÀ*rx³zExR®&`^Æx›U®P`½¬®$«}sèÀW¡­)'䬙hþo/^½f“¸Ê·áå÷è7wNLV‚ñi–/.þÙ{Sšr6œÓ»”œØÂYæ·Ñ¯Ìla­#¯QG;¯Ÿî4³LNÂ&ÿLfszfÇ¢d¢0ZIXº,¸-Éñr›AºÙ@êõŠôº_#ùµZGOZ†¡ ™÷ß7‰}Û»þLÂ^+ ˜¨,¸f14h–S~!”¸_ùÎ\A1ŒRKóÇÅgœ §©@@ ë‰áz–€¬âÀ_r<é ˆ¡,JX¸”M33 Shܹ‚åq¾`ïÓÇÀ¬ß FwäÞo1¤¿¢j>‚Ö”`ZÚ-É©»ú.l=6ð¼Ç• 3<„QkÈnavT~¹›ÄIaÒ¸¸Y2C?›Qj# UÞ¤B<'Ä´¤éGѤ¤‹±+wÄVÕˇI•­‡>Èã†RÃu>Ðìû]œrÝÒu5Ðùn˜Ä«® S3o(Lf¥+¤€:²Â.ëzNº~ `§ÞÌîöiÒÇ ‚ÅÈׂ¹¤p [5»ú‹WdGF‰ý—\ú”0-CnœÝä°;?æXh0ß+7½ËæbˆOñ›§¼ùd.~p9+!d¤<!õQŠ,±FÖîP¢w!ðpÎÒ!@ŪIç câT:Œt³!a.M˜Ò!q’??8Ì}ÎùCÁáёۧ”<0ÆÑUè›%dìF½¤D@ÕJW?B„M¿JH§QÃÀÂrˆ ë«QÑù*›Â 2;ïW¦Ö¸(CD2Ó¿`ÛbßÌ6˜khhUÎòwíí-Ö–Ù t–ö¥o­ÀþÉI>ÒLø™øht!œhl î¬â .Ö&&#½ –ÏÀ’/àj± °TÜû›«ž)z…TJ-€ýP§@…­œKŽyå“4usa²ãH „ÊÜ«(µc«j¦Ðãq ·WÙ l‡––Œ K͈Ũù|PÍÞôìÇ¢sãƒa¬Ù·1ví-FSŒO}{× å² æÚnNQ¬¿r‰ÑA`ÒÜøóAäÀ~PJ#Û1BÝ yÕ®÷™fQmCt‘Z@ø“6†—s£Ëû&Âèq€‘ìWÚœËK³Ú,ø@WJ°%)Ð¥>æÛ¥%(¢¢Ë¼ ÅÎa[Ñç+Žû0¶¸Ý·å-÷‚'bà#IGÖ¡I_Åf#Œã‹ îg¡Ãø`w¿ä~ª±È¨w/d„z€>}r÷}ýãu6×;Ä1î³N}Ì×h«¸‰ÞV…•y0–„‰qm{Žà\étɗͼ¢áuX*©+üIAXâEÎYY”òüÏ—ß?ùq¶h©PÅE¶é®œþv ´]n-ì90~¯h¡°e)@ûÁUúKñc<¥¶Ôù}ºBèòìmþ™Ö1ÒÕçª,ûúDWÅûµ'°ÓwIŒÝ öB ˜‹OÝÇ&¸ÍuñsÌKxÆœÏ}êѦŠdG§AÛÏœíàt–Ìb·ÍB‰¹ð^ûƒtÉm¦Åë½}$ØîC`ëv!i} ðKlÞ"E>FC7Hãªy¤Æ-È“›q¶¤óN¼»­>¦N!â Z/[mâêlÌcNÛÅ#MxÁȃ^"}I#ÓÁ|· ¿Ÿ<§ÂéÆQ“«uÒº14·üÃìaÃPa”âsTRÚT÷†„óçmàˆHG%Ûýy¦.ÔØãH`!0+§ðx4Kedë{(¾{ªÓ÷úhµ I>#U^QÜÑϰR|l‹Ú¥c Ñjº,¸±çGÈ—þ[Ç4cL‹¸—>b`6-jXSñûÖÄ`$̰) ›¢4}åêWQ0•œ*- Åb /Ù&+$KERqßéЋ|…« #S†9cAßùŠa_yÐ\Öðí-Þì *pïúf*üB?|ððAÀc tzЃšNÝ£!à´Q~3Åìè³Îã~¿jb¾…ÁmÿÙdVr’ÙAtÝðøMóªI=«n¶ír¿kÑPy:Ê\CØÜÅx¿èÄx~…—7(˜=è±ï÷CMr òñ—«“VˆŸŠ¿¹…‰æ]“Ð;üܶ7a²\‡Çצ]½~fú뿜¨äáY òýÏõÓçÿxòÃÆowfƒ‚ÓÔ«~PÄ#³ÿíA&‰ endstream endobj 197 0 obj << /Type /Page /Contents 198 0 R /Resources 196 0 R /MediaBox [0 0 612 792] /Parent 190 0 R /Annots [ 202 0 R 203 0 R 205 0 R 206 0 R ] >> endobj 202 0 obj << /Type /Annot /Border [0 0 0] /Rect [386.6428 536.0352 522 546.9442] /Subtype /Link /A << /S /GoTo /D (Command Line Options) >> >> endobj 203 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 522.8845 173.6971 533.7935] /Subtype /Link /A << /S /GoTo /D (Command Line Options) >> >> endobj 205 0 obj << /Type /Annot /Border [0 0 0] /Rect [435.7761 410.2036 522 421.1127] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 206 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 397.659 189.4184 406.8105] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 199 0 obj << /D [197 0 R /XYZ 90 720 null] >> endobj 200 0 obj << /D [197 0 R /XYZ 90 720 null] >> endobj 201 0 obj << /D [197 0 R /XYZ 90 640.7267 null] >> endobj 204 0 obj << /D [197 0 R /XYZ 90 510.5171 null] >> endobj 196 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F67 89 0 R /F14 131 0 R /F3 134 0 R /F52 12 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 210 0 obj << /Length 3087 /Filter /FlateDecode >> stream xÚ¥Zëܶÿî¿âP°ðÊ|éÁ¤_Z×u\رѺEçQf¥»“½+m$­}NÑüíáÔcy  `i©!9œço†Ç/üÏ/4»(¤Lµ*Š‹ÝásÃq÷¶ŠíœäOï=ýKÆ/8K5ÓüâÝåb‘wÕûäÙµ9nx2Ö›-OúÍVJ™È¯6[¥Tò²Ýˆ>õf76]»Ùв`Y"ŠÍ÷ïþúèù»°q&Ä}¬!I„79ç«"Íy©R.Uf9|>ìN£i«˜S<ùŽñ >ÝÀ?n¨ªé¹ëÑÂ'O^Ãû_Er„I×f wÏÞ.¾à“jƒ“ìÜ¡îéå4-Ò7ð>à.»ÕîC}…t½i¿c’mP€;óEØr™òŒ‘ÌO\ç—Yò¢†Ÿ°ñ§yýŒƒyà•H††ž‡z˜Ïl7eòëFi™72Ú¯(ûl¯qqOÓ„#ã?3¼{|ß!ÁIÓY6ùj³Ù,<û6vTÆr\÷ L‚u"pÔÃq_{jg‚ø‘”yS£9ÐïÑ NRuÑSÐV ŠÙôƒfß h-ZÜTá³ÛfoO9Ž{³Ý>mx§r£J•Ô8]ddsðÈ’v¸úGü§žC¨¤¯­ìRt3ž¼´GÜäÑš°ÌO³]d°d iì Ðo÷ÍÎÐJJ“DzƒËûqÇ“±çe™*¦.DZˆBÚ3Ù ðOG/}kf MïÞÐ.Zde*RN‡#ë4ç¹XŠÌž‚Šé½äÍ/uk3~;¢Ø;±™å)Ø'+À‘ ^s=Q×aidjô/•qëôµÿÞ&˜TŠ\¯Ã#ê;Kó,s±ç†l¦÷ÎŽxò•›)Ö3Ë”çŒfn_Q^,"\–2ÍJ Fš¶;Ô?VõÝO걋±£Dš1­–}Ý h†[%ѳ2æ\™¬¨!yí5EBç=H{@Ë=YÁSÐpÕ ‹š ?òÑ0_»Ü;qšpUSüªÇ¾qlL?5Ñ`*K¥­)(ŬáöÝUofˆ‰R‹”•¢pRÂí†ñtyP–§R1îH»Sl94lžhÆ„˜ó9º^‘ŠBøõÀA‹\&Ï}8  ;žµ_7c# ä:-˜ÌÜ¢¿‹î‹>'…·Õ1dšË\ݵÊVrž²B¬ ¦¦|eÃf ¼£ÇÑ%æ6k:Śʑü;ʈ)ã¥ÒÓñp|êeúô~›Ieε›þøkØJóÄÚí,pþ°Q…pQe*KªÜN\$md(è·^_•‡i\Œ!³ž²( Õ—u3vóù.Øt.|œg›èÕnu톉=}0?¡c57]4`ˆ2-´Î|À¡C>VÈqQv!ט_>¶]¡]ëÀR£öåcŠì©NóÀj!˜âYòó ™ç‰û,»Ó6› +t8ÖtD8§Ï­ÿO¶‡#ȱ ;>.q²ÇàU~Èÿ8Ù27º°…ŸÌx2ûhô™BÏ%Ʋ'NûôeÚÈÚ,ÐXÒÛ²0³õc/ž½zˆv³ YÔDÎ/¤–µª8P$¸_©6¯Q88–+ˆ7J°€ÄUªKŽ@û¢¯/.gÜÑoç"%ƒ`Y*PÑ–—Z†³ 5åã#B…´˜&À°¤ý<« ÝvNãàlAäàïµ+KP·!UÒû{+ck"h„_¾wº>š+'8×k¦¥†Sjž-˜Ž2î>¦Ïtbã1{Ù ,~4èi#v1!XZr# Ž×Ö".ó´(Å ’=›Õ*ãe–r&õ:!-9óQ>!=¦ÕŒ–Í@~‘,+3ò©!x=¢Tš«õ4G nõ„>ú¢QŒ­§+ÓÓ—ªžê‹ámªPyše¥\æ Y„Ó˜W»ì|,óVxñÊYIkֹIJ°›ò½iT‘™+b×zÜò·hÊO#i¾š§Àm¡óó,„ƒ†G ®GÌ…¶uH,mƒd@§ùƒaÈ?¾}ù¯m[@´ë¾ÜZÔ6Šc24¢¬¸kC® )³ M¦.é<Å&ÀÂvãÖš‚nä­x$º1ƒI¥.ƒõÆTÉs aÁ'UÐeãÂŽbðß]ê\0¿Ôª*عñã ¡¦IÓ[­B„N,ІçÔÆ ²—oî“¢qÀ…™Î2/ [y†œ•ûx à·Ì|•nKÞ¤±ÊþìÙó- äj ”@ŠieÊÎñ¬¡W)^j蜚@†Aw¬ÑÓÀ1€Œ9;#Í÷° ^)9E{2[Ť :¹ìúiÏú¶Ònv‡øÉ#b%ËÊjí²Ðwyˆ°”ü„tÌ=\ÉkQÒns+VG»2Î븖˜kùÒæïw»mÛu‡®öQéð2…ž;Î+çþ3U*77û-\”®*ÐŒN!ˆ€ã½V$uûâ}£ˆhˆ`^$“^ÖEò²ÈÅ|ô‡OŸB˜ë‡ÉÚˆ’]½wÍSN¥îœ·këÃU™~ÆuMo'ƒMf’aƒÏ¦;¼ŸÌYi‘¸!+š6 lP¶&œŠÏÞQBí3}kß½642œB8©iÄ}xã2µ•(ê=Æëû½GíØ¸l6³® ¥=o&D3§ÎS!ËâáerKŽÐyVƒí-–…´—çyq·iº2£qÍ7øg :^µ´P̺†¾¸¦èR øÁ5cGrºÁwî@sS2hwqî—AìÌ庂§K»Á:|Øe‹Öå¸h[ïýx5O1?µêÞØ¸ŽÍý«Ô”û NíÊÀ’\1ݯŸ¿k«êþµå.¶n–ÝÛ×€W`ÙQÛ¯ªŒI?+mò´r}¦2+ÕÞ¯„ôCÛíëPiRøôQtRóÔp$6o]îg¨:oFÊE®ÛÙ ÀYìê"o8>(ðQïÃÿx_¶¡ógeç.}è%ml;ö4lÅ{ÃàHƆ€zpºÀføy.ó"qÛ|˜ÌÎZ.Ž]õS|ûŽqµ3m¦dòÃÁÂ?mÏ–\åà)"akðW^ &„°5oCÑÅ~¦¾µ»úQöÒ w«+·‘!ÊËnêsÓHH[ø¶aíN5nríÝÞÿ¶Þ O3šýu«¥ðÀµw‹·7ñf[ʹ(§þhؼD–i)×õ¡»Ÿò½xLe9ó¨äÔl­F;ØTªE15Tpüsƒ÷ÌYã¿fÀ./y*Š"»­qàé¶sÂXãàlÁhã€ËÜuPGö4Á(¿ßØìL· ”+çì8gž’à/ìGZî>öÏ$!’îÔ´ÊoŒMÛŒQe1¼žÈ¦Šž3¥“oç››Ë"½õšþgLPw%óÎR zi ÐÚÜù‹5³Xa )ª@O/©ÀÀrÃTý¬\xB ê«sœa‘Ð&‡ÞB*Ïš½õ‚ ´X_±Ü/ÅôÎ[„UÔÝfZZt–iH_rvÛ#É3m!yã0RTÆ ÐáÊàó– ›GÌ»ÙïÿóÍ›×ÏÿûôN&u•…È—Lâ]Túuˆ:ÍEù›kðôî­¡ìÑZË©Ò$è#$l¦Ëß\yÔ÷_µºê´^GH€"[gH¨|Å)£8 íqÅEü©ùÚÄ -Y}3ÃÝ׎‹ly¹ƒÍ1±K 7ˆ³®ŠQ6Ýázsgd¶:¸~¾KlMè³ã'G|× vظׄ4ý‰S[íÍ•´ `”ÔêÅe•´îy$,çîMhÈ4ÅŽ.[â…sëê ÷ê®à±*»‚ÝÓÌÊ_ÚŸWS<¸þñè¯ÖmšpÜg¸ÂoV<¼†ID„>ž“@U#À¡ËôÎ#Wž–J•KΧöž<ËÂ=D¬¯á  7tµµþz[Õ—M톕 TÈô,KóòÖ, §€“çâ¢Ð©`’ß’¤ÙvF듯—[¤h<(¦hTø3OÞX7Á<<UÓW‡bó_Øü¹çs~þLqt®‹ù‘bÄäÉî9ÒÙr!mã¦ÿ3û[ endstream endobj 209 0 obj << /Type /Page /Contents 210 0 R /Resources 208 0 R /MediaBox [0 0 612 792] /Parent 190 0 R /Annots [ 215 0 R 216 0 R 217 0 R ] >> endobj 215 0 obj << /Type /Annot /Border [0 0 0] /Rect [227.0792 453.4621 395.2915 464.3711] /Subtype /Link /A << /S /GoTo /D (geometry) >> >> endobj 216 0 obj << /Type /Annot /Border [0 0 0] /Rect [271.9028 178.5502 439.7817 189.4593] /Subtype /Link /A << /S /GoTo /D (ui-panel) >> >> endobj 217 0 obj << /Type /Annot /Border [0 0 0] /Rect [326.7562 76.4758 518.9697 87.3849] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 211 0 obj << /D [209 0 R /XYZ 90 720 null] >> endobj 208 0 obj << /Font << /F51 9 0 R /F53 214 0 R /F52 12 0 R /F67 89 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 221 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/main.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 222 0 R /BBox [0.00000000 0.00000000 190.00000000 148.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 223 0 R >>/XObject << /R8 224 0 R >>>> /Length 225 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hi`ªg64±°PÐ5Ò3·41Œõ,-Í Ì!ª-\ò¹oÊåendstream endobj 222 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150408) /ModDate (D:20070503150408) /Title (blah-000.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 223 0 obj << /Type /ExtGState /OPM 1 >> endobj 224 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 397 /Height 310 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 397 /Colors 3 >> /Length 6911 >> stream xœí;²å4׆õ ¥ÓŽšPEG$=†ÑI''`ôH:‚*F@)Sùw¡¿.KKW/y?OÕqùȲ.¶üîW²lÿÏØæ¿¿ÿþ{FÒüñÇï¿ÿþéÓ§‰€ü>ï2ÈÈ?þøŸN=þÿöÛo."u®ÀðôY²diayØ‘á){éøO§‚ £8W`lÊ`³™q™?Òÿå—_^ù©y<*€Hܘy—ù#åï¾û.á§ü–,Y²¼jHUÚOY((K–,ŸséUèl›²~ê±a¸…(Û¦¬Ÿzl˜4Y ÇÛ·o“¶)ë§FMVðÙ_~ë”%K–ç¥û·oeíÚ<+—޲Ÿú£{ÿwî÷˜dàµùû éGgåñ²Uá§,TÆ2P\Ü¿ó§Îéè¸?þ|NçqZç§’Ðs®êQ™Åø2,Î=wŽÅU Çv 7«Î:¯Í8µ@ògDs"‚h›ù©£Ùù:\"ç’ØQÉþòÜìØ¯Îµg|%³ý”R§Ü×£½™ŸJ6”çi=g‚ZOº¯:¶3ªƒN)±ã§Üë®ß~JÓJr&?~$¬¸ü/p¼K.ýs„Üz3Å‚iª/'˜‹£L¼xlsûÛd ÉŒ†TGn BQ…Š e0 ~Jª€¾ÜÅúuµK¡©%7%×/Ñ©¸.ÊÜ×[e:.ÒˆsÕr%﬎¾TB A97âž~J?zï9g¬×láÊtyƒ#„kÖ5ûjò]é§ôÕ/¦æ¹ðØÊUÓWG>zÍb¤/ÒvÈ×fÑžŸÓqFü”2× r­f[d,—r“j3ÅßÏ8NÎMÄI¦£9ÅËFNöÂc«OS(X›NUe]´x7)'^›ÇU¬©¯!?U¥SGÞ~Êe. a¯±Ú$äÄ9/sñõ4›)}‚šDš)e²mÓom3Sú¬7¢è§”:eËO³ xäÝï§4M§S§Ü×cÚ 7>»*M}èÔìc«—˜Q:Õ#‘E锳ÞŸ:ÿ»‡ŸJ]¦ÁO¹T‹wê £a=¨WÃϬòG¸ ½HU`ñ±ÕÿH$Ë\ýÎê´mº‡HyŠ×fð3,¤ãŒø©6zæOyŽÎTrSn—s`­Ö$C„v¹NÉÅK¦|Äœ}lå4«¬œ¦:ÅMšÃ(þ6:uÏû}+Pä6r`æOIA¤€Ÿ*T@‘Z~Jª\Î?¥ß?i¦ú)R­ðS`¶ŸjN§ÅOù\5Ÿ²–Ÿþåòí°dÉ2XŽº6ÉëOGòSŸÿ;þÝ×/gù Ÿ¿N(ïä(˜bàµ9*)ÉO}øð!Ȳj `ÞOùޤçÕø”ÇkØcå§Ÿ~Z]@xnÞ¼ysø©#ðíÛ·¯têÜÃD§`%///?ÿüóùË¡>ü•N®ÜW?õ×_]Rbx*~ýõ×ÇÒë”ö~ßá§Ð)XÀY§œrþ”ÃOÀBðS`üX?ÖÁO€uðS`üX?ÖYá§~øá‡8ðË—/ðÇÒGð+cÉ囌9£$“êµ’ãZ®ˆ|œ«Î NÙ-Yá§rç~N)“K2¤H6úþ¬½B‰ÿšB(›¦Øçc…NÙd‘ŸÒ7”4èÔØ"í®S3ŽÉ êØÄœŸ:wÖ†_iÁÖ#— $£:;šdã@Md9|Hù…£×_B9r[QsÂ*·® Ŧ8¶…€’+ýT²·å^7 yWZ2£Iý¾bvÊÈúõQåw©S0ª„ÉmåÔèÔÔ³SYä§‚œ(M­óbËå+d4O§rÙ¹¨¡Ë&‡'é¬EPHåiª*aOsÆ\ٺ佔á0‹~êÌÔž‹\’:åòý¾d"Aúktê\N}u4% BÐ)Èak|jìYßB§ŽWRâa,vRkW:¾ ÓféA§lbÎO=§Ni"+u*¾P; ß\B9=æü”»é8zÕ’+›~}ˆN¹×樿TA “ÚŠ*h‡æÀVtj=¶ü”ûÚ&~üˆ‹„gÀ¦NôSwuþÌ¡Sð ØÔ)7ÐO¡S3H~¨î–Ÿ¥;jzËÚíBN§’š=sŸ¡Õž?ÕËU:Uü”æÍ®g›:ÕVªþÎ^u4lê”ÃO¹D§r }÷¯. ÜC§F} |/ÊŸZÇz:·õÜÏ”†P{œ“ñçÂóÛï§ÎõM†»T¥ðS½\¨SBµé>îAó˜`î¤(O–…±ÈNòUЯà§zY¬SC~Kõ‰è½›ÿy "ËýPáúŒ7ɳPÎZu(ªF›^TUv`¾ct*?Ö©s‹áø©^®Ò©¶*·§†˜Åá|a÷!:U,çpj‹<Öáî5>¥Ñ©`_C~JÿÃe¹ó²‘NÉ~'© 1åÝûuJYÎdWBÖ©ÚqqtªS§äŠ\é§”£ýú›—°£NMÍÍ…bL™6êï¼£SþßE~ ªEãA£Q4/mÎbõÑ×èBJRÛÂ÷Õ)7aÝá§Š Sqdk:å¢Öü› w:šuJîMÌw,6ç%\ã§â¦ƒN4ˆÈ¿çɘ tJ(gq8I_#÷ºQ%»`¹@›Ni˨|ÇòŒÏ÷Å”ïD§Щr‘6 š¥¡ùt´%Ò³ËlêÔ:?%üŽ¡Sgô=}oNÞQÞdA§ªÆ’„¾^­™ª*:Õ~ªãóÑy JÛ™µ@qì¼*µÚ2 S=XñSA¸c|*OÑR/È6«2#0Y`9NƒGKæ²X§Š¥b|JÀ–ŸJ‚NÅ(/9akm`Õ0péߜôhîU隆6ï階êwbS§˜?UÆæû§r£ÂÂ^¹KWíÊ™LçZJ[[tÊÿ‹ŸÒbù}ž¹a}O§Óæ,Щx÷\!‘e:µjßþwrè”ÿêçzðSð~tx|k¿J¤ÜU~ʯXûѨ‚çáÑÚ/)Çû§šA§Ãû§ªA§ƒŸªX ~ªt `1ø©jÐ)€Å৪A§ƒŸªX ~ªt `1ø©jÐ)€Å৪A§3ÑO}üøqaEVƒN,c–Ÿº·H9t `!SüÀ@¦ø)€à§À:ø)°~ ¬ƒŸëLœ?OÈÇ~·h0plBÌŸ‚a¼¼¼4ë \¾ ÍòSmí¶¦ù¼Ó`À“k ýÍîÙ@§ ¥Ná§ t :ÁOÁtÐ)è?• ù tåšÅ²NÉß»¿„ø»ßò—Àk¿>6µ5à§ ,;m6ÛÇŒëÔÀ‹|Irõ6éÓ×o½ üTtªtª t*?U yÚÎ…c«yn7G4~Žì~ŽÄ1ØhjÙQ§‚ë?è §ÒE-áü¯{}B…ÝãBj“ ºLS lKÍ-?U@þqË­+£ëÉ–jó÷­ŠuÊeÎB|Om çÜ‹áéS[ß8ñSŠgBþuÒGË]7À¸N!E‹‘»Jk[B\Y§r¹W5­b¸f/·¼qâ§ û}NüuŠÿÍ]qüóÖ­1®SÊß¡ø_ý©T¦`M§’µsW4NüT¹ßç­AŽ&dçµ)7Ö)Í©TŸr‘š;ŽõSÉjºU?U@n4n²N ᱯNUõûrivÊG2S :¥Œ3üTÙOý ŽJæ¢w×\ ±©Nµ@ߊ~JØ}H‚úõªâYÓ)üTèW¾D·Ÿ…hÉQ YÚÜþ>g^§âÀ/¯ç—¸Òå}ìuDÖÈŠ«iHµ ºTÓŠÓÃkSsKÀO-ⶨË:[€ŸšEîø A§ üÔDr¶ùÙ@§ üL‚NðS0t :Yí§&WŒÂ÷f “u~êÝ»w3*[РS48³ÈO „ï!€uðS`üX?ÖÁO€uÆû)æÂ<3ÌŸ‚NÍŸò3J'Õ,óòòÒ3}F‘`/rMhŠŸâˆç„çf “uÏ÷9a柊÷ïß÷ëmæ&÷¥ƒxÇãeøU!rÖò{þA`’Nå>pÞ±öí©ë?LðTïË_¦SSü”æjâœÿmS%tj3tJÿ):§á»2S©Õ©­u­¨Sg=Ê…_駦êÔùS?¹8U¹·%ò´\¨SÉ$Í;v‚N¹ :µÂOŸ?;ÎìGЩd„Ü.ů›ÅûÆÅãS‚Nåõqr À‰Ÿí+6°†Äwÿ˜£¬S‡ ›¬ø)ù­G"£tªøÅWe|ØB§\¾¯§o*Åõø¤=‰lÇ2šî§rz4O§ª²ëé<>-ót*gO‚Ý«®íX­r}Ì\.BŸÔE:¨h»·N"•ÛjÈO Ñ)——§žìЩìø©\;‰ Ø¢8)Müœ°¢SçøÍ:µŸrè”ìèTµþ¨ÿâJ¢öT:å2yyÉíè#à§´Ù¡S ì~¿¯SJŠzœ\A¤\½N­ðSnÄ8znSœNUv¹ø °ûü)ŸR®ëÍ—&‘íP>7cn|Ê5ݲmÖ©\²²,&‹9vŸ®o:ÿÂÛmq|*WAW#¾Öû}E ù© Æy¶çû¶¶˜Ï2rÃý”ñ6ý­óIt rlì§hs·ÏÞ~*yg$GînKqÇeäî(?- t*¸;òÂ@AÛÉ¢¯§ao?¥Ÿ‰çW4ù4iÎh[É92OÎl’ç:¹’ôèO““s­a{?¥?ÇÊ Ç蔦êÔ1Y©y>ú ·òSÁܹb³K†)!.šîpnß¹ùÉÖ)§i³Oz ót*–§†­Ü.Ǻ¦ÁØްÀ}üTqp§ÁO)Ÿcp‘®ÉÅФIKuÓtJóJ°5Iîw®¶ÁЊÜÇO èCœØ\šT1Sš©À Òÿxk’!'7Èç¼'¹•Ÿš¡SÁV¦ÈwŽÐ)=;êTG¯SçÝ9ûø© ?¥‰“sõ¹LÑ)I:GKhºn?• ×4T‡T½?5^§ªŠN ,ž?¥!ÂÒdýl,{OÞ ?å.GÏù©ä.Œ£ë¹P§4¦¦yªZ–½'Ï-˜?uîÞ7û)—jmG²qaâKéö³Ëôi¦ƒóÑ“ûÉDr †ñ) ËÞ“·z>ºæRGŒÃó}àÙø}žµý¾tÊ8èx¶÷S~“ÜG‹Á`o:ž½ýTmma/Ð)ðìí§:*€Ngo?¥ì¾ÅýAaGå UíØÖ¼±°†¹]0r¿OžÅ(çööS 7õŠ·ÿ÷Ò©{Ïf0òþ)têr¶÷Sè:% èT 2òôº†Ùê0[ù)yžçG£SÉŽa.}yj_C|—é[ã ¥É÷ÅÎû§’Ïl®½!sUÜÇOi†iouL¦sÕz±T7núvÞ?œ‘ä)Hž#tj÷ñSE RZ÷\:‹ÃJu¿¦oê½.ÅõdÊèÔnå§ÒE-У Gt*Çv:ìžëZÞïLÍæ)ü”f¬*¸Ì7¡S1ÖÞ?[$WsfÑ©fîï§„6aY§”ÿ¢S2cß?Õ£Sñ²¶.ÏÌ­ü”+4ÔêT.ýyëšÜÑ)áïŸä,wŽÜÝOÓîã§Üi€ ¾ÂÏÈ-Fî?ÆéYË£‰ï22$Wá~€‘ùèÉøÉáÌÞø4-à>~*@Óh1Æáù>ðÜÇO ®;:et <Ûû)¿)¶î²;‚MÐ)ðìí§jk {Ngo?ÕQqØt <{û)M÷-yM¿à ™÷|ß!y«Î)Æ h+ÙÛO›‹<É 7+Ïež8…Å\øÜŒ|ÞÑ©Ålï§fèTq^2¬aNTwšÄbnå§äy’N¡Sá ²8ö’'FTíD{Z®Õ)5¿¢™µÛÜ$ É}ü”üÜɧG§ÑG–7='ót*”Ûç 4 B’ûø©†‡`üT2r.Yaì#ÞS˜[2ï} Ås$o­ ¯jäV~jN%ï ieNîÚ¨ºët{ì¼JØ+Øš~JŠou¥ŸbM£Š—LÿiÙB§Šgêç¶~ꆨҩdøp“ŸË‹¶p­N[Wr/y_tª[ù)×=ޤ“K6^×ôûä…hO‹ùSÊfປ$¹Ÿr¯ ‚:]ÏE­çžTCa=Y6Mú¹BÞSóуS£?³UM’ÜÇOÕ‚Ó¶Ï÷çV~ª tÊ>èx¶÷S~S•â´íëA§À³·Ÿª­-ì:ž½ýTGÅaÐ)ðà§À.Suª8@©ŸaçòÓ'QœÀU›ZbmH?v™§Sš1ÊZ¦_ g¸N­,|ø)°ËTЧôè”°ûÆ&¾¸ð à§À.ëuª8™3§nÅÇnŽpÍ“^I»—,C°¢ß±§ðÂdýIà§À.óæ£ ÄõÇœ‘ŸÐÊ%•Ô©ª2hžÍš]øæ ?vY¯SÊGÿŠãèB|9ÙÚ2è#Œ-|®À“ÀO]Ö¼wxÔ¥._ÏÊd¯Ò©Ú ©Í?v™÷>πᗺfw³:¥ßý~:åðSP˾~ª9Ùtê–ý>üT3\§m1yQµaÇ)œÿ­JêXä&·cQ§&>×7œ~ ì²X§ÜiDùKý¼„ $¾ò…ð/§ ‚‰Ë 4>c è]Nþ‚Ÿ»ð|ßp–(?vA§úÑôû샟» SCÈõ:7?vA§ÀƒŸ» SàÁO]¿ªyŒ¹gpºvßóÍ»†¼Úv¼üØeñû§ŒëTçl€MïôyðS`—Åïu¹D§zr©ÊÂOÁ.Ô©â„O½I*ðh¹9îÉ}…ēœ7kÌá,æ•+¤™ùè¯RD§žŠ«ÞëÒüÔËy]è¦å|IF8£ð%YMaäŠ\õè ~ ìr¡N垕Ӈ˗nñÁX­4ÐØ±ÜS5Å'gƒŸ»\õ¾ùÊðà§À.èxðS`t <ø)° :üØ~ ì2ûýS~¥êÕ.ò]¹!÷ì¸ñƒŸ»Ì{¾Ïe>„—c™NéÕsªœYÓJüØeÁsÈžâe¹R§”/ÆB§~ ,°æ¹™y¦üˆLîdýK¦ä§rÊšìâ¬ãcO—L|%ø)°Ëz*>Ô¢Ô)y&z®Ê÷Æä4QŸõ}V‚Ÿ»\¢SÊGgŠÚ‘LVŸ{­NU=ÿÜSÎKº„û©ÏŸ?{y:68ü|å*?u¦Y§‚¤®ÿª¼šuJSÎdœ•\ì§>|øpÞ?g.÷SqxC¿OØ+È"œ­Sšræâ¬d¥ŸúôéÓ±õÕø”Çk˜ÃOÁWÖßï¨SEáÈeQÜk¬NUí(Wa9zœ\Íîµ~êØúöíÛW:ÅøĬŸ?U5ŽǬŸ>#‡Ëy)³+ú©ÇÑzyy9"ÔŽORõJ§¸ßI.™~îi:Dî¤ÂV‰KiÑÇy¹”‚äŠ-¯ÇåÌ%þå¢/w ý¾£gwŽoå~Ì‚çûÀ³L§ó§ t <ò8z UÉMø)˜:že:åðSP :žâ¼„³åÂñS0t <ËtÊá§ t <šyžIòs‚@‡Ÿ‚© SàY¦S?µ SàQ>7óçŸ!×û)å”yØ:E›ÙšÏ͸±~Š÷<ŒÒ)ÚÌî:¥?¡×ø©¶J¾ôëÔŒRÁF,õS“êöiÖ©…Yä§üX<- :E›3+üÀXÆû)€±à§À:ø)°~ ¬3ÀOù§ufÓè§)XF‹ŸB¤`%Õ~ê±íš’ÀSá§ÎùXLÙOyÁbÉ’%Ëk—Y?5VÙ|úôix²`‡©—yÖO Ìà±|T`Fâ`¯Snކ„~ê¸Ó7vyT`Rú,Y²¼vé¾Ú‘ÇrFúÿù)ŸÍ Ž LJ.gêeþÿ:`™ÿ‚C„endstream endobj 225 0 obj 67 endobj 228 0 obj << /Length 2751 /Filter /FlateDecode >> stream xÚµY[oÜÆ~÷¯úR.e8’Ãä©qíÀâ´€‚¨t´¤$ºärMrmÁúÛ{nÃËš’……–œ9‚ájßó7p­3¼Ó®ø 4°ï=¿ˆ@í»D›]š$¨ö›N¸?€½°ÐÅ›ÚOó؉üaKGiœë\ Ŷ¸¤±Mmö½É\œå:[+u¨¾©AºÏ¤GYT¬£w‰²¬|+e³©ÁEø±¬x 4¦¢»sY°¦Tô=8ˆ…l‰¬Š,ÖIšý¿/^€ÛæÁ½ÑArq„ ýPõüÐÛ *ÊŽ¯GW¢[4`?©Çª"b{;²öX·;¯—6ÎækEoy'‡£ç_2Ãñ^ÞÊŸm,x,º}ë¸&•òûcÅ›ä½uõ)fÀ©²$²€Ÿüýù¸ú:‹S›;:²tûá¾jš§S€R:v.wÏÉÙ:¨Dlj½Tã”¶î¢b—eù³jOÉ{Ç-†po•BzÒ»r I‘òP–iÛNYJ&ƒÅƒoë㽘Þƒ…áÑ÷Ð9jNS„L Ÿ“…ªÃyœ2Œ'ª™ ÏÍ$ëÕÞµš›ØfÉEfÅ…N]@Jlñ×F ~}‡©WKÙ=vã¸V¾<0Þí F?ï(€–ü/K÷,Êíñn/ç:$i:QöF¾†kø²#O•¯îPbôôÕ¬£®¯ñ íRb†¿d”…ÀxjƒX¨#ûÂu>'7ù/+¾ã% tX &Ò°©I|#È:ø~Ä‘®6 xs~úbã–¿¼}ówüg’!äÛN FMùwUïPû‹Ôb']… …à±.›bœ˜à@™Tƒ*k¶‚Ê6`C°3 „›²±±™¦2¤³,ÎbŒ.H­Dkbdlvû43ÑF¨#´ˆœ§ˆ› Bªž„ìD9àøÓ_“t“þäAôôWüÆ«MQQ¯E¬´3tþÛ®o}³,`èi¶T³MÓM¡#¡}Dõüå&霒ô7°î6öH*,æñöòâg°?Vd¸ræ ˆ.bzòäI˜É{ 3:¹>±nøÑ»$MD-v©k«ƒbî[êÓ)` òpSp'ã åêãì1°ê¦Œ·UßûV !¥Í¼xT*e4bÏBŽ»ÞåXÃSpfxDº<Éí—ÒÉáçÖ³@ïýqéÔž·b’ãÐo¶ƒ›¦°<3|þ‰2êoù…H(¯ã ¹¨9aZ»`Œ$ìΘæz2;t K©ÂZ;=¬˜ÒÒ¡«‡€‚ñ}r§–÷†Ð–Xk ]öûìË™‘PѰbŠÎZÌþÎÉÝÎyo1ˆø‘zµ§ßòÃ%¦~N®‘u¢P-}xF,©Ôd"°Nf³èÕN°Ûà™”/ýÎŽ®¹f$©× Cž%sãõØÏê<BtG‘ŠÇ¡ Éð/®ÞÌ5{¨Èm–/ªÿ‚÷.ê æìs¸'ò ^†j¾ÜüqWÉv_ Ò™Rq[âÈîaÿŒWÇ5gr¡áÀ¾#¯ŒA˜F¸,ò½öôz¨OåcŽÍ‰VÚüžÌ‡æùÃÔCß«‹<ÎáhŒ¿}ÓæWî^üm«EV‰…ÚÖs±ÊlAl_×dÚ^nÕIEŠzø4º¾Ÿ-%ÅÆh(6 ŒPlȸiì ÍÕm;]8½©¸ÌwïÇ¢îT$îÑÐ ô.š{ ôP¤õý y`?{™¡ãïÇt7X?£÷A¨1¸ì‘ÃÔÔVœÜ€»ùeóRa*äJÄbaúÔnò @9+xÝ •œ.ý¬ë¦vŽò<¨ý]5nfz›@9µbµÞ¨>auYáü÷ó˺ÇdšN|Õ-^É|[îƒÇž« .QñÁi¤ñ‘Ð.ü޳+PÑF~ÅXiô¾ÃÎL¥¦Ô¡Ä JŒ»€øÛ.Ý…9Ûµó„f'¸uCîY…¨—¦ oŠèÕ0H÷"¶ÏÅöwd\ر‹rì&W•¶¨™P°,œx¤’!L.Cï$מ|Tš¢P`ðù1P¶‘fGn2¨ãÏ…üÚÙ²„àËú€“¹-•@á÷ O:bi¸© ¯'ßÏ0¢;Sv²·6 «Ñ%Ñ/í t`Ùòó“ýÖµ„©Ñ–3Cn¥¯èäŠ[-®KâÌÿþµë›rË»Ù̆F˜8KuýTÉfÇRüê‡|;ç6ßùWoXXÀ3IÝ«¬ŽF»¡ªÛUQTš¸qÀÔ˜qT º’y¤˜-Ûš÷˜Å¼PCų@TÃ@¨jù=äbìDg“"ô€®÷Ỏ¥¢¬Ûמ×J/ »Ó:¬üvíî„|BðüÄÓÊðS´,k·þ3O·#t7ýÌéÜnùÑâBßpÁé‚#@]Rèý -À†Š”ÁÄ&P¢ãaÔj(­ç™I'[ÎËÜK¼jǦDq9²#©¨2ÝìB)¤€—óÙZÒß·¢šèL aÚá'±9i25™}ö¤é×»ÏÁµž2aªô³™…_fQ„4t¦,ía_ˆ#ÅjÌAÒ3´c3œìðLA ·&ÍŸ_˜ ÔÃÄ^ħ,gÍÔ)p¼y€qÉDDÊY §»ÈÚdL¼g¹»ÑÀåÐù\“–d°/.œ)¾Òš˜ÄÈȧhœòQ‚±u™¤»®wÉ¥(Sôϳ§Yüõ¬ ”Q!q:¿Òqꜥ´‰Ða±WÏBàE7¡ºFá²´h¯äq‘b'§™å „~¡±;ü&ƒg«§½­>±®­Btr _‚WPÌR¹ØÆy…Úš¦IÀyxMzEyjl7Âä­P#»´U¸ßÓpði1±ãÃ"Ï·NJMœ[d5Õæz üMspàdnx·ÜðX0ÖÈ~Ž×<Çâä‡&E¢cÑ×\‰ð…ÂCê¢6¼§Pk{°÷п„Èü¶X–J›ÓáèÖ]à\¹[üObv£±¯ò±ÎM1H §Y*#ÆSC(U%ÏÍj«‚e©@Sî“3.sÁ°d"aâŸzúüái1b¨ÛšÔW’^4Mçv͸qn»öÓ\é‚öäïT|°žþÏÓñÛ…^aå9zµ*zùeŽ‘ó×Cdy9j€¥–ÏÒoŽ)Žân£L§Äù&ÁuÁ8· ;®èŽÏ ˆéc°·$‰ˆ—ËL.}ŸWǪ òÈÊ—Ó>\-«§¸0—ÿ÷.Îüp®ÂØá$Ï× endstream endobj 227 0 obj << /Type /Page /Contents 228 0 R /Resources 226 0 R /MediaBox [0 0 612 792] /Parent 190 0 R >> endobj 229 0 obj << /D [227 0 R /XYZ 90 720 null] >> endobj 230 0 obj << /D [227 0 R /XYZ 90 562.3874 null] >> endobj 231 0 obj << /D [227 0 R /XYZ 90 463.6867 null] >> endobj 226 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F67 89 0 R /F55 27 0 R /F72 6 0 R /F54 117 0 R >> /XObject << /Im7 221 0 R >> /ProcSet [ /PDF /Text ] >> endobj 234 0 obj << /Length 3985 /Filter /FlateDecode >> stream xÚ¥Ù’ã¶ñ}¿Bå—HU+†ñSbT­7‰7yYÛŽÄ™áF"µ¤´>’_O_  šÝJjªF$Ðht7úÕ*…?µªÒUaLReE±Ú_¤2ü¯Jž¶±õAþôæÅ￲j¥Ò¤J+µzó y³»þâ©>mÔúÜl¶j=l¶Æ˜µùÃf›eÙúÛn£K˜êݹí»ÍV—Ej׺ÚüøæÏ/îÞL[­?F‚|my™%Êd–h;ö#Ru€ÀH³©ûù#-Mþ{cSîa<«Ö;ê½@µÆ(jž¯ÏC<}À?¤Úl²B¯›‘á÷‚ýËHÌ?¿«Ö{$äýÅMjoן˜£be`›¢ÀVºÊ“¢,ª•N [äÄ"Ñ€“[C™U«­7yÇèOõ8ŒI…ÒÓ‰-Ë2\¯­´ÂåÓ\K\6f O¹„Ã]½ÒóDŒÑE¢r]®¶Ê$ʦÅõy€®dE¾¾k|(ˆeâ7‚lX€õ©I7¨Q»ù¸pÍcÓ7ºðNâ<à™Q5o°o¶G±Ãñüº»–7m B/ ³þǦ4ëæ]½ÔÔL|u¡Wy7%ª"(!M{ê:Ám}ÀˆÎ^#DI}߈Š&)øáíõ‘Ä\üøÒIÚmäKúT?6l‹™^² tž˜Ü«ÜIiŒºaqÜÖŒ°pIH@oÓ¨U’© ©"I+[Ñü—͇í,/ ÌÖõYžðàð÷k9d²F:­Ÿyó,š„¯KMy˜°Øu¿ÙZ»~ל{™xlØØCSž´Ý1 ]Ä¥utí±=Ôrôt´‘óPx¨,< ÔVUN>Rö¸diuÐIV© N€ÎD p xc¥T%À]3ŽNïa·}þv½»Ÿ³"S©€y8§õÅy½ZÎ'óGÜCóÐ -r²E¸QÊìûKðý¥)#¾V^ð8»ýìbé}ËR,Š$O Åxcv*&ZkjÖE’ëYάBú0¡¯Éùd6#"ÚñÜv  býŸ…ÿˆ x¹ÈK.á¥iåéÜžhµÔË¡9m…{ 3àO.×ÄÅ#Äi(‚Ïb:cÙ°KŒ ÒYRf¥¨ÏbêT%FåN›Nµ‹š ì}Óõg²3´„#Ÿ¹Ç§3L}Ü´Ð9¥d›ºr»œHmj²u<Á:ƬÖebMîØÜ¸øÅ¨™‰µUö ŒÉèÍxÌÞ¬RIšeƹ3öدaiY Æ•®]´ÇgB5žI"„œ‡GNœwàøåá4Æÿb9¶]?¶ûz?c¬hÖàgióNVt,FISé#cbªaÀgY ÝÈnêØ› Pd4ÍyŒâ´`À £gÕ-/²\ |-Av¨OÈDZÞ÷êÊ40X,œk ñ eBl÷˜>åùúnDùnÃ!A"ŠØ+ãÿÅSf²£ÿ÷dø2GÇ[·#;;Ú~v³s~ÙSŠHð ƒ1좑ן&îê‘þÆÏ’’ò*!ùØ_FÇÄ…gJ*½ ?&·àcvœt’&€t¬©8Ï™È(=2@tââhÖ) s<ܻР¨e‡ð(`À¿‰ž7¤à¨£{™¸¸XóûBÁÓfØ·î †0·n LÑü¥döM¨2#¿ºŒ{iYžè<{ÖÔm#@;%ÌÖ¯9EÛÕ`ÙO.J'ªŽ"y”Æ©ÊvõàiAzSqÉN‚WæJñwýAŽ|qw\ˆê©–«øŒˆT9²ÃR%e^.‚3Q94ç:HŠ€]Р±¿wÁCíó9HÐ(Ÿ=¾£`Þj†Û˺EÆ.³2IúD eŒ§¬¸Âí¿¿`ž€’À7¶v#&ŠC]ê UlþýÙË¡Œå¤bh8I4‹ ~ÅR)SɲJ2‘/Ù/,< |ðxXü0›æ¡[èk·x³41ÎQOçR!0¼!¦© Ùä¶²ìsÞLX­¸4sX{:9Çï¹è}Ë@1Ë"Ñ6’cRvö*#³§ÂjS…ÅÃëë DhY]µ-½¢¡ù™gÆùÀðõ<»5Z›ƒö÷d…„ýq„ãæ,‘ «=«ñûá j €ßO "&.bUaÑsq0Bu³õJ ’€ooœArЧ_ÏïÏëv‰ix9œ¹å唩’,Óêÿôs¥Ö˜áN”·Ç¦­ýQh:l¤þ|ÇÈ_wÞQô˜@{ÉqÉܘqÌeî¢wª°©å ½ï'f$ñΈáf@5 æ->¦ë‘Ü\Ù°LÒJüˆò•€È.ÒáÜóÕ©C{ÿ/®èÅñé`s×IiÑ™¸J'ÞK}3¯Œ¥† ÐÉŸjê¬èi‰gÇI,r¢¤«<äHWV’‹Îù®¹f“yláï¡Áþ=þ`ÇÏSÊ/ÎíO5ÃÐÊÌ3Èv“«B‰ªEîe–j½Þ#•tNf¼x²bx»cÞ½#ÖH) %ÞPÆ””èCáæmBu'Žr3A_Š8Éi7^-w'¬õ&FسCÙ -Šˆ;qýçœäÌ| †å7ƒŽ­‹$!)ÆíØóOH²•À¿õ@J';G“'„,—ûôD:ž—ÀôCßòƒÅæ6Šj˜×##a'‹O¡“Å‘eã¶”Þ“}}Ø@UZ\ kÀÅ(á’i¥ŒQ&ó?KòäR~Öý³¬ª£r‰ô«>÷N…2ù‚¤Æ»<À¾ ŸZÆ”w•luœ– «÷³u˜<Íî°kÁÊŠ ~fJ¼l’ó1\ª‚¿[qU¢”ÑÚ†z¤¢ã­šhÒÍÎì0·ÁåÖÀ\NŸÚ1þ¹Øþ R6Õñ¶Xë®Eßp9W RSà¤çøÐCäÚâØß%`¡–ÎÕrƉ §Úžý¶}â ô–ûËn—yˆ:d¡ëáƒý ¥ÄÏdèâM¼”Åq¯"À`fÉ×â;ö2'¾F9l‹j 3)Ùeäì¶ v‰’³Îñ”n(ç—×ë$GÙÈ©í¥pø¤•˜Í«•·½ÌJ‘±¡®&…HñÔ¥î~iA¿Öv\‡“ód¹ ¶D›Œá¹Ð\ì½ÇC3ÌÕȳÞL’’{=á!ï@kM€^r¿R(8ÄùGš~Ñi颌¤‹Š{ÉâPŽ5'ýý½Nõ‹´ÅøŽ "éô5fo”©†½³k—BÌ­ÌÛd:ÉKëʰW¯aù›oáßëï0³)`äË»X^Bž[Lû|ñê‚·6”7K4díl›2D×gÝ®=Õ2ÂT»£NŒáVŽñ_§æ ¸?ÎlãT}fÏO­'C‰Q±Gó Ëé NãRþú·¹ñ…v"Kõ\2hlþ ðŸ›(Xùɘ¸’CÈ‚:N4§ÆÛ2¸j]Ä‚«&¯ v¼Ç(§ÙéhçVœ5óÐNÜ66e‚KDĦ˜ß:,œrE¾ëHûS»Ì˜;G…oïù§lÒEm;bz˜Ö;%K³Àôð=œ —è_jn¼…Áç*nv¨^áóMË3z²X©q3ê˦þÏÔñLÙŒ€X*gÚŽ®ØSö84;‡àÖ«¥¥b«D»hÂÝl\&´Ð/è{¬çûC´œ× Éi‘…å|‘gaÚ•aSË–~ޝ§÷¢£B/,eÒõæB=zÉMþ9mš2¥àÖÞ¤‰Ve¹ÒpÔ¥1úÖ­½ƒÛú€±[û+„á­=k ÄòóÛW~¾Ä—™ÛÊ?ÀWý™Ûtx¿OY±»ÉÏÖæú&¿È’<ÍõJç)moÝä;¸­»É¿BH7ùLq^%yŽ_á8 ­ÐÏöÝ €T~S³§ß_¨ý:òÄMã„fÁ8œq’âòÒ&ÞŒªSißó‡ðcž-T;8Zˆþ_¼¯šÀúÜY0ü~íTžo9¹ÏHé—µÕúïXz@±}Í®$ñÔCϹùÅß»:ˆ„ºT“ß-åC™þq F.Åžé¶ðýÿÜ3íÿAº–dž¦K&|YôNaäÄ=xB»½W¹Ñ¾üØŸ.KÞ¤Ý|ØÆ\<7ê¥É‘ð×baQ ï¼Èt;tÓ™ ¡„΄zïQ]ƒ dbèèZW~Äy@åŽßFe+ НKð¹qç1Ám}Àˆ•]#¼õ!]Î?o_Mw¢ùÄ÷ä"jç%ÊòÊùUnmú#^b‚ûý×=/aÊ*©rkC7ñG¦ô¾¼óuQjq—éZ€~Ïý” ¹5òèO”}Y€©+%™rwq}o¸‹l9zé7À×KÓdx^ív³¸tãÜXõ˜âènhùæt¾ýÀ–Õȳ~Å<}–†G]¨©³Û0¨w"«ýïœdÑã¸f‚Š@ËÈEý õfQèÏ}þ$G:Ö­Èv/‡ûñ Q¾s‡Á?^-u‰‹ªê¹ã5Ùõ'>?#ižÑxñ8-Ž–üOÜhAB•Ž›»}{޲—Y²¢JŠÜä!+7‹ÖþëŽr»hÖ “Ô‰tñÄ*ýºÒpýFÉÌp–­|5ðrõ¸ ,j“r¨|Û'Ìü·‹ÊʵJ§ÕB&eŽer~õáŽÎ¡jæ UKËéS•ïiózÇ$Äòg<G¬×:žY+Xçôí“Οé"mrО°Yˆ#£Ì\Žž‡úžœàSÍÄäÓ+Ò`ß»‹‹×”í[r>˜Vc¾ðM» _n$K°òÂæ¡™Kçë@_wéœmCC…7>„½÷@¾”zÍ ËVãMùewh§d£v\,ú|k·Î»åáî‚;"»&­ç憇'¯˜Á¹ùë ްf¼—sKÍÆß¢‰I}óÂQ\1ëîkN¢>¦ˆäÂiåLý›_Ù †û $н í.ÚÐIaŒûþ˜±7(Š}þ¥S–“<á’¢_´3W@¾ä¦×Dz¬ ÌJµªtuí­ïª'°­˱–èb)²^²$ÞÂøw}·]ÚCSw àåûóÍå¯î+lmYñ¯°U–^o†¼»^Pɧ·¿Âv`[.Vº-ÑMŽ7ý/8Ú$ endstream endobj 233 0 obj << /Type /Page /Contents 234 0 R /Resources 232 0 R /MediaBox [0 0 612 792] /Parent 190 0 R /Annots [ 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R ] >> endobj 236 0 obj << /Type /Annot /Border [0 0 0] /Rect [412.7272 668.2565 522 679.1656] /Subtype /Link /A << /S /GoTo /D (Cameras) >> >> endobj 237 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 655.1059 126.3637 666.0149] /Subtype /Link /A << /S /GoTo /D (Cameras) >> >> endobj 238 0 obj << /Type /Annot /Border [0 0 0] /Rect [430.2188 271.1059 522 282.015] /Subtype /Link /A << /S /GoTo /D (Mouse Motions) >> >> endobj 239 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 257.9553 174.6062 268.8643] /Subtype /Link /A << /S /GoTo /D (Mouse Motions) >> >> endobj 240 0 obj << /Type /Annot /Border [0 0 0] /Rect [354.2124 214.558 494.9095 225.4671] /Subtype /Link /A << /S /GoTo /D (Modules) >> >> endobj 241 0 obj << /Type /Annot /Border [0 0 0] /Rect [342.7481 89.6265 522 100.5356] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 242 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 77.0819 131.8182 86.2334] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 235 0 obj << /D [233 0 R /XYZ 90 720 null] >> endobj 232 0 obj << /Font << /F51 9 0 R /F55 27 0 R /F52 12 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 247 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/myfilelist.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 248 0 R /BBox [0.00000000 0.00000000 138.00000000 270.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 249 0 R >>/XObject << /R8 250 0 R >>>> /Length 251 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hln¤g62³4×3S0Ö3µ473S0Ô3´´42¨¶PpÉç BpVæendstream endobj 248 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150405) /ModDate (D:20070503150405) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 249 0 obj << /Type /ExtGState /OPM 1 >> endobj 250 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 286 /Height 562 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 286 >> /Length 5500 >> stream xœí½uܺ…qKy©#)t^KŽ˜ÜT†%ܬœ0’×R íÈõ¼áþ6~’ÀðlÙš’l}Hÿ, Ä_´úóãu§@ŽP¬tŸÏ“=Ÿ_ƒ?âšXß÷O¬t?¯ö\_Ã^ýk{.ÝÇ·™˜À»+¤çãÿØ?“+’ž£ciïgªq4=Ï{ñ܉W$=?aû~:}Y\Qô„Ú÷;nׯûÏ×@é¾8ôøëð»h¹‚íw¨tÓÎäГ•rGºýÊ0—άwßÄLK =nÊKZoÏ×tžoiµ¯Ðßx)Ý3-ÅôáCÓ#-éÈž(=†=S™ÖÐóæyÛ¶²è¹ªœžig{úµAíHmý¿IU¢Ç>t~óÑ3¯x&•sÓÖãol1žGϳYÄç7‡!ÔÎÕ¬Aúoülü!sé±ì™¶4é±ì1˜i JÉy&=vÂozèÇví¡ôL¿Jéq ²éé²b6j³ò©Ürõج‹={zÔžGÍ=ŠéAbz°bô˜K™µf)aÓ#—Jç£çÓ5çõõðk*«®.Ö„J§éyûø6ùt=@öê[`yW "´b¢gréñïm3¾ÎeêïçdÜÏyËõýGÔ”þ7_öûr³gâè¿?GÔ’Þü®ðÍöLu´`{ˆ®ö˜-ÓCu£ç“÷0=TLÓÅô@1=PLÓÅô@1=PLÓ£g˜_Æa×§SŒéÉlÏéŠÒ3Ò·g´'žëž6ÎûÛôrýx÷n¥Ò£w®Éùÿî¥çö{¤öL®œeG+¡gÒyìÉl¹È’ûW='³'—Y5ŸÄž zo–†ý€p÷ŸsAñ;ÓÅô@1=PLÓ¡çý°ÀŽÓwò>BÏ íy1Ê£ç»ýõ;׃°ìÁôœÞ¦‡Šébz ˜(¦Šé*¢G^½IS`Ãa\Vëszƒ »ïiVóåËà7iz=½Ø#P† ËõÊÀEË¥\óÏmI1=ëÝñ­©Ðeíu{~Õq‡óY.Þ-ë‹é!—ÙoÉ-ŸGzÑ]ŒF~Öz¹‰‘Ò¨R“šWñõU‘l$Ë=è«ýƒJϰÇÞÛ¬ȸÖÐ3Èâ ÷¿gÎÖX¯6¬=©ÿGbN‚ZäR°g°²$WÅ×Ñã\_7vkᲫӜÉ÷í}©’uô¯L’ ëÜzÍ©t{ÌÀܾ´î Ûs»ên—N_ K·G¸ ¹öè5A{¬ÀìYKÝ¡H~)h¢=VÉÂôeË³Ç ¬=º¤žÝÀ¹½^M­ìÑ»“Þh©O¥;ž‹G\0 `¹SDÏR’Ý€´(VMJÿld½ ›Úö«dŸ=¤N7ØóP4èêÆÓfÐZØS@m—ÓçAû!»øÜK?t½¡ÿäÁ†Ý2@Ñ-ü »z/G!œ#“ ôxe'lÎÓºo×˲Æ»wlaq©β =’pcYq}©m¬`–ÜßÅý=PLÓÅô@eÒó²w|‡+‡žó¹“CÏÙţà˜(¦Šébz ˜(¦Šébz ˜(¦Šébz ˜(¦*i û>T½Ë L­”tû Æ`±Åí1ƪ¢´Y@tnŽ99D‰³ È‘Bd$å2ð™ñÈj±¢\=uÍSâƒ9éÎã ¼´6–É´§R¢yʤG.ÑՀ㼮û3»Ã+$š§E¦7òÚ³lRu窔hž é1ÖøéY¶ZQËž:‰æ)½åòÚ£ì©X÷ÔI4OYÇ=êC¨j&ÕÃÝTÍéG̓(i Ôm½¢ëžv>ç ‹ÏØ¡˜(¦Šé‚ôl<ÿÊw7 =To¯¹_`˜žmC¼Íóî.Ú#ïÄ bôl8ðrãø.§O¿n¿ÅNy§£g'{žÄåQm'ˆFèiÙž=ÃaFd׈䫙÷抑@ÏÙíÉ£gÜ÷Ëë¨NR½²)ìzCóV×rèyºZVáì4D>=ÚžQŸÏ+{–»F½Ù#KOíQËô-’¥J°'‹ EÏ8Ðw~úO¯"[âÑïtÞ{².Oz "‰YîQÞŸ*qì±÷6ëÏ&ö¬R‚=±ãžÁ´ÇCIÀ¹½êXôÚó".2¿—<{*ô9G‚H9î,k–[²…eQz9o]Kì3ìQùì‘[;U³|_§j‘D)›š =òª ¶çQ“¹sÍŸ*UÍÞ ÒZ®R{„Ú©=4Ü|{êTÍ ÒZ®eºŠA¹ãÙ¹¨q¤å©=ÆAÙ%³î©Ør‚Hª{ŒŠÙ×€“%ªYÓ¸‘k>ª¹3ìù#s˵§ÞqO ˆÄã£íò7ì¤MÒÍ–Õ°¯µGe¶dTï¨سË9—u¤˜jÏÖªCÏ*ÉË\Ö=›Ó#/©š‹z±çàÞÂÖí9¸·°u{˜¦§,¦§2=¾AZôp6|¤fŒ-K³‡ô]ŒÂóvþ¼bÜ|uzho‹é«68Î/±G¦D“ôœ’V°§¸¿Ç-£ýÁ€èÀÿõšöÀ<‘*ô÷¨ròäI†ëØcïmúÌhp¦í\2i2zN…"ô  9¼.ßžý=Õ'ÿ-´‡¤c÷4gÖµ'vεÑ俉U³Uµ j¦J’,M=o'«AÉÝGMОeçªfêQ’-‚=ó’ºöÄ[®R{„9Ú¹ÈaL&kÓ£ó-k¼ÖÓ#æ«Oþ›oió^öDëó€"RÝàÉe9’ Õ·¬ºx§ª9á¸Ç°Èß°«÷BWÈvþÎÕƒ­ì¢í¼¬œª7컜s¹à7uÎµŽžU 0ß‹=›Óãg¾{¸¿çøº'Yëö0=LO$¦Ñ'=úhÉ:g(8€AôIÑ[x=-ÓÓ€=-ÓcôŽäÔKŸa©çÄ­ ¢Sz,{ä)±ïÿª z¥ÇèÎ1û7¬×UAôJÕ#h÷Ϥííi›Ú[èÒC>¯ ¢[zŒÎTÚc¹—=Ócø1ø«å-«æÆéqëâ}ö†éIѪ#ľéIÑÖö0=÷LO• î—ž*A0=0¦ÁôÀ :¥Çl–ÌS £{¬ðÀ°szí)nÜÀñm]ÝÒ3>=NEõêÛé¥üä‘,½Ó#ïB¤G•ŒP¥C è°ÃÔ“øîéªÇ™v8 ç-í÷Iß×z§çx{˜ž3Ò“äQïôÈi&d mUÍÔ·ÆN¢[zT£=zvAúY…©*ê5ì-Ó³µ:§gk1=IA0=0¦ÁôÀ ˜Óƒè”ž:S[¦§ÎÔ~è! öëLm›žÃ;S›¦çøÎÔ¶éÜß#skÒ¦‡é‰Ñ+=Çw¦¶MÏá©-Ó³µ:§gk1=IA0=0¦ÁôÀ ˜Óƒ`z`L ‚éAôJ<‘úqrf;ãÄ3V5#ˆNé1ÏØCý¨9ݧþ :¥gé´±ûuÌ·"±sÑ+=ÇÛÃôôM9]fØžz§Çªš½öduŸúƒè”§aسaÃÞ2=[«wz6Ó“Óƒ`z`L ‚éA0=0¦ÁôÀ ˜D¯ôß™Ú2= t¦¶LOVwØ û{Ž·‡é雞c;S›¦çøÎÔ–éi 3µez¶Vïôl,¦')¦ÁôÀ ˜Óƒ`z`=ÓS::%#ˆžé9Ö¦§mz.r‘ÿœky`ð|;¿y^jv²ŠüS¯èQî„ÏØ…zórÏ¿<µžr’}âÞ>=ÈŒþ² £u®NWgï†ÐCb{¦]GÝ‚,÷-5džXaO ˆèQ‘]½…Ë«ÐÝ_äÞuá¾Ö ¢zšõ;’·iú0ÿìÉñ(Dô`{èÕ,r P˜K”qÅUsØž£é™+CõÆÌ[ßÒ/?º_‘NÖ¢>ÕH-ÐíÙX öNÏ‘|Ý'ïÔ š §m{ާG<]æ—C;4—Ç@ éq]Ó˜VüJЬ8ïX9A$Ñ3%wyöør½uÅ [š=ùyGÂÈ "ž)±?济¢¸TOåÃ[Š=%yGÂÈ "JÏ ¨i˜c‹ÛS–w$Œ¬ bô¼È3ªöÜÚ¥—˜=…yGÂÈ "JÏo1Tµgj´ãô”å #+ˆ„ºg²¢=·¸Òêž’¼#ad‘Ôrý¾}¨dÏE&•Öråç #+ˆÄãžß™!>éA)†Ÿ.BϤ÷äæ ##ˆä£æßyöøÝ™"#Ç©GÍyyGÃÈ"¡åÚNñ–k­¡gûÎÔp`;v¦‚(¸¿‰{ ¡˜(¦Šébz ˜(¦Šébz  =v¤Èi¢ç¤ö\ô•S¦ÇÑEö@zÎW½ ‘NÛÃôbz ˜¨šôÈÛñÌ…£ûaû‰+«&=ú.=²ÛÓºQUéÑ›é>{À‚ÆTr£Ù0ßø:èŽÐ3èGË7¬êôXÓuš·,j{èÍÕ «*=·ß„}›§k°÷Ä&U¿î¹½›~A{–ýª7{Ö×=¸Çç‚â3v(¦ŠéÊ¥g¯;«ZÐËŸlzöÆÖ€.{¢ôDn »#½Ñóç$û×wŸ= ôœÃžk9KéÙcB‹ƒõ ¼ö$Ñs^{˜žYLÓÅô@1=PLÓÅô@1=P«èiýÃz­¢ç´öpÝ3‹ë(¦Šébz VÒc (¹…‹ Yݽ©\IÏæö˜_mÅžDz¶q'˜ìþÇYëè!Ó£QÈ£ÔG20Õót$²ÒIc Ï¯õåáyhýö¤ÓCì± OŸ°á<[ž<IÀ é¨Ö@BööÛÛ“~εØCG€ÑÄ;gmâ.´G‘Ñ‘xÁ„Ⱥ}ìI?çZc¹êØc¬ÓïÕ¶ÂÿÝ;¢‡Ž\u6¤£Z=#\Z¼Mz~¨aú­*®ùâ³Ç»½»apýaö$ÑóC:CÆOºU³Y*ßÓ‘Œ ÃU³½ûÐúìI§G ?•oí†Ý°Çût¤¥aì4F]~¡îX 6ìÍÑã=ç²âó…k/Ë.Re€jž±[f¾ã4ï±[Ni79ø «*=ÖƒÂ|Ï ó.Ë)mîÃÈÖ‰û{ ¸¿ª¯þžÝÕWÏî꪿guÕß³¿ºêïÙ_=õ÷ žú{POý=¨£þž=ì°ÕQϾÆÈÒvÓßs„?]ö÷ì§Þú{vVwý=ûŠû{ ¸¿Šébz ˜¨5ôœâVÿbzNáN1=GÄz„Šè9"ЃT@ÏÃq¥|zN&žý Šébz ˜¨,z½o%ÓsJw’é9§;©ô°øù\PLÓÅô@1=PLÓÅô@1=PLÓÅô@1=Pqz¬çùÇ/5<ªi•bô¨ÿjc„o{‡ŠÑ³ !Ùs¯ŠÒCFW껤¹qZ ĵﹹEë¹c‘±Ùž!ÜžûkîB -—s—€ç~ ï=w ¤ãy»šô¨··µ÷mOÂq¹ÙÊ|+_îØž´–+dÏ0Þ¹=iÇ=éUóÙ“xÔjØ…²HopOöð9WX|ÆÅô@1=PLÓÅô@Eè9Óˆx)zóQ„žÚcÜA¥ç7rz–=˜žÓÛÃôP1=PLÓÅô@1=PkèÉë l¸Lóc­Ïé_ &ì¾§Y…/O’r­¡§{è|Ør•3ZÀþfÀžLzÖ»ã[S¡sÚë¶#àŒð½„5k•¼f“3¯¥°× =C˜Ó¸hO.‚ÈKG‚>¯aPÛÑ‹ºÔ{o³ ¶'ž²y-õöž+AÃMÕ¼„Dì1/"ÑK‘&%{<ŸVÐ#“¥ØWþäVƆb¤ß%ÉRÆR%ëˆÝÆd[¯©¬-{ÌÀHJé‰Úã™×Rí\Yö7!×½ &h²§=¾y-—Åôxrté1Ê–gX5ztI=»r{= cmœ`0¯è/ßÈ숾‹§Â²  –—ÒS4¯%jiýŒ´ {‚U²ÏR§ìy(tuãi3h­_N(ž×RÇ'”kºa'ò”‡šÐ¬ud©{d0:rA °–ž ®ÞÏyZ÷í YV`X›x*=‰å]˘iO^â9Z›x*=絇é 'ÎôÀÄ™˜8Ó/¢‡Þ”iÞ߶žùÎtrojb ’—IÚ7:Ç/ Ç¸¥×Êf=ÎéN¬‡Ø“Kf†Þækd²Æ³ñ$%Nì!™Äϧþ•kѳÜà-È,5é±o &žOY ë\u粟™RÍßY¶ Ç¹sxuÕìLB]eϲ€N.`ԛгÕÎ¥&: OS©HšäbÎ œøÚº§~ÕlÑCÖÔ·Ç=$±´ºåÚ°aoÞ•Ç=Õ ÃUsu{rªæµGÍÔŸjöÈùlĸ=Y ;Ÿs…ç3v˜8Ó'ô¼}|czì¥=Wf®ôü;}fzÌ¥Wz>®¯ÓÎu}ùdzÌ¥?þÞ^¿ÜìáºÇ^:Õ=b±´\éw1Ø“—xŽÖ&žØreÜã•oOfâ9Z›xÚqOÎpÙöä&ž£µ‰óø(ßÅô@1=PQzÊfǺ#{xT|X<*Šébz ˜(¦Šébz ˜(¦Šébz ˜(ž; Ë¡ççѵ%‹ž¯GÇÓš z¾~òý£é ›øñ Vv/\:MOp ñŠVw®Xéfz®íVøçUàõ}ÿDJ7Ñó ~x}ߊ”îJ èÿV.fendstream endobj 251 0 obj 69 endobj 254 0 obj << /Length 2526 /Filter /FlateDecode >> stream xÚ­]sÛ6òÝ¿Bs/%g"–ì=tzwi'&éµ~KÒXbl¦’hST’öáî¯ß~$e:N¯ϘøXì.ö{!µÊáO­ê|U“ÕEY®6û‹\–½P2ZÄz òË‹/¿µj¥ò¬Îkµº|;Cr¹}•üóÆß¦*št­’>]cóUº.Š"yvHu[½ß mwH׺*s›˜<}sùýÅÓËHØjýkòo*/`»X¹ªÈ”),1ø ðâòdïÛ®o=O¶À±?⾯s`ÙÝü'µyžtt•#C޼ǫtx…d“ê2ù%-J“4ŒãÖKÙÝÊ·þ÷ “ÂÖ‰z(Ïë\8¯“F˜ØvBïÖ·ÀÛaÔ(Øêî;ÂÝí eÛ|˜ñq<âæ   jâ^­ g­L¦lÎÚkîNíûÔºÄïQÒª à×ïnžÌ·Œ ‡¬ëÍÎ~æÛo»>E¢ƒâ® qÜ˱"9ê°yOŽpx*G˜ JBß§T&ŠÄUV¦ïdsxHúÈ|CÊç²Ù¢&®Ûáž NS+â¿§ÉuM'$ýæŽnñßÔÂÿS¸©aà1ÙÊ‘€jhhy'öijM°]Ü¡wYºvÊ%ÏX͸çÌäRp'%—´ MänhwLçÖ£n¼ð}<1Þ ×ÛîÈ;"+käç‚eµ $úÇ‚ìbm˜ê=bßîZ¦ôû SQ‰<À iââ¿õ›vë·Á–e=ZžO@/(Á ÌÞhøsý ‚v’ÅÛ¹ïy‘Ön[Š{QùÅÒ5)í$Âdßñ1’ß éVIÍ¥K0búvêåb­z²'ÄQ'Cçtß5 @PD0š›°eÁŽˆ¢ýÜŠ`[dÇ£ym;&uœ; .¡Äbñ»OˆÁ‘ZdfÛn<…1cl2;A+¬ÞùüÍÄñ‡ VzÛüßÀXá¥ÕGKí>¶Áß:õòm‡fÏ'˜ª²gK”Àrˆvļ‰dàDT$à9 Jlí¡ÙeÂóäG ]½Üð#A˜]÷dÉ:-•‘§*ªC©ûêPSU*`ØKDì $½b–ô¬ËÊ¢.:ý)µpn ÷bmgISd¥ªü4n ­/ú/þŽ£’l4C´õœšê\g'b‚zÆ¡r™3ªŠ[bÊf¥.@¼B¼YD•gP`˜Oaª3¥"­àüȱgÑrò kS;`3yNš@,Ó ®¹foÉÃ<…42¿Ä«)!ßVöÑ[ë ¹n56Ǥ]} S•µ©â€:³&9Œ9¯¹EõKöãl¦]ÌáùK¸Ïå3ø÷ò*Þ&Ïqü¯§‹DMf• G3&J^âA$4;1°j[HJÀð…3t /^ó­¬GUP¦{‹®FGD÷©Â))G£r”;WNÔ2'H Ý"`É!³Œž'ŠsåÙµLôÖ/ÛXe¢5²21¥Ž ÈgsêC,¥ÀáX¶ö݉c9(ç8´¬¥˜A& `™ÀnšÊ楗F®2CÓ"Æ0N‹K­¡ÐÚLh/& w³¬dL‘X^ KtR5´ØLÁaZ´ Õ¾—fÀógëX¤à¤UV;Wc;ð[­À³AöWî7çm‚v:ËuéV¶Ô™ÍÂ>àîâÕ›|µ…žáû 9üˆLÕµ^í/tžÙʺ°°»øùâßc[Q®§8©·0+pà2'…”Á]ʲ2ÄàÓCjò„bmÓ?̬ƒ¦Å€Gÿ•ÌNp³3aB¼Î¤O í2U‚ƒP–^²ä2Ó®¸žˆ=4TÁ5};–ó¡ECRÐf™JA_fMViÇ–ôÍîÍô€•šÑœý:™PMßè~¡ŽƒµT<â.mPRG€XºÁ˜Ëm)À¼BÿÃi9>%†–1ª,TòB ¹‘ÓJibYÂÍÁ¶ÛëõÃ=T;PÇWJGYŽý‘ÌO{/·c#{²ÓQ•Þ{x¸ËÌíyï^<#!…T;W¼q0?åEFCø*¡t³¹Í¬¶åŸ7̈r=ÅyÏ‹"XQWY•çõã^49W³eõW2;Åyß‹LQc×@ºFDÅÃ^Te®„êåyQÔ<}eUt]¸jbNâ,!ë9 §­ýœ¬çÃK‡ÂôŒ-\è¸=@Ï‘/Í%/ž7¸Ó/ó¡@x•‚Ha³ªª±˜¤MÈË#Ö¸'Ž:  šñ3úMôè²âwƒÿòJ–bÈ1Y^9;9ÏÑ{ QGÔ€qê8§æóB<ÏICá)b;i qﲬ®km³¡9BA3z†ö$g¸¼ü…/Åšz¡EÜi?}=iË¡/ãXô#‚R±çb—ÑKº BPì-¿Vp¯¸TF艱xö‹Íà¶e­†*î˹ʱ´J,XÈTp)~9õ7‡PÕœˆ‡^JÐVuµÃº ¶O±nZàXk°±ª ²ZæÜj–p/éɃ? í…bÞtf×_€ëN þ¼†vÊÕó—ÄLoÁÂÔ_öšP¿&¶Pv6ËLÿÚüv•Z  –òL·K×-€”rjZëµXâôx’$F‘–¤'?Þš^².Âmå+/ÍnœöíøLEÛ²‡MúҴ֙㠄¼d.)ÌB¼4*v VQ¡o’v?úxk|x¨ÃÃÃÚX•UÖœ¥`¿iãœ~,J¡Ó >h¹M«lVTEýÙmÚeŠÏ‰ýu3{5È…ýü®ï ³Ì!«“ HE-¶ŸЇê!Þò‚÷$䙸‹ÃõBU%p¹wf³Òµ‚›=jµ]{üYÆŽžl] ÕþãüÈÍ!ºNëš5ų v¸¨@]CÌR6´ü_?*òŒ!`Þk §›©ÊAYem¡q` ¥Î"ÅŠ;ù¡ófÑ$¯ù¡ìåUº†õw±iäýîÔ4JšA‡½çX{/ÍØ—ø~„mPh/>¦J^a†i~ñP&9¡ƒ ˆ˜´'§½ ‹ü(S,zëdÅJƒ&šFðîcmò®º j)KºÑæÄ8l0ñ7$pp‹wÂÎRŽÞúvlVGlAß=5·\$t±FXŽ4J©ÌAô}~‹rØ5ÇÅPc VªÜ$Ô°”eæð¢YùóE­þ­G×ЧìÚ ½i _ø^q±7¾w?Ä´+Â+ÎôNGá~1ÊCæ+m9 òµšEi™.FiüqBŽ|d>ý­ïñ p¡ÉtP n?‹âP/fg çè·* wVºÄäúl¸¤óÿ2"׎oÊ¡â<{!äò, =Éÿ‚úŠ endstream endobj 253 0 obj << /Type /Page /Contents 254 0 R /Resources 252 0 R /MediaBox [0 0 612 792] /Parent 257 0 R >> endobj 255 0 obj << /D [253 0 R /XYZ 90 720 null] >> endobj 256 0 obj << /D [253 0 R /XYZ 90 214.1109 null] >> endobj 252 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R /F67 89 0 R /F14 131 0 R /F3 134 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 260 0 obj << /Length 1872 /Filter /FlateDecode >> stream xÚ­XKoÛF¾ëWðH&Ã}qÉö”¦‰‘"…Äè%IZbl¦’(“TE{gvfùhE"wwvv^;ó EÂOEX¥’B[¬w«”§ÿX ~‹"ž’üt½zöʈ@¤I‘"¸þ]ÿ²zy=l¤|@´ûQ8­dìmbu†DÏ^ïòàçfõn$A>O) ´M²4•ʲ$’ÔxUßA¶B t¨H§† ¯H«·‘,²ÞW[o˜öy ´÷ÇþÿD}›M‘ Ž U,ŠÄJ™»S^vn²yx(‘žxYÐ6aÕîê¾¢™û#¿O·¾Ž¤ ´U!³éœÙ·ÕȱÙó¶ãŽže{ŠÕž›ãC˶Ç=- 7ÃÎÒŸl ìÇÝÕ¦„e¯‘J„IÉn¸IK0FtNšþc*UdÒ4lÜ^oØ ¶Dò¾A- ¤¥7(9½b0‘=3´OaBÇR[VD…*íèu_¢fN½ê¶ÜÀ™$q@й ºÉ9›ö'hÙð&~þÚÄKÊöõçÈi’CT<¿q’~Ã-Y†pj¢ûtfC ¦(‰ÊÙ×·hx¢á/0¾>nL$Ùó±Îñå®Þß± çœnŽÝšùJœ^r&ÆGnÃKwt³s†­«¯?aè¬-JAÁ™Cü57-¿²KT^x@AŠÏŽ(.–JÌÝÖÒdE ólx㙉›ä °¨Ž îjjº™ÞKÈ…£|‹Œ½tgÈ3•¿W †#ʈK>ô ”§7ÿæ 9àˆ¶mb2Zí« óæ†Ó Î4¼à”9ârC³«è˜=»(–‚ÝÑ.é¿.ÉœèU™†Ý‘îgjÔ Í.Ši¼Õ=*¡$Èt¤Å©×‰JIá?Ž"%«ñ>’W+:ÿàv4]MyJº‹Þ °Þ–¨Ë³WByRd™Æ¤­$dѬÒD¹qÚݧ‰´Æ2Ë‘Xa¸_}ø”¨(¿¬xóW,/‰( ìV2MLn2?±]½ŸÖ“e<å銊 lRØÔ•”ÉÉ2I¡dP²ßG C›´ /)(û]…y:ag¶„›(£œ°Z+'kM6ŸWJ§©<ˆ'Fcã-V&KÔÑyÜQúÞ”c2¨o©®Á°¡G®ó \r¼6c¡š&’=ÖÞ¾L3wÊõ·qfÃ|ûê[ïã%—ó[/‰“òsÕÒ5€Œ²Y¼E W«?ÿ“ æ+ %=žˆk¡e¢R% lYÈ$O‹,@ ©¼øÿ±2°Œ§<Ï{Ô}Zz|¸|ñæÓ½»ÄË™Yˆ³þSiHËΤ]躧¤=g8I4˜rs¥ 'Z{‡NâBÀ®é·ñ0tŠ8;€{}’‹:"ðŽ}(”ê”û]„§Õâå’*ÉdžÍ.IR8qí-Ž \¹e qi¬wUÝ–D6挿0w™Wq¨sR¶ÀŠ‘K;k{}ÆU¹tÍ‘{R¶²'Õ; $“Ó“1[=ë9‘–™>ÖœEÙ;_niô7=ð ï”.ÚOÇÍð~¹Ç.ºÞKÂ’Ò¸ZÒuŸ4õ~¸`A©lé«‚.Þ•;l†LB í¤3äÎ^ ‰=Ò.À%—æ˜õ¼>uKêîèƒAßú¼rÊPãMžçŸò PlšåPŒ S_'œgu¶ÐOÂä~lZ}e€ÙÅÁ¬¢sHë­ãão-nðì#ëñ+ƒÒ†Ú¤éTvÞI2†¤qfƒ*±¡ß\΋þÕ%g1::Zág®sT]{¼ÿi¬°#U„}柒`޾HB‹/gîÛD9’¹Cw4ö_ à:âØ˜ðKÕ/V)F=h5gãõ´øâ„.Zž}ʸ  «#F }§XÉMBDö­3ì¡Ïcð²sa²ïÊ[–äÏcÜ-Pm‰/>ÿÕ%Ð endstream endobj 259 0 obj << /Type /Page /Contents 260 0 R /Resources 258 0 R /MediaBox [0 0 612 792] /Parent 257 0 R /Annots [ 263 0 R ] >> endobj 263 0 obj << /Type /Annot /Border [0 0 0] /Rect [261.0851 174.4719 390.4337 185.381] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 261 0 obj << /D [259 0 R /XYZ 90 720 null] >> endobj 262 0 obj << /D [259 0 R /XYZ 90 684.1345 null] >> endobj 258 0 obj << /Font << /F51 9 0 R /F14 131 0 R /F3 134 0 R /F54 117 0 R >> /XObject << /Im8 247 0 R >> /ProcSet [ /PDF /Text ] >> endobj 264 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/load.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 265 0 R /BBox [0.00000000 0.00000000 264.00000000 60.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 266 0 R >>/XObject << /R8 267 0 R >>>> /Length 268 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`dfb¢g630PÐ5Ò3¶´01QÐ5Ð3# S¨z —|®@ ŠÅendstream endobj 265 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150405) /ModDate (D:20070503150405) /Title (blah-000.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 266 0 obj << /Type /ExtGState /OPM 1 >> endobj 267 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 551 /Height 125 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 551 /Colors 3 >> /Length 2068 >> stream xœíÝ=rÛ8Pæ:ªÒæ)R¥ñLêÃ#Hã*…O6Uγœ ËPüE©÷f#Ë4Q3øòI´÷]¹¼«ÿûýû÷Sÿüùóíííz½n19i…íz»M»…¯_¿þKúë>$ëÈi?äóF£1íØT…ä3‡ ø—:o¤Ò~ig ­vUØbÓ®çÿþýûM×Ùâ1ê' ra»M»žùãÇ]'|Ãh4Æõc'x†»N 5FãÑÇ)íJ3Úuêo$¯W<”~¥í:õ76ºœ€Gp¹\+Íh×Iu9uxøÝ/4ƳŽÕŸw±JÛiÛ9‚`¾ëü\}ÛkØ6–p§}Kôë.í !´ ë”ð“0*ª?¿¯Óž'þcþoß¾µçi>©É×uŸÀ¬ð ›Õ§²Ñ´ûºo§˜­`õæ³sv;Rב:‹lÝu"S§úÕuDpZåtêöM¶ct‰xh¿·Ø>`öþúN©œ˜®3õâ×=vÿ}·§8ºsv¥ª ýÀë»NçÎÙdê ë'6½Ó޽!48OUH׉|ÔÎÁK8¦èT#=&è‰iN`v§möä˜Í° ®³(uªVâÅw¥Egð¶¢<šÙ®™:euÙ‡ì¨;I×KÈûǦ8‡˜®Óþò]gpéÓ–v×Ügv§üh§ ®sŸE]g0ÒúÞÄ\íšiàqœó¶„O€´ü¾ÎÔ !]gæ –®3õH(C׉ÿq]àü6í:Adöè:'·u×¹{ž{ºNxÔpÏÝãõ53F£qzLµÓ6¶~ž©®þŽ@}hûÍX©YI¸Ó¦šjªë<==uòŽ?m¡ë„·ì‚›Ïu‚Hõ/_¾ä^ gñùóç¦ë4w^.—›Ôi¿—'u¸[HêO²4Ás“:í|*]€Ú]gþ6]€5Ú]'Üó6ñû:•®À k»Îû÷ïwZùñüúõkâ»%œÉÁ–°°Æô9Ê·¶ëµ%•ìåååÓ§Oì~&ÇV¸û³ç(Ÿ®“C½]ÖcÉ©3±ÂB^â˜s”/Y×ñÖǘ?~„‘©“ÿLN¯°„—8òåKÖu¤Î©³žÔÓÐu6'uÖ“:pºÎæ¤ÎzRN#Gש£çëëk}=†ÂÈ÷§ŠüÙ]l”:Íyè<ýþÉœ=½kRgpòÙWvÑ+>»Bà@rtÙ­giê´›oÉÁ“»uzÞôÏf'¯¯¯{/àvë:çHy°ˆ®³ŠÔXdÏ®SoÙ1ÙyØÝÇ/š¹ú?/ãH€Eöì:ÇJö´Ím©°ˆ®sÏ´Rà>ûwfãnGEûÎÎvßžaýñÕÐ'Lýïvæïß ÆÎ]§ºÝÖ÷½L©ë¬´×iîioå9ïïˆù)©pŸ‚>×Ù"]úO¦|‡ÔØÎuþƒ¤ÀvNÞubR'òK©°^¡]§Ê~5AÌ£K€•Jì:ÕWNÏþ”ÔXoU×yzz ý¦=ú;lŒYÔušdùÛuêÔiŽ ß¨üÍiÆÅw)ÁÍ;lÁõz}À®È€Hñ]§ír¹Ü¤NøhÇÿK€i‹>×iîü—:w_ÃÀÚí6Ðn¿¯ÀÒuÈG× Ÿ|]çùù9ùê8¢Í»ŽÈ ±m×€H ºDÒuÈG× ]€|tòÑuÈG× ]€|tòÑuÈG× ]€|tòÑuÈgqשiï5p` ºÎõzÝgœHl× ·F£Ñh\?†í: …Ú´ÅÌ$·Ý¦=Úu’?Lx³Nð.\J¶Ý¦=ÐušK RͨǴ3F£q‹±I-æÿ×u¶»| Iæ ¡M7í¿]òøÚì€ôendstream endobj 268 0 obj 69 endobj 271 0 obj << /Length 3435 /Filter /FlateDecode >> stream xÚ­]sÛ¸ñÝ¿Bo¥f"Ÿy×—»4É\'7i·Í%SZbl¦’h“Trwí_ï.I ²<™Žg,X.vû Ї?±(ùÂ*ÅJmíb½»â~úßWÂV±š‚üx}õü• ÁYÉK±¸þ4Cr½yŸ½¸«î—"êåJdÝr¥”ÊÔwË•Ö:ûi¿”,uÕzhÚýr% ËM¦äòÃõŸ¯^^Ç”—HCK´ mYι\ä…fBiã(| ûª<Û•ÕRÚì UßV›¶Ã“mjüµÙ š®~áR- çYÛ50Õö´·Mð¢Ú#¬ Ÿ&*¤F]Xi³Ž€'»@à"»!—»2škŽÌÎzUõt£¹—dî´Ð9«#Ž•‹Fí8¬„“s®ã“*¼+*Ôcñ —ûÿ¸ÉÊ£ý‚ÐdÏ´)8K½Äý®¥§ÀE鈭’fåh)U÷€ÇÚ8šÛþ{TEé-§"/M¨¶ÍïUGÏÞa©R=IeÑê¸ÍÖÛæÁ+{³½é< -ýìÛ_Ûø™®þT;ÉlÚ$ ¸tl°,BIŠ™CYž‰Ò°ð¸‡Sð#18?±X|<„Jzá ¡ ÃONqœÿwi0ü!º$WŸ÷MQM„ºÌ Q‹[=MïŸn'”à'•’oXÓß½‘ñ­ÊL¯PsüÇ|™;1P)ø÷1(‘ÉKï¨Û‡ý4et<&·˜{âìvâqföJ’ÙžÀF{¥g4U÷›¬(Ž§Óƒ”¼Q ,ÄÎÊYk½ÅÇqx¢Ñ8ù 7ÜËXÏl¤˜kbø+Dº­û¤+–Ë"Ø9 DÉ¡¯öÞ`p'OŸa)å6xΤ(CÖÒ×ÃjÛV›Õ}5Ü¥ö·ši£¬‡Xb´Áƒ×dUŸ—>É•Œ\B­—/t ¹]‚’ºÕiÙèÁVS¸Déx‚)yW¯½#PÆ0ÎM1?1*jÑ ,%BÑó{§g¾aùîÃ3ZtQòÖK:J³¦¤f\j ¦L+-Ï”Än5L0wŠ©÷V'UÀ" fJÏZE¤RYoýãÆíø©¶wÉÓ/\îüÀ“öÏ,dµâ;/b‚µz.áw¸¡È½Ûtv½€Kã”ðuûm3€½'ȱŠY^ˆÇÈ)™°&ìê+Àú@µïCÌ^1&û\iVDVˆßþ:€µÎû|iê¯xÜ’@N§Þ Y'ŒUrÃDQøf‰þƒP2X GVƒq!2ú—Šè©(«)eéX2ìÕ˜K™Â•Ò}Ï~Œj.æÕ3€LêNÐ…rš,?ÀÒ²KZÓÙnššÂÊÆÿï¦ÊX ÀF'Þ'Ïy;i +¡ôÿ&o÷=⦄ò„ªÄ^ê7#ó'žøÁJmŽ4;]Ú†*I”1]†¡;Ãj£Î9S˜œþ:ø©PSÀÐ+/=̧C(.NßuÇZÏñOȘˆŸ£Ÿ¾î©@ân¾«ŽÓï<œCþ¦{àŸ0‹‹ÁŸÑž^ =oÔ§7>Dˆ{°wÈ.?Ž’£l“2¯¦Ç“ÅÞ„Ù÷cøí ß<&A®:‘жU¡šô‘uÊ8ÎÑùù.ÙE1&u脯Ä&…¬k×q—ªàÏ@f» ïù+¡(x®)´çL—PÇs¦Ê‚ºœwÇQDæà$¸*š+VŠ|Wï?ðŢɟ¯üË_1´0Q–r±»’¢ŸÉÃÄöêÝÕ_Ç€Q®¦8]ÀQ ËJËÉÀ”ÔŒ—8‰Nf¿TP—ŒòJ«Jä¶ÿOZ'(©3QÊÀ ¡­º(HG›”!+ØñM„þ=…„±ÛW¥€´OÕïÞx)‰í1â¸Ù9ã*x—=Ë2tÆj(ÉöaæR¼¬T/WOM°‹ž ¯c&ŠöœöÉIšk1Èóy˜,ó±^7Tõ®úD ÌR)\úÂZ‚˜v¬áq¬„H·ó‚YQ䉎”R‰tAW\B"å7ÖFn»#€ÍÐH›v’åû~bu‚§²%Pjn´Ãã6e™}O#¼nŠìÇn‰ é¯dÎ]Šîœƒ”ƿ͂Ã}ˆ²ä )93RpÏÚ•‹?µàB»X“*×irO’»ê|Q °¢«?“]ßyÛ……7P÷Á³©Fm÷Y©ñØW¢dRŠ<*.†M§AÄcƒQ©“ëo]ÙL:Èáå[ï¦çmàaÚ¦Zd¤g¢go±Þæ¥OT\õÍ‹ìõ‹7)ó*s&4E—;gÏ’Õ ËK!'¸zè~KáÒ²µq/²¯¿®Ƕ&s3š¿vùJªÚ•(Mع«Ï–,*-Ÿ£ô‡z”Ãäž%]‘ˆÏùïxS*—§^.9åîÚKšäÅÀèÃ|¼¥76þ7Ñ3t9À´yŸlWﬢXˆJp-ó3ýŠ·š¦jú„ÉÛxàÚgïa´Õ5!€“{ê@ÀHˆ“„©ÊRΩMt "Ü%jO’WrqöB§':a @"εz"Üj ø˜7‹p¾Ùãû99ös$z³\â£v²C#þ¿(?+&MX‡Pr’Ñ"ÇÒÌ©Nˆ0Â]¢ú¡¡×vA„ r‚ ° "Œp—ˆ9ExN„…E¸¯]Är~‡úcà{Dö!-RsÒò˜·—ö’H#Ü%.NNúb@x,ˆ ³êÕµ£ëϧJj%x|ð‚"707{FIÜj ˜RÒ„s +’°àÜwã=‰+4c¯ql4ÊâT-$Óö›Ò’l4z¸KDŸ"Œ}þ rI¡™Ò଱-‚×à„Cƒ±$|H"€ƒþYeïÑÍ:o|‹*b¨|¼«éáçÖÝõácŒøIrsøyŠ|ÿ˜f$) endstream endobj 270 0 obj << /Type /Page /Contents 271 0 R /Resources 269 0 R /MediaBox [0 0 612 792] /Parent 257 0 R /Annots [ 273 0 R 274 0 R 276 0 R 277 0 R 278 0 R 279 0 R ] >> endobj 273 0 obj << /Type /Annot /Border [0 0 0] /Rect [502.606 491.8577 522 502.7667] /Subtype /Link /A << /S /GoTo /D (set-load-path) >> >> endobj 274 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 478.707 324.0246 489.616] /Subtype /Link /A << /S /GoTo /D (set-load-path) >> >> endobj 276 0 obj << /Type /Annot /Border [0 0 0] /Rect [364.9118 188.7154 493.2928 199.6244] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 277 0 obj << /Type /Annot /Border [0 0 0] /Rect [147.6002 175.5647 293.2252 186.4738] /Subtype /Link /A << /S /GoTo /D (load) >> >> endobj 278 0 obj << /Type /Annot /Border [0 0 0] /Rect [326.9506 175.5647 518.9697 186.4738] /Subtype /Link /A << /S /GoTo /D (new-geometry) >> >> endobj 279 0 obj << /Type /Annot /Border [0 0 0] /Rect [172.1457 162.414 322.4791 173.3231] /Subtype /Link /A << /S /GoTo /D (read) >> >> endobj 272 0 obj << /D [270 0 R /XYZ 90 720 null] >> endobj 275 0 obj << /D [270 0 R /XYZ 90 344.4874 null] >> endobj 244 0 obj << /D [270 0 R /XYZ 90 150.9964 null] >> endobj 269 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F54 117 0 R /F14 131 0 R /F3 134 0 R /F72 6 0 R >> /XObject << /Im9 264 0 R >> /ProcSet [ /PDF /Text ] >> endobj 284 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/tools.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 285 0 R /BBox [0.00000000 0.00000000 54.00000000 258.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 286 0 R >>/XObject << /R8 287 0 R >>>> /Length 288 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`jl®g5251 õ --Œ ´¡%D±…‚K>W _™«endstream endobj 285 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150406) /ModDate (D:20070503150406) /Title (Bildschirmphoto5.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 286 0 obj << /Type /ExtGState /OPM 1 >> endobj 287 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 112 /Height 537 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 112 /Colors 3 >> /Length 6633 >> stream xœí ”Åy€»gfïs¤] s!âˆM ¶9mç qˆ vŒ1†ØNHBœ‡<۱͋—Gˆ¯Ä&Ævޝ>x¶yðˆ8b$΀d$:VÇîêZ¤]í½;3»ùg µÝÕÕÕÕwWOÿ߃QoW}SÕU=S]cö÷÷f___Ü1Ôæþýû㎡¦0÷íÛÇMX¶lyÄ¡$ˆþ~×jmîÝ»×¶jùòá†S+ôõq*·¹gÏžê+V¬´fgg÷ÚsàèÈøÔ±‘ñÙÙ¹ˆbÔ˜–¦†Ö¦úe‹ò§,ëjkn´VÎÍÍÙ´š½½½ÖÒÊ•«¬…áщ'^Ü584a´I"›Íœ{úò³O[fýù̶½KZßH5wïÞ ÿ¬ZµÚú{ËÎþç·ï/–f#3a,^Ðvñ¹§u¶5Ãò÷~îÂÓ»¬õæ®]»àŸÕ«{àõ©—z7ïàwK{Nê:}åâÖæÆ¦†Üätq`p¸ÿÈÐþCǰâ»àÌÕp|™-_Ýwøé­{l+cÙ½¡¾î=—cUÿ›nÿá'ÞófX0wîÜÙÓs ,õ¼öà¦mÎCœÔÝÙsòÂå‹òí- S3EøÊoùªj‡ŽŽô >Špq¸ê’u­M¦iÖ×eáø3…Rå$@ù‚”¬? #“1üØfMv_ØÑrÍåçf2™_nÞuç}~þÆË^ »Ýóà3ÐÙÎÔo=ëÔeù¶¦–¦F '›˜š™¶œÎÍ ʼn©Â‹;ú á (ô’óN_”o53fSC]{scå=+7…“b©43Sªœ³œ«áÑÉGž~)WW¯ÉîW¼yí«—ÂÂꮲÐRår¹cÿáŸ?¹Õ™Ïž“»aë¶–8SKc}6“™.'§ c“ÓpFx»Æ'§·ï9ýx{ƒ…küš•‹3¦Y—Ët´ÂÙr•·¬ÜŒBV¦f £ÓpÈ宾#¿|vK{~¡&»Ãeô†+~úåoÞûÐëB±që¶Þƒ¶L65Ö¯Y¾è´åÝõu9è447Öç²8ÓL¡8>9ÅüB“·}ï¡WzfJºV'/êü­³O…âËdt´4Ôÿ™¹r)™ƒ¢o᱑ ÈdøÉ-»µuûÂEK=wo¨ËB„êk÷žeåæeºPªž½¥©\_ÝwÄm÷¼û"Ð::1µþ¦Ï™SÓXu×OŸ<>f¯ïu¹ì¥ç¯éηÁAá}Ÿ Þ7p oÚñQˆ³ïf^Ü1gB2ÊBá=[Ù9cÓuÙl÷‚ÖÆú:(òPd*õlN7xl ®l­Í ÷oxñÐ@ß‚ùYrîÞÖÜPM“ßýŒž%ÖJ¸šÁÙ[›^¯Ý[v¸íþî·ŸeÕú‹¯ù s´rݼã{ÿãÌ$´æP˜Aâ©Ë»ÝDìê„êðÝŸjÈ™u ¾$ÚÎõá?¸ðøø¼‹Ðþ56äÀ&6!WSÓÅ#C#…b©£¥ñ›lšÌw/ì¾´«Ív|ÐÞîÀgnüÃzìx¹=ù—ïopfòÈÐØ­¸. p¬3O±xi÷¸ÜÀÅóöï<ÒZ?ÛÜÚ!%œë–÷_6<YÊ,Ê·56ÔPBá²e”oG -g;[ïøÞ†ºâX¾{‰ÛîÐëæžâ™mûdv·ÎÞÕÑRMí?2,>;ðé½ ^ßqíÇÌÃGG`éK?xÔÁžÇ>û'¿ õê6ô¶ óĦÂiŽMÂe.O·ßóàâöúö|—¼A»Ž~áO¯›„ ÑÕÙAxŸ¬ èW¼6< ítn>õï?[ØPèìZâ¶û¹kùBŸ- õÞÝ:ûâoÜýì?4,>;ðw|¼^ù¡[ÌþÃC°ôå>æŒ`ß¡¡?ºtÝykW@W ê8]¾¸ÓJ:2<™‡‹N.óÜöýß¾ï¡UKv,Xä[ä ¶ì:ðõ¿½zt|:SiUàtf¥ß0W¹_†*5 º2Ð߸éö{WvflYÂÝ}ʼnlVÙ¼c@°;pëuWÀëU¾ÕÜ3ð,}å¿9BŸhoiºùš‹¡‚˜ U‚†þäî(’ÐLMÏà¿ÙÙò¾/oy~uOO[çBçA$y꥽߽íƒ3•þí¯Ÿzw›—{‚©k?{Ï'5u,\öîÂu|q¾Õswà×–…¾÷¦Oš;ö†¥¯Þû87ˆ­;û×_ñï|ËZ«_hÖ¡M,WÃ-Ÿ¸ö3ß^Ý2¾dÕš¦–v¡4žÛùÀBU*Í­]Å¿ ÜÝ?ÅíÊßu~O»-Kè»<:R¹ä”? ±®§‚Ý[Þ9¼~àæ¿7·î>KÿvßÜ Ž¼²ÿè W^ð»þZ¦tîá&6—Æý'm¾ë§K#Ö¬X´pÉŠ\}÷ 2üüÉm~ýf³|o}[3›>®i×5¸RWîÐ ¥·~ôËo{SWûü,Å»;ð7ï»^oüøm拯–?|þÚýÿËÍçÜììáÁ×vì;xæÚÓ.:«gÝšep­<|lî6<ÿêÆM›:³“‹ºt/;¥¥} ú£Ç¶<û·”— Pd¬ •ÿ€a¹ú‡™L¡X„š±öê¸âì%í ë³;ð±÷^¯vëçÍg·í…¥;Ä ”ŠÅ‰Ñ¡Þ}‡‡&F‹ÙÂ\.gšé¶ìtW³ÙšïêèZ 6³óïŽýòüö¾}ƒ2[v7N¿åÌSÚæ7€ñîüåÕÃë_}úŸÌ[ÊŸ‡~ã'Oºcn®T*ÍLŽ MŸ™š˜-2¹ºúÆæÆ–Ž–ö|}Sk6›5‚ÝË£ÃGzáU¼Y3´}'÷À«V»ÿùú·Áë-ŸûgóñÿÛKßz`£ø@pÃR*Š…° ˆòÕ4WV³¹ºJ8þÌäx±8#Þ,—«¯ojójµûGÿð­ðúÉ/|Ñ|ä™í°ôŸ?Û$>!æ†ß¿^o»ý«æƒËŸÚý×/Hh ®û½²Ðüâ×ÌžØK?xèé¸CJ6ï{×ðzÇ¿~üà °ô?wHÉæº«Þ ¯_¹ó[oýëõÄURùÒýO“P46oÞüØ®)W¡ëÖ­‹9ÀDq÷ÝwÃ+ Eƒ„"#+® q…èë=NÝ…Ây¯¿þz_Û‡‹Çy­8ý ¸ú[Á)1NŠ E†„"CB‘!¡ÈPdH(2hBóùüÐÐónëeRÝ•Ä'œŽÝ@òÔ¾Àê ‘»2x ’p…²ÁÈ¿òD*´Z@Ø5Ö²µ xÂj[ãž3*ç–Ü8ª¼->v3ɶP[pÂêž3*î–Ü8Ã*Ά8J#>¡’+¹qâ4Jâ‚YÝ>ÑBÙ#Ä&Ô³Ê'H¨ ) ¥Û¤\,BÆÌ 5:¡ÆüÆQ¦Ér T¿ýPA'DAœt§„ E†„"CB‘!¡ÈPdH(2$ŠŒºÐXº(1NBã6äWh¼qÊ %$!¡ÈPdH(2$Š E†„"CB‘!¡ÈPdH(2$-„ÚÆ"XàŽâ cX(-„V /Û$ô5Ö‚`ªÁŒóáî%EƒŽÖB} ˆu®4\F{…ŠÖB¹IÁ‡Ï…ŠîBãuÝ–¹ÃíH¨ýOµêväð¨¡t å#nåmí;»¸•7潄!²2(&ÙB=•GO²…ÑvÚeH¼PÝ ¡ÈPdH(2$Y¡Öv„ÃI¨˜u ¿B}}Mì8tŠ E†„"CB‘AÊýh2µà”P²Y…ª<2˜%TfÚ1ñ~§†f %¡Fô%T<œÆ¹eâš;äk¨ü„LžÃiœ©‰¹•w·0&›Ò™PJ( Åì‡ \P•~(®Ð´_CËÕ5Ö‚d í­ÊϤɰ,"½†J^XÝöJÈ%Ôà5ÐÜ+¬L+oÌ7žâ¿SJ\Ͻ¼Ûõ´ˆíÓ¦$vÚeˆ¿Ê×$Š E†„"CB‘¡i†B¦B†¦ Š EƇP«-ó$åo²PØ&å]+ßBPÐWe?Zf× Ód7‚Û#¤ò»ûÚ+:¡Ü¯7<ÎøÉið£Õ²Pç±,± Á° ÃeÔ…çH#AB埑wî+ˆÇvƒ7,Cò GVB¤BÙõ’ßԻ凛%®5A’Â{&x#“]BBÙ?%…Šwa%$U(J•ç®T>E‚…Ê´àjog`zUyv½ü5”MòÕÁr뇺5ÙÜxÄ­¼S‚¡ž÷Kb¡nìoêƒ?¡2wŸ$ÔˆàÓ&A[왚,èã;dH(2$Š E†„"CB‘!¡ÈPdH(2$Š E†„"CB‘!¡ÈPdH(2$Š E†„"CB‘Q*ùCØâÑ'‹„ u>¡O$„F|5àFÓ'6‰„"DÂ&šÏw†x…¡¡a6VÐÎÎp#EÂ&Õ¬PÓ4ææÐ"I»P°iå4ÕB«6-PœÆ/”͆-‡òÐ×qæAÍ©‚P;MµP8;{ EiÒ+Ôvºi”H¨QK’Q“Bƒ`Y)$4(¶rMBÕá^vI¨"Ül“РØ2OBAU>¬*o¹°îpH¨ ‚k…²7Î ˆûÿ)j¨Þ yÞM¥W¨-ž8t.iZE`Ö×ç&$Ô7âBF¡Aâö¼DÄ"´Úoc‰§Û$½äÕ6®êÜ]»˜±Ê\hp¬¼$©c/@¡FÅ) E‹J(Ú]C±ˆE¨F­<:4ú™Ô O¡ñFÂ&‘P„HØ$E¡±<0ÀªC$êBãzüÂ)T“H,…nPdH(2$ŠŒ¢Pç4ÔžS{þv â¤Öyæç›l?@6êB}ýTDÀT¿HþðDÊþŠ„ó7O ¹&ÿ©[0 ¦¨ÚæžË­PKs¡#"øj¸ý*/‡å,Ÿ#ÏpJ¨ß•29—‰Þ ±P·Ÿ ñ<—x„:ðDæÇUä‘*ˆ„sU÷wtPZI¡òÁ;ì†ÖBîòƒçŠPÃ¥õ4xí¸³UÅjåÙ“zVy·¾JÔUÞse,(TU,H(2ÑÝzF‰-˜(c£G!¡ÈPd}ë ¶xô‰Ä"aBiî;Lj ƒÙÐ'6)Ðx‡hé ›P¿£Š=bÛ"Áî+6©¦„"ÎXÅ:¬^BÙÉ©<óÌÇI¨/õÚ ­F/#Ô¦> ¡~aÒN¨-'òyC¨Â<ƒz e3)ÊÝW¨Ú<ƒ µåP ÔmKD¡¾vƦ…PgdžÑÛ¶¤k¨=gNœ+Ýž '¡ö ¸9±UmÁü$T*'Tåíx õ,w‚ml[’P‘)v†+™þ •Ê uì툟RÇšËÁ ¡j7*Ò.T&,¿¤W(âg‘ì¡Rz/ïY—ý~øX…„ò‘¯Y6R-Ô³3ï´“”~ÚD¨Ø–Ð u(IB=+)ŠPÉîš8HÝ…Jö ‚ õÕù|ø­µPù>V@¡~o%œ¡š õÛ] "TÁ¦÷í×Q¨Bç_Y¨²Í*¶B W?ÔðÓ·gQ\%KõÃF½„*ß•ÒPdh°2©ÎžBã„M"¡‘°I4÷B$êB5™qNŸH,…nPdH(2$ŠLP¡nÏö«=óÒ¼ ‚ MÐψ Ô- …Xê‘°I4X !6)¨Ðê ›„ 4®a®úDÂ&‘P„HؤÚÊ^ BM˜P·@°„:/¬~£MŒPñ\$Ô_ˆ,Ê’P3TPï°XPûOi£¤0oŠd6BíoTªÔHhê’P¿3çè"”[*%§Ë¨±ÊÛªõUbêÙäǶ%b£ä|JYrª‚˜…z^þ#êÔ'!»BÅu*¡\w2ȶ ‰-ö™zMvÆ-„:Ãe7ˆ²„Îñ¦+õu) Fi^ž ºmnc•ön“§Mg„‚íµêt{ùMÉ[8„úŠ[!b¡¾ŠgÀiؤZûp„[—Åx…Vƒ“ÌIdBQÞZ6©Ö>`–Šxña“jö+Y_'Fh5\ t¡X$Lhlè ›DB"a“H(B$l Cˆ„M¢áŒ‘°I4à!6‰„"DÂ&ÑÜw‘X¨ ÕdÆ9}"±PJ¸AB‘!¡ÈPdH(2Bu›ƒ@p^A¨‚•¾æ&ÀªÕ,â“*LŽ›PÁÄVlªÛÄ8ìÑ‚Là$>©íȶWn$ΰ„RBNÝdœ˜xȘ?ñŸ$òSCóçÀD™k _¨Â´Wâl„'ÔmŠ)„ºÉ%¡$T¡2S… G#ÔÐðŠØÊ+çÇó¤ÝÜVÞ˜¯Ûê‡"CB‘¡[OdèÃdH(2$™@ßzÆ‚-}"±H˜Pšû“Úè C6ô‰„M¢Áb‘°I¡ Åxz€„žéád¡òÏ#úŒ„M A¨ÚÈW^ÆH¨ªM GÞªòþGÇ$4ø¨ìùùL·P¬1îLVñ…ª=ʃPÜ'Nä3­%4Œç/*N¥Ð0ŸfIe+/˜bÆmî î\+¼ÍЄÚÎ✞ÄKk´B¹S}ÈüÉNçÃ[‰#”;-ŽçšùP·™ —2Ë#¦*/¸HE Ôíêá6uçJæ€q4JâR±Pö˜¶·eî‚£P®>çÐ*jRm 5_C™ã¨E'¡¸““´–PÊ$…Ù±?á…¿†Ý]({ü¤¶ò褺é½S ‰”ÞËŽz„Bß nä¼ ˜…xUp'ôˆd50œÎÏgŠ¿Sr‹ØŽì¥¾„VÃU€—CÊDì —ì¥¸•—Œž‹{–H(2©}žBã„M"¡‘°I4÷B$êB5™qNŸH,…nPdH(2$Š ¦PÁÔUÜI=¸GP›gD2ñÙÅ!I‚,Ô×ô8¾Ž<µÃ&I¨Û”5Üùs‚ÇàyvAHnt›Pŧ$c?»s¥|¯tl©êY=#q? e ¡U¨Êó F)ñBk¼ÛêØ#CB‘!¡ÈÐÇwȤûæHýW ØÐ—tȤþkdlÒ=Ð!R<'Ò:X,4R×± O¡ñFÂ&‘P„HØ$šû! u¡šÌ8§O$ŠB 7H(2$Š EƇÐ(çð;õBž7ås9Œ9l¡úÙ  B3Û¸m€BP¡žE@mÚ¶ìضì"9Uwî<<Ühñ;÷ K¨ÚÔ]òÓ;9ó)9å’ø¼âÝeмJ•÷µÀpú)™y¡lo-JY–?¡ìŸ’BÅ»` už¥º^¼šPnÄò%TàBá8¶5n¥O TÐRù F±•÷U_‚¬T¨Œ…Æp •_¶lù±­”i1» G뿤•7„Èlòç ;BŠŒ¦·ž~‘-U ëEgõ¬ÐÇ_Øi”ŸÐ);­¼fbV{¬§™ BQ¥o?çTƒúȳ¯œØÎe’b>•‚÷ÆŸ—œ·Æ`…(”…¾uýMq‡QSü?žYÿendstream endobj 288 0 obj 62 endobj 291 0 obj << /Length 2189 /Filter /FlateDecode >> stream xÚµY[¯Û6~?¿â`Ÿd Vy¥¾µidnºÛƒ¾4- XŠ«¬%9’\äiûÎ…”([> vQˆ)r8Îå›ù(àŸ|,Ä£Ó:-Œs‡öAøé?H?ÚÅ>&ùþéá›×V>J‘¢OVLžª_“—”çL¦z·—ɰÛk­ýínoŒIÞt;•ÃÒP¦¦ïv{•;a­w¿=ýýáÕÓ|°UêK¢!ÉWÈ–å&•ÚX’í\ Z B9‘L E9ð¸ñW&m2%U?¾À‰"9à-N°©ùtÿk&q¶CíðÂ{Øî’~úÏÎ ‘”=/úa¨iÏ™×»ŠyÉRx]¥»½µ&ùUÄbv@üûÎ8•øcÎ4ß—ÊÏMe‹tïqß;¡4ÐkfÞ2\Ÿhê€j ¨qPä^êTZÁ¦»´È>Ç}Ò‹€‚Ò¨Hʉ•gýy{ÖÈD}W"‘ÖDzêfŽbãr6/Kth½ Z·é™Á;aJÆ6±±•S©Ë:^æÇž]LK—üHRY‰'ðΕ›d:uB;¿øK>©ó7A.›®>ñôyh`¢;4çòDjÏR“é|­Î{‚šTe‚˜%1ÛKÙ4sZFb¥|œ4iádƒ<Í…Ñ´þjÁ±Ê’‘töNh±Ã ;,Έ«³ëŽPÿɆbbd“f×{Ì0Èh’ ¯Cœ=÷-Ó÷<×ö—1ø¼S"ù Ï)¿£ª§òôG!hLáûX^c„ÉàöNg`¾"`P -G@1Óíc ´¸eˆzý¹öX…¢Úx‹»À4¶ø¯/û–‚§Ä «Æß^0þËcÍ#“__C*5¹}ÌÀܹËÕ¸ dû˜nã7ìP®4úifЈ^ë=‘Ó7oZ)èþ¹ÉT€Çó¨…K•°|Ù×ÍñPP |z›¼åÛþ„èæ#¿+Oûz—›¤î7”m„…ìEéŒOEj´åk¼,+ÄnRiífôÀñŒZñ{Y¯WËIè¢ôYÏÀBLÇ’I/¼ŽCŸ1ªæØúÅCOp{K³,³Ȳ÷gûsÛù@Žc Hà®AƒP• ‹’é©9€B°]$¯üÉ2œ<5‡Ë‰FènN~•Jº%­ágÆf±X‹ú{^ªjNU~EÎ{È~®’uØQžBæÂå{ا¤´µ ÄX>ÖÓ&º´ÐnËtÔ]ø!R‘ɵ È I‹¿å„ö‚ôµ’=&;xû þûÞ-¤Ñ©Õ.ó’ðu@¹y @ kÂñ@?oIP˃$‹oÅöwZÖxA?wŸÅ°áNãŒàìƒ`]È"¨/cõ}>Ÿ _¢Ì@N¦ ò)>"w‚‡CFŽhÉ@²Ê\oÙªá!!-޵“Éâ[.Ü3s\ƒh •KOè1ªTž¾ãš‡‡²Ê°Í*BÈ4Ëg§{Ú9—<ë¤Ú¤Îˆ`ÞÎûÿP/\ä´Žºõp‹x(ü]oS<¨±HTÍô§ñNÝà„3«ºãÍÈ…kˆð#í}ü1’½Mê„åÛžg?a®)ÖN¡ì$òegå׺ð{[#â´‡mäbäÏ»Å_áR‘K³i¶M-i¨®Ä– .±hg.Ì0uÑçFÑ‘“+÷W}êª(PªP÷ÛUȨ=ȃqO‹{.6;HÕóÏ54yáß-«u¡ª^>ïá°ëgã&±ɲ±ãæ!Ÿ M0 #Ë€i P?šc3qñä½Ti!­½nT ±©,›E°T³ªÌ…”>„ô‡sAŠìPµÐäÑÝaq¼j’ºªçc¨1Ê|ÒË"ˆZwËqË(ôçÙ`—~gälë!"¸P¶ï÷Üv.iD¬‘šàx£óÄ‚«™ëûf s§}ŽCª[pà©è\ªïÆÞwñW]ïB™ý (/£”†_WU„œ…“þæÁœ¡­4W¯¶ _.Ø>ù*K¥ÐÖÇÜË»™ëå,[!½¸Ez9W0Ü{ù ÔK(°çòè‚zwÈ:âuÜü\ƒ§ëÂøˆ9‘e Ë n…JŽÜ\rUŒ]éÉËÓò€jçéø‰Ããc%H­V·Ìmj !y±ÿ¶u3ËâÏeâ’}ÕUqe¥U_Í {J0Úü˜bs×zD#6ï„4QÿŠË!Õḟ<À®ÜV‚ûÂð½\x÷ÝRi€9°$¤™+œ[‡‡‰ä6Ò«{jO&Xº{¸QÄ1"´áþë†qHX)d&ùe—ëë,£ÃÁ!”H 5ïŸ{"Ê2tÄú¤UU‡.8€b)×ëÆÕÒlu”§ ÿÞXÜÃi: 2 öLsRÃINzÞÜõ­¿h©ïË…£P|ˆ¨TE¾´¨ïï¼²øYœÚÀ]¥6÷¯ä6­©‡YÖšcÝ®ÕxOé±?ܸ'5ãÙ÷›RP@[òÆ&0TèØ:Ÿýg·¬Äݧʒ¡Ÿ¶Þ“¶ÐÐÚ´°sìþ‹€p¢Øœê;5ÔïÞ ÛùsWï[ÇY !è*½E­¼o¶SÈoVF-1*ùG?´å©]?ëjŽúYÅœrI¤¼Øˆ¨²"µÊe딿²†Ñübôòb̆ŒLt¬ùýba2 sˆ0=kFŒÑ÷Ý0]nÆi-ixûÅ嬖Uà1ϺÊë¾El“¨ØÇKÜ}DÈ |DøjýÏ¥I‚êb«Áçô¹€¨¢î ¦‰"ölÜÍÞÝ×t!µ¶lö‰ða/3‘æ$¿÷j+îÇuùéBå+½ø;Ñ£UVÌ+8p(ö½è@‚ éé ˆžÂ:Äme§2 WkÑY—­e܃ÆsS óâ«ðôø_NVž endstream endobj 290 0 obj << /Type /Page /Contents 291 0 R /Resources 289 0 R /MediaBox [0 0 612 792] /Parent 257 0 R /Annots [ 293 0 R 294 0 R ] >> endobj 293 0 obj << /Type /Annot /Border [0 0 0] /Rect [468.8736 636.9076 522 646.6046] /Subtype /Link /A << /S /GoTo /D (Commands) >> >> endobj 294 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 623.1509 192.485 634.06] /Subtype /Link /A << /S /GoTo /D (Commands) >> >> endobj 292 0 obj << /D [290 0 R /XYZ 90 720 null] >> endobj 295 0 obj << /D [290 0 R /XYZ 90 612.7275 null] >> endobj 289 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R >> /XObject << /Im10 284 0 R >> /ProcSet [ /PDF /Text ] >> endobj 299 0 obj << /Length 3808 /Filter /FlateDecode >> stream xÚ½ۮܶñÝ_qЧ]À«J$ukž#)\4iÚºíCœ<+yíêX«õ¥(úí)JËõq^ ^r8Î}†ÌîRø—ÝÕé]©uR›²¼ÛŸ¥2üë³L¾v± A¾yõì÷ßåÙ]–&uZgw¯Þ,¼j~Ú¼x°Ûl3µÛ]¶·;­õFÿa»3Æl^ž¶ª‚©Ñî§n8mwª*Ó|£ÍöçWzöí+¿q®ÔS¤!ÈÐVT&ɴɉ¶GØ±Ü g$íŒ{Þeu¢2•Ý©$¯ªŠ€^§JóNÁ&Á\÷ÐöÏQa6Ó@‹£ï;+Ãç¶§ÓïñŒÙÆ”)7ø>ò'Rmf  N8ºY3-gŽ!úo¾>ÂâBm^ ®&Û4;CùYì-cÍŒÁ®71±º°7^`dÃG±^!”œgmc“í®,ËÍ?Ž–7bþ›ÿ82<ÒѽN3³·3Õȃtyø}pxáŸQ)-·ü¹" FíjRj88Ï c'y¿àHV¯ŽÓÙFÆ»ÀeòZ’Âx"ùïhQËBÜ~)°1 Y>Qì%ì<8Bž#'f|Ä8Ç_Xð‹U„O¬}ëå0œ(8Ô g')ý5»kô=©v›{›a0ü)V®›§ù œXf;äNÈ9DåNÈ¢ˆµà¬HÛCØî£)@n$8Ž—|üÝ’Cqˆª5¥QZ«}w¡¨ŠßwÖÊlãÌ\mŽóN i¯×ª×©N·d'3 !KoÇv¡GHÈ»‹uV‹ Äýfû_ø(ùŽŸ:܈†týbzæiÌõéºL²ÚdâÁþ5ŒT›˜¯Ói’:H@˜±‡2ªLʼ\¹¨7z=õëü¤!%˳Y•Ë¥*Ã*¶Zvd, ž /qè&+è-ÿP´ì95­¯Bò’Y*G? 8´SôœœB9ŽœÞ`oI’ÔÅX™§‰NM%ë^@ÜˆÇ /ÔùóãÅÏ“?$;B`›NtÑ0d5¸,Ðù~ü÷‘ÔstJÇ<3ºšeøþç¶Òq€ï¡sR9¥w8å"Ô1ðOIr¦‹ P{Éå£?Û§ø$¯¦Bz\¯ÁŸ{ÎG„£Œ4btá~½²¸ûž»¿)#Áqvq$sçZïÙbQê\:ôUÃtG¢éÐb±Û‰^RZZYn’RA=³È‰ÿØBÊa{4×O˜“qƒZФJ¶À iËåw\)€ªkS FóB0g«k5³…ƒ”i¾T[β 6Ï•ýMµ Mmó7øyÃêpå.ŹÖ.°-½í5Vñ8B‹4­]7±±$fn¹ËÖßÞL]Ï ]¢ñæ€:çÚòržï¨Ä˜Þ‘1ßbõ¿þ|ý…ç·*$Uº¦¢ÓylêX){!›èÉÓPd¥3y©¤¹‚BÆŒ²ÑÅÕÓ÷þ,œ¸ò»äP2˜Õ XÆï]ª+‘x‘zà‚CçuRT©\»•Oß.Ú#» ŒnRó»L™'•.Ô“iUŠý—é!)N²Ùœ¥Mvr«-ƒL¬€q¢Ðƒ¨Âüÿ<0´¸éA€Ü}ßí…òÓÌ‘xz¬êD#ØNQήà+WaáÒ9„qž×ùî/ˆùF"‡KM–ÊÉyÿvË+9Öù$–¬ 9Ö‰RŠáo[0âî‹ìÔF¥P&Eš:1ü€çÓix"#ã0EÈ8w+sª °qŸÃ=M ö'tY,ó'•§7 Ù–w""®F¯]?xÒÆŸ’Jüô]OwÖùöš½|VA^§&µYµYT¢ ‹~¥ƒ*£.‹­oäw}'½+Àô¿æ¹‘tÖ.K» ‹¨MÐÖ—t¢ÎÙ-É.Oä!‚m«ˆ¿YT«rÝÄ2™hWô·çÀkîåºmuØÊ…ºªJ‡­…¼™¿š–o*h)‹MÇ2´Fë £ÿ™áò;M A1_|Œ[úã$yi£ åÇ O¨³Ýü•§$:_Ý]c‘3ZûUŽ*ÉùÖ; çTÞwçe6ÝH†ê[À\Z)bÚ›K?`üšnégZ•¾‹û-t4³»*#uù÷V=²¹8¹3{1sO_ u÷:Hâ0ßÍ`5«E›X-ĔyùÅoqݳ wài²\}1&Wg# Ò¸¼À=&_õïÎ]¤ï 2ô}gm6+Ýl}¹Úoç+2 ž£ä+ŠÓ\áøk2,ƒø6u¥zg×1µAYî;ÃWé‚ÍÙ`ª±©“ úlëdä*'œY™Öô¼ø»j[ñ iK.©uÛ «Qé^å¥ïMæå*l|ëg¢Z SçS[üSØzÓ³ÈÍ»Ó,KòRÕ¿1à–Ëî Òìœ"i`nººL¥4;H_ô­l™5gV›xì4ø®4~²‹ÿ¬‹qj|!7†ŽÏ¬ߢ¬|_4Ú¹´³©¬ÎúÕ¶,A>¹BÎäà&_ ~>·zyŠv—LbRwGû[70ub²ÜUÎNûèRF© ¶ˆ†¾á+…‰ž¦Ýè÷„¤J'ÁÑÝì¥sÃ>¯›)@úýá$› ,ùU ǰ“l-}+R­B'•Òúf'w¹ô;8Ðá&¦ð-0 ’yð†ø¢ #$›&‰w••AÀP€ÿè²Î¦éW£Wx£·)«jâöùٷǸSvf žDM'ÊJbP¬Ý=¹Úƒ˜ÖIÞ‡|ìÎaá6•1";#q†ï#’Q´¦Ó&žöÀi¾Ä—«¦Þ|‹I5”UMkeäüh÷>W+f a ËupM#¿‘I8ŒÇÂåaáâêlß ‘²~Ö!Í2y؈Óo(ñ÷‚ñv¢FÏéœÄdôòįäÕ'áë(Òíñ!¾ŽÃ;;?>„–Õ¦<ô\9?çreî‰=XŒÇs-ÃkÜœPOÝÄ+ÒÙmzèÎÑN¨ŒÞ8Õ¡žËƒïÓ´§¥ª¼ÊŒ¤ó‡‡kÆîÀíñÅ“ÒÉ׺·£D3Fã~™ƒ~9«†S|‡ª‘™J»¡jóêô§˜ÍR¸*秉©ô°ÁŸŒ8R|¶”åôàçÁ½œçš”Ÿ}²Ü(‡„ÅÄ;ñ};Ë'rg^(?ñ§ÎRd“Õâ³ñ›»>öùôì þ„uüõ,Ï ò$MW%+½…ÅÍV] çRÊl'¤ø{_$h½ÅæûåM€ÌàY¬Ï£º~F)A‰”$²cä. ®ï2€þõµb±¸V,Ü) Ã°„¯mÜ£ iµÌ¯Ÿ‹bæ5,\½± áôß"ÉëÌ¥µ> endobj 301 0 obj << /Type /Annot /Border [0 0 0] /Rect [184.1819 668.2565 375.6366 679.1656] /Subtype /Link /A << /S /GoTo /D (Point of Interest) >> >> endobj 300 0 obj << /D [298 0 R /XYZ 90 720 null] >> endobj 297 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 305 0 obj << /Length 2884 /Filter /FlateDecode >> stream xÚ¥ÙŽã¸ñ}¾¢ßVÚŠH‘””}Ú]Ìl&Ø`L#›ÐØj[3²Ô‘äiìK¾=uQ‡Mww4`ñ(‹ÅºÙê.?uW$wYšÆ…ɲ»Ýé]"Ã_ß)imb»ùñáÝ>Xu§’¸H u÷ð¸Bò°ÿ{ôÓ±|Ú¨h¬6[õ›mš¦QúÇÍÖ}l7:‡©¾Üu×n¶:Ï¥vóχ?¿{ÿ0mlµ~4y6e²Ø%‰¾s¹‰Uj,Qø¹Ü!_Ÿñ·ì÷÷@d’GÇ®ÙcKG{ ¿Ûè,zny`‰-ÜDĽ—Cñ>Gî|öÇ‚vScݸsèø 7D߉K°Ùµåz£Ü_OÝ…Žü|¬Á’àÅ „Ž6NS9o*=?!ÅÓ‰TtϘJÏú4]ÈO+‹<’¡Ö™¨ñÐÈ­‘Ç.ŽØÉù²tTÓ%ÄxRÐ^³Ô^<¸‹RŠ K J•>À=^±ÒwcãĤ°áK®”vØššœÄ‰³})Ûª)¹½ç ÈÎ ±¬bH9úŽ 8uçA–Õ¾gõ­™4|h»~ÒÉ 4ðÊÚèK5ò…oå«k/’iá›d¨œYîñø}<³÷òÝÉ¢t#1]ë[+6s«ŠØe*[0ßfѯýg>R:ƒ.(eÐT(~®ÇÐMYkëœ\H1p"Ú“Ýs¨G¨× Ú<ó;6ê»±D,²c¥Fñì{±g2¾Vô’GK:÷de‘·ÂY´;÷ý,øº˜p-¬eÕÇ|Iþ«³?YÆ…ÄFùúÿ}ö›ô^çaŽnÉØÖÊ, ôòƒCã±ÞH'#%Bö WUä&À¢LÔœ¼WÚï½í€5a$]‘²2GŽ-p"¥c—&…\/K„)^“gRm£’T˜Zò ï›@‚Ó¿Ü÷CC^&l1r§—»R¼’D5 €6+ç-ûOríÛŽ&¯<à[@2¤ ƒ†™µ]Æ'ñÄw²†š€>¢e΋è Òê%ªlB|±:6™]²Å$ÅJ—¯®#‹¥<'/ůH¢¶™‚Ehá½.L³‚BciÝh l¼ƒîî‘p= q³;ŽŒ²~$ÞºA; èÌäˆMî²5¯ÍxêØJã—ŹçPíy”DËóÕb›,3y0o=\¾]š×ª_oX6C÷ rtÙc‘ƒÏuÓp Úù5Þ öJq»³‡îBTý ²=öi&MØAŸgs[ïxüÛÆ‚ŸoΆL5zÖ;“*âº?¡°A”06š|æ Ôbœ 3—É!Ͷ«­ÁÌ'“®|ØhýŠ? ɤ.âL›\€'yÛNà]’8ËÓüZÐ ¢&”AýTàY´×ϧ²]²'¬¥E*­ÝZI®6Vcø@9 jë§mÚT·Uõr‘Y/ºRZØœ|@iáŠDiSµPZ]D““lÊþ  ]ÏßáHâÓ~ånÉŸCÕ0Œ2iôq”O´¨ïXÉ&XÃHéF<ÒËXÞS{+˜‡0¼%ªdÅó4É#äÀó%Fœ:-èÛÇÇU›^9¯k »ÉAÞ7KãÜ8/Œë‹2âø‹ZÈãê®H£³JÖ³Ù²”£Ä)p6¼©bÍ*â°]Ä[ Ý|nl;@¸Ì0ðÌ©d¸g7/A-ÖøÖ! ´üý cUýe.œP’MË+nÂu$’ô {ìÓh«¥õÌŸªÎÕmˆ8r×¾€°¶ÓXÜ`Ô¬Q5o¹âíVÏ•€žé;?ñ·ë—›REATì>”&ì«ÅÝ·KÈyð’±>H”àb­ûŠè©œÖ ä#CŠ1SÂ.m¡ÓÈrqÆ^drŒŠQÎíò £®¦†Ð0p‰ž“@`"Þ“Ñ|¤ëOœqÀ%ÁÔÿŸ®_æŸv@‡/Ê@jA;aÊ•¸–+CHÑãI Æ¥%€VÝ2ì{œÝ5õÞ“R¶ @§AN”Ì8 *PÇÆ±:=²Ñ _Ï•Š»e/úÐ?*I~ˆk!¶v+a£2ÑSÉ\^.é·8Ÿ€ÉÒ°‘`G²=¸+Nv`üºHŠ·KERœ‰}N¢ã4Ï2rŽ…À×BFVCp{:>3=PSƒÛÅiæ1ýBq/ý|å{ûaƒ‰ksêâBeî­¨ªZTŸ"«¢È&D\ui÷aïk=EßEJ«¡oE¹vtm»)+Å¡ìC‡ÈbeŒgáÃ&Ë„CÍÜ6‹,+Baí²ôg¢ôL¿oM}Õ”£X ŒA".ÊF^õ_«ÒS]tU„Ñ—jP@©þ#9 DÒ>CIÍ\–Ëpgoƒªk‚N³Q½¡‹ YIŒ}˜¼¨À5±þE­°q¡'Ù µŠL2¯Ù<\RŽ]d”ªð9œœàä½À†±{âòšKmôÑÇU…ãb3¡fŸµÞÀ]Þ,ybUúî¥ø qµ±v- “ýùBoãÛ½É"”¡¸Ñ{"&´‘BŒìçW…r,›ã,\\g$Ö»lmºTìŠÌ_埂· éÌ!öQƒêm̺ÀÏåJ›D_Ŷ*zkúL’ÙQ,»g"½;&ò&K¡$fÊoz|•¬{N; jcÝá]¦xj®{Y_÷B"º9Ë85èÚ™FŽ%9Ÿ€yѶj¸w)¥B×_HÆ$(V Ý®ÈMø}µý¦Fû—¡¥T‹X°µºxÇyM†¸ñUS!}ø.¼¤"·½ È1¯gJÙ°³{½Ábè”Ô †ƒË-¥Ž2p.Û%aŽãx°ìDœ¿uÁ²¬Žìù©ÓÃÉ2ö.ÝPK‰¡g.?±p8«í­r ²\MÄïÀ߆åxä a½“€u>¤æ|ÅTåòú¤D^‘B• ñ»Oöé%œÜ;u½ì…T~BB‘"VEPoÌúð\·ëœä"l^Úÿ…+Û$5 Ü?àADƒvœ]Ÿä±MOQ<½W¯KôÆM5Ji¹âvûžù"6¶ÞWeû¦ öÆûÛ͈ëmÞ”%)Ò×Ã7É k_T > endobj 306 0 obj << /D [304 0 R /XYZ 90 720 null] >> endobj 303 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F67 89 0 R >> /ProcSet [ /PDF /Text ] >> endobj 309 0 obj << /Length 3418 /Filter /FlateDecode >> stream xÚ•ZI䶾ϯhäbÒ¥ˆ"µ9·L&/§Û°'€ºJU%JjKj×tùíy©¥Y= 0bqy$ßò½…­n"ø§nŠè&Ó:,L–ÝìÎo"éþøFIk 3¶ó)¹{ó§¿%êFEaêæî° r·ÿ9x{*6*«ÍVýf«µô—›­1&øªÝÄ9 õån¬»v³ó,Jn>ÜýãÍ»;·qÇŸ;NñœÍ¬Î–æ&TÚ$t¶ï7‰ ª¡q¿õE’,L£(ê8õîTɤÅX‡Qd´Lz‘žŽÂ,‹íÔ{¸ltã7IeŒÉ³`»‡›e\k¸}îO¿×gb"0­FYQ¶0mí4Øáhù¶*G©áñ6M’à×jìdÈR‘ ð¿Š{îËþú(ó€f‡—>k¸FšÞl•U±ÇL ÃÕ"bìèÎt îx@éÝP“¤åˆ!Ó4q˜&)ÈOe¡Iµú ÇóLåV,› ¸ˆlïšá× edú±‹ <1iÌ¡ƒtø+ †K?ÜQúŽP䡉ÓBh~SÖʕ͓L]ù-lQ°$q«ºu2è>Š$°}Èš(;´ÈƒGàn’'Ðhd,pÖuš´«nhd×1&÷]Ê' B¿xâXãq<ùD°qáIçnBÛca‹iv–\O7f­ÔyçéJ+ÙF˘¾¯Ø‡ì¡ýgP„BÓ´A»;‚¼ÌØ¸Ý O)w;‹‹pÐúV&¥žnp<ÉlþüºÞ₯ñwÌ Û ÚØB@ÕTïíi«µ÷2IF‰ŽoR¥B°ÀÝކg.ÌÍÛÎ'z|ìs‚È´÷•xQ¶Ã\ âŽ?@FGÆk{fò<yšÔ´lW6î–ôœ²Vb(ŸøiàÜàì3˜Ë©ÂÝbƒ«'n]ö-Ãû BÓRª' •°uÚÀ5N䥠u±1ùXÖÛ«®¯C[vü\5íJþÕ—_ˆÅ i ]И• ~@†Õ7Ý\©)Aœ‹‡·z ^҃܄™)âY8D¹!c)$ó0†Ô‡ I˜GÎ?ùüyŽ—AVqÃ|£ãöƒcEH¸;rë‚DñôºáèÌ’“²G÷V¡—ϽIª†ìŽü¹¬Žô{ªEºc_¶CCª…Ýg«v9ÃR_h½àüËXÆmßqà†Å –L¼ ncð×¶ÂôG¯‡ÈDfü(ú[÷³P‚ÀÚÆ´*Óbf—íž+eÈšâREáIb‚oXqýð(ELÍe*üÚl@¿âhk“Vâ [WJ> endobj 311 0 obj << /Type /Annot /Border [0 0 0] /Rect [450.0532 609.7913 522 619.4882] /Subtype /Link /A << /S /GoTo /D (ui-motion) >> >> endobj 312 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 596.0345 190.6062 606.9436] /Subtype /Link /A << /S /GoTo /D (ui-motion) >> >> endobj 310 0 obj << /D [308 0 R /XYZ 90 720 null] >> endobj 302 0 obj << /D [308 0 R /XYZ 90 328.6605 null] >> endobj 307 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 315 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/ap.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 316 0 R /BBox [0.00000000 0.00000000 156.00000000 182.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 317 0 R >>/XObject << /R8 318 0 R >>>> /Length 319 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hjf¢g6´0²2uôŒ--LLtMÀ cˆz —|®@ Ž¿?endstream endobj 316 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150401) /ModDate (D:20070503150401) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 317 0 obj << /Type /ExtGState /OPM 1 >> endobj 318 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 326 /Height 381 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 326 >> /Length 5936 >> stream xœí];rä8Í9ʸmµ;'ѹ€Ž¡ˆ 92ö­ ´CK†N ·­qç$±Å€ÌDâK€A¾ ©ªH? 3Aþ7 àøÇ·úëóu§i!¾ž'¿þr¾>á±Ïúk¼B,|þzÐøxwý¸žµWŸ…ϧEÞ Ü,YPjü|º_¹¯‰=¥Æ£å¼¯É"5>ïU?:ÃÊžRã/o¿ç†ßVö´]ýž»¿óxÁ_¾Yj”Û¢KµÔÎ~‹…©[jLÚr‡xô²纰@ÛwXÔ£FiËÏóz„K3+ Ïø¼§/Ÿ¯Ægè•Æ   ùj|ü¼[9&©ñAÂ5*çwòa¶è}-‰¿IÅÚÁŽj\ˆy_ëöJÓ»^Lÿxk…Ôȇ2ïö– +L’ï¦ù¡!îßù{!Ji†Õ”45>Ó“z~·Ô¨Oþy­—ïèÀJ)€aÃäêâ Áhæ™Ô”T52§’DJ®œÜîÐ K¾¡bmépV#58‰jä~gj¤Ô¸ù!%Üuº5 5NÿrÕhÉÔ¨ëé\ƒM;,70’[n`ˆ£Æ±lKiôuwÞÜð7Õ·ÙÝ]ûf#ôCØsc¶A>t½ÕØ'»«±S„ÔH—°]"¤FFä­Fj–Ûjü’£¬¯¯‡Ç0w{=Ør¬q±`Ôøþù4ñù°ˆxr,ïΓu­˜Ô8±ùü=»ãÔyøçk"ø×’˜÷øüߣè”øs ï›iœtyÓ˜·ŸÿL‘ü…Æ©­y¨ñ÷Ñu:|ÀOÖR?Ôøû{äòdýŸ¬ßÕh|ûQe³Å‘söo²+çNCcòÙO•ZRãMc\¶ñ¦1 ·mÜj,‚[Ep«±*¨qé/ô’aùÎVûveÓø¿´Â2¡qÕÛúI¿c„Ô(ýÆlyúàÑl Dã˺OûÊ‘EÂjyÒ¡G!“F¯C4†Ž6DãÔÇÿ©}ŠÔç0qè¿tµhäÛLjRãT}Gs6kqý¾|}|šëý¨wU‚ÆÑYÄõ“dxÔ8UsÂ1jVçÏ#¯Ô¦€Z ËùjTǩߩ(†QºfãúÏ}ºiÄgFªD´m\øð)Íÿõ‚AóŒ¿fÒh¯“FZj-ê<Ý ×÷Ñsf‘¶Q×MR¥°õŽ”>t%ß`ññZ4º¯™ït£àQ£Ú.(Fôy„Õhä ÐÈÛ0Þ¤m¨ÔE#°’ÞÓB|“Q¶Ñœ ©Ôk4êÚ§F²3ßéF!“Æ5:›lЍ|.¼V¶ÔbùšÕ¤Ñ×ÄÄØÆQ5ˆž9˵ìúeT»ÚÞÄà~£ëšùNw#ÞOæ(&2/æ ³k#L:<ë|øšñëðÄaÃ(&}WˆÅ¨î÷¨àáñ¸&Òwç{8+ù®‰ú¸ýEЇÇ­Æ"¸ÕX·‹à;¼¥ÿHVcƆÂ8 9'/ª± ‹g¡1²m<ú¨NÙ6}T§Ã­Æ"¸ÕX·‹ ¨FæHó´ ÜYØ+j´’Ráù# F dƒÐ?¾n5bþ@ûêiž‚{Û8`ˆs Ph¬‚ýjÄ9rä–PÖ€E˜:¥1F(d™½Lc~ɵ= Zy4¢&†þ²#%N¨¬FàôuLcLKC£ôãõ}yÕ9¥#Ûo”š˜PÏšöÑ/eì…ÊèQŒÔáxƒ“º¤ñ¢cjßH5Õt_ÖÃã©æÐxI5úGª©ÆæºjtŒTu6ÚÒ£ ‹Ü¸¬]#Uװן&yY5©.‹Ü=ä[Nî/ËÚO¦ñªjª>–µ«1ž‘*ÜjŒ†s¤Š›>ˆuâ²jGª*k¤jŒëðˆjL¼§OÿÌçÙÆ4Ïrçé˜iÍÄ&Hº½TrÕ˜U©™- ÷Ò0â´ÊÂB£'~‹/ o?ÒU¯ì^jäþPr@xbw[¥Ž¢q¹+Z¶›­»˜×¿}…^“›Ffn¥=™[é‚6Õë*ùÚ&ª1»¥–œŸDfÕ°'âÑ۰̳*D¬:¶îN+÷hbx¥FæÖ¦‘]åµ dÕKØF õB¢Ñ—mÄw8)Óá±*52·AqÏÌŽrÙHU#…@cÌ]Lò4±R+{$u\%›£+„岑®F ›F ÐÈ$hµÔŽ‚Ò66«‘×1¶ÀM#›œTý&±M ²ôÌtKML!5¾£¢‘¦ä˜î n¢¿ŠSÕ¢r«.õÂÔ<øit ¸U ©1ÉãtÓèPcšß®-&¸‚q©1 ­Ä©'îºÇ¶1ÍÄ©¤±·–ú§ Öj5ª1>:»L"Bj<1hhɱò¦èC4f2Ú±)Uõh,¤FbMjrlQWÕtL#r_e Z,JM®ÏiTMŽï––4V]¨?gшœpú¸D¢ÕH½@¯¿Ðø›|ge¬ÒuµhTŸF Õ•ÄtV¶Ø…t>Õ¸Ù_©wR#:K<R¼—F‹–üøòs52Æb¥Ö„:+õ^jÄçL|¡ËÁûh´&éØp!ó:3”`ÓÈ$(Ð8@ÓÔh¼F)•šxéqãòŽ*Çu"lbRÕˆÏ~=ø`¥6&^P£EŸ*X R«8€ß6jÿn:¶¨‘|ˆ¨ÔÄw¤Ûá •ZÄöÑCfKN#g'ÆM¶QD=Óúghbœ’Ü¡Šij4–ÊÝáAž^f¥§m˜QLáO£ùEX4byD÷[ÆÆnxÃù‘4Êê‘n@|~cœÔÃW5^ÒmׄxׄXzk¨$61/”Þ¨Š&ÐØ›¿1ŠÆäõ¬hA5F|{4ÎÚ+»·el ü/¦a UþþãÔ¤»5RyéD=³^ìpíuÇqj¦8<@§>ÀôJ×m0è6Nýƒ>=°¶z»\¥iì-NýŸ»#¿qÁP’Æ~[j < åÄEPUÐ(71$‘]ÑèÓ_YóW5PWýâáMŒí  ë2J«±™8u[ùõãÔ# ˆ,¢¤µüÆâÔáãÙŠŒöòëÇ©kÑ]º’ÔˆGvG6*N͈{¦Ä( r‡1ZGûéªTAèiˆƒÜø€BÎ|êmžÇl5Z‹2ãÔºÓËû½dóƒf4éó©·zsÕ˜L£ŠS§Óˆ~™R©£hT¶Þ6ú6¢h¬¬F>óÓ¸´3.i„;JÉþF\a²<™-u:Iq4âå)¶›Ç`Ðlk£ç1³ß˜¥Fé‡Fcb J¯Z9hÄá+ËßH¶µÉó˜ĵB¦Ñ§vÓˆ;6Ü6ª_¦ÚF½ ÙßÈøØàyl3N½b¥&WL6Ãv[‰S—@æ|ê46§.€¼ùÔ[<}ûIGGò7Z£f”c=}{¿](nQúSK¨Gcqê–üIh*N½ëûSïºÇ~[ê]÷ØoK½ëo5Á­Æ"¸ÕXñjÿqܘzw´¬FÁo d<ÐXòÉ®{LP#aRò S1ÎU‚bƒ‹ÖÕˆ<#fÖ§>ø˜¬ F¿–¸Ñz´®Fì`Iå† 4¿i œI@*7$&Ÿ¸i4ÓÈÌ1L¨ò'Rc"’+m} ¾æ¬‰¬«Pyó;±C ±< ÖÕÈ*aj¥›F[„KÒ”Ÿ¡R§ö›ž|â´œF³ýxA6¯F4ŠIëðú¢hD•šAÍ«ÑB‘&÷OÞÄĪ‘Á¦1”|B;<ó2Š9w‡'¬Æ@ÞjZòI¡Ž¶Œ–ÕDRòI¯4Vô7Ú:®›{Ò©wÇDãÞ¾ìÓû½ûãCýjš˜bjô?tœ4òy·hÞîIPR1÷,=3*{x®DcEc0ߢ4šÑ›¿14}Ô‚µ7ïwT¿ÕÄQdØœþÔx—P#ºi›«Ã¥oPe2¬òØ%7®¢Fë6hf]9»îлõ¸q5®dÕÂŽ ðXÕ_Ó}j’Ξ—Ƙéå]#Ù¶« 71#Y>1Ãd*µ“6hFó±ɶߎ{$Ä,ÌjØBcú]¿e8\%‘£FÜyh$} /Pú®ß‡!Ë6šóµˆà´äÓˆ—ר‰‘«ÆU*"v£¡M /+¨1¹‰9~5†bTº±Fo¸o†mâN#Éña¶1ñ®ß‡Á«ÆÈUšNšVU.R=<›hŒlÅIb1ÛæR†‡[‹À“Kùç/<=-ÉÇU¼ß¦U$´&û2j$)¿f1]ÚGBsa¨'lp5 w½±hçŽ/õĈíäeÔ¸~ðÒȆS¸ž›1qhøÔxPça¢b1hq Ô#Ff|j uÈCº¬` ð…GÉQ±ÇQ8hdžñ¨ýj g ]c'-ЈGšŽ–Z¤ù ì›UiøÕO#95jb|ýFî#¡MŒ¦ÑÕÄ$«I˜°xgA{#p7ÁüH,¾Æ@,Æì7Ñës^€Ž™{b@î𤪑ÒÖ#1µÛ÷gÎ _pq“y4Æ>­lȶ?g”ݬ·7x#’9ª1äÞ‰ÆdÛÈb1ú¸ˆïÕ”±º ju Ç¢¸Í²;ÊQ#ŘCc²ú`z#àZÝvÐÅ,ÛˆÎ]l©]ï ^k¶ãÕ«FÖÐ~£Ôv8š^|ksüj ?TÕ49<³ÍdìÏü»Šux‚W‡3J§¶Æbngl‹Åœ´ –GoþƃЛ÷û Üj,‚[Ep«±n5Á­Æ"¸ÕX·‹àVcÜj,§soç~’™®…áTc&/×T²G9ºJz EGð¨ñ¦1·‹àZjxÚ‰»¤#Ék©1i.|*Rc[ \O:¾¥Àœí(‰Þƒ5&\™™Æ@Î Ïåã'ŠþÛ¹SÛ`hŒ¼¥Ân„Õ˜ý[hôgpåÑX$ŸBq(dºáí£"$ÛÆ*jŒ¢Ñ}¢¶ Û‘F“ gŽ!|?£Û˜E£™“#\kPçÀrmõ)™ó]³W†ekãæ"¹hD™pæ˜ÃÔR#š“ã¡QÈ“â4’$©  ‚F³œ˜Çª©ÑáT#;hDeÂ6*€U\BºG1?÷Þã¿]ªñ8ûR£jsõÓBÑý”Ôr„9Ó} IK:UãˆïÖ½äጃ›¡r4v¦F•N±4Ú¸ÕÈhÔ"ñ=Ót =˜lÔu!Û¸nWcB—ë4r#¦Ñ,ÀO÷۪ƌz+!Ç,Jš'EÞ#Š‚@#¦r]Ž^ßMA¾ÿFD55âòúsr,$’Fä½™PœF5ßnÏM£2yy4Ž0ªF+`ä )¹½Š÷.D „ ™4šBœFüÕOcÅ™4]”Ð1O ïÝÂ;“i¥(‹FÔ|ùÖ£›˜Š37/ !Õs°i”œÕ8Î2$ÓÈû6d¡^¹îå Û¨N FüKD#Ð †häpó°UÕˆf"X4B£W™ÛZVe4Ö‰©4âåA£R.†¸° ª«Ñš¥·9O ïÝâ4ö“ߨlãˆ'X4FÌ“Z~1ÿíâÚ6¶Aã.3${£¡üF(O¨«FŽÒ4:ÂÊÁÄ<ÄnÔS£}½KK´M`ç7šÿeÐkdP×^GbžZ xP‰š.k̉ ¹€>#ƒšFÔB4ê - *a°Gƒj(èÌLé[¸6c‘RÿÖ{E}Ž®Õhþ[4*%N°i”›^—€žÕh™¨”ø ‰©‘/ö¶IýeÛi©A¢Q«4…F³X@Ù¶ ÒHýÄ»énKؘ3¦‰é/¿‘X8B£é²îø€5æŒìðô—m+ÀÛãÞÒïXêÓØY¶­TûƒÑzj9RããÛ·™Æ¯¶Ñ*eÙ&Äã ~DåNC#L<~ ä7–¤ÑÁEcƹeϧ.¡Æ²-5¶N&ÔÁi\ (ÒÍíæ©õ€sBÄp]Ãù94zf"°•¦0n, j}D»Úp~cê(Fè^æÿ¬ïÓ§qä›s^Ô†Õ˜´Íˆ™ P>h¬‘më‰0@ú ±†­óµhDÖÏ6¹ÓXKÎ&fþ 41œF­XÓÄ(lbjÎD;<@ ¨¡bP‡Ç,i­ÃsÖ™Ñx™-Vê3ÎDpõb;Rã‘hO'ͶÝ{fÛî½Çþò!ÿêoAoÙ¶ÐÞÓ‹NŠÖž^tR¡ÆGƒÐ›‚¨Æ·£ê„°Õx³˜K¿Ž>¢s‚©ñõèã9-ˆÿúº_¹/£F'>_}k¯‚ J¾ xY¾ü,(5~>9_ð:åI]ýbaRã«÷B¼‚ý5`áAãø?’K¾åendstream endobj 319 0 obj 67 endobj 322 0 obj << /Length 3547 /Filter /FlateDecode >> stream xÚµZYä¶~ß_1ð˪iE")Q2òbëņÄí µzZYuk ©wflä¿§.êjõÎ>$^Àbó(‹u|Uœø&‚ñMÝX­ÃÜX{SßDÒýñM,­-ÌØN§|{÷æOß'ñM…y”Ç7wû‘»Ý/Áw÷¸‰ƒ¾Ülã ÝlµÖþz³5ÆN•ÁP늾jN›­Êl”Ún~»ûË›wwÃÆ‰R¯±†S^ã-Ž ››43a¬MB Þ€5© ¹ßl“$ø7pKÌö öÇÁÉé÷¹’j~Ü0¶¹@Z_ɔٮIh•U2ã»w?Þ½ûÛ%“†Yœ©/¦t‹ÜeÁÓø­Š²ÁùíÙ²ý„²-;>›“oÿÚawò-ˆßO+}û¦åFàeHèo-h*˜š½ßó<范-žäf§:ÔYn¡¥Ã8‰X;àîKâ·‡ã(›üRi8þtL¾$v* æjøˆ?N;üÑ~ØùP6Gl© pu]ʨ;­‰;Îu˜$6ùby»º*W))eô AùU|è™é¤áSâ!åü§¦îQ–]ËÕ‰¿x¼™M¥¡Ê“T6¼ÛX‹K”Pß­1¨³ÐxQÜ·Ä0ôD ‰åÆÀ8ݤÎUƒªÎoòÛ¸sÇ)÷î “ëžWò= <ˆns,ûV–ºŽT…QT®Çħª?5t%ØTx­(<&îÕûXuyÎï¤IÊü ­¥óÚt_—xiüc“é 9ãÔˆ)}42£ƒƒˆïíÊËä–dÍeQ>?Ö•çÒxa÷PùåÆ$þ48Љ0x€NA²ÁñóF ›ôþ;Þ÷7 &rØßÿÆ #n¤cB£ÐÍ…¾áµo-(Ðß;anTº™,d€G öW´Íäa¯žŸõèМuš{Ô¿–Ûý¡ê¾^u¼àNâØ;Þ_£$v¤3u´©]¬Œ³(—• >ç.Ù†Qéqø‹¼²Õà•Á±ÉädfhyEQ6Ù|¸ç5Aea–û3¢Úê4Å›WûÂ?>m’]ÓF☧MÃœŽøMz;Ѻ F|Y2Ø, ‚EŸŒ µhe/˜‘áú1¢>GéH4²«`Ö@"Áa¯®§vÝ3}½erM ¤‰yøái—~câ¾"œ!(£Ò•B'âÆÉ£$‘òž']H’Bn (öÃiÍÝ!cEJNf®ò”a*ÐmweËMBìØ86£ÉSš=ì,Ž“ ÁÃàXßðª3Ä<姈§,Dïù»ÔƲë…Ë)ºäªmGÕ‰Ž=NëÞvkRØ7Ä\1z¯L'öŒ¹€¸»²ç>v‰ùÄ%Â(ilÉèsÝ©_û-ô:mÚøŸ›$ˆ~à ›ï0,€ .TæP‘ÕÌ D]È Ò¨›â’­+E!à‘gÇ&O^˜ ðöGø×qû=´É~à‰³'‹³ÈÓ×5#à ¡'ÎðPA›l· ÓTZ@#s‡†°¡‚£'*¡v[ºz[í¸ƒÁú}ªêqæ©|Úr"6™Ëí?RxX±”.>WÛ¢<õh‹f Òaèÿ©:nIw–;žOÕ§²Exrù‹–Ö¬!PÐïP§‘ÀÏ`íļà' ~_£¦sD!êÄ ÞÌ$—g=–탰–V´ÆGM‘0ÌÃKXÃÁq¨“¡Èñ“Ý7Ź[£:ÇR»uÚØz‚W±àVE€ÓÌÌÕg ®çRŠC¥Ô¯GküÍðúó¢ÆËÿ€Æê­Ïòü•ô yÕp-•e̤DcX÷Ñ+VóÜ•Ã[Î+8ó†øsOnðàsYGû"’¹pi8È“Œ$ l ¯F…«<@ϱ’ )ÀÿÚdf¡>‹#CV6K‹f'N¨¦â}8JjPLjC¨Ò%£c5Fm•˜¡¤µ™D$œÐð0;Š3®o'Tú‡Ðu»vÂ8íOó1á٣éÅ ÃU<-A ¸óHÂÐz†ìM=3u8Žs Fr¯Ä&¸Ý~¨9‘H‚köšéPéÁaý‹e-ÓP¡±Ï.kÌ,ïîå+å S“2š„:*¡á,‚º¥Ì+Ÿ+ ¬´/° S›TICåX73´ŸFÉ„)8»Tc#š@›Š@ãçMŽ•M\[ÜQì­x~Ç}?`ÑK!ƒ1 ©•CcôÉáª3M›¿Ç„ ï«òv󄕨4³am, ì< ³ƒ´R †S¿ð2JøNs׺±Z&ô¨ óX‡X§Û¦æN>14¨æ&äûW”„JÍЬùˆêš™à›Ój% þóãëNÈWQ®*ưd¦ä,%-ø![Z\€+a¨ˆNÓC+ÎÊb2ÃùìÑIê}d6”"±ŽÙ± 8ƒ/§Qï¡9×R˜„ŸÄD%@mInO§õêîà¹G\Gj¸¤sÞ•kèäèN"£VƒÂuü³;û磩‚F%CtôàÜÔM‹ÉO Uºk !]G7úíŠðµÆ,:šI}°%i²FÒ±,‹óM‹õU›¨à›Åõ’¯à´'JK[Ì8lÎun›Ñküœè9U&å˜ò*ÆÊç©lñ‘)¶ä+&4Š‘qÇäóëfÁÃ&dV’àA¯)©‰$ɲXŸ‘ð‘uK9Hbï J{¢Aî*Ëù±úpæ_ÇÅûê2=l䊥_ÇŸGÇ×1$V5=äjšÃ¾ídÍE™×_ …çȇÃùjÙ—hè™>óȹ#·‡Í!‰Æ™—ŠCFÅŒ³)ÇZ9ÿÔc&øf±º~q!+ù‡=Ï“HéM‹'‹•'9 àDÖ?-ÄjÂ}Ãk¨w Iδ§ WXí_x{'›_W+§×JqƒÎW5Êÿ­; }ïŸ(‹s7“g%ªuµe!¥µÍ §ºì„.‹ŠªdÑc‰hiÐ8»’m|‡IpdÆ&׈©¶­¸ú5T{&PÿLFGeR‡4{ìyïiL‹Ÿ8Þ›p†“™×4';b¸›¿<ᢧ¡ºsàŽª§ÚL.Q~w…ׇrôI±›%#Ûëå­uùulÉ£”´ðÅê‰^™ä‘LJk82¹Ôšì‹qÜÏü>P¯fq*ŸbÓ¯Ö‘º1±^¼vÜòƒÜÓ¡}8BžÇ—k96ÊÛ!´ÝEÉ—3ʉ@%§D)žî*BR»3 –„yºLž=“dXt[Ÿs1ið=Y[½íŽõ“A1Rå)òç¡n ¹¢bdö‹/éÞu«·­¢0Ÿ?®ÜO”»Áä,“ç:…¼¨Fù$ãÊæîK²{îs @×Iš4IçPfT1ñ+Wå}ÍIð_pÀU“ Xk.¼“™ü1!B¯`uÍÉÝ×£~É£ÚyšÿB÷ðæ[aU™×±kßYÞ w'1Û{~É»ê ¦é&± è)‘âa"¸G!¾am ›n nÑÈ%ê"²6ÙèŸùÙ4clXºSçÉ"8!ºÃsj6ÿëøÍ× Ë'¡Ã\:B!ü¹|°ÿ¸È(‡Ófyu×ÕþÛx|ÉQÖ»SÇaO†‡ð)Fà%ÀwÅLpâ*.¡é‚tù¯sìø'gÍòYuòYOŒP$Lœ½EÒ€0·ã‚:¬x’ ëú£Ð6ó«_”¸Xý+Q»_p8…oî“o‚ß™H)øyÚe.½jâCpØÃê|rm@k×p§dÔæt‚²ˆª¨úú…§ ¶º®ëµz:@Õ­Dáé¼¥Ï8eÎÔíÃÚÚ£¹mì=2¡rÛþåÞ P+/:Œ Qbï¡L˜nçúKˆóSúì³e©¹|ƒ[•?£R*Ì’¡<Žl‚û%±ü1ìÉ=k:ƒµ>@Ï$LÅ…ÿ‹ÒýQž–Œ ­—¤á7ù¬¦“òC!Ú3T(>z쵤«*»yíC Yzí• .‹C©|ñÞTJkBÿ`þ_LU» endstream endobj 321 0 obj << /Type /Page /Contents 322 0 R /Resources 320 0 R /MediaBox [0 0 612 792] /Parent 313 0 R /Annots [ 324 0 R ] >> endobj 324 0 obj << /Type /Annot /Border [0 0 0] /Rect [227.1819 589.3524 395.3943 600.2615] /Subtype /Link /A << /S /GoTo /D (geometry) >> >> endobj 323 0 obj << /D [321 0 R /XYZ 90 720 null] >> endobj 325 0 obj << /D [321 0 R /XYZ 90 407.0287 null] >> endobj 326 0 obj << /D [321 0 R /XYZ 90 122.8104 null] >> endobj 320 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F54 117 0 R /F67 89 0 R /F55 27 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 327 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/color.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 328 0 R /BBox [0.00000000 0.00000000 106.00000000 104.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 329 0 R >>/XObject << /R8 330 0 R >>>> /Length 331 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h`j4406R0Ô³´43°T0ц… .ù\@!Ùendstream endobj 328 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150406) /ModDate (D:20070503150406) /Title (blah-000.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 329 0 obj << /Type /ExtGState /OPM 1 >> endobj 330 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 220 /Height 215 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 220 /Colors 3 >> /Length 2968 >> stream xœí=’Ô:…ïÛ èBV@$L2UÄ,ƒd’Þ9 ªf“±žg0ãÑèÏWÖ•tu}¾ªqu«Õú±NI¶¥ùPÆËßïß¿[$ýððpww×"q0„Ömº¤ÿñãÇ'Q.ï_¿~-x\J¿$»U@<}û[·é’þׯ_ÿ‰r •þö«OŒ¢]›.)¿yóÆwJÙ<è±P¤%š¶iÜ)WµâˆcÏ£«½¸Sj(%Žç9ºãÆûŒS.jmaÎxDµwÊE­®°q¹\¢ÚK:¥Ôu¢5³á×2p”:.­¹6k}j«(Ëœ²~†uÙ·îå®ãHµ©Û!;e}êÓ5Ü?^ñi…°Mù3/_¾¸élÞ×Ï)‹h ÝÊ€H¹C´M—&ã4mMg§\E  ÒÁ)™¢$§eçsJˆR%NI-;“Sfévën©pÃÀ)Ÿ•ž ÏEJ”nx‹×æ1蔥7xÜ_çŒ&ÖÍSÕn8Lˆ»îPÔ{hqJf®^äR§döÝ´§°¼²·OO%ͼ;lM¶û£Õå”E¢tóæ;eQß͉| /“pœ’ß“(rÊÝ,=–¼Eœ²´fŠõT¢$†SºoçpÊhÑó”:%¦8íà¸X©Å)Q䔜¥g„¸ÄÇà컦¸÷=\§|Vz’; 8å³:À)‡§|Vz‚Sê µSòS€S‚?´vʦ4á”àMòp:GœrÊY%™9Þýeø:Γ7%‰¤&Õ¦9§\ï¾,ï]µn·d*ÙN ‹`CH%å:¥«Ô?¢¼½½õ²ÄºoЇÕ)]‰?uß[ÐãÇý‹NÅÍÍM¸½Àåry&J×EQ¾|ù²w1Áiøõë×*ÊgòDé΀è¯SB” ×ëõÝ»w›S²fß®S.ŠXz`?~,ÇM”Üë”ä8%D dñDI‡r–®?!…­¶4˜S*¬^È:R] Ehkµµ„R³mU]E¨jµ­„RIõ¢@”!ªZ-%J‚Sž U­§PÕjpJzÎXU­§ ›(Û]4PÕjpJúT¹é¨CU«õvÊ%õõÅ·oßWí)G//ˆ2$U…­½Vú´Z?§\«·ÕÊ{Ûˆ’C¦ÕܳקÕú9e(Ž0¤%U­ÖÉ)wkâv®›.¯£=~*~*‘h³g¦¯ÊÑÊF-'_N/\‰(½@‘†óèä”yQºÂá×™ªD™ÆÌ(J‘† £Å)Suö~d)E.ÊT‡˜ï+uŠ’sÎwÃ=T8%%fy¥¢ôBfe'bC”^Rz2ìÑê2>|L™ê¹ò(lˆ’Óaª˜}‹ôªDV?˜šú(e¦„­EI=¯S2ç(ùñõ,0œb½Dø ¢ä7"¿áÂÂh¹£ã†§&¤aè%• Ô,Êð£”ñë¼£Ã9ç» ç{ßH;ݷJD9<%$€ÈuÊhä¦ÅvQÕjpJDîèd"¯@”pÊ ßûœRˆR8¥¥,pJ JYà”@”²´rÊëõ:¨F\ÄEÙ§ÊME©ªÕ„RUÝRÈŠ²[•Û‰R[«I:%R`J 8¥YÞ¿?ºGøþý;œÒ,‹(?þ<ºżxñb¼S®%‚¬³"3¢à”¥,Ÿ>}Z[ÄŒ(©Ò)Kt¥GQ¾zõ*üèíÛ·•5LñóçÏF)e=cÆDY딣Dy½^‡àGŽfg“¢$…NÉ,‰lÝÖnÌTv0)JN Qò1)J‚SNIQ 8e4'ˆ²&EIpÊ©1)JŒ)çÆ¤( N95&E §œ“¢$8åÔ˜å°{ߥ&EI£ž‚(E0)JNÉ\D²ˆ’¿Ü¢TËNÙhYD©ENÉÆìbL”4Ä)¡HYŒ‰ktì`F”„ÕŒf0#J8¥̈’à”f0#J¬f´€±%¶„uß³co‰­ŒSæ·›÷P~ßo®e¾&/žSýSB´÷9<̈RÃ2_“¢”žr÷ÿòM!ÊY 1)JjñegpGgˆ²3Šî}C”"˜¥®ÕŒ€(;§Üg®e¾&E §ô™k™¯IQÒ(§Ä‚FAŒ‰rŒSB‘²%aŽ̈«í`F”„5:0¶p «§ÇÞÂ1ªqÊÔ³‡wòUŽÂ5e&/ U9%D™¢Ûš2“¢$ñ5:³?º–AáH“¢Äó”@”-Àó”U@”-hµšÑåî#•¥“ Jñë”eDɧá“ç‹™@”^L‚([ÜÑ(= J> ïèð÷o(½˜Q¶Û!¢Ü€(ù(º÷ Qn1 ¢Tò”D¹Å$ˆNy…kÊLŠ’à”|®)3)ÊaN‰e:‚%á3À˜(±FÇfDIX͆§ê0è”X‰65‹ :%D9/ë-³N¹®}±ÉɬSB”Ó‘%Á)Á(à”@pJ 8%Pœ¨ã¤N¹ýƒŠm‘à~êÅÙýbfí‡l¦™øüL3JÃ9£SzÒÙ]E´EÈ|q÷ßXífÊÜ,U‘LwkZzêŽqF§,:³E[*d"L-J~‚"trʰ¯¡½.,Õe¤¾bC”©tDDYš¸)§Œ¶ewÀrCÂsA ]Ö‹23ÓSWŠÒ}»›'~åÏ/¬©5§Ì7a>Â1_i!JJ·PiRE¦[:f-Í”_S槆aNIYÍí~½ƒ(ù#0N©*Ey,¼]M™µ8Æ0§¬«1ÏDÉÉTVÍ"ôsJ/$Sçpºs¬Ë¨屦œè¤º‘Ýp‘×dZj§¬<¥¢äq9•*Í´§(wN:E©bLÙh¢C13&†(S_d–Š“i4ñÒp~¦™¬&ÓJÎ8ûÊQá”ôøû ¦©^ƒ*®SåhqÊ-d}}¼ïÖŒ)rÎxï(çŒO åÀ):à”@pJ 8%Pœ¨N Ôaß)±eõ¤˜uJ(r^l:%˜ƒN fÇ Sb'ß© ·—&N QÎKt{i;N‰KBÓë”@ö¯SB”Ó§ê€SuÀ):ú9%sµüú‚¿OAˆrRÊœòöövuG÷("ÊèÛow£k!ÊÝõÝö(Š@å+°Ëq§„"A#:åÀƒ3Pì”Ëg#Ë ÎASº;ЖS®¯qıç1甂¬¦Û"e0ЦmwJñ<Ö‘ti†vmwJo7Àú#=n¨µí›…ãìÇÖmúä”íf6[¥úÓ´Mÿ‰Uü3èÆendstream endobj 331 0 obj 62 endobj 334 0 obj << /Length 1583 /Filter /FlateDecode >> stream xÚ½XKÛ6¾ï¯ð­2°RDR¥öÔl’b‹¢i7=4=heÙV#‹®$ïÆ—þö΃”%Gn¶Eˆ)r83ß¼¹bÂ?±ÈÂ…V*È"­Åþ&´Ûn„]ù@áI^®n^¼‰ÅB„Afb±ÚL˜¬Ö¿yw»ü°^_.}áµK_)婯—~EÞ}³”)µyÑW¦Yú2Õaì©tùûêû›×«Ap,åÕþ<+)¹ðe”:JèÅý^ˆÅ+sóó™}#8ŽQ‰ ãMµ=Œ¶D‘§øˆ Fì­vða¾=†öʼ͛Ânþ„0󆩄WÃ"@ˆ “/“ Cr¿»±öú]‰ 0MÞí–nõ|Vu|”7ü[A³†ÿªÇ ŽyÍ„|ËìoQ<ø†Ï Tj—7ÛÒr<á†9òé)ó¸eu©§3"%Z¢F]4žò¦´ªb>f_°y}¡[ä½KŘç=¯œúeßž¾‚Ën««Ñ¢~ ï×Ë ŽÑ”xñ”x\Yž®]¦Ê3HZ¯oqKO-‡÷( Q”Ý _[R ±#1˜Y£™áó<ãO?‘'¸#4[Cœ%+‘NãÓëj€êhÔ±TѲ<¦š„¾Aªed‰œy]ó¢Bëê£méÛç,§Ø5uà¤HeÞû0élI`ß F ·GsÈicŽ$ÒŽ‹arOCÄQ ³«\¬dÖ¿©·7”¶°Zc¬ƒò¤ÓC]ºK¤"X%(­¶£ó’yº¬¹“hLCÎã`w®Ä»æSàÊ\Y2:½êÊ,%¦s.J…\*”ß۲絳,sþ!nù*í­%Ÿ50ºæ4$>ŒkQÏD5‹# •3Sa¸…Š;É­ÚOT&-'*@¦ëçÀ·%[‡Û—*´CÂãzœð\n©ò¨ Šn¨$cf+ºpÞ‡"‚CüÁÖ™Äô-ã0ôÌ€6‹äØÔdr ‡GçOkOKÒ¢c¶;Òš ÓŒ,ÑÑôñæ˜ùÚž*Áz.ÓešZ$Ú&ñ«vƒ’O³éž©J…¥, Û³55 }âb «Ù²·Ð͆óÜDYªgòñì”jâøˆ#ÌR­)ÚPö¤m—È ” 2­lK^jȶá•ݼXIº’·ÚQ=M(ÑœWsûÍ? -tÆCÙ±ŠO»2ÍŽ/›¼8Ç<´$7 ÓÚgàðb /€ôçðz½ý²0ÃzšÁÿš˜Ô|ùÒ|ü’`l YTQ·»˜<yÇÉ^[˜Í¿ðÖ»¥NÀ‚{Eÿl¯EIrQR(îR[Œ¢²Õȹ‰ÈCÝæZ×òÑ»×w+^ÇÞeoèšR ׳NõÓHX#“AE-ø§Çk'둹²l°'¥Ú{ûö»x5R7ÒQ½‡¶<´DÛ‹dæÙS¶†©¸(u¼‰s q®©A—¼KÖ+·{Ç#%ãЕŒd¦S~w°¹û `†ÍÉrng1­m/{£µƒqzƒ†¤b%¥.-ÉZ‚ƒwã;†Iý’tâ1áa‡N…… çUoí½Î0PRˆÚ¤îÆròCm+,ÿfn輘· ¥º*}ÞÛT¢¬3ƒ=¹/À¾_uéèП&eå¿%Û¦Ýçõ-ŽdHzñ¡§óa¾:LRˆ)φ(zÓvÏooðb•A'rÚÖxIB 1slyf¼œD:¦áñ”žù…âX»AàÎÔ¤øœ±‘«LYÊ:8W¢Ú9rvØPD$n‚ølG†¹KgYjÉoç8ê ”af)®öD©ƒHËøÙŒþ!‚¢0ÕÀ¬šðSýÊpÄ"q¤kMÌ)¥vV©ilüø´âoÎOd•È N£k“U¹ijƒ¡‘H®#‰°-6`¨lËÃÏ6Ö™"ÿDz…×0Á%ø$7{÷Ò†éþŽj0¿,H‚±<æašrÌTŽŠÂž7ZnÐÝ\å…ÒGò &S]ÂÇ3'y7.Cîõ¸¿!ý 쉙 endstream endobj 333 0 obj << /Type /Page /Contents 334 0 R /Resources 332 0 R /MediaBox [0 0 612 792] /Parent 313 0 R >> endobj 335 0 obj << /D [333 0 R /XYZ 90 720 null] >> endobj 336 0 obj << /D [333 0 R /XYZ 90 684.1345 null] >> endobj 332 0 obj << /Font << /F51 9 0 R /F54 117 0 R >> /XObject << /Im11 315 0 R >> /ProcSet [ /PDF /Text ] >> endobj 339 0 obj << /Length 2492 /Filter /FlateDecode >> stream xÚYKsܸ¾ûWèN•‡ à+9ÅÚµ­¤*Ù]©\•Êæq¨®9ä˜äXÒ%¿}û>Æ”í¤\%bкûë`}¥àŸ¾ÊÕUjL˜Û4½*ޝ”L|¥e´ŽíœåÍÝ«ÞÆúJ«0W¹¾º{X¹Ûý;¸>¸ÓFC¹Ùê Ûl1ùófk­ nšM”©sÅPµÍfe©Š“oþs÷·W?ÝÇQôÂÑ>M‡³&ºÚêT‡©M釛£Ž®~l_ý2ñ  oi •²½ŠM&:b5ÞVû3¨Ñ•¨ L?R#®ÛºÍ®0ߢ"Aۣƥ~FM]T2D¢Šp¦­ÎCÇmrw¨`Qdòà4cå™ö7¥QÈfU0 ÔGüÓòDOƒHiøÛ×Õ®ìz8®ÉÓàýo*Vçþj&ßâ„H?GŽÐÁDý@Ôúìσ”×@ŠaÓY²àW™Wžg7-ÇÂTWe)û_XÃ4é5f«Ù[mB«„ÌSºb¥ÁÖFqP!^" ‡ ÙÅ5û’ÉŠ'tH×âé÷²P‡à6•w¸ùŒ¬ý§³ëf?-Y·Ÿ Rqî:¯*C˜%´M‚ÇCU ÉŸVÄì+Xø ²š¨ $ÎÇѽ°F­R?H!S0Qy„Õ=¬OƒG?ßߊ QBÐŽçÅ ß½aBÿLȼǞç½L¯)ÎmוÄ~âHh…÷Ì1”OÃâ,è¢'/»gœÞÌB­3û êžó9È…0~û‡T”«€vî‡òˆ´nžƒUA!d”GÁ{æíÎÌ=ç,°+w_‚¡±a% ÿüû*^¢ÐÆI,<”^R@HÁ8á‘Ҕ݉Éû<ç„úL Ι9P}‡€ñE”–Q¥mû±Å@sgùK`‡ÀÈMläP×®)61œ¦^SÀ@EcyưùgǬ ãSW~®¨ïèˆ&I9öŸs SïÈýâ0pu}Ù'w‡r]«0K·ïQÚ_¼YÿÀáj†ˆãФÚ{‡R&7=”‘FØe‡Sc™E“GðG"@•…è‡g&ŒP…´ÝÜnD8ÐŽÜ$ïÊÚóRY…Ñ;oZÈÌÀñ¹*YÛmÔó%dXqP#F¶Î£Pg:¿¨¼³¾fpݾ”xØËnášU!ŠÂ*O c¥múÁ5ê1Ó0Q*cþÄøìÀFçÁƒ+pëHqa†ƺXˆdÿLã—ò.u9cûeÕBOë´R=ÞYm4‡ú_Pˆ+>X÷XIGþ•\Á2…pÁæ\†ðŒ³—[s¸‹'ùëy+Àa?»Oi€_’jï˜Ðÿ7Úf+Ø— endstream endobj 338 0 obj << /Type /Page /Contents 339 0 R /Resources 337 0 R /MediaBox [0 0 612 792] /Parent 313 0 R >> endobj 340 0 obj << /D [338 0 R /XYZ 90 720 null] >> endobj 341 0 obj << /D [338 0 R /XYZ 90 684.1345 null] >> endobj 337 0 obj << /Font << /F51 9 0 R /F54 117 0 R >> /XObject << /Im12 327 0 R >> /ProcSet [ /PDF /Text ] >> endobj 342 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/mat.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 343 0 R /BBox [0.00000000 0.00000000 128.00000000 148.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 344 0 R >>/XObject << /R8 345 0 R >>>> /Length 346 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hdn44±0Ö3R0Ö³´43°TÐ5Ô3µ477„(¶PpÉç B^"¤endstream endobj 343 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150402) /ModDate (D:20070503150402) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 344 0 obj << /Type /ExtGState /OPM 1 >> endobj 345 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 265 /Height 309 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 265 >> /Length 2925 >> stream xœí=–£8…Õ˜=LÚQOX+ð9SIoÀ˨ĉƒÙC{•Õœã8íhÖ3xèé_€ÐïzzÊF˜‚ë!¤kÕ7Fšôýç*~=o‰vä`݆‡K¯+wâõf}<ùåõ<†ÔQÊwb|bß@Ô'“øGê:ççÈ„k[Føäy™™x^Îü­&rïL^#8 ×D¨ ……‰OçÅ´e}ŸQX˜°]L+»ˆ²·µû{Õ˜0W­µ];¬ûkkð#טX³Re=`6Z$W‡¾ü3Œ‰yHWþ~é‰Y¸Ø³jDéû»”Œ]ñŽŒ/¶3GueîCÍã„— ɉa·ö3!á9Ô”F¬bb<=¶2ÁO´‡òc<ùbÙcú­•̉„Lðƒä7*þ‡^ Ò‹Ó(jCóab‚;1û›ÓÜÀÕÉ#%hg aù:&®ò._šÇã¡Jô Ð ¦'Úß«ü›W2¡8Á=“™˜ñ—É—ÎáD†“CbBúÍk™P·û021;çÃr^,kÈ‹s11€(YyíP¼P™PªFc}™ ¼¿REûÚ!ÎWt¯˜¸8íÉ‘®=Qº¶1Ë1±ˆ˜˜åeB^xb&/NÌ„a¹ÎÄËÜÕ»eï†_õ°íï`‘y¹`âÁ{üŸŸCsÒ¨‹ey©²î¯­@0ñs\íÔã·áÿŸSjà5øõOæÊ¥?ÿãCìûè?ƒÎêÄýé™àÆY™¸³_ʵƒ3ñ;÷n¥×c¿”ö;±­2ñcź¿›f"܉;{'&¸îlv¢a&‚d0¡}&V:AL“ˆ 1ÊÇD×ëÏ\k9Wshr¢ãOÈÇD;Ö1ÇÑFs¢W~“¦ŒL9ß°Û ç&22ÑÃÞñŸœÞžÿyÎ *‹áëäͳ‰”ñgÎz9ѱù_ÏÄóùðqÙ©NàÍã9™˜Ž[¢X"+e¤9Ñ›f½v 'æº}yʨlƒ¼NÌ¿.+PG 3¡—0ÐÊ6(ˆ –»=!œ@»¥9¡ìòJ©×¿9˜>w­Æ4”mÚž°m>s×½¨ÉÅU•Åjc6/_E龃îE' bDL€ˆ 1:÷Ðu[g"؈֙7¢q&V©i&V‰˜ bDL€ˆ 1"&@Ĉ˜¹˜¸ÞªiDIZc{·tz¹˜@òÀŒYó‹ÐßS¨7N&pð Ô 5R—.&f ¦!iü'äÕq$ °L?µ ÞÚ\jù™˜O ø|g'Ðð.œhüðiqi ¥ÈWíDš¢*]Öÿ/ yêcÀbukQ¦³g+( Ä LLK&ÄKX#hs©µ• Æ´Aliõe‰ò–â`„— »vÀ)V÷9±T1º]ÖÆÇêö®öL5¦TEúkÌ^zGö3¤)>IÆú°«(rO¹TöR0¿ƒ­¬&¾v;0ê½þûŽ(N|ðã­ý^ô‹œ;5 ÖÏDT'ŒLD:Ô{&Šwb>»S0ñW„ÝÝ£¿}+ÄwÂÂDYNÜ?´—'bWÜ_Ò+vˆÅ2‘܉6˜Ø|ÓÒÝö»ybÔqœ &ˆ‰QĈ˜ bTRÆöCNÜžŠ gØ8å}LJ#y•ê^´x#R1Q‡¨oDL€ˆ P2&´k´x?m/ÒÎË„ÞdwBNI¤ŠàEºÂy™Ð öý7äEPÉQNÄ“‡ ÖGÓ訉:X´E]<'JzG> Ñ9ùìPâ"ž@I<'8Q„“BÓìK¦€é1\âÈTYŠRŸ=A9+³ãû N &ÄêD@§”ž3gÅо›™`Ì℺ĸBQ¼Lìr¢¼žƒ ±çØ ½Æ´;QUÏÁ„Ù ÃU”!Ô WQt :,‚ˉªï;¢è½…{Ñú {ÑIÔ?ò÷m¯ø)Ä:ó˜G¤ww¸³‚ÿîÞOÇï-,gåÎ 7ztˆ;™p^VæÄN&r¢&ðWnغ¶z[L ÎÕýy{"Òlo-Ì{·Cј yïò+ÅAÙ;,êÛ L ^Y©þæ,’þ}Ì2œHô7g‘º~ÏMN g¢MûΖ«\¡L,ùk°$ÇÞÇT(Ø %´”×­@&pæJsbË÷vËS K$Ýà„ç*W&V÷Œ”©0&Dm &íº¶jL/²bÚÔ¥žèsY‘6{§¨¨!ë¼w…9‘ñ^´e'¨ÂÓY¼({7©¸ìÝqr§úXqãÇÉêû(.{wœÜ㌇8Q,«œØ|uoŒ‰3: Æ˜ˆã1ALŒ"&@Ĉ˜ bT®Tß©î;œ©¾”÷¢ÅGÎR1Q¼”½Ã¢¾m1"&@²w…*Cö®yÕÎD< bDL€$&~^ž™‰xݶ홙Ž`âç°à"1¸ëc,*î¥%¥MÂ411=ÏÆn ¿Åšà„|”hf7cùV¥ŽîLLp}x1…‰s9ñzc“ÚµÃê„Èï[œèæÙ µØ¿á[¦uwŒsn“çÚas¥QmNç”´À¸nJyÚγ£s:_Kou²œwVCÐ µ‘ ”ßw:¡Ì‘»œâ¥(fòº•0òû.'Ô9rçEê·ôoŠÔÃ>4—†¸¿ïÛ2á©1 åO¿kLÛº)åe9(õDæ%wÔê¹êEu™Í !ÎÀtò1_Ì-+æZjVQÉoP´,N¬ÌòZëZ„å:AýŒú¬„ˆ 1"&@Ĉ˜ ΄S³20qN# Lü‘{—2Icâ3÷e“ÂÄ-÷þd”ÌÄÛëÌÄ„UÏ›«´"¹daµ§QÕèÉÜ23ñ¼XÃnöÒš7çqŽLÜœfNÄülòÉs ¤IÿÁÚKžendstream endobj 346 0 obj 68 endobj 349 0 obj << /Length 2400 /Filter /FlateDecode >> stream xÚ¥YK“Û¸¾ûWèªjÄ%’ SÇ[Níz­ÙÊ!É– v(R!©Û©ÊoO¿@R3Ô:“ÔT <ºýøºR«þÔªJVFë¸ÊŒYm¯™¾¥d´›ù–7·¯¾{—«•Jâ*©ÔêvAäv÷·è{Z«hp늺õFké×ëM–eÑûf–°ÔÙíàÛf½IK“äQ–¬ÿqûçWºçiú-ÑpË·dSIËÙª(³Xé,'oÙÁÞl¾7Uqi2 {Þ­‰ìÖ7wp¥¢x™¶;ÂÅlÝËñ V¦ŒMŽ‚›™¨þ½Î“$²-^TG|a @eY†"Ë*«„ÊN§u®"‡ÿlGÿ›-Ï,?Wröd›5n±käšF¾ÙÁŒßZ¶Lϲ<ÜppØñÖ¦xâû@£=¢á¼{DÖ«Mª‹X0€Ò±Ê¶|hÏ5œØ±Ñmבw¿gÑp°¯4ÀHEG$lkžz@ún‹S­ö|ÈÖkP¥Åå/=ïÝÛíHR>HúH„Ø÷T£ßåÑû½ˆÄ»Q*0&óÎ.xÓ OŸØˆž}v& DlX*ÒHr©Š=2¥m2#Râ€ô‡Qß¼ÀRã˜Ø·uKK`Šýµ-]®Ú‹„Ío®Š»ö裴UŽµÂ¯Ù î3?ó• l]áiÏÓ™É#tÛÝó¹™<`VÞÚ/Ý}çzß¹¨Þ$Å¢ m²TñmˆRš°&IÀÖïxŠ8ùž7bMÓ¹÷äV¼2*ÆíI4B×òô҈¹ñ¼ž´‰®3éå²õö\[< ÕÇKW¼= `:%Àg>ŠãÛ[Ôi=û©è–‡™,„½Jó¸TÕöäIôeG«,áNyZÊÙ-*åºó(Q?@(RÂÒß•û-®Þ_Ä 3„ ;‹_ïù(EL¢þîÀ±@3sý±A’<ÎŒ*ƒÆ ÌWMNÉqÖß ° ·Uuwï³ÈP¥ÛJ‹¶ó_>qC?-ì­GqÑ}ñ+Iu$Ä>Èž)&†Áí„ tžG¿º¡E;é2úÛ:× <"o‚j/_ž£:ÉÙòêNnÉcFÿ@ø™ÃŸ`Úd/pœJbÄiè°GÐN³äEôk-B-vTÅ o£òØ(Hg!á1\âm:¾¹Ï‚Ç`›ÌÕ;Å7Ý$rÝ¢t#xáríör\p Ý;,¶ûIä¥\›e±IÇlûÂDWÆYšg‹‰ŽóN˜x½ÄŒUÆIU ƒ–qZ²Ž~ð ^5/£¿zNa¤÷å<[$IúDQ~G»]®Åœ::ùÏ£ ½,ïÛ LÚè$Ãìðœfä0à_…ø‡«‹ˆŠ©n鲓´tWEÒ~É/7Ѥç)ܽèÂ)ÄOøäø¦d6ÂÅ5Š V‡_‹Y8r®ÿ=F«ÂZ¤áý³_§ÐØÂÀ¯s<¸Ð–Šn0JUô½Cõ8 A$•oÇ ·ìÎÕ)Z‹‹h¥( ‘Óòð¸;u8Fx8Åm(||?†…Ë7–TÖ…B¨vhñÇP«qµ#‘kðˆ3]‘qÉu/ð€(¨óÀ>ÿÝ2ÎkÿQ½³Âk£‹b®^”´0Ñ÷•Œ°¡È!b‡-uÜóÉÑÇaŒˆÔ@øÃL3V PÊ„¼G.m†b3ÖºþÀØhŸCV¾ ùË‹'»Y‚îÎÝÔͨœë.¬=g2™À%Œ%‰´5š–;<È™+¿Ø*>`‡¤!šö‹x™f1äÏåçÖƒ‹¼õ[ÁIÂO-Xq¦ÆæÄ‡:"¿l•bct.{šE2qR@€ðÊ×ÕLërGÛ,QÏŠX)ó›Ô«²j96P¡²~J ,MR™—FºB²4¥’AÑ\T‘Ís,&©€åqø¼ÀàhÅ]AÙx3’ùêG‡€9öè2:`Qe׌˜”(¯^0"üÁˆË4±ÊFóÙÚ ]LŒn„Îäv\‘•y¬Lú¤"ëÜÃEù7”ig™ç쩔݄²`ªnCçˆnë³ãjh(H }‰7×zî4NÒ2¸ÔÏ”Š ®—t ¡²°½ÞaW†;lø¯\ê°u €—ÿ¯…GÔ—;쪈ÎÔas鉖H«S!/öR}r©,«¾áE² n»;7ðØJ7C,¨¨áܘêAÁ\Feåboê2;Õ¥ó4j@áG%h(*žf<ùà:/éN¡º n3Jk;“[hð­vvnÓqhæ;æÔ©µŽûîYY««çuí§2#N½ÜÄ@ÉÄ*ú]¿ÄNsv?ûâ¥ýn‘~–ÇE¦ò«N¬¨=!ÛtGÏÕ`}À±Ø"ðà‘+.‚Ƕœ*z‰¨…VÏíV½2ElªR_"C;¥Ø•µŽñ3WÆI‚‡"€L„öj¾•üüE)¹u;±“]ÿbr\!Àְ‚¶t}¤v7Œ= s˜$•—¢±x¨µGO> #‹©Ô–KÙŸ=›­d˜Ìp:Ïòy#)+žJ8X£"‰^Å¿™„ìx‹‰±„ ¤ÔÑO¬£îѳ®o8Ï<1àõÜΡ´Ä ù‰–¸WØ-v§l‡A꩹ßù1÷%*<\Òê²yqØ–¥®/Š®-.NõýÀãžÍ9ºñÖ£¦¿¬A Ô–ëè N ™ã\Tñ/…%Œµ®Ô ârL.^ÄKyû©¦-”†ð•¢Gçy Áó¤2^j‚G sªŸ¢ß–qEž#4+í¢mäiuÎ#3N>–_^Ù[7Ýeòö+TgW÷Ò8˜tI@'¨’_y¡â+8ƒëOô?Åç-M¯)¢nG5>v1|9“G×Ðà ƒ%£Bc&ú–ë¤ /cÄÇ_ƒÏªX•y¹ü2¦SukDZ’êèh‡é ŒÚ°T/d. a'Ï~ú@±?ã|ˆß^ÞûÞL„‰Ûî^ *¤ám+Õ ¶æy;bb˾fT •¥¹tµ¥—šžñQúÒÙãùÓ^ôz¤ÀîºúgôÕÇ™Ë IJüåçŸã/;üKª¸RFáÏ:ß½?*½zÛ¾úËoýÂSB´§%»ê;G-µh> endobj 350 0 obj << /D [348 0 R /XYZ 90 720 null] >> endobj 351 0 obj << /D [348 0 R /XYZ 90 332.6078 null] >> endobj 352 0 obj << /D [348 0 R /XYZ 90 275.8498 null] >> endobj 347 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F55 27 0 R /F72 6 0 R >> /XObject << /Im13 342 0 R >> /ProcSet [ /PDF /Text ] >> endobj 353 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/light.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 354 0 R /BBox [0.00000000 0.00000000 144.00000000 82.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 355 0 R >>/XObject << /R8 356 0 R >>>> /Length 357 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hbb¢g¶02Õ3SÐ5Ò3¶´011Ì-Í,Ì!Ê-\ò¹~Aendstream endobj 354 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150402) /ModDate (D:20070503150402) /Title (blah-000.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 355 0 obj << /Type /ExtGState /OPM 1 >> endobj 356 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 301 /Height 172 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 301 /Colors 3 >> /Length 3115 >> stream xœí=’Ô<†›£n!'  "’½Ç ™dîÀ^€d#¨ÚlJDÊU>úÖhdYjIÝRË~Ÿ*\ƒ­‘-¯¿þŸWÍ«åßïß¿5ª~~~~zzº\.•Ð×õºñ¢ÉçÏŸÿy¸üÿÝ»w‚ÃEB¿âõcˆaŸá'â5;5þyLÂo€lÍôÁn¼Ôÿýû÷›<Ô˜ÇÒH¦F¯/5¿ÿ>’‡n†b¨7 TŒç¡…Åãe~ìíæá2A<‚‹½Ý<\&(]ÌàÌÜÝÝEco7¥.f¸Ù?õŒáÙ†ôwßÏZßóÍrjäóð¹ùÑΗ‚Aö½'¡Ëo¾YNË‚<´ÐJ”‡þ^?ôëáŸ@yxxðëYøúåa´Y\ ץώ¯+ŽM]ßKÔ(½t3N ŠÍ”‡zBÑS¡‡Lé¥Ë$Û¿ σ<¤Û]Ó9ò†ëÞù2ÆŸ´~ö Ðfo~;räaªüåÞ¿ýýotR`rt8ÇÌÃÒÛküËæá¶@Â(æ$pHÒ}¿7d(™s —n“Jðz’_ :G0;Ù¾·öRÎÙPyHÞ6€Ÿ‡ÝÂ3S0;Ù=>>rF˜æé; ýæ÷pdÊz8—ŸÝÙí½©K{ݿժ+aàvÓol¢Âè:q÷¬åaõ·fô0±2׿Öv’ëmkcýÿNäaÑ¢ú…ëæ¸·ÂWuºÐ|yÝ ºÁ–o»!Ll-ÐèaШ`å/ëþ|[¾eÇÃ`‡‚”ûÌyèw)ºÕ,û9ú§²™“²“övY×Ïuklàv3±¨Ñ–V{˜h¾“åávCÅßa«ÖH‹‡´ßÀ¢—¬‡ªÛÍh¢ønk[dz`nïæËÃjéÐû¥+[‹Vš¸‡zÛÍ=£ßô°bãýìs¢<ô§’IE‘ÍàØö¿SxØÿªŒ‘ë@`Eñø0+|PªùçÏŸJ5û¸åßóPý~šÄu‹µžmùÄÕ|xxNøº?¿pŸ?GÚCêyi‹Ú‡FØöã=\·d–¤^Ž~y¸÷Þ~éDÀC#ÛCÒÎÃàH¹vuáØâyü ²ÏÃÃjŽí!áyü4ðÐÇöPåý¥Ùû÷+nð>øÓxh„c{H²ï/mô°åÁs%ࡎí¡âû¼ÀC%;Çö´óп@Ø»vŸu žc{¨{|Xñ¢) šáØ’jîíO2Çoéÿxh„c{¨ž‡‚y <4±=¤YòpÔ»Œà¡\?v-ËÚ-9XðpŽ<%!ÁC3,ý˜¯V<$í<$‰Ÿ.<˜‡ü§rÀÁv?MâºÅZ϶|`Ýöñy¯[@Â3câþÒ±VÒï=Ðïy‹½ýÒ‰€‡@‰®y8êþl)à!PÏxþ°x”Àó‡ÀC ž?,%ðüað(ç €‡@‰¹Ÿ?ä%¦|Þ‚JSx”˜ïy‹ä!8³æá¶|à!Pb¾<ÄùRp<¦þp^]m“²6êV !Úsæ{þЯ':UxèXÖÀzë¢ÍVýìaOüUçƒç Ððpºý[×cMµÂÑÁËzˆç3ÀC‚‡ 0=$<˜_:‹‡Öò£Pq¾4Ãpiçú¡È9&u¦;ñó4üõÙù< áúaË÷Óø{}‰s’‰L4<¤ÛvEûQ⺅_,ººš]‡Ó/: ä¡ <î/­y(<$xØòPxHð°ä¡ ðàaÈCà!ÁÇ2ÀC‚‡ ôÎC›¯R–<¬¢k[B‚‡ð°–NyØ©5€‡ð°‚yhó÷FôòÐíÉOGà¡ÁV8 .˜n‚R–l°—0ñ=´ÙŠõl…5tóP ò€ñ ò€ñ ò€ñ4å¡ÍóÂLJMBBd)ÎÃeÚ˜%àÐä¡ÿ’S€8ù> stream xÚ­ÉrÛ6ôî¯Ð‘œ±ÜÛSš´;ÉLš¨§¦X‚D&\T’ŠÇ=ôÛû€¤Tº¶ÛŽg,ðïáí äJÀŸ\åb•†aGiºÚÖW‚¿\I»ZÉõüÈw›«?Är%E‹\®6û3"›Ý¯Þ«B}é Æ_K¯ó×azá7þ:Š"ï¦ñU[ÞeÛøk•¥"ö"éÿ¶ùéêûÍxq¬Ôc¬á‘Þ¢ Þ’, dÅÄÛÆOSà)VžFîšþèÇÒÓ1 ‚ääRÄ8 !à:2,ç¦({. ½[#õÚáO?ÂÓ-B•·3NÒ«qQ6°"Å»+`W#ÆÓ=‚P›º3ÍöžÑJ¤@(xPßVf€’Såýèhµ5jûkiî,âмÚ[á`‹6p\è Û3)›v€ÃIèíOpºªîù«?!WGBnQB:ßÈ èudßûî KK7;^  ¹–4d˜H­·>(ur®3Ø+-‰]KJŸoáÑÖòqçc_ì}Ã’hºª@cq–yŸD,6Þž)¯.{R;ª¹9 -ÍÖ1GœpY+S[; oÃ]€K‚b»ç_ͧwNŠbM±þHÒÓÕ€åPÔŒ_Zzp¹ ({7yGJ h½9æ[Ä9SoW~2!¡È°Ã5ÀÓÄ»=9cfÞgXžzû1a¶Ö&a’[ÓhP‚.£Ìû¥7ŒðvÎ×;Ý0‘rÏ¿„ßžÎeJH&2¡f¥ÂaˆŽ®økæjî dŒDºÇ|faÕ|ú€‚=Šc…ÂÈÑB¾Q'*"ãÁ±ã;Ó±$íJwD¸`\0Ð]YUœ ·­õ2)\ì‡!ÜT!­Bó¹Ä¾íjMÉRzMNg9n=e§SyæõU9³€ÒÉq!w×ecìItGZ´¤Ó­‹›ã÷/ô~n)¦Ï†Â",Û”÷“h,tÜÑXÁ’Þk’³ ¶*oÍ© ?æ)‹LsÍòq\û÷“y’e˜¥×yá‰Â$N!LbáÅ$1”£í@k¶øažYù¥ý²ˆ5h=¶º¶²gÙ‚°@ âÌ¥„Þ&<ÜìˆA³€+%”Ù²¶wžP{½¥[±ÁUKèãºgÌ¡eLJá°wiŽ!E‹ Þ-²F:‘/Piø[èûÑ ï“[=€Óö|ªBï<.© mW¥ýuÂ’»÷ϰìÇ¢l06ú§[(Ô¥±B!—…g~nÃÏ{FÒêÌw¡ Ø*{4 (aº|!¬LNAÔÊ?f¨˜‰1˜Çú»=UÙKv+Xás½[S´ÍcF ¸i|ۢɩÛO~õã ˆj,¹CùÕ¶øõ˜ghÞBùOU5×?nN½Ñœ¿CÏË¿õ-Šmt¬8›…ºÁ†ó?ÅùèÞ¤ÙS̲뀤Tšœ÷À÷b<‘Ñ$X„\I¢&ò¶4Í,hªm™ó'HägAÑœîÇô†Þò¼˜:²vâ™›9eÊQ™Hõß*&V$&@V$€\™ Úf/Í&¯‚uodj¡´EK×¹Ôœ:•Ô ½–žÝ~²Ø™Â‘MQN×»$J¬´Œl{xAE»-F¡3½Êm¦ïl~«¨¬F®’Ç%Ü:OŒ ›yÑ”’8Ó(ï ‡½éx¤®NÆ"O1«rh=ñRGnj>¢ÿ!ß<±u²ºmÌ“3xÈã_v>þ”´LW»Âe*ëE üH%%•»â†´Œ‚èj±¤DyéØ>êqVª¦^1U+P„ ¤ XEÔ0@¬„þCýadâq<ðmyàÖÌ9ð{à÷Ò©–xC³€¾Â0³ÚZX…x®n*¤¾$jDqš/‰ †˜ò^N!Û#t«#hîiïÄÉŒ#·»Æú¢ÜÛ—êºm,˜†Ô‰6ê†2¢‹Œ;48o+Ò·§nkz¾{j§,I¨Üè»ë$ ²0ÎÏ]¸/ôއÏÀ=‹ü>>{äb¥d¤iã›Ç‹›ZF«×íÕÏKO3RDAƳ4™{q™ýíŒéqúø{ÔÚuꨓ K­¯²;n7¼7Ø9(˜4/1 2ïí‘–QˆziñÏøc4Hgoc$æˆM=ÛYØÀd+ÃÁg?mÃqÙËŒ÷\»Ié¢'ŸÞHæ­ùäçϘWnšÁ4PïŸÓù> endobj 361 0 obj << /D [359 0 R /XYZ 90 720 null] >> endobj 362 0 obj << /D [359 0 R /XYZ 90 373.4643 null] >> endobj 358 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F72 6 0 R >> /XObject << /Im14 353 0 R >> /ProcSet [ /PDF /Text ] >> endobj 363 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/cam.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 364 0 R /BBox [0.00000000 0.00000000 100.00000000 288.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 365 0 R >>/XObject << /R8 366 0 R >>>> /Length 367 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`h``4²07Õ3RÐ5Ö³´43°T0Ò3¶´05‚(¶PpÉç B^3¦endstream endobj 364 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150403) /ModDate (D:20070503150403) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 365 0 obj << /Type /ExtGState /OPM 1 >> endobj 366 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 210 /Height 599 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 210 >> /Length 5585 >> stream xœí];’Ü8Åe]Yru‚6Æ¢£ˆµû±ÑŽŒ½ƒt9´dô äŽ5îœd#¶X$€ÌDÄŸ@U>©ë¢Px|`ÈX¨‡ÃêïÐáßï*‹³ý~Ý(ýþâý÷¡nŽ÷ÿwV£Ÿ7J·g?éÛ9 ½á}¼ì* ŒÑY´J/ñoc¢Uºº.µA•^{µ›†8˜h•~mùøt01*ùlù`6üÖ¶¾xjôÉQ‰·#—Y<¯­öÕhkhŽJI%7Æ­Gõ|ï^#|íÿP»*1*±%¿…4…ï\5z…ØÞ|¨|•^7>¯­9ª„(mµÉWi'ÓœRšJ·Ú䫹 ð–tÿpi¦‰¦7ÕŽ*J¯GÜÈì?`š“’È©ŽJtñÃ)™VŒTúõPäË¡£Ð¹$§©ôJêûÃQ‰¶;"ë²i6ÇaR9™sùŠÎIªJ®~•h«Ò"ÙlP ävTÂ2'ªD þáQ‰¶1–’~°o’8Y•î5!\ã-!å¨dì'1%Ƶx|1µè—”¹P~¼b«L8È‘7Úè×/õBÏÑC/ˆJ N}•©GP‰IwUúÍ{¾Þ߯ñ`Ýjî9â«‘UéÇÇËÆí6P`ñâIoïûl*mÌþP_ïÙ÷‘ý¹cn¯ÿ{u…Šñ¯ÝùéNiÓkzJß¾ÿ½ywJ›¸©ô×Õ•*Â/õX¼G „û%Qi< ¯Òç¤Ü[͇W)‰Ò·?Õ*Å׿—Ò”W)‡’¨Ô¢’•®ÀAiÙÖ“¼s©´lt–R­UZÎÏj ¥ãÑ‹¶*ÝOèÙY¢tÚÚàö´'íx¯Z«uVcàPÚÎ÷§«¸€“ª¿›$[¨KiåŸUc•,%ç„’s Nr&¥û®*š¨R\ö4Jö³TÒ= ¤¤lÒiãX¼(JMUÚ[—«’ΤÇPB-Õ6<Æ<4µxðd²”ìÕ¤´=O)ÔbxÓ~ žTÓðàyŽ3Qè5zØžou”ÐyÖÇ}ÅÈH\Í3‚¨tD%5…JßrÏ¡R £9TJÇð*¥CTšÏ£RZ jìRxTš’Ò=`Pi¾Æ·*ÍMIT¢Ò ÈP xjqz¢/úøPq\A6:¡éj÷£»y3TòE­r)9ñ–vI†œ™9*yâ+Ù”hy~JÈÏiÝÈ~J)*!ÿæþ ¼sëýkAˆå¨ o­ ú¥K¶™QœÆ©~4¥•êD=hàTê¸fÂ[\¼ÆÍÄQò¹œsTR \•Ö·½¬è›¸7î1®¢\8‚P2U¨¬Œ¯(s…w¡T[%s‘‚ø ªqJµ¯%ç{s-%RbËc)‘œ1”Rû%×< +›ÉfjŠ®|&^ƒ A_Ú¦_º?Sl,µ­¯±~Èί e#~™—½RÒÑC-•bÀ|S|ÖQéìËOÂyyȤTI¥“5yàW"[e¾4*D¥pªRRXg„Uš‘QX¥™ñ<‘‹™!*ÍQiˆJ3@Tš¢Ò •f€¨4D¥ *ÍQiˆJ3@Tš¢Ò •f€¨4D¥ *ÍQiˆJ3@TšO¥Ú‡:I¿JÒ±cÕ]S ïjgnÉ­³¿‹[í›·ž9¤Ò_6“¦ä­/^ÎfqÓv…~>%ŸJI”|ûU<©4¿gÓA’U›I`CƒËïé,°Jߥ´èUúLJàž,¦¬HJI*éºèÓj6…ØV[âaJ`÷‰)mìrËŠ¤”v-]#öt[RîÎgKÌžY•Éâˈm™é×’=ŸŽ…Ó’0”ÔNa{O\•ðñLJY*)n×Íâ¥Ä3›ÉiÇ=U:¾2$U€Rb¿„¿_Sý’©Æ©ypöuÑ­žNY‘”|*µâ¨_ÒÍ_Kö½½NFüþh­³½¬ºG!-+’’G%¸úý´«õ"®q(½–"Ë |MÍMZUú%¾`ÿ°•Ï^m“V|YO5_š¢Ò •f€¨4âëw›Ï2J„µÓð³ðZÒ–~Å*ÅqJqN¯p#h„Ìk)¶¨Î”Jú%¾¼À°µN½_O5_š¢Ò •fÀS©ô fûóšÚeÁ¯¤ôvè†ýAè&Ò:þٹ¿,;‰¤„TúÎô?ÝA¹fTŠæ¦áïu¼H¤¤Žq‹(ùT:§Dg/g”˜-ä'rÜL*ä "\Ⱥ#'7\md)e­!‚®B x†¼”ô܈wûÀ –»\9Žè’„²Õ)\mÁüÎ=”¸8Q‰dçr›ó˜©R,%» |»’2™J`5‘þf”[[ZÜðZ¨| ”h{à SIgm_ U´ËŒ·xæÈa+V°B‡±x%›fa)­ŠT! k€÷¦']QJЄóÑËŸæö˜‡¼5DÔˆoô0þ.O€w‘|`Ý‘ùƒ¹áj#-ÀŒkˆ‚˜n Ñ9æ[CtЧš/M QiˆJ3@Tšr·(ä±B#‡(§ž—ÎP$s¨•ï!"Cl;¹€¥dæ?ÔÑU@©Ì‡^žÔÂ¥Þ9%ôS þR³óýKŒÓk±þ.诵S_rÌ·áÎO)Ñ÷àÎ#ImO^xjj©ØÉ¡÷ï,ö¬²¯¥%D Z¿J梠?Á÷|Ò$s|Û«SJ!§——’ò¬F±ßhÞ„)%úñˆЧtz(yÕQ1Jé~³ /N¥©(Eª´(ßB ÷¶Û$OÒ•Ì}OP¤Ò˜ÓÀ$²(ÙYƒR¬J±”°g2›Rj©¤kmWù€³=É÷ÃÜ9½aƒø.òk®¦’¡—0”lÍ"VöÈ%Sʸ–ˆsÇ«<Ì8ƒìÇøƒm°ÚµT•’{§íbJ«%]¨’âwÏNîa/%ÿAŸ=¥”Ó/ñ»çvJ¦_r)¹€1€R®yHPÉZUmû#®ìèA_*Î9kÄuöÅÞJ5n•gÄT"0IÞÿá‚2j¨ä©EbuØU“R¬JÞ(yz@’kPýUúžó…íñOJSQŠTI …UÇóFÁ÷±`ÊA‘J«‰ ësdKªàþƒ9)Ÿ0(Si±Uæê„^¦U0“Άr•àÕ?2¢<”`ŸzÈ»’þVÙ>x]Ì'õÁ|Jé*JJïxgüÓŸòÍŒv¶´Ô|Jé*™‚׆Òýq±áÅ…Ó…O-5ŸRƵ¢¤_jnz¶Žh¢c”’>)ù”*«´æY9êTŠE=‹wŒ›S(1 N¿×E€RË(e¨d¦ópa–lXÞAóà”šO)«_Òç×cÄwNöú q¥iÙ¼…FW¸}ËõeæPªt-Ùec÷e ¢ÚÆ•M©šÅ[lx÷a\ ÆHX€}Î¥T±_Bw\ÅÛ¶À¯¸…))ô±´0â•ÇxÙu©„#ñ(‰J£#N¥²EÜMñÆT6F¥2'[K|ã)E¨ôö­O Ó‘¯Ò ”ÞŠTúÞ§’IøÇ×ðâTšŠR¤Jzº€`æöÖæn&“Ù(¥*y*´z(1ÙûQŠU)D‰0SSJP 8 4JÉÞ3á8v¬Ó]UÉr()}ø˜O¬š= =(%©dþàÛƒ<)éãcª”G ¶Ã.”ꨤ#CI7ÄÑUN)Áô.”òTr(#¬Ió©’Ó#h—©4¥H•øè²IÁx˜uêÕrõ•ªä« ‰‚¯ ¥9¥X•"(ET¶¦3¶†JvÿPJ:‰? 0ô>¦Xmn•¼&‚R‚J‹3Æq4¹q&/Cg¨.¥$•ÌŸó€bNx|–R—RŠJJº^¥ƒ+OIŸˆº”*©ä¥„ƒ¯ŒJÙ¸L¥¥Û"ÊÍym•8ó`«~b ¥6æ!W%Έ›>#®4-œ¯2¥¼Ñ¡àAÍŽÕEåÑÃДbUÂ-ÄvGþZç_%q(U©iåò ó%”Ë;_‚‰¾6Ñü2/¹Fó%Ó“ú–ëÆT·6¥²ùï0™® ”7_"+²@¥ÌÅÄh`Úê/¤¥²ù’C‰[Xß ©F©`$®•ÐüÈŽ¹Ý±.(áJ•jSÒÞóÇQ‰,é­F©l¾äX¼$J¤Z”´J__>^ÒçKN¿„hJ$ÍWH-JZ¥¯·÷/Ñ*¹öWà£Nƒ…ØUõ(©÷Û‹íZº=½g®@@¥Û‹OwJ¿óGW p-}Ù)%Í—v§KÍ!ó%”k6J¢Ò@•P®Ù(Å©4æê÷•ÆdT RŸúå W¥Ï}ª—…L•¦ÂÓî_š ¢Ò •f€¨4X•Ýø W¥Ù¹*ý¼ºFå *½_]Ÿ*@*}ùýÿ¬J^|¼‡Ž^“i•B_€p´J/Þê}‹Œôï¬F›JïÁ“ò®ÂÇûã¤F7J‡ÿ*ðìendstream endobj 367 0 obj 68 endobj 370 0 obj << /Length 2451 /Filter /FlateDecode >> stream xÚ­Ùnä¸ñ}¾ÂÈ˨K/ÉÓìd3Ø`‚}X‹Åì %¹[µÔ+©íø%ßž:Hªyì “*‹uW‘-nRø7ez“+•”:Ïoªý»ÔÿùN¸Y ñ)ÊwwïþøW#nDš”i)nîΈÜÕ_¢;{؈hn6±ˆÆM¬”ŠÔŸ6±Ö:ú¡ßÈ–F[ÍíÐobY䩉´Ü|½ûÛ»ïïÂÁFÊ×XC”ÞôoY¡¡´aÞ†XF<îR“'YšJ Ž˜w»vžó4ºG.£aþ÷ƤidPÛo IDGø:ðŠeH5tpAªÌ£̤&ÔLãŸvm…JÙñgGj›ÙQ~ÆÅáÈ«¼“qª™aó®¹:qxXÖ@T)*&eUÇÙ'2l6S×t»#Hâtt¦ÏØ+)Ö&É…VDîÃÆˆ¨®ßªT<éZ©µ5œ_ŠF=2OÈPù_1ôPÑÜüïüÔ^IHαEêÆÅ ÐîãØœ+Ñi–Þij$^~Ú O@À”Ñg 0Oßâþ̘Nˆ”=5?"½ð(•žx”,KçQ ¯ØõÏÛ‚ÓÚ~Û0ˆE‡ÉÁùq;£Ã ½;½ŽñXoH2˜—踴V_nkÛóhyøÎm:»æ½5l”üý,çžÃÉ&àóBEß[OˆtêÒ AmáXcX\xâ8(Ps«ÝÐoÝ1ÏD£¯1b…ÐQÄÖ鈠žìäÝâp`s°†kÆšÆâš ó’7ˊĨXij‡ ™Œr–'…Ú=顈~¤]Ó3Âbsø¨ºö÷#›HMÃý¸| Œãl¸â¾RÈDJíBˆÝVæn›¥ ŠÊÝŽk/Åó>5õùØ6O Ùr¶t^‚Z}2Q9dû3í´½·Á.Ïø•IQfîð?¬†U’e‡qâ°JSS£²ç5 KZˆoQ†©P…r({–¨nn¶”QMqÐbÐmñ4½âZ]J|T¤4ÙbEFOÒÑejGìsŸAÈ=Οy¾ºšë+ºe 4§çŒãn `¡ã9¡PåIåŠI£!ÏÿðŽÍX;`Íe§û 8Dj14áe<ò‘ÂdëÎuÉÏÝlj$—ÏtN.H¶›xûÎV>q;‘Z‹1¢KAœg`8Ö¢ ž`"ë#É`¿¦BãØÎMçpêvš-ëü ¹lÇ«O;;ól‰ÅªÜè¨rÒ‚dë…ETÏW6Î)Io™ÂI2z_s.¥û¸„¼©˜±{ôxx9ìË4Ñi–…½‚0ýì kÌzô‹$+Í‹Á§Ú­¥ 3J8Ž¡jdz¥<(ç‡àìä$à ÷¡æ¨ÕÜÅÂHˆY‘+1ó 5÷'ã›_aÎ0ÍNÝÎK—0.…ÄÛð}³°4¡Ýùzb~{w3ôÿ§Þ¦¥£÷íÄ:œ—|@H‘@ú÷GPÆw9ã’­“jŸù¤Dn¥‚‹Æ2Í!KHç¦LÒ4çFh©~ËÓûiØT*á=ëÔ[ƒà„þï+†¬é ® YéÙ»]#ŸÒ­¿Cž‘!Û­:9Ô‚<+u +¨À˜ÊÖ hžñ6B‡ö‚ ÑVÂpúÀI]Ø<«š]1:ºò FŸx%ä\eÌaàl™]´—%çh‘ %ºÒçpœî¹½¡ÌVpŸ£Ïшa]ÄÎN=W_¹µ:® ^i3O$j3—‹6Ý£Ä#NN2—=|ål„¯__kp›êR]Ð *ùšRÞkÂ\|“RËrIŒÉ‹Ô‰?œ¢¬ÿ0ÎTˆ× Tažòü %2d$¦t@îðƒ+ËzMU®7p’> endobj 372 0 obj << /Type /Annot /Border [0 0 0] /Rect [107.1877 215.9813 284.9677 226.8903] /Subtype /Link /A << /S /GoTo /D (Appearances) >> >> endobj 373 0 obj << /Type /Annot /Border [0 0 0] /Rect [311.6422 215.9813 498.5132 226.8903] /Subtype /Link /A << /S /GoTo /D (merge-baseap) >> >> endobj 374 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 202.8306 257.9092 213.7396] /Subtype /Link /A << /S /GoTo /D (merge-ap) >> >> endobj 371 0 obj << /D [369 0 R /XYZ 90 720 null] >> endobj 243 0 obj << /D [369 0 R /XYZ 90 150.9964 null] >> endobj 368 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 381 0 obj << /Length 1805 /Filter /FlateDecode >> stream xÚXmœ6þ~¿b?²j–ØÆÆÐIš(UÛ´ÊJ­Ô´’oá¶Àfsÿ¾óbÃråÒè¤ÃŒíyŸy†•r“‹M’8×ÖnÇáÉŸn¤_íàÄîúÈ‹ýÍó×Fn¤ˆs‘ËÍþnÁd_ü½¬Üi+£±ÜîdÔowI’DÉ÷ÛÖ:zÛnU[½;Œu×nw*³ÂD:Ùþµÿñæ‡ý$Ø(õ„jÿÌÊéDmv‰1±Õ)zþö(ÍæUwóÛ|ýŸRhØÖ›Dgq*›ñº¾?ƒ}‰è(‰á%#3L´¯àÅo¼tG4L˜ðëVå‘kË&F£@‹Lã<Ë2bûöŒÎÁU‰‹<ên·;c¢åØ1Á5Àü3úÉêÁoðãàŽÞµ2rÏ@¦H)òÀ6½°-Uq–gè h‹Ên \ü……3´‰IþäZ6UF +î>™á0zÅÆÊ¼y@:è×»<ÒÜÀ•­¶7}¶S*‰“,ÙÉ$–FpHЉN"T©yíð¡&Á Ç@¤žvLžÇZ¤Ù·û%E¢äª_PƒG~AÝÂÍ5³LÆ™µ©gv8÷}àÆâšRkM!«b!rëy ¿­‚Ì,Y6ð¤ìùíï­br“w]ým7©8Q©Zúº´‚âÓQw‡Ï„CŒ„KÝ!”|ag¯|éÀšøtXeqd*…’Joèz&Õ|J=ªÑï\¹Ô³äËVÙˆÊ϶LdæƒÛ—ÄÖ»+ìÁ¬ýšøaªä+o´”‚6a‰VS*ÂSËß¿%?‰ï*“¦ÑɶŒó€fe^%¸ñ@qf!çø˜Ù°þ„'Ê()p@çú‚/U‡Á'S(!aãŽ,²zÁÄ·bö°5ÞöÈJÝL^H¿½¡X“ëõ‘6ºTÞµ‘¾Qà‚˜ƒ´†“”©°E»ãÇÇ+–žT&2=¬Äl>qä¥+ í„Ö<03lQ¬Fvôœ§*xÆ%Ì\äȹ%ÓÈ sTUߨóy8)¿œôiUA h¥\# 'òXLu†U0ߣí!…$#BQblNÊí·Yùö{èK7ú=yóÂ{SBûv_ð>aÑÒ¿"ÎW‡¹ ¦vMy›Tç>3>ûäQ×gÀ©Ê*⻵ôÊâÜZãOŒìƱ擦ÒÑ5UGÊiJ($²KË¢ÖTéØÈ,ÅkŸ¬+š(C? Mý8·ó3 €m½ à°. ë.`Í"‰~v(³] mZ¬×–ŒâUáÊNéð¾nï›r—^œ Çz ¬ 46N…x„ ¿týÑ5§Ð¼ÀÃ:K£{Ò¢;Rz×%d’6)&”¤fªà-×?1¾€@%ìÝùM+w·^Oì;%þ+V1RÆF‰€‘0½¥Yþ„nEOµô¡>„‹¶ü2zPLòXj‘-?MÕ:†yQ+ê¢ÐÓ±uà›Ã‡Žªí.…èõÊ –èpüÊÐU‘]ñd5(¡5SÎåÇVU4iØÚ+D´ÑmÍ€i=¦žGw†Cèx¥,èà©þR6„ãR¡8h^¹2¼€C×0Û™ÃÐ5gT€Géß+æ ˜KCwK[†§”`?y£¡ ¡&>ËÖqíà‰‚§(£¦¹ÊöB‚Š0ºá5`jj²<¤›=ð ¸/<„”ÁO\åR Vèxð ’ êí¬™µš’3Œ¦\.ä!¼Ü—#/Î8üÈŒ$좋8‰ï±®’4ÁBÃ覒BÊšùö¾Ï¢ ª¬ »¥2]?Ö˜Ý~°0š‰ŒÞoƒÁ«a´_ £²’¿áyâaGŠ©ˆ$É¢;>ô&{Ýå™—‡îxª´NY1÷"tA`ñ/ .áùŽe—훟žñ-Ú¥y[ª5ûN˜€®nwð¤>=a`êÙ³ŽX3æté”9½ªÑï_ƒ(áÁ“1L¥0ºÔ«€‰ö|!¢îºÅ¨4‹8FƒßæÉ¯e!“pCi¦a¨i Ñ{©ç-‡/Ó4P>#ðÇïÂé*l-«)øu…ÏþQåª 3²ôCÆD¢  XM-´û\‚p‰ß{0»uíõðI™Ó L}‘ÆN}5 –U‚Îx †-øÎßxøÆ_\œžTHp\¸]еŸ£ïEí+è—\„އ"ú‡¹qãCÿ*K‘} endstream endobj 380 0 obj << /Type /Page /Contents 381 0 R /Resources 379 0 R /MediaBox [0 0 612 792] /Parent 375 0 R >> endobj 382 0 obj << /D [380 0 R /XYZ 90 720 null] >> endobj 383 0 obj << /D [380 0 R /XYZ 90 684.1345 null] >> endobj 379 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F55 27 0 R /F67 89 0 R /F52 12 0 R >> /XObject << /Im15 363 0 R >> /ProcSet [ /PDF /Text ] >> endobj 386 0 obj << /Length 2993 /Filter /FlateDecode >> stream xÚ•ZIܸ¾ûWôÍ,À¥h_’Ûxx0°q#‡d€-±ª4VI‰åvÏ!¿=o#%Ùj»ÜùH>¾å{KMtÂÑMÞITiQÜÔçg¡L|Éhû%ÉO·Ïþò&‹n¢0¨Â*º¹=¬¹mþ¥^žôe)kvûH»}’$*ùënŸ¦©zÛïâ–F]Ûvèwû¸,ÂL¥éîß·¿<{}ë/Îâø{¬!É÷x‹Ò"ÈÃ0¾ÉË4ˆ’4#í€Ü$jBOÀë€\Ý3‹š×j\ºaäÏ©¬PÔõuÔÖt¼¦q÷§]–+Ývú®RÔøB¤°§y®i§ ’À®B=ìÊT½€…"R?3 Üs¦[#õÀD¤Î¸¤q'Ü Ò‚§¦Ë§‚¢¢$ˆ²µÐ´ödÆI(WBIâ ªªv !ÞžFð^`‡eJQɦ…ïþq¨P§ígÓñW¢™x< Ä›±í™ø—é;Ø0¶Çiܽm”ë`}ã¢TƒB?"¹ù’›F!F||ÍÍÞñ¿~¯™ÚÑ4hnNÝÕÝú§+¸”—íI[KcRÈ'¾^eRÌå2òÌÀÚF2oà1I‡ŒFó¨Ü±ôçŽÄj¬5r9Ée¤ã>·^Á‡`7øÒ/TJf›'žiòHüX3KË^€yL– sSÛ;Ù±P*¹á/ä¸P&ØíË$V¯£„^ žËÏ'ûwüàsñ£&Rhžªé¢q©£ÝxÍh&ÏîUÀ Ïé‘q^¨£n{Õì…8B§¡»ÒÙC ©Äê–8@¢vêŸ[’»Ü£^ÉG„¢á«[<üÕ¼@Ý µ (Ìãɹ+…3c/Žð-·ËéU¯Èí6½. â(LÅë'BªŽxølPÏvþ©2qQ"q…˜‘°E'äcWËãŽ_%äRøEì V! Ó4²½=“¡Ã¦`ëmû*Ê^¶ª ˆóˆXÿ0ì=Ùê¸Ëbd2ÉJõá¤q®!Iáè¸%„Làxe ¬º¤ÈÅäû¿]†J<[5F²"-ÔýÉ ÈúzV‘©Ÿ "h!Š'4Û²“Lyì×C9ºKw^n&³ô[Ð i+€FL¬Í;—G¡‹E)Á]|ÀË®‘(!xÀeË‹ÃÎØyÎm'ÇÆÝµ˜ìñäNff!œaA·¸Î7õü÷5ÚJݵÑ2Zûýí´å¥Œb{!Ô0Ù4šÑ¢YRPò8ç$mWÐGôúÊò$f &í.+uÐ@$z`Vaº@‹C.óÑè¹|,ÙD[ —=Ãî¡K.$ɱµ~1«™ý[> ^½t›tš¨ð¢N@lÓI£HhA‘€0XA)YÐÄ u¢˜"M@³¡ÆùØÆÇao²@MêOX£‘€ýè!±¶(4E/ñ‹¤òٌ߫#ø€VpbÃåo•4ddÀz#Ë‹ÝI3Ma¡Œä€ ÷èÖ¯ùGÃþ¥G’<·1i†Â$zÑOºþx4‚ó¯Ð 2E„"oÇk¹ênd°"¼ì" €8+œáŒŠ‘‡Ó)ú »Zɸˆö%¼óFN& uÄI¬$.¯Z—¸Ü±9Ãi(”»Á†ê={ j‚þÊ1ÎpÏÞ¿ôs1‘{RGÃ}ºR~ûû.ÎÔû_^¿¼…íoß¿ûQ-”lSœ"ÝÏ,ÑÑ á,@Ž—v' íGžpÉ×l“´¹ò5®Dø9ŸïðMc`L‰9¤ G „10{a¦÷Y¦þ`Ôãôï:prö=¯¬5§Ô£~º¼ßtM©s¥èÉ8·d^IQe’‰°°ÓeyÏmOù”C×'«ûZ¾8¤D ‘ÃØQ¤ ’ØàG«zÈihoHdÝ‘½!^a¼R2ì`ç. ZRþ0(Š*Y ì@¶~”:Í@BZ{p*KXÁÀ'§&˜IR rQ½u¬Ë©önkÊníLd.Š&Dtè•$PÝ­Íéé |³+÷ ”Ä5!øåŸ ã8Yé/Æ,Ç;©Ñ'¼Jrwd^›1\))®-C&UK18rce"* ü¡ä›¶øès¡â+œ÷údòGNd Ù O@# AÂNø!Zh½s(P‰iX,”ˆ_^‰ø¡ù˜ÁÔÎÚÃiÖm_©Ž·Š·ã˜¬>ÌÕQÀÃeè÷8?·®]3³Q¸‹:=Í㾯û7L&Mƒ8×ÎÎŽÉ÷7Œ%-‚"ôe‡+ŒÍ¶UFidi}a–q®Þã?ÿø‚¯Ðj÷VÊz¯Mϰö\¨  J I >"àï'| ÉöžÚ±:=ùrÆHxǦéo³®á•0Z×FhÚE²Â)=6žÞö®¹Aæ2î·´3] ¬]VkIš©3ûH³ì5¤9çµ€1„èiÊÚM%|PýM«2ëw=§\Í!R¿P"œ&ø(ˆ6/'—ø> )bÒlJSˆ Þzuû§OÓ+ÉÊÎV³î¨-"\t1ãyöà£Zõ¸§ùrµQü2nskñB÷B¹öêí¯9ãBe]jT‚svŸdqVy%6üRŸ¥ÑäæW‚ùç@‰æy³Èƒ¼¨"9È1þˆ·•esTû"Ð59xÇY쯅*Óá‘OO¢kÓB˜ *ð»ãs`œ“fpN ÕôÍB¾¸ …½¾¼#wÑœ#еñk‚ú?œL;e9uO¼ø^ØqÓ)²éñM›{©½X4Yašø÷H“‰>ö­/X7qÆùéuòæ_s—Auƒó­R n8»°f».ìÇÅl |—ú~'pܧQÍž@áû))8úÜÄÃßÃ,ô§4—¾8Íçf¬ÜnŠsý#!†äÕ„NË-V¾)Ó5’™/9Òü¡`e=l5Hf|‰K®Fè/ˆTó‡OeÐþÐH1épOAJ,¦qÖù=Žœ|J ÎtMëhµ¯›åV±ÑRª <¢v¦.`‰l}}®w#ä¥sw 2qØ4݃©íÄ}N±P¯ ¥Õ®ʶçéW`¶¿ÓÞF‘ÎR8è'ß®"a7òo ΧD!Ã$=Î\Á¢ææ3S¹;Ž«þÄfQ 0Gspˆ³øJ,5kQ‘EJ†‰Ÿ n}¤ª(Èv˜µ[p™ç¥Û<}žë iá¢ò·Ás¨*TÊ3 Áh1ó´„Dü]Fêo{eY±qbQgÑ$“Šº^àÔß©Â9UÜõ[ÞV… œtd†¼Óð€LÍÁ%A%-ºwvÀí%9¥9º‡/%šä£™š‡ñ+¥&1ØÉ³íyLjî.O¶ë²$WoÚÞñ -ê‚kÅ$OÔ»=îxÅ»·Jdþ݃–}à¤3â9pˆkN[€Âí1(5¸À‚£öP^@Y§}G @ÄÆŽ"ýC‹ì+ÁõÇ„è½ö°r¿&Á8Ù¿âÝ—ÇÞY°›1²ËÕ_¹Ú@ý§cÛ?½ªü• z,^¢n†Éüh?l®’6k\*~NZéW*ø+=Lr’F‹®¥€³óï2R‘/Q¿ ,}kÇ ýŠA‘µ§²/Sï¾þQ”ñÍÿ¹†x¾ÙÙþ“쑚–þ§­Ñ{3€…îŽt0æ™9E…£±‹YÞÃì$‚_÷'#äðï£1ÂŽ0!#v±dxl>s³Úv!ËG~!œ®ãaîmSØdž®5ÞNáª$Ç z¥Ëø")me™crɉüuðçcó@ð‹¨¹OB.b®FŽv°¨­ “\8Jr/¿ƒ!G’7þWIº)¿oSùé8‰g³J HíVœá_Z9ÈQÅg â|QhÄò,rgI4­£Æ LŒó9„4t… ÜøM×çŸi˜%​0ü_ þâ"W_ endstream endobj 385 0 obj << /Type /Page /Contents 386 0 R /Resources 384 0 R /MediaBox [0 0 612 792] /Parent 375 0 R >> endobj 387 0 obj << /D [385 0 R /XYZ 90 720 null] >> endobj 384 0 obj << /Font << /F51 9 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 388 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/save.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 389 0 R /BBox [0.00000000 0.00000000 178.00000000 262.00000000] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 390 0 R >>/XObject << /R8 391 0 R >>>> /Length 392 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`hna g6232Õ3SÐ5Ð3¶´01¶PÐ5Ò3·4³4…h°PpÉç Bž¼uendstream endobj 389 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150408) /ModDate (D:20070503150408) /Title (noname.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 390 0 obj << /Type /ExtGState /OPM 1 >> endobj 391 0 obj << /Subtype /Image /ColorSpace /DeviceGray /Width 371 /Height 547 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 371 >> /Length 6057 >> stream xœí;’Ü8E1˜=ŒÛVËì(BcÑ鈱kå”SÆìa´9´Zµ™’Õë™äÀÃÿCðdÞ›Re&Á$ožAüøqëâïXò7¦@n£·Ç#¦/‹ç?þ>>– DÒñpL#©B,ž¯/BZ6ЃÛkÁ4fÙÇ·•óØo°¼PqË>>ïœ|ƃ㱚.9ïÌs<„XðVœ¿0ýðžZÞŠóoÑ"#ÔB¿íx+ÎCEFñG©3/çþ“-Ê-! ¯ÎK6­ë—až ¿.Ë¿åq¾o€êe߯“ËãŒLY¿ŒjÑú¦žó—ÅäÜðüáW=ç›Ûð¼ó5s©åüEç+K&ó•| Ûû§çÚÙÍæ¯Êóõ<…Zqn_Œ~õ~›ê_eþþtù¼vÆürþb:öòÕÿmn¦ïå—õ_ˆgÊ[ˆ3/æ¼sËóåÛñåZ/†×$‹y&Î ÏK9··ûÕâüEeå:+yy¶œ|å|ùS˹ãºÍ9-¤è"‹´ÿ¹|'Îzór‹Îµ«éyóÉJŠœåsHб|mçÎÙ•äÜ\Î[(Á¹å:8o çžå.ç?ü.ÞÞºwQôræñeø—kο.ý.>¾=.9½úX %hÎÿ\WCÿý½vÙý¶õ…þñ!þÓ9ž'Ðô÷ÒuEü¶z¾ä?ðütMK¢Ýó%cççk²Ê-àü|MVùœŸ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pÎ/pί8çÓö4O³xüƒÚ(ι4zó¶·Q‚󙾄çmTÀù#£™·ìfyz¼ÅWP§<ÎuÞ²8-ÿCuJp¾þ©ç‹ÕÈg©œóEðüˆJË-d T©bÎáùas.Ï¡ð¼Z%œï†ïeÅÁÞD¨oáêùÎùÎùÎùÎùÎùåü¯naÝNÿ&¯£œÃóVzýEÞ$8ÿ·ýa¨F¿ Óó(çð¼‰lÏÁùùçüçüçüçüªâ<ÜD!;äi_1¸þá¦iÈö”*ÎÏóÜühÏ·ÇÁÍ4V ç‘c(ËÓ‚m|¶ æb¸þN5œËNDÓ¼ÑÖunÚºìÒ®ur™ZA®-äïA}hM3:äyÒ­Îz“¹9!»Úÿ7â|÷\˜ }äû¿ggÅŒ Yë[‹,Ïo’Ÿ“£Ùû)êcóõ©3úÖY W花 ‘47ÉNPœ^è®iÏמvÏ4ýšìÇûY3›žÞ”êçBè.EIÏU~á[‘¤¯­JŠsõòJž§97 ÆaËßv0K°3`žáM™žïçÍQ-¯à\ÓMŠ)æ"_ýCpOv±s¨?®gç-úç24浜«B é:·-2òµ¾Y×Ñý§IYpÖ¦ Yþ —ÏÍ"æ•öb/†5¯RçÖ+zǽ”XxË3's.ïÆ² }¸ºPÎ/ÔŸó œó œó œó«ˆóWîèîª|Îay+es"ô?ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8çWÆüç²_hÞö˜»¦\q†öŒù'î è,f÷Üè} å̯9˜îÇIèK®²æ•êɰ¬íÙÝêQ{º 眻®VÖ<¢“:å?¥ÅÑ;ÙkÁ¹ëjq.—èÌ“Œ’pŸ9PsDZíºZ%œË,…Ìîõ|_¥CÞºëjUqn¤ø9ß×:ýÈ-Ï9w]­Ür‹×s=63à9{~ιëj”ÏÕ›Ð9ÔZ…sh@ס“be ­ÒÅGwhÊŠ^¡¾…_¨Wä8ç8ç8çW„ó!f(^×üå.Ú4D„>E£Žq>­ó)ÿå.Ú4B„>Å£ŽsÞ}×6öé/ñiyóåûúWPÏ»GèS"ê8ç݈FÿE¼oO—òÜõ…8¿“çqÎ'f#úGÔòÙŒp<%¢NrÏË•ö¼!çsÓoÈð| Z½ ꆊ\=EL"ê¶œwòÜlFq^Û:½¢7íy;ÎÛZnx¾Ç¬_éöÜuN¹EM~6{æ'›åôeSoÏi¿}Ê5Ú7Dдs«×Óž§87Û…œøX<ïré«??Ÿes‰9ƒ ͻّQçäç³Aó¼w&ڟ픆¢ž«à=žoÇaÌŽiùª›uÝ´”ˆ:'?x¾}|_tæVYQ*PV$msÆÌ»v7WNÏQä\½<ÙscN“$ç‚ö!3p²sîúçºòúhn¹ßówO~îñ’æ3xþ^˜ŸÏ"·ÐIW%æ-7<ÿ%cJxnŸ'}SÕóyî:§^ÑôUY«:\ôöœ–\R¬ÌÏ­þÂx~…ú–¸ç£é(çð¼\àœ_ ò󎺫çWh'º›ç༵À9¿À9¿X9o~¥‘íyxÏ꺟Ž{¡­¢y]:+çÃzn]zÚ/ÇÍÉyû êFžGŒíãyº^QˆìI6V‘çÖ¨:©VÔ5.ò0Æäܺ–oמnÜ¥n&:ùc@Î…Qå<é ÷g;¥­Š<Ÿ­gÙ *fÏ*:›Ρév¿çkô=Šç{`ž¼ÅŒÙøcÔ9b@ÏI¡Äh½°cîèy-ç*þo$™ã¹“§ÐÂ7ÍDò<ÅyÑ${_äyè*T\ô:0ç“°|uN>½=÷•ͲâzœVë\ßs(ê[Z õŠüçü:Ú_±¯.îyežº¶çµýûꮞƒóÖçübå\]o(ûšH¨-‚ö6×½Ïu,ª®ë´á-¬œËãdö\íÕ¨ÞÒVc­õÎ'ç²jƒ›s³~\î›Ô¤L£yžWß’Ý6'k!…˜‡ñ|¯üTË»{žU¯˜Ý6'kÂèÏùxô9y‹Qƒo`0žçGê϶¹ÆU¤çÐÙ|åzNÂ,­^õü<àù÷4[+ð{îrN+Í·W¦çWæ\ÛómáÌï¹á¥* šµç3=†ótçÊs§m® ç¦ç&çêFñ<«‹/oñµÍÉ#æ?‡Z¿½ýyRås]ZÀó¼~\Žçþ¶¹ýP{•·ÅäÁ¼5ÏE÷¸m.Ô·ð뮞ƒóÖçüçüçüçüçüêÐNÔb¥]wm›ã7×ÞóÝÝ µÍ]~Üœ§ŽKWµ¨:®¡±ÈZA´¹Òö\8˜çì¶9zrm'†öPÚ6G ²¾²­ó=79WG`{~Žõoñå-¾¶9Z¼™=÷zÏ¡'yNy Gàðr’Zõãr<´Í©ahÆ[+?7·ô|[<~Ûê[Z õŠüçüçüçüçüçüçübn'ʹ³։]¶ñüü+OSÌí¡ã{Îà>ó¸¹:σjæyÞî‰yÜÜž*«ó¬•Å^_=©Vz]‡ã/(Ïó=¡*ÕèÁs«Âvß—?oÃó¶ãæ¬Æ wåöž«–ògßÙêÍÑ·…FÍ4nŽxnc/DÒsÇü6 kŸòèLÏ/“Ÿ—Îi©~âúti5ƱžCouÏ›Ž›sþØeE²°¨¬¹Oî£Ü˜SV$†ë.-çª[}‹?³(Tb7Ô·šDKÏÑ_ÖóS8oT¾«çW¨?¿›çW¨?¿›ç༵À9¿À9¿l'*P–çÆ>ÝK+]Û¢®ÿOÖ€í¡*öÜs%6¢çW7w7Ï›Ž›#5'Þ ”¶ÑKÏ÷ö@Y“"ÍöM¡Ôzúé q›3šçW'åyNÛ±œÖ[šëµŠ¯*êÆÍÑŸ0˵?­·÷9QÏzû&ñUEÝ|Ü\wÏõ.' ÊóÖãæúzN-7jχò¼õ¸¹–ÇTì9Ù!‰g8Ï›ßo®×9”šHOöVóßçÐÖ÷›ëWVÂèÔ±5ÙÍÚóqÊŠOZßrN¶² õŠuõœ·8ç8ç8ç8ç8çW‡v¢†Ww5žG $vb¼ôRy­ÊßÚ²Ö×suu](æqs¢mÁ÷®žŸ1n®Õð´<ÏÍ Zå3ÓœaÚg0¢}¥­÷²qOÈ!vUÇÁ=nÎüŽª´mΣ>R{üAà¿ GÛ…s­?µÍµ:–´ûÛõåö©Å Üÿì¬Ù)?x¾¦…Úæ8󖣞ëñ¬9çÆQÒ¡Îƹ¬ž·7çC½jÚæynüéÇyqÛÜ@çPÃó¼s¨õñœ—·Í±çç±²"ÝX^YÑúx§ü¼£P߯»z~sΧý¹ÍC–À9¿žžóçüçüçübn'ªŠ1ÜÖ´Í¢´(r4ñF;æöКU#—{-=/"üÄê¨ãæžÛóÆãæ‚©jjjÉI­ªžiØ67ÑuBýµuÔBOÈIVÊk´ã7N•;ÔUe¤öç¹ms³S·h¯cŽpWʬpä7H¥Ç%DSÏgåi²þ\ º¶ÜX…Ä%ŒA0™ëüãæ©zf=i–ç¯tá¡v"–ïDÊs½R¡ç¨O¹ßœ7•½0~%ž¿Gï •ôœŒ¥ÂÝk˜sAŠ=7£>å~s¾TûØ ó–ý·©_‘­< ê¹›õYq¹™J½ç¨O7çOµ]RGN´Õžg¶Íé=¦Î¡¾'{»‡nΛJö¨§–ÜZÇr<ßNBê…áyfÛœÌÏåm’ÃeE×ÙnŽçþ¨/Sßó|4¥=¿H½â#jù¬’ˆÐ§DÔlœ×5‘5ðE£Žq¤çÐIçüçüŠ–[P´08D„>Å‹°Ñòy½þХޡOñ¨ãœ«½/â{Å®¿T|FˆïdgÆ¥„«ÃZª xUAÔqÎ?©PÞ?>SÕ!¼Z>ö]n!ÏóÚ-Õ{^uçËÆÞEçñ}û´¶©,úž±…ÃZª X’u’óeS¿Ì~Ùªöü—ø]¬ñçx~$BKÇ<Ï:Áùv<‚ßs±ÅŸöüX„–ŽzžuœóWYMÐÁóµTòšòü`„–Ž{žu‚óŸb+kvð|)~Js~,BKÇ=ω:™ŸoÇÄîù{^~~$BKG=Ï‹:£Üòs}Ãêù»Üa^¹¥>BKÇ<Ï:«|þSÔzþž^Éѧ/ïB—»óÊçµZª xUAԙס?ë<¯:‚Gôäê2÷:´.BKu¯*ˆ:Yné­t¹eDÕs>ÂÅ=!BŸª9‡NÚ‰øÎùÎùÎùÎùÎùÎùÎùÎùáü÷ŽaÝPº> Â9äŠ ‰rÏ›Éôœsœó œó œó œó œó œó«9ç×½be£ª9ç—õüm¾€8¿f.Ä8Gà œÃó‚]sþ]sþ]õá<6«râ“­&ÍZôDœo“]Ö¹~Ïù9Ÿô„¿ÅªôÜ,ÍÊhŸ‡s:­ðMi/'T%©öMùJ7˜çË- Ïí·ÏŠ.ç“0óñês¨1 ±»ç=¯C­9ÜÝü|Ö·®9TVôë‰8FOÅù çüçüçüº6çõBôÕ…9¿ªåæJ ý¸øÎùÎùÎùÎùÎùÎùÕóQš ©îœ_ÛóÄÝ*ü€ó!ïÍ—§:[àüÉ=çeçüçüçüçü…óýní¹=}öhß«cé–;šFá¼Ðš§÷¼ çõžOºoœgƒ7õ¼)çt°JØ/ÀÖ1‘v7§Ÿ•ÝÓhœÓζF½žÛŸÕãŠÆÒ0œ¯­®âéLÏ#ÝÍGÒpœ—y® W]ÊŸÄó–ù9< œÑpœ[ÃQ’Âyh(Ëhs:X¥Ôsç³7.+¢¾¥L£p~ €Ë œó œó œó œó œó œó œó œó벜z#ç,]“óK[~MΟPÝ9Bs~s~s~s~s~s~es~Ù©pFTç°¼¥²8‡NR„sè$s~s~s~s~s~s~s~s~s~s~s~s~¥8·îäS5àH«‘çܹ£­ënÍ]±ž\qιUüžCEJp® ¥w)ê¶µb»…­5È€i‡R"?—ùJøöµž™@F½<’’å–ýÖÌz¾5¦?0VFù|CwÑιz¹¦ÂóRå”ÏÉDæKùÏ‹”Yn yœe +³|ž…çIå^‡†ÊŠBù.rfê[zõŠüçüçüçüçüçüŠr~í{7 %:©D”sxÞJƽ»œ_xΑd‡KpÏ›ÈöœŸ/pÎ/pÎ/pÎ/pί*Îíe¤5–^¯1›Kª8?Ïsó£Oâyç‘#)ê¯hõp6}SË«8§ ûúfYêîkò¤ZIçýýìt¨£·LØÒö͉PºÑ)OÝ0j¢Iò[¸·j%çV× Ú!À×wÎí1Z1cCY=®äyçêh6ØÍŧ™&Û=ëÜ…FþOWŒmˆ¤¹IvÊ€ªàÜðÂêRõ|ígðÜHÓ¯É~¼Ÿ5³9¹ Ýø€:ƹVס(žbvjÃtšñÚú¡¤8W/¯äyšsÃ`a¶üm³;æÞt‘éùöÖò Î5ÝÂ잨øê‚{²‹Cýét=;oÑ?—¡1¯å\u~¾/2ª¬¨VX×ѽ§IYpÖ¦ 5>#XVt<7‹˜Wòü„úûØ‹½8bވƟ[¯èÛRbÃÑÁ1Cg:™sù{7–•¸àÛ@ɧç#ߨIºuý¹3 u ݹþ\^%fú­9Twæ|Ts~q~í›Ú ¤|Îay+es"ô?ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç—Ãù?{GtýÏæü¿½#º¿þ…üœ]ÈÏù…r ¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿À9¿28ÿ=k¿Ò«ÑM"Éà<ûï'?ºI$YœgBsú¯›D’Åù-ŽtœHÀ9$àœ?pÎ 8礜s5‡ùÞ~Sí‘lsü‰È¬glžïû·çl‹GRʹž …LDÙ~SIÏ9þlîyçšnwÒ1nÏ…ÈsQ*’BΣˆuáܘäXÎ-Û‰s{ʼ@$…œ›‡kÖ/o1&BfŒÄôÜ™’9ÉΩÊxÏ¡Î<¹ä‡Ççùþ^ÿì9TÛs>DÞ¢&·Ô³fvã\ÍoºEŠäP~ÞùjqNR:{ž(?+·ŒRV¼šç‡Êç}®‰ÂçоžgŸC]‡RÓûx.'9soÎóËŠ¨oáŽDsþççϨWäˆdáüáôƒó?ï>ƒs†Hœ<žÖ¼Eˆ7pÎÉô÷úôÛêùäç‘,ù¹ØÏ åô#½E$9œgoþô#½G$è—Ë/ôËå8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç8ç—Ãù·Þ=,ÎßzÇó29ÿãÂyPo±TÈ£¸eŠóØ¢_ äèCÄ-Û9ÿø|<6ðNÅÃ÷x‹:ºrþýÚž·¤à”°ìÁ9Ä­ÿ†—jÇendstream endobj 392 0 obj 72 endobj 395 0 obj << /Length 2011 /Filter /FlateDecode >> stream xÚíX[oÛ6~ï¯ÈÛ$ ÒDJÔe{ZÛ´èÐm ºPl&V+›ž$'30ì·ïÜ(ËŽÜ´o{Äyxx®ß9¤ºHàO]TÉE‘¦q•ÅÅbý$‘éOO”Œ" ˆ¦$Ï®ž|ûÒ¨ •ÄUR©‹«›#&WË÷ÁóU½ U0Ø0RAFišéwa”eYðzê–ºz14nFº,d&üpõã“Ë«ñ`£õc¢!Éc²©¬ˆó$Ñy™Å*Í Ix çÉ·I›Í’ ;Iu\­,Ê ³)ÃBÇYn ½i6¶ • ž·®·l9’!Oã¢*µl¹ MÔíÎÊ‘=þ–AÍŸ7;aykyò>êŠ9¸Ž þæŸWÖ­CÐáÅ'Eîyì»[Âô-M÷<]·-Vë"Rië<­p+“°ïÚf[ýÎ4I`C=ð¨‘_dÞÕxÎ=Ѩ€DlaÚõ8²luž…åÑýÖk …ª#“묾÷;9¾^#™C³pè {  ®`‡Î#ŒÖy\™¬ôÃÝïM7ì ö?'ÉGJŽØ¬Ô#üáx´Uù];0鎔dJªa8îì¶³\äÆ"lêaGð"›ï{Ï£›ŠÊ\’l<ˆxï¡3¼¸8î}-â†Ä~&¿íB¾ÿhñgA9qg¿Ä|¨ŽÉèTÈójÔGo`s'e Iæ¬fÒÀÝð/ƒà¼4ETBK=U†ƒ€Ô®±È:­‚y»üjzÉ¡kt–ô¸æÝ€s§gCi(p$¸NËs-–p|(ŵÀ Ž'ðG•áï3ª€ÙÖ“ tˆþtÂÏ€äL€ã47U4<(–?æd$?†GÔeB ïâį83›:ùÃ;m/œÜ™Ò 4¬uGÅ“®y>=daOÝ$•ñ[Ž}ÁYNÉ:’^9Æœ™¶õÒâÎåR&ÖI’' ªìõ=ß²Þaâ„ýÚ«VR°ç —„Ô:×Ê콿ãrß8‘–sZŽ;²79Iyò@3cßã)ñ?B]ˆ€nX¿p /TBËí ¾ šà õÌ[~o¨»ž'ùZVú{cõhsƒŒ|ïãðÐ3øŒ‘\¤Š":_«pûƒZ5SV• ãJ~ý}u>ŽèqAPúLýâÁ—õA°a³¨¥ÌS‰îá0ô2­ì$5þ¤J3¸®y}q¼Ÿà>wþ/ÜÆ~iÛï_3£‡Ñœ”1&”¦çë_ÔoÏÈ£´ŠµÒþˆç!tß5„Ž3"e&®R• ý¶Þ0hT¹Ðpß‹Ó,×rÛÉâ"ƒ Ïá¬*Q´3qS‰ñ™ïê0UŒä¶[¾œîqÖíðbXàÛEJ-˜øÓœd[U¬´Ü¼Æ—ÌÆKxÿM?gStE%½«ç¯ÚÄ¥Ò՜ޑ® |IÃjR•‡÷üèºÄãpþi¶ºëã,äÁSW‡%ºaEux Ué„a( ÒZáGÉU3ÄD¥‰Mž”ÇHsx΀Zø›vgkÿ’韦ŀ \É '’9¹Ü»#¤õ—ôÎÝR9^Ë[ÜÓÿÔŽå endstream endobj 394 0 obj << /Type /Page /Contents 395 0 R /Resources 393 0 R /MediaBox [0 0 612 792] /Parent 375 0 R /Annots [ 397 0 R ] >> endobj 397 0 obj << /Type /Annot /Border [0 0 0] /Rect [147.6002 547.961 374.555 558.8701] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 396 0 obj << /D [394 0 R /XYZ 90 720 null] >> endobj 398 0 obj << /D [394 0 R /XYZ 90 125.3011 null] >> endobj 393 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 401 0 obj << /Length 1881 /Filter /FlateDecode >> stream xÚ­XY¯ÛÆ~ׯÐ[( bf#‡ÓǺ‰áÔ€[XAP¸:–x¯XS¤MRQîK{Ï2ÃEæu€Ö0à;œ9s–ï¬#¹ðOnØZ­Sg¬Ý/¶?ndXíb?'ùóaóÃO™ÜJ‘:áäöð°`r8½K^œý§L†r·—I·Ûk­ý§ÝÞ“¼jvª€£Î‡ªmv{UX‘%&ß½?ü¼ùñ0 ΔzFµÏ“rF«í^+—Z“#ѯ.2ßþ¥Ýü}¢AFdŽÍV[“æR±?UW0£+Ñ“è>™‘%‡3|„ƒ·Mú ÿ ;Û)—ø¦¬S´ ÔØË,-Œ+ˆïaWè¤>2OP@0•ü=0_¸*š¹ŠYžj—;`†<Þúß"ÕÂeS)¤TŸ|ÃjʤFþYò„Z¶WÖ—5‡…pXÛä/öU—'æñÐv®TpÖÜßΓ]‹‚nlZÇ›£.¿cp„Kí——o;e“¶;­¡°wEj zTêTfÂ~ ‘E4¾ç‘”!Çà„39ΑŠþüíÃEûa·Ï²äß%jŽ#¢HFª{.2Bâ.P\R5wì‡ò÷WÿÒŒÎ;1Y3žp8wo¤É:nÚéÔ ¡®á˜fJÊ/ Þ½QE g—ûuú 8a‹5æNØ 8çheÖ’@q«±s o™¤÷ðˆ ìÄ“ˆ´sêJ85á€á b§Ì ÈŽúr„K¹£¾_ÃØH—Ñ×® ¶°$ýÀÿ *qå‚rô(ùý\†²Š¦†H6ɹ¢Ü"ÉÒl‘qnȵPT–mT‘"# çû’«D‘ʪ‡Vy*tF%õóæÝ{±=Aýýy.ß°§Ò9µ½l”H³HÃF½y;/¾#Ëýœ'U`½µ©³‚u” j)¸PþØì´ÀD¢ò¬²Ò¦&çÒþÍ”ñ$eX*p˜ÒEAÚZá4;|Íß xv{\u¤àC}¾–ìжá£ç»€-ÒÌê@oþúLÕs…Uê–Óá?»LˆÄ·)6°"ù5DQŒmN¹ÛZ–œ}Ï æ@Q#ïÖQœqÖcÖ„Z¡ :é"”Ÿ7ðË¿?hjyꔲ«MM;G½ŠËÍŸ&}}׃½¹ÑÉ«¦ŠŒ s*×°Cýpb–Tºª¾ç½çÍPJ3÷Úqã|n¯A@y ºöÈ xÞžùiÞe©ÍD¾þXWŸ¯Ó ‚ž^›,DÐè…oŽ» Èë5íužf&{>¬H+Óçx”,ÑöfŽ= ùkæªcõš>1å¿‚jû2•E,¯û55þwÌŠ¢ØÄ6iÜÔr`ÝøK‰cA¦“—e{¡æREhoLs«ê:¬8êñn&¦6ëÐOêxº3,ûÜ|ò݉íïb^’«’*-vN¦´ß¥ yBГ4ðc.I%m²9‘0ÐüÆ[8¯-Dz;WGDýÌg³aE#ë8Ž´©¥žø`„“€¡`%NÉÚ-½{ `etfÛóÔø!–©ô, =Sú.\y¬b/çî-żÚÔ£eX´´¦nàù•£!.Ñ\üât]Hý[¢¯p`E î¤AO°‹™6ÄK€²‘V\Jލə]%ù¹°ðÎT2¡’AÂážÿÞ›©Õè×O¾›äRÂÏs3ýŸ®¥,¾( µ`•§Äh4 B …fb2¼óÄíœZa[®æŽ…ÌwƒõáŒ&¨\€jVûøåùÏ,ìñ½ òÕ^þ‡`¦ª…@@G³C>¾yóö_󿼬ãÄÖrŠz‚¿¢g\AÏ^ûa1ºÑú±äø/‡î‰Iù9¹¬æ÷áúmp{GòúÖvõéý7AÏ(.–eX#løw„ ?b‡Åõ3ÙŽG#nøAíkí…syâÄÎ(1Q΀û‡Z M?Fã~™ ù}ÆfgD‘\©6Qb ·Öú¾ëùèxíè× 8.âÞ—¹@<¹ß’±º·ôõ>·2ù¥/#]Ūè8¸|XKæ©[úâ÷àvi§÷ñ‰‰xî±òî— +IËŽ‹™ÀÒµU\}yôô5Ï{; Ad+òç`1þöáh˜¶¡ûÂÉÊoVNŠ5ÓÀµbñBòØ0‰º²̧ŸSÂsý. ˽Æ1)Èÿ¸ 7 endstream endobj 400 0 obj << /Type /Page /Contents 401 0 R /Resources 399 0 R /MediaBox [0 0 612 792] /Parent 375 0 R >> endobj 402 0 obj << /D [400 0 R /XYZ 90 720 null] >> endobj 403 0 obj << /D [400 0 R /XYZ 90 684.1345 null] >> endobj 399 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F14 131 0 R /F3 134 0 R /F52 12 0 R >> /XObject << /Im16 388 0 R >> /ProcSet [ /PDF /Text ] >> endobj 406 0 obj << /Length 2862 /Filter /FlateDecode >> stream xÚÅZëÛ¸ÿž¿bû¡XX©zP¯8à®h9$HpY r”kÓ¶K2$y@ÿøÎ‹”dkï’+E€55’ÙçA&º á_tU†Wy’¥Êó«uý*ò—W‘´|àð§,?ܽúË?Òè* ƒ2,£«»íl’»Ígïo{}\EÞ`V~äu+?I/y½ò•RÞ›fÐÕéõPµÍÊ‹2‰\ü:e ÊöÜ %fïÈ5Íú™;¬âDæi Ò´îvåµE2~H¶S‹%ârY$âæ§È-,Ð5{‹\”þþ`¾ µ -úñö »±¾ÑÇ~ß²/ÿvÀ-C80`,vM¼…iß0­Ó=i Û׆'ÏÏ£Âûž‡Üp@- ©£0¹ëy¬2N­±Ý[dÓÞXÉÂA[Ý’ƒ‘Eß‹é±6s‡Ñ;Ùðfw‡´þ¹g›Öý7z“pÀ;¶ÍíÛO~‹Î¸_“(11âmÄp£}]4Z´ØÌ€š`F76¬¾† Øç£daÐy䎊ÝnËtݧ§–€ñUf…xÒÙ¢gƒ8Ë2aã¸ë'yäY¢æÆOg)e›6ô·µ™p©Øa>àr]À8è/Nl`¸ð˜Ìuq¸ˆ‡ ÇÐ)ÔÃäÃp›c€Só÷#­´a¯-ƒ³œš6´ 0NbwèÕ.Z “ßé6{ÉH6×p/¹øª·q ™HNtºVNlWµÌ©í^¨—{†á´g¢¿¬ì’ȃÈQàÉÄñXQ"Ë™XÈœ.-çÙå²HlñÜac-ØgV½5u°]AIQm¥8È3) ܈Úmä|n &I¸?É¢a© y­,4á¡í wUß =ÏÍ¢…’Ñ@3›hÙ,8 §Gvz„©-7³tœSo×ò/ÛÌ¢Dz!ƒ9nöìÉìzÞÕqYÝ—´ÝϲœNJ)ôœ“n(Óg‘R ½·Íö¤Ðþ÷F‰tp  Ém!ÆÔˆ.á‰ùV¢â±‰°«Ü9Œ/Óµ8‹œ1iΙ½±·xBt×ÄÍŒ`̇wÜžf”xú ¢¼Ùr×3ÎÔžx XœÙWNÉ ÉeéÑ0øhíªÆÕêI‘Ùó -&nu¨ÖúÀ÷˜ÎbƒNÖB•P(Q)þ?‹æ™ ’)⢪¢=V‘s/ …ÏFNý zZÔÛǦÒ]å€v:óîÓ k?*³ AÎ5¤ÒÄû¡=urT ÀÞÊÔ gÍIomÍ‹4Î ’Y]äý8ƒ5,Ò7Md%ÀØé0Nå‚:Ò1æy›TELjÁ¾Š²ŽØû×’Ú“¬²<Φj‡Àj©³›zh‡j»åŒï»ñ(D],Ȳ ,\ùw-U¬T³‹ÅIfá(q‚G<ñŠ>] TÂiøgnõk"Ô®Z”)ó ÊK›r\²gVNB´rdižZWÞ&ËÏ=4Ó.v˜CqJvI:ºXpcœ¡ Ó^þeÿ ÷“ªP–Ådûí ´ Û”ÕëJ¸>-ì]G{ôÀÆ9žŠÆ’˺¨œ*JèAìÑ%މˆri%a¤R] &5¨ŠkP%»1œH?•y<ˆj@\«éOÝbé2/&1ño ^¸ãæyÂ¥BIÊæy ²V2 R{åŽÙ¶/­.#ebñpƒœÕ7R_D6œ£kïÏÜ­—Bé¤ï‚*w¡çWBœûÃ)Àj)ªF‘ Š,™%ÝþY‘µppTäyj=´‹±¢‡)Ì%›§#ÕåUcäÂKË¥*W7¨žåÇ냗þ•˜ß·ÛáQ3˜À³™¯‹úÈÿû y ½%Ç}ˆ3—q¿(9îcÚë[c¤‡c„ñÙÖ§nR*á™a:bïªË‚=4ÿX„íi n4:¯k˜gÌ7NÉ$,ò]CòñW*›Ý±Â'ÇLlÕä¶žùcŒ;Šâ½Ré,µßó•NÆ RD×®\Ý0ýè”±–Êdr•ý÷¨¢çÙZ³Üba‹”i¨¤|1ÓˆüIS¢qÃŽŠBª ÅY«‰{Sàœ\äúBñHä ÇF€Ô[Œ Ie‹yÙÀþ7–Xâ:Gä‘T˜“sÞío$’A&•–gU1¹&«qÂŒ·9¹<ïW÷ÎΩçî/mˆD-|'òŒƒO¹fRü¬!R§w¶Áh$z°"P†¤&÷Y`ùOþYÖüBűx)ÛIIF±\1%%FÊ–úæZ(5Þbº'=¨Z÷î•g?NF]cP çÇœ»©2†®‡ÊéÐ…z ·2 îŽlR-•®Ô,¨úb¥ˆ HߘYbÀ5DÂ׿1œJ„Ô1éýÙˆÛ·3 ZAú–)¤ ae%Åö&¡!—m7í âoæ cN¯pá8Ø>ÚЊ=™½‡,†xºñ ²ã[jŶ0˜»q©ûGÇ W ¥à°þêí[¡¤½3ãR.#éf­'Md\Oo.®eŒ˜d„˜ðZî tÙfÏ4Î…(ì ^sí˜@–\:J᠌ˊ©ãegŠ;T“ËêwW)ל J„wmƒxH î=îÆ †8QÓI$ UíeÄtÒÝü‚Ô2ÈEd?Ì5¾€ª3É£XŽ"4â”YT%ò&Ëœ~ÙR)mC%x’{ßŸß˜ÊøöòF‡Öd?™ƒ¯ÇKº(Z¸zæªÖ¼ûþõÒ–:ö¤ï¿@ãÍ?¿d³µ©2A"åºBÀãÂin™ê‚òÎ*©öOíþì÷ôây”!“Û@Z—×Ïø½v·÷A¼ör­"×uäÇ%ù¿ýýßÿ ÓPÌ endstream endobj 405 0 obj << /Type /Page /Contents 406 0 R /Resources 404 0 R /MediaBox [0 0 612 792] /Parent 375 0 R >> endobj 407 0 obj << /D [405 0 R /XYZ 90 720 null] >> endobj 404 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 408 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/command.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 409 0 R /BBox [0.00000000 0.00000000 216.00000000 106.00000000] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 410 0 R >>/XObject << /R8 411 0 R >>>> /Length 412 0 R /Filter /FlateDecode >> stream xœ+T0Ð3T0A(œË¥d®^ÌU¨`dh–R0403Õ32tôÌ-Í,!ª,\ò¹ôú2endstream endobj 409 0 obj << /Producer (GPL Ghostscript 8.54) /CreationDate (D:20070503150401) /ModDate (D:20070503150401) /Title (blah-000.ps) /Creator (pnmtops) /Author (claus claus) >> endobj 410 0 obj << /Type /ExtGState /OPM 1 >> endobj 411 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 450 /Height 222 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 450 /Colors 3 >> /Length 2179 >> stream xœíÝ1rÓL€aqZW´œ€‚Š&ànÒ¸àä4T9AZ*ÎóëGd#˲$ûÛ•%ùyfØIŒYK™ÉÇkÙwïê_þü)±õËËËóóóããc‰ÍF•žBõþ_¿~}£õç?~̸ÖG_o›N ûþV«Õ:¼–žBõþ?~üø7FÓ­yGuú{ ûÎS”›BõΟ>}êÖhÞǨ^OÀ n¥èê¯Ñf¾Z­V«õÜÚž–ý5º„£´Z­Öe®íëŸÏ5ZÏ× °j½Ó²¿FëùZè]P+µÛíz§åÙÍõ.¨æÁnþ¾«ÕzŸk=>þDñÝš1šn™T£/á×¶ž½R\î9ß»”rM¡öÓô—Kk4~ñ}€ûñüúžù,sãt Míçé驽OêËùj4øµhŸjûd–¯9òu3,J®ëBõwè”oÏöÝš}ÖT£i€6ç°º©´º†E™¡F'ŽÑªõ¼¦=AëšJë:ZX¦…Ôhõú½¼¦2ƒzŸì§?ØùàÒûLÜÿÜio>°0@}uá×btŒ¶ïpúqu2é®»Ïðþñ»Ã6X£—þPS{~OÿZ\4C«±YvÝÇçîÜC_‚0:á £vÑ“¼¥ÔèÄGíÜùÒ½zŒfœ¡¿0†gèðou64LaºáKCfth,«F/£íÇÎU£3¤èE£v4E§ŸÐ6¥F§?á[PŽ>dGýØYjôÜÌÊ>"¯HÎ1:Z©À€ÑmºŽí=ôaWÔhÕ7¼ª¬³2øñèÝ¦ì ›R`Ó/.¥F¯yßh£·L;¿UâÂèÓÉ›¢Îueï=`Ø_©œƒŸ©.â}£GG_åûZ÷Cƒ.¢F޾R£ÀåJ×èôÔ(°>¥k´1q˜ªQ`•ŠÖèÕû\S£Í]§ü£ëã_7ÿ?Q­VëŠÖ4û²ì–k ÕhóGõçíùš~ )(}Q¦Ë8:rmÕ®ÑölýŒ><5 4Ö2F Öèu#OµŒÑªPž›¡§“T½¦_6ì½¥w8 ¿TsÎ jtx†vNC½‚ctâý§˜»F›ÑVýn§#/Ig¢F^k4%×éU_Šu¸6 ¬R®1Úþ zy:> stream xÚ­Y[oÜ6~÷¯˜·J@FIQwŸºnk´p·YÔ@Pd³€<#Ϩ–FSI“©û°¿}Ï…ÔÅ–“xkȈ·Ãs¿sµXÅðO¬l¼2JE61fµ©/b7}!Ü×v¬§[þqsñõ÷Z¬DÙØŠÕÍÝŒÈÍö}p¹Ï¡ú"\‹  ×J©@ý-\'IüpeKm¾éËæ®efb$YøáæÇ‹ïn†‹µ”Ÿc ·|Ž7‘˜(c¹J³$*ÑÄaƒ\ilæ>æ-ð›ßVź-:š«N(qˆË:ß‘8ŽU@ þîQ¢‡c 3D/¯*ø|àÅO›Pš`Ϥê¦u7xó¦ÂµŽeðmÙåÛ¡Nƒü°Fm€k¡"¡cVk,s¨J!ƒ-³ Rö~Ý5m_à{ZMm°+?âåx†† *;Àÿ œ…¹,hY¦2Ü»}ô(°Æz¨ žíH´âÀ¼AR"¸…c§ž·³èîì-]⎞Ëjë4BCT]sØ-‰˜ þÙ—(ã¶8¬»S{‡OÄ\ðj[Ô ê•uVᤆß]Ó–ý6׼헚~_´<7— ‘"ø¦b‘Q8cƒ·¨¼¦ëy/2]{>Ž\±6™*ý«~I æß±PS;èjºƒô U<àq–áo;òs¡æržÝ:ûà§~ƒs >š<1¸Sçý£Í;“6ð£ÈPâô¨\À#v”Líh­­¥„É,cKÏkajo¦t—ëxCãçeÃŒp$g¦9Pœ*ì]˜%< *CD!ƒ?ÿ ]]ó$˜ ¼…þŽ÷äü³ÉIÇàb¾HK÷Þ„ÆÌ/½h‡iÚš…zöáNiœé»Å·Ù~åμÞÜþVôÍë ÞÃw›sMË÷Ú¨œ;‚!˜=¡É=øUÑÔd%eqþÊÑîÉÝ™ú,Èr¼^ÁŒµP”`âeš<ÊEÛ᥋ŠÄ­·¿árOßÿ¿N¥bJ :½Š×<9Q†Ó©T3Âuê<+Ña2=~1¹™o¼" ‹‹*ÞÉ@Åð™ÇüPTE]\7“hƺß;SÁX;‘×*à¨e2de¸³r±¿õhîzʱ˜VèL¬¬9ø4‰Æ©ÒZ8æØ¥‡3RÊH%©œ¿7d¡:M‰­"d‚…¥*¸a=¥Á%ù¯ºæ<É¿ÈÛPaè?IœWKð@­ÚHÈŒÉ#ÅìâR 6Å ºl02׌¼ís¨ƒÔ;sŽÇ#«œÓBL[ȺO3_àD'G ¸¾D½*³šOQ#ØgÑ·I¦í§P£’hÎØ¦ w¢\JbGèÔú‚‚º.®ú= Q_Äàœ­Í^ö¾Rˆ¥°ÏˆKíXcÌR7ÍeA[ªqÔðï3nÏû|Xa{K©4Nu¹ÈûaÊ=æ0Øç_œp±3ÉA\ÕRž–%Ü;ùƒëÎI÷`ÙÍ}Á0Iø9Ep¿±ñJÆY”iEÀøú‡Z˜Õ· @h©'‘MrÖ”< œß—»©‰o…œQ"¦.©†oäÿr–@9&©95ºÈ‡")"4o¼äýOÔ©¢—tš”_wTۉʂBM—W培ëu²¯SõáðçžÂí–—©€ßn绿c­*:KÁŽöS¡‘SÙ‚¤Ýôb%ŠÛÞGOIÝ,d›lkÁ Ÿµ÷’l]Â!‚»Sð³)Z*”`ƒîw 4FèÄçéŠÊfØî÷0¾pÚÁý¦88°îà–?éŒS!¬”ï䲚ZÂc­9Ív'{м+¹ƒ'¦µýb›”‹0ëª2ËÊÄñر 1 ,ä1#¡ ¤ÌÁ²¹V´Á°›+øÖµ¯a&çNîx~·¥;_ºÕÒ·S5„ºw˜òŽŒo—Ã÷®¥‚ïB<ð±vÚÈ®¸ éZX_Þÿ€ô‚ú°sÎLf*»£¿—y3Ãåbý`‹Í¾[¿`ÇC ýJ:ã endstream endobj 414 0 obj << /Type /Page /Contents 415 0 R /Resources 413 0 R /MediaBox [0 0 612 792] /Parent 418 0 R >> endobj 416 0 obj << /D [414 0 R /XYZ 90 720 null] >> endobj 296 0 obj << /D [414 0 R /XYZ 90 431.4867 null] >> endobj 417 0 obj << /D [414 0 R /XYZ 90 332.786 null] >> endobj 413 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F72 6 0 R /F14 131 0 R /F3 134 0 R >> /XObject << /Im17 408 0 R >> /ProcSet [ /PDF /Text ] >> endobj 421 0 obj << /Length 3314 /Filter /FlateDecode >> stream xÚÅZY“ÛÆ~ß_ÁЦBsà˜äɱe—lËJ¤­J9²RÁ’X Ш•üëÓ×ààb¯Ä•ÔV-æìéééùúªEjá¢EjLèlš.Ö‡‹Hš?\()­`Äj<ä/—ü&V ….rjqy=!r¹y|µËKtÅr¥‚f¹2ÆæOË•µ6xQ-u]M¾îʺZ®t–Fq`ÝòÝåwÏ/û…c­b ‡<Ä›Š,tÛE’ÙPƒ?ÖÍ!ß—¿æÌ‚¢ lñ«‚œ?Ǧ>oiP42ü™›»ì+ïdèw¹/ šªƒ®æö"_/aæŽ oI õûZ¬Ǽ!:Ôµ‡âçef‚p¹Jl\î ”lÄŽ7b¬ cg°uÚ«×/¿üç¿€ùÿÀÂsœ¶X™Ä†±qÙb¥L¨âˆÏäÛç¯^.q ¼„Âëeš?ÉB‰%.4Τ²ÎrZ£npjëÏT'°Ÿ#ehCküß-i:1,§‚ËU$8"ǽ–¿RG³$:@Aö§¼Ô±·¾æõº¼Ù·y±‚ЬŽ@PóÃv™Ï2ò{œˆT€Å¡§ ºÄyqünNbq˜êTˈ¿/3ÔÍ~3GL»Pi¥Mì|yÊŽ¿$pÚȺk±É‚H÷Ü·-j’qÎiÏ*Valc;va’dZîAEÇ7ËG&QäùºæUªþ;¨%jKu BY°™°ð¢Ú”qÖæ„äÃßÜ‚wOzVŠ(XÔ,\‚¸¬ˆî¦ä±•H’?§ ÛdÝMÔÄ]ÑŸ°7Å2VÁ/§¢Zcá½Ü߉MÁ¨p@Ô¸BH¡Õgµ1µa”=^Aº¸Á%~OHÚ ¶aÝ“t`ªø´.¼ÀP€6näÖ« âåô5A}µ\ÅIðÞww„)4Ç A t¨Ú–x*[¼Ù)À!NVÀÀÜÍR*t*sOÍJ@îG’êxŠ÷ÊM#†ØûÖËB“:¿^WnwKí‚n¨f½r2dZ;@&”¯kÒÎ Kƒç`GÆpü‰[ò¦>A?lªZ°Ï‹<Þx°áæ–©ði Á›€ß56îrZXt‘«6"®4LS£§ÒšÇTn˜¯ÉHÔ͆¯!Þ“ÙC}r +O¹/f1ØÚÐè8yôá¾)~9·ºÃÜTûMwÿÞct XÊȈû7é˧ŠÁk†l~¯¡ûãnùeÎ>Q˲Ց µK{ULh]šoËŠ079cB5T‚g\¹GJ:?2þ ½Â3°OAºï éŠãc΂ÞìýYä¸QV9a »ýž,©´ãÙ5MÁbÁv=•; ÖràPóÉ¥ªÚk?©ª[ª¼áá7»ÂOÜÉÒcqâIDSõ##6 Tl’àÂ_‡\|ðÀä Üsj‹ëž;ºF5·‘‹|dçoNåS [›ÿ5Ôƒwàœ¢œcÍ„éÿë&Ž˜{À¯dœŠ2¸¼°ãÉI’£ô.f4nÚŽ+Š-+WÌ·×Æš¢ƒØL¢ïV†/$­ _´êrl(;&XV~Eàš„txh3RKékÁwé#Š˜âŒñiëÃ'ó}!ö{ζÙ¬IüèSü€º¤¶‰&üpd¨iÐ;Î'5!®ª"ô ¢É o€Â cÀÕÏ„°4Þìj ÐÝ=uía“ÒÓ~Y·âŠHtÉÈõn—wìh|Ƴ›)^ªŒx+›Á+!ÍË &›º¾õ* &"XY9}6,pÌ{“º—&R1àa# +Q²Ø÷0G ë}.ó72%ïH¿wg¨Äv¡­Ùë#SþxÉx@³æF=,凂©ø {®Ð[ù,ÃQýð”Ž^‰i´à=!ì€û+”È^AçÚûçVZ+¿¼X1h“âóÀù£ã–ò²÷íaÇfçJÞãªÅà ”ášâQ²x«µG}š–ÇÜìjnË›‚[®óCI¦%2pïPî\yH´a=¿* ‘:Ê G•ppƒ“óáÈ9m =)›æs{e!øÀVîKÄn2ÝíÈD¢Zt¯?0h¥¥`’ô¦ƒfB㾦˜†ÑÙA m¥*öÒ¼ÞÓ>­ƒ^Ü–bû‘‹¬XP ÅZ7Eüx¬6šÞxTSò6£I;:ÉÎßùÛ‡~¢û€~´I39¿Ô±S¹)×yWl¸‹¢=ø¶½‚Êà,¸jrr >ôÎíz~Žâè-S|S ª¸Ö_pÒÙk1tŽ•„sœÌ¨Ù*“ ¡®8ôÌ2÷üÃË*΢àÎ%ÌI¡ø”|øµ/ÐfÄCEÎìs®n|á õÈÅ™qU1Ub¼xŽ_ݱ•pMšØÛçCMç»~È„ï3”ѳ?{#ç›ûïä±åнª9G$‰B…¹ŒÇš©·¸ö»;²<9P´6ó1&ÿÈÃ˽]g‡#³¡CeÒWCb‹¥AZ&(ŒB æBþ$tY¬½É×u7Ï„’Ñ! ËîY3Û‹¡¤ôlìÕj.) 2I{‡òå+w‰ùÈW?‚Z+ -_?Ÿ]& uÒ¯sGŽ‘!ŒÐ%]–Ô©íeWJ𜥔Pô»Eß±ˆú¾«y+ïOKIÂvmYð³“ä,[J´ JÝd÷I:Ù}&±òòlæ=V£"ï-‹¥c²}¼;^„Êt¯ëžQi]ŸßBfH‘q„.rA¹‰-Ëg®|{Ë^ÑÂ|ÅXÞ!‡>?a NÞX [Ÿu\« BSäQü#(R¾–C8‰Z!BwÉyþd,:eA¹\’XºKY˜f)èMh@·YäçJ)p÷­1Û0M^.~¹xû.Zl.¢Åw2÷_Båœ^.tÆæ ¸añæâoÃ{AOq5"Iof‘†.øž÷ëB¸á½BöžWK~Es7«6 UfÕoÊëˆ&1;•¤Qašª”¸—]RÙsº˜†ZÃW#¡{Ü?#B šÞ8q 7—}Âá¤aj£ì® {Š÷N¿îøpÞüu™¹àKtX¿z~7«O9œÇòzÿád:´ÎÆÿÙá ®³¤¢+°.i Fe¥ ì,ï¾&÷Ýé!z€2ENõè‡åu]µ¥ 5§ß™$,u; e®|€Øà%Iºh•¨ ßòdNÑ#•“?oûÄ4½?µ²"¿ëô/=ÄõN&ŽVTQüx7•ºòqÑõä‘q”CÅÞÈ6’«¦ä?¨êY…OÂÌéû5^k¦`ØŽC)÷ß_qOq5&yKãûu¦“!š~†Iƒ‘ý (ÞVvm]˜¥ILœ¦iœÜ§ìÆšd¢ìùuoÃŽ‘(Qìól|äïÇA"g»ókD3œÿ …XcýíïJŽy„¦7|¬m‰¿…“¼Çκ¤}k/¡èõö¾+WãûÂA^Až 9¬7c7œFH†B£wè>Ë ˜ íò†#{åÍ=R«åã ;Gýì&5J<”Bû%’‹±!ÁýaÇèNÊí1_Kñ*g©ô÷x[gÇ©3Dy%g¯š$J¡B^òÎpu¬± …3 é•-w±#ëq`åý(äʹiãIýsGQÀ[-šœ[i¼pÊ>‚¯9 '?v7tEy#dŸÐKd—S02±fV[®o¼Ð³âMŠï Þ“Æ.âët(šr-c›íɧM ÿî@=,VŸhDZƒ"âúgÀ´dfΟcã7‡ÉT(’™Âã<4¬ù¥zu· HèôE91(o1Ç{k(26|Ì0•òHA°vÎ+„&p@ Ñ?)t<üz>ÚÕQ ø˜äGzæ H_bR^höÍ€lxw$MsüÂéù˜Ó&Õ'W¸æ{0 0TijÄ?|ô;sÑiF.Êú|,Ié’¤Ä+0Š:þ >äAtyæµWÅhÛG.Ñ}÷ÚKyžš;þ5hf`/TŸÛ2Ëq ž“ò±Ñ3„íAŒóI„ysq—£c“üÇY‘è,LL2’ˆ‚¯]Zf^0J£˜ÛsàXËù3½J’k ÔõO2­Þn÷ƒˆAáN;¸ÔÙÙk©õïü»^Á…¹0lÐ>#À0î 1‘¬JýGØ€Ur¤¨€¯JÒØp]S‚mÉûGèl{ü’_¢ð+ Ì?ziHW‹~¢‹ƒB¿êW,…#þÝǧ?m3p3„9{Ãoß>{3QOžòÜvf¤n¿›îÉÀÖ᜶Eþ73ìzm~ø”lÎ~3úeÎ áù÷Õí/ðÅ3ògŸNû÷ÓþòÖŠOý0y°ÒÍð8¨÷z€ÇÇ/÷$QMW@‡ùß®åÑ$ endstream endobj 420 0 obj << /Type /Page /Contents 421 0 R /Resources 419 0 R /MediaBox [0 0 612 792] /Parent 418 0 R >> endobj 422 0 obj << /D [420 0 R /XYZ 90 720 null] >> endobj 423 0 obj << /D [420 0 R /XYZ 90 486.1799 null] >> endobj 419 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R /F72 6 0 R /F67 89 0 R /F14 131 0 R /F3 134 0 R >> /ProcSet [ /PDF /Text ] >> endobj 426 0 obj << /Length 1675 /Filter /FlateDecode >> stream xÚ•XIoã6¾çWè¡R1VI‰ÔÒžšt˜¢Ë!Æô03K^Yr%e1Ðß·’¨±Œ"‘Ô{ßûÞJË™€?9ËÄ,‰¢ SI2[]¾¿’öi'æÇG®WßÐr&E‰LΫ!‹ü³w³1{_z]áÏ¥×øó(мè®”ò>V~˜ÂVc–ݶ®üy˜&B{Zø_¿\½_ôŠužƒ†G^c‹“ØâT2Rš°-¿CE/-ÐI ‚X<óSY2èå_¾Â3;4 ·øíl®Â Ö1è–Yj™ÑGüTyµµ–,6»} <ÐË;V{ .ÖœVVíZ™Õ¸0´ÒÜŽÄ™ ·¨Ly]½^—…}†å}^Á³Yt^Èa¡1ÈÿÓ¶Z3Òzeÿßùs­½¿Þ®¶PÔ1™©@Db@<†ueöLÀœ…X! H‹ƒ‡{·[PGäb¼”€"A5"<ì·h"¢”¡gx§%cÊ‚ŒêðcŒ ÜÙ7Å!Õ³LÃJì•Û{”SŒñ.ÀÆÙÛfÈ@iåLµR‘ƒÖ+ bü¶cÒg_Ú¢$—4¯¿æùGÜ€”Ø{´®0j|~ƒNÜïAe°ã™S˜ê8©gßÓ¦] °ü—yËš(Þ™*gz ˜Þ¦Gª ‘ibM7Å$zPêªFèeM1†J[†ÐmØ^|Þ7Îvôd±ð~!¹xè˜>|7Ö¤‘0eS{EVKgPÍšñ™§m·©°01}K&‘<¥/¯1®\z*WÂßçLQ¶}VE³ ?ëÞñÚCëòq3Îp,‚$L{û1‚³ Š£Øž8õaÀµô¶-*Y€O6´£QÙ¡R™Ú3-‘ä²j¨+ŽëÂY¸Ž\2+Û\¶pÁu'³uÿ™ˆ¦ôsQæüBìÚƒ6*"%<ôËq˜S!M=Ž‚Õ kY7UÑð3×®t ù´X…R©Î\–ÿfXõÀu"g{*®L + wo(õßSëà[ƒ[Gœé¬5ÇÈ6A›¦àh™„@‰> ÁŽ]Q¦Üï+¸éLI8ا¤à‰>"¹*öLžSDR“Åò¢J,&|°j8š¤Ò^ì’ªš?]Q_CîÛÁɪw¡-f½ÁjûÙ¶µÂËÖ¢1ü¯ÝÔ˜¯]ÏSÇëèyØá|uÖQµG—è•û¾_d,5‹_D0®—H~ ÈN„ë4.êð[˜ ˆø eÛ1€ÈÃY<Ä0®½TGèKWQIÎ_Ý‘â±ì…` ÕwÏÑìÕX;¾¿ÎcˆŒaüñcãÇ\A7á®>ju 0âOÈ|Qæ‘HOlɱ8„}#ÎÏÔH£Ôr˜ìÉi0^Ó6¤h EE1¥­-h"ÃÆz`«ž( š{»7úù V1, •Ùöì¿ü¯÷;Éu›´J}^hÞó°`\ ‡i‡aŸð1ÝVl^û†¾il¶ßѼÆÑͳ…­Ì_„Ÿù“¯ð,ùÑI±6Œo* BºÐYø ¤Dãkl”];F*Dc¨„›î®®¹ø\òÂÿ+Ɖ  ›©iµXdj¬Ë~˜ŒSôur2L^ó)±|ÙBÚºâb{is8 /–D?JÓ³óxêÒÑmàg;gE¶»lÐÒæÞøèz/¡·};&y>.º8/ú}ÞOK—H®ÎKþ½nvPî/zw^èuý€q‘÷5ÜrMžžÆLʪ>Wõ §Òa6ª;|K˜.B!Ô)ø[*¹!§:_˜ö<›ºj;3 ÓØ”SD(Í"Ã)"ow|Mª¡$N–]*™o{®U‘0wub»ÞðÏ ùÁ°8¯Û”'õ¥kÜ=œo°T¹ùŠFs¸ ê»óÚ»â¹{h†B´Ã‹!ßKÞÉ?ŽÆ°éåèñ<œ‚SƒÛ=Aùnî1%Í=T -ŸX™¥5àq[ðXÔL'êótÚ¯Ûj éÏ-7êð {'±öl¯qÔ@§ûéæ¼ö EE^x8îã‚èxäû·hpªËúîï÷éx\NðT¾.l»)k¾¼Ú¶Ýmè— hÜì–þö‡> endobj 427 0 obj << /D [425 0 R /XYZ 90 720 null] >> endobj 424 0 obj << /Font << /F51 9 0 R /F67 89 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 430 0 obj << /Length 822 /Filter /FlateDecode >> stream xÚW]o›0}ϯ@êÃ@Ô’=­íVmS«FZÔ=¬›äV‚#ã’¶ûíóUÒÒÙT‘+\ι÷Ü/:€ 3NEÁt©çGQäF£04¹&L^ú6Mö}ƒqLé,`#åá© {Ò¦@Ú¬p*\½-(¹ãÑ4™xÅñ!DA@ÌO3þf ¥ñ%a7"M«€è^¡f(a˜qØ|ÔDefTFqÃA[‘š0ÿhÆ$"«.ÙˆÌÇî¹PñJü¹¶§Y›inDöˆÄŒHèŠËQ1{ÐÖ Ú¦Bg\ÐxgQ¹„ÍûnRMÆ0-r+÷C‰òã­D¸®íÃ)Í,%…8Bø/ö˜²åYûŒB3þG‹ÄÊñV+}˜Ò%•¿q­æ‡Ó¬Õ÷†»j³gG”‡7ÙêüAPCR@4 ‚Sí@¡'ëPT<–$LzW‡£Ù·àìpPý0šñq7}&Ï…Yž =n•—'²~´+ÏGÈý“3ò¿™z]廪)¬*è¶f·®¨(Š’Tî¨RLíTe ã|ömØ"Ꜷ[©E_*|ÆtòÁ[x»ÌLû‰b¿Ór³²ï[A%çþ;]¯¿=€‹7²Ç)níý8ê:«çuvØ×U_ç»1t™®É±4­«­:eBn3“kO³1Ä»hýœ7t³ªå„in?»¡F>èÒ÷ƒžÀ`–DÚg™¢oòª®ô)¹#jìÞrzG[Ò·æ˜ðTG#Vö°5N+‘¹B$z)qIý ¿ã»H{ÁÆ:rÔÕé%’SorÅVçMÁʳûטÝï¼…Ä‘½ÍÂTu’E–x)®s™è¯¦x™š×­œR²9ÔJ³¿Ã.6fñ.±ôÇ^©6ƒžlUð†·m2 n‘(Õºâ£cx½nqɼZõwoÞAãîö ‹ËýÒ›ñ¤«Õ[K&{øÔ 6´0Ä¿mÿ%'X* endstream endobj 429 0 obj << /Type /Page /Contents 430 0 R /Resources 428 0 R /MediaBox [0 0 612 792] /Parent 418 0 R >> endobj 431 0 obj << /D [429 0 R /XYZ 90 720 null] >> endobj 428 0 obj << /Font << /F51 9 0 R /F67 89 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 434 0 obj << /Length 927 /Filter /FlateDecode >> stream xÚ­W[o›0~﯈ö2Å`C2M“¶ªÓ6mm¥FÝöœÀ 8"¤—ýúc›\:*Ì:EŠŒ±¿ï;È$€™Ì‚IEþŒ&É$­Ž3}sDÌȃÞþ’÷ó£ãŒLHàÏ‚™Ì óì»s’ó•KœV¸q׋¢È‰^»¥ÔùT»á^5‰(S /Nî±Ì, ´²Bý¯Á–l­7‚{ÝÌ|N# ¾ÿP”€ª4y=Œ|ÉÑÁ·ø'lCì #7‚g:˜éÖ5™‹À$u Œñ>´- xaÚ;‹ˆ4"+ÚµÖð#`Ùîo¡¡Ïë¶¼èEõ“0éVðkÈÁÄ‘›¶-L|–°©5¨"¸‹ý„ÂÖ3¿Ë\÷‰À÷F§´ˆû:—|§ý_@`¨F$X)†‰0:¥2ff‰0? zˆy‰µ€§˜0ÂÚâÊBÈé€.ž¥"pR­-­òa‚+•¦ŽSeêHE—Žà²9¶è¥\4EÊË~ojÇ|•JR&J _úÛaú«ík7¼aÖj÷B×c±ó«+xPøÇ–§*µ©×õÉšê)jÙçmÞ)i¬}œ ¨%«*#W)ò[ ñ¨ËÚ\µ¬]2Ærò<âbË,àBâäöñ Ïô1çeùŸ4l‘lè7Å0k%Ѧ[$©TDuw!wÍFi%„Ûû}“>›rÝ6+q­=ÙJãÑûbDQÞÈgK‘P¹ÛÁV¾4×èùѦ ©..²É”hÞŠuߥØ/óMŸEÁ£6â5*e×f,…ÔÆ´˜[ÇZb¥ÚÓ oJaïÌ,VÅU`óŠiç9±]©Š—´wÌ[ÇØÜð\ÇX•N¥e­œÃ[±Ÿ^ô_Ü2¿æ?›_žh¢j—+™ñS+—ËÒ¶´iN‹ëcU¨+xn€&aÇ´MâGaÁ]XÔ6‡*s|lƒü>M$$~Â"f˜–æ3E[Ó+-¤>e”îwzŠì[7ŠÕú²Ã᪆{˜y3ÓX 2Ke±êbaY›‹Cƒv'ÔÜa4†;,™Á(ò b]Ô7‰0ßVd—îÉI—%Š'5+›½²¤¸Ùfu°Ÿ—›k=°ØKKèHêLvL.é–6]÷§«=Þ® Æï¹?Ò-d endstream endobj 433 0 obj << /Type /Page /Contents 434 0 R /Resources 432 0 R /MediaBox [0 0 612 792] /Parent 418 0 R >> endobj 435 0 obj << /D [433 0 R /XYZ 90 720 null] >> endobj 432 0 obj << /Font << /F51 9 0 R /F67 89 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 438 0 obj << /Length 2691 /Filter /FlateDecode >> stream xÚµYYÛÈ~÷¯$¦€—}ðÊ>íNlÇÉ®ý0ƒäawP"%1¦D¤æXäǧ®n’ɬ¾X]U]õõW=ê&‚ê&nRcÂܦéÍzÿ&’á/o”´–°b9]òãÛïÞÇêFEaåêæa3òPþÜíŠãBCµXª [,1ýÓbi­ >†™?á  ÞC»n*×ÉlÐvûbèKmmƒØ,~{øë›w^Xëo)ŒK^kœê•†ZÅV4N2*ccÒØ.–q¢A9Ò,ƒ÷uºUÒYä&hd‹ öÐ@A³sG€«tæ:Ò$õa‡4|»ùqð/ ži{žv$Œ;/ í ;:XE=Ú¢äN .ZøàD¶{~¬«'ž(:Ù{]4MU²P±ZN£ŠTQAˆ§MÐèJ¨ e7¨I‡v£¡Ê„*ŽøÀG~~e#üç®vC¬¹ë•<ÿ¡CÑõÇ{ÿ©^ÑL÷ò‡ïy¤äWV ;‰t‘_Ís§#ÄP´î>í@6l¾“=+tW îrÊ.Éæ¥7zrÎCÝ¢Òâ$ÒœZuy¼iQ;cWã0Ĉ’ÉÄDŒ1‰È+®÷Œ†ü#m{¦Îž¿Få\*â=ñÂÁQùh“b¯ñ@-‘s1ÁTðv4쟂zŠÚ¨0JHT¹,†â»-ÝЈU[›ËÒ·¼-ENG¯‡¢°1ä¯Élh ñkœ4Œø~©³0‹2í \¨Ð¹&¸k9ûŒ F»d„Ö€­š§ûQ¼ #ÐÎ!Zf9ªŠbC\ªø~ÿ2J*ž0yÃ=¥ ŒÑ‚–Û?4 7op˜@oÔ¦¡dñÈkÖI@]Ã]÷Ęœ´ü¹ía7M±†¦™ØiÔb—ÁM.èSV»‰®"—-ç¡Mr¸¿û­,øÈýË稳oO¸yƒU0aà ²W,Ö•S/ŽV•ÅáK{ t‡bÅA¨‚[FïƒG³¦öí$ÁQY•û‚¢Ÿ;ÅQ² èx`5&eÉ“dÈ9à ¼t¾ø1Á«#RÕ™w¢,Y‘Gª®ÅÆÏ^XÒ¢9³tkxãuˆêB|¥„]w•¨×9‹Š/½˜gtÁ1E3C¡xG¶¿çáúÐ×[4£ÆPÀûç'“€’·v"„Öíéèà–æÀpõ¼® M@V²Û¡ª’nYÜ1žìç—¢|09†-_÷ôýSí4ùãÜæ„m>Ðu ¼Ar…z¶pªäÆlw#"V¹ˆ~N'>ïxª`W½¼íD0‹V"41ìÇ—§;®nWðÏ4Nå„ r]8_…þëCâ0Š¢³›¦ç1Ê[j4}Ë­²Â>Lx‡ ßGØ -«G¢Ä#þôœ&#¬Éƒ{'«:ç§&ÍSucfiL°Š¦'$Õ¯[N^àÖ¯¢#î«5…)  Œ˜œqï—¯9 Z¿1˜@‚: ¦¹s,¶r¸q|n›‚›À$&½±¡©Ž¯ðo¿l9YwÁ²Wâpÿ[DMrþJJõX—'9%sŽí¸rÂkºÚådŠá*ðHçtŽiA½¦ƒ×j$)Ø™GŽÀm‘% ÎàüÃÀ÷ÂÔ¶+ù“²¢ˆb*2n;ÙïœñÔÈ_@.!§ „êö,/…Æíˆ q•Íí[ãHª¼÷®Ö‡’Ø8jµÅ¡,8v¬nu@ ÃE0ÀÓ»ƒ.Ù±¡›”Ǫaíj Hžз{µq/v˜ÕCÃû;£ïhYÛ Y.ÒÔ¢¹EÏdœê:AôÞA¯‘ûzÛP'v~€¸tJ’dN`Z0A?§cjzµsäcË1¨f$‰ÏÙ(nTËÃn¬šh‹²¼Ð½Ó¸à€•X†É±=ùdà‘@ùM”t^K‘ùþɳãÒqToF˜‚Ãä‚’°»*³¤/\ÇnjÐ¥W‘þotðyâ¾ç.[Рˆ*zê¥A_Áe>o$æË¥B¢’Ïq|ÑéŠl$0p$®‡.xæÆ§àÀÙcçÙá¿›&l r5õÖœ0:µÿuPGÏ :5T5À…£sCÕ.¢5"Ð] Ó1`°Í̪r’7,ïèLS¾ôÁiWØÎpé6¼Tå¨rò(²R»Ü}úùÝý_.t“†&Ö®rPWÅ"y‹ñpjØg&ÉC›9Ç¡¢|¸XmE"ùÓÝW4Èó|ª£déã·hêÒåy!´ŒEÀRÛ0VYþªÒ\½¯)º¥€ùTìÅ×ß.[þ1KùÜRuDÅ‘Îã³KG¸DÆÈŒKþpÓQìólY÷_¸åsÛ &ÒcÜä±+—r$~ã{ öO½™<ž}C¶´=ZÐ"¾µ°¹=ñ–ýEº>ÌàÂx‰c½¾P\yÀ¯MããùNæu³Q>êƒuÏ¿§e+ß[ò¿S –xŸ"©ïä’˜uçþEi…DSS¬šqLÊe’dŽqfˆ$xÆ[pBh…ç0Ô¹ƒ±„ Ÿ8П¶I#¢ØINˆTOž9ð°ÓŒA:¢;-ÕÊrú,—düþ‚è°…³é¸ïc;ð"M ªî¼Á:+‘vñù%21(3 ø`Ø@¯S—ï;÷X3 BtÒKîÚñÄä¡ó_WÇ¡]M.,Ë|͇LEexí­„°!{… †±áïøœQuüÇûÿ7Àp/ÕI‡÷T¿ÞÆXÄìÈQ8YðpÿþGRY±ÿY‰^Çß®:zéçE)]q¸f^ õÚNÎØIžÞ¬809rü~‰ 1j¨ž/iê6þŲZ}!971WÖØ ÷$Ž•Æ?-᢫ [“01&.$ù·½ð†ã¯Ø^¡°ž0[çµJ› x­›ˆm“¹M#rWtŸãøì5…^·9žª3|ä7·$EZAæPšË›>µ ž?sµžyŠ®MøÝv­<°SÕ#C»eMÈ/M RÁíQ€<•7Þñk%ÂÊØ¦üôñè¹*Ì­¹Za3¡Äªþ‚ ˜žÍW°ÒÅœ ‡[÷j3sOÖN2¿u8¸Wç…k/¥(a¿i];™Ç“§õÏÓ7‘¹=: #Ëï±òöœ¤3ªF&2Âtðº²ô‰?¿_B…Új3>@keb:8Cyúg-Çô·(ä½K9ÆÚÿIû†š”÷GFu;×¹Ó7I)˜ñ©P§À—*S8ÊÿÑ<úyºH³0K²x´R©„N&²ÿW+ùÍ! óŽ[ÎŽ@CA²YødÞ´ã«Z6ûKÙŠŸ”åUæ? c@Þ endstream endobj 437 0 obj << /Type /Page /Contents 438 0 R /Resources 436 0 R /MediaBox [0 0 612 792] /Parent 418 0 R /Annots [ 443 0 R 444 0 R ] >> endobj 443 0 obj << /Type /Annot /Border [0 0 0] /Rect [378.5671 462.1484 522 473.0575] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 444 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 449.6038 126.3637 459.3007] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 439 0 obj << /D [437 0 R /XYZ 90 720 null] >> endobj 440 0 obj << /D [437 0 R /XYZ 90 720 null] >> endobj 441 0 obj << /D [437 0 R /XYZ 90 579.1247 null] >> endobj 442 0 obj << /D [437 0 R /XYZ 90 553.6535 null] >> endobj 445 0 obj << /D [437 0 R /XYZ 90 342.9007 null] >> endobj 446 0 obj << /D [437 0 R /XYZ 90 242.4267 null] >> endobj 436 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F67 89 0 R >> /ProcSet [ /PDF /Text ] >> endobj 450 0 obj << /Length 2670 /Filter /FlateDecode >> stream xÚ½YYܸ~÷¯˜7«‘‘V2ËHÕ:ÜâIÚãV´MÙàñxK‘B$¨X3T¨à=©ÚRV#alÛºíxˆªÇçºêoa2ƒÒl7Àä`W_Ø5üì IP²`q‰”&epw(퉓é‰9Õbn\«º)¢†V7¨S£‹ ™ Ýð¶=NN> ˆs]¹rRœh§è½íƒÙV~<[Oyé‡êŒ_îU„“Â-†YóŸSVk%áŒBÉÿl´I¥q¼ð‚¯[mÏV;¬)UK‘Š™·‡2ŽR®{ÇÜègû€e­í "h=ßÜOç:ûÝ'¡Çim;™Gðk±])™§ó¡ ^ç­½F‹õÃa«´¸>”OÃÉ_¿uE6²nWÁ÷Æ –ôË&ISŸ¼©¡9D$F<·„¿or”@x*­šÎra%“ê€õh ¹³˜ÇCeãÑ{r’­´¶i»w©šÒ²éJóÙïÈ‚â¸:’÷˜ÁÉÞá¦^•þçrpÁ‘H¦Òb@ÌÊ+ù[ûi&IðK9´/‰ <¶4»²ãñg²÷3¿ðEt;ærDä9õÏQ8FÇrc»ý ¿ö£ï—¤† pQò-Ïç²ûY$,¢œHáäAW~ñhO†G™ÇŒ Rµˆ¢*¬ :Ó Ï’‰ðîm‹;ܺ’;3KÜ3›=®¥±ëï)€ò˜¾›);&ïøfž€ÁW¨àý† ØÚ]VÝYfy”eàì=¯ÞêwoÞ¬y™ÒÊF/#–Ë«†Íœ<ßhÅNl[F_wHÊU¨U-’e–!´¿´„ÄÝU"ˆ‰WðÉ–.Ák,)M’ßr¬¾Íbõì %2·>놼¹>_ʹ8[ÑS:0h¼4•ÿD€hOàœqÁÚ£Øúrp_02ûp«DÌ[â`GÖmø¥E ’Çá›Ïi›=gŽE;oű÷V\ü¸aüÒq:Cñˆl=T¤y¤âÄÙÌÛWWL ’¤1"Ñ^èÈù—Óh l6äZ,¼²i]Ðwޏm÷ÏRÑ-hç $T¤ag¸ )·ˆ9é©ý×L/b DÌ T†¢ú­ñ„è— “„,€Û±lz`‚f ƒB¨f4Ibá‘Å"’nâøïkµ€‹3@$½@Á9ö 7û§õÂnR«±š«z[ŽHÄxª¿«Zxú >r¥ðôAú‘ò#ýqUV€l©„S`EWê&Ða:/32åZ‰yD¿¦7uʳ×䵆å}k,܆˺~Åø¼k’á.ÜcV™øª‡ á2ý~EÇ^©¿Kå *eUÈoQy¶¨ìb¥‰¸ìM}UåH´n¬rjÏXc”D™Ìœ¸Âü—÷û}ë%ŠY¼£÷õ2“ðQE$Ü>³yßÚIò"JŸÎëuçnþÈ–²ó¨c9Ó0ø4i‚Eq=tѤËí%– B- w¾¥E4g§fZMQ1Kª(—ÝA5/ïß¶–Áº€âȵV@ø¹§X‚á`†ul“€<^ß ¦:M©˜ÆNÙÆåO^Œ±„KLM¢ õ=;Л~ER)ò(iñ3î"J‹líÔœ–g"*T¡æ7>7úªIo<õž–Ip½xº¸.HÈuìk‚¥µ CF2×NU¿ñÎx+÷¼áCÇNæ‹=üH© tY,XÍP'rì{~úú}É8´G›)5ŽcËÄŒs *|s;Î…zªSCÆ@‰X!÷ÜaDyC›´/yþ¾ÃGÞ e+FJ²LwæyõšŸ[Ó[ªÇCIý*Z¼ @*N#ÅÉsÃ8VÉs,TÓQ}ëÓ“‚ª|è×®€;/›5£/ºÄ¦L]ÃošZ_½š~®ç\¨óæÑq¨Ï>·™4ú,¹K\ÏÒ_Ù¾S¿È9œÜ.µYdpêOZð}kx(Ç—iãŒjO×8shÜ®®\]KÆ6[R\dÀÜð¹å.[}¹ü5Lc”©†ðžFJå9þÜBÓ“ŸÄ<]8%\ù]ì’!—È[lõ° :‘bÙ?€¤Ôˆ½ÌÜ?ÞZS’~ç)–™½m§&jy& +¤´0¥°"‡ø±þ3Ÿ§ §„+gºdˆ"ÜúNp=Zëe¯êì & ñ¿ÁYÜÙæ ½<›ïûÊѸ‹÷üì‰tµõ–=wSôE7%7LUðþD¿ r¤ié¸6¶Mî–tput¢hVÛ"ñ¼!òSÙR÷øKåŒ<]a;ÙÃ/žN5ý=rR¿ƒ \îI[„ÂÓç!CÙ¹›Ží3›\Ð uÀ\pH'ÁUŒ$•ݹ?Œ‰ÍÎvjµ î&D›Vc‹-¿bg÷±¸»ì4“>ƒû¥uD,ßüÜ7“9u'ÐEu/"{e ‚iêí©&ðY®ÃÔ?#…bÅÔædaéÀA¢ÚŸ`Òà ìÀÐÈX— [ ÈŽG7U-½çç”r¡#œ¦Î;> endobj 456 0 obj << /Type /Annot /Border [0 0 0] /Rect [413.2164 173.6116 522 184.5206] /Subtype /Link /A << /S /GoTo /D (Vertices) >> >> endobj 457 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 161.0669 126.3637 170.7639] /Subtype /Link /A << /S /GoTo /D (Vertices) >> >> endobj 451 0 obj << /D [449 0 R /XYZ 90 720 null] >> endobj 452 0 obj << /D [449 0 R /XYZ 90 430.9548 null] >> endobj 458 0 obj << /D [449 0 R /XYZ 90 152.1006 null] >> endobj 448 0 obj << /Font << /F51 9 0 R /F67 89 0 R /F52 12 0 R /F55 27 0 R /F72 6 0 R /F101 455 0 R >> /ProcSet [ /PDF /Text ] >> endobj 462 0 obj << /Length 3382 /Filter /FlateDecode >> stream xÚÍZëoÛÈÿž¿Â¸~0Z —»|]›Îëêâ’\k‡"wh‰–x¡D¤bûúÏw^»$%*NPàPˆ–ËÙÙÙÙyüfhuÀ?u–g‰Ö~f’äl±yÈô§gJF3 ˜ I^Ο=©3øY©³ù݈É|ùÑ{µÎwÊ늋™òš‹™ÖÚ3ß_ÌŒ1Þ‡ðæ‡qÒxoa\V…}HW7›¼k/f¡‰CãEÑůó¿?{3wâDaø”ÀHò”Ä*0ðڜũñ•6‰ýóÄ!™· +l¿…g¨jñ9òò† p¼­;&j÷xÖ]UÚÅKž¿/»5Ž´×­eM}{1‹"ï7KÙÕ—¨”ØûëÍE˜zŸËâžÉõf·ï,±Èàdâ]>ãz¿èê¦EuÍn¦´¯¢€ï$'N°æ » aUÁðñ/p*òpήƒ„Æ»iñ!öy‹Ä¿Ú֨愫…h·–xu¹E‘:áRãÃ=þ—7Ëç‚״岸ƒaƒâÃ=í¿¸–kœ1¬FdП¹é˜e)ÈòX"É^ÄGCõcÅ,ê=K\4‹ª†…)hþût_ºCƒýÖͲh|bàÔùi¬2âòÕf2oG6’“rŠ®AÙt€‘4xº¼& ¢à% ù{é\…xt$Áº €L]â ±$\:¾Z•wüêè`î§ bì/aðò|)’”"½ã¿Du5‰Û•õö´]-‘÷óåžµ´hê¶ewÆ‹ýéùò3üÚž¿MÂ3X€¢ Â5„Ú×Q¤‰ñq/EÿÇà&±öæ™öš|ÛÞÁiazƒv‹~‚Ò&‘¿£wåBœ„v;;^xâÇZóUÝÔ›u¤?]!'1l%‹º%6y'¤æÁð )Pá8qçG…0¸#÷d‚µs¸zUl‹zßmË’ýH ƒ ËŒÓèOHeCrv‰ØLf |qË%]1“RD³‚¯ÐOÁÐ!·Ì¸ý9£Åª(§¬Îå¯XÅœ#Q`é_8Rü¹òùí|]ŠBáÁ9)¬~`º…8qh͇· ¤]úÕLºÙX··¯ODr¢C“ÞC4ÇH–y«†2ÂÚyj‹¹. ½²;—Ü÷EcŠàÛVî¶-˜Y|”1)[œìŠ-÷V—Å’'(¨F)^ʺ8Ì»äq„vÍf) ÀIq ~'iÞÓg¯ö›-aq¶«F–BD>ö{“›¬äøƒfèíZ¼}"äIlŸL‰sâ@AOÇ}`„ñ¼¡EU. °@˜‰NF@TSE,.µ—SIÄÂÅb$¢±­˜“ì›ïÀ®(í¶–íÅ€ÎÛ˜s2ëa2­òÕc–xOÙ;Æ FɪƒS8¿%MÂ/ú .½²FãŠQVÇîFaŒÛ™n}ÉY:u#¢Ä¸ÖÆ ¤V1ÏÆ|èÊZ×fÄB«">剃UðªÇ)“ .Ù(ó­X•[bC‘kHÁ6 Œó+ˆ:áŶ'¡{Ö!uxÚi„¯uèŠFŒË."ÈÇüý‚vüs5|±ˆï}Mårõ (wâÛ"–(?‰mã há PÁI.µqòTYLo‡áã@ ü.{†: }¬ÐIà›Ráb/ùõ qèèfC‰îá1Cê+@]ê¤3¾òc~œ_¤鸕!‡`ÿÌì–§"ÿ¯r6B+QÑq_T%‘¡ðLG‰¯U NôF-ÙlH7Õ=d'ޠޝkM‰È¶7àåŽS7ÁU leHR¶¼¶bÄF-7Bgƒ*Òå–CÝÒ¾´.«GQDƒ¤AhÝú÷ê„«Ÿq`]ÛÚMmU[^ER¹0ä'ƨ¥çQ ’¤ƒžP⽡ºÇž„ʘízëpm=ŠïŸ™‡+c¨„ iÕÒêu1©‘8óÃP‡ß¤‘•@ÀÔå#Ü =ø—@¬‘ è™t±ö ì\È !gX¡O–\¶<×ÖÒ£q¿èê\BÝàlÜÆ$®öö2¶0ñX¹ÊÅák}d¥4ù;öµ€j$k¥ØæR SU=JÅ4,¥2¬Œf€„?*¤ÞÑ|kÙ”rÙô>A¸'v,‡%~µùŠ껜¼9€€u?òø§ª3DÊè“Ýrg­yäcæByï`ULË/#ïêæÕ5…Šk~Æ;“Ò׺aqb ¤óQw…:9ve!{Þ²[­¨[/ïKê³}¸B8ß·{*Ø}ŽKC€=ŸÜ9¶L‚†S°\Ê[ù“ža ƒ›Ô¢ Wÿø×ÕëIwMáÐDñ¦w5©Ì~nI¸ /TOû"€tpJ,T2Z_^¿¿úç¿§„Ñ\baœg Ì].lº$$[iPQ¤mÆ IÞ‰ª"krBç€úù(]Ám58±—˜­Ý9¡w^m»*°Ê¥£ûªÜö¤ùÝà{å”F Îî1ãS Ñ…¨Ìû™šlÕîò…Ý•:% UÎ?m¹]Ur<Ûù ÔNäeü ‚Y=Žk}ÓO$]ÖB"Ç––dY$Ð.äÏ[oßÂYÂÈÆâŸ[ (3F6<õÐÇÃ%Ý=ŽèÂî'û.(}EÑNr¤â@¥“!Á~mJ×råIÎnK‰2ð(À–Ž»*š–g]§LǸ_Þb‚ïxê'°Aùÿ›°'S€YE5Ä™KæÇ&]SË ÞRÑ1ó\Í\…¾,ó/|E%~Ä 3J¿ð £..!dô6uÛñ¨-WÛR }!Ââ,çül|8”å0nø\LÌ× ÆBÏþöà.ô 6,?;ÀUÑ?òøœ?˜ á '«jûZ4wÞNEWÛƒ¾¡Ra¦Ï[1×̳ۙ‘ 3¸Aí]7eËU±í>nj*бk À?IjPíËb©8ælÉ|T¢ŽÇ-9ª ls0mèÃi;Dƒ\e¯˜ê Ï÷ __ÓëkÞ¢ßò’nüçôåÌ}\qú^o@*Å¥NÖò Vö›ûFÑ'ú"÷ý&xýH9b¾ä,ưfÐN_tòçG_00®SO9•²Œ;‰0]< à@I—DYSûjµè#Ÿ_ŠY·ÅH@XJNíQï(z™ F‡£8cÀ± T,©9QŸ;ºÙpò¯{Žëóës(¼yømËl|èËì$òb}(jAõ„f$êDíèžõ˜¡Ô¥aOé J3¬;zJWŽîIŽNê*]¡õ+µh+>Ö(pŠ@§OiËÑ=%ì1öM¡7Ö(´g¢ØR°Ä'´çèžèˆá´¥¸qÏ·w‰ @d ¿^Úf›(ó]rÜíÉ 2Aµe°ñƒääŸÂ9ºÙpÊcŽ2~%©3íŒG€p„Í´4)éŽë?ü윻¿=1¶Üâúƒ¯‚ >a´)ìGéRg̾Ă…Çf&m»¦à¿½j¿?ñ) `f<†?^ß̧ɶ¾àŸwonþ6‚Àr%ÿòåë endstream endobj 461 0 obj << /Type /Page /Contents 462 0 R /Resources 460 0 R /MediaBox [0 0 612 792] /Parent 459 0 R /Annots [ 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R ] >> endobj 466 0 obj << /Type /Annot /Border [0 0 0] /Rect [382.1209 367.7336 522 378.6426] /Subtype /Link /A << /S /GoTo /D (Transformation matrices) >> >> endobj 467 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 354.5829 175.381 365.492] /Subtype /Link /A << /S /GoTo /D (Transformation matrices) >> >> endobj 468 0 obj << /Type /Annot /Border [0 0 0] /Rect [108.7526 134.5011 252.7024 145.4102] /Subtype /Link /A << /S /GoTo /D (QUAD) >> >> endobj 469 0 obj << /Type /Annot /Border [0 0 0] /Rect [277.6085 134.5011 411.1038 145.4102] /Subtype /Link /A << /S /GoTo /D (OFF) >> >> endobj 470 0 obj << /Type /Annot /Border [0 0 0] /Rect [456.5807 134.5011 522 145.4102] /Subtype /Link /A << /S /GoTo /D (COMMENT) >> >> endobj 471 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 121.3504 198.9395 132.2595] /Subtype /Link /A << /S /GoTo /D (COMMENT) >> >> endobj 463 0 obj << /D [461 0 R /XYZ 90 720 null] >> endobj 464 0 obj << /D [461 0 R /XYZ 90 617.6819 null] >> endobj 465 0 obj << /D [461 0 R /XYZ 90 469.3821 null] >> endobj 447 0 obj << /D [461 0 R /XYZ 90 319.8702 null] >> endobj 460 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F55 27 0 R /F52 12 0 R /F53 214 0 R >> /ProcSet [ /PDF /Text ] >> endobj 477 0 obj << /Length 2560 /Filter /FlateDecode >> stream xÚ½YoÛÈù=¿ÂðK(Ôârfxz“©›^¤ ö¶Y?PâHbÍÃKRqŒÝü÷~Ç ‰±½-P0çøæ›ï>Fâă?q’x'‘RnâGÑɺ|á™åÛÂŒ–±ƒüíúÅïq"<7ñqr½™ ¹Î>;»ôn!œN/–ÂiK¥”ãŸ/–¾ï;Ÿ>ÁÎû¸è;ï`œÚNbß©›2íÚÅRú¡ô \Ü\ÿôâíuON åS#È ÅrL±±%Ipƾ+”Ý®ë.àxà¬ò*mxœ¥]Ê£MÝð ÔíŽG;ÝháY HX åŠÀcQ|›[ü¼æÏÏ¿¼ùû”àm¯ÿˆ Oñ#¦«ÃáÞÑê÷è;Ô'BÄA rC/NôcÝMu;Ð[Ú±bß\]\‚¾bç’ç,/5ºEØp‰œâñ¼,É22Ô~Úéâá7uQÀR½‘sŸW0Üšû`¸3wik.^-àÒ¦I9õƬÒAÒž¡§ƒn!ÃOÚ!iMZ`zg &9y÷VT?òÊ;â­n‰•vVh¯~ì9]Í0ºD‚W9:ã½5B×†Ï íFH«6GÞ5OS>Ò¾D;3"C!ãfï58©á® pþ­»úŒøZ Œ]%SÕ’–êývÇ’Xׄ±ÔLŽÑE™’yB^{ÇŒÐíÆw2úŽõ°c(³£Æê¥G°A }¬ÅÌ…Z!ïyµ=Ô%n º$«c]þð.‡V®— 67¨Z¸*JbâÝwµ ÿ H+TÎÛr¡<¼X¹Yf,p©":8†P‚Pq¼&ñ€_¥UÆýµÓ )3-–ø5šc:MÏ1 CWk´sf,Q)6Å«-EFb¬[^èH?#¥´¼þ+8¸Á<‰l‰r£HÁˆ÷ÃåÕõÜõRÂ0Ž ÔÙžÐRX<—ŸƒHL\:rd^i¬\Ùª~mヌ$Šá¾îv(v¢|B‹Éâèêö Uá}‚Œ3_ãõ;„÷3'êîŒ8Á¾ûn$Äÿy×Óš"?§|%É|°¢­8äá¨í–@ŠDƒ‘û`¼$4£€(†='Uj"áÍòö–7~õ„³â mè`ÂÍ zëÝÈæ¾bö9~ î ^:“tANßsFCý‚Þ—ò˜BñÌøè`¨­‹©=pÞÐÂ|˜Ft"²[Š1E[óvJ²“P¹À[]³4:´‡ƒ´Ó­!o%[ïCe­kr¶ºÒ¨GÂÓ>pL¿üíœˆÄ bO²Æ«ºÞBX¡ãÿÕäÙóó×lH`F`ÀSÉ~æì{úû)nÔzŽ ' ™Þä•6ðíC¹ª 6‘á¼7{ÉçÓ×§7ãõÏ+*qõ-š¼îtf´©"N¢©v,#IhA}‡7å5¤> A£´8ç/"tÑëá9±ÁÐóE`@2]Õ}ˆ²÷CÜ¥¸Óå_ˆrŠPkBÈã¶²l¨zL f7ŒR"!:LÅ»w¦5Õáƒ*·=”c*®5Bì~4ž"¥@É™Ò 3vÒÙCePÖ„½Ã%ð=š`1ƒßõ¾19g+2‰!í¢¼å­mŸrn6ú·=šOƒqú|gNÁ¢Ï™‰ˆ;Ê“|ÊÞ•WüMùS¤Í–ò-Ò[³¨èÜW´º³ÙÄán]îìŽ(¡À:ö|Hwi3¬sµ'mª)ho;®(縠u³?©Àmg‘ÙLes‡éJÞC~Að/¹¾ç!O±êQææQ§0e]ZŽRŒ?J¦o5¤´Òò®°Äž™´wïQ…k ‰)ºF©ßÛnÖÄÝ®¯—l#D3[õù¬7NBh2î<9Á˜0O¦D]$u¢äL?9ê=çºL^=€Ÿ¾¯R”—ÒtØ#ÿ)óÇ”A½18¥zçfù/:Ûj{š>TnA^™\‡©TœN` Äù!Ãß¡çŸo/®',ÉéÛ€|ì©À®Š sÙWÒëÈAöŘ¡<ü>_à’›òŒW†§oÒ¤º\¢^â°DœÚ°‰G4ùæ ß9­2ÑÏ܉ù/”IbÃ;BwãSS‘—Ë e{ê#M”‚·”-÷-à i«¾%¦7Œ<Þ"†h’ÛšýµZÔœxºå…I?C†"uƃ¡H”aüü²f6 @¬¼'*éÙB¢>({jjE‚óGÅŠ÷ì6a)J¨ ÅŠRŠ–*鬡Sêú.\py3+…Àsƒ(}É@qb†å»*TVdu‰ó†‰9 h}iÈ$åæ]¦L_ù´¾^0-ÍåíÑ:ΟøMùC™mª(xá8cáË¢—8ÿ¢š­šœ&Úlþª ›-áZ¬{1cm— ²®Jg(ÔУÆÎø`·ÝÌè0“^ð†ÎPapãU)•—uÙ÷ަ4%ÈŒ³˜¬†Ùs«³ÿÂÂ=Õç÷Uë+W}ð㛼5uåFq”jNDÅU-€Ø~ÕE6=7©pa=7ø9"³7Ùè5lŇãFßéZ›™Ít/ÛîÉÒ]ôìU‘Ï2æQQÁ ½Åžs¥õáO"ö!¬+jâ&¡¤Ÿ(`•vG?cX°ånæÇ—#tô ½?Á”E®t*áy8WÐ÷e- ä†2å[Í„Œ‰†Lç ªg~|éáž"û¡ Ú¾p®†Z÷ŽP¸Ò%> endobj 480 0 obj << /Type /Annot /Border [0 0 0] /Rect [184.263 107.2355 334.1365 118.1446] /Subtype /Link /A << /S /GoTo /D (read) >> >> endobj 481 0 obj << /Type /Annot /Border [0 0 0] /Rect [361.2478 107.2355 518.9697 118.1446] /Subtype /Link /A << /S /GoTo /D (hdefine) >> >> endobj 478 0 obj << /D [476 0 R /XYZ 90 720 null] >> endobj 479 0 obj << /D [476 0 R /XYZ 90 570.6061 null] >> endobj 475 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 485 0 obj << /Length 3346 /Filter /FlateDecode >> stream xÚ½ÙnãFò}¾Â˜<„Ê {ûà™äʳH`lÆ»/³y ¥–Å % $5#È¿oÝ$%µma±X0›Íêêªêº[êJŸº*åUnŒ(“<¿Zn_I7ýá•r£ â9È7·¯þöCª®”¥,ÕÕíúÉíê}ôí¦Ú/T4ØE¬¢nc¢äËEœ$Its_~ü'“è×õ/EµÝ¶úE¬“L'Qš/~¿ýû«ïoGrR­_"A^¢XÉ>'WY‘e’”Èþ¡n€"(0©Œ:[­`””Ñ¡¯w÷H `ÒsLy)ŒÎ ØQ¼þúµ:ÚNðÌ3Tu–Ñ÷íá~³ÐE4ð&ÿ–*éú?Ö;ž6L”IU´Byuv9´Ý#Cµës(DoÛåaS/q“ãÉó¸öƒnœrÌ-ƒz¤*Ú¾E¶®b¥RÜ&02B¥’Ï»^ãÙʨÚ-t=~oeBø«º>TtŠVÃ[xËò=~ÙµHÄ÷ªÆÖÓÎUç‰Ç¹}5àÈ ¬RÙ#€µ§:b ˆ;“ÙU–à0*œ}ž)ÊÏÚr޹~çP·;&,Zd†Çï›¶Â“Š‰ZýîøÝW÷–!”ÖgŠ-S‘i©ˆi·‡{‰ès„H4ˆM1 uÏGš(p~¤‡Þ®Ä"ÎÀbo7Hµ”ÑÊ®«*ÖÀïþ€` Î('+˨ík?ô FZ½ ›R‘[ZÃûއ£H@s@ÀÎîœQЮ5MábÖ{ð(P•ÁR»{ß^Û-büXÛþ°"=¬Hò˜s·ß’¨%­¬Ù%‚Vì8b• §†–\ßW¤åHV’Áá"ô~ ø°~_-ݰB ŽMÔÉ–_îÀѸ`LÞ¡  ¯ïw8@!.+– m“¶UÈ!éB‹47©÷H!”Š\çÚA|ÂR ÃçpÀÐ$Úû´eK¶»%Q‘zfc[!ÑŽ¹ý”#,h iŸÑ`7yq¢}ÌèãÃèF%˜ à‰D NP'BBÈ Õ‰@HÅÿå"N3]ãÆÆ!©–`°[Ú>ÄêDí¬æGËìÙ¡«IÛµwˆ;úÃÓ6´=Àƒ‚Ž6ÄûGügùSEVг‰ŽÕ¤ŠÎýNBAˆJ3©/>Ï™Œ‘¿ÎÔˆ,ËòçP"—Ú+i÷šb3z<Òt]¤ Ûć]ÖëGR×{æ²ß„I€ h»tàùäu 'Ÿæ'‘„‚ùKsÛ´!ˆAØ‹×]… –˜4úس6Ä9Ä+ShYÙUÜ: =$]¾ªû=÷ ýÔèB2IFDx$ølwéõ‰9+@¶PÔ»#“_…< y¤Žb=¨ d½I£?,ÅYŤ׶󡮶ÄÐ[ü˜FVÜ Ü.-*çhI¶Œ u ‘PÊåÎIf=å¤@)Žéô%è˜I¼1ÿòó»Û`>¯Ì½R°­ÓF½ÛcS ¼Ë°±žªQб·x) £ÓS‹_º4°î9aÄ•kj»âwb¾WxŽ›ÛÕ[iÎY/±£aXx¨Ï{Æ¿µ[”ñ“í϶ЭK¡Mžw-ëf1ñ<†G¯@qg› µ„àöø©uGÖ õ,ù$4¬fåäü{?­y„N2Ú´,.öÛj˜dÀiJŽÜ\ŒòmIÞ:½Ü‰±Ã€(òDÚm2!1#{>@¥2K¼W|"ZjaÒËcå`?Å>m2"UzlêNVBJù²a¨¤ô ýᮺƒ·ct‡Îz¿—A¢q»(ÀN>¸ð’H ‘§s©š >Ñ<ÛÁ}æÌÄ'k˜-ê íyÙÏ4­ÏÞg(g¾Éü}ytÍaÜùûR¤PÕËë~X1ªjôŽSTÅyÉø)°ÂËh¸b?ÈÒ…Ñ©œa`¬JÖ#xÆ["؈ÂÕR»šÌ³ÝñgtAµ—;NÔ­O>qnÝ6 ̃/pÖ~ª¶ûÆ~NÝD^–Ù±_ù“ÓÎ\¨BHÍR(=ÞØÕ½›ù+ÈÎ|Í×k¨ÅÕk¿rñ^Ç#Å9>b³W3ŸUǰg&Bã ›…l!Š4=ÖIЦ|,gOªsˆ  e^0º¹ÁŽÎõ­çt¦y6«‚kÎi¬ƒè¼³r»`N$ÍTf'•…—ûÚ'…T· 0ö#Ácøi² X°«¶.6°œ|rBqÛ² Uø„qTNÖ`äQÏTU[6„“UCôW8°Df”‰~¢ªáâ9` @=GxTU#'‰P¢dÊÞ¥¿¸"±a…md¡QS‘mÀ/¥ÙYc (6{æ„Jlögè|Mùš‰ÞyBÏd™@009„¯d9½DÊ9€,AW&Yž')c~æ÷dåÊÆüŒ¤ |qs¥üLÄ*Í9õ2¥î²'d<ÂÅsÀP§î !’ãÊ@°ú¹KÈ2¿rr9åÇ*?yÚ¹ÝX\BØÅ Ÿ?Ø^Hõ:J¦¦I'þ4q¾ âL·óI<‚cp߸¥+‹A‡>O˱χONÖ>aw•“\ñL/,•PeÁšLŠ<“OµÂ›G®‰ ªõ+Ghçš—Éó®Ÿ`‘æÊ$p~J>iÝ.ž»~§'ûi(§C ê§3gƒÄ"£~OF.ëñbûÍÅÈGlç“còhࢢoËYÃ…¿ÍªËžgj÷ܵ¤?LÙu¸†±ûk0Pq¿ÇUÓðLˆºÊe3÷«Ñü6ÑÚ£ÿn¹:›Ò¶Ý›™ãÙùË9ëñ8†mÇóTØ# ÀRâµ­'z± yÆ ¯[·ÔÞ=`÷¡Eȸ¡Õ€† &øM«S÷‰û°i{d¦\8hÍ»]àWoSâplØksÒ ~ &›$m úãEŠÖÜñ‡'—ؼ­èª¦ö”Çr©È3ÏÄsSæØWJ ë,DQ&O5É=X<ƒ YË)º£„´€u0Áï¿©zÌkpü3·4Ç”»6¾E””Øw×wâb~™Ìb>š.ÎÒXš%RBŽ%r8½'ÜÂÏCiË©¯n ͱԑÊꬅ‰j[¸0Ðv³f3*÷##mÆ[ –ÎC:{Ü£A®7U|× û—‚¤¥Œ®!áurr½ˆ’P:'*yÆÕüºà´]nïç«}¿i×$y¨g]˜z·l«Éu“•ñAÖÃèL X\Šå0ö9\?%ÁF`¦}Ø&z~²Üòÿœ{/I¢‰"|r寎ÌTÊÉÌQ9‡K%*¨GHDxXù&&^I¹)w›TÃV˜z¢WÁÏä‰. ÞP¿Þ!ä0èyVF7 ”áôžNÞòéõÝatÇ(ḛ̂÷†çÊÐ-3Úvƒ» Àƒ6:ºöPý¡jðÄa÷ß%‰_Ý]„Éøv¡Ÿ†]gËs0!¼&úÆ]æ4–"ÓDéŒWDË×vþ¤3í»!Ÿø\±Ž¸îÆ–Áiuœ)wìÕ¼ ß´*Üʵ]°\fêâ¦Ol@‰ÌŒÍ¥ Žr¾ yv5kߎy“Üò4ùH|vü¥…Ð|$´'K¦/CíºêI9þ¦•JB§ë‘°…GG¬Q¸vvìq[œÎ››÷Îjðeà륻ÃàWÍ ËüÁ“o¥¾yu—BÝ+%´ÒêbÙ.dÝ«ÖK„ l¿íÎÂAõUW7ÓÖíª‡?–mב°ðp@¿V9mç$Ør”檀ÊH—©/f ‚÷µ¼êìÕzÖ×ñðñl5ÇFŸ$"/ ?gÓÒ¨9ûzI½¦·î@ŽF(B6ŽöÕ{!P³ø¢cNƒrª zŽ­ÿ4§† endstream endobj 484 0 obj << /Type /Page /Contents 485 0 R /Resources 483 0 R /MediaBox [0 0 612 792] /Parent 459 0 R /Annots [ 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R ] >> endobj 487 0 obj << /Type /Annot /Border [0 0 0] /Rect [330.9606 668.2565 505.6202 679.1656] /Subtype /Link /A << /S /GoTo /D (load-path) >> >> endobj 488 0 obj << /Type /Annot /Border [0 0 0] /Rect [226.1643 403.667 388.345 414.5761] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 489 0 obj << /Type /Annot /Border [0 0 0] /Rect [419.3706 403.667 522 414.5761] /Subtype /Link /A << /S /GoTo /D (appearance) >> >> endobj 490 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 390.5163 157.2728 401.4254] /Subtype /Link /A << /S /GoTo /D (appearance) >> >> endobj 491 0 obj << /Type /Annot /Border [0 0 0] /Rect [502.606 358.0336 522 368.9427] /Subtype /Link /A << /S /GoTo /D (Texture Mapping) >> >> endobj 492 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 344.8829 333.3883 355.792] /Subtype /Link /A << /S /GoTo /D (Texture Mapping) >> >> endobj 493 0 obj << /Type /Annot /Border [0 0 0] /Rect [397.5604 286.1667 522 297.0758] /Subtype /Link /A << /S /GoTo /D (Basic Interaction) >> >> endobj 494 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 273.016 213.6416 283.9251] /Subtype /Link /A << /S /GoTo /D (Basic Interaction) >> >> endobj 486 0 obj << /D [484 0 R /XYZ 90 720 null] >> endobj 376 0 obj << /D [484 0 R /XYZ 90 604.033 null] >> endobj 483 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R /F53 214 0 R >> /ProcSet [ /PDF /Text ] >> endobj 500 0 obj << /Length 1418 /Filter /FlateDecode >> stream xÚ•WK“£6¾Ï¯ v¶k"@`œÇe³$•Ú½ø–¤jd¶b@”$fv’? $@,ÃljªÆ2¨__wÝ<¨þï½C#:¼¬ºƒæñí.0'_Ýð§WÞžî¾û^ÁïT8JNùÛŸ¯¸Ù[Iv~°å;?Š¢-ú~ç#„¶Ÿ?«7×Ñöƒ:Ó’Ø/)Ú2^a)v~ˆ’mãt÷×é·»÷§Á8 _rX_Yð8œz"Ç4ô’ Bqç÷뎷¢Æ¸2)€¶îùA€@ŒÒD ˆa¤_k_ËŸ¤Jƈþ cøŽ©ÿAÿ=çøÑ(my32Hég$“Œ‹Î tµëk"Ã}S©C‡Ñ  ?4ï>Ò|ØÆÜÝ­cå½í]eÌ~8ƒä2¯NSó ýBJ[ˆ9î×ï< –Ù5§v[ àø&£¢=çôÚañ–üC‰É\§ Œg9¤Pž Df¾?,y¤Vz©%¨]<~Q m;Ûåkz?'ÊpGq?¼\|TÚÚnKËv¥Ý=Ï&VN°òœUŽé‚Úé<ŒÌziÛxmXâþÞuöÇQ ¨º¾é å€$RÛ•Ë %ݾ>ÅWg½‹Xo‹RÏ4;c2¦†Íô…ÅVr„Ad>c÷û’¡ ÑjêåÄrë…R›ó¹l‡õ¥jX­·ÔŽ“µ'C˜ ™9Ùù;³Y÷¬8„g)p˜×‹P±ÒÛƒHÃYÞÚÝËnÛ7¼Ÿ]û:úý3¹vj|üý1ÆŠ5Ýk€µRÈM)@º¥Ó¢hÕvú«ÀÈ™¬È)çjS¯1€€é1]ÄZWȯõ7Í•Šåd½ù9¼’LË:C–‰Ýéûœ÷C=úcS‚¾ ÷wò0(…ÚØÛÒþàx r½@ýú‘~ð endstream endobj 499 0 obj << /Type /Page /Contents 500 0 R /Resources 498 0 R /MediaBox [0 0 612 792] /Parent 459 0 R >> endobj 501 0 obj << /D [499 0 R /XYZ 90 720 null] >> endobj 498 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 504 0 obj << /Length 1232 /Filter /FlateDecode >> stream xÚ…Wao¤6ýž_±ÊIÍ®´¸6``ïtÚªW¥:5•šªR¯'fq˜›½UÕÿÞÛ¬MÈFQdãñ›ñ›çY²ÂðGV;¼ŠƒíÂ8^¥ÕÖ¯¯ˆžy`áÙ&ßß_}û’Áh‡wduŸ;Nî³Oë ÖlȺç¬ÛÁ:|»ñÂ0\ßÝÁ—Ÿ>/Ãõ˜‹’›‡$\˶b}·ñü0òÃ5Ým>ßÿ|õãý‡úþk€“ľ˜Ð‘ÈOVQ"„tÄÝ5<=” SŸ®É| ˜âõõèšþ_ ±/JøïáA¯Ie)[4„È<[R¬2Ô¢5ï:íÕ§0¡1]vÏ¿6²æuÿN=Âû=ןžXyàšïÅ7Û4t·4ž Ö6fõ„¹S(½i¥¡“`\ùÀÒÇLäù¡ãjŠõHÕˆÕ w̽œ¥ÜJ‚šæfҥ׉ŒgÓ¡ì»ÁÂÉ.YD›«1ã9¤/Ûjw…Ð)È/3cÒó¶’lŒ4 ʱ¼¹Ù,ÂÓ°!5“sâA¶¸ío4.Q5%¯àtM6N³;™÷GÖòé3ÞêÈY]ØÄx‚#Ï\¢Þk䵇Š?žºžWÚ±iaBjÙöÏÊ1ˆP’ÐÝŠÆ¢8LLM†h—}vCÉ­Z¾Ê­5‹<{ÕB•ú4B>õ£(Šã$°ƒ›qh¤1„e%fœḛ̂ý®áS´šïg²Ù„geS0]»ýèLoÙ°Tô§wõßkL-«»2]÷gaõ“èÄCÉaØ:¢ò~rùÏAÑe9¹AŒ0õãYr ~9±ÖХĆ!Šw‰r aû‘“ØÛ}-[“ÖcarvŽ-Õ´2E—‰ŽAxÙ²†„£oží¹.+•V'Ø×ªV;Ñ«íÒÔ”·Ï¬nŽÒª\<ì–*\W­§¿‰: £í±”òqÒZhæôæÞŸÛ ufÿjÉè€ó¶Ø¹.@š” Ÿº½äð+&›¹á'ŽÆ_@Šd—ÂþUvc_¤•Ù$þZ=?òÓ’¨Tlh‹þ‡Âœ endstream endobj 503 0 obj << /Type /Page /Contents 504 0 R /Resources 502 0 R /MediaBox [0 0 612 792] /Parent 459 0 R >> endobj 505 0 obj << /D [503 0 R /XYZ 90 720 null] >> endobj 502 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 508 0 obj << /Length 2735 /Filter /FlateDecode >> stream xÚÅYYãÆ~ß_1ˆ–Ú 6»yÅI;ˆ7 ¼XÀ™§¬0GjIÌR¤Ìcåáÿ¢(jÆ~ ²›ÕÕuõWU-uŸºËûTë 7iz·>¼ eúÓ+%o>PøS’¯^ýé›XÝ©0ÈÃ\Ý=l/˜xßÇ•òz»ò•×®|­µgþ¼ò1Þû÷ðåí·8i¼oཬ¬dÆkÚCÑw+?2Id¼$\}|ø÷«<ŒâÄQô’ÀH² q4•X¥I¦*¹K2(mb’û 7ŒCoW5EB¨0ôªr·ïWÀ5öŽMWöeSó¨ìä)ãSÓV~ý¸œlUÝóp¨Ë϶í,L+žY7M»)뢷ݕ†I  I¦‚T…‘ÓÒy¦4(q×Ú»íD]¡÷§ žU9…ÉLgNå$ö£:òì÷–_6v[ •˜ Üò³nøY5ëâl’îh×å¶´›µù|¥‡é…y×ÅÁ¶ âô%›ŽBðš×ÝÜ|²ïS×ÛÃs{¢œÎ£¿uËåMØ×{ÛÚûåy:áR¶h‹z-ãSÑf-k»!&~Ÿ²ÌñJˆ×/‹ßRùÆû|ÁÌl-‘GÑZÖ;š­–ÄìíOýЊH?…6NttI·®ŠÃQÔ‡H³ó–MËÏ~è^¿žOõ×SuS[˜]fK@Ò‡cЗ[2“FãVg‚n8«§Q?QÃ?"dy(v3¿°-‹ê¸/Î|E÷)8îÁ% _Ü \Ø‹ÖÖë'WßÜu*p5Ó¼WgLz#šn%Æý¿]yr(®1ËDA¢4³ 2¥æ •!ÀиÜ"ºj¹¢(Â$¾‹ÑiÌ5çº/˜ëÒ.jJéÇA¥³ â%{*Y°„Ž’@‡ ®x,ÖŸvm3¸S¨–\8¤µ•ý\Ô‚«Û³ãç¡#1à/PÁ¥C›c„‚|p L‚ÕólŽ<²¬ hDQhˆÙ!žotäî¥ W”å;ž!5Œ†¬^ïá›0ì‹kËâf+ܰT€ãe 5#+úž<cE!{×üÖÑôç²hæQ‚QÊ íz “n„¤ëA˜_ZoS†߃‡I8øÈ¾çbu}s”oÎü²áÌHrÚ—kÜaÏÃ#êÔð–Û1ïf‹› :‹É?¯bˆ8œ1Ò€–·mh:ä…ÖŽ3`²?}û¾¥Xhþ8`b‘pÏ¡jEm+!)Ù(Ì´?µü Çaª?-Z»HÃ… =íáþ?1Qí,pâ1è€Þƒ›^Ýç)ƒÃf‹nÄzx)ò¿dš¡áÓü@^DiJàH·³ÍÆÄé‰')š Gš(ª®á- æè9Ó<ÆtL û#éh:›Ú$•P`õ¥ ,å틞'{·^N6 `¯…øÈÀϘÝÐd{7"¾¯+€ÎíÕ\ì™ÍlާYܱ-¥ÿLÔö%£ÅçUïq àÄ|¾‡–…kákÞ´±cVë"²;þp*û½€÷,Wjȵ:àB‘þ°ð’ó˜‚òˆf-éɧy½Nƒ\çæ9îëcå¸ÃëÝbƒ]°Ä³jƲê͹TÁàlZMh m[•äBjª™~æ%o6PAÒÁ…Š'åòä/‹’C=¢c'„8Öœ´_ÙJӹĸ^’—›‘7¥>6~ %M®f9ö­E(È,G,¡Íí ‰ã3ô5ÕJp&fˆÀ—~Ë™*««Ñêÿ—X‰óqÿ­…XA–"8ª.õ2~t†ÀI;fèµ;~òá,'z/ÖØºr? ³QjV,½Z†ì#–š0÷ØøþÏöèkw<œ¹ &’ÁÁ.[Y¾<Éüè@× "š6ØmG#@Š$ÕÞ?ÉÖ'ä`/-¨a`Glĉ/s\^¼Ôk†RšÌYº™èö‰Ò ¬)¸†À·5<»®2.nñ"—L!°3Á$|Ú7ØÈÊ%`…˜±íŠÁKi!£¶½K_h¤}Uñà0(T õbKHzÃi=Ÿ:ËÇm’Ç#¥<Á-8 Js; ,£,ÈséL€”Šÿchïa•kZ(r Å6´›ï8£‹J ÑÝÒñ@'4$äþJL:„ÂKùiym*t#؈P}ç ¦#Ö®JàB¸í™uwtêhÁaŒÓ waⶃèGß„ë~ÀrŠ $ň¨d °Cïï'ØU»ë?˜§Z ÎqušxßM•}GÈÇF¤%7Yémq–¢ÅÝÀÐKy7l9hc’*œÚ²'N™Àa9T/ãnŽe{–FŠ¥ñéࢅéÆc7–{©äix3$Ï‚¦ß½#u 5¢ ×é® 1ÒéàÛxÌYbžt ðŽ—ú\6‘u¡úe¢Rˆ¤Î1Ç ]e0Pôá2­ÅrÔ3m,ü¥“ë:.€ ’>7D4ƒ›úu#3-­ÏaŠd£´ •<9Z¢’ÐBÄÀÄ宦RÛòªi;öQ½ˆƒ€OJ–F'FÁ\+Ó±c$5¹÷ÕíK5¶ó††ÏnþëaÒRN‰(µ!5*¤j(1Ÿ~>Ó #÷žÚð57L‚1¸Ž.yˆÐÎïkt¦‚ Æ@'1Þ»Àˆ>N.Ò…ÊŸ’-ÜþÏ™Ta:nD¨@…üþá«[Ú¨)ÁqšÎe÷‰…¢§sT”±Ö)À³  –Ìnü<0ÒùS½®º²OH®¼¯Û˘ºú{.2Æ^#¹gpò ¥m|\BX‚AÆ1ç%/Zö÷Ü‹F:I/5^ò££{Iãk†¾Dq Ã)O>h|Ý)Šw¢IšÌÅ5™õ“—4Ò½$î5Cç (â:|Ï]!÷ù™ÿ9´J¹ÆqUÃÙ Ä›öÖ=Ý‚PµàjE*ò]çÌÃîÇa%wQ®¨kñΈ9·x=KÈBY £ J•йàTÔ[éI:‡tç‰3·ã_^ìþê„XjPCè!Ä~'/r)õoK84ÊõïåÙ/ñ‚j:†’+ýs›©>3 á8Ðj˜³qÆABIõ$ෂɯïÆ…å¡tMݦR^DP^pcx¾§‹gZ/׉ô©§“ºsáq¡B•ú’y“`!R¿1:š/âIN”×.ܸ¯JM»¡²‚~•JĄ޿°l‹¢3/.<`†måu]> endobj 510 0 obj << /Type /Annot /Border [0 0 0] /Rect [381.01 142.2293 522 153.1383] /Subtype /Link /A << /S /GoTo /D (Appearances) >> >> endobj 511 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 129.0786 126.5337 139.9877] /Subtype /Link /A << /S /GoTo /D (Appearances) >> >> endobj 512 0 obj << /Type /Annot /Border [0 0 0] /Rect [341.3677 129.0786 483.3026 139.9877] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 509 0 obj << /D [507 0 R /XYZ 90 720 null] >> endobj 497 0 obj << /D [507 0 R /XYZ 90 230.1371 null] >> endobj 506 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 517 0 obj << /Length 2097 /Filter /FlateDecode >> stream xÚ­XYë¶~¿¿ÂÈKdÀREŠÚæ¶’¶¹Hàšä–h›YRµŒ¯ä¿÷pÕb:S ÁcŠ:<ËwV mBøC›<ܤQä$M7Åå]¨·_Þ!½òŸ“|¹÷§¯b´Aa‡9Úì &ûòïogÚn‘7°­¼nëGQä‘§­Oñ>~„7¾›Äû Ö¼bæ!#^Ó]èÐo}LL¼mÚóî{«NŒñ[ ’·4F!×d“d$@‰¥Úû3ë@‚A©^ýþÆa!¬AÓ®ƒÒ¦z‹3o¨àñHÑÖðبeÛ5‚â•ÃV/ð¦oBï(ˆ:-Dœ™| b%åhùÍQ‘·´ÔJí ªŸÁ¨òiªésR˜x×Å0Z}ßÃÛ„x\sÎLà  à9(>R ø( P*_ $t†~"ˆc”ê‚ðEXÌn×-N……È+Á­1‘PŠßË 9KS3CQ‹ßÈ£µz–ÁÓB ?ÚͰى÷¹ÇE×’° œ{ƒ”{êé¦H0µSKiˆ†Jž,…”TaTðCDŒ,ê ‹7¾±q‰‰p'òIbAKƒ8"ØD ›v& Th]ÈwØ£ÃÐ £Ê‡GPë,6+_ðúäòFœÀ2Ê4iÑ(¤»¦ê•*×3S`ˆ•šŸ„à)Jz­—Þë±g%OœŠ 1töÀçšuÝ(°pˆƒ,ŠÒ%Z3ÄÉ£Hq ‚HúÙK)­¡öMÕŒc£‹‡MUFñrkæNp9 €*Ñhüâ –!&©& DÍÁÓ“)ðÌŒ3~uñŠÄJñĪRÕalÉÄVmà+•%×óTV–¦ÉqRgùĦ.Q !Gq€P’™ø‹¦ø¤ ´mœx”WôMÓ•¼¦ƒ9ÛŒCÏK¶b•椗a p¸Ôâ_Ò@1U6‹¥0y·bV²#«a÷@jtã5˜Õv`\é’wiʱj)ÒÌzý,zS¿T™öQ€ã](^í¦Íõ­Ë饤ú­~YUvUCZ×,uLTU26÷ô¢Wmvé[Z°@{}ÂԸLj³dzƒ-㪬ÍOÃÒDï¯xûw>©Xoc‹j­ÃßRáÔ18Ý­Ï •‹e¤°ÒB8'2ê„;vß²b௬ºé ·Ù€“ ‚Ä—¢ù…šXýEýüy¶%xð#/¨hTE cëy*‚¢†Eƒ#Yd)$4 LPÒäëÙPeéü9¡š¬âž¡Ð÷YÕh€HX-Zÿ¤­o­i²VúL&^(ê˜þ,Ý[ŠÞ3T5Û$À¯ þ( ƒ ÁÛEÌ?K„o«¤§0sÑÊïÒÊ@­¿kh…‰™3}eË,Çú7Z Ñ!ÚjVõOwó1ÁA‚"À+…ç‘ ¦” ‚'B`Ó±Íq61›Cþü”3DP†Ù@%Nq.Á@ žtZW#TkÙ詃×f¨ ´G–õ‰V홺ØDN6ÿüð¥.Âtp#Ž}±:çN¾çû4B1°Op¶‰rá’ÇÒÈÒùsBÒw ÿ˜4Š0B 2æòidéÞRôž¡PTkr´åÖ•"Ð#yÍ'ƒL­V•LáLS('Kÿ5‡ÿ°¡éuBí-o&¾öªfeZJ]Ýî®:¥I.´Ñ‘pUÁ嘯]±d$ü̺ÆàÏ?±jÝè{~iu£[[ÙÑk­ÍøB£À>¬@áëy§ =›«)‡´$ûd¥"\B@²c˜‹â Áöva$±ÿNE¬q±O2ðIëcrD¡îûK ÷05”6Ÿµúj,X]Ü–V²š*V>iïÇ)X‘¯n_v¢8ó~ É4̱Æ/;ª "—¯´ÙlÕ©Õ(yf®©ç"Ø·•n²÷G”ÓÇîH ;†V&®väÁ{§áC%—óÏû;: 3DlÊ‘‡êË 0“ËZLo’©¢•)=#]†3joÝdÝÕÔbüîL6‡¾© !×cé”´/«ŠR4— ?ðŠ·›º Ó.ºÒUÄ™l¼ ¡š]ÕâãGñ½jªLZiQƒtî::y;OÓlƒa•üAC°dþŒN–Ù%´wì´5³D8@i-ñøÿ›Á$"ùGi"=h–Ο:´¿g¨®ÜRÛ ÊÂU’Û¢ÞãQ'AÙã…Õ¶rOUº?7cUšÜ\]®M÷b/fÍx:»jT¸jîjv6ÚÌã"òå=͈ÉåÓõÓÆŽNL{‡œçÝþìLŒa™™ï72áÚâ<ÈòÌ|´xa7°±\LýöŠ9i½.:³Jd~+~:µ½ñZ~¦ÑõÞ¥¬o*ûƒRáê™ø``4çڧЉ{péî·Lí¢…NjÛ…pÃgRÚg“3D‡~¯BÊÈZh÷°«/êÁïéãŽ"ôÌ^YgÚé*˜lESŸ¼bè«ü`S±÷+§ƒÃ­5VŒ½VäàìU¼.EŸ2ysXß[*jÎM̓þÑÁ¬ÆºþAk›ôÝàéñ‡› m/ËX;Á¿{§ŸõÝÿÀµJ‘? ׂf øþûïæ@ºœ´§;NN3²IƒSGo}A+öX‡oëПøJìÜé ö–:˜û ™=òOZ>øz5>‹’þ?ÇŒ­ endstream endobj 516 0 obj << /Type /Page /Contents 517 0 R /Resources 515 0 R /MediaBox [0 0 612 792] /Parent 513 0 R /Annots [ 519 0 R 520 0 R 521 0 R 522 0 R ] >> endobj 519 0 obj << /Type /Annot /Border [0 0 0] /Rect [319.2519 484.45 491.0682 494.45] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 520 0 obj << /Type /Annot /Border [0 0 0] /Rect [153.1628 392.3952 324.9791 402.3952] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 521 0 obj << /Type /Annot /Border [0 0 0] /Rect [450.9778 247.7377 522 256.8286] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 522 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 234.587 210.4349 244.587] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 518 0 obj << /D [516 0 R /XYZ 90 720 null] >> endobj 515 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F67 89 0 R >> /ProcSet [ /PDF /Text ] >> endobj 525 0 obj << /Length 1343 /Filter /FlateDecode >> stream xÚ¥WËnÛ8Ýç+Œnb’ªe;éÌ¢4™ h ˜N´EÙœH¤ Rv’¯Ÿ+‘”õ í/DS$ïãœ{xL|ø“²ˆ"ï-“M~åëéç«@\Xáv—Ü­®>ÞÇÁ$ð½ÿ&˜¬ÒÞ!«äçô.fÁT’™LË™EÑÝÎ\„ÐôÛ7xóðµžDÓ{ÓŒ˜?K4åeŽ¥˜¹!š‡h:g¿V]}YµîÄaxÉáz‰Åã°ëq€oá/Ñd¾D^¡¸ñÛ“4MÁç ŽýéÒ]S9ƒÓbpJ=Ctœ[=Þß«Íñ–Ô~‚y7ˆ¼ öU¼-­O ýE<}x­;Šêoº7ÆäŽ 5J –UIô4WÏ/Ÿ5<×/‹’oKœë}y%´³kýï1Íð:Ó)³¹½%<ßSr¸ÖÇ‚ËÍNÀrwÛl²:ÿ¶Á`1ð!}©‰Ãû[G@‹¾½¹²÷F‹Ñ¦íÛÉ]ÊT •äËõºv§Âðì^À¶£­ ^ýG¹ùAÔð¨×a¦ŸY±Ã)móÚ`¬†&‰UQd”$2â1Dr§T}³ò ‹Á–^½éãý|Ñe¾o"A*’£«|ý/‘\´LÚÓÄÐF;Ë ÓŒ¼Ð–FüÚç¦(Ȇ¦f’¼4ìµ`‰=µê‰a©Ë…‡s¨ùzÏ"ž×µ ÓÍëN½·ëÜî¦èû¡¬x"I¹y‘ªáÏ&‡¿C|“¦Å|èhßx QÏQ‹0µë.9:>°‘g_È@(}/Fá²+¶AþƒxQÖTnĸ®1——®‚,O'dƒ³ÓEþÈ uN4Svü0 ¡AüT-`U }Îy_•)Þ(ò¥âORËäƒ^¯þmxÆËš®³a…4ïÍ–=‹FW«L»¶Ã{+m)œŠ×‚0sO-YÈ!fʶmP]¬~P¹3¦rç'$ÅU&syîDö€hÆÝî$#B8ÖHú¾ê¸×¯½²‡åÕ@‰.¢`#裚ƒ‡´¬9elÇÝA:¢A:z:–X›Âè¦<2Dd7ÏÛ’W,éfǦ¡fÅY7U]¬Æ:[`¸n‰$åPÎ{ˆ­—-­ÆÔݘé—ÊÊw.FÒn°øS1œ¦ …$ù¤+á蕦Î1®˜2iˆ0*—Ž+[º'Ö&İçä'så&¶€´%@¢àu %ƒ»½y•“„6BXÏìqVq‚:'¯Ùÿävèb¡¹ØlS^!i/s):1ru¶’N‘¨™C'÷YxW™¯Ñ¹A}®ÉÏ×ZÒ@L5BÜøÏ¸N¾âñÑž­{›&ã·à@&[–Y•¯IÙŸv™ÉÜHJÌŒ ùžgd¦¦’ìØ>¼v.+ãÛo—¬‘4ïL3/Á´¡ÐŸí_\·….> endobj 527 0 obj << /Type /Annot /Border [0 0 0] /Rect [187.5261 510.7514 359.3424 520.7514] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 526 0 obj << /D [524 0 R /XYZ 90 720 null] >> endobj 523 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F67 89 0 R >> /ProcSet [ /PDF /Text ] >> endobj 530 0 obj << /Length 2546 /Filter /FlateDecode >> stream xÚÅÛrÛÆõÝ_¡™>Ì›½âbOÅnÜÆtÉiÍ"A1 Ð ([ýúž³g¡¥åºîd4#ìõì¹ß(Î8ü‰³œŸ¥J±\§éÙló„»åwO„Åp"ùáêÉw/8œå<gW‹# WóëèbUl'"êÊI,¢v+¥"ýtk­£7o`çÏ?㢎^¸Z—~’é¨i7E·›ÄR'RG‰šÜ\ýåÉ‹«#åcã‘Ærˆ±PœI£Ï’L3¡´±hXU³Õ˜uûb½¾§YUÏË4ìV¥”»}[2Dð»—)@×LÒ=Ö=–K&¦h†Üp;QÑ›ÛIœÈè÷rÖñi½¬pײ"5ÀŠ\+p ØŸÝáÅ8ï€dd²i:¼`ÿ zç—·Àáç?>¥GfÍÚ¿"¢YgŸljz²ÁÉÇ:z¿/æ-!D¯—•`­È+ #R–(•[d®VN¬3xAfÑþ+í°«` À­I3vr ¿q‘àø#­/`©qÚS¸…lÆ!·þòöù!¼€CFÃE:oè5vÈU;úþ+_ fR“¹› ¹| ªÆ7V#@0BÀ ú(– ©Ž¹‚xLœÀaº»'ÎŽöjràò'®@ Ž ^_Ü\Oo®õåA,¸áQÜ´±öÛ{óó?À´çÑŸH‹ÿZ:ÿÐ´Ž¸$KU1a8)ñ]Ùvh B$Épb‚;!™eSR(Ç-‡†þvJ¼XÍÊÍ(~ìš3»iɸ‡úu‘Ï É?Ê„$-Rgm :àêê%­½³ÆpO“™¢¢‹hN UPò¡gyâ8w,óZiÊr¾‡ŽüL .Ëä¤Õ“HÍ´Qä9`+9xͲµ¤‚ú®œeÁ¸ÙvHqSƒ™^ÎÑ3¦ÔEèµ|ˆ[QÏC`$²>ñ`¦Añhð2•Ù±0·-á*¼)~D­S)Ù^=Çÿ3+¹Î:eIÔMÊb†b[áL8çFÑÎǽ´UÕ³5:·¹NØ ÛM‹Ú ÎÖýÖ;z¡-­cÜ‚Á¦QiQé©Ã[ž b2ôôôm€]µCádÕ…RZ§4Òç/$tÀÝÒs˪&Gô¡êV4²>Û¹«fAk½Àam ÆaýÕõ±‘¿BH~¨£é`u0&ç….üPEÓÃðbzJmùñ£¿O¼4÷Ȭ,‹®¦ ¡¬5Ë$ïµë┩©Œ™\d™Znú`2½8…¬‚4"Q‡pe;.Ë{û9ûRÈnRõ¨ e\ûC§ð²&̃À…ñ=î7Í~÷ rðXxvÙ"<ËòžìÃÁ[ÙÛ-±MC—–‰ÁGEïÑ€lPk+H˶Xƒ#Ò).Ë’ŽôÎÆŸd*rA¡ìˆc"¤=Üi"JÔX ÂES8ÑÀ c qîZ°ôÖäuìSÖâFØÅÍ"¶~®D¨µ³Î±+<¸¹b T¨I ùOÌ¥¢[+¶™Ï‡\­ž5-yê¦nÌÝQ×8ÈÎ¥“ m¹°!”è ©Ñº*zß½y`P6wï%‚*ü<œM@vgCÿa_üáÕôù¯Ah–èÄòh`úÂÖm4®\pCYXbf%2Q.Ïð@j•eTá)‹Âp n\ %`b·e^. T§"—PzU¶ø]"e„ò5 ÷ƒwµµQ<±°‘mC Á ­:™h[, ŒS¢sø„fˆ` `íÏ=FÉC€6-E‘ÖD¬=kîÁƒ};ð¢2OŽ3O\@·‚_²xKÃháëÆç—0¹Àï,k^Ñ2ÅC0AvªO©{iŸOàú¯_àäò'ãz­mMXD÷¶è/ÚµwÚñÌv êÚ±”¤&ÚGVŸldL{àõ  îÿÙØ”aÂ?¯= ¿N{ÓBc’Q{àí+íþ‰ÕÝõþæúîæº¾±,±Uõ©nÀØd®CÕ·a)”W>±W›`’ .6>zÜLâ,?¼{¹µA‡p½¬w ç4ßBTÖMšºïÈ-è[Ä:j Èä,=ƺŸÄ‰Ñô.X“•,Í[¯Q¬v´l«ùI+ƒ³êK.z›¸ë¬@èÚ@|æ›%H.õúòíã¿ ÷Y˜Ö}RïÛ*羟Ù÷WlÔ¶-–m9«•ÏÃuÆ ¨sÏqä¶ïŠV]…VŠ“w5’@#Ƴ\{4!ó2,‘&?B|ÿ=?¿ûžc¶z!‘,Ïó!ÉŸ XœPj—õmžÿ|2€þ¸÷'2´®ÄÇ ®ðt&ûrÎòsA @ ž Ÿš?Ù°÷k1@x 2I´Uy¢Aw¢‡™|c‚f µp&’O ÅÞôØ?Ê_mX&úŠþàïW%5Ô‰“™ª4ËAOB¦ÖwE¥Ñƒ:gá–hš@I"ûöå§Â\‘pÙs’Q­í°ÑØÀ<$"¸ð°cHhÏÓ•­ì©ÞjxG[›²¨Ÿº€%Z®3t9ƒÀD?9… Æ÷Žæmõ#é~c[yô¢ L°ÜW.¡¢Š[÷Uêz?4ü4¥µøQÓmýƦv¹îʾ£ ´í±RÅ; Ú8Üñö~Ùõ 2p4…ÂèÊåäšraÝî:št®ûr¶<‚˜“i9 Ùa´0/ã’Ú)%m¡8䊻}¸ç ǤàÞ…]†›ÎüÐ4?Õ0ã,ƒDÖºz ýTxÀtÄ®ÖÓ'´\øòƒŸj-S-Tw«Š 9ç…\™c^îVÍ~íÚÍÀÿ¾|ëÓìí¡ÜšUNË]É>¨LTôoúQ°qɬĞsiU;åB|¦j_|j«^µvÛ}ätP¨ñ4è‰ ›Ý§»)}ÿF:AG¦c¯»_¶cߛΡ;I-Ç.ûÓ‡ùo¹5ýúÜÓWÖW^í¢÷m® ©]½¹¿1ëš–ùFÈ[ŒÄ| endstream endobj 529 0 obj << /Type /Page /Contents 530 0 R /Resources 528 0 R /MediaBox [0 0 612 792] /Parent 513 0 R /Annots [ 533 0 R ] >> endobj 533 0 obj << /Type /Annot /Border [0 0 0] /Rect [313.3728 385.9278 495.0282 396.8369] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 531 0 obj << /D [529 0 R /XYZ 90 720 null] >> endobj 532 0 obj << /D [529 0 R /XYZ 90 668.8958 null] >> endobj 472 0 obj << /D [529 0 R /XYZ 90 640.6351 null] >> endobj 534 0 obj << /D [529 0 R /XYZ 90 350.6933 null] >> endobj 528 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R /F67 89 0 R >> /ProcSet [ /PDF /Text ] >> endobj 537 0 obj << /Length 2366 /Filter /FlateDecode >> stream xÚåYmoÛÈþž_a´Ž:˜{Ü7’›.irmqçQä. ŒD[º“H—¢lëúç;/»”HÓ²œøú¡Ek¹;;;o;óÌFž$ðOž¸ä$ÓZ8“e'ÓÕ³ÄOÿúLúQ ñ>ÉËógß¼±òD&Â%Nžœ_ô˜œÏ>D¯æÅÕDFm9‰eÔLb­udžObcLôö-¬|÷=Nšè ŒË2|ä&ª›UÑ®'±2©2Qj&Ïÿöìõy'ŽUê!‘ä‰ÓÜ©%‰ÿ‰ç‘Ú'Ò"щ¦Hñ“§è±±"S™ò_‚Ò¹èíê“EíœË#ÍßוGÞ$Á8·¼t gQ½Æ©E»€åº ›¬Š%ÌlJZ>ežuµÜŽù‰¿§HU¯<˪¬ðØ–Ióš‡W óóë/pÖEïy±¨€pÆã™mÑ”h“‹Ü¨ì$–ZH›°ÃëÕ¢mËÊ–kØ[3Ð ëͪ¤ b€h<,ÿµµˆŒ5€¹Ùd=ç韛lNaÇ5Œ$SLa7ˆ[73Œ”²hýf:«æ­ïyª!=.™+O]ÀDS¯ø#!’¾.B` ¦tüÙÈcÜ.Io~ÃFnèIâ¦-p£@ïí¿Ž¥¨oæeãcÓïÎÐ0wÍ Š@ä= v!G‘]à‹Tç©j½¨«àSý› Ö¤p9¦Ü'Š Z_ÖèøAd±ÍDš$pq¤2sÇÞ sô­øÇ"£lÚÅ4¸Ãˆl4`ÉcóçSNDPLQ¼9ÏpL{MAûuë÷×L`øççDÚºh)0.™.P hÃç1ªTb„…lpè²ÃÐf©ô$ä#Œ”r×!ó0O1-ªªnYzvNÝÎwŸ¹wc¬œÊd¦ïΫ¦S‹þÂ]vQûe.ÝíÒsŠOãB|â_ŒQ‰fÍ+7MqÅ™ˆRÌ,*¦-Itm“¨»eÚMIîÆ\ÑΪÝíÝVã-KN)C|…;æ<͹¶iË[ª—gHÕî”’f±êû³\w®6t®7”íù¿g˳QcJ®TÖÓÄr >¤€‹ÚWÍb¹äÁµwª3"Ïôc}zýß÷éuÜs&×4r¦ŽÖCG=e{L°ÉïìË´çK•»ÝÑcÕR¤* ·þlÔ’ÀØig:‡²säž±/Už³/qfƒB¡­Q³ÍÚ/óÏ&Fû‚4W|ýg<ÍLÐ=¹Á{ßyÁ«ŒË}¯á̳okfX#–¨/d1$(´Œ6Mm?æ ?¢Þ.©è΂™›PutÃ'î¡9¿íz@f$Yí¢ ¾È»ù¾Ö¸m³þ²œVÿïöä›. ž˜.Â@2#¹dº_’á«SŸ!\ɤ!p1ö§Á1¸°\,ˆ_¸\1Ÿ‚gÈ—€xv¶Xq¥'Àë«‚«(’¦@ê%âøþ$FˆÁ'ò>À ¡f86bÐ,8bsýáAƒþð˜¿û˨kàJ¥ivˆ•:Õ¡FþJÆÚÞL°:b8ÌWÈ×H y¾ÖÝmgCÃ~:¹ïÒJ‘åy¸ï3ôÎjLD„^S0 wˆXHDB9òTpH Ì·&Øê|,ZÿYÏ/0ÆíZ(—ØÁ_ÌM‰±yËS´ ñiŠ~&lÖLA· ˜2|BtT…àæD໽À’‰@?­—uCÀÞH3–›ùÞ]Ø;ªs} µÏ™Šyµùáu)}gÂ9 ç†1ä• “PÌ«{yŒ­¼—r ë:¹R!—‹Ò¥¿!‹êrw?8qõK¤Và»bV6¿`TFþ¸,›ñ¨Ë0Öd‡qCµ¿ Íí)”T©W§µºt³fù)ì@¹];t–Á|gÀø¶o>€ÞSEMWgÇ1¡S%t¶új B=ÆÆ¢ Óê;‘ºÄwÚ7%ç©»Ó€(B8ÆH¶©D‰h…:ºôùÜ«û ý½åq·CW–%h¿Þ+ˆÐ Ñ)‹ŠÍ*ÁœYâTÿº\Ç+¸ÐÕüP"'Ųñž\ˆÒ'ÈÅE(Ͼ܀÷ªbåGeáÇ^úô0 ¾?á÷–ÇwZqŽ—j9{˜Ðû®è! ØK…|Qõó3…Û~Þ¿çæ„^¬q°tVYšÃ 5œÐû;w™x,ÊGC•ê]@)r™ÞA÷=ù¤Ä(ÜA;4×BeÉ $³ðr(¼ /‡ÂËß_xùðxðÈCë´{ÿ8NFJùx-`8ëS8Ûнô^ï¡À7o 3& 3ßD¡Ðpw€ŽTr÷m0DŠþj¬epC^¾ÈxÿŸf-´) ª©ÌR| TZo*äã/™ §UTO`í¶\ ó4Z;JŸª¤{ ‡aÁ?¾bÍ“{PÙ£{h•J¦k ÈlãN·6ú¥lküÏ ÿ¾Þz¢‚Û„ê1h Qz3‡cgÔ&÷z2/¡ä— z4ØzÔÐľ ÍtÓ½îâçÍ|ÑuGÒ¿š \óÃ`_Dáý=î“õÅ ì·ˆ"bÔ£XÀ\(º`/—¾ÛRŒ1[Ü>­úVhÙßó~,÷4»c— —»p%?$Çø(…Å(4Û§aóÛ粉SÀ‚y¦­œ|åäÓ(Ø J¬S2²A…­›##Áü…BŸÍÍgG”KEš[÷?Q_h£{Ziáés"³:22Ï ée ÈÓåáYàŒ£ÿÄ?zÔ©aÇ‘NuÇ„Zþ SÅæ·§ass›®ó¸÷¤¶•|[ɧ±•|[É¡­FoB:vÄÿ“  endstream endobj 536 0 obj << /Type /Page /Contents 537 0 R /Resources 535 0 R /MediaBox [0 0 612 792] /Parent 513 0 R /Annots [ 539 0 R ] >> endobj 539 0 obj << /Type /Annot /Border [0 0 0] /Rect [303.4847 349.7624 491.4325 360.6715] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 538 0 obj << /D [536 0 R /XYZ 90 720 null] >> endobj 540 0 obj << /D [536 0 R /XYZ 90 328.2001 null] >> endobj 535 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F55 27 0 R /F67 89 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 543 0 obj << /Length 2548 /Filter /FlateDecode >> stream xÚÝZmoÛFþž_a ,]Íí¾“ QÓ(É¡öŹA–h›‰HʶÒ?3ûB‘òÊ–]ã „+rvÞvæÙÙY³ ÿØAJb!H*ãø`ºxEÝëo¯˜E@õI&§¯~ü¨Ø£$¥);8½09~ºÊ–c6jóqÄFõ8BŒä›q$¥}ù_>ý_ÊÑGóÜÿH䨪YÛŒ#.5—#­Æ_Oyõói§Žâü!…‘$ 1ïkÌ%\ÉH„TFmYN&_~C‰?~ÔqŸ\ÀaŠZû>ÏŠ…%rå)IÒ$r¤z=UÔèØ>Dˆoäg ØÏB¼5IÒ±>£_Cì8‡a’:¢Ûça³~6ߟ‡ÍÍ^lŒÇ !AŸ3®‰J¤~)§³çq:{§³çq:Ûvú!"¦DºqzL¨ÐÌL;½ÊkÌ~0Ðà“ŽÊÊ>'ˆ“/cžŒ~³çeVÃcmi. ZмBj²$!Ziæ•!íR¹ð P„Î s±Fùym¸‚7YcÇæóï” TŒ(‘°µj-Ì»¬,J ¹ôò%ðGñÃÌ~¶_«õ<`œ$\ðal¶(&r¡¬`+¡l ˜o6/ð)€2·/ÎÕ ˆË™qÜåæC<ªPÝÛ7A‡é„¤J ï° &&a›X»24©±Š¥³ÖJíô’ö1Eêj±´Z–Ö<ô OG­cpǦk³vOÝ¥0LrG½È¾ÙÏÖ”&AáW Oh>Êð[R„ Œwݲ48@We6·tÎe«ÞªEοÆ€ ôüg7|Ú@'®ãøþHÔI¬ˆ2êZg¡Üÿ˜õœ¶fÝQµ›Ü•ÆD‹D;F僢þ 2!’I»7G“4M½¬Ïº½q Ž'°Ñ²¤“gÔDY8‘bÄ8ëM˜XŠ!`lBÆ6$ê½¾ øÐØÐʧ~M We>ÃÜ8Ÿ]^Áü¿æî§8†e¿î¢ ,RƒDI%IX|×n¾e·Z:ªBŒ‰AGÁvTʽ秊I 'Ué §9Bƒ!¿Wí]㶦ôÒÍ€’gmç«[—G"!2r˜GVO¥²ái(ÑJª.ó2¯VŽÀ`ÖuÑTµýý;UÔ·JºàÆÄ¯³¦u,«-ÖUmQ —¥^ÛwbÖc‘5H©éèæÊ›WÛ¾ôÎÀq@K´u«Æè Ù}36€!2³oÎ=ž p!0¥ŒPJÙÖFºµ¸ º—ó _ ö-qRÿ´ï§AðL =¸—¹] Œ¢ Êî „A½É!v¥’àlnþxV—“ü{a76«ÑɪƟ¦™Ö„,¡fw×B$~w·:O+£›M%«faô6+¸I¾¹#nVðKßb"ãÏ \-· –Ig£LkV5~Îlæ÷Y¹ÉYí˜þ;˜š1…Ì>7Éùù2ˆ\¦òÙwhÅTN…0cp¹HUÇ7ÿ¾›¯Ç×CbÏGï{f¸˜ç͇F`¿K‘B%K·*Yç@;ÑÄy†._»µèå[f’^:¦6ô ñ²ܸã§¥Aá)f• °&á”%‡EÝÉzìƒ1 —\Á†“ÎNN¿N&ÿ°EdTÕ‘ýôuòó¿Þ†¶²•”7?¯‚ùÇIÌbŸ~Ç; Œ<Ÿëgâ3ÛƒÏÙ`¶]K–€7ÔöQðõ‚†hŽv³Q÷Û ð¿ñ±I'\–•[ž jK3¸ŽfEÛÂĘ£8â‹Ú¶Æ/«ùº¬f?þžå—uŽ)‹?0$ñYg奓ÆÑ!ˆ~ýäU0Vù ÷ÓŠ@SQ¿qöèXDŽìËèƒãîUghj6G¨u;åð$¯ûã †øãðíá–óÝ›YeŸeÕ:’å2‡ÏÀ1­gT”ËUK: èÿ.rËŽÀ×\f¿<›^9ÙGÇ›yî£iZ,ºÐ*.‹ÖBU¤%”ß, †d=x¤tî],çEÞÝH“~å·ò¼{ªËåÔñL„óYµeºËÀ[Àzç3¦`8‡†k"à¸ÛwÚûríâuµ8Ï]˜â^a’6Š+ŸÔÕ|^ÝlÅïUžÍÜNFƒ‹‚it 'O¦áþ¦Éßv1´5:Ûc%üz†Ú!Ô9m]Í=ÊeëN51#\Áá'då&˜ÝÂTΓÒùn^™Ž¨ ÷é as–7®¬¶=¹+ႯáÀ”UBÍ•/IÐ]«wôèúõ(³Í_s<ûy$} cvD7>ÜѪS1ÐæOàþp¢ìƒ};͆òY!hòtÇÒ#CœQºË±}Dòb`›ýÁR'I¼Õ™Ú¡7nƒóË)¿V>ì\8$©é‹9÷Y¶„Þ¥)‰c•x¨–}99uˆ‘ß¶+¿N+&YÛÕ^»¡Âò&Ÿ +`qåd0̬S»ª½7'÷¬3 ÒÍÊP|GP°E%ñØ+žæ×%Õ,`ëUõþ0³±a·ûÄ— °=yF¶)lËöð ÄË$l?Šª`í##ìÀ`÷­ímÓ›º…Ò«~µO®Ârå“ÏÂyU7÷”A¾ ØT ƒš£.}íõó÷×O“÷ƒde*V½·{”Âs0’…µØ£P{Dr1àx/k[k°‹·À'*†¨Û¾1k\·K2abÃ]™"ßÕù²vD¾Á‹¯!Îæ¶ÞÚë GŽ;>'¦¯÷½ð—ö’q{‚=Ïú"›‘rÐò­Gl>K±á5ó.k?Ê;¹--–¯øÔn6ˆm`ø®R/,|LÀÁüƒø¶ ½Çq/Íéܨhè®jûXÁÛ6ÚÝÊ2‡vž&>uÌø[w µ¾Á!¶¦á¸/yšnZï0¶ýËE¾jÓ$îšÃ¾)ˆÂgYUï«4¡¦ïiœIŠ aùÑ7»s)ͺÛŒ…þZîhF긻{â:HêC]°J@@&·AQØî¼¤^[šëIì ™VlV»‘oÎvW@iCtmï,Ìåq U´ÄxÈ-Pî3æ=õc@[¦ˆŒc_•/»\wwi؂֩»ÛÞæ/5Qº«èwĽ-ûãp#Ç;ŸãzÒ? Æéôç©M£|·–jê.ñ £V×ÁËÔaé-ìÍ»½žj;¬´òÚ+,„vP’MqÉ®ì·Äš¢œÎWæb§ÇÔÂʪÞÜÒq¨S‡!¸ÌçêfØÃ“Î|´7Ù½‹Á¢û+Œ'<* £_Ô,Í ºË{;¥6÷dî ÁŒå“å&/> endobj 544 0 obj << /D [542 0 R /XYZ 90 720 null] >> endobj 545 0 obj << /D [542 0 R /XYZ 90 549.3026 null] >> endobj 541 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F67 89 0 R /F55 27 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 548 0 obj << /Length 2535 /Filter /FlateDecode >> stream xÚ½ÛnÛÈõ=_a`–îš³Îð¶@š4n·(œö¡®ÑÒe±‘Hƒ”»_ßsRdF¶SìÌáÌá¹_GÑgüÓgEt–£ ›egËÝ»H¶?¿Ó² "<y¿x÷ãe¢Ït¤Š¨Ðg‹õÉbu|Ø”ç:ØW硺óÐØŸÎCkmðéœü鯸iƒKX×Ûʽä6h»]¹ïÏÃØ¦± Òôüvñ—w;I¿Æ0‚¼Æ±Ž,Û³4·J›Û‹M…ä6>†c#HIJ ÈTJg&ˆ‡¤"Ñÿi ë'O§AÛø°ÛDÙ(·òíû?<6>&SyTW7€wU/Ë}Õ#ö,(™È²Ý¶]µâ4B¹_žÇY°åîðír{X¡æÉ=ƒ®ÛJ'AœWû^˜^Ë9€H¸lwxþÊ@¢ª9ó` Ÿ…:.T’E)¬ŒÒIÄÎJHÚrOôîCù°–ïÂ8‰ƒ%bl·H¡CÓ'>J¢A+æ=N‹à~جÚʃ»íÁíÉNIÊaÜåöE/¡æ MÏ=X›]ÙÜË2RJ Y!ò1)AÖD°ÝÂŽ1ºÆqƒ¬*1e2q>ö½P§*N`Zº:øŒ®semä\¯lV>t±VÙè}W^D ¦p^†ŽPd3 D:Q.–Ú²&OIÿõ}½gÔ¡E7¯E…¸ÔJÁAJ$À݈f¿që$x8rËï{Ù5æìÏM»«Ë-\U÷]%8j8lØÛÒBEøÄÙOœxPk´xäIÓUd-òʶხêG×–óúý´Ú>cnz»1W§Œ™$ÚE0Jm³‘c›èÍ;ÔÍ3Ò1¢MÅËv³ddšYÖÎRí°dÎQ9W?¡Ù’hˆ „#^ýž)SüBßÔì/¹«•Ñ:™?w&:rë¶cª&ü£ÈíEŒŽ¡âX›©ù­Ÿ€IÍ”XÕÞîÚ{’aˆÙµß³ÿ°¦YÏÝŠ<Ó-gRÀA¶+÷ ^ó—ÃaWŠw‘ÃÆ± ª^ùÄJT’G3gzÿþo^o*T¦Sãjs¸gtü3˜‰ƒ»zy¸C^–|0+ $¸|ó¥Þoø#2.ØOº}½dÀ Î=kÇ[/30ºu¥êEþcú½‘Ö*ÒE:–FТ·4¦*/²â«,9å*Rª¾]/N°e4”rð¦od럜“L¡lV¯^hHC[Aîpf”Í‹djÿ?P„?£12É;ü;D"µXxˆ)Ÿ^ãæ\¾¶Û¿þÂ[.ûĦÁËÕ´„…V›àãùq¹c*ƒËñŽKMøUÍm„P.ùÑHëc¾¾'9 wf9jtAî7\ê=Òõšê‡“$ÙÿN´ˆëöašØnô{n(²«§ý¡kÉë¹`ªÜ“„IŒ)a$sqzQŽ,HWÔv.¯°‹øêÍG4LÎ}È<Õã¥)ê¬2¢è«cY®â~Ô+S1ÏXzoÊ”5I:u?D]DŒ9‰ÚÐóøxCA—jØ=òÇ4›v¬@*1úe‡¤:´µL@rCPY2ŸES=çTÏ9Õ¿5§ú5N‘,G>¼\dJçC§u"œb¨¹™c”eLM½EÈ(W¹Î¾EFšI´¾™IO؇qœªhV*¹{1ÚØü›·Õ壥ÄUIÃ0Ì=ò=u¶¼¡<* y¥êáiy§[ÌüåÞ7Ý"à‰’Ýó÷¥<û‡ñlYãÅÕ(SB”óÌŠà'kõP"L1ÕÍÏ8?äFPÀ4³©ÊÉëe¹Ýö¼t3.®¯a½— sÉ’õä¸'4]"œs/¨ Õ m…¼ÜðÕCè2è¨d¾ôAN@'Åö'T›`c[@â†G]aÿPb~ÄYçdiÇC™GŠqÚ• Ôå™LpºÊY•¥&™GŽþº°NóØ^ñSÌ&VΗçþI=BËS1Ìœ§ø†¦:K’ì l'Ó€Ÿ¡Q‘‰Ì7òÈ*—û4HÕ‰=x žšã«[.nÅãDéXë©xg|øhÌG£¾·×Â8Š3;vÎY2„îK(áöp]”ÙùßU¡'Ó½[œ^kRào¡œËºAÄÞÛ±< øž„ÇYÙºC’‡JÞf·a™âµ<ÆãØQœl´éZLº‹I8J?L÷gá4ý5«ÔÃå†×‰ÍOaAwwYá(2™(àé„ೊZ$y¡®.˃Au«°]‡˜‚·¬·B¬HS“+ ¼Q2Šå¶åyç®ã1)ß(Z¸©›eÛI‰è Ǭܶà’g{Ç]iµoO«¿«ÖUW5ÜäÉ]V‰ ®0¬ sˆ­ŠâÄðÕVø ¦¿ HMðéò´þtY“狆|q®Æ{Éç_ËÞ„åØÂ¿Ìì×ö}}çÌÆý4k¬Û•[wñ‚wVϬ%¹.:è2~tšå¬rPØkQ£% µ8Ö~S:÷éh÷8ûwS¯¢–V¼o]?9+_ æòäk¸¸Ê®šx°zög¡kÁ›7Ì›1 `Ƨõ¦V¬“z÷€Wöû~&V:‹~Ÿ£Q„8ãǺ¦K#BK÷ÖMÕúÞ·pݼ…kߘXð4›½–N$’#éœÄ.wæV%•_VìÿÌc)“êâ›RÞzny•É|Nz¦ô7d…×3öÿ|71ZA qÈBý«¤˜ÿKúÕ„•ÿ†<áíV6G™¤rqC.3òþ é[õ© endstream endobj 547 0 obj << /Type /Page /Contents 548 0 R /Resources 546 0 R /MediaBox [0 0 612 792] /Parent 550 0 R >> endobj 549 0 obj << /D [547 0 R /XYZ 90 720 null] >> endobj 473 0 obj << /D [547 0 R /XYZ 90 341.55 null] >> endobj 546 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F55 27 0 R /F67 89 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 553 0 obj << /Length 2890 /Filter /FlateDecode >> stream xÚÍZ[oÛ8~ï¯v"/joºu0mÑv»´@'Ø—nUlÙÖÖ–II›¿çBÒ–J'Ìà ÄEžëwŽª.$üS¥¼È¥Íó‹Õá™tÓ_Ÿ)7ZŠåé’WWÏ~~›ª %E)Kuqµ™¹ZN^瀞…JÆz±TI¿Xcûb±´Ö&?›w¿á¤MÞ¸Ù×þ¡°IתqX,µÍ´M²|ñåêŸÏÞ\vR­c—D8Ö§+› kÒì"+¬PƦÄ÷OxÚÏo³|²T ›Z ´qɇ;^3#W¸›qk~])P£Ÿ»º›U=ðS×òï¸kÜ̦ZÕHób©KQ”E~±TF¨TæOå)ÊR&Ê¢,ÝŠÏò &„ˆÑ³©(ëÉôbDR‘ë\?,§ ßKõåÅQFõw7íšÄE")@°Æ¤s‘¸…üÛWí¶æ¡Œ_¯BÊsö/¯ƒ©À_ŒQ[ªL “©rÊÜx©T–ÅÅg”P™2'úˆPÖ†Eù¨ OFýEÕ½\!2š[´êö]?ÜÔ«½¥JK‘©™JØÝ2Pr/³§úɃg¦…HÍÃÒvlÚ[ïµ7Õ0F +E…éÿ€áþ`Ø2+Ѝ{ŒÿÖízÙm–û¦­á™Cuσkï6Ó–ÚÛÃuݳ#Êèma¬Ý:'^×›êv?>°¾iÇz[÷n=©ã™Â»=D€ó{‹Ÿý„GGqp$?½{õù¥ó‰»jôqA§©‹²qëyà;ƒœôøÊiň"…ÔV,JU:àãÛ·N±“Ì©•€¨àâßRÙ=¤DÊ›@×Ê æRÙV‡Ÿòdo»ˆ‰äVè2˜Èßb‡M ­»¾Óä¿à pØèSNØONƒ„;§´¶xòpŧôõMnIÛ….<`{Ï ƒ®u‚è6ü{³¯ZxQõî°Bžtûûm‡Ósþ­wNÝ2Õ<1*·k šk:ø„=ÒÔŽ¨×eZƒ[Y0¯×·x`_ûhk¤M†n3’ à¾&Ì®)H-=ŸÏ"'ÛwËVËòïzf“ì{W;3¨È”Zh›Û? £\k|œ„lQÑY9+ŠÛº^·— ÊÛèZAIE»>xÍ*,pÁ6“Zo‡ØÖ’ ßœåøobÂÉʹÆiô_. “¨ÙÕJÝc8°!û*οÀ„ ]ñÀ¬ f¤ø÷¨Sh)´É³#†v {u^ê¶iyõSÀx˜³ÚíÒ%§&ämºdš%÷BÄ«+R•\y¸ÛeïËy@HyžÏGs¸Áû6+ŸǽK/N‡7ð±\r²)v·Û]4¤Añ ňùS!m©0H˜Œœ¤9¦NåËzKus è•á7[¤A‰¥C@\Õ¹Õö¸š<.ƒ¦^;L]Beä,æ\ûä|‚N晆^®pbWõÕj¬£èYIu(mLP¯¡pp+È:]úe "Tb_”SG!º¶Í…spR¯ò|4í¹ËÝŸäO«ð!„2¹*wÖ|>t)œÂ}rãã"Œ9À`Ã)ݯÊ_ОUßxLA÷6nšUµg ï›1Ä„ÖÍ1b‚A?wξ9yp–Ðó2Ÿ30΃¾a„áà=E&3kÅìªÁËÍ ÍU2gú9ˆl*±®—ƒ½"0ÙÌJêh!TЬ 3­˜iki}ˆÑ² Š•P>Þ. :FÈ÷yÙ—˜¥-5àcS˜tZ©þ£Ö; ²©0:ó?DѪ© ¡ƒ„.+çP½Dü Ky?¸E­'ép¥.õ©‰dÁ')…Ò>5û©¢iYbcØkŒ<°?z­y¡æd?œÁ{*e3a¼QÓRÀÜÖ% Îß™„!˜Õêå¬?¶o—â Œs^˜èt)ãM|Åø~*C?už¡,IUþ'3ÍiÜÊ !ÓLG X(Ô/hPÏû?ì1iñ 5ót©×R(ŠM¡¡Üô9Ã@¨ä¦„Cp$ñàBÈàBQZÚä7ªPݦkJÕ×C4EzͶõmU€ DwàlØX²–äC“`±Ïc—[Z ¡ß”vj®¹Ÿ€ç³x›i-‹·@¶°½9fÈ©Î!Òfå“mÜjí£XÕ®ùÌšlœJ1 ,9Ñ©!¿ÁøXÉò3Ù²2“5ØÌä1‰ÉŠ4i=öøîP2¬ý‰V¡Jm°Ùpj‰¶JÍ?9¼Œ‹Sµ~Ôìraóг?šÝ0¼p^] ]"Ä)DVä-o;eGHÛª´ù PÓñóè‘"nÇ õwNˆu­ókYêíI]—æ"“RÏÐ*·¾O¶u羜¨T?¹x g?vF0¸¤Qš@1ßGþ…™B»àXÝøêÂõga{šçSÙp€?îu•šV(à>.9W]Ä¥÷ ×¾{Ŭ„R×µ¿ $°õèL:37»ÊîY¹Á4ÈSgÐyð*Çf÷‘­?~UW±é-qõIaTúÒ3T-¹vÿW”ˆòeµÈ8ÍœÈÃ}xæïÓÞ¹p þ²œ+^8/«Ä6w7?ià*@4{{,ÈYtxE|¦«5oÙÊ8üÈ µÛÜø?ÑŒ·ÒTz¼².ÄY‰9âä+ç¥ã¶u"ÿ“¦œ•ZïêŽt|ºÚß.nLGÙÉ,ÀœÒ;ñº«hhœ âK¦7)­¨Âñmž\›äwLÃô9ähq´óíçÀîJ¾¶ñÅëßR Ã-07û{®úy²âŸ=ÂSã.ºo¾ú¶œÎ„³„;pv©×®s ¦õH~Ì39—gEމ/VmH¡3ýôï<“T' â­IaTøZy&ô–i(vØ)û¦ö¨(“yò~Ã'ÑGÂ×oxKJå·kýÍÃw¨±ã úö2¸>(ÿ:Ð×$"À=“¥¸ø©=„„^–³vKÈ•7¹¥u×P¥=ÍÿÔO‡óŽ…Ã6sMr°±†Q(M:Y0Äê€$]^y3à§ëÛ#¥–šŒ6u7c€.?ù3;†Šm[º`/Oôù¢Ó¸0¹í™°k—ðÿ‰?d©äÝóWÏ_þ*²,£&b£Åÿyó?‚·Ø endstream endobj 552 0 obj << /Type /Page /Contents 553 0 R /Resources 551 0 R /MediaBox [0 0 612 792] /Parent 550 0 R >> endobj 554 0 obj << /D [552 0 R /XYZ 90 720 null] >> endobj 551 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F67 89 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 557 0 obj << /Length 2541 /Filter /FlateDecode >> stream xÚµYmoÛ8þÞ_`?TYÔ*ßEu?¥A»×E‘6ACÖÀ)ŽëV¶r–œ4ÿþæ…”eEn ‡E‘Ùá¼<3–GþäQ.Ž2­ÓÜdÙÑbõJ„é¿_É0šÁŠÙpÉû‹Wo?Zy$Eš‹\]Ü칸¾LN—ÅݱLºòx&“ÍñLk˜wÇ3cLòå |ùý3Nšä#Œ«ºŒ/Þ$ÍfUtíñL§LâüñüâW.zv¬RÏ1ŒKžãX ŸÍ‘ó&•ÚXbûƒ•jo¥NôHã’Ëó‹ùåéüòl~¹žùø‘e{ÿéìäÏ…Ýûçh›ŠLÇí7Í$^¡ZŠô‘û¤jñ™'ÅbÓå]W^ÿv<³^$çe9_g65™0òÁ‰ôy ƒ~Ýl¸pBO "Ÿç墫š5só©çáåûj] Ìô 鯿oÓ£™òñ\Л´‚í᮸Å;¶ybíX"©\êŒTG.®¼önµ_7.œºÚ'‘…Tªdò©C>|²)[ÒöêXeÉHQ“­¶Ìe·„䨉ääƧŸÀ"}ò‰?néUk~5M7m7¢ã<«8:<ñˆãf +^_óvbâLÜÑy%™D÷91°^*ô«%ï×jvEïü <ÀžŽ”ÉŒoDGµ /ä¶Ü ¨Y¼A5*Ç>¡“‰7¦\™U„k××¼ð?—›®üÆïÀ…L®«E¯OZŒsü˜îxü—Ï''n˜•§TYM[‘Yö„ÿV ‰w½»í†œŒgOòEÔ6×zÖE‡†€Ñ§ qjïdxgEÔM”}°t=°ƒz÷¹º™Š#JˆT8áC$8Åà10”‚¡«ÞNQ³Æ…g?‰ÎéAB>uÚý0󋃔 ( 1¾-;RmÊiaß§$Þ¬LƒK— e2¸HèœúÞr ™èÍ2Œ“.)‹z8‰‘>¹)Ø_ó%ö®ØÈü‰Éâ\æCƒ›†¼¢Á=äÁå5¸ žŒ‡ëžÒÐÁÍöO(:Ýòì2¥öc\ ¹%§¨‘ùÖl} i zF–SЙÌAËkBRiVw‘2MWjÝRÊÕ )Hk¿#î’¸-/÷¨RÐܲ>9úh ¢¸´ätlôê7L™kº)áüý±uàFÛø¡M§Ü÷b‰»·-;`ÁG|×ýÆà†Ý­¢Xß"ɺ>{¤5ɪº]2+ôaÀ¿ôpb O¼t:±ômŸfyîö ´Zw˜sìsƒ )5l3›È, lxæá)¦ü IxkGl<,« RʲdAèêŠU˜Æ,P°3 T…îT6š†¬ä/Ò nê¦ø!jϦ™ÊÔSBr8¬BuœŠ¨Ô‰~%ñ€>‡ø•“ªµI­rN3)%i(ž©˜t:ùúáôS“K>Â5 ~Û©«ÃûÏ Î°r±ì¯Ì["ç¿¢\ã–â¥tœûØÌ9­OÞ È$„ a˜œ û.µvò* nvÒÜ.ãý{ê @¾>ë3Pzòp~‰ì¼1_‰,•Ò©}:ìñHñíÝØ«óÒÌwbºl¬øÕœý³©ëjMèP:—œ}…<™ßmrvŠŽÑF§-iP ソóŠpÊæQi:Åçë¸híX™ÉI²RÉÔö•Å/ìëíê #*Ž›~ÞGiçR%¤Þû—è{ü„ºäÑ]àaŠc,ÑR•%5hf}ñÕ°ø‰jXðÍѸÝÞÝÕ„µÿ³JØ2І(Åd©ðB¿D)D­·ËCZ±Èr·¯–“ºæ¥Ù"mýëÀúÜ"T{P‡U©™}‰:˜\ðËCÚ€j_[ežÓÆbçÜÏéÂüCÁ@oøåÏßߟD¥ ì"•ÊŽàëÁ¸›¥™SÑ H±Ö&ÿ)»q©±™P& @Ц18WŽ1†5Ž,±u(žp šî ŽãV”¦°DÀt´“a ~Y‡Z4n¾æ=9ÜÅ€évµC‹2•˜LE”JSmuE¬°zŒJ3áFÙ{QóÒòšë:ë„SÛuy€Y` ‡¢ 3„>J\‡<Šý ÊÛ¶Q­UÒ5ûEºØÂëz€:ÃI;<Ë©‹P»Î÷o{º³¤ õ|"δ´O±¶’Ädp[Åšæ*îˆAóA&„@YùãÃq(ƒ§8ÃKQ}Õ÷c¬‚€#òè¬æ)­ ˆôñ@n.  ÀrS*ªaºX7´ؽ^$ 3¡²˜A>í}ê`*£¢ o¦(ºÔçyŒg_±d*7¡»bà?ŸåûæÛõµä”Ö$EåûIP”xâhGJÊh"ðñD Ÿ\íÁ8Œ·É?ÊM9EÀ+Ä#÷Ã*ÊR“õ £Œ6Y¨$`@ö¿¥â] Ê@nü†X‚ëzÏÄrŒ!NSç –õôÈÄËÉ›^@t4vtTþ/£k ¹Ð«(@ïܶéIs—!©3˜¬†7ù]á pƒ®ÑŽ~1¸E5%‘$”œ?Ãà’ÎÉl,"æq…ÿ3ÑO(biã®ÛX;á0„–ÐøHcKÜ9w#|}V~ë†Í²Õ¤ÕYƒ…ýŽÕé‘ÕiÕ÷Ý¥£®á”u"üëÔÓîB;ÅË,ŸÙü€Ÿi—Á(\ÊþíRͧÎöy*ŒV;¯ƒP²{L]wžBç(ÿ3§)²–zÙ¯ë™>J{Z¿­îi/5“‚?b/Š‚äÎÐ,y%u™[™³ö½Î@üµÎ¾,ÎNJ¨]9[Í4ëMóv±­ì#<*ä»n£\ï»¶5õ~ZÞŠé? šâÚªbóJu•ëQñs†?ôÕõcÈ+ë]Š9†Xf´³ûVþ®ïsú4WÜÎè”^eÄ+2öŸ Lѯ¢>˜ëÝNàE…ð`X„À⛸«[†¦”ñê Þ—õ>K>u¯wkðG  ý$÷°æcüóƒˆ|P»”è™gŠ6îá_lž%FUÍ]_Z`z©šm;ªYzNÃo¤ÿ Iœû endstream endobj 556 0 obj << /Type /Page /Contents 557 0 R /Resources 555 0 R /MediaBox [0 0 612 792] /Parent 550 0 R /Annots [ 559 0 R 560 0 R ] >> endobj 559 0 obj << /Type /Annot /Border [0 0 0] /Rect [375.4724 681.4072 522 692.3163] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 560 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 668.8626 126.6412 678.5595] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 558 0 obj << /D [556 0 R /XYZ 90 720 null] >> endobj 561 0 obj << /D [556 0 R /XYZ 90 519.1532 null] >> endobj 555 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R /F67 89 0 R /F55 27 0 R /F53 214 0 R >> /ProcSet [ /PDF /Text ] >> endobj 564 0 obj << /Length 3040 /Filter /FlateDecode >> stream xÚÍZ[Ûº~ϯX •ј%ER”œ‡$MÒ›âd Ø Z[k«±%Wön²ç×w.¤.6÷Òƒ)XSÔœÎåRêLŸ:+ä™ÓZƹ³Åö™ôÝ_Ÿ)ßšÅ|LòæâÙŸÞ[u¦¤(d¡Î.®'“\,/“·ër7SÉ¡šÍUÒÍæZëļœÍ1ÉÇðæç¿a§IÞC»ÞTá!7IÛmËÃ~6OM–š$+f_.þòìÝEÏŽMÓÇF’'pœåF(m,q¬€9—Ëä53»GÆë¸[îí¦õ¢ÔûÕxu Iº¨•ÊÀ zZBC Ì6¹Xs'ÎCïšYZ$‡ºó}¬a‹i³ˆóT]Øýòàí†(7m³bâ ηA5~íˆböžÏetdŸ,,®¼ê­d$fÛ[Ô`­õv·©&Ї½9ÔmÃv67©Èl–NÍí¼úŽ&©rЉ_Å,Ï‘Ê<–÷y–k4ätZícVh á²`®«®½òÝžWk¯ùW㣭ÂGÃ?à›¶-¤¿ÕÜ+½æ„ÔÆ ·h|W¬¸Ž”ŒÁKgƒjl|Ë&Ô-iJؽ#6Ê͆A[!m)ÐR¡@æ‰ÞƒËÔ 6M :ù€Ó¥ù5aÿ)Ra¨ø†l’á-™´ÞÇ­R'Rˆ‰¬3óùÝÛ‹¨fì`î<Ùà–Í” ôÓžŸ²ó ÃD·3›Ü7¤ è_(B|ðb^¬+~ƒ±³Ûøá¡ˆ‘B¼B–ŒÇ++òÔèq¼ò&넳îÈÇiÓFÆF@בÂ+ï>Ê3³ðÂÇ’¾Ã/NÝ©aÏ€Þ‡TVH=ŽÉ꩎gž}˜öɪâhÕx“A>ߨ·üÛ»6¨ŒU '+² œ—yOòißÅX×9°¤CŽ8‹q1îÆFèLÛS?6…¤½099.>¢ãÂ[ðݘãH$QÇ ¦ê']Õ·Þyð©giØ( ¯VõT¾Âí¼©x Ò56mÖ%+©€°‡[5±%ÜØ©JRw}À…ï† ^Ò'#ÁÐèFÖBÁ˜Š»v.`ÆÞ÷ùB.¬UÁ¢îµõr·Ãürç_·Á„¦,‘é3K½ùzñ¹éEÔ² ›7.Ѧ0JMëuTF¤4!OPôšlKÞ|8ý &Ä$εp: ê=“Žfè  lÃbáÓdÀ«h¯à¥ÅW}öcP›eîÌZ)F2auz=¢=Ý|LA£§"ןªfZ–Ö`K‰œŸ.ß@ÂéüVÁóT@p¸&'©ÊUÅ¢Z{,ˆ)Œ(¬N'‚DuO÷˜ §¢ hÞ® HÏX†éØk2¢º"dRv ’±yr.Å>Iõ ¥Û’v³i øí™¨G{Ð~ýéíŠËø¹ŸïG€oˆÕ·ˆj¶O‹ °?ójPЪâXNÑ{Î?^N_FU.\’8!f.½îüÎÚÓ®&MK”ÿ£i²­ÔO©ñ ,¤ÁÓùŒŠà‡WTR 9T‹˜êø‚™xX+»*¦k@Í©JÕãF¬„ÕÒĘ*j®»{'ö; vº”0 Îæ ëÉ E¦9ˆA†Q)ýw2|úë;<ÇpPvo¼1ké˜5Œ NdZs…D#ïÓžõN™ÍÈyL‹ ”G2ŸÆcNÔßþÌÁ:rar¨,ºêìzt|ÍÇ£ìN]Ü¡pÐÖÒA·ùX¦ß0<âÓ•·wLDøûËÏo^1(£bs¿«õu½ óµQlk³ vPËME)8‰ÍÇ£"¢àÁ”+ °Æˆ #!E1!b}dOp¯ÇÎØÈç²Ö “ÍÕ^¦uÖü‡ñôÛá S‘Iè÷AÑŒÍô$pNÝ1”ãPM&£y Ëô'S?ñRÏæÐÍ©€ëÚ÷ì{3ÙIÐUò(Jõæã¥Žw0D)…e­RAkŒ¢Úƒš@eÊ<’¢çWOØJõj9DçÓt䜒òfœè§"—nÀyìiX†•^~¢8Ñÿuøx˜‹ʹþàJ‡CÝÜ„À±+÷‡Øü¹Å­T?@õls¼OÍãø T 45Ëy{=Ç(÷Š{¶¥WÞM›"b³ò(+ =}ôà­¹Ù^…bv  ðâ²3ð-‘g É'A?h> ©ÍDjS˜=Iu®Ç’zö}¤ZV×åÍæ0<¬,¶UV\Öë žì¼ìQÔåkþÖÉÇ8+¾æGõR:œ¹h õìÝpʼnu¥t}Í÷ “šP2%ß¾)Ô×131x°–#þøþ}´*”`éýiõ´üIJ[¥|õO‡kk^¯x(¯è#f‚~OÊq¡JC¨X'§=á’G^Ñ]Åh çOÁÿ}3\†Ú±äh0€/ yt±6ÜТ¿/\R²Jvî|•¿·f@Ð@_à• ïÅõø²ó7÷4‚®+&‡ tt6’ˆzñð¶´YGk¾'Üuz6%] ]Ò¤£Ï† Îáîƒ{ñT¸ô+–Mô`xçOgÂÉÆèã H‡…ÑÇ÷nüqLÔÆ ü0#XOs߇NÁß]ˆXíøŠMþUZ2±Ta-ç?ºÀKëñ‡øŒ5]ôvÆAZ±æôä ²ø˷ç XòYjX(ª¾GT¨¡: ‰ÉÜ/«Ã«ÑìwÈÊG¬0ê¾#K¾Of‚ì±£ª‚šþý bœu¢¬…-²‡•ø*~Y=2´É°Á©ýâèû¦~´gÖ®ª¦jo<Á²¾E+&¿mû£rÌAÿtJ,à endstream endobj 563 0 obj << /Type /Page /Contents 564 0 R /Resources 562 0 R /MediaBox [0 0 612 792] /Parent 550 0 R /Annots [ 566 0 R ] >> endobj 566 0 obj << /Type /Annot /Border [0 0 0] /Rect [313.1667 547.9577 494.9532 558.8668] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 565 0 obj << /D [563 0 R /XYZ 90 720 null] >> endobj 567 0 obj << /D [563 0 R /XYZ 90 487.335 null] >> endobj 562 0 obj << /Font << /F51 9 0 R /F55 27 0 R /F53 214 0 R /F72 6 0 R /F52 12 0 R /F67 89 0 R >> /ProcSet [ /PDF /Text ] >> endobj 570 0 obj << /Length 2821 /Filter /FlateDecode >> stream xÚkOÜHò{~Ò}ˆGŠûÜî‡íìé$BHÂm°ÒåX¤33†ñÆcÏÚž§üø«ªîöØCa)´»««ªë]5|/‚|/‹ö!X&“do¾zÙío¯¸]…ŽAÞ¿úûÅ÷xIJ(ã{ç×$ç‹‹à`™¯g<è‹Yȃv !ùvJ)ƒ“8ùø7eðÖeU¸TM»ÊûnÆRÇ2H¢Ùåù¿^žì¨8~ŽayŽcI8–{:•Œ ©ˆí}$j³H¤P#È…¼¼žëË3øÿ×C|†Á»#|èñþ)¾à«Åò^ª•EsÝ´p…·òÞà(;ü+ƒ|>ÇíbÝ‹_`K‹à¬(vÅ „f:ÍôöðN HÇ#Y páÐ#‡‘ϳbÞ—Mm8„}–šåÅ»²Îñ ÷†ékX’æ.ßàF¬ó›Â)õ@…=:¸çxˆygHw/”±ÃÂã*2z„R—*h‹Ž¤½šÅIp¯¨pCHôKø*Ìzµ}JŽÓàÈ\¼¦çšu‰ÓΫUCèì~·–…Yß"|îÍÆ=®› €¼^˜ân ’€¼fÞ£$eÜ–À ¡qˆ'Èe¹¥gÖÏnжxs U$„húøy³©‘zon€ëå5 ]GýŽGEÛwæ¬D{_ Qc˜ž+»œÁÖïW y2~Ž<ÈÍ‹›®$3ã‰ÏhŽ ¹b™Ð1q~x0Î?±¦Æ°ÂAhù%¼D| ¡éVh¡UYM‚¤ …8É&ŒÄIТœ\göò¶0‹kÂT5x‡Y,ÌÁ•U(Ò8L([GÔ2¥÷´º1»K‹”>L@ Þë„0Q_…â”ZQ4++ź0¤;<Ô.’À±CIÛ(¶žÍÂTòàË졘Æ\¬È«ý”ðÓŸ¥F´q*ìÍ­+gÐáL [fiP7È#0Ñ~Ÿ)xRµ):†‰DçK¼f)’E³¼S„­Œ{wc«îñae]ø[„ ¡,­5hg!å`rͪ¼YŽ |x#žµÅBŠ“º˜u‘¼³i!G.ˆMI–©©‘—5`V±zná°ÎU¢žØ…²3û7ò%'D‘*µÃÆí²¬l„‡õK+.h¾*vEJaÂî’…º—‹Gäæ‹áGÿ5±ÐâºjòŸX¢Kâ$~(ÇHEËQ:A³ÈIÖ³ÂSzàô¼ä-$S±N÷ÂX0‰ŒhJ†’éH³ ÿ—O ÕCÜ9…ÿ üPâWeÔG™h ÓÂb=_:!ƒ4Vmlӄܼ)Ý üTãúÎÆn¼j‚F·E p{lzx ˲ÌÕP€_VÎÛ»m’±ËÿúH ÅÒ$M-Ö­—>:q Ë4³P¯™SÈ3(Ò$›Z×ÅÙùåÅáO?Î.í;ÈLþfþüZÜß6íÂçr"ßôMxSÔE›“Ïã$—~ƒ9?æM lê Œ€¸ÕÔÕ½½]UÍ­»FŸ8×ÉD±fRñAÜç^Ä,áÉT#†ØÕEßtŠ1‘2.¡¾•:e©ÐÚcX¯r±—«m‹½ëQeæ.…ã[¦2›rÃm€“ np0#ë£ãßÎNŽÞïþqðõóÑñûÓ£XŸœïüíóþé³sàüäãéþ—OG?NŽ?ì^>¡€„m]»Ù´vUÕ¢³"vŠh‹?7%%ˆwPŸæ‹rÓM‰j:ù÷¼¨{Ìì²è×íGüÇ~<g‡¸&¦ú\óÞe%Œ«í¶Æ*½ $…`“9‹xhÃ&²„Í;_d¦)xh¨oƒÀà¢~·ºìK¯TfAÜhó¹ëðç]¶„áÁ[[Ád1Y‚Él!æ)Ñõ;9tZ‘Ø5ïiÅÁ  ²ŽýQ2bã‚ ,í6wQö¦v¥-‡òuƒGc[°!ÇcÅlº€¹3¾Ü¸ómCU¯QUO¹‘Gg¥Š}A^mëz[D²¡¼“©L^*¯bm$#y–='™ª4ùÀEáÚ¼ô 6óª\¸+¹=èÖ¹©-ÿÀµz¹j?½ŒýXúØÇÝûø‰ìÇRŸîm#Õ^Ùò[ƒfà€†Ò‡ ¶ t(a¡øì£ ¶ƒ Ç€¾ûBߤÙOÍŸ‹cJÏdc^… ÐG·ÑÏë©)‡.Üú¤M)wŠÛ›ƒ:¹|0_áiÆ$OMüF*}¤9àÂ1 oÒòá¨9Ï’ƆÚ¿ŒMu³¦†¼µ[T²r•ìšfžïZ\iÃ;ّΞ´£ˆÅqÏ_×ðÔÇÌÈ‚…#8¯í óŽÛ$UøV…‡áèÕ‹"·Ïü謧oGf3gÍl"Î=o6#À'ÍÆÁÌ&…°™È¸s¶Õ®„V±ßW*øÃik8°…B 3µ4’¹­ÍѦs­9žê–Eg¾¡!"!š1ƒAe[f8m oO¹ïfSå­¡¾È‚›?n8a lz¢êÚRL"ÛÞ_dS-t÷¦¿.VØFkiçCR¤Ã¸ ×ÄúŸÊIM[¢ÝJ‘ë*w]¾À!]›Ó`Ãd&Ò7ÛÒÛšAÐu(Wrܽ¹÷¦é„ñ”»"#Ü’%ITŠÝ»Ý([C˜ÞµjŒphúVÛîݾ4¯–Å¥•P¬#¨võÎl¯/WV'}þͶ;$xzü]X­ÛÝeAURIá°0ú)hæeUß8 Ë­ÂÍà°ïÇ&Ó\[8§ kf&z)܈ªØFžÊ’æÑÌ¥+7°Av‹ë|S™©§þ¥±y‹•ŒäèÏ Mb¾—N¾·ˆ]D[Þy죯Øw‚ÔÈà ÁÓ¼.ªá¦ßx†½†k6þqüÏ|áíþ€Yž8‹±Uî•Ñsn+\¤:oV«¡z\XÚ4âøŽ·ÙÑ,J¤k Íø#T½1MýÝ[‡‹$Å=­é÷×¶l@‰Ìm…”÷”RË«°TL™ˆb‡›ý²ì|#K[ÞÏRŒ*G™Æï̉M°•žøùDžAÐÙ¶)|¼òWЭ'Cåïâ#6…¿àR›’³:º¥é`K^·G¬# ¼ûFçvæ¾hGíç¨ëÞrõÖÇ ´þZkû¼³À”‰t‡•VÏïRØÿ‘aÞ”ý†ŠÂ7ÓqîÙûép®ã§èä=E€ÍbdY;f ƒº#ÊGB@íXè§eëª1Jd7”=±Ü: Ö-¹ïÓ²Õø"þ´lu:Œ>éÍ:²SrX€`oè7…Íвù…Ë™æ"~Z¸2JÄ–/ p×)à÷HE s8CÅ}x´.†¡¬ŠJ¶-Ò|ù^ÀÒÅ™ÿygKL+é,å‘ñˆÐ¶2 CD)‹x¢wJ¸åvF1éÜ^wOÎ^ÞVÈî-+'ìWþÇÄí‰ endstream endobj 569 0 obj << /Type /Page /Contents 570 0 R /Resources 568 0 R /MediaBox [0 0 612 792] /Parent 550 0 R /Annots [ 572 0 R 574 0 R 575 0 R 576 0 R 577 0 R ] >> endobj 572 0 obj << /Type /Annot /Border [0 0 0] /Rect [336.6896 681.4072 518.9697 692.3163] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 574 0 obj << /Type /Annot /Border [0 0 0] /Rect [343.4444 343.8292 522 354.7383] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 575 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 331.2846 189.4184 340.4361] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 576 0 obj << /Type /Annot /Border [0 0 0] /Rect [340.2294 311.9567 522 322.8658] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 577 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 299.4121 189.4184 308.5636] /Subtype /Link /A << /S /GoTo /D (Non-Euclidean Geometry) >> >> endobj 571 0 obj << /D [569 0 R /XYZ 90 720 null] >> endobj 573 0 obj << /D [569 0 R /XYZ 90 532.9255 null] >> endobj 568 0 obj << /Font << /F51 9 0 R /F55 27 0 R /F52 12 0 R /F72 6 0 R /F67 89 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 580 0 obj << /Length 3013 /Filter /FlateDecode >> stream xÚåZ[oÝÆ~÷¯ôR 6YîKºíƒãʉŠÀlE (-QãsÈ“C*’ô¿w.»äòœÕ%}ÈKa@‡—åìììÌ7ßÌZäðOTùU*«´µçë¹{üõ…pW)ŒHÃ!ßœ¾øó;#DžUy%N/BN/Î’·×õæH$cs”Šd{”*¥ýú(ÕZ'>À›o¿Ç‡:y×íªñ7¥Núíº‡£TêBêÄŠ£Ï§ÿxq|:©c¤|JaÑØìh\”:JÒøÓé1¨òñøÃ·ßüW߼řwjlVä9ˆ*&çÕ~"¡‹þjKË¿náÏ9¯mƒoû£ÔÉÏÍùØö[å’ž¯yÐxÍ"ðz I7hÅkúSnr§“ u•ͤ Úüûo©ˆ©.%\–•‹݀­Ë¤_ÑÔüÝÂR©´6³RhX´ÍJSÒ÷Þ£½`û„HÞ€·Ç¿Ã^Ûfw?#í<fL…§„þ•2ùý-þôÛ‹X`X•©bJ7];>™}*®+¸ïzDÇ7ˆÌVÊ0OÏñ÷¥Ìb‚R7¦ÒrÑãÖa0lL”œþvø ( 'E¼ÆàíÙá`H,²3Ìr†#[W”uÁI!z…õ>Å0usÂÕšàmÄO1RpÑ€‚¼ƒÆÏ”6\é‚-ŒÙ«Þ!ÖK£T¸°H¡; {ba{â|™‹Ë]NOûÄL4ÖÚL¥®P°ZîÎ?¯çX„!ˆþfÕz£¸pº¤Œ?›LwvÐ-SC35ž@"Ù²©©¹¯ˆ™hû³P:3Â<#q+UÙ(‚)›†ÆE(>ˆ¶¢ à~™‹çA®Å¢êG;{0µ Ž˜&p¶¹Ò@€òj§%†MJT„x3—\Z0vI‘ÉCˆ’ëeÓ=lÁ£Úm]Ÿb* i~–yÆ:,4"íà#‚ óX)FÌ~ø ¾7ìxõ;' ¼Ý¨‹–⬠âüÂ#5ŸÛïþ‡Ò\ëwÔ:8€)‹xå½åwÜ}6ËmçÙÓYÀ®Ètð½Ã ‰È ÈGç÷g­0Ðë@Ì =iÜÞ;{Z¤.o{ì99o8²a«‚Êi±)P3ã§¾;þ= Te&r Z¥Õ"hw`U™AI^¯E)HÓ¸4Ö}Ë”¡7EeVòÝÙ'¸ã•‰„2VAÛ¨‰ÍwµÖ0¡.ÁñBe"Ù`÷”Öûƒƒ\ÐgÆušs8¼eúÁÞ„ÐþrÓ¸7½Ã+9)øÀUÓ5["þÔåq¡ìOƒ>ùûT1¸X6±–S3.[­åbòoL,§6ÂÔ‘õЊt3ÜÔT Ýûªa:ßÅa±|12¯|ˆ¶¼  S—0Ò7ÐèIÓIÌq>WL±–^´ë¦ÀLþÜ7Ú†~÷:¤O‚0°ÒLXm—ÐØíukóÝÚ%W6S…ôÕKÔX K¼Œ YÚ ‹…‡µz×îÊŠož…²&Üã—´AwÁµë®zúß+7¬Á|`9#w;SÌ·erÕ2Ÿ·—Oûb•—VÕc¦-Co}†Æ¶Úèâ”q J}çÎ?MÛѵ!e@eU@ee@•°Ø‰> „ÆÜš]2N81‘ØV­ÊYUÿÇGí ñô¿.žwº`¸W¨ „4là噂¾uæçŸ)W> endobj 583 0 obj << /Type /Annot /Border [0 0 0] /Rect [336.6162 508.6551 501.7998 519.5641] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 584 0 obj << /Type /Annot /Border [0 0 0] /Rect [124.3379 261.5568 354.8533 272.4658] /Subtype /Link /A << /S /GoTo /D (Transformation matrices) >> >> endobj 585 0 obj << /Type /Annot /Border [0 0 0] /Rect [252.1896 162.441 410.4888 173.35] /Subtype /Link /A << /S /GoTo /D (SPHERE) >> >> endobj 581 0 obj << /D [579 0 R /XYZ 90 720 null] >> endobj 582 0 obj << /D [579 0 R /XYZ 90 629.8547 null] >> endobj 578 0 obj << /Font << /F51 9 0 R /F55 27 0 R /F52 12 0 R /F72 6 0 R /F67 89 0 R >> /ProcSet [ /PDF /Text ] >> endobj 588 0 obj << /Length 3286 /Filter /FlateDecode >> stream xÚ½ZÝ“Ü4Ï_±Å ÞºXX¶lÙ8(®¨ðÀ^ArUÞY{°=Ù,üó×_’?Æ»ÉÝT*kYj·ZR÷¯?4ú"‚ú¢ˆ.l’¨ÂX{±9<‰¤ûí-­(Â)ÉWWO>û6Õ:RETè‹«Û“«›WÁ×»òx©ƒ¡º uÐ]†I’æÙehŒ ~üF¾û;Mð-´ë}å^r´Ý¡úË06Yl_¾¾úç“\yqÒ8þÀH²"q<•X­l”›‹,7J'&%¹?ùâ“Kø< nA¨pÓ6CY7u³ QŠÏ¾Í쌅6*5&†IñÛ_£4zÎt‹©´2@'d[c•*[ÇH'½Ê(VV[-dï?Èè/hÆ(„“ëj‘k® a¬S•Ú(»¡Qè"¡/Únk’)›W!ùhžÉÑô÷‡ëvvÕ±«úªðxš¡+›þt'l¯ßT›aU†_᧪Zª˜ŽJ[\dðEb3Ò!è¦á‰žyºpJ¸bç yæÍP·X‡}äæ«çßpãê2OÀzt k+GrÜi4 XÕãß×ðþ”GåVL*M—‹Klª¢Èä³Å­‘§ûÐâÎââD›ÃÄ¡DM˜ºii =±‘в(ŸþÕÝelƒVÖÞvÂèûç?ÁçWüòk¤Mµ¿Žž;JGVn6D#$!Õ³U…¶ #9œkô¾Ý𦯨“)P÷5–ÍÍ¿X«XÇŽ¨íêm½Ê,É’DèÜ^äZåÚ¦s…}ÞâÀ–‚V±+‡µyÓTi“屌4VQl —=³†ýÎÚªý%þÓ¬ÀÁµ©2•ÅŇ—h"€Øí,2­·MÛ±nà¹p¼ßrsØÕt¢+¹J‹,†  WkÓÆ…Ò:wTí5°Mƒ7ÕÐ22 èêJ_6kÓ…‰±*JR4üDé4bE¡guw­Õþ\ÃÂdÁß÷d°-ØHjâ Æ¥FQðü›ð]]Ýžá»xáÔ,IÌ¡~'Ç‚}ˆî«*œY.sº\Ë÷U¿z"É©£Û´œã€ŠL@’š$èÏÁÑ€ªš4±i¡U’Ûìpôtá”p?ήE¸A–þê;øû`Ì#cIŒ›oz:Œ„&Í­õÎCˆ€æ•Ú\ÅIV<€„Ž,œÒ­¡ü’ø`͵V«ª•¤Ê˜(ÿ&[hÆçŠÜ3ÿ»0v…y§éôÃT¨$Íœg“¿AãTîq€Ù¬C@‘f°Ù¯N P¸ÜÕ{áÙ´7`I¬Þ¸Ô®D}¿C)VJ“ìJÚÓv'iUdQ1?xñ7kö‘ÿw/„ýp“8†‚ݳ?bß„ò–;Ð2߃š ¨uD L¼t¼Dí¼ÚîÛkÜ}|A¦øÜ”‡ öfÖ×Ülæý¦«ªfÞGgóz58‚ÍËÓ4[úpÍû=.4Ëᙲ‚ROÏn¼6ëʦF/ì4ýpfƒ’i™¬¥OÚ$˜ÿ{X8´ÊáLjÓHS½°ÏÑ ÁÀïCøz bbC[µ3@ðØ$úãÎ>×Þ[¹Ø‚Îèx®k°C-)ª\§–‚XŽjPJÜ6ó?H[í{ZúÝÎmBW‰²dÑT ²뙪€XöD!KÓå*IQ§•ç`ÄÞ;¸XÒ}"­ßÀÓó"²à“7¼å¡Á==yLSb»ç!´ŽR¡µ(x€ŸˆlĹu¼Œ›H¿i Ú¡FÊrÎý}ÏâÀ'ÃK˜Í¨Å~QЗäé*Áˆ‡)Ê[tnܼ£ècƒ¾Ãž<ØÒ|à+A$ôÖøö©°ø™óWÐ"C4ÃWÃ>Ô•°ßVìt«¡»Ço‰‚”…B!$Ùüû]<é‡`pJsäHÿ}¹ñ¢ÿ¯ ­é‘U‰öøzÄø±ôiJÇÎ>¡­ö£ö#xˆY¥èéŽXlü~ ™ˆ”êj‡_$€/0°š~©Ò ‹rÒ¦Ó<í ”HàJôI–2ÛlçžÙЇ#xôþÚÍÍŽ·ŽbøSv7.'^òš¹}Á:e| Q0-Ÿ¬&>‹¦XTR%€Y%Å7)&kh6<ÏKžâK~Ìf݉\>#_#>F€öK¦ùr]Bd/S}„„ÌÌ[µáÏ ~_#fkFwÎÀ035K?ɶÔTOQ¡3/plDîØšY× î"¶›™?,{™‹:T”9Ð h #R l –Ëñ)­i4€:d˜&€¢g~\³á¸ƒh*Ö¾~˱V„„³(²9‚q¥ÁØ‚±€Äïšsµhù AyÕ žÑÐ`¨ î˜6ŠÂÑâIrr‘ÝÌóQÑ¥Áq$‹_H¦Y^W{õî¡R|ßfñ¢Ê{,!œ_-õ%‰JS_:xœw¦U¦=mëáÓ4õì)eãçBg7öÒù¢Æµ]3†³ðhnÝÕT9k}ÉBâCFªI”†Ì»væ9† „Š dTEª´ÍÍ|›«w¾. ê¡WBHÈ\.‰gÑpúÓ«‰«Ž2V‰õUÛÇwt^ÄD'‚³md ’Kï^‚Nlã‚cp3´ëØ8r„Ò×£A:®0qÁÇm ’Sü4~Ÿ¿„/xs (G¿ÌÃâùfÁ÷.P!‰m!ÅÄÃÑgæÔÙòóä]Åï¡ægWNÓèB-Ât[bAHWºIvÂà%?¤®*ágãk8F $†²iyäãÔšlŽ’Öë©äŠéÑÇ%m™'!¸eÇÓÀ ÙD;b°ã_º¢¢Ià so&/Ä&Ÿ{$ÒÕÇ#¡ã–?—}ÙŒ_zØGyË·^,CøäYcöƒ<ïÝ äY|JûyGÈõÓÍi¼uZuê´D#à E%‘MAæˆ5™Ž¢€îOG¥<·–@çÊhmÿ§”¼=‘?}$ï”Q8=°QÞNâT0­4QAñùRx÷›£F¹Â Z8kùϵ´sUÛå>­Ša>*H1˜µ <‘–KDî#Þp?íZËÕÝÕ—Cå2L“P$BŒ£±ñBÞ%J@&‰BNÓ[*$’Ì›Çú½ÏzÂ}ëÕÇÇ “Ä• “«‰VeE‘ÌwK2#‰±~8¸kTb˜ÙæäJçz¬iß‘G[#v»Šê&W©õ?ts•Ô¬É-îlGï>S¬ë`MJžFj\•é,ñ^¯–kØ!Ë„V®²Üæ+VõàåC®Aüe¡ËD§¹ëÍÔù—§ýðùù.,Ê·cJ»V›©dy\ÒšF4⺶ËÎc‹Ö7!³*·tÙ1¹Ôùó. ¨ýž÷üøýão®Ö«ñ‚ÄÚ+à#SâgOéJñ”?lXý˜‚û‹Ž'm†ÞÙÉ& %i<~áôAû[ém¹9EãóIÜ9 hd±(¢ã׳«©øŽ¤’ËkT‘í£­7Ζo]‘ Wç¦ø÷i_µë÷¨¯„lþ×ÿ4ÄbénW7î&É׉A{ç˜hÉí¶‚ewîg$&QYÙ9füÔN€Ãmbò¾<Œ5ð³M û^D?0"¸{kùUXúX9F?x!ÿ*™Úˆ endstream endobj 587 0 obj << /Type /Page /Contents 588 0 R /Resources 586 0 R /MediaBox [0 0 612 792] /Parent 593 0 R /Annots [ 590 0 R 591 0 R 592 0 R ] >> endobj 590 0 obj << /Type /Annot /Border [0 0 0] /Rect [124.3379 633.6495 375.0048 644.5586] /Subtype /Link /A << /S /GoTo /D (ND Transformation matrices) >> >> endobj 591 0 obj << /Type /Annot /Border [0 0 0] /Rect [434.4537 588.6603 522 599.5694] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 592 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 575.5096 133.175 586.4187] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 589 0 obj << /D [587 0 R /XYZ 90 720 null] >> endobj 586 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F67 89 0 R /F60 15 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 596 0 obj << /Length 1348 /Filter /FlateDecode >> stream xÚ­WÝoÛ6Ï_a`•ÑŠEê«(ö°¡Ù:ëÃü`0E¦¥²åIr>äßïdI›eÃ`À¤Ž?ï‹wG9 à'gY0K”™N’Y±9 ˜üåDòÌ„?†ü°89=‹äL" 29[¬&LËß½¯òÝ\z™ûÒkæ¾RÊÓoç¾ÖÚûô V~úˆDíÁ¼¬Lÿ‘j¯n6y×ÎýPÇ¡ö5ÿcñËÉûÅAœ( ÿI`„8$ÇKˆ0Ò³8ÕB*Y±ë¦\—Û90ˆ¼í² I0|‘e(œäK%dÆkSoñ@Ã;îStôõèÚÚ5ù¶]Þ“ý2\çà ƒ(è?¨ñòAè È@”8¸Znc)})…ŽÀ2aíÚ±û‘FBc&¡²Ð]ÎÍ ƒÍÀ@¹ÿг›y˜z6DŠî•Ehr¬mé³´£òº+ bRØ-Ûy˜ †˜zE{¬önqÝò[Â_=ïö D[ ½ë}Û膄¹G‘ê-`—ýÁÌikò†fEUbpïJ„­‰Fºn`Óiˆ==µÜ9é$óö¸¯ìüŠõ& ²]:§!gp~AƒY®Ñˆ: ¼¼aF­5]^†v5}} ¬¬¦¸bÃeØÚh)È…†êø”¢¦å©¦ÔÊšhýÆÎYç Z›ôk[ºÜèL½wÖ–6 ­ &ŒœW£_n_7Y‰¢ƒŽµ´’öx-pWhÿ3ûQ+ïï¿-€/Äþû»|ƒ » LêgT(±R™åø³iXÞ¼aɬùê “ ð³¼zE‰ç“|“¤)ðF–VÇÉa,àÆ…ŒúH]‘µÀŽ.®¾ S)Oo^Ï~«±]ùÜܹSÔKrbÀ82•Gl¥;[MxÆ9M6nd2Fop yMm Ëè—sHNÍÇ8ßíàÎç[Ì7£Äü¯"§Y(U¦)ójÀõ¢®êf"öTÝÇq¦ CphšM¤pEÐPZØa›ûv߬òˆ¿öùr’³‰Uz¤ÏÀëØŸoi\<õðnY/M!êÕêq¨ZOôl¨Nk¿­'óùøù°»'Š ÐÂÕóÁöMY˜Vìškgu;kH.Í··L[X™hwÛ•{yS7˜°¬Q¯Ìæû1¿ƒ pŸ¡ÔèIĹŒ`íî0ÑD…ïXùn¿âƒ³«Êbƒàòž#·—Õ¦RK¹¬oxÚÛík !¦z8nN$!UéìåÝÁQŽZ\•˜0S.·†æ±©Õl°R_E„V; €F®ô*#èq4'Nîã²(H—™ŒgúBÀáØq¨4êÐH&ÛÉtXjÆäXiSÏ'jf ·ÐÐ[\î;Blò/‡&§WbÄøœ†¾Þãü‚ýcbÏŽº/îB•E?䩯IÂí LÚ¾vö‰¶C£nËQ_D¤Ï×€(F±·­;"ËÓImi3"{è´`ÞØhÍ_tRLmWA´sâ”o—´vAßÖ¬5™,m_•wCÕ;¾Ÿ%WZ_rÃP»BB%"PbW¿vEC$ˆGFHÐ\ w•…§D”>ŸÿœÝrUÃí,ëѓ‘¡þ÷§ƒˆ^ðrx ú/ûú—o‡iû†%8É0Щ‹ Ÿtq2 ŽÒ±JbשּׁøUñ\÷–m7FKn8ÜS;µžP«FMÝÐwÅ8¿#ú o?bsgòÑÀ)ÅQ_É^ÜÛ¡p}HÿéŒdHµIÔ÷Ž¢*ÛÎyU`B½ýÃùo‹ŽÆ endstream endobj 595 0 obj << /Type /Page /Contents 596 0 R /Resources 594 0 R /MediaBox [0 0 612 792] /Parent 593 0 R >> endobj 597 0 obj << /D [595 0 R /XYZ 90 720 null] >> endobj 598 0 obj << /D [595 0 R /XYZ 90 590.8883 null] >> endobj 599 0 obj << /D [595 0 R /XYZ 90 110.8719 null] >> endobj 594 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 602 0 obj << /Length 2513 /Filter /FlateDecode >> stream xÚ½Y[oÛÈ~ϯ0Ú‡PÀjÊÎð’. 8i³pdÑF}(ºJK´Å˜U’Ší.òß{.3CRÅN æ<œsæ\¾s‘¼ˆáO^ñE–$¢ÐYv±Þ½Šíã»WÒ®–@±œ’¼]½úÝ{#/d,Џ«›Ù&«Í?¢wÛò°ÑP-–2êË$I"ýf±ÔZG?ÿ o~ú€uôÖuS¹›\Gm·+‡~±T:U:Êô⟫?¿úÓÊ‹c”zN`$yNbkx­/Ò\ ™hCb_²¤MÝ,Q{ƒW2³ÀIÔ^/–ÆDŸ«¡íQ4ด©Ðy¢h‹Op¢ýBåÑP>¼A à¬fœ‘cæŸ}¸ú´bâ4›+˼âDH³vÛö¶Y¶×Ÿ«õàE8ÿú”ÿ µÂRÍô³LR‘¥  +¦$â-šT›4¶åàVpbkh»x ‹ßf  µLH¯Ð/šz]Û¯{zŠË®êvMZV1 2ïñÝVû9[dÒ5)œ‰œ4`©€.OQ&/Í(ö£•dÛQ¶Í(²D/%;ËLqÕ~Ý´´cµAß(¢šLOËõ•Ñ<òÝ5¬»rM´=?ú%6qÐ;”àgÌ„L~eê¯!IÂHG J&¾A•w¼îË}M |ÄØp´TFê;Rç= T³­HøÅ°­ºêµ•rßòµšš ìÊŽ÷°|n˜aŽŸÛOö~1Ä:LБt>×¢3C’¦°¿“eø=<ÉãèˆîÓTô EJMT£o”¨åzk_5xò}Åw5š"ÕQÉ·›º¿ãÕ/±Ô´-îž‘dÊŠ /ï·m3J´n÷ýС[¬Ù‰fâ)Ä q~…/½çÒnw U’PÅ:I„ΊÏÊž1¨F‘DQäRÍC<Æ(ÀB+ûà/»ü#¯0âiñuFð#_ÿ#þ},73’¯aˆ"åÍ‘ì2ìÕ"W€Êñ ØÍ7T™0&N,Õ} ¾±ÔÀÝaˆ a«í*†ØÞšPë<ª… hdÈâTN+±jB5¨¥H“Ô~âøô,Ê—€FÙÔ›…¡ˆJ”tÃB;2SÊ"`Ù×ìдeणô`hùºžaj9ØM€ œР‘š<=A¥ÃSöœÇž@¢àdlS.+ƒ¡Øo2 ¼Z¾vÕ®E¡¿XP&oeFýã2x¶MøfSaÜ¡‚j†yüê‰!˜(ÉÓúv»PEdóï=Å÷P½ÀûÕÔû7ÕM8€ë¾ÝU Ö5ÄõRê>¹“ƒCƒBc`CNîÙ(-”ÑÄE UÑ ¨kÒ$Záu§ÌDïk¼gõõ!×B$ÈÀ»’‚¶\™œ­ú%|ñI½½&x”#Âþ MøÆc>¬Ë ûƒ+kP¹õåÕ¹L”0Žî’ŠÔMár.ÿbC˜eöcqÛ‚aN5Mn©^³Ðgó¡2Ë\þ&´Ÿ™Ê¶Üv„͇Ð^€/‰‡—ç·²„cÍf^ÃáÃçBkéŽ%Ýçÿûá#%“õõP[? ÅPö­½_åsW.w4°2W'y¼«]–dtCí_øâi§ïÚ¦©8§²WÛêúÆö š;†>Lõ<=¹rÜð/½Jå!]æ™ÐJ»rièÊ}UË.œ).sci{§ÈS1-Þ¸e±ˆÓØYîê㙄—B°g½IkÁŠ[&T—äÙÿÖb¤óÏV#àý–/wÕ#/îÛΗ' SQOŸüHv@ èɺú×è­2åõMÓB·†¶þC¨¾ñ¥†åx¹·÷ÇÝ5ÖŽ¸FmâuÎl]õ®nœF~¿T>ÉØ„UŠ«ÄŠ×à6è2}‘í‘o|)™9ÏR9f{¸õÈöÌ¡–‰ŠEšžÄôY¾3 ëƒþ/ È8“«vwÎýeQ<=F—ŒÜu¬¨¡H @ï‡ÒfD¨Š6LÕî=þðê6Ü ÀCh¿`—­%¦Ž]·"ÉŒ®ùà\ºë' -—r!ì—…HRU<—]Ù;^¨³•ƒß66`}yÒ(aù”Ðñ¦­HÝÛÖ ë¤;W¥®?G:+vGAoŽ3KßDž•;Ÿ7Îç¹£ ÔøY¦Ÿ…<;Є›&*üYdî·(8Ñ>·;†´"‡$;Óû€QòÎaŠT}àq® éiGºÜ‘Î쌃#§€˜¦:uW rb&…žŠt£%6ßC½_[IÑ@Ây±(@eÙ V@êòØœO¢E.Š´8é“>èl£uËF¨k5œvøÃÚš”ç ð–ûªÃJÚ×g}£÷Ü,â-ZÆ.,»°‡rwh,UL#YQ˜yJ¤ˆ£ü9ªkÚß¿ Íe ÙÌ~÷¸ ²ÓP†J§aÛ-¨O÷ŸŒx3Ë0ra–çsßÞ¡Oc9su´¯Âˆöè'D.è&f(møËŸ Ýû-¯.A@ÝI}hîØl©?û]íÛ &¢uW•ÃX”ªiQ1–¦´øé݇ „Š40Ó[°ïæ[–v»hBZH¾Ä³‹<5õ8¡ÙΉ‹±0 '× ò`*ÔRÄŽI1ÿ0à›ý œàÐh­Fï Öª€ä”gßåž8ÒÕЯ©ÓÑz*cŸ2m ŸDÅÏΞ$h¿ÚÁæì*¿Î†ß† Î…c€tLÂðܸ"‰'õ½±xš&f? Øè'CÓŽ®·©h«ûÅù·Â•ÜŸFKÈJ ´ˆ&‘ßåov×Iwõ²È{.e¡ "—ùK¦«RèÌãäÊÍ4“èíÕÇË¿þ=ؘÐX*W¬áô^ú^{™ÄÊzb(¬¨dYW¨µÑ$`Ý·T•dS Þ”CÉ«Éï6·\ªó`Ã…$p"K›(ú¹æšF|–«MÅ·þ‡Ã7úÂÅoEÙ‚­€fÕdN¢•ö8Ò@–‰D.¹ Æk OÐ/P8aPyZA°kZûûÍðéÃk;YUY:–`xCS»ã”mÇ/Kjqq˜k0%vŸHʹ®^Cxh³IŸ·ËÏVk?!ÖÜ¢’[ ðÒíߨóûîfc ê¿8 ær¨á¡ò8sŸ–¸ÃdKReéJÿÆ|6C‹ËOï®èWLãõ/Üï½ÿŠ[Œ endstream endobj 601 0 obj << /Type /Page /Contents 602 0 R /Resources 600 0 R /MediaBox [0 0 612 792] /Parent 593 0 R >> endobj 603 0 obj << /D [601 0 R /XYZ 90 720 null] >> endobj 604 0 obj << /D [601 0 R /XYZ 90 481.4463 null] >> endobj 600 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F67 89 0 R /F72 6 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 607 0 obj << /Length 2478 /Filter /FlateDecode >> stream xÚ¥Y[ÓJ~çWŒv_‰»/¾ ÕJË, ¬€YAÐyàðàØžÄg;²B„øï[—n'qz˜‘VH¤Ý]Ý]]]õÕW=áUÿ«4¸Š¥ôSÇWùæY`ºïŸ…¦5‰ù©È«Å³otx~¤áÕâîl‘EñÕ»^gÛYè ålzÝl.¥ôÔËÙ\)åÝÞÂÈÍ{ìTÞhWui?åµÝ&úÙ\¨H(/Ö³o‹ÿ<{½ÕÑB<¦0Š\j‹«Pú¨l4Žå‡RiÒXù¨ª ÿC1›ëHz7øñi&Cïö èù_Ð2ÖÞ›ªÆþ²Gͦ†S…±I™Òª‹uG‘Aâݵ,±Á™ÙÀ]v¨]öm]²­žCW(½%Èî&b=ŽŒÔ5÷d9vå4‘Í]€þJFÞ;37o73{KœÕ”wëÒè´Ãî|¨Ú´Mêµwæ\âô\RK?ÐйÞ}ü¼p_D¾ˆƒØHeMáZK@SÆVhñþÝk%`Ç(4bÏQäj® 7ÒÌ é€ÝmÈîé„+<½ö2üQl°²«à¦¨NF¿ˆvYÓŸ] Îo#‰ŠÓ÷h…~ŠŸ7%˜•Z:p1J} {Æ]S Î# h&©‘‚ÅB£éP{Á¦t¹C ~¡tzT¬+·5ªœíI?s¼5M#s‰TøJ„ѹ¹ìòåÐrhîpzQš@¥-Á·ÀqÖØ#¼áÂ\¶mã;ÏžøqšjØ2ñujÂëæÓíˆ-´çû>7þÁ?î]•ã%á×?'Bd:jýäÍ¢øt³0U~|ô˶]ÕóvùW™.ÕàVÒ$µÂ¿\W21¨[í#’¤D ö!þø+ËOC[0#sžóÏ ”e>Æï÷™Hx >°Ô€¦×ÙPš‰p¥ 7ä8\f¢utnb“„A§Áa.oÓ[;ÒÇÝäFì]Loá—káG®F¶úÿ¸™sý?‰Ah0##­.[2pÿ?Þ}¾¾ù„ ÂmÈ.YœìþtìqŒØ½AÐÆ6÷1žSG¡Ðçœèl¼–,´Âžv·et%t‰AòE/Ç®“™…)qnQÐ+3³øýšÐ&9@ñ¶;p?"þn²¦ºÃ-ë¨ÎZBAxä.Úý°Ù°¦¨áÁu»[ r›Áav¹Eã¬éÄÓ´Ž‹Ã™®ÓhÑ™÷ K€šÜØf«ÒgVð¹4$ ¨¬µòU·%€ =Øè»¼"ø7(ö†kü¸ýðá5þ~„Õ葇<$È+Ÿì˜Rí]ß~€`UXtÁ]gÀªREfÂŒ?ÙææÖ1àdznXŽ.¯ca’m,Æ·xy` ô¸(š~Yq:CWÀYèŽÙ±Ä¾"A÷Á±ÌüZæ¸õ“àÅ$†J( ti*F“&%÷îúø`Uiyàž0Îà#ÆÑáï¹Ý rµŒ'âñ±sk܈‰ Œ'#%ÎWÅÆ#‡õQYÐc ÷Ã¥1+ŒFlâCÙáü¬>7Cÿ¦¥ ׺$}ȯBôRç‰Ï 3ÄíìÇË'#÷5:'ú  öþΘz_¸±o»Â…¯Æóƒ=¿Éл"g?lK×Þqè &cÍ6USTß«b§§o^[Ä5°AëQ«ß–yuWQ va<ó Ÿ©c%Çcex,»+~x£®4ì4ÅpBš†T9‚[%ÙJxDywýÀ¢Gw„W6yÝ]–†Eê¸[\î(/ÃRË.ãß›Ý8 "Š)3Á®0Šetûv«´ñ®À¢@º`ëeVÏÙš£C3krâ‘öò]WVÓ×Ò"ä”s-S²›SŸ¹pî(Ö–LS8¶Æ2.bª}Že‰i¨ÊšôP†q6üa‹uÚY0³*½„ߊØ%ÇEuwà©Çrļ{ ã);>ÑÀ½v#¼%Ôªñ®ê¬³ö‹ü0Ž&ÜR ^uÙ†Ó "ͺkqæjÍY\~¼*È[ÒƒIšQÚH&ø/¢¯òƒ3ªæUÒq‰'˜K5àYg*´jÄ“²)¸~‹Ù"Á)±…JF«¼ÊŽ„4ˆ8XKç'¦_“f'æ â©§÷h ;@«g.“ÌuâËDNÀáÁZ/òãPëKƒ`JCª³>[vUNŸB ìiUÐØ4”XóC7 Ÿ¼ ŒróSAÇsÆå‚„î%—Ê:R$È3€?¿âɾ=çL…´†»c9ÕU à.q¬Ïtu¼aŒréz¹ êê›blw„„IEï Y“ÿÍu+J«XŒù±HÊ<ì7k@,¥õôÛÛ°Ú{¶ ÓÃCÙÉÙ|LP !²pÑZg7,kÛHëôÜÚWRy$Ù€^‘}'AL'æŽDç#'[9(úíàÚ lü‰¯*ÈÙ¬æ gÏ#¸8y$×Õv{T½à÷ë²1î9>ŠAçy}Uïâj]™ázBq$ =ò/aÞ(`ÛïU¹'Š-˜¸;}!©/ÓÔâýï‘ ˜pt¨¼+•ð‹iÎÀxÙ1’> endobj 611 0 obj << /Type /Annot /Border [0 0 0] /Rect [178.9116 274.6541 323.0775 285.5631] /Subtype /Link /A << /S /GoTo /D (LIST) >> >> endobj 612 0 obj << /Type /Annot /Border [0 0 0] /Rect [186.1771 126.8156 364.1717 137.7247] /Subtype /Link /A << /S /GoTo /D (Binary format) >> >> endobj 608 0 obj << /D [606 0 R /XYZ 90 720 null] >> endobj 609 0 obj << /D [606 0 R /XYZ 90 720 null] >> endobj 610 0 obj << /D [606 0 R /XYZ 90 544.2685 null] >> endobj 474 0 obj << /D [606 0 R /XYZ 90 486.8156 null] >> endobj 605 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F67 89 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 615 0 obj << /Length 2618 /Filter /FlateDecode >> stream xÚÕYYã¸~Ÿ_aL^d`¬ˆ—ŽÙI€É"»Ø`³ dû­·¨-ÚÖ¶$÷äǧR-Ùêé ’<´h²X¬ó«"G¬"ø'VY´J” 3$«mý.rÓ÷ï„m€b3%ùÓõ»ßgÄJDaebu½›1¹.n‚oùq-‚Á®7"èÖ¥T ?®7Zëàê V¾ÿ'uðŒËÊú©ڮ·~½‘:–:Hâõíõ_ÞýùzÇHù–ÀHr)q"WB‡ Ø:‰ãT‡BiCëEUë‰UðSÛlöøÛ¶5}ңĿ[51A{·Þå¯ ?)¹™AÒsÀéD ™*:åúÄÚDAÿܬe ù% Ú‡ƒgØ;J<ȘàW;´=Ï”î»/öÙІ†9”î;À¢?mc°+ÿ8Áž´*æ;~¶öÜØ*3ašEé*ŽME`:°&(HË‹t›)áB \2D³ül·CÙ:1À)aÆÃ›¿Ùíœvdzº¿ý€b¡‘?T¨P˜ˆCï˜ïaƒŒ“À\ÄŽ&Œµ‘«Øˆ05Ƽ@#ÝfJ¸ Î%CᜟFÁ#Š;ú³£‡ˆœ™$3‘ÁÁ¸õýR™0‘½Lñý×rf‹üd¨¥V_c˜¢ÐÂQ”ƒ­1ßâ”Ã%nOUÁF¤<>¢BÍ;ž«`K—W¬<óÆ;ž^},‡C‹Bºß_N -qvv鿜r¶ïíò-ñýɃ-ØÃrGÅçþ%2Ñ cÊ-Œˆ#yç¥%ÂÈA^}`¼Y4›PM:Uþ¹d7”FyŠždÅò.' éì lÓä˜}¥ÏMœ6m¹åüù„%Fpž°Ú„R €IF©St¢¿‚1êó¼¢z%o¥Jâà QIXl ±^…¤$Œ•ʈ5ñÙT@‚M)xuõ=ý#ÿ˜cÒ!n) @v°eçˆPëdž ŸËý°íoTðˆV(=h3GY]@ᾚl”7ŒUx!#Ø•–KÿíùËÚö}yWQ’‘–“˜Z@•Í1Sëh¸5SôÏ5ŠvGFi«’qI)ЏôL‹‘ÈPzœ2a„ihR¦*{ 9GºÍ”pj.ΑS¥#rª9k™ŽÖ½SýµÌBféLè|éÞú’¡K`¡œÄ âI°|2n¹Žuò•?xêÜÞU`0DÏ9^ؼ*Ñ_{Î>Ä$—ýÏ>£~,-~ó—ä'µ+KU1Í qM…qšš×ª¢§ÛL —ªâÙo©{ߊˆÇ7Ÿg  h£Îºd”î¨i.þ•Œ“aÇD™ C þ‹£‹ž,ؘ•P€¥L_ëÉ<ÝfJ¸Ô“]0ô˜ã¤A§èD;?¸s Ⱦ£¾¥)xºÄ¨éYnêÏÍiö÷µ‰¥ê·rGõ5÷Eq(°y˜J¿ä?O÷–š— çõ„MB ŽáñÍÖ•®.ûgáºìŸ<ì=w–‚6òve"Ɖ¯9ËÓm¦„Kκ`øR HH‡i‚å„U"âò™ú ,ýr,à4.k7â¾Ä­r— ƒÇ®°ž7{þc2 û§\ß#ÙÑmÁÜ•½ë¶aE8ÖÔ‡Ñ -5ÏŽ}^Þ4¶ê‡¡ˆäÓEÂkXä}tõLe1^þ\ÿ«á 6sò‚dìËf_9ÕáÚL×É)4v/5HŠ<•¢1,OpÉØ»­;’ æ¥ˆ? ÕRœ©ÐDÂwÀuþôWKø«ÒÐèÈ_Y(ÑP®¸”l>µ/Ÿlõ Di”¼Ö›g:”X#þ½cÉí¨K‰€î´"9¤1.¼T¬Ã4Vbnbº¦cÕ¤h¡`³Ý±óÞr #_š) àËæÅ«H=–Ý‚Êw“®Í_Læå]¤ÈŸYp:wæä´³@{‘× «ò~¼~(pAUqcÞt–Sg[µ8â‚ù»oýM¸£Úx€q†/;¾ð§â“~jC|®‰âào+,å; –D„¤WÊôÄìQ©1~-£`?Zü¹ßæþ•¨u†¨N>}ÉKî„6wUxá ÿû'@#·šôââŸWà‡üÒeþÜŠ—°rDîlèü½Ç_/mã.P ¹!>¤èìíäÐx{õïî¬ö˜ÓƒÉB—i—I˜`w6UJo´]1ª—NÐmÁ8ñÌ8ûÎÚfj™ÙÖèâpÚ„/ ÕéåR}~âfÑú?=ùß‹ÍͤÿßcÈÈ0IR_¹Õ´WIòÒ,ãÃÅÖ]÷©É¿ã› ¯ôîž³õyøK$4:,„òMÏqE#Ø)lÅH<‚yËcëû¶§Ž[[Bg™Q{4Å(b?t6¯Ýƒü&”€ïòu4(›{€àâ­ç¡ÐÍnåPôT9¹`¿ð¯tYM"g•ÞµDÁ"Só¹'AùóÂÍ4Ì+* JV}¼nSßa‡1 vðgx»àëY=^¿¦+óî‰W'w«¥< !%téÔ1ž)¨`åÞ>?¶]ñ?§±[Û÷yçT+Ï¥žËz½’O]]6Þ,wÏg|¶mƒÉè úx(·wâ°@§þôbïò·¡°;ÂYáXчÄíWœƒVâN¬nt0ç0ùXS¶N“Þ\ïAtpì BŸ›ÝÞf–é‡Ónwaº<öoéMÿ÷±’’#=k€ÞòfØ••u¦ƽ}Ô6o@îLÂÅèL婬XohXy™ðµá_­Zw endstream endobj 614 0 obj << /Type /Page /Contents 615 0 R /Resources 613 0 R /MediaBox [0 0 612 792] /Parent 593 0 R /Annots [ 618 0 R 619 0 R 620 0 R 621 0 R 622 0 R 623 0 R 624 0 R 625 0 R ] >> endobj 618 0 obj << /Type /Annot /Border [0 0 0] /Rect [395.8908 662.279 522 673.188] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 619 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 649.7343 125.6452 659.4313] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 620 0 obj << /Type /Annot /Border [0 0 0] /Rect [261.0243 581.1119 429.4898 592.021] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 621 0 obj << /Type /Annot /Border [0 0 0] /Rect [308.6972 567.9612 488.1822 578.8703] /Subtype /Link /A << /S /GoTo /D (Appearances) >> >> endobj 622 0 obj << /Type /Annot /Border [0 0 0] /Rect [414.606 526.2462 522 537.1553] /Subtype /Link /A << /S /GoTo /D (Texture Mapping) >> >> endobj 623 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 513.0956 181.6455 524.0046] /Subtype /Link /A << /S /GoTo /D (Texture Mapping) >> >> endobj 624 0 obj << /Type /Annot /Border [0 0 0] /Rect [406.1636 513.0956 522 524.0046] /Subtype /Link /A << /S /GoTo /D (camera) >> >> endobj 625 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 499.9449 131.8182 510.854] /Subtype /Link /A << /S /GoTo /D (camera) >> >> endobj 616 0 obj << /D [614 0 R /XYZ 90 720 null] >> endobj 617 0 obj << /D [614 0 R /XYZ 90 720 null] >> endobj 496 0 obj << /D [614 0 R /XYZ 90 626.8404 null] >> endobj 514 0 obj << /D [614 0 R /XYZ 90 558.8241 null] >> endobj 613 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F53 214 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 629 0 obj << /Length 2282 /Filter /FlateDecode >> stream xÚµXmÛ6þž_aì—Ê@ÌŠozÙl›M°×¤º$èÉ2½V+K>IŽwÑö¿ß ‡”%¯vó‚;ˆ)rÈ>óÌ —ÏBøÇgi8‹¥d©ŠãY¾{ºé?žq7Z€Äb(òÃòÙ·/5Ÿñ¥aÊgËÍèåú]ðã6ÛÏyЙù‚Í|!¥ Ôå|¡” ~ùV^½ÆI¼„qQÿ‘¨ nvY×ÎBEBq<ÿ°üç³ëeoŽâS£È„Åbh1—!ZÍ¢D1.•¶fÿ…ÊfB€T’Ì\2®CºÑÅåÅÖÁ÷U¶3ÿƒ£XïCîLVÕí%-ZCƒYSd+¸ùíË(*"e A¹x6žHbcÉÔI=·Æ-¸V,’*›·6›¢2kRmÊÖ·¦1ßÑw±q¶U#±nëL-vÙ­54Nͳ¦)LKRUM¿ë¬ËàÞÜ™#ǘ«ñFò|-²kˆY–w‡¬¤óÚî°qZóË)û¾ÚÚ2eõîÐv$‘×;'[fm÷œ†Ù¦3Í“úŽÅºÛ:áj=¥bkŠÛmw!€»•?¹v7Ê·YU?N€¥1“‘ˆf 1rIì²*‰a¡Eh`ƒ?kŒ‡¿Í¡«kÓ™¼ó~Ý4õîQ°F¡$#–$:éH2©÷ñ¤Xš€e<œ5f¶–ß°.¸Ó^Z  —<÷uÛ‚¢BPQ± XâþÿƒEÍ\bªŠOÃâ7,†;ž„Éëè«`ñœº$¡§¸÷¿dŠ‚t Éò³yr’ K Ipôñd ¡±7y±)ò¬+êÊßçKaÛew³rȦCÕöûº<Ü™§Ô±rh­Çêœ-fÝë Ïì~qývùæêíOôõîåÍëåõ¯Üןnð=ýÀâõÏWo®Ýêß.¦Ïgþâjyõöæ_×½ªwï¡ÈU^߀ÌÕëßnÞ\½ºþ ¥zE=hç¹ÚaŽZærgå3wíg{ëµ'Õ•²­1ز>>Ê/™ &S Ég3l¸ã)ŽÉ„³(‚²Ž÷ÚxÓ3_º ÚO<ÓæM±G²=’j\ÍïW'jü™ã¬§¦j|Ê’4‰]wåæa¿@ ‘§§“ |(¥“cdÞUõÀ/yææl-v%n‘ē³¾g›õñæöÜšÊ4YiéìŠ}iD-dŒW6Õ- «ß;’¿øÛµX@â(qÖA3˜o{¨óCSÞ;5YÞÇ<!‡@,„f˜¹fq’Ï_ìH±!Wð¥¦3Çp4§ 5Uÿ£Nì[­ÓqàÄ!]··{hUãÀØÍ¸í=äHTþ³®.£†yÁÙ ;£„)έÿžt) eè=Ú‡üĉJ³„ÇžHßX¼Û^xèÐå¶À›'àP÷›ÑϪèÀÞŽw˜#0.׸¬0(ðVVvK8¿õò dr§±ÇÉžQ ³vf€ÐκŢ›x á¨ÝÖ‡ùɆœ‘Nj_&»3bjÜë×°É™W,*¨#Ö5$¶/îzðÕqÃC˜_R´ÇˆÌÂZ\®i¢hé×ùàb '¼šƒú{gN%X(R÷<º¥ä÷f×Õd3n“ä§[Iün¨Qu C›Ýü…ð)…»0–Ö'–Òb‰¡„pâšwýÄÖÜe ]81KkÍ-02qÀHŒ0Í¡Fƒ&Ovž]ƒJJ[š÷§Âç eŽ6:•¤ïˆGgº–D Ýp;ìæW‹{c³6¬çjÈ ëÞsâ Ðç–h½ap³KF: »õsÓ¡¦NãAÚ¥ýÁg /ؤ'µf<ÑzìÎOGûÃb=¥<oÉ49é–arn›{œm¤Ãb·mÉ])Šž½«ò`¦è5îì¾9SyþUi‰+s‡A›“D,)§Xû‚’Ò»ºŽÏl\lŲ5•`° Ð Þgònõ:ÖþSYOF´“ WÃÆiº ã\MSî?æÈ¥ÐÁÄzÜÈ- xÅ ±Å ñAC –Žâ1ÆRë'd/Ö3N<H—©#“Å §­7¶d†c±u%h!Ëm>U2ÿ·RÁÝ“âœñ+„ ºŒÂ€jºr ¶R'ÓîÒÐj†ñWäQ6ÕZs.Ñ^æúnØ8Û'Ód¿«!ékís-¾¥Ñl¤u&ÞgœÚpyOyÍŽ{€AÔvë¶ÁvKv@XûêÿZ%,‚wíÈ®ïV7´Ã ®tDÚ37Ù»EéØ:ËrS%Š¢—ñ×u|eIŸYåÚ=ü軕!Aq™‡*|8 ÃçÇwiñoŸç•Lòº¢Œí’³ç‰½BD¬QÑ#¬‰‹¹_S}ñlßÐáu–%iuªeò––½7pL!Ž,DQrZ#ôì(ð%šÓȕĄA[|V÷hò‹õ¸ rÌ+SÛÐüXx|È2ÝwÜqpD6"<‰a¼ÁŲ¤ŽÜ¾ZqO{?óº,È>éùféܧE"Pg¿ŸßÛ‚:ξÞå xÔ¡õ©¸¶íL¶~ìaKÁ956÷Ï^5ÍŽsJúUìÀÃ)“=|kº²+}†Ü™¦Èö÷—þ/Fÿ ’ endstream endobj 628 0 obj << /Type /Page /Contents 629 0 R /Resources 627 0 R /MediaBox [0 0 612 792] /Parent 593 0 R >> endobj 630 0 obj << /D [628 0 R /XYZ 90 720 null] >> endobj 627 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F67 89 0 R /F53 214 0 R >> /ProcSet [ /PDF /Text ] >> endobj 633 0 obj << /Length 2391 /Filter /FlateDecode >> stream xÚµYmoÜ6þž_áo§²ª(R¢” 8E⺰#q?]ŠVÞÕÚB´Òž¤õËî¿ß¼z3í8­‹Yj8‡3ÏÌÐ⠀⠴”~ª´>Xm_†üõ•0£%p,Ç,ï.^ýð!"ðÓ ›‰‹õ¿¼Ÿ®³ÝBx]¾X ¯Y,¥”žz³X*¥¼aæè‰Êûã¢ÌíG¢¼ºÙf]»X†*•§“Åo¿¼zÑ«…á·F‡ÆáXc¡´Ax'ÊRE¤÷ɯ§Çg‡g?½Ç]燌̊¥¾ˆ>i›mñŒæYËgýìŸl©¤¯#ƒŽ¸P8·ðu¨CÃñ×O!²JÃÜ9Å í‹DÄß/ï X$xŽH—¨¥ˆcøi?•0˜Øö÷ÓóŸŸaáø¯YX¾¬…åË[X¾¬…?½{ʪÁ_3§~Ysê—7§~)sjkÎÿў"rª+|)õg,ºù ÀiÒ0„a’?©§°e¬¬wÈØz[¦P 3[[ì»]¾fîÌp·TüíªÉï—ÈÕ®²ÒÈw:¿½O¸  ?Q‘…åÇìF~"”Í+P=÷¿E…ëæ«ù*àiäÌIâ Ú\Üd·çv=À=Šãã&‡ $jÐùA˜â1}ƒÛNa¨©W8u’~ «Ò‡ã“‹÷Ÿ\ZIåËXÊA+iå] N+™+Y|Ž& ø‘ˆ-ªãëÖá©3i$~ÅÖlBùÓ ’b·¦5Ù‘¨YYö ‡Qmœmk,»‘Ã}¬þÂT'W½q™ A 9Ú®nLAê -Å̇+ÄÜöÅÛ»ÎøË™¯yª«¯r£|ÝZ £$ˆÓdQ”û-i–U+¤¤y1ÎØ„OÄ>SCœÞIñ'óÛ¢¥=_#SÒƒ.À°aèw¹jM!¹Ûcw”hvøÍ¨”¹©8nGM§ÜgÜ<ÁBC*œoyõÃÎ,10T :d-äš5ø(*æûŒ%̱¡™Hƒa0î£îµó̈a09¡Ê‡u÷8 æbð]‰¾Ë` tŒ#¬²p’1íÈÐŒFÔèêÀ$Z ÷8†sx Eo)ó9ó~\¿ê«oª«dzGwyÍí'ÕI„m¬¹ÎØË‹!—7<ͽ$ÌõzTÛÌi‹ÖˆÁü༼ìfÂu>ÒЀ€º™ë‹P‡8ç)<$ $¸Ä.[oè&džÐðïEŸÕ$ÝO^1qÈoÆÑCs»ÇNH x?øA1m†-ó7eã£m=¿¬Ï¹éiFéxµaɨý£¢RêtÀþU½e;㋆)ÞȪ:y$a5{˜µµÌQäOÀ‡p‰,èK¬@«+³Žn@ðh£g!ž,úpXĕޥ⛄¦0«FÏwˆ_Ôô²/t%12<Œð9JI9²Nãx>&6š4ž„-eÉ•Vaßv\ožý@1< ‡¡Oèü«ÿ;þú/ÿ¼å¤ïò5¶Ûl·¡?&!ýÏE¸°oH_<ê†2 ÓÛëC¿4¦ÜæÈJÿ†Ù}aNslÞ§ê9¾óäŽüúùg¦®œZ°?SôSpZ†èîüʰ:ù–PÌ2ó ÐÃsc»ZÞöM ÷ú!½­&ÃÛªÙ…¡pHšöx® úhã~}Ýáw}Å‘j€‚Æ@»>¡ãº0IõAÍœ\|a€sù K E9·8qÈ[T#˜GYXul•í[#ñ`²ÛnÏPІ÷ëOvþñ¨óO‡‡ ½¥ý%4z¾©Åÿá2ýÙÂh\ÜÌuçðô묵Â0Ð^]a jÖ••öÀeXD±¸6™yGz_’gy¶ýÁt†ì¢oì_Žÿa`j, endstream endobj 632 0 obj << /Type /Page /Contents 633 0 R /Resources 631 0 R /MediaBox [0 0 612 792] /Parent 635 0 R >> endobj 634 0 obj << /D [632 0 R /XYZ 90 720 null] >> endobj 631 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 638 0 obj << /Length 2036 /Filter /FlateDecode >> stream xÚåYYoÛF~ϯÒ¡€’ދǦOIc»N›Ø¨Õ§´@i‰’ØP¤À£–Sô¿wfgy)tkéCè»ËÙÙ™oÎ¥øŒÁÏ4›…RzZ…ál¹{Âìòû'ÜŽ\ p‡$/ONÎ|>ãÌÓLóÙb=b²X½s¾ÛÆû9wêdîr§œ»RJG=Ÿ»J)çòÞœÿˆ‹Ê9ƒqš%í$RNQî⺚»BB9¡žÿºxýätщã ño#É„Är(1W¡0&fA¤<.•oä~×1Éò K–Å@UʤªpœÂ¸ÈQ¨c |ËÐå¾§ƒˆ€øÍRŠ!¥ô˜ddEŠ“¼¼P„ÂR"Ù<07}ć{AÀÛÌûúêôü3J¨÷86Ÿ¨`œ_œ}‰ƒï¿ˆÄQÆ·1.„†ÒÎOñ´¸…Y¨Ì}cÐÁÊÊ 3­z…B•ÐN³CUnŒ‰’’¶k|Jpu`Œâú0ÎZÿ}uz½xóâú‡ÉÔ÷ÀqÂTtcõ <Œ4¡ã²W "·N–í5Ï?·Ž\Ã&1Î9·©é¦iÂéqƒpÜÕ ÍöGp„Ö1š!O2Òœt˜jêÝIV—¸´ìŠrçé8%dcÉ Œ‘pÊE¸Å½‘tbûœׇŸißB–¥»4óeòγý6þu e þˆ¡ë‘Eù‡¼g‡íŽŸÎ_¾{1ÉY*à,嘳q”x·Ï’Êë¯lQ(Ǻ/0©Ë@CjX×®‰›ÂøsЃI3s=‚gÝî@ƒ–÷ÐæôLb0‹ÌU˵ 3eˆ6:8d:ãQ Ю0ÊÔøâ»n¾oùÑÄDRCÞj7øŽý&aéÔG¿0Ÿ‡Dqžó;,bxdG²‚:_ÅÝ adW G»öÖxr}K/qô—Cª¤…ÉB ÃÌ xù7s×çjtØ8¿!sââN!Z”˜üÀ9k#:tª»ŠŠÐ-ª*;0QY•)VéÆXRÛTÏ.IÖfDlê´˜¡!yÊ.a"§I{ÇöÆÝY qæàÞä5˜ÃµU0¦ÆÕäô€%6C`(ÕX}±]wµ7é^¢ d¶ÎᶬNʹ/ľÀÄ@/¬Š2)[â €¹“‚CRÙ)}3Ym,Hû6ÇTŒK·ÑmFä‹&³¤}±ApM5jmƒ.deéåëð]O: ƒ0ž˜î¦6uÛ Ì8ùegÑ}× ˜>©cKmº ˜'`”Çͬ¾=ó}Yl E–g!-~ÀdŠÜŠÄM‰ Tk LI8+pñŠfè£e±›¬”L@©n+åõâÕÅÛ{î×m:ŽsËø¶Lm[' ¨‹©æ)Èþ„ËŸ÷gòö3&Ö8¡(E#ï¢ÁøÜ7u§-6”Ç(Ëȋ‚ˆõ€)`Š25è÷˜iXÄ(9¿ ±ísñõ¨·µ^Æ•,¤´»1§½}CãöÝÕùÜä8¯Í)’÷%Š2逷iej5ôHl¨²„$i;9šÐ÷º‘o–ÇN)Z§ÔÐQÚBÑî4‰¢û(´©Ubºá@½á *» e´|J».vI½M1/l@c& 7xoY1Ù×f/YYFõ+Í-}µ5Ÿ1Ìqz;7‡÷¾21€›Œ é*±40üèG“„‡K8ü_aº W² †¯ÿüþòÍé_'7i~rÓÀoš€œjÍ!>BÑ]˜žÑÉ!­ê ¥9•U\DpIw„ˉ­%øÖD–RÒY”º+ÛV¼[Gãè¯luÔÑ6”Õ›ª+LMö|²¹‚¢µ?6ŸçyS‘oøÂÇ&ŒOïAÆ3ß{ŸQH?éñ=`C\ÞѸg¼FO¸­Žÿ»  g)5H×£*‘ýGy:âXge2[÷ÿätÜáú;g¬¿T3 yÏ—}§nÌoJý¿Z©þô„4 endstream endobj 637 0 obj << /Type /Page /Contents 638 0 R /Resources 636 0 R /MediaBox [0 0 612 792] /Parent 635 0 R >> endobj 639 0 obj << /D [637 0 R /XYZ 90 720 null] >> endobj 636 0 obj << /Font << /F51 9 0 R /F53 214 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 642 0 obj << /Length 2377 /Filter /FlateDecode >> stream xÚ•Yë“Ô¸ÿÎ_±Å<©Ųä×BH P\8¨:&•w—ŠvF³#ðØS¶¼6ùßÓ­–<¶1U+Yjµúñë‡~Ã?~Qƹ¬”y~±=>Šýò§GÜÏÖ@±“¼Ø<úã«”_ð˜•qÉ/6û “Íî×è/uZñÈêÕšGíj-„ˆäåj-¥ŒÞ¿‡×oqQF¯`n*> 5íQÙnµNd–ȨˆW¿o~zôr3ˆ“&É÷F’‰“±Ä‰Y!2u"3Æðª¹fë¤`yYfk^°$Žö]ƒš‰¼ˆìP–>pÈ£S‹J5-}Ù†6÷°èÌ¡w¦†ùõˆg¶SVMYØ<øÝyñ¦j$1‹…@ÕQ°«þíMeu»¤L–°²,…'~Bw=û×zGPa,  ÆÓ˜<ÚWIÝ fN‹[rê­©*šÙöÞOwAá-œ…Ñê§ù{Ðæí‹¹ð\‘È €´ðUÝ™äA÷Ïæ”ùz·]R_–L¦2hÜ-&îYÉÊ ºNR&³‚´ÿÙt]©vž‘9*\ºÖô¹s@pK—K—ó8aB¤…¿þ⼪îò?‡ wð¬êURDýÿ^A ‘ni£ÙWÓµ2Ú"ÕA!¢j]u´hü8¸À†I{tàsó1S=º¨3œç,ÉËbŠ€­â’;,·èUüW8û8g£| .+sVð8Ðá}ÁT`ùT¤™§êNdƒmpàDnAÚ¦îžÂVN×îçÒð`&Ì1É=Í™îÆ‘c­0l[£;:¬jõÝ©BÔ×[Z''9}ñÕ™}똹¥œ…z0ÅÜåŽzð‡óìÝEÄ’+ÎæÙ‚óç—ŸÉ8ñ”ŸPb}‹W7¨ìŽ®qÑv Tk!KénëSVw–&_Ѿ%¢©Žch¦¦¯Ï·ÇÊ‚¹¤`2Ogè#_.XC$,-¸ü¤r–qžþ‚`”iŠZK»{C®’"qz×x ñƒ›'Rˆ”Šæ‹)‹1q<ò×—6?ÿøáo‹¾K!Tòüœ«‘éDpî#ðZWsêŽè*LšŠR®W+„zÐgûŒ žÍ¬}4”§‡JUÆQÕSîP5‚B”.DȰû âõ úøÒó°¨ZÌ%QcqP•ù<䢢¤Ú´1ŠK¸Á³W4çy·*¬,µÇ”®hÓ¸¸#NÁ„’p=L>ĆJ°à· )ƒÛŽêî\½à4!™ÈD Ã¼žAvbš­Ö)—B—Dì`Ú4a•€NNZXÌ$©ï`¶w½LTMã/xê5п@úi1 àêêŒÉÒ>aY00ÖÐd6ÊÉï+¶ê|×DgQçXrrÀxлû}ÑÍÁºÐe€ÙÐj±ë²8T,wdx‹ ¿`¸LD›U)¢VÕSÕÕ‘§Ñ{H<`àzk©­Xp º‚_ˆÒ1ÿÇ-M$ÔEƒ‡{åWåÄI¨hÖµuw´„D¨£Âb–‘äå)1Ïá·O$KýLš30óèyóîÃÆñš—ôƒ6‡Ðñ‡ÐºÂºà¿ "P¦8Ú«'Ý’þ9+R!æõÿh›Û¦îK­%N‹`Qâ-—ñÛc@ÆÎw‰¡ïd¼Ö¾»4Á7·‹ÉSBûš ö¹C‹üa1 sls‡IQwÄ«‡Öó¤è»æÐÄzŒÄ`£ˆAÞü¨mÃ|ÆL2V êúO‘erü$€œeî= Çœ­½ÝŠ‹¿˜ú3Ó…ÍÔ[KëC…jÑ%g¥¦Ø¼}XY*{ ?ã£|—Kõ„ 2¡1tïpã’«ë@yí\ÔŽœrÐÅŠˆ-û š•¬Lÿ?A½(„W_¨d\°˜—ù ”ëD¬2>å4õWy›Ö¯¸Žž”úA¿öt1@c7óP“/)’²<ÉÅ7Â`¯Ì˜,dù-¶%Ö•€è&=œÝ[¡ï,}Qý€•×ñÑ"õs¸ãÌj+ç7²ÓPZÄeÎrè1ÄÓ: ¬îã ’¼ðM`c†l“dÑ›š(!ðFçN•¢ž²£S´L·_3<š’ãÿ¹JãÓU«ˆ”ÀØtÆ;Ê•›„^°¸oì“•ç[’N•¿”Ê–ª©m@Oôí`Ãg½Éò ‘ïDY)gï`Ÿ(¨ Ê…{ÍžÃ<¼‚ýâñ÷î\GÇõIµÊŽàzvkx;»ñÈw}Þ‘5Ai0#¥SÓ‘ó‚Ðãäô™ø@¹£ûê«á ¥Ê¢ã§¤—Ï,–°V‘Âód‚gC {ìÀÅ——"q9¾ÉgFþ•h?<¦ÉïPæ ‹ÓxÛ·èV\¾jK?ÐüZ×”*lÕZï°¥Ã9šÇ£úDŽåøÃAÎg—º& étíbÂs ÂNsEÎÁy_«ã•¹î›¾c OgÉRì×P%DÌÅDŸÁg½ G½šÂ@·ó ÞiM»{îªõVwj½zf.™½?yÝ& oGd;m5þLsu?ãùÔê;ëz{0Ûƒ¿Ñ.5Ò}ןmn– ±äØÞƒÞ ÏÀ’úy°ˆSr=<~¦gÑHtÎ+£¼ìCwDžf»1c¯K§±ç¾vü]’N¦Í­±ž-´ö½·ÆÞá‰:Ûï÷_XgßTUsÛÕ/sÀ~’P>ëÌÕºögªF¡DëScjë…ïWºíž;&Pâ3‘Ê/­äº=µàK¯¨šZÄU9œšcƒÛÊIY¤Ø´Í|tmn‚ˆms;Å ,xs¢ õ!¦N§€†aéëº ìo Ç|䢴¯¬9U&°nê@¯ÃÛ—¯6Á§MðŽòÔXC&@%ï¾ì·•ÙiUìPу\«6è6súUcm@ý=”ÿ›@ Ý|Á³éÖãgô{Si|>uŽ=bª¯/ýMZí!>†ePÙäZºû[b]ÎbQðE‘\¿LAÒuUéi QìÂî8ÿxHö§ÀõêèªÓ·Ýê§ÓlÖײÁü¦voõ¥4 ÖãÎÇvº¶ÆÞÏl8²’àð—¦q”†õŸs’ÎE°†²Ûƒ+æ.YÎJQàŒÿ]ñ_.“Y endstream endobj 641 0 obj << /Type /Page /Contents 642 0 R /Resources 640 0 R /MediaBox [0 0 612 792] /Parent 635 0 R >> endobj 643 0 obj << /D [641 0 R /XYZ 90 720 null] >> endobj 644 0 obj << /D [641 0 R /XYZ 90 533.0434 null] >> endobj 640 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F53 214 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 647 0 obj << /Length 2280 /Filter /FlateDecode >> stream xÚ¥koÛÈñ{~…qýPª¶Ün¯À]î.h$@c @sù@Kk‹Š4HÊ’ÜïÌÎ,MÒtœ  .w‡ó~íÈ‹~ò"/R­EnÒôb³óö§’Wk€XA~¼zñ—_¬¼±Èã\^\ÝL\m?D¯vÅÝJF½[­eÔ®ÖZëÈ\®ÖƘèÝ;8yý7Mô ¬ËÊ…—ÌDM»/únµV&Q&ÊäêãÕ?_ü|5°c•zŽayŽc86If„ÔÆz¶¯vÀ‰ÊTtÜ_MÅoJáwüoqWF×øˆÄÕ›ªé¼¸|\ÖÈ9U²Ö ç E‚ŸfÂZ&Ò<5 qÝÅbƒˆ]·„Q+‘ÙL2øïK­HUH °‚J£ÛbãÙíH€é°0uÓ“ @bÕ+¶/‘›ŠÀp}3<›¾:ÓFS? k¨íwk%SaµÍ/ÖR icò™šFÍ þîW¤ZæQÙ»=3ê_ñ™ÅúWë¼iñöò˜¬Õ°· ¯EùhÜ -¼¼mžiÙÄ篱´hkï…H©ë‹z‹~Zßò·U÷c$×t{Z׎ý”÷GÞC/*F¢>⩦‡á¡$ú«F¥"Ö‰ô°ï›=ÇŽ;û»Êu/émSSÜyLÀ°Ê9OýŠ´ pÇkC¿[±!Ïôá¾¼ÝyÅÒ+™‡Ý Û墟kðJ›L¹ý˜BÙègb•^ä%= ÇëWoh±iö{T»éznÝMYó‡µEÝÝ@ÒXR%ÜUåÕw7­Û~€U"t,þ5¶qëŠí¯ýühWø„!DìñZ)¬13ï–ϦÉgòKérþ1Žù üZ/} 9(/˦_ü>>›Iú’WÏXY]²Â~Ù»–-Ø\ÿ悲¯5,“Ôß´qß5]Ù—MXTÍh^—÷BˆêÎ\ÍËîvÝÜ»—“Çè»Ù‡còEÿæÑßÖšQÆü”¨U^WMóéAͱhÙ7×ÿKüyÂ+2 %pB~WT7ç›ÒUÛ±ýgš)º;·é@h½$®š6 bú—£pð+v¢Ef¸^§Ân Ù“T (¹……C GûÈá6ÑÑÛŸÖW«\GÞSV>éCNßc¦M¢w¯ýæÅÀ|·PÉs­3OâßClCzW(•¦rî³½·3n i¤;õ´ék@gx|UÃ#<–X1n ŠQôð9žŽ+Æ®ñv)­*« ®µåZþçg«½÷§ÓÓøR‘¥ôß„Žx„.­-O$.Õdè‚Nw¡H€‚úÐ!H™!©;çJÄ6™y—¢¥º’‰<%vþñöýà3Pk'éâQG•¢?! Àô~a±´:ÂÌH¸A™Ó´¹€Òò×`ÚÒùÓ¢²¬ÐÖ tlLeÒÍ›X¨§P#à[ eÝ(‰M* ò§£Fv[àšÙGè{p0¥ÇìÀ_½ùø’^ïŠ[G+)õÛ&Ü™IǬ.ôÜØ3¬>B7”ÏE•~ZÀ˜Üc'ùLm‰ïD°%)nÃi…Lòe7Ip™…àj XaqK˜×Y® ÖžT¿g(H‘©©A7¾L$þª±@n¢*³ÉLùH€ ´õ¶Ü»º›àÌãe— ôú¦£ßI#{÷¥ƒRä/EVÒ}Ïw;¹åkÛø–ÆØŒã%÷f©Ãí áÛXŽÂ5¤y“¤vª³gbE •ÄÁ¡fŒÍ°©‚g LU‡}Mëÿ®×æ^¾yØÑ¨-ºž€ú†NüpëKpÑž뤒¬T:Š'ù¶à˜gæÿø*Žè—,Qò‰…’ÉL[Uã›¢ÇÆÊP{韃&ÞâZç0ŸŠåk™Pïå×¥CùD:ìˆlsG¶Àãwjz²£”ä ü†¹öf8ÓË´§KV] Àd)[¤è}û!ü¨!\y‡õ‡4™ Õ¢äÛæ¡õêµM §³;ŸîèØŠ~ƒHv¸e‡€ŽŠîƒWàåÛKpž#xRÄÁÁ±›|¡ƒKS¡±WùÊŠló|!–°s‘¾¯‰ +aÝ>–b¤ªÜ« ν“ÀÙà{Ø'Uå¦ì©XætŠÓÁYŽ¿+°)Ùúðƒ^å$iÅéÇö‘>¯àd•›‚r—Êu&ö*`–§!÷cËj¸eõ 6&Ä×eC“2d£„{8no‚_ù)ñßT €åjjÇ8¶ÄwíP„DžeóèfÐOoËâÖW _—`³1ù<¼Œrµ‡7ä³4ƒô+—а !â¸mœþ}•õí7½`ŽÄOKžËÁòX"ŠŠ^¾±PÂ¥(·6íö¯Xí6®ë°Sñ圵þ|Ç L´ ®Þµû²º¹>Ï'YM“ ÖêqWnvL±—Äÿ ¶p$ endstream endobj 646 0 obj << /Type /Page /Contents 647 0 R /Resources 645 0 R /MediaBox [0 0 612 792] /Parent 635 0 R /Annots [ 650 0 R ] >> endobj 650 0 obj << /Type /Annot /Border [0 0 0] /Rect [333.5451 311.6937 463.5847 322.6028] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 648 0 obj << /D [646 0 R /XYZ 90 720 null] >> endobj 649 0 obj << /D [646 0 R /XYZ 90 359.2404 null] >> endobj 645 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 653 0 obj << /Length 1586 /Filter /FlateDecode >> stream xÚ½XKÛ6¾ï¯0¶‡ÊèŠEJ–¶A€6Í(‚h|Ks-ÚV+‰†DíÚMóß;|É¢ÂÍ&—"@DÉœá7Ïo¸xÁ?¼È£ÅŠ”ÓÕj±m®"óùï+lV!ì§[~]_=»KðG(r¼Xï%ëòCðòP—8lâ [†„€Þ.CJiðîüòúüHƒ;XW5³/ x×¢_†1Mcdñòãú÷«WëNÇO–[<ˆã)â8‰P't‘faB…{臢®ÏKP‘UþŒ,,BŒ)J(ÅqŠH„©ÚÿAï¼.Ù®jÙµ~{Þ {¡×•ôE„“H; ”GZ°×› ý]Ñö;ðƒ~•ÚÊ©æýÒ3!ªv¯ˆ\Í•0ï‹z`z¹ë¸Q(æS/†ÝN/Õö`6òºæ½5ýÙ]ºš:.ÄAQ–gÖDùöY†)ÅÁÛ—¼îµ¨ëó‹äÜ íÐlX§ÏçR§*¿´Æþ-¯‡¦íÝ}£97]uºñ9DœÕVEÖcQ²Bñ*–Ù£ ñ!OÐ ¶˜?y•Lw`ã¯2U@¾C×SxL>laÝe¸¬Ööo{Ãy†Ò8™eaÑ÷yßW›šMrÞ¯çOBÖ¹àM 7ÛN>E# ¥b5=–J®¦]Í Y á‘W­ñ‚N©þ….@ŠÒ$¥ÖtL<ØÎºcÇ„-±b¬E8ëÿÍÎÐ"¼Š°ƒoøžµŒ½·gì«{ÖŽedòã<~0#oK°ÜW1Üøáx´ýpü4S|϶‚›âm†ZTǺ²îäÅØ‘Þ¼º[{K´ç¶œ A†öH¯^ Ûº*YÑNŒ­!âÜö@ÉŠÎZué Ú£dêÑ/ì<úüCxòÜFp45 Ý3¶¼0½p4v$Þ•U[tg]NV§“„³ÀñÍ_LðÞ6ef‹sTù¨í>hgÂ.„e°ÉÇnSùuí¬ÎpêþtýÜ’ÝèÛ†‚RUÕ@¨ oÍI¬(½Y:¥$t©n‚Ëw¶–öæõ팃 öBzf ²«ŠMÍ\~•úsŒR’P÷hMׯV÷L…èg“††ÖÙ6z¿j+Qµ/Rž®ú¹XÉZQ‰óÌ…'ÅL$!ÛÑäóµDÂ4ƒ§rF!¶9;è$:[⛮ز ó»C^ˆs”d±¤ƒQ’éh-q•­¼6Ë^Ž}íøP—ò 60Ñeù]…-ü¾•‹ZnT"¬Ô¿Câú˜3ÉP”[”Ÿ|sð±T¾é@s¡Î`þ>ML¦VágŸB‡Øœ`qð«žj'ºuª™TÂo¹0 Ø£lÝ2e_Ù&]-¢¾÷Úìv ¾Q¹%›“x¥Úáè*Ùu Bhɘ“XêðÃ>CAr)6› ð¦ÚTâZ;B0ÊlV Ü"·ÞZ&(K’Ôm%?¶×Põ 6ûýxýòeÞ¦ï–xußu¦”ô”z¹GÞü“Aq½ëXy}ã(k.||¡awºÛöt* ‰~FÆ&ç™!g}¨zO:Å3ÃoiBòš¥N{\a©ôžÍ.ÐaôÍï}ÞØöP‰ƒ½8èçtº|ÜA#ä¹=½°$W²“^þÃ:ެ‚é­YRÐe(hg–}úò³,¦Á•±Qš,ç–Üh"žú¼‰¿%">«#;‚óÇW£Ùß+øˆü7 F_³1}Zp”× î’$õµÏ–¥ Î³/¯ùx> endobj 654 0 obj << /D [652 0 R /XYZ 90 720 null] >> endobj 651 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F67 89 0 R /F53 214 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 657 0 obj << /Length 2441 /Filter /FlateDecode >> stream xÚ½Yiܸý>¿¢³ù`50’I‘Ôád䲑E°‹Àƒ`½GM·º[ŽZšHê9vÿüÖEµ4£±Ä ¸)Å"ëÕ«*Ž^)ø§W¹Z¥ÆD¹MÓÕæx¡¤û_ZZ!̧SþpuñòµÓ+­¢\åzuµ› ¹Ú~üñPܬu0”ëPÝ:4ÆöÕ:´Öß|#oþŠ6x íª.ýGfƒ¶;C¿c›Ä6ÈÌúÇ«¯.þ|5ªãâøc ã”ã©ÆZgQšçn•d6ÒÆ:Òû×kXì‚M}ꇲ‹øëMu[6Ü%7¶å®jª¡je ¸noËK?©ê¹usúG Ûë÷åÐÊ¢PN…†ÛŠ´ÿÓáBm"íT:URÁ2™V=Vo*‹¢Õ±lzг¨¹£¿)6eäåÆId”¶$ÕøúOáýLö¥(·k7'9Ä+ééÊ-í=“a¦ºµÝ§o°×ÏJù:£™HÕÐha,F céܱÑl„(3ô¿!‰ 6Å‘¡Wô,gW¼Ð4JŒÉIÀï \ñµS*ðËc³½É.x=4„6ÄEý @5 JZ\ÁèpÚ²çEdœµkëÆÚuœw`-ìyzI×¢Œ4·*/ Ýñúb¢áT·Wã5ëH¹„NÃÂÚžп¤$¥Ùr£ÅÅ€4 B1Êqp'JÅs´-eIp¸]VÃÁߺ|æHmy¢vH7ˆB­;”Òvõ–Wµ/;wë€W´![e'¢’×ô;¢ <ˆ~<£cvÃ÷ºgÑýìP¿š`Kf¢£ €švà!²myÚòaq Û¦Üt-įKnxÁäŽwlEÖð‚u åt‹7•_Xxæû“WVÔ(ø‡f¶G\z]…KmЉõÁR2; 'ÇËHü¸•u6x  Õ\CPM¢éÌ ²¯xÐÞ¥ÌA7x@ÕÎú ‚–Î`ï-ClÔU÷‘xóŒÊ÷±Š,p9­übÉñ]”Æ@)ŠfìZòºH¾äá±þ2Z–, Í#“'3¶Õh®bÄKIGƒˆ«ÄÎøv²ÙzßÁ{M üö§ý¾í…Œ? ÷£œê©4¶ëÚ£¬>H×ó¤—ˆ‹JS|Û‹²‚üVr˜nr tOý©÷§µ@tìˆÜ†ØZ =ê¿ç*¢ç[bNcÛWâõžU­á€Šºã!ñ{ãWÜð–HR qÔÅPXöR@È·—ï.¿ãX‹³¿\:NU—ê¦ï˜= hò’îeíÎ[™O?ø9Öûž¯ÛZsÂhífÏcä„grlw¾uKäÎÄ*Ûû]Þ‹„ÝUÃÍu8Ç#„N.NàºC7-Ëf~àiñB'}›¡ºE¥?ÛšqM±‡ Ôî;JÕ†ûo«òŽ.†s“ÇNÍ¡b'4©Ç²gj`a„aÆóaíj Úøblœgð²,î„ y¦ZØëýûh%dYåh§#kO:¿ý(-}ÛW?¤ñ„Ž\²<ýî£Â^. q0zòÉ ½ûœ A8I ®“x †`óèB-À–ïºØw%Shi•escÞaê†gÆâ¤+dŒˆä Á‚š==æ)]ñ¢çž;Ÿô4[Æ\Ä5ÌïP€»¸g# …D5ýăE0î¹àVË`–8>M cÈ $G|Ln>÷î†&ÄÎ úòåñUR–1î{a­ªJqÔÉÙÇÔõƒÎÙ”E7K4ã`ç{6uus3aiŸûÖE#)ò¶ê!`1÷Ïûí×-•Ö*ö@âjø¸æ¤a`MQÛiâ„Âm¼ ‡tÂGÇÁCú÷#CÃMt¼p8 ·~bÆkÅPfü Ö‘E +ºý¢·GPuØOö=¼À%Rš(QÉÿ•ȼK   ’Jì‡tä ‹’4Næ¶|&W¢àë¼—N-*“¾ ¯O\‘ÿ4 ÀäÄJH8ä©•h€|³~ „Šõ‚j/C/³¹è—RždRþID€©Ç‚ÓYšç1¶àÛ·U_]ã†K¯‹„eCÎ&× œÝy “/·ÝÌa(ῦyc­×NË1|Ès}*ÁZT˜¦ϺãÛiÀ¤º`šÆ"M‰>¥g`¾n¾Ñ9Ùh}µŒ 'Ù€šçöÿ\ô­HA¦>æö·K@„ª_gÚcþl§mN‰ qò|‚ó}8!\ø’‡áŸù‡Žæ0_Ýwt¼RäT²B¸¼Iýœék!—s¦kj‚.O'rŸqÙïŤ‘É23·ÉsÖÏŒ ¶HìC\‘]‘²Øö^¡¸C"\¸LõLbóiáÓIàâ”\ +¥©5ÿ© E½{ØUhˆ%nJ#à&=š’·ŠR?‚(YWaôÃ" M£15ôò̬h§sÞQ6]ÜKA…³Ï97šO ¼U2{Â€Ï ‡Ó¶£jŒ q‰l"Ç)Jþ&ûîkšò+b4§/— ¢Ø÷D%|< Û¡+Qէ͹ˆÓôD& æ4P•¿ÆŒ˜à¨¹„IâÝÝ<-ÁíÆô~&Šn%AË!•=„˵҄lDsÄeWÖçäch'•ÃþÄ1•‡d=?}9™üqMí·ŸÒQ}®@¾”-І*<úx÷ø™Ù¸8rýVÚ¨ðùßßÿ¨VÛ µúêpœäéê_Ÿ£Ø€/ â1óßõÅÛ‹¿Ÿ¤Gqá(oáݸ8|'‘Áïùk¦[ê¢\göséæÅ}X·4r«'º5{JÓ9/˜jhuAÜsŸIÃQÜ5´@/hæ¬à j/ù'ö(’ì0Ö€!K¹I¥P •‡ªgÁç‰vÌl'/¨Ã¡¥t±¸A¿bš…xá3Újx!Ðî«ã å˜ Z¸ï$Ïÿ+Ð>Å©ÍáÊ@˜†Ô2…뇃—NE.¢å¸ü¼õó€ôg¸ú³)é%~TÉ\ L> endobj 658 0 obj << /D [656 0 R /XYZ 90 720 null] >> endobj 626 0 obj << /D [656 0 R /XYZ 90 579.4039 null] >> endobj 655 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 661 0 obj << /Length 1708 /Filter /FlateDecode >> stream xÚ•WÛŽÛ6}ÏW~’CJ¤.›4@š¶A‹4û-Š"IÚ¢meeÉ•d»nÒï ‡’¥]%iàñ2Μ3ZÌ8üÄ,å³8 Y*ãx¶Ú=ânùî‘p#$ü¡È÷·ÿ¤ÄLp–òTÌn×#%·Ù[ïÅVïÂkÍÂ^½ðÃ0ôäõ—Rz77°óò.Jï'ç…é&‰ôªz§Ûfá2 ¤—ÈÅûÛ_ýxÛ›£‚àk£Èÿ°8J$¡TÖâ¥^-‚Ä»ÛÔÕl*32zUU&ÌTÌ"ÎA±™Pœü|^oPZ/‹3È+é•U‹åiú uµwbÀhñš3íVk:å„W( w¦ÖW°qo‰ÊÛ¡¬òÚ-¬!`*ò{”†-|%¸÷ÚQ»CŽnMaœ5N£nèd§äŒuËQ.VàîxÁ¼ f­sªaÄô¥$ àøRùÀƒ;Ëׯ|¾Š¼Ñˆp`2jKb…AÐEnà²ýázK¨ AŠ' >“”¥O·ƒ‰Óo¡ÆA†qIaé4ÛÊ$|¨»ÆÉ33P”;qk¦h¬‘BNÝn§‹ÉÝ÷C.- WÜ/jMm1Z«ñûú‡4XU¾EMÉìmšÚJ3UDD1F¡«ï¸âüŠ_ùFbª¤H5ºÉ?;EhS ï¶U¾TÕaÐçL“ÿã’JxÒ<õ>'Œµ_çÎÁŒb'ŒÏòÒ,Ä]ôt9s&äË[.|šÙŠÍ3oì7æ~ë ¹bi*ÙŠ8SPl±7v{Ð?{9(8ÑD*´álVmL]Ÿ…, áÛa6¼¿¢Å=…Œâè¾½RÆ,à‘Ù;Ñï{¹¯ÙûP!ÚëÒ:” ¢ åõíÖ½Mš3‰œþMKë… KbÁ=л?tžÍiª²Ú1ÔÅÇõdä†,Q o‡Ö™ðÄ^ÿteŸÏ ¹Ê»¾þΚ*bì”Ðj‚ˆ…Pá­è[’™Ó‰9ÍÞ/ü$…/æAµGVtA;wæ|ªê¬K‹®_â²Sùñ¢M`B9u¦´!‰;ËZÛ>…ã ¼Gj]à‹§µùëCz÷7øœ$ÓWef—ÆÝ÷´_žuw»ÂB>‡ôHxÚI®áIÒ–K!˜Tò^š}"ð¦¶æ×ã+¿ªD&àD¬Æ{–šéÒù_vKã±â×¶.¬«¢¨ åCÃ|Hõ ( c…Àš©c= ¾ Ÿðp󽩛=æâEæ¼sîýäó¡ý‡ŽT€_Š–öúš U’8æÉ„»àJ}ÊÓÙÖn«M­÷Û|5°¯?>"¯Á²_Íña oªo2»i»ª¬>o’ƒ R¢ÈÚ r¨‹‡¶Öe³†?%ϰÅ9[ã”ö»4…"Ñbu°|-«£é/¼¸pC[ÙÛ&.²~…1D_(úOr{b_奃£‹¤;_Ÿ/i |6»/&tæž8VKçîô³oU• Xyë´ÎÂ¥¹îyy„˜4—dBÚï[Ê:̆ €. …;àð€ó´ë’¥ ` ;‘ɬ6³õ¥-ô‡üá)j ãÒI ÀGÀ?BÉJ¼ùVëó:7ŽpÅ/ÀQ]ûøvË×­(óÖÏò¦ÕåÊ|¾Q·Ú1'ùã€F™ÙÔÆ4ƒPíUBu]Ѭ8¦ê®Ë͡ЮÎeÕÚ?ææä w¥gP¨æÀÿ–ºÞÀPòñ³ÊúÔbS¯æ_á{¨»`èbó%akŽ])Ì '¸g‚‹,Šàtü—0g°¹¼QÚ:ã:}ÌUºß·ì‘ÉÞ€Æáûô5 ¶d|¯Í-À#­:m¯M³ÕûÎoP2qOGÛàØΙúh26Œüÿ¢Œc´ endstream endobj 660 0 obj << /Type /Page /Contents 661 0 R /Resources 659 0 R /MediaBox [0 0 612 792] /Parent 664 0 R /Annots [ 663 0 R ] >> endobj 663 0 obj << /Type /Annot /Border [0 0 0] /Rect [305.9943 557.7908 447.2065 568.6999] /Subtype /Link /A << /S /GoTo /D (image) >> >> endobj 662 0 obj << /D [660 0 R /XYZ 90 720 null] >> endobj 659 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 667 0 obj << /Length 1185 /Filter /FlateDecode >> stream xÚVÛnÜ6}÷W~h(À’EQ·5ÜIQ (ö¡E \‰Z)ÑŠ*%y½ òïÞ´’­m 9ž9œ.vøÃÎ&pRBüM”¦N~¸ ŒùÛ6#<¼¹ËÛíÕíCŒø›`ƒm¹ÙÑ/í\Œæz ×#„ èÎõ¢(B>Àʻߤ1B0®f'Y„¸8Сw½0JÂe±ûyûþê×íD'Ãÿ",]V‡sÆ8‰ü§¡“¤`ÌH¦x_—‚í;–×.Åè^ÏX{ICÁJ:6ƒ6`άÖ?ÐòÂÄ'Žt˜–Qøv¡{9ñò¦îººÝ{EÝ´Í„ŠBjøø%.1ô5lœïòjºÊ7ðƒ‹tKž½Í‡šÌ³h&ù¼Ý>ç béÙõû»·éÍ9³Êóµ¯DÁ·äâàb–vûú@÷Ì„ÿnX(›ËŠ×eË’·:6ú¥OÖ2×rýÝÑüÛ^ð±-ô\áY‹Ž7~º‰2'&©ÄáÔÆ4"pÄ#˜SÎúÙnðæ;Öš:JýˆÄ‰câãò¼5ŸëæÀŸ¡C"XUGË–WÐ!&Ù ïÙNÐ|"~ûwЈ!Cx± á…±Ÿº ‘/ï9Qÿ@J:ÖrÒÜ%5ÒR3 *8õB6 ã ä7L`ä#î†lSŠø côÌJO®]û¾b¹4Ö°ú ŒõzS_ÿ-ÍìF*IŠ´+ïkYQpUæ Q9.4*AL\䲿âÉ…þÔkM;hÁ:0 ¼K¥_2ØbDw:ð(ÕÐ6£,Nh¥¤Zö öô©4É@U_ãX°Ç:W<ÍŽ™,¨j¡uà S’z”Ü©üwr3‚|EC£E‘JFV<¶•áþÔJ÷Ðè“6•’’XИñµ¥’f[*&k$·J—^úÞ™Xö+ñ³XöÒœ‰ì~Ôýxw÷óš€ØŽÖ®ç¶¶JÌ;YÚhË7v:rQLr€±Åêü³:XÈï/ÑòQ4'sÇåÕ¸Ñc^¬ÕCÁþkÁf!Rg8YêŽÄ¢íÉîÖß¡2šSò¦áp ½¯ öy‡(˜˜"@Íáî$Ï„ºžMïÊ“œõº?éÉJJZrñ/ã‹ZÚ™;uŽz¨­d˜>Mfö“²_àbµïOF‘àœÙ@ Có˜òÊÍõÅÓi9—Ò°r4 âcS(„ØOC½LEÙRîç›wÏjcµéê'P ûÓB'KOu*ÂîE–ýúƒÍè±îGÛíÒô¥T¢•3éwÁ–šêâ·ì½¡ªû—§=¯Úç’µ=[K¾êÀ[Õz76{ ½NØüµ}RmòÀ3 ¯¨(ŽTØÚUu^Y'Áà›çg~°t 5™àyŸˆìN‹T”4,›¥ðf õË—YYíï³øÕ+=<ÔûÊX þì¤ÉYv#ÚØjÚœ=+ìa­ÒäüÐÃô^_8k'øWà3]¢g•Îá7® ¶]zž×úÓ…†gÐü`ùÑ… endstream endobj 666 0 obj << /Type /Page /Contents 667 0 R /Resources 665 0 R /MediaBox [0 0 612 792] /Parent 664 0 R >> endobj 668 0 obj << /D [666 0 R /XYZ 90 720 null] >> endobj 669 0 obj << /D [666 0 R /XYZ 90 500.0913 null] >> endobj 665 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 672 0 obj << /Length 645 /Filter /FlateDecode >> stream xÚ…TM›0½çW =iízüôت»RUi©‡4–8 m!M/ýïc“%*â`3ó<~ófÆqü Êx”HÉ2•$Q±Ÿñ`þ5ƒ°£ˆ CȧùìÓ†8ËxÑ|}d¾ZÏÛüimL41•Rõ1¦J)òò‚žçoΨÈîËíREêfŸ·Ç˜ e„"©‰—ó¯³/ó -Ä=Â2ÁX ƒJ˜’ÚD&U ¤Òïv[âÕZhr.«U}f?¸Ç ¢0HÁDT&9¨¿ðà‡¿~³ô žâ˜E±-«·»úhßš¼°}Ä[ ©ÐL"y0H'ót¾—곪c‘’3ª—©ß0 &?ÑÞ‰ÛÖGçà$o¬GœÐut.»ò Ò­íÖúÍsw²Þ»°¿K{t®ô1£¸FE/Ço‰8® àòj5M0ÔÎЩ¤‡¼²»©p×im$‘êÞ…í²r ¶µOÃ'ÙúòH•2nd‚Jšû>\ÙuîôصØaØ\‡êvWJlÓ–½ŠGï^×MØ ãÔº“NU™výð^Š£·õhGÈ­E,²EX^mlpm±î½ö¦¼r«ôÿ)ûjud\»8Œ“Û1uÏ +ž%äµ'kG#ÁÖ[Y¤L+é:5íœÃ©(:€MŒòm0'ã«-¨—YA2T¹-ëÊÏx¤` „ÿ_\%²|ôV÷4ä›0ô “Û|„âŒs‘œ‰LÈÿÌùG‡À‰œÆmæß£W;T˜„‰DdW&$½àî ²¥Cݤ º¹Ö릤/ún‰»G/Ù~£'ß5,¤÷ô»àîÑôú…{ÿûnŸ endstream endobj 671 0 obj << /Type /Page /Contents 672 0 R /Resources 670 0 R /MediaBox [0 0 612 792] /Parent 664 0 R /Annots [ 674 0 R 675 0 R 676 0 R ] >> endobj 674 0 obj << /Type /Annot /Border [0 0 0] /Rect [502.606 626.4217 522 636.1187] /Subtype /Link /A << /S /GoTo /D (window) >> >> endobj 675 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 612.665 240.0001 623.5741] /Subtype /Link /A << /S /GoTo /D (window) >> >> endobj 676 0 obj << /Type /Annot /Border [0 0 0] /Rect [267.2729 612.665 435.1518 623.5741] /Subtype /Link /A << /S /GoTo /D (ui-panel) >> >> endobj 673 0 obj << /D [671 0 R /XYZ 90 720 null] >> endobj 670 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 679 0 obj << /Length 2572 /Filter /FlateDecode >> stream xÚËŽãÆñ¾_1@KKšý ›í[²°Œä°ÁfƒÐ%Ñ+‰ I­v|ð·§Ý-RjYÁ`€a?ª«ªë]-ñ”ßx²ù“Q*³Ú˜§åþMî–¿¼n”D:ùËó›ï~,Ä“È3›[ñô¼ž!y^}JÞoëãB$c³HEÒ/R¥TR|¿HµÖÉûÓ0vûö7ܪG€j»ƒÛúÏâóó_·œâªÈ*]•À ¢Î6M·ÿÚ6g;ã£Y¡µu o™ð¿r¡w@‡˜àŸÊ&•Ao~x-¤|$ ¹•…~M&E¡,ÊJgB邸(iQJ¼6J¤ƒûþýVø¡»ã¾»{¥§¸D)3•[îŽ× _ñ°œc3#§20šeÐ 1™¥RË,WÜLVY7£ƒÿØz‘EQ$@î i’¯¨2Ú8óF;à·L†±îÇfõf%€àmy…ßÕ+V`ºâ£„æ[³Äω ÆÑJ·ß×>Tµ#ö2°uíÓ3~ܪ™0‚èŽ|„/w¡¤Be¢Èù’‡zß+:¿c{ªÊl!ô+L/[¤%°òŒRD! Çý^Kç*·Íð!ò"ËËÂÛÁªëR°š¨§_)èm…"êYÖc×Ãä…º5Ñ=AÙx[Z¡ãƳí/¤/ð]’k*E•i“k/ß’ÒÔŒ`Ń% U2Öy@¡h•|€ñûŸ€³ d:o€+Mpå»9Å ž†Ï#wØ bŽþœñ¶5B½xƘfGp"«w»˜%†¦GKUšN`Üá˜+É ÙgtZh!(¬…å@ñ·æÛˆÎcÕDüþèk•HvÀðØ}x¾îzb•œ<œÆ-ª„(a+ålå÷ïþи! YkÕ$¦T(î"ãÖ™.¥7ÖߣÞ!Ê\á·« #C¶ÃÕ^P+é•¶ÝÞ] ÁÛ¹}W"s6YšÌ*1WÔ?•Bl¤¢eítuòÆíô5z¿¥Iç »Šv6§¾á5ÇœËqÎÎçªY׈w7òüÃ)"rvNÚBš5ïv¡'=øÙŽ1ºc=PèÉļ”õö¥éæ^Þšà˜Tü¤^µè9œWqK)«Lšâu†æ,! Σ R";6lÇ8'e#K5Ïœ1ZâÔÅé»<ŠRgU¥Õ«j$‹a¿†‘ÌòÔ÷—(-DG²)7,1ùÏŒ*çÀÌ0 €ŠZ£WˆÄKÔÚ–g˜Èl’.5ßÚax°ØâŒ +”jAÔZ°! ÓÓV²0B9è)#³w³ÚŠ§Â²È¬É_0Hvê [Ú+Ùa9o‘Ñ%ÞwËùâ19ýnÅ+¿PäsùÉ_Bç8ñàFˆÄ%34èhÝ»c=‰-¾=lxï6Ó­Q°8ÅÓ30GN‡AKÐø ¥Œ<”ö!Èh¤Iròjr`ô’[´>2(μ‰uoÞŠûDã²2¯«›‘!—4¼áŽåš?Ñ4Ž…{RÕ_SÉ»ÎøŽþ²u^¿tô;Æs™B•s9Ö.&“{¨(êÊäØÏPôýê$Ë·zž taY-8˜ªE—ùݘ¨e©_%Z$rÝ’ !*0WõÝŽ°â Á²[—"ñUn°ÁÙê°qË5çòž‘—¢*Âl‘VRB•Ú¼°¬¡kɬ€h±Y_Uk¼VSx|áÉ×Vø»ë{h²¨CB?óœí yh?‰¯.}»*ùÁ+áxÉŽË!<¥‹žÖ%xÕ©8ÄP‹cPJƒ1UN!§6=Ö‡fS¶4|¾ŽYvTî©tÅËÌ‚'‡Bgea¯„wÑ'rf&žn,W¢-µ‚õŽ·xËš ›H^Âì¢Î•‰æ‡·ÿ‘êdZÛy)` Øú‘SÏp¤UãÄû ‰îYæœx„%ìxõ BØÀŒŽ¤çvm°â©ÚÍüu¹Zû~¾áñT>m®½â]ïdò Î$ £uò±i®_$ôí¹*Ë'ù«„ Z|`ˆ¶'Ï.FÞEnÆ^GUßOÞÿüù¦ÞÐEu"„¸æVCÏo ifÜF-Ü#no’‚îŠ 4“)+í#q¸‡ Ü D>6KN$§L¢ûzóˆ§6÷‰êdvk”¥šÊKnw~zQIìH4±P %ïÈ2À¥SÀÈUn²,‰or®ÔU:úit'èÅ%5¦8ݸŽþcähÎæv©?(C*8î:¬ˆ æô1§”“HæÚi\ 8ž<3^¨(êβ‚8i_™ ‘È´_"L[¡1 `Âc $ûÍ!ú¨ÕZ¦JueÐbºW£ILu·4OûÕ¤CÂ’/@,뉆ó‚WÖ—;pç¥31 .¥º]»DZÁ•„„+“3=¬øƒ·//o@Y56§¾ ÝËV½š¢Í}¿F®×Ź<zÞ6ǃ/-€‡}7k¬¸ôý@µ‹_¢FWIÏœß §Ïpg.Ÿ;”èûµw³×ÿÌsÚ¹'jÌ®Š¯BÍÅ̻ݎ%Õzóls„Áã‘SÃXÙòµp×?n|#Z/8ËÌœÕÂç“™.tqÛ™C}¼¬÷éº#ÿ(d‘Ð0]’o¡c(Ë2þ:ˆ=‡ñ´^;+½CTD#:U'ïôpÊ”®MAЙ¡ŸøQ'—ö$Ö0?F '_(Ä¢Oì"UÑžp_$+—Êé;Ìî<î ¸PQ¼.šòª›|çköëjM™L”F>I«2™ƒwÜ©Ö<\:ŒUk7£?ýƒ†?®¸åÒM{*³E!FB©w…YÝ!9 ì½z7À¥SÀXvƒÐÕ»ZŠä£è E5HeÍŒˆ ÜC>nÎÊ^ 5–½¶àñ§#ŽÍ‹[‰æ~‘𬮹Å~׿Â>’Z€{Äí-ÂÿKjJAáîþHjî!7£RC‘°ØNèœ)•@Ü覓ì?{©ú ’­™ÊVé›_Œ…{Ð| Û÷èN·C×€tÿ!‹Œ endstream endobj 678 0 obj << /Type /Page /Contents 679 0 R /Resources 677 0 R /MediaBox [0 0 612 792] /Parent 664 0 R /Annots [ 685 0 R 686 0 R 687 0 R 688 0 R 689 0 R 690 0 R 691 0 R ] >> endobj 685 0 obj << /Type /Annot /Border [0 0 0] /Rect [284.0366 460.2367 417.7527 471.1457] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 686 0 obj << /Type /Annot /Border [0 0 0] /Rect [449.3929 460.2367 522 471.1457] /Subtype /Link /A << /S /GoTo /D (ui-panel) >> >> endobj 687 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 447.086 182.7274 457.995] /Subtype /Link /A << /S /GoTo /D (ui-panel) >> >> endobj 688 0 obj << /Type /Annot /Border [0 0 0] /Rect [437.1672 290.4733 522 301.3824] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 689 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 277.3226 131.0463 288.2317] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 690 0 obj << /Type /Annot /Border [0 0 0] /Rect [157.2897 277.3226 305.9019 288.2317] /Subtype /Link /A << /S /GoTo /D (progn) >> >> endobj 691 0 obj << /Type /Annot /Border [0 0 0] /Rect [332.1454 277.3226 518.9697 288.2317] /Subtype /Link /A << /S /GoTo /D (ui-cam-focus) >> >> endobj 680 0 obj << /D [678 0 R /XYZ 90 720 null] >> endobj 681 0 obj << /D [678 0 R /XYZ 90 720 null] >> endobj 677 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R /F84 684 0 R >> /ProcSet [ /PDF /Text ] >> endobj 696 0 obj << /Length 3161 /Filter /FlateDecode >> stream xÚkÛ¸ñ{~Å~[X«"E½îÛ]°×¦HŠYàPÜP®-ÛêÚ’O’³Ù~èoï¼H=,'‡+z8Î çÅaÔ]ÿÔ]Ýeq&Ëî6§w‘€_Þ)­c=FùééÝ_~NÔŠÂ"*ÔÝÓnBäiûkðþ`Ï+ôåj­‚vµŽã8HX­1Á#L|u3*¨í‘ç?5«µÎ‚í€GšîdÊy¾úýéï¸+DY﫺\Ê+™ Sà^Ö¡YP<¡|Pò~S#⨲ΊPå&vqE Y)¹¾ŽR´Kĩ҂£Èzˆ!1²¯:eî3¡Éì¬T±Öà˜þÐ32…_$!þÁ¶Ò`N@(ÙîØ\ø¬<Ö¡¼Ù·g^hÛíH4ÞÒE¥›ÁÇÔbo_œ!‚~ÏG Ò8QÕ ²ùm&&6÷ Çt@š—!+`¤®·dË{‡"[røÃ°jŸ«#¢ôNÕÁvøÕW9]x\qþù»íkÆ“Š«O¢¬ˆ¹Ô YaÁkV1‹õΣ«Xð;­‚4UA’ .Àž@„¿£s/y–2bE³†€î(aàv_œò–‹)ö«sföqÁT1ÞϳÇJ<ªYì! ž£Avå’ƒª4 T{œ(Gz±â3P9êH þsËgŸ³Ø>ùŸüi8?¾ûn‘pZ¨D]´ød™ÂqÏÃÙúÐ^ Gœ™$xZå1oؾ½ ¬XvŒ8“ÆÚ¹FJ¤¦ª}à(µ9V\$$fˆAI,‘ AÐÿVI¶á >· TÂ>Bs[úJ\™z:Ì65Ïön)O÷sQ¥ÛãUó…ÏTÐÐÙð-F£(~A ªcy³â£<£¯ öHqÁs¸ñ¥¦Zÿî8]P|4»ÝR‘P5þPrïZ(qPԨȇK{²G!@èP¸8s¶B…ćh±ž$mª[¶ê*Ò™"ž(ªISàZìˤYðÉðU]¬zÃC_ºþq™ö•WpêåÎÒÁSÑÞzpFP3ÂõÀÕ#09YKÎg)[ R®Ëtãš®ã],©üy¤ËÍ68B´B÷@”¼¥ùØcJáz¬¯£§µ½]§5R¹ ¼¿U‘7¸¨œnݧY¡ÞÉL‘û“J}ŠGLÁ+áC& hÀ‡¼=ÏZžœGæñ ‹`½ÀÈ)âw ‡{(î*ßI˜GÀu=ãxäḷ¨Ì?QØÄaª“ï6qž‹ím6Ïg÷6,_¨réxÁ·½ÔLÍ»]×µY %2ƒË¯ž*$¿Î|)8Ü—Ò×”G³¡i[KUÿØQ:91Ú.:ñ<½Ññ¯®š«¸œdã<š’1Ø^6¤¦'~å p¼\Yß/võ&NçRîñÙ`Ÿc;wÜåɵ”P9 Ÿ«b3ÇZ»ãÕçðÝ6ž>}©¼%'a¹“fåk¹¨•*ŒÕ‡ÜUËo9`¨å¨¬†0‚w ¡ÝU4®rÙZ㨙«¾·<À°†‡}ö—ßãû'ÎzÏãÇÊ0·¥ÓÃQ#ÅýôT4;¼ü£é‹î¡Ë§Ä ¨ò€üP`¥õÓÜRPç9`p?À¥ Oú*YЕ2£Œ€(¢ªdæðHm…É·ÃòrŒ3Ю¿¨éA ûƨàÃŽA–Qnµ|õè-¡$S€5d ð]z&D¸6Ì€Ô¨'b°/ÝFŸë–6T ã·È‘+8‚-©lXlÄ^çã^õð!1.’iŒ t‡…/_ê` wok™mùË+è>]¤C™ coÄ7aÈ·önÁáipbn{[ ñrxM`6Å ‹Q0C¤$ÀÇ|OÔ§™°Ò{cãYP‡¹X1.´¯ÿ|¿Xs¿øñ+çòóQ:½ ýÀ“Ÿ«ñ\J¯étæC/YÌM^Õ×7ú0³&0·¡t!Ž%JÑÔ ßK !´”ß9“`P³´=‰«§L\5{JMn9â¾*êZóÖ¥š˜›n3\îÀåvé7âLz$kìÞÚm‰%Xˆql Z⛆ªÐ“oâêqÃQ,/ãsv– ò =jÊhWr2üßrdzrUˆ"<0×hÃýÁT¸Y:ß$ u¦Ý5óžÉbΨD'ÆVDroºÏA©û¢Õ<Þ¨…ÐñMô;ü%Ô7_îø‚›,‹§Â\åÚ½á5‹b©,T¹JGb¹F:(—ËÛjÈ~P溬(‹­2®vX"oRFïGÍ »r×HR%½Mõ‡ë‡Ã¡j\Iÿe.ñÆp¨³gÄÍó’`Ýð×óôWè°Ž§%=¡êó$™ÝŸ¥hÀ'ÃáÌð-¨öwûÿàf6 endstream endobj 695 0 obj << /Type /Page /Contents 696 0 R /Resources 694 0 R /MediaBox [0 0 612 792] /Parent 664 0 R /Annots [ 699 0 R 700 0 R ] >> endobj 699 0 obj << /Type /Annot /Border [0 0 0] /Rect [469.2821 344.0346 522 353.7316] /Subtype /Link /A << /S /GoTo /D (Module Installation) >> >> endobj 700 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 330.2779 238.2426 341.1869] /Subtype /Link /A << /S /GoTo /D (Module Installation) >> >> endobj 697 0 obj << /D [695 0 R /XYZ 90 720 null] >> endobj 245 0 obj << /D [695 0 R /XYZ 90 720 null] >> endobj 698 0 obj << /D [695 0 R /XYZ 90 516.8327 null] >> endobj 701 0 obj << /D [695 0 R /XYZ 90 173.0971 null] >> endobj 694 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F54 117 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 705 0 obj << /Length 1600 /Filter /FlateDecode >> stream xÚkoÛ6ð{~…á}¨ìÆŒHêa5Û€mH‹ 视¶ÃhI¶µJ¢'ÑMŒ¢ÿ}w|ؒˤí :Þï}ÇKè$„:ÉÂIÊ9É¢4äÍUhÑﯨ…À±²ü¼ººyÓ Ift²ÚŒ„¬Š7Á/;±ŸÑ@•³ ºÙ‚s$/f‹(Š‚; <8 ZQúk9[°4(€¬5¹DœÒ(Xf³w«ß®îV'£bƾd6²xìfC»)]’4ËâI²ŒåQ¬­ÆaÙÈâP—‹¢ÜT-X³8˜Þ=ˆf_ÛZ,¹) žNá&ES/ã³`VÏ‚f$e‰VSµàD˜ÏÛF(›Eq‹º. ƒÿÛ žd$Š3ž¢$²-eó¡*ï}ºcJâ(Ê,ë3#Ôé>ÎØ2‡ÎœòC‡)ÑÁo‘¢ ¾¨Û•9â•D–ãlÉ ¥q°Úï8á, >hÑïñ·õê•f’ ¢ÐÚ[L8°+CF%½›=pu)amç €Œ’0Œ ·”‡¦àÚ ´ îœ2‡\6ûª6¢qjç`nŒÖ¹;Ó±n;¹íDs ˆ„yW e/¨¼Ia²Gÿ7+\—€®~«Z´º˜Žèò³ˆrˆ(F3 *íͽ!ô¨6cYHX–]D +€³äbzÑ  {*P(d2éŽtºÁ–?1õ]¼Ýï¤î×ÂõõÒºdÐ4²O½AÞH™å¸{À”jƒöv$ UÔ'<I²¤ÉS²3–©ã¸pÞ°GCvN O8µü0›bêFSï1’Á4°ük¬[‰‰º×ƒì4A§Ü˜ï+×5ç†xÖûLnF–!Æ |-°aZŸ1 œMCçìúǪª¸Åq eíÎÕ¿[€íåº;Ÿ$ZšA”ªaPšN„zÐÆÌ´Ò׺y~w¯¤ùöJtêâN#u«Ûàê"ãÁO–¥ ¡Û`1ä®:‘•‡æ®ÈË£‰ý^¿)¥Ð±çÖ`6{ˆýe·e-̱(ÍWkûk‡!”aÙYªîI”¡mÃú;,j­=)·NÔ+8—I̽é7s©Qfæf]p»É_„ìm´[ƒhÊ~çKí|ŒL†RWºEò­(½ÄØ1U¯ºj}P¸` ⾂òÐîI^¹—ËHíAÔÄo“æøuc¾G¬iDg%µR^Ñâä¢:™‹I©6ʮ͡/Ë 2ì`ªìpi|Üš×ÚëÞîg9ì¢ ‘öÆ«ÎÀÙ¹°9ó‹R‰ªîÉWä#õçc˜³JX‚hŸÈ?ñæúÆÌ:W],!6Mû®jóúPXEß7BíÈîGŸ…œ½**9`5B¹«fÍôr\A§àmm®*yJ¡°¹¾·ô}-ÕãýpáͶ©¥“õ·ñ‡ëãµrËõ–é„'ôÑ+šûÖ¾ >ÞšF)ìÐQô¨[ ?ØRü·SÚ”ùÃóãüˆÆÜú’Ô•êеÈÙWúcÅ<·A‹s'¬ÃÓYÔÂkÒ§qjL¾a¤‹n›_»žÛ~x:FÐ Öšù¹ý1J¾£ªu.ªÆ*?xë+·a^šª½v xp7ÏØã[œ€£”C¨[_­¢ðQÂŽ—ˆE «O²ÈÕõ拾̵¤‰°ß$Þ}[£.¡ñª.¨)åq¨51 ’t+˜²íg@”bü ˜c—}‹/fþö²>œ»Õ¯¹P#5!Ê„ª ŠVUã^”ZSºjpã.Á¨ÍßT?2=ô͞؋X k³KiðèøÚá;â&«lôø‰ÇW'[ÿ,+õûÙ{ùÑ|^¸÷@~:5”Îãb;ôÅ9pžÿª¬ëÞç°»êþ¾ÔI3´ÐÍ?7`jí·Ýý®Êwãt¸w¦jaûnóò‘‡pása˜‚çSÿ›÷ÄÐÞw06áé·†Ù:Øo)Úéi&â?}þ_n¢0 endstream endobj 704 0 obj << /Type /Page /Contents 705 0 R /Resources 703 0 R /MediaBox [0 0 612 792] /Parent 664 0 R >> endobj 706 0 obj << /D [704 0 R /XYZ 90 720 null] >> endobj 703 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 709 0 obj << /Length 1197 /Filter /FlateDecode >> stream xÚµWKoã6¾çW H›Hõ´›Í¥Ån‹¢9Õ=u{P,Êf¢‡!щ…bÿ{g†¤,9R(Däpß|Ãǘ-<øc‹•·H‚À]…I²Ø”ž?]0=r@êü´¾¸ù±óÜ•·b‹u>r²Îþ²~Þ¥{›Y’Û³Û ‚ÀŠ´0 ­/°p4+̪ÒB­ß×¶ã'VvaAË-¢„…Öʳÿ^ÿvñe݃Š|ÿ=ب2ÛâfçúQ¸ˆ—¡Ë‚0"ðy^ÚÝ7/òZ™Õ #v‹À¯ãÇnà±o>Ù%²~¯ë½*) 5|EÁ3—ì"7ñ@×Ež¢èÓ -9SkyÝ('BÞy·j¦?òê.#PjúùaÌ £04~bòóç>K%¿ç*›c)ªkes,Ó£v'iw’3Qéi8 Â9 ¨€w­§0QxBªæ-¯²V 늫AÙ¯ É›TŠºÒ°jõý…×å³à/.lÈ×Zï„ö±©«V´ÒxÌç«¢4RcV–i•õV*ÚNã*•&§3>ó<*^ÃSm¾p\6)}2ž‹ªwWÏx â$²î¿üñë[ë®ë¾æ;m˜‘B<ÌøeÇ =)šÛ³ŒÓ<¤zC½Òb°PS5)yQ´3x‡¥¸LŸøY¬ç´8ð;Wèñ%Ð{©†ç>Ú=߈\ðì @*§©õ7Îñÿrþ(œ¿tã W2/êTÿ%o§Ò•œD¢Oÿ8¾2™¼ˆÎ¼‰ëÇÉpCì׎—¯³îvêÚÈŽJãîtMbžæÝà:lt{CfÝ+ÈŠÓ }t¯} _€}™å¨xùN»Š ïNu9‹ro€Yíø\û¦¡À@YMo­ÙÈ£GèñÎ36#Ö,ý,=~Vûƒ&WWcý+muï¼\ÁE|\öã)¸ø|cý>øñCÁ‡,ê;åôE.eÏ¥IR¿Ò¾ƒ L'õc¯å| Ï‹ý!/¯R ›ÿ]6ßò¼ó¼ Deá­¸Qú¤ºÆ[Ú8«Ä–Îôx4y$_Z$¢†o+*[·}(÷W¸{Ð6ãßàÈᢨ¶J”ªOŽíbµ¡f@a7x«Ø]Å«%$Œ`Æõ™J"„‹Í÷WZ_îÀ;^LªEˆûÚ@P*‘µ†%È)cî<Û<Øëv”ßVi¶åé†Ì]}¯ÆP'cº‰Ã -lªÉ a,­ºÕr|ú°‡&¼ZVÖ¤Ó÷Ó(÷˜ôj5O‰Ò2•zì•RˆsLCi(ÃÚ†ìŸmðËu[/EÉxB«NT?HÜ6™x@öð_ÿÌûu¿¤ƒ endstream endobj 708 0 obj << /Type /Page /Contents 709 0 R /Resources 707 0 R /MediaBox [0 0 612 792] /Parent 711 0 R >> endobj 710 0 obj << /D [708 0 R /XYZ 90 720 null] >> endobj 707 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 714 0 obj << /Length 3546 /Filter /FlateDecode >> stream xÚÍZ_Û¸ϧXä¥2«"EJÔõ©=ärW\ Ù¢¹<(¶v­žmíIr6‹C¿{ç)ÉæÆAчb•HކÃápæ7C«› þÔM•Ý”yžV¦,o6‡™tÿúBÉÛ(Ös’¿Ü¾øãVݨ,­²JÝÜÞ-˜Ün?$ßïꇕJÆfµVI¿Zçyžß­ÖƘä5 |ñ#*9Ö{Û­ÖºL¶'èÜÓð¶T&©Ôêãí__¼¾ BY­¯‰$¹õ\n¥\ZV•½)œIUn,IÿKf³û¦;4cÿ´>6i¾Ô‡ ¿óã;~Üu¿ü>#9Ï•³Vyê¬-àŦ¥ËMr»ka}yV–ö{y}³®@ ŸÛæQ;~nzRI=‚và-WYRóJÊ›z¿o¶"ÂbZé´06ÍàÜ~9aMžš"«„ðq×nVÚ%;žÊK\ñé’ö8ŒõqÓpow'"ï&ñµ>n÷Ô v\¥ nEZR6cûA¥F„Seªœ*D¸THÌrGSçJ#$?¢¤*ÙÂQ¡CtÑ&Íœõ‹®QÕÆ¨`| %×ýÈ \¤±)DïÞÁ𛟹ñK¦Œ˜/6ïºþPˇ¨ Ôf‰ÚD°[*÷‘ žð½; ûŽ;õáL˜–•«’ ”(, Môgª¥"Ù8à 2eí2£|ÕÉçòÝŸ˜£vÀ“lìÈ”Ÿè<ÊÈ€#¾([Yk# Æ/èÕLÔÍã®éås¶ çZktè€Ö9r‘ºî±»<ƒ[œÞhß.3“"UYéó?-u©ÏÐð‚K™šJéÿb1C8G[sòO^þG¨ùqæŠØW.͵:÷!Ì\¼‡c±(%)ÚˆÑý‚Ž·œz-“5É϶Í]{l¦$-âÞ¾~ÿc¬_þ ž‘Ñ4M—ÝŒežÏÿ¢+`pYo®ÓÌ„M“É.¢²Js•/ÂrYQ<„Ǿ G­Çã#wúK—÷8‘ÖõÌes§ΖL>Ýp2q $<|êZVqûÀ>¢|õ«ø8êÝÉËòTä0ŸOhlžæÖ.u?)3!ôh̶©¶Y~Û¨Ô”¹¢ÉÝWÆã;ðûIùì*O8Ì;PS¡MòçA>ïvdªZºãú©ò¤—l®B€|2Aah,ÏÄP€y“Û+ ð`‘ä×lw§¸b" {‰Ý³x$P§»oÎÂ" š°!ý‰núùX¸È?x]‹Kº€LS.t¦–kØ{z›Tt”Qyzd‰”œRâM´w$©…4$ìØ­SnÝò¼*L:ÓÍ”~ñõv*v`ï¯A: á¨BrkQðW*'ïñ¡wE&ªáÕ¹¹“9TqçþHŠ9§>­á"Ú$w\;ù”± Bká·Ð}ö_ø (d2’5‘y±$Ç¡%§$ÜÉQ5åEL8ø-€„Þè2$GÒÃõ…ZäoO1?]3Îv´BX< Í=Ú äuú6‘Ê «àˆYÿ]‡ˆÄkPY[ÏX0/±ä'ùÛãT5°rFê=š’ÐüV·Çp,g¬Æ¾} ,rÖÌ3ž»÷.Û8—¼®¥lQ q)Èà ÞJ PpOà~½ »•gÍv†ä|ÜÇï2¡2¬°ÔŒµ0Š@rÇûÈÊ[)R_ag©X¿ 2M>í4=¼wÑãez·ї_FOXCOèÓÊâü9 s—;Œ*ÖœŽ„‘\Èoc¨R§ÖU>½üýå3©¶.Œº¬½b±Ž¸¹çêœö®ÿ|"—`…/‘ ŠÌ•44Ö—B†±æþЈQÒzü™þÚ|”{™_".û†µ…Ìg™;Ùiu¾(™Ëa9¸Z€JeKp&HQê©öYÌ+~çˆÿHùË^íõ3@tíKyÀ«oa½45¶´€ú·|±ç¬Š–C ³e®HMn«gJƒžl=§‹ÔÐ.Øá*ß7›±õ+1©N5¿~`q1º})¸à«,"¿ y«…¬Ñ‚ŸÐ]ö’á,€åÖ¤E®uìJ3(Ò¿”0U¯Dy ùbOuj¬ˆyÒŽ#:$ÀhÍi1Óã‚w*ßIFÄ‹‹)Kû„ï‰ß‰„s~Îí r4Uߎža˜±&<¸á+éêÿ*AúêÖÿY:$I†+)<ôT™€ÖøñÍMø÷6àg ‰”É€¼æÇEÌ øpóâ‘ón´2;ƒ¦Uœì"dc3›£ô0g{ö.ûö5’jYT Ë¹¹oç(8–ôg©É*} XÚ´‚„ß ºX¬S]ïÑt?q à·ÓTU£˜ À«(|ÑdizTÝò¦‡– öòœi(ÀeÎi½æé&Dˆ ~O¦*Cn³´–ülj:ÚXÕ§^€I8£©<äPTÒÚsÙ®’0¡Q éµÀ(ŸÔ3ªè8â g¿é¶t!ýçýç)¼3¨(½ŠLR©ÖùÕŒ¢HmU—ÌO’zâÆÌX/Uºí•0ÇgHR±ÁÅTÔõvjè›0VNŽÒðð‘KtôÚø‚&±ÞYIJfÞÍ¥iQ¶ÞGµ_áÅq®¾Í@ç¾ïøáKGëÀd¡“gÝ87å*1eÀðšËø”ä„ kÜŠRK™(v³[«nBn~lÃà(­p” ©;Š›ùIv]Èçuq•}à¬ê®o™ùBx†«alL¥˜xúBÖÖý­« r«ñ× òBµt<ÕcÈ‘,Ü"Ó}ÒN…jöÍC/©L(ã#51Ù?1ÑCÝK8v|EøV&oÎCøáÉî÷Å‹Wx·œãýÄ”Îk»Œ”#1°9ÿ ¸ Ûào]öSõ`”µ­pE{Êž°Ñi ÖI¡ߦÕùÄDÒ>‡'–3ûúè÷ëÐŽž±Ì% l{i{  Mªjº£×ëR’QòËÂ¥8^€+Tmiàl_Þ«›¡® (¨T;›?w¯îéÖsÂØ½úÃØ½:JYòB>`èûŸ=³Îïe…J]ü)/sðïàUçBDàs »&í%C¹/Ç}ˆü ÁdYšY{M[žìÚô쩪ä*­øõÃ߃Ǚgðì¬7SYç£ÜQçÊ 1¿£‘ä$Olq¾81+/ò$tø3­ç~èÖsÂÈò.zíšè<”Í!_)ÌB€ˆzÝU.^är%ärÖ'sxp¶ Bãp·²ºðKˆ]JU—I¨Â|sMyîšì— ¿®<@,)|ª®)/Ð]à‚aTy*ËD{Á kŒ¤—é°Òîâ<¹*5X_ÑZ »&ô%Ãy>ìLj\VÄnjunÄ)¤Óx5]¢Üw=+º$…6Çë½/w—1úãU¬QÕ·ÝxYZNÕ¥ù¯aFºeõ—ÒÔC!)J8"g寂ð +fXH—Ñ©Óç¿”: ¦D—bžTßM?û}™dMݼÀ³T„ÀpÝVí/ȈÃÀO©uÒÐÐ~ A‹’¤Bî+€nv|çµ]¾-Çjm#³QO¨G…Ûqü%ý„­ô‰^vñ;úõžû½·Øÿ }ƒ endstream endobj 713 0 obj << /Type /Page /Contents 714 0 R /Resources 712 0 R /MediaBox [0 0 612 792] /Parent 711 0 R /Annots [ 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R ] >> endobj 716 0 obj << /Type /Annot /Border [0 0 0] /Rect [255.3493 626.1744 454.9229 637.0834] /Subtype /Link /A << /S /GoTo /D (OOGL File Formats) >> >> endobj 717 0 obj << /Type /Annot /Border [0 0 0] /Rect [314.576 323.7087 459.5761 334.6177] /Subtype /Link /A << /S /GoTo /D (MESH) >> >> endobj 718 0 obj << /Type /Annot /Border [0 0 0] /Rect [247.7829 118.558 373.8696 129.4671] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 719 0 obj << /Type /Annot /Border [0 0 0] /Rect [400.055 118.558 522 129.4671] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 720 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 105.4074 126.3637 116.3164] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 721 0 obj << /Type /Annot /Border [0 0 0] /Rect [153.6364 105.4074 311.8184 116.3164] /Subtype /Link /A << /S /GoTo /D (hdefine) >> >> endobj 722 0 obj << /Type /Annot /Border [0 0 0] /Rect [339.0911 105.4074 489.4246 116.3164] /Subtype /Link /A << /S /GoTo /D (read) >> >> endobj 715 0 obj << /D [713 0 R /XYZ 90 720 null] >> endobj 712 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 725 0 obj << /Length 2818 /Filter /FlateDecode >> stream xÚµY[oܺ~ϯ0Ò‡jƒ,-Q¢.iQ  ’ÀÅ ÒÆŠ“ƒVÖÒ»‚µÒVÒÆ1Pô·wnäJkÅ=§@ᇥÈáp8—ofèè"„¿è¢/²8VE’eÕþE(Ó÷/"­b=%ùÓÍ‹Ë÷&ºˆBU„Etqs7cr³ù)x»+«(íjýjÇq¾Y­“$ ÞÁÂ7·mÙðúÇnµÖY°9ÂdCËL˜,J‚B¯~¾ùó‹w7^(£õI~Üiž¨(N É=Ú~_·%JÇað°³-ÆHE³Q€(Ÿíyñ¾F‘›¿ê‘oW:y\5uU¶ ëx¢¾¸s˜oÝ:Æ# ʶ’ó$jE¤z.¨î”LïÇF寠ðJ V9­²a¦„D«¢ÐŽþ¶')Aö²7Ôk–¦ë‘ÇÅ:Îr•'è8ŠUdB6¼mX3lRâ šƒ+ðä÷Ýíñ”¯µ}À…$°ßêqPÄ=JÀj °N•É â|ÝííXï½c$éSö8ùˆL»#~˜àäf{"ɺ:ÉHË»ZxÑ:z` ™Ž ³E:gH$CvüÕəΊH=±b‰ÃJôt"'°Ã³{á9î–í 6¦ˆ±×q+ÆñÜ$ÏTiðÁ¢!²à+LÕ´ø€jõÖMãûÕA_–‡¨üƒ•F¦&•âoË¿x?° P½§^ØÖÝñ*;IÝny®äŸŠÝe!Ä,;þõ²ƒ±ç„óËŸœ›ÀåmX·<1R¬ã¨·l³ú+*Íâ$™h™¢ä¹ƒ×Xå¨î&ÆË?ä YneðàëØõ 4] ~‰Ý‘ucDz$d­+ž¾e’…«ïJï÷»ü€Plû¾CðJâ`oIñC¹µ¼VÞwÇ‘ ij"Rpf?2,ÂZ)<$pt#ÜUÊqBv|>€/ FŠÛß••l;ôÙFhD†J4šÙ0[Ž=¯…”´ðr)RŒÊ4 Ö_Qêz\â¥#•G¹#\dU¨0ɇ¬¹ñß+†A‰XŠu’‰;†½d”Üö]OI°íI!QpÇXD“èÈ¥Ë*0‹dFS!“yv•N~ϰý‘3ʸ;I3·&Ú<6ÁµSrx.t>÷»Ö~éí·’Ž:£ï ûßVyLˆ›,¨ÈÊ&'A-OzÄÔX+ˆgã|-Ä%;‹¡ÃºëÆa OOvrØôáiF*Rò².©†îŒ§ÀDj'A8×þªåz‚7rûµ2(®ŒNŠÀÜé S#É&„“$PÞNã¨Ý^¸9kšM5*B•™KõÕØ7ë·K^gP©Ð¹ƒ¶–‹“ÙYnÑ.ÝA1Kˆ0PAœ¤š²“Ö9­u AqÅ•*ܯÖ&ƒwÎaD2hüzË×õt-bñh® ú£xF‘gˆÉ2ö#— 0“ïW@ôé3í¸&s‘tÍeÀl¡æ:¶ãŒ ÄcOÜ>ü/«X3N-%â¯BE:‰× Õˆ[ìNÕXw£[Ÿj؉d&A;I[ø}¢ë]œ#Ž2£„òcöÌsNÿÞw`~ ±ÿ%_]sññ;Yqù ÆŒò½ëºÎW°w_JÜ@bR:k ãPÃùQvQq\PçÑIË“îÐÓ­§„Ô"¦á Ÿ0¤âj±‘RJ4Í#åû%Œo¯€òì€Ð0 ÖÖKŒ3•gy.?½G7Eê~v™”N[»tFš)WÈü…ŸZ#ɵŠ1 N•¼Ð«{º§Ö8“ò Cö÷ãmsï—Ë£âh¹4×IÎÆâª¹Ùð+žê{jX´9=•ᕈí|R,{O”h¥oǦw[’2Í¡yK'~„Œ]Ï:-sð|ñ} ˜JE@9î¨Úû療ã÷Œvéc´.p3›Ú¿þP¥ÏáH KC K½OÅ·2slœ}EMÇî±IÐE;%{$cãpZ‚àw-óËy€Hõé)„t[–_„RV³LÏmöì9rn^°Wžb¯õÕ"6 A¦Áfj¹בvn²þáûŒ\¦ì¨=PþÀq½ä%ÔHY×@qÝ<Ú?F Þ<ø÷ÆÞN „‹TR¨"#1Fé˜Üe’›ä}9òÒ3"¡ò®n—µão:㆞a÷´>v½±w¸“Âýå;†þÒ/eV]:Øyé¤\jd²¢˜ÃC1•€ÝµY èß›Æn˜b1ܳX™T;P[ð5j¸—²]y%)¦)#÷Ç‹–àÄcïS€{<ÃykäúÔ¿¸pJ¹´ä ݽw‰b9pÃ]ÉIÈå˳ÃÖÒú8Da–Ÿ—ÜP»Q$‡Á[WÂ×ÿ1á¥T*œ-ð™6†äNk¿™u1¿ßCù¬vX:çŒr7u'¤ø2ð8bþx endstream endobj 724 0 obj << /Type /Page /Contents 725 0 R /Resources 723 0 R /MediaBox [0 0 612 792] /Parent 711 0 R /Annots [ 728 0 R ] >> endobj 728 0 obj << /Type /Annot /Border [0 0 0] /Rect [302.1517 455.6124 482.3944 466.5215] /Subtype /Link /A << /S /GoTo /D (Forms) >> >> endobj 726 0 obj << /D [724 0 R /XYZ 90 720 null] >> endobj 727 0 obj << /D [724 0 R /XYZ 90 544.1511 null] >> endobj 723 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R /F67 89 0 R /F72 6 0 R /F60 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 732 0 obj << /Length 956 /Filter /FlateDecode >> stream xÚÅV[oÚ0~ï¯@ì%P’ƹX·=´+Úªvl-›&mSdC¼†˜:N!š¶ß>;± ¤]Õ‡ >'ßùÎÍ6h™üZC³åÙ¶1t<¯,L¹|s¤¤s }Ûädrp4rA ˜ÆÐ‚ÖdV™„ß´Ó.;@c¨£vtÛ¶µþËŽî8ŽvÆk¥ZãRI:ºåiaÆãBò׎6´;?&çg“{R®e=F[˜Ôð¶¶y00¼áÐmõŽlÇ-Ø¿ÀIg!çàZ®ö*ÍÓ#†ȈÞðÏsµ£n©šZ )£YÀJY˜Þ‰ ÄŸ)ŠÉª»G"ÎM·ú†m§ÆW›#.R#jw8s×Üw4_]^—bŒ§Ò¼Ü.ÀG¾xAšŒ3:âðÇÊØpMOYŽOÎÏN'Òö ç`–_Ç8D´ö•YL  9dÇu±)ö£ò§2A‘Œv–%Ã$QË n%õ˘°×5<˳ªîeÄzU×ߥ6únºæº—÷@ñŠ50úv4FSX—éµ¶¿ †ã:N#Œ¬ØkÙ!·”Tºëü› 2µY¥ˆe4–).~$Ì¡L’x±«À¨ø·Òw(•ÉøýPi®S¥n(RZt@)0ާ0¸‘å¡$@aFÑñ^o Ã{ ÙXDYð%;n³T9];ô©)¤F]&ë¤ÔÝî%@dtwÈôgOŽIæ¥Ä‡û¾—Ìj®èŒUúaûsÄü2ŸCfHø¯Î]si½ºÒÚ•Ò~Ê0k¨i[èÚ2}„ýé’ÿXä Æ·úGžÏ(·|VÝкô`>k.Š C¾8|¹o ЂϖÁn¶ª³„ R‡P¾)VÑA©ã{pTŠdöX ï›AúÅI³y<ü çĵI¤º0 ê´[A¹4G ¢<œ°¶°’oÆÈ2,‚È«qÕ¹QŠç‰j/N|NáBöp³¹AaUfÍ V$‹Cu¬W “™¢%qÈDZ 4Â*É9ÉöÐ"…jdUhLB•BÞu{Žd—âÅ2Æ›œWs'<´†ÜÉ>È Ý!Ú«¹•Û«©Y„(zòü=ÔÍO›®š¹=®KJõæ3kºöH2Õyo!ö§ó¤`/·ŽcÿdüµgLÃì‹?ÏsNp †¡?%k‰õùc%Äw ³×n7ÂVÏ‰Š‡|7KÕ¡"ü¾_ù×ïßž]õ g¶x”÷#kh˜ƒÁNæmG¶ò¾á'îæ9:/ endstream endobj 731 0 obj << /Type /Page /Contents 732 0 R /Resources 730 0 R /MediaBox [0 0 612 792] /Parent 711 0 R >> endobj 733 0 obj << /D [731 0 R /XYZ 90 720 null] >> endobj 730 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 736 0 obj << /Length 977 /Filter /FlateDecode >> stream xÚ¥VÝsÚ8Ï_ÁðÐ1)v$àÐ4i2íè%Î=ÜõÆãØtصå44ÍÿÞ•%¦&4-Ìàõj÷·ß+p Á·ú¨åZ–Ñ·]·&GH±GXQ:HèÛ"ï¼£“¡ƒ[}ÔÇ-oZñ¢µ÷ó`ÙÁ'kYG·,Kë½éè¶mk8x¨N°–±<¿bÝtµ¨f\çÀp\lk}»óŸ÷ñhà­rLóÛB¤ÁosÛolcÃE§v«wjزÒûiìç„ûìîr?Îé7ò9޻Ñ?º¸¾øÃÉØ&>žA[vÛÄt–n\Œ>\Ž}oòé~ı„‹Jù†ð¿IÌBÊW]´ÑÖ16lÇ¶ë  Ð$8Ú¹|hEþ]Á9+ÝWƓ뫋‘ÿîÖó&ã®ÙG꺎ø”%¨ö_åí±F[±Þ³ ã‡Cm’Fþ”e‰P<$þTy`ö a«d&-³d³°+3ä½À*ÅÍS£gõê@á<Ȥèñ±VF›D÷'¦\‚Ogõ:Ø%ºˆª¦µÚeèÎYGïur,90*ªpi¤tAÐBH;>i VdmÇÔCXr-•–L H˘)[Yά(Ûõo6U¬Øe˜öKb)Í’œÅ§L%¥ÙrTÏ<2` `Ж!*$)š†IHUzš¯•@FbËÆöÄT@C;¥² R¢ƹX¥žc¸¦kÖTzÓÌ1™e¬H£ú4ïÄNœ”SïOŠløÓô7oÕ<¦Éü;Ÿ …j¥Þ”Ý*øªY±­- Í_½ˆÖ³9ûº^`*¥ôÓèâýÀ¿ùðÏ@ñ¼ëÛŠl‚d«Zšíš« Ǭ•ë’°äž’¯\¦eÛb*ü6Ñ p ÏT›’m§åãZ-ŒIâI¸ú®Ý´½?5Ó¸Èç?ç,”š`S7Ž[JªH9U͸ qL¢ßîF "œàçèL¾©}. [EºÿŽ,7jm,¢R|ûV%‡Æ$e*ÞòFÂôï{վ̟®Çeo6sÃ-Äê ¯±j¦WÒKõ6¾~&_©Ýþ\;‡s.Ê~Î÷̤ Ûe3|Ed‰_r£í\–Õ­ökwÿ þT}µñ´X’d©êód}J9ɂ͒ælgöÔßÙfúº endstream endobj 735 0 obj << /Type /Page /Contents 736 0 R /Resources 734 0 R /MediaBox [0 0 612 792] /Parent 711 0 R >> endobj 737 0 obj << /D [735 0 R /XYZ 90 720 null] >> endobj 734 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 740 0 obj << /Length 2262 /Filter /FlateDecode >> stream xÚYëÛ6ÿž¿bQàpr³VD‘zµé—IhP´ÙÞ}¸Z‹¶••%W¢³6úøÛo¤¶v³8ˆ©áp^üqfÈWüWYp•Hég*I®V»%ß¿v´Žå˜å뛯ÞFâJ~dâêf=rSüÇûf›ïÂ3z±^»XJ)½ø‹ÅR)彉£›^W<ÿ®Y,ÃÄ+@¬hºB”åeÑâ¿7?¼xsÓ…á§ÌF–»Ã±Ý"T~ÆéUœ*_H‘õŸ¿Bu ÁOÂD^-…ôE°g¿î‹ÜèwºÛþDÁqWÖ× PyÇ]~´ÃÓ@= ÔcQîu#H]˜ú±ŒÅTݺjrã<_—ù’DSaemfMaæå¬М¾Š :v*žŠ+¯?Ìê}² ‹ãuqêÙÃØ—PÄ^™ã+þáøæÇ%:ŽQzE°w)ðsVeqºaYžÆ2N—2ØI2ö-x¶FÆÏð¿VçKÛèf§MkUüaýÑë²Ö<^7Õ Xª?{ÔÊ‘†woÞ÷|îk xÕ<¸•µnÚ!2¾ ÜšIÔ0X_òðÃk}¼|ùaÊÿÒ.(N„b–0ê åe¯|ºíÇAyùú8V^Nù{åÇO(/¢¸¶Aì1–¦¥sÒþ¾%܀鬡]Î:ù×'¶ð|³ÿ?)‘)á†=^¯«§©ÎÍÁ\èŒftžgväH£YS?Icf½ÙâCz+LÚ)þ¼£®7eÝ9Ìžp, _@f_ab¯0Çô½a¾®Ùᄳ]ÐPxpòì¨e¿A²˜Ôà®.tÁl„4g¨þˆ–[½3Ï0¹bû›=³ç(«à)C·ú-.þé—wïmø•³«Ê;XÐæXÓN‹Tz>”»8ñ¾MRhI#”oí]UÄí|Á¹MÕ ª‰ðùqÅ^Þ–ù9ML¡·†t90TMU”XI7LÊùgO{Ñ”ìn_‰Ñ”†9Œ3Êìªrkdœ¦O0lAFа|œy q“aÌ!— zˆx…FR iûÑX³Ž“Eܤ&§/‚Ë8%t3‡Jwf˜# .(; "TŸ·4H!¦¨þŽb t‹QÚ€üÐY&ÓcîÄnôËÏà…"ÊúÌUÒ[¡_…n™Džæ¨ººËWŠ{žØ·Üèƒ^2¢2áG–Z!0c&H!´5©JmÞkó/]5«Òœæ¢‡~–eÒ2CVƒŽÇ{@‡ËnÃû,aaµ£®+Ûo)£#Ä 'ªA¯ûù#3h=oHË3ÄÕ –dåÚâ<ŠHºË[Öÿ4ôÇÏ ÀRÆ™€Ô d;òÅt³ „M©|…‘dÛ:UÐÇÞÐ50B¤PôÀ|²«ƒåkÖgüÓó(¼Ù(,ÁJ•á49ÿ|(gÍ…'P½K%F?M‡4ãU^U”~÷HD¼NO¯v°¤%.!'ÏzÕ4LÊODäâô3.ÄÂÈ—Qbùøœ6æïE^Þ@ i“éÆ+FËx‚Õ±-9³lZví^ÓÍ‚é¸*wÅ ø×ƒ, ¹ ;´¶7†HéœÀÇmøp—Ù¹ìVçÆî£ /ŽÙÞM›ï|îS°ŒÈl¦´ÊPžå‰'rAúi"B¶ô«FßîóZWs1î0’.½âŽcU • P{‡ŠjJX[¦6áw\Âp(x'k/ïá„"‚[r˜8ÐBAn{öøUîyh11‰ˆxzvýZ55ZaÚ¦Âò‘Vr•¾JØ>©ó\‚“T¡pîYP?Rªw©",#ó®A„㨬mbÌM ÚIÿFCŠs½ GqB^ôÉ+‡îlŒžëÙJv¯?ùë¾ %‹½}ÞgÜ8$qŽ¥ù¾8’A£l7ç°Ó¬…ÂܲÌÇß×NZiÊÕûlƒå…42 îCvoqáC_Ü·LÈçÀ?nÚ¶\QEŽ¥ÇX¥aÁ%¼ÜÔãf$–ìÞ&%„´Ò¦ãÑ j‹éÛMZ!ª‹]lƒ­Û|eJ.IÕ‰—r7ƒmG©87= AÈÐÏøZ•÷‹q1 `šgr—ÐX&Ï<È1$0ŽúÈ6öÐ=©8<Ï)”í¨áÇ|·¯ô?íç.ÇV&L„Íò˜›xÆ-èÊ>©!ˆ×4<×§ÊÄž~ý±lì‘ e¸’ºðaï‘â„Ì`XXY¯ø: '« Eš)ÓÏvß.Ú='MÀˆ>&Ƹ£Š´Ãž]ßcò—9Üc6nël« i|œ¥ìA5Êéê,üx@á:0ä½8fõ±ë#av|º™òàð÷-eu¶èÛíâ'ð\‡‚©"spƒ¨7msàÏMøa¢’q«ƒÙþ9Ú2dR¹ºþ°$ýÂ–Š o§ „/dª.áRŠQà…êMĵç-%SïëO÷-%ÍCeX…GÈÂ;æoVÇœ.׳õ]ãT:€–PÛ€wSsø'œé»¦îæ’ƒ¾xUÒõÈüZMn‡j”áƒC¯¦x xáØ–}ŽÒ®§ÞŽÏAÁ”¦æEßþÈ(8®µE}ñeQ¹-#LšE›ã¬îÑŒçÿÆJK‰#±÷â0‰xÏ€ð—$ñsScÜ*ÌFhíåÓJ§Ù¥¯óƒ‡Üy¦/ÆxõLb×E¯«ÛN›[ìÖu{û‘úÙûªðSÈgÙ”tiå¨Ò”yeÏ”†4ÌΚ¡§ïrÚùüú~ƒ´Q2[q>‘´ÑsþªÔ’(ù»mna·wt—2î#oóãWªI7×&7<¤î`Ï—¨Üþí€`z–†É;@B_ m ƒ®»p7ži«a™}Aj;ãD’œ¢PÕÚ;„sÐɵ¡´'&‡÷#N.êÆöP®~Pc:^z]‹§¶®‹]ÞÝ_> endobj 741 0 obj << /D [739 0 R /XYZ 90 720 null] >> endobj 738 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 744 0 obj << /Length 3812 /Filter /FlateDecode >> stream xÚZ[Û¸~ϯ˜>EbE¢¨[ú¶il‘´»ÝI`w±åز-Œ,y%9E{Ï”dišÍ1/‡ä!y.ß9TxÀ_x—wiù¹NÓ»ÍñE Í/B)­b=&ùîþÅë÷qx~äáÝýn2ÉýögïíÁœV¡×«u赫uE^òfµÖZ{ï ãÉö„^m*îÿÔ¬Ö*õ¶gh¬¨»ƒ†8 µ—'«_ïÿúâݽc*Vê[l#Éà;É´F:&¾7+àà ÐúP˼Gà.ÓÞ›–˦†Ê–Ë[KLÛÈ"ï‚•7`Šâ+NSÔøßq[Y3q(¸áDsÒDüÕ:ÎïÞvoLUq©oð(`j¼•&~œ) ;ÇmtEUlz!œl8ÊüXç¹Ð•ÇyÓáÂ1{†yÛ•Až¯¼p#,óféh¸ÂÝ: c8AÝ­ÃÈã€Eàd:¼?dùÐ6x©ûƒ­óV¬u4x æ­ðú3¯9ñö5”ï¥L±‘ÆÓ¡†¶èÏ$=B@\•½»º–'5»¾h™Âð»/·9lmvL¾Ž¹„–m䶉Næ¥Kv‹Éð2ñ@‚éAÔÅSyì}øÈ¿"s>*ø"LÏ*#—V˜pÔÁ™‘ºØ¢´𴬿îží2ŒÞd'e[ó¦v$UEc÷Kç…àT¦ä¼~*úU³)ûëÒá& l4ɬ÷ÚYvÄŸÀjçNÌ?{&ðíIOOè`:lpÛ¼÷-7³ù€?ñ¾-Ã4ò+þ¨"YZÜX¨s?Nc+?žËE[§ÀoëXvÄ,ˆe‰´w¶òkyþÁ)VåÆlᬞ å¥ô”£ÐOwz?âÄÏ0ûYœYÖ"ôÿ]ÕòLãËÙ*¾@ep¸1ržñ=[ dô+­…Û¶>#„#˜U¶S’PÛ˜¬6þ>Òí'i <¡mö-:¬ï¨.•s‡WG3’Ì<­Â‰Þ9óŠÄæØœ­ÑöC ¸RO%‹¶—Þ[ÿL÷ë¡8,µgTöZôš ƒ#2»0¶$-…vAF ÂÑ @ËeÔ¾¢-ì|R¨þ¡ ZÜ—L $bK¹Â‡F-¶=,~[2 ¢2Iœ¤ì–ÌwÝôìM:V1*o,â?oJË Ü¦5*i4ri4\»ð¹þW ÙC±ï¤_„æf#ŽG@AÅlz<_PViè*Òù ×¶´YÒ‹Ì&¾&b»\M_6õx7ìø.lD_-!¾\A@0߽҇\€Ã§1°rI¡R,ÚzÔuä{@&Ïá› ì7Vfö'VŸ›ÆB$ó”–Ë”Ñ r+ÇMZÛ¢„˜ñ$"2X$»#:Aƒýa0ò·çQ•œV< 9 ¬°qataSÇÍχCd5¦±$X>:i¢Hl¿”=iø¡ Ù¶ÔÉjŽb]½3ùö‡ÏÜLœ]7D†eÇ–dð®ÅcÀRƒª¸t-iy-ƒlõ`žÄ¢#°èΠà˜ô|(`¼å²¸ü‰1 ÆÒ#t.öÿr°%‚±øÛÕ/¥¸m¬åÁ_핯޳]wvíÖ¨Ga1“÷X£qÒE : ×ZfI†-¬K`Ës:áådV‰…q­gbaí§àzÅ}}>AtT|*ºÃ’«‹S4ÛÂÐHkòØ1Éjcë‡tã ¡þu~”31½a,aj³_LF@@DÐ6çXnO6RJ£`€V,øk2cX^V.,ǼT´„7É:•Ç~”ƒ–B`äGi 9cÒÝ£Œ£[ 9m7UñÙ„ìûþôæõëËåâ×M½¯Ï~Óî_?QÈöú–'„¾ÎttÃÓ,‹èèxšf-f"OÏ%ÔÎ>¾¤»ÝbÍ®¦-p"8öïw솮xÙ¿Mãa‚eÎ9¬Ì›ºÚlÐ(ñ»¨¯XôÕl„t¦¨ØHªÂΡ0[™fÇ}ÓͳV+­ÿžR¨&8ˆ½:Q{ÿZqâb!ÊGR ÕQŒÃŸEHkaÅ(Ƀùf&£Årä¶–|ij})ôH‹…Õ9YX-zÝ8»ÉÙsê'8)ˆ¼©áTÁ¤¼ CCOlLa¤–{ùïåÔFèçQjcÎý×âØl׬&kñEKþ"TøÊÐæ˜_òÒ‚=Ù •,nU>k‘ø(ÅL×› ŽÅüew«°a”ø)àò»(Ö¾RYòŒqtë1á‚ÂÎ'¤ Ec-G>œôßþßÞÝÏŒZ˜ÿarÃÏÌ€8ºoñ£Tè§Y6eçw¹ `ŸL¾VÚ×I*øÀG¶cÆïžIqÖ4ö"¬½±¢f¬c€"ðý% ÉŠÔÃ6-½Ølù/ ëë¿ÐOË©­¾ä!̆÷¬2?ÉË~®ůB Á“ã ,â¹.7†æ-ŽŒDn=L3B*œc7wj‹¯e#ú¬RL¤38ϼfÙ3#Ñ,¦ÂF,WöÖljñ¥›æh=6Î/þP°Ò’Ghn]±ŒÝ ì…¢„ÄÙà¹YÄl–aÁZ|Nñ®ÐC'#ÅÒÉœ€ ôíÞeò;ÔÙkÂ`º‡nÓ–b º`·áaÓÃâ®þ€‡%y  Å)³Q²‰íÝÜ<‹„ù8„S mj)u@ «eSMÌŽ²·adͧÒkéÐ]|JÇ­l@ȱ¬$’Ž24Ð-¶V/-Ì£¾ ùÅ„&)OjG˜š+{Y…Ã>,-‚£ ½v‹ãã/\úÜÓE‰<„EA¶$qWg¯œÓÝr0ðÓÔ½šîZoí*V+!Æ$Ky×ÔÏãÔæ´Ÿ»t{vÈÌøÇ…?Á\”°ßaÏb+¤§˜ óœDâP 29íd`·ó›Üu"樓)"´ò-&ÌÁÊq”Îqïp:uS¹³;#)A+Dv°³.E D2$¢ìtÇRÆÌžÚ¨•Ôƒ<_Y¥¹¦Ç· :dmJƦªqz²^{2ް§è›.¥¤¸gaG#HåÓü¦-ä©:Ÿ&m8²£C8¹ E¢w z˜$%§PòSs&(y&ÙòÓܽawW6. Â"ɵ{õ[æü±Jò!ä×øò)°,c8–-ˆkf¨uŽ8©ûi —"á –e6Žý,…{š\زÜdÊ}l ²p”tÄžS9vØÂO×xu<Ê%,³PQ²O4œ[Æùíä†D¾­Òt25cNå^|¹ö0›4zä<˜!tÙ¦3¿èÛ¬’¸@”¢žŒŸ”©›3JXú4”gÿÈÁ€•$Ú26б0¿Çë™ÆÍöR£1ÿ$¡F•œÊ3Í2ƒ«q ü6f‰û…±ê­Z²õ˜nΦãײ jÚi&OìöQ(õ{å‡ZsýçK[öů¯$ Éñ”Â(Á\€`*TÑ]˜F vÏ}lãÈÖ#ºE{3ɘÌ/Öh¦{”»tžIðÚ ÛfI”F¤ÃÞ•“8òÛ6µŒ6þ_æ»÷é5ðì«$‹¦–ï{8à˜^Í­È>»\ŒÌ—#m…‹HzÏADl_ ûŽ_GÐ1uŒ¡ë¡Û½g(þ4Hžq8 /ùñòúücVÁ›hn!{üýðö#ì®Ìä­=‹äû%ÄÓ‡ ³˜ª©…¥ef‡‚­†É§àœ»Š§!ÑÊ{^/yKkuT>ÊJ:ã­rùp!'(ŒUNV¶=¿ËaÃdßô }ʇ‡ ùH'|Is~Ìs2gs Åcá³ûœ®c®F¯øÙŒ•…ýº‡´ª‡€L0w1|y”†;7ÍÉæ‡¢@;ë{Jo¡æÚHzGtvê½i·ÕøRpn;Í… éº ÃB?ÌÀ°A$žõÆ­,xTü|S±h+PX‹GI4˜‰–7( ’s®z&$¬’Øï pžã“É› ŒïOÚG¦‘>(&[¼nì¸IÇ¢P¥òáaÉsý,d0쬣¿>hÀm=£Ô8dÁ’©9 £äú&òà¶Fú†\NNº‡?øÉ“¥ž$s½ k°£-̶Ã4¾r!MÎÏùø{°Ï²¼Æ7c#±àF|²3JÑá·eüÊ%ß/¸z½•§5ûd<û|îMüƒ ùËÓPÚG6 ˜—.í ¸ÓÿWh¨Î endstream endobj 743 0 obj << /Type /Page /Contents 744 0 R /Resources 742 0 R /MediaBox [0 0 612 792] /Parent 752 0 R /Annots [ 747 0 R 748 0 R 750 0 R 751 0 R ] >> endobj 747 0 obj << /Type /Annot /Border [0 0 0] /Rect [295.3952 406.9462 461.4843 416.9462] /Subtype /Link /A << /S /URI /URI (http://www.nongnu.org/xforms/) >> >> endobj 748 0 obj << /Type /Annot /Border [0 0 0] /Rect [136.7273 352.1074 218.1516 361.8043] /Subtype /Link /A << /S /URI /URI (http://geomview.sourceforge.net) >> >> endobj 750 0 obj << /Type /Annot /Border [0 0 0] /Rect [502.606 184.8264 522 194.5234] /Subtype /Link /A << /S /GoTo /D (write) >> >> endobj 751 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 171.0697 228.2123 181.9788] /Subtype /Link /A << /S /GoTo /D (write) >> >> endobj 745 0 obj << /D [743 0 R /XYZ 90 720 null] >> endobj 746 0 obj << /D [743 0 R /XYZ 90 468.6191 null] >> endobj 749 0 obj << /D [743 0 R /XYZ 90 341.0516 null] >> endobj 742 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F54 117 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 756 0 obj << /Length 2571 /Filter /FlateDecode >> stream xÚY[ܺ ~ϯXlê v¼¾_Ò¢ Ò ENó2ÅAÑÓÛ;öYåÚž½ýíåM{Ö›EбDQI‘©YÿʃþUî]¥aèæQš^Çwžïßù2ÚÇvÎòçݻۿÄþ•ï¹¹—ûW»»…]ùOçc­úïLÕfë;Ãf†¡“|Øl£(r>Á“YñNµ¼þ“ÞlƒÔ)O@liyBœú‘“§›íþúîÓÎ*Á[j#Ë[zû^ËÑU’E®F1)¿«89Êr‡´x}ÔG½h垃ZŽH¬F&L5PdñÛ7þÊBÚfìÍÈûA¡ÙÏLš4{"²@–¡: ”¼ªŠ‰º“m³Ã¬’ýP$¡Ñ ³z© xµõÙÜ­º~ìñ]}®ôqŽhX¦ï<âEDÎãÐØ;™4iùÊùA;G¤e ªïœÚê÷ÂIŠLlÙV2½AJÞ›\P0ˆœr¢¼F¶¶Ífà¦gœ‡BÑ ¸Oµí33â}¨a≾cî5sÐvoiu3´Øì !0ÃO ì`MeÆ¥zÊTË76ûTxf`}-*8°{Šj?â‚–#›cß5ô· àz›îÀ Ÿ?~uyô…*ÛDŒjGÍ”WáÚá¤Ò¿³æQ6Âý­øâ„®“ œ"ߎ¿äéБϙ`îz‘£¸0ÕŠö¦9ÿ4Š$dìÊj!JfP¼B.€ïxÚÛÈŸ–KŸaá#.|åùo²£'%ª¢ùÅó£‚â!‹œXMSM-™´bl¡)—¨«F6IΓŠÇ—#xecõÔÆÑœ|UÉpÖ°ß«/~²TßqI/›‹‰…Y8ƒž ¬~ROÆZ£°GZãda/+þ] ŠtŠ ÈDÓÜ*šV̓„9rœFÔÈÒ7®Ý‹"†ÑÄ&™s#ÙìV”ÅžóXWrE¿HDƒ¶ùÏɺéu(²ž3gO†èé¿›Ø1ÎãÄ)ëîf24úBäéÓ C‘òØ€Dâá”Rq²@«^Óç¬1å ¨Šù'4¢¤8/¬Â&.üŠáÑU­ð•«yþßlÏÑ@å®…éÏõ9·‘‡FUÉË9þúžü#Œö¾G)C4T¬jªG^8T]5¨©ªã¯D©Ùe“×0³xDU wñgkåInOÁ-`TÚ`^iÃ,q=p؉æAŒÝ Û¢  ³L¸þ€CJêÕœÌè Œ›‹ÀQÃïž2 b“0WÂŒ+V˜ž+Ðú³„3re¥Ã9/ÂŒ³õNF´šð²±£Hµ'PÔMrÚüI#L 9d-0jj!Z>|"EƒÐ8v~­XñŒË‘ᳩi‚£ëf?É"•"ß—âÀÊR)&»”­ìȃ˜‹78ß·rñpèi‰镦à I狈£8Q‹J‚„e×À4¬´ºŠ4©œs †"›ClÉÄ[ñŽºUè‡èmD¯iîY˜þPŒ’ù_•¤"¡€æ°vH¸¾ço’ºPërá2©ÏPÞÚê[26X,žÄ`éÒ/Ohn´–|–Äš‹nm G}Nîãxê»I$KWs½ÇÞ¨œ¾sßÍËî2[`ìàVv-Žéá‹éb]Ì⥾>¢”E&m9&¨°<œ kx‡É=!Ëu7«Ña¾V¤ÃtEíTz³Ô4¦&¼Ç5ilË7-Þ$qì¦Ij¢ðoz¬V$s½$ˆ…kMéÉ`=mÖ°±ç²£Õr Ê6N ‰'Ù@÷6HÚÏZ«­ŸgnšFþEoÑ&DðmÚÖVæi0ÐÚa~7ˆ÷8êprPýlIIŽÂÞL ·$´o –Þ3ÞF!ÕgüpáÆCöˆÏL-LÏߘ®È§¨"uM¬ÓžËî9æÝ”!¯vÕÐŽP_-ªá—6ÝðX¢0y„H+é$-žt©Üy€ÚfšZ“;‰#U™Ÿ˜ÙdÖȦÜ4£E¼ 5È~ëUÜ Z¡J)ûÎßmÑâGrX½ÅE|îÚ kVî³|~kµÜ¸Bc†„• ˃:àdDPü‘„Ÿª't!\‹¯ –Ú;Ÿ@ð·zÀ®‰Gu˜µ²Ê¨$RÅ»Ped3Uø¢¹Òðó ÉÔäÒlçØ[*Y¹[s!ôº³¢¦%=`iÑÔ›[ Ù[æG Œêæ€7ÞâGÞ|q6kªsQG&)p<‹6~x®‚ü`´ÞMé— &°YÉ1Í´±4Û•–ËVa\ëTøaNiu€.бyCh yü ý¨ÒIÍP­¶›-ÐGdöÚ£+„ä–1)xèfùê†Ò¶Ç"ØÒ€{rŠ« ü%iZ¢¡à d’üv[KmCö=Sy2†¿ÈgzSã¬VóË,*ÊiÖje/_s_Eófbñ°ñ2û‹ŽÏ á™'¿Ex&ž‘Ö<ýÂY?2¸ðèÙ#V`–ÈÚ‡V.Þz^fŠš—ÎÎÈ_<÷¼tí¹çñ¯ Åü¤´’¬ô«EÕ¹o1w×=¨ÐižÇËæáö=Ɇ¤áò€÷Al^þ¡[|0ì±qÆÙQ—T&pÌ6ãhßlÁkU­‹á„ªSu\†[>WÛ qCÏçÒý»ÅµýqœÊF»õŸÖÄ,Y¯ñO€n I3Š[±ãçʂӅW¾}Ã?2ÌàÃG{þ“NXMüƒèÿú†€÷ endstream endobj 755 0 obj << /Type /Page /Contents 756 0 R /Resources 754 0 R /MediaBox [0 0 612 792] /Parent 752 0 R >> endobj 757 0 obj << /D [755 0 R /XYZ 90 720 null] >> endobj 754 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 760 0 obj << /Length 719 /Filter /FlateDecode >> stream xÚ­Vßo›0~Ï_ÒR c‡N{YÕLÙvÒØSÛ ñJLDœ¶Û´ÿ}©Cé4E ‡ï¾ï¾»³!ÐråZkQ„@€)µV›‘«—ïGP[ŽŒpÚ!ïÂÑtN ]¸´Â´CÆ×öù:ÚN -’‰íbâ „lÿlâ`Œí éxª=ÐæQ¦üŸó‰ãQ;ÞËŬrïä¡ÛÁlr~]„(ây/É.C º½¶ng€±üaR©?a|•íc©xÄoÙê>ÝóXå ¥Äžž*WšÊø²8ÿ8ÿvy®î–I–?*ótZ*—‚ˆ$.5%@qE= <5ŠÕõ.É7‰(~¨»Œ-‹¨¾ù›Äór!®’ÔLËüi' Æï4{HvÊk­àêêý'eÅ‘ˆ´3×+IÊxrȘYÒð×ÞHTB õº%k1‘îÄt¹Ëvk+g\¹\âÚ—WáÅ™¶Ãt!IÝ ¶Ùæ…ˆ¸hŠè´ßokYG:¥.™'YSë3] דÈÓÃöÍçÚ³üžÔ}c¼ŽªUª)Ó†ÐtL[­£â`’×·já­Þ@7rëšh—_ÃÒLj"â;¹Õ6G¢T¿€‹U"·{é¥ÖAϰC@ϰ¯é ì…”‡©·d9Ò^‚™Êâëd^op¯ÓD‘t Ï—ÖIS$ò±ÓËc¦AÒ_ÓÀ~¿¡©ÎØQoˆÇÌÓ® æià a›¿º; M»,2”¦Aiü!MvÌ<íªè9½ÎÍðªÞAâ¦1­­N‡ ½fº”Š ·%Fµ:5~E¸“sPÝÖè:I…¿é¾YQ…Ûù¿‘S“_h"þU-B0Á¸ëÚÊç·HKð¸üQTUª’L¥sŒÈß&)ò¥ôÿÔÀC!Dišíwë2z'â|/þIñ‚3Á¢ŒýL^Ô\þáû]zvÁ endstream endobj 759 0 obj << /Type /Page /Contents 760 0 R /Resources 758 0 R /MediaBox [0 0 612 792] /Parent 752 0 R >> endobj 761 0 obj << /D [759 0 R /XYZ 90 720 null] >> endobj 758 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 764 0 obj << /Length 1245 /Filter /FlateDecode >> stream xÚ­WÛnã6}ÏWеƒ#Z÷}i’-²õn Ô‹>tû@K´ÍD ”Ç[äßKIÝ"; PŽ(^Ïœ93aÃRØ-÷m:¾oDé…¥»ï/°n™j†ÙŸòËúâꃋ l¡Ð ±±Þ6YÇϯ÷$[àyA&žË…iÛöÜûqa:Ž3¿U0‚çœ$Íø'±0—þ<.UgRçªÃõ±3ÃÅ?ë·ë”»\¾»š2{ÙÇm -]ÇðaÛqkðT¡“|¡6pç«ß7ßhT4/—«ŒE÷_-×R?ü“‚¨šó«Ëft½gyÓ‚gL·ŒÓ¸yÙ›çw׿}øòùZ÷ÒDt³ÔǤe^=³ÛuåùžBŒ‘­%ï 0À¶²ÍÔØöX€fÅn€‚Ðð|ÕØA͘¶¡Í³ÌÁ¦ù)özh+e ã;ÍÛ Ý–¨jú"’$}» s ÏVа°k5ÒYÝqVtWó¬ÑŒvïYåÙ{}dõ¢ÛŸ¿¬VƒõKÙ–â§ZŸI±ã=/V þ­'bŒ×q†Ç 7µ7›öžð8ÑíYŠ"¡ñ8*dKWÓHˆRT}‚‹ü¥¿lLe’ñb[ÛZý“”hì¨Hi!¿'8}& ÌøAKóé©2þ«Ò<þÔÔ¼PÇíNLÜ>f’æ v®l£ XÐE勦E(/rMsN5º_üFµôSÂK’ŒØ£YB8)˜àèd¸® `Ëv^ýSaàøÈ±]µ³"HgoðÐŽª§£â d¢ÝwyæÁYòšFíÀÖ‰NsNÊ·‰›¦-T‚+Ä{p+˜ Óã(ºišGÐU߸Ÿ5œB»Ù®BƒN ¾™ú—Þ\RåèˆÂ‘=› i)æF”=´i†Lª ³†÷Vc«â·&¬n ¢iu÷çZÇSKÉkýñ‰ÜÓËÏÝ2L¿\p³šB6 EoL'Þ”¡°ÙiC¹xƒIë®M±ÝÂz™’„}¯ÃX‹,`7ÑJ¥;²oÿºH–Q"Ÿ_Aãô`{(Üаý-Ç{1=À³¿â\z°½¹8À}AK¶Ûk‹jE£©Ûë :wÎGœžõÒ0{ßþN£Œ%9Œ48öÀ»n‡’ÇmÜ©»ý÷ÙFmdv(¦¬SRš2Îlïê¾: )G—üpIÑÓYEŸ(o G¸¿")ÆEN'ïæZ.Qø"—’vËTmõBÆÔŸHן-FUä “öE ºK­:ÏáÃŒ|×j¦MIXH–—UÞÚšˆsÈ *‹ç9 ›%ä‹î´ƒ(á²ÜŒeNRÚÙ9•ìÇèn àÇv|'I œÞi8GQj4’t`Ô¨‚q™Ðž §i:U陚õ{DÅYÑVrº˜a‹ˆ¶æ[ûá‰ì8¦à%÷uÊUÅ­îRuînLþFÄÇ!ü¼dE‹I‚‹i UßÄÒNgm‰œŸ#È]™*Û‡·«{ nÁw_a K•÷FßaQ)¡ÌÙH•¬óél}F]]r`ˆ=Îg ðVÔb;NÊCõçÜÁ¢?>õ;«SÇì56ú“6rõU¬O?ˆ¡­ì—é†JÝ{سh¯e’шmÇ¥eξÓ|8ÕUþF™A endstream endobj 763 0 obj << /Type /Page /Contents 764 0 R /Resources 762 0 R /MediaBox [0 0 612 792] /Parent 752 0 R >> endobj 765 0 obj << /D [763 0 R /XYZ 90 720 null] >> endobj 762 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 768 0 obj << /Length 1332 /Filter /FlateDecode >> stream xÚ­W[oÛ6~ϯð¬µK!uµ[ $[¶60ï) Z¢m-2)H”/òßGФ$ʲ ƒ‹×s¾sûHÂà?8šƒQèºöÜ ÃQ´½jøåª–ÅWXí%?/.®ï|8‚Àžƒ9-V†Eü4¾Ù lÇ O,8Î'–ëºãàÃÄòà;ÐC&Ï‹ß.n5*ßq¾‡[,éî´Cdz}'˜‚™gC×ó+øW¾ÙG8g(!²ƒò ÙNH‘ÄX¶ÙF5–4>Ê]u¦²œF8.sÕ-6´LcÙÞ ¶…q³]ú lcXlpO -«,°’´¢¹Ïhžuà EZQ;2Ä6Ú ¾{‹XBÉ–S»’èE«§Ë¿1£6ðÁøžè¥‰B¼¥q™ª}{õ)yÏ”¯k‹Ð’–¬µû<ž6ji9íÈÇQZË娷ªEßËVŠÉZûN;Vn’lË픦tãNµd0¸J?*˜ìºÜb¢zÚyH¥XJ£3­QYµT}|ÀQÉtxöLºvɈœ‡—ã';lb1W vçù€7õp¤¥2Ñ’W87aÅÆíä´pÙå Z¦Û å° Õ…u’F^µX[p§ë'ÆHªDxÈC·´ÍtV»ZqGÉ-g»ŠåDçKåt%<â4É´#NªëL·»ïU´)QÚŸb×Õ¨åÛ¡º&ÐÇû›ßïþ|¸ùÊMü,ÌšYο=æýS Bh{>§DcjÃé#Å QBfF>%ê]FÂTg×ßñÐâƒêáfÇkÌeÀ~¯º×iŸÅ×:p^Ô® P`« ð!¶5ELù\€&”iŠªjÓU²Áy…Hö®®«¶Òï¶  ×넊•UÙ´ÆV;£e°nÖ¢™¸4ÍN4HÑ'ÖÌ ¶{tzÒ-æ%§EãI’Û{â§hPYÓéZ‘€ËÕÌ=¿GQ0²E0Ê bQæÚ<‡#ýŽ6á‰ÿ¨4„²°Ç4™$¿>Š|TUy•u}QšÇ…Y{Â*—'V8 Ïyο{«xjÒ]+pÏzËЀŸœg®#týa˜ÄöÕÂu:Ãeéõæà <jM“o"‹Á;üže[ÁŒKÕðêUšÁ^4ñyú°­,PLdT'š]•ð¹¡0€.;»ŒßÊÖD,QØ…î¶Í^'wW ü ÝÙPÅÀ¾Œ_ÆØJìºk,J6W%ú•ß9/+ -«ú|¾ÿc![¯µb(–‘ËÒôL_© 8ÕWÇx×ò‚RNï!÷xrl.éÁ<ë²”ß.§ëeDSÍÈ Ó)°æl«C;4aïu²’F™œ¿G,n^¦8Nîýêö)é˜ëÄè ®VY—ThTÐA÷SÝ#À™5íÉ“5ÕäŠÅ»_µìµI€éÉsÈ÷l„ÁÈ3Û™ùõ›È³ç3èò'Ï(Ç£Uëq¤7Xí}/¤¹k;¾ËEÌCÛ÷çŽt˜õIè¼ylšßZ¹éÌ?èê¡rè&;8_"UšjléPCYÆOD"l’ß1¿I¦Æ`œ¬V¥®Ø°Wa€Mýýÿ€L\oÔ‚¡Rî„kÔÀ‡4a,Åu¡÷I–"÷,r¾ÚI÷Xª)¤¾¨uAù*éS%â<]ì“úÜ9j­ÜÄú…Óå9u–Tõk i^H‚߇ôä=. ÚºŒÿЀtô endstream endobj 767 0 obj << /Type /Page /Contents 768 0 R /Resources 766 0 R /MediaBox [0 0 612 792] /Parent 752 0 R >> endobj 769 0 obj << /D [767 0 R /XYZ 90 720 null] >> endobj 766 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 772 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚÝVÝOÛ0ï_‘! ¥Uc|±Ðö0Ä4&Æ&Qíx­S2Ò4 ¡”"þ÷9±Û9©[Š´½L•êûùî|ç»_ÀÂâVˆ-ŸRß·†“VÛwP3G òiÐ9øÌÀŒB‚5ˆJ£Kûø6Ê»`—¼ë€]tBˆívJ©}"ó¥ì,J¥ü۴븾=z›i-¾Ìj†îõàkçd°òйîk~Wƒã®î8°¡å¡¬v¾wPç‘ïúB Ë‹%qWèeöf˜Æ\®ö÷åønÆ‹Rˆ@.Ÿk=ˆ2J›zø%¾Fs s>È1w>Îä´?­‰ŸtñbM¼8ª â¶)Øn ¶›‚ÝMåE’•q›½g òœGE” ù2$õ0‰J^$UæµÍQÇ÷ ˆåáE W"WYõ'E("YeÊ«}9;½4q¦|*Ó§ç9+…³÷ñ´˜4 ã-Û!ïcó¨Pc>UÆÓ¤,S~3›îݨ B1±<ì¢{°, ŠÂˆxñVÁ­X«åG?a*Â*®ÅBa?ü?ÃÆ‚yŒ±ÝæŸØ6?@¡êQûyrÜz™#bÖ|šê^®ºeóD«ðÜ RY ÛÏ®ÇõoÂÁ”Ê–CŽñþí*o–¯§aöú5§¢ÑßÔhûz[Õ‹þæ–Ùפ¾ØtèXªÈäHÝ ‘°€WÚ°`PÀXÅIpªØ[Vh–ÑÓl¹ê¥%s=D°¨)“Îf£¼˜Ž+¥Ø¤N¡M—õÍsÑ:¢4YðJ×Sq"U÷òšP ×4Ò«·FÓ‚­=+þÂ;QtÅ‘tð‡÷ͼ'ørwèbw¨r\!7dÉ3fi=ƒ­O¢d•¯7†÷,ºS4ÝKÅÔèýÙ÷›_|X.aI©Þuo¥æïñQXd4¼ ó’g³æÃÂÍGxš%e²z=+XÕé#U†' endstream endobj 771 0 obj << /Type /Page /Contents 772 0 R /Resources 770 0 R /MediaBox [0 0 612 792] /Parent 752 0 R >> endobj 773 0 obj << /D [771 0 R /XYZ 90 720 null] >> endobj 770 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 776 0 obj << /Length 3037 /Filter /FlateDecode >> stream xÚZ[Ûº~ϯØ>EbE$E]ôá4=9H» túÐÓ­-¯…ØÒB’×›Sô¿wn¤$/“MŠ ‘DÉ™á\¾G]%ðG]•ÉUnL\¦y~µ9¾Hdøó %ok XÏIþ|óâÍ{«®T—I©®nv‹Mn¶ÿŠÞí«û•ŠÆzµVQ¿Zc¢ì«uš¦ÑÏ0ñèfTÔVžÿ{·Zë<Úž`ð@Ó X­ÒH%zõ¾øùÆseµ~Žo$ 0®çŒ+“ÄÚ¦WY‘ÆÊ¤–¸?TŸá|«mô'~\ÃÀ_ê]ÓÖ¿%6ÆmÓ¾æxïN£||üõúÔ[dxX++›°JÎûæ »â&ØÕÝÎð/Ïÿ‡Ö+§6M¯Ö:‹M¢RÚåÍ+&ùTõƒìÖÖ#¿šážßêÇû¾†¦kù{×wGÏpÓÆt€së%—¯ÞÐÔz9—±Zšq©•à1(*l!xˆåŸªÃ©…ëq_—¼¾uSÍÀoîyÞ×½¬»¾o6ŸñÌI]wõ(t›êp¨·?*Ï= Î¥C~I¸f Èf²½ïk/—{9w—ò ——QÝvõÿÇî5b/HÄ¢ÑÚ[Öœö¿Á¹lš»ôy¤(¬Íà%­IY#7(¿1:Ú ‹KËÐ-|Q}×´+rnôúÛ }Áwt¿ÑàdÓÞñŒ"}Gë6õö„CBs´tæRǼԀ¬Ü÷Ý]ëM% Ajâ\)G^µÛЦZŪÌr!ªÛí³ÛfI\”F€ÛoPÄý¤‚œU@ßJ»å÷š¸B½@P*ìò‚*ŸYýâTFû>4õ9Äv–Æy^”sU„x5¨‚´²»¾Ãè{¯ÖEªà.ù,<öžtO7Ñ 2Øíð)FÿÌ©¢m¦~Œ¹ zŠŽxOt*FÌÀ°hhƒ\„.5›’SÒdJî¾%§¨ Oêâ³&%}êÙ[( "-ªæÙ5à¦VÇy–eâÚflªCó{ý­à—›8)K-k¶lÍ¥ f³¨ê›N””&Z4ŒìßÉHë4Tokt÷$!1qƒ{’lüÈߤè±ÂÑ- iÇæ:Xgi}e´}³–,—BŒNÊbi@(ýî.ËØR<‚®pˆˆnñÀªÿ“>Ù‚¯o‡óX(þeЦv‘íUûÍD•€R+ä1‚‡$ú©Éy’•B\£FÉ[`ò4¸ `X·$‰È„Ò¡Wö^ aß”›Ha:Ñ±ÖÆ,¶áp¦ôä#ø13D¸¬`‡—×Ë8®çkçï)Š) šÜ¤çá–ÞfÜÂ÷©ÝŒM×:×ÃÐeøú=ƒu;D&ÍãÔ”.3]è?…SS®¡ÝP˜S®Þa(§hNE…u¢²¥þ¼ð/H¢3PëŠ~“›ô!^ €_J9‡Õ3;¥Ú°÷¿ÆC³9XÁ³‰š™!:Z€ u^‰4;Ú}²'mé âÜâ€â¤FoSˆ‡`œæ Êøô*{Ãò,Îë\æÓ‡w{ÿëÇwA`jŠ,V…¾0Öcµq5gGÆa£ðV†Æ‘X’&É$lSÒx¤bš[¶7rÏ#”¸àÉKFF!42Ke¹ÀfHñšMgÊ—Îo¶Âœ0Y­7Wq‘–Ïã*—™ƒ†·‡É$(s‰öU¨%xºa'O8uµ›Ãi;Arb)ÞÁÅêK 2QFÆ$£\¶e¡â$ñ0jñPßv!©l:uÂûÜŒ #„áã9¼ÜÕ ë‘¢°Åw˜L$ÂñHþ×Dy-icãâ2,~¤Š«›FžKbLꀖñæA.ѺˆûÄü‹8/ ÉÎr9¦Œ¦¡6Æ©³@‘€Ëæ®?lùõÕ7msøžߣ¹Üæií©Æ¨KÒ‡Á´0 ϶›GEü<ɺóÂYa¢âÇ=C]Â’4@4Œ¡(§È=p[jæV³tá“)—jæ’6Ë™ð Ú4mY=ò0™ Ö!È\Ì+P˜¦¥q¶éï,”êKðºÒ•›ÃXqN9NbÀ‰Gß=k°õáyëŽÂ)×"(ë¡j+Ì}7¤p³{çàwƒ²=¸ÜRÛì;¸ÿJè+ÆÓ”L ƈmÓª¿;MÂáÈyï/“²FF%ÑòƒŒ¼ê'K µ˜ÞI P]fã®Á&ŒTƒƒÞ]˳~Š`T-ÞJûºè5;?h¼8A¹ÐcŸQNT*ðb.øŸhòý‰aÒòFâ§ï„QÅOÿâËñšGÑ ñ¹L®HN@ßDñàÑOª%é·!]Ã²×¢Š‘’=ÃÓDŸ[®!©MCŒyÔBbå‹ÌŠ;ã5¯”.ï>„5ƒÖ ‚‡Œø1áBk#¸úÑW¶Ä}Õ Þ#š“R’¿Àׇ“W'¦Ù (ÏO8[\ò 5¨á`vªÒDܯ€Èò«Í]èUÈQJ3¹3]ßZf4‰û@œ‚™Í*@ïW…ÙìÔ–¨ŽÎ®ã€:X ÔTÇbÄòNÐ{'±šÊó°ªqMŸ_Gr*)c¥}Ûí«ÀµˆÕÔË øoG'el{§eW5'áH ‡[_Ÿr† Ÿžß¡Â~X>ƒ‹ÔyÊ 0窜¼Õ¸œ ÄÉ00|aÙÆ ØÊ`5>œqT†@ëñŸx ™œü €Bg˜9ƒÊ†Ò±°æ9egqj}=*ívãÚÙ†ÅÒ‰yì~Í\œ½Š<8þžàÆG‰Â6é*á‰[ Á”qjø"9¾–Z˜·fªl´áÛW' cøöÑÎ~ æÆŽÔêÛ®·îì˜Ðsš’u&üªøqn¨â^óå’ìoq¦ô5 ±ËU®…žÚÔM§O¤³<ó5/h¦µG3tå•1Øãjž¢W®—™G±”!,Ý@VÆËŽe$ïzI|ñ¡ß©Ú/.R?Ž ÔD(ç½€Üðš ·r‘^pá­ëÃÐÙ”q•Ì·)\d––ÙüšT1]S0̃‘xŸ ^½üpÃä!ÀñãÆC [úš*wÝ`¾œ!‘—.n”`mu¤½†x#'ª»“Íûú~òª)ª¨Lú³ã—qË)}ï (ø€Üõ–úxˆ[<üî“ô8ί^ZÇ‹–¹èZÇÅt±Õ±;M"X[å´A5ÛÀ“;€P;Íã NØBC±GÀ·ŽŽ3Õpaͦššhðy^tz¹’h VÜð*C×*:Ö]íØ_»âœïbÚsÑZm_Š)I託ŠáÔ2iOÛóŸïÀf¥bå┪RlèôÔ³vŸt×§ž¤–!úñ·¿£æ|0âÍœ«>¤ˆòă­ŠuaŠç[]EŸ‹t'7¾§žÏÚõðÞVGꀖ¼²‘BR¼MÇ*É.:ÅÒ_·˜bþƒ'D"Šž´ZÚæ‚Nú±~¼Xñ4Ó1FÅEÌ?P×[¬Øž_Ç4T ÀKðݹ\¼›S†» tre¢®à k^ô4mKIŽŒRnMMÚá¡ lãô»CæËA€ýˆGH×Hi}Í ”fÑq‚ 4B'ª±ùWŒg(NÅ@°Îc­´~Lå¥ÉCvˆ€|²C<õ¢Ëm±ÅÇôXQ;[þßËÿwÆw endstream endobj 775 0 obj << /Type /Page /Contents 776 0 R /Resources 774 0 R /MediaBox [0 0 612 792] /Parent 778 0 R >> endobj 777 0 obj << /D [775 0 R /XYZ 90 720 null] >> endobj 774 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 781 0 obj << /Length 3973 /Filter /FlateDecode >> stream xÚ­[[sܶ~÷¯Ð[V/KA&O­»n]73Q§I:¥v¹cj©!w-)þ÷žÀË’’íj-×üÁɱ„ºT×åvVLR¥Î¤O‰I%Yê©&q-„„J­ö¤),õ€5ɪØsKyƒ´Ñ¹"é\[WÝá%30É’(IM6Ö§%Å­Â.Ö&ÉWE7·ØŒŠá”˜Ìÿ°°¼÷ÓKÊç¶fl”¸Äù¦w)ïvkù¯×R,³I*;¤ ?îÐì~‡h°vüíxûh4é”6Õ&z¨ðØ®d;ü£ÍWǺæq|~ Ä LtLE½¼©ƒáÇZêîÀø€ác~"Å队my‹} âg‰S€í@Û†ûKÀÝyFÃF©‚G½ö´bí±£]ìhy®º”]Ó r¿ÅIöÒý-î¶þ©òRzÇ ˜ú`nÛ¹ãÔqŹùe1]"=7̸›b¿ÅµÞZXl/zk³(Ž•³ÉÓ”dv…΄˜P¶Ì¯[Üû·Žk¦<Šøì>”÷î@b!ì.ZtçÅþJ~ïšvpóöBghdz§4…­xc߀tZ»ú­<42½|/½âæÜf¿léܦàlë¬l‚~{ledE+Œ]2kƒ¾¦ìÿÜ1¾@A«~§"…ýµ•Ö\¤½kãVÕ+ÈQÃWâ(ÑÁ)¼è`H{̓·UÇRýÆR¿ÙyQÄêwùEÂÏ*µ9¥øîºle€œ$²`âúo}hæ¦:ˆ“j‹¡x÷~Í"µ³õ@ö§¼Ž‘›'Ú¨S-¤‡¾ƒa5ÿÏäc-dß@ZH΢E†äz?˜bsÉ`¦ ăæÔ­u–®ö$ÙX" °'éA+X‘r>_•÷쫎!´åÁSôF•²îÈåcʼnáB˜´°@Û ´ÎT†.cVX³HÁV¿„Uk§ˆ×ÌØo>‘‚bKJY&äàÓúyŒµê4áCéÌt¡”Ž}ú¦*$ß æú ¤«ÒN.}5ö>ÝãÓMÅk"ì¥5šQ§÷ºÖùrÎçôI"'I"ÇùLƒŽ”Ü‘$xæTǹ(µ¹8ßÿýò·r#çÛ'8žjšŒ5¯‹®†™Tn'‚…Pò9Xèãüµ#äÄA*ºÊ*d´Ðɇ±´æŒD%.œô×IÔ#êNü¹D+çÁ¨x_"·ÿχKjÒ|$e/f[üï@«†¨ÓŸyئ SrÀÀŸëêj }ѬV7!´eè+\”Õ)èl)èŒæ!" zÁ/$…l{©Ø–›º Ð'W#¥„:» PÓZ&íi«ârtßbßâ¬øŽÜ7¢°c[È(7öIÛcÐ}„IÊ®þ9Ôn^ ;‰Hɤ:2Æèi¦cþŠM!ŠeŠ)’žBˆ’[ön>&'EEÑ’ßOã(‰õcÉé4^íZÊ?Céí$Â~É bV²T-p…ˆîXR®Dh°.5ùMÎVé:a‹R °ÃMàáäãý™×V“íMÜ8TÖ9Þ(äéØâ6ª=8”²Ó4”5ãemIÞ”Ù„‰¯a¾-DÀPy”O?c–‘Ì‘Y„G>;n"—%ê$¿Õ–}ÞLìfQwoŠ)7Fáh|¬Af’níX¾çÀ¥XN¾›Üpê¾íó}’Öê oW£åEĽ‹½ßVˆñƒ½…F„Ü$8¹‡Öïf5}-JÇ<{ýÛ§ Pšá¹yCq]Ö·Ýa°™8ŠóØ~>vÙ4M»ífñÚ4aöädÕü娍Ïì4kXâi0…ãDDP‡gh·û¯¤lÜåSÙÊûÙ4¤‰t¬ÁçLõ<•Û«Gàpþ==»bó<ô잇žÛ[¼?xZ¡‘…Ÿ—n#ZL¦~´z øÿ¦±aš¯ÝÞäܾ–œufQD&Lºl¶Ï’îùðzi*m£4 éï;ÏÖ¹’üË’±žèRªÜ…øC’ð ÓµQçQ9¹ñ‘wo×uh™ãd ‚›‡KÊ/¼ððw¤ÁIû¼¢ä.wƒ$2ßßy\!î¯-÷åÔkŠƒÿ¦Ó(&Ž b–òžÃèÛ>⣧œN%/éÜ8…¸>òǺWؾHêBû€æC¸ßÊØÙà-±idóL=•RÒIäL!v0뱓+” à¢Ü…«ö§„t £‰Æö[梄f“,$h›‹q²Ñ‘ÊrŒÁ‚G£›‹HÄF±J|,õöÕûõ†±_þãžq²îôIS’»È9ëÎУ<ÓÉ“¦Ðo=ì8óHètB$é§rpÚ.J"à€5ÌŸ‰õí¯çô\ /"où]ôUI|ò®É˜m:"yî]“ï÷ɧKB4L.‚ &D]:ä5…_sxø½®•á¡éEÐN^ïä:7ƒXÑ' BÈ8•ñL…×>Ýgn”v3—×#rÅËZ~‰q«ýM Öá³¤Ž‹„ÁŒV!È—ÁÒ2„,ý}1'@äݸ›}¹öw*'y=b´÷¿òè‰èdÝìfõp¾î_|-Jä8^ÒÉþU¦Ê"¥”›¹`t‰÷Ýz¨(Ô”+—;ˆ{e;x¦ëä®´Y¥¤‹\ËCí¤¬(§„+5§ƒÇï ÓiôÂõœèðihj¢ k¸½–¼FHbzŠ'Iâ®Ï·&΀¦¤ÌÖ–ÒF¼ l#mvá]÷ÿ×¹cè´Öj¹0‡ÈFÜA{àúñx šÒÏ7ºòÆ!'W4-]½á[5ŸÓNˆÁÈò-ò§<О^AüÎk7ýÓK<#“r,‡™Y~Ž× Ò{tl”Ð¥§’rDFþø”/VœJ×cNB‹“¢R=xÊOZå‚1}Ɔ‡”z6ƒK/›Ò= —ÞÀò{N=/]ÉÌÛ³ ÌY¸|$Giûg@ÃG–j5›±_ã£.­åÇ›ëBn¾õœïž¥q< %ÿˆw`1>Þ gñçék~ÿ›ƒëŒ•¿†Ë<7!^8ŒÿÄ ‡Ø9(ë5×ð1ÌNÄ9jÔ’¶äBHLFçëÔh4@K'ã!My_„Óôsüh#<Ó p«<=îü%ÐâÕš²`<ÓÔ#л¦­· áUâ3r»ìJ ‚}¦S?"YNEÖY¿XH?•딸Öá¯?Âx ‹ÿÃquj endstream endobj 780 0 obj << /Type /Page /Contents 781 0 R /Resources 779 0 R /MediaBox [0 0 612 792] /Parent 778 0 R /Annots [ 783 0 R 784 0 R ] >> endobj 783 0 obj << /Type /Annot /Border [0 0 0] /Rect [341.9997 668.2565 471.3483 679.1656] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 784 0 obj << /Type /Annot /Border [0 0 0] /Rect [297.7757 233.2559 444.0046 244.165] /Subtype /Link /A << /S /GoTo /D (help) >> >> endobj 782 0 obj << /D [780 0 R /XYZ 90 720 null] >> endobj 779 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F67 89 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 788 0 obj << /Length 3318 /Filter /FlateDecode >> stream xÚµZKsãÆ¾ï¯Påʵœ`ž¼''v»;‡½9>`EHBL4H®vJ~{ú5€Rò!¥*˜gO?¿î¡¾)àOßÔÅMi­ª]YÞÜíÞÒüó-ok±žùãû7ø³×7ºPuQë›÷÷‹EÞo~\ýé±ÙßêÕ±½]ëÕx»¶Ö®Â—·kçÜêèø{ôªo¶Üÿ÷ávmÊÕæ[ê>@ƒ7Ú­tánzÿÝ›oÞ'ª¼1/ÑC2„›3ÂCå”¶ÎáwûE·y‡›žÕ—*…-püW<ø€äñ8]ÿ M{ ¾ZµwØÕAÏý箇‡t[|q+lkv8¨åžá~1®öÝÝ-¬ô3þ#¾l¸ý¡hž2[G:×F+¯kKäþõC×­¬‹ïï˜ x“ÆžN Ç[k«´/X ÷Û¡‘_\—¶Ï¦9fZ§œ‘™°ÑÛbÕô¹ÙB¹¢ªel±Ty SàɘqÇ[öw¨d?c›#6ðÕOZK?,ÃP@#——.€µš"_ÓÚ' hð>zêËQÂ@Lqnæûpå†è%ÈJ…˶Tµ†xÙŠÖÖ“OÏPä4ò,¼äULå¢þ&ï‘;_­*x—‘B3 š l&Dw·vuEÈÂ땸×SËŸàùkÂO6˜Õ®mú÷õ?÷¬"]ôÌØÆNâÀsö(Z‘: uóÛAâª"D;Ù?ÁÁuÛ^pöthG†$é-Šže¾â¬KJn­_9ÿ{ë õ2‚¢ÐØF¬tŒÍòÜAH¼DŽ•4lÛÆÕååî4†1‹…=Q÷‡#w,¹2A2·jdD³@­&°E öÛ>‚´¨ë¸sH8n~h—0*áø9gßÚ[€i>šë‡-shå§VÎCá)V`á%K‡®­«ò 1v ”$ð)º¤»Ó±ÝäŒq…òÁ_—ÛñØ~:lj_Æ—×'f&OÉúŽJ™0yAÒüêÂ4ÜQ¯@˜SÔÎg&.?C˜øÉ /Y„‰lÖÕ¤3¾&ÖÍ­›'Ü»£œ>½|¡DN°rùPãlX, . ­ŸÌ'õ)NŽ<©áA3’RÒ‡:”Õ a°.—?æ}lPº®Ìrƒ­&ä3ä_Ϙ©S›ÄZn|Ô JÕ€)„aò§ÜžC6kB8€Q.tŽÚ°7Iü`ør3Æ)S–×€[­Œua†¹p÷æÂ†ö—dãyÐUÖþõG1LýŠc˜è6´ ¢¨VWª°néj%¶!kµN ^ÙŽà%%_üõ\u±ù ÐÈÔ~Ö…[]ŒÐFô½ÒnKöðº˜6å¬ v¨£ŠË’d¼0òû¯×»ö)ưþ!ÇÉâÕŽ pL]G‘‰Êê(Ž=©YEœ,¾©ÁY—¾žlf_D&àçJ"Ô9¤=ûåñކvݲ½*ê”·]8ë!Ø!«%žã…ìO+çjÌG1J—×¢X»yh4?G£öå0†3/MË1œ óAUe}Ž~{y¢àÇ$ùàX†£þ“{ɲ°‚,&$Ôy-Ø9U„"dƒ$ Ž"ë<}¦8üÕŒz¢×qÊÕò»8[˜°ß Èü¬_b9,VÖ3•gÃņL Å~ÉaÀ Ò„PSs¶sÏóâ!häqxÅ´oîÛR¤4U¹ô2¸Š+³iV+ Ä¡zÊÚ¼v;°€Â/#$Ò‘"$~̳Ðö0fÐgî6 J®L …Îã#uOE+©t'kfÊUŠ8¸¢C³OE”?dóI °¡ —ª®,æ‘)~%ÿ_ÄÙ ÜÊCÞtf¨—Â$8@ï’[ª^&ƒ·&]AaRN}¢š —‚ñùk‹ÑßvL§@|ª“ˆÙ`拉ôu–ÿá)(â ŠØÚ·„è ªØQË3=B ÅD5O -¤Ã€¯ ºxÏ„Ëß÷_CÛ;Ékа'AÌ9Ȩ1¥ÒïE?Y*7Q$ífe0غáÇT5`ÂúvOÜí’÷9ÄX>Ð-Í_ø[9TŽfµºöþº{UWé.áZ)am]¥¬­M.Þ¼\SøäçÌ,°È‡GáL1·'©²ž—Xaž¹œª k'°€£7-îÓ·üuehӋܦŤÆ!pÄúö’CÇe8ËŽxì)àÝéò:F€ÑeìÛNÐ ‚¨ ”4!ú0E˜eÅ2Dl”Ý}þ²Â*[§kƒk(¿@õûü¥¸KS'à 3 KfL™AyáRÆ Z.œ]&lNŒ]”Ÿº»d~A²àr  ¡ó\åÚy•ª³÷— ¹uõYÑ ÷£ëÙˆÊÃüÆ·M\8Ï‘âì Ç–³ëF\ä †³ñ5&Žgº»¬]•˜æ¢–!W¸ªKºkÄ^ 8î92Çæä#ñ¯Ûñ"2²Î\/WU-ÍËU¸-?v¸çiK¢Þ‹ýز¼€ÃJðo!ü¦Pµö¥¡ÒU×/%k“-ýêWâý8ˆŠÂ‰*¼“\0z ÕuàEõ‹ºÏ¯jÊYý f¤ yŸJXž <&ý]{V߯‚%t¥ÜšŠÐÏÁùTƒ.c«Ëׯ Rnv©uÁ¬Ó¸¥ò¸ÚðQ8yaxG¾ÄÑ:FÛ4nYÝ0áÚྴÑ×íÓã˜s¬—(û#Kft<=&Q=rKÛL_—JßL©\ªÒ= I\üRö÷ %gÜ™ í_QB›ÄÆŸvìDŸz ãyo¾. ð*Å/±‚ü gߟ‡Óýõúà¤l5Spå,2[sUŸ‹ëYc« !/È—Ò¹?ÑfK³¡Ïõtÿ}|z\ {Ù„tÏöÊ3ÎâžqÓo‡ð}Oþý‘ÏNãpzxä“3…Ž~øËßÄ¿`šRÕgmG\E%¢T|{JO®€é앨·îvÝQh½ô5†{݇:åMò¡©ebì+¹"ÈRœ¢©#µâôÚ‡dFqê2ðUæYàƒÙøÒ N”+ly-âÅt+^ÚÎKçïä>4á^æó|©Š¿Ó‹×Å»!!kÎ7[‡úо.+CX¼JIšÜ3/­Ecä‚ùlÝ—e´Ž¿X{²oõ[“¿MRθ(îÿ¼âç- ˜ùádû©Ùí1/“š#^Eºë±‘~4Bü f†/üôÆLŠ;ËÄè4Ÿ†„¼k‚o¿{ñL‡“üL5þ«¥$Àú¤J˜ÅíP§EGî3L׳ÍÕ5êÕi¹€¨¯S¥7g¿ÒËŸ….—ݰéÚŸ³öêã †q»ÉW ^ׄW3EÅßàþ¹L¯ endstream endobj 787 0 obj << /Type /Page /Contents 788 0 R /Resources 786 0 R /MediaBox [0 0 612 792] /Parent 778 0 R >> endobj 789 0 obj << /D [787 0 R /XYZ 90 720 null] >> endobj 786 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 792 0 obj << /Length 3534 /Filter /FlateDecode >> stream xÚ•]oÜ6ò=¿Â—{ˆ de‘¢D©yÊ¥m"ר‹+îä]zWg­´'iíø~ýÍ)íZnZÁRäp8œïZ]$ðO]”É…MÓ¸4Ö^¬÷/™¾{¡d´ˆÕäo×/®¾ÏÔ…Jâ2)ÕÅõí ’ëÍçèÝ®:\ªht—+õ—«4M£ü›Ë•1&ú¾øµUÃëï.WÚF›#L6´<ÀD¦•‰T’]þvýËï®U™Ö_£A×g„ç…‰Uj2"¼nG¦æ¾~$ØÒÂÏ>¿±ÕqjJ'á¶m}©‹ÈÅi’Fãîàx\ã7î ~騻Å_àÌÎñÄ¡^ãÎ;ÚŽ—Þ0À}˜è#aäáü d8"³‚l#Àt_ïëQH|ÓET?KˆìZÁGÇGÁhD\¬”‰­)­*U–°° Â«§&j]%ò®x‚OíG÷%>ž`•Ù8ODYÄ&±Å©\ýYÿö†1Í&Û%‘L˜fÄ]ÃýŽÕ:¶yâÅçE¬²Øh+ Ur¨½@Ež™‹¦¦¹fæHꆤ1-f,ú<€h±¸Í4¿«™Õ‚ŒáÍ$cÀ±$c OÜÒEl‹øwDÓ"V…5ži9]ö”0[­PÊ–¤Œ,eUø£¿&e¥ó¸0J~/ P«Ø‚0Ìèšf`äH‡<ð÷¾"™¡ÒmƒµÈ¶‡É„œ¿ƒ@ÔãèÚ“í¯êÁk{çê\ÝO4¡0Q ;Ó<ú€Ê©’è¡nС%eT5l Éz TtCÌu íjP‡žážêäS£Ú«‚ì>ï/³ Pž£ìe_öíéªU;4Âp'À4eÑz®Áxε¹ƒ†½K~ÕZ1ºb"î”ñ8qÊxÖ4p56·Ưޢ®‘ æüèoœgù™'}ÞÿATôö¸«ÚMãþ!ànI ¹¢Š\€=™#Ƈup0LØçOŸ`åýGþú¾n.…LÈU´?t®³ßcFKIwCG¬Ù?Wh€ø‘¥çUÖÄe^Ø SZð–Æ¬ºL^ˆS†l¤Ö†”—É?Üzd˜><ú4ôœ˜LdÂý—,çÉ;0•ÔŒH¢·²5çî vº/žÃÆ BÕ¨UÔQ&jâÝkþ–„¦oð»уwòÅ õn½»Ã³)ÓYr3¹D0¦ ›n·]*=ØPÞÒCZAJ¦3 ÌÌ)°Ú7›Ž{FàԒ;2üŽûÝEx”Bˆkis…n¤Ñ1PV†&Nx@W„ß|]/‡î\ï^=! õž˜ŸÇŽðüÄ—›1‚û&Éé)"‘»öUßA¬Ä@‚êÿ˃÷}YÙú{ô\=wäô<‡•']Ô$·|(¢ ¦í™;Áú(7SN‡Hå ƒû¤<5ë’>‡|µØ€ßÔ>Ĭر3³n(Žç²1Eq¼=BQÿ»ZSû‡–)Nâ`+qN8OsR~ò‚ࣛÉÉ™ÃqÖ0“òHc²PÚÚ×ÜR­FÔ œú¡Û‘W]¸è§€jÐ3Ðq|-Í/TŒ›©Ê •9ÃY¯`ßn6®ÃÃW8úSfuã oH#A=’0çsDsšiƒeië“Dˆ†è¹­´x2ßùG ¹“ßK‹<ïÞ5wõbB©e¢CF)ý.{»=O ƔѿSØ<¶*ñ)á_ÿ²xTÈ™ñéß+ÄV°Lè‡ux-; ›AsÅy¬BŠ3ò¦¦–ú¸Ò?γ œÄÏ>#¦ ´ÐñïôØLíbÅø»ÔÑÚqðŒ›‡¨TrþŽ'FPW”º£´Êl™«ª‡2Èü¡v‹ ³†aQN|MË<äžÕþ ¦ªvr­xÚÞûŽíÎg°gç½ÃÅIÊ`à—cBÕnežL ¡å#üBüA0i)oS0)YÂ+ÙGí(øº½6Ó wÎÂŽ-t•gÀÌÜœEâ©3ÖÏZeþ}ðê8ôW ÿ‡4‚®nèÁà ™ib'TGe¶{±Ä‰Wð±†òF2Ýà«åέ›ì£$ÝÃÉsÙy,Ç%T˜í¢¸“Xggý;LKܾÃ4wµáŠ _’èåOøž°Ê  Ì·{é§IKh6°Cäù\K ³óTžéÛŽ»ð¼µ^pÔ–‹,ê¬Mâ$Oò?­³ˆ=¼Vy†Ÿ¼qøçw5½v‹î¬aŠs¿üøáóÇJÐæ—¢–ý¸[~H¶ù«´ì€žðÞð«ã_êVáàåmÝ8wïÚñ%Oܸ¦{à!Zþîª{Ý»jƒö2Bòµ ;øÛ5XÁâøaçZÀÚ/7!…»Ì8Â…¿Õ}U7ÕM#ø¸ðÃÑ0Rú-¸¡Ü£hHã[_þDm¡bæj†‰ìPŒþò¿CV¸], ýAv€œzpÃ)oêvÝ7B±Ü’¨º¡ÇQüjÝ|¸×½˜ÖNyžª—[7/OFYÈÌÎ-]j鯔œµº—?yQ&"Ó&¬³vo{þ÷giEV^Øÿh¥ôO ¡*½(ã4÷¢w·/þ1ÄžÕ endstream endobj 791 0 obj << /Type /Page /Contents 792 0 R /Resources 790 0 R /MediaBox [0 0 612 792] /Parent 778 0 R /Annots [ 794 0 R 795 0 R 796 0 R ] >> endobj 794 0 obj << /Type /Annot /Border [0 0 0] /Rect [413.3913 507.8278 522 518.7369] /Subtype /Link /A << /S /GoTo /D (OOGL File Formats) >> >> endobj 795 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 494.6771 174.9687 505.5862] /Subtype /Link /A << /S /GoTo /D (OOGL File Formats) >> >> endobj 796 0 obj << /Type /Annot /Border [0 0 0] /Rect [220.2937 494.6771 349.3707 505.5862] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 793 0 obj << /D [791 0 R /XYZ 90 720 null] >> endobj 797 0 obj << /D [791 0 R /XYZ 90 376.2145 null] >> endobj 790 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 800 0 obj << /Length 1207 /Filter /FlateDecode >> stream xÚWÝo«6ï_º=©0¾Bµ½¬7:éªW·Ñ•¦Þ<8`ßÎŒišUýßgðq”ÐuÊ'Øççs~çË Ã‘?dDŽº®yahÄù…¯·$Kî°Ú[~_\ürë#9väDÈX¤EòhÞlðn‚LA&2ùÄr]× ®'–çyæ\.<ëd8SëŸÙÄš†fRÉ—Y³\Êþy&r‚ÉrñçÅ|q´ÊŸNß³»Þ2`ø´m8B3;Œ"ßfž\ÏoÌÿi"•}“‚)IÄ™•rJŠ$;¨7/¯ê¹â8&¥]›'Oµ¦í:ÈkPvœÅj'8)YNĆë®þK£‰íùòp ¹6òE"MaË㚈RÉ¥Hh¡ÄŒd©Ä_ÕÃé`ºžíî´‹¹«ZH„s%_Îïo•Ä íºÜy¥dòL…´Û¶íKí¦‚ Èz¹yo žøÚÕQ/9Y—ÕJÁ[8ËÀîï2ß_ûñsí"XX/½\ž<ÿ8*:ƒúú*$Ãàt$U‚𜕘$ °´C\·–¢Ja÷£<8!ÏoŒs–#ÖÜOl 7X¦%P¦ „ý†Æò¤ßÇ,Ïå>XÍ5¶,4ɸyê VqÂ!]¤D®F Òɪ¡q¹%³&,¢dß3°AWâV2Pv9L°ÀI#g™=dA¹§"Þ ‘ÙbÙY¾_4ÞÊŽÔ»§êÍ êu(¦ï%Í4·äðVq¬@¬ÁðÚí+n›ñ[J²>k@Ùemø¥î=åŽ%bN9ˇÂ"“£ÂÙõ™7¤Ô•ybäæþþ맇¿Ô¿?æ÷Ÿï>¬ßÔcÖªÇX»ƒExÞÞÕz>½s±Ä:YÐIiZêfEbYžÉ±ƒ.'ŒîÚºwjR »³ôˆ M˜áœš N×{Î*–°j•gôïŠÔ¾ÙÃÀ#§u þMû̸œXÀå¡$ï:×T~{/Q„¦3eYÆöõXêX?’“Ñ›nØNäFzÊzv4“™É—Ndpb¤­‘«•¬¶ÖØÜu}_ÖDèi×CWºŽùºÊO\c®½Ý‘˜¦”$u×òC_f…Ž{ŒÁû9—ÄáLjìÏ’k ª–[D)(I–^CÓìi 3\gU»žòGÍÛÌ:î8Íå~"׃¦ŠcQa€GðšÖ×3.FQø®éûz 8 ¦ÄqÅy¢‘Ün· Èlšt]ysö\©­¹cTwæšñ6-Mo(I,¨¾ô´†>'Ò`ÓêL­S1n`Ïf~dLCÏv\™èÝŠAN¿Z´‚ÕÖ«–iàÚ.šv½ÿvÖ{9ýy¾êNh\ƸœŸE#Éš| ëö,V*oHcš_ºšX³ßnÕÇwóûÑ@qÝš9YŽ¥‡‘NÄÓb(§ÝŽ{²`¸Ž±Ýc2Zö®ò`÷µüähr¸> endobj 801 0 obj << /D [799 0 R /XYZ 90 720 null] >> endobj 798 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 804 0 obj << /Length 1007 /Filter /FlateDecode >> stream xÚ¥WmoÛ6þž_¡&*#ŠÔÛ€íú®Å°Ea`2e$Ú,‰)Ûqƒü÷-R‘VNQäƒ)Þ=Ç{yîÈ`LJ?줾‚RÇNV]ùz{}…õÊ o¨òûìêöÏ;ØG©Ÿbg¶812ËïÜ÷+ÖL±Ûò©‡]9õ!nôËÔ£”º@ð`$Ø­YÙÉÿS/ˆÝ|›åQ¬`# 0u±O糿®>Ìz¯Â ¸ä÷AÅâx0t!u¢„"Lhxô^ñv èÐÝÝï]YÔ9è>&M‘­»e2?¸§y˜ úñ)œ_€§ãðÅ8ö{|!âcrÄßtÒ/¼R[’\mÊö]÷‘‰zËe[ÔËî›z™¨QóZk¯D%–¼æb£ºFF Ñ­ˆ§–ñzQ££€¦)‚†¦P¥ x›"êàHî,U3 oˆ+NI0>MÞΖ»‡ý7½OÆS¯wü¡‘ã†üùíd7nlÿjcø²±o¯6\6¦ë{=1híêDŸr}ŠŽŽèbÑ '¦=~ûUçâIKŽ0B‰HpéhX`?ôÝ'M7`º;Û³Zy²Eõì—é»7گǧŸqŒçKnË´9ÅŸ{vžÛcˆ^Ãâ,ÿL ‹¾SozËÿà„F%¯—íJ±ØÎoÉÜ[Šôð£Rzº€ G(ƈ†0_í9 )H<œ_ŸØ¶QL­y®‡¢ÐþÖ¢-EÆÚBÔÝŽÐÉkW\éh%ÓÍÀ·0Þ”ž€;#ŒÈ݊׶@nz›Ýb£¸v ©ªŒ[ƒ3×|¯Ì°</¹¨¶×>-%kVE¦•w@!±SÈ6Ò)2=›Y—ŽÐd8ÆuÂŒ³DwQ,Kq¸gj%S0ü3i »¢ÍVV¶oûûÏ_žGOí@«ô<¸þ#W2nçžeë-È‹¶åááG6¾yÖqQÿûŒø£PMÉtX÷SkÌL q^}¸x[)tVóRójúHËeUÔ¦rÀQyΤó+7¤ÈâÈ üI¿êÊ5 oˆ²]¹pÕÆi:8Q¦Á0!;¦™¬Z£> endobj 805 0 obj << /D [803 0 R /XYZ 90 720 null] >> endobj 802 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 808 0 obj << /Length 887 /Filter /FlateDecode >> stream xÚVIÛ6¾Ï¯pÜd bD-^‚$‡“ Es \ @›-Qcf$Ò )ÛÓ`þ{)ñQ[ØLP†É·|üÞBãEd>x±‹›$A»t³YäõMÛ÷7¤Ðh„c•·û›ï3¼ÀÚE;¼Ø—'ûâ¯àÝ‘œV8Ðtâ@®Â$I‚õËU˜¦ipk®îœTöü“X…ñ&(³YuÇÊld1NmW_ö¿ÝÜî{TY?…»UñÇÀ1Þ¢Ín—-Ö³¹M¶ü_VÆ8 ~¤°’8|¥ZX¹”¢‰œ— âá,²·?I‘[Êxhmsm×ßJNjú‹Îc”fi6õÀJPyÞØÅ³×öw¹œ8HR”¬“x¡Ñ ´ÿŽ²èŽŠšjù`·ô‘ñ;+¾²?6ŒÑÄËé…Öc>ÞÕHzNªFªF›àÓcÊ“ʙы]IšSv¦ª—g>jG”.L¬N)ôrðhϼ?:çÉΜƓ[6¬‚´+VŸ*À½l•Vd\SY’œödÅk”D8»ÙÁ°¦J‘;XI‰•rѸ0wø}ÔŠhT}tô‘p°áŽâ>½qýÕÇ;¸ì\ Æ…ðY¾z@‡j–hC‚þ¬´2ÅÍŸªåâäj^õ¼o˜F?À×WÐ’4X×¢}`¼0 •RˆžP%5Ñ,'Uõ€¦)JºH#²P­ Âê™H6ÜÚœ øÃ +4Ô^šyûžä÷#¯žÚ(eßͨœ¶ÿß(ë¨DÕÔâ{6OL;i^.Ÿ@5øR¬pFKíƒ:æ¨DÔ•ˆ‡%;¢žŠÂ«ÏT7’¿qSÒ;ŠÇ“u>)Æ<Œ/ñßCãÖáøãc_¼Œ³¶3ÐÔ ÍÞw½¥ …j§t;œ—ЙG UMÜ‘ÃÀzÊUä-;S.ôÜóc&'ãnþ’bÈä· ˆG_ëð“)ÞÝ”TìÒ‚á=²Vš¡-6¯ò¤^Ú—ª›­TÒvçÄ\N’Õ&й{¨Ú¯¯èüN$¹ŒHâÞC·ž½o\hV2ZÌ“0¼'ã]¹$(S"ôÿBÙz‘ˆs0ÅgÝwË{ú ¯~æ?¢ 9eù#ê¸õIK€î¥â‚SgÝþû‘´Û endstream endobj 807 0 obj << /Type /Page /Contents 808 0 R /Resources 806 0 R /MediaBox [0 0 612 792] /Parent 810 0 R >> endobj 809 0 obj << /D [807 0 R /XYZ 90 720 null] >> endobj 806 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 813 0 obj << /Length 2988 /Filter /FlateDecode >> stream xÚµZ[oܸ~ϯ0ÒÑ‘,^DJ»EÖØ)š"@܇E6À*3²GÈŒäJOÜbûÛ{.¤F’9NR´à¡È#òð\¾sQÄE ÿÄE‘^X¥’B[{±Þ?KÝôçgÂb ˆ§$?]?»|•‰ ‘&EZˆ‹ë›Ù&×›ÑÕ¶¼[‰h¨V±ˆºU¬”ŠÌ«Xký _üŠˆšrÇëoÛU,m´9À䎖{˜È¤Ð‘H‹ÕÇë¿<ûùzä*“òk|#I€q9e\ˆ<±E‘]˜\'BéŒØÿOƒMb¡‘¥|§?¬`Ç,zµ;ô[-ÿVMè*ßVíþ¾®ŽüÔU몾¯zG¿­û$´õÍiÏ~Ø´‡ÁI“¨T(":îÝ.õ°s‡%üó¯÷åþÎÏU ÛŽ„ŠOûvsØU¿Ï÷Ó´ß¾¿ešçW»zýÙ1\ßnÿê¡w{Ö»\WÞm뵻αn6íñ9î}ùÊ‚Xu¢´‘(ÖX:±Æ²HT^ät¢IP«Þ6¬n%#dÖDošMIÊÝŽ~†Ú†˜›аH„ÌY:× [ÜPE=ÙÎz¨á=˜`…»[Û¶+™GG~Z^¯›~ ñ¡t/Ñ&_àˆ-µY![üâ-560ÅÜã©-ÿ>àí7YÓ-ÌJÑ=­Æ¿îÍzàßc=laÇÚ‘¿CZ? 1æz[¡ÑISD¥ øÆ‘Žà —8û°b‡²)]ë†ç@êp5ð:·ÿø[žüXÈÓ¥ÉOWćQ’øP:­é©Ö`ãDh%á2x‡»®†ÝïKâ¡ ©Y™$Â:ú%OÈ']À݈$XþÁQì=Å ]Pž±J³Ädºðr5tÚ‘,Hj9¨+3QYïÊO;6Y,¿ÂNäÇmÕT¤Ýªã™É²ºCÃQ¯¨këñå Y‰Ú.°íºtïd AÙ*™%©Ì…“UO'ªöAÑfIn¬9'Z8|-ŒÑ¶åà$gÒ$/2;·H’>ZµÒ!™ÓÀp`Æ3dÿkLG·Ìƺ„¢Ï •lˆ&'0pgH…ÜZ-<çëÂDc@(/çNÖzy³£¸)K‹©. Š^¦IjÒ'u Ũ>O¢Ç-?qjÂ\÷U€Õ†gØ“ÇìÌiÍÉå†Ë²–©]Øç/«\q!n¹w¡*»”ÜŠKüå Ô#b4oÈÚTbLÊÚâà0Šð'êøé·Ðé…Ûɽíüû2{£LŠ¢ð†þ‚·Å@Á1™8©cIaØÍs˜öPXu±C_ 6$d±¨(ÊšÊy&jS©¦\A6Ѥ¤Ì”+Œ * ´¨I !áÞUàà|ÂPïÝâ¤S>› ’exÁ¤å½g§z±f¸PHÉìlHwTñ”,ýæ›…mÈeÆ·øóW>4¹d’˜ÇñŸ%eÎ_úèÇqé Ž u¨ÕæÈèW™–ܸʴoÚ¹š—°Úúô‡L;Ó"z}õW^š†$ÒnBЂdk×6teV×îvþø26Lô®®Ü.ÔìÔgªliâˆ|ÿûòóG–4ã$ 6^†;ïÊ/yí<ò@@4Å…„ÊÅØTœ-']<% –Ë Ï5ú-ÿ|e}t|ž*…•‚x„“ØæSi6ã6T)xº¯qûxCF“@/Ò—qÓ3=É=÷c‡š:KÖ,»ØÜÉ™¶°ý ßÑСÄåvjM+nµ(õ¸Õ"íCŸšÊ5–ñ÷û[n§æ³7°£ëÅ9;ím¶c;Í[ínÇFíjoÿá!MŒ”,Y*Ö2(A®ºŠZcÚdTKÁfŽ1|\{Q:.°3:œ¾ˆ¬„·±Çì%fbc( y¨{Ÿ¤ÀpÔȬ8¥9xü˜:>ëØý-t”†À“šâ¿; u‡;s=ú±w­Cœ@üEJ‡•Ðè~ôš!ÎÜp@ ¹2`m¾ èyŸÃá¸÷‹-¥\Núk‡¬”›i£XwŽšqÖo0dÈéqVmà‹þve,2!!…Ú¬øæoœ/áÉHñFc#ػ˂A,ƒÑs=SRgcWü©þ$ÂýØŸ„Kö•Ï)È ”…”r¸ ¼…*’TŒiÂDëÁjÊBéšé'EKµõp ƒŸ°¢‡sý ˜ø“‚.Èmžlme£_à¸n8Zð×J§G\`$“>ª÷.ˆÏiôf˜Ðùú×m½ìšjaÎtM)ÕÑ 1Âq9é§ecaèb•ýؘóxéÓßÑçǸuæ2Ó/Vþ£Óô+×)±™I ìÖÈÓÖ÷>ùÒzÞBS»•ûÐtCd2i*)d éþC‚ô!óÝ m9dB ²Ætœ…k]8°^M6;+3HISýޕ֫r‘X^¦08%ÜÚëk€ZÝMc<\ãÅ]­n\ߥH&s9W{ uyá4…w±³Ûõ—ºz÷÷?AQ„¨|Ò÷À4¨ë§õÐvX­¾»G]õÄñ9Ô‡¹õB;{,D£Æïs/æ‰Ý·~¥U¼M|þ¾Âµß endstream endobj 812 0 obj << /Type /Page /Contents 813 0 R /Resources 811 0 R /MediaBox [0 0 612 792] /Parent 810 0 R /Annots [ 816 0 R 817 0 R 818 0 R 819 0 R ] >> endobj 816 0 obj << /Type /Annot /Border [0 0 0] /Rect [201.9237 432.5405 396.5525 443.4496] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 817 0 obj << /Type /Annot /Border [0 0 0] /Rect [393.09 328.5306 522 339.4397] /Subtype /Link /A << /S /GoTo /D (Customization) >> >> endobj 818 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 315.986 126.7695 325.6829] /Subtype /Link /A << /S /GoTo /D (Customization) >> >> endobj 819 0 obj << /Type /Annot /Border [0 0 0] /Rect [207.1819 271.9428 336.5305 282.8519] /Subtype /Link /A << /S /GoTo /D (GCL) >> >> endobj 814 0 obj << /D [812 0 R /XYZ 90 720 null] >> endobj 702 0 obj << /D [812 0 R /XYZ 90 589.3566 null] >> endobj 815 0 obj << /D [812 0 R /XYZ 90 505.1764 null] >> endobj 820 0 obj << /D [812 0 R /XYZ 90 261.9802 null] >> endobj 811 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R /F54 117 0 R /F67 89 0 R >> /ProcSet [ /PDF /Text ] >> endobj 823 0 obj << /Length 727 /Filter /FlateDecode >> stream xÚ…UËn›@Ýû+XTÊP•é<é®­Ò¨•ºó®­THb'ßû;E–Ì0sçžsï ?•ÖÊàŠ"¹Ú­TܾYé¸ÊÀ";6ù²^}üæu¢• *èd}}d]ÿ_7Õj17i¦Å˜fÖZ‘J3çœ8‡ƒûåD‹®ÚòùÏ>ÍL!ê[ØÜÒñÞh'´VéŸõÕùú€Êón4y ¸VŽ]’—Një<¡ÿ|=†»qVÌ›fÂ×_˜>–HÛ`;×hÅç]³çÅk*k"gôØÀF»­9|5 T{Sʈ™a{àRmªK6™Û+ €¬¡+;ö´Ñ­ï"œ6ÀbÕ»ãêmQJ°nPÀëìNèÊl°Ò+k“L[©½b¹/QÈ>…J÷¤ÛAöŠþŸN\4ý.¨w`Ú’Áþlz ”ÖNZ]†TÅ\¼€ÆYx§£áPu‹j[NÝ5÷3'ŸÛ]ƒ+/.DSŠ»¥ÂƒvbÓËïdšù<ëE«è=.ÞÕÔw14³³‡ò!f?ÞÄX-\9'Uñ„4r¬fŠýQ"RÞ¶Ï€¢)ærΣ¼&˜ñÿɺŽF8}¼F,jnãi/GýµåÅócð¿‘osÂw®¥7aQFþIWöþ%ur#C8ôÖçø­´;žoÂÚÅçœÆ½WòçÐ>ÆÛõõí+Mê”TAùCb’À™R†<§ÔÈÓØ5sê>¤¥A(ñ»Çà¬M=¯ÆfG,R'Ç\.2Ôܘ‹¸Há öeµ‹÷†¡™0š'“z^êöÐ]W€å!æFçš×èJiºúIÎ*¢ #®TÓðô!'Å¿KÀ×/a²–/1\L'-¹·4Še­ylX¸Ž€…$¶µ.Þ`عO:t: ³vì_ñƒ¸zö9Ë7à?Æl™Ž endstream endobj 822 0 obj << /Type /Page /Contents 823 0 R /Resources 821 0 R /MediaBox [0 0 612 792] /Parent 810 0 R >> endobj 824 0 obj << /D [822 0 R /XYZ 90 720 null] >> endobj 821 0 obj << /Font << /F51 9 0 R /F54 117 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 827 0 obj << /Length 3680 /Filter /FlateDecode >> stream xÚ­ÉŽãÆõÞ_!äD#šµp³†3±c wíl‰Ýb†e’šîF~>o«bQ¢fÀ k}ûVT«~jU&«Ü˜¸´y¾Úîéþp§¤µ›pÊ_ïï¾ü>U+•ÄeRªÕýãl“ûÝ/ÑÛ}uZ«h¬×õë1&Ê¿Zo¬µÑoß}Å=ãæÔ؆޺;¬u}l¸OEÏ<é-¶»Ã¡:î¸ã]u„)Oçê §Ù,Ë#¥Ôú·ûï¾»÷P§Z/œrX®W*µJ­ –6VƦ„X¾Þ¤™v8äp@ò”0ú˜ñ¶ƒŽÃþ˜ (<Á;¡p_Rè­óب² 3á°5td’«¸Mçbcx=®uÕ ¾§Q÷È϶NÜú/Olâ:èàà‚òÕ×¶‡¦;ÎwñÇ<¬®?ð˯IšÈ„Š{7Yh«ƒ‡Ò g+žu¨«£À\àP‡ÓMç ë4‹ªöì(9 •,ÊÄ*MXÆD“š¨zƒÏ2z€§Uå ƒ‹lêp’c4Ÿóq;ƸÍ#ÌL“”©3šŸ‘¼"È*zåζ94c½ŽÒà%)PC—næ±ã±îÀøcw%Ç6ÔÔhkž"ìQޏ[˜kbMäãõˆ)àý÷‘ xÒxs ^¹«ÂH‰äR™t û»žçÔ"Dþ¡y¥îm t6."â “Š6 árÜž™ZØ‘Ÿ^ûa‡®ß¹™t¾‰žš‰î¨ïoæ„Ȉ}å6ñVf„÷=^*~œqÝS_ˆÂ ÙjC -ÓFwc4°ÂuÝÈíáŒô9Ñx‡ûË]P ìhª‡v²oÀ÷ˆ§y¹Ã3¿&ÊâX#œ ceÁÔc$ranב—Và”XAóL¦Õ…&>Ñ?Y™,ú¶ëþX¡-å±ÈÉPƒ ÓÑ}SIæg1†•ÓqÒQÛ4†£EÇŸ`±Ó4m¶¬X›%ä6¶%°‚)Ø"{åy𪉖O8C£XÑÞW • ˆJô…!gk ÀÖtWȼ„Öœêkæ ä×y\r…6ؾÌC¿:pO_ç‰]fd¥Êâ*®¤ˆÑˆ¤ðª‰Yð²9¢o=‡ñêH™^µíÀ'!Á¤÷¹Y‘•Áç=;4‘[˜sv\Íïã¾n;G ¨w>è ¼j‰_¾'o'GýRNm½(›üQèúb‚äCÓJR¿f‚¤' Ç¿ÕborÓÜfs†JI¬›,îÿ€Éõ{rÄuâÌ‚¨ ΖD’)ÀÏŽWòIÐð~ªŽR̰©’ªÉZ-IÆp34/¹æÝ’è¤*N¬U":ãzÐÌÀ:á¥d¶ÎÛ­T&ølN%/OÈñ€Ä9‡cÓ.ª‡Ž“ÒCá@L«†B…¾þKC%KA#GòÓåÞб­œÇîæÑ OIÎJPmæ‚OE‰5ÎÎF]V 8-|>nT.-!Kxr¾da¶/a(‰QvAn-;v¬îýsÃQ0)ô¾ö! ̪„ÇØöÀ„)‚bx%ßð@(ví0CdÁ®Žýy*º¸ÌÕ«vpa›.rç©Ê ÖÏKä¤â†KÕU pxåý¶]?[ßwRñì®ë‘o¹‹MwßTd㓤H8sûnYª!ôÎl-KƲÌÉå»[Ò ªªJ}Å#¼>–¥Bm/Rh² LFq‘Í´ÍWÅ`–RBTJTZó 5>ƒ xÎRI ËÅÈs¦òèkG~ëŧ”t€H¿“.®=ªb©nÃ< q@‘éžD°„pw*ðèÁV^œ[ ÆÎ².VÚþ~Äò±SrhìXf¶}C÷œmàÂÌTA­BÒPìd=ðE±uã™2¡çÅf—ysú8U;ÕTeºÊÈgjª´8”XÖÜÄ:5"=Y¬!ŹÎ|½òÝ8ר"ûÔV …Y ›]uƒÈlt惃Rú˜pdl´ E ¹âXIËósë¨Óœpª¸xå‹Ý\醎À¥«[·O*HÌä|oƒoœú0EŠÂ!Ù,™ºzì]• Þ´Å¿×i’DÕ¡î«Aú«“¸ª¯Ž[?7äòVP±n^ ‡žYr•:t@ˆlÿSÝ@4N‚dy”F ÜÉ`ã²G§Ô5w¼‡Aæ sC:¸v;Õ—å©2YéRÇZgËH #4pqãNY¾qô3oAî-?~™€…·ïW•ϵÇýJþ~C,Š$:±¼ÀºÔ\•Ù ÈÜpç!¨ ÷Œ~ÞçpºÞ“/àXAîë½ VÿŽrÙH*áB^`¯;™©D°”ÙævO-n˜òÝNp53ØæLf3çk%¹y#åˆÒáÞÃì¼ÛçXòáìY±cµyvr8î]mØiœ‹±]É$ŒÖùÖÇÙ’~)±Jú¥¸'dgœÞ¾-¹ç+¿ÄÝì‘i¾¨¦jR&˜YõO—‘L…ð£6· ÛZ7tA0–+…VS]䨕”Èå‰r¹}M&ì$äªÏôq…|ûÁ©šd®‚ZâA”Ž•r¬ܸ#ž†Uóë‚)äI6Ÿ¹&íÍR¼ŠAïôœ¤YyQ¹&zH&¹w¤à[Û c¢ÂB¤< \ ù˜*ímæý Á…ŸÆÊØLO_©oã05ǯ½"…ßÇüæbRƒÕ£]ªJù‚<<ð×pÿÄcjù43n|þMüæÚ´«dV0ümÿDQÑa¶³É³è}¥òST7>¯Se¬ta‚øÐ`ÓNÚô‘¤æ¯€]Ô²Œšê`³lqÇ+©Šb’0SìúåOv¸´ÏzõßÕrœ’ƒPQRQˆ§h1(…WA.œ9,Å Ééüž ‚¹SÄeúE¦%$«’§Þø%K@’瑪+ê9Sp)ÿUæ+k!ÇÖ%˜"lÉtÄ.Aûy®mQ endstream endobj 826 0 obj << /Type /Page /Contents 827 0 R /Resources 825 0 R /MediaBox [0 0 612 792] /Parent 810 0 R /Annots [ 829 0 R ] >> endobj 829 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 289.4992 289.9023 300.4083] /Subtype /Link /A << /S /GoTo /D (OOGL File Formats) >> >> endobj 828 0 obj << /D [826 0 R /XYZ 90 720 null] >> endobj 207 0 obj << /D [826 0 R /XYZ 90 720 null] >> endobj 830 0 obj << /D [826 0 R /XYZ 90 159.3913 null] >> endobj 825 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F54 117 0 R /F14 131 0 R /F3 134 0 R /F52 12 0 R /F67 89 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 833 0 obj << /Length 2162 /Filter /FlateDecode >> stream xÚÕÛnÛ6ô½_ì¥2Ps"uo‡k°‚uúÐm€"Ó¶VYò$:žÿ~çBêâ(ƒbÀ?H"yîWË+~ò*ó¯’ Y˜$WÅî•o—?¿’öm Ë1Èû»WßþÉ+é‹ÌÏäÕÝzrÉÝê“w½Í÷ é½XJ¯],ƒ ð’·‹e†ÞÍõí[^1[€Ñø«ºÙ-Tâ=”¼&½#]ã{³ÛåõŠnó@6‡|ƒ`a'ž”jñûÝϯ~¼ë©Ž”zŽ/yÌXœœ1§¡AcE¾[–+Dv.‚(±ï+¸áÊŽÙZ6êXH%{ØÙûd ddžD•¾´u"Z»\±MÃbÊùFÝæ‚±Lù[f±H“ôj)SJéxðñOå}øps˸ DùÇ"ò}ï¢ÕW÷‹%h™ˆ.Êß|åžÔ|SÏ“é03~FlÀfþ_Ú@ŠI¦=-ÒлX'x}…VÈ_<{kµ‘zš€âG… ‰ËÔ ¿ °¢BŸÅyiKrb^=¢8ËÝ˸i wz²ç}â¦å'ÛҮטý2Œï½&ób­’:†7Û¦ÓŒâ´Y4‡Ñ=½js£ß ôQìå ‹ø—d>G¾¦ÖNýé·V@j, jË›¶ZŽHEÞñüµo¿7þ—¤=!e^‰¦‚…Š}uÌFЬ­‰ÒîÔT^ws¤Ï{£ÉÛ6ÏÛBGwWltÆÉÈ÷æØŒ¼?Ýrï?Õi‡¿~ó#ß*Úk§t€¼€rïtmtû•„ôQ/TÖg=é-‰šµ{Û5ÈÃC¹Á6¬Ÿ¾/%ŸåŽqþRèòÎŒB²v&¡-/V“C(ûÓK ‚BÞ¿A™Óõå­›âÐ=¯çÂe.›8Ýq«[çL‡¶sçÂ-š$æ/»LgÇLËlèõo*}ø•£/²×¼ªP¨pNVÍnjhÚ4ÝK0‚}½á¹ _GVz*cãýôvaß6¦1§½¾Ø¨Ö,Eí(>¢Ž–1¨× f|Úä¾'w$¯-8ÇCuK½!çÅw·H•etISUŽe½™«FâD$*J¿Xd"R~àÂß·É« {… )ÅÜ%UÞà¤@%@ƒÒYQRνˆ.9¹ÛŒÞÑó ±PæpL°èõœŠ•’"’YhiÝ—Åç9†°‹#W^a©?w—/Ò@9 c[šY€4‰$’©\yQaYúäå#=$|º™ÂBIeíâNI%²+Ž‚ÁÉwSßc¹ú²ãϪ¤¬©ÅåÞw¨ËÝvúy_wÈUìÃ)¤˜‘*`؃õ~Hܨ(Cn „Úò§ÙÚ >b5 "E+´Gªr³¥Ù15€x¨÷^F…ދ˳ËPùÞõ¹¿ž+×(£*±•!%ø6¯»5ig,UzwÄ1ð=w5fÒðÞ»V‡û°ªrYl,­–£ˆ²}šµÈçì_—FèNWXÆÉÔ÷¾™S]ˆ„:VË\7Ά°ÇòD_R“H?~œ&öêYìà*qv#x p·H°³Š­­çÖ(s—²\'3J]¶˜'(LE,“><¢dæCNÊxÒ5dÇUæ‹8=óÜ¡{àLŽR4øvz‡QSº5þÒ¸G¥|uüBmܸu¡Ek †}^æja•¦xW¢kþ¦€Aoˆ²áú.ª†»œÚ}Ìœ¸ö -꺉¥¿ciìû¾ì3Q¸rË”2(ï‘\ǃð¶¥Ì]}T?žõŒéri1Ÿ†À6.÷}[î@î—WX´±ÝÍæ)â0KžK]‰PQä<«©1„¨ž[cåx÷¹+^ç9HSÄîh'$$D&!b&wB̲!ycþX‘.Hd¸×:–ÞŽÏ5k6jðŒ ({:ÙÒ5Îý²q½K¥ÙH+üëý`aO¿sC3Î:O¤™àd„$£;à9`¤¸ í,o¸AÞÏ‚[,š+æ÷•;·Âx’%Þ ¢2ò-ÝxIk±¹ugÄ‹US]þuVî1¾Ÿì¹ýH+5Ù(}s)…4z O‚÷Ã97ÂtˆÁ: ¼š›I–u—Ó\&áþ¶ói[ªTøC´nšïÔ÷s†„"ˆÑ"ARQy?ÚÌc‘õ}S6™W½T+É•=õ Åð»…$‘ðõÈd¬DEÙYAö¸Íòc¶?Aä ¯ŒÃgÑ#(꺞R–öÌÏg2IGã @ˆ’= §Èn—Ñ00ãû¸hOpÀÈQvØIÑ=fðÐiËQî0[i…H’,JkßO“ìÐôo8¤b @ý9˜›\“·+ÞzTùâ9§ã.yBÍVê°?/ð˜´×ñFΟ7×·|Š$%xåýr zâžóAëð¶zÎiZ}蜖U a`=þû€Vj~Nª•rŽÏ•®´±w0@à{ÒçGu6VÄCÜ5¥vÞ°¥üIC*í³¯wSçtÜ·“Ó]ïó/˜hwbøN׿âÖêÁ2ºÑ\‰Šb›â¥IU'Ï®xÒ[¡˜V••™L¼Ÿ°A£5ŸAc¿b1lÉM\àÅ•^PˆØÖsé5ÊDËhPþúP¶Çi7ÒQ7Š×„ýøOÎ:´”ðîZç7ìNA"!fÑYÝOÓœª)üÄ]AôÌ׎~ÒC‘frà;s‰ ßp¼ Åäd—&µÁâæ/ •³ÃC2™£F!×¶Ï/Š…ÊT2Ü£ž¾'ëïÌ—¡M¨0à‡b ‘nÖ0e®=ì숋«6ü?î ~äy endstream endobj 832 0 obj << /Type /Page /Contents 833 0 R /Resources 831 0 R /MediaBox [0 0 612 792] /Parent 810 0 R >> endobj 834 0 obj << /D [832 0 R /XYZ 90 720 null] >> endobj 831 0 obj << /Font << /F51 9 0 R /F67 89 0 R /F55 27 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 837 0 obj << /Length 1606 /Filter /FlateDecode >> stream xÚÍXmoÛ6þž_á~“·ŠßD±otŠb-Ú|æƒg˱0ÛÊd»i€þøÝñHK²˜8R`Qäéx/Ï=<š2øã#›Œ”Ì*cFÓÕIæ§ÿ9á~”‚DÚùýâä·?4ñŒÙÌòÑż§äbv™œ-&7cžlËqÊ“fœJ)óbœ*¥’ó³÷/hf»™Ç0[Ö«±0É׊æxrKBg8®W«ÉzFï'k¹ÞM®QLå¹I8—ã«‹w'o/öVk!Žù…"CÇrsàX^(Æ¥Òαm3Yoæu³Âý£  ˳ ”rɸÎ(Õ†«á)’Îß“#ê›òqhœKôtP?ÙVõšVaÜTß`šÑž}Óý¦B°LÂmº~J;¿d:ûÓë]=F1-3ÑD¿F·bFá%8hâßîU' +LaLÝDÎT.m?„·ÕzVß>¾ìHÜPl:«Ç¢ 4«ds3NåàÓêKÆÕ” ÝîqŤÊE?½R0‘gd›aø½§:—POø‚{|*çeƒïåzZÒÔù®Â‰YÙê—,gP?”¶ÈYamO±ûÏIý³Xª2Š•1¹ûìÙ„‰b³¹[ƒÓÂ&w+š§¬Åö*ÓF^ÏfQ.—±íDÁr™s/ƈk>—å!1ˆ"gY¡Š‘†ˆjn]åƒ&·Üa‡½\ÚŒpßP!𹜶4L0Î ½\:®Àßçä:2¥#3|á’Z¬¤a™V¦gq„ÏörÇ,*¤Eð‘J”"ND6ĉ ï Õýv€lHŸW±¼¦AÆC‰¬@vxEzû×ÇOœ¢‚CáÊý±töÉ•ØB»k<5ÈLÀÈ]7¡Áœlñ¨Äµ¶¾ñ3Ê<†œèÁv€`{@°C Ø‘¬—•ÃC,u-¨y&€(ýÎ „`=4•ú郥ÞÒø©?ï¦Ô½_ýP–Ï«¯†Ò1°Mêu™¢ Kð¡Z—4¹ ! ÓfÜN¯Vn£wGKóxwÁsÉ„¡oð¶ÆÌT†Ju @ÇYí6Zµ¼oá-÷Ûº¨OéhWèÂŒ0ûç—£­¯ÊÄ?oÉ,g©CPe6׺ŒL'Íló,×Ð¥ŠCW¶ÜÔƒFIpf°ñB÷5JA.í Æ¥Â^£¤85JFÒørU7%´JØ]=ÇpËäÆe-æbpå“V2iUÏÞH›ÄŽ™;PçÓ÷ÁäÀqéRëÍ™vo©hý"°Œ³ÿ%eE(È¢•EêËjƒ”.L‘¬'«Ò ñ˜Ï;|1®_Áõ"k‡E°­n–´ #là ½2¸öLñJ½h/.€Üw—ŸÆ`W0£ ï4ñ¨yBhâ‘ï_as¾Ìzý«Î™VÚŒ/ •‡Z‹i/—vcýë@aH0’V¾²®øm-PÔ/ûºò4zã;q ˆ%}¼Û8ÓL ®îØ^.í :OúœkAÜÀÅ%ãC¶Í=Ûž>²³:õ|ë),°mœ^â9 p·iÌŒ#3:š™áñ'³œ3Áó¹Ì2™ëpÑ¿­–³ Öölãz0|lÓè8ôg rœ-ó:ü’È«¶@9³;‡ÒA ÌqXè=×Ç~ü`Eö¥­®!Ñ’nÀ„JÈ‹5ò /þ^ŒÇœ*þj<,)»p®±1Ëðø÷qsK»‚1n(Œ^b‘›Ý™~ÀÍÝʉs3 <pìÚ#ç wÌà¡Âûï°¢JïëlÌñN÷ûãï°ß¾Fëý'}håp0Ëâ‰)Wõl·,Óf·Žn*˜µVvñŒÙùÀ endstream endobj 836 0 obj << /Type /Page /Contents 837 0 R /Resources 835 0 R /MediaBox [0 0 612 792] /Parent 810 0 R /Annots [ 841 0 R 845 0 R 846 0 R 847 0 R 849 0 R ] >> endobj 841 0 obj << /Type /Annot /Border [0 0 0] /Rect [286.0848 529.7925 437.0547 540.7015] /Subtype /Link /A << /S /GoTo /D (shell) >> >> endobj 845 0 obj << /Type /Annot /Border [0 0 0] /Rect [221.7758 228.9955 393.394 239.9046] /Subtype /Link /A << /S /GoTo /D (morehelp) >> >> endobj 846 0 obj << /Type /Annot /Border [0 0 0] /Rect [456.5457 216.4509 522 226.1479] /Subtype /Link /A << /S /GoTo /D (help) >> >> endobj 847 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 202.6942 222.1457 213.6032] /Subtype /Link /A << /S /GoTo /D (help) >> >> endobj 849 0 obj << /Type /Annot /Border [0 0 0] /Rect [210.1154 127.4949 378.0247 138.404] /Subtype /Link /A << /S /GoTo /D (morehelp) >> >> endobj 838 0 obj << /D [836 0 R /XYZ 90 720 null] >> endobj 839 0 obj << /D [836 0 R /XYZ 90 595.3155 null] >> endobj 840 0 obj << /D [836 0 R /XYZ 90 569.5413 null] >> endobj 842 0 obj << /D [836 0 R /XYZ 90 517.9162 null] >> endobj 843 0 obj << /D [836 0 R /XYZ 90 443.323 null] >> endobj 844 0 obj << /D [836 0 R /XYZ 90 368.1238 null] >> endobj 785 0 obj << /D [836 0 R /XYZ 90 292.9245 null] >> endobj 848 0 obj << /D [836 0 R /XYZ 90 190.8179 null] >> endobj 850 0 obj << /D [836 0 R /XYZ 90 115.6186 null] >> endobj 835 0 obj << /Font << /F51 9 0 R /F67 89 0 R /F52 12 0 R /F72 6 0 R /F84 684 0 R >> /ProcSet [ /PDF /Text ] >> endobj 853 0 obj << /Length 1830 /Filter /FlateDecode >> stream xÚ½X[oÛ6~ï¯0úR ¨8’º·OišÒuè2t@Úa²-ÛZl) ä8úãw.¤¬$J›ÛÀbŽx9×ï;”šHøS“\NÒ0y”¦“Ùæ™´âógÊŽ˜ §¼9}öûXM”¹ÌÕätqc“Óù™w¸*.|åu¥(ÏøA†^úÊ¢(òŽO^±¤[ÁœÇ -›¯Sï²b™òv<éÇÍfSÔsœ5LYn‹%N‹’$õ”Šü/§?=;:íµŽµþž]8å®a©ž¨PH°Ì–d‘Pa“a©@u4ýf~'¡W¬×x8¸D]NÓRD2 iágKœI&,Áز3× Tví wÆ©H¤í@Kö©)»­ËëÖçâ#òÖ ªZÔ§cy³À§öêbC~l‡bV—¨¾GEì”)X{¹tM‹†ê,ò~kK>®K'ûsÌìPåB«,ûÙålÕ°ÝÎ °nô3oX9tÍ7Ü£S­ì/l2Ù3. fPíë ‚r΄3L° ~¬«¶cvS"Ku£L$yß ã T°kœÛi÷ØFHŒñ~/}ÿ^Ù`/ð›ÜÇqlëX‹0 í’nl×Lè(µªo9¥ø5@t·N€ñy\cÇe©€ŠpWWë±U ®SÎÜ—°i¬ð°Òì*ÄkjÏô`Ž10£¶:Wýü?èÔñ|L#‘f*»?•´ y4>xæÒ]KCµ^áï¼|h¢Â—¥1Õ¼ä„=kê¯ÍbñåQ‰úk¹.gä&,bc÷¡¼Uï¼~dø5µ7„A$. u%´EÉShÜ0aš5áƒôÚUC°5çy θÄ{º`î:#Ù³r tŒ^ –íjþ§e"ï*j,P@·z\B£ï†Oqýõ-^`n×àVíBXg³¶[˜%ªÏ¬Ãæµ/- a~× {³­éóf挄‘ײSqs@¾'BšRœBÓbæC1ãϬY“×Í“֞Úƶ¨‡ïƒß²ŽYtÌ7̦Îu¸6)QIÈ•s i¶è#‹¯œ&ØÅ9-O6øö-¼|=ª•%³ï£) Û þN÷éiZ«áh‡¹ƒ •66ðV{Òn7ÐN=58úfp–TÚ`ø< òÞK.•‡Ç‰üË7Ôøß×Ù»OŽ~>xô¸º§¾6L÷ŽãeÅåˆnI¥çN„7EË"Ž+ (®™GÊa¥ÍYL!L,Ø>ƒTðkºÓ¼A€#²Ähéõ¨úN¤ËmÛÙ]PI±Â6%µ2ÇþÔ¶†XŸ K¸%)b:D‡!`Ì…D;‘nâx•Qš¤ŽÏ¡×-ÚÑͬåࢠuÂÄ;àEï9t¼’û0Á¸r(ÄმšŸý,iœ®s†Là&Á•£¥É­Ìøäç1ç-ãhS¯¯q¤½]…ˆˆ²cØõ„‡ÔDàÛRÀ::¶–þ‹UåX¯ViBÞ[ÐOˆLJ×<>JljÐ(Ïs"¨6Ôë=ö*wM`mð²„OÍ/ݺ™~È:‰„̒йƒ‹ûn¢3ÅÈ <¦Gkb |Ú†~}÷||‹²±ä} pé9¡§­C{‹ÅÖ®¥àÿ3ˆ."(Ú²{a—Ψ×2ö˜Q©^À•abYf»'×e"Rðþ·½UE}¿DÌzPè—be1­C®ms‘yVZPÊÌÈEôa¥˜ºÅðÖyý•éŠ>K Õž”¡$m!¸–]÷’_Òõž«.L* o:LP۳˿í|áî8ËÊzªìfOåŒÐrÆ›&ÇUðhJŸ6´È±éñч“ÔoQ…mðû’€v&`ˆ¦\¼bоÅñ°ŽÞ|Í/>òã˜_¿±8oìqÌ°ûàm|Sí¤c;J»#süHM<™ñ£±èÍMƒÝc‚kv#±;».Û¯uóȾ¾°uÅ@«/GðO" ¼aû=#là >îѸ¡l˜q¯+Þ«u÷ƒf‹<ŠúpD ×”)¸G‡ÐÆ€UL¬>ß1ð$@á±/hQ,²0wÄVY«µPy’ìï›üM-É„ uÓ ÜnχoÔ/"[ží¿”U¶MäƒÔüw=B÷‰õ—žQª endstream endobj 852 0 obj << /Type /Page /Contents 853 0 R /Resources 851 0 R /MediaBox [0 0 612 792] /Parent 862 0 R >> endobj 854 0 obj << /D [852 0 R /XYZ 90 720 null] >> endobj 855 0 obj << /D [852 0 R /XYZ 90 720 null] >> endobj 856 0 obj << /D [852 0 R /XYZ 90 531.2332 null] >> endobj 857 0 obj << /D [852 0 R /XYZ 90 463.1692 null] >> endobj 858 0 obj << /D [852 0 R /XYZ 90 390.8626 null] >> endobj 859 0 obj << /D [852 0 R /XYZ 90 333.828 null] >> endobj 860 0 obj << /D [852 0 R /XYZ 90 211.04 null] >> endobj 861 0 obj << /D [852 0 R /XYZ 90 142.976 null] >> endobj 851 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 865 0 obj << /Length 1984 /Filter /FlateDecode >> stream xÚµXmoÜ6þž_áoÑâ"(‘¢”\?¤9·pá^€ÄE{I]@Ù¥mÕZÉ´v^þ{ç…”´»tÖ®0२ápæ™w‰£þÄQé4 ©õÑrý,¶Û×Ï„]…@ÎI¾={öÏï”8qTÄ…8:»Øbr¶ú¼¹*o"Ì"A·Ó4 ôËE(¥ ¾sú’w†+ 1¸†]Ó®‰n+ÞÁ½Áu»^—ÍŠ7NËH.7å%’É,Ójq~öóã³Qj•$‡ôB’}Åtr$Ò(ͬbY.#‘JEŠéÅIè?\ª, –åM‡ÿKàIæð€Ié$ct~U ‡LWZ_ÿžü›qøÇï^Ÿ°¬¶V:Êâ!…Š™áû›EØ™%JP]<÷À-–ÁªJ^]´e§æìtò$$³± žke©4st¯|¬²(Ubbt R¼Cy^{ÕˆÅxoÕ£*°²öCW‘y÷²º…‡ª¹ä·`~ú}ûö{Ø>ešåo Ç€Jç!.¹Å%D9·<ŽÒ<ÙA°ú5Øe9 ¶ XY¦"8Á½ àTÈ iñWM6/}Pˆ8Ò ®/Àª"­FÔÌU?ôÈ÷ÊŸÕÀ·!>t+‡“ r0«WH¨& ˆbê dìÍŒÙpe˜ˆn`LZ„yÅÛeçRü_¨m„.7kÓ,͹#Dt‘ZŠõŠ˜•5]—¯$üÿ¶ëj‰ÝkÞ\™‹rSãq+³³£Cw¦lX¡Гm’à½1»‘/z"„H–ˆ¨PŠBP§×³ðéÂ9¡'¹í3¤˜3KR™ÔQå‚áKÁøz¼Í˜ÕBv1먈Øù N7”Ñp%’½|–¨"°ÐG°Ï!9<ÔFºpNèÑjŸ! ±—n'ÁPdŽi’GBär?f¾\®À‚)¦ò/%Å|')â©;Of¼7ýÿšö‰™±D—½gnwW‚À–£Öþ6íÀ‹]×ëy›¢êÝÔ¶}âlËb¡3vtË]ï«f.ü+ŸîI.¢…åÀÍ|%18Uîrä…•›ÃÈo¨T‘DûŽâ© ü×A¼À@žËÂRüyÇ//þë…·ˆÒÂIòÙ+Š‘TR>Z–GØ(² Q¦¢BÀÁ-?8þ ´æª¦0/9‘¸ò2ÆMèH°ØøtY”ë|ˆê_ÇåsíörãŠÏzØ™kçŸ}ÜÓ,’•¨­Sha.¡<1•¹z@™Ný¥z{ëugz3<­Xó‘Ygò¤âûŽ£„9ÈYcf³Lj k‰¶J¿¿]8e½1þÞe¼öA( E÷hÍm“wzòþìIêvfØ E«Ò˜AamGÅ®·X˜Ú°mÜxD½ÏÅtóWê›ÄVßÕ£õ]ýúÖvÔ£nŸðuY5flˆ§&»3ë–>äŒ3;}鱓 bgKÙGjç,ò€aX`gÑWÃ(,Œ5M¼À2â ÿ®‹jÝ.¯¡Ï¢ÑÙt £&g *®—„s7: L—PÓ×›­œ'y©Æ!½mV=½É¨‹DýUë¦ <ë°ÇCÔ;Òn?@u"¯|nw–¶[¢q®y‚ÎE¼wøï ÒBZÝL±†9Í?HtáœÐ3rî3ܤs†C» óóÇ~D”êÀL‹<¸>§¦KØÉéE晴B} o™K癜GºCjì3äÉúNý8S™ öâœ#ÝA9ö> gáà¬qõ”Ý,(æÀ+ŒD¢bïÛ*ÔÑ"+ô!DGºCšì3|ø[„LÓ>±O#횢ÛÂGFûü[óɾ;9=¶£ëÛŸÎðéü+êfIã¸oëÄÁö˜æ²„ªd×®ùÁÞ(‚W|‚ó@3žï Œ³±uáïw®+Åóã×Aûí³m\ò6ö:TÒD—•Î ”î=dÏxÆ*ÜuÕ08¶ÍvÍÇ|^Oï\Gçm© )­\Ÿì ç­Û¬ì÷²~Xµ›…pÕâ)âï@*rnü9ÎÝÖ endstream endobj 864 0 obj << /Type /Page /Contents 865 0 R /Resources 863 0 R /MediaBox [0 0 612 792] /Parent 862 0 R /Annots [ 867 0 R 868 0 R 875 0 R 876 0 R ] >> endobj 867 0 obj << /Type /Annot /Border [0 0 0] /Rect [456.3502 619.8345 522 629.5315] /Subtype /Link /A << /S /GoTo /D (new-camera) >> >> endobj 868 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 606.0778 258.5397 616.9869] /Subtype /Link /A << /S /GoTo /D (new-camera) >> >> endobj 875 0 obj << /Type /Annot /Border [0 0 0] /Rect [147.6002 156.3496 316.0909 167.2587] /Subtype /Link /A << /S /GoTo /D (set-clock) >> >> endobj 876 0 obj << /Type /Annot /Border [0 0 0] /Rect [342.6001 156.3496 518.9697 167.2587] /Subtype /Link /A << /S /GoTo /D (sleep-until) >> >> endobj 866 0 obj << /D [864 0 R /XYZ 90 720 null] >> endobj 869 0 obj << /D [864 0 R /XYZ 90 592.9033 null] >> endobj 870 0 obj << /D [864 0 R /XYZ 90 529.2106 null] >> endobj 871 0 obj << /D [864 0 R /XYZ 90 399.1583 null] >> endobj 872 0 obj << /D [864 0 R /XYZ 90 337.8898 null] >> endobj 873 0 obj << /D [864 0 R /XYZ 90 273.894 null] >> endobj 874 0 obj << /D [864 0 R /XYZ 90 207.777 null] >> endobj 877 0 obj << /D [864 0 R /XYZ 90 143.1751 null] >> endobj 863 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 883 0 obj << /Length 1724 /Filter /FlateDecode >> stream xÚ¥XKoÛF¾ûWèH¡%Ë%wùHO‰.Rõ`=8.@“+‰ Å5HÊrÚô¿wKŠ’DvaÀ\ÎÎÎÎã›%f>ü‰YêÏâ0ôRdz|sá[òç aW.p¸c–w·?ý¢ÄLø^ê§bv»<r[Ü9—ëìq.œNÏ]á4s7 C'~3w¥”·Ëo˜Ò­Gã¨ÚlæAì<•LÎŽ™.qm6›¬.˜ð1«eµÍVÈ&£(v„ˆæ÷·¿^¼¿´VAð=»åÔ°8˜‰ÐóÁ2kX”HO„R‘a±‡êü?œ»* ÜàÛã<ÎTœŒî O¨ˆE|ò•Ÿ›Ç/lÍÝõÕ={à®Î6úv…ràa{‘ïƒÂ œP¾u³y,u Ç#߯ÐÓ<€VÊùKwÆÐÿ*urÔ®àÀŒPt®—Ìw}ÅÏÒ ¬MÇ[6Ï…èÐá¼üä Ù‡©€Åx"vJ{€%À m»ÝX&ÚèUzè…!W—¡6L§sÑvôØØÌbvAᤠÂÒW £ ͼWúm òHkQñÄÑd=b u×h,ƒ4¦“°aƒÒȺ Ë.˜uÇç ;×vÑÎeGÛµÝRŽYNYx}åqÐÑçQ"/ãôƒÒbpÛàkkèᶘ|dq…ÿ«sa¹m@‚ÛveUõð\ܾ “7ºkÑEûôb ! Rg ž! 3?à8›2o yQç¦.¬ˆ%FÒrîP\™c‘Xór/n¡õ‚cÀÜ ù¶=µc"Ašw‘µyÂV †ŸMíUÙv èDÀ0˜´¨“© ÄO½b—ñ…H©*K¥l3ùe8ÇúC6ǪS9F5Ó̧¹ UÛ} Ý QÛçÝjë`Žý-èìl[!tÎAcr F5 Æ+ã®$r\¯_ÇnWvùúÿáQ†é€G\Ù¬ÎíÛn¸JW2LlÚýW¸w‚+$Ri×P³˜Bh¡ƒž™ÚKûB¦ð¥†·ŽÁGD€Û׃U”Ô9˜˜ºˆ¼xWØ xÍ -åP*1øí:‡:X¾†”Ý0<”uŒÄîµE1b$¬bôë3AWèJwÚæëÕ‹ v¥í]{gvc$Øi(ÿs®|ÿ 3Ãy­`"ùbk4%Z~¶¹enýðþ÷ß\@‹ÅË g!©Â)°³M*wdÛß%¢7q$Ì:[Ám¨[Þ‚G ”ùN5¾S(é¥aš€þxÛ‡÷ÀʺN)¨¼@ö¬%©ƒ¢ ß³x^°nì÷vͨüÇ5Y ù\Ã(~£É³àH ‰qتó.ª ¬³ÇQZѸckîu]S>i˱Ašx‘Rá,Ä)’§T°–¶G“ìÀçŽ'æôS\"ó®4X¡ÒÐa×>¯ïÞ~CqðÜ=°y¤9-Qñ±þ2QžŠEr ÿÄ$>ð}OÿS¨¿Õd‡z‡ŠSÆ/":ŒÓ&ûl‹4C°¯D}]ÌዃlÆi?<ÌCk¸6à(úºÊ”Œ“”1X·%}@ÔggìFã™ÚvÄÅkú¡’ŠJ‘’X™³Â’újŒëö1Ëírt%Xö'î°“ULz*õ®¬Wh­Ǥð 5¨ÜêÈÄŸ"Õä°Ÿo«Œ¦'ScßN F6šQí˶íû¾­ÍƬt­ÍÖÂ2°iðPYg':BEDûX#+‡"ÝSˆ€LM™÷éU™Ð­\L…Ož dh«Ñ“Aòb˜H-‡ÀP>S\{Pq’—‰óxƈüÄù}Ñá(•$Üúy™5«ý÷—Ì¿|pÀÐѶõP˜ìg)<÷ßKMc3> endobj 890 0 obj << /Type /Annot /Border [0 0 0] /Rect [298.6553 331.206 485.5718 342.115] /Subtype /Link /A << /S /GoTo /D (Appearances) >> >> endobj 894 0 obj << /Type /Annot /Border [0 0 0] /Rect [405.6032 91.7477 522 102.6568] /Subtype /Link /A << /S /GoTo /D (redraw) >> >> endobj 895 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 79.2031 189.4184 88.3546] /Subtype /Link /A << /S /GoTo /D (redraw) >> >> endobj 884 0 obj << /D [882 0 R /XYZ 90 720 null] >> endobj 885 0 obj << /D [882 0 R /XYZ 90 720 null] >> endobj 886 0 obj << /D [882 0 R /XYZ 90 610.4919 null] >> endobj 887 0 obj << /D [882 0 R /XYZ 90 532.9348 null] >> endobj 888 0 obj << /D [882 0 R /XYZ 90 457.499 null] >> endobj 889 0 obj << /D [882 0 R /XYZ 90 395.2138 null] >> endobj 891 0 obj << /D [882 0 R /XYZ 90 308.7485 null] >> endobj 892 0 obj << /D [882 0 R /XYZ 90 204.8901 null] >> endobj 893 0 obj << /D [882 0 R /XYZ 90 142.6049 null] >> endobj 881 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 899 0 obj << /Length 2063 /Filter /FlateDecode >> stream xÚ¥XKoÛ8¾çWäV¨´"E‰Rzê¦Ùni 4YìmŠ¥ØBlÉ«Güû)K¶’Æ-ÄÔpHÎó›!Å©â4ñOux‰Òút¾>ñ ùþD˜‘ îå÷›“ßþÅ©ð½ÄOÄéÍÝh“›ì‹s¾L73á´ùÌN=sƒ pôÙÌUJ9ïÏ/ϘÒ.'Ç1Pój=“Úù^0M8[f:Çqµ^§eƄ˴–E—.ME‘v„гo7\ÜôR‡RþH/d9TLËSx>hf‹bå‰@…¤˜öPIÿ1sÃ(p²nŸw 2®HöÅ#É¡‘ÀŒ"ñâH$´ÕW?ôa©]ÖÀ·0ËF¶ µù>ˆ b‰Ðg¿ëÀ|,X%”`K4d8+4`ƒ3-ª;æ˜wumm[Îdâ´«GæHçmñ}&cÇl±$ £LüÝVüÛ´Y…ç¶ ~èÎͲ0w@ípÑœ.ª’Ï´óE‰Û·»ãaûô®dïÒqóY œeõB¯æóeÅ2xžw”[ÿAëóF…¢O¦\ A¬—Ð4@õ,mS¡“ö×4S¬BFDޝ¾PÀ‘:¡ŽH´—…I‚¹“¢{Z‚9™Œ¥“ȹnkòØ¢áCÒÚè°uŽ'YW a®V@~|ƒ±” „Åxp¥x‘ÁØ2ùæކ܌AF—IÂÇá ÿ> #']uih†3±ÃAÍcÈ–¢æ¡åÏÍN$o^‚Z*·;æªsŠìÜä‰Ùæ®в›Ó/ø€! ‡Á'"œô¨uº~=å¥=)ÃØX—BiÂ2Ô ÃÕì² Ns4Ð/Á Žk:õ•a)J¤u”Ì¢Ÿ€µÞ ñ£Û`²h šö\X¨F†êW ûNTF‰¶ G$]…&Û–œŒLì‹´fP¶v-‹ÃŸ˜F-®{DjAÆO1^³¨v˜ÂÑ»¹^lt̸%}|˜ôÁ éר¯x_‘ëÝ9c;HýBXW°–Ö¥õQ0pŽ+£ß HRÅsÐú·E¾e*•Ú á>Û©ÅaUî,ÉQ9(È,RQKØ.ë\Ä•æn)hÈ}Œ¬õÏ‚©zÆ®YŽˆTæGš5ËïŠÒ`ýÕÛlŒë?/./ÝóO?¾½z÷s üŽå1f$%wÁçC_‹"Ÿ«¯1Fîj·`®pI)œ×¼Ûg–ÝMKæ¸6§¥ƒÞ °-—Dšì£ÈÓÞu§°gßÙJF“Nvµô¡¼ŽkàèÍ c²,N4ôñ3¤jä”?ÿ¾úð/«* ¸Z1u^‘ ט'ÄÝ.Ñ61Ù&TÔE$\«û¾6·­‘‚ô€Ô€ÌˆùóKŸ;¹Ýšzªo0aâl¨ãEæ‰~Wa—˱ MoÏ÷#T{¾ “± ÜžA¹ÈІ#Ì ”ï)ê±ëæÝ®J3Àcȃ É d}¦ lÿY_€6Ù³p?7™M¤•é:? Y°›PÐ,õ=ŒŸ©K§ú yM5¤àÊ?Øò©‚ʶd¼ íôíS‹Ôe³/‹ÝÍôÐ8YYabih›ºšÄì-€C Z÷ýTÍp^BZ#Æá¨h±Á5uÇà†Ô”hŠp>ÿëªa/‡$s¿5øðûJˆ1–Û«n=¡8qa±ò¦Ân{žŽmÚ«¾§7ñn&GÚ?*6Hž P©…2gQwh®KÍ^«ÓÃít^ˆÄ÷b-¢gÊpôLbMƒ®, ôãj1¬5ëúr|Tb|έC»Úvõ¡v.[þ-° #¶òý\@"7ÈW˜õTäèrñáE:`ÈsY¢-WãŠv¼AY#qÉцw‘àyðu1• ”‰ÊÄ)pSáA “xiFip\”üÛ'š †ÙØ0%5Û‚yÔ7 ¦3åÍL*)ó,€ƒÛq‰7«Í•h$Å8¯Yæ«É;Ì®tgì-º€76æé¦”ü¯MÁ²ý~öå}©9cŽ|B/ýƒVŒ.³­Î¥õ¢!ÉM6½ø^0‘8ú™ÄÙ¤ Óqù‚K~5A”wáhÙ[º®ÆLoll ±¸ÑDø#©iD59óaYFÂáÝJ²Å‘sUµù ýˆ­ç„¯p­œOÅOß4›åÎPê¼í((ž ½¥› [~t¶ýG'{é¦G*<ó5KzµZ™Í¶uºáf;ýšU)óÏñe‚Ϫ˜’÷ù[ýr½ˆžŒ†§""a\ðõ:?lc#ßÓ±€µJ{:„Mžhc-Ÿ;dœjc6·±øª m¬’?¾4}˜ºäûQ_×*ŒK-,Ãû+÷¶â"ðz[-½(òÇzMõ¶–ïGznȆ† ¶›>ÙnÆÏ€ŽãM\Af9¸Ê*çíç÷×Ç^g?wCÀ`´û¶³äÏÑïw‚á6eì=Ìc+~Î+†˜´0Õuбõ7?qpóãŠËPlLßR¹¬˜wˆ„BúEË$£‹x"öP  Š3]^qÍøJõÊìÔ´|FZg¼Éðý > Ãצ÷ÖLH¶‚ðCŒkõ2 #ê endstream endobj 898 0 obj << /Type /Page /Contents 899 0 R /Resources 897 0 R /MediaBox [0 0 612 792] /Parent 862 0 R /Annots [ 904 0 R 908 0 R ] >> endobj 904 0 obj << /Type /Annot /Border [0 0 0] /Rect [299.2487 403.2866 484.1827 414.1957] /Subtype /Link /A << /S /GoTo /D (emodule-run) >> >> endobj 908 0 obj << /Type /Annot /Border [0 0 0] /Rect [260.7811 145.0279 472.6601 155.9369] /Subtype /Link /A << /S /GoTo /D (set-emodule-path) >> >> endobj 900 0 obj << /D [898 0 R /XYZ 90 720 null] >> endobj 901 0 obj << /D [898 0 R /XYZ 90 720 null] >> endobj 902 0 obj << /D [898 0 R /XYZ 90 628.4052 null] >> endobj 903 0 obj << /D [898 0 R /XYZ 90 532.9458 null] >> endobj 220 0 obj << /D [898 0 R /XYZ 90 477.5445 null] >> endobj 905 0 obj << /D [898 0 R /XYZ 90 385.4184 null] >> endobj 906 0 obj << /D [898 0 R /XYZ 90 301.5945 null] >> endobj 907 0 obj << /D [898 0 R /XYZ 90 219.2857 null] >> endobj 897 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 912 0 obj << /Length 2148 /Filter /FlateDecode >> stream xÚ¥XKoÛF¾çWAÑP@HsÉå+í%u×E\¶z(’hi-¦¸*IY1Úþ÷Îc—"#&¶S°Èáìì¼çÛþÄ$ó'Iz™L’É|ýÌ7äÛgÂ<¹ÀáöY~™=;z‰‰ð½ÌÏÄdv32[|pŽWùf*œVM]áÔS7 C'y5u¥”Îéñ»WLiWÀ£ð¨J¯§AâÜLÎŽ™ŽñY¯×yµ`»¼–å6_"›ŒãÄ"~šýöìdÖiÁCv!ËC† ™x±ï“8•žeDæUA¢SU¦ÎèðFª §ÁçŸàK9µj6S7H]Ù/ªÁE™óÑü]V·ì® é‰ÓjúѲTU¾Vh"èôõ ¤ô@µ,BÅ\Ã3°!ò’ l'Xp^+~`uª)¨×2ÅîÝô\k2`±R©^4¸ÓÄ "ß“B$W„žˆ|Ó² òb&£Ä)*L‡mëMÝT$ÎÌÈ•‘Ù}eƒ^–¼ ïJ–Ð0;:ŠU5¹%œMmW·Êp_#Ç=¯8ºÆ8¡ßº½^§4sÍ,Ê[ÍÎŽ.È0hP­¸qM»ÌÛBcDä’¹Ù,1lìBf(~Ù6ÄžÀ<`¥¤±^ÖùšßwV¯bމµbáÌE[P1a€Š]PàyÛeSÍ’np‰y&›7Û–¥ÝÔÚìÖ®Ô˜­ª×E•—\es½-©à²)µuŠ:m+æÙ¤Ë«±Ä”¾Dvˆ=ßc›{¾ZëŶTnBœ{½­7µñQ~þ1 4ÉewLîÙ VYæTºå‡¼¬U¾¸çöO !c6|“ðw9¹Z›Ò 2ªø~7bHà"¿¦„gâç¯qÕñ¯³?ߟ°xLLüı6‹[jí† 2Ñu¿F#’€–Ò’$„ô7ù`Ø[J¸M5á@òF°Ã™©2DmrÁÏ¥ÝЦ̩­"K¥è¹-ÈÝ‚ Nj³ÔòÐ]jÇ y½×¼Ö£ÐbÌºÝ ü ŸSö>>R¡ð¹¨Œö´¤+uúD- oUcL—Aì—HïWj^ªÍ®9ÿ`ÖÁbræ’I”z]h^pAIÆ{‘ÛôàŽYwMI„¢JnìØ“qd+r`C‚lL®– SlÌék±¤"ĵW@?;ýõ÷üŠm™~-ƒíKúÎÛiRý3æÝ¬ÝaBiÔæöå˜)ûÖ #_ìÃÄ !ò}nxwøO†T£‡ªŠuÉ$p2ý’¶( ‰ú–<®) hQ*Y[ÍÅÊü]s³áBâ[Üöâò(W,ŒØÁ=áô¢ (Ëå>ª.ÃÌdMx»ÑÝèXÖÄGc ûÏI”p½¯3éxÀ ][][¦±š@¼<¿â½(*ðeWTÚTJ5ÜhzA“XRàU×*ú¸¦$—$ ésÜt|nŸñ[§ãC÷]);岨I¼À…B‰¯‰óA ±€k‡iŒÞ ®ò ‡¬(I «áZ€ _Z ÊË’`hÑ\ëø²èP Zžaf]©—† ðg7¸´ã{P_s©ô¿áR@Quû‰Ð c­ õÂÌ—_,ûLAÁ"Íž¥à°ïŬ÷mÇçöDzå@ û–F5€LÐÌ^Õ™•„^¦\—‰‡¦ô?Ìpn…œ7è(ïÝ ëi\@­Ãö2Ó\ËÚ¯‡È–DßWÔ\…rp$†„"ÂŽ.ªÃóK¾Á±˜Ä à˜1L‹†‰y3d$üˆºZáëЋi|,>ŒÖÞÃg–ÈsÎð~_5fÏ‘d1—¯b2ÙS­bBQ ?à¨kV ñ’ç½»î¦ð}†µR1Ì çÏ|2Ùš›$¤q7¡_˜…+Çò„cíƒIo´=Èâ†#˜Ï·~Á¢_o8·ûÂ9¦–ÁÌ>~ç ?ªl“ò zeÛÌsŒRSŸ°¦4ÀàôäâÜ={ÃZ¾}}<»¸|ZGï¬ÍͤxÙ $¥Í¶µn ø^¢l ‰ª±\¦icwû¼A-ƒÇ÷í:_^\Û¼Ðåþ~ç{›`ØóæÝZ ÉÚÜ81n;âýÔ¤Çc¼|§ªÖ½U÷Æ/ëê}sóï“Ü;ÃCz¬63å¥îh:i/zCN^æXÙ §‘6ÃCÃÜ ¢Ñƒy‚°£TG‹Âzw¿Ì\qÔŠMÔ6ô4ÖË•þÞȇB`‡“z’óa™4?¿xsr5»<ûýÝ¿{|z«Ö‚?‹ü(íö‰©Îg2ª²Ö|;²îc a ÛV,½¯ìÅ0,bÔfžXKrÙ»Q)º2ºÐm‘Qyt ¡„r=i>,{ÅKОº½›ÀEÈlx­&¼±@ˆÈ‹Ó(4×ÉÏ?ÔŸXê¥nóV=½´³kâƒG‰oøâŒÒî€gœÿ¦õ endstream endobj 911 0 obj << /Type /Page /Contents 912 0 R /Resources 910 0 R /MediaBox [0 0 612 792] /Parent 862 0 R /Annots [ 914 0 R 915 0 R 916 0 R ] >> endobj 914 0 obj << /Type /Annot /Border [0 0 0] /Rect [147.6002 531.0438 345.9722 541.9529] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 915 0 obj << /Type /Annot /Border [0 0 0] /Rect [375.9906 531.0438 522 541.9529] /Subtype /Link /A << /S /GoTo /D (emodule-start) >> >> endobj 916 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 518.4992 189.4184 527.6507] /Subtype /Link /A << /S /GoTo /D (emodule-start) >> >> endobj 913 0 obj << /D [911 0 R /XYZ 90 720 null] >> endobj 917 0 obj << /D [911 0 R /XYZ 90 509.8045 null] >> endobj 918 0 obj << /D [911 0 R /XYZ 90 452.5284 null] >> endobj 919 0 obj << /D [911 0 R /XYZ 90 382.1016 null] >> endobj 920 0 obj << /D [911 0 R /XYZ 90 285.3735 null] >> endobj 921 0 obj << /D [911 0 R /XYZ 90 227.4913 null] >> endobj 922 0 obj << /D [911 0 R /XYZ 90 170.2152 null] >> endobj 910 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 925 0 obj << /Length 1423 /Filter /FlateDecode >> stream xÚÉnÛFôî¯r) „,‡«˜žR×R¸0àè’:9Œ¥¡459HJª]õßû–!-Ùr#Äá›·ï´ð'Fy0Ê¢ÈÏã,M«³À‚ïÏ„=y€áí¢ü:9ûù2#øy‹Ñ¤Øc2™Ý:ç ¹t…Ó)×NãzQ9Ù׋ãØùt~õ!ÝpžªêÊ 3g­&œ #ã¹®*if ¸’Pæ+9G´8M3GˆÜý>ùýìb2h„áìB”&’ÈOÀÒqì‹(NȼÈGq€îãúé8‰€9â¼»}ün-Ûøg]Wï,垯'õD Rr–%¥µRÈ$æËT–ê9ÉQrŠçÖ\–'IR?rÝÜéî(11±ÈŽS*+çb¦;t¥ç‹®µ’2 ŽüÈIR–ûaÄ#/„\Á 3¤ß8q½$8o×nòÉà©Ã“·ÔS7Îý!í ¼ÂÀOÃ0%Æß‚$Pke:$ºg=ÿ©Í¶.ŠáNrF’ùi@:ƒÚ" ¸'î8rVP+a.K¬­)VÙ½¦bpm¯k[¨õ·@D¨µÐƒ,öFôÒéAo4ÝÿŸíßt6©/®ÿð>ÿÆ!º}PíÖÔßOrÂ…¬DÍ;À¨@?i*Yò«Z»áØj7-4¹ˆÚNv–¬.ôé°H+Ÿ/>½Û̈́墦ԺPÞŒQd3_UÊ ÀŽ5‹$‰Æ¶É}sÇ÷h(:iצ®žÏKÕ÷PÛ@ÚáŠ!º@sÞÕl'ª룃 ¨? X𔮪©´%[6jþr*¼UýñŽú5°ÑãGñXss}–‘—Ï'×7§å£¬lÀdË)K\¢× ¹Ãªµ©Â°®Ê zY~°ºsÃÜy`*Ž Î]Ôy`›ÙÌB5}Á×w}†ÔeÏð퉑³g‹†’^=ª#›\Ñ27üèÕ“+P5³óÑDÜwüv JO; g¯îÇ­æ%® Ò>UÅ1Ä™×O³¹¯LU˜Þo­Hñ²"q[^k¶É[ã›jZmªã+X9’Öæ¤b¼aÓ†fo=$w—©f(5j9¤VkטÍÝ€°ûµûêΉ[IÁø}¥#*šÁ”ÄEÚÝ@?)Ö`35†5zkBŽÃb¦xa±QG:h mT¯:7¨í”¦êÇi½ÙÊåRÉFš©Úê >ß·¼´,ã[3™ƒÁ5é@æ®e¹RG2í?Ú× H é•«'Hïvá…¤  <|û¬P¸,l“¾œðßÿß.õ endstream endobj 924 0 obj << /Type /Page /Contents 925 0 R /Resources 923 0 R /MediaBox [0 0 612 792] /Parent 862 0 R >> endobj 926 0 obj << /D [924 0 R /XYZ 90 720 null] >> endobj 927 0 obj << /D [924 0 R /XYZ 90 608.186 null] >> endobj 928 0 obj << /D [924 0 R /XYZ 90 550.8053 null] >> endobj 929 0 obj << /D [924 0 R /XYZ 90 479.971 null] >> endobj 930 0 obj << /D [924 0 R /XYZ 90 435.438 null] >> endobj 931 0 obj << /D [924 0 R /XYZ 90 377.1483 null] >> endobj 218 0 obj << /D [924 0 R /XYZ 90 295.8905 null] >> endobj 932 0 obj << /D [924 0 R /XYZ 90 196.6336 null] >> endobj 482 0 obj << /D [924 0 R /XYZ 90 138.9499 null] >> endobj 923 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 935 0 obj << /Length 2699 /Filter /FlateDecode >> stream xÚ•YYÛ8~ϯ𣼈9"E]“Å»™Ì"‹ÙI?,ГÅVÛš•%¯$wOczþûÖAR’EÇ hQT±XU¬ã+Z®Bø“«<\¥Q$r¦«íñUh¦ÿûJšÑ(6S’¿Þ½úî§X®d(ò0—«»‡“»Ý}ðöPœÖ2ÊõFÝzEQ~¿Þh­ƒ¿½ýù{ž@SâfËö¸ViðXñœ ž˜è-ŽÛã±hv<ñsÑÉþ\ì‘L'IH®?ÝýýÕ»;'u¬Ô-½Ä£˜š*&³Td±V«$ÓBF:&õ~ ãð°+ªE€—àÏÃó©üÁ¾4Åq|y,êsù,‘(ã¥å6:*Ö«ŒE§Ì¿êÙ(û²)»¢uëgVž,ó¿3ÌTë8 ŠºlÖ* cÑÖì1Sb¾…v*te6U<ÿwž³úÑw£Y!~ùã+õâMËß¶(yquªÁ ÅÎp\ôHÔWûæè”Ãy´ >wm3?!íÁúLÃ|;;ñK(5Œ›r΂¾ýf‰¶ç¡Ü½…dHv9­7à‰mOrTŸùqnܨ/¸ÐFFBÆ!{<*åx HÎã꟰+.cfF0¢äǶmvèóCÕ6EÍ ú¡àб@+ƒ€ZBXªÚ2I­Ý<‡®t"´Lråã³FB°w™ö^–ˆPGÚ,es˜P–ÁCÛ{2pQB'ata c¸=ª}¤w> Œðx#xí[à›p˜³i—pìÎià îèCÖ˜UTð±,/S@Ç"‰²l•H)dfã '}žäG·™z²Ü’!ªû±ÜâÙ±`$DÎÃûåCÙ·'#CôŸ^ã×<ÀôH ÕŠ“Eú’™È“<ÉîËa–î–ìK†(»0ç˜J%yGÔZ$a¨oYÍÑÝ`ÁÐkµ82FÃÚ•uÉñäŒæ\ì¶,¡¡i¦¢[vst·Ä^2t>øÝO)d¯H„@ËåCZ¦ :‰ˆ6¨€¢ÿ¨]œDìI«šþÞ\¹Z…ÒÂdZ¾Ùd = rèž_¶Pçºâå©jvíÓKq:•EW4Ûò¥:‚©^xé1¾4nøÉW°^^+qЇ§æ ~,Ö¿1ÓA1vé0̃uâS©-v‘΃á¡]m¢æQðÏ–´#Tœ€t8˜)dŠ€ŠÍ†3OU]3QÓÒÑeé£ìÑXíçÂlvYÊ0WBšE „­mIhrˆÙÍ- ´¶„‘Æ[Ó?¸b .¡³|ù³AÄ i;¢YÿozªkÕ>…jEÒ¬³{¸K zÿð¢5Ÿµk¿óûŶWp©rføC‹N³ЩÕxRuœ €´:ÌÀNY~¢ªÍ”̃ô.™Íà)Zû$%7ý€=  p~J¦ôEé‚`k¢'°5öuNJ§|Uº‚FZ„a]A­Žn3%ôè²dhìËÔ‡öU‹,p>åë1¥£»)À‚áíCv{$°É=Æ÷Eti7O›¤t5Q¬oÎÑÝ’{ÉðË†ÓØ^§*7 çèn °`è5\¬Œ‚·†©Ê/¼›'¬² %ó…+D Ä eRd1DÄ_´t›)¡Ï ¯wPR[¦W;(m:(F]§¯mJ å¾i˳Ÿ¾©ÕyÛRq8r²N2ƒªøüBmĶ>ï®ÝmI`§UlsÛŸ¼[‹T¥Õô̸0O@-;[ˆ’P‰}ƒ·1ŠÇei–Ô}»èçÓLht§HÅ"W׺yKµÉ|½ü³¹‹J㢚Ç÷hûORA1: Ì¯Ý‚»_»ÿ¢|R›3Ä$&9»Ñ¿\,lꪯñ·îlMù:LAýé OÖU?˜+î X03cƒ”üáyD÷8רOõ¸­dG2ËäõG…óÈ«A› 8šÖ+Rg¿66Ž-ó/ùÇûMí~¬ºá\Ô/§®ý÷±|Ù¶ ^¨íß@K¼ÆËÉù:uÒDÉÙ:7Â^ZÓòsGÐôTÛÀÃ9º!°‰ÑLVYˆ.Ðá…CïJÀhiä½öÒ:@­ § Ü÷Z>·t›)¡/Ÿ/ÎqÈ•"ª€Z¨\N‡< ÿ.rz*UØXŠôE2Ô"™C9K} ˆD’]» sd› /•_²ûB&ËkN›§íOœÌ»r³ëèŒÖà¿O_뽸œ–O ¾.û—¦ý¶\ÿÑåõÄpÉ`zÄ}mË$°3_`Ð[Áꚨ«qÑÑã/‹™›Ø$ñ_ÑTÄMBŒ·AöW¡j˜HÇ—W4Þ±0ïþóïÒ «o ‰wæ‡[º[ðH4ðÀÞïÞà[HeOA kfy²sÄçÎü¢ˆÓ?&]5…KÍÓ“ÍlK­ò x gtµÆ0±‰¢Ì—àLkÄmaòƒ¾ëAò§x*sŽnOWÉm4 ý†‰²¤še± %Y’Qü’×µf#ˆb"²45f–œé*³ß©c×7®l6¶—ÊOUïZâKŸÊ╪¶8üyÖ£ endstream endobj 934 0 obj << /Type /Page /Contents 935 0 R /Resources 933 0 R /MediaBox [0 0 612 792] /Parent 952 0 R /Annots [ 937 0 R 938 0 R 939 0 R 941 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R 948 0 R 949 0 R ] >> endobj 937 0 obj << /Type /Annot /Border [0 0 0] /Rect [355.6388 608.4335 518.9697 619.3426] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 938 0 obj << /Type /Annot /Border [0 0 0] /Rect [166.9941 595.2828 317.3276 606.1919] /Subtype /Link /A << /S /GoTo /D (read) >> >> endobj 939 0 obj << /Type /Annot /Border [0 0 0] /Rect [344.6004 595.2828 502.7823 606.1919] /Subtype /Link /A << /S /GoTo /D (hdelete) >> >> endobj 941 0 obj << /Type /Annot /Border [0 0 0] /Rect [459.76 406.0377 522 415.7347] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 942 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 392.281 247.5327 403.1901] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 943 0 obj << /Type /Annot /Border [0 0 0] /Rect [275.8704 392.281 427.3354 403.1901] /Subtype /Link /A << /S /GoTo /D (read) >> >> endobj 944 0 obj << /Type /Annot /Border [0 0 0] /Rect [455.6731 392.281 522 403.1901] /Subtype /Link /A << /S /GoTo /D (hdefine) >> >> endobj 945 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 379.1303 236.0851 390.0394] /Subtype /Link /A << /S /GoTo /D (hdefine) >> >> endobj 946 0 obj << /Type /Annot /Border [0 0 0] /Rect [378.4083 323.1927 522 334.1018] /Subtype /Link /A << /S /GoTo /D (help) >> >> endobj 948 0 obj << /Type /Annot /Border [0 0 0] /Rect [449.4303 254.7105 522 264.4074] /Subtype /Link /A << /S /GoTo /D (space) >> >> endobj 949 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 240.9538 227.6609 251.8628] /Subtype /Link /A << /S /GoTo /D (space) >> >> endobj 936 0 obj << /D [934 0 R /XYZ 90 720 null] >> endobj 940 0 obj << /D [934 0 R /XYZ 90 587.4805 null] >> endobj 947 0 obj << /D [934 0 R /XYZ 90 302.8458 null] >> endobj 950 0 obj << /D [934 0 R /XYZ 90 233.1514 null] >> endobj 951 0 obj << /D [934 0 R /XYZ 90 151.2155 null] >> endobj 933 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 956 0 obj << /Length 2932 /Filter /FlateDecode >> stream xÚ¥YmÛÆþî_qp¾HEÄË÷ýàØMp…ñµê8OZIÄQ¤BR>_}ç™™%)}qZpÚ—Ùݙٙgf‡Á•OÁUî_¥aèåQš^­Ï|¾{hkE«)É÷7Ͼù!®ßËý<¸ºÙžmr³y¿x¹/ŽË`ÑÛå*X´ËU†‹ôÛå*Š¢Å/_+#ýžh,Ú4j›ÃÒ¤‹¥Œ‹{!z‰vs8õF^5‘ìNÅdQ’¤‹ÀË7}ö—›ëؘߓ $KÍUz>I¦‚%Yäa³`©v ÿ³å*NÂE‰N½/o¹Ñ¯î—¡¿(ÚZÆwàŒôe¦ú"ãùI–ó®¿ø±_ò´+iËúîæçëŸ~¤é@w9Ózœz‰ï“Äpû ïu]C«`†xY®Lš&M†0ŽMSƒz{Le'¤¬Ó®"£«°÷2º%Š–¹³Á6ݱ*@óÀûèž…àæ‹¶/×§Š[ŸgâÀ§uþã:IF¨FÄKÚØÞ¶‡²¶tû‘Ÿ.nùTi¿£½n°J¢¶'Ã/`G½´ÁKkù[c©Ž÷{ÛZ4Á“XÚ஑æ%¿XuÁo'”lÆÅ°qÙÍÉQÁJUbì½o¾–+îàkÓÙ5<‚ãÕîÝ\˧ÿ2|ê˜©Ê [žʹ¯K1‰—ù&}lËùÔ–§~Õ³ëuW1#bM¤öI{Î&öÌ»ðEß(·Ï¿:¶v[~úw×·¤Öç"Òóï›S[[:cÕímU­ÖâðÏ¿ÐòEžWö?ˆj‡°è,‚ é7”±OP"9‹Jæ—ð„¦–ul9Í®-Ò‡@ г¦°aÙv]ºHj¢;õº/ë„°ƒ‰ÒØ?÷ŽKå®èî@ËC]ÜÌÙQk ØCšÃÛÂÌ_@fX–•î=v`SZà öB{;²°ƒu§Ôe¯gÄå™h8Àê™,xߊOÀ€sÚÐ!7Fä&â’î#þ5"žÚïá- 9¶ÍjNJU{ž)‡hu=B ÊÓ©®izݰǰt;Ú‚Q†­|mÖÁÇAáµìA+‹"C½Ù[ÙäÈ›Œ Á ±‡ý4ÕRO𑣇s㘷^Þ¾`½–Ž]K>±–¡MÑã~dºE ˆFCî@±k#ãÍ Ûù?„ˆBŠºÇGóúœ¹8ˆ‹ÙPW±‘< Á¾_ŸË"¥©çâÇäÅP×§‰³Á‘ÕÎve=à&¨Ǫ̃õ•ü­†ýÖ®›]]þG _0œ’„¿ do!M%¤E§8XÏ!Pä{&ŽˆãÔ‹³8}†b ýãç7¯Ÿkçc{¨LÓìª Þ\hžzY= ‰?Ðe8àŒíú/FL u g11òòí›7/~z%ò¿/Ú]÷þ!T|QU .÷ž/¡ [¡NLÖÈñãdÏíp›J Î'€)“½¬-kù-äg­yÚ¶H/ÄÎ9Ö…„¤s 9_<éÔOmŠ&\xq/õyÍ ³\yš Yî/؆úS;Ž”½üÞ—•šu¬â¥(ÄQa/íO÷„%N5<ŠGÆ"Á‡h¾h*Ùl€$>ÎèÐ9èpÇEñ÷@®²>KÉë…ÉU4ˆã©ä,Qf:’“u²2Ú†6cTIìRGJ»F8Å©CDó÷ð˜ñgÊþ^í íypÙ>°ì+ãÇ^–˜ËX'X‡H\®MjšÞ´‚ó˜Á…ž¬#ÛN,HÉȉNõºïˆÇÀ,Ê­4TÌìféb-^§†,™äÔ ú½Rqb‚G÷5ƒªSð'ùRÙ;"ßÀT+´`]Õƒ´D…«ẨªNš½9ñ#?œ'óûæx±Ì°Öfõaªɹ¢D´[ôn7A= t‡Ù])¡·–™²v:?Q`;X:(&–³ âÅ gé¬ëgd°Mbý0äþ #K!;¨N#ÎÌ V@±0iCÄ•Gvd‹÷ ÆøÞM¢÷n’‹ƒv+Íè9 ÏÄ€ 1=`cõ­?͹_î™,K•âÀ:•û ’úE­¯"ðq)ÞìÑyìùaê & œ9Ûø^…æ>\<;K=$çÚ½=i*j2>ÜK¾{#±j‰¤µ¢üÎÔiû·«#pJI‹.ÅÿN³}äNIìÅÃÊ*b·½Õ7WÑÍ)/ Œæ‘yZ{”‰Yà®ÎmPæÅiœ»DE@€“Í06œ’q¤Ry;gIã`D²Øhz=DKÍhâÑã1Ö‡e,˜€>¡c‰{/#Ÿ{aî Als2ÆNùid[}„Ôz𤢳Ï`‰ ²ö(Ò JÚIw?õ´Úåò˜á:Cç²è p)š}{2¤I´øaIO(¤{Q˜²‰/ð6IÂàŒK1qÂçÑ|>ã0Íwµd]Z;È ]m-­B~˜wB1Ÿ1[v{„Hé²Ôur²Âåw8»Ô×ÉŒÚçü& $ðŸ9ÿß$}¤­î\1-2Fî‘~a-&øLÉ3’î)@¤À¯–“à daä ‘xƒÑܧÁ‚ðÜèõÐrˆ¿¾¸úf±n#8%†;™°Ó×4'UOå´‘É/3‘™#½ÇQ(CÁŽ…(?Jöx'=^âòø`N¬k¤B,DO Ûh© y¦ˆQCkQd¦ß´Ï¯Fç‡b í³kÅ1VænE³½€Dµõœtµ(ïW—MoÝEOþ9˜S(Ÿºª¢¶ è\€¿>ÁÖcuHv#vÚóN P¬„úÓ×ýZ_¢218-êΗJ¿ç¢àˆà endstream endobj 955 0 obj << /Type /Page /Contents 956 0 R /Resources 954 0 R /MediaBox [0 0 612 792] /Parent 952 0 R /Annots [ 961 0 R ] >> endobj 961 0 obj << /Type /Annot /Border [0 0 0] /Rect [303.5049 219.5234 452.8973 230.4324] /Subtype /Link /A << /S /GoTo /D (pick) >> >> endobj 957 0 obj << /D [955 0 R /XYZ 90 720 null] >> endobj 958 0 obj << /D [955 0 R /XYZ 90 720 null] >> endobj 959 0 obj << /D [955 0 R /XYZ 90 608.6337 null] >> endobj 960 0 obj << /D [955 0 R /XYZ 90 476.12 null] >> endobj 962 0 obj << /D [955 0 R /XYZ 90 197.2412 null] >> endobj 954 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 966 0 obj << /Length 2382 /Filter /FlateDecode >> stream xÚ­YmÛ¸þž_áo••"’zM¿5I[¤w@³@?ìm®-ÛÊÊ’+É·Ùkî¿ß¼Q’m9¹´E€X"‡Ã™áÌ3µjÂ?µÈÃEjLGiºXí_…2üôJÉ“þTä/w¯^ÿ5V y˜«ÅÝæDÉÝúÞ{»³‡¥òúbé+¯]úÆ/}³ô£(ò~xûá ô;)ðF‹f¿Ô©÷KÉcÊ{f¡·øÜì÷¶^óÀ[ƒÈöh·(%Iê)­—w{õþn°:Öú[~¡È¥c©^(„à™8–dQ L“ci€æhú?ÑK?NŒW‘…v&@`ô40:­ƒDCËã°BQòdSVEm÷û{ùe ¡(úöåË æZû‹”è> zœI‚`¯ŠCŽüÐÞa 5„·Àãm1¦¿,uÆ­yúçPE0^‰PY£@ßðäöò8Àç4ÕÞ®i=Î7µ­xY‡’ÅŠ‚§´æaÛnð¶§YÞg"Xú°¯*Å*Ú²C¯1„ì`Bº¤‰0PÕË’Ud<ª½fƒ¿°¹í-?•=ϬÞÜ¢Õuw£q‚‰¦<ÔZ®Ðå¯Ù[VN ÙĹÖ* òXå`'š'‡8w^Q¤y‰ ¦Âv.éÙPŠÕžR}ÝaÜÌmîëDi¬Ìi¸ šÍš0йŽ'VüôlòÃØY…Ôýô0ÑBThÃɆø‘ν¦3H™<Àœ”`PÏYa² 3Ù5#(þµŒÃг{ÁåY±£ÀÁÀ”}IY†VAv&iìÝn(g è2(Zpó$.;ìûb„‘gûÞ…}è!MRà/%,g¡ÌØGJ²'zv–«i9)ïOKÌ^w9'yß¡¡*¢:¥,ÜÊ~…‹yË™H‹×èvoOë€}Yµ$nû±Z|S”ð§žÂhBŠuå#‡“ ¸ÇÞ''Ó7Ɖ Œ¬$„=Ñ·raY_#%WO· ½ºxæ÷ç²Fãtš ìk;̹7T€€å$¾ˆ–ÅgŒãÐf:×TšNdV“Ö¡kNÆS÷$ÕiåjêÍ)Ôûˆ;¡Æ×0_Ÿ`>®Ù}–ÿc(Âc[5ͺ!mëÓá+fUÇ9‚sÛpø@i%/›¦å„.'Б"ðá$‹<޽¢_Q"Çt.U!Á¥‘›¾xƒ Fídælíª?Ú 3á…ÏŒÍ,ÎY¦ijQò(#mÑѺ ¼@hf˜¦¥0±+%6¸ª^FäË’Ë—^º]s¬¸C¡ð3Ì_J©pC]‘Ä-ÿP¸Ñtz›÷®àH7of»E¤YšO€¯Xí—ág‰r-YTÏyæ´Ì«>Å9 2a$qž.¢2 ²PEÓ&4ÈùSÁžw© øX Qšè@)Ã/÷ÝÂ>>÷gô~nXì@\KVuîD”'A©ìĉ:7È}ˉK…Å9dˆB§ô*4DSh/€€<ýa*¢¨æñDñö݃#ƒÔ:áýû£émÅh’I!Á3ÒLLõDŸ5WÂóDs߃_†õÙ`NEÀsÑÏX>¶%-ŠÉ%j^Ic¨>L"£…,ÄüIZ'aqIm/qÄŠºÄgi6_c}°ÇùèäYAæÃF•ð žyw”jË-r( c»3êØŠ%µ^ZÄ¿BQX  BHtOF-…³ ÁÑÝ ÇÆÝÞ—‚Ñ‚ʺlŒî`W?¬‡0÷ö‘±w¬m ‚¹N‘p!;?8DØ¿æav ‚Fƒê§ ::ͲbQ‰¡9´ñè‚'Á³­Xhå·Æ_ÌBÇùÍœ¿¡01™4öç]9yëÀ’ŠKÄqp¼%8öÓž‡ Û¢’fÀŒÇuEÉ÷ÿÆ®PB_ILJ»5æ`ç9òH$”äám¶p¾±Ž)ÝæÜtÅí÷Í3• OkœÞ‡ç÷ÿ@)õEË/_ø‡S÷7çûÜ5´ïƒE²úõ½PÕÛgÆŸ Á-^±’ð‚HâŽ<ƒ]ë¦ç‡Nr…¯yK&ÌÌÅs¹¡M–YÎŒ#§6^#;Òå&‡Lˆkþ‰¬¤i+„8äLÇlÈs·žTÇ©qL’Á¾Ùмf-±Ç$›)ìÌÃ%¥NS…{¬Îãá£ñLÓ¡àÛ ôÇ[Ð4yþÍèïCÍ:š?œxd(…(= }†qO Ã/2º¦½œ?Žå_ñHÙ³tržˆ6Ü™4‚]T´ ùÀ ›c=ÝØÙíÏ6¦Ûwp"& ½;fžhâ;b)w0"¨%T~¡¦& ‚…Ô’à÷=BÓª*©KÐÈy—â,¡üÆéSó¨ôHŸì@¥7Qså+ ú{3W”åXÒ‡1?¯I )ÅaòÑ}Áî@ 謠8±Åü͈Œ‡…WR!§jëø‘=ÝaÿU9Ö"Š;+Çe£¡k±çÌÈg§ß"¥BÙÀëìZG*ˆÓ…ÊÓ ع­EÊŸŠÍÒse³¼:I¤@éÍœ ª—; r÷݃À‘ß•¿RÚ 4Ã<0íËo¦AlòüÄ¥9¦íä¾åÔ¥ÂëLÛ¤NéUÐK¾ z~‡ä_-þ+ĘÉMó1Âß´v8À¯ª<ø”­0ÆC5°SÊAm†÷ïƒËEß½¦ë­Üõu’ñ‘µR&@h8õŽ«A$ÃgØ%fWO>p]9áxªÖÓŽ/Q_)›»š`CHe+|ç °ÕÄ“RJ¼OvøU ?…Ñõ(0s1òQ¡ŠñJòÂËè¦/*.¿fÝð‚‘xṋ¥kÇ‚R `o?óÜì僕cÞ²õpä3ÈAnÇ)'Bßøpþ<€É‚{ߺø<+[ßKb•@ã(xrÕTÃa9á» üæPÕkNÅá‹g$¨éËýÜ÷tùÐV1 Gâ©s:O9>:ÏOíB™b½•)tþDvþ0àÖfåï¼GÁ§ñÜST5zŠoâ)>nÈ=Ÿ¿¶ô×Ùkúí–ÐG#ØWö³ã–‹'3tEL‘¯nD jYîÒ Ÿ«²ëY ;<“”·ÃmÇä†1~EøOïÜ’{¬úÿ,ÆiÌZU²Š0P<¡ƒêß*Î. endstream endobj 965 0 obj << /Type /Page /Contents 966 0 R /Resources 964 0 R /MediaBox [0 0 612 792] /Parent 952 0 R /Annots [ 968 0 R 971 0 R ] >> endobj 968 0 obj << /Type /Annot /Border [0 0 0] /Rect [304.6597 489.9331 496.8418 500.8421] /Subtype /Link /A << /S /GoTo /D (set-load-path) >> >> endobj 971 0 obj << /Type /Annot /Border [0 0 0] /Rect [241.57 194.8552 460.5399 205.7643] /Subtype /Link /A << /S /GoTo /D (look-encompass-size) >> >> endobj 967 0 obj << /D [965 0 R /XYZ 90 720 null] >> endobj 281 0 obj << /D [965 0 R /XYZ 90 720 null] >> endobj 495 0 obj << /D [965 0 R /XYZ 90 569.6696 null] >> endobj 969 0 obj << /D [965 0 R /XYZ 90 476.9855 null] >> endobj 970 0 obj << /D [965 0 R /XYZ 90 285.6212 null] >> endobj 972 0 obj << /D [965 0 R /XYZ 90 181.9077 null] >> endobj 964 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 975 0 obj << /Length 2046 /Filter /FlateDecode >> stream xÚX[oÛ6~ï¯ð[å!Ò$Šºõ-K³¢Coèô!íZRlµ²eHrݬíß¹”l+K0)òðð\?2˜ùð f™?KÂÐËd’Ìòõ_yèž î˜ä«'¿ÿ³À÷2? fW7L®Škçb¥¶óÀé˹8íÜ ÃÐIžÍ])¥óââÕ3éW@SbFËf=‰óµâ±ÀÙ3Ñö›õZm x¥6@²Ü©%’É8Nœ@„óOW=¹¼²RGBܧ’œ*–ˆYz>h¦‹S題H±ÄCqýÇÉÜâЩIBN8Í·%áór3€p`216UÀW(%1þèG~ÝÐzXÛ—Úh×Íâs™÷/Ÿb3]çj]¶ ¾aA ù¸"J¼Ø÷A3Ð"ˆ|öÇÕ< – סD5t ßaš8l^è´0Õô0Iéà$èçÿÌ#ßwÔ‚¼¢kF”ªçÁÊ´š D"¡7K=¹á¶‡±•ÞÃý—ÛÆ*0F_5š MD«Qm´ßXÃfΈ0ʆ _bç9tž¢¾prí'ˆ²¦-ˆÙçºÛά#«¬É¼4Eù0·Ò´9Qlæ"847º½_”c‡2¢dX»`ñ0¾ñjÝ´ƒSº·¨Ì’­²é(½RéäÚü-ïfÜS'ªójà i›{‰²uU2Eó‚ã “]‘º%Ò#ʤóR³¸„Ù]þ kϵ‹I;«FO`qŒA«êΤ"|­ÁŠ©óÿhSŒïX:ªÓ¬ê†¨K½VoÙÍU غÖ{÷šïXãj£˜¡Ù¯ªÑJ…éV“8{bkR€¸Mºà¨û ÑDúÙS¸˜–FS}­ºjQ—`þ8 œóºÓDkõÅš¡ã!Ò}jvèWèÔÓÙˆý[W}/ÃØËcGˆâ™bJ§Üº iÝT«ÑŸb UumøÕcÛ!»Ü„ô¢0LO19Âd0VèƒíCÜ¥x÷ÍW܃Åf¾­8 áã7Œåë÷~E’ØhÃ>¥-Û°À‘ˆ!Í䄯" ÁIXl·œú UvšþHEíÖ +V·BÏŸœ„ÿS>apòro&²Û O¹>ò,ÀmaY0ì}F¾Ôó$OêБ<ñHÄ.Ä\œœÄ\ä 'û7¡“fÃý ‚Ÿ°RéÑSä"áïh!bg_ ðï^òÇÎÐä`P8Ò7ätÕ#Ú3åVc­ôSç9)|ƒíjô°ˆNÌÁIŠl1±µÆ ¡HhÚmƒêÈÄ)Êà†09ïA?¥%2•xDaä,Ù#ÀLÂYiÑñB¹âƒ~Œm&pù¨ÕÌ¢VïX±Ùhž :ö”N‡£­=1K«OÝA—Fç çÀy,De Q ñYþ"&é—%#Ë÷}µ)šý¡Ÿ Iç¯]®ß¹ùðòÍó·xºÑU%]¾?ç¾çyÜùù zÍ…TQ¡7o1úGÑýeÅ'ï†?÷Tsæ Ä!Jô, gXåf"ÑŠ«|NR úlS£ç~Õtz¯mÛð±]¶}EÀ ƒ:Ci˜â¶úèÒDBÁL&ÊÉ£¢¬V«®çön=*1ýdD%Ž·ô¦Ü(R/ɲøÇžŒqìÌH ¨šÁþŨÿ›ؘ:ÂçöN_¹“»uœ‹/lh$þ´u… ¶%o-yl[“+b*0Š’`;T:8kÏoEµ×˜MÙ¦wQ}OgËbgïˆZÍ×f—cž­‡=:á*áàßU¨ëCRÏ…k-%ˋ˷&Ó¤sþîÝåùûó7—K!̉àb;ÑÞ¬õ¨Úêø…Òh“ëA6 E"Ÿ=p"V67ª¼c2ªD¡}‘I²z¼Å¹aJn"6šwhÊ0Žow a³Ž•&ßææ2¹+†|JË›á€Ô ÄÅ!™°®6Ú¼©›öŒ'º•*l‰Œßœõ·6¾Î ¤Ó<ötÁèWzîp¯åŠ jâûØ@ î ¤FR÷Ø Z¨nˆ¬Ó`šŽžÃ¥1—¤¨¾v˜Ã™< mz u ØíšÇÑUM{üŠú©'â8˜‰¸2ÀgØ…¦GO)–ÎN<2Dáþ¶×||'ò„—]RkŒDc,qm¤¶Ÿ´)`—Úÿ¯@2‹½TŠCù'ž‚,Ý}òŸ2Dù§ãIú–é]%~! Ow‡Óƒ°)Ê›¢tŒM1\7èœ#‰²€ Z‡¹¼··“Ê>7T¹y€Š¸è£Ö^¯±.³>çI*Hñ¼éùÛJ‘2HI€&QÛI Û"”Töa@ŸløZAc\¼´·<´ÄÇIz,Y sÆ”úµ¤ï˜€+ýð1o,Ýèä!¨ÍO@ȪÓÏ7„xÛãšß¼Îä5½È”ÅTùbn¡ã2æÐ˜wï±ðŽ¢¹¡h.W|›ÿåøƒ®ÊZÇnÎϾÿƒšh*²eù €k…ñˆö“’ ?0![ÂÅ”O~ª×þ6Å>ódj¸ÒÖQåE‡•!\ƒßµÃÅ=+ñeŠÂFêú“‰¿ù uscBxY†³Lz2‰îaKådSvÄì€Á6À‘äþµ-À0øwÑø àAÁå”2—“ÊÃ#‚ì¤r–^(dx[2wD7¡Å ;‹Ã¸é3V" endstream endobj 974 0 obj << /Type /Page /Contents 975 0 R /Resources 973 0 R /MediaBox [0 0 612 792] /Parent 952 0 R /Annots [ 981 0 R 982 0 R 983 0 R ] >> endobj 981 0 obj << /Type /Annot /Border [0 0 0] /Rect [308.2661 235.2868 496.8421 246.1959] /Subtype /Link /A << /S /GoTo /D (merge-baseap) >> >> endobj 982 0 obj << /Type /Annot /Border [0 0 0] /Rect [422.9733 91.7477 522 102.6568] /Subtype /Link /A << /S /GoTo /D (help) >> >> endobj 983 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 79.2031 189.4184 88.3546] /Subtype /Link /A << /S /GoTo /D (help) >> >> endobj 976 0 obj << /D [974 0 R /XYZ 90 720 null] >> endobj 977 0 obj << /D [974 0 R /XYZ 90 720 null] >> endobj 978 0 obj << /D [974 0 R /XYZ 90 572.585 null] >> endobj 979 0 obj << /D [974 0 R /XYZ 90 463.4846 null] >> endobj 378 0 obj << /D [974 0 R /XYZ 90 356.6914 null] >> endobj 980 0 obj << /D [974 0 R /XYZ 90 284.9219 null] >> endobj 377 0 obj << /D [974 0 R /XYZ 90 225.697 null] >> endobj 973 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 986 0 obj << /Length 3085 /Filter /FlateDecode >> stream xÚZmoÜÆþî_¡O5Ð1|IÚŠå lµhU$¶¢:ѹ#/$O>£èï<3³KžD¹jX»Ü™÷‹âÑþIî¤aèæQšž”ÛWž.ÿöÊ×Ù’ –S®^}óçØ?ñ=7÷rÿäêîÉÕêÚys_ì¾3T‹¥ït‹e†NúíbE‘óã›wßÊÊpO0æ´ZµÛE:µ¬ùÎgzƒy»ÝÍJÞ ¬÷Å`Q’¤ŽD‹›«Ÿ^½½²TÇAðßøÈSÆÒàÄ]8SÆ’,rý0Š™±Ô9ÿM£Å2NB§)¶ø¬–-†ÛÅ2 œOU9€$T0‰2ðÜÀË2F÷«{tœŽÞò fðâ\Dryöþ-øŠçHàqê&žGô­~ì‰ÔÏúÔ놤¹SÐùN3•hæ1^™ázÚT¸~è üfÍ—2ÀÐÊxqîÊäL†fdÎ~‹¿Ä/ý­:Ù¨{‹ÝŽÖS¹¬ª•BÜ)j<~1(>’Aˆ]ÈiÊYME$’=a+ùwm'Õ¡Øî6ÕéœÜ}/pó8Ž1ðݵíœTßÍý Å,Hžd,yy¾,UÿUûË­ýhñ6gïù]¿y÷¿_½ý›š m^ÿR7«ê ì²ÝØÏëŸyïæææ…æ+¬\Àl=Ïi÷LØ­´ü<«jƒ5ß ÚNæ—Ës|¨+«ÍZ6ÁZÕ¬2l{|Sókê>^ºÞZïÑb Âñzà¥ò®1yµªˆãµ{¹äSðöE©–‰ý¢«æ ™)-å‰P%:ÓÓ-WOÇM±Q9FGfMª…a V.bºyKΈÐ«¥‰Snö=”‹iëé̃mÄ~–(Ò¦Ø ·ÄÉþ^Èìªb#D~*¬ÕnÔ}Æ‘£öƒiùÏEL²QSîFµÊMÛ¬{µÊ=¿î`¶úý­y éÛÏ m#1zËá‚V¢¹—PTµÁ$‘x}Ê_z«áXm‰¬N¦¢:Õá;ð”J">±÷–Ò˜7+Y±¦ŠU«1+Hb›`£ßMÌ ò¹ûÂ׬eÛ“Á¤LPc(»›ÍÃÔõ¼ÄÄdÍ™fbn¹”J›\z6m‡ÊP ïÃó8)± Ã\q¶Ýl-@¥@ž˜/ÄÅî:Èsg]³ÒRÄ™Án/Ö#?¿õå‘QMSþ”îÓ¼ÛƒÁP~]°Ó¶†LÙè•Q`0ã®k¤‹[XHoÚÁÔ™›yQr,VÊéïö¤´QšLý|Yp²¥™ó£¹¶ÝJèEÞIÕ3©—hQ/Ÿ¸ˆÑ0 VËŒ¶‚³ºå[ì•Æ Õ« þ ו5r†ðµ Ϭ. [ÿ±}‰ƒàp¹fËA¶Ž¬²éÉ5>ŽÖÂùÕ" ‘iGA„V¿™€s¸¼A ;)€‚Ik#jŒé›ý)T —=:Ô€£{,Uø^wÔ6@Ô7S™b£”ksã(´}K+Þóó±Ò ØEŒÛö[5’™2ë)|?i'͵qàò@«\ŠüÂtCÛ7ä-÷ÜÙÎØq„YàüI¾þºÈȰ¯QYÝ(–^F©¬«¢ã² Q^:Í"ÐÐXé™…vÂ1æJ{4Êà«•q=&SœÕ o¸>òœ ˆA߆û‚\Øë³mëQÉJ°#²·¯Çg+Eß[}³ –¢·Y’óʼ„ŒØh?ñ0½ªG)R–GåGÐê«g|~¡&ë&Ê„îTþ¨3›3Aq¦j‘¶ŽåW6u?ÈŒ•Ùœ–üÎtÑÈü'¶Ïµ_Ó'…tULáf½©lñ 'ž½)뢺ÖÝÉlã<Ό˚¶Qgîw;ÓÙòÕ öÏÚŸD .nrª£ðGHQ«û¦™4¦á+Y.ºõhEòBl›Þ3tûL7"štCMÆ ûê7ä´½‚áž¶òÓãÊà9V–wlÀúâQ"¦B¬eqä¼=ç¢Ç“ž—é…Rém;­8y±æ:šîþ)úÕÑ3Aݧb½ædw°0g¸¯žÉŒ§<üVU;I‹çráØõ3ß”ðö·¤¢+$´!ߤz»Ý«ób7WL3.Dvjúg4'·ï¸½†"ä~¾dð©ÖO3?þJÍÚšáÀM6¨Ï‹8‘­ñ—~²¿5  ÷þ¥üP*­Î(½v]™üûû±èMÛ”êê­×øgUŒ‘N´)ÍÁ#36®m*?þ9Ñü>˸È]s Ù).ò‰ƒÀ(Bp*f`ÎOS«^O~Jã ‹R3n./cS5&OñcÑœ{‚èâüT&òk$A즽vˆ8/nSÉr¶;ýY•—Ärû£­éOøß þ±?Õ endstream endobj 985 0 obj << /Type /Page /Contents 986 0 R /Resources 984 0 R /MediaBox [0 0 612 792] /Parent 952 0 R >> endobj 987 0 obj << /D [985 0 R /XYZ 90 720 null] >> endobj 988 0 obj << /D [985 0 R /XYZ 90 720 null] >> endobj 989 0 obj << /D [985 0 R /XYZ 90 614.2137 null] >> endobj 990 0 obj << /D [985 0 R /XYZ 90 352.7864 null] >> endobj 991 0 obj << /D [985 0 R /XYZ 90 138.233 null] >> endobj 984 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 994 0 obj << /Length 2435 /Filter /FlateDecode >> stream xÚ­YmoÛFþž_áo¡®!Ë}á[pw@j»‹$rŠ"mZ¢$¶é’Tl·è¿y[Š”èÄö ˜ËÙÙݙٙgf(uŸ:É“Ę ³Ir2ß¾…üû %#8ü!ËwW/¾ý>R'* ²0S'WËÑ&W‹OÞé:¿™)¯+f¾òš™oŒñ’×3ßZë½=}÷š)Ýx µ¨·3xŸK¦)ï–™Nq\o·yµ`»¼–Õ._!›ãÄS:šýrõËó«^êHë¯é…,_SLÙ$ˆÃPŸÄ© ”±©÷áÌï£Eé–0¨›íÏa¤‚™™ÔûP£ê&ŽXǼã—éu-O®ó™N½Ïø¯_[”h¼Øzëz[¯Šª¨wÂ=¯g>pÖÍ6)«Î €b¾2ŠB¾:lVV gÖ;¦„¯øy»FƒoäÌ™Ü̱”Ì@ÚŒäb)§<|š Pºo¿Oô ˆ‚uѸ~$Æõµ ²Ôj’9 p¡¦ÿI öŒ înY7HÚú+|ïéáu¡úYGYL[Á„²–"ÞÅ‹ýiÙÔ[ÿâì¼8Ùmtù½xC“~$½:Pp׈l¬ñ®p ¼>ΟñK× ½ªvIDJ½”æ×Þ í﬩¼JØ®AñÈûÍÙ±«™^Vn9ÏàsŠp‡Ý·#w ¹ö¾å Ü?á&Kâø|²¶[Ë|‡î1iìn2bØ ÷ØUåç¢i‹)CÚ(HÄXènE¡÷Å!©ƒ‡‘5p@WTý6£XkÜÿœ¼² ÑàdÌqÃ6CÀº_âuÑí\œùc£µ“ú% ujd³O¾+ÿ`®f©ñ&ã'нMä›Ð6‹Òñ­ü â™èÜNÙ!XLêªàà8Œõ—”M@§{ 3C 3_:stûDþMx§ gØ!{ØC¿õéƒu–â8ŸÃ @aL,ŠcèÛ£HÀ°n8^g3„yÇ€‡¹‡{ÌZÄãðÎã]6wíÓ±®uXwùÝ=ÜU]ÓCÎý%’/JQ´–‘ñ‚ àÁßOÇÿ]‹¾E„‡gB9´m÷Œp8ˆ&9"]¦Ràø2E˜·ä(k¡~xå$A§±Ü|s„ƒN†‡¬¶ ¾ùjt(´Ú݃Ûi@–$MŸ¶xyÛ¼kPÝ;ÐÎjãµ5Ó)1„àÁkôHÂå-&‚0&—¥ëEfŠÌ9t(pÜlSð@2¸"œÛ »b!'ÉÉ×Br ¿Ô`s W(ˆ’(‰ÆNRü±Ë7¼}¢æ•h,x›´W*̲§Ù ¼‚C OÀÃÄ: äFD˜ÿ:‹ÂÐË·R«¢ÍÄdbÒ\Éž6B×ùfçP®+æ”")é˜T]Ë ÍÙUù ʲT¬‚Ô$jl)JÅjªålÖ×™‘–{G7ÒÇ¢ÑþRgÂp\g‚h%Œ—#ónª–!c­¬ÅåÇeæ°F¢–¡4¢ ÞU9B]‚ÃI<3çaë*à†.cÅÑÆªFCUMdƒ$I]Åööœêò÷~jd†Ë÷ÀÖÃê§Iã™ ‰µ‹sDs…d±4óÚNb*ç‘!%¯˜ñòhoßñ µ‘Plôu}s/Û!K,†¾òçPY``$èpûºÂHÔ™wÁ±6aE¤œthpø…k@W;­+”…Y`´=ˆ/ Ìp{[v€Å_Y²o¥Ó˜ü¡ï asç§°¨dT@®ã,K¼òäžzxD‹{¦²Ïaó6‚w,…D÷уtÍGƒË¡«ñ‹+'r°xœMAnŠ^†M$•=Ö¶¯ÐA£^qm³‘â¼Aÿ1¡â]Èa€óXyœÍyÙ÷)ÿØ7ÔÆëV±wµ!7åj=ƒûïøõš3e¾•ƒ&•ÞÜ¥Ù>Œ3«å’¦"§çzGõ¬Kø³>™ô´™<—TVÜåÛ›© íØL" %Ï„=´/ÎïaðÒm¹ r庭¦Ô»Þq‘l»iâd-”yÍ=KSoÝòëppšÄêýŽö¿gB_ÝcÒp´½—¡ÊX7NÚ× ‚µƒÞBÖ,(l_¤»¹q%ŒÂõD¤–aJ¯>Ò¢p²K7pë×Ô~‘møb¦»ºË8Ï}ö ŒóÜ ˆoÛz”±‹¹GºäVÖÕÙ”AhnàPå¶à¨§”ÜJUXˆ3ÉÂ"\p˜eOß¼?ÿøæy9Ö*M5Rœcñ½¯„4ÍVÅQeJ÷i²’=H*œ‰Ä>¹J4˜\ò\~p$W”ÓGNC‡"3{Œ4™Þ×ëeŸ¡i€­B˜ˆgÀ¢Q‚ÈÌVg¦O™J™ù‡z¤¤­ETYkTyª,Pôå(’Œˆw9ÃDëÞ<ô³4ÌöIŸ+ˆ8 Â8>H’¥fdoé¿Fb-œï6ûîýø¨Älù¹k‰ŒËŸú ĈF£ïO…¢¢EûT.žØ™S«u×Z.È%¨L¬˜ÔÊGUxá2añ²å—ão"H¬y™ø,Yìsf ÈöÝPÈ‘/$ÞÙð :'ˆ<ÃÁÎy³*:Z“zo6m¢ªX–_dI—‹Ã¾ÔÁaÎ×À59M¡|8¥êz#œhêt<¿ûMáî M¯AÖQ'²ÅfÁ”r!Qn’Ê ÃNŠq˜_RœÌ;ú4̼ÚYDÃvt¢â„ÂÅ÷†{å^4þÞ!¢qi¬ä¼ðtK±†ÛäsJ {ÃÚá¸ûåÉV¾“¹ÞÒ†ý‡¯Á9üm æ|‰Â¸‚›&)ƒrÅf,Õ^åý9Yݹ(ì8‘R9ÐP`Ë×v àË lB Óbio¨´BÏg3Žgþ)¢¦D\PDCaüøˆÆzšjéÿoiRj‰L"M$¾».‡ÉR.$Ò(âà ù£Å3ùàHrÃaËŸ ª‡?ìy´UöÉ=O‰ÎÌ ¿(³ïï8è(ÈÐ}dЃ…ÃÒ*ã~$–û=õý>úz£‡•½èÁ”¦aœ$Yò…#5ìgñg‘Ao»G€<ÈÛòkç Œ> endobj 995 0 obj << /D [993 0 R /XYZ 90 720 null] >> endobj 996 0 obj << /D [993 0 R /XYZ 90 661.8223 null] >> endobj 997 0 obj << /D [993 0 R /XYZ 90 567.5758 null] >> endobj 998 0 obj << /D [993 0 R /XYZ 90 460.1785 null] >> endobj 878 0 obj << /D [993 0 R /XYZ 90 315.4505 null] >> endobj 999 0 obj << /D [993 0 R /XYZ 90 234.3546 null] >> endobj 282 0 obj << /D [993 0 R /XYZ 90 140.108 null] >> endobj 992 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1002 0 obj << /Length 2149 /Filter /FlateDecode >> stream xÚµY[oÛ6~ï¯ÈÛd,âDR"¥íiëÒ"C»­1tØPlÅÖ"K®,7I×ý÷ %Ë)m§†ER<ç|çN˳þäYY­E[{6[=‰ÜôÍéF!ìÇ[¾›>ùêY"Ïd$²(“gÓë½C¦ó_ƒ§Ë|=‘AWLB´“Pkد'aÇÁó§/¾æ™n { ÃlѬ&ÊïKž“Á-ozŠãfµÊë9O¼ÈkØ²Øæ Üc©Ìä÷éO.¦׉R§äÂ-§“±&ŠÔ™Ic!uœxÍÕ$L’àÏ¢k€§( Ê ?åû‰Jƒ¢æ×œž–åY­;\»ç)bä¢GׂD÷“T0ÒIp‰³×¼³?„ˆšàÏŸŽü-¾#p€(M²yÇ/uŽTˆŸª-òùýˆ©;üjCÇmÎC€&”ZÈ$bMŽuT·<èåXiX5¬/ðTF—k^Íù±Eõ•ï¶£sAÄ¿zfÕP~D?Lú¡ÒÂZKVࡊþ§1‚¢52™°ÅG±):>.Qce‚h*I¢Y´ß¢$‘Â÷ËtßìÀÀÁ”‹wÀüt úÈ+Ð6HÚ9›n|”VY ô„×m³p¸ô|ÌŠº+Z†äÛ/ž_¼zùÙút]ãúÓo‡e/çÊÆB›(uDýë,&Mõ„FøÇâíô‘ âÖSx2S¯KÞ¶5Y¢‡B,…TIâ>é|§f"Bßä%9ŽÐ©ÈØê’"Ï65?s~üH¼žû(Ë(Y&ݹuYyqŽDœ¦ÙâH±éÈA›Ž¡¢*g¯[ˆwÌH=+w&·äþ&d×Ì;t(à4”tŠÛ·É{r·¼}”#éOÕlœ#5²Wø?¯J||@òaOÿ1NÕ´+ø¿kœ£1‡—ß³qÿUä³åǺ©‹yU}¼) L– ¾)z‡[<ðPÝr[p¶®{f`Žø$’¨÷ˆQB>O[òf»F! – T²ª‹{U5p[hY:åzyÙ)nÌâwš¥=rs?pp›”ÙØq<Êg_¸e˜A+$ÿ™÷þ3Z@k»Ã™”¢?®üÉs¿¡PlÕn½|énÉ+;þž[Ój[x“ÐmI‰ÍZ§m›3—YT6ª2`éže·á^AF Nœ¡4œ×›*ç#çŽfó€6áZ.JPèÇÓeáãz ` )c(?Æ$ž Jé á2ÐÌð›%NÚ]*Ç’ US/x4G^òESÓqçÀQ–÷®ÅŒÁ >îVù]Hé¾7ÒÎÈáöŒNe±°YÒÛÑ^SÄÖïPþà)† ý¥ïˆPK)"Ì9{°!Ã÷Èðýª<È¢Qdüß8Ì8>a1ƒ ªÍ(m`wB ЧÑ4‘€¨.Ï*t¾_P)pPQ&2 îEŒ7'ƒƒ TÝWÀUø“/@0`t(î(ô¯4w›¸ú’ýtÍqAƒ½Þ.©:6®°5öA5VŽRƒ›ÌÐ7—\î—h︈Z(Ä]/6£ÓÐ5(=Z%”´é¾Q-°½@y»Ëß,a"™q^J\Ѧ bÚ´›Ž×\0ذÀGdâ†{-x«sˆµ°ü hGLW-»?Ï–}Ñ©iÃû²¸=zm1\>l †ì˪Ã}º•"µC/wÈöÓ¿á¢Ôœ¦òHcmÇ×ñ 3ê­\ßsñö§×Ÿwiá®+¶TOú³}½l÷ÙI–¿Géð!Ð4¾>‹MEš¦êÔVÄZ§CiÒmÑhkjE´|Pš¨Co‰•ÄÃõÊ¡>] ™¾˜ëÁ€†ƒnÜ(ÚrO´Fk«ÜâÙ")L–¤ÿV8_XÖ1T‹^öTw@"i…L¥•]Zïx«¹HDf¨6º“µ¨ß¶%¥ÉìÛNÙ¶ù2á‘×M»³lÉI ‡êÿ°r•¥f¤7ÿZ* ø—#3‡ðvÐÌ¡2IO¨ÁqLœyì뚺©©­ðqœ¨ƒ¦k±T@d|ÃF*·Æ@pÏ`ï!3G¸´ù×Âý?vNrí+ûPÿ’Å#ÞÕÞ•’¯û©áSð´KB®äð;à&‰qœ»tËØMÖt¿6›@§póHgY—³÷É«W¯¿óË÷;ÊÅ«—|ϦƒçüøÙù¿=ãÇO<ùó¥ó9÷|vùYÞ6¥ÚK[êzJʯ78=ÀègœÀ~ wwêlÛn?h—Š}7E- OÓÓ5¬knXê#L݈büûìè»k‘–Z'.Ma7HͶÿ1Ä{Ÿ3§õ«jW®“ÿœQp»ç~†ú7¥Í endstream endobj 1001 0 obj << /Type /Page /Contents 1002 0 R /Resources 1000 0 R /MediaBox [0 0 612 792] /Parent 1009 0 R >> endobj 1003 0 obj << /D [1001 0 R /XYZ 90 720 null] >> endobj 1004 0 obj << /D [1001 0 R /XYZ 90 660.0341 null] >> endobj 1005 0 obj << /D [1001 0 R /XYZ 90 602.2544 null] >> endobj 1006 0 obj << /D [1001 0 R /XYZ 90 545.0806 null] >> endobj 1007 0 obj << /D [1001 0 R /XYZ 90 279.8328 null] >> endobj 1008 0 obj << /D [1001 0 R /XYZ 90 209.5084 null] >> endobj 963 0 obj << /D [1001 0 R /XYZ 90 138.8809 null] >> endobj 1000 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1012 0 obj << /Length 1699 /Filter /FlateDecode >> stream xÚµXmoÛ6þž_‘20i¢^­ý²& 2t˰†¶h›¶ÕÊ’!Év¼—ÿ¾{!iÉQgè ¢©#ïî¹çŽG‰KþÄeæ_¦aèeQš^ÎÖ¾žþr!ôÈ ·+òýäâÛ·±¸¾—ù™¸œ,z›Læœ7+¹ §U#W8õÈ ÃÐI_Ü(Šœ›7ï^ñL»…c˜UÕz¤Î.ç9áìYè Ž«õZ–sžx'KYnåÅ¢$I¤£O“.®'Öê8žó E‹»Ž‰(õß.“qä‰0ŠÙ½»»_®Þƒ¿¿G½§hÄz+BOÄ>Cò½Y5rƒ±SÕsXž—²ew˜æÐ ¯­`Í+ò’Ÿ{D+Ÿ!H+œ œA£÷ƒ—ó‘‘Œzëª?qוV´€qUÕîiÍ’…d½ÜºèÔ3~M[–¸7j8f²ÖÁk6`DÊVÏò¾ˆÔÜc]“U~\@Cø(ŽS^óJ#tõïqÌê÷U]ÌŸBÚg±!Qh¢t ¦ßˆï€.׆‹UŽi¯F‹ç5© OöSŠolü¾ ¡J¯!Ãù×G?öµÞ"Æ 81Šo®a³»o¯†lΆ~fDaG1èwû^,â¤õ¦Î×y›ïÔÙÌÇA8Ñ"ñpBÎÚ­,xrƒŒeU„KìsB 9ß[9€¾·Ø pv¿R†ŸEgëgÄÍ-¼¬k$ï@\!b/ðý¨Ø“¡èÓå5kÌuä I%;öÀŽAÂÞœ­~ƒÙQ‡Ž“ÊÀÙp$þ ƒL'Àˆ‘¶P‹aÉ.ªn8óÛ¼*÷Œ&j‰Küƒ‚ÍòP âØùlJ_[uXû¤óƒ_¿†ó;;QÛ|ÿvuÁ2²dûÏËõ×°L…æ{ϦlÊγ‰Ñzû5lZÈ™:†ŸÏW)™àɺù°€ ð˜ôu ÖǺªÕ§péöüDƳs®î»5’Ÿ"j~Õ-ËóÁ>èÈùä:ßÔ"oÚ~næ%µ 3Ó-t]ÐÇ=˜Î'{¥S½9ÏS5_ª’Ž_DÒÿ+ [ÌéÇ ½ïô¯€Õœ¬éŸË°¸V…ìÒž*=Ñl§°Ê%Vm°øÓNsÃ4¤<ªVÚÔ)Jv71›ãõà”o,ð$Å8 €ÿžïȵ‚‚f)Ž+£]> ÇÖO÷ò‹6löÜšIgC\;«È×á›lE …tµ*‡<ÜÈ9•&ÄÄOLã?­Õl‘­"ðŽoº0hñ½,›EU¯ÍSiÆ•~šØúéCÊ_«|òæé¹¢ze°$M±);ûÄÉgnÉÀ[†) º³N,,>ÈèÎ:󠻎ñRâùaÊ58õМ€þgp¨Ç u$ØjŽBs>©àçÝ%óiaËûÐÍRxbœDæräcMsór—ãBÕªù»¬>uÚÐç/BïU¡¸èÔƒ+°¸æÝœãXCú4+:èÊ i85d „#'ʃ‘p޹ØÜ|Ø6[ÅU£w‘›Îå\2£Lò®åñtl†øÛ®:#ðpµÕ…ÐBËéíwŒš-tÆn ]P¤¤[Ë)iøuY™’ºD,Öì6—0ÝEÔÊ|ÙÖeç{¶¶'þ8Á×ðV¶Ûf˜jÇÓþ1¦‰¦Áo‰ä8ŸQÒréæúîG÷öŠMþ‹‰õÏˈu¼5%Ra=«y²¬ZèÛ¨Ö—:y£Ÿ¸Y±w³ä¹ íTÕ5™ÿüž»ªÄRN1רNK­›+å3Ì>žqí¶¶öeT ×7vÓÈuNdúø_èÆSA~QKP1‹ÎŒ0.;^w§ŸÕ¬5!®0<·W/,¶ùЬik®ü#›{¦q?Íú£æ–Ï  > endobj 1013 0 obj << /D [1011 0 R /XYZ 90 720 null] >> endobj 1014 0 obj << /D [1011 0 R /XYZ 90 275.6565 null] >> endobj 1015 0 obj << /D [1011 0 R /XYZ 90 201.0097 null] >> endobj 1016 0 obj << /D [1011 0 R /XYZ 90 128.4842 null] >> endobj 1010 0 obj << /Font << /F51 9 0 R /F55 27 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1019 0 obj << /Length 1888 /Filter /FlateDecode >> stream xÚXKsÓH¾çWø(WÅZ–Å-K¼[@ØÄTA!e,y%9±—ðß·_#˶€$•*k¦§§§ßt÷D øSƒÈ„žgG~’Õ™#äogJF#àuYþœýñW ʱ#'RƒÙâ@ÈlþÑz¾Œ×Ce5z8RV5yžg…φ#ß÷­Ï_=cJ³c êr5tCë6cš²î˜é9ŽËÕ*.æLxÀ’nâÙüñ8´”;~žý}6µZ®û;»åÔ°Ð(ÏvÀ21l<ñmåùÚ¨ŽK¿‘7cÏZƒ^®UÖYƒÔ¬Äßb7¨8Êí: \é:¶ç'$î“8kÜ™•´ƒ ,¿|ÕIóò’S6K]ñij>&ºh´8ô^ª,E§ŸAš’C¢„öØqÀX0L‡h6œxVE¾¬Qã1ÌS¨¦ÖW QGM¬¦”ïRó Áu] ] ‘f@+†I "A"„·ÜàsÒ7e&YÀàoe;‰ ÷g´&þ\|z¹È9B Ÿ»Æòl¸¬ÞÕ Í•x|!ß®¯)6è”*Îs d»ƒ€a¼ ô»Íà¾Ô‹xÔ\b™Õ|bBDZ—ŒS+›ƒuˆ¸Q-× Lzpçÿ w ÏËã¡æóÇb°)ïpדpvaœ‰Ã벡¸ønÐÂN¨ÐQ/qp‰«µ’¹š%Þ¤@”J¾ÁE êS/; (a+ŠTf/‹ihܩ층`œ#@w~ȰAì!î|²îŒ43CÈݰž·I±fBY˜"yÍboÑ!ÿ‡{Fñ63ûGû>9ʯêFVû›Òî3ëgàîæñ“tй^|* ¾°¶(«`¥û…6(ë©$ RQíHùê=ð&TeZ°27³‹ÙôõôÍŒ-ûÈTÛ¶yð8˜ëÛ!¸6Æ,»<€çÜ`lé8A[—8 ¬X¤´|?p6Ìéx\Dèá—Ae€ŽÊHsWºA¯VEÍsr9:Çk>£â¾as¨ùæñQ…9 ³$Üw´Ú yð5º]‡Çb•‘iEA^35fbRB>åޏ&,‹>È•@±ÇE6«æÅ¦L5& s˜Ž•µÀ}U¸a3W†‘¿Œ$-ÄJƒÏç}zǂᘃJrnȬ‰4 {ž Ë1ÃòßMÆN~"½!¨\™§}¨Ã.Å|€³#³v¸Ù¬ÝŠéìÀ㦠P`‡®r¾ÚÁxìbW§Ðr§sjùF]Æž¾ðT *we%+å–…¶kû¡”½ÍšÏ Ú9Ï×Ô㡾JEÇÊzÑÄžøîø@Ùž6¯åû²§QÙþ`{ŽúÓh‡&ÚT˜ýàp— oúþíõ£’ Þ~¼‡…IÌ0^¶=õ×’a©¢$¼’gõš¤»Ž‰w]隯‚ Ó¨ Oî²fI»éìƒ 3† ³¡>²ÍèYó Û2>õß„ýG9<Æv†zÈ£ïw7(l]ZÅwúÖh"ÈîÛXšº-vâ´G¹|J×jßxxû¶Ô÷"Î'kÎE”H2¬¸&­Îy†,ÆàÜñ\܉e\:F"g<)Í)r„6Ÿúˈ¹#À9eÓÉâaA‰qGǸJ‘eÕ©Ü5¯Pm®öÝX¾ëK¡57b°-vÜÊH—Y+i¶ÝÉ>/ƒ»j^妤ÓέÇÈÂÕ ýµIê¿©C‘-; vþ9·ó~A¢bzúìÄZ9Öl 9´ÇÚ¬çnåÔ;Þµq¨jyÇŒüàªä%W–¼SÚ‘lJ{·ÛBRÙð˜EmçKÜZø¥Iu¡+ƒõy½è§V±èä^®©ž%Cx|{`–ƒ+¹Î’oòÄ¿xm^ï™òáQwð-õB~gaîò—ªŸƒ÷pIè8½Ap¤îó0‰ù:T"¨è`rc!¹œK-Zöþœ•'Þ43§Ð…hJ²Qt PyЛ¢6¼;­XBÅañtŽÌ+ÿ”ÐôÒµäæ}N¤þ%ÚŠ≠“èÔèûqW‹¸Z’Ï“à¦üus$)~諺>Qò;ÞsÝT»{,õ>^¯5<ì‹Dßg+è2î |Ù×pgV÷ûQÂÿwúÑï/¦W¯§³ëòÆ©ØG”éõE—FO†{;PS dæYµ®L ‹¤ƒë[¡â“ê bÄõÝÎÇ1Ôø{R²Ô8+Ú—Ø‘ÄÃåÏuÛ`;ò çq£|/0o…=ûØæ§ö=#¥±hÿ;Dÿ„hߤ‚êMMš¦<»º‚ñ‹WÌÌøX쓨²Ú¼ÈØîtù;¾ñö¼^%Û}ør'vEØØ“À Z”hÁv˜ãȇXßùóòÍÍÌ,hñÊ3þà OAú bÔ]XTxËpÔâçØ‹{œÓGʈs½È Ý‘‰‚Th«‰ Åýóîâ²ïÅ›öCâeªz©ûE¢Knþ)›y4 endstream endobj 1018 0 obj << /Type /Page /Contents 1019 0 R /Resources 1017 0 R /MediaBox [0 0 612 792] /Parent 1009 0 R /Annots [ 1024 0 R ] >> endobj 1024 0 obj << /Type /Annot /Border [0 0 0] /Rect [256.7212 424.839 398.8426 435.748] /Subtype /Link /A << /S /GoTo /D (exit) >> >> endobj 1020 0 obj << /D [1018 0 R /XYZ 90 720 null] >> endobj 1021 0 obj << /D [1018 0 R /XYZ 90 720 null] >> endobj 1022 0 obj << /D [1018 0 R /XYZ 90 626.3745 null] >> endobj 692 0 obj << /D [1018 0 R /XYZ 90 543.8531 null] >> endobj 1023 0 obj << /D [1018 0 R /XYZ 90 460.7258 null] >> endobj 1025 0 obj << /D [1018 0 R /XYZ 90 416.4444 null] >> endobj 1026 0 obj << /D [1018 0 R /XYZ 90 360.2244 null] >> endobj 1027 0 obj << /D [1018 0 R /XYZ 90 277.097 null] >> endobj 283 0 obj << /D [1018 0 R /XYZ 90 207.1203 null] >> endobj 1017 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1030 0 obj << /Length 2549 /Filter /FlateDecode >> stream xÚYÝsÛ6Ï_¡·£nB” AlïÒÄîè&M3Žf®4”Ùl%RCQ±=w÷¿ß~ %QQR{b‚‹åb¿°ø-"'üÊIM²$…ʲÉrû"²ä?_H; #²ü8ñÝm*'2ETÈÉ|}$d¾ú¼~(wStfÊ †I’Ù÷ÓP)üôúí÷Lé€ÇਦÙNã,ø\1MÌôÇÍv[Ö+&¼-k`¹?”÷Ȧ´ÎÓO󽸙{­Ó8¾f²Œ “™IQd+!•’yÿû=J%®‚B™™Fl7У֔ ©„Qеe½_7ív ‹¥Áø±2ëª6<žóãÛçuµ1^î©Ã8YQ¤°è²iµÆœš-u&b'*¡Á8´ È4=°Ýó…CƑȞ ä•—]ÕÔ4 À1¢àáÇ;³6­©—Áý§—H΃Å R}ªq’H‘ÉôXã‘hy¾kŸ D8:Rc.KÒBä:Ò×\æù®*p&ðÌeàS‘ÆÖg¸ Væ÷HªÚå¾w¬ïT åy–Ë\ÓóËÎó|×t?ÈÎÃ\“LŠDSr~4 µ( %'ZI°3Ö³Ðò…CÆÑ,<xìÒĺ4á±uéÆt½7Ü{ ŽŒ£³LˆSþXí±Tt|×Ô>è½ùÝm…&ðòOœÐX‰Šñf ˆé¯Œè/$²N‚–,+7a…Ï•-Gµ jSAÙHŽj|a éìÍ¥r“fBGQ|ç;Z±ZLÔ=H‰A|Dø“-ЫúžI˲nj,çKVuÃgžªV¦žÆyÐUk$VTÑYž?`|_}F.SóW³7/yдcöÆX›ª G}ëj3f¸Dg:¶L°>I®Ú,ÀÅið‡éž\ÁÕØó6ˆ )T"½S70GI`žª}ñRc7O˜q[4socÈKxÆŃ–â“Ø€t ‡x#ŠÑ‘Ñ%võŒùVÈÐ3­\A¾ý¨«r¨‘ÎQk0ê) •êèÀS jåìÄоŠC¿gòâ€ç¾­Q»KöÐS­Ù;3"}“GF] ð¯i™Bëâ“äÒ°0ãÇë01Š(`±sQ·uÿúÏ~Ø:9gŠe{o:Â7¬3¿ þ=Í(¿q9ÇÚï7+&9 ¤,‡9Ï{êÁOhãìà \}$ÝàB@¥*„Ì]V;[@êH\5ótWPÐùV­ìîF*8—<Òi»2ëºEuÁYsœS°î^¨o$t9p¥¾ÅÃú¶jËi‚PðkË|àp㫟Ão¬p°¸•|f ý ,;7²B«à3¦–©0Ya…Ò1ƒÕW?Ãtˆ£ÙžÞ?4¸-6+~]Pþ~éw9Ø >~¬™ÞØ'êô`×õøàÉ æwå~ϳ¤aK+Ý?Œ¡Ó!Þ¦|+1ÒöüÜð¦jvüÚ´ç½_Þ&˜ …Œj4Í•¾C±î\nÖ£ù 54Wyf“Â6V‚bLUW¨.$V‹$Í®&V2L¬ûŽ4]lÌW§Ö}‡ìß”Pw ©ÝLv·xì>³çæ³ux¯Ô‰¡~ ¶S]°S í|(÷˜?!½lé< V‡ ½†»²{ø¢ùùÀ|b¶ ~M_þð°@ðPÑN ãB[—DY@ýâëGušDÀ†*˜§ÎŸu¹á‰-çnŸƒ Ñ­÷<älk‰Hzæq¬¬{IÁ¯½ìã¢_¨Ôé Ô´Óù©*†.2ƒ²7To¤ô|×ì8èî"¾èO•¦BkˆÏz¾«zœ ¼èOå°{."ôú½|z×t÷·ÌÎ'Kðì.&q @áŇ{¾pÈ8–8g/™{¡_éð@ÝmÊ¥ ï)l ÕcOðPŽ×¶Q0aÅ@q1]kOþŸn~AÈÊÎzÿên~xózv;{ýj>‡þòÎ^•ßÍüî·¿pSµ.—6 ¥‹PÛy¬vú\oÒëé§svÅ×à–KnÖÖÍt¡±WÕàÐSÀ,_íÙÊ~YZe?®ÛrkþÛUëõ'6èvööæýÝÍíì×okL‡ fàÉzeZ8Zø•Nu\ЋHË|Rw^n{ìÃÍO¢º¶ÞáNÚ1yOø 5ÆÊ¬è ³õØ5‰0¥)ÈRòc>»½+ðk øÁ-#hëÜ!ÿ'Ž %Îtp „ÞÞÀ|Ámü¶ýZ‚M{ÛÀ-Ç'ÑÔG÷°ìø“Úߊ+>·‰‡4º7úzíZ@OïàGìkŽE´È´gÚ÷¡ÎS¾€A@åŒÖÐîmÁ ˆµð¹’*˜[ qLÇëàá‚o$ZœHÈ7È@÷ZKZM_.¨oêœãð,Ãø4|ãå¾yæjìô?Šë’‘eN^qT ©g4îŒ}]î 'éÆ\”I‘ù+!ºG‰³òpo¯ýèµkxAô QÇÄ[øx°¸Û–c7Z@,Üâè=ö™ÂÝXã”@2bFÞòì úb ‡×Z‘R'ˆ+w§†«÷/|¹ê‹pP²Ò†Å·¿„³‹=ñ|Ë”» ÍÛxÑã³Ö2îYÐp‰»Ù<l¹Äe£0ˆ X÷™¨¡ü…5ÃÔ¦ G±9Þ…*ʇi¬‚QºÇ™†YN¹ŒÉ®ó>™á Ú%ÓŽß±Lò®§2ð+S«ñëD€ïQ¡\7éâ ÀP’j5Ì1eÞ;^ «Õ‚Ïšmioc•Ê“»WÚnQLÓ%¢ ½k:Ã|‹ƒôó–çÿð=Ï›‡3mÙ š;ü¢äSÑî ~¾Ä­l«õw´,š–>ì;§Y߫Ѵ-$cMfkjßZùz‚ß!´ú?ñ g endstream endobj 1029 0 obj << /Type /Page /Contents 1030 0 R /Resources 1028 0 R /MediaBox [0 0 612 792] /Parent 1009 0 R /Annots [ 1032 0 R 1033 0 R 1034 0 R 1038 0 R 1039 0 R 1040 0 R ] >> endobj 1032 0 obj << /Type /Annot /Border [0 0 0] /Rect [167.2123 651.946 331.7153 662.8551] /Subtype /Link /A << /S /GoTo /D (References) >> >> endobj 1033 0 obj << /Type /Annot /Border [0 0 0] /Rect [359.8606 651.946 518.9697 662.8551] /Subtype /Link /A << /S /GoTo /D (hdefine) >> >> endobj 1034 0 obj << /Type /Annot /Border [0 0 0] /Rect [166.9941 638.7953 325.1761 649.7044] /Subtype /Link /A << /S /GoTo /D (hdelete) >> >> endobj 1038 0 obj << /Type /Annot /Border [0 0 0] /Rect [240.2413 300.8023 427.2738 311.7114] /Subtype /Link /A << /S /GoTo /D (emodule-sort) >> >> endobj 1039 0 obj << /Type /Annot /Border [0 0 0] /Rect [455.6607 300.8023 522 311.7114] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 1040 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 287.6517 273.3579 298.5607] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 1031 0 obj << /D [1029 0 R /XYZ 90 720 null] >> endobj 1035 0 obj << /D [1029 0 R /XYZ 90 629.4868 null] >> endobj 896 0 obj << /D [1029 0 R /XYZ 90 531.8379 null] >> endobj 1036 0 obj << /D [1029 0 R /XYZ 90 461.0964 null] >> endobj 1037 0 obj << /D [1029 0 R /XYZ 90 402.8995 null] >> endobj 1041 0 obj << /D [1029 0 R /XYZ 90 278.3431 null] >> endobj 1042 0 obj << /D [1029 0 R /XYZ 90 220.7523 null] >> endobj 1028 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1045 0 obj << /Length 2727 /Filter /FlateDecode >> stream xÚ¥Û’›FöÝ_1o‹* KÓ@C¼µUglO*¶S¶ª²ŽãFêƒPòÌøë÷ÜÄxìM©J4ݧOŸû¥Qg!üÔYž­ƒ<6ælU? eúÓ%# ü1ÈOË'ÿzž¨3y˜«³åõÉrýÁ{¶)v åõvá+¯]øZkÏü¸ðã8ö^<ûõGžé7cq ³¶©‘ñ>—<§¼[z†ã¦®‹íš'~-¶r³/n,NSã).>.yr±¨N¢è1¾ä”1)„À™0–fq tœc&@r"úW!þ›…Ÿ¤ÚkK|¹ò»m±ë€¾Mƒï=’ŠÆÂqFaÆJÊ?Ã$lKÙ¹izaûü•ù3ËæÃuYÙmQÛ«åDþ‰ Ò0v€t•„¬„ßY t¡tf¼·$U”ÝÚ¶ NœM½Ž&I[4D• °)CulÁåO<¸nZ˜­¼è‰$BÕ\ó2Ë>.0Õ#Ö9YD9ŒÌ…Dò¿g™ Ld´@üª¸r&‚ÌD‡C®ó@ç±lüσ¨Ýá Ô4L¼ËkfgKŸù:VIµqÂM¿N‡å‹rcãÙŽK„wàkü C´öØz£$BœÁ±ÉUŽÖ „ÓêÈ‚˜?†›qÏtÈÁ;»êËf˃]£Y«0å÷-*þÊ_—ÝÙ,Ð7ïaðQß‘û!¨Šòcòc1ÌOèŸñÀî1bIžq€v$uÂ…½cb·qFê‹2äy¦§¾A¶z‚V)®î‡ØuÀ¦4þàƒQ˜Ø</2Žݪ¨ì7F†%z_\¼9Ä…ççÏ–oÞòÂ~yÏoüòÇ÷Å‹wîã½fᤃ£Öu >eÞ¾Bw.wÚC¹½á¥²ïx@B*¿¦+ÜqÏ+ÏJEÞ9ÎPT^Yn,®‹Uß´ï…hˆR¯Ö¼vÅþÄkì\ 擦郖=Zðg< ¶ÄI*Eâ‰DómçgÊÏlj9PQ E›iï=¯PÒY Ô”?ª•³0ž¶–í…ÎíÁèš­ÿ… Úägµ±S^ÄZÞ$ñþ²=dk¯ìøI ÚÖü>HœaLåáÞÀ‘oeÿ–Ÿw‰â0mÕˆ‘º÷˜[d§Í×8ˆ‰Ž§¤2ÃèŠÁFb0èw[Ýóh =ˆ«dŸÄán*m"MQÞ!Óˆ©e)['BÌF&›ÍªZ6KR¼““QN ñ—gäj%•1°CeÂg –ØÚ¢âqæÕÅ'2ß_s¯S'q Üx®B¹¦*)Ç[èvÅŠvÊÙèÕÍž‘ùkÌä¥óJõˆ¬#DaŸá„ø#¨6¶å¡$=ØG»‘l‹­ÂsKe ²UƒgÞ¢‰ÙõS\0dýáŽ—Ø Eã *@šs¶PuáëQp #‰–ý!á'4kÎlô`‰!å&ò®öH¹WH{ J0%‘„Eª²tKËà /¯Š=%Lº„×ÑŒæG{µâ{^=°Ç[Ýú²`Œ•DÑ Cv OBx×3Ù¬1ŽŽ¿Ç£'[Ê‹’pª²–ÈÏ&Í‘uý¤˜»¤h·_OŠÑ()"ìi­Œòbùöý÷å¾Wâj£žã¨ŠEY4¤ì濽ËɇÂÿrˆ•@ 9OÇ=P!reF²7žˆÍu+¾ØvK¨ ÿCªíÉÕWH>½Zhå}úÖÒÃö¸q%,//_]|—\Ï×WûM(2ùÀ/ŽW"Ïrü ç2)éLÆ€¥ìïGjçý@¾Ø·ÎʱV£} ?!Ž®…ÊdR ÇPåæq*5?24Ç ¦¹Ò‡¦!¬1‘ØKЦã-„^ÔòÀ„•:Ô$P^›|gjæl¨´IÅ÷ਓ ‹M æ ²b/P“‚Yh(êOz ­³ Ž€c¨ U&~ ™àü1àL1~ŠpÒN •&)«œ_>t©Èî|2qbµ¬>J”qµDýr¦´:iæUäin&,Ìuôî1NrÈ ŸQNóä¨:>•¬JSh-bqšš$;ÀùcÀ²NN%‹·( ÙHIÍ?õ jÍ`š[3)•œXƒ34锿QpÑ|ŠpåIàŠ"‡ôë‘KE®fKq#@E3­ÅfíÛsF1B`óu9¤ŽWÿ•¼ñZdúîå›ß/~~qñîãwvO–Òd6JP’e·Emù6H‚U+×X ´Ç»´'ì9ðZòx”SˆÈ°„º¡;˜²ßÔ<3jOqBŠx®[ª#n]¹‰Àn# L€pü¹a|ÓSáõ”%lrk[ ”$B\ÁÐÇR;à`ÅíåA™ÂȈ°L]Ü•µ4f4Á·{•Þ~¸7¹q¸%0Òꨒù–j‡ÅN¬K†ÃPu,~<Ãk–x—½€|^$)ˆdït¦&Í*à:Ô£™ŸÝKÙ+õ¶Ý2¸¯øÉ·œ0PO±—›Öô×1¡7ôÀ2“§s<¯íªåìØ êÏiÕaะüz[V\¹ CŽÝìpŽ7˜dFV­XçkÁ/Àl^0˜('ŽZq‘ zBNeæl?oÛBÊçŽÍ—/qŸhJ.Ù¶Ì,IÐQžàÀPÿÅž¥¨­§¤ãÜ{«/ß i` ¡Àe*©é©4Yaë²™ÑýAÝsW’q„‰É¤°Ø6sñ"jªb#0à‚3ˆ|ÆAj¢£,u]×F¨L¹¢GòÄÚ‚Hk…RÞßn¬4FšBêÖÒ=`#“/äöÈÕ¹“¶!>U‰=ªs°~n%»µÏ&L¦²Ç’F4M¶ærw½§”aý]¾ôíU/쇭²ÈÄ•ßΗ/³ÏãÜkÌÿO¾ÈÕÁÅs‹–2:ž›ãUk/£!_Àø¨Ëké²â5’5Âľ€àeWªÜe€ý†ÍÊ9^\,_–rþÈ’óqƒ5¢?Ô¢ý/¥øž±‘”P£öM[Òýø$Ò~AîÉ> ¦µ—ýq&\Ž{Ääò ‘ežÓÇÉ*nþ'B<ÐÞq‘Œ‹}qUÉžÑ=/B=|[Spx n†oSöÖŸ3¡4 ´õ£1Ü—†)Õ$Ð9¬aHÕ×¾_äAf’ôôÓ…ªM9Xpá:,"@Ë7üDÛ¶ƒÙd¤¿ƒåøëqFÄŒ ¦M*BÁ&j|XÍ5È4 "9€|уv‰´¯©;¤¾FóLºÐ!w“ãËzGwWüí„ïC¼ç«ºÏ­ÝÝÆ·óçùbòα „n\ÂÐã${…2+÷À4GC¼Ä2pDQ!õ|Ò¦¶™-/]cÅþQ ¸¶ãï£áð[=_Ú¬bìØÝ¾nÇ7U+W’Q°®:s“î¸lQxQì=d© ô$iâ,õ‡yKÒÌ¥=Ò[„Õ¯Y …+2\¿FÉ!4˜žh‹iþø{DO˜Ø@ƒ]#;’B¬8¨Ó!Ø©¤›¹õ‡›K’eÓ†Ú}óZ—ó)8UA¢õQGÿãÞ?¤ îÖ†T¹;ªb;`2XK’e›£l+¤®Ùû¦$” endstream endobj 1044 0 obj << /Type /Page /Contents 1045 0 R /Resources 1043 0 R /MediaBox [0 0 612 792] /Parent 1009 0 R /Annots [ 1048 0 R 1051 0 R 1052 0 R ] >> endobj 1048 0 obj << /Type /Annot /Border [0 0 0] /Rect [254.035 635.0646 432.4129 645.9737] /Subtype /Link /A << /S /GoTo /D (rib-display) >> >> endobj 1051 0 obj << /Type /Annot /Border [0 0 0] /Rect [338.4246 348.8902 518.9697 359.7992] /Subtype /Link /A << /S /GoTo /D (sleep-until) >> >> endobj 1052 0 obj << /Type /Annot /Border [0 0 0] /Rect [166.9941 335.7395 315.1761 346.6486] /Subtype /Link /A << /S /GoTo /D (clock) >> >> endobj 1046 0 obj << /D [1044 0 R /XYZ 90 720 null] >> endobj 1047 0 obj << /D [1044 0 R /XYZ 90 720 null] >> endobj 1049 0 obj << /D [1044 0 R /XYZ 90 616.8376 null] >> endobj 1050 0 obj << /D [1044 0 R /XYZ 90 466.7222 null] >> endobj 879 0 obj << /D [1044 0 R /XYZ 90 412.904 null] >> endobj 1053 0 obj << /D [1044 0 R /XYZ 90 327.9359 null] >> endobj 909 0 obj << /D [1044 0 R /XYZ 90 206.5461 null] >> endobj 1043 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1056 0 obj << /Length 2377 /Filter /FlateDecode >> stream xÚ­Y[oÛÈ~ϯp¡¶« çÂÛîS꺛,’tѨ@€nhŠ’ÙP¤@R¶Õ_ßs™‘2ÛÈbkxæv®ß9gV^„ðŸ¼È‹Dk‘™$¹(v¯BKþúJÚÑV,ÇKþºzõæï‘¼¡ÈÂL^¬6“CVë—7ù~!ƒ¡\,eÐ-–Zë ùi±4Æ¿\~ø‰)à ¬)q Ô²Ý-TÜVL“Á/ºÄq»ÛåÍš ò–lù—™8N©åâ?«__]­<בROÉ…K –¨ ©E’YÁâÔ©MD‚%ÙQôWJü«Ë(ÖA_øµ¬[üÉÃõrŸíy©±Æ@§*a˜):÷÷0 áØžÓ¾–É¿½]½“¬$!Ó‘ö &%þ³ÇO %"Cd‘QÈVù\=Øö÷ÈW™wÅB¥ÀÑÐ`t1~là£íx\€öI(ÔûúG FI@Ê»ÐÏÝq‘êÀÎzj`:1(Œ4@ªËÞU°b ‘Í ˆøÛ"5Á[üC3ï*$« ïÊçCªfÛ£è¨Ê±”ÛŠ|¨Ù‚ªBE\Ü”<&ÅÂT¾Ct¨ƒvƒ¿ Ø•ÄîÐÒñn ÐòþëÅR‘pHïY‰ãž,ÆÊ]ÙïaOðÉÈW^óÄÃÈ”qªÍ#a¦±#„*ÒbÓy]~ ä víP¹]Äí——B((C!K;»èìt š u³=ù']†Ÿ›¼@_åì’/üƒ ®ËM~À·—Ü.¢6ìîPDÈ,…ˆ„qqÓÓ¼A ÁO‚z´OÌÄúàÏ`#fÁŽD 8I›½>#¯‡1@íâxk‘w^ËÓw7a9-\Ÿ9,C+ò$é÷Ql3RhÍ4‡ÈÚ¡ øáwlºiÔ?˜7²´ÒUÀÜ ,>Ëâi#_“M}õ?;BÜ›L[9Ã9(MtðyÏpÇÐeÑÛZì?’jdˆ#ÜŸÚÚàìæ›à–<0Œ¢ØB€÷Žvƒ8–‚‘Á@ŽùÐÓ1tØl 95ÒïnÊÎ œØp¼­ˆ¬'\A¦³–°!cò+,Œ‹‘ß•Ÿ6$<²Ì:²ž˜B“A ­#ëÙ˜ÆêÅ]–sÂr—ò`ûñ@–b,¡ o"ÛNwŸ2E¬rF‰‰ÑCSX­Š©ßrzú\|Ã6_ü÷‡Î£#¯Æì·8¢|­­=p°±šÂ9HÏQü×4´ßÛѶAg€Y·Ï/åÊæ–9l<ƒýÐAÑò"¼¶Vè91O’´ÿ”±»#ŒÍËË‚© É¯ç34U#™Ù"~gøS‰Uê½'ùZ:‚{Þ·Ç.Ñ®(!UP1wS*T–º:àgˆž0œ\dU £Êjæ¶ê«k*.-[6ÖT¬DªA¶‰Wn}³Qb—±‰FË Î5–L³̨³ Š–5œ“`ÒY­¦©H20#KñçGÕšŠXÇ£Š†/ç°7Ê—Ÿ†+ô®¥üÃðß÷>bïÇ+rØ•ùÀu6mÐuY` «™£âdêoå½Ë&X&×6FùÎõa\½GdÅ6²¶Õs ŸmõTÔ°þþéC׸ ðü+çíÃ#)&Ó©«Ÿ7œ¿:ªœÅ9‹R‚M©Œ üº­˜°Ë}gP5å³þ)‘Å2rQWÕ³Þ¡„Δ9c¥¡4@i:…f‰Ù+ëªøz_c˜h˜$ Úšªv• ­ÂlêwèÙm÷uiË›oØŽ8ɀݹDù]žXO¸)kü¬Ÿë°ÞúæçwW>,/ÿññãÛO{´^Ý»DQÐéµeNCIâ¢ì*þõéý®„Õp+/?8…øæ–¾¹&ˆxÓ».Wp)0ÿÚîšWÃlg»im§â"ݦɖ‡¶|ÞS”6çØg…0oNs×\ÈòÇ¡9å_.û Æ° àƒ\kVvw5ðïºu=1ì$é"ôHœêMK›Ž;>¢š G9aÒÈ…ðŸžlûæ=΄‘H¥ŠŸr¹Ôº\M,—û%jõ™nW—v=É·zÿñêeÍ—÷[Y£m CAìækç6*>qé™èƒ?(¨+;Óû7ŽÍÝi5k±}fy{ÅnÕ nBé4ž’ÁåÜÝy½œsHäûˆ¢˜À»O¾fÂ]EM0‡cŠ÷>ü ÷ÌÍÁ¿b©ýó> endobj 1057 0 obj << /D [1055 0 R /XYZ 90 720 null] >> endobj 280 0 obj << /D [1055 0 R /XYZ 90 720 null] >> endobj 1058 0 obj << /D [1055 0 R /XYZ 90 601.662 null] >> endobj 1059 0 obj << /D [1055 0 R /XYZ 90 479.4593 null] >> endobj 1060 0 obj << /D [1055 0 R /XYZ 90 400.042 null] >> endobj 1061 0 obj << /D [1055 0 R /XYZ 90 273.0837 null] >> endobj 880 0 obj << /D [1055 0 R /XYZ 90 190.9391 null] >> endobj 1054 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1064 0 obj << /Length 3076 /Filter /FlateDecode >> stream xÚÅZÛŽÛF}÷W 6Àš,šÝÍ«óäõÚÆžÍ 3À&qü@I”Ę"’²lgöß·nÍ‹†r2Ù…Ùl6ërªúTõ¨ þ©‹Ä»ˆŒq?Š.–»Gž ¿¤äj3æÃ)ÿ¸}ôôU .”ç&^¢.n×£EnWoÛt?SN›ÍæÊ©gscŒ=›Í}ßw^¿xóŒGÚ-ÌÉðF³j7Ó‘ó!ç1åyÒ ¼®v»´\ñÀ›´„)›CºÁi~FŽ2zöîö»G/o;©­O/œr_±H_(ãz ™(ƾ«Œb‘‹âhú_iüߛ̓Ð8M™îk[á`‹â€‘ôÐH`F­Ý8‚Q\ê/ðè­mÕŠªÏ¯æ—ÿd{¼º|óò_ϯ^ò“·¯¾ÿáêù­ÜüxsùóKžöö§›KøêÏ/ß½{ *ùîÈ9A䆞º‚^*ðØC7éLÇÎü<à9)ÿ4(?Z¸—Ìsªµ,Œ¼®ÁNQŠ‘ÏYú ü †2//aM€÷³©Er}_ÛEÑ YbbåиFGve´¨Õ¢­s‚ ÅEàçvúƒQV‰µý Z=‹}çvÒœèC#ÓÓzŽs.æ&T®gÂ+o»¬ÄÑŽ‘rÜ _Vû6¯ÈÎÅ·0'NN“nxˆ$6… pÄÙbh°qFXʬ½;öp²b÷T<òk¿«êOòý@Àdö-‘ê‡çW.Lš˜¤ë…að§ìo RÀn<&@Ó‰Nù®öuðe¿$Qhîû%–ä‘x½("²šòŒm/¤<þúÍ|3>20÷<´€6µ>ç;GŒÉ|‰ÞÚŽ?Ÿ3ëP~Páûd’f9ò¡Äß\ƒÚ*ŽÇ&¢‰4³±b!U-:N³º•¼Áy²É8&ÖìtxD¥Ô*«x ·®Üœ -/7ß~¼“¨´_¶Ì”L—=¼q]ÒWЬÆDI `*NôqTW‹Â ³ãácNs6-­13Ê=ðÁ`-¿%S4ü —ßvKù'äC$R¡Ù¨éÁ.$/,8QO¥Ë]ºß[•)#×åª4²fA^¿`yqeFd¤û¬Q–§ð„áÓôNþ ‚Ĺ©xsòð²¶P¢UNÊ´Æ.X|%™ÐƒrNU¿ÇM2b°˜P,‹”°þ÷ܺ:€Oøá~[’®Rþ9! ´ “¨õ0Á(¹È@Î[¶² #‡ Bçß´¿l'³“‡Zøÿ©~Ÿ¯™ŽŸ“¤'‡Ý¾± ËŽBzòO"ùš,Û´b ¿=á ~ñ†pÑ20pX÷‚ §ìÂë •8'ÄÎŽüæšgÇ7´É§ò©)Öb"¨ûŠòT‡O\…C÷T ùdTÔ¢™¿ ùÍu›o¶Ràâm—ð&/—U]gË–xªú’U`Ü@%Á_R‡°‰³:X®"ÉE'ñŠ\#¿¹š³éøŒè;$8<²¯+²­Ç¦]1hTBuªqzì ƒïlî7Á˜8ƒ=-«K4>ÎoªuËnîiDp[¬aÀ0¡„wÇ[ ôùÖ¨Ö<˜Ö rqZf6¶zúL걋œKyåL_çJ¿×ØÑ@Üâ®É²éœÓµStŸ­7+è2ÌôƒÒn2 Èåºdr7 ux¬ÂBp_mË7ΰ;è¾³:•3(]*³Ói9<(õm‰þt‘—O›ídó̸žQÖËŠ¬@ÝPÉDPå™ä„›2ñ1÷È‹îë xzM”y£×Îõ ÿb¢HÛ”gÁöBÝœ?³;$=ÃPÉmqƒ8€˜ùžÒžímMAAÇÆÕ‰oÛ™ª›ÈõbÝ¡€U¾·˜r#›6~:·”}ÚUú„œJ";`ÞESp}Ïé@ËžŒ5&Þ¬Ïô4á(Ö_'ÅnìÙB|œ£„'<‘l†dEǧ…)ÒÒ–ÁfàŸ.ÊŽ6‘úkya;“47'AòÕZMu˜äH€™RZdÒÚ'ØÒÁ@*-ñ&ÿœ‰x+¼Ð`*°[¶Ü —Ê÷c¶’¹Ôù_ë¯)ì ÁÓq‚ó@ ÝÀ,ʘÃ@¶F…‡åô-øñ1?Âf Ä«¯ÿÌi‚’ÓHìóf›Böþ£' ƒ7î&üV•wÕz}×V›M‘ýçaY‘--CFl3!°‡9ÆìH@–êþ|Ǻ|Kƒ«ÁŽ…om¥Ñ³ו²|Çkà†±²ƒ:Â4q'ý—-¬ÅÂût™ýQÛÒ\â·ì°,òU––wÛOû¬^TE¾¼kö`‘|™5mkñ.Ë7–ô¤ Ì“6¶Ê£Òƒœb»+DF‘Á~S¸~±¢Òï°š«É†E¥Á¢êlspÊŠÀ\²êh};ÄçÛ²ºÛVuþ¹*Û´¸ûÕ-ZóTUTPF½“‰(w %<ì¬ëEUJvØr>Å~ÞGœ6<–òÔƒ6?bãb LÙª¾g³yÚXÒ.ˆ÷-÷æüÉt<¢!<‘S á'ú…¼Gî/³'SµtÓŽ›C~«¼Iûz5EÝ·´/ …IÐ´ÓØqE.`,²uû”& ³—™8.áÙ ÐJ^eïdŸºdø'Y˜ª ®Dèßöo”;%('TÀY[êª>e.Rµmµ“©ÒYÅþŠ••¤bù¾¡cÛ'ýJ,–Í—L (_Ú§ýIˆl4\‘øµ(¬ ìþfU?ãÆ)û-;¹Óò¾  ½°Øðç€{ŽÍ«ÄÙ`{ /ºÜñyC䨂Wbk’„únhKš©˜ýÈI ¬¸û‚ŸbœàÕ¢o—ôeJ×ÅÀÍÊŸd2Tj¶G´û^ì0ñÍÛîÏ VÒ£³‹$•Š©“® q‘DA2:)×…îA~]ý žÃå/×üÈâiË·…LˆºC+o3«òÉØê‚GA·âµ(‚zŒF µÔFŒyÑŽ>Ǭ;„;Ekµ|³D¬Äž³¤»Z¨ ž¿óxÃþiÉü™œÚßéæ­‡_jpÊv’Û]×=— ãÈM‚ØŸ(gæ&ðä]Cˉ[…ð¨ÄàA¸£ ÛV¤ý`œ&WU¼¦|ÜråÂÝ•Vª›·°Š©™üÓÿµ?F‚ !è š„ÓÇð!T3a÷ @P6²›/‰­LY!òÜXuGcçÎáRÙ˜;¿–‰ÝÀD¶J²•_cí >Ÿ•ĆŽÞªÓ“à¶NK«7¶‰ªz×Õ‘?¨ÆÆçב«ß·v¥ªãd©Ÿ3îÎÎÕSnÆqçׂŠQ{¾ØB‡^ïx¼!®¥CÞPòYÁw\ODÖù endstream endobj 1063 0 obj << /Type /Page /Contents 1064 0 R /Resources 1062 0 R /MediaBox [0 0 612 792] /Parent 1069 0 R >> endobj 1065 0 obj << /D [1063 0 R /XYZ 90 720 null] >> endobj 1066 0 obj << /D [1063 0 R /XYZ 90 720 null] >> endobj 1067 0 obj << /D [1063 0 R /XYZ 90 395.1976 null] >> endobj 953 0 obj << /D [1063 0 R /XYZ 90 331.3624 null] >> endobj 1068 0 obj << /D [1063 0 R /XYZ 90 266.9211 null] >> endobj 1062 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1072 0 obj << /Length 3172 /Filter /FlateDecode >> stream xÚµZëÛÆÿî¿â XÛ}òáÜ8).ò¡9 àIÔ‰±$ $åóùã;¯%)e»i ÇÕrwvfv¿ÚÜhøgn }“9§ Ÿe7«ý -Óï_-aÅrºäow/þüC07F«BæænsFäný6ùn[&é«ÅÒ$íbéœK²W‹¥÷>ùûw?½â™~ k*ÃlÕì6K>Ô;U(ØY¬³tȯ:è¾ÞW@§‡ý]ß±äëj×—ø‚UVê¾.wüîØV›ú#ßv§ üxtŒwv[!S©Ö <j‚æ+»ýš¤^•½0¼L ¼¢²çQ¹Ûñ/è°°yÒGÙúe[í`ßšìIî®Ã\=_.–Yî’Çm¼Ý¯íªcÙŽ[ï¶Hžä@9xGëË®¿¢¹©£†æÄʃԚVvDuÕÔ¨ßà“fÃÏ62IÊ x¹ûê%‹¤Û6'x½[ó›ûÅ4Qñ>4ù¶Z‘øëjX ž„ÎVVv}[“ÏÉdS§¬6™p*7;#Ë•µÚÉ:tX¦R•[5“ÒÛM³C¶äæ ùó&Dþfø…ÒÁ #›šeÃ+—ºÈÆ_€lHÁØM‚Òâ¿jã[¸?úÁ.2XOÖ?AÖ½_Ç+ .ýg¸4i®L¢¶¢SÌðé5ºu…àÂi^$¯Ñ¬ñh FmE ¥IÉ6ÀúÔFeÚeç¦vÄ5;ÚÎAÇí­Öéb¼áhþÎ8 i ˜mh¶â¥eû€&ÅnÃùjŸl60 Óµm{¶p÷Šv¸Â‹}/›½ýäŒ*ÀsÇVÚ ‡ëŽâÍÊ|áU¤Ì‘éVå^a,Éë¹É‚ >D=É%Mn¢éÿAüú$iä3ûzÐ)®/÷Gq[xK«? :ªö‰)\™âÌs‡êy‚Gs7Oç‘ä_¶qZe6ÍÏ50Dd\9 €‘O‰ƒÂ2sj4’ÑL‘`WõK¸¹Õ{æäOr@^ïªê¸<úzw¶`F&3Êff¤mxGÓ²Pô\üq™¬Ó×d²Ê{c¾,’øfŽõ¯á€±zjµÏ^_®|î Ùñ×9¢æ©TVè‘ÙÌ.*‹œŽƒ+h4ú¾!¹FïºÆI‘¢¶ü‘Ò\ÓÜ™p_¾"Å+αìÒáE; ÈÀg*3Æ3¤EÑÔÒ´-…ÏC·áH µÿ,z5£E¶¸ Ò¡Ä¡ûߪUû†pU!¬å_.ٴ徂3¶ý¶m uT¿µÝÙhÙA¯Ö¿ÓãSôûħ|,|ß|\ò‘¿7mýPdùÛu?{h·oš~ûî?CϯŠvp¶-tRòcOhëx'ÛSÃÓ¨ ŒrjÝ^â,¼m©®lqú®[1%ÿŽ!(EŠ ÀÐ’ߢ Ãü®ÌsÀ1>:Àp)sP)¨âáéÀj¤°95­ÿA)åÎÈÂi…¨!Òà1¼Â*ã@•½äGñJ솤gÄ ã–*?Ö€EhD"§£È(É·ÝsBçWÌ‘ôŽ€©Ö‰ãÇ턟šá\ÁP¢Ù1¢ ê Äi²­û£Þ+¼~ƒ*‘Üý@£{‰À2q1·ªÎ‚5‚h²¿ÞKµ|õÐe^Cj‚©7¤…ˆDmxBA!¥ZMV >Äç㶦7Ô·E€J$‹ñ àìI}8šœ”‰…( ”Ú–è’pCw‹Ü%Ó¼38ˆÐ+<¸'¿’Sh)¥ßX2eØX)fêãæ8^ Etî©x“K@)&‚‚ªþºëËÃJ&†sÑ«¸s!ñ´:™!â)¨¤«žç©]H7¿;†:༿ ÂŽGŽ­l'ÈÓÎ{%xSã&•‘™óŒ·Ü«¢ÜjYŠfW¯d1ª7si¨7sþò{˜:­võåè.2¹) ÂeŒÜ¸­–mè§éõcI€áÎÚd´uÞƒª™1GÙ?K]Ìþݱ\ÍïËaáEæ'‡‘†­õD|L'(ÉCÅ!‚ic¬¢Ý&ÿ¤à²•¤È£ØÀ,æ/”ÖCë‰áâl‹*ƒáý?¾äˆõ´È}"ãÛO1ä ‹¿jÐJޏ!Ꟙ¢¨ÑXžÆ~ÔÛ6…óÒ ±‡"£ãH#Ú?^¿¹}ýó/l”8ñz&e.Pʨ‡sàœ"‚UÚ‡Xs 0ùJÏÅæÙE×ðV4Ê™Ü^ÒØ=[\å²2’Š}UìÓÑG@¾O‚­WÚæéyPeÝ@BÝ‹âáW'XE»Þ< ¹Kcè`@9âÚk¥2¦uC€éULknæÅÔ¯:LdȼšSgÛÍ3ÚKË ¹‘çLº“ Ñ\û:’Cõ±ç¶L+j2c£Ÿª÷£)‡Qn^y1ZX¾/c—~Œ­½.jjNðš»l‚Ýpâý†ž("¡6æL"+”5Cµ:©«æÌ!MU|LidÉ.DåñÝc‘‘†pî$Ì̵¨9£Ï¶VŒ*RmêXÖÍú}ªò¢˜˜úÒ:‹À‡"(‡M=®ñ{Žc_C ܆ŠÃçtͶ%K˜‹pæ…V:óa(¼® Å¹BÌ*8&:ë·ÂèªYÂ%ѹâä Nc”I/cδx5ì•/Ò¯¼S¸°xý©blZB¨5Õ¿Ü9 l7|LšÓŠÎT–™âkÅOµ’F,¸ŒÎLgãüy!Dü5òÜV±Aª!zwªVX¨hwå†}ª\1 ³ÿNŦc&F'Å')/×*\–$XðfÒ“Á;ñƒ³øÛ‰¾QR‰\ʨ„ ‘åõè'þò÷ +ŽTä±Kå"˜×nös¥…P¡‡øU§Êhï¯|©¦¯‰ÞSSâÀ> endobj 1073 0 obj << /D [1071 0 R /XYZ 90 720 null] >> endobj 1074 0 obj << /D [1071 0 R /XYZ 90 720 null] >> endobj 1070 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1077 0 obj << /Length 2276 /Filter /FlateDecode >> stream xÚÍXYãÆ~ß_1@ ˜BšM6¯}‹gÇÉ›ˆØÀz‚p¨–ĵ(*<æp6ÿÝu5‰³»^äÁ öQ]]]õÕÑ­®|ø©«Ì¿JÂÐËt’\Õ+_†~¥¤å…;%ùvýê›ï"u¥|/ó3uµÞΘ¬7ïœë}~Z)§3+W9ÍÊ ÃÐI^¯\­µóçë·¯y¤ÛÁ6ŒšºZ‰óPò˜r™èÛuUåÇ ¼Í@²ëó’é8NêÕÝú¯¯nÖƒÔQ|ê\Hry°$¸R¡çÃÉä`qª=Ø ¢ƒ%Šп ð?^¹Q gi°“Û-WÓ±+üwËcÑ p ²`ª2Pj ¼@«”ÿäG~×àúº©x¶¾oŠîö k©0ÇÎ4Ü m“W:ÀÙØ*òÙË;óXf-·-òƒÙ| ÏszâÏ3ïò ÷ÞÕM¹+îïë'—wòw›nqÓ¶ªënw‡QræL¢Ä‹}?˜¯úÓ ¡r ½S§ sWAêt0\R«GPwH‘9UCee˜ªF\E‘SÔǶkz $óËyžfZœ! 5UÞ•°A»)Ÿdã,E~EÎvç§IîcÞ1Tu9(`‡Mí<–€kh!¾ ‘@(YÓXtË ™îR8^Woå{ ‹œ÷v1gÌò7Sh@mÌvبa`´ƒéÚ9WÃúº}óu»dÕòhU:ð¬ì@±ùÕ£0þklöG9ßãde˜”Äx–åO<–·/²·[¤ˆœš" Øv^ð«ÐÙÁy}žzŽCyJEB’7»Þne¬Yp£’Õá†*õ‚@ϵr?î̇ªî[ãMݶ_d®dT¼N3(·“hîŒ^’]6OQGÔ X€”ïI«d¤C.«72Wükù¾5O“£ÉÒÈYOöÞØÅ(DÞD<ÎTK¡8K¼$ríDK:ˆ/˲Pˆ±hK`I±±œÎt.2è!ô1-Ó·ÊñhØâX¼èJ›F±OÚ²L†"Iø mI…dn®3ÁãÎYpZì-XetRv ¹«µ%“<î!‰ïA¼ ^ À/ú¦E¡4$%T%W˜nS[PÂÌcI¹¬ÆTÿ–L3å|Ë6ŸÊJ‹ ¿/[^Ȫ¯ånÙÉNJ¹sÏÙ—C@%\Šºâb Ub]¼YÊJ4økB%-áO+‚˜#°~ò•.xnn­FV ™¨üçîPDØrW0Ox”8àj&+º8:\{:ÈŠ÷² 9ö7fykëÇçÖ±»¨I ø¥’H ˜tRêdc½*SBBÁo=Ø‘š …ÛËÂØ¹@Œ“ÛI¬À>£n¶~ÄJŠwê.ܯ¡DàeÔR”1$0 îP“÷8AàÉ,*b& õ¦(¨ƒ¾ãá¹ó€Ø’, bJ!5”ÑäÅ|ÛY‰.p³}–;árŸç’1Z/¦$„€õ=&:•Òc0”bô¸iy‚ ©ì±ÕôØ.Û‘(h–®¥ˆqz² à ”\ï–T®5Ü›ù6Ûʵ".› 3ëã~¼YR0Ïyü2†âäýD›àâ­dtÎ#Ù,Ž“ ÏÄQ®‘¹]Mškm$ž9@–ï™8S©bð5UÈK¡äÌ%Â$ùÐÛ°%òïù&SÒæ O‰¹ì¦•D6u­é½ÈE÷Ü)†}@àmâ¡ax‚=9†ãhd¥Mz9ØáJz¶ÞÒˆ°vÜp„ÿ^̺ 7®_ý÷/ÿøÛÍÿ¾ñv¦®Jó¸„pÈÓaØëÐ×¶žWú0>Àïæü- /À¹ÕUBšÎ…e°MOÔ:wJ¸ð\xÉð¥GÃH*®ë¾íêªü…¼çNlRãºÂb'MÎ%×iê%© f’/<tŸ’ü’¡”‰êõ’­@%¦*+Ç^Éu}jêC@)OG:šá²òŒ‚hÊ^ÊQžç1ñøSƒ[7Ül»~»åˆr¶é —Z¬¶S¸OgYò©›Y6VÛâm!Ú³ù •6]{Øè·o¾ œN¤ ¡¸,æ.?à h¸v†Æ¶^4 \Í6/„U!žAÍBUC•îXî!Ÿ¡Á‹x¿ÝoÃÓ…ó,á§OuËìåí›Ã«\·oß|éÝ9Äÿ% a]PÓ§ÜÑÿñ3ïЃÑ\¾¾þï²zr9(7hÞDsþ uhó–¼³r6¦û㆞¥¨Åi~wl;S »­lÁÁ{)ÖÂiS­l°½¾ùûúæŸKgSO©8º© i¹ªâÛ…0|5~iŠ2/‹’ô2 ”ž…>[COÓ.cQÌ>‚E %Öô¥ïìá³n…ñšŸ®çg*ž¾¬ÓE=EÊ‹²0°çg$,é)ó|•Ù§Wvû '€°©ÊŽí‡¤ô+Ó¼¥b endstream endobj 1076 0 obj << /Type /Page /Contents 1077 0 R /Resources 1075 0 R /MediaBox [0 0 612 792] /Parent 1069 0 R /Annots [ 1081 0 R ] >> endobj 1081 0 obj << /Type /Annot /Border [0 0 0] /Rect [318.9931 278.0698 488.7812 288.9789] /Subtype /Link /A << /S /GoTo /D (Customization) >> >> endobj 1078 0 obj << /D [1076 0 R /XYZ 90 720 null] >> endobj 1079 0 obj << /D [1076 0 R /XYZ 90 720 null] >> endobj 1080 0 obj << /D [1076 0 R /XYZ 90 531.6047 null] >> endobj 693 0 obj << /D [1076 0 R /XYZ 90 448.4896 null] >> endobj 1082 0 obj << /D [1076 0 R /XYZ 90 213.4728 null] >> endobj 1083 0 obj << /D [1076 0 R /XYZ 90 141.6902 null] >> endobj 1075 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1086 0 obj << /Length 2663 /Filter /FlateDecode >> stream xÚÕYIsܸ¾ûWèfv•Éç;ŠÇ)+NÉšòÁãªPÝT73lB!Ù–åÌä·ç-—Û²ãSJUjxÞòámg1ü‰³<>K•Šr¦gëý“Ø ÿúD¸§(Â)É‹«'ø‹g"Žò8gW7³M®6‚—»âv%‚¾\…"hW¡R*HŸ¯B­uðêå›ç<ÒÄg-í~%ÓàSÅc"¸c¢—øl÷û¢ÙðÀ›¢’í¡Ø"™N’4ʬ>^ýõÉùÕÀµ‘ò1¹ä1Á„N£$ŽåY’éH(mH<Û"—Ûª‰„ ì þj§äµ]…2² UMѳLZ$Awß±Vö§Öâä´mÙ¬`—¾†—{žìhi]Qï5µá-ìõ*4&øgÙÛg0¢ ªP¨äª.QA œJòDi¢RЊu}m?‡Hw3¡P‘01›u]6}ÙºfzRi”í‰-²S‡F^-þÆ$X‡“%¿“Øø@9Ë–ÇP7Jæ#Ñ5«7ÙT„‚Ù8.þ|béD­^m|˜£wºós½­*¸Ú•N#N™B~Å-Êû;D®Å7KjÖ2Êr3ÓòiM&I¤Ó8óš,øä U)² ±üËjlJäA…‹ÔI ót=àæ°<-ƒ'ªŽW mž£VH=´jS Ê®òàç®j¶,½ˆóH%‰™‹_VpZ»ˆ¬8Š¥0ß(2`M¤^d»¸¡‘Öƒáâí[bœ O·Á‹˜ê“¤¶=?Œª•& ÜT¿ÄB•põÖnõŠ3ÞYáØC´¸Õ¨Q&Y{ˆÁÊÖ:%Â¥’à¯æJDsÈT±9·T7,š> 4 œh`^CæíÛû%EèŒÐ^©Ïð†hæ6Ú¢}¥bÑà´Êê9)øu]ì bmAô:xº1¦ØÙz×ùíÐ/íJ{¿‚Sm dð*†eÂó)‡G*Kó(O¥ðKH˜“^ÃÃÒM&õ¤€'Å TOhœc¥ŒR(Ú9p‰¤ÿBÑØ-QÁ¡ Ùk[Ú³¢«Õ„·-=l)Ìj€ ÁSÂeÐŽ÷_bãf{ÛW´ÝâBbýï—o_]þéHÄ’Eާè¹ÚÑu-WÎÛÂ#x^ú]8wkëA%Ï­!¦^z›ÜÀw³Uï¶jÊ;~(ÿU}Z™$(jg¥ãˆ«ceZfg&Á»ª †T€¦'aw  §„ ±÷á†(ð»ršC¦ §ˆd¤4? Ü!,u颙ÕI-“¹ê6%ÜuÝxÅ|„‡glˆ[Ê-0-"=–SÊ$Ês-ÏŒÎ#™ËéÅ@N ä”à,øèÈ-4Þv}Yl–1,´[ùˆåWAL>4ßÞöа¾Î/Þþùç7çÿïÀչД <Ü)á×€;Ð-WÇÿ#p»¾hû«è”G¸fá*#:‹#ks®Ž.œ.ÁURËÇ ¿®Ê­|®j€ë a³,¿”ߎΛ–èI9ÿ¶Íoöææ÷ïCæ Œb·ÛÚmr¸¥$bSôcÎ £Ý´¸©8Ò»!Ükg’Ûbð0uq ô“ ž¾Æu÷ü¼ñ„7hÓ"¿ÿ¡à¥EîV˜„Îjü^CR¢WÝr·¬Þ]¿¯qõ]W:Ù_\¾}ÿîüò»tŒ÷•iÍ [PdÅ*wIË‹KÌ«ßâ¥}º€3³GØV áÖÜ@ú&2ž’Þl‰”/ ÕÉ´ÏWººx³˜\B"Ÿf>§ ? ©yëÁOÇ)ǃ¡€ErLtŠš‡îvc)2ó½’䙚+í‹™v«Ø'…EsÀÝÑ,h/ä”]R‰ôº~ ‹òØUnŽS©†:~ïÐÁæbÌÂú!ýrä ?r%”‹| #0¨ûLý§²¾]âžÇÙÀe8crYPÔůùÖ€;Í'ž—‚"ñ1~fWßÁIDà¹ÊУ(:¥Æ$ƒ<{Ø‚©Šº&Æ \tø’@LšB†æéù³ÇÁúЗpìfRp>‘”ô‰Ûû‰ž‡]Ö© Á¡i¹ïÀ<×GÂRý:·àøÔJ:×nÛiφ©2¶r–ì •£Ò_­÷ç/œ¿XT¦€” |Ór¼þT[Í~V´ã¡Öq¶*®ë°‚s}}ìqGÈÆuŸ´µèö“~ƒ«ÎRI絆;X!ØÙQÓÀ0½²ç®}ßß*O;v·“o‘h®ƒìþ¶r“î«ýñ‹Êfãxÿ¡ø`†ø@ê°=»0Ö×7GÎ]À­š²í«â·µmº¾-*ˆ¿wM¸¶¶Ý`#¬ì~ÿÈ|ŽúS»¶¡ÆÒé§êüÎåw‹æ(£8†™RkoÇŽ"§¯†Þ PÛ~÷v¼9!]LËê&(Öu¹ñtÔ³Äçð¤æQŠÍ£‘S<ýв³‰çb1KÖ_T-”k "ˆk82ó,8å'ð®ãïãý ö‹57Õ:'àHì/ ´<=Ñ d©ã.¸3¡nÊÖÑuŸ7) †L%C@‰`áp +c’/ÁÃÓîT+Diït/€K;G7§fmIÜ´4,GkÛ¿¿zù’™¶нHIM’-õ ŽH"È t*Ò÷”ëGN ëˆã guò©¢]c|þpa§þ‡.ìPH€ÎŽ ÚÇ­Ê_=/)”|PQ`ˈ bs)uª½>…º¥zâx;ä,Zr?aB€Áf¬–®ò ó5'Âæÿ›m÷E]ßcK %…¼arÌë…ëí%“þÞxê˜Jj¥Hø‚à œXxÎñ¨+Æ/ÂEœ™…p”›±0ÖWuÍ0!‡>Ü{»ä3î8ÊèÌExp]ðþ?+ÇAay”€ßv¸RÜœï\g«9îÃìùö»ºlúuòÁ%òÇ;Uv<Ó»£'‚¾¢%AÞOÒœ¥ôVD™Ò΂_1µVè¤Ï&9@›Àb¡õÌ=¸YvÅø=¸ï Œ‰™UB9ÎtîÛNÃ׃‡(áøË ¶ =¿-·1MdÒãÆïôó×18–ñ?Å þ‡HûÍaôuÿû°9 ÃyPï—&œ7›{|ÓÜÝÎu"ó„Ú5H1Ã’Vn¢àWŠÎíØ¯%÷…}rØ62|¿«(Z l¥Òôá§µ’NjϕW\C£Ä˜Y|®ûŒ†Ä;Êc«/Ü£ÊL&œR¤©ð¶öN{M© ^»+)Œ$seyœÎ ç…ýÜ,ÅœæO£1 ¶9• ¡#™)_‹®Ñ±Ù¶t _™œšôYívHßûb°RPÞ¿ > 6r†÷R GÏì3KÏÙejpf=ÑqÆ®}q¯ÿŠÎù#¶ENxn[þŽWù$L\߇HlÛê‹s:Xäê8#cÑÞ_Yº„¦©qÁª™œ¥|<‚k‹íÖ·pìz’'ÙáÎàLù¹X÷ˆ!“ 21ÌqŒSÈ1þÎ8pö¿r{¡Ì endstream endobj 1085 0 obj << /Type /Page /Contents 1086 0 R /Resources 1084 0 R /MediaBox [0 0 612 792] /Parent 1069 0 R /Annots [ 1089 0 R 1090 0 R 1092 0 R 1093 0 R 1096 0 R 1097 0 R ] >> endobj 1089 0 obj << /Type /Annot /Border [0 0 0] /Rect [404.8428 559.7162 522 570.6253] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 1090 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 546.5655 226.9942 557.4746] /Subtype /Link /A << /S /GoTo /D (emodule-define) >> >> endobj 1092 0 obj << /Type /Annot /Border [0 0 0] /Rect [404.8428 490.6279 522 501.537] /Subtype /Link /A << /S /GoTo /D (emodule-start) >> >> endobj 1093 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 477.4773 221.6306 488.3863] /Subtype /Link /A << /S /GoTo /D (emodule-start) >> >> endobj 1096 0 obj << /Type /Annot /Border [0 0 0] /Rect [406.7885 230.7604 522 241.6695] /Subtype /Link /A << /S /GoTo /D (Mouse Motions) >> >> endobj 1097 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 217.6097 216.7518 228.5188] /Subtype /Link /A << /S /GoTo /D (Mouse Motions) >> >> endobj 1087 0 obj << /D [1085 0 R /XYZ 90 720 null] >> endobj 1088 0 obj << /D [1085 0 R /XYZ 90 608.4575 null] >> endobj 1091 0 obj << /D [1085 0 R /XYZ 90 538.7632 null] >> endobj 1094 0 obj << /D [1085 0 R /XYZ 90 469.675 null] >> endobj 1095 0 obj << /D [1085 0 R /XYZ 90 414.3434 null] >> endobj 314 0 obj << /D [1085 0 R /XYZ 90 305.8031 null] >> endobj 1084 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F54 117 0 R /F72 6 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1100 0 obj << /Length 2336 /Filter /FlateDecode >> stream xÚ•Ym“›Fþî_±ßÕŽa€s¼ëœ¯lÇ•Úds•—ºY‰•H¨­V•Ë¿~@ rœÚªe˜×žî§»ŸFê*„?u•‡WFë ¹ZV/Béþí…’–3ü锯î^üóm¢®Täa®®îO6¹[ýè½ÙØÝBy}±ð•×.|­µg^-ü8޽¯ß¼Å=ýæ؆ޢ©‘ñžJîSÞ'½ÁvSU¶^qÇ{[ÔõÞ®qZœ¦ÆS:]ü|÷ï·wƒÔIýÕ½pÊ_], “ Ãø*Íâ@é8¡ëU ‰ b”ÉZ/¢Ìë›`ágÐøØàÅã4âÚ^^ ½‘Ü!ƒËN—Ãpãe‡Oåu8Ø—[ÙòˆÅvS¯y¼wÛýÀïMËÏÿ 6à’¾ÒJB¶‰}.`?E^óˆO5êú–xÔ/‹$ =[­åeÍÏæ\¢Œ~=b»Ùó‹Stn_Ù´‚9r‹â%tåÚ«›ž'ÕYÐhg[´ûö8'ø&ÍÃÂOï×¢o®;é“5ƒƒö-‚DM»Â=kÛËÚîØ1 «SGSSû‰ Ò0LD*Ó,§Ã›Cí/Ü 7êdá F†uS¡ßõ$ŸÉ½®a#÷`léÚ„WG|CÜð³bÙN™0wrcY}(û ¯h¯t;¸2,Yö<ÅmÉ–€Æ — Ag—þœªáŽ¢k£ÙnGgÀ¾¨¸û°q§¶4Q^¹uÁDZUñS¨âÚ-YAã%ƒ£µý¸NFàØZ6*É[ø¥eìȬ4Ÿïá=gn'hÁü$ö––õßÚk¾ v>•Å;Ácce¼ûA’zJ‡A’©Âý “p_úUÓ—àî&ŒÌfª9È(:ÏsÙpc XW¾aN¦bwŸ”†Æ‹x^(îj·Ûs½†9õÒœ žÐ*YO‘ % µgÉLÐ O¡!±¨»-úbÅÃd ŒcøBF¶øïˆ!=ÊéôÖ®×%EfYЛ± „„ŽÎ4^[®7øÐiÓ–ÎK9îÀ³oÉSÈü[ ¥²¶ñ¼Ä޽ƒuÜÍ^‰/q_{hö²€"Úa  Ø ËÁ0l¹Èœä$ &2‘ÌøaÎþpJ¤Êd§Ê¡€Õr`$l±QcãqÀÀ6ı†ŸMè5©÷Á½X Yyvœ’A#“ÉÊ{„žý–»œJ ÉAOþãx½¼ÃóÏËázβÀd&¿ìE˦îÀädýÏûN¡ Y›·Z²ÃG@Ÿ¦`+„%¤ñ\.ËSh$A–„ÝM€ë"ú¯4þO!©ö@°­ ÆÝÌUBÊI®§WÁ[¾É§×oß|ýá–oò{Sÿ¯y|üƒ¼÷ñæ›ûŸ/Ýn6¡Ü 7ÐçxͰoêë~|+ÅØ ²¹(ëÜ[—ì5Ù¹õKqÿÁ`—@qîˆ7-™$cBf;,y j®*M+ ú 92žäö˜O:ã4`‚øfß.8PL‚l6çd(L• àÓ"‹=Ñ9,¾MÔ&"ˆ®²bß+Žº ž‡ñYæ_Œ”REW¯šÚÛÙ!¥ wš.î%×nY=ZåÑEÖ8`Ÿ^[Y3³©Ý‰'[‹K¯³X9ŸHœ;`žó@ÆdPX4‹<»tÌPú§d‹M»Îʼ¥ J$­*7ñY×Þ½yè–{ÂDžÇãÛ‰¸"p+ùÝrµpy‚1†fC§Á… }¦„R‘4¼²x.;™dk\á…Ì@»œŸ [Ù1BÀÅs !œw ’Hdáom_:òð:™†=¨9íÁÝ‹Q-r…&v?ÏnÚ„¢Ä|éLŸù‰×+I™3›|E|0ö÷h÷(O¤Ï8VpNâjàWx4ãÃqä‘Ö·áž3Û(éH×úF°y¾—ŽìO¦¸4{­1SWâ+mœÐEêôƒZªW`êl[!ã Ñï%ôd*ˆÏiÀXðhDÆÀ2‘wO9zÅ…w•?»=ÎßmËsbcv6'#;%4]I§Í«>Öés·–™쌎F§kŠáZ2"œí»œärc„,LÒŽóáÈkfÉ`*L&§úù}N:ÀE–8ÒÅ6kèb*L1òÐ{®Ê¡eŸ¹uúŽØ7§¥RG”;Dý1›µ§¬"mÉA†˜e>)¹¡}¸k™²r”ˆ÷Ûž÷9¹’`”ª„”ýM=Öϳã U~ª6¹:‚šÂ4ŽC×Ó"I`û¡¢äº‘ l,û=}|ØJÕ:r‡U°PÐμ׼án,N§™œÖ"öÒ.ª]ï",,»/kÙŒm©aBkžˆMK¥?3±Iª@FɳR¶h vvrbDq y Sí*„¥’-q}¦Ò²Bø¡9Tþ0óÄ%ñ=®°æ®ÊAðe¡¸êÃ5#Ã…s BGœùP"¢- =”ä_L{W>†ëB>ô}ÿîöþöÛ¿En¿£H¢R)Õ QbáÚ?‘ò’Á¼;9ÇC LôÙwÄ·|ž‰² É"us¦Ø‚àsŠT±š)YñK4~ÀÜá‹öêb §ö³‹©Ë}_¬^bÀ ½~ÊFpµûÐŒí‘ñ{)' ÓÅ'§$Š'¿ò¨'{hOârç„‹3IrýiõÝTýeá%m+¥•'C wó–CÇlØH¿LeZûT’HõÉGt:²YâYæÙÃG2ü<Ÿ1œTÐP—v“´$g,3f `V,¦˜µŸ­Š^GF©Ý/2ÿ<Ù³¡œ¸R€Ù•r8\O%äÉÂSë•pþÀý$òU•`¢ endstream endobj 1099 0 obj << /Type /Page /Contents 1100 0 R /Resources 1098 0 R /MediaBox [0 0 612 792] /Parent 1069 0 R >> endobj 1101 0 obj << /D [1099 0 R /XYZ 90 720 null] >> endobj 219 0 obj << /D [1099 0 R /XYZ 90 532.8934 null] >> endobj 1102 0 obj << /D [1099 0 R /XYZ 90 180.8874 null] >> endobj 1098 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F55 27 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1105 0 obj << /Length 2402 /Filter /FlateDecode >> stream xÚ­YKsÛF¾ûWè´« 3¼’“×”¶dû°Jé ¸R0 JH€€bäÕþ÷í× Š¤Ê–«L Ñ3ÓÝÓýõCê,„ê,ÏÒ( r“¦gËúU(ä?^)yòóüóòÕcu¦Â suv¹žlr¹ºöÞÝÛ…ò†rá+¯[øQyé ßãýüîâG¦ ·ÀSâ3P˶^èÔ»«˜¦¼=3½Ãç¶®‹fÅ„‹¢–›]qƒl&IROEéâëå¿^}¸tRÇZ?¥²œ*–ê3!h&Š%™ TdbR, PMÿ«ÿÏ~œDÞ®ò|-ºü)̤ÇfCê0HCÑf¿†qˆë` ð“rçïÙ×÷eÿд_EÉNƒÇi„!Ȳª8d«ÿwƒ€aK|H=ØmEö”oíšw½½|+–CÕ¢]{^ˆ¢¹]˜sc/fÉ׺â•H®á´›Û›%Ú7°Pìý^- \r·Ð™'„oðÞµHØãÆ}ÙYµÑbc q‹(ËÀL>¤Þ%ʈ”ž¬¾$gA=VüL»«Ë÷„q»ðáYÑÙ~ •){ü˜{û[«äàž:ÞÉ]àn¥„+Çr‡ïh%›ÛcÇV˜Q¬+oŠn+7´²ÇkЊí©r¯„0àÙ÷¨Bê•`ƒ4Œ½óõœ¯)mk'áM;çFJ±>‚/L•yÊRŽïɃO6œµUÆ3? óÀ¤ê(ø¯79óO:bWÊJA{bPŽFy à‹C±$~Ä ŽÏ3ιÀɆzjmUâ6~¬o$¸&p[NšÇgƒn‰Øv_µ— ¨Ë š1Þ^ºìèi°çÁ’ˆŸJæ­[½áãabÒZIªAmbÃébLâ Ð@"X02(=**~y[õ̉ açêBävomêÄ6O®Ê;™{qŽo·õtÈü±„K im/… mตšvp "µ_k:…s|þœ6*Ÿm+£Ì¿•Á¸MªµCû®²ÝЖ<©~@‡(‡îþaIö0tEÓC¾­šÃ#gþÿòÒç>¿ýôaî>®Ïß?àI\D^è¬_¥@îËÍúaßv›Õî©îÊ®/ Ó(;à·Ó€çúµ(à 7NyrÙU4Ëg(Ê2©xö‰¿•Ðo*öyEÉù3.–±ˆøY=i–/ ;œÀ·- 2 .Ýð ÃÚ©kÍXk),4O­nUÃÔëïåÛI2Ù9<ólîpF&Þ?øÃ@Bñ½áß1"5šŠ¯…ò;º?Í¡pÅ­kÇŸn²Lu´ÒäËíÉöþœJ`H^$1Ë ¿ÅV*˜ {(IFR§.i¨ÿá±EÿfÂÇ¡`ãNä•ózþn‹7 j@iÔƒûVÃíL—Lª8*ïj‘a#Ö[au¦#F&q¡Ž‹vCÈØŒë4tSY#*yb’¤6n+ª:áë‘_ ÅÙ¿úŸ°þT£^pƒ;ÿãÂ+Äz±Öìõ`HÛ&ƒÝ©vý¾Í1çïÝ_½¤ÑŸ542œîvEíæ¶G³„ó÷¯µOüÿðW6W˰£v¸‰uÀÿ‚áÍo endstream endobj 1104 0 obj << /Type /Page /Contents 1105 0 R /Resources 1103 0 R /MediaBox [0 0 612 792] /Parent 1069 0 R /Annots [ 1109 0 R 1112 0 R 1113 0 R 1114 0 R ] >> endobj 1109 0 obj << /Type /Annot /Border [0 0 0] /Rect [289.8427 523.8822 449.6308 534.7913] /Subtype /Link /A << /S /GoTo /D (interest) >> >> endobj 1112 0 obj << /Type /Annot /Border [0 0 0] /Rect [288.425 284.3699 442.3354 295.2789] /Subtype /Link /A << /S /GoTo /D (camera) >> >> endobj 1113 0 obj << /Type /Annot /Border [0 0 0] /Rect [457.0714 284.3699 522 295.2789] /Subtype /Link /A << /S /GoTo /D (new-camera) >> >> endobj 1114 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 271.2192 258.5397 282.1283] /Subtype /Link /A << /S /GoTo /D (new-camera) >> >> endobj 1106 0 obj << /D [1104 0 R /XYZ 90 720 null] >> endobj 1107 0 obj << /D [1104 0 R /XYZ 90 720 null] >> endobj 1108 0 obj << /D [1104 0 R /XYZ 90 586.4349 null] >> endobj 1110 0 obj << /D [1104 0 R /XYZ 90 514.7585 null] >> endobj 1111 0 obj << /D [1104 0 R /XYZ 90 444.2942 null] >> endobj 1115 0 obj << /D [1104 0 R /XYZ 90 262.0955 null] >> endobj 753 0 obj << /D [1104 0 R /XYZ 90 191.6313 null] >> endobj 1103 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1118 0 obj << /Length 2465 /Filter /FlateDecode >> stream xÚ¥X[oã¶~ß_ ‘‹XG¤î}K³É6m.‹ íƒ,Ѷ6²dHr.ýõ IY^m¶{ XäpHÎß )N<ø‰“Ô;‰}ßMƒ8>É·ï[#[E±#üdö×â×w— +u(å·ôB–o)&‚ØècyC6 ¸Ž^¨nzE pk…ë!/ŽƒÅˆ¨^ÌÑNM†âŽ8×m¶=›ŠC?JÜ(–Ñ[8·Lc­•uWÇǕΊÆx*Õó©¦w=듵ú´6h©~GÿÌò§zRÇÖ„+½(<‰‚Àà‰áhøàÔZ¾ù!ãÄÑýrATåAå}ÙÔ’\éJÉí?ÆQùדф4(ºá8#„zi<{ l ß·ÄþrAŒ&\>r~ä#3@znŸ”Qçú=s­ t<>8%FèFµ<¾¤@Ö“2þte½®4©,xjÓŽXv™…>6ÓíÊ¿é«çUe×ó€E³¢à£‚¶!°áqFbL¬È S©víMBgà&ßÌÂN,„¡,½Pó`ü­µÓ×BÛ4Àã°/šBån³Z¡õ§6!€bipÛe–Xâ†ðЉ(a,}ØDº©`wÆ.šAÒ¿ð? ­[í)Ä¥yÞDl5Jùp†º)¤d ‘Õ`·Ç¶[U÷k{u}syw~{©3îåý- Œ|¼¾øíãùâ—7¥,82m9=qîï?Üpëâþœz{y·à~q†ÎgÕ7˜Ö‚@‘G8™öÚ—4óu}Ï”mT›µ9ÆÈÿ^y$ëõfÊDá…S¥7_Ma¸Íz`„† %´G$ÀyÏH.îPž ‡BºLy˜qNNLN†>–yVU¯³$ÀB2Ø[8w‹žH’÷R,)N®˜„n˸¹ÄÄ3¤!Ö\røŒtb—¯xšMÁyŪ*Ûf½ÎÜ4¾+ɪ<joøtâöÍŠyKùT4í–Ù­¨r$ªÿ…¨à{ß÷£Nr!ÁLéAþ”õLCzt_¨ŽéYÍÞŸpçÓ,„ÄXí·R–ÝOÁè/Š  eÁO£{zMšfV±h6^}Ýt±ê²Òû­pJ;À`ËH‘¢ÌCž³òìóŒ…S=é vФÔŒÖ7êÚõ!ÀÑ{’¤6Ý‚‹ ˆFÌjmMļÙkr«çwÇGkõŠÿõÚ,O -P“À?ªUºý’rv‹[òÐÖ!UÓØeL1µAKÌÄœê(`0ƒþž>àF³—:ïAnr`êè´r30 è-s.•v£^X¢ƒ¥™½ysý°˜r;¦aJçúîaÁÇ^Vèœ*á˜eL«Õ3÷ÉdlXÜu­ô¸}1ܰ¡?B›HœÂW›Qeg!ª5©„sЬøíJPL¯C EÎgh -\Yç­ÚÔ ÝŒ™c$S©Í¶”@ñSAŠ_?ÕpA±ßÚRéb+ÂlS Kø{*©ˆ'}€ñ€š¶iõòÊL³°Ôðµ¡àñ¥Fe†ª&qjIG‹(SÉŠò…´ekŒ!ng%žd'À÷oZ±mh¹Ôi,BË|ÛÆht¤«g º "¡¬‘&ƒ±8„» Ô(oˆ4K¼ò˜¾uEG¹XÌB¾i D×LÙP%`²µ)pÃìx5ðÑèsTWM7àdhÜ8‰¸‡%oŠuƒm:>¬ÆïªŒdÈMI:´Ð²ìz°–‘SðZ9–ëØhêJ.ùÞÏÓwYg#û Ýøöëéët-CS‘µ*—d Ö"_§¥é¦´¥|VUs¨fBU¬)Ê#Sáa‹dî±ÈÓ• ’Ó£B£/2dSêê¸HE\Å^?šõ}Æ\¼]ÊlMO$á–(ÄT<Žöö<ݾ‰>TH!`¥VÏž¶S3=³ÐðNÏZÊ‚×Ê¸Û ¡†)!‰{ºóS´’[‘Y£þòhÆej¾¡=.V#eZ¯t 7—pš¢µê7öØÀ”l5z‡‹<çô‡SnÐ-8â›]„6‹úÈ‘Ï,0•ëºiK ìùK¥æf8#D´/‘Ðez!­ iV€m'ò€~ì“ö+ôÓׯÚkÐiU¿?,yÄWnaö×0ñ•[X4u Û€45ß¼{…Gw/š¦Åüøéòêú¿|ï:¼…ùÎ/çwïo.¿ëÞõ;%hØB?™‹¾k ì)á©¶z5¹©Ö9Ð^—CÑóRàl¸h® S„ç‘Å GU¡€|) Q3DTnJ™ÔõÒá²L›/(_tú©ko“êÄÏ4øŒF¸M5ŸL}7JãÇ¡ò²©¥PújÕè÷ç’ÁûèÝ  µDÌ[¯Ù<@Ù›ì¡ß}(§ò½î_…×W¢+žŠ®N½ìÚïºÔóŒ‰=@ÜÇûŸ½¼XüïñC<ž Žš»¸BmÂ$ 4ø^áå]KCØ„ÄÅÆäܘŸ’<Œ#^—" ûhðblnŸS8yäûáixڳݱKýÿË¥ »ôeÅU?ì¿ý— ñ²¢Û4 ů0³øt~÷puÿéö»ÜwÑÔy6˜,3•­„+´,ÊÕÀsÙOT \·å3·æÁW\þ%ߨéëÇyt‘A=ìv_-…YQ+—¯ŸZè½x`dûö‰ï®ÿ4rB endstream endobj 1117 0 obj << /Type /Page /Contents 1118 0 R /Resources 1116 0 R /MediaBox [0 0 612 792] /Parent 1125 0 R /Annots [ 1120 0 R ] >> endobj 1120 0 obj << /Type /Annot /Border [0 0 0] /Rect [341.2065 641.9552 511.5097 652.8642] /Subtype /Link /A << /S /GoTo /D (command) >> >> endobj 1119 0 obj << /D [1117 0 R /XYZ 90 720 null] >> endobj 1121 0 obj << /D [1117 0 R /XYZ 90 592.0113 null] >> endobj 1122 0 obj << /D [1117 0 R /XYZ 90 316.9801 null] >> endobj 1123 0 obj << /D [1117 0 R /XYZ 90 230.519 null] >> endobj 1124 0 obj << /D [1117 0 R /XYZ 90 146.179 null] >> endobj 1116 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1128 0 obj << /Length 710 /Filter /FlateDecode >> stream xÚ­UÛnÓ@}ÏWøµ„ÍîúV÷-¤µD ~‚òà¦Nmˆ³ÑÚmš~=sY· m¡H(’/3gÏΜ3Þ(OÂOy¹ô²( ó8˼E;’.üs¤ÜSˆ`ò¾½›&ÊS2Ìe®¼by@R\}“ºÜøJô•(aý Š"‘ûAÇâãäì˜#} ˜ Ÿ!Z™Ö×™¸m8¦Ä–A|6m[®¯8pV®r}S^#,NÓL¨(÷¿ŸFЇª­ÿÖBž6–iOE¡„Î\céQª(N¨±,Är4]UŒ×Ü’4wK(ÊP»-^ƒf½°XH¥÷¥1µ S­Y© ™È»¥±-/ OOX“b>þüe:›ŸH9®Ù“,L¥„. b•HfoPúÕêÊ´X˜µ¯DßÐí2åŠ3T¦Á(iN¯ƒ ”kZ¼ÀpÙ¦ ô%Úšd‘«W@LºmZóK_;àâÆBÔ:vìeØ/º·äj‡{’¨beÂ,ñž2.3?†ŠzÃz¹Å *»ã­:[sÍqÔ¼ãÅ Ît“½ÄíNOÞtüÔ` h‡k&:=ÊŠ°³åºCO;M¹SÃ&s\ |Ð}ÙèÃ1 œÖ0®JÆO‡1Á«|a»ªÿã,¦¿Í"âÿÃ(Μ[Û¸ ŠUNê’›êˆõÄ©´öqÄhH ýhvE.þ@]ŠÀÄÕ ÞG‘¼çœ94ü9^²ùµsIg—ÙæaÓ×[½`¡b ï‘_ÃÁ÷Ê3äÞWÙd| ¶MÇ“b6ÿ'Ï¾ÂÆÐ ±)éØÞòKKgÈ Oöfƒ·]³¾†”ÌEÓwŒ¹p.:+WWœÄï·MµeÔ%2í8:õ•‚/#“—‘’!1©1™ l…ƒ]mpfúKª¸zο’5ÙpO]Ó7<’æ3‘ºr6þH~¤Õ°j endstream endobj 1127 0 obj << /Type /Page /Contents 1128 0 R /Resources 1126 0 R /MediaBox [0 0 612 792] /Parent 1125 0 R >> endobj 1129 0 obj << /D [1127 0 R /XYZ 90 720 null] >> endobj 1130 0 obj << /D [1127 0 R /XYZ 90 720 null] >> endobj 1131 0 obj << /D [1127 0 R /XYZ 90 612.3661 null] >> endobj 1132 0 obj << /D [1127 0 R /XYZ 90 541.5318 null] >> endobj 1126 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1135 0 obj << /Length 2651 /Filter /FlateDecode >> stream xÚ¥YKãÆ¾ï¯˜[(`Åe?H6}ôfc$°;8Ò’8#îJ¢@R;˜‹ý×S¯&E©5;kC‘ÝÕÕÕõøªº¨î2ø©»*»+I+[–wëý›L†?¿Qò´Šå9É÷÷oÞý-Ww*K«¬Rw÷3&÷›_’÷[\¨d¨K•t‹¥1&qß-–ÖÚäŸí¦–8óNë]³"õ¦ý¡n÷40t0õ¼XjUee¢l¶øõþo>ÜÒåZM~$¹>@©ïT™j•[9@álªŒÍén±Ì ²Âö‡å…—fS“eNBÁ‡e/Õ Ô.Í`bN u™|iÂò'à¨LÒŸPkG8®KZ<ùÐóÄv#Ï8Q&¢S•¬˜Ž¤Z3?lðA'=!³mÝ5k¿ãéGÜ&ê¡{f:/<¡<õNèÂhÜ>°ì‘ÞÀFÈÈÙ$Ó—Üok<>žW™TåŸwØ¢vhIÍöчßy–%mû›ø§iAÍcµÒãXû0£cÛs«Â¦™Ér%øÉ£ª1Ûè*5`!<úC8ëŽ÷ðÝ$ËC+¾ÜFšÃãµÐkr¹„K…)±‘‚É Oº“MÏ„r¼JóªºÚ¦¢ëY5¿žºd¸Ö•MÌò:qqC• _sêÍfB5˜Õdu¤Š^Åà’)]Å”À-,¤Ñ™Gó²w/ÿ‡†ô çæ‘ö$‘¢Úh#܆À6x^亷ò„DXSTŽÜ Cuk wYÃJ4rF†Ùõ\\Ï 0£—ÉhwÇÐ`㙑Öñ^T `“–8ƒ´Âg,€<–·/ùDdˆèaviŸEž6(û³Ÿ“j-’jýJLÊó´,u )SŒä Cßì›ïxpÄ\œØrÜËäÀ3©˜Z8"9£0c_âÅ®„S‘ÚÊVWÕŸ æPû͈¹ÊÒ£(ÎÄЋŽBøG/¨«ñ¢òMI2/Š˜ªÑš™·xNî%Ž‘ G¶~'OÕÄ’5=®°ƒþÐ?„ª[`¤ä[ÛA¸Åú‡+Ÿ,uªÌ¯ŒŠ9P qtíªä'àô;7³V͉%ÔUÆ}A~ŒÚ–.¸’9Å UžZåŠ×ƽ…4U^§RÌ `Êý°©€6 poÊc,C?Þ ®ÌqÆÎU8ñ”ZfÖ÷ŠÞ²/‘›ºz‚ÜÆÜî"oaC,¶ (Qç ´3—…Þà­j³¯7+²k`¦+äYÿÎ(KmµUwÝšÛ³´i7[JOºÅ© S¼›ùÓn ò œ:R¸`Ím]"jY@ ‡hp¼9~Ðͼü?™2ø¨¤çŒcþ§..L<5TðË)@ûXèæê%0¶y Wä Õ¿r¿è‰ÃþãqË ¤¨ÑŠ<…x WŽàéÜiö-o܈¨·kÙ.“®Ð¯íZY¸dYë"s³ ò!¥­O]iQUêÏÝ;f`… NißìžvRÍF½äÍc=vu§æñØØ]¼ùÂ¥ ,ô²êPË•˜–x)™¨ÍE7õ“ýgÁtîLýì™×Ž…n?óëúÔ1\@°,@w7¾,i7›¡î(/ÀåzÛ„Þ¸)QÃX$ìÇFTÍ´S]ZV7Ý7äÚÀi=eK7u¶Æ•õ û7dã°Á™éÙî™6σ«öõ°\“ÍÁàË®~huÜîaÝL?¼ÿ‘a“+´ý,œr“öãôàâó™ª2¸w—öÎdP.Xü:ƒ4yöm¤ZNd‘¯€—ÌPªõz`õdeªS¥¿ü2}D¡xté­áéq@Æ"\Ô¿¾å5Gÿ(_”¹úhA…Óêì,‘¯#ÕËg¹dÆ]RN‹™KKãô<ñÜ .kÍGðb~×§’ çØk©7 ä/~哚Ë豌KÚÕüNK×3œVr¯âÿÅœP—9>¤ÛøÁ¿ÃÏDï¶ÏG¸µÐ…%â„x×Ï­ Ëþ"‡:­Èœ¤'›å)”Ü&Òé¤ÖkXdÜl…%,.D?“âDŒ¤3„ŠB'?6ÔT :jØÏ µ™¸ÇBx?‘'ª-,‰T>^¬&mõÇð¥5¦,ð('G]±z´K«¢*çê( «©—!úàpËB×Çﻩ ‹|ü5&Ö<‡Ñ[$5Æ×ÿðÛ& endstream endobj 1134 0 obj << /Type /Page /Contents 1135 0 R /Resources 1133 0 R /MediaBox [0 0 612 792] /Parent 1125 0 R /Annots [ 1137 0 R ] >> endobj 1137 0 obj << /Type /Annot /Border [0 0 0] /Rect [190.2274 306.6128 413.6821 317.5218] /Subtype /Link /A << /S /GoTo /D (set-conformal-refine) >> >> endobj 1136 0 obj << /D [1134 0 R /XYZ 90 720 null] >> endobj 246 0 obj << /D [1134 0 R /XYZ 90 720 null] >> endobj 1133 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F54 117 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1140 0 obj << /Length 2482 /Filter /FlateDecode >> stream xÚÅYmoܸþž_á/EwQKßDé~É¥5r¸C ÛEPä TÙ•½êi¥íJ{>÷ÐÿÞy!)iM'i¢¥†Ã!ç…Ï Çâ"ƒâ¢Ì.¬Ri©­½Øì_eŽüÓ+áF p$s–7·¯~ÿ'#.D––Y).nïBn·WßîªÃZ¬ÆzˆÕq(¥Vå7ëDk½ú¡ajWïq®øØÐÙ®Ž´t×l$èUÓá¯\]‘°~¿–Åêç¦~äÙÞI¿®»-,s Ø–‰ §„ë»Ûï^ýñ6èd¤ü’ÖÈò\m+/„M¥0Ú«©4Ë•!µËubr‰¢zA;ÔÌÐŒÔ<ìˆ80Ç›ÇéºÂ~­Äêg°š0‡Ô#jq!ÊTåV]$¢HKYÒ¾¨žpEâÓZðŽn¿åw48Pxϳ ±'dCh¡Ra2ŽÖC‹g@K<Q’½IöàDò`™­0²ÀA½!]'¹P/.ÀMñ·b¹Î®d¤ú¸iª–é“Õ"×Âñ°½ïѨä#·:Ö,xø®í—úå¤_EV!Û7mõ©å“âí¹G…Àjôña]À}j‰V9Ú5ûŠþ¯Žt&Øu½d†w?hÊá©áÂhØß¤6’ö¿ÝÕG·!ÉpãIžïð#œ8@ËMnÝï¸kÞ*)Sˆdá÷´—@äÙê/xfé.ã¹kŽre.8°ñTÍèV8†çÎfzÿ n¹YýÝ õ‚ø×-«3¡['Ñ]r¾‡áû«ï™ç¾?î1öqŒ@vÆ{ýî ÐëÄš÷ÎT–s•Ñdñ{ ¶«¼Mwµ3j}_áUjG÷Ý ‡–Âå‰ ¼³[ݶ¸êÇÌdàFø³á~Ìð€@ßï»Iìꊎ y¯ôn,§øàO@ ø-> Ê0ý°Ì´eˆìzì¥q¿ ÑŠ‘«îÐn#‹™aÈìH!Ή…7\¾lØq“‹V†4Шުäh•¯öõ¸Ã‹VЙfoºà̾ >…‰ñXu>S´œ»ÍIÚò¢98”Þ ÖóÜ{R—Ý»{˜X]BÆv§‹¦w )»K¨ Û·?ÙHðóé*¦-r66dSP šòìÌ@8‹s&>‚GÑ;·OO¶õIIãÎí­6h÷ªZÛw~I!åêM ºÖ±|²í) øZ×SeP;¤àTÎTŸÈeýüÎ!‚L9˜(yŸ†€Ã‡â qè)&R.z°:өҹĢN-mš‰‚ÝQ¦È)°DS€•( ¤TXX–&S¦<‹Šùê¾z?𕯹 CŸ)›»G†½Õœˆuˆe•eBÊgI8[Åúã̯Hÿ›"çBò2µÒæ e`œ¦ûØf ì’+åø~‹±¶hÉ%ï˕ȇÀ‰óÇÆÅ(~-ð Kü@ b$ h€ ¸s©\d:Íà¬ËtKð«À˜õÆUÌ#T9f ÆGÎøÃãxÓïY ŒèmÌrÂä©–{ýš#íe Àaaµãݱ¢&³:Ì·}µu”Ùéb.¦‹'DžS$DœH!Ò¢Tzy?¡rÁcäE¹]œ^+V wêû¦Š–†Eá¸.£‚0Τ㠬D¿Gdi¸sEæít3% mnc™\…¸‡%jDèÈÑ1Í!0Œ¶œé7džž˜ˆY@—œ3rÁ ƒ,St>‹S_p >©Ôšü ´§v'7‹k¤Ò\åzf"j‚|c³b1 Pô"bZG5·ÿȾ…N ]x‹1°`4ÅŒ OVUú#úû•‹j³bùvG˜šeÑ€D:—ZžãÈÞ„ZÇ­v¡»d d|üaeJϳ˜µ ,ŒŽ…,)«MÏ¢ SáåÎQñ:–LÌ˧OÂË¥‹Ò,Ã!RJ§˜A2°{ÉXö$š‡r—…·ECïb;ÄZÁ†üS:³á±Íš"[ã¤@þ;ŽN9ËOÞÏTÌÈ+¾\·‚/üž?‡Ý™¿‡\uŒ•*ÈôT•î­Ç¨I[8^Z´äWÔ9—×{÷,8ÕAôh.ó˜Â³E!7=lÿ,-Ïv]th)&ðXªÀ¾ê+â0 ¼KÍ2ËM2ÿx1‹Mâ¸,R£uùÕxª>‡§‰†Û-ÏB÷&\Ü÷YjãýÈÍôÂ#ÍG^¸HBHQJʯÄBÐÂÌ072þNʼnʤrçôÑL_ÝNžåȬHU½»¹-æ…säp9¤¿²T2aK½ºÁ7ì§bÿ8…g…²ä4HZì™ÜG¡OÙThy}ÿûh€XZá÷=ÖÜÞÚ¸B”Nü2`' ì–)kÿ3æu[.avÖx±1±ì.Γd.éYð™TJû•‰X•íÁ¼i\oYÀ³´ÿõ¦¸üÿ×V ¼òœ2} T!&´†15sŠì Úaâ •Ðyj²ìkK!(ï %æ¥ì˜¨Ü*w¶HüR­$ RWJèç~YIšT/ë$HžðN:¯BJ·¡p@é\Rût8µT\wUúv/¾a¹wXpgC€®{ÃüæGñÔˆô\«s-Z¾Ñ$±w{VáX1ëFr?9CçÜû›7ÂÆÅ¿±ŽÔ‰ÆFY¬Ù­m$m ¼€úRÈzÅ5*_f “‹òu¶õaê]ïÔy‚%\ÿ0…šPm´ 3o:„¿FÍTˆãÀA‘evY0ÿ4”µÞŶZôgQ¦ðÍKƒ›«wñàn)Ÿ»&ïOã³ ’+§žz›D!|kKºäÏC¾ >݄𧈇øŸ&§`BZ¨Iq@W›¾‹±1ûcçü/DØÍ»ÈSk ÿvùo~ÀP€ endstream endobj 1139 0 obj << /Type /Page /Contents 1140 0 R /Resources 1138 0 R /MediaBox [0 0 612 792] /Parent 1125 0 R >> endobj 1141 0 obj << /D [1139 0 R /XYZ 90 720 null] >> endobj 1142 0 obj << /D [1139 0 R /XYZ 90 720 null] >> endobj 1143 0 obj << /D [1139 0 R /XYZ 90 485.0718 null] >> endobj 1138 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F67 89 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1146 0 obj << /Length 1962 /Filter /FlateDecode >> stream xÚXëoœFÿž¿ÂŠd…k-û⹚¤µ\¹r»ªª«£bÌÝÑppâðãjùïÌÎÂæb'â°;;;ó›ç.?ðàá‘wHÉ"Éê•g‡?¿âöË ·KòîâÕ¿h~À=y?¸˜÷˜\\Ïœ÷Ëx=áNN\îTWJéDo'®RÊù-®aj™®p.®3øIÌ'‘Wfé2K68 œ¬À·pŽ ³r5¡s›¥w4[ZîÓâ–Ù 9ì˸‡S\‰Éåů¯~¾huÒB<§5’Œ¨-ºjs² Šô*Æ¥ÒFù“b&/'À@;o¤÷ŸUV§ggǧ³×«¸^²²\䯧4w(.Q<ØÕ>“W†ËÙMý„‹à 2òƒ‹k†fp…•ÇåÀ‰ 2ÆÅ23P†"”mÖyŒní`ƒe½Ìð½Ø $ ÈsuSÓÇêa×ÕË”>þ‘aAnÿ±’õÂc¾’!h‰"µ Œi¡9ÓJE–ô ·Ñó×$kßÐI\@E‰ªÜÑhŽšÄ×xt¯QAW9uipwE ÃP“ŒkP;NÑÕpµ.J;eAïØ0ÙÒOB¾¹¾éx=wPôÐs~Ê{£E\§ùvJgŠ‹à:ÕSlùßlPZå“&é(ª¡Çð Šl"cT1‚KeRšè[Å¢A X˜M78\Ç(fmÅXJRzèR²’ ZRmÜŠFʹ ç½aàÎa¢B1ðç.3JR¨Ëý)‚£0âô„z= <³/Dœ~6âØ[1°‹èG|p­¥á1”V _:lP3(0¼н¤çÜ6“—ÀD9Zéw‡ÙÈ“ø ¾ •r>˜Õóø&¯‰ƒü@ËÍ…»ä`—¯xĸ…Í`*q3pœ ûžhiaÇGcÛ×À˲Õhl ­qØ7ÈÕsâ ý-.˜Zp›9fuœõ¤@E‚+xŽ•®&ñ=çáÀx¯í?¢€[ F[[ÿ[TñŠþÛ=>ãð\&#©ú¿è•'@³ K€½–ÀáÀN ] p.0ØK"Ê)CÁW†NŽ) ÔÎÙÜ¢Ž)±¥ì T6³˜PsþÀg‡ EˆÙ°û¢`RºIu¹_| }-ø{ÔGœ¥JãyV¨ƒ'0?0 ‡¶†V\½Ku"R#fQÆy‘q6)!1>áSŠ@) å[e~ÏËš,8TZyX{„PîuS¥Î—åh.Lj¼°¡²Ú#z)ÁF8ЬyN&·¦dFzá{P `R\ ;!c(k\*M``à 2R¤dÔO§àiÆ;!í_Œ/ 'Dø± L³Õ:Ï’¬F;¢ !á7é ÿFwÅvÉ ›”Ñø–2­/EËØr¾C Ò<Ÿbð Þ’Hvn?T: ú1UWﯪ*](|ÿ%U5d~؈·'B]ÖQB‰¾¥Û–pjÍ´/|PaéGNÛàn’¦—ÈÚÈL+~èÄ4d£6£ÀêxÞëÈÒªíü€hÔZÜçL…ü[œ Š:Íl{]Ò»(kúX69`'nHÎoŠšu\™žÀˆŸo›Æ ܃ëA†¶ Vîq=¨ø¾ï/t=¹SdÌ´R0!=Õ»Cj°ÇmÚŒ®|½D„‚yôaJ~œŸÐÇI­û÷åz[e‹eMd< C7âö¬QæsSÕðçcºIã*YÚ³ÆI‘PÂÐ,3õ™º®í“Né½°­ýeEVgqžý—^ÛÖÈ%+4¬¨•’M÷ÅÔÑQßq†Ý,ƒ%”Ëg÷ŸýO¯í'aÕy¸·n3"›©íÓ©A×'Û®o¸±{~SÍã$mš¿¶ÂÞaKšC†Àò³ql›Æ¶£ÉÈÝm?cZÇÝeP“öé %û5Ñ~!ÔµvþM©2(ÛŒˆ°-YýU-³·ÀÃýwÛž |‹éÇãwï˼¬fÞô~º½|ÜÙÅ›òŽ)ðïå§ÜoA? _¥Ð÷&iÓ'KÙÀ¨¨óKo³òf‡q·¤ö±m’NƒèUçÓ­ÖÅþ…_eµïÔòp(¦‡r?ŒÃ…OpœîÁ÷ñk Ý% ‚ˆçîJç°×›Ct<ÕÒàÙÆÌÍé.Åã2±XH*ÞÂ"o뺶‡c^ÆÝò†SæŒTV„ºÐöØLôvKÙïÔúµ²$ݘ:Ô*3»™N‚› œèß®Ð\VÐ{ä6Á¶-MÜ#Õ@+à¹I„±ÚÁ¤¤¯ÊÜJÐ]fÊ;Žvºy»×UG2ëü»òotÛÛÉÐg<òM‘ÛÒöàëß9@ôÜeÖAð'¶Q„š¸Sš8OÓáípâÔ܇¶Ý<ôñzD0Ó+¼–ÎíŽ\_>ehÚÿ4©³Ò^IÀ)™>fgg #v —Vµ9£ô\ñ¡¬2ˆX„Ç“®#×-Ýs²>eˆ²Ž·'`g8š*ÔØÍH{É1³¹£Mìr·wi3ÇiV¤³K"¦ð> endobj 1149 0 obj << /Type /Annot /Border [0 0 0] /Rect [225.1516 145.3913 379.9246 156.3004] /Subtype /Link /A << /S /GoTo /D (OOGL.m) >> >> endobj 1147 0 obj << /D [1145 0 R /XYZ 90 720 null] >> endobj 1148 0 obj << /D [1145 0 R /XYZ 90 557.9656 null] >> endobj 1144 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1152 0 obj << /Length 2170 /Filter /FlateDecode >> stream xÚ­XëÛ¸ÿž¿ÂpX9µR$õ®š¤l› ‹Í÷ÁqP­­µÕÈ¢+Ëûhÿ½ó µ–­½»‡V49œá çñÊ‘€?9ÊÄ(Q*Ìt’Œ›gÂM}&Ýh ÓC’×WÏ^þbäHŠ0™]Ýô˜\-gÁ›u¾Ë -ÆS4ã©R*È^ñ÷,äíºØàZÞ–ðsAC^~×ÐÖu7¿ÃyàïÚ‘v3Ž’à¶,îxÑ:—E½:'VrØ"…Ö:ZçWÿxö÷«N3E¿§;’üåãT‡RiCÊ_­K8s™ _v§q3 7žXD‡,™j‰ Þ—µ§ê ŠL¨bÂT»-°Lƒ‚Œ„Öù,¤.–,§¬‡Ä Lêœ×33’£d£Ä‘µÖu‰¢8(îË][Ö+^yç•ÄkIݵ j¶^i•ãêÃ8UA8žj‘ç-3Xà5áà>‰²°5nh[án’°Äóަ2•¡ÒBÃH…Òö:P( g—GO6YÐVì#ö†¿O\…2Leªœöχ dÂ$J"Gñ!÷–‘Áüy‘±#Ü£‹k—£bGaÁÆÿ)Z;áóÞ­ËÚcÍ?K‹=:z3 (*Hƒ .ËÅ é-†Ïr³L²­l» ‡>󆩊3Åa–€—:çIæpD¸´WåïÏ?¿{n†4ƒû“,‹XÜ hð<ÇþÌ©¡… àæi)wßOèbç^¬lNŽ…·½¼B…Bù8yêPQªHú[lŠ– YïXÈQ–By>Ká0( ã®u[ö»}^ñ²zËß•Of G³Ä ÃÁŽƒ˜8ê;öߤn`“­*‹Ûîœh¸ÙÖyŠÏUÅùvë 4p¹ò ¡æÌùÙf“»]t̶Ó)|½/‘‚Î’w z;‚9ñ¥ôÈ—.ò&ßmS..@-õvöíSYÏîçü<ðç~þâÝÁ¯ïÞôí~"&å÷É·ÌO2¾N1o¨Q,t¨ˆ6—öu˜¥RÁIGM1º9Èÿ~Ãôp¾ÏI§™I!—g1—‚ûöDµ)V8ôõvúÁÒÙˆ9ý:NuༀÑÝ]ãï£Ýc¹ÙÖ•J¼D"»ã…žg"ÓÜ9O^³O2›rãd^Ìv"»H\ñ¿‡®\ H—2ò©O„b8(MBf•Žöl8#ÁyB™ž:Qvšz€ë4ŠCuÒo‘âhϧµ½›ý”Îûôª»Í“ Ç×9$DþžwÓF™€VPv{¡ÿí³0"zÿÑÙ÷ŽÓ_ø³°ŸÃ²¤á- _"¹ìS~‰Á—I&þ¬‡Âe1[§¡—Åø“d½·«ÙUD/£y_)> ûþ³ˆ©+ÌNPÌÜO¦z¢!+ÜNB!!/Láù(e¨ `ªÞÑEË[šsä– BÎw-¶ˆg¬ûÁË:ø'Ìí‹úÌQSò¥ˆÆœŸSÈç"m0]?IÂKXçñ j×rD;qµÝ¤ï[\p[GÜŽM y€X¢] IŽŸS)D¯…ÿsàÝÖÎŒ@õ»Á]~(ü­º!¶ËåSB9£rÈÖÔ=0ÆŒ•Ç ìØ ´k\Í2i𶼫`Šº-©j™ò ÎX ¯ž!Ð;Þ …̄ŎgòzɃO¦;¢‚ €â"Ý¥§¶¸o±Z‚œö«ËWà‚`¥¡ŽS¾2q(àîi”yTJ»³…*p®XÿÚa% ‡¹41Xjñ§G ˆ3¨ÈRÉ…uúey¼¢›©Át+˜²“˜š!ž¢6 ±E¨\?2 †(œ0J•K]p8-JòË’Z5ëæ°ÀÐwEg €è"ÿÚ”mññã»÷O¤|­R{ñJ†pƒ uœ×Avªô” »a¬BÀd‡g–ÁcS¶ðbyÍMÃÒiì¯Û$2@˜‘E]#„¬¶y@û•‚gUph7qÖµ†!ƒÝlž0¯TÄoÜ»¯Ëó¡ch½¡ðæ½fîwkƈ`†µ›!£¶‡gÉùƒÐ¿@x­Ç‡;¼ím¼t-Ž ¦ÎÆm,ް2¸$ašúq8®¶t‘þ|²Â¦¼~îÊŸÔ“}€þSº:‡3¬°|ç²ô“7Òþ¬ ÆF|¢Æ| Z<½}pž]g ;%Nâ^(p˜ó§)òåå] ;í‡h–qšõçuÁ? ˆ¢>˜cÜÜÊáΚ·®ÜÓ!7±ˆÁèAÄ!z|}€~-÷;ÿøE‹Þd⃲Npx_µ<½ø26BxøÚ8b~±çÙàûR†Ïe[øiÁMåô²È;}ùGÉŸ¥Ò[öåâ9¯î|˜çPˆÀ¶)hŠ8 ×ò#î¡+žåçœ%?íLüÃÅÿ@ùʆ endstream endobj 1151 0 obj << /Type /Page /Contents 1152 0 R /Resources 1150 0 R /MediaBox [0 0 612 792] /Parent 1125 0 R >> endobj 1153 0 obj << /D [1151 0 R /XYZ 90 720 null] >> endobj 1154 0 obj << /D [1151 0 R /XYZ 90 343.3675 null] >> endobj 1150 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F54 117 0 R /F72 6 0 R /F67 89 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1157 0 obj << /Length 3401 /Filter /FlateDecode >> stream xÚ½ZY“ÛÆ~ׯØèÅ`•8Æ\8ôfE‡×eey])—ãT°$H"K,Ôzÿ}ú˜Ô¬$'U)•sOÏt÷×ÇP^¥ðO^•éU®µ(Mž_­ÏR×|ÿLºÒF,§C^Ý>ûö­•W2eZÊ«ÛÍl‘Ûõ¯ÉŸwÕq!“¡^,eÒ/–Zë¤|¹Xc’÷Õ]»ú€}ÕÐ@eEEö®§©»fu“4-~UòŽë U$›ú{;·ú‡º]Ã4·¡„]`šL±K³øíö‡gonÙ¬R_:5ùŠcg…RKǶÇãb©r ö„ j:A‘•i;àðh®ý«ó]-úÆMší’"-Sé&ÝÁx“%C‡ß<ÙÖmÝWxÑXv|XnÕ–ŠEòTèØ»žÅH“º&ÏJ·ÍáP‰¡Ùlb+ —Â#¿À×Â$7¦lÕûSý*6MñFº3÷´5±g=?’\Sñ]ÛÕR¹Hs«¯–R iS«4¿… poïq0ÙÈdä4Tû½€5·n Žòåa‡‚"eTJ[cãÃÕ¡¸ÜÃ!òT%ßqÇ WÙÑôauÜnV?µ°S¢I«ãFí©Y×\%:wu/èDó)Ɔt~â¿÷ÍP¸~õëó?±´<Áò²éºßb¼‘Ú ì2sDl¥T©0²—™0e^N÷Šr© ¨B’+r@Ýôkî®úíùPÓ}®¿‹òÖ*06v&|ŸSXëÑMÙñÎa£axÌê¼f”RÙ©.×T$-Ž[ÒæB¦¹7Ï¥–Nœƒ5¡ÖçQ+WŠL[o_°D¡¢ÌÊ|~«SžZ‡·ë€` OÜ1ì*”[ƒè_sÊ*žö®ñ´ëÎh;Ö\˜T¨UüéG%ëS»Á·×oßòÓÛêàD•T©Jæÿ±ucE©Ë Üúï7KŽU?‚æ Õï¹ïì!¹ÞP¶æ£Öð 'Xlr¡Uªå6j¤0Ö˜ÀFZ~Ê0XžÝB¼q†½œ `@>Þ¹qéG¥÷ÐòÜIjåOÇ|Öèu„8õ뮆æó’9p•®QÚBä¹ ˆ•±›ÁBâÌzµ=8Æã|Ð$ Æû—x<„#p„0 ¤&|»D4‘¢W®²!˵eʼºÓÄ­_8“Å@ƒˆG{®8²Š‰¤ÁmøëÝmìÀ†oelžª{F+è|hÈAÖêŸ \1‘½óÊÌ SC‚Åè z]µNm`Hð™*P×ß9ŸS‡î.úä`±ÒÖέaþèdW‘åc¸?Íí&–Ç‹qÄ¡ ÁŸ¶ÜîwŸ»D3«‘4àÝ›¹t»ó[À0‚…=׃æ°[=Y?&½”èeÜÏ…œãM‹©‘FÿPúW@Mš˜å3€»nµD˜'" ™K¯£¿ù_ÅVÔ\E­}4[Ί\åj Ê—‹ÌFl¿¼Æ] é!¶Üîšõ°‹³EYä—ÇÜ}ù˜»ºÙî†(([‘)[^®¹Ù’£çÏœÎGgM»iöõׯ[Q‚%-¤·„ÝyX~¾gÈ‚EiÊRåcXçBjX쪯¯6“`ÖOXNgPD{±·@,K{eSÀ­Y>Ÿ:Ó¥°EìS”¹œëØ+Àd£Q7)òÀõÆ}ûºZŸ¸HI‘•VÉiX£'ftÊÞ4|ÄßÝÇa¨Á\N˜ƒ ë"yC£vµ—t;—(4¹Œ„Áh#Ç¿¢ò.º"  hF>~vETJ¯&‡ Ñì‘xGøRó¡¢þ„Ñ"3A–Ñ`dª…ß¼øœ13×:aóW9ÛFPxrÉ ‘É·ì*¢çœèqHªGï×[¾~ùTì ^`ÆV8Ž‚Ò¢c[|Š‚s§I ›–þê>ÕQާB¥!óÔRèbL“†`f©2Åž†Ê4™g,¹­ÂlD‘šò) t{•· üOƒ'©®Út¢%1TR”6“Áñþï½k$PØOG%J áÆW¯ „Jw~wCììðÍ,YÜ4FjK5·»3+†žf H®ÖÞ‹A±¡»ø$j‰™XpB SdüJœýŽß‡mùC÷O¾(Aœ±9 ;PÉ—·ÐsiÿYè¨Xðýób¢QK#urWRÜo{BZe©’U·çÄ›"®EÑD@ËôÒû˜«1šÖ|~¶ù*Z¤:¬±sâ‘l<›t¬Yf…LÞTèˆjN0;w²rèë«vKö=fû #å6NªÄ¯ü:(íKj¨L¤Y~‘i»àæÆ¥Ü‹,M•¶Çq×i.,OºNZ «C·ûòJ3inÜ3!ef.¢§OÂdLWöS˜$Çr3ñ⽕‹Êйy…>|ùÄŒº¢ÏTbB>º¤ŠƒëBGdnÇÖÔBea÷#ý{aOOóNœeEvɼh˜ïùœN"Pmf™{¨^š’Ó4gÐÛ.‰œU_ùE'¯›qT€3­ZL³_ó;‹jn±ñÚ™¦-_%©ùg’óÃÞv¤¿.lcz= û¶î ȇõÚ½éñÆB~÷èÓÝÿL¥‹“ÿvæÄ È}$øÏ…5þÙ¨#è6 —7°Û‡öœ÷_ÏOŸ9C0P^_úÓô\»àf91íLÏ |wȦ¯Êeñ`ö4¢ä.ŒÝXÍ<ü…Øß!V»s{ÿ„ýHM¡ƒg!`ÈmñÛ:z»Ð?{ÅPn÷T qL™Ù¹` }’‘›Ék¥Î\’-3.[ …‹û‚–¹ìLæò+N¦GüÖU&»í½àë̆­nð刎 2â&÷T‹åuã—:RîštS—Ð˩҈*Œ‡ðÇ}˜€¥F¦tQ&„!*+Š)LÒ_ùXVüùK= –= fv„S÷ °˜õú+ õ{ÌJÄd ®õ˜…Œ{p^ãOL,‹¹Î€…öa«SÇs/-’½{r»GLKæCZzc ªRß1?òúú§¿þøÝ/Ñ­5¸ÜY~™¹Ì‚¦¥önù‡7ïonß|óÓml½,…{ êÃ÷±¡¼PRó \)>X" õMÅÈïÎGrˆßþÑ¿U‚¥L6¾ As'ìo0Ä7vĬT½ëÝwÛ-Š$i¥bˆ°BêÒQ.Šê«ŽìŸß ]€ük·OÝø‘–Ó ð…Ë´y”Ã~ýš’{ ìëQA“B÷ â+\srç j6ãa.=Ã)÷“Eàzny\äg=0¢s½þ Oñ MЈ’Mž&×­›Ò³Åµ(¸-ÙêÓœo]\&,Ç]D2£Q_ã)ãD}<çɯ°1¤íTA?}pþóö> endobj 1158 0 obj << /D [1156 0 R /XYZ 90 720 null] >> endobj 1159 0 obj << /D [1156 0 R /XYZ 90 302.3193 null] >> endobj 1160 0 obj << /D [1156 0 R /XYZ 90 194.0323 null] >> endobj 1155 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F67 89 0 R /F55 27 0 R /F72 6 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1164 0 obj << /Length 2839 /Filter /FlateDecode >> stream xÚYëoÛFÿž¿Â0.…³Xî‹ä¶¹|hzqshá vq8¸JK”Ć"u$GWÜÿ~3;»|È+Û0Wû˜Ý™ÇofÙYìLGg‰¡–Ir¶Ø¾ˆl÷§̶æ0c>žòýÍ‹oÞ)vÆ¢PGšÝ¬&Dn–·ÁÛM¶›± Ëgs4³¹"ÐßÎæRÊà笃¡M¾Å±¬+àÇÂ4iÚec–nŠE‹2(*üòàÒ«·3žŸ‹üžFkKý—¼ZÂ2»!ƒ]`‹pˆI5ûxó¿éyRœ?Å5Nñ°ÍÇl3–†‰Öê,NeÈ„T†ù÷Õ-û8*øöoô}ýš¾WW—?…[< l2çq("&Ý"~´èCYwâ‡Û뢺ýB=¥ö>~¼ _~¹˜ó þß‹?Ôø8¥/ ý«}÷`ƒ9Ê-~˜Ÿ8“8Zr™×[þíKa·ÿ¡hwevø±n»ù›ó¦È·YU›3kÉœ[qÍ™ c­µÙåfS´t‡K$5CMàIp€†Õ€n“Ó„5žúQ7ˆþô:€>S,>ðKá;lé(µsêŠ(wRÜ®!Õ¬»¡kÜÑÄ*Û[ú C–2m‰[aøN!#<…²C±9×I¨’Hq‘]9ñ{I¦¡‰c¾ÉQÕë åõsf'WQ@æGí¶k œ±ö@§a,¥;äyY/²òÜ»5S°5;1³û€As©ƒÏ3Y¹Ïéç ,Ö³W,@#úÓÿe¤U¾ cP$»Ùßå$ ŠnØÁú”ܱl¯Ûkë`HåáR“PÄ*¥í‰Hн÷éjº÷;Xœ¹WQq`I#>}*k³„Gcäø¸lc„o.ÇèÀ“àoäÔ@ÞM.t¡ƒ[x}EmûðxøýU$ï‹jmÇÓ2 p›ÌlœÓ`½²“œ2@Ûw0\l8¬÷8 è#Ïà\¡«£w†f_Qj)Îú\8æîí¦Õ…ïîEÂBXçôç1%Ÿ‹4ãbz]Už/ÍU[‰¨‰Dìé<² ‡*M`»Œ4°²É:jye3‹TÔSj s‰aFêRâ·8íüþ•~“I4¸,»+ݱpm¯ƒEÝ4¨¼, sÖx„‹Ö[eЫÄX¿Š}‡ƒ©=u~YÂC‹äLAT‹“TaЃn3< Œý¼ùx¢<$ˆÇ¼ÎQ_!!4G!§Öí5œ²Þ7 ËÁ[2šåÀÓûªí²²$ÄPWþ â»lm'0©y’Q ;Gl“'Ø÷óžâé!Aä ”‚…€n| Ãô`d…·ºGoÑy•?Ö¡b€5¾Z÷³ÖèÉvØ:Ÿ'D<è“ÊøFóæÔn{Ç€3>ÕÒB«õP ÙîöÑ5Ô™yÕ•¥Ñ; 3³±Ãè•÷¨Œ• 9fà `A¸ÕEæ¨Ìœ7<Òð›Mî“ 5K²Î››Ã.÷Æ)ÆŒ9?SïzWŠfQºëZê¸ |)»²G¬E‡kÖªv!húWZIèE¦Ç~»Œˆeï,|Ì!#ÇÝSq1€ÅþXÔ[ò w¸84¥ÌÙ:ûÀBµŒ§Rn7µQ×¥'ðÙvº!úð}=–ðƒ3¡€í€×y».¼XBð'Üñë p\ŽÅ’ªò/ŸVBŸAËÍ9ÿ˜—@K˜ÅÆ€ šo3>×ÿš¥‚Â%!êWÔØ·ÞûUI˜$ÒmwW;t­ï J‡‰ìEcv“Éc(áÉ{ ½ÌWZnÙy¹"p)ò¹ê¥B (Íá¼Ê ‚9@[ÙKêQsT“¤—)¸a¼›¥”Õ!o½Õe½&—¹×¢/ Y¢Å1vº•G)Ì ã[çmMeì cFPuKpâbÏt{YµÎ- <…£Pª^Åùg²‘ !6xÇ|žÈ”íhfóéëË÷ÔaÁÌŸ ÂÚàŒ©Î€—§\“ˆÿÊl'áh{ЯmpCj Ý€ÃHØ´U‡¸¿4ÿ)œnfØÍ*t¸Ø4g¼.b0‘À]Q=ýÜ|Rj€ 3¨ß™e1a™‘e£ô±{;ò ? `qÆvˆÀƒþO˜Å •€³i´æ äŸíQ‘‹ÒĬ9PïÊE7,¶ñç–€•xì‚×?›¢ËßnöÕ'¯¡¢`¼1æ+«yаÉIÝÚ C÷›šÆ])ãé˵Ðq™±I¤VV£ gä Þ gGðä(‘DZÅÙØês”5mõÊÎ1QÅ  ÓKàÂC\¡S%é‰ÝÒì8™ˆŒc¬pâ]å)¬¡£ÔØ !ñÄÉ~m+,>Z2 £´ì^‡M@6ÎC®ó*o²ÕUƉ»H’ñã(þ[Ĥ•ŠRŸ-«Ih‰…:Q ‹}‘Œ9éƒê=pgÒ Ü'Û¦Ì0sw†ac=®íaG è É9¥4ǧFQ)ãåþp"ÉcÙPEñ°9ZZÝlQñðgf n‘;åì0…Ç;Ó¬l#F±âSÙþîMbÁiõ%ØeÃëz]zÃ8 •”N‡^Y,!› &N@ ÉR²MÉ ÿ£Ò®Œ9±Qêˆ?ðòLœ´c5}3ú<4GæÒ^6„Zj? #Ø{ÚP]Ñ·°ä *YŽi&WÖ_`­Cè©l·qja34vÈm w¿E7k¿øSÀF:ýù_Óÿý8d:í‹…@CÖþd„{uG6t“^ÈŠwXšÊt°ñG"ÿ/½"š˜h¶Ú‡hÝ6ö£º7xÙaš‹ë/¯¯„ت 8ÕöuD2,ä:=º£»À"†Mÿ mNBš½ÅÝÞ™•ˆ•ñcWÌ…¿ÀUBè.箨¾yýöïožqDµÝß™kY4ŽËEW7Úܤ-0«?„·T…KìhF땚îFIL‘Ó”¥S1mmaÐÀ¨  Á†f.‘’.«Ê-Ô*¨¶áªˆmí ß} Q;·mF=@:—©âÓ‡¨¥àÅúš÷ŒÃëØ'±íDMÒ3f %G(›}Þ:žxå8zßÞ4žõÊaÚ·úõÈ‹‡{ê¸Þ7«l‘»Óïît#¸p¾=,°q~ñ’?û6€Ö=Ò²mR=h˜ kÛ^[Ðñø5ÞáÎÇ:&‡Ô3ÄfLìq2ú,ÉøMab!åÐo †ËáÔ“nf`ƒ?úê zÌå$Â’ G>çûErÉ™¿„Ùg2“HGFà‹zña¯µû„ØÈ !îÇîû¢Û<ö†Ø»hSÐi|Æä{Ãâ ™}Ü•™olß6 O¦ÉûX2¤w\ÛÜŸîݽsçÙ¢Žiš °Í¾8WWоü‰È º§Oùa×¢]–ùØ©F% :‚…øs(¥!/&å¦"o[S÷ û–’9®}‚Q/f°i˜‹Nâ#O\¸gœQ*ÿ÷×}žòÌÊAãèEÔ¹V“WŸ|“t’Z ×ó†)…o‚|Z“Ûfæ¹Úb?¦=ruTGê+!ÆçÛ·IwÜv_ÚÃ>ÍŽ«tþú)“°{±g×þzÚõ¦ö·«¤ò ÅïÅ3ÍqÎYÂmËG rÞÕ=°²Õœq.‹~m2|dÀ>[>S¥Ðå§àÉ4¢B-¹œ¤î¿¼Ú“ß‘ ÆÒ1^ÌyÒ¾>›8X‘K1徬sÀ—¬ Z% rí&/í‹dÖº‡“ÿêña¨ endstream endobj 1163 0 obj << /Type /Page /Contents 1164 0 R /Resources 1162 0 R /MediaBox [0 0 612 792] /Parent 1161 0 R /Annots [ 1166 0 R ] >> endobj 1166 0 obj << /Type /Annot /Border [0 0 0] /Rect [172.5637 515.9512 406.6701 526.8603] /Subtype /Link /A << /S /GoTo /D (Source Code Installation) >> >> endobj 1165 0 obj << /D [1163 0 R /XYZ 90 720 null] >> endobj 1167 0 obj << /D [1163 0 R /XYZ 90 421.9181 null] >> endobj 1162 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R /F67 89 0 R /F55 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1171 0 obj << /Length 3474 /Filter /FlateDecode >> stream xÚZyoÛÈÿ?ŸÂD4ç ‡ì ìi¸Ý Ab`Q¤JK”ņ’Š×E?|ß5$eìn8ÎñæÍ;ó(u‘À?uQ$Θ¸°Î]¬v¯éþòJIk 3–ó)?ܼºü%U*‰‹¤P7›"7ëOÑÛò°PÑP-–*êKcLTüy±´ÖFoˆ¶ÕÇÊ¡†—5yÚUGK·õªÇÕ{|ê芈µ»…Σ¯uuÏ£­PÿPí×°L6T° ,S )›->ßüõÕÏ7ã™R­_:5N [Ï­T»¢H/²ÜÆÊØ”¿+‡­nÛ»fDÒè/üØ=¬¶Çý~ù?p’îê[~[îe殌‡z³A¦/q°£Í4î¸Ô²ãRqnmXÄxêVg&ú‰D0”uƒO”¡ƒ6ü¶62TÂLðX•KÞ/·óý´vqnU2Á¾ ñäb“k#3F-ZÂ6i ö~]%i_ÀkyG˜è©E-µIc­-(A±Ò¹!ò7xm“蟲èDÚÆÖäJXy÷îê×x"n€ùÌx–_3E´ºrµÐxK3àvRѱ¯zn [¶0lÓ1ŸÙ¸Šöe3QêÚ»®Ü=ër*. “ÑøMUœZ[œò;´ü\µ{r üoäem™¦±Íü†ègèdæ§àŽ`]…–©-hý«Ú'_,Máâ¬È PމUš°×#Gè©(xnmZdFì ZoØYˆ¹b»ùroÉkVl@ ÍYó@õûPu{ÔRà ærÆ u/„nV¾x¦Öò¶~ډ຾n%ÐìJê £&þˆ±ÞU—6eß(ª•{~9äb¢ ÞSXƒâs±ÕE1Ùvšè3õ{¥‰Šîë¦áVÏÒª1qx$–Zî×""JRˆ—*øïÇnÃÆÞ8`ϳ<±á³ë*š2àFÜK^Rl(ÓAgv‚ÁÇsv_¯@ó6CŽ€C0 8uÏ=ûvÀFB‚… hØ;{ «¡yXämË:ºÇ>$_“/oy= ‡ˆiÏ&½\U˜WˆÖÑÔûOþ¼~Ÿ¡ýÌ´ú–´:ù‰¡ðïQym÷EŒå~%Š€¢xS÷ƒ8¡Ì ×%ú“Çߢr÷¡[ Þ~>@$Òr3r½˜^_7‘òa`*4ïömçÓCé=·‚d Œs5œÊŸˆ‚ÈK‰°ÐsЇ‰ŸÐü@D)fVÝ[J<JzZÊ8ÎI`8Rš…ÀJƒ#}XÄmI<ÕG8Sè^ñqz@û¦H"Ú{°¼ J8_|D(±ÓNOPÿÊ’ÿG’&;N1šyXêÍh‚) A• '*Íc˜ßgXJ·@vF64“[ä&– ™Z@ØVFík\ ({(®A #—­ëê¡"Ðb@ŸI}ô8!´Bd˜Íé}¸~9ˆß2“‚Øv%]Á$0.M¦áìÊ6Þú ºqêÄu°ßžU}ê#@s„ˆ8^òƒ(£‘w5Òº*´;Xu·ž=ZØþNd›lÝ£¾œØ³œa>Ñ• ¤:žnÇáp>]UïÎàÐ<¡²FN›ÏŸ¬¸ç®¡ì9upØåEÁE@`²åŸB\AS¯>„Æ´ÑdºÜáµa¸:RT?plçÑV°ÎÐ`Ó'ò5™Ãðº!×(\`¢w“dY@Æêfh“¹3§³\‚Æ´úBÊTo´ ï¢Áp—ý,Y 9¿ •&àl"‘¦öÎ1p»9Z¸Ž&p<½LÁê™å@xp]Žx}ÍñúšâõµçÞûA¹/øf½ =Øu?B›-¯x.ÍÀ°ŽnPòŸhp=ÃL©Tô;…›´-ç%!pI-×%äÄkúûÙEžŠh=JóOSβ{=faÊW<äáÀÞ§wK´Q#ÉË_-·m?Ä¡bG¨¼d\y¹ÞƒÇRÕ¥¡Âº-]èFRñ ^äâCÂÀË”G4fß©62].[^rZ¹Þ`°,¢+/³y‘Lç 'w˜@P¶=°º:/8PëMµæWRCabÖ:vÜÛ?È…wÇïåŠC/]ûˆŒT™À'iUÈwGoF‚µz?ÆÏžùêq±nu|r©ÒbcµƒAžUìÆyËùÄ@µò)ÁYÍrÉöfOìÄ)+’…Šº€ÓÑ'Xqí£ç˜Ÿ@”à6-ö}&hΉKJ°JÙüñ!©Ð¦­»0Ü"Í홲ä8o9Ÿ8äS‚r]BnØ¿÷|Q“ž°Þɤ í2ä’´îpZ-ë™Hïïßí±áŒ‚s%-иiZ)•$¼?òyN<»ê‰÷”ðBˆ-¶»ê[l8âÛtõ|ûhdÒ”NàeßʳšªIi„.÷k2aºÝµ{ŽiTO:- 0ƒÔˆÒ§€wMe”1dcLÃ8#wÈr²þ•`@á`ÛŽ(›H R—œRœL(¾e.TþÁî=_™8Ì÷e÷ÀÝ>ퟡ¸,Œd9Püç³B']‡pÕBÂX–L…焊¨O*$ÙEUtI<`ÌÙð3PŠázàDˆª¹tŒL¾pAâñ‘£ÎY4 ý>%?%•AêÕ±)…“)Î!lÉ5$X·ß¨šG1î„Aƒ¡uEEyf`TÉ·="π餔Óyg Û„E5¬—DÏ}ªGPö6Lk¾öx5.õGQÞˆ&[H̼Dw¶ôEE;‡"-Ÿ2ŒÄ’—TÇømtEhKÊaå†î8§iX@‘‰ž7Ih¾éÑ¢I| í^ò^ô5‚ulä,T6¶—d=¢Š–Ÿãá¹üWܽ«ï¶T:à×ý˜õÖ§ËgŒ/+0ñ÷j}b¨±ÍFP‘Űèm•ú†ë—#ºÇÀ„í®ìçßaìi}ÏÄi>Þz@È©F @•*‘3F:’3»ç2M|¬ Ý@àÇTyØÜU›ªë™™±>c¥hÃçñ¬¾ryV-b8'ŠäB;gò3@?xΧ„?xŽ3B8-¨«fõÖ9âaÆ(ѶüV¯ƒóO›­àÙÉgtf&t‚/Rêœ~;So¦eø™)hªÚÅE>âí·o¿ÿýûþê矮?¿[ØØ¦Æ çUK«Þ‚Ùšp·y•gÍÜUp[’ÀÇðg‰ûWò}@`ïóÕ endstream endobj 1170 0 obj << /Type /Page /Contents 1171 0 R /Resources 1169 0 R /MediaBox [0 0 612 792] /Parent 1161 0 R /Annots [ 1175 0 R 1176 0 R 1177 0 R ] >> endobj 1175 0 obj << /Type /Annot /Border [0 0 0] /Rect [492.9091 352.2879 522 361.9849] /Subtype /Link /A << /S /GoTo /D (Installation) >> >> endobj 1176 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 338.5312 227.8247 349.4402] /Subtype /Link /A << /S /GoTo /D (Installation) >> >> endobj 1177 0 obj << /Type /Annot /Border [0 0 0] /Rect [90 229.0465 262.1659 239.9556] /Subtype /Link /A << /S /GoTo /D (Installation) >> >> endobj 1172 0 obj << /D [1170 0 R /XYZ 90 720 null] >> endobj 1173 0 obj << /D [1170 0 R /XYZ 90 667.8195 null] >> endobj 1174 0 obj << /D [1170 0 R /XYZ 90 387.3564 null] >> endobj 1169 0 obj << /Font << /F51 9 0 R /F52 12 0 R /F72 6 0 R /F84 684 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1181 0 obj << /Length 2232 /Filter /FlateDecode >> stream xÚYëoÛÈÿž¿Â0œè}’ܶ(ÐK¯Fu}܇»¥$Z"B‘‚(Úñßyìò¡Pqb°–»³;;¯ßÌlä•€òʉ«TëØ™4½Zïß ?ýéô£%P,Ç$?=¼»ù§•WRÄN8yõð89äaó{ô~—2:‹¥ŒŽ‹¥Ö:r^,1Ñ]~‚¥]±ÇµüTÂÇš†Lv{¤­»rÝ℉ÊUtK‡5û…Ê¢§²xæÕÆŸþ±¨7°Í3”À¶IKÒ¤‹ÿ>üòîç‡^&«ÔkR#ÉkbK)ãDu•d&–ÚXþ!M WØ,–*ÕÑ DAte£¿W#¥È¨ÎOEõ²Ètô#f6zAÙšŽ÷­›®òGäH}Ìëmß&B6<$ep{„ðY¸~Èé«Î÷~¢yì¯Åw 4Ãn ²De–RÇÒ 6h¹ó(—Àyk¼ä§…M¢œîãÒ¨íVxV´Ac 2ç©ÁK¿ð.bê¬g ·2ž€¦$…<ó±lOÇrƒîT6µßÙð:û^Œ¡ÆÆPNʼnu®Ž7þáW”œé&FÓ2Εx²'äXæÈ¯ò·£ ± ;Ï%#ï«¥V&±S5õD¿;v¨xßåÁ(p 8ý:ùiã$³ xcRà/I"¢R—•3Z·*úßœR ǰt÷÷·ÿŠ÷³Z0±N´öt×̦W,6-ÏÚá—í뺂@Q’°›¤ƒOø7°ÍX’c³EÇÈI™žË¬$Ò%±6Âø+nÁc(ìg„16Î$D©£)I/œªb!²@ ¦Ø©¦ÙVs§Z[cÜp* nkíÔÔð9ÆžNíÛpH°ãâ3¯wx—|U-Ïÿ!¬˜µ„Èâ4Áþ?}ø÷?>||=>à8‰†È’èæujDmí<Ü–žñ¦< ®AØ—‘—سÀ~†BÄçˆì“eÈ•høP¼ëòû ü ¸‹Ò=öáæ/}÷Ì#†à§*øéM×oªfW7«²žÓA&b™ 7à92,ù2&Tî…r`bž3á¶¡ ‚ÿnxi(Cæc Ÿ±°rV'S=ý†@á+A:,¾´T"$1~ƒà¸‚Ï#4îñ(”Ó£[ëÉj&;í¼PZêèÀÖà•šé…©·HôDˆ¸ Ì=çu³ç$Ì%ÚŒîµjÿS±Þ5œÀ/:@žYP|Y‡,!yz¢¤KU€éßÙT‰Ñ#¡œóðÑ`§*)牚Wä„öF”íúÄäãâ¿{øtò’ïÉXè,ySâ5âB=Xá²7%^:ÕŒ¤œå -Ô Ù’, u Ã@–Â1ë PÂw$w,îÜs_x‘¬«½×ÃÆvWTÕƒU¥kÕXÿž`¬9 O{öä ã-óŠL2pã¡z½ýùþîãýýÃ7d >~®ÜòU'üz-z Ò] ‡M KM =àdPSbf6éP’ÓǦá_(MZˆ Ø<]?¯ƒaŠ4v;žàz24Í&…’µó·7üXsôÃ|4Mɾ9ôo(-O7þ–²d[%í[²ûWày^PGý¶”EWŸòa<Ï@CúpæM9_‡êŸ†\ê ¾h E¦*;wE,Æoþúþ×ÿümާ„^ôxúØÔPÙCÿ§¦/>züâcÒ ŽQq¢zƒ|´˜Ä}Ù7³iÈ dîl|H.TRØØ&ö ¥ÙµƒÓ Æ‘T\zGÂ¥ó`Ùº çªñ!ÓæZ‚Ú²óZ<_U¾0s×).?Ýâg_»ÉvöÝÅùžøs4Ý©Ïù¸­ÏsáÓ Þ½\Ux>,ô£:8Ýöéó¬“AŠËd°Àµ¨H´…Úg°6²¾ Wœ<¡ÃÂ…‡#Ö]*ˆžf’ÃÑ?@gÑšŽÄ² C„ÂWì1Þùgp˜Ýå½Q=ÝŠ_­‹š?Oþüç:çQêE‚IÕ¦œ‰VÏŽ°Z•p¾î¨Y§Vkt¹‚þ¶ü¸ “›^^ñíÓÌ;¸oh÷¨9_ÞÂïÐÀ¾B—3ÿZ6õg\ŸyÊà LZ|B¡7"{Fz7£Vfè¾ÝPZ.ûò•}ÞŠûî×¹ÑK›:# #)N§²ÞzNÃkˆ˜¯È/¤’€7™z 2!ú ÂÿË8yì?z~ëæ8Êãqø¯œÿ  endstream endobj 1180 0 obj << /Type /Page /Contents 1181 0 R /Resources 1179 0 R /MediaBox [0 0 612 792] /Parent 1161 0 R >> endobj 1182 0 obj << /D [1180 0 R /XYZ 90 720 null] >> endobj 1179 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1185 0 obj << /Length 3216 /Filter /FlateDecode >> stream xÚZéÛÆÿî¿b?0XÌ\¼‚¢@×qQwƒdÓ h ”+q%v%Q%)ïîßwÍ”(Û- ˜sÏ›wüÞ¡Õ7 þé›BÝdÖÆ…˲›Õþ•’áÇWZZKX±/ùöîÕWNôVq¡ }s÷09änýè»my\訯Kµ‹¥µ6ÒêëÅÒ9½?t}¹ÛÁ|Ù×Ía±4Y¢òH»|ñÏ»¿¼z{®NŒùq¸ä’ºÌÜè,6:qB]š»X[—uZ-–Ij¢÷@Ñß]‰ôÖðPdœ¿x`Mœf¹£#~Ýùð £¢—…É£æÄuÃß^¾µ¿dÇýwU³_˜,úã5ñçI6VGdEDc˜]w<,ÂïÓ¶^áM[î>ÒÉkYó_]D+ÜÜì§1÷qbBã¶ÄÞGü¯â‘’‚uüz|®¶±NËói[õÛJŽÂÎô(k]ÔÃÕ[iwÍ©….Q%Ck|w×·õ=4N¬Öš¨‘Ó{¿çëC‰û_xjMû ÂK`kLÄjÒw@q§if‰â÷xlf£M`'sƒ„ýærÕ¼fxPÆô5‡×=OåDR•%QyOBjˆÁ¼c’ÆX ,å€wK„¸TWO¯;žïhOiw`xÅg­+!qDšå=¨xÍ _±æ-›ª'.,F‚k(`gYA²—ß‚†8å0ÎÎqx™ÁÕwþê«[kVòRöÉ`Ç_Òøi4¶Ë—$C`YQ´#dðe;\ö5Ã0(¢Ë“¨;…×ÊžuÙ—ÜÂ×  +šI‡`æªg€ìC‰x‘8ñü:RöJĸÌÁpß å®k¸uÁÑÝn|ôÃø•浉"{Å¥Wk^ÿT÷ô6=qôx3y¼‘ÇJ˜Ð`NûŠœ{/…‡0A-ƒ„¸sŸUKÍ=n°’±–2’` €‰žf,Ë•g2ë-q#bå¢_¹åìIGCÆìÓÿF‡œÈ/–ŒAòG¢¬€ð(¥cô£”²­äŒÒøCÿ5çìl–Åθ\\ØÞ½½ýðÓííÝœ·Kt ~ºðŽZ¼Éã"-²FžY0ð5O›!S ªÅH3$I6¨ò S» Ò¢ý³/ÔE'ÊZ!ûÝ»ó×|×àO¡ã ^µ•ÄKr5d¿^2¸\è#Š–’  GŠ»4NÇÖhϾô3zHÈ€u픹q‡,GüÏ Ÿzqç,ô̹~€3B|Ë=¯½s”®²Àp¹¥Ü gÜÍ1zV ™ Î Ã`GYI]´Á{C¥®Ĥi Oñ6ÛVÛ²ÛÎ Äæq–fy¥Z¶—Œ*côe…}½f°ßxt)/­JbžcÁÈ㠟ץC½­ìƒ©€h[_~ë!¡«¤bw:r™˜±zhFYÕÄÜHPë³Zò`i0b ù‚iØâ̽âÎÜeW+¾TÙ/Òdpsxä™àó¥Ã•Ø‚¶v<ößÞ“²ÜP³¾_%ר,6îÜ-u_¾úãw?þò§Y—¤rŒ—¦”£–ô²>³‘y^ÅʪËË÷ålå2C¸°£k3e¢ZÀ“,> endobj 1186 0 obj << /D [1184 0 R /XYZ 90 720 null] >> endobj 1178 0 obj << /D [1184 0 R /XYZ 90 720 null] >> endobj 1187 0 obj << /D [1184 0 R /XYZ 90 577.9685 null] >> endobj 1183 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1190 0 obj << /Length 3437 /Filter /FlateDecode >> stream xÚmoÛÆù{~…?ˆ T ï…<²$išy[– õ> ]Ñe³–H—”êØßóvGR:-FaÀ"ïŸ÷Wª‹þÔE™^8c’Ò:w±Ú½Heùþ…’«%@,§ o¯_¼ú!S*MÊ´T×›Ù!×ëŸïKµØ×—Kµè/—Ƙ…J¿»\ZkWí°¯¶[دöM×^.µËÒb¡lyùËõ__¼¿¯Î´þrrŠÓÊ$) 'Øå…M”±a§RD+Qþ–›Å÷xSïñ˜5x±s—-:¼Ùàµ]Ä]Íÿl›/|õ¶i«·žŒi¤C*z¤¡CZ¤ð˜yÀ^å’ܘ’°»†ÓJO¡´N2ë,@#P#<ŒgMRd6¬H Pôhàþ@ÀBwØ®yéE°@šlÆûõv³¬¿<ŒÚjßõOpõ²tñëa£úCË,TíÚ_<ôx©‹EPØÚßÉ‹~CM@{D°k‡Ä•À”À€Ä],ó<1%нª,eýèÄ•¨Oa·ÍïáE. ¡Ý®æ»u½¯š­lmºžXd‚ë¾Þñ~µÞ5m–{RÕ®—§‰J|ºZz^;xàÚC=>óý®º&?ñ“x L”÷¼²°û¶ÃÕG">S½ëzäXdÝa϶µÇÉ^x?µ²„Tìôl©ò¤,UniS핪qÈ‿fQ­ö‡ Û>ñƺkù¥¸{ƒH?ÅôV9ÐíÜ*ÑÈ]u_Ç´Ô»L‹B @Õ¬qÀ²µ˜5¸h-ža 6±.œ{dHÆo¦B–½áÖþN¨›H—wHlª„ÔTˆQÕÓ=1´½X@ÝæThäøv˲oÚÛ('ÁK˜Ò~‘9ø x¡~¿ÌòEÕ7 0 ¹Z0`; €ž P²¥îž,jˆ¢¢ËD[Oq¡ÿ$Às“ùG’رpD™ ­]§‰MsVÐï?}üñÓ§ë¨|3|ÀÉ©aŠ 8.ˆlvÛƒ$\¨ˆò¶ÚÉÊ=C¬V‹ž7ÝŽ˜ÒÔ Ô“­‚ùóí½U_¯ÈM‚ ƒs©=çÇ Ø`¦”×ÈÛºÛÑÉÚ²]Ÿ§m¸«™±À¦ tL»#]›êö·jÁûÞ5+ÄýŽ1%[†ßÇ; JV•‹kh/(þr&~fz'¢}vË~¨‘/ŽøB¯Ó;<;ý+ý b|hgÚ‰üëCÌåÕ¬MOi'ªÊn£‰×ots7¬ßZHŠ•€Œxzy>òF[ÓÝÚ#MÑ'_\ ‚ØxÏäøÒ?ÉÆîuÛWS”f/gø ‹üœ™‘•O ìÌÆ2€P>’W7ƒ¨0ñ7j :12~T½'«8ýÅB“:á<¬‘àqœ€ðÑóûðéÇ袽Š^¾zy©Î˜±BÜ5¸‡¥*“²2ß^ýãû«c˜›˜ÜèшU‘ñ‹” æE(¿Ÿxã¢oÍ—õÞ'¡"ðò¿SeÉï‰SÇ5"Šö /;¬zL1’{œ 9Qf¥{†áZðŽN3Ã¥—‹"E”©|qËΤ–tG—%ä­Y67¤lLçà»1¿°9§t0Þñª öЉ)âZ7zù^ _…mS ;qñ¡ïn)ÓÙù$ ÷ä)ðŠ0¯0ÝcðÊLçV¿fЦ•GºöWvŠ÷‰EÄÐI¿b\·Àt•?‡é³H°»¹¾Ö¹:Vt•BòÁf ‡Ðhô¸/ÌÈÙ‘â/¥ŸðëݨçÄK^þO”" ;˵·Óo(Åyñ2÷yÓË@PHRjF—…¹”È taÓÌ™ ’FÁ’órO$mÀé»0ц}ß`ø<ìQ®øÊ9…‡g¢ô©œö‚øÆGïW7MûêOß¼ûËõ¿>¿ÿsŒde\b3hæ×­›ÞÓL1öµªURæYqDª$WOÃâá|…G4›§IòÓHJ:Baª£2Sàâ”ÏÆ¾æÛŒÀ}ë_]Ëñ•Oé·žÆÍètÉ?ù'*q×1DÜk¨Ó–sOüñÍó°xb¨Ñãž7Äk.‰aý ßì80bÝ÷bÒ-†hܪüÍÔkJ›Ø™Á­çõXss †5ŸNnÇÙ“k“h“—sýˆª,ðȤæDawU´^w•ÔJªs ¢ˆ{”ˆ:½Æ G2Ýð3AGѯŸê(‚EbA?ƒPéÐÇ=MMï<Ÿ+u 4ΉŽRÈé}LD«C=RG\ÝÖ›½/&ÆTöÈ‚9KŽékÅbšê#uýøæó›w{óáýüçùŽ1…·ÈÌQ ¥äE"D«cœ¬yåc5ÆÎÔÅ«Šs lnU+ŒÀ÷po¹²ÒÞœÕ\­­Á@4ðÎIº¥& Ÿ_Í£Ð21o›Zñ 6͉éw5áʽ,‚`‹ªzBùnVæf¾˜Eó¤báž²r" ·ÇÓ›=Ãm»j=¼æ #è0n„a|g͆nœÉ€E³'ž¥ ­ð?ò’žïbDâ:Ç`RV¦“|MF͉’\m¥v»ç’œ)¬g:TøgRÛCÍ[X N@bNâ‘ÍÏú¾ù|&®•˜"ÏŽ t¿3 Zkâ7d´œCv¤'pãn37†›í%×7P¤]{QŒçEúE|ÈCïX‹U8ÏP‚RZñ?¿´Û‰ï¦ËÒÑ,‹<'aœeÁÂÙ,«´JE‚–W†*šbéj“·¼Ÿt`ta°ëËŠ™f‰V:;Ͷ,$*£0G2Hª9Šá U¢Ô 0YÄ÷â gÓ,—8g¼Q=3c$³˜¥÷üæóØÎâ.‚p ¶Y XóýMÈ©ŒN´vùÜ…¡ Ñ’n¹Ž†Æ§ì2¹òC´•8N¡úHó‡ªÒântÊ®éï8ÿw¦o§W¸ü8áŠnT’Y[Nr¬Ìx+GÇœEá*+TÆeüòh¨2fó)Ü%r3ã'¢t}”çÂJà<\ÏìU08μx¦?i3"ؽÎí\¨l*“Pîô|ðE»+*yñúLóS)•¸±Tÿðì~îKy=ÒO áT˜Î*«¾®8ƒvXÇ×-ã0qLÜi§9ˆE«ó–ŠÎÒ ªà9‚¤4ÃúÔÒOºcÁ!3!s©|¥…‹c©™Å]•Îl,tàòièÀS*9yü₆™Œ 2{+âî7Bª„† aze³r6ÌÄJ±(Ù‚¹ÙI7èÆÅ;ãWRxÆ|THûò ‡æÁªÁ#Ä3H`k¡pvJ© Aô¡¬ú#£¼ endstream endobj 1189 0 obj << /Type /Page /Contents 1190 0 R /Resources 1188 0 R /MediaBox [0 0 612 792] /Parent 1161 0 R /Annots [ 1193 0 R ] >> endobj 1193 0 obj << /Type /Annot /Border [0 0 0] /Rect [147.6002 277.1178 353.8731 288.0269] /Subtype /Link /A << /S /GoTo /D (Package Installation) >> >> endobj 1191 0 obj << /D [1189 0 R /XYZ 90 720 null] >> endobj 1192 0 obj << /D [1189 0 R /XYZ 90 720 null] >> endobj 1168 0 obj << /D [1189 0 R /XYZ 90 263.8841 null] >> endobj 1188 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R /F54 117 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1196 0 obj << /Length 2747 /Filter /FlateDecode >> stream xÚ­koÛÈñ{~E>8ªˆ˜]îƒd¯(Ф¹ô ¤ÐC[ ´DÙ¼H¤Ž¤âøßw^ˇLÕpðîcvfvvÞ²~©àO¿ÌÕËÔ˜8·iúrsx¡dùó -£5@¬§ o®_¼þÁé—ZŹÊõËëÝ Éõö_ÑÛ»â¸ÒQ_®Ö:jWkcL¤ÕVkkmôcÝõÅ~ûE_5õj¤Ne‘vjõŸë¿½xw=vIòsò î|fcm¬#î6Íù:wõ*É£¾½Š*àÆ8˜ßw%¯ý[i»—q_î÷lÕ· ÷°J²¨9ñäÑÝѵºám¯Ñè:@T݈¦}5²¡£ £”N[fFG[ÆwƒTx\~Á ËY–>Ÿiï1Þ­D9ƒøÖÚÄ u~²®9µ56êÛ@±|Å×á¤á1"˾'vo;>;Š$@ñ…£’îSíô7ïÊVèBǧn¸ªI€V ¸û}ú–˜¢*cº–¶  îæáÁs~ðw®ý„7íø¹ð1Ai÷†ùÄItµ¸Úój×´|þ°è ¸¯ŽAÎp²{ [÷A„š¢õTaÕ¦¨y€Üð®v`<âÖª:ìNèáñªe÷MKFQ¬YLÞ¹oKÔÚ¹7ð‰ÓÑ _ø8Åißã²b)ãþ\þ<èÙ ´o­À‰>ðéÓQ°4¼‰’Ж‘¢¯åæÔ7b[Ä¢%Û]Òþ-îÌDX çÒ$º'£Ýà‹ßá +A]%S‡uögZ®G{2Ö—šÃµæp$Í.[¼K†:-å­$÷H¾á£E+Ì[½°}¢+Ž+Tk­›ž D€킸Û3OàI÷ŲQY„+㬠¡K×*‘É¢k²E°‡KZ"bD dÛ[ðçËÊy|Kú•Š÷Y‰Ñõ Q´dõmÉsöU0臠ºc—[ÔåºÀÉöï $â áe~®ý)¼ i€£Ú UAX´‹‘f¦ÌèÎïq¡À…¾Ð£8žÛ!Uáî,|çÚæs·¯%"¸Øg΄=;„›N2NØhpDΗx$a K·™CNæ!B²<ü¾lèy¾Tå=ƒâÚ4c¯€ ì¼qt¦d-¼MœÀlyQlíž.ÄóIô· Îÿ.Z‘Ž}®S±ß½wõáWWׯÅçrWó} ¹D¹-w]|»on@(‹F¦bë+X¾Cz†”ÉBb-²–,pâU¬ý`©—ÌYÃÐvƒó¼üHÖ€ÀedI‰K ÓÆ‰Êü\ZAµÑ}Zg–Åe|œi˜„¬àôu‘Í,öÆë Wø¨z#hc 2¿ùô—%”VÅ*Wî›Qv·Õ:Æ:ÓþùèÂeœÀ0˾™?Ä·¾Ýlïì@Úiúíwnö Ýo*ÆSm›Î>%jO¶ç;|žB—Yw¢€.SíÎP‚®5Ñ'4wŒ WŸxÁbîhr‚höœu@HÓ®¿p “Å™÷FØk;¯”Zº†ëzc&’AŠ>ìkH| ž8¼O±?Bܸh 1†ŒÔrBˆƒ÷ÕÑwaéÔUT]Á°àÏy†²‘óks,?ðEÄ¡Èꛂ½/ùYÙ,±äÃýŽ;–û-.o‹:€¦@[ƒø´·±Íí™þý3É¡SÁÝBä¸[jyr}{5´‘f–N¼~Æ}‹y•ŸeÀU-F~{j§-çl蜶<ãn0õ›6rxÒ2fC“Æ%µ×zNìÈ\hT<˜£Ú‘ÝfH•nÆf›p´è©K½½ÜüÝî‡j]ÙPž«’aºÄÖªÊ Y"îSð`/Á¸üX×ðàtè:ì®$‘XrYûDå“$)dYü»ÌÂ=!üƒkôv!Ÿ¶‰†m¾T9;ã²óFóò2$°œˆ­SE?¯2ÃâM‚xaPìÃ/ÄßÌ…/ù gâ ˆG2¹ kâ4ñá>øÐ6åj¨›¿¢uTâ¾$Fïà—Ißn‰åck‡¶ 1s1SÎç<@¤!å·X¿æÉ™úÏRMI'¨ðDkî‡\{®x¬I¯ä—šPÈL²qìóÂSbN‹3“ž¥áç¿>¿ee›û4Ñ> endobj 1197 0 obj << /D [1195 0 R /XYZ 90 720 null] >> endobj 1194 0 obj << /Font << /F51 9 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1201 0 obj << /Length 1330 /Filter /FlateDecode >> stream xÚ•VMÛ6½ï¯ð-°â’)‰=5 º‹öÄÈ¥íAkÓ¶[r$züûÎp(­di±|09çãÍ㈇ŸX¾ÊÓ”•ç«ÍéŽñ÷;V h$c•?ÖwZ¬g†±Zï&FÖÛ¢'ë\UÇ"ÚÇIšªhid7±Ì£HëjSñK}¹Àþ|ŽøÔ´Ž„»¦¥Å|´q"¢æË"z©ì49/D$´ˆÿ[ÿ}÷çzðTKù^,¨2&—+‘3)´ Ád…b"U:ƒ8pÅUè<Æ”kˆÉ(rn§2:ôAå ‚ÂˆR"å]'[Z?á Á©´AA$·9…¬Ë‚qpÔ{±>ØÖR6Ë–Ò‚ëÎ{ÁìØ¶Oê]¢ìgG×úÞ†ûs¿ž{1ôu¥™ʬ‘AžŒò 'YÆ£¯UW¡1×ÐM¡ ‡h%ñ¢+}¸zÏQðLG¼c¨å¼ôþ¶ÈR§¬àJ¬²Ô@®¸¢JCêàó¨Òƒ^2V$ìÊqžç1˜ƒsçß®×+Ûƒï=kÚý­7i¡™–ÆÜx3ÃÝ ·àͤêsƒè dV¥EôWHëÆ—¥ÆÔ¹Òc²£lù>–ÎvŽÖÛÆWxÓW<ñt491eBs‚ÙÉgLƒn骦¾'@ÔC麀Ãg‚Î%@gÛ+ÍùdÉR°PÖ[Z<ÆBÈè#"â3Iþåš?Æ…ŠZûãÒÛ¡ÃGØþ$­ß½ù`êó';° Ht¬:G0M„fY¡Ó¨ÔÐ2õËë=œO \oOeu¤%öŒ)ˆQ°Ÿƒ8¹t~Ñv¡…§Ðâš)Yd€¼÷÷¥6×,‡J ô¼c>ȳÐn¼õ]ŒT²·¬ÆöEWÐËžŒp9ªü9ˆ<‘)*t!<Éy6-6žÈsTáÿNxÞã験7ŠÑ)ZynÈ3m«n€“¿µ(}Ý~Ò¦êªñ±„+[‹ÝÒ3ÿƒ¹>4.P„(rž•ÆGȧ‘}k¼‰8)üt²Ø4]DE8ÀÂeP´§³ ®ð ¯˜ñÚ†€ž) HÇõ‚÷ïéU5ý{ü ‰îJZGß,LÞ —á³knÙEÁ2ÎåJçb+ä\7è%cÅv™Äd½âÚ^“IYmÛ%­éˆ Óè%\€:ZVZ½uù P¿%[)×ðìLÓ1'Û^ï½tÌ ¢g‘r|cÌlx¤ —.ˆzHÁ& âåþåµÏaw.÷6,K÷vq5<ó<×ïw¤¸ðÍ Ž²îæyÞõ ~@9•µÿZÕ»æ¡ë×ˆÓÆ.+­™Leqãò¬ƒÞ‚Ë“Ì Òkç9+Õ†¥"7SòNy ï6_¹!\"ñ…FÅ2Ín-=!(¤Q”Æ68¨äÎf_õì„JžèpÑ]Î8#Á¦@<½*¨¹g%ì×N ¿Î¸Í¢AÅ=Ó¢RIÛÍ‚óóës5â²î2™Ñ€Úé…Źõ¾·åÉ;3ŒÜ&ƒ+¼Ýøå¹¥£¥[`ûµx’T--f‰Dá§þ‰6aTÃo÷˜hƒ¾=€ç—èyqT`Ƀe×ozruÎÖø<å0: ç·¨QD§Ù u½ž9N~b¡¯/4ˆâgœeAuZ:TœaMõåSp)M©ÏK¡ÀýX>oq¥˜1 :’K¦DöV‡÷jÉHo©ÁoÍ- ªÎn k;6ç°ïÔ‘Yߥ¹“¦½15t,^÷?È¢n¿ endstream endobj 1200 0 obj << /Type /Page /Contents 1201 0 R /Resources 1199 0 R /MediaBox [0 0 612 792] /Parent 1198 0 R /Annots [ 1204 0 R 1205 0 R 1206 0 R 1207 0 R ] >> endobj 1204 0 obj << /Type /Annot /Border [0 0 0] /Rect [253.8041 637.4761 385.5299 647.4761] /Subtype /Link /A << /S /URI /URI (http://www.geomview.org) >> >> endobj 1205 0 obj << /Type /Annot /Border [0 0 0] /Rect [111.6002 569.0369 322.0549 578.7339] /Subtype /Link /A << /S /URI /URI (mailto:geomview-users-request@lists.sourceforge.net) >> >> endobj 1206 0 obj << /Type /Annot /Border [0 0 0] /Rect [111.6002 555.5832 455.2328 565.5832] /Subtype /Link /A << /S /URI /URI (http://lists.sourceforge.net/mailman/listinfo/geomview-users) >> >> endobj 1207 0 obj << /Type /Annot /Border [0 0 0] /Rect [144.9942 499.9917 276.72 509.9917] /Subtype /Link /A << /S /URI /URI (http://www.geomtech.com) >> >> endobj 1202 0 obj << /D [1200 0 R /XYZ 90 720 null] >> endobj 1203 0 obj << /D [1200 0 R /XYZ 90 720 null] >> endobj 1199 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1210 0 obj << /Length 1713 /Filter /FlateDecode >> stream xÚWKoã6¾çWø¶2°fDRÏí­Ýîb{ ,ÚUlÙ&"‹†DÇÍ¿ïE!s¥þK $¹×£T Y %óÌëQT™:˽K¼\ƒü0PÖÈá@•9íYž’RZR°F¢ŸaBê• .€Š@0UIý% Ö­mÁúª)HM"}Û.W™®“74”=áG•4CË«†í.ÚÑÑdÃt°Mãׂ€ØÁïŽ9¡›hÜ3³,K‹çË^êÐ=þB¢µ[fÿ•ˆÐ½¹÷#,`§}äŒÞ$Áë(MÓ¡Pq©…ÌSVœ(ò¡õ×`MÒ§é9°PJû‰X䢖Y | ði)¼•õÔÊ2EK)Ñü¾¬²Äv§w ü|Á…´»¡9àÎ!X ¥:“TÃËœ#e&E•jåï 1@´°ê…Ì£—‹´¸hY¤%í_¤àqÞ¿ˆB² „D‰"mx~h^¼uý4‡ã`É?´É§ƒ/‘ý.i#ÜY@¬¯}5kǤàß9ÇÙB”AºN“ÝM|à*øbpo‡‘¿ŸÑøo<= €V1óðóë-F9.„TÄ©¿ç{¨©?TVˆ,-rï(ŠÂ¬Nc "Ì8°J…¬¤'ÿÀW“ᔩc„ƒµÎŒŽïý3ÍSØâ ooAKJ)Š4U‹0G§UÅȰ=A®H·š2 _itÏ%Ý;wüôøˆRb´§aÝní°kEߺÇCcºCÓÓ®é·öñÞ S‘³<J«êFä;°t3"_Ùôž!Š v“>?t^ -Ë›$Vÿ#‰cj'ïÙP>ï8¾†Ü¶‡0sÃS>-+´k ~ ¥ÞvvGI0²R¢¬bx„ì«WÙM9…×ñ]æÓ»0Êé®–âæ#J“&ßp™Æ:1#o4Ì!@º6Ì¥Î] )›Ê ÑâÀŸnß8>€uÛ´ÄUÆä&<ŽöC4¤L\ã&Ij{;ÞwWsPp\®@C;/U\`JË â;4’±î2ÀQ~!)§ÓðjÖ(­***Ê=iOü‡¶áV&<ª?ó70DÎ{Œ:¢U•GPpH2/Ršh÷î D¼y8›Í,è ¤Ês¾>Ï<Œ ¯ÑnÄ †€]ãÚ #ãH2È2“dëªL§òÁä´ §ŸñËñð‘'9˜;þÍñHðµnœ±½ˆ-êƒí^gý†ùB6- îSp[¦ŠíÌ‰èŸØ¬ÄN«E'EË rUÑlVAÔ¹£ð={›d º°pÆrûHÍÛó{7«é¦¹Dq ØñZýâÒ’`‰ÉKŒØÁ,©WJi:/æ,õìp°:¤œYŸ:šñªq<â­–Ódä_y§H …H¨2È®k‘)èsç‹K¤[M gŠË=ÃIq9ŸÏ"TÅe®?¿d¾?¿—Aθ¬*@˜‚áô»Çg/@!Ã(…Ð mkÓoxݽ`et À¡æKƒ„_¶ßÙ›ð5±W¢¦oò,ñ<é]ã$ø&ý rrœþÝvÉ ^hêóô´›×¡9¦½_ø–RŒpH^|fT—÷H•düÆx¯<Í$ ó;^OyÀÕv¼Î§Ê9¦[. žHü6ªbCŒ®¨&zR—©­÷ä¤É~Nß뢙•¦r–„rÓ™bÓèLO3´|Rx³‰;å¼ÉmU©“ïô>81“øøÀB$bk'»³ÿž°…ÍI­oÛ„ú–„JvÍxŽDûf«¸s¤—ƒ3Ñ}A ÐnÛÆ† ü#äMÝA=}g9y³‰˜+Í&> 7¼ÄàGàlÙðð‡N‰/ |=Q˜i¯ Œ“v?ç3K瑾᡿¼½™ ¨ÛZßþøªH¾Paò—,¥Ì(ýú@‘›ÁÐÂÓ}wõe š©ïöuñ±xÁ-íq‹4q·ªt**©²E¦R‘+-ßÁóH·šÎàù=Ã<˜Ø‹5Øû¶ºJäºR7ÒÜz¤›‘æ ÙïNºh•—"¯3|#×BªJ³m÷Ôc½°í|œŠ é¿Òršb endstream endobj 1209 0 obj << /Type /Page /Contents 1210 0 R /Resources 1208 0 R /MediaBox [0 0 612 792] /Parent 1198 0 R /Annots [ 1212 0 R 1213 0 R 1214 0 R ] >> endobj 1212 0 obj << /Type /Annot /Border [0 0 0] /Rect [111.6002 581.5816 455.2328 592.4907] /Subtype /Link /A << /S /URI /URI (http://lists.sourceforge.net/mailman/listinfo/geomview-users) >> >> endobj 1213 0 obj << /Type /Annot /Border [0 0 0] /Rect [390.2741 497.0029 522 507.0029] /Subtype /Link /A << /S /URI /URI (http://www.geomview.org) >> >> endobj 1214 0 obj << /Type /Annot /Border [0 0 0] /Rect [230.8124 418.0988 362.5382 428.0988] /Subtype /Link /A << /S /URI /URI (http://www.geomtech.com) >> >> endobj 1211 0 obj << /D [1209 0 R /XYZ 90 720 null] >> endobj 104 0 obj << /D [1209 0 R /XYZ 90 720 null] >> endobj 1208 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F53 214 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1217 0 obj << /Length 3012 /Filter /FlateDecode >> stream xÚíKs7€ïþÊMª ±x€­lR›Ýxã=ë¶µš›,ó¡")ÛIùÇ/F36é†,ÉÞ’8•ƒ-¥ÙÍéï 0/‹ þž_X¥˜×Ö^ÌÖ¯x÷ë¯D÷·Iˆ˜À_¯_ý嵂3Ͻ¸¸~w’äzþŸË×WN_Þnf‡åvs5QJ]¾Ù\‰Ëyý9ü$´5—¨«ÿ^ÿûÕo×}!#eé«4!ùw±òBX&…ÑÝw©œfBiÓ}ß}—ð î¾N(ÿfÓ|—ðÚOk¦t%›O‡mU–)ãý݇hc”¸pÌW•îB¸í¶þðcH©Õå~Q¯Vm¸ÑÊ1㬠Ÿj‚ÿz5Vžü!†~yÿÿïÇAHBSVŠYÃÝE¥$³•p ® ÍÝÿHû¸ ¼ã*AótM;…È,’Ö2c•?©; RW¨›¥kêþ˜UuŠInLqkc\¡j–înk•Èêz˸tUqkc\^×iè³÷p6Ù´5*ï?åÒWŒ+mæüÓù¬+`‚Ï™©’`0¬Âv§(LG –Õ=`ƒ`¦’LYÛÖü%˜ƒ!£`ßG0혪´*  ÁbTQ0Ž,­›`Fr&¬kkþ\Á~ûž‚ñЉÊTeÁ@ !XŒ* ÒÑ‚¥u³,Ì>™·¾`þRì—Q°ï(˜sÅÐæò â‚õQ%Á`:R°¬î‰;_F1¦­<ö„µ—VAÇQŸ„ ÞÄ®½„7"é HG{“ÖÍŽ|Z&­hk~)L_ºÅk½ÞÎoWõdw»ªB}­Õ³“ [‘j!˜4®*®Ha ¾"í£J+R˜Ž\‘Òu³tôŠ´´µG«ÉªYºvk-nuakV§u³Ã­r‚qkÚÃßËVO‡NĈŠ9êãy¯L'ÕŒ•ÔE` ®SÕê¤Q`:R§¬nzpU¦bÆHß«r7Φëz7͵ÑAÆÙóÔµ ö°h$,€HH @:Ú‚´nfA˵ҧtÇÁæy9¯ß-7õN㾕*±ÑEU@ ¡ äFªÒѪ¤u3Ux˜ñsÓ 7“íÇz·[ÎëáA3¡Ã—<ûá!v¬ÈÌ!’9HG3Oëf+AiUXüv×…~-¯ßNgfÛÕv70±›áuõò/ÌÍEûÈVÏLÅËWa ®JUR¦#UÉê¦ÃƒÔžqë^ƒ÷»ííf>Y®§ïÆ[1a”xcJ5ö¤HTa‹Iª M5­›Qmn§Ñ¢éíÛíç ¶w{fõÙ­ÚQð±mEð )àA:|Z7/ãJTGðóÝôÓ8ªݨ›XÔ@&¤ ­AZ7›ï™ÓÝÕÞ”'Øi=Å÷\ŒËˆ{!ÂæÔ=NùÁ@\ž>ª•Ç òÀt¤ëuÜÁwãÃo5.ÄFU„*© HG«’ÖÍTQ¡¶ëNXÍæ£*ßL•Øè¢* Pr#UéhUÒº™*R2kM7ª¬¶³¹,²¹êäFY¾úþ̾¹E=@ ¡dEêÒÑz¤u3=„dòîÇFíz=x©Ji¦½¹±¡E%@ ¡äC*ÒÑJ¤u3%¸`ÖT݈±½¸L-EtìxÎáÁ“ÕØâ¢$ ¢Â%éhIÒº©$> m7lÜîöÛÝdXÝ­xî “Ø©j‡“†m§@ƒd$ç´hŠÙqf•õóáÓò0[ Ü[-™×μ`ÐáØ¤a‡†§ƒd$á´èéyèæÞo…¾¨t& º=ýOôlt%U2¯Wõ¡~â³Ñ/åªÅ}ì1Ü1a«öqla° Z}ØÄeödÉ{š·€<Ø{ ÒR'"• ³¥UûèØ|9«ÇyÂ;Ž8c‹‹r€@ÂH ÓdBýH«!‚ÎL/–ëz³o^¢1^èü*º8Æü ÿ1J?)5 ßxϬtqt8,êÝx´xüÑ¢okIˆqB QfœȪ!R¸ðKÙÝn1|ÁrÝ2œ]«¢ !!—ÊÒ¨!ÏÚ¯À–ZHY{°w ö lת(ld`cçYØŽ‡í× `çªC¨Žë›æ1[¬WÍ&ñxš®‰Q Ñ™°@:^¿®¯®e÷ŸvÒ`ÙÝùµ‹jQóÚî(ðcÛbà1BéXðAÝ|%…®ªrOì'ð'à]Û¢à!XðŽï× À—¹¨¤,Fð7Íö®Ù·?§«|Ûµ* ØØy6¤ãaûuØE.”6춙ϥ«<§kbTd4@&R´Ž×À¯hÐ â…ÎŽýÐüã2ä<ûXáZ•I+ ¤ã%ñë’èZäU~,¹énýº;‚Ï‹Ãs+ixãºå gl:ËÒñœýºgÕ]ÖsmÎ3WYˆª²iÁÿ+÷‡ÆFGU@FäÆªéxUüºÁ¾¡ªëîQÇùé¹}C}™Û+¹0ºË˜l:ãÉrUÙ~æw i·Æ¨˜[˜Žu+¨ºeK¡ÊáPÄŸâ{Ò÷«ezåìóe …ñë2"¹¨¨HŽɯë_Ï”>¬q™Q’lµù¸Ú­>¬›ôÊÔ(_døb³¥*i¾Žçë× øªÃR–ù.fɦ½È/Áµ2*22 VHÇËà× d‡å­A†ín5’dø\+£2@ #’ae€t¼ ~Ý@†ü°ü¥NdÈéÈÍÜu,Êæ@ªŠféxæ~]Ÿ¹¬k]sê¡§RŠÒÊ—uÁ§ØŽ‰±Å@šíI£9¶˜ŽeÔ Ø–‡%ªã)§ûv{³I-májlnTdô@V¬Ž×ïÜ1ÊþÅpLâÏñÕˆŸVûtÇxî;F©(eßÁ@F$ Òñ"ùuƒqFõÓa#í>=yÆqÆ57ª2z +VHÇëá× Æ™Z mÍq ùK|aª]<6›Í>݆ÉäÕ=Ï6q]Šò…@06½»¯ž% ™HÄ~µyÆÝ­œÐjxL²g|·íÏ“ôãiÀ—5£¸Ž‰qÅ@šëI£ ®˜‰âT#¸V²¿jǵÙ|L#_¿12¶5*2R %J ÈDJáW#¤(»æG'nVé¹ÕÿÒßõ9*ÉÇ8Ð(E¦<¤!^)B"eá¦o·ÍzýÝ»Lýö³Ûg¶*_Á{m¼†›ª¥ê»îš5yŒË00à¦;€–:´«ÌËꓺs¸]_7L××ýŽvšÿiAj¾ªŸŽÓ:òƒÎö–ÛæB™â¸(º[7Í}v=÷¨uZKà†5×ĨÈ(€L( ©€_P@×Ý/Z¡A‡Í~µN;P$o×±(odx#Š7d"yûÕÞª?zZ78éݧt ä Dp­ŒŠŒHFj5+d"Eð«"ÈJÕðnÀÝözŸínW³ŸÎœ~ñ€\Ç¢¼!á(Þ‰äíW#x÷u ;\ëïË´¥t¾Õ®±¹Q5 QYQj@&R ¿Ú¼º.Eaì°¥´oÚfû¸Jïì}Ú4plbL ¤8aB(€™(‚jÄyÝŸWÈÕqƒû’;¯p¼çÞ¯îšlÕ¿ÚµÙí©ÏäÍ_䓤ÖöÛñ-* d pQGô¬‰4À¯F ý'7 ‡Qöíb³›ÿh†4p =Œ 0Å1ü…ÊCÒ÷Jðµé—ÏËSúÝï÷²M¿Ú= ן(YdÐb»¥6³l! ׯFÐí7©óa“e¢;ûÆÞ×»c9v)ÊÆØtŠ1d"ûÕˆ ¸ª­°ÅðQ>‹8|XõïäÏ®·Ë‡]:}êË ªþD~_äÁ@Z†1Š‘3Q2ÕæáUÙŸ>Ïåšzº˜3 ¸&F€@FdB)™Hüj„E.L5¼ÓdT Û¶«›¹[»WqähìI”(2D±ÅQÈDõ«DMÿÎܺpD›ã™”¬¡Q»˜™ªW¥Èóoo'’¤ç~þ(=dèa;¥¶³ô IϯFÐÓÝýµžÿzíÃ&Ͱ{®?QºÈÐÅvSt!IׯFÐUݪz¼à^·Mó¹Iܧ]p]£ @ £2¡€L¤~5BYõg·Ç îíþn}h·»¹™×k:28v&Ê®ØhŠ+d"¹úÕ®yÙŸð.×ã¸~µŸö«íšU ¥d"ð«Í+ ë²_A¯Ý÷‹M³N{æÏ™‚­Œ‰€´'d¤.æDÀL”A5B„ªèSÕ(ÂÕuöqÕ<Îð¯w!mìR”12Œ±écÈD2ö«Œ»[a­Æ5²ý¢½IŸlöÄáÞõ0*ÀÇð R—³ø§<$}¯¿8<'7\ì7nó¼Ÿ^ùíÒ'y»¶EC C)PÈ!ÉܯF@·¶?~\©¸¿Z̽·5=òäË€kkT d¤@J”‰”¯FHaŒ(‹á”£Ùü{ÔÒñ¸ëX”72¼Å2‘¼ýjÄþ™ì¾Påð9€y\m®¶éµzç(òþ¤ºŽ/ìb #Ž‹âÄL¤8~µù¢ê]Ÿž×9Aì´¥{ø®“1 ޶±@ʿԼøvèÇv•^û~Æ›Iþ5Þ“Ük¼ƒdŒ³oðþ endstream endobj 1294 0 obj << /Type /Page /Contents 1295 0 R /Resources 1293 0 R /MediaBox [0 0 612 792] /Parent 1198 0 R /Annots [ 1297 0 R 1298 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R 1304 0 R 1305 0 R 1306 0 R 1307 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R 1317 0 R 1318 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R 1325 0 R 1326 0 R 1327 0 R 1328 0 R 1329 0 R 1330 0 R 1331 0 R 1332 0 R 1333 0 R 1334 0 R 1335 0 R 1336 0 R 1337 0 R 1338 0 R 1339 0 R 1340 0 R 1341 0 R 1342 0 R 1343 0 R 1344 0 R 1345 0 R 1346 0 R 1347 0 R 1348 0 R 1349 0 R 1350 0 R 1351 0 R 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R 1358 0 R 1359 0 R 1360 0 R 1361 0 R 1362 0 R 1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R 1370 0 R 1371 0 R 1372 0 R 1373 0 R 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R ] >> endobj 1297 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 669.9832 297.0286 675.7616] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1298 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 659.4062 297.0286 665.1845] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1299 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 646.8366 297.0286 654.6074] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1300 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 638.2521 297.0286 644.0304] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1301 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 625.6825 297.0286 633.4533] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1302 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 615.1054 297.0286 622.8763] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1303 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 606.5209 297.0286 612.2992] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1304 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 595.9438 297.0286 601.7221] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1305 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 551.2593 297.0286 559.0302] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1306 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 540.6823 297.0286 548.4531] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1307 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 530.1052 297.0286 537.8761] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1308 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 519.5282 297.0286 527.299] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1309 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 508.9511 297.0286 516.722] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1310 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 464.0126 297.0286 471.7835] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1311 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 455.4281 297.0286 461.2064] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1312 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 444.851 297.0286 450.6294] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1313 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 434.274 297.0286 440.0523] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1314 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 421.7044 297.0286 429.4753] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1315 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 413.1199 297.0286 418.8982] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1316 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 402.5428 297.0286 408.3211] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1317 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 391.9658 297.0286 397.7441] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1318 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 381.3887 297.0286 387.167] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1319 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 368.8191 297.0286 376.59] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1320 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 360.2346 297.0286 366.0129] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1321 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 349.6575 297.0286 355.4358] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1322 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 339.0805 297.0286 344.8588] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1323 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 328.5034 297.0286 334.2817] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1324 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 285.8114 297.0286 291.5898] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1325 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 241.1269 297.0286 248.8978] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1326 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 230.5499 297.0286 238.3207] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1327 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 219.9728 297.0286 227.7437] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1328 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 209.3958 297.0286 217.1666] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1329 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 198.8187 297.0286 206.5895] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1330 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 188.2416 297.0286 196.0125] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1331 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 177.6646 297.0286 185.4354] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1332 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 132.7261 297.0286 140.497] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1333 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 122.1491 297.0286 129.9199] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1334 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 79.2031 297.0286 84.9814] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1335 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 682.1419 522 689.9128] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1336 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 673.6142 522 679.3926] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1337 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 663.094 522 668.8723] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1338 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 652.5738 522 658.3521] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1339 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 640.061 522 647.8318] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1340 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 629.5408 522 637.3116] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1341 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 619.0205 522 626.7914] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1342 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 608.5003 522 616.2711] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1343 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 597.9801 522 605.7509] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1344 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 555.4489 522 561.2272] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1345 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 544.9287 522 550.707] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1346 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 534.4084 522 540.1868] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1347 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 523.8882 522 529.6665] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1348 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 511.3754 522 519.1463] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1349 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 500.8552 522 508.6261] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1350 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 492.3275 522 498.1058] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1351 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 481.8073 522 487.5856] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1352 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 469.2945 522 477.0653] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1353 0 obj << /Type /Annot /Border [0 0 0] /Rect [488.7222 459.0233 502.5453 466.5451] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1354 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 459.0233 522 466.5451] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1355 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 448.254 522 456.0249] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1356 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 437.7338 522 445.5046] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1357 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 427.2135 522 434.9844] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1358 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 418.6858 522 424.4642] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1359 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 406.1731 522 413.9439] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1360 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 397.6454 522 403.4237] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1361 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 355.3682 522 361.1465] /Subtype /Link /A << /S /GoTo /D (133) >> >> endobj 1362 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 344.848 522 350.6263] /Subtype /Link /A << /S /GoTo /D (133) >> >> endobj 1363 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 334.3277 522 340.1061] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1364 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 323.8075 522 329.5858] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1365 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 281.5303 522 287.3086] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1366 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 271.0101 522 276.7884] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1367 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 258.4973 522 266.2682] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1368 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 247.9771 522 255.7479] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1369 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 239.4494 522 245.2277] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1370 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 228.9291 522 234.7075] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1371 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 218.4089 522 224.1872] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1372 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 207.8887 522 213.667] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1373 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 195.3759 522 203.1468] /Subtype /Link /A << /S /GoTo /D (136) >> >> endobj 1374 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 184.8557 522 192.6265] /Subtype /Link /A << /S /GoTo /D (136) >> >> endobj 1375 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 174.3354 522 182.1063] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1376 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 165.8077 522 171.586] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1377 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 153.295 522 161.0658] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1378 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 142.7747 522 150.5456] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1379 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 100.2436 522 106.0219] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1380 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 89.7234 522 95.5017] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1381 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 79.2031 522 84.9814] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1296 0 obj << /D [1294 0 R /XYZ 90 720 null] >> endobj 1293 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F31 44 0 R /F8 1222 0 R /F2 1226 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1384 0 obj << /Length 551 /Filter /FlateDecode >> stream xÚí–OÓ0Åïý9&‡ÌzüolŽHT‚sĵYQ-MP[DŧÇMÒÆ‰Vˆ•vQmÓ—yÖü^3ƒ s/L,KH°’(ÙìW¬»ü°ÂîSî¹/y]¬îÖ d`™Å¤¸)¶Óufdú½Úœvu•åBˆôm•aº-ÏîJR)*•}*Þ­Þ7#ÅùÒQ.’ð,VkÙE (¤jŽòã°;•ù¦ÞïËêt¼xÞ­§×B¹êí«,Gâƒ7œºøû’'¼}Ô]np¦Tß×>±ùÙkñM—û¦ÏÜk[XîÒ@&ðµŒ=ð@{Ó…¾_ yx¿|®¶_Ë®2 $=GºCÉ,ë®S‹¨{]„´×ö(è¾XœóÈ4À¬0²Úã|,Ïߘ]`¤zä¿øïQøg³¸¯[äí #À}Qâ^¹8ò±/ñ%©ùºà oSö¾E=†Fî&mûÄ9ßׇ}˜®@çøRñÇ·ÏFÝ#“ ¾!O‰ÐUµ!¯\> endobj 1386 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 684.1345 297.0286 689.9128] /Subtype /Link /A << /S /GoTo /D (138) >> >> endobj 1387 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 673.607 297.0286 679.3853] /Subtype /Link /A << /S /GoTo /D (138) >> >> endobj 1388 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 661.087 297.0286 668.8579] /Subtype /Link /A << /S /GoTo /D (138) >> >> endobj 1389 0 obj << /Type /Annot /Border [0 0 0] /Rect [283.2055 618.5032 297.0286 624.2815] /Subtype /Link /A << /S /GoTo /D (138) >> >> endobj 1390 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 684.1345 522 689.9128] /Subtype /Link /A << /S /GoTo /D (139) >> >> endobj 1391 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 672.068 522 677.8463] /Subtype /Link /A << /S /GoTo /D (139) >> >> endobj 1392 0 obj << /Type /Annot /Border [0 0 0] /Rect [508.1769 618.5032 522 624.2815] /Subtype /Link /A << /S /GoTo /D (139) >> >> endobj 1385 0 obj << /D [1383 0 R /XYZ 90 720 null] >> endobj 1382 0 obj << /Font << /F51 9 0 R /F31 44 0 R /F8 1222 0 R /F2 1226 0 R /F72 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1395 0 obj << /Length 2328 /Filter /FlateDecode >> stream xÚí›KsÛ8€ïùº-UµÂâMpn~MÆ»NœŠ•šÃf´ÍØÚ±%—$ÛåËüömÕ´ÐÙ$3•Œ*UE6»EôÇîFa# ÿب¢£RRɲ]ܾ¢íéß^±öh,²?}õŸ1J*Z±ÑôÓH1C*]•UÓ˳ñ¦ÿ|u4íT)·ŒY‘mk%±’p¦¤µ?HI˜ÊÙ™Ž+QÔç7cV4ã‰(U±øä?àÔb>¼X7ðÁŠ5œXÙŸåuJ"¤æV'<£d„JÍœÊc/½O@èbÅåýÅÚ~›-ì߹׿¶×J]¼nœà­½éaf›GoÆYa¦‚cfŸÖZù $ué?tïÛžüªÊìÇ3GJ«JP1ÒRjŒ´ž"ÜeäÍNn‚;—nf[¡¾eWÑžÉ@VdÈšè-ieœC粕w÷ìü¾çèˆ!šIýÝyñþIjÂàRƒ³Ô`oŠ(5HS’š¼5 F•†Á„³s๳ïü„ÇÐü*Ƌ愲Jíxù¨sÉKX0ÇRÏÇ2ÆÖ”biÀšeI*R)îSåë·l&‘ÅÉ‘Åèììè½Ï0ï>Zû'Ç>ÑÀÁÑÛ³£d\Qb¸6 eIŸ„Gô Ìú•ŠúiJúä¹µ~脪CB•RŤ …7¶pu^ÞÃáG*èXJY\Xoý>V”õÂ{EU½ÊHBÙÒOøúÅoHôÛ·¿á»¾ýónØ"X 1"¸•›`ÁSÛ Ó#MI‚óÖ:‚™&B ÿºLÞ¿9fÏ ‚QùƒÓ·‡T”føAp»!¥1#NJUjwóïî„U…9ºrz´Ñùnld±÷Þ¾ {­zwŸ®ìÃ+¬ð#å"­óè<Þû»Õ!‹CûÅEC8˜¾w‡û¶4³Sø¯†AÐ= {§aœ‡×Ɔ— Âõ#æ†ëðøgtቬA¹1¨KÂ8ö—Ú‹VY™r¾ÚíÉ÷˜ Â3ÅA÷oä²oq+fÝVF_âžä;œ5^aYQB5•æm˜ˆ»{w€çÍì¢^¶,¯Önú¹ò¯ÍÔ¾ŒîÄòvÑž³wÔËÚËŸÙ V·WÞ.l~{+Õžž›ý€ÌùÍl±ö“jV\Ô«ʼäp iû›°ü|„E¯+­6£“ðk›`Á˜c·Ú‡`Ѫ«JùvËÜVÕ'5X/™Ï¿ÌVk7‰X>µ} û哯_»6‚í)PðO;¿híß¿­¼ø¡ó̃ío47Ž;JèuĪD͈QØ7©·ü%ˆÑTmž:å¯Vn‚cá–Bç/ûÌÑœŠÕ%}öÜdâ…´1*zÖïí{q½XFß €ªªª]Í÷]θÎVsÙÎ-oêõ'þÖ'X˦•Tò±w‘ŒVa£ÌF+ì­tÔýH]Òýy“à~aä áëÏ_6<¶ÝêPDXß/}{sq?¿h|oá#òuãN·l—^íùh*”hù§‘ò^÷üCÞÂ9ïõÔy/Zúau)ï ˜´Þƒ×MÕÙb\§ÖÍÒ'ûM%ñIÕcå®Ó8Ø?ì¼Ûø -¹,,ÏüW˜(+eIT²ö,)ÌAµjWJ<*n)̯_,üjF}]Á€¢¦¬v˜|vp ƒ>ˆ Ìò‚½è€©¢À uIbò&n©8øÝ/“xdÚ¥NS25„˜‹¡%0WS#vehéÆ{ˆ,˜£¥ç@ž,$°º-[&ãÓ®+"M哟 –PJ©kÉ­ëåz6‡ƒ+ß7èÁmCaòÓ³Î+I)„Þ;æ\¥sÒÐ\ ææ*=¯ó8cHU’±¼¹Ž1¥‰¦ K„·Œ,nÝ´¤¶Œ]zÆNpï]ÞÙYøl1Ιd åj‡Ú‹Ûj#9B‚Yްg!UIŽòæ:Ž$(cxË‘h9Ú·MßѼðà´‹zͲ¾X>0.v-ozÝxÈÞÔ³yXعzz 7ñf¾ ¥ÑâÇà,‰FÛA4` ì,­’±ª$ys0W¥0ïmÑ-'‹úÒ†y›ÂNÏÇ¥ŠÿvMïõªGÌ"d:›åJ»Õ«Œ';c÷“ˆ8%i Ã=H ÌÒÒóÒ‚T%iÉ›ëhaš£ÛíDDµ´|Xu ¬¯7ièÍâÞí*œtgÖãv±.Úµ–ùÌ.ÀÜßÔë¦ÏYãö¬ã++PÎkCùw€Oƒ0Žƒ Á,=ÇD·bUI òæ«à2”ÆœBh:$Õ+ÛŒÐEŠM),‹¥\à•`Ù+ng*\:ö'ý:]P²ZGÃTQ\›²I’F~$˜%§çÊx%‚T%ÉÉ› „U”(£BºÑ¡¢½vµÄFG’_íÒmm3Ë“§dzm3ÌüªÍB'v RY,~‹bRVv%VÿÓM7ÜC´`Á-}ÿEÛ½XUŠ–s]œaeI¤!ßè.ÎL{v!¼ßÔËÚ÷ìáä‹ T PVZüE'BIh Bƒ³Ðô¼‡©JB“7·FKÂd4<Í(9–¶Ümy1‚#ånêüŒ‚1B‚YŒ°_e´ÔŪ’åÍm0RŒ0£ÃHD0:™]]» OG½ÉqGˆ—„r½Ûãöòš§óÄ IH0Kv­dQ’ª$Iys]Í#JR™v6TI¡æ©o»"7¾…LÛò\ìHùóž6‰dðé ’H0‹$†DF'pXUɼ¹I.‰<¤Hƒfo®Ê~À½Ÿ'7Y»o7U>ºoËx¥Íìÿ”|GìÜžD.øl9$˜EC £û®°ª$rysrÀ†6,¤ÓªK¦MØïÖÈnëùåçÖdœ0CÕºÿ7½Ï ‚…³`aWËh«J‚•7Àª Q‚†ìÊh Ö¿š§sߨ—íٙߚjWh]{Ñv'ã-F[¤Iav;U¿p*|3D’Ë…]-£ÛA¢ Vÿ:‘ìŒ endstream endobj 1394 0 obj << /Type /Page /Contents 1395 0 R /Resources 1393 0 R /MediaBox [0 0 612 792] /Parent 1431 0 R /Annots [ 1400 0 R 1401 0 R 1402 0 R 1403 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R 1417 0 R 1418 0 R 1419 0 R 1420 0 R 1421 0 R 1422 0 R 1423 0 R 1424 0 R 1425 0 R 1426 0 R 1427 0 R 1428 0 R 1429 0 R 1430 0 R ] >> endobj 1400 0 obj << /Type /Annot /Border [0 0 0] /Rect [441.9303 643.0884 450 653.051] /Subtype /Link /A << /S /GoTo /D (2) >> >> endobj 1401 0 obj << /Type /Annot /Border [0 0 0] /Rect [441.9303 610.7098 450 620.6725] /Subtype /Link /A << /S /GoTo /D (3) >> >> endobj 1402 0 obj << /Type /Annot /Border [0 0 0] /Rect [441.9303 575.5417 450 588.2939] /Subtype /Link /A << /S /GoTo /D (4) >> >> endobj 1403 0 obj << /Type /Annot /Border [0 0 0] /Rect [441.9303 545.9527 450 555.7958] /Subtype /Link /A << /S /GoTo /D (5) >> >> endobj 1407 0 obj << /Type /Annot /Border [0 0 0] /Rect [444.5454 527.6583 450 537.0901] /Subtype /Link /A << /S /GoTo /D (5) >> >> endobj 1408 0 obj << /Type /Annot /Border [0 0 0] /Rect [444.5454 501.357 450 513.2563] /Subtype /Link /A << /S /GoTo /D (7) >> >> endobj 1409 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 487.9411 450 497.6381] /Subtype /Link /A << /S /GoTo /D (14) >> >> endobj 1410 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 458.1819 450 470.934] /Subtype /Link /A << /S /GoTo /D (15) >> >> endobj 1411 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 444.5331 450 452.1088] /Subtype /Link /A << /S /GoTo /D (15) >> >> endobj 1412 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 412.6526 450 425.4048] /Subtype /Link /A << /S /GoTo /D (16) >> >> endobj 1413 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 383.0636 450 393.0262] /Subtype /Link /A << /S /GoTo /D (17) >> >> endobj 1414 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 350.685 450 360.6477] /Subtype /Link /A << /S /GoTo /D (18) >> >> endobj 1415 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 318.3065 450 328.2691] /Subtype /Link /A << /S /GoTo /D (19) >> >> endobj 1416 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 285.9279 450 295.8905] /Subtype /Link /A << /S /GoTo /D (26) >> >> endobj 1417 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 267.3684 450 276.9441] /Subtype /Link /A << /S /GoTo /D (26) >> >> endobj 1418 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 254.2177 450 263.9146] /Subtype /Link /A << /S /GoTo /D (26) >> >> endobj 1419 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 243.1882 450 250.764] /Subtype /Link /A << /S /GoTo /D (28) >> >> endobj 1420 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 227.9163 450 237.6133] /Subtype /Link /A << /S /GoTo /D (30) >> >> endobj 1421 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 214.7656 450 224.4626] /Subtype /Link /A << /S /GoTo /D (32) >> >> endobj 1422 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 201.6149 450 211.3119] /Subtype /Link /A << /S /GoTo /D (36) >> >> endobj 1423 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 188.4643 450 198.1612] /Subtype /Link /A << /S /GoTo /D (37) >> >> endobj 1424 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 175.3136 450 185.0105] /Subtype /Link /A << /S /GoTo /D (37) >> >> endobj 1425 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 164.2841 450 171.8599] /Subtype /Link /A << /S /GoTo /D (40) >> >> endobj 1426 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 149.0122 450 158.7092] /Subtype /Link /A << /S /GoTo /D (41) >> >> endobj 1427 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 137.9827 450 145.4373] /Subtype /Link /A << /S /GoTo /D (42) >> >> endobj 1428 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 122.7109 450 132.4078] /Subtype /Link /A << /S /GoTo /D (45) >> >> endobj 1429 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 111.6814 450 119.2571] /Subtype /Link /A << /S /GoTo /D (48) >> >> endobj 1430 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 96.4095 450 106.1064] /Subtype /Link /A << /S /GoTo /D (49) >> >> endobj 1396 0 obj << /D [1394 0 R /XYZ 90 720 null] >> endobj 1393 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F97 1399 0 R /F59 1406 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1434 0 obj << /Length 2507 /Filter /FlateDecode >> stream xÚíœYsÇÇßõ)ðàã¹½I”(+‘IǦU©JR„X2pp( hSþô™ÙÝ™isˆ6(Gá–ª@pÑè†æÿcwÏ%#lÿ‘‘Á#Å2\©Ñåêî/ÿûéŸM­Åš¼¼xöÕ© #‚‘Á†Œ.®F‚d˜áÑÕÅü¯ãÅbò÷‹?>{}| JkÑœÉa8EG„#Æ%uáÜg¶Ñ1S¬ Ä'SB¨ŸŸ¿±ÏÆï&S¦øøÔ=_,Ýcã®{ÅðñÆ]Ø®Üãlwã>áW§FA÷DjD‰àö9ïÏ­©Tݹ÷Ûo¼xTg‡ï=·cª%qèìàZÛ—Án *:t£%ÜÀ²ƒàïÅMïLCîsF0·\ð‘4 c:ñ±!1Æã“ÍzBõø'÷дOw {‰Œ{•…¾4GXq E–Ÿ,Vò·Ç×ûö ÂV‰ dŽÅÞl ì\¸kILRå ,Ç"Ä ­•¥1â\3Oaàð{‹ÜÇŽ¿ÙÍ<ŒY4WmƱ8Úßéx·q?ùøÅÒÚ.»ççöéù›wÝN˦6Ñl¼ÙÚ÷sÖ>Í”+û‡ÃôçÀ9«¥ª˜À°¨&ጜÀUVÏr¸(¨Tˆ%ƒ ´ôtâ IÓÉt6[5é„¢1L åhoς慪‚ ‹ Aå3 WYÐÊá"hÂÒÅUàŒõœ½ŸhîzÛŸXâv‹Ëöy6E‘Ñd€í‘ßž%°W° `´+ò€Èàeé+ÆŠðq{ÑÈX¶xÏ—€æ¶·³ÅÇ·Àg½ÉžG›î4ñg:_¬šõí·fË®n½wu«Ùîå˶ O‚L0CJš' r–//R0`X$ ª.x1à*ËX9\„Œ*¤¹ˆ¥T€ÞèÖe·«Ùe_P× ¹éÙ™»‚»mZlZ€6ë4ØáþÐ)Ö¦ÛbÔæ)ÄÍS莚¼BU€a‘0(¹PI€«,aåp‘0®‘á$VB`ãÚ²u·»uÍi?ÛùÆýÕpø-Ö×IÐ(EÜÈ¡þ<&/F&`X„ ª+q&à* S9œßÔL e°îYò‹Ïç}¹_vV™­”¢ÃFבj¢W© 0,Be—ÉÅ?è* Y9\ÌX–É1ñ”…]«?[À~xñêyÇT[ 7Ëe¤ná'Ü›«îçÜRÎlÞ΢–3ÛÐÌ–é6Å6ÔÒÎ¥¾³¢ûA«Š ‹¢C2¢WYÑËá¢èØ ®¢ûäâªÑk·&÷õsßuvj·íÐõíræä]~œ^ö»—d¼î—å|›»êÔ%¥·“yÎÄÿæ :+¶¬ªØÀ°(6ýŒØÀUVìr¸ ¶mc:Ô‘°½ôòå¹Û”þK/õM{>fåZ¿·ÙÍa6·Nçy;o¾Þ{Á½ý.Ók†ìÇT_x™ÉAµ4,A±§’L.°BW9(*á"V¢uLûÜCÑüÒrÐl;*¾o›Õ+×¥gC 1·Ù44Ǩ/A*]À°H”[&WG «,]åp‘.ÕÛâ.¿ÝãδœžÆ†5}p‚!ÆXú\.ÈUÅ qƒúËäºt•Å­.â&¤}"UÀÍï½w«q']Í:]ô•-³|f,¦„ )ìoς慪‚ ‹ Aå¥N‚\eA+‡‹ q†“3v±ÿäX{÷‰¨Déç9œ÷dQ륪’튠å¥Ire1+ÆŠ”1Œ„±zj€Ù·_;ξ{]©¡Û>P 6 vœ†ÌKRÅ y‚«äR"t•%ª."E”xóX!ývÕÛ3Õ'VHíœ ‡¿ùäªâ ‹¸AýIâ\eq+‡#Œ#͈ ‡-c:&0ƒ,X$"×óæ2ÙÝlõ!—Ã(FTÊ¡L3S?ÔUR¢] œJ.MGYLбBRb¶ "¶ŠÅ¥g¿ûîí²’õb°ÒÒ#B”ªQ K˜íIŸæ ºÊV IS Mcã·eï¡68Ò¨i›†=ÿGYQ U†EÆ è*¹¢ ]e+‡‹ŒIWühDÌ塚qýº;ä¿~ø¶Ú¸+„ÉÀØ‘w¯JªhWd ˆ¬’˨ÀQ–¨b¬” Hjʣ߸yeAzë’”K]'o¾‹L³!)CÌ€Ö¯…É+R¥ q‚gx®²@•ÃE¢˜F‚aPý®ÏɹÛùýÆ5äg}-<´ßA°ƒ!0ÿ£ÃÐ2oÝÈ)â,œBG×®)Û¸^í'·\Ñôìî i?#ïùCw¯È¿a—ðôþ="9¶ÿ/¬?Ç-"s÷q #W»#4,ÝÇqO wiœüþ$tuÿ/Y÷Y endstream endobj 1433 0 obj << /Type /Page /Contents 1434 0 R /Resources 1432 0 R /MediaBox [0 0 612 792] /Parent 1431 0 R /Annots [ 1436 0 R 1437 0 R 1438 0 R 1439 0 R 1440 0 R 1441 0 R 1442 0 R 1443 0 R 1444 0 R 1445 0 R 1446 0 R 1447 0 R 1448 0 R 1449 0 R 1450 0 R 1451 0 R 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R 1467 0 R 1468 0 R 1469 0 R 1470 0 R 1471 0 R 1472 0 R ] >> endobj 1436 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 710.0373 450 720] /Subtype /Link /A << /S /GoTo /D (53) >> >> endobj 1437 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 693.599 450 701.0535] /Subtype /Link /A << /S /GoTo /D (53) >> >> endobj 1438 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 678.3271 450 688.0241] /Subtype /Link /A << /S /GoTo /D (53) >> >> endobj 1439 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 667.2976 450 674.8734] /Subtype /Link /A << /S /GoTo /D (53) >> >> endobj 1440 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 654.147 450 661.6015] /Subtype /Link /A << /S /GoTo /D (53) >> >> endobj 1441 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 640.9963 450 648.572] /Subtype /Link /A << /S /GoTo /D (54) >> >> endobj 1442 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 627.8456 450 635.4213] /Subtype /Link /A << /S /GoTo /D (54) >> >> endobj 1443 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 614.6949 450 622.2707] /Subtype /Link /A << /S /GoTo /D (55) >> >> endobj 1444 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 601.5442 450 609.12] /Subtype /Link /A << /S /GoTo /D (55) >> >> endobj 1445 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 586.2723 450 595.9693] /Subtype /Link /A << /S /GoTo /D (55) >> >> endobj 1446 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 573.1217 450 582.8186] /Subtype /Link /A << /S /GoTo /D (56) >> >> endobj 1447 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 559.971 450 569.5467] /Subtype /Link /A << /S /GoTo /D (57) >> >> endobj 1448 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 546.8203 450 556.396] /Subtype /Link /A << /S /GoTo /D (60) >> >> endobj 1449 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 533.6696 450 543.3666] /Subtype /Link /A << /S /GoTo /D (63) >> >> endobj 1450 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 520.5189 450 530.2159] /Subtype /Link /A << /S /GoTo /D (63) >> >> endobj 1451 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 507.3682 450 517.0652] /Subtype /Link /A << /S /GoTo /D (63) >> >> endobj 1452 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 494.2176 450 503.9145] /Subtype /Link /A << /S /GoTo /D (64) >> >> endobj 1453 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 483.1881 450 490.7638] /Subtype /Link /A << /S /GoTo /D (65) >> >> endobj 1454 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 470.0374 450 477.6132] /Subtype /Link /A << /S /GoTo /D (66) >> >> endobj 1455 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 456.8867 450 464.4625] /Subtype /Link /A << /S /GoTo /D (68) >> >> endobj 1456 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 443.736 450 451.3118] /Subtype /Link /A << /S /GoTo /D (69) >> >> endobj 1457 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 430.5854 450 438.1611] /Subtype /Link /A << /S /GoTo /D (70) >> >> endobj 1458 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 417.4347 450 425.0104] /Subtype /Link /A << /S /GoTo /D (71) >> >> endobj 1459 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 402.1628 450 411.8597] /Subtype /Link /A << /S /GoTo /D (73) >> >> endobj 1460 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 391.1333 450 398.7091] /Subtype /Link /A << /S /GoTo /D (73) >> >> endobj 1461 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 377.9826 450 385.5584] /Subtype /Link /A << /S /GoTo /D (74) >> >> endobj 1462 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 364.832 450 372.4077] /Subtype /Link /A << /S /GoTo /D (75) >> >> endobj 1463 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 351.6813 450 359.257] /Subtype /Link /A << /S /GoTo /D (75) >> >> endobj 1464 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 336.4094 450 346.1063] /Subtype /Link /A << /S /GoTo /D (75) >> >> endobj 1465 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 323.2587 450 332.9557] /Subtype /Link /A << /S /GoTo /D (76) >> >> endobj 1466 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 310.108 450 319.805] /Subtype /Link /A << /S /GoTo /D (76) >> >> endobj 1467 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 296.9573 450 306.6543] /Subtype /Link /A << /S /GoTo /D (76) >> >> endobj 1468 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 283.8067 450 293.5036] /Subtype /Link /A << /S /GoTo /D (80) >> >> endobj 1469 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 270.656 450 280.3529] /Subtype /Link /A << /S /GoTo /D (81) >> >> endobj 1470 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 259.6265 450 266.6568] /Subtype /Link /A << /S /GoTo /D (83) >> >> endobj 1471 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 246.4758 450 254.0516] /Subtype /Link /A << /S /GoTo /D (85) >> >> endobj 1472 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 214.1969 450 227.3475] /Subtype /Link /A << /S /GoTo /D (87) >> >> endobj 1435 0 obj << /D [1433 0 R /XYZ 90 720 null] >> endobj 1432 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F97 1399 0 R /F59 1406 0 R /F55 27 0 R /F84 684 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1475 0 obj << /Length 2729 /Filter /FlateDecode >> stream xÚí[o¹Çßó)Ô7ùA ï—EÛE7»I³HÐ`× }P$Å"Y†,' ¾äÌ<ŽxHwÇvv RFgÎÍÿÇsx…M¨ÿÃ&ŽNŒÄIc&‹í#:~÷ˆ ïfÞbM~8}ôø©bF‰£ŽMNßLãýûdwºü÷t½^ŸüçôçG?&gŠóV¸`rÏð “DHÍC¼pÑ><Ft‘ôÉŒ1®¦?ù×éo‡Õ>¼žÏ7'3aÔôåοòéòj¯.ÃE=~ê ôÈ”$ÜZí¯!8üÎ[jÓ¿èkÿú̃_ÔYëà'7_ú›j5UùÞù»ëuì> $»4,Èpì0Ü;î²= ®èµ¸åƒÉqÈë¤1*=r¢ ʹ^}Â|HJéôï»n§¼ÜBzzÎýk‡‚?öÒ¿÷4x£å•»ñ0tÇŸŸ‡½ñ›ùbÕú°>¼ ïÄô™·\…/µÛ«÷ëÕ‡!åà¥qe‰ÔT@„ôQ(þ«er$°#Ô_Nº;˜¾ƒÙ Øîõ‘»NÝ¢²À&l=VÒÕR"¥š5ჰ–óíÅf‡ù[ ¥œþê¯óáI^ÔŽúæ¬üŠÚ}þ 7!ÞÎ& À°ŠÔa¸Ba¨‡K4hC¸3z A 4ðÏ¡áZcçÓ§¡‰ÿã——¿ömÿÉ®Ï ûpÞàãÕ wÓùùjS$)¤GÅ3&SÔvƇõ.ûd·õ}33 'ž¯óðÙ˜ÿˆÙÙO´“7èúÃjŠv•6\¡m¨.µ!ʈ’’mH#mH–;<§‹ÍãÓwCkš’·¸Ú þÇ®álwç—‡½o"¡­œõŸ¼Z/B7çÝ:ô•ÎJ-GPG4sIò…¡¦>e¤/„5;»4,êñ©ÃpŒª¢ À*H=^DYëk›Pƒ fÉUÏýo6¡¿‰e Æ)±c±üýÅrà Ó ÖÀº¦4£®ô…Ոǘ#Ö7QF.yœÂ0iã•Çg¿~¢´§h…µæn΢룱©g.@ˆ3§-áÔŠoŠ9Œx_›`Ã*P( à £/ƒ¡¹/=œ'0â$HÈö/}dzüónò3±Ñ ~ëlø¡ƒýc°om“ `Xej…±|¡l|ïh¾[ù”²¾/o†ùîgAá'/¾ óÜzzèrf8¼ÚõœÖÏXv&OúƒÝðn~¾ìÍ_ÌÏÏ®æg«Ò¼¸ðÝ¥B‡YùzHù74;~·ø)(\ã¨(fÕŒaˆF»4,ÍÍ9ì EfÊŠ˜(¦ŸÆD:M”Íy?ºÊ…m˜K{þZõÓj!)¥‰†^v©m9¤±óØiíòØbßMC ÔÎþoa,xvµ]õ ;Ÿìú~pðýñ§FÓ/‹cAßæŒR·ÛC3Q¼EÍL «™ÞsÆÊ_¨ÄõxQbi ‘† Ç õìÉ‹^´_ºÛþ&ŽÕÓ =¨·è²S¯TXZ¹Z/»KÅI0"é7VœnwhÀ!êÓ ØÕè‚r3&JpO[õ`©$Oc<–:ÂSùSq`ºÛtOÝ›o‹"em2 «PBN0*/Ëz¼Ì¥f„j—|à‘_ãQŸãJâŸKÈZòÅ&¯(¨Qç&¨À° *øBA­ÇË JKhªÍiÙô/%¥ Jr>âxqìÕl˜̪(f40“ÃZ¤ ¡:Zír—ílù×1[><<£ÎM@aQ)ð…bZ—AåŒfu5®\~_ìn:"¼ÿÝÍ(k“K`Xår‚q |¡\Öãe.©%J—¸Œ«ßÁ”šX£ÔæÝ}[ŨdE`XE¢¡|¡(Öã%…SD2“k¹i×òÿ޵üÁÕò¤s ThXõ8¨Ðj#^ÕúQ¹Ö¹–Û!gö+¤Å¼iˆ´lÌ›÷0o&5›8Ã*ŽÆdGà ű/ã¨aLåî"Ža"|YÂQy#¡Ùˆã|[”Ã(c“C`Xårq|¡Öãe•"N«<%Ähñƒ8Û…½“ýºÜ>¬Õ¬—ÅåçóiØf<²ùûOG‹5†UÆ æcÀÊX=^fLvt¨ÌX\¶y¶ ,bïb‹Ýf·/v5a‚»¯[ÌdQ¤&eÀ°JT£ øB)«ÇË”qG´6SÆ);ëžÖ¹êjìl½M[[Ž[P֌㑛ôÄâmor «Ü@1n€/”›z¼Ì óbûì’¹€›×ÝV‘® þêa·áKSŽn¥±¹*ejr «œAÝ1΀/”³z¼ÌDhª lp6¿ìçýsËeÚ¤PcQ¼Ú¢XMÚ€a•6¨>Fð…ÒV—hãŽÎ¨†qíb1ߦWóWÆ÷ê|Á¹úZskI«lаÛ5ñý(°ô…ÁÖˆ—a3`#i›.Áv“¤Æ(#šòqÒíÿ;EËÔ÷ g´Luÿî±ÃZ¦½_¸/£¥qŒÊŒ–AÑ ûÝE+ž@©ú2TEQšTÃ*UPeŒ*à ¥ª/S¥(1ÊêhQªÒå~úËZÌŒ X_Н(O“/`Xå êñ|¡|Õãe¾„ñUÌ‚è_Å‘£ê&ôÈÏ×ü¶(~Q½&~À°ŠÄÃøBñ«ÇËøqI¤²¹hò8©¿XbøYGGüî~Q½&~À°ŠÄÃøBñ«ÇËø1F5`7|œï_lú§RûŸ(‘è ¸vb$ñn¡O 6†U!‚ÀŠ`=^B9K˜Ƶ€Å.>âŠ-³Ûn·ÜØ•»Åµ¦¨N‹.`Wƒ аHFð…ÒW—èsœ8År­ÀWÙ¢ÅÈÝÝÏ–DõZô»|„=à C¯,‘gü+¥¹Ä È»Ú^ÌB⛟/Óhã²> endobj 1477 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.8605 710.0373 450 720] /Subtype /Link /A << /S /GoTo /D (88) >> >> endobj 1478 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 693.599 450 701.1747] /Subtype /Link /A << /S /GoTo /D (88) >> >> endobj 1479 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 678.3271 450 688.0241] /Subtype /Link /A << /S /GoTo /D (88) >> >> endobj 1480 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 654.147 450 661.1772] /Subtype /Link /A << /S /GoTo /D (92) >> >> endobj 1481 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 638.8751 450 648.572] /Subtype /Link /A << /S /GoTo /D (96) >> >> endobj 1482 0 obj << /Type /Annot /Border [0 0 0] /Rect [439.0909 614.6949 450 621.7252] /Subtype /Link /A << /S /GoTo /D (96) >> >> endobj 1483 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 598.817 450 609.726] /Subtype /Link /A << /S /GoTo /D (105) >> >> endobj 1484 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 588.3935 450 595.9693] /Subtype /Link /A << /S /GoTo /D (109) >> >> endobj 1485 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 575.2429 450 582.8186] /Subtype /Link /A << /S /GoTo /D (109) >> >> endobj 1486 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 559.971 450 569.6679] /Subtype /Link /A << /S /GoTo /D (109) >> >> endobj 1487 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 517.0611 450 526.3064] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1488 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 498.5015 450 508.1985] /Subtype /Link /A << /S /GoTo /D (111) >> >> endobj 1489 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 487.472 450 495.0478] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1490 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 474.3213 450 481.8971] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1491 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 461.1707 450 468.201] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1492 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 448.02 450 455.0503] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1493 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 434.8693 450 441.8996] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1494 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 421.7186 450 429.2944] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1495 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 408.5679 450 416.1437] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1496 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 394.5082 450 402.993] /Subtype /Link /A << /S /GoTo /D (113) >> >> endobj 1497 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 382.2666 450 389.8423] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1498 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 369.1159 450 376.6916] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1499 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 353.844 450 363.541] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1500 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 342.8145 450 350.3903] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1501 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 327.5426 450 337.2396] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1502 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 316.5132 450 324.0889] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1503 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 303.3625 450 310.9382] /Subtype /Link /A << /S /GoTo /D (114) >> >> endobj 1504 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 290.2118 450 297.2421] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1505 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 277.0611 450 284.6369] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1506 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 261.7892 450 270.9407] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1507 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 250.7598 450 257.79] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1508 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 237.6091 450 244.6394] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1509 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 224.4584 450 232.0341] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1510 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 211.3077 450 218.8835] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1511 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 198.157 450 205.7328] /Subtype /Link /A << /S /GoTo /D (115) >> >> endobj 1512 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 182.8851 450 192.0366] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1513 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 171.8557 450 179.4314] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1514 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 158.705 450 166.2807] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1515 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 145.5543 450 153.13] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1516 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 132.4036 450 139.9794] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1517 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 119.2529 450 126.8287] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1518 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 106.1023 450 113.678] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1519 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 92.9516 450 100.5273] /Subtype /Link /A << /S /GoTo /D (116) >> >> endobj 1520 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 77.6797 450 87.3766] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1476 0 obj << /D [1474 0 R /XYZ 90 720 null] >> endobj 1473 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F97 1399 0 R /F59 1406 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1523 0 obj << /Length 2454 /Filter /FlateDecode >> stream xÚíÝKs¹ð»?…ŽÒƒWŽ©ìö°'Ý’hil+¦HE?v?}0CaðW„nØÖË© ¶Ê¦´ÍnÛý+ƒÁPêD¦ÿÔI”'ÞïO.®ßÈ»o|£î^­RÄ Cþvþæ/¿Zu¢¤ˆ2ª“ów'V¡•V%Õùå?N¯>Ÿýëü·7¿œ/¹¬Ö­jSH«œRQ„àã‰Oߔƛ¹œZ}¶RRÊÓñâLûÓgêt7ý!R†ˆœʇ!•œÞù×ô&玿ùüêùßð¿ûöÿR0¤î:ãLi_jsjðü¿Â·ÂÀЇ‡ §®*åT¶ò^ÑŠ¿)¤Uoñç¢K/œ/þLöw½;[épzù)ÜŒ«ôíӋ͸Þ×4*éÄ`Ò÷:ÇGyZÚÑò„œ§{ý%åv4-A ‹ ûKi‚\$'¾^ñd}š¨ ãéêv?}µÝ¦_®¶ï«–tCt}!ÆŽ@ù_½ÉY6ØFŠ ä"Ùðõ ›a:˜XØx†ÍMz¹>| JéÏÛ‡žÇ.”rC𢠅¦DA.R_¯ˆ2J(c`b Œ¨}zùi[•^e:¨§Y+å¶4]A ë ûL¹‚\¤+¾^q•Ö61h˜à"ãêv·?ÔU)µìÃÔ©ÊMiª‚@VvY©PU¹HU|½¢J"Uæ¿ArªkŠ•ƒsýRî±³_nGÓ²ž°¿”'ÈEzâë-žlTÂ¥‹'Åx:LÓßz{{=¯ÉÓë:.m…¶}!þ ~–þ– äüÜë'ásQ~õŠ„5Ò?˶ùíŤd½©î%9/‚B7ò:;QKÛšî u‡(w‹tÇ×+îœM—~1wËvùç³4jÛé×ÃêãüÅñÛšÃ(Elgøˆ·“Ær‹šÆ 5†=§ŒA.Ò_¯³ZhanªÆæÙðn²œ÷=kάˆ}½õƒo'…å5…A + ;N ƒ\¤0¾^f¢>Àìi«Ân®.¦k²Bºpè7üžu×tiSӲΰïICÕä"ñõг´"ÚÃléî;«_%:#¬õ}ÐzÝkÌ¥yM}ÈêC ”>ÈEêãë}J ï½*ú–=û¯WUx6m¢êð^òoKúËíkúƒ@Öz üA.Ò_oñ7Ä(œvCñ·ìðÿy\¶í®k ý|Ü¡oè¿ô½í¥_-pÈ»€‡¹(pz\piŒ³å,×·þߥëƒý8_þI틸!ô‘ï•öE–Î5éA K)Pô I¯Wèy#Œ¶e®µùþÀûqw=.›¸T/%¬:öK‰g¼”XúÓ,0l8 r‘Àøz˜“Bù¡L¦V°é¤ôçéŒÎ,íËêó²ý6¡»Í· võ;èz>Æ~ãà[æÈ܆¦#da_)G‹tÄ×+ކéèŸ)s¤Í7¦“ö—ãtppKí¦ùy7­¯Ìžüí$·Ü­&7d¹aû)n‹äÆ×+ÜRáOwXsOÛf5•8–´]iYUV2‘ÈØbŘ–Âk È@6Ï‚›³éPbmݯÒ[M_z½îVÛÒÁ&?dý! ä"òõ Aé…õ fU ó‰ŽqSëÒ†–ý–üËu¹YMmÈjÃîSÚ ©¯·h3qHdàZÓ¶Û|ûø/…ì×ÓÁ—ú™4+´‹ývÃ#±Ü•–*ˆãPa“ S‰"Å+¢‚ÚK˜Bó­‚é²ñ]MZ:cúŽÙ+þmI‰¹›MŠÈZDFÈEjäëŽ.ˆôE9ÃmpÜNÃÜÕÛ«Cúmà¾LcÛzÏ=¤¤†~œûÇFµÜЦ%d-ao•VUK‹´Ä×+–lj½ åä¶hiš)?V‡ýz›'ÏÍz’µ«?ç­œ0:öÕÚ÷CÊ}hB‚@6–‚¹HH|½iP"¨PŽ¥9‰æCiÉu<ÿO,ô½‹}SãÅúKÇšä %‡(r‹$Ç×+ätÎù2º¼é¿™çºq¯V›Ýüb¬YQ %µëìžáŒÆÒ ¦0d…aÇ)a‹Æ×+”V¹2;: Âvë˾iöÓ^oæÖ5íA k-(­«ö i¯WìÉéÓL¨æ¾½Õ ñypý„Ð3ß0_šÓÔ¬.ì6¥ r‘ºøz‹.¢ÐÊ–3Þn@]Çógûðö³oKÿZ1xsQõ À´Þ—n(‡¿­\Í ÓµçüØÞîúf}{[¿ò´Ó}‚¾…ñý’r#š’ •„¥$A.R_¯HrZD5ÀDé¾UÒñqô«ú¡Ge)+ÿÏG:’MþWo²@– ¶‘b¹H6|½ÂfˆÂ;3 ¯±Ù³—1ï`‡!m¿ˆ|šÃX:Ó¤,-lµÒ¦J r‘´øz…–qÂ) s[¨Ñ:ìŽwµ?]O«W“Ó+FÙO>é#šKƒšÂ †§„A.R_¯ÓF nr»¼m=îß×Ïð1HÛH¯t†éX“²äEr‘äøz…\ú¦Qª±öÉÍK©õ q€ßõÏ¢~Öýˆ¥9M]ÈêÂnSº ©‹¯·èRÑ åd9"æÕ]o§ù9nå3Ú”Œ"Ú~òâGª¥-JÈQº×Z‚æ¢(5êJa2-É %ÍQ¢Ù4À…¾¤äJkiFS²š°»”&ÈEjâëM^Š`#L{yþz·?Œ›>å½Î”·4¦) YYØiJä"eñõŠ,ë§!¦¼¼?íR­E®voÏVÖžþû¸ q >ãÕ8Ù§¼§Ù~XúÒ„,,l´ÒCä"añõ ¬aÖ–ÝŸwÖÿ{>¸þ:V·ÑƒêãÖË<*™›ÔDVâXcÐsŠXÉD c‹`F‰AÂskÞ=v±ÛÔÏ3ýp…~ÿðˆå65A ‹ ûN)ƒ\$3¾^q¦‚Ð~ú÷œ}}7ŸF½&>„,xÛB<ç*,·¨i YcØsÊä"ñõбt¡§d9CèIlõ~dÖ`N8×øxôõâ];šœJ« º«´­b*™HKl±…RT"ZøYD>Ò”Ž{$¥´Êë‹°GRÊíhQ‚8Žv— ™ ¥ÿ€Â endstream endobj 1522 0 obj << /Type /Page /Contents 1523 0 R /Resources 1521 0 R /MediaBox [0 0 612 792] /Parent 1431 0 R /Annots [ 1525 0 R 1526 0 R 1527 0 R 1528 0 R 1529 0 R 1530 0 R 1531 0 R 1532 0 R 1533 0 R 1534 0 R 1535 0 R 1536 0 R 1537 0 R 1538 0 R 1539 0 R 1540 0 R 1541 0 R 1542 0 R 1543 0 R 1544 0 R 1545 0 R 1546 0 R 1547 0 R 1548 0 R 1549 0 R 1550 0 R 1551 0 R 1552 0 R 1553 0 R 1554 0 R 1555 0 R 1556 0 R 1557 0 R 1558 0 R 1559 0 R 1560 0 R 1561 0 R 1562 0 R 1563 0 R 1564 0 R 1565 0 R 1566 0 R 1567 0 R 1568 0 R 1569 0 R 1570 0 R 1571 0 R 1572 0 R ] >> endobj 1525 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 710.0373 450 717.6131] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1526 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 696.8867 450 704.4624] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1527 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 683.736 450 691.3117] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1528 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 670.5853 450 678.161] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1529 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 655.3134 450 665.0104] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1530 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 642.1627 450 651.8597] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1531 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 631.1333 450 638.709] /Subtype /Link /A << /S /GoTo /D (117) >> >> endobj 1532 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 617.9826 450 625.5583] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1533 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 604.8319 450 612.4076] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1534 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 591.6812 450 599.257] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1535 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 578.5305 450 586.1063] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1536 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 563.2586 450 572.9556] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1537 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 552.2292 450 559.8049] /Subtype /Link /A << /S /GoTo /D (118) >> >> endobj 1538 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 536.9573 450 546.6542] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1539 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 525.9278 450 532.9581] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1540 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 512.7771 450 520.0628] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1541 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 499.6264 450 506.6567] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1542 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 486.4757 450 494.0515] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1543 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 471.2039 450 480.3554] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1544 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 458.0532 450 467.4601] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1545 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 447.0237 450 454.5995] /Subtype /Link /A << /S /GoTo /D (119) >> >> endobj 1546 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 433.873 450 441.4488] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1547 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 418.6011 450 428.2981] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1548 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 407.5717 450 415.1474] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1549 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 392.2998 450 401.9967] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1550 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 381.2703 450 388.846] /Subtype /Link /A << /S /GoTo /D (120) >> >> endobj 1551 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 365.9984 450 375.6954] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1552 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 352.8477 450 362.5447] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1553 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 341.8182 450 349.104] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1554 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 328.6676 450 336.2433] /Subtype /Link /A << /S /GoTo /D (121) >> >> endobj 1555 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 315.5169 450 323.0926] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1556 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 300.245 450 309.942] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1557 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 289.2155 450 296.7913] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1558 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 273.9436 450 283.6406] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1559 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 260.7929 450 270.4899] /Subtype /Link /A << /S /GoTo /D (122) >> >> endobj 1560 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 249.7635 450 257.3392] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1561 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 236.6128 450 244.1885] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1562 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 221.3409 450 230.4924] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1563 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 208.1902 450 217.3417] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1564 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 195.0395 450 204.7365] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1565 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 181.8889 450 191.5858] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1566 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 168.7382 450 178.4351] /Subtype /Link /A << /S /GoTo /D (123) >> >> endobj 1567 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 155.5875 450 165.2844] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1568 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 144.558 450 152.0125] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1569 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 131.4073 450 138.9831] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1570 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 118.2567 450 125.8324] /Subtype /Link /A << /S /GoTo /D (124) >> >> endobj 1571 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 102.9848 450 112.6817] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1572 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 91.9553 450 99.531] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1524 0 obj << /D [1522 0 R /XYZ 90 720 null] >> endobj 1521 0 obj << /Font << /F51 9 0 R /F59 1406 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1575 0 obj << /Length 2468 /Filter /FlateDecode >> stream xÚíÝMs¹à»…ŽÒ¾1È1U»‡rÒ!UI´DÛ¬¥D‡¤íÚüú`Fà…n¬eQrÕ¢\µ¢äf·Ì~ À`>V]ÈôG]DyŒцpqs÷NüÛ;u|µH ùÛõ»¿üêÔ…’"ʨ.®?\8å…¶Ú–T×·ÿºüzõŸë¿¿ûå:§rZ·Š!­jJE1 !^„ôCi‚™ª¡Å ¯JJyy¥.Wéõå·År³^Ý¿IJ1Í~gMª;¾ý¯)Úû‡/á™ßÿ ?éÛOúlSÿ¼ñ¦4(52µpúkhvŽ[``¥ãOŽ-SÚ=©ì䣢acH«^æ£O/|(ÂÔSa7ã—åÝj·¬13Di;³ç|GÁÊ}iÁÂ@Ö£F°0«Q¯ÀŒÆWšp•Æ.=\V»ª-ÕmýèÛIbÇ5…•84œòU2‘¼ØbEW &Fó”×ÇéëönuØý^Ã¥¤Oµ†ØuýàX57£) YJØ]Êä"1ñõŠ&„5+ûTÓnµŸ†«±Ô2ʆ.é|K­Ü¤¦2d•aוöUe‹TÆ×+ʬz0±(sGeÿXýóº¦*(¡Tºª3½¤6wªI YjØzŠä"©ñõ 5“äÓ£‡m»»KÇŒÿ[ÖÛ{j^Ôƒí«®ç.4A ËÛJ1‚\$#¾^a¤‚ˆƒ†y1 £êL˜Ã4d¹nç5ÿµ¤À¹MÈ D”@ÈE äëÒ¦¥½‚9s8 ÜVJ+ú¨º¾7ø×’ç6B ‹QP!‰¯—º¨„”.ãáç4 ®o®t¸ü­¦Ñ+aµìÇ—o; çöµüa çï‘Âæ¢ü5êaÎH—ýEYñ§.ãñé:½˜vÔ¾®÷ë÷›éøµºÆÓBºÐGÊï{;ilnQӲưçJ‡ª1ÈEãëcÞ âPŒ©Š1ç/—ïÓ÷›ª©TJ¡/ý^üí¤º¹iMuȪC”:ÈEªãëuN ­c™Y£ÎêIÜv¿¦RCZ@zßOn¾¶¹WMlÈbÃæSØ ‰¯W°™(äxhš±™*¶ãDº<'¤¢t¾³;ÃÑjnPS²Â°ãJUa‹Æ×+´K#X€IÔrÂÛqömüÏrw[]¥)'œë§¾Í?w¢I YJØZŠä")ñõ %¥Ei}ž)9Xí¶«“¢"ÄØG§3¿T77­©Yu¨€R¹Hu|½¬ÎÆ(¼ö¶¨›Ïü7©û²®ïøb°®Iþ;¾¹ƒ-‚È|D‚ ˆ¹(‚z…àà… ®\ÜVÄÀgtì;mo4ðå¦5ÕA «Pê ©Ž¯WÔ“9˜nçó »¤ny\§…ËÕ×ñåtEÈÃekÕ‹A´°Ñ÷}—{;énn[Ó²îÐår‘îøzÅ—B n|ê.akœhiøëSð+n†ä¾5áA !Pð  ¯WàÙ ¤6ešMè@Þ4Â-o‰©VEÓ1Þjª×”¬<”@Ƀ\¤<¾^‘— pK‹’ê ¼M>›U%¦;úûzÃݱgMs%Ž%”ŽUq% Ž-V¼i)‚ÖNŸ‚»÷T޳m?×ðx›{Ö¬8D@‘ƒ\¤9¾^A'ƒpAáôjNÑ}<0çR'|ú%˜g¼ <÷¨‰ YdØt ä"‘ñõ22­°Z1{jìÓx±Ÿ_MSêên{µH#Ýí— ßb>¼X>UOAØñ„ÿÓm­Pjæ½…â83ØC‚ d¢ÄðÅ ˜A $N…îTÌHa³¼™^·ï Ò^¤_ ï»ý½Šüá7å@ K»IÙ\$¾^Ñ㑾ñ ÇƒžõûŸŒZï‹¢qAõ;q˰W¡Ÿ×|Ñ[†sšÀ † §€A._¯s6­³‡ÀÂc`ûûå(+Ohõ[Ò¨Öïë| Ps?š  … VFVAA._¯€²J jÐjÞÖßß,ë ïÉj¿çî­¶·rËšæ 5‡(s‹4Ç×+æô ¼8KÆlîx∸&;(œÕÞ+_,”[Ö4¬94@™ƒ\¤9¾^17^&¦> endobj 1577 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 710.0373 450 717.6131] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1578 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 696.8867 450 703.917] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1579 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 683.736 450 690.7663] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1580 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 668.4641 450 677.6156] /Subtype /Link /A << /S /GoTo /D (125) >> >> endobj 1581 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 657.4346 450 664.4649] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1582 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 644.2839 450 651.7385] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1583 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 631.1333 450 638.709] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1584 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 617.9826 450 625.0129] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1585 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 604.8319 450 611.8622] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1586 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 589.56 450 599.257] /Subtype /Link /A << /S /GoTo /D (126) >> >> endobj 1587 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 576.4093 450 586.1063] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1588 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 563.2586 450 572.9556] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1589 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 550.1079 450 559.5149] /Subtype /Link /A << /S /GoTo /D (127) >> >> endobj 1590 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 536.9573 450 546.3642] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1591 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 523.8066 450 533.5035] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1592 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 510.6559 450 519.8074] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1593 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 497.5052 450 506.9122] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1594 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 484.3545 450 493.506] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1595 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 473.3251 450 480.3554] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1596 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 458.0532 450 467.7501] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1597 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 447.0237 450 454.5995] /Subtype /Link /A << /S /GoTo /D (128) >> >> endobj 1598 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 433.873 450 441.4488] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1599 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 420.7223 450 428.2981] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1600 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 405.4504 450 415.1474] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1601 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 392.2998 450 401.9967] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1602 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 379.1491 450 388.846] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1603 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 365.9984 450 375.6954] /Subtype /Link /A << /S /GoTo /D (129) >> >> endobj 1604 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 352.8477 450 362.5447] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1605 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 341.8182 450 349.394] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1606 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 328.6676 450 335.6979] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1607 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 315.5169 450 323.0926] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1608 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 302.3662 450 309.942] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1609 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 287.0943 450 296.7913] /Subtype /Link /A << /S /GoTo /D (130) >> >> endobj 1610 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 273.9436 450 283.6406] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1611 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 262.9142 450 270.4899] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1612 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 249.7635 450 256.7938] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1613 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 234.4916 450 243.8985] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1614 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 223.4621 450 231.0379] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1615 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 208.1902 450 217.8872] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1616 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 195.0395 450 204.7365] /Subtype /Link /A << /S /GoTo /D (131) >> >> endobj 1617 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 181.8889 450 191.5858] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1618 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 170.8594 450 178.4351] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1619 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 155.5875 450 164.739] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1620 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 144.558 450 151.8437] /Subtype /Link /A << /S /GoTo /D (132) >> >> endobj 1621 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 131.4073 450 138.6931] /Subtype /Link /A << /S /GoTo /D (133) >> >> endobj 1622 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 118.2567 450 125.8324] /Subtype /Link /A << /S /GoTo /D (133) >> >> endobj 1623 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 105.106 450 112.6817] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1624 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 91.9553 450 99.531] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1576 0 obj << /D [1574 0 R /XYZ 90 720 null] >> endobj 1573 0 obj << /Font << /F51 9 0 R /F59 1406 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1627 0 obj << /Length 2723 /Filter /FlateDecode >> stream xÚíœKsã6Çïó)t‹t/Äö™dv·v’Tâœ69h$Ùf,º$yùô ؔрçaORËšª1E5»-ü@7”ÙŒÚlfèL AŒÔz¶¾yFûÓož±þhi-–ÐäÛ‹gû¾b3F‰¡†Í..g„3ÎW›ÿÎß6‹ß/þý컋è«â¼Í™”Â1fH]k3Óö$Ztá4á„ñz±d”Òù݂͛åÚ¾š¯n–—íbÉëùúîè~%ëÏŒüQE¸1•ý œ£¿Û‹”ò?ô'¾zü ¾âågªJ«–J rXÙ¬`ÝÛ@Úh·„† }ï;t²0!ïE®è(h‚'gRŠyRFÙ¥Oæ>OÛý²tÚR,Õš9‘ô.Ç(‹"•(ƒ†9ÊFª#”A_e…xeµ Z¨2A3-ÛCsÕØ7öÉ¥Ë:Õµpç§þ">ƒ]– &Ïà e'l@GSRÕHx‚ØÙ:vnÚSÓîíë¥{ukíÕaá2a’!iJVÿŸ2„rƺ 0Ì’Åc¢J¢|¡¬äã °TšH!áBÃK°8Jî•FÙ¨zZi>¤ C$`˜ ‹|¡ åã IIx- IŒ@ºtØt4mÿèþOVFʳ§&~¯4 BI†YÒ òiÀJZ>Þ@š`.˜ß䈴ë®*ºÙ-_Zwøî¸õËVjÅâÖ™®ùDÜà ã_f‚‚b_(@ùx@LSs˜óª@7—öäŽÛdž3œP®ê šÏ¸Å+¨SÄ fñ‚rcx_(^ùx^T’Z0˜ Õ¯ÛÕ>¤Â]2 VD)1-I™ƒFEÈ€a2(º<ð…B–!« #ªf@¦ÇuÍÌ=¾\¾m¶ï\"̤AjˆáTOÌ}bRŒz”€‚†9 F#@A_P…xPº&• jÜ&?­WÛÒÎdFLýÌG\¯¢:E¼€a/(·[;Rx_(^ùx^ª"B›à»æ{߼캙¡ÅÐOHýUs3Ý&>Fý•*¢ ³¨Aé1Ô€/µ|¼µŠÎ HöÎ]bÔóÍê”l@Xœ¹˜Àz²›É(V‘6`˜¥ ªÑ|¡´åã ´ C¨®AÞ”,I[×:uõØaÕ5%ÐMæi§æ³ÛòQ”"UÀ0KT£ øB©ÊǨ╭Ç5H—2´åß5îîqÓ¢ÕÜu´äÄлÅ,¨TÄ f1ƒ²c˜_(fùxfŒ­5˜‰f] fë2ë²týOåÔ®xÌò?èT fAƒÂc _(hùx4i Q\IZèÙ¿sµ~ƒTcŒH¡&²žx32ªU æpÉà}a¸â ¸¹}D]g´duŽ›]Í–ë¶kõßôÒ±"ÁäDáËú8üE~€a–¨§kL¥ø¾P~òñ~´ ‚W0/ª?×îy™ýf·@¶³µy¸fS=ÿ™õ|Ô£0ÌÆ€¾P òñ µE¹„ùO§€ò;Õï»Ç±Ò@Q"§>ýÇ^Žrd)r ³\A1®€/”«|¼+iko.`¢ ]û÷në§=$Ÿæ³Ôòj*ÙŸ¾° ry†YÞ þoÀÊ[>ÞÀ› \ÃïRHs†Û²Ù¯“K—™¾?ñåŸ? zyì²8yÝMЦÁ S6ØÀ§Ds`ªè9LÇîIÁô½7TjZÃc(JSä fÁ‚Zcd_(Zùx[T“J3«Ð•ÿÃÍ«½Aµ®¦Þé“'Æ W8`˜€|¡ÀÇÓ|Æ$Ò®Ž"`°[BÃÄ€ÞwØ èš…sšúÃD,Ät"JEå~×Ðô"¾ê¾zºÞÞøƒÆýX¯z«ÛkæèÎÈyã{åc‘›¿mºïü;ml£Ï'\×f¶d1’úà?o÷ßjµÚ§¸¨%1µþ“añø'Qð„½SR¼ÌÝ`—Å®7¨cIêo(tgÏ2µ2Úû;Á„MhýWà Iê×c³¿²À1µr"-qÝ¡ûÔúŸWýVM¿gsè®Úº÷äüÇ_þÇ[ýFí‡bó¶&•íïBDõõ· ±L¬”) a.SŒp›÷)¹/Tï|¼(8¥6¡pÓ Îï þrk× ®ço]_(.öÕÑËi‰¸:ßX"Ö«oúw^„Ó—®1y·;ù Å ÿóEs¼ÝuO|HJo,±µþ”êU+|Ú¢ZÀ0«>·)žR øBÕÊÇ jñZêVCÄ£LÏŸã{›m·ê§jzšVš(S±§˜¦˜¸qpJâBܸ£Ñv[Ñ q¡/LÜB¼(®–6³°öÊ™ŠûM/ÿbT"8;(»3ÏÊ)¶‡~£ÉŸ|îk„[÷œÐi{Hê,ì±TÓ•&|´¢4À0+ +·y›’øB¥ÉÇ‹7p\1Â8 ˤeF;^W~êôÃüƒ-¤­LÝCîíáM÷¬ûæLÂ&̽^¶]s!Ù[àTšª?u›•>Œ\Qz`˜•JI|¡Òçã ÒKMŒîËa'}È‘‹ZÚ•sôÕµ‡D¡0¿ovñ™b3iý!:Ï_ûdéq“>5Em*áŠÞû6*Pø|E€aV 8`n§;%ð… ”—M!IÍLÕë6Ö_lO«fwì×½Ë>ý]ocš´ÒtÅʲD>r^ÙìJã—žþÑÛŒÿ‚­¯t°@çõON²ÕÚ½÷fQ©ùêj‹¬û—Ïý>Ýf›˜öˆê¦²÷–ô£þ,*Tø E¡€aV¨ÑÈ!B_¨Pçñîgb·G*û]|¿qêö™¼6ZÙ)#ý4\/Ÿ_ïûߢøåîÖÞa ÖïUœüE—íÁØÊ»+ÚF{© ,#¬ãûS·—âg*æC`˜Í‡pX…6ú¡?T’|L+I]ª°ç~kÐÞéÐÉòún,O×3Dú›p«]·×m!¾uú?&Ñ™ßÞôíD{ú”ÖÅ·£ùY0=Â*ÉìrjÀññb$»ÀÛ Åÿ:a endstream endobj 1626 0 obj << /Type /Page /Contents 1627 0 R /Resources 1625 0 R /MediaBox [0 0 612 792] /Parent 1431 0 R /Annots [ 1629 0 R 1630 0 R 1631 0 R 1632 0 R 1633 0 R 1634 0 R 1635 0 R 1636 0 R 1637 0 R 1638 0 R 1639 0 R 1640 0 R 1641 0 R 1642 0 R 1643 0 R 1644 0 R 1645 0 R 1646 0 R 1647 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R 1652 0 R 1653 0 R 1654 0 R 1655 0 R 1656 0 R 1657 0 R 1658 0 R 1659 0 R 1660 0 R 1661 0 R 1662 0 R 1663 0 R 1664 0 R 1665 0 R 1666 0 R 1667 0 R 1668 0 R ] >> endobj 1629 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 710.0373 450 717.6131] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1630 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 696.8867 450 704.1724] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1631 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 681.6148 450 691.0217] /Subtype /Link /A << /S /GoTo /D (134) >> >> endobj 1632 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 668.4641 450 677.871] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1633 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 657.4346 450 664.7203] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1634 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 644.2839 450 651.8597] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1635 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 631.1333 450 638.709] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1636 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 617.9826 450 625.2683] /Subtype /Link /A << /S /GoTo /D (135) >> >> endobj 1637 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 602.7107 450 612.4076] /Subtype /Link /A << /S /GoTo /D (136) >> >> endobj 1638 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 589.56 450 599.257] /Subtype /Link /A << /S /GoTo /D (136) >> >> endobj 1639 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 576.4093 450 585.8163] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1640 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 565.3798 450 572.6656] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1641 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 550.1079 450 559.8049] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1642 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 536.9573 450 546.6542] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1643 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 525.9278 450 533.5035] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1644 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 512.7771 450 520.0628] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1645 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 499.6264 450 506.9122] /Subtype /Link /A << /S /GoTo /D (137) >> >> endobj 1646 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 486.4757 450 493.7615] /Subtype /Link /A << /S /GoTo /D (138) >> >> endobj 1647 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 473.3251 450 480.9008] /Subtype /Link /A << /S /GoTo /D (138) >> >> endobj 1648 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 458.0532 450 467.4601] /Subtype /Link /A << /S /GoTo /D (138) >> >> endobj 1649 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 447.0237 450 454.5995] /Subtype /Link /A << /S /GoTo /D (138) >> >> endobj 1650 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 433.873 450 441.4488] /Subtype /Link /A << /S /GoTo /D (139) >> >> endobj 1651 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 420.7223 450 428.2981] /Subtype /Link /A << /S /GoTo /D (139) >> >> endobj 1652 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 407.5717 450 414.602] /Subtype /Link /A << /S /GoTo /D (139) >> >> endobj 1653 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 375.6912 450 388.4434] /Subtype /Link /A << /S /GoTo /D (140) >> >> endobj 1654 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 330.162 450 340.1246] /Subtype /Link /A << /S /GoTo /D (141) >> >> endobj 1655 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 311.6024 450 321.2994] /Subtype /Link /A << /S /GoTo /D (141) >> >> endobj 1656 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 298.4517 450 308.1487] /Subtype /Link /A << /S /GoTo /D (142) >> >> endobj 1657 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 285.301 450 294.998] /Subtype /Link /A << /S /GoTo /D (143) >> >> endobj 1658 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 272.1504 450 281.8473] /Subtype /Link /A << /S /GoTo /D (144) >> >> endobj 1659 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 258.9997 450 268.6966] /Subtype /Link /A << /S /GoTo /D (144) >> >> endobj 1660 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 245.849 450 255.546] /Subtype /Link /A << /S /GoTo /D (145) >> >> endobj 1661 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 232.6983 450 242.3953] /Subtype /Link /A << /S /GoTo /D (146) >> >> endobj 1662 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 219.5476 450 229.2446] /Subtype /Link /A << /S /GoTo /D (146) >> >> endobj 1663 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 192.5779 450 202.5406] /Subtype /Link /A << /S /GoTo /D (148) >> >> endobj 1664 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 174.0184 450 183.7153] /Subtype /Link /A << /S /GoTo /D (148) >> >> endobj 1665 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 160.8677 450 170.5647] /Subtype /Link /A << /S /GoTo /D (149) >> >> endobj 1666 0 obj << /Type /Annot /Border [0 0 0] /Rect [433.6363 147.717 450 157.414] /Subtype /Link /A << /S /GoTo /D (149) >> >> endobj 1667 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 117.9578 450 130.71] /Subtype /Link /A << /S /GoTo /D (151) >> >> endobj 1668 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 85.5792 450 98.3314] /Subtype /Link /A << /S /GoTo /D (152) >> >> endobj 1628 0 obj << /D [1626 0 R /XYZ 90 720 null] >> endobj 1625 0 obj << /Font << /F51 9 0 R /F59 1406 0 R /F72 6 0 R /F97 1399 0 R /F52 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1671 0 obj << /Length 220 /Filter /FlateDecode >> stream xÚ­’=‚0†w~EGZîúÁQGItîfœ@bÄE?ß bâ iÇñö}š{‹ üBf‘RÂj"V^"èÚ绊{KÖ.J ƒ AX°È܉_cŽù`åª}ü¨ëäàvÑÆõfFÊ_¸ ™óH2ÔBéL^8´G‚"Õ’ŠÄêøÞ”·„c\_óI¸"o›êø §H Kc +HRæ¡Áaå÷dô~e“¯?›‹š-×üÈEK#ÈB>ŒÕÞGÜþ…ÓëøXø%¡¹a˜2ššÑ LÀíxðˆF endstream endobj 1670 0 obj << /Type /Page /Contents 1671 0 R /Resources 1669 0 R /MediaBox [0 0 612 792] /Parent 1674 0 R /Annots [ 1673 0 R ] >> endobj 1673 0 obj << /Type /Annot /Border [0 0 0] /Rect [425.7908 710.0373 450 720] /Subtype /Link /A << /S /GoTo /D (153) >> >> endobj 1672 0 obj << /D [1670 0 R /XYZ 90 720 null] >> endobj 1669 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F97 1399 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1675 0 obj << /S /GoTo /D (Intro) >> endobj 1677 0 obj (Introduction to Geomview) endobj 1678 0 obj << /S /GoTo /D (Distrib) >> endobj 1680 0 obj (Distribution) endobj 1681 0 obj << /S /GoTo /D (Copying) >> endobj 1683 0 obj (Copying) endobj 1684 0 obj << /S /GoTo /D (5) >> endobj 1686 0 obj (GNU LESSER PUBLIC LICENSE) endobj 1687 0 obj << /S /GoTo /D (5) >> endobj 1689 0 obj (Introducao) endobj 1690 0 obj << /S /GoTo /D (7) >> endobj 1692 0 obj (TERMOS E CONDICOES PARA COPIA, DISTRIBUICAO E MODIFICACAO) endobj 1693 0 obj << /S /GoTo /D (14) >> endobj 1695 0 obj (Como Aplicar Estes Termos para Suas Novas Bibliotecas) endobj 1696 0 obj << /S /GoTo /D (History) >> endobj 1698 0 obj (History of Geomview's Development) endobj 1699 0 obj << /S /GoTo /D (Authors) >> endobj 1701 0 obj (Authors) endobj 1702 0 obj << /S /GoTo /D (Platforms) >> endobj 1704 0 obj (Supported Platforms) endobj 1705 0 obj << /S /GoTo /D (Pronunciation) >> endobj 1707 0 obj (How to Pronounce ``Geomview``) endobj 1708 0 obj << /S /GoTo /D (Overview) >> endobj 1710 0 obj (Overview) endobj 1711 0 obj << /S /GoTo /D (Tutorial) >> endobj 1713 0 obj (Tutorial) endobj 1714 0 obj << /S /GoTo /D (Interaction) >> endobj 1716 0 obj (Interaction) endobj 1717 0 obj << /S /GoTo /D (Starting Geomview) >> endobj 1719 0 obj (Starting Geomview) endobj 1720 0 obj << /S /GoTo /D (Command Line Options) >> endobj 1722 0 obj (Command Line Options) endobj 1723 0 obj << /S /GoTo /D (Basic Interaction) >> endobj 1725 0 obj (Basic Interaction: The Main Panel) endobj 1726 0 obj << /S /GoTo /D (Loading) >> endobj 1728 0 obj (Loading Objects Into Geomview) endobj 1729 0 obj << /S /GoTo /D (Mouse Motions) >> endobj 1731 0 obj (Using the Mouse to Manipulate Objects) endobj 1732 0 obj << /S /GoTo /D (Point of Interest) >> endobj 1734 0 obj (Selecting a Point of Interest) endobj 1735 0 obj << /S /GoTo /D (Appearance) >> endobj 1737 0 obj (Changing the Way Things Look) endobj 1738 0 obj << /S /GoTo /D (Appearance Panel) >> endobj 1740 0 obj (The Appearance Panel) endobj 1741 0 obj << /S /GoTo /D (Materials Panel) >> endobj 1743 0 obj (The Materials Panel) endobj 1744 0 obj << /S /GoTo /D (Lighting Panel) >> endobj 1746 0 obj (The Lighting Panel) endobj 1747 0 obj << /S /GoTo /D (Cameras) >> endobj 1749 0 obj (Cameras) endobj 1750 0 obj << /S /GoTo /D (Saving) >> endobj 1752 0 obj (Saving your work) endobj 1753 0 obj << /S /GoTo /D (Commands) >> endobj 1755 0 obj (The Commands Panel) endobj 1756 0 obj << /S /GoTo /D (Keyboard Shortcuts) >> endobj 1758 0 obj (Keyboard Shortcuts) endobj 1759 0 obj << /S /GoTo /D (OOGL File Formats) >> endobj 1761 0 obj (OOGL File Formats) endobj 1762 0 obj << /S /GoTo /D (Conventions) >> endobj 1764 0 obj (Conventions) endobj 1765 0 obj << /S /GoTo /D (Common syntax) >> endobj 1767 0 obj (Syntax Common to All OOGL File Formats) endobj 1768 0 obj << /S /GoTo /D (File names) >> endobj 1770 0 obj (File Names) endobj 1771 0 obj << /S /GoTo /D (Vertices) >> endobj 1773 0 obj (Vertices) endobj 1774 0 obj << /S /GoTo /D (ND-Vertices) >> endobj 1776 0 obj (N-dimensional Vertices) endobj 1777 0 obj << /S /GoTo /D (Surface normal directions) >> endobj 1779 0 obj (Surface normal directions) endobj 1780 0 obj << /S /GoTo /D (Transformation matrices) >> endobj 1782 0 obj (Transformation matrices) endobj 1783 0 obj << /S /GoTo /D (ND Transformation matrices) >> endobj 1785 0 obj (ND Transformation matrices) endobj 1786 0 obj << /S /GoTo /D (Binary format) >> endobj 1788 0 obj (Binary format) endobj 1789 0 obj << /S /GoTo /D (References) >> endobj 1791 0 obj (Embedded objects and external-object references) endobj 1792 0 obj << /S /GoTo /D (Appearances) >> endobj 1794 0 obj (Appearances) endobj 1795 0 obj << /S /GoTo /D (Texture Mapping) >> endobj 1797 0 obj (Texture Mapping) endobj 1798 0 obj << /S /GoTo /D (Object File Formats) >> endobj 1800 0 obj (Object File Formats) endobj 1801 0 obj << /S /GoTo /D (QUAD) >> endobj 1803 0 obj (QUAD: collection of quadrilaterals) endobj 1804 0 obj << /S /GoTo /D (MESH) >> endobj 1806 0 obj (MESH: rectangularly-connected mesh) endobj 1807 0 obj << /S /GoTo /D (BBOX) >> endobj 1809 0 obj (BBOX: simple bounding boxes) endobj 1810 0 obj << /S /GoTo /D (BBP and BEZ) >> endobj 1812 0 obj (Bezier Surfaces) endobj 1813 0 obj << /S /GoTo /D (OFF) >> endobj 1815 0 obj (OFF Files) endobj 1816 0 obj << /S /GoTo /D (VECT) >> endobj 1818 0 obj (VECT Files) endobj 1819 0 obj << /S /GoTo /D (SKEL) >> endobj 1821 0 obj (SKEL Files) endobj 1822 0 obj << /S /GoTo /D (SPHERE) >> endobj 1824 0 obj (SPHERE Files) endobj 1825 0 obj << /S /GoTo /D (INST) >> endobj 1827 0 obj (INST Files) endobj 1828 0 obj << /S /GoTo /D (INST Examples) >> endobj 1830 0 obj (INST Examples) endobj 1831 0 obj << /S /GoTo /D (LIST) >> endobj 1833 0 obj (LIST Files) endobj 1834 0 obj << /S /GoTo /D (TLIST) >> endobj 1836 0 obj (TLIST Files) endobj 1837 0 obj << /S /GoTo /D (GROUP) >> endobj 1839 0 obj (GROUP Files) endobj 1840 0 obj << /S /GoTo /D (DISCGRP) >> endobj 1842 0 obj (DISCGRP Files) endobj 1843 0 obj << /S /GoTo /D (COMMENT) >> endobj 1845 0 obj (COMMENT Objects) endobj 1846 0 obj << /S /GoTo /D (Non-geometric objects) >> endobj 1848 0 obj (Non-geometric objects) endobj 1849 0 obj << /S /GoTo /D (appearance) >> endobj 1851 0 obj (Appearance Objects) endobj 1852 0 obj << /S /GoTo /D (image) >> endobj 1854 0 obj (Image Objects) endobj 1855 0 obj << /S /GoTo /D (transform) >> endobj 1857 0 obj (Transform Objects) endobj 1858 0 obj << /S /GoTo /D (ntransform) >> endobj 1860 0 obj (ND-Transform Objects) endobj 1861 0 obj << /S /GoTo /D (camera) >> endobj 1863 0 obj (cameras) endobj 1864 0 obj << /S /GoTo /D (window) >> endobj 1866 0 obj (window) endobj 1867 0 obj << /S /GoTo /D (Customization) >> endobj 1869 0 obj (Customization: .geomview files) endobj 1870 0 obj << /S /GoTo /D (Modules) >> endobj 1872 0 obj (External Modules) endobj 1873 0 obj << /S /GoTo /D (Interface) >> endobj 1875 0 obj (How External Modules Interface with Geomview) endobj 1876 0 obj << /S /GoTo /D (Example1) >> endobj 1878 0 obj (Example 1: Simple External Module) endobj 1879 0 obj << /S /GoTo /D (Example2) >> endobj 1881 0 obj (Example 2: Simple External Module with FORMS Control Panel) endobj 1882 0 obj << /S /GoTo /D (XForms) >> endobj 1884 0 obj (The XForms Library) endobj 1885 0 obj << /S /GoTo /D (Example3) >> endobj 1887 0 obj (Example 3: External Module with Bi-Directional Communication) endobj 1888 0 obj << /S /GoTo /D (Example4) >> endobj 1890 0 obj (Example 4: Simple Tcl/Tk Module Demonstrating Picking) endobj 1891 0 obj << /S /GoTo /D (Module Installation) >> endobj 1893 0 obj (Module Installation) endobj 1894 0 obj << /S /GoTo /D (Private Module Installation) >> endobj 1896 0 obj (Private Module Installation) endobj 1897 0 obj << /S /GoTo /D (System Module Installation) >> endobj 1899 0 obj (System Module Installation) endobj 1900 0 obj << /S /GoTo /D (GCL) >> endobj 1902 0 obj (GCL: the Geomview Command Language) endobj 1903 0 obj << /S /GoTo /D (Argument Conventions) >> endobj 1905 0 obj (Conventions Used In Describing Argument Types) endobj 1906 0 obj << /S /GoTo /D (GCL Reference) >> endobj 1908 0 obj (GCL Reference Guide) endobj 1909 0 obj << /S /GoTo /D (shell) >> endobj 1911 0 obj (!) endobj 1912 0 obj << /S /GoTo /D (lt) >> endobj 1914 0 obj (<) endobj 1915 0 obj << /S /GoTo /D (eq) >> endobj 1917 0 obj (=) endobj 1918 0 obj << /S /GoTo /D (gt) >> endobj 1920 0 obj (>) endobj 1921 0 obj << /S /GoTo /D (help) >> endobj 1923 0 obj (?) endobj 1924 0 obj << /S /GoTo /D (morehelp) >> endobj 1926 0 obj (??) endobj 1927 0 obj << /S /GoTo /D (emodule-run) >> endobj 1929 0 obj (|) endobj 1930 0 obj << /S /GoTo /D (all) >> endobj 1932 0 obj (all) endobj 1933 0 obj << /S /GoTo /D (and) >> endobj 1935 0 obj (and) endobj 1936 0 obj << /S /GoTo /D (ap-override) >> endobj 1938 0 obj (ap-override) endobj 1939 0 obj << /S /GoTo /D (backcolor) >> endobj 1941 0 obj (backcolor) endobj 1942 0 obj << /S /GoTo /D (background-image) >> endobj 1944 0 obj (background-image) endobj 1945 0 obj << /S /GoTo /D (bbox-color) >> endobj 1947 0 obj (bbox-color) endobj 1948 0 obj << /S /GoTo /D (bbox-draw) >> endobj 1950 0 obj (bbox-draw) endobj 1951 0 obj << /S /GoTo /D (camera) >> endobj 1953 0 obj (camera) endobj 1954 0 obj << /S /GoTo /D (camera-draw) >> endobj 1956 0 obj (camera-draw) endobj 1957 0 obj << /S /GoTo /D (camera-prop) >> endobj 1959 0 obj (camera-prop) endobj 1960 0 obj << /S /GoTo /D (camera-reset) >> endobj 1962 0 obj (camera-reset) endobj 1963 0 obj << /S /GoTo /D (car) >> endobj 1965 0 obj (car) endobj 1966 0 obj << /S /GoTo /D (cdr) >> endobj 1968 0 obj (cdr) endobj 1969 0 obj << /S /GoTo /D (clock) >> endobj 1971 0 obj (clock) endobj 1972 0 obj << /S /GoTo /D (command) >> endobj 1974 0 obj (command) endobj 1975 0 obj << /S /GoTo /D (copy) >> endobj 1977 0 obj (copy) endobj 1978 0 obj << /S /GoTo /D (cursor-still) >> endobj 1980 0 obj (cursor-still) endobj 1981 0 obj << /S /GoTo /D (cursor-twitch) >> endobj 1983 0 obj (cursor-twitch) endobj 1984 0 obj << /S /GoTo /D (delete) >> endobj 1986 0 obj (delete) endobj 1987 0 obj << /S /GoTo /D (dice) >> endobj 1989 0 obj (dice) endobj 1990 0 obj << /S /GoTo /D (dimension) >> endobj 1992 0 obj (dimension) endobj 1993 0 obj << /S /GoTo /D (dither) >> endobj 1995 0 obj (dither) endobj 1996 0 obj << /S /GoTo /D (draw) >> endobj 1998 0 obj (draw) endobj 1999 0 obj << /S /GoTo /D (dump-handles) >> endobj 2001 0 obj (dump-handles) endobj 2002 0 obj << /S /GoTo /D (echo) >> endobj 2004 0 obj (echo) endobj 2005 0 obj << /S /GoTo /D (emodule-clear) >> endobj 2007 0 obj (emodule-clear) endobj 2008 0 obj << /S /GoTo /D (emodule-define) >> endobj 2010 0 obj (emodule-define) endobj 2011 0 obj << /S /GoTo /D (emodule-defined) >> endobj 2013 0 obj (emodule-defined) endobj 2014 0 obj << /S /GoTo /D (emodule-isrunning) >> endobj 2016 0 obj (emodule-isrunning) endobj 2017 0 obj << /S /GoTo /D (emodule-path) >> endobj 2019 0 obj (emodule-path) endobj 2020 0 obj << /S /GoTo /D (emodule-run) >> endobj 2022 0 obj (emodule-run) endobj 2023 0 obj << /S /GoTo /D (emodule-sort) >> endobj 2025 0 obj (emodule-sort) endobj 2026 0 obj << /S /GoTo /D (emodule-start) >> endobj 2028 0 obj (emodule-start) endobj 2029 0 obj << /S /GoTo /D (emodule-transmit) >> endobj 2031 0 obj (emodule-transmit) endobj 2032 0 obj << /S /GoTo /D (escale) >> endobj 2034 0 obj (escale) endobj 2035 0 obj << /S /GoTo /D (event-keys) >> endobj 2037 0 obj (event-keys) endobj 2038 0 obj << /S /GoTo /D (event-mode) >> endobj 2040 0 obj (event-mode) endobj 2041 0 obj << /S /GoTo /D (event-pick) >> endobj 2043 0 obj (event-pick) endobj 2044 0 obj << /S /GoTo /D (evert) >> endobj 2046 0 obj (evert) endobj 2047 0 obj << /S /GoTo /D (exit) >> endobj 2049 0 obj (exit) endobj 2050 0 obj << /S /GoTo /D (ezoom) >> endobj 2052 0 obj (ezoom) endobj 2053 0 obj << /S /GoTo /D (freeze) >> endobj 2055 0 obj (freeze) endobj 2056 0 obj << /S /GoTo /D (geometry) >> endobj 2058 0 obj (geometry) endobj 2059 0 obj << /S /GoTo /D (geomview-version) >> endobj 2061 0 obj (geomview-version) endobj 2062 0 obj << /S /GoTo /D (hdefine) >> endobj 2064 0 obj (hdefine) endobj 2065 0 obj << /S /GoTo /D (hdelete) >> endobj 2067 0 obj (hdelete) endobj 2068 0 obj << /S /GoTo /D (help) >> endobj 2070 0 obj (help) endobj 2071 0 obj << /S /GoTo /D (hmodel) >> endobj 2073 0 obj (hmodel) endobj 2074 0 obj << /S /GoTo /D (hsphere-draw) >> endobj 2076 0 obj (hsphere-draw) endobj 2077 0 obj << /S /GoTo /D (if) >> endobj 2079 0 obj (if) endobj 2080 0 obj << /S /GoTo /D (inhibit-warning) >> endobj 2082 0 obj (inhibit-warning) endobj 2083 0 obj << /S /GoTo /D (input-translator) >> endobj 2085 0 obj (input-translator) endobj 2086 0 obj << /S /GoTo /D (interest) >> endobj 2088 0 obj (interest) endobj 2089 0 obj << /S /GoTo /D (lines-closer) >> endobj 2091 0 obj (lines-closer) endobj 2092 0 obj << /S /GoTo /D (load) >> endobj 2094 0 obj (load) endobj 2095 0 obj << /S /GoTo /D (load-path) >> endobj 2097 0 obj (load-path) endobj 2098 0 obj << /S /GoTo /D (look) >> endobj 2100 0 obj (look) endobj 2101 0 obj << /S /GoTo /D (look-encompass) >> endobj 2103 0 obj (look-encompass) endobj 2104 0 obj << /S /GoTo /D (look-encompass-size) >> endobj 2106 0 obj (look-encompass-size) endobj 2107 0 obj << /S /GoTo /D (look-recenter) >> endobj 2109 0 obj (look-recenter) endobj 2110 0 obj << /S /GoTo /D (look-toward) >> endobj 2112 0 obj (look-toward) endobj 2113 0 obj << /S /GoTo /D (merge) >> endobj 2115 0 obj (merge) endobj 2116 0 obj << /S /GoTo /D (merge-ap) >> endobj 2118 0 obj (merge-ap) endobj 2119 0 obj << /S /GoTo /D (merge-base-ap) >> endobj 2121 0 obj (merge-base-ap) endobj 2122 0 obj << /S /GoTo /D (merge-baseap) >> endobj 2124 0 obj (merge-baseap) endobj 2125 0 obj << /S /GoTo /D (morehelp) >> endobj 2127 0 obj (morehelp) endobj 2128 0 obj << /S /GoTo /D (name-object) >> endobj 2130 0 obj (name-object) endobj 2131 0 obj << /S /GoTo /D (ND-axes) >> endobj 2133 0 obj (ND-axes) endobj 2134 0 obj << /S /GoTo /D (ND-color) >> endobj 2136 0 obj (ND-color) endobj 2137 0 obj << /S /GoTo /D (ND-xform) >> endobj 2139 0 obj (ND-xform) endobj 2140 0 obj << /S /GoTo /D (ND-xform-get) >> endobj 2142 0 obj (ND-xform-get) endobj 2143 0 obj << /S /GoTo /D (ND-xform-set) >> endobj 2145 0 obj (ND-xform-set) endobj 2146 0 obj << /S /GoTo /D (new-alien) >> endobj 2148 0 obj (new-alien) endobj 2149 0 obj << /S /GoTo /D (new-camera) >> endobj 2151 0 obj (new-camera) endobj 2152 0 obj << /S /GoTo /D (new-center) >> endobj 2154 0 obj (new-center) endobj 2155 0 obj << /S /GoTo /D (new-geometry) >> endobj 2157 0 obj (new-geometry) endobj 2158 0 obj << /S /GoTo /D (new-reset) >> endobj 2160 0 obj (new-reset) endobj 2161 0 obj << /S /GoTo /D (NeXT) >> endobj 2163 0 obj (NeXT) endobj 2164 0 obj << /S /GoTo /D (normalization) >> endobj 2166 0 obj (normalization) endobj 2167 0 obj << /S /GoTo /D (not) >> endobj 2169 0 obj (not) endobj 2170 0 obj << /S /GoTo /D (or) >> endobj 2172 0 obj (or) endobj 2173 0 obj << /S /GoTo /D (pick) >> endobj 2175 0 obj (pick) endobj 2176 0 obj << /S /GoTo /D (pick-invisible) >> endobj 2178 0 obj (pick-invisible) endobj 2179 0 obj << /S /GoTo /D (pickable) >> endobj 2181 0 obj (pickable) endobj 2182 0 obj << /S /GoTo /D (position) >> endobj 2184 0 obj (position) endobj 2185 0 obj << /S /GoTo /D (position-at) >> endobj 2187 0 obj (position-at) endobj 2188 0 obj << /S /GoTo /D (position-toward) >> endobj 2190 0 obj (position-toward) endobj 2191 0 obj << /S /GoTo /D (progn) >> endobj 2193 0 obj (progn) endobj 2194 0 obj << /S /GoTo /D (quit) >> endobj 2196 0 obj (quit) endobj 2197 0 obj << /S /GoTo /D (quote) >> endobj 2199 0 obj (quote) endobj 2200 0 obj << /S /GoTo /D (rawevent) >> endobj 2202 0 obj (rawevent) endobj 2203 0 obj << /S /GoTo /D (rawpick) >> endobj 2205 0 obj (rawpick) endobj 2206 0 obj << /S /GoTo /D (read) >> endobj 2208 0 obj (read) endobj 2209 0 obj << /S /GoTo /D (real-id) >> endobj 2211 0 obj (real-id) endobj 2212 0 obj << /S /GoTo /D (redraw) >> endobj 2214 0 obj (redraw) endobj 2215 0 obj << /S /GoTo /D (regtable) >> endobj 2217 0 obj (regtable) endobj 2218 0 obj << /S /GoTo /D (rehash-emodule-path) >> endobj 2220 0 obj (rehash-emodule-path) endobj 2221 0 obj << /S /GoTo /D (replace-geometry) >> endobj 2223 0 obj (replace-geometry) endobj 2224 0 obj << /S /GoTo /D (rib-display) >> endobj 2226 0 obj (rib-display) endobj 2227 0 obj << /S /GoTo /D (rib-snapshot) >> endobj 2229 0 obj (rib-snapshot) endobj 2230 0 obj << /S /GoTo /D (scale) >> endobj 2232 0 obj (scale) endobj 2233 0 obj << /S /GoTo /D (scene) >> endobj 2235 0 obj (scene) endobj 2236 0 obj << /S /GoTo /D (set-clock) >> endobj 2238 0 obj (set-clock) endobj 2239 0 obj << /S /GoTo /D (set-conformal-refine) >> endobj 2241 0 obj (set-conformal-refine) endobj 2242 0 obj << /S /GoTo /D (set-emodule-path) >> endobj 2244 0 obj (set-emodule-path) endobj 2245 0 obj << /S /GoTo /D (set-load-path) >> endobj 2247 0 obj (set-load-path) endobj 2248 0 obj << /S /GoTo /D (set-motionscale) >> endobj 2250 0 obj (set-motionscale) endobj 2251 0 obj << /S /GoTo /D (setenv) >> endobj 2253 0 obj (setenv) endobj 2254 0 obj << /S /GoTo /D (sgi) >> endobj 2256 0 obj (sgi) endobj 2257 0 obj << /S /GoTo /D (shell) >> endobj 2259 0 obj (shell) endobj 2260 0 obj << /S /GoTo /D (sleep-for) >> endobj 2262 0 obj (sleep-for) endobj 2263 0 obj << /S /GoTo /D (sleep-until) >> endobj 2265 0 obj (sleep-until) endobj 2266 0 obj << /S /GoTo /D (snapshot) >> endobj 2268 0 obj (snapshot) endobj 2269 0 obj << /S /GoTo /D (soft-shader) >> endobj 2271 0 obj (soft-shader) endobj 2272 0 obj << /S /GoTo /D (space) >> endobj 2274 0 obj (space) endobj 2275 0 obj << /S /GoTo /D (stereowin) >> endobj 2277 0 obj (stereowin) endobj 2278 0 obj << /S /GoTo /D (time-interests) >> endobj 2280 0 obj (time-interests) endobj 2281 0 obj << /S /GoTo /D (transform) >> endobj 2283 0 obj (transform) endobj 2284 0 obj << /S /GoTo /D (transform-incr) >> endobj 2286 0 obj (transform-incr) endobj 2287 0 obj << /S /GoTo /D (transform-set) >> endobj 2289 0 obj (transform-set) endobj 2290 0 obj << /S /GoTo /D (ui-cam-focus) >> endobj 2292 0 obj (ui-cam-focus) endobj 2293 0 obj << /S /GoTo /D (ui-center) >> endobj 2295 0 obj (ui-center) endobj 2296 0 obj << /S /GoTo /D (ui-center-origin) >> endobj 2298 0 obj (ui-center-origin) endobj 2299 0 obj << /S /GoTo /D (ui-emotion-program) >> endobj 2301 0 obj (ui-emotion-program) endobj 2302 0 obj << /S /GoTo /D (ui-emotion-run) >> endobj 2304 0 obj (ui-emotion-run) endobj 2305 0 obj << /S /GoTo /D (ui-freeze) >> endobj 2307 0 obj (ui-freeze) endobj 2308 0 obj << /S /GoTo /D (ui-html-browser) >> endobj 2310 0 obj (ui-html-browser) endobj 2311 0 obj << /S /GoTo /D (ui-motion) >> endobj 2313 0 obj (ui-motion) endobj 2314 0 obj << /S /GoTo /D (ui-panel) >> endobj 2316 0 obj (ui-panel) endobj 2317 0 obj << /S /GoTo /D (ui-pdf-viewer) >> endobj 2319 0 obj (ui-pdf-viewer) endobj 2320 0 obj << /S /GoTo /D (ui-target) >> endobj 2322 0 obj (ui-target) endobj 2323 0 obj << /S /GoTo /D (uninterest) >> endobj 2325 0 obj (uninterest) endobj 2326 0 obj << /S /GoTo /D (update) >> endobj 2328 0 obj (update) endobj 2329 0 obj << /S /GoTo /D (update-draw) >> endobj 2331 0 obj (update-draw) endobj 2332 0 obj << /S /GoTo /D (window) >> endobj 2334 0 obj (window) endobj 2335 0 obj << /S /GoTo /D (winenter) >> endobj 2337 0 obj (winenter) endobj 2338 0 obj << /S /GoTo /D (write) >> endobj 2340 0 obj (write) endobj 2341 0 obj << /S /GoTo /D (write-comments) >> endobj 2343 0 obj (write-comments) endobj 2344 0 obj << /S /GoTo /D (write-handle) >> endobj 2346 0 obj (write-handle) endobj 2347 0 obj << /S /GoTo /D (write-sexpr) >> endobj 2349 0 obj (write-sexpr) endobj 2350 0 obj << /S /GoTo /D (xform) >> endobj 2352 0 obj (xform) endobj 2353 0 obj << /S /GoTo /D (xform-incr) >> endobj 2355 0 obj (xform-incr) endobj 2356 0 obj << /S /GoTo /D (xform-set) >> endobj 2358 0 obj (xform-set) endobj 2359 0 obj << /S /GoTo /D (zoom) >> endobj 2361 0 obj (zoom) endobj 2362 0 obj << /S /GoTo /D (Non-Euclidean Geometry) >> endobj 2364 0 obj (Non-Euclidean Geometry) endobj 2365 0 obj << /S /GoTo /D (Mathematica) >> endobj 2367 0 obj (Mathematica Graphics in Geomview or RenderMan) endobj 2368 0 obj << /S /GoTo /D (OOGL.m) >> endobj 2370 0 obj (Using Mathematica to generate OOGL files) endobj 2371 0 obj << /S /GoTo /D (Geomview.m) >> endobj 2373 0 obj (Using Geomview as Mathematica's Default 3D Display) endobj 2374 0 obj << /S /GoTo /D (RenderMan) >> endobj 2376 0 obj (Using Mathematica to generate RenderMan files) endobj 2377 0 obj << /S /GoTo /D (Remote Display) >> endobj 2379 0 obj (Using Geomview and Mathematica on Different Computers) endobj 2380 0 obj << /S /GoTo /D (Networked Geomview) >> endobj 2382 0 obj (Using a Networked Geomview Host) endobj 2383 0 obj << /S /GoTo /D (Chunks) >> endobj 2385 0 obj (Transporting Mathematica Files to Geomview by Hand) endobj 2386 0 obj << /S /GoTo /D (Package Details) >> endobj 2388 0 obj (Details of the Mathematica->Geomview Package) endobj 2389 0 obj << /S /GoTo /D (Package Installation) >> endobj 2391 0 obj (Installing the Mathematica Packages) endobj 2392 0 obj << /S /GoTo /D (Installation) >> endobj 2394 0 obj (Installation) endobj 2395 0 obj << /S /GoTo /D (Unix Binary Installation) >> endobj 2397 0 obj (Installing the Unix Binary Distribution) endobj 2398 0 obj << /S /GoTo /D (Unix Binary Detail) >> endobj 2400 0 obj (Details of the Unix Binary Installation) endobj 2401 0 obj << /S /GoTo /D (Source Code Installation) >> endobj 2403 0 obj (Compiling and Installing the Source Code Distribution) endobj 2404 0 obj << /S /GoTo /D (Support) >> endobj 2406 0 obj (Getting Technical Support for Geomview) endobj 2407 0 obj << /S /GoTo /D (Contributing) >> endobj 2409 0 obj (Contributing to Geomview's Development) endobj 2410 0 obj << /S /GoTo /D (Function Index) >> endobj 2412 0 obj (Function Index) endobj 2415 0 obj << /Length 1200 /Filter /FlateDecode >> stream xÚíÚÝoÛ6ð÷ü~”Ìéø)î-ËšaC‹ ¨ß† le1æX™’tØ?RÌ%å‘íP7Á ¨%ùÄ£Â_N#XUî¬lµ2B0+YmoΪéðŸg0m­]ć|·9ûæRÁ *f+ «ÍÕ“F6»_‹·û»ûr-„(º«ñórÿÇC Eß–k(îÜ10\ tùÛæ§³7›Nqžëù¸G†¯À0JN=Òµd ¤šzä²2ªèÜöÕ¸éúåvzß­öÎwæùµtyäj̓JÙ¡5t5BÈ‚3·ß–k)UñãÑíìï÷Ía¼òÚî¦ä¦øà—ÿ÷øÅnè’?pë6MÉë⟲›ºaŸtÃX’×îGà{à’Öã‡ù{§?ᕞþœ«ÜÏy¥•e¯µ7å _cwsÜF~>nÐؘuÜe=“ª‘¨–ŠÕÆÐDùDôgïíºñPw݈ñ¶éÝ^3OÇÞùŽ;÷_GÌÔÚ,$¿Øé¤Ìyh³2Q`R&¶Â!*5EÊL§ 2g†AÊ“ÌóQÞ/¾6¾>ÛÃvCê¾ø½”†íq»oâ.•dÆ€^\~•ÓI³ó gÍ¢À¤Y¬ˆó¨YÔi6.˜˔њ4+'³«uX'©î¾>½™oïÛîpýX\}=".º¾"âŒkËŒÒbaüEUÎÚU‰“*±B%jŠT™NTVšIž˜†ªpŸ+i繿ÝÿõàKì_S»„CíæÑV-3ÏSNRÇ:K&©b<\F©¢¦Hªét3UeãFq’ªž¨nÊZNO†£Å‘êú½ÛuO»vëšv×ÓR¥˜^¤¾ô? |Î-L¹}"‰«˜[Üå6“.¸­+|Z7xæVà'ýÍõã­ü«±~‹OsW_pcB…b $,B_üjI½óðgõ¢À¤^ì‰×Q½¨)Ro:]Ы5³FXR/_&ÿ— Bë,U˜¤ŠñˆèªnФšN¨*Áj.8IUD íÛ®ÙáE‚ãø‡¸M¡™V•Zl¾Þ‚;3È*FIÅØ•ˆ>‘á¦HÅétA±¬˜6œž.ÈO+¸—~> endobj 2418 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 656.9074 522 666.6044] /Subtype /Link /A << /S /GoTo /D (19) >> >> endobj 2419 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 643.7567 522 653.4537] /Subtype /Link /A << /S /GoTo /D (21) >> >> endobj 2420 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 630.6061 522 640.303] /Subtype /Link /A << /S /GoTo /D (22) >> >> endobj 2421 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 617.4554 522 627.1523] /Subtype /Link /A << /S /GoTo /D (22) >> >> endobj 2422 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 604.3047 522 614.0016] /Subtype /Link /A << /S /GoTo /D (24) >> >> endobj 2423 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 591.154 522 600.851] /Subtype /Link /A << /S /GoTo /D (25) >> >> endobj 2424 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 578.0033 522 587.7003] /Subtype /Link /A << /S /GoTo /D (28) >> >> endobj 2425 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 564.8526 522 574.5496] /Subtype /Link /A << /S /GoTo /D (31) >> >> endobj 2426 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 551.702 522 561.3989] /Subtype /Link /A << /S /GoTo /D (32) >> >> endobj 2427 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 538.5513 522 548.2482] /Subtype /Link /A << /S /GoTo /D (33) >> >> endobj 2428 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 525.4006 522 535.0976] /Subtype /Link /A << /S /GoTo /D (38) >> >> endobj 2429 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 512.2499 522 521.9469] /Subtype /Link /A << /S /GoTo /D (39) >> >> endobj 2430 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 499.0992 522 508.7962] /Subtype /Link /A << /S /GoTo /D (40) >> >> endobj 2431 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 485.9486 522 495.6455] /Subtype /Link /A << /S /GoTo /D (43) >> >> endobj 2432 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 472.7979 522 482.4948] /Subtype /Link /A << /S /GoTo /D (46) >> >> endobj 2433 0 obj << /Type /Annot /Border [0 0 0] /Rect [511.0909 459.6472 522 469.3441] /Subtype /Link /A << /S /GoTo /D (48) >> >> endobj 2416 0 obj << /D [2414 0 R /XYZ 90 720 null] >> endobj 2417 0 obj << /D [2414 0 R /XYZ 90 720 null] >> endobj 2413 0 obj << /Font << /F51 9 0 R /F72 6 0 R /F59 1406 0 R >> /ProcSet [ /PDF /Text ] >> endobj 729 0 obj [2 0 R /Fit] endobj 1405 0 obj << /Length1 753 /Length2 981 /Length3 532 /Length 1526 /Filter /FlateDecode >> stream xÚíRiTWFV‚Z¶V©1JDB !¡€‰FˆeS‘E3/02™‰Ã„ ‚uWªåh‰Ö¢àRëÔ±JpÁ7¢‚"xÔ**(Vp¡êñ¶¿zúÞŸwïýî÷¾÷ÝÇv ò”¢ä\(# Ú“ÏåK@°B!çósæñXlv0#‰I %€/û€©Z&žH"œ ŠXlLjÒ),)™îÁœ^HÕ” Õ ‡ÁA©Ä ÎR‘½© ¦B* ¢\ŸPLIƒ¹0 #X^½šä„Š¢·iT«y_JƒT*# ¸÷ÉäF$Jx:@¡Šå5dnƒŒ–CVr™ǧ!ê^ú>§>ª#j O‡ Õ- )  QHý¡3á[q ˆbZuÿªœFpL)%’p<ùÞ\ž÷Û<–*Ãt Çhe2P!x*ìËCí¯„ñ¯O‡W¤T6C1ÕãÝhûŠáFÐÑéxÐ}1ÿC̘Da:Çãòx|Èì÷§„~—…Jň$ ú„¢tó‰˜H2ø#P¨PÇ(öâ$Í´Æ™@ER¬Þ¹ }—† ‰öæY?$(ˆÔexNO!æyû‘·ào@¥–¢ A÷}ÆŽ÷± c„P•,ÓRé·dÞúËŠ²B Ï[rRGv,9sdé>ƒ÷A“ŸÝ%ªü\4ü²Ãv©íSoZy×4²USîñøš[çÍ´#–¥a÷ù¢§¶U‹®^yý4+%»î–ÉúGÔ펞•0,θw3÷t÷ÃÉd!iÚV;,~C§ý“Ó±Æú”C âœ|…Åeƒÿ++G§j®cñ7¦Œ4Åü,ž%4ÂçÒŒÍ`6ÜßÕPYªx4¨åGÜâj\/_´@?e¦|úsçâ-vÊ"gÜò6§°ìXl•:€¨^ÞZ±È.¥ì¼Àÿ¾¦<™ØõšÝ1zõÀg /_6ýÙ“ãTõX™ájæ¸Û|¦‡ïÆÀ4wœ3<'Ë‹+Œ®³äuwiià”&ë‰95ê³Í™•/ F|y¡Ã•_V¸™¬û’.õúÍ㱿Vׯ‡èÌijŽ_5<ùãxUÎFÁlYp\Sâ¡è«µ%ûN²/Y>0ÁX!“Ž®D6´ s °á÷¹4¾5$¯1U×ër&δvw¹ì”ølªåwçœ~º±¼m‡K–åÅÎ)k¸£Çeø>²8Z’˜~Þ·d¯ñäcףљžëSv…-S§·‹­òŠÅeOø›3?“VœPåS¹ Ô=4»s§†=çTI;m“þ² ‘KÍ > endobj 1404 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /RAFVMJ+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/period) /FontFile 1405 0 R >> endobj 2435 0 obj [278 ] endobj 2434 0 obj << /Type /Encoding /Differences [ 0 /.notdef 58/period 59/.notdef] >> endobj 1398 0 obj << /Length1 753 /Length2 981 /Length3 532 /Length 1530 /Filter /FlateDecode >> stream xÚí’{8TiÇ£¬m4n›d·Ë[vž"ÌŌɨ-÷jÊ&,Ñs^3'3çèÌÐLÆeEI¥$ÔÒb»(­U…$›®JR$„Òªž¥©Ûª§gퟻí³çüóþ~¿ïû}?çûÚ*÷@•ñB" Jåp¼1d" ™ß8ÝÙ}•O@À¢wW;>ô¢˜b*ÆõxÍüP“!¨¬gØ1LRH¾ïWAsÇD8‚bbÀâ8!AUiÅâp@ •*Ibº†+È-€L&„âeì^9‹=œ¼ëSþþ!..¸2ÊÖžlYÒ˜Ár\#ú/BQA@L1þ³q¼¯CQ2A•PDiiÂEN 3K·ƸÜ<ªg%Ÿ•}8¡®*Q“íd×{ßÉô6QV¿ÎùÍ$Ñd#zÌxoÿÊãt$”ÓiQꬾåMO¼kr‰:Ý*oŸ·þ€¨7pƒîåkŒd9;zZæv‡—-¸gù¢#²J¯xÕ&7ߢ?yJasÓè`LXìõ΃,ÄòÑ^JЊUÐ÷qGÚµßû<ñ¼åàeóÀ}/>ù£Å¢¦ýVX5ÛqçÁä¦#Ï×{g ,,¬¶¶e]P¿Xë¥3Ûâ‰V:j¶”g<íhˆéÃ;-ŽiòØ–ŒÓæºëJ‡›nâé³ì۴ÔZåî¶ÚXÕd·\ý]kªrÅKÌjÌ–|4申VjÒólófµIW‘ñìÂȺ¢chú³†åxEì aQnÚë¡>õ‚%t“ƒç]p­³&˜¾Z" LoÝêÇõ-NØt­ÚKÙv»Û–?ô¨Ø£†]ïo=ëñ`îgy'îáør»3bŽ 2ï|úüH¶Æu{×h:Å=T®Ðc4Ö„RÌ-ÃxñçXÔ±·h÷÷tU^V’h 3*nZÎ) p¬ùâ4ê½i™ÜpòÓùo¢Nœo‰¶Ý\r¶Î:¸Äæe\àHZí™éÕƒñÒ×_Ǧw«Ÿú³Ú-¾ÓÖP3×E] ’%ºù”ðòø|º¯­ÚgÊ\£[{ÎÉŽ7Úá‰]‰ÎxcFcdÒR}¹îºÛ‚òzªk‡ÕxYã…e½læÔÿa­vVŸLölêP¯Q3u³õN ?ᢩnºöŒçž•XþÚ^„±4Dî=à ê$O’ÌÝâ()½¦Éí¢¥nˆÒט›)'Tí?PòÊèîUjÞLÄ£Ý×Ç¥².Ú~ßœ“«bùŸc)Ä“í½žjY™_vñ¶•ÍÁ_n™tÝæfúÔoãÛüNP•}Uõ<ƒWß•_mµ\YÑÊ.®~žb=l½Û/ß¹¢­Éß“ûë^ï-+|øàjëòVu°á “—8í.©OŒÑ±Y}2¼<>ÃçÔ$Ϻ&WR»—Kï±e{†lë1Þ,±D)öí<¾½—î„Z5kžùÊç3~îPí×éÍA“<÷meWä¿jÛäQIý)çá!w§™3?þ5yGgµmQrSW3¿÷|ýtmPV’Ù3ÙW¶ßËÁ‹ 1]÷ôqyß/»ùæ‚Ân‰‘Õ c¿n›‚o‚νáý#<œR•dp2iþ4‹ªƒkÏeË&1cÁ ßäu] ‹fç¸zÅ®x]¹ÅÕ„eè§ÜâÆé×Q{ê" -šš5¦}A|‚ñÊÿÿ ‘ .a”?åŸ=¼ endstream endobj 1399 0 obj << /Type /Font /Subtype /Type1 /Encoding 2436 0 R /FirstChar 58 /LastChar 58 /Widths 2437 0 R /BaseFont /AELUZZ+CMMI12 /FontDescriptor 1397 0 R >> endobj 1397 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /AELUZZ+CMMI12 /ItalicAngle -14.04 /StemV 65 /XHeight 431 /FontBBox [-30 -250 1026 750] /Flags 4 /CharSet (/period) /FontFile 1398 0 R >> endobj 2437 0 obj [272 ] endobj 2436 0 obj << /Type /Encoding /Differences [ 0 /.notdef 58/period 59/.notdef] >> endobj 1225 0 obj << /Length1 907 /Length2 2704 /Length3 532 /Length 3343 /Filter /FlateDecode >> stream xÚíRy<”{ß&KŒr¬*÷äfÆc_K¨‘ÝLÓÌјafL†R"[v² ¢ìD9¶„Jˆ’J"Ñ(KêÐbI–Ð3Õ9§çéùó}ÿz?ï}ÿs_×÷ú]ßëþ~ÊP;G 3íhI£25šH}Àë  5ee :H`’iÔ½&¨ õô€Y 7 …:ú(=}´D° ù³édo& j¡öM„Ìü@:™H XÓôãy À‘F$ƒL¶&`F¡ßN0ÒY I‚D$2‘ ½ÉTü[kª Àü Iþ—X Á ¨òBª¼ˆ$•ÂH nKãõyIþ7BýjnH¡Øü¾Ùófô_U‚™Âþ«Nóód‚tK#tê¯RWðG4,H"úýZµf(d¢Õ›ˆ™aIIvd&Ñð"Pàw¤’~ ÁÛ÷ðƒ8G§ý{÷|ßæ÷’Le:±ýÿ1ý¦ýŽ‘?1o6trà†ÐD tðßZÜ‹HÿI x™õo ^[ïÿÁhY õ'£ÀìçÀ©ä¿‚ü÷¼ÍÍiA!(=@C‹—‰@é4âÔ‰t:He~¿Ê¼­ý½È¼ƒ`H„<  "|3ê#ËB÷<.Rç7÷nH²­¹Ý×">˜ÌO)¾ @}äÜJGZ|RhRñĪ#¶ù¤}åǰ€¤ÌþõI–ç$'¸Q7ÇÁ²_ûïZ Ÿþ­©þé§whþCOFºËÒð…¹3w§/Ù©îuz³ñ”¯ÕUÛš¡ƒÁYr(ÎQçþPAA$2Ê¢µ£¸'$ÒR¹ÂC}£D®ïž¥5J­ˆä§®Y”M”$6+¢ÆÔeÞ˜¼+-Œ’ø­úk{×UÓlÀÛ‘L ‰8Ü·¿(y57X~ŸGïÌÖ‡û¢±¬°ÆftMYÇ}¤xµÇçÐf°1“R@«¬g?ÂÝXë{½c­O¦QÞÓYö™Ú ]YhÍVm˜«ã&s[ Ù¯ÏafWlÜÅ­Êö=Û½{Ä #ýZ‚´«ËÕRÉÞ);axÒ2÷å«'>>-=º¶!ËÌæÄ;z’!¢šÎy~; ij¶¢ð‡_My¦.Gb‚Ó…ÅfÕ/Õ)÷䕘­ íè·ÑºÙã\êÃ%Jr,ü—´`Ýï”(u›Ê®Ú”AÞ2¦dF¤uae6Çg*Þ¯qHM&XÆNÍ휭1»?™mQ‚ø·éÝ KgmP¯Q8’ƒãü)z@4°¯´Ä´lN}Ë• ± Ù‘Ú¸³A6)~¦[^mýåy¾+êY9нîã[OCëËktÉ]g ÆÅuï\öwÑÞ¶³{Æ`}Øu†=õÐuˆ¦{àe®U –ðŠ9ïTZ7¼ØrvÔ·h먕ERª^Ý›7óóMÖ&Ñ6Ûïx\Ll”êCfUæÂŒ]1»ý ø(^m„ 2³Š’©b;2Zƒ¶t¹)¬egèË) èm“­”™íþ¦þî)Ÿíñ˜$¯5:Û¯I´e7ßiŒcQZR:sþ&±)”w!‘4xgågË[ÖšróÖîUYb(mS½€…øµ¥ÁÓù×çò#–nsÓ¥å%‡ó ðQ ‹¶6ÊÑ%ÇÝ;©ý«Å’7‘œÐ°Wêi'Ü£Žì7c£v¨Ÿ Ó:ÎÜ’Þ/&èÜu«2®0Fƒ [Ÿz[ÿbª/zSÍiäîiŒüH÷¤c9Ty9‘üT¯{Y’döRÞáwóOtÏ ñw¥å —CžÝ¯û|å…XA–c}ùe•bÔNší­ëñøöôGŠ6k•òÈóÙ–oÏŸA…âH»õe ^š¨¬‡l ¬ðQé'›/H kŸõ{wm>Ãh!žÁ-Ínp×D;Ç«~š¤Ž£b„úNÄ”ÛÎÉí>x¿Ù„ˆµ²óÜŸ1Údzîý¹f¾<¹ÍFY í©y]_‰[¨Gd‚2YÉ*óÓ÷ž'‡Ú™ö4_9šß¹˜& H= O»ºA•èÐ#Ðê§U‚-u?R˜¾ð N·ýpý}þ!nznûü|iî—ÙþÀŠãîŒÒ”³.#ð¼¥ß}õÎ †Wsž×ÞRç·I\ÆžÿlnÑ6YªþÈ^·—éÓLHƒ4<}¼‘ÿˆbÅ­èöÅL9+zìqÕ…C£‡$Ï€áþ•WaBuLA_1˨SUðöÇÁÌ‹;˜m쀋Ôc¦Æ^!þ êÁá‰"ÞÂÔ{tþP ýýÛ¹‘#º¹F‚8[³3(¿Ñ±Íq i¡ËÖ[޽钉ØFÍÜ£yÓ«Mã)ýƒº{—Û¤Ÿ¢Z‘Èmü› eq¥«hân‹ _Ê›ìóª]ïmÊŸKé/<%¾éDðèœÞãêFê¡Àní}õ Ž˜¦Z¶¹Æ5Øüü¦+³¸¡RÃìÞá zùBž/tåÎjÖq4$“üòŒŽ(uCc¶DªIFx±Ï EãY}'MbÏ¿–¸PÞ;Qœ½RÊv¿¯ÿåÒ.~´¾ZËMø«‘zCàHœmzÐûæ…™ºøw1‚8œ±Îމwpç^ [rS÷È^}‘»Q'Ñ®s¹JåÌøQ>iñ³Cäëp‘^s³UÓ |«ï5åFn©ï NávìŒ=}TWB‘)V?* íXÅqM=9â Íšð®È—{+’ÒÞqz.转¿uáNEC“a¤æ±ˆèJEâl-ööf¥§E%[¶=hŒu=7Ï6 ·Á7žšÜf¶z»ËB¯(óù¹?[¼“Î\+dA[•²„ïD­_Á`_¿$ïµL?ôÊ`ÍݧÁ°Î*јG½Ê!mùÂiº%jÁ|‰õeŒJó°•Øüd”Ó€ØÛøcÅ}=·[[%G&F ƒ7´ ÷pŒÜNno„Å'%?Ùy"$ ŸI)B±.ÒŒ6ªIÖ½|ÏÊðµŸádCz\ÔAKfKãÑ||íâÅ–È/A½ò_OÑC+íËÿ’A­±ß2u"FT®ïÊ|‚Õ*¨ÂI䧨©ÊPCzì]¦cJ‘ ‚X—ÖTv§ÂR¢‹Sïzû&ä­B£€çmÓq²r—¥{gRÆrÍ·Þ‘&ˆ¯íTIê >$—cÙkiJ¬Å )‡­â¥–ï®fFŠUŧ… 5¸Ün &Üð¥sS²CΗ¯“6¹q¡5Iœ­©n… Î-ü.n¯¬YùV>óê}9íç ¹›ïo:à§µýQ{2'*@¸úf@l_Ns-ÖïN¶Õ{Žæœ3$'‚©½c*ãÅÑÙ’MÏÄKï퇩`9ðá:Ó2®š^i¿G?ïò™‹·R+BË}(˜üJ½QÉë1‹æKeT3³Õqº¤ƒ›÷aNÊH4N˰¨Õ‚sQÓƒg}Sâ5À½’õ‘jò½fW{†Ž.8üÛªî•qdqíð ¢W6SCì°åZg·Å4t¼6j¼ì=ïüÉó±GÌN÷ù[òJ=‹dñï‹©P†‹Ý&5O­°Ï¹Ÿ–Rõ|Ð8³h3x³Óð©–ÇÖbáíÎ.zŠÌq\êReD&ërFßÈCÀiïB´ÛKŒOWŒÒ“L޼4®2…k—þh}T÷n’Ï’ËlCî6£÷«1`ý›_†¶½g°ò¾ ŸŸÀ½¸Sb\¶]ÎØvûð´ÀHmN„’³Êï *‚Fx`iø*YÃøÆŸcQÀà3+cÏh—FÆ''°À#Á’Ñ}ۃǧ¯pç fmv©ç®€7>O u|¸,8˜ÐÅŽEåºà ±ù±'_Y_OB¥î‡šyÖÆ@7âçX/*)§D+ø&WEnœ0–.´ù$T£Í'Ú’˜B3Ð…A‡/ÃW™Y›À¦IÙ¢ÃþÖ|Ý'$³zfÌ}-±.oÜä^®`påáÚXà€É87ñã^4Ù!Œ:­¨[ë@mѯúú{^kŽ·÷b±¨>¦O7ú—$ C÷°Ÿw9’â(†øÎºh,Ým5äê—‘zåk¸Ø¥?V“cw+¯§OfaýK•rspå×»RŽ5(ƒdµñÝÆçË÷ž}¾pÃU=·hù2UæÍ†'¯‰mìž»Ú2[S”§}[íê®{é §rr®z|°Oóá¦`4ÂW¥S\ØóºÁJÛj”N~µÙ‡ø>ÿ7ø?a@¤€:“æG ‡ü c:Áx endstream endobj 1226 0 obj << /Type /Font /Subtype /Type1 /Encoding 2438 0 R /FirstChar 44 /LastChar 57 /Widths 2439 0 R /BaseFont /LXSTGD+CMR9 /FontDescriptor 1224 0 R >> endobj 1224 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /LXSTGD+CMR9 /ItalicAngle 0 /StemV 74 /XHeight 431 /FontBBox [-39 -250 1036 750] /Flags 4 /CharSet (/comma/zero/one/two/three/four/five/six/seven/eight/nine) /FontFile 1225 0 R >> endobj 2439 0 obj [285 0 0 0 514 514 514 514 514 514 514 514 514 514 ] endobj 2438 0 obj << /Type /Encoding /Differences [ 0 /.notdef 44/comma 45/.notdef 48/zero/one/two/three/four/five/six/seven/eight/nine 58/.notdef] >> endobj 1221 0 obj << /Length1 750 /Length2 984 /Length3 532 /Length 1532 /Filter /FlateDecode >> stream xÚí’{8TiÇKIFŠ.J.½È³„¹ÐÐPÚ—iK¹µuÌ9ÃÉÌ9ã̌Ƶ6"·í*FIÛu%I)¥Ð¢Pj´aKQ$ºŠ=´==«?wÿÚgÏùçýý~ß÷û~Î÷=Æ^lBœqLbÁ 2l—ëÂä’N§;$AqÌ’ ¶€ÁbYƒ•R°´t[¦•-“I1¸(‚@ƒC$ÀÄÁtTdØB„@y¸$’l>·a©èË(!Ä$0Ã4$$Œc‚#| Í 'OCH–k¼¹³T pƒ„£ö£A}3†„¨ â/.I%¸8ŒØxéZä3Q©püÔE P  À‚±˜J_ü¹ŠQ{ ^àC12ÖG0x< ßããçì¼ÚìóÅŽÍ< “xGˆ@ÿ*«_k2"•:•NgBòý²Z7î,'Œ‡Ã( ,™Ö"(‚B'­,™LÅ(#2€ÈH`Ã%ä@ø8A½Uæ@‘ƒÃ£}Ê·ßÁáà²( K°°d’Æt&°aÒcþ&äI Á$c¿ ™Æ—š’"ˆ áQ-8Ï.~cÆ…„ÜX§# '•MźòñueÛŠävÔî6»™MDñ-oD¿_s›æF4Ocß ×|Ìgvh_`GWGyѶÝÓ¬VŸmús–—J/¯;𥚜ªŠÂ줧Š¢b³ÞV£Áöð2å‚U] ›ÃÚ/’'çÞmùô:6ts}‡B-6z¼².§tU:²æYûÎÚ=+ð#¸âXÍÜÀ¬ÁYà 튡¿«ËY)9ÜIÍòeCªtSÿz cè…ïAÖJ/Û©ºÖ-ƒ7Ö¿pϺžß©?ùýçSßëþ»ËÌ„÷·î¯§]¶°a>g ;A£Fo;µsO[ºQÎðå³vî/ß9ñ¢]UHÙþEÓÑÜë×Ô 9—ûÔß9«ºJóЊ áÔò.=%ŠÉ¹rÃF×ç§ÞÍØàNëÅæ Å”ÄýëšäXßÂÈnÝCySGl¸ò>áŠsxº÷Åá;7t6íªe'ë=è½?M‡“·•ë¯>2}Æœ3ņ§»7$ùêÿvÜÅÑgõÄn­·yja±³S¢2ïÝÿ$žæ¹'Öqº•VÙpD…U2ÔÐ_Ä‘ož4¸õêGwG9¯!ŸVÐfU²lÓ¥ÜÛí‰i­C‡š_+©÷631€«3*.?šWí¡{xƧFæIõsÍçQýÒæ®s|–\˜õ´ÞÏ×=ý\Ò<û‡:žƒ‹–]öŠ;¶Æ_ÛZ/ ÷H=Y¯yßûyù5f¸ºR3³X×Ï^ñ!k«©­ÇãÝ*–Ÿ­0>4•e¦–Ã5ïFUµè ‚ŽT¥Ë‹zÎÔ‰j]KûU:”pA¤vÿ©‘¶¸_Ov¹{eÄ,Ýô‰¢Éh‹Ri…Ï¥ ôlÜêÇá)A:‰ÙëŸg7ùëK³°˜J3=-Kë4Õ\«Ý8Þ]x¶øa¹ƒ[Ü”žwü#.´Ì.ÊÈÑÈL©Æšm×;1ï¶¼ã|ša¯¬ÞXR±4“ë!ܹֆ.t_϶œãRªÖÀþøZÙJE+aËbf×uG¿U|vª»ñÌJà[xSÿ¨@ƪzD¼©ÛpÚ|@ØøŠ~Þ²í§zŽ8MèœqÐ4õ 7i´+6}>J±¯ƒŠ¸m}¥†-ßE«žR-»2tà^Jk׋¤Z‡ùï+»¿v¯ëÓîÚåÏ&õdL‰|[Ps´ëT¶&ý>”ÿ þ<\¡”?jÕAß endstream endobj 1222 0 obj << /Type /Font /Subtype /Type1 /Encoding 2440 0 R /FirstChar 58 /LastChar 58 /Widths 2441 0 R /BaseFont /BUYFFQ+CMMI9 /FontDescriptor 1220 0 R >> endobj 1220 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /BUYFFQ+CMMI9 /ItalicAngle -14.04 /StemV 74 /XHeight 431 /FontBBox [-29 -250 1075 750] /Flags 4 /CharSet (/period) /FontFile 1221 0 R >> endobj 2441 0 obj [285 ] endobj 2440 0 obj << /Type /Encoding /Differences [ 0 /.notdef 58/period 59/.notdef] >> endobj 683 0 obj << /Length1 900 /Length2 2416 /Length3 532 /Length 3035 /Filter /FlateDecode >> stream xÚíSi<”ý- ‘µÒâ)KÖÙ0*ÌÊKÞF–JL33ÌÂ,–¬eì²%ÙR-Èš„pì)¥²kQ–VYΨ·S§÷ã9ŸÎï<Ï—çºîëý¯ß}ßâ.+¼†‰qÄ1èl 0ÖÖ$€€Â!ŠŠ&H`St, ¢„ž0â¸H8€@¡µ´ÑZ(ˆ"€a¸û0).d6 ŒQYéF4I!è€Mi<" àD ÈöFT*pxõ 8 ²@¦'H‚B€D!²“  …­&:@wf:ßiÇýGÉd²x¡e^H€‘Ä S}è Y2xw¼$ÿP¿›ã8Tª%¶jÿ­K«hªÏ_ ÍÙ€ƒ2é¿KmÁïá,@…Cû½z€M RˆFt*À¿SŽâ ’¬(l"`39à7¤“~ÏÀëÛ·°ƒfV¸?ŒÔþè·¢Bg[û¸ÿËuUý #~b^{˜oà ‡#xBÞûãËá·ËLèD‰Bçm„6 0™o5xHðE: ô@o^`”Î`󎼞øÎ &dužZ(æÎ ƒ´Ê£PpFY¬Ÿ€¹¬®!¯•?8/ üjò4¿@mFùê0ÚOÈÛ3㨠À<<±×OˆÔ`' ßoþ{ŸÞ¾@©©hó´(=mÿ“9L&HgÛ`Þ¬~`g o° è !½= ¢~ˆkJYXA€In×µuª|Æ.åq–%µÝw…ƒŸÅóQó[Í=T‹í¸é’¢ë&ä¼·±"«ýþìÀ½;í—údyÂÓi"ýTå6»¹t Ÿq÷ÝŸ‚_‹Ý){üþ6ß¡GƒmIöygš^g[)c­'7<ßµ¦î˜çíº !(;\:õHxh±’æ®Ã›R= "´Â¼6%%¬xà.X¡Ö?˨æH,ä f%.; :lœ–%Wøª©Ø 3áÑæÇg$°fj EûñEU>ËŽ„ÈC.j2µn£Š;õÛì/,ˆ:}}bgŠwïI,°WLWJ«¢§<0Ä‹‰47&b†M†¤Æã”¿H’-Õ5T˜èxñ*ý³@$Ò)K;úIQ?Þ¶‘{jPåAt•P“sè‹4k>úÂ’¬í0a\#û¶”fónÂX OšÿGDÕ-§ÎÊqŠ-©/»†tKUG6Û¹„ï|Z#½‘;hs.ZqÅçÕM¡ÂãÙ* R6jAä!?O™¤Y„ë—}š+Â09Å=Ú/ùvJº­›|ªF$z΢í^Z¸)ÿ´¢šK ¡_I²w{èÀ"̤ñpUr€‘̉‡Œ7 £ª Ý%¯ƒpÏtZ`C³óÂïŽçÚq s ޶öÜshŒºÿ@¨JUWe‡I^ãlõAF­h[g–9ÿ¾;˜]Yn“Šì‚•ýäpD~KUúªrßófÉÐWò™kOÄ¢Ü;ú3'º\Àó-óE¡L Zb,¬l<çs!vïý(ºý-ÜMT‡5ÞŸ~h>FÍæùÇSzÅM˜¾)2ø§¿ƒ€G[x 9ؤ£ AÛÆ©§GL—õ“YHµÚàpi«mL“³$¾]®QâÉÅ•SíÝÿa`R+2 Ô?ÿëÌ)_çÿ‚s /5ܳ’câî¼xœzìß+h åÈ«ÀÆH¢\11N°âêÉqŠ·w_¥ED°®«¿ÙscøáÑ+˜ ‰½¹µ™!J ‘aÀº;™Á~àxžYçjn5§'¾?¨b-ærF@?»˜šy© )èBM²±è!“·3ÊóÜ+No,ø:5TÝŠ­Tl9›lÓ›°@CYÍ[*]yE¥ðZËâlºôʇ•â§3‡ÅfÐ}'K[,M"Š ½â¸Ôfþð@CŠÖ “Ú°Ó½ÍòþÛ&O/.#Q'z 7;ÔxwYÃömœ‹‹¢ „ª!ê¼ZS ÇH"GfEnqk3J>1ö"Jæo«³ÏòçË Ý4R½fYé´~7ôâ­}Yká=²yð3ƒÝE¡´/ÈX`ò>¡zÔøÒ#•û ¯ *V<ÕöñS]˜¾¼ô°ÑE¶:J4ÜY«s nH:~貟§ª9äqæðÙ|l5uûmå/?ˆ8ªt Џ¶c{\ûdY9ëI{ˆFœHD–r^¼°BpbÜeLréã×Õk¶÷ Pgé’æþMzh¬«Ðá¨ûÜÊ‚WÆM¹C£“¤…ÎB„–ÿ3ÄØ«a÷±ƒm êe­caæÉrr×ĺš©!›gõ·žÜ_a0eóxöpW¨[Ïôþ:©/»‚ö5äUБëÐ{F8ßþ¾\%í^¿eJ_XÃRKÓ×-Û9¶ì…6x;˜æÙDí4Úÿ¤„¿Ñ/p Ú é_µwôÙKç ºdŒ)Ž=á\j1}gô–%ܸwç5´oÓŸ{)g“9[$®nºzi:es¹Z*éùÚµn@¨”–ºÑ+E¢ kƒâvãÄzãéni+#ÿ°UÆÏûiá>mwißê'¸ÃÞÍ}þ½Šþþ=uOò›šZv9wš»¨è$}„{p·ÍÖ[\×a™® j rĸ yëÔ’F •)ÆQ‹^£5 uÙ› Ÿ”ÜZß™ »uß5£Ñ¢ªôʲã:† ’¯ßvêGÌÜI‘ÓC=Rõ9¦9›,cÕñB9šz‹ØM;Øä;ˆ_œ˜ÐôzÏ¥EÁ'.®yUÂI„\œ×¿I D=X’RÛ<îbo.ºRœüæ-UÚ3§p+a67­É˜äŠmzk b¦ 1qá¯CÒôØö—‹< N…­‰ ‚ò~Ùô†£ ü—j#—H“ì¨ÀðKI¹(Ýüüb9»$Tøøú‘«¥ó)´h­PÃÍò2Õ„˜ÙN»ÖtóS¹Ô¨kK¯úŠœTÍ× n3u{St.û©¹áîÔ¤r_Ùê霹?tf{œe¿xÈSûñjÁ”M×[Û^—MÀùû°Ü—9j]ÓÌì>ÙµÇ~ÎÉŽˆÅ l–]W¥Ë'ä]޲NX V,<´KÍ/Õ3}p:õî€Ô‡±¯\ãsÕâ3ùþ-}IRäȹø÷þ„'Wò뇃HþÝ—;2£FBØ3ÈÃK¶Š•­’ú“ƒY:Rˆâå—Žµ¥Ä.Ó©5õ“Y){T=´n®´n33½6"£Tí8¿¸|!†ý‡žìÑò„âsMÙï%v îŒ6+Ë$‹˜ÜÛ=¯Mf,©mn8ãu»¿ƒPøÇ•¢ê šÁW¬ÃßXòp¾€üe×¾ÝûÞD¡û©1_6¿Rj1ÇYäBBÜ€gôζ3¸®´ü¯vÈÍåÈ–\yqë½Y'-ú´b«kORÓ­—ž†¾YB¾«4Ȳ5"ëe ðÛï!Keùí%²Ay¾kùýT47aœXK›ôN:™ì¨öÁÉá8·ÖÚK\×÷F½Õ‰!ì ™«Ã*âØúgwNœkÇDa^i¼ZŠdZÒºÐëåe6²ƒîDú‹•¶nã ’–V=+ªmÎÈ7îÓóF§7~~w©”k.vû©!”oÊ8CܞЄ  t4ÅØhOb,SEûÄ*庶=™âi[ø¨úç’žÈDI«ÑÉÚSšóÈþzÜHƒ_ úÎÙÈŠ–ûœ«|"\£pÿ „†1ÎQ:´j4êÔVpý=ü?| ÿ7øŸ0 RA“Í ˜n‘ :L endstream endobj 684 0 obj << /Type /Font /Subtype /Type1 /Encoding 2442 0 R /FirstChar 46 /LastChar 124 /Widths 2443 0 R /BaseFont /JHPFLA+CMTT12 /FontDescriptor 682 0 R >> endobj 682 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /JHPFLA+CMTT12 /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [-1 -234 524 695] /Flags 4 /CharSet (/period/less/greater/e/g/i/m/o/v/w/bar) /FontFile 683 0 R >> endobj 2443 0 obj [515 0 0 0 0 0 0 0 0 0 0 0 0 0 515 0 515 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 515 0 515 0 515 0 0 0 515 0 515 0 0 0 0 0 0 515 515 0 0 0 0 515 ] endobj 2442 0 obj << /Type /Encoding /Differences [ 0 /.notdef 46/period 47/.notdef 60/less 61/.notdef 62/greater 63/.notdef 101/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 109/m 110/.notdef 111/o 112/.notdef 118/v/w 120/.notdef 124/bar 125/.notdef] >> endobj 454 0 obj << /Length1 747 /Length2 1091 /Length3 532 /Length 1634 /Filter /FlateDecode >> stream xÚíRiXSW¦ qÔ°ˆØaðF&Òl°Ç<€a©!¤@Se¿$‡p!÷Þxs‘„N-(Bé^¶ÑâF,X7M4VŠb«bÙâD@Å(X«ZÂãB<6—Æd&[ “@ñüýyP`¦ ò¢ê>Bo!ŸOcBÁ¸FO ª4rö˜ùB( ŒA0™PŠC«¡h\RφÕj(j憊Z@lJ6ǃ”ˆ‚„R€ ÁhœMáX*ù>O+35/J›¡¥DAî”Hˆ’¨Ä1µR‚TGŠS½¥äÿ!êeòLµZ £3ô¿øô Fµþ Žj2I@@¸ØËÐwÀsyA¸ú•Fá$¬F˜J –?›ïólöÔá ml’Ê®Å$oÎýÇ­\¸Ëßï®`å¶’¥O'N=Ï×pØ×;/õf¦ªmy¬­ofe‡ƒ¿ÝÑ]óOZÌkf˜Ÿù­ùêÛöšþò9Ûo"659jVG>{ 6ˤ[âQÛ†LzÔå«Yo‚Ñ=®ÙqŸgMÀgÿ¼½«høW™›ûÒ/?q°žfôz|ƬxçÁàë){ç…C9ÁS .§KÎô^X0"¾m[é¸jžÃ¿Ùß÷¼Ç_'1ª³¦×®|l•°¸ìï+šëÆü­.Ð E4L “E«Ø™ØJ+Î (©éŠø!…/4lyûb‘|%‚‡Q×þPä{½¥|Qßé ÐÖ1Ó}?o 1m¸Q¤>n¾ÉI*~ýQ¡¡ûä¡pyãµê2¦ƒ~ÌÑ^v³X üf€3›+aÌs^aµ»áûn}s:Úrp‹Ì¾´Õþ³.7é²U‡t]gn8·At=t ÖÀ )½‰–m÷¿é¶*HÏ>> endobj 453 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /LZLOOV+CMBXSL10 /ItalicAngle -9.46 /StemV 120 /XHeight 444 /FontBBox [-75 -250 1278 750] /Flags 4 /CharSet (/N) /FontFile 454 0 R >> endobj 2445 0 obj [900 ] endobj 2444 0 obj << /Type /Encoding /Differences [ 0 /.notdef 78/N 79/.notdef] >> endobj 213 0 obj << /Length1 1488 /Length2 8168 /Length3 532 /Length 9046 /Filter /FlateDecode >> stream xÚí–e\TmÛîén¤†înénne`º¥»[º$””niI )))i$Þñyö{ë~Þ{Ú¿=óeþçu®ã8Ö¹®µf1Ñ=×ã’Á¬ÀJ0G7.>n¾gyM9>^7/“¼ è9*ÝÀÏ|bb|Yw[?|]ø™€à3a,&€<ÌÉÛbkç`•gûÝ$u»@¬ŽM ›Ø®a „ô`Ö°›77@ èþ>  v»x€AÜX||ÄÚ `¶…8bñü¤êhˆü» rwúï%°‹+<€’ ‚9B½ °  î†'ù¿ê?ŕܡP- ÃoùßCúË@Ôû5ÀœÜÝÀ.MìâøŸ­Fàg“ƒAÿ‡‹ª ±–u´…‚¼ÿ.A\• ^`Ðsˆ›µÀuÿ«výgøÔþ€GG]SOY‘ãßWó_kÏG7}o§T7ÿ‹ùþ0|6./€/7//¼þýï_ÿá¥èh AáÛAHtqzcÁ÷œ„¾|ˆ#ì{Áóp;ÂÜà‡ày °¹`ý¾˜|üÈïÚ¿QŽÐ?(àZÃ'øO…_Àc A Pà?5!£»ƒÕï aëøOYðw+ÌÁáO£ ¼ÑÎÛÉüW“0€Ç ¾#` ?%¸)Ìñ¥\Ç>Xô·.öGD®+û‡à’rHÀ#ÿ‡àÇ*ü!¸“â?$ àQúC|å?Ÿ‹ê‚kjþ!¸¦Ö‚kjÿC¢pÍ箢÷‡àç¥ÿ‡à© ÿ!øÂógnbp«?w°þs‰xá ¿žüÂ-mÿB¸§Ý_Ü_ŸîjÿÂmÿÚ ¼p_‡?ßÐ<Ž!ÜöÂ÷•Ó_÷uù á¾®!üÜÝþBx ÷¿Ãã/„Çðüƒð§ ×_áýÂcøü…¿ Pпô?oZ99˜—/—0?€‹_ˆ÷÷,ù"B¼¯ÿ·Fkw°£Û¿‡ð[ÿ¿ÙP€Á^`k¬¥˜µxè«7Íá•þŠÅŸªPÙål[µÞ÷Ìvb‡,&!BËFÕÙ×ÞßVgãí¢îÒzÞQ¹FwøéL(9'fÌ?ìzXîfù´QŸgizï8Ñ_‡â·7Ï] !jϬU¦š” æž>gUÐßCÿB‡ÐkæÑØ›*,b¬”5ˆ{Ç,@§Ká\)±êIšŒ²:âÿ*£•cå ÖáNt[ŒQòðáÆ-&Æ•2ò³6îò1•tðë¶õF.1¡¾ð­¼½šüæÊ¦IMžZªžÓ Ž;%y/϶æ [in·VGª©$Æz€Á‰‹’Æ7ó]cä\õ[™é=Hj¦*† ’­ª Á诔¼¬¸xâ`¹r§S• ô(šê£/Nžn Ì­59R ~kb¦n¬ÌjYñååâ&J)Òä ãׂ¯DÛ닜°Þ&aç²—v™ åXNx0‰„¿A¼ZpªÞNí+Îì¶S< }û"é™y޾_S¹rðt~<[¿a·ózwΕŸ4Û5óÙkímºÏ¶=Ô3 .JÕQ¾6 S@› ÑÂd­±²îŽg|S“8é1©ÍCYG4ùÝ1t!¾ôŸmš0rƒ¦„*ÐÅÔ`[¤¨3"âô¸Äø RÂ=Š çMs˰Bo´k_3®ÛW»Nolw¢µû­î\2_ŒK`˜eçV«ñ¼SYP¡>?w³Ö)­ÒüÂwA]G™°%kq²Ü£vH ¼ÌÁŒ ZÒÝxå£ Z¸Òéx(ãÆ¹ïu9*訆¶Í a¬<[U¶íɕ͉«v\×.¬â|6ʺ…éò¾»ä§%n(ÜH´ž¤˜ï ï~΋ ¼Ü7÷¸Mq£qu·æÊ­w/À¾rÌmÏ Ñ£šÄU¢*¾¤Ô«?¹±‘>”™Ä÷@Cù)ÉõÃ]¹®’ßÿF¼`?Äé¨ÈSÀ³·sy[¥ë«h[¥]³—‘„Õ§‹™nódëz}ÁÔ¤\z±Æ¢­*èÛwüwF,˜W`ÕÒNw\¦œîKG.ÚZÞð *F™ðÞUqÉ•Aß¾¿úoöÌžpÒ5VIXN.ÿSm4i„q@-ÉùȺŒÑµL2…1D«èÆÕÊtÂÍ{(!²_Á¬h~¤WšœhÝ¿ìÖAi üâIX™\ß'Ñ¥´Ï K³'³ÝŠôyÆlßÍ3êó¿½ÏuRGxÚñìÏG0TO=ć²¿Qp)‘¸ØSÃ1‘Yân<ãó¥ì_ƨֶ·/|ÊS<‚k0 Ã>ÑNs¥çË£†Ù¯ñi‹£FëB /Ë|4›[î`ºÁ„_•˜EÞAó¯ -L';D œ¶{Í_ÀwÚ'_@K£gE[š­h NÑG•Wû ñÆW©lJ¶ê7Šw¡ÞSÕåî´”§Uµ7zŸŽR-Gb*4\+Öy¼‘a>o²òYÆ_´Ôûyv…h~€±?^š¡þ¨Ôç)Gù®öKºxC¯¤µr›Máwåm/ïÚ±@Ögúî’‹³Ë2Ö̽Y×.üû«=À^˜däÃqÍ[ÎQ¼ <Òp›C3wÉeÅ¥Â4»uô¸qiCEn¥j\ü¡ó2šw·ó’÷>4êãoH%½t¬A‰ùª²¹~dº´fÊœ¬(ýG¡µÊl ØüÒï¬]LÛ× óŠ’ÉZ•†°T®oÌÑ—)!8ÉYVÑ;ÜÂx©÷š©¹ª³kÓtD2ÉMBö⬮Å$n+¯Ð÷——ˆësqët[Óa©SD²â™›£®¸¥}¼]B‘üõÑÊÒkfg‘vòL‹Î:½î‚DZxù%ÖuÍç´ÍQk Í:¼ÏôNŒU^°Üy,ù}=*[U6Úîo/üÐèÀ c=3‹Ýïu³$DòVp2[zR…‡½ýb^}†6î̓æÄâÛgûçàÄt4î3½âѽþ©!ÅøYRù”M1“35zÛ©“¹ÄN ú•¬Ø o¢4oŸv˜R;׺3jÜ µRVoˆJQ¤ oŒÏgÿØ—=¦§cŸŸ’6è¬p–~åœÌ¶Â®Qî‹*Ýnpæ¦N©{93Øh úúaÝŸ#NÈ:ù>ÊÙ“¾ï¹òNaêìê»찒ráøÏ =Ö¾ʧRƒ’èó$±fÜB·®: Âw;IsU-§×gaOýÊëñoÐ[y½ßqnÝ5YPÑ-¸÷ŸkþjùnØ_FY´_±mØ·ÌÕ859½Hú6 o:ïØÉ:¤¢ô[X}þ†(4 cȼž£Éæ`Û与àlL6Ïâ÷á`ÿáGN0³.g~ÃCõæ‘gõ1MAI¼ÀÛ¬¨SÕí%'ß× Þ£Ž\”V"²1€XÞ Ù‰gœ‚©2—ë$)ÑÚ[öžIͪ/kâoU@/òÕHÎ?É×g·†:í|+€ú¤Ép ,ÑŬ"spS¸ûx¬îØ¢šÔ³ÃrCDå.Vœ¥ÍYMÚBTEì¬pè ø «InlL†Ÿì”ã8§tìRöÀ²WLïJžÒû'ÝXbyI™˜æÓÍÅ6 å'}™L3Ñ?¹ó”Æ-ª—D)µÊY§Ô”Jéî¡8xŸŸ!ÕDÒ¿~Ï85YÚßµ uþ"²êªùérë‘Ä“šd9´D—V+8qk·7WñêÓ𜗄óqr6j6ÁêÞ´)°óL§1Ž”ËùòËGIø?¹Ò F¶KWÛ-s‚$‘Bþõrš§Ø…p?=•Ê[÷¥Zå\òžá.¼˜}'šëŒÙ“—¼ÚS¢?MÑg‚‹ù/‚n{³>O—Eѹ _ÛúZh´ƒRj—N…e °áïEuXÅɘE­ïñÑßeõaõ_$h—ÚªÖ†4î*_''™û—í{žv9rÎéÓÙa˜R®òfu|YÐ\<†ÈïwÈ×f P_.‰l ˆðÖ¬È+,+˜/ÇÎÏG½<À᫳ÃüA_|!Ÿ©•qcŒÓÒ×ÓU)치×`S¥ÌMt:/d>R'‡`6±ýùV2ìùÈ„‚îáXÁÞG $Ÿ¿ˆÄ¾bw‰ÛÕ,?¯Ë7¾Þž8yå˜*â²Ý&ÔülXxõû÷3ÇŸ eYœhnÆ ¸f>DÒÊSË¢5ÅjŠŸ$»0eå_sT¶uJ%÷10 ,1œ#ÚÅêl)ÉÂû{J×Vн¬(?fwWqÒe g)Tl_P^× ×.† Q;=¯’!Ø 0ËÀÓ•"[3g6©çøÙ¬‰Š½–Ÿçs¸üaú½Ÿh Å~‰º™m¤`þåDèUŠ[QËÆ1h oòûE¹ÖC¦£‹bpd(†éýX9‰µhH®ûMrbù›¥s!+b4ØTx“ò($kqS­1À7¯ò=kÂQ©¦ó¯Ø;áµV<ƒ!¤Â†§Š3îùž9$…´ˆ¼¬Ó.1]׎¸n§‡´•3ÏM+µ]a½ÙÃ$àq>ÞyT¶H@Èç! 3¹ êWôu¼0z“à\ÑÅÁ3‘~½¡áJªZÒUýtÌN¥£Áõ±{Î0õëïûÝ:f¤Æ•#Ú0Å £hÿ{åüÙŠ–Ž\ãÄ…W´‡…D^ŸÂìPŒ”‹'Þ)&ább.2¾j[1s>˜¾”³“s8²mãÝ—YDå£8Ò–°*¿­¾µEÏ„q«F|¯=ɵܨ Z«jBYO%*”7Õrµ¶®vmÍåyç’¸„?¥‰ˆh‚L… -q5þiðmÖ±|Å¢‹_5ñnÆî‰±çkýŒ¹¢Ú²Žs<¥X¬…Ó[£³ËJK@ÞCà›>9Lú=‰ÇåIJ•Ù^° n¼‹®œñò¡ç`éˆiÉåÌ#›q<Š9gc(²:ø¨ÈÏ`Mçrwh׬}Íìɯµ‘ùÉL4|fuJþSQ´'1ï5‹ |ú#ú‹£x¼•<æsTƯs·0ÛFéW¬x<_ú¸Ëý)aô~öÅáû–²Wº¨4ÀK„ѾEÅí³—õ˜›ÃnŠ ÷Õ8lªµI"(:7KØÛ³¡‡¢üRµ.úéÑÈÞ Ù.ýŸ«Šô¦÷÷t ø5fX—TîòKkƒ¡xs&Ã(\06·×smø!Åsú$æA±HUe޳Q~Ý@iß<»¦aZfT:H!Éøz8œ ­òmäýHµ3]pc÷¸I‘5†Ñò°HT³©ÜoÃ’S–=2hùâ ~u>åžH!lpáõlØJ;Œ$Ážz?ÉoމõêJ¿7ù›n7ú…H”8õŒw(=´@ócGðœ]OtHãDà2EÏ Ki€Ž9×í¬h¤l¥›GÄI)LðK¸‡,Wò¯ÓÔK]¥¬«˜BñqqZÛÓqÇöäIÝŠsNLÕ Ö N“¤±Lf éýoª´.³l´·(µ%¦.W‰R f/h‹}/}R[ŠreÒ ÚñÙ:–lÚt("…ï]àÁv{”Ƈܷvë…áÅí“ó±¦:ß é"óÕ"vÿ¸5IeèR®‘®Mrõ,ú­õ%jàãRüç é§’ó’¶Y±3òéŽP”åâ`wŒ/`\ìêL´2*ZÊÇ@êƒÂ +ÁÎMEšîW¾“×_I„•+‚¹º+3¹ôÎͳAIÆ*6ÛÞee\!SZ &/Ó8“‚bÎJvú=xj¨È+q*´Öfe³¾ö<äøIé=×íÛ:ÛY¿€O#g¼µszàG–sÜf=ÊûI`õˆÞmŠñMv4¹€Ó@Â"î/LÑ £Â?gã×.OŒþP›`RÞùa vׇ&£\0Úg½®Ù¼¨òØå§šK‹úùUCªíz“Ü’Tæ=MS<"eÄ=9FSÅJ‡—…ÏÙ¢n¼Ô«"2æÎ^|sm»z&Išè±Qý°ÉŒ‘^ãAoÈò#’×Ë+.Õ"g e^Ògãø¤¢1ɯ©V®×·Èwõû:\¶DX14ÒŸ<.‘à†½õÅ’5_’wsãø¸¡¿É#(ãî°®jFš.ô­„ ë.aB,èõk9+%ˆÌwD¾Ÿº8RÌ5t!Ÿµ7S¡wCi;‘¯Ë°þŠ G;º£pxwçüe??{°d÷÷šÁ“cÄD*ZÄ¥:RüÕkÚ±bbx…•dù´¸(©µ¹\,…‹ôxP¦m#À/¿¿ ŸußȃõCoŤ‹ÃVØJ÷JŸ|²>¤_3ÀCPh`ÓûùÙ…ÖõmùÌ€7«´©^ áØ1^ã°ýʉª û<)J™ 23×aŸQì•§ÇÛ­t­èìlå'o-xk©Œ¼žüÔ#zAN˜­F‡Ði7v‹Ðœ'<]Â×î+ÄÛý³ì{µ>”½.kg/ËôçûO-–ñ%…¶æªK6|{lú lmZÊ˦$# Ö[Ii¾¶þš’±T–¬>ªq ¤²„*oîÉÌDýUK5¢å¶åóUæØ¯Mob›«‹›¿jE7 °“õT''W÷qòÝß\Ýë0JqØÑÒ„% ,±åJP4Фvóf]ÊŸ°ì)Ù)·Fº!D» $“ ðëq K|ñ£Ó6#5PÃé‹§õÊÎÛtWOÀ)´ ,hÞL˜H˜úe30}ºô¾ê+Èý> (/n>?[iBT’üæb–’îzÿ‰˜¦)A4Ñ' ÖÏþ%/:y¥§²kö«†„.;»ž±YæS±¶arz#æ‡3–¯’hÊ}R&L#Ó!¢z«È,/ÌP?¨Áè©C¦ÞgÏ0¾çt1?¼ã*‹?â.JÞ(D@Ý6á·øJò dÁŸ¥¸"N¿ÜŽ·t–é]\áঠdÅÒ¶¨ÿ@_o%õø è‘ó-k&“â7UV=K1fä$Õ^œˆ¥ü |%xt9ÙUxÕÌ4 œ}6ªÍ\/ì„áY¥U[%É ôÙä¦ãà['ÏåÊ©mì¦_–yáFóqÜþfb%_RÌ™×õúÆÞ_h]ÍO„O›{ð’EqÔ¼ uf€tÂ}‘6mÁ ärбX'@”¸¿Nµ)Ñ£®CTÇkËÌÆ)¤/_É„7²]ÜÛÅQo͵*=«(+ªmóÁë¸< YÒ™xYÌ<âEýóT$ò¢Ý¢¤ÍɧРCÓxdºb¬ö¯*!\%ŠÐ.÷–f™â’t ÞJùWÉv5‰{jÑÏvuÝùTY?ôAüãų‰«FO%’€ÞP£u<Å[±gŒg§*-ûڜͱñÊ•˜'¢þ›÷ 4H"é=S}+æZÀŒg¸@Å4ŽÏ_Òª¿Xc†îí´–“.!Yîû&•”+7Z¨Êz'¾¬ÍK "ª#1Ëh?\Þ˜›êÐÀ0V_ 4 ’Wá'Ô¯WP`[2kñ§µgE H- ³¸¥_QÇH,$¢¡ ÚŒ8U¾yò2)j!êΚþüËXYQ¾óÛCåÑü¦g:4y×5LÐö瘻ó÷âJt yÅÔ8Á [_ß›1ó Æ“á=v{³5ßógãºj9âBwËW˜TWüÞñ¥Ü­„Òªràˆvœ N”|7ÞãͼS²ýDj îØ÷Έn½qxû$q=AªšL_b½4Ô9/C>ª‹ ƒ[»‰4Bw’’“4ynàù)»î/?´6>pøFÓLóH^v3~2:ŽvÞjóúU«S^ƒƒÊ硹̇œÜŒŸ<îìhübJÊÕ£‘SB󤇸C¨¯PP¬š„Ì[óÈ <%L¥\U}p¨û‹Q¹®Vå_þ8¤ŒŽÕ=G¼¦8¡â´;8äiiVpÿÙ“Þ¢(‘–©«+•ÛsÀC§ûíž ý¥8χCÞ½!í X›K i¹¶UV[4Îr{Æ·;„P²û[iY !R<ôÌXï(ag³J‘Ålã@ËfOV(¯Â‡D£‰KþÕ‘I˜üs¿¾ A£jËí²qJAæ‹„8ÝÝú÷O’EÉ1€m,#þ΂ËÏÏX푵©ý_ö`toˆ«eEyL×¹'YÝo¯hT;Uê“]+ö‹Í%}(_!趘¶üH`¯îvþRÒßÈ„å³íˆYúˆÐ`=s5ˆU6ÚÒYñT]¢r'Lá‡JÞå UE—<)Ê_ñ£Ù´RŠŒNPvé&yâÍ í¨6e~±íÕ~ÎAp,ˆ'³džºšó ý=Ÿ¯¶áöhÃ’ƒaæŽÜ)qŸ Ìñ¥@' muްsܵdõ´‹Ü.fÄp[V"hÿ¥^ì ê­.’ÎV¢ÅØ×÷†IÈj#GÍá˜mé¢À"yìp«Çw?ŽÒÓ—¸¾ýYŒ´ætM Ò™>•ÌpVöW礗| ‘DáStX cjî«”"Ö&ÂŽ[öJL¹O·aí?ÁìÐA·<ÝèsÈ_Õªq­ãd¿‘8—oûë&ìÉh°)R61:ñ!LV„®ŽáÈþÉC|nLˆa Ͻ ŸSý6…=ÞÔ‹Óþ¦Öøzâåö¶=$Ÿñ}q:ž¶£PþÈ‘ΑÝœƒœ’Ö‹•í.–»Š˜!Y‡özÕ¢ Qªr¯3oŠpÓé‚à™¾†ìGéUÞIwI¡ÂûÐÎuo1.è¡Æñ€ã¾P+¤Šä#²o<ß9؆€MÞ MT¢+;‡Hî„,ÅJáÍÅe³ˆ€¤à5Ìö$Õ?Š-a¨I!ÑEE.P߇R‹Tt4³œL7>ãØÆün±¥ƒ7+™*ÃîB{^)IiVÊoˆ.QQ››‰û(FxU툦señh—˜/lâa3 Ù•»ÜúbW?xÒâUÞÉÏ@^£Ý’aø¢!qªBÿÄk—0µd…«iZeº=²åÐݘlɼu)E¥`¤‡½KzwÍJ?fžÃ]mu#Sdè=”¾"7$ò¦³Ê…?½ž/…@@Ìó#ÙljoýDÒGOñÍ›ËK&Ar×5Úa^ïø]ÍG‚mJåׄLÖ6„§gÍl­ì@5Ylüqƒ²Æ.†ë×uHÐý„ öU)‡ß„¢ÔýX»d·F¦ôq=;¾KŒ¢X²ŽVI¹Ë1ô%E`8ËÓ KË5á·o£…C˜½ˆè—ý}ì£39žPµi"—‰­åá„©Û Û­™Ûµ_²KÃJÆ+ ©Š^(jã>´Ç²£ê!®â¹ø®ô7hGí§Ë ;? *èéúaÉ^ðwOÚìz¤mè›ÕšÇ)£ÔU¤qìxCë@£p®Š wï.:Br†gÉ飌³[ªuv„žˆr“›Kt‰žR¯»à/Ð÷¿X;­†}2#uÝéPB;Ç¿I\ÉtÉ{1w˜ÕKúcäzÆÞШùT„&B" ¸F‹jé1Îå;¡ÞWŒá·6­c†kÝ_ˆ:ˆ¼p@J•¼:Ï,²xÞ3£Ÿ¶P´-V…CŽxÂw4×2ý\J fŒ8„è[‡“ì«“·ÚìâýÙßaé(lâåÁþ°æ]Óšq‘ðµÊdZëà ›vÇMqß^õ._ï2zøØää=•CG+%ãßZ lQkÿÒ/p+nÌ0ü¤aýR ¢0Ð…pµCd/ÃXi^bHÓðÉÖq„ž`†d “ÓàÚ½‘©„wo¶²¾i3ÚN·=ÙÓÙôÀûݪՆ&éZ¨­ŒV,4Ç¿;yU¶œ4=˜Fwm-h.e‚ò$•SñDXâ™ Ñ%¨:s7Xþtw`rea’©ÌÌu²¸OV i'3hQˆ8XaŠAÃOÍÞì¦óý1•¸ÍýS£hÍó¢$»0-AcÍØAÖB;¾-?¤ƒB¢¥1à_çO .T i†Ñ@"´hî'×9YÃE6¶¨lªù!«†ôúlì÷;$ýæï:Ý£nŠË¤"ò LÞp½};7ÇJ7jý´x‰“1>‡ Ó.'~“‰,²†•½÷›xz¸¯ î(òEã|;Ò §žºsÇá{d›§ëîìhs ŒÞAI]H é*Íxº(åàœsrý\úŒPŽtíã~`}6ÞxÆ:²|¹£‡ÕdžíÜåÚ“3¡ý4ŸÜP䪞€ØGU:0W·_´\–-!”bwù ôã™BáÚPnÎÉQ®Tëi¡"Ru l©òo _jPªãd’4A]Û8?Ò&À^›9-ó–S<Ç0ñ:±-“~ûq€‘G-Ƭ‚ _"ìx³^,‹êóÄàmø'CFîÏëFAAºS;Õ^uÑ…Pæêf…€Ï$Cê­ž 5 ZjF/h/È !´àmã7^=†Æ*ÏHÈd?º ýºf§/þ‘²„(¿ éRœ äuùd>Ųê°TÈ?º‡<—±f÷ÜáÃén6*ïÿáëÿ ü?!` ]Ü`@{¬ÿi|àÜ endstream endobj 214 0 obj << /Type /Font /Subtype /Type1 /Encoding 2446 0 R /FirstChar 12 /LastChar 126 /Widths 2447 0 R /BaseFont /QKMSGE+CMB10 /FontDescriptor 212 0 R >> endobj 212 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /QKMSGE+CMB10 /ItalicAngle 0 /StemV 108 /XHeight 444 /FontBBox [-62 -250 1011 750] /Flags 4 /CharSet (/fi/fl/acute/cedilla/numbersign/comma/hyphen/period/one/six/colon/A/B/C/D/E/F/G/I/M/N/O/P/S/T/V/a/b/c/d/e/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z/tilde) /FontFile 213 0 R >> endobj 2447 0 obj [556 556 0 0 0 0 0 500 0 0 0 0 444 0 0 0 0 0 0 0 0 0 0 833 0 0 0 0 0 0 0 0 278 333 278 0 0 500 0 0 0 0 500 0 0 0 278 0 0 0 0 0 0 756 711 722 767 656 628 786 0 397 0 0 0 950 783 750 683 0 0 556 694 0 756 0 0 0 0 0 0 0 0 0 0 486 556 444 556 467 0 500 556 278 0 528 278 833 556 500 556 0 428 394 390 556 528 722 528 528 444 0 0 0 500 ] endobj 2446 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi/fl 14/.notdef 19/acute 20/.notdef 24/cedilla 25/.notdef 35/numbersign 36/.notdef 44/comma/hyphen/period 47/.notdef 49/one 50/.notdef 54/six 55/.notdef 58/colon 59/.notdef 65/A/B/C/D/E/F/G 72/.notdef 73/I 74/.notdef 77/M/N/O/P 81/.notdef 83/S/T 85/.notdef 86/V 87/.notdef 97/a/b/c/d/e 102/.notdef 103/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y/z 123/.notdef 126/tilde 127/.notdef] >> endobj 133 0 obj << /Length1 849 /Length2 2301 /Length3 532 /Length 2901 /Filter /FlateDecode >> stream xÚí’y<ÔýÇÉRì©ôŸ}ŸÅ2¶Èš%RÆÌÃl¡!$cÉ„De‰(”%tcdì…“²–­¨l‘òHwªû<=·çÏ{ÿº¯ûûýó{ŸóùžïçwΑ•´wR5½As"¢Š€"t“#ŽÚ ‡ÈÊšAK$˜¢( .€ÐÑAFA¾€@ uÕut5X"À„H !c}ý(€‚‰â7‘`„ÉX4ŠAQü@<«…œˆh,H F8àøíD à‚ä`… ‹¦Þ /–}ócEð!Z?˜ Ò©`È2(°L*,‹"`@̖Ⱥ d9ùo˜úµ¸yg‹Â+ÏêÑß²(<ò¯<O ¢€dà’ ¿J]ÁÖŽ€lþ׬…â¾8€ÿaͱTc¥ ý.ü ˜_M°ÚöÝÌù˜£±Ã1åïÓüž²Ga ”£!¤?‹~Ó~gÄOfõ†Œ¥p(Ž` Yï_ž¿\eF@1Xk4‘ŠLF…@X{Á"Mà À0 ©,¿0(HaX- |ˆdÈ·a"5˜Ñ·ÐÒ`&?I€™ýIÚpfÿ“Ô˜ÓŸ„`yƒ?ÁÒþ‚ŒüD0Êwü{׌‰Ô3ªêH@UM“õp-8 ¥ ÿ7!:ˆL ”ï ÉêýìƒeM © òâ­íŸV[a–×WÌ¥Änì{?Ù¶¢i ‡öü;îÖcëSJã÷Ü6J2…ùf¹f%NoþH¯sè1_j¶´Ó ¢òþpQ¹æ²• d èi•k€˜Uå ÍB¹3œâĽ´ª²üáÖµ ûp’Z1R"4e’?×Ðk”Åy[Rûü=÷ÕÉÔâ'/n5t$¡†ÅŒm@Žî}1ëÞµ£çšÙxsËÌ™câƒ%EOÄ<0ëà+E—h©}]ÙVõÑÉ]zÊ®t±  ÊS†ûsÓ¶O«Ê2X¤f0~7D?IФcÅ8ñ°Z§Ã;[ùFNº¢l4†8ñeC¬’Z©×½<á0<ÓW`¾K"ãÃùöÝ!yò"—Ê7W.Jã MÞ)ú:OsF6ù l‚\úîkØEõÃã¦òwÙï[ÃË©·ò_É•ñ“J"äøNÕËŽ»i¨¦gÇeeáz)Îé¡¢wçb<»×-Õr8°ñÖLI†–Ê š|ºuW‘h¼1ãþ¹³[ÌÖ/Vfy³©éÕš‡°Øõ5—B)¦×0›¹^ÎxÀLÒ‰TÌÞ`õlj1ÈåT©5­PUè«Y•MóÇñ–ûεž%rX ýø¦ÕØîÒ>2ª¾F lqóH/^ÞW(-ØÈçÖ®5žüð&²ˆ$Ù9—P³eñdÊ™‘,°ô\ñÈÓØß3貜3çÏbp‰­;ßKqÑ,¸Å[„Ò„S—ƒlÒ:T/Nvð)Þ_ÌôÌ]rEÏ:JzÄõÆÜ÷JÕöÊ”ÙÐ.õßX ³¶ºÂ6$r–mŸ_;ÑÚóÖâŒðEu»Å…¤Á§jú9Ìàúø/²Ö³ ÔX[?b·òb^;uCÈp)yÌÎ{ý] Ê C‘Ѽßë³ ÌçÀ<Š{AGÕ‚r»Úë<[!ßšÂ/¢õH2[Uää.èT 3.ÜÙ5ç þ©xÍSˇƒo_iögVÈm?ôRz=ÌÇŽ@¹MÞ;âîÙr¬txÓáÁ›È¸TzóGÏñ¥1´Ò5e“ÚÀ,Y÷S—.HR#j¥ÃµMWc¹ñjFО;þ†—Ö:‰<™]9™ilmüƱ!jPüšŒ·ˆ·}+á­úŽãór`~™~ðhÿg:•Ï¡#‹äR2UkÐ|ssȲùdÂToÅÎ]a›ãå*~˜‚ElwAÒ»zjZ­­Mcs:ñBmHô+ñ36Fò‡Tl3©A—­vEe›'·e“§Ÿr¹®ˇ.ÞÔþ³¸œ(Ù§AØr<ç¬Ï¤›«”‰ÒÅ­üzÛ§re¦ sÐÛ#˸_ Úpp‡_ñÞ~!õNì?ÊÎVpœ¥¿¾+böòw[Ût‹]f»mtÕ Ñç‰ÉJ·uÝôÑèm´6ûÄh¯•èZؘ$ðÆ^»£&vûxeÌh¼Æ¨ £x®ëuÛÉ/â‚6ˆC»¢×G^ï«æèDH@¹cµè}ÈÚXÞëU¢V2qëÜèõ[y‰y)¹ëÏÌ+]qëºd»Û9:”å$Ú›®ÊÈ£G+7*У¾¦løo÷‹ÐÌ‹l¯“’M—ÆeŽX ´lÈÕ'²;›oê:1<^‹”©\ÊŸoÐôÑ)É( rTè6ÂøÅ<ƒF¬ªÚvŸ¼#|:•Oa3=~ôÅúÞoAÏ­¯Të\½Ú÷:oyíTKL'1Of4+Žß0[ë´pd4_Ç»­!Q¤ ›Œ!¦NÕ=C·Èù9ntŸgqÝAëY¹ÏèI_}ò»®´]¾‰Zf×Y¯H¥ƒ×ŽÑø.q ‹ºz•XXÊÔ¼Œá´ûà͆ÄÕ‹JH·)ÄbØí:_æ<ÒSzÂöô0w¬7ý ‹ïoãþD¬t´Òaq¢‡!ï^Úv¯a&5õòÏÌž‚¤ºþN—»òç9RðÒÛ@ņ,ÿRÝ«X¿ ƒŸöÒ8Š çJÇÚ‡7> endobj 132 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /UYRBQY+CMR8 /ItalicAngle 0 /StemV 76 /XHeight 431 /FontBBox [-36 -250 1070 750] /Flags 4 /CharSet (/A/C/E/P/S/e/n/r/t) /FontFile 133 0 R >> endobj 2449 0 obj [796 0 767 0 723 0 0 0 0 0 0 0 0 0 0 723 0 0 590 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 472 0 0 0 0 0 0 0 0 590 0 0 0 414 0 413 ] endobj 2448 0 obj << /Type /Encoding /Differences [ 0 /.notdef 65/A 66/.notdef 67/C 68/.notdef 69/E 70/.notdef 80/P 81/.notdef 83/S 84/.notdef 101/e 102/.notdef 110/n 111/.notdef 114/r 115/.notdef 116/t 117/.notdef] >> endobj 130 0 obj << /Length1 785 /Length2 766 /Length3 532 /Length 1323 /Filter /FlateDecode >> stream xÚíR{TUÎC€.ÉñÀÒ¢¼® pawvÙÍx*æâÊC…fîîNÌÎÀì,±â $¨<²LC#%Ô‰DÉQÈ’,9""qÔ£„<Í‚ ÿ¬¿:ÝûÏýÝï»ßýî÷»3U±¾!“ #šóE%hSÆ&T‚<<ÂXˆq$C‡c h` B €Ê¢òó òS<@“jdI–^aÞf’„è Kâ ”§…:^Ç(Ëà$äŒBQ Æ|Bb ²éP$Îd¨!iÔl(ŠV3@1¾MRŸCéÕó¦€oÒ𠆦Œ€€j4šá“ÃÔDñHEEc:³¼9¤—`LGRÆgF—jà ” Yz"u÷¦„iÐMD£8Œ"ñZCAà‹Ê$ˆ¿| õ‘d$T$‡k£ôplÒÄD+|zcF¤ ÑÊð¥âñ®Ža*Œ¤¹8c*È òX¾¨ùŒX2¼‹Hå‰ü|¾Z1á®g’Ö?yÀX3 ^ÊO.™( if˜Á–Jh†ã>P3¬ÀÜT‘)Fk’Y OÕœ™ð “ÿo¨|ùµ¡¡LF¦¯?|åo•…Baú7°,¤¹±ÿÄgö¼V“|Îf@\Ðu‰Áƒsßßvxý¾µUj,¥S~?»ÿ×.ëo–]»ƒ$L±ò²%35Üž¡Š¾†MÍ¢”Ç…xðV{öÐô¢‹’F*ík vW/ÿ$[Þ$¹+2®+øtêbÏ¡¨æ´¥Ûwæõ95±×KógùtÌÊ:ûZ1šXuòáÕK6v³c¶Ì~c†¢k¯uϤ×EÆž›݆fmk‹ß9ß½(J%ÒGxv¨ß²IÁô V¨Ó/X˜ü‡£¥µâW¦ìŸ³NuþÑw°q¯Ñج¶ÇKJ·'-8½ñV…nÄ‘+½»¸GlkŸýcÎq÷ôã£HIŠ»éiÖ2dåÞµª6ÿœ™­Î½½[Vïü`TؾÐE—-gêD®‹©³TQ™áý>×]êGгM5G7œI›^wú”÷;-à~l‘C|Êé9åÉ2±³î<µ2ÊeOÖo«€kŸóä/rn[æW÷n>V~ÍñX}Ùb«õì é «a—ó¢bS4áa(vîhJ¼ÛX¹éD® “j.í¬ùÁÇ2Íž{˜»mòµiÌFýšÒj+»‹¹mE¢y÷,\›è=",àªS¹w¿í‡ZÏè÷nË<ë{bMV®-P<ûÖå ö¡òŽ'^%Åê> endobj 129 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /YNMADV+CMSY9 /ItalicAngle -14.035 /StemV 87 /XHeight 431 /FontBBox [-30 -958 1146 777] /Flags 4 /CharSet (/angbracketleft/angbracketright) /FontFile 130 0 R >> endobj 2451 0 obj [400 400 ] endobj 2450 0 obj << /Type /Encoding /Differences [ 0 /.notdef 104/angbracketleft/angbracketright 106/.notdef] >> endobj 116 0 obj << /Length1 1686 /Length2 14098 /Length3 532 /Length 15059 /Filter /FlateDecode >> stream xÚí¶Sx¥Ý¶¨³b{ĶU±íTl'#£bÛ©ØNŶmÛ¶+¨`gεö¬¯}yÎÕyÎãâ{[ï_oooÏ 'VT¡2™Šíœè™˜y"rªRÌLf&&a8rrSC'K ¨¡“)€™›› njôùðùãaçàaæ€#ˆíÝ,Í-œT"ÔÿêÄ ²5u°46´È:Y˜Ú~ŽalhP[š:¹3„llÊÿzàlêhêàbjÂÇÌ 0±4v™š[ÚÁ1þËIÊÎ àü¯°‰³ýÿnr1upü”Pý[“ð)i´³q˜˜šÁ1Ê?³™~ºü¿¡õ?w¶±‘7´ý×ðÿ®ÔÿÕnhkiãþß=€¶öÎN¦9 ‰©ƒÝÿìªaú_rr¦&–ζÿ³UÊÉÐÆÒXÈÎÜÆ@ÏÌÆÀÄö_qKGqK7SEK'c €™¡£é¿ã¦v&ÿÓä³~ÿö`TÕ–S¥ýï¥ýw£¢¡¥“ª»½)€éoï3ó_þ,’ƒ¥@›é³ÊÌŸ?¿ÿûI÷$³3šXÚ™XØ9††îpŸ›è“ØžÌK;S7€©Û§1#ƒÐéóÀge¼f@¸­ëçÒ3šý;ö_Èò‰–‘õmþ"7€ÑÐø³°ÿ‰°1í LílLÍœþF™ÿ;ú_›à?a6£1ÐÖÖðo„Àhánoaj÷Ÿûç»N¦s°ÿË èìðŸÇç[B‰À(ü—8Œ"‰ À(ú—>õÅþCœŸêâé3­Ä_úL)ù—>« õ—>g!ý—>]dþÒ§‹ì_út‘ûKŸ.òéÓEá?Äõ颸—>]”þÒ§‹ò_útQùKŸ.ªé3»ú_úÌ®ñ—>³kþ¥ÏìßþCÜŸÙµþÒgv#CckS§ÿcQ¹Yÿÿ?—õót3þ]RîÏDFé3‘ñßýÃô™Éäø™Êôø¯…þ~&4ÿ~ÎÕâøYølT¦Ï¹[ý?¬ÿŸRÿØÆLŸV¶ñóh2Úý?­€ÿÀO+ûà§Õ÷à§•Ã?ðÓÊñøiåôü´rþ~Z¹ü?­\ÿq?­ÜþŸVîÿÆÿû²ºyÒ3s°èYØ™þ%Åàæàöú?z;;|žH§ßèŸwÖÿf3ËÏkÎÔÔÍÔnehÌhõ³1¸Ô[,º ’Ú?µ8p¼3¨>•—ál“uÞ¡iJÕ”ð%Åʲ9ùB¦‚ÑÄŒ}§Qèǧ cÐ2Ê:unš ô•ñ™ŽØpö`/’mfØÑ Ѿ}íÕ*éÖK'd•ì 3gÎE8DéÒâÛ·µÏÄö |Š éA2œnv›l’©úñVìØË¹0¸R8Œ¥“ö€ö¾‚Ó»1k½ŽÊ‘-¾Êÿ ËDíf¶3ÇœnM´¢™Å-ùQ]„DÌ0Ⲩ˜º,ÀY\ü½™ÀjÖ 3†øœC:ë|{¤\µÞ•AwÔzþ×Ð=c}BD~—4Þ"ÔùN0³ngÆÛ.8øñÜ1åÏK ü¼YÉñ(âw“)µ:–—y6§¨ùÜ1Á1"=sZÌœåw¦çkík̇†q48èäK(Õ$aÆVµÎ“®•Lq¹þYÎ^˜—`xµIONÿ|™^þ=,µ•ª›,©/Ñ"ÍzXçÇ>%-èA˜d³ œ}éÏ?éÏ%<ºá3¤yæVñI:, ½áVTIniFõä&äž_gB Íšþ˜@2‰É!,Àyp9Ž=»ZÞÑ øôt;´nޏ&Ο ‚°SÑ`A€±Ûie¬”/Ãõ³Ñ(ìkSÄ+߫ⷙ(×e-ȱÚÂãÄGgÌ”STœ²†QòL¸Ð yuÛÀÄaH7ÜŽ«ž ÃïiÓwM¤ø¦E¼Æ!mf!‹ý°ÿU­~öŒD&×]Ø6¯¶£kÇìËL <¥XÝåçcr—ëOwÑÎàYÙ õN ‰Á™:¸Ö°°¨‡/OO+òe‹è…t¼V7IGn9ˆÎÞš®V'ʉHÄ¢ú¢ºZyˆ8ïâ…Ó>ÖàR} ã÷ý Þ`‰—OãQµúl¤ËÏ‹–E,3•˰©¿z%R˜¥sò(ÿŠ8zæðÕæBeÏ<ʑ՘þÚ¢òúÝë7ïjwQA_ò“K©/ìé™§×1/ï¾ímXPʇžMQ3¥M²·Â<þ†Áâ>dšæ‹šÝSœ[ÃÌbã©‘ÎsJKÑŽSr°+y‰S‘˵$5´{†)îJe‚ÞexJ‡jÝ"$þ-?-몋¾Ô¡$;g.¥1öÐ]jŽ?Œ @¨#Púuý¹t`ø¡«ÐxkÚqßVîäôà}C®h4ä›4÷.4+›yÆb©î*ºP ‹]”n°ýl¦Á`¯¿°ÌÛÞý´ÕežVú ™›†‰#àëÕvcßϳ{[6’_¸Þ *h;C7¬X<Ç’&t®z£â? ÖØã u8÷pÆþ‰=Šh¯OUêÎð]Œ¦9 ÂíGÍæ÷ñS÷J”49ýÔßQB-X‘?¢ç”·s×3øT@‘‘òIe ¢švÍ1Â`^+ùΧ٩-GKÿ :¼#`õ6—ŠGã€Wa/Êtt‰é½âFôéƒëvO‚Ä•ž´­¡³ÿ9ûZƒ_|±™ES®Û.3íp»ojTâéΜ¦2|ø[ˆêÅ“cÍÛw!AîÐo£0T¢ÍÞ×D¯ªSTlÛ_\¨9ö!“¾…íPM úMŽÈ׿cöf¢Ügu¬“í·®­‘¾Ë{f]Y0z,ÆîŽQ}a åK/t²üm2t •zÆÜEæ.uf¹2*纶Kú|ù3ÃyœKb.Ãã4y*cÅR×±YPáìGÁ‚ïXË ;= "À.êB؈8°g²Ø«-!!·ãŸ§´O¸sáTÂ/L4P½:Ëô¡m“±Þ‘%q«W£õüÍ®Ðý¶×•´¯u‹ E~¯Á^u¦¨»!iGÌ·¢•atȇð/јeŠ—%Ë-ÖK7ÌÜéó:üTAVþLyWbò+jàag¦ûä©$ܱĚ¹¶Å»˜nf˘ÃÛËÜ‹o Z× lx<ü¥\-§«¯*‹«8§“çQ@Oð–ÞN9´‹–s>çF# %<¸ Œ”ŸþtP`Fšbt^©gQJÅ4¢’àÈâTåSxºš-LæÑâ-uÌM º|]ËJ!X‹—ELU5ýk ®¥4>×OÀ˜ðq©£Œ°›H¿w øvÞ¶ùz}÷õ8 3¯ÇŒÕ?:èŽã á 1<Ñþ˜PQÎÈÔyÚ:$ñÓŠí˜l#›âN¡¶ðì‰ý¡éì±:X]®ÿe)ƒ^2RÑ tüaïÞ#…ç;r‰¶_¬[Ñ«–Ö&ãM«®Ý›îô€ÞqYÏ—s™•z‘ì,w×k7?Ÿ¬¢MÆ;údtì4-¯o÷:­.ˆ¡$BëÅ'D^wÉ’ ó¿ *†²½¾Ó&‡n5È?ÀîK79q'cF—,:³p¾®Q™}™ä:T½*os«24öñd™ž/Þ<ß·w›gÝàÏâï°P{4ÖÉà|L¬‡šd=„üYï`ÙCuo:@U?ß ¾Á ÖÒšYægLZ"OŽÁ\ÄË¥rmWþãб¨Ao˜‡M–úÖsæ dL McKø†ÍOà2:Ô+\õKŽœæÖ‚)à`rîPb•j>ÁU½«yOÞ“@ðÞbÏq©pSµ¹ÒÙ•,Ú\ÅÍ*ßzÈ@ !C*'y„ë+Gñsº‡ª©'f,J³áóîûò·V2iHÎ{W7—Íai|¦Zˆ®h>Ç‘²ç–…[””ί¥”éI¿#kÏo¬ëxìG<†(†ŠãÊU Ç‘í³)ãf@ìscO–ázxÖQ°s¨€á{Üó¥N-í\È*^ ˜âøZi^$HöôÎ3§4ï,]ÈÏÿ¤ãDZàÕ=¾!Ê3 .!Wƒ¬à¥Ì›)5=غӫYa5ã„rò·Î5óGWª¤F8…üvõŽÂ½^™i\PD W ë¯!@ŠIÞYC ½{ëµ×gv“eF°Tï¡Y——4x1°I“î¨R¥(ÏBåÃ`ðvîß Ï<äé¿^X;bT“i÷ÞÃN9q^(ÝŸ!ÔˆPä&I¥Î5m‘V ~7G ÉÏD&*Hú½Ñÿü¼‰x›¶‚fŸiÎ씽ò0…0JLÊ_ü̪‡Vþ¤SŸÓâA/~¤7Ø@•CH'¦\+Dýc,aB¯c™ïä(•þ«ªT˜¹·fl «!K²î“d¢/_%¿Å‰³ß&C¦Ú, “Q\4/«¯óÏ;¦VÇuÐGë‚èè å+Cýê}ÞïËR×}¢O.a°ö”ÆA.tŠÃIxÎBݶË<¡ØQ˜ÒŒhèÃDòŠÄLÆzJ?"V Œ¦1èë°±\rM‰€áÆ‹T?ÁÆF;ó«’bP_+›ì²î(³¿e‰™é@klÞÇ:4ðÐ;º´eÚè«øOäzö¸è°Òᦴ’ApÛf3ów—éGýYk¹gÄMhÉÚe¹á¿cZ¬¿Æˆe•,ê—ƒmÿªã¦·€èÁâ±Í$l:¥GG.šZƒ4¥w¾JY¥8a´8èЃ— B‘/µ¹–éµ+È?#{ 2’áœQI®Л=Â@vÍ{˜‹DAqéN7ÞmÓ¥§†¡Ùr.ûÊžâa=(5°Ûó¡ðf—pŦ'ç¤zò†ã9£+Ïïé$úëzÉI¼ÉtGÌÖ,™à%êÂ'ò[²^ò"UQ¡µ˜Óœo¢tÚ%p-’Æ:åAÕ™gÜ.bß+”9ßyºêqƒŒ±wÂOmd÷]‹öóy¯Z[œHï[Ëz—¯²Å¶z=hmÒm‹Ùƨž4»3+¨î¬K¼ø©Knx¬©)˜ ìÎÒjŠ´ÁÄEØŒÛTf7ˆKöÎæõŠ“êîÎ8Šß=ÄQ¡)ÔÓªëŽÍ\P3¬ji½OÚ&—ìáÌ %ýñè:lŒ/ºK·ŠÆHŠ@ñ×cÁ¬´¬òü¯wP‰ª‹0¼Ä·nxÑë”Áy¦3ÃÞ¾ÐNo‘S¢æ‹OÞpê5}ç˜áâ×Tõ gCçèBìg\RÇ£\‚JNâ×ñ¬Õs›®,}›Ëú¼äC¯" +äâdðŠ‹ =IZzäAp%Û‘![1Z(¼ºCóLiãž/’¾Ê‰óÔm9¼8;À=LU½_›I„˜ç: (®8ÜÏÀ˜«¡~Méoküö.î—¿°Áå‘X/¥[‡QÕé)Ù_Ò(×ÿðò´µ.FŠÁTæ PÑeØA„3ïEVíÝÓ4n’¨º|Q9~ü“£cÿm/ýCQD1íG‰WxIP¯ÑÒ3‰$ªMáÌIü!üžÔ¤,ð¨1,†ÝÔ¹ìu$.rßx¨us"m?M›çåZ*»{˜óͽ›wTW[Z÷£Ûû^ä ×»w´:¥ÀÕ+·Ep‰ÓBîs¡ g¼ßn%®' ņ é n—Úf u^Eñ†@¦xˆTeÆaá Ì’›Òä}!ÿµ;åY%µŽµj#UzsFÝk¼o¡ßÇÍ2¹("VõNŒb/VÈøþÆU“\›'Â2cµ ËÅ(cvÅq¡ÃÄE*s>Y7“?Âh5ÅxÈE±°›ÇúUÝŠí¾î°©?¾0íö¶]‚ÒîÐF~°à7q8Õ‹×#ŒUvï¼Y]¶6CæCpåCõÑsªòù@{Õ?hˆy¶Û·^_±ê_íÈÖzù/gV¡Š³Ë¿‚0xÞGþ׿Ë%Ç,7rÏ=@ky4Sv2\æÉNIßoZ$ªTè2b+ì3,Þ®¼Ëð¤>ñAÎÌ&p„rEêê ê–Þ ŽËd/ÍtF{§¾®n¢ø¦“íÚˆ»2;VÇ<ðJã–`en0Õ§¢ ^\Çå¥ó{+êfÖ»[²±Ývü›­Ù^IØ×lj1Yè…‹L/Ëó 8-,šÛ®Q(>SÎÀãóäù^ÔÚ ”R0}Õ˜I€‰ó°¬y%«êE@·¡ ï±¼g0ÆÕ·n’¹Ó‹f+9¸/MßgPÉæl ˆWO…§Wä[Ò¤Ç@ãÂZ-© ·¹VüRåyì—=wØ>zqL6òuâ3ŸÍ£óÅ^ 3ýü¬@Zdõ ’J»¯ü· 4†lH NѯŒ•žIºTzׂЖ‘zpˆmç]_Ó-*˜v5*–9&Ûšeº%ÒÀYY* 2h’Òt¾*>@púÄ'kXr¯‘ù¹ÉÄ1¯Â¥–ŸM@Ê϶ –õh••«|€ÝÊñ *ÍÀW¿µä¨5b¹¤%®:»gÅž’Tšnþˆ7JSP… ÜÒN‚·¿ ¼soGq_í×þi=eàáš…g4+ßËÜbÇ%Ò!íÉv¦ã Ö§mëiÜ Ý°U¬R®}‰fžÉU­kšã×QPK€h©t9†æ5j¼špFø–¼ Ôºèø º<ºÆ¿E#Z’½bÛÔõ+±€^åÍ¿ªç6yrb×EPX-èÆÚÂé Jgæï\0:­C”¤­@+Ãëp@v:J~l\”› ÚT@(ç&¬Ä,—;÷{cØøñ½‚n¹FÞ 2àÐM ÅĨœsv§Š(LצŻ:¡p¾iSý­.n¸…jÀù[¢÷£s"F =?ª2Üç$)SîJ`{T|Îuoi숺=$›d¶¬œvÞÓ ‰¹…dGDŸ„´à¸,^­þTHI¢˜1ÝÎ2 Wõ%[Ø2ÜSöyocš 4~k±Ÿ0ÙrtQl¾àQõ$(Žˆš' wÀÞÛùÍú{U¢›VBUR†+9³’ìÝQDþ+æ&ž9hm™*™FOµ:YåÀ$š**ÖÇt½¾Úªb‰îO:ßöZ,jÐx!Z{{9:qXŒÇyÔÇy‰÷·!î(µ…m/#˜°®· ß!Ç[©U¯@Q·ŠN’)Ææ†ùz Tÿæ)¾ Ûlǯcºä“Á˜óÓW‚Jp—›PDzc듦®R>³L%P”ï~å÷å|šÚîú£YžûÜÒ)^Ôµì:‡J"%Gš/ÁA­lì+0£¨µaÕáÎEC÷ôóó>&é3ƇÚiQ¢ªîg?, éCd‹Ûªù\-nÓ~/!±y*odY;ƒE“¬dâ®°Xa8~´K×é¢4aÿÖ¡zt´#…ì « [Ê1Å7k`%f¿¾Á7°O¥ÖÀY|I¾¨ÄŸ²¢£r3¬n ¬x°œföÓ™9½™¼ŸT¹hÿ4mo/vo¯ˆ!h#°Ÿa­W¥o.Ã+ v§nN|Ù¤|!mdÒêø $ü«›ÑœJ~ìBC›Èˆ1„  ihLËV(…!8"‡J횀ÃÔ˜øÊ„B¯‹1Uóqëpáá ÅàÏq$GÅ@ÍóZf8ÑÓ®çõ Vu)t.ú}§w /'9hæ#+¢»_ŸÏ/Ì*€QÁú6š!»º录ÑY%,%àÁ»”AC÷ŒåL! ¬öX<%«ÅqB)ºå;Õå¾DˆY¤•D ÏxcÚõtÜp‘ºØ |vqHùxŽvé 6âîê!œB¸ãyTxô*$M/³LèüÃb\òQ â­6¤‚³Î+VÅ.Rz[ð#Ý–Ö5@­©™3׆õª+åfŽB_ËRr([23p[;}ÙO,R>‹+¡,R-åêÈ]ä„;#O‹Ýt÷»xë 5nw9zç#Õº;aKû‹5Wyµ;ß'½Æ8šf^Ï5ÑŒ5$ë+}¤µ]N'Å®ßEh_Ûƒ¦éÒôׄ"$Bý ¢g@ z}Ÿ mìΙ$¼“¾„¤|“qÄÁI¨š8Á6­n’¸½öС‚~XZà-ûe¬Ÿè=)°ÕßêÝ Bj†Bpá\ùyGçÎZÜÿŠ4…Ö_ªê¼¥±ÂúfÚÒ“ªEö{!`‘)Ãdžµ½ø®)wÓŸÍþŒ>_wÎz¾’áqšþ¡ITÕ=BŸ_¼ù›‘o<è=nf½wFv 1MV^!šµÒ)IwiËÊéN½ò¬›ô/l}ÄþÃE•K·F±«àsÚ…ë`ÔC|ºgl(œUžÄÏã$(Þƒg“Œgƒ§‚x_üQ=zõäŒÕ¡ÈÖÆº:‚œ”¸å¼°Ú\³R¼érâªs¨ž‹ …*z ´e[î"tõD‘<¬’{í½"Oç oOQh_âJ?æ‡ÌÙýðÒõveå^‘¶*Ì¢ñÏ !¿ ¦o€ž·Ôƒ–åüNm¢X^4Lßó·ñ­ º îEÁ–òpÖW°O•ÜøÛÈê÷7ŽûíÑІÉ>&¶¼7#']œóEŒ‡ XÉNŒ¶ÏR„Àk‘®O «šÓx~Œƒ±wØaÒŽþ>p’ny’9Ó$å=v=—ìž ŠÉ úðB ‹GK™‚F±k{ôPÍáNv#+‚œåyуo°8@`]ä¢Ó@!÷ÃÙQYgG€ûµÂIYò+1Û0Ã.èXŸ^ß+t2kÄËÒ¥™&iZ 2ón—ŽOjfx_&c-}2 OZ]Ò5j´kµCêwú£Nýf›¨÷‡ì3'Hݰ °saY(^@lÛ[ùúbm Á|¤-óûdÙ•¿HŸúSI¦¦ÒáÇyÙ°*è±n Š•ú³Þ‚V‹] ¢Tmß­œHùQ:õS«eùÀ2S™·©»n>Ráxgx@¸D'Â"¢†òÍvõ7É#qМiÓQh7.¯@]‘Î=6™ª~Ö©µ´|ab¦NP—ˆH9Ád2º ‘ä¾l>"˜{ŠHt†ÌN¬EÀƒ¹†wÇz„‡Hv¹g¡aõK˜²JnÚiç tÃï+¼C €²Ò/pòÐ^"ÞÞÄ_ƒȤliD¼÷¢MŒŽçº2‚çš^1'³Mö&V"û|ƒ*/!™é 4Ö_!¿‹6ÿüä(F;UÿÑB=W ›N-„ÇñË“ÓËèÁ˜<>éÕ…p›óÒE»ü™W¦ùx*`=yÀÒ“‰t—ó<w¯l,¶1Õ¡Qaí}±P§÷]oÝ€Y$ UB1Î?F¡-&ÒÄjòKGÆN2Ñçšýþ1ì¯õc˜ç.©­îCe+û¨Ö:‚üâ£%d„¶Êü¤ß®)J¤GÍ6~0˜ì7u\¸¤Ú¿4ìÀM“ƒnª !í£KY‘(RÚ¦”º¤#0£’P#`Ôœ'076f³£­M4æÂò‹cL2ºÏ×uêÕ¿ºÒÚíkØV¾G¤™ªŸñßO‰2{®°…¦gÕrUløÚ¶¶%jÄ6^™¡UÝ0ØÄ VùŽ  tæßúpð9¹—ó·Áðõ»Ñ±okûq#ÆžÁGWÄâÜl»û{ÏØÝ2µÈÍ =Ìé‹ãözèSáh­#AՄݼ£óÝ!”6ûVÃ2Â÷,Å‚½V¬ñòkW=êìÅ…–Ùú¯ZîÜNhaj*O–¬.¥Õõö§fL?3޼¤Ñ}Û®:(†èç ή’i°$PŽHUqÚ4è¥)¡³ÆËÖ%¼Rï'¯ùZ¶ðÔ÷r\g/X8ñÊ„s¢á|>óo ¡W†™ä„.5°l²Å¬(Æ'i`в»S?bWøG׿`à.E+%¾&­Å À¢?lä}œñbhOÀÔ<¡?§¶Ñ¥GÉN€fîÂ:i/”VL¤õ^éDŠ·»_õ‹|›b2$ÝŽ„›™È™ +¯ˆˆ&éÖªÕ¿ôg5/JË.vÌ ì‘¦æÇÊ µµÖ>½48œú•žùEžü íÊy£®ÜI%øÌ+²ûÂd.1Ÿ³f8W2ÞYíÉ%Äà{ák[€fÒ`_><ØK5ûXhø££A;F,UªÖƱä"V9šÛö—C>a öˆÒP3a-Ët€Ëɖ̤6}#œ5}Ôœ dpMb¼¢Þãjð,NºŒcÎd¼öª}`DÔ~QSyKÊÚÜ–„’e2n„/uJ•b1«ê×6ùÎãž ]_Ëwe6+ÓÂsÖ1ù" _Œ4¬B˜R¼ˆ ¤AШtˆ%‚ã1„šÕZtY.Ò ÚŠup±`5ÃŒ{?A"%¾ì4›(µ¬çŨ߯™þZ’ÍŶÆ2gfDeúi^yÈnI¾{,S—ÎYƒÕÕUQz|J |ªüC‡È¬oßM¨pŽÝ'ºa’.¾;·v`Ì ß!Ãì¸Ú Û% cA2öÉq¼Ú:*‡ªÒF]´; ©UÔl"?ɳª‹Ð…CyJ”§Ñþáо¡=[=;=LA‰RütÜüÛãéè <UHaã‘#uWj6#k±‹à—JȈ†îPX„lÖ‹|Iš )ÍsÁóˆ¦ ™¦þ}ޤŠÁ­9€Ÿ¤! PeV˜ÀÒ¸š€]“®ªÀŒå6Ý5˜D†Ѽïö³pæ‘>àô±nŸu¾bùgþ Ë†¯åÏóõ@QŒ†1Ó+Äu‰¥5ÇM{ðF)Ú-ZÚy± D( s°ÞpLÝýW}÷Áo¸Î;gâ:k._Aóæv„¼Áz2-PÏ»ž=ÐΑ¿pÀX0Eëš(ÓÜw”Fs)U CÁÕgÛtQµ°¨~‡*l}Ž“ýüyé»çqrC8Û³h‹xždS/\ÍÖéF¸1LaŸ"í‘“Üäc®_•p‰®=a^SM^å§d&ÓŒ”däôS£s ¦<€­§ÄJD—Vn¼ %'ØÓ×ñbÄBÃ}Ö/Œþ¦Ò:Ü̯jYŠÒ?@ðâÉg*t­Fa'=`ÄZgàlÌu;ÉrJŠ ˆ&)™ÎvFåÑ]q“аmÚU)eUé‚ú3MV²Ÿšù\Zh”k“G%ü´rñÚG=¯%Z\CįçN9ͯpÇkn2ŸÆR[0¬n÷w%7þʦå¶ÏW‚N_ÿÖƒDö Öes]z¬çªlØ¢k8÷Àõœ±<5Ñ`‰\úK@c^õÁ棉VçÆbêê¬ÌóHQžršN*Ú+œNœ¡yR…òñ¥˜­‡´æ{6Ô•@ÓNƒS|9È—ÆÚTkš»À°Ã†žMÓÇ<œ?ß$ú¡†Pf•5H‚]è¡ôjÃG¬u×dS¸ExÜ:ئ7‹+ ¾h´¹]%‘èJDh{>Å^ÎtïÖk‡|8iQ7pò4o`ô½…õ=b¦‰‹¾ò#†|ÎBVÈî—‡ÏW˜»~6bó‚g|kÌ0‹-üQ»¸lI[kõ°`³–mûˆ na€¯úé̳à .æ~’I„²Ò%^ ´“Yü]­Û᯴T\E¼ —Ý@ºç´D«Y0YåøW¡-2‰±iÐfã™.Æ‘Þ^iw.ží£à~ûE¡Ð %m˜MšRä“à*2uaÇðTml¸h—7Z Æ’-h ç퉆UÄo“I‰½áh´Õ–BFëN4Po{T€T÷|o”®…Œ0}ž`xµ¬ëkzw’(‡Œ{çï½<ðYsŽ “›!gœMú½Âzèú±/_éš•ˆIF) K¶q8ݽõ¦&›ŠœXx` 1aµi!Ìû»&е†rGW6¯Î]{N*ç èO?š¼ÿDôq¹Àuñ\ØKjÛníé.= ù~UÒ |·¡ø©‘Z霧ÆXÊ¡EJ—N’œAªÅþÖ:q]dC©¨´WÀ 2X›yS'þbÈéíÓ&]`‹Œ¦¯ßjâ5É.0öü®%ó®^ÚÆat8=ŠÓ4þ2e•sûßæ=åÔ+µt¾2!Ö†ú‚'L&˜ÿÓK$L¡·Ɔ€{C±'ØKµdÏ‹¦“¥Ër=—L0{xøÅPÕ8j‹T“ˆgÿ×åX2 g€¿¾È?³8Áþ81÷ZÌoS6DسäãÞÁ¶Œ$"ÃìFð׺®ÿoÒZÃùÅmG|׻ǔÔ×¢}È {ª•"þ?E l Á2¶×:fo([‹[ìaäVFèÞ`ò…;^`*âžH_• ¼|ºü0öM)|D;’ÉŠ!WâDójšƒFúFÊ]ãKŨ$W›SÜxsʳõá-ÈГÜ|~·w¿‹Îh:¼dòq.…ö…m @Æ^w~¹@Ç ÉûWX¾ÈçÙ'¿,¡áŸ*gd×"@õ-¡³¿õ &ƒ­§‘Q“Ê2ä*ê™CÓ¨ÜÊn[¤­OÕ 1£¼½! !ïÎ1¸Qžô…`3i¾#>N°V¯6îÖÉ—ïw/iëÁELãÚupI›é0W»˜„›+#ÙƒŽŸË°#»Úîî| f²¼NœZø"&XJõ™§=¤­9`¦ý9„&`]ÿó‘-:8=iJ¾¯£5XþsŽ|m»ùË!¬¶¼1‚ŒjÓ¾C ʾ(’jŸPӻ퀇ë|ˆÆ±ðÞ4Ǫg/ŒøGgpøñÞ¾»Wk@8´‘æê Š±ç°¤N=ìhÛw}Øšä=xŸð÷îUUâPW€¢NŒ:z¹&|!†!’¬«™[¡(2u ¼aô{MŽ!*‡û£ âåÉ'g)2?lò¾­^ðtë8Ž4tﯓ‰­X‡åÈFóUÞÃôóaúS=æPÎEÐk÷¾Úb3›A:“Ãæ„½²ú\e5Ï=§!Ìã{½ÇÊI®Ú•¢jH¥Æº«R7n­Ûz#Ñî•z–P¦yÝRàgh¾1=÷»lLJ“XYònò8+¥¨Z)«sØ?¥RíÀÃY)M8÷áü=j w­OuÐÎZALVbÑi¹8KAì5|Y§zHí†tMpX£ª´O<8\éÆJ 0æE쿵¬ùæàÒn÷¿§‘·úQÇz—è,É[È Ù©ü”:h³ã÷GbnéYè!ÐekÔÿ¦Ä®ÿ{ï©)¸ße7͉¡!Cµ¯:Äc™Tb@è6Û‡œO!_v‡ 7€@Ý]«Ø…|â8ËD¾-×k:©©aÀ DwÐ&ÌáïŠÊïŒ>9Ê1ퟬ+lS-êoy¨2‡ÿ™¥AÙø!Ô÷kŽÛfŒüj×¢K YJ"èË‹}纻ì Íï×ø#÷KÁ#¼ÅW 0ú) †~›ð›;Åü$Å™†L°[*ò4…×`ù× ±-ÔR³}¿ææÒ{û®Ö* Œ]®Y9ñQ\$T!š˜k²JÙÊ{0ÜæÆBb†Q´‹mùÄS9ì½b6Žõ>æHÚÕÆCDšÆïçËÚ4ën"µ¼i2%ì?©/Øý+Ê_Á'Ë ¼àWQSbÒü×iÓN8vN8kU«Ç¸ç•yÌtNÂð‰0”s¤èƒî¨Àø –ÍgT3‹°êŒ×ÓŠîU#ʶ’fº4/Éáꌹš\‡V›+æ_Ò"ŽAÚ}_Í)vfãø0Άååܳ¹‘d½ÄO|´÷ØñuÔøÌNP䯱8v$⛑¡~/õy $î¼VîšVFÃ7i@j!6TϲFÊ­äfrrL¸|忀ñFð*™ÙÑ„ÝÒc?#±Fz”òû;-I§}(p‘*G:¯÷mÛÄ­;^]³x•nÜVØ„® ›{âWËFÛŸÉÞÿmìŒ —ìid!aŸxñ¥…¶6z xŽÂÊåf8Ë}œ+q<èãæCc­'vôÒk„ìpçKc.N¤áœã^÷ü¼W®æŸ77'ñ:á<üå=ꔜjxlçhˆÛR Ê® Ì/ëM0VôsL‰%è9Îä.ß`Œo¾€5ö7oþŽ^·íÙLÞé2Fs.AÕ\Á[Ó•¸på\Æ¡6¥É•Ifl|ï¿\/Ÿ:n+ºÕ r*îì=FèÁ–L­wØÒ’RÛ+þØk‘Äã‹ÿI×@[:g¤ò–/Œ¢ ŒkÕâŒ'þó[¶ôrUO‘êëT˜U•J@Aï•"ªÜR­e1S çÝ[9´È~¡¤Õ•§³3:oÖ4J‘ÉÏž3Ò儽vK˜®â-Ç háÿ5x ”t4lY–pê¹Ç—+û*ÄpJQd¯ ðCÑDÏú@Ń­m£ÙU§/øÉçů6kæ¿©QjÔ$ÝïÔòl¸á=Þvã^EÇ0e+Hq?ˆÌÄ܃íÈѦ3 ö‡«›»£»#ãÈ®aàémi· « &á­kbh±•²û™ÃR”eÒ•ŒæäÝkh4i´l3 7¬“QÕæÔi½Ja:]¬¦öb?f9šðïSi:Jáñiß5ª‹ÏéÞ¢² ¡ßë’@4øå> ¦^}ÌßGh!9ÌÙR \g±Ulä?,4Þ»bT}ß3áßZ#~*ˆ±•æ¾¶ãªK#^I‚ØñŠKßÈ—,{ô éªÞ¯~ƒÌ¬N·G«úzg€£o–#LÇèäðßÛˆé‡ l¾‰ž¼fÝá­—Y@ot`Á!Ôi÷}7à5ªÜ„Ó&’`sαm± Óø#CzaWäúaô&ÖúWûóOáÈ|AÜÅʽµîv<¦' O@¤·°4_6VWFŒ gÿPøýVÎ5lƒcAïjøµ}¾’ 1öËÞ†$q¿æµ§lÊHëÛƒ(è—‘h¯2·8ƒïLÿ?pÿÿÿŸÀØÆÔÐÁ hkè` ÷¿Ö²Ò2 endstream endobj 117 0 obj << /Type /Font /Subtype /Type1 /Encoding 2452 0 R /FirstChar 11 /LastChar 121 /Widths 2453 0 R /BaseFont /TXEBMT+CMTI10 /FontDescriptor 115 0 R >> endobj 115 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /TXEBMT+CMTI10 /ItalicAngle -14.04 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/ff/fi/fl/acute/parenleft/parenright/comma/hyphen/three/four/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y) /FontFile 116 0 R >> endobj 2453 0 obj [613 562 588 0 0 0 0 0 511 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 409 409 0 0 307 358 0 0 0 0 0 511 511 0 0 0 0 0 0 0 0 0 0 0 0 743 704 716 755 678 653 774 743 386 525 769 627 897 743 767 678 767 729 562 716 0 743 999 743 743 613 307 0 307 0 0 0 511 460 460 511 460 307 460 511 307 307 460 256 818 562 511 511 460 422 409 332 537 460 664 464 486 ] endobj 2452 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl 14/.notdef 19/acute 20/.notdef 40/parenleft/parenright 42/.notdef 44/comma/hyphen 46/.notdef 51/three/four 53/.notdef 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T 85/.notdef 86/V/W/X/Y/Z/bracketleft 92/.notdef 93/bracketright 94/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y 122/.notdef] >> endobj 88 0 obj << /Length1 1812 /Length2 11167 /Length3 532 /Length 12185 /Filter /FlateDecode >> stream xÚí·UXœÍ¶¶‹[,Xãîîî Áµi$Hã‚»»w— à!Xpww÷¿¿¹ÖšdÍÿpï£}íæ¤ïQõÖs÷¨ºª*2Uu&1S° HlëÄÄÆÌÆPRWÔÐ`c°1³¢PQI8€Œ,Á¶’ÆN ~@ÌÙÀçæçdãçä@¡H€íÜ,Í-œ´tÿLâˆÙ€,ƶ%c' d  ±5@ ´9¹3Ĭ­jÿ<áP9‚\@¦Ì(llSK Àdni‹Âò“œ­Àó_eSg»ÿr98B¤´I:DÑlkí0™¡°(ƒ!Y ˆÉÿRÿ¹¸´³µµ²±Í?ËÿwŸþ¯Æ6–Öîÿ=lcçìr(MA¶ÿ9Uô_zJ SKg›ÿ•s2¶¶ŠÙš[ƒL|ÌœÜÿU¶t”¶t™ªZ:-NΠ•A¶¦ÿééÞ¿,XÕÅ”•Ôþ½±ÿV5¶´uÒp·X_çÿ‹Ù^Ò&K7€.+3++d"äïÞéÿGœ”-lji 9\ÜccwÈÀ“ `ik r€Ü Ê,̶`'È#Hg¾ÌÀ(ÿì+€ÅéÕ?åU8¸,¶Î6&ÿì´¹í¿Ëœ¬;c­5ÈÌéµÊößÕÿÚð—Ù!«:B6ÀÒÑêµÈ `‚mlŒ_+( w; Ð_1Ü!ÏM_K¼øµqÛ¾sAÔœ\_ǹ RN ¿f@|ÌÀίHÁÒå¯9GHËÿÍ5GË_fÜŠØ+A<Å_‰À"ñJaÉW‚ØJý›x ®Ò¯1•y%ˆ¥ì+Aå^ ’®ðJtÅW‚¤+½$]ù• é*ÿ&^Hºê+AòÔ^ ’§þJ~h¼$ïÓ+Aò4_ ’§õJ<í$Oç• ŸÖÄÁhrú_‡ˆãßõÿ}Œø Úr‚`‡×½‚\(,¯‡ˆ’oòJ|࿉"`úB @á?Çâ/„x˜ÿ…Xü…˿ҒÏ!ÄÉê/„HYÿ…+›W„Ü,¶!Ä üB¬ìþBˆ•ý_±rø ÿ9§!ÄÊé/„X9ÿ…+—¿båúН·¿båþB¬<þ…ÿ÷u'.vód‚<ÏÄÎÁà†¤róqù_ó€Î[Âé_ß';óØÌrÉ‚@n ÊÜ4(ð9¹!¨Ä[*o¬ž6~çT¨¦{><ŽíÍÐq~ÐQê-ɘ:,6¼w2iÿÎPÈ6qáBšÞ4)ºË°Ò†>MÓÒÕ{j y*`T¦‰¶T_Ø:¹|sUçvû=”cÉí="â×^Çþù^¨ÂEª4í˱WŒ5½iÐBg¼&ÄŽ¹ÿ´’“Ý@¤µ|gUd^œç/Ãê&h„ˆ`dm¤¼£\’î…EE5ðUˆ-ÆKPVø>康¡¶[bh§v¿I‰ôÙ%祎æ××Y"³ZØüK¿Kí4¿[n&^Œµý_ƒ5¦Ï½»ûPÍ“P/ Ëó?ØyìÄašG`QŠ)kö¼Pžñwû U²›Š$è GñBú8çÅHÒfŽ"A~!’ŸVmaTž¿Œ(ÍVÃý5ú“—HŠD1Ä zÌï%¢×]D†¦{¥žAå=% ÛøûøF±Ê¸µ½x…‚QϱgöÖ-º³N½wŽ¡Ò¦’_¹hX±ÂUÔùCŸœçϯÐ^ð)•ì£Aú/§_ï¶÷êÏ/ûåÞ÷9]ÚF¹I1®y‘ìB-óҷͪ«Â w@©c+5·X.±¦hÚ”÷ŽoPõÔ9Ô%ˆDÅ´y&ÿHšŒç9²‰¹…ÃJiÌõ$çÐ*À%Ý‹Î_µpW“ã\¥qGߨ/Î?±‡ovKH`€3×zgAß+iËVl+Ùüœ¯È6]%äõ“´'%ú³/66œ½*€?0 órŽ"îÈGt1ðu9è«ê±…^8Cµ¦Ê:s5 UbŽñ.ÆúàƒtÝšîiÝŽ6éþ9W®3".⇛º §%B8¾¹·Þ;¤âëf{Ro[C3C·¶¸Æ¨Lœ} t2Uc‘lœî—.Œnã•ozéߥˆ³é«~«»šñåÓ.öó¶OYE´(K÷–¶IÏèµ ök&ÙI~%èm ºç!ýúðâ[ao~O)pv¦ÆÍf'µj†‘$Çñ†¢kOLÕ¦ª¯1.sÜf«·Y¹9¨=S*-©5ÈõÖ»*7kQa–uéËŸB¹µáÓØg#°`š(÷Gøv4I.jm%†O‰ÄØ@ÖÊ\Jva ;ò÷…˜xãÛr)¦-/Ë.g÷;Û8¬ì.V”åz*”¾ŒZ¨/µÌ3z`yÒ­ï‚‘E®1æ>ÔÛ± rpˆú©bH­Š:¢1«fÉ‹ ³ÅÈ2ÓW]îÇ‹~–ߎ/vwÎív›Ê˦ÙÝzÿÄs©MBEZÉåF©½K³¡h:ÒFˆÔh˜L¡K3*ý¾ð:ÙC"Ò_9õnšX¨ÕJ"… dFWt¸-"[‚ºêf¸¢- êi|¡JzCp3Xùí^J}h%Má…eìÊ u[çŸJk”÷Ø@$îAc#ênn+O_·ÍÑ)›ÀÒ7£FæSF/ßÉ ÒIbXœq(ÞH˜ÿ†¸>lL€…Ý>Ÿ"F ·dI­¬2 ¨O|2‘'A³þ U„ªÍ¦ÿúq¾?7ÃSvÃK¹'á·>BaL}ÐP²P•¶—e3 ¸Žµ›äòmâˆleD‘[q¤Öz‰ujšl²Ù¸,Þ\ÛÓðx‡¼×ðEÄRRR9 šŒ,êÖÎwþôßäsKÕ NÉΘ]’òˆ,N(þ´>:®Åöž¾ˆÛÜTˆ/t…ŽÏ¬27´šÆÀ`ADGmU^jÖŒS¬èK?áéöÍ+¯Nø[ =B·ûžb¢»+€Ú^Í[Ù]Z«G`™¢£ƒ~ï¯QMóì“Såy³2ç¼´ðs,ÝE¼ô¹T[0±µÑœ æZª%*EYBV õ÷;‚!âßÎ8ÙçÚ"Ø}0MèÊ!p»Wt¤3„Ôzû.=FZý› LT=€!f¨÷ÎV„tÖÈ÷0ÒXéXöйŽ6˜ñ[È›ûl*ƒ!8ÑÉ&laªЦi`‚÷MóÆÕ62Åõ 4ÓÕî¨CŒsq‘Dš0,,Þ6›hZ?±<;úDfíy1TgšôÞ†ÐãÅÅží¸™a®&Dj3M~C¿øý¼‡ùâW£™ÁT¶¡Êu;™zè@*ûñC­ãƒˆ±b‡ÝŸ&LööÑd™—gה؟]‡EøLVn¶Ïâ‚óâ¬Bá?!šÖ.¡%Ó+Ëõ]O‡UGÇŠã êbü>ªR.úµ°o2SŠA fÈ6{K÷{vPø^“ §ˆd›>^¸nǰÐaÅžL#ôcnÐF³\pen¶íÕÚùú‚G‚ŸT60ºæÛº¤ÕóUÝX¥ÈoÁˇN!ä­š=ˆSqB u¨Üz^„4×µ'â:‰Æj«/ñmB,öÍV /ÕFŽkcMøB láj¨JÁ¤¤ô'—vóï Æ…+Ãv‘:s+ß¼NŒ±³æ`o3ÈŽ¸Ç]¶n¾û3`}ð#ƒ‘sß#{+šæŸ>NÁ½˜‰uÜ3Äšþª›SÂÈ É´[t6à ¸ÌT´¨ù$è¾ÒJ§Ë©ÍjðÓI.î¶ áa?ªÚ.²ÖõJÖʼn-| §JøáüÈM™° Z;ñp´6h^&Ð&†q—›R“Ö•ýÙPø.ϳËaµÆyVm~XàÝXC˜JDV-jOOb#Э›%ù3|&”¹×avÈHAÈAuÎò>BbÿÀ`Þá‡ò¼¿WèÏÍ8°**¡Jn·wÌÜF?0èWì}ü›>·s+b~>[Êôw‹©_3XVaå=óhØ2p¨‡„3;µóü¢W0±àó»TӆíïCHXð~¨š¨ÅÓ·Úžë$攜(–wbû”‡üIÂø¿áŠyÓ°´`'NéÑ&Q{Ó)·/å)nÿÜ&ÚIÈ5³¾ZáýÔùÇ"¤Ò¬@¯’©ZÕm`ö–ã!øÎ­¬Ä)‘ ŠÁ‘—ÈÄP[Lô®o‹‰n¢jšbŽšMí q°ê}ƒ’‘uñPŸkuMXŠ2å{bÄõ—t˜g÷T¤wJadð'_ÔB?«{]îü)ŠÙgÑç^ Nòèö­eåÙZÊž+Ù“™hçsªñÆÇ:…ÇŒy¥øbüž”®®>†Ç%wN`YS7©ø¢··WÏ£Àaô&eW˜ÐÊ“"¸WŸúöþVüKäj{µ²,àÌÚÖPØT#¡}|“âÈü“y;Î ßù”—ç›ËÀŸéh©Ò<]0…=\5Ë=Òy¸¸”¡ÄŽódžP;cTF’ãjÚ9=瘭\KbåO'á4ønñ<ä²Gñ?i'Щ]¨©`†—ßÓí.Ž,œõê†$ªézIûöz/léÙa ô||ÒGû¶¬¸ÌÙг_±±Ëþ¥Án8âf×]=yË÷yþ‡Æ¾ôù´‚;̤´úÅ©‡˜§tÿÙYèJ¯å$”äÍú}to,Ycßφ€¡à’$Á–9c¸ eÆ„°P'ºuá®ïàe§‘ʦgEYÞ_Ü‚µñ>SÝ\KŸÓ¢u*LYä"ã|Ó#¬‹äßoâE¯Bdo4ÔMÝEDwÿXÞ‰¦]ňØãå5JããɬT¹Ó×M™=mø]}l†hŠ–„eþã£Ìñðˆ@ÝôÏdß;ÕïuŸå¼–°¥ûGÄ$¹É„“ÞQíäÔ*¶©(²H å%3ËíôLœ¿|ã¢)o¶°‘6¡´J½#K¸ Æ¤\ä$Ô?zþ-C,fgá¢).7a³Ï‘üÍ[(‡~OP\6ö”ÊÂáðÓȘ1²ãn€é× &Ö µÏŽ—Ÿõr\´òôÉLLv}M›UvÊß„võ«ç¢5KW­×QŽNšC=m%ä˜zèlGV3ª§³9 XÏœæýê´1Ü¢ó®:üP È%V%)ˆ‰Îm:¾áî“‘ß„¿Ã^'©¾^ñ“•›9è´¸ùÙ Q[Üs ož‹âhósÿ¤¸Õ2^ ¦öl!KÕ5wÊà×_%Ú¯|– hÓýU""Ó¹6p¸œ,Êí5G€¾²ôñ"XUÝóþHâÞŽÿeØàøëœ5ð)_e-IõÓÞ/ÑGž/÷m×ò±@ùÚ·uÿ’\Vcј<ð;QÒD²ÊÑvç?Mˆ"ûÌäÕ²&v=œ(<š3ДŒƒbgl÷ØûÓ10‚ùñ¦}Uˆ ÿª¸îË'ÄyÆÑ²MËÐÚ(Ϩ§ey…%ÞyRñÁ88n{Ã#|L¹°2e£"¿!¬\FYÄ©w³¤ÎØRP•‡Ün„± ëÏ™„øæß‡-,v«ÈT/›5w#õ)>÷ñ¹ú™rí~G1² èëfnr.:þ!@ÏëY5³TÍÆæCüµy@ïè°m- G„‚õ[òdnÕ ë4(£_Ðf›ßÖ¶ÌÕЮ­aÍW¿òð&) ÙÙ·ªûZ/_7t˜5œ^Û†,b¡Q†²ËÙzN~âWG4´ˆÅLsXÞm ÇvÞÄV]Ô5Dæ}ïø¼_¹êk³´Ô"`h€W>™h'6lÇØp6‚òá“J:Còñj;ÞcŠðrþß¼)¢—0ì}V·–$ƒð·:³ÚJsGKŸ™j¥zՀ娉ù߈\ë$é&tÃkfî•þe®io:ÜÚ *èÕm_¸a[(gÝü2J´†Ø”ÆJØ{€c2ÈÒ×Dýºw´S5âÛ•x¢qÝ¡>Ú ›Îîº?Î/³ß’O´—”/—ÇŇÚ(zÐl©ƒÅb2²Soÿ¼áH_ß0isYë•óøÍ=R¨!£Ç¢¨/|K…v…ƒc^Ï¡3Ø$±·e#ðæw‘20H þþÇ›@S~©À†àëEq‚&GE¥MHÖHOÈ‚ïoà[Ä—áµ=!IRܯ”Ûf¢9a±vS4Ø$0ç‡#]é5y =z5$éÓn“ðJ‡ú)°€À4u0Êr2’ÌñªÃÀž6gj~ fW84mûµò¹¹!=Q ¯5ÝãcâäG–íô¢´+X²¬Ý g|³»Ì†Ë Š©ôSF)"rßøÉ©û·™asrp \ÓûÇ»ûwYuß{53u?Vë¤~ eÄ-Ÿ§l`”£0Ì Û àùšqJÃJLÊ\o`65CŒ­)¬,‡wÆeYà‚Ë·/¡(CŸ%"ZùQç¸Ø‡!gL5k k;y¼Èæ¶ØI½…~¸Tj¼Z²Qœ!± ±˜¹þq]êþ×ìÇÞŠw2OB%â‡Ç™Þ©M;—ßÓ¥¶þ8g+6Aãiv­çpÞµ‘k© bÜáÐÎÜuhŠvarm¦¥ü>DÙ¹VF]é€w“ë[õÈ#zlxWÀ¾o*ÜM_ƒ‰Ëï§2Æ´-Fš¤ŸGÿ&†Ì1µž! Ì–.CÉOy¹ogk%Äψ½ù“ãàj[¨•4= R»MÇCƒpÝz,½‚ú$‰Ê¶Zahì0LH¾šRiBÅ£B:y¤—ûääÂÒ²wî¹_“h=ì¶ÒÈw{(EF&wÇqú¢/I Éø72scT¸ê¥Íì}“ˆ´ÚøÐ”Ù‘oµýö=ðîN¢Þ2Yu\[Š­f0„íÓáu#/éõàéo4wŽ.£MHá êÀuxKóøö®¸Ÿ8½£q£ŒCôA6ô­Ÿ™±šXÞ m+jM˜–§ß§À€‡3JÞÐd5üé¾%ç)/l,«CâK‘Tîì¨ÙÒoD\¡ýãí¤¸¹ì™{ã1ä5PCÕdËx 6\@:ýH÷yÂAzBìNq„öBɶ³EeWc±ÜÙ¢¿:VÆËM :9Õ¸…7“Ûò… S¨ºý“÷w/δq³œ‘{Ç”55Ø67¦•‘¸ŒmÇ„'Ñ4lß+µÐ6Ž÷0‹ƒ›-u§N‡Fº”аƒgái˜²„+~º<ÝŽEb”Úê¨Öˆ‚úfj 2RæKuïj)•Ço–ÌÂWø}fúÅ|p1ôfíéÍÁá s›ôÖ2"F¦iá¬î§­¸Ç¨ái{®á€sñ4}ƒ”-æŒ=ÓRý²›ëw›çîî¡[ÎA¾Yyd.¦~ÆÞ|­­š}{–4<§€'º+ I‡NãéÀϽ½±~êÅŠb/y¨U|M¾AhÞŠv°*š˜Š ŽtIfÃ~Øx<±£8Á,lìKÈø™±‘qùeµ‡&@·CnVÝ=kk.¹¡ #âýH%V°$ò‡˜u¿;ŸÔ™·„‡8Ò'I‘¶& vGMJ‰L×·ÎÝâd„ãÞ¶ÖùÁ¿™]aÎ!bFýá´^q‡‹­!oƒ eU’ D53ž¬Jö1Ç|I¾\wkmY¼™«¿¸R÷\¢žûv5Û²/tš« yÎ¥8Òµ%Vu°ÖéÊÙ5¹xÿµ,ÉhCÚ9õ†›m:ÿ4•¦@MóHíô»Ït¹Gv×ÞûQ¹@ÖâŽ5ÌŸÍõ3ÃäÔ„Çð¼xwsRY"93ÓQÍJ0ø÷qÄ57¶ÕìçÎn”<|ôž,ãÜæÓzk0ì¹Ü ^][@Ö€±þKØ&ʉƒ1‘~e:`é ¢"¬ÊùЍÙÏTdì;ÿÐX{6óÚá·û»n:n·áûH¹Ÿ˜;;队¡l*NYLZǯdP`;ôæ\·‡In½ì“Í>¬ŠªJ%Ê\½Ð>ŠR<á¶Ú³íèõV5(ÊàÂu$X€|¸°%´[IìO}"þdh߆Oõ¥î#ç,O™ïÞßT=ÅÕ4MùqmŠx{íIát)ù<Å娸rÐ%1â͘n+PÓJ(<×LÀ°NVð¦ÒáZ]i„{ß­ðÑ+-Wç…ÝIw-¹@¼¹d@O“ãѺ[<œüÍ'š?¥G²ó•WÒÂêmaÖa€pÁ×vJ™x[péýÄ,ÝÇ$ø¨8, ¹Ò¢îxc¶Ìp6V?‹ÝQé[?±±é!¹ÄÛ§·¢{)Šó1Ú¿é4Kü•¤GÆV›DÞ8’ÛGC›c¡ÝÖŒâg üF4ÝŠMü˧cËXMïÎâ÷ûSøÏa üs¦8zÚ‚<ÙùôÕdI®½_SìÙ±üͽ®EÙ”dìå`í”:fÈ y#VÇ_@_Keª‹n\FP ¿«KŽ&®’ÐQ»\ÊŒs±»’¤=BŸ¦ù@åÝëdÖnR(Ж¶fp+É ì¤ÿXØš³÷gÙñŽ=Èøèf,b‘î·UŽC:aÑÉýEqÕG‡.B"k¼šaËû'RÔd¹³oæ‰jüE»_>xóøxŽ28ª=¹Éâ”‡î ­ÍÖ.yê2FP|qVVÈ«+è¾ö\(‹eŒ¹wEé;fr7Ë\(­ê-$O£ ág^'"Yöº25ÍE¶÷°vll< ‚+£zÜOi ûiÑhÆ79…Íd¾èa|nYuÅuIúX¶ÔIÓj_øåKÄ@¶‘¨üô£†‚êL®C³m::Ë\oäCtˆTñ {àœÛ{fªãéÖa¾•júNéùê&YäLÜ‘yD ï­Ì‰$‘†rê:Ž3*¿\{Š3= cŒ³Y=Å ¥ùe£Np]Ûf9Ê ú0EÙùLgQN Yƒ8¹u(÷d~>ý¸+Ö,÷| ~.f\ø§Óõ]s_­<¤e:¨X.ãÔÇΫi¬&‹Á3å÷±«´ºf#DÁo¡ö´^xš1ˆWbã?ˆç7°0˜¸ˆ'bÜjÁxáÈÿRç·}£± ÃYÿ’”bU̲'¦éŠ×uda}Ðȶ¼Å&wÓ‹ ¥žÎ›$F伃® lŒeƒM0qÁ†ò\¶?%øþ% Å‹ùÔ^¡M}Ð~pËs`!ÕËâx:ˆ3æÉ4öÈ«šÄ8GÂ[Iþ¸]ôƒ!ë°³Ö+2ü  ¨*•Ð%˜d^m² 5j"ÍCô©½èƒk€JÍ7·Ëžë…ËŒøÒL¢éTŽ(w*˜I3^t³Š-<Ò÷ûÏ»$…8Ék@ŽðYœ(í¦q>GÏþì»û?óë6™¡{žf9e’?üTv÷Ø=²Ã=ˆ$%~—óÁ¬Y¸§› 96¿_Tª"°\B ý3ñ±ÊŽæ¾íað+©íþ¥Øoáá5ÒÇÆ›åzAgbò¨#Ѐã—N²n Ÿ¯Qû§¡;qþäïÚRß*³=.ùê?7q–&®~]AŠ,礊¡;µ¦ÇÑeŒm@mü¼ºÞ\s÷Ø6GAI2vL¡˜9qP_ØPÔ”UÓÄHá6¿ùî³vyÔôØO¥Ã2…V(;ïÅ–ø,õßÝV$N×W°¢qÕ``a- IN»î&/Œ—½Z¨×½#å§Zs®rÂÀ7ßxv÷½0§s­S¥uŽ2âc)ºŠ ÑYÚk$¨‚]§üÝÆhG°êBã–º>ˆ± FÛŸ`Þ– ÎJ0wÐ ¿1’?iÉé-–ã: ®Ê5O£æ™æí!+¶|´*Šóæ Ú/'ÒáÝUÔÊoHð$“=aÕ3E¡ ­†ó¤ñלE:jFùhëgè±àÌIžh[G¢jL˜Â«éÙÔE*ŒˆÙh†;_=r®æÈœxï·µ˜Ä R)‹SCôÂ#¤°0 3 JÐû•q}&©ÿÌntwÄ ¤ªÚ©áMîD~c-¯%v,OT¶äÒøÍ§^%P3¶â0±…䟶u£$üçÏÞuƒxÅÞ‘÷íšR~wµó”ßL}ÍŠ¢ï#joÉŒ~-ODt£‹B¿°6OÂß÷Ñ&Ëec¯ñtR"Îâ —~Z÷yåŒó,“FnO1ìFÊ5ÛØ ÝöböxºüCꚃ5Í'{iƒÁXoêV¹`ºwTªZØû•Ö@ÇCzˆcg]Ç™°{½F¡£¢‚RylplÖ.ÒŠEå¤JöíT´¡gÇÖ õ’Q_Ph׊«ÑÂøµŽÁû‘«ï­AGµ®µß~_Gô¾ï„öÛ/ûþX2pÁúX †ì;®ëT7¾´ý#è’ „Ê+’¶aŒ›8ŽèüF® MÑ]þô‡$yÓ³:¦âÛ«áØw˜¿à]%¬Š9p\„ù.H•Õ<)¤ÖÞ«î`úŠÍƒ3M¬|S‡T‰Èî5ËËà¦`{üżñÇÎ?Ëÿ®µÐê}´‘)®A»(Š¸Òœ8vo~*Muݨ;°>ÝyTýÁX×ê ˆàONÀ™:á²iù¼ìVÎ9½#a~µfºÞlh±C*iGžÕn¹Y‰´íØáMö‘MŸb¼”yûÍÃÁ;…`¬_éIå«”=Ô㎂š™jab5+‡q?]»žÏ3ƒ÷2Ô<; ËYýnÊ0 Ù· Ä"«néÃB$÷‡¿6¢dåpù{ÂZþQIÌˉâ»÷ÉZBÞX³› œªˆX»!}øÚÌ8NÀ½-Ûôâñ¤åœKA y¿aùr(s÷Eu¥;áf„Ö¹fݚǵÜ£Ýþµ(òÊ;˜”˜ªl3‹M9¸ï†Šä×G¸+ٳϘ{Cõ:ÉB1÷š wwD¸™V”5™ïnÙÜ`*ÖUeŒòú×`Æ:›&H‚ñ26Íyã¼ÜGkP¬ÔÔz»tÑ%×Q“Uòâ“@+Ï-­›‘륕äÓ¨·¤#‡]ñШÖìY’¢µ~š¿àÃ}VéÎÇÄmÆýRíX{Z1ÑLªÛײ*Ó>Jì6D^E£B0Ñ+K;¼ª·Uÿd VêÒê” %:šéõ;ÝñmQ*!…®·Ö8ñ÷œD§…­ÑÛ25ÃÕ%±êî¬ÓߘØívñÓ`æ\¤jÞœòQ8>ÿé=¢²iDâóŒ(eµÂ­ˆ$°5V{1$oE\£ãÈ`¾ÜGô-­qük_*?¬ØZ Ã»<(s…ç{zÁŠÀS-u‚Cßõj‡-oü[F/&²4¥Ai8<£ØNíÒè (¥Ú–jÉ/¸CÒWìH#hŽý—VÙ wM^0àŦ®²Ûç=gH÷Y`Þ,ñ©}ª>¢SåRfoŒ¿|M B™5¥ ). éÊ‘ËKÚ[q}s…þ}J֜ŠHP0 {á·ä”ªVE÷|ÉÓç zLƒ >£R”H{ §F(kGIÔ`bEûüX7¦AŠ@¥÷mq4¦Ôþzæ$ÙÏpB]»÷ÎW¾\^ý«íC5™%o„¯_ýQ't¿d˜0æ9!é{DÿäºÊs»À¶uE":CÖhZè·²;»"ç`\1¥9´@‚B‘¦ôXÒƒ¸o´£u÷)ܿ㋰硤æC¾ ¹êªœ‚?Ë<ØTgÂ+šy%àP/ϱF¬³œ\ƒ¨Š§¬³ï>ãaØbóÝե̖ڴˆ<¢; ¤ê‹íC?r:ä¨.o,uÇÓ¯>¨À&õàš=ÅBalÒ91‡`½•ë9+<‘&rU}:rˆT?Y*ŒW0_³0ÖÇ(ÿŒ»p»FY5ãܨlžRùâ ¾ºÙÓ0§€jÎhž*„~$ÔCÊ9µç~(ùÞ_É]»*ðÝ ²”1¢ìñ|E^u…@JU"þ2æ=Ò¼ÖÈYCé„KI -rxÔóE,?9/f#SÌÕˆƒiQ72r“^2UÊäžYìΜbVÝxrüEI' ¶~SpÄßqUù’ü6C?Ÿ ÌO¾U}f½ùxÎg‡ÙüD.‰M;r¯œ¤ºýø†»aW ù!A²Õ0^kÅi»,n¥/bÖ£]ÃÀ ·È¡ú[QÛi´#÷]ĉ_,C¢ý]  5–cG¶oÎ4ïÑIÌÁ¤5͉ñDÓÃ÷Ç0Çèò¾w^`S2P}›ŸdÂ:áCôÔÕ&‰Ç—+Çä–¨±:9*8·¬_4‡é]¸‹Ó¬4ÈKT‹ó4’¿k¥ b(a"M%&Ìj]À e±—C_Ÿf¬ue@i©t.¦L^ú°/ ½ON™â0´¸çjVÄKtžâ‰$T+ê­aÒFØ ÷Ð?èH!é8 Þ0¾SŠÆ4 øJ=Èk v ßJ&+¹›|¸,Hh½B@NOÏó¨ÀRj›V)>A+ žŽg›š «û"?î<´W€ÄPÙÇݦ½›-,L‚{¥q‡Æë. ðôžUÆ™DŒ+– ̇V^PnvP€qãhÂC®ÿµès_¶å ˆŠt4.™†rMºdVØ ƒÙ]³óëÀ±*†‰š&ò‹é]“Ö³G`a)¿sHß,Λö–‘íg©¬³q«%£ çïQ,fR8Ÿá,/ú“3@јù­Þв÷Ü: ŽZìÖHéû¸Ôí°üã¦Î›ÇÁj’èœSÖväÕ穨eÏœ¢î •Gðotêäótië`éÕƒPæSÉϪþ-ÊŠP‰¦‰í  ‚M©Ù‚UkaŠu «ëýõ6å §¹÷‡u)‡™û“¼F£ò3<€”&¶‰§²ŸÀ~Íñ¡uúg{=Á³3½¾ñnÜ÷¨}¹ïÔF‹gê‚S(XÅÔþ()Üøå)L®Õ¢ST‘ apÄ:@ùȆéV.•f!|LçNâìþfŸ¢â0˜5ü}{¢,^ÞŽ cm'%\…w;¾•!“*QÑxK£Å@Œ®Sl;Ä™mräº|7€j]?',»LB7Gç,!=×êÎëq$¬v®Ú4ùzVæC,?jT×l4‡©øt!ò†17f±°°ïÍLßÍe¢ms_ªÕäžbàæyÙOeM?‡ Ö½¶OšÌ™{¡iûáNTô•SŸÐQ‹ÞW8»Ÿek±ŒíyhŠ ¶Yýšþ3ÿ`¦0xÀÜYîøèMeöòæDnê}j|_`Àƒ£••9ª\,i lÎdá˜èK…G8¬“§¹òçvR£7„‚±/”¼ôsñ’Ç~—xDw½ú‡ÃR}jõ·ž»Ô%Ô ¨ ¼V­ëd²-ÈOˆ<ÄþŽEû2¹»Fîðê×c%p¦8"ZAZD;asR[ðä3ÒÊÎ6ýø£q­Â¹â?NOô gÕwb°ˆ¸Vdd!Po”¶¾È˜MÂMÿ’ìhåÉ$Ò~Bò|´ùQv[øá$~ÕÜŸxB…ì1ö0ˆ‰s¨‚r5j“ÿ%HgÂH(é=‘G:@ôš§ÉÛ›]>)Ú·ÑùÃé Ê Ÿ[cí`Öî¸RcFø£N—åÚ9û}-1É‘£zr^><σåì_‹¿FÑb1÷ŠJíð.%Á“–¹ý£ý!׳`šíT§ƒAïoˆŒ­EçGÚHãõ89³âˆzFBõ#â!(²³gQö|cz÷º.CJÕÂQÁƒÕë6‡¶ýšcÜ+-“#ž™j uˆße>ú\wTT)!ßcʆÜ2},ªrâ¿— Ÿ¼34RoÕÇK½àê’š,ѧÛ/ü-BÁnQa;ÔÈ^„p*?ýé{36Ë $n"EîïºRY¿ Ä5½zÏìIÇ05”&¸â€¨\¨twé¢a÷ªºu:é“~&å{ÎŽ1œ ãd6¾šëì-jsuö |\"¨­²a(œ¤•9ÚD5äêËjn{9Y­§7TàP2./ÑꨇjïZÆ6ÇAüºÅL I ­üž °2çB²+lVî¡ r:1Ž ˜{âäîÕ/ÛaØ7ØÐ"U­<än¬™€Áú€¶œë«òàÔ¼‰G-¿Ð• „9« 0¶1ÃêêÎ7æVU¸N?1„E —Pp 1äÀ!ÃgH{F,ùÄÍ ×ÀÒF7@ÑäÊxþ¢' h=Û0œ}!J@0=L‰ÀéLe¨ 6YòÍÌå–ØÔ«pjOÁçÁÜJmÏëôßÐ0zR͇¤z#j¡šñ •|~}n%’eA ¨=Â{-/ `Γ…uv»C`c@–º'‘1öæ}t{Á§»:qI좒oGøˆpQyŸÐÖ6¸,/¦‘>ð2¬'K¦/©f¨C)•i+tÐw‘gëå³tSÞ¿â—þƒ£á]ʃž’Á¶®n‘ƒç#KŸKÑÒæ›àZU¬¯›W(bT]äñ\â3ï*õÓ“Œ½íu¨ÌŽZZŸw°…ßÂÈœLªôê©°Æeaû„*>q7_¡‡¼- í{nR=Ñ©l›“#”èc~ ‡‰¶‘gìÏ”§€žc!áì0Ðn²ZÅbLleÐQãu£â±%îýp—^|£ß"A¿`¥qÙšBæÈ \4øöó@³½ÈÞÊÌGJ}´èhùHØY6‰@bœé`ýøBùÿøÿÄ@k±ƒØÆØÁ åÿ§W_Î endstream endobj 89 0 obj << /Type /Font /Subtype /Type1 /Encoding 2454 0 R /FirstChar 19 /LastChar 122 /Widths 2455 0 R /BaseFont /LSANMR+CMSLTT10 /FontDescriptor 87 0 R >> endobj 87 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /LSANMR+CMSLTT10 /ItalicAngle -9.46 /StemV 69 /XHeight 431 /FontBBox [-20 -233 617 696] /Flags 4 /CharSet (/acute/numbersign/parenleft/parenright/asterisk/comma/hyphen/period/zero/one/two/three/four/five/six/seven/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/V/W/X/Y/Z/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 88 0 R >> endobj 2455 0 obj [525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 0 0 0 0 525 525 525 0 525 525 525 0 525 525 525 525 525 525 525 525 0 0 0 0 0 0 0 0 0 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 0 525 525 525 0 525 525 525 525 525 525 0 525 0 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj 2454 0 obj << /Type /Encoding /Differences [ 0 /.notdef 19/acute 20/.notdef 35/numbersign 36/.notdef 40/parenleft/parenright/asterisk 43/.notdef 44/comma/hyphen/period 47/.notdef 48/zero/one/two/three/four/five/six/seven 56/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 75/K/L/M/N/O/P 81/.notdef 82/R/S/T 85/.notdef 86/V/W/X/Y/Z/bracketleft 92/.notdef 93/bracketright 94/.notdef 95/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 43 0 obj << /Length1 1948 /Length2 11334 /Length3 532 /Length 12418 /Filter /FlateDecode >> stream xÚíµUX]ݶµ‰»»³pw î®Áݺp'@pwww·‚[p·‡ Á!@­oïs6ùw]V]ÕSpÃÛfŸ½µÑÇ`L 5 qK's Œ“£; +‡@RYS“ÀÁÊŽDC#é 4s·ur”2s 8øù9âÖNv¯7¯'7 @ÒÉÙÇÕÖÚÆ@/ÉðO@ÜèjkaæP6s·:€{X˜N¶@wV€8Pÿç 7€:Ð èê ´dEâàXÚZ¸ÌÖ¶ŽHlÿ’w´rðý[¶ôpþßGž@W7p(=8$ÑÒÉä°Z!±©8½€à$ÿo„úïæ2 Š™Ã?íÿÒÿí±™ƒ-Èç œœ=Ü®e'K «ã—êÿMhiëáðßOåÝÍ@¶âŽÖ €ýß’­›Œ­7ÐRÍÖÝÂàîêü— t´üï à±ý+›†¦–¼¼Ó¿·ó_ÏÔÌlÝ5}œÿÓôŸâ1ǃ‡ãjë 0`gegç‚ÿ÷/£ÿò’v´p²´uŸ^€™««™ø`€‰ð`ëh ô½ÁyÙXÜÁ¯À#ñX9¹"ý³›ü63 ðþ‘ÿ¥prØ,ÀÌþ£qqØÀM@fo¸ÌÅÃÉhizùÿGü÷®ÿ¯ÌÍ`s6s:‚€V©ÿ£þWñ?þNoîÜ<6g ã›Ä ~ìâdù&ñØÜ@fn6oÊ;›/ÐÕéMÇsr|[*8—»×Ûsp"wWà_à…[Ùzþ%€³¸=ÿŠÂöu´ý»ë»rú«„ÿŸ—lÿO•캹½ `{ ‹‡ÙÛ¹~O²·6ÌÎ&㹤M/»¥—2UHã³´ÙvdÐ_¼¤ä¥bòpÂ"çéÏ^å?¥R¯„›Qa·ç¿äF»pp‰5Ê݆ ’­]0}Ì¿–¥DßáXZPzŠ.¢'í¬v*¤”X;\•iU´ÿƒéÉúïOL`1rÆY_2çfo³Ž1S,FÐÒõ§£r­ÂÂJ÷°Q-áqO'|:ž!æû­8†2ˆµµ|.ªñàï\™í¢ªL~7„Ê$§dkQV{r_VúSG99Ò1ž$‰Ã9ÙöÅ«ä¼Ð/ç=Êip¨"µ…‰Ä`Ã3Ãáe"z·ÜW`{ãwÅ:ûè[Ýøs>båd0lhY¥ÉP$ †vÝgÖ4¦P»n1Ô÷ô47þN0QROÇ^$Ð݆W@` £Ã(cÄñKwb k!F>4Áœ…õ³z^$éhñú(ïš’*—ËÜÏKAÀ`õ-Éѵwïðj4AŸû¢XtòøÜ;ÈqŒ…Á«–dMòsÄÎAq0iÀJBBG?š†Åò³)ŸFŠrÀ§±þ^ýÙNÿëLAªÏEïÉëãøm÷àA»ì|íÆÝ_*Ûsº8½BtÒ~~±åd‘I)AZâÿÑ3›eƒ›àžâ©JEñ3ý½xË/'Yà¯k~"K{öQ¨†ofµù&ˆJÕc@бpÅ„:ì}ñPA³Ùâ2ÙY¨Ò'ˆª-„•¬å!žTû¡SØÔ ë¯v¨c¡Å fL¿m´“³±Üfþ^6ñ¸+Î3¾B8Ûg؈ MÙZ×ûY§u»X¬¦¹Å¢:*iB0U6²¹vEB‰¸^s·™ª£=ŽÇY…q“®4>y…"àá;T§í$èÑÒÍ„mÛö$¡ƒ…#ŠÚ_ÏùFk@ßea,x–ˆÙìcO â™êé$Ö¤}ðÝ—;…¡:8‡iˆƒ{ìNÍP_B°.)'¾m©²xAÇqˆ—D·¸Miˆóz[œ–™§ö;ûjA¦÷ú“}¢#’6ë£õê;ê8ˆò¾ñÒÿTÀö¤Ð2è)ÈŠ`–•€ !4&µKoVßh®_ûäa¯µšŸ£åND|P%2=›áÈMõÝ Á«&ÌdI,ENLI`s—;)¹÷!]q.ú§¿ÃÖ"ì-W©€«¥«oàùp$óL\°ËI;Pý:DAûÝŒ'ÓŒ§[z­à¡…RÍœ'îïÄéYqÌð²ÔîXôqÆ!l¨ÌËPïò6|€œ‚öB H ýÉcC…€¾[êrz± &þëÏZæO­Z¿„ gԬʌoFÙ8ˆ$%íÜhÊpܧ‡/)ÄRl#†[(ñè£liÜbe­ÄÊüŠugöíIÌ”34}“a ©L°º)8¸œ Íî8I-cü¶ÜV1ëfiE$pB)ÅÇS? '†J§9¨yp›õ0b N'~Ÿ’KV>4i¼ž("ÕªšÜÙĪןëo{ñ7/Sk0!³è·Ã¨œ È?=7 $KRH©ïÅßÏÅ6òÝâdg¢ꔡ†Dõâ)BWþoönˆ!¤Çälë̃Рßú"|¥Û團ÀÓ3‚C¹Ðƒ÷ØdÛ€¥óLW ¹.ñþûâûòlñ\ÿëó‡Ú߯_ÑöûÄrà Ã:e§§ÝÅoAs8N"9Ž™R¶‚óQO50kŽðŸJV†ÐÓ̺ƬXð:Z‘Ýó™ÔèèU‹¡!ȤÊ_øk”&Û!×&™¾®)ûvœm©û£§6ÑàD޲ž¼_sïÈJ@ú žår¢-ŠôÁ["Ÿ~Ç.ûIU?3³÷V÷“]tš¤èÚ\Æ‘ŠÞ ¢Ÿ[Þ¼g3je[\?gë®pÀÏRt‡ Ÿ udöئJiQõ¡ã#f$†ê iä]ëÁ¢k"Ý2FëÚi¦“¨ÆfÌõçXœW±ú›¸Wê ;PÖ“| l†È¼:ì‹98`Ço*(ñíâç'íÏ*_ëɪA@šÖ˜‚’Ÿ3ªô’›û P¦SÏñOÐwÃ9bïöÍYƒÌéoR½ƒ¤× ¶Rˆ´@H¾º£ç¦†³N€Úç‹>ÚA¬Ì> (ñ\@¼mØ~)Ñ:œÔ¼£X90¸+eÒ<£3á®ïå%'úýç£c#äÊ»ŠBµÙ¯µ >BƳO+"$æèZ¯§ë:ó›Bü ælç‹ÞHžxOØœ8„´òú¯äé\f–˜Áõ®9¼Ü„ùT»Å0Î#mY?g-Æ3ü<ãá7&m;3 |}¦GýÖ.Ì(€*7+-'?–D«Õ|/*^àz\é–¸g™'³˜Ôk üÚw7qš?î|ÅÞj0ò‡±'!‘¥ »F ËofKš#·w~§ü…_½d¸ö¡Š—×_£ÜªØ´o¤TŽË® FO¸;$%%¯ö*”"J“0A`R4dÕfÏP83è,ùn'÷Ó>TÇ#WýÄ÷,‰o Å(UŒ}ôMQâNV½‘Ñ8Ôœ+s³â<ù5}”NáG"‰(®ÅÉxÄ4lQvßk¿¦‡róÇzh:ÔMž$nÿe ~¦ã·l¼-¨êŸ ³nq º¨þ*Ò•?xë*ăÃ>_<“vŸ»Oè•¡µ(‡¢e;g½³×ùƱJ‹š&•(*³ ÔžXö™ž~X‰³³ç!U¯·˜ú—–3ð¤CèãÂpʧ[Ï“PH]ìDV·/FñïN©ÈÑ)C¾?æ ј;îñ«ZäôDÔqˆÿ7-Ì£ûX¼×;àQuRpA\?0X¹dúé¾/†„Í¢jçš®«UDëµE”\­Ð§Hh7§±•)?ÄgÊÁê³¢·’OE„~ï Y¨L-ô°tb¿ã ›Zw¾ý›H\ëv¾ÿÐácÒ%©Yö‚î̯*Mb*ÌÔF4hš1«€FÕË:ߌZÇì9üq2fè½÷má-­¦8…©}¸A {0ö›ÚòP°­‡iHWã+ CŽF_»£.XwO`¸]9?®5ö(Õð}Âé‡{Q›äw5=¬¥ÃÓYpSˆO¥ºöcRð¼r4<7^ëFÀŽÞÑ…«CL¦¢ûÁ ÿÓîèyT› ]_9^9E Î4³-üs‹gŽI|ÛXÿ×Ôc)¿¹wÁËBþQõ!ô³F‹‰éןíéÜ‚+8ÐD©QëÐ[í>¾ßÓ±áµ& ê!\)æBÿ\Ê,쿚(Ô%ƒl<‹™¡¼±Ì²Ò‚ˆ›Y)+Š×¤HŒæmð^XR”‰3—ïÐ…ùÙ“îõÎYdDw¶õ¤ BD»æê['q7[I"c¶O˜7ôP*Ý è¶â€‹ýçäɯ7J#ï’wµJ *ÒreŸ³8E)jºëÌ-3ëás¿ÄŒ¥cØöôäѱ-#P¸c'¥ø¬Ý´6¸©iÔà,å‰NbܪëxËü }Q‰º€ö# }.w\¾[=oà Z’0A¿0ã½LD$½ÙDaí%­kÖ|$#m–Û³ûž„§þK2ªtéKÚŸ®šc‘˜V3ÉаÙâ!Êrï²oÁæô‚­Tœ»ƒN>\ü“ªL?š›0·ñ-–R0`‰Ÿ£|ßíkaâj4UŠ/íîÿ«n—&Ñm3wÑÐ_ÔJœ_EãÈðÁ²û£Ä¶º/qº°lBÉþ]Kª+pî}Fp¶…H k^Ã.€:Íð»gm¼ïu©&ƒyÕžþ cZ¦eG4ÔË äÌ -|`èõNÏÝ—; ê1 ìK{«bÎ4 – ¶‘@¤DŠ@Í`Èúáqs¸ËªÂÂáé?XM?®ýQ&]p–„'nåëó/¸œ›ºO•lSE„îêFé–0iùa,š·Ç[x}‰ß;5 7/T0}œ”ÔŒIžb­³”fû OÐøÄ9˜qVZ©Ñ"eÌßãÒ¦ê÷k@F†€F’Œ’/w2¡Û­ “A@w˳սu ÅÜ«“ oWègÞû>£v£t¥ºó9ñä){pœÞŒÆQ€X×D°‘ÍÚé]®ƒh¤´ø¡TmG¾£è*É´=ž‡—“`è)»+Òù¥àfªQÑõÝÌ‘„ï'É«H¼dSÓ˜ »•ê Í.sûˆi`~>¦ÝI#Y GÄ®®fÓüÍ,0+]ÝÑ>àuW [fyD i^žïâÙḄK7Š 1îyÜ‹ÔņG;~*wl¨ŸÖï7±{„“"›¢zXí7põç M“SWÓ-Õ,t Ó±÷>Ì[æ}XÕ´,©OÔ.m–SÑOì'+)è@žSʈŸT –Ô…Ö‚ »ÞÁFÔ±Æ5x4Ã2ÆR,ôB@ÀÓŽj|û…ZøÑecƒ!»W~Î¥ˆÚî8Cy Í¡-l‹æƒ,F.—a-ÔîÁ_ÎÎS…殺ÝÇuÒŸ_hÓ>?¸¿¶ûüñWÛ?9Žâ²fÙÜÃÆYžÂ-ðK,“ô˲8ùU™ÖµÌüî•d5• CRò8<-§¬dh=e väîúé7)ÚЈaúköÞ¢M¦Yǹ‡,,džcÙM ŠÆšñ Â¢ê˜ì,hA}R.»”r2nÁ¶ÁèW~yÄ9Ÿ¾DJÉ^Œ=3¦v1¥˜Y¯£9ÿX€¯[̇@¿Oú6)âcÝBš„Q°°×3‚$}½­ôìÏ3êù~å´±˜Ðz¦×èÕá/B/n5yÚL~ ^¿¯c&q8-jVÖ OÔ:Fï=Þü)~‡j ÑR¡`Ï¢Ž¤_¢Øy‚â퓉u·üŸ=äþteê@–žäǦ”»€Ü–¯$™«õ”Ûg]€ŒÌmÇsþÔˆªOE€žõö`ébÓäC…¦1v“bâà“àRü|Ò™%(T&]xwß5šÈâs'ÏwÕ_¢D¨‹ggþP° þãùWuÙZø ‚Çm™s(’–!ÌŽ'9žî IÅ=¾ídöpM‰ jȦüÒëÂÜùBJwdø±.îkÂ9\>² 7‚i5Ü@Or+ rŒÛÐPÖü7¼ëjáyÔ…Ž»¤!ËÞ‡ŽÖ¼´«ž6·Ìiqâv¸ÂèUëR˺BÜ.{NÂÈ3[…cú%ëí– ä²WøžÇöt€ŠÞ3ï-—Fiv\¾Ê¬ïÇÙñþ£œÃêZ÷1ÄGÀŽÚ§ Góïù¶-â*ÑBšÖË·„v~òK)JK‘t[{¸À{ãDb¼˜™"|ù¡ñQyŽbóèóŠi™¯’a4$ ñº╲ Œoö¡}“FùN&9Q¦_HÍ«(øÞ GYuõ…ÂQ…|¢Ý>ÎÌ5˜8æeöCØ[ábˆk:K]€Íœ²ýR2Ÿ#œ¡ôöƒ~OíÖ×ïuÆäš:ƒµrû$]èdBfp8¡å­7ihfì8»yÑêšÏÊýJñ t‚ù²Ñ!Ò ²Y:f¬)¼þîøŽ;Gu°ÝuQl{VC{›¯[‹OüŠ˜ñ{v/ÞP€x¨ì)z4Qa/ñ„i>~4)å¯üZ m£Ÿ,Iõõç¤÷† +ôÞW ñLf9F¬¸©äÛë6Ö »0†Õ'€dÖë ØBqG’M&.]9âÔ6ôo:,ð½ÏpŒ½•»l[ÈLµd.L®†5¢·œ:u¼ëÚæÑN´­,÷ –›G8³‹NÉÖÊÀ(_š–ÍMÍÂ)œ.#Áb_…±Œ[ùpìÊhªÜ)«R¼|Õwñ¿ âžK¡»ùÑØ”züRdþD¥Ñ8Ù9òãh+ Ò}6z¨Ï9†íê,Ü;Ž!@iè–«^JîÖ–XPP Þ/xig¸±¤ýŒË9^ªNsbÐÃø™Ïda¥Aa)¸ý¸É'¡ÏwZŽUÂ}vÚúã6ž2é4yiUmèž¶ã(RÇºÜ öÊãWeøŠ_6^Çi²Â݉7§»ª¸4Á,²‡´ÏÏFÎõkÅÓ^®<=›ÒiNM2Wxî¿tà­‘0i•‚+늰’p 0xï»Dä±p#È ’Œ˜)Õ%…›"UgméxMÉW0¦¸§mú…rï«®%Ëy  ˆµ­¿Y»Jd¡ælµGcr6×-¥ˆ¿Ë¯zÂìưͽüð[¡f#GwÕÈÓVK®j‚2<Š¢÷݉27LÏë`óâe÷æÙøtª E“ßn’&‘¶9f:?*9d­‰õOµ$ó‡ËˆU4ýfìW"#K†7ãë ÆbYΣ<47l»ÏÅkvä°Ê»5˜åºÙ¼]Âçéq6ÈjÁ£íë§'Jèn¥ÍsäNÉß»æ1F“›vD×ú,o5j¬Ý ȶ–ÃQ^=•5mȦãRøDt³©ô0²ÎY†_ßý2ª§íU”ÆTH±üçåy­Ûl¡ p¼o’ðtà=í:åPO]Yl‹€Ãȯcâ;ŽVÜ4ÞÌÞ†·@1€˜PfL·÷·õô·êñ7½Š‘ø¤õÅèÛe³'Û#Ž¶Â G| …uè,‰":WÖÁG†å]å0'„ÌÃ2ÖÛ[Ùß„°‰Æ¿@g9ø\É [~ã ‰›·à¹¨—Œ›HÝÇ_tõãò×P¿‚ØùbœþNߢ·;/ ’×g+nó3ã³ÃXN¥B¹½ÇÖü—hVSNæ’Õ`<Ƈ\Ú6ßß?r[€â^¯zÇRÖ¾ÞÞ6I‘ñÁPáÂ’»zé :ÁãŪ§ºH<Ê~ùÞã¸_è²\ˆß¿Ó¢_Q$)…zOüÔÃ<üDfö›šdæaBó·=VЃú—Õ7Öñ}_u+å8£Â¨”Iµc½ÇvÚ•´•TŠUÂ;^ÔóPr®„|~ÉZ%7çW¢Û¸Ï)›d½§å$á>¼ïÑ™i¢« ia ‘oñGýàSò+ЭÔ$$³“Òµ–ÎXôlÊùF_”'…aÌëýèÍ Ûõ†kX_![•æd' ôaI’S2K˜A¾+^)ðÕBÜ&’²lQ®g©$wĘWËßpLùÌ;£ûøqÐR¸‡.º 4ÊÃ( , k-Тþ²ó{´º.VIÝfí—QD`gM°8ÑöhÎkœ(Á­p¶(#ŸfX{|¿/9ÍÆ¡´ MF0m³±a˜'7Tï õz#úÕo¾°0:è¤9m@S!~>’mÕý6.·¤3ÝrÅ“ýÚÓËÙŽ4R`åsȰÃd½àba0íkFnçÊšÔ8š$¢‘Õ½óEáôšŽüÆÎÉ2¯GÇ¢/EñõÃIJL,WµüÖí!{ª¦G9bìlS’ ÄÂù3 >›€xV_+¾Ê]ßå@~fbgà»·*‰ƒzY]ëïpOôŠ)Ùtû•@#á¶K”¼<îýloAw‘“&›ÅñtVPQšW ã_WÙ:&Ù)ß!Þ/¹]df™"˨^p½Š/‡÷‡R*•Vs‹üBNt›” ùú2"-æòCeÃÔg§š¤SUžäÏ“82r­…ÜmÑ,yÛ®³¦× íÖ;ÑVép>¾ÔÇY{ÌßKS¥ë}<ÖæØNh£P´Ï0â(«ÊÐóâeZjž¨p}/F†›‰}Œ§ õXß'©…±T‡NÙô˜P?è‘2ê=Ïýœˆ­WZË[šo»¾ æPÚáp+ͨîÖÛñ[U߃ˆÍÕýPAÉ¢ò­ Krºvï;ªO¤äÏ'…_¨+ÃE+Õ“ÞáØÿ´`ž÷ù<ÀÅ(¢8ùÇÆp$MZ Çù>㢪[‹ Œ¬Ê ¹°‰AjšõÅÚ$˜¶$AÍÿóVEm! ’e‡þIî:E M¯,­Äð#ú\sûèx”^kPþ™šµ—L¨ôÖO4êÚ@n¥Q´Xz KºXì/†º;@ónYˆMfÝ­+¥!@.½ŽÚmÜA¥M~¤eLù[È×ÚÃ2؉rßòïsáœëР .Y¿¸£ý*‰ÎŸñ’»aÔîÎÕ=CÓõæV)íW2@}‡v—Þùúø†…gVdIöp¨ýõýv˜@Q…¬S²r„C•ç3áîÀ¨H ž$*,áOtéÍêæEÔŒ©p¿¶ògkšyÑÀ¤6ºRØ<±ÕÈø‡ó›qq¨ ¾?Qú«sBÊ!¨ Ë*=Z$¬£Ê(¥~‘T©hÛä{PwûièëÆQY‹ïô~%%]©T7¸iÆñ>v È±©‰ãÍÀ¬ú«Õì)81ñ<¡˜“ÞgYÎy}–©-ç®G¶á'›”›×ÄÚ$M3q|yNOøø9ñ\$+Ú¼¶¤6ºÐ„pá¹ v(kì–Ïw`†[ }ƒã /%È…¼%\]’E)æ©·Oñö¢oÉùÁ,ù3¦Ø¡Á4Kµ*A>“²m„ÎÒMòPâèEUÑe^ç½­6/<á˜Ê=õ2^·Í³hnÊ0éjI{!¤©Xm€KÙõ¨Œè¶¶'/¾Ó}BôÕtHI¡±$rÐ+TÛÔ„1Ç{i¿…áÚx" ‰ï‰6H´ÇšÔLMÔ‚æ(±éLŠEN¨çí3Ð’PÍ[¯~-Á¢žg†%c޽²YÁ»"T´ü¾ë]Â)gøWßqÌ^ \…Í„v9{)[@ò1nˆæK¡²€‹Í+2h‚\ŒNéÓI rŠ3‰hk| “”}süM8d¾Ÿ‰&"rW+Ð|ç$°éâL1;'Lw5ARäô$§RÿÓöXLÑ\øy$ü<^¡`á|µFÃT)R§Q&='®].’Ê8Õº‹-¥à²ýýø¨~£;B¾tÜÙ–è0B›†Ü·3_æå–1/¡ ‘4æ0gÝpª“W£ÐˆfGLãÌíTÕšTþÌ{çJ[ß>È\"{èä×Õn¬4u7Ì)¡WD$³¢½¡Ä¡äÚO-ë"÷Ók¡‘a•ó<±²+Ëb_Ö¹³îNRjf Ü.¨ûO Ë‹×Ä Ò×8¬²©¾eÕêþñ ‰Âsw»GM€£•›ÖÛË©fdÜ«ý#Ì$­Þ“kïëµzÛÇ«ŽÓF®Þr”§6ÆJ×ÂÑ;`/»ARþìm!7&ÃqI9@b l¤a‹Ž ¼W±!Þ_Œ®vqáä!N þ/·,»¤': Ú5”ßï ‹»3¸i‡¢)>|˜l«) ,k»ûÁ8~¸Y*¶™s± ÃÝd1âBЧ×+Ö¯8V zõ- A?î€ÒoI_w Çv?Ï —·÷Ÿ“‰ý&þî§”JÑäcë46ŠûFµËN°ŽØ´jûØ4ijÏÃjÏò2~­îžC‘¬ätìÅoËR+¼Ïžfí½dj) øöåú‰”Ã¥4•þ/h¿iÖ„ÞhÏGœÑèá–rÙ‹-{ Qwô "?Bг;£èl ÐUÕe$ì¼w¸©yæåûÈSýx3EìY§¦.b•D¹uYï ü p_€ÅJ=¿W5]ØB‘ЕÚ!z ­Ýu‡ÇûjÒ†H ‹"°#=—‘FKtu+~¿ÀèŒ|$ÀFÒ¿hÜP£¾ÁÛQ2=õ>GoäÑX=NUægô—‚žÞн]mÑ$¼©D«n!Ñ‹®=ITTšÍó¦þŠõëËÈmE´[ܽ͗?]ˆä§ÝáõÍÊ ñýÞu:H«…òH⪖t+vî[ãs”Yìw]¾‹.ß²Äè&Q4‹AßžñA€t‰:í«Ð šÚ`|K~ƒÆxVÉñ‹54/—â4l&ê]€’`5N²Ù^'WåØj({1։̈́}÷NÀ&‡¤ÚÝXœGk¶÷Ó‡÷9yMÕõL7lðà³YZÏõyù)…¥%¨(F{wÆAƒ»M¼è,¯Ü‡Õ qÄ«ôÓ³4ÄuóiwxÂVªo“ÆÇ!§&2ik¦ïظW¤¢ù­&qêaî"¨¿žÍï–Ö‘”Ó^#w~³dŽ2V.Hô §Ê¬<Ôqªæ^Ž Û÷·ÅÎ%<ŠŸ^ðrÉõânD®NÚOò9Ó~ƒ2û¥ÊßnTsv™’ȯ`>£ ¿ ¦e ²(NyÏÖÒ¬sü`ƒ7g¯°¨½Žo:;$³€qŒ¬·âv‚PYUÒ 'D5¼´…ÁðªÇš hÔ¡j¡ñMÝŽd¢Ë¤ÝªÛ¿íÏëÃuÊÄ034ÌO¥EE[½e+¬VxRæ(ˆçG#ò,þ'/¹žëyÅçÓOgÿFÒƒ¨¾&æç¦ZS&¡DƒÌº©qj®Σ Ôo[¶S{7V ¬Ô^|N)_]{¯Ìµ+9‡E«ž¸Ä'˜åRyv}¯9ŠBàhêž² ’Ž£‚U‘³ª®,,€Ê²|ñ3åV¬¾© ™A?Y%F®Iû¡¸a‡ÈÞÑm$Uµ ¤Ñ0M„/j“«?@_‰Çª§ù2´/…þÈ{‘!÷b·ÛûUÆíÈ€¾é9;xA£l”R„óñ¤Gz@ePcçS‘Bè¬#MŽ Ím™0!BóJ¯nŽ™ƒØ—(µ ÈO÷â˸ÃÜ»Æ|‹Dnq_À*õ”´±æ2qê|6N4½0µ7  þee|ßó¬)BO¦àë¶%榆ìíWQM®ú^SD_ Ìn;ˆOÂWIú¼5HM&ÁkQLºm3Ú› ^ÚšÈþ»Š-z„ÉX¡»¢¬?ÅŠÉÕb¤ ‘§Ÿ˜ýhй‹ëW=5ÇÓn5 f…ºÎÜò~˜«9P©$ò}Öß-cº¨]±;›ð+­HÉÏÉc´íì­ÂÈ¿y? eo¢ò¨+$:TÕ·K›=P3Sk³ëš}ê.ˉUC!ÁÎ2öiÕ[ûùå]¬šzk6* 9jÌa`ÚdöñšØòZê*Úˆ½ÓªWÛ@ žÅéVÂÒ·»?ˆ™(_Ñ€Š0Š”“¡Dµ£ï£P»ò·×?élÝêÞ–ÒW+ º|dòèXʾwÛPžë–fGÖWÜØ-‰„rÎ ::þ~Ykm-w¥d¥ ²2r ßâñë»õ¬É{-*&â‡ÜâMY¦ôÖ®|7#´Á¥“#¬®Û€~œ’½+9ÒOnµä.¢çøûÈ­‹’›*§•èCäÑ· ,9%Ù#ŸIf¿YZcsÿÆ?:^™Ü'œïƒÝõ’Š«·»_ž›rÓ–j¤$™¶éßgJè³ävJIÊšStQtŽjšÒ˵Еº­Ó]–×ά ™ø›ö¿|¾«ÐåЮMeñb——®é6›æ4ÁqzüáQ~Ú÷ÃÙ7ü#gßú¶ÿøàÐ$<ôݰ¸{\ÈíV¬"Øå ¢õ{WQQbnR&,sb*T¯[ç,¦/ÁïÂ:ü†õÔsŠÒAµ$Ó¹˜o é=-ýòjÞ<( ²<5-ô—ûÜ3zå’R¦Ca¢V¾ºDEöZ·"|x0DõWzªY²'ó¾?Xü¢ïbºq6 ’¹9Ç ís>t (#~ši]HÊ¡'i ­iÕš\Ïá(z%b'Ç[ÍLØÅ¨¥Ъ€„<6Êó•žÈ¸EŒh‹ïmZëÀÌõ^GéqPêÊHOZ&$Pù.ež.CrIƒS¦³œ&Œ#o$P…‚”P¾{›eA€5G®DRÅ€öwsšgãìB²¸†›ÅX^Ì|ûõ‹NhµWïeÙ½¥°\ ½ú )U÷‡]ÁÚp}¹;J~:]¼Q·&÷…«!³Ç?_\¸EÔ?¨ÔÁa)õ)"b¨;ðk±Ê™úóŠ=B˜XnÅeAQX,ÒÐÓSÀoòn»‰âY˜A˜°åšmŒ­Ö6‹OÊ5¸ç¶üRflZñ5NtR åÃUåÕ´v¡!Cá“›ýqP* eŠÑúAí¨÷úë9‹B´Nãï}ËR_Ç\» Q…˜ *_'cÂO¦{Hç«è¶W䥂Т4ÈøgJꋟ¦®shFÔR>ö–”%â(*ö¼¦ö%· ÈK5=]~֓혗¬|¿'/Ųoœµÿ¨$Yy3×ìDÑf”~ßnTxךˆ•šÛ‚1ŸÏ¦w^àsžÙ#à4Ë¢á„!Ñ|ùq–a¦'X‰³Vx-¢Fý+f»KN{g»Ÿ'$ _¬¹Œ¾l$K›©<^TH¸¬"7 qúê:Ìfo7»\ÌødPçâO“Çaë*&­ÚÄv}ë©zg¼eDÀhôkf+ó&O¡us¤(ÇšÙ=·ƒÂï÷¶‹È Â2Ì„ënå ":CðÃùŽó®±¶;k µ"›zÆï`õº:yB+†³Çìñ^­>2[浟îZðÄIˆ:Ý™j¯ûczV¢l÷Ô×Ñò< d ú¬ß ‹W„Ä Càµ}ó;|ØÁDŽòTÆøýØOÛËÚ‰jÌ'#¤!a8E¸ ÑšZÓ!yîÐO §fƒdÝã‡ÚW1к¼„Ÿ‰9T/çÿÅKí}Àœ•&]ªKº&&"(Ž_^‘åäÒ¦ÜÐñ‘ÇŠ‰?Œ;„ë¼Lè)¬`0š…RŒýºOùÅA»LQCÐïìurY^´ýô‘* Àô-¾ÊÐõ½©ÒW?Bà >²ÞüxåÁ7ófÏ2f®¡_å„ß- f º¹5£uÐ+ƒÏƹ²•õ¹c=]PE¯qëò @ØUjñ‰PCï>¸N¸îæÐ+î“ê1§°âu¿%(1Æ·øÍV§;Û®\­Èå-Š÷…ä+kxÁᶦ{bi‹“Eïø'^ÉaCç‘ô¬í+dh&ðÝ<«µ+þt¦ûÿ)Øönyò¦8ÛÃsDÍÐø=ƒ nQ“bûËå:òµ.§ € {“½øiæ[3AòŒ€Ôì‹ä;™QWµ×3(,ê`ÿøƒôÿ7øÿD ÐÌÕÝÉÁÌÕéÿP‘= endstream endobj 44 0 obj << /Type /Font /Subtype /Type1 /Encoding 2456 0 R /FirstChar 19 /LastChar 126 /Widths 2457 0 R /BaseFont /STUIIJ+CMTT9 /FontDescriptor 42 0 R >> endobj 42 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /STUIIJ+CMTT9 /ItalicAngle 0 /StemV 74 /XHeight 431 /FontBBox [-6 -233 542 698] /Flags 4 /CharSet (/acute/cedilla/exclam/quotedbl/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/five/seven/nine/colon/semicolon/less/equal/greater/question/A/B/C/D/E/F/G/H/I/J/L/M/N/O/P/Q/R/S/T/U/V/X/Y/asciicircum/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/bar/asciitilde) /FontFile 43 0 R >> endobj 2457 0 obj [525 0 0 0 0 525 0 0 0 0 0 0 0 0 525 525 0 0 0 0 525 525 525 0 0 525 525 525 525 525 525 525 525 0 525 0 525 0 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 0 525 525 0 0 0 0 525 0 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 0 525 ] endobj 2456 0 obj << /Type /Encoding /Differences [ 0 /.notdef 19/acute 20/.notdef 24/cedilla 25/.notdef 33/exclam/quotedbl 35/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period/slash/zero/one/two/three 52/.notdef 53/five 54/.notdef 55/seven 56/.notdef 57/nine/colon/semicolon/less/equal/greater/question 64/.notdef 65/A/B/C/D/E/F/G/H/I/J 75/.notdef 76/L/M/N/O/P/Q/R/S/T/U/V 87/.notdef 88/X/Y 90/.notdef 94/asciicircum 95/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef 124/bar 125/.notdef 126/asciitilde 127/.notdef] >> endobj 26 0 obj << /Length1 1654 /Length2 11840 /Length3 532 /Length 12788 /Filter /FlateDecode >> stream xÚí·Ux[Íšnkf†b9fff†˜91ÈÌÌÌŽ™Ù±cfffŽ™)f†˜qk­îþ“^ûòœ«óéF㫚õUÕ¬)Q(©Ð Û%lmœè™˜y¢ò*rÌLf& Q “¹­˜ÀÌÍÍ v6°€Ú9xؘxX@¢¶vîæ¦fN€O¢ÔÿêÄ ¶:˜Øä œÌ€Ö 1Œ ¬*¶Fæ@'w€°•@ù_W8”Ž@ 133ÀØÜÈ `45·A`ü—‘´‰-€ó¿ÊÆÎvÿÓätpI>$© Ec[+w€1ÐQÁ”™ü¿!õŸƒK8[Y)XÿkøÏÒÿÕn`mnåþß=l­íœ€y[c ƒÍvÕþ—œ<ÐØÜÙú?[¥ ¬Ì„mL­€zn6Žÿ*›;J˜»•ÌŒÌ&VŽÀ×6Æÿ)š¼k0~ÓP•— ýïUýw£’¹“ª»Àô§÷¿™ùƒæÈÁÜ  ÃÄÀÄÄ êzÿÏ'½ÿ·1²56·m v€ƒƒ;h€ˆàÉ 0·1º€n cF['Ð%ÐÄxLlþµ¨Ì,FóÕþlLF; ÐÄéO•ù¿«ÿµ¦ÿ”ÙŒfîvf@›?%.£ÐÁöOÀhkü‡ÙAN®ÚÙÿ•oëìðO4¨ðâ0Šü!N£èe‰ý!Pø?Ä Š‘øC É?Š”úC¬Fé?J—ýC t¹?J—ÿC t…?JWü‡¸@éJ”§ü‡@y*ˆ À¨ú‡@éj”®þ‡@é”®ù‡@éZÿ7(]û¾»¡ƒ‘%Ðé­)7ë?õÿ½ªÜ %#s#gk+ÐÞù§ Ê7øC |Ã?Ê7ú‡˜™@Æ!ÈøþkÅÿB‡é_J7û A3bþ‚¦Äâ/9Yþ… )«¿deýA7 £Í_²²ý AVv!ÈÊþ/Y9ü… +Ç¿dåô‚¬œÿB•Ë_²rýƒ ÃœÑí/Y¹ÿÿï#EDÄÖÍ“žƒ@Ϻ‹@Ƭ íÊäý¿:9;€nS§ŸÙ ƒéØÄt”n@#„å[#Þ ‹”ÆñüŸ¥ÐÔŽiEAãÁõi¼ '¼sMSª@¢kô`t ó2´ä3Ù Fcö-¼Fa¯!OÆà%ô!d,êïé*°F'ºúÃ9ƒ½¨ÖYáËÄ»vM´+d·›.ÐUrGÌœyxgP%‹ ¯¿},}'¶–SÉö’ôrÚ䒀ꇛ±cO§’¶ù¶ËÃ8ºé·˜oËx½ë3–kÈiÜ‘9òóiü/ðLÔn&ÛÌ–ÄËš‰Ô-sðäkÐ Ësãb¿SJ²­ºMMÙO&Ì´ËãDàVÞ†"ëñ_ HÒÐ:n Ý?)Ü5¦¸Œb·G°±y1¹ñ)W¢v ° Ðì¨N…6hºZ¹ å6”én? _ô.ö9$v y˜£í:ñ>ˆ` *z¿í‹¶òvD¶ì\Ë´Où"lF€"ùC T~S¸îÙ¸âp¾ªkk´…ççuSÅh¦5}Ï ­ÒÀ¥%ez¼Æ´÷Õ,Z®&}‡ê´úI(Z;j§9Ô¢r·Ü°pD4Vª»®U½—¸Z‘¼0<ÜZép§<„*p€&æ05«ASE/^„xƒ%ù‹h§¯‹l“»wºNGdB9¥³ÓrDÑ+kpŸhÐGÑÔAýmFvv·ß¾fÆëÇ^i6¡ŸßþJ3,úùƒ—PpN {Mye QÑS`JÇ» ÕÛ¦w­wŸ^ø3¾¨^®AºnXÕoxÞ¦¾‹—ŽŠåÐ $–ïòûéÞÈþé}¶¿c#”ì~S¶9qî(Á¦mê#ÌÚ#È]ÂGéå0´ôôö‹½&)ÿ\ËM-‘å½r¹EŸÜæoºx:ó’l¨˜Š’»õø2]Ÿô59ã¶_‘SšÆ(WÒå^z}±Æi™EUÄJöâ—qç?ÊgPS7¾/õÅ2…ä6Ûç¼øçùf7%±Ëõ‘Õ-‡™ç¨lc³í²à¨>e¡dæ¡rÌ…oÚF¶Î#ÛÜmÔ Zô¢ð{Vþ…õ±½,T'ý0{ˆBLUHRûìéÕýf©U踻–ï‘`· åí4½†eáßDZàÐ6âùð;ÞBZm†÷~_.lrquª×æì“|u›IšÆo¸UZ– ë5âF-ºBçd„ÔòÚ“Ö÷.žžP’+ÐÑ“n¶«ÈIÖ?.JÈØ ¸®ôpÓÎ+W,V#^¯`{ÈP$0þ¶½>ÑÀe’q•ÎõÓÜ—*Õ7ϵ¾SŽÕ\BÉİmyIõ¬GÊÔ#†Æ¼/0–ü04†‘8GÑ5ãPbü¥Ê/1 öb&4R‘αócK°")KÒ›uûQ™SHbÓN”Vúûª²T¤`ßÑ`ü†ÂIÿûcäTïh±ÓÖâbÆb° ß`º@ø]ꈑÀY˜Îþ*„‡¾Á|Y_~}g9˾ëüÝHÉþŸÁFIŽ6H¨ë5€Çv¤-bŠewùS4/1>óⳃ®¨2ŠÜ~U6£õŠ iý–„LÄr¹_‚Óf0n'R¯ec——æKM²³ËÚoÉ¡1OQUÊZDHOcªÊ†n±dÂ#”1ºú{„0F:4 W±N¶–+ûjýÁ(Co—áöï0;ª=À!êÜY ;q¾S}M i{²fãÙC¶ˆtïOßaJ:-†8zÌ‘ã3¯p)çÝJ‡×C«wÇ—ÛÁ¶½þì%CéK)vÜÕ 0¡>çÌ÷^§þÐxÏ#•¡´Bˆ%¯LÛ5ý,rzŒ×9mGšÌ+” ,jÊFneø|´+bTqH'\IL©R*41,â¶ü^åŠ'òF|Ï}Íðz·žŸméL7~{öC»Cü L:ñ6_¥®R—~€½µ|­žñ‡ü°Ê±!žpûu)ÖOàU‹V㣔ñlJrd¥9n*âBô0ö‡OÎè|ñßéÎx V(} ™¬ÄDoØïÔ²­ü6îÓ $ÝûóN â·¯ÂfR} õp=²wœœ¥.Ó–Úe®˜T$xf°eüÁº¢_¨ Óuo<5sïIø£žñ7õû÷Ý]É×z•£Îþ¨çi„îÀ]B£ËÁ°PtKA19s)ÞÔ³6#†X™¹ûbéZ’âü/Hë„r¨’‹rOÎxOF;6åmû&ò_‚?³_)Í\CæI'Á³ã½ih Û8ꞨCèŸý°¤H¼üI¶¿C1GOúA7’ýÆ“]ý·¹M³F…Åtn¯ˆ/“°ÙɨAÏú&/ñÅ®R<|°ßd.e¤ùáÃ÷²‰ƒ&aMøxÆG~@OJ |óp™ZÔt{O4¯PF·§ò(ÿ,seÍ•€ˆ=A®cý»W”… ·ÒrkzV~tDˆiéRsÝ‚çúçÙr¯mš›¥P½z´jvاØÁê°dHzúfßÀŒ£7«s‡‡×ØÔ x&'^§­†%ëVÂ_·ß¸fi8†³ïy s…î/ÅÌòÇr¥.¥Ìw«º&jNk*$]éÞå4=y&óðè6¨>JìðÈÇÈFQ`íÅWÃÿ,SyR‚5²ñ»äêÛC(§ÈìÁ8!ÖϹ²ì“ÝX‘‘pˆ±ç-l³°,8ôØ}‰ ÙÔºi¿›¡•Õ#ìsªH6».ÜHC&¡óÞîËô„}ñÓ9é¦ÅS-^ðÞùõå/L¬2A­¬µ…TÓBé*nÍy5š³êíé4Ý"·QÒaŽe¤u5¢.“§ÛáGw²cLùä&$¾/oÎ\.£ÚØÇ|W¦¹£ ·F9–G®½ò7cáê¾ ,hNÕŒ/i'Ñ6³&Éúµ^³÷—C›¬Ð½’«¢éˆßÒ}/sz€Mh\Xл4-_ÓæÃô‘¯ Jn¥:=ñ ÏÍî6(Ô@Y»wåÑ«H|ýåRàØA1儸¯ vþ´SL!Úrv„töÝD0=úQLé›{x²“#‚•û”Œ 4u$B€U'UxÅ`C47^Rk‚$Gë5ü[:¢x¿QÕ‹²y3Þ/Ã(âÏ•t}}²Šæ^æÈK­1ɽ“N´ãì‘ùÁÄǹñð㶯IÑf†tHK{Ë»âwöË¡âm’Ñ›ü”góÄž(×֡᎞c VË‚áOª4×H 'E£ñ{Ïdq*4i$øéµ°ý¨÷Á™`{2m¥þs¿ï”ykïogoÜÀ;†•˜»Æg¢ ¬Ør*û’†„éIˆÁ‚GYÁPÂHžÕî¯k{9z!l¿â6°Õáh (->eÓ°¦Þè]˜î[£òî{„°¥Èp,tmš0õ9½‚03VÁY_”“ÉQ«)Xäf®–ø‹`$âÀÖôãÅÏEd«°jÄ>izÚý—/Ê}”bÆwíÜh’?½ºp!Á ø±L™‚¸„Ý¢TÚ¬/»¨“¶¡5>=Xf¤|>äYÎ2oÁïõoä¶kŽlÇþì¼0->R¥<—‹ôâ{g=߸ÀQ~­›°T”Ñ@ÖúéG 5k=pt{ÅÇ%«—°4ÎÔŸ@"þ}Ê“u3sõ7‚1¢ýÙ;ºTùó'=kñÀqAǹãŒK3u.d0ÜgÊÅwß>Yªb‹)}éQ¿MòÓëEÑÕýÁžRrþ8ɯtùIj×ßtˆpª vBÌúˆqOLŒ÷*ÊšN̳”Ñ&‰R´¬'{ÿöæ´âì¨Þ›E¹Ä’~Zú—<’#4e9¹ *ÏENß´£öì¶¼aí<Ü•Ã}ÇÝ-ÍYhñþï_MÉÜ~Ü*ý A‚÷¿--ßðæ4ó0†l‘.„4rZ±¸Ãw£•ƒ~ïCãp?Уú~ÿa®£½ Ž%M/m‚ªÈ-a`‚[«Ã6Ð$í‹óê•auÛÑDh%±kS´·Ô¬3¥q7¦|Å¢húüþÜÝ®!TòúIùæ›Ùgõ6RMÙQý$H{>HœÔ¼ªw®5 5߆ÛáUþ,yã‚K£Ë36Ôo"MÊjïðí‚ ø’bhÐ…ÔØ…V¨!™Ïàgcɰ°¼êxvk°H_Ž`rÓˆ‡<Åò¢¸l•.\æ…jѱN ïµ*-h|Ø£;ÐZ=Tê¯ÞD»BÈŸæ ÉWYY8RˆõbB\ÐANmwÕ›`,c»‘Ù)PøÏG&މÞÿÄØýl:Ã8œynº÷KG=ŽÈ(óêeE¢r#í lVMû§œQǾE5Ìú›Jyœ…ÅÂÒäÌô539ªIéõ®{H…‰äõRËæ ]ƹŸpOxZqšñÓµ†ƒ í÷¼é’eÞÞ”xÈúÚGy×e|ô"hÉ"À ÀŽïÈ‹µ#`‘<¥ŠL‹Y¢¹½c®´@YK@AI@¶ÌÉ}…élï¡¿¶Ml’Ù—Qá ¡Óßô 1ÎZMÏ„—ŠÖ#•Î(8¡¥îòPz®Ýj_BsåºoYeZ{ü·¡Ù$õ|ßdògƒàÔé(•8ÉŽž¯ûz+%ð¬#S«uë‚Ôéþ;•è¤Sîi&:r; Šá?îÿ(†¦;ýø³2…q§g¶`G.Á-’ ÙœýXwˆÒ ªbÃr¡'Ð}¨9å~{f£æéuÓ©h]³sØbàƒËõ 1k®ÓðÁ¡†ëË v§Çâ>1…üˆç£ · ^ØÜ†sV+EÛèämå—Žë©=•î3Þ õa¼=›\$ã™3yV»GW4KX‚Ñ‚±>Õ‰ßõ•¹h¦~u?‘LÚµøÄNðœŸwàm¾h­Q¢99šœòþÌĈÎ|)7,ycX âØÖ¢!]Ô~¨NHа„ÊKúìÞà6J8ùfIS6ÆÔcìªÓ¤†iDJ_µ(ÝNrbLáÒ»¢.Ý%„ÖCŒ8?‡ªËUàUŒhèÄ Û.™b êîõjãƒÿù휄+Iß,n2*–vÿ±—Ñ 3‹lS뱆%Ú çW õ4Õ~)aòžýÆ»0Ókf|v½Ÿ|>\̾Cç*ÿîfcPA)|v]-F%sßUAÒÏFtsÂQe.¦à•ÚüfD¨sÔ4d?éO‰»dr¹Š-9^€¶Õ¼fÐÖOƒ˜Ó¿0D¿†GÏoT„ †;‰ä¸IÐW3_­ EÖ1ª F«ÌÜœXiÌ•ÄCl¾J›v>²UËNÐjí&í¿ø­†Î¡=@ïÌ–`\’ÝÝà3ÁLA}–’éætzÒjäèo”ž¸c“Z11Ï݇ö S½²8’x÷Y·äÿN{@ õt5‹TSY—Á‘‰¯CÓ/¹˜ †PJéµ´>Æ–¿ÁYJ$›pPrqã}óQQ“XL²ˆÒ –-¤ÅUT~Æ‚½ï·¿µÁ·vRVr1U%y=úe‰lKÍŽuzH…=ò(7VÅåùå3¦™óÒLfǂIJK-Å`Ök¯Sz%w·_LÖTÒPÙ@‚æažÓȼú‡‚£Qú½ Ãþžf]fÕŠç%ä¯ôóðTÛ&”¢yEÖ÷"QCN꿟"ŸW=é/ÐQŠ›ö$Ÿ€0ùc\uñé¾5o¿’š;ÇòÞ2]tõ,qh"[p’ñ\ø{À¿‰½cЦÊ=ͬªIpÑä“…ÕÞ‰“H²v±ÀÍBÚ¢0Òþ1̶PF!ßñ`eBjýI› H˜„kÏ’É«â¡åd»éšÂgÿÄ1—§[´1Ø}Ë“ëG©ˆƒÔŒÚÊŸ¤!c\m8Ìë*”+E©(/E;¹…³6½¸¸Ð®):¨q2²ã·G-öŸ;p™+Ô«´4W¥zÅD̲¯­˜~ 'Þ›)n¯¯JëÐuRvf‚HÝ$÷ëŠÿþúÞôFé:ÑqðŠÐõQ²Ì»‡¡ÛÏ:Ë…÷Î,´äŽ/ÉÉ¡J¨2¼é‡(ŒõÃö²Ë·ý¸Ÿ,íorç5ù2˜=]vݤ_s¾-?øÜØ®–ª$”ÞhÍ2>¨Üê8/9@úîK+6&×±:Ђéãð>7Á–Šú Ï/œxWÍf•²g³a½]{ú‘ðÇ&Úc6åáæ û\0ih¤ðI‘(䩽 4a$§^ëÊ·÷xO xÑ.4ÎJ©{Êù©&Gç˜úò–éeùczêÆÕB:JÏ'¹ÃjÕ¯ñ8áZ?£yæ7,…0Ç ‡ =x•-ŽuËø,‹Ý~“V·³§`.…t°Ì=‘)eò¢±í¼\ª 3+ŽIç·°_Ô~jt{z¡áê.¶ô–ñ¶‹åØyF ÄúF7ñaSKµ³=íɰ×bÛ._®)qçäµTc®áB½ÎŽt'¶1´}щçµÁÊùüJ®r-!dϺeºš¥HËö•I 5NücÚ¸ ýöÕ¡¾±6³u©uË„tâàmiûØ‹ýéëGéC„1|*å[³ˆ®9×5™¾Ê\jT½ã#dÕæÒ/*f¾¶§ O ²Ç·¿xìÌkÒõú‘™_5…V;½‹ÕþŒFß*L©ƒa‘çŒÝ2ÒVUGsuê§BË*s¹¥ïsÞ¼ÉÑí #ƒ§œ5›_Ô?|ÿµ öè×Ô¤ëœÇS@@Å{ehX)€Y9zÊúàÏ2"mð¡âÔ´+EC?&“HC>L7Ýé”®yµ}4׊^hi,NÜ#µß5.•[™Ôˆˆÿ#|³½F 3ƒÊUJò,Ý:l“ˆ œV+Œ³ÔÇ!•;õJ•Xã*ðDK¸ÙS·Y”€ÖÛ¾«ctÓ>åpho!§ó5/tÜDý»A0•®Ásß×`®åy©§Dçe0‡‡úè'œëð›kQ#’»˜ñšdË[8£N1;ô³Õ¯ÍñöÐz![j3%ü-d½ßõèE»-éöØ9=%»^'B¢Ô¥øºðÛ$ߪׯÁ‚µ•v› M½gïâÃð¿Ç¥uÈÀóä`úO/½xX>{‰º3dˆ½<ÜRI6cÙ$›DßY?¹6å¿QÍÈ®øS_åùí]ÎìÝ÷Çq’’8Цo5Ñ!™„¹‰~bóÖcd´D•JË‘¤ì¦‹öBD¡²¯“ÑQÍo'„iÑYG³ÎÎP 4²•·§Ó_ }Æà/èÀ Ô(7/QíBJ8w³áø•‰—´-ðƒ™Ï(c&olãW®/+eù…ùˆ\-RÜ^ÕP; ÝÈqâpog½ïÇ1]Ž„„<ÌÝ –,ÔzAQY $f=/DE"Úl/Á\v¯zJØâ-B†Æ0^Ú\ÑM¿å¹wål±»ò2US ö<¿è«å~°Ô‡Ð-Åk[Z†¨éW¨U­u.]Gvf>‰Ðÿ¹A »a±ê…,²ÁŸóJÅPèi–¸»Q<†Šø*‰š´Ë¬Öø>,fªÕð QÀUc´ô¹ss±,rEw–¿µé¦X7ßÓ–Ïòë×ÊfíÙĵkøÁÓ›†«Ø§“²3Ñ0fŽê]ÜXþAjÇÍ2å@U~zïÃ¥‰›\mx~{¾˜ÉÞ±ÚèéE‡N÷¸â×Ö;{Özá„ãQîtTL4§õ«…Q¬.K$=ç„ø'[¼3“õ߈i*aë¥,)§ÙiÑFW( — CõòÆ KPñÉE]îOÃcæ#Xe†„ΊìÀŒE£•D~Ycî\ÈÕŽÖú÷€«dñÜŸ¾ˆ+ˆZÏÛ2âÜXRBX‰Ì>§NÕ Pò^³nÚ‘— ”•Ò øù9‰¿üyì£Bc>VΚ†Ë-ý¤‰NBOÖ³^}{„škÝ}ÉF0íÆÁÇ¿§ÕÓkÑ<Ž$Ƨeíez¿t/ Iái Y#§ó”CÄ©/ u(öSOh‰°Œ4ý£…k9r¾|HÞ|U¤“ýÒÔð¾'VF3dü)[èpI8vÓP_5oÓwUTK¢x¢€Ÿrá=~¾ìg‘¥“‘4Ï2Ñ¿b˜žyè–ý¬®Bâ}ò£ùÞ`JÚF`yKpB83vÁÐ-‚óîM¯ówu’z [d§1 H=¡[ ð{•à3xÚpð"^ß»ðhÓªì€DÀs8:bºLØÍ}e!×p¢ˆd¨åÚ=éoxs>Äü¢ãU@[ó—ù_äœ\<—?a[£Dõ<ÏÖbN¡ Ç1í´Bîìïì&¸A¼TÊ>÷ä•|å›@n,C{„WµŽHóˆÆÉ3œwÆË ›.ƒ„Ñòóu{(w´yí½ÜoÉ8zˆˆƒ¨]wCwô®KåžU™ù•æs·Æ›}“ðs½uRH%Ñ“9&|ʈç²!pÿŒ¶a3•ùœ3ת…–R¦û ÕÄ¥HP6ùªñòi¶‚Nˆª;PT¡šþ’ZŸU ŒzÑGrÈ(PÕÓ }!Ÿì½ÉNºë9˜.vùÜû]‚õÆÀ»~lûáÔ”¡`ú½ú—¾BKoüëJéé©*2”D)áɧB»uírð¾ '0p•y/s¾þªyMõ⬠|½ægžÜ…ï`ƒYVïxf.Ë®WÝ~™á>v˜¹½Zb¼´‰ÁžóçÔ‘OC^/”Çyr1~àF¬a'ÜžO½1G@dØâ… ÉÐ*~xIðŠÚ`" IÒ<‚ÁSH¬Ê2@;×.v`œöÑ?Í Âôùl˜mY–\íov‹üI’úÁ§£†šc– ÊÎ3[øÈt½#ñòf% jŠù )Á¬àd«\;‚ÕÞF¦T(¤ðÂÎAûP4.ž¿¬Ò˜£™Ãý37ï·ŸÒØK”6B¸,Š\•·±Ô'*ë’M.õò‡­ó!õ§ÚtŸ?V+B,IJ»ˆDŸË ý˜éúUÓÈ~&ßùûàvàÃÓØ›ª² ”£KfóRå.|âü”%êÜÌ'Üzá@¨Œ5(rPo€òp[HßJaÌv§É2±’kÚkÇ–˜¡å¼þÅ;1.'‡Ë¬û<–1Õ@ _­¢zEàI|ùäyUê´„chJ—]ƒ©`u¤6+›¡÷™Mª&2:f£; ¸Æ¥¬–(sœó9Žçy˜¼p2Ùvò‡™Þï]¦p5~:@-fon™” b‰7»ƒÈæLe¤ÅeÕt\5°¡3 ›Ÿ‹gH'ÀèðÛcÂn¾ï84¹Dª(…l¨aïþã\­lük[}£=&C¾ }aÑÞárFiaÏ?Í 0°Å¸Š—¤æ÷OyÿõggÎ*Ñ/tú-ѵ ïNSànãYåôÝ*Ém/!$ÇY«`ÇQ‹»1SÈÇc2ÔãMî#†6§qp¢ú ½iò> ®;X³ác›iüÚŠöÀgü³5ÔmXlÇXw=âßöáHÝ3ó+NWZôXæÃã¬Â FùB—^uÎ;ÉÏ)Á«¾f϶Ìg9g=g¼ïͨÏüagiÍkjËÄ<ÇÔÙwÐáûé¯ß`ªÇ¬’ç‹qB wRÒ£ê^Ðó«Eo³#¸ßÍ5aä˜H¢n{²nõù@]–†ÏÓ꧆fõ”«.3EM?Z-Z˜æB íÊÂ(\)ÑéÏHûÖø#ë}J+°ÿ‰2ÞvlÑ9æFÈ=¡Cό՗*µ0”O1õ¡ ew·¯öVÚúB’ÖUÓSú,ôf l"³r?;ÜÝ’–Z¯Ëò.Ä,£ÇAOë–—Û»vÅP"ÿ¾ì!ót…a2 ñà.-™¨%Ó÷œ ×GÃ$lÌl£b}³|XNCKµSÒ‰HÇs¼ÛÈDHötŒ¥l˜e¨ÝÉIeÌ °w:Fà´Oï+Tî6y†Åëù0Ís\Âü˜'›¨ò©Á«hDÿÁ^{…ý›*–\-ÑyáäîáÊj³‚ä#¶7›¦ÍaºB·ù;KIª*m§# :ŒìØ`Fç0ò»[íôö©t„ªKX YƬ«ŒÒ~œPeTN'0w‰’áÐâ •q‹ûVkP‚Y´fxN“\|]÷‰iþii—ó`ãÇW&I퇋þ0y(bŒqax”t­«ë/,2†·ŠÑ`ÐE0VU±±Td’­y)úT†Ý‡-X4âB1¨î=/y-Ô7×éFPMº¬v}(»¬Ûu3‘íòýôWÍ«~ ÌÑw€6d¯£,¾J©TÔ ¸·!¥Ö1Y—¯Mh ]åˆUî*¦è~€¯÷Abåã›X/mv&ለD×þŽ×„°&x<_mÄnã‘Í?nõ˜mî’ý¾}Ö1ÑÒ›Áu ­g¶­ž•ôè€+ÌÆÄ†LrKÎjhÅã ºÜ1$q§ÞGNK™¿°Ò/ãrª%Ø51w$'cg‹I!‘f…øÑwîü¡·µÉ5´ˆ ÇéCK܇û‡â†V€Bï4’3Y›i©Ý5´Ö/™3¼K'÷°¤’ŒX]';nîªõÏÕÁÎfÓu¸NþÙ‚‚¯ÒýzZ_F» ²è é§®ÊïÃãaè©lÞásÈdÆ'+×B£¤À¢ìW{F>ÎÓùŽÄ=*7Pr=ë(?£Áê…€é R56"NJMXÚ–lËZ Ê]° c6ߺ” õòQµ^¢]¡~ßݬr=Ò^ ”S|½¨$Üá‹›ó X•ÝiéèJ¢ò¢ÙönÛáfr ú¨9[ºìyr}e5<ó±^üpYË%ÌüSŠÜÊÅ¡ƒHNؖЃÓ õ‡¢ìöF;\&r–Ĭ¯£2þš®¢ºìÞ™d·{g8xöÚ3¦EO-q‰¿ùUb!Ô ð¥Å©T•2iZxæ íñÈš|oÜ…(ZûWIçè~–ŒÕ¯ûe`s_þ«Š;L¯ b=t„¹Ÿ7Å ¹tD¥§êµ©«=ÞX þ”3H6ÿÕ¶`‡`™çÕ;GõN›k`•Ð]7­-q‰?QIó["X§Žá= ªô2ªpÆœéÙDÆ÷ŽÔƇİFÓήiÉ4µ’½ø ÝÎåãÃÞ²‰üù{àÈC̼%­øÙæ¨Ô4·ý™Dë—WK°£Ó@sÆ^aúG0>åýåù:Ê CäŸR_e§?åÖ^×Å’ù]ðeotÎ~Û1œ{Œ> ?˜Ì8dîaÊøÄg]LÉ‘ƒÃne‹@OªÄà!ŽÓ‹N#2[-wÚz×ð7D™( Pì\õÇqð²tö¹N|ï‰ ^}ÌÍ¿A4ž~±‰éÆ)’=ÐW8¼¡ mx£ÜT²5©¥…­„n_kR*k{+œ©Ž}Ãà81¥VSÊ7¡Š¡èÈGA«Î$Íp¡d5iëÜl:À`¦‹4w²Î¹YÒèlÑ=ƒÝ7Ù~FŠéö_¢e—¶Ízâ ÑÂ]Þ³/ŽÎýZ¾p‚lþÁÜ^RyBÀîÚ€îîÐ::—œôû–î÷“‚Èh•ÔR³ªœí¹í_„oðYÉ_ëú=6Æä–JN ZÀaœO†B¡D¿M 5È/[iŸèlÌóCPBìEÅè4+ɽÐüçîò'¡5¬y«¤‡RË\{)D1вNæC¼µ[ÑtzþýÆ”Ím~M­Ñĺ­qO—°F>’]š[î9bnt^¥\ÁÍ8ä •½?áÉ$ |à Ízó˜ÚíÏEX÷vY*7¡€”ÞOgp6“ašË÷ŠnýÔ2PNÎzÂâÖ™›ªþ¦ð«G«­™»äwùwS7-£LW‰Q™mpëÜ"ÝÇu)ò»~\pZ…‚OêJ[QµÖ7| ­×‰ à5{—’S,WE¸æuláúfï"¼OÁÙx¿]KóÍgû ãñÑnkéÑ1†os*?àE¨W<7BF²ÿø˜ÔÁLZÕ!ˆxÌñ+Ìôê“/67Û¶Ç{øœHÙׯnìÇ™ÜMI¯ëˆP\ëé¼Jä=ž®Ò¹kJbÝûC¾…ÞühôÇÄý-‘‰MbôuSŸ HþÜ-æêBW\£Yã¯nÇçóhIÁdß°6Àú›ÒAÿƒ¹Ñ¥{¸_È.Í©(j_„n‚‘ü §tÞbËù¨†Òl”²UÓ|[l¿ñLNŒÓsxq×ÅÅ0Ý/>,쪗w •ÁÁµçmëžT\Pûô}ÆWò‘¬ÓW»X>’aY”u숼!÷¤ƒ ׂšLìúº·§vðUÖ¼•åcñSPÂÚöZ^¯C3fxÑ&•[ãõãÛ {`‚¾úºä´„)Ó/)ƒâUž ë\Gª¬uœa¾J< lÅÚvzλ-Æ,æ-þÕ „ì©RC_ZšþÑÕ–%Š$UåHœ å‘£;q ߤÍýæfWU¾¼mkã§s‰7ròXž±¹ó7òÀ~îQ»PŽä=Œª»ºÿ‚+S-rwÿDN”©ë¯ªxf-þf©êö ÏÒƒð W ¼»wé=>AX}TpnC"°„€Í¶Âl¯ÅÈcÍûíK´sÌS¤xí"ðÜuA=Õó x9qÁŸÌEa7žx Gp~3g ',ƪ…& 8wÅé:¥bÄØïÞ‰ÐÛx èóç/²ÐÖ埩ƶiAÒ8×+ÖÍu ‹UúæÒÅ~#ú®‹JQû@dÖ-¢öƒN ¼±œÖ{⦄Ÿèìóí6éCú=‚‡Ý ¦@N¥º¶v{oï½éÀÏ(Laçs$¦ÿ‡/„ÿ€ÿO `d4pp²µ6p°Dø?Qg\ endstream endobj 27 0 obj << /Type /Font /Subtype /Type1 /Encoding 2458 0 R /FirstChar 12 /LastChar 121 /Widths 2459 0 R /BaseFont /QDWTMF+CMSL10 /FontDescriptor 25 0 R >> endobj 25 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /QDWTMF+CMSL10 /ItalicAngle -9.46 /StemV 79 /XHeight 431 /FontBBox [-62 -250 1123 750] /Flags 4 /CharSet (/fi/parenleft/parenright/hyphen/zero/one/two/four/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/circumflex/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y) /FontFile 26 0 R >> endobj 2459 0 obj [556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 389 389 0 0 0 333 0 0 500 500 500 0 500 0 0 0 0 0 0 0 0 0 0 0 0 750 708 722 764 681 653 785 750 361 0 778 625 917 750 778 681 0 736 556 722 750 750 1028 750 750 611 278 0 278 500 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 ] endobj 2458 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 40/parenleft/parenright 42/.notdef 45/hyphen 46/.notdef 48/zero/one/two 51/.notdef 52/four 53/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 75/K/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W/X/Y/Z/bracketleft 92/.notdef 93/bracketright/circumflex 95/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y 122/.notdef] >> endobj 14 0 obj << /Length1 832 /Length2 965 /Length3 532 /Length 1553 /Filter /FlateDecode >> stream xÚí•iTW†Õ(HÀ¶JA©×…ºI kA "‚ÜE‡ÉM’Ìà0ÁD,.` Ò* Ê¢ Z7=(H)•*qAPÑ$¢ˆ[£È©‡v=ZüÙþêéÌŸùîûÞï>çýî9c59 ÈÖ]D†A/’ mâ <ü‚‚@8<¶••Q' O”†ÎqrB€»B>à98Ûñœùl+àAFª(\Nƒ3ûLÀ])C à‡ÒáPÎôÀP"1Ò*p—É@`ߎ(£  E6‚ŽÑ Jp‚Íí#ò!Ä$pX)"ßIÑŠb À r&`E$!S³¹þ$sdHþ ¨Áͽ2™?*ïkߟÒG:*Çeª·R© !üH¤ˆÁÖåpΊp…|°êC£2s'$2l‘9Þlþ€€GyáJ( Ài,ˆQYì_‡„h0 _?7`å’ @?ë·síPœ —¨"!à½w÷×ÈûšI‰Â• „ÇáñÆÈ¼ï¾V:l>‘"œ;¾=@) U±™ÄT|ƒœA%€J†˜Ë!HšÙ˜hb˜¤Ø}cEf.†S˜ b}S£ûÔ¸aLæðƒ%ÞÀE I…bRHË øCÿ¡60þ>ñãhRckçlìT±üØ¿1EA‚î¿}LÀïj1Î B%ÄØÍ$æ²%b·fÛá¸ùù GFpzêŽ>l6<·¢<. Åñs…“%tÁ£­¥;j̤Úñ 1—tSê´yŠr¨>Ï´¸T½ÿЊo7ñ«8MAfªÍêŒQ½ÖÓùÔ¬[–™½µu‚sÕ¶wûT›fýÔø:“\Q‡`e~e÷ÝFã1³wΚbáÐ\dØ2tœ™ªåÁµI/ÊãwŸwÅžürk‘O€Y”—zºVìf¦G_Ýg¯GkµÖB{õõŽÖõãEo>[œ\¢|l™4%ÑêùOA‡”/Õqbn^Œ44»šÔ™ràåÆÅFì*KAmKCÍ–ó­ÜÔMÞ•–‹&ÖµÍÿâÎÚ?ãs ïîìa'uåæ—"î/=Q‚$þÙahq0îõ!Tš]–féùxú ×î¥f)±_MfðÓ‚ŠãÆŠ±ˆéÜëÍ©=ûŒüë Ôv~ŠÒWåá;:¹fí]sê¼ Ú6ɇ˜˜çl®.c§,F½z RªÛï~SÉ+nßÀF.duî|Tiå| œÛ#Î꽚¨–Ís¢­Þ}ʳ»Ù?cUÕ75Ì;Aî*W²Ú>YûÜÉ„«YWwˆ%„À0kÁÅ,ÝË"­Õ§CŸ„5Ö–Z´iOÿèiº°T—:ëùÍ¥Ò+täaù.ž‚—§.E„oor‚«àkið­‡×mF¯üBq\'XªÖ» WDfùýn ´\U•^Ùž6ªGaZoߥ/7ê-5Þ®5Oeå.´ë½²¢”²-§?lïÅv• ®£Ÿ [¿ìú~US¬T–éx'ZÀÒókCÚðp»³-º’²%éh·àÙ‰cÓSNñ×$I®Ö¿>sι¬°¨§}¢¯µvrϵ“ÞJ–ŴЦäì%Em²_…¥k Oȃâó‹I#Ü]ß”Ê }|‚ö¥zØO¼T©É1]£×|ÅŸ§vt´‰Êí(Ùçü ½ ðOÞØu5»™­¾!Lð¼_u)!n„þéV…÷e‰ÞíÅw;s ‹¸RbsbÙ˜EIMk·ùvvL¬hY{{Ulž¦PãïzØ03UÇ~æ}§ëÅ [[ݹI…¯}ƒ7oëeE‡Œ}2úámã¢9ø›øÚËõy÷›'^w½{»â‚<[#-¶<KËÎ 3—µ×òçíñ½ ?Ï7Y>dlYÌæñYš-cÇ© ìZ“è[câÕ^Õ{ð©ÆöêP¬†{÷RCyÿðaÿßà?Ñ€ùý MÊQJÊþ Í{Zº endstream endobj 15 0 obj << /Type /Font /Subtype /Type1 /Encoding 2460 0 R /FirstChar 13 /LastChar 105 /Widths 2461 0 R /BaseFont /PZTSRM+CMSY10 /FontDescriptor 13 0 R >> endobj 13 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /PZTSRM+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/circlecopyrt/bullet/angbracketleft/angbracketright) /FontFile 14 0 R >> endobj 2461 0 obj [1000 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 389 389 ] endobj 2460 0 obj << /Type /Encoding /Differences [ 0 /.notdef 13/circlecopyrt 14/.notdef 15/bullet 16/.notdef 104/angbracketleft/angbracketright 106/.notdef] >> endobj 11 0 obj << /Length1 2310 /Length2 15237 /Length3 532 /Length 16488 /Filter /FlateDecode >> stream xÚí·UXœÍ¶p‹»KÞÜÝ%¸Kp÷ÆÝÝ=hpw÷à.Á=ÜÝ݃ýý­½÷JÖþ/Ϲ:Ï.z̪·Þ1k–4ä$ŠÊôB&vF@q;[gzff€ˆœŠ 3€™‰Iœ\Ähèlag+jè ä0ss³„ì,f&6Ð9@ÄÎÞÃÑÂÌÜ@%BýO'N€ ÐÑÂØÐ gèl´alh P¶3¶:{0„¬­Jÿ<áP:]& ÌÌ cg€ÐÌÂñ')[S;ç…M\ìÿ§Éèè’PýK“’4±³µö˜Måí@o‚\þßÐú߃‹»X[ËÚü3ü¿fêÿj7´±°öøïv6ö.Î@G€œ ÐÑöwUþ—œÐÄÂÅæ·J9Z[ ÙšYLÿ²p·pš(Z8›œ]€ÿ mMþ·hæþeÀ¨¬&%*ù…ö¿‹ú¯FEC [gûúOï1óM£…;@› 4¿Ì Ž ßÿù¤û¿^&fklgbak`aç::z €–ˆØ^Ì [ ;èfd°µs=͉ÀÔÎ៊²²AÍÖ†6ÿÄÿ+Ä`tp±sšYÿ ²m]lŒþ©¼™íŸ0€ÑÄÎÚÚÐñOˆÀht4Ú:ÿ‰q m@Q'CÐlý;Êýß/ú¯Uò?a6&ІŽ@[k é_QæÿŽþ¯Î, ‘þÂÉêO””½µ‹ÓŸ(%c;Ã?P>æöæÀ?¹°qüKÜÂî!('kC'ó?P&ž@G»?Pv¶À3;ÈÞÙíO;;ÈÛÙÜøW²©ËŸcéšZ¸þÕ¤ëªÿ¿$ëtýËTkFàL;HÕÖâo®r¶¶ûë!±øÏ(HØèôg²8@Æ@Ã?Åç›ýsÿHs°þS< Ó?§ÓŸ HÜðÈ[蜅ÿÈWädEÿHTìßÄ ÿC ;‰?2“üC '©?’‘þC ™?r‘ýC ¹?r‘ÿC …ÈEñ\¾ü!‹Ò¹(ÿ!‹Ê¹¨þ!‹Ú¹¨ÿ!‹Æ¹hþ›¸A.Zäbähhltþ}º1@áÿ\ÆÜ¬ÿîýŸû‰ûŸ :[X[8»ü9¸AÊ. ÃÄÑÉØÎñÏ"ãæøï-üŸïåðg«qƒr0úC ŒÿMÌL $LþÂÖÞ_øÏVù AÖf!ÈÕü/)Zü… 5Ë¿ädõ‚¤¬ÿBÕŸd™A‡5£í_²²û AVöá?;á/Y9þ…ÿìÝ¿dåü‚¬\þB•ë_²rûƒ, +÷¿dåñ‚¬<ÿÂÿ®ðV†™…íŸåð— û÷ûÏuÀ úŠñ_ ÁÙÂÚä¿JòßrÂÂvî^ôlzÐýÀÉÊ ÚL>ÿÑÍØÅtf;ÿëè¦ü6µ]«@ ;ÐaiÞΘ7Ø2¥)´ÌW¬`ºš\ج9N¾¾g¶1h1ܺxTÆfý»ÆïŠtL”}è}b·|§Èï/âq©soû®ûéž­ø×ér{ö¤A'¨íM¿nOÙÁfÖÇÊ5 ².Oò©DU`WIÀzµ]z3‚985ÄÓ­UÃB¾S°’(¡¥:”…³…­¹¡%~ƒZ› òµ ƒk¡]¹²ëpÁø]—›ð¦öd ó5E8{±yÊ’?,—kMGÔìi-JV_ÜÍHn”QÝ›VýõW›íRûÃr÷ô–r[]¯د—mx#š ܃!Y*Øin'õ3Ø qd%¨±æJ94+'Ȫ É&–±[œDÁ …3 mVa eiºç;¡ÌdQ#ZSNòt—E`³)`Œo³®rM,áZ´WþEË[ºÿÓ·Gðaõ7ŒÖÛîãx¸wô©,¹ùSûüþÞݪ¼ò]vòg¢=¾TãìY÷ÄÂV>BÇ–HÁkÆ”ÊIEåGp[Ãô\9?iH-Ò<²ýÈÊ%òPªÝàÍà»ÑËg¤™–l±‹žyÑf6+£{ó2‡Žz` ;eviölKüpH"ñ{?ž^>yŒ¡çiw•ám£²ñ™ºˆh§­ ^ÆÏ‘ûælL/m¾“q‰Q‘Ž_ —rÇRÚö,Ñøµº÷ºC¯0Jû<ÙÍׄڟp(€¯ÇŽ>×}Ìä2cÄ«sLV”-ê©$§ ²Ð•êŒ ®¸8´HGØ9 iˆ#%ÍÆ6bMá?Xbw’^^öÄ2êEÿ%='P ­¾7Ýø‚(ù°ËBºó27‹‚ýÔÆ¤PêÁͰÙѳULä\Ÿ÷ÂÃñqL̨yP×™¸èÍ.ªÛ€aœRL¦.eT&.3¨ÈÔ1)LéLFÏc+ÔÀU[/ô2ûwŽkÈõ„ï°–›RX= Àb]^Nã`šUO9ßž¶D…렀 2ŽiŠj±uW5¹¬–õ`‰4QšË5hÖ$RúÊ  vø†3£“vûàXª¼Í¥ú|`mk±Û\’Ÿ„ÿ¢•Pe< ÙŸ…¡Âq‹ÁqxÙÑúb`¬­í‡(éB'ð­sÓ¼Ÿ†N)*Ò€ ƒr²ërD¹‡my©7ç»O}Zgõ6@Y“È¥áí…ï…èCDJOyS,Á×ß3ÿcsE &ê$*ãçÀ„¤¥ârâQ(Ö'Õk•mo°~aÇHÄê‘Ù+Ï£IdŽ/JG'Èz\Î×ge!$3‚S?e,–gªºü÷’å§+.¬š–gQè wœýö8¶Š~ÆMS]c"ÜÃÝ­=­m¹­sžÖŸ&Ô³CoH„Ë­ü\µêúœº•Ÿ~ÿ›gGÔ¡B¹>yá´ ¬ ŒàK ]IAú–¤œßOúûXÕFZ¹IHTš’=ûú9kù*¯ §çžv#åOL08_Ó­zãZ°S#ìö¿zöqÃÒ¢ÃÜÁsáUd0’¨Œö;zýL›n˜Ö½m³üBÓé½à…öîQð(K}ú$RºÚÒùxœí‰â=ØÇ•\1”2ýNõ.)nÅŸ't`7Øå^|ž¹é $~´uDÀ#†ÕtœµÕQýÀ ¸m5É óVG/«?#òyêíWÚÐèGõSŒ©çjB‘Jh—ÁLvA WUÓåXý‹¦é8=9Æd05yIOHr«ÜnÙ§n{q$ØßæÏqÕ¸Iu`ú®X€'ÅSͽ>Ùn@dô¤ hGÏ{£j§*¹‡8k-$vÉRŒ$—TD˜!ìš5ÕáÐŒ3÷ )4¦º’C:½Zy-Ÿ$›Åë #—s8W¬© Õ—íöÓ…Ã¥ÔEöìoYzB–Ÿ:5°ƒ>6¼‡Õ&?\*Õ—øaÚÍÛ~ ýe½°Â_Øià€QG'‡ƒOÖü…@´v °D&p‡Áß{#´³}ðuØhQ²mÚ©ð¥ñ|ä]¥±"æ“ì8Ÿ3÷ M‡4æ~xJE7ÉØ€ÉHô Ç‹#Y£«­­cßI£¦òÆvMßÎ+kîàåë;œmÎBòyruH‹);‹©+ùŽÃ ¶­,²ßË,«WÂŒuÓf2,î‰wü¹¿\åL1äYæŽlDXX!¾ð×à—Á·F„ »¨mXS†¾Ð1Õ‚ 7†À·m˜Ä¯Q"9§zòcÙè«<²®è;pq»pÆžàùèÁB Oâž©í4øíŒº1üÍ?ê|ŒÎ1?m6ºô"€Pð½ãaì4èÉ»í¡Ô…ý &FŽ2yU§ •¿X)ºvø±›ÿ];ØNˆŽj€>ïÔÏÊ|f_z,„¾ñˆä¬ì±€r«éLþÆLeœ?å¾&ÙX:BÌ‹ØOß#zÇÝ — ­»vt`çÛŸhXœÝR8ž­½hA˜ #túÒ„— •¤½iëò]¡ÙO‘0s•LÆYÜàHŒ›‰Ê&ã¬øÄ(¾§³¾œW W=»p’ç%Ó"SeØÄ´ •q¤›¹Ùi;ƒ^úÚèQЮ¦bA‰Û¦õGTj6Áø„Š/ ßJ RÆ…QU†Çç±^<óãš1^ Ó¬§ÿd'ã0‡ÓËD†hœ˜ê2#ÌÊýz‚Uwõ6-Õñ5Ðæ‰þîHZæsxÉ.Döu«W ‚r¡ 2ÒDql»ÓégcaŒ=¶ ^ÆbÉ¥n’¯5y˜úæ`ÑøÙ‚ýì=?é‚õÜÖJ¡JôʺW[E´¯,i§\ƒ÷¿Ò6œÀ 8F°aèÙJ¶$½³mºh8(˜_¿öÜÞüLbÕ ü •Œ>• ê*l:ÕÀëV×fÒSÞ¸=mP×£|K´VbïOàAùàC|;ÖÙÂît|ÅߨŒñ©éñ"Š+€cq–¿ŠIäƒÛV“D‘¦5ëêM釆îGaÙºìâç÷+·ˆ½ÍYu»F~dð_ý|¨fÝRejR¯ì\•:)X’>Lq{(gÆ1j7ðþF$Üÿ´m«„xC–"òóaÿ“bªí-—ž¯¡Ѫ3ÜØÇ\všÌÔðÆì$8j-Žþx¥ÖŒ"þÄkÂ]RW6 ’RŸ÷îÞÜÞ©%ÇÆ¥äù¿i&ÄRŒ|¸`‹O#›ì*cÖ6àÓ5Œ=Æ$ÁÿežªôF±]xñÉHÙ:çØÙÅõ›ÑlßÉî^«ÂÈžŸz›÷3u•:¿àÀ˜z€PjÚúbƒ—’n½ %áˆ*”êRÍA¾Ä<Ä<#ðQºñ^ûë0¤ëEîò§õ}¼óduWêe.öë9$ŽŸ X{“e$©·gÒ‚8iz¥Åõöï¶]yi„<¼}¬AÌ·Fe´£Ø)²RõWs!›j¦–t­œÍ IŽy iÊ"±¬2ŽŽ`# ¥vOIý*ùÓEMP!E3÷ƒ“ÝêEéýëe¶ ´ã*Í.Á›_íj øµ«ñžIQ><å Æ,?uÌy·âñ­kcGƒ6-GÖ—‰t*Ò_ã—+ ÚjSÞ‘Î÷E—?´‡oÕ>š1é,˜ƒ Æ÷``{eÿ;Ý Y¦¨Ép¸L— U §Nð‹Ô—Ž‹nµuXÅFûŒ°m.·Ž¤RÃ,FŽœÈN»K£øå·Þƒ‰—·¾KHæ¥éö¢£°þQûpVzíñÎîDOØUSÜÂ*®ÄÁ´Z|(]ÁC“蟼VIÁò8Ä"þ£%O’jLÅŸÖôÀñ…rÊ¿ «éäÏ?j5Ö5ÂÒ 3Ë0©”z&z±¿3ZÂ@&b¸‚E)‡·¥â;]Â5YσŒÃrûxŸ[ú£,”aý@ÂÌ•vŒrÎOÕ蜴Ë]¡ñxR0ÒßvŽÜ2*z.‹_i¢ád¼—od5c1ýËThÓ‹~ûxÆ×´¾ Õ…pgÕ ”‘O?˜Æ+ù°2 °ÇFÅepÌHŽzäàªJ;/Žv>ZšØ9`Oßzìø*f´ ‰½1òOH»%YÕ@vìåÎ ¡ˆÝBÂ46•²¥˜éÓ°^k4uûy6ã<;–Y#+.[ÙÊ l$~0ý|àÍÑN!ñ;9Û ©ÒCÒ¥² m±–%<Å2i®_ÏGH„K]ÍÓí. ÚãÏû-606„uZÖû×,Ú¤…yzŒøŒOcWXE[ï:|ÌH­­XŽÙ`Û ŒzâX“¤ÆhLv…6#•óQ–د¦æ³ìFqŒ˜Á®Ûyú¬&Ï7.xV£˜äÉí«ˆcÅQ©zs·Ö>µWHM—ᄳóPv~ŸÝðSñdøL8Ç!äç¬sE¥UùkÉTÞÖzÀpÌû ñÛK–š3l”°1UB’“ŠX€æçÂ5ð›`U·ÞZÁçñ õ£ÎëÙD /¡†‚Ȥõ‹øyAœ—m@[G1¬OPÞU5u£›‹Ä/#QŒwDÑî2±ÛÊ}9U+{__÷º47í³Yf!íÍåG&AÕ“yõò_æØ ºÓf¼2?Þx…ÅFa(ŽõÓ7÷øšÇÑ#‚)iÇõðC$¥ä(\ŸGÝK„¼)QšvÙ‹Kt*¤„ëpåSÑK–” εñSRÖýœëµÅµqÙ}¥}«S~´¨Á³jã ±<3*¥6Ž ~ÙOøm»gÆÒô`ÃüXüN¹‚üs²µï›†9Ò'>æ•';ëÀ…®¼`€š@ŠÝÜW®"—)UѼD H¤%9â ub¬0ö ×~Î7=5–ίü|µº-CÎ ¥ÔíàÇ'1µdðj¨´‹±; -—,xsê2“œ–AÓž ”*%©Ï0F‚os³“¦<ø2=ó_U¤é¥/{‹÷Ä!'DX©oŽ¼Âµ ‰‰ONŽ»Á‡ýæ—_fð vžûÒlóùÖÞ7!“Ô-cH}Eñ¨mÔ³Š%£b³¼}B‡@óéNÏøQAê™lîñIyšJÍ?\Ó©*‚¤‡31@úþí°Hܪ50OM´ñl:šØ¯Âf÷•;Aˉ;{Vðkx¿}ÍúPÞ^:úöDÚi òq fÎ(¬;°°G6rú[« _ï•ié"+«H%á˜åÚ!z™^Û݇´j‘¹…M€ãßÜyXÕƒ(»["rȂЀ$ WÜ#wèbª\¶¨¡:.{”K¸¢Ð¦F'KJí(æW¹TÓÀÌŒÀª”œÕì^6'6{u>º¡;|é² £{«8nÇ„3‹h/nt᪠ÐZøJˆµ,ïoy0ç¯ÞÐo]¥}oÜiùíÞ­k—ð=¡Âõu4”J÷¯¯¼¨¡’?àÉ"G(eùN“s]­5$¿^¤ÂeqO½H®(ºvÞ¥ö+ز÷ÑŸ1Ê.uÏJr—™¤˜U„äž/zΙ™ÄˆÞÖÈ·—×ø†ÌÔ–ÃyÌ[Í¡¥¾ØÉÌ_¶£Çóœ „Ã>$þ¦$ì×)CÙ8L¬`“:îåKõùõXcŸº¿kÀXÛ¢ùŒ©“=ˆi³@ñ·¹]|/^ÿçý—wÃö,8_á’ÓŠï°ü HÛ0UhÉÆRÁ³þçPÆjI+^dH#ó(ÌûÁ¡~µC5º~É}rœöeµ"8þ—Ç«ÄSHÅÎÛéÒ­©µB&`gëtè}dõíƒì³üä«ëQÙS\/3RŽ':¦¶ª©û÷gÂæí•9i ä­úõeëÕõ}Ú#¢´ë],¹„L&ØXÇ)î;rUHÏ(^t`úMM(¢îtíéåÓ‹ò4~­­¹ßú»€TÊ^q9Eq×ÕÞ¹\ƒñôs‰ªCV¿Yçüñ[e¨,žnÁ ‡g‰Oób¹E'RŽ–‚…u“ú¢§écPωk t¬òCcüÀýÁÎM>î»­PµÞI_ ë÷^uîF÷ÓV}@€ÇØÙO?¼–›é`âÙóË6~ãt·ÌWÓ&î²Ã4}-øÞIýÔ!Éû”ð‘«Óž8öÈ öKAß‘‹Ý•4¤×™5½ð’ ýEª·ªO:‚n‘ýfð$8¾`r#+›Bãú–ä­ynYi@ÇeRáË'ª¸or5#ÿÈ4Dz~¨dêÁpnºábÚçÄp|}“bK*ÔÐUª¨À/š”^]>xˆÆ¼®|ˆåç–Ø1OY{W+Fqö¼KßBJ³`>“ØTóD­;ɤñƒa€sÁ‘‡^R'$øÍðœ¹ÅWŸs5.n¸)/‡a6ãÁhÙgÉÇÕ¼ö¯zå¹êû|6'Tž³hzC¢Ð;ýj^Ø/º”µl¿Qk˜lÆP^Ì­¼*ö†ßC>õ#ªÁ¯xÍÑÍËgY`ûëÀ¤¤Vø¦[•:–Ž—‰Q¶¶eXb7ÂÞL‡óî±§Ê×´Ô-ôæºÃM ø^ήkÑ&…¿¹O`Ögz^cêo­¿ý$˜¡Ôû5@XÍ…|3¶è© QAÂ`w_uÛù¢|õ¿Ì{Ü\½]Èï¢Uèó˶·T¥!yWÓþÌÞ"³¨8KÐXÜj_`9ÉWÁY-ª*{“¶P§'ó‡Ìù—k1Åíhe:*ñýšö‚èÓà S§Û¯€”OQ‡‰Çz%CÓUlŒaA„µØ¡5It”ÉÅ”V4o,µó<úí4~k'²µÕSÛ'èâ^Ÿ6P”ûž,ÄÉ4²Õþ|ü@ð½V¡S¿)þ½û¾ºÔTañÁ5ÿU ÓØÁã/£ˆá1…‰OaÎP»ž¹NÍp§­iX-÷$goIES‹ç˜ü³Jü"Šnê!1ïÓS›Xˆä>4¯† =®¤ïËQˆô?å]l«¹Ç±$~ø>²PıF VóÁ°»=y ‡»ñ‘­…‡™Õ$S¤‹tßÅy¶<8ö;Ö°Ÿøbê6r(Lê:`º.æ¤ãÙ$÷3V;’3\•[Ìçd"Øj·íØÛ>kâÌÀn÷š>~3ìS32œÚðÚÝ}ezÜ‹WL²„¸*t_}D‚Èo Í/ ˜P8 ªIH¨œ¦¥¥«EáË’góz~hS¸ŽÃ»½ f­œ½ã±Óo€±Æô «\cy€¡ æ&47|‡)p»´R‘B…·$0Â$ó´CòyÕ»MDÃ6úæ7tªÿRëÉÍ×m×GØí$ÆëRQ•ÓµúA¾--j”ê·ŒO2R¥=ƒö2$WÙ_c½Íšt §ÙÝšmö΢ÞxÆ”®µÿøK½¨ÕÑ-ÝÔf•w’T³3!Vï5Zé FEŸ…Î5ÁŠ5ÅàæÓá`¼†ï(!tÍ+ÇËÝ7Û5 Á;ó¹7#ÃúÎÏr|¾‡ù®È`a”¢ÂòÍi"—Î Rßg}q€ÞŒ ·RZNÒ.ñ¹K2·ËI‡.—‘3©¾¡Â‚O;åysº*ÂJb`¡¡öî÷{¥dÉCŸDeÏxBÖ¥’ îpÖø«Ã™oßТáÇ4¤ç`MjÁüç6ÈoÍê Õ ±1ܹ<ÞQx“LÄMýn…Í $+§„‡÷èuÃR—¹Ä ý[ vz×Ê®d}ùÆç8ÙpÀ7uÝz›ªHaݵ×Ã4¨áLŨG¦L½T*œÕÀvŠÑî•k|Ÿï 4ehqEa™É‰Þ°­axžþºeðÉ¥bý4Ý%Âisú³æAÉpž,ÒæìîÎòuxBq“„O¶=jƒÙ ‚–ÞD+rùwOZ°“hIÚć} Ž•þû¥c…f5ð‡4 Á 7‹,t¶Ýt=Øt‹Å#jKF&ÆL&ùØÁºÈÀì7°ÀºŠMItÀT9¯¹Ëùh¬Ñ8‹¡×´ÃS¢VK«rúáá@ ÎkQâú[z{[ÜBþgÇÂÝÓÜ›ãØ ×p6îÊGOŽ ÇuuÑu|ÕµiGÏâ6gR1à‰ ôvŽJ¤qûí[¶¿žé»^L&8ñìöRlq—¯kâ`d<ɬХ¸ƒ÷yƒ×ø5Èø> Î½I´ªš‚Dæ« (bÔ"àgÞâWœ«ŠuJù_»cº5ül³F wãÝÆDk•a#.?ÙSņÊEŹfg›Ö¿{X[ þ6àIôÊñ@H…Žà¨GKFk„øÞÇ‚âÂüUYWÎUa¨€´q Y ðdÀÕîˆQòÝwËŒÈÍQ;fw0¦ènë-8ã¨lÔêšdíŽwá¨Pg ·Ðê[!aª=Ÿ)é-^š×¤‚›˜å'¡«æž§ßI~‡‘¢YŸ0o2Ÿé¥Ó[áWm–ñ”§bõ 47ydž3Í#ISЩ_±c""sWñ3XFŠg|÷ly¢þɦù-¶}úŸÜ!aGôJŠÌ‹Œœ³Ú’±4°)e®?)é5ДÕI.#ùPñyîæ·¢ÍÛìpëM­‰Ãw²ýÞi’€±}/À›ß`*aôì)Ü”å»OŸ7¤p<áÄ=@Ñ âgÌT&=ÚbJÓZb£R>ùPžÄßG$›ê'¾Ô„]®‰2Þ— VŸõÎ=ÚcKv|á*¢^ŠY[£WmE½ùÜiÙ¸H^ñ³Øåß#ÞÂ÷úùɉ+pÚ~¥;<(› ®žVÒ‘V,Î`×̱\,åàD–衳2Þ×jÉ`[0Ù r|8g_d6²³¼ð­"zÈ”ß.5*QeÞÅüh:dçbQLwR`Š]öã¿àævŒ›R)Ϥð¼p2K5£{u¤Àp°àâÆCSn¦ªë*[†ªÒ–ègðŠT~мñ¸aDýÅ5ƒÝˆSœU7ªOÙh6÷E×3q*Ìò‘eJЈá{è®zbåõÆðûߢÊÕ_ EžŒF[¤y¶ïÂñÝ¿{1ôaµ‚a‘³6¨Jœ$bgü^7zȬxªã°xÊÖv?„8³Œ6om®ÛŽú¡@InÇSˆÈí¹®‘¦YeŠ;àkö~jLW+È!å¶¢ÝÿŠEÅû#øáÔu¹×ëÎó¡B{`æ&3ÞÎüƒ'i LgõU8égèÝ}þHv¿‰Jb¿üØAÝAý+0Íb{i˜£¥9.múò8ËU®Ïd:žå=‰ú1XÓ)…mú´{÷½ö²ävënë¦/äµ*`†';³æ!¥]˜Ép€JH¾¯‘¡áÎû9¸rG‰­‚„<©úúÄó·ÄçŠYwσ9Öˆ!Ï×ôߺ.Jo‚SeÍËCj²Îi˜·»C·« [‹ZÃw>Pn J]8¤µ Û²$Ëž)¶5ß¾bÑ3 ¨Æ¯^‰Ú:{(7­w&!œ8ú`!Kuffâªûg%rõ÷vÚÃÂ3œ›7ÇÉñ4¾?¥}¿”ϸœDŸ_—p Ý¥:XÒ£XÇÄ¢r ýjA]úèaÁöí ÷q]°D,fÿ¤‰‡ÿͤxAÛYãŽa]·äjOk+”>°ðhEÙoÁ²‘€{ƒ^Y¡‰¨èQ;o¥ÏÉ"»ý·O‚ 6,ˆaßÄå…æþˆ‹CPÐ>Bêe|Z¶Ñ6Ì(æŠÞÇŠy::Ê[;›ûvøªä(æ—å”gWüE8 ãÀ0›1Z’`¦áh…Uäm„¨%†~6Ì1Ó|­O³-“…¡Å·ìÜZ[4qggOSÎil¶RÿƒÔv _úÑa§aÎï0ýõXɨ…ÔÕ$cezd<ïaӦߛ |ç:à¸1£—ææÜ}¿ÎÕó»²ÃY B6ͺh¤f;tPܶh Ø•±ŸÅO ùŸ£ÐˆÖ‚¿{ 1E˜¾¹Þ»çŒmåûο}]1ÍfdòÐ<[L~0¹Ù—hÿ²ËãÕP&uG¨šÖ§Ûâø ëxÔžghuœ a`qIAeþ»üCƒÜ+¸ñºhaq†VqEY_mˇ ?g,­íÜñ“f Ãï€ðO»ô<'¦,0×l¨Nƒ&Ê)h¨{˜¯mQº{#¹Aº3"°äJiÜ Xmñ.éFFzŸ[‚¤³ŸùÌÁ4\ÁQ3Ë¿Vœ¯À4©d*:‘±sàµÜñ>à‡…Ä?nvžö›8Ù$S‡;VWu}ÝÍ· “Dõ-¬iK9¿¿Ø)¢8àM%úÞ<6ú+"$š§Ð6©ï9Šýz4ÕIÈâÒ>§À l”Gs‡bD„>Ä(” è¯·8ÏÜûTˆÓÙ®X|]²ÓÒÑ©\¢É@éÁ¤’­Ì³‡K_üC=bB}%ÄŠÚß‹Wy“$‚â¡ø½ü3!—Iñ2›Ìr {ö€™Sùdoáð‡r¼ ±DU©‡kò5bÀEæÉKøXÉÔm3‰ O/ú[Ƽ0ÈR2˜E;¡4slÃPÊïƒ9¦<­n)õ màŽKâ{µ®¦4Ë…3±yù¨˜OcZöâjfõŒç4Ä{+-ÝBU…ͳ)È“¸ŽŠÔ°1ìÜø‹‹=¿Gr¹r?Ùºþº`™%á=…Þ@èv…5W4Á’êTíK'ý<˜f â_B?lÜEàWŸŸ»¬7Å1‘ª²jF¾\]XBô“pôÛSæ‚É[çî2êñ¢=™4FzPEÄN 8WÞ¡Ç~³hÑ$\N`å|xˆ¨o_P²BkOÊv%Õ&· fPmEŠ“•‹²ø~"˦'E‡æÏãNä%Ÿ—@ƒëØ–²"óA]'|¡V½‰²ï¥·ÏTÍ¢ÓH@Â\ª÷kþ5\û:ÚØûÞ=á¯_ —Õ“EwrµÊ!ûš0’1"Ö§ÿ#$†vŠ$–j=C~[ô#ã2lIñÔûZlm¬çbˆ½é^àm”¦/ϽcâÏ~==kZ¯{ïÈ]G ÍðòVÄw®m¶b©}G°¯B¤74qþ[Á ý:A<ï®eı-îC “*³ðUß0òN4‚ÞqÆŒâfVæa/õ & fIðX˜ä/]/ŽÏyÚ`WÜ—z5žµùñ¾­œµë¨î¸P©Vbç³éòfsÞÂ:– ˆë8ÿ$u§2ytQ4†ªÙ:yÈ‚w,Vú¥ô;Öþi°]ßK‰HY†hh\ŠÿpN‡ ö;@ŽH“Kð'4EÆCMtÀ2ñW”dŠ+oF#pœO(ýE±Âã ü>‹Á¹òH\#Í-Д_]û†5Fœ´4>äN–0ÂgC†'a£Am­Fu´Ìñ.›FǦjß¾Ú†ŠCÑwU_U=šP+˘]n–¡>_²AÚø1¸Ö»jSiûÊ–òµŒ£a£P nÛôp·õ°¹ûü퟾ÒH¡á7OVÎ4 ˜Û, Ú)th“ÝÞ†Áô몼©5öH¾‹œ ÍŠ‡ú -~€à!Á®P'áÆ¹«ëz_V&<çàÙ'”D„~¸¾ýÜò¥iÒÈøu¢²¤÷9M²˜Û¬~w ¦dWRtÇÜH°˜Å‰¤'1Ë$é•S„?@C…ý…Èm†kfÃæç.4z“ͬ öý.,Údºó²€PTW—Àƒb mÆcCÀãÂY]Ŧ’êÊÕräî[ÃØKÑ~@¥ŽÿÑ줶 òb½?bAÞ7¼~Ãg‰ƒÒM·õõNZâjuwHáÑ…&€º}ÓOù(‘° JhžyÔÍ<â,zŸgB¥ÑØkX÷êPš«UñÝžA²qõ¼Øy\ó)gÆc±! e÷e–dHªÎÏCT¨¸•‚M6dËQߨ«}'Û”ýàË4î^ûwrûsDÇ£i|¶¥¤0£aØå¬'Z3Š‘¾‡VSC˜“H÷äþxpéø¶¦L‘6%)|ÖƒpúÉzu÷ñQ4$¹y/cLï}Ì'*.ȯ¨Í1§á×µÌæ…Þ¡‰ƒS¢‡”v>kIxÍi®©˜›‡ÞèÌ!úV.–'WA+µå3nÃ0Ó7¼2ûÚhó€ÈïWš{”'Þ’M²"åôskÈUØUà†¦>”¼¯šm˜ 5 ð·üe[{õão¾õ±pkkãHùÅHgµösÒ¯±1ˆâ(AéÔP¥ë&îYøÚÒkC—¶ú3µÎÅÌôà *ñ-¾+Ë—b¯€„j$º º3qî]Œß$RYî$cìˆÕgeãabÓE²}äöpJ½Rª dRž_°™YŸø¦¼ƒf…Ç ã©£­@N#JPï}„d¡¯”šéyµ˜˜·y¼@-E$è—8i{Ó52ºV-d\‰ r&7ÑS7öTØ[×Ù ÙEçÈ_±½È¹ Àæý–ÍDn‰Ñ_KPUŠŠÝ‚Dšg¸âåŸâ€C;›™jïKÜ7Ý\ˆÊ¼¸^ê7[:0´¶Kè-âgž±bÄê¯;æF1ä• øÉù ›w¦ÐJ%¨†+öù«+í*ãp%©K°çîº,¨«øéƒ=ÒÏ: â¦Ë¯£#ó{­Uˆ|y$êjWDã>ôK¾Ó‰ß¸Æ¥Íº›ô‚™ ‚‘5ÄFÔ®¤k¢ïJ¦bìùÃÏÆ¶¿ôBpµ——}Z•“:°©œ`œüò{ò ÉîÏÔkK"F9†ùF9~*¶qhcêF.&cšSW¬„OžÛ)Ó$ÿ*ëù“(èZæáÌÀ-"¯Ú_#`÷wQ©!ríqÀ<ß‚/§ƒŠTg‚l)J]õl 1jŽÑhYäeuµªâ7=²RjØbaÛ‡Ôq…{ÏÙ~¾›ÎO&xñ×+ðæˆ]3–á/þؘRà·æ2öN»ó…¦—˜¦¸]†…­÷VWfÇ~«S+kG61í=ý…Ë#ëÑöqî·½l/øÝÊÌšng²™BãÒ¶²l"@Aîï\þÜxŸ8œ×èAB÷r±¾Ñ=/JÒ‡ß4ù¼'19Ȉ«´ã/N.®Ž9F°€íØ…Ù;²/-F]>éj »v©øKvW/äa‰üq·µ ƒg2®óЈà_ú€¿×‰ès_e#T3ý(?¹f±¨ì𺑳à©ÿ”Z*€'pò_3oÉòÚ®~«M ɼÈÒïørßH±‰ò!Æñn<Ýž-kY|™IÙœ¤p)\2ʱ<=&LiCºrå‡[g=rĹd \¨…¡ë̘©‰H¨8ŽôÃy~tÞŽv? ãй„ÛÅôÕkì"ëªÂ$ q”{hÞKp€²Åì´œ5ÑU©EÙË™â¤P`Û»AÛÐ*B;Ô‚oÎXF>Z]dƒF2ÖÅb¢GÐu6± ÄTÐz2å:ß5“ßÂï œ…·áü ÑýR˜€ŒR¬ÔùbüIpëarK´»õ-½ž²Õš°6À¹´Cï¯nT߉δ‚çØDmƒdTØ­J¨ N’Ϫ÷øDð— ¡lHXÛ™nøkiWxpð+cX©½á8®U¡‘—ç¢Gl¨Îs2Lgýméf#áDŽð¿TjJæ-×ÌÌD’o#£‚çЙ xË2¦ßŸÙQÑÜÐw&#þ5­ïCn@Go𹳦ëç7C€¸ÂGf²Ûh¶v•\K3²Õκ초eÐܰçL¿8³Õ.CØH]*tÏúuꥬ¾‘6¡ç>dY1{TF!Í689AŸªï¡0¦j7¢Õy’K>oQ PüÀ‘^´˜b8!µ “DS¤ã‘Ùn¸H©ôiá¸IA3»kR^"*šþÄ,†z^ÕžÜ|7+ˆú—ȸ;iPœœÆÝõö¡'CsR±‘úG—±G”@ o¢Ð’Us[å×/¡;e­º 8¤ùv ï’lQg•ã K±X>ˆ®ˆ,°Ð½½|©ØÛ“OóSPÃÄøc9yáOÁ©}€Á ®ÑœOV6–à í67¤7ÑÈù›¾ˆWÛš$²‚—%ç>Ã3øZÝúx]8öïíJM§cPMÝ[¹ËΜk‹ý=:…Ú„:y¾e“&T¾ÆZ±´ÅÜ×QJp`lqÓ;A´ùŽó#Y‘¢ð<Âô&æ©!UM*2t;ü«¦.0ãq•µwáLs¨²m£¿?¡d *–=aH ’oùÞ¹ÐY>øX…PB›}óÂ麩 ½ê¹(δâ˜X&û¬×–.` Ô(û1šRä+¬iÅÖˆÆÂ«+~Îȧþ†F½§2•#vw:U´€¢6yš¸@ůFYtÓãå…F’š–^}Ù£¥}- Eüëê3#Ë©~冚ÔCsÆ”Q¯¼`ÃüBûŠŠ’ãþú&Zªú¡úT³ÜnuÚéËt!ŠúÀFÐâµ=õใ40y¥])äuUƘªÍL,-¦úågç"RóÐ'†gø¾)׳.¼ñ£‡jXbΫÆÀëGgüI^¿Ùæ«ðÚä·Ó¶O}õ2«ÔÜð#‡Ü<#ù¶@.3J5Áíó›Mé66úÍj‡(”Ɖ¢ ~øAº4ĹN_'AâÈ'éwÒ!‚Ö*>ž£³\¹Ÿ53xâÊÕ–(Ö°`¯LcdŒœ‹u£øŒ_Ý?ü`¤˜Á S¢¤´Óý6Ö”Xòàó»NAŠ5x#Ž~oîö­B_{CÍݽò«Bêó[ìOØ¢Rô _È:ûlé¿«¤æËŒxÙ¦ùð:È"€±,æì°ãE„ í±o…½î^´?DŸTæçs;wŒ&—û¯²õÛž% 1ÈòØö)²¢gþùñ+2/Ý2Å(ã‚-ØuµKºÚ ¬b—mrìŠwRJVÍ ?µdÝÝuÕ!m‘„å:)•l§+o]üÁT…æÞÆ®Wßœ]g’p±¸Ox–æµ Åíu¼]bb³Rñ !guT¯D¢îö3cÚ-}ŽX0ùü‰Ô€×^ê×OÔ”W•iþ€æ:6j&¨î¥9ä½ÁRê›IÕÒ[l )ª-öuXh@'!}Ð?ÿI÷Ïâ©uÐÉÒ9œÒ—è)ôfí›õíÓKñ‘(ÈÊŽÖÆ¨ÃÅüÞÚ‡4Éz«Dê@ŠpNýb(ã³ RziG+×è˜\`p—ϧû7á©¡ÛŽj|ð!~ À‹°‘ÚLn=€ùߘ)×õnt+9¬×œ†ã&½´ ~ ÂÇ"O ¶›Q±Ö´Moûëe©»Ñ·]ßå✴fA}Wt©ÏÁ1Š“Ð`ÚòtñhüÍm^“.z"d=ÓLzÛÔ²Ãd_.8ýÑ ÕÆ­­¦“G½¾y…æD¦¨NÅ;]Ó3Ì’x¦Úò…WFNÔú% «F6rA›±¡™‡–á¶·~²éíƒ!x\_²¢f}%ïƒíä”nHÚPS Wv.˜ÁÈ|ØWcTÛYø$jPı!.ú±ngÅ»/¿´é8ÂúÌØ¬Ð€×éÅ[_’ÎJpj-*ÐtóS?‰$ÁÊ´ø7Üšš{ô”«üù:ž¸Ë«grÀ’Ó Ao;z):¶Vödm¹ÁX ƒ~_?óUÑ “.üpÃàÜ$·÷Á[V)î .-müO*–{ŽÝž@,Þõ-gÃ9Ž:~’‰Uj½&œšEŹ5Ç*0¯`ž¹æøô†Ïýˆ{††´b0¥Û6²ZÑ¿æi£sÝHÇñX®ádC`Áã•æ£‘R 8ù× R¨-ßS+žx›Û®¶5íYI…"<‘¨þ:Ñð™9šîÒUêcâÑH{îàÒªŒ¦;Â…vVïÅ3RF¬…Á¼Ûëwʸˆij…9/½¹ˆÞ™(ÛˆaLiRL¶­†š ÃØE«êvæqªwg"wݲ$óʸ xüµcµùf}زˆÞ.ëo*ÖwÏ­~s²kß”(õY‚+¼J¶Æzã£7‘ ˜ùLË|h¬k¼7-7;™‡Ðà€v¯z|ž4ÍäÆ\{c4qÖ{}XÆÜÆrd:–ðaÀcØÜ”|ïà`1÷äÀÛçeäéãæâ´Èd·Õ@JS™é¨zß)¦´ ]+Þ€ —Áfµ`ña3Ü”âµ^@c0‚‚âT¢oÓmj*¬G<¬!Jÿµ,QîQW©+úQösë ÃgFÆb‹îN™s˜}VZôOi?¿†“öáó”Ê0Cðs+F#¥LÕ*¥îûlØÆoš äÙ\>å&;8z $ß_ q"{ÅT)Êìc¿ðMõ3f6a#87ôð 0Œéåló܃ˆ“&Á,ü&á±C<¤—zøä'Ä3p7SÐn6MÙ¬zãà3¶5}ÆÉo´åß°eo ×î“BFWº’JÓÓ·ú*£w˜Ô9€q ÅhÃW‚ oVLØÕ§üN`^·’qö_ÁŸÿ¬Cx Ža‘èÛ½ú,J¨ÒµMBÝ®U³7rgßjë¡“°#¶¯Ì,­úïR÷ ÄÔeÏñm5Š[åÃ.ßýf¼®±IøýYïÕ9ÅS ØÒ zsæ–+k»õ'~ˆH(µ&YsKö‹·™®‘²¼%TgÝyH»%•òþ˜ñ Ô]óqéóS[ ¤ûžnÜgXÆŸ¢9ÅÆånJŠDü•*»¤›q§®"ÌáêØòN÷Êû ‹L¡”ç¤<݈нlœ‘¹. DžOa#äUÐæVæñÇ!N¯˜Ûðͽ~-óa”mÞŽYæw °¦´ÚBrí±Æ¢ð†2Sé¬_:ewÕµb „¶›nUJ>òžþúMWp5w“K_øíK<.^’à~&w ½¿‡Vß–u5Þ`;œ=B!D­53òH¬i¦z#59Ósô5p%.=´eÚUü«ôwé‚ÔsáëŒ"O¸ §ybÙ¡#)3äÊ‚O‚/&÷åÛí^D×ÒÖÑ¡pø´ð”Èjø€ã_óu¿ýXy®¾a/›Á·agˆiÂ~Œ«öCPàêˆþ/¥ú59Œ³ÖÍg`!YžWñvòþBäæëÑ%žyj[×f6®7¹J?f-äYt$¼öÙ5Þ8j}uÙ‚G[–Å+?ª.š~Òæ1X¯$ÿ# gçt±ÕS&Fš»t¡ Çå°çyÊü¦=+8Û°zj’Ng¡+©5´…E†€ê¹7Y­žC¯Œó%ôÙ·E•%!éÕ Ë\¥T㵸WÉ‚Gú«‡A¶E ¼ºXrO®ô#U'lr"3ˆäÚ[슴Ÿï–½ûø]È3Eƒ«ÍÛöI^•.ÁÝeÅÛÏÔ‚¨_ÒfNDÐ8gú嚈U¬!e0\©š TÒóG‰¯¢ª§úϽxNù§óN®6Å:®ÜÞO-YZ:%ΞÈÎö~o*ü>ŠS¦.ßДÔ1R@t­“ýžVüâ»±’ª[¹W'[zÀ•¼GÚ2Ke!ù–öýÜþŽnjŸK(QE„69|Ÿ™’ fôuˆ–‘Ú!˜Ÿ¥ú %%ûÉb‹tªi¡‰Y–ï^Rsy9­FÅçQÀ˹2„RiFÛv7?újŒýuR´g*À ¨ö%:k¨€p9@Ðw'ÖÚ¿ˆ ­›Ôñ%áîôã¡e›îbøÖÑsÅJ;÷0Ýžý“ÍW‚o%K‡6ê­Æ º¼‚c®hëÝœv—Ë5à…¾HcŒ`J#|ìg•3ÖHƒºF.v*®ø ØfwZvPì4Ϥ6Cp~YÚäòbBËC§óp‘ˆ ìI£÷¼_ë{WÓx¼6?åëDö¥‹—³ÐÎÁA`KNÿ°Úf¡9ÐJVùNô³N²-Û/âÕp³ý2¦ÿ‡?ÿÿÿŸÀØhèèlgcèh…ðŽ ËB endstream endobj 12 0 obj << /Type /Font /Subtype /Type1 /Encoding 2462 0 R /FirstChar 33 /LastChar 126 /Widths 2463 0 R /BaseFont /SVIDHQ+CMTT10 /FontDescriptor 10 0 R >> endobj 10 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /SVIDHQ+CMTT10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-4 -235 731 800] /Flags 4 /CharSet (/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde) /FontFile 11 0 R >> endobj 2463 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj 2462 0 obj << /Type /Encoding /Differences [ 0 /.notdef 33/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef] >> endobj 8 0 obj << /Length1 2336 /Length2 17256 /Length3 532 /Length 18560 /Filter /FlateDecode >> stream xÚ¬–sx]ß¶°c66Û¶ÑØ6vlM«±Ý$ml;mÛ¶Ó|»çÜûkϹÿ~Oö“g¿cÎ5ç»Æk¬MN¬¨B/ljo °·s¡gf`æ!•Sff"bf`b#'u¹XÚÛ‰¹xˆ˜¹¹Yˆ$ÆÀ/À;; 9‘¨½ƒ§“¥¹… •(õïIœD¶'K#;"9# €-p #"{K€‹'‘° ‘òï+œ‰”Î'7€)33‘©¥‰ ‘1ÀÜÒŽñ·’”™=ç¿Ã¦®ÿ;äprJQýK“š(ijogãId 0ƒc”·îºüÿÐúïÅ%\mläl/ÿ;QÿgØÈÖÒÆó&ØÛ:¸ºœˆäìMNvÿ=Uðo79€©¥«íJ¹ÙXšÛ™Ûˆ˜þ²t–°ô˜*Zº˜X™Ù8þØ™þ·0sÿR`“Rù$*Bûï3ýט¢‘¥‹ª§Ã?«þžü/fþÃÀì8Yzé0ÓË œüûßozÿµ—¸‰½©¥9 ;‘‘““‘'°z€ÄNäÍLdig ð x…ìì]€—sâKdfï÷û@gÎhö¯Ø¿‘ˆ–ˆ6í÷俆¹ˆÍŒÜ"ÜDŒF&À¤ÿa^c̰Ñ?1Và²@'#Û?!à4GW{€©±Í¿kæŸv"F;W[ãß%gn÷'ÌAÄhj\ÕéOˆ“ˆÑàd°ûëj ¢‘-0êl<¦¢Üÿ³ÛnÅÆ\ÀÈ `g0û+Êü?Ñÿš L•‘óï%œ­ÿß­½­íŸ{eê[x:Xþ¨³qüËÓÒþPÝÙÆÈÙâO(îp²ÿ:ÛÛýI,;PÖÅýÏ8;PÓÅ ð׌߇iïú'Aì¿Óò¯ãbê: íÊ:Üþr#à?jgù·×ï{¶±ÿë"îßËØZþg”(pt5úSO¬¿àü»Áý „ÿp‘?Ü[ô7ûCÀMÅÿ!N`v$þpkÉ?Ì˧?”úCÀŒHÿ! ‹ÌºÈþ! ‹ÜºÈÿ! ‹Â?ÄtQüC@¥?tQþC@•?tQýC@µ?tQÿC@?tÑüC@­ˆè¢ý‡€.ÆNF&Ö—ÿ(yà[柧ñ?Xÿ¹à?Ÿîß…oédâjkføSPÜÿ³Ð®Ôýó„puÿP×äO?aúšþ…¿kè/ü]á!ÐÎü/:Yü…ÀþÕ»˜€jV!ÐÉú/JýÕø˜€Vš3°™3Úý…@+û¿håðþ®ò¿håôþ~äþB •Ë_´rý Vn!ÐÊý¯Þ ´òø Vž!ÐÊë/ü݃íLÿn9Ì¿{5Àö¿b¿…,mLÿÊ: PÊÔàp¶ü·ùÿ}û‰ˆØ{xÓ³{ðÓïcäÖ·ïÌ4quvU—ý¸ªü/›Y_¹€ÀniÞÞ„7Ø*¥!仟xÁäHPóÆ8ùÚ®™vø Å¯ 6EÃ2Ž4ë5šÏ¥éhˆûûÝ_ñœ#Ú|”Æ$.ãRç~í»î§{5ãi^§Ëyî9< µ6ÌÞž²ƒ*L¯|OÔ*ü™uÙ’§H%¦z½J Ò­ãV×ÌÁ©)‘n£ú¥†‚•X9Õñ{[èš;rb<ÄÚDŸU(LíÊ•}›+êsLnÂ/ÝŒX“¶¬ÊÛ4èÊ‚§%…¡ÈHÕï}ƒ•BDæ*NDûË0ÊÃRAÙh!•Y^¸âS—XãâarntÍmšÄoäzëE»¬´…ҋߘ.ã ìË¢)Ÿ`¼~%?rç·É$ø“m\ø %¸äE«ëRkC#4[‘biÿLϘD÷bF¼ÍTÃöƒ#qL|÷vJ×ö-r†³ÜA~¶¡~õS0†GêëçS<ÊÆÊ®'”•éSÆrb$ŒºÚ‰ñd¨ÜÔÕVœ‰RF‘{–Sóé$G]C±‡0YR..WiÎ÷ Ü Lôg7ÓÂ̈£ ùàm¤âÈÄ¿_U‚(/Žˆåæ¶ßZG“NVÖ&P5ìíÅû«DáŒ{ôÅVU§¦­/[3ź4+QÍfö†ìB#äa•§2^°ÿ3•G ¯ˆËÔ0Ge¬‰D7žè€Ó(#/1Ìh´c^±lzâH·€Æí¦+²dåQêihS… R*gò^ດ҆Ž+K>Ó[A½«6WýA Mi7)T.nÚë#v–cÓÊm’bËqæU³OçÀh²TÌhB$.rƒÀ÷ˆ´Hk%TÝî”3ÕÁÎS¯/vXMpœ(¨ø‡Í6Œócݨ1“°›WÞ‹Å¥>P£Š-¸:Eõ;œåË@^­‰.S—õ™(¥³õ^‹&Sóa„Y/‹Õô‚d½$w]y¹YÚÃÖ±¬ô©˜P§í´õ7cöd]SOâϑז§ƒ^´øQå6 {FUÐ)´Ã,u*B®÷RxGZS÷ìŽæÙÊþ âöî24¿nûy#Ó~!9·ˆÕN`¡I äyð Ô}”ß#rͰ’3Û^D|±.‡ÚÛ€`›î‡~ýçQ ‰…7þ}Y#)ZoÂDüÏ×WH?Œ¿l14BuÄõ)¦¨²m“öû’‘ØE·u&TUsòÜéK¯Å»ëÐ_¥5heVÑ7ÈÐvtˆeBzëГØ!éù¼è¦K;¿PK:BU®ðð0*býØc9”4§D„Š_g"ÉãÓNrí0gS²¹œD#ÍÙ|—72¼”ç ã‘›(s¦í»-Àcv>«òÕ?>Ú j¢Ø©Ãð‹4S˜ÞÏ—`¬Í™‡RñÒ_ض¡^œþzXkìH¥.ʉ;ÚzÃ5àÄý§”Ö&­Xæ7ÃsPåɰøe®:c뙢¦5%R6²nUš»mìmîàLñJ‹‹©›&Ì3ÏA«‡¾¨ÅD£'tñ)p$ï)áâ`ÑlY•¼*ÙL¯ƒÁÿtwMÅÔ±»fF’kWý…z"y[SŸâQ}ì»Å³!Á-½² CGš(í8¾&¿0³èî’EbbÃ\ ¿9RìpßP¤¶Ú WBjwsÍ€žÂ­è¾´‚Ñ<™¿‘.h(2$o'E—¬/ÿE¤Lú®ªáPz» y'òù(kQ óqK|2Ç×MšXT­Ø’^®ôº¬^ùxl1­]¡·îãOÚé:Ì»­ A% ­%™š[åSÀ¸ã‡¯P¹ÑnÓAå³r¾õnp…Ôóø=G¨‰ÝIyS Ž˜€e†<³Ãˈ' þŸ=+ É,œÇ±³ÁŸ©q“ ¥— MJª6#Ì×ek }ì†Qä&W<ݶaŒ øòû„„9@B óœçÄ2Y Ð`sœÚ’b]DÞäÔ7|èe3HAÆ­em0±š®4å®’žû¹NÀ:É…™üä dѰ1^⨺±oãû8x AéF'”1ù’Jž°ºñ)í ñâuäØ_+Íç“P‰¿h)RFpRM™ñsê…-—ÌÊ„õ6>Ål›3º ñ«ôt“å/Ö~%«\Y×'íåýVû‰lSî$¯Y+Bùj’u*u¤êãKHdTÜL¦KåêÁ•1DsÍss?ç~_êlX"¶¬‰ tÁ{¨¬Ñ¦.‹k;0žëºç0ÝïbÓps‚ÙTfDKEQ¬iŸ”¨½ïꪜړ¿ä7“~.–ÔæA"µ`$1Õ }Ÿ7Æ’c»œLSL|É裭T&VÇÙø”º“Ô­»Þ_/˺ JzN½ºÌ‚óÞì„‚ƒŽÎ•¤¡‰Ÿût4üÌÊúc«ó«úé0È‚8ÜLNë{<æÔt «nhsï{HÙfx)R¬ï9©ºÐäˆcfÀgôõ …÷~M}Í}äÙÇ•y³öGö­¥è½êTFiÅs,_ñçšÑJÜV†~Ù;HbÚ£%ðÑúw½TQšRg2?¡øš°dÓ ñÞ¾aý~tq8±Û³×½&[WÔH…¨5)%,!ª”á3ºÏc’E(üè§™øÔ\]#ÕY%þTó÷z<…âþ¶û:lã‰ÒÛ_Ký]ˆëû´8æ`B¿ÖþÂÍúúnȾ¯&^+Ó™üîÁ¯h¥²ójÖS‰(Â0J"ujÏк ÎîDi4¤¸[Œr§ƒÍ_zGói–ywØÊ‘0ZZnÑ(î©Ø&žaø*/ü» ›ö†ž–%÷ö0ß·Ø!òìÁµÛö…jqÌ:Ñ#íZÞö‰½…9PT;gO[•Âõóô©éÅñ—³¨JŒþ ‚Ëޱk¹Xiù%L—f…)SÀ%èÞmø¶R˜<Œ¯:eÑFprûóT3.H‰ÒÏŠÅh$ˆ¾®±~»ú ;ƒJfñörGŽœ"ðÔ—ÅŽ¾@;§eéž DßÉj(6Âå0zï ²yOžDß°Q@VñYó¥×YÓº.ÏÑ®% ½–(7S ý;n¹Çé¤Ð²ÎÝc¤ 7gâwO†»Ý}¢hzÞüv·Ý"ŠÈõáÍ-V߇peºKÂTXªf™‘ z]ëò¨ÝTgÖÑ-æ=CU¿S ú:l‡„¥úðEË4%ÁLÌ L.'ï/Õ^¸~'ä2_vÝO$møb¢î}NçÏà ÚP®‡“¥Ž‰åë¸\^쵑% °„²ø—iâ¤î«»¾­ˆßß>ÍΦª™ÈøiÞÿRÐw2Noxë¤7ªÌ@"ï3í[4ù,X’$Ŧ¡cñk:Á™Wu¨º–¸X”?¥]ªµ&D@ú²,¡%ƒ¹tù»ÃÄùh £ ³rÞnפע†ÓiÝcÕöòƒøŸ ¹IÖÄ›½‚$‡dýªN/ Óc åÞÖÛø&H¤"ÅŸ;WÛt#³–lU§ —ÈÁV܆TÛT ãZÈ”OM —–Ù„“ùD‹s•ŸÒ]j¹pßpŽ¡)Iœb]”¼#‚b—7ñãå… éW\ÁÑ}+/ojƒŸ~„ŽgŽ5ƒe½ â“–|Õ’þ@k)¾nŽØJuì>ѾPéËÇd"Û¨¦÷¡òCk Ž_D-rTŽR„6îv‰0 ÚØõrlPCß+šÊh¾Ò·†@®¶±µaÆ-]Íè9¿Ðù-7úyY€ÕE%•OÎÛämMìÖŽ}ÍìÛùÔYGà(¹X©§Ò„ýG>r”›AÛ”Pîbõ¯}¨!¶b¿Ö‚(K:‰ÇÑh#ƒ\ôƒPRÜ¢ÑTf:å­$¦„¯¯ñ”œ7oˆ=[E ÜÎÂm À”öX ¸Lµ… ôc±zúnöRT= u9[eö´•ò0¡PT²ÏÖÇ.Ù¿¤Ê² ¼Ê€~9Àø°M‰ ŸŸÌÍ2ïtvIÇš|~¼ZºFÉ]âï©åPDoûÈßFþdöP™z¿ˆý|ˆÜ÷ÓÇÖË̶©½ºEÑÌf§ý Y1É)Ÿ8‰‡–g&»½øAô˜2¨³¢}®N_±æ‚é]Ï‚íÚî2:ûÁs¬¼µ!~U nªýÙt Y †AebjùBU½!®dÏÆMAÒkÔ/Eí_ö.L½ÊœÇSô»&®‚bØy€ï‘Š.¥u*.Ö©”ZMUI^ò¼#5Ógo##ôtÇŠ5õp+˜Ì(Ól¯HspÐ%ŠãÒ/+üÉKݱ!̆´°µ#еwTH#L¢¥aÑj0Ó~léײaÐ;¼·† ´yûC,*ýÒ*<`/+N^Nh»K£XŠ—úümÑÊOF£!=#^M¥Ï‘Ô/ž låó™…(<í'àY¤°K4§–ñ5çFT\*¾ßÇmCÏsžˆÕʘŒLÒ¤(Õ4‚Á ™1YIâ-l댰Ÿ#Häµã³bó½“éW¬ÖˆAÇî`’K›v ¾1Ñ áÒÂRùÙoò¹µ:cPL@L}ÖH ÐÖ=ÒɱÆO‘àãåó ÖAûÚ-Õò€¬ˆï]£iVb~ÚC,|ƒ7ªR2µ§«o»/í¢ÂaQɹ¡3Y“Ÿ®å -M`ߺžõ ^¥¹ 9VPyÐ5“xBš’X¤*¨¨¢Æ›ö5¦N‘¡(Í;šé+þTÿKïÞ² ž8ÑÚk°õt44Ã\§}iJ'ŒÑ¹ˆÚ'†…zD•¼2ùz¨{J#¤ Éâò>¿‚côbxõ‘¹Ëä*Ûí"J·M¸2qÅVc†,Ãøœò4ÜÖ•Âiü4®drdh£BÛ‘ ¤ÑE8;T|¸Qª§ã¯d5ˆŸé'=:“Ì÷œDYb”Jæ›ñÖ½áëZLˬ“~Â?6O Yº¯¶Èæô"¾æm¶Hö!´I,ÙpÓô¢1l Û—ËUn$hZ_çvä…˜Äm×~dŠ/ÿÉíPz‹@Î~tnWÃ_÷ƒÉùÆÃyGŠBL÷i<+´ ܧO¡—D¶ç)nóy©<íÉ—覌õþ”ÎØíç2l4­OCpMïë»Z,¨Áxå ×ׯòM¢ø­üMÑà“M½Œ3·Ò›{)îÓt³ö0¬«1˪3TûI[+&JZ*`;„É@ûb¤Í%'ÛíÓd#|{! S‘Ô4ùã:ÃLÅë ê3q-gÆR­|€iâÌg±¦Ï-U Jº-E ;…úF¸idÂ#A^ÞJ)ÍŸï’ ‘„òxðjm¸ -hªdt‚¾Bž¼ë-\4>¾Óß0.`4†…SˆëöÛ Rßå_£7Rs,…ñ#ôz ùflWªÙ'†ì¶<Îñ˜š( +YèáÂm%b +dì0qxÏRÅ4ƒÐ O.¿ÈVûjn”ôD;ÜÆÈ Ôå°#P¹òì $ÈQ•̬î‹1ôomÕ̼ç쪨QmWHòÚÛ #ÓG §¥°ÝÄgî¤ÃF—Ê"–ǯÓ˜y6©ÂØÏÀØ–ÁfÉ|RöÓ›«ÈÓñ…‹tWT«V;IfByK|´Ú¡vsXFêg:°u=˜¶›Á/`˜±ïY'¬Â»ƒëà~E§p¤óã¾ybyA|HAìÓHÑ]`å•Kt‘*‰’:É û©X‘Q1 ÄÞ»[f!+þZŽ®;'¨á â‹H¤ÐêÉð5–•Ç@××Î>ÞØ¤êÈ~s‚g\sŸ{¨z>²À‘+úJ#×ãœrlÃcEa>N¤±±JÍfÌAÑo]^*@%øÂ.T{y›Ð%ãøS/°tYª»¾ú_÷ûž]S2Oø¬¿,#vQÛ"‘î g|DÝ>àÕž[2*N¡…p‡ëð¨j+z#“e išQý ÞÜ'š_¢Ã]8™wÇÇšâÙNy[ïÔ†%äJ¡ø¬uùŽ=4Ø2š‡72˜¤Îéìàj8*ôY‘ÀÝ㆑6˜(í³ëO «déJëçÛ'íâ[D{™“a`c3—B3Ò'o+d-Zý÷­¸4ÌP2¨ö¶ÑTH<¦Jà¤Ë×[›ÖQ1ñ»ì#wpè§ëÍU~îh^Ú6øž vŠNœÕ!Z»ûtÛ*?´Åφ mvšZOø‘&EäúV%˜7Î{,0æ­ €¸²Ê£âBÜamWç4ö|Ɖ³ÏZUoß+^}"o)½r˜ŸHA`÷_རŒ~B.Ö¶t{º…öùì>FÒ¸JË­ù­CÒ\ü!¿³ÉZÞo6y5l«ÕŽ«mõ$¥^·Ä2à)vá^¦_<ùs–—§t!sÆÕr½TŠm¥êŽ”UsC:æFë?h "%G¶Œ×A´@饉œÎhĬ’ê7è}ÓkõŒ?¶Òß­Õ0Gé0,óâB1ÊôNƒ«êÖ‘Wºƒq˜I÷Æ‘ç±ÀîX’žØ-f®3zÊ/H|!Ï2¬ÜÙ¬“1qíÛ(×¼²] ¼öQ±î}ÃÁ”„y,É!_ßÍ´Agt´Œö;Í0#$×Ý U DøÔò^iF"Óq!°©Ör³^ Î|` DÃj¤¶hT\ç$ЭЩbÂÇhS²ö.öi©Jûq“N€ñ}! MUrj(ÇFÔÃKjZ œ‚z‘±Ê”- –í3^égæ>N¸.ZÞsÃÔUü‹£~B»ƒÕüÙmÖ'·ç´%$~¬€¾3óœ*zŸíäµeΩþhbè‡6‰\Ó+ôYb‘‹á™föìí ÁØk”³qKÂúׯ€6ö÷^õŸ‹=Ño½gß„w–†îû™zŽZ9ªáÅ-‰öW8>E5 jÂ×ßdŠUâ–Íóð‡ÝŒŽ~õÐd E@ÞXÛ7D;þÀ Äñ´3«2p‚µ²ve\«ÿÙtšù:Qâ¿ÕŸK嶑쯬( èrþ¸uÎ>kïÕ¬^|x½”̈ öä´×x3­|Þ[ÕÑòÈy†XyqÌŒWÞÉÔè—Å—ÃJ43®!Œb.M©ºt[ÖFd®½¯F¤¬Çü®°¦©fÃl7[4É–‚ñ=lC¸È77߸Ï\]>ÌÔl ¥Ó&ŠŽ…îK䑨"ððkÛ`r¹å…NL³¤C™øêk›¶”æè6öuacc–Ý~¸hbP^mO„‡÷Ï™è^Zô™¾\ü$ÿ9òY¿[RîÊÉó Ja]¡¬¬ZäÉé©“XÒGÏý«­ïáu"i^(´–ðb&È9œ‚•µy Š«^l¿± ¬¬` '&E†Ë>W±#lÑë^\"uÉÚ¶ûÉe¥`Ç«Òè6ì~‰éŒ»o}¯N'˜?DB›¾{XVÕ'ŒÝ]Í¡ýPpmŸ)*èâ{Á&˜ Yv^²`˜æ\è¤ñJê5Îû•ˆÜ½gXã­âÈ Í¤ª2s5}/í0ðØ'ì ,s¶©°-||PõŒ3ˆE¢ËÍ"ÚûJà†²äkp\KUôíƒÅFò¢W¦!SœÂ¸Ä·MóçZpÚ¾lT”_Cíκ˜¤å5|6-ÍfèSqž©nÆeÄj½ææn›ü#4Ò-“ŸÚ›Q=ûbZ™'ä,ðQ#§qÉxªx¨[žÄ™ºž£¬PLñè‡íÚ÷7§¯ ˆC+ÓëñÙ}Ë[ ç×ÏŠH&ÍEô—ÆC/î-Ê ´týå®§ÀT œ©rŸ¤p¦g¸çïÅ›ðˆ@wXúÍ3Ô3+VØ-”%¿ö‘“ǜ݄#lØØ.ϯN N $,Ž÷KÒ„ªÁ˜ðÉcο‡ÿtl=3>AŠpÆ"ÃQ›Ÿ7ç?Ÿ†U&ê…ì×d‹žgp`±øQ=*éÅg¥ø;¬£Â8üî›C ˆ¦kc²4Íâ3q©O©ìvÈþkÍÅ#dï5H»]3lOLïÑùô©Î'ß Ç¬ç6B:E‹7¹‡æ©Æãœ§|‹L!¿$¶ i fÁ¡iœç9î†7ÐvøÚQByÛ4Žu—í˜Õ9ÈÙd.G ª¤ „±¥ñhäÔc®vt%ǽ>Ñ%%¢zQO¡ÆÐÓ>"c )TÁÛ¥»hÇé½H›0%ÏÕŒfjã/š|ÓgÐRt]ßÈvÃPŸ/uå˜ÛƒÐß]¸wµÊ9a?£ºØ6dkŠM‹Nªÿ‚–U¬áK_ð«ý1ÐÔт鰂<é]mµè½"4êd-€Ã]u&Ž1=‡PJÓÍÛÚ,Mb~/ÚŸÝE›|"ˆÎ¿!PFpf š›„#ŸÂä×ãZ¸ÎÝY¿û]Œ$ÁÏ=µð=¾üvþõÉ|³Âl}Í{Lñèâmkw`?³’ÊDª r!aN÷¶Òycb/o¬ê8ÂF¤tsVVq}ïÞ¿\ÌVïÐjå~Ùu\½»«¡´äÍsÍ->nÞÚIÒy#@ô"ìqNûM_HbŒjΜVQ»öEWzíVš©&üˆøš‚ yžZå!2¡è,ÆSFdIßj1ôÍ»¥ ®:Èýn2'Ù–™·Í,>4`»@©.Û˜ju ׿%Íÿ³‘‹¸„Wûû*Ì6ƈÞ;ÿ]·Þ)ÍçSh7jWxDlb–bLìè®&£HœœN |;X+\ð²MÝsе›ÅôÙ@²&TG¾¢­UAZNרÂǾÂú»­È©YÆ­h}ŠÂEpTÒ=È{–%w/Þ 2}J¯^ ƒèÇ¢£†˜ÌVó ¨®- Õ˜ÕS²¾ â|ÿ)VÈù|ï,‘'9„/ˤµE×áBqô±Tx >¨»y3Kû ñ•ƈ¬³/ ± ô®Æ|îû¸«+ÝU–îŸÍe¾Ë޾tŠM× ãÏDÕÒKI5t]PfY%‹ù)ã4iBåÑQ5¤µSÖÚ"µì™­wYe¼àTyrCqÕ£þÔN‡ r@£Ó ï}˜oŸ×@°nt…Fã¯}wUz²¹î]>/øµ°Òh‡}ߣ)Ë©ŸxR ò…Gã3ÞÇ‹z‚,¹Ä!‹Ôx¶Š›‹Ðm!ôz3†”]óf5 ¾õ*Í<ö•ã¡þªófx1¬´ô¬¹5¸‚3æJrY‹.@ÆÑî¡upÜ›EïŒzÜCÈ3¸Ýzôkö7弦ë]À`‡vOâ÷ ¸OXqh™¿Ô(rºÍ ü{k~’M¹Ì ˆBlûs¾º@ ¶V(nN~G Ùy@l1@5 ›Ÿ÷‚$^ØcAyP{ÝþžCžŒ.i¿ÿ=Ûc…ô¦:Rbð›å·~¦KBŸãŸã•a‹Å}½A2Í/ãâ]Ó?ØÙH¹Àc:F³õ»¨w"b˜ºŒïqRº‹š¸Šg_³$ȼ—<>È­ åã §n­e&dw][ÜË|ûŽÌ‰Œ:þ©¹[ChˆrîoµŽWÑwØÊ;²k³ôTÅ‚P›Àí†k|ÃÃ@Eº2o¤!§DÇ­%¥û5½â…Å w~~Íô~%cØ9³‹¢Úõ“÷ùa+fûîåÃef Ú¼G£]Ø+þ¢»Y°„´'o89x3à ȶ|\uJýUª5¢ lö“у5.]:¦ç4ó¹?@@òÚ¬{@«RÏíåóAFò$;8œ!‰óˆºn¹ÝöâÏ€ ÅŠþéá½/Ÿ-òó¢¢'ÀÀõš2–iÙÓ•(w_ï䨰î)dm’sÌô¤q+¨´Øºl^tqw©ü¹VwñDáž^ÖÉc@mø,}ÅahS$Ú0–nªk°¿ªâŸ…úàÞOhR±Jc†³L¡eó%äjq·M|ZE fÞ/µ×—Æ}¢èä»ñ&Õ²¢L)L>ü€íW Ö.\‚¯™ôn¥z&–cŠð¸’Í!Yðùk{j¡4l±¢%¦KÒœg7 .­HÌV /ì]³ÛbÞÅë‚þأNJ[!¬3iXŠ/y»€Ö€£‰• ñ«g9ˆfŽ69×Ö…w»¤‘‡’ÔrØ2„Á¼ ±›ûoU4i;äÀ÷³WE%ß…T°˜IKä—:)ž{ [ת¹ˆô‡‡‚rO}˜³.znL+²FÆÏ?¾,1D§ƒ]jmRÒðGÂvëIÚœwÕÅY©G¥Sßµ ã{,Àê¶êæë2"·ÜÅ•ØWØilô¥HÕ„],.Öz¿†ò ßUàpZ rßâ«ANÒÍÙ9ÅÆ-U>óÍ%BXîyrg$AÚõò¥“q¨l7ò½vØ¢q3üÄifs§ˆ#ñ$•?8MU×h ë`|Ê^òõ&O¤'oЉ¸±É˜W»‰‘QŠûþ Ñpfj¹Ècåß ¦ôƒŠ„];Òp‰–5Í|5ŸÛ)‚b~’E– šÏ›ÊU‹VŒÌP<è‘U2ù²“­Ô‡É3 ç¨Aa {Ç ¯UN¨ÞÝþ¥\¬=ûÇð’&LfÃ[•³;Qél¦P>IöޝºË\b|U)ñªù`¨Ûlá$Äÿ|Õ¾iHv±NÃè]–zݪ¾‹ÁÌ®§¹‡°×VÄö"Ä¡‚d†mÛër‰Uõ°ø÷™ëŸ#ö—¶B'Œ‹â€ïЗ¼Qãt_údfÖ2=›–Ô´Ê•]'Ç-¤ŒÏôÊÁª&°Œ]"„uyŽéÆ¿¦÷g¬VZ,€!t“Na¾°W,~y˜0$y%±ÎDèAQ…”³áŽKSa•¯¦W9 âÿt•é œXÝÈ5ƒl¡]eîŒA͵ÑoZæA">`¢ê6¡.yŠcá û ÿåk~6mG?ä£ õA§ž“.+w×µcô5µ"fÜÛôÕäÈ!¥¼QÉ‚Ÿo~Mʰ³Ùžºa’ȵFÚ*Âvålasô3|þ­{±š@Nþ/®K…OôyjË;£Io-3뱩P&]ݦaýê—ªePç0‰”ï2°ê¦6; P Î`ËÊõ®³VaOžËË “èWœH{?R{¢‹qGPèÈ×÷†%æ4´‰Udø#®ˆð:B|«»>[bQ/y‘z¼Î^FíϯBQ$qŸ=ãðr¿Çó2%µ‚Ãgz¦ pu%™¸ÕBýˆßÈ4ö/Í(Û ‹bRÕìû¢ Àœx†ØëaŠyä1,ª-¡ëïo8R»M©“…‹Tå뇸2Ý"/l†¥”Ý(¿}üåáíS:‹7úõa’L˜%‰öR”Ø·œ§ýçÙ€@î'îhm²¸i¾èÅÁ3Ð4ÏÎ̵/Žüù’>ÑCÞ“Ý×zY òQy·ô;!O3Á =D™ø0©?ÓÒYAE“ò»A‚>¯2^iÈuŒêFÆÃÇݵáN½Z8ˆB«ˆ_»kK‡ÅÇ [ß¼‚°Ð\»Yèp:“‡Ð9RFŸ‚–}¿gp¸“†³yÉ n¶ºx«°fKò!qK_®Ÿ!˜çôh±Ån…Ø3 2P²R•”päø¥÷d002GÖÁ¿ø©Á m¯ùË9üÀmû‡!¼ÔÖ(ê a )XíOk[¤BÏ[ËúÔ5XCC€ƒZ%1؉‡CÉ€ÒC‡F"^ÙqδäçèäŠÌâÐ\Î;â§èBu£=ÝÂXÙiÉÛy+R—Ê¹Šºu›\2×λvó°b|«;qˆ]x°L¼Y ­'dÇ+Q\Koj*ÊR~¬ƒ:ÈFÔð=i™§.¦za±:¢Ø´+™âB.þbjŒ˜]ëÁ¿d›œ¹ÞŠõáÎÈ"I–—?×ydîŸrÁ^ø“h¥ÿÒ¬ÀWqàY‘£+ZØÚæûƶd7ñјG»Á…þWí%½ 3yÔ ½Êuó)ÊpÆDMÆÄW@|gBùö,Q=íé&ñQüŠ|špR¢•åL49˜üni.h!Ь;ÿ÷lD¿_e¡ã6Åœ©ç1ð4K¾ešN ~“È•”ÛÍž'Ž8qK]6ð"\Ts^Úž$ƒo®,ª…Ñ¢Ðç5צ´{‚Œ ]°ý\"øDqÑù¨–¼­õwZϩ؋© ú7¦Cëõ(qÕ/•MÒÆÃyíÃyâæEš' ¿Ì£ã—¯Ëƒp”N ýÚN?…ꨉŒZºî±1ôÛ&غÃÛ¦Äýt¬¬³«‰ññ’>T{înñM‡T0ò—µ6¸µ$‘ÆÂW—î~|]S3†[~wƒøôVI—§Êì1ÝÞkp/Oê-o;œ+Û¤¼®·dà3%âÖÉߥ>Þ"Ù<ôdt,ßæo, ãÂG ôæÚÕæåzEÚÉ©»T-îÇ­ ¶´ÍÝ,o¶^D’ò@†ýrY ;÷LÅMŒ³ÍäBûÀŠl á¤+×ÛíÙì‡OEá-Ä6O±H!"ô^†Œ3^J¤þ+¸L•È]–Ž/ePN’™Ä7neJ5T…¢æá•3þžj8aÏÖìì¨Åx,W+b?Uµå‡þÂ’¡¨U~$ÒwQúÖŽ5˜šl0¶|âÕp81×^B¡éÃÈö7èo~è¦9ñM&“r/`éi 0ÙÃÆI®Çîo2º™SáÌ­Á¿tÀÐí•pyÑ~žüÉ#|úíM ™ÁyÆPÞþ°³¿Ïê5qÞ–J1Ó¸ÚÍ#T¹ËNÕ¹¹»¢Ã͸êôœh]*™LÞSÇþ¯êkkOXS<¨‘DùN½HóŒF(a¬¨ÄS›Ï%€>·®(†ÁP!Dß|O!Ž/ŒIëÃÆê§DvŠùN«n8ueŽHý¬›ò€Ãæ$Ƭ“¹s³]&f5u}ê’®áò/‰,‘t”$iÝ‘ÉõìCë—{4+w½³Z‡~•ÅcZJ®A Ö4ëä O;qË™¤×›Õž)ûZ¬@‚äâ0g—5 îIŸ?z Ĥôá"uϨçö`!Kì:³Þâ]h&ój"ìÁÊ-h3š©ØAsÅΚwTg0‡¹þšq!<èÓõRÑL_…‚v|´ 5ž÷GÐòÔ¸¯ ¾.É‚’l vñ†™?X©K-ÊŠñü扚OÒ÷9t6Ïþ°8 «ûÕY/Çw+T˹«:ãy™õÊ^#ÏA°$¥µpÒDO÷’ÙÍ~9û«tZ§ÕĹMߥf,ö©\Ü›ip /ñÕ™?Vj‡Û¦iþ#ŠÆÄ Ò‡¸åŠæVÀ®nÁ—ÜhöÏy[¨C6•sâawxˆY½ÈÒ3åç{Ö<„·–9Bý_s°Ý0]?azÖâà—ò©0ZªŠ{¶¶"lt"¾G"Áaw‘,>Ç/NÜóºõ+Ù1 NITí¿ ºÍ&]÷Ã(VbÖáUðëò ö0 r&ñ/º¥+\;ž0uB­Û™¼veCɶ—®˜"®šF@õ­R›{S÷µ Ðáqj* ‰ŸûW¼2Ú¿Qr5jÁï+ódÙî×_#ßY1²óláq"ÿØLx«¾³þIã)`‹È^r Ž ¹·VN>y’÷yjŸ¶Þ¦ÔSª­e †*ôëÙŒ¿Q¿Þ¹µ]Ã5+¯cÌ…ù«¯´‚þ„Y€Új)…(‹ü([e§_Q/’{YÛ.éGºÔoñ€ÆÊYBøÐDNèw¸øö¼Ù¡=—ñâË´ÏTȬ“1!FÉGTæ0‘sœ {뇩¼æëÐ^™¨‚Žnê4;–ÉæSsÐjLÉðŽ–îÌ]Š;—òŽ&Ëaˈ‡¸(£tÅÄRÇi‘où±ÁÛáÖ=rù¹«Ô‡7³ÕÉ\t ÔBºì…Cu¦“D|{E¨ˆT]h×òÒºå*u‰qp—O°¶€X"Þ`êSCÿ;øK\:ƒg¸ÙÊ¢<®ØÕô…´­m0³7pôcp÷Ú¿°Œÿv f¡c°2CM¢ä¬M¸Ã`dÜÔŸ_é3 çNPå`úœ}) r‘ÛG´ ïL!ÀÚZn"<¿+âÀ1fÝÈ®cÿ¥v§»,Åž®GG !*¹˜ãn@ÿâ¶Ü8¼ËYš_ 3IˆW¤6=Z]‰èºûùöþM.ÑmA?luÞmÚu„ìÅÿ‰÷˵±^gaSeÍ=–Ïᦹ»96¹·2 ^#Ç./çÛ£—pÂ×ï4Ì*ï[2®0XÜ >㜬‹í©"CspÍ¥¾9/-`ðö¯ïrXh{²’H0m ²‚¾$™ ¸pκ?SõSåSú Ð^ï ¾].t{³,΄™Â¬(7Øg|¡Nˆlü8œjJhAL-MAÆô¥~„&zÍ8$ªÁ—’²¼hK3AàÖ‹« D¦¨`^Œ )n*Ÿ5Öwj³½Ûîù(oF aäh̘òn‘E4¨ü]äà{)Q¸ç”²óKA±cà½]}‹u̘$^R’LK3˜4‘'Io»âÀ­¬²&cY.H[d]J`JòÒ¾ù0—4º˜z>aÈÕòÛ@_Á¾Ø<ì&Þר¬mÇÔËkëæ0ŸÖgÖ#¡ËîÁ_aý”¯¾”ƒÐF Â1ôé·uL:l®>1HN=¤v:4Ðâì¢$’ üú\"îPuÈUNøËØC?Z²º•ŽQxt"Þï4œçµ ÷™˜I\5°¨>èãB W¶œ:ýBIïyKÖúÒ žìïþ1æ:Çø¢¡¿N¬4ò•uaNͬ”^AÞˆ¯$îùU.âål”øºâõ))½A’*àÃØúú=Z¸·ÎüÆxLp¾¨F‹·«›Õö~ýÞÜTe¥O‰<"íù£s.–†:Ì]¦Nf*"ù™‚ö¥šÏÛä[ˆ¼>Ì‹×~ÏTÇ`Ål{¿»­AâJ Á†0ëŽ?@gך(H÷2LËyT×0»JN5[ÊK C_×iµ³Uh¬—760ÿ„‡UàþsÒâ­À¾hjµé'Ú\­úíˆT —®wð¡ÏÕ…\»]• ª$Ø FÔBFf­÷l¼tè Ñ+¼‹ÂÑU¤µw±MôuÁ‚}7—ç&e^ê¤B ˜Â"cëD°ø¸Kê„>‚ú-6éØv<;Ç“½óVƒ+éµCùMxm詨¦Y9ÝÏö°X-Òj¯úDjø"NÇI¨¯äqtŒõ:ÞÌÐý… ºÐ;oß0:ªê ä}"“)&höç ±ÖTPÐ/87Ÿ~ü2ãCŪqqb ¡Êë'ÛX3¸?ÇÕ.0¹R¬Fwþõ5<=[@½•n“[¼ï£¯¨#ËtãnËÏo4šEû_㼃å~ÙSW-Æg%áéF[0¾%~º%ÓwÒ;+×Ö딚\%ÅÚÁwËNl—±³ 8â*:jë9 ³¾î—=4Å`Ž‚S23Î,x·WJ$“+vXW y«Žù…Ð1#JàÍ]鮩߷IÊZ׬ãÙìˆG ½ÐǤ_åNIr;ù-„ÄépÐæògW|qO´Ñ¹¬!|›W¢‡yG¸‘@±†@ZἓCB”sæŒÄG‘öÜdê²´œñ—Âf£"…zË'`÷`%B’çp†Y­ñ#,šù8Î ›³¥CXŒÝr§› Í~¸©_¢º!B ÷5À!Ö—oIiÇŽ–±Ü®Ü_“¼J;7,'”ódןŸóÈŸdw‘ìé"RÁ!›k‰0­Í™† ox7‘ÆÏótR[è¼Õ’¹D¾³ÝHJûe ˃Nî4cqqJQ¼—0íÚòL˜¥ºÛ4ôŒÔGð‡{¶ ›¡Šu Ȭ3MžPfÝ=û{iZ¬Ô§ý†y×5œ5vrHÝYt=ƒºªò7c£|C+z;ܺÓ@vß}fˆ쫹:"ÖzÙ¥èZVÈ=·‹·ÕT#õžOzÇáv´^&â\Úmúã÷f¹‡ÄXOzÛ[ŠNv¡@‰ïwâ‘Lò¤hÑS‡jC^t¤kf<ݪ¿Boû#nãÔ͉ÈÑsiÍ7bÙ»ÿŽ!½ÜTHA\óA<×RV¢5âÒâcÊmÇ–ÊMê-c\x& û#7EªÔµD»v½ï¡…‘x…‡Õíšü ·¸óv™P'ƒàÍ‚By|x­v,Û=ÔÞžÓ²”%ãtu–*XW¥8‡‹_pý¿Òȸœ5ƒCäƒmâ{ýdƒÜ7vÙîT×Q°ädkŸ1s>¢ôå6@×n“KEpžT5sÙpcnL?Ï•Ÿ¬ Nwe®ºVðW´½òøªí«FphÕ}q̦-nËʤý¹5úE ½ì~Dç~?gV™ør´šôŒùU´Ü⣢*ÝéÙ°³:€Æ_î}j:8ü²­­Ï{M’¥»ÒíöÍzæ=p¯¹k,ô™=b*8¶ø\^!dQS˜¦c#YÜ-+}[(±ûûëס=î jÅ’é×A%ä%ÖÑ¢ÇNûQÓªay.gŽ#]dTÞ¦æÞÌ -¨Qs¯’ µµçyê–T*±®nð"T–ÜTL֗ɀ㠀ƒD‹!ܲ^S&kµcà•é¸ùÔ 1F%£©¦º[›Z˼gÍ>Ò÷0®Ç"*¾² ã*¦ÖcÙ|¶>¥Ne–ïÁ:?Í•Ó}ò`°>2âÞÕa‡â f…5”AXjEŽÙhHgS-®™ßrUÆ ÔsœÇ¨qc.·‹PGJ—º$_¦YèzZô*à1D`j8A먩­%Ç_ù$`(?¶×ü‹rp¡¨Xã®â“þ|6‘kœz9ÛÄKÃ#Ϲ¾Œ«'“š«§ã*€žRg=fG±æê«©rM•á©iËHWõqÊɃ€‹-K^²ëM6lÖhßé—ø:‹ÃÆ–éht R·]'ùÁXY¢~tÁÁþõÖ™¶²dÐSÈ0¯û\÷ª¤*,:ô ¿‚¶‚'J?¾ÉœÞ$©²¡…š „ ]ñ+'K‚ÒìêñyV1¡FtÔc´†~qUÎ pnkHM;JŠÿ˜ÝãÂ’£®¢¨^n6·¿ìnœ®òîpU¨D)…?ýš~™¬A:†°¸Ó”Šäi¨{…KüÊE°ôÿÚ™ï~6ÀF¬”Ò"¸*£çŒ´”¤bϨբRó5îZ«öÙB(¡CÍoNÃQ[EpgÔˆR$\Œ %¨-1’Òû÷ßû{Ÿð¨¿,q¸ö²Ÿ˜T«~§«Û™MyOËtè§à/z’Çf ¼óe¬•ö…𲿼d>ÝÈ&Á×+?vc2^aíäG*_)s n!¸’Ä2 çéE}:ŒN8éëÍ1þ;íÚ•½PïÁß-ŽºJ×LÛgM¤¥y(¦R¼ù)-óÝŸY3$r棉kŸÑ¿ÜÚâóµ#ôÆÀA ƒŠaV0UêXùÙäy$ðªÊ⺷ùe ‹:ÂáM7”1,Õ(Wjœ £MC]¹ÏB`››×tÆiÍi öù›V ê,Žô»ÙÞ)â—Ї$d¶Œú¥òhéâ.ø×ñ @Õ,/-nªG‚HT¿|-Ôß‹‹2ïÅYÒ[†,q›@?ºK¾Ñ+k"ÕÎmã×|Æk8ÁÇKÏx¹Å-ä^Y>ëþs[“YZ¥~´:†˜õJÂdbÿ‚¬×’V€CÛ&N;º½9ÌižŸŒo~S_9Š-Óÿ¡ã†\[hÁ{c²nëmq65¯‡zÞ!ßrÛÊÆ‘µ¸üü<[·˜–¦@ßW&|Û³$]°h„UJ&¥æ¡tR½Ú:,4P.üUƒQõ˜"úÝaDñ*¯âÑ ÖlË*ö„gH¹(šD d<`ÇØY{¡&'+‰‹¦µ ¾.rK&^ªÅú=}FNʥƠï¿y?#Xì!ãoüpc–¨ZÖ6åõý­®¿U><F¡óä›)Ÿ†·@æi'õ½…Ó6S& )rÉ[ú¾k\Š9æ$mõI>~¨£ˆò!ðdÏ즰Ÿ$%í&M%Ì›[BbÝÇ@zjNô÷½{2ÓšeF+ïP;ˆ3úœ©lë€GËMS9ÄOÔ„ºì·ÎkP—î[~TF¢9v„¬Xiwu¨z+_îïò‚È(˜îDf^ØŒ¡iv¦x€?Õzey7Ê%D!lš‹µ§BY/ËwºJ°â³|8ì´£|ÌAδ2"6r–ìgœ3_úì܎K]yÆàÐU@Üó™Oñ{zg€ÿíEñg—ÔxþœgæÞI¿èþÖ=ÛYßPoj¡,­êéZUµ;'oÓRY)Ê™нã]Í5ù…w‰ê…®'Ú[oz“È¡:͘B·´ÅGcݾÌúDkûÛÂ’$ö¯†™¬¡¾Ø¸3¡¾}úC®ó<#;¹A¶CÝ8Qæ•Æ/Ú½K‹®+}+žþý&Ô¿ç{ŵB „ÜÖM „Ýôßø;NBç“’ .†Pž3v¶Zɵ˜O.S‡T. _ëÆ÷ŽÂ—g-‚ñ\q ~ÍŠ7Y àê^zŸ–Íþl^Af„±;7f»ùx`¬îEHAŠhP¡_68È÷8-Ú[A|t—„¹I$ß&Hk5uÆ\ƒsXUB"NœÑÑš Û®ldK¢æûÀ?`Þlï¶D-Ù¨ ‡x`v $'~Æ)FÊÆŸö—7°–{°¿âf*™]³mø"¶AD,á#àÒ¬Åøè¢çx«‰AÑãB‹b›GsÖ q@ÕžTií¦{[Ñ%¬Ü^0zK‡é¯ó «êqËמ»*-ü|¤r@£ÌôUõrµd<¥‚#×êù¶>†‰J‡QÔÎGCµ‡n•¨y!òGµøR½&ƒéàö ·— Ìë‰u"Õ6g¯G×Jè«W"c£JèôfË×ïɵÉÕÃÎt2Û¬£cxÀ¤TŠkôm²ÁB†üš](…lßó XøT{§–Û$ðÀ!ÚÔ©³¦?æ{2¥LžŠYUÌÚ;ÖÕŒ'~Æ"ƒ¤ã®ÿKÀÿÿA@è/~Q1áü¢B€ÿуϯ endstream endobj 9 0 obj << /Type /Font /Subtype /Type1 /Encoding 2464 0 R /FirstChar 11 /LastChar 127 /Widths 2465 0 R /BaseFont /DISHCB+CMR10 /FontDescriptor 7 0 R >> endobj 7 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /DISHCB+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/ffi/grave/acute/cedilla/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/tilde/dieresis) /FontFile 8 0 R >> endobj 2465 0 obj [583 556 556 833 0 0 0 500 500 0 0 0 0 444 0 0 0 0 0 0 0 0 278 500 833 500 833 778 278 389 389 500 0 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 0 778 0 472 0 750 708 722 764 681 653 785 750 361 514 778 625 917 750 778 681 778 736 556 722 750 750 1028 750 750 611 278 500 278 500 0 278 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 500 1000 0 500 500 ] endobj 2464 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl/ffi 15/.notdef 18/grave/acute 20/.notdef 24/cedilla 25/.notdef 33/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk 43/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal 62/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex 95/.notdef 96/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash 125/.notdef 126/tilde/dieresis 128/.notdef] >> endobj 5 0 obj << /Length1 1923 /Length2 12101 /Length3 532 /Length 13167 /Filter /FlateDecode >> stream xÚí·UXœÝ–®܃(Ü‚»»w×B w—àîN€‡àî‚wB ¸\w}«»éîÃÿ?Ú×®:©{Lyž1¦¼oQ“«¨3‰Y€Í€Ò`W&6f6~€„¢¸;€™™šZÂhêjv4uòØøøØbnVvV7?'?'25@ìèålceí  “ ÿ§@ÌèlcnêP4uµÚCæ07ÔÁæ6@W/f€Pûg„ @ ètvZ0#³±,lÌ]f@+d–É9X‚<ÿ¶psü¯&w ³ Ä€b’±hvy,€–È,J`ˆâäÿSÿsri7HÉÔþŸéÿU¥ÿÕnjoòúÏ`{G7W 3@ltvøŸ]µÿaN ú_2r®¦ s1+Àú!iO …Š«¹5ÀÒäüWè`ñ?-@Êö/,ò’ZJZ:Œÿ¹žÿjT1µqpÕðrü÷´ÿôþ³½2¤:Î6ž}VfVV6HGÈ÷¿~þ1)s°…dCpqLM½!;B\6€ƒÐô„8fav»B† %ñX‚‘ÿYNÈŠ³Xþ+öÈA›Wä°˜šCJøï;'€Åha™þ;ÆÁ`H€Lí_CNn`HíÿUâÿ sþ3loÿ:–“ Àbíåh tx qX!Á¯!‹ ÈÔÅú5 `ñ:ƒ_E°Ã«Q.V‹«Çk;$QWkgà_=þÉìæüàø'y÷¿z@ìº@Öáß 1ëtÿË+¤æ,Àÿ–"ĪƒÍßFxÿÉ~Ä ±trƒlüG8þ)ÐåŸsþ„¨‰½DIü• *¯‘|%H%¤þM<:H¿DZæ• }%ˆ ¹W‚¨+¼DýÃ+AÔ_ ¢®ôJuå/D]å• êª¯QW{%ˆºú+A*¯ñJ/š¯ñ¢õJ/Ú¯ñ¢óo⃨ë½ûîI 3hùºd|ÜÿÙðߣ‰_÷)db³W‚$iþzJX!:á?ëûþ³ÏþBH¢V!$Së¿’ê_çbÍö/„x²û !¦@!ÄÕëdcƒ¸rø !®À!Ä•ã_øÏü !®œÿÂ6þ_qåúB\¹ý…Wî!Ä•Ç_ Ä•ç_qåõB\yÿ…ÿÙ€,þ£šÿû–{ú0AÎ-;ä|C’àƒì[V¿ÿÖÑÜÍÙèàú¯ä®þ/¶´Üì@ 'Ðyil.j›Þô±Ì_ªèG9<´¸Us‚R}ÏL'JÈb"4èˈ‚ÃzÎ}Eúü™Ç#±KT‡¯ê¸ôiSBÆÜóŽ»ÉN–w+±ÎE–¢×¶#ÅMÈ!F{Óìå´òôúhYŠnñ@îÙàá':I]ÄUr¨^}÷†ÞìPné,fxX ¹f†SYgøšfJÜÚdˆ¿mø›Æ•sp‡ö}Ñ›‚ägcX‹q-“…“4/´-½û„±ìÚ@ÃÒ¨-·ÅLݸªG3ýU²6}ÐELö,íŸ÷®™Õ]ŽËÕ³yÅzwÊo9Ëe"åyÐl¢Ú:‹É5¡jjh&›× ;¬Mô”®IÇŠæßY+ȼ4Fx o4̠ǵu2P)ÙhÑkè²é©^ä9–âç䞪2I]jÑ÷l¥?×DXö`R¨PÍmd’[o\<M]@æ².Np’ÔÂ<Ü2A’вë©/—JÆT‚<«cäen‘ü?\øp]7ý©”‹“â&¾Û «Ñ¤½ÚóBc µR¦¡ òhRéhGEî2±Y ,ˆÖWÔÒNŠ£²Ùßi‡ |8[¡.ár-^gVf2TŠC‘@И à$"^¦ñèMqWªÒ»Ì;#ñ ƒ‘ÿs *Öm%{¡°Ô9³ƒ-Ïr!“¸Uk AâSvò÷4¢ßNù¬(Ï:–góËFFøDT3͈§EÔ³2<ûÙßk1cƒ .*«îAÒæ{¬a†V‚ûQÍñÆÁù…4Úg>Â~J¾[è3͇h¬\¸±¥K÷œ²œ¸O¥[«y ™<á“,¬€á7ÆÅæDS9ûܺql退’vÍɹSçê^¦¬47ªwÞNlv̸±›Ÿ\¹i1óŠ¥GÙÑÛ7wƒƒÆÏ"Ñ™›œp¸ÂH)9|ÝvéI“çºzÌQW”R9Žîð·Gý“Cñ2Ð]BEMs7ð¿ËðÛ3nã2†µÆ3²˜®j Ú‘¡w U-”Z».¦Þ¯Œ“fýúÂ>ïuD[Y6ȧô哲Éä$B(ÚÊšgÿ°ø7cé IÙÙ^ [‹¸,\Ö?¹ÊÇ ­ßÏW×ù_9¹Þ¥îµ‚TÏÏ ù‚îTãàJn‘‡»DwFØãÓ~Ü-U 2¨_yâXÀÙ ðÚpíq ¢cAxR‘šØÇðú"dµ! dàæ½k¼•R¥ áÐåÎnü.b«?è§BÄ|lêm†vB)MRòP«2ÆæÑ‰©Ë¸GžéÙ›©Ò•eëU%7°úý0%áú Ž½>_ óòõcQ•,bEØmCíä÷¨‰Rçtþ“`„¢IxŒÎÁÒÊÖíqr6ë)fèŸ$ ¢+wžVÍÚo¯ºv]|•ëǛЌQ—¢ÓjJR—‰4H%óá’°HaI‰ˆç¶ûÑw°¥r7ñuò‰€Îì4:™|±õü-ï Ì÷«Ÿ.|\Yºß ¹ -ûm1ÝÌ~¯+2‡Aùd€wý‰?tô2:LYò ›N®W¬\•s¥®<96#‘ÿ½i»Y‡ )jÚÍVh£i'¨`H¼†îJú½-ÕRÞaPqD(âæÅs^y¹)þ!რ`èÏw$¦pnÎðÅõ–¯Ç+9T[š²Ïœ-Á3,‡zŸ“ØÄÖÏljr ëVBu˜E°wRn‰ß6ÀùgÌD_sÌ»UËç`™•fÐΰâ¶ðúì/“§·îFùÖ¡‡ÑÞgaÄ„sc*yb¤Å ëÄÜ{m4v‡Ãî =@L®î¬1ù—âGföTZ£øÌTù¹SJfqÁZ¡VA÷vBgêâ¬ïÂÊYVE2UD‘"‘~,¬VºÜý]~:Z‚Z—hµÂSÄHºÕCHŠbìS+uÇÕªÁüËR½žAGꜙ©f“‘ y~ê« Š©®HT+“Òì|cOòÞdá·¾?HWgºÍªFm5&ƒÛ«»*$ð3È5j‰u—'ãŸDªèðñ/FJ¤Òugbñ£2"ô`c+µßíž¶é€Kw>iŸà±{é­ŸIuwLÍîÙàÈ| h’êÕ¸—üÚ]½¤CÞÇÇê+O—mS®ä]ÀuoØ åý \ÍØ,HÐò­z¦Émvcó©5^À*ñ·³Wä™XÎ5%>î'çN Vò6ï™(/‡+ÛWc\ùèØyÒgÅq!8ñF«fOʽ~‹{X“m–™:ÜßÚ}³B„Wñ¼ñˆºÈÂy~hΩ\¨h1ïŒ|ÊsPCsâbžêj`eêB?Ñ:ßš ‚ˆ;tb“Õ€4Þ¼€/Ä "® ¼?cÄÙöì–vŠû4”Oº°Kéyµi€±µ½YÅý'cäŽ3þð)b\eÅ0¹Y¸YËüaC˜QÀÌ8lØ"•aÊý&ܸ¨ûøDas›hj2óÂ<†ÉôtAŽp‘ MÁÒº‰zuôͰoÓ]ðdc;>¤¸Ftç霌n,’v9ãÃzíN»p“„¡sÐÓU§ïM€Ýéá|‚è dñÞ±ÍÍϳM.N³Ñ3åxvw¯ªlý¥ o{)ð†EÞõ›yAkù·Q WsEnKu°õ›M·O1ÒÄŒ ›f‹Qw*á µµú©‘‚hsº:ãz ßjk¤÷p§S­‚(üSïç@cºñZ´˜ÜŽjòŠÞû%Ò힬·¸ä‚J”qݾ„ÁŒÃ,ÍhøJÁEœ¦-!ÂæN|yeí½ëæT®œù¦†D¹4µ4ô·,›EhFnŸ$ Š’Òdz÷lM¡´ù³Á©eÛÎh@ ˜›•SE´æ7±ùD/ÿîoñê:¦àѸYD#§HîÆÓòÉà=N¬ ~$бw¹t8lúFèÖý›µNƒ½Þa1t40^}CÔÒ¼½ñ‹È0…iͨH´Dó[ k¶‘G|ÁÍ zL‘ ÕK7Êç(Ú€ô…€Ñ£§% uxPDMÌZÞ)ÍmfZj…WòñòÄìr¶›o‰†âþ†v—>ƒ˜EϾÎÌdÚìÅÜ€R’Gê8nï9ówböÌ¸Ø Ó+Zz1Ð4n69 ²–”ˆæÿ¨qrÇ™H¹ø¬8¼Q{Fe¨?.$ÃAì·Yl=&¯7¯a¾âcÖä-Ç'™x³3A?sK¯ÅÓ*–·†ŽV\{¡Ya Ê& ×NôèÏ~;G³›Ûæ£OWœà…ë&Ãú A¡4óDKnÁNÐf)Z¼äãeñd6=€ØírKñý\[nÇobûWqY‰#š=¦{/ªqø¢cÀ“.Ëb ™­Æ1L™¾5’!„}ÌÖgÒLÉØH·Ê¸q-Ö¨7¶Èy†™ïK³‰]ôBöö8ñnYoj½Õ]1í>þ­œ±=Y9Ü‚[ŠçJéöA¸Éún,‡a™ü;p9uÛþÇÖÈv¨D—8d_Ó1‹Ä2)zýÍ„§LݧHAÛÀË*)!Ç8ï^‰Ìý`ÍgE¿ÍäñøÆmãÆÌ@¬~øY:£ao³tJÛî $ò›îˆÚÎx®{¤åˆvOv Ù‘Äè‹·,V–[ÄBOÁ3 m$ÃrLtÀÝÎaÒ¾/J¬iT=Í_¯¾Öà·v,îÜ×”#KUùjÇž»¿—NԱ˼¢BS^GF®»ŠSïçÃ;‡7p«iÆå øF€>Ÿ· ‹wo¨ÐèVH‰¾¿Yíùì·Ìò“êy¨ÆUÑKN¿JÞ³'ž×ZÜ•Ä6ó4Fhh»¨îcÇO};¼ ³]8Ü«ØDs¥X¿¦1ã‡iY¬Ô?’8Å –Õ‹*{•lAY!ØêN„pš„*7ùª¨ÛL/éÞÆ´ÙòÅšÌÁÔ†€Ç¸¯StjØïvj§¾ÐqŽuš:GÌH„¸9’ÿœÉI¤§„R–kNGÐnkä[KÊRê'¶…^‹kÄI.~˜Ýp\ô÷Å•·ÓÊì6F‹\C-ÍŒ:íŠSŽé€òn±uz "—Óx¸2Ôéãæ=Hœ’åEæ˜`ž}»šì­(Š^ê¦N–¼Büª;÷åY¿–[•*¨gëí-¬ŒüÀ¨@²9?Âà’–%¯3õšEÛ£ˆ¶`85è]qŸ¾âæO#a\æ%ë¬K2þ`•eæEÄ;úäm‹Ž#ph,žíûN't­9ଦi¡}mA ŹZ‘Ì¥üçÙuŽñ7k°p'µøy3Najcão|pºš›ÝÛ`Xßp K÷õ1| Î5}û8f²#?ø5Ð JVëzúôJÅ[K—kšGH¬.v©Üê¥B›ð’ÅïQ#ÓÍôü+" êŠ(3û˜ˆOÇI( ÏÖ§íú¬¸;üã&‰•{bïy ¼W¢¼ELÔó r\5áÛ‡Ó̳µbßWÔ'˜g*hWb Ù^ÆžG;ç:7ÃМ•Ú¤ù"t;åµÈËé/8Ø»r½/G/Ëׯs‘Z%ÿ^ßX‡p:ô‚<ˆZ¶ºÔŠ^ްf¹ôEø®5Œ€üüûQT¬ÇÛ“B,‹[k[ ‘Øü)‰s£œgߥ_ë6qÙÓöAaÇ3.´$úñYZ¶_«ŒÐ.ºÎó¶3ªèë 5ðößÂ6Âæ7@•Ge ïZÈÓL>‰•¥;„k[Ü,ä앾¡^ê§ÔÉö³.m^^ÅÆæÐH´›£þØ€Äîi6düaø‡-ù9§-ñvLï1‚#†'F3°²N¸ ©ôIA¡ï”™:pê3º¼³`ŠÜnø¢|}Pý\Öó ó0Õ¢µñרÔZˆÅÇq‘ïÖ• ïYGCæ“xöÇ7¸nZ}Ù³ç *à˜‘„ܨ˜‘]°†®Á7 XÅ´¶¹ç5VúΧX…!Èî!ÿv ÓókjM½«Ô ¹({& º;,J%I'¿’¹6Š]JŸdbx:éåðn¢øÆ¢Ršä[=aùcϽVô'*U§êÃG¤MN»UQ=ø½¶ĘŸø/{!ºž4rë¤'ÞÁJRâlXü¡C²²¦Hâ½A’¥l/¿EP0Ñ"€ä™ß´‘Ÿ…[õc†¹o»W£ ¦ÈMƒw›AKŒqq“3mèúUq)8ï…;[ø¨­ }ö¼2¿C=L‚Ûñ§ñ~³+öÝEÚY`aÞ¼8ŒÒQ{äv(ëx›Oõöâ; Ô+@†ðyt0ì‚òøÜˆnÒAjŸ®]aZßêÛÚ?•‡ÞkçýŒdìùºJ¥Al£BŒ³)j;|Ô£¬ ðÕ(Mv7•²#Bž Õ:Œf©Ö£g·>`i n‚ÕVÉÛ=:þã\ã²_ñ¬ûtø­]FaH€6ãâ]ÿ;ݰ³;Ùùƒ+,iþ퀘>²\+Š!7fšRðÚðo¦*‰K8Y%¸…N°Ñ{¦>é‚8CDãëÏ g¥t¸“\Ä+áû»å‚ƒzĤ T-I: s+Šk»ÃÎ(öúXRJ"°2%õ’Yöo©ë) ·W$M®múõa–±-·sÌwÈÍKìÇ8Ät%'oJ‘©ù5¶“+OÙdMW'¥6Ž>?¥Ù§#•F·ƒc>ê":rÝáÅè2þqÉË<á)É5ú+)XÅ…¬ÚI=Ò#Õ[·¼Tø™l¡§QE‘ ±Ê> îèQNf:z 7ËË>¡‹Î}— #*äÿmáy-W‘l”^áîi;Poybj«›ë! i@ Éòþ”ƒãþ=Çt8f«ë§\Ç£¯‡ë²>“KNæ…}2ÑÏÒ…vOwCf÷oܲcàg½•”26Z;L¤&W4™Ú‘xCR^a\@‚!?äõ ™Dâ˜#¹KŸ ì–[°Å#ÜíFžJÃæˆÈ³Ÿq5â^Ù¼öHe*Úo’Ë51>ƒ!ÆŸžv$šÞ”d¬ Ó;ãyìvÕÃűûóŠ ?ßÏ@Y5…¬œáϔ߮3Æ@š\ÀßO÷0ØÁos1á¶•fa—|è/½¹‘î0ß}%°Sf F]¹K/FQ‰Ÿ3æ$Ï™#;LÕ/0…£gëâèÝ¿ªùÄ(o¨·[½Ž­¶ ô¿Ìà7 Œ$È©ã›î¨¸káN#IÀ¼ØîÀž¸¦|Ùzlj\þ2°f“<ö8YÕ&!ý1‘hº¾v¯Ùæ Ô´DÝŠ[´ s¥Y¬BÇOn¡A…‰c-¼³¨êéêœÏ¥ÃKæ;âÚÐÜûl÷­Ú®Dw[®ð å\Ó¡ ovôòvéÌÜDv)¹âHX¦k®ásæ[eS#x»@ÎË€ÆH6™ôÇx1xÚUäÉ!RøÕ_ QØÎÔQ½qºL–plºkÓ lŽfÕŒ3@ÁŽóJêå:CŽ+×uŠéþ†D*#áXxÕÓέY¼ÀàJ gRòÓä -Ò€ÛÆýʳ*©Ž ñs‡#+WƒlwO}7ÊÌ`Ĭ—p7ü_½ Q+‚ŸÑ"|_"d~ Ö ­øV6F|øùCÆNr=O‰ø Pï"6âpš}ž^>­Ÿiøø¦po)¡# ›Tùëü.o.ùU'…£-‡_÷ðÈË?ûtÓÌBå=éÿÜ áÑ +ïc'™Ÿ¾|«›]›R½ÎÓ;ü07ýùÇ}TMKѶ]1`ûÃw}µ45žÑàwPV̤o_б·¿ú2D¹Lê 1ó.ð\ x^Ü?ÙŠ»‹T¥bŽÍ 'XXÔÓÌd`S>¤ËWõƒpÂOèg$qÍòo™¾Æ†wcÁ•æ XêDn‰%~';ïF¾Æ¯¹#¶’'†¿À¥ªãŽŠ׋óPɲ4е݊GÖÕ%£„›âˆÛK³{h‚…+Í?/Ü›/ï¨ÔÈî¿%n¸—uÕ›îØäZóìʘ5Éd õ©^´¿ìý.³ç'±ŒVÑŒŽ­>¹k1†/¤ŠQÒ¹±´îÓ0kÌ.L÷ >%ˆGÀóÔ•ˆx¨¥l,dåUPÎe1Qz‘|{=ÆHöé|O§gÀ]޵aÎZè)¿µ¸ªE±{ÿtWÑ"—JTAwÏ¥k7¸ˆÆö·…Û—HŽ{Ê™Ûm;¡ ÁåT‘ “$õØïøo¶wŠ|$#@Q^¼kµdÅÈïh Ø¿Õgçg}*©Ÿü¤¼@ÆÀ“B1ƒ±~|㸩±à­‹¨¥]to·ç·Õ¾Så4{ß1ˆò¤ÄÛ§^Ю /g¤-ó²Ù¯MfGþ…5ì(h÷PmJy?›.§{Z± n Ü©³Ýé§]¥¹30ë›qܶëoü‰’™…TïÞ‘>*Ó êݾqpÐ%érâ ü”)Ã- \ûL›¼­¶ïÒ{»¨ò÷+(f¦ÓO-ñ.ËÖìÆ…`{ðd§€nzT!F9=ìYQ•ƒ&‘ZÜéâ Co ÚlGcê1áoX¿æìT5œagChÄ[¾`ºâîÇì¸xýR‚Ï05%+Áõd°(IþOL›ÈãqµŽèIò8žŒSI¾#"7'Ë:êWW:rµz‡YJø5Aµ »Ñ_)´C¬¯âGæ ¿Äc­$ñò+•uo'…o b5ÉL'Æ(NŽeÍ‘q‹Ë|ýŘâ$óý¤f-NЗØÎàûÛ5`= u²ç+L5ŠäˆÎ*N°‘tDþ” Õm‡ñÆKw±×+uô°8ç°æ«>SMµÍ[<–y.ç «›0zXAûVÞÁÂ|‡›¦Õ”fÎÍúèNÙY>‰¬?Ouñk ÷&òÚl8q f9 £‘¸:j¬smHuùÞ=!¶hyå.\ò¯gÃîiã<Þþ+#KÖ¹iL…Ûe±’>©>;Y¹&KóN]~×´ð.vy|X”[Þè,*š}Ù»ýnYd‡ %åtEf¯?åJÌvv4GÀÆ*µd[ó²žjÝ.‡6æxï›­‚¬€uÃöêb–f[©Ù‹ÑGCïÛå䬆°‘ª/–)‡ïÍ Àf$‚:)ukŒÐ¡æ)œŸÅ­jZ.O Fi¹à³+¥é[R°UTü™jfѶ1I¼]{îÑ ÂÔ7s.ÆD‹²`;÷C¦¬Ù\ç÷«½Ÿ¯½T§=ŠÅäñi{©Z7Üraó6µÈ†ß1·÷ImÈè>n»ðÜmŽ£&QØŽ5Ü}u;ñ¦ÿÊVö¢ÛâM)×z}‚9iémnîokËŠ†­°±4A¶¸•ë§‘¯ +7Åò´/O» ±(¾+Py(³S3¿®ÊTH÷Iïo(Ô—ó?$™±KMؘˋËÿ,ÝEèO¯ÔìñE4<0v3C‚5 déú•ë…iP…|ÌRýr»¶‚Oq¤ê}t¯ãÌgpºFr)­ÃC瘩҆˜EŽWU5‡m@¦œNå›&n_vúL.˜(¢fPòš Pfk½d÷m|sÉ´˜z  ?…µš0Fðtp”Ò1ý;TlsØAfFFp,{‹æºîaÒÜ žv-uèDoG[±]ý¨)uŒœøÝ>bÛ‹ï°è‚L²LTO‚N÷>º[æv¸±ãsCXTx¿ÙTxLö}Ü¿þLœýÉ o7Œ!i/ì®;¨Ä,œé ½CÑìÃdÇú£M,–£þ­HCvÜ'B[šdùڡ󓞇‚¤ð‡”l%•°ÖÔ±-K\YdFcǃ¹]cJñ`TÇ7ܳº¥ÜìsŸ,Þ=ÖgzÝ/™zcè›3hÙ™Õš`·ðsæ4ÀÀ¶÷îsªéxcÂøH'|0Ÿº§.P ºL²H5ùÚr»2ξÆ{;M•JlHJ6QìÆpï63êz•°&;ß_®ôÛ˜åñ×tMô=òÖD,ÖP¡ŠÀgÎX§ÙÆÄÑ™Xí— êíêk~âÁŽ}ì+ UYφAÒð®Ã–õiõä&Ÿjþ).ý@šd‡VkV1äÛftóÁFùF(Hxm\‡ã=‘ŽtÄxQY‡I‡˜hÉm~_Ã9ë !¼“°*ÓÏë“yÜÉõõq®7¢ÒcVÝìñÓPÓC›•ñ™>H÷ò'à—ÑÎrÝÍoòíÊU 㾤ÍuFñv¡'î鋆”À¼–’û‡R—†t«Ï™¸b‹‡úË®“›ÊÐòlq}aTíçéOi~ǟǘ ÷)ÓºüŽ% Õ|óMÒÄPµ£M‰ùqä¥ ŠÝ8’ÛÚäu¸-¬Â¯òָǟQ¥g÷µ,m¾º»¬ ! q¿”5ÞÊ £—i¿G‹òû^— SJ¥ߥÚÓ î Hæ®N—>¤ÊÂÙ4£ê×z·ãeºÃ&/‚ÕŠ#\r,mq¼-%(<2À8ksØ‘N’'ƒáÜ“ æIZšSÞžjzæïnAÔΊeµdí çß/uHùÖuM~…Dˆ“üŽž¬Ý]MnÌjŒg9âbu86tÖ${LQn*Mf°­oAí* )¬ËÒ«Iª—§Åjè^î—¢~éVp¶2ˆL\8Y1óñôéôeÑðËÂ#¥´Ñ+nE^õr‹.l,ŽAEººªÞU ŒLâØ‘­YÍÉðÛÈÁãÀPÝ-9$ÿqüô¸õöÚ‹‚µ”!ZËû†,+†ÜKŒPjúÔRN£'639o¦\Öe(Xb¼§Ú€·„Ãv¿ÀVc ÷5šÀÜ“+ÇàÏuaYöJñ7..µEñ0Yå\‹¸¤ºÄ3*„ùp kû*}Ýo :{Ê ]µká8‡?éD Þ16ËTO̵H êP­•6™$—¾|¨)›aÇ8ÍÂÍŽ:6ûjËvè»&tøýy9³OYê<9lŽ;A̵µÔrnº ~ˆ±ðwÞÉ*q/ãƒ>Ûw.nh™ §„÷ºt TU8ó»9Ë))ÊM“+Ü뇆;ºç0FN¹·½=½º®Z öøfÈw¦§’¦‹¬ša-õ. ámÏÓÇÕdæh]GÆx ‚‡ûVzyÕü•Õ?÷ÛhÈx¢.ÙFv¦V!E³]}Cší?@ý†^zÝIÚ*ï¸L¸¨ÞÊȇÆÁf¡Õ7Û¢l´î×ÎÒ[¸ «£‰ëÒòÚ Åƒ×k5ÅóÄ_§Ì,Í*Ù K—½“û}ömŽL®™K"ìb’úæîì2Ã%åýÇ{ ‘j”}¨¾VìI»5¤÷Ø?¢WQPq®ñüð:ÀEÆ~¯U¡™ÙrVê›’ßf¼¢ôùBkäÓs³ÆÒ`ìc6"‘~±Z~Ç3T»)‚Ì7ÚNÏø'b¦–c]„¨û¸ô¤­Ìñ¼˜·T¼TE 1²(|&3r'lµÇÞ·ËH ÍöºÊƒêÕ`{Üü];š¶@Âo//œ8¿Ô¦úÖPLJ0@üz|i±§)égO.µWc¨ŽMçÔ+ý¾p$õ{n ΔNjÐÚƒŠÞwa-Þ©­ÖWâJ;x½‹n|\:YÕëõøj}&Á ²{Ac";*25pwTe ._là™ä/©ÌÅàð¬©ÒCéçP•²™õž÷I“Èוßa›ù_Î…lvZ± úO³¿{¶ÞRªé”7/|ü~•´·ûSÛŽ”F°[®™—ÙoГZǰMÀ•HrþóÝ x¨}JÛ>Ÿ^HÒ}í-¾Ò‘%OÔ§ —€ÏCPßÜùŽöGþd¥px~c˜Ñeÿ`0v-eí‰Ãÿ±J?›TaAäbB̧éãÝÉŒ@Ö ¬ô`ðGák}è]uN¨†yBéaÙ„É~øó,Æ“1õ bÕ™'ö­™¼úN¸¬8ÊS¶©–µ7$Õ&5èevâÝ{Y<<™míîM…¢e=Ôt¨[zÑÊ™Ì(ÕÁ6–L®Ûf„jc¤+¿ ‡~Ý&⋳ éù¸_¸^j9„/°î‹^Æ[V5Þ)ëV+0){¸3s×(AßhôbÄÏÄÛwÓµÌÌ 7ÚqI¤]Ãx±P¸€è‘vØðŒ‡oËøøÀì¾Õmá›3 HHÅR³*„–.ËtÄê&Go®mgŠGO˜–׊¬À0Ô–’Ò[û™7wäb3ª‡Ðy||7î«P9)ëYf+ߦÓjs.„­qÀÁu㓟¢›B¹Ë w'`¸IURªÒº„…Ôã¦K·–¦–ÀzEý‹Ï–¼dMµíç2Aì1ã|?G¥¶§/É&û×Ö°:ÄÉ?ªç×ÄþZûÖŸ{|ZfûGšE a>JFÑ™3,Ë܉Êmr‚%Žæz„Ff¡QÇóÒg¨Â)IšI„Í·¼Ú'n›¾g¢yXѤµ ¿Î5ß§øŒ0™Ê0¿l~äµ­· :ü®ÐdR’ÀX—¥V‹1:6Tó?Aì-€¯GYÃ<:dP hùVHÐVc¥:_¨ü–{ô =KÆ ÊPc$vúÒ„—Ç¥P•DÙ;Þ¦à-Iš`äq0‡ ·ÅhE^H%©?ló¥ˆ FQßÜ!saTÖÃë*=ÀJ8þ]2F¡ýq,•–gÞôK{ ‹év"MZ§k‚iËïsÄwaLß ÏÏ9‰Ä»¨¦÷!y°Î}øØgô7¿òx½ðÀÒ×%nÙÊ¥Qç|ß`ÍàWÑL€9MžÄõ_XSBÿJª*Ê•âæag³‰BFsÞIðþ¦È¡þËúi¢y»Ÿ«iáð|ð@öÄʰu&Üfå|Á1\w„ÖçVá~þñÇ%Ŭ¶ú½Y°úB7X)$U@ÑuÛ:¦Â*Çl?Ž‘ø?;1nÔ‡Ì.neOQDãÔÚ¿\Ûø•ÜÓ_šÆ+êk2†óE¾öñ< ã crÅ fãià#çÛëâu¼:üµc3˜QÞ…9©£¨ùph¾hÙ*^4Pjr­ë'ª<ãg·ªËóÆ©ým¹Ÿ!ˆf2T2‰çXXG‹å[ß&5¹³IÌqéBu|;¯±4CEuÔ/³€ŽúsÇ?‚7L\²Ó±¿ËHW³ài.: ÆhfMýno”ÇNLàyÒ![0lÛ Jˆ#¨NìWÿÒ1jÁ…Tžõ@ç{ªÃæîîÞï9‘nT´2Jh[µËBñÖ‰úª;³ 6ú‚Qˆ"¢ÿ–ª‘ªq?ƒVèâÙ¼«4Ø“6ØCn@X‹9]Y–þàeÊ×ÍøF OÑûiR¤†ûjŠPèh¦HÓóéô…’pâtÄ|C¿óG7½µ¤7ýM•ß…ÙUÿ|Ü|”÷ ©aÊAO]Ø#šI­…qÙÝJ'Í"Éš1ôu´Zu²ë¦¿­`t_àîK(ÓiØÂq­„éF݃Æ|5³›ïµ»'@ôˆÄz }3¿-Ê•ýÙb; ÂΨ„ªÑ$„}lü„òاœÅ£fgàZLÉ5œ‡na½ëê÷yqÍw¥<µ#´ÿ¤æ¦"zñ•Zɳc§QßÀF®z´èí²Q¹xôÂò…ðŒø¹}ÞGœÙŠèàZº°(h¸à5¹òÛŠ§¾"_Ÿ.ý‘™¿ÅL³ŽõggCu Ó…¾¦ÁÅŽâ4Õ•wr‰sö*5¶f¢0ïú1[Ɉ%Ýz× ”öËùÏ5ø¼t~hrx§Y.ùØ ¹­þ¢ºè\BÍsÂÌlPùÚ7'¬Æ0Ü:­MïB±„Ëmeš£“}óãRá‚"áw ¥½û;œÔÐ3ÑÆif¬-Iþ“¾Ù°d¨w"³\Yg~ç.*Ã*}=æR…E‘Íà—¥aýÞˆøm»RyiÍÔð–™ÇÇQêRýoɶÓÎ#Õš|ÕQ¶•êqb1± ­k\­"ÏÏO«È›z;nYO%g‚oÑÓªHÈõ-u6‘Ÿ÷ªÃ¼;‡WI¯årn…>ýd`ä¡ÂÛGý&'F"3 ‰eYµHËDÕÓ-1ˆ Q9 ûQO8ù³Ö^®{Ý<×B·H4Î;{ÕñT»1d!Ul¸…®8·ÓYA¤ð±…öÇBƒX¥HÑëÿÇòÿ›àÿŠ ÌA@SgW°½©³òÿKˆDB endstream endobj 6 0 obj << /Type /Font /Subtype /Type1 /Encoding 2466 0 R /FirstChar 11 /LastChar 126 /Widths 2467 0 R /BaseFont /JDVNVX+CMBX12 /FontDescriptor 4 0 R >> endobj 4 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /JDVNVX+CMBX12 /ItalicAngle 0 /StemV 109 /XHeight 444 /FontBBox [-53 -251 1139 750] /Flags 4 /CharSet (/ff/fi/acute/cedilla/exclam/quoteright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/equal/question/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Z/quotedblleft/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/tilde) /FontFile 5 0 R >> endobj 2467 0 obj [656 625 0 0 0 0 0 0 562 0 0 0 0 500 0 0 0 0 0 0 0 0 343 0 0 0 0 0 313 0 0 0 0 313 375 313 562 562 562 562 562 562 562 562 562 562 562 313 0 0 875 0 531 0 850 800 813 862 738 707 884 880 419 0 881 676 1067 880 845 769 845 839 625 782 865 850 1162 850 0 687 0 581 0 0 0 313 547 625 500 625 513 344 562 625 313 344 594 313 938 625 562 625 594 459 444 438 625 594 813 594 594 500 0 0 0 562 ] endobj 2466 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi 13/.notdef 19/acute 20/.notdef 24/cedilla 25/.notdef 33/exclam 34/.notdef 39/quoteright 40/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 61/equal 62/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 75/K/L/M/N/O/P/Q/R/S/T/U/V/W/X 89/.notdef 90/Z 91/.notdef 92/quotedblleft 93/.notdef 96/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef 126/tilde 127/.notdef] >> endobj 16 0 obj << /Type /Pages /Count 6 /Parent 2468 0 R /Kids [2 0 R 18 0 R 21 0 R 33 0 R 39 0 R 46 0 R] >> endobj 53 0 obj << /Type /Pages /Count 6 /Parent 2468 0 R /Kids [50 0 R 55 0 R 59 0 R 63 0 R 67 0 R 71 0 R] >> endobj 78 0 obj << /Type /Pages /Count 6 /Parent 2468 0 R /Kids [75 0 R 80 0 R 84 0 R 91 0 R 98 0 R 106 0 R] >> endobj 118 0 obj << /Type /Pages /Count 6 /Parent 2468 0 R /Kids [111 0 R 125 0 R 138 0 R 152 0 R 163 0 R 175 0 R] >> endobj 190 0 obj << /Type /Pages /Count 6 /Parent 2468 0 R /Kids [186 0 R 193 0 R 197 0 R 209 0 R 227 0 R 233 0 R] >> endobj 257 0 obj << /Type /Pages /Count 6 /Parent 2468 0 R /Kids [253 0 R 259 0 R 270 0 R 290 0 R 298 0 R 304 0 R] >> endobj 313 0 obj << /Type /Pages /Count 6 /Parent 2469 0 R /Kids [308 0 R 321 0 R 333 0 R 338 0 R 348 0 R 359 0 R] >> endobj 375 0 obj << /Type /Pages /Count 6 /Parent 2469 0 R /Kids [369 0 R 380 0 R 385 0 R 394 0 R 400 0 R 405 0 R] >> endobj 418 0 obj << /Type /Pages /Count 6 /Parent 2469 0 R /Kids [414 0 R 420 0 R 425 0 R 429 0 R 433 0 R 437 0 R] >> endobj 459 0 obj << /Type /Pages /Count 6 /Parent 2469 0 R /Kids [449 0 R 461 0 R 476 0 R 484 0 R 499 0 R 503 0 R] >> endobj 513 0 obj << /Type /Pages /Count 6 /Parent 2469 0 R /Kids [507 0 R 516 0 R 524 0 R 529 0 R 536 0 R 542 0 R] >> endobj 550 0 obj << /Type /Pages /Count 6 /Parent 2469 0 R /Kids [547 0 R 552 0 R 556 0 R 563 0 R 569 0 R 579 0 R] >> endobj 593 0 obj << /Type /Pages /Count 6 /Parent 2470 0 R /Kids [587 0 R 595 0 R 601 0 R 606 0 R 614 0 R 628 0 R] >> endobj 635 0 obj << /Type /Pages /Count 6 /Parent 2470 0 R /Kids [632 0 R 637 0 R 641 0 R 646 0 R 652 0 R 656 0 R] >> endobj 664 0 obj << /Type /Pages /Count 6 /Parent 2470 0 R /Kids [660 0 R 666 0 R 671 0 R 678 0 R 695 0 R 704 0 R] >> endobj 711 0 obj << /Type /Pages /Count 6 /Parent 2470 0 R /Kids [708 0 R 713 0 R 724 0 R 731 0 R 735 0 R 739 0 R] >> endobj 752 0 obj << /Type /Pages /Count 6 /Parent 2470 0 R /Kids [743 0 R 755 0 R 759 0 R 763 0 R 767 0 R 771 0 R] >> endobj 778 0 obj << /Type /Pages /Count 6 /Parent 2470 0 R /Kids [775 0 R 780 0 R 787 0 R 791 0 R 799 0 R 803 0 R] >> endobj 810 0 obj << /Type /Pages /Count 6 /Parent 2471 0 R /Kids [807 0 R 812 0 R 822 0 R 826 0 R 832 0 R 836 0 R] >> endobj 862 0 obj << /Type /Pages /Count 6 /Parent 2471 0 R /Kids [852 0 R 864 0 R 882 0 R 898 0 R 911 0 R 924 0 R] >> endobj 952 0 obj << /Type /Pages /Count 6 /Parent 2471 0 R /Kids [934 0 R 955 0 R 965 0 R 974 0 R 985 0 R 993 0 R] >> endobj 1009 0 obj << /Type /Pages /Count 6 /Parent 2471 0 R /Kids [1001 0 R 1011 0 R 1018 0 R 1029 0 R 1044 0 R 1055 0 R] >> endobj 1069 0 obj << /Type /Pages /Count 6 /Parent 2471 0 R /Kids [1063 0 R 1071 0 R 1076 0 R 1085 0 R 1099 0 R 1104 0 R] >> endobj 1125 0 obj << /Type /Pages /Count 6 /Parent 2471 0 R /Kids [1117 0 R 1127 0 R 1134 0 R 1139 0 R 1145 0 R 1151 0 R] >> endobj 1161 0 obj << /Type /Pages /Count 6 /Parent 2472 0 R /Kids [1156 0 R 1163 0 R 1170 0 R 1180 0 R 1184 0 R 1189 0 R] >> endobj 1198 0 obj << /Type /Pages /Count 6 /Parent 2472 0 R /Kids [1195 0 R 1200 0 R 1209 0 R 1216 0 R 1294 0 R 1383 0 R] >> endobj 1431 0 obj << /Type /Pages /Count 6 /Parent 2472 0 R /Kids [1394 0 R 1433 0 R 1474 0 R 1522 0 R 1574 0 R 1626 0 R] >> endobj 1674 0 obj << /Type /Pages /Count 2 /Parent 2472 0 R /Kids [1670 0 R 2414 0 R] >> endobj 2468 0 obj << /Type /Pages /Count 36 /Parent 2473 0 R /Kids [16 0 R 53 0 R 78 0 R 118 0 R 190 0 R 257 0 R] >> endobj 2469 0 obj << /Type /Pages /Count 36 /Parent 2473 0 R /Kids [313 0 R 375 0 R 418 0 R 459 0 R 513 0 R 550 0 R] >> endobj 2470 0 obj << /Type /Pages /Count 36 /Parent 2473 0 R /Kids [593 0 R 635 0 R 664 0 R 711 0 R 752 0 R 778 0 R] >> endobj 2471 0 obj << /Type /Pages /Count 36 /Parent 2473 0 R /Kids [810 0 R 862 0 R 952 0 R 1009 0 R 1069 0 R 1125 0 R] >> endobj 2472 0 obj << /Type /Pages /Count 20 /Parent 2473 0 R /Kids [1161 0 R 1198 0 R 1431 0 R 1674 0 R] >> endobj 2473 0 obj << /Type /Pages /Count 164 /Kids [2468 0 R 2469 0 R 2470 0 R 2471 0 R 2472 0 R] >> endobj 2474 0 obj << /Type /Outlines /First 1676 0 R /Last 2411 0 R /Count 20 >> endobj 2411 0 obj << /Title 2412 0 R /A 2410 0 R /Parent 2474 0 R /Prev 2408 0 R >> endobj 2408 0 obj << /Title 2409 0 R /A 2407 0 R /Parent 2474 0 R /Prev 2405 0 R /Next 2411 0 R >> endobj 2405 0 obj << /Title 2406 0 R /A 2404 0 R /Parent 2474 0 R /Prev 2393 0 R /Next 2408 0 R >> endobj 2402 0 obj << /Title 2403 0 R /A 2401 0 R /Parent 2393 0 R /Prev 2396 0 R >> endobj 2399 0 obj << /Title 2400 0 R /A 2398 0 R /Parent 2396 0 R >> endobj 2396 0 obj << /Title 2397 0 R /A 2395 0 R /Parent 2393 0 R /Next 2402 0 R /First 2399 0 R /Last 2399 0 R /Count -1 >> endobj 2393 0 obj << /Title 2394 0 R /A 2392 0 R /Parent 2474 0 R /Prev 2366 0 R /Next 2405 0 R /First 2396 0 R /Last 2402 0 R /Count -2 >> endobj 2390 0 obj << /Title 2391 0 R /A 2389 0 R /Parent 2366 0 R /Prev 2387 0 R >> endobj 2387 0 obj << /Title 2388 0 R /A 2386 0 R /Parent 2366 0 R /Prev 2378 0 R /Next 2390 0 R >> endobj 2384 0 obj << /Title 2385 0 R /A 2383 0 R /Parent 2378 0 R /Prev 2381 0 R >> endobj 2381 0 obj << /Title 2382 0 R /A 2380 0 R /Parent 2378 0 R /Next 2384 0 R >> endobj 2378 0 obj << /Title 2379 0 R /A 2377 0 R /Parent 2366 0 R /Prev 2375 0 R /Next 2387 0 R /First 2381 0 R /Last 2384 0 R /Count -2 >> endobj 2375 0 obj << /Title 2376 0 R /A 2374 0 R /Parent 2366 0 R /Prev 2372 0 R /Next 2378 0 R >> endobj 2372 0 obj << /Title 2373 0 R /A 2371 0 R /Parent 2366 0 R /Prev 2369 0 R /Next 2375 0 R >> endobj 2369 0 obj << /Title 2370 0 R /A 2368 0 R /Parent 2366 0 R /Next 2372 0 R >> endobj 2366 0 obj << /Title 2367 0 R /A 2365 0 R /Parent 2474 0 R /Prev 2363 0 R /Next 2393 0 R /First 2369 0 R /Last 2390 0 R /Count -6 >> endobj 2363 0 obj << /Title 2364 0 R /A 2362 0 R /Parent 2474 0 R /Prev 1901 0 R /Next 2366 0 R >> endobj 2360 0 obj << /Title 2361 0 R /A 2359 0 R /Parent 1907 0 R /Prev 2357 0 R >> endobj 2357 0 obj << /Title 2358 0 R /A 2356 0 R /Parent 1907 0 R /Prev 2354 0 R /Next 2360 0 R >> endobj 2354 0 obj << /Title 2355 0 R /A 2353 0 R /Parent 1907 0 R /Prev 2351 0 R /Next 2357 0 R >> endobj 2351 0 obj << /Title 2352 0 R /A 2350 0 R /Parent 1907 0 R /Prev 2348 0 R /Next 2354 0 R >> endobj 2348 0 obj << /Title 2349 0 R /A 2347 0 R /Parent 1907 0 R /Prev 2345 0 R /Next 2351 0 R >> endobj 2345 0 obj << /Title 2346 0 R /A 2344 0 R /Parent 1907 0 R /Prev 2342 0 R /Next 2348 0 R >> endobj 2342 0 obj << /Title 2343 0 R /A 2341 0 R /Parent 1907 0 R /Prev 2339 0 R /Next 2345 0 R >> endobj 2339 0 obj << /Title 2340 0 R /A 2338 0 R /Parent 1907 0 R /Prev 2336 0 R /Next 2342 0 R >> endobj 2336 0 obj << /Title 2337 0 R /A 2335 0 R /Parent 1907 0 R /Prev 2333 0 R /Next 2339 0 R >> endobj 2333 0 obj << /Title 2334 0 R /A 2332 0 R /Parent 1907 0 R /Prev 2330 0 R /Next 2336 0 R >> endobj 2330 0 obj << /Title 2331 0 R /A 2329 0 R /Parent 1907 0 R /Prev 2327 0 R /Next 2333 0 R >> endobj 2327 0 obj << /Title 2328 0 R /A 2326 0 R /Parent 1907 0 R /Prev 2324 0 R /Next 2330 0 R >> endobj 2324 0 obj << /Title 2325 0 R /A 2323 0 R /Parent 1907 0 R /Prev 2321 0 R /Next 2327 0 R >> endobj 2321 0 obj << /Title 2322 0 R /A 2320 0 R /Parent 1907 0 R /Prev 2318 0 R /Next 2324 0 R >> endobj 2318 0 obj << /Title 2319 0 R /A 2317 0 R /Parent 1907 0 R /Prev 2315 0 R /Next 2321 0 R >> endobj 2315 0 obj << /Title 2316 0 R /A 2314 0 R /Parent 1907 0 R /Prev 2312 0 R /Next 2318 0 R >> endobj 2312 0 obj << /Title 2313 0 R /A 2311 0 R /Parent 1907 0 R /Prev 2309 0 R /Next 2315 0 R >> endobj 2309 0 obj << /Title 2310 0 R /A 2308 0 R /Parent 1907 0 R /Prev 2306 0 R /Next 2312 0 R >> endobj 2306 0 obj << /Title 2307 0 R /A 2305 0 R /Parent 1907 0 R /Prev 2303 0 R /Next 2309 0 R >> endobj 2303 0 obj << /Title 2304 0 R /A 2302 0 R /Parent 1907 0 R /Prev 2300 0 R /Next 2306 0 R >> endobj 2300 0 obj << /Title 2301 0 R /A 2299 0 R /Parent 1907 0 R /Prev 2297 0 R /Next 2303 0 R >> endobj 2297 0 obj << /Title 2298 0 R /A 2296 0 R /Parent 1907 0 R /Prev 2294 0 R /Next 2300 0 R >> endobj 2294 0 obj << /Title 2295 0 R /A 2293 0 R /Parent 1907 0 R /Prev 2291 0 R /Next 2297 0 R >> endobj 2291 0 obj << /Title 2292 0 R /A 2290 0 R /Parent 1907 0 R /Prev 2288 0 R /Next 2294 0 R >> endobj 2288 0 obj << /Title 2289 0 R /A 2287 0 R /Parent 1907 0 R /Prev 2285 0 R /Next 2291 0 R >> endobj 2285 0 obj << /Title 2286 0 R /A 2284 0 R /Parent 1907 0 R /Prev 2282 0 R /Next 2288 0 R >> endobj 2282 0 obj << /Title 2283 0 R /A 2281 0 R /Parent 1907 0 R /Prev 2279 0 R /Next 2285 0 R >> endobj 2279 0 obj << /Title 2280 0 R /A 2278 0 R /Parent 1907 0 R /Prev 2276 0 R /Next 2282 0 R >> endobj 2276 0 obj << /Title 2277 0 R /A 2275 0 R /Parent 1907 0 R /Prev 2273 0 R /Next 2279 0 R >> endobj 2273 0 obj << /Title 2274 0 R /A 2272 0 R /Parent 1907 0 R /Prev 2270 0 R /Next 2276 0 R >> endobj 2270 0 obj << /Title 2271 0 R /A 2269 0 R /Parent 1907 0 R /Prev 2267 0 R /Next 2273 0 R >> endobj 2267 0 obj << /Title 2268 0 R /A 2266 0 R /Parent 1907 0 R /Prev 2264 0 R /Next 2270 0 R >> endobj 2264 0 obj << /Title 2265 0 R /A 2263 0 R /Parent 1907 0 R /Prev 2261 0 R /Next 2267 0 R >> endobj 2261 0 obj << /Title 2262 0 R /A 2260 0 R /Parent 1907 0 R /Prev 2258 0 R /Next 2264 0 R >> endobj 2258 0 obj << /Title 2259 0 R /A 2257 0 R /Parent 1907 0 R /Prev 2255 0 R /Next 2261 0 R >> endobj 2255 0 obj << /Title 2256 0 R /A 2254 0 R /Parent 1907 0 R /Prev 2252 0 R /Next 2258 0 R >> endobj 2252 0 obj << /Title 2253 0 R /A 2251 0 R /Parent 1907 0 R /Prev 2249 0 R /Next 2255 0 R >> endobj 2249 0 obj << /Title 2250 0 R /A 2248 0 R /Parent 1907 0 R /Prev 2246 0 R /Next 2252 0 R >> endobj 2246 0 obj << /Title 2247 0 R /A 2245 0 R /Parent 1907 0 R /Prev 2243 0 R /Next 2249 0 R >> endobj 2243 0 obj << /Title 2244 0 R /A 2242 0 R /Parent 1907 0 R /Prev 2240 0 R /Next 2246 0 R >> endobj 2240 0 obj << /Title 2241 0 R /A 2239 0 R /Parent 1907 0 R /Prev 2237 0 R /Next 2243 0 R >> endobj 2237 0 obj << /Title 2238 0 R /A 2236 0 R /Parent 1907 0 R /Prev 2234 0 R /Next 2240 0 R >> endobj 2234 0 obj << /Title 2235 0 R /A 2233 0 R /Parent 1907 0 R /Prev 2231 0 R /Next 2237 0 R >> endobj 2231 0 obj << /Title 2232 0 R /A 2230 0 R /Parent 1907 0 R /Prev 2228 0 R /Next 2234 0 R >> endobj 2228 0 obj << /Title 2229 0 R /A 2227 0 R /Parent 1907 0 R /Prev 2225 0 R /Next 2231 0 R >> endobj 2225 0 obj << /Title 2226 0 R /A 2224 0 R /Parent 1907 0 R /Prev 2222 0 R /Next 2228 0 R >> endobj 2222 0 obj << /Title 2223 0 R /A 2221 0 R /Parent 1907 0 R /Prev 2219 0 R /Next 2225 0 R >> endobj 2219 0 obj << /Title 2220 0 R /A 2218 0 R /Parent 1907 0 R /Prev 2216 0 R /Next 2222 0 R >> endobj 2216 0 obj << /Title 2217 0 R /A 2215 0 R /Parent 1907 0 R /Prev 2213 0 R /Next 2219 0 R >> endobj 2213 0 obj << /Title 2214 0 R /A 2212 0 R /Parent 1907 0 R /Prev 2210 0 R /Next 2216 0 R >> endobj 2210 0 obj << /Title 2211 0 R /A 2209 0 R /Parent 1907 0 R /Prev 2207 0 R /Next 2213 0 R >> endobj 2207 0 obj << /Title 2208 0 R /A 2206 0 R /Parent 1907 0 R /Prev 2204 0 R /Next 2210 0 R >> endobj 2204 0 obj << /Title 2205 0 R /A 2203 0 R /Parent 1907 0 R /Prev 2201 0 R /Next 2207 0 R >> endobj 2201 0 obj << /Title 2202 0 R /A 2200 0 R /Parent 1907 0 R /Prev 2198 0 R /Next 2204 0 R >> endobj 2198 0 obj << /Title 2199 0 R /A 2197 0 R /Parent 1907 0 R /Prev 2195 0 R /Next 2201 0 R >> endobj 2195 0 obj << /Title 2196 0 R /A 2194 0 R /Parent 1907 0 R /Prev 2192 0 R /Next 2198 0 R >> endobj 2192 0 obj << /Title 2193 0 R /A 2191 0 R /Parent 1907 0 R /Prev 2189 0 R /Next 2195 0 R >> endobj 2189 0 obj << /Title 2190 0 R /A 2188 0 R /Parent 1907 0 R /Prev 2186 0 R /Next 2192 0 R >> endobj 2186 0 obj << /Title 2187 0 R /A 2185 0 R /Parent 1907 0 R /Prev 2183 0 R /Next 2189 0 R >> endobj 2183 0 obj << /Title 2184 0 R /A 2182 0 R /Parent 1907 0 R /Prev 2180 0 R /Next 2186 0 R >> endobj 2180 0 obj << /Title 2181 0 R /A 2179 0 R /Parent 1907 0 R /Prev 2177 0 R /Next 2183 0 R >> endobj 2177 0 obj << /Title 2178 0 R /A 2176 0 R /Parent 1907 0 R /Prev 2174 0 R /Next 2180 0 R >> endobj 2174 0 obj << /Title 2175 0 R /A 2173 0 R /Parent 1907 0 R /Prev 2171 0 R /Next 2177 0 R >> endobj 2171 0 obj << /Title 2172 0 R /A 2170 0 R /Parent 1907 0 R /Prev 2168 0 R /Next 2174 0 R >> endobj 2168 0 obj << /Title 2169 0 R /A 2167 0 R /Parent 1907 0 R /Prev 2165 0 R /Next 2171 0 R >> endobj 2165 0 obj << /Title 2166 0 R /A 2164 0 R /Parent 1907 0 R /Prev 2162 0 R /Next 2168 0 R >> endobj 2162 0 obj << /Title 2163 0 R /A 2161 0 R /Parent 1907 0 R /Prev 2159 0 R /Next 2165 0 R >> endobj 2159 0 obj << /Title 2160 0 R /A 2158 0 R /Parent 1907 0 R /Prev 2156 0 R /Next 2162 0 R >> endobj 2156 0 obj << /Title 2157 0 R /A 2155 0 R /Parent 1907 0 R /Prev 2153 0 R /Next 2159 0 R >> endobj 2153 0 obj << /Title 2154 0 R /A 2152 0 R /Parent 1907 0 R /Prev 2150 0 R /Next 2156 0 R >> endobj 2150 0 obj << /Title 2151 0 R /A 2149 0 R /Parent 1907 0 R /Prev 2147 0 R /Next 2153 0 R >> endobj 2147 0 obj << /Title 2148 0 R /A 2146 0 R /Parent 1907 0 R /Prev 2144 0 R /Next 2150 0 R >> endobj 2144 0 obj << /Title 2145 0 R /A 2143 0 R /Parent 1907 0 R /Prev 2141 0 R /Next 2147 0 R >> endobj 2141 0 obj << /Title 2142 0 R /A 2140 0 R /Parent 1907 0 R /Prev 2138 0 R /Next 2144 0 R >> endobj 2138 0 obj << /Title 2139 0 R /A 2137 0 R /Parent 1907 0 R /Prev 2135 0 R /Next 2141 0 R >> endobj 2135 0 obj << /Title 2136 0 R /A 2134 0 R /Parent 1907 0 R /Prev 2132 0 R /Next 2138 0 R >> endobj 2132 0 obj << /Title 2133 0 R /A 2131 0 R /Parent 1907 0 R /Prev 2129 0 R /Next 2135 0 R >> endobj 2129 0 obj << /Title 2130 0 R /A 2128 0 R /Parent 1907 0 R /Prev 2126 0 R /Next 2132 0 R >> endobj 2126 0 obj << /Title 2127 0 R /A 2125 0 R /Parent 1907 0 R /Prev 2123 0 R /Next 2129 0 R >> endobj 2123 0 obj << /Title 2124 0 R /A 2122 0 R /Parent 1907 0 R /Prev 2120 0 R /Next 2126 0 R >> endobj 2120 0 obj << /Title 2121 0 R /A 2119 0 R /Parent 1907 0 R /Prev 2117 0 R /Next 2123 0 R >> endobj 2117 0 obj << /Title 2118 0 R /A 2116 0 R /Parent 1907 0 R /Prev 2114 0 R /Next 2120 0 R >> endobj 2114 0 obj << /Title 2115 0 R /A 2113 0 R /Parent 1907 0 R /Prev 2111 0 R /Next 2117 0 R >> endobj 2111 0 obj << /Title 2112 0 R /A 2110 0 R /Parent 1907 0 R /Prev 2108 0 R /Next 2114 0 R >> endobj 2108 0 obj << /Title 2109 0 R /A 2107 0 R /Parent 1907 0 R /Prev 2105 0 R /Next 2111 0 R >> endobj 2105 0 obj << /Title 2106 0 R /A 2104 0 R /Parent 1907 0 R /Prev 2102 0 R /Next 2108 0 R >> endobj 2102 0 obj << /Title 2103 0 R /A 2101 0 R /Parent 1907 0 R /Prev 2099 0 R /Next 2105 0 R >> endobj 2099 0 obj << /Title 2100 0 R /A 2098 0 R /Parent 1907 0 R /Prev 2096 0 R /Next 2102 0 R >> endobj 2096 0 obj << /Title 2097 0 R /A 2095 0 R /Parent 1907 0 R /Prev 2093 0 R /Next 2099 0 R >> endobj 2093 0 obj << /Title 2094 0 R /A 2092 0 R /Parent 1907 0 R /Prev 2090 0 R /Next 2096 0 R >> endobj 2090 0 obj << /Title 2091 0 R /A 2089 0 R /Parent 1907 0 R /Prev 2087 0 R /Next 2093 0 R >> endobj 2087 0 obj << /Title 2088 0 R /A 2086 0 R /Parent 1907 0 R /Prev 2084 0 R /Next 2090 0 R >> endobj 2084 0 obj << /Title 2085 0 R /A 2083 0 R /Parent 1907 0 R /Prev 2081 0 R /Next 2087 0 R >> endobj 2081 0 obj << /Title 2082 0 R /A 2080 0 R /Parent 1907 0 R /Prev 2078 0 R /Next 2084 0 R >> endobj 2078 0 obj << /Title 2079 0 R /A 2077 0 R /Parent 1907 0 R /Prev 2075 0 R /Next 2081 0 R >> endobj 2075 0 obj << /Title 2076 0 R /A 2074 0 R /Parent 1907 0 R /Prev 2072 0 R /Next 2078 0 R >> endobj 2072 0 obj << /Title 2073 0 R /A 2071 0 R /Parent 1907 0 R /Prev 2069 0 R /Next 2075 0 R >> endobj 2069 0 obj << /Title 2070 0 R /A 2068 0 R /Parent 1907 0 R /Prev 2066 0 R /Next 2072 0 R >> endobj 2066 0 obj << /Title 2067 0 R /A 2065 0 R /Parent 1907 0 R /Prev 2063 0 R /Next 2069 0 R >> endobj 2063 0 obj << /Title 2064 0 R /A 2062 0 R /Parent 1907 0 R /Prev 2060 0 R /Next 2066 0 R >> endobj 2060 0 obj << /Title 2061 0 R /A 2059 0 R /Parent 1907 0 R /Prev 2057 0 R /Next 2063 0 R >> endobj 2057 0 obj << /Title 2058 0 R /A 2056 0 R /Parent 1907 0 R /Prev 2054 0 R /Next 2060 0 R >> endobj 2054 0 obj << /Title 2055 0 R /A 2053 0 R /Parent 1907 0 R /Prev 2051 0 R /Next 2057 0 R >> endobj 2051 0 obj << /Title 2052 0 R /A 2050 0 R /Parent 1907 0 R /Prev 2048 0 R /Next 2054 0 R >> endobj 2048 0 obj << /Title 2049 0 R /A 2047 0 R /Parent 1907 0 R /Prev 2045 0 R /Next 2051 0 R >> endobj 2045 0 obj << /Title 2046 0 R /A 2044 0 R /Parent 1907 0 R /Prev 2042 0 R /Next 2048 0 R >> endobj 2042 0 obj << /Title 2043 0 R /A 2041 0 R /Parent 1907 0 R /Prev 2039 0 R /Next 2045 0 R >> endobj 2039 0 obj << /Title 2040 0 R /A 2038 0 R /Parent 1907 0 R /Prev 2036 0 R /Next 2042 0 R >> endobj 2036 0 obj << /Title 2037 0 R /A 2035 0 R /Parent 1907 0 R /Prev 2033 0 R /Next 2039 0 R >> endobj 2033 0 obj << /Title 2034 0 R /A 2032 0 R /Parent 1907 0 R /Prev 2030 0 R /Next 2036 0 R >> endobj 2030 0 obj << /Title 2031 0 R /A 2029 0 R /Parent 1907 0 R /Prev 2027 0 R /Next 2033 0 R >> endobj 2027 0 obj << /Title 2028 0 R /A 2026 0 R /Parent 1907 0 R /Prev 2024 0 R /Next 2030 0 R >> endobj 2024 0 obj << /Title 2025 0 R /A 2023 0 R /Parent 1907 0 R /Prev 2021 0 R /Next 2027 0 R >> endobj 2021 0 obj << /Title 2022 0 R /A 2020 0 R /Parent 1907 0 R /Prev 2018 0 R /Next 2024 0 R >> endobj 2018 0 obj << /Title 2019 0 R /A 2017 0 R /Parent 1907 0 R /Prev 2015 0 R /Next 2021 0 R >> endobj 2015 0 obj << /Title 2016 0 R /A 2014 0 R /Parent 1907 0 R /Prev 2012 0 R /Next 2018 0 R >> endobj 2012 0 obj << /Title 2013 0 R /A 2011 0 R /Parent 1907 0 R /Prev 2009 0 R /Next 2015 0 R >> endobj 2009 0 obj << /Title 2010 0 R /A 2008 0 R /Parent 1907 0 R /Prev 2006 0 R /Next 2012 0 R >> endobj 2006 0 obj << /Title 2007 0 R /A 2005 0 R /Parent 1907 0 R /Prev 2003 0 R /Next 2009 0 R >> endobj 2003 0 obj << /Title 2004 0 R /A 2002 0 R /Parent 1907 0 R /Prev 2000 0 R /Next 2006 0 R >> endobj 2000 0 obj << /Title 2001 0 R /A 1999 0 R /Parent 1907 0 R /Prev 1997 0 R /Next 2003 0 R >> endobj 1997 0 obj << /Title 1998 0 R /A 1996 0 R /Parent 1907 0 R /Prev 1994 0 R /Next 2000 0 R >> endobj 1994 0 obj << /Title 1995 0 R /A 1993 0 R /Parent 1907 0 R /Prev 1991 0 R /Next 1997 0 R >> endobj 1991 0 obj << /Title 1992 0 R /A 1990 0 R /Parent 1907 0 R /Prev 1988 0 R /Next 1994 0 R >> endobj 1988 0 obj << /Title 1989 0 R /A 1987 0 R /Parent 1907 0 R /Prev 1985 0 R /Next 1991 0 R >> endobj 1985 0 obj << /Title 1986 0 R /A 1984 0 R /Parent 1907 0 R /Prev 1982 0 R /Next 1988 0 R >> endobj 1982 0 obj << /Title 1983 0 R /A 1981 0 R /Parent 1907 0 R /Prev 1979 0 R /Next 1985 0 R >> endobj 1979 0 obj << /Title 1980 0 R /A 1978 0 R /Parent 1907 0 R /Prev 1976 0 R /Next 1982 0 R >> endobj 1976 0 obj << /Title 1977 0 R /A 1975 0 R /Parent 1907 0 R /Prev 1973 0 R /Next 1979 0 R >> endobj 1973 0 obj << /Title 1974 0 R /A 1972 0 R /Parent 1907 0 R /Prev 1970 0 R /Next 1976 0 R >> endobj 1970 0 obj << /Title 1971 0 R /A 1969 0 R /Parent 1907 0 R /Prev 1967 0 R /Next 1973 0 R >> endobj 1967 0 obj << /Title 1968 0 R /A 1966 0 R /Parent 1907 0 R /Prev 1964 0 R /Next 1970 0 R >> endobj 1964 0 obj << /Title 1965 0 R /A 1963 0 R /Parent 1907 0 R /Prev 1961 0 R /Next 1967 0 R >> endobj 1961 0 obj << /Title 1962 0 R /A 1960 0 R /Parent 1907 0 R /Prev 1958 0 R /Next 1964 0 R >> endobj 1958 0 obj << /Title 1959 0 R /A 1957 0 R /Parent 1907 0 R /Prev 1955 0 R /Next 1961 0 R >> endobj 1955 0 obj << /Title 1956 0 R /A 1954 0 R /Parent 1907 0 R /Prev 1952 0 R /Next 1958 0 R >> endobj 1952 0 obj << /Title 1953 0 R /A 1951 0 R /Parent 1907 0 R /Prev 1949 0 R /Next 1955 0 R >> endobj 1949 0 obj << /Title 1950 0 R /A 1948 0 R /Parent 1907 0 R /Prev 1946 0 R /Next 1952 0 R >> endobj 1946 0 obj << /Title 1947 0 R /A 1945 0 R /Parent 1907 0 R /Prev 1943 0 R /Next 1949 0 R >> endobj 1943 0 obj << /Title 1944 0 R /A 1942 0 R /Parent 1907 0 R /Prev 1940 0 R /Next 1946 0 R >> endobj 1940 0 obj << /Title 1941 0 R /A 1939 0 R /Parent 1907 0 R /Prev 1937 0 R /Next 1943 0 R >> endobj 1937 0 obj << /Title 1938 0 R /A 1936 0 R /Parent 1907 0 R /Prev 1934 0 R /Next 1940 0 R >> endobj 1934 0 obj << /Title 1935 0 R /A 1933 0 R /Parent 1907 0 R /Prev 1931 0 R /Next 1937 0 R >> endobj 1931 0 obj << /Title 1932 0 R /A 1930 0 R /Parent 1907 0 R /Prev 1928 0 R /Next 1934 0 R >> endobj 1928 0 obj << /Title 1929 0 R /A 1927 0 R /Parent 1907 0 R /Prev 1925 0 R /Next 1931 0 R >> endobj 1925 0 obj << /Title 1926 0 R /A 1924 0 R /Parent 1907 0 R /Prev 1922 0 R /Next 1928 0 R >> endobj 1922 0 obj << /Title 1923 0 R /A 1921 0 R /Parent 1907 0 R /Prev 1919 0 R /Next 1925 0 R >> endobj 1919 0 obj << /Title 1920 0 R /A 1918 0 R /Parent 1907 0 R /Prev 1916 0 R /Next 1922 0 R >> endobj 1916 0 obj << /Title 1917 0 R /A 1915 0 R /Parent 1907 0 R /Prev 1913 0 R /Next 1919 0 R >> endobj 1913 0 obj << /Title 1914 0 R /A 1912 0 R /Parent 1907 0 R /Prev 1910 0 R /Next 1916 0 R >> endobj 1910 0 obj << /Title 1911 0 R /A 1909 0 R /Parent 1907 0 R /Next 1913 0 R >> endobj 1907 0 obj << /Title 1908 0 R /A 1906 0 R /Parent 1901 0 R /Prev 1904 0 R /First 1910 0 R /Last 2360 0 R /Count -151 >> endobj 1904 0 obj << /Title 1905 0 R /A 1903 0 R /Parent 1901 0 R /Next 1907 0 R >> endobj 1901 0 obj << /Title 1902 0 R /A 1900 0 R /Parent 2474 0 R /Prev 1871 0 R /Next 2363 0 R /First 1904 0 R /Last 1907 0 R /Count -2 >> endobj 1898 0 obj << /Title 1899 0 R /A 1897 0 R /Parent 1892 0 R /Prev 1895 0 R >> endobj 1895 0 obj << /Title 1896 0 R /A 1894 0 R /Parent 1892 0 R /Next 1898 0 R >> endobj 1892 0 obj << /Title 1893 0 R /A 1891 0 R /Parent 1871 0 R /Prev 1889 0 R /First 1895 0 R /Last 1898 0 R /Count -2 >> endobj 1889 0 obj << /Title 1890 0 R /A 1888 0 R /Parent 1871 0 R /Prev 1886 0 R /Next 1892 0 R >> endobj 1886 0 obj << /Title 1887 0 R /A 1885 0 R /Parent 1871 0 R /Prev 1883 0 R /Next 1889 0 R >> endobj 1883 0 obj << /Title 1884 0 R /A 1882 0 R /Parent 1871 0 R /Prev 1880 0 R /Next 1886 0 R >> endobj 1880 0 obj << /Title 1881 0 R /A 1879 0 R /Parent 1871 0 R /Prev 1877 0 R /Next 1883 0 R >> endobj 1877 0 obj << /Title 1878 0 R /A 1876 0 R /Parent 1871 0 R /Prev 1874 0 R /Next 1880 0 R >> endobj 1874 0 obj << /Title 1875 0 R /A 1873 0 R /Parent 1871 0 R /Next 1877 0 R >> endobj 1871 0 obj << /Title 1872 0 R /A 1870 0 R /Parent 2474 0 R /Prev 1868 0 R /Next 1901 0 R /First 1874 0 R /Last 1892 0 R /Count -7 >> endobj 1868 0 obj << /Title 1869 0 R /A 1867 0 R /Parent 2474 0 R /Prev 1760 0 R /Next 1871 0 R >> endobj 1865 0 obj << /Title 1866 0 R /A 1864 0 R /Parent 1847 0 R /Prev 1862 0 R >> endobj 1862 0 obj << /Title 1863 0 R /A 1861 0 R /Parent 1847 0 R /Prev 1859 0 R /Next 1865 0 R >> endobj 1859 0 obj << /Title 1860 0 R /A 1858 0 R /Parent 1847 0 R /Prev 1856 0 R /Next 1862 0 R >> endobj 1856 0 obj << /Title 1857 0 R /A 1855 0 R /Parent 1847 0 R /Prev 1853 0 R /Next 1859 0 R >> endobj 1853 0 obj << /Title 1854 0 R /A 1852 0 R /Parent 1847 0 R /Prev 1850 0 R /Next 1856 0 R >> endobj 1850 0 obj << /Title 1851 0 R /A 1849 0 R /Parent 1847 0 R /Next 1853 0 R >> endobj 1847 0 obj << /Title 1848 0 R /A 1846 0 R /Parent 1760 0 R /Prev 1799 0 R /First 1850 0 R /Last 1865 0 R /Count -6 >> endobj 1844 0 obj << /Title 1845 0 R /A 1843 0 R /Parent 1799 0 R /Prev 1841 0 R >> endobj 1841 0 obj << /Title 1842 0 R /A 1840 0 R /Parent 1799 0 R /Prev 1838 0 R /Next 1844 0 R >> endobj 1838 0 obj << /Title 1839 0 R /A 1837 0 R /Parent 1799 0 R /Prev 1835 0 R /Next 1841 0 R >> endobj 1835 0 obj << /Title 1836 0 R /A 1834 0 R /Parent 1799 0 R /Prev 1832 0 R /Next 1838 0 R >> endobj 1832 0 obj << /Title 1833 0 R /A 1831 0 R /Parent 1799 0 R /Prev 1826 0 R /Next 1835 0 R >> endobj 1829 0 obj << /Title 1830 0 R /A 1828 0 R /Parent 1826 0 R >> endobj 1826 0 obj << /Title 1827 0 R /A 1825 0 R /Parent 1799 0 R /Prev 1823 0 R /Next 1832 0 R /First 1829 0 R /Last 1829 0 R /Count -1 >> endobj 1823 0 obj << /Title 1824 0 R /A 1822 0 R /Parent 1799 0 R /Prev 1820 0 R /Next 1826 0 R >> endobj 1820 0 obj << /Title 1821 0 R /A 1819 0 R /Parent 1799 0 R /Prev 1817 0 R /Next 1823 0 R >> endobj 1817 0 obj << /Title 1818 0 R /A 1816 0 R /Parent 1799 0 R /Prev 1814 0 R /Next 1820 0 R >> endobj 1814 0 obj << /Title 1815 0 R /A 1813 0 R /Parent 1799 0 R /Prev 1811 0 R /Next 1817 0 R >> endobj 1811 0 obj << /Title 1812 0 R /A 1810 0 R /Parent 1799 0 R /Prev 1808 0 R /Next 1814 0 R >> endobj 1808 0 obj << /Title 1809 0 R /A 1807 0 R /Parent 1799 0 R /Prev 1805 0 R /Next 1811 0 R >> endobj 1805 0 obj << /Title 1806 0 R /A 1804 0 R /Parent 1799 0 R /Prev 1802 0 R /Next 1808 0 R >> endobj 1802 0 obj << /Title 1803 0 R /A 1801 0 R /Parent 1799 0 R /Next 1805 0 R >> endobj 1799 0 obj << /Title 1800 0 R /A 1798 0 R /Parent 1760 0 R /Prev 1763 0 R /Next 1847 0 R /First 1802 0 R /Last 1844 0 R /Count -14 >> endobj 1796 0 obj << /Title 1797 0 R /A 1795 0 R /Parent 1763 0 R /Prev 1793 0 R >> endobj 1793 0 obj << /Title 1794 0 R /A 1792 0 R /Parent 1763 0 R /Prev 1790 0 R /Next 1796 0 R >> endobj 1790 0 obj << /Title 1791 0 R /A 1789 0 R /Parent 1763 0 R /Prev 1787 0 R /Next 1793 0 R >> endobj 1787 0 obj << /Title 1788 0 R /A 1786 0 R /Parent 1763 0 R /Prev 1784 0 R /Next 1790 0 R >> endobj 1784 0 obj << /Title 1785 0 R /A 1783 0 R /Parent 1763 0 R /Prev 1781 0 R /Next 1787 0 R >> endobj 1781 0 obj << /Title 1782 0 R /A 1780 0 R /Parent 1763 0 R /Prev 1778 0 R /Next 1784 0 R >> endobj 1778 0 obj << /Title 1779 0 R /A 1777 0 R /Parent 1763 0 R /Prev 1775 0 R /Next 1781 0 R >> endobj 1775 0 obj << /Title 1776 0 R /A 1774 0 R /Parent 1763 0 R /Prev 1772 0 R /Next 1778 0 R >> endobj 1772 0 obj << /Title 1773 0 R /A 1771 0 R /Parent 1763 0 R /Prev 1769 0 R /Next 1775 0 R >> endobj 1769 0 obj << /Title 1770 0 R /A 1768 0 R /Parent 1763 0 R /Prev 1766 0 R /Next 1772 0 R >> endobj 1766 0 obj << /Title 1767 0 R /A 1765 0 R /Parent 1763 0 R /Next 1769 0 R >> endobj 1763 0 obj << /Title 1764 0 R /A 1762 0 R /Parent 1760 0 R /Next 1799 0 R /First 1766 0 R /Last 1796 0 R /Count -11 >> endobj 1760 0 obj << /Title 1761 0 R /A 1759 0 R /Parent 2474 0 R /Prev 1715 0 R /Next 1868 0 R /First 1763 0 R /Last 1847 0 R /Count -3 >> endobj 1757 0 obj << /Title 1758 0 R /A 1756 0 R /Parent 1715 0 R /Prev 1754 0 R >> endobj 1754 0 obj << /Title 1755 0 R /A 1753 0 R /Parent 1715 0 R /Prev 1751 0 R /Next 1757 0 R >> endobj 1751 0 obj << /Title 1752 0 R /A 1750 0 R /Parent 1715 0 R /Prev 1748 0 R /Next 1754 0 R >> endobj 1748 0 obj << /Title 1749 0 R /A 1747 0 R /Parent 1715 0 R /Prev 1736 0 R /Next 1751 0 R >> endobj 1745 0 obj << /Title 1746 0 R /A 1744 0 R /Parent 1736 0 R /Prev 1742 0 R >> endobj 1742 0 obj << /Title 1743 0 R /A 1741 0 R /Parent 1736 0 R /Prev 1739 0 R /Next 1745 0 R >> endobj 1739 0 obj << /Title 1740 0 R /A 1738 0 R /Parent 1736 0 R /Next 1742 0 R >> endobj 1736 0 obj << /Title 1737 0 R /A 1735 0 R /Parent 1715 0 R /Prev 1730 0 R /Next 1748 0 R /First 1739 0 R /Last 1745 0 R /Count -3 >> endobj 1733 0 obj << /Title 1734 0 R /A 1732 0 R /Parent 1730 0 R >> endobj 1730 0 obj << /Title 1731 0 R /A 1729 0 R /Parent 1715 0 R /Prev 1727 0 R /Next 1736 0 R /First 1733 0 R /Last 1733 0 R /Count -1 >> endobj 1727 0 obj << /Title 1728 0 R /A 1726 0 R /Parent 1715 0 R /Prev 1724 0 R /Next 1730 0 R >> endobj 1724 0 obj << /Title 1725 0 R /A 1723 0 R /Parent 1715 0 R /Prev 1721 0 R /Next 1727 0 R >> endobj 1721 0 obj << /Title 1722 0 R /A 1720 0 R /Parent 1715 0 R /Prev 1718 0 R /Next 1724 0 R >> endobj 1718 0 obj << /Title 1719 0 R /A 1717 0 R /Parent 1715 0 R /Next 1721 0 R >> endobj 1715 0 obj << /Title 1716 0 R /A 1714 0 R /Parent 2474 0 R /Prev 1712 0 R /Next 1760 0 R /First 1718 0 R /Last 1757 0 R /Count -10 >> endobj 1712 0 obj << /Title 1713 0 R /A 1711 0 R /Parent 2474 0 R /Prev 1709 0 R /Next 1715 0 R >> endobj 1709 0 obj << /Title 1710 0 R /A 1708 0 R /Parent 2474 0 R /Prev 1706 0 R /Next 1712 0 R >> endobj 1706 0 obj << /Title 1707 0 R /A 1705 0 R /Parent 2474 0 R /Prev 1703 0 R /Next 1709 0 R >> endobj 1703 0 obj << /Title 1704 0 R /A 1702 0 R /Parent 2474 0 R /Prev 1697 0 R /Next 1706 0 R >> endobj 1700 0 obj << /Title 1701 0 R /A 1699 0 R /Parent 1697 0 R >> endobj 1697 0 obj << /Title 1698 0 R /A 1696 0 R /Parent 2474 0 R /Prev 1685 0 R /Next 1703 0 R /First 1700 0 R /Last 1700 0 R /Count -1 >> endobj 1694 0 obj << /Title 1695 0 R /A 1693 0 R /Parent 1685 0 R /Prev 1691 0 R >> endobj 1691 0 obj << /Title 1692 0 R /A 1690 0 R /Parent 1685 0 R /Prev 1688 0 R /Next 1694 0 R >> endobj 1688 0 obj << /Title 1689 0 R /A 1687 0 R /Parent 1685 0 R /Next 1691 0 R >> endobj 1685 0 obj << /Title 1686 0 R /A 1684 0 R /Parent 2474 0 R /Prev 1682 0 R /Next 1697 0 R /First 1688 0 R /Last 1694 0 R /Count -3 >> endobj 1682 0 obj << /Title 1683 0 R /A 1681 0 R /Parent 2474 0 R /Prev 1679 0 R /Next 1685 0 R >> endobj 1679 0 obj << /Title 1680 0 R /A 1678 0 R /Parent 2474 0 R /Prev 1676 0 R /Next 1682 0 R >> endobj 1676 0 obj << /Title 1677 0 R /A 1675 0 R /Parent 2474 0 R /Next 1679 0 R >> endobj 2475 0 obj << /Names [(-1) 1396 0 R (-2) 1435 0 R (-3) 1476 0 R (-4) 1524 0 R (-5) 1576 0 R (-6) 1628 0 R (-7) 1672 0 R (10) 69 0 R (100) 769 0 R (101) 773 0 R (102) 777 0 R (103) 782 0 R (104) 789 0 R (105) 793 0 R (106) 801 0 R (107) 805 0 R (108) 809 0 R (109) 814 0 R (11) 73 0 R (110) 824 0 R (111) 828 0 R (112) 834 0 R (113) 838 0 R (114) 854 0 R (115) 866 0 R (116) 884 0 R (117) 900 0 R (118) 913 0 R (119) 926 0 R (12) 77 0 R (120) 936 0 R (121) 957 0 R (122) 967 0 R (123) 976 0 R (124) 987 0 R (125) 995 0 R (126) 1003 0 R (127) 1013 0 R (128) 1020 0 R (129) 1031 0 R (13) 82 0 R (130) 1046 0 R (131) 1057 0 R (132) 1065 0 R (133) 1073 0 R (134) 1078 0 R (135) 1087 0 R (136) 1101 0 R (137) 1106 0 R (138) 1119 0 R (139) 1129 0 R (14) 86 0 R (140) 1136 0 R (141) 1141 0 R (142) 1147 0 R (143) 1153 0 R (144) 1158 0 R (145) 1165 0 R (146) 1172 0 R (147) 1182 0 R (148) 1186 0 R (149) 1191 0 R (15) 93 0 R (150) 1197 0 R (151) 1202 0 R (152) 1211 0 R (153) 1218 0 R (154) 1296 0 R (155) 1385 0 R (156) 2416 0 R (16) 100 0 R (17) 108 0 R (18) 113 0 R (19) 127 0 R (2) 23 0 R (20) 140 0 R (21) 154 0 R (22) 165 0 R (23) 177 0 R (24) 188 0 R (25) 195 0 R (26) 199 0 R (27) 211 0 R (28) 229 0 R (29) 235 0 R (3) 35 0 R (30) 255 0 R (31) 261 0 R (32) 272 0 R (33) 292 0 R (34) 300 0 R (35) 306 0 R (36) 310 0 R (37) 323 0 R (38) 335 0 R (39) 340 0 R (4) 41 0 R (40) 350 0 R (41) 361 0 R (42) 371 0 R (43) 382 0 R (44) 387 0 R (45) 396 0 R (46) 402 0 R (47) 407 0 R (48) 416 0 R (49) 422 0 R (5) 48 0 R (50) 427 0 R (51) 431 0 R (52) 435 0 R (53) 439 0 R (54) 451 0 R (55) 463 0 R (56) 478 0 R (57) 486 0 R (58) 501 0 R (59) 505 0 R (6) 52 0 R (60) 509 0 R (61) 518 0 R (62) 526 0 R (63) 531 0 R (64) 538 0 R (65) 544 0 R (66) 549 0 R (67) 554 0 R (68) 558 0 R (69) 565 0 R (7) 57 0 R (70) 571 0 R (71) 581 0 R (72) 589 0 R (73) 597 0 R (74) 603 0 R (75) 608 0 R (76) 616 0 R (77) 630 0 R (78) 634 0 R (79) 639 0 R (8) 61 0 R (80) 643 0 R (81) 648 0 R (82) 654 0 R (83) 658 0 R (84) 662 0 R (85) 668 0 R (86) 673 0 R (87) 680 0 R (88) 697 0 R (89) 706 0 R (9) 65 0 R (90) 710 0 R (91) 715 0 R (92) 726 0 R (93) 733 0 R (94) 737 0 R (95) 741 0 R (96) 745 0 R (97) 757 0 R (98) 761 0 R (99) 765 0 R (Appearance) 325 0 R (Appearance Panel) 326 0 R (Appearances) 376 0 R (Argument Conventions) 830 0 R (Authors) 96 0 R (BBOX) 540 0 R (BBP and BEZ) 545 0 R (Basic Interaction) 230 0 R (Binary format) 447 0 R (COMMENT) 474 0 R (Cameras) 243 0 R (Chunks) 1167 0 R (Command Line Options) 204 0 R (Commands) 296 0 R (Common syntax) 442 0 R (Contributing) 104 0 R (Conventions) 441 0 R (Copying) 31 0 R (Customization) 681 0 R (DISCGRP) 610 0 R (Distrib) 36 0 R (Example1) 701 0 R (Example2) 727 0 R (Example3) 749 0 R (Example4) 797 0 R (File names) 445 0 R (Forms) 729 0 R (Function Index) 1219 0 R (GCL) 207 0 R (GCL Reference) 839 0 R (GROUP) 609 0 R (Geomview.m) 1148 0 R (History) 94 0 R (INST) 582 0 R (INST Examples) 598 0 R (Installation) 1178 0 R (Interaction) 200 0 R (Interface) 698 0 R (Intro) 24 0 R (Keyboard Shortcuts) 423 0 R (LIST) 599 0 R (Lighting Panel) 362 0 R (List of Figures) 2417 0 R (Loading) 256 0 R (MESH) 534 0 R (Materials Panel) 351 0 R (Mathematica) 1142 0 R (Module Installation) 702 0 R (Modules) 245 0 R (Mouse Motions) 244 0 R (ND Transformation matrices) 465 0 R (ND-Vertices) 452 0 R (ND-axes) 989 0 R (ND-color) 990 0 R (ND-xform) 991 0 R (ND-xform-get) 996 0 R (ND-xform-set) 997 0 R (NeXT) 1005 0 R (Networked Geomview) 1160 0 R (Non-Euclidean Geometry) 246 0 R (Non-geometric objects) 617 0 R (OFF) 473 0 R (OOGL File Formats) 440 0 R (OOGL.m) 1143 0 R (Object File Formats) 532 0 R (Overview) 114 0 R (Package Details) 1173 0 R (Package Installation) 1174 0 R (Platforms) 101 0 R (Point of Interest) 302 0 R (Private Module Installation) 815 0 R (Pronunciation) 109 0 R (QUAD) 472 0 R (References) 479 0 R (Remote Display) 1159 0 R (RenderMan) 1154 0 R (SKEL) 567 0 R (SPHERE) 573 0 R (Saving) 398 0 R (Source Code Installation) 1168 0 R (Starting Geomview) 201 0 R (Support) 1203 0 R (Surface normal directions) 458 0 R (System Module Installation) 820 0 R (TLIST) 604 0 R (Texture Mapping) 497 0 R (Transformation matrices) 464 0 R (Tutorial) 128 0 R (Unix Binary Detail) 1192 0 R (Unix Binary Installation) 1187 0 R (VECT) 561 0 R (Vertices) 446 0 R (XForms) 746 0 R (all) 855 0 R (and) 856 0 R (ap-override) 857 0 R (appearance) 496 0 R (backcolor) 858 0 R (background-image) 859 0 R (bbox-color) 860 0 R (bbox-draw) 861 0 R (camera) 626 0 R (camera-draw) 869 0 R (camera-prop) 870 0 R (camera-reset) 871 0 R (car) 872 0 R (cdr) 873 0 R (clock) 874 0 R (command) 877 0 R (copy) 885 0 R (cursor-still) 886 0 R (cursor-twitch) 887 0 R (delete) 888 0 R (dice) 889 0 R (dimension) 891 0 R (dither) 892 0 R (draw) 893 0 R (dump-handles) 901 0 R (echo) 902 0 R (emodule-clear) 903 0 R (emodule-define) 220 0 R (emodule-defined) 905 0 R (emodule-isrunning) 906 0 R (emodule-path) 907 0 R (emodule-run) 850 0 R (emodule-sort) 917 0 R (emodule-start) 918 0 R (emodule-transmit) 919 0 R (eq) 843 0 R (escale) 920 0 R (event-keys) 921 0 R (event-mode) 922 0 R (event-pick) 927 0 R (evert) 928 0 R (exit) 929 0 R (ezoom) 930 0 R (figap) 336 0 R (figappearance) 166 0 R (figcamerapanel) 383 0 R (figcolorchooser) 168 0 R (figcolorchooserpanel) 341 0 R (figcommandpanel) 417 0 R (figfilespanel) 179 0 R (figinitial) 136 0 R (figloadpanel) 275 0 R (figlookatworld) 156 0 R (figmainpanel) 231 0 R (figmatpanel) 352 0 R (figmyfilelist) 262 0 R (figsavepanel) 403 0 R (figtools) 295 0 R (figtrefdodec) 191 0 R (freeze) 931 0 R (geometry) 218 0 R (geomview-version) 932 0 R (gt) 844 0 R (hdefine) 482 0 R (hdelete) 940 0 R (help) 785 0 R (hmodel) 947 0 R (hsphere-draw) 950 0 R (if) 951 0 R (image) 514 0 R (inhibit-warning) 958 0 R (input-translator) 959 0 R (interest) 960 0 R (lines-closer) 962 0 R (load) 281 0 R (load-path) 495 0 R (look) 969 0 R (look-encompass) 970 0 R (look-encompass-size) 972 0 R (look-recenter) 977 0 R (look-toward) 978 0 R (lt) 842 0 R (merge) 979 0 R (merge-ap) 378 0 R (merge-base-ap) 980 0 R (merge-baseap) 377 0 R (morehelp) 848 0 R (name-object) 988 0 R (new-alien) 998 0 R (new-camera) 878 0 R (new-center) 999 0 R (new-geometry) 282 0 R (new-reset) 1004 0 R (normalization) 1006 0 R (not) 1007 0 R (ntransform) 649 0 R (or) 1008 0 R (pick) 963 0 R (pick-invisible) 1014 0 R (pickable) 1015 0 R (position) 1016 0 R (position-at) 1021 0 R (position-toward) 1022 0 R (progn) 692 0 R (quit) 1023 0 R (quote) 1025 0 R (rawevent) 1026 0 R (rawpick) 1027 0 R (read) 283 0 R (real-id) 1035 0 R (redraw) 896 0 R (regtable) 1036 0 R (rehash-emodule-path) 1037 0 R (replace-geometry) 1041 0 R (rib-display) 1042 0 R (rib-snapshot) 1047 0 R (scale) 1049 0 R (scene) 1050 0 R (set-clock) 879 0 R (set-conformal-refine) 1053 0 R (set-emodule-path) 909 0 R (set-load-path) 280 0 R (set-motionscale) 1058 0 R (setenv) 1059 0 R (sgi) 1060 0 R (shell) 840 0 R (sleep-for) 1061 0 R (sleep-until) 880 0 R (snapshot) 1066 0 R (soft-shader) 1067 0 R (space) 953 0 R (stereowin) 1068 0 R (time-interests) 1074 0 R (transform) 644 0 R (transform-incr) 1079 0 R (transform-set) 1080 0 R (ui-cam-focus) 693 0 R (ui-center) 1082 0 R (ui-center-origin) 1083 0 R (ui-emotion-program) 1088 0 R (ui-emotion-run) 1091 0 R (ui-freeze) 1094 0 R (ui-html-browser) 1095 0 R (ui-motion) 314 0 R (ui-panel) 219 0 R (ui-pdf-viewer) 1102 0 R (ui-target) 1107 0 R (uninterest) 1108 0 R (update) 1110 0 R (update-draw) 1111 0 R (window) 669 0 R (winenter) 1115 0 R (write) 753 0 R (write-comments) 1121 0 R (write-handle) 1122 0 R (write-sexpr) 1123 0 R (xform) 1124 0 R (xform-incr) 1130 0 R (xform-set) 1131 0 R (zoom) 1132 0 R] /Limits [(-1) (zoom)] >> endobj 2476 0 obj << /Kids [2475 0 R] >> endobj 2477 0 obj << /Dests 2476 0 R >> endobj 2478 0 obj << /Type /Catalog /Pages 2473 0 R /Outlines 2474 0 R /Names 2477 0 R /PageMode /UseOutlines >> endobj 2479 0 obj << /Producer (pdfeTeX-1.30.5) /Creator (TeX) /CreationDate (D:20070823145633+02'00') /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.30.5-2.2 (Web2C 7.5.5) kpathsea version 3.5.5) >> endobj xref 0 2480 0000000000 65535 f 0000000869 00000 n 0000000764 00000 n 0000000015 00000 n 0000824732 00000 n 0000811284 00000 n 0000824572 00000 n 0000809573 00000 n 0000790733 00000 n 0000809414 00000 n 0000789204 00000 n 0000772432 00000 n 0000789042 00000 n 0000771803 00000 n 0000769969 00000 n 0000771641 00000 n 0000826126 00000 n 0000001354 00000 n 0000001246 00000 n 0000000972 00000 n 0000004105 00000 n 0000003376 00000 n 0000001423 00000 n 0000004003 00000 n 0000004054 00000 n 0000768835 00000 n 0000755763 00000 n 0000768673 00000 n 0000003517 00000 n 0000003658 00000 n 0000003814 00000 n 0000007387 00000 n 0000006545 00000 n 0000006158 00000 n 0000004209 00000 n 0000006443 00000 n 0000006494 00000 n 0000006285 00000 n 0000007438 00000 n 0000007228 00000 n 0000006649 00000 n 0000007336 00000 n 0000754317 00000 n 0000741616 00000 n 0000754156 00000 n 0000010431 00000 n 0000010272 00000 n 0000007530 00000 n 0000010380 00000 n 0000014267 00000 n 0000014108 00000 n 0000010523 00000 n 0000014216 00000 n 0000826236 00000 n 0000018136 00000 n 0000017977 00000 n 0000014348 00000 n 0000018085 00000 n 0000021963 00000 n 0000021804 00000 n 0000018228 00000 n 0000021912 00000 n 0000025918 00000 n 0000025759 00000 n 0000022032 00000 n 0000025867 00000 n 0000029767 00000 n 0000029608 00000 n 0000025999 00000 n 0000029716 00000 n 0000033494 00000 n 0000033335 00000 n 0000029848 00000 n 0000033443 00000 n 0000037488 00000 n 0000037329 00000 n 0000033563 00000 n 0000037437 00000 n 0000826347 00000 n 0000039515 00000 n 0000039356 00000 n 0000037580 00000 n 0000039464 00000 n 0000042265 00000 n 0000042106 00000 n 0000039607 00000 n 0000042214 00000 n 0000740336 00000 n 0000727865 00000 n 0000740172 00000 n 0000046434 00000 n 0000045991 00000 n 0000042381 00000 n 0000046276 00000 n 0000046327 00000 n 0000046118 00000 n 0000046378 00000 n 0000048044 00000 n 0000047521 00000 n 0000046526 00000 n 0000047940 00000 n 0000047992 00000 n 0000047657 00000 n 0000047799 00000 n 0000568857 00000 n 0000049145 00000 n 0000048928 00000 n 0000048124 00000 n 0000049039 00000 n 0000049092 00000 n 0000052786 00000 n 0000052568 00000 n 0000049226 00000 n 0000052680 00000 n 0000052733 00000 n 0000726732 00000 n 0000711386 00000 n 0000726568 00000 n 0000826459 00000 n 0000052892 00000 n 0000053314 00000 n 0000053493 00000 n 0000053540 00000 n 0000075305 00000 n 0000078060 00000 n 0000077619 00000 n 0000075325 00000 n 0000077896 00000 n 0000077949 00000 n 0000711011 00000 n 0000709404 00000 n 0000710847 00000 n 0000708830 00000 n 0000705646 00000 n 0000708668 00000 n 0000077751 00000 n 0000078002 00000 n 0000082250 00000 n 0000082085 00000 n 0000078219 00000 n 0000082197 00000 n 0000082345 00000 n 0000082750 00000 n 0000082927 00000 n 0000082974 00000 n 0000087591 00000 n 0000087611 00000 n 0000088024 00000 n 0000088201 00000 n 0000088248 00000 n 0000094387 00000 n 0000096205 00000 n 0000095814 00000 n 0000094407 00000 n 0000096094 00000 n 0000095946 00000 n 0000096147 00000 n 0000096328 00000 n 0000096739 00000 n 0000096918 00000 n 0000096965 00000 n 0000100145 00000 n 0000102425 00000 n 0000101975 00000 n 0000100165 00000 n 0000102256 00000 n 0000102309 00000 n 0000102107 00000 n 0000102367 00000 n 0000102561 00000 n 0000102988 00000 n 0000103165 00000 n 0000103212 00000 n 0000109441 00000 n 0000113513 00000 n 0000113181 00000 n 0000109461 00000 n 0000113460 00000 n 0000113313 00000 n 0000122067 00000 n 0000113620 00000 n 0000114045 00000 n 0000114222 00000 n 0000114269 00000 n 0000120508 00000 n 0000122125 00000 n 0000121735 00000 n 0000120528 00000 n 0000122014 00000 n 0000121867 00000 n 0000826577 00000 n 0000122713 00000 n 0000122771 00000 n 0000122548 00000 n 0000122248 00000 n 0000122660 00000 n 0000127609 00000 n 0000126668 00000 n 0000122869 00000 n 0000127387 00000 n 0000127440 00000 n 0000127493 00000 n 0000126824 00000 n 0000126974 00000 n 0000127551 00000 n 0000127123 00000 n 0000127256 00000 n 0000437179 00000 n 0000131553 00000 n 0000130919 00000 n 0000127751 00000 n 0000131500 00000 n 0000704477 00000 n 0000695146 00000 n 0000704314 00000 n 0000131067 00000 n 0000131210 00000 n 0000131353 00000 n 0000460423 00000 n 0000518894 00000 n 0000454837 00000 n 0000131672 00000 n 0000132087 00000 n 0000132266 00000 n 0000132313 00000 n 0000139436 00000 n 0000142569 00000 n 0000142288 00000 n 0000139456 00000 n 0000142400 00000 n 0000142453 00000 n 0000142511 00000 n 0000148024 00000 n 0000146793 00000 n 0000142727 00000 n 0000147971 00000 n 0000146973 00000 n 0000147110 00000 n 0000147246 00000 n 0000147388 00000 n 0000147530 00000 n 0000147671 00000 n 0000147822 00000 n 0000232396 00000 n 0000167528 00000 n 0000377264 00000 n 0000530375 00000 n 0000148131 00000 n 0000148554 00000 n 0000148731 00000 n 0000148778 00000 n 0000154481 00000 n 0000157331 00000 n 0000157108 00000 n 0000154501 00000 n 0000157220 00000 n 0000157273 00000 n 0000826695 00000 n 0000159807 00000 n 0000159427 00000 n 0000157474 00000 n 0000159696 00000 n 0000159749 00000 n 0000159559 00000 n 0000159943 00000 n 0000160359 00000 n 0000160538 00000 n 0000160585 00000 n 0000162865 00000 n 0000167586 00000 n 0000166401 00000 n 0000162885 00000 n 0000167417 00000 n 0000166573 00000 n 0000166715 00000 n 0000167470 00000 n 0000166855 00000 n 0000166993 00000 n 0000167132 00000 n 0000167279 00000 n 0000501245 00000 n 0000472210 00000 n 0000482395 00000 n 0000490363 00000 n 0000167745 00000 n 0000168155 00000 n 0000168342 00000 n 0000168389 00000 n 0000175234 00000 n 0000178047 00000 n 0000177524 00000 n 0000175254 00000 n 0000177936 00000 n 0000177664 00000 n 0000177802 00000 n 0000177989 00000 n 0000258952 00000 n 0000182397 00000 n 0000182060 00000 n 0000178171 00000 n 0000182344 00000 n 0000182192 00000 n 0000189686 00000 n 0000185622 00000 n 0000185457 00000 n 0000182492 00000 n 0000185569 00000 n 0000189744 00000 n 0000189216 00000 n 0000185717 00000 n 0000189633 00000 n 0000189356 00000 n 0000189495 00000 n 0000826813 00000 n 0000516127 00000 n 0000189850 00000 n 0000190263 00000 n 0000190440 00000 n 0000190487 00000 n 0000196626 00000 n 0000200718 00000 n 0000200274 00000 n 0000196646 00000 n 0000200549 00000 n 0000200406 00000 n 0000200602 00000 n 0000200660 00000 n 0000200848 00000 n 0000201259 00000 n 0000201438 00000 n 0000201485 00000 n 0000204665 00000 n 0000206572 00000 n 0000206349 00000 n 0000204685 00000 n 0000206461 00000 n 0000206514 00000 n 0000209480 00000 n 0000209257 00000 n 0000206684 00000 n 0000209369 00000 n 0000209422 00000 n 0000209592 00000 n 0000210007 00000 n 0000210184 00000 n 0000210231 00000 n 0000213359 00000 n 0000216141 00000 n 0000215860 00000 n 0000213379 00000 n 0000215972 00000 n 0000216025 00000 n 0000216083 00000 n 0000216276 00000 n 0000216692 00000 n 0000216871 00000 n 0000216918 00000 n 0000220245 00000 n 0000222663 00000 n 0000222440 00000 n 0000220265 00000 n 0000222552 00000 n 0000222605 00000 n 0000222786 00000 n 0000223201 00000 n 0000223378 00000 n 0000223425 00000 n 0000229213 00000 n 0000232454 00000 n 0000231765 00000 n 0000229233 00000 n 0000232343 00000 n 0000231913 00000 n 0000232059 00000 n 0000232206 00000 n 0000826931 00000 n 0000287437 00000 n 0000475611 00000 n 0000475495 00000 n 0000234669 00000 n 0000234446 00000 n 0000232560 00000 n 0000234558 00000 n 0000234611 00000 n 0000238056 00000 n 0000237891 00000 n 0000234817 00000 n 0000238003 00000 n 0000238139 00000 n 0000238559 00000 n 0000238736 00000 n 0000238783 00000 n 0000245043 00000 n 0000247553 00000 n 0000247155 00000 n 0000245063 00000 n 0000247442 00000 n 0000247287 00000 n 0000247495 00000 n 0000249832 00000 n 0000249609 00000 n 0000247647 00000 n 0000249721 00000 n 0000249774 00000 n 0000253089 00000 n 0000252924 00000 n 0000249981 00000 n 0000253036 00000 n 0000253184 00000 n 0000253595 00000 n 0000253774 00000 n 0000253821 00000 n 0000256212 00000 n 0000259067 00000 n 0000258787 00000 n 0000256232 00000 n 0000258899 00000 n 0000259010 00000 n 0000827049 00000 n 0000262833 00000 n 0000262610 00000 n 0000259215 00000 n 0000262722 00000 n 0000262775 00000 n 0000264897 00000 n 0000264732 00000 n 0000262976 00000 n 0000264844 00000 n 0000266060 00000 n 0000265895 00000 n 0000264992 00000 n 0000266007 00000 n 0000267327 00000 n 0000267162 00000 n 0000266154 00000 n 0000267274 00000 n 0000270956 00000 n 0000270193 00000 n 0000267421 00000 n 0000270618 00000 n 0000270671 00000 n 0000270724 00000 n 0000270782 00000 n 0000270333 00000 n 0000270476 00000 n 0000270840 00000 n 0000270898 00000 n 0000279184 00000 n 0000274396 00000 n 0000273812 00000 n 0000271061 00000 n 0000274227 00000 n 0000274280 00000 n 0000694833 00000 n 0000692913 00000 n 0000694668 00000 n 0000273952 00000 n 0000274090 00000 n 0000274338 00000 n 0000827167 00000 n 0000279242 00000 n 0000277990 00000 n 0000274527 00000 n 0000279015 00000 n 0000279068 00000 n 0000279126 00000 n 0000278162 00000 n 0000278315 00000 n 0000278465 00000 n 0000278604 00000 n 0000278742 00000 n 0000278879 00000 n 0000302378 00000 n 0000311304 00000 n 0000341619 00000 n 0000282532 00000 n 0000282001 00000 n 0000279360 00000 n 0000282421 00000 n 0000282474 00000 n 0000282141 00000 n 0000282279 00000 n 0000460539 00000 n 0000287494 00000 n 0000286052 00000 n 0000282625 00000 n 0000287384 00000 n 0000286240 00000 n 0000286384 00000 n 0000286527 00000 n 0000286666 00000 n 0000286805 00000 n 0000286949 00000 n 0000287092 00000 n 0000287239 00000 n 0000472263 00000 n 0000345912 00000 n 0000294342 00000 n 0000289264 00000 n 0000289099 00000 n 0000287600 00000 n 0000289211 00000 n 0000290824 00000 n 0000290659 00000 n 0000289346 00000 n 0000290771 00000 n 0000294400 00000 n 0000293722 00000 n 0000290906 00000 n 0000294289 00000 n 0000293870 00000 n 0000294009 00000 n 0000294149 00000 n 0000827285 00000 n 0000345970 00000 n 0000297423 00000 n 0000296671 00000 n 0000294493 00000 n 0000297370 00000 n 0000296827 00000 n 0000296963 00000 n 0000297103 00000 n 0000297238 00000 n 0000299266 00000 n 0000298941 00000 n 0000297517 00000 n 0000299213 00000 n 0000299073 00000 n 0000302494 00000 n 0000301987 00000 n 0000299360 00000 n 0000302267 00000 n 0000302320 00000 n 0000302119 00000 n 0000302436 00000 n 0000305437 00000 n 0000305046 00000 n 0000302599 00000 n 0000305326 00000 n 0000305178 00000 n 0000305379 00000 n 0000308406 00000 n 0000308183 00000 n 0000305554 00000 n 0000308295 00000 n 0000308348 00000 n 0000311360 00000 n 0000311139 00000 n 0000308523 00000 n 0000311251 00000 n 0000827403 00000 n 0000314613 00000 n 0000314448 00000 n 0000311477 00000 n 0000314560 00000 n 0000317877 00000 n 0000317341 00000 n 0000314719 00000 n 0000317766 00000 n 0000317481 00000 n 0000317624 00000 n 0000317819 00000 n 0000321518 00000 n 0000321128 00000 n 0000318007 00000 n 0000321408 00000 n 0000321260 00000 n 0000321461 00000 n 0000325579 00000 n 0000324550 00000 n 0000321648 00000 n 0000325468 00000 n 0000324714 00000 n 0000325521 00000 n 0000324862 00000 n 0000325014 00000 n 0000325165 00000 n 0000325317 00000 n 0000329503 00000 n 0000328803 00000 n 0000325709 00000 n 0000329392 00000 n 0000329445 00000 n 0000328951 00000 n 0000329096 00000 n 0000329254 00000 n 0000333613 00000 n 0000332987 00000 n 0000329620 00000 n 0000333560 00000 n 0000333135 00000 n 0000333296 00000 n 0000333429 00000 n 0000827521 00000 n 0000335442 00000 n 0000335161 00000 n 0000333732 00000 n 0000335273 00000 n 0000335326 00000 n 0000335384 00000 n 0000338352 00000 n 0000338129 00000 n 0000335535 00000 n 0000338241 00000 n 0000338294 00000 n 0000341677 00000 n 0000341028 00000 n 0000338469 00000 n 0000341455 00000 n 0000341508 00000 n 0000341561 00000 n 0000341168 00000 n 0000341307 00000 n 0000346028 00000 n 0000344493 00000 n 0000341794 00000 n 0000345806 00000 n 0000345859 00000 n 0000344681 00000 n 0000344819 00000 n 0000344958 00000 n 0000345102 00000 n 0000345248 00000 n 0000345392 00000 n 0000345536 00000 n 0000345672 00000 n 0000364162 00000 n 0000348675 00000 n 0000348510 00000 n 0000346147 00000 n 0000348622 00000 n 0000351419 00000 n 0000351254 00000 n 0000348782 00000 n 0000351366 00000 n 0000827639 00000 n 0000353795 00000 n 0000353630 00000 n 0000351513 00000 n 0000353742 00000 n 0000356571 00000 n 0000356348 00000 n 0000353890 00000 n 0000356460 00000 n 0000356513 00000 n 0000359419 00000 n 0000359038 00000 n 0000356677 00000 n 0000359308 00000 n 0000359361 00000 n 0000359170 00000 n 0000361356 00000 n 0000361191 00000 n 0000359524 00000 n 0000361303 00000 n 0000364220 00000 n 0000363997 00000 n 0000361475 00000 n 0000364109 00000 n 0000366440 00000 n 0000366115 00000 n 0000364326 00000 n 0000366387 00000 n 0000366247 00000 n 0000827757 00000 n 0000368011 00000 n 0000367788 00000 n 0000366522 00000 n 0000367900 00000 n 0000367953 00000 n 0000369442 00000 n 0000368830 00000 n 0000368104 00000 n 0000369389 00000 n 0000368978 00000 n 0000369113 00000 n 0000369247 00000 n 0000373426 00000 n 0000372177 00000 n 0000369524 00000 n 0000373320 00000 n 0000373373 00000 n 0000692221 00000 n 0000688901 00000 n 0000692057 00000 n 0000372357 00000 n 0000372495 00000 n 0000372633 00000 n 0000372768 00000 n 0000372901 00000 n 0000373033 00000 n 0000373173 00000 n 0000490065 00000 n 0000511771 00000 n 0000377433 00000 n 0000376774 00000 n 0000373532 00000 n 0000377211 00000 n 0000377317 00000 n 0000376914 00000 n 0000377063 00000 n 0000377375 00000 n 0000431727 00000 n 0000379385 00000 n 0000379220 00000 n 0000377539 00000 n 0000379332 00000 n 0000380923 00000 n 0000380758 00000 n 0000379480 00000 n 0000380870 00000 n 0000827875 00000 n 0000385850 00000 n 0000384632 00000 n 0000381005 00000 n 0000385797 00000 n 0000384812 00000 n 0000384964 00000 n 0000385102 00000 n 0000385239 00000 n 0000385377 00000 n 0000385516 00000 n 0000385658 00000 n 0000389227 00000 n 0000388844 00000 n 0000385945 00000 n 0000389116 00000 n 0000389169 00000 n 0000388976 00000 n 0000678356 00000 n 0000390559 00000 n 0000390394 00000 n 0000389357 00000 n 0000390506 00000 n 0000391864 00000 n 0000391699 00000 n 0000390641 00000 n 0000391811 00000 n 0000394454 00000 n 0000394289 00000 n 0000391946 00000 n 0000394401 00000 n 0000399367 00000 n 0000398442 00000 n 0000394549 00000 n 0000399198 00000 n 0000399251 00000 n 0000398598 00000 n 0000398763 00000 n 0000399309 00000 n 0000398930 00000 n 0000399064 00000 n 0000827993 00000 n 0000522683 00000 n 0000402290 00000 n 0000402125 00000 n 0000399473 00000 n 0000402237 00000 n 0000403350 00000 n 0000403185 00000 n 0000402385 00000 n 0000403297 00000 n 0000404923 00000 n 0000404758 00000 n 0000403432 00000 n 0000404870 00000 n 0000406583 00000 n 0000406418 00000 n 0000405005 00000 n 0000406530 00000 n 0000407650 00000 n 0000407485 00000 n 0000406665 00000 n 0000407597 00000 n 0000411015 00000 n 0000410850 00000 n 0000407732 00000 n 0000410962 00000 n 0000828111 00000 n 0000415620 00000 n 0000415151 00000 n 0000411097 00000 n 0000415567 00000 n 0000415291 00000 n 0000415429 00000 n 0000442843 00000 n 0000419290 00000 n 0000419125 00000 n 0000415726 00000 n 0000419237 00000 n 0000423689 00000 n 0000422999 00000 n 0000419384 00000 n 0000423578 00000 n 0000423147 00000 n 0000423294 00000 n 0000423440 00000 n 0000423631 00000 n 0000425248 00000 n 0000425083 00000 n 0000423795 00000 n 0000425195 00000 n 0000426583 00000 n 0000426418 00000 n 0000425330 00000 n 0000426530 00000 n 0000427798 00000 n 0000427633 00000 n 0000426665 00000 n 0000427745 00000 n 0000828229 00000 n 0000431901 00000 n 0000430949 00000 n 0000427880 00000 n 0000431674 00000 n 0000431785 00000 n 0000431105 00000 n 0000431254 00000 n 0000431395 00000 n 0000431536 00000 n 0000431843 00000 n 0000432992 00000 n 0000432827 00000 n 0000432019 00000 n 0000432939 00000 n 0000437290 00000 n 0000436848 00000 n 0000433087 00000 n 0000437126 00000 n 0000436980 00000 n 0000437232 00000 n 0000439853 00000 n 0000439688 00000 n 0000437445 00000 n 0000439800 00000 n 0000443017 00000 n 0000441646 00000 n 0000439959 00000 n 0000442501 00000 n 0000442554 00000 n 0000442612 00000 n 0000441810 00000 n 0000442670 00000 n 0000442728 00000 n 0000442785 00000 n 0000441950 00000 n 0000442092 00000 n 0000442226 00000 n 0000442901 00000 n 0000442359 00000 n 0000442959 00000 n 0000445608 00000 n 0000445046 00000 n 0000443135 00000 n 0000445158 00000 n 0000445211 00000 n 0000445264 00000 n 0000445322 00000 n 0000445380 00000 n 0000445438 00000 n 0000445495 00000 n 0000445551 00000 n 0000828347 00000 n 0000448948 00000 n 0000447766 00000 n 0000445701 00000 n 0000448491 00000 n 0000447922 00000 n 0000448062 00000 n 0000448544 00000 n 0000448602 00000 n 0000448660 00000 n 0000448718 00000 n 0000448776 00000 n 0000448833 00000 n 0000448201 00000 n 0000448345 00000 n 0000448890 00000 n 0000482279 00000 n 0000498332 00000 n 0000501537 00000 n 0000451929 00000 n 0000450858 00000 n 0000449053 00000 n 0000451418 00000 n 0000451471 00000 n 0000451524 00000 n 0000451582 00000 n 0000451640 00000 n 0000451697 00000 n 0000451006 00000 n 0000451755 00000 n 0000451813 00000 n 0000451871 00000 n 0000451150 00000 n 0000451285 00000 n 0000494311 00000 n 0000455069 00000 n 0000454178 00000 n 0000452034 00000 n 0000454615 00000 n 0000454668 00000 n 0000454721 00000 n 0000454779 00000 n 0000454318 00000 n 0000454895 00000 n 0000454953 00000 n 0000455011 00000 n 0000454464 00000 n 0000498450 00000 n 0000458374 00000 n 0000457391 00000 n 0000455162 00000 n 0000457973 00000 n 0000457539 00000 n 0000457688 00000 n 0000457831 00000 n 0000458026 00000 n 0000458084 00000 n 0000458142 00000 n 0000458200 00000 n 0000458258 00000 n 0000458316 00000 n 0000460597 00000 n 0000459971 00000 n 0000458467 00000 n 0000460083 00000 n 0000460136 00000 n 0000460193 00000 n 0000460251 00000 n 0000460308 00000 n 0000460365 00000 n 0000460481 00000 n 0000465482 00000 n 0000463470 00000 n 0000460690 00000 n 0000465197 00000 n 0000463682 00000 n 0000463827 00000 n 0000463966 00000 n 0000465250 00000 n 0000464108 00000 n 0000464246 00000 n 0000464384 00000 n 0000464522 00000 n 0000464658 00000 n 0000464794 00000 n 0000465308 00000 n 0000464928 00000 n 0000465063 00000 n 0000465366 00000 n 0000465424 00000 n 0000828465 00000 n 0000505146 00000 n 0000469149 00000 n 0000468600 00000 n 0000465587 00000 n 0000468871 00000 n 0000468924 00000 n 0000468977 00000 n 0000469035 00000 n 0000468732 00000 n 0000469091 00000 n 0000485259 00000 n 0000472495 00000 n 0000471717 00000 n 0000469254 00000 n 0000472157 00000 n 0000471857 00000 n 0000472321 00000 n 0000472379 00000 n 0000472005 00000 n 0000472437 00000 n 0000475668 00000 n 0000474715 00000 n 0000472588 00000 n 0000475274 00000 n 0000475327 00000 n 0000475380 00000 n 0000475437 00000 n 0000475553 00000 n 0000474863 00000 n 0000475010 00000 n 0000475143 00000 n 0000479318 00000 n 0000478927 00000 n 0000475761 00000 n 0000479039 00000 n 0000479092 00000 n 0000479145 00000 n 0000479203 00000 n 0000479261 00000 n 0000482452 00000 n 0000481940 00000 n 0000479424 00000 n 0000482052 00000 n 0000482105 00000 n 0000482163 00000 n 0000482221 00000 n 0000482337 00000 n 0000485318 00000 n 0000484788 00000 n 0000482557 00000 n 0000484904 00000 n 0000484959 00000 n 0000485019 00000 n 0000485079 00000 n 0000485139 00000 n 0000485199 00000 n 0000828583 00000 n 0000487544 00000 n 0000487193 00000 n 0000485412 00000 n 0000487309 00000 n 0000487364 00000 n 0000487424 00000 n 0000487484 00000 n 0000490422 00000 n 0000489620 00000 n 0000487650 00000 n 0000489895 00000 n 0000489950 00000 n 0000490005 00000 n 0000490124 00000 n 0000489757 00000 n 0000490184 00000 n 0000490244 00000 n 0000490304 00000 n 0000494610 00000 n 0000493147 00000 n 0000490516 00000 n 0000494196 00000 n 0000493329 00000 n 0000493474 00000 n 0000493616 00000 n 0000494251 00000 n 0000494370 00000 n 0000494430 00000 n 0000493759 00000 n 0000493907 00000 n 0000494052 00000 n 0000494490 00000 n 0000494550 00000 n 0000498509 00000 n 0000497513 00000 n 0000494704 00000 n 0000498102 00000 n 0000498157 00000 n 0000497668 00000 n 0000498212 00000 n 0000498272 00000 n 0000497814 00000 n 0000497961 00000 n 0000498390 00000 n 0000501596 00000 n 0000501074 00000 n 0000498615 00000 n 0000501190 00000 n 0000501299 00000 n 0000501358 00000 n 0000501418 00000 n 0000501477 00000 n 0000505265 00000 n 0000504860 00000 n 0000501702 00000 n 0000504976 00000 n 0000505031 00000 n 0000505086 00000 n 0000505205 00000 n 0000828708 00000 n 0000508851 00000 n 0000508625 00000 n 0000505371 00000 n 0000508741 00000 n 0000508796 00000 n 0000511950 00000 n 0000511315 00000 n 0000508957 00000 n 0000511601 00000 n 0000511656 00000 n 0000511711 00000 n 0000511452 00000 n 0000511830 00000 n 0000511890 00000 n 0000516186 00000 n 0000514789 00000 n 0000512044 00000 n 0000515833 00000 n 0000515888 00000 n 0000514971 00000 n 0000515116 00000 n 0000515948 00000 n 0000515260 00000 n 0000515403 00000 n 0000516008 00000 n 0000516067 00000 n 0000515546 00000 n 0000515690 00000 n 0000519013 00000 n 0000518723 00000 n 0000516305 00000 n 0000518839 00000 n 0000518953 00000 n 0000522742 00000 n 0000521603 00000 n 0000519119 00000 n 0000522333 00000 n 0000522388 00000 n 0000522443 00000 n 0000521767 00000 n 0000522503 00000 n 0000522563 00000 n 0000521911 00000 n 0000522052 00000 n 0000522193 00000 n 0000522623 00000 n 0000525956 00000 n 0000525383 00000 n 0000522836 00000 n 0000525663 00000 n 0000525520 00000 n 0000525718 00000 n 0000525778 00000 n 0000525838 00000 n 0000525897 00000 n 0000828833 00000 n 0000527200 00000 n 0000526854 00000 n 0000526062 00000 n 0000526970 00000 n 0000527025 00000 n 0000527080 00000 n 0000527140 00000 n 0000530429 00000 n 0000530027 00000 n 0000527294 00000 n 0000530320 00000 n 0000530164 00000 n 0000533386 00000 n 0000533100 00000 n 0000530536 00000 n 0000533216 00000 n 0000533271 00000 n 0000533326 00000 n 0000535942 00000 n 0000535548 00000 n 0000533504 00000 n 0000535827 00000 n 0000535882 00000 n 0000535685 00000 n 0000538519 00000 n 0000538288 00000 n 0000536036 00000 n 0000538404 00000 n 0000538459 00000 n 0000542424 00000 n 0000542133 00000 n 0000538650 00000 n 0000542249 00000 n 0000542304 00000 n 0000542364 00000 n 0000828958 00000 n 0000545888 00000 n 0000545476 00000 n 0000542555 00000 n 0000545773 00000 n 0000545613 00000 n 0000545828 00000 n 0000560607 00000 n 0000550319 00000 n 0000549562 00000 n 0000546006 00000 n 0000550144 00000 n 0000550199 00000 n 0000550259 00000 n 0000549717 00000 n 0000549860 00000 n 0000550002 00000 n 0000556476 00000 n 0000552924 00000 n 0000552753 00000 n 0000550439 00000 n 0000552869 00000 n 0000556591 00000 n 0000556305 00000 n 0000553007 00000 n 0000556421 00000 n 0000556531 00000 n 0000560667 00000 n 0000560204 00000 n 0000556685 00000 n 0000560497 00000 n 0000560552 00000 n 0000560341 00000 n 0000563774 00000 n 0000563603 00000 n 0000560774 00000 n 0000563719 00000 n 0000829083 00000 n 0000566246 00000 n 0000565269 00000 n 0000563857 00000 n 0000566136 00000 n 0000566191 00000 n 0000565433 00000 n 0000565593 00000 n 0000565781 00000 n 0000565978 00000 n 0000568911 00000 n 0000568135 00000 n 0000566340 00000 n 0000568802 00000 n 0000568290 00000 n 0000568487 00000 n 0000568642 00000 n 0000582077 00000 n 0000572112 00000 n 0000569018 00000 n 0000581967 00000 n 0000582022 00000 n 0000688579 00000 n 0000686762 00000 n 0000688415 00000 n 0000572843 00000 n 0000686288 00000 n 0000682660 00000 n 0000686125 00000 n 0000572982 00000 n 0000573121 00000 n 0000573260 00000 n 0000573399 00000 n 0000573538 00000 n 0000573677 00000 n 0000573816 00000 n 0000573955 00000 n 0000574094 00000 n 0000574233 00000 n 0000574372 00000 n 0000574511 00000 n 0000574650 00000 n 0000574789 00000 n 0000574928 00000 n 0000575067 00000 n 0000575206 00000 n 0000575345 00000 n 0000575484 00000 n 0000575623 00000 n 0000575762 00000 n 0000575901 00000 n 0000576040 00000 n 0000576179 00000 n 0000576318 00000 n 0000576457 00000 n 0000576596 00000 n 0000576735 00000 n 0000576873 00000 n 0000577010 00000 n 0000577147 00000 n 0000577280 00000 n 0000577414 00000 n 0000577547 00000 n 0000577681 00000 n 0000577815 00000 n 0000577949 00000 n 0000578082 00000 n 0000578216 00000 n 0000578350 00000 n 0000578484 00000 n 0000578618 00000 n 0000578751 00000 n 0000578890 00000 n 0000579024 00000 n 0000579157 00000 n 0000579291 00000 n 0000579424 00000 n 0000579558 00000 n 0000579692 00000 n 0000579826 00000 n 0000579960 00000 n 0000580094 00000 n 0000580228 00000 n 0000580362 00000 n 0000580496 00000 n 0000580630 00000 n 0000580764 00000 n 0000580898 00000 n 0000581032 00000 n 0000581166 00000 n 0000581300 00000 n 0000581434 00000 n 0000581568 00000 n 0000581702 00000 n 0000581835 00000 n 0000598445 00000 n 0000585934 00000 n 0000582210 00000 n 0000598390 00000 n 0000586827 00000 n 0000586966 00000 n 0000587105 00000 n 0000587244 00000 n 0000587383 00000 n 0000587522 00000 n 0000587661 00000 n 0000587800 00000 n 0000587939 00000 n 0000588078 00000 n 0000588217 00000 n 0000588356 00000 n 0000588494 00000 n 0000588632 00000 n 0000588771 00000 n 0000588910 00000 n 0000589048 00000 n 0000589186 00000 n 0000589325 00000 n 0000589464 00000 n 0000589603 00000 n 0000589742 00000 n 0000589880 00000 n 0000590017 00000 n 0000590156 00000 n 0000590295 00000 n 0000590434 00000 n 0000590573 00000 n 0000590712 00000 n 0000590851 00000 n 0000590990 00000 n 0000591129 00000 n 0000591268 00000 n 0000591407 00000 n 0000591546 00000 n 0000591685 00000 n 0000591823 00000 n 0000591962 00000 n 0000592099 00000 n 0000592233 00000 n 0000592367 00000 n 0000592500 00000 n 0000592634 00000 n 0000592767 00000 n 0000592901 00000 n 0000593035 00000 n 0000593169 00000 n 0000593303 00000 n 0000593437 00000 n 0000593570 00000 n 0000593704 00000 n 0000593838 00000 n 0000593972 00000 n 0000594106 00000 n 0000594240 00000 n 0000594374 00000 n 0000594508 00000 n 0000594647 00000 n 0000594781 00000 n 0000594914 00000 n 0000595048 00000 n 0000595182 00000 n 0000595316 00000 n 0000595450 00000 n 0000595584 00000 n 0000595718 00000 n 0000595851 00000 n 0000595985 00000 n 0000596119 00000 n 0000596253 00000 n 0000596387 00000 n 0000596521 00000 n 0000596655 00000 n 0000596789 00000 n 0000596923 00000 n 0000597057 00000 n 0000597190 00000 n 0000597324 00000 n 0000597458 00000 n 0000597592 00000 n 0000597725 00000 n 0000597858 00000 n 0000597992 00000 n 0000598126 00000 n 0000598258 00000 n 0000600399 00000 n 0000599198 00000 n 0000598565 00000 n 0000600344 00000 n 0000599389 00000 n 0000599528 00000 n 0000599666 00000 n 0000599804 00000 n 0000599943 00000 n 0000600077 00000 n 0000600210 00000 n 0000607076 00000 n 0000602929 00000 n 0000600519 00000 n 0000607021 00000 n 0000682337 00000 n 0000680521 00000 n 0000682172 00000 n 0000603309 00000 n 0000603440 00000 n 0000603572 00000 n 0000603704 00000 n 0000680198 00000 n 0000678386 00000 n 0000680033 00000 n 0000603836 00000 n 0000603968 00000 n 0000604099 00000 n 0000604232 00000 n 0000604364 00000 n 0000604497 00000 n 0000604630 00000 n 0000604763 00000 n 0000604895 00000 n 0000605028 00000 n 0000605161 00000 n 0000605294 00000 n 0000605427 00000 n 0000605559 00000 n 0000605692 00000 n 0000605825 00000 n 0000605958 00000 n 0000606091 00000 n 0000606224 00000 n 0000606357 00000 n 0000606490 00000 n 0000606623 00000 n 0000606756 00000 n 0000606889 00000 n 0000829208 00000 n 0000615194 00000 n 0000609775 00000 n 0000607186 00000 n 0000615139 00000 n 0000610236 00000 n 0000610364 00000 n 0000610496 00000 n 0000610629 00000 n 0000610762 00000 n 0000610894 00000 n 0000611026 00000 n 0000611159 00000 n 0000611292 00000 n 0000611423 00000 n 0000611556 00000 n 0000611689 00000 n 0000611821 00000 n 0000611953 00000 n 0000612086 00000 n 0000612219 00000 n 0000612352 00000 n 0000612485 00000 n 0000612618 00000 n 0000612751 00000 n 0000612884 00000 n 0000613016 00000 n 0000613149 00000 n 0000613282 00000 n 0000613415 00000 n 0000613548 00000 n 0000613681 00000 n 0000613813 00000 n 0000613945 00000 n 0000614078 00000 n 0000614211 00000 n 0000614342 00000 n 0000614475 00000 n 0000614608 00000 n 0000614740 00000 n 0000614873 00000 n 0000615006 00000 n 0000624581 00000 n 0000618140 00000 n 0000615329 00000 n 0000624526 00000 n 0000618664 00000 n 0000618792 00000 n 0000618924 00000 n 0000619057 00000 n 0000619189 00000 n 0000619321 00000 n 0000619454 00000 n 0000619586 00000 n 0000619720 00000 n 0000619854 00000 n 0000619987 00000 n 0000620121 00000 n 0000620255 00000 n 0000620388 00000 n 0000620522 00000 n 0000620655 00000 n 0000620787 00000 n 0000620921 00000 n 0000621055 00000 n 0000621189 00000 n 0000621322 00000 n 0000621456 00000 n 0000621590 00000 n 0000621722 00000 n 0000621856 00000 n 0000621990 00000 n 0000622124 00000 n 0000622258 00000 n 0000622392 00000 n 0000622526 00000 n 0000622660 00000 n 0000622792 00000 n 0000622926 00000 n 0000623060 00000 n 0000623194 00000 n 0000623327 00000 n 0000623461 00000 n 0000623595 00000 n 0000623728 00000 n 0000623860 00000 n 0000623994 00000 n 0000624128 00000 n 0000624261 00000 n 0000624394 00000 n 0000634273 00000 n 0000627239 00000 n 0000624703 00000 n 0000634218 00000 n 0000627799 00000 n 0000627933 00000 n 0000628067 00000 n 0000628200 00000 n 0000628333 00000 n 0000628467 00000 n 0000628601 00000 n 0000628734 00000 n 0000628868 00000 n 0000629002 00000 n 0000629135 00000 n 0000629269 00000 n 0000629403 00000 n 0000629537 00000 n 0000629671 00000 n 0000629805 00000 n 0000629939 00000 n 0000630073 00000 n 0000630207 00000 n 0000630341 00000 n 0000630475 00000 n 0000630609 00000 n 0000630742 00000 n 0000630876 00000 n 0000631010 00000 n 0000631144 00000 n 0000631277 00000 n 0000631411 00000 n 0000631545 00000 n 0000631678 00000 n 0000631812 00000 n 0000631946 00000 n 0000632078 00000 n 0000632212 00000 n 0000632346 00000 n 0000632480 00000 n 0000632614 00000 n 0000632748 00000 n 0000632882 00000 n 0000633016 00000 n 0000633150 00000 n 0000633284 00000 n 0000633418 00000 n 0000633552 00000 n 0000633685 00000 n 0000633819 00000 n 0000633953 00000 n 0000634087 00000 n 0000643938 00000 n 0000636908 00000 n 0000634358 00000 n 0000643883 00000 n 0000637468 00000 n 0000637602 00000 n 0000637735 00000 n 0000637868 00000 n 0000638002 00000 n 0000638136 00000 n 0000638270 00000 n 0000638403 00000 n 0000638537 00000 n 0000638671 00000 n 0000638802 00000 n 0000638936 00000 n 0000639070 00000 n 0000639204 00000 n 0000639338 00000 n 0000639472 00000 n 0000639606 00000 n 0000639740 00000 n 0000639873 00000 n 0000640007 00000 n 0000640141 00000 n 0000640275 00000 n 0000640408 00000 n 0000640542 00000 n 0000640676 00000 n 0000640810 00000 n 0000640943 00000 n 0000641077 00000 n 0000641211 00000 n 0000641344 00000 n 0000641478 00000 n 0000641612 00000 n 0000641745 00000 n 0000641879 00000 n 0000642013 00000 n 0000642147 00000 n 0000642281 00000 n 0000642415 00000 n 0000642549 00000 n 0000642683 00000 n 0000642817 00000 n 0000642951 00000 n 0000643085 00000 n 0000643218 00000 n 0000643351 00000 n 0000643485 00000 n 0000643619 00000 n 0000643752 00000 n 0000652713 00000 n 0000646828 00000 n 0000644023 00000 n 0000652658 00000 n 0000647316 00000 n 0000647450 00000 n 0000647584 00000 n 0000647718 00000 n 0000647851 00000 n 0000647985 00000 n 0000648119 00000 n 0000648252 00000 n 0000648386 00000 n 0000648520 00000 n 0000648651 00000 n 0000648785 00000 n 0000648919 00000 n 0000649053 00000 n 0000649187 00000 n 0000649321 00000 n 0000649455 00000 n 0000649589 00000 n 0000649723 00000 n 0000649857 00000 n 0000649991 00000 n 0000650125 00000 n 0000650258 00000 n 0000650392 00000 n 0000650525 00000 n 0000650659 00000 n 0000650792 00000 n 0000650926 00000 n 0000651060 00000 n 0000651192 00000 n 0000651326 00000 n 0000651460 00000 n 0000651592 00000 n 0000651726 00000 n 0000651860 00000 n 0000651994 00000 n 0000652128 00000 n 0000652262 00000 n 0000652394 00000 n 0000652526 00000 n 0000653458 00000 n 0000653137 00000 n 0000652835 00000 n 0000653403 00000 n 0000653274 00000 n 0000829333 00000 n 0000653554 00000 n 0000854635 00000 n 0000653598 00000 n 0000653643 00000 n 0000854536 00000 n 0000653689 00000 n 0000653722 00000 n 0000854437 00000 n 0000653768 00000 n 0000653796 00000 n 0000854297 00000 n 0000653836 00000 n 0000653882 00000 n 0000854213 00000 n 0000653922 00000 n 0000653953 00000 n 0000854114 00000 n 0000653993 00000 n 0000654071 00000 n 0000854030 00000 n 0000654112 00000 n 0000654186 00000 n 0000853890 00000 n 0000654232 00000 n 0000654286 00000 n 0000853821 00000 n 0000654332 00000 n 0000654360 00000 n 0000853722 00000 n 0000654408 00000 n 0000654448 00000 n 0000853623 00000 n 0000654500 00000 n 0000654550 00000 n 0000853524 00000 n 0000654597 00000 n 0000654626 00000 n 0000853425 00000 n 0000654673 00000 n 0000654702 00000 n 0000853284 00000 n 0000654752 00000 n 0000654784 00000 n 0000853200 00000 n 0000654840 00000 n 0000654878 00000 n 0000853101 00000 n 0000654937 00000 n 0000654978 00000 n 0000853002 00000 n 0000655034 00000 n 0000655088 00000 n 0000852903 00000 n 0000655134 00000 n 0000655184 00000 n 0000852763 00000 n 0000655236 00000 n 0000655294 00000 n 0000852694 00000 n 0000655350 00000 n 0000655400 00000 n 0000852554 00000 n 0000655449 00000 n 0000655498 00000 n 0000852470 00000 n 0000655553 00000 n 0000655594 00000 n 0000852371 00000 n 0000655648 00000 n 0000655688 00000 n 0000852287 00000 n 0000655741 00000 n 0000655780 00000 n 0000852188 00000 n 0000655826 00000 n 0000655854 00000 n 0000852089 00000 n 0000655899 00000 n 0000655936 00000 n 0000851990 00000 n 0000655983 00000 n 0000656022 00000 n 0000851906 00000 n 0000656079 00000 n 0000656118 00000 n 0000851766 00000 n 0000656174 00000 n 0000656212 00000 n 0000851640 00000 n 0000656262 00000 n 0000656294 00000 n 0000851556 00000 n 0000656346 00000 n 0000656405 00000 n 0000851457 00000 n 0000656454 00000 n 0000656485 00000 n 0000851358 00000 n 0000656532 00000 n 0000656561 00000 n 0000851259 00000 n 0000656611 00000 n 0000656654 00000 n 0000851160 00000 n 0000656718 00000 n 0000656764 00000 n 0000851061 00000 n 0000656826 00000 n 0000656870 00000 n 0000850962 00000 n 0000656935 00000 n 0000656982 00000 n 0000850863 00000 n 0000657034 00000 n 0000657068 00000 n 0000850764 00000 n 0000657117 00000 n 0000657185 00000 n 0000850665 00000 n 0000657235 00000 n 0000657267 00000 n 0000850581 00000 n 0000657321 00000 n 0000657357 00000 n 0000850440 00000 n 0000657415 00000 n 0000657455 00000 n 0000850356 00000 n 0000657498 00000 n 0000657553 00000 n 0000850257 00000 n 0000657596 00000 n 0000657651 00000 n 0000850158 00000 n 0000657694 00000 n 0000657742 00000 n 0000850059 00000 n 0000657792 00000 n 0000657828 00000 n 0000849960 00000 n 0000657870 00000 n 0000657900 00000 n 0000849861 00000 n 0000657943 00000 n 0000657974 00000 n 0000849762 00000 n 0000658017 00000 n 0000658048 00000 n 0000849663 00000 n 0000658093 00000 n 0000658126 00000 n 0000849523 00000 n 0000658169 00000 n 0000658200 00000 n 0000849454 00000 n 0000658252 00000 n 0000658286 00000 n 0000849355 00000 n 0000658329 00000 n 0000658360 00000 n 0000849256 00000 n 0000658404 00000 n 0000658436 00000 n 0000849157 00000 n 0000658480 00000 n 0000658512 00000 n 0000849058 00000 n 0000658558 00000 n 0000658592 00000 n 0000848974 00000 n 0000658638 00000 n 0000658674 00000 n 0000848849 00000 n 0000658734 00000 n 0000658776 00000 n 0000848765 00000 n 0000658825 00000 n 0000658864 00000 n 0000848666 00000 n 0000658908 00000 n 0000658942 00000 n 0000848567 00000 n 0000658990 00000 n 0000659028 00000 n 0000848468 00000 n 0000659077 00000 n 0000659118 00000 n 0000848369 00000 n 0000659163 00000 n 0000659191 00000 n 0000848285 00000 n 0000659236 00000 n 0000659263 00000 n 0000848186 00000 n 0000659315 00000 n 0000659366 00000 n 0000848046 00000 n 0000659412 00000 n 0000659449 00000 n 0000847962 00000 n 0000659497 00000 n 0000659562 00000 n 0000847863 00000 n 0000659609 00000 n 0000659663 00000 n 0000847764 00000 n 0000659710 00000 n 0000659789 00000 n 0000847665 00000 n 0000659834 00000 n 0000659873 00000 n 0000847566 00000 n 0000659920 00000 n 0000660001 00000 n 0000847467 00000 n 0000660048 00000 n 0000660122 00000 n 0000847342 00000 n 0000660180 00000 n 0000660220 00000 n 0000847258 00000 n 0000660286 00000 n 0000660334 00000 n 0000847174 00000 n 0000660399 00000 n 0000660446 00000 n 0000847034 00000 n 0000660488 00000 n 0000660543 00000 n 0000846950 00000 n 0000660602 00000 n 0000660668 00000 n 0000846823 00000 n 0000660720 00000 n 0000660760 00000 n 0000846739 00000 n 0000660804 00000 n 0000660826 00000 n 0000846640 00000 n 0000660867 00000 n 0000660889 00000 n 0000846541 00000 n 0000660930 00000 n 0000660952 00000 n 0000846442 00000 n 0000660993 00000 n 0000661015 00000 n 0000846343 00000 n 0000661058 00000 n 0000661080 00000 n 0000846244 00000 n 0000661127 00000 n 0000661150 00000 n 0000846145 00000 n 0000661200 00000 n 0000661222 00000 n 0000846046 00000 n 0000661264 00000 n 0000661288 00000 n 0000845947 00000 n 0000661330 00000 n 0000661354 00000 n 0000845848 00000 n 0000661404 00000 n 0000661436 00000 n 0000845749 00000 n 0000661484 00000 n 0000661514 00000 n 0000845650 00000 n 0000661569 00000 n 0000661606 00000 n 0000845551 00000 n 0000661655 00000 n 0000661686 00000 n 0000845452 00000 n 0000661734 00000 n 0000661764 00000 n 0000845353 00000 n 0000661809 00000 n 0000661836 00000 n 0000845254 00000 n 0000661886 00000 n 0000661918 00000 n 0000845155 00000 n 0000661968 00000 n 0000662000 00000 n 0000845056 00000 n 0000662051 00000 n 0000662084 00000 n 0000844957 00000 n 0000662126 00000 n 0000662150 00000 n 0000844858 00000 n 0000662192 00000 n 0000662216 00000 n 0000844759 00000 n 0000662260 00000 n 0000662286 00000 n 0000844660 00000 n 0000662332 00000 n 0000662360 00000 n 0000844561 00000 n 0000662403 00000 n 0000662428 00000 n 0000844462 00000 n 0000662479 00000 n 0000662512 00000 n 0000844363 00000 n 0000662564 00000 n 0000662598 00000 n 0000844264 00000 n 0000662643 00000 n 0000662670 00000 n 0000844165 00000 n 0000662713 00000 n 0000662738 00000 n 0000844066 00000 n 0000662786 00000 n 0000662816 00000 n 0000843967 00000 n 0000662861 00000 n 0000662888 00000 n 0000843868 00000 n 0000662931 00000 n 0000662956 00000 n 0000843769 00000 n 0000663007 00000 n 0000663040 00000 n 0000843670 00000 n 0000663083 00000 n 0000663108 00000 n 0000843571 00000 n 0000663160 00000 n 0000663194 00000 n 0000843472 00000 n 0000663247 00000 n 0000663282 00000 n 0000843373 00000 n 0000663336 00000 n 0000663372 00000 n 0000843274 00000 n 0000663428 00000 n 0000663466 00000 n 0000843175 00000 n 0000663517 00000 n 0000663550 00000 n 0000843076 00000 n 0000663600 00000 n 0000663632 00000 n 0000842977 00000 n 0000663683 00000 n 0000663716 00000 n 0000842878 00000 n 0000663768 00000 n 0000663802 00000 n 0000842779 00000 n 0000663857 00000 n 0000663894 00000 n 0000842680 00000 n 0000663939 00000 n 0000663966 00000 n 0000842581 00000 n 0000664015 00000 n 0000664046 00000 n 0000842482 00000 n 0000664095 00000 n 0000664126 00000 n 0000842383 00000 n 0000664175 00000 n 0000664206 00000 n 0000842284 00000 n 0000664250 00000 n 0000664276 00000 n 0000842185 00000 n 0000664319 00000 n 0000664344 00000 n 0000842086 00000 n 0000664388 00000 n 0000664414 00000 n 0000841987 00000 n 0000664459 00000 n 0000664486 00000 n 0000841888 00000 n 0000664533 00000 n 0000664562 00000 n 0000841789 00000 n 0000664617 00000 n 0000664654 00000 n 0000841690 00000 n 0000664700 00000 n 0000664728 00000 n 0000841591 00000 n 0000664774 00000 n 0000664802 00000 n 0000841492 00000 n 0000664845 00000 n 0000664870 00000 n 0000841393 00000 n 0000664915 00000 n 0000664942 00000 n 0000841294 00000 n 0000664993 00000 n 0000665026 00000 n 0000841195 00000 n 0000665067 00000 n 0000665090 00000 n 0000841096 00000 n 0000665144 00000 n 0000665180 00000 n 0000840997 00000 n 0000665235 00000 n 0000665272 00000 n 0000840898 00000 n 0000665319 00000 n 0000665348 00000 n 0000840799 00000 n 0000665399 00000 n 0000665432 00000 n 0000840700 00000 n 0000665475 00000 n 0000665500 00000 n 0000840601 00000 n 0000665548 00000 n 0000665578 00000 n 0000840502 00000 n 0000665621 00000 n 0000665646 00000 n 0000840403 00000 n 0000665699 00000 n 0000665734 00000 n 0000840304 00000 n 0000665792 00000 n 0000665832 00000 n 0000840205 00000 n 0000665884 00000 n 0000665918 00000 n 0000840106 00000 n 0000665968 00000 n 0000666000 00000 n 0000840007 00000 n 0000666044 00000 n 0000666070 00000 n 0000839908 00000 n 0000666117 00000 n 0000666146 00000 n 0000839809 00000 n 0000666198 00000 n 0000666232 00000 n 0000839710 00000 n 0000666283 00000 n 0000666316 00000 n 0000839611 00000 n 0000666363 00000 n 0000666392 00000 n 0000839512 00000 n 0000666442 00000 n 0000666474 00000 n 0000839413 00000 n 0000666520 00000 n 0000666548 00000 n 0000839314 00000 n 0000666595 00000 n 0000666624 00000 n 0000839215 00000 n 0000666671 00000 n 0000666700 00000 n 0000839116 00000 n 0000666751 00000 n 0000666784 00000 n 0000839017 00000 n 0000666835 00000 n 0000666868 00000 n 0000838918 00000 n 0000666916 00000 n 0000666946 00000 n 0000838819 00000 n 0000666995 00000 n 0000667026 00000 n 0000838720 00000 n 0000667075 00000 n 0000667106 00000 n 0000838621 00000 n 0000667157 00000 n 0000667190 00000 n 0000838522 00000 n 0000667238 00000 n 0000667268 00000 n 0000838423 00000 n 0000667311 00000 n 0000667336 00000 n 0000838324 00000 n 0000667388 00000 n 0000667422 00000 n 0000838225 00000 n 0000667464 00000 n 0000667488 00000 n 0000838126 00000 n 0000667529 00000 n 0000667552 00000 n 0000838027 00000 n 0000667595 00000 n 0000667620 00000 n 0000837928 00000 n 0000667673 00000 n 0000667708 00000 n 0000837829 00000 n 0000667755 00000 n 0000667784 00000 n 0000837730 00000 n 0000667831 00000 n 0000667860 00000 n 0000837631 00000 n 0000667910 00000 n 0000667942 00000 n 0000837532 00000 n 0000667996 00000 n 0000668032 00000 n 0000837433 00000 n 0000668076 00000 n 0000668102 00000 n 0000837334 00000 n 0000668145 00000 n 0000668170 00000 n 0000837235 00000 n 0000668214 00000 n 0000668240 00000 n 0000837136 00000 n 0000668287 00000 n 0000668316 00000 n 0000837037 00000 n 0000668362 00000 n 0000668390 00000 n 0000836938 00000 n 0000668433 00000 n 0000668458 00000 n 0000836839 00000 n 0000668504 00000 n 0000668532 00000 n 0000836740 00000 n 0000668577 00000 n 0000668604 00000 n 0000836641 00000 n 0000668651 00000 n 0000668680 00000 n 0000836542 00000 n 0000668738 00000 n 0000668778 00000 n 0000836443 00000 n 0000668833 00000 n 0000668870 00000 n 0000836344 00000 n 0000668920 00000 n 0000668952 00000 n 0000836245 00000 n 0000669003 00000 n 0000669036 00000 n 0000836146 00000 n 0000669080 00000 n 0000669106 00000 n 0000836047 00000 n 0000669150 00000 n 0000669176 00000 n 0000835948 00000 n 0000669224 00000 n 0000669254 00000 n 0000835849 00000 n 0000669313 00000 n 0000669354 00000 n 0000835750 00000 n 0000669409 00000 n 0000669446 00000 n 0000835651 00000 n 0000669498 00000 n 0000669532 00000 n 0000835552 00000 n 0000669586 00000 n 0000669622 00000 n 0000835453 00000 n 0000669667 00000 n 0000669694 00000 n 0000835354 00000 n 0000669736 00000 n 0000669760 00000 n 0000835255 00000 n 0000669804 00000 n 0000669830 00000 n 0000835156 00000 n 0000669878 00000 n 0000669908 00000 n 0000835057 00000 n 0000669958 00000 n 0000669990 00000 n 0000834958 00000 n 0000670037 00000 n 0000670066 00000 n 0000834859 00000 n 0000670116 00000 n 0000670148 00000 n 0000834760 00000 n 0000670192 00000 n 0000670218 00000 n 0000834661 00000 n 0000670266 00000 n 0000670296 00000 n 0000834562 00000 n 0000670349 00000 n 0000670384 00000 n 0000834463 00000 n 0000670432 00000 n 0000670462 00000 n 0000834364 00000 n 0000670515 00000 n 0000670550 00000 n 0000834265 00000 n 0000670602 00000 n 0000670636 00000 n 0000834166 00000 n 0000670687 00000 n 0000670720 00000 n 0000834067 00000 n 0000670768 00000 n 0000670798 00000 n 0000833968 00000 n 0000670853 00000 n 0000670890 00000 n 0000833869 00000 n 0000670947 00000 n 0000670986 00000 n 0000833770 00000 n 0000671039 00000 n 0000671074 00000 n 0000833671 00000 n 0000671122 00000 n 0000671152 00000 n 0000833572 00000 n 0000671206 00000 n 0000671242 00000 n 0000833473 00000 n 0000671290 00000 n 0000671320 00000 n 0000833374 00000 n 0000671367 00000 n 0000671396 00000 n 0000833275 00000 n 0000671448 00000 n 0000671482 00000 n 0000833176 00000 n 0000671530 00000 n 0000671560 00000 n 0000833077 00000 n 0000671609 00000 n 0000671640 00000 n 0000832978 00000 n 0000671685 00000 n 0000671712 00000 n 0000832879 00000 n 0000671762 00000 n 0000671794 00000 n 0000832780 00000 n 0000671839 00000 n 0000671866 00000 n 0000832681 00000 n 0000671913 00000 n 0000671942 00000 n 0000832582 00000 n 0000671986 00000 n 0000672012 00000 n 0000832483 00000 n 0000672065 00000 n 0000672100 00000 n 0000832384 00000 n 0000672151 00000 n 0000672184 00000 n 0000832285 00000 n 0000672234 00000 n 0000672266 00000 n 0000832186 00000 n 0000672310 00000 n 0000672336 00000 n 0000832087 00000 n 0000672385 00000 n 0000672416 00000 n 0000831988 00000 n 0000672464 00000 n 0000672494 00000 n 0000831904 00000 n 0000672537 00000 n 0000672562 00000 n 0000831805 00000 n 0000672623 00000 n 0000672666 00000 n 0000831665 00000 n 0000672716 00000 n 0000672782 00000 n 0000831581 00000 n 0000672827 00000 n 0000672888 00000 n 0000831482 00000 n 0000672937 00000 n 0000673008 00000 n 0000831383 00000 n 0000673056 00000 n 0000673122 00000 n 0000831243 00000 n 0000673175 00000 n 0000673249 00000 n 0000831159 00000 n 0000673306 00000 n 0000673358 00000 n 0000831075 00000 n 0000673403 00000 n 0000673474 00000 n 0000830976 00000 n 0000673528 00000 n 0000673593 00000 n 0000830892 00000 n 0000673652 00000 n 0000673708 00000 n 0000830752 00000 n 0000673759 00000 n 0000673792 00000 n 0000830627 00000 n 0000673855 00000 n 0000673915 00000 n 0000830558 00000 n 0000673972 00000 n 0000674032 00000 n 0000830474 00000 n 0000674095 00000 n 0000674169 00000 n 0000830375 00000 n 0000674215 00000 n 0000674274 00000 n 0000830276 00000 n 0000674325 00000 n 0000674384 00000 n 0000830192 00000 n 0000674437 00000 n 0000678260 00000 n 0000675754 00000 n 0000674472 00000 n 0000678150 00000 n 0000678205 00000 n 0000676026 00000 n 0000676159 00000 n 0000676292 00000 n 0000676424 00000 n 0000676557 00000 n 0000676690 00000 n 0000676821 00000 n 0000676954 00000 n 0000677087 00000 n 0000677219 00000 n 0000677352 00000 n 0000677485 00000 n 0000677618 00000 n 0000677751 00000 n 0000677884 00000 n 0000678017 00000 n 0000680433 00000 n 0000680408 00000 n 0000682572 00000 n 0000682547 00000 n 0000686611 00000 n 0000686540 00000 n 0000688813 00000 n 0000688788 00000 n 0000692654 00000 n 0000692453 00000 n 0000695063 00000 n 0000695038 00000 n 0000705171 00000 n 0000704820 00000 n 0000709185 00000 n 0000709042 00000 n 0000711272 00000 n 0000711243 00000 n 0000727486 00000 n 0000727119 00000 n 0000741140 00000 n 0000740775 00000 n 0000755189 00000 n 0000754800 00000 n 0000769578 00000 n 0000769216 00000 n 0000772270 00000 n 0000772054 00000 n 0000790222 00000 n 0000789825 00000 n 0000810644 00000 n 0000810195 00000 n 0000825596 00000 n 0000825189 00000 n 0000829422 00000 n 0000829539 00000 n 0000829659 00000 n 0000829779 00000 n 0000829902 00000 n 0000830010 00000 n 0000830111 00000 n 0000854719 00000 n 0000862401 00000 n 0000862442 00000 n 0000862482 00000 n 0000862595 00000 n trailer << /Size 2480 /Root 2478 0 R /Info 2479 0 R /ID [<9A1D1F0DA4146A7F04210EA5485CF58C> <9A1D1F0DA4146A7F04210EA5485CF58C>] >> startxref 862802 %%EOF geomview-1.9.4/src/0000777000175000001440000000000010665240677011154 500000000000000geomview-1.9.4/src/bin/0000777000175000001440000000000010665240702011711 500000000000000geomview-1.9.4/src/bin/nose/0000777000175000001440000000000010665240702012655 500000000000000geomview-1.9.4/src/bin/nose/nose.1gv0000644000175000001440000000163110600633377014160 00000000000000.TH nose 1gv "September 1 1992" "Geometry Center" .SH NAME nose - test geomview's picking facility .SH DESCRIPTION Nose is a geomview module which tests the geomview picking facility. Nose has no panel of its own. You invoke it by selecting the "Nose" line in the APPLICATIONS browser. Once invoked, nose waits for you to click the right mouse button with the cursor over some object in a geomview camera window. It then draws a little box on the spot where you clicked. If the picked spot is along an edge, it also draws a pair of boxes at the endpoints of the edge, and a line segment along the edge. If the picked spot is on a vertex, the box is a different color. Nose is not necessarily intended to be a useful program. It is just a simple example of how an external program can find out about and make use of geomview pick events. .SH SEE ALSO geomview(1) .SH AUTHOR .nf Mark Phillips Geometry Center .fi geomview-1.9.4/src/bin/nose/Makefile.am0000644000175000001440000000105410600640052014614 00000000000000INCLUDES = $(default_includes) LDADD = $(OOGLLIB) man_MANS = nose.1gv EXTRA_DIST = $(man_MANS) module_PROGRAMS = nose nose_SOURCES = nose.c nose_DEPENDENCIES = $(OOGLLIB) module_DATA = .geomview-nose .geomview-nose: Makefile echo '(emodule-define "Nose" "nose")' > .geomview-nose all-local: $(top_builddir)/modules/.geomview-nose $(top_builddir)/modules/.geomview-nose: Makefile $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Nose" "$(subdir)/nose")' > $@ CLEANFILES = $(top_builddir)/modules/.geomview-nose $(module_DATA) geomview-1.9.4/src/bin/nose/Makefile.in0000644000175000001440000004545310665240477014662 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ module_PROGRAMS = nose$(EXEEXT) subdir = src/bin/nose DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(moduledir)" modulePROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(module_PROGRAMS) am_nose_OBJECTS = nose.$(OBJEXT) nose_OBJECTS = $(am_nose_OBJECTS) nose_LDADD = $(LDADD) am__DEPENDENCIES_1 = DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(nose_SOURCES) DIST_SOURCES = $(nose_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; moduleDATA_INSTALL = $(INSTALL_DATA) DATA = $(module_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) LDADD = $(OOGLLIB) man_MANS = nose.1gv EXTRA_DIST = $(man_MANS) nose_SOURCES = nose.c nose_DEPENDENCIES = $(OOGLLIB) module_DATA = .geomview-nose CLEANFILES = $(top_builddir)/modules/.geomview-nose $(module_DATA) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/nose/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/nose/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-modulePROGRAMS: $(module_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(modulePROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(moduledir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(modulePROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(moduledir)/$$f" || exit 1; \ else :; fi; \ done uninstall-modulePROGRAMS: @$(NORMAL_UNINSTALL) @list='$(module_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \ rm -f "$(DESTDIR)$(moduledir)/$$f"; \ done clean-modulePROGRAMS: @list='$(module_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done nose$(EXEEXT): $(nose_OBJECTS) $(nose_DEPENDENCIES) @rm -f nose$(EXEEXT) $(LINK) $(nose_OBJECTS) $(nose_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nose.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done install-moduleDATA: $(module_DATA) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(moduleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \ $(moduleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \ done uninstall-moduleDATA: @$(NORMAL_UNINSTALL) @list='$(module_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \ rm -f "$(DESTDIR)$(moduledir)/$$f"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-modulePROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-moduleDATA install-modulePROGRAMS install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-moduleDATA \ uninstall-modulePROGRAMS uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am all-local check check-am clean \ clean-generic clean-libtool clean-modulePROGRAMS ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man1 install-moduleDATA \ install-modulePROGRAMS install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-man uninstall-man1 uninstall-moduleDATA \ uninstall-modulePROGRAMS .geomview-nose: Makefile echo '(emodule-define "Nose" "nose")' > .geomview-nose all-local: $(top_builddir)/modules/.geomview-nose $(top_builddir)/modules/.geomview-nose: Makefile $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Nose" "$(subdir)/nose")' > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/nose/nose.c0000644000175000001440000001515610624367363013721 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Geometry Technologies, Inc. * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Geomview; see the file COPYING. If not, write to the * Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA, * or visit http://www.gnu.org. */ /* (picked "name" (gx gy gz) (vx vy vz) (x1 y1 z1 x2 y2 z2)) */ #include #include #include "lisp.h" #include "pickfunc.h" #include "3d.h" #include "handleP.h" #include "ooglutil.h" void deflittlebox(FILE *fp, float size); void norm(FILE *fp); int verbose = 0; void handle_pick(FILE *fp, int picked, HPoint3 *gotten, int vert, HPoint3 *v, int edge, HPoint3 e[]) { static int first = 1; HPoint3 got, e0, e1; HPt3Dehomogenize(&e[0], &e0); HPt3Dehomogenize(&e[1], &e1); HPt3Dehomogenize(gotten, &got); fprintf(fp, "(progn\n"); if (!picked) { fprintf(fp,"(geometry \"pick\" { LIST } )\n"); } else { fprintf(fp,"(xform-set pick { 1 0 0 0 0 1 0 0 0 0 1 0 %g %g %g 1 })\n", got.x, got.y, got.z); fprintf(fp,"(geometry \"pick\"\n"); if (vert) fprintf(fp, "{ appearance { material { diffuse 1 0 1 } }\n"); else fprintf(fp, "{ appearance { material { diffuse 1 1 0 } }\n"); fprintf(fp, " { LIST { :littlebox }\n"); if (edge && !vert) { e0.x -= got.x; e0.y -= got.y; e0.z -= got.z; e1.x -= got.x; e1.y -= got.y; e1.z -= got.z; fprintf(fp,"{ appearance { material { diffuse 0 1 1 } }\n\ LIST\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { INST transform 1 0 0 0 0 1 0 0 0 0 1 0 %f %f %f 1 geom :littlebox }\n\ { VECT\n\ 1 2 1\n\ 2\n\ 1\n\ %f %f %f\n\ %f %f %f\n\ 1 1 0 1\n\ }\n\ }\n", e0.x, e0.y, e0.z, e1.x, e1.y, e1.z, e0.x, e0.y, e0.z, e1.x, e1.y, e1.z); } fprintf(fp," }\n }\n)\n"); } if (first) { fprintf(fp, "(pickable \"pick\" no)\n"); first = 0; } fprintf(fp, ")\n"); fflush(fp); } void handle_ND_pick(FILE *fp, int picked, HPtNCoord *gotten, int dim, int vert, HPtNCoord *v, int edge, HPtNCoord *e) { static int first = 1; HPointN got, e0, e1; TransformN *trans; int i; got.flags = e0.flags = e1.flags = 0; got.dim = e0.dim = e1.dim = dim; got.v = gotten; e0.v = e; e1.v = e+dim; HPtNDehomogenize(&got, &got); fprintf(fp, "(progn\n"); if (!picked) { fprintf(fp,"(geometry \"pick\" { LIST } )\n"); } else { trans = TmNTranslateOrigin(NULL, &got); fprintf(fp,"(ND-xform-set pick "); TmNPrint(fp, trans); fprintf(fp, ")\n"); fprintf(fp,"(geometry \"pick\"\n"); if (vert) fprintf(fp, "{ appearance { material { diffuse 1 0 1 } }\n"); else fprintf(fp, "{ appearance { material { diffuse 1 1 0 } }\n"); fprintf(fp, " { LIST { :littlebox }\n"); if (edge && !vert) { HPtNDehomogenize(&e0, &e0); HPtNDehomogenize(&e1, &e1); HPtNComb(-1.0, &got, 1.0, &e0, &e0); HPtNComb(-1.0, &got, 1.0, &e1, &e1); fprintf(fp, "{\n" " appearance { material { diffuse 0 1 1 } }\n" " LIST {\n" " { INST\n"); trans = TmNTranslateOrigin(NULL, &e0); TmNPrint(fp, trans); fprintf(fp, " geom :littlebox\n" " }\n" " { INST\n"); trans = TmNTranslateOrigin(NULL, &e1); TmNPrint(fp, trans); fprintf(fp, " geom :littlebox\n" " }\n" " { nSKEL %d\n" " 2 1\n", dim-1); fprintf(fp, " "); for (i = 1; i < dim; i++) { fprintf(fp, " %10.7f", e0.v[i]); } fprintf(fp, "\n "); for (i = 1; i < dim; i++) { fprintf(fp, " %10.7f", e1.v[i]); } fprintf(fp, "\n 2 0 1 1 1 0 1\n" " }\n" " }\n" "}\n"); } fprintf(fp, "}})\n"); } if (first) { fprintf(fp, "(pickable \"pick\" no)\n"); first = 0; } fprintf(fp, ")\n"); fflush(fp); } DEFPICKFUNC("(pick COORDSYS GEOMID G V E F P VI EI FI)", coordsys, id, point, pn, vertex, vn, edge, en, face, fn, ppath, ppn, vi, ei, ein, fi, { int picked = pn > 0; handle_pick(stdout, picked, &point, vn>0, &vertex, en>0, edge); if (verbose) handle_pick(stderr, picked, &point, vn>0, &vertex, en>0, edge); return Lt; }, { int picked = pn > 0; handle_ND_pick(stdout, picked, point, pn, vn>0, vertex, en>0, edge); if (verbose) handle_ND_pick(stderr, picked, point, pn, vn>0, vertex, en>0, edge); return Lt; }) void init(void) { LInit(); LDefun("pick", Lpick, Hpick); } void pickability(FILE *fp) { fprintf(fp, "(interest (pick world * * * * nil nil nil nil nil))\n"); fflush(fp); } int main(int argc, char *argv[]) { Lake *lake; LObject *lit, *val; IOBFILE *fromgv; verbose = (getenv("VERBOSE_NOSE") != NULL); fprintf(stdout, "(progn\n"); init(); deflittlebox(stdout, 0.04); if (verbose) deflittlebox(stderr, 0.04); pickability(stdout); if (verbose) pickability(stderr); norm(stdout); if (verbose) norm(stderr); fprintf(stdout, ")\n"); fflush(stdout); lake = LakeDefine(fromgv = iobfileopen(stdin), stdout, NULL); while (!iobfeof(fromgv)) { lit = LSexpr(lake); val = LEval(lit); LFree(lit); LFree(val); } return 0; } void norm(FILE *fp) { fprintf(fp, "(geometry \"pick\" { LIST } )\n"); fprintf(fp, "(normalization \"pick\" none)\n"); fprintf(fp, "(bbox-draw \"pick\" off)\n"); fflush(fp); } void deflittlebox(FILE *fp, float size) { fprintf(fp,"\ (read geometry { define littlebox {\n\ INST\n\ transform %f 0 0 0\n\ 0 %f 0 0\n\ 0 0 %f 0\n\ 0 0 0 1\n\ geom\n\ OFF\n\ 8 6 12\n\ \n\ -.5 -.5 -.5 # 0 \n\ .5 -.5 -.5 # 1 \n\ .5 .5 -.5 # 2 \n\ -.5 .5 -.5 # 3 \n\ -.5 -.5 .5 # 4 \n\ .5 -.5 .5 # 5 \n\ .5 .5 .5 # 6 \n\ -.5 .5 .5 # 7 \n\ \n\ 4 0 1 2 3\n\ 4 4 5 6 7\n\ 4 2 3 7 6\n\ 4 0 1 5 4\n\ 4 0 4 7 3\n\ 4 1 2 6 5\n\ }})\n", size, size, size); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/0000777000175000001440000000000010665240677013546 500000000000000geomview-1.9.4/src/bin/geomview/x11/0000777000175000001440000000000010665240700014142 500000000000000geomview-1.9.4/src/bin/geomview/x11/gvmaterial.c0000644000175000001440000001321110622716746016366 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/ui.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Material.mib" /* private methods and variables */ /*****************************************************************************/ static void matt_sliders(Widget, XtPointer, XmScaleCallbackStruct *); static void matt_entries(Widget w, XtPointer data, XmAnyCallbackStruct *cbs); extern void ap_toggle(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs); extern void set_ap_toggle(Widget w, int *current, Appearance *ap, int flagbit); static Widget TransparentToggle; static struct _slider { float min, max; DrawerKeyword val; int mtcode; char *slidername, *textname; Widget sliderw, textw; float lastval; } sliders[] = { { 1.0, 128.0, DRAWER_SHININESS, MT_SHININESS, "ShininessScale", "ShininessText" }, { 0.0, 1.0, DRAWER_KS, MT_Ks, "SpecularScale", "SpecularText" }, { 0.0, 1.0, DRAWER_KD, MT_Kd, "DiffuseScale", "DiffuseText" }, { 0.0, 1.0, DRAWER_KA, MT_Ka, "AmbientScale", "AmbientText" }, { 0.0, 1.0, DRAWER_ALPHA, MT_ALPHA, "AlphaScale", "AlphaText" }, }; #define S_SHINY 0 #define S_SPECULAR 1 #define S_DIFFUSE 2 #define S_AMBIENT 3 #define S_ALPHA 4 /*****************************************************************************/ void ui_load_materialpanel() { int i; struct _slider *s; Widget mattform, HideButton; mib_Widget *mattload; static char Material[] = "Material"; /*****************************************************************************/ ui_make_panel_and_form(Material, Root, False, True, &mattform); /*mattload = mib_load_interface(mattform, "interface/Material.mib", MI_FROMFILE);*/ mattload = mib_load_interface(mattform, Root, MI_FROMSTRING); XtManageChild(mattform); /*****************************************************************************/ HideButton = mib_find_name(mattload, "HideButton")->me; TransparentToggle = mib_find_name(mattload, "TransparentToggle")->me; XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer) Material); for (i = 0, s = sliders; i < COUNT(sliders); i++, s++) { s->sliderw = mib_find_name(mattload, s->slidername)->me; s->textw = mib_find_name(mattload, s->textname)->me; XtAddCallback(s->sliderw, XmNdragCallback, (XtCallbackProc) matt_sliders, (XtPointer)(long) i); XtAddCallback(s->sliderw, XmNvalueChangedCallback, (XtCallbackProc) matt_sliders, (XtPointer)(long) i); XtAddCallback(s->textw, XmNactivateCallback, (XtCallbackProc) matt_entries, (XtPointer)(long) i); XtAddCallback(s->textw, XmNlosingFocusCallback, (XtCallbackProc) matt_entries, (XtPointer)(long) i); } XtAddCallback(TransparentToggle, XmNvalueChangedCallback, (XtCallbackProc) ap_toggle, (XtPointer)DRAWER_TRANSPARENT); } /*****************************************************************************/ static void matt_sliders(Widget w, XtPointer data, XmScaleCallbackStruct *cbs) { struct _slider *s = &(sliders[(int)(long)data]); float val = (float)cbs->value; float conv = ((s->max - s->min)/100.0)*val + s->min; drawer_float(GEOMID(uistate.targetgeom), s->val, conv); s->lastval = conv; ui_set_ftext(s->textw, conv); } static void matt_entries(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { struct _slider *s = &sliders[(int)(long)data]; char *str = XmTextFieldGetString(s->textw); char *estr; float val = strtod(str, &estr); if (*str != '\0' && *estr == '\0') { if (fabs(s->lastval - val) > .001) { XmScaleSetValue(s->sliderw, (int)(100.0*(val - s->min)/(s->max - s->min))); s->lastval = val; } } else { ui_set_ftext(s->textw, s->lastval); } } /*****************************************************************************/ void ui_target_materialpanel(int id) { int i; double val; int conv; Appearance *ap; Material *mt = NULL; struct _slider *s; if (drawer_get_object(id) != NULL) { ap = drawer_get_ap(id); ApGet(ap, AP_MAT, &mt); set_ap_toggle(TransparentToggle, &i, ap, APF_TRANSP); if (mt == NULL) return; for (i = 0; i < COUNT(sliders); i++) { s = &sliders[i]; if (MtGet(mt, s->mtcode, &val) > 0) { conv = (int)(100.0*(val - s->min)/(s->max - s->min)); XmScaleSetValue(s->sliderw, conv); ui_set_ftext(s->textw, val); s->lastval = val; } } } } /*****************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/x11/gvcamui.c0000644000175000001440000011164010605500735015661 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_ # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/worldio.h" #include "../common/transform.h" #include "../common/main.h" #include "mibwidgets.h" #include "gvui.h" #include "windowP.h" #include #include #include #include #include #include #include /* for XtConfigureWidget() */ #if HAVE_XMU # include /* XmuLookupStandardColormap */ #endif /* * All compile-time dependencies on graphics type (X11/GL/OPENGL) * reside in this file. */ /* Don't worry about that #error stuff, configure makes sure that at * least MGX11 is defined (look in config.h) */ #if !MGGL && !MGX11 && !MGOPENGL # error Need at least one graphics type (X11/OpenGL/GL) to render with! #endif /* Define the global option variabl `gv_no_opengl' to be always * logical true if we have no OpenGL available. This simplifies some * if-cases in this file which otherwise would have to be wrapped into * some more preprocessor `#if'-constructs. */ #if !MGGL && !MGOPENGL # define gv_no_opengl 1 #endif #include "mg.h" #if MGX11 # include "mgx11.h" #endif #if MGGL # include "mggl.h" # include # include #endif #if MGOPENGL # include "mgopengl.h" # define GL_GLEXT_PROTOTYPES # include # include # include # ifdef MESA # define OPENGL_BUILDINFOGRAPHICS "OpenGL(MESA)" # else # define OPENGL_BUILDINFOGRAPHICS "OpenGL" # endif /*!MESA*/ #endif #ifdef OPENGL_BUILDINFOGRAPHICS # if MGX11 char *buildinfographics = OPENGL_BUILDINFOGRAPHICS"/X11"; # else char *buildinfographics = OPENGL_BUILDINFOGRAPHICS; # endif #else char *buildinfographics = "X11"; #endif /* Hack. We need to associate some other windows with a DrawingArea widget. * In X11R6, there's a nice public XtRegisterDrawable() function. * In X11R5 and X11R4, there's an unpublished _XtRegisterWindow() instead. * So if we're not at least R6, use the latter. */ #if (XtSpecificationRelease < 6) || defined(AVOID_X11R6) # define XtRegister_window(dpy, win, wid) _XtRegisterWindow(win, wid) # define XtUnregister_window(dpy, win, wid) _XtUnregisterWindow(win, wid) #else # define XtRegister_window(dpy, win, wid) XtRegisterDrawable(dpy, win, wid) # define XtUnregister_window(dpy, win, wid) XtUnregisterDrawable(dpy, win) #endif extern Display *dpy; extern UIState uistate; extern Pixmap geomicon; /* private methods and variables */ /*****************************************************************************/ static void ui_delete_camera(Widget, XtPointer, XmAnyCallbackStruct *); static Colormap getcmapfor(XVisualInfo *vi); /*****************************************************************************/ enum buffering { SGL=0, DBL=1, BUFTYPES }; static vvec camshells; struct cursor { int id; Cursor c; } cursors[2]; struct camwins { Window shellwin; Window wins[BUFTYPES]; #if MGOPENGL XVisualInfo *vi[BUFTYPES]; #endif int curs; }; #if MGOPENGL static Colormap oglcmap[2]; #endif /*****************************************************************************/ void cam_mgdevice() { if (gv_no_opengl) { #if MGX11 mgdevice_X11(); #endif } else { #if MGGL mgdevice_GL(); #endif #if MGOPENGL mgdevice_OPENGL(); #endif } } /*****************************************************************************/ static Widget camshellof(int id, struct camwins **cwp) { struct camwins *cw; Widget w; if (id < 0 || INDEXOF(id) >= VVCOUNT(camshells)) { return NULL; } cw = VVINDEX(camshells, struct camwins, INDEXOF(id)); if ((w = XtWindowToWidget(dpy, cw->shellwin)) == NULL) { return NULL; } if (cwp) { *cwp = cw; } return w; } static void fitwins(Widget w, struct camwins *cw) { /* If we have private windows, may need to resize them. */ Dimension height = 100, width = 100; int n; XtVaGetValues(w, XmNwidth, &width, XmNheight, &height, NULL); for(n = SGL; n <= DBL; n++) { if (cw->wins[n] != 0) /* (0 if unset from vvzero(&camwins)) */ XResizeWindow(dpy, cw->wins[n], width, height); } } static int setwinargs(ArgList args, int n, WnWindow *win, int changed, int *sizep, char **titlep, Widget w) { WnPosition prefpos; int enlarge = 1, shrink = 1; int sx = 350, sy = 350, noborder = 0, haspref, hassize; static char geometry[30]; WnGet(win, WN_ENLARGE, &enlarge); WnGet(win, WN_SHRINK, &shrink); hassize = WnGet(win, WN_XSIZE, &sx); hassize &= WnGet(win, WN_YSIZE, &sy); WnGet(win, WN_NAME, titlep); WnGet(win, WN_NOBORDER, &noborder); haspref = WnGet(win, WN_PREFPOS, &prefpos); if (changed & WNF_HASNAME) { XtSetArg(args[n], XmNtitle, *titlep); n++; } if ((changed & WNF_HASPREF) && haspref > 0) { sx = prefpos.xmax - prefpos.xmin + 1; sy = prefpos.ymax - prefpos.ymin + 1; sprintf(geometry, "=%dx%d+%d-%d", sx, sy, prefpos.xmin, prefpos.ymin); XtSetArg(args[n], XmNgeometry, geometry); n++; if (w != NULL) XtConfigureWidget(w, prefpos.xmin, HeightOfScreen(XtScreen(w))-prefpos.ymax-1, sx, sy, 0); } if ((changed & WNF_HASSIZE) && hassize == 1) { XtSetArg(args[n], XmNwidth, sx); n++; XtSetArg(args[n], XmNheight, sy); n++; } if (changed & WNF_NOBORDER) { XtSetArg(args[n], XmNmwmDecorations, noborder ? 0 : MWM_DECOR_ALL); n++; } if (changed & (WNF_ENLARGE|WNF_SHRINK)) { XtSetArg(args[n], XmNmwmFunctions, enlarge||shrink ? MWM_FUNC_ALL : (MWM_FUNC_ALL|MWM_FUNC_RESIZE)); n++; } if (sizep) { sizep[0] = sx; sizep[1] = sy; } return n; } void cam_winchange(mgcontext *mgc, void *data, int why, ...) { va_list args; WnWindow *win; int n, changed; int id = (int)(long) data; struct camwins *cw; Widget w; char *title = "gvwin"; if ((w = camshellof(id, &cw)) == NULL) return; va_start(args, why); switch(why) { case MGW_WINDELETE: ui_delete_camera(w, data, NULL); break; case MGW_WINCHANGE: win = va_arg(args, WnWindow *); changed = win->changed; if (changed & (WNF_ENLARGE|WNF_SHRINK|WNF_NOBORDER |WNF_HASPREF|WNF_HASSIZE|WNF_HASNAME)) { Arg args[20]; n = setwinargs(args, 0, win, win->changed, NULL, &title, w); XtSetValues(w, args, n); win->changed &= ~(WNF_ENLARGE|WNF_SHRINK|WNF_NOBORDER |WNF_HASPREF|WNF_HASSIZE|WNF_HASNAME); } if (changed & (WNF_HASCUR|WNF_HASSIZE|WNF_HASPREF)) fitwins(w, cw); break; } va_end(args); } Widget ui_create_camera(Widget parent, DView *dv) { int id = dv->id; Arg args[20]; int n, size[2]; char *title; struct camwins *cw; Atom AProtocol; Widget shell, camform, camdraw[2] = { NULL, NULL }; int i; XSetWindowAttributes xswa; Window cmw[32]; int cmwneeded; #if MGOPENGL struct oglstuff { int setGLXwin, setGLXctx; int *attribs; GLXContext cx; Colormap cm; }; static int dblBuf[] = { GLX_DOUBLEBUFFER, GLX_RGBA, GLX_DEPTH_SIZE, 16, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, None }; static struct oglstuff ogl[2] = { { MG_GLXSINGLEWIN, MG_GLXSINGLECTX, dblBuf+1 }, { MG_GLXDOUBLEWIN, MG_GLXDOUBLECTX, dblBuf }, }; struct oglstuff *oglp; GLXContext sharectx = None; #endif #if MGGL static GLXconfig db_rgb_desc[] = { { GLX_NORMAL, GLX_VISUAL, GLX_NONE }, { GLX_NORMAL, GLX_COLORMAP, GLX_NONE }, { GLX_NORMAL, GLX_WINDOW, GLX_NONE }, { GLX_NORMAL, GLX_VISUAL, GLX_NONE }, { GLX_NORMAL, GLX_DOUBLE, TRUE}, { GLX_NORMAL, GLX_RGB, TRUE}, { GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG }, { 0,0,0 } }; static GLXconfig sg_rgb_desc[] = { { GLX_NORMAL, GLX_VISUAL, GLX_NONE }, { GLX_NORMAL, GLX_COLORMAP, GLX_NONE }, { GLX_NORMAL, GLX_WINDOW, GLX_NONE }, { GLX_NORMAL, GLX_DOUBLE, FALSE}, { GLX_NORMAL, GLX_RGB, TRUE}, { GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG }, { 0,0,0 } }; #endif /*****************************************************************************/ /*****************************************************************************/ n = 0; XtSetArg(args[n], XmNdeleteResponse, XmDO_NOTHING);n++; n = setwinargs(args, n, dv->win, ~0, size, &title, NULL); #if MGGL || MGX11 if (MGGL || gv_no_opengl) { /* ... but not for MGOPENGL */ XtSetArg(args[n], XmNvisual, gvvisual); n++; XtSetArg(args[n], XmNdepth, gvbitdepth); n++; XtSetArg(args[n], XmNcolormap, gvcolormap); n++; } #endif /*****************************************************************************/ shell = XtAppCreateShell(title, "gv", topLevelShellWidgetClass, dpy, args, n); XtVaSetValues(shell, XmNiconPixmap, geomicon, NULL); XtRealizeWidget(shell); camform = shell; /* Record the X window id of the top-level shell of each camera * in an array indexed by geomview camera number, * so cam_winchange() above can map cam id's into widgets. * We store X window numbers and use XtWindowToWidget() rather than * storing widget pointers to avoid possibly dereferencing junk. */ if (VVCOUNT(camshells) == 0) { VVINIT(camshells, struct camwins, 4); vvzero(&camshells); } cw = VVINDEX(camshells, struct camwins, INDEXOF(id)); cw->shellwin = XtWindow(shell); /****************************************************************************/ n = 0; #if MGX11 || MGOPENGL if (MGOPENGL || gv_no_opengl) { /* ... but not for MGGL */ XtSetArg(args[n], XmNtitle, title); n++; XtSetArg(args[n], XmNrubberPositioning, False); n++; } #endif /****************************************************************************/ XtSetArg(args[n], XmNwidth, size[0]); n++; XtSetArg(args[n], XmNheight, size[1]); n++; if (gv_no_opengl) { #if MGX11 camdraw[SGL] = NULL; camdraw[DBL] = XtCreateManagedWidget("camdraw", xmDrawingAreaWidgetClass, camform, args, n); XtManageChild(camdraw[DBL]); mgctxset(MG_X11DISPLAY, dpy, MG_X11COLORMAP, gvcolormap, MG_BITDEPTH, gvbitdepth, MG_X11VISUAL, gvvisual, MG_X11WINID, XtWindow(camdraw[DBL]), MG_X11PARENT, XtWindow(shell), MG_X11SIZELOCK, 1, MG_END); #endif } else { /* gv_no_opengl */ #if MGOPENGL /* In case we're not the first GLX context in town, find another * so we can share our display lists promiscuously. */ mgctxset(MG_GLXDISPLAY, dpy, MG_END); mgctxget(MG_GLXSHARECTX, &sharectx); camdraw[SGL] = NULL; camdraw[DBL] = XtCreateManagedWidget("ogldraw", xmDrawingAreaWidgetClass, camform, args, 0); n = 0; cmwneeded = 0; for(i = SGL; i <= DBL; i++) { oglp = &ogl[i]; oglp->cx = NULL; oglp->cm = None; cw->vi[i] = glXChooseVisual(dpy, XScreenNumberOfScreen(XtScreen(camform)), oglp->attribs); if (cw->vi[i] == NULL) { continue; } if (oglcmap[i] == 0) { oglcmap[i] = getcmapfor(cw->vi[i]); } oglp->cx = glXCreateContext(dpy, cw->vi[i], sharectx, GL_TRUE); if (oglp->cx) { sharectx = oglp->cx; } xswa.colormap = oglcmap[i]; xswa.event_mask = KeyPressMask|ButtonPressMask| ButtonReleaseMask|ButtonMotionMask| EnterWindowMask|StructureNotifyMask|ExposureMask; xswa.border_pixel = xswa.background_pixel = xswa.backing_pixel = xswa.background_pixmap = None; cw->wins[i] = XCreateWindow(dpy, XtWindow(camdraw[DBL]), 0, 0, size[0], size[1], 0/*border*/, cw->vi[i]->depth, InputOutput, cw->vi[i]->visual, CWEventMask|CWColormap|CWBorderPixel |CWBackPixel|CWBackPixmap, &xswa); XMapWindow(dpy, cw->wins[i]); XtRegister_window(dpy, cw->wins[i], camdraw[DBL]); if (oglcmap[i] != DefaultColormapOfScreen(XtScreen(camform))) { cmw[cmwneeded++] = cw->wins[i]; } mgctxset(oglp->setGLXwin, cw->wins[i], oglp->setGLXctx, oglp->cx, MG_END ); n++; } if (n == 0) { OOGLError(0, "No OpenGL RGB visual available."); exit(1); } if (cmwneeded > 0) { Window *wp; int nw; if (XGetWMColormapWindows(dpy, XtWindow(shell), &wp, &nw)) { if (nw > COUNT(cmw) - 2) nw = COUNT(cmw) - 2; memcpy(&cmw[cmwneeded], wp, nw * sizeof(Window)); XFree(wp); cmwneeded += nw; } XSetWMColormapWindows(dpy, XtWindow(shell), cmw, cmwneeded); } #endif /* MGOPENGL */ #if MGGL XtSetArg (args[n], GlxNglxConfig, db_rgb_desc); n++; camdraw[DBL] = XtCreateManagedWidget("camdrawdbl", glxMDrawWidgetClass, shell, args, n); XtSetArg(args[n-1], GlxNglxConfig, sg_rgb_desc); camdraw[SGL] = XtCreateManagedWidget("camdrawsgl", glxMDrawWidgetClass, shell, args, n); mgctxset(MG_GLXDISPLAY, dpy, MG_GLXSINGLEWIN, XtWindow(camdraw[SGL]), MG_GLXDOUBLEWIN, XtWindow(camdraw[DBL]), MG_END); #endif /* MGGL */ } /* !gv_no_opengl */ /*****************************************************************************/ AProtocol = XmInternAtom(dpy, "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(shell, AProtocol, (XtCallbackProc) ui_delete_camera, (XtPointer)(long)id); /* Even if this event handler isn't called for normal button- and keypress- * events, the "StructureNotifyMask" below means we hear about unmapping * events in case a window is iconified or etc. */ D1PRINT(("XtAddEventHandler(... panel_input [0] ...)\n")); XtAddEventHandler(shell, KeyPressMask|ButtonPressMask|ButtonReleaseMask|ButtonMotionMask |StructureNotifyMask|ExposureMask, False, (XtEventHandler) panel_input, (XtPointer)(long) id); for(i = SGL; i <= DBL; i++) { if (camdraw[i]) { XtAddCallback(camdraw[i], XmNexposeCallback, (XtCallbackProc) cam_expose, (XtPointer)(long) id); XtAddCallback(camdraw[i], XmNresizeCallback, (XtCallbackProc) cam_resize, (XtPointer)(long) id); D1PRINT(("XtAddEventHandler(... cam_expose ...)\n")); XtAddEventHandler(camdraw[i], ExposureMask|StructureNotifyMask, False, (XtEventHandler) cam_expose, (XtPointer)(long) id); D1PRINT(("XtAddEventHandler(... panel_input [1] ...)\n")); XtAddEventHandler(camdraw[i], KeyPressMask|ButtonPressMask|ButtonReleaseMask, False, (XtEventHandler) panel_input, (XtPointer)(long) id); D1PRINT(("XtAddEventHandler(... cam_mouse ...)\n")); XtAddEventHandler(camdraw[i], ButtonMotionMask, False, (XtEventHandler) cam_mouse, (XtPointer)(long) id); D1PRINT(("XtAddEventHandler(... cam_mousecross ...)\n")); XtAddEventHandler(camdraw[i], EnterWindowMask, False, (XtEventHandler) cam_mousecross, (XtPointer)(long) id); D1PRINT(("XtAddEventHandler(... cam_mousecross ...)\n")); XtAddEventHandler(camdraw[i], FocusChangeMask, False, (XtEventHandler) cam_focus, (XtPointer)(long) id); } } mgctxset(MG_WINCHANGE, cam_winchange, MG_WINCHANGEDATA, (void *)(long)id, MG_END); return shell; } /*****************************************************************************/ #if MGOPENGL static Colormap getcmapfor(XVisualInfo *vi) { int i, nCmaps; XStandardColormap *standardCmaps; Colormap cm; Atom Ahpmap = XmInternAtom(dpy, "_HP_RGB_SMOOTH_TRUE_MAP", False); Window root = RootWindow(dpy, vi->screen); #if HAVE_XMU XmuLookupStandardColormap(dpy, vi->screen, vi->visualid, vi->depth, XA_RGB_DEFAULT_MAP, /* replace */ False, /* retain */ True); #endif /* Whether we called XmuLookupStandardColormap or not, and whether it succeeded * or not, let's see whether a suitable cmap is installed on the X server. */ if ((Ahpmap != None && XGetRGBColormaps(dpy, root, &standardCmaps, &nCmaps, Ahpmap)) || XGetRGBColormaps(dpy, root, &standardCmaps, &nCmaps, XA_RGB_DEFAULT_MAP) ) { for(i = 0; i < nCmaps; i++) if (standardCmaps[i].visualid == vi->visualid) { cm = standardCmaps[i].colormap; XFree(standardCmaps); return cm; } } if (vi->visual == DefaultVisual(dpy, vi->screen)) return DefaultColormap(dpy, vi->screen); /* Oh well. Let's just create an uninitialized colormap and hope * for the best. This might be adequate if we've got a TrueColor or * other static visual. */ return XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone); } #endif /*MGOPENGL*/ /*****************************************************************************/ void ui_raise_window( int camid ) { struct camwins *cw; Widget w = camshellof( camid, &cw ); if (w != NULL && XtWindow(w) != None) { XRaiseWindow( dpy, XtWindow( w ) ); } } /*****************************************************************************/ static void ui_delete_camera(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { extern int real_id(int); gv_delete((int)(long)data); uistate.targetcam = INDEXOF(FOCUSID); ui_target_cameraspanel(real_id(FOCUSID)); if (w) { struct camwins *cw = NULL; if (camshellof((int)(long)data, &cw) != NULL && cw!=NULL) { #if MGOPENGL if (!gv_no_opengl) { if (cw->wins[SGL]) XtUnregister_window(dpy, cw->wins[SGL], w); if (cw->wins[DBL]) XtUnregister_window(dpy, cw->wins[DBL], w); } #endif cw->wins[SGL] = cw->wins[DBL] = 0; } XtDestroyWidget(w); } } /*****************************************************************************/ #if MGGL || MGOPENGL static int snapsetup(DView *dv) { int opts; int unset = 0; struct camwins *cw; struct timeval tdelay; #if MGOPENGL GLint bitsdeep; #endif if (camshellof(dv->id, &cw) == NULL) { OOGLError(1, "snapshot: no window for camera %s?", dv->name[1]); return -1; } mgctxselect(dv->mgctx); mgctxget(MG_SETOPTIONS, &opts); #if MGOPENGL glGetIntegerv(GL_RED_BITS, &bitsdeep); if ((opts & MGO_DOUBLEBUFFER) && bitsdeep < 8) { mgctxset(MG_UNSETOPTIONS, MGO_DOUBLEBUFFER, MG_END); unset = MGO_DOUBLEBUFFER; } #endif #if MGGL if ((opts & MGO_DOUBLEBUFFER) && (getgdesc(GD_BITS_NORM_DBL_RED) < 8)) { mgctxset(MG_UNSETOPTIONS, MGO_DOUBLEBUFFER, MG_END); unset = MGO_DOUBLEBUFFER; } #endif/*MGGL*/ XRaiseWindow(dpy, cw->shellwin); /* Ensure window fully visible */ XSync(dpy, False); /* Raise it right now */ gv_redraw(dv->id); /* schedule redraw */ /* Short pause while window manager raises window. * Unfortunately I know of no way to tell when this happens; * we might not even get an Expose event if we're already * unobscured. Sigh. -slevy */ /* Note: we can't call 'select' below with '&delay' as the last arg, because * the final arg has to be a pointer to a struct timeval, and on 64-bit systems * a struct timeval isn't the same as an array of 2 ints. Changed to use &tdelay * by mbp on Tue Oct 3 10:19:56 2006. */ #define DELAY_US 200000 /* 0.2 second */ tdelay.tv_sec = 0; tdelay.tv_usec = DELAY_US; select(0,NULL,NULL,NULL,&tdelay); gv_draw(dv->id); /* draw window now */ #if MGGL finish(); #endif #if MGOPENGL glFinish(); #endif return unset; } int ui_ppmscreensnapshot(char *fname, int id, DView *dv, WnWindow *wn, WnPosition *wp) { FILE *f; char *data; int unset, xsize, ysize, row, i; int failed = 1; if (gv_no_opengl) { OOGLError(0, "OpenGL disabled via command-line switch. " "Screen snapshots are only implemented for OpenGL.\n"); return failed; } unset = snapsetup(dv); if (unset < 0) return -1; if (fname[0] == '|') f = popen(fname+1, "w"); else f = fopen(fname, "w"); if (f == NULL) { OOGLError(0, "snapshot ... ppmscreen: can't create %s: %s", fname, sperror()); goto done; } xsize = wp->xmax - wp->xmin + 1; ysize = wp->ymax - wp->ymin + 1; fprintf(f, "P6\n# Geomview Snapshot of %s\n%d %d\n255\n", dv->name[1], xsize, ysize); #if MGOPENGL row = xsize*3; data = OOGLNewNE(char, row*ysize, "snapshot data"); glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0, 0, xsize, ysize, GL_RGB, GL_UNSIGNED_BYTE, data); for(i = ysize; --i >= 0; ) { if (fwrite(data+i*row, row, 1, f) <= 0) break; } #endif /*MGOPENGL*/ #if MGGL row = xsize*4; data = OOGLNewNE(char, row*ysize, "snapshot data"); readdisplay(wp->xmin, wp->ymin, wp->xmax, wp->ymax, (unsigned long *)data, 0); for(i = ysize; --i >= 0; ) { char *p = data + i*row; j = xsize; do { putc(p[3], f); putc(p[2], f); putc(p[1], f); p += 4; } while(--j > 0); } #endif /*MGGL*/ OOGLFree(data); failed = (fname[0] == '|') ? pclose(f) : fclose(f); if (failed) { OOGLError(0, "snapshot: Error writing to %s: %s", fname, sperror()); } done: if (unset) mgctxset(MG_SETOPTIONS, unset, MG_END); return failed; } #if MGOPENGL && MESAGL && HAVE_LIBOSMESA #include int ui_ppmmesasnapshot(char *fname, int id, DView *dv, WnWindow *wn, WnPosition *wp) { static OSMesaContext osmctx, sharectx; static mgcontext *osmmgctx; FILE *f; int opts; char *data; int xsize, ysize, row, i, j; mgcontext *oldmgctx = dv->mgctx; Camera *cam = NULL; Appearance *ap; WnWindow *win; WnPosition vp; int mgspace; float pixaspect, frameaspect; mgshadefunc shader = NULL; int failed = 1; if (gv_no_opengl) { OOGLError(0, "OpenGL disabled via command-line switch. " "Screen snapshots are only implemented for OpenGL.\n"); return failed; } mgctxget(MG_GLXSHARECTX, &sharectx); xsize = wp->xmax - wp->xmin + 1; ysize = wp->ymax - wp->ymin + 1; mgctxget(MG_CAMERA, &cam); mgctxget(MG_SPACE, &mgspace); mgctxget(MG_SHADER, &shader); /* Copy so that changed flags are set */ ap = ApCopy(mggetappearance(), NULL); mgctxget(MG_WINDOW, &win); win = WnCopy(win); vp.xmin = vp.ymin = 0; vp.xmax = xsize; vp.ymax = ysize; WnSet(win, WN_CURPOS, wp, WN_VIEWPORT, &vp, WN_END); if (osmctx == 0) osmctx = OSMesaCreateContext(OSMESA_RGBA, sharectx); row = xsize * 4; data = OOGLNewNE(char, row*ysize, "snapshot data"); if (!OSMesaMakeCurrent( osmctx, data, GL_UNSIGNED_BYTE, xsize, ysize )) { OOGLError(0, "snapshot ... ppmmesa: can't create off-screen Mesa context"); OOGLFree(data); return failed; } if (fname[0] == '|') f = popen(fname+1, "w"); else f = fopen(fname, "w"); if (f == NULL) { OOGLError(0, "snapshot ... ppmmesa: can't create %s: %s", fname, sperror()); return failed; } mgdevice_OPENGL(); if (osmmgctx == NULL) { osmmgctx = mgctxcreate( MG_GLXDOUBLECTX, osmctx, MG_GLXDOUBLEWIN, -1, MG_GLXSINGLECTX, osmctx, MG_GLXSINGLEWIN, -1, MG_END); } else { mgctxselect(osmmgctx); } dv->mgctx = osmmgctx; mgctxset( MG_CAMERA, cam, MG_APPEAR, ap, MG_WINDOW, win, MG_BACKGROUND, &dv->backcolor, MG_SPACE, mgspace, MG_SHADER, shader, MG_END); mgreshapeviewport(); /* Make camera aspect match window */ { /* Try to be as realistic as possible when dumping a snapshot. * Create a drawing context, install (hopefully) all the * attributes that draw_view() doesn't reset on its own, * plug the ctx into the camera, and force a redraw. * Then undo the subterfuge. */ int oldredraw = dv->redraw; int oldchanged = dv->changed; gv_redraw(dv->id); gv_draw(dv->id); dv->redraw = oldredraw, dv->changed = oldchanged; } fprintf(f, "P6\n# Geomview Snapshot of %s\n%d %d\n255\n", dv->name[1], xsize, ysize); for(i = ysize; --i >= 0; ) { char *rgba = data + i*row; for(j = 0; j < xsize; j++, rgba += 4) { putc(rgba[0], f); putc(rgba[1], f); putc(rgba[2], f); } } OOGLFree(data); ApDelete(ap); dv->mgctx = oldmgctx; failed = (fname[0] == '|') ? pclose(f) : fclose(f); if (failed) { OOGLError(0, "snapshot: Error writing to %s: %s", fname, sperror()); } return failed; } #endif /*MESA -- ppmmesasnapshot*/ #if MGOPENGL && HAVE_GLXCREATEGLXPIXMAP int ui_ppmglxsnapshot(char *fname, int id, DView *dv, WnWindow *wn, WnPosition *wp) { static mgcontext *osglxmgctx; struct camwins *cw; GLXContext osglxctx; Pixmap pixmap; GLXPixmap glxpixmap; FILE *f; char *data; int xsize, ysize, row, i; mgcontext *oldmgctx = dv->mgctx; Camera *cam = NULL; Appearance *ap; WnWindow *win; WnPosition vp; int mgspace; mgshadefunc shader = NULL; int failed = 1; if (gv_no_opengl) { OOGLError(0, "OpenGL disabled via command-line switch. " "Screen snapshots are only implemented for OpenGL.\n"); return failed; } if (camshellof(dv->id, &cw) == NULL) { OOGLError(1, "snapshot: no window for camera %s?", dv->name[1]); return -1; } xsize = wp->xmax - wp->xmin + 1; ysize = wp->ymax - wp->ymin + 1; mgctxget(MG_CAMERA, &cam); mgctxget(MG_SPACE, &mgspace); mgctxget(MG_SHADER, &shader); mgctxget(MG_GLXSINGLECTX, &osglxctx); mgctxget(MG_WINDOW, &win); ap = ApCopy(mggetappearance(), NULL); win = WnCopy(win); vp.xmin = vp.ymin = 0; vp.xmax = xsize; vp.ymax = ysize; WnSet(win, WN_CURPOS, wp, WN_VIEWPORT, &vp, WN_END); /* Create an X11 pixmap and a GLX pixmap to render to */ pixmap = XCreatePixmap(dpy, cw->shellwin, xsize, ysize, cw->vi[SGL]->depth); if (pixmap == 0) { return failed; } glxpixmap = glXCreateGLXPixmap(dpy, cw->vi[SGL], pixmap); if (glxpixmap == 0) { XFreePixmap(dpy, pixmap); return failed; } if (!glXMakeCurrent(dpy, glxpixmap, osglxctx)) { XFreePixmap(dpy, pixmap); glXDestroyGLXPixmap(dpy, glxpixmap); return failed; } if (fname[0] == '|') { f = popen(fname+1, "w"); } else { f = fopen(fname, "w"); } if (f == NULL) { OOGLError(0, "snapshot ... ppmmesa: can't create %s: %s", fname, sperror()); XFreePixmap(dpy, pixmap); glXDestroyGLXPixmap(dpy, glxpixmap); return failed; } mgdevice_OPENGL(); if (osglxmgctx == NULL) { osglxmgctx = mgctxcreate(MG_GLXDOUBLEWIN, -1, MG_GLXSINGLEWIN, -1, MG_GLXSINGLECTX, osglxctx, MG_UNSETOPTIONS, MGO_DOUBLEBUFFER, MG_END); } else { mgctxselect(osglxmgctx); } dv->mgctx = osglxmgctx; mgctxset(MG_GLXSINGLECTX, osglxctx, MG_CAMERA, cam, MG_APPEAR, ap, MG_WINDOW, win, MG_BACKGROUND, &dv->backcolor, MG_SPACE, mgspace, MG_SHADER, shader, MG_END); mgreshapeviewport(); /* Make camera aspect match window */ { /* Try to be as realistic as possible when dumping a snapshot. * Create a drawing context, install (hopefully) all the * attributes that draw_view() doesn't reset on its own, * plug the ctx into the camera, and force a redraw. * Then undo the subterfuge. */ int oldredraw = dv->redraw; int oldchanged = dv->changed; gv_redraw(dv->id); gv_draw(dv->id); dv->redraw = oldredraw, dv->changed = oldchanged; } fprintf(f, "P6\n# Geomview Snapshot of %s\n%d %d\n255\n", dv->name[1], xsize, ysize); row = xsize*3; data = OOGLNewNE(char, row*ysize, "snapshot data"); glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0, 0, xsize, ysize, GL_RGB, GL_UNSIGNED_BYTE, data); for(i = ysize; --i >= 0; ) { if (fwrite(data+i*row, row, 1, f) <= 0) { break; } } OOGLFree(data); XFreePixmap(dpy, pixmap); glXDestroyGLXPixmap(dpy, glxpixmap); ApDelete(ap); dv->mgctx = oldmgctx; failed = (fname[0] == '|') ? pclose(f) : fclose(f); if (failed) { OOGLError(0, "snapshot: Error writing to %s: %s", fname, sperror()); } return failed; } #endif /* GLX offscreen snapshot */ #include int ui_sgisnapshot(char *fname, int id, DView *dv, WnWindow *wn, WnPosition *wp) { int pid, wpid, unset; char x0[12], x1[12], y0[12], y1[12]; void (*oldchld)(); int failed = 1; int status; unset = snapsetup(dv); if (unset < 0) return -1; sprintf(x0, "%d", wp->xmin); sprintf(x1, "%d", wp->xmax); sprintf(y0, "%d", wp->ymin); sprintf(y1, "%d", wp->ymax); oldchld = signal(SIGCHLD, SIG_DFL); switch(pid = fork()) { case -1: OOGLError(0, "snapshot: can't fork to create \"scrsave\" subprocess: %s", sperror()); break; case 0: execlp("scrsave", "scrsave", fname, x0, x1, y0, y1, NULL); OOGLError(0, "snapshot: can't exec 'scrsave': %s", sperror()); exit(1); default: while((wpid = wait(&status)) != pid && wpid != -1) ; failed = status; } signal(SIGCHLD, oldchld); if (unset) mgctxset(MG_SETOPTIONS, unset, MG_END); return failed; } snap_entry snapshot_table[] = { { ui_ppmscreensnapshot, "ppmscreen" }, { ui_sgisnapshot, "sgiscreen" }, #if MGOPENGL && MESAGL && HAVE_LIBOSMESA { ui_ppmmesasnapshot, "ppmosmesa" }, #endif #if MGOPENGL && HAVE_GLXCREATEGLXPIXMAP { ui_ppmglxsnapshot, "ppmosglx" }, #endif { NULL, NULL } }; void ui_init_snaphelp() { LHelpRedef("snapshot", "(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])\n" "Save a snapshot of CAM-ID in the FILENAME (a string). The FORMAT \ argument is optional; it may be \"ppmscreen\" (the default), \"ps\", \ \"ppm\", \"sgi\" (on SGI machines), \"ppmosmesa\" (if built with \ libOSMesa) or \"ppmosglx\". A \"ppmscreen\" snapshot is created by \ reading the image directly from the given window; the window is popped \ above other windows and redrawn first, then its contents are written \ as a PPM format image. A \"ppmosmesa\" snapshot is drawn by Mesa's \ software renderer into a memory buffer in RAM. A \"ppmosglx\" snapshot \ is rendered into a GLX Pixmap buffer, which is also off-screen but \ may or may not reside in video RAM. Rendering may or may not be \ accelerated. The problem with on-screen snapshots is that the window \ must be mapped and not obscured by other windows. So on-screen \ snapshots will not work in the background, or when a screen safer is \ active. With \"ps\", dumps a Postscript picture representing the view \ from that window; hidden-surface removal might be incorrect. With \ \"ppm\", dumps a PPM-format image produced by geomview's internal \ software renderer; this may be of arbitrary size. If the FILENAME \ argument begins with \"|\", it's interpreted as a /bin/sh command to \ which the PPM or PS data should be piped. Optional XSIZE and YSIZE \ values are relevant only for \"ppm\" formats, and render to a window \ of that size (or scaled to that size, with aspect fixed, if only XSIZE \ is given)"); } #else /* only MGX11 */ snap_entry snapshot_table[] = { {NULL, NULL} }; void ui_init_snaphelp() { LHelpDef("snapshot", "(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])\n" "Save a snapshot of CAM-ID in the FILENAME (a string). The\n" "FORMAT argument is optional; it may be \"ppm\" (the default) or \"ps\".\n" "With \"ps\", dumps a Postscript picture representing the view from\n" "that window; hidden-surface removal might be incorrect.\n" "With \"ppm\", dumps a PPM-format image produced by geomview's internal\n" "software renderer; this may be of arbitrary size.\n" "If the FILENAME argument begins with \"|\", it's interpreted as a /bin/sh\n" "command to which the PPM or PS data should be piped.\n" "Optional XSIZE and YSIZE values are relevant only for \"ppm\" format,\n" "and render to a window of that size (or scaled to that size,\n" "with aspect fixed, if only XSIZE is given)." ); } #endif /* MGX11 */ /*****************************************************************************/ /*****************************************************************************/ /* These routines live here just to keep all MG-type dependencies in one file. */ Pixel ui_RGB(Colormap cm, int permanent, float r, float g, float b) { static XColor tcol; static int wasalloced = 0; XColor pcol; XColor *col = permanent ? &pcol : &tcol; Visual *vis = ((cm == gvcolormap) ? /* Guess which visual it's on! */ gvvisual : DefaultVisual(dpy, DefaultScreen(dpy))); if (!permanent) { if (wasalloced) { XFreeColors(dpy, cm, &tcol.pixel, 1, 0); wasalloced = 0; } #if MGX11 if (vis->class == PseudoColor) return mgx11_setRGB((int)(255.0 * r), (int)(255.0 * g), (int)(255.0 * b)); #endif } col->red = (unsigned short)(r*65535.0); col->green = (unsigned short)(g*65535.0); col->blue = (unsigned short)(b*65535.0); if (XAllocColor(dpy, cm, col)) { if (!permanent && (vis->class & 1) != 0) wasalloced = 1; /* XAllocColor only really allocates in dynamic visuals */ return col->pixel; } /* give up. */ return r+g+b>.5 ? WhitePixel(dpy, DefaultScreen(dpy)) : BlackPixel(dpy, DefaultScreen(dpy)); } /*****************************************************************************/ /* This one gets called both as an event handler and as a plain callback; * don't rely on the ev or cont fields. */ void cam_expose(Widget w, XtPointer data, XEvent *ev, Boolean *cont) { int id = (int)(long) data; DView *dv = (DView *)drawer_get_object(id); if (!ISCAM(id) || dv == NULL || dv->mgctx == NULL) return; if (gv_no_opengl) { #if MGX11 mgctxselect(dv->mgctx); mgctxset(MG_X11EXPOSE, MG_END); #endif } gv_redraw(id); } void cam_resize(Widget w, XtPointer id, XmDrawingAreaCallbackStruct *cbs) { #if MGOPENGL /* Do the work the GLwDrawA widget would have done: resize our subwindows */ struct camwins *cw; if (!gv_no_opengl) { if (camshellof((int)(long)id, &cw) != NULL) fitwins(w, cw); } #endif } /*****************************************************************************/ void ui_find_visual() { int result; if (!gv_no_opengl) { #if MGGL || MGOPENGL gvvisual = DefaultVisual(dpy, DefaultScreen(dpy)); gvcolormap = DefaultColormap(dpy, DefaultScreen(dpy)); gvbitdepth = DefaultDepth(dpy, DefaultScreen(dpy)); #endif } else { #if MGX11 result = mgx11_getvisual(dpy, &gvvisual, &gvcolormap, &gvbitdepth); if (result == MG_X11VISFAIL) { OOGLError(0, "X-Geomview currently supports only 24, 16, 8, and 1 bit\n" "\tdeep displays. No supported display depth was found."); exit(1); } else { if (result == MG_X11VISPRIVATE) { gvpriv = 1; OOGLError(0, "Not enough colors available. Using private colormap."); } else { return; } } #endif } } /*****************************************************************************/ LDEFINE(bgimagefile, LSTRING, "(background-image CAMID [filename])\n\ Paint that image on the background of that camera window.\n\ Currently works only with GL and OpenGL graphics.\n\ Use \"\" for filename to remove background. With no arguments,\n\ returns name of that window's current background image, or \"\".") { char *fname = NULL; int camid; DView *dv; LDECLARE(("background-image", LBEGIN, LID, &camid, LOPTIONAL, LSTRING, &fname, LEND)); #if MGOPENGL || MGGL dv = (DView *)drawer_get_object(camid); if (dv == NULL || !ISCAM(dv->id) || dv->mgctx == NULL) return Lnil; mgctxselect(dv->mgctx); if (fname != NULL) { char *tfname = (fname && fname[0] != '\0') ? fname : NULL; if (tfname) { tfname = findfile(NULL, tfname); if (tfname == NULL) { OOGLError(0, "background-image: Can't use image file %s: %s", fname, sperror()); } } mgctxset(MG_BGIMAGEFILE, tfname, MG_END); gv_redraw(camid); return fname ? Lt : Lnil; } else { mgctxget(MG_BGIMAGEFILE, &fname); return LNew(LSTRING, &fname); } #else OOGLError(0, "Sorry, background-image only supported with GL and OpenGL graphics"); return Lnil; #endif } /*****************************************************************************/ void ui_curson(int on) { Widget w; struct camwins *cw; Cursor c; if ((w = camshellof(real_id(FOCUSID), &cw)) == NULL || XtWindow(w) == None) return; if (on < 0) on = !cw->curs; if (on > 1) { if (cursors[1].c) XFreeCursor(dpy, cursors[1].c); cursors[1].id = on; cursors[1].c = XCreateFontCursor(dpy, cursors[1].id); on = 1; } if (on == 0 && cursors[0].c == 0) { /* Need to create blank cursor */ Pixmap pix = XCreatePixmap(dpy, XtWindow(w), 1, 1, 1); XColor col; col.pixel = WhitePixelOfScreen(XtScreen(w)); cursors[0].c = XCreatePixmapCursor(dpy, pix, pix, &col, &col, 0, 0); } cw->curs = on; c = cursors[on].c; XDefineCursor(dpy, XtWindow(w), c); if (cw->wins[SGL]) XDefineCursor(dpy, cw->wins[SGL], c); if (cw->wins[DBL]) XDefineCursor(dpy, cw->wins[DBL], c); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/x11/gvcommands.c0000644000175000001440000001411210622716746016372 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/comm.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Commands.mib" #include "bitmaps/up_arrow" #include "bitmaps/down_arrow" extern HandleOps CommandOps; extern Display *dpy; extern Pixmap geomicon; /* private methods and variables */ /*****************************************************************************/ static void command_input(Widget, XtPointer, XmAnyCallbackStruct *); static void command_scroll(Widget, XtPointer, XmListCallbackStruct *); static void command_up(Widget, XtPointer, XmAnyCallbackStruct *); static void command_down(Widget, XtPointer, XmAnyCallbackStruct *); static int num_items; /*static int pos_later = 0, posx = 0, posy = 0; static char geometry[40];*/ /*****************************************************************************/ void ui_load_commandspanel() { int depth; Widget commandsform, commscroll, commtext, HideButton, temp; Pixel fg, bg; Pixmap button_pix; mib_Widget *commandsload; static char Commands[] = "Commands"; /*****************************************************************************/ ui_make_panel_and_form(Commands, Root, False, True, &commandsform); /*commandsload = mib_load_interface(commandsform, "interface/Commands.mib", MI_FROMFILE);*/ commandsload = mib_load_interface(commandsform, Root, MI_FROMSTRING); XtManageChild(commandsform); /*****************************************************************************/ HideButton = mib_find_name(commandsload, "HideButton")->me; XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer)Commands); commtext = mib_find_name(commandsload, "CommandText")->me; commscroll = mib_find_name(commandsload, "CommandScroll")->me; XtAddCallback(commtext, XmNactivateCallback, (XtCallbackProc) command_input, (XtPointer) commscroll); XtAddCallback(commscroll, XmNbrowseSelectionCallback, (XtCallbackProc) command_scroll, (XtPointer) commtext); temp = mib_find_name(commandsload, "UpButton")->me; XtVaGetValues(temp, XmNforeground, &fg, XmNbackground, &bg, XmNdepth, &depth, NULL); button_pix = XCreatePixmapFromBitmapData(dpy, DefaultRootWindow(dpy), (char *)up_arrow_bits, up_arrow_width, up_arrow_height, fg, bg, depth); XtVaSetValues(temp, XmNlabelType, XmPIXMAP, XmNlabelPixmap, button_pix, NULL); XtAddCallback(temp, XmNactivateCallback, (XtCallbackProc) command_up, (XtPointer) commscroll); temp = mib_find_name(commandsload, "DownButton")->me; XtVaGetValues(temp, XmNforeground, &fg, XmNbackground, &bg, XmNdepth, &depth, NULL); button_pix = XCreatePixmapFromBitmapData(dpy, DefaultRootWindow(dpy), (char *)down_arrow_bits, down_arrow_width, down_arrow_height, fg, bg, depth); XtVaSetValues(temp, XmNlabelType, XmPIXMAP, XmNlabelPixmap, button_pix, NULL); XtAddCallback(temp, XmNactivateCallback, (XtCallbackProc) command_down, (XtPointer) commscroll); num_items = 0; } /*****************************************************************************/ static void command_input(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { Widget commscroll = (Widget)data; XmString addlist; char *str; str = XmTextFieldGetString(w); if (!strlen(str)) { XtFree(str); return; } comm_object(str, &CommandOps, NULL, NULL, COMM_NOW); addlist = XmStringCreate(str, XmSTRING_DEFAULT_CHARSET); XtFree(str); XmListAddItemUnselected(commscroll, addlist, 0); num_items++; } /*****************************************************************************/ static void command_scroll(Widget w, XtPointer data, XmListCallbackStruct *cbs) { Widget commtext = (Widget)data; char *temp; if (!XmStringGetLtoR(cbs->item, XmSTRING_DEFAULT_CHARSET, &temp)) return; if (!*temp) return; XmTextFieldSetString(commtext, temp); XtFree(temp); } /*****************************************************************************/ static void command_up(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { Widget commscroll = (Widget)data; int *poslist, poscount, pos; if (!XmListGetSelectedPos(commscroll, &poslist, &poscount)) { if (!num_items) return; XmListSelectPos(commscroll, 0, True); } if (!poscount) return; pos = poslist[0]-1; if (pos<0) pos = num_items-1; if (pos<0) pos = 0; XmListSelectPos(commscroll, pos, True); } /*****************************************************************************/ static void command_down(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { Widget commscroll = (Widget)data; int *poslist, poscount, pos; if (!XmListGetSelectedPos(commscroll, &poslist, &poscount)) { if (!num_items) return; XmListSelectPos(commscroll, 0, True); } if (!poscount) return; pos = poslist[0]+1; if (pos>num_items) pos = 1; XmListSelectPos(commscroll, pos, True); } /*****************************************************************************/ geomview-1.9.4/src/bin/geomview/x11/gvappear.c0000644000175000001440000002506010622716746016045 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/ui.h" #include "gvui.h" #include static /* prefix to ``char Root[]...'' */ #include "interface/Appearance.mib" extern Display *dpy; extern Pixmap geomicon; /* private methods and variables */ /*****************************************************************************/ static void revert_appearance(Widget, XtPointer, XmAnyCallbackStruct *); void ap_toggle(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void ap_color(Widget, XtPointer, XmAnyCallbackStruct *); static void list_callbacks(Widget, XtPointer, XmListCallbackStruct *); static void text_callbacks(Widget, XtPointer, XmAnyCallbackStruct *); static Widget NormalList, ShadeList, OverrideToggle, FaceToggle, FaceColor, EdgeToggle, EdgeColor, NormalToggle, NormalColor, BBoxToggle, BBoxColor, VectToggle, TexToggle, TexQToggle, ShadeLineToggle, ConcaveToggle, FacingNormalsToggle, BezDiceInput, NormalScaleInput, LineWidthInput; static int NormalListSet = -1, ShadeListSet = -1; static int FaceSet = 0, EdgeSet = 0, NormalSet = 0, BBoxSet = 0, VectSet = 0, TexSet = 0, TexQSet = 0, ConcaveSet = 0, FacingNormalsSet = 0, OverrideSet = 0; static int app_loaded = 0; static char AppearancE[] = "Appearance"; /*****************************************************************************/ static struct awid { enum what { TOG, BTN, TXT, LST } type; char *name; Widget *widp; void (*callback)(); XtPointer cbdata; } awidgets[] = { {BTN, "HideButton", NULL, ui_hide, AppearancE }, {BTN, "RevButton", NULL, revert_appearance, NULL }, {TOG, "OverrideToggle",&OverrideToggle,ap_toggle,(XtPointer)DRAWER_APOVERRIDE }, {TOG, "TexToggle", &TexToggle, ap_toggle, (XtPointer)DRAWER_TEXTUREDRAW }, {TOG, "TexQToggle", &TexQToggle, ap_toggle, (XtPointer)DRAWER_TEXTUREQUAL }, {TOG, "ShadeLineToggle",&ShadeLineToggle,ap_toggle,(XtPointer)DRAWER_SHADELINES }, {TOG, "ConcaveToggle",&ConcaveToggle,ap_toggle,(XtPointer)DRAWER_CONCAVE }, {TOG, "FacingNormalsToggle",&FacingNormalsToggle,ap_toggle, (XtPointer)DRAWER_EVERT }, {TOG, "VectToggle",&VectToggle, ap_toggle, (XtPointer)DRAWER_VECTDRAW }, {TOG, "BBoxToggle",&BBoxToggle, ap_toggle, (XtPointer)DRAWER_BBOXDRAW }, {TOG, "NormalToggle",&NormalToggle,ap_toggle,(XtPointer)DRAWER_NORMALDRAW }, {TOG, "FaceToggle",&FaceToggle, ap_toggle, (XtPointer)DRAWER_FACEDRAW }, {TOG, "EdgeToggle",&EdgeToggle, ap_toggle, (XtPointer)DRAWER_EDGEDRAW }, {BTN, "BBoxColor",&BBoxColor, ap_color, (XtPointer)DRAWER_BBOXCOLOR }, {BTN, "NormalColor",&NormalColor,ap_color,(XtPointer)DRAWER_NORMALCOLOR }, {BTN, "FaceColor",&FaceColor, ap_color, (XtPointer)DRAWER_DIFFUSE }, {BTN, "EdgeColor",&EdgeColor, ap_color, (XtPointer)DRAWER_EDGECOLOR }, {TXT, "DiceInput",&BezDiceInput, text_callbacks, (XtPointer)DRAWER_BEZDICE }, {TXT, "NormInput",&NormalScaleInput, text_callbacks, (XtPointer)DRAWER_NORMSCALE }, {TXT, "LineInput",&LineWidthInput, text_callbacks, (XtPointer)DRAWER_LINEWIDTH }, {LST, "NormList",&NormalList,list_callbacks, (XtPointer)DRAWER_NORMALIZATION }, {LST, "ShadeList",&ShadeList,list_callbacks, (XtPointer)DRAWER_SHADING }, }; void ui_load_appearancepanel() { int i; Widget appform; struct awid *a; mib_Widget *appload; /*****************************************************************************/ ui_make_panel_and_form(AppearancE, Root, False, True, &appform); /*appload = mib_load_interface(appform, "interface/Appearance.mib", MI_FROMFILE);*/ appload = mib_load_interface(appform, Root, MI_FROMSTRING); XtManageChild(appform); /*****************************************************************************/ NormalList = mib_find_name(appload, "NormList")->me; ShadeList = mib_find_name(appload, "ShadeList")->me; for(i = 0, a = awidgets; i < COUNT(awidgets); i++, a++) { Widget w = mib_find_name(appload, a->name)->me; if (a->widp) *a->widp = w; switch(a->type) { case BTN: XtAddCallback(w, XmNactivateCallback, (XtCallbackProc) a->callback, a->cbdata); break; case TOG: XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc) a->callback, a->cbdata); break; case TXT: XtAddCallback(w, XmNactivateCallback, (XtCallbackProc)a->callback, a->cbdata); XtAddCallback(w, XmNlosingFocusCallback, (XtCallbackProc)a->callback, a->cbdata); break; case LST: XtAddCallback(w, XmNbrowseSelectionCallback, (XtCallbackProc) a->callback, a->cbdata); } } ui_build_browser(NormalList, COUNT(norm), norm); ui_build_browser(ShadeList, COUNT(shades), shades); app_loaded = 1; } /*****************************************************************************/ static void revert_appearance(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { drawer_set_ap( GEOMID(uistate.targetgeom), NULL, NULL ); } /*****************************************************************************/ static void ap_color(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { ui_pickcolor((int)(long)data); } /*****************************************************************************/ void ap_toggle(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { drawer_int(GEOMID(uistate.targetgeom), (DrawerKeyword)(long)data, cbs->set); } /*****************************************************************************/ static void set_toggle(Widget w, int *current, int val) { if (*current != (val != 0)) { *current = (val != 0); XmToggleButtonSetState(w, *current, False); } } void set_ap_toggle(Widget w, int *current, Appearance *ap, int flagbit) { set_toggle(w, current, (ap->flag & flagbit)); } /*****************************************************************************/ void ui_target_appearancepanel(int id) { if (!app_loaded) return; if (ISGEOM(id)) { DGeom *dg; Appearance *ap; int val; if ((dg = (DGeom *)drawer_get_object(id))) { ap = drawer_get_ap(id); set_ap_toggle(FaceToggle, &FaceSet, ap, APF_FACEDRAW); set_ap_toggle(EdgeToggle, &EdgeSet, ap, APF_EDGEDRAW); set_ap_toggle(NormalToggle, &NormalSet, ap, APF_NORMALDRAW); set_ap_toggle(VectToggle, &VectSet, ap, APF_VECTDRAW); set_ap_toggle(TexToggle, &TexSet, ap, APF_TEXTURE); set_ap_toggle(TexQToggle, &TexQSet, ap, APF_TXMIPMAP|APF_TXMIPINTERP|APF_TXLINEAR); set_ap_toggle(ConcaveToggle, &ConcaveSet, ap, APF_CONCAVE); set_ap_toggle(FacingNormalsToggle, &FacingNormalsSet, ap, APF_EVERT); set_toggle(OverrideToggle, &OverrideSet, uistate.apoverride); set_toggle(BBoxToggle, &BBoxSet, dg->bboxdraw); if ((val = (dg->normalization + 1)) != NormalListSet) { NormalListSet = val; XmListSelectPos(NormalList, val, False); } if ((val = (ap->shading - CONSTANTSHADE + 1)) != ShadeListSet) { ShadeListSet = val; XmListSelectPos(ShadeList, val, False); } ui_set_itext(BezDiceInput, ap->dice[0]); ui_set_ftext(NormalScaleInput, ap->nscale); ui_set_itext(LineWidthInput, ap->linewidth); } } } /*****************************************************************************/ static void list_callbacks(Widget w, XtPointer data, XmListCallbackStruct *cbs) { DrawerKeyword val = (DrawerKeyword)(long)data; int offset = 0; switch (val) { case DRAWER_NORMALIZATION: NormalListSet = offset = cbs->item_position - 1; break; case DRAWER_SHADING: ShadeListSet = offset = cbs->item_position - 1 + CONSTANTSHADE; break; default: OOGLError(1, "Bogus browser callback.\n"); return; } drawer_int(GEOMID(uistate.targetgeom), val, offset); } /*****************************************************************************/ static int getfloat(char *str, float *fp) { if (sscanf(str, "%f", fp)) return 1; else return 0; } /*****************************************************************************/ static void ui_float(char *str, DrawerKeyword key, int id, float min, float max) { float f; if (getfloat(str, &f)) { if (f < min) f = min; else if (f > max) f = max; drawer_float(id, key, f); } else { ui_select(id); } } /*****************************************************************************/ static int getint(char *str, int *ip) { char *after; *ip = strtol(str, &after, 0); return str != after; } /*****************************************************************************/ static void ui_int(char *str, DrawerKeyword key, int id, int min, int max) { int i; if (getint(str, &i)) { if (i < min) i = min; else if (i > max) i = max; drawer_int(id, key, i); } else { ui_select(id); } } /*****************************************************************************/ static void text_callbacks(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { DrawerKeyword val = (DrawerKeyword)(long)data; char *str; str = XmTextFieldGetString(w); XmTextFieldSetInsertionPosition(w, (XmTextPosition) 0); switch(val) { case DRAWER_BEZDICE: ui_int(str, val, GEOMID(uistate.targetgeom), 0, 999); break; case DRAWER_NORMSCALE: ui_float(str, val, GEOMID(uistate.targetgeom), 0.0, 999.0); break; case DRAWER_LINEWIDTH: ui_int(str, val, GEOMID(uistate.targetgeom), 1, 256); break; default: break; } XtFree(str); } /*****************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/x11/gvcolor.c0000644000175000001440000002061110622716746015710 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" #include "mg.h" #include "../common/drawer.h" #include "../common/lights.h" #include "../common/ui.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Color.mib" extern Display *dpy; extern GC mib_gc; extern Pixmap geomicon; /* public methods */ /*****************************************************************************/ void ui_config_colorpanel(char *, Color *, int, int, int); /* private methods and variables */ /*****************************************************************************/ extern Pixel ui_RGB(Colormap cmap, int permanent, float r, float g, float b); static void reset_color(Widget, XtPointer, XmAnyCallbackStruct *); static void rgb_sliders(Widget, XtPointer, XmScaleCallbackStruct *); static void set_rgb_sliders(Widget, XtPointer, XmAnyCallbackStruct *); static void tog_cmodel(Widget, XtPointer, XmAnyCallbackStruct *); static void show_settings(int changed); static void set_rgbtest(); static Widget shell, /*temp,*/ RGBText, HSVText, CModelButton, RGBTest; static struct cslider { char *slidername; char *labelname; Widget slider; Widget label; } sliders[] = { { "RScale", "RLabel" }, { "GScale", "GLabel" }, { "BScale", "BLabel" } }; static Window testwin; static Color oldc; static Color rgb, hsv; static enum Colormodel { CM_RGB, CM_HSV } colormodel = CM_RGB; static int myval, colortarget; /*****************************************************************************/ void ui_load_colorpanel() { int n; Widget colorform, DoneButton, CancelButton; mib_Widget *colorload; static char Colors[] = "Color"; /*****************************************************************************/ shell = ui_make_panel_and_form(Colors, Root, False, True, &colorform); /*colorload = mib_load_interface(colorform, "interface/Color.mib", MI_FROMFILE);*/ colorload = mib_load_interface(colorform, Root, MI_FROMSTRING); XtManageChild(colorform); /*****************************************************************************/ DoneButton = mib_find_name(colorload, "DoneButton")->me; CancelButton = mib_find_name(colorload, "CancelButton")->me; XtAddCallback(DoneButton, XmNactivateCallback, (XtCallbackProc) ui_hide, Colors); XtAddCallback(CancelButton, XmNactivateCallback, (XtCallbackProc) reset_color, NULL); for(n = 0; n < COUNT(sliders); n++) { struct cslider *cs = &sliders[n]; cs->slider = mib_find_name(colorload, cs->slidername)->me; cs->label = mib_find_name(colorload, cs->labelname)->me; XtAddCallback(cs->slider, XmNdragCallback, (XtCallbackProc) rgb_sliders, (XtPointer)(long)n); XtVaSetValues(cs->slider, XmNmaximum, 255, NULL); } RGBText = mib_find_name(colorload, "RGBText")->me; XtAddCallback(RGBText, XmNactivateCallback, (XtCallbackProc) set_rgb_sliders, (XtPointer) CM_RGB); HSVText = mib_find_name(colorload, "HSVText")->me; XtAddCallback(HSVText, XmNactivateCallback, (XtCallbackProc) set_rgb_sliders, (XtPointer) CM_HSV); CModelButton = mib_find_name(colorload, "ColorModel")->me; XtAddCallback(CModelButton, XmNactivateCallback, (XtCallbackProc)tog_cmodel, (XtPointer)NULL); /*****************************************************************************/ RGBTest = mib_find_name(colorload, "ColorTest")->me; tog_cmodel(NULL, NULL, NULL); /* Toggle cmodel button for consistent layout */ rgb.r = 0.0; rgb.g = 0.0; rgb.b = 0.0; oldc.r = 0.0; oldc.g = 0.0; oldc.b = 0.0; show_settings(0); } /*****************************************************************************/ void ui_show_colorpanel() { if(!XtIsRealized(shell)) { XSetWindowAttributes swa; XtRealizeWidget(shell); swa.colormap = gvcolormap; swa.backing_store = NotUseful; swa.background_pixel = swa.border_pixel = ui_RGB(gvcolormap, 0, 1., 1., 1.); testwin = XCreateWindow(dpy, XtWindow(RGBTest), 1, 1, 63-2, 95-2, 0, gvbitdepth, InputOutput, gvvisual, CWColormap|CWBackPixel|CWBorderPixel|CWBackingStore, &swa); XMapRaised(dpy, testwin); } XRaiseWindow(dpy, XtWindow(shell)); set_rgbtest(); /* Raise color test rectangle and set its color */ } /*****************************************************************************/ static void reset_color(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { int changed = memcmp(&rgb, &oldc, sizeof(Color)); rgb = oldc; rgb2hsv(&rgb, &hsv); if(changed) show_settings(1); ui_hide(w, "Color", NULL); } /*****************************************************************************/ static void tog_cmodel(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { static char *labels[] = { "RGB", "HSV" }; /* Indexed by CM_ colormodel */ char *abc = NULL, label[2]; XmString lbl; int i; colormodel = (colormodel == CM_RGB) ? CM_HSV : CM_RGB; abc = labels[colormodel]; lbl = XmStringCreateSimple(abc); XtVaSetValues(CModelButton, XmNlabelString, lbl, NULL); XmStringFree(lbl); for(i = 0; i < 3; i++) { label[0] = abc[i]; label[1] = '\0'; lbl = XmStringCreateSimple(label); XtVaSetValues(sliders[i].label, XmNlabelString, lbl, NULL); XmStringFree(lbl); } show_settings(0); } static void set_rgbtest() { if (XtIsRealized(shell)) { XSetWindowBackground(dpy, testwin, ui_RGB(gvcolormap, 0, rgb.r, rgb.g, rgb.b)); XMapRaised(dpy, testwin); XClearWindow(dpy, testwin); } } /*****************************************************************************/ static void show_settings(int changed) { char str[100]; float *cmc = (colormodel == CM_RGB) ? &rgb.r : &hsv.r; int i; sprintf(str, "%.3f %.3f %.3f", rgb.r, rgb.g, rgb.b); XmTextFieldSetString(RGBText, str); sprintf(str, "%.3f %.3f %.3f", hsv.r, hsv.g, hsv.b); XmTextFieldSetString(HSVText, str); set_rgbtest(); for(i = 0; i < 3; i++) { int v = 255 * cmc[i]; XmScaleSetValue(sliders[i].slider, v<0 ? 0 : v>255 ? 255 : v); } if(changed) drawer_color(colortarget, (DrawerKeyword)myval, &rgb); } /*****************************************************************************/ static void set_rgb_sliders(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { char *str; Color c; int ok = 0; str = XmTextFieldGetString(w); if (3 == sscanf(str,"%f %f %f", &c.r, &c.g, &c.b)) { ok = 1; switch((int)(long)data) { case CM_RGB: rgb = c; rgb2hsv(&rgb, &hsv); break; case CM_HSV: hsv = c; hsv2rgb(&hsv, &rgb); break; } } show_settings(ok); XtFree(str); } /*****************************************************************************/ static void rgb_sliders(Widget w, XtPointer data, XmScaleCallbackStruct *cbs) { float *cmc = (colormodel == CM_RGB) ? &rgb.r : &hsv.r; /* Set {rgb,hsv}.{r,g,b} according to current color model and callback-data */ cmc[(int)(long)data] = ((float)cbs->value)/255.0; if(colormodel == CM_RGB) rgb2hsv(&rgb, &hsv); else hsv2rgb(&hsv, &rgb); show_settings(1); } /*****************************************************************************/ void ui_config_colorpanel(char *name, Color *old, int index, int val, int id) { rgb = *old; oldc = *old; rgb2hsv(&rgb, &hsv); myval = val; colortarget = id; XtVaSetValues(shell, XmNtitle, name, NULL); show_settings(0); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/x11/Makefile.am0000644000175000001440000000162010604514317016112 00000000000000INCLUDES = $(default_includes) $(MOTIFINCLUDE) $(OPENGLINCLUDE) $(X_CFLAGS) -I.. SUBDIRS = bitmaps interface gvx_LDADD = ../common/libgvcommon.a buildinfo.o \ $(MOTIFUILIB) $(MOTIFLIBS) $(XMULIBS) $(OOGLLIB) $(XLIBS) gvx_DEPENDENCIES = ../common/libgvcommon.a buildinfo.o $(OOGLLIB) #gvx_LDFLAGS = -rpath $(libdir) module_PROGRAMS = gvx gvx_SOURCES =\ gvappear.c gvcameras.c gvcamui.c gvcolor.c gvcommands.c gvcredits.c\ gvevent.c gvfiles.c gvlights.c gvload.c gvmain.c gvmaterial.c gvmnpanel.c\ gvsave.c gvtoolui.c gvui.c gvui.h buildinfo.c: $(gvx_OBJECTS) ../common/libgvcommon.a (echo 'char builddate[] = "'"`date +%Y%m%d%H%M`"'";'; \ echo 'char buildinfo1[] = "'" By `whoami`@`hostname`[`uname -s`-`uname -r`]"'";'; \ echo 'char buildinfo2[] = "'" On `date`"'";'; \ ) > buildinfo.c ../clang.c ../clang.h: cd .. && $(MAKE) $(AM_MAKEFLAGS) clang DISTCLEANFILES = buildinfo.c clang.c clang.hgeomview-1.9.4/src/bin/geomview/x11/Makefile.in0000644000175000001440000005323310665240477016144 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ module_PROGRAMS = gvx$(EXEEXT) subdir = src/bin/geomview/x11 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(moduledir)" modulePROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(module_PROGRAMS) am_gvx_OBJECTS = gvappear.$(OBJEXT) gvcameras.$(OBJEXT) \ gvcamui.$(OBJEXT) gvcolor.$(OBJEXT) gvcommands.$(OBJEXT) \ gvcredits.$(OBJEXT) gvevent.$(OBJEXT) gvfiles.$(OBJEXT) \ gvlights.$(OBJEXT) gvload.$(OBJEXT) gvmain.$(OBJEXT) \ gvmaterial.$(OBJEXT) gvmnpanel.$(OBJEXT) gvsave.$(OBJEXT) \ gvtoolui.$(OBJEXT) gvui.$(OBJEXT) gvx_OBJECTS = $(am_gvx_OBJECTS) am__DEPENDENCIES_1 = DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(gvx_SOURCES) DIST_SOURCES = $(gvx_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) $(MOTIFINCLUDE) $(OPENGLINCLUDE) $(X_CFLAGS) -I.. SUBDIRS = bitmaps interface gvx_LDADD = ../common/libgvcommon.a buildinfo.o \ $(MOTIFUILIB) $(MOTIFLIBS) $(XMULIBS) $(OOGLLIB) $(XLIBS) gvx_DEPENDENCIES = ../common/libgvcommon.a buildinfo.o $(OOGLLIB) gvx_SOURCES = \ gvappear.c gvcameras.c gvcamui.c gvcolor.c gvcommands.c gvcredits.c\ gvevent.c gvfiles.c gvlights.c gvload.c gvmain.c gvmaterial.c gvmnpanel.c\ gvsave.c gvtoolui.c gvui.c gvui.h DISTCLEANFILES = buildinfo.c clang.c clang.h all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomview/x11/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomview/x11/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-modulePROGRAMS: $(module_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(modulePROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(moduledir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(modulePROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(moduledir)/$$f" || exit 1; \ else :; fi; \ done uninstall-modulePROGRAMS: @$(NORMAL_UNINSTALL) @list='$(module_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \ rm -f "$(DESTDIR)$(moduledir)/$$f"; \ done clean-modulePROGRAMS: @list='$(module_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done gvx$(EXEEXT): $(gvx_OBJECTS) $(gvx_DEPENDENCIES) @rm -f gvx$(EXEEXT) $(LINK) $(gvx_OBJECTS) $(gvx_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvappear.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvcameras.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvcamui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvcolor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvcommands.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvcredits.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvevent.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvfiles.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvlights.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvload.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvmain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvmaterial.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvmnpanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvsave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvtoolui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvui.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-modulePROGRAMS \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-modulePROGRAMS install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-modulePROGRAMS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ clean-modulePROGRAMS ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-modulePROGRAMS install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-modulePROGRAMS buildinfo.c: $(gvx_OBJECTS) ../common/libgvcommon.a (echo 'char builddate[] = "'"`date +%Y%m%d%H%M`"'";'; \ echo 'char buildinfo1[] = "'" By `whoami`@`hostname`[`uname -s`-`uname -r`]"'";'; \ echo 'char buildinfo2[] = "'" On `date`"'";'; \ ) > buildinfo.c ../clang.c ../clang.h: cd .. && $(MAKE) $(AM_MAKEFLAGS) clang # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomview/x11/gvui.c0000644000175000001440000007232010622716746015213 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mg.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/comm.h" #include "../common/space.h" #include "../common/lights.h" #include "../common/event.h" #include "../common/motion.h" #include "../common/worldio.h" #include "../common/lang.h" /* Geomview Icon */ #include "bitmaps/icon" #include #include #include #include #include "X11/IntrinsicP.h" /* for XtMoveWidget */ #include "mibload.h" #include "gvui.h" static char *x_application_name = "geomview"; /* used to be "gv" */ /******************************* Index defines *******************************/ #define BLACKINDEX 0 #define WHITEINDEX 7 #define FACEINDEX 250 #define EDGEINDEX 251 #define NORMALINDEX 252 #define BBOXINDEX 253 #define BACKINDEX 254 #define LIGHTINDEX 255 /****************************** Table of Panels ******************************/ static struct panel { char *name; char key[2]; int shown; /* Currently shown? Initial value is default. */ void (*show)(); void (*load)(); int position; int x, y; Widget shell; Widget formwantskeys; } panels[] = { { "\0", "", False, NULL, NULL, 0, 0, 0, NULL }, { "geomview", "Pm", True, NULL, ui_load_mainpanel, 0, 0, 0, NULL }, { "Tools", "Pt", True, NULL, ui_load_toolpanel, 0, 0, 0, NULL }, { "Appearance", "Pa", False, NULL, ui_load_appearancepanel, 0, 0, 0, NULL }, { "Cameras", "Pc", False, NULL, ui_load_cameraspanel, 0, 0, 0, NULL }, { "Lighting", "Pl", False, ui_show_lightspanel, ui_load_lightspanel, 0, 0, 0, NULL }, { "Commands", "PC", False, NULL, ui_load_commandspanel, 0, 0, 0, NULL }, { "Materials", "PM", False, NULL, ui_load_materialpanel, 0, 0, 0, NULL }, { "Credits", "PA", False, NULL, ui_load_creditspanel, 0, 0, 0, NULL }, { "Save", ">", False, ui_show_savepanel, ui_load_savepanel, 0, 0, 0, NULL }, { "Files", "Pf", False, ui_show_filespanel, ui_load_filespanel, 0, 0, 0, NULL }, { "Load", "<", False, ui_show_loadpanel, ui_load_loadpanel, 0, 0, 0, NULL }, { "Color", "", False, ui_show_colorpanel, ui_load_colorpanel, 0, 0, 0, NULL }, }; /************************** Global Widget Variables **************************/ Widget TopLevel, MainWindow, MainMenu, MainForm; XtAccelerators KeyAccels; Atom AProtocol; Arg args[20]; int n; XtAppContext App; extern Display *dpy; extern GC mib_gc; extern int real_id(int); Pixmap geomicon; /******************************* Global Variables ****************************/ int YScrnSize, XScrnSize; UIState uistate; int gvbitdepth; Visual *gvvisual; Colormap gvcolormap; int gvpriv=0; /*****************************************************************************/ void ui_select(int id); void ui_find_visual(); /*****************************************************************************/ static void set_x_application_name() { char *name = getenv("GEOMVIEW_X_NAME"); if ((name != NULL) && (strlen(name)>0)) { x_application_name = name; } /* else use default x_application_name set above */ } /*****************************************************************************/ static int panelsready = 0; void load_interface(argc, argv) unsigned int argc; char **argv; { String fallbacks[] = { "gv*fontList: -adobe-helvetica-medium-r-normal--14-*-*-*-p-*-iso8859-1", "*BorderWidth: 0", #ifdef dark_ui "*Foreground: gray20", "*Background: gray70", /* see if we can set shadow colors "*TopShadowColor: #fbfbfbfbfbfb", "*BottomShadowColor: #6b6b6b6b6b6b", */ /* "*Foreground: #000000", "*Background: #848484", */ #endif #ifdef light_ui "*Foreground: #000000000000", "*Background: #afafafafafaf", #endif "*XmToggleButton.selectColor: yellow", "*XmToggleButton.indicatorSize: 16", "*XmToggleButtonGadget.selectColor: yellow", "*XmToggleButtonGadget.indicatorSize: 16", "*fontList: -adobe-helvetica-medium-r-normal--14-*-*-*-p-*-iso8859-1", "gv*Load*fontList: -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1", "gv*Save*fontList: -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1", "Commands*fontList: -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1", "Tools*fontList: -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1", "*XmText*blinkRate: 0", /* Encourage old (???) versions of Motif to interpret our keyboard * shortcuts. It works in some situations, depending on just what * the cursor overlies. */ "*XmForm*accelerators: : GVKey()", "*XmFrame*translations: #override : GVKey()", "Geomview*KeyText*translations: #override : GVKey()", "Geomview*XmList*translations: #override : GVKey()", "Appearance*XmList*translations: #override : GVKey()", "Cameras*XmList*translations: #override : GVKey()", "Lights*XmList*translations: #override : GVKey()", "Credits*XmList*translations: #override : GVKey()", NULL }; static XtActionsRec actions[1] = { { "GVKey", key_action } }; static String keyaccels = { ": GVKey()" }; #if 0 static char *argvblah[] = { "Geomview", /* We turn off blinking text cursors for two reasons: * - Motif grabs the main loop if the cursor sits in a text box * for more than one blink cycle, and our graphics can't move. * - Much worse, SGI Motif under Irix 4 (at least) seems to fail to * remove its blink timer when we XtUnrealizeWidget the panel * containing it. So, moments later, we die of an X error * because of a reference to a bad window. * Disabling blink prevents all this. */ "-xrm", "*XmText*blinkRate: 0", /* Encourage old versions of Motif to interpret our keyboard shortcuts. * It works in some situations, depending on just what the cursor * overlies. */ "-xrm", "*XmForm*accelerators: : GVKey()", "-xrm", "*XmFrame*translations: #override\\n: GVKey()", "-xrm", "Geomview*KeyText*translations: : GVKey()", "-xrm", "Geomview*XmList*translations: ~s ~c ~m ~a :ListBeginSelect()\\n~s ~c ~m ~a :ListEndSelect()\\n: GVKey()", "-xrm", "Appearance*XmList*translations: ~s ~c ~m ~a :ListBeginSelect()\\n~s ~c ~m ~a :ListEndSelect()\\n: GVKey()", "-xrm", "Cameras*XmList*translations: ~s ~c ~m ~a :ListBeginSelect()\\n~s ~c ~m ~a :ListEndSelect()\\n: GVKey()", "-xrm", "Lights*XmList*translations: ~s ~c ~m ~a :ListBeginSelect()\\n~s ~c ~m ~a :ListEndSelect()\\n: GVKey()", "-xrm", "Credits*XmList*translations: ~s ~c ~m ~a :ListBeginSelect()\\n~s ~c ~m ~a :ListEndSelect()\\n: GVKey()", "-xrm", "", }; int argcblah = COUNT(argvblah); #endif /* Code for TopLevel */ /*****************************************************************************/ n = 0; set_x_application_name(); #if 1 TopLevel = XtAppInitialize(&App, x_application_name, NULL, 0, (int *)&argc, argv, fallbacks, args, n); #else if(getenv("GV_NO_X_MAGIC")) { TopLevel = XtAppInitialize(&App, x_application_name, NULL, 0, (int *)&argc, argv, fallbacks, args, n); } else { if(getenv("GVXRM")) argvblah[COUNT(argvblah)-1] = getenv("GVXRM"); TopLevel = XtAppInitialize(&App, x_application_name, NULL, 0, &argcblah /*&argc*/, argvblah /*argv*/, fallbacks, args, n); } #endif #if 0 if(getenv("GVXRM")) argvblah[COUNT(argvblah)-1] = getenv("GVXRM"); TopLevel = XtAppInitialize(&App, "gv", NULL, 0, &argcblah /*&argc*/, argvblah /*argv*/, fallbacks, args, n); #endif XtAppAddActions(App, actions, 1); KeyAccels = XtParseAcceleratorTable(keyaccels); dpy = XtDisplay(TopLevel); YScrnSize = XtScreen(TopLevel)->height; XScrnSize = XtScreen(TopLevel)->width; ui_find_visual(); geomicon = XCreatePixmapFromBitmapData(dpy, DefaultRootWindow(dpy), (char *)oogl_bits, oogl_width, oogl_height, WhitePixel(dpy, DefaultScreen(dpy)), BlackPixel(dpy, DefaultScreen(dpy)), DefaultDepth(dpy, DefaultScreen(dpy))); } /*****************************************************************************/ void ui_highlight(int newid) { int newtype = TYPEOF(newid); DGeom *dg; DView *v; static Color black = {0.0, 0.0, 0.0}; Color c; extern int mg_ctxselect(mgcontext *); if ( newtype == T_GEOM && (dg = (DGeom *) drawer_get_object(newid)) && dg->bboxap ) { c = uistate.pickedbboxcolor; gv_bbox_color( GEOMID(uistate.targetgeom), black.r, black.g, black.b ); gv_bbox_color( newid, c.r, c.g, c.b ); } else if (newtype == T_CAM) { /* pop cam window in case it's obscured */ v = (DView *) drawer_get_object(newid); if (v) { mg_ctxselect(v->mgctx); /* winset happens in here */ /* winpop */ } } } /*****************************************************************************/ void ui_action(int val) { } /*****************************************************************************/ void ui_mousefocus(int index) { uistate.mousefocus = index; if (uistate.targetcam == INDEXOF(FOCUSID)) { ui_select(CAMID(uistate.mousefocus)); } } LDEFINE(ui_cam_focus, LVOID, "(ui-cam-focus [focus-change|mouse-cross])\n" "Set the focus policy for the camera windows. The default is " "\"mouse-cross\": a camera is made the active camera (for interactive " "mouse events) when the mouse cursor crosses the window. Because " "this means it can become " "complicated to activate a specific camera (in the context of multiple " "camera windows) there is also the option to only change the camera " "focus when the window-manager decides to give it the focus for input " "events. So, after specifying \"focus-change\" it depends on the " "focus-change configuration of your window-manager when a camera " "becomes the active camera for mouse-interaction.") { Keyword policy = NO_KEYWORD; LDECLARE(("ui-cam-focus", LBEGIN, LKEYWORD, &policy, LEND)); if (policy != FOCUS_CHANGE_KEYWORD && policy != MOUSE_CROSS_KEYWORD) { OOGLError(1, "Wrong keyword, expected either \"%s\" or \"%s\"\n", keywordname(FOCUS_CHANGE_KEYWORD), keywordname(MOUSE_CROSS_KEYWORD)); return Lnil; } set_ui_wm_focus(policy == FOCUS_CHANGE_KEYWORD); return Lt; } /*****************************************************************************/ void ui_objectchange() { ui_adjustpicklist(-1); ui_adjustpicklist(uistate.targetid); } /*****************************************************************************/ void ui_maybe_refresh(int id) { if ( id==WORLDGEOM || id==GEOMID(uistate.targetgeom) || id==ALLGEOMS || id==TARGETGEOMID) { ui_select(GEOMID(uistate.targetgeom)); } else if( id==ALLCAMS || id==FOCUSID || id==TARGETCAMID || id==CAMID(uistate.targetcam) || id==CAMID(uistate.mousefocus) ) { ui_select(CAMID(uistate.targetcam)); } else { ui_select(NOID); } } /*****************************************************************************/ void ui_select(int id) { DObject *obj; if ((obj = drawer_get_object(uistate.targetid))) { ui_tool_targetset(drawer_id2name(obj->id)); ui_tool_centerset(drawer_id2name(uistate.centerid)); if (ISCAM(id)) ui_target_cameraspanel(id); if (ISGEOM(id)) { ui_target_appearancepanel(id); ui_target_materialpanel(id); } ui_refresh_mainpanel(id); } } /*****************************************************************************/ void ui_windowWillOpen(DView *dv) { ui_create_camera(MainWindow, dv); } /*****************************************************************************/ void ui_windowDidOpen(DView *dv) { } /*****************************************************************************/ void ui_showpanel(int index, int show) { struct panel *pan; if(index >= COUNT(panels) || index < 0) /* protect us from showing */ return; /* non-existent panels */ pan = &panels[index]; if(show < 0) show = !pan->shown; pan->shown = show; if(!panelsready) return; if (pan->shell == NULL) { /* or panels which have not */ if(pan->load == NULL || !show) /* yet been loaded */ return; silence_errors(); (*pan->load)(); resume_errors(); } if(show) { if(pan->position) { XtMoveWidget(pan->shell, pan->x, pan->y); pan->position = 0; } if(pan->show != NULL) /* Call any panel-specific pre-show func */ (*pan->show)(); XtRealizeWidget(pan->shell); XRaiseWindow(dpy, XtWindow(pan->shell)); } else { XtUnrealizeWidget(pan->shell); } } /*****************************************************************************/ LDEFINE(ui_target, LVOID, "(ui-target ID [yes|no])\n\ Set the target of user actions (the selected line of the\n\ target object browser) to ID. The second argument specifies\n\ whether to make ID the current object regardless of its type.\n\ If \"no\", then ID becomes the current object of its type\n\ (geom or camera). The default is \"yes\". This command may\n\ result in a change of motion modes based on target choice.") { int id, newtype; Keyword immediate_kw = YES_KEYWORD; bool immediate; LDECLARE(("ui-target", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &immediate_kw, LEND)); immediate = boolval("ui-target", immediate_kw); newtype = TYPEOF(id); if (id == uistate.targetid ) return Lt; if (drawer_get_object(id) == NULL || (id == TARGETID) || (id == CENTERID) || (id == SELF) || (id == UNIVERSE) || (id == PRIMITIVE)) { return Lt; } if (immediate) { /* ui_highlight must be called before set_ui_target_id */ /* freeze the browser so old target name doesn't flash during highlight. */ ui_highlight(id); set_ui_target_id( id ); ui_adjustpicklist(id); if (ISGEOM(id)) { uistate.targetcam = INDEXOF(FOCUSID); ui_select(real_id(FOCUSID)); } else if(ISCAM(id)) { ui_raise_window( real_id(id) ); } ui_select( id ); } else { /* immediate == NOIMMEDIATE: for cases like deleting geometry * with the command language when current target is a camera. * update targettype but don't change browser. */ switch (newtype) { case T_GEOM: uistate.targetgeom = INDEXOF(id); break; case T_CAM: uistate.targetcam = INDEXOF(id); break; } } return Lt; } LDEFINE(ui_center, LVOID, "(ui-center ID)\n\ Set the center for user interface (i.e. mouse) controlled\n\ motions to object ID.") { int id; LDECLARE(("ui-center", LBEGIN, LID, &id, LEND)); if ( (id == NOID) || (id == CENTERID) ) { id = uistate.centerid; } else { set_ui_center(id); } ui_tool_centerset(drawer_id2name(id)); return Lt; } LDEFINE(ui_center_origin, LVOID, "(ui-center-origin {origin|bbox-center})\n" "Set the origin of the coordinate system of the \"CENTER\" object" "for user interface (i.e. mouse) controlled motions." "The keyword \"origin\" means to use the origin of the coordinate" "system of the currently selected object, while \"bbox-center\" " "means to use the center of the bouding box of the current object. " "The keyword \"bbox-center\" makes no sense if the geometry is " "non-Euclidean. Using either \"bbox-center\" or \"origin\" does " "not make a difference if the center object is not a \"geometry\", " "e.g. if it is a camera. Same holds if the World is the currently " "selected object.") { Keyword origin = NO_KEYWORD; LDECLARE(("ui-center-origin", LBEGIN, LKEYWORD, &origin, LEND)); if (origin != BBOX_CENTER_KEYWORD && origin != ORIGIN_KEYWORD) { OOGLError(1, "Wrong keyword, expected either \"%s\" or \"%s\"\n", keywordname(BBOX_CENTER_KEYWORD), keywordname(ORIGIN_KEYWORD)); return Lnil; } set_ui_center_origin(origin == BBOX_CENTER_KEYWORD); ui_tool_center_origin_set(origin == BBOX_CENTER_KEYWORD); return Lt; } /*****************************************************************************/ void ui_pickcolor(int val) { DView *dv; Color *old = NULL; char *name = NULL; Appearance *ap; DGeom *dg; int index = 0; ap = drawer_get_ap(GEOMID(uistate.targetgeom)); switch (val) { case DRAWER_BACKCOLOR: if ((dv = (DView *)drawer_get_object(real_id(CAMID(uistate.targetcam))))) { ui_config_colorpanel("Background", &(dv->backcolor), BACKINDEX, val, real_id(CAMID(uistate.targetcam))); ui_showpanel(P_COLOR, 1); } return; case DRAWER_DIFFUSE: name = "Faces"; index = FACEINDEX; old = (Color *)(void *)&ap->mat->diffuse; break; case DRAWER_EDGECOLOR: name = "Edges"; index = EDGEINDEX; old = &ap->mat->edgecolor; break; case DRAWER_NORMALCOLOR: name = "Normals"; index = NORMALINDEX; old = &ap->mat->normalcolor; break; case DRAWER_BBOXCOLOR: name = "BBoxes"; index = BBOXINDEX; dg = (DGeom*)drawer_get_object(GEOMID(uistate.targetgeom)); old = &dg->bboxap->mat->edgecolor; break; default: break; } ui_config_colorpanel(name, old, index, val, GEOMID(uistate.targetgeom)); ui_showpanel(P_COLOR, 1); } /*****************************************************************************/ int ui_name2panel(char *name) { extern int strcasecmp(const char *, const char *); extern int strncasecmp(const char *, const char *, size_t); int i; if (strcasecmp(name, "main") == 0) return P_MAIN; for (i=P_MAX; --i > 0 && strcasecmp(name, panels[i].name) != 0;); if (i == 0) for(i=P_MAX; --i > 0 && strncasecmp(name, panels[i].name, 4) != 0; ) ; return i; } /*****************************************************************************/ void ui_add_mode(char *name, PFI proc, int type) { ui_install_mode(name, proc, type); } /*****************************************************************************/ void ui_remove_mode(char *name) { int current; current = ui_mode_index(name); ui_uninstall_mode(name); if (uistate.mode_current == current) gv_event_mode(uistate.modenames[0]); } /*****************************************************************************/ extern int gv_debug; static int oldstderr = -1; void silence_errors() { if(!gv_debug) { if(oldstderr < 0) oldstderr = dup(fileno(stderr)); freopen("/dev/null", "w", stderr); } } void resume_errors() { if(oldstderr >= 0) { freopen("/dev/null", "w", stderr); dup2(oldstderr, fileno(stderr)); close(oldstderr); oldstderr = -1; } } /*****************************************************************************/ void ui_init() { silence_errors(); ui_load_mainpanel(); ui_load_appearancepanel(); ui_load_cameraspanel(); ui_load_lightspanel(); ui_load_materialpanel(); ui_load_loadpanel(); resume_errors(); ui_init_snaphelp(); cui_init(); clight_init(); gv_event_mode(OBJROTATE); uistate.cursor_on = 1; } /*****************************************************************************/ Widget ui_make_panel_and_form(char *title, char *rootstr, Boolean wantkeys, Boolean resizable, Widget *formp) { Arg args[20]; int n; Widget shell; int panel = ui_name2panel(title); n = 0; XtSetArg(args[n], XmNtitle, title); n++; XtSetArg(args[n], XmNdeleteResponse, XmDO_NOTHING);n++; XtSetArg(args[n], XmNkeyboardFocusPolicy, XmPOINTER); n++; XtSetArg(args[n], XmNallowShellResize, resizable); n++; if(gvvisual->class & 1) { /* If PseudoColor or other dynamic visual */ XtSetArg(args[n], XmNvisual, gvvisual); n++; XtSetArg(args[n], XmNdepth, gvbitdepth); n++; XtSetArg(args[n], XmNcolormap, gvcolormap); n++; } if (panels[panel].position) { XtSetArg(args[n], XmNx, panels[panel].x); n++; XtSetArg(args[n], XmNy, panels[panel].y); n++; } XtSetArg(args[n], XmNiconPixmap, geomicon); n++; XtSetArg(args[n], XmNmwmDecorations, MWM_DECOR_ALL); n++; XtSetArg(args[n], XmNmwmFunctions, MWM_FUNC_ALL); n++; set_x_application_name(); shell = XtAppCreateShell(title, x_application_name, topLevelShellWidgetClass, dpy, args, n); /* Close when requested by WM */ AProtocol = XmInternAtom(dpy, "WM_DELETE_WINDOW", False); XmAddWMProtocolCallback(shell, AProtocol, (XtCallbackProc) ui_hide, title); if(formp != NULL) { n = 0; XtSetArg(args[n], XmNrubberPositioning, True); n++; XtSetArg(args[n], XmNresizable, resizable); n++; if(wantkeys) { XtSetArg(args[n], XmNaccelerators, KeyAccels); n++; } *formp = XmCreateForm(shell, title, args, n); if(wantkeys) panels[panel].formwantskeys = *formp; XtManageChild(*formp); } panels[panel].shell = shell; return shell; } /*****************************************************************************/ void ui_hide(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { int panel = ui_name2panel((char *)data); ui_showpanel(panel, 0); } void ui_show(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { int panel = ui_name2panel((char *)data); ui_showpanel(panel, 1); } /*****************************************************************************/ LDEFINE(ui_panel, LVOID, "(ui-panel PANELNAME {on|off} [ WINDOW ] )\n\ Do or don't display the given user-interface panel.\n\ Case is ignored in panel names. Current PANELNAMEs are:\n\ geomview main panel\n\ tools motion controls\n\ appearance appearance controls\n\ cameras camera controls\n\ lighting lighting controls\n\ obscure obscure controls\n\ materials material properties controls\n\ command command entry box\n\ credits geomview credits\n\ By default, the \"geomview\" and \"tools\" panels appear when\n\ geomview starts. If the optional Window is supplied, a\n\ \"position\" clause (e.g. (ui-panel obscure on { position xmin\n\ xmax ymin ymax }) sets the panel's default position. (Only\n\ xmin and ymin values are actually used.) A present but empty\n\ Window, e.g. \"(ui-panel obscure on {})\" causes interactive\n\ positioning.") { char *panelname; int index; Keyword on = NO_KEYWORD; struct panel *p; WindowStruct *ws=NULL; WnPosition wp; LDECLARE(("ui-panel", LBEGIN, LSTRING, &panelname, LKEYWORD, &on, LOPTIONAL, LWINDOW, &ws, LEND)); if((index = ui_name2panel(panelname)) == 0) { if (!strcmp(panelname, "Obscure")) return Lnil; fprintf(stderr, "ui-panel: expected name of a panel, got \"%s\"\n", panelname); return Lnil; } if (ws) { p = &(panels[index]); if (WnGet(ws->wn, WN_PREFPOS, &wp) > 0) { p->x = wp.xmin; p->y = wp.ymin; } if (p->shown && p->shell != NULL) { XtMoveWidget(p->shell, p->x, p->y); p->position = 0; } else { p->position = 1; /* position window when it shows up later */ } } ui_showpanel( index, boolval("ui-panel", on)); return Lt; } /*****************************************************************************/ /* Dummy -- we don't bother to freeze the UI. How do we do that in Motif? */ LDEFINE(ui_freeze, LVOID, "(ui-freeze [on|off])\n\ Toggle updating user interface panels. Off by default." ) { int kw = -1; LDECLARE(("ui-freeze", LBEGIN, LOPTIONAL, LKEYWORD, &kw, LEND)); return Lnil; } /*****************************************************************************/ int ui_panelshown(int index) { return panels[index].shown; } /*****************************************************************************/ void ui_final_init() { int i; /* It's only safe to load tool & color panels now, * since they rely on mgx11 for colors, which is ready only * after ui_init(). */ silence_errors(); ui_load_colorpanel(); ui_load_toolpanel(); resume_errors(); panelsready = 1; ui_select(CAMID(uistate.targetcam)); ui_select(GEOMID(uistate.targetgeom)); lights_changed_check(); for(i = 1; i < P_MAX; i++) if (panels[i].shown) ui_showpanel(i, 1); ui_objectchange(); } /*****************************************************************************/ void ui_update() { int i; emodule *em; if(uistate.emod_check) { for(i=0, em=VVEC(uistate.emod,emodule); ilink == NULL || PoolInputFile(em->link) == NULL)) { emodule_reap(em); } else { i++, em++; } } uistate.emod_check = 0; } if(uistate.emod_changed) { ui_adjustemodulelist(uistate.emod_changed); uistate.emod_changed = 0; } } /*****************************************************************************/ LDEFINE(ui_emodule_define, LVOID, "(emodule-define NAME SHELL-COMMAND ...)\n\ Define an external module called NAME, which then appears in the\n\ external-module browser. The SHELL-COMMAND string\n\ is a UNIX shell command which invokes the module.\n\ See emodule-run for discussion of external modules.") { emodule *em; char *title, *cmd; LDECLARE(("emodule-define", LBEGIN, LSTRING, &title, LSTRING, &cmd, LEND)); em = ui_emodule_install(0, strdup(title), (PFI)emodule_run); em->text = strdup(cmd); ui_adjustemodulelist(1); return Lt; } /*****************************************************************************/ static void ename_fix(char *c, const char *e, int n) { char num[80]; int ni=0, ei=0; if (e[0] != '[') goto copy; ei = 1; num[0] = '\0'; while (einame,80); ename_fix(c2,((emodule *)e2)->name,80); return strcmp(c1,c2); } LDEFINE(emodule_sort, LVOID, "(emodule-sort)\n\ Sorts the modules in the application browser alphabetically.") { emodule *em; size_t nel, size; LDECLARE(("emodule-sort", LBEGIN, LEND)); em = VVEC(uistate.emod, emodule); nel = VVCOUNT(uistate.emod); size = sizeof(emodule); qsort(em, nel, size, emod_compare); ui_adjustemodulelist(1); return Lt; } /*****************************************************************************/ LDEFINE(ui_emodule_start, LVOID, "(emodule-start NAME)\n\ Starts the external module NAME, defined by emodule-define.\n\ Equivalent to clicking on the corresponding module-browser entry.") { emodule *em; int i; char *name; LDECLARE(("emodule-start", LBEGIN, LSTRING, &name, LEND)); i = ui_emodule_index(name, &em); if(i < 0) return Lnil; (*em->func)(em); return Lt; } /*****************************************************************************/ void ui_build_browser(Widget a_list, int count, char *names[]) { XmString str; int i; XmListDeleteAllItems(a_list); for (i = 0; i < count; i++) { str = XmStringCreateSimple(names[i]); XmListAddItemUnselected(a_list, str, 0); XmStringFree(str); } } /*****************************************************************************/ void ui_set_ftext(Widget w, float val) { char buf[80], *str; sprintf(buf,"%g",val); str = XmTextFieldGetString(w); if (strcmp(str, buf)) XmTextFieldSetString(w, buf); XtFree(str); } /*****************************************************************************/ void ui_set_itext(Widget w, int val) { char buf[80], *str; sprintf(buf,"%d",val); str = XmTextFieldGetString(w); if (strcmp(str, buf)) XmTextFieldSetString(w, buf); XtFree(str); } /*****************************************************************************/ /* * Local Variables: *** * c-basic-offset: 2 *** * End: */ geomview-1.9.4/src/bin/geomview/x11/gvui.h0000644000175000001440000001265310520206301015175 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ extern XtAppContext App; extern int YScrnSize; extern int gvbitdepth; extern Visual *gvvisual; extern Colormap gvcolormap; extern int gvpriv; extern XtAccelerators KeyAccels; extern Time last_event_time; void load_interface(unsigned int, char **); void main_loop(); void panel_input(Widget, XtPointer, XEvent *, Boolean *); void key_action(Widget, XEvent *, String *, Cardinal *); void cam_input(Widget, XtPointer, XmDrawingAreaCallbackStruct *); void cam_resize(Widget, XtPointer, XmDrawingAreaCallbackStruct *); void cam_mouse(Widget, XtPointer , XPointerMovedEvent *, Boolean *); void cam_mousecross(Widget, XtPointer , XEnterWindowEvent *, Boolean *); void cam_focus(Widget w, XtPointer data, XFocusChangeEvent *event, Boolean *cont); void cam_expose(Widget w, XtPointer id, XEvent *ev, Boolean *junk); void ui_build_browser(Widget, int, char *[]); void ui_set_ftext(Widget, float); void ui_set_itext(Widget, int); void ui_showpanel(int, int); void ui_final_init(); void ui_select(int); void ui_update(); void silence_errors(); void resume_errors(); void ui_init_snaphelp(); void ui_hide(Widget, XtPointer panelname, XmAnyCallbackStruct *cbs); void ui_show(Widget, XtPointer panelname, XmAnyCallbackStruct *cbs); Widget ui_make_panel_and_form(char *title, char *rootstr, Boolean catchkeys, Boolean resizable, Widget *form); /* Panel Defines */ /*****************************************************************************/ #define P_NULL 0 #define P_MAIN 1 #define P_TOOL 2 #define P_APPEARANCE 3 #define P_CAMERA 4 #define P_LIGHTS 5 #define P_COMMANDS 6 #define P_MATERIAL 7 #define P_CREDITS 8 #define P_SAVE 9 #define P_FILEBROWSER 10 #define P_INPUT 11 #define P_COLOR 12 #define P_MAX 13 /* Camera Methods */ /*****************************************************************************/ Widget ui_create_camera(Widget, DView *); void cam_mgdevice(); Pixel ui_RGB(Colormap cmap, int permanent, float r, float g, float b); void update_x11_depth(DView *dv, mib_Widget *DepthMenu, Widget DitherToggle, int *depth_state, int *dither_state); void ui_raise_window( int camid ); /* Main Panel Methods */ /*****************************************************************************/ void ui_load_mainpanel(); void ui_refresh_mainpanel(); void ui_adjustpicklist(int); void ui_adjustemodulelist(int); /* Tool Panel Methods */ /*****************************************************************************/ void ui_load_toolpanel(); void ui_select_tool(int); void ui_tool_targetset(char *); void ui_tool_centerset(char *); void ui_tool_center_origin_set(int use_bbox_center); /* Appearance Panel Methods */ /*****************************************************************************/ void ui_load_appearancepanel(); void ui_show_appearancepanel(); void ui_target_appearancepanel(int); /* Material Panel Methods */ /*****************************************************************************/ void ui_load_materialpanel(); void ui_show_materialpanel(); void ui_target_materialpanel(int); /* Credits Panel Methods */ /*****************************************************************************/ void ui_load_creditspanel(); void ui_show_creditspanel(); /* Save Panel Methods */ /*****************************************************************************/ void ui_load_savepanel(); void ui_show_savepanel(); /* Files Panel Methods */ /*****************************************************************************/ void ui_load_filespanel(); void ui_show_filespanel(); /* Load Panel Methods */ /*****************************************************************************/ void ui_load_loadpanel(); void ui_show_loadpanel(); /* Command Panel Methods */ /*****************************************************************************/ void ui_load_commandspanel(); /* Lights Panel Methods */ /*****************************************************************************/ void ui_load_lightspanel(); void ui_show_lightspanel(); /* Cameras Panel Methods */ /*****************************************************************************/ void ui_load_cameraspanel(); void ui_target_cameraspanel(int); /* Color Panel Methods */ /*****************************************************************************/ void ui_load_colorpanel(); void ui_show_colorpanel(); void ui_config_colorpanel(char *, Color *, int, int, int); /*****************************************************************************/ geomview-1.9.4/src/bin/geomview/x11/gvtoolui.c0000644000175000001440000002227710622716746016117 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mg.h" #include "../common/drawer.h" #include "../common/ui.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Tool.mib" #include "X11/StringDefs.h" #include "bitmaps/rotate" #include "bitmaps/translate" #include "bitmaps/scale" #include "bitmaps/fly" #include "bitmaps/zoom" #include "bitmaps/orbit" #include "bitmaps/stop" #include "bitmaps/lookat" #include "bitmaps/center" #include "bitmaps/reset" extern Display *dpy; extern UIState uistate; extern Pixmap geomicon; /* public methods */ /*****************************************************************************/ void ui_load_toolpanel(void); void ui_tool_targetset(char *); void ui_tool_centerset(char *); void ui_tool_center_origin_set(int use_bbox); /* private methods and variables */ /*****************************************************************************/ static void load_tool_bitmaps(mib_Widget *); static void target_set(Widget, XtPointer, XmAnyCallbackStruct *); static void center_set(Widget, XtPointer, XmAnyCallbackStruct *); static void center_origin_set(Widget, XtPointer, XmAnyCallbackStruct *); #if defined(__STDC__) || defined(__ANSI_CPP__) #define BWH(name) (char *)name##_bits, name##_width, name##_height #else #define BWH(name) (char *)name/**/_bits, name/**/_width, name/**/_height #endif static struct toolbutton { char *name; char *bits; int width, height; int istool; XtPointer data; Widget button; Pixmap norm_pix, rev_pix; } toolbuttons[] = { { "RotateButton", BWH(rotate), True, OBJROTATE }, { "TranslateButton", BWH(translate), True, OBJTRANSLATE }, { "ScaleButton", BWH(scale), True, OBJSCALE }, { "ZoomButton", BWH(zoom), True, OBJZOOM }, { "OrbitButton", BWH(orbit), True, OBJORBIT }, { "FlyButton", BWH(fly), True, OBJFLY }, { "StopButton", BWH(stop), False, (XtPointer)ACTION_STOP }, { "LookAtButton", BWH(lookat), False, (XtPointer)ACTION_LOOK }, { "CenterButton", BWH(center), False, (XtPointer)ACTION_CENTER }, { "ResetButton", BWH(reset), False, (XtPointer)ACTION_RESET }, }; static struct toolbutton *last; static Widget TargetText, CenterText, BBoxCenter; /*****************************************************************************/ void ui_load_toolpanel() { Widget toolform, HideButton, MainButton; mib_Widget *toolload; static char Tools[] = "Tools"; /*****************************************************************************/ ui_make_panel_and_form(Tools, Root, False, False, &toolform); /*toolload = mib_load_interface(toolform, "interface/Tool.mib", MI_FROMFILE);*/ toolload = mib_load_interface(toolform, Root, MI_FROMSTRING); XtVaSetValues(toolload->me, XmNresizePolicy, XmRESIZE_NONE, NULL); XtManageChild(toolform); /*****************************************************************************/ HideButton = mib_find_name(toolload, "HideButton")->me; MainButton = mib_find_name(toolload, "MainButton")->me; TargetText = mib_find_name(toolload, "TargetText")->me; CenterText = mib_find_name(toolload, "CenterText")->me; BBoxCenter = mib_find_name(toolload, "BBoxCenterToggle")->me; load_tool_bitmaps(toolload); XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc) ui_hide, Tools); XtAddCallback(MainButton, XmNactivateCallback, (XtCallbackProc) ui_show, "Geomview"); XtAddCallback(TargetText, XmNactivateCallback, (XtCallbackProc) target_set, NULL); XtAddCallback(CenterText, XmNactivateCallback, (XtCallbackProc) center_set, NULL); XtAddCallback(BBoxCenter, XmNvalueChangedCallback, (XtCallbackProc) center_origin_set, NULL); } /*****************************************************************************/ void ui_event_mode(char *mode) { struct toolbutton *tb; int i; for(i = 0, tb = toolbuttons; i < COUNT(toolbuttons); i++, tb++) { if(tb->istool && tb->button!=NULL && !strcmp(mode, tb->data)) { XtVaSetValues(last->button, XmNlabelPixmap, last->norm_pix, NULL); XtVaSetValues(tb->button, XmNlabelPixmap, tb->norm_pix, NULL); XtVaSetValues(tb->button, XmNlabelPixmap, tb->rev_pix, NULL); last = tb; } } } /*****************************************************************************/ static void modetool_callback(Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { gv_event_mode( (char *)data ); } /*****************************************************************************/ static void action_callback(Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { int val = (int)(long) data; int id = uistate.targetid; switch (val) { case ACTION_STOP: drawer_stop(NOID); break; case ACTION_LOOK: gv_look(GEOMID(uistate.targetgeom), CAMID(uistate.targetcam)); break; case ACTION_CENTER: drawer_center(id); break; case ACTION_RESET: drawer_center(NOID); break; } ui_action(val); } /*****************************************************************************/ static void load_tool_bitmaps(mib_Widget *toolload) { int depth; Pixel blue, red, white; struct toolbutton *tb; int i; Colormap cm; Screen *s = DefaultScreenOfDisplay(dpy); XtVaGetValues(toolload->me, XtNcolormap, &cm, NULL); blue = ui_RGB(cm, 1, 0.0, 0.0, 1.0); red = ui_RGB(cm, 1, 1.0, 0.0, 0.0); white = ui_RGB(cm, 1, 1.0, 1.0, 1.0); if((red == white || blue == white) && cm == DefaultColormapOfScreen(s)) { white = WhitePixelOfScreen(s); if(red == white) red = BlackPixelOfScreen(s); if(blue == white) blue = BlackPixelOfScreen(s); } /*****************************************************************************/ last = &toolbuttons[0]; for(i = 0, tb = toolbuttons; i < COUNT(toolbuttons); i++, tb++) { Pixel colored = tb->istool ? blue : red; tb->button = mib_find_name(toolload, tb->name)->me; XtVaGetValues(tb->button, XmNdepth, &depth, NULL); tb->norm_pix = XCreatePixmapFromBitmapData(dpy, DefaultRootWindow(dpy), tb->bits, tb->width, tb->height, colored, white, depth); tb->rev_pix = XCreatePixmapFromBitmapData(dpy, DefaultRootWindow(dpy), tb->bits, tb->width, tb->height, white, colored, depth); XtVaSetValues(tb->button, XmNlabelType, XmPIXMAP, XmNlabelPixmap, tb==last ? tb->rev_pix : tb->norm_pix, XmNarmPixmap, tb->rev_pix, NULL); XtAddCallback(tb->button, XmNarmCallback, (XtCallbackProc)(tb->istool ? modetool_callback : action_callback), tb->data); } } /*****************************************************************************/ static void target_set(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { char *str; int id; str = XmTextFieldGetString(w); if ((id = drawer_idbyname(str))) set_ui_target_id(id); ui_select(uistate.targetid); XtFree(str); } /*****************************************************************************/ void ui_tool_targetset(char *target) { char *str; if (TargetText == NULL) return; str = XmTextFieldGetString(TargetText); if (strcmp(target, str)) XmTextFieldSetString(TargetText, target); XtFree(str); } /*****************************************************************************/ static void center_set(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { char *str; int id; str = XmTextFieldGetString(w); if ((id = drawer_idbyname(str))) set_ui_center(id); ui_select(uistate.centerid); XtFree(str); } /*****************************************************************************/ void ui_tool_centerset(char *center) { char *str; if (CenterText == NULL) return; str = XmTextFieldGetString(CenterText); if (strcmp(center,str)) XmTextFieldSetString(CenterText, center); XtFree(str); } /*****************************************************************************/ static void center_origin_set(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { set_ui_center_origin(XmToggleButtonGetState(w)); } /*****************************************************************************/ void ui_tool_center_origin_set(int use_bbox_center) { if (BBoxCenter == NULL) return; XmToggleButtonSetState(BBoxCenter, use_bbox_center != 0, False); } /*****************************************************************************/ geomview-1.9.4/src/bin/geomview/x11/gvmnpanel.c0000644000175000001440000005503410622716746016233 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/lang.h" #include #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/MainPanel.mib" extern Display *dpy; extern UIState uistate; /* private methods and variables */ /*****************************************************************************/ static void select_object(Widget, XtPointer, XmListCallbackStruct *); static void select_module(Widget, XtPointer, XmListCallbackStruct *); static void file_menu_callbacks(Widget, char *); static void edit_menu_callbacks(Widget, char *); static void inspect_menu_callbacks(Widget, XtPointer); static void motion_menu_callbacks(Widget, char *); static void help_menu_callbacks(Widget, XtPointer); static void choose_space(Widget, int); static void BuildBrowserMenu(); static int id2menuindex(int); static int *menuindex = NULL; static int menucount = 0; static int currentspace = 0, loaded = 0; static Widget shell, ObjectList, EmodList, MotionToggle[3], SpaceRadio[3], KeyText; static MenuItem file_menu[] = { { "New Camera", &xmPushButtonGadgetClass, 'N', "CtrlN","[v+]", file_menu_callbacks, "N", (MenuItem *)NULL}, { "Open ", &xmPushButtonGadgetClass, 'O', "CtrlO","[ < ]", file_menu_callbacks, "O", (MenuItem *)NULL}, { "Save ", &xmPushButtonGadgetClass, 'S', "CtrlS","[ > ]", file_menu_callbacks, "S", (MenuItem *)NULL}, { "_sepr", &xmSeparatorGadgetClass, (char)NULL, (char*)NULL, (char*)NULL, (void (*)())NULL, (XtPointer)NULL, (MenuItem *)NULL }, { "Exit ", &xmPushButtonGadgetClass, 'E', "CtrlX","[ Q ]", file_menu_callbacks, "X", (MenuItem *)NULL}, { NULL, NULL } }; static MenuItem edit_menu[] = { { "Copy", &xmPushButtonGadgetClass, 'C', NULL, NULL, edit_menu_callbacks, "C", (MenuItem *)NULL}, { "Delete", &xmPushButtonGadgetClass, 'D', "CtrlD", "[dd]", edit_menu_callbacks, "D", (MenuItem *)NULL}, { NULL, NULL } }; static MenuItem inspect_menu[] = { { "Tools", &xmPushButtonGadgetClass, 'T', "CtrlT", "[Pt]", inspect_menu_callbacks, (XtPointer)P_TOOL, (MenuItem *)NULL}, { "Appearance", &xmPushButtonGadgetClass, 'A', "CtrlA", "[Pa]", inspect_menu_callbacks, (XtPointer)P_APPEARANCE, (MenuItem *)NULL}, { "Material ", &xmPushButtonGadgetClass, 'M', "CtrlM", "[PM]", inspect_menu_callbacks, (XtPointer)P_MATERIAL, (MenuItem *)NULL}, { "Lights ", &xmPushButtonGadgetClass, 'L', "CtrlL", "[Pl]", inspect_menu_callbacks, (XtPointer)P_LIGHTS, (MenuItem *)NULL}, { "Cameras ", &xmPushButtonGadgetClass, 'C', "CtrlC", "[Pc]", inspect_menu_callbacks, (XtPointer)P_CAMERA, (MenuItem *)NULL}, { "Commands ", &xmPushButtonGadgetClass, 'O', "CtrlP", "[PC]", inspect_menu_callbacks, (XtPointer)P_COMMANDS, (MenuItem *)NULL}, { NULL, NULL } }; #if 0 static MenuItem space_menu[] = { { "Euclidean", &xmPushButtonGadgetClass, 'E', NULL, "[me]", choose_space, (XtPointer)EUCLIDEAN, (MenuItem *)NULL}, { "Hyperbolic", &xmPushButtonGadgetClass, 'H', NULL, "[mh]", choose_space, (XtPointer)HYPERBOLIC, (MenuItem *)NULL}, { "Spherical", &xmPushButtonGadgetClass, 'S', NULL, "[ms]", choose_space, (XtPointer)SPHERICAL, (MenuItem *)NULL}, { NULL, NULL } }; #endif static MenuItem motion_menu[] = { { "Tools", &xmPushButtonGadgetClass, 'T', "CtrlT", "[Pt]", motion_menu_callbacks, "T", (MenuItem *)NULL}, { "_sepr", &xmSeparatorGadgetClass, (char)NULL, (char*)NULL, (char*)NULL, (void (*)())NULL, (XtPointer)NULL, (MenuItem *)NULL }, { "Inertia", &xmToggleButtonGadgetClass, 'I', "AltI", "[ui]", motion_menu_callbacks, "1", (MenuItem *)NULL}, { "Constrain motion", &xmToggleButtonGadgetClass, 'C', "AltM", "[uc]", motion_menu_callbacks, "2", (MenuItem *)NULL}, { "Own coordinates", &xmToggleButtonGadgetClass, 'O', "AltO", "[uo]", motion_menu_callbacks, "3", (MenuItem *)NULL}, { NULL, NULL } }; static MenuItem help_menu[] = { { "About", &xmPushButtonGadgetClass, 'a', "AltA", "[PA]", help_menu_callbacks, (XtPointer)P_CREDITS, (MenuItem *)NULL }, { "Manual (PDF)", &xmPushButtonGadgetClass, 'h', "AltP", "[PP]", help_menu_callbacks, "p", (MenuItem *)NULL }, { "Manual (HTML)", &xmPushButtonGadgetClass, 'h', "AltH", "[PH]", help_menu_callbacks, "h", (MenuItem *)NULL }, { "Credits", &xmPushButtonGadgetClass, 'A', "AltA", "[PA]", help_menu_callbacks, (XtPointer)P_CREDITS, (MenuItem *)NULL }, { NULL, NULL } }; void ui_refresh_mainpanel(int id) { int newspace, i; if (!loaded) return; newspace = uispace(spaceof(WORLDGEOM)); if (currentspace != newspace) { currentspace = newspace; for (i = 0; i < 3; i++) { if (i != currentspace) XtVaSetValues(SpaceRadio[i], XmNset, False, NULL); } XtVaSetValues(SpaceRadio[currentspace], XmNset, True, NULL); } XtVaSetValues(MotionToggle[0], XmNset, uistate.inertia ? True : False, NULL); XtVaSetValues(MotionToggle[1], XmNset, uistate.constrained ? True : False, NULL); XtVaSetValues(MotionToggle[2], XmNset, uistate.ownmotion ? True : False, NULL); } static void motion_menu_callbacks(Widget widget, char *text) { DrawerKeyword val = DRAWER_NOKEYWORD; switch (text[0]) { case 'T': ui_showpanel(P_TOOL, 1); break; case '1': val = DRAWER_INERTIA; break; case '2': val = DRAWER_CONSTRAIN; break; case '3': default: val = DRAWER_OWNMOTION; break; } drawer_int(GEOMID(uistate.targetgeom), val, XmToggleButtonGadgetGetState(widget)); } /* make the motion menu state accessible through GCL commands */ LDEFINE(ui_motion, LVOID, "(ui-motion {inertia|constrain|own-coordinates} {on|off|yes|no})\n" "Enable or disable certain properties of mouse-controlled motion. " "The purpose of this command is to give access to the toggles of the " "`motion'-menu of the main panels through GCL commands. " "\n\n" "`inertia': " "Normally, moving objects have inertia: if the mouse is still moving " "when the button is released, the selected object continues to move. " "When `inertia' is off, objects cease to move as soon as you release " "the mouse." "\n\n" "`constrain': " "It's sometimes handy to move an object in a direction aligned with a " "coordinate axis: exactly horizontally or vertically. Calling " "`(ui-motion constrain on)' changes the interpretation of mouse " "motions to allow this; approximately-horizontal or " "approximately-vertical mouse dragging becomes exactly horizontal " "or vertical motion. Note that the motion is still along the " "X or Y axes of the camera in which you move the mouse, not " "necessarily the object's own coordinate system." "\n\n" "`own-coordinates': " "It's sometimes handy to move objects with respect to the coordinate " "system where they were defined, rather than with respect to some " "camera's view. When `(ui-motion own-coordinates on) has been called, " "all motions are interpreted that way: dragging the mouse rightward " "in translate mode moves the object in its own +X direction, and so " "on. May be especially useful in conjunction with the " "(ui-motion constrain on) command.") { Keyword enabled = NO_KEYWORD, flagkw = NO_KEYWORD; DrawerKeyword motionflag = DRAWER_NOKEYWORD; bool onoff; int btnidx = -1; LDECLARE(("ui-motion", LBEGIN, LKEYWORD, &flagkw, LKEYWORD, &enabled, LEND)); switch (flagkw) { case MOTION_INERTIA_KEYWORD: motionflag = DRAWER_INERTIA; btnidx = 0; break; case MOTION_CONSTRAIN_KEYWORD: motionflag = DRAWER_CONSTRAIN; btnidx = 1; break; case MOTION_OWN_COORDS_KEYWORD: motionflag = DRAWER_OWNMOTION; btnidx = 2; break; default: OOGLError(1, "Wrong keyword, expected one out of " "{\"%s\", \"%s\", \"%s\"}\n", keywordname(MOTION_INERTIA_KEYWORD), keywordname(MOTION_CONSTRAIN_KEYWORD), keywordname(MOTION_OWN_COORDS_KEYWORD)); break; return Lnil; } switch (enabled) { case YES_KEYWORD: case ON_KEYWORD: onoff = true; break; case NO_KEYWORD: case OFF_KEYWORD: onoff = false; break; default: OOGLError(1, "Wrong keyword, expected one out of " "{\"%s\", \"%s\", \"%s\", \"%s\"}\n", keywordname(YES_KEYWORD), keywordname(ON_KEYWORD), keywordname(NO_KEYWORD), keywordname(OFF_KEYWORD)); return Lnil; } drawer_int(GEOMID(uistate.targetgeom), motionflag, onoff); XtVaSetValues(MotionToggle[btnidx], XmNset, onoff ? True : False, NULL); return Lt; } char htmlbrowser[PATH_MAX] = { '\0', }, pdfviewer[PATH_MAX] = { '\0', }; static void help_menu_callbacks(Widget widget, XtPointer ptr) { if ((int)(long)ptr == P_CREDITS) { ui_showpanel(P_CREDITS, 1); } else if (*(char *)ptr == 'h') { ui_manual_browser("html"); } else { /* if (*(char *)ptr == 'p') { */ ui_manual_browser("pdf"); } } static void choose_space(Widget w, int item) { int space; if (item == currentspace) return; currentspace = item; switch (currentspace) { default: case EUCLIDEAN: space = EUCLIDEAN_KEYWORD; break; case HYPERBOLIC: space = HYPERBOLIC_KEYWORD; break; case SPHERICAL: space = SPHERICAL_KEYWORD; break; } gv_space(space); } /*****************************************************************************/ void ui_load_mainpanel() { Arg args[20]; int n; Widget mainwindow, mainmenu, mainform, cascade, space, /*inspect,*/ help, title, HideButton; char buf[40]; static char gvtitle[100]; XmString GVtitle; mib_Widget *mainload; XmString str[3]; XFontStruct *font; XmFontList fontlist; static char Geomview[] = "Geomview"; /*****************************************************************************/ shell = ui_make_panel_and_form(Geomview, Root, True, True, NULL); XtVaSetValues(shell, XmNtitle, "Geomview - The Geometry Center", NULL); /*****************************************************************************/ mainwindow = XtCreateManagedWidget("Geomview", xmMainWindowWidgetClass, shell, args, 0); /*****************************************************************************/ n = 0; XtSetArg (args[n], XmNrubberPositioning, True); n++; mainmenu = XmCreateSimpleMenuBar(mainwindow, "MainMenu", args, n); BuildMenu(mainmenu, XmMENU_PULLDOWN, "File", 'F', file_menu); BuildMenu(mainmenu, XmMENU_PULLDOWN, "Edit", 'E', edit_menu); BuildMenu(mainmenu, XmMENU_PULLDOWN, "Inspect", 'I', inspect_menu); /*****************************************************************************/ str[0] = XmStringCreateSimple("Space"); cascade = XtVaCreateManagedWidget("button_3", /* lesstif demands "button_" */ xmCascadeButtonGadgetClass, mainmenu, XmNlabelString, str[0], XmNmnemonic, (XID)'S', NULL); XmStringFree(str[0]); str[0] = XmStringCreateSimple("Euclidean [me]"); str[1] = XmStringCreateSimple("Hyperbolic [mh]"); str[2] = XmStringCreateSimple("Spherical [ms]"); space = XmVaCreateSimplePulldownMenu(mainmenu, "_pulldown", 3, (XtCallbackProc) choose_space, XmVaRADIOBUTTON, str[0], '\0', NULL, NULL, XmVaRADIOBUTTON, str[1], '\0', NULL, NULL, XmVaRADIOBUTTON, str[2], '\0', NULL, NULL, XmNradioBehavior, True, XmNradioAlwaysOne, True, (XtCallbackProc) NULL); XmStringFree(str[0]); XmStringFree(str[1]); XmStringFree(str[2]); XtVaSetValues(cascade, XmNsubMenuId, space, NULL); for (n = 0; n < 3; n++) { sprintf(buf, "button_%d", n); SpaceRadio[n] = XtNameToWidget(space, buf); } #if 0 for (n = 0; n < 3; n++) { SpaceRadio[n] = XtNameToWidget(space, space_menu[n].label); } #endif XtVaSetValues(SpaceRadio[0], XmNset, True, NULL); currentspace = 0; /*****************************************************************************/ BuildMenu(mainmenu, XmMENU_PULLDOWN, "Motion", 'M', motion_menu); for (n = 0; n < 3; n++) { sprintf(buf, "button_%d", n); MotionToggle[n] = (Widget) motion_menu[n+2].subitems; } help = BuildMenu(mainmenu, XmMENU_PULLDOWN, "Help", 'H', help_menu); XtVaSetValues(mainmenu, XmNmenuHelpWidget, help, NULL); XtManageChild(mainmenu); /*****************************************************************************/ n = 0; XtSetArg (args[n], XmNrubberPositioning, True); n++; XtSetArg (args[n], XmNtraversalOn, False); n++; XtSetArg(args[n], XmNresizable, False); n++; XtSetArg(args[n], XmNaccelerators, KeyAccels); n++; mainform = XmCreateForm(mainwindow, "Geomview", args, n); /*mainload = mib_load_interface(mainform, "interface/MainPanel.mib", MI_FROMFILE);*/ mainload = mib_load_interface(mainform, Root, MI_FROMSTRING); /* Prevent automatic resizing; otherwise the main widget changes everytime we start or stop a new module. */ XtVaSetValues(mainload->me, XmNresizePolicy, XmRESIZE_NONE, NULL); XtManageChild(mainform); XtInstallAccelerators(mainmenu, mainform); /*****************************************************************************/ HideButton = mib_find_name(mainload, "HideButton")->me; ObjectList = mib_find_name(mainload, "ObjectList")->me; EmodList = mib_find_name(mainload, "EmoduleList")->me; KeyText = mib_find_name(mainload, "KeyText")->me; XtVaSetValues(EmodList, XmNselectionPolicy, XmSINGLE_SELECT, NULL); XtVaSetValues(ObjectList, XmNselectionPolicy, XmSINGLE_SELECT, NULL); XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc)ui_hide, (XtPointer)Geomview); XtAddCallback(ObjectList, XmNsingleSelectionCallback, (XtCallbackProc)select_object, (XtPointer)NULL); XtAddCallback(EmodList, XmNsingleSelectionCallback, (XtCallbackProc)select_module, (XtPointer)NULL); XtVaSetValues(KeyText, XmNeditable, False, XmNcursorPositionVisible, False, NULL); /*****************************************************************************/ /* set geomview title font */ title = mib_find_name(mainload, "GVTitle")->me; font = XLoadQueryFont(dpy, "-adobe-helvetica-bold-r-normal--24-240-75-75-p-138-iso8859-1"); fontlist = XmFontListCreate(font, "bigger"); sprintf(gvtitle, "Geomview %s", geomview_version); GVtitle = XmStringCreateSimple(gvtitle); XtVaSetValues(title, XmNfontList, fontlist, XmNlabelString, GVtitle, NULL); /*****************************************************************************/ loaded = 1; } /*****************************************************************************/ static void file_menu_callbacks(Widget widget, char *text) { CameraStruct cs; DView *dv; switch (text[0]) { case 'N': dv = (DView *)drawer_get_object(FOCUSID); cs.h = NULL; cs.cam = dv && dv->cam ? CamCopy(dv->cam, NULL) : NULL; gv_new_camera(NULL, &cs); break; case 'X': gv_exit(); break; case 'O': ui_showpanel(P_FILEBROWSER, 1); break; case 'S': ui_showpanel(P_SAVE, 1); default: break; } } /*****************************************************************************/ static void edit_menu_callbacks(Widget widget, char *text) { switch (text[0]) { case 'U': break; case 'C': gv_copy(uistate.targetid, (char *)NULL); break; case 'P': break; case 'D': gv_delete(uistate.targetid); break; default: break; } } /*****************************************************************************/ static void inspect_menu_callbacks(Widget widget, XtPointer code) { ui_showpanel((int)(long)code, 1); } /*****************************************************************************/ #if XmVersion == 1001 /* Motif 1.1 lacks XmListPosToBounds(); fake it. */ #define cent __cent /* evade typedef name conflict with oogl routines */ #define XtMoveWidget __XtMoveWidget #include #undef cent #undef __XtMoveWidget static int xmListVisible(Widget w, int position) { XmListWidget lw = (XmListWidget) w; if (position == 0) position = lw->list.itemCount; if ((position >= lw->list.itemCount) || (position < lw->list.top_position) || (position >= (lw->list.top_position + lw->list.visibleItemCount))) return (False); return True; } #define XmListPosToBounds(w, pos, junk1, junk2, junk3, junk4) xmListVisible(w, pos) #endif /* Motif 1.1 */ static void showselected(int slot) { static int oldslot = -1; if(!XmListPosToBounds(ObjectList, slot, NULL, NULL, NULL, NULL)) { /* It's not already visible; try to scroll as little as possible to * make it so. If prev selection was above this one, place it * near the bottom of the visible area, otherwise near the top. */ if(oldslot > 0 && oldslot < slot && slot > 4) XmListSetBottomPos(ObjectList, slot < menucount ? slot-1 : slot); else XmListSetPos(ObjectList, slot > 4 ? slot-1 : 1); } } void ui_adjustpicklist(int id) { if (id == -1) { BuildBrowserMenu(); showselected( id2menuindex(uistate.targetid) + 1 ); } else { int mind = id2menuindex(id)+1; XmListSelectPos(ObjectList, mind, False); showselected(mind); } } /*****************************************************************************/ /* * Show what's happening on the keyboard. * Commands are enclosed in [brackets]. In case of error, a '?' appears * following the close-bracket. */ void ui_keyboard(int ch) { static char kybd[12]; static int nextc = 0; if(ch <= 0) { ui_keyboard(']'); if(ch < 0) ui_keyboard('?'); nextc = 0; } else if(ch < ' ') { if(ch == '\033') { ui_keyboard('E'); ui_keyboard('S'); ui_keyboard('C'); } else { ui_keyboard('^'); ui_keyboard(ch + 'A' - 1); } } else if(ch == 0177) { ui_keyboard('^'); ui_keyboard('?'); } else { if(nextc >= sizeof(kybd)-1) { memcpy(kybd, kybd+1, sizeof(kybd)-2); nextc = sizeof(kybd)-2; } else if(nextc == 0) { kybd[nextc++] = '['; } kybd[nextc++] = ch; kybd[nextc] = '\0'; XmTextFieldSetString(KeyText, kybd); } } /*****************************************************************************/ static void select_object(Widget w, XtPointer data, XmListCallbackStruct *cbs) { gv_ui_target(menuindex[cbs->item_position - 1], IMMEDIATE); } /*****************************************************************************/ static int id2menuindex(int id) { extern int real_id(int); int i; if (drawer_cam_count() == 1 && (id == TARGETCAMID || id == ALLCAMS || id == FOCUSID)) id = real_id(id); for (i=0; i 1 ? 1 : 0); menulist = OOGLNewNE(XmString, *count, "menulist array"); *menuindex = OOGLNewNE(int, *count, "no space for menuindex array"); n = 0; objs = (DObject**)dgeom; for (i=0; icitizenship != ALIEN) { if (obj->name[1] != NULL) sprintf(buf, "[%.64s] %.64s", obj->name[0], obj->name[1]); else strcpy(buf, obj->name[0]); (*menuindex)[n] = obj->id; menulist[n] = XmStringCreateSimple(buf); ++n; } } if (camcount > 1) { (*menuindex)[n] = FOCUSID; menulist[n] = XmStringCreateSimple("[c] Current Camera"); ++n; } objs = (DObject **)dview; for (i=0; iname[1] == NULL) obj->name[1] = "Default Camera"; sprintf(buf, "[%.64s] %.64s", obj->name[0], obj->name[1]); (*menuindex)[n] = obj->id; menulist[n] = XmStringCreateSimple(buf); ++n; } } /* Report how many we really found -- there may have been gaps */ *count = n; return menulist; } static void DestroyStringList( XmString *list, int count ) { while ( --count >= 0 ) XmStringFree(list[count]); OOGLFree(list); } static void BuildBrowserMenu() { XmString *menulist; XmListDeleteAllItems(ObjectList); if (menuindex) OOGLFree(menuindex); menulist = BuildObjectMenuList(&menuindex, &menucount); XmListAddItems(ObjectList, menulist, menucount, 0); DestroyStringList(menulist, menucount); } /*****************************************************************************/ void ui_adjustemodulelist(int interest) { XmString *items; int i; emodule *em; XmListDeleteAllItems(EmodList); if(VVCOUNT(uistate.emod) > 0) { items = OOGLNewNE(XmString, VVCOUNT(uistate.emod), "emodules"); for(i=0, em=VVEC(uistate.emod,emodule); iname); XmListAddItems(EmodList, items, VVCOUNT(uistate.emod), 0); DestroyStringList(items, VVCOUNT(uistate.emod)); if (interest > 1) XmListSetBottomPos(EmodList, interest + 2); } } /*****************************************************************************/ static void select_module(Widget w, XtPointer data, XmListCallbackStruct *cbs) { int i = cbs->item_position - 1; gv_ui_emodule_start(VVINDEX(uistate.emod, emodule, i)->name); } /*****************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/x11/gvfiles.c0000644000175000001440000001062210516545737015677 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include #include "../common/drawer.h" #include "gvui.h" #include "interface/LoadPaths.mib" extern Display *dpy; extern Widget TopLevel; /* private methods and variables */ /*****************************************************************************/ static void load_selection(Widget, XtPointer, XmFileSelectionBoxCallbackStruct *); static void select_path(Widget, XtPointer, XmListCallbackStruct *); /*static void ui_update_filespanel();*/ static Widget shell, pathlist, filesform; static char **dirp; /*****************************************************************************/ void ui_load_filespanel() { Widget pathform, temp; mib_Widget *pathload; XmString xname; static char Files[] = "Files"; /*****************************************************************************/ shell = ui_make_panel_and_form(Files, Root, True, False, NULL); filesform = XmCreateFileSelectionBox(shell, Files, NULL, 0); XtManageChild(filesform); XtSetMappedWhenManaged(filesform, True); /*****************************************************************************/ temp = XmFileSelectionBoxGetChild(filesform, XmDIALOG_HELP_BUTTON); XtUnmanageChild(temp); XtAddCallback(filesform, XmNokCallback, (XtCallbackProc) load_selection, (XtPointer) NULL); temp = XmFileSelectionBoxGetChild(filesform, XmDIALOG_CANCEL_BUTTON); xname = XmStringCreateSimple("Hide"); XtVaSetValues(temp, XmNlabelString, xname, NULL); XmStringFree(xname); XtAddCallback(temp, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer) Files); /*****************************************************************************/ /*pathload = mib_load_interface(filesform, "interface/LoadPaths.mib", MI_FROMFILE);*/ pathload = mib_load_interface(filesform, Root, MI_FROMSTRING); pathform = pathload->me; pathlist = mib_find_name(pathload, "PathList")->me; XtAddCallback(pathlist, XmNbrowseSelectionCallback, (XtCallbackProc) select_path, (XtPointer) NULL); XtManageChild(pathform); XtManageChild(pathlist); } /*****************************************************************************/ void ui_show_filespanel() { int i; XmString str; XmListDeleteAllItems(pathlist); dirp = getfiledirs(); for (i=0; dirp[i] != NULL; i++) { str = XmStringCreateSimple(dirp[i]); XmListAddItemUnselected(pathlist, str, 0); XmStringFree(str); } } /*****************************************************************************/ static void select_path(Widget w, XtPointer data, XmListCallbackStruct *cbs) { char *temp, dirmask[200]; XmString dmask; if (!XmStringGetLtoR(cbs->item, XmSTRING_DEFAULT_CHARSET, &temp)) return; if (!*temp) return; sprintf(dirmask,"%s/*", temp); XtFree(temp); dmask = XmStringCreate(dirmask, XmSTRING_DEFAULT_CHARSET); XmFileSelectionDoSearch(filesform, dmask); XmStringFree(dmask); } /*****************************************************************************/ static void load_selection(Widget w, XtPointer data, XmFileSelectionBoxCallbackStruct *cbs) { char *object; if (!XmStringGetLtoR(cbs->value, XmSTRING_DEFAULT_CHARSET, &object)) return; if (!*object) return; gv_load(object, NULL); XtFree(object); } /*****************************************************************************/ geomview-1.9.4/src/bin/geomview/x11/gvevent.c0000644000175000001440000002406210574530310015702 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "../common/drawer.h" #include "../common/ui.h" #include "../common/comm.h" #include "../common/space.h" #include "../common/event.h" #include "../common/motion.h" #include "../common/worldio.h" #include "../common/lang.h" #include "clang.h" #include #include #include #include #include #include #include #include #include "mibload.h" #include "gvui.h" #if D1_DEBUG #define GV_RAWEVENT(dev, val, x, y, t) \ printf("calling gv_rawevent(dev=%3d, val=%3d, x=%4d, y=%4d, t=%1ld)\n", dev, val, x, y, t); \ gv_rawevent( dev, val, x, y, t) #else #define GV_RAWEVENT(dev, val, x, y, t) \ gv_rawevent( dev, val, x, y, t) #endif /* gvevent.c global vars */ /*****************************************************************************/ #define ESC '\033' extern Display *dpy; static void perftick(); static struct perf { /* Performance metering */ int interval; /* Interval between auto-reports */ int mindt, maxdt, meandt; /* Integer milliseconds */ int cycles; /* # cycles where we actually did something */ struct timeval then; } perf; static int lastx; static int lasty; static int dragx; static int dragy; static int nseen; static int dragstop, dragging, deldrag, numdrags; int justdragged; static Time lastt; Time last_event_time; static Event gev; /* geomview event structure */ /*****************************************************************************/ #if D1_DEBUG void print_event(char *s, Event *e) { printf("%s: event(dev=%3d, val=%3d, x=%4d, y=%4d, t=%1ld)\n", s, e->dev, e->val, e->x, e->y, e->t); } #endif void main_loop() { fd_set thesefds; int nwatch = 0; int queuefd; XtInputMask xim; queuefd = ConnectionNumber(dpy); dragging = 0; dragstop = 1; justdragged = 0; deldrag = 0; numdrags = 0; while (1) { struct timeval await; #define BRIEF 0.1 static struct timeval brief = { 0, 100000 }; float timelimit; if(drawerstate.pause) { if(!dragging && !drawer_moving()) select(0, NULL, NULL, NULL, &brief); nseen = 0; } else { timelimit = PoolInputFDs( &thesefds, &nwatch ); if(timelimit > 0 && drawer_moving()) timelimit = 0; /* "Is anything moving?" */ if (queuefd >= 0 ) FD_SET(queuefd, &thesefds); if(queuefd >= nwatch) nwatch = queuefd+1; if(timelimit > BRIEF) timelimit = BRIEF; await.tv_sec = floor(timelimit); await.tv_usec = 1000000*(timelimit - await.tv_sec); nseen = select(nwatch, &thesefds, NULL, NULL, &await); } gettimeofday(&perf.then, NULL); if(!drawerstate.pause) PoolInAll( &thesefds, &nseen ); ui_update(); justdragged = 0; deldrag = gev.t; while ((xim = XtAppPending(App)) != 0) { XtAppProcessEvent(App, xim); } if (dragging && !justdragged && !dragstop) { D1PRINT(("gvevent at 1\n")); GV_RAWEVENT( gev.dev, -1, gev.x, gev.y, gev.t); dragstop = 1; } if (dragging) { deldrag = gev.t - deldrag; } else { deldrag = 0; } XSync(dpy, False); gv_update_draw( ALLCAMS, 0.001 * (float)deldrag ); mg_textureclock(); if(perf.interval > 0) perftick(); numdrags = 0; } } /*****************************************************************************/ static void perftick() { int dt; struct timeval now; gettimeofday(&now, NULL); dt = (now.tv_sec - perf.then.tv_sec)*1000 + (now.tv_usec - perf.then.tv_usec)/1000; if(dt > 0) { if(dt < perf.mindt) perf.mindt = dt; if(dt > perf.maxdt) perf.maxdt = dt; perf.meandt += dt; if(++perf.cycles == perf.interval) timing(perf.interval); } } /*****************************************************************************/ void timing(int interval) { if(perf.cycles > 0) { printf("%d..%d ms/cycle, mean %d ms over %d cycles\n", perf.mindt, perf.maxdt, perf.cycles ? perf.meandt/perf.cycles : 0, perf.cycles); fflush(stdout); } perf.mindt = 9999999, perf.maxdt = -1, perf.meandt = perf.cycles = 0; perf.interval = interval; } /*****************************************************************************/ void cam_input(Widget w, XtPointer data, XmDrawingAreaCallbackStruct *cbs) { Boolean junk; D1PRINT(("cam_input\n")); panel_input(w, data, cbs->event, &junk); } void key_action(Widget w, XEvent *event, String *argv, Cardinal *argcp) { Boolean junk; D1PRINT(("key_action\n")); panel_input(w, NULL, event, &junk); } void panel_input(Widget w, XtPointer data, XEvent *event, Boolean *cont) { char str[1]; KeySym keysym; int newstate, nc; switch (event->type) { case UnmapNotify: /* Window iconified or otherwise temporarily gone */ D1PRINT(("panel_input: case UnmapNotify\n")); gv_freeze( (int)(long)data, 1 ); /* Hard-frozen; prevent gv_redraw from working until we say so */ break; case MapNotify: D1PRINT(("panel_input: case MapNotify\n")); gv_freeze( (int)(long)data, 0 ); /* Permit thawing. */ gv_redraw( (int)(long)data ); /* Thaw it now, in case Expose arrived before MapNotify */ break; case MotionNotify: D1PRINT(("panel_input: case MotionNotify\n")); last_event_time = event->xmotion.time; cam_mouse(w, data, &event->xmotion, cont); return; case ButtonPress: case ButtonRelease: D1PRINT(("panel_input: case ButtonPress/Release\n")); newstate = (event->type == ButtonPress); button.left = ((event->xbutton.state & Button1Mask) ? 1 : 0); button.middle = ((event->xbutton.state & Button2Mask) ? 1 : 0); button.right = ((event->xbutton.state & Button3Mask) ? 1 : 0); button.shift = ((event->xbutton.state & ShiftMask) ? 1 : 0); button.ctrl = ((event->xbutton.state & ControlMask) ? 1 : 0); dragging = newstate; lastt = last_event_time = event->xbutton.time; D1PRINT(("gvevent: at 1.5, event->xbutton.time = %1ld\n", event->xbutton.time)); dragx = event->xbutton.x_root; dragy = YScrnSize - event->xbutton.y_root; if (dragstop && !newstate) { D1PRINT(("gvevent at 2\n")); GV_RAWEVENT( gev.dev, -1, dragx, dragy, lastt); } switch (event->xbutton.button) { case 1: gev.dev = ELEFTMOUSE; button.left = newstate; break; case 2: gev.dev = EMIDDLEMOUSE; button.middle = newstate; break; case 3: gev.dev = ERIGHTMOUSE; button.right = newstate; break; } if(gev.dev == ELEFTMOUSE && (event->xbutton.state & Mod1Mask)) { gev.dev = EMIDDLEMOUSE; button.middle = button.left; button.left = 0; } gev.x = dragx; gev.y = dragy; gev.t = lastt; deldrag = gev.t; D1PRINT(("gvevent at 3\n")); GV_RAWEVENT( gev.dev, newstate, gev.x, gev.y, gev.t); dragstop = 1; break; case KeyPress: D1PRINT(("panel_input: case KeyPress\n")); nc = XLookupString((XKeyEvent *) event, str, 1, &keysym, NULL); last_event_time = event->xkey.time; if ((int)keysym == (int)'Q') str[0] = ESC; if (keysym == XK_Escape) str[0] = ESC; if (nc > 0) { gev.dev = str[0]; gev.x = event->xkey.x_root; gev.y = YScrnSize - event->xkey.y_root; gev.t = event->xkey.time; D1PRINT(("gvevent at 4\n")); GV_RAWEVENT(str[0], 1, gev.x, gev.y, gev.t); } break; default: break; } } /*****************************************************************************/ void cam_mouse(Widget w, XtPointer data, XPointerMovedEvent *event, Boolean *cont) { static int lasthere = 0; dragging = 1; dragstop = 0; justdragged = 1; numdrags++; if (numdrags > 2) return; gev.x = event->x_root; gev.y = YScrnSize - event->y_root; gev.t = event->time; PRINT_EVENT(("cam_mouse", &gev)); if ((gev.t - lastt) > uistate.cursor_still) { if (abs(gev.x - lastx) < uistate.cursor_twitch && abs(gev.y - lasty) < uistate.cursor_twitch) { gev.x = dragx; gev.y = dragy; } lastx = gev.x; lasty = gev.y; lastt = gev.t; } dragx = gev.x; dragy = gev.y; if (lasthere != gev.t) { D1PRINT(("cam_mouse: at 1\n")); GV_RAWEVENT( gev.dev, -1, gev.x, gev.y, gev.t); } else { D1PRINT(("cam_mouse: at 2\n")); GV_RAWEVENT( gev.dev, -1, gev.x, gev.y, gev.t+1); dragstop = 1; } lasthere = gev.t; } /*****************************************************************************/ void cam_mousecross(Widget w, XtPointer data, XEnterWindowEvent *event, Boolean *cont) { if (!uistate.cam_wm_focus) { int id = (int)(long)data; gv_winenter(id); } } /*****************************************************************************/ void cam_focus(Widget w, XtPointer data, XFocusChangeEvent *event, Boolean *cont) { if (uistate.cam_wm_focus && event->type == FocusIn) { int id = (int)(long)data; gv_winenter(id); } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/x11/gvlights.c0000644000175000001440000001577110622716746016077 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/ui.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Lights.mib" #define MAXLIGHTS 8 #define LIGHTINDEX 255 extern Display *dpy; extern UIState uistate; extern int light_count(); extern void set_light(int); extern Pixmap geomicon; /* private methods and variables */ /*****************************************************************************/ static void select_light(Widget, XtPointer, XmListCallbackStruct *); static void intensity_light(Widget, XtPointer, XmScaleCallbackStruct *); static void toggle_lights(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void color_light(Widget, XtPointer, XmAnyCallbackStruct *); static void light_add(Widget, XtPointer, XmAnyCallbackStruct *); static void light_del(Widget, XtPointer, XmAnyCallbackStruct *); static Widget ltoggle, lintensity, lightslist; static char *lights[MAXLIGHTS+1]; /*static int pos_later = 0, posx = 0, posy = 0; static char geometry[40];*/ /*****************************************************************************/ void ui_load_lightspanel() { int n; Widget lightsform, lightsadd, lightsdel, ColButton, HideButton; char buf[100]; mib_Widget *lightsload; static char Lights[] = "Lights"; /*****************************************************************************/ ui_make_panel_and_form(Lights, Root, True, True, &lightsform); /*lightsload = mib_load_interface(lightsform, "interface/Lights.mib", MI_FROMFILE);*/ lightsload = mib_load_interface(lightsform, Root, MI_FROMSTRING); XtManageChild(lightsform); /*****************************************************************************/ ColButton = mib_find_name(lightsload, "ColorButton")->me; HideButton = mib_find_name(lightsload, "HideButton")->me; lightslist = mib_find_name(lightsload, "LightsList")->me; lintensity = mib_find_name(lightsload, "IntensityScale")->me; ltoggle = mib_find_name(lightsload, "LightsToggle")->me; lightsadd = mib_find_name(lightsload, "AddButton")->me; lightsdel = mib_find_name(lightsload, "DeleteButton")->me; XtAddCallback(ColButton, XmNactivateCallback, (XtCallbackProc) color_light, (XtPointer) NULL); XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer) Lights); XtAddCallback(lightslist, XmNbrowseSelectionCallback, (XtCallbackProc) select_light, (XtPointer) &lintensity); XtAddCallback(lintensity, XmNdragCallback, (XtCallbackProc) intensity_light, (XtPointer) NULL); XtAddCallback(lintensity, XmNvalueChangedCallback, (XtCallbackProc) intensity_light, (XtPointer) NULL); XtAddCallback(ltoggle, XmNvalueChangedCallback, (XtCallbackProc) toggle_lights, (XtPointer) NULL); XtAddCallback(lightsadd, XmNactivateCallback, (XtCallbackProc) light_add, (XtPointer) NULL); XtAddCallback(lightsdel, XmNactivateCallback, (XtCallbackProc) light_del, (XtPointer) NULL); /*****************************************************************************/ /* Initialize Panel Variables */ lights[0] = "ambient"; for (n = 1; n <= MAXLIGHTS; ++n) { sprintf(buf, "light %1d", n); lights[n] = strdup(buf); } ui_build_browser(lightslist, light_count(), lights); } /*****************************************************************************/ void ui_show_lightspanel() { set_light(light_count() > 0 ? 1 : 0); XmListSelectPos(lightslist, uistate.current_light + 1, False); } /*****************************************************************************/ void set_light_display(int lightno) { extern float light_intensity(); XmScaleSetValue(lintensity, (int) (light_intensity()*100.0)); } /*****************************************************************************/ void ui_light_button() { int state = (uistate.lights_shown != 0); XmToggleButtonSetState(ltoggle, state, False); } /*****************************************************************************/ void ui_lights_changed() { ui_build_browser(lightslist, light_count(), lights); set_light(uistate.current_light); } /*****************************************************************************/ static void select_light(Widget w, XtPointer data, XmListCallbackStruct *cbs) { extern float light_intensity(); Widget intensity = (Widget)*((Widget *)data); set_light(cbs->item_position-1); XmScaleSetValue(intensity, (int) (light_intensity()*100.0)); } /*****************************************************************************/ static void color_light(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { extern Color *light_color(); /* in clights.c */ ui_config_colorpanel("Light Color", light_color(), LIGHTINDEX, DRAWER_LIGHTCOLOR, 0); ui_showpanel(P_COLOR, 1); } /*****************************************************************************/ static void light_add(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { extern void add_light(); if (light_count() > 8) { OOGLError(0, "Can't have more than 8 lights\n"); return; } add_light(); } /*****************************************************************************/ static void light_del(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { extern void delete_light(); if (uistate.current_light == 0) return; delete_light(); } /*****************************************************************************/ static void toggle_lights(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { extern void light_edit_mode(int); light_edit_mode(cbs->set); } /*****************************************************************************/ static void intensity_light(Widget w, XtPointer data, XmScaleCallbackStruct *cbs) { float f = (float)cbs->value/100.0; drawer_float(GEOMID(uistate.targetgeom), DRAWER_LIGHT_INTENSITY, f); } /*****************************************************************************/ geomview-1.9.4/src/bin/geomview/x11/gvcameras.c0000644000175000001440000003512510622716746016213 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "mibload.h" #include "mibwidgets.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/lang.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Cameras.mib" extern Display *dpy; extern Pixmap geomicon; /* public methods */ /*****************************************************************************/ void ui_target_cameraspanel(int); /* private methods and variables */ /*****************************************************************************/ static void background_color(Widget, XtPointer, XmAnyCallbackStruct *); static void soft_shading(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void draw_cams(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void draw_sphere(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void toggle_dither(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void toggle_singlebuffer(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs); static void list_callbacks(Widget, XtPointer, XmListCallbackStruct *); static void text_callbacks(Widget, XtPointer, XmAnyCallbackStruct *); static void depth_callbacks(Widget, XtPointer, XmAnyCallbackStruct *); static void ui_float(char *, DrawerKeyword, int, float, float); static Widget ProjectList, CurrentCam, ModelList, SphereToggle, DitherToggle, SingleBuffer, SoftShade, DrawCams, NearClipText, FarClipText, FOVText, FocalText, LinesText; mib_Widget *DepthMenu; static int currentcam_id, modelpos, projpos; static int dither_state = 0; static int depth_state = 0; static float keepfov; static char lastcamname[255]; static char store[255]; /*static char geometry[40];*/ /*static int pos_later = 0, posx = 0, posy = 0;*/ /*****************************************************************************/ void ui_load_cameraspanel() { int i; Widget camerasform, HideButton, TempWidget; mib_Widget *camerasload; static char Cameras[] = "Cameras"; /*****************************************************************************/ ui_make_panel_and_form(Cameras, Root, False, True, &camerasform); /*camerasload = mib_load_interface(camerasform, "interface/Cameras.mib", MI_FROMFILE);*/ camerasload = mib_load_interface(camerasform, Root, MI_FROMSTRING); XtManageChild(camerasform); /*****************************************************************************/ HideButton = mib_find_name(camerasload, "HideButton")->me; ProjectList = mib_find_name(camerasload, "ProjectList")->me; ModelList = mib_find_name(camerasload, "SpaceModelList")->me; CurrentCam = mib_find_name(camerasload, "CurrentLabel")->me; DrawCams = mib_find_name(camerasload, "DrawCamsButton")->me; SphereToggle = mib_find_name(camerasload, "DrawSphereToggle")->me; DitherToggle = mib_find_name(camerasload, "DitherToggle")->me; SingleBuffer = mib_find_name(camerasload, "Singlebuffer")->me; SoftShade = mib_find_name(camerasload, "SoftShadeButton")->me; NearClipText = mib_find_name(camerasload, "NCText")->me; FarClipText = mib_find_name(camerasload, "FCText")->me; FOVText = mib_find_name(camerasload, "FOVText")->me; FocalText = mib_find_name(camerasload, "FLText")->me; LinesText = mib_find_name(camerasload, "LCText")->me; DepthMenu = mib_find_name(camerasload, "DepthMenu"); XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer)Cameras); XtAddCallback(ProjectList, XmNbrowseSelectionCallback, (XtCallbackProc) list_callbacks, (XtPointer) DRAWER_PROJECTION); XtAddCallback(ModelList, XmNbrowseSelectionCallback, (XtCallbackProc) list_callbacks, (XtPointer) NULL); XtAddCallback(DrawCams, XmNvalueChangedCallback, (XtCallbackProc) draw_cams, (XtPointer) NULL); XtAddCallback(SphereToggle, XmNvalueChangedCallback, (XtCallbackProc) draw_sphere, (XtPointer) NULL); XtAddCallback(DitherToggle, XmNvalueChangedCallback, (XtCallbackProc) toggle_dither, (XtPointer) NULL); XtAddCallback(SingleBuffer, XmNvalueChangedCallback, (XtCallbackProc) toggle_singlebuffer, (XtPointer) NULL); XtAddCallback(NearClipText, XmNactivateCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_NEAR); XtAddCallback(NearClipText, XmNlosingFocusCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_NEAR); XtAddCallback(FarClipText, XmNactivateCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_FAR); XtAddCallback(FarClipText, XmNlosingFocusCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_FAR); XtAddCallback(FOVText, XmNactivateCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_FOV); XtAddCallback(FOVText, XmNlosingFocusCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_FOV); XtAddCallback(FocalText, XmNactivateCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_FOCALLENGTH); XtAddCallback(FocalText, XmNlosingFocusCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_FOCALLENGTH); XtAddCallback(LinesText, XmNactivateCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_LINE_ZNUDGE); XtAddCallback(LinesText, XmNlosingFocusCallback, (XtCallbackProc) text_callbacks, (XtPointer) DRAWER_LINE_ZNUDGE); for (i=0; i<3; i++) XtAddCallback(((mib_Menu *)DepthMenu->myres)->items[i], XmNactivateCallback, (XtCallbackProc) depth_callbacks, (XtPointer)(long) i); /*****************************************************************************/ TempWidget = mib_find_name(camerasload, "BackColorButton")->me; XtAddCallback(TempWidget, XmNactivateCallback, (XtCallbackProc) background_color, (XtPointer) NULL); /* Determine MG type at run time... */ if(_mgf.mg_devno == MGD_X11) { /* if we're using X11 driver */ XtUnmanageChild(SingleBuffer); } else { XtUnmanageChild(DepthMenu->me); XtAddCallback(SoftShade, XmNvalueChangedCallback, (XtCallbackProc) soft_shading, (XtPointer) NULL); } ui_build_browser(ProjectList, COUNT(proj), proj); ui_build_browser(ModelList, COUNT(mdl), mdl); /*****************************************************************************/ lastcamname[0] = '\0'; modelpos = -1; projpos = -1; keepfov = 0.0; } /*****************************************************************************/ static void background_color(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { ui_pickcolor(DRAWER_BACKCOLOR); } /*****************************************************************************/ static void soft_shading(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { gv_soft_shader(currentcam_id, cbs->set ? ON_KEYWORD : OFF_KEYWORD); } /*****************************************************************************/ static void draw_cams(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { int number; DView *dv; dv = (DView *)drawer_get_object(currentcam_id); number = dv ? !dv->cameradraw : 1; drawer_int(currentcam_id, DRAWER_CAMERADRAW, number); } /*****************************************************************************/ static void draw_sphere(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { drawer_int(currentcam_id, DRAWER_HSPHERE, cbs->set); } /*****************************************************************************/ static void toggle_singlebuffer(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { DView *dv; if((dv = (DView *)drawer_get_object(currentcam_id)) == NULL) return; mgctxselect(dv->mgctx); mgctxset(cbs->set ? MG_UNSETOPTIONS : MG_SETOPTIONS, MGO_DOUBLEBUFFER, MG_END); gv_redraw(dv->id); } /*****************************************************************************/ static void toggle_dither(Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { DView *dv; dither_state = cbs->set; if((dv = (DView *)drawer_get_object(currentcam_id)) == NULL) return; mgctxselect(dv->mgctx); mgctxset(MG_DITHER, cbs->set, MG_END); gv_redraw(dv->id); } /*****************************************************************************/ static int getfloat(char *str, float *fp) { if (sscanf(str, "%f", fp)) return 1; else return 0; } /*****************************************************************************/ static void ui_float(char *str, DrawerKeyword key, int id, float min, float max) { float f; if(getfloat(str, &f) && strcmp(str,store)) { if(f < min) f = min; else if(f > max) f = max; drawer_float(id, key, f); } else { ui_select(id); } } /*****************************************************************************/ static void text_callbacks( Widget w, XtPointer data, XmAnyCallbackStruct *cbs ) { DrawerKeyword val = (DrawerKeyword)(long)data; char *str; DView *dv; int persp = 0; str = XmTextFieldGetString(w); /* XmTextFieldSetInsertionPosition(w, (XmTextPosition) 0); */ switch(val) { case DRAWER_NEAR: case DRAWER_FAR: ui_float(str, val, currentcam_id, -1e20, 1e20); break; case DRAWER_FOV: dv = (DView *)drawer_get_object(currentcam_id); if(dv) CamGet(dv->cam, CAM_PERSPECTIVE, &persp); ui_float(str, val, currentcam_id, 1e-7, persp ? 179.999 : 1e20); break; case DRAWER_FOCALLENGTH: ui_float(str, val, currentcam_id, 1e-20, 1e20); break; case DRAWER_LINE_ZNUDGE: ui_float(str, val, currentcam_id, -10000., 10000.); break; default: break; } XtFree(str); } /*****************************************************************************/ static void list_callbacks( Widget w, XtPointer data, XmListCallbackStruct *cbs ) { int id; DrawerKeyword val = (DrawerKeyword)(long)data; if (!val) { modelpos = cbs->item_position; gv_hmodel(currentcam_id, hmodelkeyword("ModelBrowserProc", (HModelValue)(cbs->item_position - 1))); return; } else if (val == DRAWER_PROJECTION) { projpos = cbs->item_position; id = currentcam_id; drawer_int( id, val, cbs->item_position - 1); return; } else OOGLError(1,"invalid val (%d) in ObscureBrowserProc", val); return; } /*****************************************************************************/ static void depth_callbacks( Widget w, XtPointer data, XmAnyCallbackStruct *cbs ) { DView *dv; int type = (int)(long)data; depth_state = type; dv = (DView *)drawer_get_object(currentcam_id); mgctxselect(dv->mgctx); mgctxset(MG_DEPTHSORT, type, MG_END); gv_redraw(dv->id); return; } /*****************************************************************************/ void ui_target_cameraspanel(int id) { char *name; XmString xname; DView *dv; float f; int persp, opts, exists = 0; extern int id_exists(int); extern int real_id(int); if ((exists = id_exists(real_id(id)))) name = drawer_id2name(real_id(id)); else name = "No Camera"; currentcam_id = id; if (strcmp(name, lastcamname)) { sprintf(lastcamname, "%s", name); xname = XmStringCreateSimple(name); XtVaSetValues(CurrentCam, XmNlabelString, xname, NULL); XmStringFree(xname); } if (exists) { dv = (DView *) drawer_get_object(currentcam_id); if ((dv->hsphere != NULL) != XmToggleButtonGetState(SphereToggle)) XmToggleButtonSetState(SphereToggle, dv->hsphere != NULL, False); if (dv->cameradraw != XmToggleButtonGetState(DrawCams)) XmToggleButtonSetState(DrawCams, dv->cameradraw, False); mgctxselect(dv->mgctx); mgctxget(MG_SETOPTIONS, &opts); if(((opts & MGO_DOUBLEBUFFER) == 0) != XmToggleButtonGetState(SingleBuffer)) XmToggleButtonSetState(SingleBuffer, (opts & MGO_DOUBLEBUFFER) == 0, False); if ((dv->shader != NULL) != XmToggleButtonGetState(SoftShade)) XmToggleButtonSetState(SoftShade, dv->shader != NULL, False); update_x11_depth(dv, DepthMenu, DitherToggle, &depth_state, &dither_state); if (modelpos != (dv->hmodel + 1)) { XmListSelectPos(ModelList, dv->hmodel + 1, False); modelpos = dv->hmodel + 1; } CamGet(dv->cam, CAM_PERSPECTIVE, &persp); if (projpos != (persp + 1)) { XmListSelectPos(ProjectList, persp + 1, False); projpos = persp + 1; } CamGet(dv->cam, CAM_NEAR, &f); ui_set_ftext(NearClipText, f); CamGet(dv->cam, CAM_FAR, &f); ui_set_ftext(FarClipText, f); CamGet(dv->cam, CAM_FOV, &f); if (f != keepfov) { keepfov = f; ui_set_ftext(FOVText, f); } CamGet(dv->cam, CAM_FOCUS, &f); ui_set_ftext(FocalText, f); ui_set_itext(LinesText, (int)dv->lineznudge); } } /*****************************************************************************/ void update_x11_depth(DView *dv, mib_Widget *DepthMenu, Widget DitherToggle, int *depth_state, int *dither_state) { int depth, bitdepth, dither; if(XtIsManaged(DepthMenu->me)) { mgctxselect(dv->mgctx); mgctxget(MG_DEPTHSORT, &depth); if ((depth >= 0) && (depth < 3)) { if (*depth_state != depth) { XtVaSetValues(DepthMenu->me, XmNmenuHistory, ((mib_Menu *)DepthMenu->myres)->items[depth], NULL); *depth_state = depth; } } } mgctxget(MG_BITDEPTH, &bitdepth); if (bitdepth == 1) XtUnmanageChild(DitherToggle); else { mgctxget(MG_DITHER, &dither); if (*dither_state != dither) { XmToggleButtonSetState(DitherToggle, dither, False); *dither_state = dither; } } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/x11/gvcredits.c0000644000175000001440000001132710622716746016233 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "../common/lang.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Credits.mib" extern Display *dpy; extern char builddate[], buildinfo1[], buildinfo2[]; extern char *buildinfographics; extern Pixmap geomicon; /* private methods and variables */ /*****************************************************************************/ static void add_text(Widget, char *[]); /*static char geometry[40];*/ static char *credits[] = { NULL, " ", "Geomview is an interactive program for viewing and manipulating", "geometric objects, originally written by staff members of the Geometry", "Center at the University of Minnesota, starting in 1991. It can be", "used as a standalone viewer for static objects or as a display engine", "for other programs which produce dynamically changing geometry.", " ", "Many people have contributed to Geomview, among them are:", " ", "Original Geomview Kernel + GL version:", "Stuart Levy, Tamara Munzner, Mark Phillips", " ", "X Window System Version:", "Daeron Meyer, Timothy Rowley", " ", "NeXTSTEP Version:", "Daniel Krech, Scott Wisdom", " ", "Important Modifications:", "Celeste Fowler, Charlie Gunn, Nathaniel Thurston", " ", "Bug-fixes, maintenance:", "Claus-Justus Heine", " ", "Further:", "Steve Anderson, Rex Dieter, Todd Kaplan, Mario Lopez,", "Mark Meuer, Steve Robbins, Lloyd Wood and others.", " ", "Copyright 1992-1998 The Geometry Center", "Copyright 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips", "Copyright 2005-2007 Claus-Justus Heine", "http://www.geomview.org/", " ", "Geomview is free software; you can redistribute it and/or modify it", "under the terms of the GNU Lesser General Public License as published", "by the Free Software Foundation; either version 2, or (at your option)", "You should have received a copy of the GNU Lesser General Public", "License along with Geomview; see the file COPYING. If not, write to", "the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA,", "or visit http://www.gnu.org.", " ", "Compiled:", buildinfo1, buildinfo2, NULL }; /*****************************************************************************/ void ui_load_creditspanel() { Widget creditsform, creditslist, HideButton; mib_Widget *creditsload; static char Credits[] = "Credits"; /*****************************************************************************/ ui_make_panel_and_form(Credits, Root, True, True, &creditsform); /*creditsload = mib_load_interface(creditsform, "interface/Credits.mib", MI_FROMFILE);*/ creditsload = mib_load_interface(creditsform, Root, MI_FROMSTRING); XtManageChild(creditsform); /*****************************************************************************/ HideButton = mib_find_name(creditsload, "HideButton")->me; XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer) Credits); creditslist = mib_find_name(creditsload, "CreditsList")->me; add_text(creditslist, credits); } /*****************************************************************************/ static void add_text(Widget clist, char *text[]) { int line = 0; XmString str; char first[128]; sprintf(first, "Geomview %.80s %.20s", geomview_version, buildinfographics); text[0] = first; while (text[line]) { str = XmStringCreateSimple(text[line]); XmListAddItemUnselected(clist, str, 0); XmStringFree(str); line++; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/x11/bitmaps/0000777000175000001440000000000010665240700015601 500000000000000geomview-1.9.4/src/bin/geomview/x11/bitmaps/fly0000644000175000001440000000156107730235076016246 00000000000000#define fly_width 32 #define fly_height 32 static unsigned char fly_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7f, 0x02, 0x00, 0x00, 0x40, 0x02, 0x80, 0x00, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xe0, 0x03, 0x40, 0x02, 0xf0, 0x07, 0x40, 0x02, 0xf8, 0x0f, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xc0, 0x01, 0x40, 0x02, 0xe0, 0x03, 0x40, 0x02, 0xe0, 0x03, 0x40, 0x02, 0xe0, 0x03, 0x40, 0x02, 0xe0, 0x03, 0x40, 0x02, 0xf0, 0x07, 0x40, 0x02, 0xf0, 0x07, 0x40, 0x02, 0xf0, 0x07, 0x40, 0x02, 0xf8, 0x0f, 0x40, 0x02, 0xfc, 0x1f, 0x40, 0x02, 0xfe, 0x3f, 0x40, 0x02, 0xff, 0x7f, 0x40, 0x82, 0xff, 0xff, 0x40, 0xc2, 0xff, 0xff, 0x41, 0xe2, 0xff, 0xff, 0x47, 0xfa, 0xff, 0xff, 0x5f, 0x02, 0x00, 0x00, 0x40, 0xfe, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.4/src/bin/geomview/x11/bitmaps/icon0000644000175000001440000000346710454402415016401 00000000000000#define oogl_width 48 #define oogl_height 47 static unsigned char oogl_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xeb, 0xfe, 0x00, 0x00, 0x00, 0xc0, 0xbd, 0xff, 0x01, 0x00, 0x00, 0xa0, 0xef, 0xae, 0x03, 0x00, 0x00, 0x78, 0xbd, 0xf7, 0x07, 0x00, 0x00, 0xee, 0xeb, 0xbf, 0x1e, 0x00, 0x80, 0x5b, 0xff, 0xed, 0x3b, 0x00, 0xc0, 0xfe, 0xed, 0xbb, 0x6f, 0x00, 0xc0, 0x6b, 0x77, 0xef, 0xfa, 0x00, 0x60, 0xbf, 0xff, 0xfd, 0xdf, 0x03, 0xe0, 0xfa, 0xbf, 0x57, 0x75, 0x03, 0xa0, 0xff, 0xff, 0xfe, 0xdf, 0x03, 0xf0, 0xff, 0x7f, 0xdb, 0xf6, 0x06, 0xf0, 0xff, 0xff, 0xef, 0xbf, 0x03, 0xf0, 0xff, 0xff, 0xba, 0xea, 0x06, 0xf0, 0xff, 0xff, 0xff, 0xbf, 0x07, 0xf0, 0xff, 0xff, 0xad, 0xed, 0x05, 0xf0, 0xff, 0xff, 0xf7, 0x77, 0x07, 0xf0, 0xff, 0xff, 0xbf, 0xfe, 0x07, 0xf0, 0xff, 0xff, 0xeb, 0xab, 0x06, 0xf0, 0xff, 0xff, 0x7f, 0xff, 0x07, 0xf0, 0xff, 0xff, 0xef, 0x6d, 0x05, 0xf0, 0xff, 0xff, 0xbf, 0xfb, 0x07, 0xf0, 0xff, 0xff, 0x7f, 0xaf, 0x05, 0xf0, 0xff, 0xff, 0xdf, 0xfd, 0x06, 0xf0, 0xff, 0xff, 0x7f, 0xb7, 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x02, 0xf0, 0xff, 0xff, 0xff, 0x0a, 0x02, 0xf0, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x5f, 0x00, 0x01, 0xf0, 0xff, 0xff, 0x0f, 0x92, 0x00, 0xe0, 0xff, 0xff, 0x07, 0x80, 0x00, 0x80, 0xff, 0xff, 0x43, 0x44, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x51, 0x00, 0x00, 0xf8, 0xff, 0x20, 0x08, 0x00, 0x00, 0xf8, 0x7f, 0x08, 0x04, 0x00, 0x00, 0xc0, 0x3f, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x42, 0x00, 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.4/src/bin/geomview/x11/bitmaps/stop0000644000175000001440000000156407730235102016432 00000000000000#define stop_width 32 #define stop_height 32 static unsigned char stop_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x0f, 0xf8, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0x7f, 0x06, 0x03, 0xc3, 0x60, 0x72, 0xce, 0x99, 0x4c, 0x72, 0xce, 0x99, 0x4c, 0xe6, 0xcf, 0x99, 0x4c, 0x8e, 0xcf, 0x99, 0x4c, 0x3e, 0xcf, 0x99, 0x60, 0x7e, 0xce, 0x99, 0x7c, 0x72, 0xce, 0x99, 0x7c, 0x72, 0xce, 0x99, 0x7c, 0x06, 0xcf, 0xc3, 0x7c, 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0x07, 0xc0, 0xff, 0xff, 0x03, 0x80, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.4/src/bin/geomview/x11/bitmaps/zoom0000644000175000001440000000156407730235103016432 00000000000000#define zoom_width 32 #define zoom_height 32 static unsigned char zoom_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7f, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0xc0, 0x41, 0x02, 0x00, 0xf0, 0x41, 0x02, 0x00, 0x7c, 0x40, 0x02, 0x00, 0x1f, 0x40, 0x02, 0xc0, 0x07, 0x40, 0x02, 0xf0, 0x01, 0x40, 0x02, 0xfc, 0x00, 0x40, 0x02, 0x9f, 0x01, 0x40, 0xc2, 0x07, 0x03, 0x40, 0xe2, 0x01, 0x03, 0x40, 0xe2, 0x00, 0x03, 0x40, 0xe2, 0x00, 0x03, 0x40, 0xe2, 0x01, 0x03, 0x40, 0xc2, 0x07, 0x03, 0x40, 0x02, 0x9f, 0x01, 0x40, 0x02, 0xfc, 0x00, 0x40, 0x02, 0xf0, 0x01, 0x40, 0x02, 0xc0, 0x07, 0x40, 0x02, 0x00, 0x1f, 0x40, 0x02, 0x00, 0x7c, 0x40, 0x02, 0x00, 0xf0, 0x41, 0x02, 0x00, 0xc0, 0x41, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0xfe, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.4/src/bin/geomview/x11/bitmaps/translate0000644000175000001440000000160307730235102017434 00000000000000#define translate_width 32 #define translate_height 32 static unsigned char translate_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0xe8, 0x02, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x06, 0xe0, 0x00, 0x00, 0x1c, 0xe0, 0xff, 0xff, 0x3f, 0xe0, 0xff, 0xff, 0x7f, 0xe0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.4/src/bin/geomview/x11/bitmaps/orbit0000644000175000001440000000156707730235077016602 00000000000000#define orbit_width 32 #define orbit_height 32 static unsigned char orbit_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7f, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x1e, 0x00, 0x40, 0x02, 0x3f, 0x00, 0x40, 0x02, 0x3f, 0x00, 0x40, 0x02, 0x3f, 0x00, 0x40, 0x02, 0x3f, 0x00, 0x40, 0x02, 0x1e, 0x00, 0x40, 0x02, 0x00, 0x00, 0x58, 0x02, 0x20, 0x00, 0x5e, 0x02, 0x62, 0x80, 0x5f, 0x02, 0xe3, 0xc0, 0x5f, 0x82, 0xe3, 0x01, 0x5f, 0xc2, 0xe3, 0x83, 0x5f, 0xe2, 0xa3, 0xc1, 0x53, 0xc2, 0x82, 0xe3, 0x41, 0xe2, 0x00, 0xf7, 0x40, 0x72, 0x00, 0x7f, 0x40, 0x7a, 0x00, 0x3e, 0x40, 0x3a, 0x80, 0x1f, 0x40, 0xfa, 0xff, 0x0f, 0x40, 0xfa, 0xff, 0x07, 0x40, 0xfa, 0xff, 0x01, 0x40, 0xc2, 0x7f, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0xfe, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.4/src/bin/geomview/x11/bitmaps/reset0000644000175000001440000000156707730235100016570 00000000000000#define reset_width 32 #define reset_height 32 static unsigned char reset_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x01, 0x60, 0x0c, 0x80, 0x01, 0x30, 0x18, 0x80, 0x01, 0x18, 0x30, 0x91, 0x89, 0x0c, 0xe0, 0xb1, 0x8d, 0x07, 0xc0, 0xe1, 0x87, 0x03, 0xe0, 0xc1, 0x83, 0x07, 0xf0, 0x81, 0x81, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xf0, 0x0f, 0x0c, 0x60, 0xf0, 0x0f, 0x06, 0xc0, 0x30, 0x0c, 0x03, 0xfe, 0x31, 0x8c, 0x7f, 0xfe, 0x31, 0x8c, 0x7f, 0xc0, 0x30, 0x0c, 0x03, 0x60, 0xf0, 0x0f, 0x06, 0x30, 0xf0, 0x0f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x81, 0x81, 0x0f, 0xe0, 0xc1, 0x83, 0x07, 0xc0, 0xe1, 0x87, 0x03, 0xe0, 0xb1, 0x8d, 0x07, 0x30, 0x91, 0x89, 0x0c, 0x18, 0x80, 0x01, 0x18, 0x0c, 0x80, 0x01, 0x30, 0x06, 0x80, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.4/src/bin/geomview/x11/bitmaps/scale0000644000175000001440000000156707730235101016536 00000000000000#define scale_width 32 #define scale_height 32 static unsigned char scale_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x80, 0xff, 0x7f, 0x00, 0xa0, 0x01, 0x70, 0x00, 0x90, 0x01, 0x68, 0x00, 0x80, 0x01, 0x60, 0x00, 0x88, 0x01, 0x62, 0x00, 0x84, 0x01, 0x61, 0x00, 0x80, 0x01, 0x60, 0x00, 0x82, 0x41, 0x60, 0x00, 0x81, 0x21, 0x60, 0x00, 0x80, 0x01, 0x60, 0x80, 0x80, 0x09, 0x60, 0x40, 0x80, 0x05, 0x60, 0x00, 0x80, 0x01, 0x60, 0x20, 0x80, 0xff, 0x7f, 0x10, 0x80, 0xff, 0x7f, 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0xfc, 0x1f, 0x00, 0x08, 0xfc, 0x1f, 0x00, 0x02, 0x0c, 0x18, 0x00, 0x01, 0x0c, 0x18, 0x40, 0x00, 0x0c, 0x18, 0x20, 0x00, 0x0c, 0x18, 0x08, 0x00, 0x0c, 0x18, 0x04, 0x00, 0x0c, 0x18, 0x01, 0x00, 0x0c, 0x98, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.4/src/bin/geomview/x11/bitmaps/down_arrow0000644000175000001440000000045607730235075017636 00000000000000#define down_arrow_width 16 #define down_arrow_height 16 static unsigned char down_arrow_bits[] = { 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x54, 0x55, 0xa8, 0x6a, 0x50, 0x35, 0xa0, 0x1a, 0x40, 0x0d, 0x80, 0x06, 0x00, 0x03}; geomview-1.9.4/src/bin/geomview/x11/bitmaps/up_arrow0000644000175000001440000000045007730235103017275 00000000000000#define up_arrow_width 16 #define up_arrow_height 16 static unsigned char up_arrow_bits[] = { 0x00, 0x01, 0x80, 0x02, 0x40, 0x05, 0xa0, 0x0a, 0x50, 0x15, 0xa8, 0x2a, 0x5c, 0x7d, 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x40, 0x0d, 0xa0, 0x0a, 0x40, 0x0d, 0xe0, 0x0f}; geomview-1.9.4/src/bin/geomview/x11/bitmaps/center0000644000175000001440000000157207730235074016734 00000000000000#define center_width 32 #define center_height 32 static unsigned char center_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.4/src/bin/geomview/x11/bitmaps/Makefile.am0000644000175000001440000000016407730235074017561 00000000000000EXTRA_DIST = center down_arrow fly icon lookat orbit reset \ rotate scale stop translate up_arrow zoom geomview-1.9.4/src/bin/geomview/x11/bitmaps/Makefile.in0000644000175000001440000002476510665240477017613 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomview/x11/bitmaps DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = center down_arrow fly icon lookat orbit reset \ rotate scale stop translate up_arrow zoom all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomview/x11/bitmaps/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomview/x11/bitmaps/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomview/x11/bitmaps/lookat0000644000175000001440000000157207730235077016750 00000000000000#define lookat_width 32 #define lookat_height 32 static unsigned char lookat_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x8c, 0x18, 0x00, 0x00, 0x82, 0x20, 0x00, 0x00, 0xe2, 0x23, 0x00, 0x06, 0x81, 0x40, 0x30, 0x26, 0x89, 0x48, 0x32, 0x26, 0x89, 0x48, 0x32, 0xfe, 0xff, 0xff, 0x3f, 0x26, 0x89, 0x48, 0x32, 0x26, 0x89, 0x48, 0x32, 0x06, 0x81, 0x40, 0x30, 0x00, 0xe2, 0x23, 0x00, 0x00, 0x82, 0x20, 0x00, 0x00, 0x8c, 0x18, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.4/src/bin/geomview/x11/bitmaps/rotate0000644000175000001440000000157207730235100016740 00000000000000#define rotate_width 32 #define rotate_height 32 static unsigned char rotate_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x80, 0x07, 0x02, 0x00, 0xc0, 0x03, 0x06, 0x00, 0xe0, 0x01, 0x1e, 0x00, 0xf8, 0x00, 0xfe, 0x00, 0x7e, 0x00, 0xfe, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0xe0, 0xff, 0x07, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; geomview-1.9.4/src/bin/geomview/x11/gvmain.c0000644000175000001440000001342010605242446015506 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "../common/main.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/comm.h" #include "../common/lang.h" #include "../common/worldio.h" #include "mibload.h" #include "gvui.h" #include "string.h" /* Floating-point handling strategy lifted from GSL - the GNU * Scientific Library. */ #if HAVE_FPU_CONTROL_H # include /* Apparently _FPU_SETCW was not available in libc5, but __setfpucw() was */ # if !defined(_FPU_SETCW) && HAVE___SETFPUCW # if HAVE_i386_FPU_CONTROL_H # include # endif # define _FPU_SETCW(cw) __setfpucw(cw) # endif #endif #include /* xgv main - global variables */ /*****************************************************************************/ /* set initial camera background color */ extern HandleOps CommandOps, GeomOps; extern void ui_windowWillOpen(DView *dv); /* private methods */ /*****************************************************************************/ static void parse_args(int argc, char *argv[]); static void env_usage(); /*****************************************************************************/ int main(int argc, char **argv) { int i; CameraStruct cs; #if defined(_FPU_SETCW) fpu_control_t hctrlword = _FPU_IEEE; _FPU_SETCW(hctrlword); #endif signal(SIGFPE, SIG_IGN); /* Ignore e.g. divide-by-zero traps */ /* (Need this at least for Alpha/OSF & FreeBSD) */ load_interface(argc,argv); init_geomview(argc, argv); cam_mgdevice(); /* in gvcamui.c */ parse_args(argc, argv); /* load command & data file(s) */ cs.h = NULL; cs.cam = NULL; for (i=0; i < gv_nwins; i++) if (!dview[i]) {/* ui_windowWillOpen((DView *)NULL); */ gv_new_camera(NULL, &cs); } ui_final_init(); main_loop(); return 0; } /*****************************************************************************/ void env_init() { extern char *getenv(); extern void set_load_path(char **); extern void set_emodule_path(char **); #define MAXDIRS 100 char *dirs[MAXDIRS]; char *geomview_load_path = getenv("GEOMVIEW_LOAD_PATH"); char *p, *geomview_emodule_path = getenv("GEOMVIEW_EMODULE_PATH"); int i; if (geomview_load_path == NULL) { env_usage(); exit(1); } geomview_system_initfile = getenv("GEOMVIEW_SYSTEM_INITFILE"); if (geomview_load_path) { char *path = strdup(geomview_load_path); for(i=0, p = strtok(path, ":"); p; p = strtok(NULL, ":"), i++) dirs[i] = p; dirs[i] = NULL; set_load_path(dirs); free(path); } if (geomview_emodule_path) { char *path = strdup(geomview_emodule_path); for(i=0, p = strtok(path, ":"); p; p = strtok(NULL, ":"), i++) dirs[i] = p; dirs[i] = NULL; set_emodule_path(dirs); gv_emodule_sort(); free(path); } #undef MAXDIRS } /*****************************************************************************/ static void env_usage() { fprintf(stderr, "The shell environment variable GEOMVIEW_LOAD_PATH is not set;\n\ are you trying to run the geomview executable, gvx, directly?\n\ If so, try running the main geomview shell script, called\n\ \"geomview\" instead. It takes care of setting this and other\n\ relevant environment variables for you.\n\ \n\ If for some reason you do not have the \"geomview\" shell\n\ script you should obtain a copy of geomview from www.geomview.org.\n\ \n\ Geomview expects the following environment variables to be\n\ set\n\ \n\ GEOMVIEW_LOAD_PATH\n\ colon-separated list of directories that geomview should\n\ look in for files you load\n\ \n\ GEOMVIEW_EMODULE_PATH\n\ colon-separated list of directories that geomview should\n\ look in for external modules (these appear in the\n\ \"Applications\" browser on the main panel).\n\ \n\ GEOMVIEW_SYSTEM_INITFILE\n\ pathname of a system-wide initialization file (.geomview)\n\ to read upon startup\n"); } /*****************************************************************************/ #define STREQ(s1,s2) (strcmp(s1,s2)==0) /*****************************************************************************/ static void parse_args(int argc, char *argv[]) { char **av; int ac; for (ac = argc, av = argv+1; --ac > 0; av++) { if(!parse_common_arg(&ac, &av)) { usage(argv[0], ""); } } } /*****************************************************************************/ /* there should be some way to avoid putting this here, but the call to ntsc is in the COMMON code.... (why?) :P */ int isntsc() { return 0; } int ntsc(int on) { return 0; } /*****************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/x11/gvload.c0000644000175000001440000001021110622716746015504 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "../common/drawer.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Input.mib" #include "X11/IntrinsicP.h" /* for XtMoveWidget */ extern Display *dpy; extern Widget TopLevel; /* private methods and variables */ /*****************************************************************************/ static Widget shell, loadform; static Widget FileBrowserButton, HideButton, OKButton, TextField; /*static int pos_later = 0, posx = 0, posy = 0; static char geometry[40];*/ static void do_load(Widget w, XtPointer data, XmAnyCallbackStruct *cbs); static void action_load(Widget, XEvent *, String *, Cardinal *); static XtActionsRec actions[1] = { { "GVLoad", action_load } }; static String loadtransl = "Return: GVLoad()"; /*****************************************************************************/ void ui_load_loadpanel() { mib_Widget *loadload; XtTranslations LoadTransl; static char Load[] = "Load"; /*****************************************************************************/ XtAppAddActions(App, actions, 1); shell = ui_make_panel_and_form(Load, Root, False, True, &loadform); /*loadload = mib_load_interface(loadform, "interface/MiniLoad.mib", MI_FROMFILE);*/ loadload = mib_load_interface(loadform, Root, MI_FROMSTRING); XtManageChild(loadform); FileBrowserButton = mib_find_name(loadload, "FileBrowser")->me; HideButton = mib_find_name(loadload, "Cancel")->me; OKButton = mib_find_name(loadload, "OK")->me; TextField = mib_find_name(loadload, "FileName")->me; XtAddCallback(HideButton, XmNactivateCallback, (XtCallbackProc)ui_hide, (XtPointer) Load); XtAddCallback(OKButton, XmNactivateCallback, (XtCallbackProc)do_load, (XtPointer) NULL); XtAddCallback(FileBrowserButton, XmNactivateCallback, (XtCallbackProc)ui_show, (XtPointer)"Files"); XtVaSetValues(TextField, XmNblinkRate, 0, NULL); LoadTransl = XtParseTranslationTable(loadtransl); XtOverrideTranslations(TextField, LoadTransl); } /*****************************************************************************/ void ui_show_loadpanel() { Window root, child; int x, y, wx, wy, posx = 0, posy = 0; unsigned int mask; XtManageChild(loadform); if(XQueryPointer(dpy, DefaultRootWindow(dpy), &root, &child, &x, &y, &wx, &wy, &mask)) { posx = (x -= 20) < 0 ? 0 : x; posy = (y -= 20) < 0 ? 0 : y; } XtMoveWidget(shell, posx, posy); XtSetMappedWhenManaged(loadform, True); XtRealizeWidget(shell); XRaiseWindow(dpy, XtWindow(shell)); XtSetKeyboardFocus(loadform, TextField); XmTextFieldSetSelection(TextField, 0, 9999, last_event_time); } /*****************************************************************************/ static void do_load(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { char *str = XmTextGetString(TextField); if(str != NULL && str[0] != '\0') gv_load( str, NULL ); ui_hide(w, "Load", NULL); } static void action_load(Widget w, XEvent *event, String *argv, Cardinal *argc) { do_load(w, NULL, NULL); } geomview-1.9.4/src/bin/geomview/x11/interface/0000777000175000001440000000000010665240700016102 500000000000000geomview-1.9.4/src/bin/geomview/x11/interface/Credits.mib0000644000175000001440000000330410603762441020107 00000000000000char Root[] = "\ TotalWidgets: 5\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 532\n\ Xmheight: 640\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CreditsList\"\n\ Xmwidth: 480\n\ Xmheight: 480\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 40\n\ XmbottomOffset: 5\n\ XmleftOffset: 6\n\ XmrightOffset: 6\n\ Private-\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 43\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 5\n\ XmbottomOffset: 196\n\ XmleftOffset: 201\n\ XmrightOffset: 5\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 22\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 9\n\ XmbottomOffset: 200\n\ XmleftOffset: 78\n\ XmrightOffset: 81\n\ Private-\n\ label: \"Credits\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 360\n\ Xmheight: 260\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/geomview/x11/interface/Appearance.mib0000644000175000001440000002563107730235110020553 00000000000000char Root[] = "\ TotalWidgets: 31\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 307\n\ Xmheight: 367\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TexQToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 188\n\ XmbottomOffset: 179\n\ XmleftOffset: 181\n\ XmrightOffset: 126\n\ Private-\n\ label: \"[aq] Tx Quality\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"VectToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 180\n\ XmbottomOffset: 188\n\ XmleftOffset: 55\n\ XmrightOffset: 252\n\ Private-\n\ label: \"[aV] Vects\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OverrideToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 8\n\ XmbottomOffset: 359\n\ XmleftOffset: 108\n\ XmrightOffset: 199\n\ Private-\n\ label: \"[ao] Override\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FacingNormalsToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 178\n\ XmbottomOffset: 189\n\ XmleftOffset: 9\n\ XmrightOffset: 298\n\ Private-\n\ label: \"[av] Facing Normals\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ConcaveToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 201\n\ XmbottomOffset: 166\n\ XmleftOffset: 9\n\ XmrightOffset: 298\n\ Private-\n\ label: \"[aC] Concave\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ShadeLineToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 222\n\ XmbottomOffset: 145\n\ XmleftOffset: 9\n\ XmrightOffset: 298\n\ Private-\n\ label: \"[al] Shade Lines\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TexToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 164\n\ XmbottomOffset: 203\n\ XmleftOffset: 180\n\ XmrightOffset: 127\n\ Private-\n\ label: \"[at] Texture\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 23\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 40\n\ XmbottomOffset: 306\n\ XmleftOffset: 11\n\ XmrightOffset: 256\n\ Private-\n\ label: \"Color:\"\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 47\n\ Xmheight: 22\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 37\n\ XmbottomOffset: 308\n\ XmleftOffset: 70\n\ XmrightOffset: 190\n\ Private-\n\ label: \"Show:\"\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 43\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 4\n\ XmbottomOffset: 333\n\ XmleftOffset: 260\n\ XmrightOffset: 4\n\ Private-\n\ label: \"Hide\"\n\ EndWidget.\n\ Ref: 12\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DiceInput\"\n\ Xmwidth: 52\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 326\n\ XmbottomOffset: 11\n\ XmleftOffset: 7\n\ XmrightOffset: 248\n\ Private-\n\ EndWidget.\n\ Ref: 13\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"NormInput\"\n\ Xmwidth: 52\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 289\n\ XmbottomOffset: 48\n\ XmleftOffset: 8\n\ XmrightOffset: 247\n\ Private-\n\ EndWidget.\n\ Ref: 14\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"LineInput\"\n\ Xmwidth: 52\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 253\n\ XmbottomOffset: 84\n\ XmleftOffset: 8\n\ XmrightOffset: 247\n\ Private-\n\ EndWidget.\n\ Ref: 15\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 125\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 325\n\ XmbottomOffset: 12\n\ XmleftOffset: 55\n\ XmrightOffset: 127\n\ Private-\n\ label: \"[ad] Patch Dicing\"\n\ EndWidget.\n\ Ref: 16\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 125\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 288\n\ XmbottomOffset: 49\n\ XmleftOffset: 61\n\ XmrightOffset: 121\n\ Private-\n\ label: \"[ah] Normal Length\"\n\ EndWidget.\n\ Ref: 17\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 125\n\ Xmheight: 32\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 250\n\ XmbottomOffset: 85\n\ XmleftOffset: 50\n\ XmrightOffset: 132\n\ Private-\n\ label: \"[aw] Line Width\"\n\ EndWidget.\n\ Ref: 18\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"RevButton\"\n\ Xmwidth: 78\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 6\n\ XmbottomOffset: 331\n\ XmleftOffset: 6\n\ XmrightOffset: 223\n\ Private-\n\ label: \"[ax] Revert\"\n\ EndWidget.\n\ Ref: 19\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BBoxColor\"\n\ Xmwidth: 43\n\ Xmheight: 22\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 135\n\ XmbottomOffset: 210\n\ XmleftOffset: 7\n\ XmrightOffset: 257\n\ Private-\n\ label: \"[Cb]\"\n\ EndWidget.\n\ Ref: 20\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"NormalColor\"\n\ Xmwidth: 43\n\ Xmheight: 22\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 112\n\ XmbottomOffset: 233\n\ XmleftOffset: 7\n\ XmrightOffset: 257\n\ Private-\n\ label: \"[Cn]\"\n\ EndWidget.\n\ Ref: 21\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EdgeColor\"\n\ Xmwidth: 43\n\ Xmheight: 22\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 88\n\ XmbottomOffset: 257\n\ XmleftOffset: 7\n\ XmrightOffset: 257\n\ Private-\n\ label: \"[Ce]\"\n\ EndWidget.\n\ Ref: 22\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FaceColor\"\n\ Xmwidth: 43\n\ Xmheight: 22\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 63\n\ XmbottomOffset: 282\n\ XmleftOffset: 7\n\ XmrightOffset: 257\n\ Private-\n\ label: \"[Cf]\"\n\ EndWidget.\n\ Ref: 23\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BBoxToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 157\n\ XmbottomOffset: 210\n\ XmleftOffset: 55\n\ XmrightOffset: 252\n\ Private-\n\ label: \"[ab] BBoxes\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 24\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"NormalToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 132\n\ XmbottomOffset: 236\n\ XmleftOffset: 55\n\ XmrightOffset: 252\n\ Private-\n\ label: \"[an] Normals\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 25\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EdgeToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 88\n\ XmbottomOffset: 257\n\ XmleftOffset: 55\n\ XmrightOffset: 252\n\ Private-\n\ label: \"[ae] Edges\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 26\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FaceToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 63\n\ XmbottomOffset: 282\n\ XmleftOffset: 55\n\ XmrightOffset: 252\n\ Private-\n\ label: \"[af] Faces\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 27\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"NormList\"\n\ Xmwidth: 116\n\ Xmheight: 79\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 275\n\ XmbottomOffset: 13\n\ XmleftOffset: 188\n\ XmrightOffset: 3\n\ Private-\n\ EndWidget.\n\ Ref: 28\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 18\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 249\n\ XmbottomOffset: 100\n\ XmleftOffset: 198\n\ XmrightOffset: 19\n\ Private-\n\ label: \"Normalize\"\n\ EndWidget.\n\ Ref: 29\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ShadeList\"\n\ Xmwidth: 113\n\ Xmheight: 89\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 68\n\ XmbottomOffset: 210\n\ XmleftOffset: 191\n\ XmrightOffset: 3\n\ Private-\n\ EndWidget.\n\ Ref: 30\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 92\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 41\n\ XmbottomOffset: 296\n\ XmleftOffset: 201\n\ XmrightOffset: 14\n\ Private-\n\ label: \"Shading\"\n\ EndWidget.\n\ Ref: 31\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 310\n\ Xmheight: 367\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: -3\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/geomview/x11/interface/Material.mib0000644000175000001440000001554107730235117020260 00000000000000char Root[] = "\ TotalWidgets: 20\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 249\n\ Xmheight: 269\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TransparentToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 238\n\ XmbottomOffset: 6\n\ XmleftOffset: 8\n\ XmrightOffset: 241\n\ Private-\n\ label: \"[aT] Transparent\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"SpecularText\"\n\ Xmwidth: 70\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 170\n\ XmbottomOffset: 69\n\ XmleftOffset: 172\n\ XmrightOffset: 7\n\ Private-\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ShininessText\"\n\ Xmwidth: 70\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 132\n\ XmbottomOffset: 107\n\ XmleftOffset: 172\n\ XmrightOffset: 7\n\ Private-\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AmbientText\"\n\ Xmwidth: 70\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 95\n\ XmbottomOffset: 144\n\ XmleftOffset: 172\n\ XmrightOffset: 7\n\ Private-\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DiffuseText\"\n\ Xmwidth: 70\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 56\n\ XmbottomOffset: 183\n\ XmleftOffset: 172\n\ XmrightOffset: 7\n\ Private-\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"SpecularScale\"\n\ Xmwidth: 162\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 175\n\ XmbottomOffset: 74\n\ XmleftOffset: 6\n\ XmrightOffset: 81\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ShininessScale\"\n\ Xmwidth: 162\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 137\n\ XmbottomOffset: 112\n\ XmleftOffset: 6\n\ XmrightOffset: 81\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AmbientScale\"\n\ Xmwidth: 162\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 99\n\ XmbottomOffset: 150\n\ XmleftOffset: 6\n\ XmrightOffset: 81\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DiffuseScale\"\n\ Xmwidth: 162\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 60\n\ XmbottomOffset: 189\n\ XmleftOffset: 6\n\ XmrightOffset: 81\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 139\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 151\n\ XmbottomOffset: 88\n\ XmleftOffset: 4\n\ XmrightOffset: 106\n\ Private-\n\ label: \"Specular Reflectance\"\n\ EndWidget.\n\ Ref: 12\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 67\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 114\n\ XmbottomOffset: 125\n\ XmleftOffset: 4\n\ XmrightOffset: 178\n\ Private-\n\ label: \"Shininess\"\n\ EndWidget.\n\ Ref: 13\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 136\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 75\n\ XmbottomOffset: 164\n\ XmleftOffset: 4\n\ XmrightOffset: 109\n\ Private-\n\ label: \"Ambient Reflectance\"\n\ EndWidget.\n\ Ref: 14\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 129\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 37\n\ XmbottomOffset: 202\n\ XmleftOffset: 4\n\ XmrightOffset: 116\n\ Private-\n\ label: \"Diffuse Reflectance\"\n\ EndWidget.\n\ Ref: 15\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 43\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 6\n\ XmbottomOffset: 234\n\ XmleftOffset: 201\n\ XmrightOffset: 6\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 16\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 22\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 9\n\ XmbottomOffset: 238\n\ XmleftOffset: 78\n\ XmrightOffset: 81\n\ Private-\n\ label: \"Material\"\n\ EndWidget.\n\ Ref: 17\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AlphaText\"\n\ Xmwidth: 70\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 208\n\ XmbottomOffset: 31\n\ XmleftOffset: 172\n\ XmrightOffset: 7\n\ Private-\n\ EndWidget.\n\ Ref: 18\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AlphaScale\"\n\ Xmwidth: 162\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 213\n\ XmbottomOffset: 36\n\ XmleftOffset: 6\n\ XmrightOffset: 81\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 19\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 67\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 189\n\ XmbottomOffset: 50\n\ XmleftOffset: 3\n\ XmrightOffset: 179\n\ Private-\n\ label: \"Alpha\"\n\ EndWidget.\n\ Ref: 20\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 249\n\ Xmheight: 269\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/geomview/x11/interface/Input.mib0000644000175000001440000000331207730235114017607 00000000000000char Root[] = "\ TotalWidgets: 5\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 535\n\ Xmheight: 85\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OK\"\n\ Xmwidth: 44\n\ Xmheight: 27\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 5\n\ XmbottomOffset: 53\n\ XmleftOffset: 115\n\ XmrightOffset: 376\n\ Private-\n\ label: \"OK\"\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Cancel\"\n\ Xmwidth: 47\n\ Xmheight: 27\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 5\n\ XmbottomOffset: 52\n\ XmleftOffset: 166\n\ XmrightOffset: 322\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FileBrowser\"\n\ Xmwidth: 100\n\ Xmheight: 27\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 5\n\ XmbottomOffset: 53\n\ XmleftOffset: 5\n\ XmrightOffset: 430\n\ Private-\n\ label: \"File Browser\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FileName\"\n\ Xmwidth: 520\n\ Xmheight: 27\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 38\n\ XmbottomOffset: 15\n\ XmleftOffset: 6\n\ XmrightOffset: 9\n\ Private-\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/geomview/x11/interface/Lights.mib0000644000175000001440000000744107730235114017751 00000000000000char Root[] = "\ TotalWidgets: 11\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 285\n\ Xmheight: 132\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DeleteButton\"\n\ Xmwidth: 49\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 93\n\ XmbottomOffset: 9\n\ XmleftOffset: 227\n\ XmrightOffset: 9\n\ Private-\n\ label: \"Delete\"\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AddButton\"\n\ Xmwidth: 49\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 93\n\ XmbottomOffset: 9\n\ XmleftOffset: 175\n\ XmrightOffset: 61\n\ Private-\n\ label: \"Add\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ColorButton\"\n\ Xmwidth: 61\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 93\n\ XmbottomOffset: 9\n\ XmleftOffset: 111\n\ XmrightOffset: 114\n\ Private-\n\ label: \"Color\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"IntensityScale\"\n\ Xmwidth: 166\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 59\n\ XmbottomOffset: 53\n\ XmleftOffset: 111\n\ XmrightOffset: 8\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 55\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 34\n\ XmbottomOffset: 68\n\ XmleftOffset: 110\n\ XmrightOffset: 120\n\ Private-\n\ label: \"Intensity\"\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 44\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 5\n\ XmbottomOffset: 97\n\ XmleftOffset: 236\n\ XmrightOffset: 5\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"LightsToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 7\n\ XmbottomOffset: 125\n\ XmleftOffset: 109\n\ XmrightOffset: 176\n\ Private-\n\ label: \"Show Lights [ls]\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 71\n\ Xmheight: 18\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 10\n\ XmbottomOffset: 104\n\ XmleftOffset: 11\n\ XmrightOffset: 203\n\ Private-\n\ label: \"Lights\"\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"LightsList\"\n\ Xmwidth: 76\n\ Xmheight: 92\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 30\n\ XmbottomOffset: 10\n\ XmleftOffset: 8\n\ XmrightOffset: 201\n\ Private-\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 284\n\ Xmheight: 132\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/geomview/x11/interface/Tool.mib0000644000175000001440000002400310560450700017420 00000000000000char Root[] = "\ TotalWidgets: 29\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 105\n\ Xmheight: 500\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 0\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ \n\ Ref: 2\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ResetButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 430\n\ XmbottomOffset: 30\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"Reset\"\n\ EndWidget.\n\ \n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CenterButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 430\n\ XmbottomOffset: 30\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"Center\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"LookAtButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 370\n\ XmbottomOffset: 90\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"LookAt\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"StopButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 370\n\ XmbottomOffset: 90\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"Stop\"\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OrbitButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 310\n\ XmbottomOffset: 150\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"Orbit\"\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ZoomButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 310\n\ XmbottomOffset: 150\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"Zoom\"\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FlyButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 250\n\ XmbottomOffset: 210\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"Fly\"\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ScaleButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 250\n\ XmbottomOffset: 210\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"Scale\"\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TranslateButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 190\n\ XmbottomOffset: 270\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"Translate\"\n\ EndWidget.\n\ \n\ Ref: 11\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"RotateButton\"\n\ Xmwidth: 40\n\ Xmheight: 40\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 190\n\ XmbottomOffset: 270\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"Rotate\"\n\ EndWidget.\n\ \n\ Ref: 12\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 45\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 470\n\ XmbottomOffset: 10\n\ XmleftOffset: 55\n\ XmrightOffset: 5\n\ Private-\n\ label: \"[W]reset\"\n\ EndWidget.\n\ \n\ Ref: 13\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 51\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 470\n\ XmbottomOffset: 10\n\ XmleftOffset: 3\n\ XmrightOffset: 51\n\ Private-\n\ label: \"[w]center\"\n\ EndWidget.\n\ \n\ Ref: 14\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 410\n\ XmbottomOffset: 70\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"[L]ook\"\n\ EndWidget.\n\ Ref: 15\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 410\n\ XmbottomOffset: 70\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"[H]alt\"\n\ EndWidget.\n\ Ref: 16\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 350\n\ XmbottomOffset: 130\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"[o]rbit\"\n\ EndWidget.\n\ Ref: 17\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 350\n\ XmbottomOffset: 130\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"[z]oom\"\n\ EndWidget.\n\ Ref: 18\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 290\n\ XmbottomOffset: 190\n\ XmleftOffset: 55\n\ XmrightOffset: 10\n\ Private-\n\ label: \"[f]ly\"\n\ EndWidget.\n\ Ref: 19\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 290\n\ XmbottomOffset: 190\n\ XmleftOffset: 10\n\ XmrightOffset: 55\n\ Private-\n\ label: \"[s]cale\"\n\ EndWidget.\n\ Ref: 20\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 230\n\ XmbottomOffset: 250\n\ XmleftOffset: 55\n\ XmrightOffset: 5\n\ Private-\n\ label: \"[t]rans\"\n\ EndWidget.\n\ \n\ Ref: 21\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 40\n\ Xmheight: 20\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 230\n\ XmbottomOffset: 250\n\ XmleftOffset: 5\n\ XmrightOffset: 55\n\ Private-\n\ label: \"[r]otate\"\n\ EndWidget.\n\ \n\ Ref: 29\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BBoxCenterToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 150\n\ XmbottomOffset: 330\n\ XmleftOffset: 3\n\ XmrightOffset: 102\n\ Private-\n\ label: \"[B]Box Center\"\n\ indicatorSize: 0\n\ EndWidget.\n\ \n\ Ref: 22\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 85\n\ Xmheight: 15\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 100\n\ XmbottomOffset: 385\n\ XmleftOffset: 10\n\ XmrightOffset: 10\n\ Private-\n\ label: \"Center\"\n\ EndWidget.\n\ \n\ Ref: 23\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CenterText\"\n\ Xmwidth: 95\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 120\n\ XmbottomOffset: 350\n\ XmleftOffset: 5\n\ XmrightOffset: 5\n\ Private-\n\ EndWidget.\n\ \n\ Ref: 24\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 85\n\ Xmheight: 15\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 45\n\ XmbottomOffset: 440\n\ XmleftOffset: 10\n\ XmrightOffset: 10\n\ Private-\n\ label: \"Target\"\n\ EndWidget.\n\ \n\ Ref: 25\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TargetText\"\n\ Xmwidth: 95\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 65\n\ XmbottomOffset: 405\n\ XmleftOffset: 5\n\ XmrightOffset: 5\n\ Private-\n\ EndWidget.\n\ \n\ Ref: 26\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"MainButton\"\n\ Xmwidth: 40\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 5\n\ XmbottomOffset: 465\n\ XmleftOffset: 5\n\ XmrightOffset: 60\n\ Private-\n\ label: \"Main\"\n\ EndWidget.\n\ \n\ Ref: 27\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 40\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 5\n\ XmbottomOffset: 465\n\ XmleftOffset: 60\n\ XmrightOffset: 5\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 28\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 105\n\ Xmheight: 500\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/geomview/x11/interface/Makefile.am0000644000175000001440000000033607730235116020060 00000000000000EXTRA_DIST = Appearance.mib Commands.mib Lights.mib Material.mib \ Cameras.mib Credits.mib LoadPaths.mib Save.mib \ Color.mib Input.mib MainPanel.mib Tool.mib geomview-1.9.4/src/bin/geomview/x11/interface/Makefile.in0000644000175000001440000002514510665240477020105 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomview/x11/interface DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = Appearance.mib Commands.mib Lights.mib Material.mib \ Cameras.mib Credits.mib LoadPaths.mib Save.mib \ Color.mib Input.mib MainPanel.mib Tool.mib all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomview/x11/interface/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomview/x11/interface/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomview/x11/interface/Commands.mib0000644000175000001440000000455307730235112020257 00000000000000char Root[] = "\ TotalWidgets: 7\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 434\n\ Xmheight: 182\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 49\n\ Xmheight: 24\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 120\n\ XmbottomOffset: 38\n\ XmleftOffset: 380\n\ XmrightOffset: 5\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DownButton\"\n\ Xmwidth: 25\n\ Xmheight: 24\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 120\n\ XmbottomOffset: 38\n\ XmleftOffset: 34\n\ XmrightOffset: 375\n\ Private-\n\ label: \"\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"UpButton\"\n\ Xmwidth: 25\n\ Xmheight: 24\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 120\n\ XmbottomOffset: 38\n\ XmleftOffset: 6\n\ XmrightOffset: 403\n\ Private-\n\ label: \"\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CommandScroll\"\n\ Xmwidth: 423\n\ Xmheight: 112\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 6\n\ XmbottomOffset: 64\n\ XmleftOffset: 6\n\ XmrightOffset: 5\n\ Private-\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CommandText\"\n\ Xmwidth: 422\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 147\n\ XmbottomOffset: 5\n\ XmleftOffset: 6\n\ XmrightOffset: 6\n\ Private-\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 434\n\ Xmheight: 182\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/geomview/x11/interface/Color.mib0000644000175000001440000001260410516251646017576 00000000000000char Root[] = "\ TotalWidgets: 16\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 204\n\ Xmheight: 175\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ColorModel\"\n\ Xmwidth: 40\n\ Xmheight: 29\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 6\n\ XmbottomOffset: 140\n\ XmleftOffset: 86\n\ XmrightOffset: 78\n\ Private-\n\ label: \"RGB\"\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 45\n\ Xmheight: 24\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 141\n\ XmbottomOffset: 10\n\ XmleftOffset: 6\n\ XmrightOffset: 153\n\ Private-\n\ label: \"HSV\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 43\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 108\n\ XmbottomOffset: 37\n\ XmleftOffset: 5\n\ XmrightOffset: 156\n\ Private-\n\ label: \"RGB\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HSVText\"\n\ Xmwidth: 150\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 140\n\ XmbottomOffset: 6\n\ XmleftOffset: 52\n\ XmrightOffset: 6\n\ Private-\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BLabel\"\n\ Xmwidth: 19\n\ Xmheight: 23\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 82\n\ XmbottomOffset: 70\n\ XmleftOffset: 4\n\ XmrightOffset: 181\n\ Private-\n\ label: \"B\"\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"GLabel\"\n\ Xmwidth: 19\n\ Xmheight: 23\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 60\n\ XmbottomOffset: 92\n\ XmleftOffset: 4\n\ XmrightOffset: 181\n\ Private-\n\ label: \"G\"\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"RLabel\"\n\ Xmwidth: 19\n\ Xmheight: 23\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 38\n\ XmbottomOffset: 114\n\ XmleftOffset: 4\n\ XmrightOffset: 181\n\ Private-\n\ label: \"R\"\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"RGBText\"\n\ Xmwidth: 151\n\ Xmheight: 31\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 106\n\ XmbottomOffset: 38\n\ XmleftOffset: 51\n\ XmrightOffset: 6\n\ Private-\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CancelButton\"\n\ Xmwidth: 56\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 5\n\ XmbottomOffset: 140\n\ XmleftOffset: 5\n\ XmrightOffset: 143\n\ Private-\n\ label: \"Cancel\"\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DoneButton\"\n\ Xmwidth: 52\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 6\n\ XmbottomOffset: 140\n\ XmleftOffset: 151\n\ XmrightOffset: 6\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 12\n\ Widget: \"DrawingArea\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ColorTest\"\n\ Xmwidth: 62\n\ Xmheight: 64\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 38\n\ XmbottomOffset: 73\n\ XmleftOffset: 139\n\ XmrightOffset: 6\n\ Private-\n\ EndWidget.\n\ Ref: 13\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BScale\"\n\ Xmwidth: 110\n\ Xmheight: 19\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 82\n\ XmbottomOffset: 74\n\ XmleftOffset: 25\n\ XmrightOffset: 69\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 14\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"GScale\"\n\ Xmwidth: 110\n\ Xmheight: 19\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 60\n\ XmbottomOffset: 96\n\ XmleftOffset: 25\n\ XmrightOffset: 69\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 15\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"RScale\"\n\ Xmwidth: 110\n\ Xmheight: 19\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 38\n\ XmbottomOffset: 118\n\ XmleftOffset: 25\n\ XmrightOffset: 69\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 16\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 209\n\ Xmheight: 174\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 1\n\ XmbottomOffset: 1\n\ XmleftOffset: 1\n\ XmrightOffset: 1\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/geomview/x11/interface/LoadPaths.mib0000644000175000001440000000254307730235115020375 00000000000000char Root[] = "\ TotalWidgets: 4\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 248\n\ Xmheight: 94\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 107\n\ Xmheight: 15\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 6\n\ XmbottomOffset: 75\n\ XmleftOffset: 7\n\ XmrightOffset: 134\n\ Private-\n\ label: \"Path List\"\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"PathList\"\n\ Xmwidth: 237\n\ Xmheight: 65\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 23\n\ XmbottomOffset: 8\n\ XmleftOffset: 6\n\ XmrightOffset: 5\n\ Private-\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 248\n\ Xmheight: 94\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/geomview/x11/interface/MainPanel.mib0000644000175000001440000000734307730235115020365 00000000000000char Root[] = "\ TotalWidgets: 11\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 381\n\ Xmheight: 234\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"KeyText\"\n\ Xmwidth: 76\n\ Xmheight: 36\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 11\n\ XmbottomOffset: 187\n\ XmleftOffset: 9\n\ XmrightOffset: 296\n\ Private-\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 16\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 57\n\ XmbottomOffset: 161\n\ XmleftOffset: 45\n\ XmrightOffset: 246\n\ Private-\n\ label: \"Targets\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EtchedInFrame\"\n\ Xmwidth: 170\n\ Xmheight: 24\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 5\n\ XmtopOffset: 53\n\ XmbottomOffset: 157\n\ XmleftOffset: 9\n\ XmrightOffset: 188\n\ Private-\n\ shadowtype: 2\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 43\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 5\n\ XmbottomOffset: 199\n\ XmleftOffset: 333\n\ XmrightOffset: 5\n\ Private-\n\ label: \"Hide\"\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 114\n\ Xmheight: 16\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 57\n\ XmbottomOffset: 161\n\ XmleftOffset: 211\n\ XmrightOffset: 8\n\ Private-\n\ label: \"External Modules\"\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EtchedInFrame\"\n\ Xmwidth: 176\n\ Xmheight: 24\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 1\n\ XmtopOffset: 53\n\ XmbottomOffset: 157\n\ XmleftOffset: 196\n\ XmrightOffset: 9\n\ Private-\n\ shadowtype: 2\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EmoduleList\"\n\ Xmwidth: 176\n\ Xmheight: 143\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 5\n\ XmrightAttachment: 1\n\ XmtopOffset: 83\n\ XmbottomOffset: 8\n\ XmleftOffset: 191\n\ XmrightOffset: 9\n\ Private-\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ObjectList\"\n\ Xmwidth: 171\n\ Xmheight: 143\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 5\n\ XmtopOffset: 83\n\ XmbottomOffset: 8\n\ XmleftOffset: 8\n\ XmrightOffset: 189\n\ Private-\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"GVTitle\"\n\ Xmwidth: 88\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 9\n\ XmbottomOffset: 195\n\ XmleftOffset: 117\n\ XmrightOffset: 176\n\ Private-\n\ label: \"Geomview X\"\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 381\n\ Xmheight: 234\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/geomview/x11/interface/Save.mib0000644000175000001440000000426010565075130017411 00000000000000char Root[] = "\ TotalWidgets: 5\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 249\n\ Xmheight: 85\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Object\"\n\ Xmwidth: 140\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 44\n\ XmbottomOffset: 11\n\ XmleftOffset: 69\n\ XmrightOffset: 40\n\ Private-\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 41\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 43\n\ XmbottomOffset: 12\n\ XmleftOffset: 26\n\ XmrightOffset: 182\n\ Private-\n\ label: \"For:\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Menu\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ObjectMenu\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 4\n\ XmbottomOffset: 37\n\ XmleftOffset: 20\n\ XmrightOffset: 20\n\ Private-\n\ numitems: 14\n\ item: \"Commands\"\n\ item: \"Geometry Alone\"\n\ item: \"Geometry [in world]\"\n\ item: \"Geometry [in universe]\"\n\ item: \"RMan [->tiff]\"\n\ item: \"RMan [->frame]\"\n\ item: \"PPM GLX off-screen snapshot\"\n\ item: \"PPM Mesa off-screen snapshot\"\n\ item: \"SGI Screen snapshot\"\n\ item: \"PPM Screen snapshot\"\n\ item: \"PPM software snapshot\"\n\ item: \"PostScript snapshot\"\n\ item: \"Camera\"\n\ item: \"Transform [to world]\"\n\ item: \"Transform [to universe]\"\n\ item: \"Window\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 249\n\ Xmheight: 85\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/geomview/x11/interface/Cameras.mib0000644000175000001440000002155307730235111020067 00000000000000char Root[] = "\ TotalWidgets: 25\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 194\n\ Xmheight: 559\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Singlebuffer\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 107\n\ XmbottomOffset: 452\n\ XmleftOffset: 5\n\ XmrightOffset: 189\n\ Private-\n\ label: \"[vs] Single-Buffering\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DitherToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 151\n\ XmbottomOffset: 412\n\ XmleftOffset: 5\n\ XmrightOffset: 189\n\ Private-\n\ label: \"[vD] Turn On Dithering\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Menu\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DepthMenu\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 69\n\ XmbottomOffset: 463\n\ XmleftOffset: 7\n\ XmrightOffset: 20\n\ Private-\n\ numitems: 3\n\ item: \"[0vh] None\"\n\ item: \"[1vh] Depth Sort\"\n\ item: \"[2vh] Z-Buffer\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"HideButton\"\n\ Xmwidth: 38\n\ Xmheight: 28\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 7\n\ XmbottomOffset: 527\n\ XmleftOffset: 143\n\ XmrightOffset: 6\n\ Private-\n\ label: \"Done\"\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DrawSphereToggle\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 196\n\ XmbottomOffset: 367\n\ XmleftOffset: 5\n\ XmrightOffset: 189\n\ Private-\n\ label: \"[ai] Draw Unit Sphere\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 18\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 469\n\ XmbottomOffset: 75\n\ XmleftOffset: 51\n\ XmrightOffset: 53\n\ Private-\n\ label: \"Space Model\"\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"SpaceModelList\"\n\ Xmwidth: 154\n\ Xmheight: 58\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 489\n\ XmbottomOffset: 12\n\ XmleftOffset: 20\n\ XmrightOffset: 20\n\ Private-\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"LCText\"\n\ Xmwidth: 60\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 431\n\ XmbottomOffset: 98\n\ XmleftOffset: 120\n\ XmrightOffset: 14\n\ Private-\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FLText\"\n\ Xmwidth: 60\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 399\n\ XmbottomOffset: 130\n\ XmleftOffset: 120\n\ XmrightOffset: 14\n\ Private-\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FOVText\"\n\ Xmwidth: 60\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 366\n\ XmbottomOffset: 163\n\ XmleftOffset: 120\n\ XmrightOffset: 14\n\ Private-\n\ EndWidget.\n\ Ref: 12\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FCText\"\n\ Xmwidth: 60\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 332\n\ XmbottomOffset: 197\n\ XmleftOffset: 120\n\ XmrightOffset: 14\n\ Private-\n\ EndWidget.\n\ Ref: 13\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"NCText\"\n\ Xmwidth: 60\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 299\n\ XmbottomOffset: 230\n\ XmleftOffset: 120\n\ XmrightOffset: 14\n\ Private-\n\ EndWidget.\n\ Ref: 14\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"LCLabel\"\n\ Xmwidth: 118\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 432\n\ XmbottomOffset: 101\n\ XmleftOffset: 3\n\ XmrightOffset: 77\n\ Private-\n\ label: \"Lines Closer [vc]\"\n\ alignment: 2\n\ EndWidget.\n\ Ref: 15\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 108\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 397\n\ XmbottomOffset: 132\n\ XmleftOffset: 9\n\ XmrightOffset: 77\n\ Private-\n\ label: \"Focal Length [vl]\"\n\ alignment: 2\n\ EndWidget.\n\ Ref: 16\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 364\n\ XmbottomOffset: 165\n\ XmleftOffset: 43\n\ XmrightOffset: 77\n\ Private-\n\ label: \"FOV [vv]\"\n\ alignment: 2\n\ EndWidget.\n\ Ref: 17\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 333\n\ XmbottomOffset: 200\n\ XmleftOffset: 35\n\ XmrightOffset: 77\n\ Private-\n\ label: \"Far clip [vf]\"\n\ alignment: 2\n\ EndWidget.\n\ Ref: 18\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 87\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 5\n\ XmtopOffset: 297\n\ XmbottomOffset: 232\n\ XmleftOffset: 30\n\ XmrightOffset: 77\n\ Private-\n\ label: \"Near clip [vn]\"\n\ alignment: 2\n\ EndWidget.\n\ Ref: 19\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"ProjectList\"\n\ Xmwidth: 156\n\ Xmheight: 42\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 245\n\ XmbottomOffset: 272\n\ XmleftOffset: 21\n\ XmrightOffset: 17\n\ Private-\n\ EndWidget.\n\ Ref: 20\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 18\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 221\n\ XmbottomOffset: 320\n\ XmleftOffset: 51\n\ XmrightOffset: 53\n\ Private-\n\ label: \"Projection\"\n\ EndWidget.\n\ Ref: 21\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BackColorButton\"\n\ Xmwidth: 180\n\ Xmheight: 30\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 40\n\ XmbottomOffset: 492\n\ XmleftOffset: 5\n\ XmrightOffset: 9\n\ Private-\n\ label: \"Background Color [CB]\"\n\ EndWidget.\n\ Ref: 22\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"SoftShadeButton\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 129\n\ XmbottomOffset: 430\n\ XmleftOffset: 5\n\ XmrightOffset: 189\n\ Private-\n\ label: \"[v~] Software Shading\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 23\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DrawCamsButton\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 5\n\ XmrightAttachment: 0\n\ XmtopOffset: 174\n\ XmbottomOffset: 387\n\ XmleftOffset: 5\n\ XmrightOffset: 189\n\ Private-\n\ label: \"[vd] Draw Other Cameras\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 24\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CurrentLabel\"\n\ Xmwidth: 139\n\ Xmheight: 25\n\ XmtopAttachment: 5\n\ XmbottomAttachment: 5\n\ XmleftAttachment: 5\n\ XmrightAttachment: 5\n\ XmtopOffset: 8\n\ XmbottomOffset: 524\n\ XmleftOffset: 23\n\ XmrightOffset: 32\n\ Private-\n\ label: \"Current\"\n\ EndWidget.\n\ Ref: 25\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 194\n\ Xmheight: 559\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/geomview/x11/gvsave.c0000644000175000001440000002242710622716746015537 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" #include "../common/drawer.h" #include "../common/ui.h" #include "../common/comm.h" #include "../common/worldio.h" #include "../common/lang.h" #include "gvui.h" static /* prefix to ``char Root[]...'' */ #include "interface/Save.mib" extern Display *dpy; extern Widget TopLevel; /* private methods and variables */ /*****************************************************************************/ static void select_type(Widget, XtPointer, XmAnyCallbackStruct *); static void save_selection(Widget, XtPointer, XmFileSelectionBoxCallbackStruct *); static int suitable_id(int, char **); static Widget shell, saveobj, geomobj, saveform, savewrapper, filetext; static int savechoice = 0; static int blinkrate; #define SAVE_WIO 0 #define SAVE_RMan 1 #define SAVE_SNAP 2 #define SAVE_PS 3 #define SAVE_PANELS 4 static struct saveops { int special; HandleOps *ops; int flag; char *name; } save[] = { /* Note: * This table *must* match the list of items given in the * interface/Save.mib file for the ObjectMenu widget! */ { SAVE_WIO, &CommandOps, 0, "Commands" }, { SAVE_WIO, &GeomOps, SELF, "Geometry alone" }, { SAVE_WIO, &GeomOps, WORLDGEOM, "Geometry [in world]" }, { SAVE_WIO, &GeomOps, UNIVERSE, "Geometry [in universe]"}, { SAVE_RMan, NULL, TIFF_KEYWORD, "RMan [->tiff]" }, { SAVE_RMan, NULL, FRAME_KEYWORD, "RMan [->frame]" }, { SAVE_SNAP, NULL, 4, "PPM GLX off-screen snapshot"}, { SAVE_SNAP, NULL, 3, "PPM Mesa off-screen snapshot"}, { SAVE_SNAP, NULL, 2, "SGI screen snapshot" }, { SAVE_SNAP, NULL, 1, "PPM screen snapshot" }, { SAVE_SNAP, NULL, 0, "PPM software snapshot" }, { SAVE_PS, NULL, 0, "PostScript snapshot" }, { SAVE_WIO, &CamOps, UNIVERSE, "Camera" }, { SAVE_WIO, &TransOps, WORLDGEOM, "Transform [to world]" }, { SAVE_WIO, &TransOps, UNIVERSE, "Transform [to universe]"}, { SAVE_WIO, &WindowOps, UNIVERSE, "Window" }, }; /* Indexed by save[].flag value. "ppm" must come first (hard-coded below) */ static char *snaptypenames[] = { "ppm", "ppmscreen", "sgi", "ppmosmesa", "ppmosglx" }; extern snap_entry snapshot_table[]; /*****************************************************************************/ void ui_load_savepanel() { int n; Widget savetypeform, temp; mib_Widget *savetypeload, *m_saveobj; mib_Menu *objectmenu; XmString label_text; XmString xname; static char Save[] = "Save"; /*****************************************************************************/ shell = ui_make_panel_and_form(Save, Root, False, True, &savewrapper); /*****************************************************************************/ saveform = XmCreateFileSelectionBox(savewrapper, "Save", NULL, 0); XtManageChild(saveform); temp = XmFileSelectionBoxGetChild(saveform, XmDIALOG_HELP_BUTTON); XtUnmanageChild(temp); XtAddCallback(saveform, XmNokCallback, (XtCallbackProc) save_selection, (XtPointer) NULL); temp = XmFileSelectionBoxGetChild(saveform, XmDIALOG_CANCEL_BUTTON); xname = XmStringCreateSimple("Hide"); XtVaSetValues(temp, XmNlabelString, xname, NULL); XmStringFree(xname); XtAddCallback(temp, XmNactivateCallback, (XtCallbackProc) ui_hide, (XtPointer) Save); /*****************************************************************************/ /*savetypeload = mib_load_interface(saveform, "interface/Save.mib", MI_FROMFILE);*/ savetypeload = mib_load_interface(saveform, Root, MI_FROMSTRING); savetypeform = savetypeload->me; m_saveobj = mib_find_name(savetypeload, "ObjectMenu"); saveobj = m_saveobj->me; objectmenu = (mib_Menu *)m_saveobj->myres; filetext = XmFileSelectionBoxGetChild(saveform, XmDIALOG_TEXT); XtVaGetValues(filetext, XmNblinkRate, &blinkrate, NULL); label_text = XmStringCreateLtoR("", XmSTRING_DEFAULT_CHARSET); XtVaSetValues(saveobj, XmNlabelString, label_text, NULL); XmStringFree(label_text); for (n = 0; n < objectmenu->numitems; n++) { XtAddCallback(objectmenu->items[n], XmNactivateCallback, (XtCallbackProc) select_type, (XtPointer)(long) n); /* If this is a possibly-absent snapshot item, check whether it's * really supported. */ if(save[n].special == SAVE_SNAP && save[n].flag != 0) { int ok = 0; snap_entry *s; for(s = snapshot_table; s->name != NULL; s++) { if(strcmp(s->name, snaptypenames[save[n].flag]) == 0) { ok = 1; break; } } if(!ok) XtUnmanageChild(objectmenu->items[n]); } } geomobj = mib_find_name(savetypeload, "Object")->me; XmTextFieldSetString(geomobj, "World"); XtManageChild(savetypeform); } void ui_show_savepanel() { XtVaSetValues(filetext, XmNblinkRate, blinkrate, NULL); XtManageChild(saveform); } /*****************************************************************************/ static int suitable_id(int savetype, char **namep) { struct saveops *sp = &save[savetype]; int id = drawer_idbyname(*namep); if(savetype >= 0 && savetype < COUNT(save)) { if(sp->ops == &CamOps || sp->ops == &WindowOps || sp->special == SAVE_RMan || sp->special == SAVE_SNAP || sp->special == SAVE_PS) { if(!ISCAM(id)) id = FOCUSID; } else if(sp->ops == &GeomOps && !ISGEOM(id)) id = GEOMID(uistate.targetgeom); } *namep = drawer_id2name(id); return (id != UNIVERSE && drawer_get_object(id) == NULL) ? NOID : id; } /*****************************************************************************/ static void select_type(Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { savechoice = (int)(long)data; } /*****************************************************************************/ static void save_selection(Widget w, XtPointer data, XmFileSelectionBoxCallbackStruct *cbs) { char *fname, *object, *wobject; int id; Pool *p; struct saveops *sp; Dimension width, height; if (!XmStringGetLtoR(cbs->value, XmSTRING_DEFAULT_CHARSET, &fname)) return; if (!fname || *fname == '\0') { return; } wobject = object = XmTextFieldGetString(geomobj); if(fname == NULL || object == NULL || *fname == '\0' || *object == '\0' || savechoice < 0) { goto out; } if((id = suitable_id(savechoice, &object)) == NOID) { XmTextFieldSetString(geomobj, "?"); goto out; } sp = &save[savechoice]; switch(sp->special) { case SAVE_WIO: p = PoolStreamTemp(fname, NULL, (!strcmp(fname,"-"))?stdout:NULL, 1, sp->ops); if(p == NULL) { OOGLError(1, "Can't open output: %s: %s", fname, sperror()); return; } worldio(sp->ops, p, sp->flag, id); PoolClose(p); PoolDelete(p); break; case SAVE_RMan: gv_rib_display(sp->flag, fname); gv_rib_snapshot(id, fname); break; case SAVE_SNAP: gv_snapshot(id, fname, snaptypenames[sp->flag], 0, 0); break; case SAVE_PS: gv_snapshot(id, fname, "ps", 0, 0); break; case SAVE_PANELS: /* Do nothing ... yet :-) */ break; } /* Ugh. Older Motif versions (?) don't remember to cancel their * blink timers if we simply unrealize the shell widget from inside this * callback routine. Even stuffing the XtUnrealizeWidget() in a workproc * doesn't fix it. So remove its contents before unmapping it. * But, then we need to save and restore its size, too, lest it be * zero size when it reappears. Something's broken here, but I can't * guess what. */ XtSetKeyboardFocus(shell, None); XtVaSetValues(filetext, XmNblinkRate, 0, NULL); XtVaGetValues(shell, XmNwidth, &width, XmNheight, &height, NULL); XtUnmanageChild(saveform); ui_showpanel(P_SAVE, 0); XtVaSetValues(shell, XmNwidth, width, XmNheight, height, NULL); uistate.savewhat = NOID; out: if (fname) { XtFree(fname); } if (wobject) { XtFree(wobject); } } /*****************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/0000777000175000001440000000000010665240677015036 500000000000000geomview-1.9.4/src/bin/geomview/common/ui.c0000644000175000001440000002351610622716746015540 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include #include #include #include #include #include #include "lisp.h" #include "lang.h" #include "drawer.h" #include "transform.h" #include "ui.h" #include "motion.h" #include "event.h" #include "comm.h" char *shades[5] = { "[0as] Constant", /* APF_CONSTANT */ "[1as] Flat", /* APF_FLAT */ "[2as] Smooth", /* APF_SMOOTH */ "[3as] CSmooth", /* APF_CSMOOTH */ "[4as] VCflat", /* APF_VCFLAT */ }; char *norm[4] = { "[0N] None", /* NONE */ "[1N] Individual", /* EACH */ "[2N] Sequence", /* ALL */ "[3N] Keep", /* KEEP */ }; char *proj[2] = { "[0vp] Orthographic", /* ORTHOGRAPHIC */ "[1vp] Perspective", /* PERSPECTIVE */ }; char *spc[3] = { "[me] Euclidean", /* EUCLIDEAN */ "[mh] Hyperbolic", /* HYPERBOLIC */ "[ms] Spherical", /* SPHERICAL */ }; char *mdl[3] = { "[mv] Virtual", /* VIRTUAL */ "[mp] Projective", /* PROJECTIVE */ "[mc] Conformal", /* CONFORMALBALL */ }; char OBJROTATE[] = "[r] Rotate"; char OBJTRANSLATE[] = "[t] Translate"; char OBJZOOM[] = "[z] Cam Zoom"; char OBJSCALE[] = "[s] Geom Scale"; char OBJFLY[] = "[f] Cam Fly"; char OBJORBIT[] = "[o] Cam Orbit"; char LIGHTEDIT[] = "[le] Edit Lights"; /* in ui.c */ void cui_init() { uistate.targetid = WORLDGEOM; uistate.centerid = TARGETID; uistate.bbox_center = 0; uistate.targetgeom = 0; /* World geom is index 0 */ uistate.targetcam = INDEXOF(FOCUSID); uistate.cam_wm_focus = 0; /* bad idea */ uistate.mode_count = 0; uistate.emod_dir = NULL; uistate.apoverride = ~0; /* Enable override by default */ uistate.inertia = 1; /* Enable inertia by default */ uistate.pick_invisible = 1; /* Pick invisible as well as visible objects? */ /* * The order of these calls must be the same as the declared integers * in ui.h!! */ ui_install_mode(OBJROTATE, minterp_rotate, T_NONE); ui_install_mode(OBJZOOM, minterp_zoom, T_CAM); ui_install_mode(OBJTRANSLATE, minterp_translate, T_NONE); ui_install_mode(OBJFLY, minterp_fly, T_CAM); ui_install_mode(OBJORBIT, minterp_orbit, T_CAM); ui_install_mode(OBJSCALE, minterp_scale, T_GEOM); VVINIT(uistate.emod, emodule, 10); vvzero(&uistate.emod); uistate.savewhat = NOID; uistate.cursor_still = UI_CURSOR_STILL; uistate.cursor_twitch = UI_CURSOR_TWITCH; uistate.longwhile = 2.5; /* Max credible inter-redraw interval */ uistate.backface = 0; return; } void ui_reinstall_mode(char *name, PFI proc, int type, int index) { uistate.modenames[index] = name; uistate.modes[index] = proc; uistate.modetype[index] = type; } void ui_install_mode(char *name, PFI proc, int type) { if(uistate.mode_count >= MAXMODES) { OOGLError(1, "Motion-mode table full (max %d entries)", MAXMODES); uistate.mode_count = MAXMODES-1; } uistate.modenames[uistate.mode_count] = name; uistate.modes[uistate.mode_count] = proc; uistate.modetype[uistate.mode_count] = type; ++uistate.mode_count; D1PRINT(("ui_install_mode: name=%s, proc=%x\n", name, proc)); } void ui_uninstall_mode(char *name) { int i = ui_mode_index(name); if (i<0) return; --uistate.mode_count; while (i= VVCOUNT(uistate.emod)) return; em = &VVEC(uistate.emod, emodule)[k]; for(i = k+1; i < VVCOUNT(uistate.emod); i++, em++) *em = *(em+1); VVCOUNT(uistate.emod)--; uistate.emod_changed = k+1; } emodule * ui_emodule_install(int before, char *ename, PFI func) { int i,k; emodule *em, *emp; if((k = ui_emodule_index(ename,NULL)) >= 0) ui_emodule_uninstall(k); k = VVCOUNT(uistate.emod)++; vvneeds(&uistate.emod, VVCOUNT(uistate.emod)); if(before > k) before = k; else if(before < 0) before = 0; /* Shift the part of emodule table below the insertion point down one unit. Don't use bcopy() for this because it does not correctly handle overlapping src and dst. mbp Wed Sep 9 19:07:39 1992 */ em = VVEC(uistate.emod, emodule); for (i=VVCOUNT(uistate.emod)-1, emp = &em[i]; i>before; i--, emp--) *emp = *(emp-1); em = &VVEC(uistate.emod, emodule)[before]; em->name = strdup(ename); em->func = (PFV)func; em->dir = uistate.emod_dir; /* Other emodule fields zeroed */ uistate.emod_changed = before+1; return em; } LDEFINE(emodule_clear, LVOID, "(emodule-clear)\n\ Clears the geomview application (external module) browser.") { LDECLARE(("emodule-clear", LBEGIN, LEND)); while (VVCOUNT(uistate.emod)) ui_emodule_uninstall(0); return Lt; } int ui_emodule_index(char *ename, emodule **emp) { int i; emodule *em; if(!emp) emp = &em; for (i=0, em=VVEC(uistate.emod, emodule); iname, ename)==0) { *emp = em; return i; } *emp = NULL; return -1; } /*----------------------------------------------------------------------- * Function: set_ui_target * Description: set the target of user actions * Args: type: T_GEOM or T_CAM * index: index of current geom or current cam * Returns: * Author: mbp * Date: Thu Nov 21 14:04:28 1991 * Notes: equivalent to set_ui_target_id( ID(type, index) ) */ void set_ui_target(int type, int index) { uistate.targetid = ID(type, index); switch (uistate.targettype = type) { case T_GEOM: uistate.targetgeom = index; if (uistate.bbox_center && uistate.targetid != WORLDGEOM) { make_center_from_bbox("CENTER", uistate.targetid); } break; case T_CAM: uistate.targetcam = index; break; } } void set_ui_center(int id) { uistate.centerid = id; } void set_ui_center_origin(int use_bbox_center) { uistate.bbox_center = use_bbox_center != 0; /* boolean value */ if (uistate.bbox_center && uistate.targetid != WORLDGEOM) { make_center_from_bbox("CENTER", uistate.targetid); } } void set_ui_wm_focus(int cam_wm_focus) { uistate.cam_wm_focus = cam_wm_focus != 0; } /*----------------------------------------------------------------------- * Function: set_ui_target_id * Description: set the target id of user actions * Args: id: id to target * Returns: * Author: mbp * Date: Thu Nov 21 14:05:33 1991 * Notes: equivalent to set_ui_target( TYPEOF(id), INDEXOF(id) ) */ void set_ui_target_id(int id) { set_ui_target( TYPEOF(id), INDEXOF(id) ); } void ui_cleanup() { int i; for(i = VVCOUNT(uistate.emod); --i >= 0; ) { if(VVEC(uistate.emod, emodule)[i].pid > 0) { emodule_kill(&VVEC(uistate.emod, emodule)[i]); } } gv_delete(ALLCAMS); } /* maybe replace this later with something more useful: */ void ui_targeting() {} /**********************************************************************/ /* for debugging */ void print_emodtable() { emodule *em; int i; for(i=0, em=VVEC(uistate.emod,emodule); iname); } return; } LDEFINE(cursor_still, LVOID, "(cursor-still [INT])\n\ Sets the number of microseconds for which the cursor must not\n\ move to as holding still. If INT is not specified,\n\ the value will be reset to the default.") { uistate.cursor_still = UI_CURSOR_STILL; LDECLARE(("cursor-still", LBEGIN, LOPTIONAL, LINT, &uistate.cursor_still, LEND)); return Lt; } LDEFINE(cursor_twitch, LVOID, "(cursor-twitch [INT])\n\ Sets the distance which the cursor must not move (in x or\n\ y) to as holding still. If INT is not specified,\n\ the value will be reset to the default.") { uistate.cursor_twitch = UI_CURSOR_TWITCH; LDECLARE(("cursor-twitch", LBEGIN, LOPTIONAL, LINT, &uistate.cursor_twitch, LEND)); return Lt; } LDEFINE(ap_override, LVOID, "(ap-override [on|off])\n\ Selects whether appearance controls should override objects' own\n\ settings. On by default. With no arguments, returns current setting.") { Keyword kw = NO_KEYWORD; LDECLARE(("ap-override", LBEGIN, LOPTIONAL, LKEYWORD, &kw, LEND)); if(kw < 0) { int on = uistate.apoverride ? ON_KEYWORD : OFF_KEYWORD; return LNew(LKEYWORD, &on); } drawer_int(WORLDGEOM, DRAWER_APOVERRIDE, boolval("ap-override", kw)); return Lt; } int uispace(int space) { switch (space) { case TM_EUCLIDEAN: return EUCLIDEAN; case TM_HYPERBOLIC: return HYPERBOLIC; case TM_SPHERICAL: return SPHERICAL; } return -1; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/ui.h0000644000175000001440000002043310611207442015522 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #ifndef UI_H #define UI_H #include "common.h" #define MAXMODES 16 /* Max built-in motion modes */ #define MAXMORE 10 #define MAXTOOLS 10 /* Max built-in tools */ #define MAXACTIONS 10 /* Max built-in actions */ typedef struct _emodule { char *name; void (*func)(); char *text; int pid; Pool *link; void *data; char *dir; } emodule; typedef struct { int targetgeom; /* index of target Geom for user actions */ int targetcam; /* index of target Camera for user actions */ int targettype; /* T_GEOM, T_CAM, or T_NONE */ int targetid; /* id of target (geom or cam) (moving obj) */ int centerid; /* id of center of motion) */ int bbox_center; /* use center of bbox of centerid as origin */ int mousefocus; /* index of camera (window) where mouse is */ int cam_wm_focus; /* true: activate cam-win on * FocusChange events, false: activate * cam-win on mouse-cross events. */ int savewhat; /* What in the world did we want to save? (NOID = all) */ /* * Motion modes are no longer separated into two arrays of geoms and cams. * Everything is in one array. */ PFI modes[MAXMODES]; /* motion procs */ char *modenames[MAXMODES]; /* motion names */ int modetype[MAXMODES]; /* type of motion: T_NONE if could be either, T_CAM or T_GEOM if specific*/ int mode_count; /* number of entries in above arrays */ int mode_current; /* current mode */ vvec emod; /* External module table */ int emod_changed; /* Set if browser changed since drawn */ int emod_check; /* Set if some emodule died */ char *emod_dir; /* if non-NULL, pathname of emodule's dir */ int lights_shown; /* are lights drawn? */ int current_light; /* currently selected light for editing */ int cursor_on; /* cursor visible? */ int clamp_cursor; /* cursor clamped to center of window */ int cursor_still; /* microseconds in which cursor must not move to as holding still */ int cursor_twitch; /* distance cursor must not move (in either x or y) to register as holding still. */ float longwhile; /* Max credible real time (in seconds) * between redraws. If dt > longwhile, * clamp it to longwhile to avoid huge * jumps in motion. */ Color pickedbboxcolor; /* Color of picked objects' bboxes */ int backface; /* Cull back-facing polygons */ int apoverride; /* -1 if appearance controls should * override, else 0 */ int ownmotion; /* Interactive motions with respect to * object's own coordinates, not camera. */ int constrained; /* Constrain interactive motions to * just one (X/Y) axis, whichever is * greater. */ int inertia; /* Motions have inertia */ int freeze; /* Whether to freeze UI panels */ int pick_invisible; /* Should picks be sensitive to invisible objects? */ } UIState; extern UIState uistate; /* shading */ #define CONSTANTSHADE APF_CONSTANT #define FLATSHADE APF_FLAT #define SMOOTHSHADE APF_SMOOTH extern char *shades[5]; /* normalization --- these must be consective beginning with 0 --- they are used as indices into the "norm" array !!! */ typedef enum { NONE = 0, EACH, ALL, KEEP } Normalization; extern char *norm[4]; /* projection */ typedef enum { ORTHOGRAPHIC = 0, PERSPECTIVE } Projection; extern char *proj[2]; /* UI space */ /* NOTE: These are now strictly UI values. Internally space is recorded using TM_EUCLIDEAN, etc from transform3.h. */ #define EUCLIDEAN 0 #define HYPERBOLIC 1 #define SPHERICAL 2 extern char *spc[3]; extern char *mdl[3]; /* motion mode names */ extern char OBJROTATE[]; /* Rotate */ extern char OBJTRANSLATE[]; /* Translate */ extern char OBJSCALE[]; /* Scale */ extern char OBJZOOM[]; /* Zoom -- FOV! */ extern char OBJFLY[]; /* Cam Fly */ extern char OBJORBIT[]; /* Cam Orbit */ extern char LIGHTEDIT[]; /* Edit Lights */ #define IMMEDIATE 1 #define NOIMMEDIATE 0 /* Tools */ /* These MUST match the order declared in cui_init!! */ #define TOOL_ROT 0 #define TOOL_ZOOM 1 #define TOOL_TRANS 2 #define TOOL_FLY 3 #define TOOL_ORBIT 4 #define TOOL_SCALE 5 /* Actions */ #define ACTION_STOP 0 #define ACTION_PAUSE 1 #define ACTION_CENTER 2 #define ACTION_RESET 3 #define ACTION_LOOK 4 #define UI_ADD 0 #define UI_REPLACE 1 #define UI_ADDCAMERA 2 #define UI_TARGET 0 #define UI_CENTER 1 /* Cursor */ #define UI_CURSOR_STILL 100 #define UI_CURSOR_TWITCH 5 /* in ui.c */ extern void ui_install_mode(char *name, PFI proc, int type); extern void ui_reinstall_mode(char *name, PFI proc, int type, int index); extern void ui_uninstall_mode(char *name); extern int ui_mode_index(char *name); extern emodule *ui_emodule_install(int after, char *external, PFI func); extern int ui_emodule_index(char *external, emodule **emp); extern void ui_emodule_uninstall(int index); extern void set_ui_target(int type, int index); extern void set_ui_center(int id); extern void set_ui_target_id(int id); extern void set_ui_center_origin(int use_bbox_center); extern void set_ui_wm_focus(int cam_wm_focus); extern void ui_cleanup(); /* in glui.c */ extern int ui_panelshown(int index); extern void ui_showpanel( int index, int show ); extern void ui_init(); extern void env_init(); extern void ui_lights_changed(); extern void set_light_display(int lightno); extern void ui_keyboard(int ch); extern void timing(int interval); extern void ui_add_mode(char *name, PFI proc, int type); extern void ui_remove_mode(char *name); extern void ui_replace_mode(char *name, PFI proc, int type, int index); extern void ui_event_mode(char *mode); extern void ui_action(int val); extern void ui_popup_message(char *s); extern void ui_mousefocus(int index); extern void ui_objectchange(); extern void ui_maybe_refresh(int id); extern void set_light_intensity(float intens); extern void lights_changed_check(); extern void ui_light_button(); extern void ui_changed_lights(); /* ui_fileio() pops up a file browser/input panel. * It loads the resulting file if dosave==0, * saves state into it otherwise. */ extern void ui_fileio( int dosave ); /* ui_pickcolor() pops up a color picker, * sets the color associated with the given code, * e.g. DRAWER_EDGECOLOR or DRAWER_BACKCOLOR. */ extern void ui_pickcolor( int drawer_code ); /* ui_curson() toggles cursor visibility. * 1 : enable, 0 : disable, -1 : toggle. */ extern void ui_curson( int toggle ); /* ui_name2panel() looks up the name of a UI panel * and returns a UI-specific index if found, * otherwise zero. */ extern int ui_name2panel( char *name ); /* ui_showpanel() makes the given UI panel visible * or invisible, according to 'show' */ extern void ui_showpanel( int index, int show ); /* ui_manual_browser() tries to spawn an external * html or pdf browser to give access to the manual. * "type" may be either "html" or "pdf", other values * are silently ignored. */ extern void ui_manual_browser(const char *type); /* ui_panelwindow() specifies positioning for the * given UI panel from the given WnWindow. */ extern void ui_panelwindow( int index, WindowStruct *ws ); extern void cui_init(); extern int uispace(int space); extern void ui_windowWillOpen(DView *dv); extern void ui_windowDidOpen(DView *dv); #endif /* ! UI_H */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/shaders.c0000644000175000001440000002742210622716746016554 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Software shaders. * These operate in the mg environment. */ #include "drawer.h" #include "mgP.h" #include "3d.h" #define DOT(a,b) ((a).x*(b).x + (a).y*(b).y + (a).z*(b).z) #define CCMUL(A,B,C) ((C).r=(A).r*(B).r, (C).g=(A).g*(B).g, (C).b=(A).b*(B).b) #define CCADD(A,B,C) ((C).r=(A).r+(B).r, (C).g=(A).g+(B).g, (C).b=(A).b+(B).b) #define CSCALE(s, A, B) ( (B).r = (A).r * s, (B).g = (A).g * s, (B).b = (A).b * s, (B).a = (A).b * s) #define CCSADD(A,B,s,C) \ ((C).r += (s)*(A).r*(B).r, \ (C).g += (s)*(A).g*(B).g, \ (C).b += (s)*(A).b*(B).b) /* Eye position as an HPoint3 */ #define EYE ((HPoint3 *) (_mgc->C2W[3])) /* Shading parameters, left here for easy dbx viewing. */ static float fog = 0.0; /* fog control */ static float hypk1 = .5; /* controls exponential falloff */ static float hypk2 = .0; /* controls exponential falloff */ static float sphk1 = .5; /* controls exponential falloff */ static float sphk2 = 0.0; /* safety zone around light */ /* * Note: code for the Euclidean shader now lives in src/lib/mg/common/mgshade.c. * This file contains only the non-Euclidean ones. */ #define HPt3R31GramSchmidt HPt3HypGramSchmidt #define HPt3R31Distance HPt3HypDistance #define HPt3R40GramSchmidt HPt3SphGramSchmidt #define HPt3R40Distance HPt3SphDistance /* * A routine to determine the bisector of two tangent vectors */ void HPt3R31Bisector(HPoint3 *Lt, HPoint3 *I, HPoint3 *H) { HPoint3 tmp1, tmp2; float a,b; HPt3Sub(I, Lt, &tmp1); a = HPt3R31Dot(I, &tmp1); b = HPt3R31Dot(Lt, &tmp1); if ( b == 0) b = 1; HPt3Scale(-(a/b), Lt, &tmp2); HPt3Add(I, &tmp2, H); if (H->w < 0) HPt3Scale(-1, H, H); return; } void HPt3R40Bisector(HPoint3 *Lt, HPoint3 *I, HPoint3 *H) { HPoint3 tmp1, tmp2; float a,b; HPt3Sub(I, Lt, &tmp1); a = HPt3R40Dot(I, &tmp1); b = HPt3R40Dot(Lt, &tmp1); if ( b == 0) b = 1; HPt3Scale(-(a/b), Lt, &tmp2); HPt3Add(I, &tmp2, H); return; } /* * Hyperbolic shader */ int hypshade(int nv, HPoint3 *v, Point3 *n, ColorA *c, ColorA *cs) { struct mgxstk *mx = _mgc->xstk; struct mgastk *ma = _mgc->astk; struct LtLight *l; int i, lno; HPoint3 V, n4, N, I; float s, ni; Color Ci; static LtLight *cachedlights[AP_MAXLIGHTS]; static int ncached = 0; static short cached_light_seq = -1; hypk1 = ma->lighting.attenmult; hypk2 = ma->lighting.attenmult2; fog = ma->lighting.attenconst>1 ? ma->lighting.attenconst-1 : 0; Ci.r = Ci.g = Ci.b = 0; CCSADD(ma->mat.ambient, ma->lighting.ambient, ma->mat.ka, Ci); /* for now, move lights to be inside hyperbolic space */ if(ma->light_seq != cached_light_seq) { LtLight **lp; float d; HPoint3 *L; for(i = 0; i < ncached; i++) LtDelete(cachedlights[i]); ncached = 0; LM_FOR_ALL_LIGHTS(&ma->lighting, i,lp) { if(ncached >= AP_MAXLIGHTS) break; cachedlights[ncached++] = l = LtCopy(*lp, NULL); /* use euclidean distance */ L = &l->globalposition; d = HPt3R30Dot(L, L); if (d >= 1) { /* move light to sphere of radius .8 */ d = .8/sqrt(d); L->x *= d; L->y *= d; L->z *= d; L->w = 1.0; } } cached_light_seq = ma->light_seq; } for(i = 0; i < nv; i++, v++, n++, c++, cs++) { /* Transform point by T */ HPt3Transform(mx->T, v, &V); /* V = v in world coords */ if (HPt3R31Dot(&V, &V) >= 0) /* point at infinity, or beyond */ continue; /* outside hyperbolic space */ HPt3R31Normalize(&V); /* lie on surface < , > = -1 */ HPt3Sub( (HPoint3 *) EYE, &V, &I ); /* I = EYE - V (point-to-eye vector) */ HPt3R31GramSchmidt(&V, &I); HPt3R31Normalize(&I); n4.x = n->x; n4.y = n->y; n4.z = n->z; n4.w = 1.0; HPt3R31GramSchmidt( v, &n4); HPt3R31Normalize(&n4); HPt3Transform(mx->T, &n4, &N);/* transform by inverse adjoint */ /* tangent space at V has a Euclidean (positive definite) structure */ ni = HPt3R31Dot(&N,&I); if (ni < 0) { float s = -1.0; HPt3Scale(s, &N, &N); } for(lno = ncached; --lno >= 0; ) { HPoint3 *L; HPoint3 Lt; float bright, ll, ln, light_intensity, d; l = cachedlights[lno]; L = &l->globalposition; /* Diffuse term */ /* first compute the color of arriving light */ bright = l->intensity; ll = HPt3R31Dot(L,L); if (ll >= 0) /* ignore lights outside of hspace */ continue; ln = HPt3R31Dot(L,&N); if(ln <= 0) /* Ignore lights shining from behind */ continue; /* compute the distance for computation of falloff of light */ d = HPt3R31Distance(L, &V); /* the following models the exponential falloff of intensity */ light_intensity = exp(-hypk1*d); /* now compute the cosine for diffuse shading */ Lt = l->globalposition; /* we'll change the values here */ HPt3Sub(&Lt, &V, &Lt); /* make it a difference vector */ HPt3R31GramSchmidt(&V, &Lt); HPt3R31Normalize(&Lt); d = HPt3R31Dot(&Lt, &N); /* cos of angle between L and N */ s = ma->mat.kd * bright * d * light_intensity; CCSADD(l->color, *c, s, Ci); if(ma->mat.ks > 0) { /* Specular term */ HPoint3 H; /* H: halfway between L and I */ HPt3R31Bisector(&Lt, &I, &H); HPt3R31Normalize(&H); s = HPt3R31Dot(&H, &N); /* cos of angle between H and N */ if (s < 0) continue; s = ma->mat.ks * bright * pow(s, ma->mat.shininess); CCSADD(l->color, ma->mat.specular, s, Ci); } } /* insert fog code */ if (fog) { float k1, k2; float d = HPt3HypDistance(&V, EYE); ColorA surfcolor, fogcolor; d = d - hypk2; /* fog-free sphere of radius euck2 */ if (d < 0) d = 0; k1 = exp( -fog * d); k2 = 1.0 - k1; CSCALE(k1, Ci, surfcolor); CSCALE(k2, _mgc->background, fogcolor); CCADD(surfcolor, fogcolor, Ci); } if(Ci.r < 0) Ci.r = 0; else if(Ci.r > 1) Ci.r = 1; if(Ci.g < 0) Ci.g = 0; else if(Ci.g > 1) Ci.g = 1; if(Ci.b < 0) Ci.b = 0; else if(Ci.b > 1) Ci.b = 1; *(Color *)cs = Ci; cs->a = c->a; } return 0; } int sphshade(int nv, HPoint3 *v, Point3 *n, ColorA *c, ColorA *cs) { struct mgxstk *mx = _mgc->xstk; struct mgastk *ma = _mgc->astk; struct LtLight *l; int i, lno; HPoint3 V, n4, N, I; float s, ni; Color Ci; static LtLight *cachedlights[AP_MAXLIGHTS]; static int ncached = 0; static short cached_light_seq = -1; sphk1 = ma->lighting.attenmult; sphk2 = ma->lighting.attenmult2; fog = ma->lighting.attenconst>1 ? ma->lighting.attenconst-1 : 0; /* "ambient" color */ Ci.r = Ci.g = Ci.b = 0; CCSADD(ma->mat.ambient, ma->lighting.ambient, ma->mat.ka, Ci); /* for now, move lights to be inside spherical space */ if(ma->light_seq != cached_light_seq) { float d; HPoint3 *L; LtLight **lp; for(i = 0; i < ncached; i++) LtDelete(cachedlights[i]); ncached = 0; LM_FOR_ALL_LIGHTS(&ma->lighting, i,lp) { if(ncached >= AP_MAXLIGHTS) break; cachedlights[ncached++] = l = LtCopy(*lp, NULL); /* use euclidean distance */ L = &l->globalposition; /* use euclidean distance */ d = HPt3R40Dot(L, L); if (d >= 1.0) { /* move light to be in S3 */ d = 1.0/sqrt(d); L->x *= d; L->y *= d; L->z *= d; L->w *= d; } } cached_light_seq = ma->light_seq; } for(i = 0; i < nv; i++, v++, n++, c++, cs++) { /* Transform point by T */ HPt3Transform(mx->T, v, &V); /* V = v in world coords */ HPt3R40Normalize(&V); /* lie on surface < , > = -1 */ /* I = EYE - V (point-to-eye vector) */ HPt3Sub( (HPoint3 *) EYE, &V, &I ); HPt3R40GramSchmidt(&V, &I); HPt3R40Normalize(&I); n4.x = n->x; n4.y = n->y; n4.z = n->z; n4.w = 1.0; HPt3R40GramSchmidt( v, &n4); HPt3R40Normalize(&n4); HPt3Transform(mx->T, &n4, &N);/* transform by inverse adjoint */ /* tangent space at V has a Euclidean (positive definite) structure */ ni = HPt3R40Dot(&N,&I); if (ni < 0) { float s = -1.0; HPt3Scale(s, &N, &N); } for(lno = ncached; --lno >= 0; ) { HPoint3 *L; HPoint3 Lt; float bright, ln, d, radius, light_intensity; l = cachedlights[lno]; L = &l->globalposition; /* Diffuse term */ /* first compute the color of arriving light */ bright = l->intensity; /*ll = HPt3R40Dot(L,L);*/ /* this should be 1.0 by above */ ln = HPt3R40Dot(L,&N); if(ln <= 0) /* Ignore lights shining from behind */ continue; /* compute the distance for computation of falloff of light */ d = HPt3R40Distance(L, &V); /* the amount of light from the source which arrives at the surface is inversely proportional to the area of the sphere centered at the light which contains the surface point. The radius of this sphere is the sin of the distance between L and V */ radius = sin((double) d); if (radius > sphk2) { float kk = (sphk2/radius); /* 0 <= sphk2 <= 1.0 */ light_intensity = pow(kk, -sphk1); } else light_intensity = 1.0; /* we model the atmosphere as a murky fluid that has exponential dissipation; sphk1 controls exponential drop off; value of 0 avoids any drop off */ d = HPt3R40Distance((HPoint3 *) EYE, &V); light_intensity *= exp(-sphk1 * d); /* now compute the cosine for diffuse shading */ Lt = l->globalposition; /* we'll change the values here */ HPt3Sub(&Lt, &V, &Lt); /* make it a difference vector */ HPt3R40GramSchmidt(&V, &Lt); HPt3R40Normalize(&Lt); d = HPt3R40Dot(&Lt, &N); /* cos of angle between L and N */ s = ma->mat.kd * bright * d * light_intensity; CCSADD(l->color, *c, s, Ci); if(ma->mat.ks > 0) { /* Specular term */ HPoint3 H; /* H: halfway between L and I */ HPt3R40Bisector(&Lt, &I, &H); HPt3R40Normalize(&H); s = HPt3R40Dot(&H, &N); /* cos of angle between H and N */ if (s < 0) continue; s = ma->mat.ks * bright * pow(s, ma->mat.shininess); CCSADD(l->color, ma->mat.specular, s, Ci); } } /* insert fog code */ if (fog) { float k1, k2; float d = HPt3SphDistance(&V, EYE); ColorA surfcolor, fogcolor; d = d - sphk2; /* fog-free sphere of radius euck2 */ if (d < 0) d = 0; k1 = exp( -fog * d); k2 = 1.0 - k1; CSCALE(k1, Ci, surfcolor); CSCALE(k2, _mgc->background, fogcolor); CCADD(surfcolor, fogcolor, Ci); } if(Ci.r < 0) Ci.r = 0; else if(Ci.r > 1) Ci.r = 1; if(Ci.g < 0) Ci.g = 0; else if(Ci.g > 1) Ci.g = 1; if(Ci.b < 0) Ci.b = 0; else if(Ci.b > 1) Ci.b = 1; *(Color *)cs = Ci; cs->a = c->a; } return 0; } mgshadefunc softshader(int camid) { switch(spaceof(camid)) { case TM_HYPERBOLIC: return hypshade; case TM_EUCLIDEAN: return mg_eucshade; case TM_SPHERICAL: return sphshade; default: return mg_eucshade; } } geomview-1.9.4/src/bin/geomview/common/worldio.c0000644000175000001440000006361210622400025016557 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include "mg.h" #include "mgbuf.h" #include "drawer.h" #include "ui.h" #include "geom.h" #include "geomclass.h" #include "instP.h" #include "listP.h" #include "streampool.h" #include "comm.h" #include "lang.h" #include "main.h" #include "transobj.h" #include "ntransobj.h" #include "worldio.h" #include #include #ifdef NeXT #include #else /* any other reasonable UNIX */ #include #endif void set_emodule_path(char **dirs); void set_load_path(char **dirs); static void save_dgeom(Pool *p, DGeom *dg, int doaliens); static void save_dgeom_geom(Pool *p, DGeom *dg, bool world, bool wrap, int cum); static void save_dview(Pool *p, DView *dv); static int nonidentity(Transform T); static void maybe_save_xform(Pool *p, char *cmd, char *name, Handle *, Transform T); static char * normalization_string(int n); static char * onoff_string(int n); int save_world(Pool *p, int id, bool comm, int wrap, int to_coords) { Appearance *ap; int i, closeme = 0; FILE *fp; Transform T; DGeom *dg = NULL; Handle *h = NULL; if ((fp = PoolOutputFile(p)) == NULL) { return 0; } #if 0 /* Hack -- don't let StreamOut routines write Handle names. */ /* "Temporary" workaround for library reading bug. -slevy */ PoolSetOType(p, PO_DATA); #endif if (id == NOID) { /* cH: hack, but otherwise we cannot save the universe, no aliens. */ id = UNIVERSE; } if (!comm) { /* Write geometry */ if (wrap) { if (id == UNIVERSE || ISCAM(id)) { PoolFPrint(p, fp, "{ # Base appearance\n"); PoolIncLevel(p, 1); ApStreamOut(p, NULL, drawerstate.ap); PoolFPrint(p, fp, "# end base appearance\n"); if (ISCAM(id)) { PoolIncLevel(p, -1); PoolFPrint(p, fp, "}\n"); return !ferror(fp); } else closeme = 1; } } if (id == UNIVERSE) { id = WORLDGEOM; } if (ISGEOM(id)) dg = (DGeom *)drawer_get_object(id); if (id == WORLDGEOM) { if (wrap) { save_dgeom_geom(p, dg, true, wrap, to_coords); } PoolFPrint(p, fp, "{ LIST # World list \n"); PoolIncLevel(p, 1); for(i = 1; i < dgeom_max; i++) { dg = (DGeom *)drawer_get_object(GEOMID(i)); if (dg != NULL && dg->citizenship != ALIEN) save_dgeom_geom(p, dg, false, true, WORLDGEOM); } PoolIncLevel(p, -1); PoolFPrint(p, fp, "} #end of World List\n"); if (wrap) { PoolIncLevel(p, -1); PoolFPrint(p, fp, "} # end of World and INST\n"); if (closeme) { PoolIncLevel(p, -1); PoolFPrint(p, fp, "}\n"); } } } else { save_dgeom_geom(p, dg, false, wrap, to_coords); } return !ferror(fp); } /* Write command language */ PoolFPrint(p, fp, "(progn\n"); PoolIncLevel(p, 1); /* Ensure embedded objects have { braces } */ if (id == UNIVERSE || id == WORLDGEOM) { PoolFPrint(p, fp, "(merge-baseap "); ApStreamOut(p, NULL, drawerstate.ap); PoolFPrint(p, fp, ") # end base appearance\n"); if (drawerstate.NDim > 0) PoolFPrint(p, fp, "(dimension %d)\n", drawerstate.NDim-1); } if (id != UNIVERSE && id != WORLDGEOM) { DObject *dobj = drawer_get_object(id); if (dobj) { if (ISGEOM(dobj->id)) save_dgeom(p, (DGeom *)dobj, 1); else save_dview(p, (DView *)dobj); } } else { /* save data associated with the World dgeom */ GeomGet( dgeom[0]->Item, CR_AXIS, T ); GeomGet( dgeom[0]->Item, CR_AXISHANDLE, &h ); maybe_save_xform(p, "xform-set", "worldgeom", h, T); maybe_save_xform(p, "xform-incr", "worldgeom", dgeom[0]->incrhandle, dgeom[0]->Incr); GeomGet( dgeom[0]->Item, CR_APPEAR, &ap ); if (ap != NULL) { PoolFPrint(p, fp, "(merge-ap \"worldgeom\" "); ApStreamOut( p, NULL, ap ); PoolFPrint(p, fp, ") # end appearance \"worldgeom\"\n"); } /* save the dgeoms. Include aliens if id == UNIVERSE. */ for (i=1; iname[1]); } } PoolIncLevel(p, -1); PoolFPrint(p, fp, ")\n"); /* terminates the (progn... */ return !ferror(fp); } /* * Save a DGeom as geometry. Emit appearance and transform if wrap. * if not 'world', also add geometry and close the braces. */ static void save_dgeom_geom(Pool *p, DGeom *dg, bool world, bool wrap, int to_coords) { FILE *fp = PoolOutputFile(p); Transform T; Handle *h = NULL; Geom *g = NULL; Appearance *ap = NULL; if (dg == NULL || dg->Item == NULL) return; if (wrap) { PoolFPrint(p, fp, "{ # %s\n", dg->name[1]); PoolIncLevel(p, 1); PoolFPrint(p, fp, "INST\n"); drawer_get_transform(dg->id, T, to_coords); if (nonidentity(T) || h) { /* Could say "transform" here */ PoolFPrint(p, fp, ""); TransStreamOut(p, h, T); /* but TransStreamOut does that */ } PoolFPrint(p, fp, "geom "); GeomGet(dg->Item, CR_APPEAR, &ap); if (ap) { ap = ApCopy(ap, NULL); ap->override = 0; if (ap->mat) ap->mat->override = 0; if (ap->lighting) ap->lighting->override = 0; PoolFPrint(p, fp, ""); ApStreamOut(p, NULL, ap); ApDelete(ap); } } if (!world) { h = NULL; GeomGet(dg->Lgeom, CR_GEOM, &g); GeomGet(dg->Lgeom, CR_GEOMHANDLE, &h); GeomStreamOut(p, h, g); if (wrap) { PoolIncLevel(p, -1); PoolFPrint(p, fp, "} # end (geom and INST) %s\n", dg->name[1]); } } } static void maybe_save_xform(Pool *p, char *cmd, char *name, Handle *h, Transform T) { if (h || nonidentity(T)) { fprintf(PoolOutputFile(p), "(%s \"%s\" ", cmd, name); TransStreamOut(p, h, T); fprintf(PoolOutputFile(p), ")\n"); } } static void save_dgeom(Pool *p, DGeom *dg, int doaliens) { Geom *g=NULL; Appearance *ap=NULL; FILE *fp = PoolOutputFile(p); Handle *h = NULL; Transform T; char name[32]; char *truename = dg->name[1]; sprintf(name, "[%s]", dg->name[0]); /* Temporary name -- unlikely to conflict */ if (dg->citizenship == ALIEN) { if (!doaliens) return; PoolFPrint(p, fp, "(new-alien"); } else { PoolFPrint(p, fp, "(new-geometry"); } fprintf(fp, " \"%s\" # %s\n", name, truename); PoolIncLevel(p, 1); PoolFPrint(p, fp, ""); GeomGet( dg->Lgeom, CR_GEOM, &g ); GeomGet( dg->Lgeom, CR_GEOMHANDLE, &h ); GeomStreamOut( p, h, g ); PoolIncLevel(p, -1); PoolFPrint(p, fp, ") # end geometry \"%s\" %s\n", name, truename); GeomGet( dg->Item, CR_APPEAR, &ap ); if (ap != NULL) { PoolFPrint(p, fp, "(merge-ap \"%s\" ", name); ApStreamOut( p, NULL, ap ); PoolFPrint(p, fp, ") # end appearance \"%s\" %s\n", name, truename); } TmIdentity(T); GeomGet( dg->Item, CR_AXIS, T ); GeomGet( dg->Item, CR_AXISHANDLE, &h ); maybe_save_xform(p, "xform-set", name, h, T); if (dg->NDT) { PoolFPrint(p, fp, "(ND-xform-set \"%s\" ", name); NTransStreamOut(p, NULL, dg->NDT); PoolFPrint(p, fp, ")\n"); } PoolFPrint(p, fp, "(bbox-draw \"%s\" %s)\n", name, onoff_string(dg->bboxdraw)); if (dg->bboxap && dg->bboxap->mat) { Color *c = &(dg->bboxap->mat->edgecolor); PoolFPrint(p, fp, "(bbox-color \"%s\" %f %f %f)\n", name, c->r, c->g, c->b); } PoolFPrint(p, fp, "(normalization \"%s\" %s)\n", name, normalization_string(dg->normalization)); PoolFPrint(p, fp, "(name-object \"%s\" \"%s\")\n\n", name, truename); } static void save_dview(Pool *p, DView *dv) { char *name = dv->name[1]; FILE *fp = PoolOutputFile(p); WnPosition wp; if (WnGet(dv->win, WN_CURPOS, &wp) > 0) { WnSet(dv->win, WN_PREFPOS, &wp, WN_END); PoolFPrint(p, fp, "(window default { position %d %d %d %d })\n", wp.xmin,wp.xmax,wp.ymin,wp.ymax); } PoolFPrint(p, fp, "(camera \"%s\" ", name); CamStreamOut(p, dv->camhandle, dv->cam); PoolFPrint(p, fp, ") # camera \"%s\" ...\n", name); PoolFPrint(p, fp, "(backcolor \"%s\" %f %f %f)\n", name, dv->backcolor.r,dv->backcolor.g,dv->backcolor.b); if (dv->cameradraw) { PoolFPrint(p, fp, "(camera-draw \"%s\" yes)\n", name); } if (dv->cluster != NULL) { cmap *cm; cent *ce; int i, j; PoolFPrint(p, fp, "(dimension %d)\n", drawerstate.NDim-1); PoolFPrint(p, fp, "(ND-axes \"%s\" \"%s\" %d %d %d %d)\n", name, dv->cluster->name, dv->NDPerm[0], dv->NDPerm[1], dv->NDPerm[2], dv->NDPerm[3]); if (dv->cluster->C2W != NULL) { PoolFPrint(p, fp, "(ND-xform-set \"%s\" ", name); TmNPrint(fp, dv->cluster->C2W); PoolFPrint(p, fp, ")\n"); } PoolFPrint(p, fp, "(ND-color \"%s\" (\n", name); for(i = 0, cm = dv->NDcmap; i < dv->nNDcmap; i++, cm++) { PoolFPrint(p, fp, "\t( ("); fputnf(fp, cm->axis->dim, cm->axis->v, 0); PoolFPrint(p, fp, ")\n"); for(j = VVCOUNT(cm->cents), ce = VVEC(cm->cents,cent); --j >= 0; ce++) { PoolFPrint(p, fp, "\t\t%g\t", ce->v); fputnf(fp, 4, (float *)&ce->c, 0); fputc('\n', fp); } PoolFPrint(p, fp, "\t)\n"); } PoolFPrint(p, fp, " ) ) # end ND-color \"%s\"\n", name); } PoolFPrint(p, fp, "(window \"%s\" ", name); WnStreamOut(p, NULL, dv->win); PoolFPrint(p, fp, ")\n"); PoolFPrint(p, fp, "# end camera %s\n\n", name); } static int nonidentity(Transform T) { return memcmp(T, TM_IDENTITY, sizeof(TM_IDENTITY)); } static char * normalization_string(int n) { switch (n) { case NONE: return "none"; case ALL: return "all"; case EACH: return "each"; default: return "???"; } } static char * onoff_string(int n) { if (n) return "on"; else return "off"; } int worldio(HandleOps *ops, Pool *p, int to_coords, int id) { int ok = -1; Transform T; TransformN *TN; bool wrap = true; /* no data attached to a handle has been saved yet */ HandlesSetObjSaved(false); if (to_coords == SELF) { wrap = false; } if (ops == &CommandOps) ok = save_world(p, id, true, wrap, to_coords); else if (ops == &GeomOps) ok = save_world(p, id, false, wrap, to_coords); else if (ops == &CamOps && ISCAM(id)) { DView *dv = (DView *)drawer_get_object(id); if (dv) ok = CamStreamOut(p, dv->camhandle, dv->cam); } else if (ops == &WindowOps) { DView *dv = (DView *)drawer_get_object(ISCAM(id) ? id : FOCUSID); WnWindow *win; if (dv && dv->mgctx) { mgctxselect(dv->mgctx); if ((ok = mgctxget(MG_WINDOW, &win)) > 0) ok = WnStreamOut(p, NULL, win); } } else if (ops == &TransOps) { drawer_get_transform(id, T, to_coords); ok = TransStreamOut(p, NULL, T); } else if (ops == &NTransOps) { TN = drawer_get_ND_transform(id, to_coords); ok = NTransStreamOut(p, NULL, TN); TmNDelete(TN); } fflush(PoolOutputFile(p)); return ok; } static int unique(char *new, char **already, int nalready) { int i; if (new == NULL) return 0; for(i = 0; i < nalready; i++) if (strcmp(new, already[i]) == 0) return 0; return 1; } static void setapath(LList *list, vvec *vvpath, void (*setfunc)(char **)) { #define MAXDIRS 100 int i, k; char *td, *dirs[MAXDIRS+1]; for(i = 0; i < MAXDIRS && list; list = list->cdr) { if (list->car == NULL) continue; td = LSTRINGVAL(list->car); if (strcmp(td, "+") == 0) { for(k = 0; k < VVCOUNT(*vvpath) && i < MAXDIRS; k++) { td = VVEC(*vvpath, char *)[k]; if (unique(td, dirs, i)) dirs[i++] = strdup(td); } } else { if (unique(td, dirs, i)) dirs[i++] = td; } } dirs[i] = NULL; (*setfunc)(dirs); #undef MAXDIRS } static void set_vvpath(vvec *vv, char **ents) { int i; for(i = VVCOUNT(*vv); --i >= 0; ) free(VVEC(*vv, char *)[i]); VVCOUNT(*vv) = 0; while(ents && *ents) *VVAPPEND(*vv, char *) = strdup(*ents++); vvtrim(vv); } LDEFINE(set_load_path, LVOID, "(set-load-path (PATH1 ... PATHN))\n\ Sets search path for command, geometry, etc. files. The PATHi\n\ are strings giving the pathnames of directories to be searched.\n\ The special directory name \"+\" is replaced by the existing path,\n\ so e.g. (set-load-path (mydir +)) prepends mydir to the path.") { LList *list; LDECLARE(("set-load-path", LBEGIN, LLITERAL, LLIST, &list, LEND)); setapath(list, &vv_load_path, set_load_path); return Lt; } void set_load_path(char **dirs) { int filepanel; set_vvpath(&vv_load_path, dirs); filedirs(dirs); /* Inform OOGL/refcomm library */ filepanel = ui_name2panel("Files"); /* Inform UI */ if (ui_panelshown(filepanel)) ui_showpanel(filepanel, 1); } LDEFINE(load_path, LLIST, "(load-path)\n\ Returns the current search path for command, geometry, etc. files.\n\ Note: to actually see the value returned by this function\n\ you should wrap it in a call to echo: (echo (load-path)).\n\ See also set-load-path.") { /* For backward compatibility this command takes an optional argument which specifies a new load-path. This will disappear in a future version. */ LList *list = NULL; int i; LDECLARE(("load-path", LBEGIN, LOPTIONAL, LLITERAL, LLIST, &list, LEND)); if (list != NULL) { gv_set_load_path(list); return Lt; } for (i=0; i file\n\ which contains an (emodule-define ...) command for that\n\ module. This command implicitly calls (rehash-emodule-path)\n\ to rebuild the application brower from the new path setting.\n\ The special directory name \"+\" is replaced by the existing path,\n\ so e.g. (set-emodule-path (mydir +)) prepends mydir to the path.") { #define MAXDIRS 100 LList *list; LDECLARE(("set-emodule-path", LBEGIN, LLITERAL, LLIST, &list, LEND)); setapath(list, &vv_emodule_path, set_emodule_path); return Lt; } void set_emodule_path(char **dirs) { set_vvpath(&vv_emodule_path, dirs); gv_rehash_emodule_path(); } LDEFINE(rehash_emodule_path, LLIST, "(rehash-emodule-path)\n\ Rebuilds the application (external module) browser by reading\n\ all .geomview-* files in all directories on the emodule-path.\n\ Primarily intended for internal use; any applications defined\n\ by (emodule-define ...) commands outside of the .geomview-*\n\ files on the emodule-path will be lost. Does not sort the\n\ entries in the brower; see (emodule-sort) for that.") { int i; char pat[512], **files, **fp; LDECLARE(("rehash-emodule-path", LBEGIN, LEND)); gv_emodule_clear(); for (i=0; itext); } LDEFINE(all, LLIST, "(all geometry) returns a list of names of all geometry objects.\n\ (all camera) returns a list of names of all cameras.\n\ (all emodule defined) returns a list of all defined external modules.\n\ (all emodule running) returns a list of all running external modules.\n\ Use e.g. ``(echo (all geometry))'' to print such a list.") { char *type, *subtype = ""; int i, wantrunning; DGeom *dg; DView *dv; emodule *em; LList *l = NULL; LDECLARE(("all", LBEGIN, LSTRING, &type, LOPTIONAL, LSTRING, &subtype, LEND)); if (strncmp(type, "geom", 4) == 0) { LOOPGEOMS(i, dg) l = LListAppend(l, LTOOBJ(LSTRING)(&dg->name[1])); } else if (strncmp(type, "cam", 3) == 0) { LOOPVIEWS(i, dv) l = LListAppend(l, LTOOBJ(LSTRING)(&dv->name[1])); } else if (strncmp(type, "emodule", 7) == 0) { wantrunning = (strncmp(subtype, "run", 3) == 0); em = VVEC(uistate.emod, emodule); for(i = VVCOUNT(uistate.emod); --i >= 0; em++) if ((em->pid != 0) == wantrunning) l = LListAppend(l, LTOOBJ(LSTRING)(&em->name)); } else { OOGLError(0, "all: expected \"geometry\" or \"camera\" or \"emodule defined\" or \"emodule running\", got: %s %s\n", type, subtype); return Lnil; } return LNew(LLIST, &l); } LDEFINE(camera_prop, LVOID, "(camera-prop { geometry object } [projective])\n\ Specify the object to be shown when drawing other cameras.\n\ By default, this object is drawn with its origin at the camera,\n\ and with the camera looking toward the object's -Z axis.\n\ With the \"projective\" keyword, the camera's viewing projection is\n\ also applied to the object; this places the object's Z=-1 and Z=+1 at\n\ near and far clipping planes, with the viewing area -1<={X,Y}<=+1.\n\ Example: (camera-prop { < cube } projective)") { Keyword proj = NO_KEYWORD; GeomStruct *gs = NULL; LDECLARE(("camera-prop", LBEGIN, LGEOM, &gs, LOPTIONAL, LKEYWORD, &proj, LEND)); if (proj != NO_KEYWORD && proj != PROJECTIVE_KEYWORD) { OOGLError(1, "Expected either \"%s\" or nothing, but got \"%s\".\n", keywordname(PROJECTIVE_KEYWORD), keywordname(proj)); return Lnil; } if (gs && gs->geom) { REFINCR(gs->geom); REFINCR(gs->h); GeomDelete(drawerstate.camgeom); drawerstate.camgeom = gs->geom; drawerstate.camproj = (proj == PROJECTIVE_KEYWORD); drawerstate.changed = true; return Lt; } return Lnil; } LDEFINE(write, LVOID, "(write {command|geometry|camera|transform|ntransform|window} FILENAME [ID|(ID ...)] [self|world|universe|otherID])\n\ write description of ID in given format to FILENAME. Last\n\ parameter chooses coordinate system for geometry & transform:\n\ self: just the object, no transformation or appearance (geometry only)\n\ world: the object as positioned within the World.\n\ universe: object's position in universal coordinates;\n\ includes Worldtransform\n\ other ID: the object transformed to otherID's coordinate system.\n\ \n\ A filename of \"-\" is a special case: data are written to the\n\ stream from which the 'write' command was read. For external\n\ modules, the data are sent to the module's standard input.\n\ For commands not read from an external program, \"-\" means\n\ geomview's standard output. (See also the \"command\"\n\ command.)\n\ \n\ The ID can either be a single id or a parenthesized list of\n\ ids, like \"g0\" or \"(g2 g1 dodec.off)\".") { Pool *op, *p; HandleOps *ops; char *opsname; LObject *idobj; char *fname; Lake *hiawatha; int coords = UNIVERSE, val = 1, id; bool temppool = false; LDECLARE(("write", LBEGIN, LLAKE, &hiawatha, LSTRING, &opsname, LSTRING, &fname, LHOLD, LLOBJECT, &idobj, LOPTIONAL, LID, &coords, LEND)); p = POOL(hiawatha); if ( (ops=str2ops(opsname)) == NULL) { OOGLError(0, "write: expected one of command|geometry|camera|transform|ntransform|window|image, got \"%s\"", opsname); return Lnil; } if (fname[0] == '-') { if (PoolOutputFile(p)) { op = p; } else { op = PoolStreamTemp(fname, NULL, stdout, 1, &CommandOps); temppool = true; } } else { op = PoolStreamTemp(fname, NULL, NULL, 1, &CommandOps); temppool = true; } if (op == NULL || PoolOutputFile(op) == NULL) { fprintf(stderr, "write: cannot open \"%s\": %s\n", fname, sperror()); return Lnil; } if (idobj->type == LSTRING) { if (!LFROMOBJ(LID)(idobj, &id)) { fprintf(stderr, "write: expects ID or list of IDs in arg position 2\n"); return Lnil; } val = (worldio(ops, op, coords, id) == 1); } else if (idobj->type == LLIST) { LList *list; for( list = LLISTVAL(idobj); list && list->car; list = list->cdr ) { if (!LFROMOBJ(LID)(list->car, &id)) { fprintf(stderr, "write: expects ID or list of IDs in arg position 2\n"); return Lnil; } val &= (worldio(ops, op, coords, id) == 1); } } if (temppool) { PoolClose(op); PoolDelete(op); } if (!val) { fprintf(stderr, "write failed\n"); return Lnil; } else return Lt; } /***************************************************/ /* Snapshot code ***********************************/ /***************************************************/ extern snap_entry snapshot_table[]; int general_snapshot(char *fname, int id, DView *view, WnWindow *win, WnPosition *wp, int (*function)(void)) { Camera *cam = NULL; const Appearance *ap; mgcontext *ctx; FILE *f = NULL; WnPosition vp; int mgspace; int failed; f = (fname[0] == '|') ? popen(fname+1, "wb") : fopen(fname, "wb"); if (f == NULL) return -1; mgctxget(MG_CAMERA, &cam); mgctxget(MG_SPACE, &mgspace); #if 0 /* Copy so that changed flags are set */ ap = ApCopy(mggetappearance(NULL), NULL); #else ap = mggetappearance(); #endif mgctxget(MG_WINDOW, &win); win = WnCopy(win); vp.xmin = vp.ymin = 0; vp.xmax = wp->xmax - wp->xmin + 1; vp.ymax = wp->ymax - wp->ymin + 1; WnSet(win, WN_CURPOS, wp, WN_VIEWPORT, &vp, WN_END); function(); ctx = mgctxcreate(MG_CAMERA, cam, MG_APPEAR, ap, MG_WINDOW, win, MG_BACKGROUND, &view->backcolor, MG_BUFFILE, f, MG_SPACE, mgspace, MG_END); mgreshapeviewport(); /* Make camera aspect match window */ { /* Try to be as realistic as possible when dumping a snapshot. * Create a drawing context, install (hopefully) all the * attributes that draw_view() doesn't reset on its own, * plug the ctx into the camera, and force a redraw. * Then undo the subterfuge. */ bool oldredraw = view->redraw; bool oldchanged = view->changed; mgcontext *oldctx = view->mgctx; view->mgctx = ctx; view->redraw = true; gv_draw(view->id); view->redraw = oldredraw, view->changed = oldchanged; view->mgctx = oldctx; } fflush(f); mgctxdelete(ctx); #if 0 ApDelete(ap); #endif mgctxselect(view->mgctx); /* Revert to previous device */ failed = (fname[0] != '|') ? fclose(f) : pclose(f); return failed; } LDEFINE(snapshot, LINT, "(snapshot CAM-ID FILENAME [FORMAT [XSIZE [YSIZE]]])\n" "Save a snapshot of CAM-ID in the FILENAME (a string).") { DView *dv; WnWindow *wn = NULL; WnPosition wp; int id, xsize = 0, ysize = 0; char *fname, *format; int i, failed = -1; if (snapshot_table[0].name) format = snapshot_table[0].name; else format = "ppm"; LDECLARE(("snapshot", LBEGIN, LID, &id, LSTRING, &fname, LOPTIONAL, LSTRING, &format, LINT, &xsize, LINT, &ysize, LEND)); if (!ISCAM(id) || (dv = (DView *)drawer_get_object(id)) == NULL || dv->mgctx == NULL) { OOGLError(0, "snapshot: id %d: no such camera", id); return LCopy(L1); } mgctxselect(dv->mgctx); mgctxget(MG_WINDOW, &wn); wp.xmin = wp.ymin = 0; wp.xmax = wp.ymax = 399; /* Avoid catastrophe */ WnGet(wn, WN_CURPOS, &wp); if (xsize > 0 || ysize > 0) { int dx = wp.xmax - wp.xmin + 1; int dy = wp.ymax - wp.ymin + 1; if (xsize <= 0) xsize = (dx * ysize + dy/2) / dy; else if (ysize <= 0) ysize = (dy * xsize + dx/2) / dx; wp.xmax = wp.xmin + xsize - 1; wp.ymax = wp.ymin + ysize - 1; } for (i=0; snapshot_table[i].function!=NULL; i++) if (!strcmp(format, snapshot_table[i].name)) { failed = snapshot_table[i].function(fname, id, dv, wn, &wp); break; } if (!strcmp(format, "ppm")) { failed = general_snapshot(fname, id, dv, wn, &wp, mgdevice_BUF); } else if (!strcmp(format, "ps")) { failed = general_snapshot(fname, id, dv, wn, &wp, mgdevice_PS); } if (failed == -1) OOGLError(0, "snapshot: unknown file format %s", format); return failed ? Lnil : Lt; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/worldio.h0000644000175000001440000000247510455700777016611 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ int worldio(HandleOps *ops, Pool *p, int wrap, int id); /* Used to declare table of snapshot functions/names "snapshot_table" */ #ifndef SNAP_ENTRY #define SNAP_ENTRY /* snapshot functions return 0 on success, nonzero on failure. */ typedef struct _snap_entry { int (*function)(char *, int, DView *, WnWindow *, WnPosition *); char *name; } snap_entry; #endif geomview-1.9.4/src/bin/geomview/common/drawer.c0000644000175000001440000027332710665240356016412 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mg.h" #include "fsa.h" #include "drawer.h" #include "event.h" #include "ui.h" #include "comm.h" #include "transform.h" #include "transformn.h" #include "lang.h" #include "ooglutil.h" #include "geom.h" #include "camera.h" #include "space.h" #include "list.h" /* for ListRemove(), ListAppend() */ #include "comment.h" #include "transobj.h" #include "ntransobj.h" #include "lang.h" #include "lispext.h" #include "lights.h" #include "cmodel.h" #include "mouse.h" #include #ifndef alloca /* if no alloca in stdlib.h */ #include #endif #include #include #include /* Use sys/file.h since unistd.h doesn't exist on the NeXT, and hopefully sys/file.h is sufficient on both NeXT and IRIS [ needed for use of access() ]. */ /*#include */ #include static Fsa name_fsa = NULL; DrawerState drawerstate; static int drawer_dgeom(int id, GeomStruct *gs); static int spaceval(char *s, int val); static HModelValue hmodelval(char *s, int val); static int normalval(char *s, int val); extern Appearance *GeomAppearance( Geom * ); extern mgshadefunc softshader(int id); TransformStruct ts_identity; #define DGEOM_MAX 16 #define DVIEW_MAX 8 int dgeom_max = DGEOM_MAX; int dview_max = DVIEW_MAX; DGeom **dgeom = NULL; DView **dview = NULL; static int nwins = 1; static Appearance *base_defaultap = NULL; static Appearance *worldap = NULL; extern Color initial_defaultbackcolor; static GeomStruct nullgs = {NULL, NULL}; /* Substitute for optional arg */ extern HandleOps GeomOps, WindowOps; #define DGobj(obj) ((DGeom *)obj) #define DVobj(obj) ((DView *)obj) #define name_object(obj, ni, name) _name_object((DObject*)(obj),ni,name) static char * _name_object(DObject *obj, int ni, char *name); static void track_changes(); static void winmoved(int camid); static bool nonidentity(Transform T); static DGeom * new_dgeom(char *from, enum citizenship citizenship); static DView * new_dview(); static void updateit(float dt); static void draw_view(DView *dv); static void really_draw_view(DView *dv); static void reconfigure_view(DView *dv); static char * new_object_name(int type); static void object_changed(Handle **hp, DObject *obj, void *seqno); static int object_register(Handle **hp, Ref *ignored, DObject *obj); static void update_dgeom(DGeom *); static void update_view(DView *); static void normalize(DGeom *dg, int normalization); static char * unique_name(char *name, int id); static void delete_geometry(DGeom *dg); static void delete_camera(DView *dv); static void dview_set_hmodel_camspace(DView *dv, int space); #ifdef MANIFOLD static int verbose_manifold = 0; static int trivial_visibility = 0; #endif /* * Pure inquiry functions -- these do not change any state. */ int drawer_geom_count(void) { int i, n; DGeom *dg; n = 1; LOOPSOMEGEOMS(i,dg,ORDINARY) ++n; return n; } int drawer_cam_count(void) { int i, n; DView *dv; n = 0; LOOPVIEWS(i,dv) ++n; return n; } int drawer_idbyctx( mgcontext *ctx ) { int i; DView *dv; LOOPVIEWS(i,dv) { if(dv->mgctx == ctx) return CAMID(i); } return NOID; } DObject * drawer_get_object( int id ) { recheck: if(ISGEOM(id)) { switch(id) { case ALLGEOMS: id = WORLDGEOM; goto recheck; case TARGETID: id = uistate.targetid; goto recheck; case SELF: case TARGETGEOMID: id = GEOMID(uistate.targetgeom); goto recheck; case CENTERID: id = uistate.centerid; goto recheck; default: if(INDEXOF(id) < 0 || INDEXOF(id) >= dgeom_max) return NULL; return (DObject *)dgeom[INDEXOF(id)]; } } else if(ISCAM(id)) { switch(id) { case DEFAULTCAMID: return (DObject *)&drawerstate.defview; case FOCUSID: case ALLCAMS: id = CAMID(uistate.mousefocus); goto recheck; case TARGETCAMID: id = CAMID(uistate.targetcam); goto recheck; default: if(INDEXOF(id) < 0 || INDEXOF(id) >= dview_max) return NULL; return (DObject *)dview[INDEXOF(id)]; } } return NULL; } int drawer_idmatch(int id1, int id2) { switch (id1) { case ALLGEOMS: switch (id2) { case ALLGEOMS: return 1; case ALLCAMS: return 0; case FOCUSID: return 0; case TARGETGEOMID: return 1; case TARGETCAMID: return 0; case TARGETID: return ISGEOM(uistate.targetid); case CENTERID: return ISGEOM(uistate.centerid); case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return ISGEOM(id2) && drawer_get_object(id2); } break; case ALLCAMS: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 1; case FOCUSID: return 1; case TARGETGEOMID: return 0; case TARGETCAMID: return 1; case TARGETID: return ISCAM(uistate.targetid); case CENTERID: return ISCAM(uistate.targetid); case NOID: return 0; case DEFAULTCAMID: return 1; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return ISCAM(id2) && drawer_get_object(id2); } break; case FOCUSID: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 1; case FOCUSID: return 1; case TARGETGEOMID: return 0; case TARGETCAMID: return uistate.mousefocus==CAMID(uistate.targetcam); case TARGETID: return uistate.mousefocus==uistate.targetid; case CENTERID: return uistate.mousefocus==uistate.centerid; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return uistate.mousefocus==id2; } break; case TARGETGEOMID: switch (id2) { case ALLGEOMS: return 1; case ALLCAMS: return 0; case FOCUSID: return 0; case TARGETGEOMID: return 1; case TARGETCAMID: return 0; case TARGETID: return ISGEOM(uistate.targetid); case CENTERID: return uistate.centerid==uistate.targetid; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return GEOMID(uistate.targetgeom)==id2; } break; case TARGETCAMID: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 1; case FOCUSID: return uistate.mousefocus==uistate.targetid; case TARGETGEOMID: return 0; case TARGETCAMID: return 1; case TARGETID: return ISCAM(uistate.targetid); case CENTERID: return ISCAM(uistate.centerid); case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return CAMID(uistate.targetcam)==id2; } break; case TARGETID: switch (id2) { case ALLGEOMS: return ISGEOM(uistate.targetid); case ALLCAMS: return ISCAM(uistate.targetid); case FOCUSID: return ISCAM(uistate.targetid); case TARGETGEOMID: return ISGEOM(uistate.targetid); case TARGETCAMID: return ISCAM(uistate.targetid); case TARGETID: return 1; case CENTERID: return uistate.targetid==uistate.centerid; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return uistate.targetid==id2; } break; case CENTERID: switch (id2) { case ALLGEOMS: return ISGEOM(uistate.centerid); case ALLCAMS: return ISCAM(uistate.centerid); case FOCUSID: return uistate.centerid==uistate.mousefocus; case TARGETGEOMID: return uistate.centerid==GEOMID(uistate.targetgeom); case TARGETCAMID: return uistate.centerid==CAMID(uistate.targetcam); case TARGETID: return uistate.centerid==uistate.targetid; case CENTERID: return 1; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return uistate.centerid==id2; } break; case NOID: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 0; case FOCUSID: return 0; case TARGETGEOMID: return 0; case TARGETCAMID: return 0; case TARGETID: return 0; case CENTERID: return 0; case NOID: return 1; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return 0; } break; case DEFAULTCAMID: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 1; case FOCUSID: return 0; case TARGETGEOMID: return 0; case TARGETCAMID: return 0; case TARGETID: return 0; case CENTERID: return 0; case NOID: return 0; case DEFAULTCAMID: return 1; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return 0; } break; case SELF: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 0; case FOCUSID: return 0; case TARGETGEOMID: return 0; case TARGETCAMID: return 0; case TARGETID: return 0; case CENTERID: return 0; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 1; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return 0; } break; case UNIVERSE: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 0; case FOCUSID: return 0; case TARGETGEOMID: return 0; case TARGETCAMID: return 0; case TARGETID: return 0; case CENTERID: return 0; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 1; case PRIMITIVE: return 0; default: return 0; } break; case PRIMITIVE: switch (id2) { case ALLGEOMS: return 0; case ALLCAMS: return 0; case FOCUSID: return 0; case TARGETGEOMID: return 0; case TARGETCAMID: return 0; case TARGETID: return 0; case CENTERID: return 0; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 1; default: return 0; } break; default: switch (id2) { case ALLGEOMS: return ISGEOM(id1) && drawer_get_object(id1); case ALLCAMS: return ISCAM(id1) && drawer_get_object(id1); case FOCUSID: return id1==uistate.mousefocus; case TARGETGEOMID: return id1==GEOMID(uistate.targetgeom); case TARGETCAMID: return id1==CAMID(uistate.targetcam); case TARGETID: return id1==uistate.targetid; case CENTERID: return id1==uistate.centerid; case NOID: return 0; case DEFAULTCAMID: return 0; case SELF: return 0; case UNIVERSE: return 0; case PRIMITIVE: return 0; default: return id1==id2; } break; } } /* * Map an id to a short name */ char * drawer_id2name( int id ) { switch(id) { case ALLGEOMS: return "g*"; case ALLCAMS: return "c*"; case FOCUSID: return "focus"; case TARGETGEOMID:return "g."; case TARGETCAMID: return "c."; case SELF: return "self"; case UNIVERSE: return "universe"; case DEFAULTCAMID:return "defaultcam"; case TARGETID: return "target"; case CENTERID: return "center"; case PRIMITIVE: return "primitive"; case NOID: return "none"; default: if(id > 0) { DObject *obj = drawer_get_object(id); if(obj) return obj->name[1]; } } OOGLError(1, "drawer_id2name unknown id %d", id); return "?"; } /* * Utility routine for MAYBE_LOOP_ALL macro. * Finds object(s) of the given type (any type if T_NONE), * and returns a DObject * each time called. * Returns NULL after all appropriate objects have been returned. * Assumes that the iterator variable *indexp is incr'd by one between calls. * *indexp does double duty: for id's which refer to a single object, it's * used as a flag so that the object is returned exactly once (*indexp==0). * For broadcast id's (ALLGEOMS, ALLCAMS), *indexp is the current table index. * Note that MAYBE_LOOP_ALL does *not* treat WORLDGEOM specially. */ DObject * drawer_next_object( int id, int *indexp, int type ) { int index = *indexp; int limit; DObject **objs; if(id == DEFAULTCAMID && type != T_GEOM) return index > 0 ? NULL : (DObject *)&drawerstate.defview; /* Calling real_id() twice handles TARGETCAMID which might * yield FOCUSID */ if(INDEXOF(id) < 0 && INDEXOF(id) != ALLINDEX) id = real_id(real_id(id)); if(type != T_NONE && type != TYPEOF(id)) return NULL; switch(TYPEOF(id)) { case T_CAM: limit = dview_max; objs = (DObject **)dview; break; case T_GEOM: limit = dgeom_max; objs = (DObject **)dgeom; break; default: return NULL; } if(INDEXOF(id) == ALLINDEX) { while(index < limit && objs[index] == NULL) index++; *indexp = index; } else if(index == 0) index = INDEXOF(id); else return NULL; return (index < 0 || index >= limit) ? NULL : objs[index]; } /* * Utility routine for MAYBE_LOOP macro. * Like drawer_next_object() above, but arranges that id==WORLDGEOM * is mapped to a broadcast to all ordinary (non-World, non-alien) DGeom's. */ DObject * drawer_next_bcast( int id, int *indexp, int type ) { DObject *obj; if(INDEXOF(id) < 0 && INDEXOF(id) != ALLINDEX) id = real_id(real_id(id)); if(id == WORLDGEOM) while((obj = drawer_next_object(ALLGEOMS, indexp, type)) != NULL && DGobj(obj)->citizenship == ALIEN) (*indexp)++; else obj = drawer_next_object(id, indexp, type); return obj; } /* * Get the indicated object's net Appearance, merging everything from the * backstop appearance down. * For use by the UI, to tell what current settings are. */ Appearance * drawer_get_ap( int id ) { DGeom *dg; Appearance *ap, *nap; ap = drawerstate.ap; nap = worldap; if(nap) ap = ApMerge(nap, ap, 0); dg = (!ISGEOM(id) || id == GEOMID(ALLINDEX)) ? NULL : (DGeom *)drawer_get_object(id); if(dg && dg != dgeom[0] && (nap = GeomAppearance(dg->Item)) != NULL) { nap = ApMerge(nap, ap, 0); if(ap != drawerstate.ap) ApDelete(ap); ap = nap; } if(ap == drawerstate.ap) RefIncr((Ref *)ap); return ap; } /* * Checks whether any object is moving (so that the main loop shouldn't block). * Returns 1 if so, 0 otherwise. */ bool drawer_moving(void) { int i; DObject *o; if (motions_exist()) return true; for(i = 0; i < dgeom_max; i++) if((o = (DObject *)dgeom[i]) != NULL && (o->moving || o->changed)) return true; for(i = 0; i < dview_max; i++) if((o = (DObject *)dview[i]) != NULL && (o->moving || o->changed)) return true; return false; } /* * Public functions */ /*----------------------------------------------------------------------- * Function: drawer_idbyname * Description: parse a name and return the corresponding id * Args: *name: name to parse * Returns: id of corresponding dgeom or view * Author: mbp * Date: Fri Nov 29 13:42:43 1991 * Notes: returns NOID if there is no object with the given name */ int drawer_idbyname(char *name) { int id; switch (id=(int)(long)fsa_parse(name_fsa, name)) { case TARGETID: id = uistate.targetid; break; case TARGETGEOMID: id = GEOMID(uistate.targetgeom); break; case TARGETCAMID: id = CAMID(uistate.targetcam); break; default: /* including FOCUSID -- keep literal */ break; } return id; } int drawer_name2metaid(char *name) { return (int)(long)fsa_parse(name_fsa, name); } LDEFINE(name_object, LVOID, "(name-object ID NAME)\n\ Assign a new NAME (a string) to ID. A number is appended if\n\ that name is in use (for example, \"foo\" -> \"foo<2>\"). The new\n\ name, possibly with number appended, may be used as object's\n\ id thereafter.") { int id; char *name; LDECLARE(("name-object", LBEGIN, LID, &id, LSTRING, &name, LEND)); drawer_name_object( id, 1, name ); return Lt; } void drawer_name_object(int id, int ni, char *name) { DObject *obj = drawer_get_object(id); if (obj) name_object( obj, ni, name ); ui_objectchange(); } LDEFINE(update_draw, LVOID, "(update-draw CAM-ID [timestep_in_seconds])\n\ Apply each incremental motion once and then draw CAM-ID.\n\ Applies \"timestep\" seconds' worth of motion, or uses elapsed real\n\ time if \"timestep\" is absent or zero.") { int id; float dt = 0; LDECLARE(("update-draw", LBEGIN, LID, &id, LOPTIONAL, LFLOAT, &dt, LEND)); gv_update(dt); gv_draw(id); return Lt; } LDEFINE(draw, LVOID, "(draw CAM-ID)\n\ Draw the view in CAM-ID, if it needs redrawing. See also \"redraw\".") { DView *dv; int index; int id; LDECLARE(("draw", LBEGIN, LID, &id, LEND)); MAYBE_LOOP_ALL(id, index, T_CAM, DView, dv) { draw_view(dv); } return Lt; } LDEFINE(update, LVOID, "(update [timestep_in_seconds])\n\ Apply each incremental motion once. Uses timestep if it's present and\n\ nonzero; otherwise motions are proportional to elapsed real time.") { float realdt, dt = 0; LDECLARE(("update", LBEGIN, LOPTIONAL, LFLOAT, &dt, LEND)); realdt = elapsed(&drawerstate.lastupdate, &drawerstate.lastupdate); if(realdt > uistate.longwhile) realdt = uistate.longwhile; if(dt != 0 || realdt != 0) updateit(dt == 0 ? realdt : dt); track_changes(); return Lt; } void drawer_updateproc(int id, PFI func) { DObject *obj; int index; MAYBE_LOOP_ALL(id, index, T_NONE, DObject, obj) { obj->updateproc = func; obj->moving = ((obj->updateproc!=NULL) || nonidentity(obj->Incr)); } } LDEFINE(redraw, LVOID, "(redraw CAM-ID)\n\ States that the view in CAM-ID should be redrawn on the\n\ next pass through the main loop or the next invocation of \"draw\".") { DView *dv; int index; int id; LDECLARE(("redraw", LBEGIN, LID, &id, LEND)); MAYBE_LOOP_ALL(id, index, T_CAM, DView, dv) { dv->newcam = true; dv->frozen &= ~SOFT_FROZEN; } track_changes(); return Lt; } LDEFINE(freeze, LVOID, "(freeze CAM-ID [hard-freeze])\n\ Freeze CAM-ID; drawing in this camera's window is turned off\n\ until it is explicitly redrawn with \"(redraw CAM-ID)\", after\n\ which time drawing resumes as normal. hard-freeze (default false)\n\ is intended to be \"true\" only when windows are iconified,\n\ making them immune even to \"redraw\" until another \"(freeze CAM-ID false)\".") { DView *dv; int index; int id; Keyword hard = NO_KEYWORD; int freeze; LDECLARE(("freeze", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &hard, LEND)); freeze = boolval("freeze", hard) ? HARD_FROZEN : SOFT_FROZEN; MAYBE_LOOP_ALL(id, index, T_CAM, DView, dv) { dv->frozen = freeze; } return Lt; } void drawer_pause(int pause) { drawerstate.pause = pause; ui_action(ACTION_PAUSE); } void drawer_stop(int id) { if (id == NOID) { gv_xform_incr(ALLCAMS, &ts_identity); gv_xform_incr(ALLGEOMS, &ts_identity); gv_xform_incr(WORLDGEOM,&ts_identity); } else { gv_xform_incr(id, &ts_identity); } } static void center_geom(int id, int center) { int index; DGeom *dg; MAYBE_LOOP_ALL(id, index, T_GEOM, DGeom, dg) { gv_transform_set(dg->id, center, center, TRANSLATE_KEYWORD, 0, 0, 0); drawer_stop(dg->id); } } void drawer_center(int id) { if (TYPEOF(id) == T_NONE) { drawer_stop(NOID); center_geom(ALLGEOMS, WORLDGEOM); center_geom(WORLDGEOM, UNIVERSE); gv_camera_reset(ALLCAMS); gv_ui_center_origin(ORIGIN_KEYWORD); } else if (TYPEOF(id) == T_CAM) { gv_camera_reset(id); } else if (TYPEOF(id) == T_GEOM) { center_geom(id, id==WORLDGEOM ? UNIVERSE : WORLDGEOM); } } LDEFINE(xform_set, LVOID, "(xform-set ID TRANSFORM)\n\ Overwrite the current object transform with TRANSFORM (set\n\ object ID's transform to TRANSFORM).") { DObject *obj; int index; TransformStruct *ts; int id; LDECLARE(("xform-set", LBEGIN, LID, &id, LTRANSFORM, &ts, LEND)); MAYBE_LOOP_ALL(id, index, T_NONE, DObject, obj) { if (id == ALLGEOMS && DGobj(obj)->citizenship == ALIEN) continue; if (ts->tm == NULL) { /* * Special case for switching externally-controlled motion on & off */ if(ISGEOM(id)) GeomSet(obj->Item, CR_AXISHANDLE, ts->h, CR_END); else CamSet(DVobj(obj)->cam, CAM_C2WHANDLE, ts->h, CAM_END); } else { if (ISGEOM(id)) GeomSet(DGobj(obj)->Item, CR_AXIS, ts->tm, CR_AXISHANDLE, ts->h, CR_END); else CamSet(DVobj(obj)->cam, CAM_C2W, ts->tm, CAM_C2WHANDLE, ts->h, CAM_END); } TmIdentity(obj->Incr); obj->redraw = true; if (ts->h) { obj->changed |= CH_TRANSFORM; } obj->moving = (obj->updateproc != NULL); } return Lt; } LDEFINE(xform, LVOID, "(xform ID TRANSFORM)\n\ Apply TRANSFORM to object ID, as opposed to simply setting its\n\ transform, so the effective position\n\ of the object will be the concatenation of TRANSFORM with the\n\ current object transform.") { int id; TransformStruct *ts; DObject *obj; int index; LDECLARE(("xform", LBEGIN, LID, &id, LTRANSFORM, &ts, LEND)); MAYBE_LOOP_ALL(id, index, T_NONE, DObject, obj) { if (id == ALLGEOMS && DGobj(obj)->citizenship==ALIEN) { continue; } if (TYPEOF(id) == T_GEOM) { GeomTransform(DGobj(obj)->Item, ts->tm, NULL); } else { CamTransform(DVobj(obj)->cam, ts->tm); } TmIdentity(obj->Incr); obj->redraw = true; obj->moving = (obj->updateproc!=NULL); } return Lt; } LDEFINE(xform_incr, LVOID, "(xform-incr ID TRANSFORM)\n\ Apply continual motion: concatenate TRANSFORM with the current\n\ transform of the object every refresh (set object ID's\n\ incremental transform to TRANSFORM).") { DObject *obj; int index; TransformStruct *ts; int id; LDECLARE(("xform-incr", LBEGIN, LID, &id, LTRANSFORM, &ts, LEND)); MAYBE_LOOP_ALL(id, index, T_NONE, DObject, obj) { stop_motions(obj->id); if (id == ALLGEOMS && DGobj(obj)->citizenship == ALIEN) { continue; } if(obj->incrhandle != NULL) { HandlePDelete(&obj->incrhandle); } if((obj->incrhandle = ts->h) != NULL) { HandleRegister(&obj->incrhandle, NULL, obj->Incr, TransUpdate); object_register(&obj->incrhandle, NULL, obj); } else { TmCopy(ts->tm, obj->Incr); } obj->moving = ( nonidentity(obj->Incr) || (obj->updateproc!=NULL) ); } return Lt; } LDEFINE(new_camera, LID, "(new-camera name [CAMERA])\n\ Create a new camera with the given name (a string). If a\n\ camera with that name already exists, the new object is given\n\ a unique name. If CAMERA is omitted a default camera is used.") { DView *dv; int id; CameraStruct *cs=NULL; char *name; LDECLARE(("new-camera", LBEGIN, LSTRING, &name, LOPTIONAL, LCAMERA, &cs, LEND)); dv = new_dview(); if (!name) name = "Camera"; name_object(dv, 1, name ); mgctxset(MG_WnSet, WN_NAME, dv->name[1], WN_END, MG_END); ui_windowWillOpen(dv); mgctxset(MG_SHOW, 1, MG_END); ui_windowDidOpen(dv); ui_objectchange(); id=gv_camera(dv->name[0], cs); camera_space_relabel(id); return LNew( LID, &id ); } LDEFINE(camera, LINT, "(camera CAM-ID [CAMERA])\n\ Specify data for CAM-ID; CAMERA is a string giving an OOGL\n\ camera specification. If no camera CAM-ID exists,\n\ it is created; in this case, the second argument is optional,\n\ and if omitted, a default camera is used. See also: new-camera.") { DView *dv; int index; CameraStruct *cs=NULL; char *name; int id; LDECLARE(("camera", LBEGIN, LSTRING, &name, LOPTIONAL, LCAMERA, &cs, LEND)); if((id = drawer_idbyname(name)) == NOID) { id=gv_new_camera( name, cs ); } else { MAYBE_LOOP(id, index, T_CAM, DView, dv) { /* if cam is NULL stick with whatever camera id already has */ if (cs->cam) { RefIncr((Ref*)cs->cam); RefIncr((Ref*)cs->h); CamDelete(dv->cam); HandlePDelete(&dv->camhandle); dv->cam = cs->cam; dv->camhandle = cs->h; if(dv->camhandle) { HandleRegister(&dv->camhandle, (Ref *)dv, &dv->cam, HandleUpdRef); object_register(&dv->camhandle, NULL, (DObject *)dv); } } if(dv->cam == NULL) { dv->cam = CamCopy(drawerstate.defview.cam, NULL); } TmIdentity(dv->Incr); dv->moving = (dv->updateproc!=NULL); dv->newcam = true; } /* gv_camera_reset(id); */ } return LNew( LINT, &id ); } LDEFINE(camera_reset, LVOID, "(camera-reset CAM-ID)\n\ Reset CAM-ID to its default value.") { DView *dv; int index; int id; LDECLARE(("camera-reset", LBEGIN, LID, &id, LEND)); MAYBE_LOOP(id, index, T_CAM, DView, dv) { CamReset(dv->cam); drawer_stop(dv->id); if ((spaceof(WORLDGEOM) == TM_SPHERICAL) && (dv->hmodel == CONFORMALBALL)) { CamTranslate( dv->cam, 0.0, 0.0, 10.0 ); } if (drawerstate.NDim > 0) { /* Note: the following resets the *entire* N-D xform to the * identity, not just that in the subspace we're looking * through. Might want to have finer control. XXX - 7/28/93, * slevy & holt */ drawer_set_ND_xform(dv->id, NULL); } TmIdentity(dv->Incr); dv->moving = (dv->updateproc!=NULL); dv->redraw = true; } ui_maybe_refresh(id); return Lt; } static int drawer_new_dgeom(char *name, GeomStruct *gs, enum citizenship citizenship) { int id; DGeom *dg; dg = new_dgeom( NULL, citizenship ); if (name) name_object(dg, 1, name); ui_objectchange(); id = drawer_dgeom(dg->id, gs); if (citizenship==ALIEN) { drawer_int( id, DRAWER_NORMALIZATION, NONE ); drawer_int( id, DRAWER_BBOXDRAW, 0 ); } GeomDice(dg->Item, dg->bezdice, dg->bezdice); return id; } LDEFINE(new_alien, LID, "(new-alien name [GEOMETRY])\n\ Create a new alien (geom not in the world) with the given name\n\ (a string). GEOMETRY is a string giving an OOGL geometry\n\ specification. If GEOMETRY is omitted, the new alien\n\ is given an empty geometry. If an object with that name\n\ already exists, the new alien is given a unique name. The\n\ light beams that are used to move around the lights are an\n\ example of aliens. They're drawn but are not controllable the\n\ way ordinary objects are: they don't appear in the object\n\ browser and the user can't move them with the normal motion\n\ modes.") { GeomStruct *gs = &nullgs; char *name; int id; LDECLARE(("new-alien", LBEGIN, LSTRING, &name, LOPTIONAL, LGEOM, &gs, LEND)); if (gs->geom) RefIncr((Ref*)(gs->geom)); if (gs->h) RefIncr((Ref*)(gs->h)); id=drawer_new_dgeom(name, gs, ALIEN); return LNew( LID, &id ); } LDEFINE(new_geometry, LID, "(new-geometry name [GEOMETRY])\n\ Create a new geom with the given name (a string). GEOMETRY is\n\ a string giving an OOGL geometry specification. If\n\ GEOMETRY is omitted, the new object is given an empty geometry.\n\ If an object with that name already exists, the new object is\n\ given a unique name.") { int id; GeomStruct *gs = &nullgs; char *name; LDECLARE(("new-geometry", LBEGIN, LSTRING, &name, LOPTIONAL, LGEOM, &gs, LEND)); if (gs->geom) RefIncr((Ref*)(gs->geom)); if (gs->h) RefIncr((Ref*)(gs->h)); id = drawer_new_dgeom(name, gs, ORDINARY); return LNew( LID, &id ); } static int drawer_dgeom(int id, GeomStruct *gs) { DGeom *dg; int index; if (id == WORLDGEOM) { OOGLError(1,"drawer_dgeom: Mere mortals cannot change the World Geom!"); } else { MAYBE_LOOP(id, index, T_GEOM, DGeom, dg) { GeomSet(dg->Lgeom, CR_HANDLE_GEOM, gs->h, gs->geom, CR_END); dg->changed = CH_GEOMETRY; /* (re-)generate the BSP-tree for this object * * We could also hang the BSP-tree to dg->Item, but that would * require special handling of BSP-trees in InstTransform[To](). */ GeomBSPTree(dg->Lgeom, NULL, BSPTREE_CREATE); } } /* Caller expects us to consume the objects */ GeomDelete(gs->geom); HandleDelete(gs->h); return id; } LDEFINE(geometry, LVOID, "(geometry GEOM-ID [GEOMETRY])\n\ Specify the geometry for GEOM-ID. GEOMETRY is a string\n\ giving an OOGL geometry specification. If no object\n\ called GEOM-ID exists, it is created; in this case the\n\ GEOMETRY argument is optional, and if omitted, the new\n\ object GEOM-ID is given an empty geometry.") { char *name; GeomStruct *gs = &nullgs; int id; LDECLARE(("geometry", LBEGIN, LSTRING, &name, LOPTIONAL, LGEOM, &gs, LEND)); /* we RefIncr() because gv_geometry() (& gv_new_geometry()) expect to own the geom and handle passed in, but the lisp interpreter actually owns these cH: this is wrong, only drawer[_new]_dgeom() expects to own the object. As gv_new_geometry() increases the ref-count itself we must not do it here. */ if((id = drawer_idbyname(name)) == NOID) { gv_new_geometry( name, gs ); } else { if (gs->geom) RefIncr((Ref*)(gs->geom)); if (gs->h) RefIncr((Ref*)(gs->h)); drawer_dgeom(id, gs); } return Lt; } static int drawer_replace_geometry(int id, int *p, int pn, GeomStruct *gs) { DObject *obj; int count; int ind; Geom *where; MAYBE_LOOP(id, ind, T_GEOM, DObject, obj) { for (GeomGet(DGobj(obj)->Lgeom, CR_GEOM, &where); where && pn>0; pn--, p++) { for (count = 0; count < *p; count++) { GeomGet(where, CR_CDR, &where); } if (pn > 1) { GeomGet(where, CR_GEOM, &where); } } if (where) { GeomCCreate(where, ListMethods(), CR_HANDLE_GEOM, gs->h, gs->geom, CR_END); obj->changed = CH_GEOMETRY; } } return id; } LDEFINE(replace_geometry, LVOID, "(replace-geometry GEOM-ID PART-SPECIFICATION GEOMETRY)\n\ Replace a part of the geometry for GEOM-ID.") { char *name; int p[40]; int pn = 40; GeomStruct *gs=NULL; int id; LDECLARE(("replace-geometry", LBEGIN, LSTRING, &name, LHOLD, LARRAY, LINT, p, &pn, LGEOM, &gs, LEND)); if ((id = drawer_idbyname(name)) != NOID) drawer_replace_geometry(id, p, pn, gs); return Lt; } LDEFINE(copy, LVOID, "(copy [ID] [name])\n\ Copies an object or camera. If ID is not specified, it \n\ is assumed to be targetgeom. If name is not specified, it \n\ is assumed to be the same as the name of ID.") { DObject *obj; int id = TARGETGEOMID, newid=0; int i; char *name = NULL; GeomStruct geomstruct; CameraStruct camstruct; TransformStruct transformstruct; ApStruct apstruct; /* If the user copies the world, this will crash unless we remember not * to copy things that are copies of something else. That is what this * array is for. */ char *iscopy; LDECLARE(("copy", LBEGIN, LOPTIONAL, LID, &id, LSTRING, &name, LEND)); id = real_id(id); geomstruct.h = camstruct.h = transformstruct.h = apstruct.h = NULL; iscopy = alloca(2*dgeom_max*sizeof(char)); memset(iscopy, 0, 2*dgeom_max * sizeof(char)); MAYBE_LOOP(id, i, T_NONE, DObject, obj) { switch(TYPEOF(obj->id)) { case T_GEOM: /* Copying the world = copying each thing in the world */ if (((DGeom *)obj)->citizenship == THEWORLD || iscopy[i]) break; GeomGet(((DGeom *)obj)->Lgeom, CR_GEOM, &geomstruct.geom); if (((DGeom *)obj)->citizenship == ALIEN) newid = gv_new_alien(name == NULL ? obj->name[1] : name, &geomstruct); else newid = gv_new_geometry(name == NULL ? obj->name[1] : name, &geomstruct); apstruct.ap = GeomAppearance(obj->Item); gv_merge_ap(newid, &apstruct); GeomGet(((DGeom *)obj)->Item, CR_AXIS, transformstruct.tm); iscopy[INDEXOF(newid)] = 1; break; case T_CAM: camstruct.cam = ((DView *)obj)->cam; newid = gv_new_camera(name == NULL ? obj->name[1] : name, &camstruct); drawer_get_transform(obj->id, transformstruct.tm, WORLDGEOM); break; } gv_xform_set(newid, &transformstruct); } return Lt; } LDEFINE(delete, LVOID, "(delete ID)\n\ Delete object or camera ID.") { DObject *obj; int index; int id; unsigned int wasfrozen = UNFROZEN; LDECLARE(("delete", LBEGIN, LID, &id, LEND)); /* Real-ize the given id. In case id == TARGETGEOMID, remember we * may change the target geom during deletion. Don't let this change * what's being deleted! */ id = real_id(id); wasfrozen = uistate.freeze; gv_ui_freeze(1); MAYBE_LOOP(id, index, T_NONE, DObject, obj) { int obj_id = obj->id; /* remember, must not access obj->id after * obj has gone. */ if(obj_id == WORLDGEOM || obj_id == DEFAULTCAMID) continue; if (obj->name[0]) fsa_install( name_fsa, obj->name[0], NOID ); if (obj->name[1]) fsa_install( name_fsa, obj->name[1], NOID ); HandleUnregisterAll((Ref *)obj, (void *)(long)(int)obj->seqno, object_changed); stop_motions(obj_id); switch(TYPEOF(obj_id)) { case T_GEOM: delete_geometry((DGeom *)obj); break; case T_CAM: delete_camera((DView *)obj); break; } if (uistate.centerid==obj_id) gv_ui_center(TARGETID); } gv_ui_freeze(wasfrozen); return Lt; } LDEFINE(scene, LVOID, "(scene CAM-ID [GEOMETRY])\n\ Make CAM-ID look at GEOMETRY instead of at the universe.") { DView *dv; NDcam *cluster; int index; GeomStruct *gs = &nullgs; int id; LDECLARE(("scene", LBEGIN, LID, &id, LOPTIONAL, LGEOM, &gs, LEND)); if (drawerstate.NDim > 0 && ISCAM(id) && id != ALLCAMS && (cluster = ((DView *)drawer_get_object(id))->cluster)) { MAYBE_LOOP(ALLCAMS, index, T_CAM, DView, dv) { if (dv->cluster == cluster) { RefIncr((Ref *)gs->geom); GeomDelete(dv->Item); dv->Item = gs->geom; dv->changed = CH_GEOMETRY; } } return Lt; } MAYBE_LOOP(id, index, T_CAM, DView, dv) { RefIncr((Ref *)gs->geom); GeomDelete(dv->Item); dv->Item = gs->geom; dv->changed = CH_GEOMETRY; } return Lt; } LDEFINE(winenter, LVOID, "(winenter CAM-ID)\n\ Tell geomview that the mouse cursor is in the window\n\ of CAM-ID. This function is for development purposes\n\ and is not intended for general use.") { int id; LDECLARE(("winenter", LBEGIN, LID, &id, LEND)); winmoved(id); ui_mousefocus(INDEXOF(id)); return Lt; } LDEFINE(merge_ap, LVOID, "(merge-ap GEOM-ID APPEARANCE)\n\ Merge in some appearance characteristics to GEOM-ID.\n\ Appearance parameters include surface and line color, shading\n\ style, line width, and lighting.") { DObject *obj; int index; ApStruct *as; int id; LDECLARE(("merge-ap", LBEGIN, LID, &id, LAP, &as, LEND)); if (id == WORLDGEOM) worldap = ApMerge(as->ap, worldap, APF_INPLACE|APF_OVEROVERRIDE); MAYBE_LOOP(id, index, T_NONE, DObject, obj) { Appearance *thisap = GeomAppearance(obj->Item); GeomSet(obj->Item, CR_NOCOPY, CR_APPEAR, ApMerge(as->ap, thisap, APF_INPLACE|APF_OVEROVERRIDE), CR_END); obj->redraw = true; } ui_maybe_refresh(id); return Lt; } void drawer_set_ap(int id, Handle *h, Appearance *ap) { DObject *obj; int index; if(id == WORLDGEOM || id == ALLGEOMS) { ApDelete(worldap); worldap = ap; } MAYBE_LOOP(id, index, T_NONE, DObject, obj) { GeomSet(obj->Item, CR_NOCOPY, /* CR_APHANDLE, h */ CR_APPEAR, ap ? ApCopy(ap,NULL) : NULL, CR_END ); obj->redraw = true; } ui_maybe_refresh(id); } LDEFINE(dice, LVOID, "(dice GEOM-ID N)\n\ Dice any Bezier patches within GEOM-ID into NxN meshes; default 10.") { int id, dice; LDECLARE(("dice", LBEGIN, LID, &id, LINT, &dice, LEND)); drawer_int( id, DRAWER_BEZDICE, dice ); return Lt; } LDEFINE(bbox_draw, LVOID, "(bbox-draw GEOM-ID [yes|no])\n\ Say whether GEOM-ID's bounding-box should be drawn; \"yes\" if omitted.") { int id; Keyword yes = YES_KEYWORD; LDECLARE(("bbox-draw", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &yes, LEND)); drawer_int( id, DRAWER_BBOXDRAW, boolval("bbox-draw", yes) ); return Lt; } LDEFINE(camera_draw, LVOID, "(camera-draw CAM-ID [yes|no])\n\ Say whether or not cameras should be drawn in CAM-ID; \"yes\" if omitted.") { int id; Keyword yes = YES_KEYWORD; LDECLARE(("camera-draw", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &yes, LEND)); drawer_int( id, DRAWER_CAMERADRAW, boolval("camera-draw", yes) ); return Lt; } LDEFINE(evert, LVOID, "(evert GEOM-ID [yes|no])\n\ Set the normal eversion state of GEOM-ID. If the second argument\n\ is omitted, toggle the eversion state.") { int id, val = -1; LDECLARE(("evert", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &val, LEND)); drawer_int( id, DRAWER_EVERT, val ); return Lt; } LDEFINE(soft_shader, LVOID, "(soft-shader CAM-ID {on|off|toggle})\n\ Select whether to use software or hardware shading in that camera.") { DView *dv; int id, i, on = -1; LDECLARE(("soft-shader", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &on, LEND)); MAYBE_LOOP(id, i, T_CAM, DView, dv) { if(on == TOGGLE_KEYWORD) on = dv->shader ? OFF_KEYWORD : ON_KEYWORD; dv->shader = (on == ON_KEYWORD) ? softshader(dv->id) : NULL; if(dv->mgctx) { mgctxselect(dv->mgctx); mgctxset(MG_SHADER, dv->shader, MG_END); gv_redraw(dv->id); } ui_maybe_refresh(dv->id); } return Lt; } LDEFINE(stereowin, LLIST, "(stereowin CAM-ID [no|horizontal|vertical|colored] [gapsize])\n\ Configure CAM-ID as a stereo window.\n\ no: entire window is a single pane, stereo disabled\n\ horizontal: split left/right: left is stereo eye#0, right is #1.\n\ vertical: split top/bottom: bottom is eye#0, top is #1.\n\ colored: panes overlap, red is stereo eye#0, cyan is #1.\n\ A gap of \"gapsize\" pixels is left between subwindows;\n\ if omitted, subwindows are adjacent.\n\ If both layout and gapsize are omitted, e.g. (stereowin CAM-ID),\n\ returns current settings as a ``(stereowin ...)'' command list.\n\ This command doesn't set stereo projection; use ``merge camera'' or\n\ ``camera'' to set the stereyes transforms, and ``merge window'' or\n\ ``window'' to set the pixel aspect ratio & window position if needed.") { int id; Keyword kw = NO_KEYWORD; DView *dv; int gapsize = 0; LDECLARE(("stereowin", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &kw, LINT, &gapsize, LEND)); if(!ISCAM(id) || (dv = (DView *)drawer_get_object(id)) == NULL) { OOGLError(0, "stereowin: expected camera, got %s", drawer_id2name(id)); return Lnil; } if(kw < 0) { char *me = "stereowin"; LList *a = LListAppend( LListAppend( LListAppend( LListAppend(NULL, LTOOBJ(LSTRING)(&me)), LTOOBJ(LID)(&id)), LTOOBJ(LKEYWORD)(&dv->stereo)), LTOOBJ(LINT)(&dv->stereogap)); return LTOOBJ(LLIST)(&a); } if(kw != NO_KEYWORD && kw != HORIZONTAL_KEYWORD && kw != VERTICAL_KEYWORD && kw != COLORED_KEYWORD) { OOGLError(0, "stereowin: expected \"no\" or \"horizontal\" or \"vertical\" or \"colored\", not \"%s\"", keywordname(kw)); return Lnil; } dv->stereo = kw; dv->stereogap = gapsize; gv_redraw(id); /* Schedule redraw/window reconfiguration */ return Lt; } LDEFINE(space, LVOID, "(space {euclidean|hyperbolic|spherical})\n\ Set the space associated with the world.") { int space_keyword, space, id, index; DView *dv; LDECLARE(("space", LBEGIN, LKEYWORD, &space_keyword, LEND)); space = spaceval("space", space_keyword); drawerstate.space = space; switch (space) { default: case TM_EUCLIDEAN: break; case TM_HYPERBOLIC: case TM_SPHERICAL: drawer_int( ALLGEOMS, DRAWER_BBOXDRAW, 0 ); drawer_int( ALLGEOMS, DRAWER_NORMALIZATION, NONE ); break; } id = ALLCAMS; MAYBE_LOOP(id, index, T_CAM, DView, dv) { int mgspace = space; #if 0 if (space == TM_HYPERBOLIC || space == TM_SPHERICAL) { switch (dv->hmodel) { default: case VIRTUAL: mgspace |= TM_VIRTUAL; break; case PROJECTIVE: mgspace |= TM_PROJECTIVE; break; case CONFORMALBALL: mgspace |= TM_CONFORMAL_BALL; break; } } #endif mgspace |= TM_VIRTUAL; mgctxselect(dv->mgctx); mgctxset(MG_SPACE, mgspace, MG_END); gv_hmodel(dv->id, VIRTUAL_KEYWORD); if(dv->shader) mgctxset(MG_SHADER, dv->shader = softshader(dv->id), MG_END); } gv_xform_set(ALLGEOMS, &ts_identity); gv_xform_set(WORLDGEOM, &ts_identity); drawer_stop(NOID); #if 0 /* why are these here ???? mbp Wed Jun 9 14:21:34 1993 */ filepanel = ui_name2panel("Files"); if(ui_panelshown(filepanel)) ui_showpanel(filepanel, 1); /* Reselect */ #endif return Lt; } LDEFINE(hmodel, LVOID, "(hmodel CAMID {virtual|projective|conformal})\n\ Set the model used to display geometry in\n\ this camera; see also \"space\".") { int id, index, model_keyword; DView *dv; LDECLARE(("hmodel", LBEGIN, LID, &id, LKEYWORD, &model_keyword, LEND)); MAYBE_LOOP(id, index, T_CAM, DView, dv) { int mgspace; mgctxselect(dv->mgctx); mgctxget(MG_SPACE, &mgspace); mgspace = TM_SPACE(mgspace); dv->hmodel = hmodelval("hmodel", model_keyword); dview_set_hmodel_camspace(dv,mgspace); /* if (mgspace == TM_HYPERBOLIC) */ switch (dv->hmodel) { default: case VIRTUAL: gv_hsphere_draw(id, 0); break; case PROJECTIVE: case CONFORMALBALL: gv_hsphere_draw(id, 1); break; } switch (dv->hmodel) { default: case VIRTUAL: mgspace |= TM_VIRTUAL; break; case PROJECTIVE: mgspace |= TM_PROJECTIVE; break; case CONFORMALBALL: mgspace |= TM_CONFORMAL_BALL; break; break; } mgctxset(MG_SPACE, mgspace, MG_END); gv_camera_reset(id); camera_space_relabel(id); } return Lt; } LDEFINE(inhibit_warning, LVOID, "(inhibit-warning STRING)\n\ Inhibit warning inhbits geomview from displaying a\n\ particular warning message determined by STRING.\n\ At present there are no warning messages that this\n\ applies to, so this command is rather useless.") { char *s=NULL; LDECLARE(("inhibit-warning", LBEGIN, LSTRING, &s, LEND)); return Lt; } static void dview_set_hmodel_camspace(DView *dv, int space) { int camspace; switch (dv->hmodel) { default: case VIRTUAL: camspace = space; break; case PROJECTIVE: case CONFORMALBALL: camspace = TM_EUCLIDEAN; break; } CamSet(dv->cam, CAM_SPACE, camspace, CAM_END); } LDEFINE(hsphere_draw, LVOID, "(hsphere-draw CAMID [yes|no])\n\ Say whether to draw a unit sphere: the sphere at infinity in\n\ hyperbolic space, and a reference sphere in Euclidean and spherical\n\ spaces. If the second argument is omitted, \"yes\" is assumed.") { int id; Keyword yes = YES_KEYWORD; LDECLARE(("hsphere-draw", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &yes, LEND)); drawer_int( id, DRAWER_HSPHERE, boolval("hsphere-draw", yes) ); return Lt; } LDEFINE(pickable, LVOID, "(pickable GEOM-ID {yes|no})\n\ Say whether or not GEOM-ID is included in the pool of objects\n\ that could be returned from the pick command.") { int id; Keyword yes = YES_KEYWORD; LDECLARE(("pickable", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &yes, LEND)); drawer_int( id, DRAWER_PICKABLE, boolval("pickable", yes) ); return Lt; } LDEFINE(normalization, LVOID, "(normalization GEOM-ID {each|none|all|keep})\n\ Set the normalization status of GEOM-ID.\n\ \"none\" suppresses all normalization.\n\ \"each\" normalizes the object's bounding box to fit into the unit\n\ sphere, with the center of its bounding box translated\n\ to the origin. The box is scaled such that its long diagonal,\n\ sqrt((xmax-xmin)^2 + (ymax-ymin)^2 + (zmax-zmin)^2), is 2.\n\ \"all\" resembles \"each\", except when an object is changing\n\ (e.g. when its geometry is being changed by an external program).\n\ \n\ Then, \"each\" tightly fits the bounding box around the\n\ object whenever it changes and normalizes accordingly,\n\ while \"all\" normalizes the union of all variants of the object\n\ and normalizes accordingly.\n\ \n\ \"keep\" leaves the current normalization transform unchanged\n\ when the object changes. It may be useful to apply \"each\" or\n\ \"all\" normalization apply to the first version of a changing\n\ object to bring it in view, then switch to \"keep\"") { int id, val; LDECLARE(("normalization", LBEGIN, LID, &id, LKEYWORD, &val, LEND)); val = normalval("normalization", val); drawer_int( id, DRAWER_NORMALIZATION, val ); return Lt; } void drawer_int(int id, DrawerKeyword key, int ival) { DObject *obj; int index; int flag, override; ApStruct as; as.h = NULL; switch (key) { case DRAWER_FACEDRAW: flag = override = APF_FACEDRAW; goto setflag; case DRAWER_EDGEDRAW: flag = override = APF_EDGEDRAW; goto setflag; case DRAWER_VECTDRAW: flag = override = APF_VECTDRAW; goto setflag; case DRAWER_NORMALDRAW: flag = override = APF_NORMALDRAW; goto setflag; case DRAWER_TEXTUREDRAW: flag = override = APF_TEXTURE; goto setflag; case DRAWER_TEXTUREQUAL: flag = override = APF_TXMIPMAP|APF_TXMIPINTERP|APF_TXLINEAR; goto setflag; case DRAWER_BACKCULL: flag = override = APF_BACKCULL; goto setflag; case DRAWER_TRANSPARENT: flag = override = APF_TRANSP; goto setflag; case DRAWER_EVERT: flag = override = APF_EVERT; goto setflag; case DRAWER_SHADELINES: flag = override = APF_SHADELINES; goto setflag; case DRAWER_CONCAVE: flag = override = APF_CONCAVE; goto setflag; setflag: as.ap = ApCreate(ival ? AP_DO : AP_DONT, flag, AP_OVERRIDE, override & uistate.apoverride, AP_END); goto mergeap; case DRAWER_SHADING: as.ap = ApCreate(AP_SHADING, ival, AP_OVERRIDE, APF_SHADING & uistate.apoverride, AP_END); goto mergeap; case DRAWER_LINEWIDTH: as.ap = ApCreate(AP_LINEWIDTH, ival, AP_OVERRIDE, APF_LINEWIDTH & uistate.apoverride, AP_END); goto mergeap; case DRAWER_BEZDICE: as.ap = ApCreate(AP_DICE, ival, ival, AP_OVERRIDE, APF_DICE & uistate.apoverride, AP_END); gv_merge_ap(id, &as); ApDelete(as.ap); #if 0 MAYBE_LOOP(id, index, T_NONE, DObject, obj) { DGobj(obj)->bezdice = ival; GeomDice(DGobj(obj)->Item, ival, ival); obj->changed = CH_GEOMETRY; } #endif break; mergeap: gv_merge_ap(id, &as); ApDelete(as.ap); return; /* No need to ui_maybe_refresh(), merge_ap does it. */ case DRAWER_PROJECTION: MAYBE_LOOP(id, index, T_CAM, DObject, obj) { CamSet(DVobj(obj)->cam, CAM_PERSPECTIVE, ival, CAM_END); obj->changed = CH_GEOMETRY; } break; case DRAWER_BBOXDRAW: MAYBE_LOOP(id, index, T_GEOM, DObject, obj) { DGobj(obj)->bboxdraw = ival; obj->redraw = true; } break; case DRAWER_NORMALIZATION: MAYBE_LOOP(id, index, T_GEOM, DObject, obj) { normalize(DGobj(obj), ival); } break; case DRAWER_PICKABLE: MAYBE_LOOP(id, index, T_GEOM, DObject, obj) { DGobj(obj)->pickable = ival != 0; } break; case DRAWER_HSPHERE: MAYBE_LOOP(id, index, T_CAM, DObject, obj) { set_hsphere_draw( id, ival ); obj->redraw = true; } break; case DRAWER_CAMERADRAW: MAYBE_LOOP(id, index, T_CAM, DObject, obj) { DVobj(obj)->cameradraw = ival != 0; obj->redraw = true; } break; case DRAWER_DOUBLEBUFFER: MAYBE_LOOP(id, index, T_CAM, DObject, obj) { int opts; if(DVobj(obj)->mgctx == NULL) continue; mgctxselect(DVobj(obj)->mgctx); mgctxget(MG_SETOPTIONS, &opts); mgctxset(ival==0 || (ival<0 && opts&MGO_DOUBLEBUFFER) ? MG_UNSETOPTIONS : MG_SETOPTIONS, MGO_DOUBLEBUFFER, MG_END); obj->redraw = true; } break; case DRAWER_APOVERRIDE: /* Select whether appearance controls use the 'override' feature * to supplant user settings. Might be nice if this were settable * per feature rather than across the board. */ uistate.apoverride = ival ? ~0 : 0; MAYBE_LOOP(id, index, T_GEOM, DObject, obj) { ApUseOverrides( GeomAppearance(obj->Item), uistate.apoverride ); if(obj->id == WORLDGEOM) { ApUseOverrides( worldap, uistate.apoverride ); } if(obj->id != WORLDGEOM && !uistate.apoverride) { /* Allow pre-existing World settings to win over those in children */ ApLetPropagate( worldap, GeomAppearance(obj->Item) ); } obj->redraw = true; } break; case DRAWER_INERTIA: uistate.inertia = ival<0 ? !uistate.inertia : ival; break; case DRAWER_CONSTRAIN: uistate.constrained = ival<0 ? !uistate.constrained : ival; break; case DRAWER_OWNMOTION: uistate.ownmotion = ival<0 ? !uistate.ownmotion : ival; break; default: ; /* This should never happen */ } ui_maybe_refresh(id); } LDEFINE(lines_closer, LVOID, "(lines-closer CAM-ID DIST)\n\ Draw lines (including edges) closer to the camera than polygons\n\ by DIST / 10^5 of the Z-buffer range. DIST = 3.0 by default.\n\ If DIST is too small, a line lying on a surface may be\n\ dotted or invisible, depending on the viewpoint.\n\ If DIST is too large, lines may appear in front of surfaces\n\ that they actually lie behind. Good values for DIST vary with\n\ the scene, viewpoint, and distance between near and far clipping\n\ planes. This feature is a kludge, but can be helpful.") { float dist; int id; LDECLARE(("lines-closer", LBEGIN, LID, &id, LFLOAT, &dist, LEND)); drawer_float(id, DRAWER_LINE_ZNUDGE, dist); return Lt; } void drawer_float(int id, DrawerKeyword key, float fval) { DObject *obj; ApStruct as; int index; int attr, over; LInterest *interested; as.h = NULL; switch (key) { case DRAWER_NEAR: attr = CAM_NEAR; goto setcam; case DRAWER_FAR: attr = CAM_FAR; goto setcam; case DRAWER_FOV: attr = CAM_FOV; goto setcam; case DRAWER_FOCALLENGTH: attr = CAM_FOCUS; goto setcam; setcam: interested = LInterestList("merge"); MAYBE_LOOP(id, index, T_CAM, DObject, obj) { DVobj(obj)->cam = CamSet(DVobj(obj)->cam, attr, fval, CAM_END); DVobj(obj)->redraw = true; if(interested) gv_merge(&CamOps, DVobj(obj)->id, (Ref *)DVobj(obj)->cam); } break; case DRAWER_KA: attr = MT_Ka; over = MTF_Ka; goto domt; case DRAWER_KD: attr = MT_Kd; over = MTF_Kd; goto domt; case DRAWER_KS: attr = MT_Ks; over = MTF_Ks; goto domt; case DRAWER_SHININESS: attr = MT_SHININESS; over = MTF_SHININESS; goto domt; case DRAWER_ALPHA: attr = MT_ALPHA; over = MTF_ALPHA; goto domt; domt: as.ap = ApCreate(AP_MtSet, attr, fval, MT_OVERRIDE, over & uistate.apoverride, MT_END, AP_END); goto mergeap; case DRAWER_NORMSCALE: as.ap = ApCreate(AP_NORMSCALE, fval, AP_OVERRIDE, APF_NORMSCALE & uistate.apoverride, AP_END); goto mergeap; mergeap: gv_merge_ap(id, &as); ApDelete(as.ap); return; case DRAWER_LIGHT_INTENSITY: set_light_intensity( fval ); drawerstate.changed = true; break; case DRAWER_LINE_ZNUDGE: MAYBE_LOOP(id, index, T_CAM, DObject, obj) { DVobj(obj)->lineznudge = fval; DVobj(obj)->redraw = true; } drawerstate.defview.lineznudge = fval; break; default: { /* report some kind of error? */ } } ui_maybe_refresh(id); } LDEFINE(backcolor, LVOID, "(backcolor CAM-ID R G B)\n\ Set the background color of CAM-ID; R G B are numbers\n\ between 0 and 1.") { int id; Color color; LDECLARE(("backcolor", LBEGIN, LID, &id, LFLOAT, &(color.r), LFLOAT, &(color.g), LFLOAT, &(color.b), LEND)); drawer_color( id, DRAWER_BACKCOLOR, &color ); return Lt; } LDEFINE(bbox_color, LVOID, "(bbox-color GEOM-ID R G B)\n\ Set the bounding-box color of GEOM-ID; R G B are numbers\n\ between 0 and 1.") { int id; Color color; LDECLARE(("bbox-color", LBEGIN, LID, &id, LFLOAT, &(color.r), LFLOAT, &(color.g), LFLOAT, &(color.b), LEND)); drawer_color( id, DRAWER_BBOXCOLOR, &color ); return Lt; } void drawer_color(int id, DrawerKeyword key, Color *col) { int index; ApStruct as; DObject *obj; as.h = NULL; switch (key) { case DRAWER_DIFFUSE: as.ap = ApCreate(AP_MtSet, MT_DIFFUSE, col, MT_AMBIENT, col, MT_OVERRIDE, MTF_DIFFUSE & uistate.apoverride, MT_END, AP_END); goto doap; case DRAWER_EDGECOLOR: as.ap = ApCreate(AP_MtSet, MT_EDGECOLOR, col, MT_OVERRIDE, MTF_EDGECOLOR & uistate.apoverride, MT_END, AP_END); goto doap; case DRAWER_NORMALCOLOR: as.ap = ApCreate(AP_MtSet, MT_NORMALCOLOR, col, MT_OVERRIDE, MTF_NORMALCOLOR & uistate.apoverride, MT_END, AP_END); goto doap; doap: gv_merge_ap(id, &as); ApDelete(as.ap); break; case DRAWER_BBOXCOLOR: MAYBE_LOOP(id, index, T_GEOM, DObject, obj) { if (DGobj(obj)->bboxap && DGobj(obj)->bboxap->mat) { MtSet(DGobj(obj)->bboxap->mat, MT_EDGECOLOR, col, MT_OVERRIDE, MTF_EDGECOLOR & uistate.apoverride, MT_END); obj->redraw = true; } else { OOGLError(0,"object with %1d has no bboxap!"); } } uistate.pickedbboxcolor = *col; break; case DRAWER_BACKCOLOR: drawerstate.defview.backcolor = *col; MAYBE_LOOP(id, index, T_CAM, DObject, obj) { DVobj(obj)->backcolor = *col; DVobj(obj)->redraw = true; } break; case DRAWER_LIGHTCOLOR: set_light_color(col); break; default: { /* report some kind of error? */ } } ui_maybe_refresh(id); } LDEFINE(window, LVOID, "(window CAM-ID WINDOW)\n\ Specify attributes for the window of CAM-ID, e.g. its size\n\ or initial position, in the OOGL Window syntax.\n\ The special CAM-ID \"default\" specifies\n\ properties of future windows (created by \"camera\" or\n\ \"new-camera\").") { int index; DView *dv; int id; WindowStruct *ws; LDECLARE(("window", LBEGIN, LID, &id, LWINDOW, &ws, LEND)); MAYBE_LOOP(id, index, T_CAM, DView, dv) { WnDelete(dv->win); dv->win = WnCopy(ws->wn); if(dv->mgctx) { mgctxselect(dv->mgctx); mgctxset(MG_WINDOW, dv->win, MG_END); } } return Lt; } /* * Everything below here is internal to the drawer module (and should * be declared static to enforce this). */ /* * Track all changes made to dgeoms and views, by checking their * "changed", "moving" and "redraw" flags. * Effect: * For each changed ordinary DGeom, calls update_dgeom() * to possibly recompute the bounding box and/or renormalize. * Set the "redraw" flags on all DViews which: * are marked as "changed" or "moving", or * Also set "redraw" on all DViews which view the world, * if any DGeoms are "changed" or "moving". * * Environment: * "changed" flags are set by gv_geometry(), etc. * and by callback routines from external changes. * They're cleared by this routine. * "redraw" flags are cleared by draw_view(). * "moving" is set by drawer_xform_incr() and drawer_updateproc(). */ static void track_changes() { bool worldchange = drawerstate.changed; bool viewchange = 0; int i; DObject *o; for(i = 0; i < dgeom_max; i++) { if((o = (DObject *)dgeom[i]) != NULL) { if(o->moving) worldchange = true; if(o->changed || o->redraw) { worldchange = true; update_dgeom((DGeom*)o); o->changed = CH_NOTHING; o->redraw = false; } } } for(i = 0; i < dview_max; i++) { if((o = (DObject *)dview[i]) != NULL) { if(o->moving || ((DView *)o)->newcam || (worldchange && o->Item == drawerstate.universe)) o->changed = true; if(o->changed) { update_view((DView *)o); viewchange = true; } if(!((DView*)o)->frozen) { viewchange = viewchange || o->redraw; } } } if(viewchange) { for(i = 0; i < dview_max; i++) if((o = (DObject *)dview[i]) != NULL) if(((DView *)o)->cameradraw) o->redraw = true; } drawerstate.changed = false; } LDEFINE(merge_baseap, LVOID, "(merge-baseap APPEARANCE)\n\ Merge in some appearance characteristics to the base default\n\ appearance (applied to every geom before its own apperance).\n\ Lighting is typically included in the base appearance.") { ApStruct *as; LDECLARE(("merge-baseap", LBEGIN, LAP, &as, LEND)); drawerstate.ap = ApMerge(as->ap, drawerstate.ap ? drawerstate.ap : base_defaultap, APF_OVEROVERRIDE); drawerstate.apseq++; lights_changed_check(); return Lt; } void drawer_merge_camera( int id, Camera *cam ) { DView *dv; int index; MAYBE_LOOP(id, index, T_CAM, DView, dv) { CamMerge(cam, dv->cam); dv->newcam = true; } } void drawer_merge_window( int id, WnWindow *win ) { DView *dv; int index; MAYBE_LOOP(id, index, T_CAM, DView, dv) { WnMerge(win, dv->win); if(dv->mgctx) { mgctxselect(dv->mgctx); mgctxset(MG_WINDOW, dv->win, MG_END); dv->newcam = true; } } } static void delete_geometry(DGeom *dg) { int i, index = INDEXOF(dg->id); if(dgeom[index] == NULL) /* Already (being) deleted -- forget it */ return; dgeom[index] = NULL; switch (dg->citizenship) { case ORDINARY: dgeom[0]->Lgeom = ListRemove( dgeom[0]->Lgeom, dg->Item ); GeomReplace( dgeom[0]->Inorm, dgeom[0]->Lgeom ); ui_objectchange(); if (uistate.targetgeom==index) { /* We deleted the target -- find next lowest one */ for (i=index; --i>=0 && dgeom[i]==NULL; ); gv_ui_target( GEOMID(i), TYPEOF(uistate.targetid) == T_GEOM ? IMMEDIATE : NOIMMEDIATE ); } break; case ALIEN: if (ListRemove(drawerstate.universe, dg->Item) != drawerstate.universe) { OOGLError(0, "\ head of the universe changed --- this shouldn't happen; please report this bug!"); } break; default: ; /* This should never happen */ } HandlePDelete(&dg->incrhandle); OOGLFree(dg); drawerstate.changed = true; } static void delete_camera(DView *dv) { int index = INDEXOF(dv->id); int i; if(dview[index] == NULL) /* Already (being) deleted -- forget it */ return; dview[index] = NULL; mgctxdelete(dv->mgctx); CamDelete(dv->cam); HandlePDelete(&dv->camhandle); GeomDelete(dv->Item); OOGLFree(dv); ui_objectchange(); if (index == uistate.mousefocus) { for(i = dview_max; --i > 0 && (dview[i] == NULL || dview[i]->frozen != UNFROZEN); ) ; ui_mousefocus(i); } if (drawer_get_object(TARGETCAMID) == NULL) { if (drawer_get_object(FOCUSID) == NULL) { gv_ui_target( WORLDGEOM, IMMEDIATE); } else { gv_ui_target( FOCUSID, TYPEOF(uistate.targetid) == T_CAM ? IMMEDIATE : NOIMMEDIATE); } } } void drawer_init(char *apdefault, char *defaultcam, char *windefault) { int i; DGeom *dg; IOBFILE *f; ts_identity.h = NULL; TmIdentity(ts_identity.tm); f = iobfileopen(fmemopen(apdefault, strlen(apdefault), "rb")); if(f) drawerstate.ap = base_defaultap = ApFLoad(f, "built-in appearance"); iobfclose(f); RefIncr((Ref *)drawerstate.ap); drawerstate.apseq++; /* Install default window position if not already set */ if(drawerstate.defview.win == NULL) comm_object(windefault, &WindowOps, NULL, (Ref **)(void *)&drawerstate.defview.win, COMM_NOW); drawerstate.defview.backcolor = initial_defaultbackcolor; if(drawerstate.defview.cam == NULL) drawerstate.defview.cam = CamCreate(CAM_FOV, 40.0, CAM_NEAR, 0.1, CAM_FAR, 100.0, CAM_END); /* Create a not-quite-instantiated window */ drawerstate.defview.mgctx = mgctxcreate(MG_CAMERA, drawerstate.defview.cam, MG_BACKGROUND, &drawerstate.defview.backcolor, MG_APPEAR, drawerstate.ap, MG_WINDOW, drawerstate.defview.win, MG_SHOW, 0, MG_END ); drawerstate.defview.id = DEFAULTCAMID; drawerstate.defview.lineznudge = 3.; drawerstate.space = TM_EUCLIDEAN; drawerstate.pause = 0; /* drawerstate.motionscale controls the minimum rate of scaled translations; it should be small, for accurate mouse tracking, but not quite zero, lest scaled motions do nothing when a moving object coincides with the center of motion. (At present, the only scaled translation is Z-motion in [o]rbit mode.) slevy 93.10.15. */ drawerstate.motionscale = 0.03; name_fsa = fsa_initialize(name_fsa, NOID); fsa_install(name_fsa, "focus", (void *)FOCUSID); fsa_install(name_fsa, "default", (void *)DEFAULTCAMID); fsa_install(name_fsa, "defaultcam", (void *)DEFAULTCAMID); fsa_install(name_fsa, "target", (void *)TARGETID); fsa_install(name_fsa, "targetgeom", (void *)TARGETGEOMID); fsa_install(name_fsa, "g.", (void *)TARGETGEOMID); fsa_install(name_fsa, "targetcam", (void *)TARGETCAMID); fsa_install(name_fsa, "targetcamera", (void *)TARGETCAMID); fsa_install(name_fsa, "c.", (void *)TARGETCAMID); fsa_install(name_fsa, "center", (void *)CENTERID); fsa_install(name_fsa, "allgeoms", (void *)ALLGEOMS); fsa_install(name_fsa, "g*", (void *)ALLGEOMS); fsa_install(name_fsa, "allcams", (void *)ALLCAMS); fsa_install(name_fsa, "c*", (void *)ALLCAMS); fsa_install(name_fsa, "worldgeom", (void *)WORLDGEOM); fsa_install(name_fsa, "world", (void *)WORLDGEOM); fsa_install(name_fsa, "self", (void *)SELF); fsa_install(name_fsa, ".", (void *)SELF); fsa_install(name_fsa, "universe", (void *)UNIVERSE); fsa_install(name_fsa, "Universe", (void *)UNIVERSE); fsa_install(name_fsa, "primitive", (void *)PRIMITIVE); /* The following four names are here for backward compatibility * of the 'write' command with the midsummer '92 version. */ fsa_install(name_fsa, "bare", (void *)SELF); fsa_install(name_fsa, "wrap", (void *)WORLDGEOM); fsa_install(name_fsa, "cumulative", (void *)UNIVERSE); fsa_install(name_fsa, "cum", (void *)UNIVERSE); dgeom = OOGLNewNE(DGeom *, dgeom_max, "dgeom array"); dview = OOGLNewNE(DView *, dview_max, "view array"); for (i=0; i INST [world modelling & appearance] * == dgeom[0]->Item | * | * dgeom[0]->Inorm INST [world normalizing] * | * dgeom[0]->Lgeom --> LIST -- LIST -- LIST ... [all objects] */ dgeom[0] = dg = OOGLNewE(DGeom, "world DGeom"); dg->normalization = EACH; dg->bboxdraw = 1; dg->bezdice = 10; drawer_init_dgeom(dg, GEOMID(0), THEWORLD); dg->Inorm = GeomCreate("inst", CR_END); dg->bboxap = ApCreate(AP_DONT, APF_FACEDRAW, AP_DO, APF_EDGEDRAW, AP_OVERRIDE, APF_EDGEDRAW, AP_MtSet, MT_EDGECOLOR,&uistate.pickedbboxcolor, MT_OVERRIDE, MTF_EDGECOLOR, MT_END, AP_END); drawerstate.world = GeomCreate("inst", CR_GEOM, dg->Inorm, CR_END); dg->Item = drawerstate.world; dg->Lgeom = NULL; TmIdentity(dg->Incr); name_object(dg, 1, "World"); dg->bboxvalid = false; drawerstate.universe = GeomCreate("list", CR_GEOM, drawerstate.world, CR_END); drawerstate.defview.Item = drawerstate.universe; GeomDice(dg->Item, dg->bezdice, dg->bezdice); f = iobfileopen(fmemopen(defaultcam, strlen(defaultcam), "rb")); drawerstate.camgeom = GeomFLoad(f, "built-in camera geometry"); iobfclose(f); drawerstate.camproj = 0; #ifdef MANIFOLD drawerstate.nDV = 0; drawerstate.nMT = 0; drawerstate.d1 = 1.0; drawerstate.i1 = 0.5; verbose_manifold = ( getenv("VERBOSE_MANIFOLD") != NULL ); trivial_visibility = ( getenv("TRIVIAL_VISIBILITY") != NULL ); #endif /* MANIFOLD */ } static void winmoved(int camid) { WnWindow *wn; DView *dv = (DView *)drawer_get_object(camid); if(dv != NULL && dv->mgctx != NULL) { mgctxselect(dv->mgctx); mgctxget(MG_WINDOW, &wn); WnGet(wn, WN_CURPOS, &drawerstate.winpos); } } static bool nonidentity(Transform T) { return memcmp(T, TM_IDENTITY, sizeof(Transform)) != 0; } static DGeom * new_dgeom(char *from, enum citizenship citizenship) { DGeom *dg; Geom *g = NULL; Handle *h = NULL; int i; if(from != NULL) (void) comm_object(from, &GeomOps, &h, (Ref **)(void *)&g, COMM_LATER); for (i=0; ibboxdraw = dgeom[0]->bboxdraw; dg->Lgeom = GeomCreate("list", CR_HANDLE_GEOM, h, g, CR_END); dg->Lbbox = GeomCreate("list", CR_NOCOPY, CR_APPEAR, dg->bboxap=ApCopy(dgeom[0]->bboxap, NULL), CR_END); ListAppend(dg->Lgeom, dg->Lbbox); dg->Inorm = GeomCreate("inst", CR_NOCOPY, CR_GEOM, dg->Lgeom, CR_END); dg->Item = GeomCreate("inst", CR_NOCOPY, CR_GEOM, dg->Inorm, CR_END); dg->changed = CH_GEOMETRY; dg->pickable = true; switch (citizenship) { case ORDINARY: if(dgeom[0]->Lgeom == NULL) dgeom[0]->Lgeom = GeomCreate("list", CR_NOCOPY, CR_GEOM, dg->Item, CR_END); else ListAppend( dgeom[0]->Lgeom, dg->Item ); GeomReplace( dgeom[0]->Inorm, dgeom[0]->Lgeom ); break; case ALIEN: ListAppend(drawerstate.universe, dg->Item); break; default: break; /* cannot happen, shut-off a compiler warning */ } return dg; } void drawer_init_dgeom(DGeom *dg, int id, enum citizenship citizenship) { dg->id = id; dg->citizenship = citizenship; TmIdentity(dg->Incr); dg->incrhandle = NULL; dg->updateproc = NULL; dg->moving = 0; dg->bezdice = dgeom[0]->bezdice; dg->name[0] = NULL; dg->name[1] = NULL; name_object(dg, 0, new_object_name(T_GEOM)); dg->bboxdraw = dgeom[0]->bboxdraw; dg->normalization = dgeom[0]->normalization; dg->bboxvalid = false; dg->changed = CH_NOTHING; dg->redraw = false; dg->seqno = 0; dg->NDT = NULL; dg->NDTinv = NULL; #if 0 GeomSet(dg->Item, CR_NDAXIS, dg->NDT, CR_END); #endif } /*----------------------------------------------------------------------- * Function: drawer_make_bbox * Description: Make a new bounding box. * Args: *dg: parent DGeom * combine: flag; if non-zero, takes union of old & new bboxes; * if zero, fits bbox tightly about object. * Returns: * Author: munzner * Date: Tue Dec 10 20:42:20 1991 * Notes: Geom must be non-NULL. * If old bbox exists is deleted, since new one always created. * Default appearance: draw black edges, no faces. * Assumes (if 'combine') that Lbbox list includes Lgeom list. */ void drawer_make_bbox(DGeom *dg, bool combine) { Geom *bbox; /* Don't create bbox for world dgeom */ if (dg->id == WORLDGEOM) { return; } if (!dg->bboxvalid) { if(!combine) { GeomReplace(dg->Lbbox, NULL); } bbox = GeomBound(dg->Lgeom, drawerstate.NDim > 0 ? NULL : TM_IDENTITY, NULL); if (bbox) { GeomReplace(dg->Lbbox, bbox); GeomDelete(bbox); /* Only Lbbox needs it now */ dg->bboxvalid = true; } } } /*----------------------------------------------------------------------- * Function: _name_object * Description: name an object * Args: *obj: the object to be named * ni: name index --- 0 or 1 * *name: object's name name * Returns: nothing * Author: mbp * Date: Thu Dec 5 18:12:22 1991 * Notes: Don't call this procedure directly. Use the * 'name_object' * macro defined above; it casts * its first argument (a DGeom* or a DView*) to Object*. */ static char * _name_object(DObject *obj, int ni, char *name) { char *tail; /* uninstall the old name, if any */ if (obj->name[ni] != NULL) { fsa_install( name_fsa, obj->name[ni], NOID ); OOGLFree(obj->name[ni]); obj->name[ni] = NULL; } /* get tail if full pathname */ tail = strrchr(name, '/'); if (tail) tail++; else tail = name; /* install the new name */ obj->name[ni] = unique_name(tail, obj->id); if ( ni==0 && strcmp(obj->name[ni], tail)!=0 ) { OOGLError(0,"warning: attempt to use existing first name: \"%s\"\n\ using \"%s\" instead", tail, obj->name[ni]); } fsa_install( name_fsa, obj->name[ni], (void *)(long)obj->id ); return obj->name[ni]; } static DView * new_dview() { DView *dv; char window_name[64], *view_name; int i; WnPosition wp; for (i=0; iid = CAMID(i); view_name = new_object_name(T_CAM); dv->cam = CamCopy(drawerstate.defview.cam, NULL); CamSet(dv->cam, CAM_SPACE, drawerstate.space, CAM_END); dv->win = WnCopy(drawerstate.defview.win); dv->backcolor = drawerstate.defview.backcolor; dv->camhandle = NULL; RefIncr((Ref*)(drawerstate.universe)); dv->Item = drawerstate.universe; dv->extradraw = NULL; dv->apseq = drawerstate.apseq; TmIdentity(dv->Incr); dv->incrhandle = NULL; dv->updateproc = NULL; dv->moving = false; dv->changed = CH_NOTHING; dv->frozen = UNFROZEN; dv->seqno = 0; dv->lineznudge = drawerstate.defview.lineznudge; dv->newcam = true; dv->name[0] = NULL; dv->name[1] = NULL; name_object(dv, 0, view_name); sprintf(window_name, "geomview %s", view_name); dv->cameradraw = false; dv->hsphere = NULL; dv->hmodel = VIRTUAL; dv->stereo = NO_KEYWORD; dv->stereogap = 0; dv->shader = NULL; dv->mgctx = mgctxcreate(MG_CAMERA, dv->cam, MG_BACKGROUND, &dv->backcolor, MG_APPEAR, drawerstate.ap, MG_WINDOW, dv->win, MG_SHOW, 0, /* Don't show window until we set its name */ MG_END ); if(WnGet(dv->win, WN_PREFPOS, &wp) > 0) { wp.xmin += 40; wp.ymin -= 40; wp.xmax += 40; wp.ymax -= 40; WnSet(drawerstate.defview.win, WN_PREFPOS, &wp, WN_END); } if(i >= nwins) nwins = i+1; for(i = 0; i < 3; i++) dv->NDPerm[i] = i+1; dv->NDPerm[3] = 0; dv->nNDcmap = 0; dv->cluster = NULL; for(i = 0; i < MAXCMAP; i++) { dv->NDcmap[i].axis = NULL; VVINIT(dv->NDcmap[i].cents, cent, 5); } return dv; } static void updateit(float dt) { int i; DView *dv; DGeom *dg; Geom *g; do_motion(dt); for(i = 0; i < dgeom_max; i++) { if((dg = dgeom[i]) == NULL) continue; if (dg->updateproc) { GeomGet(dg->Lgeom, CR_GEOM, &g); (*(dg->updateproc))(g); } else { GeomTransform(dg->Item, dg->Incr, NULL); } } LOOPVIEWS(i,dv) { if (dv->updateproc) (*(dv->updateproc))(dv->cam); else CamTransform(dv->cam, dv->Incr); } } static void draw_view(DView *dv) { /* Colors for red/cyan stereo */ static int lefteyemask = MGO_NOGREEN|MGO_NOBLUE; /* Red */ static int righteyemask = MGO_NORED; /* Green+Blue */ Appearance *ap; if((dv->frozen == UNFROZEN) && (dv->redraw || (dv->changed != CH_NOTHING) || dv->newcam)) { mgctxselect(dv->mgctx); mgctxset(MG_CAMERA, dv->cam, MG_BACKGROUND, &dv->backcolor, MG_ZNUDGE, dv->lineznudge * 1.0e-5, MG_UNSETOPTIONS, MGO_NORED|MGO_NOGREEN|MGO_NOBLUE|MGO_INHIBITCLEAR, MG_END); if(drawerstate.apseq > dv->apseq) { mgsetappearance(drawerstate.ap, MG_SET); dv->apseq = drawerstate.apseq; } ap = GeomAppearance(dv->Item); if(ap) mgsetappearance(ap, MG_MERGE); if(dv->newcam) reconfigure_view(dv); if(dv->stereo != NO_KEYWORD) { mgctxset(MG_WnSet, WN_VIEWPORT, &dv->vp[1], WN_END, MG_CamSet, CAM_STEREOEYE, 1, CAM_END, MG_SETOPTIONS, MGO_INHIBITSWAP, MG_END); if(dv->stereo == COLORED_KEYWORD) mgctxset(MG_SETOPTIONS, lefteyemask, MG_END); really_draw_view(dv); mgctxset(MG_WnSet, WN_VIEWPORT, &dv->vp[0], WN_END, MG_CamSet, CAM_STEREOEYE, 0, CAM_END, MG_UNSETOPTIONS, MGO_INHIBITSWAP|lefteyemask, MG_END); if(dv->stereo == COLORED_KEYWORD) { /* In Iris GL, clearing clears everything, including the * left-eye image we just drew. In OpenGL, it doesn't. * So *only* if we're doing GL drawing, select MGO_INHIBITCLEAR * along with the right-eye image planes. */ mgctxset(MG_SETOPTIONS, _mgf.mg_devno == MGD_GL ? righteyemask|MGO_INHIBITCLEAR : righteyemask, MG_END); } } really_draw_view(dv); dv->changed = CH_NOTHING; dv->redraw = false; } } /* * Reconfigure view. Assumes the proper window is already selected. */ static void reconfigure_view(DView *dv) { WnWindow *win = NULL; WnPosition wp, gap; int xsize, ysize; int isstereo = 1; mgctxget(MG_WINDOW, &win); WnGet(win, WN_CURPOS, &wp); xsize = wp.xmax - wp.xmin + 1; ysize = wp.ymax - wp.ymin + 1; dv->vp[0].xmin = dv->vp[0].ymin = 0; dv->vp[0].xmax = xsize-1; dv->vp[0].ymax = ysize-1; dv->vp[1] = dv->vp[0]; gap = dv->vp[0]; switch(dv->stereo) { case NO_KEYWORD: isstereo = 0; break; case HORIZONTAL_KEYWORD: dv->vp[0].xmax = (xsize - dv->stereogap) / 2; dv->vp[1].xmin = dv->vp[0].xmax + dv->stereogap; gap.xmin = dv->vp[0].xmax + 1; gap.xmax = dv->vp[1].xmin - 1; break; case VERTICAL_KEYWORD: dv->vp[0].ymax = (ysize - dv->stereogap) / 2; dv->vp[1].ymin = dv->vp[0].ymax + dv->stereogap; gap.ymin = dv->vp[0].ymax + 1; gap.ymax = dv->vp[1].ymin - 1; break; case COLORED_KEYWORD: /* Viewports identical, stereo enabled. */ break; default: break; } if(dv->stereogap > 0) { mgctxset(MG_WnSet, WN_VIEWPORT, &gap, WN_END, MG_END); mgworldbegin(); mgworldend(); /* Force clear */ mgworldbegin(); mgworldend(); /* ... of both buffers */ } mgctxset(MG_WnSet, WN_VIEWPORT, &dv->vp[0], WN_END, MG_CamSet, CAM_STEREO, isstereo, CAM_END, MG_END); mgreshapeviewport(); dv->newcam = false; if(dv->id == CAMID(uistate.mousefocus)) winmoved(dv->id); } static void really_draw_view(DView *dv) { #if 0 #include static int cnt; static struct timeval tv_old[1]; if (cnt % 100 == 0) { struct timeval tv_new[1]; double elapsed; gettimeofday(tv_new, NULL); if (cnt > 0) { elapsed = (double)(tv_new->tv_sec - tv_old->tv_sec); elapsed += (double)(tv_new->tv_usec - tv_old->tv_usec) / 1e6; fprintf(stderr, "%d frames in %e seconds, fps = %e\n", cnt, elapsed, (double)cnt/elapsed); cnt = 0; } *tv_old = *tv_new; } cnt++; #endif mgpushappearance(); mgworldbegin(); if(dv->cluster == NULL && drawerstate.NDim > 0) { /* If we're in N-D mode but this camera isn't equipped, * give it a default N-D => 3-D projection now. */ gv_ND_axes(dv->name[0], drawerstate.NDcams ? drawerstate.NDcams->name : "default", 1, 2, 3, 0); } if(dv->cluster != NULL) { /* ND-drawing, works also with scenes; the (scene ...) command * takes care of attaching all cameras of a cluster to the same * scene. */ NDcam *cluster = dv->cluster; int dim = TmNGetSize(cluster->C2W, NULL,NULL); NDstuff *nds; TransformN *W2C = NULL, *W2U = NULL; cluster->W2C = TmNInvert(cluster->C2W, cluster->W2C); W2C = TmNCopy(cluster->W2C, NULL); W2U = TmNIdentity(TmNCreate(dim, dim, NULL)); nds = drawer_init_ndstuff(dv, W2C, W2U); drawer_transform_ndstuff(nds, NULL); mgctxset(MG_NDCTX, nds, MG_END); GeomDraw(dv->Item); /* draw other camera's if requested; take their respective * ND-transform into account. */ if (drawerstate.camgeom != NULL && dv->cameradraw) { DView *otherv; int otheri; Transform T3; TransformN *ovC2W = NULL; LOOPVIEWS(otheri, otherv) { if (otherv != dv && otherv->Item == dv->Item) { if(drawerstate.camproj) { /* Mmmh. ND?? */ Transform Tt; CamView(otherv->cam, Tt); TmInvert(Tt, T3); } else { CamGet(otherv->cam, CAM_C2W, T3); } if (otherv->cluster && otherv->cluster->C2W) { ovC2W = TmNCopy(otherv->cluster->C2W, ovC2W); } else { ovC2W = ovC2W ? TmNIdentity(ovC2W) : TmNIdentity(TmNCreate(drawerstate.NDim, drawerstate.NDim, NULL)); } TmNApplyT3TN(T3, otherv->NDPerm, ovC2W); TmNMap(ovC2W, otherv->NDPerm, ovC2W); drawer_transform_ndstuff(nds, ovC2W); GeomDraw(drawerstate.camgeom); /* we assume that cameras have no translucent component */ } } TmNDelete(ovC2W); } TmNDelete(W2U); TmNDelete(W2C); drawer_destroy_ndstuff(nds); mgctxset(MG_NDCTX, NULL, MG_END); } else { /* Normal case. Just draw whatever's attached to this camera */ GeomDraw(dv->Item); /* new */ if (dv->hsphere != NULL) { /* if we're in conformal ball model, switch to projective model for drawing the sphere at infinity, then switch back */ int mgspace; mgctxget(MG_SPACE, &mgspace); if (dv->hmodel == CONFORMALBALL) { mgctxset(MG_SPACE, TM_SPACE(mgspace) | TM_PROJECTIVE, MG_END); GeomDraw(dv->hsphere); mgctxset(MG_SPACE, mgspace, MG_END); } else { GeomDraw(dv->hsphere); } } /* drawing of other cameras in ND has been handled above */ if (drawerstate.camgeom && dv->cameradraw && dv->Item == drawerstate.universe) { DView *otherv; int otheri; Transform T, Tt; LOOPVIEWS(otheri,otherv) { if (otherv != dv && otherv->Item == drawerstate.universe) { mgpushtransform(); if(drawerstate.camproj) { CamView(otherv->cam, Tt); TmInvert(Tt, T); } else CamGet(otherv->cam, CAM_C2W, T); mgtransform(T); GeomDraw(drawerstate.camgeom); mgpoptransform(); } } } } if (dv->extradraw) (dv->extradraw)(dv); mgworldend(); mgpopappearance(); } static char * new_object_name(int type) { static char name[16]; int i; for(i = 0; ; i++) { sprintf(name, "%c%d", type == T_GEOM ? 'g' : 'c', i); if(drawer_idbyname(name) == NOID) return name; } } /*----------------------------------------------------------------------- * Function: ordinal * Description: extract the ordinal number of a DView or DGeom from its name * Args: *name: DView or DGeom's name --- assumed to be of the form * "x", where x is any char * Returns: * Author: mbp * Date: Sat Nov 30 22:42:54 1991 */ /* static int ordinal(char *name) { return( atoi( &name[1] ) ); } */ static void object_changed(Handle **hp, DObject *obj, void *seqno) { if(obj->seqno != (long)seqno) { /* Obsolete reference -- remove this Handle callback */ HandleUnregisterJust(hp, (Ref*)obj, seqno, object_changed); } else { obj->changed = CH_GEOMETRY; } } static int object_register(Handle **hp, Ref *thing, DObject *o) { HandleRegister(hp, (Ref *)o, (void *)(long)(int)o->seqno, object_changed); return 0; } /* * Something has changed in this dgeom's geometry. * Discard and (if necessary) recompute bounding box. * In any case, scan for Handles. */ static void update_dgeom(DGeom *dg) { if(dg->id == WORLDGEOM) { return; } if(dg->changed/* & CH_GEOMETRY*/) { dg->bboxvalid = false; HandleUnregisterAll((Ref *)dg, (void *)(long)(int)dg->seqno, object_changed); dg->seqno++; /* * Find all Handles in this DGeom, and a callback for each. */ GeomHandleScan(dg->Item, object_register, dg); } if(dg->bboxdraw || dg->normalization != NONE) { drawer_make_bbox(dg, dg->normalization == ALL); } ApSet(dg->bboxap, dg->bboxdraw ? AP_DO : AP_DONT, APF_EDGEDRAW, AP_OVERRIDE, APF_EDGEDRAW & uistate.apoverride, AP_END); GeomDice(dg->Item, dg->bezdice, dg->bezdice); normalize(dg, dg->normalization); } static void update_view(DView *v) { v->seqno++; if(v->Item != drawerstate.universe) GeomHandleScan(v->Item, object_register, v); CamHandleScan(v->cam, object_register, v); } static void normalize(DGeom *dg, int normalization) { float cx,cy,cz,cs,r,dx,dy,dz; HPoint3 min,max; Geom *bbox = NULL; Transform tmp; dg->normalization = normalization; if(dg->id == WORLDGEOM) return; switch(normalization) { case NONE: GeomTransformTo(dg->Inorm, NULL, NULL); break; case EACH: case ALL: if (!dg->bboxvalid) { drawer_make_bbox(dg, normalization == ALL); } GeomGet(dg->Lbbox, CR_GEOM, &bbox); if (bbox != NULL) { BBoxMinMax((BBox*)bbox, &min, &max); cx = (max.x + min.x) * .5; cy = (max.y + min.y) * .5; cz = (max.z + min.z) * .5; dx = max.x - min.x; dy = max.y - min.y; dz = max.z - min.z; r = sqrt(dx*dx + dy*dy + dz*dz); cs = (r == 0) ? 1 : 2.0/r; TmScale(tmp,cs,cs,cs); CtmTranslate(tmp,-cx,-cy,-cz); GeomTransformTo(dg->Inorm, tmp, NULL); } break; /* case KEEP: Leave normalization transform alone */ } dg->redraw = true; } void drawer_nuke_world() { gv_delete( ALLGEOMS ); } void drawer_nuke_cameras(int keepzero) { int i,i0; i0 = keepzero ? 1 : 0; for (i=i0; i", name, i++); } while(fsa_parse(name_fsa, newname) != NOID); return strdup(newname); } #ifdef MANIFOLD int drawer_read_manifold(char *file) { FILE *fp = fopen(file, "rb"); int i,n; setlinebuf(stderr); if (fp == NULL) return 0; n = fgetni(fp, 1, &(drawerstate.nMT), 0); if (n != 1) { OOGLError(0,"%1d", n); return 0; } if (verbose_manifold) fprintf(stderr, "mfd: nMT = %1d\n", drawerstate.nMT); n = fgettransform(fp, drawerstate.nMT, (float*)(drawerstate.MT), 0); if (n != drawerstate.nMT) { OOGLError(0,"%1d", n); return 0; } if (verbose_manifold) { fprintf(stderr, "mfd: MT[] = "); fputtransform(stderr, drawerstate.nMT, (float*)(drawerstate.MT), 0); } n = fgetni(fp, 1, &(drawerstate.nDV), 0); if (n != 1) { OOGLError(0,"%1d", n); return 0; } if (verbose_manifold) { fprintf(stderr, "mfd: nDV = %1d\n", drawerstate.nDV); } n = fgetnf(fp, drawerstate.nDV*4, (float*)(drawerstate.DV), 0); if (n != drawerstate.nDV*4) { OOGLError(0,"%1d", n); return 0; } if (verbose_manifold) { fprintf(stderr, "mfd: DV[] = "); for (i=0; iNDC transform * v: list of vertices of polyhedron * n: number of vertices in list v * Returns: 0 or 1 * Author: mbp * Date: Thu Aug 6 13:43:02 1992 * Notes: Uses an axial bounding box test: is any part of the * the axial bounding box of the projections of the * vertices v visible? This is guaranteed to accept all * visible polyhedra, and may accept some invisible ones * too. */ int visible(Transform T, HPoint3 *v, int n) { #define MIN -2 #define MAX 2 float x,y,z; float xmin = MAX, xmax = MIN, ymin = MAX, ymax = MIN, zmin = MAX, zmax = MIN; int i; Point3 pv; if (trivial_visibility) return 1; for (i=0; i xmax) xmax = pv.x; if (pv.y < ymin) ymin = pv.y; else if (pv.y > ymax) ymax = pv.y; if (pv.z < zmin) zmin = pv.z; else if (pv.z > zmax) zmax = pv.z; } #if 0 printf("x: [%f\t, %f]\n", xmin, xmax); printf("y: [%f\t, %f]\n", ymin, ymax); printf("z: [%f\t, %f]\n", zmin, zmax); #endif /* if entire polyhedron is outside clipping region, reject */ if (zmax <= -1 || zmin >= 1) return 0; if (xmax <= -1 || xmin >= 1) return 0; if (ymax <= -1 || ymin >= 1) return 0; /* otherwise accept */ return 1; #undef MAX #undef MIN } float intensity(float d, float d1, float i1) { float val, d12; d12 = d1*d1; val = i1 * d12 / ( (1 - i1)*d*d + i1*d12 ); return val; } #endif /* MANIFOLD */ static HModelValue hmodelval(char *s, int val) { switch (val) { case VIRTUAL_KEYWORD: return VIRTUAL; case PROJECTIVE_KEYWORD: return PROJECTIVE; case CONFORMALBALL_KEYWORD: return CONFORMALBALL; default: fprintf(stderr, "%s: invalid model keyword (assuming \"virtual\")\n",s); return VIRTUAL; } } Keyword hmodelkeyword(char *s, HModelValue val) { switch (val) { case VIRTUAL: return VIRTUAL_KEYWORD; case PROJECTIVE: return PROJECTIVE_KEYWORD; case CONFORMALBALL: return CONFORMALBALL_KEYWORD; default: fprintf(stderr, "%s: invalid model (assuming \"virtual\")\n",s); return VIRTUAL_KEYWORD; } } static int normalval(char *s, int val) { switch (val) { case NONE_KEYWORD: return NONE; case EACH_KEYWORD: return EACH; case KEEP_KEYWORD: return KEEP; case ALL_KEYWORD: return ALL; default: fprintf(stderr, "%s: invalid normalization type (assuming \"none\")\n",s); return NONE; } } /*----------------------------------------------------------------------- * Function: spaceof * Description: return the space of an object * Args: id: the object * Returns: TM_EUCLIDEAN, TM_HYPERBOLIC, or TM_SPHERICAL * Author: mbp * Date: Sun Dec 13 22:28:58 1992 * Notes: We need to be able to tell what space an object is in, * in order to know what kinds of transformations to * apply to it (any maybe for other reasons, e.g. * shading). OOGL cameras know about what space they're * in. OOGL geoms do not (at this time, anyway). The * main rationale for this is that the concept of "space" * applies to a whole tree of geoms; every geom in the * tree is in the same space. The way geomview currently * deals with this is to use "drawerstate.space" to hold * the space designation for the world. All * space-sensitive procedures should check the space of * an id by calling spaceof(), however, rather than * referencing drawerstate.space directly. This is * because at some point we may generalize to having more * than one world or some other mechanism for keeping * track of what space things are in. */ int spaceof(int id) { DView *dv; int space; if (ISCAM(id)) { dv = (DView*)drawer_get_object(id); if (dv == NULL) { OOGLError(0,"spaceof: unknown camera id %1d (assuming TM_EUCLIDEAN)\n", id); return TM_EUCLIDEAN; } CamGet(dv->cam, CAM_SPACE, &space); return space; } return drawerstate.space; } static int spaceval(char *s, int val) { switch (val) { case EUCLIDEAN_KEYWORD: return TM_EUCLIDEAN; case HYPERBOLIC_KEYWORD: return TM_HYPERBOLIC; case SPHERICAL_KEYWORD: return TM_SPHERICAL; default: fprintf(stderr, "%s: invalid space keyword (assuming \"euclidean\")\n",s); return EUCLIDEAN; } } /*----------------------------------------------------------------------- * Function: scaleof * Description: return a number indicating the scale of an object * Args: id: the object * Returns: the scale number * Author: mbp * Date: Thu Feb 11 11:10:19 1993 */ float scaleof(int id) { float scale = 1.0; if (ISCAM(id)) { DView *dv; dv = (DView*)drawer_get_object(id); if (dv == NULL) { OOGLError(0,"scaleof: unknown camera id %1d (returning scale = 1)\n", id); } else { /* for cameras return the focal length */ CamGet(dv->cam, CAM_FOCUS, &scale); } } else { DGeom *dg; HPoint3 min, max; BBox *bbox; dg = (DGeom*)drawer_get_object(id); if (dg == NULL) { OOGLError(0,"scaleof: unknown geom id %1d (returning scale = 1)\n", id); } else { /* for geoms return (geometric mean of 1 + bbox side lengths) - 1*/ GeomGet(dg->Lbbox, CR_GEOM, &bbox); if (bbox != NULL) { BBoxMinMax((BBox*)bbox, &min, &max); scale = pow( fabs((double)((max.x-min.x+1) *(max.y-min.y+1) *(max.z-min.z+1))), .333 ) - 1; } } } return scale; } LDEFINE(set_motionscale, LVOID, "(set-motionscale X)\n\ Set the motion scale factor to X (default value 0.5). These\n\ commands scale their motion by an amount which depends on the\n\ distance from the frame to the center and on the size of the\n\ frame. Specifically, they scale by\n\ dist + scaleof(frame) * motionscale\n\ where dist is the distance from the center to the frame and\n\ motionscale is the motion scale factor set by this function.\n\ Scaleof(frame) measures the size of the frame object.") { float scale; LDECLARE(("set-motionscale", LBEGIN, LFLOAT, &scale, LEND)); drawerstate.motionscale = scale; return Lt; } LDEFINE(set_conformal_refine, LVOID, "(set-conformal-refine CMX [N [SHOWEDGES]])\n\ Sets the parameters for the refinement algorithm used in drawing\n\ in the conformal model. CMX is the cosine of the maximum angle\n\ an edge can bend before it is refined. Its value should be between\n\ -1 and 1; the default is 0.95; decreasing its value will cause less\n\ refinement. N is the maximum number of iterations of refining;\n\ the default is 6. SHOWEDGES, which should be \"no\" or \"yes\",\n\ determines whether interior edges in the refinement are drawn.") { float cmb; int maxsteps = -1; int showedges = -1; extern void set_cm_refine(double cm_cmb, int cm_mr, int cm_ss); LDECLARE(("set-conformal-refine", LBEGIN, LFLOAT, &cmb, LOPTIONAL, LINT, &maxsteps, LKEYWORD, &showedges, LEND)); set_cm_refine((double)cmb,maxsteps,showedges); return Lt; } static void traverse(Pool *p, Geom *where, int *pickpath, int *curpath, int *curbase, int pn) { Geom *new; char *name; int depth; if (!where) return; name = GeomName(where); if (!strcmp(name, "comment")) { /* check if our current path matches the pickpath decrement the depth since we don't match the last level */ depth = curpath - curbase -1; while (depth >= 0){ if (curbase[depth] != pickpath[depth]) break; if (depth == 0) { /* we're set */ fprintf(PoolOutputFile(p), "{"); CommentExport((Comment*)where, p); fprintf(PoolOutputFile(p), "}"); } depth--; } } else if (!strcmp(name, "list")) { /* push down a level */ curpath++; while (where) { /* traverse the list. the cdr of a list is a list, but don't descend another level */ GeomGet(where, CR_CAR, &new); if (new) { (*curpath)++; traverse(p, new, pickpath, curpath, curbase, pn); } GeomGet(where, CR_CDR, &where); } /* pop up a level */ *curpath = -1; curpath--; } else if (!strcmp(name, "inst")) { GeomGet(where, CR_GEOM, &new); if (new) { /* push down a level */ curpath++; (*curpath)++; traverse(p, new, pickpath, curpath, curbase, pn); /* pop up a level */ *curpath = -1; curpath--; } } } #if 0 static void drawer_write_comments(char *fname, int id, int *pickpath, int pn) { } #endif LDEFINE(write_comments, LVOID, "(write-comments FILENAME GEOMID PICKPATH)\n\ write OOGL COMMENT objects in the GEOMID hierarchy at the\n\ level of the pick path to FILENAME. Specifically, COMMENTS\n\ at level (a b c ... f g) will match pick paths of the form\n\ (a b c ... f *) where * includes any value of g, and also\n\ any values of possible further indices h,i,j, etc. The pick\n\ path (returned in the \"pick\" command) is a list of\n\ integer counters specifying a subpart of a hierarchical\n\ OOGL object. Descent into a complex object (LIST or INST)\n\ adds a new integer to the path. Traversal of simple objects\n\ increments the counter at the current level.\n\ Individual COMMENTS are enclosed by curly braces, and the\n\ entire string of zero, one, or more COMMENTS (written in\n\ the order in which they are encountered during hierarchy\n\ traversal) is enclosed by parentheses.\n\ \n\ Note that arbitrary data can only be passed through the OOGL\n\ libraries as full-fledged OOGL COMMENT objects, which can be\n\ attached to other OOGL objects via the LIST type as described\n\ above. Ordinary comments in OOGL files (i.e. everything after\n\ '#' on a line) are ignored at when the file is loaded and\n\ cannot be returned.") { int id; int pickpath[40]; int pn = 40; char *fname; Pool *p, *op; Geom *where; int count; bool temppool = false; int curpath[40]; Lake *brownie; LDECLARE(("write-comments", LBEGIN, LLAKE, &brownie, LSTRING, &fname, LID, &id, LHOLD, LARRAY, LINT, pickpath, &pn, LEND)); /* The Lake is a dummy argument that gives us access to the right output file pointer */ p = POOL(brownie); if (fname[0] == '-') { if (PoolOutputFile(p)) { op = p; } else { op = PoolStreamTemp(fname, NULL, stdout, 1, &GeomOps); temppool = true; } } else { op = PoolStreamTemp(fname, NULL, NULL, 1, &GeomOps); temppool = true; } if(op == NULL || PoolOutputFile(op) == NULL) { fprintf(stderr, "write: cannot open \"%s\": %s\n", fname, sperror()); return Lnil; } for (count=0; count < 40; count++) { curpath[count] = -1; } /* get to the right starting place */ GeomGet(((DGeom *)drawer_get_object(id))->Lgeom, CR_GEOM, &where); fprintf(PoolOutputFile(op), "( "); traverse(op,where,pickpath,curpath-1,curpath,pn); fprintf(PoolOutputFile(op), ")\n"); fflush(PoolOutputFile(op)); if (temppool) { PoolClose(op); PoolDelete(op); } return Lt; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/drawer.h0000644000175000001440000003723110624132101016366 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _DRAWER_H_ #define _DRAWER_H_ #include "common.h" #include "transformn.h" #include "pick.h" #include "mg.h" /* N-D color maps */ typedef struct cent { /* Colormap entry */ float v; /* projection value */ ColorA c; /* color */ int interp; /* interpolate values between cmap points */ } cent; typedef struct cmap { /* Colormap table */ HPointN *axis; /* projection axis */ vvec cents; /* colormap; entries are 'cent's */ int coords; /* ID of axis' coordinate system; default UNIVERSE */ } cmap; #define MAXCMAP 4 typedef struct NDstuff { mgNDctx mgNDctx; TransformN *W2C; /* World-to-Camera transform */ TransformN *T; /* object-to-ND-camera transform, including * the projection to the lower-dimensional * sub-space. */ #if 0 Transform MGFactor; /* 4x4 transform handed over to the mg layer */ TransformN *rest; /* remaining (Nd-4) lines, contained in the * rows (4..Nd) */ int *perm; /* permuation on the rows of T */ #endif TransformN *W2c; /* Universe-to-Color transform */ TransformN *Tc; /* object-to-coloring-space-transform */ int ncm; /* number of colormaps */ cmap *cm; /* colormap array */ HPointN *hc; /* work area for color projections */ } NDstuff; #define OBJECTFIELDS \ char *name[2]; /* array of names */ \ Geom *Item; /* For Geoms, the Inst holding the \ * modelling transform; for DViews, \ * an Inst pointing to the scene. \ * In all cases this Inst holds any \ * relevant Appearance. \ */ \ PFI updateproc; /* motion update procedure */ \ Handle *incrhandle; /* Handle to above */ \ Transform Incr; /* xform per frame update, if no updateproc */ \ int id; /* my id */ \ int seqno; /* sequence no for keeping track of changes */ \ bool redraw; /* object needs redrawing */ \ bool moving; /* moving -> Incr != identity || updateproc != NULL */ \ unsigned changed /* Something about this obj changed; redraw */ /* flags for the "changed" field */ #define CH_NOTHING 0 #define CH_GEOMETRY 1 #define CH_TRANSFORM 2 typedef struct DObject { OBJECTFIELDS; } DObject; typedef struct DGeom { OBJECTFIELDS; Geom *Inorm; /* Inst holding normalization transform */ Geom *Lgeom; /* List node holding pointer to user's Geom */ Geom *Lbbox; /* List node holding pointer to our Bbox */ bool bboxdraw; /* boolean */ char normalization; /* Normalization: NONE, EACH, or ALL */ bool bboxvalid; /* bbox is valid */ bool pickable; /* Is this Dgeom pickable ? */ int bezdice; /* Meshsize for diced up bezier patch */ Appearance *bboxap; enum citizenship {ORDINARY, THEWORLD, ALIEN} citizenship; TransformN *NDT, *NDTinv; /* N-D transform and its inverse; NULL for 3-D objects */ /* Ordinary DGeoms are subgeoms of Theworld DGeom. * Theworld is the single DGeom containing the world transforms * and all ordinary DGeoms. * Alien DGeoms are in the Universe list but are not part of Theworld. */ } DGeom; /* models of hyperbolic space; these must start with 0 and be consecutive because they are used as indices in the browser */ typedef enum { VIRTUAL=0, PROJECTIVE, CONFORMALBALL } HModelValue; typedef struct DView { OBJECTFIELDS; Camera *cam; /* The camera itself */ Handle *camhandle; /* Handle to above */ WnWindow *win; /* The (abstract) window */ unsigned frozen; /* flag: frozen: Don't attempt to redraw this view */ bool newcam; /* flag: need to mgreshapeviewport() */ mgcontext *mgctx; /* Window's mg context pointer */ int apseq; /* seq no: has global default changed? */ float lineznudge; /* millionths of Z-range by which lines lie closer * than surfaces */ Color backcolor; /* Window background color */ bool cameradraw; /* Do we draw cameras in this view? */ Geom *hsphere; /* hsphere at infy for use in hyp mode; when NULL don't draw it, otherwise draw it */ HModelValue hmodel; /* model of hyperbollic space for this camera; value is one of VIRTUAL, PROJECTIVE, CONFORMAL, and is meaningful only when viewing hyperbolic geometry */ PFV extradraw; /* function to draw any extra stuff in this window */ Keyword stereo; /* {NO,HORIZONTAL,VERTICAL}_KEYWORD: stereo style */ int stereogap; /* gap between subwindows in stereo mode */ WnPosition vp[2]; /* Subwindow viewports, if stereo != MONO */ mgshadefunc shader; /* Software shader function (NULL -> hardware) */ int NDPerm[4]; /* N-D -> 3-D axis permutation */ int nNDcmap; cmap NDcmap[MAXCMAP]; /* N-D color map */ struct NDcam *cluster;/* to which cluster do we belong? NULL if not N-D */ } DView; /* flags for "frozen" */ #define UNFROZEN 0 #define SOFT_FROZEN 1 #define HARD_FROZEN 2 typedef struct NDcam { char *name; /* camera-cluster name */ TransformN *C2W, *W2C; /* N-D camera-to-universe transform */ struct NDcam *next; /* next N-D camera */ } NDcam; /* * The array of DGeoms is a flat structure with pointers into the * following OOGL hierarchy: * * * drawerstate.universe --> LIST -------- LIST --- LIST... [rest of Aliens] * | | | * | INST INST * | [Alien] [Alien] * | * drawerstate.world == dgeom[0]: * | * dgeom[0]->Item --> INST [world modelling xform] * [Theworld] * | * dgeom[0]->Inorm --> INST [world normalizing xform] * | * dgeom[0]->Lgeom --> LIST ----- LIST --- ... [all ordinary DGeoms] * [Ordinary] [Ordinary] * | * DGeom[x]: * | * INST (= Item) [modelling xform, appearance] * | * | * INST (= Inorm) [normalization xform] * | * | * LIST (= Lgeom) -------- LIST (= Lbbox) * | | * [user's Geom] [BBox of user's Geom, or NULL] * * Note that the world appearance is *not* dgeom[0]->Item->ap, which * is always NULL. * Changes to the world appearance are broadcast to all individual dgeoms. * worldap is kept around in drawer.c to let the ui know how to * set control panels when the world is the target. */ typedef struct DrawerState { int pause; /* hiatus on emodule input? */ float lastupdate; /* Time (seconds since program began) of last xfm update */ DView defview; /* default DView */ WnPosition winpos; /* screen position of current mg context's window */ int normalization; /* NONE, EACH, KEEP, or ALL (default EACH) */ int space; /* TM_EUCLIDEAN, TM_HYPERBOLIC, TM_SPHERICAL (default EUC) */ int changed; /* Flag: geom or camera or something changed, * must redraw. */ Appearance * ap; /* Default appearance: backstop + .v.ap */ int apseq; /* Sequence number of default appearance; * each drawer mg context should reexamine ap * if drawerstate.apseq != view->apseq */ Geom * world; /* Everything in the world, including * global modelling xform & appearance. */ Geom * universe; /* List of everything in the universe: * world and aliens. */ int NDim; /* Dimension of all ND items */ NDcam *NDcams; /* List of all ND camera clusters, or NULL */ #ifdef MANIFOLD #define MTMAX 500 #define DVMAX 50 Transform MT[MTMAX];/* manifold transforms */ int nMT; /* number of transforms actually in MT */ HPoint3 DV[DVMAX];/* vertices of manifold Dirichlet domain */ int nDV; /* number of vertices actually in DV */ float d1, i1; #endif float motionscale; /* set by user; used in scaling some (not all) motions */ Geom *camgeom; /* Object used when drawing cameras */ int camproj; /* Apply camera's projection to it? */ /* drawerstate.world is the first node in drawerstate.universe * dgeom[0]->Item == drawerstate.world * dgeom[0]->Inorm is the child of the above * dgeom[0]->Lgeom is the child of dgeom[0]->Inorm */ } DrawerState; /* * LOOPGEOMS(i,dg) loops over all defined geoms; for each defined * geom, int i is the index in the dgeoms array, and DGeom *dg * points to the geom. Usage: * LOOPGEOMS(i,dg) { * < body of loop --- use i and dg as needed > * } * Note we skip dgeom[0], since it's by definition the entire world. */ #define LOOPGEOMS(i,dg) \ for (i=1; icitizenship==cit) ) /* * LOOPVIEWS(i,dv) is like LOOPGEOMS but for views. */ #define LOOPVIEWS(i,dv) \ for (i=0; i * is set correctly on any given pass through the loop > * } */ #define MAYBE_LOOP(id, i, type, objtype, obj) \ for(i = 0; (obj = (objtype *)drawer_next_bcast(id, &i, type)); i++) #define MAYBE_LOOP_ALL(id, i, type, objtype, obj) \ for(i = 0; (obj = (objtype *)drawer_next_object(id, &i, type)); i++) /* * An ID encodes an index (int) and a type (cam or geom). */ #define T_NONE 0 #define T_GEOM 1 #define T_CAM 2 #define T_MAX 3 /* Max T_* value plus one */ #define GEOMID(i) ((i)<<2 | T_GEOM) /* Geometric object #i */ #define CAMID(i) ((i)<<2 | T_CAM) /* Camera #i */ #define NOID ((0)<<2 | T_NONE) #define ID(type,i) ((i)<<2 | type) #define ISGEOM(id) (((id) & 3) == T_GEOM) #define ISCAM(id) (((id) & 3) == T_CAM) #define ISTYPE(type,id) (((id) & 3) == type) #define TYPEOF(id) ((id) & 3) #define INDEXOF(id) ((id) >> 2) #define ALLINDEX -1 #define WORLDGEOM GEOMID(0) #define FOCUSID CAMID(-4) /* these are not necessarily geoms! */ #define TARGETID GEOMID(-5) /* "current target" */ #define CENTERID GEOMID(-8) /* "current center" */ #define TARGETGEOMID GEOMID(-6) /* "current target geom" */ #define TARGETCAMID CAMID(-7) /* "current target cam" */ #define DEFAULTCAMID CAMID(-5) #define SELF GEOMID(-9) /* "this geomview object" */ #define UNIVERSE GEOMID(-10) /* the universe (as coordinate system) */ #define PRIMITIVE GEOMID(-11) /* this picked OOGL primitive (coord system) */ #define ALLCAMS CAMID(ALLINDEX) #define ALLGEOMS GEOMID(ALLINDEX) typedef enum { DRAWER_NOKEYWORD = 1, DRAWER_NEAR, DRAWER_FAR, DRAWER_FOV, DRAWER_FOCALLENGTH, DRAWER_KA, DRAWER_KS, DRAWER_KD, DRAWER_SHININESS, DRAWER_NORMSCALE, DRAWER_LIGHT_INTENSITY, DRAWER_LINE_ZNUDGE, DRAWER_FACEDRAW, DRAWER_EDGEDRAW, DRAWER_VECTDRAW, DRAWER_NORMALDRAW, DRAWER_TEXTUREDRAW, DRAWER_TEXTUREQUAL, DRAWER_SHADELINES, DRAWER_CONCAVE, DRAWER_BACKCULL, DRAWER_SHADING, DRAWER_LINEWIDTH, DRAWER_PERSPECTIVE, DRAWER_EVERT, DRAWER_BBOXDRAW, DRAWER_NORMALIZATION, DRAWER_SAVE, DRAWER_PROJECTION, DRAWER_BEZDICE, DRAWER_CAMERADRAW, DRAWER_PICKABLE, DRAWER_HSPHERE, DRAWER_DOUBLEBUFFER, DRAWER_APOVERRIDE, DRAWER_DIFFUSE, DRAWER_EDGECOLOR, DRAWER_NORMALCOLOR, DRAWER_BBOXCOLOR, DRAWER_BACKCOLOR, DRAWER_LIGHTCOLOR, DRAWER_TRANSPARENT, DRAWER_ALPHA, DRAWER_INERTIA, DRAWER_CONSTRAIN, DRAWER_OWNMOTION } DrawerKeyword; extern DView ** dview; extern DGeom ** dgeom; extern DrawerState drawerstate; extern int dgeom_max; extern int dview_max; extern TransformStruct ts_identity; DObject * drawer_get_object( int id );/* Get DObject * for object 'id' */ DObject * drawer_next_object( int id, int *indexp, int type ); DObject *drawer_next_bcast( int id, int *indexp, int type ); Appearance * drawer_get_ap( int id ); /* Get net appearance for DGeom 'id' */ void drawer_make_bbox(DGeom *dg, bool combine); int drawer_geom_count(); int drawer_cam_count(); int drawer_idbyctx( mgcontext *ctx ); bool drawer_moving(); /* is anything (DGeom, DView) moving? */ int drawer_idbyname(char *name); char *drawer_id2name(int id); int drawer_name2metaid(char *name); int drawer_objok(int id, int type); int drawer_pick( int id, int x, int y, Pick *pick); void drawer_init(char *apdefault, char *camgeometry, char *windefault); void drawer_merge_baseap( ApStruct *as ); void drawer_merge_camera( int id, Camera *cam ); void drawer_merge_window( int id, WnWindow *win ); void drawer_name_object(int id, int ni, char *name); void drawer_updateproc(int id, PFI func); void drawer_center(int id); void drawer_stop(int id); void drawer_pause(int pause); void drawer_set_window(int id, WnWindow *win); void drawer_snap_window(int id, char *fname); void drawer_init_dgeom(DGeom *dg, int id, enum citizenship citizenship); void drawer_nuke_world(); void drawer_nuke_cameras(int keepzero); void drawer_get_transform(int id, Transform T, int cumulative); TransformN *drawer_get_ND_transform(int from_id, int to_id); TransformN *drawer_ND_CamView(DView *dv, TransformN *TN); int drawer_idmatch(int id1, int id2); mgshadefunc softshader(int camid); NDstuff *drawer_init_ndstuff(DView *dv, TransformN *W2C, TransformN *W2U); void drawer_destroy_ndstuff(NDstuff *nds); void drawer_transform_ndstuff(NDstuff *nds, TransformN *T); void drawer_float(int id, DrawerKeyword key, float fval); /* key = DRAWER_NEAR, DRAWER_FAR, DRAWER_KA, DRAWER_KS, DRAWER_KD, DRAWER_SHININESS, DRAWER_NORMSCALE, DRAWER_LIGHT_INTENSITY */ void drawer_int(int id, DrawerKeyword key, int ival); /* key = DRAWER_FACEDRAW, DRAWER_EDGEDRAW, DRAWER_NORMALDRAW, DRAWER_SHADING, DRAWER_LINEWIDTH, DRAWER_PERSPECTIVE, DRAWER_EVERT, DRAWER_BEZDICE, DRAWER_NORMALIZATION, DRAWER_CAMERADRAW */ void drawer_color(int id, DrawerKeyword key, Color *col); /* key = DRAWER_DIFFUSE, DRAWER_EDGECOLOR, DRAWER_NORMALCOLOR, DRAWER_BBOXCOLOR, DRAWER_BACKCOLOR */ float scaleof(int id); int spaceof(int id); extern Keyword hmodelkeyword(char *s, HModelValue val); void drawer_set_ap(int id, Handle *h, Appearance *ap); #ifdef MANIFOLD int drawer_read_manifold(char *file); #endif /* MANIFOLD */ #endif /* ! _DRAWER_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/space.c0000644000175000001440000004357210624131755016213 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include #include "drawer.h" #include "ui.h" #include "lang.h" #include "lisp.h" #include "mg.h" #include "geom.h" #include "vect.h" #include "color.h" #include "camera.h" #include "space.h" #define DGobj(obj) ((DGeom *)obj) #define DVobj(obj) ((DView *)obj) char * spacename(int space) { switch(space) { case TM_SPHERICAL: return "spherical"; case TM_EUCLIDEAN: return "euclidean"; case TM_HYPERBOLIC: return "hyperbolic"; default: return NULL; } } void camera_space_relabel(int id) { DView *dv = (DView *)drawer_get_object(id); char *extra=NULL; char *fmt; char label[256]; if(!ISCAM(id) || dv == NULL || dv->mgctx == NULL) return; mgctxselect(dv->mgctx); extra = keywordname(hmodelkeyword("", dv->hmodel)); switch(spaceof(WORLDGEOM)) { case TM_SPHERICAL: fmt = "%s (spherical %s view)"; break; case TM_HYPERBOLIC: fmt = "%s (hyperbolic %s view)"; break; case TM_EUCLIDEAN: fmt = "%s (Euclidean%s view)"; switch (dv->hmodel) { case VIRTUAL: case PROJECTIVE: extra = ""; break; case CONFORMALBALL: extra = " inverted"; break; } break; default: return; } sprintf(label, fmt, dv->name[1], extra); mgctxset(MG_WnSet, WN_NAME, label, WN_END, MG_END); } /* * Is this a good directory to select in the file browser by default? * Say it is if it contains the 3-char prefix of our space name. */ int our_space_dir(char *dirname) { char *sname, sub[4]; if((sname = spacename(spaceof(WORLDGEOM))) == NULL) return 0; sprintf(sub, "%.3s", sname); return (int)(long)strstr(dirname, sub); } Geom *unitsphere(int n, ColorA *color); #define N 50 Geom * unitsphere(int n, ColorA *color) { int i, j; float si[N+1], ci[N+1], sj[N+1], cj[N+1]; Point3 verts[(N-2 + N)*N]; short vcounts[N-2 + N/2]; short ccounts[N-2 + N/2]; Point3 *p; short *vc; Geom *g; float excess = 1. / cos(M_PI / n); for(i = 0; i <= n; i++) { float t = i * 2*M_PI / n; sj[i] = sin(t) * excess; cj[i] = cos(t) * excess; t = i * M_PI / n; si[i] = sin(t); ci[i] = cos(t); } memset(ccounts, 0, sizeof(ccounts)); ccounts[0] = color ? 1 : 0; /* Construct n-2 parallels */ p = verts; vc = vcounts; for(i = 1; i < n-1; i++) { float y = ci[i]; float r = si[i]; *vc++ = -n; /* Closed line with n vertices */ for(j = 0; j < n; j++) { p->x = r*cj[j]; p->y = y; p->z = r*sj[j]; p++; } } /* Construct n/2 meridians, each a full circle */ for(j = 0; j < n/2; j++) { float s = sj[j]; float c = cj[j]; *vc++ = -2*n; for(i = 0; i < n; i++) { p->x = c*si[i]; p->y = ci[i]; p->z = s*si[i]; p++; } for(i = n; i > 0; i--) { p->x = -c*si[i]; p->y = ci[i]; p->z = -s*si[i]; p++; } } g = GeomCreate("vect", CR_NVECT, n-2 + n/2, CR_VECTC, vcounts, CR_COLRC, ccounts, CR_NVERT, (n-2 + n) * n, CR_POINT, verts, CR_NCOLR, color ? 1 : 0, CR_COLOR, color, CR_END); return g; } void set_hsphere_draw(int id, int draw) { static ColorA color = { .3, .2, .15, .7 }; static Geom *hsphere = NULL; DView *dv; if (!ISCAM(id)) return; dv = (DView*)drawer_get_object(id); if (draw < 0) { /* toggle */ draw = (dv->hsphere == NULL); } if (draw) { if (!hsphere) { hsphere = unitsphere(16, &color); } dv->hsphere = hsphere; } else { dv->hsphere = NULL; } ui_maybe_refresh(id); } NDcam * NDcluster(char *name) { NDcam *c; for(c = drawerstate.NDcams; c != NULL; c = c->next) if(strcmp(c->name, name) == 0) return c; return NULL; } NDcam * NDnewcluster(char *name) { NDcam *c; c = NDcluster(name); if(c == NULL) { c = OOGLNewE(NDcam, "NDcam cluster"); c->name = strdup(name); c->C2W = TmNIdentity(TmNCreate(drawerstate.NDim,drawerstate.NDim,NULL)); c->W2C = NULL; c->next = drawerstate.NDcams; drawerstate.NDcams = c; } return c; } void NDdeletecluster(NDcam *c) { /* Add this someday. Note that there may be other references to this cluster. XXX */ } LDEFINE(ND_axes, LLIST, "(ND-axes CAMID [CLUSTERNAME [Xindex Yindex Zindex [Windex]]])\n\ In our model for N-D viewing (enabled by (dimension)), objects in\n\ N-space are viewed by N-dimensional \"camera clusters\".\n\ Each real camera window belongs to some cluster, and shows &\n\ manipulates a 3-D axis-aligned projected subspace of the N-space seen\n\ by its cluster. Moving one camera in a cluster affects its siblings.\n\ \n The ND-axes command configures all this. It specifies a camera's\n\ cluster membership, and the set of N-space axes which become the\n\ 3-D camera's X, Y, and Z axes. Axes are specified by their indices,\n\ from 1 to N for an N-dimensional space. Cluster CLUSTERNAME is\n\ implicitly created if not previously known.\n\ In principle it is possible to map the homogeneous component\n\ of a conformal 4 point to some other index; this would be done\n\ by specifying 0 for one of Xindex, Yindex or Zindex and giving\n\ Windex some positive value. This is probably not useful because\n\ Geomview does not support non-Euclidean geometries for in higher\n\ dimensions.\n\ \n\ To read a camera's configuration, use \"(echo (ND-axes CAMID))\".\n\ The return value is an array of 4 integers, the last one should\n\ be 0.") { int axes[4]; char *camname, *clustername = NULL; int i, cam; DView *dv; axes[0] = axes[1] = axes[2] = -1; axes[3] = 0; LDECLARE(("ND-axes", LBEGIN, LSTRING, &camname, LOPTIONAL, LSTRING, &clustername, LINT, &axes[0], LINT, &axes[1], LINT, &axes[2], LINT, &axes[3], LEND)); if((cam = drawer_idbyname(camname)) == NOID || (dv = (DView *)drawer_get_object(cam)) == NULL || !ISCAM(dv->id)) { OOGLError(0, "ND-axes: unknown camera %s", camname); return Lnil; } else if(axes[0] < 0) { /* return the current ND configuratino of cam */ LList *l = NULL; if(dv->cluster) { l = LListAppend(NULL, LTOOBJ(LSTRING)(&dv->cluster->name)); for(i = 0; i < 4; i++) l = LListAppend(l, LNew( LINT, &dv->NDPerm[i] )); } return LNew( LLIST, &l ); } else { /* possibly generate a new cluster, or add to an existing * cluster. NOTE: we first reset the camera to its default state. */ NDcam *c = NDnewcluster(clustername); for(i = 0; i < 4; i++) { if (axes[i] < 0) { const char names[4] = { 'X', 'Y', 'Z', 'W' }; OOGLError(1, "ERROR: bogus ND-axes specification (%d %d %d %d), %c-entry " "must not be negative.\n", axes[0], axes[1], axes[2], axes[3], names[i]); return Lnil; } } NDdeletecluster(dv->cluster); /* a no-op yet */ dv->cluster = c; for(i = 0; i < 4; i++) { dv->NDPerm[i] = axes[i]; } CamReset(dv->cam); dv->changed |= CH_GEOMETRY; return Lt; } } static void set_dimension(int d, TransformN **Tp, TransformN **Tinvp) { if(Tinvp) { TmNDelete(*Tinvp); *Tinvp = NULL; } if(Tp == NULL) { return; } if(d == 0) { TmNDelete(*Tp); *Tp = NULL; } else { if(TmNGetSize(*Tp, NULL,NULL) > d) { TmNDelete(*Tp); *Tp = NULL; } *Tp = TmNPad(*Tp, d, d, *Tp); } } LDEFINE(dimension, LLIST, "(dimension [N])\n\ Sets or reads the space dimension for N-dimensional viewing.\n\ (Since calculations are done using homogeneous coordinates,\n\ this means matrices are (N+1)x(N+1).)\n\ With no arguments, returns the current dimension, or 0 if\n\ N-dimensional viewing has not been enabled. Note that N has to be" "at least 4 to enable ND-viewing, otherwise ND-viewing will be" "disabled.") { int i, d = -1; LDECLARE(("dimension", LBEGIN, LOPTIONAL, LINT, &d, LEND)); if (d < 0) { d = drawerstate.NDim-1; if(d < 0) { d = 0; } return LNew(LINT, &d); } else { NDcam *c; if (d < 4) { /* we do not allow low-dimension ND-view */ d = 0; for(i = 0; i < dview_max; i++) { if(dview[i] && dview[i]->cluster) { NDdeletecluster(dview[i]->cluster); dview[i]->cluster = NULL; } } } else { d++; /* Include homogeneous coordinate drawerstate.NDim */ } if(drawerstate.NDim != d) { for(c = drawerstate.NDcams; c != NULL; c = c->next) { set_dimension(d, &c->C2W, &c->W2C); } for(i = 0; i < dview_max; i++) { if(dview[i]) { dview[i]->changed = CH_GEOMETRY; } } for(i = 0; i < dgeom_max; i++) { if(dgeom[i]) { set_dimension(d, &dgeom[i]->NDT, &dgeom[i]->NDTinv); dgeom[i]->bboxvalid = false; dgeom[i]->changed = CH_GEOMETRY; } } drawerstate.changed = true; drawerstate.NDim = d; } } return Lt; } LDEFINE(ND_xform, LTRANSFORMN, "(ND-xform OBJID [ntransform { idim odim ... }]\n" "Concatenate the given ND-transform with the current " "ND-transform of the object (apply the ND-transform to " "object ID, as opposed to simply setting its ND-transform)." "Note that ND-transforms have their homogeneous coordinate at " "index 0, while 3D transform have it at index 3.") { int id; TransformN *T = NULL; TmNStruct *ts = NULL; DObject *obj; NDcam *cl = NULL; LDECLARE(("ND-xform", LBEGIN, LID, &id, LTRANSFORMN, &ts, LEND)); if((obj = drawer_get_object(id)) == NULL || drawerstate.NDim == 0) return Lnil; if(ISGEOM(obj->id)) { T = ((DGeom *)obj)->NDT; } else if(ISCAM(obj->id) && (cl = ((DView *)obj)->cluster)) { T = cl->C2W; } if (!T) { T = REFGET(TransformN, ts->tm); } else { TmNConcat(ts->tm, T, T); } if(ISGEOM(obj->id)) { DGobj(obj)->NDT = T; GeomSet(DGobj(obj)->Item, CR_NDAXIS, DGobj(obj)->NDT, CR_END); obj->changed |= CH_GEOMETRY; } else if(cl != NULL) { cl->C2W = T; drawerstate.changed = true; } TmIdentity(obj->Incr); obj->redraw = true; obj->moving = (obj->updateproc != NULL); return Lt; } LDEFINE(ND_xform_set, LTRANSFORMN, "(ND-xform-set OBJID [ntransform { idim odim ... }])\n\ Sets the N-D transform of the given object.\n\ In dimension N, this is an (N+1)x(N+1) matrix, so in that case\n\ idim and odim are expected to be both equal to (N+1). Note that\n\ all cameras in a camera-cluster have the same N-D transform.\n" "Note that ND-transforms have their homogeneous coordinate at " "index 0, while 3D transform have it at index 3.") { int id; DObject *obj; TmNStruct *ts = NULL; TransformN *T = NULL; NDcam *cl = NULL; LDECLARE(("ND-xform-set", LBEGIN, LID, &id, LOPTIONAL, LTRANSFORMN, &ts, LEND)); if((obj = drawer_get_object(id)) == NULL || drawerstate.NDim == 0) return Lnil; if(ISGEOM(obj->id)) { T = ((DGeom *)obj)->NDT; } else if(ISCAM(obj->id) && (cl = ((DView *)obj)->cluster)) { T = cl->C2W; } /* (ND-xform-set id transformn { ... }) -> set transform */ TmNDelete(T); if(ISGEOM(obj->id)) { ((DGeom *)obj)->NDT = REFGET(TransformN, ts->tm); GeomSet(DGobj(obj)->Item, CR_NDAXIS, DGobj(obj)->NDT, CR_END); obj->changed |= CH_GEOMETRY; } else if(cl != NULL) { cl->C2W = REFGET(TransformN, ts->tm); drawerstate.changed = true; } return Lt; } LDEFINE(ND_xform_get, LTRANSFORMN, "(ND-xform-get ID [from-ID])\n\ Returns the N-D transform of the given object in the coordinate\n\ system of from-ID (default \"universe\"), in the sense\n\ * Transform = " "Note that ND-transforms have their homogeneous coordinate at " "index 0, while 3D transform have it at index 3.") { int from_id; int to_id = UNIVERSE; TmNStruct *ts; TransformN *tm; extern TransformN *drawer_get_ND_transform(int from_id, int to_id); LDECLARE(("ND-xform-get", LBEGIN, LID, &from_id, LOPTIONAL, LID, &to_id, LEND)); if((tm = drawer_get_ND_transform(from_id, to_id)) == NULL) return Lnil; ts = OOGLNewE(TmNStruct, "TmN"); ts->h = NULL; ts->tm = tm; return LNew(LTRANSFORMN, &ts); } LDEFINE(ND_color, LLIST, "(ND-color CAMID [ (( [ID] (x1 x2 x3 ... xN) v r g b a v r g b a ... )\n\ ((x1 ... xN) v r g b a v r g b a ...) ...)] )\n\ Specifies a function, applied to each N-D vertex, which determines the\n\ colors of N-dimensional objects as shown in camera CAMID.\n\ Each coloring function is defined by a vector (in ID's coordinate system)\n\ [x1 x1 ... xN] and by a sequence of value (v)/color(r g b a) tuples,\n\ ordered by increasing v. The inner product v = P.[x] is linearly\n\ interpolated in this table to give a color.\n\ If ID is omitted, the (xi) vector is assumed in universe coordinates.\n\ The ND-color command specifies a list of such functions; each vertex\n\ is colored by their sum (so e.g. green intensity could indicate\n\ projection along one axis while red indicated another.\n\ An empty list, as in (ND-color CAMID ()), suppresses coloring.\n\ With no second argument, (ND-color CAMID) returns that camera's\n\ color-function list.\n\ Even when coloring is enabled, objects tagged with the \"keepcolor\"\n\ appearance attribute are shown in their natural colors.\n") { int i, j, k, id; DView *dv; LList noarg; LList *l = &noarg, *ents; cmap *cm; cent *ce; char *err; int nents, nfields, ncolors; LDECLARE(("ND-color", LBEGIN, LID, &id, LOPTIONAL, LLITERAL, LLIST, &l, LEND)); if((dv = (DView *)drawer_get_object(id)) == NULL || !ISCAM(dv->id)) { OOGLError(0, "ND-color: expected camera name"); return Lnil; } if(l == &noarg) { ents = NULL; cm = dv->NDcmap; for(i = 0; i < dv->nNDcmap; i++, cm++) { DObject *dobj = drawer_get_object(cm->coords); char *dname = (dobj && dobj->name[1]) ? dobj->name[1] : "universe"; dname = strdup(dname); l = LListAppend(NULL, LNew(LSTRING, (char *)&dname)); l = LListAppend(l, LMakeArray(LFLOAT, (char *)(cm->axis->v+1), cm->axis->dim-1)); for(k = VVCOUNT(cm->cents), ce = VVEC(cm->cents, cent); --k > 0; ce++) { l = LListAppend(l, LNew(LFLOAT, (char *)&ce->v)); l = LListAppend(l, LNew(LFLOAT, (char *)&ce->c.r)); l = LListAppend(l, LNew(LFLOAT, (char *)&ce->c.g)); l = LListAppend(l, LNew(LFLOAT, (char *)&ce->c.b)); l = LListAppend(l, LNew(LFLOAT, (char *)&ce->c.a)); } ents = LListAppend(ents, LNew(LLIST, &l)); } return LNew(LLIST, &ents); } ents = l; nents = LListLength(ents); if(nents > MAXCMAP) { OOGLError(0, "Only %d colormaps allowed per camera; using first %d of %d", MAXCMAP, MAXCMAP, nents); nents = MAXCMAP; } cm = dv->NDcmap; for(i = 1; i <= nents; i++, cm++) { LObject *ent = LListEntry(ents, i); LList *entlist, *axis; int dim; /* * Each component of the 'ents' list looks like: * LLIST --- v0,r0,g0,b0,a0, v1,r1,g1,b1,a1, ... * x1,x2,x3,... */ if(! LFROMOBJ(LLIST)(ent, &entlist)) { err = "ND-color: expected list of lists"; goto no; } cm->coords = UNIVERSE; if( entlist->car->type == LSTRING ) { cm->coords = drawer_idbyname(LSTRINGVAL(entlist->car)); if(cm->coords == NOID) { OOGLError(0, "ND-color: unknown coordinate system %s, using 'universe'", LSTRINGVAL(entlist->car)); cm->coords = UNIVERSE; } entlist = entlist->cdr; } if(! LFROMOBJ(LLIST)(entlist->car, &axis)) { err = "ND-color: expected N-D projection axis"; goto no; } dim = LListLength(axis); cm->axis = cm->axis ? HPtNPad(cm->axis, dim + 1, cm->axis) : HPtNCreate(dim+1, NULL); /* The projection axis is a vector, so its homogeneous component is zero */ cm->axis->v[0] = 0; /* Extract the real components */ for(j = 1; j < dim+1; j++) { if(!LFROMOBJ(LFLOAT)(LListEntry(axis, j), &cm->axis->v[j])) { err = "Non-numeric entry in projection axis?"; goto no; } } entlist = entlist->cdr; /* Look at the remainder of the list */ nfields = LListLength(entlist); ncolors = nfields / 5; if(nfields % 5 != 0 || nfields == 0) { err = "Each colormap should contain a multiple of 5 numbers: v0 r0 g0 b0 a0 v1 r1 g1 b1 a1 ..."; goto no; } vvneeds(&cm->cents, ncolors+1); ce = VVEC(cm->cents, cent); for(j = 1; j <= nfields; j += 5, ce++) { ce->interp = 1; if(!LFROMOBJ(LFLOAT)(LListEntry(entlist, j), &ce->v) || !LFROMOBJ(LFLOAT)(LListEntry(entlist, j+1), &ce->c.r) || !LFROMOBJ(LFLOAT)(LListEntry(entlist, j+2), &ce->c.g) || !LFROMOBJ(LFLOAT)(LListEntry(entlist, j+3), &ce->c.b) || !LFROMOBJ(LFLOAT)(LListEntry(entlist, j+4), &ce->c.a) ) { err = "Non-numeric entry in colormap?"; goto no; } } VVCOUNT(cm->cents) = ncolors+1; ce = &VVEC(cm->cents, cent)[ncolors]; *ce = ce[-1]; ce->v = 1e20; /* Huge value terminates list */ } dv->nNDcmap = nents; dv->changed |= CH_GEOMETRY; return Lt; no: OOGLError(0, err); return Lnil; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/space.h0000644000175000001440000000231410455700776016214 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ extern char *spacename(int tm_spacecode); extern int our_space_dir(char *dirname); extern void camera_space_relabel(int camid); extern void set_hsphere_draw(int id, int draw); extern void space_set(int id, int new); extern Geom *unitsphere(int n, ColorA *color); geomview-1.9.4/src/bin/geomview/common/event.c0000644000175000001440000011650410624367362016242 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include #include #include #include "mg.h" #include "drawer.h" #include "event.h" #include "lang.h" #include "ui.h" #include "comm.h" #include "pickP.h" #include "transform.h" #include "streampool.h" #include "lights.h" #include "mouse.h" #include "rman.h" #define DOUBLECLICKTIME 333 /* millisecs between double clicks */ EventState estate; /* External motion state */ struct button button; /* Shift, etc. button state */ void emit_pick(int pickedid, Pick *pick); static int view_pick( DView *dv, int x, int y, Pick *pick ); #define ESC '\033' struct num { int has; /* 0 if no number, or -1 (negative) or +1 (positive) */ int val; int expon; } number, onum; static int keyshorts = 1; static int pickon = 1; static int prefixid = NOID; static float getreal(float defaultvalue); static int getint(int defaultvalue); /*static int toggle(int val);*/ static void tog_ap_flag(int id, int flagbit); static int retarget(int defaultid); #define SEQ(prefix, ch) ((prefix)<<8 | (ch)) static enum { KEYGEOM=0, KEYCAM=1, KEYNONE=2 } keymode = KEYNONE; static int prefix = 0; static char Help[] = "\ Keyboard commands apply while cursor is in any graphics window and most \n\ control panels. Most commands allow one of the following selection prefixes \n\ (if none is provided the command applies to the current object): \n\ g world geom g# #'th geom g* All geoms\n\ c current camera c# #'th camera c* All cameras\n\ Many allow a numeric prefix: if none they toggle or reset current value.\n\ Appearance:\n\ Draw: Shading: Other:\n\ af Faces 0as Constant av eVert normals: always face viewer\n\ ae Edges 1as Flat #aw Line Width (pixels)\n\ an Normals 2as Smooth #ac edges Closer than faces(try 5-100)\n\ ab Bounding Boxes 3as Smooth, non-lighted al Shade lines\n\ aV Vectors aT allow transparency at Texture-mapping\n\ Color: aC allow concave polygons aq Texture quality\n\ Cf Ce Cn Cb CB face/edge/normal/bbox/backgnd\n\ Motions: Viewing:\n\ r rotate [ Leftmouse=X-Y plane, 0vp Orthographic view\n" #ifdef NeXT " t translate Alt-Left=Z axis, 1vp Perspective view\n" #else " t translate Middle=Z axis, 1vp Perspective view\n" #endif " z zoom FOV Shift=slow motion, vd Draw other views' cameras\n\ f fly in r/t modes. ] #vv field of View\n\ o orbit [Left=steer, Middle=speed ] #vn near clip distance\n\ s scale #vf far clip distance\n\ w/W recenter/all v+ add new camera\n\ h/H halt/halt all vx cursor on/off\n\ @ select center of motion (e.g. g3@) vb backfacing poly cull on/off\n\ #vl focal length\n\ L Look At object v~ Software shading on/off\n\ show Panel: Pm Pa Pl Po main/appearance/lighting/obscure\n\ Pt Pc PC Pf tools/cameras/Commands/file-browser\n\ Ps P- saving/read commands from tty\n\ Lights: ls le Show lights / Edit Lights\n\ Metric: me mh ms Euclidean Hyperbolic Spherical\n\ Model: mv mp mc Virtual Projective Conformal\n\ Other:\n\ N normalization < Pf load geom/command file\n\ 0N none > Ps save something to file ui motion has inertia\n\ 1N each TV NTSC mode toggle uc constrained (X/Y) motion\n\ 2N all uo motion in Own coord system\n\ Rightmouse-doubleclick pick as current target object\n\ Shift-Rightmouse pick interest (center) point\n" #ifdef NeXT " Alt-Leftmouse is synonym for Rightmouse.\n" #endif ; void print_help() { printf("\n%s", Help); rman_do('?', 0,0); fflush(stdout); } void event_init() { estate.motionproc = NULL; } LDEFINE(event_mode, LVOID, "(event-mode MODESTRING)\n\ Set the mouse event (motion) mode; MODESTRING should be one of\n\ the strings that appears in the motion mode browser (including\n\ the keyboard shortcut, e.g. \"[r] Rotate\").") { static Event ev_enter = { EMODEENTER, 0, 0, 0, 0 }; static Event ev_exit = { EMODEEXIT, 0, 0, 0, 0 }; char *modename; LDECLARE(("event-mode", LBEGIN, LSTRING, &modename, LEND)); if ( estate.motionproc != NULL ) { estate.motionproc(&ev_exit); } estate.motionproc = uistate.modes[uistate.mode_current = ui_mode_index(modename) ]; D1PRINT(("gv_event_mode: estate.motionproc <- %1x\n", estate.motionproc)); ui_event_mode( modename ); if ( estate.motionproc != NULL ) { estate.motionproc(&ev_enter); } return Lt; } /* * Report time elapsed since the epoch (or since the program began if * since == NULL). Possibly remember the current time in "nextepoch". * Time is measured in floating-point seconds. */ float elapsed(float *since, float *nextepoch) { static struct timeval t0 = { 0, 0 }; struct timeval tnow; float now = 0; float sincetime = 0; gettimeofday(&tnow, NULL); if(t0.tv_sec == 0) { t0 = tnow; tnow.tv_usec++; } now = tnow.tv_sec - t0.tv_sec + 1e-6*(tnow.tv_usec - t0.tv_usec); if(since) { if((sincetime = *since) == 0) sincetime = *since = now; } if(nextepoch) *nextepoch = now; return now - sincetime; } LDEFINE(pick_invisible, LVOID, "(pick-invisible [yes|no])\n\ Selects whether picks should be sensitive to objects whose appearance\n\ makes them invisible; default yes.\n\ With no arguments, returns current status.") { Keyword kw = NO_KEYWORD; LDECLARE(("pick-invisible", LBEGIN, LOPTIONAL, LKEYWORD, &kw, LEND)); if(kw < 0) return uistate.pick_invisible ? Lt : Lnil; uistate.pick_invisible = boolval("pick_invisible", kw); return Lt; } LDEFINE(rawevent, LVOID, "(rawevent dev val x y t)\n\ Enter the specified raw event into the event queue. The\n\ arguments directly specify the members of the event structure\n\ used internally by geomview. This is the lowest level event\n\ handler and is not intended for general use.") /* This used to be dispatch_event(). */ { int id; int apfl; DrawerKeyword k; int err = 0; float v; Appearance *ap; DView *dv; DGeom *dg; char *s; Event event; LDECLARE(("rawevent", LBEGIN, LINT, &event.dev, LINT, &event.val, LINT, &event.x, LINT, &event.y, LULONG, &event.t, LEND)); PRINT_EVENT(("in gv_rawevent", &event)); /* * Call the current motion proc, if any. This proc returns 1 if it * used the event, in which case we don't do any further processing. */ D1PRINT(("gv_rawevent: estate.motionproc = %x\n", estate.motionproc)); if ( estate.motionproc != NULL ) { D1PRINT(("gv_rawevent: calling estate.motionproc\n")); if ( estate.motionproc(&event) ) { D1PRINT(("gv_rawevent: returning Lt\n")); return Lt; } D1PRINT(("gv_rawevent: falling through\n")); } /* The rightmouse and doubleclick is now hardcoded but should be bindable through lang later, through a control mechanism similar to current motionproc stuff */ if (event.dev == ERIGHTMOUSE) { if ((event.val > 0) && pickon) { static unsigned long int lastt = 0; Pick *pick = PickSet(NULL, PA_WANT, uistate.pick_invisible ? PW_EDGE|PW_VERT|PW_FACE : PW_VISIBLE|PW_EDGE|PW_VERT|PW_FACE, PA_END); int pickedid = view_pick( (DView *)drawer_get_object(FOCUSID), event.x, event.y, pick ); if(button.shift) { /* Could change FOCUSID here to ALLCAMS, * to force setting everyone's focal length to * their distance from the pick. */ if(pickedid != NOID) make_center_from_pick("CENTER", pick, FOCUSID); else gv_ui_center(TARGETID); } else { if(pickedid != NOID) emit_pick(pickedid, pick); if (event.t - lastt < DOUBLECLICKTIME) { lastt = 0; gv_ui_target( pickedid!=NOID ? pickedid : WORLDGEOM, IMMEDIATE ); } } PickDelete(pick); lastt = event.t; } } if(!isascii(event.dev)) return Lt; if (!keyshorts) /* are keyboard shortcuts on? :-) */ return Lt; /* no? then we don't want to process them... */ /* Only keyboard events from here on down */ ui_keyboard(event.dev); if(event.dev >= '0' && event.dev <= '9') { if(!number.has) { number.val = 0; number.has = 1; } number.val = 10*number.val + (event.dev - '0'); if(number.expon) number.expon++; prefix = 0; } else { id = GEOMID(uistate.targetgeom); rescan: switch(SEQ(prefix, event.dev)) { case '-': case '*': number.has = -1; number.expon = 0; number.val = 0; prefix = 0; goto keepmode; case '.': number.expon = 1; prefix = 0; goto keepmode; case 'g': keymode = KEYGEOM; goto gotmode; /* Select geom: 'g' prefix */ case 'c': keymode = KEYCAM; goto gotmode; /* Select camera: 'c' prefix */ gotmode: onum = number; number.has = 0; prefix = 0; goto keepmode; case 'p': { int id; if (pickon) { if (keymode == KEYNONE) { id = gv_rawpick(FOCUSID, event.x, event.y); if (id == NOID) id = WORLDGEOM; } else { id = retarget(NOID); } gv_ui_target(id, IMMEDIATE); } } case '@': gv_ui_center(retarget(uistate.centerid)); break; case 'N': id = retarget(GEOMID(uistate.targetgeom)); if(!number.has) { dg = (DGeom *)drawer_get_object(id); if(dg) number.val = dg->normalization == NONE ? EACH : NONE; } drawer_int(id, DRAWER_NORMALIZATION, number.val); break; case '<': s = "Load"; number.val = 1; goto pickpanel; /* Load file */ case '>': s = "Save"; number.val = 1; goto pickpanel; /* Save State */ /* use bounding box center as CENTER position */ case 'B': gv_ui_center_origin(uistate.bbox_center ? ORIGIN_KEYWORD : BBOX_CENTER_KEYWORD); break; /* Halt current object */ case 'h': drawer_stop(retarget(uistate.targetid)); break; case 'H': /* Halt Everything */ drawer_stop(NOID); break; case 'w': /* Recenter current thing */ drawer_center(retarget(uistate.targetid)); break; case 'W': /* Recenter (and halt) Everything */ drawer_center(NOID); break; case 'L': gv_look(retarget(uistate.targetid),FOCUSID); break; /* * r/t/z/f/o apply to the currently selected object unless target specified. */ case 'f': s = OBJFLY; goto mote; case 'o': s = OBJORBIT; goto mote; case 'r': s = OBJROTATE; goto mote; case 't': s = OBJTRANSLATE; goto mote; case 'z': s = OBJZOOM; goto mote; case 's': s = OBJSCALE; goto mote; mote: id = retarget(NOID); if (k) gv_ui_target( id, IMMEDIATE); gv_event_mode( s ); break; case '?': print_help(); break; #ifdef sgi case 'T': /* NTSC */ #endif case 'v': /* view-related prefix */ case 'a': /* appearance-related prefix */ case 'm': /* metric (euclidean/hyperbolic/spherical) */ case 'l': /* light-related prefix */ case 'd': /* delete */ case 'R': /* renderman */ case 'C': /* color-pick */ case 'P': /* panel show */ case 'u': /* motion style */ case ESC: /* quit prefix */ if(keymode != KEYNONE) { prefixid = retarget(NOID); if(ISGEOM(prefixid)) gv_ui_target( prefixid, IMMEDIATE); } prefix = event.dev; goto keepnumber; case SEQ('P','m'): case SEQ('P','g'): s = "main"; goto pickpanel; case SEQ('P','a'): s = "Appearance"; goto pickpanel; case SEQ('P','o'): s = "Obscure"; goto pickpanel; case SEQ('P','l'): s = "Lighting"; goto pickpanel; case SEQ('P','C'): s = "Command"; goto pickpanel; case SEQ('P','c'): s = "Camera"; goto pickpanel; case SEQ('P','t'): s = "Tools"; goto pickpanel; case SEQ('P','f'): s = "Files"; goto pickpanel; case SEQ('P','s'): s = "Save"; goto pickpanel; case SEQ('P','M'): s = "Materials"; goto pickpanel; case SEQ('P','A'): s = "Credits"; goto pickpanel; pickpanel: ui_showpanel(ui_name2panel(s), getint(-1)); break; case SEQ('P','P'): ui_manual_browser("pdf"); break; case SEQ('P','H'): ui_manual_browser("html"); break; case SEQ('P','-'): comm_object("(read command < -)", &CommandOps, NULL, NULL, COMM_LATER); break; case SEQ(ESC,ESC): gv_exit(); /*NOTREACHED*/ case SEQ('C','f'): k = DRAWER_DIFFUSE; goto pickcolor; case SEQ('C','e'): k = DRAWER_EDGECOLOR; goto pickcolor; case SEQ('C','n'): k = DRAWER_NORMALCOLOR; goto pickcolor; case SEQ('C','b'): k = DRAWER_BBOXCOLOR; goto pickcolor; case SEQ('C','v'): case SEQ('C','B'): k = DRAWER_BACKCOLOR; goto pickcolor; pickcolor: ui_pickcolor( k ); break; case SEQ('u','i'): k = DRAWER_INERTIA; goto motstyle; case SEQ('u','c'): k = DRAWER_CONSTRAIN; goto motstyle; case SEQ('u','o'): k = DRAWER_OWNMOTION; motstyle: drawer_int( WORLDGEOM, k, getint(-1) ); break; case SEQ('v','+'): /* Add camera */ { CameraStruct cs; id = retarget(FOCUSID); dv = ISCAM(id) ? (DView *)drawer_get_object(id) : NULL; cs.h = NULL; cs.cam = dv && dv->cam ? CamCopy(dv->cam, NULL) : NULL; gv_new_camera(NULL, &cs); } break; case SEQ('v','p'): /* Projection: orthographic or perspective */ id = retarget(FOCUSID); if(!number.has) { dv = (DView *)drawer_get_object(id); if(dv) CamGet(dv->cam, CAM_PERSPECTIVE, &number.val); number.val = !number.val; } drawer_int( id, DRAWER_PROJECTION, number.val ); break; case SEQ('v','d'): /* toggle "Draw other cameras" */ id = retarget(FOCUSID); if(!number.has) { dv = (DView *)drawer_get_object(id); number.val = dv ? !dv->cameradraw : true; } drawer_int( id, DRAWER_CAMERADRAW, number.val ); break; case SEQ('v','D'): /* Toggle dithering */ id = retarget(FOCUSID); gv_dither(id, TOGGLE_KEYWORD); break; /* stuff for X11 version */ case SEQ('v','h'): /* pick hidden surface removal method: */ id = retarget(FOCUSID); dv = (DView *)drawer_get_object(id); if(dv == NULL || dv->mgctx == NULL) break; if (!number.has) { mgctxselect(dv->mgctx); mgctxget(MG_DEPTHSORT, &number.val); number.val = (number.val+1) % 3; } mgctxset(MG_DEPTHSORT, number.val>=0&&number.val<=2 ? number.val : 2, MG_END); gv_redraw(dv->id); ui_maybe_refresh(dv->id); break; /* end of stuff for X11 version */ case SEQ('v','x'): /* Toggle/enable/disable cursor */ ui_curson( number.has ? number.val : -1 ); break; case SEQ('v','b'): tog_ap_flag( id, APF_BACKCULL ); break; case SEQ('v','s'): id = retarget(FOCUSID); number.val = !number.val; /* "1vs" => single-buffered */ drawer_int( id, DRAWER_DOUBLEBUFFER, getint(-1) ); break; /* For testing software shading */ case SEQ('v','~'): id = retarget(FOCUSID); gv_soft_shader(id, number.has ? (number.val?ON_KEYWORD:OFF_KEYWORD) : TOGGLE_KEYWORD); break; /* Viewing options */ case SEQ('a','c'): case SEQ('v','c'): k = DRAWER_LINE_ZNUDGE; v = 10.; goto setcam; case SEQ('v','v'): k = DRAWER_FOV; v = 45.; goto setcam; case SEQ('v','n'): k = DRAWER_NEAR; v = .1; goto setcam; case SEQ('v','f'): k = DRAWER_FAR; v = 100.; goto setcam; case SEQ('v','l'): k = DRAWER_FOCALLENGTH; v = 3.; goto setcam; setcam: drawer_float( retarget(FOCUSID), k, getreal(v) ); break; /* Might add others here, e.g. a viewfinder mode. */ /* Metrics / Models */ case SEQ('m','e'): gv_space(EUCLIDEAN_KEYWORD); break; case SEQ('m','h'): gv_space(HYPERBOLIC_KEYWORD); break; case SEQ('m','s'): gv_space(SPHERICAL_KEYWORD); break; case SEQ('m','v'): gv_hmodel(retarget(FOCUSID), VIRTUAL_KEYWORD); break; case SEQ('m','p'): gv_hmodel(retarget(FOCUSID), PROJECTIVE_KEYWORD); break; case SEQ('m','c'): gv_hmodel(retarget(FOCUSID), CONFORMALBALL_KEYWORD); break; /* Appearance settings */ case SEQ('a','f'): apfl = APF_FACEDRAW; goto togapflag; case SEQ('a','e'): apfl = APF_EDGEDRAW; goto togapflag; case SEQ('a','l'): apfl = APF_SHADELINES; goto togapflag; case SEQ('a','n'): apfl = APF_NORMALDRAW; goto togapflag; case SEQ('a','v'): apfl = APF_EVERT; goto togapflag; case SEQ('a','t'): apfl = APF_TEXTURE; goto togapflag; case SEQ('a','T'): apfl = APF_TRANSP; goto togapflag; case SEQ('a','V'): apfl = APF_VECTDRAW; goto togapflag; case SEQ('a','C'): apfl = APF_CONCAVE; goto togapflag; case SEQ('a','q'): apfl = APF_TXMIPMAP|APF_TXMIPINTERP|APF_TXLINEAR; goto togapflag; togapflag: tog_ap_flag( id, apfl ); break; case SEQ('a','x'): drawer_set_ap( id, NULL, NULL ); break; case SEQ('a','o'): gv_ap_override( getint( !uistate.apoverride ) ); break; case SEQ('a','b'): /* Bounding box drawing */ if(!number.has) { DGeom *dg = (DGeom *)drawer_get_object( id ); if(dg) number.val = !dg->bboxdraw; } drawer_int(id, DRAWER_BBOXDRAW, number.val); break; case SEQ('a','s'): /* Shading */ if(!number.has) { ap = drawer_get_ap(id); ApGet(ap, AP_SHADING, &number.val); ApDelete(ap); number.val++; } drawer_int(id, DRAWER_SHADING, number.val % 5); break; case SEQ('a','w'): /* line width */ if(!number.has) { ap = drawer_get_ap(id); ApGet(ap, AP_LINEWIDTH, &number.val); ApDelete(ap); number.val = (number.val > 1) ? 1 : 2; } drawer_int(id, DRAWER_LINEWIDTH, number.val); break; /* Scale normals */ case SEQ('a','h'): drawer_float(id, DRAWER_NORMSCALE, getreal(1.0)); break; /* Patch dicing */ case SEQ('a','d'): drawer_int( id, DRAWER_BEZDICE, number.val ); break; /* hyperbolic sphere at infinity */ case SEQ('a', 'i'): drawer_int( retarget(FOCUSID), DRAWER_HSPHERE, getint(-1) ); break; /* Delete */ case SEQ('d','d'): gv_delete(uistate.targetid); break; /* NTSC */ #ifdef sgi case SEQ('T','V'): ntsc(getint(-1)); break; #endif /* Timing -- ctrl-T * ^T : print accumulated timing status now * ^T : print timing status now and every main-loop cycles * -^T : quit timing */ case 'T'&0x1f: timing( number.has<0 ? 0 : number.has ? number.val : 9999999 ); break; /* Edit Lights */ case SEQ('l','e'): if (!(uistate.lights_shown)) light_edit_mode(1); else gv_event_mode( LIGHTEDIT ); break; /* Toggle Show Lights */ case SEQ('l','s'): light_edit_mode(2); break; /* * All R* commands moved to rman.c - slevy. */ default: err = EOF; if(prefix == 'R') { rman_do(event.dev,number.has,number.val); break; } else if(prefix != 0) { /* No such command? */ prefix = 0; goto rescan; /* Try same char without prefix */ } keymode = KEYNONE; } number.has = number.expon = onum.has = onum.expon = 0; prefix = 0; prefixid = NOID; ui_keyboard(err); /* 0 = OK, EOF = -1 = error */ keepnumber: keymode = KEYNONE; keepmode: ; } return Lt; } /* * Interpret a g[N] or c[N] prefix; return the id. */ static int retarget(int defindex) { int t; static int allid[2] = { ALLGEOMS, ALLCAMS }; static char ch[2] = { 'g', 'c' }; char code[12]; if(keymode == KEYNONE) { if(number.expon && !number.has) { /* a "." prefix, sans number */ number.expon = 0; return TARGETID; } return prefixid != NOID ? prefixid : defindex; /* No prefix, or just numeric */ } sprintf(code, "%c%d", ch[keymode], number.val); if(number.has > 0) t = drawer_idbyname(code); else if(number.has < 0) t = allid[keymode]; else t = (keymode == KEYGEOM) ? WORLDGEOM : FOCUSID; number = onum; onum.has = onum.expon = 0; keymode = KEYNONE; return t; } /* Return current number if any; otherwise return given default value. */ static float getreal(float defval) { float v = number.has * number.val; if(!number.has) return defval; while(--number.expon > 0) v *= 0.1; return v; } static int getint(int defaultvalue) { return number.has ? number.val*number.has : defaultvalue; } #if 0 static int toggle(int val) { return number.has ? (number.has = number.expon = 0, number.val) : !val; } #endif static void tog_ap_flag( int id, int flagbit ) { ApStruct as; int val; memset(&as, 0, sizeof(as)); if(number.has) { val = number.val; } else { as.ap = drawer_get_ap(id); val = as.ap ? !(as.ap->flag & flagbit) : 1; } as.ap = ApCreate(val ? AP_DO : AP_DONT, flagbit, AP_OVERRIDE, uistate.apoverride & flagbit, AP_END); gv_merge_ap(id, &as); ApDelete(as.ap); } /* NB - I've put in a total hack to avoid calling gvpick more than * once - I think it's pretty stable (so when it stays in for years * and years it might(?) keep working!) -cf 10/29/92 */ static int view_pick( DView *dv, int x, int y, Pick *pick ) { Transform V, T, Tnet, Tt, Tmodel, Tnorm, oldTw, Tworld; int i; int chosen = NOID; float xpick, ypick; DGeom *dg; Appearance *ap; WnPosition wp; if(dv == NULL) return NOID; if(dv->stereo == NO_KEYWORD) { wp = drawerstate.winpos; mousemap(x, y, &xpick, &ypick, &wp); } else { /* Map screen -> view position in a stereo window. */ for(i = 0; i < 2; i++) { wp.xmin = drawerstate.winpos.xmin + dv->vp[i].xmin; wp.xmax = wp.xmin + dv->vp[i].xmax - dv->vp[i].xmin; wp.ymin = drawerstate.winpos.ymin + dv->vp[i].ymin; wp.ymax = wp.ymin + dv->vp[i].ymax - dv->vp[i].ymin; mousemap(x, y, &xpick, &ypick, &wp); if(fabs(xpick) <= 1 && fabs(ypick) <= 1) break; } } { /* Hacks for setting up transforms so INST ... location / origin works. * This'll be unnecessary if we switch over to using an mg "pick" device. * slevy 96.10.26. */ Transform Tc2n, Tw2n, Ts2n; CamViewProjection( dv->cam, Tc2n ); CamView( dv->cam, Tw2n ); TmTranslate(Ts2n, -1.0, -1.0, 0.0); CtmScale(Ts2n, 2.0/(wp.xmax-wp.xmin+1), 2.0/(wp.ymax-wp.ymin+1), 1.0); PickSet( pick, PA_TC2N, Tc2n, PA_TW2N, Tw2n, PA_TS2N, Ts2n, PA_END ); } if (drawerstate.NDim > 0) { TransformN *V, *W, *Tnet, *Tmodel, *Tworld; V = drawer_ND_CamView(dv, NULL); if (dv->Item != drawerstate.universe) { /* Picking in a window with a dedicated Scene */ /* We yield results in the Scene's coordinate system */ if (GeomMousePick(dv->Item, pick, (Appearance *)NULL, NULL, V, dv->NDPerm, xpick, ypick)) { chosen = dv->id; } return chosen; } /* Picking in the real world */ Tworld = drawer_get_ND_transform(WORLDGEOM, UNIVERSE); TmNConcat(Tworld, V, V); /* world -> screen */ TmNDelete(Tworld); /* Now V contains the world -> screen projection */ LOOPSOMEGEOMS(i,dg,ORDINARY) { if (dg->pickable) { Geom *g = NULL; int id = GEOMID(i); if (dg->Lgeom) { Tmodel = drawer_get_ND_transform(id, WORLDGEOM); Tnet = TmNConcat(Tmodel, V, NULL); /* Now Tnet geom -> screen */ GeomGet(dg->Lgeom, CR_GEOM, &g); ap = drawer_get_ap(dg->id); if (GeomMousePick(g, pick, ap, NULL, Tnet, dv->NDPerm, xpick, ypick)) { chosen = id; /* Arrange for things to be in world coords not Dgeom coords. */ pick->TwN = TmNConcat(pick->TwN, Tmodel, pick->TwN); W = drawer_get_ND_transform(WORLDGEOM, id); pick->TselfN = TmNConcat(pick->TwN, W, pick->TselfN); TmNDelete(W); } TmNDelete(Tmodel); TmNDelete(Tnet); ApDelete(ap); } } } TmNDelete(V); return chosen; } CamView( dv->cam, V ); /* V = camera-to-screen matrix * cH: wrong. V = universe-to-screen matrix */ if(dv->Item != drawerstate.universe) { /* Picking in a window with a dedicated Scene */ /* We yield results in the Scene's coordinate system */ /* Is this really correct? Why should we call GeomPosition() here? * dv->Item is just a normal geometry, only by chance a * single-element INST. */ #if 0 GeomPosition( dv->Item, T ); TmConcat(T,V, T); /* T = Scene to screen projection */ if(GeomMousePick( dv->Item, pick, (Appearance *)NULL, T, xpick, ypick )) { chosen = dv->id; } #else if (GeomMousePick( dv->Item, pick, (Appearance *)NULL, V, NULL, NULL, xpick, ypick )) { chosen = dv->id; } #endif return chosen; } /* Picking in the real world */ GeomPosition(drawerstate.world, Tworld); /* world -> universe */ TmConcat(Tworld, V, T); /* world -> screen */ /* * We now assume the complete screen -> DGeom transform is in T. * This is true only if we have just a single level of DGeom's in the world. * * cH: this is wrong, T is the World -> screen projection, not the * other way round. (Transforms operate from the right!). */ LOOPSOMEGEOMS(i,dg,ORDINARY) { if (dg->pickable) { Geom *g = NULL; int id = GEOMID(i); if (dg->Lgeom) { GeomPosition( dg->Item, Tmodel ); GeomPosition( dg->Inorm, Tnorm ); TmConcat( Tnorm, Tmodel, Tt ); TmConcat( Tt, T, Tnet ); /* Now Tnet = complete geom-to-screen proj'n */ GeomGet( dg->Lgeom, CR_GEOM, &g ); ap = drawer_get_ap(dg->id); if (GeomMousePick( g, pick, ap, Tnet, NULL, NULL, xpick, ypick )) { chosen = id; /* We remember oldTw to print out info below for debugging only */ TmCopy(pick->Tw, oldTw); /* This is necessary! Arranges for things to be in world * coords not Dgeom coords. Tt is the dgeom-to-world * transform, Tw is (more or less) screen -> dgeom */ TmConcat(pick->Tw, Tt, pick->Tw); drawer_get_transform(WORLDGEOM, pick->Tself, id); TmConcat(pick->Tw, pick->Tself, pick->Tself); } ApDelete(ap); } } } /* Ok, everything below is just debugging stuff */ if (chosen == NOID) { /* printf("Picked nothing.\n"); */ } else { /* printf("Picked dgeom #%d\n", INDEXOF(chosen)); */ /* pick->got is in mouse coords. wgot is world coords. old world is really dgeom coords. (maybe...) got is raw object coords. (the kind of numbers in geom data file!) */ if (pick && getenv("VERBOSE_PICK")) { Point3 got, v, e[2], wgot, wv, we[2], owgot, owv, owe[2]; Pt3Transform(pick->Tmirp, &(pick->got), &got); Pt3Transform(pick->Tw, &(pick->got), &wgot); Pt3Transform(oldTw, &(pick->got), &owgot); printf("pick->\n"); printf(" got = (%f %f %f)\n", pick->got.x, pick->got.y, pick->got.z); if (pick->found&PW_VERT) printf(" v = (%f %f %f)\n", pick->v.x, pick->v.y, pick->v.z); if (pick->found&PW_EDGE) { printf(" e[0] = (%f %f %f)\n", pick->e[0].x, pick->e[0].y, pick->e[0].z); printf(" e[1] = (%f %f %f)\n", pick->e[1].x, pick->e[1].y, pick->e[1].z); } printf("Transformed pick [raw]->\n"); printf(" got = (%f %f %f)\n", got.x, got.y, got.z); if (pick->found&PW_VERT) { HPt3TransPt3(pick->Tmirp, &(pick->v), &v); printf(" v = (%f %f %f)\n", v.x, v.y, v.z); } if (pick->found&PW_EDGE) { HPt3TransPt3(pick->Tmirp, &(pick->e[0]), &(e[0])); HPt3TransPt3(pick->Tmirp, &(pick->e[1]), &(e[1])); printf(" e[0] = (%f %f %f)\n", e[0].x, e[0].y, e[0].z); printf(" e[1] = (%f %f %f)\n", e[1].x, e[1].y, e[1].z); } printf("Transformed pick [old world]->\n"); printf(" got = (%f %f %f)\n", owgot.x, owgot.y, owgot.z); if (pick->found&PW_VERT) { HPt3TransPt3(oldTw, &(pick->v), &owv); printf(" v = (%f %f %f)\n", owv.x, owv.y, owv.z); } if (pick->found&PW_EDGE) { HPt3TransPt3(oldTw, &(pick->e[0]), &(owe[0])); HPt3TransPt3(oldTw, &(pick->e[1]), &(owe[1])); printf(" e[0] = (%f %f %f)\n", owe[0].x, owe[0].y, owe[0].z); printf(" e[1] = (%f %f %f)\n", owe[1].x, owe[1].y, owe[1].z); printf("Transformed pick [world]->\n"); printf(" got = (%f %f %f)\n", wgot.x, wgot.y, wgot.z); if (pick->found&PW_VERT) { HPt3TransPt3(pick->Tw, &(pick->v), &wv); printf(" v = (%f %f %f)\n", wv.x, wv.y, wv.z); } if (pick->found&PW_EDGE) { HPt3TransPt3(pick->Tw, &(pick->e[0]), &(we[0])); HPt3TransPt3(pick->Tw, &(pick->e[1]), &(we[1])); printf(" e[0] = (%f %f %f)\n", we[0].x, we[0].y, we[0].z); printf(" e[1] = (%f %f %f)\n", we[1].x, we[1].y, we[1].z); } } } } return chosen; } LDEFINE(rawpick, LINT, "(rawpick CAMID X Y)\n\ Process a pick event in camera CAMID at location (X,Y) given in\n\ integer pixel coordinates. This is a low-level procedure not\n\ intended for external use.") { int pickedid, id, x, y; Pick *pick; LDECLARE(("rawpick", LBEGIN, LID, &id, LINT, &x, LINT, &y, LEND)); if (TYPEOF(id) != T_CAM) { fprintf(stderr, "rawpick: first arg must be a camera id\n"); return Lnil; } pick = PickSet(NULL, PA_WANT, PW_EDGE|PW_VERT|PW_FACE, PA_END); pickedid= view_pick( (DView *)drawer_get_object(id), x, y, pick ); if (pickedid != NOID) { emit_pick(pickedid, pick); } PickDelete(pick); return LNew(LINT, &pickedid); } void emit_pick(int pickedid, Pick *pick) { /* Variables for total hack */ vvec done; char donebits[512]; LInterest *interest = LInterestList("pick"); VVINIT(done, char, 128); if(interest) { vvuse(&done, donebits, COUNT(donebits)); vvzero(&done); } #define DONEID(id) *VVINDEX(done, char, id-CAMID(-20)) for ( ; interest != NULL; interest = interest->next) { int coordsysid; /* extract the coord system to use from the interest filter; if none given, use world */ if (interest->filter && interest->filter->car && (LFILTERVAL(interest->filter->car)->flag == VAL)) { if (!LFROMOBJ(LID)(LFILTERVAL(interest->filter->car)->value, &coordsysid)) { OOGLError(0,"emit_pick: bad coord sys filter type"); continue; } } else { coordsysid = WORLDGEOM; } if (drawerstate.NDim > 0) { /* In an ND-context, we report the 3d-quantities picked in the * 3d sub-space of the camera where the pick occurred. The * interested parties still have access to the ND-co-ordinates * by means of the vertex/edge/face indices. * * We use TmNMap() to map the 3d vertices to the full Nd-space. */ int dim = drawerstate.NDim; TransformN *T, *tmp; HPointN *got = NULL; HPointN *v = NULL; VARARRAY(e, HPtNCoord, 2*dim); VARARRAY(f, HPtNCoord, pick->found & PW_FACE ? pick->fn * dim : 0); int gn, vn, vi, en, ei[2], ein, fn, fi; /* T = transform converting to the coord system of coordsysid */ /* This section does the setup for the total hack */ /* Total hack gigantic if statement */ if (!DONEID(coordsysid)) { DONEID(coordsysid) = 1; switch(coordsysid) { case WORLDGEOM: T = TmNMap(pick->TwN, pick->axes, NULL); break; case PRIMITIVE: T = TmNMap(pick->TmirpN, pick->axes, NULL); break; case SELF: T = TmNMap(pick->TselfN, pick->axes, NULL); break; default: tmp = drawer_get_ND_transform(WORLDGEOM, coordsysid); T = TmNConcat(pick->TwN, tmp, NULL); TmNDelete(tmp); TmNMap(T, pick->axes, T); break; } if (pickedid != NOID) { HPoint3 gothpt4; Pt3ToHPt3(&pick->got, &gothpt4, 1); got = HPt3NTransform(T, &gothpt4, NULL); gn = got->dim; #if 1 { HPointN *gotn; gotn = HPt3ToHPtN(&gothpt4, pick->axes, NULL); HPtNTransform(pick->TwN, gotn, gotn); HPtNDelete(gotn); } #endif } else { got = NULL; gn = 0; } if (pick->found & PW_VERT) { v = HPt3NTransform(T, &pick->v, NULL); vn = v->dim; vi = pick->vi; } else { v = NULL; vn = 0; vi = -1; } if (pick->found & PW_EDGE) { HPointN tmp; tmp.dim = T->odim; tmp.flags = 0; tmp.v = e+0; HPt3NTransform(T, &pick->e[0], &tmp); tmp.v = e+dim; HPt3NTransform(T, &pick->e[1], &tmp); en = 2*dim; ei[0] = pick->ei[0]; ei[1] = pick->ei[1]; ein = 2; } else { en = 0; ein = 0; } if (pick->found & PW_FACE) { HPointN tmp; int i; tmp.dim = T->odim; tmp.flags = 0; for (i = 0; i < pick->fn; i++) { tmp.v = &f[i*dim]; HPt3NTransform(T, pick->f+i, &tmp); } fi = pick->fi; fn = pick->fn * dim; } else { fn = 0; fi = -1; } /* Cause of total hack. * This CANNOT be called once for every interested party - otherwise * every interested party will hear about it numerous times. */ gv_pick(coordsysid, pickedid, got ? got->v : NULL, gn, v ? v->v : NULL, vn, e, en, f, fn, VVEC(pick->gpath, int), VVCOUNT(pick->gpath), vi, ei, ein, fi); HPtNDelete(got); HPtNDelete(v); TmNDelete(T); } /* End of total hack if statement */ } else { /* T = transform converting to the coord system of coordsysid */ /* This section does the setup for the total hack */ Transform T; float got[4]; HPoint3 v, e[2]; HPoint3 *f; int gn, vn, vi, en, ei[2], ein, fn, fi; /* Total hack gigantic if statement */ if (!DONEID(coordsysid)) { DONEID(coordsysid) = 1; switch(coordsysid) { case WORLDGEOM: TmCopy(pick->Tw, T); break; case PRIMITIVE: TmCopy(pick->Tmirp, T); break; case SELF: TmCopy(pick->Tself, T); break; default: drawer_get_transform(WORLDGEOM, T, coordsysid); TmConcat(pick->Tw, T, T); break; } if (pickedid != NOID) { Pt3Transform(T, &pick->got, (Point3 *)(void *)got); got[3] = 1; gn = 4; } else { gn = 0; } if (pick->found & PW_VERT) { HPt3Transform(T, &(pick->v), &v); vn = 4; vi = pick->vi; } else { vn = 0; vi = -1; } if (pick->found & PW_EDGE) { HPt3TransformN(T, pick->e, &e[0], 2); en = 8; ei[0] = pick->ei[0]; ei[1] = pick->ei[1]; ein = 2; } else { en = 0; ein = 0; } if (pick->found & PW_FACE) { f = OOGLNewNE(HPoint3, pick->fn, "rawpick"); HPt3TransformN(T, pick->f, f, pick->fn); fi = pick->fi; fn = pick->fn * 4; } else { f = NULL; fn = 0; fi = -1; } /* Cause of total hack. * This CANNOT be called once for every interested party - otherwise * every interested party will hear about it numerous times. */ gv_pick(coordsysid, pickedid, got, gn, &v.x, vn, &e[0].x, en, (float *)f, fn, /* f, fn, */ VVEC(pick->gpath, int), VVCOUNT(pick->gpath), vi, ei, ein, fi); if (f != NULL) OOGLFree(f); } /* End of total hack if statement */ } /* End of 3d case */ } vvfree(&done); } LDEFINE(pick, LVOID, "(pick COORDSYS GEOMID G V E F P VI EI FI)\n" "The pick command is executed internally in response to pick\n" "events (right mouse double click).\n" "\n\n" "COORDSYS = coordinate system in which coordinates of the following\n" "arguments are specified. This can be:" "\n\n\tworld: world coord sys" "\n\n\tself: coord sys of the picked geom (GEOMID)" "\n\n\tprimitive: coord sys of the actual primitive within" "\n\n\t\tthe picked geom where the pick occurred." "\n\n\n\n" "GEOMID = id of picked geom" "\n\n\n\n" "G = picked point (actual intersection of pick ray with object)" "\n\n\n\n" "V = picked vertex, if any" "\n\n\n\n" "E = picked edge, if any" "\n\n\n\n" "F = picked face" "\n\n\n\n" "P = path to picked primitive [0 or more]" "\n\n\n\n" "VI = index of picked vertex in primitive" "\n\n\n\n" "EI = list of indices of endpoints of picked edge, if any" "\n\n\n\n" "FI = index of picked face" "\n\n\n\n" "External modules can find out about pick events by registering\n" "interest in calls to \"pick\" via the \"interest\" command." "\n\n\n\n" "In the ND-viewing context the co-ordinates are actually ND-points.\n" "They correspond to the 3D points of the pick relative to the\n" "sub-space defined by the viewport of the camera where the pick\n" "occurred. The co-ordinates are then padded with zeroes and\n" "transformed back to the co-ordinate system defined by\n" "\"COORDSYS\".") { float *got = NULL, *v = NULL, *e = NULL, *f = NULL; int vi, ei[2], fi, *p = NULL; int gn, vn, en, fn, pn; int ein = 2; int id, coordsys; /* NOTE: If you change the lisp syntax of this function (which you shouldn't do), you must also update the DEFPICKFUNC macro in the file "pickfunc.h", which external modules use. */ LDECLARE(("pick", LBEGIN, LID, &coordsys, LID, &id, LHOLD, LVARARRAY, LFLOAT, &got, &gn, LHOLD, LVARARRAY, LFLOAT, &v, &vn, LHOLD, LVARARRAY, LFLOAT, &e, &en, LHOLD, LVARARRAY, LFLOAT, &f, &fn, LHOLD, LVARARRAY, LINT, &p, &pn, LINT, &vi, LHOLD, LARRAY, LINT, ei, &ein, LINT, &fi, LEND)); if (got) OOGLFree(got); if (v) OOGLFree(v); if (e) OOGLFree(e); if (f) OOGLFree(f); if (p) OOGLFree(p); return Lt; } /*****************************************************************************/ LDEFINE(event_keys, LVOID, "(event-keys {on|off})\n\ Turn keyboard events on or off to enable/disable keyboard shortcuts.") { int on; LDECLARE(("event-keys", LBEGIN, LKEYWORD, &on, LEND)); if (on == ON_KEYWORD) keyshorts = 1; else if (on == OFF_KEYWORD) keyshorts = 0; else { OOGLError(0, "event-keys: expected \"on\" or \"off\" keyword"); return Lnil; } return Lt; } /*****************************************************************************/ LDEFINE(event_pick, LVOID, "(event-pick {on|off})\n\ Turn picking on or off.") { int on; LDECLARE(("event-pick", LBEGIN, LKEYWORD, &on, LEND)); if (on == ON_KEYWORD) pickon = 1; else if (on == OFF_KEYWORD) pickon = 0; else { OOGLError(0, "event-pick: expected \"on\" or \"off\" keyword"); return Lnil; } return Lt; } /*****************************************************************************/ LDEFINE(dither, LVOID, "(dither CAM-ID {on|off|toggle})\n\ Turn dithering on or off in that camera.") { DView *dv; int id, dither, i, on = -1; LDECLARE(("dither", LBEGIN, LID, &id, LOPTIONAL, LKEYWORD, &on, LEND)); MAYBE_LOOP(id, i, T_CAM, DView, dv) { if (dv->mgctx) { mgctxselect(dv->mgctx); mgctxget(MG_DITHER, &dither); } if (on == TOGGLE_KEYWORD) dither = !dither; else if (on == ON_KEYWORD) dither = 1; else if (on == OFF_KEYWORD) dither = 0; else { OOGLError(0, "dither: expected \"on\", \"off\" or \"toggle\" keyword"); return Lnil; } if (dv->mgctx) { mgctxset(MG_DITHER, dither, MG_END); gv_redraw(dv->id); } ui_maybe_refresh(dv->id); } return Lt; } /*****************************************************************************/ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/event.h0000644000175000001440000000407510455700776016250 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _EVENT_H #define _EVENT_H #include #include "common.h" typedef struct { PFI motionproc; /* current motion proc */ char *epath; /* pathname of external motion program*/ FILE *efp; Pool *epool; /* stream for communication to extern motion program */ int epid; /* pid of external motion pgm, or 0 if none */ } EventState; extern EventState estate; /* * For keyboard keys, dev number = ascii value * * Other dev number: */ #define ELEFTMOUSE 500 #define EMIDDLEMOUSE 501 #define ERIGHTMOUSE 502 /* * values for mouse events: * 1: button went down * -1: button dragged while down * 0: button went up */ #define EDRAW 503 #define EMODEENTER 504 #define EMODEEXIT 505 #define EPICK 506 #define EUISELECT 507 #define PICKWORLD 0 #define PICKOBJECT 1 /* State of buttons, maintained in event.c and potentially usable by * motion or other modules. */ extern struct button { char shift; char ctrl; char left, middle, right; } button; extern void event_init(); extern void MainLoop(); extern void print_help(); extern float elapsed(float *since, float *nextsince); #endif /* ! _EVENT_H */ geomview-1.9.4/src/bin/geomview/common/comm.c0000644000175000001440000013045210647465461016056 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #ifdef NeXT #include #else /* any other reasonable UNIX */ #include #endif #include #include #include #include #include #include #include #include #include #include #include "ooglutil.h" #include "drawer.h" #include "ui.h" #include "handle.h" #include "handleP.h" #include "streampool.h" #include "main.h" #include "event.h" #include "comm.h" #include "lang.h" #include "lisp.h" #include "transobj.h" #include "ntransobj.h" extern HandleOps CamOps, GeomOps, TransOps, NTransOps, CommandOps, WindowOps; extern HandleOps ImageOps, AppearanceOps; int gv_debug = 0; static int commandimport(Pool *, Handle **, Ref **); static int commandclose(Pool *); static int emodule_commandclose(Pool *); static int listenimport(Pool *, Handle **, Ref **); static void useconnection( char *name, HandleOps *ops, Handle *h, Ref *obj, int unique ); static void MyPoolDelete(Pool *p); HandleOps CommandOps = { "command_language", commandimport, NULL, NULL, NULL, commandclose }; static HandleOps emoduleCommandOps = { "command_language", commandimport, NULL, NULL, NULL, emodule_commandclose, }; #if HAVE_UNIX_SOCKETS static HandleOps listenOps = { /* "Ops" structure for listening sockets */ "socket_listener", listenimport, /* "read" routine really spawns a new connection's * data socket */ NULL, NULL, NULL, NULL }; #endif static int commandimport(Pool *p, Handle **unused, Ref **unused_too ) { char *w, *raww; int c; int ok = 0; IOBFILE *inf; Lake *lake; if ((inf = PoolInputFile(p)) == NULL) goto done; if ((c = async_iobfnextc(inf,0)) == NODATA) return 1; /* pretend we got something. */ if ((lake=(Lake*)PoolClientData(p)) == NULL) { lake = LakeDefine(p->inf, p->outf, p); PoolSetClientData(p, (void*)lake); } else if (lake->streamin != inf) { lake->streamin = inf; lake->streamout = PoolOutputFile(p); } switch(c) { case '<': iobfgetc(inf); w = iobfdelimtok("()", inf, 0); if (w == NULL) goto done; if (strcmp(w, "-") && (w = findfile(PoolName(p), raww = w)) == NULL) { OOGLSyntax(inf, "Reading commands from \"%s\": can't find command file %s", PoolName(p), raww); goto done; } p = PoolStreamOpen(w, NULL, 0, &CommandOps); if (iobfile(PoolInputFile(p)) == stdin && !PoolOutputFile(p)) p = PoolStreamOpen(PoolName(p), stdout, 1, &CommandOps); if (p != NULL && inf != NULL) ok = comm_object(w, &CommandOps, NULL, NULL, COMM_LATER); break; case '(': { LObject *val; val = LEvalSexpr(lake); ok = (val != Lnil) ? 1 : -1; LFree(val); } break; default: { LFree( LEvalSexpr(lake) ); } } done: return ok; } /* * What is this file? Returns * -1 : nonexistent * 0 : is a plain file * 1 : is something else, probably a named pipe or tty */ static int ispipe(char *fname) { struct stat st; if (stat(fname, &st) < 0) return -1; return (st.st_mode & S_IFMT) != S_IFREG; } int comm_object(char *str, HandleOps *ops, Handle **hp, Ref **rp, int now) { int c, ok = 0; Pool *p; if (str == NULL) return 0; if (strcmp(str, "-") == 0 || access(str, 0) == 0) { Handle *h = HandleReferringTo('<', str, ops, hp); /* * If we haven't read something from this file yet, * forget it. */ if (h) { if (HandleObject(h)) { ok = 1; if (rp) { HandleUpdRef(&h, NULL, rp); } } else if (((p = PoolByName(HandleName(h), ops))) == NULL || (p->flags & PF_ANY) || (!p->seekable && !now)) { /* When reading plain files, always demand an object. When * reading others (pipe, tty), demand one if 'now' set. Use * PF_ANY flag as an alternate hint of reading an object, * since reading commands leaves no object attached to h. */ ok = 1; } else { /* Failed */ HandleDelete(h); if (hp) { *hp = NULL; } } } /* If not ok, close the file. * If 'now' and not some sort of pipe, also close the file. */ if ((p = PoolByName(str, ops)) != NULL && (!ok || (now && p->seekable))) { if (now && ok) { /* Read as much as possible if we need it right now. */ while(PoolInputFile(p) != NULL && (c = async_iobfnextc(PoolInputFile(p), 0)) != NODATA && c != EOF && (*ops->strmin)(p, hp, rp)) ; } PoolClose(p); MyPoolDelete(p); } else if (iobfile(PoolInputFile(p)) == stdin && PoolOutputFile(p) == NULL) { p = PoolStreamOpen(PoolName(p), stdout, 1, ops); } return ok; } else if (strpbrk(str, "({ \t\n")) { static Pool *pcache; /* Cache a pool for handling strings */ static bool inuse = false; /* Use cached pool unless already in use */ IOBFILE *inf = iobfileopen(fmemopen(str, strlen(str), "rb")); /* Caching implies this first pool has a long lifetime; * suitable for expressing (interest (...)) */ if (!inuse) { if ((p = pcache) == NULL) { p = pcache = PoolStreamTemp(str, inf, stdout, 2, ops); } else { p->inf = inf; /* hack */ p->outf = stdout; /* hack */ } inuse = true; } else { p = PoolStreamTemp(str, inf, stdout, 2, ops); } if (p == NULL) { return 0; /* Failed */ } while(iobfnextc(inf, 0) != EOF) { ok = (*ops->strmin)(p, hp, rp); } PoolClose(p); if (p == pcache) { inuse = false; } else { MyPoolDelete(p); /* Delete temp pool unless it's our cached one */ } } else { /* Print the "No such file..." error left by access() */ fprintf(stderr, "%s: %s\n", str, sperror()); } return ok; } /* * Arrange that later attempts to read the same file will actually re-read it. */ static int commandclose(Pool *p) { PoolDoReread(p); PoolClose(p); #if 1 /* should we really cache handles for command-files??? */ PoolDelete(p); #endif return 0; } LDEFINE(setenv, LVOID, "(setenv name string) sets the environment variable ``name'' to the value\n\ ``string''; the name is visible to geomview (as in pathnames containing $name)\n\ and to processes it creates, e.g. external modules.") { char *name, *string = NULL; char buf[10240]; LDECLARE(("setenv", LBEGIN, LSTRING, &name, LSTRING, &string, LEND)); sprintf(buf, "%s=%s", name, string); envexpand(buf+strlen(name)+1); putenv(strdup(buf)); return Lt; } LDEFINE(input_translator, LVOID, "(input-translator \"#prefix_string\" \"Bourne-shell-command\")\n\ Defines an external translation program for special input types.\n\ When asked to read a file which begins with the specified string,\n\ geomview invokes that program with standard input coming from the given file.\n\ The program is expected to emit OOGL geometric data to its standard output.\n\ In this implementation, only prefixes beginning with # are recognized.") { char *prefix, *cmd; LDECLARE(("input-translator", LBEGIN, LSTRING, &prefix, LSTRING, &cmd, LEND)); GeomAddTranslator(prefix, cmd); return Lt; } /************************************************************************/ /* * Signal handling routines. * Any code here must be careful not to do anything unsafe at signal time, * e.g. calls to stdio routines or malloc. These routines just examine and * change fields in existing data structures. */ /* * Handle death of a child process -- possibly an emodule. * If it is, mark it dead. */ static void comm_sigchld(int sig) { #if HAVE_WAITPID int status; int pid = waitpid(-1, &status, WNOHANG); #elif HAVE_WAIT3 union wait status; int pid = wait3(&status, WNOHANG|WUNTRACED, NULL); #else # error FIXME #endif if (WIFEXITED(status) || WIFSIGNALED(status)) { emodule *em = VVEC(uistate.emod, emodule); int i; for(i = 0; i < VVCOUNT(uistate.emod); i++, em++) { if (em->pid == pid) { em->pid = -pid; uistate.emod_check = 1; } } } signal(SIGCHLD, comm_sigchld); } /* * SIGTTIN indicates we're reading from stdin, but we've been placed in the * background. Suspend reading from stdin for two seconds. */ static void comm_sigttin(int sig) { Pool *p = PoolByName("-", NULL); if (p != NULL) PoolSleepFor(p, 2.); signal(SIGTTIN, comm_sigttin); #ifdef SA_RESTART /* Do we have sigaction()? If so, be sure * SIGTTIN won't restart the read it interrupts! */ { struct sigaction sa; if (sigaction(SIGTTIN, NULL, &sa) >= 0) { sa.sa_flags &= ~SA_RESTART; sigaction(SIGTTIN, &sa, NULL); } } #endif } static const char *signal_name(int sig) { static char buffer[256]; switch(sig) { case SIGSEGV: return "Segmentation violation"; case SIGBUS: return "Bus error"; case SIGILL: return "Illegal instruction"; default: snprintf(buffer, sizeof(buffer), "Signal number %d\n", sig); return buffer; } } static void fatalsig(int sig) { char die = 'y'; fprintf(stderr, "Geomview(%d): internal error: \"%s\"; " "dump core now (y/n) [n] ? ", getpid(), signal_name(sig)); fflush(stderr); read(2, &die, 1); fprintf(stderr, "got answer %c\n", (int)die % 0xff); fflush(stderr); if (die != 'y' && die != 'Y') gv_exit(); /* else return, and hope the OS gives us a core dump. */ signal(sig, SIG_DFL); } typedef void (*mysigfunc_t)(); static void catchsig(int sig, mysigfunc_t func) { mysigfunc_t oldfunc = (mysigfunc_t)signal(sig, func); if (oldfunc == (mysigfunc_t)SIG_IGN) signal(sig, oldfunc); } void comm_init() { signal(SIGCHLD, comm_sigchld); signal(SIGTTIN, comm_sigttin); signal(SIGPIPE, SIG_IGN); /* Write on broken pipe -> I/O error */ if (!gv_debug) { catchsig(SIGINT, (mysigfunc_t)gv_exit); catchsig(SIGSEGV, (mysigfunc_t)fatalsig); catchsig(SIGBUS, (mysigfunc_t)fatalsig); catchsig(SIGILL, (mysigfunc_t)fatalsig); } catchsig(SIGHUP, (mysigfunc_t)gv_exit); catchsig(SIGTERM, (mysigfunc_t)gv_exit); lang_init(); } int comm_route( char *str ) { comm_object( str, &CommandOps, NULL, NULL, COMM_LATER ); return 0; } static int emodule_commandclose(Pool *p) { int i; emodule *em; for(i = 0, em = VVEC(uistate.emod, emodule); i < VVCOUNT(uistate.emod); i++, em++) { if (em->link == p && em->pid <= 0) { emodule_reap(em); return 1; } } return 0; } void emodule_reap(emodule *em) { Lake *lake; Pool *p = em->link; if (p != NULL) { em->link = NULL; if ((lake=(Lake*)PoolClientData(p)) != NULL) { RemoveLakeInterests(lake); } PoolClose(p); MyPoolDelete(p); } ui_emodule_uninstall(em - VVEC(uistate.emod, emodule)); return; } int emodule_kill(emodule *em) { kill(-em->pid, SIGHUP); /* Kill child's process group in case it has one */ /* Kill child process itself. comm_sigchld() ought to be invoked if it dies, * but put this check here, just in case, since we're having trouble on the * SGI. */ if (kill(em->pid, SIGHUP) < 0 && errno == ESRCH) { em->pid = -abs(em->pid); uistate.emod_check = 1; } return 1; } LDEFINE(emodule_run, LVOID, "(emodule-run SHELL-COMMAND ARGS...)\n\ Runs the given SHELL-COMMAND (a string containing a UNIX shell\n\ command) as an external module. The module's standard output\n\ is taken as geomview commands; responses (written to filename\n\ \"-\") are sent to the module's standard input. The shell\n\ command is interpreted by /bin/sh, so e.g. I/O redirection may\n\ be used; a program which prompts the user for input from the\n\ terminal could be run with:\n\ (emodule-run yourprogram <&2)\n\ If not already set, the environment variable $MACHTYPE is set\n\ to the name of the machine type. Input and output\n\ connections to geomview are dropped when the shell command\n\ terminates. Clicking on a running program's module-browser entry\n\ sends the signal SIGHUP to the program. For this to work, programs\n\ should avoid running in the background; those using FORMS or GL\n\ should call foreground() before the first FORMS or winopen() call.\n\ See also emodule-define, emodule-start.") { char *cmd; emodule em; LDECLARE(("emodule-run", LBEGIN, LSTRINGS, &cmd, LEND)); em.text = em.name = cmd; em.data = NULL; em.dir = NULL; emodule_run(&em); return Lt; } /* Does str appear to contain template? * Check if str is either equal to the template, or contains template as a * prefix followed by a blank. */ static int matches(char *template, int len, char *str) { if (str == NULL) return 0; return (strncasecmp(template, str, len) == 0 && (str[len] == '\0' || isspace(str[len]))); } /* This routine searches through the running emodules and returns the index * of the first on matching modname. Case sensitive. modname is * looked for first in the names as they appear in the browser * (minus the number in []'s) then as they appear in the command used to * run the module, minus the arguments. Returns -1 if the module is not * found. * -cf */ int emodule_running_index(char *modname) { char *name; emodule *em; int i, len; if (modname == NULL) return -1; len = strlen(modname); for (i = 0, em = VVEC(uistate.emod, emodule); i < VVCOUNT(uistate.emod); i++, em++) if (em->pid > 0) { name = strchr(em->name, ']'); if (name == NULL) name = em->name; else name++; if (matches(modname, len, name) || matches(modname, len, em->name) || matches(modname, len, em->text)) return i; } return -1; } LDEFINE(emodule_isrunning, LVOID, "(emodule-isrunning NAME)\n\ Returns Lt if the emodule NAME is running, or Lnil\n\ if it is not running. NAME is searched for in the\n\ names as they appear in the browser and in the shell commands\n\ used to execute the external modules (not including arguments).") { char *modname; LDECLARE(("emodule-isrunning", LBEGIN, LSTRING, &modname, LEND)); if (emodule_running_index(modname) != -1) return Lt; else return Lnil; } /* * NeXT applications need to know the absolute paths of their executables. * If we got an emodule definition from a ``.geomview-X'' file in directory Y, * and the definition begins with the name of a file living in Y, * then prepend the directory name to the shell command. * The strcspn() is an attempt to grab the first word of a shell command. */ static char * truepath(char *program, char *dir) { static char *buf = NULL; int len; char path[10240]; len = strcspn(program, "()<> \t;"); if (len == 0) return program; sprintf(path, "%s/%.*s", dir, len, program); envexpand(path); if (access(path, X_OK) == 0) { if (buf) free(buf); strcat(path, program + len); program = buf = strdup(path); } return program; } emodule * emodule_run(emodule *em) { struct pipe { int r, w; } pfrom, pto; emodule *newem; int i, pid; char *program; int otherpgrp = 1; char seqname[128]; program = em->text; if (program[0] == '!') { program++; otherpgrp = 0; } /* create the communication pipes */ pfrom.r = pfrom.w = -1; if (pipe((int *)&pfrom) < 0 || pipe((int *)&pto) < 0) { OOGLError(1, "Can't create pipe to external module: %s", sperror()); if (pfrom.r >= 0) { close(pfrom.r); close(pfrom.w); } return NULL; } signal(SIGCHLD, SIG_DFL); /* invoke external module */ switch(pid = fork()) { case -1: OOGLError(1, "Can't fork external module: %s", sperror()); return NULL; case 0: { static char rats[] = "Can't exec external module: "; char envbuf[10240]; if (otherpgrp) { #if SETPGRP_VOID setpgrp(); #else setpgrp(0,getpid()); #endif } if (em->dir) { program = truepath(program, em->dir); sprintf(envbuf, "PATH=%s:%s", em->dir, getenv("PATH")); envexpand(envbuf); } else { /* Append known module directories to the subprocess' PATH. * This lets us emodule-run an existing module program with * special arguments, without having to specify its full path. */ char *p = envbuf; sprintf(envbuf, "PATH=%s", getenv("PATH")); for(i = 0; i < emodule_path_count; i++) { p += strlen(p); *p++ = ':'; strcpy(p, VVEC(vv_emodule_path, char *)[i]); } } putenv(envbuf); close(pfrom.r); close(pto.w); dup2(pto.r, STDIN_FILENO); close(pto.r); dup2(pfrom.w, STDOUT_FILENO); close(pfrom.w); signal(SIGPIPE, SIG_DFL); signal(SIGCHLD, SIG_DFL); execl("/bin/sh", "sh", "-c", program, NULL); write(STDERR_FILENO, rats, sizeof(rats)-1); perror(em->text); exit(1); } default: /* parent */ break; } close(pto.r); close(pfrom.w); for(i=1; ; i++) { sprintf(seqname, "[%d]%.100s", i, em->name); if (ui_emodule_index(seqname,NULL) < 0) break; } /* * Register new module in the UI's table. * Setting its callback to emodule_kill() means that clicking on that * browser entry will kill the module. * We insert it before the entry that created it, if any; * otherwise at the beginning of the table. */ i = em - VVEC(uistate.emod, emodule); if (i < 0 || i > VVCOUNT(uistate.emod)) i = 0; newem = ui_emodule_install(i, seqname, emodule_kill); newem->link = PoolStreamOpen( seqname, fdopen(pfrom.r, "rb"), 0, &emoduleCommandOps ); if (newem->link) { /* Attach output stream, too. */ PoolStreamOpen(seqname, fdopen(pto.w, "w"), 1, &emoduleCommandOps); /* Kludge. We want to ensure that EOF indications are "hard", i.e. * that we cease reading and drop the emodule as soon as we see EOF. * Unfortunately I can't find any way in the refcomm library * to distinguish nameless pipes (-> hard eof) from named ones * (where eof may be a temporary condition). So the library * guesses they're soft. We need to tell it otherwise. -slevy 921005 */ newem->link->softEOF = 0; } newem->pid = pid; signal(SIGCHLD, comm_sigchld); return newem; } LDEFINE(command, LVOID, "(command INFILE [OUTFILE])\n\ Read commands from INFILE; send corresponding responses\n\ (e.g. anything written to filename \"-\") to OUTFILE, stdout\n\ by default.") { char *file, *ofile = NULL; LDECLARE(("command", LBEGIN, LSTRING, &file, LOPTIONAL, LSTRING, &ofile, LEND)); if (PoolStreamOpen(file, NULL, 0, &CommandOps) == NULL) { OOGLError(0,"command: cannot open input %s: %s\n", file, sperror()); return Lnil; } if (ofile) { FILE *outf = (strcmp(ofile, "-")) ? fopen(ofile, "w") : stdout; if (outf == NULL) { OOGLError(0,"command: cannot open output %s: %s\n", ofile, sperror()); return Lnil; } else PoolStreamOpen(file, outf, 1, &CommandOps); } return Lt; } LDEFINE(sleep_for, LVOID, "(sleep-for TIME)\n\ Suspend reading commands from this stream for TIME seconds.\n\ Commands already read will still be executed; ``sleep-for'' inside\n\ ``progn'' won't delay execution of the rest of the progn's contents.") { Lake *sweenie; float time; LDECLARE(("sleep-for", LBEGIN, LLAKE, &sweenie, LFLOAT, &time, LEND)); PoolSleepFor(POOL(sweenie), time); return Lt; } LDEFINE(sleep_until, LFLOAT, "(sleep-until TIME)\n\ Suspend reading commands from this stream until TIME (in seconds).\n\ Commands already read will still be executed; ``sleep-until'' inside\n\ ``progn'' won't delay execution of the rest of the progn's contents.\n\ Time is measured according to this stream's clock, as set by\n\ ``set-clock''; if never set, the first sleep-until sets it to 0\n\ (so initially (sleep-until TIME) is the same as (sleep-for TIME)).\n\ Returns the number of seconds until TIME.") { Lake *bass; float time; LDECLARE(("sleep-until", LBEGIN, LLAKE, &bass, LFLOAT, &time, LEND)); PoolSleepUntil(POOL(bass), time); time -= PoolTimeAt(POOL(bass), NULL); /* NULL => now. */ return LNew(LFLOAT, &time); } LDEFINE(set_clock, LVOID, "(set-clock TIME)\n\ Adjusts the clock for this command stream to read TIME (in seconds)\n\ as of the moment the command is received. See also sleep-until, clock.") { Lake *bass; float time; LDECLARE(("set-clock", LBEGIN, LLAKE, &bass, LFLOAT, &time, LEND)); PoolSetTime(POOL(bass), NULL, time); return Lt; } LDEFINE(clock, LVOID, "(clock)\n\ Returns the current time, in seconds, as shown by this stream's clock.\n\ See also set-clock and sleep-until.") { Lake *rainy; float time; LDECLARE(("clock", LBEGIN, LLAKE, &rainy, LEND)); time = PoolTimeAt(POOL(rainy), NULL); return LNew(LFLOAT, &time); } /* This used to be the guts of echo - it's now in a seperate procedure * for use by emodule-transmit. * -cf */ void echo_to_fp(LList *arglist, FILE *fp) { LObject *arg, *val; if (arglist == NULL) { fputs("\n", fp); } else { for(;;) { arg = arglist->car; if (arg->type == LSTRING) fputs(LSTRINGVAL(arg), fp); else if (arg->type == LLIST) { val = LEval(arg); LWrite(fp, val); LFree(val); } else LWrite(fp, arg); if ((arglist = arglist->cdr) == NULL) break; fputs(" ", fp); } } fflush(fp); } LDEFINE(echo, LVOID, "(echo ...)\n\ Write the given data to the special file \"-\". Strings are written\n\ literally; lisp expressions are evaluated and their values written.\n\ If received from an external program, \"echo\" sends to the program's\n\ input. Otherwise writes to geomview's own standard output\n\ (typically the terminal).") { Lake *powderhorn; LList *arglist = NULL; FILE *fp; LDECLARE(("echo", LBEGIN, LHOLD, LLAKE, &powderhorn, LREST, &arglist)); if ( (fp = PoolOutputFile(POOL(powderhorn))) == NULL) fp = stdout; echo_to_fp(arglist, fp); return Lt; } LDEFINE(emodule_transmit, LVOID, "(emodule-transmit NAME LIST)\n\ Places LIST into external module NAME's standard input. NAME is\n\ searched for in the names of the modules as they appear in the\n\ External Modules browser and then in the shell commands used to\n\ execute the external modules. Does nothing if modname is not\n\ running.") { char *modname; emodule *em; LList *message = NULL; int i; LDECLARE(("emodule-transmit", LBEGIN, LSTRING, &modname, LHOLD, LREST, &message)); i = emodule_running_index(modname); if (i == -1) return Lnil; em = VVINDEX(uistate.emod, emodule, i); if (em->link && em->link->outf) { echo_to_fp(message, em->link->outf); return Lt; } return Lnil; } LDEFINE(read, LVOID, "(read {geometry|camera|image|appearance|transform|ntransform|command} {GEOMETRY or CAMERA or ...})\n" "Read and interpret the text in ... as containing the " "given type of data. Useful for defining objects using OOGL " "reference syntax, e.g. " "\n\n\n\n" "(geometry thing { INST transform : T geom : fred })\n\n" "(read geometry { define fred QUAD 1 0 0 0 1 0 0 0 1 1 0 0 })\n\n" "(read transform { define T streamin, "\"read\" in \"%s\": keyword expected {command|geometry|camera|window|transform|ntransform|image|appearance}, got \"%s\"", LakeName(lake), opsname); goto fail; } /* parse 2nd arg, using ops determined by 1st arg. Note: we don't actually store the 1st arg because this function's work is all done during parsing. */ if (!LakeMore(lake,c) || (*ops->strmin)(POOL(lake), NULL, NULL) == 0) { OOGLSyntax(lake->streamin, "\"read %s\" in \"%s\": error reading %s's", opsname, PoolName(POOL(lake)), opsname); goto fail; } } /* if lake == NULL then we're evaluating, but this function does no evaluation work; it's all in the parsing */ LFree(kw); return Lt; fail: LFree(kw); return Lnil; } void gv_merge(HandleOps *ops, int camid, Ref *object) { CameraStruct cs; /* Might be either camera or window, really */ cs.h = NULL; #if 0 cs.cam = REFGET(Camera, object); /* Since (merge ...) will delete it */ #endif LFree( LEvalFunc("merge", LSTRING, ops == &CamOps ? "camera" : "window", LID, camid, ops == &CamOps ? LCAMERA : LWINDOW, &cs, LEND) ); } LDEFINE(merge, LVOID, "(merge {window|camera} CAM-ID { WINDOW or CAMERA ... } )\n\ Modify the given window or camera, changing just those properties\n\ specified in the last argument. E.g.\n\ (merge camera \"Camera\" { far 20 })\n\ sets Camera's far clipping plane to 20 while leaving\n\ other attributes untouched.") /* Since we don't use LDECLARE we must remember to LDefun() this function manually in lang_init() in file lang.c. */ { char *opsname = NULL; HandleOps *ops; int c, id; LObject *kw = NULL, *idarg = NULL, *item = NULL; if (lake != NULL) { /* parse first arg [ops]: */ if (! LakeMore(lake,c) || (kw = LSexpr(lake)) == Lnil || !LFROMOBJ(LSTRING)(kw, &opsname) || ((ops = str2ops(opsname)) != &CamOps && ops != &WindowOps)) { OOGLSyntax(lake->streamin, "\"merge\" in \"%s\": expected \"camera\" or \"window\", got \"%s\"", LakeName(lake), opsname); goto parsefail; } /* parse 2nd arg; it's a string (id) */ if (! LakeMore(lake,c) || (idarg = LEvalSexpr(lake)) == Lnil) { OOGLSyntax(lake->streamin,"\"merge\" in \"%s\": expected CAM-ID", LakeName(lake)); goto parsefail; } item = LPARSE(((ops == &CamOps) ? LCAMERA : LWINDOW))(lake); if (item == Lnil) { OOGLSyntax(lake->streamin, "\"merge\" in \"%s\": error reading %s", LakeName(lake), LSTRINGVAL(kw)); goto parsefail; } LListAppend(args, kw); LListAppend(args, idarg); LListAppend(args, item); return Lt; } kw = LListEntry(args, 1); idarg = LListEntry(args, 2); item = LListEntry(args, 3); if (!LFROMOBJ(LSTRING)(kw, &opsname) || ((ops = str2ops(opsname)) != &CamOps && ops != &WindowOps)) { OOGLError(0, "\"merge\": expected \"camera\" or \"window\", got %s", LSummarize(idarg)); return Lnil; } if (!LFROMOBJ(LID)(idarg, &id) || !ISCAM(id)) { OOGLError(0, "\"merge\": expected CAM-ID in arg position 2, got %s", LSummarize(idarg)); return Lnil; } if (ops == &CamOps) { CameraStruct *cs; if (!LFROMOBJ(LCAMERA)(item, &cs)) { OOGLError(0,"\"merge\": expected camera in arg position 3"); return Lnil; } drawer_merge_camera(id, cs->cam); /* CamDelete(cs->cam); */ } else { WindowStruct *ws; if (!LFROMOBJ(LWINDOW)(item, &ws)) { OOGLError(0,"\"merge\": expected window in arg position 3"); return Lnil; } drawer_merge_window(id, ws->wn); /* WnDelete(ws->wn); */ } return Lt; parsefail: LFree(kw); LFree(idarg); LFree(item); return Lnil; } static void MyPoolDelete(Pool *p) { Lake *lake = (Lake*)PoolClientData(p); if (lake) { RemoveLakeInterests(lake); LakeFree(lake); } PoolDelete(p); } HandleOps * str2ops(char *str) { if (str == NULL) return NULL; else if (!strncmp(str, "cam", 3)) return &CamOps; else if (!strncmp(str, "geom", 4)) return &GeomOps; else if (!strncmp(str, "comm", 4)) return &CommandOps; else if (!strncmp(str, "trans", 5)) return &TransOps; else if (!strncmp(str, "ntrans", 6)) return &NTransOps; else if (!strncmp(str, "win", 3)) return &WindowOps; else if (!strncmp(str, "image", sizeof("image")-1)) return &ImageOps; else if (!strncmp(str, "appearance", sizeof("appearance")-1)) return &AppearanceOps; else return NULL; } LType * ops2ltype(HandleOps *ops) { if (ops == &CamOps) return LCAMERA; else if (ops == &GeomOps) return LGEOM; else if (ops == &WindowOps) return LWINDOW; else if (ops == &TransOps) return LTRANSFORM; else if (ops == &NTransOps) return LTRANSFORMN; else if (ops == &CommandOps) return LLOBJECT; else if (ops == &ImageOps) return LIMAGE; else if (ops == &AppearanceOps) return LAP; else return NULL; } /************************************************************************/ LDEFINE(load, LINT, "(load filename [command|geometry|camera])\n\ Loads the given file into geomview. The optional second argument\n\ specifies the type of data it contains, which may be \"command\"\n\ (geomview commands), \"geometry\" (OOGL geometric data), or\n\ \"camera\" (OOGL camera definition). If omitted, attempts to guess\n\ about the file's contents.\n\ Loading geometric data creates a new visible object; loading a camera\n\ opens a new window; loading a command file executes those commands.\n") { char *file, *opsname = NULL; HandleOps *ops = &CommandOps; int guess = 1; LDECLARE(("load", LBEGIN, LSTRING, &file, LOPTIONAL, LSTRING, &opsname, LEND)); if (opsname != NULL) { guess = 0; ops = str2ops(opsname); if (ops != &CommandOps && ops != &GeomOps && ops != &CamOps) { OOGLError(0, "load: expected \"command\" or \"geometry\" or \"camera\", got \"%s\"", opsname); return Lnil; } } loadfile(file, ops, guess); return Lt; } void loadfile(char *name, HandleOps *defops, int guess) { Handle *h = NULL; Ref *obj = NULL; HandleOps *ops = NULL; char *pathname; int freename = 0; if (strcmp(name, "-") == 0) { guess = 0; } else if ((pathname=findfile(NULL, name))) { name = strdup(pathname); freename = 1; } else if (strchr(name, ' ') == NULL && strchr(name, '(') == NULL && strchr(name, '<') == NULL) { OOGLError(0, "Can't find file %s", name); return; } if (ispipe(name)) { guess = 0; } if (!guess) { if (comm_object(name, defops, &h, &obj, COMM_LATER)) { ops = defops; } else { OOGLError(0, "Can't load %s's from %s", defops->prefix, name); return; } } else if (comm_object(name, &GeomOps, &h, &obj, COMM_LATER)) { ops = &GeomOps; } else if (comm_object(name, &CamOps, &h, &obj, COMM_LATER)) { ops = &CamOps; } else if (!(comm_object(name, &CommandOps, &h, NULL, COMM_LATER))) { OOGLError(0,"Can't load %s",name); return; } useconnection( name, ops, h, obj, 1 ); if (freename) { free(name); } return; } LDEFINE(hdelete, LVOID, "(hdelete [geometry|camera|window|image|appearance|transform|ntransform] name)\n" "Deletes the given handle. Note that the handle will not actually be " "deleted in case there are still other objects referring to the " "handle, but once those objects are gone, the handle will also " "automatically go away. The object the handle refers to (if any) " "will only be deleted if there are no other references to that object." "\n\n\n\n" "If the optional first argument is omitted, then the first handle " "matching \"name\" will be deleted, regardless of the type of the " "object it is attached to. It is not an error to call this function " "with a non-existent handle, but it is an error to call this funcion " "with the name of a non-global handle, i.e. one that was not " "created by (hdefine ...) or (read ... { define ...}).") { Handle *h = NULL; HandleOps *ops = NULL; char *hname = NULL, *opsname = NULL, *horo; LDECLARE(("hdelete", LBEGIN, LSTRING, &horo, LOPTIONAL, LSTRING, &hname, LEND)); if (hname == NULL) { hname = horo; } else { opsname = horo; } if (opsname && ((ops = str2ops(opsname)) == NULL || ops2ltype(ops) == NULL)) { OOGLError(0, "\"hdelete\": " "expected \"camera\" or \"window\" or \"geometry\" or " "\"transform\" or \"ntransform\" or " "\"image\" or \"appearance\", got \"%s\"", opsname); return Lnil; } if ((h = HandleByName(hname, ops)) != NULL) { REFPUT(h); /* undo HandleByName() REFGET */ if (!h->permanent) { OOGLError(0, "\"hdelete\": " "attempt to delete the non-global handle \"%s[%s]\"", opsname ? opsname : "", hname); return Lnil; } h->permanent = false; HandleDelete(h); } return Lt; } LDEFINE(hdefine, LVOID, "(hdefine {geometry|camera|window|image|appearance|transform|ntransform} name value)\n" "Sets the value of a handle of a given type." "(hdefine ) is generally equivalent to" "(read { define })" "except that the assignment is done when hdefine is executed," "(possibly not at all if inside a conditional statement)," "while the ``read ... define'' performs assignment as soon as the" "text is read.") { Handle *h = NULL; HandleOps *ops = NULL; LType *ltype; char *hname; char *opsname = NULL; Ref *obj; int c; LObject *kw = NULL, *name = NULL, *item = NULL; union { GeomStruct gs; CameraStruct cs; TransformStruct ts; TmNStruct tns; WindowStruct ws; ApStruct as; ImgStruct img; LObject lobj; } *s; if (lake != NULL) { /* parse first arg [ops]: */ if (! LakeMore(lake,c) || (kw = LSexpr(lake)) == Lnil || !LFROMOBJ(LSTRING)(kw, &opsname) || (ops = str2ops(opsname)) == NULL || (ltype = ops2ltype(ops)) == NULL) { OOGLSyntax(lake->streamin, "\"hdefine\" in \"%s\": " "expected \"camera\" or \"window\" or \"geometry\" or " "\"transform\" or \"ntransform\" or " "\"image\" or \"appearance\", got \"%s\"", LakeName(lake), opsname); goto parsefail; } /* parse 2nd arg; it's a string (id) */ if (! LakeMore(lake,c) || (name = LEvalSexpr(lake)) == Lnil) { OOGLSyntax(lake->streamin, "\"hdefine %s\" in \"%s\": expected handle name", LakeName(lake), opsname); goto parsefail; } item = LPARSE(ltype)(lake); if (item == Lnil) { OOGLSyntax(lake->streamin, "\"hdefine\" in \"%s\": error reading %s", LakeName(lake), LSTRINGVAL(kw)); goto parsefail; } LListAppend(args, kw); LListAppend(args, name); LListAppend(args, item); return Lt; } kw = LListEntry(args, 1); name = LListEntry(args, 2); item = LListEntry(args, 3); if (!LFROMOBJ(LSTRING)(kw, &opsname) || (ops = str2ops(opsname)) == NULL || (ltype = ops2ltype(ops)) == NULL) { OOGLError(0, "\"hdefine\": expected data type, got %s", LSummarize(kw)); return Lnil; } if (!LFROMOBJ(LSTRING)(name, &hname)) { OOGLError(0, "\"hdefine\": expected handle name, got %s", LSummarize(name)); return Lnil; } if (!LFROMOBJ(ltype)(item, &s)) { OOGLError(0, "\"hdefine\": Can't extract %s from %s", ltype->name, LSummarize(item)); return Lnil; } h = HandleCreateGlobal(hname, ops); REFPUT(h); if (ops == &CommandOps) { obj = NULL; /* (Ref *)LispCreate( s->lobj ) */ } else if (ops == &TransOps) { obj = (Ref *)TransCreate(s->ts.tm); } else { obj = (Ref *)s->gs.geom; /* All other types resemble geoms */ } HandleSetObject(h, obj); if (ops == &TransOps) { REFPUT(obj); /* otherwise obj will never be deleted */ } return Lt; parsefail: LFree(kw); LFree(name); LFree(item); return Lnil; } /*****************************************************************************/ #if HAVE_UNIX_SOCKETS || HAVE_INET_SOCKETS || HAVE_INET6_SOCKETS #if HAVE_SYS_SOCKET_H # include #endif #if HAVE_NETINET_IN_H # include #endif #if !HAVE_DECL_ACCEPT int accept(int sockfd, struct sockaddr *addr, ACCEPT_ARG3_TYPE *addrlen); #endif #if HAVE_UNIX_SOCKETS /* * makeunixsocket(name) makes a UNIX-domain listening socket and returns its fd. */ static int makeunixsocket(char *name) { struct sockaddr_un un; int s; unlink(name); strcpy(un.sun_path, name); un.sun_family = AF_UNIX; if ((s = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) { OOGLError(0, "geomview: can't make UNIX domain socket: %s", sperror()); return -1; } if (bind(s, (struct sockaddr *)&un, sizeof(un)) < 0 || listen(s, 4) < 0) { OOGLError(0, "geomview: can't listen on socket %s: %s",name,sperror()); return -1; } return s; } #endif /* HAVE_UNIX_SOCKKETS */ #if HAVE_INET_SOCKETS /* * makeinetsocket(name) makes a IPv4 listening socket and returns its fd. */ static int makeinetsocket(int port) { struct sockaddr_in in; int s; if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) { OOGLError(0, "geomview: can't make IPv4 socket: %s", sperror()); return -1; } in.sin_family = AF_INET; in.sin_port = htons(port); in.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(s, (struct sockaddr *)&in, sizeof(in)) < 0 || listen(s, 4) < 0) { OOGLError(0, "geomview: can't listen on IPv4 port %d: %s", port, sperror()); return -1; } return s; } #endif /* HAVE_INET_SOCKETS */ #if HAVE_INET6_SOCKETS /* * makeinet6socket(name) makes a IPv6 listening socket and returns its fd. */ static int makeinet6socket(int port) { struct sockaddr_in6 in; struct in6_addr addr = IN6ADDR_ANY_INIT; int s; if ((s = socket(PF_INET6, SOCK_STREAM, 0)) < 0) { OOGLError(0, "geomview: can't make IPv6 socket: %s", sperror()); return -1; } in.sin6_family = AF_INET6; in.sin6_port = htons(port); in.sin6_addr = addr; if (bind(s, (struct sockaddr *)&in, sizeof(in)) < 0 || listen(s, 4) < 0) { OOGLError(0, "geomview: can't listen on IPv6 port %d: %s", port, sperror()); return -1; } return s; } #endif /* HAVE_INET6_SOCKETS */ /* * This pretends to be a stream-import routine, but it really handles * new connections on UNIX-domain sockets! */ int listenimport(Pool *listenp, Handle **hp, Ref **rp) { struct sockaddr_un un; ACCEPT_ARG3_TYPE len = sizeof(un); char conname[10240]; int i, ds; HandleOps *ops = (HandleOps *)PoolClientData(listenp); if ((ds = accept( iobfileno(listenp->inf), (struct sockaddr *)&un, &len) ) < 0) { OOGLError(0, "geomview: couldn't accept connection on %s: %s", listenp->poolname, sperror()); return 0; } for(i=1; ; i++) { /* Construct unique connection name */ sprintf(conname, "[%d]%.500s", i, listenp->poolname); if (PoolByName(conname, ops) == NULL) break; } PoolStreamOpen(conname, fdopen(ds, "rb"), 0, ops); /* * Reply on the same pipe's return stream. * Don't do this yet; only user so far is "togeomview", * which isn't prepared to receive data back from us. * PoolStreamOpen(conname, fdopen(ds, "w"), 1, (HandleOps*)PoolClientData(listenp)); */ PoolStreamOpen(conname, fdopen(ds, "w"), 1, ops); useconnection( listenp->poolname, ops, HandleCreate(conname, ops), NULL, 0 ); return 1; } #endif /* * usepipe(dir, suffix, type) * where the characters in "type" specify: * kind of connection (named-pipe 'p' or socket 's') and * type of data expected (command 'c' or geometry 'g'). * * For sockets 's' may be followed by eigher "un" (Unix domain * socket), "in" (IPv4 socket) or "in6" (IPv6 socket). For IP sockets * "suffix" actually specifies the port-number to use. pipedir is * ignored in that case. */ void usepipe(char *pipedir, char *suffix, char *pipetype) { HandleOps *ops = &GeomOps; int s; char *tail; char pipename[PATH_MAX]; char pdir[PATH_MAX]; enum { nopipe = -1, namedpipe = 1, unixsocket = 2, inetsocket = 3, inet6socket = 4 } usepipe = nopipe; int port; while (*pipetype) switch(*pipetype++) { case 's': usepipe = unixsocket; /* Check for sin:PORT and sin6:PORT sockets, allow sun socket type */ if (strncmp(pipetype, "un", 2) == 0) { pipetype += 2; } else if (strncmp(pipetype, "in6", 3) == 0) { usepipe = inet6socket; pipetype += 3; } else if (strncmp(pipetype, "in", 2) == 0) { usepipe = inetsocket; pipetype += 2; } break; case 'p': usepipe = namedpipe; break; case 'c': ops = &CommandOps; break; case 'g': ops = &GeomOps; break; default: OOGLError(0, "Unknown character '%c' in pipe type string: " "expected s, p, c, g", pipetype[-1]); } if (usepipe == nopipe) { #ifdef NeXT usepipe = unixsocket; #else usepipe = namedpipe; #endif } if (usepipe == unixsocket || usepipe == namedpipe) { if (suffix[0] == '/') { strcpy(pdir, suffix); tail = strrchr(pdir, '/'); *tail = '\0'; pipedir = pdir; suffix = tail + 1; } sprintf(pipename, "%s/%s", pipedir, suffix); mkdir(pipedir, 0777); chmod(pipedir, 0777); } else { port = atoi(suffix); } switch (usepipe) { case namedpipe: { /* Establish System-V style named pipe. * Expect data on it of type 'ops'. * If there's a non-pipe with that name, trash it. */ struct stat st; if (stat(pipename, &st) == 0 && (st.st_mode & S_IFMT) != S_IFIFO) unlink(pipename); if (access(pipename, 0) < 0) { if (mknod(pipename, S_IFIFO, 0) < 0) OOGLError(1, "Can't make pipe: %s: %s", suffix, sperror()); chmod(pipename, 0666); } loadfile(pipename, ops, 0); break; } #if HAVE_UNIX_SOCKETS case unixsocket: /* Establish UNIX-domain listener socket. * When we get connections to it, expect data of type 'ops'. */ s = makeunixsocket(pipename); if (s >= 0) { Pool *p = PoolStreamOpen(pipename, fdopen(s, "rb"), 0, &listenOps); if (p) PoolSetClientData(p, ops); p->flags |= PF_NOPREFETCH; } break; #endif #if HAVE_INET_SOCKETS case inetsocket: /* Establish UNIX-domain listener socket. * When we get connections to it, expect data of type 'ops'. */ s = makeinetsocket(port); if (s >= 0) { Pool *p = PoolStreamOpen(pipename, fdopen(s, "rb"), 0, &listenOps); if (p) PoolSetClientData(p, ops); p->flags |= PF_NOPREFETCH; } break; #endif #if HAVE_INET6_SOCKETS case inet6socket: /* Establish UNIX-domain listener socket. * When we get connections to it, expect data of type 'ops'. */ s = makeinet6socket(port); if (s >= 0) { Pool *p = PoolStreamOpen(pipename, fdopen(s, "rb"), 0, &listenOps); if (p) PoolSetClientData(p, ops); p->flags |= PF_NOPREFETCH; } break; #endif default: break; } } /* * Assume we have a connection open named "name", expecting data of * type "ops". Wire it to an appropriate geomview object, if any. * (Data received on that connection will set the value of that object.) * Since (new_)geometry and (new_)camera take ownership of the object, * increasing its reference count, we decr the ref count after handing it over. */ void useconnection(char *name, HandleOps *ops, Handle *h, Ref *obj, int unique) { char *tail; tail = strrchr(name, '/'); if (tail) tail++; else tail = name; if (ops == &GeomOps) { GeomStruct gs; if(h && !h->permanent) { /* same logic as in geomparse() */ HandleDelete(h); h = NULL; } gs.h = h; gs.geom = (Geom *)obj; if (unique) gv_new_geometry( tail, &gs ); else gv_geometry( tail, &gs ); GeomDelete((Geom *)obj); /* Maintain ref count */ HandleDelete(h); /* Maintain ref count */ } else if (ops == &CamOps) { CameraStruct cs; if(h && !h->permanent) { /* same logic as in geomparse() */ HandleDelete(h); h = NULL; } cs.h = h; cs.cam = (Camera *)obj; if (unique) gv_new_camera( tail, &cs ); else gv_camera( tail, &cs ); CamDelete((Camera *)obj); /* Maintain ref count */ HandleDelete(h); /* Maintain ref count */ } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/comm.h0000644000175000001440000000477110514661161016053 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef COMM_H #define COMM_H /* * comm_object() interprets a string to yield an object. * If the string is exactly the name of a file, open & read the file, * otherwise interpret it as something in that object's syntax. * The 'now' flag determines whether the file must be read immediately. * COMM_NOW returns failure (0) if an object can't immediately be * read from the file. It reads at most one object from the file, * then closes it. If trying to guess the type of a file, * you MUST use COMM_NOW. * COMM_LATER reads an object if it can, but returns failure only * if a file can't be opened. However, it leaves the file open and * listening for further data. If opening something other than a plain * file e.g. a named pipe, you MUST use COMM_LATER. */ #define COMM_NOW 1 #define COMM_LATER 0 extern HandleOps CommandOps, TransOps, NTransOps, GeomOps, CamOps, WindowOps; extern void comm_init(); extern int comm_object(char *str, HandleOps *, Handle **hp, Ref **rp, int now); extern int comm_read(char *kind, Pool *p); extern int comm_route(char *str); /* interpret str as command */ extern void gv_merge(HandleOps *ops, int id, Ref *window_or_camera); /* Maps string 'commands/geometry/transform/camera' * into a HandleOps pointer, or NULL. * Allows abbreviations. */ extern HandleOps *str2ops(char *name); extern void loadfile(char *filename, HandleOps *defaultops, int guess); extern emodule *emodule_run(emodule *em); extern int emodule_kill(emodule *em); extern void emodule_reap(emodule *em); extern int gv_debug; #endif /* ! COMM_H */ geomview-1.9.4/src/bin/geomview/common/pickfunc.h0000644000175000001440000001607710624367362016734 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #define PICKFUNC(name, body, NDbody) \ static inline LObject *pickbody(char *coordsys, char *id, \ HPoint3 point, int pn, \ HPoint3 vertex, int vn, \ HPoint3 edge[2], int en, \ HPoint3 face[], int fn, \ int ppath[], int ppn, \ int vi, int ei[2], int ein, int fi) \ { \ do { \ body; \ } while (false); \ return Lt; \ } \ static inline LObject *pickNDbody(char *coordsys, char *id, \ float *point, int pn, \ float *vertex, int vn, \ float *edge, int en, \ float *face, int fn, \ int ppath[], int ppn, \ int vi, int ei[2], int ein, int fi) \ { \ do { \ NDbody; \ } while (false); \ return Lt; \ } \ LObject *name(Lake *lake, LList *args) \ { \ char *coordsys = NULL, *id = NULL; \ float *varpoint = NULL; int pn; \ float *varvertex = NULL; int vn; \ float *varedge = NULL; int en; \ float *varface = NULL; int fn; \ int *varppath = NULL; int ppn; \ int vi; \ int ei[2]; int ein = 2; \ int fi; \ LObject *res; \ \ LDECLARE(("pick", LBEGIN, \ LSTRING, &coordsys, \ LSTRING, &id, \ LHOLD, LVARARRAY, LFLOAT, &varpoint, &pn, \ LHOLD, LVARARRAY, LFLOAT, &varvertex, &vn, \ LHOLD, LVARARRAY, LFLOAT, &varedge, &en, \ LHOLD, LVARARRAY, LFLOAT, &varface, &fn, \ LHOLD, LVARARRAY, LINT, &varppath, &ppn, \ LINT, &vi, \ LHOLD, LARRAY, LINT, ei, &ein, \ LINT, &fi, \ LEND)); \ \ if (varpoint == NULL) { \ return Lnil; \ } \ \ if (pn <= 4) { \ HPoint3 point; \ HPoint3 vertex; \ \ if (varpoint) { \ point = *(HPoint3 *)varpoint; \ } \ if (varvertex) { \ vertex = *(HPoint3 *)varvertex; \ } \ res = pickbody(coordsys, id, \ point, pn, \ vertex, vn, \ (HPoint3 *)varedge, en, \ (HPoint3 *)varface, fn, \ varppath, ppn, vi, ei, ein, fi); \ } else { \ res = pickNDbody(coordsys, id, \ varpoint, pn, \ varvertex, vn, varedge, en, varface, fn, \ varppath, ppn, vi, ei, ein, fi); \ } \ \ if (varpoint) OOGLFree(varpoint); \ if (varvertex) OOGLFree(varvertex); \ if (varedge) OOGLFree(varedge); \ if (varface) OOGLFree(varface); \ if (varppath) OOGLFree(varppath); \ \ return res; \ } /* Note: the "if (1)" business above is to prevent a warning about the following statement ("return Lt") not being reached if the body itself returns. */ /* Note: Don't use DEFPICKFUNC any more. Use the newer PICKFUNC * instead. DEFPICKFUNC is provided for backward compatibility. * * cH: the above comment seemingly is ignored by everybody ... */ #define DEFPICKFUNC(helpstr, \ coordsys, \ id, \ point, pn, \ vertex, vn, \ edge, en, \ face, fn, \ ppath, ppn, \ vi, \ ei, ein, \ fi, \ body, \ NDbody) \ static inline LObject *pickbody(char *coordsys, char *id, \ HPoint3 point, int pn, \ HPoint3 vertex, int vn, \ HPoint3 edge[2], int en, \ HPoint3 face[], int fn, \ int ppath[], int ppn, \ int vi, int ei[2], int ein, int fi) \ { \ do { \ body; \ } while (false); \ return Lt; \ } \ static inline LObject *pickNDbody(char *coordsys, char *id, \ float *point, int pn, \ float *vertex, int vn, \ float *edge, int en, \ float *face, int fn, \ int ppath[], int ppn, \ int vi, int ei[2], int ein, int fi) \ { \ do { \ NDbody; \ } while (false); \ return Lt; \ } \ LDEFINE(pick, LVOID, helpstr) \ { \ char *coordsys = NULL, *id = NULL; \ float *var##point = NULL; int pn; \ float *var##vertex = NULL; int vn; \ float *var##edge = NULL; int en; \ float *var##face = NULL; int fn; \ int *var##ppath = NULL; int ppn; \ int vi; \ int ei[2]; int ein = 2; \ int fi; \ LObject *res; \ \ LDECLARE(("pick", LBEGIN, \ LSTRING, &coordsys, \ LSTRING, &id, \ LHOLD, LVARARRAY, LFLOAT, &var##point, &pn, \ LHOLD, LVARARRAY, LFLOAT, &var##vertex, &vn, \ LHOLD, LVARARRAY, LFLOAT, &var##edge, &en, \ LHOLD, LVARARRAY, LFLOAT, &var##face, &fn, \ LHOLD, LVARARRAY, LINT, &var##ppath, &ppn, \ LINT, &vi, \ LHOLD, LARRAY, LINT, ei, &ein, \ LINT, &fi, \ LEND)); \ \ if (var##point == NULL) { \ return Lnil; \ } \ \ if (pn <= 4) { \ HPoint3 point; \ HPoint3 vertex; \ \ if (var##point) { \ point = *(HPoint3 *)var##point; \ } \ if (var##vertex) { \ vertex = *(HPoint3 *)var##vertex; \ } \ res = pickbody(coordsys, id, \ point, pn, \ vertex, vn, \ (HPoint3 *)var##edge, en, \ (HPoint3 *)var##face, fn, \ var##ppath, ppn, vi, ei, ein, fi); \ } else { \ res = pickNDbody(coordsys, id, \ var##point, pn, \ var##vertex, vn, var##edge, en, var##face, fn, \ var##ppath, ppn, vi, ei, ein, fi); \ } \ \ if (var##point) OOGLFree(var##point); \ if (var##vertex) OOGLFree(var##vertex); \ if (var##edge) OOGLFree(var##edge); \ if (var##face) OOGLFree(var##face); \ if (var##ppath) OOGLFree(var##ppath); \ \ return res; \ } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/common.h0000644000175000001440000000256510455700776016421 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef COMMON_H #define COMMON_H #include "mg.h" #include "geom.h" #include "pick.h" #include "lispext.h" #include "clang.h" typedef int (*PFI)(); typedef void (*PFV)(); typedef struct Event { int dev; int val; int x,y; unsigned long int t; Pick *p; } Event; #if D1_DEBUG void print_event(char *s, Event *e); #define PRINT_EVENT(args) print_event args #else #define PRINT_EVENT(args) #endif #endif /* ! COMMON_H */ geomview-1.9.4/src/bin/geomview/common/mouse.c0000644000175000001440000000472710455700776016256 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ /* * mouse.c: mouse computations */ #include "window.h" #include "common.h" #include "mouse.h" Event oldmouse; static float olddist = 0; void mousezero(Event *event, WnPosition *wp) { oldmouse = *event; } void mousedisp(Event *event, float *dx, float *dy, unsigned long int *dt, WnPosition *wp) { *dx = 2. * (event->x - oldmouse.x) / (wp->xmax - wp->xmin + 1); *dy = 2. * (event->y - oldmouse.y) / (wp->ymax - wp->ymin + 1); *dt = event->t - oldmouse.t; D1PRINT(("mousedisp: dx <- %10f, dy <- %10f, dt <- %ld\n", *dx, *dy, *dt)); mousezero(event, wp); } void radialmousezero(Event *event, WnPosition *wp) { float x,y; float xw = wp->xmax - wp->xmin + 1; float yw = wp->ymax - wp->ymin + 1; x = (event->x - wp->xmin) / xw - 0.5; y = (event->y - wp->ymin) / yw - 0.5; olddist = sqrt( x*x + y*y ); } float radialmousedisp(Event *event, WnPosition *wp) { float x, y, dist, val; float xw = wp->xmax - wp->xmin + 1; float yw = wp->ymax - wp->ymin + 1; x = (event->x - wp->xmin) / xw - 0.5; y = (event->y - wp->ymin) / yw - 0.5; dist = sqrt( x*x + y*y ); val = dist - olddist; olddist = dist; return 2 * val; } void mousemap(int x, int y, float *rx, float *ry, WnPosition *wp) { *rx = 2. * (x - wp->xmin) / (wp->xmax - wp->xmin + 1) - 1; *ry = 2. * (y - wp->ymin) / (wp->ymax - wp->ymin + 1) - 1; } geomview-1.9.4/src/bin/geomview/common/mouse.h0000644000175000001440000000252010455700776016250 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MOUSE_H #define MOUSE_H #include "common.h" void mousezero(Event *event, WnPosition *wp); void mousedisp(Event *event, float *dx, float *dy, unsigned long int *dt, WnPosition *wp); float radialmousedisp(Event *event, WnPosition *wp); void radialmousezero(Event *event, WnPosition *wp); void mousemap(int x, int y, float *dx, float *dy, WnPosition *wp); #endif /* ! MOUSE_H */ geomview-1.9.4/src/bin/geomview/common/help.c0000644000175000001440000000715510663321735016047 00000000000000/* Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* simplistic help-system spawner (i.e. view the manual via external * browsers) */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include "lisp.h" static char htmlbrowser[PATH_MAX] = { '\0', }, pdfviewer[PATH_MAX] = { '\0', }; void ui_manual_browser(const char *type) { char helper[PATH_MAX]; char *docdir; char *browser; char *fmt; char *lang; const char *file = NULL, *dfltfile, *langfile; if ((docdir = getenv("GEOMVIEW_DOC_DIR")) == NULL) { docdir = DOCDIR; /* compile-time default */ } if (strncasecmp(type, "html", strlen("html")) == 0) { if (*htmlbrowser == '\0') { if ((browser = getenv("WEBBROWSER")) == NULL) { browser = DFLTHTMLBROWSER; } } else { browser = htmlbrowser; } dfltfile = "%s/html/index.html"; langfile = "%s/html/%s/index.html"; } else { /* if (strncasecmp(type, "pdf", strlen("pdf")) == 0) { */ if (*pdfviewer == '\0') { if ((browser = getenv("PDFVIEWER")) == NULL) { browser = DFLTPDFVIEWER; } } else { browser = pdfviewer; } dfltfile = "%s/geomview.pdf"; langfile = "%s/geomview-%s.pdf"; } if ((lang = getenv("LANG")) != NULL) { snprintf(helper, PATH_MAX, langfile, docdir, lang); file = findfile(NULL, helper); } if (file == NULL) { snprintf(helper, PATH_MAX, dfltfile, docdir); file = findfile(NULL, helper); } if (file == NULL) { OOGLError(0, "Unable to locate the Geomview manual (\"%s\").", helper); } else { snprintf(helper, PATH_MAX, "%s %s &", browser, file); system(helper); } } LDEFINE(ui_html_browser, LVOID, "(ui-html-browser HTMLBROWSER)\n" "Use HTMLBROWSER when the `Manual (HTML)' menu item is selected " "in the help menu. If the `(ui-html-browser...)' command was never " "executed, then the default is to use the browser stored in the " "`WEBBROWSER' environment variable. If the environment variable is " "unset then `"DFLTHTMLBROWSER"' is used.") { char *browser = NULL; LDECLARE(("ui-html-browser", LBEGIN, LSTRING, &browser, LEND)); if (browser != NULL) { strncpy(htmlbrowser, browser, PATH_MAX); } return Lt; } LDEFINE(ui_pdf_viewer, LVOID, "(ui-pdf-browser PDFVIEWER\n" "Use PDFVIEWER when the `Manual (PDF)' menu item is selected " "in the help menu. If the `(ui-pdf-viewer...)' command was never " "executed, then the default is to use the viewer stored in the " "`PDFVIEWER' environment variable. If the environment variable is " "unset then `"DFLTPDFVIEWER"' is used.") { char *browser = NULL; LDECLARE(("ui-pdf-viewer", LBEGIN, LSTRING, &browser, LEND)); if (browser != NULL) { strncpy(pdfviewer, browser, PATH_MAX); } return Lt; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/Makefile.am0000644000175000001440000000073610604000540016764 00000000000000INCLUDES = $(default_includes) -I.. EXTRA_DIST = Headers noinst_LIBRARIES = libgvcommon.a libgvcommon_a_SOURCES =\ comm.c comm.h common.h drawer.c drawer.h event.c event.h help.c lang.c lang.h\ lights.c lights.h lispext.c lispext.h main.c main.h motion.c motion.h mouse.c\ mouse.h ndshade.c pickfunc.h rman.c rman.h shaders.c space.c space.h\ transform.c transform.h ui.c ui.h version.h worldio.c worldio.h ../clang.c ../clang.h: cd .. && $(MAKE) $(AM_MAKEFLAGS) clang geomview-1.9.4/src/bin/geomview/common/Makefile.in0000644000175000001440000004044410665240477017023 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomview/common DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru libgvcommon_a_AR = $(AR) $(ARFLAGS) libgvcommon_a_LIBADD = am_libgvcommon_a_OBJECTS = comm.$(OBJEXT) drawer.$(OBJEXT) \ event.$(OBJEXT) help.$(OBJEXT) lang.$(OBJEXT) lights.$(OBJEXT) \ lispext.$(OBJEXT) main.$(OBJEXT) motion.$(OBJEXT) \ mouse.$(OBJEXT) ndshade.$(OBJEXT) rman.$(OBJEXT) \ shaders.$(OBJEXT) space.$(OBJEXT) transform.$(OBJEXT) \ ui.$(OBJEXT) worldio.$(OBJEXT) libgvcommon_a_OBJECTS = $(am_libgvcommon_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libgvcommon_a_SOURCES) DIST_SOURCES = $(libgvcommon_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) -I.. EXTRA_DIST = Headers noinst_LIBRARIES = libgvcommon.a libgvcommon_a_SOURCES = \ comm.c comm.h common.h drawer.c drawer.h event.c event.h help.c lang.c lang.h\ lights.c lights.h lispext.c lispext.h main.c main.h motion.c motion.h mouse.c\ mouse.h ndshade.c pickfunc.h rman.c rman.h shaders.c space.c space.h\ transform.c transform.h ui.c ui.h version.h worldio.c worldio.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomview/common/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomview/common/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libgvcommon.a: $(libgvcommon_a_OBJECTS) $(libgvcommon_a_DEPENDENCIES) -rm -f libgvcommon.a $(libgvcommon_a_AR) libgvcommon.a $(libgvcommon_a_OBJECTS) $(libgvcommon_a_LIBADD) $(RANLIB) libgvcommon.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drawer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/help.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lang.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lights.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lispext.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/motion.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mouse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndshade.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rman.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shaders.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/space.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/worldio.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am ../clang.c ../clang.h: cd .. && $(MAKE) $(AM_MAKEFLAGS) clang # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomview/common/motion.c0000644000175000001440000003321210647723362016421 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include #include "mg.h" #include "mouse.h" #include "drawer.h" #include "event.h" #include "ui.h" #include "motion.h" #include "transform.h" #include "space.h" #include "comm.h" #include "lang.h" typedef int (*ControlFunc)(int action, float x,float y,float t, float dx,float dy,float dt); typedef struct boundctl { char *buttons; ControlFunc function; float rate; } boundctl; /* These macros are passed to DTC and DSC as "functions". As a special case you can pass expressions like ".5 * X" which works because it expands properly. Be careful! */ #undef X #undef Y #undef Z #define ANGULAR 0 #define LINEAR 1 #define X mot.x #define Y mot.y #define Z mot.z #define ZERO 0 #define FAST 1.0 #define SLOW 0.1 static int minterp_switch(Event *event, boundctl *ctls); /* Define Transform Control */ #define DTC(name, interp, type, moving, center, frame, fx, fy, fz) \ int name(int action, float x, float y, float t, float dx, float dy, float dt) \ { \ Point3 mot; \ int useframe = interp(action, center, frame, dx, dy, &mot); \ \ D1PRINT(("%s: action=%3d x=%8f y=%8f t=%8f dx=%8f dy=%8f dt=%8f\n", \ #name, action, x, y, t, dx, dy, dt)); \ \ (uistate.inertia ? gv_transform_incr : gv_transform) \ ( moving, center, useframe, type, fx, fy, fz, dt, NO_KEYWORD ); \ return 1; \ } /* Define Scale Control */ #define DSC(name, func, id, f) \ int name(int action, float x, float y, float t, float dx, float dy, float dt) \ { \ if (action > 0) /* button went down */ \ dx = dy = 0; \ func( id, f(dx,dy) ); \ return 1; \ } static void maybe_scale(int id, float s) { /* If ND-viewing is active, then a scaling motion is very confusing because it only applies to one 3d sub-space. Instead, I change the behaviour of the "scale" button to directly change the ND-transform of "id". FIXME. We should handle this case as motion, but that would require quite some hacks. cH. */ if (drawerstate.NDim > 0) { gv_scale(id, s, s, s); } else { /* only allow mouse scaling in Euclidean space */ if (spaceof(id) == TM_EUCLIDEAN) { gv_transform(id, CENTERID, FOCUSID, SCALE_KEYWORD, s, s, s, 0, NO_KEYWORD); } return; } } static float scaleexp(float dx, float dy) { return exp((dx+dy)/2); } /* * Construct "mot" motion-scaling vector: * mot->z scales motions into the screen: is the frame camera's focal length. * mot->x and mot->y scale motions in the screen plane: * if 'linear', they're spatial distances (for translations); * otherwise, they're tangents of half-angles (for rotations). */ static float getcaminfo(int frame, int linear, Point3 *mot) { float aspect = 1; float focallen = 3; int perspective = 1; float halfyfield = .5; DView *dv = (DView *)drawer_get_object(frame); if(dv != NULL && ISCAM(dv->id)) { CamGet(dv->cam, CAM_ASPECT, &aspect); CamGet(dv->cam, CAM_FOCUS, &focallen); CamGet(dv->cam, CAM_PERSPECTIVE, &perspective); CamGet(dv->cam, CAM_HALFYFIELD, &halfyfield); } if(perspective && linear) halfyfield *= focallen; else if(!perspective && !linear) halfyfield /= focallen; mot->z = focallen; mot->y = halfyfield; mot->x = halfyfield * aspect; return aspect; } /* * Apply constraints to motion. * Change sign if we're moving in the object's own system. * Return the appropriate frame of motion (the camera or SELF). */ static int constrain(Point3 *mot, int framecamera) { if(uistate.constrained) { if(fabs(mot->x) < fabs(mot->y)) mot->x = 0; else mot->y = 0; } if(uistate.ownmotion) return SELF; return framecamera; } static int ROTATION(int action, int center, int frame, float dx, float dy, Point3 *mot) { if (action > 0) /* button went down */ mot->x = mot->y = mot->z = 0; else { float aspect = getcaminfo(frame, ANGULAR, mot); if(drawer_idmatch(center, frame)) { /* If we're rotating about the camera itself (e.g. in fly mode), try to * track the mouse: scale rotation according to angular field of view. */ mot->x *= -dy / aspect; mot->y *= dx * aspect; } else { /* Otherwise, just adjust for non-square windows & hope for the best. */ mot->x = -dy; mot->y = dx * aspect; } mot->z = .5*M_PI*(dx+dy); /* Scale Z-axis motion according to mouse x+y */ /* One full window width = half rotation */ } return constrain(mot, frame); } static int TRANSLATION(int action, int center, int frame, float dx, float dy, Point3 *mot) { if(action > 0) /* button went down */ mot->x = mot->y = mot->z = 0; else { getcaminfo(frame, LINEAR, mot); mot->x *= dx; mot->y *= dy; if(spaceof(frame) != TM_EUCLIDEAN) mot->z = 1; /* This is arbitrary; avoid moving too fast. */ mot->z *= .125 * (dx + dy); } return constrain(mot, frame); } static int STRANSLATION(int action, int center, int frame, float dx, float dy, Point3 *mot) { if(action > 0) /* button went down */ mot->x = mot->y = mot->z = 0; else { getcaminfo(frame, LINEAR, mot); mot->x *= dx; mot->y *= dy; mot->z = .125 * sinh(dx + dy); } return constrain(mot, frame); } #if 0 static int SCALING(int action, int center, int frame, float dx, float dy, Point3 *mot) { float scale; if(action > 0) /* button went down */ mot->x = mot->y = mot->z = 1; else { scale = .5*(dx + dy); mot->x = mot->y = mot->z = 1+scale; } return uistate.ownmotion ? SELF : frame; } #endif /* Kludge to make mouse-driven hyperbolic translations work correctly. If the selected center is literally "target", then translations are done with respect to the universe origin, rather than the object's origin. This is harmless in euclidean mode and important in hyperbolic mode so that wild spinning behavior does not occur. This change was originally in 1.70.1.1, and got lost in the shuffle. (Stuart and Tamara 5/14/93) Thus, Use TCENTERID as center for all translations. */ #define TCENTERID (uistate.centerid == TARGETID && \ drawerstate.space == TM_HYPERBOLIC ? UNIVERSE : CENTERID) /* * CONTROLS: * A control is a function which interprets a single mouse button-combination * action. Controls don't know which button was pressed. * Eventually, picking should be a control. */ /* * PLEASE, DO NOT CHANGE the controls without reading these naming conventions. * * TEST any changes made in hyperbolic and spherical space before installation * * the naming convention for controls: * controls start with 'ctl_' * next comes a letter describing the kind of motion, * e.g. 'r' for rotation or 't' for translation * next comes letters describing which axes are involved. * next comes three letters describing which objects are involved. * 'f' stands for FOCUSID, 'c' stands for CENTERID, 't' stands for TARGETID, * 'g' stands for GEOMID(uistate.targetgeom), and * 'C' stands for CAMID(uistate.targetcam). (there are none of these now) * finally come letters describing how the input is transformed into the * movement: * 'l' stands for linear */ DTC(ctl_rxy_tcf_l, ROTATION, ROTATE_KEYWORD, TARGETID, CENTERID, FOCUSID, X, Y, ZERO) DTC(ctl_rz_tcf_l, ROTATION, ROTATE_KEYWORD, TARGETID, CENTERID, FOCUSID, ZERO, ZERO, Z) DTC(ctl_txy_tcf_l, TRANSLATION, TRANSLATE_KEYWORD, TARGETID, TCENTERID, FOCUSID, X, Y, ZERO) DTC(ctl_tz_tcf_l, TRANSLATION, TRANSLATE_KEYWORD, TARGETID, TCENTERID, FOCUSID, ZERO, ZERO, Z) DTC(ctl_tsxy_tcf_l, STRANSLATION, TRANSLATE_SCALED_KEYWORD, TARGETID, TCENTERID, FOCUSID, X, Y, ZERO) DTC(ctl_tsz_tcf_l, STRANSLATION, TRANSLATE_SCALED_KEYWORD, TARGETID, TCENTERID, FOCUSID, ZERO, ZERO, Z) DTC(ctl_rxy_fff_l, ROTATION, ROTATE_KEYWORD, FOCUSID, FOCUSID, FOCUSID, X, Y, ZERO) DTC(ctl_tz_fff_l, TRANSLATION, TRANSLATE_KEYWORD, FOCUSID, FOCUSID, FOCUSID, ZERO, ZERO, -Z) DTC(ctl_tsz_fcf_l, STRANSLATION, TRANSLATE_SCALED_KEYWORD, FOCUSID, TCENTERID, FOCUSID, ZERO, ZERO, -Z) DTC(ctl_tswz_fff_l, TRANSLATION, TRANSLATE_KEYWORD,FOCUSID,FOCUSID,FOCUSID, ZERO, ZERO, -Z) DTC(ctl_rxy_fcf_l, ROTATION, ROTATE_KEYWORD, FOCUSID, CENTERID, FOCUSID, -X, -Y, ZERO) DSC(ctl_z_l, gv_zoom, FOCUSID, scaleexp) /* maybe_scale(), defined above, prevents scaling in non-Euclidean spaces */ DSC(ctl_s_l, maybe_scale, TARGETGEOMID, scaleexp) /* * Bindings: * Controls are bound together in useful functional groups (motion modes). * This binding is really a part of the user interface. */ boundctl bound_rotations[] = { {"leftmouse", ctl_rxy_tcf_l, FAST}, {"middlemouse", ctl_rz_tcf_l, FAST}, {"shift leftmouse", ctl_rxy_tcf_l, SLOW}, {"shift middlemouse", ctl_rz_tcf_l, SLOW}, {NULL, NULL} }; boundctl bound_translations[] = { {"leftmouse", ctl_txy_tcf_l, FAST}, {"middlemouse", ctl_tz_tcf_l, FAST}, {"shift leftmouse", ctl_txy_tcf_l, SLOW}, {"shift middlemouse", ctl_tz_tcf_l, SLOW}, {NULL, NULL} }; boundctl bound_stranslations[] = { /* Not used now - slevy 10/93 */ {"leftmouse", ctl_tsxy_tcf_l, FAST}, {"middlemouse", ctl_tsz_tcf_l, FAST}, {"shift leftmouse", ctl_tsxy_tcf_l, SLOW}, {"shift middlemouse", ctl_tsz_tcf_l, SLOW}, {NULL, NULL} }; boundctl bound_fly[] = { {"leftmouse", ctl_rxy_fff_l, FAST}, {"middlemouse", ctl_tswz_fff_l, FAST}, {"shift leftmouse", ctl_rxy_fff_l, SLOW}, {"shift middlemouse", ctl_tswz_fff_l, SLOW}, {NULL, NULL} }; boundctl bound_orbit[] = { {"leftmouse", ctl_rxy_fcf_l, FAST}, {"middlemouse", ctl_tsz_fcf_l, FAST}, {"shift leftmouse", ctl_rxy_fcf_l, SLOW}, {"shift middlemouse", ctl_tsz_fcf_l, SLOW}, {NULL, NULL} }; boundctl bound_zoom[] = { {"leftmouse", ctl_z_l, FAST}, {NULL, NULL} }; boundctl bound_scale[] = { {"leftmouse", ctl_s_l, FAST}, {NULL, NULL} }; int minterp_rotate(Event *event) { return minterp_switch(event, bound_rotations);} int minterp_translate(Event *event) /* not currently used */ {return minterp_switch(event, bound_translations);} int minterp_stranslate(Event *event) {return minterp_switch(event, bound_stranslations);} int minterp_fly(Event *event) {return minterp_switch(event, bound_fly);} int minterp_orbit(Event *event) {return minterp_switch(event, bound_orbit);} int minterp_zoom(Event *event) {return minterp_switch(event, bound_zoom);} int minterp_scale(Event *event) {return minterp_switch(event, bound_scale);} #if EXPERIMENTAL_MOTION_AVERAGING /* Ring buffer for motion averaging. * For estimating speed for inertial motion when we release the mouse. * Just extrapolating the last mouse delta may fail if we're redrawing * very quickly. So we keep more samples, and extrapolate motion over the * last redraw cycle or last human-reasonable time (.1 second), * whichever is longer. */ #define NMOTE 8 /* Must be a power of two */ #define MODMOTE(x) ((x) & (NMOTE-1)) static struct mote { float dx, dy; long dt; } mote[NMOTE]; static int mo; #endif static int minterp_switch(Event *event, boundctl *ctls) { int i; float x, y, dx, dy; long dt; char buttonsdown[100]; PRINT_EVENT(("minterp_switch", event)); D1PRINT(("interp_switch: ctls->buttons = %s\n", ctls->buttons)); strcpy(buttonsdown, ""); mousedisp(event, &dx, &dy, (unsigned long *)&dt, &drawerstate.winpos); D1PRINT(("minterp_switch: mousedisp returned : dx = %10f, dy = %10f, dt = %ld\n", dx, dy, dt)); if(dt <= 0 && !(dt == 0 && dx == 0 && dy == 0)) { /* Discredit it if -- * time is flowing backwards, or * we're being asked for finite motion in zero time. */ return 0; } #if EXPERIMENTAL_MOTION_AVERAGING mo = MODMOTE(mo+1); mote[mo].dx = dx; mote[mo].dy = dy; mote[mo].dt = dt; if(event->val == 0) { /* Mouse release: use recently-averaged dt to extrapolate * continuing motion. */ for(i = 1; i < NMOTE; i++) { struct mote *m = &mote[MODMOTE(mo-i)]; if(dt + m->dt > uistate.cursor_still) break; dx += m->dx; dy += m->dy; dt += m->dt; } i; /* For debugging */ } #endif mousemap(event->x, event->y, &x, &y, &drawerstate.winpos); if (button.shift) strcat(buttonsdown, "shift "); if (button.ctrl) strcat(buttonsdown, "ctrl "); if (button.left) strcat(buttonsdown, "leftmouse "); if (button.middle) strcat(buttonsdown, "middlemouse "); if(buttonsdown[0] != '\0') buttonsdown[strlen(buttonsdown)-1] = '\0'; for (i = 0; ctls[i].buttons != NULL; i++) { if (!strcmp(ctls[i].buttons, buttonsdown)) { return (ctls[i].function)(event->val, x,y,event->t, dx,dy, dt*.001/ctls[i].rate); } } return 0; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/motion.h0000644000175000001440000000235710455700776016435 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MOTION_H #define MOTION_H int minterp_rotate(Event *event); int minterp_translate(Event *event); int minterp_stranslate(Event *event); int minterp_fly(Event *event); int minterp_orbit(Event *event); int minterp_zoom(Event *event); int minterp_scale(Event *event); #endif /* ! MOTION_H */ geomview-1.9.4/src/bin/geomview/common/lang.c0000644000175000001440000002541410622716744016041 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include #ifndef NeXT #include #endif /*#include */ #include #include #include #include #include #include "ooglutil.h" #include "drawer.h" #include "lisp.h" #include "lispext.h" #include "lang.h" #include "event.h" #include "ui.h" #include "comm.h" #include "streampool.h" #include "handleP.h" #include "transform.h" #include "mgrib.h" #include "version.h" #include "clang.c" /* do-lang, do-lang, do-lang... */ char geomview_version[] = GEOMVIEW_VERSION; extern char *buildinfographics; /* Possibly initialized elsewhere */ void lang_init() { LInit(); lispext_init(); clang_init(); /* * Functions that don't use LDECLARE need to be LDefun'ed * here because they are not part of the "clang" interface. */ { extern LObject *Lread(Lake *, LList *); extern char Hread[]; extern LObject *Lmerge(Lake *, LList *); extern char Hmerge[]; extern LObject *Lhdefine(Lake *, LList *); extern char Hhdefine[]; extern LObject *LND_xform(Lake *, LList *); extern char HND_xform[]; LDefun("read", Lread, Hread); LDefun("merge", Lmerge, Hmerge); LDefun("hdefine", Lhdefine, Hhdefine); } /* * Define the language keywords */ define_keyword("yes", YES_KEYWORD); define_keyword("no", NO_KEYWORD); define_keyword("on", ON_KEYWORD); define_keyword("off", OFF_KEYWORD); define_keyword("0", ZERO_KEYWORD); define_keyword("1", ONE_KEYWORD); define_keyword("none", NONE_KEYWORD); define_keyword("each", EACH_KEYWORD); define_keyword("keep", KEEP_KEYWORD); define_keyword("all", ALL_KEYWORD); define_keyword("euclidean", EUCLIDEAN_KEYWORD); define_keyword("hyperbolic", HYPERBOLIC_KEYWORD); define_keyword("spherical", SPHERICAL_KEYWORD); define_keyword("virtual", VIRTUAL_KEYWORD); define_keyword("projective", PROJECTIVE_KEYWORD); define_keyword("conformal-ball", CONFORMALBALL_KEYWORD); define_keyword("conformal", CONFORMALBALL_KEYWORD); define_keyword("tiff", TIFF_KEYWORD); define_keyword("frame", FRAME_KEYWORD); define_keyword("camera", CAMERA_KEYWORD); define_keyword("geometry", GEOM_KEYWORD); define_keyword("transform", TRANSFORM_KEYWORD); define_keyword("ntransform", NTRANSFORM_KEYWORD); define_keyword("command", COMMAND_KEYWORD); define_keyword("window", WINDOW_KEYWORD); define_keyword("image", IMAGE_KEYWORD); define_keyword("appearance", APPEARANCE_KEYWORD); define_keyword("translate", TRANSLATE_KEYWORD); define_keyword("e-translate", E_TRANSLATE_KEYWORD); define_keyword("h-translate", H_TRANSLATE_KEYWORD); define_keyword("s-translate", S_TRANSLATE_KEYWORD); define_keyword("translate-scaled", TRANSLATE_SCALED_KEYWORD); define_keyword("e-translate-scaled", E_TRANSLATE_SCALED_KEYWORD); define_keyword("h-translate-scaled", H_TRANSLATE_SCALED_KEYWORD); define_keyword("s-translate-scaled", S_TRANSLATE_SCALED_KEYWORD); define_keyword("rotate", ROTATE_KEYWORD); define_keyword("scale", SCALE_KEYWORD); define_keyword("zoom", ZOOM_KEYWORD); define_keyword("horizontal", HORIZONTAL_KEYWORD); define_keyword("vertical", VERTICAL_KEYWORD); define_keyword("colored", COLORED_KEYWORD); define_keyword("toggle", TOGGLE_KEYWORD); define_keyword("smooth", SMOOTH_KEYWORD); define_keyword("bbox-center", BBOX_CENTER_KEYWORD); define_keyword("origin", ORIGIN_KEYWORD); define_keyword("focus-change", FOCUS_CHANGE_KEYWORD); define_keyword("mouse-cross", MOUSE_CROSS_KEYWORD); define_keyword("inertia", MOTION_INERTIA_KEYWORD); define_keyword("constrain", MOTION_CONSTRAIN_KEYWORD); define_keyword("own-coordinates", MOTION_OWN_COORDS_KEYWORD); /* * Define various synonyms */ LDefun("!", Lshell, "! is a synonym for \"shell\""); LDefun("|", Lemodule_run, "| is a synonym for \"emodule-run\""); LDefun("ui-emotion-program", Lui_emodule_define, "ui-emotion-program is an obsolete command.\n\ Use its new eqivalent \"emodule-define\" instead."); LDefun("ui-emotion-run", Lui_emodule_start, "ui-emotion-run is an obsolete command.\n\ Use its new eqivalent \"emodule_start\" instead."); LDefun("quit", Lexit, "quit is a synonym for \"exit\""); LDefun("merge-base-ap", Lmerge_baseap, "merge-base-ap is a synonym for merge-baseap."); /* * And some extra help entries. */ LHelpDef("ID", "ID is a string which names a geometry or camera. Besides\n\ those you create, valid ones are:\n\ \n\ World, world,\n\ worldgeom, g0: the collection of all geom's\n\ target: selected target object (cam or geom)\n\ center: selected center-of-motion object\n\ targetcam: last selected target camera\n\ targetgeom: last selected target geom\n\ focus: camera where cursor is (or most\n\ recently was)\n\ allgeoms: all geom objects\n\ allcams: all cameras\n\ default, defaultcam: prototype; future cameras inherit\n\ default's settings\n\ \n\ The following IDs are used to name coordinate systems,\n\ e.g. in \"pick\" and \"write\" commands:\n\ \n\ world, World, etc.: the world, within which all other\n\ geoms live.\n\ universe, Universe: the universe, in which the World, lights\n\ and cameras live. Cameras' world2cam\n\ transforms might better be called\n\ universe2cam, etc.\n\ self: \"this geomview object\". Transform from\n\ an object to \"self\" is the identity;\n\ writing its geometry gives the object\n\ itself with no enclosing transform;\n\ picked points appear in the object's\n\ coordinates.\n\ primitive: (for \"pick\" only) Picked points appear in\n\ the coordinate system of the\n\ lowest-level OOGL primitive.\n\ \n\ A name is also an acceptable id. Given names are made unique\n\ by appending numbers if necessary (i.e. \"foo<2>\"). Every geom\n\ is also named g[n] and every camera is also named c[n] (\"g0\"\n\ is always the worldgeom): this name is used as a prefix to\n\ keyboard commands and can also be used as a command language\n\ id. Numbers are reused after an object is deleted. Both names\n\ are shown in the Object browser."); LHelpDef("CAM-ID", "CAM-ID is an ID that refers to a camera."); LHelpDef("GEOM-ID", "GEOM-ID is an ID that refers to a geometry."); LHelpDef("GEOMETRY", "GEOMETRY is an OOGL geometry specification."); LHelpDef("CAMERA", "CAMERA is an OOGL camera specification."); LHelpDef("APPEARANCE", "APPEARANCE is an OOGL appearance specification."); LHelpDef("TRANSFORM", "TRANSFORM is an OOGL 4x4 transformation matrix."); } HandleOps *keyword2ops(Keyword keyword) { switch (keyword) { case CAMERA_KEYWORD: return &CamOps; case GEOM_KEYWORD: return &GeomOps; case TRANSFORM_KEYWORD: return &TransOps; case NTRANSFORM_KEYWORD: return &NTransOps; case COMMAND_KEYWORD: return &CommandOps; case WINDOW_KEYWORD: return &WindowOps; case APPEARANCE_KEYWORD: return &AppearanceOps; case IMAGE_KEYWORD: return &ImageOps; default: return NULL; } } /**********************************************************************/ LDEFINE(shell, LVOID, "(shell SHELL-COMMAND)\n\ Execute the given UNIX SHELL-COMMAND using /bin/sh. Geomview\n\ waits for it to complete and will be unresponsive until it does.") { char *cmd; int status; void (*oldsigchld)(); LDECLARE(("shell", LBEGIN, LSTRINGS, &cmd, LEND)); oldsigchld = signal(SIGCHLD, SIG_DFL); status = system(cmd); signal(SIGCHLD, oldsigchld); return LNew(LINT, &status); } LDEFINE(write_sexpr, LVOID, "(write-sexpr FILENAME LISPOBJECT)\n\ Writes the given LISPOBJECT to FILENAME. This function is intended\n\ for internal debugging use only.") { LObject *obj; char *filename; LDECLARE(("write-sexpr", LBEGIN, LSTRING, &filename, LHOLD, LLOBJECT, &obj, LEND)); LWriteFile(filename, obj); return Lt; } LDEFINE(write_handle, LVOID, "(write-handle PREFIX FILENAME HANDLE)\n" "Writes the object underlying the given handle to FILENAME." "This function is intended for internal debugging use only.") { char *prefix, *filename, *handle; Handle *h; HandleOps *ops; Pool *p; LDECLARE(("write-handle", LBEGIN, LSTRING, &prefix, LSTRING, &filename, LSTRING, &handle, LEND)); if ((ops = HandleOpsByName(prefix)) != NULL && (h = HandleByName(handle, ops)) != NULL) { REFPUT(h); if (h->ops->strmout) { p = PoolStreamTemp(filename, NULL, NULL, 1, &CommandOps); h->ops->strmout(p, h, HandleObject(h)); PoolClose(p); PoolDelete(p); } } else { OOGLWarn("Cannot find handle \"%s@%s\"", handle, prefix); } return Lt; } LDEFINE(dump_handles, LVOID, "(dump-handles)\n" "Dump the list of currently active handles to stdout." "This function is intended for internal debugging use only.") { extern void handle_dump(void); LDECLARE(("dump-handles", LBEGIN, LEND)); handle_dump(); return Lt; } LDEFINE(geomview_version, LSTRING, "(geomview-version)\n\ Returns a string representing the version of geomview that is\n\ running.") { char buf[128]; char *s; LDECLARE(("geomview-version", LBEGIN, LEND)); sprintf(buf, buildinfographics ? "%s-%s" : "%s", geomview_version, buildinfographics); s = strdup(buf); return LNew( LSTRING, &s ); } bool boolval(char *s, Keyword keyword) { switch (keyword) { case YES_KEYWORD: case ON_KEYWORD: case ONE_KEYWORD: return true; case NO_KEYWORD: case OFF_KEYWORD: case ZERO_KEYWORD: return false; default: fprintf(stderr, "%s: %s is not a boolean keyword; assuming \"no\"\n", s, keywordname(keyword)); return false; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/lang.h0000644000175000001440000000415710622716744016047 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef LANG_H #define LANG_H extern char geomview_version[]; typedef enum { NO_KEYWORD=0, YES_KEYWORD, ON_KEYWORD, OFF_KEYWORD, ZERO_KEYWORD, ONE_KEYWORD, NONE_KEYWORD, EACH_KEYWORD, KEEP_KEYWORD, ALL_KEYWORD, EUCLIDEAN_KEYWORD, HYPERBOLIC_KEYWORD, SPHERICAL_KEYWORD, VIRTUAL_KEYWORD, PROJECTIVE_KEYWORD, CONFORMALBALL_KEYWORD, TIFF_KEYWORD, FRAME_KEYWORD, CAMERA_KEYWORD, GEOM_KEYWORD, TRANSFORM_KEYWORD, NTRANSFORM_KEYWORD, COMMAND_KEYWORD, WINDOW_KEYWORD, IMAGE_KEYWORD, APPEARANCE_KEYWORD, TRANSLATE_KEYWORD, E_TRANSLATE_KEYWORD, H_TRANSLATE_KEYWORD, S_TRANSLATE_KEYWORD, TRANSLATE_SCALED_KEYWORD, E_TRANSLATE_SCALED_KEYWORD, H_TRANSLATE_SCALED_KEYWORD, S_TRANSLATE_SCALED_KEYWORD, ROTATE_KEYWORD, SCALE_KEYWORD, ZOOM_KEYWORD, HORIZONTAL_KEYWORD, VERTICAL_KEYWORD, COLORED_KEYWORD, TOGGLE_KEYWORD, SMOOTH_KEYWORD, BBOX_CENTER_KEYWORD, ORIGIN_KEYWORD, FOCUS_CHANGE_KEYWORD, MOUSE_CROSS_KEYWORD, MOTION_INERTIA_KEYWORD, MOTION_CONSTRAIN_KEYWORD, MOTION_OWN_COORDS_KEYWORD } Keyword; void lang_init(); bool boolval(char *s, Keyword keyword); HandleOps *keyword2ops(Keyword keyword); #endif geomview-1.9.4/src/bin/geomview/common/main.c0000644000175000001440000002372010632560323016031 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* static char *copyright = "Copyright (C) 1992 The Geometry Center"; currently unused*/ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include "drawer.h" #include "event.h" #include "main.h" #include "ui.h" #include "comm.h" #include "geom.h" #include "camera.h" #include "pick.h" #include #include #include #include #include #include #ifdef NeXT #include #else #include #endif #if HAVE_LOCALE_H # include #endif #define STREQ(s1,s2) (strcmp(s1,s2)==0) static char *initfilename = ".geomview"; char *geomview_system_initfile = NULL; int do_init = 1; Color initial_defaultbackcolor = {1.0/3.0, 1.0/3.0, 1.0/3.0 }; static char *pipesubdir = "geomview"; int gv_nwins = 1; int gv_no_opengl = 0; vvec vv_load_path; vvec vv_emodule_path; /* Default backstop appearance */ static char apdefault[] = "\ appearance { \ +face \ -edge \ +vect \ normscale 1.0 \ linewidth 1 \ patchdice 10 10 \ -normal \ +evert \ shading flat \ -transparent \ material { \ kd 1.0 diffuse 1 1 1 \ ka 0.3 ambient 1 1 1 \ ks 0.3 specular 1 1 1 \ shininess 15 \ edgecolor 0 0 0 \ normalcolor 1 1 1 \ alpha 1 \ } \ lighting { \ ambient .2 .2 .2 \ replacelights \ light { color .75 .75 .75 position 0 0 10 0 } \ light { color .6 .6 .6 position 0 1 -1 0 } \ light { color .4 .4 .4 position 1 -2 -1 0 } \ } \ }"; /* * Default geometry to use when drawing cameras. */ static char defaultcam[] = "\ appearance {linewidth 4}\n\ VECT\n\ 7 17 4\n\ 2 2 2 2 2 2 5\n\ 1 1 1 0 0 0 1\n\ -.5 -.5 -.5 0 -.5 -.5\n\ -.5 -.5 -.5 -.5 0 -.5\n\ 0 0 0 .5 .5 -.5\n\ 0 0 0 -.5 -.5 -.5\n\ 0 0 0 -.5 .5 -.5\n\ 0 0 0 .5 -.5 -.5\n\ -.5 0 -.5 -.5 .5 -.5 .5 .5 -.5 .5 -.5 -.5 0 -.5 -.5\n\ 1 0 0 1\n\ 0 1 0 1\n\ 0 0 1 1\n\ 0 0 0 1"; static char windefault[] = "{ size 450 450 resize }"; void usage(char *me, char *morestuff) { fprintf(stderr, "\ Usage: %s [-b r g b] [-c commandfile] [-wins #windows]\n\ [-nopanels] [-noinit] [-noopengl]\n\ [-wpos width,height[@xmin,ymin]] [-wpos -] [-M[gc][sp] pipename]\n\ [-start external-module-string args ... --]\n\ [-run external-module-pathname args ... --]\n\ %s [ file ... ]\n", me, morestuff); exit(1); } static void parse_emodule(int room, int *acp, char ***avp, char *first, char *firstname, char *indir) { int i; char *cmd; char *next; emodule new; int baselen; for (i = 1; i <= *acp && !STREQ((next = (*avp)[i]), "--"); i++) room += strlen(next)+1+1; if (room) { cmd = OOGLNewNE(char, room, "emod cmd"); if (first) { strcpy(cmd, first); strcat(cmd, " "); } else cmd[0] = '\0'; baselen = strlen(cmd); while (*acp > 0 && !STREQ((next = *++(*avp)), "--")) { strcat(cmd, next); strcat(cmd, " "); (*acp)--; } new.text = strdup(cmd); if(firstname) { new.name = OOGLNewNE(char, room + strlen(firstname) + 1, "emod name"); sprintf(new.name, "%s %s", firstname, cmd+baselen); } else { new.name = strdup(cmd); } new.data = NULL; new.dir = indir; emodule_run(&new); } } int parse_common_arg(int *acp, char ***avp) { int ac = *acp; char **av = *avp; char *arg = *av; int ok = 1; int i; if (STREQ(arg,"-b") && (ac-=3) > 0) { initial_defaultbackcolor.r = atof(*++av); initial_defaultbackcolor.g = atof(*++av); initial_defaultbackcolor.b = atof(*++av); drawer_color(DEFAULTCAMID, DRAWER_BACKCOLOR, &initial_defaultbackcolor); } else if(STREQ(arg, "-wins") && --ac > 0) { gv_nwins = atoi(*++av); } else if((STREQ(arg, "-wpos") || STREQ(arg, "-w")) && --ac > 0) { WindowStruct ws; WnPosition wp; int a1,a2,a3,a4; char ch; static char rats[] = "geomview: -wpos: expected width,height[@xmin,ymin]"; ws.wn = WnCreate(WN_ENLARGE, 1, WN_SHRINK, 1, WN_END); ws.h = NULL; switch(sscanf(*++av, "%d%*c%d%c%d%*c%d", &a1,&a2,&ch,&a3,&a4)) { case 2: WnSet(ws.wn, WN_XSIZE, a1, WN_YSIZE, a2, WN_END); break; case 1: wp.xmin = a1; if((ac -= 3) < 0) { OOGLError(0, rats); exit(1); } wp.ymin = atoi(*++av); wp.xmax = wp.xmin + atoi(*++av)-1; wp.ymax = wp.ymin + atoi(*++av)-1; break; case 5: if(ch == '@') { /* xsize,ysize@xmin,ymin */ wp.xmin = a3; wp.xmax = a3 + a1-1; wp.ymin = a4; wp.ymax = a4 + a2-1; } else { /* xmin,ymin,xsize,ysize */ wp.xmin = a1; wp.ymin = a2; wp.xmax = a1+a3-1; wp.ymax = a2+a4-1; } WnSet(ws.wn, WN_PREFPOS, &wp, WN_END); break; default: if(!STREQ(arg, "-")) { OOGLError(0, rats); exit(1); } /* "-" => interactive positioning -- fall through */ } gv_window(DEFAULTCAMID, &ws); } else if(STREQ(arg, "-debug")) { /* -debug -- don't catch SIGINT, SIGSEGV, etc. signals */ /* -debug and -noopengl are handled in init_geomview() gv_debug = 1; */ } else if (STREQ(arg, "-noopengl")) { /* -debug and -noopengl are handled in init_geomview() gv_no_opengl = 1; */ } else if(STREQ(arg, "-c") && --ac > 0) { /* -c -- Process command file (or string) */ gv_load(*++av, "command"); } else if(!strncmp(arg, "-M", 2) && --ac > 0) { /* -M[cg][ps[un|in|in6]] pipename|port -- external connection */ char pipedir[PATH_MAX]; char *tmpdir = getenv("TMPDIR"); if (tmpdir == NULL) { tmpdir = "/tmp"; } snprintf(pipedir, PATH_MAX, "%s/%s", tmpdir, pipesubdir); usepipe(pipedir, *++av, &arg[2]); } else if(strncmp(arg, "-nop", 4) == 0) { /* "-nopanels" */ /* -nopanels -- Suppress all possible panels */ for(i=0; i<30; i++) ui_showpanel(i, 0); } else if(STREQ(arg, "-e") && --ac > 0) { /* -e -- start an e-module with no arguments */ gv_ui_emodule_start(*++av); } else if(STREQ(arg, "-start") && --ac > 0) { /* -start emodule-name args ... */ emodule *old; int room; char *name; ui_emodule_index((name = *++av), &old); if (old) { room = strlen(old->text) +1 +1; ac--; parse_emodule(room, &ac, &av, old->text, old->name, old->dir); } else { OOGLError(0, "No external module named %s.", name); } } else if(STREQ(arg, "-run") && --ac > 0) { /* -run program-name args ... -- run program as e-module */ parse_emodule(0, &ac, &av, NULL, NULL, NULL); } else if(STREQ(arg, "-time")) { /* Enable timing as with ctrl-T */ timing(999999); } else if(STREQ(arg, "-noinit")) { /* Don't read any initialization files */ do_init = 0; } else if(arg[0] == '-' && arg[1] != '\0') { ok = 0; /* Unrecognized */ } else { gv_load(arg, NULL); } *acp = ac; *avp = av; return ok; } void init_geomview(int argc, char **argv) { char *userhome, homefile[512], dotfile[512]; struct stat homebuf, dotbuf; int i, homestat, dotstat; #if HAVE_SETLOCALE && HAVE_DECL_LC_ALL setlocale(LC_ALL, "POSIX"); #endif if (getenv("GEOMVIEW_DEBUG")) gv_debug = 1; if (getenv("GEOMVIEW_NO_OPENGL")) gv_no_opengl = 1; for(i = 1; i < argc; i++) if(STREQ(argv[i], "-noinit")) do_init = 0; else if(STREQ(argv[i], "-debug")) gv_debug = 1; else if(STREQ(argv[i], "-noopengl")) gv_no_opengl = 1; drawer_init(apdefault, defaultcam, windefault); comm_init(); event_init(); ui_init(); VVINIT(vv_load_path, char *, 3); VVINIT(vv_emodule_path, char *, 3); /* env_init() should arrange for vv_load_path, vv_emodule_path, and geomview_system_initfile to be set to whatever default values are appropriate for the environment. On the IRIS this is done through environment variables set in a driving shell script (the IRIS version of env_init() is in gl/glmain.c). The NeXT uses a CONFIG.gv script in the Geomview.app wrapper. */ env_init(); if(do_init) { /* load system init file, if present */ if (geomview_system_initfile) { if (access(geomview_system_initfile, R_OK) == 0) { gv_load(geomview_system_initfile, "command"); } } /* now load ~/.geomview and ./.geomview, in that order, if present, unless they are the same, in which case just load once */ userhome = getenv("HOME"); sprintf(homefile,"%s/%s", userhome, initfilename); sprintf(dotfile,"./%s", initfilename); homestat = stat(homefile, &homebuf); dotstat = stat(dotfile, &dotbuf); if (homestat == 0) { if (access(homefile, R_OK) == 0) gv_load(homefile, "command"); else OOGLError(0, "Warning: file %s present but unreadable; ignoring it.", homefile); } if ( (dotstat == 0) && ( (dotbuf.st_dev != homebuf.st_dev) || (dotbuf.st_ino != homebuf.st_ino))) { if (access(dotfile, R_OK) == 0) gv_load(dotfile, "command"); else OOGLError(0, "Warning: file %s present but unreadable; ignoring it.", dotfile); } } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/main.h0000644000175000001440000000270510564604557016052 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include "handle.h" extern void usepipe(char *pipedir, char *pipename, char *pipetype); extern void init_geomview(int argc, char **argv); extern void usage(char *me, char *morestuff); extern int parse_common_arg(int *acp, char ***avp); extern char *geomview_system_initfile; extern vvec vv_load_path; extern vvec vv_emodule_path; #define load_path VVEC(vv_load_path, char *) #define load_path_count VVCOUNT(vv_load_path) #define emodule_path VVEC(vv_emodule_path, char *) #define emodule_path_count VVCOUNT(vv_emodule_path) extern int gv_nwins; extern int gv_no_opengl; geomview-1.9.4/src/bin/geomview/common/lispext.c0000644000175000001440000004600410624013730016571 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * geomview custom lisp object types */ #include #include #include #include #include "ooglutil.h" #include "drawer.h" #include "lisp.h" #include "lispext.h" #include "streampool.h" #include "handleP.h" #include "camera.h" #include "geom.h" #include "appearance.h" #include "window.h" #include "transform.h" #include "fsa.h" #include "lang.h" #include "freelist.h" extern HandleOps GeomOps, CamOps, WindowOps; extern HandleOps TransOps, NTransOps, ImageOps, AppearanceOps; LObject *L0, *L1; static Fsa lang_fsa = NULL; #define REJECT -1 static char **keyword_names; static int n_keywords; static DEF_FREELIST(HandleRefStruct); static DEF_FREELIST(TransformStruct); #ifdef NEW # undef NEW #endif #define NEW(type, name) \ { \ HandleRefStruct *hrname; \ FREELIST_NEW(HandleRefStruct, hrname); \ name = (type##Struct *)hrname; \ } #ifdef DELETE # undef DELETE #endif #define DELETE(name) FREELIST_FREE(HandleRefStruct, name) /************************************************************************ CAMERA LISP OBJECT ************************************************************************/ static CameraStruct *camcopy(CameraStruct *old) { CameraStruct *newc; NEW(Camera, newc); if(old) *newc = *old; else newc->cam = NULL, newc->h = NULL; if (newc->cam) RefIncr((Ref*)(newc->cam)); if (newc->h) RefIncr((Ref*)newc->h); return newc; } static bool camfromobj(LObject *obj, CameraStruct **x) { if (obj->type != LCAMERA) return 0; *x = LCAMERAVAL(obj); return 1; } static LObject *cam2obj(CameraStruct **x) { CameraStruct *copy = camcopy(*x); return LNew( LCAMERA, © ); } static void camfree(CameraStruct **x) { if (*x) { if ((*x)->cam) CamDelete( (*x)->cam ); if ((*x)->h) HandleDelete( (*x)->h ); DELETE(*x); } } static bool cammatch(CameraStruct **a, CameraStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return 1; if ((*a)->cam && ((*a)->cam == (*b)->cam)) return 1; return 0; } static void camwrite(FILE *fp, CameraStruct **x) { CamFSave( (*x)->cam, fp, "lisp output stream" ); } static void campull(va_list *a_list, CameraStruct **x) { *x = va_arg(*a_list, CameraStruct*); } static LObject *camparse(Lake *lake) { CameraStruct *newc; NEW(Camera, newc); newc->h = NULL; newc->cam = NULL; if (CamOps.strmin(POOL(lake), (Handle **)&newc->h, (Ref **)(void *)&(newc->cam)) == 0) { return Lnil; } else if(newc->h && !newc->h->permanent) { HandleDelete(newc->h); newc->h = NULL; } return LNew( LCAMERA, &newc ); } LType LCamerap = { "camera", sizeof(CameraStruct*), camfromobj, cam2obj, camfree, camwrite, cammatch, campull, camparse, LTypeMagic }; /************************************************************************ * WINDOW LISP OBJECT * ************************************************************************/ static WindowStruct *wncopy(WindowStruct *old) { WindowStruct *neww; NEW(Window, neww); if(old) *neww = *old; else neww->wn = NULL, neww->h = NULL; if (neww->wn) RefIncr((Ref*)(neww->wn)); if (neww->h) RefIncr((Ref*)neww->h); return neww; } static bool wnfromobj(LObject *obj, WindowStruct **x) { if (obj->type != LWINDOW) return 0; *x = LWINDOWVAL(obj); return 1; } static LObject *wn2obj(WindowStruct **x) { WindowStruct *copy = wncopy(*x); return LNew( LWINDOW, © ); } static void wnfree(WindowStruct **x) { if (*x) { if ((*x)->wn) WnDelete( (*x)->wn ); if ((*x)->h) HandleDelete( (*x)->h ); DELETE(*x); } } static bool wnmatch(WindowStruct **a, WindowStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return 1; if ((*a)->wn && ((*a)->wn == (*b)->wn)) return 1; return 0; } static void wnwrite(FILE *fp, WindowStruct * *x) { Pool *p = PoolStreamTemp("", NULL, fp, 1, &WindowOps); if(p == NULL) return; (void) WnStreamOut(p, (*x)->h, (*x)->wn); PoolDelete(p); } static void wnpull(va_list *a_list, WindowStruct **x) { *x = va_arg(*a_list, WindowStruct*); } static LObject *wnparse(Lake *lake) { WindowStruct *neww; NEW(Window, neww); neww->h = NULL; neww->wn = NULL; if (WindowOps.strmin(POOL(lake),(Handle **)&neww->h, (Ref **)(void *)&(neww->wn)) == 0) { return Lnil; } else if(neww->h && !neww->h->permanent) { HandleDelete(neww->h); neww->h = NULL; } return LNew( LWINDOW, &neww ); } LType LWindowp = { "window", sizeof(WindowStruct*), wnfromobj, wn2obj, wnfree, wnwrite, wnmatch, wnpull, wnparse, LTypeMagic }; /************************************************************************ * GEOM LISP OBJECT * ************************************************************************/ static GeomStruct *geomcopy(GeomStruct *old) { GeomStruct *newg; NEW(Geom, newg); if(old) *newg = *old; else newg->geom = NULL, newg->h = NULL; if (newg->geom) RefIncr((Ref*)(newg->geom)); if (newg->h) RefIncr((Ref*)newg->h); return newg; } static bool geomfromobj(LObject *obj, GeomStruct **x) { if (obj->type != LGEOM) return 0; *x = LGEOMVAL(obj); return 1; } static LObject *geom2obj(GeomStruct **x) { GeomStruct *copy = geomcopy(*x); return LNew( LGEOM, © ); } static void geomfree(GeomStruct **x) { if (*x) { if ((*x)->geom) GeomDelete( (*x)->geom ); if ((*x)->h) HandleDelete( (*x)->h ); DELETE(*x); } } static bool geommatch(GeomStruct **a, GeomStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return 1; if ((*a)->geom && ((*a)->geom == (*b)->geom)) return 1; return 0; } static void geomwrite(FILE *fp, GeomStruct **x) { GeomFSave( (*x)->geom, fp, "lisp output stream" ); } static void geompull(va_list *a_list, GeomStruct **x) { *x = va_arg(*a_list, GeomStruct*); } static LObject *geomparse(Lake *lake) { GeomStruct *newg; NEW(Geom, newg); newg->h = NULL; newg->geom = NULL; if (GeomOps.strmin(POOL(lake), (Handle **)&newg->h, (Ref **)(void *)&(newg->geom)) == 0) { return Lnil; } else { if(newg->h && !newg->h->permanent) { HandleDelete(newg->h); newg->h = NULL; } return LNew( LGEOM, &newg ); } } LType LGeomp = { "geometry", sizeof(GeomStruct*), geomfromobj, geom2obj, geomfree, geomwrite, geommatch, geompull, geomparse, LTypeMagic }; /************************************************************************ * AP LISP OBJECT * ************************************************************************/ static ApStruct *apcopy(ApStruct *old) { ApStruct *newap; NEW(Ap, newap); if(old) *newap = *old; else newap->ap = NULL, newap->h = NULL; if (newap->ap) RefIncr((Ref*)(newap->ap)); if (newap->h) RefIncr((Ref*)newap->h); return newap; } static bool apfromobj(LObject *obj, ApStruct **x) { if (obj->type != LAP) return 0; *x = LAPVAL(obj); return 1; } static LObject *ap2obj(ApStruct **x) { ApStruct *copy = apcopy(*x); return LNew( LAP, © ); } static void apfree(ApStruct **x) { if (*x) { if ((*x)->ap) ApDelete( (*x)->ap ); if ((*x)->h) HandleDelete( (*x)->h ); DELETE(*x); } } static bool apmatch(ApStruct **a, ApStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return 1; if ((*a)->ap && ((*a)->ap == (*b)->ap)) return 1; return 0; } static void apwrite(FILE *fp, ApStruct * *x) { ApFSave((*x)->ap, fp, "lisp output stream"); } static void appull(va_list *a_list, ApStruct **x) { *x = va_arg(*a_list, ApStruct*); } static LObject *apparse(Lake *lake) { ApStruct *newap; NEW(Ap, newap); newap->h = NULL; newap->ap = NULL; if (ApStreamIn(POOL(lake), &newap->h, &(newap->ap)) == 0) { return Lnil; } else if(newap->h && !newap->h->permanent) { HandleDelete(newap->h); newap->h = NULL; } return LNew( LAP, &newap ); } LType LApp = { "ap", sizeof(ApStruct *), apfromobj, ap2obj, apfree, apwrite, apmatch, appull, apparse, LTypeMagic }; /************************************************************************ * TRANSFORM LISP OBJECT * ************************************************************************/ static TransformStruct *tmcopy(TransformStruct *old) { TransformStruct *newt; FREELIST_NEW(TransformStruct, newt); if (old) *newt = *old; else newt->h = NULL; if (newt->h) RefIncr((Ref*)newt->h); return newt; } static bool tmfromobj(LObject *obj, TransformStruct **x) { if (obj->type != LTRANSFORM) return 0; *x = LTRANSFORMVAL(obj); return 1; } static LObject *tm2obj(TransformStruct **x) { TransformStruct *copy = tmcopy(*x); return LNew(LTRANSFORM, ©); } static void tmfree(TransformStruct **x) { if (*x) { if ((*x)->h) HandleDelete((*x)->h); FREELIST_FREE(TransformStruct, *x); } } static bool tmmatch(TransformStruct **a, TransformStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return 1; if ((*a)->tm && ((*a)->tm == (*b)->tm)) return 1; return TmCompare((*a)->tm, (*b)->tm, (float)0.0); } static void tmwrite(FILE *fp, TransformStruct **x) { TransFSave((*x)->tm, fp, "lisp output stream"); } static void tmpull(va_list *a_list, TransformStruct **x) { *x = va_arg(*a_list, TransformStruct*); } static LObject *tmparse(Lake *lake) { TransformStruct *newt; FREELIST_NEW(TransformStruct, newt); newt->h = NULL; if (TransStreamIn(POOL(lake), (Handle **)&newt->h, newt->tm) == false) { return Lnil; } else if(newt->h && !newt->h->permanent) { HandleDelete(newt->h); newt->h = NULL; } return LNew( LTRANSFORM, &newt ); } LType LTransformp = { "transform", sizeof(TransformStruct *), tmfromobj, tm2obj, tmfree, tmwrite, tmmatch, tmpull, tmparse, LTypeMagic }; /************************************************************************ * N-D TRANSFORM LISP OBJECT * ************************************************************************/ static TmNStruct *tmncopy(TmNStruct *old) { TmNStruct *newt; NEW(TmN, newt); if(old) *newt = *old; else newt->tm = NULL, newt->h = NULL; if (newt->tm) RefIncr((Ref*)(newt->tm)); if (newt->h) RefIncr((Ref*)newt->h); return newt; } static bool tmnfromobj(LObject *obj, TmNStruct **x) { if (obj->type != LTRANSFORMN) return 0; *x = LTRANSFORMNVAL(obj); return 1; } static LObject *tmn2obj( TmNStruct **x ) { TmNStruct *copy = tmncopy(*x); return LNew( LTRANSFORMN, © ); } static void tmnfree(TmNStruct **x) { if (*x) { if ((*x)->tm) TmNDelete( (*x)->tm ); if ((*x)->h) HandleDelete( (*x)->h ); DELETE(*x); } } static bool tmnmatch(TmNStruct **a, TmNStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return 1; if ((*a)->tm && ((*a)->tm == (*b)->tm)) return 1; return 0; } static void tmnwrite(FILE *fp, TmNStruct **x) { TmNPrint( fp, (*x)->tm ); } static void tmnpull(va_list *a_list, TmNStruct **x) { *x = va_arg(*a_list, TmNStruct*); } static LObject *tmnparse(Lake *lake) { TmNStruct *newt; NEW(TmN, newt); newt->h = NULL; newt->tm = NULL; if (NTransOps.strmin(POOL(lake), (Handle **)&newt->h, (Ref **)(void *)(&newt->tm)) == 0) { return Lnil; } else { if(newt->h && !newt->h->permanent) { HandleDelete(newt->h); newt->h = NULL; } return LNew( LTRANSFORMN, &newt ); } } LType LTransformNp = { "ntransform", sizeof(TmNStruct*), tmnfromobj, tmn2obj, tmnfree, tmnwrite, tmnmatch, tmnpull, tmnparse, LTypeMagic }; /************************************************************************ * IMAGE LISP OBJECT * ************************************************************************/ static ImgStruct *imgcopy(ImgStruct *old) { ImgStruct *newi; NEW(Img, newi); if(old) *newi = *old; else newi->img = NULL, newi->h = NULL; if (newi->img) RefIncr((Ref*)(newi->img)); if (newi->h) RefIncr((Ref*)newi->h); return newi; } static bool imgfromobj(LObject *obj, ImgStruct **x) { if (obj->type != LIMAGE) return 0; *x = LIMAGEVAL(obj); return 1; } static LObject *img2obj( ImgStruct **x ) { ImgStruct *copy = imgcopy(*x); return LNew( LIMAGE, © ); } static void imgfree(ImgStruct **x) { if (*x) { if ((*x)->img) ImgDelete( (*x)->img ); if ((*x)->h) HandleDelete( (*x)->h ); DELETE(*x); } } static bool imgmatch(ImgStruct **a, ImgStruct **b) { if ((*a)->h && ((*a)->h == (*b)->h)) return true; if ((*a)->img && ((*a)->img == (*b)->img)) return true; return false; } static void imgwrite(FILE *fp, ImgStruct **x) { ImgFSave((*x)->img, fp, "lisp output stream"); } static void imgpull(va_list *a_list, ImgStruct **x) { *x = va_arg(*a_list, ImgStruct*); } static LObject *imgparse(Lake *lake) { ImgStruct *newi; NEW(Img, newi); newi->h = NULL; newi->img = NULL; if (ImageOps.strmin(POOL(lake), (Handle **)&newi->h, (Ref **)(void *)(&newi->img)) == 0) { return Lnil; } else { if(newi->h && !newi->h->permanent) { HandleDelete(newi->h); newi->h = NULL; } return LNew( LIMAGE, &newi ); } } LType LImagep = { "image", sizeof(ImgStruct*), imgfromobj, img2obj, imgfree, imgwrite, imgmatch, imgpull, imgparse, LTypeMagic }; /************************************************************************ * ID LISP OBJECT * ************************************************************************/ static bool idfromobj(LObject *obj, int *x) { if (obj->type == LSTRING) { *x = drawer_idbyname(LSTRINGVAL(obj)); if (*x == NOID) return 0; } else if (obj->type == LID) { *x = LIDVAL(obj); } else return 0; return 1; } static LObject *id2obj(int *x) { return LNew( LID, x ); } static void idfree(int *x) {} static bool idmatch(int *a, int *b) { return drawer_idmatch(*a,*b); } static void idwrite(FILE *fp, int *x) { fprintf(fp, "\"%s\"", drawer_id2name(*x)); } #if 0 static LObject *idparse(Lake *lake) { LObject *obj = LSexpr(lake); int id; if (obj->type == LSTRING) { id = drawer_idbyname(LSTRINGVAL(obj)); if (id == NOID) return Lnil; OOGLFree(LSTRINGVAL(obj)); obj->type = LID; obj->cell.i = id; return obj; } else { LFree(obj); return Lnil; } } #endif static void idpull(a_list, x) va_list *a_list; int *x; { *x = va_arg(*a_list, int); } LType LIdp = { "id", sizeof(int), idfromobj, id2obj, idfree, idwrite, idmatch, idpull, LSexpr, LTypeMagic }; /************************************************************************ * KEYWORD LISP OBJECT * ************************************************************************/ static bool keywordfromobj(LObject *obj, int *x) { if (obj->type == LSTRING) { *x = (int)(long)fsa_parse(lang_fsa, LSTRINGVAL(obj)); if (*x == REJECT) return 0; } else if (obj->type == LKEYWORD) { *x = LKEYWORDVAL(obj); } else return 0; return 1; } static LObject *keyword2obj(int *x) { return LNew( LKEYWORD, x ); } static bool keywordmatch(int *a, int *b) { return *a == *b; } static void keywordwrite(FILE *fp, Keyword *x) { fprintf(fp, "%s", keywordname(*x)); } static void keywordfree(void *value) {} static void keywordpull(a_list, x) va_list *a_list; int *x; { *x = va_arg(*a_list, int); } #if 0 static LObject *keywordparse(Lake *lake) { LObject *obj = LSexpr(lake); int key; if (obj->type == LSTRING) { key = (int)(long)fsa_parse(lang_fsa, LSTRINGVAL(obj)); if (key == REJECT) return Lnil; OOGLFree(LSTRINGVAL(obj)); obj->type = LKEYWORD; obj->cell.i = key; return obj; } else { LFree(obj); return Lnil; } } #endif LType LKeywordp = { "keyword", sizeof(int), keywordfromobj, keyword2obj, keywordfree, keywordwrite, keywordmatch, keywordpull, LSexpr, LTypeMagic }; /************************************************************************ * STRINGS LISP OBJECT * * (a "strings" object is a string with possibly embedded spaces) * ************************************************************************/ static bool stringsfromobj(LObject *obj, char * *x) { if (obj->type != LSTRING && obj->type != LSTRINGS) return 0; *x = LSTRINGVAL(obj); return 1; } static LObject *stringsparse(Lake *lake) { char *tok; int toklen, c, first=1; static char *delims = "()"; vvec svv; VVINIT(svv, char, 80); *VVINDEX(svv, char, 0) = '\0'; while ( LakeMore(lake,c) ) { tok = iobfdelimtok( delims, lake->streamin, 0 ); toklen = strlen(tok); vvneeds(&svv, strlen(VVEC(svv,char))+toklen+2); if (!first) strcat(VVEC(svv,char), " "); else first = 0; strcat(VVEC(svv,char), tok); } VVCOUNT(svv) = strlen(VVEC(svv,char))+1; vvtrim(&svv); tok = VVEC(svv, char); return LNew( LSTRINGS, &tok ); } LType LStringsp; /* initialized in lispext_init() */ /**********************************************************************/ /**********************************************************************/ void lispext_init() { LStringsp = *(LSTRING); LStringsp.name = "strings"; LStringsp.fromobj = stringsfromobj; LStringsp.parse = stringsparse; { int zero=0, one=1; L0 = LNew( LINT, &zero ); L1 = LNew( LINT, &one ); } lang_fsa = fsa_initialize(NULL, (void*)REJECT); return; } void define_keyword(char *word, Keyword value) { if (value+1 > n_keywords) { char **newwords = OOGLNewNE(char *, value+1, "New keyword list"); memset(newwords, 0, sizeof(char *)*(value+1)); memcpy(newwords, keyword_names, n_keywords*sizeof(char *)); OOGLFree(keyword_names); keyword_names = newwords; keyword_names[value] = word; n_keywords = value+1; } else if (keyword_names[value] == NULL) { /* We allow aliases, but the name-list just picks up the first * name. */ keyword_names[value] = word; } fsa_install(lang_fsa, word, (void*)(long)value); } /* returns < 0 if asked to parse something that isn't a keyword. */ Keyword parse_keyword(char *word) { return (Keyword)(long)fsa_parse(lang_fsa, word); } char *keywordname(Keyword keyword) { if (keyword < n_keywords && keyword_names[keyword] != NULL) { return keyword_names[keyword]; } else { return "???"; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/lispext.h0000644000175000001440000000602610600044554016600 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef LISPEXT_H #define LISPEXT_H #include "lisp.h" #include "streampool.h" #include "3d.h" #include "camera.h" #include "geom.h" #include "appearance.h" #include "window.h" #include "transformn.h" #include "lang.h" /* All extension objects except the transform objects have the * following structure. */ typedef struct HandleRefStruct { Handle *h; Ref *ref; } HandleRefStruct; typedef struct { Handle *h; Camera *cam; } CameraStruct; typedef struct { Handle *h; Geom *geom; } GeomStruct; typedef struct { Handle *h; Transform tm; } TransformStruct; typedef struct { Handle *h; WnWindow *wn; } WindowStruct; typedef struct { Handle *h; Appearance *ap; } ApStruct; typedef struct { Handle *h; TransformN *tm; } TmNStruct; typedef struct { Handle *h; Image *img; } ImgStruct; #define LAPVAL(obj) ((ApStruct*) (obj->cell.p)) #define LCAMERAVAL(obj) ((CameraStruct*) (obj->cell.p)) #define LGEOMVAL(obj) ((GeomStruct*) (obj->cell.p)) #define LWINDOWVAL(obj) ((WindowStruct*) (obj->cell.p)) #define LTRANSFORMVAL(obj) ((TransformStruct*)(obj->cell.p)) #define LTRANSFORMNVAL(obj) ((TmNStruct*) (obj->cell.p)) #define LIMAGEVAL(obj) ((ImgStruct*) (obj->cell.p)) #define LSTRINGSVAL(obj) LSTRINGVAL(obj) #define LIDVAL(obj) (obj->cell.i) #define LKEYWORDVAL(obj) (obj->cell.i) extern LType LApp; extern LType LCamerap; extern LType LGeomp; extern LType LIdp; extern LType LKeywordp; extern LType LStringsp; extern LType LTransformp; extern LType LTransformNp; extern LType LWindowp; extern LType LImagep; extern LType LApp; #define LAP (&LApp) #define LCAMERA (&LCamerap) #define LGEOM (&LGeomp) #define LID (&LIdp) #define LKEYWORD (&LKeywordp) #define LSTRINGS (&LStringsp) #define LTRANSFORM (<ransformp) #define LTRANSFORMN (<ransformNp) #define LWINDOW (&LWindowp) #define LIMAGE (&LImagep) extern LObject *L0, *L1; extern Keyword parse_keyword(char *word); extern void lispext_init(); extern void define_keyword(char *word, Keyword value); char *keywordname(Keyword keyword); #endif /* ! LISPEXT_H */ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/ndshade.c0000644000175000001440000003731610624132236016520 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-20007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "hpointn.h" #include "../common/drawer.h" #include #ifndef alloca #include #endif #if 0 static void compute_mg_factor(NDstuff *nds); static inline void fast_map_ND_point(NDstuff *nds, HPointN *from, HPoint3 *to); #endif /* * Arguments: * mginfo - pointer to an "ndstuff" structure (from drawer.h), containing: * T - transformation from object to N-D camera space * axes - array of 4 axis indices, giving the subspace seen by this view * Tc - (dimension) x (n-color-axes) transform from object space to * color axis space. Use NULL if not projecting colors. * Given vectors in camera space, could get Tc with: * Tc = TmNConcat(T, {matrix of projection vectors}, NULL) * ncm - number of colormaps * cm - colormap array * p - the N-D HPointN to be transformed, in object space * np - resulting 3-D HPoint3 point, in camera space * c - resulting color; only changed if ncm > 0 * * Results: returns 1 if color was set, else 0. */ static int map_ND_point(mgNDctx *mgNDctx, HPointN *p, HPoint3 *np, ColorA *c) { NDstuff *nds = (NDstuff *)mgNDctx; #define iT nds->T #define iTc nds->Tc #define incm nds->ncm #define icm nds->cm #define ihc nds->hc ColorA ci; float t; int i; #if 0 /* cH: here is still room for optimization: provided that iT has * maximal rank (i.e. rank 4) it would be possible to factor out an * ordinary Transform and handle that one over to the MG layer. The * remaining N-Transform would act as identity on a 4x4 sub-space * which would reduce the number of floating point operations to * perform the projection. The MG layer uses an object-camera * transform anyway, so this would speed up things. * * Well. The code at the end of this files hacks this, but: the * resulting 4x4 factor is -- of course -- not orthogonal. Therefore * I stopped working at this optimization. The code for the * factorization is at the end of this file. cH. * */ fast_map_ND_point(nds, p, np); #else HPtNTransProj(iT, p, np); HPt3Dehomogenize(np, np); #endif if(incm > 0 && !(_mgc->astk->ap.flag & APF_KEEPCOLOR) && c != NULL) { ci.r = ci.g = ci.b = ci.a = 0; HPtNTransform(iTc, p, ihc); for(i = 0; i < incm; i++) { cent *ce = VVEC(icm[i].cents, cent); float v = ihc->v[i]; if(!(v > ce->v)) { ci.r += ce->c.r; ci.g += ce->c.g; ci.b += ce->c.b; ci.a += ce->c.a; } else { do ce++; while(v > ce->v); if((ce-1)->interp) { t = (v - (ce-1)->v) / (ce->v - (ce-1)->v); } else { t = 1; } ci.r += t*ce->c.r + (1-t)*(ce-1)->c.r; ci.g += t*ce->c.g + (1-t)*(ce-1)->c.g; ci.b += t*ce->c.b + (1-t)*(ce-1)->c.b; ci.a += t*ce->c.a + (1-t)*(ce-1)->c.a; } } /* XXX Clamp colors to range 0..1 here?? */ if(ci.r < 0) ci.r = 0; else if(ci.r > 1) ci.r = 1; if(ci.g < 0) ci.g = 0; else if(ci.g > 1) ci.g = 1; if(ci.b < 0) ci.b = 0; else if(ci.b > 1) ci.b = 1; if(ci.a < 0) ci.a = 0; else if(ci.a > 1) ci.a = 1; *c = ci; return 1; } return 0; #undef iT #undef iTc #undef iaxes #undef icm #undef incm #undef ihc } /* push/pop could be done much more efficiently, but ND is inefficient * anyway, so what. */ typedef struct savedCTX { TransformN *T; TransformN *Tc; TransformN *rest; Transform MGFactor; int perm[1]; } SavedCTX; static void *saveCTX(mgNDctx *NDctx) { NDstuff *nds = (NDstuff *)NDctx; SavedCTX *savedCTX = (SavedCTX *)OOGLNewNE(char, sizeof(SavedCTX)+(nds->T->idim-1)*sizeof(int), "SavedCTX"); savedCTX->T = nds->T; nds->T = TmNCopy(nds->T, NULL); if (nds->Tc) { savedCTX->Tc = nds->Tc; nds->Tc = TmNCopy(nds->Tc, NULL); } else { savedCTX->Tc = NULL; } #if 0 savedCTX->rest = nds->rest; nds->rest = TmNCopy(nds->rest, NULL); TmCopy(nds->MGFactor, savedCTX->MGFactor); memcpy(savedCTX->perm, nds->perm, nds->T->idim * sizeof(int)); mgpushtransform(); #endif return savedCTX; } static void pushTN(mgNDctx *NDctx, TransformN *TN) { NDstuff *nds = (NDstuff *)NDctx; TmNConcat(TN, nds->T, nds->T); if (nds->Tc) { TmNConcat(TN, nds->Tc, nds->Tc); } #if 0 compute_mg_factor(nds); mgtransform(nds->MGFactor); #endif } static void pushT(mgNDctx *NDctx, Transform T) { NDstuff *nds = (NDstuff *)NDctx; TmNApplyT3TN(T, NULL, nds->T); if (nds->Tc) { TmNApplyT3TN(T, NULL, nds->Tc); } #if 0 compute_mg_factor(nds); mgtransform(nds->MGFactor); #endif } static void restoreCTX(mgNDctx *NDctx, void *vsavedCTX) { NDstuff *nds = (NDstuff *)NDctx; SavedCTX *savedCTX = (SavedCTX *)vsavedCTX; #if 0 mgpoptransform(); #endif TmNDelete(nds->T); nds->T = savedCTX->T; if (nds->Tc) { TmNDelete(nds->Tc); } nds->Tc = savedCTX->Tc; #if 0 TmNDelete(nds->rest); nds->rest = savedCTX->rest; TmCopy(savedCTX->MGFactor, nds->MGFactor); memcpy(nds->perm, savedCTX->perm, nds->T->idim * sizeof(int)); #endif OOGLFree(savedCTX); } static mgNDctx NDctx_proto = { map_ND_point, saveCTX, pushTN, pushT, restoreCTX, NULL, }; NDstuff *drawer_init_ndstuff(DView *dv, TransformN *W2C, TransformN *W2U) { NDstuff *nds = OOGLNewE(NDstuff, "new NDstuff"); int dim = W2C->idim; #if 0 mgpushtransform(); #endif nds->mgNDctx = NDctx_proto; /* Initialize the color transform */ nds->ncm = dv->nNDcmap; nds->cm = dv->NDcmap; nds->W2c = NULL; nds->Tc = NULL; nds->hc = NULL; if(dv->nNDcmap > 0) { HPointN *caxis = NULL; int i, j; /* Build array of N-D-to-color projection vectors: it becomes a * matrix, multiplied by N-D row vector on the left, yielding an * array of dv->nNDcmap projections used for coloring. So it has * (dimension) rows, (dv->nNDcmap) columns. */ nds->W2c = TmNCreate(dim, dv->nNDcmap, NULL); nds->hc = HPtNCreate(dim, NULL); for(i = 0; i < dv->nNDcmap; i++) { cmap *cm = &dv->NDcmap[i]; int cdim = cm->axis->dim; int mindim = (dim < cdim) ? dim : cdim; HPointN *our_caxis = cm->axis; TransformN *TxC; if(cm->coords != UNIVERSE) { TxC = drawer_get_ND_transform(cm->coords, UNIVERSE); if(TxC) { our_caxis = caxis = HPtNTransform(TxC, cm->axis, caxis); TmNDelete(TxC); } } for(j = 0; j < mindim; j++) nds->W2c->a[j*dv->nNDcmap + i] = our_caxis->v[j]; } TmNConcat(W2U, nds->W2c, nds->W2c); HPtNDelete(caxis); } /* initialize the W2C geometry transform. Note that nds->W2C is a * projection matrix, i.e. it includes the mapping defined in * dv->NDperm. This spares a lot of unnecessary floating point * operations. */ nds->T = NULL; #if 0 nds->rest = NULL; nds->perm = OOGLNewNE(int, dim, "permutation for fast ND mapping"); #endif nds->W2C = TmNProject(W2C, dv->NDPerm, NULL); return nds; } void drawer_destroy_ndstuff(NDstuff *nds) { TmNDelete(nds->Tc); TmNDelete(nds->W2c); TmNDelete(nds->T); TmNDelete(nds->W2C); #if 0 TmNDelete(nds->rest); OOGLFree(nds->perm); #endif HPtNDelete(nds->hc); /* ... and finally do not forget to destroy nds. Gnah. */ OOGLFree(nds); #if 0 mgpoptransform(); #endif } /* install a new object transformation, this is simply a matter of * matrix multiplication; the resulting O2C transfrom will contain the * proper sub-space projection. */ void drawer_transform_ndstuff(NDstuff *nds, TransformN *T) { nds->T = TmNConcat(T, nds->W2C, nds->T); if (nds->W2c) { nds->Tc = TmNConcat(T, nds->W2c, nds->Tc); } #if 0 compute_mg_factor(nds); mgtransform(nds->MGFactor); #endif } #if 0 /* The stuff below is incomplete and does not work in its current * shape. See the comment at the start of map_ND_point(). */ /* Factor out a 4x4 matrix such that * * / I \ * (nds->T) = P | --- | A * \ B / * * with a permutation matrix P, an (Nd x 4) matrix B and a 4x4 matrix * A. The goal is to hand over A to the MG-layer (and thus possibly to * the hardware). This should speed up the projection process * considerably, because we need 16 FLOPS (matrix multiplication) less * than before. A is added to the object->screen transform which is * applied anyway. */ static inline void swap_rows(int r1, int r2, int n, HPtNCoord *Ta, int *perm) { int swapi, col; HPtNCoord swapf; if (r1 == r2) { return; } /* record permutation */ swapi = perm[r1]; perm[r1] = perm[r2]; perm[r2] = swapi; for (col = 0; col < 4; col++) { swapf = Ta[r1*4 + col]; Ta[r1*4 + col] = Ta[r2*4 + col]; Ta[r2*4 + col] = swapf; } } static inline void swap_cols(int rc1, int rc2, int n, HPtNCoord *Ta, Transform A) { HPtNCoord swapf; int row, col; if (rc1 == rc2) { return; } /* swap columns in T */ for (row = 0; row < n; row++) { swapf = Ta[row*4 + rc1]; Ta[row*4 + rc1] = Ta[row*4 + rc2]; Ta[row*4 + rc2] = swapf; } /* swap rows in A */ for (col = 0; col < 4; col++) { swapf = A[rc1][col]; A[rc1][col] = A[rc2][col]; A[rc2][col] = swapf; } } #define DEBUG_MG_FACTOR 1 static void compute_mg_factor(NDstuff *nds) { int idim = nds->T->idim; int i, row, col; TransformN *T; TransformPtr A = nds->MGFactor; int perm[idim]; HPtNCoord max, pivot; int maxrow, maxcol; T = nds->rest = TmNCopy(nds->T, nds->rest); for (i = 0; i < idim; i++) { perm[i] = i; } TmCopy(TM_IDENTITY, A); for (i = 0; i < 4; i++) { /* find pivot element */ max = 0.0; maxrow = maxcol = i; for (row = i; row < idim; row++) { for (col = i; col < 4; col++) { if (fabs(T->a[row*4+col]) > max) { max = fabs(T->a[row*4+col]); maxrow = row; maxcol = col; } } } /* exchange row i and maxrow */ swap_rows(i, maxrow, idim, T->a, perm); /* exchange column i and maxcol in T and row i and maxcol in A */ swap_cols(i, maxcol, idim, T->a, A); /* now perform the Gauss' elimination process; note that we have * to perform the operation on the columns of T as T operates from * the right. * * We perform the inverse operation on the rows of A. */ pivot = T->a[i*4+i]; /* Clear i-th row of T, record inverse operation in A */ for (col = i+1; col < 4; col++) { HPtNCoord factor; factor = T->a[i*4+col] / pivot; #if DEBUG_MG_FACTOR /* debugging: also perform the operation on the upper part of T */ for (row = 0; row < i+1; row++) { T->a[row*4+col] -= T->a[row*4+i] * factor; } #endif for (row = i+1; row < idim; row++) { T->a[row*4+col] -= T->a[row*4+i] * factor; } for (row = 0; row < 4; row++) { A[i][row] += A[col][row] * factor; } } } /* At this point T has the form * * / L \ * (nds->T) = P^{-1} | --- | A' * \ B' / * * with a lower triangular matrix L, proceed now by converting L * to the 4x4 unity matrix. * * We need to apply the operations only on B' and A' */ for (col = 4; --col >= 0;) { HPtNCoord factor; int col2; for (col2 = 0; col2 < col; col2++) { /* clear the col-th row */ factor = T->a[col*4+col2] / T->a[col*4+col]; #if DEBUG_MG_FACTOR /* debugging: also perform the operation on the upper part of T */ for (row = 0; row < 4; row++) { T->a[row*4+col2] -= T->a[row*4+col] * factor; } #endif for (row = 4; row < idim; row++) { T->a[row*4+col2] -= T->a[row*4+col] * factor; } for (row = 0; row < 4; row++) { A[col][row] += A[col2][row] * factor; } } /* finally scale the diagonal such that we really have an * identity matrix */ factor = T->a[col*4+col]; for (row = 0; row < 4; row++) { A[col][row] *= factor; } factor = 1.0 / T->a[col*4+col]; #if DEBUG_MG_FACTOR /* debugging: also perform the operation on the upper part of T */ for (row = 0; row < 4; row++) { T->a[row*4+col] *= factor; } #endif for (row = 4; row < idim; row++) { T->a[row*4+col] *= factor; } } for (row = 0; row < idim; row++) { nds->perm[row] = perm[row]; } for (col = 0; col < 4; col++) { HPt3Coord swap; swap = A[0][col]; A[0][col] = A[1][col]; A[1][col] = A[2][col]; A[2][col] = A[3][col]; A[3][col] = swap; } for (row = 4; row < idim; row++) { HPt3Coord swap; swap = T->a[row*4+0]; T->a[row*4+0] = T->a[row*4+1]; T->a[row*4+1] = T->a[row*4+2]; T->a[row*4+2] = T->a[row*4+3]; T->a[row*4+3] = swap; } #if DEBUG_MG_FACTOR for (row = 0; row < 4; row++) { HPt3Coord swap; swap = T->a[row*4+0]; T->a[row*4+0] = T->a[row*4+1]; T->a[row*4+1] = T->a[row*4+2]; T->a[row*4+2] = T->a[row*4+3]; T->a[row*4+3] = swap; } fprintf(stderr, "Permuation: "); for (row = 0; row < idim; row++) { fprintf(stderr, "%d ", perm[row]); } fprintf(stderr, "\nRest:\n"); TmNPrint(stderr, T); fprintf(stderr, "MG Factor:\n"); TmPrint(stderr, A); fprintf(stderr, "Origimal matrix:\n"); TmNPrint(stderr, nds->T); fprintf(stderr, "Product of factors:\n"); { TransformN *prod, *prod2; int i; prod = TmNCreate(idim, 4, NULL); for (row = 0; row < idim; row++) { for (col = 0; col < 4; col++) { for (i = 0; i < 4; i++) { prod->a[row*4+col] += T->a[row*4+i]*A[i][col]; } } } prod2 = TmNCreate(idim, 4, NULL); for (row = 0; row < idim; row++) { for (col = 0; col < 4; col++) { prod2->a[perm[row]*4+col] = prod->a[row*4+col]; } } /*TmNPrint(stderr, prod);*/ TmNPrint(stderr, prod2); TmNDelete(prod); TmNDelete(prod2); } #endif } /* Use the factorization computed above to map "from" to "to" * efficiently */ static inline void fast_map_ND_point(NDstuff *nds, HPointN *from, HPoint3 *to) { HPtNCoord *v = from->v; int idim; const int odim = 4; int *perm = nds->perm; int i; idim = nds->T->idim > from->dim ? from->dim : nds->T->idim; /* The following 4 lines used to consume 16 multiplications */ to->x = v[perm[1]]; to->y = v[perm[2]]; to->z = v[perm[3]]; to->w = v[perm[0]]; for (i = 4; i < idim; i++) { to->x += v[perm[i]] * nds->rest->a[i*odim+0]; to->y += v[perm[i]] * nds->rest->a[i*odim+1]; to->z += v[perm[i]] * nds->rest->a[i*odim+2]; to->w += v[perm[i]] * nds->rest->a[i*odim+3]; } /*HPt3Transform(nds->MGFactor, to, to);*/ #if 1 { HPoint3 tp[2]; static HPt3Coord max; HPtNTransProj(nds->T, from, tp); HPt3Transform(nds->MGFactor, to, tp+1); /**(tp+1) = *to;*/ if (HPt3Distance(tp, tp+1) > max) { max = HPt3Distance(tp, tp+1); fprintf(stderr, "max dist: %e\n", max); } } #endif } #endif /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/rman.c0000644000175000001440000001760710576566667016101 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Scott Wisdom, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "common.h" #include "drawer.h" #include "lang.h" #include "ui.h" #include "mg.h" #include "rman.h" #include "mgrib.h" #include /* for mgrib */ static char defname[] = "geom"; struct _rman rman = {MG_RIBCYLINDER, MG_RIBASCII, 0, MG_RIBTIFF, MG_RIBDOBG, defname}; static int ribtype(char *s, int type); static char RHelp[] = "\ Renderman:\n\ RR send RIB output to NNN.rib (default fileprefix == \"geom\")\n\ RC Emulate lines using cylinders (default)\n\ RP Emulate lines using polygons\n\ Ra choose ASCII RIB format (default)\n\ Rb choose BINARY RIB format\n\ Rt choose Display token to specify .tiff file (default)\n\ Rf choose Display token to specify framebuffer\n\ Rs Simulate background color with Polygon (default)\n\ Rx No background simulation - fully transparent (alpha) background\n\ "; /* * Interpret R keyboard commands. */ void rman_do(int suffix, int hasnumber, int number) { switch(suffix) { case '?': /* help message */ printf("%s", RHelp); break; case 'R': /* Write RenderMan snapshot */ if(hasnumber) rman.seqno = number; gv_rib_snapshot(FOCUSID, NULL); break; case 'C': /* (for photorman) chooses cylinder line emulation */ rman.line = MG_RIBCYLINDER; break; case 'P': /* (for photorman) chooses polygon line emulation */ rman.line = MG_RIBPOLYGON; break; case 'a': /* chooses ASCII format for RIB output */ rman.format = MG_RIBASCII; break; case 'b': /* chooses BINARY format for RIB output */ rman.format = MG_RIBBINARY; break; case 't': /* toggles Display to be tiff file or framebuffer */ rman.display = MG_RIBTIFF; break; case 'f': /* choose Display token to specify framebuffer */ rman.display = MG_RIBFRAME; break; case 's': /* simulate background color with polygon */ rman.background = MG_RIBDOBG; break; case 'x': /* no background color simulation - transparent background */ rman.background = MG_RIBNOBG; break; } } LDEFINE(rib_display, LVOID, "(rib-display [frame|tiff] FILEPREFIX)\n\ Set Renderman display to framebuffer (popup screen window) or a\n\ TIFF format disk file. FILEPREFIX is used to construct\n\ names of the form \"prefixNNNN.suffix\". (i.e. foo0000.rib)\n\ The number is incremented on every call to \"rib-snapshot\" and\n\ reset to 0000 when \"rib-display\" is called. TIFF files are given\n\ the same prefix and number as the RIB file (i.e. foo0004.rib\n\ generates foo0004.tiff). The default FILEPREFIX is \"geom\" and\n\ the default format is TIFF. (Note that geomview just generates a\n\ RIB file, which must then be rendered.)") { char *fileprefix; int type; LDECLARE(("rib-display", LBEGIN, LKEYWORD, &type, LSTRING, &fileprefix, LEND)); type = ribtype("rib-display", type); if (rman.fileprefix && rman.fileprefix != defname) OOGLFree(rman.fileprefix); rman.fileprefix = strdup(fileprefix); rman.display = type; rman.seqno = 0; return Lt; } LDEFINE(rib_snapshot, LVOID, "(rib-snapshot CAM-ID [filename])\n\ Write Renderman snapshot (in RIB format) of CAM-ID to .\n\ If no filename specified, see \"rib-display\" for explanation of\n\ the filename used.") { DView *view; Camera *cam = NULL; WnWindow *win; const Appearance *ap; mgcontext *ctx; char fname[1024]; char displayname[1024]; char *fileprefix = rman.fileprefix ? rman.fileprefix : defname; char *strend = NULL; FILE *f = NULL; int id, mgspace; char *filename = NULL; LDECLARE(("rib-snapshot", LBEGIN, LID, &id, LOPTIONAL, LSTRING, &filename, LEND)); if (filename) { /* explicit filename, don't use incremented fileprefix */ if (filename[0] == '-') { /* treat '-' as stdout */ sprintf(fname, "stdout"); sprintf(displayname, "geom.tiff"); f = stdout; } else { sprintf(fname, "%s", filename); if ((strend = strstr(filename, ".rib"))) { /* toss ".rib" */ strncpy(displayname, filename, strend-filename); displayname[strend-filename] = '\0'; } else { strcpy(displayname, filename); } strcat(displayname, ".tiff"); f = fopen(fname, "w"); } } else { /* autoincrement */ sprintf(fname, "%s%04d.rib", fileprefix, rman.seqno); sprintf(displayname, "%s%04d.tiff", fileprefix, rman.seqno); f = fopen(fname, "w"); rman.seqno++; } if(f == NULL) { OOGLError(1, "Can't create %s: %s", fname, sperror()); return Lnil; } if (rman.display == MG_RIBFRAME) { strcpy(displayname, fname); } fprintf(stderr, "Writing %s ...", fname); if(!ISCAM(id) || (view = (DView *)drawer_get_object(id)) == NULL) { OOGLError(1, "rib-snapshot: bad view!"); return Lnil; } mgctxselect(view->mgctx); mgctxget(MG_CAMERA, &cam); mgctxget(MG_SPACE, &mgspace); #if 0 /* Copy so that changed flags are set <- cH: what does that mean ???? */ ap = ApCopy(mggetappearance(NULL), NULL); #else ap = mggetappearance(); #endif mgctxget(MG_WINDOW, &win); if(cam == NULL || ap == NULL || win == NULL) { OOGLError(1, "rib-snapshot: trouble, %x %x %x", cam,ap,win); return Lnil; } mgdevice_RIB(); ctx = mgctxcreate(MG_CAMERA, cam, MG_APPEAR, ap, MG_WINDOW, win, MG_BACKGROUND, &view->backcolor, MG_SPACE, spaceof(WORLDGEOM), MG_RIBFORMAT, rman.format, MG_RIBLINEMODE, rman.line, MG_RIBFILE, f, MG_RIBDISPLAY, rman.display, MG_RIBDISPLAYNAME, displayname, MG_RIBBACKING, rman.background, MG_RIBSCENE, "geomview RIB snapshot", MG_RIBCREATOR, "mgrib driver - geomview", MG_SPACE, mgspace, MG_END); { /* Try to be as realistic as possible when dumping a RenderMan snapshot. * Create a RenderMan drawing context, install (hopefully) all the * attributes that draw_view() doesn't reset on its own, * plug the RenderMan ctx into the camera, and force a redraw. * Then undo the subterfuge. */ bool oldredraw = view->redraw; bool oldchanged = view->changed; mgcontext *oldctx = view->mgctx; view->mgctx = ctx; view->redraw = true; gv_draw(view->id); view->redraw = oldredraw, view->changed = oldchanged; view->mgctx = oldctx; } mgrib_flushbuffer(); /* now necessary to flush buffer to file */ mgctxdelete(ctx); #if 0 ApDelete(ap); #endif mgctxselect(view->mgctx); /* Revert to previous device */ if (f != stdout) fclose(f); fprintf(stderr, " done.\n"); return Lt; } static int ribtype(char *s, int type) { switch (type) { case TIFF_KEYWORD: return MG_RIBTIFF; case FRAME_KEYWORD: return MG_RIBFRAME; default: fprintf(stderr, "%s: invalid rib type (assuming \"tiff\")\n",s); return MG_RIBTIFF; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/rman.h0000644000175000001440000000230510455700776016056 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Scott Wisdom, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef RMAN_H #define RMAN_H struct _rman { int line; int format; int seqno; int display; int background; char *fileprefix; }; extern struct _rman rman; extern void rman_do(int suffix, int hasnumber, int number); #endif /* RMAN_H */ geomview-1.9.4/src/bin/geomview/common/transform.c0000644000175000001440000017446110624367362017142 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "geomclass.h" #include "sphere.h" #include "mg.h" #include "drawer.h" #include "ui.h" #include "transform.h" #include "transformn.h" #include "pickP.h" #include "lang.h" #include "bbox.h" /* NOTE: This file consists of things which Nathaniel Thurston added during his re-doing of the motion stuff in summer 1992. This stuff should eventually be moved into other files --- some as part of geomview, others as part of the transform library. mbp Wed Aug 19 00:44:02 1992 */ #define ERROR(fmt, arg) OOGLError(1, fmt, arg) #define DGobj(obj) ((DGeom *)obj) #define DVobj(obj) ((DView *)obj) Motion *allMotions = NULL; int is_descendant(int id, int ancestor_id); int id_exists(int id); int get_parent(int id); void set_space(int new); void apply_ND_transform(Transform deltaT, int moving, int center, int frame); /* don't the next two belong to drawer.c? */ void drawer_set_ND_xform(int id, TransformN *T); TransformN *drawer_get_ND_transform(int from_id, int to_id); static void _translate(float amount[3], Point *pt, Transform T, int space, int frame); static void _translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame); static void euclidean_translate(float amount[3], Point *pt, Transform T, int space, int frame); static void euclidean_translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame); static void hyperbolic_translate(float amount[3], Point *pt, Transform T, int space, int frame); static void hyperbolic_translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame); static void spherical_translate(float amount[3], Point *pt, Transform T, int space, int frame); static void spherical_translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame); static void _rotate(float amount[3], Point *pt, Transform T, int space, int frame); static void _scale(float amount[3], Point *pt, Transform T, int space, int frame); /* * This should DEFINITELY go somewhere else, but I'm not sure where * Geom *id_bbox(int objID, int coordsysID) * objID = id of the object to make the bounding box for * coordsysID = coordinate system in which to create the bounding box * -Celeste */ Geom *id_bbox(int geomID, int coordsysID) { int i; DGeom *geomObj; Geom *bbox = NULL, *other_bbox; Transform geom2coordsys; TransformN *geom2coordsysN; if (!ISGEOM(geomID)) { OOGLError(1, "Cannot create the bounding box of something which is\n" "not a geom."); return NULL; } if (drawerstate.NDim > 0) { MAYBE_LOOP(geomID, i, T_GEOM, DGeom, geomObj) { geom2coordsysN = drawer_get_ND_transform(geomObj->id, coordsysID); other_bbox = GeomBound(geomObj->Lgeom, NULL, geom2coordsysN); TmNDelete(geom2coordsysN); if (bbox == NULL) bbox = other_bbox; else { BBoxUnion3((BBox *)bbox, (BBox *)other_bbox, (BBox *)bbox); GeomDelete(other_bbox); } } } else { MAYBE_LOOP(geomID, i, T_GEOM, DGeom, geomObj) { drawer_get_transform(geomObj->id, geom2coordsys, coordsysID); other_bbox = GeomBound(geomObj->Lgeom, geom2coordsys, NULL); if (bbox == NULL) bbox = other_bbox; else { BBoxUnion3((BBox *)bbox, (BBox *)other_bbox, (BBox *)bbox); GeomDelete(other_bbox); } } } return bbox; } Geom *id_bsphere(int geomID, int coordsysID) { int i; DGeom *geomObj; Geom *sphere = NULL, *other_sphere, *obj; if (!ISGEOM(geomID)) { OOGLError(0, "id_bsphere: %s\n%s", "Cannot create the bounding sphere of something which is", "not a geom."); return NULL; } if (drawerstate.NDim > 0) { TransformN *geom2coordsys; DObject *camObj; int *NDPerm; static const int NDPermDflt[] = { 1, 2, 3, 0 }; if (ISCAM(coordsysID) && (camObj = drawer_get_object(coordsysID)) != NULL) { NDPerm = DVobj(camObj)->NDPerm; } else { NDPerm = (int *)NDPermDflt; } MAYBE_LOOP(geomID, i, T_GEOM, DGeom, geomObj) { if (geomObj->Lgeom == NULL) { continue; } geom2coordsys = drawer_get_ND_transform(geomObj->id, coordsysID); GeomGet(geomObj->Lgeom, CR_GEOM, &obj); other_sphere = GeomBoundSphere(obj, NULL, geom2coordsys, NDPerm, drawerstate.space); if (sphere == NULL) { sphere = other_sphere; } else { SphereUnion3((Sphere *)sphere, (Sphere *)other_sphere, (Sphere *)sphere); GeomDelete(other_sphere); } TmNDelete(geom2coordsys); } } else { Transform geom2coordsys; MAYBE_LOOP(geomID, i, T_GEOM, DGeom, geomObj) { drawer_get_transform(geomObj->id, geom2coordsys, coordsysID); if (geomObj->Lgeom == NULL) continue; GeomGet(geomObj->Lgeom, CR_GEOM, &obj); other_sphere = GeomBoundSphere(obj, geom2coordsys, NULL, NULL, drawerstate.space); if (sphere == NULL) sphere = other_sphere; else { SphereUnion3((Sphere *)sphere, (Sphere *)other_sphere, (Sphere *)sphere); GeomDelete(other_sphere); } } } return sphere; } int drawer_transform(int moving_id, int center_id, int frame_id, Keyword transform_type, float fx, float fy, float fz, float timeunit, char *repeat_type, Keyword smoothanim) { Motion motion; int i; float augment; if (smoothanim != NO_KEYWORD && smoothanim != SMOOTH_KEYWORD) { OOGLError(1, "Expected \"%s\" keyword or nothing, but got \"%s\".\n", keywordname(SMOOTH_KEYWORD), keywordname(smoothanim)); return 0; } motion.moving_id = real_id(moving_id); motion.center_id = real_id(center_id); if (motion.center_id == SELF) motion.center_id = motion.moving_id; motion.frame_id = real_id(frame_id); if (motion.frame_id == SELF) motion.frame_id = motion.moving_id; motion.amount[0] = fx; motion.amount[1] = fy; motion.amount[2] = fz; motion.timeunit = timeunit; motion.timeleft = 0; motion.smooth = 0; switch (transform_type) { case ROTATE_KEYWORD: motion.transform = _rotate; break; case TRANSLATE_KEYWORD: motion.transform = _translate; break; case E_TRANSLATE_KEYWORD: motion.transform = euclidean_translate; break; case H_TRANSLATE_KEYWORD: motion.transform = hyperbolic_translate; break; case S_TRANSLATE_KEYWORD: motion.transform = spherical_translate; break; case TRANSLATE_SCALED_KEYWORD: motion.transform = _translate_scaled; break; case E_TRANSLATE_SCALED_KEYWORD: motion.transform = euclidean_translate_scaled; break; case H_TRANSLATE_SCALED_KEYWORD: motion.transform = hyperbolic_translate_scaled; break; case S_TRANSLATE_SCALED_KEYWORD: motion.transform = spherical_translate_scaled; break; case SCALE_KEYWORD: /* Take logarithms so we can scale incrementally. * Refuse to scale down to zero, or to change sign. */ for(i = 0; i < 3; i++) motion.amount[i] = motion.amount[i] > 0 ? log(motion.amount[i]) : 0; motion.transform = _scale; break; default: ERROR("Undefined transform type %d", transform_type); return 0; } augment = 0; if(!strcmp(repeat_type, "transform-incr") && uistate.inertia > 1) { augment = 1 - 1./uistate.inertia; } delete_like_motions(&motion, augment); if (!strcmp(repeat_type, "transform-set")) set_motion(&motion); else { /* Avoid applying ineffective motions */ if(motion.amount[0]==0 && motion.amount[1]==0 && motion.amount[2]==0) return 1; if (!strcmp(repeat_type, "transform")) { if(motion.timeunit > 0) { motion.timeleft = motion.timeunit; motion.smooth = smoothanim == SMOOTH_KEYWORD; insert_motion(&motion); } else { apply_motion(&motion, motion.timeunit); } } else if (!strcmp(repeat_type, "transform-incr")) { insert_motion(&motion); } else { ERROR("unknown transform applier %s", repeat_type); return 0; } } return 1; } static void drawer_ND_position(int moving_id, int ref_id, char *position_type, int use_origin) { int i; DObject *moveObj; TransformN *ref2w, *w2moving, *T, *objT; HPointN *ptWorld, *ptMoving; Geom *bbox = NULL; int pdim = drawerstate.NDim; if (use_origin) { ref2w = drawer_get_ND_transform(ref_id, WORLDGEOM); ptWorld = HPtNCreate(pdim, NULL); HPtNTransform(ref2w, ptWorld, ptWorld); TmNDelete(ref2w); } else { if (spaceof(ref_id) != TM_EUCLIDEAN) OOGLError(1, "Computing bounding box while in non-Euclidean space"); bbox = id_bbox(ref_id, WORLDGEOM); if (!bbox) return; GeomGet(bbox, CR_NCENTER, &ptWorld); GeomDelete(bbox); } MAYBE_LOOP(moving_id, i, T_NONE, DObject, moveObj) { if (!strcmp(position_type, "position-at")) { /* NOTE: even if movingId is a camera we omit the focal length * here. */ w2moving = drawer_get_ND_transform(WORLDGEOM, moveObj->id); ptMoving = HPtNTransform(w2moving, ptWorld, NULL); T = TmNSpaceTranslateOrigin(NULL, ptMoving); HPtNDelete(ptMoving); TmNDelete(w2moving); } else if (!strcmp(position_type, "position-toward")) { /* This actually does not make too much sense if movObj is not a * camera; if it is a camera, then we "careful rotate" within its * sub-space. Otherwise we fake the standard { 0, 1, 2, -1 } * projection. * * If moving_id is indeed a camera, then we must not forget to * transform ptMoving3 by the private 3d transformation attached * to this camera. */ static const int NDPermDflt[] = { 1, 2, 3, 0 }; int *NDPerm = NULL; DObject *obj = NULL; Point ptMoving3; Transform T3; w2moving = drawer_get_ND_transform(WORLDGEOM, moveObj->id); ptMoving = HPtNTransform(w2moving, ptWorld, NULL); HPtNDehomogenize(ptMoving, ptMoving); if (ISCAM(moveObj->id) && (obj = drawer_get_object(moveObj->id)) != NULL) { NDPerm = DVobj(obj)->NDPerm; } else { NDPerm = (int *)NDPermDflt; } HPtNToHPt3(ptMoving, NDPerm, &ptMoving3); HPtNDelete(ptMoving); TmNDelete(w2moving); /* If this is a camera then we have an additional 3d transformations * which is appended to the cameras 3d W2C transform. */ if (ISCAM(moveObj->id)) { Transform camW2C; CamGet(DVobj(obj)->cam, CAM_W2C, &camW2C); HPt3Transform(camW2C, &ptMoving3, &ptMoving3); HPt3Dehomogenize(&ptMoving3, &ptMoving3); } /* construct the rotation */ TmCarefulRotateTowardZ(T3, &ptMoving3); if (ISCAM(moveObj->id)) { /* We have to conjugate T3 with this camera's private 3d * transform before we can apply it to the cluster's ND * transform. */ Transform camW2C; Transform camC2W; CamGet(DVobj(obj)->cam, CAM_C2W, &camC2W); CamGet(DVobj(obj)->cam, CAM_W2C, &camW2C); TmConcat(camW2C, T3, T3); TmConcat(T3, camC2W, T3); } T = TmNApplyDN(TmNIdentity(TmNCreate(pdim, pdim, NULL)), NDPerm, T3); } else if (!strcmp(position_type, "position")) { T = drawer_get_ND_transform(ref_id, moveObj->id); drawer_set_ND_xform(moveObj->id, T); TmNDelete(T); T = NULL; } else { break; } /* Now that we have computed an incremental transform for moveObj * apply it to its ND-transform. */ if (T) { if (ISGEOM(moveObj->id)) { objT = drawer_get_ND_transform(moveObj->id, WORLDGEOM); } else if (ISCAM(moveObj->id)) { objT = drawer_get_ND_transform(moveObj->id, UNIVERSE); } else { objT = NULL; } if (objT) { TmNConcat(T, objT, T); drawer_set_ND_xform(moveObj->id, T); TmNDelete(objT); } TmNDelete(T); /* FIXME: for consistency we maybe should also apply the proper sub-transform to the 3d transforms of all other cameras in the cluster (if we have a cluster) */ } } HPtNDelete(ptWorld); } /* * center = NULL or center = "center" ---> position-[at | toward] the * center of the bounding box of ref_id * center = "origin" ---> position-[at | toward] the origin of * ref_id's coordinate system */ void drawer_position(int moving_id, int ref_id, char *position_type, char *center) { int i; DObject *moveObj; Transform ref2w, w2moving, T; int use_origin; /* ptWorld = reference point in World coordinates, * ptMoving = reference point in coordinate system of moving object */ Point ptWorld, ptMoving; Geom *bbox = NULL; if (ref_id == SELF) ref_id = moving_id; if (center == NULL || !strcmp(center, "center")) use_origin = 0; else if (!strcmp(center, "origin")) use_origin = 1; else { OOGLError(1, "undefined center %s", center); return; } if (!ISGEOM(ref_id)) use_origin = 1; if (drawerstate.NDim > 0) { /* The ND-stuff needs special care. */ drawer_ND_position(moving_id, ref_id, position_type, use_origin); return; } /* First, get the point to which we are relatively positioning in * world coordinates (using world coordinates is somewhat arbitrary - * there just needs to be an intermediate coordinate system). */ if (use_origin) { drawer_get_transform(ref_id, ref2w, WORLDGEOM); ptWorld.x = ptWorld.y = ptWorld.z = 0; ptWorld.w = 1; HPt3Transform(ref2w, &ptWorld, &ptWorld); } else { if (spaceof(ref_id) != TM_EUCLIDEAN) OOGLError(1, "Computing bounding box while in non-Euclidean space"); bbox = id_bbox(ref_id, WORLDGEOM); if (!bbox) return; GeomGet(bbox, CR_CENTER, &ptWorld); GeomDelete(bbox); } MAYBE_LOOP(moving_id, i, T_NONE, DObject, moveObj) { drawer_get_transform(WORLDGEOM, w2moving, moveObj->id); HPt3Transform(w2moving, &ptWorld, &ptMoving); if (!strcmp(position_type, "position-at")) { TmSpaceTranslateOrigin(T, &ptMoving, spaceof(moving_id)); } else if (!strcmp(position_type, "position-toward")) TmCarefulRotateTowardZ(T, &ptMoving); else if (!strcmp(position_type, "position")) drawer_get_transform(ref_id, T, moveObj->id); else { ERROR("undefined position type %s", position_type); return; } drawer_post_xform(moveObj->id, T); } } void set_motion(Motion *motion) { TransformStruct ts; ts.h = NULL; TmIdentity(ts.tm); gv_xform_set(motion->moving_id, &ts); if (drawerstate.NDim > 0) { /* Note: the following resets the *entire* N-D xform to the * identity, not just that in the subspace we're looking through. * Might want to have finer control. XXX - 7/28/93, slevy & holt */ drawer_set_ND_xform(motion->moving_id, NULL); } apply_motion(motion, motion->timeunit); } void apply_motion(Motion *motion, float dt) { Transform T_m, T_c, T_f, T_l; Transform T_R, T_Rinv, T; Point pt; float amount[3]; float tscale; if (motion->moving_id == UNIVERSE || !id_exists(motion->moving_id) || !id_exists(motion->center_id) || !id_exists(motion->frame_id)) { motion->timeleft = 0; /* Prevent recursion */ delete_like_motions(motion, 0.); return; } drawer_get_transform(motion->moving_id, T_m, UNIVERSE); drawer_get_transform(motion->center_id, T_c, UNIVERSE); drawer_get_transform(motion->frame_id, T_f, UNIVERSE); /* If the frame is in a different space than the center, then translate the frame to the center of the universe. This is really a hack meant to deal with Euclidean cameras looking at models of hyperbolic space; it arranges for the frame to appear at the center of the universe in case it lies outside the model. */ if (spaceof(motion->frame_id) != spaceof(motion->center_id)) { pt.x = pt.y = pt.z = 0; pt.w = 1; TmInvert(T_f, T); PtTransform(T, &pt, &pt); TmSpaceTranslateOrigin(T, &pt, spaceof(motion->frame_id)); TmConcat(T, T_f, T_f); } if (motion->frame_id != motion->center_id) { /* Find the location of the origin of T_c in T_f */ /* location = origin . T_c . Inverse[T_f] */ pt.x = pt.y = pt.z = 0; pt.w = 1; TmInvert(T_f, T); TmConcat(T_c, T, T); PtTransform(T, &pt, &pt); /* Move T_f so that its origin coincides with that of T_c */ TmSpaceTranslateOrigin(T, &pt, spaceof(motion->moving_id)); TmConcat(T, T_f, T_f); } /* Find the transformation from T_f to T_m */ TmInvert(T_f, T_R); TmConcat(T_m, T_R, T_R); /* Compute the local transformation. pt may be used for scaling */ /* If a time unit was specified along with the motion, * scale the motion according to elapsed "real" time. * If no time unit provided, apply exactly the given motion. */ if (motion->timeunit < .00001) { if (motion->timeunit) fprintf(stderr, "motion->timeunit = %x\n", *(unsigned *)(void *)&motion->timeunit); motion->timeunit = 0.0; } tscale = (motion->timeunit != 0.) ? dt / motion->timeunit : 1.0; if(motion->timeleft != 0) { /* Animating? */ float t0 = motion->timeleft / motion->timeunit; float t1 = t0 - tscale; if(t1 < 0) t1 = 0; tscale = motion->smooth ? t0*t0*(3 - 2*t0) - t1*t1*(3 - 2*t1) : t0 - t1; } amount[0] = motion->amount[0] * tscale; amount[1] = motion->amount[1] * tscale; amount[2] = motion->amount[2] * tscale; pt.x = pt.y = pt.z = 0; pt.w = 1; HPt3Transform(T_R, &pt, &pt); (motion->transform)(amount, &pt, T_l, spaceof(motion->moving_id), motion->frame_id); #ifdef notdef /* No, this is wrong! -slevy */ /* * We want to consider the object hierararchy as being rooted at * frame_id. The practical effect of this consideration is that * transformations act backwards when the moving id is an ancestor * of the frame id. */ if (is_descendant(motion->frame_id, motion->moving_id)) { TmInvert(T_l, T); TmCopy(T, T_l); } #endif if(drawerstate.NDim == 0) { /* Conjugate the local transform to put it into the coordinate * system of T_m */ TmInvert(T_R, T_Rinv); TmConcat(T_R, T_l, T); TmConcat(T, T_Rinv, T); if (!finite(T[0][0])) { fprintf(stderr, "Matrix is not finite!\n"); } else { /* Apply the matrix to the moving object */ drawer_post_xform(motion->moving_id, T); } } else { /* Apply subspace transform to the N-dimensional matrices. */ apply_ND_transform(T_l, motion->moving_id, motion->center_id, motion->frame_id); } if(motion->timeleft) { motion->timeleft -= dt; if(motion->timeleft <= 0) { motion->timeleft = 0; /* Prevent recursion */ delete_motion(motion); } } } static void _translate(float amount[3], Point *pt, Transform T, int space, int frame) { TmSpaceTranslate(T, amount[0], amount[1], amount[2], space); } static void euclidean_translate(float amount[3], Point *pt, Transform T, int space, int frame) { TmTranslate(T, amount[0], amount[1], amount[2]); } static void hyperbolic_translate(float amount[3], Point *pt, Transform T, int space, int frame) { TmHypTranslate(T, amount[0], amount[1], amount[2]); } static void spherical_translate(float amount[3], Point *pt, Transform T, int space, int frame) { TmSphTranslate(T, amount[0], amount[1], amount[2]); } static void _translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame) { double dist = 1; float scaled_amount[3]; switch (space) { default: case TM_EUCLIDEAN: dist = sqrt(pt->x * pt->x + pt->y * pt->y + pt->z * pt->z) + scaleof(frame) * drawerstate.motionscale; break; case TM_HYPERBOLIC: /* NYI */ break; case TM_SPHERICAL: /* NYI */ break; } scaled_amount[0] = amount[0] * dist; scaled_amount[1] = amount[1] * dist; scaled_amount[2] = amount[2] * dist; _translate(scaled_amount, pt, T, space, frame); } static void euclidean_translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame) { _translate_scaled(amount, pt, T, TM_EUCLIDEAN, frame); } static void hyperbolic_translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame) { hyperbolic_translate(amount, pt, T, space, frame); /* scaling is NYI */ } static void spherical_translate_scaled(float amount[3], Point *pt, Transform T, int space, int frame) { spherical_translate(amount, pt, T, space, frame); /* scaling is NYI */ } static void _rotate(float amount[3], Point *pt, Transform T, int space, int frame) { float dist = sqrt(amount[0]*amount[0] + amount[1]*amount[1] + amount[2]*amount[2]); TmRotate(T, dist, (Point3 *)amount); } static void _scale(float amount[3], Point *pt, Transform T, int space, int frame) { TmScale(T, exp(amount[0]),exp(amount[1]),exp(amount[2])); } void insert_motion(Motion *motion) { Motion *copy = OOGLNew(Motion); *copy = *motion; copy->next = allMotions; allMotions = copy; } void apply_all_motions(float dt) { Motion *m, *next; for (m = allMotions; m; m = next) { next = m->next; apply_motion(m, dt); } } void delete_motion(Motion *m) { Motion **s; for(s = &allMotions; *s != m && *s != NULL; s = &(*s)->next) ; if(*s == m) { *s = m->next; if(m->timeleft) /* If we're in mid-animation, ... */ apply_motion(m, 1e10); /* finish anim step before cancelling. */ /* It will free itself. */ else OOGLFree(m); } } static int is_translation(Motion *m) { return m->transform != _rotate && m->transform != _scale; } void delete_like_motions(Motion *m, float augment) { Motion **s = &allMotions; Motion *n; int was_translation = is_translation(m); while (*s) { if ((*s)->moving_id == m->moving_id /* && (*s)->center_id == m->center_id --- this makes motion more intuitive && (*s)->frame_id == m->frame_id --- njt*/ && ((*s)->transform == m->transform || /* Consider scaled and non-scaled translations equivalent */ (was_translation && is_translation(*s))) ) { if(augment != 0) { /* Incorporate some fraction of the existing motion into the * motion that is replacing it. */ float scl = augment * ((*s)->timeunit!=0 && m->timeunit!=0 ? m->timeunit / (*s)->timeunit : 1); m->amount[0] = (1-augment)*m->amount[0] + scl*(*s)->amount[0]; m->amount[1] = (1-augment)*m->amount[1] + scl*(*s)->amount[1]; m->amount[2] = (1-augment)*m->amount[2] + scl*(*s)->amount[2]; } n = (*s)->next; if((*s)->timeleft) /* If we're in mid-animation, */ apply_motion(*s, 1e10); /* finish anim step before cancelling */ else OOGLFree(*s); *s = n; } else { s = &(*s)->next; } } } void stop_motions(int id) { Motion **s = &allMotions; Motion *n; while (*s) { if ((*s)->moving_id == id) { /* Should we finish partially-complete animations? */ n = (*s)->next; OOGLFree(*s); *s = n; } else { s = &(*s)->next; } } } void do_motion(float dt) { Motion *s,*next; for (s = allMotions; s; s = next) { next = s->next; apply_motion(s, dt); } } LDEFINE(zoom, LVOID, "(zoom CAM-ID FACTOR)\n\ Zoom CAM-ID, multiplying its field of view by FACTOR.\n\ FACTOR should be a positive number.") { float width; DView *dv; int id; float amount; LDECLARE(("zoom", LBEGIN, LID, &id, LFLOAT, &amount, LEND)); id = real_id(id); if (!ISCAM(id) || !(dv = (DView *)drawer_get_object(id))) { OOGLError(0, "zoom: Can only zoom a camera"); return Lnil; } CamGet(dv->cam, CAM_HALFYFIELD, &width); CamSet(dv->cam, CAM_HALFYFIELD, width / amount, CAM_END); CamGet(dv->cam, CAM_FOV, &width); drawer_float(id, DRAWER_FOV, width); return Lt; } LDEFINE(ezoom, LVOID, "(ezoom GEOM-ID FACTOR)\n\ Same as zoom but multiplies by exp(zoom). Obsolete.") { int id; float f; LDECLARE(("ezoom", LBEGIN, LID, &id, LFLOAT, &f, LEND)); gv_zoom( id, (float)exp((float)f) ); return Lt; } LDEFINE(scale, LVOID, "(scale GEOM-ID FACTOR [FACTORY FACTORZ])\n\ Scale GEOM-ID, multiplying its size by FACTOR. The factors \n\ should be positive numbers. If FACTORY and FACTORZ are \n\ present and non-zero, the object is scaled by FACTOR in x, by \n\ FACTORY in y, and by FACTORZ in z. If only FACTOR is present, \n\ the object is scaled by FACTOR in x, y, and z. Scaling only \n\ really makes sense in Euclidean space. Mouse-driven scaling in \n\ other spaces is not allowed; the scale command may be issued \n\ in other spaces but should be used with caution because it may \n\ cause the data to extend beyond the limits of the space.\n\ \n\ For the ND case only (scale GEOM-ID FACTOR) is supported, i.e.\n\ the optional FACTORY and FACTORZ arguments are ignored. You can,\n\ of course, scale GEOM-ID by different factors in different directions\n\ by calling (ND-xform GEOM-ID TRANSFORMN) where TRANSFORMN is a\n\ diagonal ND transform.") { int id; float x, y = 0.0, z = 0.0; LDECLARE(("scale", LBEGIN, LID, &id, LFLOAT, &x, LOPTIONAL, LFLOAT, &y, LFLOAT, &z, LEND)); if (!ISGEOM(id = real_id(id))) { OOGLError(0, "scale: Can only scale geometry."); return Lnil; } if(drawerstate.NDim > 0) { /* We have to scale the ND-xform of id _ONLY_, otherwise we will * get funny results :) */ TmNStruct tsN; HPointN *scale = HPtNCreate(drawerstate.NDim, NULL); int i; tsN.h = NULL; for (i = 1; i < drawerstate.NDim; i++) { scale->v[i] = x; } tsN.tm = TmNScale(NULL, scale); HPtNDelete(scale); gv_ND_xform(id, &tsN); TmNDelete(tsN.tm); } else { TransformStruct ts; ts.h = NULL; if (y != 0.0 && z != 0.0) { TmScale(ts.tm, x, y, z); } else { TmScale(ts.tm, x, x, x); } gv_xform(id, &ts); } return Lt; } LDEFINE(escale, LVOID, "(escale GEOM-ID FACTOR)\n\ Same as scale but multiplies by exp(scale). Obsolete.") { int id; float f; LDECLARE(("escale", LBEGIN, LID, &id, LFLOAT, &f, LEND)); f = exp(f); gv_scale( id, f, f, f ); return Lt; } /* Concat T with the current object's world transform, keeping the * normalization (obsolete) into account. So "T" is an incremental * transform. */ void drawer_post_xform(int id, Transform T) { TransformStruct ts; Transform N, NInv; DObject *dobj; if((dobj = drawer_get_object(id)) == NULL) { return; } ts.h = NULL; if (ISGEOM(id)) { GeomGet(((DGeom *)dobj)->Item, CR_AXIS, ts.tm); if (((DGeom *)dobj)->citizenship == ORDINARY) { GeomGet(((DGeom *)dobj)->Inorm, CR_AXIS, N); TmInvert(N, NInv); TmConcat(NInv, T, T); TmConcat(T, N, T); } } else { CamGet(((DView *)dobj)->cam, CAM_C2W, ts.tm); } TmConcat(T, ts.tm, ts.tm); gv_xform_set(id, &ts); } int motions_exist() { return allMotions != NULL; } /* The following functions really don't belong here. Please move them. */ int is_descendant(int id, int ancestor_id) { DGeom *dg; if (id == ancestor_id) return 1; else if (ancestor_id == WORLDGEOM && (dg = (DGeom *)drawer_get_object(id)) != NULL && ISGEOM(dg->id) && dg->citizenship == ORDINARY) return 1; else return 0; } LDEFINE(real_id, LSTRING, "(real-id ID)\n\ Returns a string canonically identifying the given ID,\n\ or \"nil\" if the object does not exist. Examples:\n\ (if (real-id fred) (delete fred))\n\ deletes \"fred\" if it exists but reports no error if it doesn't, and\n\ (if (= (real-id targetgeom) (real-id World)) () (delete targetgeom))\n\ deletes \"targetgeom\" if it is different from the World.\n") { int id; char *str; DObject *obj; LDECLARE(("real-id", LBEGIN, LSTRING, &str, LEND)); id = drawer_idbyname(str); obj = drawer_get_object(id); if(obj == NULL) return Lnil; str = obj->name[1] ? obj->name[1] : obj->name[0]; return (LTOOBJ(LSTRING))(&str); } int real_id(int id) { if (id > 0) return id; switch(id) { case UNIVERSE: return UNIVERSE; break; case SELF: return SELF; break; case FOCUSID: return CAMID(uistate.mousefocus); break; case TARGETID: return real_id(uistate.targetid); break; case CENTERID: return real_id(uistate.centerid); break; case TARGETGEOMID: return GEOMID(uistate.targetgeom); break; case TARGETCAMID: return CAMID(uistate.targetcam); break; case ALLGEOMS: return WORLDGEOM; break; case ALLCAMS: return ALLCAMS; break; case DEFAULTCAMID: return DEFAULTCAMID; break; default: ERROR("bizarre id %d", id); return WORLDGEOM; break; } } int id_exists(int id) { return id == UNIVERSE || drawer_get_object(id) != NULL; } LDEFINE(transform, LVOID, "(transform objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt [\"smooth\"]])\n" "Apply a motion (rotation, translation, scaling) to object " "\"objectID\"; that is, construct and concatenate a transformation " "matrix with objectID's transform. The 3 IDs involved are the object " "that moves, the center of motion, and the frame of reference " "in which to apply the motion. The center is easiest understood " "for rotations: if centerID is the same as objectID then it will " "spin around its own axes; otherwise the moving object will orbit " "the center object. Normally frameID, in whose coordinate system " "the (mouse) motions are interpreted, is \"focus\", the current " "camera. " "\n\n\n\n" "Translations can be scaled proportional to the " "distance between the target and the center. Support for " "spherical and hyperbolic as well as Euclidean space is " "built-in: use the \"space\" command to change spaces. With type " "\"rotate\" x, y, and z are floats specifying angles in RADIANS. " "For types \"translate\" and \"translate-scaled\" x, y, and z are " "floats specifying distances in the coordinate system of the " "center object. " "\n\n\n\n" "The optional \"dt\" field allows a simple form of animation; if " "present, the object moves by just that amount during approximately " "\"dt\" seconds, then stops. If present and followed by the " "\"smooth\" keyword, the motion is animated with a 3t^2-2t^3 " "function, so as to start and stop smoothly. " "If absent, the motion is applied immediately.") { int moving_id, center_id, frame_id; Keyword smooth = NO_KEYWORD, transform_type = NO_KEYWORD; float fx, fy, fz, during = 0; LDECLARE(("transform", LBEGIN, LID, &moving_id, LID, ¢er_id, LID, &frame_id, LKEYWORD, &transform_type, LFLOAT, &fx, LFLOAT, &fy, LFLOAT, &fz, LOPTIONAL, LFLOAT, &during, LKEYWORD, &smooth, LEND)); if (drawer_transform(moving_id, center_id, frame_id, transform_type, fx, fy, fz, during, "transform", smooth)) { return Lt; } else { return Lnil; } } LDEFINE(transform_incr, LVOID, "(transform-incr objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z [dt [smooth]])\n\ Apply continuing motion: construct a transformation matrix and\n\ concatenate it with the current transform of objectID every\n\ refresh (sets objectID's incremental transform). Same syntax\n\ as transform. " "\n\n\n\n" "If the optional \"dt\" argument is present,\n\ the object is moved at each time step such that its average motion\n\ equals one instance of the motion per \"dt\" seconds. E.g.\n\ (transform-incr World World World rotate 6.28318 0 0 10.0)\n\ rotates the World about its X axis at 1 turn (2pi radians) per 10\n\ seconds.\n") { int moving_id, center_id, frame_id; Keyword smooth = NO_KEYWORD, transform_type = NO_KEYWORD; float fx, fy, fz; float timeunit = 0; LDECLARE(("transform-incr", LBEGIN, LID, &moving_id, LID, ¢er_id, LID, &frame_id, LKEYWORD, &transform_type, LFLOAT, &fx, LFLOAT, &fy, LFLOAT, &fz, LOPTIONAL, LFLOAT, &timeunit, LKEYWORD, &smooth, LEND)); if (drawer_transform(moving_id, center_id, frame_id, transform_type, fx, fy, fz, timeunit, "transform-incr", smooth)) { return Lt; } else { return Lnil; } } LDEFINE(transform_set, LVOID, "(transform-set objectID centerID frameID [rotate|translate|translate-scaled|scale] x y z)\n\ Set objectID's transform to the constructed transform.\n\ Same syntax as transform.") { int moving_id, center_id, frame_id; Keyword transform_type = NO_KEYWORD; float fx, fy, fz; LDECLARE(("transform-set", LBEGIN, LID, &moving_id, LID, ¢er_id, LID, &frame_id, LKEYWORD, &transform_type, LFLOAT, &fx, LFLOAT, &fy, LFLOAT, &fz, LEND)); if (drawer_transform(moving_id, center_id, frame_id, transform_type, fx, fy, fz, 0., "transform-set", NO_KEYWORD)) { return Lt; } else { return Lnil; } } LDEFINE(position, LVOID, "(position objectID otherID)\n\ Set the transform of objectID to that of otherID.") { int moving_id, ref_id; LDECLARE(("position", LBEGIN, LID, &moving_id, LID, &ref_id, LEND)); drawer_position(moving_id, ref_id, "position", NULL); return Lt; } LDEFINE(position_at, LVOID, "(position-at objectID otherID [center | origin])\n\ Translate objectID to the center of the bounding box or the \n\ origin of the coordinate system of otherID (parallel translation).\n\ Default is center.") { int moving_id, ref_id; char *center = NULL; LDECLARE(("position-at", LBEGIN, LID, &moving_id, LID, &ref_id, LOPTIONAL, LSTRING, ¢er, LEND)); drawer_position(moving_id, ref_id, "position-at", center); return Lt; } LDEFINE(position_toward, LVOID, "(position-toward objectID otherID [center | origin])\n\ Rotate objectID so that the center of the bounding box\n\ or the origin of the coordinate system of the otherID\n\ lies on the positive z-axis of the first object. Default is\n\ the center of the bounding box.") { int moving_id, ref_id; char *center = NULL; LDECLARE(("position-toward", LBEGIN, LID, &moving_id, LID, &ref_id, LOPTIONAL, LSTRING, ¢er, LEND)); drawer_position(moving_id, ref_id, "position-toward", center); return Lt; } /* * These are the functions which are being added to do away with the * default normalization. They will eventually not be prefixed by * new */ /* cH: What kind of brain-damaged idiot did code the following line???? */ /* #define TmNDelete(x) */ LDEFINE(new_center, LVOID, "(new-center [id])\n\ Stop id, then set id's transform to the identity. Default id \n\ is target. Also, if the id is a camera, calls \n\ (look-recenter World id). The main function of the call to \n\ (look-recenter) is to place the camera so that it is pointing \n\ parallel to the z axis toward the center of the world.") { int i; DObject *obj; int id = uistate.targetid; LDECLARE(("new-center", LBEGIN, LOPTIONAL, LID, &id, LEND)); MAYBE_LOOP(id, i, T_NONE, DObject, obj) { drawer_stop(obj->id); gv_xform_set(obj->id, &ts_identity); if(ISGEOM(obj->id) && ((DGeom *)obj)->NDT != NULL) { TmNDelete(DGobj(obj)->NDT); DGobj(obj)->NDT = NULL; TmNDelete(DGobj(obj)->NDTinv ); DGobj(obj)->NDTinv = NULL; GeomSet(DGobj(obj)->Item, CR_NDAXIS, DGobj(obj)->NDT, CR_END); } } /* This must be separate since the center of the world might change */ MAYBE_LOOP(id, i, T_NONE, DObject, obj) { if (ISCAM(obj->id)) gv_look_recenter(WORLDGEOM, obj->id); } return Lt; } LDEFINE(new_reset, LVOID, "(new-reset)\n\ Equivalent to (progn (new-center ALLGEOMS)(new-center ALLCAMS))") { LDECLARE(("new-reset", LBEGIN, LEND)); gv_new_center(ALLGEOMS); gv_new_center(ALLCAMS); return Lt; } /* * The following macros are used by look-encompass */ #ifndef MAX #define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef MIN #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif #ifndef FUDGE #define FUDGE 1.e-6 #endif /* * emcompass_size is the fraction of the total window size that * will be filled by the object */ #define ENCOMPASS_DEFAULTS 1.0, 1000., 0.1, 3.0 struct encompass { float view_frac; float clip_ratio; float near_margin; float far_margin; }; static struct encompass enc = { ENCOMPASS_DEFAULTS }; static struct encompass edflt = { ENCOMPASS_DEFAULTS }; LDEFINE(look_encompass_size, LLIST, "(look-encompass-size [view-fraction clip-ratio near-margin far-margin])\n\ Sets/returns parameters used by (look-encompass).\n\ view-fraction is the portion of the camera window filled by the object,\n\ clip-ratio is the max allowed ratio of near-to-far clipping planes.\n\ The near clipping plane is 1/near-margin times closer than the near\n\ edge of the object, and the far clipping plane is far-margin times\n\ further away. Returns the list of current values.\n\ Defaults: .75 100 0.1 4.0\n") { LDECLARE(("look-encompass-size", LBEGIN, LOPTIONAL, LFLOAT, &enc.view_frac, LFLOAT, &enc.clip_ratio, LFLOAT, &enc.near_margin, LFLOAT, &enc.far_margin, LEND)); if(enc.view_frac <= 0) enc.view_frac = edflt.view_frac; if(enc.clip_ratio <= 0) enc.clip_ratio = edflt.clip_ratio; if(enc.near_margin <= 0) enc.near_margin = edflt.near_margin; if(enc.far_margin <= 0) enc.far_margin = edflt.far_margin; return LMakeArray(LFLOAT, (char *)&enc, 4); } static void ND_look_encompass(int objID, int camID) { int i; Sphere *sphere; DView *dv; float aspect, near, far, focallen, yfield, minfield, newyfield; int perspective; HPoint3 fromcam, center; float radius, effradius, zrange, newzrange, newfar, newnear; Transform Tfocus; MAYBE_LOOP(camID, i, T_CAM, DView, dv) { Transform camC2W, camW2C; /* Figure out the bounding sphere of the object, in contrast to * the 3d case we compute the bounding sphere relative to the * camera (we need the projection to the camera's 3d sub-space) */ sphere = (Sphere *)id_bsphere(objID, dv->id); if (sphere == NULL) { return; } SphereCenter(sphere, ¢er); radius = SphereRadius(sphere); GeomDelete((Geom *)sphere); /* fromcam now contains the coordinates of the center of the * bounding sphere in the coordinate frame defined by the cluster, * projected to our 3d sub-space. We need to append this camera's * private 3d transform to get the final position w.r.t. this * camera. */ CamGet(dv->cam, CAM_C2W, &camC2W); CamGet(dv->cam, CAM_W2C, &camW2C); HPt3Transform(camW2C, ¢er, &fromcam); HPt3Dehomogenize(&fromcam, &fromcam); if(fromcam.x < 0) fromcam.x = -fromcam.x; if(fromcam.y < 0) fromcam.y = -fromcam.y; zrange = -fromcam.z; CamGet(dv->cam, CAM_HALFYFIELD, &yfield); CamGet(dv->cam, CAM_ASPECT, &aspect); CamGet(dv->cam, CAM_NEAR, &near); CamGet(dv->cam, CAM_FAR, &far); CamGet(dv->cam, CAM_FOCUS, &focallen); CamGet(dv->cam, CAM_PERSPECTIVE, &perspective); /* Camera's field in its minimum direction. */ minfield = aspect<1 ? yfield*aspect : yfield; if (minfield <= 0.0) { OOGLError(0, "look-encompass: Erroneous field of view / aspect ratio combination."); minfield = aspect = yfield = 1.0; } /* Handle the case of look-encompass applied to a point. * Then, pretend the sphere's radius matches the camera's current * field of view in its focal plane. */ effradius = radius; if(effradius <= 0) effradius = (perspective ? minfield * zrange : minfield) * enc.view_frac; if (perspective) { /* Perspective case * Move the camera backward or forward until the sphere is tangent * to the frustrum. * minfield is tan(1/2 * field-of-view-in-shorter-direction). * First newzrange term is the Z-distance we'd need to enclose the * sphere if it lay on the camera's Z axis. * Rest is the extra we need to account for its displacement from Z */ newzrange = effradius/enc.view_frac * sqrt(1 + 1/(minfield*minfield)) + MAX(fromcam.y / yfield, fromcam.x / (yfield*aspect)); } else { /* Orthogonal case * Change the field of view of the camera so that the frustrum is * tangent to the sphere */ newyfield = MAX( effradius+fromcam.y, (effradius+fromcam.x) / aspect ) / enc.view_frac; CamSet(dv->cam, CAM_HALFYFIELD, newyfield, CAM_END); newzrange = zrange; } newnear = enc.near_margin*(newzrange - effradius); newfar = enc.far_margin * (newzrange + effradius); if(newnear < near || newfar > far || near*enc.clip_ratio < far) { float newnewz = effradius * (enc.clip_ratio * enc.near_margin - enc.far_margin) / (enc.clip_ratio * enc.near_margin + enc.far_margin); if(newzrange < newnewz) newzrange = newnewz; newnear = enc.near_margin * (newzrange - effradius); newfar = enc.far_margin * (newzrange + effradius); } drawer_float(dv->id, DRAWER_FAR, newfar); drawer_float(dv->id, DRAWER_NEAR, newnear); drawer_float(dv->id, DRAWER_FOCALLENGTH, newzrange); /* In contrast to the 3d case we MUST NOT call apply_motion() * (through gv_transform()). Instead, we apply the transformation * to the camera's normal C2W transform and thus install a * translation in z-direction which is private to this camera. */ TmTranslate(Tfocus, 0.0, 0.0, newzrange - zrange); drawer_post_xform(dv->id, Tfocus); TmConcat(Tfocus, camC2W, camC2W); CamSet(dv->cam, CAM_C2W, &camC2W, CAM_END); TmTranslate(Tfocus, 0.0, 0.0, -newzrange + zrange); TmConcat(camW2C, Tfocus, camW2C); CamSet(dv->cam, CAM_W2C, &camW2C, CAM_END); } } /* * look_encompass * Moves the camera back far enough to see all of an object * ?space == I'm not sure if this will work in non-Euclidean space * author: fowler * date: 12/92 */ LDEFINE(look_encompass, LVOID, "(look-encompass [objectID] [cameraID])\n\ Moves cameraID backwards or forwards until its field of view\n\ surrounds objectID. This routine works only in Euclidean space. \n\ If objectID is not specified, it is assumed to be the world. \n\ If cameraID is not specified, it is assumed to be the targetcam. \n\ See also (look-encompass-size).") { int i; Sphere *sphere; int objID = WORLDGEOM, camID = CAMID(uistate.targetcam); DView *dv; Transform w2c; float aspect, near, far, focallen, yfield, minfield, newyfield; int perspective; HPoint3 center, fromcam; float radius, effradius, zrange, newzrange, newfar, newnear; LDECLARE(("look-encompass", LBEGIN, LOPTIONAL, LID, &objID, LID, &camID, LEND)); objID = real_id(objID); if (!ISGEOM(objID)) { OOGLError(0, "look-encompass: first argument must be a geom"); return Lnil; } if (!ISCAM(camID)) { OOGLError(0, "look-encompass: second argument must be a camera"); return Lnil; } if (spaceof(objID) != TM_EUCLIDEAN) { OOGLError(0, "look-encompass does not work in non-euclidean spaces."); return Lnil; } /* the ND-case needs special care. */ if (drawerstate.NDim > 0) { /* The ND-stuff needs special care. */ ND_look_encompass(objID, camID); return Lnil; } /* Figure out the bounding sphere of the object in world coordinates */ sphere = (Sphere *)id_bsphere(objID, UNIVERSE); if (sphere == NULL) return Lnil; SphereCenter(sphere, ¢er); radius = SphereRadius(sphere); GeomDelete((Geom *)sphere); MAYBE_LOOP(camID, i, T_CAM, DView, dv) { drawer_get_transform(UNIVERSE, w2c, dv->id); CamGet(dv->cam, CAM_HALFYFIELD, &yfield); CamGet(dv->cam, CAM_ASPECT, &aspect); CamGet(dv->cam, CAM_NEAR, &near); CamGet(dv->cam, CAM_FAR, &far); CamGet(dv->cam, CAM_FOCUS, &focallen); CamGet(dv->cam, CAM_PERSPECTIVE, &perspective); HPt3Transform(w2c, ¢er, &fromcam); if(fromcam.x < 0) fromcam.x = -fromcam.x; if(fromcam.y < 0) fromcam.y = -fromcam.y; zrange = -fromcam.z; /* Camera's field in its minimum direction. */ minfield = aspect<1 ? yfield*aspect : yfield; if (minfield <= 0.0) { OOGLError(0, "look-encompass: Erroneous field of view / aspect ratio combination."); minfield = aspect = yfield = 1.0; } /* Handle the case of look-encompass applied to a point. * Then, pretend the sphere's radius matches the camera's current * field of view in its focal plane. */ effradius = radius; if(effradius <= 0) effradius = (perspective ? minfield * zrange : minfield) * enc.view_frac; if (perspective) { /* Perspective case * Move the camera backward or forward until the sphere is tangent * to the frustrum. * minfield is tan(1/2 * field-of-view-in-shorter-direction). * First newzrange term is the Z-distance we'd need to enclose the * sphere if it lay on the camera's Z axis. * Rest is the extra we need to account for its displacement from Z */ newzrange = effradius/enc.view_frac * sqrt(1 + 1/(minfield*minfield)) + MAX(fromcam.y / yfield, fromcam.x / (yfield*aspect)); } else { /* Orthogonal case * Change the field of view of the camera so that the frustrum is * tangent to the sphere */ newyfield = MAX( effradius+fromcam.y, (effradius+fromcam.x) / aspect ) / enc.view_frac; CamSet(dv->cam, CAM_HALFYFIELD, newyfield, CAM_END); newzrange = zrange; } newnear = enc.near_margin*(newzrange - effradius); newfar = enc.far_margin * (newzrange + effradius); if(newnear < near || newfar > far || near*enc.clip_ratio < far) { float newnewz = effradius * (enc.clip_ratio * enc.near_margin - enc.far_margin) / (enc.clip_ratio * enc.near_margin + enc.far_margin); if(newzrange < newnewz) newzrange = newnewz; newnear = enc.near_margin * (newzrange - effradius); newfar = enc.far_margin * (newzrange + effradius); } drawer_float(dv->id, DRAWER_FAR, newfar); drawer_float(dv->id, DRAWER_NEAR, newnear); drawer_float(dv->id, DRAWER_FOCALLENGTH, newzrange); drawer_transform(dv->id, dv->id, dv->id, TRANSLATE_KEYWORD, 0.0, 0.0, newzrange - zrange, 0, "transform", NO_KEYWORD); } return Lnil; } /* * look-toward * Point camera(s) toward object(s) * author: fowler * date: 12/92 */ LDEFINE(look_toward, LVOID, "(look-toward [objectID] [cameraID] [origin | center])\n\ Rotates the named camera to point toward the origin of the\n\ object's coordinate system, or the center of the object's\n\ bounding box (in non-Euclidean space, the origin will be used \n\ automatically). Default objectID is the world, default camera\n\ is targetcam, default location to point towards is the center\n\ of the bounding box.") { int objID = WORLDGEOM, camID = CAMID(uistate.targetcam); char *center = NULL; LDECLARE(("look-toward", LBEGIN, LOPTIONAL, LID, &objID, LID, &camID, LSTRING, ¢er, LEND)); objID = real_id(objID); if (!ISCAM(camID)) { OOGLError(1, "Second argument must be a camera"); return Lnil; } gv_position_toward(camID, objID, spaceof(objID) == TM_EUCLIDEAN ? center : "origin"); return Lt; } /* * look * Point camera(s) toward object(s), then move camera(s) back far enough * that the entire object(s) is visible * Also, set the camera's focal length to indicate that this is the * object of interest. * author: fowler * date: 12/92 */ LDEFINE(look, LVOID, "(look [objectID] [cameraID])\n\ Rotates the named camera to point toward the center of the \n\ bounding box of the named object (or the origin in hyperbolic or \n\ spherical space). In Euclidean space, moves the camera \n\ forward or backward until the object appears as large \n\ as possible while still being entirely visible. Equivalent to \n\ progn ( \n\ (look-toward [objectID] [cameraID] {center | origin})\n\ [(look-encompass [objectID] [cameraID])] \n\ ) \n\ If objectID is not specified, it is assumed to be World. If \n\ cameraID is not specified, it is assumed to be targetcam.") { int objID = WORLDGEOM, camID = CAMID(uistate.targetcam); LDECLARE(("look", LBEGIN, LOPTIONAL, LID, &objID, LID, &camID, LEND)); objID = real_id(objID); if (!ISCAM(camID)) { OOGLError(0, "look: Second argument must be a camera"); return Lnil; } gv_look_toward(objID, camID, "center"); if ((spaceof(objID) == TM_EUCLIDEAN) && (ISGEOM(objID))) gv_look_encompass(objID, camID); return Lt; } /* * look-recenter * (See LDEFINE statement for explanation) * author: fowler * date: 12/92 */ LDEFINE(look_recenter, LVOID, "(look-recenter [objectID] [cameraID])\n\ Translates and rotates the camera so that it is looking in the \n\ -z direction (in objectID's coordinate system) at the center of \n\ objectID's bounding box (or the origin of the coordinate system \n\ in non-Eudlidean space). In Euclidean space, the camera is also \n\ moved as close as possible to the object while allowing the \n\ entire object to be visible. Also makes sure that the y-axes of \n\ objectID and cameraID are parallel.") { int i; DView *camObj; TransformStruct obj2univ; Transform obj2univtm; TmNStruct obj2univN; TransformN *obj2univtmN; int objID = WORLDGEOM, camID = CAMID(uistate.targetcam); LDECLARE(("look-recenter", LBEGIN, LOPTIONAL, LID, &objID, LID, &camID, LEND)); objID = real_id(objID); if (!ISGEOM(objID)) { OOGLError(0, "look-recenter: First argument must be a geom"); return Lnil; } if (!ISCAM(camID)) { OOGLError(0, "look-recenter: Second argument must be a camera"); return Lnil; } /* It is probably not a good idea to deform the camera geometry (in * general the spectator remains undeformed or would suffer serious * injuries ...). So we keep only the orthogonal part and throw away * the deformations. */ obj2univ.h = NULL; drawer_get_transform(objID, obj2univtm, UNIVERSE); TmPolarDecomp(obj2univtm, obj2univ.tm); obj2univN.h = NULL; if ((obj2univtmN = drawer_get_ND_transform(objID, UNIVERSE)) != NULL) { obj2univN.tm = TmNPolarDecomp(obj2univtmN, NULL); TmNDelete(obj2univtmN); /* decrease the ref-count */ } else { obj2univN.tm = NULL; } MAYBE_LOOP(camID, i, T_CAM, DView, camObj) { if (drawerstate.NDim == 0) { gv_xform_set(camObj->id, &obj2univ); } else { if (obj2univN.tm) { gv_ND_xform_set(camObj->id, &obj2univN); } } gv_position_at(camObj->id, objID, spaceof(objID) == TM_EUCLIDEAN ? "center" : "origin"); } TmNDelete(obj2univN.tm); if (spaceof(objID) == TM_EUCLIDEAN) gv_look_encompass(objID, camID); return Lt; } static void get_geom_transform(DGeom *dg, Transform T_to_parent) { Transform Tm, Tn; if(GeomGet(dg->Item, CR_AXIS, Tm) > 0 && GeomGet(dg->Inorm, CR_AXIS, Tn) > 0) TmConcat(Tn, Tm, T_to_parent); else TmIdentity(T_to_parent); } /* * Compute transformation FROM id's coordinates TO a given coord system. * to_id may be any real id, or SELF (always yields identity transform), * or UNIVERSE (yields transform to universal coordinate system). */ void drawer_get_transform(int from_id, Transform T, int to_id) { DObject *obj; Transform Tfrom, Tto, Ttoinv; if(from_id == to_id || to_id == SELF) { TmIdentity(T); return; } if((obj = drawer_get_object(from_id)) == NULL) { if(to_id == UNIVERSE) { OOGLError(1, "drawer_get_transform: can't handle from_id %d", from_id); TmIdentity(T); return; } } else { if(from_id < 0) from_id = obj->id; if (ISGEOM(from_id)) { switch(to_id) { case UNIVERSE: get_geom_transform(DGobj(obj), T); if(DGobj(obj)->citizenship == ORDINARY) { get_geom_transform(dgeom[0], Tfrom); TmConcat(T, Tfrom, T); } return; case WORLDGEOM: if(DGobj(obj)->citizenship == ORDINARY) { get_geom_transform(DGobj(obj), T); return; } } } else if (ISCAM(from_id)) { if(to_id == UNIVERSE) { CamGet(DVobj(obj)->cam, CAM_C2W, T); return; } } else if (ISCAM(to_id)) { if(from_id == UNIVERSE) { CamGet(DVobj(obj)->cam, CAM_W2C, T); return; } } } /* If the above easy cases couldn't hack it, do it the hard way: * Handle A -> B as (A -> UNIVERSE) * (B -> UNIVERSE)^-1 */ drawer_get_transform(to_id, Tto, UNIVERSE); TmInvert(Tto, Ttoinv); drawer_get_transform(from_id, Tfrom, UNIVERSE); TmConcat(Tfrom, Ttoinv, T); } TransformN * drawer_get_ND_transform(int from_id, int to_id) { DObject *obj; TransformN *Tfrom, *Tto, *T; if(from_id == to_id || to_id == SELF) { return NULL; } if((obj = drawer_get_object(from_id)) == NULL) { if(to_id == UNIVERSE) { OOGLError(1, "drawer_get_ND_transform: can't handle from_id %d", from_id); return NULL; } } else { if(from_id < 0) from_id = obj->id; if (ISGEOM(from_id)) { switch(to_id) { case UNIVERSE: Tfrom = get_geom_ND_transform(DGobj(obj)); if(DGobj(obj)->citizenship == ORDINARY) { Tto = get_geom_ND_transform(dgeom[0]); if(Tfrom == NULL) return Tto; else if(dgeom[0]->NDT == NULL) return Tfrom; else { T = TmNConcat(Tfrom, Tto, NULL); TmNDelete(Tfrom); TmNDelete(Tto); return T; } } return Tfrom; case WORLDGEOM: if(DGobj(obj)->citizenship == ORDINARY) { return get_geom_ND_transform(DGobj(obj)); } } } else if (ISCAM(from_id)) { if(to_id == UNIVERSE) { T = (obj && ((DView *)obj)->cluster) ? REFGET(TransformN, ((DView *)obj)->cluster->C2W) : NULL; return T ? T : TmNIdentity(TmNCreate(drawerstate.NDim, drawerstate.NDim, NULL)); } } } /* If the above easy cases couldn't hack it, do it the hard way: * Handle A -> B as (A -> UNIVERSE) * (B -> UNIVERSE)^-1 */ Tto = drawer_get_ND_transform(to_id, UNIVERSE); Tfrom = drawer_get_ND_transform(from_id, UNIVERSE); if(Tto) { TransformN *Tot = TmNInvert(Tto, NULL); TmNDelete(Tto); if(Tfrom) { T = TmNConcat(Tfrom, Tot, NULL); TmNDelete(Tfrom); TmNDelete(Tot); } else { T = Tot; } return T; } else { return Tfrom; } } /* Note: this function always makes a copy of T, otherwise stuff like * * drawer_get_ND_xform(other_id, WORLD); * drawer_set_ND_xform(this-id, WORLD); * * would not work correctly. */ void drawer_set_ND_xform(int id, TransformN *T) { DObject *obj; if((obj = drawer_get_object(id)) != NULL) { if (!T) { T = TmNIdentity(TmNCreate(drawerstate.NDim, drawerstate.NDim, NULL)); } else { T = REFGET(TransformN, T); } if(ISCAM(obj->id)) { if(DVobj(obj)->cluster == NULL) { /* N-D camera? */ return; } DVobj(obj)->cluster->C2W = TmNCopy(T, DVobj(obj)->cluster->C2W); drawerstate.changed = true; } else { DGobj(obj)->NDT = TmNCopy(T, DGobj(obj)->NDT); GeomSet(DGobj(obj)->Item, CR_NDAXIS, DGobj(obj)->NDT, CR_END); obj->changed |= CH_GEOMETRY; } TmNDelete(T); } } /* For ND-picking. * * The return value is the cluster's W2C transform with this camera's * 3d CamView() transform applied to the appropriate sub-space. */ TransformN *drawer_ND_CamView(DView *dv, TransformN *T) { Transform CV3D; if(dv->cluster == NULL && drawerstate.NDim > 0) { /* If we're in N-D mode but this camera isn't equipped, * give it a default N-D => 3-D projection now. */ gv_ND_axes(dv->name[0], drawerstate.NDcams ? drawerstate.NDcams->name : "default", 1, 2, 3, 0); } CamView(dv->cam, CV3D); dv->cluster->W2C = TmNInvert(dv->cluster->C2W, dv->cluster->W2C); T = TmNCopy(dv->cluster->W2C, T); TmNApplyDN(T, dv->NDPerm, CV3D); return T; } int get_parent(int id) { DGeom *dg; if(ISGEOM(id) && (dg = (DGeom *)drawer_get_object(id)) != NULL) { if(dg->citizenship == ORDINARY) return WORLDGEOM; } /* Cameras, etc. are all referred to UNIVERSE */ return UNIVERSE; } void apply_ND_transform(Transform delta, int moving, int center, int frame) { HPointN *originpt = NULL; TransformN *Tgf = NULL, *Tfg = NULL, *Tcf = NULL; TransformN *Tmf = NULL, *Tmg = NULL, *Tfp = NULL, *Tmp = NULL; DView *dv; int *perm; int cam; /* Construct new coord system 'g' with the orientation of 'frame' but * with its origin at 'center'. * It's in this system that 'delta' is defined. * Tgf is the transform from this system to 'frame'. * * cH: we allow a "private" 3d transform for each camera of a * cluster; this has to be taken into account here. */ cam = frame; if(!ISCAM(cam)) cam = center; if(!ISCAM(cam)) cam = moving; if(ISCAM(cam) && (dv = (DView *)drawer_get_object(cam)) != NULL) { perm = dv->NDPerm; } else { static const int dflt_perm[] = { 1, 2, 3, 0 }; perm = (int *)dflt_perm; } originpt = HPtNCreate(drawerstate.NDim, NULL); Tcf = drawer_get_ND_transform(center, frame); if (ISCAM(center) && (dv = (DView *)drawer_get_object(center)) != NULL) { Transform camC2W; CamGet(dv->cam, CAM_C2W, &camC2W); HPtNTransform3(camC2W, dv->NDPerm, originpt, originpt); } if (Tcf) { HPtNTransform( Tcf, originpt, originpt ); } if (ISCAM(frame) && (dv = (DView *)drawer_get_object(frame)) != NULL) { Transform camW2C; CamGet(dv->cam, CAM_W2C, &camW2C); HPtNTransform3(camW2C, dv->NDPerm, originpt, originpt); } Tgf = TmNSpaceTranslateOrigin(NULL, originpt); /* TranslateOrigin() will call Dehomogenize anyway, so negation of * origin is really easy, just negate the homogeneous component. */ originpt->v[0] = -originpt->v[0]; Tfg = TmNSpaceTranslateOrigin(NULL, originpt); HPtNDelete(originpt); Tmf = drawer_get_ND_transform(moving, frame); /* We must not modify Tmf, it could be only a reference, so build up * the chain in reverse order, starting with Tfg */ if (ISCAM(frame) && (dv = (DView *)drawer_get_object(frame)) != NULL) { Transform camW2C; CamGet(dv->cam, CAM_W2C, &camW2C); Tfg = TmNApplyT3TN(camW2C, dv->NDPerm, Tfg); } Tmg = Tmf ? TmNConcat( Tmf, Tfg, NULL ) : REFGET(TransformN, Tfg); /* ... and here it comes ... */ TmNApplyDN(Tmg, perm, delta); TmNDelete(Tmf); /* Do not modify, generate a new one */ Tmf = TmNConcat(Tmg, Tgf, NULL); if (ISCAM(frame) && (dv = (DView *)drawer_get_object(frame)) != NULL) { Transform camC2W; CamGet(dv->cam, CAM_C2W, &camC2W); Tmf = TmNApplyDN(Tmf, dv->NDPerm, camC2W); } Tfp = drawer_get_ND_transform(frame, get_parent(moving)); Tmp = Tfp ? TmNConcat(Tmf, Tfp, NULL) : REFGET(TransformN, Tmf); drawer_set_ND_xform(moving, Tmp); TmNDelete(Tmp); TmNDelete(Tgf); TmNDelete(Tfg); TmNDelete(Tcf); TmNDelete(Tmf); TmNDelete(Tmg); TmNDelete(Tfp); } void make_center(char *objname, Point3 *pt) { TransformStruct ts; int cid; if((cid = drawer_idbyname(objname)) == NOID) { GeomStruct gs; gs.h = NULL; gs.geom = NULL; cid = gv_new_alien(objname, &gs); } ts.h = NULL; TmTranslate(ts.tm, pt->x, pt->y, pt->z); gv_xform_set( cid, &ts ); gv_ui_center(cid); } void make_ND_center(char *objname, HPointN *pt) { TmNStruct ts; int cid; if((cid = drawer_idbyname(objname)) == NOID) { GeomStruct gs; gs.h = NULL; gs.geom = NULL; cid = gv_new_alien(objname, &gs); } ts.h = NULL; ts.tm = TmNTranslateOrigin(NULL, pt); gv_ND_xform_set( cid, &ts ); TmNDelete(ts.tm); gv_ui_center(cid); } void make_center_from_bbox(char *objname, int obj_id) { if (spaceof(obj_id) == TM_EUCLIDEAN && ISGEOM(obj_id) && obj_id != WORLDGEOM) { DGeom *dg = (DGeom*)drawer_get_object(obj_id); if (dg) { Geom *bbox; if (!dg->bboxvalid) { drawer_make_bbox(dg, dg->normalization == ALL); } GeomGet(dg->Lbbox, CR_GEOM, &bbox); if (bbox) { if (drawerstate.NDim == 0) { Transform Tuni; HPoint3 pt; GeomGet(bbox, CR_CENTER, &pt); /* tansform to universe co-ordinates */ drawer_get_transform(obj_id, Tuni, UNIVERSE); HPt3Transform(Tuni, &pt, &pt); HPt3Dehomogenize(&pt, &pt); make_center(objname, (Point3 *)(void *)&pt); } else { TransformN *Tuni; HPointN *pt; GeomGet(bbox, CR_NCENTER, &pt); /* tansform to universe co-ordinates */ Tuni = drawer_get_ND_transform(obj_id, UNIVERSE); HPtNTransform(Tuni, pt, pt); HPtNDehomogenize(pt, pt); make_ND_center(objname, pt); HPtNDelete(pt); TmNDelete(Tuni); } } } } } void make_center_from_pick(char *objname, Pick *pick, int camid) { int index; DView *dv; /* Apply primitive -> World transform. * XXX if we ever implement object hierarchy, a Center like this * should be referred to the object we picked, not the Universe. */ if (drawerstate.NDim > 0) { TransformN *Tuni, *Tcam; Transform Tcam3d; HPointN *center = NULL; HPoint3 got4, center3d; Point3 fromcam; if (pick->TwN == NULL || pick->axes == NULL) { OOGLError(1, "3d pick for ND-viewing?"); return; } Pt3ToHPt3(&pick->got, &got4, 1); /* not a loop for cameras ... */ MAYBE_LOOP(camid, index, T_CAM, DView, dv) { center = HPt3ToHPtN(&got4, dv->NDPerm, NULL); } HPtNTransform(pick->TwN, center, center); Tuni = drawer_get_ND_transform(WORLDGEOM, UNIVERSE); HPtNTransform(Tuni, center, center); TmNDelete(Tuni); make_ND_center(objname, center); MAYBE_LOOP(camid, index, T_CAM, DView, dv) { Tcam = drawer_get_ND_transform(UNIVERSE, dv->id); HPtNTransform(Tcam, center, center); TmNDelete(Tcam); drawer_get_transform(UNIVERSE, Tcam3d, dv->id); HPtNToHPt3(center, dv->NDPerm, ¢er3d); HPt3TransPt3(Tcam3d, ¢er3d, &fromcam); drawer_float(dv->id, DRAWER_FOCALLENGTH, Pt3Length(&fromcam)); } HPtNDelete(center); } else { Point3 center, fromcam; Transform Tuni, Tcam; drawer_get_transform(WORLDGEOM, Tuni, UNIVERSE); Pt3Transform(pick->Tw, &pick->got, ¢er); Pt3Transform(Tuni, ¢er, ¢er); /* Convert to universe coords */ make_center(objname, ¢er); MAYBE_LOOP(camid, index, T_CAM, DView, dv) { drawer_get_transform(UNIVERSE, Tcam, dv->id); Pt3Transform(Tcam, ¢er, &fromcam); drawer_float(dv->id, DRAWER_FOCALLENGTH, Pt3Length(&fromcam)); } } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/geomview/common/transform.h0000644000175000001440000000542610577534642017145 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _GV_COMMON_TRANSFORM_H_ #define _GV_COMMON_TRANSFORM_H_ #include "lang.h" #include "drawer.h" typedef struct Motion { int moving_id; int center_id; int frame_id; void (*transform)(); float amount[3]; float timeunit; float timeleft; /* Nonzero if bounded animation */ int smooth; /* Smooth animation, else linear */ struct Motion *next; } Motion; int drawer_transform(int moving_id, int center_id, int frame_id, Keyword transform_type, float fx, float fy, float fz, float timeunit, char *repeat_type, Keyword smoothanim); void drawer_position(int moving_id, int ref_id, char *position_type, char *center); void drawer_zoom(int id, float amount); void drawer_scale(int id, float amount); void set_motion(Motion *motion); void apply_motion(Motion *motion, float dt); void insert_motion(Motion *motion); void apply_all_motions(float dt); void do_motion(float dt); void delete_motion(Motion *m); void delete_like_motions(Motion *m, float augmentby); void drawer_post_xform(int id, Transform T); int e3space(void *data); int h3space(void *data); void stop_motions(int id); int motions_exist(); int real_id(int id); void make_center(char *objname, Point3 *pt); void make_center_from_bbox(char *objname, int obj_id); void make_center_from_pick(char *objname, Pick *pick, int focalcam); void drawer_set_ND_xform(int id, TransformN *T); int real_id(int id); /* Get a geom's transform to its parent */ static inline TransformN * get_geom_ND_transform(DGeom *dg) { if (dg->NDT == NULL && drawerstate.NDim > 0) { dg->NDT = TmNIdentity(TmNCreate(drawerstate.NDim, drawerstate.NDim, NULL)); GeomSet(dg->Item, CR_NDAXIS, dg->NDT, CR_END); dg->bboxvalid = false; /* invalidate bounding box */ } else if (drawerstate.NDim == 0) { TmNDelete(dg->NDT); dg->NDT = NULL; } return REFGET(TransformN, dg->NDT); } #endif /* _GV_COMMON_TRANSFORM_H_ */ geomview-1.9.4/src/bin/geomview/common/lights.c0000644000175000001440000003212610622716744016410 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include "lights.h" #include #include #include #include #include "geom.h" #include "list.h" #include "geomclass.h" #include "3d.h" #include "pick.h" #include "common.h" #include "drawer.h" #include "event.h" #include "ui.h" #include "motion.h" #include "mouse.h" #include "inst.h" static Transform Tincr; static int updateproc(Geom *g); static int lightedit(Event *event); static void normalize_color( Color *color, float *coeff ); static void set_ambient(Color *color, float intensity); static void build_light_rack(LmLighting *lgt); static void pick_light(Event *ev); static void mouse2world(Point *axis, int objid); void Rotation(double dx, double dy, Transform rot, int *target); static void lxform(Transform t, Point3 axis); typedef struct LightRack { Geom *list; Geom **lightgeoms; LtLight **lights; int lightcount; LmLighting *lgt; } LightRack; Geom *make_light(Point3 axis, Color *color); static int countlights(LmLighting *lm); static Geom *ray = NULL; /*static int inited = 0; currently unused */ static LightRack lr; static int lr_id = NOID; static int apseq = -1; static char raytxt[] = "VECT \ 10 20 0 \ 2 2 2 2 2 2 2 2 2 2 \ 0 0 0 0 0 0 0 0 0 0 \ .050 .000 0 .160 .000 10 \ .040 .029 0 .129 .094 10 \ .015 .047 0 .049 .152 10 \ -.015 .047 0 -.049 .152 10 \ -.040 .029 0 -.129 .094 10 \ -.050 .000 0 -.160 .000 10 \ -.040 -.029 0 -.129 -.094 10 \ -.015 -.047 0 -.049 -.152 10 \ .015 -.047 0 .049 -.152 10 \ .040 -.029 0 .129 -.094 10"; void clight_init() { Appearance *ap = drawerstate.ap; LmLighting *lgt; IOBFILE *f; f = iobfileopen(fmemopen(raytxt, strlen(raytxt), "rb")); if (f) { ray = GeomFLoad(f, "built-in light ray"); if (! ray) printf("can't construct built-in light ray\n"); } else printf("can't fstropen\n"); iobfclose(f); lr.lights = NULL; lr.lightgeoms = NULL; lr.lightcount = 0; lr.list = NULL; ApGet(ap, AP_LGT, &lgt); if (lgt == NULL) { printf("current appearance has no lighting !!!\n"); } apseq = drawerstate.apseq; build_light_rack(lgt); } void colmult( c, scalar) Color *c; float scalar; { c->r = c->r * scalar; c->g = c->g * scalar; c->b = c->b * scalar; } Color * light_color() { return &( lr.lights[uistate.current_light]->color ); } float light_intensity() { return lr.lights[uistate.current_light]->intensity; } void set_light_intensity(float intens) { lr.lights[uistate.current_light]->intensity = intens; if (uistate.current_light == 0) set_ambient( &(lr.lights[0]->color), lr.lights[0]->intensity ); else { set_beam_color(); } apseq = ++drawerstate.apseq; drawerstate.changed = true; } void set_beam_color() { Color scaledcol; CoCopy( &lr.lights[uistate.current_light]->color, &scaledcol); colmult( &scaledcol, light_intensity()); ApSet(lr.lightgeoms[uistate.current_light]->ap, AP_MtSet, MT_EDGECOLOR, &scaledcol, MT_END, AP_END); } void set_light_color(Color *color) { lr.lights[uistate.current_light]->color = *color; if (uistate.current_light == 0) /* ambient */ set_ambient( &(lr.lights[0]->color), lr.lights[0]->intensity ); else { /* not ambient --- also set color of light beam */ set_beam_color(); } apseq = ++drawerstate.apseq; drawerstate.changed = true; } void set_light(int lightno) { uistate.current_light = lightno; set_light_display(lightno); } int light_count() { return lr.lightcount; } static void set_ambient(Color *color, float intensity) { Color scaledcolor; CoCopy(color, &scaledcolor); colmult(&scaledcolor, intensity); ApSet(drawerstate.ap, AP_LmSet, LM_AMBIENT, &scaledcolor, LM_END, AP_END); } /*----------------------------------------------------------------------- * Function: light_edit_mode * Description: enter/exit light editing mode * Args: edit: 1 means enter, 0 means exit, 2 means toggle * Returns: * Author: mbp * Date: Thu Dec 26 21:12:52 1991 * Notes: */ void light_edit_mode(int edit) { if (edit == 2) edit = uistate.lights_shown ? 0 : 1; if (edit) { show_lights(); } else { unshow_lights(); } ui_light_button(); } void unshow_lights() { /* int i; currently unused */ if (lr_id != NOID) { gv_delete( lr_id ); lr_id = NOID; } ui_remove_mode(LIGHTEDIT); uistate.lights_shown = 0; } void show_lights() { static char *name = "light rack"; GeomStruct gs; lights_changed_check(); /* rebuild lightrack if lights changed */ RefIncr((Ref *)lr.list); gs.geom = lr.list; gs.h = NULL; lr_id = gv_new_alien( name, &gs ); ui_add_mode(LIGHTEDIT, lightedit, T_NONE); uistate.lights_shown = 1; gv_event_mode( LIGHTEDIT ); } static void build_light_rack(LmLighting *lgt) { Point3 axis; int lightno; int i; LtLight *light, **lp; static LtLight ambient; if (lr.lightgeoms) OOGLFree(lr.lightgeoms); if (lr.lights) OOGLFree(lr.lights); if (lr.list) GeomDelete(lr.list); lr.list = GeomCreate("list", CR_END); lr.lightcount = countlights(lgt)+1; lr.lightgeoms = OOGLNewNE(Geom *, lr.lightcount, "lightgeoms array"); lr.lights = OOGLNewNE(LtLight *, lr.lightcount, "lights array"); lr.lightgeoms[0] = NULL; lr.lights[0] = &ambient; LmGet(lgt, LM_AMBIENT, &(ambient.color)); normalize_color( &(ambient.color), &(ambient.intensity) ); lightno = 1; LM_FOR_ALL_LIGHTS(lgt, i,lp) { light = *lp; axis = *(Point3*)(void *)(&(light->position)); lr.lights[lightno] = light; lr.lightgeoms[lightno] = make_light(axis, &(light->color)); lr.list = ListAppend(lr.list, lr.lightgeoms[lightno]); ++lightno; } if(lr_id != NOID) { RefIncr((Ref *)lr.list); { GeomStruct gs; gs.geom = lr.list; gs.h = NULL; gv_geometry( drawer_id2name(lr_id), &gs ); } } ui_lights_changed(); } #define max(a,b) (a)>(b)?(a):(b) static void normalize_color( color, coeff ) Color *color; float *coeff; { *coeff = max(color->r, color->g); *coeff = max(color->b, *coeff); if( *coeff != 0.0 ) { color->r /= *coeff; color->g /= *coeff; color->b /= *coeff; } } static int countlights(LmLighting *lm) { int n = 0, i; LtLight **lp; LM_FOR_ALL_LIGHTS(lm, i,lp) { n++; } return n; } Geom* make_light(Point3 axis, Color *color) { Geom *g; Transform t; Appearance *ap; ap = ApCreate(AP_MtSet, MT_EDGECOLOR, color, MT_END, AP_END); lxform(t, axis); g = GeomCreate("inst", CR_GEOM, ray, CR_NOCOPY, CR_APPEAR, ap, CR_END); if (g == NULL) { fprintf(stderr, "Couldn't create inst\n"); return NULL; } InstTransformTo((Inst *)g, t, NULL); return g; } static void lxform(Transform t, Point3 axis) { Point3 x, y; static Point3 other1 = {0,0,1}; static Point3 other2 = {0,1,0}; Point3 *other; Pt3Unit(&axis); other = (Pt3Dot(&axis, &other1) < .5) ? &other1 : &other2; Pt3Cross(other, &axis, &x); Pt3Unit(&x); Pt3Cross(&axis, &x, &y); t[0][0] = x.x; t[0][1] = x.y; t[0][2] = x.z; t[0][3] = 0; t[1][0] = y.x; t[1][1] = y.y; t[1][2] = y.z; t[1][3] = 0; t[2][0] = axis.x; t[2][1] = axis.y; t[2][2] = axis.z; t[2][3] = 0; t[3][0] = 0; t[3][1] = 0; t[3][2] = 0; t[3][3] = 1; } #if LIGHTDEBUG static char * Point3String(Point3 *p) { static char buf[80]; sprintf(buf,"%f %f %f", p->x, p->y, p->z); return buf; } #endif static int lightedit(Event *event) { float dx,dy; unsigned long int dt; Transform T; int target=WORLDGEOM; lights_changed_check(); /* rebuild lightrack if lights have changed */ if (!uistate.lights_shown) show_lights(); /* don't do anything with ambient light */ if (uistate.current_light == 0) return 0; /* should this return 0 or 1 ? */ switch (event->dev) { case ELEFTMOUSE: if (event->val > 0) { /* button went down */ mousezero(event,NULL); TmIdentity(Tincr); drawer_updateproc( lr_id, NULL ); } else if (event->val) { /* dragging while button down */ mousedisp(event, &dx, &dy, &dt, &drawerstate.winpos); Rotation(dx, dy, T, &target); InstTransform((Inst *)lr.lightgeoms[uistate.current_light], T, NULL); PtTransform(T, &(lr.lights[uistate.current_light]->position), &(lr.lights[uistate.current_light]->position)); #if LIGHTDEBUG printf("light moved to %s\n", Point3String(&(lr.lights[uistate.current_light]->position))); #endif apseq = ++drawerstate.apseq; drawerstate.changed = true; } else { /* button went up */ mousedisp(event, &dx, &dy, &dt, &drawerstate.winpos); if ( (dx != 0) || (dy != 0) ) { Rotation(dx, dy, Tincr, &target); drawer_updateproc( lr_id, updateproc ); } else drawer_updateproc( lr_id, NULL ); } break; case EMIDDLEMOUSE: case ERIGHTMOUSE: pick_light(event); break; default: return 0; break; } return 1; } static int updateproc(Geom *g) { /* don't do anything with ambient light */ if (uistate.current_light == 0) return 42; InstTransform((Inst *)lr.lightgeoms[uistate.current_light], Tincr, NULL); PtTransform(Tincr, &(lr.lights[uistate.current_light]->position), &(lr.lights[uistate.current_light]->position)); apseq = ++drawerstate.apseq; drawerstate.changed = true; return 42; } static void pick_light(Event *ev) { int i; DView *dv = dview[uistate.mousefocus]; DGeom *dg = dgeom[INDEXOF(lr_id)]; Transform V, T, Tnorm, Tmodel, Tnet, Tt; float xpick, ypick; Pick *pick = NULL; CamView(dv->cam, V); /* Top-level modelling transform */ GeomPosition( dv->Item, T ); TmConcat( T,V, T ); pick = PickSet(NULL, PA_THRESH, .02, PA_END); for (i=1; iItem, Tmodel ); GeomPosition( dg->Inorm, Tnorm ); TmConcat( Tnorm,Tmodel, Tt ); TmConcat( Tt,T, Tnet ); /* Now Tnet = complete geom-to-screen proj'n */ mousemap(ev->x, ev->y, &xpick, &ypick, &drawerstate.winpos); if(GeomMousePick( lr.lightgeoms[i], pick, (Appearance *)NULL, Tnet, NULL, NULL, xpick, ypick )) { uistate.current_light = i; set_light(i); } } } void add_light() { LmLighting *lgt; ApGet(drawerstate.ap, AP_LGT, &lgt); LmAddLight( lgt, LtCreate(LT_END) ); ++drawerstate.apseq; uistate.current_light = lr.lightcount; lights_changed_check(); } void delete_light() { LmLighting *lgt; ApGet(drawerstate.ap, AP_LGT, &lgt); LmRemoveLight( lgt, lr.lights[uistate.current_light] ); ++drawerstate.apseq; if ( uistate.current_light > (lr.lightcount - 2) ) { uistate.current_light--; } lights_changed_check(); } void lights_changed_check() { LmLighting *lgt; /* Appearance *ap; currently unused */ if (drawerstate.apseq != apseq) { ApGet( drawerstate.ap, AP_LGT, &lgt ); build_light_rack( lgt ); apseq = drawerstate.apseq; drawerstate.changed = true; /* if (uistate.lights_shown) { GeomStruct gs; gs.geom = lr.list; gs.h = NULL; gv_geometry( lr_id, &gs ); } Not just unnecessary (happens in build_light_rack) but wrong: this is a hidden GeomDelete! */ } } /* This is a complete hack. This module should use the drawer_transform stuff, * but I'm too lazy to fix it now --njt */ static void mouse2world(Point *axis, int objid) { Transform C2W, T, Tinv; DObject *dobj; if((dobj = drawer_get_object(objid)) == NULL) return; CamGet( dview[uistate.mousefocus]->cam, CAM_C2W, C2W ); PtTransform( C2W, axis, axis ); if(ISCAM(objid)) { CamGet( ((DView *)dobj)->cam, CAM_W2C, Tinv ); PtTransform( Tinv, axis, axis ); } else if(((DGeom *)dobj)->citizenship == ORDINARY) { GeomGet(dgeom[0]->Item, CR_AXIS, T); /* Assert: dgeom[0]->Inorm uses the identity matrix */ TmInvert(T, Tinv); PtTransform( Tinv, axis, axis ); } } void Rotation(double dx, double dy, Transform rot, int *target) { double ang; Point axis; if (dx == 0 && dy == 0) { TmIdentity(rot); return; } axis.x = -dy; axis.y = dx; axis.z = 0; axis.w = 0; ang = atan( sqrt( dx*dx + dy*dy ) ); mouse2world(&axis, *target); TmRotate( rot, ang, (Point3 *)(void *)&axis ); } geomview-1.9.4/src/bin/geomview/common/lights.h0000644000175000001440000000242510455700776016416 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _LIGHTS_H_ #define _LIGHTS_H_ #include "common.h" extern int light_count(); extern void set_light(int lightno); extern void set_light_color(Color *color); extern void clight_init(); extern void delete_light(); extern void add_light(); extern void light_edit_mode(int edit); extern void set_beam_color(); extern void unshow_lights(); extern void show_lights(); #endif /* ! _LIGHTS_H_ */ geomview-1.9.4/src/bin/geomview/common/version.h0000644000175000001440000000302110455700777016603 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * GEOMVIEW_VERSION is a string describing the current version of * geomview. As new versions are created this string should be * modified in a lexicographically increasing manner. This is the * string that appears in various panels and is what the * (geomview-version) lisp command returns. * * NOTE: As of verison 1.7.5 the GEOMVIEW_VERSION string now comes from * the VERSION macro defined in the configure-generated header file * config.h. This number is specified in "configure.in" in the top-level * directory. */ #if HAVE_CONFIG_H # include "config.h" #endif #ifndef GEOMVIEW_VERSION #define GEOMVIEW_VERSION VERSION #endif geomview-1.9.4/src/bin/geomview/common/Headers0000644000175000001440000000001307730234731016233 00000000000000pickfunc.h geomview-1.9.4/src/bin/geomview/Makefile.am0000644000175000001440000000041510600603243015473 00000000000000SUBDIRS = . common x11 man_MANS = geomview.1gv EXTRA_DIST = clang.c clang.h $(man_MANS) all-local: clang clang.c clang.h clang: $(top_srcdir)/src/lib/oogl/lisp/lisp2c -cprefix "gv_" -o clang $(srcdir)/common/*.c $(srcdir)/x11/*.c DISTCLEANFILES = clang.c clang.h geomview-1.9.4/src/bin/geomview/Makefile.in0000644000175000001440000004355210665240477015536 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomview DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = . common x11 man_MANS = geomview.1gv EXTRA_DIST = clang.c clang.h $(man_MANS) DISTCLEANFILES = clang.c clang.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomview/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomview/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(MANS) all-local installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-man install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-man1 install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am all-local check check-am clean clean-generic \ clean-libtool ctags ctags-recursive distclean \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-man uninstall-man1 all-local: clang clang.c clang.h clang: $(top_srcdir)/src/lib/oogl/lisp/lisp2c -cprefix "gv_" -o clang $(srcdir)/common/*.c $(srcdir)/x11/*.c # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomview/geomview.1gv0000644000175000001440000003235510605507510015715 00000000000000.TH Geomview 1gv "December 10, 1996" "Geometry Center" .SH NAME Geomview \- interactive geometry viewer .SH SYNOPSIS .na .nh .in +5 .ti -5 geomview [\-b\ \fIr\ g\ b\fP] [\-c\ \fIcommandfile\fP] [\-wins\ \fI#windows\fP] [\-noinit] [\-nopanels] [\-noopengl] [\-wpos\ \fIxmin\ ymin\ xsize\ ysize\fP] [\-wpos\ \fIxsize,ysize\fP[@\fIxmin,ymin\fP]] [\-e\ \fIexternal-module-name\fP] [\-M[cg][sp]\ \fIpipename\fP] [\-start\ \fIexternal-module-name\fP\ [\fIarg\fP ...] --] [\-run\ \fIexternal-module-path\fP\ [\fIarg\fP\ ...]\ \-\-] [\fIfile\fP ...] .br .in -5 .hy .ad .SH DESCRIPTION Geomview is an interactive geometry viewer written at the Geometry Center. It displays the objects in the files given on the command line and allows the user to view and manipulate them interactively. The present version (1.7) of geomview runs on Silicon Graphics Irises, and X Window System workstations. We are very interested in hearing about any problems you may have using it; see below for information on how to contact us. In addition to providing interactive control over a world of objects via the mouse and keyboard, geomview has an interpreted language of commands for controlling almost every aspect of its display. It can execute files containing statements in this language, and it can communicate with other programs using the language. See geomview(5), e.g. the file man/cat5/geomview.5 in the geomview distribution, for more details of the language. .SH TUTORIAL This manual page serves only as a (very) terse reference manual for geomview. For a gentler introduction to the program and the format of the data files it can read, see "overview" and "oogltour" in the "doc" directory of the geomview distribution, or better, see the full manual: "geomview.tex" or "geomview.ps", also in the "doc" directory. The source distribution also includes a tutorial for how to write external modules in the "src/bin/example" directory. .SH OPTIONS .TP -b Set the window background color to the given r g b values. .TP -c Interpret the commands in commandfile, which may be ``\-'' for standard input. The command language is described in geomview(5). Commands may be supplied literally, as in ``-c "(ui-panel main off)"''; since they include parentheses, they must be quoted. .TP -wins Causes geomview to initially display #windows camera windows. .TP -wpos Specifies the initial location and size of the first camera window. With ``-'', you are prompted for window placement. .TP -M \fIobjname\fP Display (possibly dynamically changing) geometry (or commands) sent via ``\fBtogeomview \-g\fP \fIobjname\fP [\fIgeomview-shell-command\fP]'' or ``\fBgeomstuff\fP\ \fIobjname\fP \fIfile\fP ...''. The data appears as a geomview object named \fIobjname\fP. Actually listens to the named pipe ``/tmp/geomview/\fIobjname\fP''; you can achieve the same effect with the shell commands: .br mkdir\ /tmp/geomview;\ mknod\ /tmp/geomview/\fIobjname\fP\ p .br (assuming the directory and named pipe don't already exist), then executing the geomview command: .br (geometry\ \fIobjname\fP\ \ <\ /tmp/geomview/\fIobjname\fP) .br .TP -M[cg][ps[un|in|in6]] \fIPIPENAME|TCPPORT\fP The \fB\-M\fP option accepts modifiers: a '\fBg\fP' suffix expects geometry data (the default), while a '\fBc\fP' suffix expects GCL commands. A '\fBp\fP' implies the connection should use a named pipe (the default on everything except on the NeXT), while '\fBs\fP' implies using a UNIX-domain socket (the default on the NeXT). Since version 1.9 of Geomview internet domain sockets are also supported; use '\fBsin\fP' to make Geomview listen on the IPv4 port given by \fBTCPPORT\fP, or use '\fBsin6\fP' to make Geomview listen on an IPv6 port (also as specified by \fBTCPPORT\fP). '\fBsun\fP' is a synonym for '\fBs\fP', i.e. use the Unix domain socket with the name \fBPIPENAME\fP. If \fBPIPENAME\fP starts with a slash ('/'), then it is assumed to be an absolute pathname, otherwise the named pipe or socket is created below \fB${TMPDIR}/geomview/\fP. So \fB\-Mcs fred\fP selects reading commands from the UNIX-domain socket named \fB/tmp/geomview/fred\fP, \fB\-Mcsin 40000\fP selects reading commands from the IPv4 port '40000'. .TP -noopengl Disable the use of OpenGL for (possibly) hardware accelerated rendering, even if the Geomview binary has support for OpenGL compiled in. This also disables the support for transparency and and textures .TP -nopanels Start up displaying no panels, only graphics windows. Panels may be invoked later as usual with the "Px" keyboard shortcuts or "(ui-panel ...)" command. .TP -noinit Read no initialization files. By default, geomview reads the system-wide ".geomview" file, followed by those in $HOME/.geomview and ./.geomview. .TP -e \fImodulename\fP Start an external module; \fImodulename\fP is the name associated with the module, appearing in the main panel's Applications browser, as defined by the emodule-define command (see geomview(5) for details). .TP -start \fImodulename\fP \fIarguments\fP ... -- Like -e but allows you to pass arguments to the external module. "--" signals the end of the argument list; the "--" may be omitted if it would be the last argument on the geomview command line. .TP -run \fIshell-command arguments\fP ... Like -start but takes the pathname of executable of the external module instead of the module's name. .SH GEOMETRY FILE FORMATS The format of the files read by geomview is described in oogl(5); type "man 5 oogl", or see the file man/cat5/oogl.5 in the geomview distribution, for details. Note to users of MinneView (the precursor to geomview): geomview can read MinneView files, but MinneView cannot read all geomview files. .SH STARTUP FILES Immediately upon starting up geomview reads and executes the commands in the system-wide .geomview file in the "data" subdirectory of the geomview directory. Then, if there is a file named .geomview in the current directory, it executes the commands in that file. If no .geomview file exists in the current directory, geomview looks for one in the user's home directory, and executes it if found. The startup file of an individual user overrides the systemwide defaults, since later commands take precedence over earlier ones. .SH EXTERNAL MODULES Geomview has the ability to interact via its command language with other programs, called "external modules". Many such modules have been written and appear in the "Application" browser in the main geomview panel. To invoke a module you click the mouse on the module's entry in this browser. This starts the module and adds an additional entry to the browser, beginning with a number in square brackets as in ``[1] Crayola'', which represents the running instance of that module. You can terminate the module by clicking on the numbered entry. Modules are documented separately from geomview. See the manual page for each module for details. .SH INSTALLING AN EXTERNAL MODULE Geomview looks for external modules in a special directory for modules. In the geomview distribution tree this is the "bin/$MACHTYPE" subdirectory. A module consists of two files: the executable program, and a "module init file", which is a whose name is ".geomview-" followed by the module name. The module init file tells geomview how to run that program. Be sure to always keep these two files together; geomview needs both of them in order to run the module. To install a new module, simply put the module's executable file and its init file in your geomview's module directory. The next time you run geomview, it will know about that module. Geomview can actually looks for modules in a list of directories; by default only the "bin/$MACHTYPE" directory is on this list. See the set-emodule-path command in geomview(5) for details. There is a tutorial for how to write external modules in the "src/bin/example" directory. .SH EXTERNAL MODULE INIT FILES An external module init file is the file that tells geomview how to run that module. Its name must be ".geomview-" followed by the name of the module, e.g. ".geomview-foo". It should contain geomview commands; typically it will contain a single emodule-define command which enters the module into geomview's application browser: .nf (emodule-define "Foo" "foo") .fi The first string is the name that appears in the browser. The second string is the command to invoke the module. It may contain arguments; in fact it can be an arbitrary shell command. .SH "KEYBOARD SHORTCUTS" Many geomview operations are available from the keyboard. Hitting the "?" button on the main panel, or typing "?" with the cursor in any window, causes geomview to print a message on standard output listing all the keyboard shortcuts. .nf Keyboard commands apply while cursor is in any graphics window and most control panels. Most commands allow one of the following selection prefixes (if none is provided the command applies to the current object): g world geom g# #'th geom g* All geoms c current camera c# #'th camera c* All cameras Many allow a numeric prefix: if none they toggle or reset current value. Appearance: Draw: Shading: Other: af Faces 0as Constant av eVert normals: always face viewer ae Edges 1as Flat #aw Line Width (pixels) an Normals 2as Smooth #ac edges Closer than faces(try 5-100) ab Bounding Boxes 3as Smooth, non-lighted al Shade lines aV Vectors aT allow transparency at Texture-mapping Color: aC allow concave polygons Cf Ce Cn Cb CB face/edge/normal/bbox/backgnd Motions: Viewing: r rotate [ Leftmouse=X-Y plane, 0vp Orthographic view t translate Middle=Z axis, 1vp Perspective view z zoom FOV Shift=slow motion, vd Draw other views' cameras f fly in r/t modes. ] #vv field of View o orbit [Left=steer, Middle=speed ] #vn near clip distance s scale #vf far clip distance w/W recenter/all v+ add new camera h/H halt/halt all vx cursor on/off @ select center of motion (e.g. g3@) vb backfacing poly cull on/off #vl focal length L Look At object v~ Software shading on/off show Panel: Pm Pa Pl Po main/appearance/lighting/obscure Pt Pc PC Pf tools/cameras/Commands/file-browser Ps P- saving/read commands from tty Lights: ls le Show lights / Edit Lights Metric: me mh ms Euclidean Hyperbolic Spherical Model: mv mp mc Virtual Projective Conformal Other: N normalization < Pf load geom/command file 0N none > Ps save something to file ui motion has inertia 1N each TV NTSC mode toggle uc constrained (X/Y) motion 2N all uo motion in Own coord system Rightmouse-doubleclick pick as current target object Shift-Rightmouse pick interest (center) point Renderman: RR send RIB output to NNN.rib (default fileprefix == "geom") RC Emulate lines using cylinders (default) RP Emulate lines using polygons Ra choose ASCII RIB format (default) Rb choose BINARY RIB format Rt choose Display token to specify .tiff file (default) Rf choose Display token to specify framebuffer Rs Simulate background color with Polygon (default) Rx No background simulation - fully transparent (alpha) background .fi .SH "NOTES" The "geomview" command is actually a shell script that sets various environment variables which tell geomview about your local setup, and then invokes the geomview executable program "gvx" (or "gvx.OGL"). Do not run "gvx" by itself; always invoke geomview with the "geomview" shell script. .SH "SEE ALSO" oogl(5) \- OOGL geometric file formats and conventions .br geomview(5) \- geomview command language reference .SH "FILES" .in +5 .ti -5 data/.geomview \- default initialization file in geomview command language .in -5 .br .geomview or $HOME/.geomview \- second initialization file .br data/geom \- sample data files .SH ENVIRONMENT The ``geomview'' shell script sets these internally by default; if you set them before invoking geomview, the values you set will be used instead of the built-in defaults. .in +5 .ti -5 GEOMVIEW_GVX \- geomview executable .br .ti -5 GEOMVIEW_DATA_DIR \- default directory for data files .br .ti -5 GEOMVIEW_LOAD_PATH \- colon-separated search path for data files .br .ti -5 GEOMVIEW_EMODULE_DIR \- default directory for external emodules .br .ti -5 GEOMVIEW_EMODULE_PATH \- colon-separated search path for external modules .br .ti -5 GEOMVIEW_SYSTEM_INITFILE \- system-wide GCL initialization script .br .ti -5 GEOMDATA \- top directory of the default data tree, used by some modules .br .ti -5 GEOMVIEW_DOC_DIR \- path to the user manual .br .ti -5 WEBBROWSER \- executable for viewing the HTML version of the manual when invoking the `Manual (HTML)' menu item .br .ti -5 PDFVIEWER \- executable for viewing the PDF version of the manual when invoking the `Manual (PDF)' menu item .br .in -5 .SH AUTHORS .nf Stuart Levy Tamara Munzner Mark Phillips Celeste Fowler Nathaniel Thurston Daniel Krech Scott Wisdom Daeron Meyer Timothy Rowley The National Science and Technology Research Center for Computation and Visualization of Geometric Structures (The Geometry Center) University of Minnesota www.geomview.org .fi .SH BUGS Sometimes core dumps on bad input files. Zoom and scale have no inertia. Virtual spherical mode doesn't work on VGXes. geomview-1.9.4/src/bin/geomview/clang.c0000644000175000001440000010333310624156475014712 00000000000000void gv_setenv(char * a1, char * a2) { LObject *val = LEvalFunc("setenv", LSTRING, a1, LSTRING, a2, LEND); LFree(val); } void gv_input_translator(char * a1, char * a2) { LObject *val = LEvalFunc("input-translator", LSTRING, a1, LSTRING, a2, LEND); LFree(val); } void gv_emodule_run(char * a1) { LObject *val = LEvalFunc("emodule-run", LSTRINGS, a1, LEND); LFree(val); } void gv_emodule_isrunning(char * a1) { LObject *val = LEvalFunc("emodule-isrunning", LSTRING, a1, LEND); LFree(val); } void gv_command(char * a1, char * a2) { LObject *val = LEvalFunc("command", LSTRING, a1, LSTRING, a2, LEND); LFree(val); } void gv_sleep_for(float a1) { LObject *val = LEvalFunc("sleep-for", LFLOAT, a1, LEND); LFree(val); } float gv_sleep_until(float a1) { LObject *val = LEvalFunc("sleep-until", LFLOAT, a1, LEND); float retval; LFROMOBJ(LFLOAT)(val, &retval); LFree(val); return retval; } void gv_set_clock(float a1) { LObject *val = LEvalFunc("set-clock", LFLOAT, a1, LEND); LFree(val); } void gv_clock() { LObject *val = LEvalFunc("clock", LEND); LFree(val); } void gv_echo(LList * a1) { LObject *val = LEvalFunc("echo", LREST, a1, LEND); LFree(val); } void gv_emodule_transmit(char * a1, LList * a2) { LObject *val = LEvalFunc("emodule-transmit", LSTRING, a1, LREST, a2, LEND); LFree(val); } int gv_load(char * a1, char * a2) { LObject *val = LEvalFunc("load", LSTRING, a1, LSTRING, a2, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } void gv_hdelete(char * a1, char * a2) { LObject *val = LEvalFunc("hdelete", LSTRING, a1, LSTRING, a2, LEND); LFree(val); } void gv_name_object(int a1, char * a2) { LObject *val = LEvalFunc("name-object", LID, a1, LSTRING, a2, LEND); LFree(val); } void gv_update_draw(int a1, float a2) { LObject *val = LEvalFunc("update-draw", LID, a1, LFLOAT, a2, LEND); LFree(val); } void gv_draw(int a1) { LObject *val = LEvalFunc("draw", LID, a1, LEND); LFree(val); } void gv_update(float a1) { LObject *val = LEvalFunc("update", LFLOAT, a1, LEND); LFree(val); } void gv_redraw(int a1) { LObject *val = LEvalFunc("redraw", LID, a1, LEND); LFree(val); } void gv_freeze(int a1, int a2) { LObject *val = LEvalFunc("freeze", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_xform_set(int a1, TransformStruct * a2) { LObject *val = LEvalFunc("xform-set", LID, a1, LTRANSFORM, a2, LEND); LFree(val); } void gv_xform(int a1, TransformStruct * a2) { LObject *val = LEvalFunc("xform", LID, a1, LTRANSFORM, a2, LEND); LFree(val); } void gv_xform_incr(int a1, TransformStruct * a2) { LObject *val = LEvalFunc("xform-incr", LID, a1, LTRANSFORM, a2, LEND); LFree(val); } int gv_new_camera(char * a1, CameraStruct * a2) { LObject *val = LEvalFunc("new-camera", LSTRING, a1, LCAMERA, a2, LEND); int retval; LFROMOBJ(LID)(val, &retval); LFree(val); return retval; } int gv_camera(char * a1, CameraStruct * a2) { LObject *val = LEvalFunc("camera", LSTRING, a1, LCAMERA, a2, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } void gv_camera_reset(int a1) { LObject *val = LEvalFunc("camera-reset", LID, a1, LEND); LFree(val); } int gv_new_alien(char * a1, GeomStruct * a2) { LObject *val = LEvalFunc("new-alien", LSTRING, a1, LGEOM, a2, LEND); int retval; LFROMOBJ(LID)(val, &retval); LFree(val); return retval; } int gv_new_geometry(char * a1, GeomStruct * a2) { LObject *val = LEvalFunc("new-geometry", LSTRING, a1, LGEOM, a2, LEND); int retval; LFROMOBJ(LID)(val, &retval); LFree(val); return retval; } void gv_geometry(char * a1, GeomStruct * a2) { LObject *val = LEvalFunc("geometry", LSTRING, a1, LGEOM, a2, LEND); LFree(val); } void gv_replace_geometry(char * a1, int *a2, int a2n, GeomStruct * a3) { LObject *val = LEvalFunc("replace-geometry", LSTRING, a1, LARRAY, LINT, a2, a2n, LGEOM, a3, LEND); LFree(val); } void gv_copy(int a1, char * a2) { LObject *val = LEvalFunc("copy", LID, a1, LSTRING, a2, LEND); LFree(val); } void gv_delete(int a1) { LObject *val = LEvalFunc("delete", LID, a1, LEND); LFree(val); } void gv_scene(int a1, GeomStruct * a2) { LObject *val = LEvalFunc("scene", LID, a1, LGEOM, a2, LEND); LFree(val); } void gv_winenter(int a1) { LObject *val = LEvalFunc("winenter", LID, a1, LEND); LFree(val); } void gv_merge_ap(int a1, ApStruct * a2) { LObject *val = LEvalFunc("merge-ap", LID, a1, LAP, a2, LEND); LFree(val); } void gv_dice(int a1, int a2) { LObject *val = LEvalFunc("dice", LID, a1, LINT, a2, LEND); LFree(val); } void gv_bbox_draw(int a1, int a2) { LObject *val = LEvalFunc("bbox-draw", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_camera_draw(int a1, int a2) { LObject *val = LEvalFunc("camera-draw", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_evert(int a1, int a2) { LObject *val = LEvalFunc("evert", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_soft_shader(int a1, int a2) { LObject *val = LEvalFunc("soft-shader", LID, a1, LKEYWORD, a2, LEND); LFree(val); } LList * gv_stereowin(int a1, int a2, int a3) { LObject *val = LEvalFunc("stereowin", LID, a1, LKEYWORD, a2, LINT, a3, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } void gv_space(int a1) { LObject *val = LEvalFunc("space", LKEYWORD, a1, LEND); LFree(val); } void gv_hmodel(int a1, int a2) { LObject *val = LEvalFunc("hmodel", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_inhibit_warning(char * a1) { LObject *val = LEvalFunc("inhibit-warning", LSTRING, a1, LEND); LFree(val); } void gv_hsphere_draw(int a1, int a2) { LObject *val = LEvalFunc("hsphere-draw", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_pickable(int a1, int a2) { LObject *val = LEvalFunc("pickable", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_normalization(int a1, int a2) { LObject *val = LEvalFunc("normalization", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_lines_closer(int a1, float a2) { LObject *val = LEvalFunc("lines-closer", LID, a1, LFLOAT, a2, LEND); LFree(val); } void gv_backcolor(int a1, float a2, float a3, float a4) { LObject *val = LEvalFunc("backcolor", LID, a1, LFLOAT, a2, LFLOAT, a3, LFLOAT, a4, LEND); LFree(val); } void gv_bbox_color(int a1, float a2, float a3, float a4) { LObject *val = LEvalFunc("bbox-color", LID, a1, LFLOAT, a2, LFLOAT, a3, LFLOAT, a4, LEND); LFree(val); } void gv_window(int a1, WindowStruct * a2) { LObject *val = LEvalFunc("window", LID, a1, LWINDOW, a2, LEND); LFree(val); } void gv_merge_baseap(ApStruct * a1) { LObject *val = LEvalFunc("merge-baseap", LAP, a1, LEND); LFree(val); } void gv_exit() { LObject *val = LEvalFunc("exit", LEND); LFree(val); } void gv_set_motionscale(float a1) { LObject *val = LEvalFunc("set-motionscale", LFLOAT, a1, LEND); LFree(val); } void gv_set_conformal_refine(float a1, int a2, int a3) { LObject *val = LEvalFunc("set-conformal-refine", LFLOAT, a1, LINT, a2, LKEYWORD, a3, LEND); LFree(val); } void gv_write_comments(char * a1, int a2, int *a3, int a3n) { LObject *val = LEvalFunc("write-comments", LSTRING, a1, LID, a2, LARRAY, LINT, a3, a3n, LEND); LFree(val); } void gv_event_mode(char * a1) { LObject *val = LEvalFunc("event-mode", LSTRING, a1, LEND); LFree(val); } void gv_pick_invisible(int a1) { LObject *val = LEvalFunc("pick-invisible", LKEYWORD, a1, LEND); LFree(val); } void gv_rawevent(int a1, int a2, int a3, int a4, unsigned long a5) { LObject *val = LEvalFunc("rawevent", LINT, a1, LINT, a2, LINT, a3, LINT, a4, LULONG, a5, LEND); LFree(val); } int gv_rawpick(int a1, int a2, int a3) { LObject *val = LEvalFunc("rawpick", LID, a1, LINT, a2, LINT, a3, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } void gv_pick(int a1, int a2, float *a3, int a3n, float *a4, int a4n, float *a5, int a5n, float *a6, int a6n, int *a7, int a7n, int a8, int *a9, int a9n, int a10) { LObject *val = LEvalFunc("pick", LID, a1, LID, a2, LVARARRAY, LFLOAT, a3, a3n, LVARARRAY, LFLOAT, a4, a4n, LVARARRAY, LFLOAT, a5, a5n, LVARARRAY, LFLOAT, a6, a6n, LVARARRAY, LINT, a7, a7n, LINT, a8, LARRAY, LINT, a9, a9n, LINT, a10, LEND); LFree(val); } void gv_event_keys(int a1) { LObject *val = LEvalFunc("event-keys", LKEYWORD, a1, LEND); LFree(val); } void gv_event_pick(int a1) { LObject *val = LEvalFunc("event-pick", LKEYWORD, a1, LEND); LFree(val); } void gv_dither(int a1, int a2) { LObject *val = LEvalFunc("dither", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_ui_html_browser(char * a1) { LObject *val = LEvalFunc("ui-html-browser", LSTRING, a1, LEND); LFree(val); } void gv_ui_pdf_viewer(char * a1) { LObject *val = LEvalFunc("ui-pdf-viewer", LSTRING, a1, LEND); LFree(val); } void gv_shell(char * a1) { LObject *val = LEvalFunc("shell", LSTRINGS, a1, LEND); LFree(val); } void gv_write_sexpr(char * a1, LObject * a2) { LObject *val = LEvalFunc("write-sexpr", LSTRING, a1, LLOBJECT, a2, LEND); LFree(val); } void gv_write_handle(char * a1, char * a2, char * a3) { LObject *val = LEvalFunc("write-handle", LSTRING, a1, LSTRING, a2, LSTRING, a3, LEND); LFree(val); } void gv_dump_handles() { LObject *val = LEvalFunc("dump-handles", LEND); LFree(val); } char * gv_geomview_version() { LObject *val = LEvalFunc("geomview-version", LEND); char * retval; LFROMOBJ(LSTRING)(val, &retval); LFree(val); return retval; } void gv_rib_display(int a1, char * a2) { LObject *val = LEvalFunc("rib-display", LKEYWORD, a1, LSTRING, a2, LEND); LFree(val); } void gv_rib_snapshot(int a1, char * a2) { LObject *val = LEvalFunc("rib-snapshot", LID, a1, LSTRING, a2, LEND); LFree(val); } LList * gv_ND_axes(char * a1, char * a2, int a3, int a4, int a5, int a6) { LObject *val = LEvalFunc("ND-axes", LSTRING, a1, LSTRING, a2, LINT, a3, LINT, a4, LINT, a5, LINT, a6, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } LList * gv_dimension(int a1) { LObject *val = LEvalFunc("dimension", LINT, a1, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } TmNStruct * gv_ND_xform(int a1, TmNStruct * a2) { LObject *val = LEvalFunc("ND-xform", LID, a1, LTRANSFORMN, a2, LEND); TmNStruct * retval; LFROMOBJ(LTRANSFORMN)(val, &retval); LFree(val); return retval; } TmNStruct * gv_ND_xform_set(int a1, TmNStruct * a2) { LObject *val = LEvalFunc("ND-xform-set", LID, a1, LTRANSFORMN, a2, LEND); TmNStruct * retval; LFROMOBJ(LTRANSFORMN)(val, &retval); LFree(val); return retval; } TmNStruct * gv_ND_xform_get(int a1, int a2) { LObject *val = LEvalFunc("ND-xform-get", LID, a1, LID, a2, LEND); TmNStruct * retval; LFROMOBJ(LTRANSFORMN)(val, &retval); LFree(val); return retval; } LList * gv_ND_color(int a1, LList * a2) { LObject *val = LEvalFunc("ND-color", LID, a1, LLIST, a2, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } void gv_zoom(int a1, float a2) { LObject *val = LEvalFunc("zoom", LID, a1, LFLOAT, a2, LEND); LFree(val); } void gv_ezoom(int a1, float a2) { LObject *val = LEvalFunc("ezoom", LID, a1, LFLOAT, a2, LEND); LFree(val); } void gv_scale(int a1, float a2, float a3, float a4) { LObject *val = LEvalFunc("scale", LID, a1, LFLOAT, a2, LFLOAT, a3, LFLOAT, a4, LEND); LFree(val); } void gv_escale(int a1, float a2) { LObject *val = LEvalFunc("escale", LID, a1, LFLOAT, a2, LEND); LFree(val); } char * gv_real_id(char * a1) { LObject *val = LEvalFunc("real-id", LSTRING, a1, LEND); char * retval; LFROMOBJ(LSTRING)(val, &retval); LFree(val); return retval; } void gv_transform(int a1, int a2, int a3, int a4, float a5, float a6, float a7, float a8, int a9) { LObject *val = LEvalFunc("transform", LID, a1, LID, a2, LID, a3, LKEYWORD, a4, LFLOAT, a5, LFLOAT, a6, LFLOAT, a7, LFLOAT, a8, LKEYWORD, a9, LEND); LFree(val); } void gv_transform_incr(int a1, int a2, int a3, int a4, float a5, float a6, float a7, float a8, int a9) { LObject *val = LEvalFunc("transform-incr", LID, a1, LID, a2, LID, a3, LKEYWORD, a4, LFLOAT, a5, LFLOAT, a6, LFLOAT, a7, LFLOAT, a8, LKEYWORD, a9, LEND); LFree(val); } void gv_transform_set(int a1, int a2, int a3, int a4, float a5, float a6, float a7) { LObject *val = LEvalFunc("transform-set", LID, a1, LID, a2, LID, a3, LKEYWORD, a4, LFLOAT, a5, LFLOAT, a6, LFLOAT, a7, LEND); LFree(val); } void gv_position(int a1, int a2) { LObject *val = LEvalFunc("position", LID, a1, LID, a2, LEND); LFree(val); } void gv_position_at(int a1, int a2, char * a3) { LObject *val = LEvalFunc("position-at", LID, a1, LID, a2, LSTRING, a3, LEND); LFree(val); } void gv_position_toward(int a1, int a2, char * a3) { LObject *val = LEvalFunc("position-toward", LID, a1, LID, a2, LSTRING, a3, LEND); LFree(val); } void gv_new_center(int a1) { LObject *val = LEvalFunc("new-center", LID, a1, LEND); LFree(val); } void gv_new_reset() { LObject *val = LEvalFunc("new-reset", LEND); LFree(val); } LList * gv_look_encompass_size(float a1, float a2, float a3, float a4) { LObject *val = LEvalFunc("look-encompass-size", LFLOAT, a1, LFLOAT, a2, LFLOAT, a3, LFLOAT, a4, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } void gv_look_encompass(int a1, int a2) { LObject *val = LEvalFunc("look-encompass", LID, a1, LID, a2, LEND); LFree(val); } void gv_look_toward(int a1, int a2, char * a3) { LObject *val = LEvalFunc("look-toward", LID, a1, LID, a2, LSTRING, a3, LEND); LFree(val); } void gv_look(int a1, int a2) { LObject *val = LEvalFunc("look", LID, a1, LID, a2, LEND); LFree(val); } void gv_look_recenter(int a1, int a2) { LObject *val = LEvalFunc("look-recenter", LID, a1, LID, a2, LEND); LFree(val); } void gv_emodule_clear() { LObject *val = LEvalFunc("emodule-clear", LEND); LFree(val); } void gv_cursor_still(int a1) { LObject *val = LEvalFunc("cursor-still", LINT, a1, LEND); LFree(val); } void gv_cursor_twitch(int a1) { LObject *val = LEvalFunc("cursor-twitch", LINT, a1, LEND); LFree(val); } void gv_ap_override(int a1) { LObject *val = LEvalFunc("ap-override", LKEYWORD, a1, LEND); LFree(val); } void gv_set_load_path(LList * a1) { LObject *val = LEvalFunc("set-load-path", LLIST, a1, LEND); LFree(val); } LList * gv_load_path(LList * a1) { LObject *val = LEvalFunc("load-path", LLIST, a1, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } void gv_set_emodule_path(LList * a1) { LObject *val = LEvalFunc("set-emodule-path", LLIST, a1, LEND); LFree(val); } LList * gv_rehash_emodule_path() { LObject *val = LEvalFunc("rehash-emodule-path", LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } LList * gv_emodule_path() { LObject *val = LEvalFunc("emodule-path", LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } char * gv_emodule_defined(char * a1) { LObject *val = LEvalFunc("emodule-defined", LSTRING, a1, LEND); char * retval; LFROMOBJ(LSTRING)(val, &retval); LFree(val); return retval; } LList * gv_all(char * a1, char * a2) { LObject *val = LEvalFunc("all", LSTRING, a1, LSTRING, a2, LEND); LList * retval; LFROMOBJ(LLIST)(val, &retval); LFree(val); return retval; } void gv_camera_prop(GeomStruct * a1, int a2) { LObject *val = LEvalFunc("camera-prop", LGEOM, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_write(char * a1, char * a2, LObject * a3, int a4) { LObject *val = LEvalFunc("write", LSTRING, a1, LSTRING, a2, LLOBJECT, a3, LID, a4, LEND); LFree(val); } int gv_snapshot(int a1, char * a2, char * a3, int a4, int a5) { LObject *val = LEvalFunc("snapshot", LID, a1, LSTRING, a2, LSTRING, a3, LINT, a4, LINT, a5, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } char * gv_bgimagefile(int a1, char * a2) { LObject *val = LEvalFunc("background-image", LID, a1, LSTRING, a2, LEND); char * retval; LFROMOBJ(LSTRING)(val, &retval); LFree(val); return retval; } void gv_ui_motion(int a1, int a2) { LObject *val = LEvalFunc("ui-motion", LKEYWORD, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_ui_cam_focus(int a1) { LObject *val = LEvalFunc("ui-cam-focus", LKEYWORD, a1, LEND); LFree(val); } void gv_ui_target(int a1, int a2) { LObject *val = LEvalFunc("ui-target", LID, a1, LKEYWORD, a2, LEND); LFree(val); } void gv_ui_center(int a1) { LObject *val = LEvalFunc("ui-center", LID, a1, LEND); LFree(val); } void gv_ui_center_origin(int a1) { LObject *val = LEvalFunc("ui-center-origin", LKEYWORD, a1, LEND); LFree(val); } void gv_ui_panel(char * a1, int a2, WindowStruct * a3) { LObject *val = LEvalFunc("ui-panel", LSTRING, a1, LKEYWORD, a2, LWINDOW, a3, LEND); LFree(val); } void gv_ui_freeze(int a1) { LObject *val = LEvalFunc("ui-freeze", LKEYWORD, a1, LEND); LFree(val); } void gv_ui_emodule_define(char * a1, char * a2) { LObject *val = LEvalFunc("emodule-define", LSTRING, a1, LSTRING, a2, LEND); LFree(val); } void gv_emodule_sort() { LObject *val = LEvalFunc("emodule-sort", LEND); LFree(val); } void gv_ui_emodule_start(char * a1) { LObject *val = LEvalFunc("emodule-start", LSTRING, a1, LEND); LFree(val); } extern LObject *Lsetenv(Lake *, LList *); extern LObject *Linput_translator(Lake *, LList *); extern LObject *Lemodule_run(Lake *, LList *); extern LObject *Lemodule_isrunning(Lake *, LList *); extern LObject *Lcommand(Lake *, LList *); extern LObject *Lsleep_for(Lake *, LList *); extern LObject *Lsleep_until(Lake *, LList *); extern LObject *Lset_clock(Lake *, LList *); extern LObject *Lclock(Lake *, LList *); extern LObject *Lecho(Lake *, LList *); extern LObject *Lemodule_transmit(Lake *, LList *); extern LObject *Lload(Lake *, LList *); extern LObject *Lhdelete(Lake *, LList *); extern LObject *Lname_object(Lake *, LList *); extern LObject *Lupdate_draw(Lake *, LList *); extern LObject *Ldraw(Lake *, LList *); extern LObject *Lupdate(Lake *, LList *); extern LObject *Lredraw(Lake *, LList *); extern LObject *Lfreeze(Lake *, LList *); extern LObject *Lxform_set(Lake *, LList *); extern LObject *Lxform(Lake *, LList *); extern LObject *Lxform_incr(Lake *, LList *); extern LObject *Lnew_camera(Lake *, LList *); extern LObject *Lcamera(Lake *, LList *); extern LObject *Lcamera_reset(Lake *, LList *); extern LObject *Lnew_alien(Lake *, LList *); extern LObject *Lnew_geometry(Lake *, LList *); extern LObject *Lgeometry(Lake *, LList *); extern LObject *Lreplace_geometry(Lake *, LList *); extern LObject *Lcopy(Lake *, LList *); extern LObject *Ldelete(Lake *, LList *); extern LObject *Lscene(Lake *, LList *); extern LObject *Lwinenter(Lake *, LList *); extern LObject *Lmerge_ap(Lake *, LList *); extern LObject *Ldice(Lake *, LList *); extern LObject *Lbbox_draw(Lake *, LList *); extern LObject *Lcamera_draw(Lake *, LList *); extern LObject *Levert(Lake *, LList *); extern LObject *Lsoft_shader(Lake *, LList *); extern LObject *Lstereowin(Lake *, LList *); extern LObject *Lspace(Lake *, LList *); extern LObject *Lhmodel(Lake *, LList *); extern LObject *Linhibit_warning(Lake *, LList *); extern LObject *Lhsphere_draw(Lake *, LList *); extern LObject *Lpickable(Lake *, LList *); extern LObject *Lnormalization(Lake *, LList *); extern LObject *Llines_closer(Lake *, LList *); extern LObject *Lbackcolor(Lake *, LList *); extern LObject *Lbbox_color(Lake *, LList *); extern LObject *Lwindow(Lake *, LList *); extern LObject *Lmerge_baseap(Lake *, LList *); extern LObject *Lexit(Lake *, LList *); extern LObject *Lset_motionscale(Lake *, LList *); extern LObject *Lset_conformal_refine(Lake *, LList *); extern LObject *Lwrite_comments(Lake *, LList *); extern LObject *Levent_mode(Lake *, LList *); extern LObject *Lpick_invisible(Lake *, LList *); extern LObject *Lrawevent(Lake *, LList *); extern LObject *Lrawpick(Lake *, LList *); extern LObject *Lpick(Lake *, LList *); extern LObject *Levent_keys(Lake *, LList *); extern LObject *Levent_pick(Lake *, LList *); extern LObject *Ldither(Lake *, LList *); extern LObject *Lui_html_browser(Lake *, LList *); extern LObject *Lui_pdf_viewer(Lake *, LList *); extern LObject *Lshell(Lake *, LList *); extern LObject *Lwrite_sexpr(Lake *, LList *); extern LObject *Lwrite_handle(Lake *, LList *); extern LObject *Ldump_handles(Lake *, LList *); extern LObject *Lgeomview_version(Lake *, LList *); extern LObject *Lrib_display(Lake *, LList *); extern LObject *Lrib_snapshot(Lake *, LList *); extern LObject *LND_axes(Lake *, LList *); extern LObject *Ldimension(Lake *, LList *); extern LObject *LND_xform(Lake *, LList *); extern LObject *LND_xform_set(Lake *, LList *); extern LObject *LND_xform_get(Lake *, LList *); extern LObject *LND_color(Lake *, LList *); extern LObject *Lzoom(Lake *, LList *); extern LObject *Lezoom(Lake *, LList *); extern LObject *Lscale(Lake *, LList *); extern LObject *Lescale(Lake *, LList *); extern LObject *Lreal_id(Lake *, LList *); extern LObject *Ltransform(Lake *, LList *); extern LObject *Ltransform_incr(Lake *, LList *); extern LObject *Ltransform_set(Lake *, LList *); extern LObject *Lposition(Lake *, LList *); extern LObject *Lposition_at(Lake *, LList *); extern LObject *Lposition_toward(Lake *, LList *); extern LObject *Lnew_center(Lake *, LList *); extern LObject *Lnew_reset(Lake *, LList *); extern LObject *Llook_encompass_size(Lake *, LList *); extern LObject *Llook_encompass(Lake *, LList *); extern LObject *Llook_toward(Lake *, LList *); extern LObject *Llook(Lake *, LList *); extern LObject *Llook_recenter(Lake *, LList *); extern LObject *Lemodule_clear(Lake *, LList *); extern LObject *Lcursor_still(Lake *, LList *); extern LObject *Lcursor_twitch(Lake *, LList *); extern LObject *Lap_override(Lake *, LList *); extern LObject *Lset_load_path(Lake *, LList *); extern LObject *Lload_path(Lake *, LList *); extern LObject *Lset_emodule_path(Lake *, LList *); extern LObject *Lrehash_emodule_path(Lake *, LList *); extern LObject *Lemodule_path(Lake *, LList *); extern LObject *Lemodule_defined(Lake *, LList *); extern LObject *Lall(Lake *, LList *); extern LObject *Lcamera_prop(Lake *, LList *); extern LObject *Lwrite(Lake *, LList *); extern LObject *Lsnapshot(Lake *, LList *); extern LObject *Lbgimagefile(Lake *, LList *); extern LObject *Lui_motion(Lake *, LList *); extern LObject *Lui_cam_focus(Lake *, LList *); extern LObject *Lui_target(Lake *, LList *); extern LObject *Lui_center(Lake *, LList *); extern LObject *Lui_center_origin(Lake *, LList *); extern LObject *Lui_panel(Lake *, LList *); extern LObject *Lui_freeze(Lake *, LList *); extern LObject *Lui_emodule_define(Lake *, LList *); extern LObject *Lemodule_sort(Lake *, LList *); extern LObject *Lui_emodule_start(Lake *, LList *); extern char Hsetenv[]; extern char Hinput_translator[]; extern char Hemodule_run[]; extern char Hemodule_isrunning[]; extern char Hcommand[]; extern char Hsleep_for[]; extern char Hsleep_until[]; extern char Hset_clock[]; extern char Hclock[]; extern char Hecho[]; extern char Hemodule_transmit[]; extern char Hload[]; extern char Hhdelete[]; extern char Hname_object[]; extern char Hupdate_draw[]; extern char Hdraw[]; extern char Hupdate[]; extern char Hredraw[]; extern char Hfreeze[]; extern char Hxform_set[]; extern char Hxform[]; extern char Hxform_incr[]; extern char Hnew_camera[]; extern char Hcamera[]; extern char Hcamera_reset[]; extern char Hnew_alien[]; extern char Hnew_geometry[]; extern char Hgeometry[]; extern char Hreplace_geometry[]; extern char Hcopy[]; extern char Hdelete[]; extern char Hscene[]; extern char Hwinenter[]; extern char Hmerge_ap[]; extern char Hdice[]; extern char Hbbox_draw[]; extern char Hcamera_draw[]; extern char Hevert[]; extern char Hsoft_shader[]; extern char Hstereowin[]; extern char Hspace[]; extern char Hhmodel[]; extern char Hinhibit_warning[]; extern char Hhsphere_draw[]; extern char Hpickable[]; extern char Hnormalization[]; extern char Hlines_closer[]; extern char Hbackcolor[]; extern char Hbbox_color[]; extern char Hwindow[]; extern char Hmerge_baseap[]; extern char Hexit[]; extern char Hset_motionscale[]; extern char Hset_conformal_refine[]; extern char Hwrite_comments[]; extern char Hevent_mode[]; extern char Hpick_invisible[]; extern char Hrawevent[]; extern char Hrawpick[]; extern char Hpick[]; extern char Hevent_keys[]; extern char Hevent_pick[]; extern char Hdither[]; extern char Hui_html_browser[]; extern char Hui_pdf_viewer[]; extern char Hshell[]; extern char Hwrite_sexpr[]; extern char Hwrite_handle[]; extern char Hdump_handles[]; extern char Hgeomview_version[]; extern char Hrib_display[]; extern char Hrib_snapshot[]; extern char HND_axes[]; extern char Hdimension[]; extern char HND_xform[]; extern char HND_xform_set[]; extern char HND_xform_get[]; extern char HND_color[]; extern char Hzoom[]; extern char Hezoom[]; extern char Hscale[]; extern char Hescale[]; extern char Hreal_id[]; extern char Htransform[]; extern char Htransform_incr[]; extern char Htransform_set[]; extern char Hposition[]; extern char Hposition_at[]; extern char Hposition_toward[]; extern char Hnew_center[]; extern char Hnew_reset[]; extern char Hlook_encompass_size[]; extern char Hlook_encompass[]; extern char Hlook_toward[]; extern char Hlook[]; extern char Hlook_recenter[]; extern char Hemodule_clear[]; extern char Hcursor_still[]; extern char Hcursor_twitch[]; extern char Hap_override[]; extern char Hset_load_path[]; extern char Hload_path[]; extern char Hset_emodule_path[]; extern char Hrehash_emodule_path[]; extern char Hemodule_path[]; extern char Hemodule_defined[]; extern char Hall[]; extern char Hcamera_prop[]; extern char Hwrite[]; extern char Hsnapshot[]; extern char Hbgimagefile[]; extern char Hui_motion[]; extern char Hui_cam_focus[]; extern char Hui_target[]; extern char Hui_center[]; extern char Hui_center_origin[]; extern char Hui_panel[]; extern char Hui_freeze[]; extern char Hui_emodule_define[]; extern char Hemodule_sort[]; extern char Hui_emodule_start[]; void clang_init() { LDefun("setenv", Lsetenv, Hsetenv); LDefun("input-translator", Linput_translator, Hinput_translator); LDefun("emodule-run", Lemodule_run, Hemodule_run); LDefun("emodule-isrunning", Lemodule_isrunning, Hemodule_isrunning); LDefun("command", Lcommand, Hcommand); LDefun("sleep-for", Lsleep_for, Hsleep_for); LDefun("sleep-until", Lsleep_until, Hsleep_until); LDefun("set-clock", Lset_clock, Hset_clock); LDefun("clock", Lclock, Hclock); LDefun("echo", Lecho, Hecho); LDefun("emodule-transmit", Lemodule_transmit, Hemodule_transmit); LDefun("load", Lload, Hload); LDefun("hdelete", Lhdelete, Hhdelete); LDefun("name-object", Lname_object, Hname_object); LDefun("update-draw", Lupdate_draw, Hupdate_draw); LDefun("draw", Ldraw, Hdraw); LDefun("update", Lupdate, Hupdate); LDefun("redraw", Lredraw, Hredraw); LDefun("freeze", Lfreeze, Hfreeze); LDefun("xform-set", Lxform_set, Hxform_set); LDefun("xform", Lxform, Hxform); LDefun("xform-incr", Lxform_incr, Hxform_incr); LDefun("new-camera", Lnew_camera, Hnew_camera); LDefun("camera", Lcamera, Hcamera); LDefun("camera-reset", Lcamera_reset, Hcamera_reset); LDefun("new-alien", Lnew_alien, Hnew_alien); LDefun("new-geometry", Lnew_geometry, Hnew_geometry); LDefun("geometry", Lgeometry, Hgeometry); LDefun("replace-geometry", Lreplace_geometry, Hreplace_geometry); LDefun("copy", Lcopy, Hcopy); LDefun("delete", Ldelete, Hdelete); LDefun("scene", Lscene, Hscene); LDefun("winenter", Lwinenter, Hwinenter); LDefun("merge-ap", Lmerge_ap, Hmerge_ap); LDefun("dice", Ldice, Hdice); LDefun("bbox-draw", Lbbox_draw, Hbbox_draw); LDefun("camera-draw", Lcamera_draw, Hcamera_draw); LDefun("evert", Levert, Hevert); LDefun("soft-shader", Lsoft_shader, Hsoft_shader); LDefun("stereowin", Lstereowin, Hstereowin); LDefun("space", Lspace, Hspace); LDefun("hmodel", Lhmodel, Hhmodel); LDefun("inhibit-warning", Linhibit_warning, Hinhibit_warning); LDefun("hsphere-draw", Lhsphere_draw, Hhsphere_draw); LDefun("pickable", Lpickable, Hpickable); LDefun("normalization", Lnormalization, Hnormalization); LDefun("lines-closer", Llines_closer, Hlines_closer); LDefun("backcolor", Lbackcolor, Hbackcolor); LDefun("bbox-color", Lbbox_color, Hbbox_color); LDefun("window", Lwindow, Hwindow); LDefun("merge-baseap", Lmerge_baseap, Hmerge_baseap); LDefun("exit", Lexit, Hexit); LDefun("set-motionscale", Lset_motionscale, Hset_motionscale); LDefun("set-conformal-refine", Lset_conformal_refine, Hset_conformal_refine); LDefun("write-comments", Lwrite_comments, Hwrite_comments); LDefun("event-mode", Levent_mode, Hevent_mode); LDefun("pick-invisible", Lpick_invisible, Hpick_invisible); LDefun("rawevent", Lrawevent, Hrawevent); LDefun("rawpick", Lrawpick, Hrawpick); LDefun("pick", Lpick, Hpick); LDefun("event-keys", Levent_keys, Hevent_keys); LDefun("event-pick", Levent_pick, Hevent_pick); LDefun("dither", Ldither, Hdither); LDefun("ui-html-browser", Lui_html_browser, Hui_html_browser); LDefun("ui-pdf-viewer", Lui_pdf_viewer, Hui_pdf_viewer); LDefun("shell", Lshell, Hshell); LDefun("write-sexpr", Lwrite_sexpr, Hwrite_sexpr); LDefun("write-handle", Lwrite_handle, Hwrite_handle); LDefun("dump-handles", Ldump_handles, Hdump_handles); LDefun("geomview-version", Lgeomview_version, Hgeomview_version); LDefun("rib-display", Lrib_display, Hrib_display); LDefun("rib-snapshot", Lrib_snapshot, Hrib_snapshot); LDefun("ND-axes", LND_axes, HND_axes); LDefun("dimension", Ldimension, Hdimension); LDefun("ND-xform", LND_xform, HND_xform); LDefun("ND-xform-set", LND_xform_set, HND_xform_set); LDefun("ND-xform-get", LND_xform_get, HND_xform_get); LDefun("ND-color", LND_color, HND_color); LDefun("zoom", Lzoom, Hzoom); LDefun("ezoom", Lezoom, Hezoom); LDefun("scale", Lscale, Hscale); LDefun("escale", Lescale, Hescale); LDefun("real-id", Lreal_id, Hreal_id); LDefun("transform", Ltransform, Htransform); LDefun("transform-incr", Ltransform_incr, Htransform_incr); LDefun("transform-set", Ltransform_set, Htransform_set); LDefun("position", Lposition, Hposition); LDefun("position-at", Lposition_at, Hposition_at); LDefun("position-toward", Lposition_toward, Hposition_toward); LDefun("new-center", Lnew_center, Hnew_center); LDefun("new-reset", Lnew_reset, Hnew_reset); LDefun("look-encompass-size", Llook_encompass_size, Hlook_encompass_size); LDefun("look-encompass", Llook_encompass, Hlook_encompass); LDefun("look-toward", Llook_toward, Hlook_toward); LDefun("look", Llook, Hlook); LDefun("look-recenter", Llook_recenter, Hlook_recenter); LDefun("emodule-clear", Lemodule_clear, Hemodule_clear); LDefun("cursor-still", Lcursor_still, Hcursor_still); LDefun("cursor-twitch", Lcursor_twitch, Hcursor_twitch); LDefun("ap-override", Lap_override, Hap_override); LDefun("set-load-path", Lset_load_path, Hset_load_path); LDefun("load-path", Lload_path, Hload_path); LDefun("set-emodule-path", Lset_emodule_path, Hset_emodule_path); LDefun("rehash-emodule-path", Lrehash_emodule_path, Hrehash_emodule_path); LDefun("emodule-path", Lemodule_path, Hemodule_path); LDefun("emodule-defined", Lemodule_defined, Hemodule_defined); LDefun("all", Lall, Hall); LDefun("camera-prop", Lcamera_prop, Hcamera_prop); LDefun("write", Lwrite, Hwrite); LDefun("snapshot", Lsnapshot, Hsnapshot); LDefun("background-image", Lbgimagefile, Hbgimagefile); LDefun("ui-motion", Lui_motion, Hui_motion); LDefun("ui-cam-focus", Lui_cam_focus, Hui_cam_focus); LDefun("ui-target", Lui_target, Hui_target); LDefun("ui-center", Lui_center, Hui_center); LDefun("ui-center-origin", Lui_center_origin, Hui_center_origin); LDefun("ui-panel", Lui_panel, Hui_panel); LDefun("ui-freeze", Lui_freeze, Hui_freeze); LDefun("emodule-define", Lui_emodule_define, Hui_emodule_define); LDefun("emodule-sort", Lemodule_sort, Hemodule_sort); LDefun("emodule-start", Lui_emodule_start, Hui_emodule_start); } geomview-1.9.4/src/bin/geomview/clang.h0000644000175000001440000001154410603777310014713 00000000000000void gv_setenv(char * a1, char * a2); void gv_input_translator(char * a1, char * a2); void gv_emodule_run(char * a1); void gv_emodule_isrunning(char * a1); void gv_command(char * a1, char * a2); void gv_sleep_for(float a1); float gv_sleep_until(float a1); void gv_set_clock(float a1); void gv_clock(); void gv_echo(LList * a1); void gv_emodule_transmit(char * a1, LList * a2); int gv_load(char * a1, char * a2); void gv_hdelete(char * a1, char * a2); void gv_name_object(int a1, char * a2); void gv_update_draw(int a1, float a2); void gv_draw(int a1); void gv_update(float a1); void gv_redraw(int a1); void gv_freeze(int a1, int a2); void gv_xform_set(int a1, TransformStruct * a2); void gv_xform(int a1, TransformStruct * a2); void gv_xform_incr(int a1, TransformStruct * a2); int gv_new_camera(char * a1, CameraStruct * a2); int gv_camera(char * a1, CameraStruct * a2); void gv_camera_reset(int a1); int gv_new_alien(char * a1, GeomStruct * a2); int gv_new_geometry(char * a1, GeomStruct * a2); void gv_geometry(char * a1, GeomStruct * a2); void gv_replace_geometry(char * a1, int *a2, int a2n, GeomStruct * a3); void gv_copy(int a1, char * a2); void gv_delete(int a1); void gv_scene(int a1, GeomStruct * a2); void gv_winenter(int a1); void gv_merge_ap(int a1, ApStruct * a2); void gv_dice(int a1, int a2); void gv_bbox_draw(int a1, int a2); void gv_camera_draw(int a1, int a2); void gv_evert(int a1, int a2); void gv_soft_shader(int a1, int a2); LList * gv_stereowin(int a1, int a2, int a3); void gv_space(int a1); void gv_hmodel(int a1, int a2); void gv_inhibit_warning(char * a1); void gv_hsphere_draw(int a1, int a2); void gv_pickable(int a1, int a2); void gv_normalization(int a1, int a2); void gv_lines_closer(int a1, float a2); void gv_backcolor(int a1, float a2, float a3, float a4); void gv_bbox_color(int a1, float a2, float a3, float a4); void gv_window(int a1, WindowStruct * a2); void gv_merge_baseap(ApStruct * a1); void gv_exit(); void gv_set_motionscale(float a1); void gv_set_conformal_refine(float a1, int a2, int a3); void gv_write_comments(char * a1, int a2, int *a3, int a3n); void gv_event_mode(char * a1); void gv_pick_invisible(int a1); void gv_rawevent(int a1, int a2, int a3, int a4, unsigned long a5); int gv_rawpick(int a1, int a2, int a3); void gv_pick(int a1, int a2, float *a3, int a3n, float *a4, int a4n, float *a5, int a5n, float *a6, int a6n, int *a7, int a7n, int a8, int *a9, int a9n, int a10); void gv_event_keys(int a1); void gv_event_pick(int a1); void gv_dither(int a1, int a2); void gv_ui_html_browser(char * a1); void gv_ui_pdf_viewer(char * a1); void gv_shell(char * a1); void gv_write_sexpr(char * a1, LObject * a2); void gv_write_handle(char * a1, char * a2, char * a3); void gv_dump_handles(); char * gv_geomview_version(); void gv_rib_display(int a1, char * a2); void gv_rib_snapshot(int a1, char * a2); LList * gv_ND_axes(char * a1, char * a2, int a3, int a4, int a5, int a6); LList * gv_dimension(int a1); TmNStruct * gv_ND_xform(int a1, TmNStruct * a2); TmNStruct * gv_ND_xform_set(int a1, TmNStruct * a2); TmNStruct * gv_ND_xform_get(int a1, int a2); LList * gv_ND_color(int a1, LList * a2); void gv_zoom(int a1, float a2); void gv_ezoom(int a1, float a2); void gv_scale(int a1, float a2, float a3, float a4); void gv_escale(int a1, float a2); char * gv_real_id(char * a1); void gv_transform(int a1, int a2, int a3, int a4, float a5, float a6, float a7, float a8, int a9); void gv_transform_incr(int a1, int a2, int a3, int a4, float a5, float a6, float a7, float a8, int a9); void gv_transform_set(int a1, int a2, int a3, int a4, float a5, float a6, float a7); void gv_position(int a1, int a2); void gv_position_at(int a1, int a2, char * a3); void gv_position_toward(int a1, int a2, char * a3); void gv_new_center(int a1); void gv_new_reset(); LList * gv_look_encompass_size(float a1, float a2, float a3, float a4); void gv_look_encompass(int a1, int a2); void gv_look_toward(int a1, int a2, char * a3); void gv_look(int a1, int a2); void gv_look_recenter(int a1, int a2); void gv_emodule_clear(); void gv_cursor_still(int a1); void gv_cursor_twitch(int a1); void gv_ap_override(int a1); void gv_set_load_path(LList * a1); LList * gv_load_path(LList * a1); void gv_set_emodule_path(LList * a1); LList * gv_rehash_emodule_path(); LList * gv_emodule_path(); char * gv_emodule_defined(char * a1); LList * gv_all(char * a1, char * a2); void gv_camera_prop(GeomStruct * a1, int a2); void gv_write(char * a1, char * a2, LObject * a3, int a4); int gv_snapshot(int a1, char * a2, char * a3, int a4, int a5); char * gv_bgimagefile(int a1, char * a2); void gv_ui_motion(int a1, int a2); void gv_ui_cam_focus(int a1); void gv_ui_target(int a1, int a2); void gv_ui_center(int a1); void gv_ui_center_origin(int a1); void gv_ui_panel(char * a1, int a2, WindowStruct * a3); void gv_ui_freeze(int a1); void gv_ui_emodule_define(char * a1, char * a2); void gv_emodule_sort(); void gv_ui_emodule_start(char * a1); geomview-1.9.4/src/bin/geomutil/0000777000175000001440000000000010665240702013536 500000000000000geomview-1.9.4/src/bin/geomutil/bdy/0000777000175000001440000000000010665240700014312 500000000000000geomview-1.9.4/src/bin/geomutil/bdy/drawbdy.sh0000755000175000001440000000020410622537146016223 00000000000000#! %SHELL% echo "(write geometry - targetgeom world)" echo "(new-geometry Boundary " PATH=%builddir%:%bindir%:$PATH bdy echo ")" geomview-1.9.4/src/bin/geomutil/bdy/bdy.c0000644000175000001440000000300110455700774015153 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * bdy.c * author: Celeste Fowler, Mark Phillips * date: June 12, 1992 */ #include #include #include "geom.h" #include "bdy.h" int main(int argc, char *argv[]) { Geom *o, *v; float p; if (argc > 1) sscanf(argv[1], "%f", &p); else p = 0.0; o = GeomFLoad(iobfileopen(stdin), NULL); v = Bdy(o, p); GeomFSave(v, stdout, NULL); fflush(stdout); GeomDelete(v); GeomDelete(o); fclose(stdin); fclose(stdout); exit(0); } geomview-1.9.4/src/bin/geomutil/bdy/Makefile.am0000644000175000001440000000141110622537153016263 00000000000000INCLUDES = $(default_includes) LDADD = $(OOGLLIB) man_MANS = bdy.1gv EXTRA_DIST = drawbdy.sh $(man_MANS) bin_PROGRAMS = bdy bdy_SOURCES = bdy.c bdy_DEPENDENCIES = $(OOGLLIB) module_SCRIPTS = drawbdy module_DATA = .geomview-drawbdy CLEANFILES = drawbdy drawbdy: drawbdy.sh Makefile sed \ -e "s|%SHELL%|`eval eval eval echo @SHELL@`|g" \ -e "s|%bindir%|`eval eval eval echo $(bindir)`|g" \ -e "s|%builddir%|$(abs_builddir)|g" \ < $(srcdir)/drawbdy.sh > drawbdy chmod +x drawbdy .geomview-drawbdy: echo '(emodule-define "Draw Boundary" "drawbdy")' > .geomview-drawbdy all-local: $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Draw Boundary" "$(subdir)/drawbdy")' > $(top_builddir)/modules/.geomview-drawbdy DISTCLEANFILES = .geomview-drawbdy geomview-1.9.4/src/bin/geomutil/bdy/Makefile.in0000644000175000001440000004766610665240475016327 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = bdy$(EXEEXT) subdir = src/bin/geomutil/bdy DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(moduledir)" \ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(moduledir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_bdy_OBJECTS = bdy.$(OBJEXT) bdy_OBJECTS = $(am_bdy_OBJECTS) bdy_LDADD = $(LDADD) am__DEPENDENCIES_1 = moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(module_SCRIPTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(bdy_SOURCES) DIST_SOURCES = $(bdy_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; moduleDATA_INSTALL = $(INSTALL_DATA) DATA = $(module_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) LDADD = $(OOGLLIB) man_MANS = bdy.1gv EXTRA_DIST = drawbdy.sh $(man_MANS) bdy_SOURCES = bdy.c bdy_DEPENDENCIES = $(OOGLLIB) module_SCRIPTS = drawbdy module_DATA = .geomview-drawbdy CLEANFILES = drawbdy DISTCLEANFILES = .geomview-drawbdy all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/bdy/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/bdy/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done bdy$(EXEEXT): $(bdy_OBJECTS) $(bdy_DEPENDENCIES) @rm -f bdy$(EXEEXT) $(LINK) $(bdy_OBJECTS) $(bdy_LDADD) $(LIBS) install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f $$d$$p; then \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \ $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \ else :; fi; \ done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; for p in $$list; do \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \ rm -f "$(DESTDIR)$(moduledir)/$$f"; \ done mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bdy.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done install-moduleDATA: $(module_DATA) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(moduleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \ $(moduleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \ done uninstall-moduleDATA: @$(NORMAL_UNINSTALL) @list='$(module_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \ rm -f "$(DESTDIR)$(moduledir)/$$f"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-moduleDATA install-moduleSCRIPTS install-dvi: install-dvi-am install-exec-am: install-binPROGRAMS install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-moduleDATA \ uninstall-moduleSCRIPTS uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am all-local check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man1 install-moduleDATA \ install-moduleSCRIPTS install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 uninstall-moduleDATA uninstall-moduleSCRIPTS drawbdy: drawbdy.sh Makefile sed \ -e "s|%SHELL%|`eval eval eval echo @SHELL@`|g" \ -e "s|%bindir%|`eval eval eval echo $(bindir)`|g" \ -e "s|%builddir%|$(abs_builddir)|g" \ < $(srcdir)/drawbdy.sh > drawbdy chmod +x drawbdy .geomview-drawbdy: echo '(emodule-define "Draw Boundary" "drawbdy")' > .geomview-drawbdy all-local: $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Draw Boundary" "$(subdir)/drawbdy")' > $(top_builddir)/modules/.geomview-drawbdy # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomutil/bdy/bdy.1gv0000644000175000001440000000222510600600312015410 00000000000000.TH bdy 1gv "June 12 1992" "Geometry Center" .SH NAME bdy -\ boundary curve finder .SH SYNOPSIS bdy [precision] .SH DESCRIPTION .PP Bdy is a filter used to find boundary curves in Geomview objects. The program reads a geomview object from standard input and prints the resultant vector object to standard output. Bdy finds the segments of the vector by first converting the given object into a polylist (See anytooff(1)). Then, it finds all edges used once and only once in the polylist and combines these edges into a vector object. The optional precision arguement specifies the maximum distance between vertices that are to be considered identical. By default, it is set to 0.0, indicating that the vertices must be numerically identical. It may sometimes be necessary to set it to a higher value to compensate for floating-point error. .PP The vector object is always black. .SH BUGS The vector object is not a particularly compact representation of itself, since it contains many 2-vertex segments which could be combined. .SH SEE ALSO geomview(1), anytooff(1), anytopl(3), bdy(3), offconsol(1), plconsol(3) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.4/src/bin/geomutil/ucd/0000777000175000001440000000000010665240702014311 500000000000000geomview-1.9.4/src/bin/geomutil/ucd/ucdtooff.1gv0000644000175000001440000000056010600600312016440 00000000000000.TH ucdtooff 1gv "June 12 1992" "Geometry Center" .SH NAME ucdtooff \- filter to convert an AVS 'ucd' (Unstructured Cell Data) format file into an OFF file. .SH SYNOPSIS ucdtooff .SH DESCRIPTION .PP Ucdtooff reads from standard input and outputs the equivalent OFF stream to standard out. .SH SEE ALSO anytoucd(1) .SH AUTHOR .nf Charlie Gunn The Geometry Center .fi geomview-1.9.4/src/bin/geomutil/ucd/ucd_defs.h0000644000175000001440000013457610455700775016202 00000000000000/* @(#)ucd_defs.h 7.7 Stardent 92/03/20 */ /* Copyright (c) 1989 by Stardent Computer Inc. All Rights Reserved This software comprises unpublished confidential information of Stardent Computer Inc. and may not be used, copied or made available to anyone, except in accordance with the license under which it is furnished. This file is under sccs control at AVS in: @europa/sccs1.p/avs/include/s.ucd_defs.h */ /*#ifdef SX*/ /* I don't like to see port-specific differences like this. */ /* KCI thought it was necessary for SX-3. */ /* See if it causes trouble on others. */ # include /*#endif SX*/ /*--------------------------- Cell Type Definitions ---------------------------*/ #define UCD_NTYPES 8 #define UCD_NUM_CELL_TYPES 8 #define UCD_POINT 0 #define UCD_LINE 1 #define UCD_TRIANGLE 2 #define UCD_QUADRILATERAL 3 #define UCD_TETRAHEDRON 4 #define UCD_PYRAMID 5 #define UCD_PRISM 6 #define UCD_HEXAHEDRON 7 #define UCD_MAX_NODE_PER_CELL 20 /*--------------------------- Miscellaneous Defines ---------------------------*/ #define UCD_MATERIAL_IDS 0x1 #define UCD_NODE_NAMES 0x2 #define UCD_CELL_NAMES 0x4 #define UCD_CELL_TYPES 0x8 #define UCD_MID_EDGES 0x10 #define UCD_CHAR 0x20 #define UCD_INT 0x40 #define UCD_LABEL_LEN 1024 #define UCD_MAX_COMPONENTS 50 #define UCD_MAX_VECLEN 9 /*--------------------------- Cell Type Variables ---------------------------*/ extern int UCD_num_nodes[]; /* number of nodes in a cell */ extern int UCD_num_mid_nodes[]; /* number of nodes in a cell */ /* with mid-edge nodes */ extern int UCD_num_faces[]; /* number of faces in a cell */ /*----------------------------------------- Unstructured Cell Data Type Definitions -----------------------------------------*/ typedef union { /* name union */ char *c; /* character string for label names */ int i; /* integer for numerical names */ } UCD_name; /*--------------------------------------- NOTE: in the util_flag field, the two rightmost bits are reserved for internal usage. -----------------------------------------*/ typedef struct UCD_structure_ { /*--------- Structure Header Information ---------*/ char *name; /* structure name */ int name_flag; /* are node/cell names chars or ints */ int ncells; /* number of cells */ int nnodes; /* number of nodes */ float min_extent[3]; /* structure extent */ float max_extent[3]; /* structure extent */ int data_veclen; /* length of data vector for struct */ float *data; /* data for the structure */ char *data_labels; /* labels for data components */ char *data_units; /* labels for data units */ int util_flag; /* utility flag (see above for any */ /* restrictions) */ /*--------- Cell Information ---------*/ UCD_name *cell_name; /* cell names */ char **element_type; /* cell element types */ int *material_type; /* user defined material types */ int *cell_type; /* cell types (see above defines) */ int cell_veclen; /* length of data vector */ float *cell_data; /* data for cell-based datasets */ float *min_cell_data; /* min val for cell data components */ float *max_cell_data; /* max val for cell data components */ char *cell_labels; /* labels for cell data components */ char *cell_units; /* labels for cell data units */ int *cell_components;/* array of cell component mix */ int *cell_active; /* array of active cell components */ int *mid_edge_flags; /* cell edges with mid edge nodes */ int node_conn_size; /* size of the node connectivity list*/ int *node_list; /* node list of connectivity */ int *node_list_ptr; /* location of a cell's node list */ int ucd_last_cell; /*--------- Node Information ---------*/ UCD_name *node_name; /* node names */ float *x, *y, *z; /* position of the nodes */ int node_veclen; /* length of data vector */ float *node_data; /* data vector for the nodes */ float *min_node_data; /* min val for node data components */ float *max_node_data; /* max val for node data components */ char *node_labels; /* labels for node data components */ char *node_units; /* labels for node data units */ int *node_components;/* array of node component mix */ int *node_active; /* array of active node components */ int cell_conn_size; /* size of the cell connectivity list*/ int *cell_list; /* cell list of connectivity */ int *cell_list_ptr; /* location of a node's cell list */ int ucd_last_node; /*--------- Allocation Information ----------*/ enum { UCD_ONE_BLOCK, UCD_RW_SHM, UCD_RO_SHM } alloc_case; /* storage allocation strategy */ int shm_key; /* shared memory key */ int shm_id; /* shared memory id */ char *shm_base; /* shared memory base */ int mesh_id; /* unique id of the mesh instance */ } UCD_structure; /*---------------------------------------------------------------------------- ---------------------------------------------------------------------------- Function Headers for the routines handling Unstructured Cell Data (UCD) ---------------------------------------------------------------------------- ---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- char *UCDstructure_alloc (name, data_veclen, name_flag, ncells, cell_count, cell_veclen, nnodes, node_count, node_veclen, util_flag) char *name; int data_veclen; int name_flag; int ncells; int cell_count; int cell_veclen; int nnodes; int node_count; int node_veclen; int util_flag; This function creates a new top level structure and returns a pointer to that structure. Inputs: name - structure name data_veclen - length of structure data vector name_flag - are node/cell names chars or ints char = UCD_CHAR, int = UCD_INT ncells - number of cells in the structure cell_count - expected number of nodes per cell cell_veclen - length of cell data vector nnodes - number of nodes in the structure node_count - expected number of cells per node node_veclen - length of node data vector util_flag - utility flag for general usage Outputs: - none Returns: - pointer to the new structure pointer = NULL if error Description: The UCD_structure contains pointers to several blocks of memory. They are arranged in two groups as shown below: +-----------------------+ \ | | \ | UCD_structure | | | | | | | | | name, data, | | |====| data_labels, | | |====| element_type, | | || | etc., etc., etc. | | || | | | |=======| cell_data, | | |=======| x, y, z, | } msize || || | connectivity lists | | || || | node_data | | || || | | | || || +-----------------------+ | || |==>>| | | || || | | | || || | | | || |==>>| | | || | (Some of these are | | || | arrays of pointers | | || | to additional pieces | | || | of malloc'ed memory.) | | || | | / || +-----------------------+ / || || +-----------------------+ \ |=====>>| | \ || | | | || | (All of these | } ssize |=====>>| are floats or ints.) | | | | | | | / +-----------------------+ / compute_sizes calculates the required memory block sizes msize and ssize. The two blocks shown above can either be allocated in one big chunk or be in separate regions of memory. The UCDstructure and most of the arrays it points to are allocated in one big block of msize bytes. This is allocated by malloc. carve_up_the_memory fills in all the pointers to appropriate positions in this block of memory. The cell_data, x, y, z, connectivity lists and node_data arrays tend to require very large amounts of memory so it is beneficial to put them in shared memory when possible. When not appropriate, both blocks shown above can be obtained with a single malloc. The various cases are encoded in fields of UCDstructure: case 1 - Everything in one big malloc'ed block. This was the original implementation. Will still be used on sytems without shared memory or if the shared memory allocation fails for any reason. alloc_case = UCD_ONE_BLOCK shm_key not used shm_id not used shm_base not used case 2 - Second block is in Read/Write shared memory. This is the normal case for the producer of UCD. alloc_case = UCD_RW_SHM shm_key = shared memory key shm_id = shared memory identifier shm_base = base address of the shared memory case 3 - Second block is in Read-Only shared memory. This is the normal case for the consumer of UCD. The same UCD could be attached to more than one input port so we don't want a consumer making any changes to it. Therefore, the shared memory is made read-only. alloc_case = UCD_RO_SHM shm_key = shared memory key (this is passed thru the socket) shm_id = shared memory identifier (each process must obtain this from shmget because each process might have a different id for the same shared memory segment) shm_base = base address of the shared memory (each process must obtain this from shmat because each process might have the shared memory segment at a different address) case 4 - Second block is in own malloc'ed block. Sometimes the consumer of a UCD will want to modify it in place - to normalize it or something. The module writer can prevent any of the UCD from being in Read-Only storage by specifying the MODIFY_IN option in AVScreate_input_port. I'm sure not what to do about this yet. If it is not convenient to do something earlier, anything in read-only shared memory will get copied into a malloc'ed block and all the pointers will be fixed up. TO BE CONTINUED ..... -----------------------------------------------------------------------------*/ extern char *UCDstructure_alloc (); /*---------------------------------------------------------------------------- int UCDstructure_free (structure) UCD_structure *structure; This function frees the storage used by structure. Inputs: structure - structure to free Outputs: - none Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_free (); /*---------------------------------------------------------------------------- int UCDstructure_get_header (structure, name, data_veclen, name_flag, ncells, cell_veclen, nnodes, node_veclen, util_flag) UCD_structure *structure; char *name; int *data_veclen; int *name_flag; int *ncells; int *cell_veclen; int *nnodes; int *node_veclen; int *util_flag; This function finds out all the header information about a UCD_structure and returns those values. Inputs: structure - structure to find information Outputs: name - structure name data_veclen - length of structure data vector name_flag - are node/cell names chars or ints char = UCD_CHAR, int = UCD_INT ncells - number of cells in the structure cell_veclen - length of cell data vector nnodes - number of nodes in the structure node_veclen - length of node data vector util_flag - utility flag Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_header (); /*---------------------------------------------------------------------------- int UCDstructure_set_header_flag (structure, util_flag) UCD_structure *structure; int util_flag; This function sets the header flag bits. Inputs: structure - structure to find information util_flag - utility flag Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_header_flag (); /*---------------------------------------------------------------------------- int UCDstructure_get_data (structure, data) UCD_structure *structure; float **data; This function returns a pointer to the array containing the data vector for the structure. Inputs: structure - structure to find information Outputs: data - pointer to the structure data vector Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_data (); /*---------------------------------------------------------------------------- int UCDstructure_set_data (structure, data) UCD_structure *structure; float *data; This function copies the data from the array pointed to by "data" into the structure's data array. There should be data_veclen data elements in this array. Inputs: structure - structure to find information data - pointer to the data vector Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_data (); /*---------------------------------------------------------------------------- int UCDstructure_get_extent (structure, min_extent, max_extent) UCD_structure *structure; float *min_extent; float *max_extent; This routine allows the module writer to obtain the extent of the structure. Inputs: structure - structure to find information Outputs: min_extent - coordinate extent of structure max_extent - coordinate extent of structure Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_extent (); /*---------------------------------------------------------------------------- int UCDstructure_set_extent (structure, min_extent, max_extent) UCD_structure *structure; float *min_extent; float *max_extent; This routine allows the module writer to set the extent of the structure. Inputs: structure - structure to find information min_extent - coordinate extent of structure max_extent - coordinate extent of structure Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_extent (); /*---------------------------------------------------------------------------- int UCDstructure_get_data_labels (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to get the labels for each component in the structure. These labels are for cases when there is structure based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as temperature, density, mach number, etc. In turn, these labels would appear on the dials so that the user would have a better understanding of which component each dial is attached to. Example: labels = "temp;density;mach number" delimiter = ";" Inputs: structure - structure to find information Outputs: labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_data_labels (); /*-------------------------------------------------------------------- int UCDstructure_get_data_label (structure, number, label) UCD_structure *structure; int number; char *label; This routine allows the module writer to query the label for an individual component in the structure. Input: structure -- structure to get labels in number -- individual component number Outputs: labels -- string with labels included Returns: -- 1 if success; 0 if failure ----------------------------------------------------------------------*/ extern int UCDstructure_get_data_label (); /*---------------------------------------------------------------------------- int UCDstructure_set_data_labels (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to set the labels for each component in the structure. These labels are for cases when there is structure based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as temperature, density, mach number, etc. In turn, these labels would appear on the dials so that the user would have a better understanding of which component each dial is attached to. Example: labels = "temp;density;mach number" delimiter = ";" Inputs: structure - structure to find information labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_data_labels (); /*---------------------------------------------------------------------------- int UCDstructure_get_cell_labels (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to get the labels for each component in the structure. These labels are for cases when there is cell based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as temperature, density, mach number, etc. In turn, these labels would appear on the dials so that the user would have a better understanding of which component each dial is attached to. Example: labels = "temp;density;mach number" delimiter = ";" Inputs: structure - structure to find information Outputs: labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_cell_labels (); /*-------------------------------------------------------------------- int UCDstructure_get_cell_label (structure, number, label) UCD_structure *structure; int number; char *label; This routine allows the module writer to query the label for an individual component in the structure. Input: structure -- structure to get labels in number -- individual component number Outputs: labels -- string with labels included Returns: -- 1 if success; 0 if failure ----------------------------------------------------------------------*/ extern int UCDstructure_get_cell_label (); /*---------------------------------------------------------------------------- int UCDstructure_set_cell_labels (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to set the labels for each component in the structure. These labels are for cases when there is cell based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as temperature, density, mach number, etc. In turn, these labels would appear on the dials so that the user would have a better understanding of which component each dial is attached to. Example: labels = "temp;density;mach number" delimiter = ";" Inputs: structure - structure to find information labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_cell_labels (); /*---------------------------------------------------------------------------- int UCDstructure_get_node_labels (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to get the labels for each component in the structure. These labels are for cases when there is node based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as temperature, density, mach number, etc. In turn, these labels would appear on the dials so that the user would have a better understanding of which component each dial is attached to. Example: labels = "temp;density;mach number" delimiter = ";" Inputs: structure - structure to find information Outputs: labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_labels (); /*-------------------------------------------------------------------- int UCDstructure_get_node_label (structure, number, label) UCD_structure *structure; int number; char *label; This routine allows the module writer to query the label for an individual component in the structure. Input: structure -- structure to get labels in number -- individual component number Outputs: labels -- string with labels included Returns: -- 1 if success; 0 if failure ----------------------------------------------------------------------*/ extern int UCDstructure_get_node_label (); /*---------------------------------------------------------------------------- int UCDstructure_set_node_labels (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to set the labels for each component in the structure. These labels are for cases when there is node based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as temperature, density, mach number, etc. In turn, these labels would appear on the dials so that the user would have a better understanding of which component each dial is attached to. Example: labels = "temp;density;mach number" delimiter = ";" Inputs: structure - structure to find information labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_labels (); /*---------------------------------------------------------------------------- int UCDstructure_get_data_units (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to get the unit labels for each component in the structure. These labels are for cases when there is structure based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as degrees, meters, etc. Example: labels = "degrees;meters" delimiter = ";" Inputs: structure - structure to find information Outputs: labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_data_units (); /*-------------------------------------------------------------------- int UCDstructure_get_data_unit (structure, number, label) UCD_structure *structure; int number; char *label; This routine allows the module writer to query the label for an individual unit in the structure. Input: structure -- structure to get labels in number -- individual component number Outputs: labels -- string with labels included Returns: -- 1 if success; 0 if failure ----------------------------------------------------------------------*/ extern int UCDstructure_get_data_unit (); /*---------------------------------------------------------------------------- int UCDstructure_set_data_units (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to set the unit labels for each component in the structure. These labels are for cases when there is structure based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as degrees, meters, etc. Example: labels = "degrees;meters" delimiter = ";" Inputs: structure - structure to find information labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_data_units (); /*---------------------------------------------------------------------------- int UCDstructure_get_cell_units (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to get the unit labels for each component in the structure. These labels are for cases when there is cell based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as degrees, meters, etc. Example: labels = "degrees;meters" delimiter = ";" Inputs: structure - structure to find information Outputs: labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_cell_units (); /*-------------------------------------------------------------------- int UCDstructure_get_cell_unit (structure, number, label) UCD_structure *structure; int number; char *label; This routine allows the module writer to query the label for an individual unit in the structure. Input: structure -- structure to get labels in number -- individual component number Outputs: labels -- string with labels included Returns: -- 1 if success; 0 if failure ----------------------------------------------------------------------*/ extern int UCDstructure_get_cell_unit (); /*---------------------------------------------------------------------------- int UCDstructure_set_cell_units (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to set the unit labels for each component in the structure. These labels are for cases when there is cell based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as degrees, meters, etc. Example: labels = "degrees;meters" delimiter = ";" Inputs: structure - structure to find information labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_cell_units (); /*---------------------------------------------------------------------------- int UCDstructure_get_node_units (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to get the unit labels for each component in the structure. These labels are for cases when there is node based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as degrees, meters, etc. Example: labels = "degrees;meters" delimiter = ";" Inputs: structure - structure to find information Outputs: labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_units (); /*-------------------------------------------------------------------- int UCDstructure_get_node_unit (structure, number, label) UCD_structure *structure; int number; char *label; This routine allows the module writer to query the label for an individual unit in the structure. Input: structure -- structure to get labels in number -- individual component number Outputs: labels -- string with labels included Returns: -- 1 if success; 0 if failure ----------------------------------------------------------------------*/ extern int UCDstructure_get_node_unit (); /*---------------------------------------------------------------------------- int UCDstructure_set_node_units (structure, labels, delimiter) UCD_structure *structure; char *labels; char *delimiter; This routine allows the module writer to set the unit labels for each component in the structure. These labels are for cases when there is node based data. For instance, in the case of a CFD dataset, the module writer might want to label components of the field as degrees, meters, etc. Example: labels = "degrees;meters" delimiter = ";" Inputs: structure - structure to find information labels - string with labels included delimiter - delimiter between each label Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_units (); /*--------------------------------------------------------------------------- int UCDstructure_invalid_cell_minmax (structure) UCD_structure *structure; This routine allows the module writer to set the min/max range of the structure cell data to be invalid. This function should be used after the structure data has been changed by the module and the module does not want to spend the time recomputing the cell minmax. Input: structure -- structure to set cell min/max invalid Outputs: -- none Returns: -- 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_invalid_cell_minmax (); /*--------------------------------------------------------------------------- int UCDstructure_get_cell_minmax (structure, min, max) UCD_structure *structure; float *min; float *max; This routine allows the module writer to obtain the range of the structure cell data. It should be noted that min and max are arrays of dimension structure->cell_veclen. Input: structure -- structure to get min/max in Outputs: min -- value of minimum data point max -- value of maximum data point Returns: -- 1 = valid data; 0 = invalid data -----------------------------------------------------------------------------*/ extern int UCDstructure_get_cell_minmax (); /*--------------------------------------------------------------------------- int UCDstructure_set_cell_minmax (structure, min, max) UCD_structure *structure; float *min; float *max; This routine allows the module writer to set the range of the structure cell data. It should be noted that min and max are arrays of dimension structure->cell_veclen. Input: structure -- structure to set min/max in Outputs: min -- value of minimum data point max -- value of maximum data point Returns: -- 1 if successful; 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_cell_minmax (); /*--------------------------------------------------------------------------- int UCDstructure_invalid_node_minmax (structure) UCD_structure *structure; This routine allows the module writer to set the min/max range of the structure node data to be invalid. This function should be used after the structure data has been changed by the module and the module does not want to spend the time recomputing the node minmax. Input: structure -- structure to set node min/max invalid Outputs: -- none Returns: -- 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_invalid_node_minmax (); /*--------------------------------------------------------------------------- int UCDstructure_get_node_minmax (structure, min, max) UCD_structure *structure; float *min; float *max; This routine allows the module writer to obtain the range of the structure node data. It should be noted that min and max are arrays of dimension structure->node_veclen. Input: structure -- structure to get min/max in Outputs: min -- value of minimum data point max -- value of maximum data point Returns: -- 1 = valid data; 0 = invalid data -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_minmax (); /*--------------------------------------------------------------------------- int UCDstructure_set_node_minmax (structure, min, max) UCD_structure *structure; float *min; float *max; This routine allows the module writer to set the range of the structure node data. It should be noted that min and max are arrays of dimension structure->node_veclen. Input: structure -- structure to set min/max in Outputs: min -- value of minimum data point max -- value of maximum data point Returns: -- 1 if successful; 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_minmax (); /*---------------------------------------------------------------------------- int UCDstructure_get_cell_data (structure, data) UCD_structure *structure; float **data; This function returns a pointer to the array containing the data vectors for all of the cells in the structure. Inputs: structure - structure to find information Outputs: data - pointer to the cell data vectors Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_cell_data (); /*---------------------------------------------------------------------------- int UCDstructure_set_cell_data (structure, data) UCD_structure *structure; float *data; This function copies the cell data from the array pointed to by "data" into the structure's cell data array. There should be cell_veclen*ncells data elements in this array. Inputs: structure - structure to find information data - pointer to the cell data vectors Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_cell_data (); /*---------------------------------------------------------------------------- int UCDstructure_get_node_data (structure, data) UCD_structure *structure; float **data; This function returns pointers to the array containing the data vectors for the nodes. Inputs: structure - structure to find information Outputs: data - pointer to the node data vectors Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_data (); /*---------------------------------------------------------------------------- int UCDstructure_set_node_data (structure, data) UCD_structure *structure; float *data; This function copies the node data from the array pointed to by "data" into the structure's node data array. There should be node_veclen*nnodes data elements in this array. Inputs: structure - structure to find information data - pointer to the node data vectors Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_data (); /*---------------------------------------------------------------------------- int UCDstructure_get_cell_components (structure, components) UCD_structure *structure; int **components; This function returns pointers to the array containing the cell component list. For instance, if there are four different components in the cell data vector (e.g. scalar, 3-vector, 2-vector, scalar), the component list would be: (1 3 2 1) Inputs: structure - structure to find information Outputs: components - pointer to the cell component list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_cell_components (); /*---------------------------------------------------------------------------- int UCDstructure_set_cell_components (structure, components, number) UCD_structure *structure; int *components; int number; This function copies the array containing the cell component list. For instance, if there are four different components in the cell data vector (e.g. scalar, 3-vector, 2-vector, scalar), the component list would be: (1 3 2 1) Inputs: structure - structure to find information components - pointer to the cell component list number - number of components in the list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_cell_components (); /*---------------------------------------------------------------------------- int UCDstructure_get_node_components (structure, components) UCD_structure *structure; int **components; This function returns pointers to the array containing the node component list. For instance, if there are four different components in the node data vector (e.g. scalar, 3-vector, 2-vector, scalar), the component list would be: (1 3 2 1) Inputs: structure - structure to find information Outputs: components - pointer to the node component list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_components (); /*---------------------------------------------------------------------------- int UCDstructure_set_node_components (structure, components, number) UCD_structure *structure; int *components; int number; This function copies the array containing the node component list. For instance, if there are four different components in the node data vector (e.g. scalar, 3-vector, 2-vector, scalar), the component list would be: (1 3 2 1) Inputs: structure - structure to find information components - pointer to the node component list number - number of components in the list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_components (); /*---------------------------------------------------------------------------- int UCDstructure_get_cell_active (structure, active) UCD_structure *structure; int **active; This function returns a pointer to the array containing the cell active component list. For instance, if there are four different components in the cell data vector and the module is using the second component, the list would be: (0 1 0 0) Inputs: structure - structure to find information Outputs: active - pointer to the cell active component list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_cell_active (); /*---------------------------------------------------------------------------- int UCDstructure_set_cell_active (structure, active) UCD_structure *structure; int *active; This function sets the array containing the cell active component list. For instance, if there are four different components in the cell data vector and the module is using the second component, the list would be: (0 1 0 0) Inputs: structure - structure to find information active - pointer to the cell active component list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_cell_active (); /*---------------------------------------------------------------------------- int UCDstructure_get_node_active (structure, active) UCD_structure *structure; int **active; This function returns a pointer to the array containing the node active component list. For instance, if there are four different components in the node data vector and the module is using the second component, the list would be: (0 1 0 0) Inputs: structure - structure to find information Outputs: active - pointer to the node active component list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_active (); /*---------------------------------------------------------------------------- int UCDstructure_set_node_active (structure, active) UCD_structure *structure; int *active; This function sets the array containing the node active component list. For instance, if there are four different components in the node data vector and the module is using the second component, the list would be: (0 1 0 0) Inputs: structure - structure to find information active - pointer to the node active component list Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_active (); /*---------------------------------------------------------------------------- int UCDstructure_get_node_positions (structure, x, y, z) UCD_structure *structure; float **x, **y, **z; This function returns pointers to the arrays containing the x, y and z coordinates of node positions. Inputs: structure - structure to find information Outputs: x, y, z - pointer to the x,y,z arrays Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_get_node_positions (); /*---------------------------------------------------------------------------- int UCDstructure_set_node_positions (structure, x, y, z) UCD_structure *structure; float *x, *y, *z; This function copies the x, y and z coordinate arrays from the arrays pointed to by "x", "y" and "z" into the structure's node position arrays. There should be nnodes coordinates in each array. Inputs: structure - structure to find information x, y, z - pointer to the x,y,z arrays Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDstructure_set_node_positions (); /*---------------------------------------------------------------------------- int UCDcell_get_information (structure, cell, name, element_type, material_type, cell_type, mid_edge_flags, node_list) UCD_structure *structure; int cell; int *name; char *element_type; int *material_type; int *cell_type; int *mid_edge_flags; int **node_list; This function finds out all the information about a particular cell and returns those values. Inputs: structure - structure to find information cell - cell to find information Outputs: name - cell name element_type - name of element type material_type - user defined material type cell_type - cell type (e.g. UCD_TRIANGLE) data - data for cell-based datasets mid_edge_flags - does the cell have mid edge nodes node_list - array of node numbers Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDcell_get_information (); /*---------------------------------------------------------------------------- int UCDcell_set_information (structure, cell, name, element_type, material_type, cell_type, mid_edge_flags, node_list) UCD_structure *structure; int cell; int name; char *element_type; int material_type; int cell_type; int mid_edge_flags; int *node_list; This function sets all the information about a particular cell. Inputs: structure - structure to find information cell - cell to find information name - cell name element_type - name of element type material_type - user defined material type cell_type - cell type (e.g. UCD_TRIANGLE) mid_edge_flags - does the cell have mid edge nodes node_list - array of node numbers Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDcell_set_information (); /*---------------------------------------------------------------------------- int UCDnode_get_information (structure, node, name, ncells, cell_list) UCD_structure *structure; int node; int *name; int *ncells; int **cell_list; This function finds out all the information about a particular node and returns those values. Inputs: structure - structure to find information node - node to find information Outputs: name - node name ncells - number of cells in cell_list cell_list - array of cell numbers Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDnode_get_information (); /*---------------------------------------------------------------------------- int UCDnode_set_information (structure, node, name, ncells, cell_list) UCD_structure *structure; int node; int name; int ncells; int *cell_list; This function sets all the information about a particular node. Inputs: structure - structure to find information node - node to find information name - node name ncells - number of cells in cell_list cell_list - array of cell numbers Returns: - 1 if successful, 0 if failure -----------------------------------------------------------------------------*/ extern int UCDnode_set_information (); /* end ucd_defs.h */ geomview-1.9.4/src/bin/geomutil/ucd/anytoucd.c0000644000175000001440000002732710622716743016240 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* File: anytoucd.c: Author: Charlie Gunn originally read a OOGL object on stdin, and write ucd format on stdout. */ #include "vec4.h" #include "geom.h" #include "3d.h" #include "polylistP.h" #include "plutil.h" #include #include "time.h" #define MAXV 64 /* #define DEBUG */ extern int push(Poly *PP); /* From stack.c */ extern Poly *getstack(); extern int make_tform(HPoint3 *p1, HPoint3 *p2, HPoint3 *p3, Transform m); extern int initstack(void); extern int getsize(void); #define CAVE 1 #define VEX 0 static int debug = 0; #define INSIDE(line, point) \ ((line.a*(point)->x + line.b*(point)->y + line.c) <= 0) #define INSIDE2(line, point) \ (line.a*(point)->x + line.b*(point)->y + line.c) struct polygon { int nv; unsigned int new:1; Vertex *vlist[MAXV]; HPoint3 vlistxy[MAXV]; short inout[MAXV]; Transform to_xy; } currpoly; struct line { float a,b,c,angle; }; typedef struct polygon polygon; typedef struct line line; void myconvert(CP, cp) Poly *CP; polygon *cp; { int i; cp->nv = CP->n_vertices; for (i=0; inv; ++i) cp->vlist[i] = CP->v[i]; cp->new = 1; } polygon * chopup (pp, PP) polygon *pp; Poly *PP; { int n, i ; int convex, orient; line edges[MAXV]; double dangle, sum; polygon *newpoly; if (debug){ fprintf(stderr,"Entering chopup with %d vertices \n",pp->nv); for (i=0; inv; ++i) fprintf(stderr,"%f %f %f \n",pp->vlist[i]->pt.x, pp->vlist[i]->pt.y, pp->vlist[i]->pt.z); } if (pp->nv <= 4 && pp->nv > 1) { PP->n_vertices = pp->nv; for (i=0; inv; ++i) PP->v[i] = pp->vlist[i]; if (push(PP) == 0) OOGLError(1,"anytoucd: unable to push polygon\n"); return(NULL); } else if (pp->nv == 1) { return(NULL); } else { /* something to chop */ newpoly = OOGLNew(polygon); n = pp->nv; if (pp->new) { /* need to work in the x,y plane, so compute approp. tforms */ for (i=0; ivlist[i]->pt, &pp->vlist[(i+1)%n]->pt, &pp->vlist[(i+2)%n]->pt, pp->to_xy) >= 0) break;; TmInvert(pp->to_xy, pp->to_xy); for (i=0; inv; ++i) HPt3Transform(pp->to_xy, &pp->vlist[i]->pt, &pp->vlistxy[i]); pp->new = 0; } { double dx, dy; for (i=0; inv; ++i) { dx = pp->vlistxy[(i+1)%n].x - pp->vlistxy[i].x; dy = pp->vlistxy[(i+1)%n].y - pp->vlistxy[i].y; edges[i].a = dy; edges[i].b = -dx; edges[i].c = -(edges[i].a*pp->vlistxy[i].x+edges[i].b*pp->vlistxy[i].y); edges[i].angle = atan2(dy,dx); if (debug) fprintf(stderr,"edge %d: angle %f\n",i,edges[i].angle); } } /* armed with this info, identify concave and convex bndy pts*/ for (sum = 0.0, i=0; inv; ++i) { dangle = edges[i].angle - edges[(i-1+n)%n].angle ; /* clip to (-PI, +PI) */ while (dangle < -PI) dangle += 2*PI; while (dangle > PI) dangle -= 2*PI; sum += dangle; if (dangle > 0) pp->inout[i] = VEX; else pp->inout[i] = CAVE; } if (debug) fprintf(stderr,"Total angle change is %f\n",sum); if (sum > 0 ) orient = 1; else orient = -1; for (convex = 1, i=0; inv; ++i) { if (orient == -1) { pp->inout[i] = 1 - pp->inout[i]; edges[i].a *= -1; edges[i].b *= -1; edges[i].c *= -1; } if (pp->inout[i] == CAVE) convex = 0; } if (debug) if (convex) fprintf(stderr,"Polygon is convex\n"); /* next look for triangles to chop off */ { line cutcorner; double dx, dy; int cutoff, j, jj, oc, nc; for (nc = 0, oc=0; ocnv-1; ++oc, ++nc) { /* copy out current vertex */ newpoly->vlist[nc] = pp->vlist[oc]; HPt3Copy(&pp->vlistxy[oc], &newpoly->vlistxy[nc]); if (pp->inout[(oc+1)%n] == VEX) { cutoff = 1; /* default is to cut if off */ if (!convex) { dx = pp->vlistxy[(oc+2)%n].x - pp->vlistxy[oc].x; dy = pp->vlistxy[(oc+2)%n].y - pp->vlistxy[oc].y; /* orient this line to run from v2 to v0, to agree with edges */ cutcorner.a = -dy*orient; cutcorner.b = dx*orient; cutcorner.c = -(cutcorner.a*pp->vlistxy[(oc+2)%n].x+cutcorner.b*pp->vlistxy[(oc+2)%n].y); cutcorner.angle = -atan2(dy,dx); /* check for concave pts inside this triangle */ /* don't check the vertices of this triangle */ for ( j=0, jj=oc+3; jnv-3 && cutoff; ++j,++jj) { if (jj == pp->nv) jj = 0; if ( pp->inout[jj] == CAVE ) { if (INSIDE(cutcorner,&pp->vlistxy[jj]) && INSIDE(edges[oc], &pp->vlistxy[jj]) && INSIDE(edges[(oc+1)%n], &pp->vlistxy[jj])) { if (debug) fprintf(stderr,"vertex %d is inside cutoff corner %d %d %d\n",jj, oc, oc+1, oc+2); cutoff = 0; } } } } if (cutoff) /* can cut this corner off */ { int iv0, iv1, iv2, iv3; if (convex & (oc < pp->nv-2 ) ) /* can cut off 4 vertices */ { iv0 = oc; iv1 = (oc+1)%n; iv2 = (oc+2)%n; iv3 = (oc+3)%n; PP->n_vertices = 4; PP->v[0] = pp->vlist[iv0]; PP->v[1] = pp->vlist[iv1]; PP->v[2] = pp->vlist[iv2]; PP->v[3] = pp->vlist[iv3]; if (push(PP) == 0) OOGLError(1,"anytoucd: unable to push polygon\n"); oc++; oc++; } else { iv0 = oc; iv1 = (oc+1)%n; iv2 = (oc+2)%n; PP->n_vertices = 3; PP->v[0] = pp->vlist[iv0]; PP->v[1] = pp->vlist[iv1]; PP->v[2] = pp->vlist[iv2]; if (push(PP) == 0) OOGLError(1,"anytoucd: unable to push polygon\n"); oc++; } } } } while (oc < pp->nv) { newpoly->vlist[nc] = pp->vlist[oc]; HPt3Copy(&pp->vlistxy[oc], &newpoly->vlistxy[nc]); oc++; nc++; } newpoly->new = 0; newpoly->nv = nc; /* if nothing got chopped, or if what's left * has only 1 or 2 vertices */ if (newpoly->nv == pp->nv || newpoly->nv <= 2) { /* fprintf(stderr,"chopup:Unable to cut a corner\n"); */ OOGLFree(newpoly); return(NULL); } else return(newpoly); } } } Poly *CP, thisPoly; int main(int argc, char **argv) { polygon *ncp, *cp; int pcountold; Geom *thisgeom; PolyList *thispl; Vertex *vlist[4]; Transform id; TmIdentity(id); thisgeom = GeomFLoad(iobfileopen(stdin), NULL); thispl = (PolyList *)AnyToPL(thisgeom, id); if (initstack() == 0) OOGLError(1,"anytoucd: unable to init stack\n"); cp = OOGLNew(polygon); CP = &thisPoly; /* at most 4 vertices in each face */ for (pcountold = 0; pcountold < thispl->n_polys; ++pcountold) { myconvert(&thispl->p[pcountold], cp); *CP = thispl->p[pcountold]; CP->v = vlist; (void)OOGLNew(polygon); while ( (ncp = chopup(cp, CP)) != NULL ) { if (debug) fprintf(stderr,"Chop up: calling again\n"); OOGLFree(cp); cp = ncp; } } /* now get the list of polygons from the stack */ thispl->n_polys = getsize(); thispl->p = getstack(); /* now print out the stuff in ucd format */ /* GeomFSave(thispl, stdout, NULL); */ { FILE *fp = stdout; int num_nodes, num_node_data_comp = 0, node_data_comp[2], num_cells, num_cell_data_comp = 0, total_node_comp = 0, total_cell_comp = 0, cell_data_comp[2], i,n; Poly *p; Vertex *v, **vp; num_nodes = thispl->n_verts; num_cells = thispl->n_polys; if (thispl->geomflags & PL_HASVCOL) { node_data_comp[0] = 4; /* ColorA's : 4 component */ num_node_data_comp += 1; total_node_comp += 4; } if (thispl->geomflags & PL_HASVN) { node_data_comp[num_node_data_comp] = 3; num_node_data_comp += 1; total_node_comp += 3; } #ifdef FOURD if (thispl->geomflags & VERT_4D) { node_data_comp[num_node_data_comp] = 1; /* ColorA's : 4 component */ num_node_data_comp += 1; total_node_comp += 1; } #endif if (thispl->geomflags & PL_HASPCOL) { cell_data_comp[0] = 4; /* ColorA's : 4 component */ num_cell_data_comp += 1; total_cell_comp += 4; } if (thispl->geomflags & PL_HASPN) { cell_data_comp[num_cell_data_comp] = 3; num_cell_data_comp += 1; total_cell_comp += 3; } { char *timestring; long mytime; time_t myt; myt = time(&mytime); timestring = ctime(&myt); fprintf(fp,"# Created by anytoucd on %s \n",timestring); } fprintf(fp,"%d %d %d %d 0\n",num_nodes, num_cells, total_node_comp, total_cell_comp); /* write out vertices */ /* what to do about 4D vertices? */ for (v = thispl->vl, i=0; in_verts; ++i, ++v) #ifdef FOURD fprintf(fp,"%d %g %g %g\n",i+1,v->pt.x, v->pt.y, v->pt.z); #else { float w = v->pt.w; if (w) w = 1.0/w; fprintf(fp,"%d %g %g %g\n",i+1,w*v->pt.x, w*v->pt.y, w*v->pt.z); } #endif /* write out faces */ for (i=0, p = thispl->p; in_polys; ++i, ++p) { fprintf(fp,"%d 1 ",i+1); n = p->n_vertices; if (n==2) fprintf(fp,"line "); /* is this right? */ else if (n==3) fprintf(fp,"tri "); else if (n==4) fprintf(fp, "quad "); /* else signal error */ else return 1; for(vp = p->v; --n >= 0; vp++) fprintf(fp, "%d ", (int)((*vp) - thispl->vl + 1)); fprintf(fp,"\n"); } if (num_node_data_comp) { fprintf(fp,"%d ", num_node_data_comp); for (i=0; igeomflags & PL_HASVCOL) fprintf(fp,"rgba, NULL\n"); if (thispl->geomflags & PL_HASVN) fprintf(fp,"normal, NULL\n"); if (thispl->geomflags & VERT_4D) fprintf(fp,"w, NULL\n"); for (v = thispl->vl, i=0; in_verts; ++i, ++v) { /* print vertex colors */ fprintf(fp,"%d ", i+1); if (thispl->geomflags & PL_HASVCOL) { fprintf(fp,"%g %g %g %g", v->vcol.r, v->vcol.g, v->vcol.b, v->vcol.a); } /* print vertex normals */ if (thispl->geomflags & PL_HASVN) { fprintf(fp," %g %g %g", v->vn.x, v->vn.y, v->vn.z); } #ifdef FOURD /* print fourth coordinate if present */ if (thispl->geomflags & VERT_4D) { fprintf(fp," %g", v->pt.w); } #endif fprintf(fp,"\n"); } } /* now process cell data */ if (num_cell_data_comp) { fprintf(fp,"%d ", num_cell_data_comp); for (i=0; igeomflags & PL_HASPCOL) fprintf(fp,"rgba, NULL\n"); if (thispl->geomflags & PL_HASPN) fprintf(fp,"normal, NULL\n"); for (p = thispl->p, i=0; in_polys; ++i, ++p) { fprintf(fp,"%d ",i+1); /* print face colors */ if (thispl->geomflags & PL_HASPCOL) { fprintf(fp," %g %g %g %g", p->pcol.r, p->pcol.g, p->pcol.b, p->pcol.a); } /* print face normals */ if (thispl->geomflags & PL_HASPN) { fprintf(fp," %g %g %g", p->pn.x, p->pn.y, p->pn.z); } fprintf(fp,"\n"); } } } return 0; } geomview-1.9.4/src/bin/geomutil/ucd/ucdtooff.c0000644000175000001440000002467310622716743016224 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* File: anytoucd.c: Author: Charlie Gunn originally read a OOGL object on stdin, and write ucd format on stdout. */ #include "vec4.h" #include "geom.h" #include "ooglutil.h" #include "3d.h" #include "polylistP.h" #include "plutil.h" #include #include #include "time.h" /* #define DEBUG */ typedef struct { int id; HPoint3 v; } ucdvert; typedef struct { int id; int m; int n; int faces; int vlist[8]; } ucdpoly; #define UCD_NORMAL 1 #define UCD_RGBA 2 #define UCD_RGB 3 #define UCD_Z 4 #define UCD_NUMDATAFIELDS 8 int gettype(str) char *str; { if (strcmp(str, "normal") == 0) return UCD_NORMAL; else if (strcmp(str, "rgba") == 0) return UCD_RGBA; else if (strcmp(str, "rgb") == 0) return UCD_RGB; else return(0); } int nodeidtoindex(id, v, num_nodes) int id; ucdvert *v; int num_nodes; { int i; for (i=0; i= 0) printf("%d ", vertlist[j++]); if(plflags & PL_HASPCOL) printf("\t%.3g %.3g %.3g %.3g\n", color[i].r,color[i].g,color[i].b,color[i].a); else printf("\n"); } exit(0); } geomview-1.9.4/src/bin/geomutil/ucd/stack.c0000644000175000001440000000377410461140701015501 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "polylistP.h" static int BlockSize, array_size; static Poly *mystack, *stackptr; static int count = 0, debug = 0; int initstack(void) { array_size = 1; BlockSize = 1024; count = 0; if ((mystack = OOGLNewN (Poly, BlockSize )) == (Poly *) NULL) return(0); stackptr = mystack; return(1); } int push(pp) Poly *pp; { int i; if (stackptr >= &mystack[BlockSize*array_size]) { if (debug) fprintf(stderr,"allocating again: size is now %d\n",array_size*BlockSize); array_size = array_size*2; if ((mystack = OOGLRenewN(Poly,mystack, array_size*BlockSize)) == (Poly *) NULL) return (0); stackptr = &mystack[count]; } *stackptr = *pp; if ((stackptr->v = OOGLNewN(Vertex *, pp->n_vertices)) == (Vertex **) NULL) return(0); for (i=0; in_vertices; ++i) stackptr->v[i] = pp->v[i]; stackptr++; count++; return(1); } int getsize(void) { return(count); } Poly * getstack() { return(mystack); } geomview-1.9.4/src/bin/geomutil/ucd/Makefile.am0000644000175000001440000000047110622716743016271 00000000000000INCLUDES = @default_includes@ LDADD = ${OOGLLIB} DEPENDENCIES = ${OOGLLIB} #AM_LDFLAGS = -rpath $(libdir) man_MANS = anytoucd.1gv ucdtooff.1gv bin_PROGRAMS = anytoucd ucdtooff anytoucd_SOURCES = anytoucd.c make_frame.c stack.c vec4.h ucdtooff_SOURCES = ucdtooff.c vec4.h EXTRA_DIST = ucd_defs.h $(man_MANS) geomview-1.9.4/src/bin/geomutil/ucd/Makefile.in0000644000175000001440000004415210665240476016310 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = anytoucd$(EXEEXT) ucdtooff$(EXEEXT) subdir = src/bin/geomutil/ucd DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_anytoucd_OBJECTS = anytoucd.$(OBJEXT) make_frame.$(OBJEXT) \ stack.$(OBJEXT) anytoucd_OBJECTS = $(am_anytoucd_OBJECTS) anytoucd_LDADD = $(LDADD) am__DEPENDENCIES_1 = anytoucd_DEPENDENCIES = $(am__DEPENDENCIES_1) am_ucdtooff_OBJECTS = ucdtooff.$(OBJEXT) ucdtooff_OBJECTS = $(am_ucdtooff_OBJECTS) ucdtooff_LDADD = $(LDADD) ucdtooff_DEPENDENCIES = $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(anytoucd_SOURCES) $(ucdtooff_SOURCES) DIST_SOURCES = $(anytoucd_SOURCES) $(ucdtooff_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ LDADD = ${OOGLLIB} DEPENDENCIES = ${OOGLLIB} #AM_LDFLAGS = -rpath $(libdir) man_MANS = anytoucd.1gv ucdtooff.1gv anytoucd_SOURCES = anytoucd.c make_frame.c stack.c vec4.h ucdtooff_SOURCES = ucdtooff.c vec4.h EXTRA_DIST = ucd_defs.h $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/ucd/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/ucd/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done anytoucd$(EXEEXT): $(anytoucd_OBJECTS) $(anytoucd_DEPENDENCIES) @rm -f anytoucd$(EXEEXT) $(LINK) $(anytoucd_OBJECTS) $(anytoucd_LDADD) $(LIBS) ucdtooff$(EXEEXT): $(ucdtooff_OBJECTS) $(ucdtooff_DEPENDENCIES) @rm -f ucdtooff$(EXEEXT) $(LINK) $(ucdtooff_OBJECTS) $(ucdtooff_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anytoucd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_frame.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ucdtooff.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-binPROGRAMS install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomutil/ucd/make_frame.c0000644000175000001440000000601510455700775016472 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "transform.h" #include "hpoint3.h" #include "vec4.h" int make_rotation(HPoint3 *v1, HPoint3 *v2, Transform m); int make_tform(HPoint3 *p1, HPoint3 *p2, HPoint3 *p3, Transform m) /* Generate a Euclidean isometry which moves (0,0,0) -> p1. Furthermore, the vector (1,0,0) will go a vector tx based at p1 and ending at p2. the vector (0,1,0) will go a vector ty based at p1, perpendicular to tx, and lying in the plane of p1-p2-p3, in the "direction" of p3. the vector (0,0,1) will go a vector tz based at p1, perpendicular to tx and ty. The rotational part is computed by make_rotation. See comments there */ { HPoint3 nv1, nv2; Transform trans; VSUB3(p2, p1, &nv1); VSUB3(p3, p2, &nv2); nv1.w = 1.0; nv2.w = 1.0; NORMALIZE3(&nv1); NORMALIZE3(&nv2); if ( !make_rotation(&nv1, &nv2, m)) /* if collinear, use most recent rotation */ { #ifdef DEBUG fprintf(stderr,"Non-independent vectors: make_rotation\n"); #endif return(-1); } /* compute translation to take p1->(0,0,0) */ TmTranslate(trans, p1->x, p1->y, p1->z); /* first do the rotation, then the translation */ TmConcat(m, trans, m); return(0); } /* make rotation that takes (1,0,0) to v1; and (0,1,0) to the orthog. proj of v2 onto the perpendicular subspace of v1. Return (0) if v1 and v2 are collinear. */ int make_rotation(v1, v2, m) HPoint3 *v1, *v2; Transform m; { double a; HPoint3 t1, t2; a = VDOT3(v1, v2); if (a > .9999 || a < -.9999) return(0); t1.x = v1->x * a; t1.y = v1->y * a; t1.z = v1->z * a; VSUB3(v2, &t1, &t2) /* now t2 is orthogonal to v1 */ NORMALIZE3(&t2); TmIdentity(m); m[0][0] = v1->x; m[0][1] = v1->y; m[0][2] = v1->z; m[1][0] = t2.x; m[1][1] = t2.y; m[1][2] = t2.z; /* last row is cross product of the first two rows */ m[2][0] = v1->y*t2.z - v1->z*t2.y; m[2][1] = v1->z*t2.x - v1->x*t2.z; m[2][2] = v1->x*t2.y - v1->y*t2.x; return(1); } geomview-1.9.4/src/bin/geomutil/ucd/anytoucd.1gv0000644000175000001440000000125310600600312016455 00000000000000.TH anytoucd 1gv "June 12 1992" "Geometry Center" .SH NAME anytoucd \- filter to convert a geomview data file into a data file in the so-called 'ucd' (Unstructured Cell Data) format. .SH SYNOPSIS anytoucd .SH DESCRIPTION .PP Anytoucd reads a geom from standard in and outputs the equivalent ucd stream to standard out. Anytoucd calls anytopl(1) before converting to ucd. Full documentation for ucd format is available from AVS documentation in an appendix in the Developer's Guide. .SH BUGS .PP Currently no support for vectors. .PP 4D OOGL objects are not treated correctly currently. .SH SEE ALSO anytopl(3), ucdtooff(1) .SH AUTHOR .nf Charlie Gunn The Geometry Center .fi geomview-1.9.4/src/bin/geomutil/ucd/vec4.h0000644000175000001440000000244410455700775015253 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #define VSUB3(p0, p1, p2) \ { (p2)->x = (p1)->x - (p0)->x; \ (p2)->y = (p1)->y - (p0)->y; \ (p2)->z = (p1)->z - (p0)->z; } #define VDOT3(p0, p1) \ ((p0)->x*(p1)->x + (p0)->y*(p1)->y + (p0)->z*(p1)->z) #define NORMALIZE3(xx) \ {float x = sqrt((xx)->x*(xx)->x + (xx)->y*(xx)->y +(xx)->z*(xx)->z); \ if (x == 0) x = 1.0; \ x = 1.0/x; \ (xx)->x *= x; (xx)->y *= x; (xx)->z *= x;} geomview-1.9.4/src/bin/geomutil/maple2oogl/0000777000175000001440000000000010665240700015575 500000000000000geomview-1.9.4/src/bin/geomutil/maple2oogl/README.gvplot0000644000175000001440000002112510577534641017720 00000000000000 gvplot, writeoogl -- Maple 3-D graphics in Geomview Contents: Installation Outline (out of date) Maple's Library Directory Configurable Settings in gvplot Remote Display ******************************************************************************* NOTE: the installation instructions are out of date. Please have a look at `savegvplot.mws'; load that file with xmaple and try to guess what to do from the contents of that file. Nevertheless it may be helpful to read through _this_ file; it contains more information than just installation instructions. ******************************************************************************* This Maple package supports displaying Maple 3-D graphic objects (produced for example by Maple's plot3d function) in Geomview, and saving Maple graphics objects as Geomview-readable OOGL files. Maple 2-D graphics aren't supported. This distribution (in src/bin/geomutil/maple2oogl in the Geomview source distribution) includes Maple source files. You'll want to run Maple to produce library (.m) files from the source files, and possibly to install them in the Maple library directory to be accessible via readlib(gvplot). This process is handled by the "make install" command described here. Documentation for the package itself is available within Maple after installation; for example, type readlib(gvplot); ?gvplot To install this package: * Edit gvplot.mapleV3 or gvplot.mapleV4 (according to your version of Maple), possibly changing the settings of default_gvcommand and default_gvdirectories; see "Configurable Settings" and "Remote Display", below. * Determine the directory into which new Maple library (.m) files should be placed; see "Maple's Library Directory". This will be the setting of MAPLE_LIB. A typical value might be /usr/local/maple/lib. * If geomview, togeomview, and remotegv aren't already on the search path of everyone who'll want to use the program, determine which directory they are (or will be) placed in, e.g. /usr/local/bin. This will be the setting of BINDIR. * If you have the source distribution, edit makefiles/mk.site.default (relative to the top of the geomview distribution) and set MAPLE_LIB and BINDIR to the appropriate values. * Make sure "maple" is on your search path. * Run make install or, if you didn't set MAPLE_LIB and BINDIR in mk.site.default, give those values explicitly on the "make" command line: make install MAPLE_LIB=maple_library_directory BINDIR=binary_directory Maple V4 users: since the Geometry Center doesn't have Maple V4, we haven't been able to test that "make install" correctly determines the version of Maple if you have release 4. If you have trouble, try invoking the MapleV4 installation directly with make install_v4 MAPLE_LIB=maple_lib_dir BINDIR=binary_dir MAPLE'S LIBRARY DIRECTORY For convenient invocation, it's best to put the compiled Maple code for this package -- the file gvplot.m -- in some directory known to Maple. Users can then invoke it by typing readlib(gvplot); Since Maple V.2, Maple keeps a list of library directory names in the global variable "libname". Its default value is typically the single directory `/usr/local/maple/lib`; you can check its actual value by running Maple and typing libname; You can configure Maple to add other directories (e.g. for locally- installed rather than Maple-supplied packages) to the libname list for all users. Briefly, you create a "src" subdirectory of the default library directory (e.g. /usr/local/maple/lib/src) and create a file there named "init" containing something like libname := libname, `/usr/local/maple/otherstuff`: You could then place library files in /usr/local/maple/otherstuff, and/or set MAPLE_LIB = /usr/local/maple/otherstuff in makefiles/mk.site.default. Configurable Settings in gvplot Two values in the "gvplot" script are configurable: default_gvcommand, the UNIX command used to invoke geomview. It's normally "geomview", but might specify some geomview options, or might be "remotegv" if you'll want to run maple on one system and display via geomview on another. default_gvdirectories, the directory(ies) (in addition to those in the normal UNIX search path) to find the programs "togeomview" and "geomview". There's no default; this is correct if these programs are installed on everyone's search path, e.g. in /usr/local/bin. This value is automatically configured as part of the "make install" process and probably won't need to be messed with. It can be set to a colon-separated list of directories. It can be useful to invoke something other than simply "geomview" to display Maple graphics; for example, one might start geomview with options to position its window, or with a special startup script. To adjust this, change the setting of "gvcommand" near line 45, as in default_gvcommand := `geomview -nopanels -wpos 640x480@0,0`; To regenerate the library (.m) file after such changes, start a fresh Maple session, read the source file, and save the library file: read(`gvplot`); save(`/usr/local/maple/lib/gvplot.m`); REMOTE DISPLAY It's possible to run Maple on one system and display Geomview graphics on another. This can sometimes be done by using the X "DISPLAY" environment variable, so that Maple and Geomview run on one machine but Geomview's windows appear elsewhere. But for fastest graphics, it's better if you can run Geomview on the computer where the display is. To have the gvplot package invoke Geomview on another machine, make it invoke "remotegv" rather than "geomview". You can make "remotegv" the default for all gvplot users by editing the gvplot source and changing the setting of "default_gvcommand" near line 45. Or, a user can adjust the setting of "gvcommand" within each session, saying e.g. readlib(gvplot); gvcommand := `remotegv -h slevy@gauss`; remotegv attempts to guess which machine to invoke geomview on by examining the DISPLAY environment variable. If DISPLAY isn't set or if geomview should run on a different machine, use the -h host option. The script also assumes that geomview should display on the machine where it is invoked, so for that copy of geomview, it sets DISPLAY to ":0". If the display should appear elsewhere (on an X terminal, say), use the -display option. Remotegv uses "rsh" (remote shell) to pass data to the other computer, so the remote computer must allow this -- either with an entry in /etc/hosts.equiv, or in a .rhosts file in the user's home directory on the machine where geomview will run. The account name on the other machine is assumed to be the same as on this machine; if different, use the -l username or -h username@othermachine options. In case permissions are not set up correctly, the symptom is liable to be a "Permission denied." message followed by the immediate termination of the Maple process -- so if you're using it for the first time, check it out before doing much else in your Maple session! Sorry, but MapleV3 is just not very good at connecting to other programs. Note that togeomview and geomview MUST BE IN THE USER'S DEFAULT SEARCH PATH on the remote machine. To use this script within Maple, you'd say: readlib(gvplot); then gvcommand := `remotegv`; or e.g. gvcommand := `remotegv -h othermachine -display myxterm:0`; or, if the account on the other machine is different from yours, gvcommand := `remotegv -l otheraccount`; or gvcommand := `remotegv -h otheraccount@othermachine`; Following any remotegv options, you can add the command to be invoked as geomview, possibly including options, as in: gvcommand := `remotegv -l person /u/person/bin/geomview -wpos 300x200`; Once gvcommand is properly set, you can use gvplot() as usual. Normally, error messages reporting problems on the other machine (for example, being unable to run geomview) are suppressed; this is unfortunately necessary, or you'd never get another Maple prompt until quitting from geomview. There's a test mode to aid in tracing problems; use it as in gvcommand := `remotegv -test -h othermachine`; i.e. add "-test" to whatever other options you'd give to remotegv. Summary of remotegv options: -l user or -l user@host -h host or -h user@host -display host:number (set display on remote end) -test also accepts togeomview's options (-g, -M[c][g][p][s]). Invokes rsh to specified machine, invokes togeomview there by default. By default, we assume DISPLAY points to the machine where we'd like to be; -h {host-portion-of-DISPLAY} -display :0 Incorporates settings from "$RGVOPTS" environment variable. geomview-1.9.4/src/bin/geomutil/maple2oogl/remotegv0000755000175000001440000001100607730233776017303 00000000000000#! /bin/sh # Invoke geomview possibly remotely. # For use within Maple, install this remotegv script somewhere in users' # search paths (e.g. in /usr/local/bin). # This script attempts to guess which machine to invoke geomview on by # examining the DISPLAY environment variable. If DISPLAY isn't set or # if geomview should run on a different machine, use the -h host option. # # The script also assumes that geomview should display on the machine where # it is invoked, so for that copy of geomview, it sets DISPLAY to ":0". # If the display should appear elsewhere (on an X terminal, say), # use the -display option. # # We use "rsh" (remote shell) to pass data to the other computer, so # the remote computer must allow this -- either with an entry in # /etc/hosts.equiv, or in a .rhosts file in the user's home directory # on the machine where geomview will run. The account name on the other # machine is assumed to be the same as on this machine; if different, # use the -l username or -h username@othermachine options. # # In case permissions are not set up correctly, the symptom # is liable to be a "Permission denied." message followed by the # immediate termination of the Maple process -- so if you're using it for # the first time, check it out before doing much else in your Maple session! # Sorry, but MapleV3 is just not very good at connecting to other programs. # # Note that togeomview and geomview MUST BE IN THE USER'S DEFAULT SEARCH PATH # on the remote machine. # # To use this script within Maple, you'd say: # readlib(gvplot); # then # gvcommand := `remotegv`; # or e.g. # gvcommand := `remotegv -h othermachine -display myxterm:0`; # or, if the account on the other machine is different from yours, # gvcommand := `remotegv -l otheraccount`; # or # gvcommand := `remotegv -h otheraccount@othermachine`; # Following any remotegv options, you can add the command to be invoked as # geomview, possibly including options, as in: # gvcommand := `remotegv -l person /u/person/bin/gv -wpos 300x200`; # # Then use gvplot() as usual. # # Normally, error messages reporting problems on the other machine (for # example, being unable to run geomview) are suppressed; this is unfortunately # necessary, or you'd never get another Maple prompt until quitting from # geomview. There's a test mode to aid in tracing problems; use it as in # gvcommand := `remotegv -test -h othermachine`; # i.e. add "-test" to whatever other options you'd give to remotegv. # # Option summary: # -l user or -l user@host # -h host or -h user@host # -display host:number (set display on remote end) # -test # also accepts togeomview's options (-g, -M[c][g][p][s]). # Invokes rsh to specified machine, invokes togeomview there by default. # # By default, we assume DISPLAY points to the machine where we'd like to be; # -h {host-portion-of-DISPLAY} -display :0 # Incorporates settings from "$RGVOPTS" environment variable. set -- $RGVOPTS "$@" set -x RGVSH=${RGVSH:-rsh} while case "$1" in -l) case "$2" in *@*) user="`expr match "$2" '\([^@]*\)'`" host="`expr match "$2" '.*@\(.*\)'`" ;; *) user="$2" ;; esac shift 2 ;; -h) case "$2" in *@*) user="`expr match "$2" '\([^@]*\)'`" host="`expr match "$2" '.*@\(.*\)'`" ;; *) host="$2" ;; esac shift 2 ;; -test) testopt=-test; shift ;; -display) rdisplay="$2"; shift 2 ;; -M*) togvopts="$togvopts $1"; inpipe="$2" shift 2 ;; -g) gopt=-g; shift ;; "") test ;; *) togvargs="$togvargs $1"; shift ;; esac do : done # Apply defaults if [ -z "$host" ]; then host="`expr match "$DISPLAY" '\([^:]*\)'`" fi if [ -z "$rdisplay" ]; then rdisplay=":0.0" fi case "$inpipe" in /*) ;; ?*) inpipe=/tmp/geomview/$inpipe ;; esac user=${user+"-l $user"} cmd="${host+$RGVSH $host $user}" if [ -n "$host" ]; then redirect=">/dev/null 2>&1" if [ -n "$testopt" ]; then echo "Testing setup to $host. If geomview or togeomview can't be started there, you should see messages explaining why. Unfortunately this command may not finish on its own -- you may need to interrupt (perhaps with control-C) after seeing the results, before you get another Maple prompt." >&2 redirect="" fi if [ -n "$inpipe" ]; then $RGVSH $host $user sh -c "\"DISPLAY=$rdisplay togeomview $gopt ${togvopts} $inpipe $togvargs $redirect\"" <$inpipe else $RGVSH $host $user sh -c "\"DISPLAY=$rdisplay togeomview $gopt ${togvopts} $togvargs $redirect\"" fi else case "$1" in ""|-*) DISPLAY=$rdisplay geomview ${togvopts} $togvargs ;; *) DISPLAY=$rdisplay ${togvopts} $togvargs;; esac fi geomview-1.9.4/src/bin/geomutil/maple2oogl/gvplot.mapleV30000644000175000001440000006442710462161603020271 00000000000000########################## ## ## Title : writeoogl, a package for converting maple PLOT3D ## objects to Geomview data objects. ## gvplot, interactive pipe to Geomview from Maple ## ## Created : Dec 5 1993 ## ## Authors : Frederick Wicklin and ## Stuart Levy ## The Geometry Center ## ## Documentation : currently ?gvplot or ?writeoogl or ?geomview ## ## History ## fjw 9/21/93 initial maple->geomview for Maple VR2 ## slevy 11/27/93 interactive geomview pipe; ## backwards compatable to Maple V ## fjw 11/29/93 debugging; added color options ## ## ## Usage: readlib(gvplot); ## (optional) gvcommand := `geomview initial-options ...`; ## (optional) gvdirectories := `/some/dir/ectory:/other/dir...`; ## 3dplot_struct := plot3d( ... ): ## writeoogl(`filename`, 3dplot_struct); ## gvplot(3dplot_struct); # To search for "geomview" and "togeomview" in directories which might not # be on the default UNIX search path, list those director(ies) here, as in # default_gvdirectories := `/u/geom/bin:/usr/local/bin:` # or, set the "gvdirectories" variable before invoking gvplot(). default_gvdirectories := ``: # To start geomview with non-default options, or to start another program # via gvplot, put its name and initial arguments here in place of `geomview`, # or set the variable "gvcommand" before invoking gvplot(). # Changing default_gvcommand, then resaving gvplot.m, alters the default for # all users; setting the gvcommand variable changes it for just your session. default_gvcommand := `geomview`: ### Upon invoking the geomview package, maple creates a global ### variable UsEr_ID__ which is assigned a "random" number. ### This variable is used to create user-specific files in /tmp. ################################################################## # There doesn't seem to be any explicit test for Maple V1 vs. V2, # but all V1 plot objects seem to begin with FUNCTION, so use that fact # to detect that we must be careful not to print invalid float constants. ################################################################## `oogl/lprn` := `oogl/lprnV2`: writeoogl := proc() global `oogl/lprn`; local header, item, ps, zlist, plist, llist, ppoint, pcolor, appear, i, j, totl, xrange, yrange, nx, ny, oldgc, coloron,colorlist,ccnt, totalverts; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; if nargs > 2 or nargs = 0 then ERROR(`Usage:writeoogl(``filename``,3dplot_struct); OR writeoogl(3dplot_struct);`) fi; ps := args[nargs]; if not type(ps, PLOT3D) then ERROR(`Invalid plot structure`,ps, `; must be of type PLOT3D, as from plot3d(), tubeplot(), spacecurve(), etc.`) fi; if nargs = 2 and not type(args[1], string) then ERROR(`Invalid file name (not string)`, args[1]) fi; if nops(ps) < 1 then ERROR(`Empty 3D plot structure!`) fi; ################################################################## # When run in command-line mode, Garbage Collection (GC) # # messages printed to terminal can interfere with the data flow. # # Therefore suppress GC during writing of GeomView data # ################################################################## if nargs = 2 then oldgc := status[5]; # words increment for automatic garbage collection gc(0); # suppress garbage collection print(`Saving Maple 3D structs to Geomview file`, args[1]); writeto(args[1]); fi; xrange := 'xrange'; # nullify this local variable appear := find_appearance(1, ps); lprint( appear, `{LIST` ); ################################################################## ### BEGIN main loop over all 3D plots (may be a list of plots) ### ################################################################## for item in ps do coloron := FALSE; # default is no color info header := op(0,item); if header = FUNCTION then # Maple V1 only: FUNCTION( f(x,y), xrange, yrange ) # or FUNCTION( x(u,v), y(u,v), z(u,v), u = u0..u1, v = v0..v1 ) xrange := op(nops(item)-1, item); if type(xrange, `=`) then xrange := op(2, xrange) fi; yrange := op(nops(item), item); if type(yrange, `=`) then yrange := op(2, yrange) fi; # Maple V1 -- don't trust lprint() `oogl/lprn` := `oogl/lprnV1`; ########################### GRID ############################ # EX: plot3d( f(x,y), x=xmin..xmax, y=ymin..ymax] # Saving Maple GRID struct to geomview ZMESH struct # Maple V1: FUNCTION( f(x,y), xrange,yrange ) followed by GRID( zlist ) # In Maple V1, we might see either ZMESH-style data (only Z per vertex) # or a full 3-D mesh (x,y,z per vertex). Just check the first # vertex to see. # Maple V2: GRID( xrange, yrange, zlist ) # Maple V2 uses GRID only for ZMESH-style data, # and uses a MESH header for meshes with general 3-D verts. ############################################################### elif header = GRID then if type(xrange, `..`) then zlist := item else # this is typical VR2 route xrange := op(1, item); yrange := op(2, item); zlist := op(3, item); ####################################################### # if color, then there are 4 possibilities: # colorlist = COLOR(HUE, h[1],...,h[nops[colorlist]) # colorlist = COLOR(HUE, h) # colorlist = COLOR(RGB, r[1],g[1],b[1],...) # colorlist = COLOR(RGB, r,g,b) # Convert HUES to an RGB value using HSV2RGB and # (assume that Maple uses s=v=1). Add a 1 at the end of # the list for geomview's "alpha": 0<=>transparent, 1<=>opaque ####################################################### if( nops(item)>3 ) then colorlist := find_colorlist(4, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; fi; nx := nops(zlist); ny := nops(op(1,zlist)); if type(op(1, op(1,zlist)), list) then lprint(`{ { MESH`, ny, nx) else # scale this data by wrapping it in transformation matrix lprint(`{ INST transform { `); `oogl/lprn`( [0, (op(2,yrange)-op(1,yrange)) / (ny-1), 0, 0] ); `oogl/lprn`( [(op(2,xrange)-op(1,xrange)) / (nx-1), 0, 0, 0] ); lprint(0, 0, 1, 0); `oogl/lprn`( [op(1,xrange), op(1,yrange), 0, 1] ); if(coloron = FALSE) then lprint(` } geom { ZMESH`, ny, nx); # gv type else lprint(` } geom { CZMESH`, ny, nx); # color gv type fi; fi; ccnt := 2; # set color counter to 2 for plist in zlist do for ppoint in plist do `oogl/lprn`(ppoint); if (coloron = HUE) and nops(colorlist)>2 then lprint(HSV2RGB(op(ccnt,colorlist), 1,1), 1); ccnt := ccnt + 1; elif (coloron = HUE) and nops(colorlist)=2 then lprint(HSV2RGB(op(2,colorlist), 1,1), 1); elif (coloron = RGB) and nops(colorlist)>4 then lprint(op(ccnt,colorlist),op(ccnt+1,colorlist),op(ccnt+2,colorlist),1); ccnt := ccnt + 3; elif (coloron = RGB) and nops(colorlist)=4 then lprint(op(2,colorlist),op(3,colorlist),op(4,colorlist), 1); fi; od; od; lprint( `} }`); ########################### MESH ########################### # EX: plot3d( [x(s,t), y(s,t), z(s,t)], s=smin..smax, t=tmin..tmax] # Saving Maple MESH struct to geomview MESH struct ############################################################### elif header = MESH then llist := op(1, item): if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; if(coloron=FALSE) then lprint(`{ MESH ` ); # gv type else lprint(`{ CMESH ` ); # color gv type fi; lprint( nops(llist)); # num x elements lprint( nops(op(1,llist)) ); # num y elements # Maple store points in row-dominant manner # But geomview want column-dominant, so need to # print out the transpose of the matrix in the plot3d struct nx := nops(llist); # maple rows ny := nops(op(1,llist)); # maple cols for j from 1 to ny do for i from 1 to nx do ppoint := op(j, op(i,llist)); `oogl/lprn`(ppoint); if (coloron = HUE) and nops(colorlist)>2 then lprint(HSV2RGB(op((i-1)*ny+j +1,colorlist), 1,1), 1); elif (coloron = HUE) and nops(colorlist)=2 then lprint(HSV2RGB(op(2,colorlist), 1,1), 1); elif (coloron = RGB) and nops(colorlist)>4 then lprint(op(3*((i-1)*ny+j-1)+2,colorlist),op(3*((i-1)*ny+j-1)+3,colorlist),op(3*((i-1)*ny+j-1)+4,colorlist),1); elif (coloron = RGB) and nops(colorlist)=4 then lprint(op(2,colorlist),op(3,colorlist),op(4,colorlist), 1); fi; od; od; lprint( `}`); ########################### CURVES ########################## # EX: spacecurve( [x(t), y(t), z(t)], t=tmin..tmax] # Saving Maple CURVES struct to geomview VECT struct ############################################################### elif header = CURVES then llist := select(type, item, list); if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; lprint(`{ VECT `); # gv type # Number of polylines, total vertices. totalverts := sum('nops(op(i,llist))', 'i'=1..nops(llist)); lprint(nops(llist), totalverts); if coloron=FALSE then lprint(1); # One color in all lprint(seq(nops(op(i,llist)), i=1..nops(llist))); # Vertex counts lprint(1, 0 $ 'i'=2..nops(llist)); # Color counts. else lprint(totalverts); # Total number of colors, 1 per vert lprint(seq(nops(op(i,llist)), i=1..nops(llist))); # Vertex counts lprint(seq(nops(op(i,llist)), i=1..nops(llist))); # color per vert fi; for plist in llist do for ppoint in plist do # print all vertices `oogl/lprn`(ppoint); od od; if coloron=FALSE then lprint(1,1,1,1); # color RGBA = white and opaque elif (coloron = HUE) and nops(colorlist)>2 then for ccnt from 2 to nops(colorlist) do lprint(HSV2RGB(op(ccnt,colorlist), 1,1), 1); od; elif (coloron = HUE) and nops(colorlist)=2 then for ccnt from 1 to nops(llist) do lprint(HSV2RGB(op(2,colorlist), 1,1), 1); od; elif (coloron = RGB) and nops(colorlist)>4 then for ccnt from 2 by 3 to nops(colorlist) do lprint(op(ccnt,colorlist),op(ccnt+1,colorlist),op(ccnt+2,color\list),1); od; elif (coloron = RGB) and nops(colorlist)=4 then for ccnt from 1 to nops(llist) do lprint(op(2,colorlist),op(3,colorlist),op(4,colorlist),1); od; fi; lprint( `}`); ######################### POLYGONS ########################## #EX:polygonplot3d([seq([seq([x(s,t),y(s,t),z(s,t)],s=smin..smax],tmin..tmax])): # Polygons are handled differently than the other objects w/r/t # color. Leave color alone and let user change color using geomview. ############################################################### elif header = POLYGONS then pcolor := i $ i=1..0; # Empty sequence totl := 0: nx := 0: # use nx to count number of polygons for llist in item do # sequence of lists POLY(),COLOR(), if type(llist,list) then nx := nx + 1; # number of polygons totl := totl + nops(llist); # compute total number of vertices fi od; lprint(find_appearance(1, item)); # if coloron=FALSE then lprint(`{ OFF `); # gv type # else # lprint(`{ COFF `); # color # fi; lprint(totl, nx, 0); # total verts,polygons,"edges"(not used!) for llist in item do if type(llist,list) then for ppoint in llist do `oogl/lprn`(ppoint); # List of vertices od; fi; od; lprint(``); totl := 0; for llist in item do if type(llist,function) and (op(0,llist)=COLOR or op(0,llist)=COLOUR) then colorlist := llist; if op(1,llist)=HUE and nops(colorlist)=2 then pcolor := HSV2RGB(op(2,colorlist),1,1); # use ppoint for RGB elif op(1,llist)=RGB and nops(colorlist)=4 then pcolor := op(2..4,colorlist); fi; elif type(llist,list) then ## There are only two possibilities for POLYGONS ## ## In both cases, it means entire polygon is same color ## lprint( nops(llist), i $ i=totl..totl+nops(llist)-1, ` `, pcolor); totl := totl + nops(llist); fi; od; lprint( `}`); ######################### POINTS ########################## #EX:PLOT3D(POINTS([0,0,1],[1,0,0],[0,1,0])); ############################################################### elif header = POINTS then lprint(`{ VECT`, nops(item), nops(item), 0); for plist in item do lprint(`1`) od; lprint(``); for plist in item do lprint(`0`) od; lprint(``); for ppoint in item do `oogl/lprn`(ppoint) od; lprint(`}`); ########################### TEXT ############################ # 3D plots using the "plots" package may include TEXT # This is not supported ############################################################### elif header = TEXT then print(` `); fi; od; # END main for loop lprint( `}`); if nargs = 2 then writeto(terminal); gc(oldgc); fi; end: gvplot := proc() global UsEr_ID__, gvcommand, default_gvcommand, gvdirectories, default_gvdirectories; local gvname, gvcmd, gvdirs, ps, oldgc, tmp_fname; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; ### Set up filename to use as temporary site for data. ### ### Take file in /tmp and postfix number which is (hopefully) ### ### independent of users. Eg, if user1 and user2 are both ### ### using writeoogl, then they will be writing to different ### ### files. This is UNIX specific (but so is Geomview). ### if UsEr_ID__ = 'UsEr_ID__' then UsEr_ID__ := (round( rand() * (time()+1) ) mod 9999) + 1; fi; tmp_fname := `Maple`.(UsEr_ID__); ### Let user specify, via "gvcommand" and "gvdirectories" global vars, ### which program/args to run when invoking geomview, ### and how to set the search path to find it and togeomview. if gvcommand <> 'gvcommand' then gvcmd := gvcommand else gvcmd := default_gvcommand fi; if gvdirectories <> 'gvdirectories' then gvdirs := gvdirectories else gvdirs := default_gvdirectories fi; ps := args[nargs]; gvname := `Maple`; if nargs < 1 or nargs > 2 then ERROR(`Usage: gvplot(3dplot_structure) -or- gvplot(``name``, 3dplot_structure)`); fi; if nargs > 1 then gvname := args[1] fi; if not type( ps, PLOT3D) then ERROR(`Invalid plot structure`,ps, `; must be of type PLOT3D, as from plot3d(), tubeplot(), spacecurve(), etc.`) fi; # start geomview reading from stdin if system( `PATH=` . gvdirs . `:$PATH togeomview -Mcp `.tmp_fname.` `.gvcmd.` 0 then ERROR(`gvplot: togeomview: Can't start a copy of geomview. `. `If "togeomview" or "geomview" were not found `. `try setting the variable "gvdirectories" to the name of the directory where `. `they're installed (or to a colon-separated list of directories).`); fi; oldgc := status[5]; # words increment for automatic garbage collection gc(0); # suppress garbage collection messages writeto(`/tmp/geomview/`.tmp_fname); lprint(`(geometry`, gvname); writeoogl( ps ); lprint(`)`); writeto(terminal); gc(oldgc); # return to previous garbage collection state end: gvcommand := proc() global UsEr_ID__, gvcommand, default_gvcommand, gvdirectories, default_gvdirectories; local gvname, gvcmd, gvdirs, ps, oldgc, tmp_fname; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; ### Set up filename to use as temporary site for data. ### ### Take file in /tmp and postfix number which is (hopefully) ### ### independent of users. Eg, if user1 and user2 are both ### ### using writeoogl, then they will be writing to different ### ### files. This is UNIX specific (but so is Geomview). ### if UsEr_ID__ = 'UsEr_ID__' then UsEr_ID__ := (round( rand() * (time()+1) ) mod 9999) + 1; fi; tmp_fname := `Maple`.(UsEr_ID__); ### Let user specify, via "gvcommand" and "gvdirectories" global vars, ### which program/args to run when invoking geomview, ### and how to set the search path to find it and togeomview. if gvcommand <> 'gvcommand' then gvcmd := gvcommand else gvcmd := default_gvcommand fi; if gvdirectories <> 'gvdirectories' then gvdirs := gvdirectories else gvdirs := default_gvdirectories fi; # start geomview reading from stdin if system( `PATH=` . gvdirs . `:$PATH togeomview -Mcp `.tmp_fname.` `.gvcmd.` 0 then ERROR(`gvplot: togeomview: Can't start a copy of geomview. `. `If "togeomview" or "geomview" were not found `. `try setting the variable "gvdirectories" to the name of the directory where `. `they're installed (or to a colon-separated list of directories).`); fi; oldgc := status[5]; # words increment for automatic garbage collection gc(0); # suppress garbage collection messages writeto(`/tmp/geomview/`.tmp_fname); lprint(args); writeto(terminal); gc(oldgc); # return to previous garbage collection state end: # possible gvplot enhancements: # allow remote display? # Maybe use a two-step Rube Goldberg hookup with an external converter # that directly reads lprint() format. Likely to be faster for large objects. # Then gvplot would read # gvplot := proc() # ... # if system(`togeomview -Mcp Maple.raw maple2oogl -togeomview -Mcp Maple`)<>0 # then ERROR(...) fi; # writeto(`/tmp/geomview/Maple.raw`); # lprint(`(geometry`, gvname, `<<`); # lprint(3dplot_struct); # lprint(`>>)`); # writeto(terminal); # end: # and writeoogl would read # writeoogl := proc() # ... # if system(cat(`togeomview -Mcp Maple.rawdata maple2oogl -o `, fname)) <> 0 # then ERROR(...) fi; # writeto(`/tmp/geomview/Maple.rawdata`); # lprint(`<<', 3dplot_string, `>>'); # writeto(terminal); # end: # # Here 'togeomview' is actually being used to start 'maple2oogl' rather # than geomview itself. In the first case, maple2oogl -togeomview would # invoke code to start a copy of geomview. # Help information for writeoogl `help/text/writeoogl` := TEXT( ` `, `HELP FOR: writeoogl, gvplot `, ` `, `CALLING SEQUENCE: `, ` readlib(gvplot): `, ` writeoogl( ``filename``, 3dplot_struct ); `, ` writeoogl( 3dplot_struct ); `, ` gvplot( 3dplot_struct ); `, ` gvplot( ``geomview_name``, 3dplot_struct ) `, ` `, `PARAMETERS: `, ` filename the file which will contain the Geomview data `, ` 3dplot_struct a Maple PLOT3D data structure `, ` geomview_name name of the object in the Geomview browser `, ` `, `SYNOPSIS: `, ` writeoogl() accepts Maple PLOT3D structures and writes files `, ` readable by Geomview. gvplot() converts Maple PLOT3D structures`, ` and displays them immediately using Geomview, starting a copy of`, ` Geomview if necessary.`, ``, ` Supported data types include the Maple structures MESH, GRID, `, ` CURVES, POINTS, and POLYGONS. `, ` See ?plot3d[structure] for more information on Maple PLOT3D types.`, ` `, ` The Maple MESH and GRID structures are translated into Geomview's`, ` MESH and ZMESH objects, respectively, Maple CURVES and POINTS`, ` become VECT objects, and Maple POLYGONS becomes an OFF object.`, ` `, ` The Maple TEXT structure is not supported. Color information is`, ` supported for all objects.`, ``, ` The form writeoogl(filename, plot_struct) writes data in OOGL`, ` (Geomview) form to the given file; writeoogl(plot) writes to the`, ` current output stream as selected by writeto().`, ``, ` gvplot() normally starts the program "geomview", with no options;`, ` to specify something else, set the variable "gvcommand", as in:`, ` gvcommand := ``/usr/local/bin/gv -wpos 200x200 -c startup.gv``;`, ` before invoking gvplot(). Also, if the programs "geomview" or`, ` "togeomview" are not on your UNIX search path, set the variable`, ` gvdirectories := ``/some/dir/ectory:/some/other/directory``;`, ` to the appropriate directory (or directories separated by colons).`, ` `, `EXAMPLES: `, ` readlib(gvplot): `, ` my_plot := plot3d(sin(x+y), x=-Pi..Pi, y=-Pi..Pi): `, ` writeoogl( ``sinxy.mesh``, my_plot ); `, ` Saving Maple 3D structs to Geomview file, sinxy.mesh `, ` steiner := plot3d([ sin(2*x)*(cos(y))^2, sin(x)*sin(2*y), `, ` cos(x)*sin(2*y)], x=-Pi..Pi, y=-Pi..Pi): `, ` writeoogl( ``steiner.mesh``, steiner); `, ` Saving Maple 3D structs to Geomview file, steiner.mesh`, ` # Display it in geomview directly `, ` gvplot( steiner ); `, ` # load in the plots package `, ` with(plots): `, ` trefoil := spacecurve([ -2*cos(t)- 1/2*cos(5*t)+ 3*sin(2*t), `, ` -3*cos(2*t)+ 2*sin(t)- 1/2*sin(5*t), 2*cos(3*t), t=0..2*Pi]):`, ` writeoogl( ``trefoil.vect``, trefoil); `, ` Saving Maple 3D structs to Geomview file, trefoil.vect`, ` tetrahedra := [[1,0,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,0,1],[0,1,0]], `, ` [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,0]]:`, ` Tplot :=polygonplot3d([tetrahedra]): `, ` writeoogl( ``tetrahedra.off``, Tplot); `, ` Saving Maple 3D structs to Geomview file, tetrahedra.off`, ` # you can even create a single file with multiple objects `, ` all_objs := display3d( {my_plot, steiner, trefoil, Tplot} ): `, ` writeoogl( ``all.list``, all_objs ); `, ` Saving Maple 3D structs to Geomview file, all.list `, ` `, `SEE ALSO: plot3d[structure] ` ): `help/text/gvplot` := `help/text/writeoogl`: `help/text/geomview` := `help/text/writeoogl`: # Convert number to string, avoiding excess digits and avoiding Maple V1's # propensity to emit Float(mantissa,exponent) rather than ordinary exponential # notation! `oogl/cvs` := proc(v) local sign, absmant; options `Copyright 1993 by Stuart Levy, Geometry Center`; if type(v, float) then absmant := cat(abs(op(1,v))); sign := substring(`-`, 1..1-signum(v)); if abs(v) >= 1 then if(op(2,v) >= 0) then cat(op(1,v), '0' $ op(2,v)) else cat( sign, substring(absmant, 1..length(absmant)+op(2,v)), `.`, substring(absmant, length(absmant)+op(2,v)+1..8) ) fi elif abs(v) > .000001 then cat( sign, substring( `.0000000`, 1 .. 1-length(absmant)-op(2,v) ), substring(absmant, 1..7) ) else cat( sign, `.`, substring( absmant, 1..7), `e`, op(2,v) + length(absmant) ) fi elif type(v, realcons) then cat(v) fi; end: # # lprint a number, or a list of numbers. # `oogl/lprnV1` := proc (v) local i; options `Copyright 1993 by Stuart Levy, Geometry Center`; if type(v, list) then lprint( ' `oogl/cvs`(v[i]) ' $ i=1..nops(v) ); elif type(v,float) and abs(v) <= .1 then lprint(`oogl/cvs`(v)); elif type(v, realcons) then lprint(v); else lprint(`0 #`); fi; end: # Ditto, but assume we're Maple V2, which prints floating constants # in acceptable form. Don't bother to reformat them. `oogl/lprnV2` := proc(v) local i; options `Copyright 1993 by Stuart Levy, Geometry Center`; if type(v, list) then lprint( 'v[i]' $ i = 1..nops(v) ); # Print on one line elif type(v, realcons) then lprint(v); else lprint(`0 #`); fi end: ############################################################### ## HSV2RGB converts Maple Hues to RGB colors. ## The HUEs used are in [0,1] so assume that S=V=1 (this is close) ## The following algorithm is from Computer Graphics ## By Foley, vanDam, Feiner, Hughes, 2nd Ed. Addison-Wesley ## p 593 ## ## Adapted by fjw 11/29/93 ## Input: (h,s,v) in [0,1]^3 ## Output: sequence r,b,g each in [0,1] ############################################################### HSV2RGB := proc( h,s,v ) local hh,ip,fp,p,q,t; options `Copyright 1990 by Foley, vanDam, Feiner, Hughes`; if (s = 0) then # color on B/W center line if (h<0) then # There is no hue,ie, hue undefined RETURN( v,v,v ); else ERROR(`Undefined color`); fi; else if (h>1) then hh:=1 fi; hh := 6*h; # hh now in [0,6] ip := floor(hh); # ip is integer part of h fp := hh - ip; # fp is fractional part of h p := v*(1-s); q := v*(1-(s*fp)); t := v*(1-(s*(1-fp))); if (ip=0) then RETURN( v,t,p ); elif (ip=1) then RETURN( q,v,p ); elif (ip=2) then RETURN( p,v,t ); elif (ip=3) then RETURN( p,q,v ); elif (ip=4) then RETURN( t,p,v ); else RETURN( v,p,q ); fi; fi; end: ######################################################## # find_colorlist # input: n where to start looking for color data # item what list to search # output: list of color information or NULL list ######################################################## find_colorlist := proc(n,item) local i; options `Copyright 1993 by Frederick Wicklin, Geometry Center`; for i from n to nops(item) do if type(op(i,item),function) and (op(0,op(i,item))=COLOR or op(0,op(i,item))=COLOUR) then RETURN(op(i,item)) fi; od; RETURN([FALSE]); # no color info found end: ######################################################## # find_appearance # input: n index to start seeking color data # list list to search # output: argument of STYLE option (e.g. `PATCH`) or [] list. ######################################################## find_appearance := proc(n, list) local i, part, ap, color, colortype; ap := ``; color := ``; for i from n to nops(list) do part := op(i,list); if type(part,function) and (op(0,part)=COLOR or op(0,part)=COLOUR) then colortype := op(1,part); if colortype = HUE and nops(part) = 2 then color := [HSV2RGB(op(2,part), 1, 1)] elif colortype = RGB and nops(part) = 4 then color := [op(2..4,part)] fi # Otherwise, this "color" tag isn't for us elif type(part,function) and op(0,part) = STYLE then if op(1,part) = PATCH then ap := cat(ap, ` +face -edge`) elif op(1,part) = LINE or op(1,part) = WIREFRAME then ap := cat(ap, ` -face +edge`) fi elif type(part,function) and op(0,part) = THICKNESS and type(op(1,part),integer) then ap := cat(ap, ` linewidth `, op(1,part)); fi od; if color <> `` then color := cat( op(1..3, map(v -> cat(convert(v,string),` `), color) ) ); ap := cat(ap, `\n material { edgecolor `, color, `\n diffuse `, color, `}\n`); fi; if ap <> `` then ap := cat(` appearance { `, ap, `}`) fi; RETURN(ap); end: [`writeoogl`, `gvplot`]; geomview-1.9.4/src/bin/geomutil/maple2oogl/gvplot.mapleV40000644000175000001440000006444410462161603020271 00000000000000########################## ## ## Title : writeoogl, a package for converting maple PLOT3D ## objects to Geomview data objects. ## gvplot, interactive pipe to Geomview from Maple ## ## Created : Dec 5 1993 ## ## Authors : Frederick Wicklin and ## Stuart Levy ## The Geometry Center ## ## Documentation : currently ?gvplot or ?writeoogl or ?geomview ## ## History ## fjw 9/21/93 initial maple->geomview for Maple VR2 ## slevy 11/27/93 interactive geomview pipe; ## backwards compatable to Maple V ## fjw 11/29/93 debugging; added color options ## ## lr (renggli@math.fsu.edu) 03/28/97 ## modifications for Maple VR4 (replaced gc() calls) ## ## ## Usage: readlib(gvplot); ## (optional) gvcommand := `geomview initial-options ...`; ## (optional) gvdirectories := `/some/dir/ectory:/other/dir...`; ## 3dplot_struct := plot3d( ... ): ## writeoogl(`filename`, 3dplot_struct); ## gvplot(3dplot_struct); # To search for "geomview" and "togeomview" in directories which might not # be on the default UNIX search path, list those director(ies) here, as in # default_gvdirectories := `/u/geom/bin:/usr/local/bin:` # or, set the "gvdirectories" variable before invoking gvplot(). default_gvdirectories := ``: # To start geomview with non-default options, or to start another program # via gvplot, put its name and initial arguments here in place of `geomview`, # or set the variable "gvcommand" before invoking gvplot(). # Changing default_gvcommand, then resaving gvplot.m, alters the default for # all users; setting the gvcommand variable changes it for just your session. default_gvcommand := `geomview`: ### Upon invoking the geomview package, maple creates a global ### variable UsEr_ID__ which is assigned a "random" number. ### This variable is used to create user-specific files in /tmp. ################################################################## # There doesn't seem to be any explicit test for Maple V1 vs. V2, # but all V1 plot objects seem to begin with FUNCTION, so use that fact # to detect that we must be careful not to print invalid float constants. ################################################################## `oogl/lprn` := `oogl/lprnV2`: writeoogl := proc() global `oogl/lprn`; local header, item, ps, zlist, plist, llist, ppoint, pcolor, appear, i, j, totl, xrange, yrange, nx, ny, savedprintbytes, coloron,colorlist,ccnt, totalverts; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; if nargs > 2 or nargs = 0 then ERROR(`Usage:writeoogl(``filename``,3dplot_struct); OR writeoogl(3dplot_struct);`) fi; ps := args[nargs]; if not type(ps, PLOT3D) then ERROR(`Invalid plot structure`,ps, `; must be of type PLOT3D, as from plot3d(), tubeplot(), spacecurve(), etc.`) fi; if nargs = 2 and not type(args[1], string) then ERROR(`Invalid file name (not string)`, args[1]) fi; if nops(ps) < 1 then ERROR(`Empty 3D plot structure!`) fi; ################################################################## # When run in command-line mode, Garbage Collection (GC) # # messages printed to terminal can interfere with the data flow. # # Therefore suppress GC during writing of GeomView data # ################################################################## if nargs = 2 then savedprintbytes:=kernelopts( printbytes): kernelopts( printbytes=false): print(`Saving Maple 3D structs to Geomview file`, args[1]); writeto(args[1]); fi; xrange := 'xrange'; # nullify this local variable appear := find_appearance(1, ps); lprint( appear, `{LIST` ); ################################################################## ### BEGIN main loop over all 3D plots (may be a list of plots) ### ################################################################## for item in ps do coloron := FALSE; # default is no color info header := op(0,item); if header = FUNCTION then # Maple V1 only: FUNCTION( f(x,y), xrange, yrange ) # or FUNCTION( x(u,v), y(u,v), z(u,v), u = u0..u1, v = v0..v1 ) xrange := op(nops(item)-1, item); if type(xrange, `=`) then xrange := op(2, xrange) fi; yrange := op(nops(item), item); if type(yrange, `=`) then yrange := op(2, yrange) fi; # Maple V1 -- don't trust lprint() `oogl/lprn` := `oogl/lprnV1`; ########################### GRID ############################ # EX: plot3d( f(x,y), x=xmin..xmax, y=ymin..ymax] # Saving Maple GRID struct to geomview ZMESH struct # Maple V1: FUNCTION( f(x,y), xrange,yrange ) followed by GRID( zlist ) # In Maple V1, we might see either ZMESH-style data (only Z per vertex) # or a full 3-D mesh (x,y,z per vertex). Just check the first # vertex to see. # Maple V2: GRID( xrange, yrange, zlist ) # Maple V2 uses GRID only for ZMESH-style data, # and uses a MESH header for meshes with general 3-D verts. ############################################################### elif header = GRID then if type(xrange, `..`) then zlist := item else # this is typical VR2 route xrange := op(1, item); yrange := op(2, item); zlist := op(3, item); ####################################################### # if color, then there are 4 possibilities: # colorlist = COLOR(HUE, h[1],...,h[nops[colorlist]) # colorlist = COLOR(HUE, h) # colorlist = COLOR(RGB, r[1],g[1],b[1],...) # colorlist = COLOR(RGB, r,g,b) # Convert HUES to an RGB value using HSV2RGB and # (assume that Maple uses s=v=1). Add a 1 at the end of # the list for geomview's "alpha": 0<=>transparent, 1<=>opaque ####################################################### if( nops(item)>3 ) then colorlist := find_colorlist(4, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; fi; nx := nops(zlist); ny := nops(op(1,zlist)); if type(op(1, op(1,zlist)), list) then lprint(`{ { MESH`, ny, nx) else # scale this data by wrapping it in transformation matrix lprint(`{ INST transform { `); `oogl/lprn`( [0, (op(2,yrange)-op(1,yrange)) / (ny-1), 0, 0] ); `oogl/lprn`( [(op(2,xrange)-op(1,xrange)) / (nx-1), 0, 0, 0] ); lprint(0, 0, 1, 0); `oogl/lprn`( [op(1,xrange), op(1,yrange), 0, 1] ); if(coloron = FALSE) then lprint(` } geom { ZMESH`, ny, nx); # gv type else lprint(` } geom { CZMESH`, ny, nx); # color gv type fi; fi; ccnt := 2; # set color counter to 2 for plist in zlist do for ppoint in plist do `oogl/lprn`(ppoint); if (coloron = HUE) and nops(colorlist)>2 then lprint(HSV2RGB(op(ccnt,colorlist), 1,1), 1); ccnt := ccnt + 1; elif (coloron = HUE) and nops(colorlist)=2 then lprint(HSV2RGB(op(2,colorlist), 1,1), 1); elif (coloron = RGB) and nops(colorlist)>4 then lprint(op(ccnt,colorlist),op(ccnt+1,colorlist),op(ccnt+2,colorlist),1); ccnt := ccnt + 3; elif (coloron = RGB) and nops(colorlist)=4 then lprint(op(2,colorlist),op(3,colorlist),op(4,colorlist), 1); fi; od; od; lprint( `} }`); ########################### MESH ########################### # EX: plot3d( [x(s,t), y(s,t), z(s,t)], s=smin..smax, t=tmin..tmax] # Saving Maple MESH struct to geomview MESH struct ############################################################### elif header = MESH then llist := op(1, item): if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; if(coloron=FALSE) then lprint(`{ MESH ` ); # gv type else lprint(`{ CMESH ` ); # color gv type fi; lprint( nops(llist)); # num x elements lprint( nops(op(1,llist)) ); # num y elements # Maple store points in row-dominant manner # But geomview want column-dominant, so need to # print out the transpose of the matrix in the plot3d struct nx := nops(llist); # maple rows ny := nops(op(1,llist)); # maple cols for j from 1 to ny do for i from 1 to nx do ppoint := op(j, op(i,llist)); `oogl/lprn`(ppoint); if (coloron = HUE) and nops(colorlist)>2 then lprint(HSV2RGB(op((i-1)*ny+j +1,colorlist), 1,1), 1); elif (coloron = HUE) and nops(colorlist)=2 then lprint(HSV2RGB(op(2,colorlist), 1,1), 1); elif (coloron = RGB) and nops(colorlist)>4 then lprint(op(3*((i-1)*ny+j-1)+2,colorlist),op(3*((i-1)*ny+j-1)+3,colorlist),op(3*((i-1)*ny+j-1)+4,colorlist),1); elif (coloron = RGB) and nops(colorlist)=4 then lprint(op(2,colorlist),op(3,colorlist),op(4,colorlist), 1); fi; od; od; lprint( `}`); ########################### CURVES ########################## # EX: spacecurve( [x(t), y(t), z(t)], t=tmin..tmax] # Saving Maple CURVES struct to geomview VECT struct ############################################################### elif header = CURVES then llist := select(type, item, list); if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; lprint(`{ VECT `); # gv type # Number of polylines, total vertices. totalverts := sum('nops(op(i,llist))', 'i'=1..nops(llist)); lprint(nops(llist), totalverts); if coloron=FALSE then lprint(1); # One color in all lprint(seq(nops(op(i,llist)), i=1..nops(llist))); # Vertex counts lprint(1, 0 $ 'i'=2..nops(llist)); # Color counts. else lprint(totalverts); # Total number of colors, 1 per vert lprint(seq(nops(op(i,llist)), i=1..nops(llist))); # Vertex counts lprint(seq(nops(op(i,llist)), i=1..nops(llist))); # color per vert fi; for plist in llist do for ppoint in plist do # print all vertices `oogl/lprn`(ppoint); od od; if coloron=FALSE then lprint(1,1,1,1); # color RGBA = white and opaque elif (coloron = HUE) and nops(colorlist)>2 then for ccnt from 2 to nops(colorlist) do lprint(HSV2RGB(op(ccnt,colorlist), 1,1), 1); od; elif (coloron = HUE) and nops(colorlist)=2 then for ccnt from 1 to nops(llist) do lprint(HSV2RGB(op(2,colorlist), 1,1), 1); od; elif (coloron = RGB) and nops(colorlist)>4 then for ccnt from 2 by 3 to nops(colorlist) do lprint(op(ccnt,colorlist),op(ccnt+1,colorlist),op(ccnt+2,color\list),1); od; elif (coloron = RGB) and nops(colorlist)=4 then for ccnt from 1 to nops(llist) do lprint(op(2,colorlist),op(3,colorlist),op(4,colorlist),1); od; fi; lprint( `}`); ######################### POLYGONS ########################## #EX:polygonplot3d([seq([seq([x(s,t),y(s,t),z(s,t)],s=smin..smax],tmin..tmax])): # Polygons are handled differently than the other objects w/r/t # color. Leave color alone and let user change color using geomview. ############################################################### elif header = POLYGONS then pcolor := i $ i=1..0; # Empty sequence totl := 0: nx := 0: # use nx to count number of polygons for llist in item do # sequence of lists POLY(),COLOR(), if type(llist,list) then nx := nx + 1; # number of polygons totl := totl + nops(llist); # compute total number of vertices fi od; lprint(find_appearance(1, item)); # if coloron=FALSE then lprint(`{ OFF `); # gv type # else # lprint(`{ COFF `); # color # fi; lprint(totl, nx, 0); # total verts,polygons,"edges"(not used!) for llist in item do if type(llist,list) then for ppoint in llist do `oogl/lprn`(ppoint); # List of vertices od; fi; od; lprint(``); totl := 0; for llist in item do if type(llist,function) and (op(0,llist)=COLOR or op(0,llist)=COLOUR) then colorlist := llist; if op(1,llist)=HUE and nops(colorlist)=2 then pcolor := HSV2RGB(op(2,colorlist),1,1); # use ppoint for RGB elif op(1,llist)=RGB and nops(colorlist)=4 then pcolor := op(2..4,colorlist); fi; elif type(llist,list) then ## There are only two possibilities for POLYGONS ## ## In both cases, it means entire polygon is same color ## lprint( nops(llist), i $ i=totl..totl+nops(llist)-1, ` `, pcolor); totl := totl + nops(llist); fi; od; lprint( `}`); ######################### POINTS ########################## #EX:PLOT3D(POINTS([0,0,1],[1,0,0],[0,1,0])); ############################################################### elif header = POINTS then lprint(`{ VECT`, nops(item), nops(item), 0); for plist in item do lprint(`1`) od; lprint(``); for plist in item do lprint(`0`) od; lprint(``); for ppoint in item do `oogl/lprn`(ppoint) od; lprint(`}`); ########################### TEXT ############################ # 3D plots using the "plots" package may include TEXT # This is not supported ############################################################### elif header = TEXT then print(` `); fi; od; # END main for loop lprint( `}`); if nargs = 2 then writeto(terminal); kernelopts( printbytes=savedprintbytes): fi; NULL; end: gvplot := proc() global UsEr_ID__, gvcommand, default_gvcommand, gvdirectories, default_gvdirectories; local gvname, gvcmd, gvdirs, ps, savedprintbytes, tmp_fname; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; ### Set up filename to use as temporary site for data. ### ### Take file in /tmp and postfix number which is (hopefully) ### ### independent of users. Eg, if user1 and user2 are both ### ### using writeoogl, then they will be writing to different ### ### files. This is UNIX specific (but so is Geomview). ### if UsEr_ID__ = 'UsEr_ID__' then UsEr_ID__ := (round( rand() * (time()+1) ) mod 9999) + 1; fi; tmp_fname := `Maple`.(UsEr_ID__); ### Let user specify, via "gvcommand" and "gvdirectories" global vars, ### which program/args to run when invoking geomview, ### and how to set the search path to find it and togeomview. if gvcommand <> 'gvcommand' then gvcmd := gvcommand else gvcmd := default_gvcommand fi; if gvdirectories <> 'gvdirectories' then gvdirs := gvdirectories else gvdirs := default_gvdirectories fi; ps := args[nargs]; gvname := `Maple`; if nargs < 1 or nargs > 2 then ERROR(`Usage: gvplot(3dplot_structure) -or- gvplot(``name``, 3dplot_structure)`); fi; if nargs > 1 then gvname := args[1] fi; if not type( ps, PLOT3D) then ERROR(`Invalid plot structure`,ps, `; must be of type PLOT3D, as from plot3d(), tubeplot(), spacecurve(), etc.`) fi; # start geomview reading from stdin if system( `PATH=` . gvdirs . `:$PATH togeomview -Mcp `.tmp_fname.` `.gvcmd.` 0 then ERROR(`gvplot: togeomview: Can't start a copy of geomview. `. `If "togeomview" or "geomview" were not found `. `try setting the variable "gvdirectories" to the name of the directory where `. `they're installed (or to a colon-separated list of directories).`); fi; savedprintbytes:=kernelopts( printbytes): kernelopts( printbytes=false): writeto(`/tmp/geomview/`.tmp_fname); lprint(`(geometry`, gvname); writeoogl( ps ); lprint(`)`); writeto(terminal); kernelopts( printbytes=savedprintbytes): NULL; end: gvcommand := proc() global UsEr_ID__, gvcommand, default_gvcommand, gvdirectories, default_gvdirectories; local gvname, gvcmd, gvdirs, ps, savedprintbytes, tmp_fname; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; ### Set up filename to use as temporary site for data. ### ### Take file in /tmp and postfix number which is (hopefully) ### ### independent of users. Eg, if user1 and user2 are both ### ### using writeoogl, then they will be writing to different ### ### files. This is UNIX specific (but so is Geomview). ### if UsEr_ID__ = 'UsEr_ID__' then UsEr_ID__ := (round( rand() * (time()+1) ) mod 9999) + 1; fi; tmp_fname := `Maple`.(UsEr_ID__); ### Let user specify, via "gvcommand" and "gvdirectories" global vars, ### which program/args to run when invoking geomview, ### and how to set the search path to find it and togeomview. if gvcommand <> 'gvcommand' then gvcmd := gvcommand else gvcmd := default_gvcommand fi; if gvdirectories <> 'gvdirectories' then gvdirs := gvdirectories else gvdirs := default_gvdirectories fi; # start geomview reading from stdin if system( `PATH=` . gvdirs . `:$PATH togeomview -Mcp `.tmp_fname.` `.gvcmd.` 0 then ERROR(`gvplot: togeomview: Can't start a copy of geomview. `. `If "togeomview" or "geomview" were not found `. `try setting the variable "gvdirectories" to the name of the directory where `. `they're installed (or to a colon-separated list of directories).`); fi; savedprintbytes:=kernelopts( printbytes): kernelopts( printbytes=false): writeto(`/tmp/geomview/`.tmp_fname); lprint(args); writeto(terminal); kernelopts( printbytes=savedprintbytes): NULL; end: # possible gvplot enhancements: # allow remote display? # Maybe use a two-step Rube Goldberg hookup with an external converter # that directly reads lprint() format. Likely to be faster for large objects. # Then gvplot would read # gvplot := proc() # ... # if system(`togeomview -Mcp Maple.raw maple2oogl -togeomview -Mcp Maple`)<>0 # then ERROR(...) fi; # writeto(`/tmp/geomview/Maple.raw`); # lprint(`(geometry`, gvname, `<<`); # lprint(3dplot_struct); # lprint(`>>)`); # writeto(terminal); # end: # and writeoogl would read # writeoogl := proc() # ... # if system(cat(`togeomview -Mcp Maple.rawdata maple2oogl -o `, fname)) <> 0 # then ERROR(...) fi; # writeto(`/tmp/geomview/Maple.rawdata`); # lprint(`<<', 3dplot_string, `>>'); # writeto(terminal); # end: # # Here 'togeomview' is actually being used to start 'maple2oogl' rather # than geomview itself. In the first case, maple2oogl -togeomview would # invoke code to start a copy of geomview. # Help information for writeoogl `help/text/writeoogl` := TEXT( ` `, `HELP FOR: writeoogl, gvplot `, ` `, `CALLING SEQUENCE: `, ` readlib(gvplot): `, ` writeoogl( ``filename``, 3dplot_struct ); `, ` writeoogl( 3dplot_struct ); `, ` gvplot( 3dplot_struct ); `, ` gvplot( ``geomview_name``, 3dplot_struct ) `, ` `, `PARAMETERS: `, ` filename the file which will contain the Geomview data `, ` 3dplot_struct a Maple PLOT3D data structure `, ` geomview_name name of the object in the Geomview browser `, ` `, `SYNOPSIS: `, ` writeoogl() accepts Maple PLOT3D structures and writes files `, ` readable by Geomview. gvplot() converts Maple PLOT3D structures`, ` and displays them immediately using Geomview, starting a copy of`, ` Geomview if necessary.`, ``, ` Supported data types include the Maple structures MESH, GRID, `, ` CURVES, POINTS, and POLYGONS. `, ` See ?plot3d[structure] for more information on Maple PLOT3D types.`, ` `, ` The Maple MESH and GRID structures are translated into Geomview's`, ` MESH and ZMESH objects, respectively, Maple CURVES and POINTS`, ` become VECT objects, and Maple POLYGONS becomes an OFF object.`, ` `, ` The Maple TEXT structure is not supported. Color information is`, ` supported for all objects.`, ``, ` The form writeoogl(filename, plot_struct) writes data in OOGL`, ` (Geomview) form to the given file; writeoogl(plot) writes to the`, ` current output stream as selected by writeto().`, ``, ` gvplot() normally starts the program "geomview", with no options;`, ` to specify something else, set the variable "gvcommand", as in:`, ` gvcommand := ``/usr/local/bin/gv -wpos 200x200 -c startup.gv``;`, ` before invoking gvplot(). Also, if the programs "geomview" or`, ` "togeomview" are not on your UNIX search path, set the variable`, ` gvdirectories := ``/some/dir/ectory:/some/other/directory``;`, ` to the appropriate directory (or directories separated by colons).`, ` `, `EXAMPLES: `, ` readlib(gvplot): `, ` my_plot := plot3d(sin(x+y), x=-Pi..Pi, y=-Pi..Pi): `, ` writeoogl( ``sinxy.mesh``, my_plot ); `, ` Saving Maple 3D structs to Geomview file, sinxy.mesh `, ` steiner := plot3d([ sin(2*x)*(cos(y))^2, sin(x)*sin(2*y), `, ` cos(x)*sin(2*y)], x=-Pi..Pi, y=-Pi..Pi): `, ` writeoogl( ``steiner.mesh``, steiner); `, ` Saving Maple 3D structs to Geomview file, steiner.mesh`, ` # Display it in geomview directly `, ` gvplot( steiner ); `, ` # load in the plots package `, ` with(plots): `, ` trefoil := spacecurve([ -2*cos(t)- 1/2*cos(5*t)+ 3*sin(2*t), `, ` -3*cos(2*t)+ 2*sin(t)- 1/2*sin(5*t), 2*cos(3*t), t=0..2*Pi]):`, ` writeoogl( ``trefoil.vect``, trefoil); `, ` Saving Maple 3D structs to Geomview file, trefoil.vect`, ` tetrahedra := [[1,0,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,0,1],[0,1,0]], `, ` [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,0]]:`, ` Tplot :=polygonplot3d([tetrahedra]): `, ` writeoogl( ``tetrahedra.off``, Tplot); `, ` Saving Maple 3D structs to Geomview file, tetrahedra.off`, ` # you can even create a single file with multiple objects `, ` all_objs := display3d( {my_plot, steiner, trefoil, Tplot} ): `, ` writeoogl( ``all.list``, all_objs ); `, ` Saving Maple 3D structs to Geomview file, all.list `, ` `, `SEE ALSO: plot3d[structure] ` ): `help/text/gvplot` := `help/text/writeoogl`: `help/text/geomview` := `help/text/writeoogl`: # Convert number to string, avoiding excess digits and avoiding Maple V1's # propensity to emit Float(mantissa,exponent) rather than ordinary exponential # notation! `oogl/cvs` := proc(v) local sign, absmant; options `Copyright 1993 by Stuart Levy, Geometry Center`; if type(v, float) then absmant := cat(abs(op(1,v))); sign := substring(`-`, 1..1-signum(v)); if abs(v) >= 1 then if(op(2,v) >= 0) then cat(op(1,v), '0' $ op(2,v)) else cat( sign, substring(absmant, 1..length(absmant)+op(2,v)), `.`, substring(absmant, length(absmant)+op(2,v)+1..8) ) fi elif abs(v) > .000001 then cat( sign, substring( `.0000000`, 1 .. 1-length(absmant)-op(2,v) ), substring(absmant, 1..7) ) else cat( sign, `.`, substring( absmant, 1..7), `e`, op(2,v) + length(absmant) ) fi elif type(v, realcons) then cat(v) fi; end: # # lprint a number, or a list of numbers. # `oogl/lprnV1` := proc (v) local i; options `Copyright 1993 by Stuart Levy, Geometry Center`; if type(v, list) then lprint( ' `oogl/cvs`(v[i]) ' $ i=1..nops(v) ); elif type(v,float) and abs(v) <= .1 then lprint(`oogl/cvs`(v)); elif type(v, realcons) then lprint(v); else lprint(`0 #`); fi; end: # Ditto, but assume we're Maple V2, which prints floating constants # in acceptable form. Don't bother to reformat them. `oogl/lprnV2` := proc(v) local i; options `Copyright 1993 by Stuart Levy, Geometry Center`; if type(v, list) then lprint( 'v[i]' $ i = 1..nops(v) ); # Print on one line elif type(v, realcons) then lprint(v); else lprint(`0 #`); fi end: ############################################################### ## HSV2RGB converts Maple Hues to RGB colors. ## The HUEs used are in [0,1] so assume that S=V=1 (this is close) ## The following algorithm is from Computer Graphics ## By Foley, vanDam, Feiner, Hughes, 2nd Ed. Addison-Wesley ## p 593 ## ## Adapted by fjw 11/29/93 ## Input: (h,s,v) in [0,1]^3 ## Output: sequence r,b,g each in [0,1] ############################################################### HSV2RGB := proc( h,s,v ) local hh,ip,fp,p,q,t; options `Copyright 1990 by Foley, vanDam, Feiner, Hughes`; if (s = 0) then # color on B/W center line if (h<0) then # There is no hue,ie, hue undefined RETURN( v,v,v ); else ERROR(`Undefined color`); fi; else if (h>1) then hh:=1 fi; hh := 6*h; # hh now in [0,6] ip := floor(hh); # ip is integer part of h fp := hh - ip; # fp is fractional part of h p := v*(1-s); q := v*(1-(s*fp)); t := v*(1-(s*(1-fp))); if (ip=0) then RETURN( v,t,p ); elif (ip=1) then RETURN( q,v,p ); elif (ip=2) then RETURN( p,v,t ); elif (ip=3) then RETURN( p,q,v ); elif (ip=4) then RETURN( t,p,v ); else RETURN( v,p,q ); fi; fi; end: ######################################################## # find_colorlist # input: n where to start looking for color data # item what list to search # output: list of color information or NULL list ######################################################## find_colorlist := proc(n,item) local i; options `Copyright 1993 by Frederick Wicklin, Geometry Center`; for i from n to nops(item) do if type(op(i,item),function) and (op(0,op(i,item))=COLOR or op(0,op(i,item))=COLOUR) then RETURN(op(i,item)) fi; od; RETURN([FALSE]); # no color info found end: ######################################################## # find_appearance # input: n index to start seeking color data # list list to search # output: argument of STYLE option (e.g. `PATCH`) or [] list. ######################################################## find_appearance := proc(n, list) local i, part, ap, color, colortype; ap := ``; color := ``; for i from n to nops(list) do part := op(i,list); if type(part,function) and (op(0,part)=COLOR or op(0,part)=COLOUR) then colortype := op(1,part); if colortype = HUE and nops(part) = 2 then color := [HSV2RGB(op(2,part), 1, 1)] elif colortype = RGB and nops(part) = 4 then color := [op(2..4,part)] fi # Otherwise, this "color" tag isn't for us elif type(part,function) and op(0,part) = STYLE then if op(1,part) = PATCH then ap := cat(ap, ` +face -edge`) elif op(1,part) = LINE or op(1,part) = WIREFRAME then ap := cat(ap, ` -face +edge`) fi elif type(part,function) and op(0,part) = THICKNESS and type(op(1,part),integer) then ap := cat(ap, ` linewidth `, op(1,part)); fi od; if color <> `` then color := cat( op(1..3, map(v -> cat(convert(v,string),` `), color) ) ); ap := cat(ap, `\n material { edgecolor `, color, `\n diffuse `, color, `}\n`); fi; if ap <> `` then ap := cat(` appearance { `, ap, `}`) fi; RETURN(ap); end: [`writeoogl`, `gvplot`]; geomview-1.9.4/src/bin/geomutil/maple2oogl/gvplot.mapleV80000644000175000001440000007227010577534642020307 00000000000000########################### Hey, Emacs, we're -*-maplev-*- mode! ## ## Title : writeoogl, a package for converting maple PLOT3D ## objects to Geomview data objects. ## gvplot, interactive pipe to Geomview from Maple ## ## Created : Dec 5 1993 ## ## Authors : Frederick Wicklin and ## Stuart Levy ## The Geometry Center ## ## Revised : 2003 ## Claus-Justus Heine, Abteilung fuer Angewandte Mathematik, ## Universitaet Freiburg. ## ## ## Documentation : currently ?gvplot or ?writeoogl or ?geomview ## ## History ## fjw 9/21/93 initial maple->geomview for Maple VR2 ## slevy 11/27/93 interactive geomview pipe; ## backwards compatable to Maple V ## fjw 11/29/93 debugging; added color options ## ## lr (renggli@math.fsu.edu) 03/28/97 ## modifications for Maple VR4 (replaced gc() calls) ## ## ## Usage: readlib(gvplot); ## (optional) gvcommand := `geomview initial-options ...`; ## (optional) gvdirectories := `/some/dir/ectory:/other/dir...`; ## 3dplot_struct := plot3d( ... ): ## writeoogl(`filename`, 3dplot_struct); ## gvplot(3dplot_struct); geomview := module() option `Copyright (C) 2003 by Claus-Justus Heine, Department for Applied Mathematics, Freiburg University. Heavily based on gvplot, Copyright (C) 1993 by Frederick Wicklin and Stuart Levy, Geometry Center.`; description `Geomview interface for MapleV8`; export gvdirectories, gvcommand, fwriteoogl, writeoogl, gvplot, gvsendcmd; local default_gvdirectories, default_gvcommand, `oogl/lprn`, HSV2RGB, find_colorlist, find_appearance, make_tmpname, print_colorlist, find_view, make_localtmpname; global `gvplot/User_ID`; # To search for "geomview" and "togeomview" in directories which might not # be on the default UNIX search path, list those director(ies) here, as in # default_gvdirectories := `/u/geom/bin:/usr/local/bin:` # or, set the "gvdirectories" variable before invoking gvplot(). default_gvdirectories := ``: # To start geomview with non-default options, or to start another program # via gvplot, put its name and initial arguments here in place of `geomview`, # or set the variable "gvcommand" before invoking gvplot(). # Changing default_gvcommand, then resaving gvplot.m, alters the default for # all users; setting the gvcommand variable changes it for just your session. default_gvcommand := `geomview`: ### Set up filename to use as temporary site for data. ### ### Take file in /tmp and postfix number which is (hopefully) ### ### independent of users. Eg, if user1 and user2 are both ### ### using writeoogl, then they will be writing to different ### ### files. This is UNIX specific (but so is Geomview). ### make_tmpname := proc() local tmp_fname; if `gvplot/User_ID` = '`gvplot/User_ID`' then `gvplot/User_ID` := (round( rand() * (time()+1) ) mod 9999) + 1; fi; tmp_fname := `Maple`||(`gvplot/User_ID`); return(tmp_fname); end; make_localtmpname := proc() local tmp_fname, id; id := (round( rand() * (time()+1) ) mod 9999) + 1; tmp_fname := `/tmp/`||`Maple`||`id`; return(tmp_fname); end; ### Upon invoking the geomview package, maple creates a global ### variable `gvplot/User_ID` which is assigned a "random" number. ### This variable is used to create user-specific files in /tmp. ################################################################## # There doesn't seem to be any explicit test for Maple V1 vs. V2, # but all V1 plot objects seem to begin with FUNCTION, so use that fact # to detect that we must be careful not to print invalid float constants. ################################################################## writeoogl := proc() option `Copyright (C) 2003 by Claus-Justus Heine, Department for Applied Mathematics, Freiburg University. All rights reserved.`; description `convert a MapleV8 PLOT3d() structure to OOGL`; local outfd, ps; if nargs > 2 or nargs = 0 then ERROR(`Usage:writeoogl(``filename``,3dplot_struct); OR writeoogl(3dplot_struct);`) fi; if nargs = 2 and not type(args[1], string) then ERROR(`Invalid file name (not string)`, args[1]) fi; if nargs = 2 then print(`Saving Maple 3D structs to Geomview file`, args[1]); outfd:=fopen(args[1],`WRITE`,`BINARY`); else outfd:=`default`; fi; ps := args[nargs]; try fwriteoogl(outfd, ps); finally if outfd <> `default` then fclose(outfd); fi; end try; end; # writeoogl fwriteoogl := proc() local header, item, zlist, plist, llist, ppoint, pcolor, appear, i, j, totl, xrange, yrange, nx, ny, savedprintbytes, coloron, colorlist, totalverts, tlist, npoints, view, haveview, clipcmd, clipfd, clipfname, ccnt, outfd, ps; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; if nargs <> 2 then ERROR(`Usage:fwriteoogl(file_descriptor,3dplot_struct);`) fi; outfd := args[1]; ps := args[2]; if not op(0, ps) = PLOT3D then ERROR(`Invalid plot structure`,ps, `; must be of type PLOT3D, as from plot3d(), tubeplot(), spacecurve(), etc.`) fi; if nops(ps) < 1 then ERROR(`Empty 3D plot structure!`) fi; xrange := 'xrange'; # nullify this local variable # # Some things we need to know beforehand. # appear := find_appearance(1, ps); colorlist := find_colorlist(1, ps); coloron := op(1,colorlist); view := find_view(1, ps); haveview := op(1,view); # # possibly pipe the stuff to clip(1) # if haveview <> FALSE then clipfname:=make_localtmpname(); clipfd :=outfd; outfd :=fopen(clipfname,WRITE,BINARY); fi; fprintf(outfd, "{ %s", appear); fprintf(outfd, "LIST"); ################################################################## ### BEGIN main loop over all 3D plots (may be a list of plots) ### ################################################################## for item in ps do header := op(0,item); if header = GRID then if type(xrange, `..`) then zlist := item else # this is typical VR2 route xrange := op(1, item); yrange := op(2, item); zlist := op(3, item); ####################################################### if( nops(item)>3 ) then colorlist := find_colorlist(4, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; fi; nx := op(2,[ArrayDims(zlist)][1]); # num x elements ny := op(2,[ArrayDims(zlist)][1]);# num y elements fprintf(outfd, "{ INST transform { \n"); `oogl/lprn`(outfd, [0, (op(2,yrange)-op(1,yrange)) / (ny-1), 0, 0], "\n" ); `oogl/lprn`(outfd, [(op(2,xrange)-op(1,xrange)) / (nx-1), 0, 0, 0], "\n" ); fprintf(outfd, "0 0 1 0\n"); `oogl/lprn`(outfd, [op(1,xrange), op(1,yrange), 0, 1],"\n" ); if(coloron = FALSE) then fprintf(outfd, " } geom { ZMESH %d %d\n", ny, nx); # gv type else fprintf(outfd, " } geom { CZMESH %d %d\n", ny, nx); # color gv type fi; for j from 1 to ny do for i from 1 to nx do ppoint := zlist[j][i]; `oogl/lprn`(outfd, ppoint,"\n"); print_colorlist(outfd, coloron, colorlist); od; od; fprintf(outfd, "} }\n"); ########################### MESH ########################### # EX: plot3d( [x(s,t), y(s,t), z(s,t)], s=smin..smax, t=tmin..tmax] # Saving Maple MESH struct to geomview MESH struct ############################################################### elif header = MESH then llist := op(1, item): if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; if(coloron=FALSE) then fprintf(outfd, "{ MESH \n" ); # gv type else fprintf(outfd, "{ CMESH \n" ); # color gv type fi; if op(0,llist) = Array then nx := op(2,[ArrayDims(llist)][1]); # num x elements ny := op(2,[ArrayDims(llist)][1]);# num y elements else nx := nops(llist); # maple rows ny := nops(op(1,llist)); # maple cols fi; fprintf(outfd, "%d\n", nx ); # num x elements fprintf(outfd, "%d\n", ny ); # num y elements # Maple store points in row-dominant manner # But geomview want column-dominant, so need to # print out the transpose of the matrix in the plot3d struct for j from 1 to ny do for i from 1 to nx do ppoint := llist[j][i]; `oogl/lprn`(outfd,ppoint,"\n"); print_colorlist(outfd, coloron, colorlist); od; od; fprintf(outfd, " }\n"); ########################### CURVES ########################## # EX: spacecurve( [x(t), y(t), z(t)], t=tmin..tmax] # Saving Maple CURVES struct to geomview VECT struct ############################################################### elif header = CURVES then llist := select(type, item, list); if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; fprintf(outfd, "{ VECT \n"); # gv type # Number of polylines, total vertices. totalverts := sum('nops(op(i,llist))', 'i'=1..nops(llist)); fprintf(outfd, "%d %d ", nops(llist), totalverts); if coloron=FALSE then fprintf(outfd, "1\n"); # One color in all `oogl/lprn`(outfd,[seq(nops(op(i,llist)), i=1..nops(llist))],"\n"); # Vertex counts `oogl/lprn`(outfd,[1, seq(0, i=2..nops(llist))],"\n"); # Color counts. else fprintf(outfd, "%d\n", nops(llist));# Total number of colors, 1 per polyline `oogl/lprn`(outfd,[seq(nops(op(i,llist)), i=1..nops(llist))],"\n"); # Vertex counts `oogl/lprn`(outfd,[seq(1, i=1..nops(llist))],"\n"); # Color counts. fi; for plist in llist do for ppoint in plist do # print all vertices `oogl/lprn`(outfd,ppoint,"\n"); od od; if coloron=FALSE then fprintf(outfd, "1 1 1 1\n"); # color RGBA = white and opaque else for ccnt from 1 to nops(llist) do print_colorlist(outfd, coloron, colorlist); od; fi; fprintf(outfd, " }\n"); ######################### POLYGONS ########################## #EX:polygonplot3d([seq([seq([x(s,t),y(s,t),z(s,t)],s=smin..smax],tmin..tmax])): # Polygons are handled differently than the other objects w/r/t # color. Leave color alone and let user change color using geomview. ############################################################### elif header = POLYGONS then # coloron:=FALSE; pcolor := i $ i=1..0; # Empty sequence totl := 0: nx := 0: # use nx to count number of polygons if( nops(item)>1 ) then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fi; for llist in item do # sequence of lists POLY(),COLOR(), if type(llist,list) then nx := nx + 1; # number of polygons totl := totl + nops(llist); # compute total number of vertices fi od; fprintf(outfd, "%s\n", find_appearance(1, item)); fprintf(outfd, "{ OFF \n"); # gv type fprintf(outfd, "%d %d %d\n", totl, nx, 0); # total verts,polygons,"edges"(not used!) for llist in item do if type(llist,list) then for ppoint in llist do `oogl/lprn`(outfd,ppoint,"\n"); # List of vertices od; fi; od; fprintf(outfd, "\n"); totl := 0; for llist in item do if type(llist,list) then ## There are only two possibilities for POLYGONS ## ## In both cases, it means entire polygon is same color ## tlist:=[nops(llist), i $ i=totl..totl+nops(llist)-1]; `oogl/lprn`(outfd,tlist,""); print_colorlist(outfd, coloron, colorlist); if coloron=FALSE then fprintf(outfd, "\n"); fi; totl := totl + nops(llist); fi; od; fprintf(outfd, "}\n"); ######################### POINTS ########################## #EX:PLOT3D(POINTS([0,0,1],[1,0,0],[0,1,0])); ############################################################### elif header = POINTS then colorlist := find_colorlist(2, item); coloron := op(1,colorlist); # either RGB, HUE, or FALSE fprintf(outfd, "%s\n", find_appearance(2,item)); if coloron=FALSE then npoints := nops(item); fprintf(outfd, "{ VECT %d %d %d\n", npoints, npoints, 0); else npoints := nops(item) - 1; fprintf(outfd, "{ VECT %d %d %d\n", npoints, npoints, npoints); fi; fprintf(outfd, cat(seq("1\n", i=1..npoints))); fprintf(outfd, "\n"); if coloron=FALSE then fprintf(outfd, cat(seq("0\n", i=1..npoints))); else fprintf(outfd, cat(seq("1\n", i=1..npoints))); fi; fprintf(outfd, "\n"); for i from 1 to npoints do ppoint := op(i, item); `oogl/lprn`(outfd,ppoint,"\n"); od; if coloron<>FALSE then for i from 1 to npoints do print_colorlist(outfd, coloon, colorlist); od; fi; fprintf(outfd, "}\n"); ########################### TEXT ############################ # 3D plots using the "plots" package may include TEXT # This is not supported ############################################################### elif header = TEXT then fprintf(outfd, " "); fi; od; # END main for loop fprintf(outfd, "}\n"); if haveview <> FALSE then if nops(view) = 1 then clipcmd:=sprintf("clip -v 0,0,1 -g %e -l %e %s", view[1][1], view[1][2], clipfname); else clipcmd:=sprintf(cat("clip -v 1,0,0 -g %e -l %e %s |", "clip -v 0,1,0 -g %e -l %e |", "clip -v 0,0,1 -g %e -l %e"), view[1][1], view[1][2], clipfname, view[2][1], view[2][2], view[3][1], view[3][2]); fi; fclose(outfd); outfd:=clipfd; fprintf(outfd, op(2,ssystem(clipcmd))); fremove(clipfname); fi; NULL; end; gvplot := proc() local gvname, gvcmd, gvdirs, ps, tmp_fname, outfd; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; tmp_fname := make_tmpname(); ### Let user specify, via "gvcommand" and "gvdirectories" global vars, ### which program/args to run when invoking geomview, ### and how to set the search path to find it and togeomview. if gvcommand <> 'gvcommand' then gvcmd := gvcommand else gvcmd := default_gvcommand fi; if gvdirectories <> 'gvdirectories' then gvdirs := gvdirectories else gvdirs := default_gvdirectories fi; ps := args[nargs]; gvname := `Maple`; if nargs < 1 or nargs > 2 then ERROR(`Usage: gvplot(3dplot_structure) -or- gvplot(``name``, 3dplot_structure)`); fi; if nargs > 1 then gvname := args[1] fi; if not op(0, ps) = PLOT3D then ERROR(`Invalid plot structure`,ps, `; must be of type PLOT3D, as from plot3d(), tubeplot(), spacecurve(), etc.`) fi; # start geomview reading from stdin if system( `PATH=` || gvdirs || `:$PATH togeomview -cp `||tmp_fname||` `||gvcmd||` 0 then ERROR(`gvplot: togeomview: Can't start a copy of geomview. `|| `If "togeomview" or "geomview" were not found `|| `try setting the variable "gvdirectories" to the name of the directory where `|| `they're installed (or to a colon-separated list of directories).`); fi; outfd:=fopen(`/tmp/geomview/`||tmp_fname,WRITE,BINARY); try fprintf(outfd, "(geometry %s\n", gvname); fwriteoogl( outfd, ps ); fprintf(outfd, ")\n"); finally fclose(outfd); end try; NULL; end; gvsendcmd := proc() local gvname, gvcmd, gvdirs, ps, savedprintbytes, tmp_fname; options `Copyright 1993 by Frederick Wicklin and Stuart Levy, Geometry Center`; tmp_fname := make_tmpname(); ### Let user specify, via "gvcommand" and "gvdirectories" global vars, ### which program/args to run when invoking geomview, ### and how to set the search path to find it and togeomview. if gvcommand <> 'gvcommand' then gvcmd := gvcommand else gvcmd := default_gvcommand fi; if gvdirectories <> 'gvdirectories' then gvdirs := gvdirectories else gvdirs := default_gvdirectories fi; # start geomview reading from stdin if system( `PATH=` || gvdirs || `:$PATH togeomview -Mcp `||tmp_fname||` `||gvcmd||` 0 then ERROR(`gvplot: togeomview: Can't start a copy of geomview. `|| `If "togeomview" or "geomview" were not found `|| `try setting the variable "gvdirectories" to the name of the directory where `|| `they're installed (or to a colon-separated list of directories).`); fi; savedprintbytes:=kernelopts( printbytes): kernelopts( printbytes=false): writeto(`/tmp/geomview/`||tmp_fname); lprint(args); writeto(terminal); kernelopts( printbytes=savedprintbytes): NULL; end; # possible gvplot enhancements: # allow remote display? # Maybe use a two-step Rube Goldberg hookup with an external converter # that directly reads lprint() format. Likely to be faster for large objects. # Then gvplot would read # gvplot := proc() # ... # if system(`togeomview -Mcp Maple.raw maple2oogl -togeomview -Mcp Maple`)<>0 # then ERROR(...) fi; # writeto(`/tmp/geomview/Maple.raw`); # lprint(`(geometry`, gvname, `<<`); # lprint(3dplot_struct); # lprint(`>>)`); # writeto(terminal); # end; # and writeoogl would read # writeoogl := proc() # ... # if system(cat(`togeomview -Mcp Maple.rawdata maple2oogl -o `, fname)) <> 0 # then ERROR(...) fi; # writeto(`/tmp/geomview/Maple.rawdata`); # lprint(`<<', 3dplot_string, `>>'); # writeto(terminal); # end; # # Here 'togeomview' is actually being used to start 'maple2oogl' rather # than geomview itself. In the first case, maple2oogl -togeomview would # invoke code to start a copy of geomview. `oogl/lprn` := proc(outfd, v, terminator) local i, fmt, n; options `Copyright 2003 by Claus-Justus Heine`; if type(v, list) then fmt:=""; for i from 1 to nops(v) do if type(v[i],integer) then fmt:=cat(fmt, "%d "); elif type(v[i],realcons) then fmt:=cat(fmt, "%e "); fi; od; fprintf(outfd, cat(fmt, terminator), seq(v[i], i = 1..nops(v)) ); elif type(v, hfarray) then n := op(2, ArrayDims(v)); fmt:=cat(seq("%e ", i = 1 .. n)); fprintf(outfd, cat(fmt, terminator), seq(v[i], i = 1..n) ); elif type(v, realcons) then fprintf(outfd, cat("%e", terminator), v); else fprintf(outfd, "0 #\n"); fi end; ############################################################### ## HSV2RGB converts Maple Hues to RGB colors. ## The HUEs used are in [0,1] so assume that S=V=1 (this is close) ## The following algorithm is from Computer Graphics ## By Foley, vanDam, Feiner, Hughes, 2nd Ed. Addison-Wesley ## p 593 ## ## Adapted by fjw 11/29/93 ## Input: (h,s,v) in [0,1]^3 ## Output: sequence r,b,g each in [0,1] ############################################################### HSV2RGB := proc( h,s,v ) local hh,ip,fp,p,q,t; options `Copyright 1990 by Foley, vanDam, Feiner, Hughes`; if (s = 0) then # color on B/W center line if (h<0) then # There is no hue,ie, hue undefined return( v,v,v ); else ERROR(`Undefined color`); fi; else if (h>1) then hh:=1 fi; hh := 6*h; # hh now in [0,6] ip := floor(hh); # ip is integer part of h fp := hh - ip; # fp is fractional part of h p := v*(1-s); q := v*(1-(s*fp)); t := v*(1-(s*(1-fp))); if (ip=0) then return( v,t,p ); elif (ip=1) then return( q,v,p ); elif (ip=2) then return( p,v,t ); elif (ip=3) then return( p,q,v ); elif (ip=4) then return( t,p,v ); else return( v,p,q ); fi; fi; end; ######################################################## # find_colorlist # input: n where to start looking for color data # item what list to search # output: list of color information or NULL list ######################################################## find_colorlist := proc(n,item) local i; options `Copyright 1993 by Frederick Wicklin, Geometry Center`; for i from n to nops(item) do if type(op(i,item),function) and (op(0,op(i,item))=COLOR or op(0,op(i,item))=COLOUR) then return(op(i,item)) fi; od; return([FALSE]); # no color info found end; ######################################################## # find_view # input: n where to start looking for clipping data # item what list to search # output: clipping information in the form [[xmin,xmax],[...]] ######################################################## find_view := proc(n, item) option `Copyright (C) 2003 by Claus-Justus Heine, Department for Applied Mathematics, Freiburg University. All rights reserved.`; description `Find the viewport definition`; local i, j, clipping, view; for i from n to nops(item) do if type(op(i,item),function) and (op(0,op(i,item))=VIEW) then view:=op(i,item); clipping:=[seq([op(1,op(j,view)),op(2,op(j,view))],j = 1..nops(view))]; return clipping; fi; od; return([FALSE]); # no view info found end; # find_view find_view := proc(n,item) ######################################################## # find_appearance # input: n index to start seeking color data # list list to search # output: argument of STYLE option (e.g. `PATCH`) or [] list. ######################################################## find_appearance := proc(n, list) local i, part, ap, color, colortype; ap := ``; color := ``; for i from n to nops(list) do part := op(i,list); if type(part,function) and (op(0,part)=COLOR or op(0,part)=COLOUR) then colortype := op(1,part); if colortype = HUE then color := [HSV2RGB(op(2,part), 0.9, 1)] elif colortype = RGB then color := [op(2..4,part)] elif colortype = HSV then color := [HSV2RGB(op(2,colorlist), op(3,colorlist), op(4,colorlist))]; fi # Otherwise, this "color" tag isn't for us elif type(part,function) and op(0,part) = STYLE then if op(1,part) = PATCH then ap := cat(ap, ` +face -edge`) elif op(1,part) = LINE or op(1,part) = WIREFRAME then ap := cat(ap, ` -face +edge`) fi elif type(part,function) and op(0,part) = THICKNESS and type(op(1,part),integer) then ap := cat(ap, ` linewidth `, op(1,part)); elif type(part,function) and op(0,part) = SYMBOL then ap := cat(ap, ` linewidth `, op(2,part)); fi od; if color <> `` then color := cat( op(1..3, map(v -> cat(convert(v,string),` `), color) ) ); # ap := cat(ap, `\n material { edgecolor `, color, `\n diffuse `, color, `}\n`); # leave everything except the edge color to the handlers # for the specific plot-types. Otherwise there are # problems with Geomview and transparency # ap := cat(ap, `\n material { edgecolor `, color, `}\n`); fi; if ap <> `` then # # "transparent" is here because it cannot be changed # inside Geomview otherwise # ap := cat(` appearance { `, ap, `}`) fi; return(ap); end; ######################################################## # # COLOR # Color may be specified in three different ways. RGB color # specification requires three floating-point values for each # color. The three values must each be between 0 and 1 and specify the # amount of red, green, and blue light in the final color. For # example, COLOR(RGB, 1.0, 0.0, 0.0) is red while COLOR(RGB, 1.0, 1.0, # 0.0) is yellow. The HSV color specification also requires three # numbers for each color. The fractional portion of the first value # indicates the color and the remaining two values give the purity # (saturation) and the brightness of the color. The latter two values # must be between zero and one. The HUE color specification only # requires a single floating-point value and cycles through the colors # of the spectrum based on the fractional part of the value. For # example COLOR(HUE, 0.9) is violet while COLOR(HUE, 0.1) is # red. COLOR(HUE, x) is equivalent to COLOR(HSV, x, 0.9, 1.0). # # Color can take several extra keyword options for 3-D # plotting. XYZSHADING, XYSHADING and ZSHADING specify that an objects # color is to be based on its coordinates. ZHUE and ZGREYSCALE are # modified forms of ZSHADING. # ######################################################## print_colorlist := proc(outfd, coloron, colorlist) option `Copyright (C) 2003 by Claus-Justus Heine, Department for Applied Mathematics, Freiburg University. All rights reserved.`; description `Print colorlist in OOGL RGB format.`; if coloron = RGB then fprintf(outfd, "%e %e %e %e\n", op(2,colorlist),op(3,colorlist),op(4,colorlist), 1); elif coloron = HUE then fprintf(outfd, "%s %d\n", HSV2RGB(op(2,colorlist), 0.9, 1.0), 1); elif coloron = HSV then fprintf(outfd, "%s %d\n", HSV2RGB(op(2,colorlist), op(3,colorlist), op(4,colorlist)), 1); elif coloron != FALSE then fprintf(outfd, "0.666 0.666 0.666 1\n"); fi; end; # print_colorlist print_colorlist := proc(outfd, coloron, colorlist) end module: # geomviewgeomview:=module() geomview-1.9.4/src/bin/geomutil/maple2oogl/savegvplot.mws0000644000175000001440000001062510577534642020454 00000000000000{VERSION 5 0 "IBM INTEL LINUX" "5.0" } {USTYLETAB {CSTYLE "Maple Input" -1 0 "Courier" 0 1 255 0 0 1 0 1 0 0 1 0 0 0 0 1 }{CSTYLE "2D Math" -1 2 "Times" 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 1 }{CSTYLE "2D Output" 2 20 "" 0 1 0 0 255 1 0 0 0 0 0 0 0 0 0 1 } {PSTYLE "Normal" -1 0 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Maple Output" 0 11 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }3 3 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }} {SECT 0 {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "restart;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "libname;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#Q6/usr/local/maple8/lib6\"" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 41 "libname:=\"/home/claus/maple/lib\",libname;" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#>%(libnameG6$Q6/home/claus/maple/lib6 \"Q6/usr/local/maple8/libF'" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 94 "currentdir(\"/home/claus/projects/geomview/sourceforge/geomview/sr c/bin/geomutil/maple2oogl/\");" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 23 "read(\"gvplot.mapleV8\");" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 29 "cat(libname[1],\"/local.lib\");" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#Q@/home/claus/maple/lib/local.lib6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 50 "march(`create`,cat(libname[1],\"/local.li b\"),1000);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 24 "savelibname: =libname[1];" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%,savelibnameGQ6/home /claus/maple/lib6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "save lib(geomview);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "restart;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "libname;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#Q6/usr/local/maple8/lib6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 41 "libname:=\"/home/claus/maple/lib\",libname;" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#>%(libnameG6$Q6/home/claus/maple/lib6 \"Q6/usr/local/maple8/libF'" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 15 "with(geomview);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7(%+fwriteooglG %*gvcommandG%.gvdirectoriesG%'gvplotG%*gvsendcmdG%*writeooglG" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 302 "readTEXT := proc( filename: :string )\n local text, line, nlines;\n\n nlines := 0;\n text := table();\n\n while line <> 0 do\n line := readline( file name );\n nlines := 1 + nlines;\n text[ nlines ] := line \n end do;\n 'TEXT'( seq( text[ i ], i = 1 .. nlines - 1 ) )\nen d proc:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 83 "#makehelp(`Graph ics/3-D/geomview/writeoogl`,`gvplot.mws`,`/home/claus/maple/lib/`);" } }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 100 "INTERFACE_HELP(`insert`,t opic=`geomview[writeoogl]`,text=readTEXT(\"gvplot.mws\"),library=libna me[1]);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 97 "INTERFACE_HELP(` insert`,topic=`geomview[gvplot]`,text=readTEXT(\"gvplot.mws\"),library =libname[1]);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 100 "INTERFACE _HELP(`insert`,topic=`geomview[gvcommand]`,text=readTEXT(\"gvplot.mws \"),library=libname[1]);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 104 "INTERFACE_HELP(`insert`,topic=`geomview[gvdirectories]`,text=read TEXT(\"gvplot.mws\"),library=libname[1]);" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 114 "INTERFACE_HELP(`insert`,topic=`geomview[writeoogl] `,browser=`Graphics/3-D/geomview/writeoogl`,library=libname[1]);" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 108 "INTERFACE_HELP(`insert`,top ic=`geomview[gvplot]`,browser=`Graphics/3-D/geomview/gvplot`,library=l ibname[1]);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 114 "INTERFACE_H ELP(`insert`,topic=`geomview[writeoogl]`,browser=`Graphics/3-D/geomvie w/gvcommand`,library=libname[1]);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 116 "INTERFACE_HELP(`insert`,topic=`geomview[writeoogl]`, browser=`Graphics/3-D/geomview/directories`,library=libname[1]);" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "restart;" }}}{EXCHG {PARA 0 " > " 0 "" {MPLTEXT 1 0 8 "libname;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#Q 6/usr/local/maple8/lib6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 41 "libname:=\"/home/claus/maple/lib\",libname;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%(libnameG6$Q6/home/claus/maple/lib6\"Q6/usr/local/map le8/libF'" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 17 "?geomview[gvpl ot]" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "?writeoogl" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}}{MARK "2 0 0" 41 }{VIEWOPTS 1 1 0 1 1 1803 1 1 1 1 } {PAGENUMBERS 0 1 2 33 1 1 } geomview-1.9.4/src/bin/geomutil/maple2oogl/Makefile.am0000644000175000001440000000046710600574176017562 00000000000000EXTRA_DIST = gvplot.mapleV3 remotegv README.gvplot gvplot.mapleV4\ gvplot.txt gvplot.mapleV8 gvplot.mws savegvplot.mws mapledir = $(pkgdatadir)/Maple maple_DATA = gvplot.mapleV3 gvplot.mapleV4 gvplot.mapleV8\ gvplot.txt gvplot.mws savegvplot.mws README.gvplot doc_DATA = README.gvplot bin_SCRIPTS = remotegv geomview-1.9.4/src/bin/geomutil/maple2oogl/Makefile.in0000644000175000001440000003253510665240476017600 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomutil/maple2oogl DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(docdir)" \ "$(DESTDIR)$(mapledir)" binSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(bin_SCRIPTS) SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; docDATA_INSTALL = $(INSTALL_DATA) mapleDATA_INSTALL = $(INSTALL_DATA) DATA = $(doc_DATA) $(maple_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = gvplot.mapleV3 remotegv README.gvplot gvplot.mapleV4\ gvplot.txt gvplot.mapleV8 gvplot.mws savegvplot.mws mapledir = $(pkgdatadir)/Maple maple_DATA = gvplot.mapleV3 gvplot.mapleV4 gvplot.mapleV8\ gvplot.txt gvplot.mws savegvplot.mws README.gvplot doc_DATA = README.gvplot bin_SCRIPTS = remotegv all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/maple2oogl/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/maple2oogl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_SCRIPTS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f $$d$$p; then \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ else :; fi; \ done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; for p in $$list; do \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) test -z "$(docdir)" || $(MKDIR_P) "$(DESTDIR)$(docdir)" @list='$(doc_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(docDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(docdir)/$$f'"; \ $(docDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(docdir)/$$f"; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(docdir)/$$f'"; \ rm -f "$(DESTDIR)$(docdir)/$$f"; \ done install-mapleDATA: $(maple_DATA) @$(NORMAL_INSTALL) test -z "$(mapledir)" || $(MKDIR_P) "$(DESTDIR)$(mapledir)" @list='$(maple_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(mapleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(mapledir)/$$f'"; \ $(mapleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(mapledir)/$$f"; \ done uninstall-mapleDATA: @$(NORMAL_UNINSTALL) @list='$(maple_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(mapledir)/$$f'"; \ rm -f "$(DESTDIR)$(mapledir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(mapledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-docDATA install-mapleDATA install-dvi: install-dvi-am install-exec-am: install-binSCRIPTS install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-docDATA \ uninstall-mapleDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binSCRIPTS install-data install-data-am \ install-docDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-mapleDATA install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-docDATA uninstall-mapleDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomutil/maple2oogl/gvplot.mws0000644000175000001440000002551610577534642017602 00000000000000{VERSION 5 0 "IBM INTEL LINUX" "5.0" } {USTYLETAB {CSTYLE "Maple Input" -1 0 "Courier" 0 1 255 0 0 1 0 1 0 0 1 0 0 0 0 1 }{CSTYLE "2D Math" -1 2 "Times" 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 1 }{CSTYLE "Hyperlink" -1 17 "" 0 1 0 128 128 1 2 0 1 0 0 0 0 0 0 1 }{CSTYLE "2D Output" 2 20 "" 0 1 0 0 255 1 0 0 0 0 0 0 0 0 0 1 } {CSTYLE "Help Heading" -1 26 "" 1 14 0 0 0 0 0 1 0 0 0 0 0 0 0 1 } {CSTYLE "Help Bold" -1 39 "Times" 1 12 0 0 0 0 0 1 0 0 0 0 0 0 0 1 } {CSTYLE "" -1 256 "" 1 12 0 0 0 0 0 2 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 257 "times" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 258 "courie r" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 259 "times" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 260 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 261 "times" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 262 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } {CSTYLE "" -1 263 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 264 "times" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 265 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 266 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 267 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 } {CSTYLE "" -1 268 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE " " -1 269 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 270 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 271 "courier " 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 272 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 273 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 274 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 275 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 276 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } {CSTYLE "" -1 277 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE " " -1 279 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 280 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 281 "courier " 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 282 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 283 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 284 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 285 "times" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } {CSTYLE "" -1 286 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE " " -1 287 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 288 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 289 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 290 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 291 "courier" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 } {PSTYLE "Normal" -1 0 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Text Output" -1 2 1 {CSTYLE "" -1 -1 "Courier" 1 10 0 0 255 1 0 0 0 0 0 1 3 0 3 0 }1 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Heading 1" 0 3 1 {CSTYLE "" -1 -1 "" 1 18 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }1 0 0 0 8 4 0 0 0 0 0 0 -1 0 } {PSTYLE "Heading 2" 3 4 1 {CSTYLE "" -1 -1 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 8 2 0 0 0 0 0 0 -1 0 }{PSTYLE "Warning" 2 7 1 {CSTYLE "" -1 -1 "" 0 1 0 0 255 1 0 0 0 0 0 0 1 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Maple Output" 0 11 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }3 3 0 -1 -1 -1 0 0 0 0 0 0 -1 0 } {PSTYLE "" 11 12 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }1 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Bullet Item" 0 15 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 3 3 0 0 0 0 0 0 15 2 }{PSTYLE "" 0 256 1 {CSTYLE "" -1 -1 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "" 0 257 1 {CSTYLE "" -1 -1 "courier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "" 0 258 1 {CSTYLE "" -1 -1 "cour ier" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }} {SECT 0 {PARA 3 "" 0 "" {TEXT -1 18 "writeoogl, gvplot " }{TEXT 256 29 "- Maple interface to Geomview" }}{PARA 256 "" 0 "" {TEXT -1 0 "" } }{PARA 4 "" 0 "" {TEXT 26 16 "Calling Sequence" }}{PARA 257 "" 0 "" {TEXT -1 6 " " }{TEXT 268 8 " \011with(" }{TEXT 291 8 "geomview " }{TEXT 272 23 "):\n fwriteoogl(" }{TEXT 290 0 "" }{TEXT 282 17 "fd, 3dplot_struct" }{TEXT 283 2 ");" }}{PARA 258 "" 0 "" {TEXT 281 19 " \011writeoogl(" }{TEXT 279 25 "\"filename\", 3dplot_st ruct" }{TEXT 273 23 ");\011\n \011writeoogl(" }{TEXT 280 13 "3d plot_struct" }{TEXT 274 24 ");\011\011\011\011\011\n \011gvplot (" }{TEXT 271 13 "3dplot_struct" }{TEXT 275 24 ");\011\011\011\011\011 \n \011gvplot(" }{TEXT 270 23 "\"geomview_name\", 3dplot" } {TEXT 276 1 "_" }{TEXT 269 6 "struct" }{TEXT 277 2 ");" }}{PARA 4 "" 0 "" {TEXT -1 3 "\011\011\n" }{TEXT 26 10 "Parameters" }{TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT 284 22 " \011fd " }{TEXT 285 58 "- the file-descriptor which will contain the Geomview data" } {TEXT 286 24 "\011\n \011filename " }{TEXT 257 47 "- the fi le which will contain the Geomview data" }{TEXT 258 24 "\011\n \+ \0113dplot_struct\011" }{TEXT 259 31 "- a Maple PLOT3D data structure " }{TEXT 260 26 "\011\011\011\n \011geomview_name\011" }{TEXT 261 48 "- name of the new object in the Geomview browser" }{TEXT 262 2 "\011\n" }{MPLTEXT 1 0 0 "" }}{SECT 1 {PARA 4 "" 0 "" {TEXT 39 11 "D escription" }}{PARA 15 "" 0 "" {TEXT -1 1 " " }{TEXT 39 11 "writeoogl( )" }{TEXT -1 73 " accepts Maple PLOT3D structures and writes files rea dable by Geomview. " }{TEXT 26 8 "gvplot()" }{TEXT -1 121 " converts \+ Maple PLOT3D structures and displays them immediately using Geomview, \+ starting a copy of Geomview if necessary." }}{PARA 15 "" 0 "" {TEXT -1 96 "Supported data types include the Maple structures MESH, GRID, C URVES, POINTS, and POLYGONS. See " }{HYPERLNK 17 "plot3d[structure]" 2 "plot3d[structure]" "" }{TEXT -1 44 " for more information on Maple \+ PLOT3D types." }}{PARA 15 "" 0 "" {TEXT -1 0 "" }{TEXT 287 13 "fwriteo ogl() " }{TEXT -1 11 "works like " }{TEXT 288 11 "writeoogl()" }{TEXT -1 75 ", except that it does expect a file-descriptor instead of a fil e-name. See " }{HYPERLNK 17 "fopen" 2 "fopen" "" }{TEXT -1 43 " for mo re information about files in Maple." }}{PARA 15 "" 0 "" {TEXT -1 190 "The Maple MESH and GRID structures are translated into Geomview's MES H and ZMESH objects, respectively, Maple CURVES and POINTS become VECT objects, and Maple POLYGONS becomes an OFF object." }}{PARA 15 "" 0 " " {TEXT -1 90 "The Maple TEXT structure is not supported. Color inform ation is supported for all objects." }}{PARA 15 "" 0 "" {TEXT -1 9 "Th e form " }{TEXT 266 32 "writeoogl(filename, plot_struct)" }{TEXT -1 56 " writes data in OOGL (Geomview) form to the given file; " }{TEXT 265 15 "writeoogl(plot)" }{TEXT -1 52 " writes to the current output s tream as selected by " }{TEXT 267 9 "writeto()" }{TEXT -1 1 "." }} {PARA 15 "" 0 "" {TEXT 263 8 "gvplot()" }{TEXT -1 103 " normally start s the program \"geomview\", with no options; to specify something else , set the variable \"" }{TEXT 264 9 "gvcommand" }{TEXT -1 10 "\", as i n: " }{MPLTEXT 1 0 60 "gvcommand := /usr/local/bin/gv -wpos 200x200 -c startup.gv\";" }{TEXT -1 128 " before invoking gvplot(). Also, if th e programs \"geomview\" or \"togeomview\" are not on your UNIX search \+ path, set the variable " }{MPLTEXT 1 0 59 "gvdirectories := \"/some/di r/ectory:/some/other/directory\"; " }{TEXT -1 66 "to the appropriate d irectory (or directories separated by colons)." }}}{SECT 1 {PARA 4 "" 0 "" {TEXT 26 8 "Examples" }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 27 "with(plots):with(geomview);" }}{PARA 7 "" 1 "" {TEXT -1 50 "Warning, \+ the name changecoords has been redefined\n" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7(%+fwriteooglG%*gvcommandG%.gvdirectoriesG%'gvplotG%*g vsendcmdG%*writeooglG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 50 "my _plot := plot3d(sin(x+y), x=-Pi..Pi, y=-Pi..Pi):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 35 "writeoogl( \"sinxy.mesh\", my_plot );" }} {PARA 11 "" 1 "" {XPPMATH 20 "6$%ISaving~Maple~3D~structs~to~Geomview~ fileGQ+sinxy.mesh6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 98 "ste iner := plot3d([ sin(2*x)*(cos(y))^2, sin(x)*sin(2*y),\011cos(x)*sin(2 *y)], x=-Pi..Pi, y=-Pi..Pi):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 36 "writeoogl( \"steiner.mesh\", steiner);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6$%ISaving~Maple~3D~structs~to~Geomview~fileGQ-steiner.me sh6\"" }}}{PARA 0 "" 0 "" {TEXT -1 28 "Write using file-descriptors" } }{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 33 "fd:=fopen(\"steiner.mesh\", WRITE);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#fdG\"\"!" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 26 "fwriteoogl( fd, steiner );" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 11 "fclose(fd);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 31 "Display it in geomview directly" } {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "gvplot( steiner );" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 122 "trefoil := \+ spacecurve([ -2*cos(t)- 1/2*cos(5*t)+ 3*sin(2*t),\011-3*cos(2*t)+ 2*si n(t)- 1/2*sin(5*t), 2*cos(3*t), t=0..2*Pi]):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 36 "writeoogl( \"trefoil.vect\", trefoil);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6$%ISaving~Maple~3D~structs~to~Geomview~fileGQ -trefoil.vect6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 138 "tetrah edra := [[1,0,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,0,1],[0,1,0]], \+ [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,0]]:" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 37 "Tplot := polygonplot3d([tetr ahedra]):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 36 "writeoogl( \"t etrahedra.off\", Tplot);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6$%ISaving~M aple~3D~structs~to~Geomview~fileGQ/tetrahedra.off6\"" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 77 "Even clipping can be done (internally achieved \+ by using the external program " }{TEXT 289 7 "clip(1)" }{TEXT -1 1 ") " }{MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 66 "Tplo t :=polygonplot3d([tetrahedra],view=[-1..0.3,-0.3..1,0..0.8]);" }} {PARA 12 "" 1 "" {XPPMATH 20 "6#>%&TplotG-%1INTERFACE_PLOT3DG6$-%)POLY GONSG6&7%7%$\"\"\"\"\"!$F/F/F07%$!\"\"F/F0F07%F0F0F-7%F,F47%F0F-F07%F6 F1F47%F,F6F1-%%VIEWG6%;F2$\"\"$F3;$!\"$F3F-;F0$\"\")F3" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "gvplot( \"Tplot\", Tplot );" }}} {EXCHG {PARA 0 "" 0 "" {TEXT -1 55 "you can even create a single file \+ with multiple objects" }{MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 60 "all_objs := display3d( \{my_plot, steiner, trefoil, T plot\} ):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 34 "writeoogl( \"a ll.list\", all_objs );" }}{PARA 11 "" 1 "" {XPPMATH 20 "6$%ISaving~Map le~3D~structs~to~Geomview~fileGQ)all.list6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" } }}}{SECT 1 {PARA 4 "" 0 "" {TEXT 26 8 "See Also" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }{HYPERLNK 17 "plot3d[structure]" 2 "plot3d[structure]" "" }{TEXT -1 2 ", " }{HYPERLNK 17 "fopen" 2 "fopen" "" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}}}{MARK "6 7" 18 }{VIEWOPTS 1 1 0 1 1 1803 1 1 1 1 }{PAGENUMBERS 0 1 2 33 1 1 } geomview-1.9.4/src/bin/geomutil/maple2oogl/gvplot.txt0000644000175000001440000000601607730233772017602 00000000000000HELP FOR: writeoogl, gvplot CALLING SEQUENCE: readlib(gvplot): writeoogl( "filename", 3dplot_struct ); writeoogl( 3dplot_struct ); gvplot( 3dplot_struct ); gvplot( "geomview_name", 3dplot_struct ) PARAMETERS: filename the file which will contain the Geomview data 3dplot_struct a Maple PLOT3D data structure geomview_name name of the object in the Geomview browser SYNOPSIS: writeoogl() accepts Maple PLOT3D structures and writes files readable by Geomview. gvplot() converts Maple PLOT3D structures and displays them immediately using Geomview, starting a copy of Geomview if necessary. Supported data types include the Maple structures MESH, GRID, CURVES, POINTS, and POLYGONS. See ?plot3d[structure] for more information on Maple PLOT3D types. The Maple MESH and GRID structures are translated into Geomview's MESH and ZMESH objects, respectively, Maple CURVES and POINTS become VECT objects, and Maple POLYGONS becomes an OFF object. The Maple TEXT structure is not supported. Color information is supported for all objects. The form writeoogl(filename, plot_struct) writes data in OOGL (Geomview) form to the given file; writeoogl(plot) writes to the current output stream as selected by writeto(). gvplot() normally starts the program "geomview", with no options; to specify something else, set the variable "gvcommand", as in: gvcommand := "/usr/local/bin/gv -wpos 200x200 -c startup.gv"; before invoking gvplot(). Also, if the programs "geomview" or "togeomview" are not on your UNIX search path, set the variable gvdirectories := "/some/dir/ectory:/some/other/directory"; to the appropriate directory (or directories separated by colons). EXAMPLES: readlib(gvplot): my_plot := plot3d(sin(x+y), x=-Pi..Pi, y=-Pi..Pi): writeoogl( "sinxy.mesh", my_plot ); Saving Maple 3D structs to Geomview file, sinxy.mesh steiner := plot3d([ sin(2*x)*(cos(y))^2, sin(x)*sin(2*y), cos(x)*sin(2*y)], x=-Pi..Pi, y=-Pi..Pi): writeoogl( "steiner.mesh", steiner); Saving Maple 3D structs to Geomview file, steiner.mesh # Display it in geomview directly gvplot( steiner ); # load in the plots package with(plots): trefoil := spacecurve([ -2*cos(t)- 1/2*cos(5*t)+ 3*sin(2*t), -3*cos(2*t)+ 2*sin(t)- 1/2*sin(5*t), 2*cos(3*t), t=0..2*Pi]): writeoogl( "trefoil.vect", trefoil); Saving Maple 3D structs to Geomview file, trefoil.vect tetrahedra := [[1,0,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,0,1],[0,1,0]], [[0,1,0],[-1,0,0],[0,0,1]], [[1,0,0],[0,1,0],[-1,0,0]]: Tplot :=polygonplot3d([tetrahedra]): writeoogl( "tetrahedra.off", Tplot); Saving Maple 3D structs to Geomview file, tetrahedra.off # you can even create a single file with multiple objects all_objs := display3d( {my_plot, steiner, trefoil, Tplot} ): writeoogl( "all.list", all_objs ); Saving Maple 3D structs to Geomview file, all.list SEE ALSO: plot3d[structure] geomview-1.9.4/src/bin/geomutil/clip/0000777000175000001440000000000010665240701014464 500000000000000geomview-1.9.4/src/bin/geomutil/clip/Clip.h0000644000175000001440000001065110455700774015453 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include #include #include #include #include #define MAXDIM 20 /* Max allowed dimension */ #ifndef COLORDEFS typedef struct Color { float r,g,b; } Color; #endif typedef struct _vertex /* A single vertex */ { struct _vertex *next; /* Pointer to next vertex */ float *coord; /* My coordinates for ND case. */ Color c; /* Vertex color if any */ int clip; /* Have I been clipped or not? */ float val; /* Function value at this vertex */ int num; /* Reference number of vertex in array */ } vertex; typedef struct _vertex_list /* Global list of shared vertices */ { int numvtx; /* Number of vertices */ /* private */ vertex *head; /* pointer to head of list */ vertex *point; /* pointer used while traversing list */ } vertex_list; typedef struct _pvtx /* vertex holder for vertex list */ /* of each polygon */ { int num; /* reference number of vertex in array */ struct _vertex *me; /* Pointer to actual (shared) vertex. */ struct _pvtx *next; /* Pointer to next pvtx in polyvtx_list */ } pvtx; typedef struct _polyvtx_list /* vertex list for each polygon */ { int numvtx; /* number of vertices in polygon */ pvtx *head; /* head of polygon vertex list */ pvtx *point; /* pointer used while traversing list */ } polyvtx_list; typedef struct _poly /* A polygon */ { int numvtx; /* Number of vertices */ int clipped; /* has the whole polygon been cut away? */ /* 1 if it has been cut away, 0 if some */ /* or all of the polygon remains */ polyvtx_list *me; /* Vertex list of polygon */ Color c; /* Color of this polygon if doing per */ /* face coloring. */ struct _poly *next; /* Next polygon in list of polys. */ } poly; typedef struct _poly_list /* List of polygons */ { int numpoly; /* number of polygons */ #define HAS_VN 0x1 #define HAS_VC 0x4 #define HAS_PC 0x8 int has; /* bit mask of associated data */ poly *head; /* head of list of polys */ poly *point; /* pointer for traversing list */ } poly_list; #define NEWLINE '\n' #define SPACE ' ' typedef struct clip { poly_list polyhedron; vertex_list polyvertex; int side; /* side to cut... 0 -- less than 1 -- greater than */ int dim; /* Are we working in N Dimensions. */ float surf[MAXDIM]; /* Surface parameters. */ /* For a plane, the plane normal vector */ /* (or, other parameters for non-planar clip) */ float (*clipfunc)(); /* Clipping function, whose value is zero * along the surface where we should clip. */ int nonlinear; /* Is clipfunc an affine function of position?*/ float level; /* Value of clipfunc at clipping surface */ } Clip; /* * Typical usage: * Have a "Clip" variable; * clip_init(&clip); * setGeom(&clip, oogl-geometry-object); * setSide(&clip, CLIP_xx); * // Possibly change clip.clipfunc; clip_init sets planar clipping. * setClipPlane(&clip, coeffs[], threshold); * do_clip(&clip); * g = getGeom(&clip); * // Must call setGeom() before another do_clip; the internal data * // structures can't handle successive clips against the same object. * // Could simply setGeom(&clip, g) if that's intended. * clip_destroy(&clip); */ void setClipPlane(Clip *, float coeffs[], float level); enum clip_side { CLIP_LE, CLIP_GE }; void setSide(Clip *, int side); /* 0->negative, 1->positive side */ void setGeom(Clip *, void *g); void *getGeom(Clip *); void clip_init(Clip *); void clip_destroy(Clip *); void do_clip(Clip *); geomview-1.9.4/src/bin/geomutil/clip/clipmain.c0000644000175000001440000002502710455700774016356 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "list.h" #include "plutil.h" #include "Clip.h" /* Note: must include this *after* oogl includes */ Clip clip; extern int span_vertices(Clip *clip, float *minp, float *maxp); static char Usage[] = "\ Usage: clip [-v axisx,y,z,...] [-g value] [-l value] [-s nslices[,fraction]]\n\ [-sph centerx,y,z,...] [-cyl centerx,y,z,...] [-e] [file.oogl]\n\ Reads an OOGL object from file.oogl (or stdin if omitted).\n\ Slices it against a (series of) planes whose normal vectors are given\n\ by the -v argument (default 1,0,0,0,...).\n\ Given -g, selects portions where dot > .\n\ Given -l, selects portions where dot < .\n\ Given both, takes the portion lying between those two values.\n\ With -s, emits a series of slices spaced units apart.\n\ With -e, emits just two numbers instead of geometry: range of function-values\n\ which the object spans.\n\ -sph : Slice against a sphere, not a plane. -g/-l gives radius.\n\ -cyl x,y,z... : Slice against a cylinder whose axis passes through x,y,z...\n\ -v gives axis direction, -g/-l radius.\n"; static int parsevector(char *str, float data[], int maxdata) { int i; char *p, *op; memset(data, 0, maxdata*sizeof(float)); if(str == NULL) return -1; for(i = 0, p = str; i < maxdata && *p; i++) { op = p; data[i] = strtod(p, &p); if(p == op) break; while(*p == ',' || *p == ' ') p++; } return i; } void setclipat(Clip *clip, char *pstr, int dim, float *surf, void (*prepfunc)()) { float point[MAXDIM]; float level; int n; n = parsevector(pstr, point, dim); if(n > 1) { /* Given several numbers, consider them * to be a point; choose a level-set * going through that point. */ setClipPlane(clip, surf, 0); level = (*clip->clipfunc)(clip, point); } else { level = point[0]; /* If just one number, use exactly it */ } setClipPlane(clip, surf, level); if(prepfunc) (*prepfunc)(clip); } /* * Clipping functions. * The default function, to clip against a plane, is in clip.c. */ static float origin[MAXDIM]; /* * Clip against a sphere. * Uses static variable "origin". */ static float sphere(Clip *clip, float *point) { /* clip->surf[0..dim-1] are the coordinates of the center of the sphere. */ int i; float r2 = 0, *s, *p; for(i = clip->dim, p = point, s = origin; --i >= 0; p++, s++) r2 += (*p - *s) * (*p - *s); return r2; } /* * Clip against a cylinder. * Uses both clip->surf, the cylinder's axis vector, * and static variable "origin", a point on the cylinder. */ static float cylinder(Clip *clip, float *point) { /* clip->surf[0..dim-1] are the direction vector of the cylinder's axis; * clip->surf[dim..2*dim-1] are coordinates of a point on the axis. */ int dim = clip->dim; int i; float r2 = 0, dot = 0, dx, *s, *p, *c; for(i=dim, p=point, c=origin, s=clip->surf; --i >= 0; p++, s++, c++) dot += (*p - *c) * *s; for(i=dim, p=point, c=origin, s=clip->surf; --i >= 0; p++, s++, c++) { dx = (*p - *c) - dot * *s; r2 += dx * dx; } return r2; } /* Special case for Mark Levi */ float leviarctan(Clip *clip, float *point) { /* On input, point[0] .. point[2] are x,y,z coordinates of the point to test. * Assigning w <- point[1] and T <- point[2] * we compute x(w,T) on the surface * x = constant - 2T +/- arctan(w) * and return the difference between x(w,t) and our point's x. * * The sign of arctan is taken from clip->surf[0]; this is * the number given to the "-v" command-line argument. So, using * "-a -v 1,21.99" means x(w,T) = 7pi - 2T - arctan(w), and * "-a -v -1,21.99" means x(w,T) = 7pi - 2T + arctan(w). */ return clip->surf[1] - 2*point[2] - clip->surf[0] * atan(point[1]) - point[0]; } /* * For some level-set functions we'd rather precompute the square of the * given value. They set prepfunc = squared. */ static void squared(Clip *clip) { clip->level *= clip->level; } /* For the cylinder, we want to make the axis be a unit vector, * so we can easily project it out. Want to square the level value, too. */ static void squared_normalized(Clip *clip) { int dim = clip->dim; int i; float len = 0, *p; for(i = dim, p = clip->surf; --i >= 0; p++) len += *p * *p; len = sqrt(len); if(len > 0) { for(i = dim, p = clip->surf; --i >= 0; p++) *p /= len; } /* And square the radius */ clip->level *= clip->level; } int main(int argc, char *argv[]) { Geom *g, *clipped; float surf[MAXDIM]; float (*func)() = NULL; void (*prepfunc)() = NULL; char *lestr = NULL, *gestr = NULL; char *type; int slices = 0; int nonlinear = 0; int extent = 0; float slicev[2]; IOBFILE *inf = iobfileopen(stdin); if(argc <= 1) { fputs(Usage, stderr); exit(1); } clip_init(&clip); memset(surf, 0, sizeof(surf)); surf[0] = 1; while(argc > 1) { if(strncmp(argv[1], "-g", 2) == 0 && argc>2) { if(gestr != NULL) { fprintf(stderr, "clip: can only specify one -g option.\n"); exit(1); } gestr = argv[2]; argc -= 2, argv += 2; } else if(strncmp(argv[1], "-l", 2) == 0 && argc>2) { if(lestr != NULL) { fprintf(stderr, "clip: can only specify one -l option.\n"); exit(1); } lestr = argv[2]; argc -= 2, argv += 2; } else if(strcmp(argv[1], "-v") == 0 && argc > 2) { if(parsevector(argv[2], surf, MAXDIM) <= 0) { fprintf(stderr, "-v: expected x,y,z,... surface parameters\n\ (plane normal or cylinder axis)\n"); exit(1); } argc -= 2, argv += 2; } else if(strcmp(argv[1], "-e") == 0) { extent = 1; argc--, argv++; } else if(strcmp(argv[1], "-a") == 0) { func = leviarctan; nonlinear = 1; argc--, argv++; } else if(strncmp(argv[1], "-sph", 4) == 0) { func = sphere; prepfunc = squared; nonlinear = 1; if(parsevector(argv[2], origin, COUNT(origin)) <= 0) { fprintf(stderr, "clip -sph: expected x,y,z,... of sphere's center.\n"); exit(1); } argc -= 2, argv += 2; } else if(strncmp(argv[1], "-cyl", 4) == 0) { func = cylinder; prepfunc = squared_normalized; nonlinear = 1; if(parsevector(argv[2], origin, COUNT(origin)) <= 0) { fprintf(stderr, "clip -cyl: expected x,y,z,... of a point on the cylinder's axis\n"); exit(1); } argc -= 2, argv += 2; } else if(strcmp(argv[1], "-s") == 0) { slices = parsevector(argv[2], slicev, 2); if(slices <= 0 || slicev[0] <= 1) { fprintf(stderr, "clip -s: expected -s nribbons or nribbons,gap-fraction; must have >= 2 ribbons\n"); exit(1); } else if(slices == 1) slicev[1] = .5; argc -= 2, argv += 2; } else if(argv[1][0] == '-') { fprintf(stderr, "Unknown option '%s'. Run 'clip' with no arguments for help.\n", argv[1]); exit(1); } else { break; } } if(lestr == NULL && gestr == NULL && slices == 0 && extent == 0) { fprintf(stderr, "clip: must specify at least one of -l or -g or -s or -e options.\n"); exit(2); } if(argc > 2) { fprintf(stderr, "clip: can only handle one object\n"); exit(2); } if(argc > 1 && strcmp(argv[1], "-") != 0) { g = GeomLoad(argv[1]); } else { argv[1] = "standard input"; g = GeomFLoad(inf, "stdin"); } type = GeomName(g); if(type!=NULL && strcmp(type, "polylist") && strcmp(type, "npolylist")) { Geom *newg = AnyToPL(g, TM3_IDENTITY); GeomDelete(g); g = newg; } if(g == NULL) { fprintf(stderr, "clip: Error loading OOGL object from %s\n", argv[1]); exit(1); } if(func != NULL) clip.clipfunc = func; clip.nonlinear = nonlinear; if(lestr != NULL) { setGeom(&clip, g); setclipat(&clip, lestr, clip.dim, surf, prepfunc); setSide(&clip, CLIP_LE); do_clip(&clip); clipped = getGeom(&clip); GeomDelete(g); g = clipped; } if(gestr != NULL) { setGeom(&clip, g); setclipat(&clip, gestr, clip.dim, surf, prepfunc); setSide(&clip, CLIP_GE); do_clip(&clip); clipped = getGeom(&clip); GeomDelete(g); g = clipped; } if(slices > 0) { float min, max, v, step; int i; Geom *piece, *whole = NULL; char lim[64]; setGeom(&clip, g); setclipat(&clip, "0", clip.dim, surf, prepfunc); if(span_vertices(&clip, &min, &max) != 0) { /* Nonempty */ /* Interpolate linearly in real space -- invert prepfunc */ if(prepfunc == squared || prepfunc == squared_normalized) { min = sqrt(min); max = sqrt(max); } step = (max - min) / (slicev[0] + slicev[1] - 1); sprintf(lim, "%g", min + slicev[1]*step); setclipat(&clip, lim, clip.dim, surf, prepfunc); setSide(&clip, CLIP_LE); do_clip(&clip); whole = GeomCreate("list", CR_GEOM, getGeom(&clip), CR_END); for(i = 1, v = min + step; i < slicev[0]; i++, v += step) { setGeom(&clip, g); sprintf(lim, "%g", v + slicev[1]*step); setclipat(&clip, lim, clip.dim, surf, prepfunc); setSide(&clip, CLIP_LE); do_clip(&clip); piece = getGeom(&clip); setGeom(&clip, piece); sprintf(lim, "%g", v); setclipat(&clip, lim, clip.dim, surf, prepfunc); setSide(&clip, CLIP_GE); do_clip(&clip); piece = getGeom(&clip); if(piece) whole = ListAppend(whole, piece); } } g = whole; } if(extent != 0) { float min, max; setGeom(&clip, g); setclipat(&clip, "0", clip.dim, surf, prepfunc); if(span_vertices(&clip, &min, &max) != 0) { if(prepfunc == squared || prepfunc == squared_normalized) { min = sqrt(min); max = sqrt(max); } } printf("%g %g\n", min, max); } else { GeomFSave(g, stdout, "stdout"); } exit(0); } geomview-1.9.4/src/bin/geomutil/clip/clipoogl.c0000644000175000001440000001662410560447715016375 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * OOGL PolyList and NPolyList wrappers for clipping routine. * Adapted from Daeron Meyer's Ginsu * by Dan Krech and Stuart Levy, Geometry Center, 1994. */ #include "polylistP.h" #include "npolylistP.h" #include "Clip.h" void readVerts(Clip *clip, vertex_list *pv, Geom *g, int isnd) { int i; vertex *point = (vertex *)malloc(pv->numvtx * sizeof(vertex)); ColorA *colors; int colored = clip->polyhedron.has & HAS_VC; memset(point, 0, pv->numvtx * sizeof(vertex)); pv->head = point; #define pl ((PolyList *)g) #define npl ((NPolyList *)g) for(i = 0; i < pv->numvtx; i++, point++) { point->next = point+1; if(isnd) { point->coord = &npl->v[i*(clip->dim+1)]; colors = &npl->vcol[i]; } else { point->coord = &pl->vl[i].pt.x; colors = &pl->vl[i].vcol; } if(colored) { point->c = *(Color *)colors; } } point--; point->next = NULL; pv->point = point; #undef pl #undef npl } void readNDPoly(poly *p, NPolyList *pl, int polyNum) { int i; pvtx *corner = NULL; polyvtx_list *pv = (polyvtx_list *)malloc(sizeof(polyvtx_list)); pvtx **prevp = &pv->head; Poly *np = &pl->p[polyNum]; p->me = pv; pv->numvtx = np->n_vertices; for(i = 0; i < np->n_vertices; i++) { corner = (pvtx *)malloc(sizeof(pvtx)); corner->num = pl->vi[i + pl->pv[i]]; *prevp = corner; prevp = &corner->next; } *prevp = pv->head; pv->point = corner; p->c = *(Color *)(void *)&np->pcol; } void readPolyvtx(polyvtx_list *pv, int numvx, PolyList *pl, int polyNum) { int i; pvtx **prevp = &pv->head; pvtx *point = NULL; Poly *p = &pl->p[polyNum]; pv->numvtx = numvx; for (i = 0; i < pv->numvtx; i++) { point = (pvtx *)malloc(sizeof(pvtx)); point->num = (p->v[i] - pl->vl); *prevp = point; prevp = &point->next; } *prevp = pv->head; pv->point = point; return; } void readPoly(poly *p, PolyList *pl, int polyNum) { p->numvtx = pl->p[polyNum].n_vertices; p->me = (polyvtx_list *)malloc(sizeof(polyvtx_list)); readPolyvtx(p->me, p->numvtx, pl, polyNum); /* read each vertex ref number. */ p->c = *(Color *)(void *)&pl->p[polyNum].pcol; } void readPolys(Clip *clip, poly_list *ph, Geom *g, int isnd) { int i; poly *point; #define pl ((PolyList *)g) #define npl ((NPolyList *)g) ph->numpoly = isnd ? npl->n_polys : pl->n_polys; point = (poly *)malloc(ph->numpoly * sizeof(poly)); ph->head = point; for(i = 0; i < ph->numpoly; i++, point++) { point->next = point+1; if(isnd) readNDPoly(point, npl, i); else readPoly(point, pl, i); } point--; point->next = NULL; ph->point = point; #undef pl #undef npl return; } void setGeom(struct clip *clip, void *aGeom) { char *classname; int isnd; clip_destroy(clip); if(aGeom==NULL) { return; /* clip_destroy() already created null object */ } classname = GeomName(aGeom); clip->polyhedron.has = 0; if(strcmp(classname, "polylist") == 0) { PolyList *pl = (PolyList *)aGeom; if(pl->geomflags & PL_HASVCOL) clip->polyhedron.has = HAS_VC; if(pl->geomflags & PL_HASPCOL) clip->polyhedron.has |= HAS_PC; isnd = 0; clip->dim = pl->geomflags & VERT_4D ? 4 : 3; clip->polyvertex.numvtx = pl->n_verts; isnd = 0; } else if(strcmp(classname, "npolylist") == 0) { NPolyList *npl = (NPolyList *)aGeom; clip->dim = npl->pdim-1; if(clip->dim >= MAXDIM-1) { fprintf(stderr, "clip: can't handle objects of dimension %d\n\ (change MAXDIM, now %d, and recompile)\n", clip->dim, MAXDIM); exit(1); } if(npl->geomflags & PL_HASVCOL) clip->polyhedron.has = HAS_VC; if(npl->geomflags & PL_HASPCOL) clip->polyhedron.has |= HAS_PC; isnd = 1; clip->polyvertex.numvtx = npl->n_verts; isnd = 1; } else { fprintf(stderr, "clip: can't handle object of type '%s'\n", classname); exit(1); } readVerts(clip, &clip->polyvertex, aGeom, isnd); readPolys(clip, &clip->polyhedron, aGeom, isnd); } void *getGeom(Clip *clip) { int i = 0, j = 0; float *points, *ptp; ColorA *colors = NULL, *ctp; ColorA *poly_color = NULL; int *vertex_counts; int *vertex_indices; vertex *vert; poly *point; int total = 0; Geom *aGeom=NULL; int dim = clip->dim; int hdim = (dim == 3 || dim == 4) ? 4 : dim+1; int has = clip->polyhedron.has; if(clip->polyvertex.numvtx==0) { return NULL; } point = clip->polyhedron.head; while (point != NULL) { /* For each polygon: */ if (!point->clipped) { /* if it still exists */ total += point->me->numvtx; } point = point->next; } points = (float *)malloc(hdim*clip->polyvertex.numvtx*sizeof(*points)); vertex_counts = (int *)malloc(clip->polyhedron.numpoly*sizeof(int)); if(has & HAS_PC) poly_color = (ColorA *)malloc(clip->polyhedron.numpoly*sizeof(ColorA)); vertex_indices = (int *)malloc(total*sizeof(int)); if(has & HAS_VC) colors = (ColorA *)malloc(clip->polyvertex.numvtx*sizeof(ColorA)); ptp = points; ctp = colors; for(vert=clip->polyvertex.head; vert != NULL; vert = vert->next) { if(!vert->clip) { memcpy(ptp, vert->coord, dim*sizeof(float)); ptp += dim; if(hdim > dim) *ptp++ = 1.; if(has & HAS_VC) { *(Color *)ctp = vert->c; ctp->a = 1; ctp++; } } } point = clip->polyhedron.head; i = 0; j = 0; ctp = poly_color; while (point != NULL) /* For each polygon: */ { if (!point->clipped) /* if it still exists */ { pvtx *temp; pvtx *pnt; temp = point->me->head; pnt = point->me->head; vertex_counts[i] = point->me->numvtx; if (has & HAS_PC) { *(Color *)ctp = point->c; ctp->a = 1; ctp++; } i++; do { vertex_indices[j] = pnt->me->num; j++; /* Write out each vertex reference number. */ pnt = pnt->next; } while (pnt != temp); } point = point->next; } if(dim == 3 || dim == 4) { aGeom = GeomCreate("polylist", CR_NPOLY, clip->polyhedron.numpoly, CR_POINT4, points, CR_NVERT, vertex_counts, CR_VERT, vertex_indices, CR_END); } else { aGeom = GeomCreate("npolylist", CR_DIM, dim, CR_NPOLY, clip->polyhedron.numpoly, CR_POINT4, points, CR_NVERT, vertex_counts, CR_VERT, vertex_indices, CR_END); } if(has & HAS_PC) GeomSet(aGeom, CR_POLYCOLOR, poly_color, CR_END); else if(has & HAS_VC) GeomSet(aGeom, CR_COLOR, colors, CR_END); free(points); free(vertex_counts); free(vertex_indices); if(colors) free(colors); if(poly_color) free(poly_color); return aGeom; } geomview-1.9.4/src/bin/geomutil/clip/clip.c0000644000175000001440000002424110455700774015506 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Clipping routine. * Adapted from Daeron Meyer's Ginsu. * by Dan Krech and Stuart Levy, Geometry Center, 1994. */ #include "Clip.h" #define EPS 0.00001 vertex *add_vertex(Clip *clip, vertex_list *vtxl, float *aCoord, Color *c) { vertex *head = vtxl->head; vertex *temp = head; head = (vertex *)malloc(sizeof(vertex)); head->coord = (float *)malloc((clip->dim+1)*sizeof(float)); head->next = temp; memcpy(head->coord, aCoord, clip->dim*sizeof(float)); head->c = *c; head->clip = 0; vtxl->head = head; return (head); } int find_unclipped_vertex(polyvtx_list *me,vertex **vertex_set) { pvtx *temp = me->head; pvtx *point; int brk=0; point = me->head; do { brk = vertex_set[point->num]->clip; /* Check polygon vertex list to see */ if (brk) /* if any still remain */ point = point->next; } while (brk && (point != temp)); if ((point == temp) && brk) /* if we found a vertex, return 1 */ return 1; me->head = point; return 0; /* otherwise return 0 */ } float dot(Clip *clip, float *point) { int i; int dim = clip->dim; float sum = clip->surf[dim]; for(i=0;isurf[i]; } return sum; } void pcinterp(Clip *clip, float *result, float *p1, float *p2, Color *cresult, Color *c1, Color *c2, float val1, float val2) { int i; int dim = clip->dim; float t = val1 / (val1 - val2); float unt; float val; /* Don't go too crazy in case of numerical error. */ if(t < 0) t = 0; else if(t > 1) t = 1; unt = 1 - t; for(i=dim; --i >= 0; ) result[i] = p1[i]*unt + p2[i]*t; if(clip->nonlinear) { float eps = EPS * fabs(val1 - val2); int limit = 7; float t1 = 0, t2 = 1, a; for(;;) { val = (*clip->clipfunc)(clip, result) - clip->level; if(fabs(val) < eps || --limit <= 0) break; if(val * val1 < 0) { t2 = t; val2 = val; } else { t1 = t; val1 = val; } a = val1 / (val1 - val2); /*Subdivide interval */ t = (1-a)*t1 + a*t2; /*Transform back to original interval*/ unt = 1-t; for(i=dim; --i >= 0; ) result[i] = p1[i]*unt + p2[i]*t; /* Interpolate point */ } } cresult->r = c1->r*unt + c2->r*t; cresult->g = c1->g*unt + c2->g*t; cresult->b = c1->b*unt + c2->b*t; } int clip_each_vertex(Clip *clip, polyvtx_list *me, vertex_list *vtxl, vertex **vertex_set) { pvtx *temp, *next, *last; float intersect[MAXDIM]; Color c, *c1, *c2; float *p1 = NULL; float *p2 = NULL; vertex *v1, *v2; last = me->head; me->point = me->head; me->point->me = vertex_set[me->point->num]; do { next = me->point->next; next->me = vertex_set[next->num]; v1 = vertex_set[me->point->num]; v2 = vertex_set[next->num]; c1 = &v1->c; /* Color of current vertex */ c2 = &v2->c; /* Color of next vertex */ p1 = v1->coord; p2 = v2->coord; /* Coordinates of next vtx */ /* * Handle first case: * * * o--------o <---- next vertex * / / * / / side to clip * ------------------------------- <------- clipping plane * / / * / / * o-----------o <--- current vertex */ if (!v1->clip && v2->clip) { /* Calculate where line between the two points cuts clipping surface */ pcinterp(clip, intersect, p1, p2, &c,c1,c2, v1->val, v2->val); temp = (pvtx *)malloc(sizeof(pvtx)); /* Add vertex at intersection */ temp->me = add_vertex(clip, vtxl, intersect, &c); me->numvtx++; /* point to the polygon's */ temp->next = next; /* vertex list. */ me->point->next = temp; last = temp; me->point = next; next = me->point->next; } else /* * Handle second case: * * * next vertex -> o--------o <---- current vertex * / / * / / side to clip * / / * -------------------o----------------- <------- clipping plane * / / * / / * o------------o */ if (v1->clip && v2->clip) { last->next = next; /* simply delete the current */ free(me->point); me->point = NULL; me->numvtx--; me->point = next; next = me->point->next; } else /* * Handle third case: * * * o--------o <- current vertex * / / * / / side to clip * / / * ------------------------------------- <------- clipping plane * / / * / / * o------------o <- next vertex */ if (v1->clip && !v2->clip) { pcinterp(clip, intersect, p1, p2, &c, c1, c2, v1->val, v2->val); temp = (pvtx *)malloc(sizeof(pvtx)); /* Add vertex at the */ temp->me = add_vertex(clip, vtxl, intersect, &c); temp->next = next; /* intersection point to the */ last->next = temp; /* polygon's vertex list */ free(me->point); me->point = NULL; last = temp; /* from the list. */ me->point = next; next = me->point->next; } /* fourth case: */ else /* Both vertices unclipped. */ { /* Therefore, do nothing. */ last = me->point; me->point = next; next = me->point->next; } } while (me->point != me->head); /* Do this 'til we have */ /* checked all vertices in */ /* the circular linked list. */ return me->numvtx; } void clip_init(Clip *clip) { clip->polyhedron.numpoly = 0; clip->polyhedron.head = NULL; clip->polyhedron.has = 0; clip->polyvertex.numvtx = 0; clip->polyvertex.head = NULL; clip->side = CLIP_LE; clip->level = 0.0; clip->clipfunc = dot; } void clip_destroy(Clip *clip) { #ifdef notyet poly *po, *nextpo; vertex *v, *nextv; for(po = clip->polyhedron.head; po != NULL; po = nextpo) { nextpo = po->next; free(po); } for(v = clip->polyvertex.head; v != NULL; v = nextv) { nextv = v->next; free(v); } #endif clip->polyhedron.numpoly = 0; clip->polyhedron.head = NULL; clip->polyhedron.has = 0; clip->polyvertex.numvtx = 0; clip->polyvertex.head = NULL; } void setClipPlane(Clip *clip, float *coeff, float level) { memcpy(clip->surf, coeff, MAXDIM * sizeof(float)); clip->level = level; } void setSide(Clip *clip, int side) { clip->side = side; } void clip_vertices(Clip *clip) { vertex *point; for(point = clip->polyvertex.head; point != NULL; point = point->next) { point->val = (*clip->clipfunc)(clip, point->coord) - clip->level; point->clip = (clip->side == CLIP_LE) ? (point->val > -EPS) : (point->val < EPS); } } /* Find the range of function values over all vertices */ int span_vertices(Clip *clip, float *minp, float *maxp) { vertex *point; float min, max, val; *minp = *maxp = 0; point = clip->polyvertex.head; if(point == NULL) return 0; min = max = (*clip->clipfunc)(clip, point->coord); for(point = clip->polyvertex.head; point != NULL; point = point->next) { val = (*clip->clipfunc)(clip, point->coord); if(clip->side != CLIP_LE) val = -val; if(min > val) min = val; else if(max < val) max = val; } *minp = min; *maxp = max; return 1; } void clip_polygons(Clip *clip, vertex_list *vtxl) { poly *point; vertex **vertex_set; vertex_set = (vertex **)malloc(vtxl->numvtx * sizeof(vertex)); { int count = 0; vertex *vert; vert = vtxl->head; while(vert!=NULL) { vertex_set[count] = vert; vert = vert->next; count++; } } point = clip->polyhedron.head; clip->polyhedron.point = point; while (point!=NULL) { point->clipped = find_unclipped_vertex(point->me, vertex_set); if(!point->clipped) { point->numvtx = clip_each_vertex(clip, point->me, vtxl, vertex_set); } point = point->next; /* the list. */ } clip->polyhedron.point = point; } void refresh_vertex_list(Clip *clip, vertex_list *vtxl) { int count = 0; vtxl->point = vtxl->head; while (vtxl->point != NULL) { if (!vtxl->point->clip) { vtxl->point->num = count; /* Count number of vertices remaining */ count++; /* after clip and give each vertex a */ } /* new reference number. */ vtxl->point = vtxl->point->next; } vtxl->numvtx = count; } void refresh_poly_list(Clip *clip, poly_list *pl) { int count = 0; poly *point; point = pl->head; while (point != NULL) { if (!point->clipped) /* Count number of polygons remaining */ count++; /* after clip. */ point=point->next; } pl->numpoly = count; } void do_clip(Clip *clip) { if(clip->polyvertex.numvtx!=0) { clip_vertices(clip); /* mark appropriate vertices as clipped */ clip_polygons(clip, &clip->polyvertex); /* modify or remove clipped polygons */ refresh_vertex_list(clip, &clip->polyvertex); /* rearrange pointers into vertex list */ refresh_poly_list(clip, &clip->polyhedron); /* rearrange points into polygon list */ } } geomview-1.9.4/src/bin/geomutil/clip/Makefile.am0000644000175000001440000000035410622716743016445 00000000000000INCLUDES = $(default_includes) man_MANS = clip.1gv EXTRA_DIST = $(man_MANS) bin_PROGRAMS = clip clip_SOURCES = clip.c clipoogl.c clipmain.c Clip.h clip_DEPENDENCIES = $(OOGLLIB) #clip_LDFLAGS = -rpath $(libdir) LDADD = $(OOGLLIB) geomview-1.9.4/src/bin/geomutil/clip/Makefile.in0000644000175000001440000004302310665240475016457 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = clip$(EXEEXT) subdir = src/bin/geomutil/clip DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_clip_OBJECTS = clip.$(OBJEXT) clipoogl.$(OBJEXT) clipmain.$(OBJEXT) clip_OBJECTS = $(am_clip_OBJECTS) clip_LDADD = $(LDADD) am__DEPENDENCIES_1 = DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(clip_SOURCES) DIST_SOURCES = $(clip_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) man_MANS = clip.1gv EXTRA_DIST = $(man_MANS) clip_SOURCES = clip.c clipoogl.c clipmain.c Clip.h clip_DEPENDENCIES = $(OOGLLIB) #clip_LDFLAGS = -rpath $(libdir) LDADD = $(OOGLLIB) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/clip/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/clip/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done clip$(EXEEXT): $(clip_OBJECTS) $(clip_DEPENDENCIES) @rm -f clip$(EXEEXT) $(LINK) $(clip_OBJECTS) $(clip_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clip.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clipmain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clipoogl.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-binPROGRAMS install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomutil/clip/clip.1gv0000644000175000001440000001113110600600312015726 00000000000000.TH CLIP 1gv "23 November 1994" "Geometry Center" .SH NAME clip \- Clip an OOGL object against planes or other surfaces .SH SYNOPSIS \fBclip\fP [\fB\-v\fP \fIaxisx,y,z,...\fP] .br [\fB\-g\fP \fIvalue-or-point\fP] [\fB\-l\fP \fIvalue-or-point\fP] .br [\fB\-s\fP \fInstrips\fP[,\fIfraction\fP]] [\fB\-e\fP] .br [\fB-sph\fP \fIcenterx,y,z,...\fP] [\fB\-cyl\fP \fIcenterx,y,z,...\fP] .br [\fIooglfile\fP] .SH DESCRIPTION \fBClip\fP, adapted from Daeron Meyer's \fBginsu\fP module, allows clipping an OOGL object against planes, spheres, or cylinders from the UNIX command line. Its input can come from a file or standard input; output is written to standard output. .LP Options specify a function of space position; the output is the portion of the object where the function is greater or less than some given value, or the portion lying between two values. Alternatively, an object can be sliced into equally-spaced strips. Objects may be of any dimension (but see the BUGS section). .LP Options are: .IP "\fB\-g\fP \fIvalue-or-point\fP" .IP "\fB\-l\fP \fIvalue-or-point\fP" Select the portion of the object where the function is greater than (\fB\-g\fP) or less than (\fB\-l\fP) the given value. If both are specified, the result is the portion of the object satisfying both conditions. If, rather than a single number, the argument to \fB\-l\fP or \fB\-g\fP is a point (a series of x,y,z,... values separated by commas, with no embedded blanks), then the clipping surface is one chosen to pass through that point. .IP "\fB\-v\fP \fIaxisx,y,z,...\fP" Specifies a direction in space. For planar clipping (the default), it's the plane normal direction; the clipping function is the inner product between the direction vector and the point on the object. For cylindrical clipping, \fB\-v\fP specifies the direction of the cylinder's axis; the clipping function is the distance from the axis. .IP "\fB\-sph\fP \fIcenterx,y,z,...\fP" Clip against spheres centered on \fIx,y,z,...\fP. The clipping function is the distance from the given center. Coordinates must be separated by commas without intervening spaces. .IP "\fB\-cyl\fP \fIcenterx,y,z,...\fP" Clip against cylinders with an axis passing through \fIcenterx,y,z,...\fP, with axis direction given by the \fB\-v\fP option. The clipping function is the distance from the axis. .IP "\fB\-s\fP \fInslices\fP[,\fIfraction\fP]" Clip an object into a series of \fInslices\fP ribbons spanning its entire extent -- the range of function-values over the object. Part of each ribbon is omitted; the \fIfraction\fP, default .5, sets the width of the visible part of a ribbon compared to the ribbon period. There are a total of (\fInslices\fP+\fIfraction\fP-1) ribbon periods across the object, so e.g. \fB\-s\ 2,.5\fP slices the object into equal thirds, omitting the middle third. The output OOGL object is a LIST of OFFs, one per ribbon. .IP "\fB\-e\fP" Don't emit a clipped OOGL object, just print two numbers, listing the minimum and maximum function values for the object. If \fB\-g\fP or \fB\-l\fP clipping options are specified, the object is clipped before determining the function range. If none of the object remains, \fBclip\fP prints "0 0". .SH "EXAMPLES" To extract the portion of an object lying below the x+y+z=1 plane: clip -l 1 -v 1,1,1 file.oogl > portion.oogl To extract the portion of an object lying in the positive octant and below the x+y+z=1 plane, we can pipe multiple instances of \fBclip\fP together to find the intersection of several half-spaces: clip -g 0 -v 1,0,0 file.oogl | \\ clip -g 0 -v 0,1,0 | \\ clip -g 0 -v 0,0,1 | \\ clip -l 1 -v 1,1,1 > portion.oogl To find the region lying between two surfaces (either above one and below the other, or below the first and above the second), say the planes 2x + y -.5z = 1 and y + 2z = 0: echo "{ LIST" clip -v 2,1,-.5 -g 1 file.oogl | clip -v 0,1,2 -l 0 clip -v 2,1,-.5 -l 1 file.oogl | clip -v 0,1,2 -g 0 echo "}" We use pipelines to compute intersections, and a LIST to form their union. .SH "SEE ALSO" ginsu(1) .SH BUGS Uses anytooff(1) to convert input data to OFF format internally; this can lose information. The only arbitrary-dimensional form accepted at present is nOFF, not nSKEL or nMESH. However the four-dimensional 4OFF, 4QUAD, 4MESH, 4VECT, etc. formats should work. .LP \fBClip\fP really only clips edges. If a curved clipping surface cuts an edge twice, or removes only an interior portion of some polygon, \fBclip\fP misses it entirely. Clipping against a curved surface yields a straight edge (a chord of the ideal curved edge segment). This latter failing might be fixed someday. geomview-1.9.4/src/bin/geomutil/oogl2vrml/0000777000175000001440000000000010665240702015461 500000000000000geomview-1.9.4/src/bin/geomutil/oogl2vrml/oogl2vrml.c0000644000175000001440000003353710560447540017502 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* OOGL to VRML converter * by Tamara Munzner */ #include #include #include "geom.h" #include "transform.h" #include "polylistP.h" #include "vectP.h" #include "sphere.h" #include "commentP.h" #include "plutil.h" #ifdef DEBUG # undef DEBUG # define DEBUG(expr) (expr) #else # define DEBUG(expr) /*nothing*/ #endif FILE *f = NULL; Appearance *ap = NULL; int bezdice = 0; struct linkap { Appearance *ap; struct linkap *prev; }; struct linkap *toplap; void faceindex(PolyList *plist) { int i,j; Poly *pl = NULL; Vertex *base = plist->vl; for (i = 0, pl = plist->p; i < plist->n_polys; i++, pl++) { for (j = 0; j < pl->n_vertices; j++) { fprintf(f, " %d, ", (int) (pl->v[j]-base) ); } fprintf(f, " -1,\n "); } } void plisttoindface(Geom *pgeom) { PolyList *plist = (PolyList *)pgeom; Poly *pl = NULL; Vertex *v = NULL; int i; int shading = toplap->ap->shading; /* Vertices */ fprintf(f, " Coordinate3 { point [\n"); for (i = 0, v = plist->vl; i < plist->n_verts; i++, v++) { fprintf(f, " %g %g %g, ", v->pt.x, v->pt.y, v->pt.z); } fprintf(f, "] } \n"); /* Normals */ if (shading == APF_FLAT) { PolyListComputeNormals(plist, PL_HASPN); fprintf(f, "NormalBinding { value PER_FACE }\n"); DEBUG(fprintf(stderr, " per face normals! \n")); fprintf(f, " Normal { vector [ "); for (i = 0, pl= plist->p; i < plist->n_polys; i++, pl++) { fprintf(f, " %g %g %g, ", pl->pn.x, pl->pn.y, pl->pn.z); } fprintf(f, "] }\n"); } else if (shading == APF_SMOOTH) { PolyListComputeNormals(plist, PL_HASVN); fprintf(f, "NormalBinding { value PER_VERTEX_INDEXED }\n"); DEBUG(fprintf(stderr, " per vertex normals! \n")); fprintf(f, " Normal { vector [ "); for (i = 0, v = plist->vl; i < plist->n_verts; i++, v++) { fprintf(f, " %g %g %g, ", v->vn.x, v->vn.y, v->vn.z); } fprintf(f, "] }\n"); } /* Colors */ if (plist->geomflags & PL_HASVCOL && plist->geomflags & PL_HASPCOL) { if (shading == APF_FLAT) { plist->geomflags &= ~PL_HASVCOL; } else { plist->geomflags &= ~PL_HASPCOL; } } /* Appearance diffuse color overrides object colors */ /* We don't rely on the override bit, since Geomview never sets it when saving files. */ if (toplap->ap->mat && toplap->ap->mat->valid & MTF_DIFFUSE) { plist->geomflags &= ~(PL_HASPCOL|PL_HASVCOL); } if (plist->geomflags & PL_HASPCOL) { fprintf(f, "MaterialBinding { value PER_FACE }\n"); fprintf(f, " Material { diffuseColor [ "); for (i = 0, pl= plist->p; i < plist->n_polys; i++, pl++) { fprintf(f, " %g %g %g, ", pl->pcol.r, pl->pcol.g, pl->pcol.b); } fprintf(f, "] }\n"); } else if (plist->geomflags & PL_HASVCOL) { fprintf(f, "MaterialBinding { value PER_VERTEX_INDEXED }\n"); fprintf(f, " Material { diffuseColor [ "); for (i = 0, v = plist->vl; i < plist->n_verts; i++, v++) { fprintf(f, " %g %g %g, ", v->vcol.r, v->vcol.g, v->vcol.b); } fprintf(f, "] }\n"); } else if (toplap->ap->mat && toplap->ap->mat->valid & MTF_DIFFUSE) { /* reset color to backstop */ fprintf(f, "Material { diffuseColor [ %g %g %g ] } ", toplap->ap->mat->diffuse.r, toplap->ap->mat->diffuse.g, toplap->ap->mat->diffuse.b); } /* Connectivity */ /* wish we could DEF fields not just nodes, then wouldn't waste bandwidth with 3 chunks of identical numbers */ fprintf(f," IndexedFaceSet {\n "); fprintf(f, " coordIndex [ \n"); faceindex(plist); fprintf(f, " ] # end coordIndex \n "); if (shading != APF_FLAT) { fprintf(f, " normalIndex [ \n"); faceindex(plist); fprintf(f, " ] # end normalIndex \n "); if (plist->geomflags & PL_HASVCOL) { fprintf(f, " materialIndex [ \n"); faceindex(plist); fprintf(f, " ] # end materialIndex \n "); } } fprintf(f, " } # end IndexedFaceSet \n "); } void lineindex(Vect *pline) { int i,j; int n = 0; for (i = 0; i < pline->nvec; i++) { for (j = 0; j < pline->vnvert[i]; j++) { fprintf(f, " %d, ", n++); } fprintf(f, " -1,\n "); } } void plinetoindline(Geom *pgeom) { Vect *pline = (Vect *)pgeom; HPoint3 *v = NULL; int i, j, n; /* Vertices */ fprintf(f, " Coordinate3 { point [\n"); for (i = 0, v = pline->p; i < pline->nvert; i++, v++) { fprintf(f, " %g %g %g, ", v->x, v->y, v->z); } fprintf(f, "] } \n"); /* Colors */ if (toplap->ap->mat && toplap->ap->mat->valid & MTF_EDGECOLOR) pline->ncolor = 0; if (pline->ncolor >= 1) { if (pline->ncolor > 1) fprintf(f, " MaterialBinding { value PER_VERTEX_INDEXED } "); fprintf(f, " Material { diffuseColor [ "); for (i = 0; i < pline->ncolor; i++) { fprintf(f, " %g %g %g, ", pline->c[i].r, pline->c[i].g, pline->c[i].b); } fprintf(f, "] }\n"); } else if (toplap->ap && toplap->ap->mat && toplap->ap->mat->valid & MTF_EDGECOLOR) { fprintf(f, " Material { diffuseColor [ %g %g %g ] }\n", toplap->ap->mat->edgecolor.r, toplap->ap->mat->edgecolor.g, toplap->ap->mat->edgecolor.b); } /* Connectivity */ fprintf(f," IndexedLineSet {\n "); fprintf(f, " coordIndex [ \n"); lineindex(pline); fprintf(f, " ] # end coordIndex \n "); /* appearance edgecolor overrides per-vertex colors */ if (pline->ncolor > 1) { fprintf(f, " materialIndex [\n"); n = -1; for (i = 0; i < pline->nvec; i++) { if (pline->vncolor[i] == 1) n++; for (j = 0; j < pline->vnvert[i]; j++) { fprintf(f, " %d, ", n); if (pline->vncolor[i] > 1) n++; } fprintf(f, " -1,\n "); } fprintf(f, " ] # end materialIndex \n "); } fprintf(f, " } # end IndexedLineSet \n "); } void printxform(Transform T) { if (T && memcmp(T, TM_IDENTITY, sizeof(Transform)) != 0) { fprintf(f, " MatrixTransform { matrix \n"); fputtransform(f, 1, &T[0][0], 0); fprintf(f, " } \n"); } } void doap(Appearance *a) { if (a->mat && a->mat->valid) { Material *m = a->mat; float ka, kd, ks; ka = (m->valid & MTF_Ka) ? m->ka : 1.0; kd = (m->valid & MTF_Kd) ? m->kd : 1.0; ks = (m->valid & MTF_Ks) ? m->ks : 1.0; fprintf(f, "Material { "); if (m->valid & MTF_EMISSION) fprintf(f, "emissiveColor %g %g %g \n", m->emission.r, m->emission.g, m->emission.b); if (m->valid & MTF_AMBIENT) fprintf(f, "ambientColor %g %g %g \n", ka*m->ambient.r, ka*m->ambient.g, ka*m->ambient.b); if (m->valid & MTF_DIFFUSE) fprintf(f, "diffuseColor %g %g %g \n", kd*m->diffuse.r, kd*m->diffuse.g, kd*m->diffuse.b); if (m->valid & MTF_SPECULAR) fprintf(f, "specularColor %g %g %g \n", ks*m->specular.r, ks*m->specular.g, ks*m->specular.b); if (m->valid & MTF_SHININESS) fprintf(f, "shininess %g ", m->shininess); if (m->valid & MTF_ALPHA) fprintf(f, "transparency %g ", 1.0 - m->diffuse.a); fprintf(f, "} #end Material \n"); } if (a->lighting) { LtLight **lp, *l; int i; LM_FOR_ALL_LIGHTS(a->lighting, i,lp) { l = *lp; fprintf(f, "PointLight { on TRUE "); fprintf(f, "color %g %g %g ", l->color.r * l->intensity, l->color.g * l->intensity, l->color.b * l->intensity); fprintf(f, "location %g %g %g }\n", l->position.x,l->position.y,l->position.z); } } } void pushap(Appearance *nap) { struct linkap *newlap = (struct linkap *) malloc(1 * sizeof(struct linkap)); newlap->ap = NULL; newlap->ap = ApCopy(nap, newlap->ap); newlap->prev = toplap; toplap = newlap; } void popap() { struct linkap *oldlap = toplap; toplap = oldlap->prev; ApDelete(oldlap->ap); free(oldlap); } static void traverse(Geom *where) { Geom *new = NULL; Geom *tlist = NULL; Appearance *a, *nap = NULL; Transform T; char usename[16]; char *name = NULL; static int unique = -1; if (!where) return; /* Appearances: We need certain values for our own internal use (shading, diffuse material) so we have to keep a stack of appearances around. But we refrain from printing out the entire contents of the appearance on top of the stack at every level to save both cycles and bandwidth. So we just print out new appearances in doap, secure that Separator nodes will isolate their effects. */ GeomGet(where, CR_APPEAR, &a); if (a) { fprintf(f, "Separator {\n"); doap(a); nap = ApMerge(a, toplap->ap, 0); pushap(nap); } name = GeomName(where); if (!strcmp(name, "polylist")) { /* Might have internal Materials, isolate with Separator */ fprintf(f, "Separator {\n"); plisttoindface(where); fprintf(f, " } # end Separator \n"); } else if (!strcmp(name, "vect")) { /* Might have internal Materials, isolate with Separator */ fprintf(f, "Separator {\n"); plinetoindline(where); fprintf(f, " } # end Separator \n"); } else if (!strcmp(name, "sphere")) { fprintf(f, " Sphere { radius %g }\n", SphereRadius( (Sphere *)where)); } else if (!strcmp(name, "comment")) { if (!strcmp(((Comment *)where)->type, "WWWInline")) { fprintf(f, "WWWInline { name \"%s\" bboxSize 0 0 0 bboxCenter 0 0 0 }\n", ((Comment *)where)->data); } else if (!strcmp(((Comment *)where)->type, "HREF")) { /* no-op. we've already dealt with it at level of its list or inst parent. */ } } else if (!strcmp(name, "list")) { /* must lookahead due to fundamental structural difference between weboogl and vrml: in weboogl, anchors affect siblings and parent. in vrml, anchors affect children. immediate child might be HREF comment, in which case we need to write out a WWWAnchor node up here not down inside of list when we would normally come across it. */ Geom *child = NULL; char *newname; int anchor = 0; new = where; while(new) { GeomGet(new, CR_CAR, &child); newname = GeomName(child); if (newname && !strcmp(newname, "comment") && !strcmp( ((Comment *)child)->type, "HREF")) { fprintf(f, "WWWAnchor { name \"%s\"\n", ((Comment *)child)->data); anchor = 1; } GeomGet(new, CR_CDR, &child); new = child; } /* done with lookahead, now really go through the list */ new = where; while(new) { GeomGet(new, CR_CAR, &child); traverse(child); GeomGet(new, CR_CDR, &child); new = child; } if (anchor) fprintf(f, " } # end WWWAnchor \n"); } else if (!strcmp(name, "inst")) { GeomGet(where, CR_GEOM, &new); if (!new) return; GeomGet(where, CR_TLIST, &tlist); if (!tlist) { /* a single xform */ fprintf(f, "Separator { \n"); GeomGet(where, CR_AXIS, &T); printxform(T); traverse(new); fprintf(f, "} #end Separator\n"); } else { /* multiple xforms We'll DEF the geometry for multiple USEs, but we must output the first xform before DEFing the geometry. NextTransform loops through the list of xforms, after the cryptic but crucial set-up call to GeomIterate. */ GeomIter *it = GeomIterate( (Geom *)tlist, DEEP ); NextTransform( it, T ); fprintf(f, "Separator { \n"); printxform(T); sprintf(usename, "instgeom%d", ++unique); fprintf(f, " DEF %s Separator { ", usename); traverse(new); fprintf(f, " } #end DEF \n } #end Separator \n"); while(NextTransform( it, T )) { fprintf(f, "Separator { \n"); printxform(T); fprintf(f, " USE %s\n } #end Separator \n", usename); } } } else { if ((!strcmp(name, "bezier") || !strcmp(name, "bezierlist")) && bezdice) GeomDice(where, bezdice, bezdice); /* Convert to all other geometric primitives to OFF. */ new = AnyToPL(where, TM_IDENTITY); /* Might have internal Materials, isolate with Separator */ fprintf(f, "Separator { \n"); plisttoindface(new); fprintf(f, " } # end Separator \n"); } if (a) { fprintf(f, " } # end Separator \n"); popap(); } } int main(int argc, char *argv[]) { Geom *g; int flat = 1; f = stdout; while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { if (argv[1][1] == 'b') { bezdice = atoi(argv[2]); argc--; argv++; } else if (argv[1][1] == 's') { flat = 0; } argc--; argv++; } if(argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { fprintf(stderr, "\ Usage: %s [filename] -- convert OOGL file to VRML format\n\ Writes to standard output. Reads from stdin if no file specified.\n", argv[0]); exit(1); } pushap(ApCreate(AP_SHADING, flat ? APF_FLAT : APF_SMOOTH, AP_END)); if(argc <= 1) { argv[1] = "-"; } g = strcmp(argv[1], "-") ? GeomLoad(argv[1]) : GeomFLoad(iobfileopen(stdin), "standard input"); fprintf(f, "#VRML V1.0 ascii\n"); fprintf(f, "Separator {\n"); fprintf(f, " ShapeHints {vertexOrdering COUNTERCLOCKWISE faceType CONVEX}\n"); traverse(g); fprintf(f, "} # end final Separator\n"); return 0; } geomview-1.9.4/src/bin/geomutil/oogl2vrml/oogl2vrml2.c0000644000175000001440000004421310560447561017560 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* OOGL to VRML converter * by Tamara Munzner */ #include #include #include "geom.h" #include "transform.h" #include "polylistP.h" #include "vectP.h" #include "sphere.h" #include "commentP.h" #include "plutil.h" #ifdef DEBUG # undef DEBUG # define DEBUG(expr) (expr) #else # define DEBUG(expr) /*nothing*/ #endif FILE *f = NULL; Appearance *ap = NULL; int bezdice = 0; struct linkap { Appearance *ap; struct linkap *prev; }; struct linkap *toplap; static void doap(Appearance *a); static int indent = 0; void fprintfindent(FILE *f, char *fmt, ...) { va_list ap; fprintf(f, "%*s", indent, ""); va_start(ap, fmt); vfprintf(f, fmt, ap); va_end(ap); } void fprintfindentinc(FILE *f, char *fmt, ...) { va_list ap; fprintf(f, "%*s", indent, ""); va_start(ap, fmt); vfprintf(f, fmt, ap); va_end(ap); indent += 2; } void fprintfdecindent(FILE *f, char *fmt, ...) { va_list ap; indent -= 2; fprintf(f, "%*s", indent, ""); va_start(ap, fmt); vfprintf(f, fmt, ap); va_end(ap); indent += 2; } #define PRINT_PADDING(f, padding) \ fprintf((f), "%*s", (int)(indent + (padding)), "") void faceindex(PolyList *plist) { int i,j; Poly *pl = NULL; Vertex *base = plist->vl; for (i = 0, pl = plist->p; i < plist->n_polys; i++, pl++) { for (j = 0; j < pl->n_vertices; j++) { fprintf(f, " %d", (int) (pl->v[j]-base) ); } fprintf(f, " -1"); if (i != plist->n_polys-1) { fprintf(f, ","); if (i & 1) { fprintf(f, "\n"); PRINT_PADDING(f, strlen("coordIndex [")); } } } } void plisttoindface(Geom *pgeom) { PolyList *plist = (PolyList *)pgeom; Poly *pl = NULL; Vertex *v = NULL; int i; int shading = toplap->ap->shading; /* Appearance */ doap(toplap->ap); /* Geometry */ fprintfindentinc(f, "geometry IndexedFaceSet {\n"); fprintfindent(f, "solid FALSE\n"); /* 'cause we don't know */ fprintfindent(f, "ccw TRUE\n"); fprintfindent(f, "convex TRUE\n"); /* is this true? */ fprintfindent(f, "normalPerVertex %s\n", shading == APF_FLAT ? "FALSE" : "TRUE"); fprintfindent(f, "colorPerVertex %s\n", plist->geomflags & PL_HASVCOL ? "TRUE" : "FALSE"); /* Vertices */ fprintfindentinc(f, "coord Coordinate {\n"); fprintfindent(f, "point ["); for (i = 0, v = plist->vl; i < plist->n_verts; i++, v++) { fprintf(f, " %g %g %g", v->pt.x, v->pt.y, v->pt.z); if (i != plist->n_verts-1) { fprintf(f, ","); if (i & 1) { fprintf(f, "\n"); PRINT_PADDING(f, strlen("point [")); } } } fprintfindent(f, "]\n"); fprintfdecindent(f, "}\n"); /* Normals */ fprintfindentinc(f, "normal Normal {\n"); fprintfindent(f, "vector ["); if (shading == APF_FLAT) { PolyListComputeNormals(plist, PL_HASPN); for (i = 0, pl= plist->p; i < plist->n_polys; i++, pl++) { fprintf(f, " %g %g %g", pl->pn.x, pl->pn.y, pl->pn.z); if (i != plist->n_polys-1) { fprintf(f, ","); if (i & 1) { fprintf(f, "\n"); PRINT_PADDING(f, strlen("vector [")); } } } } else if (shading == APF_SMOOTH) { PolyListComputeNormals(plist, PL_HASVN); for (i = 0, v = plist->vl; i < plist->n_verts; i++, v++) { fprintf(f, " %g %g %g", v->vn.x, v->vn.y, v->vn.z); if (i != plist->n_verts-1) { fprintf(f, ","); if (i & 1) { fprintf(f, "\n"); PRINT_PADDING(f, strlen("vector [")); } } } } fprintf(f, " ]"); fprintfdecindent(f, "}\n"); /* Colors */ if (plist->geomflags & PL_HASVCOL && plist->geomflags & PL_HASPCOL) { if (shading == APF_FLAT) { plist->geomflags &= ~PL_HASVCOL; } else { plist->geomflags &= ~PL_HASPCOL; } } /* Appearance diffuse color overrides object colors */ /* We don't rely on the override bit, since Geomview never sets it when saving files. */ if (toplap->ap->mat && toplap->ap->mat->valid & MTF_DIFFUSE) { plist->geomflags &= ~(PL_HASPCOL|PL_HASVCOL); } if (plist->geomflags & PL_HASPCOL) { fprintfindentinc(f, "color Color {\n"); fprintfindent(f, "RGB ["); for (i = 0, pl= plist->p; i < plist->n_polys; i++, pl++) { fprintf(f, " %g %g %g", pl->pcol.r, pl->pcol.g, pl->pcol.b); if (i != plist->n_polys-1) { fprintf(f, ","); if (i & 1) { printf("\n"); PRINT_PADDING(f, strlen("RGB [")); } } } fprintf(f, " ]\n"); fprintfdecindent(f, "}\n"); } else if (plist->geomflags & PL_HASVCOL) { fprintfindentinc(f, "color Color {\n"); fprintfindent(f, "RGB ["); for (i = 0, v = plist->vl; i < plist->n_verts; i++, v++) { fprintf(f, " %g %g %g", v->vcol.r, v->vcol.g, v->vcol.b); if (i != plist->n_verts-1) { fprintf(f, ","); if (i & 1) { printf("\n"); PRINT_PADDING(f, strlen("RGB [")); } } } fprintfindent(f, "]\n"); fprintfdecindent(f, "}\n"); } /* Connectivity, VRML 2 does not need extra-indices for colors and normals, it is able to use the vertex indices. */ fprintfindent(f, "coordIndex ["); faceindex(plist); fprintfindent(f, " ] # end coordIndex\n"); fprintfdecindent(f, "} # end IndexedFaceSet\n"); } void lineindex(Vect *pline) { int i,j; int n = 0; for (i = 0; i < pline->nvec; i++) { for (j = 0; j < pline->vnvert[i]; j++) { fprintf(f, " %d, ", n++); } fprintf(f, " -1,\n "); } } void plinetoindline(Geom *pgeom) { Vect *pline = (Vect *)pgeom; HPoint3 *v = NULL; int i, j, n; /* Appearance */ doap(toplap->ap); /* Vertices */ fprintfindentinc(f, "geometry IndexedLineSet {\n"); fprintfindentinc(f, "coord Coordinate {\n"); fprintfindent(f, "point [\n"); for (i = 0, v = pline->p; i < pline->nvert; i++, v++) { fprintf(f, " %g %g %g", v->x, v->y, v->z); if (i != pline->nvert-1) { fprintf(f, ","); if (i & 1) { fprintf(f,"\n"); PRINT_PADDING(f, strlen("point [")); } } } fprintfindent(f, "\n"); fprintfdecindent(f, "}\n"); /* Colors */ if (toplap->ap->mat && toplap->ap->mat->valid & MTF_EDGECOLOR) pline->ncolor = 0; if (pline->ncolor >= 1) { if (pline->ncolor > 1) fprintfindent(f, "colorPerVertex TRUE\n"); else fprintfindent(f, "colorPerVertex FALSE\n"); fprintfindentinc(f, "color Color {\n"); fprintfindent(f, "RGB ["); for (i = 0; i < pline->ncolor; i++) { fprintf(f, " %g %g %g", pline->c[i].r, pline->c[i].g, pline->c[i].b); if (i != pline->ncolor-1) { fprintf(f, ","); if (i & 1) { printf("\n"); PRINT_PADDING(f, strlen("RGB [")); } } } fprintf(f, " ]\n"); fprintfdecindent(f, "}\n"); } /* Connectivity */ fprintfindent(f, "coordIndex [ \n"); lineindex(pline); fprintfindent(f, " ] # end coordIndex \n "); /* appearance edgecolor overrides per-vertex colors */ if (pline->ncolor > 1) { fprintfindent(f, "colorIndex [\n"); n = -1; for (i = 0; i < pline->nvec; i++) { if (pline->vncolor[i] == 1) n++; for (j = 0; j < pline->vnvert[i]; j++) { fprintf(f, " %d, ", n); if (pline->vncolor[i] > 1) n++; } fprintf(f, " -1,\n "); } fprintfindent(f, "] # end materialIndex \n "); } fprintfdecindent(f, "} # end IndexedLineSet \n "); } static double det(double (*T)[3]) { return (T[0][0]*T[1][1]*T[2][2] + T[1][0]*T[2][1]*T[0][2] + T[2][0]*T[0][1]*T[1][2] - T[2][0]*T[1][1]*T[0][2] - T[1][0]*T[0][1]*T[2][2] - T[0][0]*T[2][1]*T[1][2]); } static double getaxis(double (*mat)[3], double *axis) { double tmp[3][3], ortho[3], tortho[3], det, max = 0.0; int i, j, maxi = 0, maxj = 0; int i0, i1, i2, j0, j1; for (i = 0; i < 3; i++) { tmp[i][i] = mat[i][i] - 1.0; for (j = 0; j < 3; j++) { if (i != j) { tmp[i][j] = mat[i][j]; } i0 = (i+1) % 3; i1 = (i+2) % 3; j0 = (j+1) % 3; j1 = (j+2) % 3; det = tmp[i0][j0]*tmp[i1][j1] - tmp[i1][j0]*tmp[i0][j1]; if (fabs(det) > fabs(max)) { max = det; maxi = i; maxj = j; } } } i0 = (maxi+1) % 3; i1 = (maxi+2) % 3; j0 = (maxj+1) % 3; j1 = (maxj+2) % 3; axis[maxj] = 1.0; det = max; if (fabs(det) < 1e-12) { axis[j0] = axis[j1] = 0.0; return 0.0; } axis[j0] = (+ tmp[i1][j1]*tmp[i0][maxj] - tmp[i0][j1]*tmp[i1][maxj]) / det; axis[j1] = (- tmp[i1][j0]*tmp[i0][maxj] + tmp[i0][j0]*tmp[i1][maxj]) / det; i0 = 0; i1 = 1; i2 = 2; if (fabs(axis[i0]) < fabs(axis[i1])) { i = i0; i0 = i1; i1 = i; } if (fabs(axis[i0]) < fabs(axis[i2])) { i = i0; i0 = i2; i2 = i; } if (fabs(axis[i1]) < fabs(axis[i2])) { i = i1; i1 = i2; i2 = i; } axis[0] /= axis[i0]; axis[1] /= axis[i0]; axis[2] /= axis[i0]; ortho[i0] = 0.0; ortho[i2] = 1.0; if (fabs(axis[i1]) > 1e-12) { ortho[i1] = -axis[i2]/axis[i1]; } else { ortho[i1] = 1.0; } #define SCP(v, w) (v[0]*w[0]+v[1]*w[1]+v[2]*w[2]) #define NRM2(v) SCP(v,v) tortho[0] = SCP(mat[0], ortho); tortho[1] = SCP(mat[1], ortho); tortho[2] = SCP(mat[2], ortho); return acos(SCP(ortho,tortho)/NRM2(ortho)); } void printxform(Transform T) { int i, j; double scale; double mat[3][3]; double axis[3], angle; if (T && memcmp(T, TM_IDENTITY, sizeof(Transform)) != 0) { /* * Brain-Dead (tm) VRML 2.0 doesn't know about MatrixTransform. * That's very sad. * * We only support uniform scalings, rotations and translations * Anything fancy created by the transformer yields undefined * results. */ for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) mat[i][j] = T[i][j]; scale = pow(det(mat), 1.0/3.0); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { mat[i][j] /= scale; } } angle = getaxis(mat, axis); fprintfindent(f, "scale %g %g %g\n", scale, scale, scale); fprintfindent(f, "rotation %g %g %g %g\n", axis[0], axis[1], axis[2], angle); fprintfindent(f, "translation %g %g %g\n", T[3][0], T[3][1], T[3][2]); } } static void doap(Appearance *a) { if (a->mat && a->mat->valid) { Material *m = a->mat; float ka, kd, ks; ka = (m->valid & MTF_Ka) ? m->ka : 1.0; kd = (m->valid & MTF_Kd) ? m->kd : 1.0; ks = (m->valid & MTF_Ks) ? m->ks : 1.0; fprintfindentinc(f, "appearance Appearance {\n"); fprintfindentinc(f, "material Material {\n"); if (m->valid & MTF_AMBIENT) fprintfindent(f, "ambientIntensity %g\n", ka); if (m->valid & MTF_DIFFUSE) fprintfindent(f, "diffuseColor %g %g %g\n", kd*m->diffuse.r, kd*m->diffuse.g, kd*m->diffuse.b); if (m->valid & MTF_EMISSION) fprintfindent(f, "emissiveColor %g %g %g\n", m->emission.r, m->emission.g, m->emission.b); if (m->valid & MTF_SPECULAR) fprintfindent(f, "specularColor %g %g %g\n", ks*m->specular.r, ks*m->specular.g, ks*m->specular.b); if (m->valid & MTF_SHININESS) fprintfindent(f, "shininess %g\n", m->shininess/128.0); if (m->valid & MTF_ALPHA) fprintfindent(f, "transparency %g\n", 1.0 - m->diffuse.a); fprintfdecindent(f, "} #end Material \n"); fprintfdecindent(f, "} # end Appearance\n"); } } #if 0 static void dolight(Appearance *a) { if (a->lighting) { LtLight **lp, *l; int i; LM_FOR_ALL_LIGHTS(a->lighting, i,lp) { l = *lp; fprintfindentinc(f, "PointLight {\n"); fprintfindent(f, "on TRUE\n"); fprintfindent(f, "color %g %g %g\n", l->color.r, l->color.g, l->color.b); fprintfindent(f, "intensity %g\n", l->intensity); fprintfindent(f, "location %g %g %g\n", l->position.x,l->position.y,l->position.z); fprintfdecindent(f, "}\n"); } } } #endif void pushap(Appearance *nap) { struct linkap *newlap = (struct linkap *) malloc(1 * sizeof(struct linkap)); newlap->ap = NULL; newlap->ap = ApCopy(nap, newlap->ap); newlap->prev = toplap; toplap = newlap; } void popap() { struct linkap *oldlap = toplap; toplap = oldlap->prev; ApDelete(oldlap->ap); free(oldlap); } static void traverse(Geom *where) { Geom *new = NULL; Geom *tlist = NULL; Appearance *a, *nap = NULL; Transform T; char usename[16]; char *name = NULL; static int unique = -1; if (!where) return; /* Appearances: We need certain values for our own internal use (shading, diffuse material) so we have to keep a stack of appearances around. But we refrain from printing out the entire contents of the appearance on top of the stack at every level to save both cycles and bandwidth. So we just print out new appearances in doap, secure that Separator nodes will isolate their effects. */ GeomGet(where, CR_APPEAR, &a); if (a) { nap = ApMerge(a, toplap->ap, 0); pushap(nap); } name = GeomName(where); if (!strcmp(name, "polylist")) { /* Might have internal Materials, isolate with Separator */ fprintfindentinc(f, "Shape {\n"); plisttoindface(where); fprintfdecindent(f, "} # end Shape\n"); } else if (!strcmp(name, "vect")) { /* Might have internal Materials, isolate with Separator */ fprintfindentinc(f, "Shape {\n"); plinetoindline(where); fprintfdecindent(f, " } # end Shape \n"); } else if (!strcmp(name, "sphere")) { fprintfindent(f, " Sphere { radius %g }\n", SphereRadius( (Sphere *)where)); } else if (!strcmp(name, "comment")) { if (!strcmp(((Comment *)where)->type, "WWWInline")) { fprintfindent(f, "Inline { url \"%s\" bboxSize 0 0 0 bboxCenter 0 0 0 }\n", ((Comment *)where)->data); } else if (!strcmp(((Comment *)where)->type, "HREF")) { /* no-op. we've already dealt with it at level of its list or inst parent. */ } } else if (!strcmp(name, "list")) { /* must lookahead due to fundamental structural difference between weboogl and vrml: in weboogl, anchors affect siblings and parent. in vrml, anchors affect children. immediate child might be HREF comment, in which case we need to write out a WWWAnchor node up here not down inside of list when we would normally come across it. */ Geom *child = NULL; char *newname; int anchor = 0; new = where; while(new) { GeomGet(new, CR_CAR, &child); newname = GeomName(child); if (newname && !strcmp(newname, "comment") && !strcmp( ((Comment *)child)->type, "HREF")) { fprintfindentinc(f, "Anchor { url \"%s\"\n", ((Comment *)child)->data); anchor = 1; } GeomGet(new, CR_CDR, &child); new = child; } /* done with lookahead, now really go through the list */ new = where; while(new) { GeomGet(new, CR_CAR, &child); traverse(child); GeomGet(new, CR_CDR, &child); new = child; } if (anchor) fprintfdecindent(f, " } # end Anchor \n"); } else if (!strcmp(name, "inst")) { GeomGet(where, CR_GEOM, &new); if (!new) return; GeomGet(where, CR_TLIST, &tlist); if (!tlist) { /* a single xform */ fprintfindentinc(f, "Transform {\n"); GeomGet(where, CR_AXIS, &T); printxform(T); fprintfindentinc(f, "children [\n"); traverse(new); fprintfdecindent(f, "] # children\n"); fprintfdecindent(f, "} # Transform\n"); } else { /* multiple xforms We'll DEF the geometry for multiple USEs, but we must output the first xform before DEFing the geometry. NextTransform loops through the list of xforms, after the cryptic but crucial set-up call to GeomIterate. */ GeomIter *it = GeomIterate( (Geom *)tlist, DEEP ); NextTransform( it, T ); fprintfindentinc(f, "Transform {\n"); printxform(T); sprintf(usename, "instgeom%d", ++unique); fprintfindent(f, "children DEF %s Group { ", usename); traverse(new); fprintfdecindent(f, "} #end Group DEF\n"); fprintfdecindent(f, "} #end Transform \n"); while(NextTransform( it, T )) { fprintfindentinc(f, "Transform {\n"); printxform(T); fprintfindent(f, "children USE %s\n", usename); fprintfdecindent(f, "} # Transform\n"); } } } else { if ((!strcmp(name, "bezier") || !strcmp(name, "bezierlist")) && bezdice) GeomDice(where, bezdice, bezdice); /* Convert to all other geometric primitives to OFF. */ new = AnyToPL(where, TM_IDENTITY); /* Might have internal Materials, isolate with Separator */ fprintfindentinc(f, "Shape {\n"); plisttoindface(new); fprintfdecindent(f, "} # end Shape\n"); } if (a) { popap(); } } int main(int argc, char *argv[]) { Geom *g; int flat = 1; f = stdout; while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { if (argv[1][1] == 'b') { bezdice = atoi(argv[2]); argc--; argv++; } else if (argv[1][1] == 's') { flat = 0; } argc--; argv++; } if(argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { fprintf(stderr, "\ Usage: %s [filename] -- convert OOGL file to VRML format\n\ Writes to standard output. Reads from stdin if no file specified.\n", argv[0]); exit(1); } pushap(ApCreate(AP_SHADING, flat ? APF_FLAT : APF_SMOOTH, AP_END)); if(argc <= 1) { argv[1] = "-"; } g = strcmp(argv[1], "-") ? GeomLoad(argv[1]) : GeomFLoad(iobfileopen(stdin), "standard input"); fprintfindent(f, "#VRML V2.0 utf8\n\n"); fprintfindentinc(f, "Group {\n"); fprintfindentinc(f, "children [\n"); traverse(g); fprintfdecindent(f, "] # children\n"); fprintfdecindent(f, "} # Group\n"); return 0; } geomview-1.9.4/src/bin/geomutil/oogl2vrml/Makefile.am0000644000175000001440000000043110622716743017435 00000000000000INCLUDES = @default_includes@ bin_PROGRAMS = oogl2vrml oogl2vrml2 man_MANS = oogl2vrml.1gv oogl2vrml_SOURCES = oogl2vrml.c oogl2vrml2_SOURCES = oogl2vrml2.c oogl2vrml2_DEPENDENCIES = $(OOGLLIB) #oogl2vrml2_LDFLAGS = -rpath $(libdir) LDADD = $(OOGLLIB) EXTRA_DIST = $(man_MANS) geomview-1.9.4/src/bin/geomutil/oogl2vrml/Makefile.in0000644000175000001440000004364410665240476017465 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = oogl2vrml$(EXEEXT) oogl2vrml2$(EXEEXT) subdir = src/bin/geomutil/oogl2vrml DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_oogl2vrml_OBJECTS = oogl2vrml.$(OBJEXT) oogl2vrml_OBJECTS = $(am_oogl2vrml_OBJECTS) oogl2vrml_LDADD = $(LDADD) am__DEPENDENCIES_1 = oogl2vrml_DEPENDENCIES = $(am__DEPENDENCIES_1) am_oogl2vrml2_OBJECTS = oogl2vrml2.$(OBJEXT) oogl2vrml2_OBJECTS = $(am_oogl2vrml2_OBJECTS) oogl2vrml2_LDADD = $(LDADD) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(oogl2vrml_SOURCES) $(oogl2vrml2_SOURCES) DIST_SOURCES = $(oogl2vrml_SOURCES) $(oogl2vrml2_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ man_MANS = oogl2vrml.1gv oogl2vrml_SOURCES = oogl2vrml.c oogl2vrml2_SOURCES = oogl2vrml2.c oogl2vrml2_DEPENDENCIES = $(OOGLLIB) #oogl2vrml2_LDFLAGS = -rpath $(libdir) LDADD = $(OOGLLIB) EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/oogl2vrml/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/oogl2vrml/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done oogl2vrml$(EXEEXT): $(oogl2vrml_OBJECTS) $(oogl2vrml_DEPENDENCIES) @rm -f oogl2vrml$(EXEEXT) $(LINK) $(oogl2vrml_OBJECTS) $(oogl2vrml_LDADD) $(LIBS) oogl2vrml2$(EXEEXT): $(oogl2vrml2_OBJECTS) $(oogl2vrml2_DEPENDENCIES) @rm -f oogl2vrml2$(EXEEXT) $(LINK) $(oogl2vrml2_OBJECTS) $(oogl2vrml2_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oogl2vrml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oogl2vrml2.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-binPROGRAMS install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomutil/oogl2vrml/oogl2vrml.1gv0000644000175000001440000000113510600600312017721 00000000000000.\" Hey, EMACS: -*- nroff -*- .TH OOGL2VRML 1gv "February 23, 2001" .SH NAME oogl2vrml \- convert OOGL to VRML .SH SYNOPSIS .B oogl2vrml .BI [-b " N" ] .BI [-s] .BI [ file ] .SH DESCRIPTION This manual page documents briefly the .B oogl2vrml command. .PP .B oogl2vrml Convert OOGL file to VRML format. Writes to standard output. Reads from stdin if no file specified. .SH SEE ALSO .BR geomview (1). .BR vrml2oogl (1). .SH AUTHOR This manual page was written by Steve Robbins , for the Debian GNU/Linux system (but may be used by others). geomview-1.9.4/src/bin/geomutil/hvectext/0000777000175000001440000000000010665240702015370 500000000000000geomview-1.9.4/src/bin/geomutil/hvectext/hvectext.1gv0000644000175000001440000000367510600600312017552 00000000000000.TH HVECTEXT 1gv "1 Nov 1996" "Geometry Center" .SH NAME hvectext \- construct Geomview VECT text object from Hershey fonts .SH SYNOPSIS .na .in +5 .ti -5 \fBhvectext\fP [\fB\-w\fP\ \fItotallength\fP] [\fB\-s\fP\ \fItextheight\fP] [\fB\-plane\ xy|xz|yz\fP] [\fB\-at\fP\ \fIX Y Z\fP] [\fB\-align\ n|s|e|w|ne|nw|se|sw|c\fP] [\fB\-hershey\fP\ \fIfontfile.gsf\fP] [\fB\-\-\fP] \fItext string ...\fP .in -5 .ad .SH DESCRIPTION \fBHvectext\fP generates a Geomview/OOGL vector-text object, of given height or total length (default \fB\-s\ .25\fP). It aligns the given 3-D point (default \fB\-at\ 0\ 0\ 0\fP) with the given corner of the text (default \fB\-align\ c\fP). Alignment specs are like geographic directions; \fB\-align\ sw\fP puts the ``at'' point at the ``southwest'' corner of the text, so that its lower left corner is at that coordinate. The corresponding VECT object is written to standard output. If no non-blank text characters are given, \fBhvectext\fP produces a null geom object ("{ }") as output. The special option \fB\-\-\fP marks the end of options; it's useful in case the text itself begins with a hyphen. \fBHvectext\fP accepts Ghostscript Hershey fonts; the built-in default is Hershey-Plain-Simplex a.k.a. hrpl_s.gsf. Others of interest: hrsy_r.gsf (Symbol), hrpl_t.gsf (Triplex). For a complete list, see all the Ghostscript font files of nontrivial size whose names begin with "hr". Although there's no way to switch fonts within the string, the first line of output from hvectext is an OOGL comment resembling: .nf # Continue with: -align sw -plane xy -s 0.25 -at 1.24378 0 0 .fi giving options for hvectext to continue the string where it left off. .SH ENVIRONMENT GS_FONTPATH, if present, is a colon-separated list of directories in which Hershey font files are sought. .SH FILES \fBperl\fP (either version 4 or 5) must be installed. \fB/usr/local/lib/ghostscript/fonts\fP is searched if \fB\-hershey\fP is given and \fBGS_FONTPATH\fP isn't set. geomview-1.9.4/src/bin/geomutil/hvectext/Makefile.am0000644000175000001440000000021610600603126017327 00000000000000man_MANS = hvectext.1gv EXTRA_DIST = $(man_MANS) bin_SCRIPTS = hvectext CLEANFILES = $(bin_SCRIPTS) all-local: hvectext chmod +x hvectext geomview-1.9.4/src/bin/geomutil/hvectext/Makefile.in0000644000175000001440000003252210665240475017364 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomutil/hvectext DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/hvectext.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = hvectext am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(bin_SCRIPTS) SOURCES = DIST_SOURCES = man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ man_MANS = hvectext.1gv EXTRA_DIST = $(man_MANS) bin_SCRIPTS = hvectext CLEANFILES = $(bin_SCRIPTS) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/hvectext/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/hvectext/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh hvectext: $(top_builddir)/config.status $(srcdir)/hvectext.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_SCRIPTS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f $$d$$p; then \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ else :; fi; \ done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; for p in $$list; do \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) $(MANS) all-local installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-binSCRIPTS install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binSCRIPTS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am uninstall uninstall-am uninstall-binSCRIPTS \ uninstall-man uninstall-man1 all-local: hvectext chmod +x hvectext # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomutil/hvectext/hvectext.in0000754000175000001440000003053010462250156017470 00000000000000: eval 'exec perl -S $0 ${1+"$@"}' if $running_under_some_shell; # Copyright (c) 1995, Geometry Center, University of Minnesota # Script by Stuart Levy, Geometry Center. # Uses Hershey fonts as encoded for Ghostscript. # This program may be freely used and redistributed so long as # this notice remains. # Configurable value: if you have Ghostscript Hershey fonts installed on your # system, you might want to set $gsfontdir to the directory where they live. # "-hershey" will seek files there if not found relative to ".". # This could be a colon-separated list of directories. $gsfontpath = $ENV{"GS_FONTPATH"} || "/usr/local/lib/ghostscript/fonts"; if (@ARGV == 0) { print STDERR "Usage: $0 [-w totallength] [-s textheight] [-plane xy|xz|yz] [-at X Y Z] [-hershey fontfile.gsf] [-align n|s|e|w|ne|nw|se|sw|c] [--] text string Generate geomview/OOGL vector-text object, of given height or total length (default -s .25), aligning the given corner of the text (default -align c (centered)) at given point (default -at 0 0 0). Accepts Ghostscript Hershey fonts; built-in default is Hershey-Plain-Simplex. "; exit(1); } @at = (0,0,0); $ujust = -.5, $vjust = -.5; $uaxis = 0, $vaxis = 1; %ax = ('x',0, 'y',1, 'z',2, 0,'x', 1,'y', 2,'z'); ($cmdline = join(" ", $0, @ARGV)) =~ s/[\000-\031\177-\377]/sprintf("\\%03o",unpack("C",$1))/eg; while(@ARGV) { if($ARGV[0] =~ /^-w/) { shift, $totallen = shift; } elsif($ARGV[0] =~ /^-s/) { shift, $height = shift; } elsif($ARGV[0] =~ /^-pl?a?n?e?/) { shift, $plane = shift; $plane =~ tr/XYZ/xyz/; $uaxis = $ax{substr($plane,0,1)}; $vaxis = $ax{substr($plane,1,1)}; unless ($uaxis != $vaxis && defined($uaxis) && defined($vaxis)) { print STDERR "$0: -plane: Expected \"xy\" or \"yz\" or \"xz\", not $plane.\n"; exit(0); } } elsif($ARGV[0] =~ /^-ali?g?n?/) { shift, $align = shift; $ujust = $vjust = -.5; $ujust = -1 if $align =~ /e/i; $ujust = 0 if $align =~ /w/i; $vjust = -1 if $align =~ /n/i; $vjust = 0 if $align =~ /s/i; unless($align =~ /^[nsewc]+$/i) { print STDERR "$0: -align: Expected some combination of letters n s e w c\n"; exit(1); } } elsif($ARGV[0] =~ /^-at/) { shift, @at = (shift,shift,shift); } elsif($ARGV[0] =~ /^-her?s?h?e?y?/) { shift, $gsfont = shift; unless (-f $gsfont) { foreach $_ (split(":", $gsfontpath)) { ($gsfont = $_), last if -f ($_ .= "/" . $gsfont); } } } elsif($ARGV[0] =~ /^--/) { shift, last; } else { last; } } $chars{"space"} = " "; while() { if(/CHARS/ .. /ENDCHARS/) { ($name, $char) = split; $chars{$name} = $char if length($char) == 1; } last if /^%END/; } if($gsfont) { local($_, $any); $any = open(INF, $gsfont); while() { last if /%END/; } if(/%END/) { $INF = 'INF'; } else { print STDERR $any ? "$gsfont isn't a Ghostscript Hershey font -- no %END tag found.\n" : "Can't open Ghostscript Hershey font file $gsfont, using default.\n"; $INF = 'DATA'; } } else { $INF = 'DATA'; } $aspect = .67; # Width/height of typical character $fontscale = 1/33.; # Hershey magic scale factor while(<$INF>) { ($char, $xmin, $width, $codes) = (m'^/(\S+)\s*\[(\S+) (\S+) \(([^)]*)'); $char = $chars{$char} if length($char) > 1; next unless defined($char); $code{$char} = "$xmin,$width,$codes"; } $string = join(" ", @ARGV); (print STDERR "$0: No string given?\n"), exit(1) unless $string ne ""; %escapes = ("n", "\n", "b", "\b", "r", "\r", "e", "\e"); $string =~ s/\\([^0-7])/defined($escapes{$1}) ? $escapes{$1} : $1/eg; $string =~ s/\\([0-7][0-7]?[0-7]?)/pack("C",oct($1))/eg; $stringwidth = 0; foreach $char (split("", $string)) { ($xmin,$xmax) = ($code{$char} =~ /([^,]+),([^,]+)/); $stringwidth += $xmax - $xmin; } $stringwidth = 1 unless $stringwidth; if($totallen) { $strscale = $totallen / $stringwidth; $height = $strscale * $aspect / $fontscale; } else { $height = 0.25 unless($height>0); $strscale = $fontscale * $height / $aspect; $totallen = $strscale * $stringwidth; } @path = (); @counts = (); # Interpret chars in string. # Apply justification offset $at[$uaxis] += $ujust * $totallen; $at[$vaxis] += $vjust * $height; foreach $ch (split("", $string)) { ($xmin, $xmax, $paths) = split(",", $code{$ch}); $paths =~ s/\\([()\\])/$1/g; foreach $arc (split(' ', $paths)) { $u0 = -82-$xmin; $v0 = -91; @sites = unpack("C*",$arc); printf STDERR "$0: internal error: tossing odd stroke for %s: '%s'\n", $ch, pop(@sites) if(@sites & 1); push(@counts, ($#sites+1)/2); while($u = shift(@sites)) { $v = shift(@sites); @here = @at; $here[$uaxis] += $strscale*($u+$u0); $here[$vaxis] -= $strscale*($v+$v0); push(@path, sprintf("%.7g %.7g %.7g", @here)); } } $at[$uaxis] += $strscale*($xmax-$xmin); } ($safestring = $string) =~ s/[\000-\031\177-\377]/sprintf("\\%03o",unpack("C",$1))/eg; printf "# Continue with: -align sw -plane %s%s -s %.6g -at %.6g %.6g %.6g\n", $ax{$uaxis}, $ax{$vaxis}, $height, @at; if(@counts > 0) { print "VECT # $safestring\n"; printf "%d %d 0 # %s\n", $#counts+1, ($#path+1), $cmdline; print join(" ",@counts),"\n"; print "0 " x ($#counts+1), "\n\n"; while(@path) { print shift(@path), "\n"; } } else { print "{ # $safestring\n"; print "} # $cmdline\n"; } __END__ CHARS exclam ! quotedbl " numbersign # dollar $ percent % ampersand & quotesingle ' parenleft ( parenright ) asterisk * plus + comma , hyphen - period . slash / zero 0 one 1 two 2 three 3 four 4 five 5 six 6 seven 7 eight 8 nine 9 colon : semicolon ; less < equal = greater > question ? bracketleft [ backslash \ bracketright ] asciicircum ^ underscore _ quoteleft ` braceleft { bar | braceright } asciitilde ~ tilde ~ universal " existential $ suchthat ' asteriskmath * congruent @ Alpha A Beta B Chi C Delta D Epsilon E Phi F Gamma G Eta H Iota I theta1 J Kappa K Lambda L Mu M Nu N Omicron O Pi P Theta Q Rho R Sigma S Tau T Upsilon U sigma1 V Omega W Xi X Psi Y Zeta Z therefore \ perpendicular ^ radicalex ` alpha a beta b chi c delta d epsilon e phi f gamma g eta h iota i phi1 j kappa k lambda l mu m nu n omicron o pi p theta q rho r sigma s tau t upsilon u omega1 v omega w xi x psi y zeta z similar ~ Upsilon1 ¡ minute ¢ lessequal £ fraction ¤ infinity ¥ florin ¦ club § diamond ¨ heart © spade ª arrowboth « arrowleft ¬ arrowup ­ arrowright ® arrowdown ¯ degree ° plusminus ± second ² greaterequal ³ multiply ´ proportional µ partialdiff ¶ bullet · divide ¸ notequal ¹ equivalence º approxequal » ellipsis ¼ arrowvertex ½ arrowhorizex ¾ carriagereturn ¿ aleph À Ifraktur Á Rfraktur  weierstrass à circlemultiply Ä circleplus Å emptyset Æ intersection Ç union È propersuperset É reflexsuperset Ê notsubset Ë propersubset Ì reflexsubset Í element Î notelement Ï angle Ð gradient Ñ registerserif Ò copyrightserif Ó trademarkserif Ô product Õ radical Ö dotmath × logicalnot Ø logicaland Ù logicalor Ú arrowdblboth Û arrowdblleft Ü arrowdblup Ý arrowdblright Þ arrowdbldown ß lozenge à angleleft á registersans â copyrightsans ã trademarksans ä summation å parenlefttp æ parenleftex ç parenleftbt è bracketlefttp é bracketleftex ê bracketleftbt ë bracelefttp ì braceleftmid í braceleftbt î braceex ï angleright ñ integral ò integraltp ó integralex ô integralbt õ parenrighttp ö parenrightex ÷ parenrightbt ø bracketrighttp ù bracketrightex ú bracketrightbt û bracerighttp ü bracerightmid ý bracerightbt þ ENDCHARS # Now for our default font. # Boilerplate header from Ghostscript font hrpl_s.gsf omitted. %END 150 dict dup begin /A [-8 9 (RFJ[ RFZ[ MTWT)] def /B [-10 10 (KFK[ KFTFWGXHYJYLXNWOTP KPTPWQXRYTYWXYWZT[K[)] def /C [-9 11 (ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZV)] def /D [-10 10 (KFK[ KFRFUGWIXKYNYSXVWXUZR[K[)] def /E [-9 9 (LFL[ LFYF LPTP L[Y[)] def /F [-9 8 (LFL[ LFYF LPTP)] def /G [-9 11 (ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZVZS USZS)] def /H [-10 11 (KFK[ YFY[ KPYP)] def /I [-3 4 (RFR[)] def /J [-7 8 (VFVVUYTZR[P[NZMYLVLT)] def /K [-10 10 (KFK[ YFKT POY[)] def /L [-9 7 (LFL[ L[X[)] def /M [-11 12 (JFJ[ JFR[ ZFR[ ZFZ[)] def /N [-10 11 (KFK[ KFY[ YFY[)] def /O [-10 11 (PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF)] def /P [-10 10 (KFK[ KFTFWGXHYJYMXOWPTQKQ)] def /Q [-10 11 (PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF SWY])] def /R [-10 10 (KFK[ KFTFWGXHYJYLXNWOTPKP RPY[)] def /S [-9 10 (YIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX)] def /T [-8 8 (RFR[ KFYF)] def /U [-11 11 (KFKULXNZQ[S[VZXXYUYF)] def /V [-9 10 (JFR[ ZFR[)] def /W [-13 12 (HFM[ RFM[ RFW[ \\FW[)] def /X [-10 10 (KFY[ YFK[)] def /Y [-9 9 (JFRPR[ ZFRP)] def /Z [-10 10 (YFK[ KFYF K[Y[)] def /a [-8 10 (XMX[ XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def /b [-9 9 (LFL[ LPNNPMSMUNWPXSXUWXUZS[P[NZLX)] def /c [-8 9 (XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def /d [-8 10 (XFX[ XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def /e [-8 9 (LSXSXQWOVNTMQMONMPLSLUMXOZQ[T[VZXX)] def /f [-4 7 (WFUFSGRJR[ OMVM)] def /g [-8 10 (XMX]W`VaTbQbOa XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def /h [-8 10 (MFM[ MQPNRMUMWNXQX[)] def /i [-3 4 (QFRGSFREQF RMR[)] def /j [-4 5 (RFSGTFSERF SMS^RaPbNb)] def /k [-8 8 (MFM[ WMMW QSX[)] def /l [-3 4 (RFR[)] def /m [-14 15 (GMG[ GQJNLMOMQNRQR[ RQUNWMZM\\N]Q][)] def /n [-8 10 (MMM[ MQPNRMUMWNXQX[)] def /o [-8 10 (QMONMPLSLUMXOZQ[T[VZXXYUYSXPVNTMQM)] def /p [-9 9 (LMLb LPNNPMSMUNWPXSXUWXUZS[P[NZLX)] def /q [-8 10 (XMXb XPVNTMQMONMPLSLUMXOZQ[T[VZXX)] def /r [-6 7 (OMO[ OSPPRNTMWM)] def /s [-7 9 (XPWNTMQMNNMPNRPSUTWUXWXXWZT[Q[NZMX)] def /t [-5 7 (RFRWSZU[W[ OMVM)] def /u [-8 10 (MMMWNZP[S[UZXW XMX[)] def /v [-7 8 (LMR[ XMR[)] def /w [-11 11 (JMN[ RMN[ RMV[ ZMV[)] def /x [-7 9 (MMX[ XMM[)] def /y [-7 8 (LMR[ XMR[P_NaLbKb)] def /z [-7 9 (XMM[ MMXM M[X[)] def /zero [-10 10 (QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF)] def /one [-10 10 (NJPISFS[)] def /two [-10 10 (LKLJMHNGPFTFVGWHXJXLWNUQK[Y[)] def /three [-10 10 (MFXFRNUNWOXPYSYUXXVZS[P[MZLYKW)] def /four [-10 10 (UFKTZT UFU[)] def /five [-10 10 (WFMFLOMNPMSMVNXPYSYUXXVZS[P[MZLYKW)] def /six [-10 10 (XIWGTFRFOGMJLOLTMXOZR[S[VZXXYUYTXQVOSNRNOOMQLT)] def /seven [-10 10 (YFO[ KFYF)] def /eight [-10 10 (PFMGLILKMMONSOVPXRYTYWXYWZT[P[MZLYKWKTLRNPQOUNWMXKXIWGTFPF)] def /nine [-10 10 (XMWPURRSQSNRLPKMKLLINGQFRFUGWIXMXRWWUZR[P[MZLX)] def /period [-5 5 (RYQZR[SZRY)] def /comma [-5 5 (SZR[QZRYSZS\\R^Q_)] def /colon [-5 5 (RMQNROSNRM RYQZR[SZRY)] def /semicolon [-5 5 (RMQNROSNRM SZR[QZRYSZS\\R^Q_)] def /exclam [-7 7 (RFRT RYQZR[SZRY)] def /question [-9 9 (LKLJMHNGPFTFVGWHXJXLWNVORQRT RYQZR[SZRY)] def /quotedbl [-8 8 (NFNM VFVM)] def /ring [-7 7 (QFOGNINKOMQNSNUMVKVIUGSFQF)] def /dollar [-10 10 (PBP_ TBT_ YIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX)] def /fraction [-11 11 ([BIb)] def /parenleft [-7 5 (VBTDRGPKOPOTPYR]T`Vb)] def /parenright [-5 7 (NBPDRGTKUPUTTYR]P`Nb)] def /bar [-4 4 (RBRb)] def /hyphen [-13 13 (IR[R)] def /plus [-13 13 (RIR[ IR[R)] def /equal [-13 13 (IO[O IU[U)] def /periodcentered [-5 5 (RQQRRSSRRQ)] def /quoteleft [-5 5 (SFRGQIQKRLSKRJ)] def /quoteright [-5 5 (RHQGRFSGSIRKQL)] def /numbersign [-10 11 (SBLb YBRb LOZO KUYU)] def /ampersand [-13 13 (\\O\\N[MZMYNXPVUTXRZP[L[JZIYHWHUISJRQNRMSKSIRGPFNGMIMKNNPQUXWZY[[[\\Z\\Y)] def /bullet [-2 2 (QPPQPSQTSTTSTQSPQP RQQRRSSRRQ)] def /slash [-7 7 (K^YF)] def /backslash [-7 7 (KFY^)] def /underscore [-8 8 (J]Z])] def /tilde [-8 8 (LTLRMPOPUSWSXR LRMQOQUTWTXRXP)] def /bracketleft [-7 7 (OBOb PBPb OBVB ObVb)] def /bracketright [-7 7 (TBTb UBUb NBUB NbUb)] def /braceleft [-7 7 (TBRCQDPFPHQJRKSMSOQQ RCQEQGRISJTLTNSPORSTTVTXSZR[Q]Q_Ra QSSUSWRYQZP\\P^Q`RaTb)] def /braceright [-7 7 (PBRCSDTFTHSJRKQMQOSQ RCSESGRIQJPLPNQPURQTPVPXQZR[S]S_Ra SSQUQWRYSZT\\T^S`RaPb)] def /asterisk [-8 8 (RFRR MIWO WIMO)] def /less [-12 12 (ZIJRZ[)] def /greater [-12 12 (JIZRJ[)] def /asciitilde [-12 12 (IUISJPLONOPPTSVTXTZS[Q ISJQLPNPPQTTVUXUZT[Q[O)] def /asciicircum [-11 11 (JTROZT JTRPZT)] def /breve [-10 10 (KFLHNJQKSKVJXHYF KFLINKQLSLVKXIYF)] def /percent [-12 12 ([FI[ NFPHPJOLMMKMIKIIJGLFNFPGSHVHYG[F WTUUTWTYV[X[ZZ[X[VYTWT)] def /at [-13 14 (WNVLTKQKOLNMMPMSNUPVSVUUVS QKOMNPNSOUPV WKVSVUXVZV\\T]Q]O\\L[JYHWGTFQFNGLHJJILHOHRIUJWLYNZQ[T[WZYYZX XKWSWUXV)] def /section [-8 8 (UITJUKVJVIUGSFQFOGNINKOMQOVR OMTPVRWTWVVXTZ PNNPMRMTNVPXU[ NVSYU[V]V_UaSbQbOaN_N^O]P^O_)] def /dagger [-8 8 (RFQHRJSHRF RFRb RQQTRbSTRQ LMNNPMNLLM LMXM TMVNXMVLTM)] def /daggerdbl [-8 8 (RFQHRJSHRF RFRT RPQRSVRXQVSRRP RTRb R^Q`RbS`R^ LMNNPMNLLM LMXM TMVNXMVLTM L[N\\P[NZL[ L[X[ T[V\\X[VZT[)] def /space [-4 4 ()] def /quotesingle [-4 5 (SFRGRM SGRM SFTGRM)] def /.notdef [ 0 0 () ] def % not defined end /Hershey-Plain-Simplex 4294100 0.8 0 MakeHersheyFont geomview-1.9.4/src/bin/geomutil/math2oogl/0000777000175000001440000000000010665240701015431 500000000000000geomview-1.9.4/src/bin/geomutil/math2oogl/OOGL.m0000644000175000001440000002647410462161603016276 00000000000000(* $Header: /cvsroot/geomview/geomview/src/bin/geomutil/math2oogl/OOGL.m,v 1.3 2006/07/27 12:29:38 mphillips Exp $ *) BeginPackage["OOGL`"] (* If you want to be able to use this package from a directory other than the geomview distribution directory, or if you want to be able to run it from a remote host, then EITHER ensure that the programs "geomview", "math2oogl", "togeomview", and "oogl2rib" are in your search path (e.g. copy them to /usr/local/bin), OR - Change the value of $GeomviewPath below to be the absolute pathname of the "geomview" shell script on your system and - Change the value of $GeomRoot below to be the absolute pathname of the geomview distribution directory on your system. The first alternative is preferred when possible. *) (* $GeomviewPath = "/usr/local/bin/geomview"; *) (* $GeomRoot = "/u/gcg/ngrap"; *) $GeomviewPath = "geomview"; $GeomRoot = "."; (* DO NOT CHANGE ANYTHING BELOW HERE *) (*******************************************************************) (* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Geomview; see the file COPYING. If not, write to the * Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA, * or visit http://www.gnu.org. *) (* Authors: Nils McCarthy Stuart Levy Tamara Munzner Silvio Levy *) (* To use this, you also need to install the math2oogl and oogl2rib C programs. They actually do the grunt work, as Mathematica is too slow to do it in any reasonable amount of time. *) WriteOOGL::usage = " WriteOOGL[filename,-Graphics3D or SurfaceGraphics-] writes the given graphics object or list of graphics objects to filename. Graphics3D objects are converted to OOGL OFF format, SurfaceGraphics objects are converted to OOGL MESH format. WriteOOGL understands only Polygon, Line, and RGBColor Graphics3D directives. If WriteOOGL encounters any errors in the Graphics3D object, it silently tries to cope. Depends on the C program math2oogl."; Geomview::usage= " Geomview [-Graphics3D or SurfaceGraphics-]\n Geomview [\"name\", -Graphics3D or SurfaceGraphics-] writes the given graphics object or list of graphics objects to geomview, starting a copy of geomview if necessary. Graphics3D objects are converted to OOGL OFF format, SurfaceGraphics objects are converted to OOGL MESH format. Polygons, Lines, Points, and RGBColor Graphics3D directives are understood. Geomview[\"name\", ...] creates geomview object with that name; default is \"Mathematica\". Depends on the C program math2oogl."; WriteRIB::usage= " WriteRIB [filename,-Graphics3D or SurfaceGraphics-]\n WriteRIB [filename,-Graphics3D or SurfaceGraphics-, \"options\"]] writes the given graphics object or list of graphics objects as RenderMan .rib files. It actually converts the Mathematica graphics object to the OOGL data format, and then converts the OOGL files to rib format. Graphics3D objects become lists of Polygons, and SurfaceGraphics objects become PatchMeshes. Polygons, Lines, Points, and RGBColor Graphics3D directives are understood. Depends on the C programs math2oogl and oogl2rib. WriteRIB[ ..., \"options\"] appends the given text string to the invocation of oogl2rib."; WriteChunk::usage= " WriteChunk [filename,-Graphics3D or SurfaceGraphics-] is only for use on machines that cannot start up a remote Unix shell on a machine that has math2oogl, oogl2rib, and/or geomview installed (i.e. Macs, PCs). It writes the Mathematica graphics object to a file in a format accepted by shell scripts which should be run on a machine (Iris or Next) that has the relevant programs installed. The shell scripts \"writeoogl\",\"writegv\", and \"writerib\" correspond to WriteOOGL, Geomview, and WriteRIB respectively: see their usage messages."; DisplayHost::usage= "Option to Geomview[] specifying display hostname for geomview. Automatically set to REMOTEHOST or DISPLAY shell variable if found. Setting DisplayHost to \"local\" overrides this behavior.\n To specify a different user name on the remote computer, use\n SetOptions[Geomview, DisplayHost -> \"user@host\" ];"; GeomviewCommand::usage = "Option to Geomview[] specifying the command used to start geomview if\n it is not already running. May include geomview command-line options."; MachType::usage= "Option to Geomview[] specifying machine type of DisplayHost. Should be either \"sgi\" or \"next\". The default value is set by Mathematica to be the same as the type of machine on which Mathematica is running."; (*Geomview /: Options[Geomview] := { DisplayHost -> "" };*) MeshGraphics::usage = "\n Head for mesh graphics object." Options[Geomview] ^= {DisplayHost->"", MachType->If [$System == "NeXT", "next", If [$System == "SPARC", "sun4", "sgi"] ], XDisplay -> ":0", GeomviewCommand -> $GeomviewPath}; Begin["`Private`"] (* Use StringJoin not <> for backward compatibility *) WriteChunk[filename_String, gobj_List] := ( Map[ WriteChunk[filename,#] &, gobj]; ); WriteChunk[filename_String, gobj_Graphics3D] := ( Write[filename, CForm[gobj[[0]]]]; Write[filename, CForm[N[gobj[[1]]]]]; ); GoodHeadQ[gobj_] := (SameQ[gobj[[0]],SurfaceGraphics] || SameQ[gobj[[0]],MeshGraphics] || SameQ[gobj[[0]],BezierPlot`BezierPatch] || SameQ[gobj[[0]],BezierPatch]) WriteChunk[filename_String, gobj_?GoodHeadQ] := ( Write[filename, CForm[gobj[[0]]]]; WriteString[filename, "Dimensions\n"]; Write[filename, Take[Dimensions[gobj[[1]]],2]]; If[SameQ[gobj[[0]],SurfaceGraphics], WriteString[filename, "MeshRange\n"]; Write[filename, MeshRange /. gobj[[-1]]]] ; (* write out the colors before the points, if they exist *) (* Backwards compatibility with v1.2: Dimensions[gobj] returns empty list *) If [$VersionNumber >= 2.0, If [Dimensions[gobj][[1]] > 2, Write[filename, CForm[gobj[[2]]]]], If [Dimensions[Dimensions[gobj[[2]]]][[1]] > 1, Write[filename, CForm[gobj[[2]]]]]]; Write[filename, CForm[N[gobj[[1]]]]]; ); If[$VersionNumber < 2.0, ( StringTake[str_, take_] := Apply[StringJoin, Take[Characters[str], take]]; StringPosition[str_, ch_] := Block[{chars = Characters[str]}, Select[ Table[{i,i}, {i,1,StringLength[str]}], (chars[[ #[[1]] ]] == ch)&] ]; $Failed = Fail; )]; BinPrefix[mach_] := StringJoin[ $GeomRoot, "/bin/", mach ]; BinShPrefix[mach_] := StringJoin[ "PATH=$PATH:", BinPrefix[mach], " " ]; WriteOut[filename_String, gobj_, postpend_String:"", prepend_String:"", options___] :=( (* math2oogl expects '{}(), ' to be translated into newlines *) tr = "tr -s '{}(), ' '\\12\\12\\12\\12\\12\\12' | "; (* Do the right thing if we've got a command instead of a file name. *) tmpfilename = If[StringMatchQ[filename, "!*"], StringJoin[" | ",StringDrop[filename,1]], If[filename != "", StringJoin[" > ", filename], filename]]; newfilename = StringJoin["!",tr,prepend," ", BinShPrefix[ MachType /. {options} /. Options[Geomview]], "math2oogl ",postpend, tmpfilename]; (* We might prepend 'rsh hostname' to the command, which must then be * quoted so that what comes after the pipes gets interpreted on * the remote not the local machine. The open quote is already in the * middle of the prepended string. * If we did prepend 'rsh hostname', also add a command to be executed in * case the rsh failed, to avoid e.g. mysterious "permission denied" errors. * StringMatchQ[prepend,"rsh*"] fails mysteriously in Math 1.2. *) If[StringLength[prepend]>3 && StringTake[prepend,3] == "rsh", newfilename = StringJoin[newfilename, "'\\' || (echo Geomview graphics: Cannot rsh to machine ", rshhost, " as ", If[rshuser != "", StringJoin["user ", rshuser], "yourself"], ".; echo Check DisplayHost option, or your .rhosts file on ", rshhost, ".)"]]; OpenWrite[newfilename]; WriteChunk[newfilename, gobj]; Close[newfilename]; ); WriteOOGL[filename_String,gobj_] :=( WriteOut[filename, gobj]; gobj ); WriteRIB[filename_String,gobj_, riboptions_String:"", options___] :=( WriteOut[filename,gobj, StringJoin[" | oogl2rib -n mma.tiff ",riboptions]]; gobj ); (* * If the given filename is on the $PATH, returns the directory it's in, * else returns Null. Used for load-time warning messages. *) OnPathQ[filename_] := Block[{pdir, i, posen, path = StringJoin[":",Environment["PATH"],":"] }, ( posen = StringPosition[path, ":"]; Do[ (pdir = StringTake[path, {posen[[i]][[2]]+1, posen[[i+1]][[1]]-1}]; If[FileType[StringJoin[pdir,"/",filename]] === File, Return[pdir]]), {i, 1, Length[posen]-1} ] )]; xhost[display_] := StringTake[display, StringPosition[StringJoin[display,":"], ":"] [[1]] [[1]]-1]; remotehost[host_String] := ( newhost=""; If[host != "", newhost = If[host == "local", "", host], ( If[(rshhost = Environment["REMOTEHOST"]) =!= $Failed || (rshhost = Environment["DISPLAY"]) =!= $Failed, newhost = xhost[rshhost]; ] )]; If[newhost == $MachineName, newhost = ""]; If[newhost != "" && Length[StringPosition[newhost, "@"]] == 0 && ((ruser = Environment["REMOTEUSER"]) =!= $Failed || (ruser = Environment["USER"]) =!= $Failed || (ruser = Environment["LOGNAME"]) =!= $Failed), newhost = StringJoin[ruser, "@", newhost]]; newhost ); toGV[host_, xdisplay_] :=( newhost = remotehost[host]; {rshuser, rshhost} = If[Length[atposn = StringPosition[newhost, "@"]] > 0, {StringTake[newhost, {1,atposn[[1]][[1]]-1}], StringTake[newhost, {atposn[[1]][[2]]+1,StringLength[newhost]}]}, {"", newhost}]; (* Return our rsh command if any, else the empty string. *) If[newhost != "", StringJoin["rsh ", rshhost, If[StringLength[rshuser] > 0, " -l ", ""], rshuser, " /bin/sh -c \\''DISPLAY=", xdisplay, "; export DISPLAY; "], "" ] ); Geomview[ name_String, gobj_, options___] := ( WriteOut["", gobj, StringJoin[" -togeomview ",name," ", GeomviewCommand /. {options} /. Options[Geomview]], toGV[DisplayHost /. {options} /. Options[Geomview], XDisplay /. {options} /. Options[Geomview]], options]; gobj ); Geomview[ gobj_, options___] := ( Geomview[ "Mathematica", gobj, options ]; gobj ); bpref = BinPrefix[MachType /. Options[Geomview]]; If[Not[StringQ[OnPathQ["math2oogl"]]], (Print["Warning: the program 'math2oogl' is not on your search path,\n", Environment["PATH"], "\n"]; If[ FileType[StringJoin[bpref, "/math2oogl"]]===File, Print["using default path (in OOGL.m) of ", bpref, " instead."], Print[ "the Mathematica->geomview graphics package won't be able to work;\n change the value of $Geomroot in OOGL.m, or ensure that the math2oogl programs\n are installed somewhere on your search path."] ]) ]; End[] EndPackage[] SetOptions[Geomview, DisplayHost -> OOGL`Private`remotehost[""] ]; geomview-1.9.4/src/bin/geomutil/math2oogl/math2oogl.c0000644000175000001440000005351310605470357017422 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif # include "config.h" /* math2oogl: convert Mathematica graphics object to OOGL format. SurfaceGraphics and MeshGraphics => MESH, Graphics3D => OFF, BezierPatch => BEZuvn. Note that we expect the graphics objects to have been processed as in OOGL.m, i.e. provide dimension and meshrange information and print out the colors before the points for SurfaceGraphics objects, and convert the characters "(){}, " to a newline. Original converter by Nils McCarthy, Geomview pipefitting by Stuart Levy SurfaceGraphics converter additions by Tamara Munzner. MeshGraphics and BezierPatch converter additions by Silvio Levy */ /* * Pipe fitting for linking Mathematica to geomview. * Starts geomview if not already running. */ #include #include #include #if defined(unix) || defined(__unix) || defined(__unix__) #include #include #include #include #endif #include #include #include #include #ifdef AIX #define _BSD 1 /* Get FNDELAY from */ #endif #include #ifdef NeXT #include #else /* any other reasonable unix */ #include #endif #ifdef SVR4 /* What should this be called? */ #include #endif #ifndef FNDELAY # define FNDELAY O_NDELAY #endif #ifndef FNONBLK /* Next 3.0 lacks these in */ # define FNONBLK FNDELAY #endif #ifndef O_NONBLOCK # define O_NONBLOCK FNONBLK #endif #ifndef FD_CLOEXEC #define FD_CLOEXEC 1 #endif extern int errno; char *todir = "/tmp/geomview"; char *toname = "Mathematica"; char giveup[] = "Geomview graphics: math2oogl: Couldn't start geomview on "; static void interrupt(int sig) { char myname[1024]; write(2, giveup, sizeof(giveup)); #ifdef SVR4 /* jkirk@keck.tamu.edu reports no gethostname() in Solaris (SVR4). * Use sysinfo() instead. */ sysinfo(SI_HOSTNAME, myname, sizeof(myname)); #else gethostname(myname, sizeof(myname)); #endif write(2, myname, strlen(myname)); write(2, "\n", 1); exit(1); } void start_gv(char **gvpath, char *pipename, char *toname) { char *args[1024]; int i = 0; char **gvp; signal(SIGALRM, interrupt); args[i++] = gvpath[0]; #ifdef NeXT args[i++] = "-Mc"; args[i++] = toname; #else /* sgi */ args[i++] = "-c"; args[i++] = pipename; #endif /* Copy remaining args through trailing NULL */ for(gvp = gvpath; (args[i++] = *++gvp); ) ; if(fork() == 0) { int savederr = dup(2); static char whynot[] = "Geomview graphics: math2oogl: Couldn't find "; fcntl(savederr, F_SETFD, FD_CLOEXEC); /* close this on exec */ close(0); close(1); close(2); open("/dev/null", O_RDWR); /* Open /dev/null as file descriptors */ dup(0); dup(0); /* 0(stdin), 1(stdout) and 2(stderr) */ /* (Could just close them, but that seems to poison geomview * if it tries to report an error.) */ #if SETPGRP_VOID setpgrp(); #else setpgrp(0,getpid()); #endif execvp(gvpath[0], &args[0]); write(savederr, whynot, sizeof(whynot)); write(savederr, gvpath[0], strlen(gvpath[0])); write(savederr, "\n", 1); execvp("geomview", &args[0]); execvp("gv", &args[0]); dup2(savederr, 2); kill(getppid(), SIGALRM); interrupt(0); _exit(1); } } void startgv(char **gvpath) { int usesock; int n, fd = -1; char pipename[BUFSIZ]; struct sockaddr_un un; if(access(todir, W_OK) < 0) { mkdir(todir, 0777); chmod(todir, 0777); } sprintf(pipename, "%s/%s", todir, toname); #ifdef NeXT usesock = 1; #else usesock = 0; #endif if(usesock) { strncpy(un.sun_path, pipename, sizeof(un.sun_path)-1); un.sun_family = AF_UNIX; fd = socket(PF_UNIX, SOCK_STREAM, 0); if(connect(fd, (struct sockaddr *)(&un), sizeof(un)) < 0) { if(errno != ECONNREFUSED && errno != ENOENT) { fprintf(stderr, "togeomview: Can't connect to "); perror(pipename); exit(1); } start_gv(gvpath, pipename, toname); for(n = 0; connect(fd, (struct sockaddr *)(&un), sizeof(un)) < 0; n++) { if(n == 60) interrupt(0); sleep(1); } } } else { /* Use named pipe */ if(access(pipename, 0) < 0) { mknod(pipename, S_IFIFO, 0); chmod(pipename, 0666); } fd = open(pipename, O_WRONLY|O_NONBLOCK); if(fd >= 0) { fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~(FNDELAY|FNONBLK|O_NONBLOCK)); } else if(errno == ENXIO) { start_gv(gvpath, pipename, toname); alarm(60); fd = open(pipename, O_WRONLY); alarm(0); } } if(fd < 0) { fprintf(stderr, "Can't open pipe to geomview: "); perror(pipename); exit(1); } /* Now stdout writes to pipe. */ dup2(fd, 1); } /* * Mathematica->OOGL conversion */ typedef float Color[3]; #define ismajor isupper /* * The following table should always obey the convention that "major" * tokens (corresponding to the cases in the big switch below) * are represented by capitals */ enum st { IGNORE='i', POLYGON='p', LINE='l', COLOR='c', NUMBER='n', MESH='m', MESHRANGE='k', DIMENSIONS='d', SG='S', MG='M', G3='G', BG='B' }; struct line { char *data; enum st token; struct line *next; }; struct line *lines=NULL; int size[2]; float range[4]; void usage() { fprintf(stderr,"Usage: math2oogl [-togeomview ]"); exit(1); } int main(int ac,char **av) { int togv = 0; struct line *lastline=NULL; struct line *prev=NULL; char buf[1024]; int npolypoints=0, npolys=0, npolycolors=0; int nvectpoints=0, nvects=0, nvectcolors=0; struct line *curline, *globline; int numnums=0; int numcols=0; enum st state=IGNORE; Color **colors = NULL; int i,j,q,ok; float xincr, yincr; int complex = 0, toss = 0; if (ac >= 4 && (!strcmp(av[1],"-togeomview"))) { startgv(&av[3]); printf("(geometry %s\n", av[2]); togv=1; } else if (ac > 1) usage(); for(;;) { int c; char *k; /* Swallow all delimiters, " (){},\n\r". * It's not strictly correct to ignore {} nesting, but... */ for(k = buf; (c = getchar()) > ' ' && c != ',' && c != '(' && c != ')' && c != '{' && c != '}' && k < buf+sizeof(buf)-1; k++) { /* Handle escaped newlines, which Mathematica inserts just rarely * enough to be hard to notice! */ if(c == '\\') { if((c = getchar()) == '\n') { while((c = getchar()) == ' ' || c == '\t') ; } } *k = c; } if(c == EOF) break; *k = '\0'; if (k == buf || !strcmp(buf,"List")) continue; if (!lastline) lastline = lines = malloc(sizeof(struct line)); else { if (toss) lastline = prev; toss = 0; prev = lastline; lastline = lastline->next = malloc (sizeof(struct line)); } lastline->next = NULL; lastline->data = malloc(strlen(buf)+1); strcpy (lastline->data, buf); if (isalpha(*lastline->data)) { if (!strcmp(lastline->data, "Graphics3D")) lastline->token = G3; else if (!strcmp(lastline->data, "SurfaceGraphics")) lastline->token = SG; else if (!strcmp(lastline->data, "MeshGraphics")) lastline->token = MG; else if (!strcmp(lastline->data, "BezierPatch")|| !strcmp(lastline->data, "BezierGraphics`BezierPatch")) lastline->token = BG; else if (!strcmp(lastline->data, "Polygon")) lastline->token = POLYGON; else if (!strcmp(lastline->data, "Point")) lastline->token = LINE; /* degenerate vector */ else if (!strcmp(lastline->data, "Line")) lastline->token = LINE; else if (!strcmp(lastline->data, "RGBColor")) lastline->token = COLOR; else if (!strcmp(lastline->data, "MeshRange")) lastline->token = MESHRANGE; else if (!strcmp(lastline->data, "Dimensions")) lastline->token = DIMENSIONS; else if (!strcmp(lastline->data, "Complex")) { lastline->token = IGNORE; complex = 1; toss = 1; } else { lastline->token = IGNORE; } } else if (isdigit(*lastline->data) || '-'==*lastline->data) { lastline->token = NUMBER; /* grab real part, toss imaginary part */ if (complex) { if (complex == 1) { complex++; } else if (complex == 2) { lastline->token = IGNORE; complex = 0; toss = 1; } } } } /* we might have multiple graphics objects */ printf ("{ LIST\n\n"); ok = 1; globline = lines; for (globline = lines;globline;) { switch (globline->token) { case SG: /* SurfaceGraphics */ globline=globline->next; if (globline->token == DIMENSIONS) { globline=globline->next; for (i = 0; i < 2 && ok; i++, globline = globline->next) if (globline->token == NUMBER) size[i] = atoi(globline->data); else ok = 0; } else ok = 0; if (!ok) { fprintf(stderr, "can't read mesh dimensions!\n"); return 1; } if (globline->token == MESHRANGE) { globline=globline->next; for (i = 0; i < 4 && ok; i++, globline = globline->next) { if (globline->token == NUMBER) range[i] = atof(globline->data); else ok = 0; } } else ok = 0; if (!ok) { fprintf(stderr, "can't read mesh range!\n"); return 1; } /* in SurfaceGraphics object, first we get all the colors, then all the points: they're not interleaved as in the Graphics3D object. so we need to store them. points array is size[0] x size[1], color array is size[0]-1 x size[1]-1 (per face not per vertex) so repeat the face color for the extra vertices. */ /* if there are colors, store them off */ if (globline->token == COLOR) { numcols = (size[0]-1) * (size[1]-1); colors = malloc((size[0]-1)*sizeof(Color*)); for (i = 0; i < size[0]-1;i++) colors[i] = malloc((size[1]-1)*sizeof(Color)); ok = 1; for (i = 0; i < size[0]-1; i++) { for (j=0; j < size[1]-1; j++) { while (globline->token == COLOR && ok) for (q=0; q < 3 && ok; q++) { globline = globline->next; if (globline->token != NUMBER) { ok = 0; break; } else { colors[i][j][q]=atof(globline->data); } } globline=globline->next; } } if (!ok) { fprintf(stderr, "can't read mesh color array!\n"); return 1; } } /* Each number we get is just the z coordinate. Figure out x and y values based on meshrange and size. We don't use a ZMESH because the grid isn't necessarily an array starting at 0,0: it depends on meshrange */ xincr = (range[1] - range[0]) / (size[0]-1); yincr = (range[3] - range[2]) / (size[1]-1); if (numcols) printf("\n\n{ CMESH \n"); else printf("\n\n{ MESH \n"); printf("\n%d %d\n",size[0], size[1]); ok = 1; for (i = 0; i < size[0]; i++){ for (j = 0; j < size[1]; j++) { if (globline->token!=NUMBER) { ok = 0; break; } printf(" %f ", range[0] + xincr*j); /* x */ printf(" %f ", range[2] + yincr*i); /* y */ printf(" %s ", globline->data); /* z */ /* MESH vertices need RGBA colors since OOGL MESHes have per-vertex colors, repeat some. repeat last i index, first j index. */ if (numcols) { printf(" %f %f %f 1\n", colors[inext; } } if (!ok) { fprintf(stderr, "can't read mesh points array!\n"); return 1; } else printf("} #end of MESH\n"); break; case MG: /* MeshGraphics */ globline=globline->next; if (globline->token == DIMENSIONS) { globline=globline->next; for (i = 0; i < 2 && ok; i++, globline = globline->next) if (globline->token == NUMBER) size[i] = atoi(globline->data); else ok = 0; } else ok = 0; if (!ok) { fprintf(stderr, "can't read mesh dimensions!\n"); return 1; } /* in MeshGraphics object, first we get all the colors, then all the points: they're not interleaved as in the Graphics3D object. so we need to store them. points array is size[0] x size[1], color array is size[0]-1 x size[1]-1 (per face not per vertex) so repeat the face color for the extra vertices. */ /* if there are colors, store them off */ if (globline->token == COLOR) { numcols = (size[0]-1) * (size[1]-1); colors = malloc((size[0]-1)*sizeof(Color*)); for (i = 0; i < size[0]-1;i++) colors[i] = malloc((size[1]-1)*sizeof(Color)); ok = 1; for (i = 0; i < size[0]-1; i++) { for (j=0; j < size[1]-1; j++) { while (globline->token == COLOR && ok) for (q=0; q < 3 && ok; q++) { globline = globline->next; if (globline->token != NUMBER) { ok = 0; break; } else { colors[i][j][q]=atof(globline->data); } } globline=globline->next; } } if (!ok) { fprintf(stderr, "can't read mesh color array!\n"); return 1; } } /* Each number we get is just the x,y or z coordinate. We don't use a ZMESH because the grid isn't necessarily an array starting at 0,0: it depends on meshrange */ if (numcols) printf("\n\n{ CMESH \n"); else printf("\n\n{ MESH \n"); printf("\n%d %d\n",size[0], size[1]); ok = 1; for (i = 0; i < size[0]; i++){ for (j = 0; j < size[1]; j++) { if (globline->token!=NUMBER) { ok = 0; break; } printf(" %s ", globline->data); /* x */ globline=globline->next; if (globline->token!=NUMBER) { ok = 0; break; } printf(" %s ", globline->data); /* y */ globline=globline->next; if (globline->token!=NUMBER) { ok = 0; break; } printf(" %s ", globline->data); /* z */ /* MESH vertices need RGBA colors since OOGL MESHes have per-vertex colors, repeat some. repeat last i index, first j index. */ if (numcols) { printf(" %f %f %f 1\n", colors[inext; } } if (!ok) { fprintf(stderr, "can't read mesh points array!\n"); return 1; } else printf("} #end of MESH\n"); break; case BG: /* BezierGraphics */ globline=globline->next; if (globline->token == DIMENSIONS) { globline=globline->next; for (i = 0; i < 2 && ok; i++, globline = globline->next) if (globline->token == NUMBER) size[i] = atoi(globline->data); else ok = 0; } else ok = 0; if (!ok) { fprintf(stderr, "can't read Bezier patch dimensions!\n"); return 1; } /* in BezierGraphics object, first we get all the colors, then all the points. points array is size[0] x size[1], color array is 2x2. */ /* if there are colors, store them off */ if (globline->token == COLOR) { numcols = 2*2; colors = malloc(2*sizeof(Color*)); for (i = 0; i < 2;i++) colors[i] = malloc(2*sizeof(Color)); ok = 1; for (i = 0; i < 2; i++) { for (j=0; j < 2; j++) { while (globline->token == COLOR && ok) for (q=0; q < 3 && ok; q++) { globline = globline->next; if (globline->token != NUMBER) { ok = 0; break; } else { colors[i][j][q]=atof(globline->data); } } globline=globline->next; } } if (!ok) { fprintf(stderr, "can't read mesh color array!\n"); return 1; } } /* Each number we get is just the x,y or z coordinate. */ if (numcols) printf("\n\n{ CBEZ"); else printf("\n\n{ BEZ"); printf("%d%d3\n",size[1]-1, size[0]-1); /* reverse order */ ok = 1; for (i = 0; i < size[0]; i++){ for (j = 0; j < size[1]; j++) { if (globline->token!=NUMBER) { ok = 0; break; } printf(" %s ", globline->data); /* x */ globline=globline->next; if (globline->token!=NUMBER) { ok = 0; break; } printf(" %s ", globline->data); /* y */ globline=globline->next; if (globline->token!=NUMBER) { ok = 0; break; } printf(" %s ", globline->data); /* z */ /* print colors */ if (numcols) { printf(" %f %f %f 1\n", colors[i][j][0], colors[i][j][1], colors[i][j][2]); } else printf("\n"); globline=globline->next; } } if (!ok) { fprintf(stderr, "can't read control points array!\n"); return 1; } else printf("} #end of BEZ\n"); break; case G3: /* Graphics3D */ globline=globline->next; npolypoints=npolys=npolycolors=0; nvectpoints=nvects=nvectcolors=0; numnums=numcols=0; state = IGNORE; for (curline=globline;;curline=curline->next) { if (!curline || (curline->token != NUMBER)) { if (state == LINE) { nvects++; nvectpoints += numnums/3; if (numcols) nvectcolors++; numcols = 0; } else if (state == POLYGON) { npolys++; npolypoints += numnums/3; if (numcols) npolycolors++; } if (!curline || ismajor(curline->token)) break; /* go back to main loop */ if (curline->token == COLOR) numcols++; state=curline->token; numnums=0; } else /* it's a number */ numnums++; } if (npolys) { printf ("\n{ = OFF\n"); printf ("%d %d %d\n",npolypoints, npolys, 0); { /* vertex list */ struct line *curline; enum st state=IGNORE; char coordnum=0; for (curline=globline; curline && !ismajor(curline->token); curline=curline->next) { if (curline->token != NUMBER) { state = curline->token; coordnum=0; printf("\n"); } else if (state == POLYGON) { printf("%s",curline->data); if(coordnum++%3 == 2) printf("\n"); else printf(" "); } } } { /* face list (maybe includes color) */ Color c; char hascolor = 0; /* so far. */ char thiscolor=1; /* if this polygon has had its color * tacked on. */ char cnum=3; /* 3 == not doing color now. */ struct line *curline; enum st state=IGNORE; int pointnum=0; c[0] = c[1] = c[2] = 0; for (curline=globline;;curline=curline->next) { if (!thiscolor && hascolor && (!curline || curline->token != NUMBER)) { /* OFF faces need just RGB colors, no alpha! */ printf(" %f %f %f",c[0],c[1],c[2]); thiscolor = 1; } if (!curline || ismajor(curline->token)) break; /* back to main loop */ switch (curline->token) { case COLOR: cnum = 0; state = COLOR; hascolor = 1; break; case POLYGON: { struct line *countline; int numvert=0; thiscolor = !hascolor; cnum = 3; state = POLYGON; for (countline = curline->next; countline; countline=countline->next) { if (countline->token != NUMBER) break; numvert++; } printf("\n%d",numvert/3); } break; case NUMBER: if (state == POLYGON) { if (pointnum++%3 == 2) printf(" %d",pointnum/3-1); } else if (state==COLOR) { if (cnum<3) c[(int)cnum++] = atof(curline->data); } break; default: state = curline->token; break; } } } printf("\n\n} #end of OFF\n"); } if (nvects) { printf("\n{ = VECT\n"); printf("%d %d %d\n",nvects, nvectpoints, nvectcolors); { struct line *curline; enum st state=IGNORE; int numvert=0, numcol=0; for (curline=globline;;curline=curline->next) { if (numvert && (!curline || curline->token != NUMBER)) { printf("%d ",numvert/3); numvert = 0; } if (!curline || ismajor(curline->token)) break; /* back to main loop */ if(curline->token == NUMBER && state==LINE) numvert++; else state=curline->token; } printf("\n\n"); for (curline=globline; curline && !ismajor(curline->token); curline=curline->next) { if (curline->token == LINE) { printf("%d ",numcol?1:0); numcol = 0; } if(curline->token == COLOR) numcol++; } printf("\n\n"); } { struct line *curline; enum st state=IGNORE; int coordno=0; for (curline=globline; curline && !ismajor(curline->token); curline=curline->next) { if (curline->token != NUMBER) state = curline->token; else if (state == LINE) { printf("%s%c",curline->data,((++coordno)%3)?' ':'\n'); } } } { struct line *curline; Color c; char hascolor=0; char cnum=3; c[0] = c[1] = c[2] = 0; for (curline=globline; curline && !ismajor(curline->token); curline=curline->next) { if (curline->token == NUMBER) { if (cnum<3) { c[(int)cnum++]=atof(curline->data); hascolor = 1; } } else if (curline->token == LINE) { /* note VECTs need RGBA colors */ if(hascolor) printf("%f %f %f 1\n",c[0],c[1],c[2]); hascolor = 0; } else if (curline->token == COLOR) cnum = 0; } } printf("\n} #end of VECT\n"); } globline = curline; break; default: fprintf(stderr, "math2oogl: unexpected data: %s\n", globline->data); return 1; } /* end switch (globline->token) */ } printf ("\n} #end of LIST\n"); if (togv) { /* end our (geometry */ printf("\n)\n"); } return 0; } geomview-1.9.4/src/bin/geomutil/math2oogl/math2oogl.1gv0000644000175000001440000000223110600600312017641 00000000000000.\" Hey, EMACS: -*- nroff -*- .TH MATH2OOGL 1gv "February 23, 2001" .\" Please adjust this date whenever revising the manpage. .SH NAME math2oogl \- convert Mathematica grphics object to OOGL format .SH SYNOPSIS .B math2oogl .br .B math2oogl .BI -togeomview " objectname" " " geomview-path .SH DESCRIPTION This manual page documents briefly the .B math2oogl command. .PP \fBmath2oogl\fP converts Mathematica graphics objects, read from standard input, to OOGL format, written to standard output. SurfaceGraphics and MeshGraphics objects are converted to an OOGL MESH; a Graphics3D object is converted to OFF; and a BezierPatch is converted to a BEZuvn. .PP Note that we expect the graphics objects to have been processed as in OOGL.m, i.e. provide dimension and meshrange information and print out the colors before the points for SurfaceGraphics objects, and convert the characters "(){}, " to a newline. .SH FILES .I /usr/share/geomview/mathematica/OOGL.m .SH SEE ALSO .BR geomview (1). .SH AUTHOR This manual page was written by Steve Robbins , for the Debian GNU/Linux system (but may be used by others). geomview-1.9.4/src/bin/geomutil/math2oogl/Geomview.m0000644000175000001440000000130207730234002017275 00000000000000(* * Geomview.m selects Geomview graphics as the default for Show * of 3D graphics objects. Others still use the default system. * To restore normality, load < .0001, PlotPoints->5} Begin["`private`"] BezierPlot[f_,{t_,tmin_,tmax_},{u_,umin_,umax_},options___]:= Block[{it,iu,nt,nu,dt,du,loc,dfdt,dfdt0,dfdu,dfdu0,dboth,all, plotPoints=PlotPoints/.{options}/.Options[BezierPlot], eps=Epsilon/.{options}/.Options[BezierPlot]}, If[Length[plotPoints]==2,{nt,nu}=plotPoints,nt=plotPoints;nu=plotPoints]; If[nx<1 || ny<1,Message[BezierPlot::badpp];Return[{}]]; dt=N[(tmax-tmin)/nt]; du=N[(umax-umin)/nu]; If[!(NumberQ[dt]&&dt>0&&NumberQ[du]&&du>0), Message[BezierPlot::baditer];Return[{}]]; loc=Table[f/.{t->tmin+dt it,u->umin+du iu},{iu,0,nu},{it,0,nt}]; dfdt0=-loc+Table[f/.{t->tmin+dt(it+If[itumin+du iu}, {iu,0,nu},{it,0,nt}]; dfdt=MapAt[-1#&,#,-1]& /@ dfdt0/(3 eps); dfdu0=-loc+Table[f/.{t->tmin+dt it,u->umin+du(iu+If[iutmin+dt(it+If[itumin+du(iu+If[iu"riemann"] This displays the graphics `%3' on the remote host named `riemann'. `Geomview' recognizes the string `"local"' as a value for `$DisplayHost'; it forces the graphics to be displayed on the local machine. In addition to knowing the name of the machine you want to run Geomview on, the `Geomview' needs to know the type of that machine (SGI or NeXT). By default, `Geomview' assumes that it is the same kind of computer as the one you are running Mathematica on. The `MachType' option lets you explicitly specify the type of the `DisplayHost' computer; it should be one of the strings `"sgi"' or `"next"'. You can use `SetOptions' to change the default `DisplayHost' and `MachType'. For example, In[4] := SetOptions[Geomview, DisplayHost->"riemann", MachType->"sgi"] arranges for `Geomview' to run Geomview on an SGI workstation named `riemann'. Transporting Mathematica Files to Geomview by Hand -------------------------------------------------- The auxilliary function `WriteChunk' is for those who can only use Mathematica on a non-Unix machine (Mac, PC) or a Unix machine that is not on a network with an SGI or NeXT. `WriteChunk[FILE, GRAPHICS]' generates a file named FILE which contains the graphics object GRAPHICS in the format accepted by `math2oogl'. You can transfer that file to a computer that has Geomview installed on it and then use the programs `math2oogl', `oogl2rib', and `geomview' directly from the shell. These programs are distributed in the `bin/sgi' (on SGIs) or `bin/next' (on NeXTs) subdirectory of the Geomview directory, and may have been installed so that they are on your `path'. In[1]:= < mma.oogl to convert it to the OOGL file `mma.oogl' which you can then view using Geomview. This is the equivalent of the `WriteOOGL' command. For a result equivalent to the `Geomview' or `Show' commands, type math2oogl -togeomview Mathematica geomview < mychunk The `WriteRIB' command can be emulated from the shell as math2oogl < mychunk | oogl2rib -n mma.tiff Details of the Mathematica->Geomview Package ============================================ The `OOGL.m' package uses the external program `math2oogl' to convert `Graphics3D' objects to OOGL format, because a compiled external program is able to do this conversion many times faster than Mathematica. The converter will sometimes handle colored SurfaceGraphics objects correctly that Mathematica does not handle correctly, which means that Geomview[object] sometimes works where Show[object] will give errors. The converter supports the `Polygon', `Line', and `Point' graphics primitives, `RGBColor Graphics3D' directives, and `SurfaceGraphics' objects with or without `RGBColor' directives, and lists of any combination of these. It silently ignores all other directives. The Mathematica to RenderMan conversion is actually a two-step process: Mathematica->OOGL (math2oogl), and OOGL->RenderMan (oogl2rib). The math2oogl program has only been tested on SGIs and NeXTs, but could theoretically compile on any machine. The oogl2rib program depends on the OOGL (Object Oriented Graphics Language) libraries, which now only exist on SGI and NeXT machines. In the `WriteOOGL' and `WriteRIB' commands, filename can either be a string containing a filename, an `OutputStream' object, or a string starting with a `!' to send the output to a command. Object can be a `Graphics3D' object, a `SurfaceGraphics' object, or a list of these. The packages work best with Mathematica 2.0 or better. With version 1.2, the Geomview display is always on the local host. Installing the Mathematica Packages =================================== If Geomview is properly installed on your system according to the instructions in *Note Installation::, then the Mathematica-to-Geomview packages should work as described here; there should be no need for additional installation procedures. In practice, however, it is sometimes necessary to taylor the installation of the Mathematica packages and/or of Geomview itself to suit the needs of a particular system. This section contains details about how the installation works; if the Mathematica-to-Geomview connection does not seem to work for you after following the Geomview installation procedure, consult this section to see what might need to be fixed. In this section, the phrase *Geomview installation* refers any of the procedures in *Note Installation::. The way the Mathematica packages work and are installed is the same regardless of whether you have one of the binary distributions or the source distribution. 1. The relevant mathematica files are `OOGL.m', `Geomview.m', and `BezierPlot.m'; Mathematica must be able to find these files. They are distributed in the `$GEOMROOT/mathematica' subdirectory of the binary distributions, and in the `$GEOMROOT/src/bin/geomutil/math2oogl' subdirectory of the source distribution. These files need to be in a directory that is on Mathematica's search path. You can look at the value of the `$Path' variable in a Mathematica session on your system to see a list of the directories on Mathematica's search path. The Geomview installation procedure puts copies of the Mathematica packages into a directory that you specify (`MMAPACKAGEDIR'). This should ensure that Mathematica can find them. Alternately, you could arrange to append the pathname of the Mathmematica package subdirectory of the Geomview distribution to the `$Path' variable each time you run Mathematica. 2. The package `OOGL.m' needs to be able to invoke the programs `geomview', `math2oogl', and `oogl2rib'. The Geomview installation procedure installs these programs into a directory that you specify for executables (`BINDIR'). Ideally, this directory should be on your shell's `$path'. More specifically, it should be on the `$path' of the shell in which Mathematica runs; the directory `/usr/local/bin' is usually a good choice. You can see the list of directories on this path by giving the command `!echo $path' in Mathematica. If for some reason you can't arrange for `geomview', `math2oogl', and `oogl2rib' to be in a directory on the shell's `$path', you can modify `OOGL.m' to cause it to look for them using absolute pathnames. To do this, change the definitions of the variables `$GeomviewPath' and `$GeomRoot', which are defined near the top of the file. Change `$GeomviewPath' to the absolute pathname of the `geomview' shell script on your system. Change `$GeomRoot' to the absolute pathname of the `$GEOMROOT' directory on your system. If you do this, you should also make sure there are copies of `geomview', `math2oogl', and `oogl2rib' in the `$GEOMROOT/bin/sgi' (on an SGI) or `$GEOMROOT/bin/next' (on a NeXT) directory. 3. The `geomview' shell script, which `OOGL.m' uses to invoke Geomview, needs to be able to find the geomview executable file (which is called `gvx' on the SGI and `Geomview.app/Geomview' on the NeXT). The Geomview installation procedure should have been taken care of this, but if your Mathematica session doesn't seem to be able to invoke Geomview, it's worth double-checking that the settings in the `geomview' script are correct. geomview-1.9.4/src/bin/geomutil/Makefile.am0000644000175000001440000000023310462353477015515 00000000000000if HAVE_CXX VRML2OOGL = vrml2oogl else VRML2OOGL = endif SUBDIRS = bdy maple2oogl oogl2rib plutil $(VRML2OOGL) \ clip math2oogl oogl2vrml ucd hvectext geomview-1.9.4/src/bin/geomutil/Makefile.in0000644000175000001440000004001510665240475015526 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomutil DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = bdy maple2oogl oogl2rib plutil vrml2oogl clip math2oogl \ oogl2vrml ucd hvectext DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ @HAVE_CXX_FALSE@VRML2OOGL = @HAVE_CXX_TRUE@VRML2OOGL = vrml2oogl SUBDIRS = bdy maple2oogl oogl2rib plutil $(VRML2OOGL) \ clip math2oogl oogl2vrml ucd hvectext all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomutil/oogl2rib/0000777000175000001440000000000010665240700015253 500000000000000geomview-1.9.4/src/bin/geomutil/oogl2rib/oogl2rib.c0000644000175000001440000001745510622716743017076 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Scott Wisdom, Tamara Munzner */ #include "ooglutil.h" #include "mg.h" #include "mgrib.h" #include "mgribP.h" #include "mgribtoken.h" #include "camera.h" #include "window.h" #include "appearance.h" #include "quad.h" #include "geom.h" #include "bbox.h" #include "color.h" #include ColorA white = {1, 1, 1, 1}; ColorA black = {0, 0, 0, 1}; Point lightposition = {0, 0, 1}; ColorA ambient = {.2, .2, .2, 1.}; ColorA background = {0, 0, 0, 1}; /* black */ #define xPosition 0 #define yPosition 0 #define windowWidth 300 #define windowHeight 300 /* Switch Descriptions default: create a 'world' around the geometry. This will include all tokens necessary to position camera, scale and position geometry, a provide a singal light illuminating the front of the geometry. -g geometry: geometry only, no world, no world block. -b block: encapsulate geometry-only into a world block. This is the configuration to define a RIB file 'clip object' via the Quick RenderMan specification. -w define image width; -h define image height; -B background color. Default no background. -t tiff file name. Default "geom.tiff". If "framebuffer", draw to framebuffer, not as tiff file. */ int main(int argc, char **argv) { float cx,cy,cz,cs,dx,dy,dz; HPoint3 min,max; Geom *bbox = NULL; Transform ObjectTransform; LmLighting *lighting; LtLight *li[4]; Camera *cam = NULL; WnWindow *win; WnPosition position; Appearance *ap; Geom *ageom; float aspect; int wwidth; int wheight; enum _flag { geometry, minimal, world, block } flag; int errflag=0; int c, display; char *name = "geom.tiff"; int doback = 0; char *infile = "-"; char *outfile = "-"; FILE *outfileFD = stdout; FILE *infileFD = stdin; int framebuffer = 0; /* defaults */ flag = world; wwidth = windowWidth; wheight = windowHeight; /* process switches */ while ((c = getopt(argc, argv, "n:w:h:B:gbf")) != EOF) switch(c) { case 'w': wwidth = atoi(optarg); break; case 'h': wheight = atoi(optarg); break; case 'b': flag = block; break; case 'g': flag = geometry; break; case 'B': sscanf(optarg, "%f%*c%f%*c%f", &(background.r), &(background.g), &(background.b)); doback = 1; break; case 'n': name = optarg; break; case 'f': framebuffer = 1; /* don't change the name if they've set it: check if it's the default */ if (!strcmp(name, "geom.tiff")) name = "geom.rib"; break; default: errflag = 1; break; } if(optind => name for rendered TIFF file (default \"geom.tiff\")\n\ or framebuffer window (default \"geom.rib\").\n\ -B r,g,b => background color, each component ranges from 0 to 1. Default none.\n\ -w -h => width/height of rendered frame, in pixels.\n\ -f => .rib file renders to on-screen framebuffer instead of TIFF file.\n\ Default: create complete rib file containing default camera, lights, etc.\n\ -g => only geometry, -b => only Quick Renderman clip object. Ignores -nBwhf.\n"); exit(1); } TmIdentity(ObjectTransform); mgdevice_RIB(); li[0] = LtCreate(LT_COLOR, &white, LT_POSITION, &lightposition, LT_INTENSITY, 1.0, LT_END); lighting = LmCreate(LM_AMBIENT, &ambient, LM_REPLACELIGHTS, 1, LM_END); LmAddLight(lighting, li[0]); if(flag==world) { cam = CamCreate( CAM_FOV, 60.0, CAM_END ); ap = ApCreate(AP_DO, APF_FACEDRAW, AP_DO, APF_VECTDRAW, AP_LINEWIDTH, 1, AP_MtSet, MT_Kd, 1.0, MT_DIFFUSE, &white, MT_END, AP_LGT, lighting, AP_SHADING, APF_SMOOTH, AP_END); /* create the virtual window with an arbitrary size */ position.xmin = 0; position.xmax = wwidth-1; position.ymin = 0; position.ymax = wheight-1; win = WnCreate(WN_NAME, "noname", WN_CURPOS, &position, WN_END); /* update the camera postion and set the proper aspect ratio */ CamReset(cam); WnGet(win, WN_ASPECT, &aspect); CamSet(cam, CAM_ASPECT, aspect, CAM_FOV, 60.0, CAM_END); /* At the moment, mgctxset does not actually change MG_RIBDISPLAY and MG_RIBDISPLAYNAME, so do this during mgctxcreate - TMM */ if(framebuffer) display = MG_RIBFRAME; else display = MG_RIBTIFF; mgctxcreate(MG_RIBFILE, outfileFD, MG_RIBFORMAT, MG_RIBASCII, MG_RIBBACKING, MG_RIBNOBG, MG_WINDOW, win, MG_CAMERA, cam, MG_APPEAR, ap, MG_RIBDISPLAY, display, MG_RIBDISPLAYNAME, name, MG_END ); if(doback) { mgctxset( MG_RIBBACKING, MG_RIBDOBG, MG_BACKGROUND, &background, MG_END ); } } else { ap = ApCreate(AP_DO, APF_FACEDRAW, AP_DO, APF_VECTDRAW, AP_LINEWIDTH,1, AP_SHADING, APF_SMOOTH, /* Emit normals - slevy */ AP_MtSet, MT_Kd, 1.0, MT_Ks, 0.3, MT_Ka, 0.1, MT_DIFFUSE, &white, MT_EDGECOLOR, &black, MT_ALPHA, 1.0, MT_END, AP_LGT, lighting, AP_END); mgctxcreate(MG_RIBFILE, outfileFD, MG_SHOW, 0, /* overides Format & Display */ MG_RIBFORMAT, MG_RIBASCII, MG_APPEAR, ap, MG_END); } ageom = GeomFLoad(iobfileopen(infileFD), infile); if(flag==world) { mgworldbegin(); /* we use the bbox to determain how to place the geometry */ bbox = GeomBound(ageom, NULL, NULL); if (bbox != NULL) { BBoxMinMax((BBox*)bbox, &min, &max); cx = (max.x + min.x) * .5; cy = (max.y + min.y) * .5; cz = (max.z + min.z) * .5; dx = max.x - min.x; dy = max.y - min.y; dz = max.z - min.z; cs = 2.0 / sqrt(dx*dx + dy*dy + dz*dz); TmScale(ObjectTransform,cs,cs,cs); CtmTranslate(ObjectTransform,-cx,-cy,-cz); mgtransform(ObjectTransform); } } if(flag==block) { mrti(mr_worldbegin, mr_NULL); } GeomDraw(ageom); if(flag==world) { mgworldend(); mgrib_flushbuffer(); } else { if(flag==block) mrti(mr_worldend, mr_NULL); mgrib_flushbuffer(); } /* end up with a newline so that rib file can easily be appended to */ fprintf(outfileFD, "\n"); fflush(outfileFD); return 0; } geomview-1.9.4/src/bin/geomutil/oogl2rib/Makefile.am0000644000175000001440000000034410622716743017234 00000000000000INCLUDES = @default_includes@ bin_PROGRAMS = oogl2rib man_MANS = oogl2rib.1gv oogl2rib_SOURCES = oogl2rib.c oogl2rib_DEPENDENCIES = $(OOGLLIB) #oogl2rib_LDFLAGS = -rpath $(libdir) LDADD = $(OOGLLIB) EXTRA_DIST = $(man_MANS) geomview-1.9.4/src/bin/geomutil/oogl2rib/Makefile.in0000644000175000001440000004263310665240476017256 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = oogl2rib$(EXEEXT) subdir = src/bin/geomutil/oogl2rib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_oogl2rib_OBJECTS = oogl2rib.$(OBJEXT) oogl2rib_OBJECTS = $(am_oogl2rib_OBJECTS) oogl2rib_LDADD = $(LDADD) am__DEPENDENCIES_1 = DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(oogl2rib_SOURCES) DIST_SOURCES = $(oogl2rib_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ man_MANS = oogl2rib.1gv oogl2rib_SOURCES = oogl2rib.c oogl2rib_DEPENDENCIES = $(OOGLLIB) #oogl2rib_LDFLAGS = -rpath $(libdir) LDADD = $(OOGLLIB) EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/oogl2rib/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/oogl2rib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done oogl2rib$(EXEEXT): $(oogl2rib_OBJECTS) $(oogl2rib_DEPENDENCIES) @rm -f oogl2rib$(EXEEXT) $(LINK) $(oogl2rib_OBJECTS) $(oogl2rib_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oogl2rib.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-binPROGRAMS install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomutil/oogl2rib/oogl2rib.1gv0000644000175000001440000000267210600600312017320 00000000000000.\" Hey, EMACS: -*- nroff -*- .TH OOGL2RIB 1gv "February 23, 2001" .SH NAME oogl2rib \- convert OOGL file to RenderMan rib format .SH SYNOPSIS .B oogl2rib .BI [-n " name" ] .BI [-B " r,g,b" ] .BI [-w " width" ] .BI [-h " height" ] .BI [-fgb] .BI [ infile ] .BI [ outfile ] .SH DESCRIPTION This manual page documents briefly the .B oogl2rib command. .PP .B oogl2rib Convert OOGL file to RenderMan rib format. Default: read from stdin, write to stdout. Accepts "-" as infile/outfile. .SH OPTIONS The default action is to create a complete rib file containing default camera, lights, etc. .TP .BI \-n " name" Set name for rendered TIFF file (default "geom.tiff") or framebuffer window (default "geom.rib"). .TP .BI \-B " r,g,b" Set background color, each component ranges from 0 to 1. Default is no background. .TP .BI \-w " width" Set width of rendered frame, in pixels. .TP .BI \-h " height" Set height of rendered frame, in pixels. .TP .B \-f The .rib file renders to on-screen framebuffer instead of TIFF file. .TP .B \-g Output geometry only, no world, no world block. .TP .B \-b Encapsulate geometry-only into a world block. This is the configuration to define a RIB file 'clip object' via the Quick RenderMan specification. Ignores -nBwhf. .SH SEE ALSO .BR geomview (1). .SH AUTHOR This manual page was written by Steve Robbins , for the Debian GNU/Linux system (but may be used by others). geomview-1.9.4/src/bin/geomutil/plutil/0000777000175000001440000000000010665240700015045 500000000000000geomview-1.9.4/src/bin/geomutil/plutil/offconsol.main.c0000644000175000001440000000246610455700775020062 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "geom.h" #include "plutil.h" int main(int argc, char *argv[]) { float prec = 0.0; if (argc > 1) sscanf(argv[1], "%f", &prec); GeomFSave(PLConsol(GeomFLoad(iobfileopen(stdin), NULL), prec), stdout, NULL); exit(0); } geomview-1.9.4/src/bin/geomutil/plutil/offconsol.1gv0000644000175000001440000000121110600600312017347 00000000000000.TH offconsol 1gv "June 25, 1992" "Geometry Center" .SH NAME offconsol -\ polylist consolidator. .SH SYNOPSIS offconsol [precision] .SH DESCRIPTION .PP offconsol reads an OFF file from standard input and writes an OFF file in which vertices closer than a given precision have been combined. The default precision is zero. Color and normal information are not taken into account when comparing vertices. .PP The vertices of the resultant polyline have been sorted, and so there order bears no resemblance to the order of the point in the original polylist. .SH SEE ALSO plconsol(3), geomview(1) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.4/src/bin/geomutil/plutil/bez2mesh.1gv0000644000175000001440000000110110600600312017074 00000000000000.\" Hey, EMACS: -*- nroff -*- .TH BEZ2MESH 1gv "February 23, 2001" .SH NAME bez2mesh \- dices a BEZ file to a list of MESHes .SH SYNOPSIS .B bez2mesh .BI [[-] N ] .BI [ file.bez ] .SH DESCRIPTION This manual page documents briefly the .B bez2mesh command. .PP .B bez2mesh Dices a BEZ file to a list of MESHes, each diced NxN. If N negative, everts each patch. .SH SEE ALSO .BR geomview (1). .SH AUTHOR This manual page was written by Steve Robbins , for the Debian GNU/Linux system (but may be used by others). geomview-1.9.4/src/bin/geomutil/plutil/bez2mesh.c0000644000175000001440000000536510455700775016667 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include #include #include static void transpose(void *src, void *dst, int nu, int nv, int elsize) { char *tmp = (src == dst) ? malloc(nu*nv*elsize) : dst; char *p = src; int i,j; for(j = 0; j < nv; j++) { for(i = 0; i < nu; i++) { memcpy(tmp + (i*nu + j) * elsize, p, elsize); p += elsize; } } if(src == dst) { memcpy(dst, tmp, nu*nv*elsize); free(tmp); } } int main(int argc, char *argv[]) { Geom *g; List *l; Bezier *b; char *fname; int t; int n = 5; int evert = 0; if(argc <= 1) { fprintf(stderr, "Usage: %s [[-]N] [file.bez]\n\ Dices a BEZ file to a list of MESHes, each diced NxN.\n\ If N negative, everts each patch.\n", argv[0]); exit(1); } if(argc > 1) n = atoi(argv[1]); if(n < 0) evert = 1; g = (argc > 2 && strcmp(argv[2],"-")) ? GeomLoad(fname = argv[2]) : GeomFLoad(iobfileopen(stdin), fname = "stdin"); if(g == NULL) { fprintf(stderr, "%s: Couldn't read geometry from %s\n", argv[0], fname); exit(1); } if(strcmp(GeomName(g), "list") && strcmp(GeomName(g), "bezierlist")) { fprintf(stderr, "%s: input must be a bezierlist, not a %s\n", argv[0], GeomName(g)); exit(1); } GeomDice(g, abs(n), abs(n)); printf("{ LIST\n"); for(l = (List *)g; l; l = l->cdr) { if(strcmp(GeomName(l->car), "bezier")) continue; b = (Bezier *)l->car; if(evert) { transpose(b->CtrlPnts, b->CtrlPnts, b->degree_u+1, b->degree_v+1, b->dimn*sizeof(float)); t = b->degree_u; b->degree_u = b->degree_v; b->degree_v = t; } MeshFSave( BezierReDice(b), stdout ); } printf("}\n"); exit(0); } geomview-1.9.4/src/bin/geomutil/plutil/polymerge.1gv0000644000175000001440000000610310600600312017367 00000000000000.TH POLYMERGE 1gv "25 July 1993" "Geometry Center" .SH NAME polymerge \- merge coincident vertices, collinear edges, coplanar faces in an OOGL OFF object .SH SYNOPSIS \fBpolymerge\fP [\fB\-v\fP \fIvertex_thresh\fP] [\fB\-e\fP \fIedge_thresh\fP] [\fB\-f\fP \fIface_thresh\fP] [\fB\-V\fP] [\fB\-E\fP] [\fB\-F\fP] [\fB\-d\fP] [\fB\-b\fP] [\fIinputfile.off\fP] .SH DESCRIPTION \fIPolymerge\fP eliminates redundancies from polyhedral objects in OOGL's OFF format, and writes another OFF object to its standard output. (Optionally it can produce instead an input file for Brakke's Evolver.) Specifically, it combines nearly-coincident vertices, nearly-collinear edges, and nearly-coplanar faces. Vertices which aren't used on any face are deleted, as are faces with less than three vertices. Thresholds for approximate equality are adjustable from the command line. Options are: .IP "\fB\-v\fP \fIvertex_thresh\fP" Merge vertices when they're closer than \fIvertex_thresh\fP apart; the default is .00001. .IP "\fB\-V\fP" Don't attempt to merge vertices. .IP "\fB\-e\fP \fIedge_thresh\fP" Merge edges where |sin(vertex_angle)| < \fIedge_thresh\fP; the default is .01, merging edges with angles within about .5 degree of 0 or 180 degrees. When edges are merged, the corresponding vertex is removed. .IP "\fB\-E\fP" Don't attempt to merge edges. (4OFF edges are never merged.) .IP "\fB\-f\fP \fIface_thresh\fP" Merge faces sharing an edge where the faces are nearly coplanar: when |sin(angle_between_face_normal_vectors)| < \fIface_thresh\fP. The default is .03, or about two degrees. Note that merging can create faces which are concave polygons. .IP "\fB\-F\fP" Don't attempt to merge faces. (4OFF faces are never merged.) .IP "\fB\-b\fP" Produce an output file in .fe format for Brakke's Surface Evolver, instead of a new OFF file. .IP "\fB\-d\fP" Include debugging information as comments in the new OFF object. The comments indicate which vertices and faces in the original object correspond to which in the new one. Messages include: .IP "# Vtx \fInnn\fP->\fImmm\fP" Merged vertices \fInnn\fP and \fImmm\fP (both indices in the original object). .IP "# Merged face \fInnn\fP into \fImmm\fP (vertices \fIvvv\fP \fIwww\fP) n1.n2 \fIs\fP" Faces \fInnn\fP and \fImmm\fP in the original object were merged; their common edge joined original vertices \fIvvv\fP and \fIwww\fP. The cosine of the angle between the face normals was \fIs\fP. .IP "\fIvertex coordinates\fP # \fInewvertno\fP [\fIorder\fP] # \fIoldvertno\fP" Each vertex written appears with its new index, its order (number of edges touching that vertex), and its old index (index of a corresponding vertex in the original object). .IP "\fIface description\fP # \fIoldvertno ...\fP" For each new face, with \fIN\fP vertices after reduction, the comment indicates \fIN\fP corresponding vertices in the original object. .SH AUTHOR Stuart Levy, Geometry Center, University of Minnesota .SH "SEE ALSO" anytooff(1), offconsol(1) .SH BUGS Coplanar faces are merged even if they were assigned different colors. Should be able to handle binary OFF objects, but this hasn't been tested. geomview-1.9.4/src/bin/geomutil/plutil/Makefile.am0000644000175000001440000000060310600603072017006 00000000000000INCLUDES = @default_includes@ LDADD= ${OOGLLIB} DEPENDENCIES = $(OOGLLIB) #AM_LDFLAGS = -rpath $(libdir) bin_PROGRAMS = anytooff bez2mesh offconsol polymerge man_MANS = anytooff.1gv bez2mesh.1gv offconsol.1gv polymerge.1gv anytooff_SOURCES = anytooff.main.c bez2mesh_SOURCES = bez2mesh.c offconsol_SOURCES = offconsol.main.c polymerge_SOURCES = polymerge.c EXTRA_DIST = $(man_MANS) geomview-1.9.4/src/bin/geomutil/plutil/Makefile.in0000644000175000001440000004556010665240476017052 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = anytooff$(EXEEXT) bez2mesh$(EXEEXT) offconsol$(EXEEXT) \ polymerge$(EXEEXT) subdir = src/bin/geomutil/plutil DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_anytooff_OBJECTS = anytooff.main.$(OBJEXT) anytooff_OBJECTS = $(am_anytooff_OBJECTS) anytooff_LDADD = $(LDADD) am__DEPENDENCIES_1 = anytooff_DEPENDENCIES = $(am__DEPENDENCIES_1) am_bez2mesh_OBJECTS = bez2mesh.$(OBJEXT) bez2mesh_OBJECTS = $(am_bez2mesh_OBJECTS) bez2mesh_LDADD = $(LDADD) bez2mesh_DEPENDENCIES = $(am__DEPENDENCIES_1) am_offconsol_OBJECTS = offconsol.main.$(OBJEXT) offconsol_OBJECTS = $(am_offconsol_OBJECTS) offconsol_LDADD = $(LDADD) offconsol_DEPENDENCIES = $(am__DEPENDENCIES_1) am_polymerge_OBJECTS = polymerge.$(OBJEXT) polymerge_OBJECTS = $(am_polymerge_OBJECTS) polymerge_LDADD = $(LDADD) polymerge_DEPENDENCIES = $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(anytooff_SOURCES) $(bez2mesh_SOURCES) $(offconsol_SOURCES) \ $(polymerge_SOURCES) DIST_SOURCES = $(anytooff_SOURCES) $(bez2mesh_SOURCES) \ $(offconsol_SOURCES) $(polymerge_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ LDADD = ${OOGLLIB} DEPENDENCIES = $(OOGLLIB) man_MANS = anytooff.1gv bez2mesh.1gv offconsol.1gv polymerge.1gv anytooff_SOURCES = anytooff.main.c bez2mesh_SOURCES = bez2mesh.c offconsol_SOURCES = offconsol.main.c polymerge_SOURCES = polymerge.c EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/plutil/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/plutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done anytooff$(EXEEXT): $(anytooff_OBJECTS) $(anytooff_DEPENDENCIES) @rm -f anytooff$(EXEEXT) $(LINK) $(anytooff_OBJECTS) $(anytooff_LDADD) $(LIBS) bez2mesh$(EXEEXT): $(bez2mesh_OBJECTS) $(bez2mesh_DEPENDENCIES) @rm -f bez2mesh$(EXEEXT) $(LINK) $(bez2mesh_OBJECTS) $(bez2mesh_LDADD) $(LIBS) offconsol$(EXEEXT): $(offconsol_OBJECTS) $(offconsol_DEPENDENCIES) @rm -f offconsol$(EXEEXT) $(LINK) $(offconsol_OBJECTS) $(offconsol_LDADD) $(LIBS) polymerge$(EXEEXT): $(polymerge_OBJECTS) $(polymerge_DEPENDENCIES) @rm -f polymerge$(EXEEXT) $(LINK) $(polymerge_OBJECTS) $(polymerge_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anytooff.main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bez2mesh.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/offconsol.main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polymerge.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-binPROGRAMS install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomutil/plutil/anytooff.main.c0000644000175000001440000000634310455700775017715 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * anytooff.main.c * author: Celeste Fowler * date: June 12, 1992 */ #include #include #include "geom.h" #include "appearance.h" #include "transform.h" #include "transformn.h" #include "plutil.h" static char Usage[] = "\ Usage: %s [-n] [-nd] [-3d] [-non] [-noc] [filename ...]\n\ Converts OOGL file(s) to OFF (or nOFF) format. Writes to standard output.\n\ Reads from stdin if no file(s) specified.\n\ Produces the union of all file(s) if several are specified. Options:\n\ -n Compute normals.\n\ -nd allow emitting N-dimensional nOFF object if input is N-D.\n\ -3d only emit OFF objects; project down to 3-space\n\ -non No normals. Omit them even if input objects had them.\n\ -noc No colors. Omit them even if input objects had them.\n"; int main(int argc, char *argv[]) { Geom *g; PLData *pd; int i; int want = 0, unwant = 0; char *prog = argv[0]; while(argc > 1 && (argv[1][0] == '-') && argv[1][1] != '\0') { char *arg = &argv[1][1]; int len = strlen(arg); int bit = 0; int wanted = 1; if((strncmp(arg, "no", 2) == 0 && arg[2] != 'r')) { arg += 2; len -= 2; wanted = 0; } if(!strncmp(arg, "normals", len)) { bit = PL_N; } else if(!strcasecmp(arg, "nd")) { bit = PL_ND; } else if(!strcasecmp(arg, "3d")) { bit = PL_ND, wanted = !wanted; } else if(!strncasecmp(arg, "colors", len)) { bit = PL_C; } else { fprintf(stderr, "%s: unknown option %s\n", prog, argv[1]); fprintf(stderr, Usage, prog); exit(1); } if(wanted) { want |= bit; unwant &= ~bit; } else { want &= ~bit; unwant |= bit; } argc--, argv++; } if(argc <= 1) { argc = 2; argv[1] = "-"; } pd = NULL; for(i = 1; i < argc; i++) { if (strcmp(argv[i], "-") == 0) { g = GeomFLoad(iobfileopen(stdin), "standard input"); } else { g = GeomLoad(argv[i]); } pd = AnyGeomToPLData(g, TM_IDENTITY, NULL, NULL, pd); } /* Get the data. * If they explicitly asked for normals, force them to be recomputed * by including PL_N in both "unwant" and "want". */ g = PLDataToGeom(pd, want, unwant | (want & PL_N) ); GeomFSave(g, stdout, NULL); return g != NULL && !ferror(stdout) ? 0 : 1; } geomview-1.9.4/src/bin/geomutil/plutil/anytooff.1gv0000644000175000001440000000177410600600312017222 00000000000000.TH anytooff 1gv "November 2 1993" "Geometry Center" .SH NAME anytooff \- filter to convert a (set of) geomview data file(s) containing any geomview primitives into a single polylist. .SH SYNOPSIS anytooff [filename ...] .SH DESCRIPTION .PP Anytooff reads OOGL geometry data (from the given files, if any, otherwise from standard input) and outputs the new polylist (in OFF format) to standard output. Offcombine is a synonym for anytooff. .SH BUGS In converting a list object, anytooff uses PLCombine(3) to merge the members of the list. PLCombine(3) has certain limitations with regard to the way in handles color and normal data; see its manual page for details. .PP When vector objects are switched into polylists, they are transformed into polygons with two vertices. The faces of the polygons are the same color as the given vectors, but the edges of the polygons, which are their only visible aspect, have no color. .SH SEE ALSO anytopl(3), geomview(1) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.4/src/bin/geomutil/plutil/polymerge.c0000644000175000001440000007153210622132220017126 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Squeeze OFF files. * Merges collinear edges and coplanar faces. */ #include #include #include #include /* for qsort(), malloc(), atof() */ #include /* variable-length arrays, getopt() and stuff */ #ifdef NeXT extern char *strdup(const char *); #endif #define VSUB(a, b, dst) (dst)->x = (a)->x - (b)->x, \ (dst)->y = (a)->y - (b)->y, \ (dst)->z = (a)->z - (b)->z #define VDOT(a, b) (a)->x*(b)->x + (a)->y*(b)->y + (a)->z*(b)->z #define VLENGTH(a) sqrt(VDOT(a, a)) #define VCROSS(a, b, dst) (dst)->x = (a)->y * (b)->z - (a)->z * (b)->y, \ (dst)->y = (a)->z * (b)->x - (a)->x * (b)->z, \ (dst)->z = (a)->x * (b)->y - (a)->y * (b)->x #define VSADD(a, s, b, dst) (dst)->x = (a)->x + (s)*(b)->x, \ (dst)->y = (a)->y + (s)*(b)->y, \ (dst)->z = (a)->z + (s)*(b)->z #define VSCALE(a, s) (a)->x *= (s), (a)->y *= (s), (a)->z *= (s) float EPS_LINEAR= 0.0001; /* Max unit-vector cross product for collinearity */ float EPS_NORMAL= 0.0009; /* Max sin^2 theta between normals for coplanarity */ float EPS_POINT= 0.00001;/* Max distance between coincident vertices */ #define F_VERT 0x1 #define F_EDGE 0x2 #define F_FACE 0x4 #define F_EVOLVER 0x8 typedef struct vertex V; typedef struct face F; typedef struct faceedge Fe; typedef struct edge E; typedef struct geodesic Geod; typedef struct point { float x, y, z, w; } P; struct vertex { P p; int ref; int index; float *more; }; struct faceedge { F *face; Fe *prev, *next; /* double links in face-edges of this face */ E *edge; int sign; /* direction w.r.t. edge */ P n; /* adopted surface normal at this edge */ Fe *elink; }; struct face { Fe *fedges; char *affix; }; struct edge { V *v[2]; /* vertex pointers */ E *link; /* hash table link */ P to; /* normalized edge direction vector */ Fe *feds; /* faceedge's on this edge */ int index; /* for numbering edges for .fe format */ }; struct geodesic { int faceno, vertno; /* Seed data. Starting face, or failing that, starting vertex */ F *face; /* Current-face pointer */ P base; /* Geodesic base point */ P dir; /* Geodesic current direction vector */ float length; /* Total length of geodesic */ float maxlength; /* Maximum length of geodesic */ vvec pts; /* list of points (P) traced on geodesic */ }; static int nv, nf, tossedf; static V *Vs; /* All vertices */ static F *Fs; /* All faces */ static E **ehash; /* Array of hash-table head pointers */ static int nhash; static int flags = F_VERT|F_EDGE|F_FACE; static int debug = 0; static int vdim = 3; vvec geods; /* List of geodesics to be traced */ static Fe *fedge( F *f, V *v0, V *v1 ); static void vmerge(void); static void trace_geodesic(Geod *g); static E *advance_geodesic(Geod *g, E *avoid); static void add_geodesic(Geod *g, char *str); static void reflectline(P *axis, P *vector, P *result); static void rotation(P *va, P *vb, float T[3][3]); static int vcmp(V **p, V **q); static void deface(F *f); static void normal_ize(F *f); /*static E *echeck(int v0, int v1);*/ /*static void fecheck(Fe *fe);*/ static void femerge(Fe *fe1, Fe *fe2); static void unfedge(Fe *fe); static Fe *fedge(F *f, V *v0, V *v1); #define New(t) (t *) malloc(sizeof(t)) #define NewN(t, N) (t *) malloc((N)*sizeof(t)) int main(int argc, char *argv[]) { int i; int tnv, tne, any; int binary = 0, vertsize = 0; char *C = "", *N = "", *four = ""; extern int optind; extern char *optarg; IOBFILE *iobf; VVINIT(geods, Geod, 5); vvzero(&geods); while((i = getopt(argc, argv, "bdv:e:f:VEFg:")) != EOF) { switch(i) { case 'b': flags |= F_EVOLVER; break; case 'd': debug = 1; break; case 'v': EPS_POINT = atof(optarg); break; case 'e': EPS_LINEAR = atof(optarg); EPS_LINEAR *= EPS_LINEAR; break; case 'f': EPS_NORMAL = atof(optarg); EPS_NORMAL *= EPS_NORMAL; break; case 'V': flags &= ~F_VERT; break; case 'E': flags &= ~F_EDGE; break; case 'F': flags &= ~F_FACE; break; case 'g': add_geodesic(VVAPPEND(geods, Geod), optarg); break; default: fprintf(stderr, "\ Usage: polymerge [-v vertex_thresh] [-e edge_thresh] [-f face_thresh]\n\ [-V][-E][-F][-d][-b] [infile.off]\n\ Merges coincident vertices, collinear edges, coplanar faces of an OFF object.\n\ -v vertex_thresh: max separation for \"coincident\" vertices (default %g)\n\ -e edge_thresh : max sin(theta) for \"collinear\" edges (default %g)\n\ -f face_thresh : max sin(theta) for \"coplanar\" facet normals (default %.4g)\n\ -V -E -F : don't try to merge vertices/edges/faces\n\ -b : create output in evolver .fe format\n\ -d : debug\n", EPS_POINT, sqrt(EPS_LINEAR), sqrt(EPS_NORMAL)); exit(1); } } if(optind < argc) { if(freopen(argv[argc-1], "rb", stdin) == NULL) { fprintf(stderr, "polymerge: can't open input: "); perror(argv[argc-1]); exit(1); } } /* If we're tracing geodesics, we must have collinear edges merged * and facet-normals computed. */ if(VVCOUNT(geods) > 0) flags |= F_EDGE; iobf = iobfileopen(stdin); vdim = 3; for(;;) { switch( iobfnextc(iobf, 0) ) { case 'N': N = "N"; vertsize += 3; goto swallow; case 'C': C = "C"; vertsize += 4; goto swallow; case '4': four = "4"; vdim = 4; flags &= ~(F_EDGE|F_FACE); goto swallow; swallow: case '{': case '=': iobfgetc(iobf); break; case 'a': /* Appearance? Silently swallow keyword */ iobfexpectstr(iobf, "appearance"); if(iobfnextc(iobf, 0) == '{') { int c, brack = 0; do { if((c = iobfgetc(iobf)) == '{') brack++; else if(c == '}') brack--; } while(brack > 0 && c != EOF); } break; default: goto done; } } done: iobfexpecttoken(iobf, "OFF"); /* swallow optional OFF prefix */ if(iobfexpecttoken(iobf, "BINARY") == 0) { binary = 1; iobfnextc(iobf, 1); iobfgetc(iobf); } if(iobfgetni(iobf, 1, &nv, 0) <= 0 || iobfgetni(iobf, 1, &nf, 0) <= 0 || iobfgetni(iobf, 1, &nhash, 0) <= 0 || nv <= 0 || nf <= 0) { fprintf(stderr, "polymerge: Input not an OFF file.\n"); exit(1); } nhash = (nf + nv + 4) / 2; if(nhash < 16) nhash = 17; if(!(nhash & 1)) nhash++; ehash = NewN(E *, nhash); memset((char *)ehash, 0, nhash*sizeof(E *)); Vs = NewN(V, nv); Fs = NewN(F, nf); for(i = 0; i < nv; i++) { V *vp = &Vs[i]; vp->p.w = 1; if(iobfgetnf(iobf, vdim, (float *)&vp->p, binary) < vdim) { badvert: fprintf(stderr, "polymerge: error reading vertex %d/%d\n", i,nv); exit(1); } if(vertsize) { Vs[i].more = NewN(float, vertsize); if(iobfgetnf(iobf, vertsize, Vs[i].more, binary) < vertsize) goto badvert; } Vs[i].ref = 0; Vs[i].index = i; } /* * Combine vertices */ if(flags & F_VERT) vmerge(); /* * Load faces * The fedge() calls here assume we've already merged all appropriate * vertices. */ tossedf = 0; for(i = 0; i < nf; i++) { F *fp = &Fs[i]; Fe *fe; int nfv, k, c; int v, ov, v0; Fe head; char *cp; char aff[512]; if(iobfgetni(iobf, 1, &nfv, binary) <= 0 || nfv <= 0) { fprintf(stderr, "polymerge: error reading face %d/%d\n", i, nf); exit(1); } head.prev = head.next = &head; fp->fedges = &head; iobfgetni(iobf, 1, &v, binary); if(v < 0 || v >= nv) { fprintf(stderr, "polymerge: bad vertex %d on face %d\n", v, i); exit(1); } v0 = ov = Vs[v].index; /* Use common vertex if merged */ for(k = 1; k < nfv; k++, ov = v) { iobfgetni(iobf, 1, &v, binary); if(v < 0 || v >= nv) { fprintf(stderr, "polymerge: bad vertex %d on face %d\n", v, i); exit(1); } v = Vs[v].index; /* Use common vertex if merged */ if(ov == v) continue; head.prev->next = fe = fedge(fp, &Vs[ov], &Vs[v]); fe->prev = head.prev; fe->next = &head; head.prev = fe; } if(v != v0) { fe = fedge(fp, &Vs[v], &Vs[v0]); head.prev->next = fe; fe->prev = head.prev; fe->next = &head; head.prev = fe; } head.next->prev = head.prev; if(head.next == &head) { /* * Degenerate face here */ fp->fedges = NULL; tossedf++; if (debug) printf("# Face %d degenerate already\n", i); } else { head.prev->next = fp->fedges = head.next; } if(binary) { int nfc; float c; iobfgetni(iobf, 1, &nfc, binary); if(nfc > 4) { fprintf(stderr, "Bad face color count 0x%x", nfc); exit(1); } for(cp = aff; --nfc >= 0; cp += strlen(cp)) { iobfgetnf(iobf, 1, &c, binary); sprintf(cp, " %g", c); } } else { (void) iobfnextc(iobf, 1); for(cp = aff; (c = iobfgetc(iobf)) != EOF && c != '\n' && cp < &aff[511]; ) *cp++ = c; } *cp = '\0'; fp->affix = (cp > aff) ? strdup(aff) : ""; } /* * Compute face normals -- actually corner normals, since we avoid * assuming faces are planar. As a side effect, we detect & join * collinear edges. */ if(flags & F_EDGE) { for(i = 0; i < nf; i++) { normal_ize(&Fs[i]); } } /* Trace geodesic(s) if we're given any. */ for(i = 0; i < VVCOUNT(geods); i++) { trace_geodesic(&VVEC(geods, Geod)[i]); } /* * Locate edges bounding faces with the same normal direction. */ if(flags & F_FACE) { do { any = 0; for(i = 0; i < nhash; i++) { E *e; for(e = ehash[i]; e != NULL; e = e->link) { Fe *fe, *fee; for(fe = e->feds; fe != NULL; fe = fe->elink) { for(fee = fe->elink; fee != NULL; fee = fee->elink) { float dn; dn = VDOT(&fe->n, &fee->n); if(fabs(1 - dn*dn) < EPS_NORMAL) { /* * OK, merge fee into fe */ femerge(fe, fee); any++; goto another; } } } another: ; } } if (debug) printf("# %d faces merged this pass.\n", any); } while(any); } /* * Scan for unused edges. */ for(i = 0; i < nv; i++) Vs[i].ref = 0; tne = 0; for(i = 0; i < nhash; i++) { E *e; for(e = ehash[i]; e != NULL; e = e->link) { if(e->feds != NULL) { e->v[0]->ref++; e->v[1]->ref++; e->index = ++tne; } } } /* * Renumber used vertices. */ if(flags & 1) { tnv = 0; for(i = 0; i < nv; i++) Vs[i].index = Vs[i].ref ? tnv++ : -i-1; } else { tnv = nv; } if(VVCOUNT(geods) > 0) { /* Emit all geodesics as a VECT object. */ /* Don't emit anything else. */ int i, j, totv = 0, totpl = 0; Geod *g; for(i = 0; i < VVCOUNT(geods); i++) { g = &VVEC(geods, Geod)[i]; if(VVCOUNT(g->pts) > 1) { totv += VVCOUNT(g->pts); totpl++; } } printf("VECT\n"); printf("%d %d %d\n", totpl, totv, 0); for(i = 0; i < VVCOUNT(geods); i++) { g = &VVEC(geods, Geod)[i]; if(VVCOUNT(g->pts) > 1) { printf("%d ", VVCOUNT(g->pts)); } } printf("\n"); for(i = 0; i < totpl; i++) printf("0 "); printf("\n\n"); for(i = 0; i < VVCOUNT(geods); i++) { P *pt; g = &VVEC(geods, Geod)[i]; if(VVCOUNT(g->pts) > 1) { pt = VVEC(g->pts, P); for(j = VVCOUNT(g->pts); --j >= 0; pt++) printf("%g %g %g\n", pt->x, pt->y, pt->z); } } exit(0); } if (flags & F_EVOLVER) /* Produce Brakke's evolver .fe format */ { int j=0; if (vdim == 4) printf("space_dimension 4\n"); printf("vertices\n"); for(i = 0; i < nv; i++) { V *v = &Vs[i]; if(v->ref || !(flags & 1)) { v->index = ++j; printf("%d\t%#g %#g %#g", v->index, v->p.x, v->p.y, v->p.z); if(vdim == 4) printf(" %g", v->p.w); printf("\n"); } } printf("\nedges\n"); for(i = 0; i < nhash; i++) { E *e; for(e = ehash[i]; e != NULL; e = e->link) if(e->feds != NULL) printf("%d\t%d %d\n", e->index,e->v[0]->index,e->v[1]->index); } printf("\nfaces\n"); j=0; for(i=0; inext) != fe; k++) ; if ((nfv = k)<3) continue; /* don't print faces of less than 3 sides */ printf("%d", ++j); for(fee = fe, k = nfv; --k >= 0; fee = fee->next) printf(" %d", (1-2*fee->sign)*fee->edge->index); printf("\n"); } } else /* Produce OFF format */ { printf("%s%s%sOFF\n%d %d %d\n", C, N, four, tnv, nf - tossedf, tne); for(i = 0; i < nv; i++) { V *v = &Vs[i]; int k; if(v->ref || !(flags & F_VERT)) { printf("%#g %#g %#g", v->p.x, v->p.y, v->p.z); if(vdim == 4) printf(" %#g", v->p.w); if(vertsize) { printf(" "); for(k = 0; k < vertsize; k++) printf(" %#g", v->more[k]); } if(debug) printf("\t# %d [%d] #%d", v->index, v->ref, i); printf("\n"); } } printf("\n"); /* ho hum */ for(i=0; inext) != fe; k++) ; nfv = k; printf("%d", nfv); for(fee = fe, k = nfv; --k >= 0; fee = fee->next) printf(" %d", fee->edge->v[fee->sign]->index); printf("\t%s", Fs[i].affix); if(debug) { printf(" #"); for(fee = fe, k = nfv; --k >= 0; fee = fee->next) printf(" %d", (int)(fee->edge->v[fee->sign] - Vs)); } printf("\n"); } } exit(1); } /* * Add a new faceedge */ static Fe *fedge(F *f, V *v0, V *v1) { Fe *fe; E *e; int t; int i0, i1; float r; fe = New(Fe); fe->face = f; fe->sign = 0; i0 = v0->index; i1 = v1->index; if(i0 > i1) { V *tv = v0; v0 = v1; v1 = tv; i0 = v0->index; i1 = v1->index; fe->sign = 1; } t = (unsigned long)(v0->index + v1->index + v0->index*v1->index) % nhash; /* Symmetric hash function */ for(e = ehash[t]; e != NULL; e = e->link) if(e->v[0]->index == i0 && e->v[1]->index == i1) goto gotit; e = New(E); e->v[0] = v0; e->v[1] = v1; e->feds = NULL; VSUB(&v0->p, &v1->p, &e->to); r = VDOT(&e->to, &e->to); if(r != 0) { r = 1/sqrt(r); e->to.x *= r; e->to.y *= r; e->to.z *= r; } else if (debug) printf("# Coincident: %d == %d [%g %g %g]\n", v0->index, v1->index, v0->p.x,v0->p.y,v0->p.z); e->link = ehash[t]; ehash[t] = e; gotit: fe->edge = e; fe->elink = e->feds; e->feds = fe; return fe; } /* * Remove a faceedge from its edge list */ static void unfedge(Fe *fe) { Fe **fepp; for(fepp = &fe->edge->feds; *fepp != NULL; fepp = &(*fepp)->elink) { if(*fepp == fe) { *fepp = fe->elink; break; } } free(fe); } /* * Merge two faces * We delete these face-edges from both faces */ static void femerge(Fe *fe1, Fe *fe2) { F *f1, *f2; Fe *tfe; if(fe1->face == fe2->face) { if (debug) printf("# Merging two edges of face %d -- tossing it.\n", (int)(fe1->face - Fs)); deface(fe1->face); return; } if(fe1->sign == fe2->sign) { /* * Messy. To merge these, we need to reverse all the links * in one of the two faces. */ Fe *xfe; tfe = fe2; do { tfe->sign ^= 1; xfe = tfe->next; tfe->next = tfe->prev; tfe->prev = xfe; tfe = xfe; } while(tfe != fe2); } fe1->prev->next = fe2->next; fe2->next->prev = fe1->prev; fe1->next->prev = fe2->prev; fe2->prev->next = fe1->next; f1 = fe1->face; f2 = fe2->face; if(f1->fedges == fe1) f1->fedges = fe2->next; if(debug) printf("# Merged face %d into %d (vertices %d %d) n1.n2 %g\n", (int)(f2-Fs), (int)(f1-Fs), fe1->edge->v[fe1->sign]->index, fe1->edge->v[1 - fe1->sign]->index, VDOT(&fe1->n, &fe2->n)); tfe = fe2->next; if(tfe == NULL) { fprintf(stderr, "polymerge: face f2 already deleted?\n"); } else { do { tfe->face = f1; } while((tfe = tfe->next) != fe1->next); } f2->fedges = NULL; tossedf++; unfedge(fe1); unfedge(fe2); /* * Join collinear edges, recompute normals (might have changed a bit). */ normal_ize(f1); } #define PRETTY(x) ((int)(x) - 0x10000000) #if 0 static void fecheck(Fe *fe) { Fe *fee; F *f; E *e; if(fe == NULL) return; f = fe->face; fprintf(stderr,"0x%p: on face %d (%p); ", (void *)fe, f - Fs, (void *)f); fee = fe; do { fprintf(stderr," %s%x[%d%s%d] ", (f->fedges == fee) ? "*" : "", PRETTY(fee), fee->edge->v[0]->index, fee->sign ? "<-" : "->", fee->edge->v[1]->index); if(fee->face != f) fprintf(stderr," Fe %p: face %d (%p) != %p\n", (void *)PRETTY(fee), fee->face - Fs, (void *)fee->face, (void *)f); if(fee->next->prev != fee) fprintf(stderr," Fe %x: next %x next->prev %x\n", PRETTY(fee), PRETTY(fee->next), PRETTY(fee->next->prev)); e = fee->edge; fee = fee->next; } while(fee != fe); fprintf(stderr, "\n"); } #endif #if 0 static E *echeck(int v0, int v1) { E *e; int t = (v0 + v1 + v0*v1) % nhash; /* Symmetric hash function */ if(v0 > v1) v0 ^= v1, v1 ^= v0, v0 ^= v1; for(e = ehash[t]; e != NULL; e = e->link) { if(e->v[0] == &Vs[v0] && e->v[1] == &Vs[v1]) { Fe *fe; fprintf(stderr, "E 0x%p %d-%d (%d-%d) %p...\n", (void *)e, v0,v1, e->v[0]->index, e->v[1]->index, (void *)PRETTY(e->feds)); for(fe = e->feds; fe != NULL; fe = fe->elink) { fecheck(fe); } } } return e; } #endif static void normal_ize(F *f) { Fe *fe; fe = f->fedges; if(fe == NULL) return; if(fe->prev == fe->next) { if (debug) printf("# Face %d already degenerate -- tossing it.\n", (int)(f - Fs)); deface(f); return; } do { /* loop over edges on this face */ P n; float r; for(;;) { Fe *fn, *fee; P *pp, *qp; pp = &fe->edge->to; fee = fe->next; qp = &fee->edge->to; VCROSS(pp, qp, &n); r = VDOT(&n, &n); if(r > EPS_LINEAR) break; /* * Join collinear edges; produce a new edge */ fn = fedge(f, fe->edge->v[fe->sign], fee->edge->v[1-fee->sign]); fee->next->prev = fe->prev->next = fn; fn->next = fee->next; fn->prev = fe->prev; if(fe == f->fedges || fee == f->fedges) f->fedges = fn; /* preserve headiness */ unfedge(fee); if(fee != fe) unfedge(fe); if(fn->prev == fn->next) { /* * This face became degenerate -- toss it. */ if (debug) printf("# degenerate face %d\n", (int)(f - Fs)); deface(f); return; } fe = fn; } r = 1/sqrt(r); if(n.x < 0 || (n.x == 0 && n.y < 0) || (n.y == 0 && n.z < 0)) r = -r; /* Canonicalize */ fe->n.x = n.x*r; fe->n.y = n.y*r; fe->n.z = n.z*r; } while((fe = fe->next) != f->fedges); } /* * Delete a face, erasing all edges. */ static void deface(F *f) { Fe *fe, *fee; fe = f->fedges; if(fe == NULL) return; do { fee = fe->next; unfedge(fe); fe = fee; } while(fe != f->fedges); f->fedges = NULL; tossedf++; } static int vcmp(V **p, V **q) { V *vp, *vq; float d; vp = *p; vq = *q; d = vp->p.x - vq->p.x; if(d < 0) return -1; if(d > 0) return 1; d = vp->p.y - vq->p.y; if(d < 0) return -1; if(d > 0) return 1; d = vp->p.z - vq->p.z; if(d < 0) return -1; if(d > 0) return 1; if(vp->p.w == vq->p.w) return 0; return(vp->p.w < vq->p.w ? -1 : 1); } static void vmerge(void) { V **vp; int i, j; V *a, *b; int nexti; vp = NewN(V *, nv); for(i = 0, a = Vs; i < nv; i++) { a->ref = 0; vp[i] = a++; } qsort(vp, nv, sizeof(V *), (int (*)())vcmp); /* * Now all matches will occur within X-runs */ for(i = 0; i < nv; i = nexti ? nexti : i+1) { nexti = 0; a = vp[i]; if(a->ref) continue; for(j = i; ++j < nv; ) { b = vp[j]; if(b->ref) continue; if(b->p.x - a->p.x > EPS_POINT) break; if(fabs(a->p.y - b->p.y) < EPS_POINT && fabs(a->p.z - b->p.z) < EPS_POINT && (vdim == 3 || fabs(a->p.w - b->p.w) < EPS_POINT)) { if (debug) printf("# Vtx %d->%d\n", b->index, a->index); b->index = a->index; b->ref++; } else if(!nexti) nexti = j; } } free(vp); } /* * Add a geodesic, described by a string. */ static void add_geodesic(Geod *g, char *str) { int ok; float r; VVINIT(g->pts, P, 20); ok = sscanf(str, "%d,%f,%f,%f,%f,%f,%f,%f", &g->faceno, &g->base.x, &g->base.y, &g->base.z, &g->dir.x, &g->dir.y, &g->dir.z, &g->maxlength); if(ok < 7) { fprintf(stderr, "Geodesic must have form: faceno,X0,Y0,Z0,X1,Y1,Z1\n\ where X0,Y0,Z0 define the base point, X1,Y1,Z1 the direction,\n\ and faceno is the integer index of the face on which the base-point lies.\n"); exit(1); } /* Convert X1,Y1,Z1 into direction vector. */ VSUB(&g->dir, &g->base, &g->dir); r = VLENGTH(&g->dir); if(r) VSCALE(&g->dir, 1/r); } /* Generate 3x3 rotation matrix which takes va -> vb * Assumes va and vb both unit vectors. */ static void rotation(P *va, P *vb, float T[3][3]) { float adotb = VDOT(va, vb); float ab_1 = adotb - 1; float apb, apb2; int i, j; P aperpb; VSADD(vb, -adotb, va, &aperpb); apb2 = VDOT(&aperpb, &aperpb); if(apb2 == 0) { float dot; if(adotb >= 0) { /* Either some vector is zero, or they're identical. No rot'n. */ memset(T, 0, 9*sizeof(float)); T[0][0] = T[1][1] = T[2][2] = 1; return; } /* Oppositely directed vectors. Pick an arbitrary plane and * rotate 180 degrees in it. */ if(fabs(va->x) < .7) aperpb.x = 1; else aperpb.y = 1; dot = VDOT(&aperpb, va); VSADD(&aperpb, dot, va, &aperpb); apb2 = VDOT(&aperpb, &aperpb); } apb = VDOT(&aperpb, vb) / apb2; for(i = 0; i < 3; i++) { float ai = (&va->x)[i]; float api = (&aperpb.x)[i]; for(j = 0; j < 3; j++) { T[i][j] = (&va->x)[j] * (ai*ab_1 - api*apb) + (&aperpb.x)[j] * (api*ab_1/apb2 + ai*apb); } T[i][i] += 1; } } /* * result = vector reflected in axis */ static void reflectline(P *axis, P *vector, P *result) { float mag = VDOT(axis, axis); float along = VDOT(axis, vector); *result = *vector; VSCALE(result, -1); VSADD(result, 2*along/mag, axis, result); } /* * Carry this geodesic forward across one facet. * Update g->face to the new face, if any, or NULL if we encountered a boundary. * Update g->base and g->dir to be a point and direction on the new face. * Return pointer to the edge with which we found an intersection * (with g->base presumably being some point on that edge). * Avoid considering an intersection with the edge that led us here, if any. * * Return a pointer to the edge we found the intersection with, NULL if none. */ static E * advance_geodesic(Geod *g, E *avoid) { Fe *fed, *bestfed = NULL; E *edge; P n; P lb, bestbase = { 0, }, bestdir = { 0, }; float r, u, t, bestt; int i; struct point2 { float u, v; } lbase, ldir; if(g->face == NULL) return NULL; /* Test for intersections with all the edges on this face. */ bestt = 1e20; fed = g->face->fedges; do { edge = fed->edge; if(edge != avoid) { /* We have at hand: * edge->v[1], the base point of the edge; let's call it * the origin of our local coordinate system * edge->to, "e", a unit vector pointing along the edge * fed->n, "N", the face surface normal as a unit vector * Let's call local coordinates on this face "u" and "v", * with "u" positive along the edge and "v" perp. to it. */ /* Construct the other basis vector, "n" = N cross e */ VCROSS(&fed->n, &edge->to, &n); /* Transform base point g->base to local coords */ VSUB(&g->base, &edge->v[1]->p, &lb); /* Subtract local origin */ lbase.u = VDOT(&edge->to, &lb); lbase.v = VDOT(&n, &lb); /* Transform direction g->dir to local coords too. * Since we want to squash everything down onto the face, * let's just ignore the components in the direction of N. */ ldir.u = VDOT(&edge->to, &g->dir); ldir.v = VDOT(&n, &g->dir); /* * Where does lbase + t*ldir cross the v=0 axis? * If this t comes closer than any other so far, take it. */ if(ldir.v != 0) { t = -lbase.v/ldir.v; u = lbase.u + t * ldir.u; if(t > 0 && t < bestt && u >= 0) { /* Final check: does our new point actually * lie within the length of the edge? */ P edgevec; VSUB(&edge->v[1]->p, &edge->v[0]->p, &edgevec); if(VDOT(&edgevec,&edgevec) >= u*u) { bestt = t; bestfed = fed; /* Compute new base point */ VSADD(&edge->v[1]->p, u, &edge->to, &bestbase); /* Transform direction back into 3-space. * It'll be almost the same, but possibly not quite, in * case it didn't lie quite in the plane of the face. */ bestdir.x = edge->to.x * ldir.u + n.x * ldir.v; bestdir.y = edge->to.y * ldir.u + n.y * ldir.v; bestdir.z = edge->to.z * ldir.u + n.z * ldir.v; } } } } fed = fed->next; } while(fed != g->face->fedges); if(bestfed) { /* We did find some edge intersection. */ /* Update base point and direction, and increment length. */ P piece; VSUB(&bestbase, &g->base, &piece); g->length += VLENGTH(&piece); g->base = bestbase; g->dir = bestdir; /* Add base point to list of vertices on the geodesic. */ *VVAPPEND(g->pts, P) = g->base; /* Whither next? Look for a different face on the same edge. * The face-edges which share an edge are linked together via * their "elink" fields, and edge->feds points to the first one. */ edge = bestfed->edge; fed = edge->feds; while(fed == bestfed) fed = fed->elink; if(fed != NULL) { /* We have a neighboring face on this edge. */ float T[3][3]; float dir[3]; /* Remember which face. */ g->face = fed->face; /* Construct a rotation * from plane of old face (bestfed->n) * into plane of new face (fed->n). */ rotation(&bestfed->n, &fed->n, T); /* dir = bestdir * T */ for(i = 0; i < 3; i++) { dir[i] = bestdir.x*T[0][i] + bestdir.y*T[1][i] + bestdir.z*T[2][i]; } g->dir = *(P *)(void *)dir; } else { /* There's no neighboring face. Must have reached a boundary. */ g->face = NULL; } /* Re-normalize direction in case it wasn't quite a unit vector. */ r = VLENGTH(&g->dir); if(r != 0 && r != 1) VSCALE(&g->dir, 1/r); return bestfed->edge; } else { /* Somehow, we didn't find an intersection with any of the edges * of this face. Maybe we were pointing in the wrong direction * (away from the face rather than into it)? */ return NULL; } } static void trace_geodesic(Geod *g) { E *edge, *nextedge; int maxsteps = 1000000; float maxlength = 1e10; /* Bootstrap. * Take our facet-number, and initialize * g->face from it. */ if(g->faceno < 0 || g->faceno >= nf) { fprintf(stderr, "Can't believe geodesic starting from face #%d, ignoring it.\n", g->faceno); return; /* Forget it. */ } /* Stuff the initial point into the geodesic path. */ *VVAPPEND(g->pts, P) = g->base; g->face = &Fs[g->faceno]; /* Interpret length limit. How far shall we trace this geodesic? * Negative -> facet count, positive -> Euclidean length, zero -> default. */ if(g->maxlength < 0) { maxsteps = -g->maxlength; } else if(g->maxlength > 0) { maxlength = g->maxlength; } else { maxsteps = 100; } edge = NULL; /* Initially, no reason to avoid any edge. */ do { nextedge = advance_geodesic(g, edge); if(nextedge == NULL && g->face != NULL) { /* Maybe we ran into a facet with flipped orientation, * and turned away from the facet rather than toward it. * Try again, flipping the direction about the last edge we found. */ reflectline(&edge->to, &g->dir, &g->dir); nextedge = advance_geodesic(g, edge); } /* Remember which edge we struck, so as to avoid considering * an intersection with it on the next face. */ edge = nextedge; /* Could be smarter. What if we've encountered a boundary, * so advance_geodesic() left g->face equal to NULL? * We could search the surface for another polygon which just * doesn't happen to meet this one edge-to-edge -- as when two * pieces of surface are irregularly butted up against each other -- * and use that to find a new face to walk over. * But, not right now. */ } while(edge != NULL && --maxsteps > 0 && g->length < maxlength); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/0000777000175000001440000000000010665240700015457 500000000000000geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/0000777000175000001440000000000010665240701016226 500000000000000geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvScale.c++0000644000175000001440000000041307730234560017775 00000000000000#include QV_NODE_SOURCE(QvScale); QvScale::QvScale() { QV_NODE_CONSTRUCTOR(QvScale); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(scaleFactor); scaleFactor.value[0] = scaleFactor.value[1] = scaleFactor.value[2] =1.0; } QvScale::~QvScale() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMatrixTransform.c++0000644000175000001440000000055507730234575022123 00000000000000#include QV_NODE_SOURCE(QvMatrixTransform); QvMatrixTransform::QvMatrixTransform() { QV_NODE_CONSTRUCTOR(QvMatrixTransform); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(matrix); for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) matrix.value[i][j] = (i == j ? 1.0 : 0.0); } QvMatrixTransform::~QvMatrixTransform() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvIndexedLineSet.h0000644000175000001440000000257610455700775021511 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_INDEXED_LINE_SET_ #define _QV_INDEXED_LINE_SET_ #include #include #define QV_END_LINE_INDEX (-1) class QvIndexedLineSet : public QvNode { QV_NODE_HEADER(QvIndexedLineSet); public: // Fields: QvMFLong coordIndex; // Coordinate indices QvMFLong materialIndex; // Material indices QvMFLong normalIndex; // Surline normal indices QvMFLong textureCoordIndex; // Texture Coordinate indices }; #endif /* _QV_INDEXED_LINE_SET_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvDict.c++0000644000175000001440000000274007730234442017635 00000000000000#include struct QvDictListThing { QvPList *keyList; QvPList *valueList; }; QvDict::QvDict( int entries ) { tableSize=entries; buckets=new QvDictEntry *[tableSize]; for (int i = 0; i < tableSize; i++) buckets[i] = NULL; } QvDict::~QvDict() { clear(); delete [] buckets; } void QvDict::clear() { int i; QvDictEntry *entry, *nextEntry; for (i = 0; i < tableSize; i++) { for (entry = buckets[i]; entry != NULL; entry = nextEntry) { nextEntry = entry->next; delete entry; } buckets[i] = NULL; } } QvBool QvDict::enter(u_long key, void *value) { QvDictEntry *&entry = findEntry(key); if (entry == NULL) { entry = new QvDictEntry(key, value); entry->next = NULL; return TRUE; } else { entry->value = value; return FALSE; } } QvBool QvDict::find(u_long key, void *&value) const { QvDictEntry *&entry = findEntry(key); if (entry == NULL) { value = NULL; return FALSE; } else { value = entry->value; return TRUE; } } QvDictEntry *& QvDict::findEntry(u_long key) const { QvDictEntry **entry; entry = &buckets[key % tableSize]; while (*entry != NULL) { if ((*entry)->key == key) break; entry = &(*entry)->next; } return *entry; } QvBool QvDict::remove(u_long key) { QvDictEntry *&entry = findEntry(key); QvDictEntry *tmp; if (entry == NULL) return FALSE; else { tmp = entry; entry = entry->next; delete tmp; return TRUE; } } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMatrixTransform.h0000644000175000001440000000227310455700775021777 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MATRIX_TRANSFORM_ #define _QV_MATRIX_TRANSFORM_ #include #include class QvMatrixTransform : public QvNode { QV_NODE_HEADER(QvMatrixTransform); public: // Fields QvSFMatrix matrix; // Transformation matrix }; #endif /* _QV_MATRIX_TRANSFORM_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvDB.c++0000644000175000001440000000072407730234435017241 00000000000000#include #include #include #include const char *QvDB::versionString = "Reference VRML Parser 1.0"; void QvDB::init() { QvNode::init(); } QvBool QvDB::read(QvInput *in, QvNode *&node) { QvBool ret; ret = QvNode::read(in, node); if (ret && node == NULL && ! in->eof()) { char c; in->get(c); QvReadError::post(in, "Extra characters ('%c') found in input", c); ret = FALSE; } return ret; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMFFloat.h0000644000175000001440000000212110455700775020117 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MF_FLOAT_ #define _QV_MF_FLOAT_ #include class QvMFFloat : public QvMField { public: float *values; QV_MFIELD_HEADER(QvMFFloat); }; #endif /* _QV_MF_FLOAT_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvWWWInline.c++0000644000175000001440000000067407730234622020601 00000000000000#include QV_NODE_SOURCE(QvWWWInline); QvWWWInline::QvWWWInline() { QV_NODE_CONSTRUCTOR(QvWWWInline); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(name); QV_NODE_ADD_FIELD(bboxSize); QV_NODE_ADD_FIELD(bboxCenter); name.value = ""; bboxSize.value[0] = bboxSize.value[0] = bboxSize.value[0] = 0.0; bboxCenter.value[0] = bboxCenter.value[0] = bboxCenter.value[0] = 0.0; } QvWWWInline::~QvWWWInline() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvNormal.h0000644000175000001440000000220410455700775020061 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_NORMAL_ #define _QV_NORMAL_ #include #include class QvNormal : public QvNode { QV_NODE_HEADER(QvNormal); public: // Fields QvMFVec3f vector; // Normal vector(s) }; #endif /* _QV_NORMAL_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvIndexedLineSet.c++0000644000175000001440000000104307730234470021612 00000000000000#include QV_NODE_SOURCE(QvIndexedLineSet); QvIndexedLineSet::QvIndexedLineSet() { QV_NODE_CONSTRUCTOR(QvIndexedLineSet); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(coordIndex); QV_NODE_ADD_FIELD(materialIndex); QV_NODE_ADD_FIELD(normalIndex); QV_NODE_ADD_FIELD(textureCoordIndex); coordIndex.values[0] = 0; materialIndex.values[0] = QV_END_LINE_INDEX; normalIndex.values[0] = QV_END_LINE_INDEX; textureCoordIndex.values[0] = QV_END_LINE_INDEX; } QvIndexedLineSet::~QvIndexedLineSet() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTraverse.c++0000644000175000001440000001437107730234620020546 00000000000000#include #include #include #include #include ////////////////////////////////////////////////////////////////////////////// // // Traversal code for all nodes. The default method (in QvNode) does // nothing. Because traverse() is defined in the header for ALL node // classes, each one has an implementation here. // ////////////////////////////////////////////////////////////////////////////// // For debugging static int indent = 0; static void announce(const char *className) { for (int i = 0; i < indent; i++) printf("\t"); printf("Traversing a %s\n", className); } #define ANNOUNCE(className) announce(QV__QUOTE(className)) #define DEFAULT_TRAVERSE(className) \ void \ className::traverse(QvState *) \ { \ ANNOUNCE(className); \ } ////////////////////////////////////////////////////////////////////////////// // // Groups. // ////////////////////////////////////////////////////////////////////////////// void QvGroup::traverse(QvState *state) { ANNOUNCE(QvGroup); indent++; for (int i = 0; i < getNumChildren(); i++) getChild(i)->traverse(state); indent--; } void QvLOD::traverse(QvState *state) { ANNOUNCE(QvLOD); indent++; // ??? In a real implementation, this would choose a child based // ??? on the distance to the eye point. if (getNumChildren() > 0) getChild(0)->traverse(state); indent--; } void QvSeparator::traverse(QvState *state) { ANNOUNCE(QvSeparator); state->push(); indent++; for (int i = 0; i < getNumChildren(); i++) getChild(i)->traverse(state); indent--; state->pop(); } void QvSwitch::traverse(QvState *state) { ANNOUNCE(QvSwitch); indent++; int which = whichChild.value; if (which == QV_SWITCH_NONE) ; else if (which == QV_SWITCH_ALL) for (int i = 0; i < getNumChildren(); i++) getChild(i)->traverse(state); else if (which < getNumChildren()) getChild(which)->traverse(state); indent--; } void QvTransformSeparator::traverse(QvState *state) { ANNOUNCE(QvTransformSeparator); // We need to "push" just the transformation stack. We'll // accomplish this by just pushing a no-op transformation onto // that stack. When we "pop", we'll restore that stack to its // previous state. QvElement *markerElt = new QvElement; markerElt->data = this; markerElt->type = QvElement::NoOpTransform; state->addElement(QvState::TransformationIndex, markerElt); indent++; for (int i = 0; i < getNumChildren(); i++) getChild(i)->traverse(state); indent--; // Now do the "pop" while (state->getTopElement(QvState::TransformationIndex) != markerElt) state->popElement(QvState::TransformationIndex); } ////////////////////////////////////////////////////////////////////////////// // // Properties. // ////////////////////////////////////////////////////////////////////////////// #define DO_PROPERTY(className, stackIndex) \ void \ className::traverse(QvState *state) \ { \ ANNOUNCE(className); \ QvElement *elt = new QvElement; \ elt->data = this; \ state->addElement(QvState::stackIndex, elt); \ } #define DO_TYPED_PROPERTY(className, stackIndex, eltType) \ void \ className::traverse(QvState *state) \ { \ ANNOUNCE(className); \ QvElement *elt = new QvElement; \ elt->data = this; \ elt->type = QvElement::eltType; \ state->addElement(QvState::stackIndex, elt); \ } DO_PROPERTY(QvCoordinate3, Coordinate3Index) DO_PROPERTY(QvFontStyle, FontStyleIndex) DO_PROPERTY(QvMaterial, MaterialIndex) DO_PROPERTY(QvMaterialBinding, MaterialBindingIndex) DO_PROPERTY(QvNormal, NormalIndex) DO_PROPERTY(QvNormalBinding, NormalBindingIndex) DO_PROPERTY(QvShapeHints, ShapeHintsIndex) DO_PROPERTY(QvTextureCoordinate2, TextureCoordinate2Index) DO_PROPERTY(QvTexture2, Texture2Index) DO_PROPERTY(QvTexture2Transform, Texture2TransformationIndex) DO_TYPED_PROPERTY(QvDirectionalLight, LightIndex, DirectionalLight) DO_TYPED_PROPERTY(QvPointLight, LightIndex, PointLight) DO_TYPED_PROPERTY(QvSpotLight, LightIndex, SpotLight) DO_TYPED_PROPERTY(QvOrthographicCamera, CameraIndex, OrthographicCamera) DO_TYPED_PROPERTY(QvPerspectiveCamera, CameraIndex, PerspectiveCamera) DO_TYPED_PROPERTY(QvTransform, TransformationIndex, Transform) DO_TYPED_PROPERTY(QvRotation, TransformationIndex, Rotation) DO_TYPED_PROPERTY(QvMatrixTransform, TransformationIndex, MatrixTransform) DO_TYPED_PROPERTY(QvTranslation, TransformationIndex, Translation) DO_TYPED_PROPERTY(QvScale, TransformationIndex, Scale) ////////////////////////////////////////////////////////////////////////////// // // Shapes. // ////////////////////////////////////////////////////////////////////////////// static void printProperties(QvState *state) { printf("--------------------------------------------------------------\n"); state->print(); printf("--------------------------------------------------------------\n"); } #define DO_SHAPE(className) \ void \ className::traverse(QvState *state) \ { \ ANNOUNCE(className); \ printProperties(state); \ } DO_SHAPE(QvAsciiText) DO_SHAPE(QvCone) DO_SHAPE(QvCube) DO_SHAPE(QvCylinder) DO_SHAPE(QvIndexedFaceSet) DO_SHAPE(QvIndexedLineSet) DO_SHAPE(QvPointSet) DO_SHAPE(QvSphere) ////////////////////////////////////////////////////////////////////////////// // // WWW-specific nodes. // ////////////////////////////////////////////////////////////////////////////// // ??? DEFAULT_TRAVERSE(QvWWWAnchor) DEFAULT_TRAVERSE(QvWWWInline) ////////////////////////////////////////////////////////////////////////////// // // Default traversal methods. These nodes have no effects during traversal. // ////////////////////////////////////////////////////////////////////////////// DEFAULT_TRAVERSE(QvInfo) DEFAULT_TRAVERSE(QvUnknownNode) ////////////////////////////////////////////////////////////////////////////// #undef ANNOUNCE #undef DEFAULT_TRAVERSE #undef DO_PROPERTY #undef DO_SHAPE #undef DO_TYPED_PROPERTY geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvShapeHints.h0000644000175000001440000000305310455700776020703 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SHAPE_HINTS_ #define _QV_SHAPE_HINTS_ #include #include #include class QvShapeHints : public QvNode { QV_NODE_HEADER(QvShapeHints); public: enum VertexOrdering { UNKNOWN_ORDERING, CLOCKWISE, COUNTERCLOCKWISE }; enum ShapeType { UNKNOWN_SHAPE_TYPE, SOLID }; enum FaceType { UNKNOWN_FACE_TYPE, CONVEX }; // Fields QvSFEnum vertexOrdering; // Ordering of face vertices QvSFEnum shapeType; // Info about shape geometry QvSFEnum faceType; // Info about face geometry QvSFFloat creaseAngle; // Smallest angle for sharp edge }; #endif /* _QV_SHAPE_HINTS_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvDebugError.c++0000644000175000001440000000052507730234440021007 00000000000000#include #include #include void QvDebugError::post(const char *methodName, const char *formatString ...) { char buf[10000]; va_list ap; va_start(ap, formatString); vsprintf(buf, formatString, ap); va_end(ap); fprintf(stderr, "VRML error in %s(): %s\n", methodName, buf); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFColor.c++0000644000175000001440000000027207730234453020261 00000000000000#include QV_SFIELD_SOURCE(QvSFColor); QvBool QvSFColor::readValue(QvInput *in) { return (in->read(value[0]) && in->read(value[1]) && in->read(value[2])); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvOrthographicCamera.c++0000644000175000001440000000120707730234607022514 00000000000000#include QV_NODE_SOURCE(QvOrthographicCamera); QvOrthographicCamera::QvOrthographicCamera() { QV_NODE_CONSTRUCTOR(QvOrthographicCamera); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(position); QV_NODE_ADD_FIELD(orientation); QV_NODE_ADD_FIELD(focalDistance); QV_NODE_ADD_FIELD(height); position.value[0] = 0.0; position.value[1] = 0.0; position.value[2] = 1.0; orientation.axis[0] = 0.0; orientation.axis[1] = 0.0; orientation.axis[2] = 1.0; orientation.angle = 0.0; focalDistance.value = 5.0; height.value = 2.0; } QvOrthographicCamera::~QvOrthographicCamera() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvCone.h0000644000175000001440000000264010455700775017521 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_CONE_ #define _QV_CONE_ #include #include #include class QvCone : public QvNode { QV_NODE_HEADER(QvCone); public: enum Part { // Cone parts: SIDES = 0x01, // The conical part BOTTOM = 0x02, // The bottom circular face ALL = 0x03 // All parts }; // Fields QvSFBitMask parts; // Visible parts of cone QvSFFloat bottomRadius; // Radius of bottom circular face QvSFFloat height; // Size in y dimension }; #endif /* _QV_CONE_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvDict.h0000644000175000001440000000277510455700775017531 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_DICT_ #define _QV_DICT_ #include #include #include class QvDictEntry { private: u_long key; void * value; QvDictEntry * next; QvDictEntry(u_long k, void *v) { key = k; value = v; }; friend class QvDict; }; class QvDict { public: QvDict( int entries = 251 ); ~QvDict(); void clear(); QvBool enter(u_long key, void *value); QvBool find(u_long key, void *&value) const; QvBool remove(u_long key); private: int tableSize; QvDictEntry * *buckets; QvDictEntry *& findEntry(u_long key) const; }; #endif /* _QV_DICT_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvCube.h0000644000175000001440000000233110455700775017510 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_CUBE_ #define _QV_CUBE_ #include #include class QvCube : public QvNode { QV_NODE_HEADER(QvCube); public: // Fields QvSFFloat width; // Size in x dimension QvSFFloat height; // Size in y dimension QvSFFloat depth; // Size in z dimension }; #endif /* _QV_CUBE_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvInput.c++0000644000175000001440000002333307730234546020057 00000000000000#include #include #include #include #include #include #include #define CURVERSION 1.0 // Current version of file format #define COMMENT_CHAR '#' #define COMPRESS_CHAR 0x1F /* First byte of compressed or gzipped file */ static const int numValidASCIIHeaders = 1; struct headerStorage { const char *string; float version; }; static const headerStorage ASCIIHeader[1] = { { "#VRML V1.0 ascii", /* 20 chars */ 1.0 }, }; float QvInput::isASCIIHeader(const char *string) { for (int i = 0; i < numValidASCIIHeaders; i++) { if (strcmp(ASCIIHeader[i].string, string) == 0) return ASCIIHeader[i].version; } return FALSE; } QvInput::QvInput() { setFilePointer(stdin); } QvInput::~QvInput() { } void QvInput::setFilePointer(FILE *newFP) { fp = newFP; lineNum = 1; version = CURVERSION; readHeader = FALSE; headerOk = TRUE; backBufIndex = -1; } float QvInput::getVersion() { if (! readHeader) (void) checkHeader(); return version; } QvBool QvInput::get(char &c) { QvBool ret; if (backBufIndex >= 0) { c = backBuf.getString()[backBufIndex++]; if (c != '\0') return TRUE; backBuf.makeEmpty(); backBufIndex = -1; } if (! readHeader && ! checkHeader()) return FALSE; if (eof()) { c = (char)EOF; ret = FALSE; } else { int i = getc(fp); if (i == EOF) { c = (char)EOF; ret = FALSE; } else { c = (char) i; ret = TRUE; } } return ret; } QvBool QvInput::read(char &c) { return (skipWhiteSpace() && get(c)); } QvBool QvInput::read(QvString &s) { if (! skipWhiteSpace()) return FALSE; QvBool quoted; char c; char bufStore[256]; char *buf; int bytesLeft; s.makeEmpty(); if (! get(c)) return FALSE; quoted = (c == '\"'); if (! quoted) putBack(c); do { buf = bufStore; bytesLeft = sizeof(bufStore) - 1; while (bytesLeft > 0) { if (! get(*buf)) break; if (quoted) { if (*buf == '\"') break; if (*buf == '\\') { if ((get(c)) && c == '\"') *buf = '\"'; else putBack(c); } if (*buf == '\n') lineNum++; } else if (isspace(*buf)) { putBack(*buf); break; } buf++; bytesLeft--; } *buf = '\0'; s += bufStore; } while (bytesLeft == 0); return TRUE; } QvBool QvInput::read(QvName &n, QvBool validIdent) { QvBool gotChar; if (! skipWhiteSpace()) return FALSE; if (! validIdent) { QvString s; if (! read(s)) return FALSE; n = s; } else { char buf[256]; char *b = buf; char c; if ((gotChar = get(c)) && QvName::isIdentStartChar(c)) { *b++ = c; while ((gotChar = get(c)) && QvName::isIdentChar(c)) { if (b - buf < 255) *b++ = c; } } *b = '\0'; if (gotChar) putBack(c); n = buf; } return TRUE; } #define READ_NUM(reader, readType, num, type) \ QvBool ok; \ if (! skipWhiteSpace()) \ ok = FALSE; \ else { \ readType _tmp; \ ok = reader(_tmp); \ if (ok) \ num = (type) _tmp; \ } \ return ok #define READ_INTEGER(num, type) \ READ_NUM(readInteger, long, num, type) #define READ_UNSIGNED_INTEGER(num, type) \ READ_NUM(readUnsignedInteger, unsigned long, num, type) #define READ_REAL(num, type) \ READ_NUM(readReal, double, num, type) QvBool QvInput::read(int &i) { READ_INTEGER(i, int); } QvBool QvInput::read(unsigned int &i) { READ_UNSIGNED_INTEGER(i, unsigned int); } QvBool QvInput::read(short &s) { READ_INTEGER(s, short); } QvBool QvInput::read(unsigned short &s) { READ_UNSIGNED_INTEGER(s, unsigned short); } QvBool QvInput::read(long &l) { READ_INTEGER(l, long); } QvBool QvInput::read(unsigned long &l) { READ_UNSIGNED_INTEGER(l, unsigned long); } QvBool QvInput::read(float &f) { READ_REAL(f, float); } QvBool QvInput::read(double &d) { READ_REAL(d, double); } QvBool QvInput::eof() const { return feof(fp); } void QvInput::getLocationString(QvString &string) const { char buf[128]; sprintf(buf, "\tOccurred at line %3d", lineNum); string = buf; } void QvInput::putBack(char c) { if (c == (char) EOF) return; if (backBufIndex >= 0) --backBufIndex; else ungetc(c, fp); } void QvInput::putBack(const char *string) { backBuf = string; backBufIndex = 0; } #if defined(unix) || defined(__unix) # include static FILE * spliceDecompress(QvInput *in, FILE *fp, char c) { int pfd[2], zpfd[2]; int k = 0; FILE *togz = (FILE *)NULL; /* Build a pipeline: * 0x1F+"in"data->zpfd[1] => zpfd[0]->gzip->pfd[1] => pfd[0]->parser */ if(pipe(pfd) < 0 || pipe(zpfd) < 0) { QvReadError::post(in, "Can't make pipe to read compressed VRML"); return NULL; } switch(fork()) { case -1: QvReadError::post(in, "Can't fork subprocess to decompress VRML"); return NULL; case 0: close(pfd[0]); switch(fork()) { case -1: QvReadError::post(in, "Can't fork subprocess to decompress VRML"); _exit(1); case 0: int ch; togz = fdopen(zpfd[1], "w"); close(pfd[1]); close(zpfd[0]); putc(c, togz); while((ch = getc(fp)) != EOF) { putc(ch, togz); k++; } fflush(togz); _exit(0); default: close(zpfd[1]); if(zpfd[0] != 0) { dup2(zpfd[0], 0); close(zpfd[0]); } if(pfd[1] != 1) { dup2(pfd[1], 1); close(pfd[1]); } execlp("gzip", "gzip", "-d", NULL); execlp("compress", "compress", "-d", NULL); QvReadError::post(in, "Can't exec gzip nor compress to read compressed VRML"); _exit(1); } default: close(pfd[1]); close(zpfd[0]); close(zpfd[1]); return fdopen(pfd[0], "r"); } } #endif /* unix */ QvBool QvInput::checkHeader() { char c; readHeader = TRUE; /* Read first character cautiously, in case we need to reroute input. * Ugh. Is there no clean way to do this? */ int got; #if defined(unix) || defined(__unix) got = ::read(fileno(fp), &c, 1) > 0; if(got && c == COMPRESS_CHAR) { if((fp = spliceDecompress(this, fp, c)) == NULL) { headerOk = FALSE; return FALSE; } got = get(c); } #else got = get(c); #endif if(got) { if (c == COMMENT_CHAR) { char buf[256]; int i = 0; buf[i++] = c; while (get(c) && c != '\n') buf[i++] = c; if(i>0 && buf[i-1] == '\r') i--; buf[i] = '\0'; if (c == '\n') lineNum++; if ((version = isASCIIHeader(buf))) return TRUE; } else putBack(c); } QvReadError::post(this, "File does not have a valid header string"); headerOk = FALSE; return FALSE; } QvBool QvInput::skipWhiteSpace() { char c; QvBool gotChar; if (! readHeader && ! checkHeader()) return FALSE; while (TRUE) { while ((gotChar = get(c)) && isspace(c)) if (c == '\n') lineNum++; if (! gotChar) break; if (c == COMMENT_CHAR) { while (get(c) && c != '\n') ; if (eof()) QvReadError::post(this, "EOF reached before end of comment"); else lineNum++; } else { putBack(c); break; } } return TRUE; } QvBool QvInput::readInteger(long &l) { char str[32]; char *s = str; if (readChar(s, '-') || readChar(s, '+')) s++; if (! readUnsignedIntegerString(s)) return FALSE; l = strtol(str, NULL, 0); return TRUE; } QvBool QvInput::readUnsignedInteger(unsigned long &l) { char str[32]; if (! readUnsignedIntegerString(str)) return FALSE; #ifdef sun l = atol(str); #else l = strtoul(str, NULL, 0); #endif return TRUE; } QvBool QvInput::readUnsignedIntegerString(char *str) { int minSize = 1; char *s = str; if (readChar(s, '0')) { if (readChar(s + 1, 'x')) { s += 2 + readHexDigits(s + 2); minSize = 3; } else s += 1 + readDigits(s + 1); } else s += readDigits(s); if (s - str < minSize) return FALSE; *s = '\0'; return TRUE; } QvBool QvInput::readReal(double &d) { char str[32]; int n; char *s = str; QvBool gotNum = FALSE; n = readChar(s, '-'); if (n == 0) n = readChar(s, '+'); s += n; if ((n = readDigits(s)) > 0) { gotNum = TRUE; s += n; } if (readChar(s, '.') > 0) { s++; if ((n = readDigits(s)) > 0) { gotNum = TRUE; s += n; } } if (! gotNum) return FALSE; n = readChar(s, 'e'); if (n == 0) n = readChar(s, 'E'); if (n > 0) { s += n; n = readChar(s, '-'); if (n == 0) n = readChar(s, '+'); s += n; if ((n = readDigits(s)) > 0) s += n; else return FALSE; } *s = '\0'; d = atof(str); return TRUE; } int QvInput::readDigits(char *string) { char c, *s = string; while (get(c)) { if (isdigit(c)) *s++ = c; else { putBack(c); break; } } return s - string; } int QvInput::readHexDigits(char *string) { char c, *s = string; while (get(c)) { if (isxdigit(c)) *s++ = c; else { putBack(c); break; } } return s - string; } int QvInput::readChar(char *string, char charToRead) { char c; int ret; if (! get(c)) ret = 0; else if (c == charToRead) { *string = c; ret = 1; } else { putBack(c); ret = 0; } return ret; } void QvInput::addReference(const QvName &name, QvNode *node) { refDict.enter((u_long) name.getString(), (void *) node); node->setName(name); } QvNode * QvInput::findReference(const QvName &name) const { void *node; if (refDict.find((u_long) name.getString(), node)) return (QvNode *) node; return NULL; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvFontStyle.h0000644000175000001440000000323310455700775020563 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_FONT_STYLE_ #define _QV_FONT_STYLE_ #include #include #include #include class QvFontStyle : public QvNode { QV_NODE_HEADER(QvFontStyle); public: enum Family { // Font family: SERIF, // Serif style (such as TimesRoman) SANS, // Sans-serif style (such as Helvetica) TYPEWRITER // Fixed pitch style (such as Courier) }; enum Style { // Font style modifications: NONE = 0x00, // No modifications to family BOLD = 0x01, // Embolden family ITALIC = 0x02 // Italicize or slant family }; // Fields QvSFFloat size; // Font size QvSFEnum family; // Font family QvSFBitMask style; // Font style modifications to family }; #endif /* _QV_FONT_STYLE_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvCube.c++0000644000175000001440000000046407730234431017627 00000000000000#include QV_NODE_SOURCE(QvCube); QvCube::QvCube() { QV_NODE_CONSTRUCTOR(QvCube); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(width); QV_NODE_ADD_FIELD(height); QV_NODE_ADD_FIELD(depth); width.value = 2.0; height.value = 2.0; depth.value = 2.0; } QvCube::~QvCube() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvUnknownNode.h0000644000175000001440000000227210455700776021104 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_UNKNOWN_NODE_ #define _QV_UNKNOWN_NODE_ #include class QvUnknownNode : public QvGroup { QV_NODE_HEADER(QvUnknownNode); public: const char *className; QvFieldData *instanceFieldData; void setClassName(const char *name); }; #endif /* _QV_UNKNOWN_NODE_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSeparator.h0000644000175000001440000000246010455700776020576 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SEPARATOR_ #define _QV_SEPARATOR_ #include #include #include class QvSeparator : public QvGroup { QV_NODE_HEADER(QvSeparator); public: enum CullEnabled { // Possible values for culling OFF, // Never cull ON, // Always cull AUTO // Decide based on some heuristic }; // Fields QvSFEnum renderCulling; }; #endif /* _QV_SEPARATOR_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvWWWInline.h0000644000175000001440000000244610455700776020465 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_WWW_INLINE_ #define _QV_WWW_INLINE_ #include #include #include #include class QvWWWInline : public QvGroup { QV_NODE_HEADER(QvWWWInline); public: // Fields QvSFString name; // URL name QvSFVec3f bboxSize; // Size of 3D bounding box QvSFVec3f bboxCenter; // Center of 3D bounding box }; #endif /* _QV_WWW_INLINE_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvShapeHints.c++0000644000175000001440000000205007730234564021017 00000000000000#include QV_NODE_SOURCE(QvShapeHints); QvShapeHints::QvShapeHints() { QV_NODE_CONSTRUCTOR(QvShapeHints); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(vertexOrdering); QV_NODE_ADD_FIELD(shapeType); QV_NODE_ADD_FIELD(faceType); QV_NODE_ADD_FIELD(creaseAngle); vertexOrdering.value = UNKNOWN_ORDERING; shapeType.value = UNKNOWN_SHAPE_TYPE; faceType.value = CONVEX; creaseAngle.value = 0.5; QV_NODE_DEFINE_ENUM_VALUE(VertexOrdering, UNKNOWN_ORDERING); QV_NODE_DEFINE_ENUM_VALUE(VertexOrdering, CLOCKWISE); QV_NODE_DEFINE_ENUM_VALUE(VertexOrdering, COUNTERCLOCKWISE); QV_NODE_DEFINE_ENUM_VALUE(ShapeType, UNKNOWN_SHAPE_TYPE); QV_NODE_DEFINE_ENUM_VALUE(ShapeType, SOLID); QV_NODE_DEFINE_ENUM_VALUE(FaceType, UNKNOWN_FACE_TYPE); QV_NODE_DEFINE_ENUM_VALUE(FaceType, CONVEX); QV_NODE_SET_SF_ENUM_TYPE(vertexOrdering, VertexOrdering); QV_NODE_SET_SF_ENUM_TYPE(shapeType, ShapeType); QV_NODE_SET_SF_ENUM_TYPE(faceType, FaceType); } QvShapeHints::~QvShapeHints() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTransform.c++0000644000175000001440000000147607730234615020734 00000000000000#include QV_NODE_SOURCE(QvTransform); QvTransform::QvTransform() { QV_NODE_CONSTRUCTOR(QvTransform); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(translation); QV_NODE_ADD_FIELD(rotation); QV_NODE_ADD_FIELD(scaleFactor); QV_NODE_ADD_FIELD(scaleOrientation); QV_NODE_ADD_FIELD(center); translation.value[0] = translation.value[1] = translation.value[2] = 0.0; rotation.axis[0] = 0.0; rotation.axis[1] = 0.0; rotation.axis[2] = 1.0; rotation.angle = 0.0; scaleFactor.value[0] = scaleFactor.value[1] = scaleFactor.value[2] = 1.0; scaleOrientation.axis[0] = 0.0; scaleOrientation.axis[1] = 0.0; scaleOrientation.axis[2] = 1.0; scaleOrientation.angle = 0.0; center.value[0] = center.value[1] = center.value[2] = 0.0; } QvTransform::~QvTransform() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvPointLight.c++0000644000175000001440000000077407730234430021035 00000000000000#include QV_NODE_SOURCE(QvPointLight); QvPointLight::QvPointLight() { QV_NODE_CONSTRUCTOR(QvPointLight); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(on); QV_NODE_ADD_FIELD(intensity); QV_NODE_ADD_FIELD(color); QV_NODE_ADD_FIELD(location); on.value = TRUE; intensity.value = 1.0; color.value[0] = color.value[1] = color.value[2] = 1.0; location.value[0] = 0.0; location.value[1] = 0.0; location.value[2] = 1.0; } QvPointLight::~QvPointLight() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSphere.h0000644000175000001440000000220510455700776020061 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SPHERE_ #define _QV_SPHERE_ #include #include class QvSphere : public QvNode { QV_NODE_HEADER(QvSphere); public: // Fields QvSFFloat radius; // Radius of sphere }; #endif /* _QV_SPHERE_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFColor.h0000644000175000001440000000212210455700775020137 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_COLOR_ #define _QV_SF_COLOR_ #include class QvSFColor : public QvSField { public: float value[3]; QV_SFIELD_HEADER(QvSFColor); }; #endif /* _QV_SF_COLOR_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFBitMask.c++0000644000175000001440000000325007730234446020536 00000000000000#include #include #include // Special characters when reading or writing value in ASCII #define OPEN_PAREN '(' #define CLOSE_PAREN ')' #define BITWISE_OR '|' QV_SFIELD_SOURCE(QvSFBitMask); QvBool QvSFBitMask::readValue(QvInput *in) { char c; QvName n; int v; #ifdef DEBUG if (enumValues == NULL) { QvDebugError::post("QvSFBitMask::readValue", "Enum values were never initialized"); QvReadError::post(in, "Couldn't read QvSFBitMask values"); return FALSE; } #endif /* DEBUG */ value = 0; // Read first character if (! in->read(c)) return FALSE; // Check for parenthesized list of bitwise-or'ed flags if (c == OPEN_PAREN) { // Read names separated by BITWISE_OR while (TRUE) { if (in->read(n, TRUE) && ! (! n) ) { if (findEnumValue(n, v)) value |= v; else { QvReadError::post(in, "Unknown QvSFBitMask bit " "mask value \"%s\"", n.getString()); return FALSE; } } if (! in->read(c)) { QvReadError::post(in, "EOF reached before '%c' " "in QvSFBitMask value", CLOSE_PAREN); return FALSE; } if (c == CLOSE_PAREN) break; else if (c != BITWISE_OR) { QvReadError::post(in, "Expected '%c' or '%c', got '%c' ", "in QvSFBitMask value", BITWISE_OR, CLOSE_PAREN, c); return FALSE; } } } else { in->putBack(c); // Read mnemonic value as a character string identifier if (! in->read(n, TRUE)) return FALSE; if (! findEnumValue(n, value)) { QvReadError::post(in, "Unknown QvSFBitMask bit " "mask value \"%s\"", n.getString()); return FALSE; } } return TRUE; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvInfo.h0000644000175000001440000000216710455700775017534 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_INFO_ #define _QV_INFO_ #include #include class QvInfo : public QvNode { QV_NODE_HEADER(QvInfo); public: // Fields QvSFString string; // Info string }; #endif /* _QV_INFO_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvScale.h0000644000175000001440000000221710455700776017665 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SCALE_ #define _QV_SCALE_ #include #include class QvScale : public QvNode { QV_NODE_HEADER(QvScale); public: // Fields QvSFVec3f scaleFactor; // Scale factors in x, y, and z }; #endif /* _QV_SCALE_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFLong.c++0000644000175000001440000000017407730234464020105 00000000000000#include QV_SFIELD_SOURCE(QvSFLong); QvBool QvSFLong::readValue(QvInput *in) { return in->read(value); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSwitch.h0000644000175000001440000000237510455700776020104 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SWITCH_ #define _QV_SWITCH_ #include #include #define QV_SWITCH_NONE (-1) /* Don't traverse any children */ #define QV_SWITCH_ALL (-3) /* Traverse all children */ class QvSwitch : public QvGroup { QV_NODE_HEADER(QvSwitch); public: // Fields QvSFLong whichChild; // Child to traverse }; #endif /* _QV_SWITCH_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMaterialBinding.c++0000644000175000001440000000136507730234573022012 00000000000000#include QV_NODE_SOURCE(QvMaterialBinding); QvMaterialBinding::QvMaterialBinding() { QV_NODE_CONSTRUCTOR(QvMaterialBinding); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(value); value.value = DEFAULT; QV_NODE_DEFINE_ENUM_VALUE(Binding, DEFAULT); QV_NODE_DEFINE_ENUM_VALUE(Binding, OVERALL); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_PART); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_PART_INDEXED); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_FACE); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_FACE_INDEXED); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_VERTEX); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_VERTEX_INDEXED); QV_NODE_SET_SF_ENUM_TYPE(value, Binding); } QvMaterialBinding::~QvMaterialBinding() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/Qv.c++0000644000175000001440000000013507730234415017025 00000000000000#include "QvChildList.c++" #include "QvDB.c++" #include "QvInput.c++" #include "QvLists.c++" geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvDB.h0000644000175000001440000000222610455700775017122 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_DB_ #define _QV_DB_ #include class QvInput; class QvNode; class QvField; class QvDB { public: static const char *versionString; static void init(); static QvBool read(QvInput *in, QvNode *&rootNode); }; #endif /* _QV_DB_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvIndexedFaceSet.h0000644000175000001440000000257610455700775021460 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_INDEXED_FACE_SET_ #define _QV_INDEXED_FACE_SET_ #include #include #define QV_END_FACE_INDEX (-1) class QvIndexedFaceSet : public QvNode { QV_NODE_HEADER(QvIndexedFaceSet); public: // Fields: QvMFLong coordIndex; // Coordinate indices QvMFLong materialIndex; // Material indices QvMFLong normalIndex; // Surface normal indices QvMFLong textureCoordIndex; // Texture Coordinate indices }; #endif /* _QV_INDEXED_FACE_SET_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFRotation.c++0000644000175000001440000000033007730234471020775 00000000000000#include QV_SFIELD_SOURCE(QvSFRotation); QvBool QvSFRotation::readValue(QvInput *in) { return (in->read(axis[0]) && in->read(axis[1]) && in->read(axis[2]) && in->read(angle)); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvNode.h0000644000175000001440000000506210455700775017523 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_NODE_ #define _QV_NODE_ #include class QvChildList; class QvDict; class QvFieldData; class QvInput; class QvNodeList; class QvState; class QvNode { public: enum Stage { FIRST_INSTANCE, // First real instance being constructed PROTO_INSTANCE, // Prototype instance being constructed OTHER_INSTANCE // Subsequent instance being constructed }; QvFieldData *fieldData; QvChildList *children; QvBool isBuiltIn; QvName *objName; QvNode(); virtual ~QvNode(); // Reference counting: long refCount; void ref() const; // Adds reference void unref() const; // Removes reference, deletes if now 0 void unrefNoDelete() const; // Removes reference, never deletes const QvName & getName() const; void setName(const QvName &name); static void init(); static QvBool read(QvInput *in, QvNode *&node); virtual QvFieldData *getFieldData() = 0; virtual void traverse(QvState *state) = 0; virtual void ToWebOOGL(QvState *state) = 0; protected: virtual QvBool readInstance(QvInput *in); private: static QvDict *nameDict; static void addName(QvNode *, const char *); static void removeName(QvNode *, const char *); static QvNode * readReference(QvInput *in); static QvBool readNode(QvInput *in, QvName &className,QvNode *&node); static QvBool readNodeInstance(QvInput *in, const QvName &className, const QvName &refName, QvNode *&node); static QvNode * createInstance(QvInput *in, const QvName &className); static QvNode * createInstanceFromName(const QvName &className); static void flushInput(QvInput *in); }; #endif /* _QV_NODE_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvFields.h0000644000175000001440000000256010455700775020044 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_FIELDS_ #define _QV_FIELDS_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* _QV_FIELDS_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFFloat.c++0000644000175000001440000000017707730234460020252 00000000000000#include QV_SFIELD_SOURCE(QvSFFloat); QvBool QvSFFloat::readValue(QvInput *in) { return in->read(value); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvRotation.c++0000644000175000001440000000047607730234444020557 00000000000000#include QV_NODE_SOURCE(QvRotation); QvRotation::QvRotation() { QV_NODE_CONSTRUCTOR(QvRotation); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(rotation); rotation.axis[0] = 0.0; rotation.axis[1] = 0.0; rotation.axis[2] = 1.0; rotation.angle = 0.0; } QvRotation::~QvRotation() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvReadError.h0000644000175000001440000000211710455700775020521 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_READ_ERROR #define _QV_READ_ERROR class QvInput; class QvReadError { public: static void post(const QvInput *in, const char *formatString ...); }; #endif /* _QV_READ_ERROR */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTexture2Transform.h0000644000175000001440000000256410455700776022261 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_TEXTURE_2_TRANSFORM_ #define _QV_TEXTURE_2_TRANSFORM_ #include #include #include class QvTexture2Transform : public QvNode { QV_NODE_HEADER(QvTexture2Transform); public: // Fields QvSFVec2f translation; // Translation vector QvSFFloat rotation; // Rotation QvSFVec2f scaleFactor; // Scale factors QvSFVec2f center; // Center point for scale and rotate }; #endif /* _QV_TEXTURE_2_TRANSFORM_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvLists.c++0000644000175000001440000000072407730234555020055 00000000000000#include #include QvNodeList::QvNodeList() : QvPList() { } void QvNodeList::append(QvNode *node) { QvPList::append(node); node->ref(); } void QvNodeList::remove(int which) { if ((*this)[which] != NULL) (*this)[which]->unref(); QvPList::remove(which); } void QvNodeList::truncate(int start) { for (int i = start; i < getLength(); i++) if ((*this)[i] != NULL) (*this)[i]->unref(); QvPList::truncate(start); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFBool.c++0000644000175000001440000000126407730234451020076 00000000000000#include #include QV_SFIELD_SOURCE(QvSFBool); QvBool QvSFBool::readValue(QvInput *in) { // accept 0 or 1 if (in->read(value)) { if (value != 0 && value != 1) { QvReadError::post(in, "Illegal value for QvSFBool: %d " "(must be 0 or 1)", value); return FALSE; } return TRUE; } // read TRUE/FALSE keyword QvName n; if (! in->read(n, TRUE)) return FALSE; if (n == "TRUE") { value = TRUE; return TRUE; } if (n == "FALSE") { value = FALSE; return TRUE; } QvReadError::post(in, "Unknown value (\"%s\") for QvSFBool ", "(must be TRUE or FALSE)", n.getString()); return FALSE; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvWWWAnchor.h0000644000175000001440000000260710455700776020460 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_WWW_ANCHOR_ #define _QV_WWW_ANCHOR_ #include #include #include class QvWWWAnchor : public QvGroup { QV_NODE_HEADER(QvWWWAnchor); public: enum Map { // Map types: NONE, // Leave URL name alone POINT // Add object coords to URL name }; // Fields QvSFString name; // URL name QvSFString description; // Useful description of scene QvSFEnum map; // How to map pick to URL name }; #endif /* _QV_WWW_ANCHOR_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvPointSet.c++0000644000175000001440000000050507730234433020514 00000000000000#include QV_NODE_SOURCE(QvPointSet); QvPointSet::QvPointSet() { QV_NODE_CONSTRUCTOR(QvPointSet); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(startIndex); QV_NODE_ADD_FIELD(numPoints); startIndex.value = 0; numPoints.value = QV_POINT_SET_USE_REST_OF_POINTS; } QvPointSet::~QvPointSet() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvLists.h0000644000175000001440000000244510455700775017736 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_LISTS_ #define _QV_LISTS_ #include class QvField; class QvNode; class QvNodeList : public QvPList { public: QvNodeList(); ~QvNodeList() { truncate(0); } void append(QvNode *node); void remove(int which); void truncate(int start); QvNode * operator [](int i) const { return ( (QvNode *) ( (* (const QvPList *) this) [i]) ); } }; #endif /* _QV_LISTS_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvCylinder.c++0000644000175000001440000000105407730234433020520 00000000000000#include QV_NODE_SOURCE(QvCylinder); QvCylinder::QvCylinder() { QV_NODE_CONSTRUCTOR(QvCylinder); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(parts); QV_NODE_ADD_FIELD(radius); QV_NODE_ADD_FIELD(height); parts.value = ALL; radius.value = 1.0; height.value = 2.0; QV_NODE_DEFINE_ENUM_VALUE(Part, SIDES); QV_NODE_DEFINE_ENUM_VALUE(Part, TOP); QV_NODE_DEFINE_ENUM_VALUE(Part, BOTTOM); QV_NODE_DEFINE_ENUM_VALUE(Part, ALL); QV_NODE_SET_SF_ENUM_TYPE(parts, Part); } QvCylinder::~QvCylinder() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMFVec2f.h0000644000175000001440000000212110455700775020017 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MF_VEC2F_ #define _QV_MF_VEC2F_ #include class QvMFVec2f : public QvMField { public: float *values; QV_MFIELD_HEADER(QvMFVec2f); }; #endif /* _QV_MF_VEC2F_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMFVec3f.h0000644000175000001440000000212110455700775020020 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MF_VEC3F_ #define _QV_MF_VEC3F_ #include class QvMFVec3f : public QvMField { public: float *values; QV_MFIELD_HEADER(QvMFVec3f); }; #endif /* _QV_MF_VEC3F_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvPointLight.h0000644000175000001440000000255310455700775020721 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_POINT_LIGHT_ #define _QV_POINT_LIGHT_ #include #include #include #include #include class QvPointLight : public QvNode { QV_NODE_HEADER(QvPointLight); public: // Fields QvSFBool on; // Whether light is on QvSFFloat intensity; // Source intensity (0 to 1) QvSFColor color; // RGB source color QvSFVec3f location; // Source location }; #endif /* _QV_POINT_LIGHT_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFString.h0000644000175000001440000000212710455700775020334 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_STRING_ #define _QV_SF_STRING_ #include class QvSFString : public QvSField { public: QvString value; QV_SFIELD_HEADER(QvSFString); }; #endif /* _QV_SF_STRING_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTranslation.c++0000644000175000001440000000046607730234617021257 00000000000000#include QV_NODE_SOURCE(QvTranslation); QvTranslation::QvTranslation() { QV_NODE_CONSTRUCTOR(QvTranslation); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(translation); translation.value[0] = translation.value[1] = translation.value[2] = 0.0; } QvTranslation::~QvTranslation() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSpotLight.h0000644000175000001440000000326710455700776020561 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SPOT_LIGHT_ #define _QV_SPOT_LIGHT_ #include #include #include #include #include class QvSpotLight : public QvNode { QV_NODE_HEADER(QvSpotLight); public: // Fields: QvSFBool on; // Whether light is on QvSFFloat intensity; // Source intensity (0 to 1) QvSFColor color; // RGB source color QvSFVec3f location; // Source location QvSFVec3f direction; // Primary direction of illumination QvSFFloat dropOffRate; // Rate of intensity drop-off from primary // direction: 0 = constant intensity, // 1 = sharp drop-off QvSFFloat cutOffAngle; // Angle (in radians) outside of which // intensity is zero, measured from // edge of cone to other edge }; #endif /* _QV_SPOT_LIGHT_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvUnknownNode.c++0000644000175000001440000000140307730234621021211 00000000000000#include #include QV_NODE_SOURCE(QvUnknownNode); QvUnknownNode::QvUnknownNode() { QV_NODE_CONSTRUCTOR(QvUnknownNode); className = NULL; // Set global field data to this instance's if (QV_NODE_IS_FIRST_INSTANCE()) delete fieldData; instanceFieldData = new QvFieldData; fieldData = instanceFieldData; } void QvUnknownNode::setClassName(const char *name) { className = strdup(name); } QvUnknownNode::~QvUnknownNode() { for (int i = 0; i < instanceFieldData->getNumFields(); i++) delete instanceFieldData->getField(this, i); delete instanceFieldData; #ifdef sun if (className != NULL) free((char *) className); #else if (className != NULL) free((void *) className); #endif } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvDirectionalLight.c++0000644000175000001440000000105307730234444022175 00000000000000#include QV_NODE_SOURCE(QvDirectionalLight); QvDirectionalLight::QvDirectionalLight() { QV_NODE_CONSTRUCTOR(QvDirectionalLight); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(on); QV_NODE_ADD_FIELD(intensity); QV_NODE_ADD_FIELD(color); QV_NODE_ADD_FIELD(direction); on.value = TRUE; intensity.value = 1.0; color.value[0] = color.value[1] = color.value[2] = 1.0; direction.value[0] = 0.0; direction.value[1] = 0.0; direction.value[2] = -1.0; } QvDirectionalLight::~QvDirectionalLight() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvGroup.c++0000644000175000001440000000240207730234464020045 00000000000000#include #include #include #include #include QV_NODE_SOURCE(QvGroup); QvGroup::QvGroup() { children = new QvChildList(); QV_NODE_CONSTRUCTOR(QvGroup); isBuiltIn = TRUE; } QvGroup::~QvGroup() { delete children; } QvNode * QvGroup::getChild(int index) const { return(*children)[index]; } int QvGroup::getNumChildren() const { return children->getLength(); } QvChildList * QvGroup::getChildren() const { return children; } QvBool QvGroup::readInstance(QvInput *in) { QvName typeString; QvFieldData *fieldData = getFieldData(); if (! isBuiltIn) { if (in->read(typeString, TRUE)) { if (typeString == "fields") { if (! fieldData->readFieldTypes(in, this)) { QvReadError::post(in, "Bad field specifications for node"); return FALSE; } } else in->putBack(typeString.getString()); } } return (fieldData->read(in, this, FALSE) && readChildren(in)); } QvBool QvGroup::readChildren(QvInput *in) { QvNode *child; QvBool ret = TRUE; while (TRUE) { if (read(in, child)) { if (child != NULL) children->append(child); else break; } else { ret = FALSE; break; } } return ret; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvState.c++0000644000175000001440000000251607730234574020041 00000000000000#include const char *QvState::stackNames[NumStacks] = { "Camera", "Coordinate3", "FontStyle", "Light", "MaterialBinding", "Material", "NormalBinding", "Normal", "ShapeHints", "Texture2", "Texture2Transformation", "TextureCoordinate2", "Transformation", }; QvState::QvState() { stacks = new QvElement * [NumStacks]; for (int i = 0; i < NumStacks; i++) stacks[i] = NULL; depth = 0; } QvState::~QvState() { while (depth > 0) pop(); delete [] stacks; } void QvState::addElement(StackIndex stackIndex, QvElement *elt) { elt->depth = depth; elt->next = stacks[stackIndex]; stacks[stackIndex] = elt; } void QvState::push() { depth++; } void QvState::pop() { depth--; for (int i = 0; i < NumStacks; i++) while (stacks[i] != NULL && stacks[i]->depth > depth) popElement((StackIndex) i); } void QvState::popElement(StackIndex stackIndex) { QvElement *elt = stacks[stackIndex]; stacks[stackIndex] = elt->next; delete elt; } void QvState::print() { printf("Traversal state:\n"); for (int i = 0; i < NumStacks; i++) { printf("\tStack [%2d] (%s):\n", i, stackNames[i]); if (stacks[i] == NULL) printf("\t\tNULL\n"); else for (QvElement *elt = stacks[i]; elt != NULL; elt = elt->next) elt->print(); } } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTransformSeparator.h0000644000175000001440000000217010455700776022470 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_TRANSFORM_SEPARATOR_ #define _QV_TRANSFORM_SEPARATOR_ #include class QvTransformSeparator : public QvGroup { QV_NODE_HEADER(QvTransformSeparator); // No fields }; #endif /* _QV_TRANSFORM_SEPARATOR_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTextureCoordinate2.c++0000644000175000001440000000050007730234613022474 00000000000000#include QV_NODE_SOURCE(QvTextureCoordinate2); QvTextureCoordinate2::QvTextureCoordinate2() { QV_NODE_CONSTRUCTOR(QvTextureCoordinate2); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(point); point.values[0] = point.values[1] = 0.0; } QvTextureCoordinate2::~QvTextureCoordinate2() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvOrthographicCamera.h0000644000175000001440000000272510455700775022403 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_ORTHOGRAPHIC_CAMERA_ #define _QV_ORTHOGRAPHIC_CAMERA_ #include #include #include #include class QvOrthographicCamera : public QvNode { QV_NODE_HEADER(QvOrthographicCamera); public: QvSFVec3f position; // Location of viewpoint QvSFRotation orientation; // Orientation (rotation with // respect to (0,0,-1) vector) QvSFFloat focalDistance; // Distance from viewpoint to // point of focus. QvSFFloat height; // Height of view volume }; #endif /* _QV_ORTHOGRAPHIC_CAMERA_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvAsciiText.h0000644000175000001440000000306610455700775020535 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_ASCII_TEXT_ #define _QV_ASCII_TEXT_ #include #include #include #include #include class QvAsciiText : public QvNode { QV_NODE_HEADER(QvAsciiText); public: enum Justification { // Text justification: LEFT, // Align left edge of text to origin CENTER, // Align center of text to origin RIGHT, // Align right edge of text to origin }; // Fields QvMFString string; // Text string QvSFFloat spacing; // Inter-string spacing QvSFEnum justification; // Text justification QvMFFloat width; // Suggested width constraint }; #endif /* _QV_ASCII_TEXT_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvPointSet.h0000644000175000001440000000240510455700775020401 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_POINT_SET_ #define _QV_POINT_SET_ #include #include #define QV_POINT_SET_USE_REST_OF_POINTS (-1) class QvPointSet : public QvNode { QV_NODE_HEADER(QvPointSet); public: // Fields QvSFLong startIndex; // Index of 1st coordinate of shape QvSFLong numPoints; // Number of points to draw }; #endif /* _QV_POINT_SET_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvField.h0000644000175000001440000000432510455700775017662 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_FIELD_ #define _QV_FIELD_ #include #include class QvInput; class QvNode; class QvField { public: virtual ~QvField(); QvBool isDefault() const { return flags.hasDefault; } QvNode * getContainer() const { return container; } void setDefault(QvBool def) { flags.hasDefault = def; } void setContainer(QvNode *cont); QvBool read(QvInput *in, const QvName &name); QvField() { flags.hasDefault = TRUE; } public: private: struct { unsigned int hasDefault : 1; // Field is set to default value } flags; QvNode *container; static QvField * createInstanceFromName(const QvName &className); virtual QvBool readValue(QvInput *in) = 0; friend class QvFieldData; }; class QvSField : public QvField { public: virtual ~QvSField(); protected: QvSField(); private: virtual QvBool readValue(QvInput *in) = 0; }; class QvMField : public QvField { public: int num; // Number of values int maxNum; // Number of values allocated // Destructor virtual ~QvMField(); protected: QvMField(); virtual void makeRoom(int newNum); private: virtual void allocValues(int num) = 0; virtual QvBool readValue(QvInput *in); virtual QvBool read1Value(QvInput *in, int index) = 0; }; #endif /* _QV_FIELD_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvIndexedFaceSet.c++0000644000175000001440000000104307730234466021566 00000000000000#include QV_NODE_SOURCE(QvIndexedFaceSet); QvIndexedFaceSet::QvIndexedFaceSet() { QV_NODE_CONSTRUCTOR(QvIndexedFaceSet); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(coordIndex); QV_NODE_ADD_FIELD(materialIndex); QV_NODE_ADD_FIELD(normalIndex); QV_NODE_ADD_FIELD(textureCoordIndex); coordIndex.values[0] = 0; materialIndex.values[0] = QV_END_FACE_INDEX; normalIndex.values[0] = QV_END_FACE_INDEX; textureCoordIndex.values[0] = QV_END_FACE_INDEX; } QvIndexedFaceSet::~QvIndexedFaceSet() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvChildList.h0000644000175000001440000000211210455700775020506 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_CHILD_LIST_ #define _QV_CHILD_LIST_ #include class QvChildList : public QvNodeList { public: QvChildList(); ~QvChildList(); }; #endif /* _QV_CHILD_LIST_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvState.h0000644000175000001440000000376110455700776017723 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_STATE_ #define _QV_STATE_ #include class QvState { public: // Stack indices, based on type of elements in them: enum StackIndex { CameraIndex, Coordinate3Index, FontStyleIndex, LightIndex, MaterialBindingIndex, MaterialIndex, NormalBindingIndex, NormalIndex, ShapeHintsIndex, Texture2Index, Texture2TransformationIndex, TextureCoordinate2Index, TransformationIndex, // This has to be last!!! NumStacks }; static const char *stackNames[NumStacks]; // Names of stacks int depth; // Current state depth QvElement **stacks; // Stacks of elements QvState(); ~QvState(); // Adds an element instance to the indexed stack void addElement(StackIndex stackIndex, QvElement *elt); // Returns top element on a stack QvElement * getTopElement(StackIndex stackIndex) { return stacks[stackIndex]; } // Pushes/pops the stacks void push(); void pop(); // Pops top element off one stack void popElement(StackIndex stackIndex); // Prints contents for debugging, mostly void print(); }; #endif /* _QV_STATE_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvCone.c++0000644000175000001440000000076207730234424017640 00000000000000#include QV_NODE_SOURCE(QvCone); QvCone::QvCone() { QV_NODE_CONSTRUCTOR(QvCone); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(parts); QV_NODE_ADD_FIELD(bottomRadius); QV_NODE_ADD_FIELD(height); parts.value = ALL; bottomRadius.value = 1.0; height.value = 2.0; QV_NODE_DEFINE_ENUM_VALUE(Part, SIDES); QV_NODE_DEFINE_ENUM_VALUE(Part, BOTTOM); QV_NODE_DEFINE_ENUM_VALUE(Part, ALL); QV_NODE_SET_SF_ENUM_TYPE(parts, Part); } QvCone::~QvCone() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSwitch.c++0000644000175000001440000000035307730234604020211 00000000000000#include QV_NODE_SOURCE(QvSwitch); QvSwitch::QvSwitch() { QV_NODE_CONSTRUCTOR(QvSwitch); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(whichChild); whichChild.value = QV_SWITCH_NONE; } QvSwitch::~QvSwitch() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvCoordinate3.h0000644000175000001440000000223710455700775021011 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_COORDINATE3_ #define _QV_COORDINATE3_ #include #include class QvCoordinate3 : public QvNode { QV_NODE_HEADER(QvCoordinate3); public: // Fields QvMFVec3f point; // Coordinate point(s) }; #endif /* _QV_COORDINATE3_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvPList.h0000644000175000001440000000301710455700775017667 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_PLIST_ #define _QV_PLIST_ #include class QvPList { public: QvPList(); ~QvPList(); void append(void * ptr) { if (nPtrs + 1 > ptrsSize) expand(nPtrs + 1); ptrs[nPtrs++] = ptr; } int find(const void *ptr) const; void remove(int which); int getLength() const { return (int) nPtrs; } void truncate(int start) { nPtrs = start; } void *& operator [](int i) const { return ptrs[i]; } private: void ** ptrs; int nPtrs; int ptrsSize; void setSize(int size) { if (size > ptrsSize) expand(size); nPtrs = size; } void expand(int size); }; #endif /* _QV_PLIST_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvLOD.h0000644000175000001440000000237210455700775017255 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_LEVEL_OF_DETAIL_ #define _QV_LEVEL_OF_DETAIL_ #include #include #include class QvLOD : public QvGroup { QV_NODE_HEADER(QvLOD); public: // Fields QvMFFloat range; // Distance ranges for LOD switching QvSFVec3f center; // Center for distance computation }; #endif /* _QV_LEVEL_OF_DETAIL_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvFieldData.h0000644000175000001440000000364610455700775020461 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_FIELD_DATA_ #define _QV_FIELD_DATA_ #include #include #include class QvField; class QvInput; class QvNode; class QvFieldData { public: QvFieldData() {} ~QvFieldData(); void addField(QvNode *defObject, const char *fieldName, const QvField *field); int getNumFields() const { return fields.getLength(); } const QvName & getFieldName(int index) const; QvField * getField(const QvNode *object, int index) const; void addEnumValue(const char *typeName, const char *valName, int val); void getEnumData(const char *typeName, int &num, const int *&vals, const QvName *&names); QvBool read(QvInput *in, QvNode *object, QvBool errorOnUnknownField = TRUE) const; QvBool read(QvInput *in, QvNode *object, const QvName &fieldName, QvBool &foundName) const; QvBool readFieldTypes(QvInput *in, QvNode *object); private: QvPList fields; QvPList enums; }; #endif /* _QV_FIELD_DATA_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvReadError.c++0000644000175000001440000000064407730234440020636 00000000000000#include #include #include #include void QvReadError::post(const QvInput *in, const char *formatString ...) { char buf[10000]; va_list ap; va_start(ap, formatString); vsprintf(buf, formatString, ap); va_end(ap); QvString locstr; in->getLocationString(locstr); fprintf(stderr, "VRML read error: %s\n%s\n", buf, locstr.getString()); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSubField.h0000644000175000001440000001354310455700776020337 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SUB_FIELD_ #define _QV_SUB_FIELD_ #include #include #include ///////////////////////////////////////////////////////////////////////////// #define QV_SFIELD_HEADER(className) \ public: \ className(); \ virtual ~className(); \ virtual QvBool readValue(QvInput *in) ///////////////////////////////////////////////////////////////////////////// #define QV_MFIELD_HEADER(className) \ public: \ className(); \ virtual ~className(); \ virtual QvBool read1Value(QvInput *in, int index); \ void allocValues(int newNum); \ protected: \ static QvBool canUseMalloc ///////////////////////////////////////////////////////////////////////////// #define QV_SFIELD_SOURCE(className) \ \ className::className() \ { \ } \ className::~className() \ { \ } ///////////////////////////////////////////////////////////////////////////// // Note: field types whose values require constructors to be called // should pass TRUE for valueHasConstructor. Otherwise, pass FALSE. #ifdef __SUNPRO_CC #define QV_MFIELD_SOURCE(className, valueType, numValues, valueHasConstructor)\ \ QvBool className::canUseMalloc; \ \ className::className() \ { \ canUseMalloc = ! valueHasConstructor; \ values = NULL; \ /* Make room for 1 value to start */ \ allocValues(1); \ } \ \ className::~className() \ { \ if (values != NULL) { \ if (canUseMalloc) \ free((char *) values); \ else \ delete [] values; \ } \ } \ \ void \ className::allocValues(int newNum) \ { \ if (values == NULL) { \ if (newNum > 0) { \ if (canUseMalloc) \ values = (valueType *) \ malloc(numValues * sizeof(valueType) * newNum); \ else \ values = new valueType[numValues * newNum]; \ } \ } \ else { \ if (newNum > 0) { \ if (canUseMalloc) \ values = (valueType *) \ realloc((malloc_t)values, numValues * sizeof(valueType) * newNum); \ else { \ valueType *oldValues = values; \ values = new valueType[numValues * newNum]; \ for (int i = 0; i < num && i < newNum; i++) \ values[i] = oldValues[i]; \ delete [] oldValues; \ } \ } \ else { \ if (canUseMalloc) \ free((char *) values); \ else \ delete [] values; \ values = NULL; \ } \ } \ num = maxNum = newNum; \ } #else #define QV_MFIELD_SOURCE(className, valueType, numValues, valueHasConstructor)\ \ QvBool className::canUseMalloc; \ \ className::className() \ { \ canUseMalloc = ! valueHasConstructor; \ values = NULL; \ /* Make room for 1 value to start */ \ allocValues(1); \ } \ \ className::~className() \ { \ if (values != NULL) { \ if (canUseMalloc) \ free((char *) values); \ else \ delete [] values; \ } \ } \ \ void \ className::allocValues(int newNum) \ { \ if (values == NULL) { \ if (newNum > 0) { \ if (canUseMalloc) \ values = (valueType *) \ malloc(numValues * sizeof(valueType) * newNum); \ else \ values = new valueType[numValues * newNum]; \ } \ } \ else { \ if (newNum > 0) { \ if (canUseMalloc) \ values = (valueType *) \ realloc(values, numValues * sizeof(valueType) * newNum); \ else { \ valueType *oldValues = values; \ values = new valueType[numValues * newNum]; \ for (int i = 0; i < num && i < newNum; i++) \ values[i] = oldValues[i]; \ delete [] oldValues; \ } \ } \ else { \ if (canUseMalloc) \ free((char *) values); \ else \ delete [] values; \ values = NULL; \ } \ } \ num = maxNum = newNum; \ } #endif #endif /* _QV_SUB_FIELD_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvPerspectiveCamera.h0000644000175000001440000000277710455700775022252 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_PERSPECTIVE_CAMERA_ #define _QV_PERSPECTIVE_CAMERA_ #include #include #include #include class QvPerspectiveCamera : public QvNode { QV_NODE_HEADER(QvPerspectiveCamera); public: QvSFVec3f position; // Location of viewpoint QvSFRotation orientation; // Orientation (rotation with // respect to (0,0,-1) vector) QvSFFloat focalDistance; // Distance from viewpoint to // point of focus. QvSFFloat heightAngle; // Angle (in radians) of field // of view, in height direction }; #endif /* _QV_PERSPECTIVE_CAMERA_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/Makefile.am0000644000175000001440000000637207730234414020211 00000000000000INCLUDES = @default_includes@ noinst_LIBRARIES = libQv.a libQv_a_SOURCES = \ QvAsciiText.c++ \ QvChildList.c++ \ QvCone.c++ \ QvCoordinate3.c++ \ QvCube.c++ \ QvCylinder.c++ \ QvDB.c++ \ QvDebugError.c++ \ QvDict.c++ \ QvDirectionalLight.c++ \ QvElement.c++ \ QvField.c++ \ QvFieldData.c++ \ QvFontStyle.c++ \ QvGroup.c++ \ QvIndexedFaceSet.c++ \ QvIndexedLineSet.c++ \ QvInfo.c++ \ QvInput.c++ \ QvLists.c++ \ QvLOD.c++ \ QvMFColor.c++ \ QvMFFloat.c++ \ QvMFLong.c++ \ QvMFString.c++ \ QvMFVec2f.c++ \ QvMFVec3f.c++ \ QvMaterial.c++ \ QvMaterialBinding.c++ \ QvMatrixTransform.c++ \ QvName.c++ \ QvNode.c++ \ QvNormal.c++ \ QvNormalBinding.c++ \ QvOrthographicCamera.c++ \ QvPList.c++ \ QvPerspectiveCamera.c++ \ QvPointLight.c++ \ QvPointSet.c++ \ QvReadError.c++ \ QvRotation.c++ \ QvSFBitMask.c++ \ QvSFBool.c++ \ QvSFColor.c++ \ QvSFEnum.c++ \ QvSFFloat.c++ \ QvSFImage.c++ \ QvSFLong.c++ \ QvSFMatrix.c++ \ QvSFRotation.c++ \ QvSFString.c++ \ QvSFVec2f.c++ \ QvSFVec3f.c++ \ QvScale.c++ \ QvSeparator.c++ \ QvShapeHints.c++ \ QvSphere.c++ \ QvSpotLight.c++ \ QvState.c++ \ QvString.c++ \ QvSwitch.c++ \ QvTexture2.c++ \ QvTexture2Transform.c++ \ QvTextureCoordinate2.c++ \ QvTransform.c++ \ QvTransformSeparator.c++ \ QvTranslation.c++ \ QvTraverse.c++ \ QvToWebOOGL.c++ \ QvUnknownNode.c++ \ QvWWWAnchor.c++ \ QvWWWInline.c++ \ \ QvAsciiText.h \ QvBasic.h \ QvChildList.h \ QvCone.h \ QvCoordinate3.h \ QvCube.h \ QvCylinder.h \ QvDB.h \ QvDebugError.h \ QvDict.h \ QvDirectionalLight.h \ QvElement.h \ QvField.h \ QvFieldData.h \ QvFields.h \ QvFontStyle.h \ QvGroup.h \ QvIndexedFaceSet.h \ QvIndexedLineSet.h \ QvInfo.h \ QvInput.h \ QvLOD.h \ QvLists.h \ QvMFColor.h \ QvMFFloat.h \ QvMFLong.h \ QvMFString.h \ QvMFVec2f.h \ QvMFVec3f.h \ QvMaterial.h \ QvMaterialBinding.h \ QvMatrixTransform.h \ QvNode.h \ QvNodes.h \ QvNormal.h \ QvNormalBinding.h \ QvOrthographicCamera.h \ QvPList.h \ QvPerspectiveCamera.h \ QvPointLight.h \ QvPointSet.h \ QvReadError.h \ QvRotation.h \ QvSFBitMask.h \ QvSFBool.h \ QvSFColor.h \ QvSFEnum.h \ QvSFFloat.h \ QvSFImage.h \ QvSFLong.h \ QvSFMatrix.h \ QvSFRotation.h \ QvSFString.h \ QvSFVec2f.h \ QvSFVec3f.h \ QvScale.h \ QvSeparator.h \ QvShapeHints.h \ QvSphere.h \ QvSpotLight.h \ QvState.h \ QvString.h \ QvSubField.h \ QvSubNode.h \ QvSwitch.h \ QvTexture2.h \ QvTexture2Transform.h \ QvTextureCoordinate2.h \ QvToWebOOGL.h \ QvTransform.h \ QvTransformSeparator.h \ QvTranslation.h \ QvUnknownNode.h \ QvWWWAnchor.h \ QvWWWInline.h EXTRA_DIST = Qv.c++ QvErrors.c++ QvFields.c++ QvNodes.c++ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/Makefile.in0000644000175000001440000006161510665240477020232 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/geomutil/vrml2oogl/lib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru libQv_a_AR = $(AR) $(ARFLAGS) libQv_a_LIBADD = am_libQv_a_OBJECTS = QvAsciiText.$(OBJEXT) QvChildList.$(OBJEXT) \ QvCone.$(OBJEXT) QvCoordinate3.$(OBJEXT) QvCube.$(OBJEXT) \ QvCylinder.$(OBJEXT) QvDB.$(OBJEXT) QvDebugError.$(OBJEXT) \ QvDict.$(OBJEXT) QvDirectionalLight.$(OBJEXT) \ QvElement.$(OBJEXT) QvField.$(OBJEXT) QvFieldData.$(OBJEXT) \ QvFontStyle.$(OBJEXT) QvGroup.$(OBJEXT) \ QvIndexedFaceSet.$(OBJEXT) QvIndexedLineSet.$(OBJEXT) \ QvInfo.$(OBJEXT) QvInput.$(OBJEXT) QvLists.$(OBJEXT) \ QvLOD.$(OBJEXT) QvMFColor.$(OBJEXT) QvMFFloat.$(OBJEXT) \ QvMFLong.$(OBJEXT) QvMFString.$(OBJEXT) QvMFVec2f.$(OBJEXT) \ QvMFVec3f.$(OBJEXT) QvMaterial.$(OBJEXT) \ QvMaterialBinding.$(OBJEXT) QvMatrixTransform.$(OBJEXT) \ QvName.$(OBJEXT) QvNode.$(OBJEXT) QvNormal.$(OBJEXT) \ QvNormalBinding.$(OBJEXT) QvOrthographicCamera.$(OBJEXT) \ QvPList.$(OBJEXT) QvPerspectiveCamera.$(OBJEXT) \ QvPointLight.$(OBJEXT) QvPointSet.$(OBJEXT) \ QvReadError.$(OBJEXT) QvRotation.$(OBJEXT) \ QvSFBitMask.$(OBJEXT) QvSFBool.$(OBJEXT) QvSFColor.$(OBJEXT) \ QvSFEnum.$(OBJEXT) QvSFFloat.$(OBJEXT) QvSFImage.$(OBJEXT) \ QvSFLong.$(OBJEXT) QvSFMatrix.$(OBJEXT) QvSFRotation.$(OBJEXT) \ QvSFString.$(OBJEXT) QvSFVec2f.$(OBJEXT) QvSFVec3f.$(OBJEXT) \ QvScale.$(OBJEXT) QvSeparator.$(OBJEXT) QvShapeHints.$(OBJEXT) \ QvSphere.$(OBJEXT) QvSpotLight.$(OBJEXT) QvState.$(OBJEXT) \ QvString.$(OBJEXT) QvSwitch.$(OBJEXT) QvTexture2.$(OBJEXT) \ QvTexture2Transform.$(OBJEXT) QvTextureCoordinate2.$(OBJEXT) \ QvTransform.$(OBJEXT) QvTransformSeparator.$(OBJEXT) \ QvTranslation.$(OBJEXT) QvTraverse.$(OBJEXT) \ QvToWebOOGL.$(OBJEXT) QvUnknownNode.$(OBJEXT) \ QvWWWAnchor.$(OBJEXT) QvWWWInline.$(OBJEXT) libQv_a_OBJECTS = $(am_libQv_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libQv_a_SOURCES) DIST_SOURCES = $(libQv_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ noinst_LIBRARIES = libQv.a libQv_a_SOURCES = \ QvAsciiText.c++ \ QvChildList.c++ \ QvCone.c++ \ QvCoordinate3.c++ \ QvCube.c++ \ QvCylinder.c++ \ QvDB.c++ \ QvDebugError.c++ \ QvDict.c++ \ QvDirectionalLight.c++ \ QvElement.c++ \ QvField.c++ \ QvFieldData.c++ \ QvFontStyle.c++ \ QvGroup.c++ \ QvIndexedFaceSet.c++ \ QvIndexedLineSet.c++ \ QvInfo.c++ \ QvInput.c++ \ QvLists.c++ \ QvLOD.c++ \ QvMFColor.c++ \ QvMFFloat.c++ \ QvMFLong.c++ \ QvMFString.c++ \ QvMFVec2f.c++ \ QvMFVec3f.c++ \ QvMaterial.c++ \ QvMaterialBinding.c++ \ QvMatrixTransform.c++ \ QvName.c++ \ QvNode.c++ \ QvNormal.c++ \ QvNormalBinding.c++ \ QvOrthographicCamera.c++ \ QvPList.c++ \ QvPerspectiveCamera.c++ \ QvPointLight.c++ \ QvPointSet.c++ \ QvReadError.c++ \ QvRotation.c++ \ QvSFBitMask.c++ \ QvSFBool.c++ \ QvSFColor.c++ \ QvSFEnum.c++ \ QvSFFloat.c++ \ QvSFImage.c++ \ QvSFLong.c++ \ QvSFMatrix.c++ \ QvSFRotation.c++ \ QvSFString.c++ \ QvSFVec2f.c++ \ QvSFVec3f.c++ \ QvScale.c++ \ QvSeparator.c++ \ QvShapeHints.c++ \ QvSphere.c++ \ QvSpotLight.c++ \ QvState.c++ \ QvString.c++ \ QvSwitch.c++ \ QvTexture2.c++ \ QvTexture2Transform.c++ \ QvTextureCoordinate2.c++ \ QvTransform.c++ \ QvTransformSeparator.c++ \ QvTranslation.c++ \ QvTraverse.c++ \ QvToWebOOGL.c++ \ QvUnknownNode.c++ \ QvWWWAnchor.c++ \ QvWWWInline.c++ \ \ QvAsciiText.h \ QvBasic.h \ QvChildList.h \ QvCone.h \ QvCoordinate3.h \ QvCube.h \ QvCylinder.h \ QvDB.h \ QvDebugError.h \ QvDict.h \ QvDirectionalLight.h \ QvElement.h \ QvField.h \ QvFieldData.h \ QvFields.h \ QvFontStyle.h \ QvGroup.h \ QvIndexedFaceSet.h \ QvIndexedLineSet.h \ QvInfo.h \ QvInput.h \ QvLOD.h \ QvLists.h \ QvMFColor.h \ QvMFFloat.h \ QvMFLong.h \ QvMFString.h \ QvMFVec2f.h \ QvMFVec3f.h \ QvMaterial.h \ QvMaterialBinding.h \ QvMatrixTransform.h \ QvNode.h \ QvNodes.h \ QvNormal.h \ QvNormalBinding.h \ QvOrthographicCamera.h \ QvPList.h \ QvPerspectiveCamera.h \ QvPointLight.h \ QvPointSet.h \ QvReadError.h \ QvRotation.h \ QvSFBitMask.h \ QvSFBool.h \ QvSFColor.h \ QvSFEnum.h \ QvSFFloat.h \ QvSFImage.h \ QvSFLong.h \ QvSFMatrix.h \ QvSFRotation.h \ QvSFString.h \ QvSFVec2f.h \ QvSFVec3f.h \ QvScale.h \ QvSeparator.h \ QvShapeHints.h \ QvSphere.h \ QvSpotLight.h \ QvState.h \ QvString.h \ QvSubField.h \ QvSubNode.h \ QvSwitch.h \ QvTexture2.h \ QvTexture2Transform.h \ QvTextureCoordinate2.h \ QvToWebOOGL.h \ QvTransform.h \ QvTransformSeparator.h \ QvTranslation.h \ QvUnknownNode.h \ QvWWWAnchor.h \ QvWWWInline.h EXTRA_DIST = Qv.c++ QvErrors.c++ QvFields.c++ QvNodes.c++ all: all-am .SUFFIXES: .SUFFIXES: .c++ .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/vrml2oogl/lib/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/vrml2oogl/lib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libQv.a: $(libQv_a_OBJECTS) $(libQv_a_DEPENDENCIES) -rm -f libQv.a $(libQv_a_AR) libQv.a $(libQv_a_OBJECTS) $(libQv_a_LIBADD) $(RANLIB) libQv.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvAsciiText.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvChildList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvCone.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvCoordinate3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvCube.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvCylinder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvDB.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvDebugError.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvDict.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvDirectionalLight.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvElement.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvField.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvFieldData.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvFontStyle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvGroup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvIndexedFaceSet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvIndexedLineSet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvInfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvInput.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvLOD.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvLists.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMFColor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMFFloat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMFLong.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMFString.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMFVec2f.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMFVec3f.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMaterial.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMaterialBinding.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvMatrixTransform.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvName.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvNode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvNormal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvNormalBinding.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvOrthographicCamera.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvPList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvPerspectiveCamera.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvPointLight.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvPointSet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvReadError.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvRotation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFBitMask.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFBool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFColor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFEnum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFFloat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFImage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFLong.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFMatrix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFRotation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFString.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFVec2f.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSFVec3f.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvScale.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSeparator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvShapeHints.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSphere.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSpotLight.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvState.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvString.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvSwitch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTexture2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTexture2Transform.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTextureCoordinate2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvToWebOOGL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTransform.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTransformSeparator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTranslation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvTraverse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvUnknownNode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvWWWAnchor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QvWWWInline.Po@am__quote@ .c++.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .c++.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c++.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvNormalBinding.h0000644000175000001440000000246710455700775021367 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_NORMAL_BINDING_ #define _QV_NORMAL_BINDING_ #include #include class QvNormalBinding : public QvNode { QV_NODE_HEADER(QvNormalBinding); public: enum Binding { DEFAULT, OVERALL, PER_PART, PER_PART_INDEXED, PER_FACE, PER_FACE_INDEXED, PER_VERTEX, PER_VERTEX_INDEXED }; // Fields QvSFEnum value; // Normal binding value }; #endif /* _QV_NORMAL_BINDING_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFBool.h0000644000175000001440000000211310455700775017754 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_BOOL_ #define _QV_SF_BOOL_ #include class QvSFBool : public QvSField { public: QvBool value; QV_SFIELD_HEADER(QvSFBool); }; #endif /* _QV_SF_BOOL_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvFields.c++0000644000175000001440000000065507730234457020171 00000000000000#include "QvMFColor.c++" #include "QvMFFloat.c++" #include "QvMFLong.c++" #include "QvMFVec2f.c++" #include "QvMFVec3f.c++" #include "QvSFBitMask.c++" #include "QvSFBool.c++" #include "QvSFColor.c++" #include "QvSFEnum.c++" #include "QvSFFloat.c++" #include "QvSFImage.c++" #include "QvSFLong.c++" #include "QvSFMatrix.c++" #include "QvSFRotation.c++" #include "QvSFString.c++" #include "QvSFVec2f.c++" #include "QvSFVec3f.c++" geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTransform.h0000644000175000001440000000262710455700776020616 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_TRANSFORM_ #define _QV_TRANSFORM_ #include #include #include class QvTransform : public QvNode { QV_NODE_HEADER(QvTransform); public: // Fields QvSFVec3f translation; // Translation vector QvSFRotation rotation; // Rotation QvSFVec3f scaleFactor; // Scale factors QvSFRotation scaleOrientation;// Defines rotational space for scale QvSFVec3f center; // Center point for scale and rotate }; #endif /* _QV_TRANSFORM_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFFloat.h0000644000175000001440000000211710455700775020132 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_FLOAT_ #define _QV_SF_FLOAT_ #include class QvSFFloat : public QvSField { public: float value; QV_SFIELD_HEADER(QvSFFloat); }; #endif /* _QV_SF_FLOAT_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFImage.c++0000644000175000001440000000137607730234462020233 00000000000000#include // Can't use macro, since we define a constructor. QvSFImage::QvSFImage() { size[0] = size[1] = 0; numComponents = 0; bytes = NULL; } QvSFImage::~QvSFImage() { if (bytes != NULL) delete [] bytes; } QvBool QvSFImage::readValue(QvInput *in) { if (! in->read(size[0]) || ! in->read(size[1]) || ! in->read(numComponents)) return FALSE; if (bytes != NULL) delete [] bytes; bytes = new unsigned char[size[0] * size[1] * numComponents]; int byte = 0; for (int i = 0; i < size[0] * size[1]; i++) { unsigned long l; if (! in->read(l)) return FALSE; for (int j = 0; j < numComponents; j++) bytes[byte++] = (unsigned char) ((l >> (8*(numComponents-j-1))) & 0xFF); } return TRUE; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvWWWAnchor.c++0000644000175000001440000000073107730234622020567 00000000000000#include QV_NODE_SOURCE(QvWWWAnchor); QvWWWAnchor::QvWWWAnchor() { QV_NODE_CONSTRUCTOR(QvWWWAnchor); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(name); QV_NODE_ADD_FIELD(description); QV_NODE_ADD_FIELD(map); name.value = ""; description.value = ""; map.value = NONE; QV_NODE_DEFINE_ENUM_VALUE(Map, NONE); QV_NODE_DEFINE_ENUM_VALUE(Map, POINT); QV_NODE_SET_SF_ENUM_TYPE(map, Map); } QvWWWAnchor::~QvWWWAnchor() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMFString.c++0000644000175000001440000000025107730234566020445 00000000000000#include QV_MFIELD_SOURCE(QvMFString, QvString, 1, TRUE); QvBool QvMFString::read1Value(QvInput *in, int index) { return in->read(values[index]); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFEnum.h0000644000175000001440000000406310455700775017773 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_ENUM_ #define _QV_SF_ENUM_ #include #include class QvSFEnum : public QvSField { public: int value; QV_SFIELD_HEADER(QvSFEnum); // Sets up value/name correspondances void setEnums(int num, const int vals[], const QvName names[]) { numEnums = num; enumValues = vals; enumNames = names; } int numEnums; // Number of enumeration values const int *enumValues; // Enumeration values const QvName *enumNames; // Mnemonic names of values // Looks up enum name, returns value. Returns FALSE if not found. QvBool findEnumValue(const QvName &name, int &val) const; }; #define QV_NODE_SET_SF_ENUM_TYPE(fieldName, enumType) \ do { \ int _so_sf_enum_num; \ const int *_so_sf_enum_vals; \ const QvName *_so_sf_enum_names; \ fieldData->getEnumData(QV__QUOTE(enumType), \ _so_sf_enum_num, \ _so_sf_enum_vals, \ _so_sf_enum_names); \ fieldName.setEnums(_so_sf_enum_num, \ _so_sf_enum_vals, \ _so_sf_enum_names); \ } while (0) #endif /* _QV_SF_ENUM_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvNodes.c++0000644000175000001440000000202007730234604020011 00000000000000#include "QvAsciiText.c++" #include "QvCone.c++" #include "QvCoordinate3.c++" #include "QvCube.c++" #include "QvCylinder.c++" #include "QvDirectionalLight.c++" #include "QvFontStyle.c++" #include "QvGroup.c++" #include "QvIndexedFaceSet.c++" #include "QvIndexedLineSet.c++" #include "QvInfo.c++" #include "QvLOD.c++" #include "QvMaterial.c++" #include "QvMaterialBinding.c++" #include "QvMatrixTransform.c++" #include "QvNormal.c++" #include "QvNormalBinding.c++" #include "QvOrthographicCamera.c++" #include "QvPerspectiveCamera.c++" #include "QvPointLight.c++" #include "QvPointSet.c++" #include "QvRotation.c++" #include "QvScale.c++" #include "QvSeparator.c++" #include "QvShapeHints.c++" #include "QvSphere.c++" #include "QvSpotLight.c++" #include "QvSwitch.c++" #include "QvTexture2.c++" #include "QvTexture2Transform.c++" #include "QvTextureCoordinate2.c++" #include "QvTransform.c++" #include "QvTransformSeparator.c++" #include "QvTranslation.c++" #include "QvUnknownNode.c++" #include "QvWWWAnchor.c++" #include "QvWWWInline.c++" geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMFVec2f.c++0000644000175000001440000000035507730234570020144 00000000000000#include QV_MFIELD_SOURCE(QvMFVec2f, float, 2, FALSE); QvBool QvMFVec2f::read1Value(QvInput *in, int index) { float *valuePtr = values + index * 2; return (in->read(valuePtr[0]) && in->read(valuePtr[1])); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTransformSeparator.c++0000644000175000001440000000036307730234616022610 00000000000000#include QV_NODE_SOURCE(QvTransformSeparator); QvTransformSeparator::QvTransformSeparator() { QV_NODE_CONSTRUCTOR(QvTransformSeparator); isBuiltIn = TRUE; } QvTransformSeparator::~QvTransformSeparator() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMFVec3f.c++0000644000175000001440000000041307730234572020142 00000000000000#include QV_MFIELD_SOURCE(QvMFVec3f, float, 3, FALSE); QvBool QvMFVec3f::read1Value(QvInput *in, int index) { float *valuePtr = values + index * 3; return (in->read(valuePtr[0]) && in->read(valuePtr[1]) && in->read(valuePtr[2])); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvFontStyle.c++0000644000175000001440000000131307730234461020675 00000000000000#include QV_NODE_SOURCE(QvFontStyle); QvFontStyle::QvFontStyle() { QV_NODE_CONSTRUCTOR(QvFontStyle); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(size); QV_NODE_ADD_FIELD(family); QV_NODE_ADD_FIELD(style); size.value = 10.0; family.value = SERIF; style.value = NONE; QV_NODE_DEFINE_ENUM_VALUE(Family, SERIF); QV_NODE_DEFINE_ENUM_VALUE(Family, SANS); QV_NODE_DEFINE_ENUM_VALUE(Family, TYPEWRITER); QV_NODE_DEFINE_ENUM_VALUE(Style, NONE); QV_NODE_DEFINE_ENUM_VALUE(Style, BOLD); QV_NODE_DEFINE_ENUM_VALUE(Style, ITALIC); QV_NODE_SET_SF_ENUM_TYPE(family, Family); QV_NODE_SET_SF_ENUM_TYPE(style, Style); } QvFontStyle::~QvFontStyle() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSubNode.h0000644000175000001440000000437210455700776020201 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SUB_NODE_ #define _QV_SUB_NODE_ #include #include #define QV_NODE_HEADER(className) \ public: \ className(); \ virtual ~className(); \ virtual void traverse(QvState *state); \ virtual void ToWebOOGL(QvState *state); \ private: \ static QvBool firstInstance; \ static QvFieldData *fieldData; \ virtual QvFieldData *getFieldData() { return fieldData; } #define QV_NODE_SOURCE(className) \ QvFieldData *className::fieldData; \ QvBool className::firstInstance = TRUE; #define QV_NODE_CONSTRUCTOR(className) \ if (fieldData == NULL) \ fieldData = new QvFieldData; \ else \ firstInstance = FALSE; \ isBuiltIn = FALSE; \ #define QV_NODE_IS_FIRST_INSTANCE() (firstInstance == TRUE) #define QV_NODE_ADD_FIELD(fieldName) \ if (firstInstance) \ fieldData->addField(this, QV__QUOTE(fieldName), &this->fieldName); \ this->fieldName.setContainer(this); #define QV_NODE_DEFINE_ENUM_VALUE(enumType,enumValue) \ if (firstInstance) \ fieldData->addEnumValue(QV__QUOTE(enumType), \ QV__QUOTE(enumValue), enumValue) #endif /* _QV_SUB_NODE_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvFieldData.c++0000644000175000001440000001244610622716743020576 00000000000000#include #include #include #include #include #define OPEN_BRACE_CHAR '[' #define CLOSE_BRACE_CHAR ']' #define VALUE_SEPARATOR_CHAR ',' struct QvFieldEntry { QvName name; long offset; }; struct QvEnumEntry { QvName typeName; int num; int arraySize; int *vals; QvName *names; QvEnumEntry(const QvName &name); ~QvEnumEntry(); static int growSize; }; int QvEnumEntry::growSize = 6; QvEnumEntry::QvEnumEntry(const QvName &name) { typeName = name; num = 0; arraySize = growSize; vals = new int[arraySize]; names = new QvName[arraySize]; } QvEnumEntry::~QvEnumEntry() { delete [] vals; delete [] names; } QvFieldData::~QvFieldData() { struct QvFieldEntry *tmpField; struct QvEnumEntry *tmpEnum; for (int i=0; iname = fieldName; newField->offset = (const char *) field - (const char *) defobj; fields.append((void *) newField); } const QvName & QvFieldData::getFieldName(int index) const { return ((QvFieldEntry *) fields[index])->name; } QvField * QvFieldData::getField(const QvNode *object, int index) const { return (QvField *) ((char *) object + ((QvFieldEntry *) fields[index])->offset); } #include static QvName stripWhite(const char *name) { int firstchar = -1; int lastchar = -1; int lastwhite = -1; int i; for (i=0; name[i]; i++) { if (isspace(name[i])) lastwhite = i; else { if (firstchar == -1) firstchar = i; lastchar = i; } } if (lastchar > lastwhite) return QvName(&name[firstchar]); char buf[500]; int b; for (b=0, i=firstchar; i<=lastchar; i++, b++) buf[b] = name[i]; buf[b] = 0; return QvName(buf); } void QvFieldData::addEnumValue(const char *typeNameArg, const char *valNameArg, int val) { struct QvEnumEntry *e = NULL; QvName typeName = stripWhite(typeNameArg); QvName valName = stripWhite(valNameArg); for (int i=0; itypeName == typeName) break; else e = NULL; } if (e == NULL) { e = new QvEnumEntry(typeName); enums.append((void*) e); } if (e->num == e->arraySize) { e->arraySize += QvEnumEntry::growSize; int *ovals = e->vals; QvName *onames = e->names; e->vals = new int[e->arraySize]; e->names = new QvName[e->arraySize]; for (int i=0; inum; i++) { e->vals[i] = ovals[i]; e->names[i] = onames[i]; } delete [] ovals; delete [] onames; } e->vals[e->num] = val; e->names[e->num] = valName; e->num++; } void QvFieldData::getEnumData(const char *typeNameArg, int &num, const int *&vals, const QvName *&names) { QvName typeName = stripWhite(typeNameArg); for (int i=0; itypeName == typeName) { num = e->num; vals = e->vals; names = e->names; return; } } num = 0; vals = NULL; names = NULL; } QvBool QvFieldData::readFieldTypes(QvInput *in, QvNode *object) { QvName fieldType, fieldName; char c; if (! (in->read(c) || c != OPEN_BRACE_CHAR)) return FALSE; if (in->read(c) && c == CLOSE_BRACE_CHAR) return TRUE; in->putBack(c); QvBool alreadyHasFields = (object->isBuiltIn || getNumFields() != 0); while (TRUE) { if (! in->read(fieldType, TRUE) || ! in->read(fieldName, TRUE)) return FALSE; if (! alreadyHasFields) { QvField *fld = QvField::createInstanceFromName(fieldType); fld->setContainer(object); addField(object, fieldName.getString(), fld); } if (! in->read(c)) return FALSE; if (c == VALUE_SEPARATOR_CHAR) { if (in->read(c)) { if (c == CLOSE_BRACE_CHAR) return TRUE; else in->putBack(c); } } else if (c == CLOSE_BRACE_CHAR) return TRUE; else return FALSE; } } QvBool QvFieldData::read(QvInput *in, QvNode *object, QvBool errorOnUnknownField) const { QvName fieldName; if (fields.getLength() == 0) return TRUE; while (TRUE) { if (! in->read(fieldName, TRUE) || ! fieldName) return TRUE; QvBool foundName; if (! read(in, object, fieldName, foundName)) return FALSE; if (!foundName) { if (errorOnUnknownField) { QvReadError::post(in, "Unknown field \"%s\"", fieldName.getString()); return FALSE; } else { in->putBack(fieldName.getString()); return TRUE; } } } } QvBool QvFieldData::read(QvInput *in, QvNode *object, const QvName &fieldName, QvBool &foundName) const { int i; for (i = 0; i < fields.getLength(); i++) { if (fieldName == getFieldName(i)) { if (! getField(object, i)->read(in, fieldName)) return FALSE; break; } } if (i == fields.getLength()) foundName = FALSE; else foundName = TRUE; return TRUE; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvNodes.h0000644000175000001440000000356510455700775017714 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_NODES_ #define _QV_NODES_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /* _QV_NODES_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvPList.c++0000644000175000001440000000146710622374317020012 00000000000000#include #define DEFAULT_INITIAL_SIZE 4 QvPList::QvPList() { ptrs = NULL; nPtrs = ptrsSize = 0; setSize(0); } QvPList::~QvPList() { if (ptrs != NULL) delete [] ptrs; } int QvPList::find(const void *ptr) const { int i; for (i = 0; i < nPtrs; i++) if (ptrs[i] == ptr) return(i); return -1; } void QvPList::remove(int which) { int i; for (i = which; i < nPtrs - 1; i++) ptrs[i] = ptrs[i + 1]; setSize(nPtrs - 1); } void QvPList::expand(int size) { void **newPtrs; int i; if (ptrsSize == 0) ptrsSize = DEFAULT_INITIAL_SIZE; while (size > ptrsSize) { ptrsSize *= 2; } newPtrs = new void *[ptrsSize]; if (ptrs != NULL) { for (i = 0; i < nPtrs; i++) newPtrs[i] = ptrs[i]; delete [] ptrs; } ptrs = newPtrs; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSpotLight.c++0000644000175000001440000000137307730234571020673 00000000000000#include QV_NODE_SOURCE(QvSpotLight); QvSpotLight::QvSpotLight() { QV_NODE_CONSTRUCTOR(QvSpotLight); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(on); QV_NODE_ADD_FIELD(intensity); QV_NODE_ADD_FIELD(color); QV_NODE_ADD_FIELD(location); QV_NODE_ADD_FIELD(direction); QV_NODE_ADD_FIELD(dropOffRate); QV_NODE_ADD_FIELD(cutOffAngle); on.value = TRUE; intensity.value = 1.0; color.value[0] = color.value[1] = color.value[2] = 1.0; location.value[0] = 0.0; location.value[1] = 0.0; location.value[2] = 1.0; direction.value[0] = 0.0; direction.value[1] = 0.0; direction.value[2] = -1.0; dropOffRate.value = 0.0; cutOffAngle.value = M_PI / 4.0; } QvSpotLight::~QvSpotLight() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFBitMask.h0000644000175000001440000000213710455700775020421 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_BIT_MASK_ #define _QV_SF_BIT_MASK_ #include class QvSFBitMask : public QvSFEnum { public: // Inherits value QV_SFIELD_HEADER(QvSFBitMask); }; #endif /* _QV_SF_BIT_MASK_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMFLong.c++0000644000175000001440000000024007730234564020072 00000000000000#include QV_MFIELD_SOURCE(QvMFLong, long, 1, FALSE); QvBool QvMFLong::read1Value(QvInput *in, int index) { return in->read(values[index]); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFRotation.h0000644000175000001440000000216110455700775020663 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_ROTATION_ #define _QV_SF_ROTATION_ #include class QvSFRotation : public QvSField { public: float axis[3]; float angle; QV_SFIELD_HEADER(QvSFRotation); }; #endif /* _QV_SF_ROTATION_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMFColor.h0000644000175000001440000000214210455700775020133 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MF_COLOR_ #define _QV_MF_COLOR_ #include class QvMFColor : public QvMField { public: float *values; // 3 per color QV_MFIELD_HEADER(QvMFColor); }; #endif /* _QV_MF_COLOR_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvChildList.c++0000644000175000001440000000017207730234422020624 00000000000000#include QvChildList::QvChildList() : QvNodeList() { } QvChildList::~QvChildList() { truncate(0); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvGroup.h0000644000175000001440000000242610455700775017733 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_GROUP_ #define _QV_GROUP_ class QvChildList; #include class QvGroup : public QvNode { QV_NODE_HEADER(QvGroup); public: QvNode * getChild(int index) const; int getNumChildren() const; virtual QvChildList *getChildren() const; virtual QvBool readInstance(QvInput *in); virtual QvBool readChildren(QvInput *in); }; #endif /* _QV_GROUP_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvField.c++0000644000175000001440000000534307730234452020000 00000000000000#include #include #include // Special characters in files #define OPEN_BRACE_CHAR '[' #define CLOSE_BRACE_CHAR ']' #define VALUE_SEPARATOR_CHAR ',' QvField::~QvField() { } void QvField::setContainer(QvNode *cont) { container = cont; setDefault(TRUE); } QvBool QvField::read(QvInput *in, const QvName &name) { setDefault(FALSE); if (! readValue(in)) { QvReadError::post(in, "Couldn't read value for field \"%s\"", name.getString()); return FALSE; } return TRUE; } QvField * QvField::createInstanceFromName(const QvName &className) { #define TRY_CLASS(name, class) \ else if (className == name) \ inst = new class QvField *inst = NULL; if (0) ; // So "else" works in first TRY_CLASS TRY_CLASS("MFColor", QvMFColor); TRY_CLASS("MFFloat", QvMFFloat); TRY_CLASS("MFLong", QvMFLong); TRY_CLASS("MFString", QvMFString); TRY_CLASS("MFVec2f", QvMFVec2f); TRY_CLASS("MFVec3f", QvMFVec3f); TRY_CLASS("SFBitMask", QvSFBitMask); TRY_CLASS("SFBool", QvSFBool); TRY_CLASS("SFColor", QvSFColor); TRY_CLASS("SFEnum", QvSFEnum); TRY_CLASS("SFFloat", QvSFFloat); TRY_CLASS("SFImage", QvSFImage); TRY_CLASS("SFLong", QvSFLong); TRY_CLASS("SFMatrix", QvSFMatrix); TRY_CLASS("SFRotation", QvSFRotation); TRY_CLASS("SFString", QvSFString); TRY_CLASS("SFVec2f", QvSFVec2f); TRY_CLASS("SFVec3f", QvSFVec3f); return inst; #undef TRY_CLASS } QvSField::QvSField() { } QvSField::~QvSField() { } QvMField::QvMField() { maxNum = num = 0; } QvMField::~QvMField() { } void QvMField::makeRoom(int newNum) { if (newNum != num) allocValues(newNum); } QvBool QvMField::readValue(QvInput *in) { char c; int curIndex = 0; if (in->read(c) && c == OPEN_BRACE_CHAR) { if (in->read(c) && c == CLOSE_BRACE_CHAR) ; else { in->putBack(c); while (TRUE) { if (curIndex >= num) makeRoom(curIndex + 1); if (! read1Value(in, curIndex++) || ! in->read(c)) { QvReadError::post(in, "Couldn't read value %d of field", curIndex); return FALSE; } if (c == VALUE_SEPARATOR_CHAR) { if (in->read(c)) { if (c == CLOSE_BRACE_CHAR) break; else in->putBack(c); } } else if (c == CLOSE_BRACE_CHAR) break; else { QvReadError::post(in, "Expected '%c' or '%c' but got " "'%c' while reading value %d", VALUE_SEPARATOR_CHAR, CLOSE_BRACE_CHAR, c, curIndex); return FALSE; } } } if (curIndex < num) makeRoom(curIndex); } else { in->putBack(c); makeRoom(1); if (! read1Value(in, 0)) return FALSE; } return TRUE; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFLong.h0000644000175000001440000000211110455700775017756 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_LONG_ #define _QV_SF_LONG_ #include class QvSFLong : public QvSField { public: long value; QV_SFIELD_HEADER(QvSFLong); }; #endif /* _QV_SF_LONG_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTexture2.h0000644000175000001440000000305010455700776020354 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_TEXTURE_2_ #define _QV_TEXTURE_2_ #include #include #include #include class QvTexture2 : public QvNode { QV_NODE_HEADER(QvTexture2); public: enum Wrap { // Texture wrap type REPEAT, // Repeats texture outside 0-1 // texture coordinate range CLAMP // Clamps texture coordinates // to lie within 0-1 range }; // Fields. QvSFString filename; // file to read texture from QvSFImage image; // The texture QvSFEnum wrapS; QvSFEnum wrapT; virtual QvBool readInstance(QvInput *in); QvBool readImage(); }; #endif /* _QV_TEXTURE_2_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvDebugError.h0000644000175000001440000000210710455700775020673 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_DEBUG_ERROR #define _QV_DEBUG_ERROR class QvDebugError { public: static void post(const char *methodName, const char *formatString ...); }; #endif /* _QV_DEBUG_ERROR */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvRotation.h0000644000175000001440000000221410455700775020431 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_ROTATION_ #define _QV_ROTATION_ #include #include class QvRotation : public QvNode { QV_NODE_HEADER(QvRotation); public: // Fields QvSFRotation rotation; // Rotation }; #endif /* _QV_ROTATION_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTexture2.c++0000644000175000001440000000201207730234611020462 00000000000000#include QV_NODE_SOURCE(QvTexture2); QvTexture2::QvTexture2() { QV_NODE_CONSTRUCTOR(QvTexture2); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(filename); QV_NODE_ADD_FIELD(image); QV_NODE_ADD_FIELD(wrapS); QV_NODE_ADD_FIELD(wrapT); filename.value = ""; image.size[0] = image.size[1] = (int)0.0; image.numComponents = 0; image.bytes = NULL; wrapS.value = REPEAT; wrapT.value = REPEAT; QV_NODE_DEFINE_ENUM_VALUE(Wrap, REPEAT); QV_NODE_DEFINE_ENUM_VALUE(Wrap, CLAMP); QV_NODE_SET_SF_ENUM_TYPE(wrapS, Wrap); QV_NODE_SET_SF_ENUM_TYPE(wrapT, Wrap); } QvTexture2::~QvTexture2() { } QvBool QvTexture2::readInstance(QvInput *in) { QvBool readOK = QvNode::readInstance(in); if (readOK && ! filename.isDefault()) { if (! readImage()) readOK = FALSE; image.setDefault(TRUE); } return readOK; } QvBool QvTexture2::readImage() { // ??? // ??? Read image from filename and store results in image field. // ??? return TRUE; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFString.c++0000644000175000001440000000020207730234546020445 00000000000000#include QV_SFIELD_SOURCE(QvSFString); QvBool QvSFString::readValue(QvInput *in) { return in->read(value); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFMatrix.c++0000644000175000001440000000105407730234467020453 00000000000000#include QV_SFIELD_SOURCE(QvSFMatrix); QvBool QvSFMatrix::readValue(QvInput *in) { return (in->read(value[0][0]) && in->read(value[0][1]) && in->read(value[0][2]) && in->read(value[0][3]) && in->read(value[1][0]) && in->read(value[1][1]) && in->read(value[1][2]) && in->read(value[1][3]) && in->read(value[2][0]) && in->read(value[2][1]) && in->read(value[2][2]) && in->read(value[2][3]) && in->read(value[3][0]) && in->read(value[3][1]) && in->read(value[3][2]) && in->read(value[3][3])); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvPerspectiveCamera.c++0000644000175000001440000000123307730234611022346 00000000000000#include QV_NODE_SOURCE(QvPerspectiveCamera); QvPerspectiveCamera::QvPerspectiveCamera() { QV_NODE_CONSTRUCTOR(QvPerspectiveCamera); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(position); QV_NODE_ADD_FIELD(orientation); QV_NODE_ADD_FIELD(focalDistance); QV_NODE_ADD_FIELD(heightAngle); position.value[0] = 0.0; position.value[1] = 0.0; position.value[2] = 1.0; orientation.axis[0] = 0.0; orientation.axis[1] = 0.0; orientation.axis[2] = 1.0; orientation.angle = 0.0; focalDistance.value = 5.0; heightAngle.value = M_PI_4; // 45 degrees } QvPerspectiveCamera::~QvPerspectiveCamera() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMFString.h0000644000175000001440000000213110455700775020321 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MF_STRING_ #define _QV_MF_STRING_ #include class QvMFString : public QvMField { public: QvString *values; QV_MFIELD_HEADER(QvMFString); }; #endif /* _QV_MF_STRING_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvBasic.h0000644000175000001440000000310410455700775017652 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_BASIC_ #define _QV_BASIC_ #include #ifdef NeXT #include #endif #include #include #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif typedef int QvBool; // This uses the preprocessor to quote a string #if defined(__STDC__) || defined(__ANSI_CPP__) /* ANSI C */ # define QV__QUOTE(str) #str #else /* Non-ANSI C */ # define QV__QUOTE(str) "str" #endif // This uses the preprocessor to concatenate two strings #if defined(__STDC__) || defined(__ANSI_CPP__) /* ANSI C */ # define QV__CONCAT(str1, str2) str1##str2 #else /* Non-ANSI C */ # define QV__CONCAT(str1, str2) str1/**/str2 #endif #endif /* _QV_BASIC_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTexture2Transform.c++0000644000175000001440000000105307730234612022363 00000000000000#include QV_NODE_SOURCE(QvTexture2Transform); QvTexture2Transform::QvTexture2Transform() { QV_NODE_CONSTRUCTOR(QvTexture2Transform); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(translation); QV_NODE_ADD_FIELD(rotation); QV_NODE_ADD_FIELD(scaleFactor); QV_NODE_ADD_FIELD(center); translation.value[0] = translation.value[1] = 0.0; rotation.value = 0.0; scaleFactor.value[0] = scaleFactor.value[1] = 1.0; center.value[0] = center.value[1] = 0.0; } QvTexture2Transform::~QvTexture2Transform() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTranslation.h0000644000175000001440000000224310455700776021133 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_TRANSLATION_ #define _QV_TRANSLATION_ #include #include class QvTranslation : public QvNode { QV_NODE_HEADER(QvTranslation); public: // Fields QvSFVec3f translation; // Translation vector }; #endif /* _QV_TRANSLATION_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvToWebOOGL.h0000644000175000001440000000200610455700776020333 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ extern "C" { #include } int OOGLfile(FILE *); int OOGLhandle(char *); char *OOGLgeturls(int ); int OOGLnumuniq(); geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvString.c++0000644000175000001440000000341707730234576020232 00000000000000#include QvString::~QvString() { if (string != staticStorage) delete [] string; } void QvString::expand(int bySize) { int newSize = strlen(string) + bySize + 1; if (newSize >= QV_STRING_STATIC_STORAGE_SIZE && (string == staticStorage || newSize > storageSize)) { char *newString = new char[newSize]; strcpy(newString, string); if (string != staticStorage) delete [] string; string = newString; storageSize = newSize; } } u_long QvString::hash(const char *s) { u_long total, shift; total = shift = 0; while (*s) { total = total ^ ((*s) << shift); shift+=5; if (shift>24) shift -= 24; s++; } return( total ); } void QvString::makeEmpty(QvBool freeOld) { if (string != staticStorage) { if (freeOld) delete [] string; string = staticStorage; } string[0] = '\0'; } QvString & QvString::operator =(const char *str) { int size = strlen(str) + 1; if (str >= string && str < string + (string != staticStorage ? storageSize : QV_STRING_STATIC_STORAGE_SIZE)) { QvString tmp = str; *this = tmp; return *this; } if (size < QV_STRING_STATIC_STORAGE_SIZE) { if (string != staticStorage) makeEmpty(); } else if (string == staticStorage) string = new char[size]; else if (size > storageSize) { delete [] string; string = new char[size]; } strcpy(string, str); storageSize = size; return *this; } QvString & QvString::operator +=(const char *str) { expand(strlen(str)); strcat(string, str); return *this; } int operator ==(const QvString &str, const char *s) { return (str.string[0] == s[0] && ! strcmp(str.string, s)); } int operator !=(const QvString &str, const char *s) { return (str.string[0] != s[0] || strcmp(str.string, s)); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvInfo.c++0000644000175000001440000000033107730234473017643 00000000000000#include QV_NODE_SOURCE(QvInfo); QvInfo::QvInfo() { QV_NODE_CONSTRUCTOR(QvInfo); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(string); string.value = ""; } QvInfo::~QvInfo() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFVec2f.h0000644000175000001440000000212210455700775020026 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_VEC2F_ #define _QV_SF_VEC2F_ #include class QvSFVec2f : public QvSField { public: float value[2]; QV_SFIELD_HEADER(QvSFVec2f); }; #endif /* _QV_SF_VEC2F_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFVec3f.h0000644000175000001440000000212210455700775020027 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_VEC3F_ #define _QV_SF_VEC3F_ #include class QvSFVec3f : public QvSField { public: float value[3]; QV_SFIELD_HEADER(QvSFVec3f); }; #endif /* _QV_SF_VEC3F_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMFColor.c++0000644000175000001440000000041307730234557020255 00000000000000#include QV_MFIELD_SOURCE(QvMFColor, float, 3, FALSE); QvBool QvMFColor::read1Value(QvInput *in, int index) { float *valuePtr = values + index * 3; return (in->read(valuePtr[0]) && in->read(valuePtr[1]) && in->read(valuePtr[2])); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvElement.c++0000644000175000001440000000123407730234447020345 00000000000000#include const char *QvElement::nodeTypeNames[NumNodeTypes] = { "Unknown", "OrthographicCamera", "PerspectiveCamera", "DirectionalLight", "PointLight", "SpotLight", "NoOpTransform", "MatrixTransform", "Rotation", "Scale", "Transform", "Translation", }; QvElement::QvElement() { // These will be set to something real when the element is // added to the state depth = -1; next = NULL; // Presumably, the caller will set these data = NULL; type = Unknown; } QvElement::~QvElement() { } void QvElement::print() { printf("\t\tElement of type %s\n", nodeTypeNames[type]); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMaterial.c++0000644000175000001440000000141507730234412020503 00000000000000#include QV_NODE_SOURCE(QvMaterial); QvMaterial::QvMaterial() { QV_NODE_CONSTRUCTOR(QvMaterial); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(ambientColor); QV_NODE_ADD_FIELD(diffuseColor); QV_NODE_ADD_FIELD(specularColor); QV_NODE_ADD_FIELD(emissiveColor); QV_NODE_ADD_FIELD(shininess); QV_NODE_ADD_FIELD(transparency); ambientColor.values[0]=ambientColor.values[1]=ambientColor.values[2] = 0.2; diffuseColor.values[0]=diffuseColor.values[1]=diffuseColor.values[2] = 0.2; specularColor.values[0]=specularColor.values[1]=specularColor.values[2]=0.; emissiveColor.values[0]=emissiveColor.values[1]=emissiveColor.values[2]=0.; shininess.values[0] = 0.2; transparency.values[0] = 0.0; } QvMaterial::~QvMaterial() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSeparator.c++0000644000175000001440000000071307730234562020713 00000000000000#include QV_NODE_SOURCE(QvSeparator); QvSeparator::QvSeparator() { QV_NODE_CONSTRUCTOR(QvSeparator); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(renderCulling); renderCulling.value = AUTO; QV_NODE_DEFINE_ENUM_VALUE(CullEnabled, ON); QV_NODE_DEFINE_ENUM_VALUE(CullEnabled, OFF); QV_NODE_DEFINE_ENUM_VALUE(CullEnabled, AUTO); QV_NODE_SET_SF_ENUM_TYPE(renderCulling, CullEnabled); } QvSeparator::~QvSeparator() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvDirectionalLight.h0000644000175000001440000000263010455700775022061 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_DIRECTIONAL_LIGHT_ #define _QV_DIRECTIONAL_LIGHT_ #include #include #include #include #include class QvDirectionalLight : public QvNode { QV_NODE_HEADER(QvDirectionalLight); public: // Fields QvSFBool on; // Whether light is on QvSFFloat intensity; // Source intensity (0 to 1) QvSFColor color; // RGB source color QvSFVec3f direction; // Illumination direction vector }; #endif /* _QV_DIRECTIONAL_LIGHT_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvCylinder.h0000644000175000001440000000273310455700775020411 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_CYLINDER_ #define _QV_CYLINDER_ #include #include #include class QvCylinder : public QvNode { QV_NODE_HEADER(QvCylinder); public: enum Part { // Cylinder parts SIDES = 0x01, // The tubular part TOP = 0x02, // The top circular face BOTTOM = 0x04, // The bottom circular face ALL = 0x07 // All parts }; // Fields QvSFBitMask parts; // Visible parts of cylinder QvSFFloat radius; // Radius in x and z dimensions QvSFFloat height; // Size in y dimension }; #endif /* _QV_CYLINDER_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvCoordinate3.c++0000644000175000001440000000044107730234426021122 00000000000000#include QV_NODE_SOURCE(QvCoordinate3); QvCoordinate3::QvCoordinate3() { QV_NODE_CONSTRUCTOR(QvCoordinate3); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(point); point.values[0] = point.values[1] = point.values[2] = 0.0; } QvCoordinate3::~QvCoordinate3() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvNode.c++0000644000175000001440000002041107730234601017627 00000000000000#include #include #include #include #include #include #include #include #include // The global name dictionary QvDict *QvNode::nameDict = NULL; // Syntax for writing instances to files #define OPEN_BRACE '{' #define CLOSE_BRACE '}' #define DEFINITION_KEYWORD "DEF" #define REFERENCE_KEYWORD "USE" #define NULL_KEYWORD "NULL" void QvNode::init() { if (nameDict == NULL) nameDict = new QvDict; } QvNode::QvNode() { refCount = 0; objName = new QvName(""); } QvNode::~QvNode() { if (! !(*objName)) removeName(this, objName->getString()); delete objName; } void QvNode::ref() const { ((QvNode *) this)->refCount++; } void QvNode::unref() const { if (--((QvNode *) this)->refCount == 0) delete (QvNode *) this; } void QvNode::unrefNoDelete() const { ((QvNode *) this)->refCount--; } const QvName & QvNode::getName() const { return *objName; } void QvNode::setName(const QvName &newName) { if (! !(*objName)) { removeName(this, objName->getString()); } delete objName; const char *str = newName.getString(); QvBool isBad = 0; if (newName.getLength() > 0 && !QvName::isNodeNameStartChar(str[0])) isBad = TRUE; int i; for (i = 1; i < newName.getLength() && !isBad; i++) { isBad = !QvName::isNodeNameChar(str[i]); } if (isBad) { QvString goodString; if (!QvName::isNodeNameStartChar(str[0])) { goodString += "_"; } for (i = 0; i < newName.getLength(); i++) { char temp[2]; temp[0] = str[i]; temp[1] = '\0'; if (!QvName::isNodeNameChar(str[i])) goodString += "_"; else goodString += temp; } #ifdef DEBUG QvDebugError::post("QvNode::setName", "Bad characters in" " name '%s'. Replacing with name '%s'", str, goodString.getString()); #endif objName = new QvName(goodString); } else { objName = new QvName(newName); } if (! !(*objName)) { addName(this, objName->getString()); } } void QvNode::addName(QvNode *b, const char *name) { QvPList *list; void *t; if (!nameDict->find((u_long)name, t)) { list = new QvPList; nameDict->enter((u_long)name, list); } else { list = (QvPList *)t; } list->append(b); } void QvNode::removeName(QvNode *b, const char *name) { QvPList *list; QvBool found; void *t; int i; found = nameDict->find((u_long) name, t); if (found) { list = (QvPList *) t; i = list->find(b); if (i < 0) found = FALSE; else list->remove(i); } if (! found) QvDebugError::post("QvNode::removeName", "Name \"%s\" (node %x) is not in dictionary", name, b); } QvBool QvNode::read(QvInput *in, QvNode *&node) { QvBool ret; QvName name; if (! in->read(name, TRUE)) { node = NULL; ret = in->headerOk; } else if (! name || name == NULL_KEYWORD) { node = NULL; ret = TRUE; } else if (name == REFERENCE_KEYWORD) { node = readReference(in); ret = (node != NULL); } else ret = readNode(in, name, node); return ret; } QvBool QvNode::readInstance(QvInput *in) { QvName typeString; QvFieldData *fieldData = getFieldData(); if (in->read(typeString, TRUE)) { if (typeString == "fields") { if (! fieldData->readFieldTypes(in, this)) { QvReadError::post(in, "Bad field specifications for node"); return FALSE; } } else in->putBack(typeString.getString()); } if (! fieldData->read(in, this)) return FALSE; return TRUE; } QvNode * QvNode::readReference(QvInput *in) { QvName refName; QvNode *node; if (! in->read(refName, FALSE)) { QvReadError::post(in, "Premature end of file after " REFERENCE_KEYWORD); node = NULL; } else if ((node = in->findReference(refName)) == NULL) QvReadError::post(in, "Unknown reference \"%s\"", refName.getString()); return node; } QvBool QvNode::readNode(QvInput *in, QvName &className, QvNode *&node) { QvBool gotChar; QvName refName; char c; QvBool ret = TRUE, flush = FALSE; node = NULL; if (className == DEFINITION_KEYWORD) { if (! in->read(refName, FALSE) || ! in->read(className, TRUE)) { QvReadError::post(in, "Premature end of file after " DEFINITION_KEYWORD); ret = FALSE; } if (! refName) { QvReadError::post(in, "No name given after ", DEFINITION_KEYWORD); ret = FALSE; } if (! className) { QvReadError::post(in, "Invalid definition of %s", refName.getString()); ret = FALSE; } } if (ret) { if (! (gotChar = in->read(c)) || c != OPEN_BRACE) { if (gotChar) QvReadError::post(in, "Expected '%c'; got '%c'", OPEN_BRACE, c); else QvReadError::post(in, "Expected '%c'; got EOF", OPEN_BRACE); ret = FALSE; } else { ret = readNodeInstance(in, className, refName, node); if (! ret) flush = TRUE; else if (! (gotChar = in->read(c)) || c != CLOSE_BRACE) { if (gotChar) QvReadError::post(in, "Expected '%c'; got '%c'", CLOSE_BRACE, c); else QvReadError::post(in, "Expected '%c'; got EOF", CLOSE_BRACE); ret = FALSE; } } } if (! ret && flush) flushInput(in); return ret; } QvBool QvNode::readNodeInstance(QvInput *in, const QvName &className, const QvName &refName, QvNode *&node) { node = createInstance(in, className); if (node == NULL) return FALSE; if (! (! refName)) in->addReference(refName, node); return node->readInstance(in); } QvNode * QvNode::createInstance(QvInput *in, const QvName &className) { QvNode *instance; QvString unknownString; instance = createInstanceFromName(className); if (instance == NULL) { if (! in->read(unknownString) || unknownString != "fields") { QvReadError::post(in, "Unknown class \"%s\"", className.getString()); return NULL; } else if (unknownString == "fields") { QvUnknownNode *tmpNode = new QvUnknownNode; tmpNode->setClassName(className.getString()); instance = tmpNode; in->putBack(unknownString.getString()); } } return instance; } QvNode * QvNode::createInstanceFromName(const QvName &className) { #define TRY_CLASS(name, class) \ else if (className == name) \ inst = new class QvNode *inst = NULL; if (0) ; // So "else" works in first TRY_CLASS TRY_CLASS("AsciiText", QvAsciiText); TRY_CLASS("Cone", QvCone); TRY_CLASS("Coordinate3", QvCoordinate3); TRY_CLASS("Cube", QvCube); TRY_CLASS("Cylinder", QvCylinder); TRY_CLASS("DirectionalLight", QvDirectionalLight); TRY_CLASS("FontStyle", QvFontStyle); TRY_CLASS("Group", QvGroup); TRY_CLASS("IndexedFaceSet", QvIndexedFaceSet); TRY_CLASS("IndexedLineSet", QvIndexedLineSet); TRY_CLASS("Info", QvInfo); TRY_CLASS("LOD", QvLOD); TRY_CLASS("Material", QvMaterial); TRY_CLASS("MaterialBinding", QvMaterialBinding); TRY_CLASS("MatrixTransform", QvMatrixTransform); TRY_CLASS("Normal", QvNormal); TRY_CLASS("NormalBinding", QvNormalBinding); TRY_CLASS("OrthographicCamera", QvOrthographicCamera); TRY_CLASS("PerspectiveCamera", QvPerspectiveCamera); TRY_CLASS("PointLight", QvPointLight); TRY_CLASS("PointSet", QvPointSet); TRY_CLASS("Rotation", QvRotation); TRY_CLASS("Scale", QvScale); TRY_CLASS("Separator", QvSeparator); TRY_CLASS("ShapeHints", QvShapeHints); TRY_CLASS("Sphere", QvSphere); TRY_CLASS("SpotLight", QvSpotLight); TRY_CLASS("Switch", QvSwitch); TRY_CLASS("Texture2", QvTexture2); TRY_CLASS("Texture2Transform", QvTexture2Transform); TRY_CLASS("TextureCoordinate2", QvTextureCoordinate2); TRY_CLASS("Transform", QvTransform); TRY_CLASS("TransformSeparator", QvTransformSeparator); TRY_CLASS("Translation", QvTranslation); TRY_CLASS("WWWAnchor", QvWWWAnchor); TRY_CLASS("WWWInline", QvWWWInline); return inst; #undef TRY_CLASS } void QvNode::flushInput(QvInput *in) { int nestLevel = 1; char c; while (nestLevel > 0 && in->get(c)) { if (c == CLOSE_BRACE) nestLevel--; else if (c == OPEN_BRACE) nestLevel++; } } #undef OPEN_BRACE #undef CLOSE_BRACE #undef DEFINITION_KEYWORD #undef REFERENCE_KEYWORD #undef NULL_KEYWORD geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvLOD.c++0000644000175000001440000000045007730234551017365 00000000000000#include QV_NODE_SOURCE(QvLOD); QvLOD::QvLOD() { QV_NODE_CONSTRUCTOR(QvLOD); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(range); QV_NODE_ADD_FIELD(center); // No range values to start center.value[0] = center.value[1] = center.value[2] = 0.0; } QvLOD::~QvLOD() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFVec2f.c++0000644000175000001440000000023707730234550020147 00000000000000#include QV_SFIELD_SOURCE(QvSFVec2f); QvBool QvSFVec2f::readValue(QvInput *in) { return (in->read(value[0]) && in->read(value[1])); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFMatrix.h0000644000175000001440000000213210455700775020326 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_MATRIX_ #define _QV_SF_MATRIX_ #include class QvSFMatrix : public QvSField { public: float value[4][4]; QV_SFIELD_HEADER(QvSFMatrix); }; #endif /* _QV_SF_MATRIX_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSphere.c++0000644000175000001440000000033007730234566020200 00000000000000#include QV_NODE_SOURCE(QvSphere); QvSphere::QvSphere() { QV_NODE_CONSTRUCTOR(QvSphere); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(radius); radius.value = 1.0; } QvSphere::~QvSphere() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvNormalBinding.c++0000644000175000001440000000134507730234421021472 00000000000000#include QV_NODE_SOURCE(QvNormalBinding); QvNormalBinding::QvNormalBinding() { QV_NODE_CONSTRUCTOR(QvNormalBinding); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(value); value.value = DEFAULT; QV_NODE_DEFINE_ENUM_VALUE(Binding, DEFAULT); QV_NODE_DEFINE_ENUM_VALUE(Binding, OVERALL); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_PART); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_PART_INDEXED); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_FACE); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_FACE_INDEXED); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_VERTEX); QV_NODE_DEFINE_ENUM_VALUE(Binding, PER_VERTEX_INDEXED); QV_NODE_SET_SF_ENUM_TYPE(value, Binding); } QvNormalBinding::~QvNormalBinding() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvString.h0000644000175000001440000001045510455700776020107 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_STRING_ #define _QV_STRING_ #include #include class QvString { public: QvString() { string = staticStorage; string[0] = '\0'; } QvString(const char *str) { string = staticStorage; *this = str; } QvString(const QvString &str) { string = staticStorage; *this = str.string; } ~QvString(); u_long hash() { return QvString::hash(string); } int getLength() const { return strlen(string); } void makeEmpty(QvBool freeOld = TRUE); const char * getString() const { return string; } QvString & operator =(const char *str); QvString & operator =(const QvString &str) { return (*this = str.string); } QvString & operator +=(const char *str); int operator !() const { return (string[0] == '\0'); } friend int operator ==(const QvString &str, const char *s); friend inline int operator ==(const char *s, const QvString &str) { return (str == s); } friend inline int operator ==(const QvString &str1, const QvString &str2) { return (str1 == str2.string); } friend int operator !=(const QvString &str, const char *s); friend inline int operator !=(const char *s, const QvString &str) { return (str != s); } friend inline int operator !=(const QvString &str1, const QvString &str2) { return (str1 != str2.string); } static u_long hash(const char *s); private: char *string; int storageSize; #define QV_STRING_STATIC_STORAGE_SIZE 32 char staticStorage[QV_STRING_STATIC_STORAGE_SIZE]; void expand(int bySize); }; class QvNameEntry { public: QvBool isEmpty() const { return (string[0] == '\0'); } QvBool isEqual(const char *s) const { return (string[0] == s[0] && ! strcmp(string, s)); } private: static int nameTableSize; static QvNameEntry **nameTable; static struct QvNameChunk *chunk; const char *string; u_long hashValue; QvNameEntry *next; static void initClass(); QvNameEntry(const char *s, u_long h, QvNameEntry *n) { string = s; hashValue = h; next = n; } static const QvNameEntry * insert(const char *s); friend class QvName; }; class QvName { public: QvName(); QvName(const char *s) { entry = QvNameEntry::insert(s); } QvName(const QvString &s) { entry = QvNameEntry::insert(s.getString()); } QvName(const QvName &n) { entry = n.entry; } ~QvName() {} const char *getString() const { return entry->string; } int getLength() const { return strlen(entry->string); } static QvBool isIdentStartChar(char c); static QvBool isIdentChar(char c); static QvBool isNodeNameStartChar(char c); static QvBool isNodeNameChar(char c); int operator !() const { return entry->isEmpty(); } friend inline int operator ==(const QvName &n, const char *s) { return n.entry->isEqual(s); } friend inline int operator ==(const char *s, const QvName &n) { return n.entry->isEqual(s); } friend inline int operator ==(const QvName &n1, const QvName &n2) { return n1.entry == n2.entry; } friend inline int operator !=(const QvName &n, const char *s) { return ! n.entry->isEqual(s); } friend inline int operator !=(const char *s, const QvName &n) { return ! n.entry->isEqual(s); } friend inline int operator !=(const QvName &n1, const QvName &n2) { return n1.entry != n2.entry; } private: const QvNameEntry *entry; }; #endif /* _QV_STRING_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFVec3f.c++0000644000175000001440000000027207730234555020154 00000000000000#include QV_SFIELD_SOURCE(QvSFVec3f); QvBool QvSFVec3f::readValue(QvInput *in) { return (in->read(value[0]) && in->read(value[1]) && in->read(value[2])); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvAsciiText.c++0000644000175000001440000000120307730234416020641 00000000000000#include QV_NODE_SOURCE(QvAsciiText); QvAsciiText::QvAsciiText() { QV_NODE_CONSTRUCTOR(QvAsciiText); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(string); QV_NODE_ADD_FIELD(spacing); QV_NODE_ADD_FIELD(justification); QV_NODE_ADD_FIELD(width); string.values[0] = ""; spacing.value = 1.0; justification.value = LEFT; width.values[0] = 0; QV_NODE_DEFINE_ENUM_VALUE(Justification, LEFT); QV_NODE_DEFINE_ENUM_VALUE(Justification, CENTER); QV_NODE_DEFINE_ENUM_VALUE(Justification, RIGHT); QV_NODE_SET_SF_ENUM_TYPE(justification, Justification); } QvAsciiText::~QvAsciiText() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMaterialBinding.h0000644000175000001440000000245410455700775021671 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MATERIAL_BINDING_ #define _QV_MATERIAL_BINDING_ #include #include class QvMaterialBinding : public QvNode { QV_NODE_HEADER(QvMaterialBinding); public: enum Binding { DEFAULT, OVERALL, PER_PART, PER_PART_INDEXED, PER_FACE, PER_FACE_INDEXED, PER_VERTEX, PER_VERTEX_INDEXED }; // Fields: QvSFEnum value; }; #endif /* _QV_MATERIAL_BINDING_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvTextureCoordinate2.h0000644000175000001440000000231710455700776022371 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_TEXTURE_COORDINATE_2_ #define _QV_TEXTURE_COORDINATE_2_ #include #include class QvTextureCoordinate2 : public QvNode { QV_NODE_HEADER(QvTextureCoordinate2); public: // Fields QvMFVec2f point; // TextureCoordinate point(s) }; #endif /* _QV_TEXTURE_COORDINATE_2_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvInput.h0000644000175000001440000000521010455700775017730 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_INPUT_ #define _QV_INPUT_ #include #include class QvNode; class QvDB; class QvInput { public: QvInput(); ~QvInput(); static float isASCIIHeader(const char *string); void setFilePointer(FILE *newFP); FILE * getCurFile() const { return fp; } float getVersion(); QvBool get(char &c); QvBool read(char &c); QvBool read(QvString &s); QvBool read(QvName &n, QvBool validIdent = FALSE); QvBool read(int &i); QvBool read(unsigned int &i); QvBool read(short &s); QvBool read(unsigned short &s); QvBool read(long &l); QvBool read(unsigned long &l); QvBool read(float &f); QvBool read(double &d); QvBool eof() const; void getLocationString(QvString &string) const; void putBack(char c); void putBack(const char *string); void addReference(const QvName &name, QvNode *node); QvNode * findReference(const QvName &name) const; private: FILE *fp; // File pointer int lineNum; // Number of line currently reading float version; // Version number of file QvBool readHeader; // TRUE if header was checked for A/B QvBool headerOk; // TRUE if header was read ok QvDict refDict; // Node reference dictionary QvString backBuf; int backBufIndex; QvBool checkHeader(); QvBool skipWhiteSpace(); QvBool readInteger(long &l); QvBool readUnsignedInteger(unsigned long &l); QvBool readReal(double &d); QvBool readUnsignedIntegerString(char *str); int readDigits(char *string); int readHexDigits(char *string); int readChar(char *string, char charToRead); friend class QvNode; friend class QvDB; }; #endif /* _QV_INPUT_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvNormal.c++0000644000175000001440000000042407730234417020201 00000000000000#include QV_NODE_SOURCE(QvNormal); QvNormal::QvNormal() { QV_NODE_CONSTRUCTOR(QvNormal); isBuiltIn = TRUE; QV_NODE_ADD_FIELD(vector); vector.values[0] = 0.0; vector.values[1] = 0.0; vector.values[2] = 1.0; } QvNormal::~QvNormal() { } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvElement.h0000644000175000001440000000440510455700775020227 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_ELEMENT_ #define _QV_ELEMENT_ #include class QvNode; ////////////////////////////////////////////////////////////////////////////// // // The base class element; the data is a pointer to some QvNode. The // type of the node can be inferred from the use of the element // instance in a particular stack in the state. In some cases, the // "type" field is used to distinguish among various possible node // types within a single stack. // ////////////////////////////////////////////////////////////////////////////// class QvElement { public: enum NodeType { // Fallback case Unknown, // Types of cameras in camera stack OrthographicCamera, PerspectiveCamera, // Types of lights in light stack DirectionalLight, PointLight, SpotLight, // Types of transformations in transformation stack NoOpTransform, // For QvTransformSeparator MatrixTransform, Rotation, Scale, Transform, Translation, // This has to be last!!! NumNodeTypes }; static const char *nodeTypeNames[NumNodeTypes]; // Names of node types int depth; // Depth of element in state QvElement *next; // Next element in stack QvNode *data; // Pointer to node containing data NodeType type; // Type of data node QvElement(); virtual ~QvElement(); // Prints contents for debugging, mostly virtual void print(); }; #endif /* _QV_ELEMENT_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvToWebOOGL.c++0000644000175000001440000011606707730234615020465 00000000000000#include #include #include #include #include #include #include #include extern "C" { #include } ////////////////////////////////////////////////////////////////////////////// // // ToWebOOGL will traverse and convert any vrml object to WebOOGL! // Because ToWebOOGL() is defined in the header for ALL node // classes, each one has an implementation here. // ////////////////////////////////////////////////////////////////////////////// // For debugging static int indent = 0; static int oogldepth = 0, unique = 0, mypid = 0; static char out[5000]; static char colstr[100]; enum Binding { DEFAULT, OVERALL, PER_PART, PER_PART_INDEXED, PER_FACE, PER_FACE_INDEXED, PER_VERTEX, PER_VERTEX_INDEXED, }; static void OOGLannounce(const char *className) { /* for (int i = 0; i < indent; i++) fprintf(stderr,"\t"); fprintf(stderr,"Converting a %s to WebOOGL - depth: %d\n", className, oogldepth); */ } #define ANNOUNCE(className) OOGLannounce(QV__QUOTE(className)) static FILE *OOGLfout = (FILE *)NULL; static char *OOGLhand = NULL; static char *urls[100]; int OOGLnumuniq() { return unique; } char * OOGLgeturls(int i) { return urls[i]; } int OOGLhandle(char *handle) { OOGLhand = handle; return 1; } int OOGLfile(FILE *fout) { OOGLfout = fout; mypid = (int) getpid(); return 1; } static void OOGLout(const char *text) { if (OOGLfout == NULL) return; for (int i = 1; i < indent; i++) fprintf(OOGLfout, " "); fprintf(OOGLfout, "%s\n", text); } static void OOGLflush() { if(OOGLfout != NULL) fflush(OOGLfout); } static void OOGLoutindent() { if (OOGLfout == NULL) return; for (int i = 1; i < indent; i++) fprintf(OOGLfout, " "); } static void OOGLoutraw(const char *text) { if (OOGLfout == NULL) return; fprintf(OOGLfout, "%s", text); } static void OOGLgetcolor(QvMaterial *mt, QvMaterialBinding *mtb, int mtnum) { // float *amb; float *em, *dif; float a; if (mt == NULL || mtnum < 0) { sprintf(colstr, "1 1 1 1"); return; } a = 1 - (mt->transparency).values[mtnum % (mt->transparency).num]; em = &mt->emissiveColor.values[3 * (mtnum % mt->emissiveColor.num)]; dif = &mt->diffuseColor.values[3 * (mtnum % mt->diffuseColor.num)]; if (em[0] != 0.0 || em[1] != 0.0 || em[2] != 0.0) { // Funky calculations to simulate emissive color float r, g, b, ln; r = em[0]; g = em[1]; b = em[2]; ln = (3.0 - sqrt(r*r + g*g + b*b)) / 6.0; r += (1.0 - r)*ln; g += (1.0 - g)*ln; b += (1.0 - b)*ln; sprintf(colstr, "%.3f %.3f %.3f %.3f", r, g, b, a); } else sprintf(colstr, "%.3f %.3f %.3f %.3f", dif[0], dif[1], dif[2], a); } static void OOGLappearance(QvMaterial *mt) { if (mt == NULL) return; OOGLout("appearance { material {"); sprintf(out, "ambient %f %f %f", (mt->ambientColor).values[0], (mt->ambientColor).values[1], (mt->ambientColor).values[2]); OOGLout(out); float r, g, b, ln; if (!((mt->emissiveColor).values[0]==0.0 && (mt->emissiveColor).values[1]==0.0 && (mt->emissiveColor).values[2]==0.0)) { // Funky calculations to simulate emissive color r = (mt->emissiveColor).values[0]; g = (mt->emissiveColor).values[1]; b = (mt->emissiveColor).values[2]; ln = (3.0 - sqrt(r*r + g*g + b*b)) / 6.0; r += (1.0 - r)*ln; g += (1.0 - g)*ln; b += (1.0 - b)*ln; } else { r = mt->diffuseColor.values[0]; g = mt->diffuseColor.values[1]; b = mt->diffuseColor.values[2]; } sprintf(out, "diffuse %.3f %.3f %.3f edgecolor %.3f %.3f %.3f", r, g, b, r, g, b); OOGLout(out); sprintf(out, "specular %.3f %.3f %.3f", (mt->specularColor).values[0], (mt->specularColor).values[1], (mt->specularColor).values[2]); OOGLout(out); sprintf(out, "shininess %.3f", (mt->shininess).values[0]); OOGLout(out); sprintf(out, "alpha %.3f", 1.0 - (mt->transparency).values[0]); OOGLout(out); // Doesn't work with Geomview right now // sprintf(out, "emission %f %f %f", (mt->emissiveColor).values[0], // (mt->emissiveColor).values[1], (mt->emissiveColor).values[2]); OOGLout(out); OOGLout("}}"); } #define DEFAULT_TRAVERSE(className) \ void \ className::ToWebOOGL(QvState *) \ { \ ANNOUNCE(className); \ } ////////////////////////////////////////////////////////////////////////////// // // Groups. // ////////////////////////////////////////////////////////////////////////////// void QvGroup::ToWebOOGL(QvState *state) { int savedepth, i; ANNOUNCE(QvGroup); OOGLout("{ = LIST"); OOGLout("# Group"); savedepth = oogldepth; indent++; for (i = 0; i < getNumChildren(); i++) getChild(i)->ToWebOOGL(state); indent--; savedepth = oogldepth - savedepth; /* How deep did we get ? :-)*/ for (i = 0; i < savedepth; i++) { /* Do the equivalent OOGL pop */ out[i*2] = '}'; /* pop the LIST */ out[i*2+1] = '}'; /* pop the INST */ } out[savedepth*2] = '\0'; OOGLout(out); OOGLout("} # End Group"); oogldepth = oogldepth - savedepth; } void QvLOD::ToWebOOGL(QvState *state) { int savedepth, i; ANNOUNCE(QvLOD); savedepth = oogldepth; indent++; // ??? In a real implementation, this would choose a child based // ??? on the projected screen areas. // WebOOGL punts on this one if (getNumChildren() > 0) getChild(0)->ToWebOOGL(state); indent--; savedepth = oogldepth - savedepth; /* How deep did we get ? :-) */ for (i = 0; i < savedepth; i++) { /* Do the equivalent OOGL pop */ out[i*2] = '}'; /* pop the LIST */ out[i*2+1] = '}'; /* pop the INST */ } out[savedepth*2] = '\0'; OOGLout(out); oogldepth = oogldepth - savedepth; } void QvSeparator::ToWebOOGL(QvState *state) { int savedepth, i; ANNOUNCE(QvSeparator); OOGLout("{ = LIST # Separator"); savedepth = oogldepth; state->push(); indent++; for (i = 0; i < getNumChildren(); i++) getChild(i)->ToWebOOGL(state); indent--; state->pop(); savedepth = oogldepth - savedepth; /* How deep did we get ? :-)*/ for (i = 0; i < savedepth; i++) { /* Do the equivalent OOGL pop */ out[i*2] = '}'; /* pop the LIST */ out[i*2+1] = '}'; /* pop the INST */ } out[savedepth*2] = '\0'; OOGLout(out); OOGLout("} # End Separator"); oogldepth = oogldepth - savedepth; } void QvSwitch::ToWebOOGL(QvState *state) { int savedepth, i; ANNOUNCE(QvSwitch); indent++; int which = (int) whichChild.value; savedepth = oogldepth; if (which == QV_SWITCH_NONE) ; else if (which == QV_SWITCH_ALL) for (i = 0; i < getNumChildren(); i++) getChild(i)->ToWebOOGL(state); else if (which < getNumChildren()) getChild(which)->ToWebOOGL(state); indent--; savedepth = oogldepth - savedepth; /* How deep did we get ? :-)*/ for (i = 0; i < savedepth; i++) { /* Do the equivalent OOGL pop */ out[i*2] = '}'; /* pop the LIST */ out[i*2+1] = '}'; /* pop the INST */ } out[savedepth*2] = '\0'; OOGLout(out); oogldepth = oogldepth - savedepth; } void QvTransformSeparator::ToWebOOGL(QvState *state) { int savedepth, i; ANNOUNCE(QvTransformSeparator); // We need to "push" just the transformation stack. We'll // accomplish this by just pushing a no-op transformation onto // that stack. When we "pop", we'll restore that stack to its // previous state. QvElement *markerElt = new QvElement; markerElt->data = this; markerElt->type = QvElement::NoOpTransform; state->addElement(QvState::TransformationIndex, markerElt); savedepth = oogldepth; indent++; for (i = 0; i < getNumChildren(); i++) getChild(i)->ToWebOOGL(state); indent--; // Now do the "pop" while (state->getTopElement(QvState::TransformationIndex) != markerElt) state->popElement(QvState::TransformationIndex); savedepth = oogldepth - savedepth; /* How deep did we get ? :-)*/ for (i = 0; i < savedepth; i++) { /* Do the equivalent OOGL pop */ out[i*2] = '}'; /* pop the LIST */ out[i*2+1] = '}'; /* pop the INST */ } out[savedepth*2] = '\0'; OOGLout(out); oogldepth = oogldepth - savedepth; } ////////////////////////////////////////////////////////////////////////////// // // Properties. // ////////////////////////////////////////////////////////////////////////////// void QvMaterial::ToWebOOGL(QvState *state) { oogldepth++; ANNOUNCE(QvMaterial); QvElement *elt = new QvElement; elt->data = this; state->addElement(QvState::MaterialIndex, elt); OOGLout("{ = INST"); OOGLout("geom {"); OOGLappearance(this); OOGLout("= LIST"); } #define DO_PROPERTY(className, stackIndex) \ void \ className::ToWebOOGL(QvState *state) \ { \ ANNOUNCE(className); \ QvElement *elt = new QvElement; \ elt->data = this; \ state->addElement(QvState::stackIndex, elt); \ } DO_PROPERTY(QvCoordinate3, Coordinate3Index) DO_PROPERTY(QvMaterialBinding, MaterialBindingIndex) DO_PROPERTY(QvNormal, NormalIndex) DO_PROPERTY(QvNormalBinding, NormalBindingIndex) DO_PROPERTY(QvShapeHints, ShapeHintsIndex) DO_PROPERTY(QvFontStyle, FontStyleIndex) // WebOOGL punts on these ... (no support for texture mapping) DO_PROPERTY(QvTextureCoordinate2, TextureCoordinate2Index) DO_PROPERTY(QvTexture2, Texture2Index) DO_PROPERTY(QvTexture2Transform, Texture2TransformationIndex) #define DO_TYPED_PROPERTY(className, stackIndex, eltType) \ void \ className::ToWebOOGL(QvState *state) \ { \ ANNOUNCE(className); \ QvElement *elt = new QvElement; \ elt->data = this; \ elt->type = QvElement::eltType; \ state->addElement(QvState::stackIndex, elt); \ } void QvMatrixTransform::ToWebOOGL(QvState *state) { oogldepth++; ANNOUNCE(QvMatrixTransform); QvElement *elt = new QvElement; elt->data = this; elt->type = QvElement::MatrixTransform; state->addElement(QvState::TransformationIndex, elt); OOGLout("{ = INST"); OOGLout("transform {"); sprintf(out, "%f %f %f %f", matrix.value[0][0], matrix.value[0][1], matrix.value[0][2], matrix.value[0][3]); OOGLout(out); sprintf(out, "%f %f %f %f", matrix.value[1][0], matrix.value[1][1], matrix.value[1][2], matrix.value[1][3]); OOGLout(out); sprintf(out, "%f %f %f %f", matrix.value[2][0], matrix.value[2][1], matrix.value[2][2], matrix.value[2][3]); OOGLout(out); sprintf(out, "%f %f %f %f", matrix.value[3][0], matrix.value[3][1], matrix.value[3][2], matrix.value[3][3]); OOGLout(out); OOGLout("} geom"); OOGLout("{ = LIST"); } static void OOGLoutmat(QvSFMatrix *mat1) { int y; for (y = 0; y < 4; y++) { sprintf(out, "%f %f %f %f", mat1->value[0][y], mat1->value[1][y], mat1->value[2][y], mat1->value[3][y]); OOGLout(out); } } static void OOGLmat_init(QvSFMatrix *mat1) { int x, y; for (x = 0; x < 4; x++) for (y = 0; y < 4; y++) { if (x == y) mat1->value[x][y] = 1.0; else mat1->value[x][y] = 0.0; } } static void OOGLmat_mult(QvSFMatrix *mat1, QvSFMatrix *mat2, QvSFMatrix *result) { int x,y; for (y = 0; y < 4; y++) { for (x = 0; x < 4; x++) { result->value[x][y] = mat1->value[0][y] * mat2->value[x][0] + mat1->value[1][y] * mat2->value[x][1] + mat1->value[2][y] * mat2->value[x][2] + mat1->value[3][y] * mat2->value[x][3]; } } } static void OOGLmat_scale(QvSFMatrix *mat1, float xt, float yt, float zt) { int x, y; for (x = 0; x < 4; x++) for (y = 0; y < 4; y++) { if (x == y) mat1->value[x][y] = 1.0; else mat1->value[x][y] = 0.0; } mat1->value[0][0] = xt; mat1->value[1][1] = yt; mat1->value[2][2] = zt; } static void OOGLmat_trans(QvSFMatrix *mat1, float xt, float yt, float zt) { int x, y; for (x = 0; x < 4; x++) for (y = 0; y < 4; y++) { if (x == y) mat1->value[x][y] = 1.0; else mat1->value[x][y] = 0.0; } mat1->value[0][3] = xt; mat1->value[1][3] = yt; mat1->value[2][3] = zt; } static void OOGLmat_rot(QvSFMatrix *mat1, float angle, float *rotaxis) { float csA, snA, vsA, s; float axis[3]; OOGLmat_init(mat1); s = rotaxis[0]*rotaxis[0] + rotaxis[1]*rotaxis[1] + rotaxis[2]*rotaxis[2]; if(s == 0. || angle == 0.) return; s = 1/sqrt(s); axis[0] = rotaxis[0]*s; axis[1] = rotaxis[1]*s; axis[2] = rotaxis[2]*s; csA = cos(angle); snA = -sin(angle); vsA = 1 - csA; mat1->value[0][0] = axis[0]*axis[0]*vsA + csA; mat1->value[1][0] = axis[0]*axis[1]*vsA - axis[2]*snA; mat1->value[2][0] = axis[0]*axis[2]*vsA + axis[1]*snA; mat1->value[0][1] = axis[1]*axis[0]*vsA + axis[2]*snA; mat1->value[1][1] = axis[1]*axis[1]*vsA + csA; mat1->value[2][1] = axis[1]*axis[2]*vsA - axis[0]*snA; mat1->value[0][2] = axis[2]*axis[0]*vsA - axis[1]*snA; mat1->value[1][2] = axis[2]*axis[1]*vsA + axis[0]*snA; mat1->value[2][2] = axis[2]*axis[2]*vsA + csA; } void QvTransform::ToWebOOGL(QvState *state) // NOT RIGHT YET { QvSFMatrix mat1, mat2, mat3; OOGLmat_init(&mat1); OOGLmat_init(&mat2); OOGLmat_init(&mat3); OOGLmat_trans(&mat2, -center.value[0], -center.value[1], -center.value[2]); OOGLmat_mult(&mat1, &mat2, &mat3); OOGLmat_rot(&mat2, scaleOrientation.angle, scaleOrientation.axis); OOGLmat_mult(&mat3, &mat2, &mat1); OOGLmat_scale(&mat2, scaleFactor.value[0], scaleFactor.value[1], scaleFactor.value[2]); OOGLmat_mult(&mat1, &mat2, &mat3); OOGLmat_rot(&mat2, -scaleOrientation.angle, scaleOrientation.axis); OOGLmat_mult(&mat3, &mat2, &mat1); OOGLmat_rot(&mat2, rotation.angle, rotation.axis); OOGLmat_mult(&mat1, &mat2, &mat3); OOGLmat_trans(&mat2, center.value[0], center.value[1], center.value[2]); OOGLmat_mult(&mat3, &mat2, &mat1); OOGLmat_trans(&mat2, translation.value[0], translation.value[1], translation.value[2]); OOGLmat_mult(&mat1, &mat2, &mat3); oogldepth++; ANNOUNCE(QvTransform); QvElement *elt = new QvElement; elt->data = this; elt->type = QvElement::Transform; state->addElement(QvState::TransformationIndex, elt); OOGLout("{ = INST"); OOGLout("transform {\t# VRML Transform"); OOGLoutmat(&mat3); OOGLout("} geom"); OOGLout("{ = LIST"); } void QvRotation::ToWebOOGL(QvState *state) { QvElement *elt = new QvElement; QvSFMatrix mat1; oogldepth++; ANNOUNCE(QvRotation); OOGLmat_init(&mat1); OOGLmat_rot(&mat1, rotation.angle, rotation.axis); elt->data = this; elt->type = QvElement::Rotation; state->addElement(QvState::TransformationIndex, elt); OOGLout("{ = INST"); OOGLout("transform {"); OOGLoutmat(&mat1); OOGLout("} geom"); OOGLout("{ = LIST"); } void QvTranslation::ToWebOOGL(QvState *state) { QvSFMatrix mat1; oogldepth++; ANNOUNCE(QvTranslation); QvElement *elt = new QvElement; elt->data = this; elt->type = QvElement::Translation; state->addElement(QvState::TransformationIndex, elt); OOGLmat_trans(&mat1, translation.value[0], translation.value[1], translation.value[2]); OOGLout("{ = INST"); OOGLout("transform {"); OOGLoutmat(&mat1); OOGLout("} geom"); OOGLout("{ = LIST"); } void QvScale::ToWebOOGL(QvState *state) { oogldepth++; ANNOUNCE(QvScale); QvElement *elt = new QvElement; elt->data = this; elt->type = QvElement::Scale; state->addElement(QvState::TransformationIndex, elt); OOGLout("{ = INST"); OOGLout("transform {"); sprintf(out, "%f 0 0 0", scaleFactor.value[0]); OOGLout(out); sprintf(out, "0 %f 0 0", scaleFactor.value[1]); OOGLout(out); sprintf(out, "0 0 %f 0", scaleFactor.value[2]); OOGLout(out); OOGLout("0 0 0 1"); OOGLout("} geom"); OOGLout("{ = LIST"); } DO_TYPED_PROPERTY(QvDirectionalLight, LightIndex, DirectionalLight) DO_TYPED_PROPERTY(QvPointLight, LightIndex, PointLight) DO_TYPED_PROPERTY(QvSpotLight, LightIndex, SpotLight) DO_TYPED_PROPERTY(QvOrthographicCamera, CameraIndex, OrthographicCamera) DO_TYPED_PROPERTY(QvPerspectiveCamera, CameraIndex, PerspectiveCamera) ////////////////////////////////////////////////////////////////////////////// // // Shapes. // ////////////////////////////////////////////////////////////////////////////// static void OOGLprintProperties(QvState *state) { // printf("--------------------------------------------------------------\n"); // state->print(); // printf("--------------------------------------------------------------\n"); } void QvCone::ToWebOOGL(QvState *state) { ANNOUNCE(QvCone); OOGLout("# VRML Cone"); OOGLout("{ = BEZ224"); if (parts.value == ALL || parts.value == SIDES) { sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1", height.value/2.0, height.value/2.0); OOGLout(out); sprintf(out, "%f 0 0 1\t0 0 %f 0\t%f 0 0 1", -bottomRadius.value/2.0, bottomRadius.value/2.0, bottomRadius.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1\n", -bottomRadius.value, -height.value/2.0, bottomRadius.value, bottomRadius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -bottomRadius.value, -height.value/2.0, -bottomRadius.value, bottomRadius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f 0 0 1\t0 0 %f 0\t%f 0 0 1", -bottomRadius.value/2.0, -bottomRadius.value/2.0, bottomRadius.value/2.0); OOGLout(out); sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1\n", height.value/2.0, height.value/2.0); OOGLout(out); } if (parts.value == ALL || parts.value == BOTTOM) { sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1", -height.value/2.0, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -bottomRadius.value/2.0, -height.value/2.0, bottomRadius.value/2.0, bottomRadius.value/2.0, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1\n", -bottomRadius.value, -height.value/2.0, bottomRadius.value, bottomRadius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -bottomRadius.value, -height.value/2.0, -bottomRadius.value, bottomRadius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -bottomRadius.value/2.0, -height.value/2.0, -bottomRadius.value/2.0, bottomRadius.value/2.0, -height.value/2.0); OOGLout(out); sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1\n", -height.value/2.0, -height.value/2.0); OOGLout(out); } OOGLout("}"); } void QvCube::ToWebOOGL(QvState *state) { float x = width.value / 2.0, y = height.value / 2.0, z = depth.value / 2.0; int i; ANNOUNCE(QvCube); OOGLout("# VRML Cube"); OOGLout("{ = OFF"); OOGLout("8 6 12"); for(i = 0; i < 8; i++) { sprintf(out, "%g %g %g", i&1 ? -x : x, i&2 ? -y : y, i&4 ? -z : z); OOGLout(out); } OOGLout("4 3 2 1 0"); OOGLout("4 4 5 6 7"); OOGLout("4 2 3 7 6"); OOGLout("4 0 1 5 4"); OOGLout("4 0 4 7 3"); OOGLout("4 1 2 6 5"); OOGLout("}"); } void QvCylinder::ToWebOOGL(QvState *state) { QvElement *elt = NULL; QvMaterial *qv_material = NULL; QvMaterialBinding *qv_materialb = NULL; Binding mb_val; elt = state->getTopElement(QvState::MaterialIndex); if (elt) { qv_material = (QvMaterial *)elt->data;} elt = state->getTopElement(QvState::MaterialBindingIndex); if (elt) { qv_materialb = (QvMaterialBinding *)elt->data; } if (qv_materialb) { mb_val = (Binding) qv_materialb->value.value; } else { mb_val = DEFAULT; } ANNOUNCE(QvCylinder); OOGLout("# VRML Cylinder"); OOGLout("{"); if (mb_val != PER_PART && mb_val != PER_PART_INDEXED) { OOGLappearance(qv_material); OOGLout("= BEZ224"); } else { OOGLout("= CBEZ224"); } colstr[0] = '\0'; if (parts.value == ALL || parts.value == SIDES) { sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value, height.value/2.0, radius.value, radius.value, height.value/2.0); OOGLout(out); sprintf(out, "%f 0 0 1\t0 0 %f 0\t%f 0 0 1", -radius.value, radius.value, radius.value); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1\n", -radius.value, -height.value/2.0, radius.value, radius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value, -height.value/2.0, -radius.value, radius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f 0 0 1\t0 0 %f 0\t%f 0 0 1", -radius.value, -radius.value, radius.value); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value, height.value/2.0, -radius.value, radius.value, height.value/2.0); OOGLout(out); if (mb_val == PER_PART || mb_val == PER_PART_INDEXED) { OOGLgetcolor(qv_material, qv_materialb, 0); sprintf(out, "%s %s %s %s\n", colstr, colstr, colstr, colstr); OOGLout(out); } } if (parts.value == TOP || parts.value == ALL) { sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1", height.value/2.0, height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value/2.0, height.value/2.0, radius.value/2.0, radius.value/2.0, height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1\n", -radius.value, height.value/2.0, radius.value, radius.value, height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value, height.value/2.0, -radius.value, radius.value, height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value/2.0, height.value/2.0, -radius.value/2.0, radius.value/2.0, height.value/2.0); OOGLout(out); sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1", height.value/2.0, height.value/2.0); OOGLout(out); if (mb_val == PER_PART || mb_val == PER_PART_INDEXED) { OOGLgetcolor(qv_material, qv_materialb, 1); sprintf(out, "%s %s %s %s\n", colstr, colstr, colstr, colstr); OOGLout(out); } } if (parts.value == BOTTOM || parts.value == ALL) { sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1", -height.value/2.0, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value/2.0, -height.value/2.0, radius.value/2.0, radius.value/2.0, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1\n", -radius.value, -height.value/2.0, radius.value, radius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value, -height.value/2.0, -radius.value, radius.value, -height.value/2.0); OOGLout(out); sprintf(out, "%f %f 0 1\t0 0 %f 0\t%f %f 0 1", -radius.value/2.0, -height.value/2.0, -radius.value/2.0, radius.value/2.0, -height.value/2.0); OOGLout(out); sprintf(out, "0 %f 0 1\t0 0 0 0\t0 %f 0 1\n", -height.value/2.0, -height.value/2.0); OOGLout(out); if (mb_val == PER_PART || mb_val == PER_PART_INDEXED) { OOGLgetcolor(qv_material, qv_materialb, 2); sprintf(out, "%s %s %s %s\n", colstr, colstr, colstr, colstr); OOGLout(out); } } OOGLout("}"); } void QvSphere::ToWebOOGL(QvState *state) { QvElement *elt = NULL; QvMaterial *qv_material = NULL; // QvMaterialBinding *qv_materialb = NULL; elt = state->getTopElement(QvState::MaterialIndex); if (elt) { qv_material = (QvMaterial *)elt->data;} elt = state->getTopElement(QvState::MaterialBindingIndex); // if (elt) { qv_materialb = (QvMaterialBinding *)elt->data; } ANNOUNCE(QvSphere); OOGLout("# VRML Sphere"); OOGLout("{"); OOGLappearance(qv_material); OOGLout("= SPHERE"); sprintf(out, " %f", radius.value); OOGLout(out); OOGLout(" 0 0 0"); OOGLout("}"); } void QvIndexedFaceSet::ToWebOOGL(QvState *state) { QvElement *elt = NULL; QvCoordinate3 *qv_coord = NULL; QvMaterial *qv_material = NULL; // QvMaterialBinding *qv_materialb = NULL; QvNormal *qv_normal = NULL; QvNormalBinding *qv_normalb = NULL; float *coords; // float *vects; long *firstindex; // Binding mb_val; Binding nb_val; int count, numfaces, bad, numverts, numcoords, numnormals; elt = state->getTopElement(QvState::Coordinate3Index); if (elt) { qv_coord = (QvCoordinate3 *)elt->data;} elt = state->getTopElement(QvState::MaterialIndex); if (elt) { qv_material = (QvMaterial *)elt->data;} elt = state->getTopElement(QvState::MaterialBindingIndex); // if (elt) { qv_materialb = (QvMaterialBinding *)elt->data; } elt = state->getTopElement(QvState::NormalIndex); if (elt) { qv_normal = (QvNormal *)elt->data; } elt = state->getTopElement(QvState::NormalBindingIndex); if (elt) { qv_normalb = (QvNormalBinding *)elt->data; } // if (qv_materialb) { mb_val = (Binding) qv_materialb->value.value; } // else { mb_val = DEFAULT; } if (qv_normalb) { nb_val = (Binding) qv_normalb->value.value; } else { nb_val = DEFAULT; } if (qv_coord) { numcoords = qv_coord->point.num; coords = qv_coord->point.values; } else { numcoords = 0; coords = NULL; } if (qv_normal) { numnormals = qv_normal->vector.num; // vects = qv_normal->vector.values; } else { numnormals = 0; // vects = NULL; } if (qv_material) { } firstindex = coordIndex.values; numverts = coordIndex.num, ANNOUNCE(QvIndexedFaceSet); numfaces = 0; bad = 0; for (count = 0; count < numverts; count++) { if (firstindex[count] < 0 && !bad) { numfaces++; bad = 1; } else bad = 0; /* bad handles case of two consecutive delimeters */ if (firstindex[count] > (numcoords - 1)) return; } for (count = 0; count < numnormals; count++) { } OOGLout("# IndexedFaceSet"); if (coords == NULL) { OOGLout("# Bad Values"); return; } if (nb_val) { } OOGLout("{ = OFF"); sprintf(out, "%d %d 0\n", numcoords, numfaces); OOGLout(out); for (count = 0; count < numcoords; count++) { float x = coords[count*3], y = coords[count*3+1], z = coords[count*3+2]; sprintf(out, "%f %f %f", x, y, z); OOGLout(out); } OOGLout(""); count = 0; while (count < numverts) { int numvts, start; numvts = 0; start = count; while (firstindex[count] > -1 && count < numverts) { count++; numvts++; } if (count > start) { OOGLoutindent(); sprintf(out, "%d", numvts); OOGLoutraw(out); for(int i=start;igetTopElement(QvState::Coordinate3Index); if (elt) { qv_coord = (QvCoordinate3 *)elt->data;} elt = state->getTopElement(QvState::MaterialIndex); if (elt) { qv_material = (QvMaterial *)elt->data;} elt = state->getTopElement(QvState::MaterialBindingIndex); if (elt) { qv_materialb = (QvMaterialBinding *)elt->data; } if (qv_materialb) { mb_val = (Binding) qv_materialb->value.value; } else { mb_val = DEFAULT; } if (qv_coord) { numcoords = qv_coord->point.num; coords = qv_coord->point.values; } else { numcoords = 0; coords = NULL; } nummats = materialIndex.num; matindex = materialIndex.values; firstindex = coordIndex.values; numverts = coordIndex.num, ANNOUNCE(QvIndexedLineSet); count = 0; numlines = 0; numvts = 0; points = 0; numsegs = 0; while (count < numverts) { int x; x = 0; while (firstindex[count] < 0 && count < numverts) count++; while (firstindex[count] > -1 && count < numverts) { count++; x++; } if (x == 1) { numvts++; numlines++; points++; } else if (x > 1) { numvts += x; numlines++; numsegs += x - 1; } } OOGLout("# IndexedLineSet"); if (coords == NULL || numvts < 1 || numlines < 1) { OOGLout("# Bad Values"); return; } OOGLout("{ = VECT"); if (mb_val == DEFAULT || mb_val == OVERALL) { sprintf(out, "%d %d 1\n", numlines, numvts); } else if (mb_val == PER_FACE || mb_val == PER_FACE_INDEXED) { sprintf(out, "%d %d %d\n", numlines, numvts, numlines); } else if (mb_val == PER_PART || mb_val == PER_PART_INDEXED) { sprintf(out, "%d %d %d\n", numsegs + points, numvts, numsegs + points); } else if (mb_val == PER_VERTEX || mb_val == PER_VERTEX_INDEXED) { sprintf(out, "%d %d %d\n", numlines, numvts, numvts); } OOGLout(out); /* number of vertices in each poly line */ OOGLoutindent(); count = 0; while (count < numverts) { int x; x = 0; while (firstindex[count] < 0 && count < numverts) count++; while (firstindex[count] > -1 && count < numverts) { count++; x++; } if (mb_val == PER_PART || mb_val == PER_PART_INDEXED) { /* Here, we divide our poly lines into segments... */ if (x == 1) { sprintf(out,"1 "); OOGLoutraw(out); } else if (x > 1) { while (x > 1) { sprintf(out,"2 "); OOGLoutraw(out); x--; } sprintf(out,"%d ", x - 1); OOGLoutraw(out); } } else if (x > 0) { sprintf(out,"%d ", x); OOGLoutraw(out); } } OOGLoutraw("\n"); /* number of colors in each poly line */ OOGLoutindent(); if (mb_val == DEFAULT || mb_val == OVERALL) { count = 1; OOGLoutraw("1 "); while (count < numlines) { sprintf(out,"0 "); OOGLoutraw(out); count++; } OOGLoutraw("\n"); } else if (mb_val == PER_FACE || mb_val == PER_FACE_INDEXED) { count = 0; while (count < numlines) { OOGLoutraw("1 "); count++; } } else if (mb_val == PER_PART || mb_val == PER_PART_INDEXED) { count = 0; while (count < (numsegs + points)) { OOGLoutraw("1 "); count++; } } else if (mb_val == PER_VERTEX || mb_val == PER_VERTEX_INDEXED) { count = 0; while (count < numverts) { int x; x = 0; while (firstindex[count] < 0 && count < numverts) count++; while (firstindex[count] > -1 && count < numverts) { count++; x++; } if (x > 0) { sprintf(out,"%d ", x); OOGLoutraw(out); } } } OOGLout(""); count = 0; while (count < numverts) { long num; while (firstindex[count] < 0 && count < numverts) count++; while (firstindex[count] > -1 && count < numverts) { float x, y, z; num = firstindex[count]; count++; if (num > -1 && num < numcoords) { x = coords[num * 3]; y = coords[num * 3 + 1]; z = coords[num * 3 + 2]; sprintf(out,"%f %f %f", x, y, z); OOGLout(out); } else sprintf(out,"%f %f %f", x, y, z); } } OOGLout(""); OOGLoutindent(); if (mb_val == DEFAULT || mb_val == OVERALL) { OOGLgetcolor(qv_material, qv_materialb, 0); OOGLout(colstr); } else if (mb_val == PER_FACE || mb_val == PER_PART || mb_val == PER_VERTEX) { int numpieces; if (mb_val == PER_FACE) numpieces = numlines; else if (mb_val == PER_PART) numpieces = numsegs + points; else if (mb_val == PER_VERTEX) numpieces = numvts; count = 0; while (count < numpieces) { OOGLgetcolor(qv_material, qv_materialb, count); OOGLout(colstr); count++; } } else if (mb_val == PER_FACE_INDEXED || mb_val == PER_PART_INDEXED || mb_val == PER_VERTEX_INDEXED) { int numpieces, x; if (mb_val == PER_FACE_INDEXED) numpieces = numlines; else if (mb_val == PER_PART_INDEXED) numpieces = numsegs + points; else if (mb_val == PER_VERTEX_INDEXED) numpieces = numvts; count = 0; x = 0; while (count < numpieces) { int num; if (nummats > 0) { num = (int) matindex[x % nummats]; if (num >= 0) { OOGLgetcolor(qv_material, qv_materialb, num); OOGLout(colstr); count++; x++; } else x++; } else { OOGLgetcolor(qv_material, qv_materialb, 0); OOGLout(colstr); count++; } } } OOGLout("}"); } void QvPointSet::ToWebOOGL(QvState *state) { QvElement *elt = NULL; QvCoordinate3 *qv_coord = NULL; QvMaterial *qv_material = NULL; QvMaterialBinding *qv_materialb = NULL; float *coords; // Binding mb_val; int count, numcoords; long numverts; elt = state->getTopElement(QvState::Coordinate3Index); if (elt) { qv_coord = (QvCoordinate3 *)elt->data;} elt = state->getTopElement(QvState::MaterialIndex); if (elt) { qv_material = (QvMaterial *)elt->data;} elt = state->getTopElement(QvState::MaterialBindingIndex); if (elt) { qv_materialb = (QvMaterialBinding *)elt->data; } // if (qv_materialb) { mb_val = (Binding) qv_materialb->value.value; } // else { mb_val = DEFAULT; } if (qv_coord) { numcoords = qv_coord->point.num; coords = qv_coord->point.values; } else { numcoords = 0; coords = NULL; } if (qv_material) { } if (startIndex.value > numcoords) { OOGLout("# Bad Values"); return; } if (numPoints.value == (-1)) { numverts = numcoords - startIndex.value; } else if ((numPoints.value - startIndex.value) > numcoords) { OOGLout("# Bad Values"); return; } else { numverts = numPoints.value - startIndex.value; } ANNOUNCE(QvPointSet); OOGLout("# PointSet"); if (coords == NULL) { OOGLout("# Bad Values"); return; } OOGLout("{ = VECT"); sprintf(out, "%d %d %d\n", numverts, numverts, numverts); OOGLout(out); /* number of vertices in each poly line */ OOGLoutindent(); for (count = 0; count < numverts; count++) { OOGLoutraw("1 "); } OOGLoutraw("\n"); /* number of colors in each poly line */ OOGLoutindent(); for (count = 0; count < numverts; count++) { OOGLoutraw("1 "); } OOGLoutraw("\n"); for (count = 0; count < numverts; count++) { float x = coords[(count+startIndex.value)*3], y = coords[(count+startIndex.value)*3+1], z = coords[(count+startIndex.value)*3+2]; sprintf(out, "%f %f %f", x, y, z); OOGLout(out); } OOGLout(""); for (count = 0; count < numverts; count++) { OOGLgetcolor(qv_material, qv_materialb, count); OOGLout(colstr); } OOGLout("}"); } static int knowngsfont(char *str) { if(str == NULL) return 0; if(access(str, 0) >= 0) return 1; char buf[2048], *p, *tail; char *gsfontpath = getenv("GS_FONTPATH"); if(gsfontpath == NULL) gsfontpath = "/usr/local/lib/ghostscript/fonts"; for(p = tail = gsfontpath; tail && *p != '\0'; p = tail+1) { tail = strchr(p, ':'); int len = tail ? tail - p : strlen(p); if(len > 1024) len = 1024; memcpy(buf, p, len); buf[len] = '/'; strncpy(buf+len+1, str, 2046-len); if(access(buf, 0) >= 0) return 1; } return 0; } void QvAsciiText::ToWebOOGL(QvState *state) { float fontsize = 1.0; // float linespace = 1.0; char *font = NULL; // int bold = 0, italic = 0; QvElement *elt = state->getTopElement(QvState::FontStyleIndex); if(elt && elt->data) { QvFontStyle *fs = (QvFontStyle *)elt->data; fontsize = fs->size.value; // if(fs->style.value & (1<family.value) { case QvFontStyle::SERIF: font = "hrpl_t.gsf"; break; case QvFontStyle::TYPEWRITER: /* sorry, can't do that now */ break; } } int i, c; float y = 0; char buf[2048], *q; const char *p; char *just = "sw"; FILE *f; switch(justification.value) { case QvAsciiText::LEFT: just = "sw"; break; case QvAsciiText::RIGHT: just = "se"; break; case QvAsciiText::CENTER: just = "s"; break; } OOGLout(string.num > 1 ? "{ = LIST # VRML AsciiText" : "# VRML AsciiText"); for(i = 0; i < string.num; i++) { float wid = width.values[ (i 0) sprintf(buf + strlen(buf), "-w %g ", wid); if(font && knowngsfont(font)) sprintf(buf + strlen(buf), "-hershey %s ", font); q = buf + strlen(buf); *q++ = '\''; for(p = string.values[i].getString(); p && *p != '\0' && q < &buf[2048-3]; ) { if(*p == '\'' || *p == '\\') *q++ = '\\'; *q++ = *p++; } *q++ = '\''; *q = '\0'; f = popen(buf, "r"); for(q = buf; (c = getc(f)) != EOF; ) { if(c == '\n') { *q = '\0'; OOGLout(buf); q = buf; } else { *q++ = c; } } pclose(f); y -= spacing.value * fontsize; } if(string.num > 1) OOGLout("} # End AsciiText"); } ////////////////////////////////////////////////////////////////////////////// // // WWW-specific nodes. // ////////////////////////////////////////////////////////////////////////////// void QvWWWInline::ToWebOOGL(QvState *) { int notuniq = 0; int i; ANNOUNCE(QvWWWInline); if (OOGLhand) { sprintf(out, "{ : %s }", name.value.getString()); for (i = 0; i < unique && !notuniq; i++) { if (!strcmp(urls[i], name.value.getString())) notuniq = 1; } if (!notuniq) { urls[unique++] = (char *)name.value.getString(); } } else { sprintf(out, "{ COMMENT url.%d WWWInline { \"%s\" }}", unique++, name.value.getString()); } OOGLout(out); } void QvWWWAnchor::ToWebOOGL(QvState *state) { int savedepth, i; ANNOUNCE(QvWWWAnchor); OOGLout("{ = LIST # Anchor"); OOGLoutindent(); OOGLoutraw("{ COMMENT "); sprintf(out, "wwwanchor.%d HREF { \"%s\" } }\n", mypid, name.value.getString()); OOGLoutraw(out); savedepth = oogldepth; indent++; for (i = 0; i < getNumChildren(); i++) getChild(i)->ToWebOOGL(state); indent--; savedepth = oogldepth - savedepth; /* How deep did we get ? :-)*/ for (i = 0; i < savedepth; i++) { /* Do the equivalent OOGL pop */ out[i*2] = '}'; /* pop the LIST */ out[i*2+1] = '}'; /* pop the INST */ } out[savedepth*2] = '\0'; OOGLout(out); OOGLout("} # End Anchor"); oogldepth = oogldepth - savedepth; } ////////////////////////////////////////////////////////////////////////////// // // Default traversal methods. These nodes have no effects during traversal. // ////////////////////////////////////////////////////////////////////////////// DEFAULT_TRAVERSE(QvInfo) DEFAULT_TRAVERSE(QvUnknownNode) ////////////////////////////////////////////////////////////////////////////// #undef ANNOUNCE #undef DEFAULT_TRAVERSE #undef DO_PROPERTY #undef DO_SHAPE #undef DO_TYPED_PROPERTY geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvName.c++0000644000175000001440000000402307730234600017622 00000000000000#include #include #define CHUNK_SIZE 4000 struct QvNameChunk { char mem[CHUNK_SIZE]; char *curByte; int bytesLeft; struct QvNameChunk *next; }; int QvNameEntry::nameTableSize; QvNameEntry ** QvNameEntry::nameTable; struct QvNameChunk *QvNameEntry::chunk; void QvNameEntry::initClass() { int i; nameTableSize = 1999; nameTable = new QvNameEntry *[nameTableSize]; for (i = 0; i < nameTableSize; i++) nameTable[i] = NULL; chunk = NULL; } const QvNameEntry * QvNameEntry::insert(const char *s) { u_long h = QvString::hash(s); u_long i; QvNameEntry *entry; QvNameEntry *head; if (nameTableSize == 0) initClass(); i = h % nameTableSize; entry = head = nameTable[i]; while (entry != NULL) { if (entry->hashValue == h && entry->isEqual(s)) break; entry = entry->next; } if (entry == NULL) { int len = strlen(s) + 1; if (len >= CHUNK_SIZE) s = strdup(s); else { if (chunk == NULL || chunk->bytesLeft < len) { struct QvNameChunk *newChunk = new QvNameChunk; newChunk->curByte = newChunk->mem; newChunk->bytesLeft = CHUNK_SIZE; newChunk->next = chunk; chunk = newChunk; } strcpy(chunk->curByte, s); s = chunk->curByte; chunk->curByte += len; chunk->bytesLeft -= len; } entry = new QvNameEntry(s, h, head); nameTable[i] = entry; } return entry; } QvName::QvName() { entry = QvNameEntry::insert(""); } QvBool QvName::isIdentStartChar(char c) { if (isdigit(c)) return FALSE; return isIdentChar(c); } QvBool QvName::isIdentChar(char c) { if (isalnum(c) || c == '_') return TRUE; return FALSE; } QvBool QvName::isNodeNameStartChar(char c) { if (isdigit(c)) return FALSE; return isIdentChar(c); } static const char badCharacters[] = "+\'\"\\{}"; QvBool QvName::isNodeNameChar(char c) { if (isalnum(c)) return TRUE; if ((strchr(badCharacters, c) != NULL) || isspace(c) || iscntrl(c)) return FALSE; return TRUE; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMFFloat.c++0000644000175000001440000000024407730234561020241 00000000000000#include QV_MFIELD_SOURCE(QvMFFloat, float, 1, FALSE); QvBool QvMFFloat::read1Value(QvInput *in, int index) { return in->read(values[index]); } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMaterial.h0000644000175000001440000000261110455700775020371 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MATERIAL_ #define _QV_MATERIAL_ #include #include #include class QvMaterial : public QvNode { QV_NODE_HEADER(QvMaterial); public: // Fields QvMFColor ambientColor; // Ambient color QvMFColor diffuseColor; // Diffuse color QvMFColor specularColor; // Specular color QvMFColor emissiveColor; // Emissive color QvMFFloat shininess; // Shininess QvMFFloat transparency; // Transparency }; #endif /* _QV_MATERIAL_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFEnum.c++0000644000175000001440000000206707730234455020115 00000000000000#include #include #include // Can't use macro, since we define a constructor. QvSFEnum::QvSFEnum() { enumValues = NULL; enumNames = NULL; } QvSFEnum::~QvSFEnum() { } QvBool QvSFEnum::findEnumValue(const QvName &name, int &val) const { int i; // Look through names table for one that matches for (i = 0; i < numEnums; i++) { if (name == enumNames[i]) { val = enumValues[i]; return TRUE; } } return FALSE; } QvBool QvSFEnum::readValue(QvInput *in) { QvName n; #ifdef DEBUG if (enumValues == NULL) { QvDebugError::post("QvSFEnum::readValue", "Enum values were never initialized"); QvReadError::post(in, "Couldn't read QvSFEnum value"); return FALSE; } #endif /* DEBUG */ // Read mnemonic value as a character string identifier if (! in->read(n, TRUE)) return FALSE; if (findEnumValue(n, value)) return TRUE; // Not found? Too bad QvReadError::post(in, "Unknown QvSFEnum enumeration value \"%s\"", n.getString()); return FALSE; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvErrors.c++0000644000175000001440000000006707730234451020226 00000000000000#include "QvDebugError.c++" #include "QvReadError.c++" geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvSFImage.h0000644000175000001440000000233110455700775020105 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_SF_IMAGE_ #define _QV_SF_IMAGE_ #include class QvSFImage : public QvSField { public: short size[2]; // Width and height of image int numComponents; // Number of components per pixel unsigned char * bytes; // Array of pixels QV_SFIELD_HEADER(QvSFImage); }; #endif /* _QV_SF_IMAGE_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/lib/QvMFLong.h0000644000175000001440000000211310455700775017752 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _QV_MF_LONG_ #define _QV_MF_LONG_ #include class QvMFLong : public QvMField { public: long *values; QV_MFIELD_HEADER(QvMFLong); }; #endif /* _QV_MF_LONG_ */ geomview-1.9.4/src/bin/geomutil/vrml2oogl/vrml2oogl.C0000644000175000001440000000236207730234407017433 00000000000000#include #include #include #include #include #include int main(int argc, char **argv) { QvDB::init(); QvInput in; QvGroup root; char *handle = NULL; if (argc == 2) { handle = argv[1]; } else if (argc > 2) { fprintf(stderr, "Usage: vrml2oogl [handle] < vrmlfile > ooglfile\n\ Convert VRML file (possibly compressed/gzipped) into an OOGL file.\n\ handle: Return GCL not OOGL, where the OOGL geometry is defined as the handle.\n\ The handle generally corresponds to a URL.\n"); return(1); } if(! root.readChildren(&in)) { fprintf(stderr, "vrml2oogl: Couldn't parse VRML.\n"); } if (handle) { fprintf(stdout, "(progn (read geometry {define \"%s\" {\n", handle); } else { fprintf(stdout, "{\n"); } QvState state; OOGLhandle(handle); OOGLfile(stdout); root.ToWebOOGL(&state); if (handle) { int i; fprintf(stdout, "}})\n"); for (i = 0; i < OOGLnumuniq(); i++) { fprintf(stdout, " (emodule-transmit \"weboogl.perl\" \"(NeedURL %s)\n\")\n", OOGLgeturls(i)); } fprintf(stdout, " )\n "); } else { fprintf(stdout, "}\n"); } return 0; } geomview-1.9.4/src/bin/geomutil/vrml2oogl/Makefile.am0000644000175000001440000000030110600603057017416 00000000000000INCLUDES = @default_includes@ -I$(srcdir)/lib SUBDIRS = lib bin_PROGRAMS = vrml2oogl man_MANS = vrml2oogl.1gv EXTRA_DIST = $(man_MANS) vrml2oogl_SOURCES = vrml2oogl.C LDADD = ./lib/libQv.a geomview-1.9.4/src/bin/geomutil/vrml2oogl/Makefile.in0000644000175000001440000005256610665240476017470 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = vrml2oogl$(EXEEXT) subdir = src/bin/geomutil/vrml2oogl DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_vrml2oogl_OBJECTS = vrml2oogl.$(OBJEXT) vrml2oogl_OBJECTS = $(am_vrml2oogl_OBJECTS) vrml2oogl_LDADD = $(LDADD) vrml2oogl_DEPENDENCIES = ./lib/libQv.a DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(vrml2oogl_SOURCES) DIST_SOURCES = $(vrml2oogl_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = @default_includes@ -I$(srcdir)/lib SUBDIRS = lib man_MANS = vrml2oogl.1gv EXTRA_DIST = $(man_MANS) vrml2oogl_SOURCES = vrml2oogl.C LDADD = ./lib/libQv.a all: all-recursive .SUFFIXES: .SUFFIXES: .C .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/geomutil/vrml2oogl/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/geomutil/vrml2oogl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done vrml2oogl$(EXEEXT): $(vrml2oogl_OBJECTS) $(vrml2oogl_DEPENDENCIES) @rm -f vrml2oogl$(EXEEXT) $(CXXLINK) $(vrml2oogl_OBJECTS) $(vrml2oogl_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vrml2oogl.Po@am__quote@ .C.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .C.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .C.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) $(MANS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-man install-dvi: install-dvi-recursive install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-info: install-info-recursive install-man: install-man1 install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man1 install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/geomutil/vrml2oogl/vrml2oogl.1gv0000644000175000001440000000125210600600312017721 00000000000000.\" Hey, EMACS: -*- nroff -*- .TH VRML2OOGL 1gv "February 23, 2001" .SH NAME vrml2oogl \- convert VRML to OOGL .SH SYNOPSIS .B vrml2oogl .I [handle] .SH DESCRIPTION This manual page documents briefly the .B vrml2oogl command. .PP .B vrml2oogl Convert VRML file (possibly compressed/gzipped) into an OOGL file. If a handle is given, return GCL not OOGL, where the OOGL geometry is defined as the handle. The handle generally corresponds to a URL. .SH SEE ALSO .BR geomview (1). .BR oogl2vrml (1). .SH AUTHOR This manual page was written by Steve Robbins , for the Debian GNU/Linux system (but may be used by others). geomview-1.9.4/src/bin/togeomview/0000777000175000001440000000000010665240700014074 500000000000000geomview-1.9.4/src/bin/togeomview/togeomview.1gv0000644000175000001440000000546410600600312016611 00000000000000.TH TOGEOMVIEW 1gv "21 May 1993" "Geometry Center" .SH NAME togeomview \- send commands or OOGL objects to geomview .SH SYNOPSIS \fBtogeomview\fP [\fB\-c\fP] [\fB\-g\fP] [\fIpipename\fP [\fIprogram args ...\fP]] .SH DESCRIPTION \fBtogeomview\fP sends a stream of geomview commands, or OOGL-format geometric data, to a cooperating copy of geomview. If geomview is not running, it is automatically started. ('geomview' must be on the $PATH of the user running 'togeomview' in order for this to work.) Typical usage is: .in +5 .nf \fIsomeprogram\fP | \fBtogeomview\fP (to send commands) or \fIsomeprogram-generating-OOGL-data\fP | \fBtogeomview -g\fP (to send geometry) .fi .in -5 i.e. a program pipes geometric data into ``\fBtogeomview\fP''; the data is displayed by a copy of geomview run with the \fB\-M\fP option and a name matching the one given to \fBtogeomview\fP. .sp \fBTogeomview\fP uses a named pipe in the directory \fB/tmp/geomview\fP to communicate with geomview. If unspecified, the pipe's default name is "OOGL". When sending geometry (\fB\-g\fP), a geomview object with the same name as the pipe appears in geomview's object browser. .sp By default, when no suitable copy of geomview is running, \fBtogeomview\fP invokes "geomview" with arguments specifying the appropriate named pipe. A different command may be specified as in: .sp .ti +5 togeomview OOGL gv -wpos 300x300 -c \fImy_startup_script\fP .sp which communicates through a pipe named OOGL, and (if necessary) invokes the given gv command. The pipe name is \fIrequired\fP if a command is specified. After togeomview has created it, the named pipe may be written as an ordinary file. For example, one could use .sp .ti +5 \fBtogeomview\fP \fIpipename\fP < /dev/null .sp to invoke a listening copy of geomview, and then run a program which simply wrote to /tmp/geomview/\fIpipename\fP. .SH FILES /tmp/geomview .SH BUGS The pipe-based communications scheme imposes several restrictions. If no copy of \fBgeomview\fP is reading from the pipe, or if geomview gets far enough behind, a program writing data to ``\fBtogeomview\fP'' will be forced to block after sending a few kilobytes. Because of the buffering in the pipe, the sender may be substantially ahead of the geomview display. If geomview exits, the sending program receives a write-on-broken-pipe (\fBSIGPIPE\fP) signal, which will kill it unless measures are taken to catch or ignore that signal. Only one copy of geomview can read from a given pipe at a time. If a second copy attempts to read from it, both will probably fail. It's fine to have multiple copies of geomview reading from different pipes. Note that \fBtogeomview\fP will invoke geomview if no extant copy is listening to the relevant pipe; it can't connect to an existing copy of geomview started by other means. .SH "SEE ALSO" geomview(1), oogl(5) geomview-1.9.4/src/bin/togeomview/Makefile.am0000644000175000001440000000025110622716747016056 00000000000000INCLUDES = $(default_includes) LDADD = ${SOCKETLIBS} man_MANS = togeomview.1gv bin_PROGRAMS = togeomview togeomview_SOURCES = togeomview.c EXTRA_DIST = $(man_MANS) geomview-1.9.4/src/bin/togeomview/Makefile.in0000644000175000001440000004262610665240500016065 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = togeomview$(EXEEXT) subdir = src/bin/togeomview DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_togeomview_OBJECTS = togeomview.$(OBJEXT) togeomview_OBJECTS = $(am_togeomview_OBJECTS) togeomview_LDADD = $(LDADD) am__DEPENDENCIES_1 = togeomview_DEPENDENCIES = $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(togeomview_SOURCES) DIST_SOURCES = $(togeomview_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) LDADD = ${SOCKETLIBS} man_MANS = togeomview.1gv togeomview_SOURCES = togeomview.c EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/togeomview/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/togeomview/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done togeomview$(EXEEXT): $(togeomview_OBJECTS) $(togeomview_DEPENDENCIES) @rm -f togeomview$(EXEEXT) $(LINK) $(togeomview_OBJECTS) $(togeomview_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/togeomview.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-binPROGRAMS install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/togeomview/togeomview.c0000644000175000001440000002723310614314267016354 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #ifdef AIX # define _BSD 1 /* Get FNDELAY from fcntl.h */ #endif #include #include #include #if HAVE_ERRNO_H # include #elif HAVE_SYS_ERRNO_H # include #else extern int errno; #endif #if HAVE_INET_SOCKETS || HAVE_INET6_SOCKETS #include #include #include #endif #ifndef NeXT #include #endif #ifndef O_NONBLOCK # define O_NONBLOCK O_NDELAY #endif #ifndef FNDELAY # define FNDELAY O_NDELAY #endif #ifndef FNONBLK # define FNONBLK FNDELAY #endif enum streamtype { nopipe = -1, namedpipe = 0, unixsocket, inetsocket, inet6socket }; static void usage(const char *prog); #define DFLT_PORT 29*31*37 /* 33263, so what */ #define DFLT_PORT_STR "33263" #if HAVE_INET_SOCKETS static void init_inetaddr(struct sockaddr_in *name, const char *hostname, int port); #endif #if HAVE_INET6_SOCKETS static void init_inet6addr(struct sockaddr_in6 *name, const char *hostname, int port); #endif static void interrupt(int sig) { fprintf(stderr, "Couldn't start geomview\n"); exit(1); } /* * We've determined that no copy of geomview is running, so start one. */ static void start_gv(char **progtorun, char *toname, bool asgeom, enum streamtype pipetype) { char *args[1024]; int i; static const char Mprefix[] = "/tmp/geomview/"; char Mhow[] = "-Mcsin6"; signal(SIGALRM, interrupt); for (i=0; progtorun[i] != NULL; i++) args[i] = progtorun[i]; Mhow[2] = asgeom ? 'g' : 'c'; switch (pipetype) { case namedpipe: Mhow[3] = 'p'; Mhow[4] = '\0'; break; case unixsocket: Mhow[3] = 's'; Mhow[4] = '\0'; break; case inetsocket: strcpy(Mhow+3, "sin"); break; case inet6socket: strcpy(Mhow+3, "sin6"); break; default: break; } args[i++] = Mhow; #if HAVE_INET_SOCKETS || HAVE_INET6_SOCKETS if (pipetype == inetsocket || pipetype == inet6socket) { if ((toname = strrchr(toname, ':')) == NULL) { toname = DFLT_PORT_STR; } else { ++toname; } args[i++] = toname; } else #endif args[i++] = strncmp(toname, Mprefix, sizeof(Mprefix)-1) != 0 ? toname : toname + sizeof(Mprefix)-1; args[i] = NULL; if (fork() == 0) { close(0); #if SETPGRP_VOID setpgrp(); #else setpgrp(0,getpid()); #endif execvp(progtorun[0], &args[0]); execvp("gv", &args[0]); perror("Couldn't exec geomview nor gv"); kill(getppid(), SIGALRM); _exit(1); } } /* * Pipe fitting for linking Mathematica to geomview. * Starts geomview if not already running. */ int main(int argc, char *argv[]) { int n, fd = -1; int asgeom = 0; char pipename[PATH_MAX]; char buffer[BUFSIZ]; static char *geomview[] = { "geomview", NULL }; char **progtorun = geomview; char *tail; struct stat st; char *prog; #ifdef NeXT enum streamtype pipetype = unixsocket; #else enum streamtype pipetype = namedpipe; #endif const char *todir = "/tmp/geomview"; const char *toname = "OOGL"; const char *hostname = "localhost"; char *portstr = DFLT_PORT_STR; int port = DFLT_PORT; prog = argv[0]; tail = strrchr(prog, '/'); if (tail) tail++; else tail = argv[0]; if (tail[0] == 'g') { asgeom = 1; } while (argc > 1 && argv[1][0] == '-') { for (tail = argv[1]; *++tail; ) { switch(*tail) { case 'M': asgeom = 1; break; case 'g': asgeom = 1; break; case 'c': asgeom = 0; break; case 'p': pipetype = namedpipe; break; case 's': pipetype = unixsocket; if (strncmp(tail, "sun", 3) == 0) { tail += 2; } else if (strncmp(tail, "sin6", 4) == 0) { pipetype = inet6socket; tail += 3; } else if (strncmp(tail, "sin", 3) == 0) { pipetype = inetsocket; tail += 2; } break; default: usage(prog); break; } } argc--, argv++; } #ifndef S_IFIFO if (pipetype == namedpipe) { fprintf(stderr, "Named pipes not supported.\n"); exit(EXIT_FAILURE); } #endif #if !HAVE_UNIX_SOCKETS if (pipetype == unixsocket) { fprintf(stderr, "Unix domain sockets not supported.\n"); exit(EXIT_FAILURE); } #endif #if !HAVE_INET_SOCKETS if (pipetype == inetsocket) { fprintf(stderr, "IPv4 sockets not supported.\n"); exit(EXIT_FAILURE); } #endif #if !HAVE_INET6_SOCKETS if (pipetype == inetsocket) { fprintf(stderr, "IPv6 sockets not supported.\n"); exit(EXIT_FAILURE); } #endif if (argc > 1) { toname = argv[1]; if (pipetype == inetsocket || pipetype == inet6socket) { portstr = strrchr(toname, ':'); if (portstr == NULL) { portstr = DFLT_PORT_STR; } else { *portstr++ = '\0'; } hostname = toname; port = atoi(portstr); toname = portstr; } } else if (pipetype == inetsocket || pipetype == inet6socket) { toname = portstr = DFLT_PORT_STR; } if (argc > 2) { progtorun = &argv[2]; } if (pipetype == namedpipe || pipetype == unixsocket) { if (toname[0] == '/') { tail = strrchr(toname, '/'); *tail = '\0'; todir = toname; toname = tail + 1; } if (access(todir, W_OK) < 0) { mkdir(todir, 0777); chmod(todir, 0777); } sprintf(pipename, "%s/%s", todir, toname); if (stat(pipename, &st) >= 0) { #if HAVE_UNIX_SOCKETS if (pipetype == unixsocket && (st.st_mode & S_IFMT) != S_IFSOCK) { unlink(pipename); } #endif #ifdef S_IFIFO if (pipetype == namedpipe && (st.st_mode & S_IFMT) != S_IFIFO) { unlink(pipename); } #endif } } else { sprintf(pipename, "%s:%s", hostname, portstr); } if (pipetype != namedpipe) { #if HAVE_UNIX_SOCKETS struct sockaddr_un un; #endif #if HAVE_INET_SOCKETS struct sockaddr_in in; #endif #if HAVE_INET6_SOCKETS struct sockaddr_in6 in6; #endif struct sockaddr *s = NULL; int slen = 0; bool do_startgv = false; switch (pipetype) { #if HAVE_UNIX_SOCKETS case unixsocket: strncpy(un.sun_path, pipename, sizeof(un.sun_path)-1); un.sun_family = AF_UNIX; fd = socket(PF_UNIX, SOCK_STREAM, 0); s = (struct sockaddr *)&un; slen = sizeof(un); do_startgv = true; break; #endif #if HAVE_INET_SOCKETS case inetsocket: init_inetaddr(&in, hostname, port); fd = socket(PF_INET, SOCK_STREAM, 0); s = (struct sockaddr *)∈ slen = sizeof(in); /* only try to start gv if going through loop-back device */ do_startgv = in.sin_addr.s_addr == htonl(INADDR_LOOPBACK); break; #endif #if HAVE_INET6_SOCKETS case inet6socket: init_inet6addr(&in6, hostname, port); fd = socket(PF_INET6, SOCK_STREAM, 0); s = (struct sockaddr *)&in6; slen = sizeof(in6); do_startgv = memcmp(&in6.sin6_addr, &in6addr_loopback, sizeof(struct in6_addr)) == 0; break; #endif default: break; } if (connect(fd, s, slen) < 0) { if (errno != ECONNREFUSED && errno != ENOENT) { fprintf(stderr, "togeomview: Can't connect to "); perror(pipename); exit(EXIT_FAILURE); } if (do_startgv) { start_gv(progtorun, pipename, asgeom, pipetype); for (n = 0; connect(fd, s, slen) < 0; n++) { if (n == 15) { interrupt(0); } sleep(1); } } else { fprintf(stderr, "togeomview: unable to connect to \"%s\"; and " "starting Geomview on remote-hosts is not implemented yet.\n", pipename); exit(EXIT_FAILURE); } } #ifdef S_IFIFO } else { /* Use named pipe */ if (access(pipename, 0) < 0) { mknod(pipename, S_IFIFO, 0); chmod(pipename, 0666); } fd = open(pipename, O_WRONLY|O_NONBLOCK); if (fd >= 0) { fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~(FNDELAY|FNONBLK|O_NONBLOCK)); } else if (errno == ENXIO) { start_gv(progtorun, pipename, asgeom, pipetype); alarm(60); fd = open(pipename, O_WRONLY); alarm(0); } #endif } if (fd < 0) { fprintf(stderr, "Can't open pipe to geomview: "); perror(pipename); exit(1); } while ((n = read(0, buffer, sizeof(buffer))) > 0) { if (write(fd, buffer, n) < n) { perror("Error writing to geomview"); exit(1); } } if (!asgeom) { /* try to consume answers and echo them on STDOUT. * * The policy is somewhat questionable; the code below means that * each command piped to geomview via togeomview will at least * take 1/10 seconds, regardless whether there really comes an * answer or not. */ fd_set sset; struct timeval tenth = { 0, 100000 }; FD_ZERO(&sset); FD_SET(fd, &sset); for (;;) { if (select(fd+1, &sset, NULL, NULL, &tenth) == 1) { if ((n = read(fd, buffer, sizeof(buffer))) > 0) { write(1, buffer, n); } } else { break; } } } exit(EXIT_SUCCESS); } static void usage(const char *prog) { char buf[BUFSIZ]; setbuf(stderr, buf); fprintf(stderr, "Usage: %s [-c] [-g] [-ps[un|in[6]]] [PIPENAME|HOST:PORT [GVPROG ARGS...]]\n" "Sends lisp-style commands or (with \"-g\") OOGL geometry data to Geomview\n" "(or the program specified by \"GVPROG\"). The transport channel is a\n" "named pipe (\"-p\" switch, default, except on the NeXT), a Unix domain\n" "(\"-s[un]\" switch, default on the NeXT), or a TCP socket, either with the\n" "IPv4 or IPv6 protocol (\"in[6]\" switch). For \"-p\" and \"-s\" a socket\n" "or FIFO special file as given by \"PIPENAME\" is created in\n" "\"/tmp/geomview/\". The default pipename is \"OOGL\". A copy of Geomview\n" "or \"GVPROG\" is started if none listening on the chosen transport medium\n" "is yet running. For TCP sockets this is done only when \"HOST\" refers to\n" "the loopback device.\n" "Examples:\n" " echo '(geometry fred < dodec.off)' | togeomview sam\n" " togeomview -g sin_family = AF_INET; name->sin_port = htons(port); hostinfo = gethostbyname(hostname); if (hostinfo == NULL) { fprintf (stderr, "Unknown host %s.\n", hostname); exit(EXIT_FAILURE); } name->sin_addr = *(struct in_addr *) hostinfo->h_addr; } #endif #if HAVE_INET6_SOCKETS void init_inet6addr(struct sockaddr_in6 *name, const char *hostname, int port) { struct hostent *hostinfo; name->sin6_family = AF_INET6; name->sin6_port = htons(port); hostinfo = gethostbyname(hostname); if (hostinfo == NULL) { fprintf (stderr, "Unknown host %s.\n", hostname); exit(EXIT_FAILURE); } name->sin6_addr = *(struct in6_addr *)hostinfo->h_addr; } #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/Makefile.am0000644000175000001440000000010610600631063013647 00000000000000SUBDIRS = geomview togeomview geomutil animate clipboard gvclock nose geomview-1.9.4/src/bin/Makefile.in0000644000175000001440000003752710665240475013717 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = geomview togeomview geomutil animate clipboard gvclock nose all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/gvclock/0000777000175000001440000000000010665240702013341 500000000000000geomview-1.9.4/src/bin/gvclock/Makefile.am0000644000175000001440000000107610514661163015316 00000000000000module_SCRIPTS = gvclock module_DATA = .geomview-gvclock .geomview-gvclock: echo '(emodule-define "Clock" "gvclock")' > $@ # handled by configure #gvclock: gvclock.in Makefile # sed -e 's,[@]AWK[@],$(AWK),g' < $< > $@ # chmod +x gvclock all-local: $(top_builddir)/modules/.geomview-gvclock $(top_builddir)/modules/.geomview-gvclock: Makefile gvclock $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Clock" "$(subdir)/gvclock")' > $@ chmod +x gvclock CLEANFILES = \ $(top_builddir)/modules/.geomview-gvclock \ $(module_DATA) \ $(module_SCRIPTS) geomview-1.9.4/src/bin/gvclock/Makefile.in0000644000175000001440000003222710665240477015341 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/gvclock DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/gvclock.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = gvclock am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(moduledir)" moduleSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(module_SCRIPTS) SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; moduleDATA_INSTALL = $(INSTALL_DATA) DATA = $(module_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ module_SCRIPTS = gvclock module_DATA = .geomview-gvclock CLEANFILES = \ $(top_builddir)/modules/.geomview-gvclock \ $(module_DATA) \ $(module_SCRIPTS) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/gvclock/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/gvclock/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh gvclock: $(top_builddir)/config.status $(srcdir)/gvclock.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-moduleSCRIPTS: $(module_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_SCRIPTS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f $$d$$p; then \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " $(moduleSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \ $(moduleSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \ else :; fi; \ done uninstall-moduleSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(module_SCRIPTS)'; for p in $$list; do \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \ rm -f "$(DESTDIR)$(moduledir)/$$f"; \ done mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-moduleDATA: $(module_DATA) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(moduleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \ $(moduleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \ done uninstall-moduleDATA: @$(NORMAL_UNINSTALL) @list='$(module_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \ rm -f "$(DESTDIR)$(moduledir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-moduleDATA install-moduleSCRIPTS install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-moduleDATA uninstall-moduleSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-moduleDATA install-moduleSCRIPTS install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-moduleDATA uninstall-moduleSCRIPTS .geomview-gvclock: echo '(emodule-define "Clock" "gvclock")' > $@ # handled by configure #gvclock: gvclock.in Makefile # sed -e 's,[@]AWK[@],$(AWK),g' < $< > $@ # chmod +x gvclock all-local: $(top_builddir)/modules/.geomview-gvclock $(top_builddir)/modules/.geomview-gvclock: Makefile gvclock $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Clock" "$(subdir)/gvclock")' > $@ chmod +x gvclock # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/gvclock/gvclock.in0000755000175000001440000001121710632560351015241 00000000000000#! /bin/sh export LC_ALL="C" exec date | \ @AWK@ ' { unitcube = \ "OFF\n" \ "8 6 0\n" \ "-1 -1 -1\n" \ "1 -1 -1\n" \ "1 1 -1\n" \ "-1 1 -1\n" \ "-1 -1 1\n" \ "1 -1 1\n" \ "1 1 1\n" \ "-1 1 1\n" \ "4 0 1 2 3\n" \ "4 4 5 6 7\n" \ "4 0 4 7 3\n" \ "4 0 1 5 4\n" \ "4 1 5 6 2\n" \ "4 2 6 7 3\n"; printf("(progn ") # Print out the clock face printf("(geometry face { LIST "); printf("{ INST unit { OFF 8 6 0 \n") printf("-.05 .9 -.3\n") printf(".05 .9 -.3\n") printf(".05 1.1 -.3\n") printf("-.05 1.1 -.3\n") printf("-.05 .9 -.1\n") printf(".05 .9 -.1\n") printf(".05 1.1 -.1\n") printf("-.05 1.1 -.1\n") printf("4 0 1 2 3\n") printf("4 4 5 6 7\n") printf("4 0 4 7 3\n") printf("4 0 1 5 4\n") printf("4 1 5 6 2\n") printf("4 2 6 7 3\n") printf("}\ntlist\n") # Not all versions of awk have sin/cos functions, so... split("0 .5 .866 1 .866 .5", table); for(i = 0; i < 6; i++) { sn[i] = table[i+1]; sn[i+6] = -sn[i]; } for(i = 0; i < 12; i++) cs[i] = sn[(i+3) % 12]; for (i = 1; i < 12; ++i) { # ang = i * 3.14159 / 6.0; printf("%g %g 0 0\n", cs[i], -sn[i]); printf("%g %g 0 0\n", sn[i], cs[i]); printf("0 0 1 0\n"); printf("0 0 0 1\n\n"); } printf("}\n"); printf("{appearance {material {diffuse 0 .75 .75}}"); printf("INST\n"); printf("unit OFF\n"); printf("20 12 30\n"); printf(" 1.214124 0.000000 1.589309\n"); printf(" 0.375185 1.154701 1.589309\n"); printf(" -0.982247 0.713644 1.589309\n"); printf(" -0.982247 -0.713644 1.589309\n"); printf(" 0.375185 -1.154701 1.589309\n"); printf(" 1.964494 0.000000 0.375185\n"); printf(" 0.607062 1.868345 0.375185\n"); printf(" -1.589309 1.154701 0.375185\n"); printf(" -1.589309 -1.154701 0.375185\n"); printf(" 0.607062 -1.868345 0.375185\n"); printf(" 1.589309 1.154701 -0.375185\n"); printf(" -0.607062 1.868345 -0.375185\n"); printf(" -1.964494 0.000000 -0.375185\n"); printf(" -0.607062 -1.868345 -0.375185\n"); printf(" 1.589309 -1.154701 -0.375185\n"); printf(" 0.982247 0.713644 -1.589309\n"); printf(" -0.375185 1.154701 -1.589309\n"); printf(" -1.214124 0.000000 -1.589309\n"); printf(" -0.375185 -1.154701 -1.589309\n"); printf(" 0.982247 -0.713644 -1.589309\n"); printf(" 5 0 1 2 3 4\n"); printf(" 5 0 5 10 6 1\n"); printf(" 5 1 6 11 7 2\n"); printf(" 5 2 7 12 8 3\n"); printf(" 5 3 8 13 9 4\n"); printf(" 5 4 9 14 5 0\n"); printf(" 5 15 10 5 14 19\n"); printf(" 5 16 11 6 10 15\n"); printf(" 5 17 12 7 11 16\n"); printf(" 5 18 13 8 12 17\n"); printf(" 5 19 14 9 13 18\n"); printf(" 5 19 18 17 16 15\n"); printf("transform\n"); printf("0.07 0 0 0\n"); printf("0 0.07 0 0\n"); printf("0 0 0.07 0\n"); printf("0 1 -.2 1\n"); printf("}\n"); printf(" })\n"); # Hour hand printf("(geometry hour { INST unit {") print unitcube; printf("}\n") printf("tlist\n") printf(".12 0 0 0\n") printf("0 .28 0 0\n") printf("0 0 .05 0\n") printf("0 .22 0 1\n"); printf("})") # Minute hand printf("(geometry minute { INST unit {") print unitcube; printf("}\n") printf("tlist\n") printf(".07 0 0 0\n") printf("0 .55 0 0\n") printf("0 0 .05 0\n") printf("0 .45 .1 1\n") printf("})\n"); # Second hand printf("(geometry second { INST unit {") print unitcube; printf("}\n") printf("tlist\n") printf(".02 0 0 0\n") printf("0 .6 0 0\n") printf("0 0 .05 0\n") printf("0 .45 .2 1\n") printf("})\n"); printf("(normalization face none)") printf("(normalization hour none)") printf("(normalization minute none)") printf("(normalization second none)") printf("(bbox-draw face no)") printf("(bbox-draw hour no)") printf("(bbox-draw minute no)") printf("(bbox-draw second no)") printf("(merge-ap face {appearance +edge material { diffuse 0 0 .7}})") printf("(merge-ap hour {appearance +edge material { diffuse .54 .15 1}})") printf("(merge-ap minute {appearance +edge material { diffuse .13 .82 .51}})") printf("(merge-ap second {appearance +edge material { diffuse .82 0 0 }})") time = substr($4, 7, 2) + 0.0; printf("(transform-set second world world rotate 0 0 %g)", \ -(time / 60.0) * 3.14159 * 2.0); time = time + (substr($4, 4, 2) + 0.0)*60.0; printf("(transform-set minute world world rotate 0 0 %g)", \ -(time / 3600.0) * 3.14159 * 2.0); time += (substr($4, 1, 2)%12) * 3600.0; printf("(transform-set hour world world rotate 0 0 %g)", \ -(time / 43200.0) * 3.14159 * 2.0); printf("(transform-incr hour world world rotate 0 0 -3.14159 21600)") printf("(transform-incr minute world world rotate 0 0 -3.14159 1800)") printf("(transform-incr second world world rotate 0 0 -3.14159 30)") printf(")") } ' geomview-1.9.4/src/bin/animate/0000777000175000001440000000000010665240702013327 500000000000000geomview-1.9.4/src/bin/animate/xanimate.c0000644000175000001440000003607110455700774015233 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #if HAVE_CONFIG_H # include "config.h" #endif #include #include "mibload.h" #include "animate.h" #include "xanimate.h" #include "interface/animate.mib" #include "interface/info.mib" #include "interface/command.mib" /*****************************************************************************/ /* static global vars */ static XtAppContext App; static Widget TopLevel, AnimList, FileText, CommandText, RangeToggle, OnceToggle, BounceToggle, SpeedScale; static int playing = 0; static long speed = 0L; #define NULL_XtIntervalId ((XtIntervalId)NULL) static XtIntervalId lasttime = NULL_XtIntervalId; /*****************************************************************************/ static void close_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void info_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void bstep_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void fstep_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void play_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void stop_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void load_callback(Widget , XtPointer, XmAnyCallbackStruct *); static void script_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void command_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); static void typecommand_cback(Widget , XtPointer, XmAnyCallbackStruct *); static void frameselect_callback(Widget, XtPointer, XmListCallbackStruct *); static void range_callback(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void once_callback(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void bounce_callback(Widget, XtPointer, XmToggleButtonCallbackStruct *); static void speed_callback(Widget, XtPointer, XmScaleCallbackStruct *); /*****************************************************************************/ void keep_playing(XtPointer); /*****************************************************************************/ static void cinfo_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); void UIloadinterface() { Display *dpy; Widget MainWindow, InfoWindow, CommandWindow, InfoButton, CommandButton, PlayButton, StopButton, BStepButton, FStepButton, LoadButton, ScriptButton, CloseButton, AnimateTitle, InfoTitle, InfoText, InfoClose; XFontStruct *font; XmFontList fontlist; Arg args[10]; int n, oldstderr; int argcblah = 1; char *argvblah[1] = { "Animate" }; mib_Widget *MainForm, *InfoForm, *CommandForm; String fallbacks[] = { #ifdef dark_ui "*Foreground: gray20", "*Background: gray70", #endif #ifdef light_ui "*Foreground: #000000000000", "*Background: #afafafafafaf", #endif "*BorderWidth: 0", "*XmToggleButton.selectColor: yellow", "*XmToggleButton.indicatorSize: 16", "*XmToggleButtonGadget.selectColor: yellow", "*XmToggleButtonGadget.indicatorSize: 16", "*XmTextField.background: #cc7777", "*fontList:\ -adobe-helvetica-medium-r-normal--14-100-100-100-p-76-iso8859-1", NULL}; /* initialize application top level widget */ TopLevel = XtVaAppInitialize(&App, "animate", NULL, 0, &argcblah, argvblah, fallbacks, NULL); dpy = XtDisplay(TopLevel); oldstderr = dup(fileno(stderr)); freopen("/dev/null", "w", stderr); /* configure resize policy of window */ XtVaSetValues(TopLevel, XmNminWidth, 272, XmNminHeight, 319, XmNkeyboardFocusPolicy, XmPOINTER, NULL); /* create the application windows */ MainWindow = XtCreateManagedWidget("MainWindow", xmMainWindowWidgetClass, TopLevel, NULL, 0); /*****************************************************************************/ n = 0; XtSetArg(args[n], XmNminWidth, 359); n++; XtSetArg(args[n], XmNminHeight, 197); n++; XtSetArg(args[n], XmNtitle, "Info"); n++; InfoWindow = XmCreateFormDialog(MainWindow, "Info", args, n); /*****************************************************************************/ n = 0; XtSetArg(args[n], XmNminWidth, 365); n++; XtSetArg(args[n], XmNminHeight, 64); n++; XtSetArg(args[n], XmNmaxHeight, 64); n++; XtSetArg(args[n], XmNtitle, "Command"); n++; XtSetArg(args[n], XmNkeyboardFocusPolicy, XmPOINTER); n++; CommandWindow = XmCreateFormDialog(MainWindow, "Command", args, n); /*****************************************************************************/ /* load the interface via the mib library */ /* MainForm = mib_load_interface(MainWindow, "interface/animate.mib", MI_FROMFILE); InfoForm = mib_load_interface(InfoWindow, "interface/info.mib", MI_FROMFILE); CommandForm = mib_load_interface(CommandWindow, "interface/command.mib", MI_FROMFILE); */ MainForm = mib_load_interface(MainWindow, AnimRoot, MI_FROMSTRING); InfoForm = mib_load_interface(InfoWindow, InfoRoot, MI_FROMSTRING); CommandForm = mib_load_interface(CommandWindow, CommRoot, MI_FROMSTRING); /* Get widget pointers from interface */ AnimateTitle = mib_find_name(MainForm, "AnimateTitle")->me; CloseButton = mib_find_name(MainForm, "CloseButton")->me; InfoButton = mib_find_name(MainForm, "InfoButton")->me; CommandButton = mib_find_name(MainForm, "CommandButton")->me; ScriptButton = mib_find_name(MainForm, "Script")->me; LoadButton = mib_find_name(MainForm, "Load")->me; PlayButton = mib_find_name(MainForm, "Play")->me; StopButton = mib_find_name(MainForm, "Stop")->me; BStepButton = mib_find_name(MainForm, "BStep")->me; FStepButton = mib_find_name(MainForm, "FStep")->me; SpeedScale = mib_find_name(MainForm, "SpeedScale")->me; FileText = mib_find_name(MainForm, "FileText")->me; AnimList = mib_find_name(MainForm, "AnimList")->me; RangeToggle = mib_find_name(MainForm, "Range")->me; OnceToggle = mib_find_name(MainForm, "Once")->me; BounceToggle = mib_find_name(MainForm, "Bounce")->me; InfoTitle = mib_find_name(InfoForm, "Title")->me; InfoText = mib_find_name(InfoForm, "TextBig")->me; InfoClose = mib_find_name(InfoForm, "Close")->me; CommandText = mib_find_name(CommandForm, "TextBox")->me; /* Set large font for titles */ font = XLoadQueryFont(dpy, "-adobe-helvetica-bold-r-normal--24-240-75-75-p-138-iso8859-1"); fontlist = XmFontListCreate(font, "bigger"); XtVaSetValues(AnimateTitle, XmNfontList, fontlist, NULL); XtVaSetValues(InfoTitle, XmNfontList, fontlist, NULL); /* Set various resources and values */ XtVaSetValues(InfoText, XmNcursorPositionVisible, False, XmNeditable, False, NULL); XmTextSetString(InfoText, get_info()); XtVaSetValues(AnimList, XmNselectionPolicy, XmEXTENDED_SELECT, NULL); XmScaleSetValue(SpeedScale, 100); /* Set callbacks - stupid @#$@&%!@# boiler plate code */ XtAddCallback(CloseButton, XmNactivateCallback, (XtCallbackProc)close_callback, (XtPointer)NULL ); XtAddCallback(InfoButton, XmNactivateCallback, (XtCallbackProc)info_callback, (XtPointer)InfoWindow ); XtAddCallback(InfoClose, XmNactivateCallback, (XtCallbackProc)cinfo_callback, (XtPointer)InfoWindow ); XtAddCallback(BStepButton, XmNactivateCallback, (XtCallbackProc)bstep_callback, (XtPointer)NULL ); XtAddCallback(FStepButton, XmNactivateCallback, (XtCallbackProc)fstep_callback, (XtPointer)NULL ); XtAddCallback(PlayButton, XmNactivateCallback, (XtCallbackProc)play_callback, (XtPointer)NULL ); XtAddCallback(StopButton, XmNactivateCallback, (XtCallbackProc)stop_callback, (XtPointer)NULL ); XtAddCallback(LoadButton, XmNactivateCallback, (XtCallbackProc)load_callback, (XtPointer)FileText ); XtAddCallback(FileText, XmNactivateCallback, (XtCallbackProc)load_callback, (XtPointer)FileText ); XtAddCallback(ScriptButton, XmNactivateCallback, (XtCallbackProc)script_callback, (XtPointer)FileText ); XtAddCallback(CommandButton, XmNactivateCallback, (XtCallbackProc)command_callback, (XtPointer)CommandWindow ); XtAddCallback(AnimList, XmNdefaultActionCallback, (XtCallbackProc)frameselect_callback, (XtPointer)NULL ); XtAddCallback(RangeToggle, XmNvalueChangedCallback, (XtCallbackProc)range_callback, (XtPointer)NULL ); XtAddCallback(OnceToggle, XmNvalueChangedCallback, (XtCallbackProc)once_callback, (XtPointer)NULL ); XtAddCallback(BounceToggle, XmNvalueChangedCallback, (XtCallbackProc)bounce_callback, (XtPointer)NULL ); XtAddCallback(CommandText, XmNactivateCallback, (XtCallbackProc)typecommand_cback, (XtPointer)CommandWindow ); XtAddCallback(SpeedScale, XmNdragCallback, (XtCallbackProc)speed_callback, (XtPointer)NULL ); freopen("/dev/null", "w", stderr); dup2(oldstderr, fileno(stderr)); close(oldstderr); /* Bring the application window up on the screen. */ } void UIshowinterface() { XtRealizeWidget(TopLevel); } void UImainloop() { /* Begin main Intrinsics event loop */ XtAppMainLoop (App); } /*****************************************************************************/ void UIclearlist() { XmListDeleteAllItems(AnimList); } /*****************************************************************************/ void UIaddlist(char *line) { XmString item = XmStringCreateSimple(line); XmListAddItem(AnimList, item, 0); /* add item to the end of the list */ XmStringFree(item); } /*****************************************************************************/ void UIsetframe(char *line) { XmTextFieldSetString(FileText, line); } /*****************************************************************************/ int UIgetselected(int **pos_list, int *pos_count) { return (int)XmListGetSelectedPos(AnimList, pos_list, pos_count); } /*****************************************************************************/ void UIstartplay() { if (playing) return; lasttime = XtAppAddTimeOut(App, speed, (XtTimerCallbackProc)keep_playing, (XtPointer) NULL); playing = 1; } void UIstopplay() { playing = 0; if (lasttime != NULL_XtIntervalId) { XtRemoveTimeOut(lasttime); lasttime = NULL_XtIntervalId; } } /*****************************************************************************/ void keep_playing(XtPointer data) { XEvent xev; lasttime = NULL_XtIntervalId; if (playing) { while (XtAppPending(App)) /* clear out event queue */ { /* before adding another timeout. */ XtAppNextEvent(App, &xev); XtDispatchEvent(&xev); } if (lasttime == NULL_XtIntervalId) lasttime = XtAppAddTimeOut(App, speed, (XtTimerCallbackProc)keep_playing, (XtPointer) NULL); anim_playing(); } } /*****************************************************************************/ void UIsetRange(int val) { XmToggleButtonSetState(RangeToggle, val, False); } /*****************************************************************************/ void UIsetOnce(int val) { XmToggleButtonSetState(OnceToggle, val, False); } /*****************************************************************************/ void UIsetBounce(int val) { XmToggleButtonSetState(BounceToggle, val, False); } /*****************************************************************************/ void UIsetSpeed(int val) { XmScaleSetValue(SpeedScale, val); if (val == 0) speed = 60000L; else if (val > 0) speed = (long) ((100.0 - (float)val) * (100.0 - (float)val) * (100.0 - (float)val) / 100.0) + 30L; } /*****************************************************************************/ static void close_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { anim_close(); } static void info_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { XtManageChild((Widget)data); } static void cinfo_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { XtUnmanageChild((Widget)data); } static void command_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { XtManageChild((Widget)data); } static void bstep_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { anim_stop(); anim_stepb(); } static void fstep_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { anim_stop(); anim_stepf(); } static void play_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { anim_play(); } static void stop_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { anim_stop(); } static void load_callback( Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { char *str; str = XmTextFieldGetString((Widget)data); anim_load(str); XtFree(str); } static void script_callback( Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { char *str; str = XmTextFieldGetString((Widget)data); anim_loadscript(str); XtFree(str); } static void frameselect_callback( Widget w, XtPointer data, XmListCallbackStruct *cbs) { anim_stop(); anim_goframe(cbs->item_position - 1); } static void range_callback( Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { anim_range(cbs->set); } static void once_callback( Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { anim_once(cbs->set); } static void bounce_callback( Widget w, XtPointer data, XmToggleButtonCallbackStruct *cbs) { anim_bounce(cbs->set); } static void typecommand_cback( Widget w, XtPointer data, XmAnyCallbackStruct *cbs) { char *str; str = XmTextFieldGetString(CommandText); anim_setcommand(str); XtFree(str); XtUnmanageChild((Widget)data); } static void speed_callback( Widget w, XtPointer data, XmScaleCallbackStruct *cbs) { int rmv = 0; if (lasttime != NULL_XtIntervalId) /* get rid of old timeout */ { XtRemoveTimeOut(lasttime); lasttime = NULL_XtIntervalId; rmv = 1; /* removed timeout */ } if (cbs->value == 0) speed = 60000L; else if (cbs->value > 0) speed = (long) ((100.0 - (float)cbs->value) * (100.0 - (float)cbs->value) * (100.0 - (float)cbs->value) / 100.0) + 30L; if (rmv) lasttime = XtAppAddTimeOut(App, speed, (XtTimerCallbackProc)keep_playing, (XtPointer) NULL); } geomview-1.9.4/src/bin/animate/xanimate.h0000644000175000001440000000226110455700774015232 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ void UIloadinterface(); void UIshowinterface(); void UImainloop(); void UIclearlist(); void UIaddlist(char *); void UIsetframe(char *); void UIstartplay(); void UIstopplay(); int UIgetselected(int **, int *); void UIsetRange(int); void UIsetOnce(int); void UIsetBounce(int); void UIsetSpeed(int); geomview-1.9.4/src/bin/animate/animate.1gv0000644000175000001440000001056310600600312015267 00000000000000.TH animate 1gv "December 12, 1994" " " "Geomview Module" .SH NAME animate \- animate a sequence of geomview files .SH SYNOPSIS .nf animate [-p] [-b] [-s speed] [-o] [-S script] [-hide] [-f file1 file2 ...] .fi .SH DESCRIPTION .PP Animate is an interactive animation tool specifically designed to be used with Geomview. It provides several simple animation controls such as looping, bouncing, and single frame stepping, as well as adjustable speed playing. The program works by telling geomview to read in a sequence of geomview files and then telling geomview to display each frame of the sequence in order. .PP There are two methods that Animate provides for specifying which frames one wants to have in the sequence being viewed. The first method is to enter the name of every frame into the text input box and press return or click on load. The name of each frame must correspond with the name of a geomview file existing in the file system. .nf EXAMPLES pict1 pict2 pict3 pict4 pict* pic?? .fi .PP The second method of loading frames is to first create an animation script file outside of animate and then load the script in by typing its name in the input box and clicking on the script button. The advantage of this method is that you can more easily specify the exact order in which you want the frames to be shown. The format of the script file is a list of frame names each followed by a newline. Comments prepended by a # sign are allowed. .nf EXAMPLE SCRIPT FILE # list of frames for # my rotating cube movie cube.02 cube.04 cube.03 # get rid of this frame later cube.01 . . . cube.90 .fi .PP Loading frames into memory may take a little time, especially if each frame is a particularly large file. Be sure the machine you're using has sufficient memory to load all the frames you desire. Once all frames have been loaded, an 'animate' object will appear in the geomview object browser. It is now possible to begin animating. .PP Scrolling through frames can be accomplished in several different ways. The first, and most obvious way is by 'playing' the frames. Clicking on the \fBPlay\fP button causes animate to begin playing through the frames in order, starting with the first frame or whichever frame has been selected. The corresponding name of each frame being shown is shown in the pink text-entry box. Click on \fBStop\fP to cease playing. .PP Animation speed depends on the size and complexity of the object in each frame. Thus different sequences can have considerably different top playing speeds. Use the \fBSpeed\fP slider to set an upper limit to the animation rate. You can also play slowly through the frames can also by clicking repeatedly on either step button. .PP Press the \fBBounce\fP button to enter bounce mode. While in bounce mode, direction of play reverses whenever the first or last frame is reached. Clicking on either \fBStep\fP button determines the playing direction. .PP Clicking on \fBOnce\fP puts animate in 'once' mode. While in this mode, upon reaching the first or last frame (depending on which direction you are going) of a specified sequence, animate will stop playing. Normal playing can be resumed by clicking on \fBOnce\fP again to exit this mode. .PP The \fBInfo\fP button will bring up a short menu containing helpful hints for program usage. Clicking on the exit button will cause the program to exit. .SH OPTIONS .TP -p Start playing through the frames right away upon startup. .TP -b Go into bounce mode upon startup. .TP -s speed Set the speed of play upon startup. The value of speed may be an integer between 0 and 100 which roughly signifies the percentage of top playing speed. .TP -o Set animation to play through only once upon startup. .TP -S script Specify name of script containing filenames for objects to be read in upon startup. Takes precedence over -f option if present. .TP -hide Makes animate invisible upon startup. *Warning* all animate commands must be specified on the command line when this option is used since there is no way to access the main window. .TP -f file1 file2 ... Specify names of files containing objects to be read in upon startup. .SH BUGS .PP When loading sequences one after another, geomview will often not load a sequence on the first try. This can often be remedied by telling animate to load the sequence yet again. .PP .SH SEE ALSO geomview(1) oogl(5) .SH AUTHOR .nf Daeron Meyer The Geometry Center .fi geomview-1.9.4/src/bin/animate/glob.c0000644000175000001440000002635710461140700014336 00000000000000/* * Copyright (c) 1980 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if 0 #ifndef lint static char sccsid[] = "@(#)glob.c 5.7 (Berkeley) 12/14/88"; #endif /* not lint */ #endif #if HAVE_CONFIG_H # include "config.h" #endif /* * C-shell glob for random programs. */ #include #include #include #include #include #include #include #include #include #include #if !defined(dirfd) && !defined(__GLIBC__) && !defined(__linux__) && !defined(__FreeBSD__) && !defined(__CYGWIN__) #define dirfd(dirp) ((dirp)->dd_fd) #endif #ifndef NCARGS #define NCARGS 10240 #endif #define QUOTE 0200 #define TRIM 0177 #define eq(a,b) (strcmp(a, b)==0) #define GAVSIZ (NCARGS/6) #define isdir(d) ((d.st_mode & S_IFMT) == S_IFDIR) static char **gargv; /* Pointer to the (stack) arglist */ static int gargc; /* Number args in gargv */ static int gnleft; static short gflag; static int tglob(); char **glob(); static void rscan(char **, int ()); static void ginit(char **); static void collect(char *); static void acollect(char *); static void sort(); static void expand(char *); static void matchdir(char *); static int execbrc(char *, char *); static int match(char *, char *); static int amatch(char *, char *); static int Gmatch(char *, char *); static void Gcat(char *, char *); static void addpath(char); static void fatal(char *); /*static void scan(char **, int ());*/ char *globerr; char *home; struct passwd *getpwnam(); extern int errno; static char *strspl(), *strend(); /*char *malloc(), *strcpy(), *strcat(); */ char **copyblk(); static int globcnt; char *globchars = "`{[*?"; static char *gpath, *gpathp, *lastgpathp; static int globbed; static char *entp; static char **sortbas; void blkfree(); int letter(); int digit(); int gethdir(); int any(); char ** glob(v) char *v; { char agpath[BUFSIZ]; char *agargv[GAVSIZ]; char *vv[2]; vv[0] = v; vv[1] = 0; gflag = 0; rscan(vv, tglob); if (gflag == 0) return (copyblk(vv)); globerr = 0; gpath = agpath; gpathp = gpath; *gpathp = 0; lastgpathp = &gpath[sizeof agpath - 2]; ginit(agargv); globcnt = 0; collect(v); if (globcnt == 0 && (gflag&1)) { blkfree(gargv), gargv = 0; return (0); } else return (gargv = copyblk(gargv)); } static void ginit(agargv) char **agargv; { agargv[0] = 0; gargv = agargv; sortbas = agargv; gargc = 0; gnleft = NCARGS - 4; } static void collect(as) char *as; { if (eq(as, "{") || eq(as, "{}")) { Gcat(as, ""); sort(); } else acollect(as); } static void acollect(as) char *as; { int ogargc = gargc; gpathp = gpath; *gpathp = 0; globbed = 0; expand(as); if (gargc != ogargc) sort(); } static void sort() { char **p1, **p2, *c; char **Gvp = &gargv[gargc]; p1 = sortbas; while (p1 < Gvp-1) { p2 = p1; while (++p2 < Gvp) if (strcmp(*p1, *p2) > 0) c = *p1, *p1 = *p2, *p2 = c; p1++; } sortbas = Gvp; } static void expand(as) char *as; { char *cs; char *sgpathp, *oldcs; struct stat stb; sgpathp = gpathp; cs = as; if (*cs == '~' && gpathp == gpath) { addpath('~'); for (cs++; letter(*cs) || digit(*cs) || *cs == '-';) addpath(*cs++); if (!*cs || *cs == '/') { if (gpathp != gpath + 1) { *gpathp = 0; if (gethdir(gpath + 1)) globerr = "Unknown user name after ~"; (void) strcpy(gpath, gpath + 1); } else { if(home == NULL) { struct passwd *pp; extern char *getenv(); home = getenv("HOME"); if(home == NULL) { pp = getpwuid(getuid()); if(pp != NULL) home = pp->pw_dir; } } if(home == NULL) { home = ""; globerr = "Can't determine own home directory"; } else { (void) strcpy(gpath, home); } } gpathp = strend(gpath); } } while (!any(*cs, globchars)) { if (*cs == 0) { if (!globbed) Gcat(gpath, ""); else if (stat(gpath, &stb) >= 0) { Gcat(gpath, ""); globcnt++; } goto endit; } addpath(*cs++); } oldcs = cs; while (cs > as && *cs != '/') cs--, gpathp--; if (*cs == '/') cs++, gpathp++; *gpathp = 0; if (*oldcs == '{') { (void) execbrc(cs, ((char *)0)); return; } matchdir(cs); endit: gpathp = sgpathp; *gpathp = 0; } static void matchdir(pattern) char *pattern; { struct stat stb; struct dirent *dp; DIR *dirp; dirp = opendir(gpath[0] == '\0' ? "." : gpath); if (dirp == NULL) { if (globbed) return; goto patherr2; } if (fstat(dirfd(dirp), &stb) < 0) goto patherr1; if (!isdir(stb)) { errno = ENOTDIR; goto patherr1; } while ((dp = readdir(dirp)) != NULL) { if (dp->d_ino == 0) continue; if (match(dp->d_name, pattern)) { Gcat(gpath, dp->d_name); globcnt++; } } closedir(dirp); return; patherr1: closedir(dirp); patherr2: globerr = "Bad directory components"; } static int execbrc(p, s) char *p, *s; { char restbuf[BUFSIZ + 2]; char *pe, *pm, *pl; int brclev = 0; char *lm, savec, *sgpathp; for (lm = restbuf; *p != '{'; *lm++ = *p++) continue; for (pe = ++p; *pe; pe++) switch (*pe) { case '{': brclev++; continue; case '}': if (brclev == 0) goto pend; brclev--; continue; case '[': for (pe++; *pe && *pe != ']'; pe++) continue; continue; } pend: brclev = 0; for (pl = pm = p; pm <= pe; pm++) switch (*pm & (QUOTE|TRIM)) { case '{': brclev++; continue; case '}': if (brclev) { brclev--; continue; } goto doit; case ','|QUOTE: case ',': if (brclev) continue; doit: savec = *pm; *pm = 0; (void) strcpy(lm, pl); (void) strcat(restbuf, pe + 1); *pm = savec; if (s == 0) { sgpathp = gpathp; expand(restbuf); gpathp = sgpathp; *gpathp = 0; } else if (amatch(s, restbuf)) return (1); sort(); pl = pm + 1; if (brclev) return (0); continue; case '[': for (pm++; *pm && *pm != ']'; pm++) continue; if (!*pm) pm--; continue; } if (brclev) goto doit; return (0); } static int match(s, p) char *s, *p; { int c; char *sentp; char sglobbed = globbed; if (*s == '.' && *p != '.') return (0); sentp = entp; entp = s; c = amatch(s, p); entp = sentp; globbed = sglobbed; return (c); } static int amatch(s, p) char *s, *p; { int scc; int ok, lc; char *sgpathp; struct stat stb; int c, cc; globbed = 1; for (;;) { scc = *s++ & TRIM; switch (c = *p++) { case '{': return (execbrc(p - 1, s - 1)); case '[': ok = 0; lc = 077777; while ((cc = *p++)) { if (cc == ']') { if (ok) break; return (0); } if (cc == '-') { if (lc <= scc && scc <= *p++) ok++; } else if (scc == (lc = cc)) ok++; } if ((cc == 0)) { if (ok) { p--; } else { return 0; } } continue; case '*': if (!*p) return (1); if (*p == '/') { p++; goto slash; } s--; do { if (amatch(s, p)) return (1); } while (*s++); return (0); case 0: return (scc == 0); default: if (c != scc) return (0); continue; case '?': if (scc == 0) return (0); continue; case '/': if (scc) return (0); slash: s = entp; sgpathp = gpathp; while (*s) addpath(*s++); addpath('/'); if (stat(gpath, &stb) == 0 && isdir(stb)) { if (*p == 0) { Gcat(gpath, ""); globcnt++; } else { expand(p); } } gpathp = sgpathp; *gpathp = 0; return (0); } } } static int Gmatch(s, p) char *s, *p; { int scc; int ok, lc; int c, cc; for (;;) { scc = *s++ & TRIM; switch (c = *p++) { case '[': ok = 0; lc = 077777; while ((cc = *p++)) { if (cc == ']') { if (ok) break; return (0); } if (cc == '-') { if (lc <= scc && scc <= *p++) ok++; } else if (scc == (lc = cc)) ok++; } if ((cc == 0)) { if (ok) { p--; } else { return 0; } } continue; case '*': if (!*p) return (1); for (s--; *s; s++) if (Gmatch(s, p)) return (1); return (0); case 0: return (scc == 0); default: if ((c & TRIM) != scc) return (0); continue; case '?': if (scc == 0) return (0); continue; } } } static void Gcat(s1, s2) char *s1, *s2; { int len = strlen(s1) + strlen(s2) + 1; if (len >= gnleft || gargc >= GAVSIZ - 1) globerr = "Arguments too long"; else { gargc++; gnleft -= len; gargv[gargc] = 0; gargv[gargc - 1] = strspl(s1, s2); } } static void addpath(char c) { if (gpathp >= lastgpathp) globerr = "Pathname too long"; else { *gpathp++ = c; *gpathp = 0; } } static void rscan(t, f) char **t; int (*f)(); { char *p, c; while ((p = *t++)) { if (f == tglob) { if (*p == '~') { gflag |= 2; } else if (eq(p, "{") || eq(p, "{}")) { continue; } } while ((c = *p++)) (*f)(c); } } /* static void scan(t, f) char **t; int (*f)(); { char *p, c; while (p = *t++) while (c = *p) *p++ = (*f)(c); } */ static int tglob(c) char c; { if (any(c, globchars)) gflag |= c == '{' ? 2 : 1; return (c); } /* static void trim(c) char c; { return (c & TRIM); } */ int letter(c) char c; { return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'); } int digit(c) char c; { return (c >= '0' && c <= '9'); } int any(c, s) int c; char *s; { while (*s) if (*s++ == c) return(1); return(0); } int blklen(av) char **av; { int i = 0; while (*av++) i++; return (i); } char ** blkcpy(oav, bv) char **oav; char **bv; { char **av = oav; while ((*av++ = *bv++)) continue; return (oav); } void blkfree(av0) char **av0; { char **av = av0; while (*av) free(*av++); } static char * strspl(cp, dp) char *cp, *dp; { char *ep = malloc((unsigned)(strlen(cp) + strlen(dp) + 1)); if (ep == (char *)0) fatal("Out of memory"); (void) strcpy(ep, cp); (void) strcat(ep, dp); return (ep); } char ** copyblk(v) char **v; { char **nv = (char **)malloc((unsigned)((blklen(v) + 1) * sizeof(char **))); if (nv == (char **)0) fatal("Out of memory"); return (blkcpy(nv, v)); } static char * strend(cp) char *cp; { while (*cp) cp++; return (cp); } /* * Extract a home directory from the password file * The argument points to a buffer where the name of the * user whose home directory is sought is currently. * We write the home directory of the user back there. */ int gethdir(home) char *home; { struct passwd *pp = getpwnam(home); if (!pp || home + strlen(pp->pw_dir) >= lastgpathp) return (1); (void) strcpy(home, pp->pw_dir); return (0); } static void fatal(s) char *s; { fprintf( stderr, "glob: %s\n", s ); exit(1); } geomview-1.9.4/src/bin/animate/glob.h0000644000175000001440000000163510461140700014333 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ char **glob(char *); geomview-1.9.4/src/bin/animate/Makefile.am0000644000175000001440000000154610622716743015313 00000000000000INCLUDES = $(default_includes) $(MOTIFINCLUDE) SUBDIRS = interface EXTRA_DIST = animate.1gv man_MANS = animate.1gv module_PROGRAMS = animate animate_SOURCES = \ animate.c xanimate.c glob.c animate.h glob.h xanimate.h \ interface/animate.mib interface/command.mib interface/info.mib animate_LDADD = $(MOTIFUILIB) $(MOTIFLIBS) $(XMULIBS) $(XLIBS) #animate_LDFLAGS = -rpath $(libdir) module_DATA = .geomview-animate .geomview-animate: echo '(emodule-define "Animator" "animate")' > .geomview-animate # Populate local "modules" directory, allowing animate to run in the build dir. all-local: $(top_builddir)/modules/.geomview-animate $(top_builddir)/modules/.geomview-animate: Makefile $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Animator" "$(subdir)/animate")' > $@ CLEANFILES = $(top_builddir)/modules/.geomview-animate $(module_DATA) geomview-1.9.4/src/bin/animate/Makefile.in0000644000175000001440000005646010665240475015332 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ module_PROGRAMS = animate$(EXEEXT) subdir = src/bin/animate DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(moduledir)" modulePROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(module_PROGRAMS) am_animate_OBJECTS = animate.$(OBJEXT) xanimate.$(OBJEXT) \ glob.$(OBJEXT) animate_OBJECTS = $(am_animate_OBJECTS) am__DEPENDENCIES_1 = animate_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(animate_SOURCES) DIST_SOURCES = $(animate_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; moduleDATA_INSTALL = $(INSTALL_DATA) DATA = $(module_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) $(MOTIFINCLUDE) SUBDIRS = interface EXTRA_DIST = animate.1gv man_MANS = animate.1gv animate_SOURCES = \ animate.c xanimate.c glob.c animate.h glob.h xanimate.h \ interface/animate.mib interface/command.mib interface/info.mib animate_LDADD = $(MOTIFUILIB) $(MOTIFLIBS) $(XMULIBS) $(XLIBS) #animate_LDFLAGS = -rpath $(libdir) module_DATA = .geomview-animate CLEANFILES = $(top_builddir)/modules/.geomview-animate $(module_DATA) all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/animate/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/animate/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-modulePROGRAMS: $(module_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(modulePROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(moduledir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(modulePROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(moduledir)/$$f" || exit 1; \ else :; fi; \ done uninstall-modulePROGRAMS: @$(NORMAL_UNINSTALL) @list='$(module_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \ rm -f "$(DESTDIR)$(moduledir)/$$f"; \ done clean-modulePROGRAMS: @list='$(module_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done animate$(EXEEXT): $(animate_OBJECTS) $(animate_DEPENDENCIES) @rm -f animate$(EXEEXT) $(LINK) $(animate_OBJECTS) $(animate_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/animate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glob.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xanimate.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done install-moduleDATA: $(module_DATA) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(moduleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \ $(moduleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \ done uninstall-moduleDATA: @$(NORMAL_UNINSTALL) @list='$(module_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \ rm -f "$(DESTDIR)$(moduledir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) all-local installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-modulePROGRAMS \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-man install-moduleDATA install-modulePROGRAMS install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-man1 install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-moduleDATA \ uninstall-modulePROGRAMS uninstall-man: uninstall-man1 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am all-local check check-am clean clean-generic \ clean-libtool clean-modulePROGRAMS ctags ctags-recursive \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man1 install-moduleDATA \ install-modulePROGRAMS install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am uninstall-man \ uninstall-man1 uninstall-moduleDATA uninstall-modulePROGRAMS .geomview-animate: echo '(emodule-define "Animator" "animate")' > .geomview-animate # Populate local "modules" directory, allowing animate to run in the build dir. all-local: $(top_builddir)/modules/.geomview-animate $(top_builddir)/modules/.geomview-animate: Makefile $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Animator" "$(subdir)/animate")' > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/animate/animate.c0000644000175000001440000003564110622716743015044 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include "glob.h" #include "animate.h" #include "xanimate.h" /*****************************************************************************/ /* static global vars: */ static char **frames = NULL; static int numframes = 0; static int curframe = 0; static int range = 0; static int bounce = 0; static int once = 0; static int direction = 1; static int hidden = 0; static int willplay = 0; static int mypid; static char *command = NULL; /*****************************************************************************/ /* static functions: */ static void clear_frames(); static void anim_parse_args(int, char **); /*****************************************************************************/ void anim_close() { clear_frames(); exit(0); } /*****************************************************************************/ static void showusage() { fprintf(stderr,"Incorrect command line arguments.\n"); fprintf(stderr,"Usage: animate [-w posx posy] [-p] [-b] [-s speed] [-o] [-S script] [-hide]\n\t\t[-f file1 file2 ...]\n"); anim_close(); } /*****************************************************************************/ static char *concat_strings(char **str, int numstr) { int length = 0, n, pos, ch; char *scrbuf; for (n = 0; n < numstr; n++) length += (strlen(str[n]) + 1); length += 10; /* for good measure :-) */ scrbuf = (char *) malloc(sizeof(char) * length); pos = 0; scrbuf[pos] = '{'; pos++; for (n = 0; n < numstr; n++) { for (ch = 0; ch < strlen(str[n]); ch++) { scrbuf[pos] = (str[n])[ch]; pos++; } scrbuf[pos] = ','; pos++; } scrbuf[pos] = '}'; scrbuf[pos + 1] = '\0'; return scrbuf; } /*****************************************************************************/ static void anim_parse_args(int argc, char *argv[]) { int argnum = 1, dlen = 0, tmp = 0, scriptin = 0; char *darg = NULL, *str; if (argc == 1) return; while (argnum < argc) { if ((*argv[argnum] == '-') && ((dlen = strlen(argv[argnum])) >= 2)) { darg = argv[argnum]; darg++; if (dlen == 2) { if (*darg == 'p') { willplay = 1; argnum++; } else if (*darg == 'b') { UIsetBounce(1); anim_bounce(1); argnum++; } else if (*darg == 's') { if ((argc-argnum) < 2) showusage(); if (!sscanf(argv[argnum+1], "%d", &tmp)) showusage(); UIsetSpeed(tmp); argnum += 2; } else if (*darg == 'o') { UIsetOnce(1); anim_once(1); argnum++; } else if (*darg == 'f') { if ((argc-argnum) < 2) showusage(); if (scriptin) { fprintf(stderr, "Can\'t use -S and -f simultaneously.\n"); fprintf(stderr, "Defaulted to -S.\n"); } else { str = concat_strings( &(argv[argnum + 1]), argc - argnum - 1); anim_load(str); free(str); } argnum = argc; } else if (*darg == 'S') { if ((argc-argnum) < 2) showusage(); anim_loadscript( argv[argnum + 1]); scriptin = 1; argnum += 2; } else if (*darg == 'w') { fprintf(stderr,"Window positioning not currently available.\n"); argnum += 3; } } else if ((dlen == 5) && (!strcmp(darg, "hide"))) { hidden = 1; argnum++; } else showusage(); } } } /*****************************************************************************/ int main(int argc, char *argv[]) { mypid = (int) getpid(); UIloadinterface(); anim_parse_args(argc, argv); if (!hidden) UIshowinterface(); if (willplay) anim_play(); UImainloop(); return 0; } /*****************************************************************************/ char *get_info() { static char info[] = "By Daeron Meyer\n\ Version 1.0X\n\ Copyright (c) 1994\n\ The Geometry Center\n\ www.geomview.org\n\ \n\ Geom-Animator is free software and is designed\n\ to be used as an animation tool for Geomview.\n\ It provides several simple animation controls such\n\ as playing, stopping, bouncing, single frame\n\ stepping, as well as going through frames once,\n\ then stopping. It also has the capability to\n\ confine frame playing to a subset of the total\n\ frames with the Range toggle. A brief description\n\ of functionality is included but for a more\n\ complete tutorial, please read the man pages.\n\ \n\ To read in a list of frames, enter their names\n\ in the input box at the bottom of the main panel\n\ and press click on Load. The input box should\n\ also accept any regular expressions. To read\n\ in a script containing a list of frames type\n\ the name of the script in the input box and click\n\ on the Script button.\n\ \n\ Once the frames have been read in (the animate\n\ object will appear in the geomview object\n\ browser) one can scroll through the frames by\n\ clicking on play or clicking on the forward or\n\ backward step buttons. To go directly to a frame,\n\ double click on the list entry for that frame.\n\ Clicking on stop will cause Animator to stop\n\ playing frames. The speed at which frames are\n\ playing can be adjusted using the speed slider.\n\ \n\ Clicking on the once button will set up Animator\n\ to go through a sequence of frames only once\n\ when you click on Play, then cause it to stop on\n\ the last or first frame (depending on the direction\n\ you are playing in).\n\ \n\ Toggling the Bounce button on will put Animator\n\ in bounce mode. This means that once the last\n\ or first frame is reached (while playing frames)\n\ the direction of play will automatically be\n\ reversed.\n\ \n\ Toggling the Range button on will put Animator\n\ in range mode. In this mode, Animator confines\n\ itself to looping through only the frames that\n\ have been outlined in the frame list."; return info; } /*****************************************************************************/ static void clear_frames() { int n; if (numframes == 0) return; fprintf(stdout,"(progn\n"); for (n = 0; n < numframes; n++) { fprintf(stdout, "(read geometry { define a%d-%d { LIST } } )\n", n, mypid); free(frames[n]); } fprintf(stdout,")\n"); fflush(stdout); free(frames); frames = NULL; numframes = 0; } /*****************************************************************************/ static void load_frames(char **new_frames) { char ret = '\0'; frames = new_frames; numframes = 0; UIclearlist(); while ((frames[numframes] != NULL) && (*frames[numframes] != '\0')) { fprintf( stdout, "(read geometry { define a%d-%d < \"%s\" } )\n", numframes, mypid, frames[numframes]); fprintf( stdout, "(read geometry { define anim%d { LIST : a%d-%d } } )\n", mypid, numframes, mypid); fprintf( stdout, "(echo q)\n"); fflush(stdout); ret = (char) fgetc(stdin); if (ret != 'q') anim_close(); /* something must be terribly wrong */ UIaddlist(frames[numframes]); numframes++; } curframe = 0; anim_goframe(curframe); } /*****************************************************************************/ void anim_goframe(int num) { char ret = '\0'; if (num >= numframes) return; curframe = num; /* in case UI is calling this */ fprintf( stdout, "(read geometry { define anim%d { LIST : a%d-%d } } )\n", mypid, num, mypid); if (command) fprintf( stdout, command, num); fprintf( stdout, "\n(echo q)\n"); fflush(stdout); ret = (char) fgetc(stdin); if (ret != 'q') anim_close(); /* something must be terribly wrong */ UIsetframe(frames[num]); } /*****************************************************************************/ void anim_sigframes(int cur, int *prev, int *next, int *first, int *last) { int *pos_list; int pos_count; int will_free = 0; int n = 0, hit = 0; if (numframes == 0) { anim_close(); /* something must be terribly wrong */ } if (!range) { *prev = cur - 1; if (*prev < 0) *prev = numframes - 1; *next = cur + 1; if (*next >= numframes) *next = 0; *first = 0; *last = numframes - 1; return; } will_free = UIgetselected(&pos_list, &pos_count); if (pos_count == 0) { *prev = cur; *next = cur; *first = 0; *last = numframes - 1; } else if (pos_count == 1) { if (!pos_list) *prev = cur; else *prev = pos_list[0] - 1; if ((*prev < 0) || (*prev >= numframes)) *prev = 0; *next = *prev; *first = *prev; *last = *prev; } else { *first = pos_list[0] - 1; *last = pos_list[pos_count - 1] - 1; *prev = -1; *next = *first; for (n = 0; ((n < pos_count) && !hit) ; n++) { if (((pos_list[n] - 1) == cur) || ((pos_list[n] - 1) > cur)) { hit = 1; if (n == (pos_count - 1)) *next = pos_list[0] - 1; else *next = pos_list[n+1] - 1; } else *prev = pos_list[n] - 1; } if (*prev == -1) *prev = pos_list[pos_count - 1] - 1; } if (will_free) free(pos_list); } /*****************************************************************************/ void anim_stop() { UIstopplay(); } /*****************************************************************************/ void anim_play() { if (numframes) UIstartplay(); } /*****************************************************************************/ void anim_playing() { if (direction) anim_stepf(); else anim_stepb(); } /*****************************************************************************/ void anim_stepf() { int next, prev, first, last; if (!numframes) return; anim_sigframes(curframe, &prev, &next, &first, &last); curframe = next; direction = 1; if ((curframe == (numframes - 1)) || (range && (curframe == last))) { if (once) anim_stop(); if (bounce) direction = 0; } anim_goframe(curframe); } /*****************************************************************************/ void anim_stepb() { int next, prev, first, last; if (!numframes) return; anim_sigframes(curframe, &prev, &next, &first, &last); curframe = prev; direction = 0; if ((curframe == 0) || (range && (curframe == first))) { if (once) anim_stop(); if (bounce) direction = 1; } anim_goframe(curframe); } /*****************************************************************************/ void anim_range(int num) { range = num; } /*****************************************************************************/ void anim_bounce(int num) { bounce = num; } /*****************************************************************************/ void anim_once(int num) { once = num; } /*****************************************************************************/ void anim_setcommand(char *str) { if (!strlen(str)) { if (command == NULL) return; free(command); command = NULL; } if (command != NULL) free(command); command = (char *) malloc( sizeof(char) * (strlen(str) + 1) ); sprintf(command,"%s",str); } /*****************************************************************************/ void anim_load(char *in_glob) { char **new_frames = NULL; if (in_glob == NULL) return; if (in_glob[0] == '\0') return; new_frames = glob(in_glob); if (new_frames == NULL) return; if (new_frames[0] != NULL) { fprintf(stdout,"(read geometry { define anim%d { LIST } } )\n", mypid); fprintf(stdout,"(geometry animate%d : anim%d)\n", mypid, mypid); fflush(stdout); clear_frames(); load_frames(new_frames); } return; } /*****************************************************************************/ static char **get_script(char *in_scr) { FILE *scriptfile; char *scrbuf, **result, ch = (char) NULL; int bufsize = 1000; int position = 0, wait = 0, inword = 0; scrbuf = (char *) malloc(sizeof(char) * (bufsize + 1)); if (!(scriptfile = fopen(in_scr, "r"))) { fprintf(stderr, "Unable to open script file.\n"); return NULL; } #define IS_NEWLINE '\n' #define IS_COMMENT '#' #define IS_SPACE ' ' #define IS_TAB '\t' #define IS_LB '{' #define IS_COMMA ',' #define IS_RB '}' scrbuf[position] = IS_LB; position++; while ( !feof(scriptfile) ) { ch = (char) fgetc(scriptfile); if (ch == IS_COMMENT) wait = 1; if (wait) { if (ch == IS_NEWLINE) wait = 0; } if (!wait) { if ((ch != IS_TAB ) && (ch != IS_NEWLINE) && (ch != IS_SPACE) && !feof(scriptfile)) { scrbuf[position] = ch; position++; if (position == (bufsize - 2)) { bufsize *= 2; scrbuf = (char *)realloc(scrbuf, sizeof(char) * (bufsize + 1)); } inword = 1; } else if (inword) { inword = 0; scrbuf[position] = IS_COMMA; position++; if (position == (bufsize - 2)) { bufsize *= 2; scrbuf = (char *)realloc(scrbuf, sizeof(char) * (bufsize + 1)); } } } } scrbuf[position-1] = IS_RB; fclose(scriptfile); scrbuf[position] = (char) NULL; /* terminate buffer */ result = glob(scrbuf); /* glob it */ free(scrbuf); /* remove the buffer */ return result; /* return globbed list of files */ } /*****************************************************************************/ void anim_loadscript(char *in_scr) { char **new_frames = NULL; if (in_scr == NULL) return; if (in_scr[0] == '\0') return; new_frames = get_script(in_scr); if (new_frames == NULL) return; if (new_frames[0] != NULL) { fprintf(stdout,"(read geometry { define anim%d { LIST } } )\n", mypid); fprintf(stdout,"(geometry animate%d : anim%d)\n", mypid, mypid); fflush(stdout); clear_frames(); load_frames(new_frames); } return; } /*****************************************************************************/ void anim_speed(int percent) { /* for now we let the user interface handle the the speed of update */ } /*****************************************************************************/ geomview-1.9.4/src/bin/animate/animate.h0000644000175000001440000000232010455700774015036 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ void anim_close(); char *get_info(); void anim_goframe(int); void anim_stop(); void anim_play(); void anim_playing(); void anim_stepf(); void anim_stepb(); void anim_range(int); void anim_bounce(int); void anim_once(int); void anim_setcommand(char *); void anim_load(char *); void anim_loadscript(char *); void anim_speed(int); geomview-1.9.4/src/bin/animate/interface/0000777000175000001440000000000010665240702015267 500000000000000geomview-1.9.4/src/bin/animate/interface/command.mib0000644000175000001440000000255707730233456017332 00000000000000static char CommRoot[] = "\ TotalWidgets: 4\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 365\n\ Xmheight: 64\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TextBox\"\n\ Xmwidth: 354\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 28\n\ XmbottomOffset: 6\n\ XmleftOffset: 5\n\ XmrightOffset: 6\n\ Private-\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 90\n\ Xmheight: 23\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 5\n\ XmbottomOffset: 36\n\ XmleftOffset: 142\n\ XmrightOffset: 133\n\ Private-\n\ label: \"Command\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 364\n\ Xmheight: 64\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/animate/interface/animate.mib0000644000175000001440000001556407730233455017333 00000000000000static char AnimRoot[] = "\ TotalWidgets: 20\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 272\n\ Xmheight: 319\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Once\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 259\n\ XmbottomOffset: 38\n\ XmleftOffset: 95\n\ XmrightOffset: 177\n\ Private-\n\ label: \"Once\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Bounce\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 259\n\ XmbottomOffset: 38\n\ XmleftOffset: 179\n\ XmrightOffset: 20\n\ Private-\n\ label: \"Bounce\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Toggle\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Range\"\n\ Xmwidth: 0\n\ Xmheight: 0\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 259\n\ XmbottomOffset: 38\n\ XmleftOffset: 8\n\ XmrightOffset: 264\n\ Private-\n\ label: \"Range\"\n\ indicatorSize: 0\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AnimateTitle\"\n\ Xmwidth: 125\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 5\n\ XmbottomOffset: 284\n\ XmleftOffset: 73\n\ XmrightOffset: 74\n\ Private-\n\ label: \"Animator\"\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Script\"\n\ Xmwidth: 44\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 221\n\ XmbottomOffset: 68\n\ XmleftOffset: 219\n\ XmrightOffset: 9\n\ Private-\n\ label: \"Script\"\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CommandButton\"\n\ Xmwidth: 164\n\ Xmheight: 23\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 233\n\ XmbottomOffset: 63\n\ XmleftOffset: 4\n\ XmrightOffset: 104\n\ Private-\n\ label: \"Command\"\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Load\"\n\ Xmwidth: 41\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 221\n\ XmbottomOffset: 68\n\ XmleftOffset: 176\n\ XmrightOffset: 55\n\ Private-\n\ label: \"Load\"\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EtchedInFrame\"\n\ Xmwidth: 96\n\ Xmheight: 40\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 216\n\ XmbottomOffset: 63\n\ XmleftOffset: 172\n\ XmrightOffset: 4\n\ Private-\n\ shadowtype: 2\n\ EndWidget.\n\ Ref: 10\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Stop\"\n\ Xmwidth: 81\n\ Xmheight: 27\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 204\n\ XmbottomOffset: 88\n\ XmleftOffset: 87\n\ XmrightOffset: 104\n\ Private-\n\ label: \"Stop\"\n\ EndWidget.\n\ Ref: 11\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Play\"\n\ Xmwidth: 81\n\ Xmheight: 27\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 204\n\ XmbottomOffset: 88\n\ XmleftOffset: 4\n\ XmrightOffset: 187\n\ Private-\n\ label: \"Play\"\n\ EndWidget.\n\ Ref: 12\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"BStep\"\n\ Xmwidth: 81\n\ Xmheight: 27\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 175\n\ XmbottomOffset: 117\n\ XmleftOffset: 4\n\ XmrightOffset: 187\n\ Private-\n\ label: \"< Step\"\n\ EndWidget.\n\ Ref: 13\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FStep\"\n\ Xmwidth: 81\n\ Xmheight: 27\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 175\n\ XmbottomOffset: 117\n\ XmleftOffset: 87\n\ XmrightOffset: 104\n\ Private-\n\ label: \"Step >\"\n\ EndWidget.\n\ Ref: 14\n\ Widget: \"Scale\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"SpeedScale\"\n\ Xmwidth: 96\n\ Xmheight: 19\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 194\n\ XmbottomOffset: 106\n\ XmleftOffset: 172\n\ XmrightOffset: 4\n\ Private-\n\ orientation: 1\n\ EndWidget.\n\ Ref: 15\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Label\"\n\ Xmwidth: 53\n\ Xmheight: 18\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 175\n\ XmbottomOffset: 126\n\ XmleftOffset: 192\n\ XmrightOffset: 27\n\ Private-\n\ label: \"Speed\"\n\ EndWidget.\n\ Ref: 16\n\ Widget: \"TextBox\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"FileText\"\n\ Xmwidth: 264\n\ Xmheight: 30\n\ XmtopAttachment: 0\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 283\n\ XmbottomOffset: 6\n\ XmleftOffset: 4\n\ XmrightOffset: 4\n\ Private-\n\ EndWidget.\n\ Ref: 17\n\ Widget: \"List\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"AnimList\"\n\ Xmwidth: 264\n\ Xmheight: 137\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 36\n\ XmbottomOffset: 146\n\ XmleftOffset: 4\n\ XmrightOffset: 4\n\ Private-\n\ EndWidget.\n\ Ref: 18\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CloseButton\"\n\ Xmwidth: 59\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 4\n\ XmbottomOffset: 285\n\ XmleftOffset: 209\n\ XmrightOffset: 4\n\ Private-\n\ label: \"Exit\"\n\ EndWidget.\n\ Ref: 19\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"InfoButton\"\n\ Xmwidth: 59\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 4\n\ XmbottomOffset: 285\n\ XmleftOffset: 4\n\ XmrightOffset: 209\n\ Private-\n\ label: \"Info\"\n\ EndWidget.\n\ Ref: 20\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 272\n\ Xmheight: 318\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 1\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/animate/interface/Makefile.am0000644000175000001440000000005607730233454017245 00000000000000EXTRA_DIST = animate.mib command.mib info.mib geomview-1.9.4/src/bin/animate/interface/Makefile.in0000644000175000001440000002464510665240475017272 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/bin/animate/interface DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = animate.mib command.mib info.mib all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/animate/interface/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/animate/interface/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/animate/interface/info.mib0000644000175000001440000000332207730233456016636 00000000000000static char InfoRoot[] = "\ TotalWidgets: 5\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 359\n\ Xmheight: 197\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"TextBig\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"TextBig\"\n\ Xmwidth: 351\n\ Xmheight: 157\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 36\n\ XmbottomOffset: 4\n\ XmleftOffset: 4\n\ XmrightOffset: 4\n\ Private-\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Close\"\n\ Xmwidth: 54\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 0\n\ XmrightAttachment: 1\n\ XmtopOffset: 4\n\ XmbottomOffset: 163\n\ XmleftOffset: 301\n\ XmrightOffset: 4\n\ Private-\n\ label: \"Hide\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Title\"\n\ Xmwidth: 254\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 5\n\ XmbottomOffset: 162\n\ XmleftOffset: 40\n\ XmrightOffset: 65\n\ Private-\n\ label: \"Animation Info\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 359\n\ Xmheight: 197\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: -1\n\ XmrightOffset: 1\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/clipboard/0000777000175000001440000000000010665240702013650 500000000000000geomview-1.9.4/src/bin/clipboard/clipboard.c0000644000175000001440000001567710623431237015706 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Geometry Technologies, Inc. * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Geometry Technologies, Inc."; #endif #include #include #include "geom.h" #include "mibload.h" #include "clipboard.mib" #include "clip.h" #include "mg.h" #include "mgx11.h" void cut_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); void copy_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); void paste_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); void delete_callback(Widget , XtPointer, XmPushButtonCallbackStruct *); char obj_name[1000]; Geom *theObject; int clipfull; /* The selected visual */ Visual *visual; Colormap colormap; int bitdepth; void find_visual(Display *dpy) { int result; #if !MGX11 visual = DefaultVisual(dpy, DefaultScreen(dpy)); colormap = DefaultColormap(dpy, DefaultScreen(dpy)); bitdepth = DefaultDepth(dpy, DefaultScreen(dpy)); #else result = mgx11_getvisual(dpy, &visual, &colormap, &bitdepth); if (result == MG_X11VISFAIL) { fprintf(stderr, "X11 MG driver currently supports only 24, 16, 8, and 1 bit\n" "\tdeep displays. No supported display depth was found.\n" "\tPlease mail the output of \"xdpyinfo\" to\n" "\tsoftware@geomview.org\n"); exit(1); } else if (result == MG_X11VISPRIVATE) { fprintf(stderr, "Not enough colors available. Using private colormap.\n"); } else return; #endif } int main(int argc, char **argv) { XtAppContext App; Widget TopLevel, MainWindow, CutButton, CopyButton, PasteButton, DeleteButton; int no_mi; Arg args[20]; int n = 0; mib_Widget *MainForm; static String fallbacks[] = { "myprog*Foreground: gray20", /*15*/ "myprog*Background: gray70", /*80*/ "myprog*XmTextField.background: DeepSkyBlue", "myprog*fontList:\ -adobe-helvetica-medium-r-normal--14-100-100-100-p-76-iso8859-1", NULL}; no_mi = 0; /* no motif interface if no_mi = 1 */ clipfull = 0; obj_name[0] = '\0'; /* initialize application top level widget */ TopLevel = XtVaAppInitialize(&App, "myprog", NULL, 0, &argc, argv, fallbacks, NULL); find_visual(XtDisplay(TopLevel)); /* configure resize policy of window */ XtVaSetValues(TopLevel, XmNminWidth, 272, XmNminHeight, 172, NULL); if (bitdepth != 24) { XtSetArg(args[n], XmNvisual, visual); n++; XtSetArg(args[n], XmNdepth, bitdepth); n++; XtSetArg(args[n], XmNcolormap, colormap); n++; } /* create the application main window widget */ MainWindow = XtCreateManagedWidget("MainWindow", xmMainWindowWidgetClass, TopLevel, args, n); /* load the interface via the mib library */ MainForm = mib_load_interface(MainWindow, Root, MI_FROMSTRING); /* MainForm = mib_load_interface(MainWindow, "mib/clipboard.mib", MI_FROMFILE); */ if (MainForm == NULL) exit(0); /* Set widget pointers to null before trying to find their instances */ CutButton = NULL; CopyButton = NULL; PasteButton = NULL; DeleteButton = NULL; /* Do similarly when trying to find a widget named "CutButton" */ if (!(CutButton = XtNameToWidget(MainForm->me, "CutButton"))) no_mi = 1; if (!(CopyButton = XtNameToWidget(MainForm->me, "CopyButton"))) no_mi = 1; if (!(PasteButton = XtNameToWidget(MainForm->me, "PasteButton"))) no_mi = 1; if (!(DeleteButton = XtNameToWidget(MainForm->me, "DeleteButton"))) no_mi = 1; if (!XtNameToWidget(MainForm->me, "DrawingArea")) no_mi = 1; /* if we found both widgets then add a callback to the button. This is called whenever the user clicks the button. If there was no button and/or no text box then we avoid adding the callback. */ if (!no_mi) { XtAddCallback(CutButton, XmNactivateCallback, (XtCallbackProc)cut_callback, NULL); XtAddCallback(CopyButton, XmNactivateCallback, (XtCallbackProc)copy_callback, NULL); XtAddCallback(PasteButton, XmNactivateCallback, (XtCallbackProc)paste_callback, NULL); XtAddCallback(DeleteButton, XmNactivateCallback, (XtCallbackProc)delete_callback, NULL); } /* Bring the application window up on the screen. */ XtRealizeWidget(TopLevel); /* initialize visual clipboard - mg library stuff (gl or vanilla-x)*/ clipboard_init(MainForm->me); /* Begin main Intrinsics event loop */ XtAppMainLoop (App); return 0; } void cut_callback(Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { char tmp; int count; IOBFILE *infile; fprintf(stdout,"(echo (real-id target))\n"); fflush(stdout); tmp = '\0'; while (tmp != '\"') tmp = (char)fgetc(stdin); tmp = '\0'; count = 0; while (tmp != '\"') { tmp = (char)fgetc(stdin); obj_name[count] = tmp; count++; } obj_name[count-1] = '\0'; fprintf(stdout,"(write geometry - target)\n"); fflush(stdout); infile = iobfileopen(stdin); theObject = GeomFLoad(infile, obj_name); iobfileclose(infile); fprintf(stdout,"(delete target)\n"); fflush(stdout); clipfull = 1; redraw(w); } void copy_callback(Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { char tmp; int count; IOBFILE *infile; fprintf(stdout,"(echo (real-id target))\n"); fflush(stdout); tmp = '\0'; while (tmp != '\"') tmp = (char)fgetc(stdin); tmp = '\0'; count = 0; while (tmp != '\"') { tmp = (char)fgetc(stdin); obj_name[count] = tmp; count++; } obj_name[count-1] = '\0'; fprintf(stdout,"(write geometry - target)"); fflush(stdout); infile = iobfileopen(stdin); theObject = GeomFLoad(infile, obj_name); iobfileclose(infile); clipfull = 1; redraw(w); } void paste_callback(Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { if (clipfull == 0) return; fprintf(stdout,"(new-geometry %s {",obj_name); GeomFSave(theObject, stdout, obj_name); fprintf(stdout,"})"); fflush(stdout); } void delete_callback(Widget w, XtPointer data, XmPushButtonCallbackStruct *cbs) { fprintf(stdout,"(delete target)\n"); fflush(stdout); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/bin/clipboard/clip.h0000644000175000001440000000165310462355113014667 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Geometry Technologies, Inc. * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ void clipboard_init(Widget); void redraw(Widget); geomview-1.9.4/src/bin/clipboard/Makefile.am0000644000175000001440000000132110600603011015576 00000000000000INCLUDES = $(default_includes) $(MOTIFINCLUDE) LDADD = $(OOGLLIB) $(MOTIFUILIB) $(MOTIFLIBS) $(XMULIBS) $(XLIBS) man_MANS = module_PROGRAMS = clipboard clipboard_SOURCES = clipboard.c clipboard.mib clipx.c clip.h clipboard_DEPENDENCIES = $(OOGLLIB) #clipboard_LDFLAGS = -rpath $(libdir) module_DATA = .geomview-clipboard .geomview-clipboard: Makefile echo '(emodule-define "Clipboard" "clipboard")' > .geomview-clipboard all-local: $(top_builddir)/modules/.geomview-clipboard $(top_builddir)/modules/.geomview-clipboard: Makefile $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Clipboard" "$(subdir)/clipboard")' > $@ CLEANFILES = $(top_builddir)/modules/.geomview-clipboard $(module_DATA) geomview-1.9.4/src/bin/clipboard/Makefile.in0000644000175000001440000004273310665240475015651 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ module_PROGRAMS = clipboard$(EXEEXT) subdir = src/bin/clipboard DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(moduledir)" modulePROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(module_PROGRAMS) am_clipboard_OBJECTS = clipboard.$(OBJEXT) clipx.$(OBJEXT) clipboard_OBJECTS = $(am_clipboard_OBJECTS) clipboard_LDADD = $(LDADD) am__DEPENDENCIES_1 = DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(clipboard_SOURCES) DIST_SOURCES = $(clipboard_SOURCES) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; moduleDATA_INSTALL = $(INSTALL_DATA) DATA = $(module_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) $(MOTIFINCLUDE) LDADD = $(OOGLLIB) $(MOTIFUILIB) $(MOTIFLIBS) $(XMULIBS) $(XLIBS) man_MANS = clipboard_SOURCES = clipboard.c clipboard.mib clipx.c clip.h clipboard_DEPENDENCIES = $(OOGLLIB) #clipboard_LDFLAGS = -rpath $(libdir) module_DATA = .geomview-clipboard CLEANFILES = $(top_builddir)/modules/.geomview-clipboard $(module_DATA) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bin/clipboard/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bin/clipboard/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-modulePROGRAMS: $(module_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(modulePROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(moduledir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(modulePROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(moduledir)/$$f" || exit 1; \ else :; fi; \ done uninstall-modulePROGRAMS: @$(NORMAL_UNINSTALL) @list='$(module_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \ rm -f "$(DESTDIR)$(moduledir)/$$f"; \ done clean-modulePROGRAMS: @list='$(module_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done clipboard$(EXEEXT): $(clipboard_OBJECTS) $(clipboard_DEPENDENCIES) @rm -f clipboard$(EXEEXT) $(LINK) $(clipboard_OBJECTS) $(clipboard_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clipboard.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clipx.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-moduleDATA: $(module_DATA) @$(NORMAL_INSTALL) test -z "$(moduledir)" || $(MKDIR_P) "$(DESTDIR)$(moduledir)" @list='$(module_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(moduleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(moduledir)/$$f'"; \ $(moduleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(moduledir)/$$f"; \ done uninstall-moduleDATA: @$(NORMAL_UNINSTALL) @list='$(module_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(moduledir)/$$f'"; \ rm -f "$(DESTDIR)$(moduledir)/$$f"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) all-local installdirs: for dir in "$(DESTDIR)$(moduledir)" "$(DESTDIR)$(moduledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-modulePROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-moduleDATA install-modulePROGRAMS install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-moduleDATA uninstall-modulePROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am all-local check check-am clean \ clean-generic clean-libtool clean-modulePROGRAMS ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-moduleDATA \ install-modulePROGRAMS install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-moduleDATA uninstall-modulePROGRAMS .geomview-clipboard: Makefile echo '(emodule-define "Clipboard" "clipboard")' > .geomview-clipboard all-local: $(top_builddir)/modules/.geomview-clipboard $(top_builddir)/modules/.geomview-clipboard: Makefile $(top_srcdir)/mkmodulesdir $(top_builddir) echo '(emodule-define "Clipboard" "$(subdir)/clipboard")' > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/bin/clipboard/clipboard.mib0000644000175000001440000000611510462355113016215 00000000000000char Root[] = "\ TotalWidgets: 9\n\ Ref: 1\n\ Widget: \"RootForm\"\n\ Children: 2 3 4 5 6 7 8 9\n\ Parent: 1\n\ Public-\n\ Name: \"Root\"\n\ Xmwidth: 272\n\ Xmheight: 172\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 0\n\ XmleftOffset: 0\n\ XmrightOffset: 0\n\ Private-\n\ EndWidget.\n\ Ref: 2\n\ Widget: \"DrawingArea\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DrawingArea\"\n\ Xmwidth: 155\n\ Xmheight: 158\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 6\n\ XmbottomOffset: 8\n\ XmleftOffset: 110\n\ XmrightOffset: 7\n\ Private-\n\ EndWidget.\n\ Ref: 3\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"DeleteButton\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 130\n\ XmbottomOffset: 12\n\ XmleftOffset: 11\n\ XmrightOffset: 171\n\ Private-\n\ label: \"Delete\"\n\ EndWidget.\n\ Ref: 4\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"PasteButton\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 99\n\ XmbottomOffset: 43\n\ XmleftOffset: 11\n\ XmrightOffset: 171\n\ Private-\n\ label: \"Paste\"\n\ EndWidget.\n\ Ref: 5\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CopyButton\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 68\n\ XmbottomOffset: 74\n\ XmleftOffset: 11\n\ XmrightOffset: 171\n\ Private-\n\ label: \"Copy\"\n\ EndWidget.\n\ Ref: 6\n\ Widget: \"Button\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"CutButton\"\n\ Xmwidth: 90\n\ Xmheight: 30\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 37\n\ XmbottomOffset: 105\n\ XmleftOffset: 11\n\ XmrightOffset: 171\n\ Private-\n\ label: \"Cut\"\n\ EndWidget.\n\ Ref: 7\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"EtchedInFrame\"\n\ Xmwidth: 99\n\ Xmheight: 131\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 33\n\ XmbottomOffset: 8\n\ XmleftOffset: 7\n\ XmrightOffset: 166\n\ Private-\n\ shadowtype: 2\n\ EndWidget.\n\ Ref: 8\n\ Widget: \"Label\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"Title\"\n\ Xmwidth: 60\n\ Xmheight: 24\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 0\n\ XmleftAttachment: 1\n\ XmrightAttachment: 0\n\ XmtopOffset: 5\n\ XmbottomOffset: 143\n\ XmleftOffset: 26\n\ XmrightOffset: 186\n\ Private-\n\ label: \"Clipboard\"\n\ EndWidget.\n\ Ref: 9\n\ Widget: \"Frame\"\n\ Children: X\n\ Parent: 1\n\ Public-\n\ Name: \"OutFrame\"\n\ Xmwidth: 271\n\ Xmheight: 171\n\ XmtopAttachment: 1\n\ XmbottomAttachment: 1\n\ XmleftAttachment: 1\n\ XmrightAttachment: 1\n\ XmtopOffset: 0\n\ XmbottomOffset: 1\n\ XmleftOffset: 0\n\ XmrightOffset: 1\n\ Private-\n\ shadowtype: 1\n\ EndWidget.\n\ END.\n\ "; geomview-1.9.4/src/bin/clipboard/clipx.c0000644000175000001440000000702110463345057015054 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Geometry Technologies, Inc. * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Geometry Technologies, Inc."; #endif #include #include #include "mg.h" #include "geom.h" #include "mibload.h" #include "mgx11.h" #include "clip.h" void winexpose(Widget, XtPointer, XmDrawingAreaCallbackStruct *); extern Geom *theObject; extern Visual *visual; extern Colormap colormap; extern int bitdepth; ColorA white = {1.0, 1.0, 1.0, 1.0}; ColorA red = {1.0, 0, 0, 1.0}; ColorA cameragray = {1.0/3.0, 1.0/3.0, 1.0/3.0, 1.0}; ColorA darkgray = {0.2, 0.2, 0.2, 1.0}; ColorA darkblue = {0, 0, .2, 1.0}; Point lightpos1 = {1, .3, .7, 0.0}; Point lightpos2 = {-0.5, 1.0, 0.5, 0.0}; ColorA lightcol2 = {0.6, 0.6, 0.6, 1.0}; Point lightpos3 = {0.0, -2.0, 1.0, 0.0}; ColorA lightcol3 = {0.4, 0.4, 0.4, 1.0}; Camera *theCamera; Appearance *theAppearance; LmLighting *lightingModel; LtLight *theLight; mgcontext *mgctx; void clipboard_init(Widget parent) { Widget MG_DrawArea; MG_DrawArea = XtNameToWidget(parent, "DrawingArea"); mgdevice_X11(); theObject = NULL; theCamera = CamCreate( CAM_FOV, 40.0, CAM_END ); lightingModel = LmCreate( LM_AMBIENT, &darkgray, LM_REPLACELIGHTS, 1, LM_END); theLight = LtCreate( LT_COLOR, &white, LT_POSITION, &lightpos1, LT_INTENSITY, 1.0, LT_END); LmAddLight(lightingModel, theLight); theLight = LtCreate( LT_COLOR, &lightcol2, LT_POSITION, &lightpos2, LT_INTENSITY, 1.0, LT_END); LmAddLight(lightingModel, theLight); theLight = LtCreate( LT_COLOR, &lightcol3, LT_INTENSITY, 1.0, LT_END); LmAddLight(lightingModel, theLight); theAppearance = ApCreate( AP_DO, APF_FACEDRAW | APF_SHADING | APF_EDGEDRAW | APF_VECTDRAW, AP_MtSet, MT_Kd, 1.0, MT_DIFFUSE, &white, MT_END, AP_LGT, lightingModel, AP_SHADING, APF_FLAT, AP_END); mgctx = mgctxcreate(MG_X11DISPLAY, XtDisplay(MG_DrawArea), MG_X11COLORMAP, colormap, MG_BITDEPTH, bitdepth, MG_X11VISUAL, visual, MG_X11WINID, XtWindow(MG_DrawArea), MG_CAMERA, theCamera, MG_BACKGROUND, &cameragray /*&darkblue */, MG_APPEAR, theAppearance, MG_END); XtAddCallback(MG_DrawArea, XmNexposeCallback, (XtCallbackProc)winexpose, 0); XtVaSetValues(MG_DrawArea, XmNbackground, BlackPixel(XtDisplay(MG_DrawArea), DefaultScreen(XtDisplay(MG_DrawArea))), NULL); } void redraw(Widget w) { mgreshapeviewport(); mgworldbegin(); GeomDraw(theObject); mgworldend(); } void winexpose(Widget w, XtPointer stuff, XmDrawingAreaCallbackStruct *data) { mgreshapeviewport(); mgworldbegin(); GeomDraw(theObject); mgworldend(); } geomview-1.9.4/src/bin/ChangeLog0000644000175000001440000001171610463662361013412 000000000000002006-08-01 Steve M. Robbins * geomutil/plutil/offconsol.1: Fix manpage section. 2006-07-31 Steve M. Robbins * stereo/stereo.c: Make usage of "/usr/gfx/setmon" conditional on that binary existing; it is an irix-specific program. * flythrough/main.c: * hinge/hui.c: Rename getline() to gv_getline() to avoid clash with standard C library function. * example/oogl.c: Remove unused method getline(). 2002-10-26 Steve M. Robbins * animate/glob.c: Add !defined(__CYGWIN__) to condition. * bin/geomutil/math2oogl/math2oogl.c: * bin/geomview/common/comm.c: * bin/geomview/common/lang.c: * bin/geomview/x11/gvcamui.c: * bin/geomview/x11/gvevent.c: * bin/geomview/x11/gvmain.c: * bin/geomview/x11/gvui.c: * bin/stereo/stereo.c: * bin/togeomview/togeomview.c: * lib/oogl/util/glob.c: Include rather than to get SIG_DFL defines. 2002-04-13 Steve M. Robbins * geomutil/math2oogl/math2oogl.c: Add __unix__ to list of CPP symbols used to detect unix systems. 2001-06-04 Mark Phillips * geomutil/oogl2vrml/oogl2vrml.c: fixed segmentation fault bug 2001-02-28 Steve M. Robbins * geomutil/math2oogl/Makefile.am (EXTRA_DIST): * geomutil/oogl2rib/Makefile.am (EXTRA_DIST): * geomutil/oogl2vrml/Makefile.am (EXTRA_DIST): * geomutil/plutil/Makefile.am (EXTRA_DIST): * geomutil/vrml2oogl/Makefile.am (EXTRA_DIST): Distribute man_MANS. * geomutil/vrml2oogl/vrml2oogl.1: New. * geomutil/vrml2oogl/Makefile.am (man_MANS): Install vrml2oogl.1. * geomutil/oogl2vrml/oogl2vrml.1: New. * geomutil/oogl2vrml/Makefile.am (man_MANS): Install oogl2vrml.1. * geomutil/oogl2rib/oogl2rib.1: New. * geomutil/oogl2rib/Makefile.am (man_MANS): Install oogl2rib.1. * geomutil/math2oogl/math2oogl.1: New. * geomutil/math2oogl/Makefile.am (man_MANS): Install math2oogl.1. * geomutil/plutil/bez2mesh.1: New. * geomutil/plutil/Makefile.am (man_MANS): Install bez2mesh.1. 2001-02-22 Steve M. Robbins * togeomview/togeomview.c: Include config.h. 2001-02-21 Steve M. Robbins * geomview/common/comm.c (emodule_run): * togeomview/togeomview.c (start_gv): * geomutil/math2oogl/math2oogl.c (start_gv): Use SETPGRP_VOID. 2000-11-23 Steve Robbins * geomview/x11/Makefile.am: install "gvx" in moduledir, not bindir. 2000-11-17 Mark Phillips * added 'togeomview' utility program to distribution (in src/bin/togeomview) 2000-11-15 Mark Phillips * src/bin/geomview/x11: removed clang.h from CVS since it's a derived file (clang.c, also derived, apparently wasn't in CVS). Also, btw, clang.[ch] are now built in src/bin/geomview not src/bin/geomview/x11 (see comments from stever below). * Makefile.am: split SUBDIRS into DIST_SUBDIRS and $(src_bin_module_subdirs), which is now set by the top-level configure script. 2000-11-05 Steve Robbins * geomutil/bdy/Makefile.am (drawbdy): Put $(moduledir) on PATH, not $(exec_prefix)/bin. (CLEANFILES): Clean up the generated script. * geomview/x11/Makefile.am: * geomview/common/Makefile.am: Removed the complicated cross-directory dependency rules. Build "clang.c" and "clang.h" in the geomview directory before building either subdirectory. Make "x11/buildinfo.c" depend on $(gvx_OBJECTS), rather than "_always", to prevent recompilation during "make install". Removed "clang.h" from gvx_SOURCES, since it is no longer built in the "x11" subdirectory. * geomutil/ucd/Makefile.am (man_MANS): * geomutil/plutil/Makefile.am (man_MANS): * geomutil/clip/Makefile.am (man_MANS): * geomutil/bdy/Makefile.am (man_MANS): * geomview/Makefile.am (man_MANS): Install manpages. * maniview/Makefile.am (datagroupsdir): Default the value from $geomdatadir. 2000-11-04 Steve Robbins * transformer/Makefile.am: * tackdown/Makefile.am: * sweep/Makefile.am: * stereo/Makefile.am: * maniview/Makefile.am: * hinge/Makefile.am: * graffiti/Makefile.am: * ginsu/Makefile.am: * geomutil/bdy/Makefile.am: * flythrough/Makefile.am: * example/Makefile.am: * cplxview/Makefile.am: * animate/Makefile.am: Install modules into moduledir. Treat .geomview-* files as data, not scripts. 2000-10-29 Steve Robbins * geomutil/bdy/Makefile.am (drawbdy): * geomutil/vrml2oogl/Makefile.am (INCLUDES): * geomview/x11/Makefile.am (clang): Use $srcdir when referring to directories in source hierarchy. * geomview/common/Makefile.am (INCLUDES): Add both ../x11 (for generated `clang.c' file), and $srcdir/../x11 (for `clang.h' file) to include path. * geomutil/bdy/Makefile.am (install-geomview-dotfile): * animate/Makefile.am (install-geomview-dotfile): Refer to script `mkmodulesdir' using $top_srcdir. geomview-1.9.4/src/lib/0000777000175000001440000000000010665240677011722 500000000000000geomview-1.9.4/src/lib/mg/0000777000175000001440000000000010665240676012324 500000000000000geomview-1.9.4/src/lib/mg/ps/0000777000175000001440000000000010665240676012746 500000000000000geomview-1.9.4/src/lib/mg/ps/mgpsP.h0000644000175000001440000000723610455701005014112 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef MGPSP_H #define MGPSP_H typedef struct { Pt3Coord x, y, z, w; ColorA vcol; int drawnext; } CPoint3; /*****************************************************************************/ #define MGX_NULL 0 #define MGX_END 0 #define MGX_BGNLINE 1 #define MGX_BGNPOLY 2 #define MGX_BGNEPOLY 3 #define MGX_BGNSLINE 4 #define MGX_BGNSPOLY 5 #define MGX_BGNSEPOLY 6 #define MGX_VERTEX 7 #define MGX_CVERTEX 8 #define MGX_COLOR 9 #define MGX_ECOLOR 10 #define PRIM_LINE 1 #define PRIM_POLYGON 2 #define PRIM_EPOLYGON 3 #define PRIM_SLINE 4 /* smooth shaded primitives */ #define PRIM_SPOLYGON 5 #define PRIM_SEPOLYGON 6 #define PRIM_INVIS 7 /*****************************************************************************/ typedef struct _mgpsprim { int mykind; /* kind of primitive */ int index; /* index into array of vertices */ int numvts; /* number of vertices */ float depth; /* z value for sorting (at least for now) */ int color[3]; /* rgb color of polygon */ int ecolor[3]; /* edge color of polygon */ int ewidth; /* edge width */ } mgpsprim; /*****************************************************************************/ typedef struct _mgps_sort { vvec primsort; /* pointers to mgx11prim array elements*/ vvec prims; /* array of mgx11prim structures */ int primnum; /* number of primitives */ int cprim; /* current primitive being stored */ vvec pverts; /* array of vertices */ int pvertnum; int cvert; /* current vertex being stored */ int maxverts; /* maximum number of vertices */ } mgps_sort; /*****************************************************************************/ typedef struct mgpscontext { struct mgcontext mgctx; /* The mgcontext */ FILE *file; char filepath[280]; unsigned char *buf; float *zbuf; int xsize, ysize; float zrange; int znudge; /* znudge for drawing lines closer */ float znudgeby; /* how much of a nudge ? */ long znear, zfar; /* Current Z-buffer limits */ vvec room; /* Scratch space */ #if 0 int pvertnum; /* number of vertices */ vvec pverts; /* Primitve vertices */ #endif mgps_sort *mysort; /* sorting structure */ int sizelock; /* for prohibiting size change from within mg when the cam window is part of a larger hierarchy of windows as with Widgets */ int born; } mgpscontext; #define MAXZNUDGE 8 /* Max depth of mgbuf_closer()/farther() */ #define _mgpsc ((mgpscontext*)_mgc) extern void mgps_add(int primtype, int ndata, void *data, void *cdata); extern void mgps_init_zrange(); extern int mgps_primclip(mgpsprim *aprim); #endif geomview-1.9.4/src/lib/mg/ps/mgpsclip.c0000644000175000001440000001545010455701005014632 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgpsP.h" #define WCLIPPLANE 0.001 /* This is as close as we get to the eyeplane */ #define XLEFTCLIP 0.0 #define XRIGHTCLIP 0.0 #define YTOPCLIP 0.0 #define YBOTTOMCLIP 0.0 #define ZNEARCLIP (-1.0) #define ZFARCLIP 1.0 static int xyz[6], clipvertnum = 0; static mgpsprim *prim1, *prim2, *primtemp; static CPoint3 *vts1, *vts2, *vtstemp; /* Function: mgps_dividew() Description: Divide out w coordinate (*after* clipping against WCLIPPLANE) Author: Daeron Meyer */ void mgps_dividew(void) { CPoint3 *curr; float w; int n; for (n = 0; n < prim1->numvts; n++) { curr = &(vts1[n]); w = curr->w; curr->x /= w; curr->y /= w; curr->z /= w; curr->z += _mgpsc->znudgeby; if (curr->x < XLEFTCLIP) xyz[0]++; if (curr->x >= (float)_mgpsc->xsize - XRIGHTCLIP) xyz[1]++; if (curr->y < YTOPCLIP) xyz[2]++; if (curr->y >= (float)_mgpsc->ysize - YBOTTOMCLIP) xyz[3]++; if (curr->z < ZNEARCLIP) xyz[4]++; if (curr->z >= ZFARCLIP) xyz[5]++; } } /* Function: mgps_cliptoplane() Description: Clip polygon against a coordinate axis plane Author: Daeron Meyer */ void mgps_cliptoplane(int coord, float plane, float sign) { CPoint3 *prev, *curr, *dest; float i, i1, i2, *c1, *p1, *d1; int n; #ifdef DEBUGCLIP fprintf(stderr, "Clip %d, plane=%f, sign=%f\n", coord, plane, sign); #endif prim2->numvts = 0; prev = &(vts1[prim1->numvts - 1]); i1 = sign * ((float *) prev) [coord] - plane; for (curr=vts1, n=prim1->numvts; n > 0; n--, prev=curr, i1=i2, curr++) { i2 = sign * ((float *) curr) [coord] - plane; if ((i1 <= 0.0) ^ (i2 <= 0.0)) { i = i1/(i1 - i2); dest = &(vts2[prim2->numvts]); dest->x = prev->x + i * (curr->x - prev->x); dest->y = prev->y + i * (curr->y - prev->y); dest->z = prev->z + i * (curr->z - prev->z); dest->w = prev->w + i * (curr->w - prev->w); if ((i1 <= 0.0) || (prev->drawnext == 0)) dest->drawnext = 0; else dest->drawnext = 1; c1 = (float *) &(curr->vcol); p1 = (float *) &(prev->vcol); d1 = (float *) &(dest->vcol); d1[0] = p1[0] + i * (c1[0] - p1[0]); d1[1] = p1[1] + i * (c1[1] - p1[1]); d1[2] = p1[2] + i * (c1[2] - p1[2]); d1[3] = p1[3] + i * (c1[3] - p1[3]); prim2->numvts++; } if (i2 <= 0.0) { vts2[prim2->numvts] = *curr; prim2->numvts++; } } #ifdef DEBUGCLIP for (n = 0; n < prim2->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts2[n].x, vts2[n].y, vts2[n].z, vts2[n].w, vts2[n].drawnext); } #endif } /* Function: mgps_primclip() Description: Clip a polygon to fit in the viewing volume Author: Daeron Meyer */ int mgps_primclip(mgpsprim *aprim) { static mgpsprim clip; static int mykind, n; static vvec clipverts; static int intersectw; xyz[0]=0; xyz[1]=0; xyz[2]=0; xyz[3]=0; xyz[4]=0; xyz[5]=0; /* give ourselves more space for vertex data if needed */ if ((aprim->numvts * 2) > clipvertnum) { if (!clipvertnum) VVINIT(clipverts, CPoint3, clipvertnum); clipvertnum = aprim->numvts * 2; vvneeds(&clipverts, clipvertnum); } /* We might need more space for the final polygon since clipping can produce a polygon with more vertices than it had to begin with. We'll err on the side of safety: */ if ((_mgpsc->mysort->cvert + aprim->numvts) > _mgpsc->mysort->pvertnum) { _mgpsc->mysort->pvertnum *= 2; vvneeds(&(_mgpsc->mysort->pverts), _mgpsc->mysort->pvertnum); } mykind = aprim->mykind; prim1 = aprim; prim2 = &clip; vts1 = &(VVEC(_mgpsc->mysort->pverts, CPoint3)[prim1->index]); vts2 = &(VVEC(clipverts, CPoint3)[0]); if ((mykind==PRIM_LINE) || (mykind==PRIM_SLINE)) vts1[prim1->numvts-1].drawnext = 0; prim2->index = 0; prim2->numvts = prim1->numvts; #define CLIP_POLYS_AND_SWAP(a, b, c) { \ mgps_cliptoplane(a, b, c); \ if (prim2->numvts == 0) { aprim->numvts = 0; return PRIM_INVIS; } \ vtstemp = vts2; vts2 = vts1; vts1 = vtstemp; \ primtemp = prim2; prim2 = prim1; prim1 = primtemp; \ } #ifdef DEBUGCLIP fprintf(stderr, "BEGIN-CLIP\n"); fprintf(stderr, "INITIAL POLY:\n"); for (n=0; n < aprim->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts1[n].x, vts1[n].y, vts1[n].z, vts1[n].w, vts1[n].drawnext); } fprintf(stderr,"===========================\n"); #endif intersectw = 0; for (n = 0; (n < aprim->numvts) && !intersectw; n++) { if (vts1[n].w < WCLIPPLANE) intersectw = 1; } if (intersectw) CLIP_POLYS_AND_SWAP(3, -WCLIPPLANE, -1.0); mgps_dividew(); n = prim1->numvts; if (!intersectw && (xyz[0]+xyz[1]+xyz[2]+xyz[3]+xyz[4]+xyz[5] == 0)) return mykind; else if (xyz[0] == n || xyz[1] == n || xyz[2] == n || xyz[3] == n || xyz[4] == n || xyz[5] == n) return PRIM_INVIS; if (xyz[0]) CLIP_POLYS_AND_SWAP(0, -XLEFTCLIP, -1.0); if (xyz[1]) CLIP_POLYS_AND_SWAP(0, (float)_mgpsc->xsize-XRIGHTCLIP, 1.0); if (xyz[2]) CLIP_POLYS_AND_SWAP(1, -YTOPCLIP, -1.0); if (xyz[3]) CLIP_POLYS_AND_SWAP(1, (float)_mgpsc->ysize-YBOTTOMCLIP, 1.0); if (xyz[4]) CLIP_POLYS_AND_SWAP(2, -ZNEARCLIP, -1.0); if (xyz[5]) CLIP_POLYS_AND_SWAP(2, ZFARCLIP, 1.0); if (aprim == prim2) /* If the vertex data ended up in the local vertex list, then we need to copy it back to the global vertex list */ { prim2->numvts = prim1->numvts; /* for (n=0; n < aprim->numvts; n++) { vts2[n] = vts1[n]; } */ memcpy(vts2, vts1, sizeof(CPoint3) * prim1->numvts); } #ifdef DEBUGCLIP fprintf(stderr, "FINAL POLY:\n"); for (n=0; n < aprim->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts1[n].x, vts1[n].y, vts1[n].z, vts1[n].w, vts1[n].drawnext); } fprintf(stderr, "END-CLIP\n"); #endif return mykind; } geomview-1.9.4/src/lib/mg/ps/mgpsdraw.c0000644000175000001440000004356110622716756014663 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgpsP.h" #include "polylistP.h" #include "mgpswindows.h" /* Author: Daeron Meyer */ void mgps_polygon( int nv, HPoint3 *v, int nn, Point3 *n, int nc, ColorA *c ); void mgps_mesh(int wrap, int nu, int nv, HPoint3 *p, Point3 *n, Point3 *nq, ColorA *c ); void mgps_line( HPoint3 *p1, HPoint3 *p2 ); void mgps_polyline( int nv, HPoint3 *verts, int nc, ColorA *colors, int wrap ); void mgps_polylist( int np, Poly *p, int nv, Vertex *v, int pl_flags ); void mgps_drawnormal(HPoint3 *p, Point3 *n); void mgps_closer(); void mgps_farther(); static ColorA *C2; /*----------------------------------------------------------------------- * Function: mgps_polygon * Description: draw a polygon * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgps_polygon(int nv, HPoint3 *V, int nn, Point3 *N, int nc, ColorA *C) { int count; HPoint3 *v; Point3 *n; int flag, ninc, smooth; /* fprintf(stderr,"X11: draw a polygon\n"); */ flag = _mgc->astk->ap.flag; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) nc = 0; ninc = (nn > 1); smooth = IS_SMOOTH(_mgc->astk->ap.shading); /* fprintf(stderr,"cinc = %d, nc = %d, nn = %d\n", cinc, nc, nn); */ if (nc == 0) C = (ColorA*)&_mgc->astk->ap.mat->diffuse; if ((flag & APF_FACEDRAW) && (flag & APF_EDGEDRAW)) { /* put polygon in display list */ if (smooth && (nc > 0)) mgps_add(MGX_BGNSEPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNEPOLY, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); /* edge color */ mgps_add(MGX_COLOR, 0, NULL, C); /* face color */ if (smooth) mgps_add(MGX_CVERTEX, nv, V, C); else mgps_add(MGX_VERTEX, nv, V, NULL); mgps_add(MGX_END, 0, NULL, NULL); } else if (flag & APF_FACEDRAW) { /* put polygon in display list */ if (smooth) mgps_add(MGX_BGNSPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNPOLY, 0, NULL, NULL); mgps_add(MGX_COLOR, 0, NULL, C); if (smooth && (nc > 0)) mgps_add(MGX_CVERTEX, nv, V, C); else mgps_add(MGX_VERTEX, nv, V, NULL); mgps_add(MGX_END, 0, NULL, NULL); } else if (flag & APF_EDGEDRAW) { mgps_add(MGX_BGNLINE, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); mgps_add(MGX_VERTEX, nv, V, NULL); mgps_add(MGX_VERTEX, 1, V, NULL); mgps_add(MGX_END, 0, NULL, NULL); } if (flag & APF_NORMALDRAW) { mgps_closer(); mgps_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->normalcolor); for (n = N, v = V, count = 0; count 1) * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgps_fatpoint(HPoint3 *v) { HPoint3 a; HPoint3 *p, *q; float vw; /* fprintf(stderr,"X11: make a fat-point\n"); */ if (!(_mgc->has & HAS_POINT)) mg_makepoint(); /* Compute w component of point after projection to screen */ vw = v->x * _mgc->O2S[0][3] + v->y * _mgc->O2S[1][3] + v->z * _mgc->O2S[2][3] + v->w * _mgc->O2S[3][3]; if (vw <= 0) return; #define PUT(p) \ a.x = v->x + p->x*vw; a.y = v->y + p->y*vw; \ a.z = v->z + p->z*vw; a.w = v->w + p->w*vw; \ mgps_add(MGX_VERTEX, 1, &a, NULL); p = VVEC(_mgc->point, HPoint3); q = p + VVCOUNT(_mgc->point); mgps_add(MGX_BGNPOLY, 0, NULL, NULL); do { PUT(p); } while (++p < q); mgps_add(MGX_END, 0, NULL, NULL); } /*----------------------------------------------------------------------- * Function: mgps_polyline * Description: draw a polyline (possibly more than 2 vertices) * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgps_polyline( int nv, HPoint3 *v, int nc, ColorA *c, int wrapped ) { int remain; /* fprintf(stderr,"X11: draw a polyline\n"); */ if (!(wrapped & 2)) { if (_mgpsc->znudge) mgps_closer(); } if (nv == 1) { if (nc > 0) mgps_add(MGX_ECOLOR, 0, NULL, c); if (_mgc->astk->ap.linewidth > 1) { mgps_add(MGX_COLOR, 0, NULL, c); mgps_fatpoint(v); } else { mgps_add(MGX_BGNSLINE, 0, NULL, NULL); mgps_add(MGX_CVERTEX, 1, v, c); mgps_add(MGX_END, 0, NULL, NULL); } } else if (nv > 0) { mgps_add(MGX_BGNSLINE, 0, NULL, NULL); if (wrapped & 1) { if (nc > 0) { mgps_add(MGX_ECOLOR, 0, NULL, (c + nc - 1)); mgps_add(MGX_CVERTEX, 1, (v + nv - 1), (c + nc - 1)); } else mgps_add(MGX_CVERTEX, 1, (v + nv - 1), c); } for (;;) { remain = nv > 254 ? 254 : nv; nv -= remain; do { if (--nc > 0) { mgps_add(MGX_ECOLOR, 0, NULL, c); mgps_add(MGX_CVERTEX, 1, v++, c++); } else mgps_add(MGX_CVERTEX, 1, v++, c); } while (--remain > 0); if (nv == 0) break; if (nc > 0) mgps_add(MGX_ECOLOR, 0, NULL, c); mgps_add(MGX_CVERTEX, 1, v, c); mgps_add(MGX_END, 0, NULL, NULL); mgps_add(MGX_BGNSLINE, 0, NULL, NULL); } mgps_add(MGX_END, 0, NULL, NULL); } if (!(wrapped & 4) && _mgpsc->znudge) mgps_farther(); } /*----------------------------------------------------------------------- * Function: mgps_polylist * Description: draws a Polylist: collection of Polys * Author: Daeron Meyer * Notes: see mg.doc */ void mgps_polylist( int np, Poly *_p, int nv, Vertex *V, int pl_flags ) { int i, j; Poly *p; Vertex **v, *vp, **vh; struct mgastk *ma = _mgc->astk; int plflags = pl_flags; int flag, shading; int nonsurf = -1; flag = ma->ap.flag; shading = ma->ap.shading; /* fprintf(stderr,"X11: draw a polylist %d\n",np); */ switch(shading) { case APF_FLAT: plflags &= ~PL_HASVN; if (plflags & PL_HASPCOL) { plflags &= ~PL_HASVCOL; } break; case APF_SMOOTH: plflags &= ~PL_HASPN; break; case APF_VCFLAT: plflags &= ~PL_HASVN; break; default: plflags &= ~(PL_HASVN|PL_HASPN); break; } if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) plflags &= ~(PL_HASVCOL | PL_HASPCOL); if (flag & APF_FACEDRAW) { for (p = _p, i = 0; i < np; i++, p++) { v = p->v; if ((j = p->n_vertices) <= 2) nonsurf = i; else { if (flag & APF_EDGEDRAW) { if (shading == APF_FLAT || shading == APF_CONSTANT) { mgps_add(MGX_BGNEPOLY, 0, NULL, NULL); } else if (plflags & PL_HASVCOL) mgps_add(MGX_BGNSEPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNEPOLY, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); } else { if (shading == APF_FLAT || shading == APF_CONSTANT) { mgps_add(MGX_BGNPOLY, 0, NULL, NULL); } else if (plflags & PL_HASVCOL) mgps_add(MGX_BGNSPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNPOLY, 0, NULL, NULL); } if (plflags & PL_HASPCOL) mgps_add(MGX_COLOR, 0, NULL, &p->pcol); else if (plflags & PL_HASVCOL) /* if we have per vertex */ mgps_add(MGX_COLOR, 0, NULL, &(*v)->vcol); else mgps_add(MGX_COLOR, 0, NULL, &(ma->ap.mat->diffuse)); vh = v; do { if (plflags & PL_HASVCOL) mgps_add(MGX_CVERTEX, 1, &(*v)->pt, &(*v)->vcol); else mgps_add(MGX_CVERTEX, 1, &(*v)->pt, &(*vh)->vcol); v++; } while (--j > 0); mgps_add(MGX_END, 0, NULL, NULL); } } } if (flag & (APF_EDGEDRAW | APF_NORMALDRAW) || nonsurf > 0) { if (_mgpsc->znudge) mgps_closer(); if (flag & APF_EDGEDRAW && !(flag & APF_FACEDRAW)) { mgps_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); for (p = _p, i = 0; i < np; i++, p++) { mgps_add(MGX_BGNLINE, 0, NULL, NULL); for (j = 0, v = p->v; j < p->n_vertices; j++, v++) mgps_add(MGX_VERTEX, 1, &(*v)->pt, NULL); mgps_add(MGX_VERTEX, 1, &(*(p->v))->pt, NULL); mgps_add(MGX_END, 0, NULL, NULL); } } if (flag & APF_NORMALDRAW) { mgps_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->normalcolor); if (pl_flags & PL_HASPN) { for (p = _p, i = 0; i < np; i++, p++) { for (j = 0, v = p->v; j < p->n_vertices; j++, v++) mgps_drawnormal(&(*v)->pt, &p->pn); } } else if (pl_flags & PL_HASVN) { for (vp = V, i = 0; i < nv; i++, vp++) mgps_drawnormal(&vp->pt, &vp->vn); } } for (p = _p, i = 0; i <= nonsurf; p++, i++) { v = p->v; switch (j = p->n_vertices) { case 1: mgps_add(MGX_BGNLINE, 0, NULL, NULL); if (pl_flags & PL_HASVCOL) mgps_add(MGX_ECOLOR, 0, NULL, &(*v)->vcol); mgps_add(MGX_VERTEX, 1, &(*v)->pt, NULL); mgps_add(MGX_END, 0, NULL, NULL); break; case 2: mgps_add(MGX_BGNLINE, 0, NULL, NULL); do { if (pl_flags & PL_HASVCOL) mgps_add(MGX_ECOLOR, 0, NULL, &(*v)->vcol); mgps_add(MGX_VERTEX, 1, &(*v)->pt, NULL); v++; } while (--j > 0); mgps_add(MGX_END, 0, NULL, NULL); break; } } if (_mgpsc->znudge) mgps_farther(); } } #define HAS_N 1 #define HAS_C 2 #define HAS_SMOOTH 4 /*----------------------------------------------------------------------- * Function: mgpspolymeshrow * Description: draw one row of a mesh * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgpspolymeshrow(int wrap, int has, int off, int count, HPoint3 *P, Point3 *N, ColorA *C, int flag, float *CE, int first) { int k; int edges = flag & APF_EDGEDRAW; int faces = flag & APF_FACEDRAW; if (wrap & MM_UWRAP) { k = count - 1; if (edges && faces) { if (has & HAS_SMOOTH) mgps_add(MGX_BGNSEPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNEPOLY, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, CE); } else if (faces) { if (has & HAS_SMOOTH) mgps_add(MGX_BGNSPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNPOLY, 0, NULL, NULL); } else { mgps_add(MGX_BGNLINE, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, CE); } if (C) { mgps_add(MGX_COLOR, 0, NULL, C+off+k); C2 = C+off+k; } else mgps_add(MGX_COLOR, 0, NULL, C2); if (has & HAS_SMOOTH) { if (C) { mgps_add(MGX_CVERTEX, 1, P+off+k, C+off+k); mgps_add(MGX_CVERTEX, 1, P+k, C+k); mgps_add(MGX_CVERTEX, 1, P, C); mgps_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C+off; } else { mgps_add(MGX_CVERTEX, 1, P+off+k, C2); mgps_add(MGX_CVERTEX, 1, P+k, C2); mgps_add(MGX_CVERTEX, 1, P, C2); mgps_add(MGX_CVERTEX, 1, P+off, C2); } } else { mgps_add(MGX_VERTEX, 1, P+off+k, NULL); mgps_add(MGX_VERTEX, 1, P+k, NULL); mgps_add(MGX_VERTEX, 1, P, NULL); mgps_add(MGX_VERTEX, 1, P+off, NULL); } mgps_add(MGX_END, 0, NULL, NULL); } k = count; do { if (edges && faces) { if (has & HAS_SMOOTH) mgps_add(MGX_BGNSEPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNEPOLY, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, CE); } else if (faces) { if (has & HAS_SMOOTH) mgps_add(MGX_BGNSPOLY, 0, NULL, NULL); else mgps_add(MGX_BGNPOLY, 0, NULL, NULL); } else { mgps_add(MGX_BGNLINE, 0, NULL, NULL); mgps_add(MGX_ECOLOR, 0, NULL, CE); /* ADDED */ if (first) mgps_add(MGX_VERTEX, 1, P+1+off, NULL); /* END */ } if (C) { mgps_add(MGX_COLOR, 0, NULL, C+off); C2 = C+off; } if (has & HAS_SMOOTH) { if (C) { mgps_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C; } else mgps_add(MGX_CVERTEX, 1, P+off, C2); if (C) { mgps_add(MGX_CVERTEX, 1, P++, C++); C2 = C; } else mgps_add(MGX_CVERTEX, 1, P++, C2); if (C) { mgps_add(MGX_CVERTEX, 1, P, C); C2 = C; } else mgps_add(MGX_CVERTEX, 1, P, C2); if (C) { mgps_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C; } else mgps_add(MGX_CVERTEX, 1, P+off, C2); } else { mgps_add(MGX_VERTEX, 1, P+off, NULL); if (C) C++; if (N) N++; mgps_add(MGX_VERTEX, 1, P++, NULL); mgps_add(MGX_VERTEX, 1, P, NULL); mgps_add(MGX_VERTEX, 1, P+off, NULL); } mgps_add(MGX_END, 0, NULL, NULL); } while (--k > 1); } /*----------------------------------------------------------------------- * Function: mgpssubmesh * Description: divide up mesh and draw by rows * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgpssubmesh(int wrap, int nu, int nv, int umin, int umax, int vmin, int vmax, HPoint3 *meshP, Point3 *meshN, ColorA *meshC) { int v; int ucnt; HPoint3 *P; Point3 *N; ColorA *C; int prev; int du; int i; int has; Appearance *ap; if (nu <= 0 || nv <= 0) return; ap = &_mgc->astk->ap; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) meshC = 0; has = 0; if (meshN && !(_mgc->astk->flags & MGASTK_SHADER)) has = HAS_N; if (meshC) has |= HAS_C; if (IS_SMOOTH(ap->shading)) has |= HAS_SMOOTH; if ( ap->flag & (APF_FACEDRAW | APF_EDGEDRAW) ) /* BUG? */ { if (!(has & HAS_C)) mgps_add(MGX_COLOR, 0, NULL, &ap->mat->diffuse); C2 = (ColorA *) &ap->mat->diffuse; v = vmax - vmin + 1; du = umin + vmin * nu; if (wrap & MM_VWRAP) { prev = nu * (v - 1); } else { du += nu; prev = -nu; v--; } do { P = meshP + du; N = meshN + du; C = meshC + du; ucnt = umax - umin + 1; mgpspolymeshrow(wrap, has, prev, ucnt, P, has & HAS_N ? N : NULL, has & HAS_C ? C : NULL, ap->flag, (float *)&ap->mat->edgecolor, (int)(v!=1)); prev = -nu; du += nu; } while (--v > 0); } if (ap->flag & APF_NORMALDRAW && meshN != NULL) { mgps_add(MGX_ECOLOR, 0, NULL, &ap->mat->normalcolor); if (_mgpsc->znudge) mgps_closer(); for (i = nu*nv, P = meshP, N = meshN; --i >= 0; P++, N++) mgps_drawnormal(P, N); if (_mgpsc->znudge) mgps_farther(); } } /*----------------------------------------------------------------------- * Function: mgps_mesh * Description: draw a mesh * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgps_mesh(int wrap, int nu, int nv, HPoint3 *P, Point3 *N, Point3 *NQ, ColorA *C ) { mgpssubmesh( wrap, nu, nv, 0, nu-1, 0, nv-1, P, N, C); } /*-----------------------------------------------------------------------* * end of mesh drawing functions: * *-----------------------------------------------------------------------*/ /* * Z-shift routines: for moving edges closer than faces, etc. */ void mgps_init_zrange() { _mgpsc->znudge = 1; _mgpsc->znudgeby = 0.0; } void mgps_closer() { /* _mgpsc->znudgeby = 0.001; */ } void mgps_farther() { _mgpsc->znudgeby = 0.0; } void mgps_findcam() { } /* There is a basic problem now with 4-d points and 3-d normal vectors. For now, we'll just ignore the 4-th coordinate of the point when computing the tip of the normal vector. This will work OK with all existing models, but for genuine 4-d points it won't work. But, come to think of it, what is the correct interpretation of the normal vector when the points live in 4-d? */ void mgps_drawnormal(HPoint3 *p, Point3 *n) { Point3 tp; HPoint3 end; Pt3Coord scale, w, s; /* fprintf(stderr,"X11: draw a normal\n"); */ if (p->w <= 0.0) return; if (p->w != 1) { HPt3ToPt3(p, &tp); p = (HPoint3 *)(void *)&tp; } scale = _mgc->astk->ap.nscale; if (_mgc->astk->ap.flag & APF_EVERT) { HPoint3 *cp = &_mgc->cpos; if (!(_mgc->has & HAS_CPOS)) { mg_findcam(); } if ((w = cp->w) != 1.0 && w != 0.0) { s = (p->x*w-cp->x)*n->x + (p->y*w-cp->y)*n->y + (p->z*w-cp->z)*n->z; } else { s = (p->x-cp->x)*n->x + (p->y-cp->y)*n->y + (p->z-cp->z)*n->z; } if (s > 0) { scale = -scale; } } end.x = p->x + scale*n->x; end.y = p->y + scale*n->y; end.z = p->z + scale*n->z; end.w = 1.0; mgps_add(MGX_BGNLINE, 0, NULL, NULL); mgps_add(MGX_VERTEX, 1, p, NULL); mgps_add(MGX_VERTEX, 1, &end, NULL); mgps_add(MGX_END, 0, NULL, NULL); } geomview-1.9.4/src/lib/mg/ps/Makefile.am0000644000175000001440000000032310455665336014715 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgps.la libmgps_la_SOURCES = \ mgps.c mgpsclip.c mgpsdraw.c mgpstri.c mgpswindows.c \ mgps.h mgpsP.h mgpstri.h mgpswindows.h geomview-1.9.4/src/lib/mg/ps/Makefile.in0000644000175000001440000003607510665240505014731 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mg/ps DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmgps_la_LIBADD = am_libmgps_la_OBJECTS = mgps.lo mgpsclip.lo mgpsdraw.lo mgpstri.lo \ mgpswindows.lo libmgps_la_OBJECTS = $(am_libmgps_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libmgps_la_SOURCES) DIST_SOURCES = $(libmgps_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgps.la libmgps_la_SOURCES = \ mgps.c mgpsclip.c mgpsdraw.c mgpstri.c mgpswindows.c \ mgps.h mgpsP.h mgpstri.h mgpswindows.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/ps/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/ps/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libmgps.la: $(libmgps_la_OBJECTS) $(libmgps_la_DEPENDENCIES) $(LINK) $(libmgps_la_OBJECTS) $(libmgps_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgps.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgpsclip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgpsdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgpstri.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgpswindows.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/mg/ps/mgps.c0000644000175000001440000004574310622716756014011 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgps.h" #include "mgpsP.h" #include "windowP.h" #include "mgpswindows.h" #include void mgps_reshapeviewport(void); void mgps_appearance( struct mgastk *ma, int mask ); void mgps_setshader(mgshadefunc shader); mgcontext * mgps_ctxcreate(int a1, ...); int mgps_ctxset( int a1, ... ); int mgps_feature( int feature ); void mgps_ctxdelete( mgcontext *ctx ); int mgps_ctxget( int attr, void* valueptr ); int mgps_ctxselect( mgcontext *ctx ); void mgps_sync( void ); void mgps_worldbegin( void ); void mgps_worldend( void ); void mgps_identity( void ); void mgps_transform( Transform T ); int mgps_pushtransform( void ); int mgps_poptransform( void ); void mgps_gettransform( Transform T ); void mgps_settransform( Transform T ); int mgps_pushappearance( void ); int mgps_popappearance( void ); const Appearance *mgps_setappearance(const Appearance* app, int merge ); int mgps_setcamera( Camera* cam ); int mgps_setwindow( WnWindow *win, int final ); mgpscontext *mgps_newcontext( mgpscontext *ctx ); /* probably not here */ int mgdevice_PS(); extern void mgps_polygon(); extern void mgps_mesh(); extern void mgps_line(); extern void mgps_polyline(); extern void mgps_polylist(); extern void mgps_quads(); int _mgps_ctxset(int a1, va_list *alist); WnWindow *mgpswindow(WnWindow *win); struct mgfuncs mgpsfuncs = { MGD_PS, mgdevice_PS, mgps_feature, (mgcontext *(*)())mgps_ctxcreate, mgps_ctxdelete, (int (*)())mgps_ctxset, mgps_ctxget, mgps_ctxselect, mgps_sync, mgps_worldbegin, mgps_worldend, mgps_reshapeviewport, /* geometry transform */ mgps_settransform, mgps_gettransform, mgps_identity, mgps_transform, mgps_pushtransform, mgps_poptransform, /* texture geometry transform */ mg_settxtransform, mg_gettxtransform, mg_txidentity, mg_txtransform, mg_pushtxtransform, mg_poptxtransform, /* appearances */ mgps_pushappearance, mgps_popappearance, mgps_setappearance, mg_getappearance, /***************/ mgps_setcamera, mgps_polygon, mgps_polylist, mgps_mesh, mgps_line, mgps_polyline, mg_quads, mg_bezier, mg_bsptree, mg_tagappearance, mg_untagappearance, mg_taggedappearance }; void mgps_reshapeviewport(void) { CamSet(_mgc->cam, CAM_ASPECT, (double)_mgpsc->xsize/(double)_mgpsc->ysize, CAM_END); } /*----------------------------------------------------------------------- * Function: mgdevice_PS * Description: select the PS device as the current MG device * Returns: 1 * Author: daeron * Notes: */ int mgdevice_PS() { _mgf = mgpsfuncs; if(_mgc != NULL && _mgc->devno != MGD_PS) _mgc = NULL; return(0); } /*----------------------------------------------------------------------- * Function: mgps_newcontext * Description: initialize an mgcontext structure * Args: mgc: ptr to context structure to initialize * Returns: mgc * Notes: Further device-specific initialization is normally required. */ mgpscontext * mgps_newcontext( mgpscontext *ctx ) { mg_newcontext(&(ctx->mgctx)); ctx->mgctx.devfuncs = &mgpsfuncs; ctx->mgctx.devno = MGD_PS; ctx->mgctx.astk->ap_seq = 1; ctx->mgctx.astk->mat_seq = 1; ctx->mgctx.astk->light_seq = 1; ctx->mgctx.astk->shader = mg_eucshade; ctx->mgctx.zfnudge = 40.e-6; ctx->xsize = ctx->ysize = 0; ctx->file = NULL; ctx->born = 0; VVINIT(ctx->room, char, 180); return ctx; } /*----------------------------------------------------------------------- * Function: _mgps_ctxset * Description: internal ctxset routine * Args: a1: first attribute * *alist: rest of attribute-value list * Returns: -1 on error, 0 on success * Date: Fri Sep 20 11:08:13 1991 * Notes: mgps_ctxcreate() and mgps_ctxset() call this to actually * parse and interpret the attribute list. */ int _mgps_ctxset(int a1, va_list *alist) { int attr; char **ablock = NULL; #define NEXT(type) OOGL_VA_ARG(type, alist, ablock) for (attr = a1; attr != MG_END; attr = NEXT(int)) { switch (attr) { case MG_ABLOCK: ablock = NEXT(char**); break; case MG_ApSet: { Appearance *ap; if (ablock) ap = ApSet(NULL, AP_ABLOCK, ablock); else ap = _ApSet(NULL, va_arg(*alist, int), alist); mgps_setappearance(ap, MG_MERGE); ApDelete(ap); } break; case MG_WnSet: if (ablock) WnSet( _mgc->win, WN_ABLOCK, ablock); else _WnSet( _mgc->win, va_arg(*alist, int), alist); mgps_setwindow( _mgc->win, 0 ); break; case MG_CamSet: if (ablock) CamSet( _mgc->cam, CAM_ABLOCK, ablock); else _CamSet( _mgc->cam, va_arg(*alist, int), alist); break; case MG_APPEAR: mgsetappearance( NEXT(Appearance *), MG_SET ); break; case MG_WINDOW: if (_mgc->win) WnDelete(_mgc->win); _mgc->win = NEXT(WnWindow *); mgps_setwindow( NULL, 0 ); break; case MG_CAMERA: mgps_setcamera( NEXT(Camera *) ); break; case MG_SETOPTIONS: _mgc->opts |= NEXT(int); break; case MG_UNSETOPTIONS: _mgc->opts &= ~NEXT(int); break; case MG_SHOW: _mgc->shown = NEXT(int); break; case MG_PARENT: _mgc->parent = NEXT(mgcontext*); break; case MG_BACKGROUND: { ColorA bcolor; bcolor = *NEXT(ColorA*); _mgc->background = bcolor; } break; case MG_SHADER: mgps_setshader( NEXT(mgshadefunc) ); break; case MG_SHADERDATA: _mgc->astk->shaderdata = NEXT(void*); break; case MG_SPACE: { int space = NEXT(int); switch (TM_SPACE(space)) { case TM_EUCLIDEAN: case TM_SPHERICAL: _mgc->space = space; break; case TM_HYPERBOLIC: switch (TM_MODEL(space)) { case TM_VIRTUAL: case TM_PROJECTIVE: case TM_CONFORMAL_BALL: _mgc->space = space; break; default: fprintf(stderr, "_mgps_ctxset: Illegal space value %1d\n", space); } break; default: fprintf(stderr, "_mgps_ctxset: Illegal space value %1d\n", space); } } break; case MG_NDCTX: _mgc->NDctx = NEXT(mgNDctx *); break; case MG_ZNUDGE: _mgc->zfnudge = NEXT(double); break; case MG_PSFILE: _mgpsc->file = NEXT(FILE *); break; case MG_PSFILEPATH: if (_mgpsc->file) fclose(_mgpsc->file); strcpy(_mgpsc->filepath, NEXT(char *)); _mgpsc->file = fopen(_mgpsc->filepath, "w"); break; default: OOGLError (0, "_mgps_ctxset: undefined option: %d", attr); return -1; } } if (_mgc->shown && !_mgpsc->born) { /* open the window */ mgpswindow(_mgc->win); /* bring PS state into accordance with appearance state */ { Appearance *ap = ApCopy( &(_mgc->astk->ap), NULL ); mgps_setappearance( ap, MG_SET ); ApDelete(ap); } } #undef NEXT return 0; } /* This needs some checking -- TOR */ int mgps_setwindow( WnWindow *win, int final ) { int xsize, ysize; if (win == NULL) return 0; WnGet(_mgc->win, WN_XSIZE, &xsize); WnGet(_mgc->win, WN_YSIZE, &ysize); _mgpsc->xsize = xsize; _mgpsc->ysize = ysize; return 1; } /*----------------------------------------------------------------------- * Function: mgps_identity * Description: Set the current object xform to the identity * Args: (none) * Returns: nothing * Notes: Sets the xform on the top of the current context's xform * stack to the identity. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgps_identity( void ) { mgps_settransform( TM3_IDENTITY ); } /*----------------------------------------------------------------------- * Function: mgps_settransform * Description: Set the current object xform * Args: T * Returns: nothing * Notes: Sets the xform on the top of the current context's xform * stack to T. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgps_settransform( Transform T ) { TmCopy(T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgps_gettransform * Description: Get the current object xform * Args: T * Returns: nothing * Notes: Writes the current object xform, from the top of the * context's xform stack, into T. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgps_gettransform( Transform T ) { TmCopy(_mgc->xstk->T, T); } /*----------------------------------------------------------------------- * Function: mgps_transform * Description: premultiply the current object xform by a transform * Args: T: the transform to premultiply by * Returns: nothing * Notes: If X is the context's current object xform, replaces X * by T X. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgps_transform( Transform T ) { TmConcat(T, _mgc->xstk->T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgps_pushappearance * Description: push the context's appearance stack * Returns: nothing * Notes: * DEVICE USE: required --- all devices must maintain this stack */ int mgps_pushappearance() { mg_pushappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgps_popappearance * Description: pop the context's appearance stack * Returns: nothing * Notes: * DEVICE USE: required --- all deviced must maintain this stack */ int mgps_popappearance() { struct mgastk *mastk = _mgc->astk; struct mgastk *mastk_next; if (!(mastk_next = mastk->next)) { OOGLError(0, "mgps_popappearance: appearance stack has only 1 entry."); return 0; } mgps_appearance(mastk_next, mastk_next->ap.valid); mg_popappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgps_setappearance * Description: Operate on appearance in current context * Args: *ap: the appearance to assign or merge * mergeflag: MG_MERGE or MG_SET * Returns: ptr to current appearance * Notes: Modifies the context's current apperance. Does not * modify *ap. * mergeflag = MG_MERGE: merge *ap into current appearance * mergeflag = MG_SET: set current appearance to *ap * DEVICE USE: required --- when ??? * * Can we modify this to do some of the flag setting * than mgps_setappearance currently does??? This * seems common to all devices. */ const Appearance * mgps_setappearance(const Appearance *ap, int mergeflag ) { int changed, lng_changed; struct mgastk *mastk = _mgc->astk; Appearance *ma; ma = &(mastk->ap); if(mergeflag == MG_MERGE) { changed = ap->valid &~ (ma->override &~ ap->override); lng_changed = ap->lighting ? ap->lighting->valid &~ (ma->lighting->override &~ ap->lighting->override) : 0; } else { changed = ap->valid; lng_changed = ap->lighting ? ap->lighting->valid : 0; } mg_setappearance( ap, mergeflag ); if ((ap->lighting) && (mastk->next)) { if (mastk->light_seq == mastk->next->light_seq) { mastk->light_seq++; lng_changed |= ma->lighting->valid; /* "All fields changed" */ } } mgps_appearance( mastk, changed); return ap; } /*----------------------------------------------------------------------- * Function: mgps_setcamera * Description: Set the context's camera * Args: *cam: the camera to use * Returns: nothing * Notes: The context does not maintain an internal copy of the * camera. Only the pointer is stored. * DEVICE USE: required */ int mgps_setcamera( Camera *cam ) { if (_mgc->cam) CamDelete(_mgc->cam); _mgc->cam = cam; RefIncr((Ref*) cam); return 0; } /*----------------------------------------------------------------------- * Function: mgps_ctxset * Description: set some attributes in the current context * Args: attr, ...: list of attribute-value pairs, terminated * by MG_END * Returns: -1 on error, 0 on success * Notes: DO NOT CALL THIS (yet)! It currently does nothing. * DEVICE USE: forbidden --- devices have their own mgxx_ctxset() * * This needs to be modified to work as the NULL device. * Use by other devices may never be needed. */ int mgps_ctxset( int attr, ... /*, MG_END */ ) { va_list alist; int result; va_start( alist, attr ); result = _mgps_ctxset(attr, &alist); va_end(alist); return result; } /*----------------------------------------------------------------------- * Function: mgps_ctxget * Description: get an attribute from the current context * Args: attr: the attribute to get * value: place to write attr's value * */ int mgps_ctxget( int attr, void *value ) { #define VALUE(type) ((type*)value) switch (attr) { case MG_APPEAR: *VALUE(Appearance*) = &(_mgc->astk->ap); break; case MG_CAMERA: *VALUE(Camera*) = _mgc->cam; break; case MG_WINDOW: /* pretty silly concept, IMHO :-) */ *VALUE(WnWindow*) = _mgc->win; break; case MG_PARENT: *VALUE(mgcontext*) = _mgc->parent; break; case MG_SETOPTIONS: case MG_UNSETOPTIONS: *VALUE(int) = _mgc->opts; break; case MG_BACKGROUND: *VALUE(ColorA) = _mgc->background; break; case MG_SHADER: *VALUE(mgshadefunc) = _mgc->astk->shader; break; case MG_SHADERDATA: *VALUE(void *) = _mgc->astk->shaderdata; break; case MG_SPACE: *VALUE(int) = _mgc->space; break; case MG_NDCTX: *VALUE(mgNDctx *) = _mgc->NDctx; break; case MG_ZNUDGE: *VALUE(float) = _mgc->zfnudge; break; case MG_PSFILE: *VALUE(FILE *) = _mgpsc->file; break; case MG_PSFILEPATH: *VALUE(char *) = _mgpsc->filepath; break; default: OOGLError (0, "mgps_ctxget: undefined option: %d\n", attr); return -1; } return 1; #undef VALUE } /*----------------------------------------------------------------------- * Function: mgps_feature * Description: determine whether the NULL device has a particular feature * Args: feature: feature to test for * Returns: -1 (means feature is not present) * Notes: PS device is rather featureless at present, :-) * DEVICE USE: forbidden --- devices have their own mgxx_feature() */ int mgps_feature( int feature ) { return -1; } /*----------------------------------------------------------------------- * Function: mgps_ctxcreate * Description: create a new MG context for the PS device * Args: a1, ...: list of attribute-value pairs * Returns: ptr to new context * Author: daeron */ mgcontext * mgps_ctxcreate( int a1, ... ) { va_list alist; _mgc = (mgcontext*)mgps_newcontext( OOGLNewE(mgpscontext, "mgps_ctxcreate") ); mgps_initpsdevice(); va_start(alist, a1); if (_mgps_ctxset(a1, &alist) == -1) { mgps_ctxdelete(_mgc); } va_end(alist); return _mgc; } /*----------------------------------------------------------------------- * Function: mgps_ctxdelete * Description: delete an MG context for the PS device * Args: *ctx: ptr to context to delete * Returns: nothing * Author: daeron */ void mgps_ctxdelete( mgcontext *ctx ) { mgpscontext *_mgx = (mgpscontext *)ctx; if(ctx->devno != MGD_PS) { mgcontext *was = _mgc; mgctxselect(ctx); mgctxdelete(ctx); if (was != ctx) mgctxselect(was); } else { vvfree(&_mgx->room); mg_ctxdelete(ctx); if (ctx == _mgc) _mgc = NULL; } } /*----------------------------------------------------------------------- * Function: mgps_ctxselect * Description: select the current context * Args: *ctx: the context to select * Returns: 0 (why ???) * Author: daeron */ int mgps_ctxselect( mgcontext *ctx ) { if (ctx == NULL || ctx->devno != MGD_PS) { return mg_ctxselect(ctx); } /* PS context */ _mgc = ctx; return(0); } /*----------------------------------------------------------------------- * Function: mgps_pushtransform * Description: push the mg context xform stack * Returns: nothing */ int mgps_pushtransform( void ) { mg_pushtransform(); return 0; } /*----------------------------------------------------------------------- * Function: mgps_poptransform * Description: pop the mg context xform stack * Returns: nothing */ int mgps_poptransform( void ) { mg_poptransform(); return 0; } void mgps_sync( void ) { } void mgps_worldbegin( void ) { mg_worldbegin(); mgps_newdisplaylist(); _mgpsc->znudgeby = 0.0; } void mgps_worldend( void ) { if (_mgpsc->file == NULL) return; mgps_sortdisplaylist(); mgps_showdisplaylist(_mgpsc->file); } WnWindow * mgpswindow(WnWindow *win) { _mgpsc->born = 1; mgps_setwindow(win, 1); mgps_init_zrange(); return(win); } void mgps_setshader(mgshadefunc shader) { struct mgastk *ma = _mgc->astk; unsigned short wasusing = ma->flags & MGASTK_SHADER; ma->shader = shader; if (shader != NULL && IS_SHADED(ma->ap.shading)) { ma->flags |= MGASTK_SHADER; } else { ma->flags &= ~MGASTK_SHADER; } if((ma->flags & MGASTK_SHADER) != wasusing) mgps_appearance(_mgc->astk, APF_SHADING); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/mg/ps/mgps.h0000644000175000001440000000173710455701005013772 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef MGPS_H #define MGPS_H #define MG_PSFILE 101 #define MG_PSFILEPATH 102 #endif geomview-1.9.4/src/lib/mg/ps/mgpstri.c0000644000175000001440000002715110622716756014521 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "polylistP.h" #include "hpoint3.h" #include "mg.h" #include "mgP.h" #include "mgps.h" #include "mgpsP.h" #include "mgpstri.h" #define TOL 0.05 #define AREA 25000 #ifndef max # define max(a,b) ((a) > (b) ? (a) : (b)) #endif /*static double areaThreshold;*/ static FILE *psout; static void smoothLine(CPoint3 *p0, CPoint3 *p1); static void smoothTriangle(CPoint3 *p0, CPoint3 *p1, CPoint3 *p2); /*static double triArea(double *p0, double *p1, double *p2);*/ static double cdelta(double *p0, double *p1); static void subdivtri(double *v0, double *v1, double *v2); static void plerp(double *v0, double *v1, double *l); static void outtri(double *v0, double *v1, double *v2); /* PS page initialization stuff follows */ #define PNTS (72.0) #define BORDPAGEMARGIN (0.25) #define BORDPAGEXSIZE ( 8.5-2.0*BORDPAGEMARGIN) #define BORDPAGEYSIZE (11.0-2.0*BORDPAGEMARGIN) #define FULLPAGEMARGIN (0.00) #define FULLPAGEXSIZE ( 8.5-2.0*FULLPAGEMARGIN) #define FULLPAGEYSIZE (11.0-2.0*FULLPAGEMARGIN) static double pagexsize = BORDPAGEXSIZE; static double pageysize = BORDPAGEYSIZE; static double pagemargin = BORDPAGEMARGIN; void MGPS_startPS(FILE *outf, ColorA *col, double aspect, int width, int height) { double imgxinches, imgyinches; double pagexinches, pageyinches, pageaspect; double dx, dy; double xmargin, ymargin; time_t tm; psout = outf; time(&tm); fprintf(psout,"%%!PS-Adobe-2.0 EPSF-1.2\n"); fprintf(psout,"%%%%Title: Geomview Snapshot\n"); fprintf(psout,"%%%%Creator: Geomview\n"); fprintf(psout,"%%%%CreationDate: %s", ctime(&tm)); fprintf(psout,"%%%%For: %s\n", getenv("USER")); /* areaThreshold = (width*height)/(double)AREA;*/ dx = width; dy = height; if (aspect>1.0) { pagexinches = pageysize; pageyinches = pagexsize; } else { pagexinches = pagexsize; pageyinches = pageysize; } pageaspect = pagexinches/pageyinches; if (aspect<=pageaspect) { imgyinches = pageyinches; imgxinches = imgyinches*aspect; xmargin = pagemargin+(pagexinches-imgxinches)/2.0; ymargin = pagemargin; } else { imgxinches = pagexinches; imgyinches = imgxinches/aspect; xmargin = pagemargin; ymargin = pagemargin+(pageyinches-imgyinches)/2.0; } if (aspect>1.0) fprintf(psout,"%%%%BoundingBox: %d %d %d %d\n", (int)(PNTS*ymargin), (int)(PNTS*xmargin), (int)(PNTS*(ymargin+imgyinches)), (int)(PNTS*(xmargin+imgxinches))); else fprintf(psout,"%%%%BoundingBox: %d %d %d %d\n", (int)(PNTS*xmargin), (int)(PNTS*ymargin), (int)(PNTS*(xmargin+imgxinches)), (int)(PNTS*(ymargin+imgyinches))); fprintf(psout,"%%%%EndComments\n"); fprintf(psout,"gsave\n"); fprintf(psout,"1 setlinecap 1 setlinejoin\n"); if (aspect>1.0) { fprintf(psout,"%f %f translate\n",0.0,PNTS*FULLPAGEYSIZE); fprintf(psout,"-90.0 rotate\n"); } fprintf(psout,"%f %f translate\n", PNTS*xmargin, PNTS*ymargin); fprintf(psout,"%f %f scale\n",PNTS*imgxinches/dx,PNTS*imgyinches/dy); /* Now set up commands */ fprintf(psout,"[ %% stack mark\n"); fprintf(psout,"/poly {\n"); fprintf(psout," setrgbcolor newpath moveto\n"); fprintf(psout," counttomark 2 idiv { lineto } repeat closepath fill\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"/epoly {\n"); fprintf(psout," setrgbcolor newpath moveto\n"); fprintf(psout," counttomark 4 sub 2 idiv { lineto } repeat closepath\n"); fprintf(psout,"gsave fill grestore setrgbcolor setlinewidth stroke\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"/lines {\n"); fprintf(psout," setlinewidth setrgbcolor newpath moveto\n"); fprintf(psout," counttomark 2 idiv { lineto } repeat stroke\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"/clines {\n"); fprintf(psout," setlinewidth setrgbcolor newpath moveto\n"); fprintf(psout," counttomark 2 idiv { lineto } repeat closepath stroke\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"/circ {\n"); fprintf(psout," setrgbcolor newpath 0 360 arc fill\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"/tri {\n"); fprintf(psout," setrgbcolor newpath moveto lineto lineto\n"); fprintf(psout," closepath fill\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"/l {\n"); fprintf(psout," setrgbcolor newpath moveto lineto stroke\n"); fprintf(psout,"} bind def\n"); fprintf(psout,"%%\n"); fprintf(psout,"0 0 moveto %d 0 lineto %d %d lineto 0 %d lineto\n", width, width, height, height); fprintf(psout,"%g %g %g setrgbcolor closepath fill\n", col->r, col->g, col->b); } void MGPS_finishPS(void) { fprintf(psout,"pop\ngrestore\nshowpage\n\n"); } void MGPS_polyline(CPoint3 *pts, int num, double width, int *col) { int i; if (num == 1) { fprintf(psout, "%g %g %g %g %g %g circ\n", pts[0].x, pts[0].y, (width + 1.0) / 2.0, col[0]/255.0, col[1]/255.0, col[2]/255.0); return; } for (i=0; ix; x0[1] = p0->y; x0[2] = p0->vcol.r; x0[3] = p0->vcol.g; x0[4] = p0->vcol.b; x1[0] = p1->x; x1[1] = p1->y; x1[2] = p1->vcol.r; x1[3] = p1->vcol.g; x1[4] = p1->vcol.b; delta = cdelta(x0, x1); num = max(1, delta/TOL); for (i=0; ix + (p1->x - p0->x)*i/(double)num, p0->y + (p1->y - p0->y)*i/(double)num, p0->x + (p1->x - p0->x)*(i+1)/(double)num, p0->y + (p1->y - p0->y)*(i+1)/(double)num, p0->vcol.r + (p1->vcol.r - p1->vcol.r)*i/(double)num, p0->vcol.g + (p1->vcol.g - p1->vcol.g)*i/(double)num, p0->vcol.b + (p1->vcol.b - p1->vcol.b)*i/(double)num); } /* * pssubdivtriangle Draw a color shaded triangle by subdividing it in * C code and generating many small triangles. */ static void smoothTriangle(CPoint3 *p0, CPoint3 *p1, CPoint3 *p2) { double x0[5], x1[5], x2[5]; x0[0] = p0->x; x0[1] = p0->y; x0[2] = p0->vcol.r; x0[3] = p0->vcol.g; x0[4] = p0->vcol.b; x1[0] = p1->x; x1[1] = p1->y; x1[2] = p1->vcol.r; x1[3] = p1->vcol.g; x1[4] = p1->vcol.b; x2[0] = p2->x; x2[1] = p2->y; x2[2] = p2->vcol.r; x2[3] = p2->vcol.g; x2[4] = p2->vcol.b; subdivtri(x0,x1,x2); } static double cdelta(double *p0, double *p1) { double dr, dg, db; dr = p0[2] - p1[2]; if(dr<0) dr = -dr; dg = p0[3] - p1[3]; if(dg<0) dg = -dg; db = p0[4] - p1[4]; if(db<0) db = -db; return max(max(dr,dg),db); } #if 0 static double triArea(double *p0, double *p1, double *p2) { double a, b, c, s; a = sqrt((p1[0]-p0[0])*(p1[0]-p0[0]) + (p1[1]-p0[1])*(p1[1]-p0[1]) + (p1[2]-p0[2])*(p1[2]-p0[2])); b = sqrt((p2[0]-p0[0])*(p2[0]-p0[0]) + (p2[1]-p0[1])*(p2[1]-p0[1]) + (p2[2]-p0[2])*(p2[2]-p0[2])); c = sqrt((p1[0]-p2[0])*(p1[0]-p2[0]) + (p1[1]-p2[1])*(p1[1]-p2[1]) + (p1[2]-p2[2])*(p1[2]-p2[2])); s = (a+b+c)/2.0; return sqrt(s*(s-a)*(s-b)*(s-c)); } #endif #define NONE 0x0 #define D0 0x1 #define D1 0x2 #define D2 0x4 static void subdivtri(double *v0, double *v1, double *v2) { double d0, d1, d2; double i0[5]; double i1[5]; double i2[5]; int code; d0 = cdelta(v0,v1); d1 = cdelta(v1,v2); d2 = cdelta(v2,v0); code = NONE; if (d0 > TOL) code |= D0; if (d1 > TOL) code |= D1; if (d2 > TOL) code |= D2; /* if (triArea(v0, v1, v2) < areaThreshold) code = NONE; */ switch(code) { case NONE: outtri(v0,v1,v2); break; case D0: plerp(v0,v1,i0); subdivtri(v0,i0,v2); subdivtri(v2,i0,v1); break; case D1: plerp(v1,v2,i0); subdivtri(v1,i0,v0); subdivtri(v0,i0,v2); break; case D2: plerp(v2,v0,i0); subdivtri(v2,i0,v1); subdivtri(v1,i0,v0); break; case D0|D1: plerp(v0,v1,i0); plerp(v1,v2,i1); subdivtri(v0,i0,v2); subdivtri(v2,i0,i1); subdivtri(v1,i1,i0); break; case D1|D2: plerp(v1,v2,i0); plerp(v2,v0,i1); subdivtri(v1,i0,v0); subdivtri(v0,i0,i1); subdivtri(v2,i1,i0); break; case D2|D0: plerp(v2,v0,i0); plerp(v0,v1,i1); subdivtri(v2,i0,v1); subdivtri(v1,i0,i1); subdivtri(v0,i1,i0); break; case D2|D1|D0: plerp(v0,v1,i0); plerp(v1,v2,i1); plerp(v2,v0,i2); subdivtri(v0,i0,i2); subdivtri(v1,i1,i0); subdivtri(v2,i2,i1); subdivtri(i0,i1,i2); break; } } static void plerp(double *v0, double *v1, double *l) { l[0] = (v0[0]+v1[0])/2.0; l[1] = (v0[1]+v1[1])/2.0; l[2] = (v0[2]+v1[2])/2.0; l[3] = (v0[3]+v1[3])/2.0; l[4] = (v0[4]+v1[4])/2.0; } static void outtri(double *v0, double *v1, double *v2) { double ar, ag, ab; fprintf(psout,"%g %g ",v0[0],v0[1]); fprintf(psout,"%g %g ",v1[0],v1[1]); fprintf(psout,"%g %g ",v2[0],v2[1]); ar = (v0[2]+v1[2]+v2[2])/3.0; ag = (v0[3]+v1[3]+v2[3])/3.0; ab = (v0[4]+v1[4]+v2[4])/3.0; fprintf(psout,"%g %g %g tri\n",ar,ag,ab); } geomview-1.9.4/src/lib/mg/ps/mgpstri.h0000644000175000001440000000260410455701005014503 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef PSTRI_H #define PSTRI_H void MGPS_startPS(FILE *outf, ColorA *col, double aspect, int width, int height); void MGPS_finishPS(void); void MGPS_polyline(CPoint3 *pts, int num, double width, int *col); void MGPS_spolyline(CPoint3 *pts, int num, double width); void MGPS_poly(CPoint3 *pts, int num, int *col); void MGPS_epoly(CPoint3 *pts, int num, int *col, double ewidth, int *ecol); void MGPS_spoly(CPoint3 *pts, int num); void MGPS_sepoly(CPoint3 *pts, int num, double ewidth, int *ecol); #endif geomview-1.9.4/src/lib/mg/ps/mgpswindows.c0000644000175000001440000002171010622716756015410 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "mg.h" #include "mgP.h" #include "mgps.h" #include "mgpsP.h" #include "mgpstri.h" #include "windowP.h" #include "mgpswindows.h" static mgps_sort *mgpssort = NULL; static double curwidth = 1; /* Function: mgps_initpsdevice Description: allocate space for the display list, initialize mgcontext Author: Daeron Meyer */ int mgps_initpsdevice() { if (!mgpssort) { mgpssort = (mgps_sort *)malloc(sizeof(mgps_sort)); mgpssort->primnum = 1000; VVINIT(mgpssort->primsort, int, mgpssort->primnum); vvneeds(&(mgpssort->primsort), mgpssort->primnum); VVINIT(mgpssort->prims, mgpsprim, mgpssort->primnum); vvneeds(&(mgpssort->prims), mgpssort->primnum); mgpssort->pvertnum = 2024; VVINIT(mgpssort->pverts, CPoint3, mgpssort->pvertnum); vvneeds(&(mgpssort->pverts), mgpssort->pvertnum); } _mgpsc->mysort = mgpssort; return 1; } /* Function: Xmg_newdisplaylist Description: initialize display list Author: Daeron Meyer */ void mgps_newdisplaylist(void) { _mgpsc->mysort->cprim = 0; _mgpsc->mysort->cvert = 0; _mgpsc->mysort->maxverts = 0; _mgpsc->znudgeby = 0.0; } /* Function: mgps_add Description: add a primitive (polygon, vertex, line) to the display list Author: Daeron Meyer */ void mgps_add(int primtype, int numdata, void *data, void *cdata) { HPoint3 *vt = (HPoint3 *)data; ColorA *colarray = (ColorA *)cdata; float *col = (float *)cdata; CPoint3 *vts; int i; static mgpsprim *prim; static ColorA color; static float average_depth; static int numverts; static int ecolor[3]; switch (primtype) { case MGX_BGNLINE: case MGX_BGNSLINE: average_depth = 0.0; prim = &(VVEC(_mgpsc->mysort->prims, mgpsprim)[_mgpsc->mysort->cprim]); if (primtype == MGX_BGNLINE) prim->mykind = PRIM_LINE; else prim->mykind = PRIM_SLINE; prim->index = _mgpsc->mysort->cvert; prim->depth = -100000; /* very far behind the viewer */ numverts = 0; prim->ecolor[0] = ecolor[0]; prim->ecolor[1] = ecolor[1]; prim->ecolor[2] = ecolor[2]; prim->ewidth = curwidth; VVEC(_mgpsc->mysort->primsort, int)[_mgpsc->mysort->cprim] = _mgpsc->mysort->cprim; if (!(_mgc->has & HAS_S2O)) mg_findS2O(); mg_findO2S(); break; case MGX_BGNPOLY: case MGX_BGNSPOLY: case MGX_BGNEPOLY: case MGX_BGNSEPOLY: average_depth = 0.0; prim = &(VVEC(_mgpsc->mysort->prims, mgpsprim) [_mgpsc->mysort->cprim]); switch(primtype) { case MGX_BGNPOLY: prim->mykind = PRIM_POLYGON; break; case MGX_BGNSPOLY: prim->mykind = PRIM_SPOLYGON; break; case MGX_BGNEPOLY: prim->mykind = PRIM_EPOLYGON; break; case MGX_BGNSEPOLY: prim->mykind = PRIM_SEPOLYGON; break; } prim->ewidth = curwidth; prim->index = _mgpsc->mysort->cvert; prim->depth = -100000; /* very far behind the viewer */ numverts = 0; VVEC(_mgpsc->mysort->primsort, int)[_mgpsc->mysort->cprim] = _mgpsc->mysort->cprim; if (!(_mgc->has & HAS_S2O)) mg_findS2O(); mg_findO2S(); break; case MGX_VERTEX: for (i=0; imysort->pverts, CPoint3)[_mgpsc->mysort->cvert]); HPt3Transform(_mgc->O2S, &(vt[i]), (HPoint3 *) vts); vts->drawnext = 1; vts->vcol = color; _mgpsc->mysort->cvert++; numverts++; if (_mgpsc->mysort->cvert > _mgpsc->mysort->pvertnum) { _mgpsc->mysort->pvertnum*=2; vvneeds(&(_mgpsc->mysort->pverts), _mgpsc->mysort->pvertnum); } if (vts->z > prim->depth) prim->depth = vts->z; average_depth += vts->z; } break; case MGX_CVERTEX: for (i=0; imysort->pverts, CPoint3)[_mgpsc->mysort->cvert]); HPt3Transform(_mgc->O2S, &(vt[i]), (HPoint3 *) vts); vts->drawnext = 1; vts->vcol = colarray[i]; _mgpsc->mysort->cvert++; numverts++; if (_mgpsc->mysort->cvert > _mgpsc->mysort->pvertnum) { _mgpsc->mysort->pvertnum*=2; vvneeds(&(_mgpsc->mysort->pverts), _mgpsc->mysort->pvertnum); } if (vts->z > prim->depth) prim->depth = vts->z; average_depth += vts->z; } break; case MGX_COLOR: color = colarray[0]; break; case MGX_ECOLOR: ecolor[0] = (int)(255.0 * col[0]); ecolor[1] = (int)(255.0 * col[1]); ecolor[2] = (int)(255.0 * col[2]); break; case MGX_END: prim->numvts = numverts; if (numverts > _mgpsc->mysort->maxverts) _mgpsc->mysort->maxverts = numverts; average_depth += prim->depth; average_depth /= (float)(numverts+1); prim->depth = average_depth; prim->color[0] = (int)(255.0 * color.r); prim->color[1] = (int)(255.0 * color.g); prim->color[2] = (int)(255.0 * color.b); prim->ecolor[0] = ecolor[0]; prim->ecolor[1] = ecolor[1]; prim->ecolor[2] = ecolor[2]; if ((prim->mykind = mgps_primclip(prim)) == PRIM_INVIS) _mgpsc->mysort->cvert = prim->index; else { _mgpsc->mysort->cvert = prim->index + prim->numvts; _mgpsc->mysort->cprim++; } if (_mgpsc->mysort->cprim > _mgpsc->mysort->primnum) { _mgpsc->mysort->primnum*=2; vvneeds(&(_mgpsc->mysort->prims), _mgpsc->mysort->primnum); vvneeds(&(_mgpsc->mysort->primsort), _mgpsc->mysort->primnum); } break; default: fprintf(stderr,"unknown type of primitive.\n"); break; } } /* Function: mgps_primcomp Description: Depth sort by comparing two primitives in a call from qsort() (painters algorithm, no subdiv of polygons) Author: Daeron Meyer */ int mgps_primcomp(const void *a, const void *b) { mgpsprim *prim = VVEC(_mgpsc->mysort->prims, mgpsprim); if (prim[*(int*)a].depth < prim[*(int*)b].depth) return 1; else return -1; } /* Function: mgps_sortdisplaylist Description: Does depth sorting of primitives. Author: Daeron Meyer */ void mgps_sortdisplaylist(void) { static int *primp; primp = VVEC(_mgpsc->mysort->primsort, int); qsort(primp, _mgpsc->mysort->cprim, sizeof(int), &mgps_primcomp); } /* Function: mgps_showdisplaylist Description: render display list to display Author: Daeron Meyer, Tim Rowley */ void mgps_showdisplaylist(FILE *outf) { CPoint3 *vts; int ref, *primp; mgpsprim *prim, *prim2; static int width; static int height; WnGet(_mgc->win, WN_XSIZE, &width); WnGet(_mgc->win, WN_YSIZE, &height); MGPS_startPS(outf, &(_mgc->background), width/(double)height, width, height); primp = VVEC(_mgpsc->mysort->primsort, int); prim2 = VVEC(_mgpsc->mysort->prims, mgpsprim); vts = VVEC(_mgpsc->mysort->pverts, CPoint3); for (ref = 0; ref < _mgpsc->mysort->cprim; ref++) { prim = &(prim2[primp[ref]]); switch (prim->mykind) { case PRIM_POLYGON: MGPS_poly(vts+prim->index, prim->numvts, prim->color); break; case PRIM_SPOLYGON: MGPS_spoly(vts+prim->index, prim->numvts); break; case PRIM_EPOLYGON: MGPS_epoly(vts+prim->index, prim->numvts, prim->color, prim->ewidth, prim->ecolor); break; case PRIM_SEPOLYGON: MGPS_sepoly(vts+prim->index, prim->numvts, prim->ewidth, prim->ecolor); break; case PRIM_SLINE: MGPS_spolyline(vts+prim->index, prim->numvts, prim->ewidth); break; case PRIM_LINE: MGPS_polyline(vts+prim->index, prim->numvts, prim->ewidth, prim->ecolor); break; case PRIM_INVIS: break; default: break; } } MGPS_finishPS(); } void mgps_appearance( struct mgastk *ma, int mask ) { Appearance *ap = &(ma->ap); if (mask & APF_LINEWIDTH) { curwidth = ap->linewidth-1; _mgc->has &= ~HAS_POINT; } if (mask & APF_SHADING) { if (IS_SHADED(ap->shading) && ma->shader != NULL) { /* Use software shader if one exists and user wants lighting */ ma->flags |= MGASTK_SHADER; } else { /* No software shading, just use raw colors */ ma->flags &= ~MGASTK_SHADER; } } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/mg/ps/mgpswindows.h0000644000175000001440000000201510455701005015373 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ int mgps_initpsdevice(void); void mgps_newdisplaylist(void); void mgps_sortdisplaylist(void); void mgps_showdisplaylist(FILE *outf); geomview-1.9.4/src/lib/mg/ps/Headers0000644000175000001440000000004707730240101014137 00000000000000mgps.h mgpsP.h mgpstri.h mgpswindows.h geomview-1.9.4/src/lib/mg/buf/0000777000175000001440000000000010665240676013100 500000000000000geomview-1.9.4/src/lib/mg/buf/mgbufP.h0000644000175000001440000000621010455701005014365 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef MGBUFP_H #define MGBUFP_H typedef struct { Pt3Coord x, y, z, w; ColorA vcol; int drawnext; } CPoint3; #include "mgbufrender.h" #include "mgbufrender24.h" /*****************************************************************************/ #define MGX_NULL 0 #define MGX_END 0 #define MGX_BGNLINE 1 #define MGX_BGNPOLY 2 #define MGX_BGNEPOLY 3 #define MGX_BGNSLINE 4 #define MGX_BGNSPOLY 5 #define MGX_BGNSEPOLY 6 #define MGX_VERTEX 7 #define MGX_CVERTEX 8 #define MGX_COLOR 9 #define MGX_ECOLOR 10 #define PRIM_LINE 1 #define PRIM_POLYGON 2 #define PRIM_EPOLYGON 3 #define PRIM_SLINE 4 /* smooth shaded primitives */ #define PRIM_SPOLYGON 5 #define PRIM_SEPOLYGON 6 #define PRIM_INVIS 7 /*****************************************************************************/ typedef struct _mgbufprim { int mykind; /* kind of primitive */ int index; /* index into array of vertices */ int numvts; /* number of vertices */ float depth; /* z value for sorting (at least for now) */ int color[3]; /* rgb color of polygon */ int ecolor[3]; /* edge color of polygon */ int ewidth; /* edge width */ } mgbufprim; /*****************************************************************************/ typedef struct mgbufcontext { struct mgcontext mgctx; /* The mgcontext */ FILE *file; char filepath[280]; unsigned char *buf; float *zbuf; int xsize, ysize; float zrange; int znudge; /* znudge for drawing lines closer */ float znudgeby; /* how much of a nudge ? */ long znear, zfar; /* Current Z-buffer limits */ vvec room; /* Scratch space */ int pvertnum; /* number of vertices */ vvec pverts; /* Primitve vertices */ int sizelock; /* for prohibiting size change from within mg when the cam window is part of a larger hierarchy of windows as with Widgets */ int born; } mgbufcontext; #define MAXZNUDGE 8 /* Max depth of mgbuf_closer()/farther() */ #define _mgbufc ((mgbufcontext*)_mgc) void BUFmg_add(int primtype, int numdata, void *data, void *cdata); void mgbuf_init_zrange(); int Xmgr_primclip(mgbufprim *aprim); #endif geomview-1.9.4/src/lib/mg/buf/mgbuf.c0000644000175000001440000006617210622716756014274 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgbuf.h" #include "mgbufP.h" #include "windowP.h" #include static int weeble = 0; void mgbuf_reshapeviewport(void); void mgbuf_appearance( struct mgastk *ma, int mask ); void mgbuf_setshader(mgshadefunc shader); mgcontext * mgbuf_ctxcreate(int a1, ...); int mgbuf_ctxset( int a1, ... ); int mgbuf_feature( int feature ); void mgbuf_ctxdelete( mgcontext *ctx ); int mgbuf_ctxget( int attr, void* valueptr ); int mgbuf_ctxselect( mgcontext *ctx ); void mgbuf_sync( void ); void mgbuf_worldbegin( void ); void mgbuf_worldend( void ); void mgbuf_identity( void ); void mgbuf_transform( Transform T ); int mgbuf_pushtransform( void ); int mgbuf_poptransform( void ); void mgbuf_gettransform( Transform T ); void mgbuf_settransform( Transform T ); int mgbuf_pushappearance( void ); int mgbuf_popappearance( void ); const Appearance *mgbuf_setappearance(const Appearance* app, int merge ); int mgbuf_setcamera( Camera* cam ); int mgbuf_setwindow( WnWindow *win, int final ); mgbufcontext *mgbuf_newcontext( mgbufcontext *ctx ); static unsigned char *createRGB( void ); /* probably not here */ int mgdevice_BUF(); extern void mgbuf_polygon(); extern void mgbuf_mesh(); extern void mgbuf_line(); extern void mgbuf_polyline(); extern void mgbuf_polylist(); extern void mgbuf_quads(); int _mgbuf_ctxset(int a1, va_list *alist); WnWindow *mgbufwindow(WnWindow *win); struct mgfuncs mgbuffuncs = { MGD_BUF, mgdevice_BUF, mgbuf_feature, (mgcontext *(*)())mgbuf_ctxcreate, mgbuf_ctxdelete, (int (*)())mgbuf_ctxset, mgbuf_ctxget, mgbuf_ctxselect, mgbuf_sync, mgbuf_worldbegin, mgbuf_worldend, mgbuf_reshapeviewport, /* geometry transform */ mgbuf_settransform, mgbuf_gettransform, mgbuf_identity, mgbuf_transform, mgbuf_pushtransform, mgbuf_poptransform, /* texture transform */ mg_settxtransform, mg_gettxtransform, mg_txidentity, mg_txtransform, mg_pushtxtransform, mg_poptxtransform, /* appearance */ mgbuf_pushappearance, mgbuf_popappearance, mgbuf_setappearance, mg_getappearance, /*************/ mgbuf_setcamera, mgbuf_polygon, mgbuf_polylist, mgbuf_mesh, mgbuf_line, mgbuf_polyline, mg_quads, mg_bezier, mg_bsptree, mg_tagappearance, mg_untagappearance, mg_taggedappearance }; static int curwidth=1; void mgbuf_reshapeviewport(void) { CamSet(_mgc->cam, CAM_ASPECT, (double)_mgbufc->xsize/(double)_mgbufc->ysize, CAM_END); } /*----------------------------------------------------------------------- * Function: mgdevice_BUF * Description: select the BUF device as the current MG device * Returns: 1 * Author: daeron * Notes: */ int mgdevice_BUF() { _mgf = mgbuffuncs; if(_mgc != NULL && _mgc->devno != MGD_BUF) _mgc = NULL; return(0); } /*----------------------------------------------------------------------- * Function: mgbuf_newcontext * Description: initialize an mgcontext structure * Args: mgc: ptr to context structure to initialize * Returns: mgc * Notes: Further device-specific initialization is normally required. */ mgbufcontext * mgbuf_newcontext( mgbufcontext *ctx ) { mg_newcontext(&(ctx->mgctx)); ctx->mgctx.devfuncs = &mgbuffuncs; ctx->mgctx.devno = MGD_BUF; ctx->mgctx.astk->ap_seq = 1; ctx->mgctx.astk->mat_seq = 1; ctx->mgctx.astk->light_seq = 1; ctx->mgctx.astk->shader = mg_eucshade; ctx->mgctx.zfnudge = 40.e-6; ctx->buf = NULL; ctx->zbuf = NULL; ctx->xsize = ctx->ysize = 0; ctx->file = NULL; ctx->born = 0; VVINIT(ctx->room, char, 180); ctx->pvertnum = 100; VVINIT(ctx->pverts, CPoint3, ctx->pvertnum); vvneeds(&(ctx->pverts), ctx->pvertnum); return ctx; } /*----------------------------------------------------------------------- * Function: _mgbuf_ctxset * Description: internal ctxset routine * Args: a1: first attribute * *alist: rest of attribute-value list * Returns: -1 on error, 0 on success * Date: Fri Sep 20 11:08:13 1991 * Notes: mgbuf_ctxcreate() and mgbuf_ctxset() call this to actually * parse and interpret the attribute list. */ int _mgbuf_ctxset(int a1, va_list *alist) { int attr; char **ablock = NULL; #define NEXT(type) OOGL_VA_ARG(type, alist, ablock) for (attr = a1; attr != MG_END; attr = NEXT(int)) { switch (attr) { case MG_ABLOCK: ablock = NEXT(char**); break; case MG_ApSet: { Appearance *ap; if (ablock) ap = ApSet(NULL, AP_ABLOCK, ablock); else ap = _ApSet(NULL, va_arg(*alist, int), alist); mgbuf_setappearance(ap, MG_MERGE); ApDelete(ap); } break; case MG_WnSet: if (ablock) WnSet( _mgc->win, WN_ABLOCK, ablock); else _WnSet( _mgc->win, va_arg(*alist, int), alist); mgbuf_setwindow( _mgc->win, 0 ); break; case MG_CamSet: if (ablock) CamSet( _mgc->cam, CAM_ABLOCK, ablock); else _CamSet( _mgc->cam, va_arg(*alist, int), alist); break; case MG_APPEAR: mgsetappearance( NEXT(Appearance *), MG_SET ); break; case MG_WINDOW: if (_mgc->win) WnDelete(_mgc->win); _mgc->win = NEXT(WnWindow *); mgbuf_setwindow( NULL, 0 ); break; case MG_CAMERA: mgbuf_setcamera( NEXT(Camera *) ); break; case MG_SETOPTIONS: _mgc->opts |= NEXT(int); break; case MG_UNSETOPTIONS: _mgc->opts &= ~NEXT(int); break; case MG_SHOW: _mgc->shown = NEXT(int); break; case MG_PARENT: _mgc->parent = NEXT(mgcontext*); break; case MG_BACKGROUND: { ColorA bcolor; bcolor = *NEXT(ColorA*); _mgc->background = bcolor; } break; case MG_SHADER: mgbuf_setshader( NEXT(mgshadefunc) ); break; case MG_SHADERDATA: _mgc->astk->shaderdata = NEXT(void*); break; case MG_SPACE: { int space = NEXT(int); switch (TM_SPACE(space)) { case TM_EUCLIDEAN: case TM_SPHERICAL: _mgc->space = space; break; case TM_HYPERBOLIC: switch (TM_MODEL(space)) { case TM_VIRTUAL: case TM_PROJECTIVE: case TM_CONFORMAL_BALL: _mgc->space = space; break; default: fprintf(stderr, "_mgbuf_ctxset: Illegal space value %1d\n", space); } break; default: fprintf(stderr, "_mgbuf_ctxset: Illegal space value %1d\n", space); } } break; case MG_NDCTX: _mgc->NDctx = NEXT(mgNDctx *); break; case MG_ZNUDGE: _mgc->zfnudge = NEXT(double); break; case MG_BUFFILE: _mgbufc->file = NEXT(FILE *); break; case MG_BUFFILEPATH: if (_mgbufc->file) fclose(_mgbufc->file); strcpy(_mgbufc->filepath, NEXT(char *)); _mgbufc->file = fopen(_mgbufc->filepath, "w"); break; default: OOGLError (0, "_mgbuf_ctxset: undefined option: %d", attr); return -1; } } if (_mgc->shown && !_mgbufc->born) { /* open the window */ mgbufwindow(_mgc->win); /* bring BUF state into accordance with appearance state */ { Appearance *ap = ApCopy( &(_mgc->astk->ap), NULL ); mgbuf_setappearance( ap, MG_SET ); ApDelete(ap); } } #undef NEXT return 0; } /* This needs some checking -- TOR */ int mgbuf_setwindow( WnWindow *win, int final ) { /*WnPosition wp; WnPosition pos, vp;*/ int xsize, ysize; /* int flag, reconstrain; int positioned = 0; int zmin; char *name, *oname;*/ if (win == NULL) return 0; /* WnGet(_mgc->win, WN_CURPOS, &wp); xsize = wp.xmax - wp.xmin + 1; ysize = wp.ymax - wp.ymin + 1; */ WnGet(_mgc->win, WN_XSIZE, &xsize); WnGet(_mgc->win, WN_YSIZE, &ysize); if (final) { /* fprintf(stderr, "BUF: setwindow xsize=%d ysize=%d\n", xsize, ysize); */ if (_mgbufc->buf) free(_mgbufc->buf); _mgbufc->buf = (unsigned char *) malloc(4*xsize*ysize); if (_mgbufc->zbuf) free(_mgbufc->zbuf); _mgbufc->zbuf = (float *) malloc(xsize*ysize*sizeof(float)); } _mgbufc->xsize = xsize; _mgbufc->ysize = ysize; return 1; } /*----------------------------------------------------------------------- * Function: mgbuf_identity * Description: Set the current object xform to the identity * Args: (none) * Returns: nothing * Notes: Sets the xform on the top of the current context's xform * stack to the identity. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgbuf_identity( void ) { mgbuf_settransform( TM3_IDENTITY ); } /*----------------------------------------------------------------------- * Function: mgbuf_settransform * Description: Set the current object xform * Args: T * Returns: nothing * Notes: Sets the xform on the top of the current context's xform * stack to T. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgbuf_settransform( Transform T ) { TmCopy(T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgbuf_gettransform * Description: Get the current object xform * Args: T * Returns: nothing * Notes: Writes the current object xform, from the top of the * context's xform stack, into T. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgbuf_gettransform( Transform T ) { TmCopy(_mgc->xstk->T, T); } /*----------------------------------------------------------------------- * Function: mgbuf_transform * Description: premultiply the current object xform by a transform * Args: T: the transform to premultiply by * Returns: nothing * Notes: If X is the context's current object xform, replaces X * by T X. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgbuf_transform( Transform T ) { TmConcat(T, _mgc->xstk->T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgbuf_pushappearance * Description: push the context's appearance stack * Returns: nothing * Notes: * DEVICE USE: required --- all devices must maintain this stack */ int mgbuf_pushappearance() { mg_pushappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgbuf_popappearance * Description: pop the context's appearance stack * Returns: nothing * Notes: * DEVICE USE: required --- all deviced must maintain this stack */ int mgbuf_popappearance() { struct mgastk *mastk = _mgc->astk; struct mgastk *mastk_next; if (!(mastk_next = mastk->next)) { OOGLError(0, "mgbuf_popappearance: appearance stack has only 1 entry."); return 0; } mgbuf_appearance(mastk_next, mastk_next->ap.valid); mg_popappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgbuf_setappearance * Description: Operate on appearance in current context * Args: *ap: the appearance to assign or merge * mergeflag: MG_MERGE or MG_SET * Returns: ptr to current appearance * Notes: Modifies the context's current apperance. Does not * modify *ap. * mergeflag = MG_MERGE: merge *ap into current appearance * mergeflag = MG_SET: set current appearance to *ap * DEVICE USE: required --- when ??? * * Can we modify this to do some of the flag setting * than mgbuf_setappearance currently does??? This * seems common to all devices. */ const Appearance * mgbuf_setappearance(const Appearance *ap, int mergeflag ) { int changed, lng_changed; struct mgastk *mastk = _mgc->astk; Appearance *ma; ma = &(mastk->ap); if(mergeflag == MG_MERGE) { changed = ap->valid &~ (ma->override &~ ap->override); lng_changed = ap->lighting ? ap->lighting->valid &~ (ma->lighting->override &~ ap->lighting->override) : 0; } else { changed = ap->valid; lng_changed = ap->lighting ? ap->lighting->valid : 0; } mg_setappearance( ap, mergeflag ); if ((ap->lighting) && (mastk->next)) { if (mastk->light_seq == mastk->next->light_seq) { mastk->light_seq++; lng_changed |= ma->lighting->valid; /* "All fields changed" */ } } mgbuf_appearance( mastk, changed); return &_mgc->astk->ap; } /*----------------------------------------------------------------------- * Function: mgbuf_setcamera * Description: Set the context's camera * Args: *cam: the camera to use * Returns: nothing * Notes: The context does not maintain an internal copy of the * camera. Only the pointer is stored. * DEVICE USE: required */ int mgbuf_setcamera( Camera *cam ) { if (_mgc->cam) CamDelete(_mgc->cam); _mgc->cam = cam; RefIncr((Ref*) cam); return 0; } /*----------------------------------------------------------------------- * Function: mgbuf_ctxset * Description: set some attributes in the current context * Args: attr, ...: list of attribute-value pairs, terminated * by MG_END * Returns: -1 on error and 0 on success * Notes: DO NOT CALL THIS (yet)! It currently does nothing. * DEVICE USE: forbidden --- devices have their own mgxx_ctxset() * * This needs to be modified to work as the NULL device. * Use by other devices may never be needed. */ int mgbuf_ctxset( int attr, ... /*, MG_END */ ) { va_list alist; int result; va_start( alist, attr ); result = _mgbuf_ctxset(attr, &alist); va_end(alist); return result; } /*----------------------------------------------------------------------- * Function: mgbuf_ctxget * Description: get an attribute from the current context * Args: attr: the attribute to get * value: place to write attr's value * */ int mgbuf_ctxget( int attr, void *value ) { #define VALUE(type) ((type*)value) switch (attr) { case MG_APPEAR: *VALUE(Appearance*) = &(_mgc->astk->ap); break; case MG_CAMERA: *VALUE(Camera*) = _mgc->cam; break; case MG_WINDOW: /* pretty silly concept, IMHO :-) */ *VALUE(WnWindow*) = _mgc->win; break; case MG_PARENT: *VALUE(mgcontext*) = _mgc->parent; break; case MG_SETOPTIONS: case MG_UNSETOPTIONS: *VALUE(int) = _mgc->opts; break; case MG_BACKGROUND: *VALUE(ColorA) = _mgc->background; break; case MG_SHADER: *VALUE(mgshadefunc) = _mgc->astk->shader; break; case MG_SHADERDATA: *VALUE(void *) = _mgc->astk->shaderdata; break; case MG_SPACE: *VALUE(int) = _mgc->space; break; case MG_NDCTX: *VALUE(mgNDctx *) = _mgc->NDctx; break; case MG_ZNUDGE: *VALUE(float) = _mgc->zfnudge; break; case MG_BUFFILE: *VALUE(FILE *) = _mgbufc->file; break; case MG_BUFFILEPATH: *VALUE(char *) = _mgbufc->filepath; break; case MG_BUFMEMORY: *VALUE(unsigned char *) = createRGB(); break; default: OOGLError (0, "mgbuf_ctxget: undefined option: %d\n", attr); return -1; } return 1; #undef VALUE } /*----------------------------------------------------------------------- * Function: mgbuf_feature * Description: determine whether the NULL device has a particular feature * Args: feature: feature to test for * Returns: -1 (means feature is not present) * Notes: BUF device is rather featureless at present, :-) * DEVICE USE: forbidden --- devices have their own mgxx_feature() */ int mgbuf_feature( int feature ) { return -1; } /*----------------------------------------------------------------------- * Function: mgbuf_ctxcreate * Description: create a new MG context for the BUF device * Args: a1, ...: list of attribute-value pairs * Returns: ptr to new context * Author: daeron */ mgcontext * mgbuf_ctxcreate( int a1, ... ) { va_list alist; _mgc = (mgcontext*)mgbuf_newcontext( OOGLNewE(mgbufcontext, "mgbuf_ctxcreate") ); va_start(alist, a1); _mgbuf_ctxset(a1, &alist); va_end(alist); return _mgc; } /*----------------------------------------------------------------------- * Function: mgbuf_ctxdelete * Description: delete an MG context for the BUF device * Args: *ctx: ptr to context to delete * Returns: nothing * Author: daeron */ void mgbuf_ctxdelete( mgcontext *ctx ) { mgbufcontext *_mgx = (mgbufcontext *)ctx; if(ctx->devno != MGD_BUF) { mgcontext *was = _mgc; mgctxselect(ctx); mgctxdelete(ctx); if (was != ctx) mgctxselect(was); } else { free(_mgx->buf); free(_mgx->zbuf); vvfree(&_mgx->pverts); vvfree(&_mgx->room); mg_ctxdelete(ctx); if (ctx == _mgc) _mgc = NULL; } } /*----------------------------------------------------------------------- * Function: mgbuf_ctxselect * Description: select the current context * Args: *ctx: the context to select * Returns: 0 (why ???) * Author: daeron */ int mgbuf_ctxselect( mgcontext *ctx ) { if (ctx == NULL || ctx->devno != MGD_BUF) { return mg_ctxselect(ctx); } /* BUF context */ _mgc = ctx; return(0); } /*----------------------------------------------------------------------- * Function: mgbuf_pushtransform * Description: push the mg context xform stack * Returns: nothing */ int mgbuf_pushtransform( void ) { mg_pushtransform(); return 0; } /*----------------------------------------------------------------------- * Function: mgbuf_poptransform * Description: pop the mg context xform stack * Returns: nothing */ int mgbuf_poptransform( void ) { mg_poptransform(); return 0; } void mgbuf_sync( void ) { } void mgbuf_worldbegin( void ) { int color[4]; color[0] = _mgc->background.r * 255; color[1] = _mgc->background.g * 255; color[2] = _mgc->background.b * 255; mg_worldbegin(); #if 0 && !DO_NOT_HACK_THE_CODE_THIS_WAY { /* This cannot be done here because there are objects which do not * belong to the world coordinate system; this stuff needs to be * done in mgx11windows.c in Xmg_add(). */ Transform S; WnPosition vp; WnGet(_mgc->win, WN_VIEWPORT, &vp); /* Fix up W2S and S2W matrices. Since the BUF coordinate system * has Y increasing downward, flip it here, and translate by * location of lower left corner of viewport. */ TmTranslate(S, (double)vp.xmin, (double)vp.ymax, 0.); S[1][1] = -1; /* Invert sign of Y */ TmConcat(_mgc->W2S, S, _mgc->W2S); TmInvert(_mgc->W2S, _mgc->S2W); } #endif _mgc->has = 0; /* fprintf(stderr, "BUF: mgbuf_worldbegin -- clearing buffers\n"); */ Xmgr_24fullinit(0xFF0000, 0xFF00, 0xFF); Xmgr_24clear(_mgbufc->buf, _mgbufc->zbuf, _mgbufc->xsize, _mgbufc->xsize*4, _mgbufc->ysize, color, 1, 1, 0, 0, 0, 0); _mgbufc->znudgeby = 0.0; } void mgbuf_worldend( void ) { int i, size; FILE *file; int *buf; /* fprintf(stderr, "BUF: mgbuf_worldend\n"); */ if (_mgbufc->file == NULL) return; fprintf(_mgbufc->file, "P6\n%d %d\n255\n", _mgbufc->xsize, _mgbufc->ysize); size = _mgbufc->xsize * _mgbufc->ysize; buf = (int *)_mgbufc->buf; file = _mgbufc->file; for (i=0; i>16, file); fputc((buf[i]&0xFF00)>>8, file); fputc(buf[i]&0xFF, file); } } static unsigned char * createRGB( void ) { int i, size; int *buf; unsigned char *rgb; rgb = (unsigned char *)malloc(3 * _mgbufc->xsize * _mgbufc->ysize); if (rgb == NULL) return NULL; size = _mgbufc->xsize * _mgbufc->ysize; buf = (int *)_mgbufc->buf; for (i=0; i>16; rgb[3*i+1] = (buf[i]&0xFF00)>>8; rgb[3*i+2] = buf[i]&0xFF; } return rgb; } WnWindow * mgbufwindow(WnWindow *win) { _mgbufc->born = 1; mgbuf_setwindow(win, 1); mgbuf_init_zrange(); return(win); } /* funky low level stuff... don't worry... be happy :) */ static void frob(void) {} /* Function: BUFmg_add Description: add a primitive (polygon, vertex, line) Author: Daeron Meyer, Timothy Rowley */ void BUFmg_add(int primtype, int numdata, void *data, void *cdata) { HPoint3 *vt = (HPoint3 *)data; float *col = (float *)cdata; ColorA *colarray = (ColorA *)cdata; CPoint3 *vts; int i; static mgbufprim prim; /* float frazzle; */ static int color[3], ecolor[3]; static int numverts; static int kind; static int ewidth; #if 1 || HACK_THE_CODE_BUT_BETTER_FIX_IT if (!(_mgc->has & HAS_S2O)) { Transform S; WnPosition vp; mg_findS2O(); mg_findO2S(); WnGet(_mgc->win, WN_VIEWPORT, &vp); /* Fix up W2S and S2W matrices. Since the BUF coordinate system * has Y increasing downward, flip it here, and translate by * location of lower left corner of viewport. */ TmTranslate(S, (double)vp.xmin, (double)vp.ymax, 0.); S[1][1] = -1; /* Invert sign of Y */ TmConcat(_mgc->O2S, S, _mgc->O2S); TmInvert(_mgc->O2S, _mgc->S2O); } #endif /* fprintf(stderr, "%p (xstk=%p)\n", _mgc, _mgc->xstk); */ switch (primtype) { case MGX_BGNLINE: case MGX_BGNSLINE: if (primtype == MGX_BGNLINE) kind = PRIM_LINE; else kind = PRIM_SLINE; numverts = 0; ewidth = curwidth; if (!(_mgc->has & HAS_S2O)) { mg_findS2O(); mg_findO2S(); } break; case MGX_BGNPOLY: case MGX_BGNSPOLY: case MGX_BGNEPOLY: case MGX_BGNSEPOLY: if (primtype == MGX_BGNPOLY) kind = PRIM_POLYGON; else if (primtype == MGX_BGNSPOLY) kind = PRIM_SPOLYGON; else if (primtype == MGX_BGNEPOLY) kind = PRIM_EPOLYGON; else kind = PRIM_SEPOLYGON; ewidth = curwidth; numverts = 0; if (!(_mgc->has & HAS_S2O)) { mg_findS2O(); mg_findO2S(); } break; case MGX_VERTEX: for (i=0; ipverts, CPoint3)[numverts]); HPt3Transform(_mgc->O2S, &(vt[i]), (HPoint3 *) vts); vts->drawnext = 1; /* if (vts->w <= 0.0) {vts->x = _mgbufc->xsize - vts->x; vts->y = _mgbufc->ysize - vts->y; vts->z *= -1.0;} */ vts->vcol.r = 0; vts->vcol.g = 0; vts->vcol.b = 0; vts->vcol.a = 1; numverts++; if (numverts > _mgbufc->pvertnum) { _mgbufc->pvertnum *= 2; vvneeds(&(_mgbufc->pverts), _mgbufc->pvertnum); } } break; case MGX_CVERTEX: for (i=0; ipverts, CPoint3)[numverts]); HPt3Transform(_mgc->O2S, &(vt[i]), (HPoint3 *) vts); vts->drawnext = 1; /* if (vts->w <= 0.0) {vts->x = _mgbufc->xsize - vts->x; vts->y = _mgbufc->ysize - vts->y; vts->z *= -1.0;} */ vts->vcol = colarray[i]; numverts++; if (numverts > _mgbufc->pvertnum) { _mgbufc->pvertnum *= 2; vvneeds(&(_mgbufc->pverts), _mgbufc->pvertnum); } } break; case MGX_COLOR: color[0] = (int)(255.0 * col[0]); color[1] = (int)(255.0 * col[1]); color[2] = (int)(255.0 * col[2]); break; case MGX_ECOLOR: ecolor[0] = (int)(255.0 * col[0]); ecolor[1] = (int)(255.0 * col[1]); ecolor[2] = (int)(255.0 * col[2]); break; case MGX_END: prim.mykind = kind; prim.index = 0; prim.numvts = numverts; kind = Xmgr_primclip(&prim); numverts = prim.numvts; { unsigned char *buf = _mgbufc->buf; float *zbuf = _mgbufc->zbuf; int zwidth = _mgbufc->xsize; int w = 4*_mgbufc->xsize; int h = _mgbufc->ysize; vts = &(VVEC(_mgbufc->pverts, CPoint3)[0]); switch (kind) { case PRIM_POLYGON: Xmgr_24Zpoly(buf, zbuf, zwidth, w, h, vts, numverts, color); break; case PRIM_SPOLYGON: if (weeble==2383) frob(); Xmgr_24GZpoly(buf, zbuf, zwidth, w, h, vts, numverts, color); break; case PRIM_EPOLYGON: Xmgr_24Zpoly(buf, zbuf, zwidth, w, h, vts, numverts, color); Xmgr_24Zpolyline(buf, zbuf, zwidth, w, h, vts, numverts, ewidth, ecolor); Xmgr_24Zline(buf, zbuf, zwidth, w, h, &vts[numverts-1], &vts[0], ewidth, ecolor); break; case PRIM_SEPOLYGON: Xmgr_24GZpoly(buf, zbuf, zwidth, w, h, vts, numverts, color); Xmgr_24Zpolyline(buf, zbuf, zwidth, w, h, vts, numverts, ewidth, ecolor); Xmgr_24Zline(buf, zbuf, zwidth, w, h, &vts[numverts-1], &vts[0], ewidth, ecolor); break; case PRIM_SLINE: Xmgr_24GZpolyline(buf, zbuf, zwidth, w, h, vts, numverts, ewidth, ecolor); break; case PRIM_LINE: Xmgr_24Zpolyline(buf, zbuf, zwidth, w, h, vts, numverts, ewidth, ecolor); break; case PRIM_INVIS: break; } } break; default: fprintf(stderr,"unknown type of primitive.\n"); break; } } /* .................................... */ void mgbuf_appearance( struct mgastk *ma, int mask ) { Appearance *ap = &(ma->ap); if (mask & APF_LINEWIDTH) { curwidth = ap->linewidth; _mgc->has &= ~HAS_POINT; } if (mask & APF_SHADING) { if (IS_SHADED(ap->shading) && ma->shader != NULL) { /* Use software shader if one exists and user wants lighting */ ma->flags |= MGASTK_SHADER; } else { /* No software shading, just use raw colors */ ma->flags &= ~MGASTK_SHADER; } } } void mgbuf_setshader(mgshadefunc shader) { struct mgastk *ma = _mgc->astk; unsigned short wasusing = ma->flags & MGASTK_SHADER; ma->shader = shader; if (shader != NULL && IS_SHADED(ma->ap.shading)) { ma->flags |= MGASTK_SHADER; } else { ma->flags &= ~MGASTK_SHADER; } if((ma->flags & MGASTK_SHADER) != wasusing) mgbuf_appearance(_mgc->astk, APF_SHADING); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/mg/buf/mgbuf.h0000644000175000001440000000177410455701005014257 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef MGBUF_H #define MGBUF_H #define MG_BUFFILE 101 #define MG_BUFFILEPATH 102 #define MG_BUFMEMORY 103 #endif geomview-1.9.4/src/lib/mg/buf/MGRline.h0000644000175000001440000001537410462410274014460 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if defined(ZBUFFER) #define ZCODE(x) x #else #define ZCODE(x) #endif #ifdef GOURAUD #ifdef COLOR #define GCODE(x) #define CCODE(x) x #else #define GCODE(x) x #define CCODE(x) #endif #define CGCODE(x) x #else #define CCODE(x) #define GCODE(x) #define CGCODE(x) #endif static void WIDENAME (unsigned char *buf, float *zbuf, int zwidth, int width, int height, int x1, int y1, #ifdef ZBUFFER double z1, #endif #ifdef GOURAUD int r1, #ifdef COLOR int g1, int b1, #endif #endif int x2, int y2, #ifdef ZBUFFER double z2, #endif #ifdef GOURAUD int r2, #ifdef COLOR int g2, int b2, #endif #endif int lwidth, int *color) { int d, x, y, ax, ay, sx, dx, dy; int i, end; #ifdef ZBUFFER double delta=0, z; #endif #ifdef GOURAUD double r, rdelta; #ifdef COLOR double g, b, gdelta, bdelta; #endif #endif #if defined(ZBUFFER) || defined(GOURAUD) int total; #endif #ifdef PTR_INIT PTR_TYPE *ptr = (PTR_TYPE *)buf; int ptrIncr = PTR_INCR; #endif #ifdef VARIABLES VARIABLES #endif dx = x2-x1; dy = y2-y1; ax = ABS(dx)<<1; ay = ABS(dy)<<1; sx = SGN(dx); x = x1; y = y1; ZCODE(z = z1;) CGCODE(r = r1;) CCODE(g = g1; b = b1;) #if defined(ZBUFFER) || defined(GOURAUD) total = ABS(dx)+ABS(dy); if(total == 0) total = 1; #endif ZCODE(delta = (z2-z1)/total;) CGCODE(rdelta = (r2-r1)/(double)total;) CCODE(gdelta = (g2-g1)/(double)total; bdelta = (b2-b1)/(double)total;) if (ax>ay) { /* x dominant */ d = ay-(ax>>1); for (;;) { for (i=MAX(0,y-lwidth/2), end=MIN(height,y-lwidth/2+lwidth); i=0) { y++; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) d -= ax; } x += sx; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) d += ay; } } else { /* y dominant */ d = ax-(ay>>1); for (;;) { for (i=MAX(0,x-lwidth/2), end=MIN(zwidth,x-lwidth/2+lwidth); i=0) { x += sx; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) d -= ay; } y++; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) d += ax; } } } void NAME (unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p1, CPoint3 *p2, int lwidth, int *color) { int d, x, y, ax, ay, sx, dx, dy; int x1, y1, x2, y2; #ifdef PTR_INIT PTR_TYPE *ptr; int ptrIncr = PTR_INCR; #endif #ifdef ZBUFFER float *zptr; double delta=0, z, z1, z2; #endif #ifdef GOURAUD int r1, r2; double r, rdelta; #ifdef COLOR int g1, g2, b1, b2; double g, b, gdelta, bdelta; #endif #endif #if defined(ZBUFFER) || defined(GOURAUD) int total; #endif #ifdef VARIABLES VARIABLES #endif if (p2->yy) { x1 = p2->x; y1 = p2->y; x2 = p1->x; y2 = p1->y; ZCODE(z1 = p2->z - _mgc->zfnudge; z2 = p1->z - _mgc->zfnudge;) CGCODE(r1 = 255*p2->vcol.r; r2 = 255*p1->vcol.r;) CCODE(g1 = 255*p2->vcol.g; b1 = 255*p2->vcol.b; g2 = 255*p1->vcol.g; b2 = 255*p1->vcol.b;) } else { x1 = p1->x; y1 = p1->y; x2 = p2->x; y2 = p2->y; ZCODE(z1 = p1->z - _mgc->zfnudge; z2 = p2->z - _mgc->zfnudge;) CGCODE(r1 = 255*p1->vcol.r; r2 = 255*p2->vcol.r;) CCODE(g1 = 255*p1->vcol.g; b1 = 255*p1->vcol.b; g2 = 255*p2->vcol.g; b2 = 255*p2->vcol.b;) } if (lwidth > 1) { WIDENAME (buf, zbuf, zwidth, width, height, x1, y1, #ifdef ZBUFFER z1, #endif #ifdef GOURAUD r1, #ifdef COLOR g1, b1, #endif #endif x2, y2, #ifdef ZBUFFER z2, #endif #ifdef GOURAUD r2, #ifdef COLOR g2, b2, #endif #endif lwidth, color); return; } #ifdef PTR_INIT ptr = PTR_INIT; #endif ZCODE(zptr = zbuf+y1*zwidth+x1;) dx = x2-x1; dy = y2-y1; ax = ABS(dx)<<1; ay = ABS(dy)<<1; sx = SGN(dx); x = x1; y = y1; ZCODE(z = z1;) CGCODE(r = r1;) CCODE(g = g1; b = b1;) #if defined(ZBUFFER) || defined(GOURAUD) total = ABS(dx)+ABS(dy); if(total == 0) total = 1; #endif ZCODE(delta = (z2-z1)/total;) CGCODE(rdelta = (r2-r1)/(double)total;) CCODE(gdelta = (g2-g1)/(double)total; bdelta = (b2-b1)/(double)total;) if (ax>ay) { /* x dominant */ d = ay-(ax>>1); for (;;) { #ifdef ZBUFFER if (z<*zptr) { DOPIXEL *zptr = z; } #else DOPIXEL #endif if (x==x2) break; if (d>=0) { y++; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) #ifdef PTR_INIT ptr += ptrIncr; #endif ZCODE(zptr += zwidth;) d -= ax; } x += sx; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) #ifdef PTR_INIT ptr += sx; #endif ZCODE(zptr += sx;) d += ay; } } else { /* y dominant */ d = ax-(ay>>1); for (;;) { #ifdef ZBUFFER if (z<*zptr) { DOPIXEL ZCODE(*zptr = z;) } #else DOPIXEL #endif if (y==y2) break; if (d>=0) { x += sx; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) #ifdef PTR_INIT ptr += sx; #endif ZCODE(zptr += sx;) d -= ay; } y++; ZCODE(z += delta;) CGCODE(r += rdelta;) CCODE(g += gdelta; b += bdelta;) #ifdef PTR_INIT ptr += ptrIncr; #endif ZCODE(zptr += zwidth;) d += ax; } } } #undef ZCODE #undef CCODE #undef GCODE #undef CGCODE #undef WIDENAME #undef NAME #undef ZBUFFER #undef GOURAUD #undef COLOR #undef PTR_TYPE #undef PTR_INIT #undef PTR_INCR #undef VARIABLES #undef DOPIXEL #undef WIDEXDOPIXEL #undef WIDEYDOPIXEL geomview-1.9.4/src/lib/mg/buf/Makefile.am0000644000175000001440000000044010455665336015047 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = liblibmgbuf.la liblibmgbuf_la_SOURCES = \ mgbuf.c mgbufclip.c mgbufdraw.c mgbufrender24.c mgbufrender.c \ mgbuf.h mgbufP.h mgbufrender24.h mgbufrender.h mgbufwindows.h MGRdolines.h MGRline.h MGRpolyscan.h geomview-1.9.4/src/lib/mg/buf/Makefile.in0000644000175000001440000003631310665240505015056 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mg/buf DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) liblibmgbuf_la_LIBADD = am_liblibmgbuf_la_OBJECTS = mgbuf.lo mgbufclip.lo mgbufdraw.lo \ mgbufrender24.lo mgbufrender.lo liblibmgbuf_la_OBJECTS = $(am_liblibmgbuf_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(liblibmgbuf_la_SOURCES) DIST_SOURCES = $(liblibmgbuf_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = liblibmgbuf.la liblibmgbuf_la_SOURCES = \ mgbuf.c mgbufclip.c mgbufdraw.c mgbufrender24.c mgbufrender.c \ mgbuf.h mgbufP.h mgbufrender24.h mgbufrender.h mgbufwindows.h MGRdolines.h MGRline.h MGRpolyscan.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/buf/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/buf/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done liblibmgbuf.la: $(liblibmgbuf_la_OBJECTS) $(liblibmgbuf_la_DEPENDENCIES) $(LINK) $(liblibmgbuf_la_OBJECTS) $(liblibmgbuf_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgbuf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgbufclip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgbufdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgbufrender.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgbufrender24.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/mg/buf/mgbufrender.c0000644000175000001440000000577010455701005015452 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Author: Timothy Rowley */ #include #include "mgP.h" #include "mgbufP.h" void Xmgr_gradWrapper(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, void (*flat)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int, int *), void (*smooth)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int, int *)) { int color[3]; if ((p0->vcol.r == p1->vcol.r) && (p0->vcol.g == p1->vcol.g) && (p0->vcol.b == p1->vcol.b)) { color[0] = 255*p0->vcol.r; color[1] = 255*p0->vcol.g; color[2] = 255*p0->vcol.b; flat(buf, zbuf, zwidth, width, height, p0, p1, lwidth, color); } else smooth(buf, zbuf, zwidth, width, height, p0, p1, lwidth, color); } void oldXmgr_gradWrapper(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, void (*flat)(unsigned char *, float *, int, int, int, int, int, float, int, int, float, int, int *), void (*smooth)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int)) { int color[3]; if ((p0->vcol.r == p1->vcol.r) && (p0->vcol.g == p1->vcol.g) && (p0->vcol.b == p1->vcol.b)) { color[0] = 255*p0->vcol.r; color[1] = 255*p0->vcol.g; color[2] = 255*p0->vcol.b; flat(buf, zbuf, zwidth, width, height, p0->x, p0->y, p0->z, p1->x, p1->y, p1->z, lwidth, color); } else smooth(buf, zbuf, zwidth, width, height, p0, p1, lwidth); } #define NAME Xmgr_polyscan #include "MGRpolyscan.h" #define NAME Xmgr_Zpolyscan #define ZBUFFER #include "MGRpolyscan.h" #define NAME Xmgr_Graypolyscan #define GOURAUD #include "MGRpolyscan.h" #define NAME Xmgr_GrayZpolyscan #define ZBUFFER #define GOURAUD #include "MGRpolyscan.h" #define NAME Xmgr_Gpolyscan #define GOURAUD #define COLOR #include "MGRpolyscan.h" #define NAME Xmgr_GZpolyscan #define GOURAUD #define COLOR #define ZBUFFER #include "MGRpolyscan.h" geomview-1.9.4/src/lib/mg/buf/mgbufrender.h0000644000175000001440000000656610455701005015463 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Author: Timothy Rowley */ #ifndef MGBUFRENDER #define MGBUFRENDER typedef struct { int init; int P1x, P1r, P1g, P1b, P2x, P2r, P2g, P2b; double P1z, P2z; } endPoint; #define ABS(a) (((a)<0) ? -(a) : (a)) #define SGN(a) (((a)<0) ? -1 : 1) #ifdef MAX #undef MAX #endif #define MAX(a,b) (((a)<(b)) ? b : a) #ifdef MIN #undef MIN #endif #define MIN(a,b) (((a)<(b)) ? a : b) void Xmgr_gradWrapper(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, void (*flat)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int, int *), void (*smooth)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int, int *)); void oldXmgr_gradWrapper(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p0, CPoint3 *p1, int lwidth, void (*flat)(unsigned char *, float *, int, int, int, int, int, float, int, int, float, int, int *), void (*smooth)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int)); void Xmgr_polyscan(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)); void Xmgr_Zpolyscan(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)); void Xmgr_Graypolyscan(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)); void Xmgr_GrayZpolyscan(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)); void Xmgr_Gpolyscan(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)); void Xmgr_GZpolyscan(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)); #endif geomview-1.9.4/src/lib/mg/buf/MGRdolines.h0000644000175000001440000000657410461140707015170 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* needed stuff: NAME: name of function GOURAUD: defined for smooth shade ZBUFFER: defined for z-buffer code COLOR: define for color */ #if defined(ZBUFFER) #define ZCODE(x) x #else #define ZCODE(x) #endif #ifdef GOURAUD #ifdef COLOR #define GCODE(x) #define CCODE(x) x #else #define GCODE(x) x #define CCODE(x) #endif #define CGCODE(x) x #else #define CCODE(x) #define GCODE(x) #define CGCODE(x) #endif static void NAME (unsigned char *buf, float *zbuf, int zwidth, int width, int height, int miny, int maxy, int *color, endPoint *mug) { #ifdef PTR_INIT PTR_TYPE *ptr; /* pixel pointers */ #endif int i, x2; /* dithering junk */ int y, x1; /* current line */ #ifdef ZBUFFER float *zptr; /* zbuff pointers */ double z, z2, zdelta; /* z-buffer stuff */ #endif #if defined(ZBUFFER) || defined(GOURAUD) int dx; #endif #ifdef GOURAUD int sr, er, dr, r; #ifdef COLOR int sg, sb, eg, eb, dg, db, g, b; #endif #endif #ifdef VARIABLES VARIABLES #endif #ifdef INITCODE INITCODE #endif for(y = miny; y <= maxy; y++) { x1 = mug[y].P1x; ZCODE(z = mug[y].P1z;) CGCODE(r = mug[y].P1r;) CCODE(g = mug[y].P1g; b = mug[y].P1b;) x2 = mug[y].P2x; ZCODE(z2 = mug[y].P2z;) CGCODE(dr = mug[y].P2r-r;) CCODE(dg = mug[y].P2g-g; db = mug[y].P2b-b;) #if defined(ZBUFFER) || defined(GOURAUD) dx = x2-x1; #endif ZCODE(zdelta = dx ? (z2-z)/dx : 0;) CGCODE(er = (dr << 1) - dx; sr = SGN(dr); dr = abs(dr)<<1;) CCODE(eg = (dg << 1) - dx; eb = (db << 1) - dx; sg = SGN(dg); dg = abs(dg)<<1; sb = SGN(db); db = abs(db)<<1;) CGCODE(dx <<= 1;) #ifdef YCODE YCODE #endif #ifdef PTR_INIT ptr = PTR_INIT; #endif ZCODE(zptr = zbuf+zwidth*y+x1;) for (i=x1; i<=x2; i++ #ifdef ZBUFFER , z+=zdelta, zptr++ #endif #ifdef PTR_INIT , ptr++ #endif ) { #ifdef ZBUFFER if (z < *zptr) { DOPIXEL *zptr = z; } #else DOPIXEL #endif #ifdef GOURAUD if (dx) { while (er>0) { r += sr; er -= dx; } #ifdef COLOR while (eg>0) { g += sg; eg -= dx; } while (eb>0) { b += sb; eb -= dx; } #endif } #endif CGCODE(er += dr;) CCODE(eg += dg; eb += db;) } } } #undef ZCODE #undef CCODE #undef GCODE #undef CGCODE #undef NAME #undef ZBUFFER #undef GOURAUD #undef COLOR #undef PTR_TYPE #undef PTR_INIT #undef VARIABLES #undef INITCODE #undef YCODE #undef DOPIXEL geomview-1.9.4/src/lib/mg/buf/mgbufwindows.h0000644000175000001440000000161010455701005015657 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ geomview-1.9.4/src/lib/mg/buf/mgbufclip.c0000644000175000001440000001536310455701005015121 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgbufP.h" #define WCLIPPLANE 0.001 /* This is as close as we get to the eyeplane */ #define XLEFTCLIP 0.0 #define XRIGHTCLIP 1.0 #define YTOPCLIP 0.0 #define YBOTTOMCLIP 1.0 #define ZNEARCLIP (-1.0) #define ZFARCLIP 1.0 static int xyz[6], clipvertnum = 0; static mgbufprim *prim1, *prim2, *primtemp; static CPoint3 *vts1, *vts2, *vtstemp; /* Function: Xmgr_dividew() Description: Divide out w coordinate (*after* clipping against WCLIPPLANE) Author: Daeron Meyer */ void Xmgr_dividew(void) { CPoint3 *curr; float w; int n; for (n = 0; n < prim1->numvts; n++) { curr = &(vts1[n]); w = curr->w; curr->x /= w; curr->y /= w; curr->z /= w; curr->z += _mgbufc->znudgeby; if (curr->x < XLEFTCLIP) xyz[0]++; if (curr->x >= (float)_mgbufc->xsize - XRIGHTCLIP) xyz[1]++; if (curr->y < YTOPCLIP) xyz[2]++; if (curr->y >= (float)_mgbufc->ysize - YBOTTOMCLIP) xyz[3]++; if (curr->z < ZNEARCLIP) xyz[4]++; if (curr->z >= ZFARCLIP) xyz[5]++; } } /* Function: Xmgr_cliptoplane() Description: Clip polygon against a coordinate axis plane Author: Daeron Meyer */ void Xmgr_cliptoplane(int coord, float plane, float sign) { CPoint3 *prev, *curr, *dest; float i, i1, i2, *c1, *p1, *d1; int n; #ifdef DEBUGCLIP fprintf(stderr, "Clip %d, plane=%f, sign=%f\n", coord, plane, sign); #endif prim2->numvts = 0; prev = &(vts1[prim1->numvts - 1]); i1 = sign * ((float *) prev) [coord] - plane; for (curr=vts1, n=prim1->numvts; n > 0; n--, prev=curr, i1=i2, curr++) { i2 = sign * ((float *) curr) [coord] - plane; if ((i1 <= 0.0) ^ (i2 <= 0.0)) { i = i1/(i1 - i2); dest = &(vts2[prim2->numvts]); dest->x = prev->x + i * (curr->x - prev->x); dest->y = prev->y + i * (curr->y - prev->y); dest->z = prev->z + i * (curr->z - prev->z); dest->w = prev->w + i * (curr->w - prev->w); if ((i1 <= 0.0) || (prev->drawnext == 0)) dest->drawnext = 0; else dest->drawnext = 1; c1 = (float *) &(curr->vcol); p1 = (float *) &(prev->vcol); d1 = (float *) &(dest->vcol); d1[0] = p1[0] + i * (c1[0] - p1[0]); d1[1] = p1[1] + i * (c1[1] - p1[1]); d1[2] = p1[2] + i * (c1[2] - p1[2]); d1[3] = p1[3] + i * (c1[3] - p1[3]); prim2->numvts++; } if (i2 <= 0.0) { vts2[prim2->numvts] = *curr; prim2->numvts++; } } #ifdef DEBUGCLIP for (n = 0; n < prim2->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts2[n].x, vts2[n].y, vts2[n].z, vts2[n].w, vts2[n].drawnext); } #endif } /* Function: Xmgr_primclip() Description: Clip a polygon to fit in the viewing volume Author: Daeron Meyer */ int Xmgr_primclip(mgbufprim *aprim) { static mgbufprim clip; static int mykind, n; static vvec clipverts; static int intersectw; xyz[0]=0; xyz[1]=0; xyz[2]=0; xyz[3]=0; xyz[4]=0; xyz[5]=0; /* give ourselves more space for vertex data if needed */ if ((aprim->numvts * 2) > clipvertnum) { if (!clipvertnum) VVINIT(clipverts, CPoint3, clipvertnum); clipvertnum = aprim->numvts * 2; vvneeds(&clipverts, clipvertnum); } /* We might need more space for the final polygon since clipping can produce a polygon with more vertices than it had to begin with. We'll err on the side of safety: */ if (aprim->numvts > _mgbufc->pvertnum) { _mgbufc->pvertnum *= 2; vvneeds(&(_mgbufc->pverts), _mgbufc->pvertnum); } mykind = aprim->mykind; prim1 = aprim; prim2 = &clip; vts1 = &(VVEC(_mgbufc->pverts, CPoint3)[prim1->index]); vts2 = &(VVEC(clipverts, CPoint3)[0]); if ((mykind==PRIM_LINE) || (mykind==PRIM_SLINE)) vts1[prim1->numvts-1].drawnext = 0; prim2->index = 0; prim2->numvts = prim1->numvts; #define CLIP_POLYS_AND_SWAP(a, b, c) { \ Xmgr_cliptoplane(a, b, c); \ if (prim2->numvts == 0) { aprim->numvts = 0; return PRIM_INVIS; } \ vtstemp = vts2; vts2 = vts1; vts1 = vtstemp; \ primtemp = prim2; prim2 = prim1; prim1 = primtemp; \ } #ifdef DEBUGCLIP fprintf(stderr, "BEGIN-CLIP\n"); fprintf(stderr, "INITIAL POLY:\n"); for (n=0; n < aprim->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts1[n].x, vts1[n].y, vts1[n].z, vts1[n].w, vts1[n].drawnext); } fprintf(stderr,"===========================\n"); #endif intersectw = 0; for (n = 0; (n < aprim->numvts) && !intersectw; n++) { if (vts1[n].w < WCLIPPLANE) intersectw = 1; } if (intersectw) CLIP_POLYS_AND_SWAP(3, -WCLIPPLANE, -1.0); Xmgr_dividew(); n = prim1->numvts; if (!intersectw && (xyz[0]+xyz[1]+xyz[2]+xyz[3]+xyz[4]+xyz[5] == 0)) return mykind; else if (xyz[0] == n || xyz[1] == n || xyz[2] == n || xyz[3] == n || xyz[4] == n || xyz[5] == n) return PRIM_INVIS; if (xyz[0]) CLIP_POLYS_AND_SWAP(0, -XLEFTCLIP, -1.0); if (xyz[1]) CLIP_POLYS_AND_SWAP(0, (float)_mgbufc->xsize-XRIGHTCLIP, 1.0); if (xyz[2]) CLIP_POLYS_AND_SWAP(1, -YTOPCLIP, -1.0); if (xyz[3]) CLIP_POLYS_AND_SWAP(1, (float)_mgbufc->ysize-YBOTTOMCLIP, 1.0); if (xyz[4]) CLIP_POLYS_AND_SWAP(2, -ZNEARCLIP, -1.0); if (xyz[5]) CLIP_POLYS_AND_SWAP(2, ZFARCLIP, 1.0); if (aprim == prim2) /* If the vertex data ended up in the local vertex list, then we need to copy it back to the global vertex list */ { prim2->numvts = prim1->numvts; /* for (n=0; n < aprim->numvts; n++) { vts2[n] = vts1[n]; } */ memcpy(vts2, vts1, sizeof(CPoint3) * prim1->numvts); } #ifdef DEBUGCLIP fprintf(stderr, "FINAL POLY:\n"); for (n=0; n < aprim->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts1[n].x, vts1[n].y, vts1[n].z, vts1[n].w, vts1[n].drawnext); } fprintf(stderr, "END-CLIP\n"); #endif return mykind; } geomview-1.9.4/src/lib/mg/buf/mgbufdraw.c0000644000175000001440000004402510622716756015143 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgbufP.h" #include "polylistP.h" #include "mgbufwindows.h" /* Author: Daeron Meyer */ void mgbuf_polygon( int nv, HPoint3 *v, int nn, Point3 *n, int nc, ColorA *c ); void mgbuf_mesh( int wrap, int nu, int nv, HPoint3 *p, Point3 *n, Point3 *nq, ColorA *c ); void mgbuf_line( HPoint3 *p1, HPoint3 *p2 ); void mgbuf_polyline( int nv, HPoint3 *verts, int nc, ColorA *colors, int wrap ); void mgbuf_polylist( int np, Poly *p, int nv, Vertex *v, int pl_flags ); void mgbuf_drawnormal(HPoint3 *p, Point3 *n); void mgbuf_closer(); void mgbuf_farther(); static ColorA *C2; /*----------------------------------------------------------------------- * Function: mgbuf_polygon * Description: draw a polygon * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgbuf_polygon(int nv, HPoint3 *V, int nn, Point3 *N, int nc, ColorA *C) { int count; HPoint3 *v; Point3 *n; int flag, ninc, smooth; /* fprintf(stderr,"X11: draw a polygon\n"); */ flag = _mgc->astk->ap.flag; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) nc = 0; ninc = (nn > 1); smooth = IS_SMOOTH(_mgc->astk->ap.shading); /* fprintf(stderr,"cinc = %d, nc = %d, nn = %d\n", cinc, nc, nn); */ if (nc == 0) C = (ColorA*)&_mgc->astk->ap.mat->diffuse; if ((flag & APF_FACEDRAW) && (flag & APF_EDGEDRAW)) { /* put polygon in display list */ if (smooth && (nc > 0)) BUFmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNEPOLY, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); /* edge color */ BUFmg_add(MGX_COLOR, 0, NULL, C); /* face color */ if (smooth) BUFmg_add(MGX_CVERTEX, nv, V, C); else BUFmg_add(MGX_VERTEX, nv, V, NULL); BUFmg_add(MGX_END, 0, NULL, NULL); } else if (flag & APF_FACEDRAW) { /* put polygon in display list */ if (smooth) BUFmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNPOLY, 0, NULL, NULL); BUFmg_add(MGX_COLOR, 0, NULL, C); if (smooth && (nc > 0)) BUFmg_add(MGX_CVERTEX, nv, V, C); else BUFmg_add(MGX_VERTEX, nv, V, NULL); BUFmg_add(MGX_END, 0, NULL, NULL); } else if (flag & APF_EDGEDRAW) { BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); BUFmg_add(MGX_VERTEX, nv, V, NULL); BUFmg_add(MGX_VERTEX, 1, V, NULL); BUFmg_add(MGX_END, 0, NULL, NULL); } if (flag & APF_NORMALDRAW) { mgbuf_closer(); BUFmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->normalcolor); for (n = N, v = V, count = 0; count 1) * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgbuf_fatpoint(HPoint3 *v) { HPoint3 a; HPoint3 *p, *q; float vw; /* fprintf(stderr,"X11: make a fat-point\n"); */ if (!(_mgc->has & HAS_POINT)) mg_makepoint(); /* Compute w component of point after projection to screen */ vw = v->x * _mgc->O2S[0][3] + v->y * _mgc->O2S[1][3] + v->z * _mgc->O2S[2][3] + v->w * _mgc->O2S[3][3]; if (vw <= 0) return; #define PUT(p) \ a.x = v->x + p->x*vw; a.y = v->y + p->y*vw; \ a.z = v->z + p->z*vw; a.w = v->w + p->w*vw; \ BUFmg_add(MGX_VERTEX, 1, &a, NULL); p = VVEC(_mgc->point, HPoint3); q = p + VVCOUNT(_mgc->point); BUFmg_add(MGX_BGNPOLY, 0, NULL, NULL); do { PUT(p); } while (++p < q); BUFmg_add(MGX_END, 0, NULL, NULL); } /*----------------------------------------------------------------------- * Function: mgbuf_polyline * Description: draw a polyline (possibly more than 2 vertices) * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgbuf_polyline( int nv, HPoint3 *v, int nc, ColorA *c, int wrapped ) { int remain; /* fprintf(stderr,"X11: draw a polyline\n"); */ if (!(wrapped & 2)) { if (_mgbufc->znudge) mgbuf_closer(); } if (nv == 1) { if (nc > 0) BUFmg_add(MGX_ECOLOR, 0, NULL, c); if (_mgc->astk->ap.linewidth > 1) { BUFmg_add(MGX_COLOR, 0, NULL, c); mgbuf_fatpoint(v); } else { BUFmg_add(MGX_BGNSLINE, 0, NULL, NULL); BUFmg_add(MGX_CVERTEX, 1, v, c); BUFmg_add(MGX_END, 0, NULL, NULL); } } else if (nv > 0) { BUFmg_add(MGX_BGNSLINE, 0, NULL, NULL); if (wrapped & 1) { if (nc > 0) { BUFmg_add(MGX_ECOLOR, 0, NULL, (c + nc - 1)); BUFmg_add(MGX_CVERTEX, 1, (v + nv - 1), (c + nc - 1)); } else BUFmg_add(MGX_CVERTEX, 1, (v + nv - 1), c); } for (;;) { remain = nv > 254 ? 254 : nv; nv -= remain; do { if (--nc > 0) { BUFmg_add(MGX_ECOLOR, 0, NULL, c); BUFmg_add(MGX_CVERTEX, 1, v++, c++); } else BUFmg_add(MGX_CVERTEX, 1, v++, c); } while (--remain > 0); if (nv == 0) break; if (nc > 0) BUFmg_add(MGX_ECOLOR, 0, NULL, c); BUFmg_add(MGX_CVERTEX, 1, v, c); BUFmg_add(MGX_END, 0, NULL, NULL); BUFmg_add(MGX_BGNSLINE, 0, NULL, NULL); } BUFmg_add(MGX_END, 0, NULL, NULL); } if (!(wrapped & 4) && _mgbufc->znudge) mgbuf_farther(); } /*----------------------------------------------------------------------- * Function: mgbuf_polylist * Description: draws a Polylist: collection of Polys * Author: Daeron Meyer * Notes: see mg.doc */ void mgbuf_polylist( int np, Poly *_p, int nv, Vertex *V, int pl_flags ) { int i, j; Poly *p; Vertex **v, *vp, **vh; struct mgastk *ma = _mgc->astk; int plflags = pl_flags; int flag, shading; int nonsurf = -1; flag = ma->ap.flag; shading = ma->ap.shading; /* fprintf(stderr,"X11: draw a polylist %d\n",np); */ switch(shading) { case APF_FLAT: plflags &= ~PL_HASVN; break; case APF_SMOOTH: plflags &= ~PL_HASPN; break; default: plflags &= ~(PL_HASVN | PL_HASPN); break; } if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) plflags &= ~(PL_HASVCOL | PL_HASPCOL); if (flag & APF_FACEDRAW) { for (p = _p, i = 0; i < np; i++, p++) { v = p->v; if ((j = p->n_vertices) <= 2) nonsurf = i; else { if (flag & APF_EDGEDRAW) { if (shading == APF_FLAT || shading == APF_CONSTANT) { BUFmg_add(MGX_BGNEPOLY, 0, NULL, NULL); } else if (plflags & PL_HASVCOL) BUFmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNEPOLY, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); } else { if (shading == APF_FLAT || shading == APF_CONSTANT) { BUFmg_add(MGX_BGNPOLY, 0, NULL, NULL); } else if (plflags & PL_HASVCOL) BUFmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNPOLY, 0, NULL, NULL); } if (plflags & PL_HASPCOL) BUFmg_add(MGX_COLOR, 0, NULL, &p->pcol); else if (plflags & PL_HASVCOL) /* if we have per vertex */ BUFmg_add(MGX_COLOR, 0, NULL, &(*v)->vcol); else BUFmg_add(MGX_COLOR, 0, NULL, &(ma->ap.mat->diffuse)); vh = v; do { if (plflags & PL_HASVCOL) BUFmg_add(MGX_CVERTEX, 1, &(*v)->pt, &(*v)->vcol); else BUFmg_add(MGX_CVERTEX, 1, &(*v)->pt, &(*vh)->vcol); v++; } while (--j > 0); BUFmg_add(MGX_END, 0, NULL, NULL); } } } if (flag & (APF_EDGEDRAW | APF_NORMALDRAW) || nonsurf > 0) { if (_mgbufc->znudge) mgbuf_closer(); if (flag & APF_EDGEDRAW && !(flag & APF_FACEDRAW)) { BUFmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); for (p = _p, i = 0; i < np; i++, p++) { BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); for (j = 0, v = p->v; j < p->n_vertices; j++, v++) BUFmg_add(MGX_VERTEX, 1, &(*v)->pt, NULL); BUFmg_add(MGX_VERTEX, 1, &(*(p->v))->pt, NULL); BUFmg_add(MGX_END, 0, NULL, NULL); } } if (flag & APF_NORMALDRAW) { BUFmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->normalcolor); if (pl_flags & PL_HASPN) { for (p = _p, i = 0; i < np; i++, p++) { for (j = 0, v = p->v; j < p->n_vertices; j++, v++) mgbuf_drawnormal(&(*v)->pt, (Point3 *)&p->pn); } } else if (pl_flags & PL_HASVN) { for (vp = V, i = 0; i < nv; i++, vp++) mgbuf_drawnormal(&vp->pt, &vp->vn); } } for (p = _p, i = 0; i <= nonsurf; p++, i++) { v = p->v; switch (j = p->n_vertices) { case 1: BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); if (pl_flags & PL_HASVCOL) BUFmg_add(MGX_ECOLOR, 0, NULL, &(*v)->vcol); BUFmg_add(MGX_VERTEX, 1, &(*v)->pt, NULL); BUFmg_add(MGX_END, 0, NULL, NULL); break; case 2: BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); do { if (pl_flags & PL_HASVCOL) BUFmg_add(MGX_ECOLOR, 0, NULL, &(*v)->vcol); BUFmg_add(MGX_VERTEX, 1, &(*v)->pt, NULL); v++; } while (--j > 0); BUFmg_add(MGX_END, 0, NULL, NULL); break; } } if (_mgbufc->znudge) mgbuf_farther(); } } #define HAS_N 1 #define HAS_C 2 #define HAS_SMOOTH 4 /*----------------------------------------------------------------------- * Function: mgbufpolymeshrow * Description: draw one row of a mesh * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgbufpolymeshrow(int wrap, int has, int off, int count, HPoint3 *P, Point3 *N, ColorA *C, int flag, float *CE, int first) { int k; int edges = flag & APF_EDGEDRAW; int faces = flag & APF_FACEDRAW; if (wrap & MM_UWRAP) { k = count - 1; if (edges && faces) { if (has & HAS_SMOOTH) BUFmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNEPOLY, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, CE); } else if (faces) { if (has & HAS_SMOOTH) BUFmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNPOLY, 0, NULL, NULL); } else { BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, CE); } if (C) { BUFmg_add(MGX_COLOR, 0, NULL, C+off+k); C2 = C+off+k; } else BUFmg_add(MGX_COLOR, 0, NULL, C2); if (has & HAS_SMOOTH) { if (C) { BUFmg_add(MGX_CVERTEX, 1, P+off+k, C+off+k); BUFmg_add(MGX_CVERTEX, 1, P+k, C+k); BUFmg_add(MGX_CVERTEX, 1, P, C); BUFmg_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C+off; } else { BUFmg_add(MGX_CVERTEX, 1, P+off+k, C2); BUFmg_add(MGX_CVERTEX, 1, P+k, C2); BUFmg_add(MGX_CVERTEX, 1, P, C2); BUFmg_add(MGX_CVERTEX, 1, P+off, C2); } } else { BUFmg_add(MGX_VERTEX, 1, P+off+k, NULL); BUFmg_add(MGX_VERTEX, 1, P+k, NULL); BUFmg_add(MGX_VERTEX, 1, P, NULL); BUFmg_add(MGX_VERTEX, 1, P+off, NULL); } BUFmg_add(MGX_END, 0, NULL, NULL); } k = count; do { if (edges && faces) { if (has & HAS_SMOOTH) BUFmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNEPOLY, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, CE); } else if (faces) { if (has & HAS_SMOOTH) BUFmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else BUFmg_add(MGX_BGNPOLY, 0, NULL, NULL); } else { BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); BUFmg_add(MGX_ECOLOR, 0, NULL, CE); /* ADDED */ if (first) BUFmg_add(MGX_VERTEX, 1, P+1+off, NULL); /* END */ } if (C) { BUFmg_add(MGX_COLOR, 0, NULL, C+off); C2 = C+off; } if (has & HAS_SMOOTH) { if (C) { BUFmg_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C; } else BUFmg_add(MGX_CVERTEX, 1, P+off, C2); if (C) { BUFmg_add(MGX_CVERTEX, 1, P++, C++); C2 = C; } else BUFmg_add(MGX_CVERTEX, 1, P++, C2); if (C) { BUFmg_add(MGX_CVERTEX, 1, P, C); C2 = C; } else BUFmg_add(MGX_CVERTEX, 1, P, C2); if (C) { BUFmg_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C; } else BUFmg_add(MGX_CVERTEX, 1, P+off, C2); } else { BUFmg_add(MGX_VERTEX, 1, P+off, NULL); if (C) C++; if (N) N++; BUFmg_add(MGX_VERTEX, 1, P++, NULL); BUFmg_add(MGX_VERTEX, 1, P, NULL); BUFmg_add(MGX_VERTEX, 1, P+off, NULL); } BUFmg_add(MGX_END, 0, NULL, NULL); } while (--k > 1); } /*----------------------------------------------------------------------- * Function: mgbufsubmesh * Description: divide up mesh and draw by rows * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgbufsubmesh(int wrap, int nu, int nv, int umin, int umax, int vmin, int vmax, HPoint3 *meshP, Point3 *meshN, ColorA *meshC) { int v; int ucnt; HPoint3 *P; Point3 *N; ColorA *C; int prev; int du; int i; int has; Appearance *ap; if (nu <= 0 || nv <= 0) return; ap = &_mgc->astk->ap; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) meshC = 0; has = 0; if (meshN && !(_mgc->astk->flags & MGASTK_SHADER)) has = HAS_N; if (meshC) has |= HAS_C; if (IS_SMOOTH(ap->shading)) has |= HAS_SMOOTH; if ( ap->flag & (APF_FACEDRAW | APF_EDGEDRAW) ) /* BUG? */ { if (!(has & HAS_C)) BUFmg_add(MGX_COLOR, 0, NULL, &ap->mat->diffuse); C2 = (ColorA *) &ap->mat->diffuse; v = vmax - vmin + 1; du = umin + vmin * nu; if (wrap & MM_VWRAP) { prev = nu * (v - 1); } else { du += nu; prev = -nu; v--; } do { P = meshP + du; N = meshN + du; C = meshC + du; ucnt = umax - umin + 1; mgbufpolymeshrow(wrap, has, prev, ucnt, P, has & HAS_N ? N : NULL, has & HAS_C ? C : NULL, ap->flag, (float *)&ap->mat->edgecolor, (int)(v!=1)); prev = -nu; du += nu; } while (--v > 0); } if (ap->flag & APF_NORMALDRAW && meshN != NULL) { BUFmg_add(MGX_ECOLOR, 0, NULL, &ap->mat->normalcolor); if (_mgbufc->znudge) mgbuf_closer(); for (i = nu*nv, P = meshP, N = meshN; --i >= 0; P++, N++) mgbuf_drawnormal(P, N); if (_mgbufc->znudge) mgbuf_farther(); } } /*----------------------------------------------------------------------- * Function: mgbuf_mesh * Description: draw a mesh * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgbuf_mesh(int wrap, int nu, int nv, HPoint3 *P, Point3 *N, Point3 *NQ, ColorA *C ) { mgbufsubmesh( wrap, nu, nv, 0, nu-1, 0, nv-1, P, N, C); } /*-----------------------------------------------------------------------* * end of mesh drawing functions: * *-----------------------------------------------------------------------*/ /* * Z-shift routines: for moving edges closer than faces, etc. */ void mgbuf_init_zrange() { _mgbufc->znudge = 1; _mgbufc->znudgeby = 0.0; } void mgbuf_closer() { /* _mgbufc->znudgeby = 0.001; */ } void mgbuf_farther() { _mgbufc->znudgeby = 0.0; } void mgbuf_findcam() { } /* There is a basic problem now with 4-d points and 3-d normal vectors. For now, we'll just ignore the 4-th coordinate of the point when computing the tip of the normal vector. This will work OK with all existing models, but for genuine 4-d points it won't work. But, come to think of it, what is the correct interpretation of the normal vector when the points live in 4-d? */ void mgbuf_drawnormal(HPoint3 *p, Point3 *n) { Point3 tp; HPoint3 end; HPt3Coord scale, w, s; /* fprintf(stderr,"X11: draw a normal\n"); */ if (p->w <= 0.0) return; if (p->w != 1) { HPt3ToPt3(p, &tp); p = (HPoint3 *)(void *)&tp; } scale = _mgc->astk->ap.nscale; if (_mgc->astk->ap.flag & APF_EVERT) { HPoint3 *cp = &_mgc->cpos; if (!(_mgc->has & HAS_CPOS)) { mg_findcam(); } if ((w = cp->w) != 1.0 && w != 0.0) { s = (p->x*w-cp->x)*n->x + (p->y*w-cp->y)*n->y + (p->z*w-cp->z)*n->z; } else { s = (p->x-cp->x)*n->x + (p->y-cp->y)*n->y + (p->z-cp->z)*n->z; } if (s > 0) { scale = -scale; } } end.x = p->x + scale*n->x; end.y = p->y + scale*n->y; end.z = p->z + scale*n->z; end.w = 1.0; BUFmg_add(MGX_BGNLINE, 0, NULL, NULL); BUFmg_add(MGX_VERTEX, 1, p, NULL); BUFmg_add(MGX_VERTEX, 1, &end, NULL); BUFmg_add(MGX_END, 0, NULL, NULL); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/buf/MGRpolyscan.h0000644000175000001440000001137010455701005015346 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* needed stuff: NAME: name of function GOURAUD: defined for smooth shade ZBUFFER: defined for z-buffer code COLOR: define for color */ #define RLUM 0.299 #define GLUM 0.587 #define BLUM 0.144 #if defined(ZBUFFER) #define ZCODE(x) x #else #define ZCODE(x) #endif #ifdef GOURAUD #ifdef COLOR #define GCODE(x) #define CCODE(x) x #else #define GCODE(x) x #define CCODE(x) #endif #define CGCODE(x) x #else #define CCODE(x) #define GCODE(x) #define CGCODE(x) #endif void NAME (unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color, endPoint *mug, void (*scanfunc)(unsigned char *, float *, int, int, int, int, int, int *, endPoint *)) { int x,y,dx,dy,d; /* bresenham engine */ int miny = INT_MAX, maxy = INT_MIN; /* y-bounds */ int i,j,x1,x2,y1,y2; /* indices */ int sf, si, sr, inc, dec; #ifdef ZBUFFER double z, z1, z2, delta; #endif #ifdef GOURAUD double r, dr; int r1, r2; #ifdef COLOR double g, b, dg, db; int g1, g2, b1, b2; #endif #endif for (i=0; i(%3d %3d) (%d,%d,%d)->(%d,%d,%d)\n", i, j, x1, y1, x2, y2, r1, g1, b1, r2, g2, b2);) #endif dx = x2-x1; dy = y2-y1; if (dy == 0) { CGCODE(dr = 0;) CCODE(dg = db = 0;) ZCODE(delta = 0); } else { CGCODE(dr = (r2-r1)/(double)(dy);) CCODE(dg = (g2-g1)/(double)(dy); db = (b2-b1)/(double)(dy);) ZCODE(delta = (z2-z1)/(double)(dy);) } x = x1; y = y1; CGCODE(r = r1+dr;) CCODE(g = g1+dg; b = b1+db;) ZCODE(z = z1+delta;) if (dy) { if (dx >= 0) si = dx/dy; else si = (dx/dy) + (((dx % dy) == 0) ? 0 : -1); } else si = 0; x = x1+si; sf = dx - si*dy; sr = 2*sf-dy; inc = sf; dec = sf-dy; for (y=y1+1; y<=y2; y++) { #if 0 CCODE(fprintf(stderr, "\t%3d %3d (%lf %lf %lf)\n", x, y, r, g, b);) #endif if(mug[y].init) { if (x < mug[y].P1x) { mug[y].P1x = x; ZCODE(mug[y].P1z = z;) CGCODE(mug[y].P1r = r;) CCODE(mug[y].P1g = g; mug[y].P1b = b;) } else if (x > mug[y].P2x) { mug[y].P2x = x; ZCODE(mug[y].P2z = z;) CGCODE(mug[y].P2r = r;) CCODE(mug[y].P2g = g; mug[y].P2b = b;) } } else { mug[y].init = 1; mug[y].P1x = x; mug[y].P2x = x; ZCODE(mug[y].P1z = z; mug[y].P2z = z;) CGCODE(mug[y].P1r = r; mug[y].P2r = r;) CCODE(mug[y].P1g = g; mug[y].P1b = b; mug[y].P2g = g; mug[y].P2b = b;) } ZCODE(z += delta;) CGCODE(r += dr;) CCODE(g += dg; b += db;) if (sr >= 0) { x += si+1; sr += dec; } else { x += si; sr += inc; } } } miny++; for (i=miny; (i<=maxy) && ( mug[i].P2x == mug[i].P1x); i++) miny++; for (i=maxy; (i>=miny) && ( mug[i].P2x == mug[i].P1x); i--) maxy--; for (i=miny; i<=maxy; i++) mug[i].P1x++; scanfunc(buf, zbuf, zwidth, width, height, miny, maxy, color, mug); } /* Now clear out all the definitions */ #undef COLOR #undef ZBUFFER #undef NAME #undef GOURAUD #undef ZCODE #undef CGCODE #undef GCODE #undef CCODE geomview-1.9.4/src/lib/mg/buf/mgbufrender24.c0000644000175000001440000002042510455701005015612 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Author: Timothy Rowley */ /* {{{ Includes */ #include #include #include #include "mgP.h" #include "mgbufP.h" /* }}} */ static endPoint *mug=NULL; static int mugSize = 0; static int rshift, bshift, gshift; #ifdef __GNUC__ inline #endif static int RGBtoVal(int r, int g, int b) { return ((r << rshift) | (g << gshift) | (b << bshift)); } static int maskShift(int mask) { switch (mask) { case 0xFF000000U: return 24; case 0xFF0000U: return 16; case 0xFF00U: return 8; case 0xFFU: return 0; default: return 32; } } void Xmgr_24fullinit(int rmask, int gmask, int bmask) { rshift = maskShift(rmask); gshift = maskShift(gmask); bshift = maskShift(bmask); } /* {{{ clearing routine */ void Xmgr_24clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax) { int *ptr = (int *)buf; int i, fill, end, x, length, pos; fill = RGBtoVal(color[0], color[1], color[2]); if (mug==NULL) { mug = (endPoint *)malloc(sizeof(endPoint)*height); mugSize = height; } if (height>mugSize) { mug = (endPoint *)realloc(mug, sizeof(endPoint)*height); mugSize = height; } if (fullclear) { end = (width*height)/4; for (i=0; i>2 #define PTR_TYPE int #define PTR_INIT (int *)(buf+y1*width+4*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = col; #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = col; #define DOPIXEL *ptr = col; #define VARIABLES int col = RGBtoVal(color[0], color[1], color[2]); #include "MGRline.h" #define WIDENAME wideZline #define NAME Xmgr_24Zline #define PTR_INCR width>>2 #define ZBUFFER #define PTR_TYPE int #define PTR_INIT (int *)(buf+y1*width+4*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = col; #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = col; #define DOPIXEL *ptr = col; #define VARIABLES int col = RGBtoVal(color[0], color[1], color[2]); #include "MGRline.h" #define WIDENAME wideGline #define NAME Xmgr_24Gline #define PTR_INCR width>>2 #define GOURAUD #define COLOR #define PTR_TYPE int #define PTR_INIT (int *)(buf+y1*width+4*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = RGBtoVal(r, g, b); #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = RGBtoVal(r, g, b); #define DOPIXEL *ptr = RGBtoVal(r, g, b); #include "MGRline.h" #define WIDENAME wideGZline #define NAME Xmgr_24GZline #define PTR_INCR width>>2 #define ZBUFFER #define GOURAUD #define COLOR #define PTR_TYPE int #define PTR_INIT (int *)(buf+y1*width+4*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = RGBtoVal(r, g, b); #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = RGBtoVal(r, g, b); #define DOPIXEL *ptr = RGBtoVal(r, g, b); #include "MGRline.h" /* }}} */ /* {{{ polygon scan conversion */ #define INIT (int *)(buf+width*y+x1*4) #define NAME Xmgr_doLines #define PTR_TYPE int #define PTR_INIT INIT #define VARIABLES int col=RGBtoVal(color[0], color[1], color[2]); #define DOPIXEL *ptr = col; #include "MGRdolines.h" #define NAME Xmgr_ZdoLines #define ZBUFFER #define PTR_TYPE int #define PTR_INIT INIT #define VARIABLES int col=RGBtoVal(color[0], color[1], color[2]); #define DOPIXEL *ptr = col; #include "MGRdolines.h" #define NAME Xmgr_GdoLines #define PTR_TYPE int #define PTR_INIT INIT #define DOPIXEL *ptr = RGBtoVal(r,g,b); #define GOURAUD #define COLOR #include "MGRdolines.h" #define NAME Xmgr_GZdoLines #define ZBUFFER #define PTR_TYPE int #define PTR_INIT INIT #define DOPIXEL *ptr = RGBtoVal(r,g,b); #define GOURAUD #define COLOR #include "MGRdolines.h" void Xmgr_24Zpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_Zpolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_ZdoLines); } void Xmgr_24poly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_polyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_doLines); } void Xmgr_24GZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy) { Xmgr_GZpolyscan(buf, zbuf, zwidth, width, height, p, n, dummy, mug, Xmgr_GZdoLines); } void Xmgr_24Gpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy) { Xmgr_Gpolyscan(buf, zbuf, zwidth, width, height, p, n, dummy, mug, Xmgr_GdoLines); } /* }}} */ /* {{{ multi-line scan conversion */ #ifdef __GNUC__ inline #endif static void setZpixel(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int *color) { if (p->z < zbuf[(int)(p->y)*zwidth+(int)p->x]) ((int *)buf)[(int)(p->y)*(width/4)+(int)p->x] = RGBtoVal(color[0], color[1], color[2]); } #ifdef __GNUC__ inline #endif static void setpixel(unsigned char *buf, int zwidth, int width, int height, CPoint3 *p, int *color) { ((int *)buf)[(int)(p->y)*(width/4)+(int)p->x] = RGBtoVal(color[0], color[1], color[2]); } void Xmgr_24polyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; CPoint3 *cp; if (n == 1) { setpixel(buf, zwidth, width, height, p, color); return; } for (i=0, cp=p; idrawnext) Xmgr_24line(buf, zbuf, zwidth, width, height, cp, cp+1, lwidth, color); } void Xmgr_24Zpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; CPoint3 *cp; if (n == 1) { setZpixel(buf, zbuf, zwidth, width, height, p, color); return; } for (i=0, cp=p; idrawnext) Xmgr_24Zline(buf, zbuf, zwidth, width, height, cp, cp+1, lwidth, color); } void Xmgr_24Gpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; CPoint3 *cp; if (n == 1) { setpixel(buf, zwidth, width, height, p, color); return; } for (i=0, cp=p; idrawnext) Xmgr_gradWrapper(buf, zbuf, zwidth, width, height, cp, cp+1, lwidth, Xmgr_24line, Xmgr_24Gline); } void Xmgr_24GZpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; CPoint3 *cp; if (n == 1) { setZpixel(buf, zbuf, zwidth, width, height, p, color); return; } for (i=0, cp=p; idrawnext) Xmgr_gradWrapper(buf, zbuf, zwidth, width, height, cp, cp+1, lwidth, Xmgr_24Zline, Xmgr_24GZline); } /* }}} */ /* Local variables: folded-file: t */ geomview-1.9.4/src/lib/mg/buf/mgbufrender24.h0000644000175000001440000000520610455701005015617 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Author: Timothy Rowley */ #ifndef MGBUFRENDER24 #define MGBUFRENDER24 void Xmgr_24fullinit(int rmask, int gmask, int bmask); void Xmgr_24clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax); void Xmgr_24poly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color); void Xmgr_24polyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_24line(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p1, CPoint3 *p2, int lwidth, int *color); void Xmgr_24Zpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color); void Xmgr_24Zpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_24GZpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_24Gpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color); void Xmgr_24Zline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p1, CPoint3 *p2, int lwidth, int *color); void Xmgr_24GZline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p1, CPoint3 *p2, int lwidth, int *color); void Xmgr_24GZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy); void Xmgr_24Gpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy); #endif geomview-1.9.4/src/lib/mg/buf/Headers0000644000175000001440000000014307730240000014264 00000000000000MGRdolines.h MGRline.h MGRpolyscan.h mgbuf.h mgbufP.h mgbufrender.h mgbufrender24.h mgbufwindows.h geomview-1.9.4/src/lib/mg/rib/0000777000175000001440000000000010665240676013100 500000000000000geomview-1.9.4/src/lib/mg/rib/mgribdraw.c0000644000175000001440000004551210611517720015131 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgribP.h" #include "mgribtoken.h" #include "polylistP.h" #define MAXCLINE 999999 void mgrib_drawPline(HPoint3 *p1, HPoint3 *p2); void mgrib_drawCline(HPoint3 *p1, HPoint3 *p2); void mgrib_polygon( int nv, HPoint3 *v, int nn, Point3 *n, int nc,ColorA *c ); void mgrib_mesh(int wrap,int nu,int nv,HPoint3 *p, Point3 *n, Point3 *nq, ColorA *c ); void mgrib_line( HPoint3 *p1, HPoint3 *p2 ); void mgrib_polyline( int nv, HPoint3 *verts, int nc, ColorA *colors, int wrapped ); void mgrib_polylist( int np, Poly *p, int nv, Vertex *v, int plflags ); void mgrib_drawnormal(HPoint3 *p, Point3 *n); /*----------------------------------------------------------------------- * Function: mgrib_polygon * Description: draw a polygon * Author: wisdom * Date: Thu Aug 26 13:46:25 CDT 1993 * Notes: See mg.doc. * */ void mgrib_polygon(int nv, HPoint3 *V, int nn, Point3 *N, int nc, ColorA *C) { int i; HPoint3 *v; Point3 *n; Color *c; ColorA *c4; HPoint3 hpt; int flag; int shading; int matover; int ninc; flag = _mgc->astk->ap.flag; shading = _mgc->astk->ap.shading; matover = _mgc->astk->mat.override; ninc = (nn > 1); if ((matover & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) nc = 0; mrti(mr_polygon,mr_NULL); /* Points */ if (nv>0 && (flag & APF_FACEDRAW)) { mrti(mr_P,mr_buildarray, nv*3, mr_NULL); for (i = 0; i < nv; i++) { /* we cannot descibe a polygon using Pw, so we normalize */ HPt3Dehomogenize(&V[i], &hpt); mrti(mr_subarray3, &hpt, mr_NULL); } } /* Supply Color (explicit) */ if (nc>0 && (flag & APF_FACEDRAW)) { /* note:color should already be set in case of APF_CONSTANT,no? */ mrti(mr_Cs, mr_buildarray, nv*3, mr_NULL); for (i = 0; i < nv; i++) { if (nc>1) c4 = &C[i]; else c4 = C; mrti(mr_subarray3, (float *)c4, mr_NULL); } } /* Supply Transparency */ if (nc>0 && flag & APF_TRANSP && !(matover & MTF_ALPHA)) { for (i = 0; i < nv; i++) { float opacity[3]; if (nc>1) c4 = &C[i]; else c4 = C; opacity[0]=opacity[1]=opacity[2]=c4->a; mrti(mr_subarray3, opacity, mr_NULL); } } /* Supply Normals */ if (nn>0 && (flag & APF_FACEDRAW) && shading == APF_SMOOTH) { mrti(mr_N, mr_buildarray, nv*3, mr_NULL); for (i = 0; i < nv; i++) { if (nn>1) n = &N[i]; else n = N; mrti(mr_subarray3, n, mr_NULL); } } /* Draw Edges */ if (flag & APF_EDGEDRAW) { c = &_mgc->astk->ap.mat->edgecolor; mrti(mr_attributebegin, mr_surface, mr_constant, mr_color, mr_parray, 3, c, mr_opacity, mr_array, 3, 1., 1., 1., mr_NULL); for (i=0;iline_mode==MG_RIBPOLYGON) mgrib_drawPline(p1,p2); if (_mgribc->line_mode==MG_RIBCYLINDER) mgrib_drawCline(p1,p2); if (_mgribc->line_mode==MG_RIBPRMANLINE) NotImplemented("MG_RIBPRMANLINE"); } void mgrib_drawPline(HPoint3 *p1, HPoint3 *p2) { Transform V; Transform P2S,O2S, O2P, S2O; int xsize, ysize; HPoint3 pnts[4]; Point3 s1, s2; int i; float dx,dy,k, len; /* This code will simulate line drawing in Photorman */ /* create obj->proj transform */ CamView(_mgc->cam, V); /* world->proj */ TmConcat(_mgc->xstk->T, V, O2P); /* obj->proj */ /* create obj->screen transform */ WnGet(_mgc->win, WN_XSIZE, &xsize); WnGet(_mgc->win, WN_YSIZE, &ysize); TmScale(P2S, (float)xsize, (float)ysize, 1.0); TmConcat(O2P, P2S, O2S); /* translate & dehomogenize line endpoints from object to screen */ HPt3TransPt3(O2S, p1, &s1); HPt3TransPt3(O2S, p2, &s2); dy = s2.y - s1.y; dx = s2.x - s1.x; len = hypot(dy,dx); k = _mgc->astk->ap.linewidth / len; pnts[0].x = s1.x -dy * k; pnts[0].y = s1.y +dx * k; pnts[1].x = s1.x +dy * k; pnts[1].y = s1.y -dx * k; pnts[2].x = s2.x +dy * k; pnts[2].y = s2.y -dx * k; pnts[3].x = s2.x -dy * k; pnts[3].y = s2.y +dx * k; pnts[0].z = s1.z; pnts[1].z = s1.z; pnts[2].z = s2.z; pnts[3].z = s2.z; for (i=0; i<4; ++i) pnts[i].w = 1.0; /* now project back... */ /* first, find S2O transform */ TmInvert(O2S, S2O); /* now transform screen coords to object coords */ /* DRAW HERE */ mrti(mr_polygon, mr_P, mr_buildarray, 4*3, mr_NULL); for (i=0;i<4;i++) { HPoint3 pt; HPt3Transform(S2O, &pnts[i], &pt); HPt3Dehomogenize(&pt, &pt); mrti(mr_subarray3, &pt, mr_NULL); } } void mgrib_drawCline(HPoint3 *p1, HPoint3 *p2) { Pt3Coord angle,length; Point3 t,axis; Point3 start, end; HPoint3 Hstart, Hend; static float unitz[3] = {0.0, 0.0, 1.0}; float radius = 0.004; float size; int bounded(Point3 *p); HPt3Dehomogenize(p1, &Hstart); HPt3Dehomogenize(p2, &Hend); start.x = Hstart.x; start.y = Hstart.y; start.z = Hstart.z; end.x = Hend.x; end.y = Hend.y; end.z = Hend.z; if (! Pt3Equal(&start,&end)) { size = radius*_mgc->astk->ap.linewidth; Pt3Sub(&end,&start,&t); length = Pt3Length(&t); Pt3Cross((Point3*)(void *)unitz,&t,&axis); Pt3Unit(&t); angle = Pt3Dot((Point3*)(void *)unitz,&t); angle = acos(angle); mrti(mr_transformbegin, mr_NULL); if (bounded(&start)) mrti(mr_translate, mr_float, start.x, mr_float, start.y, mr_float, start.z, mr_NULL); if ( (t.x == 0.0) && (t.y == 0.0) && (t.z < 0.0)) { /* if along negative z axis cross product is 0 but rotation by 180 degrees is necessary (angle is computed correctly) */ axis.y = 1.0; } if (bounded(&axis)) mrti(mr_rotate, mr_float, DEGREES(angle), mr_float, axis.x, mr_float, axis.y, mr_float, axis.z, mr_NULL); if (length < MAXCLINE) mrti(mr_cylinder, mr_float, size, mr_float, 0., mr_float, length, mr_float, 360., mr_NULL); mrti(mr_transformend, mr_NULL); } } int bounded(p) Point3 *p; { if (! Pt3Equal(p,&Pt3Origin)) { if (p->x < MAXCLINE && p->y < MAXCLINE && p->z < MAXCLINE) return 1; } return 0; } /*----------------------------------------------------------------------- * Function: mgrib_polyline * Description: draws a Polyline * Author: wisdom * Date: Fri Jan 17 14:31:06 CST 1992 * Notes: see mg.doc */ void mgrib_polyline( int nv, HPoint3 *v, int nc, ColorA *c, int wrapped ) { ColorA *color; mrti(mr_attributebegin, mr_surface, mr_constant, mr_NULL); if (nc==0) mrti(mr_color, mr_parray, 3, &_mgc->astk->mat.edgecolor, mr_NULL); if (nc==1) { mrti(mr_color, mr_parray, 3, c, mr_NULL); if (_mgc->astk->ap.flag & APF_TRANSP && !(_mgc->astk->mat.override & MTF_ALPHA)) mrti(mr_opacity, mr_array, 3, c->a, c->a, c->a, mr_NULL); } if (nv == 1) { mgrib_drawpoint(v); } else { if (wrapped & 1) { if (nc > 1) { color = c + nc - 1; mrti(mr_color, mr_parray, 3, color, mr_NULL); } mgrib_drawline(v + nv - 1,v); } while(--nv > 0) { if (nc > 1) { color = c++; mrti(mr_color, mr_parray, 3, color, mr_NULL); } mgrib_drawline(v,(v+1)); v++; } } mrti(mr_attributeend, mr_NULL); } /*----------------------------------------------------------------------- * Function: mgrib_drawpoint * Description: draws a point for rman. * Returns: nothing * Author: wisdom * Date: Fri Mar 13 15:04:01 CST 1992 * Notes: */ void mgrib_drawpoint(HPoint3 *p) { float radius = 0.004; float size = radius*_mgc->astk->ap.linewidth; #if 0 /* Somehow the Points directive doesn't work well, the scaling is * quite strange */ HPoint3 tmp; HPt3Dehomogenize(p, &tmp); size *= 20.0; mrti(mr_points, mr_P, mr_parray, 3, &tmp, mr_width, mr_parray, 1, &size, mr_NULL); #else /* To have a chance to get a visible point we have to rescale the * radius by the distance from the camera. Same holds, in principle, * for lines. */ if (_mgribc->persp && _mgc->space == TM_EUCLIDEAN) { HPoint3 p_cam; float len; HPt3Transform(_mgc->xstk->T, p, &p_cam); HPt3Transform(_mgc->W2C, &p_cam, &p_cam); len = sqrt(HPt3R30Dot(&p_cam, &p_cam)); size *= len / _mgribc->focallen; } mrti(mr_transformbegin, mr_NULL); mrti(mr_translate, mr_float, p->x, mr_float, p->y, mr_float, p->z, mr_NULL); mrti(mr_sphere, mr_float, size, mr_float, size, mr_float, -size, mr_float, 360., mr_NULL); mrti(mr_transformend, mr_NULL); #endif } /*----------------------------------------------------------------------- * Function: mgrib_polylist * Description: draws a Polylist: linked list of Polys * Author: wisdom * Date: Wed Jan 22 16:07:03 CST 1992 * Notes: see mg.doc */ void mgrib_polylist( int np, Poly *P, int nv, Vertex *V, int plflags ) { Appearance *ap; int i,j; Poly *p; Vertex **v, *vp; HPoint3 hpt; int flag,shading,matover; Color *color; ap = &_mgc->astk->ap; flag = ap->flag; shading = ap->shading; matover = _mgc->astk->mat.override; switch(shading) { case APF_FLAT: plflags &= ~PL_HASVN; if (plflags & PL_HASPCOL) { plflags &= ~PL_HASVCOL; } break; case APF_SMOOTH: plflags &= ~PL_HASPN; break; case APF_VCFLAT: plflags &= ~PL_HASVN; break; default: plflags &= ~(PL_HASVN|PL_HASPN); break; } if ((matover & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) { plflags &= ~(PL_HASVCOL | PL_HASPCOL); } if (flag & APF_FACEDRAW) { mrti(mr_attributebegin, mr_NULL); for (p = P, i = 0; i < np; i++, p++) { /* per polygon color */ if (plflags & PL_HASPCOL) { mrti(mr_color, mr_parray, 3, &p->pcol, mr_NULL); /* then per-polygon transparency, if defined */ if (flag & APF_TRANSP && !(matover & MTF_ALPHA)) { mrti(mr_opacity, mr_array, 3, p->pcol.a, p->pcol.a, p->pcol.a, mr_NULL); } } switch (p->n_vertices) { case 1: v = p->v; mrti(mr_attributebegin, mr_NULL); if (plflags & PL_HASVCOL) mrti(mr_color, mr_parray, 3, &(*v)->vcol, mr_NULL); if (plflags & PL_HASST) mrti(mr_st, mr_parray, 2, &(*v)->st, mr_NULL); mrti(mr_surface, mr_constant, mr_opacity, mr_array, 3, 1., 1., 1., mr_NULL); mgrib_drawpoint((HPoint3 *)(*v)); mrti(mr_attributeend, mr_NULL); break; case 2: v = p->v; mrti(mr_attributebegin, mr_NULL); if (plflags & PL_HASVCOL) mrti(mr_color, mr_parray, 3, &(*v)->vcol, mr_NULL); mrti(mr_surface, mr_constant, mr_opacity, mr_array, 3, 1., 1., 1., mr_NULL); mgrib_drawline((HPoint3 *)*v,(HPoint3*)*(v+1)); mrti(mr_attributeend, mr_NULL); break; default: mrti(mr_polygon, mr_NULL); /* do points */ mrti(mr_P, mr_buildarray, p->n_vertices*3, mr_NULL); for (j=0, v=p->v; j < p->n_vertices; j++, v++) { HPt3Dehomogenize(&(*v)->pt, &hpt); mrti(mr_subarray3, &hpt, mr_NULL); } /* colors, if supplied */ if (plflags & PL_HASVCOL) { mrti(mr_Cs, mr_buildarray, p->n_vertices*3, mr_NULL); for (j=0, v=p->v; j < p->n_vertices; j++, v++) { mrti(mr_subarray3, &(*v)->vcol, mr_NULL); } /* then per-vertex transparency, if defined */ if (flag & APF_TRANSP && !(matover & MTF_ALPHA)) { mrti(mr_Os, mr_buildarray, p->n_vertices*3, mr_NULL); for (j=0, v=p->v; j < p->n_vertices; j++, v++) { float opacity[3]; opacity[0]=opacity[1]=opacity[2]=(*v)->vcol.a; mrti(mr_subarray3, opacity, mr_NULL); } } } /* now normals, if supplied */ if (plflags & PL_HASVN) { mrti(mr_N, mr_buildarray, p->n_vertices*3, mr_NULL); for (j=0, v=p->v; j < p->n_vertices; j++, v++) { mrti(mr_subarray3, &((*v)->vn), mr_NULL); } } else if (plflags & PL_HASPN) { mrti(mr_N, mr_buildarray, p->n_vertices*3, mr_NULL); for (j=0, v=p->v; j< p->n_vertices; j++, v++) { mrti(mr_subarray3, &(p->pn), mr_NULL); } } /* Texture support, to some extend. We dump all (different) * texture images to files, enumerated by a sequence * number. Then we insert for each image a line ``MakeTexture "ourfile" "ribtxfile" "periodic" "clamp" "gaussian" 1.0 1.0'' * in front of WorldBegin (unluckily all textures must be * defined before the call to WorldBegin, meaning the * RIB-command). * * We do all the clamping and transformation ourselves. FIXME: * is there as texture transformation in the RenderMan shading * language?? */ if ((ap->flag & (APF_TEXTURE|APF_FACEDRAW)) == (APF_TEXTURE|APF_FACEDRAW) && _mgc->astk->ap.tex != NULL && (plflags & PL_HASST)) { Transform T; Texture *tex = _mgc->astk->ap.tex; TxST stT; TmConcat(tex->tfm, _mgc->txstk->T, T); mrti(mr_st, mr_buildarray, p->n_vertices*2, mr_NULL); for (j = 0, v = p->v; j < p->n_vertices; j++, v++) { TxSTTransform (T, &(*v)->st, &stT); stT.t = 1.0 - stT.t; mrti(mr_subarray2, (float *)&stT, mr_NULL); } } break; } } mrti(mr_attributeend, mr_NULL); } if (flag & APF_EDGEDRAW) { color = &_mgc->astk->ap.mat->edgecolor; mrti(mr_attributebegin, mr_surface, mr_constant, mr_color, mr_parray, 3, color, mr_opacity, mr_array, 3, 1., 1., 1., mr_NULL); for (p = P, i = 0; i < np; i++, p++) { for (j=0, v=p->v; j < (p->n_vertices-1); j++, v++) { mgrib_drawline((HPoint3 *)*v,(HPoint3*)*(v+1)); } mgrib_drawline((HPoint3 *)*v,(HPoint3 *)*(p->v)); } mrti(mr_attributeend,mr_NULL); } if (flag & APF_NORMALDRAW) { /* since mg_drawnormal handles attributes and stacking, we do * nothing here */ if (plflags & PL_HASPN) { for (p = P, i = 0; i < np; i++, p++) { for (j=0, v=p->v; j < p->n_vertices; j++, v++) { mgrib_drawnormal(&(*v)->pt, &p->pn); } } } else if (plflags & PL_HASVN) { for (vp = V, i = 0; i < nv; i++, vp++) { mgrib_drawnormal(&vp->pt, &vp->vn); } } } } /* There is a basic problem now with 4-d points and 3-d normal vectors. For now, we'll just ignore the 4-th coordinate of the point when computing the tip of the normal vector. This will work OK with all existing models, but for genuine 4-d points it won't work. But, come to think of it, what is the correct interpretation of the normal vector when the points live in 4-d? */ void mgrib_drawnormal(HPoint3 *p, Point3 *n) { HPoint3 end, tp; float scale; Color *color; if (p->w <= 0.0) return; scale = p->w * _mgc->astk->ap.nscale; end.x = p->x + scale*n->x; end.y = p->y + scale*n->y; end.z = p->z + scale*n->z; end.w = p->w; color = &_mgc->astk->mat.normalcolor; mrti(mr_attributebegin, mr_surface, mr_constant, mr_color, mr_parray, 3, color, mr_opacity, mr_array, 3, 1., 1., 1., mr_NULL); mgrib_drawline(&tp,&end); mrti(mr_attributeend, mr_NULL); } void mgrib_bezier(int du, int dv, int dimn, float *CtrlPnts, TxST *txmapst, ColorA *c) { int i, ip, nu, nv; static float *uknot=NULL, *vknot=NULL; static size_t ulen=0,vlen=0; size_t nulen=0, nvlen=0; int flag = _mgc->astk->ap.flag; int matover = _mgc->astk->mat.override; du += 1; dv += 1; nu = du; nv = dv; ip = nu * nv * dimn; if (!uknot) { ulen=nu+du; uknot=(float *)malloc(ulen*sizeof(float)); } if (!vknot) { vlen=nv+dv; vknot=(float *)malloc(vlen*sizeof(float)); } nulen=nu+du; nvlen=nv+dv; if (nulen>ulen) uknot=(float *)realloc(uknot,(ulen=nulen)*sizeof(float)); if (nvlen>vlen) vknot=(float *)realloc(vknot,(vlen=nvlen)*sizeof(float)); /* uknot = (float *)malloc((nu+du)*sizeof(float)); */ for (i=0;iastk->flags & MGASTK_SHADER)) ) { mrti(mr_Cs, mr_buildarray, 12, mr_NULL); for (i = 0; i < 4; i++) { mrti(mr_subarray3, (float *)&c[i], mr_NULL); } if (flag & APF_TRANSP && !(matover & MTF_ALPHA)) { float opacity[3]; opacity[0]=opacity[1]=opacity[2]=c[i].a; mrti(mr_Os, mr_buildarray, 12, mr_NULL); for (i = 0; i < 4; i++) { mrti(mr_subarray3, opacity, mr_NULL); } } } if ((_mgc->astk->ap.flag & (APF_TEXTURE|APF_FACEDRAW)) == (APF_TEXTURE|APF_FACEDRAW) && _mgc->astk->ap.tex != NULL && txmapst) { Transform T; Texture *tex = _mgc->astk->ap.tex; TxST stT; int j; TmConcat(tex->tfm, _mgc->txstk->T, T); mrti(mr_nl, mr_st, mr_buildarray, 8, mr_NULL); for (j = 0; j < 4; j++) { TxSTTransform(T, &txmapst[j], &stT); stT.t = 1.0 - stT.t; mrti(mr_subarray2, &stT, mr_NULL); } } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/rib/mgribmesh.c0000644000175000001440000001431010611520152015111 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgribP.h" #include "mgribtoken.h" #define HAS_N 0x1 #define HAS_C 0x2 #define HAS_SMOOTH 0x4 #define VI_TUPLET_LIMIT 2 /* for sgi vi formatting (so we can use it!) */ static void mgrib_submesh( int wrap, int nu, int nv, HPoint3 *P, Point3 *N, Point3 *NQ, ColorA *C, TxST *ST, int mflags ); static void mgrib_prmanmesh( int wrap, int nu, int nv, HPoint3 *P ); int mgrib_mesh(int wrap, int nu, int nv, HPoint3 *P, Point3 *N, Point3 *NQ, ColorA *C, TxST *ST, int mflags) { Appearance *ap; Color *c3; Point3 *n; HPoint3 *p; int u; ap = &_mgc->astk->ap; if (ap->flag & APF_FACEDRAW) { mgrib_submesh( wrap, nu, nv, P, N, NQ, C, ST, mflags); } if (ap->flag & APF_EDGEDRAW) { /* must draw edges manually */ c3 = &ap->mat->edgecolor; mrti(mr_attributebegin, mr_color, mr_parray, 3, c3, mr_opacity, mr_array, 3, 1., 1., 1., mr_surface, mr_constant, mr_NULL); mgrib_prmanmesh( wrap, nu, nv, P); mrti(mr_attributeend,mr_NULL); } if ((ap->flag & APF_NORMALDRAW) && N!=NULL) { p = P; n = N; for (u = nu*nv; --u >= 0; ) mgrib_drawnormal(p++, n++); } return 1; } static void mgrib_submesh( int wrap, int nu, int nv, HPoint3 *P, Point3 *N, Point3 *meshNQ, ColorA *C, TxST *ST, int mflags ) { Appearance *ap; char *uwrap,*vwrap; int i; HPoint3 *p; Point3 *n; TxST *st; ColorA *c; int nunv; int viflag = 0; /* used to insert \n into RIB file so lines */ /* won't be too long for 'vi' to work well */ nunv = nu * nv; p = P; n = N; c = C; st = ST; ap = &_mgc->astk->ap; uwrap = (wrap & MM_UWRAP) ? "periodic" : "nonperiodic"; vwrap = (wrap & MM_VWRAP) ? "periodic" : "nonperiodic"; mrti(mr_attributebegin, mr_NULL); /* THIS SHOULD BE AT A HIGHER LEVEL mgrib_print("ShadingInterpolation "); if (ap->shading & APF_SMOOTH) mgrib_print("\"smooth\"\n"); else mgrib_print("\"constant\"\n"); */ mrti(mr_patchmesh, mr_string, "bilinear", mr_int, nu, mr_string, uwrap, mr_int, nv, mr_string, vwrap, mr_P, mr_buildarray, 3*nunv, mr_NULL); for (i=0; i=VI_TUPLET_LIMIT) { viflag=0; /* wrap lines so they won't be too long for vi */ mrti(mr_nl, mr_NULL); } } /* use normals if supplied; flat shading, constant shading and * csmooth shading do not need normals */ if (N != NULL && ap->shading == APF_SMOOTH) { viflag = 0; mrti(mr_N, mr_buildarray, 3*nunv, mr_NULL); for (i=0; i=VI_TUPLET_LIMIT) { viflag = 0; mrti(mr_nl, mr_NULL); } } } /* use colors if supplied and not overridden */ if (C && !((ap->mat->override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER))) { viflag = 0; mrti(mr_Cs, mr_buildarray, 3*nunv, mr_NULL); for (i=0; i=VI_TUPLET_LIMIT) { viflag = 0; mrti(mr_nl, mr_NULL); } } /* transparancy */ if (ap->flag & APF_TRANSP) { c = C; mrti(mr_Os, mr_buildarray, 3*nunv, mr_NULL); for (i=0; i=VI_TUPLET_LIMIT) { viflag = 0; mrti(mr_nl, mr_NULL); } } } } /* Texture support, to some extend. We dump all (different) * texture images to files, enumerated by a sequence number. Then * we insert for each image a line * * ``MakeTexture "ourfile" "ribtxfile" "none" "none" "gaussian" 1.0 1.0'' * * in front of WorldBegin (unluckily all texture must be defined * before the call to WorldBegin, meaning the RIB-command). * * We do all the clamping and transformation ourselves. FIXME: is * there as texture transformation in the RenderMan shading * language?? */ if ((ap->flag & (APF_TEXTURE|APF_FACEDRAW)) == (APF_TEXTURE|APF_FACEDRAW) && _mgc->astk->ap.tex != NULL && ST) { Transform T; Texture *tex = _mgc->astk->ap.tex; TxST stT; TmConcat(tex->tfm, _mgc->txstk->T, T); viflag = 0; mrti(mr_st, mr_buildarray, 2*nunv, mr_NULL); for (i=0; i=VI_TUPLET_LIMIT) { viflag=0; mrti(mr_nl, mr_NULL); } } } mrti(mr_attributeend, mr_NULL); } static void mgrib_prmanmesh( int wrap, int nu, int nv, HPoint3 *P ) { int u, v, prevu, prevv; for (v=0; v #include "mg.h" #include "mgP.h" #include "mgrib.h" #include "mgribtoken.h" #include "transform.h" #include "bezierP.h" #define DEFAULT_RIB_FILE "geom.rib" typedef struct mgribcontext { struct mgcontext mgctx; /* The mgcontext */ bool born; /* Has window been displayed on the screen? */ int win; /* window ID, or 0 */ int world; /* inc/decremented by worldbegin()/end() */ int persp; /* camera projection */ float focallen; /* focallen */ enum { RMD_ASCII, RMD_BINARY } render_device; /* Device Options */ /* Which line drawing technique? * MG_RIBPOLYGON for creating RIB tokens true to OOGL/geomview, but may appear * incorrect when viewed dynamically * MG_RIBCYLINDER for creating RIB tokens which may be dynamically viewed, but * may not be true to OOGL/geomview * MG_RIBPRMANLINE for NeXT Renderer - May Cause Incompatibilities! * Note: Future versions of renderman should support line drawing, NeXT does * now. */ enum line_mode { RM_POLYGON = MG_RIBPOLYGON, RM_CYLINDER = MG_RIBCYLINDER, RM_PRMANLINE = MG_RIBPRMANLINE } line_mode; /* MG_RIBFRAME: render to framebuffer (screen window) * MG_RIBTIFF: render to file */ enum display { RM_FRAME = MG_RIBFRAME, RM_RIBTIFF = MG_RIBTIFF } display; FILE *rib; bool rib_close; /* set to true if we have opened rib ourselves */ char displayname[PATH_MAX]; /* if display == MG_RIFILE, name of the file */ char displaypath[PATH_MAX]; /* dirname(display), if MG_RIFILE */ char displaybase[PATH_MAX]; /* basename(display), if MG_RIFILE */ const char *tmppath; /* MG_RIBDOBG: simulate colored background w/ polygon * MG_RIBNOBG: no background simulation (defualt) */ enum backing { RB_DOBG = MG_RIBDOBG, RB_NOBG = MG_RIBNOBG } backing; /* MG_RIBSTDSHADE: uses standard shader * MG_RIBEXTSHADE: uses extended shaders (eplastic, * heplastic, hplastic) * * + the shaders needed to support Geomview's texture model * (modulate/decal/blend), including alpha channel support. */ enum shader { RM_STDSHADE = MG_RIBSTDSHADE, RM_EXTSHADE = MG_RIBEXTSHADE } shader; char *shadepath; /* path to extended shaders or user shaders */ char ribscene[128]; /* scene name for RIB 1.0 file comments */ char ribcreator[128]; /* creator field for RIB 1.0 file comments */ /* defaults to "mgrib driver" */ char ribfor[128]; /* for(user) field for RIB 1.0 file comments */ /* defaults to user account name */ char ribdate[128]; /* creation date, defualts to today's date */ Texture **tx ; /* array of textures used; texture images are * dumped to disk with * displayname.#seq.tiff. Textures are * considered equal (for this purpose) if they * refer to the same image and have the same * clamping settings (we leave the clamping to * MakeTexture, that is the reason). */ int n_tximg; /* How many of them */ int n_txdumped; /* How many already got their MakeTexture line */ TokenBuffer worldbuf; /* buffer for everything except MakeTexture */ TokenBuffer txbuf; /* buffer for MakeTexture */ } mgribcontext; /* Make some convenient defines */ #define RiDEV _mgribc->render_device #define NotImplemented(name) fprintf(stderr,"%s is not yet implemented.\n",name); #define _mgribc ((mgribcontext*)_mgc) #define RI_INFINITY 1.0e38 void mgrib_printmatrix(Transform T); void mgrib_drawline(HPoint3 *p1, HPoint3 *p2); void mgrib_drawpoint(HPoint3 *p); void mgrib_drawnormal(HPoint3 *p, Point3 *n); static inline void mgrib_mktexname(char *txname, int seq, const char *path, const char *suffix) { if (snprintf(txname, PATH_MAX, "%s%s%s-tx%d.%s", path ? path : "", path ? "/" : "", _mgribc->displaybase, seq, suffix) >= PATH_MAX) { OOGLError(1, "path to texture-file exceedsd maximum length %d", PATH_MAX); } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/rib/mgributil.c0000644000175000001440000000303010455701006015134 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgribP.h" #include "transform.h" #include "mgribtoken.h" #include /*----------------------------------------------------------------------- * Function: mgrib_printmatrix * Description: prints rib binding for given matrix * Returns: nothing * Author: wisdom * Date: Thu Aug 26 13:39:21 CDT 1993 * Notes: */ void mgrib_printmatrix(Transform T) { mrti(mr_concattransform, mr_parray, 16, T, mr_NULL); } geomview-1.9.4/src/lib/mg/rib/mgrib.c0000644000175000001440000007746110622716756014277 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mg.h" #include "mgP.h" #include "mgribP.h" #include "mgribshade.h" #include "mgribtoken.h" #include "window.h" #include #include #include #include #include #ifdef HAVE_LIBGEN_H # include #endif #include #include #include mgcontext * mgrib_ctxcreate(int a1, ...); int mgrib_ctxset( int a1, ... ); int mgrib_feature( int feature ); void mgrib_ctxdelete( mgcontext *ctx ); int mgrib_ctxget( int attr, void* valueptr ); int mgrib_ctxselect( mgcontext *ctx ); void mgrib_sync( void ); void mgrib_worldbegin( void ); void mgrib_worldend( void ); void mgrib_reshapeviewport( void ); void mgrib_identity( void ); void mgrib_transform( Transform T ); int mgrib_pushtransform( void ); int mgrib_poptransform( void ); void mgrib_settransform( Transform T ); int mgrib_pushappearance( void ); int mgrib_popappearance( void ); const Appearance *mgrib_setappearance(const Appearance* app, int merge); int mgrib_setcamera( Camera* cam ); mgribcontext *mgrib_newcontext( mgribcontext *ctx ); extern void mgrib_polygon(); extern void mgrib_mesh(); extern void mgrib_line(); extern void mgrib_polyline(); extern void mgrib_polylist(); extern void mgrib_bezier(); int _mgrib_ctxset(int a1, va_list *alist); WnWindow *mgribwindow(WnWindow *win); struct mgfuncs mgribfuncs = { MGD_RIB, mgdevice_RIB, mgrib_feature, (mgcontext *(*)())mgrib_ctxcreate, mgrib_ctxdelete, (int (*)())mgrib_ctxset, mgrib_ctxget, mgrib_ctxselect, mgrib_sync, mgrib_worldbegin, mgrib_worldend, mgrib_reshapeviewport, /* geometry transform */ mgrib_settransform, mg_gettransform, /* Generic */ mgrib_identity, mgrib_transform, mgrib_pushtransform, mgrib_poptransform, /* texture transform */ mg_settxtransform, mg_gettxtransform, mg_txidentity, mg_txtransform, mg_pushtxtransform, mg_poptxtransform, /* appearance stack */ mgrib_pushappearance, mgrib_popappearance, mgrib_setappearance, mg_getappearance, /********************/ mgrib_setcamera, mgrib_polygon, mgrib_polylist, mgrib_mesh, mgrib_line, mgrib_polyline, mg_quads, mgrib_bezier, mg_bsptree, mg_tagappearance, mg_untagappearance, mg_taggedappearance }; mgribcontext *_MGRIB_; /* For debugging */ int mgdevice_RIB() { _mgf = mgribfuncs; if (_mgc != NULL && _mgc->devno != MGD_RIB) _mgc = NULL; return(0); } /*----------------------------------------------------------------------- * Function: mgrib_ctxcreate * Date: Thu Jul 18 18:55:18 1991 * Author: mbp * Notes: see mg.doc for rest of spec */ mgcontext * mgrib_ctxcreate(int a1, ...) { va_list alist; time_t timedate = (time_t)time(0); _mgc = (mgcontext*)(_MGRIB_ = mgrib_newcontext( OOGLNewE(mgribcontext, "mgrib_ctxcreate") )); /* Ensure some sensible default Window */ WnSet(_mgc->win, WN_XSIZE, 450, WN_YSIZE, 450, WN_END); /* Default RIB1.0 structure info */ sprintf(_mgribc->ribscene, "Generic RIB file"); sprintf(_mgribc->ribcreator, "mgrib driver"); sprintf(_mgribc->ribfor, getenv("USER")); sprintf(_mgribc->ribdate, ctime(&timedate)); _mgribc->ribdate[24] = '\0'; /* remove the line feed */ _mgribc->world = 0; va_start(alist, a1); if (_mgrib_ctxset(a1, &alist) == -1) { mgrib_ctxdelete(_mgc); } va_end(alist); return _mgc; } /*----------------------------------------------------------------------- * Function: _mgrib_ctxset * Description: internal ctxset routine * Args: a1: first attribute * *alist: rest of attribute-value list * Returns: -1 on error, 0 on success * Author: mbp * Date: Fri Sep 20 11:08:13 1991 * Notes: mgrib_ctxcreate() and mgrib_ctxset() call this to actually * parse and interpret the attribute list. */ int _mgrib_ctxset(int a1, va_list *alist) { int attr; FILE *ribfile = NULL; const char *ribdpy = NULL; struct stat st; char *dot; /* secure copy to fixed-length string */ #undef strNcpy #define strNcpy(dst, src) \ strncpy((dst), (src), sizeof(dst)); (dst)[sizeof(dst)-1] = '\0' for (attr = a1; attr != MG_END; attr = va_arg (*alist, int)) { switch (attr) { case MG_ApSet: { Appearance *ap; ap = _ApSet(NULL, va_arg(*alist, int), alist); mgrib_setappearance(ap, MG_MERGE); ApDelete(ap); break; } case MG_WnSet: _WnSet( _mgc->win, va_arg(*alist, int), alist); break; case MG_CamSet: _CamSet( _mgc->cam, va_arg(*alist, int), alist); break; case MG_APPEAR: mgsetappearance(va_arg(*alist, Appearance *), MG_SET); break; case MG_WINDOW: if (_mgc->win) WnDelete(_mgc->win); _mgc->win = va_arg(*alist, WnWindow*); RefIncr((Ref*) (_mgc->win)); break; case MG_CAMERA: mgrib_setcamera( va_arg(*alist, Camera*) ); break; case MG_SETOPTIONS: _mgc->opts |= va_arg(*alist, int); case MG_UNSETOPTIONS: _mgc->opts &= ~va_arg(*alist, int); break; case MG_SHOW: _mgc->shown = va_arg(*alist, int); break; case MG_PARENT: _mgc->parent = va_arg(*alist, mgcontext*); break; case MG_BACKGROUND: _mgc->background = *va_arg(*alist, ColorA*); break; case MG_ZNUDGE: /* for now, read nothing */ (void)va_arg(*alist, double); break; case MG_SPACE: _mgc->space = va_arg(*alist, int); break; case MG_NDCTX: _mgc->NDctx = va_arg(*alist, mgNDctx *); break; /* kind of RIB-specific */ case MG_RIBFILE: /* if(_mgribc->rib) fclose(_mgribc->rib); */ ribfile = va_arg(*alist, FILE*); break; /* really RIB-specific */ case MG_RIBLINEMODE: _mgribc->line_mode = (enum line_mode)va_arg(*alist, int); break; case MG_RIBFORMAT: switch( va_arg(*alist, int) ) { case MG_RIBASCII: _mgribc->render_device = RMD_ASCII; break; case MG_RIBBINARY: _mgribc->render_device = RMD_BINARY; break; } break; case MG_RIBDISPLAY: _mgribc->display = (enum display)va_arg(*alist, int); break; case MG_RIBDISPLAYNAME: ribdpy = va_arg(*alist, char*); break; case MG_RIBBACKING: _mgribc->backing = (enum backing)va_arg(*alist, int); break; case MG_RIBSHADER: _mgribc->shader = (enum shader)va_arg(*alist, int); break; case MG_RIBSCENE: strNcpy(_mgribc->ribscene, va_arg(*alist, char*)); break; case MG_RIBCREATOR: strNcpy(_mgribc->ribcreator, va_arg(*alist, char*)); break; case MG_RIBFOR: strNcpy(_mgribc->ribfor, va_arg(*alist, char*)); break; case MG_RIBDATE: strNcpy(_mgribc->ribdate, va_arg(*alist, char*)); break; default: OOGLError(0, "_mgrib_ctxset: undefined option: %d\n", attr); return -1; } } if (ribfile != NULL && ribdpy == NULL) { OOGLError(0, "_mgrib_ctxset: must not specify a file without a displayname"); return -1; } if (ribdpy != NULL) { bool rfopened = false; if (ribfile == NULL) { ribfile = fopen(ribdpy, "w+"); rfopened = true; } if (ribfile == NULL) { OOGLError(0, "_mgrib_ctxset: unable to open file for rib display \"%s\"", ribdpy); return -1; } if (fstat(fileno(ribfile), &st) < 0) { OOGLError(0, "_mgrib_ctxset: unable to stat file for rib display \"%s\"", ribdpy); if (rfopened) { fclose(ribfile); } return -1; } /* ok, now insert the stuff into the context */ if (_mgribc->rib && _mgribc->rib_close) { fclose(_mgribc->rib); } _mgribc->rib = ribfile; strNcpy(_mgribc->displayname, ribdpy); } /* Now decide where to put texture data (anything else?) * * If ribfile is a regular file, then we asssume that * dirname(ribdpy) is its path-component; texture data goes there, * under the name basename(ribdpy)-txSEQ.tiff, where "SEQ" is an * ever increasing number (during the life-time of the context). * * If ribfile is not a regular file and dirname(ribdpy) equals ".", * then texture data goes to /tmp or ${TMPDIR}, in order not to * bloat the current directory which piping data around. * * If dirname(ribdpy) != ".", but dirname(ribdpy) does not exist, * then we loose. So what. */ /* Extract the path-component from displayname */ strcpy(_mgribc->displaypath, _mgribc->displayname); strcpy(_mgribc->displaypath, dirname(_mgribc->displaypath)); if (!S_ISREG(st.st_mode) && strcmp(_mgribc->displaypath, ".") == 0) { strNcpy(_mgribc->displaypath, _mgribc->tmppath); } /* If displayname really is a path-name, then include only its * basename component into the rib-output. Otherwise one has to edit * the RIB-file each time one moves it around. */ strcpy(_mgribc->displaybase, _mgribc->displayname); strcpy(_mgribc->displaybase, basename(_mgribc->displaybase)); /* Strip the suffix; the RIB-file will contain displaybase.tiff, * texturenames will be generated as displaybase-SEQ.tiff, where SEQ * is an ever increasing number. */ if ((dot = strrchr(_mgribc->displaybase, '.')) != NULL && (strcmp(dot, ".tiff") == 0 || strcmp(dot, ".rib") == 0)) { *dot = '\0'; } /* Finished. The displayname emitted to the RIB file now will always * be without path-component. */ if (_mgc->shown && !_mgribc->born) { /* open the window */ mgribwindow(_mgc->win); /* rib state is *not* in accordance with appearance state: don't set the appearance until worldbegin time */ } return 0; } /*----------------------------------------------------------------------- * Function: mgrib_ctxget * Description: get a context attribute value * Args: attr: the attribute to get * value: place to write attr's value * Returns: 1 for success; -1 if attr is invalid * Author: mbp * Date: Fri Sep 20 11:50:25 1991 * Notes: */ int mgrib_ctxget(int attr, void* value) { #define VALUE(type) ((type*)value) switch (attr) { /* Attributes common to all MG contexts: */ case MG_APPEAR: *VALUE(Appearance*) = &(_mgc->astk->ap); break; case MG_CAMERA: *VALUE(Camera*) = _mgc->cam; break; case MG_WINDOW: if(_mgribc->born) { /* IT DOESN'T MAKE SENSE TO DO THIS, DOES IT? */ } *VALUE(WnWindow*) = _mgc->win; break; case MG_PARENT: *VALUE(mgcontext*) = _mgc->parent; break; case MG_SETOPTIONS: case MG_UNSETOPTIONS: *VALUE(int) = _mgc->opts; break; case MG_BACKGROUND: *VALUE(ColorA) = _mgc->background; break; case MG_ZNUDGE: /* not implemented now */ *VALUE(int) = 0; case MG_SPACE: *VALUE(int) = _mgc->space; break; case MG_NDCTX: *VALUE(mgNDctx *) = _mgc->NDctx; break; /* Attributes specific to RIB contexts: */ case MG_RIBWINID: *VALUE(int) = _mgribc->win; break; case MG_RIBFILE: *VALUE(FILE*) = _mgribc->rib; break; /* Attributes really specific to RI contexts: */ case MG_RIBLINEMODE: *VALUE(int) = _mgribc->line_mode; break; case MG_RIBFORMAT: switch (_mgribc->render_device) { case RMD_ASCII: *VALUE(int) = MG_RIBASCII; break; case RMD_BINARY: *VALUE(int) = MG_RIBBINARY; break; } break; case MG_RIBDISPLAY: *VALUE(int) = _mgribc->display; break; case MG_RIBDISPLAYNAME: *VALUE(char *) = _mgribc->displayname; break; case MG_RIBBACKING: *VALUE(int) = _mgribc->backing; break; case MG_RIBSHADER: *VALUE(int) = _mgribc->shader; break; case MG_RIBSCENE: *VALUE(char *) = _mgribc->ribscene; break; case MG_RIBCREATOR: *VALUE(char *) = _mgribc->ribcreator; break; case MG_RIBFOR: *VALUE(char *) = _mgribc->ribfor; break; case MG_RIBDATE: *VALUE(char *) = _mgribc->ribdate; break; default: OOGLError (0, "mgrib_ctxget: undefined option: %d\n", attr); return -1; } return 1; #undef VALUE } /*----------------------------------------------------------------------- * Function: mgribwindow * Description: create a RIB window * Args: *win: the WnWindow structure to realize * Returns: win if success, NULL if not * Author: wisdom, gunn * Date: Fri Sep 20 11:56:31 1991 * Notes: makes the RI calls necessary to create a RIB "window" * which is really a virtual window defining Format, Display, * etc. */ WnWindow * mgribwindow(WnWindow *win) { WnPosition wp; int xsize, ysize; char fullscene[280], fullcreator[280], fullfor[280], fulldate[280]; char dpyname[PATH_MAX]; /* RIB 1.0 structure comments */ sprintf(fullscene,"Scene %s",_mgribc->ribscene); sprintf(fullcreator,"Creator %s",_mgribc->ribcreator); sprintf(fullfor,"For %s",_mgribc->ribfor); sprintf(fulldate,"CreationDate %s",_mgribc->ribdate); mrti(mr_header,"RenderMan RIB-Structure 1.0", mr_nl, mr_header, fullscene, mr_nl, mr_header, fullcreator, mr_nl, mr_header, fulldate, mr_nl, mr_header, fullfor, mr_nl, mr_header, "Frames 1", mr_nl, /* always 1 frame*/ mr_NULL); /* options */ if(_mgribc->shader != RM_STDSHADE && _mgribc->shadepath) { mrti(mr_header, "CapabilitiesNeeded ShadingLanguage", mr_nl, mr_embed, "version 3.03", mr_nl, mr_option, mr_string, "searchpath", mr_string, "shader", mr_nl, mr_embed, "[", mr_string, _mgribc->shadepath, mr_embed, "]", mr_nl, mr_nl, mr_NULL); } else { mrti(mr_embed, "version 3.03", mr_nl, mr_nl, mr_NULL); } /* set display characteristics...*/ snprintf(dpyname, PATH_MAX, "%s%s", _mgribc->displaybase, _mgribc->display == MG_RIBTIFF ? ".tiff" : ".rib"); mrti(mr_display, mr_string, dpyname, (_mgribc->display == MG_RIBFRAME) ? mr_framebuffer : mr_file, (_mgribc->backing == MG_RIBDOBG) ? mr_rgb : mr_rgba, mr_NULL); /* window size */ WnGet(_mgc->win, WN_CURPOS, &wp); xsize = wp.xmax - wp.xmin + 1; ysize = wp.ymax - wp.ymin + 1; mrti(mr_format, mr_int, xsize, mr_int, ysize, mr_float, 1., mr_NULL); _mgribc->born = true; return win; } /*----------------------------------------------------------------------- * Function: mgrib_ctxset * Description: set some context attributes * Args: a1, ...: list of attribute-value pairs * Returns: -1 on error, 0 on success * Author: mbp * Date: Fri Sep 20 12:00:18 1991 */ int mgrib_ctxset( int a1, ... ) { va_list alist; int result; va_start( alist, a1 ); result = _mgrib_ctxset(a1, &alist); va_end(alist); return result; } /*----------------------------------------------------------------------- * Function: mgrib_feature * Description: report whether mgrib device has a particular feature * Args: feature: the feature to report on * Returns: an int giving info about feature * Author: wisdom * Date: Tue Aug 3 15:38:05 CDT 1993 * Notes: -1 means the feature is not present. * */ int mgrib_feature( int feature ) { if(feature == MGF_BEZIER) return 1; return(-1); } /*----------------------------------------------------------------------- * Function: mgrib_ctxdelete * Description: delete a GL context * Args: *ctx: context to delete * Returns: nothing * Author: slevy * Date: Tue Nov 12 10:29:04 CST 1991 * Notes: Deleting the current context leaves the current-context * pointer set to NULL. */ void mgrib_ctxdelete( mgcontext *ctx ) { /* if(_mgribc->rib) fclose(_mgribc->rib); */ if(ctx->devno != MGD_RIB) { mgcontext *was = _mgc; mgctxselect(ctx); mgctxdelete(ctx); if(was != ctx) { mgctxselect(was); } } else { if(((mgribcontext *)ctx)->shadepath) { free(((mgribcontext *)ctx)->shadepath); } if (_mgribc->tx) { OOGLFree(_mgribc->tx); } mrti_delete(&_mgribc->worldbuf); mrti_delete(&_mgribc->txbuf); mg_ctxdelete(ctx); if(ctx == _mgc) _mgc = NULL; } } /*----------------------------------------------------------------------- * Function: mgrib_ctxselect * Description: select a RIB context --- make it current * Args: *ctx: the context to become current * Returns: 0 (why ???) * Author: mbp, wisdom * Date: Fri Sep 20 12:04:41 1991 */ int mgrib_ctxselect( mgcontext *ctx ) { if(ctx == NULL || ctx->devno != MGD_RIB) { return mg_ctxselect(ctx); } _mgc = ctx; _MGRIB_ = (mgribcontext *)ctx; return(0); } /*----------------------------------------------------------------------- * Function: mgrib_sync * Description: sync * Returns: nothing * Author: wisdom * Date: Mon Aug 2 18:05:41 CDT 1993 * Notes: sync with PRMAN not necessary */ void mgrib_sync( void ) {} /*----------------------------------------------------------------------- * Function: mgrib_worldbegin * Description: prepare to draw a frame * Returns: nothing * Author: wisdom, slevy, gunn * Date: Sat Mar 7 16:28:35 GMT-0600 1992 */ void mgrib_worldbegin( void ) { static Transform cam2ri = {{1, 0,0,0}, {0,1,0,0}, {0,0,-1,0},{0,0,0,1}}; float halfxfield, halfyfield, aspect, cnear, cfar, fov; char str[256]; HPoint3 look; Point3 lookat; LtLight **lp; int i; /* first, check to see if we need to open the default rib file */ /* IT'S NOW POSSIBLE THAT THIS WON'T GET SENT TO A FILE (streams) */ /* IN WHICH CASE IT WOULD BE WRONG TO OPEN A FILE. MOVE THIS!! */ if(!_mgribc->rib) { if (mgrib_ctxset(MG_RIBDISPLAYNAME, DEFAULT_RIB_FILE, MG_END) == -1) { OOGLError(0, "mgrib_worldbeging(): unable to open default file \"%s\"", DEFAULT_RIB_FILE); } } /* interpret options...(none exist now) */ mg_worldbegin(); mg_findcam(); LM_FOR_ALL_LIGHTS( _mgc->astk->ap.lighting, i,lp ) { (*lp)->changed = 1; /* We'll need to emit all the lights once */ } /* Camera is at (in its own coordinates) (0,0,0). * Looking toward vector (0,0,-1) * nominally looking at a point (0,0,-focallen) */ CamGet(_mgc->cam, CAM_FOCUS, &_mgribc->focallen); look.x = look.y = 0; look.z = -_mgribc->focallen; look.w = 1; /* Transform to world coordinates */ HPt3TransPt3(_mgc->C2W, &look, &lookat); /* Now the camera is at _mgc->cpos (this is a Point3), */ /* looking at lookat (another Point3) */ /* interpret camera ...*/ CamGet( _mgc->cam, CAM_NEAR, &cnear); CamGet( _mgc->cam, CAM_FAR, &cfar); /* make our buffer the current one */ mrti_makecurrent(&_mgribc->worldbuf); mrti(mr_clipping, mr_float, cnear, mr_float, cfar, mr_NULL); CamGet( _mgc->cam, CAM_PERSPECTIVE, &_mgribc->persp); mrti(mr_projection, mr_string, _mgribc->persp ? "perspective" : "orthographic", mr_NULL); CamGet( _mgc->cam, CAM_ASPECT, &aspect ); CamGet( _mgc->cam, CAM_HALFYFIELD, &halfyfield ); halfxfield = halfyfield * aspect; mrti(mr_screenwindow, mr_float, -halfxfield, mr_float, halfxfield, mr_float, -halfyfield, mr_float, halfyfield, mr_NULL); CamGet( _mgc->cam, CAM_FOV, &fov); sprintf(str, "Field of view %.8g", fov); mrti(mr_comment, str, mr_NULL); mrti(mr_framebegin, mr_int, 1, mr_nl, mr_NULL); if (_mgc->cpos.w != 0.0 && _mgc->cpos.w != 1.0) { sprintf(str, "CameraOrientation %.8g %.8g %.8g %.8g %.8g %.8g", _mgc->cpos.x/_mgc->cpos.w, _mgc->cpos.y/_mgc->cpos.w, _mgc->cpos.z/_mgc->cpos.w, lookat.x,lookat.y,lookat.z); } else { sprintf(str, "CameraOrientation %.8g %.8g %.8g %.8g %.8g %.8g", _mgc->cpos.x,_mgc->cpos.y,_mgc->cpos.z, lookat.x,lookat.y,lookat.z); } mrti(mr_header, str, mr_nl, mr_NULL); mrti(mr_identity, mr_NULL); mgrib_printmatrix(cam2ri); mgrib_printmatrix(_mgc->W2C); /* otherwise explicitly specified normals would be inverted */ mrti(mr_reverseorientation, mr_NULL); /* declare "bgcolor" as uniform float, needed by the GVblend filters * (GL_BLEND texturing). * * We also declare At (\alpha_{texture}), which is used to switch * off texture introduced transparency when the appearance has * transparency disabled. */ mrti(mr_declare, mr_string, "bgcolor", mr_string, "uniform color", mr_NULL); mrti(mr_declare, mr_string, "At", mr_string, "uniform float", mr_NULL); /* RiWorldBegin...*/ mrti(mr_nl, mr_nl, mr_worldbegin, mr_NULL); _mgribc->world = 1; /* if the option is selected, add the background */ if(_mgribc->backing == MG_RIBDOBG) { float halfxbg = cfar * halfxfield, halfybg = cfar * halfyfield; float farz = -.99 * cfar; Point3 bg[4]; bg[0].x = -halfxbg; bg[0].y = -halfybg; bg[0].z = farz; bg[1].x = -halfxbg; bg[1].y = halfybg; bg[1].z = farz; bg[2].x = halfxbg; bg[2].y = halfybg; bg[2].z = farz; bg[3].x = halfxbg; bg[3].y = -halfybg; bg[3].z = farz; mrti(mr_comment, "simulate background color via polygon", mr_NULL); mrti(mr_attributebegin, mr_NULL); mgrib_printmatrix(_mgc->C2W); mrti(mr_surface, mr_constant, mr_NULL); mrti(mr_color, mr_parray, 3, &_mgc->background, mr_NULL); mrti(mr_polygon, mr_P, mr_parray, 4*3, bg, mr_NULL); mrti(mr_attributeend, mr_NULL); } /* bring ri state into accordance with appearance state */ { Appearance *ap = ApCopy( &(_mgc->astk->ap), NULL ); mgrib_setappearance( ap, MG_SET ); ApDelete(ap); } /* NOW DONE BY mg_worldbegin() *CamView(_mgc->cam, _mgribc->W2S); *TmTranslate(T, 1.0, 1.0, 0); *TmConcat(_mgribc->W2S,T, _mgribc->W2S); */ /* NOW DONE BY mg_worldbegin() *mgrib_ctxget(MG_WINDOW, &win); *WnGet(_mgc->win, WN_CURPOS, &wp); *xsize = wp.xmax - wp.xmin + 1; *ysize = wp.ymax - wp.ymin + 1; * *TmScale(T, (double)xsize*.5, (double)ysize*.5, 1.0); *TmConcat(_mgribc->W2S,T, _mgribc->W2S); * *TmCopy(_mgribc->W2S, _mgribc->O2S); */ } /*----------------------------------------------------------------------- * Function: mgrib_worldend * Description: finish drawing a frame * Returns: nothing * Author: wisdom * Date: Sat Mar 7 14:47:40 GMT-0600 1992 */ void mgrib_worldend( void ) { _mgribc->world = 0; mrti(mr_worldend, mr_nl, mr_NULL); mrti(mr_frameend, mr_nl, mr_NULL); /* now flush the buffer, if appropriate */ /* mgrib_flushbuffer(); NOW DONE AT HIGHER LEVEL */ } /*----------------------------------------------------------------------- * Function: mgrib_reshapeviewport * Description: adjust to a new window size * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:08:30 1991 * Notes: adjusts both GL's internal viewport setting, as well as * MG context WnWindow's current position and camera's * aspect ratio. */ void mgrib_reshapeviewport( void ) { WnWindow *win; WnPosition wp; int xsize, ysize; mgrib_ctxget(MG_WINDOW, &win); /* Get window; force it to ask * NeXTStep how big the window is */ WnGet(win, WN_CURPOS, &wp); xsize = wp.xmax - wp.xmin + 1; ysize = wp.ymax - wp.ymin + 1; CamSet(_mgc->cam, CAM_ASPECT, (double)xsize/(double)ysize, CAM_END); } /*----------------------------------------------------------------------- * Function: mgrib_identity * Description: set the current object xform to identity * Returns: nothing * Author: * Date: * Notes: * */ void mgrib_identity( void ) { mgrib_settransform( TM_IDENTITY ); } /*----------------------------------------------------------------------- * Function: mgrib_transform * Description: premultiply the object xform by T * Args: T * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:24:57 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * */ void mgrib_transform( Transform T ) { mg_transform(T); mgrib_printmatrix(T); TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); } /*----------------------------------------------------------------------- * Function: mgrib_pushtransform * Description: push the object xform stack * Returns: nothing (???) * Author: mbp * Date: Fri Sep 20 12:25:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in MVIEWING mode. */ int mgrib_pushtransform( void ) { mg_pushtransform(); mrti(mr_transformbegin, mr_NULL); return 0; } /*----------------------------------------------------------------------- * Function: mgrib_popransform * Description: pop the object xform stack * Returns: nothing (???) * Author: mbp * Date: Fri Sep 20 12:25:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in MVIEWING mode. */ int mgrib_poptransform( void ) { mg_poptransform(); mrti(mr_transformend, mr_NULL); TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); return 0; } /*----------------------------------------------------------------------- * Function: mgrib_settransform * Description: set the current object xform to T * Args: T * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:29:43 1991 * Notes: */ void mgrib_settransform( Transform T ) { mrti(mr_identity, mr_NULL); mg_settransform( T ); TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); if(T != TM_IDENTITY) mgrib_printmatrix(T); } /*----------------------------------------------------------------------- * Function: mgrib_pushappearance * Description: push the MG context appearance stack * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:54:19 1991 */ int mgrib_pushappearance( void ) { mg_pushappearance(); if (_mgribc->world) mrti(mr_comment, "push appearance", mr_attributebegin, mr_NULL); return 0; } /*----------------------------------------------------------------------- * Function: mgrib_popappearance * Description: pop the MG context appearance stack * Returns: nothing * Author: * Date: * Note: Note that we do not have to do anything besides * AttributeEnd, because the RenderMan driver retains * the previous state information. 1/13/92 TMM */ int mgrib_popappearance( void ) { struct mgastk *mastk = _mgc->astk; if (mastk->next == NULL) { OOGLError(0, "mggl_popappearance: appearance stack has only 1 entry.\n"); return 0; } if (_mgribc->world) mrti(mr_comment, "pop appearance", mr_attributeend, mr_NULL); mg_popappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgrib_setappearance * Author: munzner, mbp, wisdom * Date: Wed Aug 7 01:08:07 1991 * Notes: Tossed mgrib_material, just use mgrib_appearance * since shaders depend on both appearance and material * settings. (4/1/93 TMM) */ const Appearance * mgrib_setappearance(const Appearance* ap, int mergeflag ) { int changed, mat_changed, lng_changed; struct mgastk *mastk = _mgc->astk; Appearance *ma; ma = &(mastk->ap); /* Decide what changes */ if (mergeflag == MG_MERGE) { changed = ap->valid & ~ma->override; mat_changed = ap->mat ? ap->mat->valid & ~ma->mat->override : 0; lng_changed = ap->lighting ? ap->lighting->valid & ~ma->lighting->override : 0; } else { changed = ap->valid; mat_changed = ap->mat ? ap->mat->valid : 0; lng_changed = ap->lighting ? ap->lighting->valid : 0; } mg_setappearance( ap, mergeflag ); /* here is where everything gets set (sort of) */ if(_mgribc->born) { mgrib_appearance( mastk, changed, mat_changed); /* interpret lights ... */ mgrib_lighting(_mgc->astk, lng_changed); } return &_mgc->astk->ap; } /*----------------------------------------------------------------------- * Function: mgrib_setcamera * Description: set the context's camera (pointer) * Args: *cam: the camera to use * Returns: nothing * Author: mbp * Date: Fri Sep 20 13:07:31 1991 * Notes: The context stores a pointer to the camera, not a copy * of it. */ int mgrib_setcamera( Camera* cam ) { if (_mgc->cam) CamDelete(_mgc->cam); _mgc->cam = cam; RefIncr((Ref*) cam); return 0; } /*----------------------------------------------------------------------- * Function: mgrib_newcontext * Description: initialize a new mgricontext structure * Args: *ctx: the struct to initialize * Returns: ctx * Author: mbp * Date: Fri Sep 20 13:11:03 1991 */ mgribcontext * mgrib_newcontext( mgribcontext *ctx ) { static const char stdshaderpaths[] = ".:shaders:/usr/local/prman/prman/lib/shaders:/NextLibrary/Shaders"; char *geomdata = getenv("GEOMDATA"); memset(ctx, 0, sizeof(mgribcontext)); mg_newcontext(&(ctx->mgctx)); ctx->mgctx.devfuncs = &mgribfuncs; ctx->mgctx.devno = MGD_RIB; ctx->mgctx.astk->ap_seq = 1; ctx->mgctx.astk->mat_seq = 1; ctx->mgctx.astk->light_seq = 1; ctx->born = false; ctx->rib = NULL; ctx->rib_close = false; ctx->backing = RB_DOBG; ctx->shader = RM_EXTSHADE; ctx->shadepath = NULL; /* should add context field */ if (geomdata) { char path[512]; sprintf(path, "%s:%s/shaders:&", stdshaderpaths, geomdata); ctx->shadepath = strdup(path); } if ((ctx->tmppath = getenv("TMPDIR")) == NULL) { ctx->tmppath = "/tmp"; } /* initalize the token interface */ mrti_init(&ctx->worldbuf); mrti_init(&ctx->txbuf); mrti_makecurrent(&ctx->worldbuf); ctx->render_device = RMD_ASCII; ctx->line_mode = RM_CYLINDER; return ctx; } /*----------------------------------------------------------------------- * Function: mgrib_findctx * Description: Given a GL window ID, returns the associated mg context. * Returns: mgcontext * for success, NULL if none exists. * Author: slevy * Date: Mon Nov 11 18:33:53 CST 1991 * Notes: This is a public routine. */ mgcontext * mgrib_findctx( long winid ) { struct mgcontext *mgc; for(mgc = _mgclist; mgc != NULL; mgc = mgc->next) { if(mgc->devno == MGD_RIB && ((mgribcontext *)mgc)->win == winid) return mgc; } return NULL; } /*----------------------------------------------------------------------- * Function: mgrib_flushbuffer * Description: flushed tokens from buffer to a file * Returns: nothing * Author: wisdom * Date: Mon Jul 26 12:35:45 CDT 1993 * Notes: This is a public routine, prototyped in mgrib.h */ void mgrib_flushbuffer() { TokenBuffer *wbuf = &_mgribc->worldbuf; size_t size; if(!_mgribc->rib) { if (mgrib_ctxset(MG_RIBDISPLAYNAME, DEFAULT_RIB_FILE, MG_END) == -1) { return; } } if (_mgribc->tx) { TokenBuffer *txbuf = &_mgribc->txbuf; size = (size_t)wbuf->tkb_worldptr - (size_t)wbuf->tkb_buffer; if (size && fwrite(wbuf->tkb_buffer, size, 1, _mgribc->rib) != 1) { OOGLError(1, "Error flushing RIB tokenbuffer (prologue)"); } mrti_makecurrent(txbuf); mrti(mr_nl, mr_nl, mr_NULL); size = (size_t)txbuf->tkb_ptr - (size_t)txbuf->tkb_buffer; if (size && fwrite(txbuf->tkb_buffer, size, 1, _mgribc->rib) != 1) { OOGLError(1, "Error flushing RIB tokenbuffer (textures)"); } size = (size_t)wbuf->tkb_ptr - (size_t)wbuf->tkb_worldptr; if (size && fwrite(wbuf->tkb_worldptr, size, 1, _mgribc->rib) != 1) { OOGLError(1, "Error flushing RIB tokenbuffer (world)"); } mrti_reset(); } else { size = (size_t)wbuf->tkb_ptr - (size_t)wbuf->tkb_buffer; if (size && fwrite(wbuf->tkb_buffer, size, 1, _mgribc->rib) != 1) { OOGLError(1, "Error flushing RIB tokenbuffer"); } } fflush(_mgribc->rib); mrti_makecurrent(wbuf); mrti_reset(); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/rib/mgrib.h0000644000175000001440000000525410575563115014267 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * MG context attributes specific to Renderman rib driver (mgrib) * */ #ifndef _GV_MGRIB_H_ #define _GV_MGRIB_H_ #define MG_RIBWINID 300 /* token: int */ #define MG_RIBBORN 301 /* token: int (boolean) */ #define MG_RIBFILE 302 /* token: FILE* */ #define MG_RIBLINEMODE 303 /* token: int */ #define MG_RIBPOLYGON 304 /* possible value for MG_RIBLINEMODE */ #define MG_RIBCYLINDER 305 /* possible value for MG_RIBLINEMODE */ #define MG_RIBPRMANLINE 306 /* possible value for MG_RIBLINEMODE */ #define MG_RIBFORMAT 307 /* token: int */ #define MG_RIBASCII 308 /* possible value for MG_RIBFORMAT */ #define MG_RIBBINARY 309 /* possible value for MG_RIBFORMAT */ #define MG_RIBFILEPATH MG_RIBDISPLAYNAME /* obsolete. token: char* */ #define MG_RIBDISPLAY 311 /* token: int */ #define MG_RIBTIFF 312 /* possible value for MG_RIBDISPLAY */ #define MG_RIBFRAME 313 /* possible value for MG_RIBDISPLAY */ #define MG_RIBDISPLAYNAME 314 /* token: char* */ #define MG_RIBBACKING 315 /* token: int */ #define MG_RIBDOBG 316 /* possible value for MG_RIBBACKING */ #define MG_RIBNOBG 317 /* possible value for MG_RIBBACKING */ #define MG_RIBSHADER 318 /* token: int */ #define MG_RIBSTDSHADE 319 /* possible value for MG_RIBSHADER */ #define MG_RIBEXTSHADE 320 /* possible value for MG_RIBSHADER */ #define MG_RIBSCENE 321 /* RIB 1.0: scene name: char* */ #define MG_RIBCREATOR 322 /* RIB 1.0: creator: char* */ #define MG_RIBFOR 323 /* RIB 1.0: user: char* */ #define MG_RIBDATE 324 /* RIB 1.0: date: char* */ /* following are functions wich need to be accessed by main program */ void mgrib_flushbuffer(); /* flushes tokens from buffer to file */ #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/rib/Makefile.am0000644000175000001440000000035210455665336015051 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgrib.la libmgrib_la_SOURCES = \ mgrib.c mgribdraw.c mgribmesh.c mgribshade.c mgribtoken.c mgributil.c \ mgrib.h mgribP.h mgribshade.h mgribtoken.h geomview-1.9.4/src/lib/mg/rib/Makefile.in0000644000175000001440000003630310665240505015055 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mg/rib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmgrib_la_LIBADD = am_libmgrib_la_OBJECTS = mgrib.lo mgribdraw.lo mgribmesh.lo \ mgribshade.lo mgribtoken.lo mgributil.lo libmgrib_la_OBJECTS = $(am_libmgrib_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libmgrib_la_SOURCES) DIST_SOURCES = $(libmgrib_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgrib.la libmgrib_la_SOURCES = \ mgrib.c mgribdraw.c mgribmesh.c mgribshade.c mgribtoken.c mgributil.c \ mgrib.h mgribP.h mgribshade.h mgribtoken.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/rib/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/rib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libmgrib.la: $(libmgrib_la_OBJECTS) $(libmgrib_la_DEPENDENCIES) $(LINK) $(libmgrib_la_OBJECTS) $(libmgrib_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgrib.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgribdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgribmesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgribshade.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgribtoken.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgributil.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/mg/rib/mgribshade.c0000644000175000001440000002352410611521531015252 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgribP.h" #include "mgribshade.h" #include "mgribtoken.h" /* * Notes: Tossed mgrib_material, just use mgrib_appearance * since shaders depend on both appearance and material * settings. (4/1/93 TMM) */ void mgrib_appearance( struct mgastk *astk, int ap_mask, int mat_mask) { Appearance *ap = &(astk->ap); Material *mat = &astk->mat; mrti(mr_section, "Interpreting Material", mr_NULL); if (mat_mask & MTF_DIFFUSE) mrti(mr_color, mr_parray, 3, &mat->diffuse, mr_NULL); if ((ap_mask & APF_TRANSP || mat_mask & MTF_ALPHA) && ap->valid & APF_TRANSP && ap->flag & APF_TRANSP) { /* presumably, we want this here as well as per vertex opacity * specification * * Actually, if the material alpha override bit is set, we * don't output the per vertex opacity information, which * would take precedence. 4/16/93 TMM */ float alpha = astk->mat.diffuse.a; mrti(mr_opacity, mr_array, 3, alpha, alpha, alpha, mr_NULL); } if ( (ap_mask & (APF_SHADING|APF_TEXTURE)) || (mat_mask & (MTF_SPECULAR|MTF_SHININESS|MTF_Kd|MTF_Ka|MTF_Ks)) || ( (ap->tex != NULL) && (ap->flag & APF_TEXTURE) && (ap->tex != astk->next->ap.tex) ) ) { #if 1 /* cH: I'm not so sure 'bout the following anymore */ /* NOTE: the factor "8.0" is to compensate for some of the * usual rib shaders, i.e. BMRT, aqsis etc.. Don't know * why they started this affair, but without the output * from rendrib or aqsis is just _very_ different from * that what is displayed on the screen -- cH. * */ float roughness = (mat->shininess)? 8.0/mat->shininess : 8.0/1.0; #else float roughness = (mat->shininess)? 1.0/mat->shininess : 1.0/1.0; #endif enum tokentype shader = mr_plastic; if (ap->shading == APF_CONSTANT || ap->shading == APF_CSMOOTH) { if (_mgribc->shader == MG_RIBSTDSHADE) { shader = mr_constant; } else if ((ap->flag & APF_TEXTURE) && ap->tex != NULL) { switch (ap->tex->apply) { case TXF_MODULATE: shader = mr_GVmodulateconstant; break; case TXF_DECAL: shader = mr_GVdecalconstant; break; case TXF_BLEND: shader = mr_GVblendconstant; break; case TXF_REPLACE: shader = mr_GVreplaceconstant; break; } } mrti(mr_shadinginterpolation, mr_string, ap->shading == APF_CONSTANT ? "constant" : "smooth", mr_surface, shader, mr_NULL); } else { /* determine shader */ if (_mgribc->shader == MG_RIBSTDSHADE) { if ((ap->flag & APF_TEXTURE) && ap->tex != NULL) { shader = mr_paintedplastic; } else { shader = mr_plastic; } } else { if (_mgc->space & TM_HYPERBOLIC) { shader = mr_hplastic; } else if ((ap->flag & APF_TEXTURE) && ap->tex != NULL) { switch (ap->tex->apply) { case TXF_MODULATE: shader = mr_GVmodulateplastic; break; case TXF_DECAL: shader = mr_GVdecalplastic; break; case TXF_BLEND: shader = mr_GVblendplastic; break; case TXF_REPLACE: shader = mr_GVreplaceplastic; break; } } else { shader = mr_plastic; } } /* define surface */ if (!IS_SMOOTH(ap->shading)) { mrti(mr_shadinginterpolation, mr_constant, mr_surface, shader, mr_Ka, mr_float, mat->ka, mr_Kd, mr_float, mat->kd, mr_Ks, mr_float, mat->ks, mr_specularcolor, mr_parray, 3, &(mat->specular), mr_roughness, mr_float, roughness, mr_NULL); } else { mrti(mr_shadinginterpolation, mr_string, "smooth", mr_surface, shader, mr_Ka, mr_float, mat->ka, mr_Kd, mr_float, mat->kd, mr_Ks, mr_float, mat->ks, mr_specularcolor, mr_parray, 3, &(mat->specular), mr_roughness, mr_float, roughness, mr_NULL); } } /* define texture if appropriate */ if ((ap->flag & APF_TEXTURE) && ap->tex != NULL && ap->tex->image != NULL) { char txtxname[PATH_MAX]; char tifftxname[PATH_MAX]; char filter[PATH_MAX]; int i; unsigned chmask = 0; if (_mgribc->shader == MG_RIBSTDSHADE) { static bool was_here = false; if (!was_here) { OOGLWarn("textures with apply != modulate will not work " "when using the standard shaders.\n"); was_here = true; } } for (i = 0; i < _mgribc->n_tximg; i++) { if (_mgribc->tx[i]->image == ap->tex->image && (_mgribc->tx[i]->flags & (TXF_SCLAMP|TXF_TCLAMP)) == (ap->tex->flags & (TXF_SCLAMP|TXF_TCLAMP))) { break; } } mgrib_mktexname(txtxname, i, _mgribc->tmppath, "tiff.tx"); if (i == _mgribc->n_tximg) { if (_mgribc->n_tximg % 10 == 0) { _mgribc->tx = OOGLRenewNE(Texture *, _mgribc->tx, _mgribc->n_tximg + 10, "New RIB texture images"); } _mgribc->tx[i] = ap->tex; _mgribc->n_tximg++; /* try to dump the image to disk */ mgrib_mktexname(tifftxname, i, _mgribc->displaypath, "tiff"); #ifdef HAVE_PAMTOTIFF chmask = (1 << ap->tex->image->channels) - 1; sprintf(filter, "pamtotiff -lzw -truecolor > %s 2> /dev/null", tifftxname); #else chmask = ap->tex->image->channels > 2 ? 0x7 : 0x1; sprintf(filter, "pnmtotiff -lzw -truecolor > %s 2> /dev/null", tifftxname); #endif if (!ImgWriteFilter(ap->tex->image, chmask, filter)) { _mgribc->tx[i] = NULL; --_mgribc->n_tximg; } mgrib_mktexname(tifftxname, i, NULL, "tiff"); mrti_makecurrent(&_mgribc->txbuf); mrti(mr_maketexture, mr_string, tifftxname, mr_string, txtxname, mr_string, ap->tex->flags & TXF_SCLAMP ? "clamp" : "periodic", mr_string, ap->tex->flags & TXF_TCLAMP ? "clamp" : "periodic", mr_string, "gaussian", mr_float, 2.0, mr_float, 2.0, mr_NULL); mrti_makecurrent(&_mgribc->worldbuf); } if (i < _mgribc->n_tximg) { mrti(mr_texturename, mr_string, txtxname, mr_NULL); } if (ap->tex->apply == TXF_BLEND) { mrti(mr_string, "bgcolor", mr_parray, 3, &(ap->tex->background), mr_NULL); } if (ap->tex->apply != TXF_DECAL) { mrti(mr_string, "At", mr_float, (ap->flag & APF_TRANSP) ? 1.0 : 0.0, mr_NULL); } } } } void mgrib_lighting(struct mgastk *astk, int mask) { LmLighting *lm = &astk->lighting; if (lm->valid & mask & LMF_AMBIENT) { mrti(mr_section, "Interpreting Lights", mr_NULL); /* output the ambient light */ mrti(mr_comment, "Ambient Light", mr_NULL); mrti(mr_lightsource, mr_ambientlight, mr_int, 0, mr_lightcolor, mr_parray, 3, &(lm->ambient), mr_NULL); } /* We must be in global coordinate space to place lights correctly. */ mrti(mr_transformbegin, mr_identity, mr_NULL); mgrib_lights( lm, astk ); mrti(mr_transformend, mr_NULL); } /* In GL, we want unique light numbers. In RenderMan we want to re-use light numbers, so we always start with light "1". In GL, we define then bind lights. Defining is expensive and we avoid it as much as possible. In RenderMan, it's a one-step process. Also, once a light is defined it cannot be deleted. Thus we might need to explicitly turn off lights if we are replacing more lights with less lights. So we keep track of how many lights we've used so far, and turn off the extras when we need to. 1/13/92 TMM */ void mgrib_lights( LmLighting *lm, struct mgastk *astk ) { int i, lightsused; LtLight *light, **lp; static int prevused = 0; lightsused = 0; LM_FOR_ALL_LIGHTS(lm, i,lp) { light = *lp; ++lightsused; if (light->Private == 0) { /* this is a new light */ light->Private = lightsused; light->changed = 1; } if (light->changed) { if (light->position.w == 0.0) { /* directional light */ /* We used to output the lights as "to" instead of as "from". This is like negating them, which is why we then did explicitly negate them to get the right result! So, leave the lights alone now. Do NOT negate them. It's NOT about handedness of coordinate systems. */ mrti(mr_comment, "Directional Light", mr_lightsource, mr_distantlight, mr_int, light->Private, mr_intensity, mr_float, light->intensity, mr_lightcolor, mr_parray, 3, &(light->color), mr_string, "from", mr_parray, 3, &(light->globalposition), mr_string, "to", mr_array, 3, 0.,0.,0., /* aim at origin */ mr_NULL); } else { /* point light */ mrti(mr_lightsource, mr_string, "pointlight", mr_int, light->Private, mr_intensity, mr_float, light->intensity, mr_lightcolor, mr_parray, 3, &(light->color), mr_string, "from", mr_parray, 3, &(light->globalposition), mr_NULL); } light->changed = 0; } } for (i = lightsused +1; i <= prevused; i++) mrti(mr_illuminate, mr_int, i, mr_int, 0, mr_NULL); if (prevused < lightsused) prevused = lightsused; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/mg/rib/mgribshade.h0000644000175000001440000000235210455701006015256 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* this could be much larger but that's the way the Iris works now this is from gl/gl.h and is used in mgglshade.c */ #define MAXLIGHTS 8 extern void mgrib_lighting( struct mgastk *, int mask ); extern void mgrib_lights( LmLighting *lm, struct mgastk *astk ); extern void mgrib_appearance( struct mgastk *astk, int ap_mask, int mat_mask); geomview-1.9.4/src/lib/mg/rib/mgribtoken.c0000644000175000001440000004654010607471502015320 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * NOTES: * 1. mrti() assumes unsigned short is 2 bytes, MSB first * this may have to change for other architecture * 2. will it be possible to increase the encoded float array length * by "adding l" to create 256 aggregates of 3 or 4 floats each, as * opposed to 256 straight floats? (see appendix C, pg 163 of the * 'big' renderman manual) * 3. the name mrti should be changed to mgri (it sounds better) */ #include "mgribtoken.h" #include #include "mg.h" #include "mgribP.h" #include "mgrib.h" #ifdef test #include #endif #define BUFFERSIZE 1024*128 /* 128k buffer */ #define TMPSIZE 8192 #define SECTIONWIDTH 70 /* width of a section header */ #define STRINGDEF (char)0315 #define STRINGREF (char)0317 #define LNGSTRINGENCODE (char)0241 /* length follows, is unsigned short */ #define STRINGENCODE (char)0220 #define RIREQDEF (char)0314 #define RIREQREF (char)0246 #define FLOATARRAYDEF (char)0310 #define INTEGER (char)0201 /* unsigned short */ #define FLOAT (char)0244 void binary_token(int a1, va_list *alist); void ascii_token(int a1, va_list *alist); TokenBuffer *_tokenbuffer; #define tokenbuffer _tokenbuffer->tkb_buffer #define ptr _tokenbuffer->tkb_ptr #define limit _tokenbuffer->tkb_limit #define worldptr _tokenbuffer->tkb_worldptr #define TABLEROW(cname, reqn) {cname, sizeof(cname)-1, reqn, 0 } /* following is the table: see mgribtoken.h (struct) for desc of fields */ static struct _table table[] = { TABLEROW("", 0), /* mr_NULL */ /* Ri Requests */ TABLEROW("AttributeBegin", 0), TABLEROW("AttributeEnd", 1), TABLEROW("TransformBegin", 2), TABLEROW("TransformEnd", 3), TABLEROW("Identity", 4), TABLEROW("ConcatTransform", 5), TABLEROW("Surface", 6), TABLEROW("ShadingInterpolation", 7), TABLEROW("Color", 8), TABLEROW("Opacity", 9), TABLEROW("Polygon", 10), TABLEROW("PatchMesh", 11), TABLEROW("Format", 12), TABLEROW("Projection", 13), TABLEROW("Clipping", 14), TABLEROW("WorldBegin", 15), TABLEROW("WorldEnd", 16), TABLEROW("Display", 17), TABLEROW("ScreenWindow", 19), TABLEROW("LightSource", 20), TABLEROW("Sphere", 21), TABLEROW("Translate", 22), TABLEROW("Rotate", 23), TABLEROW("Cylinder", 24), TABLEROW("NuPatch", 25), TABLEROW("ShadingRate", 26), TABLEROW("Option", 27), TABLEROW("Illuminate", 28), TABLEROW("FrameBegin", 29), TABLEROW("FrameEnd", 30), TABLEROW("ReverseOrientation", 31), TABLEROW("Curves", 32), TABLEROW("Points", 33), TABLEROW("MakeTexture", 34), TABLEROW("Declare", 35), /* following are reserved - do not add */ /* or remove fields, just change them! */ TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), TABLEROW("", 255), /* Strings - we start these out at position 50 */ TABLEROW("P", 0), TABLEROW("N", 1), TABLEROW("Cs", 2), TABLEROW("Pw", 3), TABLEROW("Os", 4), TABLEROW("st", 5), TABLEROW("plastic", 6), TABLEROW("paintedplastic", 7), TABLEROW("hplastic", 8), TABLEROW("eplastic", 9), TABLEROW("heplastic", 10), TABLEROW("constant", 11), TABLEROW("ambientlight", 12), TABLEROW("lightcolor", 13), TABLEROW("distantlight", 14), TABLEROW("intensity", 15), TABLEROW("file", 16), TABLEROW("rgb", 17), TABLEROW("rgba", 18), TABLEROW("Ka", 19), TABLEROW("Kd", 20), TABLEROW("Ks", 21), TABLEROW("specularcolor", 22), TABLEROW("roughness", 23), TABLEROW("fov", 24), TABLEROW("perspective", 25), TABLEROW("to", 26), TABLEROW("framebuffer", 27), TABLEROW("texturename", 28), TABLEROW("width", 29), TABLEROW("constantwidth", 30), /* strings for extended texture aware shaders with support for alpha */ TABLEROW("GVmodulateplastic", 31), TABLEROW("GVmodulateconstant", 32), TABLEROW("GVdecalplastic", 33), TABLEROW("GVdecalconstant", 34), TABLEROW("GVblendplastic", 35), TABLEROW("GVblendconstant", 36), TABLEROW("GVreplaceplastic", 37), TABLEROW("GVreplaceconstant", 38), TABLEROW("periodic", 39), TABLEROW("gaussian", 40) }; void mrti_makecurrent(TokenBuffer *tkbuf) { _tokenbuffer = tkbuf; } void mrti_delete(TokenBuffer *tkbuf) { if (tkbuf->tkb_buffer) { free(tkbuf->tkb_buffer); if (_tokenbuffer == tkbuf) { _tokenbuffer = NULL; } memset(tkbuf, 0, sizeof(tkbuf)); } } /* initialize tokenbuffer */ void mrti_init(TokenBuffer *tkbuf) { tkbuf->tkb_buffer = (char *)malloc(BUFFERSIZE); tkbuf->tkb_limit = (char *)(tkbuf->tkb_buffer + BUFFERSIZE); tkbuf->tkb_worldptr = tkbuf->tkb_ptr = tkbuf->tkb_buffer; tkbuf->tkb_buffer[0] = '\0'; } /* reset the ptr & tokenbuffer */ void mrti_reset(void) { worldptr = ptr = tokenbuffer; tokenbuffer[0] = '\0'; } /* quick copy routine w/ ptr update */ void cat(char *s, char *a) { while((*(s++)=(*(a++)))) ptr++; } /* routine will check buffer for possible overun, will realloc if needed */ /* generally, "worst case" values should be passed to check_buffer */ void check_buffer(int length) { length += 8; if((char *)(ptr+length)>(char *)limit) { /* optinally check for maximum buffer allocation here */ size_t world = worldptr - tokenbuffer; size_t used = ptr - tokenbuffer; size_t avail = limit - tokenbuffer; /* Buffer grows exponentially, by factor of 1.5 each time */ do { avail += avail>>1; } while(used+length >= avail); tokenbuffer = (char *)realloc(tokenbuffer, avail); ptr = tokenbuffer + used; worldptr = tokenbuffer + world; limit = tokenbuffer + avail; } } /* process variable size token list */ void mrti(int a1, ... ) { va_list alist; va_start(alist, a1); switch(_mgribc->render_device) { case RMD_BINARY: binary_token(a1, &alist); break; case RMD_ASCII: ascii_token(a1, &alist); break; } va_end(alist); } /* return 1 when supplied token requires its own (ascii) line, 0 otherwise */ bool line_initializer(int token) { /* THIS IS HACKISH - IT WILL CREATE A LINE FEED BEFORE */ /* IT CREATES THE NEW LINE, WHICH ISN'T ALWAYS GOOD!! */ if(token=mr_P && token<=mr_Os)) return true; else return false; } /* ASCII SUBPROCESSING */ void ascii_token(int token, va_list *alist) { int i; int count, number; static int arraysize; static int expectSubArray=0; static char astring[128]; double nextfloat; /* va_arg converts floats to doubles */ float *floatptr; char *s; int len; do { if(expectSubArray && (token!=mr_subarray3) && (token!=mr_subarray2)) { /* ERROR */ } /* check to see if we need to start a new line */ if(line_initializer(token) && *(ptr-1)!='\n') *(ptr++)='\n'; switch(token) { case mr_section: check_buffer(SECTIONWIDTH); /* should not exceed this */ s = va_arg(*alist, char*); len = strlen(s); if(len+3>SECTIONWIDTH) len = SECTIONWIDTH-3;/* 3 added characters */ *(ptr++)='\n'; cat(ptr,"# "); cat(ptr,s); cat(ptr," "); len = SECTIONWIDTH - 3 - len; while((len--)>0) *(ptr++)='*'; break; case mr_comment: s = va_arg(*alist, char*); len = strlen(s); check_buffer(len+2); cat(ptr,"# "); cat(ptr,s); break; case mr_header: s = va_arg(*alist, char*); len = strlen(s); check_buffer(len+2); cat(ptr,"##"); cat(ptr,s); break; case mr_nl: /* check for space */ check_buffer(2); if(*(ptr-1)==' ') ptr--; *(ptr++)='\n'; break; case mr_array: arraysize = va_arg(*alist, int); check_buffer(arraysize*16+4); /* how else can we do this? */ *(ptr++)='['; for(i=0;i 1 byte into an * arbitrary (unaligned) location. e.g. * *(unsigned short *)ptr = anUnsignedVariable * may be an illegal instruction. Therefore, macros which will copy these * values one byte at a time follow here and are used where needed. These * macros will work only with float sizes of 4 bytes (IEEE) & unsigned short * int sizes of 2 bytes */ /* cH: hey, folks, there are sane machines around, I mean: with the * "correct" LITTLE-ENDIAN byte order ... * * RIB requires BIG-ENDIAN, so handle the case. */ #if WORDS_BIGENDIAN # define COPYUSHORT( value ) \ *ptr++ = ((char *)&value)[0]; \ *ptr++ = ((char *)&value)[1] # define COPYFLOAT( value ) \ *ptr++ = ((char *)&value)[0]; \ *ptr++ = ((char *)&value)[1]; \ *ptr++ = ((char *)&value)[2]; \ *ptr++ = ((char *)&value)[3] #else # define COPYUSHORT( value ) \ *ptr++ = ((char *)&value)[1]; \ *ptr++ = ((char *)&value)[0] # define COPYFLOAT( value ) \ *ptr++ = ((char *)&value)[3]; \ *ptr++ = ((char *)&value)[2]; \ *ptr++ = ((char *)&value)[1]; \ *ptr++ = ((char *)&value)[0] #endif void binary_token(int token, va_list *alist) { int i; static int expectSubArray=0; static int arraysize; float *floatptr; if(expectSubArray && (token!=mr_subarray3) && (token!=mr_subarray2)) { /* ERROR */ } do { /* single '&' on next line changed to && by mbp Wed May 17 22:33:00 2000 */ if((token>=STRINGBASE) && (token #include #include #include #include "mgP.h" #include "mgbufP.h" /* }}} */ static endPoint *mug=NULL; static int mugSize = 0; static int rdiv, gdiv, bdiv, rshift, gshift, bshift; #ifdef __GNUC__ inline #endif static int RGBtoVal(int r, int g, int b) { return (((r>>rdiv) << rshift) | ((g>>gdiv) << gshift) | ((b>>bdiv) << bshift)); } static void decompose(int mask, int *div, int *shift) { int i; for (i=0; ((mask>>1)<<1) == mask; i++, mask >>= 1) ; *shift = i; for (i=1; mask>>1; i++, mask >>= 1) ; *div = 8-i; } void Xmgr_16fullinit(int rmask, int gmask, int bmask) { decompose(rmask, &rdiv, &rshift); decompose(gmask, &gdiv, &gshift); decompose(bmask, &bdiv, &bshift); } /* #ifdef __GNUC__ inline #endif static short RGBtoVal(int r, int g, int b) { return ((r>>3)<<11) | ((g>>2)<<5) | (b>>3); } void Xmgr_16fullinit(int rmask, int gmask, int bmask) { redmask = rmask; greenmask = gmask; bluemask = bmask; } */ /* {{{ clearing routine */ void Xmgr_16clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax) { short *ptr = (short *)buf; int i, end, x, length, pos; short fill; fill = RGBtoVal(color[0], color[1], color[2]); if (mug==NULL) { mug = (endPoint *)malloc(sizeof(endPoint)*height); mugSize = height; } if (height>mugSize) { mug = (endPoint *)realloc(mug, sizeof(endPoint)*height); mugSize = height; } if (fullclear) { end = (width*height)/2; for (i=0; i>1 #define PTR_TYPE short #define PTR_INIT (short *)(buf+y1*width+2*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = col; #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = col; #define DOPIXEL *ptr = col; #define VARIABLES short col = RGBtoVal(color[0], color[1], color[2]); #include "MGRline.h" #define WIDENAME wideZline #define NAME Xmgr_16Zline #define ZBUFFER #define PTR_INCR width>>1 #define PTR_TYPE short #define PTR_INIT (short *)(buf+y1*width+2*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = col; #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = col; #define DOPIXEL *ptr = col; #define VARIABLES short col = RGBtoVal(color[0], color[1], color[2]); #include "MGRline.h" #define WIDENAME wideGline #define NAME Xmgr_16Gline #define GOURAUD #define COLOR #define PTR_INCR width>>1 #define PTR_TYPE short #define PTR_INIT (short *)(buf+y1*width+2*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = RGBtoVal(r,g,b); #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = RGBtoVal(r,g,b); #define DOPIXEL *ptr = RGBtoVal(r,g,b); #include "MGRline.h" #define WIDENAME wideGZline #define NAME Xmgr_16GZline #define ZBUFFER #define GOURAUD #define COLOR #define PTR_INCR width>>1 #define PTR_TYPE short #define PTR_INIT (short *)(buf+y1*width+2*x1) #define WIDEYDOPIXEL ptr[i*ptrIncr+x] = RGBtoVal(r,g,b); #define WIDEXDOPIXEL ptr[y*ptrIncr+i] = RGBtoVal(r,g,b); #define DOPIXEL *ptr = RGBtoVal(r,g,b); #include "MGRline.h" /* }}} */ /* {{{ polygon scan conversion */ #define NAME Xmgr_doLines #define PTR_TYPE short #define PTR_INIT (short *)(buf+width*y+x1*2) #define VARIABLES short col=RGBtoVal(color[0], color[1], color[2]); #define DOPIXEL *ptr = col; #include "MGRdolines.h" #define NAME Xmgr_ZdoLines #define ZBUFFER #define PTR_TYPE short #define PTR_INIT (short *)(buf+width*y+x1*2) #define VARIABLES short col=RGBtoVal(color[0], color[1], color[2]); #define DOPIXEL *ptr = col; #include "MGRdolines.h" #define NAME Xmgr_GdoLines #define GOURAUD #define COLOR #define PTR_TYPE short #define PTR_INIT (short *)(buf+width*y+x1*2) #define DOPIXEL *ptr = RGBtoVal(r,g,b); #include "MGRdolines.h" #define NAME Xmgr_GZdoLines #define ZBUFFER #define GOURAUD #define COLOR #define PTR_TYPE short #define PTR_INIT (short *)(buf+width*y+x1*2) #define DOPIXEL *ptr = RGBtoVal(r,g,b); #include "MGRdolines.h" void Xmgr_16Zpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_Zpolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_ZdoLines); } void Xmgr_16poly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_polyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_doLines); } void Xmgr_16GZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy) { Xmgr_GZpolyscan(buf, zbuf, zwidth, width, height, p, n, dummy, mug, Xmgr_GZdoLines); } void Xmgr_16Gpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy) { Xmgr_Gpolyscan(buf, zbuf, zwidth, width, height, p, n, dummy, mug, Xmgr_GdoLines); } /* }}} */ /* {{{ multi-line scan conversion */ #ifdef __GNUC__ inline #endif static void setZpixel(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int *color) { if (p->z < zbuf[(int)(p->y)*zwidth+(int)p->x]) ((short *)buf)[(int)(p->y)*(width/2)+(int)p->x] = RGBtoVal(color[0], color[1], color[2]); } #ifdef __GNUC__ inline #endif static void setpixel(unsigned char *buf, int zwidth, int width, int height, CPoint3 *p, int *color) { ((short *)buf)[(int)(p->y)*(width/2)+(int)p->x] = RGBtoVal(color[0], color[1], color[2]); } void Xmgr_16polyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; if (n == 1) { setpixel(buf, zwidth, width, height, p, color); return; } for (i=0; i #ifdef USE_PROTOTYPES void make_square( double ); #else void make_square(); #endif extern unsigned long mgx11colors[216]; int mgx11divN[256]; int mgx11modN[256]; int mgx11magic[16][16]; static int magic4x4[4][4] = { { 0, 14, 3, 13 }, { 11, 5, 8, 6 }, { 12, 2, 15, 1 }, { 7, 9, 4, 10 } }; /* basic dithering macro */ #define DMAP(v,x,y) (mgx11modN[v]>mgx11magic[x][y] ? mgx11divN[v] + 1 : mgx11divN[v]) /***************************************************************** * TAG( dithermap ) * * Create a color dithering map with a specified number of intensity levels. * Inputs: * levels: Intensity levels per primary. * gamma: Display gamma value. * Outputs: * rgbmap: Generated color map. * mgx11divN: "div" function for dithering. * mgx11modN: "mod" function for dithering. * Assumptions: * rgbmap will hold levels^3 entries. * Algorithm: * Compute gamma compensation map. * N = 255.0 / (levels - 1) is number of pixel values per level. * Compute rgbmap with red ramping fastest, green slower, and blue * slowest (treat it as if it were rgbmap[levels][levels][levels][3]). * Call make_square to get mgx11divN, mgx11modN, and magic * * Note: * Call dithergb( x, y, r, g, b, levels, mgx11divN, mgx11modN, magic ) to get index * into rgbmap for a given color/location pair, or use * row = y % 16; col = x % 16; * DMAP(v,col,row) =def (mgx11divN[v] + (mgx11modN[v]>mgx11magic[col][row] ? 1 : 0)) * DMAP(r,col,row) + DMAP(g,col,row)*levels + DMAP(b,col,row)*levels^2 * if you don't want function call overhead. */ void dithermap(int levels, double gamma, int rgbmap[][3]) { double N; int i; int levelsq, levelsc; int gammamap[256]; for ( i = 0; i < 256; i++ ) gammamap[i] = (int)(0.5 + 255 * pow( i / 255.0, 1.0/gamma )); levelsq = levels*levels; /* squared */ levelsc = levels*levelsq; /* and cubed */ N = 255.0 / (levels - 1); /* Get size of each step */ /* * Set up the color map entries. */ for(i = 0; i < levelsc; i++) { rgbmap[i][0] = gammamap[(int)(0.5 + (i%levels) * N)]; rgbmap[i][1] = gammamap[(int)(0.5 + ((i/levels)%levels) * N)]; rgbmap[i][2] = gammamap[(int)(0.5 + ((i/levelsq)%levels) * N)]; } make_square( N ); } /***************************************************************** * TAG( bwdithermap ) * * Create a color dithering map with a specified number of intensity levels. * Inputs: * levels: Intensity levels. * gamma: Display gamma value. * Outputs: * bwmap: Generated black & white map. * mgx11divN: "div" function for dithering. * mgx11modN: "mod" function for dithering. * Assumptions: * bwmap will hold levels entries. * Algorithm: * Compute gamma compensation map. * N = 255.0 / (levels - 1) is number of pixel values per level. * Compute bwmap for levels entries. * Call make_square to get mgx11divN, mgx11modN, and magic. * Note: * Call ditherbw( x, y, val, mgx11divN, mgx11modN, magic ) to get index into * bwmap for a given color/location pair, or use * row = y % 16; col = x % 16; * mgx11divN[val] + (mgx11modN[val]>mgx11magic[col][row] ? 1 : 0) * if you don't want function call overhead. * On a 1-bit display, use * mgx11divN[val] > mgx11magic[col][row] ? 1 : 0 */ void bwdithermap(int levels, double gamma, int bwmap[]) { double N; int i; int gammamap[256]; for ( i = 0; i < 256; i++ ) gammamap[i] = (int)(0.5 + 255 * pow( i / 255.0, 1.0/gamma )); N = 255.0 / (levels - 1); /* Get size of each step */ /* * Set up the color map entries. */ for(i = 0; i < levels; i++) bwmap[i] = gammamap[(int)(0.5 + i * N)]; make_square( N ); } /***************************************************************** * TAG( make_square ) * * Build the magic square for a given number of levels. * Inputs: * N: Pixel values per level (255.0 / levels). * Outputs: * mgx11divN: Integer value of pixval / N * mgx11modN: Integer remainder between pixval and mgx11divN[pixval]*N * magic: Magic square for dithering to N sublevels. * Assumptions: * * Algorithm: * mgx11divN[pixval] = (int)(pixval / N) maps pixval to its appropriate level. * mgx11modN[pixval] = pixval - (int)(N * mgx11divN[pixval]) maps pixval to * its sublevel, and is used in the dithering computation. * The magic square is computed as the (modified) outer product of * a 4x4 magic square with itself. * mgx11magic[4*k + i][4*l + j] = (magic4x4[i][j] + magic4x4[k][l]/16.0) * multiplied by an appropriate factor to get the correct dithering * range. */ void make_square(double N) { int i, j, k, l; double magicfact; for ( i = 0; i < 256; i++ ) { mgx11divN[i] = (int)(i / N); mgx11modN[i] = i - (int)(N * mgx11divN[i]); } mgx11modN[255] = 0; /* always */ /* * Expand 4x4 dither pattern to 16x16. 4x4 leaves obvious patterning, * and doesn't give us full intensity range (only 17 sublevels). * * magicfact is (N - 1)/16 so that we get numbers in the matrix from 0 to * N - 1: mod N gives numbers in 0 to N - 1, don't ever want all * pixels incremented to the next level (this is reserved for the * pixel value with mod N == 0 at the next level). */ magicfact = (N - 1) / 16.; for ( i = 0; i < 4; i++ ) for ( j = 0; j < 4; j++ ) for ( k = 0; k < 4; k++ ) for ( l = 0; l < 4; l++ ) mgx11magic[4*k+i][4*l+j] = (int)(0.5 + magic4x4[i][j] * magicfact + (magic4x4[k][l] / 16.) * magicfact); } /***************************************************************** * TAG( dithergb ) * * Return dithered RGB value. * Inputs: * x: X location on screen of this pixel. * y: Y location on screen of this pixel. * r, g, b: Color at this pixel (0 - 255 range). * levels: Number of levels in this map. * mgx11divN, mgx11modN: From dithermap. * magic: Magic square from dithermap. * Outputs: * Returns color map index for dithered pixelv value. * Assumptions: * mgx11divN, mgx11modN, magic were set up properly. * Algorithm: * see "Note:" in dithermap comment. */ unsigned long dithergb( int x, int y, int *rgb, int levels) { int col = x % 16, row = y % 16; return mgx11colors[DMAP(rgb[0], col, row) + DMAP(rgb[1], col, row) * levels + DMAP(rgb[2], col, row) * levels*levels]; } /***************************************************************** * TAG( ditherbw ) * * Return dithered black & white value. * Inputs: * x: X location on screen of this pixel. * y: Y location on screen of this pixel. * val: Intensity at this pixel (0 - 255 range). * mgx11divN, mgx11modN: From dithermap. * magic: Magic square from dithermap. * Outputs: * Returns color map index for dithered pixel value. * Assumptions: * mgx11divN, mgx11modN, magic were set up properly. * Algorithm: * see "Note:" in bwdithermap comment. */ int ditherbw( int x, int y, int val) { int col = x % 16, row = y % 16; return DMAP(val, col, row); } geomview-1.9.4/src/lib/mg/x11/mgx11P.h0000644000175000001440000001203010455701006014055 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include #include #ifndef NO_SHM #include #include #include #endif /*!NO_SHM*/ #include "mgx11.h" typedef struct { Pt3Coord x, y, z, w; /* Point coordinates */ ColorA vcol; /* Color of vertex */ int drawnext; /* draw the next line segment? */ } CPoint3; #include "mgbufrender.h" #include "mgx11render1.h" #include "mgx11render8.h" #include "mgx11render16.h" #include "mgbufrender24.h" typedef struct _mgx11win { int mgwinid;/* mg window id */ Window window; /* real X window structure */ Window parent; /* parent X windows */ XImage *image; /* image for double buffering */ unsigned char *buf; /* convience ptr */ int width, height; /* actual size of shm seg */ int zwidth; GC gc; /* real X graphics context */ XSizeHints xsh; /* X size hints */ XWindowAttributes xwa; /* X window attributes */ XSetWindowAttributes xswa; XEvent event; /* X event structure for window */ struct _mgx11win *next; /* next in list */ #ifndef NO_SHM XShmSegmentInfo shminf; /* book-keeping for shm */ #endif } mgx11win; /* Display List Structure */ /*****************************************************************************/ typedef struct _mgx11prim { int mykind; /* kind of primitive */ int index; /* index into array of vertices */ int numvts; /* number of vertices */ float depth; /* z value for sorting (at least for now) */ int color[3]; /* rgb color of polygon */ int ecolor[3]; /* edge color of polygon */ int ewidth; /* edge width */ } mgx11prim; typedef struct _mgx11_sort { vvec primsort; /* pointers to mgx11prim array elements*/ vvec prims; /* array of mgx11prim structures */ int primnum; /* number of primitives */ int cprim; /* current primitive being stored */ vvec pverts; /* array of vertices */ int pvertnum; int cvert; /* current vertex being stored */ int maxverts; /* maximum number of vertices */ } mgx11_sort; #define MGX_NULL 0 #define MGX_END 0 #define MGX_BGNLINE 1 #define MGX_BGNPOLY 2 #define MGX_BGNEPOLY 3 #define MGX_BGNSLINE 4 #define MGX_BGNSPOLY 5 #define MGX_BGNSEPOLY 6 #define MGX_VERTEX 7 #define MGX_CVERTEX 8 #define MGX_COLOR 9 #define MGX_ECOLOR 10 #define PRIM_LINE 1 #define PRIM_POLYGON 2 #define PRIM_EPOLYGON 3 #define PRIM_SLINE 4 /* smooth shaded primitives */ #define PRIM_SPOLYGON 5 #define PRIM_SEPOLYGON 6 #define PRIM_INVIS 7 /* End of Display List Structure */ /*****************************************************************************/ typedef struct mgx11context { struct mgcontext mgctx; /* The mgcontext */ int visible; /* has window been displayed on screen yet? */ int win; /* 1 if window is created */ int pix; /* 1 is window is a pixmap */ int znudge; /* znudge for drawing lines closer */ float znudgeby; /* how much of a nudge ? */ long znear, zfar; /* Current Z-buffer limits */ enum sortmethod sortmethod; /* MG_NONE, MG_DEPTH, MG_ZBUFFER */ int dither; /* Should we dither? */ int bitdepth; /* what bit depth ... 24, 8, or 1? */ Visual *visual; /* visual for window */ int shm; /* Do we use shared memory? */ int xmin, xmax, ymin, ymax; int oxmin, oxmax, oymin, oymax; int exposed; int noclear; vvec room; /* Scratch space */ Display *mgx11display; /* pointer to X-display */ Colormap cmap; /* Our colormap */ int cmapset; /* is colormap set or not? */ mgx11win *myxwin; /* pointer to mgx11window structure */ mgx11_sort *mysort; /* sorting structure */ int sizelock; /* for prohibiting size change from within mg when the cam window is part of a larger hierarchy of windows as with Widgets */ void (*deleted)(Window); /* callback for when I'm deleted */ /* pass back parent window */ } mgx11context; #define MAXZNUDGE 8 /* Max depth of mgx11_closer()/farther() */ #define _mgx11c ((mgx11context*)_mgc) geomview-1.9.4/src/lib/mg/x11/mgx11render1.c0000644000175000001440000003010210462407213015212 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Author: Timothy Rowley */ /* {{{ Includes */ #include #include "mgP.h" #include "mgx11P.h" /* }}} */ /* {{{ dither and masking tables */ static unsigned char dither[65][8] = { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00}, {0x80, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00}, {0x88, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00}, {0x88, 0x00, 0x20, 0x00, 0x88, 0x00, 0x00, 0x00}, {0x88, 0x00, 0x20, 0x00, 0x88, 0x00, 0x02, 0x00}, {0x88, 0x00, 0x20, 0x00, 0x88, 0x00, 0x22, 0x00}, {0x88, 0x00, 0x22, 0x00, 0x88, 0x00, 0x22, 0x00}, {0x88, 0x00, 0xA2, 0x00, 0x88, 0x00, 0x22, 0x00}, {0x88, 0x00, 0xA2, 0x00, 0x88, 0x00, 0x2A, 0x00}, {0x88, 0x00, 0xA2, 0x00, 0x88, 0x00, 0xAA, 0x00}, {0x88, 0x00, 0xAA, 0x00, 0x88, 0x00, 0xAA, 0x00}, {0xA8, 0x00, 0xAA, 0x00, 0x88, 0x00, 0xAA, 0x00}, {0xA8, 0x00, 0xAA, 0x00, 0x8A, 0x00, 0xAA, 0x00}, {0xA8, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00}, {0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00}, {0xAA, 0x40, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00}, {0xAA, 0x40, 0xAA, 0x00, 0xAA, 0x04, 0xAA, 0x00}, {0xAA, 0x40, 0xAA, 0x00, 0xAA, 0x44, 0xAA, 0x00}, {0xAA, 0x44, 0xAA, 0x00, 0xAA, 0x44, 0xAA, 0x00}, {0xAA, 0x44, 0xAA, 0x10, 0xAA, 0x44, 0xAA, 0x00}, {0xAA, 0x44, 0xAA, 0x10, 0xAA, 0x44, 0xAA, 0x01}, {0xAA, 0x44, 0xAA, 0x10, 0xAA, 0x44, 0xAA, 0x11}, {0xAA, 0x44, 0xAA, 0x11, 0xAA, 0x44, 0xAA, 0x11}, {0xAA, 0x44, 0xAA, 0x51, 0xAA, 0x44, 0xAA, 0x11}, {0xAA, 0x44, 0xAA, 0x51, 0xAA, 0x44, 0xAA, 0x15}, {0xAA, 0x44, 0xAA, 0x51, 0xAA, 0x44, 0xAA, 0x55}, {0xAA, 0x44, 0xAA, 0x55, 0xAA, 0x44, 0xAA, 0x55}, {0xAA, 0x54, 0xAA, 0x55, 0xAA, 0x44, 0xAA, 0x55}, {0xAA, 0x54, 0xAA, 0x55, 0xAA, 0x45, 0xAA, 0x55}, {0xAA, 0x54, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55}, {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55}, {0xAA, 0xD5, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55}, {0xAA, 0xD5, 0xAA, 0x55, 0xAA, 0x5D, 0xAA, 0x55}, {0xAA, 0xD5, 0xAA, 0x55, 0xAA, 0xDD, 0xAA, 0x55}, {0xAA, 0xDD, 0xAA, 0x55, 0xAA, 0xDD, 0xAA, 0x55}, {0xAA, 0xDD, 0xAA, 0x75, 0xAA, 0xDD, 0xAA, 0x55}, {0xAA, 0xDD, 0xAA, 0x75, 0xAA, 0xDD, 0xAA, 0x57}, {0xAA, 0xDD, 0xAA, 0x75, 0xAA, 0xDD, 0xAA, 0x77}, {0xAA, 0xDD, 0xAA, 0x77, 0xAA, 0xDD, 0xAA, 0x77}, {0xAA, 0xDD, 0xAA, 0xF7, 0xAA, 0xDD, 0xAA, 0x77}, {0xAA, 0xDD, 0xAA, 0xF7, 0xAA, 0xDD, 0xAA, 0x7F}, {0xAA, 0xDD, 0xAA, 0xF7, 0xAA, 0xDD, 0xAA, 0xFF}, {0xAA, 0xDD, 0xAA, 0xFF, 0xAA, 0xDD, 0xAA, 0xFF}, {0xAA, 0xFD, 0xAA, 0xFF, 0xAA, 0xDD, 0xAA, 0xFF}, {0xAA, 0xFD, 0xAA, 0xFF, 0xAA, 0xDF, 0xAA, 0xFF}, {0xAA, 0xFD, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF}, {0xAA, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF}, {0xEA, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF}, {0xEA, 0xFF, 0xAA, 0xFF, 0xAE, 0xFF, 0xAA, 0xFF}, {0xEA, 0xFF, 0xAA, 0xFF, 0xEE, 0xFF, 0xAA, 0xFF}, {0xEE, 0xFF, 0xAA, 0xFF, 0xEE, 0xFF, 0xAA, 0xFF}, {0xEE, 0xFF, 0xBA, 0xFF, 0xEE, 0xFF, 0xAA, 0xFF}, {0xEE, 0xFF, 0xBA, 0xFF, 0xEE, 0xFF, 0xAB, 0xFF}, {0xEE, 0xFF, 0xBA, 0xFF, 0xEE, 0xFF, 0xBB, 0xFF}, {0xEE, 0xFF, 0xBB, 0xFF, 0xEE, 0xFF, 0xBB, 0xFF}, {0xEE, 0xFF, 0xFB, 0xFF, 0xEE, 0xFF, 0xBB, 0xFF}, {0xEE, 0xFF, 0xFB, 0xFF, 0xEE, 0xFF, 0xBF, 0xFF}, {0xEE, 0xFF, 0xFB, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF}, {0xEE, 0xFF, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF}, {0xFE, 0xFF, 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF}, {0xFE, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF}, {0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, }; static unsigned char bits[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; #if 0 static unsigned char startBits[8] = { 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01}; static unsigned char endBits[8] = { 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF}; #endif /* }}} */ static endPoint *mug=NULL; static int mugSize = 0; static int flipped = 0; static int RGB2gray(int *color) { int n; n = (64.0*(color[0]*0.299 + color[1]*0.587 + color[2]*0.114))/255.0; if (n>64) return 64; else return n; } #if 0 static int RGB2gray2(float r, float g, float b) { int n; n = 64.0*(r*0.299 + g*0.587 + b*0.114); if (n>64) return 64; else return n; } #endif static inline void setZpixel(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int *color) { int x, y; x = p->x; y = p->y; if (p->z < zbuf[y*zwidth+x]) buf[y*width+(x>>3)] = (buf[y*width+(x>>3)] & ~bits[x&0x07]) | (bits[x&0x07] & dither[RGB2gray(color)][y&0x07]); } #ifdef __GNUC__ inline #endif static void setpixel(unsigned char *buf, int zwidth, int width, int height, CPoint3 *p, int *color) { int x, y; x = p->x; y = p->y; buf[y*width+(x>>3)] = (buf[y*width+(x>>3)] & ~bits[x&0x07]) | (bits[x&0x07] & dither[RGB2gray(color)][y&0x07]); } #ifdef __GNUC__ inline #endif static void setPixel(unsigned char *buf, int zwidth, int width, int height, int x, int y, int color) { buf[y*width+(x>>3)] = (buf[y*width+(x>>3)] & ~bits[x&0x07]) | (bits[x&0x07] & dither[color][y&0x07]); } void Xmgr_1init(int blackPixel) { int col, i; if (blackPixel && (!flipped)) { for (col=0; col<65; col++) for (i=0; i<8; i++) dither[col][i] = ~dither[col][i]; flipped = 1; } } void Xmgr_1clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax) { int i, length, pos, x; int col = RGB2gray(color); if (mug==NULL) { mug = (endPoint *)malloc(sizeof(endPoint)*height); mugSize = height; } if (height>mugSize) { mug = (endPoint *)realloc(mug, sizeof(endPoint)*height); mugSize = height; } if (fullclear) { for (i=0; i> 3; length = (MIN(zwidth-1,xmax)-xmin+8) >> 3; ymin = MAX(ymin,0); ymax = MIN(height-1,ymax); for (i=ymin; i<=ymax; i++) memset(buf+i*width+xmin, dither[col][i&0x07], length); length = MIN(zwidth-1,xmax)-xmin+1; if (flag) for (i=ymin; i<=ymax; i++) { pos = i*zwidth+xmin; for (x=0; x>3] = (ptr[i>>3] & ~bits[i&0x07]) | (bits[i&0x07] & pattern); #define VARIABLES unsigned char *dith = dither[RGB2gray(color)]; \ unsigned char pattern; \ unsigned char *ptr; #include "MGRdolines.h" #define NAME Xmgr_DZdoLines #define ZBUFFER #define YCODE pattern = dith[y&0x07]; ptr=buf+y*width; #define DOPIXEL \ ptr[i>>3] = (ptr[i>>3] & ~bits[i&0x07]) | (bits[i&0x07] & pattern); #define VARIABLES unsigned char *dith = dither[RGB2gray(color)]; \ unsigned char pattern; \ unsigned char *ptr; #include "MGRdolines.h" #define NAME Xmgr_DGdoLines #define GOURAUD #define DOPIXEL setPixel(buf, zwidth, width, height, i, y, r); #include "MGRdolines.h" #define NAME Xmgr_DGZdoLines #define ZBUFFER #define GOURAUD #define DOPIXEL setPixel(buf, zwidth, width, height, i, y, r); #include "MGRdolines.h" void Xmgr_1Dpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_polyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_DdoLines); } void Xmgr_1DZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_Zpolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_DZdoLines); } void Xmgr_1DGpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_Graypolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_DGdoLines); } void Xmgr_1DGZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_GrayZpolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_DGZdoLines); } /* }}} */ /* {{{ multi-line scan conversion */ void Xmgr_1Dpolyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; if (n == 1) { setpixel(buf, zwidth, width, height, p, color); return; } for (i=0; i #include #include "mgP.h" #include "mgx11P.h" /* }}} */ /* {{{ externs for dithering and dithering code */ extern int colorlevels; extern int mgx11divN[256]; extern int mgx11modN[256]; extern int mgx11magic[16][16]; extern unsigned long mgx11colors[216]; extern int mgx11multab[256]; #define DMAP(v,x,y) (mgx11modN[v]>mgx11magic[x][y] ? mgx11divN[v] + 1 : mgx11divN[v]) #ifdef __GNUC__ inline #endif static unsigned long ditherRGB(int x, int y, int *color) { int xdith, ydith; xdith = x % 16; ydith = y % 16; return mgx11colors[DMAP(color[0], xdith, ydith) + mgx11multab[DMAP(color[1], xdith, ydith) + mgx11multab[DMAP(color[2], xdith, ydith)]]]; } #ifdef __GNUC__ inline #endif static unsigned long ditherRGBvals(int x, int y, int r, int g, int b) { int xdith, ydith; xdith = x % 16; ydith = y % 16; return mgx11colors[DMAP(r, xdith, ydith) + mgx11multab[DMAP(g, xdith, ydith) + mgx11multab[DMAP(b, xdith, ydith)]]]; } /* }}} */ static endPoint *mug=NULL; static int mugSize = 0; void Xmgr_8clear(unsigned char *buf, float *zbuf, int zwidth, int width, int height, int *color, int flag, int fullclear, int xmin, int ymin, int xmax, int ymax) { int i, length, x, col = ditherRGB(0, 0, color); unsigned char *ptr; int pos; if (mug==NULL) { mug = (endPoint *)malloc(sizeof(endPoint)*height); mugSize = height; } if (height>mugSize) { mug = (endPoint *)realloc(mug, sizeof(endPoint)*height); mugSize = height; } if (fullclear) { memset(buf, col, width*height); if (flag) { x = zwidth*height; for (i=0; ixdith)?rdiv1:rdiv) + \ mgx11multab[((gmod>xdith)?gdiv1:gdiv) + \ mgx11multab[(bmod>xdith)?bdiv1:bdiv]]]; #include "MGRdolines.h" #define NAME Xmgr_ZdoLines #define ZBUFFER #define PTR_TYPE unsigned char #define PTR_INIT buf+width*y+x1 #define VARIABLES unsigned char col=ditherRGB(0,0,color); #define DOPIXEL *ptr = col; #include "MGRdolines.h" #define NAME Xmgr_DZdoLines #define ZBUFFER #define PTR_TYPE unsigned char #define PTR_INIT buf+width*y+x1 #define VARIABLES int rmod, gmod, bmod, rdiv, gdiv, bdiv, \ rdiv1, gdiv1, bdiv1, xdith, *magic; #define INITCODE \ rmod = mgx11modN[color[0]]; rdiv = mgx11divN[color[0]]; rdiv1 = rdiv+1; \ gmod = mgx11modN[color[1]]; gdiv = mgx11divN[color[1]]; gdiv1 = gdiv+1; \ bmod = mgx11modN[color[2]]; bdiv = mgx11divN[color[2]]; bdiv1 = bdiv+1; #define YCODE magic = mgx11magic[y & 0x0F]; #define DOPIXEL xdith = magic[i & 0x0F]; \ *ptr = mgx11colors[((rmod>xdith)?rdiv1:rdiv) + \ mgx11multab[((gmod>xdith)?gdiv1:gdiv) + \ mgx11multab[(bmod>xdith)?bdiv1:bdiv]]]; #include "MGRdolines.h" #define NAME Xmgr_DGdoLines #define GOURAUD #define COLOR #define PTR_TYPE unsigned char #define PTR_INIT buf+width*y+x1 #define VARIABLES int *magic, xdith; #define YCODE magic = mgx11magic[y & 0x0F]; #define DOPIXEL xdith = magic[i & 0x0F]; \ *ptr = mgx11colors[ \ ((mgx11modN[r]>xdith)?(mgx11divN[r]+1):mgx11divN[r]) + \ mgx11multab[((mgx11modN[g]>xdith)?(mgx11divN[g]+1):mgx11divN[g])+ \ mgx11multab[(mgx11modN[b]>xdith)?(mgx11divN[b]+1):mgx11divN[b]]]]; #include "MGRdolines.h" #define NAME Xmgr_DGZdoLines #define ZBUFFER #define GOURAUD #define COLOR #define PTR_TYPE unsigned char #define PTR_INIT buf+width*y+x1 #define VARIABLES int *magic, xdith; #define YCODE magic = mgx11magic[y & 0x0F]; #define DOPIXEL xdith = magic[i & 0x0F]; \ *ptr = mgx11colors[ \ ((mgx11modN[r]>xdith)?(mgx11divN[r]+1):mgx11divN[r]) + \ mgx11multab[((mgx11modN[g]>xdith)?(mgx11divN[g]+1):mgx11divN[g])+ \ mgx11multab[(mgx11modN[b]>xdith)?(mgx11divN[b]+1):mgx11divN[b]]]]; #include "MGRdolines.h" void Xmgr_8DZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_Zpolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_DZdoLines); } void Xmgr_8Zpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_Zpolyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_ZdoLines); } void Xmgr_8Dpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_polyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_DdoLines); } void Xmgr_8poly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *color) { Xmgr_polyscan(buf, zbuf, zwidth, width, height, p, n, color, mug, Xmgr_doLines); } void Xmgr_8DGZpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy) { Xmgr_GZpolyscan(buf, zbuf, zwidth, width, height, p, n, dummy, mug, Xmgr_DGZdoLines); } void Xmgr_8DGpoly(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int *dummy) { Xmgr_Gpolyscan(buf, zbuf, zwidth, width, height, p, n, dummy, mug, Xmgr_DGdoLines); } /* }}} */ /* {{{ Multiple line scan-conversion functions */ #ifdef __GNUC__ inline #endif static void setZpixel(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int *color) { if (p->z < zbuf[(int)(p->y)*zwidth+(int)p->x]) buf[(int)(p->y)*width+(int)p->x] = ditherRGB(0, 0, color); } #ifdef __GNUC__ inline #endif static void setpixel(unsigned char *buf, int zwidth, int width, int height, CPoint3 *p, int *color) { buf[(int)(p->y)*width+(int)p->x] = ditherRGB(0, 0, color); } void Xmgr_8polyline(unsigned char *buf, float *zbuf, int zwidth, int width, int height, CPoint3 *p, int n, int lwidth, int *color) { int i; if (n == 1) { setpixel(buf, zwidth, width, height, p, color); return; } for (i=0; i mgcontext * mgx11_ctxcreate(int a1, ...); int mgx11_ctxset( int a1, ... ); int mgx11_feature( int feature ); void mgx11_ctxdelete( mgcontext *ctx ); int mgx11_ctxget( int attr, void* valueptr ); int mgx11_ctxselect( mgcontext *ctx ); void mgx11_sync( void ); void mgx11_worldbegin( void ); void mgx11_worldend( void ); void mgx11_reshapeviewport( void ); void mgx11_identity( void ); void mgx11_transform( Transform T ); int mgx11_pushtransform( void ); int mgx11_poptransform( void ); void mgx11_gettransform( Transform T ); void mgx11_settransform( Transform T ); int mgx11_pushappearance( void ); int mgx11_popappearance( void ); const Appearance *mgx11_setappearance(const Appearance* app, int merge ); int mgx11_setcamera( Camera* cam ); int mgx11_setwindow( WnWindow *win, int final ); mgx11context *mgx11_newcontext( mgx11context *ctx ); extern void mgx11_polygon(); extern void mgx11_mesh(); extern void mgx11_line(); extern void mgx11_polyline(); extern void mgx11_polylist(); extern void mgx11_quads(); extern void mgx11_setshader(mgshadefunc shader); extern void mgx11_appearance( struct mgastk *ma, int mask ); extern void mgx11_init_zrange(); int _mgx11_ctxset(int a1, va_list *alist); WnWindow *mgx11window(WnWindow *win); struct mgfuncs mgx11funcs = { MGD_X11, mgdevice_X11, mgx11_feature, (mgcontext *(*)())mgx11_ctxcreate, mgx11_ctxdelete, (int (*)())mgx11_ctxset, mgx11_ctxget, mgx11_ctxselect, mgx11_sync, mgx11_worldbegin, mgx11_worldend, mgx11_reshapeviewport, /* geometry transform */ mgx11_settransform, mgx11_gettransform, mgx11_identity, mgx11_transform, mgx11_pushtransform, mgx11_poptransform, /* texture transform */ mg_settxtransform, mg_gettxtransform, mg_txidentity, mg_txtransform, mg_pushtxtransform, mg_poptxtransform, /* appearance stack */ mgx11_pushappearance, mgx11_popappearance, mgx11_setappearance, mg_getappearance, /********************/ mgx11_setcamera, mgx11_polygon, mgx11_polylist, mgx11_mesh, mgx11_line, mgx11_polyline, mg_quads, mg_bezier, mg_bsptree, mg_tagappearance, mg_untagappearance, mg_taggedappearance }; /*----------------------------------------------------------------------- * Function: mgdevice_X11 * Description: select the X11 device as the current MG device * Returns: 1 * Author: daeron * Notes: */ int mgdevice_X11() { _mgf = mgx11funcs; if(_mgc != NULL && _mgc->devno != MGD_X11) _mgc = NULL; return(0); } /*----------------------------------------------------------------------- * Function: mgx11_newcontext * Description: initialize an mgcontext structure * Args: mgc: ptr to context structure to initialize * Returns: mgc * Notes: Further device-specific initialization is normally required. */ mgx11context * mgx11_newcontext( mgx11context *ctx ) { mg_newcontext(&(ctx->mgctx)); ctx->mgctx.devfuncs = &mgx11funcs; ctx->mgctx.devno = MGD_X11; ctx->mgctx.astk->ap_seq = 1; ctx->mgctx.astk->mat_seq = 1; ctx->mgctx.astk->light_seq = 1; ctx->mgctx.astk->shader = mg_eucshade; ctx->mgctx.zfnudge = 40.e-6; ctx->win = 0; ctx->pix = 0; ctx->cmapset = 0; ctx->sizelock = 0; ctx->deleted = NULL; ctx->visible = 0; VVINIT(ctx->room, char, 180); return ctx; } /*----------------------------------------------------------------------- * Function: _mgx11_ctxset * Description: internal ctxset routine * Args: a1: first attribute * *alist: rest of attribute-value list * Returns: -1 on error, 0 on success * Date: Fri Sep 20 11:08:13 1991 * Notes: mgx11_ctxcreate() and mgx11_ctxset() call this to actually * parse and interpret the attribute list. */ int _mgx11_ctxset(int a1, va_list *alist) { int attr; char **ablock = NULL; #define NEXT(type) OOGL_VA_ARG(type, alist, ablock) for (attr = a1; attr != MG_END; attr = NEXT(int)) { switch (attr) { case MG_ABLOCK: ablock = NEXT(char**); break; case MG_ApSet: { Appearance *ap; if (ablock) ap = ApSet(NULL, AP_ABLOCK, ablock); else ap = _ApSet(NULL, va_arg(*alist, int), alist); mgx11_setappearance(ap, MG_MERGE); ApDelete(ap); } break; case MG_WnSet: if (ablock) WnSet( _mgc->win, WN_ABLOCK, ablock); else _WnSet( _mgc->win, va_arg(*alist, int), alist); mgx11_setwindow( _mgc->win, 0 ); break; case MG_CamSet: if (ablock) CamSet( _mgc->cam, CAM_ABLOCK, ablock); else _CamSet( _mgc->cam, va_arg(*alist, int), alist); break; case MG_APPEAR: mgsetappearance( NEXT(Appearance *), MG_SET ); break; case MG_WINDOW: mgx11_setwindow( NEXT(WnWindow *), 0 ); break; case MG_CAMERA: mgx11_setcamera( NEXT(Camera *) ); break; case MG_SETOPTIONS: _mgc->opts |= NEXT(int); break; case MG_UNSETOPTIONS: _mgc->opts &= ~NEXT(int); break; case MG_SHOW: _mgc->shown = NEXT(int); break; case MG_PARENT: _mgc->parent = NEXT(mgcontext*); break; case MG_BACKGROUND: { ColorA bcolor; bcolor = *NEXT(ColorA*); if ((bcolor.r != _mgc->background.r) || (bcolor.g != _mgc->background.g) || (bcolor.b != _mgc->background.b)) _mgx11c->exposed = 1; _mgc->background = bcolor; } break; case MG_SHADER: mgx11_setshader( NEXT(mgshadefunc) ); break; case MG_SHADERDATA: _mgc->astk->shaderdata = NEXT(void*); break; case MG_WINCHANGE: _mgc->winchange = NEXT(mgwinchfunc); break; case MG_WINCHANGEDATA: _mgc->winchangeinfo = NEXT(void *); break; case MG_SPACE: { int space = NEXT(int); switch (TM_SPACE(space)) { case TM_EUCLIDEAN: case TM_SPHERICAL: _mgc->space = space; break; case TM_HYPERBOLIC: switch (TM_MODEL(space)) { case TM_VIRTUAL: case TM_PROJECTIVE: case TM_CONFORMAL_BALL: _mgc->space = space; break; default: fprintf(stderr, "_mgx11_ctxset: Illegal space value %1d\n", space); } break; default: fprintf(stderr, "_mgx11_ctxset: Illegal space value %1d\n", space); } } break; case MG_NDCTX: _mgc->NDctx = NEXT(mgNDctx *); break; case MG_ZNUDGE: _mgc->zfnudge = NEXT(double); break; case MG_DEPTHSORT: _mgx11c->sortmethod = (enum sortmethod)NEXT(int); break; case MG_DITHER: _mgx11c->dither = NEXT(int); break; case MG_BITDEPTH: _mgx11c->bitdepth = NEXT(int); Xmg_setx11display(_mgx11c->mgx11display); /* fprintf(stderr," Got bit depth %d\n", _mgx11c->bitdepth); */ break; case MG_X11PIXID: _mgx11c->win = 1; _mgx11c->pix = 1; Xmg_setwin(NEXT(Window)); _mgc->shown = 1; break; case MG_X11WINID: _mgx11c->win = 1; Xmg_setwin(NEXT(Window)); _mgc->shown = 1; break; case MG_X11PARENT: Xmg_setparent(NEXT(Window)); break; case MG_X11DISPLAY: _mgx11c->mgx11display = NEXT(Display *); Xmg_initx11device(); break; case MG_X11SIZELOCK: _mgx11c->sizelock = NEXT(int); break; case MG_X11VISUAL: _mgx11c->visual = NEXT(Visual *); break; case MG_X11EXPOSE: _mgx11c->exposed = 1; break; case MG_X11COLORMAP: _mgx11c->cmap = NEXT(Colormap); _mgx11c->cmapset = 1; break; default: OOGLError (0, "_mgx11_ctxset: undefined option: %d", attr); return -1; } } if (_mgc->shown && !_mgx11c->visible) { /* open the window */ mgx11window(_mgc->win); /* bring X11 state into accordance with appearance state */ { Appearance *ap = ApCopy( &(_mgc->astk->ap), NULL ); mgx11_setappearance( ap, MG_SET ); ApDelete(ap); } } #undef NEXT return 0; } int mgx11_setwindow( WnWindow *win, int final ) { #ifdef UNNEEDED WnPosition pos, vp; int xsize, ysize, flag, reconstrain; int positioned = 0; int zmin; char *name, *oname; #endif if (win == NULL) return 0; if(_mgc->winchange) (*_mgc->winchange)(_mgc, _mgc->winchangeinfo, MGW_WINCHANGE, win); #ifdef UNNEEDED reconstrain = 0; if (WnGet(win, WN_PREFPOS, (void*)&pos) == 1 && (win->changed & WNF_HASPREF)) { if (_mgx11c->visible) Xmg_poswin(pos.xmin, pos.xmax, pos.ymin, pos.ymax); else { Xmg_prefposwin(pos.xmin, pos.xmax, pos.ymin, pos.ymax); reconstrain = positioned = 1; } win->changed &= ~(WNF_HASPREF | WNF_HASSIZE); } else if ((WnGet(win, WN_XSIZE, (void*)&xsize) == 1 && (WnGet(win, WN_YSIZE, (void*)&ysize) == 1 && (win->changed & WNF_HASSIZE))) && !(_mgx11c->sizelock) && _mgx11c->visible) { Xmg_sizewin(xsize, ysize); reconstrain = 1; win->changed &= ~WNF_HASSIZE; } if (reconstrain && _mgx11c->visible) { WnGet(win, WN_NOBORDER, &flag); /* if (flag) noborder(); what to replace these with for X? winconstraints();*/ reconstrain = 0; } if (_mgc->shown) { WnGet(win, WN_NAME, &name); if (_mgx11c->visible) { if(name && (win->changed & WNF_HASNAME)) { Xmg_titlewin(name); win->changed &= ~WNF_HASNAME; } if (WnGet(win, WN_VIEWPORT, &vp) > 0 && win->changed & WNF_HASVP) { /* some sort of viewport(vp.xmin, vp.xmax, vp.ymin, vp.ymax) function */ win->changed &=~WNF_HASVP; } } else if (final) { _mgx11c->win = Xmg_openwin(name); mgx11_sync(); if (_mgx11c->win == 0) { OOGLError(0,"mgx11window: unable to open window"); return 0; } if (positioned) Xmg_poswin(pos.xmin, pos.xmax, pos.ymin, pos.ymax); _mgx11c->visible = 1; reconstrain = 0; } } if ((reconstrain && _mgx11c->visible) || (win->changed & (WNF_NOBORDER | WNF_ENLARGE | WNF_SHRINK))) { WnGet(win, WN_SHRINK, &flag); if (flag) Xmg_minsize((long)40, (long)30); reconstrain = 1; } if (reconstrain && _mgx11c->visible) { Xmg_winconstrain(); win->changed &= ~(WNF_NOBORDER | WNF_ENLARGE | WNF_SHRINK); } #endif /*UNNEEDED*/ if (win != _mgc->win) { RefIncr((Ref *)win); WnDelete(_mgc->win); _mgc->win = win; } return 1; } /*----------------------------------------------------------------------- * Function: mgx11_identity * Description: Set the current object xform to the identity * Args: (none) * Returns: nothing * Notes: Sets the xform on the top of the current context's xform * stack to the identity. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgx11_identity( void ) { mgx11_settransform( TM3_IDENTITY ); } /*----------------------------------------------------------------------- * Function: mgx11_settransform * Description: Set the current object xform * Args: T * Returns: nothing * Notes: Sets the xform on the top of the current context's xform * stack to T. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgx11_settransform( Transform T ) { TmCopy(T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgx11_gettransform * Description: Get the current object xform * Args: T * Returns: nothing * Notes: Writes the current object xform, from the top of the * context's xform stack, into T. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgx11_gettransform( Transform T ) { TmCopy(_mgc->xstk->T, T); } /*----------------------------------------------------------------------- * Function: mgx11_transform * Description: premultiply the current object xform by a transform * Args: T: the transform to premultiply by * Returns: nothing * Notes: If X is the context's current object xform, replaces X * by T X. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mgx11_transform( Transform T ) { TmConcat(T, _mgc->xstk->T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgx11_pushappearance * Description: push the context's appearance stack * Returns: nothing * Notes: * DEVICE USE: required --- all devices must maintain this stack */ int mgx11_pushappearance() { mg_pushappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgx11_popappearance * Description: pop the context's appearance stack * Returns: nothing * Notes: * DEVICE USE: required --- all deviced must maintain this stack */ int mgx11_popappearance() { struct mgastk *mastk = _mgc->astk; struct mgastk *mastk_next; if (!(mastk_next = mastk->next)) { OOGLError(0, "mgx11_popappearance: appearance stack has only 1 entry."); return 1; } mgx11_appearance(mastk_next, mastk_next->ap.valid); mg_popappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgx11_setappearance * Description: Operate on appearance in current context * Args: *ap: the appearance to assign or merge * mergeflag: MG_MERGE or MG_SET * Returns: ptr to current appearance * Notes: Modifies the context's current apperance. Does not * modify *ap. * mergeflag = MG_MERGE: merge *ap into current appearance * mergeflag = MG_SET: set current appearance to *ap * DEVICE USE: required --- when ??? * * Can we modify this to do some of the flag setting * than mgx11_setappearance currently does??? This * seems common to all devices. */ const Appearance * mgx11_setappearance(const Appearance *ap, int mergeflag ) { int changed, lng_changed; struct mgastk *mastk = _mgc->astk; Appearance *ma; ma = &(mastk->ap); if(mergeflag == MG_MERGE) { changed = ap->valid &~ (ma->override &~ ap->override); lng_changed = ap->lighting ? ap->lighting->valid &~ (ma->lighting->override &~ ap->lighting->override) : 0; } else { changed = ap->valid; lng_changed = ap->lighting ? ap->lighting->valid : 0; } mg_setappearance( ap, mergeflag ); if (_mgx11c->visible) { if ((ap->lighting) && (mastk->next)) { if (mastk->light_seq == mastk->next->light_seq) { mastk->light_seq++; lng_changed |= ma->lighting->valid; /* "All fields changed" */ } } } mgx11_appearance( mastk, changed); return &_mgc->astk->ap; } /*----------------------------------------------------------------------- * Function: mgx11_setcamera * Description: Set the context's camera * Args: *cam: the camera to use * Returns: nothing * Notes: The context does not maintain an internal copy of the * camera. Only the pointer is stored. * DEVICE USE: required */ int mgx11_setcamera( Camera *cam ) { if (_mgc->cam) CamDelete(_mgc->cam); _mgc->cam = cam; RefIncr((Ref*) cam); return 0; } /*----------------------------------------------------------------------- * Function: mgx11_ctxset * Description: set some attributes in the current context * Args: attr, ...: list of attribute-value pairs, terminated * by MG_END * Returns: -1 on error, 0 on success * Notes: DO NOT CALL THIS (yet)! It currently does nothing. * DEVICE USE: forbidden --- devices have their own mgxx_ctxset() * * This needs to be modified to work as the NULL device. * Use by other devices may never be needed. */ int mgx11_ctxset( int attr, ... /*, MG_END */ ) { va_list alist; int result; va_start( alist, attr ); result = _mgx11_ctxset(attr, &alist); va_end(alist); return result; } /*----------------------------------------------------------------------- * Function: mgx11_ctxget * Description: get an attribute from the current context * Args: attr: the attribute to get * value: place to write attr's value * */ int mgx11_ctxget( int attr, void *value ) { #define VALUE(type) ((type*)value) switch (attr) { case MG_APPEAR: *VALUE(Appearance*) = &(_mgc->astk->ap); break; case MG_CAMERA: *VALUE(Camera*) = _mgc->cam; break; case MG_WINDOW: if (_mgx11c->visible) { int x0, y0, xsize, ysize; WnPosition wp; Xmg_getwinsize(&xsize, &ysize, &x0, &y0); wp.xmin = (long)x0; wp.xmax = (long)x0+(long)xsize-1; wp.ymin = (long)y0; wp.ymax = (long)y0+(long)ysize-1; WnSet(_mgc->win, WN_CURPOS, &wp, WN_END); } *VALUE(WnWindow*) = _mgc->win; break; case MG_PARENT: *VALUE(mgcontext*) = _mgc->parent; break; case MG_SETOPTIONS: case MG_UNSETOPTIONS: *VALUE(int) = _mgc->opts; break; case MG_BACKGROUND: *VALUE(ColorA) = _mgc->background; break; case MG_SHADER: *VALUE(mgshadefunc) = _mgc->astk->shader; break; case MG_SHADERDATA: *VALUE(void *) = _mgc->astk->shaderdata; break; case MG_WINCHANGE: *VALUE(mgwinchfunc) = _mgc->winchange; break; case MG_WINCHANGEDATA: *VALUE(void *) = _mgc->winchangeinfo; break; case MG_SPACE: *VALUE(int) = _mgc->space; break; case MG_NDCTX: *VALUE(mgNDctx *) = _mgc->NDctx; break; case MG_X11WINID: *VALUE(int) = _mgx11c->win; break; case MG_X11VISIBLE: *VALUE(int) = _mgx11c->visible; break; case MG_ZNUDGE: *VALUE(float) = _mgc->zfnudge; break; case MG_DEPTHSORT: *VALUE(int) = _mgx11c->sortmethod; break; case MG_DITHER: *VALUE(int) = _mgx11c->dither; break; case MG_BITDEPTH: *VALUE(int) = _mgx11c->bitdepth; break; case MG_X11VISUAL: *VALUE(Visual *) = _mgx11c->visual; break; default: OOGLError (0, "mgx11_ctxget: undefined option: %d\n", attr); return -1; } return 1; #undef VALUE } /*----------------------------------------------------------------------- * Function: mgx11_feature * Description: determine whether the NULL device has a particular feature * Args: feature: feature to test for * Returns: -1 (means feature is not present) * Notes: X11 device is rather featureless at present, :-) * DEVICE USE: forbidden --- devices have their own mgxx_feature() */ int mgx11_feature( int feature ) { if(feature == MG_X11VISUAL) return 1; return -1; } /*----------------------------------------------------------------------- * Function: mgx11_ctxcreate * Description: create a new MG context for the X11 device * Args: a1, ...: list of attribute-value pairs * Returns: ptr to new context * Author: daeron */ mgcontext * mgx11_ctxcreate( int a1, ... ) { va_list alist; _mgc = (mgcontext*)mgx11_newcontext( OOGLNewE(mgx11context, "mgx11_ctxcreate") ); if (!Xmg_initx11device()) OOGLError(0,"mgdevice_X11: unable to open X-display"); va_start(alist, a1); if (_mgx11_ctxset(a1, &alist) == -1) { mgx11_ctxdelete(_mgc); } va_end(alist); return _mgc; } /*----------------------------------------------------------------------- * Function: mgx11_ctxdelete * Description: delete an MG context for the X11 device * Args: *ctx: ptr to context to delete * Returns: nothing * Author: daeron */ void mgx11_ctxdelete( mgcontext *ctx ) { mgx11context *_mgx = (mgx11context *)ctx; if(ctx->devno != MGD_X11) { mgcontext *was = _mgc; mgctxselect(ctx); free(_mgx->myxwin); mgctxdelete(ctx); if (was != ctx) mgctxselect(was); } else { if (((mgx11context *)ctx)->visible) Xmg_closewin(_mgx->myxwin); free(_mgx->myxwin); mg_ctxdelete(ctx); if (ctx == _mgc) _mgc = NULL; } } /*----------------------------------------------------------------------- * Function: mgx11_ctxselect * Description: select the current context * Args: *ctx: the context to select * Returns: 0 (why ???) * Author: daeron */ int mgx11_ctxselect( mgcontext *ctx ) { if (ctx == NULL || ctx->devno != MGD_X11) { return mg_ctxselect(ctx); } /* X11 context */ _mgc = ctx; return(0); } /*----------------------------------------------------------------------- * Function: mgx11_pushtransform * Description: push the mg context xform stack * Returns: nothing */ int mgx11_pushtransform( void ) { mg_pushtransform(); return 0; } /*----------------------------------------------------------------------- * Function: mgx11_poptransform * Description: pop the mg context xform stack * Returns: nothing */ int mgx11_poptransform( void ) { mg_poptransform(); return 0; } void mgx11_sync( void ) { Xmg_flush(); } void mgx11_worldbegin( void ) { mg_worldbegin(); #if 0 && !DO_NOT_HACK_THE_CODE_THIS_WAY { /* This cannot be done here because there are objects which do not * belong to the world coordinate system; this stuff needs to be * done in mgx11windows.c in Xmg_add(). */ Transform S; WnPosition vp; WnGet(_mgc->win, WN_VIEWPORT, &vp); /* Fix up W2S and S2W matrices. Since the X11 coordinate system * has Y increasing downward, flip it here, and translate by * location of lower left corner of viewport. */ TmTranslate(S, (double)vp.xmin, (double)vp.ymax, 0.); S[1][1] = -1; /* Invert sign of Y */ TmConcat(_mgc->W2S, S, _mgc->W2S); TmInvert(_mgc->W2S, _mgc->S2W); } #endif _mgc->has = 0; Xmg_newdisplaylist(); } void mgx11_worldend( void ) { Xmg_sortdisplaylist(); Xmg_showdisplaylist(); } void mgx11_reshapeviewport( void ) { int w, h, x0, y0; float pixasp = 1.0; WnPosition vp; WnGet(_mgc->win, WN_PIXELASPECT, &pixasp); if (WnGet(_mgc->win, WN_VIEWPORT, &vp) <= 0) { WnPosition wp; Xmg_getwinsize(&w, &h, &x0, &y0); wp.xmin = (long)x0; wp.xmax = (long)x0+(long)w-1; wp.ymin = (long)y0; wp.ymax = (long)y0+(long)h-1; WnSet(_mgc->win, WN_CURPOS, &wp, WN_END); } else { w = vp.xmax - vp.xmin + 1; h = vp.ymax - vp.ymin + 1; } CamSet(_mgc->cam, CAM_ASPECT, pixasp * (double)w/(double)h, CAM_END); } WnWindow * mgx11window(WnWindow *win) { mgx11_setwindow(win, 1); mgx11_init_zrange(); return(win); } /*----------------------------------------------------------------------- * Function: mgx11_findctx * Description: Given an X11 window ID, returns the associated mg context. * Returns: mgcontext * for success, NULL if none exists. * Author: daeron * Notes: This is a public routine. */ mgcontext * mgx11_findctx( Window winid ) { struct mgcontext *mgc; for(mgc = _mgclist; mgc != NULL; mgc = mgc->next) { if(mgc->devno == MGD_X11 && ((mgx11context *)mgc)->myxwin->window == winid) return mgc; } return NULL; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/x11/mgx11.h0000644000175000001440000000366610455701006013754 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include #define MG_X11WINID 101 /* for passing an X window id */ #define MG_X11PARENT 102 /* for passing an X parent window id */ #define MG_X11DISPLAY 103 /* for passing an X display id */ #define MG_X11VISIBLE 104 /* window visible */ #define MG_X11SIZELOCK 105 /* for locking size of window */ #define MG_X11DELETE 106 /* callback for window deletion */ #define MG_X11PIXID 107 /* for passing an X pixmap id */ #define MG_X11VISUAL 108 /* for visual */ #define MG_X11EXPOSE 109 /* expose event */ #define MG_X11COLORMAP 110 /* for passing colormap */ extern mgcontext *mgx11_findctx( Window ); extern unsigned long mgx11_RGB(int, int, int); extern unsigned long mgx11_setRGB(int, int, int); extern int mgx11_getvisual( Display *, Visual **, Colormap *, int * ); /* return values from mgx11_getvisual: */ #define MG_X11VISFAIL 0 /* Failed to find a reasonable visual */ #define MG_X11VISSUCCEED 1 /* Succeeded in finding a reasonable visual */ #define MG_X11VISPRIVATE 2 /* Succeeded + Visual needs a priv colormap */ geomview-1.9.4/src/lib/mg/x11/Makefile.am0000644000175000001440000000064210604514344014674 00000000000000INCLUDES = $(default_includes) $(X_CFLAGS) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgx11.la libmgx11_la_SOURCES = \ mgx11.c \ mgx11clip.c \ mgx11dither.c \ mgx11draw.c \ mgx11render1.c \ mgx11render16.c \ mgx11render8.c \ mgx11shade.c \ mgx11visual.c \ mgx11windows.c \ mgx11.h \ mgx11P.h \ mgx11render1.h \ mgx11render16.h \ mgx11render8.h \ mgx11shade.h \ mgx11windows.h geomview-1.9.4/src/lib/mg/x11/Makefile.in0000644000175000001440000003736710665240506014726 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mg/x11 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmgx11_la_LIBADD = am_libmgx11_la_OBJECTS = mgx11.lo mgx11clip.lo mgx11dither.lo \ mgx11draw.lo mgx11render1.lo mgx11render16.lo mgx11render8.lo \ mgx11shade.lo mgx11visual.lo mgx11windows.lo libmgx11_la_OBJECTS = $(am_libmgx11_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libmgx11_la_SOURCES) DIST_SOURCES = $(libmgx11_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) $(X_CFLAGS) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgx11.la libmgx11_la_SOURCES = \ mgx11.c \ mgx11clip.c \ mgx11dither.c \ mgx11draw.c \ mgx11render1.c \ mgx11render16.c \ mgx11render8.c \ mgx11shade.c \ mgx11visual.c \ mgx11windows.c \ mgx11.h \ mgx11P.h \ mgx11render1.h \ mgx11render16.h \ mgx11render8.h \ mgx11shade.h \ mgx11windows.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/x11/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/x11/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libmgx11.la: $(libmgx11_la_OBJECTS) $(libmgx11_la_DEPENDENCIES) $(LINK) $(libmgx11_la_OBJECTS) $(libmgx11_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11clip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11dither.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11draw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11render1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11render16.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11render8.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11shade.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11visual.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgx11windows.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/mg/x11/mgx11shade.c0000644000175000001440000000450510560640764014757 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mgP.h" #include "mgx11P.h" #include "mgx11shade.h" extern void mgx11_linewidth(short); void mgx11_appearance( struct mgastk *ma, int mask ) { Appearance *ap = &(ma->ap); if (mask & APF_LINEWIDTH) { mgx11_linewidth(ap->linewidth); _mgc->has &= ~HAS_POINT; } if (mask & APF_SHADING) { /* if (ap->shading == APF_SMOOTH) ap->shading = APF_FLAT; bye bye to kludge in non-gouraud shading mgx11 */ if (ma->shader != NULL && IS_SHADED(ap->shading)) { /* Use software shader if one exists and user wants lighting */ ma->flags |= MGASTK_SHADER; } else { /* No software shading, just use raw colors */ ma->flags &= ~MGASTK_SHADER; } } } void mgx11_setshader(mgshadefunc shader) { struct mgastk *ma = _mgc->astk; unsigned short int wasusing = ma->flags & MGASTK_SHADER; ma->shader = shader; if (shader != NULL && IS_SHADED(ma->ap.shading)) { ma->flags |= MGASTK_SHADER; } else { ma->flags &= ~MGASTK_SHADER; } if((ma->flags & MGASTK_SHADER) != wasusing) mgx11_appearance(_mgc->astk, APF_SHADING); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/x11/mgx11shade.h0000644000175000001440000000200310455701006014741 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* There's no need to declare anything here. */ geomview-1.9.4/src/lib/mg/x11/mgx11windows.c0000644000175000001440000007744010624367377015404 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "mgP.h" #include "mgx11P.h" #include "windowP.h" #include "mgx11windows.h" #if HAVE_CONFIG_H # include "config.h" #endif /*#ifdef AIX*/ /*#include "/usr/lpp/X11/Xamples/extensions/lib/XShm.c"*/ /*#endif*/ #define THEIGHT 200 #define TWIDTH 200 #define MAX(a,b) (((a)<(b)) ? b : a) #define MIN(a,b) (((a)<(b)) ? a : b) static mgx11_sort *mgx11sort = NULL; /* global sorting structure */ static Display *mgx11display = NULL; /* global X display pointer */ /* Z-buffer */ static float *mgx11zbuffer = NULL; static int mgx11zsize = 0; /* Dithering stuff ... fun fun fun :-) */ int colorlevels = 5; /* try 125 levels for starters */ /* But can use up to 216 if envariable * GEOMVIEW_COLORLEVELS is 6. */ unsigned long mgx11colors[217]; static XColor mgx11colorcells[217]; static Colormap cmap; int mgx11multab[256]; /* premultiplied table for speed */ /*static ColorA black = {0.0, 0.0, 0.0, 0.0 };*/ static int curwidth = 1; static int shm_message_shown = 0; extern void dithermap(int, double, int [][3]); extern unsigned long dithergb(int, int, int *, int); extern int Xmg_primclip(mgx11prim *aprim); static int globalXError; /* X Error stuff */ /* Function: myXErrorHandler Description: handle error if shared memory is unavailable Author: Tim Rowley */ int myXErrorHandler(Display *d, XErrorEvent *e) { globalXError = 1; return 1; } /* Function: Xmg_setx11display Description: digest info about this display, allocate space for colors Author: Daeron Meyer */ void Xmg_setx11display(Display *dpy) { int rgbmap[216][3], i, cube, colfail = 1; unsigned int nplanes = 0; unsigned long planemasks[1]; char *colorenv; _mgx11c->mgx11display = dpy; if (mgx11display == dpy) return; mgx11display = dpy; if (_mgx11c->bitdepth == 1) /* We are on a black and white screen! */ return; if ((_mgx11c->bitdepth == 24) || (_mgx11c->bitdepth == 16)) /* We are on a TrueColor screen! */ { colorlevels = 0; return; } if((colorenv = getenv("GEOMVIEW_COLORLEVELS")) != NULL) { colorlevels = atoi(colorenv); if(colorlevels > 6) colorlevels = 6; if(colorlevels < 1) colorlevels = 1; } if (_mgx11c->pix) { if (_mgx11c->cmapset) cmap = _mgx11c->cmap; else cmap = XCreateColormap(mgx11display, DefaultRootWindow(mgx11display), DefaultVisual(mgx11display, DefaultScreen(mgx11display)), AllocNone); } else { if (!_mgx11c->cmapset) cmap = DefaultColormapOfScreen(DefaultScreenOfDisplay(mgx11display)); else cmap = _mgx11c->cmap; } while (colfail && colorlevels > 1) { if (XAllocColorCells(dpy, cmap, False, planemasks, nplanes, mgx11colors, (unsigned int)(colorlevels*colorlevels*colorlevels+1))) colfail = 0; else colorlevels--; } if (colfail) { fprintf(stderr, "MG: Couldn't allocate enough colors. Sorry!"); exit(0); } cube = colorlevels * colorlevels * colorlevels; for (i = 0; i <= cube; i++) mgx11colorcells[i].pixel = mgx11colors[i]; dithermap(colorlevels, (double)1.0, rgbmap); for (i = 0; i < cube; i++) { mgx11colorcells[i].red = (unsigned short)(rgbmap[i][0] * 256); mgx11colorcells[i].green = (unsigned short)(rgbmap[i][1] * 256); mgx11colorcells[i].blue = (unsigned short)(rgbmap[i][2] * 256); mgx11colorcells[i].flags = DoRed | DoGreen | DoBlue; } XStoreColors(dpy, cmap, mgx11colorcells, cube + 1); for (i=0; i<256; i++) mgx11multab[i] = colorlevels*i; } /* Function: Xmg_initx11device Description: allocate space for the display list, initialize mgcontext Author: Daeron Meyer */ int Xmg_initx11device() { if (!mgx11sort) { mgx11sort = (mgx11_sort *)malloc(sizeof(mgx11_sort)); mgx11sort->primnum = 1000; VVINIT(mgx11sort->primsort, int, mgx11sort->primnum); vvneeds(&(mgx11sort->primsort), mgx11sort->primnum); VVINIT(mgx11sort->prims, mgx11prim, mgx11sort->primnum); vvneeds(&(mgx11sort->prims), mgx11sort->primnum); mgx11sort->pvertnum = 2024; VVINIT(mgx11sort->pverts, CPoint3, mgx11sort->pvertnum); vvneeds(&(mgx11sort->pverts), mgx11sort->pvertnum); } _mgx11c->mysort = mgx11sort; _mgx11c->myxwin = NULL; _mgx11c->bitdepth = 0; _mgx11c->visual = NULL; _mgx11c->noclear = 0; return 1; } /* Function: Xmg_openwin Description: open a window if we haven't been given one to draw into Author: Daeron Meyer */ int Xmg_openwin(char *id) { mgx11win *current; Display *dpy = 0; unsigned int border_width = 0; int bitmap_pad = 0; XErrorHandler handler; if (!mgx11display) dpy = XOpenDisplay(NULL); /* If we are missing any of these values then allocate them all again. */ /* This protects us from a user who only partially specifies his/her desired X visual/colormap setup to us. */ if (!_mgx11c->visual || !_mgx11c->bitdepth || !_mgx11c->cmapset) { int result = mgx11_getvisual(dpy, &(_mgx11c->visual), &(_mgx11c->cmap), &(_mgx11c->bitdepth)); if (result == MG_X11VISFAIL) { fprintf(stderr, "MG: Couldn't find a 1, 8, 16 or 24 bit visual. Sorry!\n"); exit(0); } _mgx11c->cmapset = 1; /* We should have a colormap now */ if (!mgx11display) Xmg_setx11display(dpy); } if (_mgx11c->myxwin == NULL) _mgx11c->myxwin = (mgx11win *)malloc(sizeof(mgx11win)); current = _mgx11c->myxwin; current->xswa.colormap = _mgx11c->cmap; current->xswa.background_pixel = None; current->xswa.background_pixmap = None; current->xswa.backing_planes = 0; current->xswa.backing_pixel = None; current->window = XCreateWindow(mgx11display, XRootWindow(mgx11display, XDefaultScreen(mgx11display)), 0, 0, TWIDTH, THEIGHT, border_width, _mgx11c->bitdepth, InputOutput, _mgx11c->visual, CWColormap|CWBorderPixel|CWBackPixel|CWBackPixmap, ¤t->xswa); XStoreName(_mgx11c->mgx11display, current->window, id); current->gc = XCreateGC(_mgx11c->mgx11display, current->window, 0, NULL); /* bg_color = BlackPixel(_mgx11c->mgx11display, DefaultScreen(_mgx11c->mgx11display)); XSetBackground(_mgx11c->mgx11display, current->gc, bg_color); */ XMapWindow(_mgx11c->mgx11display, current->window); XClearWindow(_mgx11c->mgx11display, current->window); current->image = NULL; _mgx11c->shm = 0; #ifndef NO_SHM if (XShmQueryExtension(_mgx11c->mgx11display) == True) { current->image = XShmCreateImage(_mgx11c->mgx11display, _mgx11c->visual, _mgx11c->bitdepth, ZPixmap, NULL, &(current->shminf), TWIDTH, THEIGHT); } if (current->image != NULL) { _mgx11c->shm = 1; current->shminf.shmid = shmget(IPC_PRIVATE, current->image->bytes_per_line * current->image->height, IPC_CREAT|0777); current->buf = shmat(current->shminf.shmid, NULL, 0); current->shminf.shmaddr = current->image->data = (char *)current->buf; current->shminf.readOnly = True; globalXError = 0; handler = XSetErrorHandler(myXErrorHandler); XShmAttach(_mgx11c->mgx11display, &(current->shminf)); XSync(_mgx11c->mgx11display, False); XSetErrorHandler(handler); shmctl(current->shminf.shmid, IPC_RMID, 0); if (globalXError == 1) { _mgx11c->shm = 0; shmdt(current->shminf.shmaddr); } } #endif /*has SHM*/ if (_mgx11c->shm == 0) { if (!shm_message_shown) { fprintf(stderr, "Shared memory unavailable, using fallback display method.\n"); shm_message_shown = 1; } switch (_mgx11c->bitdepth) { case 1: case 8: bitmap_pad = 8; break; case 16: bitmap_pad = 16; break; case 24: bitmap_pad = 32; break; default: fprintf(stderr, "Unknown bit depth %d\n", _mgx11c->bitdepth); } current->image = XCreateImage(_mgx11c->mgx11display, _mgx11c->visual, _mgx11c->bitdepth, ZPixmap, 0, NULL, TWIDTH, THEIGHT, bitmap_pad, 0); current->buf = (unsigned char *)malloc(current->image->bytes_per_line * current->image->height); current->image->data = (char *) current->buf; } current->width = current->image->bytes_per_line; current->height = current->image->height; current->zwidth = TWIDTH; if (current->width*current->height > mgx11zsize) { mgx11zsize = current->width*current->height; if (!mgx11zbuffer) mgx11zbuffer = (float *) malloc(sizeof(float)*mgx11zsize); else mgx11zbuffer = (float *) realloc((void *)mgx11zbuffer, sizeof(float)*mgx11zsize); } _mgx11c->sortmethod = MG_ZBUFFER; _mgx11c->dither = 1; _mgx11c->myxwin = current; return 1; } /* Function: Xmg_setparent Description: set parent window for current context Author: Daeron Meyer */ void Xmg_setparent(Window win) { _mgx11c->myxwin->parent = win; } /* Function: Xmg_setwin Description: set window for current context and get colormap if its a pix Author: Daeron Meyer */ void Xmg_setwin(Window win) { mgx11win *current; int toss; int bg_color = BlackPixel(_mgx11c->mgx11display, DefaultScreen(_mgx11c->mgx11display)); if (_mgx11c->myxwin == NULL) _mgx11c->myxwin = (mgx11win *)malloc(sizeof(mgx11win)); _mgx11c->visible = 1; _mgx11c->myxwin->window = win; current = _mgx11c->myxwin; /* if (!_mgx11c->pix) { current->xswa.colormap = DefaultColormap(_mgx11c->mgx11display, DefaultScreen(_mgx11c->mgx11display)); current->xswa.backing_store = Always; current->xswa.bit_gravity = CenterGravity; XChangeWindowAttributes(_mgx11c->mgx11display, current->window, CWBitGravity, &(*current).xswa); } */ current->gc = XCreateGC(_mgx11c->mgx11display, win, 0, NULL); current->image = NULL; Xmg_getwinsize(&toss, &toss, &toss, &toss); XSetForeground(_mgx11c->mgx11display, current->gc, WhitePixel(_mgx11c->mgx11display, DefaultScreen(_mgx11c->mgx11display))); XSetBackground(_mgx11c->mgx11display, current->gc, bg_color); if (!_mgx11c->pix) XClearWindow(_mgx11c->mgx11display, current->window); _mgx11c->sortmethod = MG_ZBUFFER; _mgx11c->dither = 1; _mgx11c->noclear = 0; } /* Function: Xmg_poswin Description: currently nonfunctional... will eventually call callback Author: Daeron Meyer */ void Xmg_poswin(int x1, int y1, int x2, int y2) { } /* Function: Xmg_prefposwin Description: currently nonfunctional... will eventually call callback Author: Daeron Meyer */ void Xmg_prefposwin(int x1, int y1, int x2, int y2) { } /* Function: Xmg_prefposwin Description: resize window if its size isn't locked Author: Daeron Meyer */ void Xmg_sizewin(int x, int y) { if (_mgx11c->sizelock) return; if (!_mgx11c->pix) XResizeWindow(_mgx11c->mgx11display, _mgx11c->myxwin->window, (unsigned int) x, (unsigned int) y); } /* Function: Xmg_minsize Description: nonfunctional Author: Daeron Meyer */ void Xmg_minsize(int x, int y) { } /* ditto */ void Xmg_winconstrain() { } /* ditto */ void Xmg_titlewin(char *name) { } /* Function: Xmg_closewin Description: close window and free shared memory Author: Daeron Meyer, Tim Rowley */ void Xmg_closewin(mgx11win *this) { Display *dpy = _mgx11c->mgx11display; #ifndef NO_SHM if (_mgx11c->shm) { XShmDetach(dpy, &(this->shminf)); shmdt(this->shminf.shmaddr); } #endif /*has SHM*/ XDestroyImage(this->image); } /* Function: Xmg_flush Description: flush connection to X Author: Daeron Meyer */ void Xmg_flush() { XFlush(_mgx11c->mgx11display); } /* Function: Xmg_newdisplaylist Description: initialize display list Author: Daeron Meyer */ void Xmg_newdisplaylist() { _mgx11c->mysort->cprim = 0; _mgx11c->mysort->cvert = 0; _mgx11c->mysort->maxverts = 0; _mgx11c->znudgeby = 0.0; _mgx11c->oxmin = _mgx11c->xmin; _mgx11c->oymin = _mgx11c->ymin; _mgx11c->oxmax = _mgx11c->xmax; _mgx11c->oymax = _mgx11c->ymax; _mgx11c->xmin = _mgx11c->ymin = INT_MAX; _mgx11c->xmax = _mgx11c->ymax = INT_MIN; } /* Function: Xmg_add Description: add a primitive (polygon, vertex, line) to the display list Author: Daeron Meyer */ void Xmg_add(int primtype, int numdata, void *data, void *cdata) { HPoint3 *vt = (HPoint3 *)data; ColorA *colarray = (ColorA *)cdata; float *col = (float *)cdata; CPoint3 *vts; int i; static mgx11prim *prim; static ColorA color; static float average_depth; static int numverts, ecolor[3]; static int maxlinewidth = 0; #if 1 || HACK_THE_CODE_BUT_BETTER_FIX_IT if (!(_mgc->has & HAS_S2O)) { Transform S; WnPosition vp; mg_findS2O(); mg_findO2S(); WnGet(_mgc->win, WN_VIEWPORT, &vp); /* Fix up O2S and S2O matrices. Since the X11 * coordinate system has Y increasing downward, flip it * here, and translate by location of lower left corner * of viewport. */ TmTranslate(S, (double)vp.xmin, (double)vp.ymax, 0.); S[1][1] = -1; /* Invert sign of Y */ TmConcat(_mgc->O2S, S, _mgc->O2S); TmInvert(_mgc->O2S, _mgc->S2O); } #endif switch (primtype) { case MGX_BGNLINE: case MGX_BGNSLINE: average_depth = 0.0; prim = &(VVEC(_mgx11c->mysort->prims, mgx11prim)[_mgx11c->mysort->cprim]); if (primtype == MGX_BGNLINE) prim->mykind = PRIM_LINE; else prim->mykind = PRIM_SLINE; prim->index = _mgx11c->mysort->cvert; prim->depth = -100000; /* very far behind the viewer */ numverts = 0; prim->ecolor[0] = ecolor[0]; prim->ecolor[1] = ecolor[1]; prim->ecolor[2] = ecolor[2]; prim->ewidth = curwidth; if (curwidth > maxlinewidth) maxlinewidth = curwidth; VVEC(_mgx11c->mysort->primsort, int)[_mgx11c->mysort->cprim] = _mgx11c->mysort->cprim; if (!(_mgc->has & HAS_S2O)) { mg_findS2O(); mg_findO2S(); } break; case MGX_BGNEPOLY: case MGX_BGNSEPOLY: if (curwidth > maxlinewidth) maxlinewidth = curwidth; case MGX_BGNPOLY: case MGX_BGNSPOLY: average_depth = 0.0; prim = &(VVEC(_mgx11c->mysort->prims, mgx11prim) [_mgx11c->mysort->cprim]); switch(primtype) { case MGX_BGNPOLY: prim->mykind = PRIM_POLYGON; break; case MGX_BGNSPOLY: prim->mykind = PRIM_SPOLYGON; break; case MGX_BGNEPOLY: prim->mykind = PRIM_EPOLYGON; break; case MGX_BGNSEPOLY: prim->mykind = PRIM_SEPOLYGON; break; } prim->ewidth = curwidth; prim->index = _mgx11c->mysort->cvert; prim->depth = -100000; /* very far behind the viewer */ numverts = 0; VVEC(_mgx11c->mysort->primsort, int)[_mgx11c->mysort->cprim] = _mgx11c->mysort->cprim; if (!(_mgc->has & HAS_S2O)) { mg_findS2O(); mg_findO2S(); } break; case MGX_VERTEX: for (i=0; imysort->pverts, CPoint3)[_mgx11c->mysort->cvert]); HPt3Transform(_mgc->O2S, &(vt[i]), (HPoint3 *) vts); vts->drawnext = 1; vts->vcol = color; _mgx11c->mysort->cvert++; numverts++; if (_mgx11c->mysort->cvert > _mgx11c->mysort->pvertnum) { _mgx11c->mysort->pvertnum*=2; vvneeds(&(_mgx11c->mysort->pverts), _mgx11c->mysort->pvertnum); } if (vts->z > prim->depth) { prim->depth = vts->z; } average_depth += vts->z; } break; case MGX_CVERTEX: for (i=0; imysort->pverts, CPoint3)[_mgx11c->mysort->cvert]); HPt3Transform(_mgc->O2S, &(vt[i]), (HPoint3 *) vts); vts->drawnext = 1; vts->vcol = colarray[i]; _mgx11c->mysort->cvert++; numverts++; if (_mgx11c->mysort->cvert > _mgx11c->mysort->pvertnum) { _mgx11c->mysort->pvertnum*=2; vvneeds(&(_mgx11c->mysort->pverts), _mgx11c->mysort->pvertnum); } if (vts->z > prim->depth) { prim->depth = vts->z; } average_depth += vts->z; } break; case MGX_COLOR: color = colarray[0]; break; case MGX_ECOLOR: ecolor[0] = (int)(255.0 * col[0]); ecolor[1] = (int)(255.0 * col[1]); ecolor[2] = (int)(255.0 * col[2]); break; case MGX_END: prim->numvts = numverts; if (numverts > _mgx11c->mysort->maxverts) _mgx11c->mysort->maxverts = numverts; average_depth += prim->depth; average_depth /= (float)(numverts+1); prim->depth = average_depth; prim->color[0] = (int)(255.0 * color.r); prim->color[1] = (int)(255.0 * color.g); prim->color[2] = (int)(255.0 * color.b); prim->ecolor[0] = ecolor[0]; prim->ecolor[1] = ecolor[1]; prim->ecolor[2] = ecolor[2]; if ((prim->mykind = Xmg_primclip(prim)) == PRIM_INVIS) _mgx11c->mysort->cvert = prim->index; else { _mgx11c->mysort->cvert = prim->index + prim->numvts; _mgx11c->mysort->cprim++; } if (_mgx11c->mysort->cprim > _mgx11c->mysort->primnum) { _mgx11c->mysort->primnum*=2; vvneeds(&(_mgx11c->mysort->prims), _mgx11c->mysort->primnum); vvneeds(&(_mgx11c->mysort->primsort), _mgx11c->mysort->primnum); } _mgx11c->xmax += maxlinewidth; _mgx11c->xmin -= maxlinewidth; _mgx11c->ymax += maxlinewidth; _mgx11c->ymin -= maxlinewidth; maxlinewidth = 0; break; default: fprintf(stderr,"unknown type of primitive.\n"); break; } } /* Function: Xmg_primcomp Description: Depth sort by comparing two primitives in a call from qsort() (painters algorithm, no subdiv of polygons) Author: Daeron Meyer */ int Xmg_primcomp(const void *a, const void *b) { mgx11prim *prim = VVEC(_mgx11c->mysort->prims, mgx11prim); if (prim[*(int*)a].depth < prim[*(int*)b].depth) return 1; else return -1; } /* Function: Xmg_sortdisplaylist Description: Does depth sorting of primitives. Author: Daeron Meyer */ void Xmg_sortdisplaylist() { static int *primp; if (_mgx11c->sortmethod == MG_DEPTH) { primp = VVEC(_mgx11c->mysort->primsort, int); qsort(primp, _mgx11c->mysort->cprim, sizeof(int), &Xmg_primcomp); } } static unsigned int byterev(unsigned int v) { return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24); } /* Function: Xmg_showdisplaylist Description: render display list to display Author: Daeron Meyer, Tim Rowley */ void Xmg_showdisplaylist() { CPoint3 *vts; int ref, *primp; mgx11prim *prim, *prim2; Display *dpy = _mgx11c->mgx11display; Drawable win = _mgx11c->myxwin->window; unsigned char *buf = _mgx11c->myxwin->buf; float *zbuf = mgx11zbuffer; int w = _mgx11c->myxwin->width; int h = _mgx11c->myxwin->height; int zwidth = _mgx11c->myxwin->zwidth; GC gc = _mgx11c->myxwin->gc; static int width; static int height; void (*poly)(unsigned char *, float *, int, int, int, CPoint3 *, int, int *); void (*line)(unsigned char *, float *, int, int, int, CPoint3 *, CPoint3 *, int, int *); void (*polyline)(unsigned char *, float *, int, int, int, CPoint3 *, int, int, int *); void (*spolyline)(unsigned char *, float *, int, int, int, CPoint3 *, int, int, int *); void (*spoly)(unsigned char *, float *, int, int, int, CPoint3 *, int, int *); void (*clear)(unsigned char *, float *, int, int, int, int *, int, int, int, int, int, int); int color[3]; int xmin, ymin, xmax, ymax; int wantedzsize; int rmask = _mgx11c->visual->red_mask; int gmask = _mgx11c->visual->green_mask; int bmask = _mgx11c->visual->blue_mask; static int lsb = 1; /* Compare our native byte order to that of the server. * Must we byte-swap images? */ if((*(char *)&lsb != 0) != (XImageByteOrder(_mgx11c->mgx11display) == LSBFirst)) { rmask = byterev(rmask); gmask = byterev(gmask); bmask = byterev(bmask); } /* Choose functions */ if (_mgx11c->bitdepth == 8) { clear = Xmgr_8clear; if (_mgx11c->sortmethod == MG_ZBUFFER) { if (_mgx11c->dither) { poly = Xmgr_8DZpoly; line = Xmgr_8DZline; polyline = Xmgr_8DZpolyline; spolyline = Xmgr_8DGZpolyline; spoly = Xmgr_8DGZpoly; } else { poly = Xmgr_8Zpoly; line = Xmgr_8Zline; spolyline = polyline = Xmgr_8Zpolyline; spoly = Xmgr_8Zpoly; } } else { if (_mgx11c->dither) { poly = Xmgr_8Dpoly; line = Xmgr_8Dline; polyline = Xmgr_8Dpolyline; spolyline = Xmgr_8DGpolyline; spoly = Xmgr_8DGpoly; } else { poly = Xmgr_8poly; line = Xmgr_8line; spolyline = polyline = Xmgr_8polyline; spoly = Xmgr_8poly; } } } else if (_mgx11c->bitdepth == 24) { Xmgr_24fullinit(rmask, gmask, bmask); clear = Xmgr_24clear; if (_mgx11c->sortmethod == MG_ZBUFFER) { poly = Xmgr_24Zpoly; line = Xmgr_24Zline; polyline = Xmgr_24Zpolyline; spolyline = Xmgr_24GZpolyline; spoly = Xmgr_24GZpoly; } else { poly = Xmgr_24poly; line = Xmgr_24line; polyline = Xmgr_24polyline; spolyline = Xmgr_24Gpolyline; spoly = Xmgr_24Gpoly; } } else if (_mgx11c->bitdepth == 16) { Xmgr_16fullinit(rmask, gmask, bmask); clear = Xmgr_16clear; if (_mgx11c->sortmethod == MG_ZBUFFER) { poly = Xmgr_16Zpoly; line = Xmgr_16Zline; polyline = Xmgr_16Zpolyline; spolyline = Xmgr_16GZpolyline; spoly = Xmgr_16GZpoly; } else { poly = Xmgr_16poly; line = Xmgr_16line; polyline = Xmgr_16polyline; spolyline = Xmgr_16Gpolyline; spoly = Xmgr_16Gpoly; } } else if (_mgx11c->bitdepth == 1) { Xmgr_1init(BlackPixel(dpy, DefaultScreen(dpy))); clear = Xmgr_1clear; if (_mgx11c->sortmethod == MG_ZBUFFER) { poly = Xmgr_1DZpoly; line = Xmgr_1DZline; polyline = Xmgr_1DZpolyline; spolyline = Xmgr_1DGZpolyline; spoly = Xmgr_1DGZpoly; } else { poly = Xmgr_1Dpoly; line = Xmgr_1Dline; polyline = Xmgr_1Dpolyline; spolyline = Xmgr_1DGpolyline; spoly = Xmgr_1DGpoly; } } else { fprintf(stderr, "X11(Function Select): Unsupported bit depth %d\n", _mgx11c->bitdepth); return; } if (_mgx11c->sortmethod == MG_ZBUFFER) { wantedzsize = zwidth*h; if (wantedzsize > mgx11zsize) { if (!mgx11zbuffer) zbuf = mgx11zbuffer = (float *)malloc(sizeof(float)*wantedzsize); else zbuf = mgx11zbuffer = (float *)realloc((void *)mgx11zbuffer, sizeof(float)*wantedzsize); mgx11zsize = wantedzsize; } } WnGet(_mgc->win, WN_XSIZE, &width); WnGet(_mgc->win, WN_YSIZE, &height); /* Get dirty rectangle */ if (_mgx11c->xmin < _mgx11c->oxmin) xmin = MIN(width-1,MAX(_mgx11c->xmin,0)); else xmin = MIN(width-1,MAX(_mgx11c->oxmin,0)); if (_mgx11c->ymin < _mgx11c->oymin) ymin = MIN(height-1,MAX(_mgx11c->ymin,0)); else ymin = MIN(height-1,MAX(_mgx11c->oymin,0)); if (_mgx11c->xmax > _mgx11c->oxmax) xmax = MAX(0,MIN(_mgx11c->xmax,width-1)); else xmax = MAX(0,MIN(_mgx11c->oxmax,width-1)); if (_mgx11c->ymax > _mgx11c->oymax) ymax = MAX(0,MIN(_mgx11c->ymax,height-1)); else ymax = MAX(0,MIN(_mgx11c->oymax,height-1)); if (_mgx11c->exposed) { _mgx11c->xmin = _mgx11c->ymin = xmin = ymin = 0; _mgx11c->xmax = xmax = width-1; _mgx11c->ymax = ymax = height-1; _mgx11c->exposed = 0; } if ((_mgc->opts & MGO_INHIBITSWAP) || _mgx11c->noclear) { _mgx11c->xmin = _mgx11c->ymin = xmin = ymin = 0; _mgx11c->xmax = xmax = width-1; _mgx11c->ymax = ymax = height-1; } if (xmin > xmax || ymin > ymax) { /* nothing to be done, just bail out */ return; } color[0] = _mgc->background.r*255.0; color[1] = _mgc->background.g*255.0; color[2] = _mgc->background.b*255.0; if (!_mgx11c->noclear) clear(buf, zbuf, zwidth, w, h, color, (_mgx11c->sortmethod==MG_ZBUFFER), 0, xmin, ymin, xmax, ymax); else _mgx11c->noclear = 0; primp = VVEC(_mgx11c->mysort->primsort, int); prim2 = VVEC(_mgx11c->mysort->prims, mgx11prim); vts = VVEC(_mgx11c->mysort->pverts, CPoint3); for (ref = 0; ref < _mgx11c->mysort->cprim; ref++) { prim = &(prim2[primp[ref]]); switch (prim->mykind) { case PRIM_POLYGON: poly(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->color); break; case PRIM_SPOLYGON: spoly(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->color); break; case PRIM_EPOLYGON: poly(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->color); polyline(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->ewidth, prim->ecolor); if (vts[prim->index+prim->numvts-1].drawnext) line(buf, zbuf, zwidth, w, h, &vts[prim->index+prim->numvts-1], &vts[prim->index], prim->ewidth, prim->ecolor); break; case PRIM_SEPOLYGON: spoly(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->color); polyline(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->ewidth, prim->ecolor); if (vts[prim->index+prim->numvts-1].drawnext) line(buf, zbuf, zwidth, w, h, &vts[prim->index+prim->numvts-1], &vts[prim->index], prim->ewidth, prim->ecolor); break; case PRIM_SLINE: spolyline(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->ewidth, prim->ecolor); break; case PRIM_LINE: polyline(buf, zbuf, zwidth, w, h, vts+prim->index, prim->numvts, prim->ewidth, prim->ecolor); break; case PRIM_INVIS: break; default: break; } } if (!(_mgc->opts & MGO_INHIBITSWAP)) { if (_mgx11c->shm) { XShmPutImage(dpy, win, gc, _mgx11c->myxwin->image, xmin, ymin, xmin, ymin, xmax-xmin+1, ymax-ymin+1, False); } else { XPutImage(dpy, win, gc, _mgx11c->myxwin->image, xmin, ymin, xmin, ymin, xmax-xmin+1, ymax-ymin+1); } } else { _mgx11c->noclear = 1; } Xmg_flush(); } /* Function: Xmg_getwinsize Description: get the new size of the window and reorganize shared memory Author: Daeron Meyer, Tim Rowley */ void Xmg_getwinsize(int *xsize, int *ysize, int *xorig, int *yorig) { Display *dpy = _mgx11c->mgx11display; Window dpyroot; Window Toss; Drawable win; unsigned int width, height, border_width, depth; int xpos, ypos, xold, yold; int bytes_per_line = 0; mgx11win *current=_mgx11c->myxwin; XErrorHandler handler; int bitmap_pad = 0; if(current == NULL) return; win = current->window; /* fprintf(stderr,"X11: Get Window Size\n"); */ if (_mgx11c->visible) { XGetGeometry(dpy, win, &dpyroot, &xpos, &ypos, &width, &height, &border_width, &depth); *xsize = width; *ysize = height; if (_mgx11c->pix) { *xorig = 0; *yorig = 0; } else if (XTranslateCoordinates(dpy, win, dpyroot, 0, height-1, &xpos, &ypos, &Toss)) { *xorig=xpos; *yorig=HeightOfScreen(DefaultScreenOfDisplay(dpy)) - ypos; } else { *xorig = 0; *yorig = 0; } } else { *xsize = 0; *ysize = 0; } WnGet(_mgc->win, WN_XSIZE, &xold); WnGet(_mgc->win, WN_YSIZE, &yold); if (_mgx11c->bitdepth == 0) return; if ((xold != width) || (yold != height) || (_mgx11c->myxwin->image == NULL)) { if (_mgx11c->myxwin->image != NULL) { #ifndef NO_SHM if (_mgx11c->shm) { XShmDetach(dpy, &(_mgx11c->myxwin->shminf)); shmdt(_mgx11c->myxwin->shminf.shmaddr); } #endif /*has SHM*/ XDestroyImage(_mgx11c->myxwin->image); } current->image = NULL; _mgx11c->shm = 0; #ifndef NO_SHM if (XShmQueryExtension(_mgx11c->mgx11display) == True) { current->image = XShmCreateImage(_mgx11c->mgx11display, _mgx11c->visual, _mgx11c->bitdepth, ZPixmap, NULL, &(current->shminf), width, height); bytes_per_line = current->image->bytes_per_line; } if (current->image != NULL) { _mgx11c->shm = 1; /* fprintf(stderr, "X11: shm creating image with depth = %d visual = %p bit_pre_pixel=%d\n", _mgx11c->bitdepth, _mgx11c->visual, current->image->bits_per_pixel); */ current->shminf.shmid = shmget(IPC_PRIVATE, bytes_per_line * height, IPC_CREAT|0777); current->buf = shmat(current->shminf.shmid, NULL, 0); current->shminf.shmaddr = current->image->data = (char *) current->buf; current->shminf.readOnly = True; globalXError = 0; handler = XSetErrorHandler(myXErrorHandler); XShmAttach(_mgx11c->mgx11display, &(current->shminf)); XSync(_mgx11c->mgx11display, False); XSetErrorHandler(handler); shmctl(current->shminf.shmid, IPC_RMID, 0); if (globalXError == 1) { _mgx11c->shm = 0; shmdt(current->shminf.shmaddr); } } #endif /*has SHM*/ if (_mgx11c->shm == 0) { if (!shm_message_shown) { fprintf(stderr, "Shared memory unavailable, using fallback display method.\n"); shm_message_shown = 1; } switch (_mgx11c->bitdepth) { case 1: case 8: bitmap_pad = 8; break; case 16: bitmap_pad = 16; break; case 24: bitmap_pad = 32; break; default: fprintf(stderr, "Unknown bit depth %d\n", _mgx11c->bitdepth); } current->image = XCreateImage(_mgx11c->mgx11display, _mgx11c->visual, _mgx11c->bitdepth, ZPixmap, 0, NULL, width, height, bitmap_pad, 0); if((bytes_per_line = current->image->bytes_per_line) == 0) { int bpp = _mgx11c->bitdepth == 24 ? 32 : _mgx11c->bitdepth; bytes_per_line = ((bpp * width + 31) >> 5) << 2; } current->buf = (unsigned char *) malloc(bytes_per_line * height); current->image->data = (char *)current->buf; } current->width = bytes_per_line; current->height = height; _mgx11c->myxwin->zwidth = width; _mgx11c->exposed = 1; } } /* Function: mgx11_nearestRGB Description: dither RGB pixel at x,y to color index from our colormap Author: Daeron Meyer */ unsigned long mgx11_nearestRGB(int x, int y, int *rgb) { if (!colorlevels) /* handle TrueColor case */ return (unsigned long)0; return dithergb(x, y, rgb, colorlevels); } /* Function: mgx11_RGB Description: get index of color nearest to RGB value, in colormap Author: Daeron Meyer */ unsigned long mgx11_RGB(int r, int g, int b) { int col[3]; if (!colorlevels) /* handle TrueColor case */ return (unsigned long)0; col[0] = r; col[1] = g; col[2] = b; return dithergb(0, 0, col, colorlevels); } /* Function: mgx11_setRGB Description: use reserved colorcell for smooth dynamic color changing. For instance, this function is relied on by the Color Panel in Geomview. Author: Daeron Meyer */ unsigned long mgx11_setRGB(int r, int g, int b) { int cell = colorlevels * colorlevels * colorlevels; if (!colorlevels) /* handle TrueColor case */ return (unsigned long)0; mgx11colorcells[cell].red = (unsigned short)(r * 256); mgx11colorcells[cell].green = (unsigned short)(g * 256); mgx11colorcells[cell].blue = (unsigned short)(b * 256); mgx11colorcells[cell].flags = DoRed | DoGreen | DoBlue; XStoreColor(mgx11display, cmap, &(mgx11colorcells[cell])); return mgx11colors[cell]; } /* Function: mgx11_linewidth Description: set current linewidth Author: Daeron Meyer */ void mgx11_linewidth(short width) { curwidth = (int) width; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/x11/mgx11windows.h0000644000175000001440000000316610455701006015362 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ extern void Xmg_setx11display(Display *dpy); extern int Xmg_initx11device( void ); extern void Xmg_initzrange( void ); extern int Xmg_openwin( char * ); extern void Xmg_setwin( Window ); extern void Xmg_setparent( Window ); extern void Xmg_poswin(int, int, int, int); extern void Xmg_prefposwin(int, int, int, int); extern void Xmg_sizewin(int, int); extern void Xmg_minsize(int, int); extern void Xmg_winconstrain(); extern void Xmg_titlewin(char *); extern void Xmg_closewin( mgx11win * ); extern void Xmg_flush( void ); extern void Xmg_newdisplaylist( void ); extern void Xmg_sortdisplaylist( void ); extern void Xmg_add(int, int, void *, void *); extern void Xmg_showdisplaylist( void ); extern void Xmg_getwinsize( int *, int *, int *, int * ); geomview-1.9.4/src/lib/mg/x11/mgx11clip.c0000644000175000001440000001631010462406736014617 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgx11P.h" #define WCLIPPLANE 0.001 /* This is as close as we get to the eyeplane */ #define XLEFTCLIP 0.0 #define XRIGHTCLIP 1.0 #define YTOPCLIP 0.0 #define YBOTTOMCLIP 1.0 #define ZNEARCLIP (-1.0) #define ZFARCLIP 1.0 static int xyz[6], clipvertnum = 0; static mgx11prim *prim1, *prim2, *primtemp; static CPoint3 *vts1, *vts2, *vtstemp; /* Function: Xmg_dividew() Description: Divide out w coordinate (*after* clipping against WCLIPPLANE) Author: Daeron Meyer */ int Xmg_dividew(void) { CPoint3 *curr; float w; int n; for (n = 0; n < prim1->numvts; n++) { curr = &(vts1[n]); w = curr->w; curr->x /= w; curr->y /= w; curr->z /= w; curr->z += _mgx11c->znudgeby; if (curr->x < XLEFTCLIP) xyz[0]++; if (curr->x >= (float)_mgx11c->myxwin->zwidth - XRIGHTCLIP) xyz[1]++; if (curr->y < YTOPCLIP) xyz[2]++; if (curr->y >= (float)_mgx11c->myxwin->height - YBOTTOMCLIP) xyz[3]++; if (curr->z < ZNEARCLIP) xyz[4]++; if (curr->z >= ZFARCLIP) xyz[5]++; /* create a "dirty" rectangle */ if (!_mgx11c->exposed) { if (curr->x < _mgx11c->xmin) _mgx11c->xmin = curr->x; if (curr->y < _mgx11c->ymin) _mgx11c->ymin = curr->y; if (curr->x > _mgx11c->xmax) _mgx11c->xmax = curr->x; if (curr->y > _mgx11c->ymax) _mgx11c->ymax = curr->y; } } return 0; } /* Function: Xmg_cliptoplane() Description: Clip polygon against a coordinate axis plane Author: Daeron Meyer */ int Xmg_cliptoplane(int coord, float plane, float sign) { CPoint3 *prev, *curr, *dest; float i, i1, i2, *c1, *p1, *d1; int n; #ifdef DEBUGCLIP fprintf(stderr, "Clip %d, plane=%f, sign=%f\n", coord, plane, sign); #endif prim2->numvts = 0; prev = &(vts1[prim1->numvts - 1]); i1 = sign * ((float *) prev) [coord] - plane; for (curr=vts1, n=prim1->numvts; n > 0; n--, prev=curr, i1=i2, curr++) { i2 = sign * ((float *) curr) [coord] - plane; if ((i1 <= 0.0) ^ (i2 <= 0.0)) { i = i1/(i1 - i2); dest = &(vts2[prim2->numvts]); dest->x = prev->x + i * (curr->x - prev->x); dest->y = prev->y + i * (curr->y - prev->y); dest->z = prev->z + i * (curr->z - prev->z); dest->w = prev->w + i * (curr->w - prev->w); if ((i1 <= 0.0) || (prev->drawnext == 0)) dest->drawnext = 0; else dest->drawnext = 1; c1 = (float *) &(curr->vcol); p1 = (float *) &(prev->vcol); d1 = (float *) &(dest->vcol); d1[0] = p1[0] + i * (c1[0] - p1[0]); d1[1] = p1[1] + i * (c1[1] - p1[1]); d1[2] = p1[2] + i * (c1[2] - p1[2]); d1[3] = p1[3] + i * (c1[3] - p1[3]); prim2->numvts++; } if (i2 <= 0.0) { vts2[prim2->numvts] = *curr; prim2->numvts++; } } #ifdef DEBUGCLIP for (n = 0; n < prim2->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts2[n].x, vts2[n].y, vts2[n].z, vts2[n].w, vts2[n].drawnext); } #endif return 0; } /* Function: Xmg_primclip() Description: Clip a polygon to fit in the viewing volume Author: Daeron Meyer */ int Xmg_primclip(mgx11prim *aprim) { static mgx11prim clip; static int mykind, n; static vvec clipverts; static int intersectw; xyz[0]=0; xyz[1]=0; xyz[2]=0; xyz[3]=0; xyz[4]=0; xyz[5]=0; /* give ourselves more space for vertex data if needed */ if ((aprim->numvts * 2) > clipvertnum) { if (!clipvertnum) VVINIT(clipverts, CPoint3, clipvertnum); clipvertnum = aprim->numvts * 2; vvneeds(&clipverts, clipvertnum); } /* We might need more space for the final polygon since clipping can produce a polygon with more vertices than it had to begin with. We'll err on the side of safety: */ if ((_mgx11c->mysort->cvert + aprim->numvts) > _mgx11c->mysort->pvertnum) { _mgx11c->mysort->pvertnum *= 2; vvneeds(&(_mgx11c->mysort->pverts), _mgx11c->mysort->pvertnum); } mykind = aprim->mykind; prim1 = aprim; prim2 = &clip; vts1 = &(VVEC(_mgx11c->mysort->pverts, CPoint3)[prim1->index]); vts2 = &(VVEC(clipverts, CPoint3)[0]); if ((mykind==PRIM_LINE) || (mykind==PRIM_SLINE)) vts1[prim1->numvts-1].drawnext = 0; prim2->index = 0; prim2->numvts = prim1->numvts; #define CLIP_POLYS_AND_SWAP(a, b, c) { \ Xmg_cliptoplane(a, b, c); \ if (prim2->numvts == 0) { aprim->numvts = 0; return PRIM_INVIS; } \ vtstemp = vts2; vts2 = vts1; vts1 = vtstemp; \ primtemp = prim2; prim2 = prim1; prim1 = primtemp; \ } #ifdef DEBUGCLIP fprintf(stderr, "BEGIN-CLIP\n"); fprintf(stderr, "INITIAL POLY:\n"); for (n=0; n < aprim->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts1[n].x, vts1[n].y, vts1[n].z, vts1[n].w, vts1[n].drawnext); } fprintf(stderr,"===========================\n"); #endif intersectw = 0; for (n = 0; (n < aprim->numvts) && !intersectw; n++) { if (vts1[n].w < WCLIPPLANE) intersectw = 1; } if (intersectw) CLIP_POLYS_AND_SWAP(3, -WCLIPPLANE, -1.0); Xmg_dividew(); n = prim1->numvts; if (!intersectw && (xyz[0]+xyz[1]+xyz[2]+xyz[3]+xyz[4]+xyz[5] == 0)) return mykind; else if (xyz[0] == n || xyz[1] == n || xyz[2] == n || xyz[3] == n || xyz[4] == n || xyz[5] == n) return PRIM_INVIS; if (xyz[0]) CLIP_POLYS_AND_SWAP(0, -XLEFTCLIP, -1.0); if (xyz[1]) CLIP_POLYS_AND_SWAP(0, (float)_mgx11c->myxwin->zwidth-XRIGHTCLIP, 1.0); if (xyz[2]) CLIP_POLYS_AND_SWAP(1, -YTOPCLIP, -1.0); if (xyz[3]) CLIP_POLYS_AND_SWAP(1, (float)_mgx11c->myxwin->height-YBOTTOMCLIP, 1.0); if (xyz[4]) CLIP_POLYS_AND_SWAP(2, -ZNEARCLIP, -1.0); if (xyz[5]) CLIP_POLYS_AND_SWAP(2, ZFARCLIP, 1.0); if (aprim == prim2) /* If the vertex data ended up in the local vertex list, then we need to copy it back to the global vertex list */ { prim2->numvts = prim1->numvts; /* for (n=0; n < aprim->numvts; n++) { vts2[n] = vts1[n]; } */ bcopy(vts1, vts2, sizeof(CPoint3) * prim1->numvts); } #ifdef DEBUGCLIP fprintf(stderr, "FINAL POLY:\n"); for (n=0; n < aprim->numvts; n++) { fprintf(stderr, "%f, %f, %f, %f: %d\n", vts1[n].x, vts1[n].y, vts1[n].z, vts1[n].w, vts1[n].drawnext); } fprintf(stderr, "END-CLIP\n"); #endif return mykind; } geomview-1.9.4/src/lib/mg/x11/mgx11draw.c0000644000175000001440000004355610622716757014646 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mgP.h" #include "mgx11P.h" #include "polylistP.h" #include "mgx11windows.h" /* Author: Daeron Meyer */ void mgx11_polygon( int nv, HPoint3 *v, int nn, Point3 *n, int nc, ColorA *c ); void mgx11_mesh(int wrap, int nu, int nv, HPoint3 *p, Point3 *n, Point3 *nq, ColorA *c ); void mgx11_line( HPoint3 *p1, HPoint3 *p2 ); void mgx11_polyline( int nv, HPoint3 *verts, int nc, ColorA *colors, int wrap ); void mgx11_polylist( int np, Poly *p, int nv, Vertex *v, int pl_flags ); void mgx11_drawnormal(HPoint3 *p, Point3 *n); void mgx11_closer(); void mgx11_farther(); static ColorA *C2; /*----------------------------------------------------------------------- * Function: mgx11_polygon * Description: draw a polygon * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgx11_polygon(int nv, HPoint3 *V, int nn, Point3 *N, int nc, ColorA *C) { int count; HPoint3 *v; Point3 *n; int flag, ninc, smooth; /* fprintf(stderr,"X11: draw a polygon\n"); */ flag = _mgc->astk->ap.flag; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) nc = 0; ninc = (nn > 1); smooth = IS_SMOOTH(_mgc->astk->ap.shading); /* fprintf(stderr,"cinc = %d, nc = %d, nn = %d\n", cinc, nc, nn); */ if (nc == 0) C = (ColorA*)&_mgc->astk->ap.mat->diffuse; if ((flag & APF_FACEDRAW) && (flag & APF_EDGEDRAW)) { /* put polygon in display list */ if (smooth && (nc > 0)) Xmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else Xmg_add(MGX_BGNEPOLY, 0, NULL, NULL); Xmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); /* edge color */ Xmg_add(MGX_COLOR, 0, NULL, C); /* face color */ if (smooth) Xmg_add(MGX_CVERTEX, nv, V, C); else Xmg_add(MGX_VERTEX, nv, V, NULL); Xmg_add(MGX_END, 0, NULL, NULL); } else if (flag & APF_FACEDRAW) { /* put polygon in display list */ if (smooth) Xmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else Xmg_add(MGX_BGNPOLY, 0, NULL, NULL); Xmg_add(MGX_COLOR, 0, NULL, C); if (smooth && (nc > 0)) Xmg_add(MGX_CVERTEX, nv, V, C); else Xmg_add(MGX_VERTEX, nv, V, NULL); Xmg_add(MGX_END, 0, NULL, NULL); } else if (flag & APF_EDGEDRAW) { Xmg_add(MGX_BGNLINE, 0, NULL, NULL); Xmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); Xmg_add(MGX_VERTEX, nv, V, NULL); Xmg_add(MGX_VERTEX, 1, V, NULL); Xmg_add(MGX_END, 0, NULL, NULL); } if (flag & APF_NORMALDRAW) { mgx11_closer(); Xmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->normalcolor); for (n = N, v = V, count = 0; count 1) * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgx11_fatpoint(HPoint3 *v) { HPoint3 a; HPoint3 *p, *q; float vw; /* fprintf(stderr,"X11: make a fat-point\n"); */ if (!(_mgc->has & HAS_POINT)) mg_makepoint(); /* Compute w component of point after projection to screen */ vw = v->x * _mgc->O2S[0][3] + v->y * _mgc->O2S[1][3] + v->z * _mgc->O2S[2][3] + v->w * _mgc->O2S[3][3]; if (vw <= 0) return; #define PUT(p) \ a.x = v->x + p->x*vw; a.y = v->y + p->y*vw; \ a.z = v->z + p->z*vw; a.w = v->w + p->w*vw; \ Xmg_add(MGX_VERTEX, 1, &a, NULL); p = VVEC(_mgc->point, HPoint3); q = p + VVCOUNT(_mgc->point); Xmg_add(MGX_BGNPOLY, 0, NULL, NULL); do { PUT(p); } while (++p < q); Xmg_add(MGX_END, 0, NULL, NULL); } /*----------------------------------------------------------------------- * Function: mgx11_polyline * Description: draw a polyline (possibly more than 2 vertices) * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgx11_polyline( int nv, HPoint3 *v, int nc, ColorA *c, int wrapped ) { int remain; /* fprintf(stderr,"X11: draw a polyline\n"); */ if (!(wrapped & 2)) { if (_mgx11c->znudge) mgx11_closer(); } if (nv == 1) { if (nc > 0) Xmg_add(MGX_ECOLOR, 0, NULL, c); if (_mgc->astk->ap.linewidth > 1) { Xmg_add(MGX_COLOR, 0, NULL, c); mgx11_fatpoint(v); } else { Xmg_add(MGX_BGNSLINE, 0, NULL, NULL); Xmg_add(MGX_CVERTEX, 1, v, c); Xmg_add(MGX_END, 0, NULL, NULL); } } else if (nv > 0) { Xmg_add(MGX_BGNSLINE, 0, NULL, NULL); if (wrapped & 1) { if (nc > 0) { Xmg_add(MGX_ECOLOR, 0, NULL, (c + nc - 1)); Xmg_add(MGX_CVERTEX, 1, (v + nv - 1), (c + nc - 1)); } else Xmg_add(MGX_CVERTEX, 1, (v + nv - 1), c); } for (;;) { remain = nv > 254 ? 254 : nv; nv -= remain; do { if (--nc > 0) { Xmg_add(MGX_ECOLOR, 0, NULL, c); Xmg_add(MGX_CVERTEX, 1, v++, c++); } else Xmg_add(MGX_CVERTEX, 1, v++, c); } while (--remain > 0); if (nv == 0) break; if (nc > 0) Xmg_add(MGX_ECOLOR, 0, NULL, c); Xmg_add(MGX_CVERTEX, 1, v, c); Xmg_add(MGX_END, 0, NULL, NULL); Xmg_add(MGX_BGNSLINE, 0, NULL, NULL); } Xmg_add(MGX_END, 0, NULL, NULL); } if (!(wrapped & 4) && _mgx11c->znudge) mgx11_farther(); } /*----------------------------------------------------------------------- * Function: mgx11_polylist * Description: draws a Polylist: collection of Polys * Author: Daeron Meyer * Notes: see mg.doc */ void mgx11_polylist( int np, Poly *_p, int nv, Vertex *V, int pl_flags ) { int i, j; Poly *p; Vertex **v, *vp, **vh; struct mgastk *ma = _mgc->astk; int plflags = pl_flags; int flag, shading; int nonsurf = -1; flag = ma->ap.flag; shading = ma->ap.shading; /* fprintf(stderr,"X11: draw a polylist %d\n",np); */ switch(shading) { case APF_FLAT: plflags &= ~PL_HASVN; if (plflags & PL_HASPCOL) { plflags &= ~PL_HASVCOL; } break; case APF_SMOOTH: plflags &= ~PL_HASPN; break; case APF_VCFLAT: plflags &= ~PL_HASVN; break; default: plflags &= ~(PL_HASVN|PL_HASPN); break; } if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) plflags &= ~(PL_HASVCOL | PL_HASPCOL); if (flag & APF_FACEDRAW) { for (p = _p, i = 0; i < np; i++, p++) { v = p->v; if ((j = p->n_vertices) <= 2) nonsurf = i; else { if (flag & APF_EDGEDRAW) { if (shading == APF_FLAT || shading == APF_CONSTANT) { Xmg_add(MGX_BGNEPOLY, 0, NULL, NULL); } else if (plflags & PL_HASVCOL) { Xmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); } else { Xmg_add(MGX_BGNEPOLY, 0, NULL, NULL); } Xmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); } else { if (shading == APF_FLAT || shading == APF_CONSTANT) { Xmg_add(MGX_BGNPOLY, 0, NULL, NULL); } else if (plflags & PL_HASVCOL) { Xmg_add(MGX_BGNSPOLY, 0, NULL, NULL); } else { Xmg_add(MGX_BGNPOLY, 0, NULL, NULL); } } if (plflags & PL_HASPCOL) Xmg_add(MGX_COLOR, 0, NULL, &p->pcol); else if (plflags & PL_HASVCOL) /* if we have per vertex */ Xmg_add(MGX_COLOR, 0, NULL, &(*v)->vcol); else Xmg_add(MGX_COLOR, 0, NULL, &(ma->ap.mat->diffuse)); vh = v; do { if (plflags & PL_HASVCOL) { Xmg_add(MGX_CVERTEX, 1, &(*v)->pt, &(*v)->vcol); } else { Xmg_add(MGX_CVERTEX, 1, &(*v)->pt, &(*vh)->vcol); } v++; } while (--j > 0); Xmg_add(MGX_END, 0, NULL, NULL); } } } if (flag & (APF_EDGEDRAW | APF_NORMALDRAW) || nonsurf > 0) { if (_mgx11c->znudge) mgx11_closer(); if (flag & APF_EDGEDRAW && !(flag & APF_FACEDRAW)) { Xmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->edgecolor); for (p = _p, i = 0; i < np; i++, p++) { Xmg_add(MGX_BGNLINE, 0, NULL, NULL); for (j = 0, v = p->v; j < p->n_vertices; j++, v++) Xmg_add(MGX_VERTEX, 1, &(*v)->pt, NULL); Xmg_add(MGX_VERTEX, 1, &(*(p->v))->pt, NULL); Xmg_add(MGX_END, 0, NULL, NULL); } } if (flag & APF_NORMALDRAW) { Xmg_add(MGX_ECOLOR, 0, NULL, &_mgc->astk->ap.mat->normalcolor); if (pl_flags & PL_HASPN) { for (p = _p, i = 0; i < np; i++, p++) { for (j = 0, v = p->v; j < p->n_vertices; j++, v++) mgx11_drawnormal(&(*v)->pt, &p->pn); } } else if (pl_flags & PL_HASVN) { for (vp = V, i = 0; i < nv; i++, vp++) mgx11_drawnormal(&vp->pt, &vp->vn); } } for (p = _p, i = 0; i <= nonsurf; p++, i++) { v = p->v; switch (j = p->n_vertices) { case 1: Xmg_add(MGX_BGNLINE, 0, NULL, NULL); if (pl_flags & PL_HASVCOL) Xmg_add(MGX_ECOLOR, 0, NULL, &(*v)->vcol); Xmg_add(MGX_VERTEX, 1, &(*v)->pt, NULL); Xmg_add(MGX_END, 0, NULL, NULL); break; case 2: Xmg_add(MGX_BGNLINE, 0, NULL, NULL); do { if (pl_flags & PL_HASVCOL) Xmg_add(MGX_ECOLOR, 0, NULL, &(*v)->vcol); Xmg_add(MGX_VERTEX, 1, &(*v)->pt, NULL); v++; } while (--j > 0); Xmg_add(MGX_END, 0, NULL, NULL); break; } } if (_mgx11c->znudge) mgx11_farther(); } } #define HAS_N 1 #define HAS_C 2 #define HAS_SMOOTH 4 /*----------------------------------------------------------------------- * Function: mgx11polymeshrow * Description: draw one row of a mesh * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgx11polymeshrow(int wrap, int has, int off, int count, HPoint3 *P, Point3 *N, ColorA *C, int flag, float *CE, int first) { int k; int edges = flag & APF_EDGEDRAW; int faces = flag & APF_FACEDRAW; if (wrap & MM_UWRAP) { k = count - 1; if (edges && faces) { if (has & HAS_SMOOTH) Xmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else Xmg_add(MGX_BGNEPOLY, 0, NULL, NULL); Xmg_add(MGX_ECOLOR, 0, NULL, CE); } else if (faces) { if (has & HAS_SMOOTH) Xmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else Xmg_add(MGX_BGNPOLY, 0, NULL, NULL); } else { Xmg_add(MGX_BGNLINE, 0, NULL, NULL); Xmg_add(MGX_ECOLOR, 0, NULL, CE); } if (C) { Xmg_add(MGX_COLOR, 0, NULL, C+off+k); C2 = C+off+k; } else Xmg_add(MGX_COLOR, 0, NULL, C2); if (has & HAS_SMOOTH) { if (C) { Xmg_add(MGX_CVERTEX, 1, P+off+k, C+off+k); Xmg_add(MGX_CVERTEX, 1, P+k, C+k); Xmg_add(MGX_CVERTEX, 1, P, C); Xmg_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C+off; } else { Xmg_add(MGX_CVERTEX, 1, P+off+k, C2); Xmg_add(MGX_CVERTEX, 1, P+k, C2); Xmg_add(MGX_CVERTEX, 1, P, C2); Xmg_add(MGX_CVERTEX, 1, P+off, C2); } } else { Xmg_add(MGX_VERTEX, 1, P+off+k, NULL); Xmg_add(MGX_VERTEX, 1, P+k, NULL); Xmg_add(MGX_VERTEX, 1, P, NULL); Xmg_add(MGX_VERTEX, 1, P+off, NULL); } Xmg_add(MGX_END, 0, NULL, NULL); } k = count; do { if (edges && faces) { if (has & HAS_SMOOTH) Xmg_add(MGX_BGNSEPOLY, 0, NULL, NULL); else Xmg_add(MGX_BGNEPOLY, 0, NULL, NULL); Xmg_add(MGX_ECOLOR, 0, NULL, CE); } else if (faces) { if (has & HAS_SMOOTH) Xmg_add(MGX_BGNSPOLY, 0, NULL, NULL); else Xmg_add(MGX_BGNPOLY, 0, NULL, NULL); } else { Xmg_add(MGX_BGNLINE, 0, NULL, NULL); Xmg_add(MGX_ECOLOR, 0, NULL, CE); /* ADDED */ if (first) Xmg_add(MGX_VERTEX, 1, P+1+off, NULL); /* END */ } if (C) { Xmg_add(MGX_COLOR, 0, NULL, C+off); C2 = C+off; } if (has & HAS_SMOOTH) { if (C) { Xmg_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C; } else Xmg_add(MGX_CVERTEX, 1, P+off, C2); if (C) { Xmg_add(MGX_CVERTEX, 1, P++, C++); C2 = C; } else Xmg_add(MGX_CVERTEX, 1, P++, C2); if (C) { Xmg_add(MGX_CVERTEX, 1, P, C); C2 = C; } else Xmg_add(MGX_CVERTEX, 1, P, C2); if (C) { Xmg_add(MGX_CVERTEX, 1, P+off, C+off); C2 = C; } else Xmg_add(MGX_CVERTEX, 1, P+off, C2); } else { Xmg_add(MGX_VERTEX, 1, P+off, NULL); if (C) C++; if (N) N++; Xmg_add(MGX_VERTEX, 1, P++, NULL); Xmg_add(MGX_VERTEX, 1, P, NULL); Xmg_add(MGX_VERTEX, 1, P+off, NULL); } Xmg_add(MGX_END, 0, NULL, NULL); } while (--k > 1); } /*----------------------------------------------------------------------- * Function: mgx11submesh * Description: divide up mesh and draw by rows * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgx11submesh(int wrap, int nu, int nv, int umin, int umax, int vmin, int vmax, HPoint3 *meshP, Point3 *meshN, ColorA *meshC) { int v; int ucnt; HPoint3 *P; Point3 *N; ColorA *C; int prev; int du; int i; int has; Appearance *ap; if (nu <= 0 || nv <= 0) return; ap = &_mgc->astk->ap; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) meshC = 0; has = 0; if (meshN && !(_mgc->astk->flags & MGASTK_SHADER)) has = HAS_N; if (meshC) has |= HAS_C; if (IS_SMOOTH(ap->shading)) has |= HAS_SMOOTH; if ( ap->flag & (APF_FACEDRAW | APF_EDGEDRAW) ) /* BUG? */ { if (!(has & HAS_C)) Xmg_add(MGX_COLOR, 0, NULL, &ap->mat->diffuse); C2 = (ColorA *) &ap->mat->diffuse; v = vmax - vmin + 1; du = umin + vmin * nu; if (wrap & MM_VWRAP) { prev = nu * (v - 1); } else { du += nu; prev = -nu; v--; } do { P = meshP + du; N = meshN + du; C = meshC + du; ucnt = umax - umin + 1; mgx11polymeshrow(wrap, has, prev, ucnt, P, has & HAS_N ? N : NULL, has & HAS_C ? C : NULL, ap->flag, (float *)&ap->mat->edgecolor, (int)(v!=1)); prev = -nu; du += nu; } while (--v > 0); } if (ap->flag & APF_NORMALDRAW && meshN != NULL) { Xmg_add(MGX_ECOLOR, 0, NULL, &ap->mat->normalcolor); if (_mgx11c->znudge) mgx11_closer(); for (i = nu*nv, P = meshP, N = meshN; --i >= 0; P++, N++) mgx11_drawnormal(P, N); if (_mgx11c->znudge) mgx11_farther(); } } /*----------------------------------------------------------------------- * Function: mgx11_mesh * Description: draw a mesh * Author: Daeron Meyer * Notes: See mg.doc. * */ void mgx11_mesh(int wrap, int nu, int nv, HPoint3 *P, Point3 *N, Point3 *NQ, ColorA *C ) { mgx11submesh( wrap, nu, nv, 0, nu-1, 0, nv-1, P, N, C); } /*-----------------------------------------------------------------------* * end of mesh drawing functions: * *-----------------------------------------------------------------------*/ /* * Z-shift routines: for moving edges closer than faces, etc. */ void mgx11_init_zrange() { _mgx11c->znudge = 1; _mgx11c->znudgeby = 0.0; } void mgx11_closer() { /* _mgx11c->znudgeby = 0.001; */ } void mgx11_farther() { _mgx11c->znudgeby = 0.0; } void mgx11_findcam() { } /* There is a basic problem now with 4-d points and 3-d normal vectors. For now, we'll just ignore the 4-th coordinate of the point when computing the tip of the normal vector. This will work OK with all existing models, but for genuine 4-d points it won't work. But, come to think of it, what is the correct interpretation of the normal vector when the points live in 4-d? */ void mgx11_drawnormal(HPoint3 *p, Point3 *n) { Point3 tp; HPoint3 end; HPt3Coord scale, w, s; /* fprintf(stderr,"X11: draw a normal\n"); */ if (p->w <= 0.0) { return; } if (p->w != 1) { HPt3ToPt3(p, &tp); p = (HPoint3 *)(void *)&tp; } scale = _mgc->astk->ap.nscale; if (_mgc->astk->ap.flag & APF_EVERT) { HPoint3 *cp = &_mgc->cpos; if (!(_mgc->has & HAS_CPOS)) { mg_findcam(); } if ((w = cp->w) != 1.0 && w != 0.0) { s = (p->x*w-cp->x)*n->x + (p->y*w-cp->y)*n->y + (p->z*w-cp->z)*n->z; } else { s = (p->x-cp->x)*n->x + (p->y-cp->y)*n->y + (p->z-cp->z)*n->z; } if (s > 0) { scale = -scale; } } end.x = p->x + scale*n->x; end.y = p->y + scale*n->y; end.z = p->z + scale*n->z; end.w = 1.0; Xmg_add(MGX_BGNLINE, 0, NULL, NULL); Xmg_add(MGX_VERTEX, 1, p, NULL); Xmg_add(MGX_VERTEX, 1, &end, NULL); Xmg_add(MGX_END, 0, NULL, NULL); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/x11/Headers0000644000175000001440000000013307730240163014132 00000000000000mgx11.h mgx11P.h mgx11render1.h mgx11render16.h mgx11render8.h mgx11shade.h mgx11windows.h geomview-1.9.4/src/lib/mg/mgP.h0000644000175000001440000000161010455701006013114 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ geomview-1.9.4/src/lib/mg/mg.attr0000644000175000001440000000753307730237773013552 00000000000000 MG context attributes mbp Tue Sep 17 21:39:28 1991 Attribute Set Value Get Value --------- --------- --------- MG_SHOW int visible int *visible ------- ----------- ------------ Set: visible = 1 means the context's window should be made visible if it is not already, and visible = 0 means the window should be made to disappear. When a context is created, the default value for MG_SHOW is 1, which causes the window to appear in the call to mgctxcreate. To prevent this, you must explicity set MG_SHOW to 0, and then use mgctxset to set MG_SHOW to 1 when you want the window to appear. Get: visible = 1 means window is currently visible; 0 means it is currently not visible. MG_APPEAR Appearance *ap Appearance **ap --------- -------------- -------------- Set: app is a pointer to an Appearance structure as returned by ApCreate. app is copied into the current context and becomes the current appearance. This is a deep copy. This is equivalent to mgsetappearance(ap, MG_SET). Get: *ap is set to point to the current appearance. This should NOT be modified in any way! MG_ApSet NA --------- ---------------- -- Set: is a list of AP_ attribute-value pairs, as to ApSet(), terminated by AP_END. These attributes are merged into the current appearance. This is equivalent to ap = ApCreate( ); mgsetappearance(ap, MG_MERGE); ApDelete(ap); Get: Not gettable. MG_WINDOW WnWindow *win WnWindow **win --------- ------------- -------------- Set: win is a pointer to a WnWindow structure as returned by WnCreate(). This window becomes the context's window. Get: *win is set to point to the context's window structure. MG_WinSet NA --------- ---------------- -- Set: is a list of WN_ attribute-value pairs, as to WnSet(), terminated by WN_END. These attributes are applied to the context's window. This is equivalent to calling WnSet(win, ), where win is a pointer to the context's window. Get: Not gettable. MG_CAMERA Camera *cam Camera **cam --------- ----------- ------------ Set: cam is a pointer to Camera structure as returned by CamCreate(). This camera becomes the context's camera. Get: *cam is set to point to the context's camera structure. MG_CamSet NA --------- ---------------- -- Set: is a list of CAM_ attribute-value pairs, as to CamSet(), terminated by CAM_END. These attributes are applied to the context's camera. This is equivalent to calling CamSet(cam, ), where cam is a pointer to the context's camera. Get: Not gettable. MG_PARENT mgcontext *ctx mgcontext **ctx --------- -------------- --------------- Set: ctx is the ctx of the parent window. May be used in some heirarchal window systems. Get: *ctx is set to point to the ctx of the parent window. MG_SETOPTIONS int optionmask int *optionmask ------------- -------------- --------------- Set: optionmask should be a bitwise "or" (|) of any the following: MGO_DOUBLEBUFFER MGO_HIDDEN MGO_BACKFACECULL MGO_INHIBITBACKGROUND MGO_INHIBITCLEAR MGO_INHIBITSWAP The corresponding options are turned on. Get: *optionmask is set to a bitwise "or" (|) of all currently enabled options. MG_UNSETOPTIONS int optionmask int *optionmask --------------- -------------- --------------- Set: exactly analogous to MG_SETOPTIONS, except that the options in optionmask are turned off. Get: (same as with MG_SETOPTIONS) MG_BACKGROUND ColorA *color ColorA *color ------------- ------------- ------------- Set: *color becomes the context's background color. A private internal copy of *color is kept. Get: The context's background color is copied to *color. geomview-1.9.4/src/lib/mg/common/0000777000175000001440000000000010665240676013614 500000000000000geomview-1.9.4/src/lib/mg/common/mg.c0000644000175000001440000010252210622716756014301 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * $Id: mg.c,v 1.19 2007/05/16 19:38:06 rotdrop Exp $ * Machine-independent part of MG library. * Initialization, common code, and some mgcontext maintenance. * * These are the common versions of MG functions (see mg.doc for * details). The header comment for each common function includes an * entry labeled "DEVICE USE" which describes the way in which the * device version of the same function is expected to call the common * version. * * See mg.doc for more information about these functions. */ #include "mgP.h" extern struct mgfuncs mgnullfuncs; /* Forward */ mgcontext *_mgc = NULL; mgcontext *_mgclist = NULL; static struct mgastk *mgafree = NULL; static struct mgastk *mgatfree = NULL; /* tagged free-list */ static struct mgxstk *mgxfree = NULL; static struct mgtxstk *mgtxfree = NULL; #define MGC _mgc /* * mgcurrentcontext() returns a pointer to the currently-selected context, * for use in a later call to mgctxselect(). * Returns NULL if no context is selected. */ mgcontext * mgcurrentcontext(void) { return _mgc; } /*----------------------------------------------------------------------- * Function: mgdevice_NULL * Description: select the NULL device as the current MG device * Returns: 1 * Author: slevy (doc by mbp) * Date: Thu Sep 19 10:36:21 1991 * Notes: */ int mgdevice_NULL(void) { if (MGC != NULL && MGC->devno != MGD_NULL) MGC = NULL; _mgf = mgnullfuncs; return 1; } /*----------------------------------------------------------------------- * Function: mg_newcontext * Description: initialize an mgcontext structure * Args: mgc: ptr to context structure to initialize * Returns: mgc * Author: slevy (doc by mbp) * Date: Wed Sep 18 16:42:52 1991 * DEVICE USE: required --- mgxx_ctxcreate() should call this immediately * after allocating a new mgcontext structure. * Notes: Further device-specific initialization is normally required. */ mgcontext *mg_newcontext(mgcontext *mgc) { memset((char *)mgc, 0, sizeof(*mgc)); RefInit((Ref *)mgc, MGCONTEXTMAGIC); mgc->shown = 1; mgc->win = WnCreate(WN_NAME, "minnegraphics", WN_END); mgc->cam = CamCreate( CAM_END ); mgc->background.r = 0.0; mgc->background.g = 0.0; mgc->background.b = 0.0; mgc->background.a = 1.0; mgc->bgimage = NULL; /* initialize appearance stack */ { struct mgastk *ma; mgc->astk = ma = OOGLNewE(struct mgastk, "mg appearance stack"); memset((char *)ma, 0, sizeof(*ma)); /* Sets next = NULL, *_seq = 0 */ MtDefault(&(ma->mat)); LmDefault(&(ma->lighting)); ApDefault(&(ma->ap)); ma->ap.mat = &(ma->mat); ma->ap.lighting = &(ma->lighting); ma->flags |= MGASTK_ACTIVE; RefInit((Ref *)ma, 'a'); } /* initialize transform stack */ { struct mgxstk *mx; mgc->xstk = mx = OOGLNewE(struct mgxstk, "mg transform stack"); mx->next = NULL; TmIdentity(mx->T); mx->xfm_seq = mx->hasinv = 0; } /* initialize texture transform stack */ { mgc->txstk = OOGLNewE(struct mgtxstk, "mg texture transform stack"); mgc->txstk->next = NULL; TmIdentity(mgc->txstk->T); } mgc->opts = MGO_HIDDEN|MGO_DOUBLEBUFFER; mgc->devno = MGD_NODEV; /* Device-specific init should change this */ TmIdentity(mgc->W2C); TmIdentity(mgc->C2W); TmIdentity(mgc->W2S); TmIdentity(mgc->S2W); TmIdentity(mgc->O2S); TmIdentity(mgc->S2O); mgc->space = TM_EUCLIDEAN; mgc->NDctx = NULL; VVINIT(mgc->point, HPoint3, 7); mgc->winchange = NULL; mgc->winchangeinfo = NULL; mgc->ap_min_tag = mgc->mat_min_tag = mgc->light_min_tag = ~0; mgc->next = _mgclist; _mgclist = mgc; return mgc; } int mg_appearancebits( Appearance *ap, int mergeflag, int *valid, int *flag ) { Appearance *dst; if (!_mgc->astk) { OOGLError(0,"mg_appearanceflags: no global context"); return 0; } dst = &(_mgc->astk->ap); /* Mask of fields to change in dst */ if (ap == NULL) { *valid = dst->valid; *flag = dst->flag; mergeflag = MG_MERGE; } else { *valid = ap->valid; *flag = ap->flag; } if (mergeflag == MG_MERGE) { *valid &= ~dst->override; } return 1; } /*----------------------------------------------------------------------- * Function: mg_pushappearance * Description: push the context's appearance stack * Returns: nothing * Author: slevy (doc by mbp) * Date: Thu Sep 19 10:37:55 1991 * Notes: * DEVICE USE: required --- all devices must maintain this stack */ int mg_pushappearance(void) { struct mgastk *ma; if (mgafree) { ma = mgafree; mgafree = ma->next; } else { ma = OOGLNew(struct mgastk); } *ma = *_mgc->astk; ma->flags &= ~MGASTK_TAGGED; /* active and shader flags are inherited */ RefInit((Ref *)ma, 'a'); ma->next = _mgc->astk; LmCopy(&_mgc->astk->lighting, &ma->lighting); ma->ap.lighting = &(ma->lighting); ma->ap.mat = &(ma->mat); ma->ap.tex = REFGET(Texture, ma->ap.tex); _mgc->astk = ma; return 0; } /* Three support function to support BSP-trees with multiple * appearances: in the worst case every tree-node could have its own * appearance; this cannot be efficiently modelled with the * appearance stack approach. */ /* Make the current appearance persistent. */ const void *mg_tagappearance(void) { struct mgastk *astk = _mgc->astk; astk->flags |= MGASTK_TAGGED; RefIncr((Ref *)astk); /* update excluded sequence region */ if ((unsigned)_mgc->ap_min_tag > (unsigned)astk->ap_seq) { _mgc->ap_min_tag = astk->ap_seq; } if (_mgc->ap_max_tag < astk->ap_seq) { _mgc->ap_max_tag = astk->ap_seq; } if ((unsigned)_mgc->mat_min_tag > (unsigned)astk->mat_seq) { _mgc->mat_min_tag = astk->mat_seq; } if (_mgc->mat_max_tag < astk->mat_seq) { _mgc->mat_max_tag = astk->mat_seq; } if ((unsigned)_mgc->light_min_tag > (unsigned)astk->light_seq) { _mgc->light_min_tag = astk->light_seq; } if (_mgc->light_max_tag < astk->light_seq) { _mgc->light_max_tag = astk->light_seq; } return _mgc->astk; } /* Un-tag the appearance described by "tag" (i.e. undo its * persistency). This function should perform a clean-up, i.e. release * all resources associated with the corresponding appearance. */ void mg_untagappearance(const void *tag) { struct mgastk *astk = (struct mgastk *)tag, *pos; struct mgcontext *ctx = astk->tag_ctx; RefDecr((Ref *)astk); if (RefCount((Ref *)astk) > 1) { return; } if (!(astk->flags & MGASTK_ACTIVE)) { TxDelete(astk->ap.tex); astk->ap.tex = NULL; LmDeleteLights(&astk->lighting); /* Move to free-list if not active */ if (ctx) { if (ctx->ap_tagged == astk) { ctx->ap_tagged = astk->next; if (ctx->ap_tagged == NULL) { ctx->ap_min_tag = ctx->mat_min_tag = ctx->light_min_tag = -1; ctx->ap_max_tag = ctx->mat_max_tag = ctx->light_max_tag = 0; } } else { for (pos = ctx->ap_tagged; pos->next != astk; pos = pos->next); pos->next = astk->next; } } else { if (astk == mgatfree) { mgatfree = astk->next; } else { for (pos = mgatfree; pos->next != astk; pos = pos->next); pos->next = astk->next; } } astk->tag_ctx = NULL; astk->next = mgafree; mgafree = astk; } astk->flags &= ~MGASTK_TAGGED; } /* Insert a persistent apearance into the current appearance model */ void mg_taggedappearance(const void *tag) { struct mgastk *astk = (struct mgastk *)tag; mg_setappearance(&astk->ap, 0); } /*----------------------------------------------------------------------- * Function: mg_popappearance * Description: pop the context's appearance stack * Returns: nothing * Author: slevy (doc by mbp) * Date: Thu Sep 19 10:51:12 1991 * Notes: * DEVICE USE: required --- all devices must maintain this stack */ int mg_popappearance(void) { struct mgastk *mp; struct mgcontext *ctx = _mgc; mp = ctx->astk->next; if (mp == NULL) { return -1; } if (ctx->astk->ap_seq != mp->ap_seq) ctx->changed |= MC_AP; if (ctx->astk->mat_seq != mp->mat_seq) ctx->changed |= MC_MAT; if (ctx->astk->light_seq != mp->light_seq) ctx->changed |= MC_LIGHT; ctx->astk->flags &= ~MGASTK_ACTIVE; if (ctx->astk->flags & MGASTK_TAGGED) { ctx->astk->next = ctx->ap_tagged; ctx->ap_tagged = ctx->astk; ctx->ap_tagged->tag_ctx = ctx; ctx->astk = mp; } else { TxDelete(ctx->astk->ap.tex); ctx->astk->ap.tex = NULL; LmDeleteLights(&ctx->astk->lighting); ctx->astk->next = mgafree; mgafree = ctx->astk; ctx->astk = mp; } return 0; } /* * Transform light(s) to global coordinate system, if they aren't already. * Transforms them in place. */ void mg_globallights( LmLighting *lm, int worldbegin ) { LtLight *lt, **lp; HPoint3 oldpos; int i; for (i = 0, lp = &lm->lights[0]; i < AP_MAXLIGHTS && *lp != NULL; i++, lp++) { lt = *lp; oldpos = lt->globalposition; switch(lt->location) { case LTF_GLOBAL: lt->globalposition = lt->position; break; case LTF_CAMERA: HPt3Transform(_mgc->C2W, <->position, <->globalposition); break; case LTF_LOCAL: HPt3Transform(_mgc->xstk->T, <->position, <->position); lt->globalposition = lt->position; lt->location = LTF_GLOBAL; break; } if (memcmp(&oldpos, <->globalposition, sizeof(HPoint3)) != 0) lt->changed = 1; } } /*----------------------------------------------------------------------- * Function: mg_setappearance * Description: Operate on appearance in current context * Args: *ap: the appearance to assign or merge * mergeflag: MG_MERGE or MG_SET * Returns: ptr to current appearance * Author: slevy (doc by mbp) * Date: Thu Sep 19 10:59:25 1991 * Notes: Modifies the context's current apperance. Does not * modify *ap. * mergeflag = MG_MERGE: merge *ap into current appearance * mergeflag = MG_SET: set current appearance to *ap * DEVICE USE: required --- when ??? * * Can we modify this to do some of the flag setting * than mggl_setappearance currently does??? This * seems common to all devices. */ const Appearance * mg_setappearance(const Appearance *ap, int mergeflag) { struct mgastk *ma = _mgc->astk; if (mergeflag == MG_MERGE) { ApMerge(ap, &ma->ap, 1); /* Merge, in place */ ma->changed |= MC_AP; /* ma->ap = *nap; */ /* <- not necessary, ApMerge(a, b) returns b * unless b would be NULL on entry, which canot be the case here. */ /* Assign mat and light too? */ } else { /* Kludge: map->ap->tex is only a pointer, calling copy would * override its contents (now that TxCopy() has been * implemented). So get rid of ma->ap->tex before calling * ApCopyShared(). This is ok, because we always call REFGET(tex) * before hanging any texture into our appearance stack, so if * ap->tex == ma->ap.tex then the texture won't actually be * deleted. */ TxDelete(ma->ap.tex); ma->ap.tex = NULL; ApCopyShared(ap, &ma->ap); ma->changed |= MC_AP | MC_MAT | MC_LIGHT; } if (ap->lighting) { mg_globallights(&ma->lighting, 0); } if (ap->tex) { ap->tex->flags |= TXF_USED; } return &_mgc->astk->ap; } /*----------------------------------------------------------------------- * Function: mg_getappearance * Description: get the current appearance * Returns: ptr to the current appearance * Author: slevy (doc by mbp) * Date: Thu Sep 19 11:08:06 1991 * DEVICE USE: optional * Notes: The pointer returned points to the context's private copy * of the appearance. Don't modify it! * * Should we allow this? Or should this copy the appearance * to an address passed as an argument ??? */ const Appearance *mg_getappearance(void) { return &_mgc->astk->ap; } /*----------------------------------------------------------------------- * Function: mg_setcamera * Description: Set the context's camera * Args: *cam: the camera to use * Returns: nothing * Author: slevy (doc by mbp) * Date: Thu Sep 19 11:16:46 1991 * Notes: The context does not maintain an internal copy of the * camera. Only the pointer is stored. * DEVICE USE: required */ int mg_setcamera( Camera *cam ) { RefIncr((Ref *)cam); /* Incr count first: allow setting same camera */ CamDelete(_mgc->cam); _mgc->cam = cam; _mgc->changed |= MC_CAM; return 0; } /*----------------------------------------------------------------------- * Function: mg_ctxset * Description: set some attributes in the current context * Args: attr, ...: list of attribute-value pairs, terminated * by MG_END * Returns: -1 on error 0 on success * Author: slevy (doc by mbp) * Date: Thu Sep 19 11:22:28 1991 * Notes: DO NOT CALL THIS (yet)! It currently does nothing. * DEVICE USE: forbidden --- devices have their own mgxx_ctxset() * * This needs to be modified to work as the NULL device. * Use by other devices may never be needed. */ int mg_ctxset( int attr, ... /*, MG_END */ ) { return 0; } /*----------------------------------------------------------------------- * Function: mg_ctxget * Description: get an attribute from the current context * Args: attr: the attribute to get * *valuep: place to write attr's value * Returns: ??? * Author: slevy (doc by mbp) * Date: Thu Sep 19 11:26:49 1991 * Notes: DO NOT CALL THIS (yet)! It currently does nothing. * DEVICE USE: forbidden --- devices have their own mgxx_ctxget() * * This needs to be modified to work as the NULL device. * Use by other devices may never be needed. */ int mg_ctxget( int attr, void *valuep ) { return -1; } /*----------------------------------------------------------------------- * Function: mg_feature * Description: determine whether the NULL device has a particular feature * Args: feature: feature to test for * Returns: -1 (means feature is not present) * Author: slevy (doc by mbp) * Date: Thu Sep 19 11:29:51 1991 * Notes: NULL device is rather featureless at present, :-) * DEVICE USE: forbidden --- devices have their own mgxx_feature() */ int mg_feature( int feature ) { return -1; } /*----------------------------------------------------------------------- * Function: mg_ctxcreate * Description: create a new MG context for the NULL device * Args: a1, ...: list of attribute-value pairs * Returns: ptr to new context * Author: mbp * Date: Thu Sep 19 11:35:42 1991 * Notes: DO NOT CALL THIS --- it currently does nothing * needs to be modified to work with NULL device ??? * DEVICE USE: forbidden --- devices have their own mgxx_ctxcreate(() */ mgcontext * mg_ctxcreate( int a1, ... ) { return NULL; } /*----------------------------------------------------------------------- * Function: mg_ctxdelete * Description: delete an MG context for the NULL device * Args: *ctx: ptr to context to delete * Returns: nothing * Author: mbp * Date: Thu Sep 19 11:38:50 1991 * DEVICE USE: Call this to do common stuff after each device has * cleaned up its own data. */ void mg_ctxdelete( mgcontext *ctx ) { struct mgcontext **mp; struct mgastk *astk, *nextastk; struct mgxstk *xstk, *nextxstk; struct mgtxstk *txstk, *nexttxstk; if (ctx == NULL) return; if (ctx->winchange) { (*ctx->winchange)(ctx, ctx->winchangeinfo, MGW_WINDELETE, ctx->win); } for (mp = &_mgclist; *mp != NULL; mp = &(*mp)->next) { if (*mp == ctx) { *mp = ctx->next; break; } } for (xstk = ctx->xstk; xstk != NULL; xstk = nextxstk) { nextxstk = xstk->next; xstk->next = mgxfree; mgxfree = xstk; } for (txstk = ctx->txstk; txstk != NULL; txstk = nexttxstk) { nexttxstk = txstk->next; txstk->next = mgtxfree; mgtxfree = txstk; } for (astk = ctx->astk; astk != NULL; astk = nextastk) { nextastk = astk->next; if (!(astk->flags & MGASTK_TAGGED)) { if (astk->ap.tex != NULL && (nextastk == NULL || astk->ap.tex != nextastk->ap.tex)) { TxDelete(ctx->astk->ap.tex); ctx->astk->ap.tex = NULL; } LmDeleteLights(&astk->lighting); astk->next = mgafree; mgafree = astk; } else { OOGLWarn("Tagged, but active?"); } } /* Move the tagged appearances to the global tagged free-list; the * ap's are moved to the real free list when they are finally * untagged. */ for (astk = ctx->ap_tagged; astk != NULL; astk = nextastk) { nextastk = astk->next; astk->tag_ctx = NULL; astk->flags &= ~MGASTK_ACTIVE; /* should already have been cleared */ astk->next = mgatfree; mgatfree = astk; } /* make sure textures only needed by this context are purged, * otherwise the mg-backends may fail to reload the texture if a new * camera is opened */ ctx->changed |= MC_USED; mg_textureclock(); WnDelete(ctx->win); CamDelete(ctx->cam); /* Free other data here someday XXX */ if (_mgc == ctx) { _mgc = NULL; } OOGLFree(ctx); } /*----------------------------------------------------------------------- * Function: mg_ctxselect * Description: select the current context * Args: *ctx: the context to select * Returns: 0 (why ???) * Author: slevy (doc by mbp) * Date: Thu Sep 19 11:40:15 1991 * DEVICE USE: required --- mgxx_ctxselect() should call this if * the context to switch to if of a different device. * This procedure then does the switch. */ int mg_ctxselect( mgcontext *ctx ) { if (ctx != NULL && _mgf.mg_devno != ctx->devno) { /* * For another device. * Install that device's function pointers, and * call its selectcontext routine. */ (*ctx->devfuncs->mg_setdevice)(); mgctxselect(ctx); } _mgc = ctx; return 0; } /*----------------------------------------------------------------------- * Function: mg_identity * Description: Set the current object xform to the identity * Args: (none) * Returns: nothing * Author: slevy (doc by mbp) * Date: Wed Sep 18 16:46:06 1991 * Notes: Sets the xform on the top of the current context's xform * stack to the identity. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_identity( void ) { TmIdentity(_mgc->xstk->T); _mgc->changed |= MC_TRANS; _mgc->xstk->xfm_seq++; } /*----------------------------------------------------------------------- * Function: mg_settransform * Description: Set the current object xform * Args: T * Returns: nothing * Author: slevy (doc by mbp) * Date: Wed Sep 18 16:46:06 1991 * Notes: Sets the xform on the top of the current context's xform * stack to T. Also sets the MC_TRANS bit of * the context's "changed" flag and increment's the current xfm * sequence number. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_settransform( Transform T ) { TmCopy(T, _mgc->xstk->T); _mgc->changed |= MC_TRANS; _mgc->xstk->xfm_seq++; } /*----------------------------------------------------------------------- * Function: mg_gettransform * Description: Get the current object xform * Args: T * Returns: nothing * Author: slevy (doc by mbp) * Date: Wed Sep 18 16:46:06 1991 * Notes: Writes the current object xform, from the top of the * context's xform stack, into T. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_gettransform( Transform T ) { TmCopy(_mgc->xstk->T, T); } /*----------------------------------------------------------------------- * Function: mg_transform * Description: premultiply the current object xform by a transform * Args: T: the transform to premultiply by * Returns: nothing * Author: slevy (doc by mbp) * Date: Wed Sep 18 16:46:06 1991 * Notes: If X is the context's current object xform, replaces X * by T X. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_transform( Transform T ) { TmConcat(T, _mgc->xstk->T, _mgc->xstk->T); _mgc->changed |= MC_TRANS; _mgc->xstk->xfm_seq++; _mgc->xstk->hasinv = 0; _mgc->has = 0; } /*----------------------------------------------------------------------- * Function: mg_pushtransform * Description: push the context xform stack * Returns: nothing * Author: mbp * Date: Thu Sep 19 12:23:26 1991 * DEVICE USE: optional --- use if device actually uses our stack */ int mg_pushtransform( void ) { struct mgxstk *xfm; if (mgxfree) xfm = mgxfree, mgxfree = xfm->next; else xfm = OOGLNewE(struct mgxstk, "mgpushtransform"); *xfm = *MGC->xstk; xfm->next = MGC->xstk; MGC->xstk = xfm; return 0; } /*----------------------------------------------------------------------- * Function: mg_poptransform * Description: pop the context xform stack * Returns: nothing * Author: mbp * Date: Thu Sep 19 12:23:51 1991 * DEVICE USE: optional --- use if device actually uses our stack */ int mg_poptransform( void ) { struct mgxstk *xfm = MGC->xstk; if (xfm->next == NULL) return -1; MGC->xstk = xfm->next; xfm->next = mgxfree; mgxfree = xfm; _mgc->has = 0; return 0; } /*----------------------------------------------------------------------- * Function: mg_txidentity * Description: Set the current texture xform to the identity * Args: (none) * Returns: nothing * Author: cH * Date: 2007 * Notes: Sets the xform on the top of the current context's texture * xform stack to the identity. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_txidentity(void) { TmIdentity(_mgc->txstk->T); } /*----------------------------------------------------------------------- * Function: mg_settransform * Description: Set the current object xform * Args: T * Returns: nothing * Author: cH * Date: 2007 * Notes: Sets the xform on the top of the current context's texture * xform stack to T. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_settxtransform(Transform T) { TmCopy(T, _mgc->txstk->T); } /*----------------------------------------------------------------------- * Function: mg_gettxtransform * Description: Get the current object xform * Args: T * Returns: nothing * Author: cH * Date: 2007 * Notes: Writes the current object xform, from the top of the * context's texture xform stack, into T. * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_gettxtransform(Transform T) { TmCopy(_mgc->txstk->T, T); } /*----------------------------------------------------------------------- * Function: mg_txtransform * Description: premultiply the current object xform by a transform * Args: T: the transform to premultiply by * Returns: nothing * Author: cH * Date: 2007 * Notes: If X is the context's current object texture xform, replaces X * by (T X). * DEVICE USE: optional --- if the device actually uses the context * structure's xform stack, call this to do the work. If * the device keeps its own stack, it doesn't have to call * this. */ void mg_txtransform(Transform T) { TmConcat(T, _mgc->txstk->T, _mgc->txstk->T); } /*----------------------------------------------------------------------- * Function: mg_pushtxtransform * Description: push the context texture xform stack * Returns: -1 on error, else 0 (error case does not happen) * Author: cH * Date: 2007 * DEVICE USE: optional --- use if device actually uses our stack */ int mg_pushtxtransform( void ) { struct mgtxstk *xfm; if (mgtxfree) { xfm = mgtxfree; mgtxfree = xfm->next; } else { xfm = OOGLNewE(struct mgtxstk, "mgpushtxtransform"); } *xfm = *MGC->txstk; xfm->next = MGC->txstk; MGC->txstk = xfm; return 0; } /*----------------------------------------------------------------------- * Function: mg_poptxtransform * Description: pop the context xform stack * Returns: -1 on error, else 0 * Author: cH * Date: 2007 * DEVICE USE: optional --- use if device actually uses our stack */ int mg_poptxtransform(void) { struct mgtxstk *xfm = MGC->txstk; if (xfm->next == NULL) { return -1; } MGC->txstk = xfm->next; xfm->next = mgtxfree; mgtxfree = xfm; return 0; } void mg_sync( void ) {} void mg_worldbegin( void ) { Transform S, V; WnPosition vp; _mgc->changed |= MC_USED; CamGet(_mgc->cam, CAM_W2C, _mgc->W2C); CamGet(_mgc->cam, CAM_C2W, _mgc->C2W); CamGet(_mgc->cam, CAM_BGCOLOR, &_mgc->background); CamGet(_mgc->cam, CAM_BGIMAGE, &_mgc->bgimage); CamView(_mgc->cam, V); WnGet(_mgc->win, WN_VIEWPORT, &vp); /* V maps world to [-1..1],[-1..1],[-1..1] */ TmTranslate(S, 1., 1., 0.); TmConcat(V, S, V); /* now maps to [0..2],[0..2],[-1..1] */ TmScale(S, .5*(vp.xmax-vp.xmin+1), .5*(vp.ymax-vp.ymin+1), 1.); /* now maps to [0..xsize],[0..ysize],[-1..1] */ TmConcat(V, S, _mgc->W2S); /* final world-to-screen matrix */ TmInvert(_mgc->W2S, _mgc->S2W); /* and screen-to-world */ TmCopy(_mgc->W2S, _mgc->O2S); TmCopy(_mgc->S2W, _mgc->S2O); TmIdentity(_mgc->xstk->T); _mgc->xstk->hasinv = 0; _mgc->has |= HAS_S2O; mg_globallights(&_mgc->astk->lighting, 1); } void mg_findO2S(void) { TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); } void mg_findS2O(void) { if (!(_mgc->has & HAS_S2O)) { if (!_mgc->xstk->hasinv) { TmInvert(_mgc->xstk->T, _mgc->xstk->Tinv); _mgc->xstk->hasinv = 1; } TmConcat(_mgc->S2W, _mgc->xstk->Tinv, _mgc->S2O); TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); _mgc->has |= HAS_S2O; } } /* Construct a prototype polygonal outline for creating fat points. * Curiously, we can do this independently of the position of the point, * if we operate in homogeneous space. */ void mg_makepoint(void) { int i, n; float t, r, c, s; HPoint3 *p; static float nsides = 3.0; if (!(_mgc->has & HAS_S2O)) mg_findS2O(); if (_mgc->astk->ap.linewidth <= 3) n = 4; else n = nsides * sqrt((double)_mgc->astk->ap.linewidth); vvneeds(&_mgc->point, n); VVCOUNT(_mgc->point) = n; r = .5 * _mgc->astk->ap.linewidth; for (i = 0, p = VVEC(_mgc->point, HPoint3); i < n; i++, p++) { t = 2*M_PI*i/n; s = r * sin(t); c = r * cos(t); p->x = _mgc->S2O[0][0]*c + _mgc->S2O[1][0]*s; p->y = _mgc->S2O[0][1]*c + _mgc->S2O[1][1]*s; p->z = _mgc->S2O[0][2]*c + _mgc->S2O[1][2]*s; p->w = _mgc->S2O[0][3]*c + _mgc->S2O[1][3]*s; } _mgc->has |= HAS_POINT; } void mg_findcam(void) { HPoint3 camZ; /* * Figure out where the camera is in the current coordinate system */ if (!_mgc->xstk->hasinv) { TmInvert(_mgc->xstk->T, _mgc->xstk->Tinv); _mgc->xstk->hasinv = 1; } /* XXX assumes left multiplication: we take C2W[3] as a point! */ HPt3Transform(_mgc->xstk->Tinv, (HPoint3 *)&_mgc->C2W[3][0], &_mgc->cpos); HPt3Transform(_mgc->xstk->Tinv, (HPoint3 *)&_mgc->C2W[2][0], &camZ); camZ.w = Pt3Length((Point3 *)(void *)&camZ); HPt3ToPt3(&camZ, &_mgc->camZ); _mgc->has |= HAS_CPOS; } void mg_worldend( void ) {} void mg_reshapeviewport( void ) {} void mg_polygon( int nv, HPoint3 *v, int nn, Point3 *n, int nc,ColorA *c ) {} void mg_polylist(int np, struct Poly *p, int nv, struct Vertex *v, int plflags) {} void mg_mesh(int wrap,int nu,int nv, HPoint3 *p, Point3 *n, Point3 *nq, ColorA *c, TxST *st, int mflags) {} void mg_line( HPoint3 *p1, HPoint3 *p2 ) {} void mg_polyline( int nv, HPoint3 *verts, int nc, ColorA *colors, int wrapped ) {} void mg_quads(int nquads, HPoint3 *verts, Point3 *normals, ColorA *colors, int qflags) { int i; HPoint3 *v = verts; Point3 *n = normals; ColorA *c = colors; int dn = normals ? 4 : 0; int dc = colors ? 4 : 0; for (i = 0; i < nquads; i++, v += 4, n += dn, c += dc) mgpolygon(4, v, dn, n, dc, c); } void mg_bezier(int du, int dv, int dimn, float *ctrlpts, TxST *txmapst, ColorA *c) { } void mg_bsptree(struct BSPTree *bsptree) { } #define NULLFUNCS \ { \ MGD_NODEV, \ mgdevice_NULL, /* mg_setdevice */ \ mg_feature, /* mg_feature */ \ (mgcontext *(*)(void))mg_ctxcreate, /* mg_ctxcreate */ \ mg_ctxdelete, /* mg_ctxdelete */ \ (int (*)(void))mg_ctxset, /* mg_ctxset */ \ mg_ctxget, /* mg_ctxget */ \ mg_ctxselect, /* mg_ctxselect */ \ mg_sync, /* mg_sync */ \ mg_worldbegin, /* mg_worldbegin */ \ mg_worldend, /* mg_worldend */ \ mg_reshapeviewport, /* mg_reshapeviewport */ \ /* geometry transform */ \ mg_settransform, /* mg_settransform */ \ mg_gettransform, /* mg_gettransform */ \ mg_identity, /* mg_identity */ \ mg_transform, /* mg_transform */ \ mg_pushtransform, /* mg_pushtransform */ \ mg_poptransform, /* mg_poptransform */ \ /* texture transform */ \ mg_settxtransform, /* mg_settxtransform */ \ mg_gettxtransform, /* mg_gettxtransform */ \ mg_txidentity, /* mg_txidentity */ \ mg_txtransform, /* mg_txtransform */ \ mg_pushtxtransform, /* mg_pushtxtransform */ \ mg_poptxtransform, /* mg_poptxtransform */ \ /* appearences */ \ mg_pushappearance, /* mg_pushappearance */ \ mg_popappearance, /* mg_popappearance */ \ mg_setappearance, /* mg_setappearance */ \ mg_getappearance, /* mg_getappearance */ \ /***************/ \ mg_setcamera, /* mg_setcamera */ \ mg_polygon, /* mg_polygon */ \ mg_polylist, /* mg_polylist */ \ mg_mesh, /* mg_mesh */ \ mg_line, /* mg_line */ \ mg_polyline, /* mg_polyline */ \ mg_quads, /* mg_quads */ \ mg_bezier, /* mg_bezier */ \ mg_bsptree, /* mg_bsptree */ \ mg_tagappearance, /* mg_tagappearance */ \ mg_untagappearance, /* mg_untagappearance */ \ mg_taggedappearance, /* mg_taggedappearance */ \ } struct mgfuncs mgnullfuncs = /* mgfuncs for null (default) output device */ NULLFUNCS; struct mgfuncs _mgf = NULLFUNCS; /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/common/mg.h0000644000175000001440000003317210623643230014275 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MINNEGRAPHICSDEFS #define MINNEGRAPHICSDEFS /* * Public interface to mg (minnegraphics) package. */ #include "color.h" #include "point.h" #include "transform.h" #include "window.h" #include "camera.h" #include "appearance.h" #include "bsptree.h" #ifndef POLYLISTPDEFS struct Poly; struct Vertex; #endif #ifndef _GV_BSPTREE_P_H_ struct BSPTree; #endif typedef struct mgcontext mgcontext; /* Opaque typedef */ typedef int (*mgshadefunc)( int npoints, HPoint3 *points, Point3 *normals, ColorA *colors, ColorA *newcolors ); typedef void (*mgwinchfunc)( /*mgcontext *mgc, void *data, int win_why, ...*/ ); typedef struct mgNDctx mgNDctx; typedef int (*mgNDmapfunc)(mgNDctx *NDctx, HPointN *NDpoint, HPoint3 *newpoint, ColorA *newcolor); struct mgNDctx { mgNDmapfunc mapHPtN; void *(*saveCTX)(mgNDctx *NDctx); void (*pushTN)(mgNDctx *NDctx, TransformN *leftTN); void (*pushT)(mgNDctx *NDctx, Transform leftT); void (*restoreCTX)(mgNDctx *NDctx, void *savedCTX); BSPTree *bsptree; }; struct mgfuncs { /* mg member functions; potentially changed per device */ short mg_devno; /* Current device number */ int (*mg_setdevice)(void); int (*mg_feature)(int feature); mgcontext * (*mg_ctxcreate)(/* int a1, ... */); void (*mg_ctxdelete)(mgcontext *ctx); int (*mg_ctxset)(/* a1, ... */); int (*mg_ctxget)(int attr, void* valueptr); int (*mg_ctxselect)(mgcontext *ctx); void (*mg_sync)(void); void (*mg_worldbegin)(void); void (*mg_worldend)(void); void (*mg_reshapeviewport)(void); /* geometry transform support */ void (*mg_settransform)(Transform T); void (*mg_gettransform)(Transform T); void (*mg_identity)(void); void (*mg_transform)(Transform T); int (*mg_pushtransform)(void); int (*mg_poptransform)(void); /* texture transform support */ void (*mg_settxtransform)(Transform T); void (*mg_gettxtransform)(Transform T); void (*mg_txidentity)(void); void (*mg_txtransform)(Transform T); int (*mg_pushtxtransform)(void); int (*mg_poptxtransform)(void); /* appearances */ int (*mg_pushappearance)(void); int (*mg_popappearance)(void); const Appearance *(*mg_setappearance)(const Appearance *app, int merge); const Appearance *(*mg_getappearance)(void); int (*mg_setcamera)(Camera* cam); void (*mg_polygon)(int nv, HPoint3 *v, int nn, Point3 *n, int nc,ColorA *c); void (*mg_polylist)(int np, struct Poly *p, int nv, struct Vertex *v, int plflags); void (*mg_mesh)(int wrap,int nu,int nv,HPoint3 *p, Point3 *n, Point3 *nq, ColorA *c, TxST *ST, int mflags); void (*mg_line)(HPoint3 *p1, HPoint3 *p2); void (*mg_polyline)(int nv, HPoint3 *v, int nc, ColorA *c, int wrapped); void (*mg_quads)(int nquads, HPoint3 *v, Point3 *n, ColorA *c, int qflags); void (*mg_bezier)(int du, int dv, int dimn, float *ctrlpts, TxST *txmapst, ColorA *c); void (*mg_bsptree)(struct BSPTree *bsptree); const void *(*mg_tagappearance)(void); void (*mg_untagappearance)(const void *tag); void (*mg_taggedappearance)(const void *tag); }; extern struct mgfuncs _mgf; /* Common mg attributes -- for mgctxcreate(), mgctxset(), mgctxget() */ #define MG_END 0 #define MG_WINDOW 128 /* WnWindow * */ #define MG_PARENT 129 /* mgcontext *context (of parent window)*/ #define MG_SHOW 130 /* int visible (make window visible) */ #define MG_SETOPTIONS 131 /* int mask (of options to enable) see */ #define MG_UNSETOPTIONS 132 /* int mask (options to disable) mg.h */ #define MG_BACKGROUND 133 /* ColorA * */ #define MG_CAMERA 134 /* Camera * */ #define MG_APPEAR 135 /* Appearance *default_appearance */ #define MG_ApSet 136 /* Appearance create list */ #define MG_WnSet 137 /* Window create list */ #define MG_CamSet 138 /* Camera create list */ #define MG_ZNUDGE 139 /* float; fraction of Z-range by which lines & * edges are nudged nearer than polygons. */ #define MG_NDCTX 140 /* mgNDctx * */ /* Note 140, 141, 142 used to be MG_EUCLIDEAN, MG_HYPERBOLIC, and MG_SPHERICAL, which are now obsolete. These numbers may be reused now. */ #define MG_SHADER 143 /* mgshadefunc *shader_function */ #define MG_SHADERDATA 144 /* void *shaderdata (interpreted by shader) */ #define MG_ABLOCK 145 /* void *ablock */ #define MG_SPACE 146 /* TM_EUCLIDEAN, TM_HYPERBOLIC, or TM_SPHERICAL */ /* More control options: needed initially for X11, but might exist * some day for others. */ #define MG_DITHER 150 /* Dithering control: 1(on)/0(off) */ #define MG_DEPTHSORT 151 /* Depth sorting: one of: */ enum sortmethod {MG_NONE, MG_DEPTH, MG_ZBUFFER}; #define MG_BITDEPTH 152 /* frame buffer depth (1,8,24,...?) */ #define MG_WINCHANGE 153 /* void *winchange(ctx, void *data) * function, called when someone asks this * mg window to change (size, border, etc.) */ #define MG_WINCHANGEDATA 154 /* void *data param for winchange() callback */ /* win_why values for (*winchange) callback */ #define MGW_WINCHANGE 1 /* Window data (pos'n, size, title, ...) change */ #define MGW_WINDELETE 2 /* Window being deleted */ #define MGW_DOUBLEBUF 3 /* Double-buffering state changed; called as */ /* winchange(mgc, info, MGW_DOUBLEBUF, is_double) */ /* Other values, 16 and up, may be per-device */ /* NOTE: the MG_SPACE attribute specifies the space in which the objects being drawn live. It serves the same purpose as the NeXT-specific attribute MG_GEOMTYPE, which should eventually be phased out. mbp Fri Dec 11 14:51:30 1992 */ /* Possible MG Features */ #define MGF_BEZIER 100 /* Driver supports mgbezier */ /* Bitwise ORable options for mg_ctxset MG_[UN]SETOPTIONS */ #define MGO_DOUBLEBUFFER 0x1 /* Default single buffered */ #define MGO_HIDDEN 0x2 /* Default not Z-buffered */ #define MGO_BACKFACECULL 0x4 /* Default back-faces shown */ #define MGO_INHIBITBACKGROUND 0x8 /* Default background drawn */ #define MGO_INHIBITCLEAR 0x10 /* Default clear at worldbegin*/ #define MGO_INHIBITSWAP 0x20 /* Default swapbufs at worldend */ #define MGO_NORED 0x40 /* Inhibit drawing into red */ #define MGO_NOGREEN 0x80 /* ... green ... */ #define MGO_NOBLUE 0x100 /* ... or blue planes */ #define MGO_INHIBITCAM 0x200 /* Don't load matrix in worldbegin() */ /* mgmesh 'style' values */ #define MM_NOWRAP 0 #define MM_UWRAP 1 #define MM_VWRAP 2 /* mergeflag values for mgsetappearance() */ #define MG_SET 0 #define MG_MERGE 1 #define mgctxselect( mgc ) (*_mgf.mg_ctxselect)( mgc ) #define mgctxcreate (*_mgf.mg_ctxcreate) #define mgctxdelete( mgc ) (*_mgf.mg_ctxdelete)( mgc ) #define mgctxset (*_mgf.mg_ctxset) #define mgctxget( attr, valuep ) (*_mgf.mg_ctxget)( attr, valuep ) /* appearnce stack */ #define mgpushappearance() (*_mgf.mg_pushappearance)() #define mgpopappearance() (*_mgf.mg_popappearance)() #define mgsetappearance( ap, merge ) (*_mgf.mg_setappearance)( ap, merge ) #define mggetappearance() (*_mgf.mg_getappearance)() #define mgtagappearance() (*_mgf.mg_tagappearance)() #define mguntagappearance(tag) (*_mgf.mg_untagappearance)(tag) #define mgtaggedappearance(tag) (*_mgf.mg_taggedappearance)(tag) #define mgsetcamera( cam ) (*_mgf.mg_setcamera)( cam ) /* transform stack */ #define mgsettransform( T ) (*_mgf.mg_settransform)( T ) #define mggettransform( T ) (*_mgf.mg_gettransform)( T ) #define mgidentity() (*_mgf.mg_identity)() #define mgtransform( T ) (*_mgf.mg_transform)( T ) #define mgpushtransform() (*_mgf.mg_pushtransform)() #define mgpoptransform() (*_mgf.mg_poptransform)() /* texture transform stack */ #define mgsettxtransform( T ) (*_mgf.mg_settxtransform)( T ) #define mggettxtransform( T ) (*_mgf.mg_gettxtransform)( T ) #define mgtxidentity() (*_mgf.mg_txidentity)() #define mgtxtransform( T ) (*_mgf.mg_txtransform)( T ) #define mgpushtxtransform() (*_mgf.mg_pushtxtransform)() #define mgpoptxtransform() (*_mgf.mg_poptxtransform)() #define mgreshapeviewport() (*_mgf.mg_reshapeviewport)() #define mgworldbegin() (*_mgf.mg_worldbegin)() #define mgsync( ) (*_mgf.mg_sync)() #define mgworldend() (*_mgf.mg_worldend)() #define mgpolygon(nv,v, nn, n, nc, c) \ (*_mgf.mg_polygon)( nv,v, nn,n, nc,c ) #define mgpolylist(np, p, nv, v, flags) \ (*_mgf.mg_polylist)(np, p, nv, v, flags) #define mgmesh(style, nu, nv, v, n, nq, c, mflags) \ (*_mgf.mg_mesh)(style, nu, nv, v, n, nq, c, NULL, mflags) #define mgmeshst(style, nu, nv, v, n, nq, c ,st, mflags) \ (*_mgf.mg_mesh)(style, nu, nv, v, n, nq, c, st, mflags) #define mgline(p1, p2) \ (*_mgf.mg_line)( p1, p2 ) #define mgpolyline(nv, v, nc,c, wrap) \ (*_mgf.mg_polyline)(nv, v, nc, c, wrap ) #define mgquads(nquad, v, n, c, qflags) \ (*_mgf.mg_quads)(nquad, v, n, c, qflags) #define mgbezier(du, dv, dimn, ctrlpts, tx, c ) \ (*_mgf.mg_bezier)(du, dv, dimn, ctrlpts, tx, c) #define mgbsptree(bsptree) \ (*_mgf.mg_bsptree)(bsptree) #define mgfeature( feature ) (*_mgf.mg_feature)( feature ) extern mgcontext *mgcurrentcontext(); /* Get ptr to current context */ extern int mgbegin( void ); /* Init, select default dev */ extern int mgend( void ); /* Shut down */ extern int mgclonefrom( mgcontext *other ); /* Init cur mgctx from other */ /* * Sample software-shading function, usable as MG_SHADER. */ extern int mg_eucshade( int npoints, HPoint3 *points, Point3 *normals, ColorA *colors, ColorA *newcolors ); /* * Polling routine, intended to be called roughly once per * render cycle, which detects and purges textures which don't * seem to be in use. */ extern int mg_textureclock(void); #define CURRENTMGTYPE() (_mgf.mg_devno) /* * Device select routines -- set default for future mgctxcreate()'s */ extern int mgdevice_GL( void ); extern int mgdevice_X11( void ); extern int mgdevice_XGL( void ); extern int mgdevice_RIB( void ); extern int mgdevice_RI( void ); extern int mgdevice_PS( void ); extern int mgdevice_VT100( void ); extern int mgdevice_XT( void ); extern int mgdevice_MAC( void ); extern int mgdevice_TEK( void ); extern int mgdevice_TELETYPE( void ); extern int mgdevice_PUNCHCARD( void ); extern int mgdevice_SIMSTIM( void ); extern int mgdevice_NULL( void ); extern int mgdevice_BUF( void ); extern int mgdevice_OPENGL( void ); extern int mgdevice_PICK( void ); extern int mgdevice_PRIM( void ); extern int mgdevice( int deviceno ); /* Alternative to the above */ #define MGD_NODEV -1 /* error return: can't select that device */ #define MGD_NULL 0 /* no device, just return current one */ #define MGD_GL 1 /* SGI GL */ #define MGD_XGL 2 /* Sun XGL */ #define MGD_X11 3 /* Generic X11 */ #define MGD_RIB 4 /* Renderman RIB*/ #define MGD_PS 5 /* Postscript */ #define MGD_RI 6 /* Quick Renderman */ #define MGD_BUF 7 /* Raster buffer */ #define MGD_OPENGL 8 /* Open GL */ #define MGD_PICK 9 /* software pick */ #define MGD_PRIM 10 /* geometric data */ #endif /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/common/mgP.h0000644000175000001440000002035110600044564014410 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _MG_PDEFS_ #define _MG_PDEFS_ /* * Private, but machine-independent, declarations for mg library. */ #include #include "mg.h" #define MGCONTEXTMAGIC OOGLMagic('m', 'c'<<8 | 1) /* struct mgcontext changed bits */ #define MC_WIN 0x01 /* window changed (reshaped, &c) */ #define MC_CAM 0x02 /* Camera changed */ #define MC_AP 0x04 /* Appearance changed */ #define MC_MAT 0x08 /* Material changed */ #define MC_LIGHT 0x10 /* Lighting changed */ #define MC_TRANS 0x20 /* Transformation changed */ #define MC_OPT 0x40 /* Options changed */ #define MC_USED 0x80 /* worldbegin called (used by mg_textureclock) */ /* flags for mgastk->flags */ #define MGASTK_TAGGED 0x01 /* sticky */ #define MGASTK_ACTIVE 0x02 /* in use */ #define MGASTK_SHADER 0x04 /* software shader */ /* * Appearance portion of state. * We have a global stack of these which represent the user-specified values, * with a stack push at every mgpushappearance(). */ struct mgastk { REFERENCEFIELDS; /* use count for sticky elements */ struct mgastk *next; /* stack link */ mgcontext *tag_ctx;/* back-pointer for ap_tagged list */ unsigned short flags; /* sticky flag */ unsigned short changed; short ap_seq, mat_seq, light_seq; Appearance ap; /* Shallow copy of appearance -- don't delete */ Material mat; /* Ditto, Material */ LmLighting lighting;/* Ditto, Lighting */ mgshadefunc shader; /* Software shading function, or NULL if none */ void *shaderdata; /* Data which shader might use */ }; /* * Transform stack, pushed by mgpushtransform(). */ struct mgxstk { struct mgxstk *next; /* stack link */ Transform T; /* Current object->world xform */ short xfm_seq; short hasinv; /* Flag: Tinv is valid */ Transform Tinv; }; /* * Texture transform stack. Needed to paste textured stuff together * with INSTs, but allowing for a texture which covers the entire * object. cH, 2007. */ struct mgtxstk { struct mgtxstk *next; /* stack link */ Transform T; /* No need for an inverse. Sequence count? Probably not. */ }; struct mgcontext { REFERENCEFIELDS; struct mgfuncs *devfuncs; /* Pointers to devices */ short devno; /* Device index -- MGD_GL, MGD_X11, ... */ unsigned short changed; /* flags: Must update device state because...*/ WnWindow *win; /* Window */ Camera *cam; /* Camera */ mgcontext *parent; /* Parent mg window, if any */ mgcontext *next; /* Link in list of all mg contexts */ struct mgxstk *xstk; /* Top of transform stack */ struct mgtxstk *txstk; /* Top of texture transform stack */ struct mgastk *astk; /* Top of appearance stack */ struct mgastk *ap_tagged;/* Tagged (persistent) appearances */ short ap_min_tag, ap_max_tag; /* excluded seq. regions */ short mat_min_tag, mat_max_tag; short light_min_tag, light_max_tag; int shown; /* Is window 'visible'? */ ColorA background; /* Background color */ Image *bgimage; int opts; /* MG_SETOPTIONS flag mask */ Transform W2C; /* World->camera transform */ Transform C2W; /* Camera->world transform */ float zfnudge; /* fraction of Z-range by which lines are * nudged closer than surfaces. */ int space; /* space in which objects being drawn * live; should be TM_EUCLIDEAN, * TM_HYPERBOLIC, or TM_SPHERICAL */ Transform W2S, S2W; /* world-to-screen, screen-to-world xfms */ int has; /* Flag bits, set when cached values valid */ #define HAS_CPOS 0x1 /* Camera position (cpos, camZ) */ #define HAS_S2O 0x2 /* S2O, O2S */ #define HAS_POINT 0x4 /* Outline for generic fat point */ /* Cached values, computed when needed: */ HPoint3 cpos; /* Location of camera in object coordinates */ Point3 camZ; /* Direction of camera +Z vector */ Transform O2S, S2O; /* object-to-screen, screen-to-object xfms */ vvec point; /* outline for fat points */ mgNDctx *NDctx;/* pointer to caller-defined ND closure */ mgwinchfunc winchange; /* Callback function for mg Window etc. changes */ void *winchangeinfo; /* We call (*winchange)(ctx, winchangeinfo, win, changemask) */ }; #define next_ap_seq(ctx, astk) \ ((((astk)->ap_seq + 1) >= (ctx)->ap_min_tag && \ ((astk)->ap_seq + 1) <= (ctx)->ap_max_tag) \ ? (ctx)->ap_max_tag+1 : (astk)->ap_seq + 1) #define next_mat_seq(ctx, astk) \ ((((astk)->mat_seq + 1) >= (ctx)->mat_min_tag && \ ((astk)->mat_seq + 1) <= (ctx)->mat_max_tag) \ ? (ctx)->mat_max_tag+1 : (astk)->mat_seq + 1) #define next_light_seq(ctx, astk) \ ((((astk)->light_seq + 1) >= (ctx)->light_min_tag && \ ((astk)->light_seq + 1) <= (ctx)->light_max_tag) \ ? (ctx)->light_max_tag+1 : (astk)->light_seq + 1) /* * Pointer to the current mg context. */ extern mgcontext *_mgc; /* * List of all extant mg contexts. */ extern mgcontext *_mgclist; /* * Declarations of common mg routines, accessible to other mg packages * (but not intended to be public): */ /* geometry transform */ extern void mg_identity(void); extern void mg_transform(Transform T); extern void mg_settransform(Transform T); extern void mg_gettransform(Transform T); extern int mg_pushtransform(void); extern int mg_poptransform(void); /* texture transform */ extern void mg_txidentity(void); extern void mg_txtransform(Transform T); extern void mg_settxtransform(Transform T); extern void mg_gettxtransform(Transform T); extern int mg_pushtxtransform(void); extern int mg_poptxtransform(void); extern void mg_quads(int nquads, HPoint3 *v, Point3 *n, ColorA *c, int qflags); extern void mg_bezier(int du, int dv, int dimn, float *ctrlpts, TxST *txmapst, ColorA *c); extern void mg_bsptree(struct BSPTree *bsptree); extern void mg_findcam(); extern void mg_findS2O(); extern void mg_findO2S(); extern void mg_makepoint(); extern int mg_pushappearance(void); extern int mg_popappearance(void); extern void mg_reshapeviewport(void); extern const Appearance *mg_getappearance(void); extern const Appearance *mg_setappearance(const Appearance *ap, int mergeflag); extern mgcontext *mg_newcontext(struct mgcontext *); extern int mg_appearancebits( Appearance *ap, int merge, int *valid, int *flag ); extern void mg_ctxdelete( struct mgcontext * ); extern int mg_ctxselect( struct mgcontext * ); extern void mg_findO2S( void ); extern void mg_findS2O( void ); extern void mg_findcam( void ); extern void mg_makepoint( void ); extern void mg_worldbegin( void ); extern int mg_inhaletexture( Texture *tx, int rgba ); extern TxUser *mg_find_shared_texture(Texture *tx, int mgtype); extern bool mg_same_texture(Texture *tx1, Texture *tx2, bool really); extern void mg_reassign_shared_textures(mgcontext *ctx, int mgtype); extern int mg_find_free_shared_texture_id(int mgtype); extern void mg_remove_txuser(TxUser *tu); extern const void *mg_tagappearance(void); extern void mg_untagappearance(const void *tag); extern void mg_taggedappearance(const void *tag); #endif /*_MG_PDEFS_*/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 8 *** * End: *** */ geomview-1.9.4/src/lib/mg/common/mgtexture.c0000644000175000001440000001521310616720703015710 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mgP.h" #include #include #if HAVE_UNISTD_H # include #endif #if defined(_WIN32) || defined(WIN32) # include # define R_OK 4 /* sigh, no Windows include-file defines R_OK! */ # define iobpclose iobfclose #endif #include #include #include /* * Give mg contexts a chance to purge any textures which aren't in use. * The wise user will call this routine once each redraw cycle; * any texture data which hasn't been used since the last call will be * purged. So, if a texture has been superceded, we'll catch it here. * Several policies are possible; we just implement one. Maybe there could * be a switch. For example, we could: * (a) purge a texture if its data hasn't actually been used in the last * cycle. (Then, if texturing is turned off and then on again, it'll * have to be reloaded each time it's turned on.) * (b) purge a texture if no geom object referring to it has been used * in the last cycle, whether the texture was actually rendered or not. * (This keeps textures loaded, but discards them if they're superceded. * It could screw up if some objects just aren't rendered during some * rendering cycles.) * (c) purge a texture if all references to it (aside from texture caches) * seem to be gone, i.e. by comparing reference counts with the number * of users on the tx->users list. This would preserve textures held * in handles, or by objects which for some reason aren't being rendered. * Stands a large chance of missing things that really deserve * garbage-collection. * We actually implement (b). * * For each texture, we check the "used" bit, indicating that some rendered * geom object has had a reference to that texture since the last call to * mg_textureclock(). We purge textures which haven't thus been "used", * but which have at least one user whose mg context has been rendered to. * */ int mg_textureclock(void) { Texture *tx, *txn; mgcontext *ctx; DblListIterate(&AllLoadedTextures, Texture, loadnode, tx, txn) { if (!(tx->flags & TXF_USED)) { TxUser *tu; int anyused = 0, needed = 0; for (tu = tx->users; tu != NULL; tu = tu->next) { /* We need this if: * this mg context has been used (but didn't use this texture) * ... */ if (tu->ctx != NULL && ((mgcontext *)tu->ctx)->changed & MC_USED) { anyused = 1; } if (tu->needed != NULL && (*tu->needed)(tu)) { needed = 1; } } if ((anyused && !needed) || tx->users == NULL) { TxPurge(tx); } } tx->flags &= ~TXF_USED; } /* Reset all mg contexts' "used" bits for next cycle. */ for (ctx = _mgclist; ctx != NULL; ctx = ctx->next) { ctx->changed &= ~MC_USED; } return 0; } /* * We assume the graphics system allows textures to be shared across * multiple windows of a type. We're closing one of those windows. * If any texture-users claim to be using that window, switch them to * use another of the same type, if possible. Otherwise, just purge them. */ void mg_reassign_shared_textures(mgcontext *ctx, int mgdtype) { mgcontext *another; Texture *tx, *txn; TxUser *tu, **tup; for (another = _mgclist; another != NULL; another = another->next) { if (another != ctx && another->devno == mgdtype) break; } DblListIterate(&AllLoadedTextures, Texture, loadnode, tx, txn) { for (tup = &tx->users, tu=*tup; tu != NULL; tu=*tup) { if (tu->ctx == ctx) { if (another != NULL) { tu->ctx = another; tup = &tu->next; } else { *tup = tu->next; if (tu->purge) { (*tu->purge)(tu); } OOGLFree(tu); } } } if (tx->users == NULL) { TxPurge(tx); } } } /* really == false means to only compare the images and the s/t clamp settings * really == true means to compare all components */ bool mg_same_texture(Texture *tx1, Texture *tx2, bool really) { if (tx1 == tx2) { return true; } if (tx1->image != tx2->image) { return false; } if ((tx1->flags ^ tx2->flags) & (TXF_SCLAMP|TXF_TCLAMP)) { return false; } if (really) { if (tx1->apply != tx2->apply) { return false; } if (tx1->apply == TXF_BLEND && (tx1->background.r != tx2->background.r || tx1->background.g != tx2->background.g || tx1->background.b != tx2->background.b)) { return false; } } return true; } /* Find a texture in the cache which shares the texture image and the * clamping, background and application styles may be different. */ TxUser * mg_find_shared_texture(Texture *wanttx, int type) { Texture *tx; TxUser *tu; DblListIterateNoDelete(&AllLoadedTextures, Texture, loadnode, tx) { if (mg_same_texture(tx, wanttx, false)) { for (tu = tx->users; tu != NULL; tu = tu->next) { if (tu->ctx && ((mgcontext *)tu->ctx)->devno == type) return tu; } } } return NULL; } #ifdef _WIN32 # undef FD_ISSET /* Use fake FD_ISSET from streampool.c for VC++ */ #endif int mg_find_free_shared_texture_id(int type) { Texture *tx; TxUser *tu; fd_set ids; int id, max = 0; FD_ZERO(&ids); DblListIterateNoDelete(&AllLoadedTextures, Texture, loadnode, tx) { for (tu = tx->users; tu != NULL; tu = tu->next) { if (tu->ctx && ((mgcontext *)tu->ctx)->devno == type) { if (((unsigned)tu->id) < FD_SETSIZE) { FD_SET(tu->id, &ids); if (max < tu->id) max = tu->id; } } } } for (id = 1; id < FD_SETSIZE && FD_ISSET(id, &ids) && id <= max; id++) ; if (id >= FD_SETSIZE) { OOGLError(0, "Yikes: all %d texture slots in use?", FD_SETSIZE); id--; } return id; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/mg/common/Makefile.am0000644000175000001440000000024510455665336015566 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgcommon.la libmgcommon_la_SOURCES = \ mg.c mgshade.c mgtexture.c \ mg.h mgP.h geomview-1.9.4/src/lib/mg/common/Makefile.in0000644000175000001440000003562210665240505015574 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mg/common DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmgcommon_la_LIBADD = am_libmgcommon_la_OBJECTS = mg.lo mgshade.lo mgtexture.lo libmgcommon_la_OBJECTS = $(am_libmgcommon_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libmgcommon_la_SOURCES) DIST_SOURCES = $(libmgcommon_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgcommon.la libmgcommon_la_SOURCES = \ mg.c mgshade.c mgtexture.c \ mg.h mgP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/common/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/common/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libmgcommon.la: $(libmgcommon_la_OBJECTS) $(libmgcommon_la_DEPENDENCIES) $(LINK) $(libmgcommon_la_OBJECTS) $(libmgcommon_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgshade.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgtexture.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/mg/common/mgshade.c0000644000175000001440000001461010461140707015272 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Software shaders. * These operate in the mg environment. */ #include "mgP.h" #define DOT(a,b) ((a).x*(b).x + (a).y*(b).y + (a).z*(b).z) #define CCMUL(A,B,C) ((C).r=(A).r*(B).r, (C).g=(A).g*(B).g, (C).b=(A).b*(B).b) #define CCADD(A,B,C) ((C).r=(A).r+(B).r, (C).g=(A).g+(B).g, (C).b=(A).b+(B).b) #define CSCALE(s, A, B) ( (B).r = (A).r * s, (B).g = (A).g * s, (B).b = (A).b * s, (B).a = (A).b * s) #define CCSADD(A,B,s,C) \ ((C).r += (s)*(A).r*(B).r, \ (C).g += (s)*(A).g*(B).g, \ (C).b += (s)*(A).b*(B).b) /* * Transform a vector covariantly */ static void cotransform(Transform Tinv, Point3 *in, Point3 *out) { out->x = Tinv[0][0]*in->x + Tinv[0][1]*in->y + Tinv[0][2]*in->z; out->y = Tinv[1][0]*in->x + Tinv[1][1]*in->y + Tinv[1][2]*in->z; out->z = Tinv[2][0]*in->x + Tinv[2][1]*in->y + Tinv[2][2]*in->z; } static float euck1 = 1.0; /* inverse power falloff */ static float euck2 = 0.0; /* safety zone around light */ static float fog = 0.0; /* fog control */ #if 0 static float hypk1 = .5; /* controls exponential falloff */ static float hypk2 = .0; /* controls exponential falloff */ static float sphk1 = .5; /* controls exponential falloff */ static float sphk2 = 0.0; /* safety zone around light */ #endif /* * Euclidean shader * * We depend on the following mg features: * _mgc->xstk->hasinv (cleared whenever transform changes) * _mgc->W2C, C2W (initialized from camera at mgworldbegin()) */ int mg_eucshade(int nv, HPoint3 *v, Point3 *n, ColorA *c, ColorA *cs) { struct mgxstk *mx = _mgc->xstk; struct mgastk *ma = _mgc->astk; struct LtLight *l, **lp; int i, lno; HPoint3 V; Point3 N, I; float s; Color Ca, Ci; euck1 = ma->lighting.attenmult; euck2 = ma->lighting.attenmult2; fog = ma->lighting.attenconst > 1 ? ma->lighting.attenconst-1 : 0; #define EYE ((HPoint3 *) (_mgc->C2W[3])) /* Eye (camera) position as an HPoint3 */ if(!mx->hasinv) { TmInvert(mx->T, mx->Tinv); mx->hasinv = 1; } /* "ambient" color */ Ca.r = Ca.g = Ca.b = 0; CCSADD(ma->mat.ambient, ma->lighting.ambient, ma->mat.ka, Ca); for(i = 0; i < nv; i++, v++, n++, c++, cs++) { ColorA *thiscolor = c; float num; /* Transform point by T */ HPt3Transform(mx->T, v, &V); /* V = v in world coords */ HPt3SubPt3(EYE, &V, &I); /* I = EYE - V (point-to-eye vector) */ /* Is this vertex behind our eye? If so, let's not shade it. * Speed up Shape of Space rendering. This code may be questionable: * what if this is a vertex of a smooth-shaded polygon that extends * in front of our eye, too? */ if(DOT(I, *((HPoint3 *)_mgc->C2W[2])) < 0) { /* Dummy -- just Ci = Cs. */ *cs = *c; continue; } Pt3Unit(&I); /* Transform normal by T'^-1 */ cotransform(mx->Tinv, n, &N); /* check if normal has 0 length! */ num = sqrt(DOT(N,N)); if (num == 0.0) num = 1; s = 1/num; if(DOT(N,I) < 0) { s = -s; /* Flip normal to face the viewer */ /* Hack: use otherwise-useless emission color, if defined, * as the back-side material color. */ if(ma->mat.valid & MTF_EMISSION) thiscolor = (ColorA*)(void *)&ma->mat.emission; } N.x *= s; N.y *= s; N.z *= s; /* Ambient term */ Ci = Ca; lp = &ma->lighting.lights[0]; for(lno = 0; lnointensity; if(l->globalposition.w == 0) { L = (Point3 *)(void *)&l->globalposition; ll = DOT(*L,*L); } else { HPt3SubPt3(&l->globalposition, &V, &Lt); L = ≪ ll = DOT(Lt,Lt); /* ll = (ll > euck2) ? ll : euck2; */ if (ll > 0.0) power = pow(ll, -euck1/2.0); else power = 1.0; /* Inverse square falloff */ bright *= power; } ln = DOT(*L,N); if(ln <= 0) /* Ignore lights shining from behind */ continue; if (ll > 0.0) ls = sqrt(ll); else ls = 1.0; if (ls == 0.0) ls = 1.0; s = ma->mat.kd * bright * (ln/ls); /* cosine law: L.N diffuse shading */ CCSADD(l->color, *thiscolor, s, Ci); if(ma->mat.ks > 0) { /* Specular term */ Point3 H; /* H: halfway between L and I */ float num; H.x = L->x/ls + I.x, H.y = L->y/ls + I.y, H.z = L->z/ls + I.z; num = DOT(H,H); if (num <= 0.0) num = 1.0; else num = sqrt(num); s = DOT(H,N) / num; /* cos angle(H,N) */ /* Note we need s>=0 for specular term to make sense. * This should be true since we checked * that both L.N and I.N are positive above. */ /* shininess = specular exponent */ if (s > 0.0) s = ma->mat.ks * bright * pow(s, ma->mat.shininess); else s = ma->mat.ks * bright; CCSADD(l->color, ma->mat.specular, s, Ci); } } /* insert fog code */ if (fog) { float k1, k2; float d = HPt3Distance(&V, EYE); ColorA surfcolor, fogcolor; d = d - euck2; /* fog-free sphere of radius euck2 */ if (d < 0) d = 0; k1 = exp( -fog * d); k2 = 1.0 - k1; CSCALE(k1, Ci, surfcolor); CSCALE(k2, _mgc->background, fogcolor); CCADD(surfcolor, fogcolor, Ci); } if(Ci.r < 0) Ci.r = 0; else if(Ci.r > 1) Ci.r = 1; if(Ci.g < 0) Ci.g = 0; else if(Ci.g > 1) Ci.g = 1; if(Ci.b < 0) Ci.b = 0; else if(Ci.b > 1) Ci.b = 1; *(Color *)cs = Ci; cs->a = c->a; } return 0; } geomview-1.9.4/src/lib/mg/common/Headers0000644000175000001440000000001307730240032015001 00000000000000mg.h mgP.h geomview-1.9.4/src/lib/mg/Makefile.am0000644000175000001440000000031310455665336014272 00000000000000# if X11RENDER # X11RENDER_DIRS = x11 # else # X11RENDER_DIRS = # endif SUBDIRS = buf common ps rib EXTRA_DIST = mg.attr mg.doc mgP.h if MGOPENGL SUBDIRS += opengl endif if MGX11 SUBDIRS += x11 endif geomview-1.9.4/src/lib/mg/Makefile.in0000644000175000001440000004001510665240505014274 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # if X11RENDER # X11RENDER_DIRS = x11 # else # X11RENDER_DIRS = # endif VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @MGOPENGL_TRUE@am__append_1 = opengl @MGX11_TRUE@am__append_2 = x11 subdir = src/lib/mg DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = buf common ps rib opengl x11 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = buf common ps rib $(am__append_1) $(am__append_2) EXTRA_DIST = mg.attr mg.doc mgP.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/mg/mg.doc0000644000175000001440000005756407730237775013360 00000000000000$Id: mg.doc,v 1.1.1.1 2000/08/15 16:33:21 mphillips Exp $ MinneGraphics (MG) The Geometry Center July 1991 mbp, slevy, Sun Jul 21 15:16:25 1991 This document defines MG. MG is a graphics library which provides a common interface for doing interactive 3D graphics on a variety of platforms. The main intent is that it will be used with OOGL (Object Oriented Graphics Lanauge), but there is nothing OOGL-specific about MG, and conceivably other applications could use it as well. MG is not meant to be as general or powerful as other 3D graphics lanuages such as GL, XGL, RenderMan, PHIGS, etc. --- rather it is meant to provide access to the most important operations common to all of these languages. MG is deliberately simple. It is *not* an attempt to solve the 3D graphics standardization problem. Until a widely accepted standard does emerge, MG is an attempt to insulate ourselves from the specifics of individual graphics lanuages, allowing us to write programs that will run under a variety of these languages. MG consists of several parts: a common part, and a part for each device (language) on which it it implemented. The library files are constructed so that each device-specific library includes the common part, so the application program only needs to link in the libraries corresponding to the devices it wants to use (there is no separate "common" library). Any application program using MG should include the header file "mg.h". The rest of this file contains a list of the MG procedures with a description of the call syntax and an explanation of what each procedure does. This list is meant to be used both in writing MG application modules and in writing MG device-drivers. Most MG procedures have several versions. The following conventions are used in referring to them. 1. application version name convention: mgproc This is the version of the procedure which application programs call. In most cases the name "mgproc" is actually a #define macro which expands to a function pointer which points to the corresponding device-specific version of proc. Application programs should only call these versions of MG procedures (the one exception is mgdevice_XX, for which there is only a device-specific version). 2. common version name convention: mg_proc This is a version of proc which performs operations, frequently bookkeeping type things, common to all MG devices. The device-specific version of proc may call the common version to accomplish these operations. For the details of what the common mg_proc does, including information on when the device-specific version should call it, see the documentation of the source code for mg_proc in the mg/common directory. The common procedures also serve as the "null device". Before a device has been specified in an MG application program, the application version of proc is a pointer to the common procedure. Running the program in this state draws no graphics but accomplishes all other operations associated with MG. 3. device version name convention: mgxx_proc, where xx = device (GL, XGL, etc). This is the version of proc specific to device xx. It accomplishes the actual graphics operations, and calls the corresponding common routine if/when necessary to perform common operations. To write a new MG device driver you must supply a version of each device procedure for the new device. The call syntax of each of these versions of proc is identical; the prototypes below are given in terms of the application version. APPLICATION COMMON DEVICE VERSION VERSION VERSION ----------------- ------- --------------- General control and informational procedures: mgbegin mg_begin NONE ??? (1) mgend mg_end NONE ??? (1) NONE NONE mgdevice_XX mgsync mg_sync mgxx_sync mgworldbegin mg_worldbegin mgxx_worldbegin mgworldend mg_worldend mgxx_worldend mgfeature mg_feature mgxx_feature Procedures related to creating and modifying the graphics context: mgctxcreate mg_ctxcreate mgxx_ctxcreate mgctxtcopy mg_ctxcopy NONE mgctxdelete mg_ctxdelete mgxx_ctxdelete mgctxselect mg_ctxselect mgxx_ctxselect mgctxset mg_ctxset mgxx_ctxset mgctxget mg_ctxget mgxx_ctxget mgpushappearance mg_pushappearance mgxx_pushappearance mgpopappearance mg_popappearance mgxx_popappearance mgsetappearance mg_setappearance mgxx_setappearance mgsetcamera mg_setcamera mgxx_setcamera mgidentity mg_identity mgxx_identity mgtransform mg_transform mgxx_transform mgpushtransform mg_pushtransform mgxx_pushtransform mgpoptransform mg_poptransform mgxx_poptransform mgsettransform mg_settransform mgxx_settransform mggettransform mg_gettransform mgxx_gettransform mgreshapeviewport mg_reshapeviewport mgxx_reshapeviewport Graphics primitives: mgpolygon mg_polygon mgxx_polygon mgmesh mg_mesh mgxx_mesh mgline mg_line mgxx_line mgpolyline mg_polyline mgxx_polyline mgpolylist mg_polylist mgxx_polylist mgquads mg_quads mgxx_quads mgbezier mg_bezier mgxx_bezier ======================================================================== /*----------------------------------------------------------------------- * Function: mgfeature * Description: tests whether the current device has a particular feature * Args: feature: * Returns: a value that indicates something about the feature; * -1 means the feature is not present. * Author: slevy, mbp * Date: Thu Jul 18 20:29:34 1991 * Notes: At present, only one feature is defined: * Feature Returned Value * MGF_BEZIER 1 if mgbezier() supported, else -1. * * Others are contemplated, for example: * MGF_ZBUFFER Depth of Z buffer * MGF_BITPLANES Number of bitplanes * MGF_DOUBLEBUFFER 1 for yes, -1 for no * etc etc etc */ int mgfeature(int feature) /*----------------------------------------------------------------------- * Function: mgctxcreate * Description: create a graphics context * Args: a1, ...: list of (attribute, value) pairs, terminated by * MG_END * Returns: pointer to the new graphics context * Author: slevy, mbp * Date: Thu Jul 18 20:34:28 1991 * Notes: The created context becomes the current context. The * attributes specified in the list are set as though * they had been passed to mgctxset; see mgctxset * for an explanation of what attributes are allowed. * * Device must be set, via a call to mgdevice_GL, * mgdevice_PS, etc, before creating a new context. Once * created, a context is valid only for the device for which * it was created. * * The value returned is a pointer to an opaque structure; * it should not be modified in any way. The only thing * you can legitimately do with this pointer is pass it * to other MG procedures, such as mgctxselect. * * The MG_SHOW attribute is set to 1 by default, which means * that (for relevant devices) the context's window becomes * visible on the screen when mgctxcreatec is called. * To prevent the window from appearing in the call to * mgctxcreate, set MG_SHOW to 0. Then call mgctxset * to set MG_SHOW to 1 to make the window appear later. * * Note: a1 is simply the first attribute in the list of * (attribute, value) pairs. It is listed as a separate * argument because of the way stdarg works. */ mgcontext *mgctxcreate(a1, ... /*, MG_END */) /*----------------------------------------------------------------------- * Function: mgctxcopy * Description: copy one context to another * Args: *src: the source context * *dst: the destination context * Returns: nothing * Author: mbp * Date: Mon Jul 22 11:01:32 1991 * Notes: Everything associated with the source context * is copied into the destination context, EXCEPT the * device setting. * * This is a shallow copy --- ctx attributes which are * pointers (e.g. the camera and window pointers) are * copied as pointers, so that those attributes in dest * point to the same structures as the corresponding src * attributes. * * There is no device version of mgctxcopy. */ mgctxcopy(mgcontext *src, mgcontext *dst) /*----------------------------------------------------------------------- * Function: mgctxdelete * Description: delete a context * Args: ctx: pointer to the context to delete * Returns: nothing * Author: slevy, mbp * Date: Sun Jul 21 15:33:07 1991 * Notes: ctx should be the pointer returned by mgctxcreate * when the context was created. This procedure frees up * all space associated with ctx. After * mgctxdelete(ctx), ctx will be an invalid pointer. */ void mgctxdelete(mgcontext *ctx) /*----------------------------------------------------------------------- * Function: mgctxset * Description: set some attributes in the current context * Args: a1, ...: list of (attribute, value) pairs, terminated by MG_END * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 15:50:46 1991 * Notes: Attributes are documented in the file mg.attr. * Note: a1 is simply the first attribute in the list * of (attribute, value) pairs. It is listed as a * separate argument because of the way stdarg works. * The list of attributes MUST end with MG_END. */ void mgctxset(a1, ... /*, MG_END */) /*----------------------------------------------------------------------- * Function: mgctxget * Description: get the value of an attribute in the current context * Args: attr: the attribute to get * valueptr: pointer to location to write value to * Returns: number of bytes written to address valueptr; 0 means * invalid attr * Author: slevy, mbp * Date: Fri Jul 19 16:26:32 1991 * Notes: valueptr should be the address of an object of the type * associated with the attribute attr; the object at * that address will be overwritten with the value in * the current context. See mg.attr for a list of * attributes. */ int mgctxget(int attr, void* valueptr) /*----------------------------------------------------------------------- * Function: mgctxselect * Description: Set the current graphics context to ctx * Args: ctx: ptr to the context to make current * Returns: ctx, or NULL if unsuccessful * Author: slevy, mbp * Date: Fri Jul 19 11:48:13 1991 * Notes: Does not copy *ctx --- just sets the internal pointer * _mgc to ctx, and calls any device-specific procedures * neccessary to bring the device into the state * corresponding to context *ctx. * Also changes the current device to be the device * associated with *ctx. */ int mgctxselect(mgcontext *ctx) /*----------------------------------------------------------------------- * Function: mgsync * Description: Insures that all mg graphics operations have been sent to * the device, and instructs the device to process them * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 12:14:09 1991 * Notes: The idea behind mgsync is that it could be used, * for example, to guarantee (in singlebuffer mode) * that everything that has * been drawn so far is actually visible in the window. * It might also be necessary for telling mg and/or the * device to flush any internal buffering of graphics * operations. * * mgsync is called implicitly by mgworldend. */ void mgsync() /*----------------------------------------------------------------------- * Function: mgworldbegin * Description: Prepare to draw in the current context * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 12:49:12 1991 * Notes: mgworldbegin must be called before any mg drawing commands. * It erases the current window to the background color and * clears any internal (to the device) records associated with * drawing. Also interprets the current camera setting; all * graphics operations after mgworldbegin and before the next * mgworldend will be displayed using this camera setting. * * The process of drawing an image on the current window * is bracketed by calls to mgworldbegin and mgworldend: * mgworldbegin(); * draw draw draw; * mgworldend(); <-- image is complete here */ void mgworldbegin() /*----------------------------------------------------------------------- * Function: mgworldend * Description: end the group of graphics operations begun with * mgworldbegin * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 13:01:00 1991 * Notes: Guarantees that all operations done since mgworldbegin * become visible. In doublebuffer mode, this involves * swapping the buffers. Implicitly calls mgsync. * Some devices might buffer graphics operations, and only * interpret them when mgworldend is called. */ void mgworldend() /*----------------------------------------------------------------------- * Function: mgreshapeviewport * Description: adjust internal window & camera * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 13:11:29 1991 * Notes: Intended for use in window systems where the user may * dynamically reshape, resize, or move the window. Causes * the window (MgWindow) size and position, and the camera * aspect ratio associated with the current context to be * updated to reflect the actual shape and size of the window. */ void mgreshapeviewport() /*----------------------------------------------------------------------- * Function: mgidentity * Description: sets the current context's object xform to I * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 13:19:43 1991 */ void mgidentity() /*----------------------------------------------------------------------- * Function: mgtransform * Description: mult (on the left) the current object xform by T * Args: T * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 13:21:40 1991 * Notes: Suppose that before mgtransform is called, the * current transform is A, so that object row vector v * is mapped to v A. Then after mgtransform(T), * v will be mapped to v T A. * * Note that this means that Euclidean translations * appear in the 4th row of the transform matrix * (rather than in the 4th column). * * [This differs from the old mg convention, * so old programs may need to be changed. However * the new convention matches the ASCII format we use * for matrices, and also matches the internal formats * used by SGI, Sun, and QuickRenderman.] */ void mgtransform(const Transform T) /*----------------------------------------------------------------------- * Function: mgpushtransform * Description: Push a copy of the current xform onto the current * context's xform stack * Args: (none) * Returns: the new depth of the stack ??? * Author: slevy, mbp * Date: Fri Jul 19 13:30:24 1991 * Notes: before after * A A <-- top * B A * C B * C * * Stack might have limited depth --- usually depends on the * device. */ int mgpushtransform() /*----------------------------------------------------------------------- * Function: mgpoptransform * Description: Pop the current context's xform stack * Args: (none) * Returns: the new depth of the stack ???? * Author: slevy, mbp * Date: Fri Jul 19 13:39:04 1991 */ int mgpoptransform() /*----------------------------------------------------------------------- * Function: mggettransform * Description: set the current context's current xform * Args: T: the xform * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 13:44:18 1991 */ void mgsettransform(Transform T) /*----------------------------------------------------------------------- * Function: mggettransform * Description: get the current context's current xform * Args: T: the xform * Returns: the depth of the xform stack ???? * Author: slevy, mbp * Date: Fri Jul 19 13:44:18 1991 * Notes: The current xform is the one on the top of the stack. */ int mggettransform(Transform T) /*----------------------------------------------------------------------- * Function: mgpushappearance * Description: Push a copy of the current attr onto the current * context's appearance stack * Args: (none) * Returns: the new depth of the appearance stack ???? * Author: slevy, mbp * Date: Fri Jul 19 13:45:19 1991 * Notes: Like mgpushtransform, but works with the appearance stack * instead. */ int mgpushappearance() /*----------------------------------------------------------------------- * Function: mgpopappearance * Description: Pop the current context's appearance stack * Args: (none) * Returns: the new depth of the stack ???? * Author: slevy, mbp * Date: Fri Jul 19 13:39:04 1991 */ int mgpopappearance() /*----------------------------------------------------------------------- * Function: mgsetappearance * Description: merge or set current Appearance * Args: app: Appearance to merge or copy * mergeflag: copy or merge app into current Appearance? * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 13:55:15 1991 * Notes: If mergeflag==MG_SET, sets the current Appearance to * exactly match *app. If mergelfag==MG_MERGE, sets the current * Appearance to the union of itself with *app. * For fields for which both the current Appearance * and *app have values, *app takes precedence, unless * the override bit is set for that field in the * current Appearance. */ void mgsetappearance(Appearance* app, int mergeflag) /*----------------------------------------------------------------------- * Function: mgsetcamera * Description: set the current camera * Args: cam: * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 14:06:29 1991 * Notes: New camera will not actually be used until next * mgworldbegin. */ int mgsetcamera(Camera* cam) /*----------------------------------------------------------------------- * Function: mgpolygon * Description: draw a polygon * Args: nv: number of vertices * *v: array of nv vertices * nn: number of normals (should be either 0, 1, or nv) * *n: array of nn normals (ignored if nn==0) * nc: number of colors (should be either 0, 1, or nv) * *c: array of nc ColorA's (ignored if nc==0) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 16:41:24 1991 */ void mgpolygon(int nv, Point3 *v, int nn, Point3 *n, int nc,ColorA *c) /*----------------------------------------------------------------------- * Function: mgmesh * Description: draw a mesh * Args: wrap: either MM_NOWRAP for no wrapping * or MM_UWRAP for wrapping in the u direction (cylinder) * or MM_VWRAP for wrapping in the v direction (cylinder) * or MM_UWRAP+MM_VWRAP for wrapping in both dirs (torus) * nu: number of vertices in the u direction * nv: number of vertices in the v direction * p: array of nu*nv vertices in v-major order (u index * increases fastest) * n: array of nu*nv normals (same order as *p), or NULL * c: array of nu*nv ColorA's (same order as *p), or NULL * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 16:44:57 1991 * Notes: if n is NULL, normals are not supplied to the device. * if c is NULL, then the color settings in the current * default Appearance apply. */ void mgmesh(int wrap,int nu,int nv,Point3 *p,Point3 *n,ColorA *c) /*----------------------------------------------------------------------- * Function: mgline * Description: draws a line * Args: *p1: first endpoint of line * *p2: second endpoint of line * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 16:54:50 1991 */ void mgline(Point3 *p1, Point3 *p2) /*----------------------------------------------------------------------- * Function: mgpolyline * Description: draws a polyline * Args: nv: number of vertices * *verts: array of nv vertices * nc: number of colors (should be 0, 1, or nv) * *colors: array of nc colors * flags: bit-encoded: * flags&1 indicates that this polyline is a closed curve; * an extra vector should be drawn connecting the * first and last points. * Other bits are available as hints the mg driver may use * to optimize the work done in drawing: * flags&2 indicates that this is not the first of a * batch of related polylines. It might be sufficient * to initialize the drawing color for only the first * polyline in a batch; also, if the driver handles * displacing lines closer to the eye, then the transform * might be pushed before the first polyline of a batch * and popped after the last one. * flags&4 indicates that this is not the last of a * batch of related polylines. * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 16:56:33 1991 */ void mgpolyline(int nv, Point3 *verts, int nc, ColorA *colors, int flags) /*----------------------------------------------------------------------- * Function: mgpolylist * Description: draws a PolyList * Args: npolys: number of Poly structures (one per polygon) * *polys: array of Poly structures from polylist.h. * flags: indicates which Poly & Vertex fields are valid; * bitwise union of PL_HAS{P,V}{N,COL} from polylist.h. * Returns: nothing * Author: slevy * Date: Mon Aug 19 15:16:44 CDT 1991 */ void mgpolylist(int npolys, Poly *polys, int flags) /*----------------------------------------------------------------------- * Function: mgquads * Description: draws an array of Quads * Args: nquads: number of Poly structures (one per polygon) * *v: array of 4*nquads HPoint3's, the quads' vertices * *n: array of 4*nquads Point3's, their normals - or NULL * *c: array of 4*nquads ColorA's, their colors - or NULL * Returns: nothing * Author: slevy * Date: Mon Jul 17 23:16:20 CDT 1992 * Note: This routine was added to optimize quad drawing. */ void mgquads(int nquads, HPoint3 *v, Point3 *n, ColorA *c) /*----------------------------------------------------------------------- * Function: mgbezier * Description: draws a bezier for those drivers which support it * Args: degree_u: degree in u direction * degree_v: degree in v direction * dimension: dimension * *controlPoints: array of control points * *txmapst: array of 4 (s,t) float pairs for texture map * coordinates for each corner of map * *colors: array of 4 ColorA structs or NULL * Returns: nothing * Author: wisdom (from munzners older code) * Date: Sat Sep 19 16:37:08 CDT 1992 * Notes: Currently, the bezier is drawn blah blah * For those drivers which do not support beziers, the * bezier is diced and drawn as a mesh (common code default). */ void mgbezier(int degree_u, int degree_v, int dimension, float *ControlPoints, float *txmapst, ColorA *colors) /*----------------------------------------------------------------------- * Function: mgbegin * Description: intialize MG * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 18:27:39 1991 * Notes: Must be called exactly once, before any other mg * functions */ mgbegin() /*----------------------------------------------------------------------- * Function: mgdevice_XX * Description: select device xx * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 18:28:52 1991 * Notes: Must be called after mgbegin and before mgcreatecontext. * If the current context is for a device other than xx, * it is de-selected. * See mg.h for list of valid devices allowed for xx. */ mgdevice_XX() /*----------------------------------------------------------------------- * Function: mgend * Description: shut down MG * Args: (none) * Returns: nothing * Author: slevy, mbp * Date: Fri Jul 19 18:31:34 1991 * Notes: Call once after all other mg calls. */ mgend() =========================================================================== (1) should we go ahead and be systematic and have mgxx_begin and mgxx_end and decree that each should call the common routine of the same name? (device begin/end inside common begin/end). Done: renamed mgcopycontext to mgctxcopy mgselectcontext to mgctxselect mgsetAp to mgsetappearance mgsetCam to mgsetcamera added MG_SET and MG_MERGE for merge flag to setappearance. Too much confusion over whether 0 or 1 means set or merge!! geomview-1.9.4/src/lib/mg/opengl/0000777000175000001440000000000010665240676013610 500000000000000geomview-1.9.4/src/lib/mg/opengl/mgopenglP.h0000644000175000001440000001420210576017274015621 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mgopengl.h" #ifdef GLUT # include #else # define GL_GLEXT_PROTOTYPES # include # include # include #endif #include "bsptree.h" enum { SGL=0, DBL=1 }; typedef struct mgopenglcontext { struct mgcontext mgctx; /* The mgcontext */ int born; /* Has window been displayed on the screen? */ int win; /* GL window ID, or 0 */ double zmin, zmax; /* max z-buffer value */ ColorA Cd; /* Cached diffuse color = mat->diffuse * Kd */ int lmcolor; /* lmcolor: GL_DIFFUSE or XXX lmc_COLOR */ double znudge; /* _mgc.zfnudge in integer Z-buffer units */ double znear, zfar; /* Current Z-buffer glDepthRange(, $2) limits */ int oldopts; /* For knowing when we need to reconfigure */ vvec room; /* Scratch space */ #ifdef _WIN32 short used4f; /* Windows VC++ doesn't like us to use the */ short useevn3f; /* above function pointers. Use flags instead.*/ # define D4F_ON() _mgopenglc->used4f = 1 # define D4F_OFF() _mgopenglc->used4f = 0 # define D4F(c) { if(_mgopenglc->used4f) mgopengl_d4f(c); \ else glColor4fv(c); \ } # define N3F_NOEVERT() _mgopenglc->useevn3f = 0 # define N3F_EVERT() _mgopenglc->useevn3f = 1 # define N3F(n,p) { if(_mgopenglc->useevn3f) mgopengl_n3fevert(n,p); \ else glNormal3fv(n); \ } #else /* use function pointers if the compiler permits */ void (*d4f)(); /* For shaded colors: apply mat.kd or no? */ void (*n3f)(); /* Evert normals to face viewer? */ # define D4F_ON() \ if (_mgc->astk->mat.valid & MTF_ALPHA && \ _mgc->astk->mat.override & MTF_ALPHA) { \ _mgopenglc->d4f = mgopengl_d4f_shaded_alpha; \ } else { \ _mgopenglc->d4f = mgopengl_d4f_shaded; \ } # define D4F_OFF() \ if (_mgc->astk->mat.valid & MTF_ALPHA && \ _mgc->astk->mat.override & MTF_ALPHA) { \ _mgopenglc->d4f = mgopengl_d4f_constant_alpha; \ } else { \ _mgopenglc->d4f = glColor4fv; \ } # define D4F(c) (*_mgopenglc->d4f)(c) # define N3F_EVERT() _mgopenglc->n3f = mgopengl_n3fevert # define N3F_NOEVERT() _mgopenglc->n3f = glNormal3fv # define N3F(n,p) (*_mgopenglc->n3f)(n,p) #endif #ifndef GLUT void *GLXdisplay; /* X11 Display pointer; if non-NULL, mixed model */ GLXContext cam_ctx[2]; /* single[0] and double-buf[1] OGL contexts */ GLXContext curctx; /* Current OpenGL context */ #endif int winids[2]; /* single[0] and double-buffered[1] X win ids */ int should_lighting, is_lighting; /* Lighting flags so we can turn off lighting for points&lines */ int tevbound; /* Texturing currently enabled? */ TxUser *curtex; /* Currently-bound texture (NULL if none) */ int dither; /* Dither enabled? */ char *bgimagefile; /* compatibility: bgimage file name */ GLuint *light_lists; int n_light_lists; GLuint *texture_lists; int n_texture_lists; GLuint *translucent_lists; int n_translucent_lists; int translucent_seq; } mgopenglcontext; #define DPYLIST_INCR 10 #define MAXZNUDGE 8 /* Max possible depth of mgopengl_closer()/farther() calls */ /* We save the current W2C/C2W xforms on each call to mgopengl_worldbegin() * because the ModelView matrix stack actually stores both our object * xform and the view matrix: * * ModelView = [ obj xform ] * [ W2C ] * * Since we use the GL ModelView stack to keep track of our object xform, * instead of using the actual stack in the mgcontext struct, having * ModelView = W2C corresponds to [ obj xform ] = identity. We save W2C * and C2W on each mgopengl_worldbegin() because _mgc->cam might change * during the course of the frame, but isn't supposed to be reinterpreted * until the next mgopengl_worldbegin(). */ #define _mgopenglc ((mgopenglcontext*)_mgc) #if 0 extern void mgopengl_d4f( float c[4] ); #else extern void mgopengl_d4f_shaded(float c[4]); extern void mgopengl_d4f_shaded_alpha(float c[4]); extern void mgopengl_d4f_constant_alpha(float c[4]); #endif extern void mgopengl_n3fevert( Point3 *n, HPoint3 *p ); extern void mgopengl_notexture(void); extern void mgopengl_needtexture(void); extern void mgopengl_closer(void); extern void mgopengl_farther(void); extern void mgopengl_setshader(mgshadefunc shader); extern void mgopengl_drawnormal(HPoint3 *p, Point3 *n); extern void mgopengl_init_zrange(); extern void mgopengl_v4fcloser(HPoint3 *); extern void mgopengl_txpurge(TxUser *); extern void mgopengl_lights(LmLighting *lm, struct mgastk *astk); extern void mgopengl_appearance( struct mgastk *ma, int mask ); extern GLuint *mgopengl_realloc_lists(GLuint *lists, int *n_lists); extern GLuint mgopengl_new_translucent(Transform T); extern void mgopengl_end_translucent(void); extern void mgopengl_bsptree(BSPTree *bsptree); #ifdef _WIN32 extern void mgopengl_c4f(float *); extern void mgopengl_n3f(float *); #else #define mgopengl_c4f glColor4fv #define mgopengl_n3f glNormal3fv #endif #define MAY_LIGHT() { \ if(_mgopenglc->should_lighting && !_mgopenglc->is_lighting) { \ glEnable(GL_LIGHTING); \ _mgopenglc->is_lighting = 1; \ } } #define DONT_LIGHT() { \ if(_mgopenglc->is_lighting) { \ glDisable(GL_LIGHTING); \ _mgopenglc->is_lighting = 0; \ } \ } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/opengl/mgopengl.c0000644000175000001440000012431510653722126015476 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mgP.h" #include "mgopenglP.h" #include "windowP.h" #include "mgopenglshade.h" #ifdef GLUT # include #else #define GL_GLEXT_PROTOTYPES # include # include # include #endif #include #ifdef GLUT # define Window int #endif #include "polylistP.h" mgcontext * mgopengl_ctxcreate(int a1, ...); int mgopengl_ctxset( int a1, ... ); int mgopengl_feature( int feature ); void mgopengl_ctxdelete( mgcontext *ctx ); int mgopengl_ctxget( int attr, void* valueptr ); int mgopengl_ctxselect( mgcontext *ctx ); void mgopengl_sync( void ); void mgopengl_worldbegin( void ); void mgopengl_worldend( void ); void mgopengl_reshapeviewport( void ); void mgopengl_identity( void ); void mgopengl_transform( Transform T ); int mgopengl_pushtransform( void ); int mgopengl_poptransform( void ); void mgopengl_gettransform( Transform T ); void mgopengl_settransform( Transform T ); int mgopengl_pushappearance( void ); int mgopengl_popappearance( void ); const Appearance *mgopengl_setappearance(const Appearance* app, int merge ); int mgopengl_setcamera( Camera* cam ); int mgopengl_setwindow( WnWindow *win, int final ); mgopenglcontext *mgopengl_newcontext( mgopenglcontext *ctx ); void mgopengl_taggedappearance(const void *tag); extern void mgopengl_polygon(); extern void mgopengl_line(); extern void mgopengl_polyline(); extern void mgopengl_polylist(int np, Poly *p, int nv, Vertex *v, int plflags); extern void mgopengl_mesh(int wrap, int nu, int nv, HPoint3 *meshP, Point3 *meshN, Point3 *meshNQ, ColorA *meshC, TxST *meshST, int mflags); extern void mgopengl_quads(int count, HPoint3 *V, Point3 *N, ColorA *C, int qflags); int _mgopengl_ctxset(int a1, va_list *alist); static void mgopengl_choosewin(void), mgopengl_initwin(void); static void mgopengl_setviewport(void); static void mgimgfile2cambgimage(void); #ifndef GLUT static GLXContext mgopengl_sharectx(void); #endif WnWindow *mgopenglwindow(WnWindow *win); struct mgfuncs mgopenglfuncs = { MGD_OPENGL, mgdevice_OPENGL, mgopengl_feature, (mgcontext *(*)())mgopengl_ctxcreate, mgopengl_ctxdelete, (int (*)())mgopengl_ctxset, mgopengl_ctxget, mgopengl_ctxselect, mgopengl_sync, mgopengl_worldbegin, mgopengl_worldend, mgopengl_reshapeviewport, /* geometry transform */ mgopengl_settransform, mgopengl_gettransform, mgopengl_identity, mgopengl_transform, mgopengl_pushtransform, mgopengl_poptransform, /* texture transform */ mg_settxtransform, mg_gettxtransform, mg_txidentity, mg_txtransform, mg_pushtxtransform, mg_poptxtransform, /* appearance stack */ mgopengl_pushappearance, mgopengl_popappearance, mgopengl_setappearance, mg_getappearance, /*******************/ mgopengl_setcamera, mgopengl_polygon, mgopengl_polylist, mgopengl_mesh, mgopengl_line, mgopengl_polyline, mgopengl_quads, mg_bezier, mgopengl_bsptree, mg_tagappearance, mg_untagappearance, mgopengl_taggedappearance }; int mgdevice_OPENGL() { _mgf = mgopenglfuncs; if (_mgc != NULL && _mgc->devno != MGD_OPENGL) _mgc = NULL; return(0); } /*----------------------------------------------------------------------- * Function: mgopengl_ctxcreate * Date: Thu Jul 18 18:55:18 1991 * Author: mbp * Notes: see mg.doc for rest of spec */ mgcontext * mgopengl_ctxcreate(int a1, ...) { va_list alist; _mgc = (mgcontext*)mgopengl_newcontext(OOGLNewE(mgopenglcontext, "mgopengl_ctxcreate")); va_start(alist, a1); if (_mgopengl_ctxset(a1, &alist) == -1) { mgopengl_ctxdelete(_mgc); } va_end(alist); return _mgc; } /*----------------------------------------------------------------------- * Function: _mgopengl_ctxset * Description: internal ctxset routine * Args: a1: first attribute * *alist: rest of attribute-value list * Returns: -1 on error, 0 on success * Author: mbp * Date: Fri Sep 20 11:08:13 1991 * Notes: mgopengl_ctxcreate() and mgopengl_ctxset() call this to actually * parse and interpret the attribute list. */ int _mgopengl_ctxset(int a1, va_list *alist) { int attr; char **ablock = NULL; #define NEXT(type) OOGL_VA_ARG(type,alist,ablock) for (attr = a1; attr != MG_END; attr = NEXT(int)) { switch (attr) { case MG_ABLOCK: ablock = NEXT(char**); break; case MG_ApSet: { Appearance *ap; if (ablock) { ap = ApSet(NULL, AP_ABLOCK, ablock); } else { ap = _ApSet(NULL, va_arg(*alist, int), alist); } mgopengl_setappearance(ap, MG_MERGE); ApDelete(ap); } break; case MG_WnSet: if (ablock) { WnSet( _mgc->win, WN_ABLOCK, ablock); } else { _WnSet( _mgc->win, va_arg(*alist, int), alist); } mgopengl_setwindow( _mgc->win, 0 ); break; case MG_CamSet: if (ablock) { CamSet( _mgc->cam, CAM_ABLOCK, ablock); } else { _CamSet( _mgc->cam, va_arg(*alist, int), alist); break; } break; case MG_APPEAR: mgsetappearance(NEXT(Appearance *), MG_SET); break; case MG_WINDOW: mgopengl_setwindow( NEXT(WnWindow *), 0 ); break; case MG_CAMERA: mgopengl_setcamera( NEXT(Camera*) ); break; case MG_SETOPTIONS: _mgc->opts |= NEXT(int); break; case MG_UNSETOPTIONS: _mgc->opts &= ~NEXT(int); break; case MG_SHOW: _mgc->shown = NEXT(int); break; case MG_PARENT: _mgc->parent = NEXT(mgcontext*); break; case MG_BACKGROUND: { _mgc->background = *NEXT(ColorA*); if (_mgc->cam) { CamSet(_mgc->cam, CAM_BGCOLOR, &_mgc->background, CAM_END); } break; } case MG_SHADER: mgopengl_setshader( NEXT(mgshadefunc) ); break; case MG_SHADERDATA: _mgc->astk->shaderdata = NEXT(void*); break; case MG_SPACE: { int space = NEXT(int); switch (TM_SPACE(space)) { case TM_EUCLIDEAN: case TM_SPHERICAL: _mgc->space = space; break; case TM_HYPERBOLIC: switch (TM_MODEL(space)) { case TM_VIRTUAL: case TM_PROJECTIVE: case TM_CONFORMAL_BALL: _mgc->space = space; break; default: fprintf(stderr, "_mgopengl_ctxset: Illegal space value %1d\n", space); break; } break; default: fprintf(stderr, "_mgopengl_ctxset: Illegal space value %1d\n", space); break; } } break; case MG_NDCTX: _mgc->NDctx = NEXT(mgNDctx *); break; case MG_WINCHANGE: _mgc->winchange = NEXT(mgwinchfunc); break; case MG_WINCHANGEDATA: _mgc->winchangeinfo = NEXT(void *); break; case MG_ZNUDGE: _mgc->zfnudge = NEXT(double); if(_mgopenglc->born) mgopengl_init_zrange(); break; case MG_BITDEPTH: /*ignored*/ NEXT(int); break; case MG_DITHER: _mgopenglc->dither = NEXT(int); break; case MG_DEPTHSORT: /*ignored*/ NEXT(int); break; /* Open GL-specific */ case MG_GLWINID: _mgopenglc->win = NEXT(int); break; #ifndef GLUT case MG_GLXDISPLAY: _mgopenglc->GLXdisplay = NEXT(void *); break; case MG_GLXSINGLECTX: _mgopenglc->cam_ctx[SGL] = NEXT(GLXContext); break; case MG_GLXDOUBLECTX: _mgopenglc->cam_ctx[DBL] = NEXT(GLXContext); break; #endif case MG_GLXSINGLEWIN: _mgopenglc->winids[SGL] = NEXT(int); break; case MG_GLXDOUBLEWIN: _mgopenglc->winids[DBL] = NEXT(int); break; case MG_BGIMAGEFILE: { char *fname = NEXT(char *); if (_mgopenglc->bgimagefile) { free(_mgopenglc->bgimagefile); } _mgopenglc->bgimagefile = fname ? strdup(fname) : NULL; mgimgfile2cambgimage(); break; } default: OOGLError (0, "_mgopengl_ctxset: undefined option: %d", attr); return -1; } } if (_mgc->shown && !_mgopenglc->born) { /* open the window */ mgopenglwindow(_mgc->win); /* bring gl state into accordance with appearance state */ { Appearance *ap = ApCopy( &(_mgc->astk->ap), NULL ); mgopengl_setappearance( ap, MG_SET ); ApDelete(ap); } } #undef NEXT return 0; } /*----------------------------------------------------------------------- * Function: mgopengl_ctxget * Description: get a context attribute value * Args: attr: the attribute to get * value: place to write attr's value * Returns: 1 for success; -1 if attr is invalid * Author: mbp * Date: Fri Sep 20 11:50:25 1991 * Notes: */ int mgopengl_ctxget(int attr, void* value) { #define VALUE(type) ((type*)value) switch (attr) { /* Attributes common to all MG contexts: */ case MG_APPEAR: *VALUE(Appearance*) = &(_mgc->astk->ap); break; case MG_CAMERA: *VALUE(Camera*) = _mgc->cam; break; case MG_WINDOW: /* In GLUT case, we demand that the caller use mgctxset(MG_WINDOW, ...) * whenever our window size changes. Under GLX/X11, we do it ourselves. */ #ifndef GLUT if(_mgopenglc->win > 0) { int x0, y0; WnPosition wp; unsigned int xsize, ysize, border_width, depth; Window dpyroot, toss; XGetGeometry((Display *) (_mgopenglc->GLXdisplay), (Window) _mgopenglc->win, &dpyroot, &x0, &y0, &xsize, &ysize, &border_width, &depth); XTranslateCoordinates((Display *) (_mgopenglc->GLXdisplay), (Window) _mgopenglc->win, dpyroot, 0, ysize-1, &x0, &y0, &toss); y0 = HeightOfScreen( DefaultScreenOfDisplay((Display *) (_mgopenglc->GLXdisplay))) - y0 - 1; wp.xmin = (long)x0; wp.xmax = (long)(x0+xsize-1); wp.ymin = (long)y0; wp.ymax = (long)(y0+ysize-1); WnSet(_mgc->win, WN_CURPOS, &wp, WN_END); } #endif *VALUE(WnWindow*) = _mgc->win; break; case MG_PARENT: *VALUE(mgcontext*) = _mgc->parent; break; case MG_SETOPTIONS: case MG_UNSETOPTIONS: *VALUE(int) = _mgc->opts; break; case MG_BACKGROUND: *VALUE(ColorA) = _mgc->background; break; case MG_SHADER: *VALUE(mgshadefunc) = _mgc->astk->shader; break; case MG_SHADERDATA: *VALUE(void *) = _mgc->astk->shaderdata; break; case MG_SPACE: *VALUE(int) = _mgc->space; break; case MG_NDCTX: *VALUE(mgNDctx *) = _mgc->NDctx; break; case MG_ZNUDGE: *VALUE(float) = _mgc->zfnudge; break; case MG_DEPTHSORT: *VALUE(int) = MG_ZBUFFER; break; case MG_BITDEPTH: *VALUE(int) = 24; break; case MG_DITHER: *VALUE(int) = _mgopenglc->dither; break; case MG_WINCHANGE: *VALUE(mgwinchfunc) = _mgc->winchange; break; case MG_WINCHANGEDATA: *VALUE(void *) = _mgc->winchangeinfo; break; /* Attributes specific to GL contexts: */ case MG_GLWINID: *VALUE(int) = _mgopenglc->win; break; case MG_GLBORN: *VALUE(int) = _mgopenglc->born; break; case MG_GLZMAX: *VALUE(double) = _mgopenglc->zmax; break; case MG_GLXSINGLEWIN: *VALUE(Window) = _mgopenglc->winids[SGL]; break; case MG_GLXDOUBLEWIN: *VALUE(Window) = _mgopenglc->winids[DBL]; break; #ifndef GLUT case MG_GLXSINGLECTX: *VALUE(GLXContext) = _mgopenglc->cam_ctx[SGL]; break; case MG_GLXDOUBLECTX: *VALUE(GLXContext) = _mgopenglc->cam_ctx[DBL]; break; case MG_GLXSHARECTX: { *VALUE(GLXContext) = mgopengl_sharectx(); break; } #endif case MG_BGIMAGEFILE: *VALUE(char *) = _mgopenglc->bgimagefile; break; default: OOGLError (0, "mgopengl_ctxget: undefined option: %d", attr); return -1; } return 1; #undef VALUE } /*----------------------------------------------------------------------- * Function: mgopenglwindow * Description: create a GL window * Args: *win: the WnWindow structure to realize * Returns: win if success, NULL if not * Author: mbp, slevy * Date: Fri Sep 20 11:56:31 1991 * Notes: makes the GL calls necessary to create a GL window * corresponding to *win. This involves the call to * winopen(), as well as various configuration things. */ WnWindow * mgopenglwindow(WnWindow *win) { mgopengl_choosewin(); mgopengl_setwindow(win, 1); mgopengl_initwin(); return win; } #ifndef GLUT static GLXContext mgopengl_sharectx(void) { mgcontext *another; GLXContext shareable = NULL; for(another = _mgclist; another != NULL; another = another->next) { if(another->devno == MGD_OPENGL) { if((shareable = ((mgopenglcontext *)another)->cam_ctx[SGL]) != NULL || (shareable = ((mgopenglcontext *)another)->cam_ctx[DBL]) != NULL) break; } } return shareable; } #endif/*!GLUT*/ /*----------------------------------------------------------------------- * Function: mgopengl_ctxset * Description: set some context attributes * Args: a1, ...: list of attribute-value pairs * Returns: -1 on error, 0 on success * Author: mbp * Date: Fri Sep 20 12:00:18 1991 */ int mgopengl_ctxset( int a1, ... ) { va_list alist; int result; va_start( alist, a1 ); result = _mgopengl_ctxset(a1, &alist); va_end(alist); return result; } /*----------------------------------------------------------------------- * Function: mgopengl_feature * Description: report whether the GL device has a particular feature * Args: feature: the feature to report on * Returns: an int giving info about feature * Author: mbp * Date: Fri Sep 20 12:00:58 1991 * Notes: -1 means the feature is not present. * * NO OPTIONAL FEATURES SUPPORTED YET. ALWAYS RETURNS -1. */ int mgopengl_feature( int feature ) { return(-1); } /*----------------------------------------------------------------------- * Function: mgopengl_ctxdelete * Description: delete a GL context * Args: *ctx: context to delete * Returns: nothing * Author: slevy * Date: Tue Nov 12 10:29:04 CST 1991 * Notes: Deleting the current context leaves the current-context * pointer set to NULL. */ void mgopengl_ctxdelete( mgcontext *ctx ) { if(ctx->devno != MGD_OPENGL) { mgcontext *was = _mgc; mgctxselect(ctx); mgctxdelete(ctx); if(was != ctx) mgctxselect(was); } else { #define mgoglc ((mgopenglcontext *)ctx) #ifdef GLUT if(mgoglc->winids[0] > 0) glutDestroyWindow(mgoglc->winids[0]); if(mgoglc->winids[1] > 0) glutDestroyWindow(mgoglc->winids[1]); #else /*GLX*/ if(mgoglc->born) { int i; for(i = SGL; i <= DBL; i++) { if(mgoglc->cam_ctx[i] && mgoglc->win > 0) glXDestroyContext( (Display *)(mgoglc->GLXdisplay), mgoglc->cam_ctx[i]); } } #endif vvfree(&((mgopenglcontext *)ctx)->room); if (mgoglc->light_lists) free(mgoglc->light_lists); if (mgoglc->texture_lists) free(mgoglc->texture_lists); if (mgoglc->translucent_lists) free(mgoglc->translucent_lists); if (mgoglc->bgimagefile) { free(mgoglc->bgimagefile); } mg_ctxdelete(ctx); if(ctx == _mgc) _mgc = NULL; } } /*----------------------------------------------------------------------- * Function: mgopengl_ctxselect * Description: select an MG context --- make it current * Args: *ctx: the context to become current * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:04:41 1991 */ int mgopengl_ctxselect( mgcontext *ctx ) { if(ctx == NULL || ctx->devno != MGD_OPENGL) { return mg_ctxselect(ctx); } /* Yes, it's an OpenGL context. Do something useful. */ _mgc = ctx; if(_mgopenglc->win) { #ifdef GLUT if(_mgopenglc->win <= 0) mgopengl_choosewin(); if(_mgopenglc->win > 0) glutSetWindow(_mgopenglc->win); #else /* GLX */ if(_mgopenglc->GLXdisplay != NULL) { _mgopenglc->win = _mgopenglc->winids[ _mgc->opts & MGO_DOUBLEBUFFER ? DBL : SGL ]; _mgopenglc->curctx = _mgopenglc->cam_ctx[ _mgc->opts & MGO_DOUBLEBUFFER ? DBL : SGL ]; if(_mgopenglc->win > 0) glXMakeCurrent( (Display *)_mgopenglc->GLXdisplay, (Window) _mgopenglc->win, _mgopenglc->curctx); } #endif /*GLX*/ } return 0; } /*----------------------------------------------------------------------- * Function: mgopengl_sync * Description: flush buffered GL commands * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:06:09 1991 * Notes: Just flushes the GL buffer -- needed for remote displays. */ void mgopengl_sync( void ) { glFlush(); } /*static int glut_initted = 0;*/ static void mgopengl_makewin(int which) { #define dpy (_mgopenglc->GLXdisplay) int xsize, ysize; #ifdef GLUT WnPosition wp; if(!glut_initted) { static int unargc = 1; static char *unargv[] = { "mg_glut", NULL }; glutInit(&unargc, (char **)&unargv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glut_initted = 0; } if(WnGet(_mgc->win, WN_XSIZE, &xsize) <= 0 || WnGet(_mgc->win, WN_YSIZE, &ysize) <= 0) { xsize = ysize = 200; WnSet(_mgc->win, WN_XSIZE, xsize, WN_YSIZE, 200, WN_END); } if(WnGet(_mgc->win, WN_PREFPOS, &wp) > 0) { glutInitWindowPosition(wp.xmin, wp.ymin); } glutInitWindowSize(xsize, ysize); _mgopenglc->winids[which] = glutCreateWindow("GLUT mg"); #else /* GLX */ static int dblBuf[] = { GLX_DOUBLEBUFFER, GLX_RGBA, GLX_DEPTH_SIZE, 23, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_ALPHA_SIZE, 1, None }; XSetWindowAttributes xswa; int scr = XDefaultScreen(dpy); Window root = XRootWindow(dpy, scr); XVisualInfo *vi = glXChooseVisual(dpy, scr, which==SGL ? dblBuf+1 : dblBuf); if(vi == NULL) { OOGLError(1, "Can't find an OpenGL-capable X visual."); exit(1); } _mgopenglc->cam_ctx[which] = glXCreateContext(dpy, vi, mgopengl_sharectx(), GL_TRUE); xswa.colormap = (vi->visual == XDefaultVisual(dpy, scr)) ? XDefaultColormap(dpy, scr) : XCreateColormap(dpy, root, vi->visual, AllocNone); xswa.event_mask = KeyPressMask|ButtonPressMask |ButtonReleaseMask|ButtonMotionMask |EnterWindowMask|StructureNotifyMask|ExposureMask; xswa.border_pixel = xswa.background_pixel = xswa.backing_pixel = xswa.background_pixmap = None; if(WnGet(_mgc->win, WN_XSIZE, &xsize) <= 0 || WnGet(_mgc->win, WN_YSIZE, &ysize) <= 0) { xsize = ysize = 200; WnSet(_mgc->win, WN_XSIZE, xsize, WN_YSIZE, 200, WN_END); } _mgopenglc->winids[which] = XCreateWindow( dpy, root, 0, 0, xsize, ysize, 0/*border*/, vi->depth, InputOutput, vi->visual, CWEventMask|CWColormap|CWBorderPixel |CWBackPixel|CWBackPixmap, &xswa); XMapWindow(dpy, _mgopenglc->winids[which]); #undef dpy #endif /*GLX*/ } static void mgopengl_choosewin(void) { int which = (_mgc->opts & MGO_DOUBLEBUFFER) ? DBL : SGL; /* Are we on our own? If caller didn't initialize our X state, do it now. */ #ifdef GLUT if(_mgopenglc->winids[which] == 0) { mgopengl_makewin(which); if(_mgopenglc->winids[which] == 0) which = 1-which; } if(_mgc->winchange) (*_mgc->winchange)(_mgc, _mgc->winchangeinfo, MGW_DOUBLEBUF, (which == DBL)); _mgopenglc->win = _mgopenglc->winids[which]; glutSetWindow(_mgopenglc->win); #else /* GLX */ if(_mgopenglc->GLXdisplay == NULL && _mgopenglc->winids[which] == 0) { if((_mgopenglc->GLXdisplay = XOpenDisplay(NULL)) == NULL) { OOGLError(1, "Can't open X display"); return; } } /* Did they tell us single/double-buffering is possible? */ /* Switch back to the other buffer if need be */ if(_mgopenglc->cam_ctx[which] == NULL) { if(_mgopenglc->cam_ctx[1-which] == NULL) { mgopengl_makewin(which); } else { which = 1-which; } } if(_mgc->winchange) (*_mgc->winchange)(_mgc, _mgc->winchangeinfo, MGW_DOUBLEBUF, (which == DBL)); _mgopenglc->curctx = _mgopenglc->cam_ctx[which]; _mgopenglc->win = _mgopenglc->winids[which]; if(_mgopenglc->win > 0) { XRaiseWindow( (Display *)_mgopenglc->GLXdisplay, (Window) _mgopenglc->win ); glXMakeCurrent( (Display *)_mgopenglc->GLXdisplay, (Window) _mgopenglc->win, _mgopenglc->curctx); } #endif /* GLX */ if (_mgopenglc->n_light_lists == 0) _mgopenglc->light_lists = mgopengl_realloc_lists(NULL, &_mgopenglc->n_light_lists); if (_mgopenglc->n_texture_lists == 0) _mgopenglc->texture_lists = mgopengl_realloc_lists(NULL, &_mgopenglc->n_texture_lists); if (_mgopenglc->n_translucent_lists == 0) _mgopenglc->translucent_lists = mgopengl_realloc_lists(NULL, &_mgopenglc->n_translucent_lists); } static void mgopengl_setviewport() { WnPosition vp, whole; WnGet(_mgc->win, WN_VIEWPORT, &vp); glViewport(vp.xmin, vp.ymin, vp.xmax-vp.xmin+1, vp.ymax-vp.ymin+1); glScissor(vp.xmin, vp.ymin, vp.xmax-vp.xmin+1, vp.ymax-vp.ymin+1); if(WnGet(_mgc->win, WN_CURPOS, &whole) <= 0 || vp.xmax-vp.xmin < whole.xmax-whole.xmin || vp.ymax-vp.ymin < whole.ymax-whole.ymin) { glEnable(GL_SCISSOR_TEST); } else { glDisable(GL_SCISSOR_TEST); } _mgc->win->changed &= ~WNF_HASVP; } static void mgopengl_initwin() { GLdouble zrange[2]; int i; LtLight **lp; glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); glMatrixMode(GL_PROJECTION); glLoadMatrixf((GLfloat *)TM_IDENTITY); glMatrixMode(GL_MODELVIEW); _mgopenglc->oldopts = _mgc->opts; _mgopenglc->born = 1; glGetDoublev(GL_DEPTH_RANGE, zrange); _mgopenglc->zmin = zrange[0]; _mgopenglc->zmax = zrange[1]; mgopengl_init_zrange(); glClearDepth(_mgopenglc->zmax); glClearColor(_mgc->background.r, _mgc->background.g, _mgc->background.b, _mgc->background.a); glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); if((_mgc->opts&MGO_DOUBLEBUFFER) && !(_mgc->opts&MGO_INHIBITSWAP) ) { #ifdef GLUT glutSwapBuffers(); #else if(_mgopenglc->win > 0) glXSwapBuffers((Display *) (_mgopenglc->GLXdisplay), (Window) _mgopenglc->win); #endif } mgopengl_setviewport(); /* Ensure the lighting gets properly entered into this new window -- * mark all lights as having changed. */ LM_FOR_ALL_LIGHTS(&_mgc->astk->lighting, i,lp) { (*lp)->changed = 1; } mgopengl_setappearance(&_mgc->astk->ap, MG_SET); } /*----------------------------------------------------------------------- * Function: mgopengl_worldbegin * Description: prepare to draw a frame * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:06:58 1991 */ void mgopengl_worldbegin( void ) { Transform V; int which = (_mgc->opts & MGO_DOUBLEBUFFER) ? DBL : SGL; mg_worldbegin(); /* Initialize W2C, C2W, W2S, S2W, etc. */ if( #ifndef GLUT _mgopenglc->curctx != _mgopenglc->cam_ctx[which] || #endif (_mgc->opts ^ _mgopenglc->oldopts) & MGO_DOUBLEBUFFER) { mgopengl_choosewin(); mgopengl_initwin(); _mgopenglc->oldopts = _mgc->opts; } glColorMask(_mgc->opts & MGO_NORED ? GL_FALSE : GL_TRUE, _mgc->opts & MGO_NOGREEN ? GL_FALSE : GL_TRUE, _mgc->opts & MGO_NOBLUE ? GL_FALSE : GL_TRUE, GL_TRUE ); if(_mgc->win->changed & WNF_HASVP) { mgopengl_setviewport(); } /* Erase to background color & initialize z-buffer */ if (_mgc->opts & MGO_INHIBITCLEAR) { glClearDepth(1.); glClear(GL_DEPTH_BUFFER_BIT); } else { Image *bgimg; glClearDepth( _mgopenglc->zmax); glClearColor(_mgc->background.r, _mgc->background.g, _mgc->background.b, _mgc->background.a); glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); if((bgimg = _mgc->bgimage)) { static GLint formats[] = { 0, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA }; static GLdouble pos[] = {0.0, 0.0, -1.0}; int xsize, ysize, off; /* Could resize the image to fit the window here, * (or force the window to fit the image!) * but let's make that the user's problem. */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); WnGet(_mgc->win, WN_XSIZE, &xsize); WnGet(_mgc->win, WN_YSIZE, &ysize); glOrtho(0, xsize, 0, ysize, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); if(xsize >= bgimg->width) { pos[0] = (xsize - bgimg->width)/2; off = 0; } else { pos[0] = 0; off = (bgimg->width - xsize) / 2; glPixelStorei(GL_UNPACK_ROW_LENGTH, bgimg->width); } if(ysize >= bgimg->height) { pos[1] = (ysize - bgimg->height)/2; } else { pos[1] = 0; off += bgimg->width * ((bgimg->height - ysize) / 2); } glRasterPos3dv(pos); glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); if (bgimg->channels % 1 == 0) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); } glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glDrawPixels(xsize < bgimg->width ? xsize : bgimg->width, ysize < bgimg->height ? ysize : bgimg->height, formats[bgimg->channels], GL_UNSIGNED_BYTE, bgimg->data + bgimg->channels*off ); if (bgimg->channels % 1 == 0) { glBlendFunc(GL_SRC_ALPHA, GL_ZERO); glDisable(GL_BLEND); } glDepthMask(GL_TRUE); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); } } glEnable(GL_DEPTH_TEST); glRenderMode(GL_RENDER); if(_mgopenglc->dither) { glEnable(GL_DITHER); } else { glDisable(GL_DITHER); } _mgc->has = 0; /* Interpret the camera: load the proper matrices onto the GL matrix stacks. */ if(!(_mgc->opts & MGO_INHIBITCAM)) { glMatrixMode(GL_PROJECTION); CamViewProjection( _mgc->cam, V ); glLoadMatrixf( (GLfloat *) V); glMatrixMode(GL_MODELVIEW); glLoadMatrixf( (GLfloat *) _mgc->W2C); } /* Bind the lights; do this here so we get lights in world coords. */ /* Only do this if we're supposed to do lighting */ if (IS_SHADED(_mgc->astk->ap.shading)) mgopengl_lights(&_mgc->astk->lighting, _mgc->astk); } /*----------------------------------------------------------------------- * Function: mgopengl_worldend * Description: finish drawing a frame * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:08:02 1991 */ void mgopengl_worldend( void ) { GLuint list; /* Execute and delete any pending translucent display lists. */ for (list = 0; list < _mgopenglc->translucent_seq; list++) { glCallList(_mgopenglc->translucent_lists[list]); } for (list = 0; list < _mgopenglc->translucent_seq; list++) { /* Destroy the contents of the dpy lists for translucent objects. */ glNewList(_mgopenglc->translucent_lists[list], GL_COMPILE); glEndList(); } _mgopenglc->translucent_seq = 0; if((_mgc->opts&MGO_DOUBLEBUFFER) && !(_mgc->opts&MGO_INHIBITSWAP)) { #ifdef GLUT glutSwapBuffers(); #else if(_mgopenglc->win > 0) glXSwapBuffers(_mgopenglc->GLXdisplay, (Window) _mgopenglc->win); #endif } glFlush(); } /*----------------------------------------------------------------------- * Function: mgopengl_reshapeviewport * Description: adjust to a new window size * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:08:30 1991 * Notes: adjusts both GL's internal viewport setting, as well as * MG context WnWindow's current position and camera's * aspect ratio. */ void mgopengl_reshapeviewport( void ) { float pixasp = 1; WnPosition vp; WnGet(_mgc->win, WN_PIXELASPECT, &pixasp); WnGet(_mgc->win, WN_VIEWPORT, &vp); mgopengl_setviewport(); CamSet(_mgc->cam, CAM_ASPECT, pixasp * (double)(vp.xmax-vp.xmin+1) / (double)(vp.ymax-vp.ymin+1), CAM_END); } /*----------------------------------------------------------------------- * Function: mgopengl_identity * Description: set the current object xform to identity * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:23:48 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in GL_MODELVIEW mode. */ void mgopengl_identity( void ) { /* [ obj xform ] = identity corresponds to having current W2C on ModelView stack */ mgopengl_settransform( TM3_IDENTITY ); } /*----------------------------------------------------------------------- * Function: mgopengl_transform * Description: premultiply the object xform by T * Args: T * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:24:57 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in GL_MODELVIEW mode. */ void mgopengl_transform( Transform T ) { glMultMatrixf( (GLfloat *) (T)); TmConcat(T, _mgc->xstk->T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgopengl_pushtransform * Description: push the object xform stack * Returns: nothing (???) * Author: mbp * Date: Fri Sep 20 12:25:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in GL_MODELVIEW mode. */ int mgopengl_pushtransform( void ) { glPushMatrix(); mg_pushtransform(); return 0; } /*----------------------------------------------------------------------- * Function: mgopengl_popransform * Description: pop the object xform stack * Returns: nothing (???) * Author: mbp * Date: Fri Sep 20 12:25:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in GL_MODELVIEW mode. */ int mgopengl_poptransform( void ) { glPopMatrix(); mg_poptransform(); return 0; } /*----------------------------------------------------------------------- * Function: mgopengl_gettransform * Description: get the current object xform * Args: T: place to write the current object xform * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:29:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. This means we must multiply on the right by * the current C2W matrix after reading the GL ModelView * matrix. * * This assumes we're already in GL_MODELVIEW mode. */ void mgopengl_gettransform( Transform T ) { TmCopy(_mgc->xstk->T, T); } /*----------------------------------------------------------------------- * Function: mgopengl_settransform * Description: set the current object xform to T * Args: T * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:29:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. This means we must first load W2C onto the * modelview stact, then premult by T. * * This assumes we're already in GL_MODELVIEW mode. */ void mgopengl_settransform( Transform T ) { glLoadMatrixf( (GLfloat *) _mgc->W2C); glMultMatrixf( (GLfloat *) T); TmCopy(T, _mgc->xstk->T); _mgc->has = _mgc->xstk->hasinv = 0; } /*----------------------------------------------------------------------- * Function: mgopengl_new_translucent * Description: start a display-list which stores a translucent object, * the dpy-list will be called later after all opaque objects * have been drawn. * Returns: the display list. * Author: cH * Date: Fri Nov 17 2006 */ GLuint mgopengl_new_translucent(Transform T) { if (_mgopenglc->n_translucent_lists <= _mgopenglc->translucent_seq) { _mgopenglc->translucent_lists = mgopengl_realloc_lists(_mgopenglc->translucent_lists, &_mgopenglc->n_translucent_lists); } glNewList(_mgopenglc->translucent_lists[_mgopenglc->translucent_seq], GL_COMPILE /* do not execute now */); /* include the side-effects into the displaylist */ mgopengl_pushtransform(); mgopengl_pushappearance(); /* Load the current transformation matrix into the display list */ mgopengl_settransform(T); /* alpha-blending will be enabled on-demand in mgopengl_bsptree(). */ return _mgopenglc->translucent_lists[_mgopenglc->translucent_seq++]; } /*----------------------------------------------------------------------- * Function: mgopengl_end_translucent * Description: end the definition of a translucent object. * Returns: the display list. * Author: cH * Date: Fri Nov 17 2006 */ void mgopengl_end_translucent(void) { /* include the side-effects into the displaylist */ mgopengl_popappearance(); mgopengl_poptransform(); glEndList(); /* No need to disable alpha-blending because the corresponding * enable-commands are wrapped into a GL_COMPILE display list. */ } /*----------------------------------------------------------------------- * Function: mgopengl_pushappearance * Description: push the MG context appearance stack * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:54:19 1991 */ int mgopengl_pushappearance( void ) { mg_pushappearance(); return 0; } /*----------------------------------------------------------------------- * Function: mgopengl_popappearance * Description: pop the MG context appearance stack * Returns: nothing * Author: mbp, munzner * Date: Fri Sep 20 12:54:19 1991 * Note: We call mgopengl_lighting and mgopengl_material instead of * just doing lmbinds here because those procedures make the * proper existence checks and reset the GL drawing state. */ int mgopengl_popappearance( void ) { struct mgastk *mastk = _mgc->astk; struct mgastk *mastk_next; if (! (mastk_next=mastk->next)) { OOGLError(0, "mgopengl_popappearance: appearance stack has only 1 entry."); return 0; } if ( ( (mastk->light_seq != mastk_next->light_seq) /* lighting changed */ #ifndef TRUE_EMISSION || ((mastk->mat.valid ^ mastk_next->mat.valid) & MTF_EMISSION) /* GL_LIGHT_MODEL_TWO_SIDE changed */ #endif ) && IS_SHADED(mastk->next->ap.shading)) /* lighting on */ mgopengl_lighting(mastk_next, mastk_next->lighting.valid); mgopengl_appearance(mastk_next, mastk_next->ap.valid); mg_popappearance(); if (_mgopenglc->tevbound && _mgopenglc->curtex->tx != mastk_next->ap.tex) { mgopengl_notexture(); /* Unbind our no-longer-needed texture */ } return 1; } /*----------------------------------------------------------------------- * Function: mgopengl_setappearance * Author: munzner, mbp * Date: Wed Aug 7 01:08:07 1991 * Notes: when app=NULL, mergeflag = MG_MERGE is assumed * (regardless of the actual value of mergeflag). * In this case, we make the GL calls to bring * the GL state into agreement with the current * appearance. * * The above isn't true any more; update these comments * soon. -- mbp Mon Sep 23 19:07:39 1991 * * things set here: material, lights, shading, * linewidth, transparency * things not set here: normals (drawing, scaling, * everting), drawing faces vs. edges */ const Appearance * mgopengl_setappearance(const Appearance *ap, int mergeflag ) { int changed, mat_changed, lng_changed; struct mgastk *mastk = _mgc->astk; Appearance *ma; static float nullarray[] = { 0.0 }; ma = &(mastk->ap); /* Decide what changes */ if (mergeflag == MG_MERGE) { changed = ap->valid &~ (ma->override &~ ap->override); mat_changed = ap->mat ? ap->mat->valid &~ (ma->mat->override &~ ap->mat->override) : 0; lng_changed = ap->lighting ? ap->lighting->valid &~ (ma->lighting->override &~ ap->lighting->override) : 0; } else { changed = ap->valid; mat_changed = ap->mat ? ap->mat->valid : 0; lng_changed = ap->lighting ? ap->lighting->valid : 0; } /* * Update current appearance; this needs to be done before making GL * calls because it is conceivable that we might need to make a GL call * corresponding to something in the current appearance for which the * valid bit in *ap isn't set. (???) By updating the current * appearance before making GL calls, our GL calls can always take data * from the current appearance, rather than worrying about whether to * read *ap or the current appearance. */ mg_setappearance( ap, mergeflag ); /* Bring GL device into accord with new appearance */ if (_mgopenglc->born) { /* * No bit in "changed" corresponds to {lighting,mat}. We think of * ap->{lighting,mat} as an extension to *ap which is interpreted to * have all valid bits 0 if the {lighting,ap} pointer is NULL. Note * that this means there is no way for the parent to override the * entire {lighting,mat} structure as a whole. It can, however, set * the individual override bits in the {lighting,mat} structure. */ if ((ap->lighting) && (mastk->next)) { if (mastk->light_seq == mastk->next->light_seq) { mastk->light_seq = next_light_seq(_mgc, mastk); if (_mgopenglc->n_light_lists <= mastk->light_seq) { _mgopenglc->light_lists = mgopengl_realloc_lists(_mgopenglc->light_lists, &_mgopenglc->n_light_lists); } /* * We need a new lighting model. * To ensure we don't have any leftover garbage in GL's copy of this * lighting model, we force GL to reset to defaults, then * reinitialize everything. */ glNewList(_mgopenglc->light_lists[mastk->light_seq], GL_COMPILE); glMaterialf(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, *nullarray); glEndList();; lng_changed |= ma->lighting->valid; /* "All fields changed" */ } } if (ma->shading != APF_CONSTANT && (ap->lighting != NULL #ifndef TRUE_EMISSION /* Hack: must enable GL_LIGHT_MODEL_TWO_SIDE lighting if so */ || (mastk->next && (mastk->mat.valid ^ mastk->next->mat.valid) & MTF_EMISSION) #endif )) { mgopengl_lighting( mastk, lng_changed ); } /* Let mgopengl_material() decide if we need a new material */ if (ap->mat) { mgopengl_material( mastk, mat_changed ); } mgopengl_appearance( mastk, changed ); if (_mgopenglc->tevbound && _mgopenglc->curtex->tx != ap->tex) { mgopengl_notexture(); /* Unbind our no-longer-needed texture */ } } return &_mgc->astk->ap; } void mgopengl_taggedappearance(const void *tag) { struct mgastk *astk = (struct mgastk *)tag; Appearance *ap = &astk->ap; LmLighting *lm = &astk->lighting; mg_setappearance(ap, 0); if (lm->valid) { glCallList(_mgopenglc->light_lists[astk->light_seq]); } glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadMatrixf(&_mgc->W2C[0][0] ); mgopengl_lights(lm, astk); glPopMatrix(); /* Let mgopengl_material() decide if we need a new material */ if (ap->mat) { mgopengl_material(astk, ap->mat->valid); } mgopengl_appearance(astk, ap->valid); if (_mgopenglc->tevbound && _mgopenglc->curtex->tx != ap->tex) { mgopengl_notexture(); /* Unbind our no-longer-needed texture */ } } static void mgimgfile2cambgimage(void) { Image *bgimage; if (_mgc->cam && _mgopenglc->bgimagefile) { bgimage = ImgCreate(IMG_CHANNELS, IMGF_RGBA, IMG_DATA_CHAN_FILE, IMGF_RGB, NULL, _mgopenglc->bgimagefile, IMG_END); if (bgimage) { CamSet(_mgc->cam, CAM_BGIMAGE, bgimage); ImgDelete(bgimage); } } } /*----------------------------------------------------------------------- * Function: mgopengl_setcamera * Description: set the context's camera (pointer) * Args: *cam: the camera to use * Returns: nothing * Author: mbp * Date: Fri Sep 20 13:07:31 1991 * Notes: The context stores a pointer to the camera, not a copy * of it. */ int mgopengl_setcamera(Camera* cam) { if (_mgc->cam != cam) { CamDelete(_mgc->cam); _mgc->cam = REFGET(Camera, cam); if (_mgc->cam) { CamGet(_mgc->cam, CAM_BGCOLOR, &_mgc->background); mgimgfile2cambgimage(); } } return true; } /* * Change current Window structure. * If 'final' and otherwise appropriate, actually open the window. * Apply relevant changes to window, if needed. */ int mgopengl_setwindow( WnWindow *win, int final ) { if(win == NULL) { return 0; } /* We can't do anything on our own. Leave it up to * the (possibly) user-supplied winchange callback. */ if(_mgc->winchange) (*_mgc->winchange)(_mgc, _mgc->winchangeinfo, MGW_WINCHANGE, win); if(win != _mgc->win) { WnDelete(_mgc->win); _mgc->win = REFGET(WnWindow, win); } return 1; } GLuint *mgopengl_realloc_lists(GLuint *lists, int *n_lists) { int i; GLuint new_lists; if ((new_lists = glGenLists(DPYLIST_INCR)) == 0) { OOGLError(0, "mgopengl_realloc_lists: no new lists available."); return NULL; } lists = realloc(lists, (*n_lists + DPYLIST_INCR)*sizeof(GLuint)); for (i = *n_lists; i < *n_lists + DPYLIST_INCR; i++) { lists[i] = new_lists++; } *n_lists = i; return lists; } /*----------------------------------------------------------------------- * Function: mgopengl_newcontext * Description: initialize a new mgopenglcontext structure * Args: *ctx: the struct to initialize * Returns: ctx * Author: mbp * Date: Fri Sep 20 13:11:03 1991 */ mgopenglcontext * mgopengl_newcontext( mgopenglcontext *ctx ) { mg_newcontext(&(ctx->mgctx)); ctx->mgctx.devfuncs = &mgopenglfuncs; ctx->mgctx.devno = MGD_OPENGL; ctx->mgctx.astk->ap_seq = 0; ctx->mgctx.astk->mat_seq = 0; ctx->mgctx.astk->light_seq = 0; ctx->mgctx.zfnudge = 40.e-6; ctx->born = 0; ctx->win = 0; ctx->winids[SGL] = ctx->winids[DBL] = 0; { mgcontext *oldmgc = _mgc; _mgc = (mgcontext *)ctx; D4F_OFF(); N3F_NOEVERT(); _mgc = oldmgc; } ctx->lmcolor = GL_DIFFUSE; ctx->tevbound = 0; ctx->curtex = NULL; VVINIT(ctx->room, char, 180); #ifndef GLUT ctx->GLXdisplay = NULL; ctx->cam_ctx[SGL] = ctx->cam_ctx[DBL] = 0; ctx->curctx = 0; #endif ctx->should_lighting = ctx->is_lighting = 0; ctx->dither = 1; ctx->bgimagefile = NULL; /* reserve a number of display list numbers */ ctx->n_light_lists = 0; ctx->light_lists = NULL; ctx->n_texture_lists = 0; ctx->texture_lists = NULL; ctx->n_translucent_lists = 0; ctx->translucent_lists = NULL; ctx->translucent_seq = 0; return ctx; } /*----------------------------------------------------------------------- * Function: mgopengl_findctx * Description: Given a GL window ID, returns the associated mg context. * Returns: mgcontext * for success, NULL if none exists. * Author: slevy * Date: Mon Nov 11 18:33:53 CST 1991 * Notes: This is a public routine. */ mgcontext * mgopengl_findctx( int winid ) { struct mgcontext *mgc; for(mgc = _mgclist; mgc != NULL; mgc = mgc->next) { if(mgc->devno == MGD_OPENGL && ((mgopenglcontext *)mgc)->win == winid) return mgc; } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/opengl/mgopengl.h0000644000175000001440000000342010455701005015465 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * MG context attributes specific to GL * * MG_GLBORN may only be gotten. Not set. */ #define MG_GLWINID 101 /* window id (returned by winopen) */ #define MG_GLBORN 102 /* born flag (has window been created)? */ #define MG_GLZMAX 103 /* max z-buffer value */ #define MG_GLXDISPLAY 104 /* X11 Display * (for mixed model) */ #define MG_GLXSINGLEWIN 105 /* X Window id of single-buffered window */ #define MG_GLXDOUBLEWIN 106 /* X Window id of double-buffered window */ #define MG_GLXSINGLECTX 107 /* X11 context for single-buffered window */ #define MG_GLXDOUBLECTX 108 /* X11 context for double-buffered window */ #define MG_GLXSHARECTX 109 /* 'Get' another GLXcontext (or None) for sharing */ #define MG_BGIMAGEFILE 110 /* Name of file containing background image */ extern mgcontext *mgopengl_findctx(int glwinid); geomview-1.9.4/src/lib/mg/opengl/Makefile.am0000644000175000001440000000036010455665336015560 00000000000000INCLUDES = $(default_includes) $(OPENGLINCLUDE) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgopengl.la libmgopengl_la_SOURCES = \ mgopengl.c mgopengldraw.c mgopenglmesh.c mgopenglshade.c \ mgopengl.h mgopenglP.h mgopenglshade.h geomview-1.9.4/src/lib/mg/opengl/Makefile.in0000644000175000001440000003613310665240505015566 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mg/opengl DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmgopengl_la_LIBADD = am_libmgopengl_la_OBJECTS = mgopengl.lo mgopengldraw.lo \ mgopenglmesh.lo mgopenglshade.lo libmgopengl_la_OBJECTS = $(am_libmgopengl_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libmgopengl_la_SOURCES) DIST_SOURCES = $(libmgopengl_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) $(OPENGLINCLUDE) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmgopengl.la libmgopengl_la_SOURCES = \ mgopengl.c mgopengldraw.c mgopenglmesh.c mgopenglshade.c \ mgopengl.h mgopenglP.h mgopenglshade.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mg/opengl/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mg/opengl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libmgopengl.la: $(libmgopengl_la_OBJECTS) $(libmgopengl_la_DEPENDENCIES) $(LINK) $(libmgopengl_la_OBJECTS) $(libmgopengl_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgopengl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgopengldraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgopenglmesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgopenglshade.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/mg/opengl/mgopengldraw.c0000644000175000001440000006503310653722144016355 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mgP.h" #include "mgopenglP.h" #include "polylistP.h" #include "quadP.h" #include "bsptreeP.h" #ifdef GLUT # include #else #define GL_GLEXT_PROTOTYPES # include #endif #ifndef alloca #include #endif void mgopengl_polygon( int nv, HPoint3 *v, int nn, Point3 *n, int nc,ColorA *c ); void mgopengl_line( HPoint3 *p1, HPoint3 *p2 ); void mgopengl_polyline( int nv, HPoint3 *verts, int nc, ColorA *colors, int wrap ); void mgopengl_polylist(int np, Poly *p, int nv, Vertex *v, int plflags); void mgopengl_drawnormal(HPoint3 *p, Point3 *n); void mgopengl_closer(); void mgopengl_farther(); #ifndef NO_ZNUDGE # define mgopengl_v4ffunc(v) glVertex4fv(&(v)->x); #else # define mgopengl_v4ffunc(v) mgopengl_v4fcloser(v) #endif /*----------------------------------------------------------------------- * Function: mgopengl_polygon * Description: draw a polygon * Author: mbp, munzner * Date: Mon Jul 29 16:53:56 1991 * Notes: See mg.doc. * * do later: Different shading cases separated into different * loops for speed. */ void mgopengl_polygon(int nv, HPoint3 *V, int nn, Point3 *N, int nc, ColorA *C) { int i; HPoint3 *v; Point3 *n; ColorA *c; int ninc; int flag; flag = _mgc->astk->ap.flag; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) { nc = 0; } ninc = (nn > 1); if (nc == 0) { C = (ColorA*)&_mgc->astk->ap.mat->diffuse; } /* reestablish correct drawing color if necessary */ if (flag & APF_FACEDRAW) { MAY_LIGHT(); glColorMaterial(GL_FRONT_AND_BACK, _mgopenglc->lmcolor); glEnable(GL_COLOR_MATERIAL); glBegin(GL_POLYGON); if (nc <= 1) { D4F(&(_mgc->astk->ap.mat->diffuse)); } for (n = N, c = C, v = V, i = 0; i < nv; ++i, ++v) { if (nc-- > 0) { D4F(c); c++; } if (nn-- > 0) { N3F(n, v); n++; } glVertex4fv((float *)v); } glEnd(); } if ( flag & (APF_EDGEDRAW|APF_NORMALDRAW) ) { if (_mgopenglc->znudge) mgopengl_closer(); glDisable(GL_COLOR_MATERIAL); DONT_LIGHT(); if (flag & APF_EDGEDRAW) { glColor3fv((float *)&_mgc->astk->ap.mat->edgecolor); glBegin(GL_LINE_LOOP); for (v = V, i = 0; iastk->ap.mat->normalcolor); for (n = N, v = V, i = 0; iznudge) mgopengl_farther(); } } void mgopengl_quads(int count, HPoint3 *V, Point3 *N, ColorA *C, int qflags) { int i; HPoint3 *v; Point3 *n; ColorA *c; int flag; #define QUAD(stuff) { \ int k = 4; \ do { stuff; } while(--k > 0); \ } if (count <= 0) return; flag = _mgc->astk->ap.flag; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) { C = NULL; } /* reestablish correct drawing color if necessary */ if ((flag & APF_FACEDRAW) && !(qflags & GEOM_ALPHA)) { glColorMaterial(GL_FRONT_AND_BACK, _mgopenglc->lmcolor); glEnable(GL_COLOR_MATERIAL); MAY_LIGHT(); i = count; v = V; c = C; n = N; glBegin(GL_QUADS); if (c) { if (n) { do { QUAD( (D4F(c++), N3F(n++,v), glVertex4fv((float*)v++)) ); } while(--i > 0); } else { /* Colors, no normals */ do { QUAD( (D4F(c++), glVertex4fv((float*)v++)) ); } while(--i > 0); } } else { c = (ColorA*)&_mgc->astk->ap.mat->diffuse; if (n) { D4F(c); do { QUAD( (N3F(n++, v), glVertex4fv((float*)v++)) ); } while(--i > 0); } else { D4F(c); do { QUAD( (glVertex4fv((float*)v++)) ); } while(--i > 0); } } glEnd(); } if ( flag & (APF_EDGEDRAW|APF_NORMALDRAW) ) { if (_mgopenglc->znudge) mgopengl_closer(); glDisable(GL_COLOR_MATERIAL); DONT_LIGHT(); if (flag & APF_EDGEDRAW) { glColor3fv((float *)&_mgc->astk->ap.mat->edgecolor); i = count; v = V; do { int k = 4; glBegin(GL_LINE_LOOP); do { mgopengl_v4ffunc(v++); } while(--k > 0); glEnd(); } while(--i > 0); } if (flag & APF_NORMALDRAW && N) { glColor3fv((float *)&_mgc->astk->ap.mat->normalcolor); i = count*4; v = V; n = N; do { mgopengl_drawnormal(v++, n++); } while(--i > 0); } if (_mgopenglc->znudge) mgopengl_farther(); } } void mgopengl_line( HPoint3 *p1, HPoint3 *p2 ) { DONT_LIGHT(); glBegin(GL_LINE_STRIP); glVertex4fv((float *)p1); glVertex4fv((float *)p2); glEnd(); } void mgopengl_point(HPoint3 *v) { HPoint3 a; HPoint3 *p, *q; float vw; DONT_LIGHT(); if (_mgc->astk->ap.linewidth > 1) { if (!(_mgc->has & HAS_POINT)) mg_makepoint(); /* Compute w component of point after projection to screen */ vw = v->x * _mgc->O2S[0][3] + v->y * _mgc->O2S[1][3] + v->z * _mgc->O2S[2][3] + v->w * _mgc->O2S[3][3]; if (vw <= 0) return; #define PUT(p) \ a.x = v->x + p->x*vw; a.y = v->y + p->y*vw; \ a.z = v->z + p->z*vw; a.w = v->w + p->w*vw; \ glVertex4fv((float *)&a) p = VVEC(_mgc->point, HPoint3); q = p + VVCOUNT(_mgc->point); glBegin(GL_TRIANGLE_STRIP); PUT(p); do { p++; PUT(p); if (p >= q) break; q--; PUT(q); } while(p < q); glEnd(); } else { glBegin(GL_POINTS); glVertex4fv((float *)v); glEnd(); } } void mgopengl_polyline( int nv, HPoint3 *v, int nc, ColorA *c, int wrapped ) { DONT_LIGHT(); /* note we don't reset to current material color because we could be * in the middle of a list of lines and should inherit the color from * the last color call. */ if (!(wrapped & 2)) { /* First member of batch */ if (_mgopenglc->znudge) mgopengl_closer(); if (nc) glDisable(GL_COLOR_MATERIAL); } if (nv == 1) { if (nc > 0) glColor4fv((float *)c); mgopengl_point(v); } else if (nv > 0) { glBegin(GL_LINE_STRIP); if (wrapped & 1) { if (nc > 0) glColor4fv((float *)(c + nc - 1)); mgopengl_v4ffunc(v + nv - 1); } do { if (--nc >= 0) glColor4fv((float *)c++); mgopengl_v4ffunc(v++); } while(--nv > 0); glEnd(); } if (!(wrapped & 4) && _mgopenglc->znudge) mgopengl_farther(); } #if HAVE_LIBGLU /* Slave routine for mgopengl_trickypolygon() below. */ #include /* for allocating extra vertices */ #define obstack_chunk_alloc malloc #define obstack_chunk_free free struct tess_data { unsigned plflags; Point3 *pnormal; struct obstack obst; }; static void tess_vertex_data(Vertex *vp, struct tess_data *data) { if (data->plflags & PL_HASVCOL) D4F(&vp->vcol); if (data->plflags & PL_HASVN) N3F(&vp->vn, &vp->pt); if (data->plflags & PL_HASST) glTexCoord2fv((GLfloat *)&vp->st); glVertex4fv(&vp->pt.x); } static void tess_combine_data(GLdouble coords[3], Vertex *vertex_data[4], GLfloat weight[4], Vertex **dataOut, struct tess_data *data) { Vertex *vertex; int i, n; HPt3Coord w; vertex = obstack_alloc(&data->obst, sizeof(Vertex)); /* Although otherwise documented at least the Mesa version of the * GLU tesselator sometimes does not fill vertex_data with valid * pointers. */ for (n = 3; n >= 0 && vertex_data[n] == NULL; --n); ++n; if (data->plflags & VERT_ST) { /* texture co-ordinates */ for (i = 0; i < n; i++) { vertex->st.s += weight[i] * vertex_data[i]->st.s; vertex->st.t += weight[i] * vertex_data[i]->st.t; } /* same linear combination stuff as in SplitPolyNode()@bsptree.c; * be careful not to dehomogenize, otherwise texturing might come * out wrong. */ for (i = 0, w = 0.0; i < n; i++) { w += weight[i] * vertex_data[i]->pt.w; } } else { w = 1.0; } vertex->pt.x = coords[0] * w; vertex->pt.y = coords[1] * w; vertex->pt.z = coords[2] * w; vertex->pt.w = w; if (data->plflags & VERT_N) { /* The averaged vertex normals do not have an orientation, so try * to orient them w.r.t. the polygon normal before computing the * linear combination. */ memset(&vertex->vn, 0, sizeof(vertex->vn)); for (i = 0; i < n; i++) { Point3 *vn = &vertex_data[i]->vn; if (Pt3Dot(vn, data->pnormal) < 0.0) { Pt3Comb(-weight[i], vn, 1.0, &vertex->vn, &vertex->vn); } else { Pt3Comb(weight[i], vn, 1.0, &vertex->vn, &vertex->vn); } } Pt3Unit(&vertex->vn); } if (data->plflags & VERT_C) { /* colors */ memset(&vertex->vcol, 0, sizeof(vertex->vcol)); for (i = 0; i < n; i++) { vertex->vcol.r += weight[i] * vertex_data[i]->vcol.r; vertex->vcol.g += weight[i] * vertex_data[i]->vcol.g; vertex->vcol.b += weight[i] * vertex_data[i]->vcol.b; vertex->vcol.a += weight[i] * vertex_data[i]->vcol.a; } } *dataOut = vertex; } /* * Called when we're asked to deal with a possibly-concave polygon. * Note we can only be called if APF_CONCAVE mode is set. * * We assume that we are called with an actually concave polygon; this * is indicated by (p->flags & POLY_CONCAVE). */ static void mgopengl_trickypolygon(Poly *p, int plflags) { int i; Vertex *vp; static GLUtesselator *glutess; VARARRAY2(dpts, GLdouble, p->n_vertices, 3); struct tess_data data[1]; if (glutess == NULL) { /* Create GLU-library triangulation handle, just once */ glutess = gluNewTess(); gluTessProperty(glutess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO); #ifdef _WIN32 /* Windows idiocy. We shouldn't need to cast standard funcs! */ gluTessCallback(glutess, GLU_BEGIN, (GLUtessBeginProc)glBegin); gluTessCallback(glutess, GLU_VERTEX_DATA, (GLUtessVertexDataProc)tess_vertex_data); gluTessCallback(glutess, GLU_TESS_COMBINE_DATA, (GLUtessCombineDataProc)tess_combine_data); gluTessCallback(glutess, GLU_END, (GLUtessEndProc)glEnd); #else /* Any reasonable OpenGL implementation */ gluTessCallback(glutess, GLU_BEGIN, (GLvoid (*)())glBegin); gluTessCallback(glutess, GLU_TESS_VERTEX_DATA, (GLvoid (*)())tess_vertex_data); gluTessCallback(glutess, GLU_TESS_COMBINE_DATA, (GLvoid (*)())tess_combine_data); gluTessCallback(glutess, GLU_END, (GLvoid (*)())glEnd); #endif } data->plflags = plflags; data->pnormal = &p->pn; obstack_init(&data->obst); if ((plflags & VERT_N) && !(plflags & PL_HASPN)) { /* compute it now, we need it! */ PolyNormal(p, &p->pn, true /* 4d (?) */, false /* evert */, NULL, NULL); } /* tell GLU what we think is a good approximation for the normal */ gluTessNormal(glutess, p->pn.x, p->pn.y, p->pn.z); gluTessBeginPolygon(glutess, data); gluTessBeginContour(glutess); for (i = 0; i < p->n_vertices; i++) { HPt3Coord w; vp = p->v[i]; w = vp->pt.w ? vp->pt.w : 1e20; if (w == 1.0) { dpts[i][0] = vp->pt.x; dpts[i][1] = vp->pt.y; dpts[i][2] = vp->pt.z; } else { dpts[i][0] = vp->pt.x / w; dpts[i][1] = vp->pt.y / w; dpts[i][2] = vp->pt.z / w; } gluTessVertex(glutess, dpts[i], vp); } gluTessEndContour(glutess); gluTessEndPolygon(glutess); obstack_free(&data->obst, NULL); } #endif /* HAVE_LIBGLU */ /* The work-horse for mgopengl_bsptree(): * * Strategy: first render everything back of the side the camera is * on, then everything coincident with the currentd node's plane, then * then everything in front of the side the camera is on. * * We assume the camera is not coincident with any one of the * BSPTree's planes. * * plfl_and and plfl_or are flags to be added or substracted from the * node's plflags to implement appearance overrides. */ static void mgopengl_bsptree_recursive(BSPTreeNode *tree, HPoint3 *camera, int *plfl_and, int *plfl_or, const void **cur_app) { HPt3Coord scp; int sign; BSPTreeNode *first, *last; PolyListNode *plist; const Appearance *ap; Material *mat; scp = HPt3DotPt3(camera, (Point3 *)(void *)&tree->plane) - tree->plane.w; sign = fpos(scp) - fneg(scp); if (sign >= 0) { first = tree->back; last = tree->front; } else { first = tree->front; last = tree->back; } /* render all polygons back of us */ if (first) { mgopengl_bsptree_recursive(first, camera, plfl_and, plfl_or, cur_app); } for (plist = tree->polylist; plist; plist = plist->next) { Vertex **v; Poly *p = plist->poly; int j = p->n_vertices; int plflags = p->flags; bool apchg = false; if (*plist->tagged_app == NULL) { continue; } if (*cur_app != *plist->tagged_app) { apchg = true; /* set our appearance now */ mgtaggedappearance(*plist->tagged_app); /* record our appearance as the current one */ *cur_app = *plist->tagged_app; ap = mggetappearance(); } else { ap = mggetappearance(); } if (!(ap->flag & APF_FACEDRAW) || !(ap->flag & APF_TRANSP)) { continue; } mat = ap->mat; if (apchg) { /* set new plfl_and/_or values */ *plfl_and = ~0; *plfl_or = 0; #if 0 switch(ap->shading) { case APF_VCFLAT: case APF_FLAT: *plfl_and &= ~PL_HASVN; break; case APF_SMOOTH: *plfl_and &= ~PL_HASPN; break; default: *plfl_and &= ~(PL_HASVN|PL_HASPN); break; } #else switch(ap->shading) { case APF_FLAT: *plfl_and &= ~PL_HASVN; if (plflags & PL_HASPCOL) { *plfl_and &= ~PL_HASVCOL; } break; case APF_SMOOTH: *plfl_and &= ~PL_HASPN; break; case APF_VCFLAT: *plfl_and &= ~PL_HASVN; break; default: *plfl_and &= ~(PL_HASVN|PL_HASPN); break; } #endif if (mat->override & MTF_DIFFUSE) { if (!(_mgc->astk->flags & MGASTK_SHADER)) { /* software shading will not work yet */ *plfl_and &= ~GEOM_COLOR; } } /* Decide whether this polygon possibly has an alpha channel. * Same logic as in GeomHasAlpha(). */ if ((ap->flag & APF_TEXTURE) && ap->tex && ap->tex->apply != TXF_DECAL && ap->tex->image && (ap->tex->image->channels % 2 == 0)) { *plfl_or |= COLOR_ALPHA; } else if ((mat->valid & MTF_ALPHA) && ((mat->override & MTF_ALPHA) || !((plflags & *plfl_and) & (GEOM_COLOR)))) { if (mat->diffuse.a < 1.0) { *plfl_or |= COLOR_ALPHA; } else { *plfl_and &= ~COLOR_ALPHA; } } if (!(ap->flag & APF_TEXTURE) || (ap->tex == NULL)) { *plfl_and &= ~PL_HASST; } glColorMaterial(GL_FRONT_AND_BACK, _mgopenglc->lmcolor); glEnable(GL_COLOR_MATERIAL); MAY_LIGHT(); } plflags &= *plfl_and; plflags |= *plfl_or; /* We may want to do something else here if ever we should start * to use BSP-tress for the buffer etc. render engines. For now we * only render translucent objects here, and leave the rest to the * ordinary drawing engines. */ if (!(plflags & COLOR_ALPHA)) { continue; } #if DEBUG_BSPTREE /* make the sub-division visible */ if (ap->flag & (APF_EDGEDRAW|APF_NORMALDRAW)) { if (_mgopenglc->znudge) mgopengl_closer(); glDisable(GL_COLOR_MATERIAL); DONT_LIGHT(); if (ap->flag & APF_EDGEDRAW) { glColor3fv((float *)&ap->mat->edgecolor); glBegin(GL_LINE_LOOP); for (j=0, v=p->v; j < p->n_vertices; j++, v++) { mgopengl_v4ffunc(&(*v)->pt); } glEnd(); } if (ap->flag & APF_NORMALDRAW) { glColor3fv((float *)&_mgc->astk->ap.mat->normalcolor); if (plflags & PL_HASPN) { for (j=0, v = p->v; j < p->n_vertices; j++, v++) mgopengl_drawnormal(&(*v)->pt, &p->pn); } else if (plflags & PL_HASVN) { for (v = p->v, j = 0; j < p->n_vertices; j++, v++) { mgopengl_drawnormal(&(*v)->pt, &(*v)->vn); } } } if (_mgopenglc->znudge) mgopengl_farther(); apchg = 1; glColorMaterial(GL_FRONT_AND_BACK, _mgopenglc->lmcolor); glEnable(GL_COLOR_MATERIAL); MAY_LIGHT(); } #endif if (apchg) { /* Disable write access to the depth buffer and enable * alpha-blending. The blend function used here will work * without alpha-buffer support, because only the source alpha * value is used. */ glDepthMask(GL_FALSE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); /* Culling cannot work with transparency, so disable if it is * potentially enabled. */ if (ap->flag & APF_BACKCULL) { glDisable(GL_CULL_FACE); } /* Load textures if ap has changed */ if (plflags & PL_HASST) { mgopengl_needtexture(); } } /* reestablish correct drawing color if necessary*/ if (!(plflags & (PL_HASPCOL|PL_HASVCOL))) { D4F(&(mat->diffuse)); } if (plflags & PL_HASPCOL) { D4F(&p->pcol); } if (plflags & PL_HASPN) { N3F(&p->pn, &(*p->v)->pt); } v = p->v; /* normal algorithm */ glBegin(GL_POLYGON); switch (plflags & (PL_HASVCOL|PL_HASVN|PL_HASST)) { case 0: do { glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; case PL_HASVCOL: do { D4F(&(*v)->vcol); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; case PL_HASVN: do { N3F(&(*v)->vn, &(*v)->pt); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; case PL_HASVCOL|PL_HASVN: do { D4F(&(*v)->vcol); N3F(&(*v)->vn, &(*v)->pt); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; default: do { if (plflags & PL_HASVCOL) D4F(&(*v)->vcol); if (plflags & PL_HASVN) N3F(&(*v)->vn, &(*v)->pt); if (plflags & PL_HASST) glTexCoord2fv((GLfloat *)&(*v)->st); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; } glEnd(); /* GL_POLYGON */ } /* Render everything in front of us */ if (last) { mgopengl_bsptree_recursive(last, camera, plfl_and, plfl_or, cur_app); } } /*----------------------------------------------------------------------- * Function: mgopengl_bsptree * Description: draws a bsptree: binary space partition tree * Author: Claus-Justus Heine * Date: 2006 */ void mgopengl_bsptree(BSPTree *bsptree) { int plfl_and = ~0, plfl_or = 0; const void *ap; if (!bsptree->tree) { /* The tree can be empty, e.g. when no object had a translucent * polygon, or when translucent objects are disabled globally. */ return; } mgopengl_new_translucent(_mgc->xstk->T); /* First determine the position of the camera in the _current_ * coordinate system. We do assume that all tree nodes share the * same coordinate system. * * This means that transparent INSTs with fancy co-ordinate systems * are not handled correctly here; or that the high-level code has * to convert them first. */ if (!(_mgc->has & HAS_CPOS)) { mg_findcam(); } ap = NULL; mgopengl_bsptree_recursive(bsptree->tree, &_mgc->cpos, &plfl_and, &plfl_or, &ap); mgopengl_end_translucent(); } /*----------------------------------------------------------------------- * Function: mgopengl_polylist * Description: draws a Polylist: collection of Polys * Author: munzner * Date: Wed Oct 16 20:21:56 1991 * Notes: see mg.doc */ void mgopengl_polylist(int np, Poly *_p, int nv, Vertex *V, int plflags) { int i,j; Poly *p; Vertex **v, *vp; struct mgastk *ma = _mgc->astk; int flag, shading; int nonsurf = -1; flag = ma->ap.flag; shading = ma->ap.shading; switch(shading) { case APF_FLAT: plflags &= ~PL_HASVN; if (plflags & PL_HASPCOL) { plflags &= ~PL_HASVCOL; } break; case APF_SMOOTH: plflags &= ~PL_HASPN; break; case APF_VCFLAT: plflags &= ~PL_HASVN; break; default: plflags &= ~(PL_HASVN|PL_HASPN); break; } if ((_mgc->astk->mat.override & MTF_DIFFUSE)) { if (!(_mgc->astk->flags & MGASTK_SHADER)) { plflags &= ~GEOM_COLOR; } } if ((flag & APF_FACEDRAW) && !(plflags & GEOM_ALPHA)) { glColorMaterial(GL_FRONT_AND_BACK, _mgopenglc->lmcolor); glEnable(GL_COLOR_MATERIAL); MAY_LIGHT(); /* reestablish correct drawing color if necessary*/ if (!(plflags & (PL_HASPCOL | PL_HASVCOL))) { D4F(&(ma->ap.mat->diffuse)); } if ((_mgc->astk->ap.flag & APF_TEXTURE) && (_mgc->astk->ap.tex != NULL)) { if (plflags & PL_HASST) mgopengl_needtexture(); } else { plflags &= ~PL_HASST; } for (p = _p, i = 0; i < np; i++, p++) { if (plflags & PL_HASPCOL) D4F(&p->pcol); if (plflags & PL_HASPN) N3F(&p->pn, &(*p->v)->pt); v = p->v; if ((j = p->n_vertices) <= 2) { nonsurf = i; #if HAVE_LIBGLU } else if ((flag & APF_CONCAVE) && ((p->flags & POLY_CONCAVE) || (p->n_vertices > 4))) { mgopengl_trickypolygon(p, plflags); #endif } else { /* normal algorithm */ #if !HAVE_LIBGLU static bool was_here = false; if (!was_here && ((flag & APF_CONCAVE) && ((p->flags & POLY_CONCAVE) || (p->n_vertices > 4)))) { OOGLWarn("The GLU tesselator is not available; " "rendering of concave polygons will be wrong."); was_here = true; } #endif glBegin(GL_POLYGON); switch(plflags & (PL_HASVCOL|PL_HASVN|PL_HASST)) { case 0: do { glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; case PL_HASVCOL: do { D4F(&(*v)->vcol); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; case PL_HASVN: do { N3F(&(*v)->vn, &(*v)->pt); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; case PL_HASVCOL|PL_HASVN: do { D4F(&(*v)->vcol); N3F(&(*v)->vn, &(*v)->pt); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; default: do { if (plflags & PL_HASVCOL) D4F(&(*v)->vcol); if (plflags & PL_HASVN) N3F(&(*v)->vn, &(*v)->pt); if (plflags & PL_HASST) glTexCoord2fv((GLfloat *)&(*v)->st); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); break; } glEnd(); } } } if (flag & (APF_EDGEDRAW|APF_NORMALDRAW) || nonsurf >= 0) { if (_mgopenglc->znudge) mgopengl_closer(); glDisable(GL_COLOR_MATERIAL); DONT_LIGHT(); if (flag & APF_EDGEDRAW) { glColor3fv((float *)&_mgc->astk->ap.mat->edgecolor); for (p = _p, i = 0; i < np; i++, p++) { glBegin(GL_LINE_LOOP); for (j=0, v=p->v; j < p->n_vertices; j++, v++) { mgopengl_v4ffunc(&(*v)->pt); } glEnd(); } } if (flag & APF_NORMALDRAW) { glColor3fv((float *)&_mgc->astk->ap.mat->normalcolor); if (plflags & PL_HASPN) { for (p = _p, i = 0; i < np; i++, p++) { for (j=0, v=p->v; j < p->n_vertices; j++, v++) mgopengl_drawnormal(&(*v)->pt, &p->pn); } } else if (plflags & PL_HASVN) { for (vp = V, i = 0; i < nv; i++, vp++) { mgopengl_drawnormal(&vp->pt, &vp->vn); } } } if (nonsurf >= 0) { /* reestablish correct drawing color if necessary*/ if (!(plflags & (PL_HASPCOL | PL_HASVCOL))) D4F(&(ma->ap.mat->diffuse)); for (p = _p, i = 0; i <= nonsurf; p++, i++) { if (plflags & PL_HASPCOL) D4F(&p->pcol); v = p->v; switch(j = p->n_vertices) { case 1: if (plflags & PL_HASVCOL) glColor4fv((float *)&(*v)->vcol); mgopengl_point(&(*v)->pt); break; case 2: glBegin(GL_LINE_STRIP); do { if (plflags & PL_HASVCOL) glColor4fv((float *)&(*v)->vcol); glVertex4fv((float *)&(*v)->pt); v++; } while(--j > 0); glEnd(); break; } } } if (_mgopenglc->znudge) mgopengl_farther(); } } /* * Z-shift routines: for moving edges closer than faces, etc. */ void mgopengl_init_zrange() { struct mgopenglcontext *gl = _mgopenglc; gl->znudge = (double) _mgc->zfnudge * (gl->zmax - gl->zmin); gl->znear = gl->zmin + fabs(gl->znudge * (double)MAXZNUDGE); gl->zfar = gl->zmax - fabs(gl->znudge * (double)MAXZNUDGE); #ifndef NO_ZNUDGE glDepthRange(gl->znear, gl->zfar); #endif } void mgopengl_closer() { #ifndef NO_ZNUDGE glDepthRange( _mgopenglc->znear -= _mgopenglc->znudge, _mgopenglc->zfar -= _mgopenglc->znudge ); #endif } void mgopengl_farther() { #ifndef NO_ZNUDGE glDepthRange( _mgopenglc->znear += _mgopenglc->znudge, _mgopenglc->zfar += _mgopenglc->znudge ); #endif } /* There is a basic problem now with 4-d points and 3-d normal vectors. For now, we'll just ignore the 4-th coordinate of the point when computing the tip of the normal vector. This will work OK with all existing models, but for genuine 4-d points it won't work. But, come to think of it, what is the correct interpretation of the normal vector when the points live in 4-d? */ void mgopengl_drawnormal(HPoint3 *p, Point3 *n) { Point3 end, tp; HPt3Coord scale, w, s; if (p->w <= 0.0) return; if (p->w != 1) { HPt3ToPt3(p, &tp); p = (HPoint3 *)(void *)&tp; } scale = _mgc->astk->ap.nscale; if (_mgc->astk->ap.flag & APF_EVERT) { HPoint3 *cp = &_mgc->cpos; if (!(_mgc->has & HAS_CPOS)) { mg_findcam(); } if ((w = cp->w) != 1.0 && w != 0.0) { s = (p->x*w-cp->x)*n->x + (p->y*w-cp->y)*n->y + (p->z*w-cp->z)*n->z; } else { s = (p->x-cp->x)*n->x + (p->y-cp->y)*n->y + (p->z-cp->z)*n->z; } if (s > 0) { scale = -scale; } } end.x = p->x + scale*n->x; end.y = p->y + scale*n->y; end.z = p->z + scale*n->z; DONT_LIGHT(); /* cH: This is wrong. The current transformation need not be an * affine motion in which case the direction of the normals will * just come out wrong. I also wonder whether OpenGL's drawing stuff * does the right thing? */ glBegin(GL_LINE_STRIP); glVertex3fv((float *)p); glVertex3fv((float *)&end); glEnd(); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/opengl/mgopenglmesh.c0000644000175000001440000002670710611511667016361 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifdef GLUT # include #else #define GL_GLEXT_PROTOTYPES # include #endif #include #include #include #undef P /* ^^^ evil kludge XXX to get the P variables here to not get confused * with the P prototype macro. -nils */ #define HAS_N 0x01 #define HAS_NQ 0x02 #define HAS_C 0x04 #define HAS_SMOOTH 0x08 #define HAS_ST 0x10 void mgopenglsubmesh(int wrap, int nu, int nv, int umin, int umax, int vmin, int vmax, HPoint3 *meshP, Point3 *meshN, Point3 *meshNQ, ColorA *meshC, TxST *meshST, int mflags) { int u, v; int ucnt, vcnt; HPoint3 *P; Point3 *N, *NQ; ColorA *C; TxST *ST; int prev; int du; int douwrap; int i; int has; Appearance *ap; if(nu <= 0 || nv <= 0) return; ap = &_mgc->astk->ap; if ((_mgc->astk->mat.override & MTF_DIFFUSE) && !(_mgc->astk->flags & MGASTK_SHADER)) meshC = 0; has = 0; if (meshN && !(_mgc->astk->flags & MGASTK_SHADER)) { has |= HAS_N; } if (meshNQ && !(_mgc->astk->flags & MGASTK_SHADER)) { has |= HAS_NQ; } if (meshC) { has |= HAS_C; } if (IS_SMOOTH(ap->shading)) { has |= HAS_SMOOTH; } switch (ap->shading) { case APF_VCFLAT: case APF_FLAT: has &= ~HAS_N; break; case APF_SMOOTH: has &= ~HAS_NQ; break; default: has &= ~(HAS_N|HAS_NQ) /*(has & HAS_NQ) ? ~HAS_N : ~HAS_NQ*/; break; } if ((ap->flag & (APF_TEXTURE|APF_FACEDRAW)) == (APF_TEXTURE|APF_FACEDRAW) && _mgc->astk->ap.tex != NULL) { if (meshST != NULL) has |= HAS_ST; if (has&HAS_ST) { mgopengl_needtexture(); } } if (ap->flag & APF_FACEDRAW && nu > 1 && nv > 1 && !(mflags & GEOM_ALPHA)) { /* We triangulate strips of (v,u) mesh points: * (v,u) (v,u+1) (v,u+2) ... * (v+1,u) (v+1,u+1) (v+1,u+2) ... * using the vertex sequence * (v,u) , (v+1,u), (v,u+1), (v+1,u+1), (v,u+2), ... * This covers the territory from v to v+1; then repeat for other v's. * If we hit the 256-vertex triangle-mesh limit, the strip is spliced * by redrawing the latest (v,u+i),(v+1,u+i) pair of vertices. */ glColorMaterial(GL_FRONT_AND_BACK, _mgopenglc->lmcolor); glEnable(GL_COLOR_MATERIAL); MAY_LIGHT(); if(!(has & HAS_C)) D4F(&ap->mat->diffuse); v = vmax - vmin + 1; du = umin + vmin * nu; if(wrap & MM_VWRAP) { /* V-wrapping: cur = mesh[vmin,u], prev = mesh[vmax,u] */ prev = nu * (v - 1); } else { /* Not V-wrapping: cur = mesh[vmin+1,u], prev = mesh[vmin,u] */ du += nu; prev = -nu; v--; /* One less V-row, too */ } do { /* Loop over V */ P = meshP + du; N = meshN + du; NQ = meshNQ + du; C = meshC + du; ST = meshST + du; ucnt = umax - umin + 1; glBegin(GL_TRIANGLE_STRIP); douwrap = (wrap & MM_UWRAP); do { /* Loop over U */ u = ucnt; ucnt = 0; switch( has ) { case 0: case HAS_SMOOTH: do { glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); P++; } while(--u); break; case HAS_C: do { D4F(C+prev); glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); C++; P++; } while(--u); break; case HAS_C|HAS_SMOOTH: do { D4F(C+prev); glVertex4fv((float *)(P+prev)); D4F(C); glVertex4fv((float *)P); C++; P++; } while(--u); break; case HAS_NQ: do { N3F(NQ+prev,P+prev); glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); NQ++; P++; } while(--u); break; case HAS_N: do { N3F(N+prev,P); glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); N++; P++; } while(--u); break; case HAS_NQ|HAS_SMOOTH: do { N3F(NQ+prev,P+prev); glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); NQ++; P++; } while(--u); break; case HAS_N|HAS_SMOOTH: do { N3F(N+prev,P+prev); glVertex4fv((float *)(P+prev)); N3F(N,P); glVertex4fv((float *)P); N++; P++; } while(--u); break; case HAS_C|HAS_NQ: do { D4F(C+prev); N3F(NQ+prev,P+prev); glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); C++; NQ++; P++; } while(--u); break; case HAS_C|HAS_N: do { D4F(C+prev); N3F(N+prev,P+prev); glVertex4fv((float *)(P+prev)); glVertex4fv((float *)P); C++; N++; P++; } while(--u); break; case HAS_C|HAS_NQ|HAS_SMOOTH: do { D4F(C+prev); N3F(NQ+prev,P+prev); glVertex4fv((float *)(P+prev)); D4F(C); glVertex4fv((float *)P); C++; NQ++; P++; } while(--u); break; case HAS_C|HAS_N|HAS_SMOOTH: do { D4F(C+prev); N3F(N+prev,P+prev); glVertex4fv((float *)(P+prev)); D4F(C); N3F(N,P); glVertex4fv((float *)P); C++; N++; P++; } while(--u); break; case HAS_ST: do { glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); P++; ST++; } while(--u); break; case HAS_C|HAS_ST: do { D4F(C+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); C++; P++; ST++; } while(--u); break; case HAS_C|HAS_SMOOTH|HAS_ST: do { D4F(C+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); D4F(C); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); C++; P++; ST++; } while(--u); break; case HAS_NQ|HAS_ST: do { N3F(NQ+prev,P+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); NQ++; P++; ST++; } while(--u); break; case HAS_N|HAS_ST: do { N3F(N+prev,P+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); N++; P++; ST++; } while(--u); break; case HAS_NQ|HAS_SMOOTH|HAS_ST: do { N3F(NQ+prev,P+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); NQ++; P++; ST++; } while(--u); break; case HAS_N|HAS_SMOOTH|HAS_ST: do { N3F(N+prev,P+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); N3F(N,P); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); N++; P++; ST++; } while(--u); break; case HAS_C|HAS_NQ|HAS_ST: do { N3F(NQ+prev,P+prev); D4F(C+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); C++; NQ++; P++; ST++; } while(--u); break; case HAS_C|HAS_N|HAS_ST: do { D4F(C+prev); N3F(N+prev,P+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); C++; N++; P++; ST++; } while(--u); break; case HAS_C|HAS_NQ|HAS_SMOOTH|HAS_ST: do { D4F(C+prev); N3F(NQ+prev,P); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); D4F(C); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); C++; NQ++; P++; ST++; } while(--u); break; case HAS_C|HAS_N|HAS_SMOOTH|HAS_ST: do { D4F(C+prev); N3F(N+prev,P+prev); glTexCoord2fv((float *)(ST+prev)); glVertex4fv((float *)(P+prev)); D4F(C); N3F(N,P); glTexCoord2fv((float *)ST); glVertex4fv((float *)P); C++; N++; P++; ST++; } while(--u); break; } if(ucnt == 0) { if(douwrap) { douwrap = 0; /* Loop again on first vertex */ ucnt = 1; P = meshP + du; N = meshN + du; NQ = meshNQ + du; C = meshC + du; ST = meshST + du; } } else { glEnd(); /* Hit tmesh limit, splice */ glBegin(GL_TRIANGLE_STRIP); C--; N--; P--; ST--; /* Redraw last vertex */ } } while(ucnt); glEnd(); prev = -nu; du += nu; } while(--v > 0); } if(ap->flag & (APF_EDGEDRAW|APF_NORMALDRAW) || (ap->flag & APF_FACEDRAW && (nu == 1 || nv == 1))) { glDisable(GL_COLOR_MATERIAL); mgopengl_notexture(); DONT_LIGHT(); if(_mgopenglc->znudge) mgopengl_closer(); if(ap->flag & APF_EDGEDRAW) { /* Draw edges */ glColor3fv((float *)&ap->mat->edgecolor); du = umin + vmin * nu; ucnt = umax - umin + 1; vcnt = vmax - vmin + 1; v = vcnt; do { if(wrap & MM_UWRAP) glBegin(GL_LINE_LOOP); else glBegin(GL_LINE_STRIP); u = ucnt; P = meshP + du; do { glVertex4fv((float *)P); P++; } while(--u > 0); if(wrap & MM_UWRAP) glEnd(); else glEnd(); du += nu; } while(--v > 0); du = umin + vmin * nu; u = ucnt; do { v = vcnt; if(wrap & MM_VWRAP) glBegin(GL_LINE_LOOP); else glBegin(GL_LINE_STRIP); P = meshP + du; do { glVertex4fv((float *)P); P += nu; } while(--v > 0); if(wrap & MM_VWRAP) glEnd(); else glEnd(); du++; } while(--u > 0); } if(ap->flag & APF_NORMALDRAW) { if (has & HAS_N) { glColor3fv((float *)&ap->mat->normalcolor); for (i = nu*nv, P=meshP, N=meshN; --i >= 0; P++, N++) { mgopengl_drawnormal(P, N); } } else if (has & HAS_NQ) { glColor3fv((float *)&ap->mat->normalcolor); for (i = nu*nv, P=meshP, NQ=meshNQ; --i >= 0; P++, NQ++) { mgopengl_drawnormal(P, NQ); } } } if(_mgopenglc->znudge) mgopengl_farther(); } } void mgopengl_mesh(int wrap, int nu, int nv, HPoint3 *meshP, Point3 *meshN, Point3 *meshNQ, ColorA *meshC, TxST *meshST, int mflags) { mgopenglsubmesh(wrap, nu, nv, 0, nu-1, 0, nv-1, meshP, meshN, meshNQ, meshC, meshST, mflags); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/opengl/mgopenglshade.c0000644000175000001440000005635410645101215016501 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mgP.h" #include "mgopenglP.h" #include "mgopenglshade.h" #ifdef GLUT # include #else #define GL_GLEXT_PROTOTYPES # include #endif #define ID_OFFSET 0 /* materialno, lightmodelno, and lightno between 1 and 65535 are * legal. p 9-9 GL PROG GUIDE (munzner 9/17/91) */ /*static int lightno = 1;*/ static float kd = 1.0; /* Additional data needed if the image dimensions are not a power of 2. */ struct mgopengl_tudata { char *data; int xsize, ysize, channels; int qualflags; /* APF_TX{MIPMAP,MIPINTERP,LINEAR}: if loaded, how? */ }; void mgopengl_appearance(struct mgastk *ma, int mask) { Appearance *ap = &(ma->ap); if (mask & APF_TRANSP) { if (ap->flag & APF_TRANSP) { #if 0 /* Do not do this here; alpha-blending will be enabled as needed * in mgopengl_bsptree(). This is for the sake of efficiency: if * a geometry does not have any translucent component it is much * more efficient to use the depth buffer instead of alpha * blending, especially when there is no hardware rendering * support. */ glDepthMask(GL_FALSE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); #endif } else { glDepthMask(GL_TRUE); glBlendFunc(GL_ONE, GL_ZERO); glDisable(GL_BLEND); } } if (mask & APF_LINEWIDTH) { glLineWidth((GLfloat)(ap->linewidth)); _mgc->has &= ~HAS_POINT; } if (mask & APF_BACKCULL) { if(ap->flag & APF_BACKCULL) { glEnable( GL_CULL_FACE ); } else { glDisable( GL_CULL_FACE ); } } if (mask & APF_SHADING) { if(!IS_SHADED(ap->shading) || ma->shader != NULL) { /* switch to constant shading by unbinding the lmodel */ glDisable(GL_LIGHTING); _mgopenglc->should_lighting = _mgopenglc->is_lighting = 0; D4F_OFF(); _mgopenglc->lmcolor = GL_DIFFUSE; glShadeModel(IS_SMOOTH(ap->shading) ? GL_SMOOTH : GL_FLAT ); if (ma->shader != NULL && IS_SHADED(ap->shading)) { ma->flags |= MGASTK_SHADER; } else { ma->flags &= ~MGASTK_SHADER; } } else { /* turn shading on */ glEnable(GL_LIGHTING); _mgopenglc->should_lighting = _mgopenglc->is_lighting = 1; glShadeModel( IS_SMOOTH(ap->shading) ? GL_SMOOTH : GL_FLAT ); if (ap->lighting->valid) glCallList(_mgopenglc->light_lists[ma->light_seq]); mgopengl_material( ma, ma->mat.valid ); D4F_ON(); _mgopenglc->lmcolor = GL_DIFFUSE; ma->flags &= ~MGASTK_SHADER; } } if(mask & APF_EVERT) { /* * Do automatic normal-flipping if requested. */ if(ap->flag & APF_EVERT) { N3F_EVERT(); } else { N3F_NOEVERT(); } } /* * No GL calls are needed for the following attributes because * they are always interpreted at draw-time: * APF_FACEDRAW * APF_EDGEDRAW * APF_NORMSCALE */ } /*----------------------------------------------------------------------- * Function: mgopengl_material * Description: bind a material. define it if it's not yet defined. * Args: *mat: Material to bind. * mask: Bitmask telling which material fields are valid. * Passed into mgopengl_materialdef. * Returns: * Author: munzner * Date: Wed Oct 16 16:06:47 1991 * Notes: We must reset the "current GL color" after binding a * material. * We want color calls to change the *diffuse* color when * we're in shading mode. Thus we call glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);glEnable(GL_COLOR_MATERIAL). * We also must keep track of the diffuse coefficient * for use in mgopengl_d[3,4]f, our wrapper for color calls. * C3f or c4f should never be called directly. * mg draw routines are responsible for establishing the * correct drawing color. */ void mgopengl_material(struct mgastk *astk, int mask) { GLfloat f[4]; Material *mat = &astk->mat; #ifdef TRUE_EMISSION static float lmnull = (float) 0; /* LMNULL */ #endif mask &= mat->valid; if (mask & MTF_Kd) kd = mat->kd; if((mask & (MTF_EMISSION|MTF_DIFFUSE|MTF_AMBIENT|MTF_SPECULAR |MTF_SHININESS|MTF_Kd|MTF_Ka|MTF_Ks|MTF_ALPHA)) == 0) return; /* No GL changes to make. */ if(astk->next && astk->next->mat_seq == astk->mat_seq) { /* * Fresh material needed. Erase any previous GL definition. * We'll need to load all valid fields to initialize it. */ astk->mat_seq = next_mat_seq(_mgc, astk); #ifndef TRUE_EMISSION /* Needs fixing - TOR if(mat->valid & MTF_EMISSION) { glNewList( astk->mat_seq, GL_COMPILE); glMaterialf(GL_BACK, GL_AMBIENT_AND_DIFFUSE, * &lmnull); glEndList(); glCallList(astk->mat_seq); astk->mat_seq++; } */ #endif /*!TRUE_EMISSION*/ mask = mat->valid; } /* Build material definition */ f[3] = 1.0; #ifdef TRUE_EMISSION if( mask & MTF_EMISSION) { f[0] = mat->emission.r; f[1] = mat->emission.g; f[2] = mat->emission.b; glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, f); } #endif if( mask & (MTF_Kd | MTF_DIFFUSE)) { f[0] = mat->kd * mat->diffuse.r; f[1] = mat->kd * mat->diffuse.g; f[2] = mat->kd * mat->diffuse.b; f[3] = mat->diffuse.a; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, f); } f[3] = 1.0; if( mask & (MTF_Ka | MTF_AMBIENT)) { f[0] = mat->ka * mat->ambient.r; f[1] = mat->ka * mat->ambient.g; f[2] = mat->ka * mat->ambient.b; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, f); } if( mask & (MTF_Ks | MTF_SPECULAR | MTF_SHININESS)) { f[0] = mat->ks * mat->specular.r; f[1] = mat->ks * mat->specular.g; f[2] = mat->ks * mat->specular.b; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, f); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mat->shininess); } #ifndef TRUE_EMISSION /* Hack: use "emission" field as back diffuse color */ if(mask & MTF_EMISSION) { f[0] = mat->kd * mat->emission.r; f[1] = mat->kd * mat->emission.g; f[2] = mat->kd * mat->emission.b; glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, f); } #endif /*!TRUE_EMISSION*/ } void mgopengl_setshader(mgshadefunc shader) { struct mgastk *ma = _mgc->astk; unsigned short wasusing = ma->flags & MGASTK_SHADER; ma->shader = shader; if (shader != NULL && IS_SHADED(ma->ap.shading)) { ma->flags |= MGASTK_SHADER; } else { ma->flags &= ~MGASTK_SHADER; } if((ma->flags & MGASTK_SHADER) != wasusing) mgopengl_appearance(_mgc->astk, APF_SHADING); } void mgopengl_lighting(struct mgastk *astk, int mask) { LmLighting *lm = &astk->lighting; if (lm->valid) { mgopengl_lightmodeldef( astk->light_seq, lm, lm->valid & mask, astk ); glCallList(_mgopenglc->light_lists[astk->light_seq]); } glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadMatrixf( &_mgc->W2C[0][0] ); mgopengl_lights( lm, astk ); glPopMatrix(); } void mgopengl_lights( LmLighting *lm, struct mgastk *astk ) { int i, lightsused; LtLight *light, **lp; int baselight = -1; GLint maxlights; glGetIntegerv(GL_MAX_LIGHTS, &maxlights); /* unbind all currently bound OpenGL lights */ for (i=0; i < maxlights; i++) glDisable(GL_LIGHT0+i); lightsused = 0; LM_FOR_ALL_LIGHTS(lm, i,lp) { light = *lp; if (light->Private == 0) { /* this is a new light */ if(baselight < 0) { struct mgastk *a; /* Count appearance stack depth */ for(a = astk, baselight = 1; a != NULL; a = a->next) baselight += maxlights; } light->Private = lightsused + baselight; light->changed = 1; /* set changed, to force lmdef below */ } if (light->changed) { mgopengl_lightdef(GL_LIGHT0+lightsused, light, lm, lm->valid); light->changed = 0; } else { /* Even unchanged lights might have moved, if the * camera has moved since we last installed them. */ glLightfv( GL_LIGHT0 + lightsused, GL_POSITION, (float *)&light->globalposition ); } glEnable( GL_LIGHT0+lightsused); ++lightsused; } } int mgopengl_lightdef( int lightno, LtLight *light, LmLighting *lgt, int mask) { GLfloat f[4]; f[3] = 1.0; glLightfv(lightno, GL_AMBIENT, (float *)&light->ambient); f[0] = light->intensity * light->color.r; f[1] = light->intensity * light->color.g; f[2] = light->intensity * light->color.b; glLightfv(lightno, GL_DIFFUSE, f); glLightfv(lightno, GL_POSITION, (float *)&light->globalposition); if( mask & (LMF_ATTENC | LMF_ATTENM)) { glLightf(lightno, GL_CONSTANT_ATTENUATION, lgt->attenconst); glLightf(lightno, GL_LINEAR_ATTENUATION, lgt->attenmult); } return lightno; } int mgopengl_lightmodeldef(int lightmodel, LmLighting *lgt, int mask, struct mgastk *astk) { GLfloat f[4]; glNewList(_mgopenglc->light_lists[lightmodel], GL_COMPILE); f[3] = 1.0; if( mask & LMF_AMBIENT) { f[0] = lgt->ambient.r; f[1] = lgt->ambient.g; f[2] = lgt->ambient.b; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, f); } if( mask & LMF_LOCALVIEWER) { glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); } #ifndef TRUE_EMISSION /* This causes trouble if the vertex order makes GL consider * our polygon to be backfacing -- then GL_LIGHT_MODEL_TWO_SIDE causes it * to be mis-shaded from both sides.. */ if((astk->mat.valid & MTF_EMISSION) ) { glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); } #endif glEndList(); return lightmodel; } #if defined(sgi) || defined(GL_EXT_texture_object) /* Might our -lGL know about EXT_texture_object? */ /* Since the SGI compiler/linkers seem to know about #pragma weak, but * others might not, compile in EXT_texture_object support if: * - we're on an SGI; even if compiled under Irix 5 (no EXT_texture_object), * we might be run under a later version that does support it, and * the "#pragma weak" lets us test at run time whether the library * supports it; * - or, if we're on a system that claims to support it at compile time, * we'll just hope that that system also supports it at run time. */ # pragma weak glBindTextureEXT # pragma weak glDeleteTexturesEXT # ifndef GL_EXT_texture_object /* If doesn't know about glBindTextureEXT etc., declare here. */ extern void glBindTextureEXT (GLenum target, GLuint texture); extern void glDeleteTexturesEXT (GLsizei n, GLuint *textures); # endif /* If the library knows about it, does the X display also support the * texture extension? */ static int has_texture_object(void) { static int has = -1; if(has < 0) has = (&glBindTextureEXT != NULL && &glDeleteTexturesEXT != NULL && NULL != strstr((char *)glGetString(GL_EXTENSIONS), "EXT_texture_object")); return has; } #else /* Stub for non-existent glBindTextureEXT() etc. functions. */ static int has_texture_object(void) { return 0; } static void glBindTextureEXT(GLenum target, GLuint id) { } static void glDeleteTexturesEXT(GLsizei n, GLuint *textures) { } #endif static void tex_predef(GLuint id) { if(has_texture_object()) { glBindTextureEXT(GL_TEXTURE_2D, id); } else { if (_mgopenglc->n_texture_lists <= id) { _mgopenglc->texture_lists = mgopengl_realloc_lists(_mgopenglc->texture_lists, &_mgopenglc->n_texture_lists); } glNewList(_mgopenglc->texture_lists[id], GL_COMPILE_AND_EXECUTE); } } static void tex_postdef(void) { if(has_texture_object()) { /* Nothing -- leave things as they are */ } else { glEndList(); } } static void tex_bind(GLuint id) { if(has_texture_object()) { glBindTextureEXT(GL_TEXTURE_2D, id); } else { glCallList(_mgopenglc->texture_lists[id]); } } static void tex_delete(GLuint id) { if(has_texture_object()) { glDeleteTexturesEXT(1, &id); } else { glDeleteLists(_mgopenglc->texture_lists[id], 1); } } /* Is this texture loaded adequately for the given texture-quality setting? */ static bool tex_adequate(int apflags, TxUser *tu) { struct mgopengl_tudata *tudata = tu->data; return (apflags & (APF_TXMIPMAP|APF_TXMIPINTERP|APF_TXLINEAR)) == tudata->qualflags; } /* * Function: mgopengl_notexture * Description: Disable texture mapping */ void mgopengl_notexture() { glDisable(GL_TEXTURE_2D); _mgopenglc->tevbound = 0; glAlphaFunc(GL_ALWAYS, 0); glDisable(GL_ALPHA_TEST); } /* * Function: mgopengl_txpurge * Description: Forget everything Open GL ever knew about this texture. * Author: slevy * Date: Thu May 30 12:03:26 CDT 1996 * Notes: The mg/common/mgtexture.c code decides when the time is ripe. * We assume that textures (well, display-lists) are shared * across all OpenGL windows, and take care to purge references * to the no-longer-loaded texture in all mgopengl context. */ void mgopengl_txpurge(TxUser *tu) { mgcontext *ctx, *oldctx = _mgc; struct mgopengl_tudata *tudata; for(ctx = _mgclist; ctx != NULL; ctx = ctx->next) { if(ctx->devno == MGD_OPENGL) { #define mgoglc ((mgopenglcontext *)ctx) if(mgoglc->curtex == tu) { if(mgoglc->tevbound) { /* Probably won't happen */ mgctxselect(ctx); mgopengl_notexture(); } mgoglc->curtex = NULL; } #if 0 if(mgoglc->bgimage == tu) { mgoglc->bgimage = NULL; } #endif #undef mgoglc } } if(tu->id > 0) { tex_delete(tu->id + ID_OFFSET); } if ((tudata = tu->data)) { if (tudata->data != tu->tx->image->data) { OOGLFree(tudata->data); } OOGLFree(tudata); tu->data = NULL; } /* Could also purge the current 2D texture, but maybe it's not worth it. */ if (_mgc != oldctx) { mgctxselect(oldctx); } } /*----------------------------------------------------------------------- * Function: mgopengl_needtexture * Description: Ask for a texture -- we need the texture currently in astk->ap.t ex * Author: slevy * Date: Mon Jan 29 21:16:13 CST 1996 * Notes: We only do this when a gprim asks for it, not as soon as * we start the appearance in which the texture is installed, * for efficiency's sake. Textures are bulky and rendering with * them can be slow. Thus relevant gprim's test: * if(_mgc->astk->flag&APF_TEXTURE && * _mgc->astk->ap.tex != NULL && * _mgglc->tevbound == 0) * mgopengl_needtexture(); */ void mgopengl_needtexture(void) { Texture *wanttx = _mgc->astk->ap.tex; int apflag = _mgc->astk->ap.flag; TxUser *tu; struct mgopengl_tudata *tudata; Image *image; int id, mustload = 0; static GLint formats[] = { 0, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA }; static GLfloat minfilts[] = { GL_NEAREST, GL_LINEAR, GL_NEAREST, GL_LINEAR, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR }; if(wanttx == NULL || wanttx->image == NULL) { #if 1 mgopengl_notexture(); #else /* Remove any texture */ glDisable(GL_TEXTURE_2D); _mgopenglc->tevbound = 0; #endif /* Let's leave the texture bound, in case we need it again soon. */ return; } image = wanttx->image; if ((tu = _mgopenglc->curtex) && mg_same_texture(tu->tx, wanttx, true) && tex_adequate(apflag, tu)) { if (_mgopenglc->tevbound != tu->id) { /* We just need to bind the texture environment */ _mgopenglc->tevbound = tu->id; tex_bind(tu->id + ID_OFFSET); if (image->channels % 2 == 0) { glAlphaFunc(GL_NOTEQUAL, 0); glEnable(GL_ALPHA_TEST); } } /* Load the texture tfm, even if stuff is otherwise identical. */ glMatrixMode(GL_TEXTURE); glLoadMatrixf((GLfloat *)_mgc->txstk->T); glMultMatrixf((GLfloat *)wanttx->tfm); glMatrixMode(GL_MODELVIEW); glEnable(GL_TEXTURE_2D); return; } /* Is our texture in the cache? */ tu = mg_find_shared_texture(wanttx, MGD_OPENGL); if (tu == NULL || !tex_adequate(apflag, tu)) { /* Find a free texture id. */ id = mg_find_free_shared_texture_id(MGD_OPENGL); tu = TxAddUser(wanttx, id, NULL, mgopengl_txpurge); tu->ctx = _mgc; tudata = OOGLNewE(struct mgopengl_tudata, "OpengGL TxUser Data"); tudata->data = image->data; tudata->xsize = image->width; tudata->ysize = image->height; tudata->channels = image->channels; tu->data = tudata; mustload = 1; } else { tudata = tu->data; if (!mg_same_texture(tu->tx, wanttx, true)) { /* force the texture parameters to be reprogrammed */ _mgopenglc->tevbound = 0; } } /* Configure texturing as described in wanttx, except for the data. */ if (_mgopenglc->tevbound != tu->id || mustload) { switch (wanttx->apply) { case TXF_BLEND: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); break; case TXF_DECAL: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); break; case TXF_REPLACE: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); break; default: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); break; } glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (GLfloat *)&wanttx->background); _mgopenglc->tevbound = tu->id; if (image->channels == 2 || image->channels == 4) { glAlphaFunc(GL_NOTEQUAL, 0); glEnable(GL_ALPHA_TEST); } glMatrixMode(GL_TEXTURE); glLoadMatrixf( (GLfloat *) wanttx->tfm); glMatrixMode(GL_MODELVIEW); } if (mustload) { /* Stuff texture data into GL */ GLint format = formats[image->channels]; tex_predef(tu->id + ID_OFFSET); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (wanttx->flags & TXF_SCLAMP) ? GL_CLAMP : GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (wanttx->flags & TXF_TCLAMP) ? GL_CLAMP : GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minfilts[((apflag & APF_TXMIPMAP) ? 4 : 0) | ((apflag & APF_TXMIPINTERP) ? 2 : 0) | ((apflag & APF_TXLINEAR) ? 1 : 0)]); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (apflag & APF_TXLINEAR) ? GL_LINEAR : GL_NEAREST); if(apflag & APF_TXMIPMAP) { gluBuild2DMipmaps(GL_TEXTURE_2D, tudata->channels, tudata->xsize, tudata->ysize, format, GL_UNSIGNED_BYTE, tudata->data); } else { if (tudata->data == image->data && ((image->width & (image->width - 1)) != 0 || (image->height & (image->height - 1)) != 0)) { GLint newx = 4, newy = 4; /* Approximate round-to-nearest */ while (newx*3 < tudata->xsize*2) newx *= 2; while (newy*3 < tudata->ysize*2) newy *= 2; tudata->data = (char *)malloc(newx * newy * tudata->channels); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); gluScaleImage(format, tudata->xsize, tudata->ysize, GL_UNSIGNED_BYTE, image->data, newx, newy, GL_UNSIGNED_BYTE, tudata->data); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); /* default */ tudata->xsize = newx; tudata->ysize = newy; } glTexImage2D(GL_TEXTURE_2D, 0, tudata->channels, tudata->xsize, tudata->ysize, 0, format, GL_UNSIGNED_BYTE, tudata->data); } tex_postdef(); /* Remember the conditions under which we loaded this texture. */ tudata->qualflags = apflag & (APF_TXMIPMAP|APF_TXMIPINTERP|APF_TXLINEAR); _mgopenglc->curtex = tu; } if (_mgopenglc->curtex != tu) { /* Now bind the texture and select display mode. */ tex_bind(tu->id + ID_OFFSET); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minfilts[((apflag & APF_TXMIPMAP) ? 4 : 0) | ((apflag & APF_TXMIPINTERP) ? 2 : 0) | ((apflag & APF_TXLINEAR) ? 1 : 0)]); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (apflag & APF_TXLINEAR) ? GL_LINEAR : GL_NEAREST); _mgopenglc->curtex = tu; } glEnable(GL_TEXTURE_2D); } /*----------------------------------------------------------------------- * Function: mgopengl_d4f * Description: wrapper for c4f * Args: c: * Returns: * Author: munzner * Date: Wed Sep 18 21:48:08 1991 * Notes: We must multiply by kd (diffuse coefficient of the material) * since we called glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);glEnable(GL_COLOR_MATERIAL) earlier in mgopengl_material * so we're overwriting the diffuse material with every * c4f call. */ #if 0 void mgopengl_d4f(float c[4]) { float d[4]; d[0] = c[0] * kd; d[1] = c[1] * kd; d[2] = c[2] * kd; d[3] = c[3]; /* Let appearance alpha override object's alpha */ if (_mgc->astk->mat.valid & MTF_ALPHA && _mgc->astk->mat.override & MTF_ALPHA) d[3] = _mgc->astk->mat.diffuse.a; glColor4fv(d); } #else /* cH: even for constant shading we want to have the possibility that * the material alpha overrides the alpha value of the color. Also, * the decision about that can be done in mgopengl_appearance(). We * just define a 4 functions: shaded w/o alpha override and constant * w/o alpha override. */ /* shaded, but without alpha override */ void mgopengl_d4f_shaded(float c[4]) { float d[4]; d[0] = c[0] * kd; d[1] = c[1] * kd; d[2] = c[2] * kd; d[3] = c[3]; glColor4fv(d); } /* shaded, with alpha override */ void mgopengl_d4f_shaded_alpha(float c[4]) { float d[4]; d[0] = c[0] * kd; d[1] = c[1] * kd; d[2] = c[2] * kd; d[3] = _mgc->astk->mat.diffuse.a; glColor4fv(d); } /* constant, without alpha override: this is just glColor4fv */ /* constant, with alpha override */ void mgopengl_d4f_constant_alpha(float c[4]) { float orig_a = c[3]; c[3] = _mgc->astk->mat.diffuse.a; /* what if c is not writable? */ glColor4fv(c); c[3] = orig_a; } #endif void mgopengl_n3fevert(Point3 *n, HPoint3 *p) { Point3 tn, diff; HPoint3 *cp; if (!(_mgc->has & HAS_CPOS)) { mg_findcam(); } cp = &_mgc->cpos; /* we must not assume that p is normalized here. Why should this be * the case? cp is a Point3, but p is a fully qualified HPoint3 * here. */ HPt3SubPt3(p, cp, &diff); if ((cp->w != 0 ? cp->w : 1.0) * Pt3Dot(&diff, n) > 0) { tn.x = -n->x; tn.y = -n->y; tn.z = -n->z; glNormal3fv((float *)&tn); } else { glNormal3fv((float *)n); } } void mgopengl_v4fcloser(HPoint3 *p) { HPoint3 tp; HPoint3 *cp = &_mgc->cpos; HPt3Coord wn = _mgc->zfnudge * p->w; if(!(_mgc->has & HAS_CPOS)) { mg_findcam(); } if (cp->w != 0.0) { wn /= cp->w; } tp.x = p->x + wn * cp->x; tp.y = p->y + wn * cp->y; tp.z = p->z + wn * cp->z; tp.w = p->w + wn; glVertex4fv((float *)&tp); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mg/opengl/mgopenglshade.h0000644000175000001440000000265310455701005016501 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ extern void mgopengl_material(struct mgastk *, int mask ); extern void mgopengl_lighting( struct mgastk *, int mask ); extern void mgopengl_lights( LmLighting *, struct mgastk * ); extern int mgopengl_materialdef( int matno, Material *mat, int mask ); extern int mgopengl_lightdef( int lightno, LtLight *light, LmLighting *lgt, int mask); extern int mgopengl_lightmodeldef(int lightmodel, LmLighting *lgt, int mask, struct mgastk *); extern void mgopengl_d4f( float *c ); geomview-1.9.4/src/lib/mg/opengl/Headers0000644000175000001440000000004707730240054015010 00000000000000mgopengl.h mgopenglP.h mgopenglshade.h geomview-1.9.4/src/lib/mib/0000777000175000001440000000000010665240677012471 500000000000000geomview-1.9.4/src/lib/mib/mibDrawArea.c0000644000175000001440000000714310455701006014715 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for DrawingArea */ /*****************************************************************************/ mib_Widget *mib_create_DrawingArea(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_DrawingArea *myres; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_DrawingArea *)malloc(sizeof(mib_DrawingArea)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(12); sprintf(temp->mib_class,"DrawingArea"); temp->mib_class_num = MIB_DRAWINGAREA; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; myres->nothing = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNbackground, WhitePixel(dpy, DefaultScreen(dpy))); n++; XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; temp->me = XtCreateManagedWidget(name, xmDrawingAreaWidgetClass, temp->parent->me, args, n); if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_DrawingArea(mib_Widget *this) { mib_DrawingArea *temp = (mib_DrawingArea *)this->myres; free(temp); } void mib_save_DrawingArea(mib_Widget *this, FILE *fout) { } int mib_load_DrawingArea(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.4/src/lib/mib/mibScrollBar.c0000644000175000001440000001065210455701006015111 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for ScrollBars */ /*****************************************************************************/ mib_Widget *mib_create_ScrollBar(mib_Widget *parent, char *name, char *orient, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_ScrollBar *myres; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_ScrollBar *)malloc(sizeof(mib_ScrollBar)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(10); sprintf(temp->mib_class,"ScrollBar"); temp->mib_class_num = MIB_SCROLLBAR; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; myres->orientation = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; if ((mib_fill == WDEFAULT)) { if (!strcmp("VertScrollBar",orient)) { XtSetArg (args[n], XmNorientation, XmVERTICAL); n++; } else { if (!strcmp("HorzScrollBar",orient)) { XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++; myres->orientation = 1; } } } temp->me = XtCreateManagedWidget(name, xmScrollBarWidgetClass, temp->parent->me, args, n); if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_ScrollBar(mib_Widget *this) { mib_ScrollBar *temp = (mib_ScrollBar *)this->myres; free(temp); } void mib_save_ScrollBar(mib_Widget *this, FILE *fout) { mib_ScrollBar *temp = (mib_ScrollBar *)this->myres; fprintf(fout,"orientation: %d\\n\\\n", temp->orientation); } int mib_load_ScrollBar(mib_Widget *this, mib_Buffer *fin) { mib_ScrollBar *myres; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; Arg args[5]; int n; myres = (mib_ScrollBar *)this->myres; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res,"orientation")) { sscanf(val,"%d",&(myres->orientation)); n = 0; switch (myres->orientation) { case 0: XtSetArg (args[n], XmNorientation, XmVERTICAL); n++; break; case 1: XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++; break; default: break; } XtSetValues(this->me, args, n); } else return 0; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.4/src/lib/mib/mibwidgets.h0000644000175000001440000001704310455701006014702 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Structure of mib_TextBox */ /*****************************************************************************/ typedef struct _mib_TextBox { char *init_contents; /* initial text contents */ } mib_TextBox; /* mib_TextBox functions */ /*****************************************************************************/ mib_Widget *mib_create_TextBox(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_TextBox(mib_Widget *); void mib_save_TextBox(mib_Widget *, FILE *); int mib_load_TextBox(mib_Widget *, mib_Buffer *); /* Structure of mib_Button */ /*****************************************************************************/ typedef struct _mib_Button { char *label; /* label on button */ } mib_Button; /* mib_Button functions */ /*****************************************************************************/ mib_Widget *mib_create_Button(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_Button(mib_Widget *); void mib_save_Button(mib_Widget *, FILE *); int mib_load_Button(mib_Widget *, mib_Buffer *); /* Structure of mib_Toggle */ /*****************************************************************************/ typedef struct _mib_Toggle { char *label; /* label on toggle */ int isize; } mib_Toggle; /* mib_Toggle functions */ /*****************************************************************************/ mib_Widget *mib_create_Toggle(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_Toggle(mib_Widget *); void mib_save_Toggle(mib_Widget *, FILE *); int mib_load_Toggle(mib_Widget *, mib_Buffer *); /* Structure of mib_RadioBox */ /*****************************************************************************/ typedef struct _mib_RadioBox { char **labels; /* array of labels */ int numlabel; /* number of labels */ Widget *buttons; /* pointers to each button */ } mib_RadioBox; /* mib_RadioBox functions */ /*****************************************************************************/ mib_Widget *mib_create_RadioBox(mib_Widget *, char *, char*, int, int, int, int, int); void mib_delete_RadioBox(mib_Widget *); void mib_save_RadioBox(mib_Widget *, FILE *); int mib_load_RadioBox(mib_Widget *, mib_Buffer *); /* Structure of mib_DrawingArea */ /*****************************************************************************/ typedef struct _mib_DrawingArea { int nothing; /* couldn't think of anything yet */ } mib_DrawingArea; /* mib_DrawingArea functions */ /*****************************************************************************/ mib_Widget *mib_create_DrawingArea(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_DrawingArea(mib_Widget *); void mib_save_DrawingArea(mib_Widget *, FILE *); int mib_load_DrawingArea(mib_Widget *, mib_Buffer *); /* Structure of mib_Label */ /*****************************************************************************/ typedef struct _mib_Label { char *label; /* text in label */ } mib_Label; /* mib_Label functions */ /*****************************************************************************/ mib_Widget *mib_create_Label(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_Label(mib_Widget *); void mib_save_Label(mib_Widget *, FILE *); int mib_load_Label(mib_Widget *, mib_Buffer *); /* Structure of mib_Frame */ /*****************************************************************************/ typedef struct _mib_Frame { int shadowtype; /* 0 = in, 1 = out, 2 = etched_in, 3 = etched_out */ } mib_Frame; /* mib_Frame functions */ /*****************************************************************************/ mib_Widget *mib_create_Frame(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_Frame(mib_Widget *); void mib_save_Frame(mib_Widget *, FILE *); int mib_load_Frame(mib_Widget *, mib_Buffer *); /* Structure of mib_ScrollBar */ /*****************************************************************************/ typedef struct _mib_ScrollBar { int orientation; } mib_ScrollBar; /* mib_ScrollBar functions */ /*****************************************************************************/ mib_Widget *mib_create_ScrollBar(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_ScrollBar(mib_Widget *); void mib_save_ScrollBar(mib_Widget *, FILE *); int mib_load_ScrollBar(mib_Widget *, mib_Buffer *); /* Structure of mib_TextBig */ /*****************************************************************************/ typedef struct _mib_TextBig { int nothing; /* couldn't think of anything yet */ } mib_TextBig; /* mib_TextBig functions */ /*****************************************************************************/ mib_Widget *mib_create_TextBig(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_TextBig(mib_Widget *); void mib_save_TextBig(mib_Widget *, FILE *); int mib_load_TextBig(mib_Widget *, mib_Buffer *); /* Structure of mib_List */ /*****************************************************************************/ typedef struct _mib_List { Widget real_list; } mib_List; /* mib_List functions */ /*****************************************************************************/ mib_Widget *mib_create_List(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_List(mib_Widget *); void mib_save_List(mib_Widget *, FILE *); int mib_load_List(mib_Widget *, mib_Buffer *); /* Structure of mib_Scale */ /*****************************************************************************/ typedef struct _mib_Scale { int orientation; } mib_Scale; /* mib_Scale functions */ /*****************************************************************************/ mib_Widget *mib_create_Scale(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_Scale(mib_Widget *); void mib_save_Scale(mib_Widget *, FILE *); int mib_load_Scale(mib_Widget *, mib_Buffer *); /* Structure of mib_Menu */ /*****************************************************************************/ typedef struct _mib_Menu { int numitems; /* number of items in menu*/ MenuItem *my_menu; /* array of menu items */ Widget *items; /* pointers to each item */ } mib_Menu; /* mib_Menu functions */ /*****************************************************************************/ mib_Widget *mib_create_Menu(mib_Widget *, char *, char *, int, int, int, int, int); void mib_delete_Menu(mib_Widget *); void mib_save_Menu(mib_Widget *, FILE *); int mib_load_Menu(mib_Widget *, mib_Buffer *); /*****************************************************************************/ typedef struct _mib_widget_funcs { char *name; mib_Widget *(*mib_create)(); void (*mib_delete)(); void (*mib_save)(); int (*mib_load)(); } mib_widget_funcs; geomview-1.9.4/src/lib/mib/mibRadioBox.c0000644000175000001440000001310310455701006014727 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for RadioBox */ /*****************************************************************************/ mib_Widget *mib_create_RadioBox(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_RadioBox *myres; Widget wtemp; char label_temp[50]; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_RadioBox *)malloc(sizeof(mib_RadioBox)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(9); sprintf(temp->mib_class,"RadioBox"); temp->mib_class_num = MIB_RADIOBOX; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 0; /* initialize private resources */ temp->myres = (void *)myres; myres->numlabel = 0; if (mib_fill == WDEFAULT) { myres->numlabel = 2; myres->labels = (char **)malloc(10); myres->buttons = (Widget *)malloc(sizeof(Widget) * myres->numlabel); sprintf(label_temp, "Radio 1"); myres->labels[0] = (char *)malloc(strlen(label_temp)+1); strcpy(myres->labels[0],label_temp); sprintf(label_temp, "Radio 2"); myres->labels[1] = (char *)malloc(strlen(label_temp)+1); strcpy(myres->labels[1],label_temp); } /* create Xt widget */ n = 0; XtSetArg (args[n], XmNrubberPositioning, False); n++; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNhighlightThickness, 0); n++; temp->me = XmCreateRadioBox(temp->parent->me, "Radio", args, n); wtemp = temp->me; if (mib_fill == WDEFAULT) { n = 0; XtSetArg (args[n], XmNhighlightThickness, 0); n++; XtCreateManagedWidget("Radio 1", xmToggleButtonGadgetClass, wtemp, args, n); n = 0; XtSetArg (args[n], XmNhighlightThickness, 0); n++; XtCreateManagedWidget("Radio 2", xmToggleButtonGadgetClass, wtemp, args, n); } XtManageChild(wtemp); if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_RadioBox(mib_Widget *this) { mib_RadioBox *temp = (mib_RadioBox *)this->myres; int count; for (count=0; count < temp->numlabel; count++) free(temp->labels[count]); free(temp); } void mib_save_RadioBox(mib_Widget *this, FILE *fout) { mib_RadioBox *temp = (mib_RadioBox *)this->myres; int count; fprintf(fout,"numlabel: %d\\n\\\n", temp->numlabel); for (count=0; count < temp->numlabel; count++) { fprintf(fout,"label: \\\"%s\\\"\\n\\\n", temp->labels[count]); } } int mib_load_RadioBox(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; int count, vallen, n; Arg args[5]; mib_RadioBox *myres; myres = (mib_RadioBox *)this->myres; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res,"numlabel")) { myres->numlabel = 0; sscanf(val,"%d",&(myres->numlabel)); if (!(myres->numlabel)) return 0; myres->labels = (char **)malloc((myres->numlabel+1)*4); myres->buttons = (Widget *)malloc(sizeof(Widget)*(myres->numlabel)); for (count=0; count < myres->numlabel; count++) { if (!mib_read_line(fin, res, val)) return 0; vallen = strlen(val); if (vallen < 2) return 0; val[vallen-1] = '\0'; myres->labels[count] = (char *)malloc(vallen-1); sprintf(myres->labels[count],"%s",&(val[1])); n = 0; XtSetArg (args[n], XmNhighlightThickness, 0); n++; myres->buttons[count] = XtCreateManagedWidget(myres->labels[count], xmToggleButtonGadgetClass, this->me, args, n); } } else return 0; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.4/src/lib/mib/mibList.c0000644000175000001440000001113210455701006014133 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; static Widget real_list; /* Code for Lists */ /*****************************************************************************/ mib_Widget *mib_create_List(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_List *myres; Widget wtemp; /*unsigned char *label_text;*/ XmString label_text; char ttext[30]; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_List *)malloc(sizeof(mib_List)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(5); sprintf(temp->mib_class,"List"); temp->mib_class_num = MIB_LIST; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_IN); n++; temp->me = XtCreateManagedWidget(name, xmFrameWidgetClass, temp->parent->me, args, n); n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNhighlightThickness, 0); n++; XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNorientation, XmVERTICAL); n++; if (mib_fill == WEMPTY) { XtSetArg (args[n], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); n++; } wtemp = XmCreateScrolledList(temp->me, name, args, n); myres->real_list = wtemp; real_list = wtemp; XtManageChild(wtemp); if (mib_fill != WEMPTY) real_list = NULL; if (mib_fill == WEDIT || mib_fill == WDEFAULT) { label_text = XmStringCreateLtoR("Simple", XmSTRING_DEFAULT_CHARSET); XmListAddItem(wtemp, label_text, 0); XmStringFree(label_text); label_text = XmStringCreateLtoR("List", XmSTRING_DEFAULT_CHARSET); XmListAddItem(wtemp, label_text, 0); XmStringFree(label_text); for (n=0;n<200;n++) { sprintf(ttext,"Item %d ",n); label_text = XmStringCreateLtoR(ttext, XmSTRING_DEFAULT_CHARSET); XmListAddItem(wtemp, label_text, 0); XmStringFree(label_text); } mib_apply_eventhandlers(temp->me, temp); mib_apply_eventhandlers(wtemp, temp); } return temp; } void mib_delete_List(mib_Widget *this) { mib_List *temp = (mib_List *)this->myres; free(temp); } void mib_save_List(mib_Widget *this, FILE *fout) { } int mib_load_List(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; if (real_list) this->me = real_list; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.4/src/lib/mib/mibMenu.c0000644000175000001440000001664710455701006014144 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; static int delhandler; /* delay adding event handler until menu is actually created */ /* Code for Menu */ /*****************************************************************************/ mib_Widget *mib_create_Menu(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Menu *myres; Widget wtemp; char label_temp[50]; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Menu *)malloc(sizeof(mib_Menu)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(8); sprintf(temp->mib_class,"Menu"); temp->mib_class_num = MIB_MENU; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 0; /* initialize private resources */ temp->myres = (void *)myres; myres->numitems = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; temp->me = XtCreateManagedWidget(name, xmRowColumnWidgetClass, temp->parent->me, args, n); n = 0; delhandler = 1; if (mib_fill == WDEFAULT) { delhandler = 0; myres->numitems = 3; myres->my_menu = (MenuItem *)malloc(sizeof(MenuItem) * (myres->numitems+1)); myres->items = (Widget *)malloc(sizeof(Widget) * myres->numitems); sprintf(label_temp, "Item 1"); myres->my_menu[0].label = (char *)malloc(strlen(label_temp)+1); strcpy(myres->my_menu[0].label,label_temp); myres->my_menu[0].class = &xmPushButtonGadgetClass; myres->my_menu[0].mnemonic = '1'; myres->my_menu[0].accelerator = NULL; myres->my_menu[0].accel_text = NULL; myres->my_menu[0].accel_text = NULL; myres->my_menu[0].callback = NULL; myres->my_menu[0].callback_data = NULL; myres->my_menu[0].subitems = (struct _menu_item *)1; sprintf(label_temp, "Item 2"); myres->my_menu[1].label = (char *)malloc(strlen(label_temp)+1); strcpy(myres->my_menu[1].label,label_temp); myres->my_menu[1].class = &xmPushButtonGadgetClass; myres->my_menu[1].mnemonic = '2'; myres->my_menu[1].accelerator = NULL; myres->my_menu[1].accel_text = NULL; myres->my_menu[1].accel_text = NULL; myres->my_menu[1].callback = NULL; myres->my_menu[1].callback_data = NULL; myres->my_menu[1].subitems = (struct _menu_item *)1; sprintf(label_temp, "Item 3"); myres->my_menu[2].label = (char *)malloc(strlen(label_temp)+1); strcpy(myres->my_menu[2].label,label_temp); myres->my_menu[2].class = &xmPushButtonGadgetClass; myres->my_menu[2].mnemonic = '2'; myres->my_menu[2].accelerator = NULL; myres->my_menu[2].accel_text = NULL; myres->my_menu[2].accel_text = NULL; myres->my_menu[2].callback = NULL; myres->my_menu[2].callback_data = NULL; myres->my_menu[2].subitems = (struct _menu_item *)1; myres->my_menu[3].label = NULL; wtemp = BuildMenu(temp->me, XmMENU_OPTION, "", 'M', myres->my_menu); XtManageChild(wtemp); } if (mib_fill == WEDIT || mib_fill == WDEFAULT) { /* default menu */ if (!delhandler) { mib_apply_eventhandlers(wtemp, temp); mib_apply_eventhandlers(temp->me, temp); } } if (mib_fill == WEMPTY) delhandler = 0; return temp; } void mib_delete_Menu(mib_Widget *this) { mib_Menu *temp = (mib_Menu *)this->myres; free(temp); } void mib_save_Menu(mib_Widget *this, FILE *fout) { mib_Menu *temp = (mib_Menu *)this->myres; int count; fprintf(fout, "numitems: %d\\n\\\n", temp->numitems); for (count=0; count < temp->numitems; count++) { fprintf(fout, "item: \\\"%s\\\"\\n\\\n", temp->my_menu[count].label); } } int mib_load_Menu(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; int count, vallen; Widget wtemp; mib_Menu *myres = (mib_Menu *)this->myres; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res, "numitems")) { myres->numitems = 0; sscanf(val, "%d", &(myres->numitems)); if (!(myres->numitems)) return 0; myres->my_menu = (MenuItem *)malloc(sizeof(MenuItem) * (myres->numitems+1)); myres->items = (Widget *)malloc(sizeof(Widget) * myres->numitems); for (count = 0; count < myres->numitems; count++) { if (!mib_read_line(fin, res, val)) return 0; vallen = strlen(val); if (vallen < 2) return 0; val[vallen-1] = '\0'; myres->my_menu[count].label = (char *)malloc(vallen-1); sprintf(myres->my_menu[count].label, "%s", &(val[1])); myres->my_menu[count].class = &xmPushButtonGadgetClass; myres->my_menu[count].mnemonic = '\0'; myres->my_menu[count].accelerator = NULL; myres->my_menu[count].accel_text = NULL; myres->my_menu[count].accel_text = NULL; myres->my_menu[count].callback = NULL; myres->my_menu[count].callback_data = NULL; myres->my_menu[count].subitems = (struct _menu_item *)1; } myres->my_menu[myres->numitems].label = NULL; wtemp = BuildMenu(this->me, XmMENU_OPTION, "", '\0', myres->my_menu); XtManageChild(wtemp); if (delhandler) { mib_apply_eventhandlers(wtemp, this); mib_apply_eventhandlers(this->me, this); } else this->me = wtemp; for (count = 0; count < myres->numitems; count++) { /* this hack extracts the widget for each item in the menu for possible use by the programmer */ myres->items[count] = (Widget)(myres->my_menu[count].subitems); } } else return 0; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.4/src/lib/mib/mibLabel.c0000644000175000001440000001116210455701006014242 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for Label */ /*****************************************************************************/ mib_Widget *mib_create_Label(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Label *myres; /* unsigned char *label_text; */ XmString label_text; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Label *)malloc(sizeof(mib_Label)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(6); sprintf(temp->mib_class,"Label"); temp->mib_class_num = MIB_LABEL; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; if (mib_fill == WDEFAULT) { myres->label = (char *)malloc(strlen(label)+1); strcpy(myres->label,label); } /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { label_text = XmStringCreateLtoR(label, XmSTRING_DEFAULT_CHARSET); XtSetArg (args[n], XmNlabelString, label_text); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; temp->me = XtCreateManagedWidget(name, xmLabelWidgetClass, temp->parent->me, args, n); if (mib_fill == WDEFAULT) XmStringFree(label_text); if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_Label(mib_Widget *this) { mib_Label *temp = (mib_Label *)this->myres; free(temp->label); free(temp); } void mib_save_Label(mib_Widget *this, FILE *fout) { mib_Label *temp = (mib_Label *)this->myres; fprintf(fout,"label: \\\"%s\\\"\\n\\\n", temp->label); } int mib_load_Label(mib_Widget *this, mib_Buffer *fin) { mib_Label *myres; /*unsigned char *label_text;*/ XmString label_text; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; Arg args[5]; int n, vallen; myres = (mib_Label *)this->myres; while (mib_read_line(fin, res, val)) { if (!strcmp(res,"label")) { vallen = strlen(val); if (vallen < 2) return 0; val[vallen-1] = '\0'; myres->label = (char *)malloc(vallen-1); sprintf(myres->label,"%s",&(val[1])); label_text = XmStringCreateLtoR(myres->label, XmSTRING_DEFAULT_CHARSET); n = 0; XtSetArg (args[n], XmNlabelString, label_text); n++; XtSetValues(this->me, args, n); XmStringFree(label_text); } else if (!strcmp(res, "alignment")) { int align = atoi(val); XtVaSetValues(this->me, XmNalignment, align, NULL); } else if (!strcmp(res, "EndWidget")) { return 1; } else { return 0; } } return 0; } geomview-1.9.4/src/lib/mib/mibScale.c0000644000175000001440000001311110622716757014265 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; #ifdef notdef static int scaleflag; #endif /* Code for Scale */ /*****************************************************************************/ mib_Widget *mib_create_Scale(mib_Widget *parent, char *name, char *orient, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Scale *myres; Arg args[20]; int n; #ifdef notdef scaleflag = 0; #endif /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Scale *)malloc(sizeof(mib_Scale)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(10); sprintf(temp->mib_class,"Scale"); temp->mib_class_num = MIB_SCALE; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; myres->orientation = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; if (mib_fill == WDEFAULT) { if (!strcmp("VertScale",orient)) { XtSetArg (args[n], XmNorientation, XmVERTICAL); n++; XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_TOP); n++; } else if (!strcmp("HorzScale",orient)) { XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++; XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_RIGHT); n++; myres->orientation = 1; } } if (mib_fill == WEDIT || mib_fill == WDEFAULT) { XtSetArg (args[n], XmNshowArrows, False); n++; XtSetArg (args[n], XmNsliderSize, 30); n++; } if (mib_fill == WEDIT || mib_fill == WDEFAULT) temp->me = XtCreateManagedWidget(name, xmScrollBarWidgetClass, temp->parent->me, args, n); else temp->me = XtCreateManagedWidget(name, xmScaleWidgetClass, temp->parent->me, args, n); #ifdef notdef if (mib_fill == WEMPTY) scaleflag = 1; #endif if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_Scale(mib_Widget *this) { mib_Scale *temp = (mib_Scale *)this->myres; free(temp); } void mib_save_Scale(mib_Widget *this, FILE *fout) { mib_Scale *temp = (mib_Scale *)this->myres; fprintf(fout,"orientation: %d\\n\\\n", temp->orientation); } int mib_load_Scale(mib_Widget *this, mib_Buffer *fin) { mib_Scale *myres; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; Arg args[5]; int n; myres = (mib_Scale *)this->myres; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res,"orientation")) { sscanf(val,"%d",&(myres->orientation)); #ifdef notdef /* What's this doing here? Setting XmNscaleWidth/XmNscaleHeight * seems to break lesstif's sizing of the widget. -slevy 97.07.31 */ n = 0; if (scaleflag) { if (!myres->orientation) { XtSetArg (args[n], XmNscaleWidth, this->width); n++; } else { XtSetArg (args[n], XmNscaleWidth, this->height); n++; } XtSetValues(this->me, args, n); } #endif /* end what's this */ n = 0; switch (myres->orientation) { case 0: XtSetArg (args[n], XmNorientation, XmVERTICAL); n++; XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_TOP); n++; break; case 1: XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++; XtSetArg (args[n], XmNprocessingDirection, XmMAX_ON_RIGHT); n++; break; default: break; } XtSetValues(this->me, args, n); } else return 0; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.4/src/lib/mib/Makefile.am0000644000175000001440000000050010604514344014420 00000000000000INCLUDES = $(default_includes) $(MOTIFINCLUDE) $(X_CFLAGS) EXTRA_DIST = Headers noinst_LIBRARIES = libmib.a libmib_a_SOURCES = \ mibButton.c mibDrawArea.c mibFrame.c mibLabel.c mibList.c mibload.c mibMenu.c mibRadioBox.c mibScale.c mibScrollBar.c mibTextBig.c mibTextBox.c mibToggle.c \ mibload.h mibwidgets.h geomview-1.9.4/src/lib/mib/Makefile.in0000644000175000001440000003742510665240506014454 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/mib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru libmib_a_AR = $(AR) $(ARFLAGS) libmib_a_LIBADD = am_libmib_a_OBJECTS = mibButton.$(OBJEXT) mibDrawArea.$(OBJEXT) \ mibFrame.$(OBJEXT) mibLabel.$(OBJEXT) mibList.$(OBJEXT) \ mibload.$(OBJEXT) mibMenu.$(OBJEXT) mibRadioBox.$(OBJEXT) \ mibScale.$(OBJEXT) mibScrollBar.$(OBJEXT) mibTextBig.$(OBJEXT) \ mibTextBox.$(OBJEXT) mibToggle.$(OBJEXT) libmib_a_OBJECTS = $(am_libmib_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libmib_a_SOURCES) DIST_SOURCES = $(libmib_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) $(MOTIFINCLUDE) $(X_CFLAGS) EXTRA_DIST = Headers noinst_LIBRARIES = libmib.a libmib_a_SOURCES = \ mibButton.c mibDrawArea.c mibFrame.c mibLabel.c mibList.c mibload.c mibMenu.c mibRadioBox.c mibScale.c mibScrollBar.c mibTextBig.c mibTextBox.c mibToggle.c \ mibload.h mibwidgets.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/mib/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/mib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmib.a: $(libmib_a_OBJECTS) $(libmib_a_DEPENDENCIES) -rm -f libmib.a $(libmib_a_AR) libmib.a $(libmib_a_OBJECTS) $(libmib_a_LIBADD) $(RANLIB) libmib.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibButton.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibDrawArea.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibFrame.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibLabel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibRadioBox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibScale.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibScrollBar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibTextBig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibTextBox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibToggle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mibload.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/mib/mibload.c0000644000175000001440000005257610622716757014177 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" mib_Widget *mib_root_Widget; Display *dpy; GC mib_gc; static struct _mib_event_handle_funcs { void (*mib_pick_mib_Widget)(/* Widget, XtPointer, XButtonPressedEvent *, Boolean * */); void (*mib_move_mib_Widget)(/* Widget, XtPointer, XPointerMovedEvent *, Boolean * */); void (*mib_unpick_mib_Widget)(/* Widget, XtPointer, XButtonReleasedEvent *, Boolean * */); } mib_events; mib_widget_funcs mwfuncs[] = { { NULL, NULL, NULL, NULL, NULL }, { "TextBox", mib_create_TextBox, mib_delete_TextBox, mib_save_TextBox, mib_load_TextBox}, { "Button", mib_create_Button, mib_delete_Button, mib_save_Button, mib_load_Button}, { "Toggle", mib_create_Toggle, mib_delete_Toggle, mib_save_Toggle, mib_load_Toggle}, { "RadioBox", mib_create_RadioBox, mib_delete_RadioBox, mib_save_RadioBox, mib_load_RadioBox}, { "DrawingArea", mib_create_DrawingArea, mib_delete_DrawingArea, mib_save_DrawingArea, mib_load_DrawingArea}, { "Label", mib_create_Label, mib_delete_Label, mib_save_Label, mib_load_Label}, { "Frame", mib_create_Frame, mib_delete_Frame, mib_save_Frame, mib_load_Frame}, { "ScrollBar", mib_create_ScrollBar, mib_delete_ScrollBar, mib_save_ScrollBar, mib_load_ScrollBar}, { "TextBig", mib_create_TextBig, mib_delete_TextBig, mib_save_TextBig, mib_load_TextBig}, { "List", mib_create_List, mib_delete_List, mib_save_List, mib_load_List}, { "Scale", mib_create_Scale, mib_delete_Scale, mib_save_Scale, mib_load_Scale}, { "Menu", mib_create_Menu, mib_delete_Menu, mib_save_Menu, mib_load_Menu}, { NULL, NULL, NULL, NULL, NULL }, }; /*****************************************************************************/ void mib_add_mib_Widget(mib_Widget *this, mib_Widget *parent) { mib_Widget *tmp; if (parent->child == NULL) { parent->child = this; this->prev = parent; this->parent = parent; this->sibling = NULL; this->child = NULL; } else { tmp = parent->child; while (tmp->sibling != NULL) tmp = tmp->sibling; tmp->sibling = this; this->prev = tmp; this->parent = parent; this->sibling = NULL; this->child = NULL; } } /*****************************************************************************/ void mib_add_backward(mib_Widget *this, mib_Widget *parent) { mib_Widget *tmp; if (parent->child == NULL) { parent->child = this; this->prev = parent; this->parent = parent; this->sibling = NULL; this->child = NULL; } else { tmp = parent->child; parent->child = this; this->prev = parent; this->parent = parent; this->sibling = tmp; this->child = NULL; tmp->prev = this; } } /*****************************************************************************/ void mib_remove_mib_Widget(mib_Widget *this) { XtVaSetValues(mib_root_Widget->me, XmNresizePolicy, XmRESIZE_NONE, NULL); XtDestroyWidget(this->me); while (this->child != NULL) mib_remove_mib_Widget(this->child); if (this->parent == this) { mib_clear_myres(this); return; } if (this->prev == this->parent) { this->parent->child = this->sibling; if (this->sibling != NULL) this->sibling->prev = this->parent; } else { this->prev->sibling = this->sibling; if (this->sibling != NULL) this->sibling->prev = this->prev; } mib_clear_myres(this); } /*****************************************************************************/ void mib_clear_myres(mib_Widget *this) { free(this->mib_class); free(this->name); if ((this->mib_class_num < 1) || (this->mib_class_num > MI_NUMCLASSES)) return; mwfuncs[this->mib_class_num].mib_delete(this); free(this); } /*****************************************************************************/ mib_Widget *mib_new_mib_Widget() { mib_Widget *this; this = (mib_Widget *)malloc(sizeof(mib_Widget)); this->me = NULL; this->mib_class_num = MIB_NULL; this->mib_selected = 0; this->mib_resizing = 0; this->myres = NULL; this->parent = NULL; this->sibling = NULL; this->prev = NULL; this->child = NULL; this->width = 0; this->height = 0; this->topAttachment = 0; this->bottomAttachment = 0; this->leftAttachment = 0; this->rightAttachment = 0; this->topOffset = 0; this->bottomOffset = 0; this->leftOffset = 0; this->rightOffset = 0; return this; } /*****************************************************************************/ mib_Widget *mib_find_name(mib_Widget *temp, char *name) { mib_Widget *child = temp->child; mib_Widget *ret = NULL; if (!strcmp(temp->name, name)) return temp; if (child != NULL) if ((ret = mib_find_name(child, name))) return ret; child = temp->sibling; if (child != NULL) if ((ret = mib_find_name(child, name))) return ret; return NULL; } /*****************************************************************************/ Widget BuildMenu(Widget parent, int menu_type, char *menu_title, char menu_mnemonic, MenuItem *items) { Widget menu, cascade = NULL, widget; int i; XmString str; if (menu_type == XmMENU_PULLDOWN || menu_type == XmMENU_OPTION) menu = XmCreatePulldownMenu(parent, "_pulldown", NULL, 0); else if (menu_type == XmMENU_POPUP) menu = XmCreatePopupMenu(parent, "_popup", NULL, 0); else { XtWarning("Invalid menu type passed to BuildMenu()"); return NULL; } /* Pulldown menus require a cascade button to be made */ if (menu_type == XmMENU_PULLDOWN) { int i; char bname[24]; XtVaGetValues(parent, XmNnumChildren, &i, NULL); sprintf(bname, "button_%d", i); str = XmStringCreateSimple(menu_title); cascade = XtVaCreateManagedWidget(bname, xmCascadeButtonGadgetClass, parent, XmNsubMenuId, menu, XmNlabelString, str, XmNmnemonic, (XID)menu_mnemonic, NULL); XmStringFree(str); } else if (menu_type == XmMENU_OPTION) { /* Option menus are a special case, but not hard to handle */ Arg args[2]; str = XmStringCreateSimple(menu_title); XtSetArg(args[0], XmNsubMenuId, menu); XtSetArg(args[1], XmNlabelString, str); /* This really isn't a cascade, but this is the widget handle * we're going to return at the end of the function. */ cascade = XmCreateOptionMenu(parent, menu_title, args, 2); XmStringFree(str); } /* Now add the menu items */ for (i = 0; items[i].label != NULL; i++) { /* If subitems exist, create the pull-right menu by calling this * function recursively. Since the function returns a cascade * button, the widget returned is used.. */ if (items[i].subitems) if (menu_type == XmMENU_OPTION) { widget = XtVaCreateManagedWidget(items[i].label, *items[i].class, menu, NULL); items[i].subitems = (struct _menu_item *) widget; /* daeron mod (tm) :-) ... we now use this to pass back each widget we create to the mibMenu functions so that it can be stored as part of the mibMenu structure */ /* XtWarning("You can't have submenus from option menu items."); continue;*/ } else widget = BuildMenu(menu, XmMENU_PULLDOWN, items[i].label, items[i].mnemonic, items[i].subitems); else { widget = XtVaCreateManagedWidget(items[i].label, *items[i].class, menu, NULL); /* ditto here from above ... - Daeron mod (tm) */ items[i].subitems = (struct _menu_item *) widget; } /* Whether the item is a real item or a cascade button with a * menu, it can still have a mnemonic. */ if (items[i].mnemonic) XtVaSetValues(widget, XmNmnemonic, (XID)items[i].mnemonic, NULL); /* any item can have an accelerator, except cascade menus. But, * we don't worry about that; we know better in our declarations. */ if (items[i].accelerator) { str = XmStringCreateSimple(items[i].accel_text); XtVaSetValues(widget, XmNaccelerator, items[i].accelerator, XmNacceleratorText, str, NULL); XmStringFree(str); } if (items[i].callback) XtAddCallback(widget, (items[i].class == &xmToggleButtonWidgetClass || items[i].class == &xmToggleButtonGadgetClass)? XmNvalueChangedCallback : /* ToggleButton class */ XmNactivateCallback, /* PushButton class */ items[i].callback, items[i].callback_data); } /* for popup menus, just return the menu; pulldown menus, return * the cascade button; option menus, return the thing returned * from XmCreateOptionMenu(). This isn't a menu, or a cascade button! */ return menu_type == XmMENU_POPUP? menu : cascade; } /*****************************************************************************/ mib_Widget *mib_load_interface(Widget parent, char *from, int file_type) { mib_Buffer thisfile; mib_Widget *this; FILE *infile; char *instring; char ch; thisfile.buf_type = file_type; dpy = XtDisplay(parent); if ((file_type == MI_FROMFILE) || (file_type == MI_EDITFROMFILE)) { if (!(infile = fopen(from,"r"))) return NULL; ch = '\0'; while ((ch != '\n')&&(!feof(infile))) /* throw away first line */ ch = (char)fgetc(infile); thisfile.buffer = (void *)infile; thisfile.point = 0; if (!mib_load_Root(parent, &this, &thisfile)) { /* delete this */ return NULL; } else { fclose(infile); return this; } } else if ((file_type == MI_FROMSTRING) || (file_type == MI_EDITFROMSTRING)) { instring = from; if (instring == NULL) return NULL; thisfile.buffer = (void *)instring; thisfile.buflen = strlen(instring); thisfile.point = 0; if (!mib_load_Root(parent, &this, &thisfile)) { /* delete this */ return NULL; } else return this; } else return NULL; } /*****************************************************************************/ int mib_load_mib_class(mib_Widget **this, mib_Widget *parent, char *name, char *iname, mib_Buffer *fin ) { int namelen, editstate, count; if ((fin->buf_type == MI_EDITFROMFILE) || (fin->buf_type == MI_EDITFROMSTRING)) editstate = WEDIT; else editstate = WEMPTY; namelen = strlen(name); if (namelen < 2) return 0; name[namelen-1] = '\0'; name[0] = ' '; count = 1; while (mwfuncs[count].name) { if (!strcmp(&(name[1]), mwfuncs[count].name)) { *this = mwfuncs[count].mib_create(parent, iname, NULL, 0, 0, 0, 0, editstate); return 1; } count++; } (*this)->parent = (*this); return 1; } /*****************************************************************************/ mib_Widget *mib_load_public(mib_Widget *root, mib_Widget *this, mib_Buffer *fin) { int got_line, done; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; char valcp[MI_MAXSTRLEN]; Arg args[20]; int mynum, n; got_line = 1; done = 0; /* this loop reads basic info about Widget */ while (got_line && (!done)) { got_line = mib_read_line(fin, res, val); if (!strcmp(res,"Ref")) sscanf(val, "%d", &mynum); else if (!strcmp(res,"Widget")) { strcpy(valcp,val); done = 1; } } done = 0; while (got_line && (!done)) { got_line = mib_read_line(fin, res, val); if (!strcmp(res, "Children")) n = 0; else if (!strcmp(res, "Parent")) /* don't support complete widget tree yet */ n = 0; else if (!strcmp(res,"Public-")) n = 0; else if (!strcmp(res,"Name")) { val[strlen(val)-1] = '\0'; mib_load_mib_class(&this, root, valcp, &(val[1]), fin); this->name = (char *)malloc(strlen(val)); sprintf(this->name,"%s",&(val[1])); this->mib_mynum = mynum; done = 1; } else return 0; } if (!got_line) return NULL; done = 0; /* second loop reads public info */ while (got_line && (!done)) { got_line = mib_read_line(fin, res, val); if (!strcmp(res,"Xmwidth")) sscanf(val,"%d",&(this->width)); else if (!strcmp(res,"Xmheight")) sscanf(val,"%d",&(this->height)); else if (!strcmp(res,"XmtopAttachment")) sscanf(val,"%d",&(this->topAttachment)); else if (!strcmp(res,"XmbottomAttachment")) sscanf(val,"%d",&(this->bottomAttachment)); else if (!strcmp(res,"XmleftAttachment")) sscanf(val,"%d",&(this->leftAttachment)); else if (!strcmp(res,"XmrightAttachment")) sscanf(val,"%d",&(this->rightAttachment)); else if (!strcmp(res,"XmtopOffset")) sscanf(val,"%d",&(this->topOffset)); else if (!strcmp(res,"XmbottomOffset")) sscanf(val,"%d",&(this->bottomOffset)); else if (!strcmp(res,"XmleftOffset")) sscanf(val,"%d",&(this->leftOffset)); else if (!strcmp(res,"XmrightOffset")) sscanf(val,"%d",&(this->rightOffset)); else if (!strcmp(res,"Private-")) done = 1; } n = 0; if ((fin->buf_type == MI_EDITFROMFILE) || (fin->buf_type == MI_EDITFROMSTRING)) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, this->leftOffset); n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, this->topOffset); n++; if (this == root) { XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNrightOffset, this->rightOffset); n++; XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNbottomOffset, this->bottomOffset); n++; } } else { if (this->leftAttachment) { XtSetArg (args[n], XmNleftAttachment, this->leftAttachment); n++; if(this->leftAttachment == XmATTACH_FORM) XtSetArg (args[n], XmNleftOffset, this->leftOffset); else XtSetArg (args[n], XmNleftPosition, this->leftOffset*100/root->width); n++; } if (this->topAttachment) { XtSetArg (args[n], XmNtopAttachment, this->topAttachment); n++; if(this->topAttachment == XmATTACH_FORM) XtSetArg (args[n], XmNtopOffset, this->topOffset); else XtSetArg (args[n], XmNtopPosition, this->topOffset*100/root->height); n++; } if (this->bottomAttachment) { XtSetArg (args[n], XmNbottomAttachment, this->bottomAttachment); n++; if(this->bottomAttachment == XmATTACH_FORM) XtSetArg (args[n], XmNbottomOffset, this->bottomOffset); else XtSetArg (args[n], XmNbottomPosition, 100-this->bottomOffset*100/root->height); n++; } if (this->rightAttachment) { XtSetArg (args[n], XmNrightAttachment, this->rightAttachment); n++; if(this->rightAttachment == XmATTACH_FORM) XtSetArg (args[n], XmNrightOffset, this->rightOffset); else XtSetArg (args[n], XmNrightPosition, 100-this->rightOffset*100/root->width); n++; } } /* Do not set the width or height, if zero. The core widget will compute appropriately. */ if ( this->width ) { XtSetArg (args[n], XmNwidth, this->width); n++; } if ( this->height ) { XtSetArg (args[n], XmNheight, this->height); n++; } XtSetValues(this->me, args, n); return this; } /*****************************************************************************/ int mib_load_private(mib_Widget *this, mib_Buffer *fin) { if (this->mib_class_num == MIB_NULL) return 1; if ((this->mib_class_num < 1) || (this->mib_class_num > MI_NUMCLASSES)) return 0; mwfuncs[this->mib_class_num].mib_load(this, fin); return 1; } /*****************************************************************************/ int mib_load_Root(Widget parent, mib_Widget **this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; int num_widgets, count; Arg args[20]; XGCValues gcvals; XtGCMask val_mask; mib_Widget *temp = NULL; int rubberPositioning = False; mib_read_line(fin, res, val); if (!strcmp(res,"TotalWidgets")) sscanf(val, "%d", &num_widgets); else return 0; (*this) = mib_new_mib_Widget(); (*this)->mib_class = (char*)malloc(9); sprintf((*this)->mib_class,"RootForm"); XtVaGetValues(parent, XmNrubberPositioning, &rubberPositioning, NULL); (*this)->me = XmCreateForm(parent, "MainForm", args, 0); if (!mib_load_public((*this), (*this), fin)) return 0; /* we don't expect any private resources for the root widget */ mib_read_line(fin, res, val); if (strcmp(res,"EndWidget.")) return 0; XtManageChild((*this)->me); XtVaSetValues((*this)->me, XmNresizePolicy, XmRESIZE_NONE, XmNrubberPositioning, rubberPositioning, XmNresizable, rubberPositioning, NULL); count = num_widgets - 1; while (count > 0) { if (!(temp = mib_load_public((*this), temp, fin))) { /* delete temp */ return 0; } if (!mib_load_private(temp,fin)) { /* delete temp */ return 0; } count--; } mib_reset_size((*this)); XtVaSetValues((*this)->me, XmNresizePolicy, XmRESIZE_ANY, NULL); val_mask = (long)0; mib_gc = XtGetGC((*this)->me, val_mask, &gcvals); return 1; } /*****************************************************************************/ int mib_read_line(mib_Buffer *bufin, char *res, char *val) { FILE *fin; char *strin; char ch; int count, mark; char inbuf[MI_MAXSTRLEN]; if ((bufin->buf_type == MI_FROMFILE) || (bufin->buf_type == MI_EDITFROMFILE)) { fin = (FILE *)bufin->buffer; ch = '\0'; count = 0; mark = 0; while ((ch != '\n')&&(!feof(fin))&&(count 0) { if (inbuf[count-1] == 'n') inbuf[count-1] = '\0'; } else return 0; } else if ((bufin->buf_type == MI_FROMSTRING) || (bufin->buf_type == MI_EDITFROMSTRING)) { strin = (char *)bufin->buffer; count = bufin->point; mark = 0; if (count >= bufin->buflen) return 0; while ((strin[count] != '\n') && (count < bufin->buflen)) { if ((mark == 0) && (strin[count] == ':')) mark = count; count++; } strin[count] = '\0'; if (count >= bufin->buflen) return 0; sprintf(inbuf,"%s",&(strin[bufin->point])); strin[count] = '\n'; if (mark != 0) mark -= bufin->point; bufin->point = count+1; } else return 0; if (mark == 0) { sprintf(res,"%s",inbuf); #if 0 sprintf(val,"\0"); /* ???? */ #else val[0] = '\0'; val[1] = '\0'; #endif } else { inbuf[mark] = '\0'; sprintf(res,"%s",inbuf); inbuf[mark] = ' '; if (strlen(inbuf)-mark > 1) sprintf(val,"%s",&(inbuf[mark+2])); else #if 0 sprintf(val,"\0"); #else { val[0] = '\0'; val[1] = '\0'; } #endif } return 1; } /*****************************************************************************/ void mib_reset_size(mib_Widget *temp) { Arg args[5]; int n; mib_Widget *child = temp->child; if (temp->mib_class_num != MIB_NULL) { n = 0; /* Do not set the width or height, if zero. The core widget will compute appropriately. */ if (temp->width) { XtSetArg (args[n], XmNwidth, temp->width); n++; } if (temp->height) { XtSetArg (args[n], XmNheight, temp->height); n++; } XtSetValues(temp->me, args, n); } if (child != NULL) mib_reset_size(child); child = temp->sibling; if (child != NULL) mib_reset_size(child); } /*****************************************************************************/ void mib_set_eventhandlers(void (*a)(), void (*b)(), void (*c)()) { mib_events.mib_pick_mib_Widget = (void (*)())a; mib_events.mib_move_mib_Widget = (void (*)())b; mib_events.mib_unpick_mib_Widget = (void (*)())c; } /*****************************************************************************/ void mib_apply_eventhandlers(Widget this, mib_Widget *actual) { XtAddEventHandler(this, ButtonPressMask, FALSE, mib_events.mib_pick_mib_Widget, (XtPointer)actual); XtAddEventHandler(this, Button3MotionMask, FALSE, mib_events.mib_move_mib_Widget, (XtPointer)actual); XtAddEventHandler(this, ButtonReleaseMask, FALSE, mib_events.mib_unpick_mib_Widget, (XtPointer)actual); } /*****************************************************************************/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/mib/mibload.h0000644000175000001440000001250610603756567014173 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Structure of mib_Widget */ /*****************************************************************************/ typedef struct _mib_Widget { char *mib_class; /* name of mib class (Button, TextBox, etc..)*/ int mib_class_num; /* class number for ez reference :) */ int mib_mynum; /* numbering for storage format */ Widget me; /* Xt widget */ int mib_selected; /* is selected */ int mib_resizing; /* is resizing 1, or being moved 0 */ int mib_resizetype;/* 1 = upper left, 2 = upper, 3 = ... */ int mib_allowresize; /* can this widget be resized ? */ int clkx, clky; /* where user clicked */ void *myres; /* my resources (different for each widget) */ char *name; /* reference name of this widget */ int width, height; /* width and height */ int topAttachment, bottomAttachment, leftAttachment, rightAttachment; /* attachments 1=attached 0=not-attached */ int topOffset, bottomOffset, leftOffset, rightOffset; /* offsets if attached */ struct _mib_Widget *parent; /* pointer to parent */ struct _mib_Widget *sibling; /* remaining linked list of sibling widgets */ struct _mib_Widget *prev; /* previous sibling or parent */ struct _mib_Widget *child; /* linked list of children widgets */ } mib_Widget; /* mib_Buffer structure */ /*****************************************************************************/ typedef struct _mib_Buffer { void *buffer; /* pointer to either a file or a char string */ int buf_type; /* type of buffer (defined above) */ int point; /* pointer for string */ int buflen; /* length of string buffer */ } mib_Buffer; /* mib_Widget functions */ /*****************************************************************************/ void mib_add_mib_Widget(mib_Widget *, mib_Widget *); void mib_add_backward_Widget(mib_Widget *, mib_Widget *); void mib_remove_mib_Widget(mib_Widget *); void mib_clear_myres(mib_Widget *); mib_Widget *mib_new_mib_Widget(); mib_Widget *mib_find_name(mib_Widget *, char *); mib_Widget *mib_load_interface(Widget, char *, int); int mib_count_all(mib_Widget *, int); int mib_load_Root(Widget, mib_Widget **, mib_Buffer *); mib_Widget *mib_load_public(mib_Widget *, mib_Widget *, mib_Buffer *); int mib_load_mib_class(mib_Widget **, mib_Widget *, char *, char *, mib_Buffer *); int mib_load_private(mib_Widget *, mib_Buffer *); void mib_reset_size(mib_Widget *); int mib_read_line(mib_Buffer *, char *, char *); void mib_set_eventhandlers(void (*a)(), void (*b)(), void (*c)()); void mib_apply_eventhandlers(Widget, mib_Widget *); void mib_add_backward(mib_Widget *this, mib_Widget *parent); /* supporting functions and structures */ /*****************************************************************************/ typedef struct _menu_item { char *label; WidgetClass *class; char mnemonic; char *accelerator; char *accel_text; void (*callback)(); XtPointer callback_data; struct _menu_item *subitems; } MenuItem; Widget BuildMenu(Widget, int, char *, char, MenuItem *); /* mib class numbers */ #define MIB_NULL 0 #define MIB_TEXTBOX 1 #define MIB_BUTTON 2 #define MIB_TOGGLE 3 #define MIB_RADIOBOX 4 #define MIB_DRAWINGAREA 5 #define MIB_LABEL 6 #define MIB_FRAME 7 #define MIB_SCROLLBAR 8 #define MIB_TEXTBIG 9 #define MIB_LIST 10 #define MIB_SCALE 11 #define MIB_MENU 12 /* number of classes */ #define MI_NUMCLASSES 12 /* for specifying creation of a widget with default private values, no values at all (empty), or no values and editable */ #define WDEFAULT 1 #define WEMPTY 2 #define WEDIT 3 /* for specifing whether we are loading an interface from a file or from a string and whether it is editable :) */ #define MI_FROMFILE 1 #define MI_EDITFROMFILE 2 #define MI_FROMSTRING 3 #define MI_EDITFROMSTRING 4 #define MI_MAXSTRLEN 200 /* maximum string length */ geomview-1.9.4/src/lib/mib/mibTextBig.c0000644000175000001440000001017410455701006014573 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; static Widget real_text; /* Code of TextBig */ /*****************************************************************************/ mib_Widget *mib_create_TextBig(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_TextBig *myres; Widget wtemp; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_TextBig *)malloc(sizeof(mib_TextBig)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(8); sprintf(temp->mib_class,"TextBig"); temp->mib_class_num = MIB_TEXTBIG; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; myres->nothing = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_IN); n++; temp->me = XtCreateManagedWidget(name, xmFrameWidgetClass, temp->parent->me, args, n); n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; XtSetArg (args[n], XmNrows, 200); n++; XtSetArg (args[n], XmNcolumns, 200); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; wtemp = XmCreateScrolledText(temp->me, name, args, n); real_text = wtemp; XtManageChild(wtemp); if (mib_fill != WEMPTY) real_text = NULL; if (mib_fill == WEDIT || mib_fill == WDEFAULT) { XmTextSetString(wtemp,"Big Text Field\nwith Scrollbars\n\n\n\n\n\n\n "); mib_apply_eventhandlers(wtemp, temp); mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_TextBig(mib_Widget *this) { mib_TextBig *temp = (mib_TextBig *)this->myres; free(temp); } void mib_save_TextBig(mib_Widget *this, FILE *fout) { } int mib_load_TextBig(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; if (real_text) this->me = real_text; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.4/src/lib/mib/mibTextBox.c0000644000175000001440000000742310455701006014625 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for TextBox */ /*****************************************************************************/ mib_Widget *mib_create_TextBox(mib_Widget *parent, char *name, char *contents, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_TextBox *myres; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_TextBox *)malloc(sizeof(mib_TextBox)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(8); sprintf(temp->mib_class,"TextBox"); temp->mib_class_num = MIB_TEXTBOX; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; myres->init_contents = NULL; if (mib_fill == WDEFAULT) { if (contents != NULL) { myres->init_contents = (char *)malloc(strlen(contents)+1); strcpy(myres->init_contents, contents); } } /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; temp->me = XtCreateManagedWidget(name, xmTextFieldWidgetClass, temp->parent->me, args, n); if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); XmTextFieldSetString(temp->me, "Text Field"); } return temp; } void mib_delete_TextBox(mib_Widget *this) { mib_TextBox *temp = (mib_TextBox *)this->myres; if (temp->init_contents != NULL) free(temp->init_contents); } void mib_save_TextBox(mib_Widget *this, FILE *fout) { } int mib_load_TextBox(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res,"EndWidget.")) return 0; return 1; } geomview-1.9.4/src/lib/mib/mibToggle.c0000644000175000001440000001325410455701006014450 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for Toggle */ /*****************************************************************************/ mib_Widget *mib_create_Toggle(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Toggle *myres; /*unsigned char *label_text;*/ XmString label_text = NULL; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Toggle *)malloc(sizeof(mib_Toggle)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(7); sprintf(temp->mib_class,"Toggle"); temp->mib_class_num = MIB_TOGGLE; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 0; /* initialize private resources */ temp->myres = (void *)myres; myres->isize = 0; if (mib_fill == WDEFAULT) { myres->label = (char *)malloc(strlen(label)+1); strcpy(myres->label,label); } /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { label_text = XmStringCreateLtoR(label, XmSTRING_DEFAULT_CHARSET); XtSetArg (args[n], XmNlabelString, label_text); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; /* XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++;*/ } /* Do not set the width or height, if zero. The core widget will compute appropriately. */ if ( width ) { XtSetArg (args[n], XmNwidth, width); n++; } if ( height ) { XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNspacing, 4); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNindicatorType, XmN_OF_MANY); temp->me = XtCreateManagedWidget(name, xmToggleButtonWidgetClass, temp->parent->me, args, n); if (mib_fill == WDEFAULT) { XmStringFree(label_text); } if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_Toggle(mib_Widget *this) { mib_Toggle *temp = (mib_Toggle *)this->myres; free(temp->label); free(temp); } void mib_save_Toggle(mib_Widget *this, FILE *fout) { mib_Toggle *temp = (mib_Toggle *)this->myres; fprintf(fout,"label: \\\"%s\\\"\\n\\\n", temp->label); fprintf(fout,"indicatorSize: %d\\n\\\n", temp->isize); } int mib_load_Toggle(mib_Widget *this, mib_Buffer *fin) { mib_Toggle *myres; /*unsigned char *label_text;*/ XmString label_text; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; Arg args[20]; int n, got_line, vallen; myres = (mib_Toggle *)this->myres; got_line = mib_read_line(fin, res, val); if (!got_line) return 0; if (!strcmp(res,"label")) { vallen = strlen(val); if (vallen < 2) return 0; val[vallen-1] = '\0'; myres->label = (char *)malloc(vallen-1); sprintf(myres->label,"%s",&(val[1])); label_text = XmStringCreateLtoR(myres->label, XmSTRING_DEFAULT_CHARSET); n = 0; XtSetArg (args[n], XmNlabelString, label_text); n++; /* Do not set the width or height, if zero. The core widget will compute appropriately. */ if ( this->width ) { XtSetArg (args[n], XmNwidth, this->width); n++; } if ( this->height ) { XtSetArg (args[n], XmNheight, this->height); n++; } XtSetValues(this->me, args, n); XmStringFree(label_text); } else return 0; got_line = mib_read_line(fin, res, val); if (!got_line) return 0; if (!strcmp(res, "indicatorSize")) { sscanf(val, "%d", &(myres->isize)); if (myres->isize) XtVaSetValues(this->me, XmNindicatorSize, (Dimension)myres->isize, XmNmarginBottom, 0, XmNmarginTop, 0, XmNmarginLeft, 0, XmNmarginRight, 0, XmNspacing, 0, NULL); got_line = mib_read_line(fin, res, val); if (!got_line) return 0; } if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.4/src/lib/mib/mibFrame.c0000644000175000001440000001142610455701006014260 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for Frames */ /*****************************************************************************/ mib_Widget *mib_create_Frame(mib_Widget *parent, char *name, char *frame_type, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Frame *myres; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Frame *)malloc(sizeof(mib_Frame)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(6); sprintf(temp->mib_class,"Frame"); temp->mib_class_num = MIB_FRAME; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; myres->shadowtype = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; if (mib_fill == WDEFAULT) { if (!strcmp("InFrame",frame_type)) { XtSetArg (args[n], XmNshadowType, XmSHADOW_IN); n++; } else if (!strcmp("OutFrame",frame_type)) { XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++; myres->shadowtype = 1; } else if (!strcmp("EtchedInFrame",frame_type)) { XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_IN); n++; myres->shadowtype = 2; } else if (!strcmp("EtchedOutFrame",frame_type)) { XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_OUT); n++; myres->shadowtype = 3; } } temp->me = XtCreateManagedWidget(name, xmFrameWidgetClass, temp->parent->me, args, n); if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_Frame(mib_Widget *this) { mib_Frame *temp = (mib_Frame *)this->myres; free(temp); } void mib_save_Frame(mib_Widget *this, FILE *fout) { mib_Frame *temp = (mib_Frame *)this->myres; fprintf(fout,"shadowtype: %d\\n\\\n", temp->shadowtype); } int mib_load_Frame(mib_Widget *this, mib_Buffer *fin) { mib_Frame *myres; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; Arg args[5]; int n; myres = (mib_Frame *)this->myres; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res,"shadowtype")) { sscanf(val,"%d",&(myres->shadowtype)); n = 0; switch (myres->shadowtype) { case 0: XtSetArg (args[n], XmNshadowType, XmSHADOW_IN); n++; break; case 1: XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++; break; case 2: XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_IN); n++; break; case 3: XtSetArg (args[n], XmNshadowType, XmSHADOW_ETCHED_OUT); n++; break; default: break; } XtSetValues(this->me, args, n); } else return 0; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.4/src/lib/mib/Headers0000644000175000001440000000002707730240205013664 00000000000000mibload.h mibwidgets.h geomview-1.9.4/src/lib/mib/mibButton.c0000644000175000001440000001127410455701006014502 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; /* Code for Button */ /*****************************************************************************/ mib_Widget *mib_create_Button(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Button *myres; /* unsigned char *label_text; */ XmString label_text; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Button *)malloc(sizeof(mib_Button)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(7); sprintf(temp->mib_class,"Button"); temp->mib_class_num = MIB_BUTTON; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 1; /* initialize private resources */ temp->myres = (void *)myres; if (mib_fill == WDEFAULT) { myres->label = (char *)malloc(strlen(label)+1); strcpy(myres->label,label); } /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { label_text = XmStringCreateLtoR(label, XmSTRING_DEFAULT_CHARSET); XtSetArg (args[n], XmNlabelString, label_text); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; XtSetArg (args[n], XmNwidth, width); n++; XtSetArg (args[n], XmNheight, height); n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; XtSetArg (args[n], XmNhighlightThickness, 0); n++; temp->me = XtCreateManagedWidget(name, xmPushButtonWidgetClass, temp->parent->me, args, n); if (mib_fill == WDEFAULT) { XmStringFree(label_text); } if (mib_fill == WEDIT || mib_fill == WDEFAULT) { mib_apply_eventhandlers(temp->me, temp); } return temp; } void mib_delete_Button(mib_Widget *this) { mib_Button *temp = (mib_Button *)this->myres; free(temp->label); free(temp); } void mib_save_Button(mib_Widget *this, FILE *fout) { mib_Button *temp = (mib_Button *)this->myres; fprintf(fout,"label: \\\"%s\\\"\\n\\\n", temp->label); } void mib_code_gen_Button(mib_Widget *this, FILE *fout) { } int mib_load_Button(mib_Widget *this, mib_Buffer *fin) { mib_Button *myres; /* unsigned char *label_text; */ XmString label_text; char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; Arg args[20]; int n, got_line, vallen; myres = (mib_Button *)this->myres; got_line = mib_read_line(fin, res, val); if (!got_line) return 0; if (!strcmp(res,"label")) { vallen = strlen(val); if (vallen < 2) return 0; val[vallen-1] = '\0'; myres->label = (char *)malloc(vallen-1); sprintf(myres->label,"%s",&(val[1])); label_text = XmStringCreateLtoR(myres->label, XmSTRING_DEFAULT_CHARSET); n = 0; XtSetArg (args[n], XmNlabelString, label_text); n++; XtSetValues(this->me, args, n); XmStringFree(label_text); } else return 0; got_line = mib_read_line(fin, res, val); if (!got_line) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; } geomview-1.9.4/src/lib/oogl/0000777000175000001440000000000010665240671012654 500000000000000geomview-1.9.4/src/lib/oogl/wa/0000777000175000001440000000000010665240671013263 500000000000000geomview-1.9.4/src/lib/oogl/wa/wa.h0000644000175000001440000000212210455701007013744 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _WA_H_ #define _WA_H_ /* Word acceptor structure: */ typedef struct { int start, fail, state; int nstates, ngens; char **genlist; int **action; } wa; void wfsaerror(char *s); #endif geomview-1.9.4/src/lib/oogl/wa/fsaparse.l0000644000175000001440000000262510464070561015161 00000000000000%{ /* * fsaparse.l (lex.yy.c) * * Lex definitions for lexical scanner for parsing word-acceptor * automata. See fsaparse.y for more info. * * mbp Sat Mar 23 21:58:12 1991 * mbp@thales.urich.edu */ #include #include /* for atof() */ #include #include #include "wa.yystype.h" #include "wa.yacc.h" YYSTYPE yylval; /* disable output of unmatched input */ #undef output #define output(c) %} DIGIT [0-9] WS [ \t\n,] LETTER [A-Za-z] SIGN [+-] %% /* RULES SECTION */ {WS}+ ; "Format" { return(FORMAT); } "format" { return(FORMAT); } "fsa" { return(FSA); } "states" { return(STATES); } "symbols" { return(SYMBOLS); } "bfs" { return(BFS); } "min" { return(MIN); } "variables" { return(VARIABLES); } "alphabet" { return(ALPHABET); } "start" { return(START); } "atable" { return(ATABLE); } "inverses" { return(INVERSES); } "inv" { return(INV); } "{" { return(LEFT_BRACE); } "}" { return(RIGHT_BRACE); } "(" { return(LEFT_PAREN); } ")" { return(RIGHT_PAREN); } ";" { return(SEMICOLON); } "%" { return(PERCENT); } "=" { return(EQUAL); } {SIGN}?{DIGIT}+ { yylval.i = atoi(yytext); return(INT); } {SIGN}?{DIGIT}*\.{DIGIT}? { yylval.d = atof(yytext); return(REAL); } {SIGN}?{DIGIT}+\.{DIGIT}* { yylval.d = atof(yytext); return(REAL); } [^ \t\n{};%()=]+ { strcpy(yylval.s, yytext); return(STRING); } %% /* SUBPROGRAMS SECTION */ int yywrap() { return(1); } geomview-1.9.4/src/lib/oogl/wa/fsaparse.y0000644000175000001440000000751210464070547015202 00000000000000/* * fsaparse.y * * Yacc grammar for parsing word-acceptor automata in the format * described by DEAGL ("Data Exchange for Automata and Groups * Language"). * * This grammar does NOT recognize the entire language described * in DEAGL. The main function is fsaparse(), defined below. See * the comments in that function for more info. * * mbp Sat Mar 23 21:56:30 1991 * mbp@thales.urich.edu */ %{ #include #include #include #include "wa.h" #include "wa.yystype.h" #include "wa.yacc.h" #define MAXSTATES 100 #define MAXGENS 128 #if 0 static char copyright[] = "Copyright (C) 1991 Mark B. Phillips, The Geometry Center"; #endif static int adj[MAXSTATES]; static int adj_index = 0; static void install_adjacency(); static void yyerror(char *s); extern int yylex(void); static wa *fsa; %} %start fsa_file %token FORMAT FSA STATES SYMBOLS BFS MIN VARIABLES ALPHABET START ATABLE INVERSES INV LEFT_BRACE RIGHT_BRACE LEFT_PAREN RIGHT_PAREN SEMICOLON PERCENT INT EQUAL %token STRING %token REAL %type start_states %% fsa_file : FORMAT REAL fsa_format ; fsa_format : FSA LEFT_BRACE states symbols fsa_characteristics info_items PERCENT fsa_table RIGHT_BRACE { return(0); } ; states : STATES INT { fsa->nstates = $2; fsa->action = (int**)malloc((fsa->nstates+1)*sizeof(int*)); } ; symbols : SYMBOLS INT { int i,j; fsa->ngens = $2; for (i=0; i<=fsa->nstates; ++i) { fsa->action[i] = (int*)malloc((fsa->ngens+1)*sizeof(int)); for (j=0; j<=fsa->ngens; ++j) fsa->action[i][j] = 0; } fsa->genlist=(char**)malloc(fsa->ngens*sizeof(char*)); for (i=0; ingens; ++i) fsa->genlist[i] = ""; } ; fsa_characteristics : fsa_characteristic | fsa_characteristic fsa_characteristics ; fsa_characteristic : BFS | MIN | VARIABLES INT ; info_items : info_item | info_item info_items ; info_item : alphabet | start_states { fsa->start= $1; } ; alphabet : ALPHABET LEFT_BRACE symbol_names RIGHT_BRACE ; symbol_names : symbol_name | symbol_names symbol_name ; symbol_name : INT EQUAL STRING { fsa->genlist[$1-1] = (char*)malloc((strlen($3)+1)*sizeof(char)); strcpy(fsa->genlist[$1-1], $3); } ; start_states : START LEFT_BRACE INT RIGHT_BRACE { $$ = $3; } | START LEFT_BRACE INT int_list RIGHT_BRACE { $$ = $3; } ; int_list : INT | INT int_list ; fsa_table : ATABLE acstates | ATABLE ; acstates : acstate | acstate acstates ; acstate : INT STRING adjacency SEMICOLON { install_adjacency($1); adj_index = 0; } ; adjacency : INT { adj[adj_index++] = $1; } | adjacency INT { adj[adj_index++] = $2; } ; %% static void yyerror(char *s) { printf("yyerror: %s\n", s); } static void install_adjacency(n) int n; { int i; for (i=0; iaction[n][i+1] = adj[i]; } void parse_init(f) wa *f; { fsa = f; fsa->fail = fsa->state = 0; } /*----------------------------------------------------------------------- * Function: fsaparse * Description: parse a .wa file into an wa struct * Args IN: fp: .wa file pointer * OUT: *fsa: the resulting fsa struct * Returns: 1 for success, 0 for error * Author: mbp * Date: Sat Mar 23 21:47:04 1991 * Notes: Does not recognize the full grammar defined by * "Data Exchange for Automatic Groups". Only recognizes * files of the form used by several examples I was * using at the time I wrote this. I think, but am not * at all sure, that this includes all word-acceptor * automata. */ int fsaparse(fp, fsa) FILE *fp; wa *fsa; { extern FILE *yyin; int ret; parse_init(fsa); yyin = fp; ret = yyparse(); return(ret ==0); } geomview-1.9.4/src/lib/oogl/wa/wa.yacc.c0000644000175000001440000014142610665240612014673 00000000000000/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with wafsa or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Using locations. */ #define YYLSP_NEEDED 0 /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum wafsatokentype { FORMAT = 258, FSA = 259, STATES = 260, SYMBOLS = 261, BFS = 262, MIN = 263, VARIABLES = 264, ALPHABET = 265, START = 266, ATABLE = 267, INVERSES = 268, INV = 269, LEFT_BRACE = 270, RIGHT_BRACE = 271, LEFT_PAREN = 272, RIGHT_PAREN = 273, SEMICOLON = 274, PERCENT = 275, INT = 276, EQUAL = 277, STRING = 278, REAL = 279 }; #endif /* Tokens. */ #define FORMAT 258 #define FSA 259 #define STATES 260 #define SYMBOLS 261 #define BFS 262 #define MIN 263 #define VARIABLES 264 #define ALPHABET 265 #define START 266 #define ATABLE 267 #define INVERSES 268 #define INV 269 #define LEFT_BRACE 270 #define RIGHT_BRACE 271 #define LEFT_PAREN 272 #define RIGHT_PAREN 273 #define SEMICOLON 274 #define PERCENT 275 #define INT 276 #define EQUAL 277 #define STRING 278 #define REAL 279 /* Copy the first part of user declarations. */ #line 16 "../../../../../src/lib/oogl/wa/fsaparse.y" #include #include #include #include "wa.h" #include "wa.yystype.h" #include "wa.yacc.h" #define MAXSTATES 100 #define MAXGENS 128 #if 0 static char copyright[] = "Copyright (C) 1991 Mark B. Phillips, The Geometry Center"; #endif static int adj[MAXSTATES]; static int adj_index = 0; static void install_adjacency(); static void wafsaerror(char *s); extern int wafsalex(void); static wa *fsa; /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef int YYSTYPE; # define wafsastype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 181 "y.tab.c" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 wafsatype_uint8; #else typedef unsigned char wafsatype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 wafsatype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char wafsatype_int8; #else typedef short int wafsatype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 wafsatype_uint16; #else typedef unsigned short int wafsatype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 wafsatype_int16; #else typedef short int wafsatype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined wafsaoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined wafsaoverflow || YYERROR_VERBOSE */ #if (! defined wafsaoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union wafsaalloc { wafsatype_int16 wafsass; YYSTYPE wafsavs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union wafsaalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (wafsatype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T wafsai; \ for (wafsai = 0; wafsai < (Count); wafsai++) \ (To)[wafsai] = (From)[wafsai]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T wafsanewbytes; \ YYCOPY (&wafsaptr->Stack, Stack, wafsasize); \ Stack = &wafsaptr->Stack; \ wafsanewbytes = wafsastacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ wafsaptr += wafsanewbytes / sizeof (*wafsaptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 4 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 44 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 25 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 18 /* YYNRULES -- Number of rules. */ #define YYNRULES 29 /* YYNRULES -- Number of states. */ #define YYNSTATES 56 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 279 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? wafsatranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const wafsatype_uint8 wafsatranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const wafsatype_uint8 wafsaprhs[] = { 0, 0, 3, 7, 17, 20, 23, 25, 28, 30, 32, 35, 37, 40, 42, 44, 49, 51, 54, 58, 63, 69, 71, 74, 77, 79, 81, 84, 89, 91 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const wafsatype_int8 wafsarhs[] = { 26, 0, -1, 3, 24, 27, -1, 4, 15, 28, 29, 30, 32, 20, 39, 16, -1, 5, 21, -1, 6, 21, -1, 31, -1, 31, 30, -1, 7, -1, 8, -1, 9, 21, -1, 33, -1, 33, 32, -1, 34, -1, 37, -1, 10, 15, 35, 16, -1, 36, -1, 35, 36, -1, 21, 22, 23, -1, 11, 15, 21, 16, -1, 11, 15, 21, 38, 16, -1, 21, -1, 21, 38, -1, 12, 40, -1, 12, -1, 41, -1, 41, 40, -1, 21, 23, 42, 19, -1, 21, -1, 42, 21, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const wafsatype_uint8 wafsarline[] = { 0, 54, 54, 57, 69, 77, 94, 95, 100, 101, 102, 106, 107, 110, 111, 117, 120, 121, 124, 132, 134, 139, 140, 144, 145, 148, 149, 152, 156, 160 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const wafsatname[] = { "$end", "error", "$undefined", "FORMAT", "FSA", "STATES", "SYMBOLS", "BFS", "MIN", "VARIABLES", "ALPHABET", "START", "ATABLE", "INVERSES", "INV", "LEFT_BRACE", "RIGHT_BRACE", "LEFT_PAREN", "RIGHT_PAREN", "SEMICOLON", "PERCENT", "INT", "EQUAL", "STRING", "REAL", "$accept", "fsa_file", "fsa_format", "states", "symbols", "fsa_characteristics", "fsa_characteristic", "info_items", "info_item", "alphabet", "symbol_names", "symbol_name", "start_states", "int_list", "fsa_table", "acstates", "acstate", "adjacency", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const wafsatype_uint16 wafsatoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const wafsatype_uint8 wafsar1[] = { 0, 25, 26, 27, 28, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 34, 35, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 42, 42 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const wafsatype_uint8 wafsar2[] = { 0, 2, 3, 9, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 4, 1, 2, 3, 4, 5, 1, 2, 2, 1, 1, 2, 4, 1, 2 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const wafsatype_uint8 wafsadefact[] = { 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 4, 0, 0, 5, 8, 9, 0, 0, 6, 10, 0, 0, 0, 11, 13, 14, 7, 0, 0, 0, 12, 0, 0, 16, 0, 24, 0, 0, 15, 17, 19, 21, 0, 0, 23, 25, 3, 18, 22, 20, 0, 26, 28, 0, 27, 29 }; /* YYDEFGOTO[NTERM-NUM]. */ static const wafsatype_int8 wafsadefgoto[] = { -1, 2, 6, 9, 12, 17, 18, 22, 23, 24, 32, 33, 25, 42, 36, 44, 45, 53 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -17 static const wafsatype_int8 wafsapact[] = { 5, -11, 12, 10, -17, 1, -17, 13, -6, 11, -17, -2, -5, -17, -17, -17, -1, 0, -5, -17, 6, 7, 3, 0, -17, -17, -17, 4, 8, 14, -17, 2, -16, -17, -15, 9, 15, 16, -17, -17, -17, 17, 18, 19, -17, 9, -17, -17, -17, -17, 20, -17, -17, -12, -17, -17 }; /* YYPGOTO[NTERM-NUM]. */ static const wafsatype_int8 wafsapgoto[] = { -17, -17, -17, -17, -17, 22, -17, 21, -17, -17, -17, -4, -17, -14, -17, -13, -17, -17 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const wafsatype_uint8 wafsatable[] = { 38, 40, 14, 15, 16, 31, 41, 54, 1, 55, 20, 21, 4, 3, 5, 10, 7, 11, 8, 13, 19, 27, 28, 29, 37, 31, 35, 48, 39, 34, 43, 46, 51, 0, 49, 0, 0, 0, 41, 47, 26, 52, 50, 0, 30 }; static const wafsatype_int8 wafsacheck[] = { 16, 16, 7, 8, 9, 21, 21, 19, 3, 21, 10, 11, 0, 24, 4, 21, 15, 6, 5, 21, 21, 15, 15, 20, 22, 21, 12, 41, 32, 21, 21, 16, 45, -1, 16, -1, -1, -1, 21, 23, 18, 21, 23, -1, 23 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const wafsatype_uint8 wafsastos[] = { 0, 3, 26, 24, 0, 4, 27, 15, 5, 28, 21, 6, 29, 21, 7, 8, 9, 30, 31, 21, 10, 11, 32, 33, 34, 37, 30, 15, 15, 20, 32, 21, 35, 36, 21, 12, 39, 22, 16, 36, 16, 21, 38, 21, 40, 41, 16, 23, 38, 16, 23, 40, 21, 42, 19, 21 }; #define wafsaerrok (wafsaerrstatus = 0) #define wafsaclearin (wafsachar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto wafsaacceptlab #define YYABORT goto wafsaabortlab #define YYERROR goto wafsaerrorlab /* Like YYERROR except do call wafsaerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto wafsaerrlab #define YYRECOVERING() (!!wafsaerrstatus) #define YYBACKUP(Token, Value) \ do \ if (wafsachar == YYEMPTY && wafsalen == 1) \ { \ wafsachar = (Token); \ wafsalval = (Value); \ wafsatoken = YYTRANSLATE (wafsachar); \ YYPOPSTACK (1); \ goto wafsabackup; \ } \ else \ { \ wafsaerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `wafsalex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX wafsalex (YYLEX_PARAM) #else # define YYLEX wafsalex () #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (wafsadebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (wafsadebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ wafsa_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void wafsa_symbol_value_print (FILE *wafsaoutput, int wafsatype, YYSTYPE const * const wafsavaluep) #else static void wafsa_symbol_value_print (wafsaoutput, wafsatype, wafsavaluep) FILE *wafsaoutput; int wafsatype; YYSTYPE const * const wafsavaluep; #endif { if (!wafsavaluep) return; # ifdef YYPRINT if (wafsatype < YYNTOKENS) YYPRINT (wafsaoutput, wafsatoknum[wafsatype], *wafsavaluep); # else YYUSE (wafsaoutput); # endif switch (wafsatype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void wafsa_symbol_print (FILE *wafsaoutput, int wafsatype, YYSTYPE const * const wafsavaluep) #else static void wafsa_symbol_print (wafsaoutput, wafsatype, wafsavaluep) FILE *wafsaoutput; int wafsatype; YYSTYPE const * const wafsavaluep; #endif { if (wafsatype < YYNTOKENS) YYFPRINTF (wafsaoutput, "token %s (", wafsatname[wafsatype]); else YYFPRINTF (wafsaoutput, "nterm %s (", wafsatname[wafsatype]); wafsa_symbol_value_print (wafsaoutput, wafsatype, wafsavaluep); YYFPRINTF (wafsaoutput, ")"); } /*------------------------------------------------------------------. | wafsa_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void wafsa_stack_print (wafsatype_int16 *bottom, wafsatype_int16 *top) #else static void wafsa_stack_print (bottom, top) wafsatype_int16 *bottom; wafsatype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (wafsadebug) \ wafsa_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void wafsa_reduce_print (YYSTYPE *wafsavsp, int wafsarule) #else static void wafsa_reduce_print (wafsavsp, wafsarule) YYSTYPE *wafsavsp; int wafsarule; #endif { int wafsanrhs = wafsar2[wafsarule]; int wafsai; unsigned long int wafsalno = wafsarline[wafsarule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", wafsarule - 1, wafsalno); /* The symbols being reduced. */ for (wafsai = 0; wafsai < wafsanrhs; wafsai++) { fprintf (stderr, " $%d = ", wafsai + 1); wafsa_symbol_print (stderr, wafsarhs[wafsaprhs[wafsarule] + wafsai], &(wafsavsp[(wafsai + 1) - (wafsanrhs)]) ); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (wafsadebug) \ wafsa_reduce_print (wafsavsp, Rule); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int wafsadebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef wafsastrlen # if defined __GLIBC__ && defined _STRING_H # define wafsastrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T wafsastrlen (const char *wafsastr) #else static YYSIZE_T wafsastrlen (wafsastr) const char *wafsastr; #endif { YYSIZE_T wafsalen; for (wafsalen = 0; wafsastr[wafsalen]; wafsalen++) continue; return wafsalen; } # endif # endif # ifndef wafsastpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define wafsastpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * wafsastpcpy (char *wafsadest, const char *wafsasrc) #else static char * wafsastpcpy (wafsadest, wafsasrc) char *wafsadest; const char *wafsasrc; #endif { char *wafsad = wafsadest; const char *wafsas = wafsasrc; while ((*wafsad++ = *wafsas++) != '\0') continue; return wafsad - 1; } # endif # endif # ifndef wafsatnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for wafsaerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from wafsatname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T wafsatnamerr (char *wafsares, const char *wafsastr) { if (*wafsastr == '"') { YYSIZE_T wafsan = 0; char const *wafsap = wafsastr; for (;;) switch (*++wafsap) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++wafsap != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (wafsares) wafsares[wafsan] = *wafsap; wafsan++; break; case '"': if (wafsares) wafsares[wafsan] = '\0'; return wafsan; } do_not_strip_quotes: ; } if (! wafsares) return wafsastrlen (wafsastr); return wafsastpcpy (wafsares, wafsastr) - wafsares; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T wafsasyntax_error (char *wafsaresult, int wafsastate, int wafsachar) { int wafsan = wafsapact[wafsastate]; if (! (YYPACT_NINF < wafsan && wafsan <= YYLAST)) return 0; else { int wafsatype = YYTRANSLATE (wafsachar); YYSIZE_T wafsasize0 = wafsatnamerr (0, wafsatname[wafsatype]); YYSIZE_T wafsasize = wafsasize0; YYSIZE_T wafsasize1; int wafsasize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *wafsaarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int wafsax; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *wafsafmt; char const *wafsaf; static char const wafsaunexpected[] = "syntax error, unexpected %s"; static char const wafsaexpecting[] = ", expecting %s"; static char const wafsaor[] = " or %s"; char wafsaformat[sizeof wafsaunexpected + sizeof wafsaexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof wafsaor - 1))]; char const *wafsaprefix = wafsaexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int wafsaxbegin = wafsan < 0 ? -wafsan : 0; /* Stay within bounds of both wafsacheck and wafsatname. */ int wafsachecklim = YYLAST - wafsan + 1; int wafsaxend = wafsachecklim < YYNTOKENS ? wafsachecklim : YYNTOKENS; int wafsacount = 1; wafsaarg[0] = wafsatname[wafsatype]; wafsafmt = wafsastpcpy (wafsaformat, wafsaunexpected); for (wafsax = wafsaxbegin; wafsax < wafsaxend; ++wafsax) if (wafsacheck[wafsax + wafsan] == wafsax && wafsax != YYTERROR) { if (wafsacount == YYERROR_VERBOSE_ARGS_MAXIMUM) { wafsacount = 1; wafsasize = wafsasize0; wafsaformat[sizeof wafsaunexpected - 1] = '\0'; break; } wafsaarg[wafsacount++] = wafsatname[wafsax]; wafsasize1 = wafsasize + wafsatnamerr (0, wafsatname[wafsax]); wafsasize_overflow |= (wafsasize1 < wafsasize); wafsasize = wafsasize1; wafsafmt = wafsastpcpy (wafsafmt, wafsaprefix); wafsaprefix = wafsaor; } wafsaf = YY_(wafsaformat); wafsasize1 = wafsasize + wafsastrlen (wafsaf); wafsasize_overflow |= (wafsasize1 < wafsasize); wafsasize = wafsasize1; if (wafsasize_overflow) return YYSIZE_MAXIMUM; if (wafsaresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *wafsap = wafsaresult; int wafsai = 0; while ((*wafsap = *wafsaf) != '\0') { if (*wafsap == '%' && wafsaf[1] == 's' && wafsai < wafsacount) { wafsap += wafsatnamerr (wafsap, wafsaarg[wafsai++]); wafsaf += 2; } else { wafsap++; wafsaf++; } } } return wafsasize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void wafsadestruct (const char *wafsamsg, int wafsatype, YYSTYPE *wafsavaluep) #else static void wafsadestruct (wafsamsg, wafsatype, wafsavaluep) const char *wafsamsg; int wafsatype; YYSTYPE *wafsavaluep; #endif { YYUSE (wafsavaluep); if (!wafsamsg) wafsamsg = "Deleting"; YY_SYMBOL_PRINT (wafsamsg, wafsatype, wafsavaluep, wafsalocationp); switch (wafsatype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int wafsaparse (void *YYPARSE_PARAM); #else int wafsaparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int wafsaparse (void); #else int wafsaparse (); #endif #endif /* ! YYPARSE_PARAM */ /* The look-ahead symbol. */ int wafsachar; /* The semantic value of the look-ahead symbol. */ YYSTYPE wafsalval; /* Number of syntax errors so far. */ int wafsanerrs; /*----------. | wafsaparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int wafsaparse (void *YYPARSE_PARAM) #else int wafsaparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int wafsaparse (void) #else int wafsaparse () #endif #endif { int wafsastate; int wafsan; int wafsaresult; /* Number of tokens to shift before error messages enabled. */ int wafsaerrstatus; /* Look-ahead token as an internal (translated) token number. */ int wafsatoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char wafsamsgbuf[128]; char *wafsamsg = wafsamsgbuf; YYSIZE_T wafsamsg_alloc = sizeof wafsamsgbuf; #endif /* Three stacks and their tools: `wafsass': related to states, `wafsavs': related to semantic values, `wafsals': related to locations. Refer to the stacks thru separate pointers, to allow wafsaoverflow to reallocate them elsewhere. */ /* The state stack. */ wafsatype_int16 wafsassa[YYINITDEPTH]; wafsatype_int16 *wafsass = wafsassa; wafsatype_int16 *wafsassp; /* The semantic value stack. */ YYSTYPE wafsavsa[YYINITDEPTH]; YYSTYPE *wafsavs = wafsavsa; YYSTYPE *wafsavsp; #define YYPOPSTACK(N) (wafsavsp -= (N), wafsassp -= (N)) YYSIZE_T wafsastacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE wafsaval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int wafsalen = 0; YYDPRINTF ((stderr, "Starting parse\n")); wafsastate = 0; wafsaerrstatus = 0; wafsanerrs = 0; wafsachar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ wafsassp = wafsass; wafsavsp = wafsavs; goto wafsasetstate; /*------------------------------------------------------------. | wafsanewstate -- Push a new state, which is found in wafsastate. | `------------------------------------------------------------*/ wafsanewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ wafsassp++; wafsasetstate: *wafsassp = wafsastate; if (wafsass + wafsastacksize - 1 <= wafsassp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T wafsasize = wafsassp - wafsass + 1; #ifdef wafsaoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *wafsavs1 = wafsavs; wafsatype_int16 *wafsass1 = wafsass; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if wafsaoverflow is a macro. */ wafsaoverflow (YY_("memory exhausted"), &wafsass1, wafsasize * sizeof (*wafsassp), &wafsavs1, wafsasize * sizeof (*wafsavsp), &wafsastacksize); wafsass = wafsass1; wafsavs = wafsavs1; } #else /* no wafsaoverflow */ # ifndef YYSTACK_RELOCATE goto wafsaexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= wafsastacksize) goto wafsaexhaustedlab; wafsastacksize *= 2; if (YYMAXDEPTH < wafsastacksize) wafsastacksize = YYMAXDEPTH; { wafsatype_int16 *wafsass1 = wafsass; union wafsaalloc *wafsaptr = (union wafsaalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (wafsastacksize)); if (! wafsaptr) goto wafsaexhaustedlab; YYSTACK_RELOCATE (wafsass); YYSTACK_RELOCATE (wafsavs); # undef YYSTACK_RELOCATE if (wafsass1 != wafsassa) YYSTACK_FREE (wafsass1); } # endif #endif /* no wafsaoverflow */ wafsassp = wafsass + wafsasize - 1; wafsavsp = wafsavs + wafsasize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) wafsastacksize)); if (wafsass + wafsastacksize - 1 <= wafsassp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", wafsastate)); goto wafsabackup; /*-----------. | wafsabackup. | `-----------*/ wafsabackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ wafsan = wafsapact[wafsastate]; if (wafsan == YYPACT_NINF) goto wafsadefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (wafsachar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); wafsachar = YYLEX; } if (wafsachar <= YYEOF) { wafsachar = wafsatoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { wafsatoken = YYTRANSLATE (wafsachar); YY_SYMBOL_PRINT ("Next token is", wafsatoken, &wafsalval, &wafsalloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ wafsan += wafsatoken; if (wafsan < 0 || YYLAST < wafsan || wafsacheck[wafsan] != wafsatoken) goto wafsadefault; wafsan = wafsatable[wafsan]; if (wafsan <= 0) { if (wafsan == 0 || wafsan == YYTABLE_NINF) goto wafsaerrlab; wafsan = -wafsan; goto wafsareduce; } if (wafsan == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (wafsaerrstatus) wafsaerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", wafsatoken, &wafsalval, &wafsalloc); /* Discard the shifted token unless it is eof. */ if (wafsachar != YYEOF) wafsachar = YYEMPTY; wafsastate = wafsan; *++wafsavsp = wafsalval; goto wafsanewstate; /*-----------------------------------------------------------. | wafsadefault -- do the default action for the current state. | `-----------------------------------------------------------*/ wafsadefault: wafsan = wafsadefact[wafsastate]; if (wafsan == 0) goto wafsaerrlab; goto wafsareduce; /*-----------------------------. | wafsareduce -- Do a reduction. | `-----------------------------*/ wafsareduce: /* wafsan is the number of a rule to reduce with. */ wafsalen = wafsar2[wafsan]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ wafsaval = wafsavsp[1-wafsalen]; YY_REDUCE_PRINT (wafsan); switch (wafsan) { case 3: #line 66 "../../../../../src/lib/oogl/wa/fsaparse.y" { return(0); } break; case 4: #line 70 "../../../../../src/lib/oogl/wa/fsaparse.y" { fsa->nstates = (wafsavsp[(2) - (2)].i); fsa->action = (int**)malloc((fsa->nstates+1)*sizeof(int*)); } break; case 5: #line 78 "../../../../../src/lib/oogl/wa/fsaparse.y" { int i,j; fsa->ngens = (wafsavsp[(2) - (2)].i); for (i=0; i<=fsa->nstates; ++i) { fsa->action[i] = (int*)malloc((fsa->ngens+1)*sizeof(int)); for (j=0; j<=fsa->ngens; ++j) fsa->action[i][j] = 0; } fsa->genlist=(char**)malloc(fsa->ngens*sizeof(char*)); for (i=0; ingens; ++i) fsa->genlist[i] = ""; } break; case 14: #line 112 "../../../../../src/lib/oogl/wa/fsaparse.y" { fsa->start= (wafsavsp[(1) - (1)].i); } break; case 18: #line 125 "../../../../../src/lib/oogl/wa/fsaparse.y" { fsa->genlist[(wafsavsp[(1) - (3)].i)-1] = (char*)malloc((strlen((wafsavsp[(3) - (3)].s))+1)*sizeof(char)); strcpy(fsa->genlist[(wafsavsp[(1) - (3)].i)-1], (wafsavsp[(3) - (3)].s)); } break; case 19: #line 133 "../../../../../src/lib/oogl/wa/fsaparse.y" { (wafsaval.i) = (wafsavsp[(3) - (4)].i); } break; case 20: #line 135 "../../../../../src/lib/oogl/wa/fsaparse.y" { (wafsaval.i) = (wafsavsp[(3) - (5)].i); } break; case 27: #line 153 "../../../../../src/lib/oogl/wa/fsaparse.y" { install_adjacency((wafsavsp[(1) - (4)].i)); adj_index = 0; } break; case 28: #line 157 "../../../../../src/lib/oogl/wa/fsaparse.y" { adj[adj_index++] = (wafsavsp[(1) - (1)].i); } break; case 29: #line 161 "../../../../../src/lib/oogl/wa/fsaparse.y" { adj[adj_index++] = (wafsavsp[(2) - (2)].i); } break; /* Line 1267 of yacc.c. */ #line 1488 "y.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", wafsar1[wafsan], &wafsaval, &wafsaloc); YYPOPSTACK (wafsalen); wafsalen = 0; YY_STACK_PRINT (wafsass, wafsassp); *++wafsavsp = wafsaval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ wafsan = wafsar1[wafsan]; wafsastate = wafsapgoto[wafsan - YYNTOKENS] + *wafsassp; if (0 <= wafsastate && wafsastate <= YYLAST && wafsacheck[wafsastate] == *wafsassp) wafsastate = wafsatable[wafsastate]; else wafsastate = wafsadefgoto[wafsan - YYNTOKENS]; goto wafsanewstate; /*------------------------------------. | wafsaerrlab -- here on detecting error | `------------------------------------*/ wafsaerrlab: /* If not already recovering from an error, report this error. */ if (!wafsaerrstatus) { ++wafsanerrs; #if ! YYERROR_VERBOSE wafsaerror (YY_("syntax error")); #else { YYSIZE_T wafsasize = wafsasyntax_error (0, wafsastate, wafsachar); if (wafsamsg_alloc < wafsasize && wafsamsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T wafsaalloc = 2 * wafsasize; if (! (wafsasize <= wafsaalloc && wafsaalloc <= YYSTACK_ALLOC_MAXIMUM)) wafsaalloc = YYSTACK_ALLOC_MAXIMUM; if (wafsamsg != wafsamsgbuf) YYSTACK_FREE (wafsamsg); wafsamsg = (char *) YYSTACK_ALLOC (wafsaalloc); if (wafsamsg) wafsamsg_alloc = wafsaalloc; else { wafsamsg = wafsamsgbuf; wafsamsg_alloc = sizeof wafsamsgbuf; } } if (0 < wafsasize && wafsasize <= wafsamsg_alloc) { (void) wafsasyntax_error (wafsamsg, wafsastate, wafsachar); wafsaerror (wafsamsg); } else { wafsaerror (YY_("syntax error")); if (wafsasize != 0) goto wafsaexhaustedlab; } } #endif } if (wafsaerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (wafsachar <= YYEOF) { /* Return failure if at end of input. */ if (wafsachar == YYEOF) YYABORT; } else { wafsadestruct ("Error: discarding", wafsatoken, &wafsalval); wafsachar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto wafsaerrlab1; /*---------------------------------------------------. | wafsaerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ wafsaerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label wafsaerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto wafsaerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (wafsalen); wafsalen = 0; YY_STACK_PRINT (wafsass, wafsassp); wafsastate = *wafsassp; goto wafsaerrlab1; /*-------------------------------------------------------------. | wafsaerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ wafsaerrlab1: wafsaerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { wafsan = wafsapact[wafsastate]; if (wafsan != YYPACT_NINF) { wafsan += YYTERROR; if (0 <= wafsan && wafsan <= YYLAST && wafsacheck[wafsan] == YYTERROR) { wafsan = wafsatable[wafsan]; if (0 < wafsan) break; } } /* Pop the current state because it cannot handle the error token. */ if (wafsassp == wafsass) YYABORT; wafsadestruct ("Error: popping", wafsastos[wafsastate], wafsavsp); YYPOPSTACK (1); wafsastate = *wafsassp; YY_STACK_PRINT (wafsass, wafsassp); } if (wafsan == YYFINAL) YYACCEPT; *++wafsavsp = wafsalval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", wafsastos[wafsan], wafsavsp, wafsalsp); wafsastate = wafsan; goto wafsanewstate; /*-------------------------------------. | wafsaacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ wafsaacceptlab: wafsaresult = 0; goto wafsareturn; /*-----------------------------------. | wafsaabortlab -- YYABORT comes here. | `-----------------------------------*/ wafsaabortlab: wafsaresult = 1; goto wafsareturn; #ifndef wafsaoverflow /*-------------------------------------------------. | wafsaexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ wafsaexhaustedlab: wafsaerror (YY_("memory exhausted")); wafsaresult = 2; /* Fall through. */ #endif wafsareturn: if (wafsachar != YYEOF && wafsachar != YYEMPTY) wafsadestruct ("Cleanup: discarding lookahead", wafsatoken, &wafsalval); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (wafsalen); YY_STACK_PRINT (wafsass, wafsassp); while (wafsassp != wafsass) { wafsadestruct ("Cleanup: popping", wafsastos[*wafsassp], wafsavsp); YYPOPSTACK (1); } #ifndef wafsaoverflow if (wafsass != wafsassa) YYSTACK_FREE (wafsass); #endif #if YYERROR_VERBOSE if (wafsamsg != wafsamsgbuf) YYSTACK_FREE (wafsamsg); #endif /* Make sure YYID is used. */ return YYID (wafsaresult); } #line 167 "../../../../../src/lib/oogl/wa/fsaparse.y" static void wafsaerror(char *s) { printf("wafsaerror: %s\n", s); } static void install_adjacency(n) int n; { int i; for (i=0; iaction[n][i+1] = adj[i]; } void parse_init(f) wa *f; { fsa = f; fsa->fail = fsa->state = 0; } /*----------------------------------------------------------------------- * Function: fsaparse * Description: parse a .wa file into an wa struct * Args IN: fp: .wa file pointer * OUT: *fsa: the resulting fsa struct * Returns: 1 for success, 0 for error * Author: mbp * Date: Sat Mar 23 21:47:04 1991 * Notes: Does not recognize the full grammar defined by * "Data Exchange for Automatic Groups". Only recognizes * files of the form used by several examples I was * using at the time I wrote this. I think, but am not * at all sure, that this includes all word-acceptor * automata. */ int fsaparse(fp, fsa) FILE *fp; wa *fsa; { extern FILE *wafsain; int ret; parse_init(fsa); wafsain = fp; ret = wafsaparse(); return(ret ==0); } geomview-1.9.4/src/lib/oogl/wa/wa.yacc.h0000644000175000001440000000556010665240612014676 00000000000000/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum wafsatokentype { FORMAT = 258, FSA = 259, STATES = 260, SYMBOLS = 261, BFS = 262, MIN = 263, VARIABLES = 264, ALPHABET = 265, START = 266, ATABLE = 267, INVERSES = 268, INV = 269, LEFT_BRACE = 270, RIGHT_BRACE = 271, LEFT_PAREN = 272, RIGHT_PAREN = 273, SEMICOLON = 274, PERCENT = 275, INT = 276, EQUAL = 277, STRING = 278, REAL = 279 }; #endif /* Tokens. */ #define FORMAT 258 #define FSA 259 #define STATES 260 #define SYMBOLS 261 #define BFS 262 #define MIN 263 #define VARIABLES 264 #define ALPHABET 265 #define START 266 #define ATABLE 267 #define INVERSES 268 #define INV 269 #define LEFT_BRACE 270 #define RIGHT_BRACE 271 #define LEFT_PAREN 272 #define RIGHT_PAREN 273 #define SEMICOLON 274 #define PERCENT 275 #define INT 276 #define EQUAL 277 #define STRING 278 #define REAL 279 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef int YYSTYPE; # define wafsastype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif extern YYSTYPE wafsalval; geomview-1.9.4/src/lib/oogl/wa/y.tab.c0000644000175000001440000013516610665240612014367 00000000000000/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Using locations. */ #define YYLSP_NEEDED 0 /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { FORMAT = 258, FSA = 259, STATES = 260, SYMBOLS = 261, BFS = 262, MIN = 263, VARIABLES = 264, ALPHABET = 265, START = 266, ATABLE = 267, INVERSES = 268, INV = 269, LEFT_BRACE = 270, RIGHT_BRACE = 271, LEFT_PAREN = 272, RIGHT_PAREN = 273, SEMICOLON = 274, PERCENT = 275, INT = 276, EQUAL = 277, STRING = 278, REAL = 279 }; #endif /* Tokens. */ #define FORMAT 258 #define FSA 259 #define STATES 260 #define SYMBOLS 261 #define BFS 262 #define MIN 263 #define VARIABLES 264 #define ALPHABET 265 #define START 266 #define ATABLE 267 #define INVERSES 268 #define INV 269 #define LEFT_BRACE 270 #define RIGHT_BRACE 271 #define LEFT_PAREN 272 #define RIGHT_PAREN 273 #define SEMICOLON 274 #define PERCENT 275 #define INT 276 #define EQUAL 277 #define STRING 278 #define REAL 279 /* Copy the first part of user declarations. */ #line 16 "../../../../../src/lib/oogl/wa/fsaparse.y" #include #include #include #include "wa.h" #include "wa.yystype.h" #include "wa.yacc.h" #define MAXSTATES 100 #define MAXGENS 128 #if 0 static char copyright[] = "Copyright (C) 1991 Mark B. Phillips, The Geometry Center"; #endif static int adj[MAXSTATES]; static int adj_index = 0; static void install_adjacency(); static void yyerror(char *s); extern int yylex(void); static wa *fsa; /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef int YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 181 "y.tab.c" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 4 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 44 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 25 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 18 /* YYNRULES -- Number of rules. */ #define YYNRULES 29 /* YYNRULES -- Number of states. */ #define YYNSTATES 56 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 279 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 7, 17, 20, 23, 25, 28, 30, 32, 35, 37, 40, 42, 44, 49, 51, 54, 58, 63, 69, 71, 74, 77, 79, 81, 84, 89, 91 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 26, 0, -1, 3, 24, 27, -1, 4, 15, 28, 29, 30, 32, 20, 39, 16, -1, 5, 21, -1, 6, 21, -1, 31, -1, 31, 30, -1, 7, -1, 8, -1, 9, 21, -1, 33, -1, 33, 32, -1, 34, -1, 37, -1, 10, 15, 35, 16, -1, 36, -1, 35, 36, -1, 21, 22, 23, -1, 11, 15, 21, 16, -1, 11, 15, 21, 38, 16, -1, 21, -1, 21, 38, -1, 12, 40, -1, 12, -1, 41, -1, 41, 40, -1, 21, 23, 42, 19, -1, 21, -1, 42, 21, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 54, 54, 57, 69, 77, 94, 95, 100, 101, 102, 106, 107, 110, 111, 117, 120, 121, 124, 132, 134, 139, 140, 144, 145, 148, 149, 152, 156, 160 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "FORMAT", "FSA", "STATES", "SYMBOLS", "BFS", "MIN", "VARIABLES", "ALPHABET", "START", "ATABLE", "INVERSES", "INV", "LEFT_BRACE", "RIGHT_BRACE", "LEFT_PAREN", "RIGHT_PAREN", "SEMICOLON", "PERCENT", "INT", "EQUAL", "STRING", "REAL", "$accept", "fsa_file", "fsa_format", "states", "symbols", "fsa_characteristics", "fsa_characteristic", "info_items", "info_item", "alphabet", "symbol_names", "symbol_name", "start_states", "int_list", "fsa_table", "acstates", "acstate", "adjacency", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 25, 26, 27, 28, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 34, 35, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 42, 42 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 3, 9, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 4, 1, 2, 3, 4, 5, 1, 2, 2, 1, 1, 2, 4, 1, 2 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 4, 0, 0, 5, 8, 9, 0, 0, 6, 10, 0, 0, 0, 11, 13, 14, 7, 0, 0, 0, 12, 0, 0, 16, 0, 24, 0, 0, 15, 17, 19, 21, 0, 0, 23, 25, 3, 18, 22, 20, 0, 26, 28, 0, 27, 29 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 2, 6, 9, 12, 17, 18, 22, 23, 24, 32, 33, 25, 42, 36, 44, 45, 53 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -17 static const yytype_int8 yypact[] = { 5, -11, 12, 10, -17, 1, -17, 13, -6, 11, -17, -2, -5, -17, -17, -17, -1, 0, -5, -17, 6, 7, 3, 0, -17, -17, -17, 4, 8, 14, -17, 2, -16, -17, -15, 9, 15, 16, -17, -17, -17, 17, 18, 19, -17, 9, -17, -17, -17, -17, 20, -17, -17, -12, -17, -17 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -17, -17, -17, -17, -17, 22, -17, 21, -17, -17, -17, -4, -17, -14, -17, -13, -17, -17 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { 38, 40, 14, 15, 16, 31, 41, 54, 1, 55, 20, 21, 4, 3, 5, 10, 7, 11, 8, 13, 19, 27, 28, 29, 37, 31, 35, 48, 39, 34, 43, 46, 51, 0, 49, 0, 0, 0, 41, 47, 26, 52, 50, 0, 30 }; static const yytype_int8 yycheck[] = { 16, 16, 7, 8, 9, 21, 21, 19, 3, 21, 10, 11, 0, 24, 4, 21, 15, 6, 5, 21, 21, 15, 15, 20, 22, 21, 12, 41, 32, 21, 21, 16, 45, -1, 16, -1, -1, -1, 21, 23, 18, 21, 23, -1, 23 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 3, 26, 24, 0, 4, 27, 15, 5, 28, 21, 6, 29, 21, 7, 8, 9, 30, 31, 21, 10, 11, 32, 33, 34, 37, 30, 15, 15, 20, 32, 21, 35, 36, 21, 12, 39, 22, 16, 36, 16, 21, 38, 21, 40, 41, 16, 23, 38, 16, 23, 40, 21, 42, 19, 21 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex () #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule) #else static void yy_reduce_print (yyvsp, yyrule) YYSTYPE *yyvsp; int yyrule; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) ); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) #else static void yydestruct (yymsg, yytype, yyvaluep) const char *yymsg; int yytype; YYSTYPE *yyvaluep; #endif { YYUSE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (void); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void) #else int yyparse () #endif #endif { int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 3: #line 66 "../../../../../src/lib/oogl/wa/fsaparse.y" { return(0); } break; case 4: #line 70 "../../../../../src/lib/oogl/wa/fsaparse.y" { fsa->nstates = (yyvsp[(2) - (2)].i); fsa->action = (int**)malloc((fsa->nstates+1)*sizeof(int*)); } break; case 5: #line 78 "../../../../../src/lib/oogl/wa/fsaparse.y" { int i,j; fsa->ngens = (yyvsp[(2) - (2)].i); for (i=0; i<=fsa->nstates; ++i) { fsa->action[i] = (int*)malloc((fsa->ngens+1)*sizeof(int)); for (j=0; j<=fsa->ngens; ++j) fsa->action[i][j] = 0; } fsa->genlist=(char**)malloc(fsa->ngens*sizeof(char*)); for (i=0; ingens; ++i) fsa->genlist[i] = ""; } break; case 14: #line 112 "../../../../../src/lib/oogl/wa/fsaparse.y" { fsa->start= (yyvsp[(1) - (1)].i); } break; case 18: #line 125 "../../../../../src/lib/oogl/wa/fsaparse.y" { fsa->genlist[(yyvsp[(1) - (3)].i)-1] = (char*)malloc((strlen((yyvsp[(3) - (3)].s))+1)*sizeof(char)); strcpy(fsa->genlist[(yyvsp[(1) - (3)].i)-1], (yyvsp[(3) - (3)].s)); } break; case 19: #line 133 "../../../../../src/lib/oogl/wa/fsaparse.y" { (yyval.i) = (yyvsp[(3) - (4)].i); } break; case 20: #line 135 "../../../../../src/lib/oogl/wa/fsaparse.y" { (yyval.i) = (yyvsp[(3) - (5)].i); } break; case 27: #line 153 "../../../../../src/lib/oogl/wa/fsaparse.y" { install_adjacency((yyvsp[(1) - (4)].i)); adj_index = 0; } break; case 28: #line 157 "../../../../../src/lib/oogl/wa/fsaparse.y" { adj[adj_index++] = (yyvsp[(1) - (1)].i); } break; case 29: #line 161 "../../../../../src/lib/oogl/wa/fsaparse.y" { adj[adj_index++] = (yyvsp[(2) - (2)].i); } break; /* Line 1267 of yacc.c. */ #line 1488 "y.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (yymsg); } else { yyerror (YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 167 "../../../../../src/lib/oogl/wa/fsaparse.y" static void yyerror(char *s) { printf("yyerror: %s\n", s); } static void install_adjacency(n) int n; { int i; for (i=0; iaction[n][i+1] = adj[i]; } void parse_init(f) wa *f; { fsa = f; fsa->fail = fsa->state = 0; } /*----------------------------------------------------------------------- * Function: fsaparse * Description: parse a .wa file into an wa struct * Args IN: fp: .wa file pointer * OUT: *fsa: the resulting fsa struct * Returns: 1 for success, 0 for error * Author: mbp * Date: Sat Mar 23 21:47:04 1991 * Notes: Does not recognize the full grammar defined by * "Data Exchange for Automatic Groups". Only recognizes * files of the form used by several examples I was * using at the time I wrote this. I think, but am not * at all sure, that this includes all word-acceptor * automata. */ int fsaparse(fp, fsa) FILE *fp; wa *fsa; { extern FILE *yyin; int ret; parse_init(fsa); yyin = fp; ret = yyparse(); return(ret ==0); } geomview-1.9.4/src/lib/oogl/wa/y.tab.h0000644000175000001440000000554710665240612014373 00000000000000/* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { FORMAT = 258, FSA = 259, STATES = 260, SYMBOLS = 261, BFS = 262, MIN = 263, VARIABLES = 264, ALPHABET = 265, START = 266, ATABLE = 267, INVERSES = 268, INV = 269, LEFT_BRACE = 270, RIGHT_BRACE = 271, LEFT_PAREN = 272, RIGHT_PAREN = 273, SEMICOLON = 274, PERCENT = 275, INT = 276, EQUAL = 277, STRING = 278, REAL = 279 }; #endif /* Tokens. */ #define FORMAT 258 #define FSA 259 #define STATES 260 #define SYMBOLS 261 #define BFS 262 #define MIN 263 #define VARIABLES 264 #define ALPHABET 265 #define START 266 #define ATABLE 267 #define INVERSES 268 #define INV 269 #define LEFT_BRACE 270 #define RIGHT_BRACE 271 #define LEFT_PAREN 272 #define RIGHT_PAREN 273 #define SEMICOLON 274 #define PERCENT 275 #define INT 276 #define EQUAL 277 #define STRING 278 #define REAL 279 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef int YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif extern YYSTYPE yylval; geomview-1.9.4/src/lib/oogl/wa/lex.yy.c0000644000175000001440000014060210665240612014571 00000000000000 #line 3 "lex.yy.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 33 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ #if __STDC__ #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart(yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef unsigned int yy_size_t; #endif #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart (FILE *input_file ); void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); void yy_delete_buffer (YY_BUFFER_STATE b ); void yy_flush_buffer (YY_BUFFER_STATE b ); void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); void yypop_buffer_state (void ); static void yyensure_buffer_stack (void ); static void yy_load_buffer_state (void ); static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; extern int yylineno; int yylineno = 1; extern char *yytext; #define yytext_ptr yytext static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 26 #define YY_END_OF_BUFFER 27 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[91] = { 0, 0, 0, 27, 25, 1, 20, 17, 18, 25, 1, 23, 22, 19, 21, 25, 25, 25, 25, 25, 25, 25, 25, 15, 16, 25, 1, 23, 22, 1, 23, 23, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 25, 25, 7, 25, 4, 14, 8, 25, 25, 25, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 11, 25, 25, 25, 2, 25, 12, 3, 25, 5, 25, 25, 25, 25, 6, 25, 10, 13, 25, 9, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 4, 5, 1, 6, 7, 6, 8, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 10, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 14, 1, 1, 15, 16, 1, 17, 18, 1, 1, 19, 20, 21, 22, 23, 1, 24, 25, 26, 1, 27, 1, 1, 28, 1, 29, 1, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[31] = { 0, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2 } ; static yyconst flex_int16_t yy_base[92] = { 0, 0, 0, 107, 0, 29, 108, 108, 108, 24, 32, 97, 29, 108, 108, 83, 16, 88, 18, 82, 84, 18, 88, 108, 108, 0, 43, 91, 39, 47, 0, 90, 74, 74, 83, 70, 70, 80, 65, 70, 77, 69, 64, 78, 66, 68, 70, 0, 63, 0, 67, 0, 27, 67, 62, 70, 65, 64, 57, 62, 50, 47, 57, 49, 57, 43, 54, 52, 40, 40, 0, 39, 44, 48, 0, 46, 0, 0, 45, 0, 34, 39, 31, 31, 0, 40, 0, 0, 27, 0, 108, 40 } ; static yyconst flex_int16_t yy_def[92] = { 0, 90, 1, 90, 91, 90, 90, 90, 90, 91, 91, 91, 91, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 90, 90, 91, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 90 } ; static yyconst flex_int16_t yy_nxt[139] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 4, 18, 4, 19, 4, 20, 4, 4, 4, 4, 21, 4, 22, 4, 23, 24, 26, 27, 28, 26, 33, 26, 31, 28, 29, 36, 25, 34, 37, 40, 26, 41, 31, 28, 26, 26, 61, 89, 62, 29, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 55, 64, 63, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 30, 42, 39, 38, 35, 32, 30, 90, 3, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90 } ; static yyconst flex_int16_t yy_chk[139] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 9, 9, 10, 16, 5, 12, 12, 10, 18, 91, 16, 18, 21, 26, 21, 28, 28, 29, 26, 52, 88, 52, 29, 85, 83, 82, 81, 80, 78, 75, 73, 72, 71, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 50, 48, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 27, 22, 20, 19, 17, 15, 11, 3, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "../../../../../src/lib/oogl/wa/fsaparse.l" #line 2 "../../../../../src/lib/oogl/wa/fsaparse.l" /* * fsaparse.l (lex.yy.c) * * Lex definitions for lexical scanner for parsing word-acceptor * automata. See fsaparse.y for more info. * * mbp Sat Mar 23 21:58:12 1991 * mbp@thales.urich.edu */ #include #include /* for atof() */ #include #include #include "wa.yystype.h" #include "wa.yacc.h" YYSTYPE yylval; /* disable output of unmatched input */ #undef output #define output(c) #line 536 "lex.yy.c" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap (void ); #else extern int yywrap (void ); #endif #endif static void yyunput (int c,char *buf_ptr ); #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 33 "../../../../../src/lib/oogl/wa/fsaparse.l" #line 692 "lex.yy.c" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 91 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 108 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 35 "../../../../../src/lib/oogl/wa/fsaparse.l" ; YY_BREAK case 2: YY_RULE_SETUP #line 37 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(FORMAT); } YY_BREAK case 3: YY_RULE_SETUP #line 38 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(FORMAT); } YY_BREAK case 4: YY_RULE_SETUP #line 39 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(FSA); } YY_BREAK case 5: YY_RULE_SETUP #line 40 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(STATES); } YY_BREAK case 6: YY_RULE_SETUP #line 41 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(SYMBOLS); } YY_BREAK case 7: YY_RULE_SETUP #line 42 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(BFS); } YY_BREAK case 8: YY_RULE_SETUP #line 43 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(MIN); } YY_BREAK case 9: YY_RULE_SETUP #line 44 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(VARIABLES); } YY_BREAK case 10: YY_RULE_SETUP #line 45 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(ALPHABET); } YY_BREAK case 11: YY_RULE_SETUP #line 46 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(START); } YY_BREAK case 12: YY_RULE_SETUP #line 47 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(ATABLE); } YY_BREAK case 13: YY_RULE_SETUP #line 48 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(INVERSES); } YY_BREAK case 14: YY_RULE_SETUP #line 49 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(INV); } YY_BREAK case 15: YY_RULE_SETUP #line 51 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(LEFT_BRACE); } YY_BREAK case 16: YY_RULE_SETUP #line 52 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(RIGHT_BRACE); } YY_BREAK case 17: YY_RULE_SETUP #line 53 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(LEFT_PAREN); } YY_BREAK case 18: YY_RULE_SETUP #line 54 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(RIGHT_PAREN); } YY_BREAK case 19: YY_RULE_SETUP #line 55 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(SEMICOLON); } YY_BREAK case 20: YY_RULE_SETUP #line 56 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(PERCENT); } YY_BREAK case 21: YY_RULE_SETUP #line 57 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(EQUAL); } YY_BREAK case 22: YY_RULE_SETUP #line 59 "../../../../../src/lib/oogl/wa/fsaparse.l" { yylval.i = atoi(yytext); return(INT); } YY_BREAK case 23: YY_RULE_SETUP #line 60 "../../../../../src/lib/oogl/wa/fsaparse.l" { yylval.d = atof(yytext); return(REAL); } YY_BREAK case 24: YY_RULE_SETUP #line 61 "../../../../../src/lib/oogl/wa/fsaparse.l" { yylval.d = atof(yytext); return(REAL); } YY_BREAK case 25: YY_RULE_SETUP #line 63 "../../../../../src/lib/oogl/wa/fsaparse.l" { strcpy(yylval.s, yytext); return(STRING); } YY_BREAK case 26: YY_RULE_SETUP #line 65 "../../../../../src/lib/oogl/wa/fsaparse.l" ECHO; YY_BREAK #line 906 "lex.yy.c" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart(yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 91 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 91 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 90); return yy_is_jam ? 0 : yy_current_state; } static void yyunput (int c, register char * yy_bp ) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register int number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ int offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart(yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return EOF; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_init_buffer(YY_CURRENT_BUFFER,input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } #ifndef _UNISTD_H /* assume unistd.h has isatty() for us */ #ifdef __cplusplus extern "C" { #endif #ifdef __THROW /* this is a gnuism */ extern int isatty (int ) __THROW; #else extern int isatty (int ); #endif #ifdef __cplusplus } #endif #endif /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { int num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param str a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) { return yy_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param bytes the byte buffer to scan * @param len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ int yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param line_number * */ void yyset_lineno (int line_number ) { yylineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * in_str ) { yyin = in_str ; } void yyset_out (FILE * out_str ) { yyout = out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int bdebug ) { yy_flex_debug = bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = (FILE *) 0; yyout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 65 "../../../../../src/lib/oogl/wa/fsaparse.l" int yywrap() { return(1); } geomview-1.9.4/src/lib/oogl/wa/Makefile.am0000644000175000001440000000170010600605555015224 00000000000000INCLUDES = $(default_includes) man_MANS = fsaparse.3gv EXTRA_DIST = Headers fsaparse.y fsaparse.l $(BUILT_SOURCES) $(man_MANS) noinst_LTLIBRARIES = libwa.la BUILT_SOURCES = wa.lex.c wa.yacc.c wa.yacc.h y.tab.h y.tab.c lex.yy.c libwa_la_SOURCES = \ wa.lex.c wa.yacc.c wa.yacc.h \ wa.h wa.yystype.h y.tab.c y.tab.h: $(srcdir)/fsaparse.y $(srcdir)/Makefile.in $(YACC) -d $(srcdir)/fsaparse.y wa.yacc.c: y.tab.c $(srcdir)/Makefile.in sed -e '/^\#include/!s/yy/wafsa/g' -e '/#ident/d' $< >$@ wa.yacc.h: y.tab.h $(srcdir)/Makefile.in sed -e '/^\#include/!s/yy/wafsa/g' -e '/#ident/d' $< >$@ lex.yy.c: wa.yacc.h $(srcdir)/fsaparse.l $(srcdir)/Makefile.in rm -f $@ $(LEX) $(srcdir)/fsaparse.l wa.lex.c: lex.yy.c $(srcdir)/Makefile.in sed -e '/^\#include/!s/yy/wafsa/g' \ -e 's/YYSTYPE wafsalval/extern &/' \ -e '/#ident/d' \ -e 's/lex.wafsa.c/wa.lex.c/g' \ -e 's/y.tab.h/wa.yacc.h/g' lex.yy.c >$@ MAINTAINERCLEANFILES = $(BUILT_SOURCES) geomview-1.9.4/src/lib/oogl/wa/Makefile.in0000644000175000001440000004277510665240506015260 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/oogl/wa DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libwa_la_LIBADD = am_libwa_la_OBJECTS = wa.lex.lo wa.yacc.lo libwa_la_OBJECTS = $(am_libwa_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libwa_la_SOURCES) DIST_SOURCES = $(libwa_la_SOURCES) man3dir = $(mandir)/man3 am__installdirs = "$(DESTDIR)$(man3dir)" NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) man_MANS = fsaparse.3gv EXTRA_DIST = Headers fsaparse.y fsaparse.l $(BUILT_SOURCES) $(man_MANS) noinst_LTLIBRARIES = libwa.la BUILT_SOURCES = wa.lex.c wa.yacc.c wa.yacc.h y.tab.h y.tab.c lex.yy.c libwa_la_SOURCES = \ wa.lex.c wa.yacc.c wa.yacc.h \ wa.h wa.yystype.h MAINTAINERCLEANFILES = $(BUILT_SOURCES) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/oogl/wa/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/oogl/wa/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libwa.la: $(libwa_la_OBJECTS) $(libwa_la_DEPENDENCIES) $(LINK) $(libwa_la_OBJECTS) $(libwa_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wa.lex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wa.yacc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man3: $(man3_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.3*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 3*) ;; \ *) ext='3' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \ done uninstall-man3: @$(NORMAL_UNINSTALL) @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.3*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 3*) ;; \ *) ext='3' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man3dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(MANS) installdirs: for dir in "$(DESTDIR)$(man3dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-man3 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man3 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man3 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-man uninstall-man3 y.tab.c y.tab.h: $(srcdir)/fsaparse.y $(srcdir)/Makefile.in $(YACC) -d $(srcdir)/fsaparse.y wa.yacc.c: y.tab.c $(srcdir)/Makefile.in sed -e '/^\#include/!s/yy/wafsa/g' -e '/#ident/d' $< >$@ wa.yacc.h: y.tab.h $(srcdir)/Makefile.in sed -e '/^\#include/!s/yy/wafsa/g' -e '/#ident/d' $< >$@ lex.yy.c: wa.yacc.h $(srcdir)/fsaparse.l $(srcdir)/Makefile.in rm -f $@ $(LEX) $(srcdir)/fsaparse.l wa.lex.c: lex.yy.c $(srcdir)/Makefile.in sed -e '/^\#include/!s/yy/wafsa/g' \ -e 's/YYSTYPE wafsalval/extern &/' \ -e '/#ident/d' \ -e 's/lex.wafsa.c/wa.lex.c/g' \ -e 's/y.tab.h/wa.yacc.h/g' lex.yy.c >$@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/oogl/wa/wa.lex.c0000644000175000001440000014510110665240612014536 00000000000000 #line 3 "wa.lex.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 33 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ #if __STDC__ #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define wafsaconst const #else #define wafsaconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (wafsa_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((wafsa_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE wafsarestart(wafsain ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(wafsa_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct wafsa_buffer_state *YY_BUFFER_STATE; #endif extern int wafsaleng; extern FILE *wafsain, *wafsaout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define wafsaless(n) \ do \ { \ /* Undo effects of setting up wafsatext. */ \ int wafsaless_macro_arg = (n); \ YY_LESS_LINENO(wafsaless_macro_arg);\ *wafsa_cp = (wafsa_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (wafsa_c_buf_p) = wafsa_cp = wafsa_bp + wafsaless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up wafsatext again */ \ } \ while ( 0 ) #define unput(c) wafsaunput( c, (wafsatext_ptr) ) /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef unsigned int wafsa_size_t; #endif #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct wafsa_buffer_state { FILE *wafsa_input_file; char *wafsa_ch_buf; /* input buffer */ char *wafsa_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ wafsa_size_t wafsa_buf_size; /* Number of characters read into wafsa_ch_buf, not including EOB * characters. */ int wafsa_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int wafsa_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int wafsa_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int wafsa_at_bol; int wafsa_bs_lineno; /**< The line count. */ int wafsa_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int wafsa_fill_buffer; int wafsa_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via wafsarestart()), so that the user can continue scanning by * just pointing wafsain at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t wafsa_buffer_stack_top = 0; /**< index of top of stack. */ static size_t wafsa_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * wafsa_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (wafsa_buffer_stack) \ ? (wafsa_buffer_stack)[(wafsa_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (wafsa_buffer_stack)[(wafsa_buffer_stack_top)] /* wafsa_hold_char holds the character lost when wafsatext is formed. */ static char wafsa_hold_char; static int wafsa_n_chars; /* number of characters read into wafsa_ch_buf */ int wafsaleng; /* Points to current character in buffer. */ static char *wafsa_c_buf_p = (char *) 0; static int wafsa_init = 0; /* whether we need to initialize */ static int wafsa_start = 0; /* start state number */ /* Flag which is used to allow wafsawrap()'s to do buffer switches * instead of setting up a fresh wafsain. A bit of a hack ... */ static int wafsa_did_buffer_switch_on_eof; void wafsarestart (FILE *input_file ); void wafsa_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE wafsa_create_buffer (FILE *file,int size ); void wafsa_delete_buffer (YY_BUFFER_STATE b ); void wafsa_flush_buffer (YY_BUFFER_STATE b ); void wafsapush_buffer_state (YY_BUFFER_STATE new_buffer ); void wafsapop_buffer_state (void ); static void wafsaensure_buffer_stack (void ); static void wafsa_load_buffer_state (void ); static void wafsa_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER wafsa_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE wafsa_scan_buffer (char *base,wafsa_size_t size ); YY_BUFFER_STATE wafsa_scan_string (wafsaconst char *wafsa_str ); YY_BUFFER_STATE wafsa_scan_bytes (wafsaconst char *bytes,int len ); void *wafsaalloc (wafsa_size_t ); void *wafsarealloc (void *,wafsa_size_t ); void wafsafree (void * ); #define wafsa_new_buffer wafsa_create_buffer #define wafsa_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ wafsaensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ wafsa_create_buffer(wafsain,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->wafsa_is_interactive = is_interactive; \ } #define wafsa_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ wafsaensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ wafsa_create_buffer(wafsain,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->wafsa_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->wafsa_at_bol) /* Begin user sect3 */ typedef unsigned char YY_CHAR; FILE *wafsain = (FILE *) 0, *wafsaout = (FILE *) 0; typedef int wafsa_state_type; extern int wafsalineno; int wafsalineno = 1; extern char *wafsatext; #define wafsatext_ptr wafsatext static wafsa_state_type wafsa_get_previous_state (void ); static wafsa_state_type wafsa_try_NUL_trans (wafsa_state_type current_state ); static int wafsa_get_next_buffer (void ); static void wafsa_fatal_error (wafsaconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up wafsatext. */ #define YY_DO_BEFORE_ACTION \ (wafsatext_ptr) = wafsa_bp; \ wafsaleng = (size_t) (wafsa_cp - wafsa_bp); \ (wafsa_hold_char) = *wafsa_cp; \ *wafsa_cp = '\0'; \ (wafsa_c_buf_p) = wafsa_cp; #define YY_NUM_RULES 26 #define YY_END_OF_BUFFER 27 /* This struct is not used in this scanner, but its presence is necessary. */ struct wafsa_trans_info { flex_int32_t wafsa_verify; flex_int32_t wafsa_nxt; }; static wafsaconst flex_int16_t wafsa_accept[91] = { 0, 0, 0, 27, 25, 1, 20, 17, 18, 25, 1, 23, 22, 19, 21, 25, 25, 25, 25, 25, 25, 25, 25, 15, 16, 25, 1, 23, 22, 1, 23, 23, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 25, 25, 7, 25, 4, 14, 8, 25, 25, 25, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 11, 25, 25, 25, 2, 25, 12, 3, 25, 5, 25, 25, 25, 25, 6, 25, 10, 13, 25, 9, 0 } ; static wafsaconst flex_int32_t wafsa_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 4, 5, 1, 6, 7, 6, 8, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 10, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 14, 1, 1, 15, 16, 1, 17, 18, 1, 1, 19, 20, 21, 22, 23, 1, 24, 25, 26, 1, 27, 1, 1, 28, 1, 29, 1, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static wafsaconst flex_int32_t wafsa_meta[31] = { 0, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2 } ; static wafsaconst flex_int16_t wafsa_base[92] = { 0, 0, 0, 107, 0, 29, 108, 108, 108, 24, 32, 97, 29, 108, 108, 83, 16, 88, 18, 82, 84, 18, 88, 108, 108, 0, 43, 91, 39, 47, 0, 90, 74, 74, 83, 70, 70, 80, 65, 70, 77, 69, 64, 78, 66, 68, 70, 0, 63, 0, 67, 0, 27, 67, 62, 70, 65, 64, 57, 62, 50, 47, 57, 49, 57, 43, 54, 52, 40, 40, 0, 39, 44, 48, 0, 46, 0, 0, 45, 0, 34, 39, 31, 31, 0, 40, 0, 0, 27, 0, 108, 40 } ; static wafsaconst flex_int16_t wafsa_def[92] = { 0, 90, 1, 90, 91, 90, 90, 90, 90, 91, 91, 91, 91, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 90, 90, 91, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 90 } ; static wafsaconst flex_int16_t wafsa_nxt[139] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 4, 18, 4, 19, 4, 20, 4, 4, 4, 4, 21, 4, 22, 4, 23, 24, 26, 27, 28, 26, 33, 26, 31, 28, 29, 36, 25, 34, 37, 40, 26, 41, 31, 28, 26, 26, 61, 89, 62, 29, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 55, 64, 63, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 30, 42, 39, 38, 35, 32, 30, 90, 3, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90 } ; static wafsaconst flex_int16_t wafsa_chk[139] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 9, 9, 10, 16, 5, 12, 12, 10, 18, 91, 16, 18, 21, 26, 21, 28, 28, 29, 26, 52, 88, 52, 29, 85, 83, 82, 81, 80, 78, 75, 73, 72, 71, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 50, 48, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 27, 22, 20, 19, 17, 15, 11, 3, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90 } ; static wafsa_state_type wafsa_last_accepting_state; static char *wafsa_last_accepting_cpos; extern int wafsa_flex_debug; int wafsa_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define wafsamore() wafsamore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *wafsatext; #line 1 "../../../../../src/lib/oogl/wa/fsaparse.l" #line 2 "../../../../../src/lib/oogl/wa/fsaparse.l" /* * fsaparse.l (wa.lex.c) * * Lex definitions for lexical scanner for parsing word-acceptor * automata. See fsaparse.y for more info. * * mbp Sat Mar 23 21:58:12 1991 * mbp@thales.urich.edu */ #include #include /* for atof() */ #include #include #include "wa.yystype.h" #include "wa.yacc.h" extern YYSTYPE wafsalval; /* disable output of unmatched input */ #undef output #define output(c) #line 536 "wa.lex.c" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int wafsa_init_globals (void ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int wafsawrap (void ); #else extern int wafsawrap (void ); #endif #endif static void wafsaunput (int c,char *buf_ptr ); #ifndef wafsatext_ptr static void wafsa_flex_strncpy (char *,wafsaconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int wafsa_flex_strlen (wafsaconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int wafsainput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO (void) fwrite( wafsatext, wafsaleng, 1, wafsaout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->wafsa_is_interactive ) \ { \ int c = '*'; \ size_t n; \ for ( n = 0; n < max_size && \ (c = getc( wafsain )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( wafsain ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, wafsain))==0 && ferror(wafsain)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(wafsain); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "wafsaterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef wafsaterminate #define wafsaterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) wafsa_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int wafsalex (void); #define YY_DECL int wafsalex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after wafsatext and wafsaleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register wafsa_state_type wafsa_current_state; register char *wafsa_cp, *wafsa_bp; register int wafsa_act; #line 33 "../../../../../src/lib/oogl/wa/fsaparse.l" #line 692 "wa.lex.c" if ( !(wafsa_init) ) { (wafsa_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (wafsa_start) ) (wafsa_start) = 1; /* first start state */ if ( ! wafsain ) wafsain = stdin; if ( ! wafsaout ) wafsaout = stdout; if ( ! YY_CURRENT_BUFFER ) { wafsaensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = wafsa_create_buffer(wafsain,YY_BUF_SIZE ); } wafsa_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { wafsa_cp = (wafsa_c_buf_p); /* Support of wafsatext. */ *wafsa_cp = (wafsa_hold_char); /* wafsa_bp points to the position in wafsa_ch_buf of the start of * the current run. */ wafsa_bp = wafsa_cp; wafsa_current_state = (wafsa_start); wafsa_match: do { register YY_CHAR wafsa_c = wafsa_ec[YY_SC_TO_UI(*wafsa_cp)]; if ( wafsa_accept[wafsa_current_state] ) { (wafsa_last_accepting_state) = wafsa_current_state; (wafsa_last_accepting_cpos) = wafsa_cp; } while ( wafsa_chk[wafsa_base[wafsa_current_state] + wafsa_c] != wafsa_current_state ) { wafsa_current_state = (int) wafsa_def[wafsa_current_state]; if ( wafsa_current_state >= 91 ) wafsa_c = wafsa_meta[(unsigned int) wafsa_c]; } wafsa_current_state = wafsa_nxt[wafsa_base[wafsa_current_state] + (unsigned int) wafsa_c]; ++wafsa_cp; } while ( wafsa_base[wafsa_current_state] != 108 ); wafsa_find_action: wafsa_act = wafsa_accept[wafsa_current_state]; if ( wafsa_act == 0 ) { /* have to back up */ wafsa_cp = (wafsa_last_accepting_cpos); wafsa_current_state = (wafsa_last_accepting_state); wafsa_act = wafsa_accept[wafsa_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( wafsa_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *wafsa_cp = (wafsa_hold_char); wafsa_cp = (wafsa_last_accepting_cpos); wafsa_current_state = (wafsa_last_accepting_state); goto wafsa_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 35 "../../../../../src/lib/oogl/wa/fsaparse.l" ; YY_BREAK case 2: YY_RULE_SETUP #line 37 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(FORMAT); } YY_BREAK case 3: YY_RULE_SETUP #line 38 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(FORMAT); } YY_BREAK case 4: YY_RULE_SETUP #line 39 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(FSA); } YY_BREAK case 5: YY_RULE_SETUP #line 40 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(STATES); } YY_BREAK case 6: YY_RULE_SETUP #line 41 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(SYMBOLS); } YY_BREAK case 7: YY_RULE_SETUP #line 42 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(BFS); } YY_BREAK case 8: YY_RULE_SETUP #line 43 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(MIN); } YY_BREAK case 9: YY_RULE_SETUP #line 44 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(VARIABLES); } YY_BREAK case 10: YY_RULE_SETUP #line 45 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(ALPHABET); } YY_BREAK case 11: YY_RULE_SETUP #line 46 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(START); } YY_BREAK case 12: YY_RULE_SETUP #line 47 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(ATABLE); } YY_BREAK case 13: YY_RULE_SETUP #line 48 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(INVERSES); } YY_BREAK case 14: YY_RULE_SETUP #line 49 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(INV); } YY_BREAK case 15: YY_RULE_SETUP #line 51 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(LEFT_BRACE); } YY_BREAK case 16: YY_RULE_SETUP #line 52 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(RIGHT_BRACE); } YY_BREAK case 17: YY_RULE_SETUP #line 53 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(LEFT_PAREN); } YY_BREAK case 18: YY_RULE_SETUP #line 54 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(RIGHT_PAREN); } YY_BREAK case 19: YY_RULE_SETUP #line 55 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(SEMICOLON); } YY_BREAK case 20: YY_RULE_SETUP #line 56 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(PERCENT); } YY_BREAK case 21: YY_RULE_SETUP #line 57 "../../../../../src/lib/oogl/wa/fsaparse.l" { return(EQUAL); } YY_BREAK case 22: YY_RULE_SETUP #line 59 "../../../../../src/lib/oogl/wa/fsaparse.l" { wafsalval.i = atoi(wafsatext); return(INT); } YY_BREAK case 23: YY_RULE_SETUP #line 60 "../../../../../src/lib/oogl/wa/fsaparse.l" { wafsalval.d = atof(wafsatext); return(REAL); } YY_BREAK case 24: YY_RULE_SETUP #line 61 "../../../../../src/lib/oogl/wa/fsaparse.l" { wafsalval.d = atof(wafsatext); return(REAL); } YY_BREAK case 25: YY_RULE_SETUP #line 63 "../../../../../src/lib/oogl/wa/fsaparse.l" { strcpy(wafsalval.s, wafsatext); return(STRING); } YY_BREAK case 26: YY_RULE_SETUP #line 65 "../../../../../src/lib/oogl/wa/fsaparse.l" ECHO; YY_BREAK #line 906 "wa.lex.c" case YY_STATE_EOF(INITIAL): wafsaterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int wafsa_amount_of_matched_text = (int) (wafsa_cp - (wafsatext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *wafsa_cp = (wafsa_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->wafsa_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed wafsain at a new source and called * wafsalex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (wafsa_n_chars) = YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars; YY_CURRENT_BUFFER_LVALUE->wafsa_input_file = wafsain; YY_CURRENT_BUFFER_LVALUE->wafsa_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for wafsa_c_buf_p "<=" to the position * of the first EOB in the buffer, since wafsa_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (wafsa_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[(wafsa_n_chars)] ) { /* This was really a NUL. */ wafsa_state_type wafsa_next_state; (wafsa_c_buf_p) = (wafsatext_ptr) + wafsa_amount_of_matched_text; wafsa_current_state = wafsa_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * wafsa_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ wafsa_next_state = wafsa_try_NUL_trans( wafsa_current_state ); wafsa_bp = (wafsatext_ptr) + YY_MORE_ADJ; if ( wafsa_next_state ) { /* Consume the NUL. */ wafsa_cp = ++(wafsa_c_buf_p); wafsa_current_state = wafsa_next_state; goto wafsa_match; } else { wafsa_cp = (wafsa_c_buf_p); goto wafsa_find_action; } } else switch ( wafsa_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (wafsa_did_buffer_switch_on_eof) = 0; if ( wafsawrap( ) ) { /* Note: because we've taken care in * wafsa_get_next_buffer() to have set up * wafsatext, we can now set up * wafsa_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (wafsa_c_buf_p) = (wafsatext_ptr) + YY_MORE_ADJ; wafsa_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (wafsa_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (wafsa_c_buf_p) = (wafsatext_ptr) + wafsa_amount_of_matched_text; wafsa_current_state = wafsa_get_previous_state( ); wafsa_cp = (wafsa_c_buf_p); wafsa_bp = (wafsatext_ptr) + YY_MORE_ADJ; goto wafsa_match; case EOB_ACT_LAST_MATCH: (wafsa_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[(wafsa_n_chars)]; wafsa_current_state = wafsa_get_previous_state( ); wafsa_cp = (wafsa_c_buf_p); wafsa_bp = (wafsatext_ptr) + YY_MORE_ADJ; goto wafsa_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of wafsalex */ /* wafsa_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int wafsa_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf; register char *source = (wafsatext_ptr); register int number_to_move, i; int ret_val; if ( (wafsa_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[(wafsa_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->wafsa_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (wafsa_c_buf_p) - (wafsatext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((wafsa_c_buf_p) - (wafsatext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->wafsa_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars = (wafsa_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->wafsa_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int wafsa_c_buf_p_offset = (int) ((wafsa_c_buf_p) - b->wafsa_ch_buf); if ( b->wafsa_is_our_buffer ) { int new_size = b->wafsa_buf_size * 2; if ( new_size <= 0 ) b->wafsa_buf_size += b->wafsa_buf_size / 8; else b->wafsa_buf_size *= 2; b->wafsa_ch_buf = (char *) /* Include room in for 2 EOB chars. */ wafsarealloc((void *) b->wafsa_ch_buf,b->wafsa_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->wafsa_ch_buf = 0; if ( ! b->wafsa_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (wafsa_c_buf_p) = &b->wafsa_ch_buf[wafsa_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->wafsa_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[number_to_move]), (wafsa_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars = (wafsa_n_chars); } if ( (wafsa_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; wafsarestart(wafsain ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->wafsa_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; (wafsa_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[(wafsa_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[(wafsa_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (wafsatext_ptr) = &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[0]; return ret_val; } /* wafsa_get_previous_state - get the state just before the EOB char was reached */ static wafsa_state_type wafsa_get_previous_state (void) { register wafsa_state_type wafsa_current_state; register char *wafsa_cp; wafsa_current_state = (wafsa_start); for ( wafsa_cp = (wafsatext_ptr) + YY_MORE_ADJ; wafsa_cp < (wafsa_c_buf_p); ++wafsa_cp ) { register YY_CHAR wafsa_c = (*wafsa_cp ? wafsa_ec[YY_SC_TO_UI(*wafsa_cp)] : 1); if ( wafsa_accept[wafsa_current_state] ) { (wafsa_last_accepting_state) = wafsa_current_state; (wafsa_last_accepting_cpos) = wafsa_cp; } while ( wafsa_chk[wafsa_base[wafsa_current_state] + wafsa_c] != wafsa_current_state ) { wafsa_current_state = (int) wafsa_def[wafsa_current_state]; if ( wafsa_current_state >= 91 ) wafsa_c = wafsa_meta[(unsigned int) wafsa_c]; } wafsa_current_state = wafsa_nxt[wafsa_base[wafsa_current_state] + (unsigned int) wafsa_c]; } return wafsa_current_state; } /* wafsa_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = wafsa_try_NUL_trans( current_state ); */ static wafsa_state_type wafsa_try_NUL_trans (wafsa_state_type wafsa_current_state ) { register int wafsa_is_jam; register char *wafsa_cp = (wafsa_c_buf_p); register YY_CHAR wafsa_c = 1; if ( wafsa_accept[wafsa_current_state] ) { (wafsa_last_accepting_state) = wafsa_current_state; (wafsa_last_accepting_cpos) = wafsa_cp; } while ( wafsa_chk[wafsa_base[wafsa_current_state] + wafsa_c] != wafsa_current_state ) { wafsa_current_state = (int) wafsa_def[wafsa_current_state]; if ( wafsa_current_state >= 91 ) wafsa_c = wafsa_meta[(unsigned int) wafsa_c]; } wafsa_current_state = wafsa_nxt[wafsa_base[wafsa_current_state] + (unsigned int) wafsa_c]; wafsa_is_jam = (wafsa_current_state == 90); return wafsa_is_jam ? 0 : wafsa_current_state; } static void wafsaunput (int c, register char * wafsa_bp ) { register char *wafsa_cp; wafsa_cp = (wafsa_c_buf_p); /* undo effects of setting up wafsatext */ *wafsa_cp = (wafsa_hold_char); if ( wafsa_cp < YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register int number_to_move = (wafsa_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[ YY_CURRENT_BUFFER_LVALUE->wafsa_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf ) *--dest = *--source; wafsa_cp += (int) (dest - source); wafsa_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars = (wafsa_n_chars) = YY_CURRENT_BUFFER_LVALUE->wafsa_buf_size; if ( wafsa_cp < YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--wafsa_cp = (char) c; (wafsatext_ptr) = wafsa_bp; (wafsa_hold_char) = *wafsa_cp; (wafsa_c_buf_p) = wafsa_cp; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int wafsainput (void) #else static int input (void) #endif { int c; *(wafsa_c_buf_p) = (wafsa_hold_char); if ( *(wafsa_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* wafsa_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (wafsa_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->wafsa_ch_buf[(wafsa_n_chars)] ) /* This was really a NUL. */ *(wafsa_c_buf_p) = '\0'; else { /* need more input */ int offset = (wafsa_c_buf_p) - (wafsatext_ptr); ++(wafsa_c_buf_p); switch ( wafsa_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because wafsa_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ wafsarestart(wafsain ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( wafsawrap( ) ) return EOF; if ( ! (wafsa_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return wafsainput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (wafsa_c_buf_p) = (wafsatext_ptr) + offset; break; } } } c = *(unsigned char *) (wafsa_c_buf_p); /* cast for 8-bit char's */ *(wafsa_c_buf_p) = '\0'; /* preserve wafsatext */ (wafsa_hold_char) = *++(wafsa_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void wafsarestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ wafsaensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = wafsa_create_buffer(wafsain,YY_BUF_SIZE ); } wafsa_init_buffer(YY_CURRENT_BUFFER,input_file ); wafsa_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void wafsa_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * wafsapop_buffer_state(); * wafsapush_buffer_state(new_buffer); */ wafsaensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(wafsa_c_buf_p) = (wafsa_hold_char); YY_CURRENT_BUFFER_LVALUE->wafsa_buf_pos = (wafsa_c_buf_p); YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars = (wafsa_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; wafsa_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (wafsawrap()) processing, but the only time this flag * is looked at is after wafsawrap() is called, so it's safe * to go ahead and always set it. */ (wafsa_did_buffer_switch_on_eof) = 1; } static void wafsa_load_buffer_state (void) { (wafsa_n_chars) = YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars; (wafsatext_ptr) = (wafsa_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->wafsa_buf_pos; wafsain = YY_CURRENT_BUFFER_LVALUE->wafsa_input_file; (wafsa_hold_char) = *(wafsa_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE wafsa_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) wafsaalloc(sizeof( struct wafsa_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in wafsa_create_buffer()" ); b->wafsa_buf_size = size; /* wafsa_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->wafsa_ch_buf = (char *) wafsaalloc(b->wafsa_buf_size + 2 ); if ( ! b->wafsa_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in wafsa_create_buffer()" ); b->wafsa_is_our_buffer = 1; wafsa_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with wafsa_create_buffer() * */ void wafsa_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->wafsa_is_our_buffer ) wafsafree((void *) b->wafsa_ch_buf ); wafsafree((void *) b ); } #ifndef _UNISTD_H /* assume unistd.h has isatty() for us */ #ifdef __cplusplus extern "C" { #endif #ifdef __THROW /* this is a gnuism */ extern int isatty (int ) __THROW; #else extern int isatty (int ); #endif #ifdef __cplusplus } #endif #endif /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a wafsarestart() or at EOF. */ static void wafsa_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; wafsa_flush_buffer(b ); b->wafsa_input_file = file; b->wafsa_fill_buffer = 1; /* If b is the current buffer, then wafsa_init_buffer was _probably_ * called from wafsarestart() or through wafsa_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->wafsa_bs_lineno = 1; b->wafsa_bs_column = 0; } b->wafsa_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void wafsa_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->wafsa_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->wafsa_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->wafsa_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->wafsa_buf_pos = &b->wafsa_ch_buf[0]; b->wafsa_at_bol = 1; b->wafsa_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) wafsa_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void wafsapush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; wafsaensure_buffer_stack(); /* This block is copied from wafsa_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(wafsa_c_buf_p) = (wafsa_hold_char); YY_CURRENT_BUFFER_LVALUE->wafsa_buf_pos = (wafsa_c_buf_p); YY_CURRENT_BUFFER_LVALUE->wafsa_n_chars = (wafsa_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (wafsa_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from wafsa_switch_to_buffer. */ wafsa_load_buffer_state( ); (wafsa_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void wafsapop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; wafsa_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((wafsa_buffer_stack_top) > 0) --(wafsa_buffer_stack_top); if (YY_CURRENT_BUFFER) { wafsa_load_buffer_state( ); (wafsa_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void wafsaensure_buffer_stack (void) { int num_to_alloc; if (!(wafsa_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (wafsa_buffer_stack) = (struct wafsa_buffer_state**)wafsaalloc (num_to_alloc * sizeof(struct wafsa_buffer_state*) ); memset((wafsa_buffer_stack), 0, num_to_alloc * sizeof(struct wafsa_buffer_state*)); (wafsa_buffer_stack_max) = num_to_alloc; (wafsa_buffer_stack_top) = 0; return; } if ((wafsa_buffer_stack_top) >= ((wafsa_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (wafsa_buffer_stack_max) + grow_size; (wafsa_buffer_stack) = (struct wafsa_buffer_state**)wafsarealloc ((wafsa_buffer_stack), num_to_alloc * sizeof(struct wafsa_buffer_state*) ); /* zero only the new slots.*/ memset((wafsa_buffer_stack) + (wafsa_buffer_stack_max), 0, grow_size * sizeof(struct wafsa_buffer_state*)); (wafsa_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE wafsa_scan_buffer (char * base, wafsa_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) wafsaalloc(sizeof( struct wafsa_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in wafsa_scan_buffer()" ); b->wafsa_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->wafsa_buf_pos = b->wafsa_ch_buf = base; b->wafsa_is_our_buffer = 0; b->wafsa_input_file = 0; b->wafsa_n_chars = b->wafsa_buf_size; b->wafsa_is_interactive = 0; b->wafsa_at_bol = 1; b->wafsa_fill_buffer = 0; b->wafsa_buffer_status = YY_BUFFER_NEW; wafsa_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to wafsalex() will * scan from a @e copy of @a str. * @param str a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * wafsa_scan_bytes() instead. */ YY_BUFFER_STATE wafsa_scan_string (wafsaconst char * wafsastr ) { return wafsa_scan_bytes(wafsastr,strlen(wafsastr) ); } /** Setup the input buffer state to scan the given bytes. The next call to wafsalex() will * scan from a @e copy of @a bytes. * @param bytes the byte buffer to scan * @param len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE wafsa_scan_bytes (wafsaconst char * wafsabytes, int _wafsabytes_len ) { YY_BUFFER_STATE b; char *buf; wafsa_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _wafsabytes_len + 2; buf = (char *) wafsaalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in wafsa_scan_bytes()" ); for ( i = 0; i < _wafsabytes_len; ++i ) buf[i] = wafsabytes[i]; buf[_wafsabytes_len] = buf[_wafsabytes_len+1] = YY_END_OF_BUFFER_CHAR; b = wafsa_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in wafsa_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->wafsa_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void wafsa_fatal_error (wafsaconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine wafsaless() so it works in section 3 code. */ #undef wafsaless #define wafsaless(n) \ do \ { \ /* Undo effects of setting up wafsatext. */ \ int wafsaless_macro_arg = (n); \ YY_LESS_LINENO(wafsaless_macro_arg);\ wafsatext[wafsaleng] = (wafsa_hold_char); \ (wafsa_c_buf_p) = wafsatext + wafsaless_macro_arg; \ (wafsa_hold_char) = *(wafsa_c_buf_p); \ *(wafsa_c_buf_p) = '\0'; \ wafsaleng = wafsaless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int wafsaget_lineno (void) { return wafsalineno; } /** Get the input stream. * */ FILE *wafsaget_in (void) { return wafsain; } /** Get the output stream. * */ FILE *wafsaget_out (void) { return wafsaout; } /** Get the length of the current token. * */ int wafsaget_leng (void) { return wafsaleng; } /** Get the current token. * */ char *wafsaget_text (void) { return wafsatext; } /** Set the current line number. * @param line_number * */ void wafsaset_lineno (int line_number ) { wafsalineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see wafsa_switch_to_buffer */ void wafsaset_in (FILE * in_str ) { wafsain = in_str ; } void wafsaset_out (FILE * out_str ) { wafsaout = out_str ; } int wafsaget_debug (void) { return wafsa_flex_debug; } void wafsaset_debug (int bdebug ) { wafsa_flex_debug = bdebug ; } static int wafsa_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from wafsalex_destroy(), so don't allocate here. */ (wafsa_buffer_stack) = 0; (wafsa_buffer_stack_top) = 0; (wafsa_buffer_stack_max) = 0; (wafsa_c_buf_p) = (char *) 0; (wafsa_init) = 0; (wafsa_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT wafsain = stdin; wafsaout = stdout; #else wafsain = (FILE *) 0; wafsaout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * wafsalex_init() */ return 0; } /* wafsalex_destroy is for both reentrant and non-reentrant scanners. */ int wafsalex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ wafsa_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; wafsapop_buffer_state(); } /* Destroy the stack itself. */ wafsafree((wafsa_buffer_stack) ); (wafsa_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * wafsalex() is called, initialization will occur. */ wafsa_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef wafsatext_ptr static void wafsa_flex_strncpy (char* s1, wafsaconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int wafsa_flex_strlen (wafsaconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *wafsaalloc (wafsa_size_t size ) { return (void *) malloc( size ); } void *wafsarealloc (void * ptr, wafsa_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void wafsafree (void * ptr ) { free( (char *) ptr ); /* see wafsarealloc() for (char *) cast */ } #define YYTABLES_NAME "wafsatables" #line 65 "../../../../../src/lib/oogl/wa/fsaparse.l" int wafsawrap() { return(1); } geomview-1.9.4/src/lib/oogl/wa/wa.yystype.h0000644000175000001440000000212310464126137015477 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _YYSTYPE_H_ #define _YYSTYPE_H_ typedef union stackunion { double d; int i; char s[80]; } YYSTYPE; extern YYSTYPE yylval; #define YYSTYPE_IS_DECLARED 1 void wfsaerror(char *s); #endif geomview-1.9.4/src/lib/oogl/wa/fsaparse.3gv0000644000175000001440000000235110600600312015402 00000000000000.TH fsaparse 3gv "Sat Mar 23 22:01:32 1991" .SH NAME fsaparse \- parse a word-acceptor automaton file .SH SYNOPSIS .nf #include "wa.h" .sp fsafparse(fp, fsa) FILE *fp; Fsa *fsa; .fi .SH DESCRIPTION fsafparse parses a word-acceptor automaton file in the format described by DEAGL ("Data Exchange for Automata and Groups Language") (but see the BUGS section below). fp should be a pointer to an open file containing the automaton. fsa should be a pointer to an Fsa struture as defined in "fsa.h". Upon return, the automaton will have been written into this structure. .SH "RETURN VALUES" On success, fsafparse() returns 1. On failure, it returns 0. .SH "SEE ALSO" .nf getwordlist(3), getmatlist(3), fgetmatlist(3), getmatlist(1), automata(1) .fi .SH BUGS fsafparse is meant specifically for use with getwordlist(3) and getmatlist(3). It does not recognize the full language described by DEAGL. It only recognizes that part of it which was present in the word-acceptor files that I was working with when I wrote it. I think this may be sufficient for all word-acceptor automata, but I am not sure of this. Please let me know if you find word-acceptor files for which this doesn't work. .SH AUTHOR .nf Mark Phillips The Geometry Center .fi geomview-1.9.4/src/lib/oogl/wa/Headers0000644000175000001440000000003410464070607014467 00000000000000wa.h wa.yacc.h wa.yystype.h geomview-1.9.4/src/lib/oogl/lisp/0000777000175000001440000000000010665240670013622 500000000000000geomview-1.9.4/src/lib/oogl/lisp/lisp2.h0000644000175000001440000001654510624130376014747 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef LISP_H #define LISP_H #include #include "ooglutil.h" #include "fsa.h" #include "streampool.h" typedef struct LType LType; typedef struct LObject LObject; typedef union { int i; float f; void *p; } LCell; struct LType { /* name of type */ char *name; /* size of corresponding C type */ int size; /* extract cell value from obj */ int (*fromobj)(/* LObject *obj, void *x */); /* create a new LObject of this type */ LObject *(*toobj)(/* void *x */); /* free a cell of this type */ void (*free)(/* void *x */); /* write a cell value to a stream */ void (*write)(/* FILE *fp, void *x */); /* test equality of two cells of this type */ int (*match)(/* void *a, void *b */); /* pull a cell value from a va_list */ void (*pull)(/* va_list *a_list, void *x */); /* parse an object of this type */ LObject *(*parse)(/* Lake *lake */); /* magic number; always set to LTypeMagic */ int magic; }; #define LTypeMagic 314159 #define LNAME(type) (type->name) #define LSIZE(type) (type->size) #define LFROMOBJ(type) (*(type->fromobj)) #define LTOOBJ(type) (*(type->toobj)) #define LFREE(type) (*(type->free)) #define LMATCH(type) (*(type->match)) #define LWRITE(type) (*(type->write)) #define LPULL(type) (*(type->pull)) #define LPARSE(type) (*(type->parse)) struct LObject { LType *type; int ref; LCell cell; }; typedef struct { FILE *streamin; FILE *streamout; Pool *river; int timing_interests; /* Are we time-stamping interest reports? */ float deltatime; /* delta time between timestamps */ float nexttime; /* Pool time when next timestamp'll be needed */ char *initial, *prefix, *suffix; /* printf format strings */ } Lake; #define LakeMore(lake,c) ((c=fnextc(lake->streamin,0)) != ')' && c != EOF) #define POOL(lake) ((lake)->river) typedef struct LList { LObject * car; struct LList *cdr; } LList; typedef LObject *(*LObjectFunc)(); typedef struct LInterest { Lake *lake; LList *filter; struct LInterest *next; } LInterest; typedef struct { enum { ANY, /* match anything */ VAL, /* match only our value */ NIL /* match anything but report nil */ } flag; LObject *value; } LFilter; #define LFILTERVAL(lobject) ((LFilter *)(lobject->cell.p)) extern LType LFilterp; #define LFILTER (&LFilterp) /* * Built-in objects: Lnil and Lt: */ extern LObject *Lnil, *Lt; /* * Built-in object types: string, list, and function. Function type * is only used internally. See lisp.c for the code that initializes * these type pointers. */ extern LType LStringp; #define LSTRING (&LStringp) #define LSTRINGVAL(obj) ((char*)((obj)->cell.p)) extern LType LIntp; #define LINT (&LIntp) #define LINTVAL(obj) ((obj)->cell.i) extern LType LFloatp; #define LFLOAT (&LFloatp) #define LFLOATVAL(obj) ((obj)->cell.f) extern LType LListp; #define LLIST (&LListp) #define LLISTVAL(obj) ((LList*)((obj)->cell.p)) #define LLAKEVAL(obj) ((Lake*)(obj->cell.p)) extern LType LLakep; #define LLAKE (&LLakep) extern LType LObjectp; #define LLOBJECT (&LObjectp) /* * Function definition stuff: */ #define LASSIGN_GOOD 1 #define LASSIGN_BAD 2 #define LPARSE_GOOD 3 #define LPARSE_BAD 4 #define LDECLARE(stuff) \ switch (LParseArgs stuff) { \ case LASSIGN_BAD: case LPARSE_BAD: return Lnil; \ case LPARSE_GOOD: return Lt; \ default: case LASSIGN_GOOD: break; \ } extern LType Larray; #define LARRAY (&Larray) extern LType Lend; #define LEND (&Lend) extern LType Lhold; #define LHOLD (&Lhold) extern LType Lliteral; #define LLITERAL (&Lliteral) extern LType Loptional; #define LOPTIONAL (&Loptional) extern LType Lrest; #define LREST (&Lrest) /* * Function prototypes: */ void RemoveLakeInterests(Lake *lake); void LInit(); Lake * LakeDefine(FILE *streamin, FILE *streamout, void *river); void LakeFree(Lake *lake); LObject * _LNew(LType *type, LCell *cell); #define LNew(type,cell) _LNew(type,(LCell*)cell) LObject * LRefIncr(LObject *obj); void LRefDecr(LObject *obj); void LWrite(FILE *fp, LObject *obj); void LFree(LObject *obj); LObject * LCopy(LObject *obj); LObject * LSexpr(Lake *lake); LObject * LEvalSexpr(Lake *lake); LObject * LEval(LObject *obj); LList * LListNew(); LList * LListAppend(LList *list, LObject *obj); void LListFree(LList *list); LList * LListCopy(LList *list); LObject * LListEntry(LList *list, int n); int LListLength(LList *list); int LParseArgs(char *name, Lake *lake, LList *args, ...); int LDefun(char *name, LObjectFunc func, char *help); void LListWrite(FILE *fp, LList *list); LInterest * LInterestList(char *funcname); LObject * LEvalFunc(char *name, ...); int LArgClassValid(LType *type); void LHelpDef(char *key, char *message); void LHelpRedef(char *key, char *newmessage); char * LakeName(Lake *lake); char * LSummarize(LObject *obj); LObject * LMakeArray(LType *basetype, char *data, int count); void LShow(LObject *obj); /* for debugging; writes obj to stderr */ void LListShow(LList *list); void LWriteFile(char *fname, LObject *obj); #include "clisp.h" /* LDEFINE(name, ltype, doc) is the header used to declare a lisp function. It should be followed by the body of a function (beginning with '{' and ending with '}'). LDEFINE delcares the function's name to be "Lname" (the "name" argument with "L" prepended to it). It also defines a string named "Hname" initialized to "doc". The "ltype" argument gives the lisp object type returned by the function (all functions defined via LDEFINE *must* return a lisp object.) LDEFINE actually ignores this but read the next paragraph. LDEFINE is intended for use in conjunction with the "lisp2c" shell script which searches for calls to LDEFINE and builds a C language interface to the functions so defined. This script makes use of all 3 arguments to LDEFINE, plus the use of the LDECLARE macro in the function body that follows, to build the files clang.c and clang.h. It makes certain assumptions about the way LDEFINE and LDECLARE are used. See the comments at the top of lisp2c for details. (I don't want to write the assumptions down here because if they change I'll forget to update this comment!). */ #if defined(__STDC__) || defined(__ANSI_CPP__) #define LDEFINE( name, ltype, doc ) \ char H##name[] = doc ; LObject *L##name(Lake *lake, LList *args) #else #define LDEFINE( name, ltype, doc ) \ char H/**/name[] = doc ; LObject *L/**/name(Lake *lake, LList *args) #endif #define LBEGIN lake, args #endif /* ! LISP_H */ geomview-1.9.4/src/lib/oogl/lisp/Makefile.am0000644000175000001440000000054610624015032015562 00000000000000INCLUDES = $(default_includes) BUILT_SOURCES = clisp.c clisp.h EXTRA_DIST = Headers lisp2c $(BUILT_SOURCES) noinst_LTLIBRARIES = liblisp.la liblisp_la_SOURCES = lisp.c clisp.h lisp2.h lisp.h all-local: clisp.c clisp.h clisp.h: clisp.c clisp.c: lisp.c lisp.h $(srcdir)/lisp2c -o $(srcdir)/clisp $(srcdir)/lisp.c MAINTAINERCLEANFILES = $(BUILT_SOURCES) geomview-1.9.4/src/lib/oogl/lisp/Makefile.in0000644000175000001440000003622010665240506015604 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/oogl/lisp DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) liblisp_la_LIBADD = am_liblisp_la_OBJECTS = lisp.lo liblisp_la_OBJECTS = $(am_liblisp_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(liblisp_la_SOURCES) DIST_SOURCES = $(liblisp_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) BUILT_SOURCES = clisp.c clisp.h EXTRA_DIST = Headers lisp2c $(BUILT_SOURCES) noinst_LTLIBRARIES = liblisp.la liblisp_la_SOURCES = lisp.c clisp.h lisp2.h lisp.h MAINTAINERCLEANFILES = $(BUILT_SOURCES) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/oogl/lisp/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/oogl/lisp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done liblisp.la: $(liblisp_la_OBJECTS) $(liblisp_la_DEPENDENCIES) $(LINK) $(liblisp_la_OBJECTS) $(liblisp_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lisp.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) all-local installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am all-local check check-am clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am all-local: clisp.c clisp.h clisp.h: clisp.c clisp.c: lisp.c lisp.h $(srcdir)/lisp2c -o $(srcdir)/clisp $(srcdir)/lisp.c # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/oogl/lisp/lisp.c0000644000175000001440000014267210624367377014676 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include #include "../../../../config.h" #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ /* * lisp.c: minimal (but less minimal than before) lisp interpreter */ #include #include #include #include #include "lisp.h" #include "clisp.c" #include "freelist.h" #define MAXPAT 10 #define MAXPATLEN 128 typedef struct _pattern { int n; char p0[MAXPATLEN]; char *pat[MAXPAT]; int len[MAXPAT]; } pattern; static bool match(char *str, pattern *p); static void compile(char *str, pattern *p); static int LCompare(char *name, LObject *expr1, LObject *expr2); typedef struct Help { char *key; char *message; struct Help *next; } Help; static Help *helps = NULL; static char nomatch[] = "No commands match \"%s\"; see \"(? *)\" for a list.\n"; static bool FilterArgMatch(LList *filter, LList *args); static void InterestOutput(char *name, LList *args, LInterest *interest); static LObject *LFAny, *LFNil; static LFilter FAny = {ANY, NULL}; static LFilter FNil = {NIL, NULL}; static bool obj2array(LObject *obj, LType *type, char *x, int *n); static bool obj2vararray(LObject *obj, LType *type, char **x, int *n); LObject *LMakeArray(LType *basetype, char *array, int count); static char *delims = "()"; #define NEXTTOKEN(tok,fp) tok = iobfdelimtok( delims, fp, 0 ) /* Use -1 as the item size of special type markers * for quick detection in LParseArgs()/AssignArgs(). */ LType Larray = { NULL, -1 }; LType Lvararray = { NULL, -1 }; LType Lend = { NULL, -1 }; LType Lrest = { NULL, -1 }; LType Lhold = { NULL, -1 }; LType Lliteral = { NULL, -1 }; LType Loptional = { NULL, -1 }; #define REJECT -1 typedef struct { LObjectFunc fptr; char *name; LInterest *interested; } LFunction; extern LType LFuncp; #define LFUNC (&LFuncp) #define LFUNCVAL(obj) ((int)((obj)->cell.i)) vvec funcvvec; #define functable VVEC(funcvvec,LFunction) static Fsa func_fsa; /* * function prototypes */ static LParseResult AssignArgs(char *name, LList *args, va_list a_list); static int funcindex(char *name); static LObject *LSexpr0(Lake *lake, int listhow); #define LIST_LITERAL 0 #define LIST_FUNCTION 1 #define LIST_EVAL 2 /* Parse with intention to evaluate */ LObject *Linterest(Lake *lake, LList *args); LObject *Luninterest(Lake *lake, LList *args); LObject *Lregtable(Lake *lake, LList *args); static LObject *do_interest(Lake *lake, LList *call, char *action); static void RemoveInterests(LInterest **interest, Lake *lake, int usefilter, LList *filter); static bool InterestMatch(LInterest *interest, Lake *lake, bool usefilter, LList *filter); static bool FilterMatch(LFilter *f1, LFilter *f2); static void DeleteInterest(LInterest *interest); static LInterest *NewInterest(); static void AppendInterest(LInterest **head, LInterest *new); static LList *FilterList(LList *args); /* * nil object implementation */ static void nilwrite(FILE *fp, void *value) { fprintf(fp, "nil"); } static LCell nullcell; static LType niltype = { "nil", sizeof(int), NULL, NULL, NULL, nilwrite, NULL, NULL, NULL, LTypeMagic }; static LObject nil; /* = {&niltype, 1, nullcell }; */ LObject *Lnil = &nil; /* * t object implementation */ static void twrite(FILE *fp, void *value) { fprintf(fp,"t"); } static LType ttype = { "t", sizeof(int), NULL, NULL, NULL, twrite, NULL, NULL, NULL, LTypeMagic } ; static LObject t; /* = {&ttype, 1, nullcell }; */ LObject *Lt = &t; /* * int object implementation */ static bool intfromobj(LObject *obj, int *x) { if (obj->type == LSTRING) { char *cp = LSTRINGVAL(obj); if (cp[0]=='n' && cp[1]=='i' && cp[2]=='l' && cp[3]=='\0') *x = 0; else { *x = strtol(cp, &cp, 0); return cp != LSTRINGVAL(obj) ? 1 : 0; } } else if (obj->type == LINT) { *x = LINTVAL(obj); } else return false; return true; } static LObject *int2obj(int *x) { return LNew( LINT, x ); } static void intfree(int *x) {} static bool intmatch(int *a, int *b) { return *a == *b; } static void intwrite(FILE *fp, int *x) { fprintf(fp, "%1d", *x); } static void intpull(va_list *a_list, int *x) { *x = va_arg(*a_list, int); } LObject *intparse(Lake *lake) { /* parse the next thing from the lake */ LObject *obj = LSexpr(lake); /* if it's a string, promote it to an int, otherwise leave it as it is */ if (obj->type == LSTRING) { char *cp = LSTRINGVAL(obj); int val = strtol(cp, &cp, 0); if(cp != LSTRINGVAL(obj)) { /* if valid int */ free(LSTRINGVAL(obj)); obj->type = LINT; obj->cell.i = val; } } return obj; } LType LIntp = { "int", sizeof(int), intfromobj, int2obj, intfree, intwrite, intmatch, intpull, intparse, LTypeMagic }; /* * float object implementation */ bool floatfromobj(LObject *obj, float *x) { if (obj->type == LSTRING) { char *cp = LSTRINGVAL(obj); *x = strtod(cp, &cp); return cp != LSTRINGVAL(obj) ? 1 : 0; } else if (obj->type == LFLOAT) { *x = LFLOATVAL(obj); } else return false; return true; } LObject *float2obj(float *x) { return LNew( LFLOAT, x ); } void floatfree(float *x) {} bool floatmatch(float *a, float *b) { return *a == *b; } void floatwrite(FILE *fp, float *x) { fprintf(fp, "%1g", *x); } void floatpull(va_list *a_list, float *x) { *x = va_arg(*a_list, double); } LObject *floatparse(Lake *lake) { /* parse the next thing from the lake */ LObject *obj = LSexpr(lake); /* if it's a string or int, promote it to a float, otherwise leave it as it is */ if (obj->type == LSTRING) { char *cp = LSTRINGVAL(obj); float val = strtod(cp, &cp); if(cp != LSTRINGVAL(obj)) { free(LSTRINGVAL(obj)); obj->type = LFLOAT; obj->cell.f = val; } } else if (obj->type == LINT) { float val = LINTVAL(obj); obj->type = LFLOAT; obj->cell.f = val; } return obj; } LType LFloatp = { "float", sizeof(float), floatfromobj, float2obj, floatfree, floatwrite, floatmatch, floatpull, floatparse, LTypeMagic }; /* * string object implementation */ bool stringfromobj(LObject *obj, char * *x) { if (obj->type != LSTRING) return false; *x = LSTRINGVAL(obj); return true; } LObject *string2obj(char * *x) { char *copy = *x ? strdup(*x) : NULL; return LNew( LSTRING, © ); } void stringfree(char * *x) { if (*x) free(*x); } bool stringmatch(char **a, char **b) { if (!*a) return *b==NULL; if (!*b) return *a==NULL; return strcmp(*a,*b)==0 ; } void stringwrite(FILE *fp, char * *x) { fprintf(fp, "\"%s\"", *x); } void stringpull(va_list *a_list, char * *x) { *x = va_arg(*a_list, char *); } LType LStringp = { "string", sizeof(char *), stringfromobj, string2obj, stringfree, stringwrite, stringmatch, stringpull, LSexpr, LTypeMagic }; /* * list implementation */ static DEF_FREELIST(LList); LList *LListNew(void) { LList *new; FREELIST_NEW(LList, new); new->cdr = NULL; return new; } LList *LListCopy(LList *list) { LList *new; if (! list) return NULL; new = LListNew(); if (list->car) new->car = LCopy(list->car); new->cdr = LListCopy(list->cdr); return (void*)new; } void LListFree(LList *list) { if (!list) { return; } if (list->cdr) { LListFree(list->cdr); } LFree(list->car); FREELIST_FREE(LList, list); } void LListWrite(FILE *fp, LList *list) { int first = 1; fprintf(fp,"("); while (list != NULL) { if (!first) { fprintf(fp," "); } first = 0; LWrite(fp, list->car); list = list->cdr; } fprintf(fp,")"); } /**********************************************************************/ bool listfromobj(LObject *obj, LList * *x) { if (obj->type != LLIST) return false; *x = LLISTVAL(obj); return true; } LObject *list2obj(LList * *x) { LList *list = *x ? LListCopy(*x) : NULL; return LNew( LLIST, &list ); } void listfree(LList * *x) { if (*x) LListFree(*x); } bool listmatch(LList **a, LList **b) { return *a == *b; } void listwrite(FILE *fp, LList * *x) { LListWrite(fp, *x); } void listpull(va_list *a_list, LList * *x) { *x = va_arg(*a_list, LList *); } LType LListp = { "list", sizeof(LList *), listfromobj, list2obj, listfree, listwrite, listmatch, listpull, LSexpr, LTypeMagic }; bool objfromobj(LObject *obj, LObject * *x) { *x = LRefIncr(obj); return true; } LObject *obj2obj(LObject * *x) { if (*x) LRefIncr(*x); return *x; } void objpull(va_list *a_list, LObject * *x) { *x = va_arg(*a_list, LObject *); } bool objmatch(LObject **a, LObject **b) { return *a == *b; } LType LObjectp = { "lisp object", sizeof(LObject *), objfromobj, obj2obj, NULL, NULL, objmatch, objpull, LSexpr, LTypeMagic }; /* * Lake implementation */ Lake *LakeDefine(IOBFILE *streamin, FILE *streamout, void *river) { Lake *lake = OOGLNewE(Lake, "new Lake"); lake->streamin = streamin; lake->streamout = streamout; lake->river = river; lake->timing_interests = 0; return lake; } void LakeFree(Lake *lake) { OOGLFree(lake); } /* * Lake object implementation * ( Not the same as the Lake itself; the lake object is a lisp * object type whose value is a Lake pointer. ) */ bool lakefromobj(LObject *obj, Lake * *x) { *x = LLAKEVAL(obj); return true; } LObject *lake2obj(Lake * *x) { return LNew( LLAKE, x ); } void lakefree(Lake * *x) {} void lakewrite(FILE *fp, Lake * *x) { fprintf(fp,"-lake-"); } LType LLakep = { "lake", sizeof(Lake *), lakefromobj, lake2obj, lakefree, lakewrite, NULL, NULL, NULL, LTypeMagic }; /* * function object implementation */ bool funcfromobj(LObject *obj, int *x) { if (obj->type == LSTRING) { *x = funcindex(LSTRINGVAL(obj)); if (*x == REJECT) return false; } else if (obj->type == LFUNC) { *x = LFUNCVAL(obj); } else return false; return true; } LObject *func2obj(int *x) { return LNew( LFUNC, x ); } void funcfree(int *x) {} bool funcmatch(int *a, int *b) { return *a == *b; } void funcwrite(FILE *fp, int *x) { fprintf(fp, "%s", functable[*x].name); } void funcpull(va_list *a_list, int *x) { *x = va_arg(*a_list, int); } LType LFuncp = { "lisp function", sizeof(int), funcfromobj, func2obj, funcfree, funcwrite, funcmatch, funcpull, LSexpr, LTypeMagic }; /**********************************************************************/ void LInit() { VVINIT(funcvvec, LFunction, 30); func_fsa = fsa_initialize( NULL, (void*)REJECT ); nullcell.p = NULL; nil.type = &niltype; nil.cell = nullcell; t.type = &ttype; t.cell = nullcell; { LCell cell; cell.p = (void*)(&FAny); LFAny = LNew(LFILTER, &cell); cell.p = (void*)(&FNil); LFNil = LNew(LFILTER, &cell); } { extern LObject *Lhelp(Lake *lake, LList *args); extern LObject *Lmorehelp(Lake *lake, LList *args); LDefun("?", Lhelp, "(? [command])\n\ Command may include \"*\"s as wildcards; see also \"??\"\n\ One-line command help; lists names only if multiple commands match.\n\ ? is a synonym for \"help\""); LDefun("??", Lmorehelp, "(?? command) \"command\" may include \"*\" wildcards\n\ Prints more info than \"(? command)\". ?? is a synonym\n\ for \"morehelp\""); } clisp_init(); LHelpDef("STATEMENT", "STATEMENT represents a function call. Function calls have\n\ the form \"( func arg1 arg2 ... )\", where func is the name\n\ of the function and arg1, arg2, ... are the arguments."); } LDEFINE(quote, LLOBJECT, "(quote EXPR)\n\ returns the symbolic lisp expression EXPR without evaluating it.") { LObject *arg; LDECLARE(("quote", lake, args, LLITERAL, LLOBJECT, &arg, LEND)); LRefIncr(arg); return arg; } LDEFINE(if, LLOBJECT, "(if TEST EXPR1 [EXPR2])\n\ Evaluates TEST; if TEST returns a non-nil value, returns the\n\ value of EXPR1. If TEST returns nil, returns the value of\n\ EXPR2 if EXPR2 is present, otherwise returns nil.") { LObject *test, *tclause, *fclause=NULL; LDECLARE(("if", LBEGIN, LLOBJECT, &test, LHOLD, LLOBJECT, &tclause, LOPTIONAL, LHOLD, LLOBJECT, &fclause, LEND)); if (test != Lnil) { return LEval(tclause); } else if (fclause) { return LEval(fclause); } else { return Lnil; } } LDEFINE(not, LINT, "(not EXPR)\n\ Evaluates EXPR; if EXPR returns a non-nil value, returns nil,\n\ if EXPR returns nil, return t.") { LObject *expr; LDECLARE(("not", LBEGIN, LLOBJECT, &expr, LEND)); if (expr != Lnil) { return Lnil; } else { return Lt; } } LDEFINE(or, LLOBJECT, "(or EXPR1 EXPR2\n\ Evaluates EXPR1; if EXPR1 returns non-nil, return its value,\n\ if EXPR1 returns nil, evaluate EXPR2 and return its value.") { LObject *expr1, *expr2; LDECLARE(("or", LBEGIN, LLOBJECT, &expr1, LHOLD, LLOBJECT, &expr2, LEND)); if (expr1 != Lnil) { /* arguments do not survive the life-time of a function */ return LRefIncr(expr1); } else { return LEval(expr2); } } LDEFINE(and, LINT, "(and EXPR1 EXPR2\n\ Evaluate EXPR1 and EXPR2 and return t if both return non-nil,\n\ otherwise return nil.") { LObject *expr1, *expr2; LDECLARE(("and", LBEGIN, LLOBJECT, &expr1, LLOBJECT, &expr2, LEND)); return (expr1 != Lnil && expr2 != Lnil) ? Lt : Lnil; } LDEFINE(greater, LINT, "(> EXPR1 EXPR2)\n\ Returns t if EXPR1 is greater than EXPR2. EXPR1 and EXPR2 should\n\ be either both integers or floats, or both strings.") { LObject *expr1, *expr2; LDECLARE((">", LBEGIN, LLOBJECT, &expr1, LLOBJECT, &expr2, LEND)); if (LCompare(">", expr1, expr2)==1) return Lt; else return Lnil; } LDEFINE(less, LINT, "(< EXPR1 EXPR2)\n\ Returns t if EXPR1 is less than EXPR2. EXPR1 and EXPR2 should\n\ be either both integers or floats, or both strings.") { LObject *expr1, *expr2; LDECLARE(("<", LBEGIN, LLOBJECT, &expr1, LLOBJECT, &expr2, LEND)); if (LCompare("<", expr1, expr2)==-1) return Lt; else return Lnil; } LDEFINE(equal, LINT, "(= EXPR1 EXPR2)\n\ Returns t if EXPR1 is equal to EXPR2. EXPR1 and EXPR2 should\n\ be either both integers or floats, or both strings.") { LObject *expr1, *expr2; LDECLARE(("=", LBEGIN, LLOBJECT, &expr1, LLOBJECT, &expr2, LEND)); if (LCompare("=", expr1, expr2)==0) return Lt; else return Lnil; } static int LCompare(char *name, LObject *expr1, LObject *expr2) { char *s1, *s2; float e1, e2; if (expr1->type == LSTRING && expr2->type == LSTRING) { s1 = LSTRINGVAL(expr1); s2 = LSTRINGVAL(expr2); return -strcmp(s1,s2); } if (expr1->type == LINT) e1 = LINTVAL(expr1); else if (expr1->type == LFLOAT) e1 = LFLOATVAL(expr1); else { OOGLError(0, "%s: arg 1 must be int, float, or string\n", name); return -2; } if (expr2->type == LINT) e2 = LINTVAL(expr2); else if (expr2->type == LFLOAT) e2 = LFLOATVAL(expr2); else { OOGLError(0, "%s: arg 2 must be int, float, or string\n", name); return -2; } if (e1 == e2) return 0; else if (e1 > e2) return 1; else return -1; } LDEFINE(sgi, LINT, "(sgi)\n\ Returns t if running on an sgi machine, nil if not") { LDECLARE(("sgi", LBEGIN, LEND)); if (strcmp(MACHTYPE,"sgi")==0) return Lt; return Lnil; } LDEFINE(NeXT, LINT, "(NeXT)\n\ Returns t if running on a NeXT, nil if not") { LDECLARE(("NeXT", LBEGIN, LEND)); if (strcmp(MACHTYPE,"next")==0) return Lt; return Lnil; } LDEFINE(progn, LLOBJECT, "(progn STATEMENT [ ... ])\n\ evaluates each STATEMENT in order and returns the value of the\n\ last one. Use progn to group a collection of commands together,\n\ forcing them to be treated as a single command.") { LObject *val=NULL; LList *arglist = NULL; LDECLARE(("progn", LBEGIN, LHOLD, LREST, &arglist, LEND)); for( ; arglist != NULL; arglist = arglist->cdr) { LFree(val); val = LEval(arglist->car); } return val; } void LListShow(LList *list) { LListWrite(stderr,list); } /* * Lisp object implementation */ static DEF_FREELIST(LObject); LObject *_LNew(LType *type, LCell *cell) { LObject *obj; FREELIST_NEW(LObject, obj); obj->type = type; obj->ref = 1; if (!cell) { memset(&obj->cell, 0, sizeof(obj->cell)); } else { memcpy(&obj->cell, cell, LSIZE(type)); } return obj; } void LWrite(FILE *fp, LObject *obj) { (*obj->type->write)(fp, &(obj->cell)); } void LWriteFile(char *fname, LObject *obj) { FILE *fp = fopen(fname, "w"); if (fp != NULL) { LWrite(fp, obj); fclose(fp); } else { OOGLError(0, "LWriteFile: can't create file %s",fname); } } void LShow(LObject *obj) { LWrite(stderr, obj); } void LFree(LObject *obj) { if (obj == NULL || obj == Lnil || obj == Lt) return; LRefDecr(obj); if ( obj->ref == 0 ) { (*obj->type->free)(&(obj->cell)); FREELIST_FREE(LObject, obj); } } LObject *LCopy(LObject *obj) { if (obj == Lnil) return Lnil; if (obj == Lt) return Lt; return LTOOBJ(obj->type)(&(obj->cell)); } LObject *LRefIncr(LObject *obj) { ++(obj->ref); return obj; } void LRefDecr(LObject *obj) { --(obj->ref); } /* LSexpr() uses special parsing on lists; changes function names to function pointers, and calls the function to parse the arguments */ LObject *LSexpr(Lake *lake) { return LSexpr0(lake, LIST_FUNCTION); } /* LLiteral() uses literal parsing; lists are not interpreted as function calls */ LObject *LLiteral(Lake *lake) { return LSexpr0(lake, LIST_LITERAL); } /* LEvalSexpr() both parses and evaluates the requested expression. */ LObject *LEvalSexpr(Lake *lake) { LObject *args, *val; args = LSexpr0(lake, LIST_EVAL); val = LEval(args); LFree(args); return val; } /* LSexpr0() does the work of both LSexpr() and LLiteral(); special says whether to interpret lists specially */ static LObject *LSexpr0(Lake *lake, int listhow) { LObject *obj, *head; char *tok; int i, c; NEXTTOKEN(tok,lake->streamin); if(tok == NULL) return Lnil; if (*tok == '(' && tok[1] == '\0') { obj = LNew(LLIST, NULL); if(listhow == LIST_LITERAL) { while ( LakeMore(lake,c) ) obj->cell.p = (void*) LListAppend((LList*)(obj->cell.p), LSexpr0(lake,LIST_LITERAL)); } else if ( LakeMore(lake,c) ) { /* if we have a non-empty list ... */ /* ... get the first element and see if it's a function name */ head = LEvalSexpr(lake); if (funcfromobj(head, &i)) { /* It's a function name. Enter the function as the first element of our list, and then call the function in parse mode to construct the rest of the list (arguments to the function) */ if(head->type != LFUNC) { LFree(head); head = LNew(LFUNC, &i); } obj->cell.p = (void*) LListAppend(LLISTVAL(obj), head); if ( (*functable[i].fptr)(lake, LLISTVAL(obj)) == Lnil ) { LFree(obj); obj = Lnil; } } else { /* It's not a function name. Probably this part will only be called in error, because plain lists should always be quoted. This should probably be replaced by more robust error detection and recovery code. For now, just parse as a plain list. LEval() will emit an error message if this list is ever evaluated. */ if(listhow == LIST_EVAL) OOGLSyntax(lake->streamin, "Reading \"%s\": call to unknown function \"%s\"", LakeName(lake), LSummarize(head)); obj->cell.p = (void*) LListAppend(LLISTVAL(obj), head); while ( LakeMore(lake,c) ) obj->cell.p = (void*) LListAppend(LLISTVAL(obj), LSexpr0(lake,listhow)); } } NEXTTOKEN(tok,lake->streamin); } else { obj = LNew(LSTRING, NULL); obj->cell.p = strdup(tok); } return obj; } LObject *LEval(LObject *obj) { LObject *ans; LList *list, *args; LInterest *interest; LFunction *fentry; /* all non-list objects evaluate to themselves */ if (obj->type != LLIST) { LRefIncr(obj); return obj; } list = LLISTVAL(obj); /* the empty list evaluates to itself */ if (list == NULL || list->car == NULL) return obj; /* a nonempty list corresponds to a function call; the list's value is the value returned by the function */ if (list->car->type == LFUNC) { fentry = &functable[LFUNCVAL(list->car)]; args = LLISTVAL(obj)->cdr; /* deal with any interests in the function first */ if ((interest=fentry->interested) != NULL) { while (interest) { if (FilterArgMatch(interest->filter, args)) { InterestOutput(fentry->name, args, interest); } interest = interest->next; } } /* then call the function */ ans = (*(fentry->fptr))( NULL, args ); return ans; } else { OOGLError(0, "lisp error: call to unknown function %s", LSummarize(list->car)); return Lnil; } } LList *LListAppend(LList *list, LObject *obj) { LList *l, *new = LListNew(); new->car = obj; l = list; if (l) { while (l->cdr) l = l->cdr; l->cdr = new; return list; } return new; } int LListLength(LList *list) { int n=0; while (list) { ++n; list = list->cdr; } return n; } LObject *LListEntry(LList *list, int n) { if (n < 0) n = LListLength(list) + 1 + n; while (list && --n) list = list->cdr; if (list) return list->car; else return NULL; } LDEFINE(car, LLOBJECT, "(car LIST)\n\ returns the first element of LIST.") { LList *list; LDECLARE(("car", LBEGIN, LLIST, &list, LEND)); if (list && list->car) { return LCopy(list->car); } return Lnil; } LDEFINE(cdr, LLOBJECT, "(cdr LIST)\n\ returns the list obtained by removing the first element of LIST.") { LList *list; LDECLARE(("cdr", LBEGIN, LLIST, &list, LEND)); if (list && list->cdr) { LList *copy = LListCopy(list->cdr); return LNew(LLIST, ©); } return Lnil; } /* * function definition implementation */ bool LDefun(char *name, LObjectFunc func, char *help) { int index = VVCOUNT(funcvvec)++; LFunction *lfunction = VVINDEX(funcvvec, LFunction, index); lfunction->fptr = func; lfunction->name = strdup(name); lfunction->interested = NULL; fsa_install( func_fsa, name, (void *)(long)index ); if (help) LHelpDef(name, help); return true; } /* Function is called in one of three modes: lake != NULL, args != NULL: parse mode In this mode, upon entry args is a list containing one element, the function object itself. We parse arguments from lake, appending them to the args list. We return Lt if the parsing was successful, Lnil if not. lake == NULL: evaluate mode In this mode, upon entry args is a list containing the arguments to the function. We return the function's value on the arguments. */ static int funcindex(char *name) { return (int)(long)fsa_parse( func_fsa, name ); } /* * The LDECLARE() macro calls this function. */ LParseResult LParseArgs(char *name, Lake *lake, LList *args, ...) { int c, moreargspecs=1, argsgot=0, argsrequired= -1; LType *argclass; int argspecs=0, literal=0, hold = 0; LObject *arg; va_list a_list; va_start(a_list, args); if (lake == NULL) { LParseResult val = AssignArgs(name, args, a_list); va_end(a_list); return val; } while (moreargspecs) { argclass=va_arg(a_list, LType *); if (argclass->size < 0) { if (argclass == LEND) { moreargspecs = 0; } else if (argclass == LOPTIONAL) { argsrequired = argspecs; } else if (argclass == LHOLD) { hold = 1; } else if (argclass == LLITERAL) { /* literal affects the way an argument is parsed (as well as implying "hold" in the assignment stage). It should only be used on LLOBJECT or LLIST. It means parse the argument literally. In non-literal parsing, lists are treated as function calls and the function is called to parse the arguments. In literal parsing, we don't treat lists as function calls. Just parse them as lists. */ literal = 1; } else if (argclass == LARRAY) { /* special case for this because it takes 3 args: the base type, the array itself, and a count */ (void)va_arg(a_list, LType *); (void)va_arg(a_list, void *); (void)va_arg(a_list, int *); ++argspecs; if (LakeMore(lake,c)) { LListAppend(args, LSexpr(lake)); ++argsgot; } } else if (argclass == LVARARRAY) { /* special case for this because it takes 3 args: the base type, the array-pointer itself, and a count */ (void)va_arg(a_list, LType *); (void)va_arg(a_list, void **); (void)va_arg(a_list, int *); ++argspecs; if (LakeMore(lake,c)) { LListAppend(args, LSexpr(lake)); ++argsgot; } } else if(argclass == LREST) { /* * Gather up any remaining arguments into an LList. * If the caller provides a NULL pointer, discard them; * otherwise store the list there. Note that we yield an LList, * not an LLIST-typed LObject. */ LList **restp = va_arg(a_list, LList **); (void)restp; while(LakeMore(lake,c)) { arg = hold||literal ? LSexpr(lake) : LEvalSexpr(lake); LListAppend(args, arg); /* Stash args for AssignArgs to grab */ } moreargspecs = 0; } } else if(argclass == LLAKE) { (void)va_arg(a_list, Lake **); LListAppend(args, LTOOBJ(LLAKE)(&lake)); } else { ++argspecs; (void)va_arg(a_list, void *); if (LakeMore(lake,c)) { LObject *arg; if (literal) { /* literal should only be used on LLOBJECT or LLIST types, both of which use the LSexpr() parse method; in the literal case, we use LLiteral() instead. */ arg = LLiteral(lake); literal=0; } else { LObject *parsed = arg = LPARSE(argclass)(lake); if(!hold && parsed->type == LLIST) { arg = LEval(parsed); LFree(parsed); } } LListAppend(args, arg); ++argsgot; } } } if (argsrequired<0) argsrequired = argspecs; va_end(a_list); if (argsgot < argsrequired) { OOGLSyntax(lake->streamin, "Reading from \"%s\": %s requires %d args, got %d", PoolName(POOL(lake)),name,argsrequired,argsgot); return LPARSE_BAD; } if (LakeMore(lake,c)) { OOGLSyntax(lake->streamin, "In \"%s\": %s: ignoring additional arguments (expected %1d)\n", PoolName((Pool *)(lake->river)), name, argsgot); while (LakeMore(lake,c)) LFree(LSexpr(lake)); } return LPARSE_GOOD; } static bool obj2array(LObject *obj, LType *type, char *x, int *n) { int max= abs(*n); LList *list; *n = 0; /* interprete the nil object as an empty list */ if ((obj == Lnil) || (obj->type==LSTRING && strcmp(LSTRINGVAL(obj),"nil")==0) ) { return true; } list = LLISTVAL(obj); if (obj->type != LLIST) return false; while (list && list->car && *ncar, (void*)(x + (*n)*LSIZE(type)))) return false; (*n)++; list = list->cdr; } if (*n == max && list) { return false; } return true; } /* variable length array */ static bool obj2vararray(LObject *obj, LType *type, char **x, int *n) { LList *list; /* interprete the nil object as an empty list */ if ( (obj == Lnil) || (obj->type==LSTRING && strcmp(LSTRINGVAL(obj),"nil")==0) ) { if (*x) { OOGLFree(*x); } *x = NULL; *n = 0; return true; } list = LLISTVAL(obj); if (obj->type != LLIST) { if (*x) { OOGLFree(*x); } *x = NULL; *n = 0; return false; } if ((*n = LListLength(list)) == 0) { if (*x) { OOGLFree(*x); } *x = NULL; return true; } *x = OOGLRenewNE(char, *x, (*n)*LSIZE(type), "C-lisp vararray"); *n = 0; while (list && list->car) { if (!LFROMOBJ(type)(list->car, (void * )((*x) + (*n)*LSIZE(type)))) { return false; } (*n)++; list = list->cdr; } return true; } LObject *LMakeArray(LType *basetype, char *array, int count) { int i; LList *list = NULL; LObject *obj; for (i=0; isize < 0) { if (argtype == LEND) { moreargspecs = 0; } else if (argtype == LOPTIONAL) { argsrequired = argspecs; } else if (argtype == LHOLD) { hold=1; } else if (argtype == LLITERAL) { /* in the assignment stage, literal means the same as hold */ hold=1; } else if (argtype == LLAKE) { if (args) { arg = args->car; *va_arg(a_list, Lake **) = LLAKEVAL(arg); args = args->cdr; } else { OOGLError(0,"%s: internal lake assignment out of whack. Please\n\ report this error!",name); goto bad; } } else if (argtype == LARRAY) { /* get the base type of the array */ argtype=va_arg(a_list, LType *); ++argspecs; if (args) { void *array = va_arg(a_list, void*); int *count = va_arg(a_list, int*); int origcount = abs(*count); if (hold) { arg = LRefIncr(args->car); } else { arg = LEval(args->car); } ++argsgot; convok = obj2array(arg, argtype, array, count); if (!convok) { OOGLError(0, "%s: array of at most %1d %ss expected in\n\ arg position %1d (got %s)\n", name,origcount, argtype->name, argsgot, LSummarize(arg)); } args = args->cdr; hold = 0; } else { (void)va_arg(a_list, void *); (void)va_arg(a_list, void *); } } else if (argtype == LVARARRAY) { /* get the base type of the array */ argtype=va_arg(a_list, LType *); ++argspecs; if (args) { void *arrayp = va_arg(a_list, void*); int *countp = va_arg(a_list, int*); if (hold) { arg = LRefIncr(args->car); } else { arg = LEval(args->car); } ++argsgot; convok = obj2vararray(arg, argtype, arrayp, countp); if (!convok) { OOGLError(0, "%s: variable length array conversion failed " "after converting %1d %ss in\n" "arg position %1d (got %s)\n", name, *countp, argtype->name, argsgot, LSummarize(arg)); } args = args->cdr; hold = 0; } else { (void)va_arg(a_list, void *); (void)va_arg(a_list, void *); } } else if(argtype == LREST) { LList **restp = va_arg(a_list, LList **); if(restp) *restp = args; moreargspecs = 0; args = NULL; /* Don't complain of excess args */ } } else { ++argspecs; if (args) { if (hold) { arg = LRefIncr(args->car); } else { arg = LEval(args->car); } if (argtype == LLOBJECT && arg == args->car) { LFree(arg); } ++argsgot; convok = LFROMOBJ(argtype)(arg, va_arg(a_list, void *)); if (!convok) { OOGLError(0,"%s: %s expected in arg position %1d (got %s)\n", name,LNAME(argtype),argsgot,LSummarize(arg)); LFree(arg); goto bad; } LFree(arg); args = args->cdr; hold = 0; } else (void)va_arg(a_list, void *); } } if (argsrequired<0) argsrequired = argspecs; /*va_end(a_list);*/ if (argsgot < argsrequired) { OOGLError(0,"%s: internal argument list deficit; require %1d, got %1d\n\ Please report this error!", name, argsrequired, argsgot); goto bad; } if (args) { OOGLError(1,"%s: internal argument list excess\n\ Please report this error!", name); goto bad; } return LASSIGN_GOOD; bad: /*va_end(a_list);*/ return LASSIGN_BAD; } bool LArgClassValid(LType *type) { return (type->magic == LTypeMagic); } LObject *LEvalFunc(char *name, ...) { va_list a_list; LList *list = NULL; LObject *obj, *val; int i; LType *a; LCell cell; if ( (i=funcindex(name)) != REJECT ) { list = LListAppend(list, LNew( LFUNC, &i )); } else { char *copy = strdup(name); list = LListAppend(list, LNew( LSTRING, © )); } va_start(a_list, name); while ( (a=va_arg(a_list, LType *)) != LEND ) { if (a == LHOLD || a == LLITERAL || a == LOPTIONAL || a == LLAKE ) { /* do nothing */ } else if (a == LARRAY || a == LVARARRAY) { LType *basetype=va_arg(a_list, LType *); void *array = va_arg(a_list, void *); int count = abs(va_arg(a_list, int)); list = LListAppend(list, LMakeArray(basetype, array, count)); } else { LPULL(a)(&a_list, &cell); list = LListAppend(list, LTOOBJ(a)(&cell)); } } obj = LNew( LLIST, &list ); val = LEval(obj); LFree(obj); return val; } static bool filterfromobj(LObject *obj, LFilter * *x) { if (obj->type != LFILTER) return false; *x = LFILTERVAL(obj); return true; } static LObject *filter2obj(LFilter * *x) { LFilter *copy = OOGLNew(LFilter); copy->flag = (*x)->flag; copy->value = (*x)->value ? LCopy((*x)->value) : NULL; return LNew( LFILTER, © ); } static void filterfree(LFilter * *x) { if (*x) { if ((*x)->value) LFree((*x)->value); OOGLFree(*x); } } static void filterwrite(FILE *fp, LFilter * *x) { switch ((*x)->flag) { case VAL: fprintf(fp, "filter[VAL,"); LWrite(fp, (*x)->value); fprintf(fp, "]"); break; case ANY: fprintf(fp, "filter[ANY]"); break; case NIL: fprintf(fp, "filter[NIL]"); break; default: fprintf(fp, "filter[???"); break; } } LType LFilterp = { "filter", sizeof(LFilter *), filterfromobj, filter2obj, filterfree, filterwrite, NULL, NULL, LSexpr, LTypeMagic }; LDEFINE(interest, LVOID, "(interest (COMMAND [args]))\n\ \n\ Allows you to express interest in a command. When geomview\n\ executes that command in the future it will echo it to the\n\ communication pool from which the interest command came.\n\ COMMAND can be any command. Args specify restrictions on the\n\ values of the arguments; if args are present in the interest\n\ command, geomview will only echo calls to the command in which\n\ the arguments match those given in the interest command. Two\n\ special argument values may appear in the argument list. \"*\"\n\ matches any value. \"nil\" matches any value but supresses the\n\ reporting of that value; its value is reported as \"nil\".\n\ \n\ The purpose of the interest command is to allow external\n\ modules to find out about things happening inside geomview.\n\ For example, a module interested in knowing when a geom called\n\ \"foo\" is deleted could say \"(interest (delete foo))\" and would\n\ receive the string \"(delete foo)\" when foo is deleted.\n\ \n\ Picking is a special case of this. For most modules\n\ interested in pick events the command \"(interest (pick\n\ world))\" is sufficient. This causes geomview to send a string\n\ of the form \"(pick world ...)\" every time a pick event (right\n\ mouse double click). See the \"pick\" command for details.") { Lake *calhoun; LList *call; LDECLARE(("interest", LBEGIN, LLAKE, &calhoun, LLITERAL, LLIST, &call, LEND)); return do_interest(calhoun, call, "interest"); } LDEFINE(uninterest, LVOID, "(uninterest (COMMAND [args]))\n\ Undoes the effect of an \"interest\" command. (COMMAND [args]) must\n\ be identical to those used in the \"interest\" command.") { Lake *calhoun; LList *call; LDECLARE(("uninterest", LBEGIN, LLAKE, &calhoun, LLITERAL, LLIST, &call, LEND)); return do_interest(calhoun, call, "uninterest"); } LDEFINE(time_interests, LVOID, "(time-interests deltatime initial prefix [suffix])\n\ Indicates that all interest-related messages, when separated by at\n\ least \"deltatime\" seconds of real time, should be preceded by\n\ the string ``prefix'' and followed by ``suffix''; the first message\n\ is preceded by ``initial''. All three are printf format strings,\n\ whose argument is the current clock time (in seconds) on that stream.\n\ A \"deltatime\" of zero timestamps every message. Typical usage:\n\ (time-interests .1 \"(set-clock %g)\" \"(sleep-until %g)\") or\n\ (time-interests .1 \"(set-clock %g)\"\n\ \"(sleep-until %g) (progn (set-clock %g)\" \")\") or\n\ (time-interests .1 \"(set-clock %g)\"\n\ \"(if (> 0 (sleep-until %g)) (\" \"))\".") { Lake *l; float dt; char *initial = NULL, *prefix = NULL, *suffix = NULL; LDECLARE(("time-interests", LBEGIN, LLAKE, &l, LOPTIONAL, LFLOAT, &dt, LSTRING, &initial, LSTRING, &prefix, LSTRING, &suffix, LEND)); if(l->timing_interests) { l->timing_interests = 0; if(l->initial) free(l->initial); if(l->prefix) free(l->prefix); if(l->suffix) free(l->suffix); } if(initial) { l->timing_interests = 1; l->initial = strdup(initial); l->prefix = prefix ? strdup(prefix) : NULL; l->suffix = suffix ? strdup(suffix) : NULL; l->deltatime = dt; l->nexttime = -1e10; } return Lt; } static LObject *do_interest(Lake *lake, LList *call, char *action) { int i; LList *filter, *cargs; char *command; LInterest *new; if (!call || !call->car) { fprintf(stderr,"%s: COMMAND required.\n", action); return Lnil; } if (call->car->type != LSTRING) { fprintf(stderr, "%s: COMMAND must be a string (got %s)\n", action, LSummarize(call->car)); return Lnil; } command = LSTRINGVAL(call->car); /* any remaining args are the command's args */ cargs = call->cdr; if ( (i=funcindex(command)) < 0 ) { fprintf(stderr, "%s: no such command \"%s\"\n", action,command); return Lnil; } filter = FilterList(cargs); if (strcmp(action, "interest")==0) { new = NewInterest(); new->lake = lake; new->filter = filter; AppendInterest(&(functable[i].interested), new); } else { RemoveInterests(&(functable[i].interested), lake, 1, filter); LListFree(filter); } return Lt; } static void RemoveInterests(LInterest **interest, Lake *lake, int usefilter, LList *filter) { LInterest *rest; while (*interest) { if (InterestMatch(*interest, lake, usefilter, filter)) { rest = (*interest)->next; DeleteInterest(*interest); *interest = rest; } else { interest = &((*interest)->next); } } } void RemoveLakeInterests(Lake *lake) { int i; for (i=0; ilake != lake) return false; if (!usefilter) return true; ifilter = interest->filter; while (filter) { if (!ifilter) return false; if (!FilterMatch(LFILTERVAL(filter->car), LFILTERVAL(ifilter->car))) return false; filter = filter->cdr; ifilter = ifilter->cdr; } if (ifilter) return false; return true; } static bool FilterMatch(LFilter *f1, LFilter *f2) { if (f1 && !f2) return false; if (f2 && !f1) return false; if (!f1 && !f2) return true; if (f1->flag != f2->flag) return false; switch (f1->flag) { case ANY: case NIL: return true; case VAL: if (f1->value->type != f2->value->type) return false; return LMATCH(f1->value->type)( &(f1->value->cell), &(f2->value->cell) ); default: OOGLError(0,"invalid filter flag value. Please report this."); return false; } } static void DeleteInterest(LInterest *interest) { if (interest) { if (interest->filter) LListFree(interest->filter); OOGLFree(interest); } } static LInterest *NewInterest() { LInterest *new = OOGLNewE(LInterest, "interest"); new->filter = NULL; new->next = NULL; return new; } static void AppendInterest(LInterest **head, LInterest *new) { if (!head) { OOGLError(0,"Null head pointer in AppendInterest"); return; } while (*head) head = &((*head)->next); *head = new; } static LList *FilterList(LList *args) { LList *filterlist; LFilter *filter; if (!args) return NULL; filterlist = NULL; while (args) { if (!args->car) { OOGLError(1,"FilterList internal error"); return NULL; } if ( (strcmp(LSTRINGVAL(args->car),"*")==0) || (args->car==Lt) ) { filterlist = LListAppend(filterlist, LRefIncr(LFAny)); } else if ( (strcmp(LSTRINGVAL(args->car),"nil")==0) || (args->car==Lnil) ) { filterlist = LListAppend(filterlist, LRefIncr(LFNil)); } else { filter = OOGLNew(LFilter); filter->flag = VAL; filter->value = LRefIncr(args->car); filterlist = LListAppend(filterlist, LNew(LFILTER, &filter)); } args = args->cdr; } return filterlist; } static bool FilterArgMatch(LList *filter, LList *args) { int filterflag; LObject *filterobj; LCell filterval, argval; while (args) { if (filter) { filterflag = LFILTERVAL(filter->car)->flag; filterobj = LFILTERVAL(filter->car)->value; filter=filter->cdr; } else filterflag = ANY; switch (filterflag) { case VAL: LFROMOBJ(args->car->type)(args->car, &argval); LFROMOBJ(args->car->type)(filterobj, &filterval); if (! LMATCH(args->car->type)(&filterval, &argval)) return false; break; case ANY: case NIL: break; } args = args->cdr; } return true; } static void InterestOutput(char *name, LList *args, LInterest *interest) { Lake *lake = interest->lake; FILE *outf = lake->streamout; LList *filter = interest->filter; char *suffix = NULL; int filterflag; float now = 0.0; if (!outf) return; if(lake->timing_interests && (now = PoolTimeAt(POOL(lake), NULL)) > lake->nexttime) { if(lake->initial) { fprintf(outf, lake->initial, now,now,now); free(lake->initial); lake->initial = NULL; } if(lake->prefix) fprintf(outf, lake->prefix, now,now,now); suffix = lake->suffix; } fprintf(outf, "(%s", name); /* first remove any hidden lake arg */ if (args && args->car && args->car->type == LLAKE) args = args->cdr; while (args) { if (filter) { filterflag = LFILTERVAL(filter->car)->flag; filter=filter->cdr; } else filterflag = ANY; switch (filterflag) { case VAL: case ANY: fputc(' ', outf); LWrite(outf, args->car); break; case NIL: fprintf(outf, " nil"); break; } args = args->cdr; } fprintf(outf, ")\n"); if(suffix) fprintf(outf, suffix, now,now,now); fflush(outf); } LDEFINE(regtable, LVOID, "(regtable) --- shows the registry table") { int i; Lake *outlake; FILE *outf; LInterest *interest; LDECLARE(("regtable", LBEGIN, LLAKE, &outlake, LEND)); outf = outlake->streamout; for (i=0; ifilter); fprintf(outf, "\n"); fflush(outf); interest = interest->next; } fprintf(outf, "\n"); } } return Lt; } static void compile(char *str, pattern *p) { int n; char *rest, *tail; strncpy(p->p0, str, MAXPATLEN-1); p->p0[MAXPATLEN-1] = '\0'; for(rest = p->p0, n = 0; (tail = strchr(rest, '*')) && n < MAXPAT; n++) { p->pat[n] = rest; p->len[n] = tail-rest; *tail = '\0'; rest = tail+1; } p->pat[n] = rest; p->len[n] = strlen(rest); p->n = n; } /* Keep the first line unchanged and wrap the remaining lines to 80 * chars with 8 chars indent on the left. */ static void print_help_formatted(FILE *outf, char *message) { char *nl; int printed, wordlen, nnl; /* print the first line unchanged */ if ((nl = strchr(message, '\n')) && message[0]=='(') { fprintf(outf, "%.*s", (int)(nl - message), message); } if (!nl) { return; } message = nl+1; while (*message) { fprintf(outf, "\n "); printed = 7; while (*message && printed < 72) { nnl = 0; /* keep \n\n as hard line break marker */ while (isspace(*message)) { if (*message++ == '\n') { ++nnl; } if (nnl == 2) { fprintf(outf, "\n "); printed = 7; /* use \n\n\t\t\t as indentation hint */ while (*message == '\t') { fprintf(outf, " "); printed += 8; message++; } nnl = 0; } } wordlen = 0; while (message[wordlen] && !isspace(message[wordlen])) { wordlen++; } if (printed + wordlen < 72) { printed += wordlen+1; putc(' ', outf); while (wordlen--) { putc((int)*message++, outf); } } else { break; } } } putc('\n', outf); fflush(outf); } static bool match(char *str, pattern *p) { int i; char *rest; if(strncmp(str, p->pat[0], p->len[0])) return false; /* Failed */ rest = str + p->len[0]; for(i = 1; i <= p->n; i++) { if(p->len[i]) { if((rest = strstr(rest, p->pat[i])) == NULL) break; rest += p->len[i]; } } return i > p->n && rest && (p->len[p->n] == 0 || *rest == '\0') ? 1 : 0; } void LHelpDef(char *key, char *message) { Help **h = &helps; Help *new = OOGLNew(Help); /* insertion sort... */ while (*h && (*h)->key && (strcmp(key,(*h)->key)>0)) h = &((*h)->next); new->key = key; new->message = message; new->next = *h; *h = new; } void LHelpRedef(char *key, char *message) { Help *h; for(h = helps; h != NULL; h = h->next) if(strcmp(key, h->key) == 0) { h->message = message; return; } LHelpDef(key, message); } LDEFINE(help, LVOID, "(help [command])\n\ Command may include \"*\"s as wildcards; see also \"??\"\n\ One-line command help; lists names only if multiple commands match.") { char *pat = "*"; char *nl; pattern p; int seen = 0; Help *h, *last = NULL; Lake *brownie; FILE *outf; LDECLARE(("help", LBEGIN, LLAKE, &brownie, LOPTIONAL, LSTRING, &pat, LEND)); if((outf = brownie->streamout) == NULL) outf = stdout; compile(pat, &p); for(h=helps; h!=NULL; h=h->next) { if(match(h->key, &p)) { if(++seen >= 2) { if(seen == 2) fprintf(outf,"%-15s ", last->key); fprintf(outf, seen%4 ? "%-15s " : "%s\n", h->key); } last = h; } } switch(seen) { default: if(seen%4) fprintf(outf, "\n"); break; case 0: fprintf(outf, nomatch, pat); break; case 1: nl = strchr(last->message, '\n'); fprintf(outf, "%.*s\n", (int)(nl && last->message[0]=='(' ? nl - last->message : 9999), last->message); break; } fflush(outf); return Lt; } LDEFINE(morehelp, LVOID, "(morehelp command) \"command\" may include \"*\" wildcards\n\ Prints more info than \"(help command)\"") { char *pat; pattern p; int seen = 0; Help *h; Lake *cedar; FILE *outf; LDECLARE(("morehelp", LBEGIN, LLAKE, &cedar, LSTRING, &pat, LEND)); if((outf = cedar->streamout) == NULL) outf = stdout; compile(pat, &p); for(h=helps; h!=NULL; h=h->next) { if(match(h->key, &p)) { #if 0 fprintf(outf, "%s\n", h->message); #else print_help_formatted(outf, h->message); #endif seen++; } } if(seen==0) fprintf(outf, nomatch, pat); fflush(outf); return Lt; } LInterest *LInterestList(char *funcname) { int index = funcindex(funcname); if (index == REJECT) return NULL; return functable[index].interested; } char *LakeName(Lake *lake) { return lake ? PoolName(lake->river) : NULL; } char *LSummarize(LObject *obj) { int len; static FILE *f; static char *summary; if(f == NULL) { f = tmpfile(); if(f == NULL) { return strdup("???"); } } rewind(f); LWrite(f, obj); fflush(f); len = ftell(f); rewind(f); if(len >= 80) len = 79; if(summary) free(summary); summary = malloc(len+1); summary[len] = '\0'; fread(summary, len, 1, f); if(len >= 79) strcpy(summary+75, " ..."); return summary; } /************************************************************************/ /* * unsigned long object implementation */ static bool ulongfromobj(LObject *obj, unsigned long *x) { if (obj->type == LSTRING) { char *cp = LSTRINGVAL(obj); if (cp[0]=='n' && cp[1]=='i' && cp[2]=='l' && cp[3]=='\0') *x = 0; else { *x = strtol(cp, &cp, 0); return cp != LSTRINGVAL(obj) ? 1 : 0; } } else if (obj->type == LULONG) { *x = LULONGVAL(obj); } else return false; return true; } static LObject *ulong2obj(unsigned long *x) { return LNew( LULONG, x ); } static void ulongfree(unsigned long *x) {} static bool ulongmatch(unsigned long *a, unsigned long *b) { return *a == *b; } static void ulongwrite(FILE *fp, unsigned long *x) { fprintf(fp, "%1lu", *x); } static void ulongpull(va_list *a_list, unsigned long *x) { *x = va_arg(*a_list, unsigned long); } LObject *ulongparse(Lake *lake) { /* parse the next thing from the lake */ LObject *obj = LSexpr(lake); /* if it's a string, promote it to a ulong, otherwise leave it as it is */ if (obj->type == LSTRING) { char *cp = LSTRINGVAL(obj); unsigned long val = strtol(cp, &cp, 0); if(cp != LSTRINGVAL(obj)) { /* if valid ulong */ free(LSTRINGVAL(obj)); obj->type = LULONG; obj->cell.ul = val; } } return obj; } LType LULongp = { "unsigned long", sizeof(unsigned long), ulongfromobj, ulong2obj, ulongfree, ulongwrite, ulongmatch, ulongpull, ulongparse, LTypeMagic }; /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/oogl/lisp/lisp.h0000644000175000001440000001723410624023745014662 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef LISP_H #define LISP_H #include #include "ooglutil.h" #include "fsa.h" #include "streampool.h" typedef struct LType LType; typedef struct LObject LObject; typedef union { int i; float f; void *p; unsigned long ul; } LCell; struct LType { /* name of type */ char *name; /* size of corresponding C type */ int size; /* extract cell value from obj */ bool (*fromobj)(/* LObject *obj, void *x */); /* create a new LObject of this type */ LObject *(*toobj)(/* void *x */); /* free a cell of this type */ void (*free)(/* void *x */); /* write a cell value to a stream */ void (*write)(/* FILE *fp, void *x */); /* test equality of two cells of this type */ bool (*match)(/* void *a, void *b */); /* pull a cell value from a va_list */ void (*pull)(/* va_list *a_list, void *x */); /* parse an object of this type */ LObject *(*parse)(/* Lake *lake */); /* magic number; always set to LTypeMagic */ int magic; }; #define LTypeMagic 314159 #define LNAME(type) (type->name) #define LSIZE(type) (type->size) #define LFROMOBJ(type) (*(type->fromobj)) #define LTOOBJ(type) (*(type->toobj)) #define LFREE(type) (*(type->free)) #define LMATCH(type) (*(type->match)) #define LWRITE(type) (*(type->write)) #define LPULL(type) (*(type->pull)) #define LPARSE(type) (*(type->parse)) struct LObject { LType *type; int ref; LCell cell; }; typedef struct Lake { IOBFILE *streamin; FILE *streamout; Pool *river; int timing_interests; /* Are we time-stamping interest reports? */ float deltatime; /* delta time between timestamps */ float nexttime; /* Pool time when next timestamp'll be needed */ char *initial, *prefix, *suffix; /* printf format strings */ } Lake; #define LakeMore(lake,c) ((c=iobfnextc(lake->streamin,0)) != ')' && c != EOF) #define POOL(lake) ((lake)->river) typedef struct LList { LObject * car; struct LList *cdr; } LList; typedef LObject *(*LObjectFunc)(); typedef struct LInterest { Lake *lake; LList *filter; struct LInterest *next; } LInterest; typedef struct { enum { ANY, /* match anything */ VAL, /* match only our value */ NIL /* match anything but report nil */ } flag; LObject *value; } LFilter; #define LFILTERVAL(lobject) ((LFilter *)(lobject->cell.p)) extern LType LFilterp; #define LFILTER (&LFilterp) /* * Built-in objects: Lnil and Lt: */ extern LObject *Lnil, *Lt; /* * Built-in object types: string, list, and function. Function type * is only used internally. See lisp.c for the code that initializes * these type pointers. */ extern LType LStringp; #define LSTRING (&LStringp) #define LSTRINGVAL(obj) ((char*)((obj)->cell.p)) extern LType LIntp; #define LINT (&LIntp) #define LINTVAL(obj) ((obj)->cell.i) extern LType LULongp; #define LULONG (&LULongp) #define LULONGVAL(obj) ((obj)->cell.ul) extern LType LFloatp; #define LFLOAT (&LFloatp) #define LFLOATVAL(obj) ((obj)->cell.f) extern LType LListp; #define LLIST (&LListp) #define LLISTVAL(obj) ((LList*)((obj)->cell.p)) #define LLAKEVAL(obj) ((Lake*)(obj->cell.p)) extern LType LLakep; #define LLAKE (&LLakep) extern LType LObjectp; #define LLOBJECT (&LObjectp) /* * Function definition stuff: */ enum lparseresult { LASSIGN_GOOD, LASSIGN_BAD, LPARSE_GOOD, LPARSE_BAD }; typedef enum lparseresult LParseResult; #define LDECLARE(stuff) \ switch (LParseArgs stuff) { \ case LASSIGN_BAD: case LPARSE_BAD: return Lnil; \ case LPARSE_GOOD: return Lt; \ default: case LASSIGN_GOOD: break; \ } extern LType Larray; #define LARRAY (&Larray) extern LType Lvararray; #define LVARARRAY (&Lvararray) extern LType Lend; #define LEND (&Lend) extern LType Lhold; #define LHOLD (&Lhold) extern LType Lliteral; #define LLITERAL (&Lliteral) extern LType Loptional; #define LOPTIONAL (&Loptional) extern LType Lrest; #define LREST (&Lrest) /* * Function prototypes: */ void RemoveLakeInterests(Lake *lake); void LInit(); Lake * LakeDefine(IOBFILE *streamin, FILE *streamout, void *river); void LakeFree(Lake *lake); LObject * _LNew(LType *type, LCell *cell); #define LNew(type,cell) _LNew(type,(LCell*)(void *)cell) LObject * LRefIncr(LObject *obj); void LRefDecr(LObject *obj); void LWrite(FILE *fp, LObject *obj); void LFree(LObject *obj); LObject * LCopy(LObject *obj); LObject * LSexpr(Lake *lake); LObject * LEvalSexpr(Lake *lake); LObject * LEval(LObject *obj); LList * LListNew(); LList * LListAppend(LList *list, LObject *obj); void LListFree(LList *list); LList * LListCopy(LList *list); LObject * LListEntry(LList *list, int n); int LListLength(LList *list); LParseResult LParseArgs(char *name, Lake *lake, LList *args, ...); bool LDefun(char *name, LObjectFunc func, char *help); void LListWrite(FILE *fp, LList *list); LInterest * LInterestList(char *funcname); LObject * LEvalFunc(char *name, ...); bool LArgClassValid(LType *type); void LHelpDef(char *key, char *message); void LHelpRedef(char *key, char *newmessage); char * LakeName(Lake *lake); char * LSummarize(LObject *obj); LObject * LMakeArray(LType *basetype, char *data, int count); void LShow(LObject *obj); /* for debugging; writes obj to stderr */ void LListShow(LList *list); void LWriteFile(char *fname, LObject *obj); #include "clisp.h" /* LDEFINE(name, ltype, doc) is the header used to declare a lisp function. It should be followed by the body of a function (beginning with '{' and ending with '}'). LDEFINE delcares the function's name to be "Lname" (the "name" argument with "L" prepended to it). It also defines a string named "Hname" initialized to "doc". The "ltype" argument gives the lisp object type returned by the function (all functions defined via DEFILE *must* return a lisp object.) LDEFINE actually ignores this but read the next paragraph. LDEFINE is intended for use in conjunction with the "lisp2c" shell script which searches for calls to LDEFINE and builds a C language interface to the functions so defined. This script makes use of all 3 arguments to LDEFINE, plus the use of the LDECLARE macro in the function body that follows, to build the files clang.c and clang.h. It makes certain assumptions about the way LDEFINE and LDECLARE are used. See the comments at the top of lisp2c for details. (I don't want to write the assumptions down here because if they change I'll forget to update this comment!). */ #if defined(__STDC__) || defined(__ANSI_CPP__) #define LDEFINE( name, ltype, doc ) \ char H##name[] = doc ; LObject *L##name(Lake *lake, LList *args) #else #define LDEFINE( name, ltype, doc ) \ char H/**/name[] = doc ; LObject *L/**/name(Lake *lake, LList *args) #endif #define LBEGIN lake, args #endif /* ! LISP_H */ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/oogl/lisp/lisp2c0000754000175000001440000001761010624027241014654 00000000000000#! /bin/sh ######################################################################## # usage: lisp2c [-cprefix prefix] -o OUTFILE [ FILE1 ... ] # # writes OUTFILE.c and OUTFILE.h, if results would differ from # existing files of those names. # # If -cprefix is specified, uses "prefix_" as the prefix for C # function names. Default prefix is "l_". # # This script scans the input files, or standard input if no input # files are specified, generating a C interface to each lisp function # defined via the "DEFINE" and "LDECLARE" macros (defined in # geomview's "lispext.h" file). It assumes usage of the following # form in the input files: # # DEFINE(name, ltype, # docstring) # { # # LDECLARE(("lname", LBEGIN, # , # ..., # LEND)); # ... # return L...; # } # # Specifically: # # # 1. The first line of the call to DEFINE must contain exactly, in # this order: # 1.1. the word DEFINE # 1.2. a left paren # 1.3. a name which is a valid C identifier. There must be no # spaces between the left paren and the name. This name with # an "L" prepended becomes the name of the low-level C # procedure (the one whose body follows the DEFINE call), # and with a "l_" prepended becomes the name of the C # interface to the corresponding lisp function (unless an # alternate prefix is specified with the -cprefix argument # to this script). # 1.4 a comma (possibly preceeded and/or followed by spaces or # tabs) # 1.5 a lisp type name (like LINT or LGEOM etc) which indicates # the type of the lisp object returned by this function. # 1.6 a comma (possibly preceeded and/or followed by spaces or # tabs) # # 2. The rest of the DEFINE call consists of the docstring argument, # which must be a single string and may be broken over any number # of lines. # # # 3. The first line of the call to LDECLARE must contain, in this order: # 1.1. the word LDECLARE # 1.2. two left parens # 1.3. a string which becomes the lisp name of the function # 1.4 a comma (possibly preceeded and/or followed by spaces or # tabs) # 1.5 the word LBEGIN # 1.6 a comma (possibly preceeded and/or followed by spaces or # tabs) # # 4. Intermediate lines of the LDECLARE call must contain one # per line; where is either the word LOPTIONAL # or something with the syntax # # [ modifier, ] ltype, address # # where modifier is one of LHOLD or LLITERAL, ltype is a lisp type # name, and address is the address of a local variable into which # the corresponding argument's value is to be loaded. Any # arguments following LOPTIONAL are taken to be optional. # # 5. The last line of the LDECLARE call must contain just the string # "LEND));" possibly preceeded by spaces or tabs. # # This script generates the C interface (consisting of the function # declaration in OUTFILE.h and the function itself in OUTFILE.c) only # for functions which use both the DEFINE and LDECLARE macros. To # prevent the generation of a C interface for a particular function, # preceed the word LDECLARE by a comment on the same line, as in: # # # /*NOC*/ LDECLARE(("foo, LBEGIN, # # The contents of the comment are irrelvant; its purpose is simply # to arrange that LDECLARE is not the first thing on its line. cprefix="l_" ; outfile="" while : ; do case $1 in -cprefix) cprefix=$2 ; shift 2 ; ;; -o) outfile=$2 ; outstem=`basename $outfile` shift 2 ; ;; *) break ; ;; esac done cfile=/tmp/lisp2c.out.c hfile=/tmp/lisp2c.out.h /bin/rm -f $cfile $hfile # start with an empty .h file in case the awk script below doesn't # output anything to it: touch $hfile cat $* | # first turn all parens, semicolons, and commas into spaces tr '();,' ' ' | # now let awk do its thing awk ' BEGIN { cprefix="'$cprefix'" ; outfile="'$outfile'" ; outstem="'$outstem'" ; hfile="'$hfile'" ; fcount = 0 ; inldeclare=0 ; type["LINT"] = "int" ; type["LULONG"] = "unsigned long" ; type["LFLOAT"] = "float" ; type["LSTRING"] = "char *" ; type["LLIST"] = "LList *" ; type["LLOBJECT"] = "LObject *" ; type["LID"] = "int" ; type["LKEYWORD"] = "int" ; type["LSTRINGS"] = "char *" ; type["LGEOM"] = "GeomStruct *" ; type["LCAMERA"] = "CameraStruct *" ; type["LWINDOW"] = "WindowStruct *" ; type["LAP"] = "ApStruct *" ; type["LTRANSFORM"] = "TransformStruct *" ; type["LTRANSFORMN"] = "TmNStruct *" ; type["LVOID"] = "void" ; type["LREST"] = "LList *" ; } $1 == "LDEFINE" { fstem = $2 ; # stem from which function names are built ftype = $3 ; # functions return type next ; } $1 == "LDECLARE" { name = substr($2,2,length($2)-2) ; # lisp function name inldeclare=1 ; lakearg = 0; argc = 0 ; next } $NF == "LEND" || atend == 1 { if (inldeclare) { # remember data for this function ++fcount; cname = cprefix fstem ; fstems[fcount] = fstem ; cnames[fcount] = cname ; names[fcount] = name ; # build the declaration dec = sprintf("%s %s(", type[ftype], cname); for (i=1; i<=argc; ++i) { if (i>1) dec = dec sprintf(", "); if (arg[i] == "LARRAY") { dec = dec sprintf("%s *a%1d, int a%1dn", type[basetype[i]], i, i); } else if (arg[i] == "LVARARRAY") { dec = dec sprintf("%s *a%1d, int a%1dn", type[basetype[i]], i, i); } else { if (type[arg[i]] != "") dec = dec sprintf("%s ", type[arg[i]]); else dec = dec sprintf("??? "); dec = dec sprintf("a%1d", i); } } dec = dec sprintf(")"); # print the declaration, possibly also in header file printf "%s\n", dec ; if (outfile != "") printf "%s;\n", dec > hfile ; # print the function body printf "{\n" ; printf " LObject *val = LEvalFunc(\"%s\",\n", name ; for (i=1; i<=argc; ++i) { if (arg[i] == "LARRAY") { printf "\t\t\t LARRAY, %s, a%1d, a%1dn,\n", basetype[i], i, i ; } else if (arg[i] == "LVARARRAY") { printf "\t\t\t LVARARRAY, %s, a%1d, a%1dn,\n", basetype[i], i, i ; } else { printf "\t\t\t %s, a%1d,\n", arg[i], i ; } } printf "\t\t\t LEND);\n" if (type[ftype] != "void") { printf " %s retval;\n", type[ftype] ; printf " LFROMOBJ(%s)(val, &retval);\n", ftype ; } printf " LFree(val);\n" if (type[ftype] != "void") printf " return retval;\n" printf "}\n\n" inldeclare=0 ; atend = 0; next } } { if (inldeclare) { i = 1; while (i <= NF) { if ($i == "LLAKE") { lakearg = 1; next; } else if ($i == "LOPTIONAL") { ++i; continue; } else if ($i == "LHOLD") { ++i; continue; } else if ($i == "LLITERAL") { ++i; continue; } else if ($i == "LARRAY" || $i == "LVARARRAY") { ++argc ; arg[argc] = $i; ++i; basetype[argc] = $i; next; } else if ($i == "LREST") { ++argc; arg[argc] = $i ; atend = 1; next ; } else { ++argc ; arg[argc] = $i ; next ; } } } } END { printf "\n" ; for (i=1; i<=fcount; ++i) { printf "extern LObject *L%s(Lake *, LList *);\n", fstems[i] ; } printf "\n" ; for (i=1; i<=fcount; ++i) { printf "extern char H%s[];\n", fstems[i] ; } printf "\n" ; printf "\nvoid %s_init()\n{\n", outstem ; for (i=1; i<=fcount; ++i) { printf " LDefun(\"%s\", L%s, H%s);\n", names[i], fstems[i], fstems[i] ; } printf "}\n\n" ; } ' | # and send output to "outfile.c" if -o specified, otherwise # to standard output if [ "$outfile" != "" ] ; then cat > $cfile ; if [ -f $cfile ] && cmp $cfile $outfile.c 1>&- 2>&- ; then : # no change to $outfile.c else /bin/rm -f $outfile.c ; /bin/mv $cfile $outfile.c echo $outfile.c fi if [ -f $hfile ] && cmp $hfile $outfile.h 1>&- 2>&- ; then : # no change to $outfile.h else /bin/rm -f $outfile.h ; /bin/mv $hfile $outfile.h echo $outfile.h fi else cat ; fi /bin/rm -f $cfile $hfile geomview-1.9.4/src/lib/oogl/lisp/Headers0000644000175000001440000000001710624016165015025 00000000000000clisp.h lisp.h geomview-1.9.4/src/lib/oogl/lisp/clisp.c0000644000175000001440000001210510510720454015003 00000000000000LObject * l_quote(LObject * a1) { LObject *val = LEvalFunc("quote", LLOBJECT, a1, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_if(LObject * a1, LObject * a2, LObject * a3) { LObject *val = LEvalFunc("if", LLOBJECT, a1, LLOBJECT, a2, LLOBJECT, a3, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } int l_not(LObject * a1) { LObject *val = LEvalFunc("not", LLOBJECT, a1, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } LObject * l_or(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("or", LLOBJECT, a1, LLOBJECT, a2, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } int l_and(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("and", LLOBJECT, a1, LLOBJECT, a2, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } int l_greater(LObject * a1, LObject * a2) { LObject *val = LEvalFunc(">", LLOBJECT, a1, LLOBJECT, a2, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } int l_less(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("<", LLOBJECT, a1, LLOBJECT, a2, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } int l_equal(LObject * a1, LObject * a2) { LObject *val = LEvalFunc("=", LLOBJECT, a1, LLOBJECT, a2, LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } int l_sgi() { LObject *val = LEvalFunc("sgi", LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } int l_NeXT() { LObject *val = LEvalFunc("NeXT", LEND); int retval; LFROMOBJ(LINT)(val, &retval); LFree(val); return retval; } LObject * l_progn(LList * a1) { LObject *val = LEvalFunc("progn", LREST, a1, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_car(LList * a1) { LObject *val = LEvalFunc("car", LLIST, a1, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } LObject * l_cdr(LList * a1) { LObject *val = LEvalFunc("cdr", LLIST, a1, LEND); LObject * retval; LFROMOBJ(LLOBJECT)(val, &retval); LFree(val); return retval; } void l_interest(LList * a1) { LObject *val = LEvalFunc("interest", LLIST, a1, LEND); LFree(val); } void l_uninterest(LList * a1) { LObject *val = LEvalFunc("uninterest", LLIST, a1, LEND); LFree(val); } void l_time_interests(float a1, char * a2, char * a3, char * a4) { LObject *val = LEvalFunc("time-interests", LFLOAT, a1, LSTRING, a2, LSTRING, a3, LSTRING, a4, LEND); LFree(val); } void l_regtable() { LObject *val = LEvalFunc("regtable", LEND); LFree(val); } void l_help(char * a1) { LObject *val = LEvalFunc("help", LSTRING, a1, LEND); LFree(val); } void l_morehelp(char * a1) { LObject *val = LEvalFunc("morehelp", LSTRING, a1, LEND); LFree(val); } extern LObject *Lquote(Lake *, LList *); extern LObject *Lif(Lake *, LList *); extern LObject *Lnot(Lake *, LList *); extern LObject *Lor(Lake *, LList *); extern LObject *Land(Lake *, LList *); extern LObject *Lgreater(Lake *, LList *); extern LObject *Lless(Lake *, LList *); extern LObject *Lequal(Lake *, LList *); extern LObject *Lsgi(Lake *, LList *); extern LObject *LNeXT(Lake *, LList *); extern LObject *Lprogn(Lake *, LList *); extern LObject *Lcar(Lake *, LList *); extern LObject *Lcdr(Lake *, LList *); extern LObject *Linterest(Lake *, LList *); extern LObject *Luninterest(Lake *, LList *); extern LObject *Ltime_interests(Lake *, LList *); extern LObject *Lregtable(Lake *, LList *); extern LObject *Lhelp(Lake *, LList *); extern LObject *Lmorehelp(Lake *, LList *); extern char Hquote[]; extern char Hif[]; extern char Hnot[]; extern char Hor[]; extern char Hand[]; extern char Hgreater[]; extern char Hless[]; extern char Hequal[]; extern char Hsgi[]; extern char HNeXT[]; extern char Hprogn[]; extern char Hcar[]; extern char Hcdr[]; extern char Hinterest[]; extern char Huninterest[]; extern char Htime_interests[]; extern char Hregtable[]; extern char Hhelp[]; extern char Hmorehelp[]; void clisp_init() { LDefun("quote", Lquote, Hquote); LDefun("if", Lif, Hif); LDefun("not", Lnot, Hnot); LDefun("or", Lor, Hor); LDefun("and", Land, Hand); LDefun(">", Lgreater, Hgreater); LDefun("<", Lless, Hless); LDefun("=", Lequal, Hequal); LDefun("sgi", Lsgi, Hsgi); LDefun("NeXT", LNeXT, HNeXT); LDefun("progn", Lprogn, Hprogn); LDefun("car", Lcar, Hcar); LDefun("cdr", Lcdr, Hcdr); LDefun("interest", Linterest, Hinterest); LDefun("uninterest", Luninterest, Huninterest); LDefun("time-interests", Ltime_interests, Htime_interests); LDefun("regtable", Lregtable, Hregtable); LDefun("help", Lhelp, Hhelp); LDefun("morehelp", Lmorehelp, Hmorehelp); } geomview-1.9.4/src/lib/oogl/lisp/clisp.h0000644000175000001440000000120010510720454015002 00000000000000LObject * l_quote(LObject * a1); LObject * l_if(LObject * a1, LObject * a2, LObject * a3); int l_not(LObject * a1); LObject * l_or(LObject * a1, LObject * a2); int l_and(LObject * a1, LObject * a2); int l_greater(LObject * a1, LObject * a2); int l_less(LObject * a1, LObject * a2); int l_equal(LObject * a1, LObject * a2); int l_sgi(); int l_NeXT(); LObject * l_progn(LList * a1); LObject * l_car(LList * a1); LObject * l_cdr(LList * a1); void l_interest(LList * a1); void l_uninterest(LList * a1); void l_time_interests(float a1, char * a2, char * a3, char * a4); void l_regtable(); void l_help(char * a1); void l_morehelp(char * a1); geomview-1.9.4/src/lib/oogl/util/0000777000175000001440000000000010665240671013631 500000000000000geomview-1.9.4/src/lib/oogl/util/fsa.c0000644000175000001440000002305510455754251014470 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Id: fsa.c,v 1.4 2006/07/14 17:47:21 rotdrop Exp $ * * fsa.c: finite state automaton for matching a finite set of strings * * The procedures in this file are documented in the manual page fsa.1, * a formatted copy of which is in ../../../doc/fsa.man. * * Mark Phillips * April 17, 1989: originally written * Nov 18 1991: modified to allow > 1 fsa */ #include #include "ooglutil.h" /* size of blocks in which to allocate state nodes */ #define BLKSIZ 5 /* Special states and flags */ #define ACCEPT -1 #define REJECT -2 #define ERROR -3 /* Operation flags */ #define PROGRAM 1 #define PARSE 2 typedef struct Trule_s { char c; /* char for this rule */ int ns; /* state to switch to */ struct Trule_s *next; /* ptr to next rule for this state */ } Trule; typedef struct State_s { Trule *tlist; /* list of transition rules for this state */ void *return_value; /* value to return if we end in this state */ } State; struct Fsa_s { State **state; int state_count; void *reject_value; int initial_state; void *return_value; }; /* This must be included *after* the typedef struct Fsa_s above: */ #include "fsa.h" static Trule *new_trule_node(Fsa, int); static void *fsa_execute(Fsa, char *, void *, int); static int next_state(Fsa, int, char, void *, int); static int new_state(Fsa); static void delete_trule_list(Trule *); /*----------------------------------------------------------------------- * Function: fsa_initialize * Description: Initialize an FSA * Args IN: fsa: the fsa to initialize; if NULL, a new one is created * reject: value to return when parsing unacceptable * string */ Fsa fsa_initialize(Fsa fsa,void *reject) { if (fsa == NULL) fsa = OOGLNewE(struct Fsa_s, "struct Fsa"); else { /* Clear out current program: */ while (fsa->state_count--) { delete_trule_list( (fsa->state[fsa->state_count])->tlist ); OOGLFree((char*)(fsa->state[fsa->state_count])); } OOGLFree((char*)(fsa->state)); } fsa->state_count = 0; fsa->reject_value = reject; fsa->initial_state = new_state(fsa); return fsa; } /*----------------------------------------------------------------------- * Function: fsa_install * Description: Install a string in an FSA * Args IN: fsa: the fsa to install into * s: the string to install * v: the value to return when s is parsed * Returns: v, unless there is not enough room in the FSA, in * which case the fsa's reject value is returned */ void * fsa_install(Fsa fsa,char *s,void *v) { return(fsa_execute(fsa, s, v, PROGRAM)); } /*----------------------------------------------------------------------- * Function: fsa_parse * Description: Parse a string * Args IN: fsa: the fsa to use * s: the string to parse * Returns: If s is acceptable, returns the value v that was * specified when s was installed with fsa_install(). If * v is not acceptable, returns the value of reject given * in the most recent call to fsa_initialize(). * Notes: */ void * fsa_parse(Fsa fsa, char *s) { return(fsa_execute(fsa, s, 0, PARSE)); } /*----------------------------------------------------------------------- * Function: fsa_execute * Description: parse or program (install) a string * Args IN: fsa: the fsa to use * s: the string * v: value to correspond to string * op: PROGRAM or PARSE * Returns: Result of parsing or installing. If op==PROGRAM, this * is always v, unless there is no more room in the FSA, * in which case it is the fsa' reject value. If op==PARSE, * it is either v, or the reject value. * * The philosophy of this procedure and procedure * next_state() is that programming the FSA and parsing a * string using the FSA are very similar processes; the * only difference is in what is done when there is no * rule for the current state corresponding to the * current input char. When parsing, we return a * rejection. When programming, we add a rule, and * possibly a new state. * * If op==PROGRAM, s is added to list of acceptable * strings, and the FSA is programmed to return v for s. * If op==PARSE, the FSA is executed and returns value * corresponding to s, or reject value if s is not * acceptable. */ static void * fsa_execute(Fsa fsa,char *s, void *v, int op) { int cs; /* current state */ if (s==NULL) return fsa->reject_value; cs = fsa->initial_state; fsa->return_value = fsa->reject_value; while ( (cs != ACCEPT) && (cs != REJECT) && (cs != ERROR) ) { cs = next_state(fsa, cs, *s, v, op); ++s; } return( (cs == ERROR) ? fsa->reject_value : fsa->return_value ); } /*----------------------------------------------------------------------- * Function: next_state * Description: Get the next state based on current state and char * Args IN: fsa: the fsa to use * cs: current state * c: current char * v: return value when programing * op: PROGRAM or PARSE * Returns: index of next state, or ERROR * Notes: If op==PROGRAM and no transition rule for c exists for * the current state, a new state is created and a * transition rule to that state is added to the current * state. * * See also comments for fsa_execute(). */ static int next_state(Fsa fsa, int cs, char c, void *v, int op) { Trule *t; /* Check tlist of current state for rule for c */ t = (fsa->state[cs])->tlist; while (t != NULL) { if (t->c == c) { /* We found rule for c; if next state is ACCEPT, set return value. */ /* Then return next state. */ if (t->ns == ACCEPT) { if (op==PROGRAM) fsa->return_value = (fsa->state[cs])->return_value = v; else fsa->return_value = (fsa->state[cs])->return_value; } return(t->ns); } t = t->next; } /* No rule for c present; if just parsing, return rejection */ if (op == PARSE) return(REJECT); /* Otherwise, add a rule for c to current state */ /* Install a rule node for c in current state's tlist */ t = new_trule_node(fsa, cs); if (t == NULL) return(ERROR); t->c = c; /* Now specify the next state for this rule */ if (c == '\0') { /* '\0' means end of a word, so set return value for this state */ /* to v and set the next state for this rule to ACCEPT */ fsa->return_value = (fsa->state[cs])->return_value = v; t->ns = ACCEPT; } else { /* Not '\0' means another char in word, so create a new state */ t->ns = new_state(fsa); if (t->ns == ERROR) return(ERROR); } return(t->ns); } /*----------------------------------------------------------------------- * Function: new_trule_node * Description: return a ptr to a new trule node in the tlist of a state * Args IN: fsa: the fsa to use * n: index of state to add node to * Returns: ptr to newly allowcated rule node */ static Trule * new_trule_node(Fsa fsa, int n) { Trule *t, *tnew; /* Allocate and initialize the node */ tnew = OOGLNewE(Trule, "Trule *"); if (tnew == NULL) return(NULL); tnew->c = '\1'; tnew->ns = REJECT; tnew->next = NULL; /* Install it in tlist of state n */ if (fsa->state[n]->tlist == NULL) { /* List is empty: */ fsa->state[n]->tlist = tnew; } else { /* List is not empty; set t = last node in list, then add tnew to end */ t = fsa->state[n]->tlist; while (t->next != NULL) t = t->next; t->next = tnew; } /* Return ptr to the new trule node */ return(tnew); } /*----------------------------------------------------------------------- * Function: new_state * Description: get a new state for an fsa * Args: fsa: the fsa to use * Returns: index (an int) of new state */ static int new_state(Fsa fsa) { if (fsa->state_count == 0) { fsa->state = OOGLNewNE(State *, BLKSIZ, "State *"); } else if ((fsa->state_count % BLKSIZ == 0)) { fsa->state = OOGLRenewNE(State *, fsa->state, (fsa->state_count/BLKSIZ+1)*BLKSIZ, "reallocating for State *"); } fsa->state[fsa->state_count] = OOGLNewE(State, "State"); if (fsa->state[fsa->state_count] == NULL) return(ERROR); fsa->state[fsa->state_count]->return_value = fsa->reject_value; fsa->state[fsa->state_count]->tlist = NULL; ++fsa->state_count; return(fsa->state_count-1); } /*----------------------------------------------------------------------- * Function: delete_trule_list * Description: Delete a trule list, freeing up its nodes * Args IN: tlist: ptr to first node in list */ static void delete_trule_list(Trule *tlist) { Trule *t; while (tlist != NULL) { t = tlist; tlist = tlist->next; OOGLFree((char*)t); } } geomview-1.9.4/src/lib/oogl/util/fsa.h0000644000175000001440000000222010455701007014453 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef FSA_H #define FSA_H typedef struct Fsa_s *Fsa; extern Fsa fsa_initialize(Fsa, void *); extern void *fsa_install(Fsa fsa,char *s,void *v); void *fsa_parse(); #endif /* ! FSA_H */ geomview-1.9.4/src/lib/oogl/util/ray.h0000644000175000001440000000217110455701007014502 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ typedef struct { Point3 o, d; Float dist; } Ray; extern void RayTransform( Ray *ray, Transform3 ); extern void RayNormalize( Ray *ray ); #define RAY_EPSILON 1e-5 geomview-1.9.4/src/lib/oogl/util/ooglutil.h0000644000175000001440000002630710600044566015556 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef OOGLUTILDEF #define OOGLUTILDEF #include #include #include "iobuffer.h" #ifdef _WIN32 # define M_PI 3.14159265358979323 extern int finite(double v); extern int strcasecmp(char *s1, char *s2); #endif /* * Definition so that (obsolete Irix 3) SGIs won't barf on member function prototypes. */ #ifdef no_prototypes #define P(foo) () #else #define P(foo) foo #endif #define COUNT(array) (sizeof(array)/sizeof(array[0])) /* * Public definitions for miscellaneous useful OOGL internal stuff. */ #define OOGLMagic(key, vers) (0x9c800000 | (((key)&0x7f)<<16) | ((vers)&0xffff) ) #define OOGLIsMagic(magic) (((magic) & 0xff800000) == 0x9c800000) /* * Memory allocation */ #ifndef OOG_NewP extern void *(*OOG_NewP)(size_t); #endif #ifndef OOG_RenewP extern void *(*OOG_RenewP)(void *, size_t); #endif #ifndef OOGLFree extern void (*OOGLFree)(void *); #endif #ifndef OOG_NewE extern void *OOG_NewE(int, char *); #endif #ifndef OOG_RenewE extern void *OOG_RenewE(void *, int, char *); #endif #define OOGLNew(t) (t *)OOG_NewP(sizeof(t)) #define OOGLNewN(t,N) (t *)OOG_NewP(sizeof(t)*(N)) #define OOGLRenewN(t,p,N) (t *)OOG_RenewP(p, sizeof(t)*(N)) #define OOGLRealloc(t,p) (t *)OOG_RenewP(p, sizeof(t)) #define OOGLNewE(t, errmsg) (t *)OOG_NewE(sizeof(t), errmsg) #define OOGLNewNE(t,N, errmsg) (t *)OOG_NewE(sizeof(t)*(N), errmsg) #define OOGLRenewNE(t,p,N, errmsg) (t *)OOG_RenewE(p, sizeof(t)*(N), errmsg) /* * Backward compatibility */ #define GeomNew(t) OOGLNew(t) #define GeomNewN(t,N) OOGLNewN(t,N) #define GeomFree(p) OOGLFree(p) #define GeomError OOGLError /* * Variable-sized arrays ("vectors"). Manipulates variables of type "vvec". * Maintains the data they point to, but doesn't allocate the vvec's themselves; * typical use might be * vvec myvec; * VVINIT(myvec, float, 10); * while( ... ) { * *VVAPPEND(myvec, float) = something; * } * for(i = 0; i < VVSIZE(myvec); i++) * ... VVEC(myvec, float)[i] ... * */ typedef struct vvec { char *base; /* The real data */ int count; /* Number of elements in use (indices 0..count-1) */ int allocated; /* Number of elements allocated */ int elsize; /* sizeof(element type) */ char dozero; /* Zero-fill all new elements */ char malloced; /* "base" has been malloced */ char spare1, spare2; /* for future extensions */ } vvec; /* * Macros take 'vvec' arguments, while functions take addresses of vvec's. * VVINIT() : initialize new empty array; first malloc will grab >= 'minelems'. * VVZERO() : request that all newly allocated elements be cleared to zeros * VVINDEX() : return address of index'th element, ensuring that it exists. * VVAPPEND() : increments array size, returning address of new last element * VVEC() : returns address of array base; VVEC()[i] is the i'th element * assuming that its existence was ensured by earlier call to * VVAPPEND() or VVINDEX() or vvneeds(). * VVCOUNT() : number of valid elements in array. Maintained by user. */ #define VVINIT(vv,type,minelems) vvinit(&(vv), sizeof(type), minelems) #define VVEC(vv, type) ((type *)((vv).base)) #define VVCOUNT(vv) (vv).count #define VVINDEX(vv,type,index) ((type *)vvindex(&(vv), (index))) #define VVAPPEND(vv, type) VVINDEX(vv, type, (vv).count++) /* Functions take addresses of vvec's. Besides the above, there are * vvtrim() : trim allocated but unused space (beyond VVCOUNT()'th element). * vvfree() : free malloced array. * vvneeds(): ensure that at least this many elements are allocated * vvzero() : all newly allocated elements will be filled with binary zeros * vvuse() : Use the given non-malloced buffer until more room is needed; * call vvuse() after vvinit() but before allocating anything. * vvcopy() : copies one vvec into another, allocating space in the * destination to accommodate the data and copying everything. */ extern void vvinit(vvec *v, int elsize, int minelems); extern void vvuse(vvec *v, void *buf, int allocated); extern void vvtrim(vvec *v); /* Trim allocated but unused data */ extern void vvfree(vvec *v); /* Free all malloced data */ extern void vvneeds(vvec *v, int needed); extern void *vvindex(vvec *v, int index); extern void vvzero(vvec *v); extern void vvcopy(vvec *src, vvec *dest); /* * Error handling */ extern char *_GFILE; /* Name of file where error is found */ extern int _GLINE; /* Line number in file where error is found */ extern int OOGL_Errorcode; /* Unique integer error code */ extern void OOGLWarn (char *fmt, ...); extern const char *sperrno(unsigned int); extern const char *sperror(void); /* Kludge for obtaining file name and line number of error: */ #define OOGLError (_GFILE= __FILE__, _GLINE=__LINE__,0)?0:_OOGLError extern int _OOGLError(int, char *fmt, ...); extern void OOGLSyntax(IOBFILE *, char *fmt, ...); /* Bit fields in error codes */ #define OE_VERBOSE 0x1 #define OE_FATAL 0x2 /* * File-I/O utility routines */ /* * int iobfnextc(IOBFILE *f, int flags) * Advances f to the next "interesting" character and * returns it. The returned char is ungetc'ed so the next getc() * will yield the same value. * Interesting depends on flags: * 0 : Skip blanks, tabs, newlines, and comments (#...\n). * 1 : Skip blanks, tabs, and comments, but newlines are interesting * (including the \n that terminates a comment). * 2 : Skip blanks, tabs, and newlines, but stop at #. * 3 : Skip blanks and tabs but stop at # or \n. * * int * iobfexpectstr(IOBFILE *file, char *string) * Expect the given string to appear immediately on file. * Return 0 if the complete string is found, * else the offset+1 of the last matched char within string. * The first unmatched char is ungetc'd. * * int * iobfexpecttoken(IOBFILE *file, char *string) * Expect the given string to appear on the file, possibly after * skipping some white space and comments. * Return 0 if found, else the offset+1 of last matched char in string. * The first unmatched char is ungetc'd. * * char *iobftoken(IOBFILE *f, int flags) * Skips uninteresting characters with fnextc(f, flags), * then returns a "token" - string of consecutive interesting characters. * Returns NULL if EOF is reached with no token, or if * flags specifies stopping at end-of-line and this is encountered with * no token found. * The token is effectively statically allocated and will be * overwritten by the next ftoken() call. * * int iobfgetnd(file, ndouble, doublep, binary) * Read an array of doubles from a file in "ascii" or "binary" format. * Returns number of doubles successfully read, should = nfloats. * "Binary" means "Bit-Endian IEEE 64-bit floating-point" format. * * int iobfgetnf(file, nfloats, floatp, binary) * Read an array of floats from a file in "ascii" or "binary" format. * Returns number of floats successfully read, should = nfloats. * "Binary" means "Big-Endian IEEE 32-bit floating-point" format. * * int iobfgetni(IOBFILE *file, int nints, int *intsp, int binary) * Read an array of ints from a file in "ascii" or "binary" format. * Returns number of ints successfully read, should = nints. * "Binary" means "32-bit big-endian" integer format. * * int iobfgetns(IOBFILE *file, int nshorts, short *intsp, int binary) * Read an array of shorts from a file in "ascii" or "binary" format. * Returns number of shorts successfully read, should = nints. * "Binary" means "16-bit big-endian" integer format. * * int iobfgettransform(IOBFILE *f, * int ntransforms, float *transforms, int binary) * Reads 4x4 matrices from IOBFILE. Returns the number of matrices found, * up to ntransforms. Returns 0 if no numbers are found. * On finding incomplete matrices (not a multiple of 16 floats) * returns -1, regardless of whether any whole matrices were found. * In ASCII (binary==0) mode, matrices are read in conventional order * which is the transpose of the internal form. Binary mode reads * 32-bit IEEE floats in internal order. * * int fputtransform(FILE *f, int ntransforms, float *transforms, int binary) * Writes 4x4 matrices to FILE. Returns the number written, i.e. * ntransforms unless an error occurs. See fgettransform() for format. * */ #define NODATA -2 /* async_fnextc() and async_getc() return NODATA if * none is immediately available */ extern int async_iobfgetc(IOBFILE *f); extern int async_iobfnextc(IOBFILE *f, int flags); extern char *iobfcontext(IOBFILE *f); extern char *iobfdelimtok(char *delims, IOBFILE *iobf, int flags); extern int iobfescape(IOBFILE *f); extern int iobfexpectstr(IOBFILE *iobf, char *str); extern int iobfexpecttoken(IOBFILE *iobf, char *str); extern int iobfgetnd(IOBFILE *f, int maxd, double *dv, int binary); extern int iobfgetnf(IOBFILE *f, int maxf, float *fv, int binary); extern int iobfgetni(IOBFILE *f, int maxi, int *iv, int binary); extern int iobfgetns(IOBFILE *f, int maxs, short *sv, int binary); extern int iobfgettransform(IOBFILE *iobf, int ntrans, float *trans, int bin); extern int iobfhasdata(IOBFILE *f); extern int iobfnextc(IOBFILE *f, int flags); extern char *iobftoken(IOBFILE *iobf, int flags); extern char *fdelimtok(char *delims, FILE *f, int flags); extern int fescape(FILE *f); extern int fexpectstr(FILE *f, char *str); extern int fexpecttoken(FILE *f, char *str); extern int fgetnd(FILE *f, int maxd, double *dv, int binary); extern int fgetnf(FILE *f, int maxf, float *fv, int binary); extern int fgetni(FILE *f, int maxi, int *iv, int binary); extern int fgetns(FILE *f, int maxs, short *sv, int binary); extern int fgettransform(FILE *f, int ntrans, float *trans, int bin); extern int fnextc(FILE *f, int flags); extern char *ftoken(FILE *f, int flags); extern int fputnf(FILE *, int nfloats, float *floatp, int binary); extern int fputtransform(FILE *, int ntrans, float *transforms, int binary); extern char *findfile(char *superfile, char *file); extern void filedirs(char *dirs[]); extern char **getfiledirs(); char *envexpand(char *s); extern char **ooglglob(char *s); extern void ooglblkfree(char **av0); /* * macro for grabbing the next value from either a region of * memory or a va_list. * al should be the address of the va_list * p should be the address of a poiner to the region of memory, * or NULL, which means use the va_list instead. */ #define OOGL_VA_ARG(type,al,p) (p ? ((type*)((*p)+=sizeof(type)))[-1] \ : (va_arg (*al, type))) #include "porting.h" #endif geomview-1.9.4/src/lib/oogl/util/mallocp.c0000644000175000001440000000416110461140710015325 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include /* Declare malloc() */ #include "ooglutil.h" /* Declare OOGLError */ #undef malloc #undef free #undef realloc #undef calloc #undef OOG_NewE #undef OOG_RenewE #undef OOGLFree /* * Pointers needed for OOGLNew(), etc. Placed in a separate module so * non-shared-memory users needn't link with that code. */ void *OOG_CurSM = NULL; void *(*OOG_NewP)(size_t) = malloc; void (*OOGLFree)(void *) = free; void *(*OOG_RenewP)(void *, size_t) = realloc; void * OOG_NewE(int n, char *msg) { void *p; p = (*OOG_NewP)(n); if(p == NULL && n != 0) { OOGLError(1/*Fatal mem alloc*/, "OOGLNew: couldn't allocate %d bytes: %s: %s", n, msg, sperror()); exit(1); } return p; } void * OOG_RenewE(void *p, int n, char *msg) { p = (*OOG_RenewP)(p, n); if(p == NULL && n != 0) { OOGLError(1/*Fatal mem alloc*/, "OOGLRenewN: couldn't reallocate %d bytes (from %x): %s: %s", n, p, msg, sperror()); exit(1); } return p; } geomview-1.9.4/src/lib/oogl/util/error.c0000644000175000001440000000627010622716760015047 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "ooglutil.h" char *_GFILE; /* Name of file where error is found */ int _GLINE; /* Line number in file where error is found */ int OOGL_Errorcode; /* Unique integer error code */ int _OOGLError(int errorcode, char* fmt,...) { va_list args; va_start(args, fmt); if(errorcode & OE_VERBOSE) fprintf(stderr, "Error <%d>: ",errorcode); if (fmt != NULL) vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); if(errorcode & OE_VERBOSE) fprintf(stderr, "File: %s, Line: %d\n\n",_GFILE,_GLINE); OOGL_Errorcode = errorcode; va_end(args); return 0; } /*\ * Report syntax error */ void OOGLSyntax(IOBFILE *f, char *fmt, ...) { static IOBFILE *oldf; static char oldtext[32]; char *context; va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); context = iobfcontext(f); if(f == oldf && strcmp(context, oldtext) == 0) { fprintf(stderr, " [ditto]\n"); } else { fprintf(stderr, context[0] != '\0' ? ":\n%s" : " [no text available]\n", context); oldf = f; memcpy(oldtext, context, sizeof(oldtext)); oldtext[sizeof(oldtext)-1] = '\0'; } va_end(args); } void OOGLWarn(char *fmt, ...) { va_list args; #if 0 int level = 2; if(fmt[0] < ' ' && fmt[0] != '\0') level = *fmt++; /* Maybe we have a current warning level below which we don't print * * cH: seemingly not implemented. */ #endif va_start (args, fmt); vfprintf (stderr, fmt, args); fputc('\n', stderr); fflush(stderr); va_end (args); } const char * sperrno(unsigned int err) { #if HAVE_STRERROR return strerror((int)err); #else # if !defined(__FreeBSD__) && !defined(__GLIBC__) && !defined(__CYGWIN__) extern int sys_nerr; extern char *sys_errlist[]; # endif static char errstr[16]; if(err < sys_nerr) return(sys_errlist[err]); sprintf(errstr, "Error %d", err & 0xffff); return(errstr); #endif } const char * sperror(void) { #ifndef HAVE_DECL_ERRNO extern int errno; #endif return sperrno(errno); } geomview-1.9.4/src/lib/oogl/util/findfile.c0000644000175000001440000001537110461140710015463 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/oogl/util/findfile.c,v 1.6 2006/07/15 19:06:00 rotdrop Exp $ */ #include #include #include #include "ooglutil.h" #if defined(unix) || defined(__unix) || defined(__unix__) # ifdef NeXT # include # else # include /* needed for access() */ # endif #else /* Win32 */ # include # define R_OK 4 /* No Windows include file defines this?! */ #endif #include static char **dirlist = NULL; static void dirprefix(char *file, char *dir); char *envexpand(char *s); /*----------------------------------------------------------------------- * Function: filedirs * Description: set the list of directories to search for files * Args: dirs: NULL-terminated array of pointers to directory * strings * Author: mbp * Date: Wed Feb 12 14:09:48 1992 * Notes: This function sets the list of directories searched by * findfile(). It makes an internal copy of these directories * and expands all environment variables in them. */ void filedirs(char *dirs[]) { char buf[1024], **p; int i,ndirs; if (dirlist) { for (p=dirlist; *p!=NULL; ++p) free(*p); OOGLFree(dirlist); } for (ndirs=0; dirs[ndirs]!=NULL; ++ndirs); dirlist = OOGLNewNE(char *,ndirs+1, "filedirs: dirlist"); for (i=0; i= dir && *end != '/') --end; if (end >= dir) *(end+1) = '\0'; else dir[0] = '\0'; } /*----------------------------------------------------------------------- * Function: envexpand * Description: expand environment variables in a string * Args: *s: the string * Returns: s * Author: mbp * Date: Fri Feb 14 09:46:22 1992 * Notes: expansion is done inplace; there better be enough room! */ char * envexpand(char *s) { char *c, *env, *envend, *tail; c = s; if (*c == '~' && (env = getenv("HOME"))) { tail = strdup(c+1); strcpy(c, env); strcat(c, tail); c += strlen(env); free(tail); } while (*c != '\0') { if (*c == '$') { for(envend = c; isalnum(*++envend) || *envend == '_'; ) ; tail = strdup(envend); *envend = '\0'; if((env = getenv(c+1)) == NULL) { OOGLError(1, "%s : No %s environment variable",s,c+1); strcpy(c,tail); } else { strcpy(c,env); strcat(c,tail); c += strlen(env); } free(tail); } else ++c; } return s; } geomview-1.9.4/src/lib/oogl/util/porting.h0000644000175000001440000000501510622132161015364 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * porting.h: Declarations for porting to brain-damaged operating systems. * * ooglutil.h includes this file */ #ifndef GV_PORTING_H #define GV_PORTING_H #if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_SYS_TYPE_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_GETOPT_H # include #endif #if HAVE_UNISTD_H /* getopt() on AIX */ # include #endif #if !HAVE_M_PI # define M_PI 3.14159265358979323846 /* pi */ #endif #if !HAVE_BCOPY static inline void bcopy(char *src, char *dst, int len) { memcpy(dst, src, len); } #endif #if !HAVE_BZERO static inline void bzero(char *mem, int len) { memset(mem, 0, len); } #endif #if !HAVE_FINITE static inline int finite(double v) { return (! (v <= 0.0 || v > 0.0)); } #endif #if !HAVE_DECL_STRCASECMP extern int strcasecmp(char *s1, char *s2); #endif #if !HAVE_DECL_STRNCASECMP extern int strncasecmp(char *a, char *b, int n); #endif #if !HAVE_DECL_ACOSH double acosh(double c); #endif #if !HAVE_DECL_STRDUP extern char *strdup(const char *); #endif #if !HAVE_DECL_PUTENV extern putenv(char *name); #endif /* supply missing declaration for fmemopen */ #if !HAVE_DECL_FMEMOPEN extern FILE *fmemopen(void *buf, size_t buflen, char *mode); #endif #if !HAVE_DECL_GETOPT extern int getopt(int argc, char * const argv[], const char *optstring); #endif #if !HAVE_DECL_OPTARG extern char *optarg; #endif #if !HAVE_DECL_OPTIND extern int optind; #endif #if !HAVE_DECL_OPTERR extern int opterr; #endif #if !HAVE_DECL_OPTOPT extern int optopt; #endif #endif /* GV_PORTING_H */ geomview-1.9.4/src/lib/oogl/util/freelist.h0000644000175000001440000000336510604514345015535 00000000000000/* * Copyright (C) 2007 Claus-Justus Heine This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Support for allocating objects from a free-list (instead of using * malloc() small fixed-size objects which are allocated frequently). */ #ifndef _GV_FREE_LIST_H_ #define _GV_FREE_LIST_H_ typedef struct FreeListNode { struct FreeListNode *next; } FreeListNode; #define DEF_FREELISTHEAD(type) FreeListNode *type##FreeList #define DEF_FREELIST(type) \ DEF_FREELISTHEAD(type); \ typedef union type##FreeNode { \ FreeListNode node; \ type data; \ } type##FreeNode #define FREELIST_NEW(type, name) \ if (type##FreeList == NULL) { \ name = OOGLNewE(type, #type); \ } else { \ type##FreeNode *reused; \ reused = (type##FreeNode *)type##FreeList; \ type##FreeList = reused->node.next; \ name = &reused->data; \ } #define FREELIST_FREE(type, name) \ { \ type##FreeNode *reuse = (type##FreeNode *)(name); \ reuse->node.next = type##FreeList; \ type##FreeList = &reuse->node; \ } #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/oogl/util/glob.c0000644000175000001440000000527210622716760014642 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #if defined(unix) || defined(__unix) || defined(__unix__) /* Don't try to compile for Windows */ #include #include #include #include "ooglutil.h" #include #if POPEN_ACCEPTS_RB # define POPEN_RB "rb" #else # define POPEN_RB "r" #endif #define FBUFSIZ 1024 #define INITSIZ 10 /*----------------------------------------------------------------------- * Function: *ooglglob * Description: C-shell globbing * Args: *s: the string to glob * Returns: pointer to array of pointers to expanded strings; ends * with NULL * Author: mbp * Date: Tue Aug 25 12:42:21 1992 * Notes: Invokes a subshell (/bin/csh) to do the work. * Caller should free the returned value by * first calling ooglblkfree() then free(): * * char **g; * g = ooglglob(string); * ... * ooglblkfree(g); * free(g); */ char **ooglglob(char *s) { FILE *fp; char cmd[FBUFSIZ]; vvec vp; char *c; #ifdef SIGCHLD /* Avoid NeXT pclose() bug: don't catch subprocess' SIGCHLD */ void (*oldsigchld)() = signal(SIGCHLD, SIG_DFL); #endif sprintf(cmd, GLOB_SHELL"\"echo %s\" 2>&-", s); fp = popen(cmd, POPEN_RB); if (fp == NULL) { OOGLError(1, "Could not popen(\"%s\", \"r\"): %s\n", cmd, sperror()); return NULL; } VVINIT(vp, char *, INITSIZ); while (!feof(fp)) if ((c=ftoken(fp, 2)) != NULL) *VVAPPEND(vp,char*) = strdup(c); *VVAPPEND(vp,char*) = NULL; vvtrim(&vp); pclose(fp); #ifdef SIGCHLD signal(SIGCHLD, oldsigchld); #endif return VVEC(vp,char*); } void ooglblkfree(av0) char **av0; { char **av = av0; while (*av) free(*av++); } #endif /*unix*/ geomview-1.9.4/src/lib/oogl/util/Makefile.am0000644000175000001440000000047510600445544015602 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libooglutil.la libooglutil_la_SOURCES = \ error.c findfile.c fsa.c futil.c glob.c mallocp.c ppopen.c vvec.c\ create.h fsa.h ooglutil.h porting.h ray.h surf.h \ iobuffer.c iobuffer.h iobfutil.c malloc-debug.c dbllist.h freelist.h geomview-1.9.4/src/lib/oogl/util/Makefile.in0000644000175000001440000003727710665240506015627 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/oogl/util DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libooglutil_la_LIBADD = am_libooglutil_la_OBJECTS = error.lo findfile.lo fsa.lo futil.lo \ glob.lo mallocp.lo ppopen.lo vvec.lo iobuffer.lo iobfutil.lo \ malloc-debug.lo libooglutil_la_OBJECTS = $(am_libooglutil_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libooglutil_la_SOURCES) DIST_SOURCES = $(libooglutil_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libooglutil.la libooglutil_la_SOURCES = \ error.c findfile.c fsa.c futil.c glob.c mallocp.c ppopen.c vvec.c\ create.h fsa.h ooglutil.h porting.h ray.h surf.h \ iobuffer.c iobuffer.h iobfutil.c malloc-debug.c dbllist.h freelist.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/oogl/util/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/oogl/util/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libooglutil.la: $(libooglutil_la_OBJECTS) $(libooglutil_la_DEPENDENCIES) $(LINK) $(libooglutil_la_OBJECTS) $(libooglutil_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/findfile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsa.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/futil.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iobfutil.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iobuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc-debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mallocp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppopen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vvec.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/oogl/util/ppopen.c0000644000175000001440000000667510566651524015233 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * int ppopen(char *pgm, FILE **frompgm, FILE **topgm) * int ppclose(FILE *fromcmd, FILE *tocmd) * * Like popen(), but hooks up both input and output FILE pointers to a program. * The "program" may be any valid /bin/sh command. * ppopen() returns the program's process id if successful, else 0. * If successful, ``*frompgm'' and ``*topgm'' are filled in with FILE *'s * * Take care when using this; deadlock is possible if the program writes a * large amount of data (> about 8K bytes) to its output while you're still * writing to its input. * * Typical usage might be: * FILE *frompgm, *topgm; * ppopen("polymerge", &frompgm, &topgm); * GeomFSave(g, topgm, "polymerge"); * gg = GeomFLoad(frompgm, "polymerged data"); * ppclose(topgm, frompgm); */ #include #include #include #include /* for pipe(), etc */ #include /* for bzero() */ #if defined(unix) || defined(__unix) /* Don't try to compile this for Windows */ static int npps = 0; static unsigned short *pps; int ppopen(char *cmd, FILE **frompgm, FILE **topgm) { struct pipe { int r, w; } pfrom, pto; int pid; /* create the communication pipes */ pfrom.r = pfrom.w = -1; if(pipe((int*)&pfrom) < 0 || pipe((int*)&pto) < 0) { perror("Can't make pipe"); close(pfrom.r); close(pfrom.w); return 0; } switch(pid = fork()) { case -1: perror("Can't fork"); return 0; case 0: { static char rats[] = "Can't exec external module: "; close(pfrom.r); close(pto.w); dup2(pto.r, 0); dup2(pfrom.w, 1); execl("/bin/sh", "sh", "-c", cmd, NULL); write(2, rats, sizeof(rats)-1); perror(cmd); exit(1); } } close(pto.r); close(pfrom.w); *frompgm = fdopen(pfrom.r, "r"); *topgm = fdopen(pto.w, "w"); if(pfrom.r < npps) { int newsize = (pfrom.r + 10)*sizeof(pps[0]); npps = pfrom.r + 10; pps = (unsigned short *) (pps ? realloc(pps, newsize) : malloc(newsize)); bzero(&pps[npps], newsize - npps*sizeof(pps[0])); pps[pfrom.r] = pid; } return pid; } int ppclose(FILE *frompgm, FILE *topgm) { #ifdef NeXT union wait w; #else int w; #endif unsigned int fd; int pid; if(frompgm == NULL) return -1; if(topgm) fclose(topgm); fd = fileno(frompgm); fclose(frompgm); if(fd < npps && pps[fd] != 0) { while((pid = wait(&w)) != pps[fd] && pid > 0) ; pps[fd] = 0; } return 0; } #endif geomview-1.9.4/src/lib/oogl/util/futil.c0000644000175000001440000004150210622716760015036 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2002-2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/oogl/util/futil.c,v 1.18 2007/05/16 19:38:07 rotdrop Exp $ */ /* * Geometry object routines. These routines have their "back-seekable" * counterparts in iobfutil.c, the routines below are just kept for * convenience for add-on modules. * * int fputtransform(FILE *f, int ntransforms, float *transforms, int binary) * Writes 4x4 matrices to FILE. Returns the number written, i.e. * ntransforms unless an error occurs. * * int fputnf(FILE *f, int nfloats, float *fv, int binary) * Writes 'nfloats' floats to the given file. ASCII is in %g format, * separated by blanks. * * int * fgetnf(file, nfloats, floatp, binary) * Read an array of floats from a file in "ascii" or "binary" format. * Returns number of floats successfully read, should = nfloats. * "Binary" means "IEEE 32-bit floating-point" format. * * int * fgetni(FILE *file, int nints, int *intsp, int binary) * Read an array of ints from a file in "ascii" or "binary" format. * Returns number of ints successfully read, should = nints. * "Binary" means "32-bit big-endian" integer format. * * int * fgetns(FILE *file, int nshorts, short *intsp, int binary) * Read an array of shorts from a file in "ascii" or "binary" format. * Returns number of shorts successfully read, should = nints. * "Binary" means "16-bit big-endian" integer format. * * int * fexpectstr(FILE *file, char *string) * Expect the given string to appear immediately on file. * Return 0 if the complete string is found, * else the offset+1 of the last matched char within string. * The first unmatched char is ungetc'd. * * int * fexpecttoken(FILE *file, char *string) * Expect the given string to appear on the file, possibly after * skipping some white space and comments. * Return 0 if found, else the offset+1 of last matched char in string. * The first unmatched char is ungetc'd. * * int fnextc(FILE *f, int flags) * Advances f to the next "interesting" character and * returns it. The returned char is ungetc'ed so the next getc() * will yield the same value. * Interesting depends on flags: * 0 : Skip blanks, tabs, newlines, and comments (#...\n). * 1 : Skip blanks, tabs, and comments, but newlines are interesting * (including the \n that terminates a comment). * 2 : Skip blanks, tabs, and newlines, but stop at #. * 3 : Skip blanks and tabs but stop at # or \n. * * char *ftoken(FILE *f, int flags) * Skips uninteresting characters with fnextc(f, flags), * then returns a "token" - string of consecutive interesting characters. * Returns NULL if EOF is reached with no token, or if * flags specifies stopping at end-of-line and this is encountered with * no token found. * The token is effectively statically allocated and will be * overwritten by the next ftoken() call. * * char *fdelimtok(char *delims, FILE *f, int flags) * Like ftoken(), but specially handles the characters in delims[]. * If one appears at the beginning of the token, it's returned as * a single-character token. * If a member of delims[] appears after other characters have been * accumulated, it's considered to terminate the token. * So successive calls to fdelimtok("()", f, 0) * on a file containing (fred smith) * would return "(", "fred", "smith", and ")". * Behavior is undefined if one of the predefined delimiters * (white space or #) appears in delims[]. Explicit quoting * (with ", ' or \) overrides detection of delimiters. * * int fgettransform(FILE *f, int ntransforms, float *transforms, int binary) * Reads 4x4 matrices from FILE. Returns the number of matrices found, * up to ntransforms. Returns 0 if no numbers are found. * On finding incomplete matrices (not a multiple of 16 floats) * returns -1, regardless of whether any whole matrices were found. * Matrices are expected in the form used to transform a row vector * multiplied on the left, i.e. p * T -> p'; thus Euclidean translations * appear in the last row. * */ #include #include #include #include #include "ooglutil.h" #ifndef WORDS_BIGENDIAN static inline int gv_ntohl(unsigned int v) { return (((v >> 24) & 0x000000FF) | ((v << 24) & 0xFF000000) | ((v >> 8) & 0x0000FF00) | ((v << 8) & 0x00FF0000)); } static inline short gv_ntohs(unsigned short s) { return (((s >> 8) & 0x00FF) | ((s << 8) & 0xFF00)); } #else static inline int gv_ntohl(unsigned int v) { return v; } static inline short gv_ntohs(unsigned short s) { return s; } #endif static inline short gv_htons(unsigned short s) { return gv_ntohs(s); } static inline int gv_htonl(unsigned int v) { return gv_ntohl(v); } int fputnf(FILE *file, int count, float *v, int binary) { int i; if(binary) { #if WORDS_BIGENDIAN return fwrite(v, sizeof(float), count, file); #else long w; for(i = 0; i < count; i++) { w = gv_htonl(*(long *)&v[i]); fwrite(&w, sizeof(float), 1, file); } return count; #endif } fprintf(file, "%g", v[0]); for(i = 1; i < count; i++) fprintf(file, " %g", v[i]); return count; } int fputtransform(FILE *file, int ntrans, float *trans, int binary) { int i, n; float *p; if(binary) { #if WORDS_BIGENDIAN return fwrite(trans, 4*4*sizeof(float), ntrans, file); #else union { int wi; float wf; } w; int j; for (i = 0; i < ntrans; i++) { for (j = 0; j < 16; j++) { w.wf = trans[i*16 + j]; w.wi = gv_htonl(w.wi); if (fwrite(&w, sizeof(float), 1, file) != 1) { return i; } } } return i; #endif } /* ASCII. */ for(n = 0; n < ntrans; n++) { p = trans + n*16; for(i = 0; i < 4; i++, p += 4) { fprintf(file, " %12.8g %12.8g %12.8g %12.8g\n", p[0], p[1], p[2], p[3]); } if(ferror(file)) return n; fprintf(file, "\n"); } return ntrans; } int fnextc(FILE *f, int flags) { int c; c = getc(f); for(;;) { switch(c) { case EOF: return(EOF); case ' ': case '\t': break; /* Always skip blanks and tabs */ case '#': if(flags & 2) /* 2: stop on comments, else skip */ goto fim; while((c = getc(f)) != '\n' && c != EOF) ; continue; /* Rescan this c */ case '\n': if(!(flags & 1)) /* 1: stop on \n's, else skip them */ break; /* flags&1 => fall into default */ default: fim: ungetc(c, f); return(c); } c = getc(f); } } /* Read an array of white-space-separated floats from file 'f' in * ASCII, fast. Returns the number successfully read. */ int fgetnd(FILE *f, int maxd, double *dv, int binary) { int ngot; double v = 0; int c = EOF; long n; int s, es, nd, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return fread((char *)dv, sizeof(double), maxd, f); #else /* not native big-endian IEEE */ union { int wi[2]; double wd; } w; int tmp; for(n=0; n 0; n++) { tmp = gv_ntohl(w.wi[0]); w.wi[0] = gv_ntohl(w.wi[1]); w.wi[1] = tmp; dv[n] = w.wd; } return n; #endif /* not native big-endian IEEE */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxd; ngot++) { if(fnextc(f, 0) == EOF) return(ngot); n = 0; s = 0; nd = 0; any = 0; if((c = fgetc(f)) == '-') { s = 1; c = fgetc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { /* 2^31 / 10 */ v = any ? v*pow(10.0, nd) + (float)n : (float)n; nd = n = 0; any = 1; } c = fgetc(f); } v = any ? v*pow(10.0, (double)nd) + (float)n : (float)n; any += nd; if(c == '.') { nd = n = 0; while((c = fgetc(f)) >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { v += (float)n / pow(10.0, (double)nd); n = 0; } } v += (float)n / pow(10.0, (double)nd); } if(any == 0 && nd == 0) break; if(c == 'e' || c == 'E') { es = nd = 0; switch(c = fgetc(f)) { case '-': es = 1; /* And fall through */ case '+': c = fgetc(f); } n = 0; while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; c = fgetc(f); } if(nd == 0) break; if(es) v /= pow(10.0, (double)n); else v *= pow(10, n); } dv[ngot] = s ? -v : v; } if(c!=EOF) ungetc(c, f); return(ngot); } /* * Read an array of white-space-separated floats from file 'f' in ASCII, fast. * Returns the number successfully read. */ int fgetnf(FILE *f, int maxf, float *fv, int binary) { int ngot; float v = 0; int c = EOF; long n; int s, es, nd, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return fread((char *)fv, sizeof(float), maxf, f); #else /* not native big-endian IEEE */ union { int wi; float wf; } w; for(n=0; n 0; n++) { w.wi = gv_ntohl(w.wi); fv[n] = w.wf; } return n; #endif /* not native big-endian IEEE */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxf; ngot++) { if(fnextc(f, 0) == EOF) return(ngot); n = 0; s = 0; nd = 0; any = 0; if((c = getc(f)) == '-') { s = 1; c = getc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { /* 2^31 / 10 */ v = any ? v*pow(10.0, nd) + (float)n : (float)n; nd = n = 0; any = 1; } c = getc(f); } v = any ? v*pow(10.0, nd) + (float)n : (float)n; any += nd; if(c == '.') { nd = n = 0; while((c = getc(f)) >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { v += (float)n / pow(10.0, nd); n = 0; } } v += (float)n / pow(10.0, nd); } if(any == 0 && nd == 0) break; if(c == 'e' || c == 'E') { es = nd = 0; switch(c = getc(f)) { case '-': es = 1; /* And fall through */ case '+': c = getc(f); } n = 0; while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; c = getc(f); } if(nd == 0) break; if(es) v /= pow(10.0, n); else v *= pow(10.0, n); } fv[ngot] = s ? -v : v; } if(c!=EOF) ungetc(c, f); return(ngot); } int fgetni(FILE *f, int maxi, int *iv, int binary) { int ngot; int c = EOF; long n; int s, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return fread((char *)iv, sizeof(int), maxi, f); #else /* not native big-endian int's */ int w; for(n = 0; n < maxi && fread(&w,4,1,f) > 0; n++) iv[n] = gv_ntohl(w); return n; #endif /* not native big-endian int's */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxi; ngot++) { if(fnextc(f, 0) == EOF) return(ngot); n = 0; s = 0; any = 0; if((c = getc(f)) == '-') { s = 1; c = getc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; any = 1; c = getc(f); } if(!any) break; iv[ngot] = s ? -n : n; } if(c!=EOF) ungetc(c, f); return(ngot); } int fgetns(FILE *f, int maxs, short *sv, int binary) { int ngot; int c = EOF; long n; int s, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return fread((char *)sv, sizeof(short), maxs, f); #else /* not native big-endian int's */ short w; for(n = 0; n < maxs && fread(&w,2,1,f) > 0; n++) sv[n] = gv_ntohs(w); return n; #endif /* not native big-endian int's */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxs; ngot++) { if(fnextc(f, 0) == EOF) return(ngot); n = s = any = 0; if((c = getc(f)) == '-') { s = 1; c = getc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; any = 1; c = getc(f); } if(!any) break; sv[ngot] = s ? -n : n; } if(c!=EOF) ungetc(c, f); return(ngot); } /* * Check for a string on a file. * If found, return 0. * If not, return the offset of the last matched char +1 * and ungetc the failed char so the caller can see it. */ int fexpectstr(FILE *file, char *str) { char *p = str; int c; while(*p != '\0') { if((c = getc(file)) != *p++) { if(c != EOF) ungetc(c, file); return(p - str); } } return 0; } /* * Check for a string on a file, skipping leading blanks. */ int fexpecttoken(FILE *file, char *str) { (void) fnextc(file, 0); return fexpectstr(file, str); } int fescape(FILE *f) { int n, k, c = fgetc(f); switch(c) { case 'n': return '\n'; case 'b': return '\b'; case 't': return '\t'; case 'r': return '\r'; } if(c < '0' || c > '7') return c; n = c-'0'; k = 2; while((c = fgetc(f)) >= '0' && c <= '7') { n = (n*8) | (c-'0'); if(--k <= 0) return n; } if(c != EOF) ungetc(c, f); return n; } /* * Get a token, return a string or NULL. * Tokens may be "quoted" or 'quoted'; backslashes accepted. * The string is statically allocated and should be copied if * needed before the next call to ftoken(). */ char * ftoken(FILE *file, int flags) { static char *token = NULL; static int troom = 0; int c; char *p; int term; if((term = fnextc(file, flags)) == EOF) return NULL; if(token == NULL) { troom = 50; token = malloc(troom * sizeof(char)); if(token == NULL) return NULL; } p = token; switch(term) { case '"': case '\'': (void) fgetc(file); for(;;) { if((c = getc(file)) == EOF || c == term) break; else if(c == '\\') c = fescape(file); *p++ = c; if(p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } } break; default: if(isspace(term)) return NULL; while((c = getc(file)) != EOF && !isspace(c)) { if(c == '\\') c = fescape(file); *p++ = c; if(p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } } break; } *p = '\0'; return token; } /* * Get a token, return a string or NULL. * Tokens may be "quoted" or 'quoted'; backslashes accepted. * The string is statically allocated and should be copied if * needed before the next call to ftoken(). */ char * fdelimtok(char *delims, FILE *file, int flags) { static char *token = NULL; static int troom = 0; int c; char *p; char *q; int term; if((term = fnextc(file, flags)) == EOF) return NULL; if(token == NULL) { troom = 50; token = malloc(troom * sizeof(char)); if(token == NULL) return NULL; } p = token; switch(term) { case '"': case '\'': (void) fgetc(file); for(;;) { if((c = getc(file)) == EOF || c == term) break; else if(c == '\\') c = fescape(file); *p++ = c; if(p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } } break; default: if(isspace(term)) return NULL; while((c = getc(file)) != EOF && !isspace(c)) { if(c == '\\') c = fescape(file); *p = c; if(++p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } for(q = delims; *q && c != *q; q++) ; if(*q) { if(p > token+1) { p--; ungetc(c, file); } break; } } break; } *p = '\0'; return token; } /* * Load one or more Transforms from a file. * Return 1 on success, 0 on failure. */ int fgettransform(FILE *file, int ntrans, float *trans /* float trans[ntrans][4][4] */, int binary) { float *T; int nt; for(nt = 0; nt < ntrans; nt++) { T = trans + 16*nt; switch(fgetnf(file, 16, T, binary)) { case 16: break; case 0: return nt; default: return -1; } } return ntrans; } geomview-1.9.4/src/lib/oogl/util/surf.h0000644000175000001440000000407510455701007014673 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "material.h" #include "3d.h" /*********************************************************************** * a surf is a primitive bit of surface, conveys the geometrical * information about an intersection ***********************************************************************/ #define SURF_NEEDS_SET(p, n, s) ((n)&(p) && !((s)&(p))) #define SURF_SET(p, f) ((f) |= (p)) #define SURF_NONE 0x0 #define SURF_P 0x1 #define SURF_N 0x2 #define SURF_NG 0x4 #define SURF_DPDU 0x8 #define SURF_DPDV 0x10 #define SURF_UV 0x20 #define SURF_DUDV 0x40 #define SURF_ST 0x80 #define SURF_I 0x100 #define SURF_CS 0x200 #define SURF_OS 0x400 typedef struct surf { int flag ; /* copied mostly from Renderman */ Point3 P ; /* location of the point */ Point3 dPdu ; /* derivatives */ Point3 dPdv ; Point3 N ; /* shading normal vector */ Point3 Ng ; /* geometric normal */ Point2 uv ; /* location on the surface */ Point2 dudv ; /* derivatives of u, v */ Point2 st ; /* texture coordinates */ Point3 I ; /* incident ray direction */ Material mat; Transform3 T; Geom *geom; } Surf ; geomview-1.9.4/src/lib/oogl/util/vvec.c0000644000175000001440000000705510461140710014646 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" /* * Variable-sized arrays ("vectors"). */ void vvinit(vvec *v, int elsize, int minelems) { v->elsize = elsize; v->count = 0; v->malloced = 0; v->dozero = 0; v->allocated = -minelems; v->base = NULL; } void vvuse(vvec *v, void *buf, int allocated) { vvfree(v); v->base = buf; v->allocated = allocated; } void vvzero(vvec *v) { v->dozero = 1; if(v->allocated > v->count) memset(v->base + v->elsize*v->count, 0, v->elsize * (v->allocated - v->count)); } /* * Trim vvec to minimum size; ensure its buffer is malloced if it wasn't. */ void vvtrim(vvec *v) { int newalloc = (v->count > 0 ? v->count : 1); int want = newalloc * v->elsize; static char why[] = "trimming vvec"; if(!v->malloced) { void *base = OOGLNewNE(char, want, why); if(v->base) memcpy(base, v->base, want); else memset(base, '\0', want); v->base = base; v->malloced = 1; } else if(v->allocated > v->count) { v->base = (void *)OOGLRenewNE(char, v->base, want, why); } else return; v->allocated = newalloc; } void vvfree(vvec *v) { if(v->malloced) { OOGLFree(v->base); v->base = NULL; v->malloced = 0; } } void vvneeds(vvec *v, int needed) { if(needed > v->allocated) { int had = v->allocated; int want = needed + (needed>>2) + 1; if(had < 0) { if(want < -had) want = -had; had = 0; } else { int next = had + (had>>1) + 2; if(next > needed) want = next; } if(v->malloced) { v->base = OOGLRenewNE(char, v->base, want * v->elsize, "extending vvec"); if(had > v->count) had = v->count; } else { void *was = v->base; v->base = OOGLNewNE(char, want * v->elsize, "allocating vvec"); if(v->count > 0 && had > 0) memcpy(v->base, was, (v->countcount:had) * v->elsize); } v->allocated = want; v->malloced = 1; if(v->dozero) memset(v->base + v->elsize * had, 0, v->elsize * (want-had)); } } void * vvindex(vvec *v, int index) { if(index < 0) { OOGLError(1, "negative array index: %d", index); return v->base; } if(index >= v->allocated) vvneeds(v, index+1); if(index >= v->count) v->count = index+1; return v->base + index*v->elsize; } void vvcopy(vvec *src, vvec *dest) { char *newbase; if(src->base == NULL) { *dest = *src; } else { vvneeds(dest, src->allocated); newbase = dest->base; *dest = *src; dest->base = newbase; memcpy(dest->base, src->base, dest->allocated * dest->elsize); } } geomview-1.9.4/src/lib/oogl/util/create.h0000644000175000001440000001331310577535007015164 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef CR_DEF #define CR_DEF #include /* So we only have to do it once, here. */ /* This stuff should be an enum, not a define */ /* Generic attributes */ #define CR_END 0 /* Marks end of create list (any object) */ #define CR_COPY 1 /* no argument (any object) */ #define CR_NOCOPY 2 /* no argument (any object) */ /* Generic Geom attributes */ #define CR_APPEAR 8 /* marks beginning of Appearance create list) */ #define CR_POINT 9 /* Point3 [] (any Geom with vertices) */ #define CR_POINT4 18 /* HPoint3 [] (any Geom with 4D vertices) */ #define CR_NORMAL 10 /* Point3 [] (any Geom w/per-vtx normals) */ #define CR_COLOR 11 /* ColorA [] (any Geom w/per-vtx colors) */ #define CR_OPACITY 12 /* XXX Not used yet XXX */ #define CR_FLAG 13 /* int flags (patch,Mesh,PolyList,Quad) */ #define CR_FLAGMERGE 14 /* int flags, int flagmask */ /* Control of 'override' mask for mergeable things (Appearance) */ #define CR_OVERMERGE 15 /* int override, int ovmask */ /* BBox attributes */ #define CR_MAX 16 /* Point3 * (BBox) */ #define CR_MIN 17 /* Point3 * (BBox) */ #define CR_4MAX 1492 /* HPoint3 * (BBox) */ #define CR_4MIN 1066 /* HPoint3 * (BBox) */ #define CR_NMIN 2048 /* HPointN * (BBox) */ #define CR_NMAX 2049 /* HPointN * (BBox) */ #define CR_NCENTER 2050 /* HPointN * (return NDcenter of BBox) */ #define CR_4D 19 /* is this object a true 4D item? */ /* Hierarchy object (Inst, List, TList) attributes */ #define CR_AXIS 20 /* Transform (Inst) */ #define CR_AXISHANDLE 28 /* Handle * to TransObj (for Inst) */ #define CR_NDAXIS 202 /* Transform (Inst) */ #define CR_NDAXISHANDLE 203 /* Handle * to NTransObj (for Inst) */ #define CR_GEOM 21 /* Geom *child (Inst,List) */ #define CR_GEOMHANDLE 22 /* Handle *childname (Inst,List) */ #define CR_TLIST 23 /* Geom *tlist (Inst,TList) */ #define CR_TLISTHANDLE 24 /* Handle *tlistname (Inst,TList) */ #define CR_TXTLIST 204 /* Geom *txtlist (Inst) */ #define CR_TXTLISTHANDLE 205 /* Handle *txtlistname (Inst) */ #define CR_ELEM 25 /* Transform [] (TList) */ #define CR_NELEM 26 /* int nxforms(TList), int nquads (Quad)*/ #define CR_CDR 27 /* List * (List) (obsolescent?) */ #define CR_HANDLE_GEOM 29 /* Handle *, Geom * (Inst, List) */ #define CR_CAR CR_GEOM /* Geom * (List) (obsolescent) */ #define CR_UNIT CR_GEOM /* Geom * (Inst) (obsolescent) */ #define CR_LOCATION 201 /* int (Inst) L_LOCAL, L_CAMERA, ...*/ /* Mesh attributes */ #define CR_NU 30 /* int nu (Mesh) */ #define CR_NV 31 /* int nv (Mesh) */ #define CR_UWRAP 32 /* int uwrapped (Mesh) */ #define CR_VWRAP 33 /* int vwrapped (Mesh) */ #define CR_U 34 /* Point3 texturecoords[] (Mesh) */ #define CR_UMIN 35 /* int umin (Mesh) [submesh] */ #define CR_UMAX 36 /* int umax (Mesh) */ #define CR_VMIN 37 /* int vmin (Mesh) */ #define CR_VMAX 38 /* int vmax (Mesh) */ /* Patch attributes */ #define CR_DEGU 40 /* int u_degree (patches) */ #define CR_DEGV 41 /* int v_degree (patches) */ #define CR_MESH 42 /* Mesh * (patches) */ #define CR_DIM 43 /* int vertex_dim (= 3 or 4) (patches) */ #define CR_ST 44 /* struct { float s, t; } stcoords[4]; */ /* (texture coords at corners (Mesh,Patch) */ #define CR_MESHDIM 45 /* mesh surface dimension (typ. 2) */ #define CR_MESHSIZE 46 /* int meshsize[meshdim] */ /* Vect attributes */ #define CR_NVECT 48 /* int nvectors (Vect) */ #define CR_NVERT 49 /* int nvertices (Vect) */ #define CR_NCOLR 50 /* int ncolors (Vect) */ #define CR_VECTC 51 /* short nverts_per_vector[nvect] (Vect)*/ #define CR_COLRC 52 /* short ncolors_per_vector[nvect] (Vect)*/ /* PolyList attributes */ #define CR_NPOLY 56 /* int npolygons (PolyList) */ /* CR_NVERT (48) int nvertperpol[npoly] */ #define CR_VERT 57 /* int vertindex[sum(nvertperpol[])] */ #define CR_POLYNORMAL 58 /* Point3 facenormal[npoly] */ #define CR_POLYCOLOR 59 /* ColorA facecolor[npoly] */ #define CR_POLYFLAGS 300 /* per poly concave/not-flat flags */ /* Sphere attributes */ #define CR_CENTER 60 /* HPoint3 *center (also bbox) */ #define CR_RADIUS 61 /* float radius */ #define CR_SPACE 64 /* Space - TM_EUCLIDEAN is default */ #define CR_NENCOMPASS_POINTS 65 /* int - Number of points to be * put inside sphere */ #define CR_ENCOMPASS_POINTS 66 /* Hpoint3 * - points to be inside * sphere (for bounding spheres */ /* CR_AXIS 20 Transform to apply to points before making bounding sphere */ #define CR_SPHERETX 67 /* texture mapping for sphere */ /* tokens for Camera moved to camera.h */ /* tokens for Appearances, Lights, Materials moved to shade/appearance.h */ #define CR_POLICE 62 /* enforce strong checking on input data? */ #define CR_NOPOLICE 63 /* enforce strong checking on input data? */ #endif geomview-1.9.4/src/lib/oogl/util/dbllist.h0000644000175000001440000000703610601064674015356 00000000000000/* * Copyright (C) 2007 Claus-Justus Heine This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. Simple doubly linked list implementation. Somewhat inspired from the stuff used in the Linux kernel. */ #ifndef _GV_LIST_H_ #define _GV_LIST_H_ typedef struct dbllistnode { struct dbllistnode *next; struct dbllistnode *prev; } DblListNode; /* DblListNode Head = DBLLISTINIT(Head); */ #define DBLLISTINIT(name, head) { &name.head, &name.head } #define DBLLIST(name) DblListNode name = { &name, &name } /* list is empty if the list head is the only member */ static inline void DblListInit(DblListNode *head) { head->next = head; head->prev = head; } static inline bool DblListEmpty(DblListNode *head) { return head->next == head; } /* add in front, right after head */ static inline void DblListAdd(DblListNode *head, DblListNode *node) { node->next = head->next; head->next->prev = node; head->next = node; node->prev = head; } /* add at the tail, right before head */ static inline void DblListAddTail(DblListNode *head, DblListNode *node) { node->prev = head->prev; head->prev->next = node; head->prev = node; node->next = head; } /* One nice feature of doubly linked lists is that one does not need a * pointer to the head to do a deletion. */ static inline void DblListDelete(DblListNode *node) { node->next->prev = node->prev; node->prev->next = node->next; DblListInit(node); } /* Copy an entire DblList, i.e. reparent it, give it a new head. */ static inline void DblListMove(DblListNode *fromhead, DblListNode *tohead) { fromhead->next->prev = tohead; fromhead->prev->next = tohead; tohead->next = fromhead->next; tohead->prev = fromhead->prev; } /* Given a list-node "node" construct a pointer to the containing * structure of type "ctype" which has a member with name "nodename" * (of type DblListNode). */ #define DblListContainer(node, ctype, nodename) \ ((ctype *)((char *)(node) - (char *)&((ctype *)0)->nodename)) /* Iterate over the list; head is the list-head, ctype the type of the * containing structure, nodemember the name of the list-head inside * ctype, pos is the loop variable and must be of type ctype, next is * a temporary helper variable to protect against deletion of list * members. */ #define DblListIterate(head, ctype, nodename, pos, nextp) \ for (pos = DblListContainer((head)->next, ctype, nodename), \ nextp = DblListContainer(pos->nodename.next, ctype, nodename); \ pos->nodename.next != (head)->next; \ pos = nextp, \ nextp = DblListContainer(pos->nodename.next, ctype, nodename)) #define DblListIterateNoDelete(head, ctype, nodename, pos) \ for (pos = DblListContainer((head)->next, ctype, nodename); \ pos->nodename.next != (head)->next; \ pos = DblListContainer(pos->nodename.next, ctype, nodename)) #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/oogl/util/iobuffer.c0000644000175000001440000004427410647466514015533 00000000000000/* * Copyright (C) 2006 Claus-Justus Heine This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * This file implements setpos()/getpos() facilities for non-seekable * files by generating a secondary dynamic file buffering of arbitrary * size on top of stdio. */ /* As a special exception the author of this files permits the * distribution of this software with Geomview. As long as this file * is distributed with Geomview, the conditions of the GNU Lesser * Public Licence apply. See the file "COPYING" in the top-level * directory. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #if HAVE_FCNTL_H && HAVE_FCNTL # include static const int o_nonblock = #ifdef O_NONBLOCK O_NONBLOCK | #endif #ifdef O_NDELAY O_NDELAY | #endif #ifdef FNONBLK FNONBLK | #endif #ifdef FNDELAY FNDELAY | #endif 0; #if !defined(O_NONBLOCK) && !defined(O_NDELAY) \ && !defined(FNONBLK) && !defined(FNDELAY) # error Do not know how to achieve non-blocking IO #endif #endif #include "iobuffer.h" #ifndef DEBUG # define DEBUG 0 #endif #ifndef min # define min(a, b) (((a) <= (b)) ? (a) : (b)) #endif #ifndef BUFSIZ # define BUFFER_SIZE 8192 #else # define BUFFER_SIZE BUFSIZ #endif typedef struct IOBuffer { struct IOBuffer *next; char buffer[BUFFER_SIZE]; } IOBuffer; typedef struct IOBufferList { IOBuffer *buf_head; /**< Head of linked list of buffers */ IOBuffer *buf_tail; /**< Pointer to tail of buffer list */ IOBuffer *buf_ptr; /**< Pointer to current buffer */ size_t buf_pos; /**< Byte pos into buf_ptr */ size_t tail_size; /**< Size used inside *buf_ptr */ size_t tot_pos; size_t tot_size; } IOBLIST; struct IOBFILE { FILE *istream; /**< The underlying stdio FILE */ IOBLIST ioblist; IOBLIST ioblist_mark; int can_seek:1; int mark_wrap:1; /**< Set when the buffer no longer covers the position of the mark. */ int mark_set:1; int eof:2; int ungetc; fpos_t stdiomark; size_t mark_pos; int mark_ungetc; /**< Copy of what ungetc was when setmark() was called */ int fd; #if HAVE_FCNTL int fflags; #endif #if DEBUG size_t read_count; #endif }; #if DEBUG static int n_total_buffers; static int max_total_buffers; static int n_fopen; static int max_fopen; static int n_fileopen; static int max_fileopen; static int n_popen; static int max_popen; #endif static void iob_release_buffer(IOBLIST *ioblist) { IOBuffer *iob, *prev; prev = ioblist->buf_head; iob = prev->next; prev->next = NULL; while (iob) { prev = iob; iob = iob->next; free(prev); #if DEBUG n_total_buffers --; #endif } memset(ioblist, 0, sizeof(*ioblist)); } static void iob_init_buffer(IOBLIST *ioblist) { ioblist->buf_head = malloc(sizeof(IOBuffer)); #if DEBUG n_total_buffers ++; if (n_total_buffers > max_total_buffers) { max_total_buffers = n_total_buffers; fprintf(stderr, "MAX BUFFERS: %d\n", max_total_buffers); } #endif ioblist->buf_head->next = ioblist->buf_head; ioblist->buf_ptr = ioblist->buf_head; ioblist->buf_tail = ioblist->buf_head; ioblist->tot_pos = 0; ioblist->tot_size = 0; ioblist->tail_size = 0; ioblist->buf_pos = 0; } static void iob_copy_buffer(IOBLIST *to, IOBLIST *from) { IOBuffer *iob; iob_init_buffer(to); for (iob = from->buf_head; iob->next != from->buf_head; iob = iob->next) { if (iob == from->buf_ptr) { to->buf_ptr = to->buf_tail; } memcpy(to->buf_tail->buffer, iob->buffer, BUFFER_SIZE); to->buf_tail->next = malloc(sizeof(IOBuffer)); #if DEBUG n_total_buffers ++; if (n_total_buffers > max_total_buffers) { max_total_buffers = n_total_buffers; fprintf(stderr, "MAX BUFFERS: %d\n", max_total_buffers); } #endif to->buf_tail = to->buf_tail->next; to->buf_tail->next = to->buf_head; } to->tot_pos = from->tot_pos; to->tot_size = from->tot_size; to->tail_size = from->tail_size; to->buf_pos = from->buf_pos; } FILE *iobfile(IOBFILE *iobf) { return iobf ? iobf->istream : NULL; } int iobfileno(IOBFILE *iobf) { return iobf ? iobf->fd : -1; } IOBFILE *iobfileopen(FILE *istream) { IOBFILE *iobf; if (istream == NULL) { return NULL; } iobf = calloc(1, sizeof(IOBFILE)); iobf->istream = istream; iobf->fd = fileno(istream); iobf->ungetc = EOF; if (iobf->fd >= 0) { /* Determine whether we have file positioning support */ if (lseek(iobf->fd, 0, SEEK_CUR) != -1 && !isatty(iobf->fd)) { iobf->can_seek = -1; } /* No stdio buffereing */ #if SETVBUF_REVERSED setvbuf(istream, _IONBF, NULL, 0); #else setvbuf(istream, NULL, _IONBF, 0); #endif #if HAVE_FCNTL iobf->fflags = fcntl(iobf->fd, F_GETFL); if (iobf->fflags != -1 && (iobf->fflags & o_nonblock)) { iobf->fflags &= ~o_nonblock; if (fcntl(iobf->fd, F_SETFL, iobf->fflags) < 0) { fprintf(stderr, "iobfileopen(): unable to clear O_NONBLOCK: \"%s\"\n", strerror(errno)); } } } else { iobf->fflags = -1; #endif } iob_init_buffer(&iobf->ioblist); iobf->ungetc = EOF; #if DEBUG n_fileopen++; if (n_fileopen > max_fileopen) { max_fileopen = n_fileopen; fprintf(stderr, "max fileopen: %d\n", max_fileopen); } #endif return iobf; } IOBFILE *iobfopen(const char *name, const char *mode) { FILE *stream; if (strchr(mode, 'a') != NULL || strchr(mode, 'w') != NULL) { fprintf(stderr, "iobfopen(): Write mode is unsupported\n"); return NULL; } stream = fopen(name, mode); if (stream == NULL) return NULL; #if DEBUG n_fopen++; if (n_fopen > max_fopen) { max_fopen = n_fopen; fprintf(stderr, "max fopen: %d\n", max_fopen); } #endif return iobfileopen(stream); } int iobfileclose(IOBFILE *iobf) { iob_release_buffer(&iobf->ioblist); if (iobf->ioblist_mark.buf_head) { iob_release_buffer(&iobf->ioblist_mark); } free(iobf); #if DEBUG n_fileopen--; #endif return 0; } int iobfclose(IOBFILE *iobf) { int result; result = fclose(iobf->istream); (void)iobfileclose(iobf); #if DEBUG n_fopen--; #endif return result; } #if HAVE_POPEN IOBFILE *iobpopen(const char *cmd, const char *mode) { FILE *stream; if (strchr(mode, 'a') != NULL || strchr(mode, 'w') != NULL) { fprintf(stderr, "iobfopen(): Write mode is unsupported\n"); return NULL; } stream = popen(cmd, mode); if (stream == NULL) return NULL; #if DEBUG n_popen++; if (n_popen > max_popen) { max_popen = n_popen; fprintf(stderr, "max popen: %d\n", max_popen); } #endif return iobfileopen(stream); } int iobpclose(IOBFILE *iobf) { int result; result = pclose(iobf->istream); (void)iobfileclose(iobf); #if DEBUG n_popen--; #endif return result; } #endif long iobftell(IOBFILE *iobf) { long pos; if (!iobf->can_seek) { return ~0L; } pos = ftell(iobf->istream); return pos - (iobf->ioblist.tot_size - iobf->ioblist.tot_pos); } int iobfseek(IOBFILE *iobf, long offset, int whence) { if (iobf->can_seek && fseek(iobf->istream, offset, whence) == 0) { iob_release_buffer(&iobf->ioblist); iob_init_buffer(&iobf->ioblist); return 0; } return -1; } char *iobfgets(char *s, int size, IOBFILE *iobf) { char *p = s; int c = 0; while (--size) { *p++ = c = iobfgetc(iobf); if (c == '\n' || c == EOF) { break; } } if (c == EOF) { p--; } *p = '\0'; if (s == p && size) { return NULL; } else { return s; } } /* Copy the buffer contents between tot_pos and tot_pos - size t * ptr */ size_t iobfgetbuffer(IOBFILE *iobf, void *ptr, size_t size, int direction) { IOBLIST *ioblist = &iobf->ioblist; IOBuffer *iob; int skip, i; size_t offset, cpsz, rval, tot_space = ioblist->tot_size - ioblist->tot_pos; char *buf = ptr; if (iobf->ungetc != EOF) { ++tot_space; } if (ptr == NULL) { return direction < 0 ? ioblist->tot_pos : tot_space; } if (direction < 0) { rval = size = min(size, ioblist->tot_pos); skip = (ioblist->tot_pos - size) / BUFFER_SIZE; for (i = 0, iob = ioblist->buf_head; i < skip; iob = iob->next, i++); offset = (ioblist->tot_pos - size) % BUFFER_SIZE; cpsz = min(size, BUFFER_SIZE - offset); memcpy(buf, iob->buffer + offset, cpsz); buf += cpsz; size -= cpsz; while (size) { iob = iob->next; cpsz = min(size, BUFFER_SIZE); memcpy(buf, iob->buffer, cpsz); buf += cpsz; size -= cpsz; } } else { rval = size = min(size, tot_space); if (size > 0 && iobf->ungetc != EOF) { *buf++ = iobf->ungetc; --size; } iob = ioblist->buf_ptr; offset = ioblist->buf_pos; cpsz = min(size, BUFFER_SIZE - offset); memcpy(buf, iob->buffer + offset, cpsz); size -= cpsz; buf += cpsz; while (size) { iob = iob->next; cpsz = min(size, BUFFER_SIZE); memcpy(buf, iob->buffer, cpsz); buf += cpsz; size -= cpsz; } } return rval; } static size_t iobfread_buffer(void *ptr, size_t size, IOBFILE *iobf) { IOBLIST *ioblist = &iobf->ioblist; size_t tot_space, rq_sz, rq_sz_pos, rd_sz; char *buf = ptr; tot_space = ioblist->tot_size - ioblist->tot_pos; if (iobf->ungetc != EOF) { ++tot_space; } rq_sz = min(size, tot_space); if (rq_sz == 0) { return 0; } rd_sz = 0; if (iobf->ungetc != EOF) { buf[0] = iobf->ungetc & 0xff; iobf->ungetc = EOF; ++buf; ++rd_sz; --rq_sz; #if DEBUG --iobf->read_count; #endif } while (rq_sz) { rq_sz_pos = min(rq_sz, BUFFER_SIZE - ioblist->buf_pos); memcpy(buf, ioblist->buf_ptr->buffer + ioblist->buf_pos, rq_sz_pos); ioblist->buf_pos += rq_sz_pos; ioblist->tot_pos += rq_sz_pos; buf += rq_sz_pos; rd_sz += rq_sz_pos; rq_sz -= rq_sz_pos; if (ioblist->buf_pos == BUFFER_SIZE && ioblist->buf_ptr != ioblist->buf_tail) { /* advance to next buffer */ ioblist->buf_ptr = ioblist->buf_ptr->next; ioblist->buf_pos = 0; if ((!iobf->mark_set || iobf->can_seek) && ioblist->buf_head->next->next != ioblist->buf_head) { /* Release buffers no longer needed. */ ioblist->buf_tail->next = ioblist->buf_head->next; free(ioblist->buf_head); #if DEBUG n_total_buffers --; #endif ioblist->buf_head = ioblist->buf_tail->next; ioblist->tot_pos -= BUFFER_SIZE; ioblist->tot_size -= BUFFER_SIZE; } } } return rd_sz; } static void iob_check_space(IOBFILE *iobf) { IOBLIST *ioblist = &iobf->ioblist; if (ioblist->tail_size < BUFFER_SIZE) { return; } if ((!iobf->can_seek && iobf->mark_set) || ioblist->buf_head->next == ioblist->buf_head) { /* allocate up to two buffers in normal operation and as many as * needed for files without seek capabilities. */ ioblist->buf_tail->next = malloc(sizeof(IOBuffer)); #if DEBUG n_total_buffers ++; if (n_total_buffers > max_total_buffers) { max_total_buffers = n_total_buffers; fprintf(stderr, "MAX BUFFERS: %d\n", max_total_buffers); } #endif ioblist->buf_tail = ioblist->buf_tail->next; ioblist->buf_tail->next = ioblist->buf_head; ioblist->tail_size = 0; } else { /* rotate list */ ioblist->buf_tail = ioblist->buf_tail->next; ioblist->buf_head = ioblist->buf_head->next; ioblist->tot_pos -= BUFFER_SIZE; ioblist->tot_size -= BUFFER_SIZE; ioblist->tail_size = 0; iobf->mark_wrap = ~0; } } /* Flush the buffer as much as possible, but we have to be careful not * to discard data if tot_pos < tot_size. In this case we discard all * data < tot_pos and leave the rest as is. */ static void iob_flush_buffer(IOBLIST *ioblist) { while (ioblist->buf_head != ioblist->buf_ptr) { ioblist->buf_tail->next = ioblist->buf_head->next; free(ioblist->buf_head); #if DEBUG n_total_buffers --; #endif ioblist->buf_head = ioblist->buf_tail->next; ioblist->tot_pos -= BUFFER_SIZE; ioblist->tot_size -= BUFFER_SIZE; } /* Check for the special case where we have one and only one buffer * and tot_pos points to the very end of it. In this case, discard * this buffer, too. The other possibility would be to allocate a * second buffer. */ if (ioblist->buf_head == ioblist->buf_head->next && ioblist->tot_pos == BUFFER_SIZE) { #if 1 ioblist->tot_pos = ioblist->tot_size = ioblist->buf_pos = ioblist->tail_size = 0; #else ioblist->buf_tail->next = malloc(sizeof(IOBuffer)); #if DEBUG n_total_buffers ++; if (n_total_buffers > max_total_buffers) { max_total_buffers = n_total_buffers; fprintf(stderr, "MAX BUFFERS: %d\n", max_total_buffers); } #endif ioblist->buf_tail = ioblist->buf_tail->next; ioblist->buf_tail->next = ioblist->buf_head; ioblist->tail_size = ioblist->buf_pos = 0; #endif } } void iobfrewind(IOBFILE *iobf) { rewind(iobf->istream); #if 0 if (1 || iobf->can_seek) { iob_release_buffer(&iobf->ioblist); iob_init_buffer(&iobf->ioblist); } else { iobf->ioblist.tot_pos = iobf->ioblist.buf_pos = 0; iobf->ioblist.buf_ptr = iobf->ioblist.buf_head; } #else /* The fastest way is: simply move the position pointer to end of buffer */ iobf->ioblist.tot_pos = iobf->ioblist.tot_size; iobf->ioblist.buf_pos = iobf->ioblist.tail_size; #endif if (iobf->ioblist_mark.buf_head) { iob_release_buffer(&iobf->ioblist_mark); } iobf->mark_set = 0; iobf->mark_wrap = 0; iobf->mark_pos = ~0; memset(&iobf->stdiomark, ~0, sizeof(iobf->stdiomark)); /* Clear status flags */ iobf->ungetc = EOF; iobf->eof = 0; } size_t iobfread(void *ptr, size_t size, size_t nmemb, IOBFILE *iobf) { IOBLIST *ioblist = &iobf->ioblist; size_t rq_size = size * nmemb, rd_size, rd_tot; size_t tail_rd; char *buf = ptr; #if HAVE_FCNTL int first = 1; int fcntl_err = 0; #endif int cnt; if (size*nmemb == 0) { return 0; } rd_tot = 0; tail_rd = ~0; cnt = 0; do { ++cnt; rd_size = iobfread_buffer(buf, rq_size, iobf); rq_size -= rd_size; rd_tot += rd_size; buf += rd_size; if (iobf->eof && rq_size) { iobf->eof = -1; break; } if (tail_rd && rq_size && !iobf->eof) { size_t tail_space; iob_check_space(iobf); tail_space = BUFFER_SIZE - ioblist->tail_size; #if HAVE_FCNTL if (!iobf->can_seek) { if (first && iobf->fflags != -1) { fcntl_err = fcntl(iobf->fd, F_SETFL, iobf->fflags | o_nonblock); } if (!first || (iobf->fd && iobf->fflags == -1) || fcntl_err) { tail_space = min(tail_space, rq_size); } } #else if (!iobf->can_seek && iobf->fd) tail_space = min(tail_space, rq_size); #endif tail_rd = fread(ioblist->buf_tail->buffer + ioblist->tail_size, 1, tail_space, iobf->istream); ioblist->tail_size += tail_rd; ioblist->tot_size += tail_rd; if (tail_rd < tail_space && feof(iobf->istream)) { iobf->eof = 1; } #if HAVE_FCNTL if (!iobf->can_seek && first && iobf->fflags != -1 && !fcntl_err) { first = 0; clearerr(iobf->istream); if ((fcntl_err = fcntl(iobf->fd, F_SETFL, iobf->fflags)) < 0) { fprintf(stderr, "iobfread(): unable to clear O_NONBLOCK: \"%s\"\n", strerror(errno)); } if (tail_rd == 0 && rq_size) { tail_rd = ~0; /* retry with blocking IO */ iobf->eof = 0; } } #endif } } while (tail_rd && rq_size); #if DEBUG iobf->read_count += rd_tot; #endif return rd_tot / size; } int iobfgetc(IOBFILE *iobf) { int c = EOF; unsigned char c_char; if (iobf->eof != -1 && iobfread(&c_char, 1, 1, iobf) == 1) { c = c_char; } return c; } int iobfsetmark(IOBFILE *iobf) { IOBLIST *ioblist = &iobf->ioblist; int result = 0; if (iobf->mark_set) { iobfclearmark(iobf); } /* FIXME: generate error if EOF condition is set? */ if (iobf->eof == -1) { return -1; } iob_flush_buffer(ioblist); iobf->mark_set = ~0; iobf->mark_wrap = 0; iobf->mark_pos = ioblist->tot_pos; iobf->mark_ungetc = iobf->ungetc; if (iobf->can_seek) { result = fgetpos(iobf->istream, &iobf->stdiomark); iob_copy_buffer(&iobf->ioblist_mark, &iobf->ioblist); } return result; } int iobfseekmark(IOBFILE *iobf) { IOBLIST *ioblist; if (!iobf->mark_set) { return -1; } if (iobf->mark_wrap) { if (fsetpos(iobf->istream, &iobf->stdiomark) != 0) { return -1; } iob_release_buffer(&iobf->ioblist); iob_copy_buffer(&iobf->ioblist, &iobf->ioblist_mark); iobf->mark_wrap = 0; } ioblist = &iobf->ioblist; ioblist->buf_ptr = ioblist->buf_head; ioblist->tot_pos = iobf->mark_pos; ioblist->buf_pos = iobf->mark_pos % BUFFER_SIZE; iobf->ungetc = iobf->mark_ungetc; /* Clear status flags on success */ if (iobf->eof == -1) { iobf->eof = 1; } #if DEBUG iobf->read_count = ioblist->tot_pos; #endif return 0; } int iobfclearmark(IOBFILE *iobf) { if (!iobf->mark_set) { return -1; } iobf->mark_set = 0; iobf->mark_wrap = 0; if (iobf->ioblist_mark.buf_head != NULL) { iob_release_buffer(&iobf->ioblist_mark); } return 0; } int iobfungetc(int c, IOBFILE *iobf) { if (c == EOF) { /* ??? */ iobf->ungetc = EOF; } else { iobf->ungetc = c & 0xff; if (iobf->eof == -1){ iobf->eof = 1; } } return c; } int iobfeof(IOBFILE *iobf) { if (iobf->ungetc != EOF) { return 0; } else if (iobf->ioblist.tot_pos < iobf->ioblist.tot_size) { return 0; } else if (iobf->eof == -1) { if (feof(iobf->istream)) { return 1; } iobf->eof = 0; return 0; } else { return 0; } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/oogl/util/iobuffer.h0000644000175000001440000000436510567007501015521 00000000000000/* * Copyright (C) 2006 Claus-Justus Heine This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * This file implements setpos()/getpos() facilities for non-seekable * files by generating a secondary dynamic file buffering of arbitrary * size on top of stdio. */ /* As a special exception the author of this files permits the * distribution of this software with Geomview. As long as this file * is distributed with Geomview, the conditions of the GNU Lesser * Public Licence apply. See the file "COPYING" in the top-level * directory. */ #ifndef _CH_IOBUFFER_H_ #define _CH_IOBUFFER_H_ #include #include #include typedef struct IOBFILE IOBFILE; extern IOBFILE *iobfileopen(FILE *istream); extern int iobfileclose(IOBFILE *iobf); extern IOBFILE *iobfopen(const char *name, const char *mode); extern int iobfclose(IOBFILE *iobf); #if HAVE_POPEN extern IOBFILE *iobpopen(const char *name, const char *mode); extern int iobpclose(IOBFILE *iobf); #endif extern FILE *iobfile(IOBFILE *iobf); extern size_t iobfread(void *ptr, size_t size, size_t nmemb, IOBFILE *iobf); extern int iobfgetc(IOBFILE *iobf); extern int iobfungetc(int c, IOBFILE *iobf); extern void iobfrewind(IOBFILE *iobf); extern long iobftell(IOBFILE *iobf); extern int iobfseek(IOBFILE *stream, long offset, int whence); extern char *iobfgets(char *s, int size, IOBFILE *iobf); extern int iobfeof(IOBFILE *iobf); extern int iobfileno(IOBFILE *iobf); extern size_t iobfgetbuffer(IOBFILE *iobf, void *ptr, size_t size, int direction); extern int iobfsetmark(IOBFILE *iobf); extern int iobfseekmark(IOBFILE *iobf); extern int iobfclearmark(IOBFILE *iobf); #endif geomview-1.9.4/src/lib/oogl/util/iobfutil.c0000644000175000001440000005001410622716760015526 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2002-2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2, or (at * your option) any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * Geometry object routines, like in futil.c, but FILE replace with * IOBFILE implemented in iobuffer.c. This way we can seek back safely * on pipes, sockets, etc. * * Utility routines, useful for many objects * * int * iobfgetnf(iobf, nfloats, floatp, binary) * Read an array of floats from a file in "ascii" or "binary" format. * Returns number of floats successfully read, should = nfloats. * "Binary" means "IEEE 32-bit floating-point" format. * * int * iobfgetni(IOBFILE *iobf, int nints, int *intsp, int binary) * Read an array of ints from a file in "ascii" or "binary" format. * Returns number of ints successfully read, should = nints. * "Binary" means "32-bit big-endian" integer format. * * int * iobfgetns(IOBFILE *iobf, int nshorts, short *intsp, int binary) * Read an array of shorts from a file in "ascii" or "binary" format. * Returns number of shorts successfully read, should = nints. * "Binary" means "16-bit big-endian" integer format. * * int * iobfexpectstr(IOBFILE *iobf, char *string) * Expect the given string to appear immediately on file. * Return 0 if the complete string is found, * else the offset+1 of the last matched char within string. * The first unmatched char is ungetc'd. * * int * iobfexpecttoken(IOBFILE *iobf, char *string) * Expect the given string to appear on the iobf, possibly after * skipping some white space and comments. * Return 0 if found, else the offset+1 of last matched char in string. * The first unmatched char is ungetc'd. * * int iobfnextc(IOBFILE *f, int flags) * Advances f to the next "interesting" character and * returns it. The returned char is ungetc'ed so the next getc() * will yield the same value. * Interesting depends on flags: * 0 : Skip blanks, tabs, newlines, and comments (#...\n). * 1 : Skip blanks, tabs, and comments, but newlines are interesting * (including the \n that terminates a comment). * 2 : Skip blanks, tabs, and newlines, but stop at #. * 3 : Skip blanks and tabs but stop at # or \n. * * int async_iobfnextc(IOBFILE *f, int flags, int fd) * Like fnextc() above, but guarantees not to block if no data is * immediately available. It returns either an interesting character, * EOF, or the special code NODATA (== -2). * if fd == -1, then fileno(f) is used, otherwise fd. * * int async_iobfgetc(IOBFILE *f, int fd) * Like getc(), but guarantees not to block. Returns NODATA if * nothing is immediately available. * * char *iobftoken(IOBFILE *f, int flags) * Skips uninteresting characters with fnextc(f, flags), * then returns a "token" - string of consecutive interesting characters. * Returns NULL if EOF is reached with no token, or if * flags specifies stopping at end-of-line and this is encountered with * no token found. * The token is effectively statically allocated and will be * overwritten by the next ftoken() call. * * char *iobfdelimtok(char *delims, IOBFILE *f, int flags) * Like ftoken(), but specially handles the characters in delims[]. * If one appears at the beginning of the token, it's returned as * a single-character token. * If a member of delims[] appears after other characters have been * accumulated, it's considered to terminate the token. * So successive calls to fdelimtok("()", f, 0) * on a file containing (fred smith) * would return "(", "fred", "smith", and ")". * Behavior is undefined if one of the predefined delimiters * (white space or #) appears in delims[]. Explicit quoting * (with ", ' or \) overrides detection of delimiters. * * int iobfgettransform(IOBFILE *f, int ntransforms, * float *transforms, int binary) * Reads 4x4 matrices from IOBFILE. Returns the number of matrices found, * up to ntransforms. Returns 0 if no numbers are found. * On finding incomplete matrices (not a multiple of 16 floats) * returns -1, regardless of whether any whole matrices were found. * Matrices are expected in the form used to transform a row vector * multiplied on the left, i.e. p * T -> p'; thus Euclidean translations * appear in the last row. * * int iobfputtransform(IOBFILE *f, int ntransforms, * float *transforms, int binary) * Writes 4x4 matrices to IOBFILE. Returns the number written, i.e. * ntransforms unless an error occurs. * * int iobfputnf(IOBFILE *f, int nfloats, float *fv, int binary) * Writes 'nfloats' floats to the given file. ASCII is in %g format, * separated by blanks. * */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include /* Try to get the prototype for select */ #if HAVE_SYS_SELECT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_TIME_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #include #include #include #include "ooglutil.h" #include "iobuffer.h" #undef getc #define getc gobble #define ungetc gobble #define fgetc gobble #ifndef WORDS_BIGENDIAN static inline int gv_ntohl(unsigned int v) { return (((v >> 24) & 0x000000FF) | ((v << 24) & 0xFF000000) | ((v >> 8) & 0x0000FF00) | ((v << 8) & 0x00FF0000)); } static inline short gv_ntohs(unsigned short s) { return (((s >> 8) & 0x00FF) | ((s << 8) & 0xFF00)); } #else static inline int gv_ntohl(unsigned int v) { return v; } static inline short gv_ntohs(unsigned short s) { return s; } #endif static inline short gv_htons(unsigned short s) { return gv_ntohs(s); } static inline int gv_htonl(unsigned int v) { return gv_ntohl(v); } int iobfnextc(IOBFILE *f, int flags) { int c; c = iobfgetc(f); for(;;) { switch(c) { case EOF: return EOF; case ' ': case '\t': break; /* Always skip blanks and tabs */ case '#': if(flags & 2) /* 2: stop on comments, else skip */ goto fim; while((c = iobfgetc(f)) != '\n' && c != EOF) ; continue; /* Rescan this c */ case '\n': if(!(flags & 1)) /* 1: stop on \n's, else skip them */ break; /* flags&1 => fall into default */ default: fim: iobfungetc(c, f); return c; } c = iobfgetc(f); } } /* Read an array of white-space-separated floats from file 'f' in * ASCII, fast. Returns the number successfully read. */ int iobfgetnf(IOBFILE *f, int maxf, float *fv, int binary) { int ngot; float v = 0; int c = EOF; long n; int s, es, nd, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return iobfread((char *)fv, sizeof(float), maxf, f); #else /* not native big-endian IEEE */ union { int wi; float wf; } w; for(n=0; n 0; n++) { w.wi = gv_ntohl(w.wi); fv[n] = w.wf; } return n; #endif /* not native big-endian IEEE */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxf; ngot++) { if(iobfnextc(f, 0) == EOF) return(ngot); n = 0; s = 0; nd = 0; any = 0; if((c = iobfgetc(f)) == '-') { s = 1; c = iobfgetc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { /* 2^31 / 10 */ v = any ? v*pow(10.0, nd) + (float)n : (float)n; nd = n = 0; any = 1; } c = iobfgetc(f); } v = any ? v*pow(10.0, nd) + (float)n : (float)n; any += nd; if(c == '.') { nd = n = 0; while((c = iobfgetc(f)) >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { v += (float)n / pow(10.0f, nd); n = 0; } } v += (float)n / pow(10.0, nd); } if(any == 0 && nd == 0) break; if(c == 'e' || c == 'E') { es = nd = 0; switch(c = iobfgetc(f)) { case '-': es = 1; /* And fall through */ case '+': c = iobfgetc(f); } n = 0; while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; c = iobfgetc(f); } if(nd == 0) break; if(es) v /= pow(10.0, n); else v *= pow(10.0, n); } fv[ngot] = s ? -v : v; } if(c!=EOF) iobfungetc(c, f); return(ngot); } /* Read an array of white-space-separated floats from file 'f' in * ASCII, fast. Returns the number successfully read. */ int iobfgetnd(IOBFILE *f, int maxd, double *dv, int binary) { int ngot; double v = 0; int c = EOF; long n; int s, es, nd, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return iobfread((char *)dv, sizeof(double), maxd, f); #else /* not native big-endian IEEE */ union { int wi[2]; double wd; } w; int tmp; for(n=0; n 0; n++) { tmp = gv_ntohl(w.wi[0]); w.wi[0] = gv_ntohl(w.wi[1]); w.wi[1] = tmp; dv[n] = w.wd; } return n; #endif /* not native big-endian IEEE */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxd; ngot++) { if(iobfnextc(f, 0) == EOF) return(ngot); n = 0; s = 0; nd = 0; any = 0; if((c = iobfgetc(f)) == '-') { s = 1; c = iobfgetc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { /* 2^31 / 10 */ v = any ? v*pow(10.0, nd) + (float)n : (float)n; nd = n = 0; any = 1; } c = iobfgetc(f); } v = any ? v*pow(10.0, (double)nd) + (float)n : (float)n; any += nd; if(c == '.') { nd = n = 0; while((c = iobfgetc(f)) >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; if(n >= 214748364) { v += (float)n / pow(10.0, (double)nd); n = 0; } } v += (float)n / pow(10.0, (double)nd); } if(any == 0 && nd == 0) break; if(c == 'e' || c == 'E') { es = nd = 0; switch(c = iobfgetc(f)) { case '-': es = 1; /* And fall through */ case '+': c = iobfgetc(f); } n = 0; while(c >= '0' && c <= '9') { n = n*10 + c - '0'; nd++; c = iobfgetc(f); } if(nd == 0) break; if(es) v /= pow(10.0, (double)n); else v *= pow(10.0, n); } dv[ngot] = s ? -v : v; } if(c!=EOF) iobfungetc(c, f); return(ngot); } int iobfgetni(IOBFILE *f, int maxi, int *iv, int binary) { int ngot; int c = EOF; long n; int s, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return iobfread((char *)iv, sizeof(int), maxi, f); #else /* not native big-endian int's */ int w; for(n = 0; n < maxi && iobfread(&w,4,1,f) > 0; n++) iv[n] = gv_ntohl(w); return n; #endif /* not native big-endian int's */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxi; ngot++) { if(iobfnextc(f, 0) == EOF) return(ngot); n = 0; s = 0; any = 0; if((c = iobfgetc(f)) == '-') { s = 1; c = iobfgetc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; any = 1; c = iobfgetc(f); } if(!any) break; iv[ngot] = s ? -n : n; } if(c!=EOF) iobfungetc(c, f); return(ngot); } int iobfgetns(IOBFILE *f, int maxs, short *sv, int binary) { int ngot; int c = EOF; long n; int s, any; if(binary) { #if WORDS_BIGENDIAN /* Easy -- our native floating point == big-endian IEEE */ return iobfread((char *)sv, sizeof(short), maxs, f); #else /* not native big-endian int's */ short w; for(n = 0; n < maxs && iobfread(&w,2,1,f) > 0; n++) sv[n] = gv_ntohs(w); return n; #endif /* not native big-endian int's */ } /* Read ASCII format floats */ for(ngot = 0; ngot < maxs; ngot++) { if(iobfnextc(f, 0) == EOF) return(ngot); n = s = any = 0; if((c = iobfgetc(f)) == '-') { s = 1; c = iobfgetc(f); } while(c >= '0' && c <= '9') { n = n*10 + c - '0'; any = 1; c = iobfgetc(f); } if(!any) break; sv[ngot] = s ? -n : n; } if(c!=EOF) iobfungetc(c, f); return(ngot); } /* * Check for a string on a file. * If found, return 0. * If not, return the offset of the last matched char +1 * and iobfungetc the failed char so the caller can see it. */ int iobfexpectstr(IOBFILE *iobf, char *str) { char *p = str; int c; while(*p != '\0') { if((c = iobfgetc(iobf)) != *p++) { if(c != EOF) iobfungetc(c, iobf); return(p - str); } } return 0; } /* * Check for a string on a iobf, skipping leading blanks. */ int iobfexpecttoken(IOBFILE *iobf, char *str) { (void) iobfnextc(iobf, 0); return iobfexpectstr(iobf, str); } int iobfescape(IOBFILE *f) { int n, k, c = iobfgetc(f); switch(c) { case 'n': return '\n'; case 'b': return '\b'; case 't': return '\t'; case 'r': return '\r'; } if(c < '0' || c > '7') return c; n = c-'0'; k = 2; while((c = iobfgetc(f)) >= '0' && c <= '7') { n = (n*8) | (c-'0'); if(--k <= 0) return n; } if(c != EOF) iobfungetc(c, f); return n; } /* * Get a token, return a string or NULL. * Tokens may be "quoted" or 'quoted'; backslashes accepted. * The string is statically allocated and should be copied if * needed before the next call to ftoken(). */ char * iobftoken(IOBFILE *iobf, int flags) { static char *token = NULL; static int troom = 0; int c; char *p; int term; if((term = iobfnextc(iobf, flags)) == EOF) return NULL; if(token == NULL) { troom = 50; token = malloc(troom * sizeof(char)); if(token == NULL) return NULL; } p = token; switch(term) { case '"': case '\'': (void) iobfgetc(iobf); for(;;) { if((c = iobfgetc(iobf)) == EOF || c == term) break; else if(c == '\\') c = iobfescape(iobf); *p++ = c; if(p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } } break; default: if(isspace(term)) return NULL; while((c = iobfgetc(iobf)) != EOF && !isspace(c)) { if(c == '\\') c = iobfescape(iobf); *p++ = c; if(p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } } break; } *p = '\0'; return token; } /* * Get a token, return a string or NULL. * Tokens may be "quoted" or 'quoted'; backslashes accepted. * The string is statically allocated and should be copied if * needed before the next call to ftoken(). */ char * iobfdelimtok(char *delims, IOBFILE *iobf, int flags) { static char *token = NULL; static int troom = 0; int c; char *p; char *q; int term; if((term = iobfnextc(iobf, flags)) == EOF) return NULL; if(token == NULL) { troom = 50; token = malloc(troom * sizeof(char)); if(token == NULL) return NULL; } p = token; switch(term) { case '"': case '\'': (void) iobfgetc(iobf); for(;;) { if((c = iobfgetc(iobf)) == EOF || c == term) break; else if(c == '\\') c = iobfescape(iobf); *p++ = c; if(p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } } break; default: if(isspace(term)) return NULL; while((c = iobfgetc(iobf)) != EOF && !isspace(c)) { if(c == '\\') c = iobfescape(iobf); *p = c; if(++p == &token[troom]) { token = realloc(token, troom * 2); if(token == NULL) return NULL; p = &token[troom]; troom *= 2; } for(q = delims; *q && c != *q; q++) ; if(*q) { if(p > token+1) { p--; iobfungetc(c, iobf); } break; } } break; } *p = '\0'; return token; } /* * Load one or more Transforms from a file. * Return 1 on success, 0 on failure. */ int iobfgettransform(IOBFILE *iobf, int ntrans, float *trans /* float trans[ntrans][4][4] */, int binary) { float *T; int nt; for(nt = 0; nt < ntrans; nt++) { T = trans + 16*nt; switch(iobfgetnf(iobf, 16, T, binary)) { case 16: break; case 0: return nt; default: return -1; } } return ntrans; } /* * Given a file pointer, return a string attempting to show the context * of its current position. If no data is available, returns the empty string. */ #define CONTEXT_SIZE 256 char * iobfcontext(IOBFILE *f) { static char *cont = NULL; static char dflt[] = ""; char buf[1024]; int npre, nlpre, nlpost, tab, len; int predots = 4, postdots = 4; char *p, *q; char *lastline, *lastnonblank; char base[CONTEXT_SIZE], *ptr; int cnt; if (f == NULL) return dflt; if (iobfeof(f)) { return "> END OF IOBFILE\n"; } cnt = iobfgetbuffer(f, base, sizeof(base), -1); if(cnt <= 0) { return dflt; } ptr = base + cnt; p = ptr; for(npre = nlpre = 0; --p >= base && npre < CONTEXT_SIZE; npre++) { if(*p == '\n') { if(++nlpre > 2 || npre > 60) { predots = 0; break; } } else if(*p & 0x80 || *p == 0) { /* binary data? */ break; } } strcpy(buf, "> ... "); q = buf + 2 + predots; tab = 2 + predots; for(p = ptr - npre; p < ptr; ) { switch(*q++ = *p++) { case '\n': case '\r': *q++ = '>'; *q++ = ' '; tab = 2; break; case '\t': tab += 8-(tab&7); break; default: tab++; } } len = npre; nlpost = 0; lastline = lastnonblank = q; for(p = ptr; p < ptr + cnt && len < CONTEXT_SIZE; len++, q++) { *q = *p++; if(*q == '\n') { if(nlpost == 0) { while(--tab > 0) *++q = '-'; /* Point ---^ to error */ *++q = '^'; *++q = '\n'; } if((++nlpost >= 2 || len > 80) && len > 32) { postdots = 0; break; } lastline = q; *++q = '>'; *++q = ' '; } else if(*q & 0x80 || *q == 0) /* Binary data */ break; else if(isprint(*q)) lastnonblank = q; } if(postdots && lastnonblank < lastline) { q = lastline; /* Suppress trailing white space */ postdots = 0; /* to avoid final ``> ...'' */ } strcpy(q, " ...\n" + 4-postdots); if(nlpost == 0) { q += strlen(q); while(--tab > 0) *q++ = '-'; strcpy(q, "^\n"); } if(cont) { free(cont); } return (cont = strdup(buf)); } /***************************************************************************/ int iobfhasdata(IOBFILE *f) { return iobfgetbuffer(f, NULL, 0, 1) > 0; } int async_iobfgetc(IOBFILE *f) { #if HAVE_SELECT fd_set fds; int fd; static struct timeval notime = { 0, 0 }; fd = iobfileno(f); if(iobfhasdata(f)) return iobfgetc(f); if (fd < 0) return NODATA; FD_ZERO(&fds); FD_SET(fd, &fds); if(select(fd+1, &fds, NULL, NULL, ¬ime) == 1) return iobfgetc(f); return NODATA; #else return iobfgetc(f); #endif } int async_iobfnextc(IOBFILE *f, int flags) { int c; c = async_iobfgetc(f); for(;;) { switch(c) { case EOF: case NODATA: return(c); case ' ': case '\t': break; /* Always skip blanks and tabs */ case '#': if(flags & 2) /* 2: stop on comments, else skip */ goto fim; while((c = iobfgetc(f)) != '\n' && c != EOF) ; continue; /* Rescan this c */ case '\n': if(!(flags & 1)) /* 1: stop on \n's, else skip them */ break; /* flags&1 => fall into default */ default: fim: iobfungetc(c, f); return(c); } c = async_iobfgetc(f); } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/oogl/util/malloc-debug.c0000644000175000001440000000632510604514345016245 00000000000000/* GNAH. Nothing more to be said ... */ #include #include #include #if HAVE_MALLOC_H # include #endif #define N_RECORDS 10000 #define REC_FREE 0 struct alloc_record { void *ptr; size_t size; unsigned long seq; const char *file; const char *func; int line; }; static struct alloc_record records[N_RECORDS]; unsigned long malloc_seq; int n_alloc; size_t alloc_size; static void record_alloc(void *ptr, size_t size, const char *file, const char *func, int line) { unsigned long seq_min; int i, seq_min_i = 0; for (seq_min = ~0, i = 0; i < N_RECORDS; i++) { if (records[i].seq == REC_FREE) { seq_min_i = i; break; } else if (records[i].seq < seq_min) { seq_min = records[i].seq; seq_min_i = i; } } records[seq_min_i].seq = ++malloc_seq; records[seq_min_i].ptr = ptr; records[seq_min_i].size = size; records[seq_min_i].file = file; records[seq_min_i].func = func; records[seq_min_i].line = line; ++n_alloc; alloc_size += size; } static void record_free(void *ptr) { int i; if (ptr == NULL) { return; } for (i = 0; i < N_RECORDS; i++) { if (ptr == records[i].ptr) { alloc_size -= records[i].size; memset(&records[i], 0, sizeof(records[i])); records[i].seq = REC_FREE; --n_alloc; break; } } } void *malloc_record(size_t size, const char *file, const char *func, int line) { void *ptr; if (size == 0) { return NULL; } ptr = malloc(size); record_alloc(ptr, size, file, func, line); return ptr; } void free_record(void *ptr) { record_free(ptr); /* it is not an error if we do not find the ptr in our list; we only * store the last N_RECORDS allocations */ free(ptr); } char *strdup_record(const char *string, const char *file, const char *func, int line) { size_t len = strlen(string); char *newstring; newstring = malloc_record(len+1, file, func, line); memcpy(newstring, string, len+1); return newstring; } void *realloc_record(void *ptr, size_t size, const char *file, const char *func, int line) { record_free(ptr); ptr = realloc(ptr, size); record_alloc(ptr, size, file, func, line); return ptr; } void *calloc_record(size_t nmemb, size_t size, const char *file, const char *func, int line) { void *ptr; size *= nmemb; ptr = malloc_record(size, file, func, line); memset(ptr, 0, size); return ptr; } static int seq_cmp(const void *_a, const void *_b) { const struct alloc_record *a = _a, *b = _b; if (a->seq < b->seq) { return 1; } if (a->seq > b->seq) { return -1; } return 0; } void print_alloc_records(void) { int i; qsort(records, N_RECORDS, sizeof(struct alloc_record), seq_cmp); for (i = 0; i < N_RECORDS; i++) { if (records[i].seq == REC_FREE) { break; } fprintf(stderr, "%ld: %d@%p (%s, %s(), %d)\n", records[i].seq, (int)records[i].size, records[i].ptr, records[i].file, records[i].func, records[i].line); } fprintf(stderr, "#records: %d\n", i); } #if HAVE_MALLINFO struct mallinfo gv_mallinfo(void) { return mallinfo(); } #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/oogl/util/Headers0000644000175000001440000000012110600044566015027 00000000000000create.h fsa.h ooglutil.h porting.h ray.h surf.h iobuffer.h dbllist.h freelist.h geomview-1.9.4/src/lib/oogl/refcomm/0000777000175000001440000000000010665240670014303 500000000000000geomview-1.9.4/src/lib/oogl/refcomm/reference.h0000644000175000001440000000452410571274204016327 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_REFERENCE_H_ #define _GV_REFERENCE_H_ #include "ooglutil.h" #include "dbllist.h" /* * Public definitions for Reference & Communications package */ #define REFERENCEFIELDS \ int magic; \ int ref_count; \ DblListNode handles typedef struct Ref { REFERENCEFIELDS; } Ref ; #define REFCNT(obj) RefCount((Ref *)(obj)) #define REFINCR(obj) RefIncr((Ref *)(obj)) #define REFDECR(obj) RefDecr((Ref *)(obj)) #define REFGET(type, obj) (REFINCR((obj)), (type *)(obj)) #define REFPUT(obj) REFDECR(obj) /* Initializes a Reference */ static inline void RefInit(Ref *ref, int magic) { ref->ref_count = 1; ref->magic = magic; DblListInit(&ref->handles); } /* Returns current ref count */ static inline int RefCount(Ref *ref) { return ref != NULL ? ref->ref_count : 0; } /* Increments count, returns object */ static inline int RefIncr(Ref *ref) { if (ref != NULL) { return ++ref->ref_count; } else { return 0; } } /* Decrements count, returns it */ static inline int RefDecr(Ref *ref) { if (ref == NULL) { return 0; } if (--ref->ref_count < 0) { OOGLError(1, "RefDecr: ref %x count %d < 0!", ref, ref->ref_count); abort(); } return ref->ref_count; } /* Returns magic number */ static inline int RefMagic(Ref *ref) { return ref->magic; } #endif /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/oogl/refcomm/handle.c0000644000175000001440000002507710600240111015604 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "handleP.h" #include "freelist.h" static DBLLIST(AllHandles); static DEF_FREELIST(HRef); static DEF_FREELIST(Handle); #define HANDLE_DEBUG 0 void handle_dump(void); static HandleOps NullOps = { "null", }; void HandlesSetObjSaved(bool obj_saved) { HandleOps *ops; Handle *h; DblListIterateNoDelete(&AllHandles, HandleOps, node, ops) { DblListIterateNoDelete(&ops->handles, Handle, opsnode, h) { h->obj_saved = obj_saved; } } } /* Iterate over Ref->handles. * * This function increases the ref-count of the handle, only this way * the caller may safely delete the returned handle; if pos != NULL, * then we first iterate to the next element in the list, and then * call HandleDelete() for pos to undo the REFGET from the previous * call. The caller should always iterate until we return NULL, * otherwise spurious ref-counts will be the result. */ Handle *HandleRefIterate(Ref *r, Handle *pos) { if (pos == NULL) { return DblListEmpty(&r->handles) ? NULL : REFGET(Handle, DblListContainer(r->handles.next, Handle, objnode)); } else { DblListNode *next = pos->objnode.next; HandleDelete(pos); /* undo REFGET(), possibly really delete the handle */ return next == &r->handles ? NULL : REFGET(Handle, DblListContainer(next, Handle, objnode)); } } /* iterate over Pool->handles */ Handle *HandlePoolIterate(Pool *pool, Handle *pos) { if (pos == NULL) { return DblListEmpty(&pool->handles) ? NULL : REFGET(Handle, DblListContainer(pool->handles.next, Handle, poolnode)); } else { DblListNode *next = pos->objnode.next; HandleDelete(pos); return next == &pool->handles ? NULL : REFGET(Handle, DblListContainer(next, Handle, poolnode)); } } void HandleUpdRef(Handle **hp, Ref *parent, Ref **objp) { Handle *h; if((h = *hp) != NULL && objp != NULL && h->object != *objp) { if (*objp) { if (h->ops->delete) { (*h->ops->delete)(*objp); } else { REFPUT(*objp); } } *objp = REFGET(Ref, h->object); } } void HandleUnregister(Handle **hp) { Handle *h; HRef *r, *rn; if (hp == NULL || (h = *hp) == NULL) { return; } DblListIterate(&h->refs, HRef, node, r, rn) { if(r->hp == hp) { DblListDelete(&r->node); FREELIST_FREE(HRef, r); REFPUT(h); } } } void HandleUnregisterJust(Handle **hp, Ref *obj, void *info, void (*update) P((Handle **, Ref *, void *))) { Handle *h; HRef *rp, *rnext; if(hp == NULL || (h = *hp) == NULL) { return; } DblListIterate(&h->refs, HRef, node, rp, rnext) { if(rp->hp == hp && (obj == NULL || rp->parentobj == obj) && (info == NULL || rp->info == info) && (update == NULL || rp->update == update)) { DblListDelete(&rp->node); FREELIST_FREE(HRef, rp); REFPUT(h); } } } /* * Remove all callbacks on any handle with the given properties. */ void HandleUnregisterAll(Ref *obj, void *info, void (*update) P((Handle **, Ref *, void *))) { HandleOps *ops; Handle *h; HRef *r, *rn; DblListIterateNoDelete(&AllHandles, HandleOps, node, ops) { DblListIterateNoDelete(&ops->handles, Handle, opsnode, h) { DblListIterate(&h->refs, HRef, node, r, rn) { if((obj == NULL || r->parentobj == obj) && (info == NULL || r->info == info) && (update == NULL || r->update == update)) { DblListDelete(&r->node); FREELIST_FREE(HRef, r); REFPUT(h); } } } } } static void handleupdate(Handle *h, HRef *rp) { if(rp->update && h == *rp->hp) { (*rp->update)(rp->hp, rp->parentobj, rp->info); } else { /* BUG */ OOGLError(1, "handleupdate mismatch: h %x %s, rp->hp %x, *rp->hp %x, rp->parentobj %x, rp->update %x", h, h->name, rp->hp, *rp->hp, rp->parentobj, rp->update); if(*rp->hp) { OOGLError(1, "... *rp->hp->name %s", (*rp->hp)->name); } } } int HandleRegister(Handle **hp, Ref *parentobj, void *info, void (*update) P((Handle **, Ref *, void *))) { Handle *h; HRef *rp; if (hp == NULL || (h = *hp) == NULL) { return false; } DblListIterateNoDelete(&h->refs, HRef, node, rp) { if (rp->hp == hp && rp->parentobj == parentobj && rp->info == info) { goto update_out; } } FREELIST_NEW(HRef, rp); REFINCR(h); rp->hp = hp; rp->parentobj = parentobj; rp->info = info; DblListAdd(&h->refs, &rp->node); update_out: rp->update = update; handleupdate(h, rp); return true; } char * HandleName(Handle *h) { return h ? h->name : NULL; } HandleOps *HandleOpsByName(char *name) { HandleOps *ops; DblListIterateNoDelete(&AllHandles, HandleOps, node, ops) { if (strcmp(name, ops->prefix)) { return ops; } } return NULL; } Handle * HandleByName(char *name, HandleOps *ops) { Handle *h; if (ops == NULL) { DblListIterateNoDelete(&AllHandles, HandleOps, node, ops) { DblListIterateNoDelete(&ops->handles, Handle, opsnode, h) { if (strcmp(h->name, name) == 0) { return REFGET(Handle, h); } } } } else { if (ops->handles.next == NULL) { DblListInit(&ops->handles); DblListAdd(&AllHandles, &ops->node); } DblListIterateNoDelete(&ops->handles, Handle, opsnode, h) { if (strcmp(h->name, name) == 0) { return REFGET(Handle, h); } } } return NULL; } static Handle * handlecreate(char *name, HandleOps *ops) { Handle *h; #if HANDLE_DEBUG OOGLWarn("Creating handle with name \"%s\"", name); #endif FREELIST_NEW(Handle, h); RefInit((Ref *)h, HANDLEMAGIC); h->ops = ops = ops ? ops : &NullOps; h->name = strdup(name); h->object = NULL; h->whence = NULL; h->permanent = false; DblListInit(&h->refs); /* The following two are nodes, not list-heads, but this way we can * safely call DblListDelete(), even if there is no associated list. */ DblListInit(&h->objnode); DblListInit(&h->poolnode); if (ops->handles.next == NULL) { DblListInit(&ops->handles); DblListAdd(&AllHandles, &ops->node); } DblListAddTail(&ops->handles, &h->opsnode); /* handle_dump();*/ return h; } /* * Assign a new object to a Handle. */ int HandleSetObject(Handle *h, Ref *object) { HRef *ref; if(h == NULL) { return false; } if(h->object == object) { return true; } DblListDelete(&h->objnode); if (h->object) { if (h->ops->delete != NULL) { (*h->ops->delete)(h->object); } else { REFPUT(h->object); } } h->object = REFGET(Ref, object); if (object) { DblListAddTail(&object->handles, &h->objnode); } DblListIterateNoDelete(&h->refs, HRef, node, ref) { handleupdate(h, ref); } return true; } /* * Create a Handle, don't reassign its value. */ Handle * HandleCreate(char *name, HandleOps *ops) { Handle *h; h = HandleByName(name, ops); if (h == NULL) { h = handlecreate(name, ops); } return h; } /* * Global handle: increase the ref-count twice. */ Handle * HandleCreateGlobal(char *name, HandleOps *ops) { Handle *h; h = HandleCreate(name, ops); if (!h->permanent) { h->permanent = true; return REFGET(Handle, h); } else { return h; } } /* * Create a Handle (or reassign its value if it already exists) */ Handle * HandleAssign(char *name, HandleOps *ops, Ref *object) { Handle *h; h = HandleCreate(name, ops); HandleSetObject(h, object); return h; } /* * Return the current object held by a Handle. */ Ref * HandleObject(Handle *h) { return h->object; } Pool * HandlePool(Handle *h) { return h->whence; } void HandlePDelete(Handle **hp) { if(hp && *hp) { HandleUnregister(hp); HandleDelete(*hp); *hp = NULL; } } /* Simple debugging aid: dump the list of currently defined handles * and their ref-counts, and the ref. counts of the attached object * (if any). */ void handle_dump(void) { HandleOps *ops; Handle *h; OOGLWarn("Active handles:"); DblListIterateNoDelete(&AllHandles, HandleOps, node, ops) { DblListIterateNoDelete(&ops->handles, Handle, opsnode, h) { OOGLWarn(" %s[%s]@%p (%s: #%d, o: #%d )", ops->prefix, h->name, (void *)h, h->permanent ? "H" : "h", RefCount((Ref *)h), h->object ? RefCount((Ref *)h->object) : -1); } } } /* In principle, it is not necessary to distinguish between permanent * and non-permanent handles IF the ref-counts are kept up to date. */ void HandleDelete(Handle *h) { if (h == NULL) { return; } if (h->magic != HANDLEMAGIC) { OOGLWarn("Internal warning: HandleDelete of non-Handle %x (%x != %x)", h, h->magic, HANDLEMAGIC); return; } if (REFPUT(h) > 0) { return; } #if HANDLE_DEBUG OOGLWarn("Deleting handle with name \"%s\"", h->name); if (!DblListEmpty(&h->refs)) { OOGLWarn("Deleting handle with active back references."); abort(); } #endif /* remove ourselves from various lists */ DblListDelete(&h->objnode); DblListDelete(&h->opsnode); DblListDelete(&h->poolnode); if (h->object) { /* undo RefIncr() from HandleSetObject() */ if (h->ops->delete) { (*h->ops->delete)(h->object); } else { REFPUT(h->object); } } /* Don't let Pool code think we have something cached in this handle! */ if (h->whence && h->whence->seekable) { h->whence->flags &= ~PF_ANY; PoolClose(h->whence); } if(h->name) { free(h->name); } FREELIST_FREE(Handle, h); /* handle_dump();*/ } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/oogl/refcomm/handle.h0000644000175000001440000001353310575025265015631 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _HANDLE_ #define _HANDLE_ /* * Communications -- Public definitions for Handle package. */ #include "ooglutil.h" #include "reference.h" #include "dbllist.h" typedef struct Handle Handle; typedef struct Pool Pool; int HandleSetObject( Handle *, Ref *object ); Ref *HandleObject( Handle * ); void HandlePDelete(Handle **hp); char *HandleName( Handle * ); void HandleDelete( Handle * ); Pool *HandlePool( Handle * ); Handle *HandleRefIterate(Ref *r, Handle *pos); Handle *HandlePoolIterate(Pool *p, Handle *pos); /* set obj_saved flag of all handles */ void HandlesSetObjSaved(bool obj_saved); #if 0 /* stuff which is nowhere defined nor referenced */ #define IO_HANDLES 1 #define IO_COMPLETE 2 int HandleExport( Handle *, Pool * ); /* Export */ int HandleUnExport( Handle * ); /* Cancel exported object if possible */ int HandleImport( Handle * ); /* Import now (possibly blocking) */ int PoolOutMode( int poflags ); /* Returns old IO mode */ #endif /* * Data-specific operations for (stream-type) Pools (files, pipes). */ typedef struct HandleOps { char *prefix; /* Prefix for unique external naming */ int (*strmin) P((Pool *, Handle **, Ref **)); /* Read from stream */ int (*strmout) P((Pool *, Handle *, Ref *)); /* Write */ void (*delete) P((Ref *)); /* Delete object */ int (*resync) P((Pool *)); /* Resync pool on import err */ int (*close) P((Pool *)); /* Close pool */ DblListNode handles; /* list of all handles with these ops */ DblListNode node; /* node into list of all ops */ } HandleOps; /* * Given a string using the reference syntax, * e.g. ``name:file'' or ``name:'', * do whatever's necessary to create and return a handle to it. * Might entail a lookup of an existing handle, * or opening and possibly reading a file (as a stream-type Pool). * * The caller of this functions owns the returned handle and * must call HandleDelete() to get rid of the returned handle. */ extern Handle *HandleReferringTo(int prefixch, char *str, HandleOps *ops, Handle **hp); /* * Search for ops matching prefix. */ extern HandleOps *HandleOpsByName(char *prefix); /* * Given a Handle's name and type (as given by HandleOps), * return it or NULL if it doesn't exist. * * The caller owns the returned handle, i.e. the reference * count of the handle is incremented by this function. */ extern Handle *HandleByName( char *, HandleOps * ); /* * If a Handle with this name already exists, return it; * otherwise, create a new one with NULL value. * * If the handle already exists then its reference count is * incremented by this function. */ extern Handle *HandleCreate( char *name, HandleOps *ops ); /* * Same as HandleCreate() for an existing global handle, but * if the handle does not already exist increment the * ref-count twice s.t. the handle cannot be deleted. */ extern Handle *HandleCreateGlobal( char *name, HandleOps *ops); /* * Set a Handle's object to obj, creating the Handle if necessary. * Update all registered references to the Handle's value. * Return the (possibly new) Handle. * * If the handle already exists then its reference count is * incremented by this function. */ extern Handle *HandleAssign( char *name, HandleOps *ops, Ref *obj ); /* * Register a reference to a Handle's value. * Whenever the value changes, a call is made to: * (*update)(Handle **hp, Ref *parentobject, void *info) * It's intended that "info" will be a key used by the update * procedure to know which reference to update. * The update procedure is automatically called once when * registration is done. */ extern int HandleRegister( Handle **hp, Ref *parent, void *info, void (*update)()); /* * Un(all callbacks on) a reference to a Handle's value. * It's important to do this when deleting an object, * lest dangling pointers cause trouble. * It's harmless to remove a reference which was never registered. */ extern void HandleUnregister(Handle **hp); /* Unjust one callback on a reference to a Handle's value. * HandleUnregister() is the one to use when deleting an object. * The viewer needs this to keep track of callbacks it plants * throughout Geom trees, which trigger e.g. BBox recomputation. */ extern void HandleUnregisterJust(Handle **hp, Ref *par, void *info, void (*upd)()); /* * Unall callbacks matching a given pattern, no matter * which Handle they're associated with. Another routine needed * for the viewer, called whenever a Geom tree is replaced. */ extern void HandleUnregisterAll(Ref *par, void *info, void (*upd)()); /* * Suitable update() func for HandleRegister in many cases. * Just deletes *objp then assigns *objp = (*hp)->object when called. */ extern void HandleUpdRef(Handle **hp, Ref *parent, Ref **objp); #endif /*_HANDLE_*/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/oogl/refcomm/Makefile.am0000644000175000001440000000032410570571712016251 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = librefcomm.la librefcomm_la_SOURCES = \ handle.c streampool.c handle.h handleP.h reference.h streampool.h #librefcomm_la_LDFLAGS = -rgeomview-1.9.4/src/lib/oogl/refcomm/Makefile.in0000644000175000001440000003556710665240506016302 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/oogl/refcomm DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) librefcomm_la_LIBADD = am_librefcomm_la_OBJECTS = handle.lo streampool.lo librefcomm_la_OBJECTS = $(am_librefcomm_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(librefcomm_la_SOURCES) DIST_SOURCES = $(librefcomm_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = librefcomm.la librefcomm_la_SOURCES = \ handle.c streampool.c handle.h handleP.h reference.h streampool.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/oogl/refcomm/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/oogl/refcomm/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done librefcomm.la: $(librefcomm_la_OBJECTS) $(librefcomm_la_DEPENDENCIES) $(LINK) $(librefcomm_la_OBJECTS) $(librefcomm_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/streampool.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am #librefcomm_la_LDFLAGS = -r # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/oogl/refcomm/streampool.c0000644000175000001440000006017410622716760016561 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include #include #include #include /* for decl of 'free'; mbp Tue May 16 19:21:59 2000 */ #include "handleP.h" /* Includes stdio.h, etc. too */ #include "freelist.h" #if defined(unix) || defined(__unix) # include # include # include #elif defined(_WIN32) # include #endif #ifndef S_IFMT # define S_IFMT _S_IFMT # define S_IFIFO _S_IFIFO #endif #ifdef _WIN32 #undef FD_ISSET int FD_ISSET(SOCKET fd, fd_set *fds) { int i = fds->fd_count; while(--i >= 0) { if (fds->fd_array[i] == fd) return 1; } return 0; } void gettimeofday(struct timeval *tv, struct timezone *tz) { fprintf(stderr, "Call to stub gettimeofday()\n"); tv->tv_sec = tv->tv_usec = 0; } #endif /*_WIN32*/ #include static const int o_nonblock = #ifdef O_NONBLOCK O_NONBLOCK | #endif #ifdef O_NDELAY O_NDELAY | #endif #ifdef FNONBLK FNONBLK | #endif #ifdef FNDELAY FNDELAY | #endif 0; #if !defined(O_NONBLOCK) && !defined(O_NDELAY) \ && !defined(FNONBLK) && !defined(FNDELAY) # error Do not know how to achieve non-blocking IO #endif static DBLLIST(AllPools); static DEF_FREELIST(Pool); static fd_set poolwatchfds; static int poolmaxfd = 0; static fd_set poolreadyfds; static int poolnready = 0; #define FOREVER ((((unsigned)1)<<31)-1) static struct timeval nexttowake = { FOREVER }; static Pool *newPool(char *name); /* * Does the whole job of handling stream references to named objects. * Interprets strings of the forms: * name:file * referring to a specific named object to be read from a * specific file, or * file * referring to the nameless content of that file, or * name: * referring to a specific named object from any source. * * In the first two cases, we open (as a Pool) the specified file and * attempt to read it using the functions in *ops. * * The caller of this function owns the returned handle and should * call HandleDelete() when it doesn't need the return value. */ Handle * HandleReferringTo(int prefixch, char *str, HandleOps *ops, Handle **hp) { Pool *p = NULL; Handle *h = NULL, *ph = NULL; Handle *hknown = NULL; char *sep; char *fname; char *name; char nb[128]; if (str == NULL || ops == NULL) return 0; sep = strrchr(str, ':'); if (prefixch == ':') { /* : name -- take 'name' from anywhere */ name = str; fname = NULL; } else if (sep == NULL) { /* < file -- read from file 'name' */ fname = str; name = NULL; } else { /* < file:name */ name = sep+1; fname = nb; if (sep-str >= sizeof(nb)) { sep = &str[sizeof(nb)-1]; } memcpy(fname, str, sep-str); fname[sep-str] = '\0'; /* The ':' introduces an ambiguity: at least on MS win it can * also mean a drive letter, and on other systems it could * also be a legal part of the name. We only hack around the * drive-letter stuff: if we have a one-letter file-name, then * we assume it is a drive letter. */ if (fname[1] == '\0' && findfile(NULL, fname) == NULL) { fname = str; } } if (fname != NULL && *fname != '\0') { p = PoolStreamOpen(fname, NULL, 0, ops); hknown = HandleCreate(fname, ops); } if (p && ((p->flags & (PF_ANY|PF_REREAD)) != PF_ANY || hknown != NULL)) { ph = PoolIn(p); /* Try reading one item. */ } if (name) { /* Accessing a handle via ':' makes the handle global */ h = HandleCreateGlobal(name, ops); } if (ph) { if (h) { /* If we were told to assign to a specific named handle * then do so and get rid of the handle returned by * PoolIn(). */ HandleSetObject(h, HandleObject(ph)); HandleDelete(ph); } else { h = ph; /* otherwise we return the handle returned by PoolIn(). */ } } else if (p) { /* If we have a pool but not handle, then generate one for * this pool; callers of this functinos treat handle == NULL * as error case. */ REFGET(Handle, hknown); HandleSetObject(hknown, NULL); h = hknown; if (h->whence) { if (h->whence != p) { /* steal the pool pointer */ DblListDelete(&h->poolnode); h->whence = p; DblListAdd(&p->handles, &h->poolnode); } REFPUT(h); /* no need to call HandleDelete() */ } else { h->whence = p; DblListAdd(&p->handles, &h->poolnode); } } HandleDelete(hknown); if (hp) { if (*hp) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } return h; } char * PoolName(Pool *p) { return p ? p->poolname : NULL; } Pool * PoolByName(char *fname, HandleOps *ops) { Pool *p; DblListIterateNoDelete(&AllPools, Pool, node, p) { if ((ops == NULL || p->ops == ops) && strcmp(fname, p->poolname) == 0) { return p; } } return NULL; } static void watchfd(int fd) { if (fd < 0 || fd >= FD_SETSIZE || FD_ISSET(fd, &poolwatchfds)) return; FD_SET(fd, &poolwatchfds); if (poolmaxfd <= fd) poolmaxfd = fd+1; } static void unwatchfd(int fd) { int i; if (fd < 0 || fd >= FD_SETSIZE) return; if (FD_ISSET(fd, &poolwatchfds)) { FD_CLR(fd, &poolwatchfds); } if (fd+1 >= poolmaxfd) { for(i = poolmaxfd; --i >= 0 && !FD_ISSET(i, &poolwatchfds); ) ; poolmaxfd = i+1; } if (FD_ISSET(fd, &poolreadyfds)) { FD_CLR(fd, &poolreadyfds); poolnready--; } } static Pool * newPool(char *name) { Pool *p; FREELIST_NEW(Pool, p); memset(p, 0, sizeof(Pool)); DblListInit(&p->node); DblListInit(&p->handles); p->poolname = strdup(name); return p; } Pool * PoolStreamTemp(char *name, IOBFILE *inf, FILE *outf, int rw, HandleOps *ops) { Pool *p; char dummy[3+sizeof(unsigned long)*2+1]; FILE *f = NULL; if (name==NULL) { sprintf(name=dummy, "_p@%lx", (unsigned long)(inf ? (void *)inf : (void *)outf)); } if (inf == NULL && outf == NULL && name != NULL) { f = fopen(name, rw ? (rw>1 ? "w+b":"wb") : "rb"); if (f == NULL) { OOGLError(0, "Can't open %s: %s", name, sperror()); return NULL; } } if (f == NULL && inf == NULL && outf == NULL) { OOGLError(0, "PoolStreamTemp(%s): file == NULL\n", name); return NULL; } if (f) { switch(rw) { case 0: inf = iobfileopen(f); outf = NULL; break; case 1: outf = f; inf = NULL; break; case 2: inf = iobfileopen(f); outf = fdopen(dup(fileno(f)), "wb"); break; } } else if (rw != 1 && inf == NULL) { inf = iobfileopen(fdopen(dup(fileno(outf)), "rb")); } else if (rw != 0 && outf == NULL) { outf = fdopen(dup(iobfileno(inf)), "wb"); } if ((rw != 1 && inf == NULL) || (rw != 0 && outf == NULL)) { OOGLError(0, "PoolStreamTemp(%s): file == NULL\n", name); return NULL; } p = newPool(name); p->ops = ops; p->type = P_STREAM; p->outf = outf; p->inf = inf; p->infd = p->inf ? iobfileno(p->inf) : -1; /*p->handles = NULL;*/ p->resyncing = NULL; p->otype = PO_ALL; p->mode = inf && outf ? 2 : (outf ? 1 : 0); p->seekable = (p->inf && lseek(iobfileno(p->inf),0,SEEK_CUR) != -1 && !isatty(iobfileno(p->inf))); p->softEOF = !p->seekable; p->level = (p->outf && lseek(fileno(p->outf),0,SEEK_CUR) != -1 && !isatty(fileno(p->outf))) ? 0 : 1; p->flags = PF_TEMP; p->client_data = NULL; #if HAVE_FCNTL if (p->inf && p->infd >= 0) { fcntl(p->infd, F_SETFL, fcntl(p->infd, F_GETFL) & ~o_nonblock); } if (p->outf && fileno(p->outf) >= 0) { int fd = fileno(p->outf); fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~o_nonblock); } #endif /*unix*/ return p; } Pool * PoolStreamOpen(char *name, FILE *f, int rw, HandleOps *ops) { Pool *p; struct stat st; p = PoolByName(name, ops); if (p == NULL) { p = newPool(name); p->ops = ops; p->type = P_STREAM; p->inf = NULL; p->infd = -1; p->outf = NULL; p->mode = rw; /*p->handles = NULL;*/ p->resyncing = NULL; p->otype = PO_ALL; p->level = 0; p->flags = 0; p->client_data = NULL; } else { if (rw == 0 && p->mode == 0 && p->inf != NULL && p->softEOF == 0 && (p->flags & PF_REREAD) == 0 && stat(name, &st) == 0 && st.st_mtime == p->inf_mtime) { iobfrewind(p->inf); return p; } /* * Combine modes. Allows e.g. adding write stream to read-only pool. */ p->mode = ((p->mode+1) | (rw+1)) - 1; if (p->inf && rw != 1) { if (iobfile(p->inf) == stdin) { iobfileclose(p->inf); /* leaves stdin open */ } else { iobfclose(p->inf); } p->inf = NULL; } } if (f == NULL || f == (FILE *)-1) { if (rw != 1) { if (strcmp(name, "-") == 0) { f = stdin; } else { /* Try opening read/write first in case it's a Linux named pipe */ int fd; /* Linux 2.0 is said to prefer that someone always has * a named pipe open for writing as well as reading. * But if we do that, we seem to lose the ENXIO error given * to a process which opens that pipe for non-blocking write. * Let's not do this now, even on Linux. * Note that we do use PoolSleepFor() to slow down polling * of pipes which claim to have data ready, but actually don't; * I think that's what O_RDWR mode is intended to fix. */ /* BTW, this is not Linux, but common Unix * behaviour. Reading from a pipe with no writers will * just return. * * cH: In principle we would want to avoid that * O_NONBLOCK; but then the call to open() may * actually block. Using O_RDONLY, however, seems to * render the select stuff unusable. * * cH: update: at least on Linux, O_RDWR means that we * always have a writer for this pipe (ourselves). It * is probably more poratble to use a second file * descriptor in write mode. However, leave it as is * for now. */ fd = open(name, O_RDWR | o_nonblock); if (fd < 0) fd = open(name, O_RDONLY | o_nonblock); #if HAVE_UNIX_SOCKETS /* Unix-domain socket? */ if (fd < 0 && errno == EOPNOTSUPP) { struct sockaddr_un sa; sa.sun_family = AF_UNIX; strncpy(sa.sun_path, name, sizeof(sa.sun_path)); fd = socket(PF_UNIX, SOCK_STREAM, 0); if (connect(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) { close(fd); fd = -1; } } #endif /* HAVE_UNIX_SOCKETS */ if (fd < 0) OOGLError(0, "Cannot open file \"%s\": %s", name, sperror()); else f = fdopen(fd, "rb"); } p->inf = iobfileopen(f); } if (rw > 0) { if (strcmp(name, "-") == 0) p->outf = stdout; else if ((p->outf = fopen(name, "wb")) == NULL) OOGLError(0, "Cannot create \"%s\": %s", name, sperror()); } } else { if (rw != 1) { p->inf = iobfileopen(f); } if (rw > 0) p->outf = (rw == 2) ? fdopen(dup(fileno(f)), "wb") : f; } if (p->inf == NULL && p->outf == NULL) { PoolDelete(p); return NULL; } /* We're committed now. */ if (DblListEmpty(&p->node)) { DblListAddTail(&AllPools, &p->node); } p->seekable = false; p->softEOF = false; if (p->inf != NULL) { p->infd = iobfileno(p->inf); if (p->infd != -1) { if (isatty(p->infd)) { p->softEOF = true; } else if (lseek(p->infd,0,SEEK_CUR) != -1) { p->seekable = true; } if (fstat(p->infd, &st) < 0 || (st.st_mode & S_IFMT) == S_IFIFO) { p->softEOF = true; } p->inf_mtime = st.st_mtime; watchfd(p->infd); #if HAVE_FCNTL fcntl(p->infd, F_SETFL, fcntl(p->infd, F_GETFL) & ~o_nonblock); #endif /* HAVE_FCNTL */ } } #if HAVE_FCNTL if (p->outf && fileno(p->outf) >= 0) { int fd = fileno(p->outf); fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~o_nonblock); } #endif /* HAVE_FCNTL */ if (p->level == 0 && p->outf && (lseek(fileno(p->outf),0,SEEK_CUR) == -1 || isatty(fileno(p->outf)))) p->level = 1; return p; } /* Return "true" if succesful */ int PoolSetMark(Pool *p) { return iobfsetmark(PoolInputFile(p)) == 0; } /* Return "true" if succesful */ int PoolSeekMark(Pool *p) { return iobfseekmark(PoolInputFile(p)) == 0; } /* Return "true" if succesful. BUT WHO CARES. Grin. */ int PoolClearMark(Pool *p) { return iobfclearmark(PoolInputFile(p)) == 0; } int PoolIncLevel(Pool *p, int incr) { if (p) { p->level += incr; if (p->level < 0) { OOGLError(0, "PoolIncLevel(): negative level.\n"); } return p->level; } else { return incr; } } int PoolOType(Pool *p, int otype) { return p->otype; } void PoolSetOType(Pool *p, int otype) { p->otype = otype; } IOBFILE * PoolInputFile(Pool *p) { return (p && p->type == P_STREAM) ? p->inf : NULL; } FILE * PoolOutputFile(Pool *p) { return (p && p->type == P_STREAM) ? p->outf : NULL; } void * PoolClientData(Pool *p) { return (p ? p->client_data : NULL); } void PoolSetClientData(Pool *p, void *data) { p->client_data = data; } void PoolDoReread(Pool *p) { p->flags |= PF_REREAD; /* Reread when asked */ } void PoolClose(Pool *p) { if (p->ops->close && !(p->flags & PF_CLOSING)) { p->flags |= PF_CLOSING; if ((*p->ops->close)(p)) return; } if (p->type == P_STREAM) { if (p->inf != NULL) { unwatchfd(iobfileno(p->inf)); if (iobfile(p->inf) == stdin) { iobfileclose(p->inf); } else { iobfclose(p->inf); } p->inf = NULL; p->infd = -1; } if (p->outf != NULL) { if (p->outf != stdout) fclose(p->outf); p->outf = NULL; } /* PoolDelete(p);*/ /* Shouldn't we delete the Pool? */ } } void PoolDelete(Pool *p) { Handle *h, *hn; if (p == NULL || (p->flags & PF_DELETED) != 0) { return; } p->flags |= PF_DELETED; if ((p->flags & PF_TEMP) == 0) { DblListDelete(&p->node); DblListIterate(&p->handles, Handle, poolnode, h, hn) { h->whence = NULL; DblListDelete(&h->poolnode); HandleDelete(h); } } free(p->poolname); FREELIST_FREE(Pool, p); } /* * Marks a Pool as being awake. Doesn't update nexttowake; * so this should only be called where awaken_until() gets a chance to run. */ static void awaken(Pool *p) { p->flags &= ~PF_ASLEEP; timerclear(&p->awaken); if (p->infd >= 0) { watchfd(p->infd); if (iobfhasdata(p->inf) && !FD_ISSET(p->infd, &poolreadyfds)) { FD_SET(p->infd, &poolreadyfds); poolnready++; } } } static void awaken_until(struct timeval *until) { Pool *p; nexttowake.tv_sec = FOREVER; DblListIterateNoDelete(&AllPools, Pool, node, p) { if (p->flags & PF_ASLEEP) { if (timercmp(&p->awaken, until, <)) { awaken(p); } else if (p->inf != NULL && timercmp(&p->awaken, &nexttowake, <)) { nexttowake = p->awaken; } } } } /* * PoolInputFDs(fds, maxfd) * supplies a list of file descriptors for select() to watch for input. * Sets *fds to the set of pool input file descriptors * Sets *maxfd to the max+1 file descriptor in fds. * Returns max time to sleep in seconds; 0 if some Pools have input immediately * available (so select() shouldn't block). */ float PoolInputFDs(fd_set *fds, int *maxfd) { float timeleft = FOREVER; #if defined(unix) || defined(__unix) if (nexttowake.tv_sec != FOREVER) { struct timeval now; gettimeofday(&now, NULL); if (timercmp(&nexttowake, &now, <)) awaken_until(&now); timeleft = (nexttowake.tv_sec - now.tv_sec) + .000001 * (nexttowake.tv_usec - now.tv_usec); } #endif *fds = poolwatchfds; *maxfd = poolmaxfd; return poolnready != 0 || timeleft < 0 ? 0 : timeleft; } /* * PoolInAll(fd_set *fds, int nfds) * Read from all available pools, given a set of file descriptors * which claim to have some input. We also import from all those which * already have buffered input. * nfds is an advisory upper bound on the number of fd's in *fds; * if the caller doesn't keep the return value from select(), just use * FD_SETSIZE or other huge number. * Each fd used is removed from *fds, and *nfds is decremented. * The return value is 1 if anything was read from any pool, 0 otherwise. */ int PoolInAll(fd_set *fds, int *nfds) { Pool *p, *nextp; int got = 0; DblListIterate(&AllPools, Pool, node, p, nextp) { if (p->type != P_STREAM || p->inf == NULL || p->infd < 0) { continue; } if (FD_ISSET(p->infd, &poolreadyfds)) { FD_CLR(p->infd, &poolreadyfds); poolnready--; if (PoolIn(p)) { got++; } } else if (FD_ISSET(p->infd, fds)) { FD_CLR(p->infd, fds); (*nfds)--; if (PoolIn(p)) { got++; } } } return got; } /* * Handle NULL or uninitialized times. */ static struct timeval * timeof(struct timeval *when) { static struct timeval now; if ((when == NULL && (when = &now)) || !timerisset(when)) gettimeofday(when, NULL); return when; } static void addtime(struct timeval *base, double offset, struct timeval *result) { double osec = floor(offset); result->tv_sec = base->tv_sec + osec; result->tv_usec = base->tv_usec + (int)((offset - osec)*1000000); while(result->tv_usec >= 1000000) { result->tv_sec++; result->tv_usec -= 1000000; } } static void asleep(Pool *p, struct timeval *base, double offset) { struct timeval until; base = timeof(base); if (p->inf != NULL) { p->flags |= PF_ASLEEP; addtime(base, offset, &until); if (timercmp(&until, &nexttowake, <)) nexttowake = until; if (p->infd >= 0) { unwatchfd(p->infd); if (FD_ISSET(p->infd, &poolreadyfds)) { FD_CLR(p->infd, &poolreadyfds); poolnready--; } } } } void PoolSleepUntil(Pool *p, double until) { asleep(p, &p->timebase, until); } void PoolSleepFor(Pool *p, double naptime) { asleep(p, NULL, naptime); } void PoolSetTime(Pool *p, struct timeval *base, double time_at_base) { base = timeof(base); addtime(base, -time_at_base, &p->timebase); } double PoolTimeAt(Pool *p, struct timeval *then) { if (p->timebase.tv_sec == 0) timeof(&p->timebase); then = timeof(then); return then->tv_sec - p->timebase.tv_sec + .000001*(then->tv_usec - p->timebase.tv_usec); } void PoolAwaken(Pool *p) { awaken(p); if (timercmp(&p->awaken, &nexttowake, <=)) awaken_until(&nexttowake); } #if 0 static void poolresync(Pool *p, int (*resync)()) { /* XXX implement this */ } #endif #define CBRA '{' #define CKET '}' /* The caller of this functions owns the returned handle and must call * HandleDelete() to get rid of the handle. */ Handle *PoolIn(Pool *p) { int c = 0; Handle *h = NULL; Ref *r = NULL; if (p->type != P_STREAM) { return NULL; /* Do shared memory here someday XXX */ } if (p->inf == NULL || p->ops == NULL || p->ops->strmin == NULL) { return NULL; /* No way to read */ } if ((p->flags & PF_NOPREFETCH) || ((c = async_iobfnextc(p->inf, 3)) != NODATA && c != EOF)) { if ((*p->ops->strmin)(p, &h, &r)) { /* Attach nameless objects to a handle named for the Pool. * Putting this code here in PoolIn() ensures we just bind * names to top-level objects, not those nested inside a * hierarchy. */ if (h == NULL) { h = HandleCreate(p->poolname, p->ops); if (r != NULL) { HandleSetObject(h, r); /* Decrement reference count since we're handing * ownership of the object to the Handle. */ REFPUT(r); /* Increment the reference count lest PoolDelete() * will also consume the attached object. */ REFGET(Handle, h); } } else { /* Increment the count such that the calling function * can safely HandleDelete(retval) without destroying a * handle explicitly declared in the pool (with define * or hdefine). */ REFGET(Handle, h); } if (h->whence) { if (h->whence != p) { /* steal the pool pointer */ DblListDelete(&h->poolnode); h->whence = p; DblListAdd(&p->handles, &h->poolnode); } REFPUT(h); /* no need to call HandleDelete() */ } else { h->whence = p; DblListAdd(&p->handles, &h->poolnode); } /* Remember whether we've read (PF_ANY) at least one and * (PF_REREAD) at least two objects from this pool. * There'll be a nontrivial side effect of rereading a file * containing multiple objects, so we actually do reread if asked. */ p->flags |= (p->flags & PF_ANY) ? PF_REREAD : PF_ANY; } else { if (p->flags & PF_DELETED) return NULL; if (p->ops->resync) { (*p->ops->resync)(p); } else if (p->softEOF) { iobfrewind(p->inf); } else if (p->inf != NULL) { /* Careful lest already PoolClose()d */ if (p->infd >= 0) { if (FD_ISSET(p->infd, &poolreadyfds)) { FD_CLR(p->infd, &poolreadyfds); poolnready--; } } PoolClose(p); return NULL; } } if (p->seekable && p->inf != NULL) c = iobfnextc(p->inf, 0); /* Notice EOF if appropriate */ } if (c == EOF && iobfeof(p->inf)) { if (p->softEOF) { iobfrewind(p->inf); /* cH: opening O_RDWR should fix this, as this leaves one * active writer attached to the FIFO: ourselves. */ /*PoolSleepFor(p, 1.0);*/ /* Give us a rest */ /* SVR4 poll() doesn't allow us to * wait quietly when the sender closes a named pipe; * any poll() for reading returns immediately with POLLHUP. * Then, attempts to read return EOF. We loop at full speed. * Can't see any better way to throttle this than to * quit listening for a while, at the cost of being slow to * respond if another sender connects. We wait 1 second. */ } else { PoolClose(p); return h; } } if (p->inf && !(p->flags & PF_ASLEEP) && p->infd >= 0) { /* * Anything left in stdio buffer? If so, * remember to try reading next time without waiting for select(). */ if (iobfhasdata(p->inf)) { if (!FD_ISSET(p->infd, &poolreadyfds)) { FD_SET(p->infd, &poolreadyfds); poolnready++; } } else { if (FD_ISSET(p->infd, &poolreadyfds)) { FD_CLR(p->infd, &poolreadyfds); poolnready--; } } } return h; } /* * Support routine for writing {handle, object} pairs to Pools. * Checks the Pool's output type (PO_HANDLES/PO_DATA/PO_ALL). If * appropriate, writes something to the Pool representing the given * Handle. Returns nonzero if the associated object should also be * written literally. * * For global handles: also emit a "define" statement. */ int PoolStreamOutHandle(Pool *p, Handle *h, int havedata) { if (p == NULL || p->outf == NULL) { return 0; } if (h == NULL || (p->otype & PO_DATA)) { return havedata; } if (havedata && !h->obj_saved) { h->obj_saved = true; PoolFPrint(p, p->outf, "define \"%s\"\n", h->name); return true; } if (h->whence != NULL && h->whence->seekable) { PoolFPrint(p, p->outf, " < \""); if (strcmp(h->name, p->poolname) == 0) { fprintf(p->outf, "%s\"\n", h->whence->poolname); } else { fprintf(p->outf, "%s:%s\"\n", h->whence->poolname, h->name); } } else { PoolFPrint(p, p->outf, ": \"%s\"\n", h->name); } return havedata && !h->obj_saved && (p->otype & (PO_DATA|PO_HANDLES)) == PO_ALL; } void PoolFPrint(Pool *p, FILE *f, const char *format, ...) { va_list alist; if (p) { fprintf(f, "%*s", p->level*2, ""); } va_start(alist, format); vfprintf(f, format, alist); va_end(alist); } void PoolPrint(Pool *p, const char *format, ...) { va_list alist; if (p) { fprintf(PoolOutputFile(p), "%*s", p->level*2, ""); } va_start(alist, format); vfprintf(PoolOutputFile(p), format, alist); va_end(alist); } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/oogl/refcomm/streampool.h0000644000175000001440000001132010575033112016541 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _STREAMPOOL_ #define _STREAMPOOL_ #if defined(HAVE_CONFIG_H) && ! defined(CONFIG_H_INCLUDED) # include "config.h" #endif #ifdef AIX # include /* RS-6000 needs this */ #endif #include #if defined(unix) || defined(__unix) # include #elif defined(_WIN32) # include #endif #include #include "handle.h" /* * Common stream syntax */ #define CBRA '{' #define CKET '}' /* * Open a stream-type Pool. * Uses stream f if != NULL, otherwise opens the named file. * The name is required anyway, to uniquely identify the pool. */ extern Pool *PoolStreamOpen(char *name, FILE *f, int rw, HandleOps *ops); /* * Open a temporary Pool. Like PoolStreamOpen, but: * - the opened Pool is not listed as a input source for PoolInputFDs * - it is not added to the table of known Pools, so * it won't conflict with other Pools known by the same name. * Uses stream f if != NULL, otherwise opens the named file. * The name is not required -- it may be NULL. */ extern Pool *PoolStreamTemp(char *name, IOBFILE *inf, FILE *outf, int rw, HandleOps *ops); /* * Return the set of file descriptors pool file descriptors we'd like * polled for input. Fills *maxfd with the highest+1 file descriptor. * Returns 0 if some pool holds buffered input (i.e. don't let select() * block), otherwise the time in seconds until the next sleeping Pool * awakens. If no Pools are asleep, returns a large positive number. */ extern float PoolInputFDs( fd_set *fds, int *maxfd ); /* Try to read something from the pool, in case of success a * handle is returned, possibly with an object attached to it. * The caller of this function owns the handle. */ extern Handle *PoolIn(Pool *p); /* * Given the fd mask returned by select(), call import() on * all pools which have input. Removes used fd's from *fds; * decrements count for each fd used. * Returns 1 if anything read from any pool, 0 otherwise. */ extern int PoolInAll( fd_set *fds, int *count ); /* * Utility routine for XXXOut functions. * Writes relevant text of h to the Pool based on p's output setup; * returns 1 if associated data should be written too, 0 if not. */ extern int PoolStreamOutHandle(Pool *p, Handle *h, int havedata); /* * Set a pool's client data pointer. Pool users may use * this for whatever they want. */ void PoolSetClientData(Pool *p, void *data); /* * Return a pool's client data pointer. */ void *PoolClientData(Pool *p); extern void PoolDelete(Pool *p); /* How much to export when we do so? */ /* Pass these values to PoolSetOType(). */ #define PO_ALL 0 /* - use all handles and all data */ #define PO_HANDLES 1 /* - use handles wherever possible, avoid data */ #define PO_DATA 2 /* - data, no external refs */ extern IOBFILE *PoolInputFile(Pool *); extern FILE *PoolOutputFile(Pool *); extern void PoolDoReread(Pool *); extern void PoolClose(Pool *p); extern int PoolOType(Pool *, int otype); extern void PoolSetOType(Pool *, int otype); extern Pool *PoolByName(char *name, HandleOps *ops); extern char *PoolName(Pool *); extern void PoolSleepFor(Pool *, double seconds); extern void PoolSleepUntil(Pool *, double seconds); extern void PoolSetTime(Pool *, struct timeval *basis, double time_at_basis); extern double PoolTimeAt(Pool *, struct timeval *at_this_time); extern void PoolAwaken(Pool *); extern int PoolIncLevel(Pool *p, int incr); extern int PoolSetMark(Pool *p); extern int PoolSeekMark(Pool *p); extern int PoolClearMark(Pool *p); extern void PoolFPrint(Pool *p, FILE *f, const char *format, ...); extern void PoolPrint(Pool *p, const char *format, ...); #endif /*_STREAMPOOL_*/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/oogl/refcomm/handleP.h0000644000175000001440000001056710600226777015755 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _HANDLEPOOLP_ #define _HANDLEPOOLP_ /* * Communications -- Private definitions for Pools and Handles. */ #include #include "ooglutil.h" #include "streampool.h" /*#include "sm.h"*/ #define HANDLEMAGIC OOGLMagic('h',1) typedef struct HRef { DblListNode node; Handle **hp; Ref *parentobj; void *info; void (*update) P((Handle **, Ref *, void *)); } HRef; struct Handle { REFERENCEFIELDS; HandleOps *ops; /* Comm-related operations on our datatype */ char *name; /* Char-string name */ Ref *object; /* Current object value if any */ DblListNode opsnode; /* node in list of all handles with given ops */ DblListNode poolnode; /* node in list of all handles with given pool*/ DblListNode objnode; /* node in list of all handles pointing to a given object */ Pool *whence; /* Where did this handle's value come from? */ DblListNode refs; /* list of references to this Handle, * which we update when the Handle's * object changes. */ bool permanent; /* Retain even when last reference goes away? */ bool obj_saved; /* Set during saving of objects when * the handle has been dumped as * reference to indicate that its * objects also already has been * saved. */ /* * Pool-type-specific state */ #if 0 SMSym *sym; /* Address of our SM symbol */ int version; /* Version number of shared-memory symbol */ Pool *smpool; /* Pool in which our symbol lies */ Handle *samepool; /* Link in list of handles on this pool */ #endif }; #define P_SM 1 #define P_STREAM 2 struct Pool { DblListNode node; /* Link in list of all Pools (or free pools) */ int type; /* P_SM or P_STREAM */ char *poolname; /* Name of this pool: typically a filename */ DblListNode handles; /* All handles using this Pool */ HandleOps *ops; /* I/O operations */ long await; /* Unix time until which we should wait */ int (*resyncing)(); /* We're resyncing, call this ... if non-NULL */ /* * State for P_STREAM pools. */ char otype; /* PO_HANDLES, PO_DATA, PO_ALL */ char mode; /* read/write status: 0, 1, 2 as with open() */ char seekable; /* 1 for plain file, 0 for pipe/socket */ char softEOF; /* Can we hope to read more after EOF? * 1 for tty or named pipe, 0 otherwise. */ IOBFILE *inf; int infd; FILE *outf; short flags; /* Miscellaneous internal flags: */ #define PF_TEMP 1 /* "Temporary pool" -- not in AllPools list */ #define PF_ANY 2 /* any objects read from this Pool? */ #define PF_REREAD 4 /* actually re-read on "<" */ #define PF_CLOSING 0x10 /* Internal flag to avoid PoolClose() recursion */ #define PF_ASLEEP 0x20 /* PoolSleep() called on this Pool. */ #define PF_DELETED 0x40 /* Pool is on free list - don't touch! */ #define PF_NOPREFETCH 0x80 /* Don't let PoolIn() prefetch the first char */ short level; /* {} Bracket counter */ long inf_mtime; /* modification time of p->inf file */ /* A second explicit reference to the same * file can cause it to be re-read if it's * been changed since last time, or if it's * a stream (not seekable). */ struct timeval awaken; /* Resume reading at this time */ struct timeval timebase; /* Basis for our clock */ /* * State for P_SM pools. */ #if 0 SMRegion *sm; /* for shared-memory Pools */ #endif /* * client data pointer, used by clients for whatever they want */ void *client_data; }; #endif /*_HANDLEPOOLP_*/ geomview-1.9.4/src/lib/oogl/refcomm/Headers0000644000175000001440000000005407730240274015513 00000000000000handle.h handleP.h reference.h streampool.h geomview-1.9.4/src/lib/oogl/Makefile.am0000644000175000001440000000004010455665336014624 00000000000000SUBDIRS = lisp refcomm util wa geomview-1.9.4/src/lib/oogl/Makefile.in0000644000175000001440000003746510665240506014651 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/oogl DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = lisp refcomm util wa all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/oogl/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/oogl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/pointlist/0000777000175000001440000000000010665240676013746 500000000000000geomview-1.9.4/src/lib/pointlist/ptlInst.c0000644000175000001440000001011310455701007015442 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "instP.h" #include "pointlistP.h" void *inst_PointList_get(int sel, Geom *geom, va_list *args); void *inst_PointList_fillin(int sel, Geom *geom, va_list *args); void *inst_PointList_set(int sel, Geom *geom, va_list *args); void *inst_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", inst_PointList_get}, {"PointList_fillin", inst_PointList_fillin}, {"PointList_set", inst_PointList_set}, {"PointList_length", inst_PointList_length} }; static char msg[] = "ptlInst.c"; void ptlInst_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("inst")); } void *inst_PointList_get(int sel, Geom *geom, va_list *args) { HPoint3 *plist; int n_points; TransformPtr t; int coordsys; n_points = (int)(long)GeomCall(GeomMethodSel("PointList_length"), geom); plist = OOGLNewNE(HPoint3, n_points, msg); t = va_arg(*args, TransformPtr); coordsys = va_arg(*args, int); return GeomCall(GeomMethodSel("PointList_fillin"), geom, t, coordsys, plist); } void *inst_PointList_fillin(int sel, Geom *geom, va_list *args) { Inst *inst = (Inst *)geom; HPoint3 *plist; int coordsys; GeomIter *it; Transform Tnew; int i, n_points; TransformPtr t; t = va_arg(*args, TransformPtr); coordsys = va_arg(*args, int); plist = va_arg(*args, HPoint3 *); n_points = (int)(long)GeomCall(GeomMethodSel("PointList_length"), inst->geom); it = GeomIterate(geom, DEEP); for (i = 0; NextTransform(it, Tnew); i += n_points) if (coordsys == POINTLIST_SELF) { TmConcat(Tnew, t, Tnew); GeomCall(GeomMethodSel("PointList_fillin"), inst->geom, &Tnew[0][0], coordsys, &plist[i]); } else if (coordsys == POINTLIST_PRIMITIVE) GeomCall(GeomMethodSel("PointList_fillin"), inst->geom, t, coordsys, &plist[i]); else { OOGLError(1, "Unrecognized coordinate system in inst_PointList_fillin"); return NULL; } return plist; } void *inst_PointList_set(int sel, Geom *geom, va_list *args) { Inst *inst = (Inst *)geom; HPoint3 *plist; Transform T, TInv; int coordsys; GeomIter *it; coordsys = va_arg(*args, int); plist = va_arg(*args, HPoint3 *); /* If the point list has more than one copy of the points * of the geom in it, just use the first set */ it = GeomIterate(geom, DEEP); if (NextTransform(it, T) && coordsys == POINTLIST_SELF) { Tm3Invert(T, TInv); HPt3TransformN( TInv, plist, plist, (int)(long)GeomCall(GeomMethodSel("PointList_length"), inst->geom) ); } GeomCall(GeomMethodSel("PointList_set"), inst->geom, coordsys, plist); return NULL; } void *inst_PointList_length(int sel, Geom *geom, va_list *args) { Inst *inst = (Inst *)geom; int i, n_points; Transform T; GeomIter *it; n_points = (int)(long)GeomCall(GeomMethodSel("PointList_length"), inst->geom); it = GeomIterate(geom, DEEP); for (i = 0; NextTransform(it, T); i += n_points); return (void *)(long)i; } geomview-1.9.4/src/lib/pointlist/ptlList.c0000644000175000001440000000645310455701007015454 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "listP.h" #include "pointlistP.h" void *list_PointList_get(int sel, Geom *geom, va_list *args); void *list_PointList_fillin(int sel, Geom *geom, va_list *args); void *list_PointList_set(int sel, Geom *geom, va_list *args); void *list_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", list_PointList_get}, {"PointList_fillin", list_PointList_fillin}, {"PointList_set", list_PointList_set}, {"PointList_length", list_PointList_length} }; static char msg[] = "ptlList.c"; void ptlList_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("list")); } void *list_PointList_get(int sel, Geom *geom, va_list *args) { HPoint3 *plist; TransformPtr t; plist = OOGLNewNE(HPoint3, (int)(long)GeomCall(GeomMethodSel("PointList_length"), geom), msg); t = va_arg(*args, TransformPtr); return(GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, plist)); } void *list_PointList_fillin(int sel, Geom *geom, va_list *args) { TransformPtr t; int n_points1; HPoint3 *plist; List *l = (List *)geom; t = va_arg(*args, TransformPtr); (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); n_points1 = (int)(long)GeomCall(GeomMethodSel("PointList_length"), l->car); GeomCall(GeomMethodSel("PointList_fillin"), l->car, t, 0, plist); GeomCall(GeomMethodSel("PointList_fillin"), (Geom *)l->cdr, t, 0, &plist[n_points1]); return plist; } void *list_PointList_set(int sel, Geom *geom, va_list *args) { HPoint3 *pt1; int n_points1, coordsys; List *l = (List *)geom; coordsys = va_arg(*args, int); pt1 = va_arg(*args, HPoint3 *); n_points1 = (int)(long)GeomCall(GeomMethodSel("PointList_length"), l->car); GeomCall(GeomMethodSel("PointList_set"), l->car, coordsys, pt1); GeomCall(GeomMethodSel("PointList_set"), (Geom *)l->cdr, coordsys, &pt1[n_points1]); return geom; } void *list_PointList_length(int sel, Geom *geom, va_list *args) { List *l = (List *)geom; return (void *)(long) ((int)(long)GeomCall(GeomMethodSel("PointList_length"), l->car) + (int)(long)GeomCall(GeomMethodSel("PointList_length"), (Geom *)l->cdr)); } geomview-1.9.4/src/lib/pointlist/ptlMesh.c0000644000175000001440000000560710560447135015443 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "meshP.h" #include "pointlistP.h" void *mesh_PointList_get(int sel, Geom *geom, va_list *args); void *mesh_PointList_fillin(int sel, Geom *geom, va_list *args); void *mesh_PointList_set(int sel, Geom *geom, va_list *args); void *mesh_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", mesh_PointList_get}, {"PointList_fillin", mesh_PointList_fillin}, {"PointList_set", mesh_PointList_set}, {"PointList_length", mesh_PointList_length} }; static char msg[] = "ptlMesh.c"; void ptlMesh_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("mesh")); } void *mesh_PointList_get(int sel, Geom *geom, va_list *args) { HPoint3 *pt; Mesh *m = (Mesh *)geom; TransformPtr t; pt = OOGLNewNE(HPoint3, m->nu * m->nv, msg); t = va_arg(*args, TransformPtr); return GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, pt); } void *mesh_PointList_fillin(int sel, Geom *geom, va_list *args) { HPoint3 *pt; TransformPtr t; Mesh *m = (Mesh *)geom; t = va_arg(*args, TransformPtr); (void)va_arg(*args, int); pt = va_arg(*args, HPoint3 *); memcpy(pt, m->p, m->nu * m->nv * sizeof(HPoint3)); HPt3TransformN(t, pt, pt, m->nu * m->nv); return pt; } void *mesh_PointList_set(int sel, Geom *geom, va_list *args) { Mesh *m = (Mesh *)geom; HPoint3 *plist; /* This will make the mesh no longer a z-mesh (in general, this * is desirable although we may regret it later */ m->geomflags &= ~MESH_Z; (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); memcpy(m->p, plist, m->nu * m->nv * sizeof(HPoint3)); return geom; } void *mesh_PointList_length(int sel, Geom *geom, va_list *args) { Mesh *m = (Mesh *)geom; return((void *)(long)(m->nu * m->nv)); } geomview-1.9.4/src/lib/pointlist/ptlQuad.c0000644000175000001440000000557110455701010015425 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "quadP.h" #include "pointlistP.h" void *quad_PointList_get(int sel, Geom *geom, va_list *args); void *quad_PointList_fillin(int sel, Geom *geom, va_list *args); void *quad_PointList_set(int sel, Geom *geom, va_list *args); void *quad_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", quad_PointList_get}, {"PointList_fillin", quad_PointList_fillin}, {"PointList_set", quad_PointList_set}, {"PointList_length", quad_PointList_length} }; static char msg[] = "ptlQuad.c"; void ptlQuad_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("quad")); } void *quad_PointList_get(int sel, Geom *geom, va_list *args) { HPoint3 *plist; Quad *q = (Quad *)geom; TransformPtr t; plist = OOGLNewNE(HPoint3, q->maxquad * 4, msg); t = va_arg(*args, TransformPtr); return GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, plist); } void *quad_PointList_fillin(int sel, Geom *geom, va_list *args) { int i; Quad *q = (Quad *)geom; TransformPtr t; HPoint3 *plist; t = va_arg(*args, TransformPtr); (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); for (i = 0; i < q->maxquad; i++) memcpy(&plist[i * 4], q->p[i], 4 * sizeof(HPoint3)); HPt3TransformN(t, plist, plist, q->maxquad * 4); return plist; } void *quad_PointList_set(int sel, Geom *geom, va_list *args) { int i; HPoint3 *plist; Quad *q = (Quad *)geom; (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); for (i = 0; i < q->maxquad; i++) memcpy(q->p[i], &plist[i * 4], 4 * sizeof(HPoint3)); return((void *)q); } void *quad_PointList_length(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; return((void *)(long)(q->maxquad * 4)); } geomview-1.9.4/src/lib/pointlist/ptlBezier.c0000644000175000001440000001103210455701010015740 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "bezierP.h" #include "pointlistP.h" void *bezier_PointList_get(int sel, Geom *geom, va_list *args); void *bezier_PointList_fillin(int sel, Geom *geom, va_list *args); void *bezier_PointList_set(int sel, Geom *geom, va_list *args); void *bezier_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", bezier_PointList_get}, {"PointList_fillin", bezier_PointList_fillin}, {"PointList_set", bezier_PointList_set}, {"PointList_length", bezier_PointList_length} }; static char msg[] = "ptlBezier.c"; void ptlBezier_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("bezier")); } void *bezier_PointList_get(int sel, Geom *geom, va_list *args) { HPoint3 *pt; TransformPtr t; int n_points; t = va_arg(*args, TransformPtr); n_points = (int)(long)GeomCall(GeomMethodSel("PointList_length"), geom); pt = OOGLNewNE(HPoint3, n_points, msg); return (GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, pt)); } void *bezier_PointList_fillin(int sel, Geom *geom, va_list *args) { int i = 0; TransformPtr t; HPoint3 *pt; Bezier *b = (Bezier *)geom; t = va_arg(*args, TransformPtr); (void)va_arg(*args, int); pt = va_arg(*args, HPoint3 *); if (b->CtrlPnts != NULL) { if (b->dimn == 3) { for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++) HPt3From(&pt[i], b->CtrlPnts[i*3], b->CtrlPnts[i*3 + 1], b->CtrlPnts[i*3 + 2], 1.0); } else { if (b->dimn == 4) { for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++) HPt3From(&pt[i], b->CtrlPnts[i*4], b->CtrlPnts[i*4 + 1], b->CtrlPnts[i*4 + 2], b->CtrlPnts[i*4 + 3]); } else { OOGLError(1, "Bezier patch of unfamiliar dimensions."); OOGLFree(pt); return NULL; } } } #ifdef DONT_DO_THIS if (b->flag & BEZ_ST) { HPt3From(&pt[i], b->STCords[0], b->STCords[1], b->STCords[2], b->STCords[3]); HPt3From(&pt[i+1], b->STCords[4], b->STCords[5], b->STCords[6], b->STCords[7]); } #endif /*DONT_DO_THIS*/ HPt3TransformN(t, pt, pt, i+1); return pt; } void *bezier_PointList_set(int sel, Geom *geom, va_list *args) { int i; HPoint3 *pt; Bezier *b = (Bezier *)geom; (void)va_arg(*args, int); pt = va_arg(*args, HPoint3 *); i = 0; if (b->CtrlPnts != NULL) { if (b->dimn == 3) { for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++) { b->CtrlPnts[i*3] = pt[i].x; b->CtrlPnts[i*3 + 1] = pt[i].y; b->CtrlPnts[i*3 + 2] = pt[i].z; } } else { if (b->dimn == 4) { for (i = 0; i < (b->degree_u + 1) * (b->degree_v + 1); i++) { b->CtrlPnts[i*4] = pt[i].x; b->CtrlPnts[i*4 + 1] = pt[i].y; b->CtrlPnts[i*4 + 2] = pt[i].z; b->CtrlPnts[i*4 + 3] = pt[i].w; } } else { OOGLError(1, "Bezier patch of unfamiliar dimension."); return NULL; } } } #ifdef DONT_DO_THIS if (b->flag & BEZ_ST) { b->STCords[0] = pt[i].x; b->STCords[1] = pt[i].y; b->STCords[2] = pt[i].z; b->STCords[3] = pt[i++].w; b->STCords[4] = pt[i].x; b->STCords[5] = pt[i].y; b->STCords[6] = pt[i].z; b->STCords[7] = pt[i].w; } #endif /*DONT_DO_THIS*/ GeomDelete((Geom *)b->mesh); b->mesh = NULL; return geom; } void *bezier_PointList_length(int sel, Geom *geom, va_list *args) { Bezier *b = (Bezier *)geom; return ((void *)(long)((b->degree_u + 1) * (b->degree_v + 1) #ifdef DONT_DO_THIS + (b->flag & BEZ_ST ? 2 : 0) #endif )); } geomview-1.9.4/src/lib/pointlist/ptlVect.c0000644000175000001440000000541110455701010015425 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "vectP.h" #include "pointlistP.h" void *vect_PointList_get(int sel, Geom *geom, va_list *args); void *vect_PointList_fillin(int sel, Geom *geom, va_list *args); void *vect_PointList_set(int sel, Geom *geom, va_list *args); void *vect_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", vect_PointList_get}, {"PointList_fillin", vect_PointList_fillin}, {"PointList_set", vect_PointList_set}, {"PointList_length", vect_PointList_length} }; static char msg[] = "ptlVect.c"; void ptlVect_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("vect")); } void *vect_PointList_get(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; HPoint3 *plist; TransformPtr t; plist = OOGLNewNE(HPoint3, v->nvert, msg); t = va_arg(*args, TransformPtr); return GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, plist); } void *vect_PointList_fillin(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; TransformPtr t; HPoint3 *plist; t = va_arg(*args, TransformPtr); (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); memcpy(plist, v->p, v->nvert * sizeof(HPoint3)); HPt3TransformN(t, plist, plist, v->nvert); return((void *)plist); } void *vect_PointList_set(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; HPoint3 *plist; (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); memcpy(v->p, plist, v->nvert * sizeof(HPoint3)); return((void *)v); } void *vect_PointList_length(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; return((void *)(long)v->nvert); } geomview-1.9.4/src/lib/pointlist/ptlPolylist.c0000644000175000001440000000560510455701010016350 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "polylistP.h" #include "pointlistP.h" void *polylist_PointList_get(int sel, Geom *geom, va_list *args); void *polylist_PointList_fillin(int sel, Geom *geom, va_list *args); void *polylist_PointList_set(int sel, Geom *geom, va_list *args); void *polylist_PointList_length(int sel, Geom *geom, va_list *args); #define MAX_METHODS 4 static SpecFunc methods[] = { {"PointList_get", polylist_PointList_get}, {"PointList_fillin", polylist_PointList_fillin}, {"PointList_set", polylist_PointList_set}, {"PointList_length", polylist_PointList_length} }; static char msg[] = "ptlPolylist.c"; void ptlPolylist_init() { pointlist_initspec(methods, MAX_METHODS, GeomClassLookup("polylist")); } void *polylist_PointList_get(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; HPoint3 *plist; TransformPtr t; plist = OOGLNewNE(HPoint3, p->n_verts, msg); t = va_arg(*args, TransformPtr); return GeomCall(GeomMethodSel("PointList_fillin"), geom, t, 0, plist); } void *polylist_PointList_fillin(int sel, Geom *geom, va_list *args) { int i; PolyList *p = (PolyList *)geom; TransformPtr t; HPoint3 *plist; t = va_arg(*args, TransformPtr); (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); for (i = 0; i < p->n_verts; i++) HPt3Transform(t, &p->vl[i].pt, &plist[i]); return((void *)plist); } void *polylist_PointList_set(int sel, Geom *geom, va_list *args) { int i; PolyList *p = (PolyList *)geom; HPoint3 *plist; (void)va_arg(*args, int); plist = va_arg(*args, HPoint3 *); for (i = 0; i < p->n_verts; i++) HPt3Copy(&plist[i], &p->vl[i].pt); return((void *)p); } void *polylist_PointList_length(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; return((void *)(long)p->n_verts); } geomview-1.9.4/src/lib/pointlist/Makefile.am0000644000175000001440000000036210455665337015721 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libpointlist.la libpointlist_la_SOURCES = \ pointlist.c ptlBezier.c ptlInst.c ptlList.c ptlMesh.c ptlPolylist.c ptlQuad.c ptlVect.c \ pointlist.h pointlistP.h geomview-1.9.4/src/lib/pointlist/Makefile.in0000644000175000001440000003664210665240506015732 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/pointlist DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libpointlist_la_LIBADD = am_libpointlist_la_OBJECTS = pointlist.lo ptlBezier.lo ptlInst.lo \ ptlList.lo ptlMesh.lo ptlPolylist.lo ptlQuad.lo ptlVect.lo libpointlist_la_OBJECTS = $(am_libpointlist_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libpointlist_la_SOURCES) DIST_SOURCES = $(libpointlist_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libpointlist.la libpointlist_la_SOURCES = \ pointlist.c ptlBezier.c ptlInst.c ptlList.c ptlMesh.c ptlPolylist.c ptlQuad.c ptlVect.c \ pointlist.h pointlistP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/pointlist/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/pointlist/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libpointlist.la: $(libpointlist_la_OBJECTS) $(libpointlist_la_DEPENDENCIES) $(LINK) $(libpointlist_la_OBJECTS) $(libpointlist_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pointlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlBezier.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlInst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlMesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlPolylist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlQuad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlVect.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/pointlist/pointlist.c0000644000175000001440000000474510455701007016050 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "pointlistP.h" static char methods[][POINTLIST_MAXNAME] = { POINTLIST_METHNAMES }; void *pointlist_default(int sel, Geom *geom, va_list *args); void pointlist_init() { int i; for (i = 0; i < POINTLIST_MAXMETH; i++) GeomNewMethod(methods[i], pointlist_default); /* This should be the only place where the methods are mentioned by * name. */ ptlBezier_init(); ptlInst_init(); ptlList_init(); ptlMesh_init(); ptlPolylist_init(); ptlQuad_init(); ptlVect_init(); } void pointlist_initspec(SpecFunc *specfunc, int n_func, GeomClass *class) { int i; for (i = 0; i < n_func; i++) GeomSpecifyMethod(GeomMethodSel(specfunc[i].name), class, specfunc[i].func); } void *pointlist_default(int sel, Geom *geom, va_list *args) { return NULL; } HPoint3 *PointList_get(Geom *geom, Transform T, int CoordSystem) { return (HPoint3 *)GeomCall(GeomMethodSel("PointList_get"), geom, T, CoordSystem); } HPoint3 *PointList_fillin(Geom *geom, Transform T, int CoordSystem, HPoint3 *plist) { return (HPoint3 *)GeomCall(GeomMethodSel("PointList_fillin"), geom, T, CoordSystem, plist); } void PointList_set(Geom *geom, int CoordSystem, HPoint3 *plist) { GeomCall(GeomMethodSel("PointList_set"), geom, CoordSystem, plist); } int PointList_length(Geom *geom) { return (int)(long)GeomCall(GeomMethodSel("PointList_length"), geom); } geomview-1.9.4/src/lib/pointlist/pointlist.h0000644000175000001440000000272510461140710016044 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef POINTLIST_H #define POINTLIST_H /* * Call this to pointlist routines. */ void pointlist_init(); HPoint3 *PointList_get(Geom *geom, Transform T, int CoordSystem); HPoint3 *PointList_fillin(Geom *geom, Transform T, int CoordSystem, HPoint3 *plist); void PointList_set(Geom *geom, int CoordSystem, HPoint3 *plist); int PointList_length(Geom *geom); /* * Flags for describing coordinates. * POINTLIST_SELF This geomview object * POINTLIST_PRIMITIVE Lowest-level OOGL primitive */ #define POINTLIST_SELF 0 #define POINTLIST_PRIMITIVE 1 #endif geomview-1.9.4/src/lib/pointlist/pointlistP.h0000644000175000001440000000271110455701007016164 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef POINTLISTP_H #define POINTLISTP_H #include "pointlist.h" #define POINTLIST_MAXNAME 128 #define POINTLIST_MAXMETH 4 #define POINTLIST_METHNAMES "PointList_get", "PointList_fillin", \ "PointList_set", "PointList_length" typedef struct { char name[POINTLIST_MAXNAME]; GeomExtFunc *func; } SpecFunc; void pointlist_initspec(SpecFunc *specfunc, int n_func, GeomClass *class); void ptlBezier_init(); void ptlInst_init(); void ptlList_init(); void ptlMesh_init(); void ptlPolylist_init(); void ptlQuad_init(); void ptlVect_init(); #endif geomview-1.9.4/src/lib/pointlist/Headers0000644000175000001440000000003107730240401015133 00000000000000pointlist.h pointlistP.h geomview-1.9.4/src/lib/aclib/0000777000175000001440000000000010665240677012774 500000000000000geomview-1.9.4/src/lib/aclib/obstack.c0000644000175000001440000003456210556725313014506 00000000000000/* obstack.c - subroutines used implicitly by object stack macros Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #ifdef _LIBC # include # include #else # include "obstack.h" #endif /* NOTE BEFORE MODIFYING THIS FILE: This version number must be incremented whenever callers compiled using an old obstack.h can no longer properly call the functions in this obstack.c. */ #define OBSTACK_INTERFACE_VERSION 1 /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself, and the installed library supports the same library interface we do. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #include /* Random thing to get __GNU_LIBRARY__. */ #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 # include # if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION # define ELIDE_CODE # endif #endif #include #ifndef ELIDE_CODE # if HAVE_INTTYPES_H # include # endif # if HAVE_STDINT_H || defined _LIBC # include # endif /* Determine default alignment. */ union fooround { uintmax_t i; long double d; void *p; }; struct fooalign { char c; union fooround u; }; /* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT. But in fact it might be less smart and round addresses to as much as DEFAULT_ROUNDING. So we prepare for it to do that. */ enum { DEFAULT_ALIGNMENT = offsetof (struct fooalign, u), DEFAULT_ROUNDING = sizeof (union fooround) }; /* When we copy a long block of data, this is the unit to do it with. On some machines, copying successive ints does not work; in such a case, redefine COPYING_UNIT to `long' (if that works) or `char' as a last resort. */ # ifndef COPYING_UNIT # define COPYING_UNIT int # endif /* The functions allocating more room by calling `obstack_chunk_alloc' jump to the handler pointed to by `obstack_alloc_failed_handler'. This can be set to a user defined function which should either abort gracefully or use longjump - but shouldn't return. This variable by default points to the internal function `print_and_abort'. */ static void print_and_abort (void); void (*obstack_alloc_failed_handler) (void) = print_and_abort; /* Exit value used when `print_and_abort' is used. */ # include #if OUTSIDE_GEOMVIEW # ifdef _LIBC int obstack_exit_failure = EXIT_FAILURE; # else # include "exitfail.h" # define obstack_exit_failure exit_failure # endif #else int obstack_exit_failure = 1; #endif # ifdef _LIBC # if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) /* A looong time ago (before 1994, anyway; we're not sure) this global variable was used by non-GNU-C macros to avoid multiple evaluation. The GNU C library still exports it because somebody might use it. */ struct obstack *_obstack_compat; compat_symbol (libc, _obstack_compat, _obstack, GLIBC_2_0); # endif # endif /* Define a macro that either calls functions with the traditional malloc/free calling interface, or calls functions with the mmalloc/mfree interface (that adds an extra first argument), based on the state of use_extra_arg. For free, do not use ?:, since some compilers, like the MIPS compilers, do not allow (expr) ? void : void. */ # define CALL_CHUNKFUN(h, size) \ (((h) -> use_extra_arg) \ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size))) # define CALL_FREEFUN(h, old_chunk) \ do { \ if ((h) -> use_extra_arg) \ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ else \ (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \ } while (0) /* Initialize an obstack H for use. Specify chunk size SIZE (0 means default). Objects start on multiples of ALIGNMENT (0 means use default). CHUNKFUN is the function to use to allocate chunks, and FREEFUN the function to free them. Return nonzero if successful, calls obstack_alloc_failed_handler if allocation fails. */ int _obstack_begin (struct obstack *h, int size, int alignment, void *(*chunkfun) (long), void (*freefun) (void *)) { register struct _obstack_chunk *chunk; /* points to new chunk */ if (alignment == 0) alignment = DEFAULT_ALIGNMENT; if (size == 0) /* Default size is what GNU malloc can fit in a 4096-byte block. */ { /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. Use the values for range checking, because if range checking is off, the extra bytes won't be missed terribly, but if range checking is on and we used a larger request, a whole extra 4096 bytes would be allocated. These number are irrelevant to the new GNU malloc. I suspect it is less sensitive to the size of the request. */ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) + 4 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)); size = 4096 - extra; } h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun; h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; h->chunk_size = size; h->alignment_mask = alignment - 1; h->use_extra_arg = 0; chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); if (!chunk) (*obstack_alloc_failed_handler) (); h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents, alignment - 1); h->chunk_limit = chunk->limit = (char *) chunk + h->chunk_size; chunk->prev = 0; /* The initial chunk now contains no empty object. */ h->maybe_empty_object = 0; h->alloc_failed = 0; return 1; } int _obstack_begin_1 (struct obstack *h, int size, int alignment, void *(*chunkfun) (void *, long), void (*freefun) (void *, void *), void *arg) { register struct _obstack_chunk *chunk; /* points to new chunk */ if (alignment == 0) alignment = DEFAULT_ALIGNMENT; if (size == 0) /* Default size is what GNU malloc can fit in a 4096-byte block. */ { /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. Use the values for range checking, because if range checking is off, the extra bytes won't be missed terribly, but if range checking is on and we used a larger request, a whole extra 4096 bytes would be allocated. These number are irrelevant to the new GNU malloc. I suspect it is less sensitive to the size of the request. */ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) + 4 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)); size = 4096 - extra; } h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun; h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; h->chunk_size = size; h->alignment_mask = alignment - 1; h->extra_arg = arg; h->use_extra_arg = 1; chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); if (!chunk) (*obstack_alloc_failed_handler) (); h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents, alignment - 1); h->chunk_limit = chunk->limit = (char *) chunk + h->chunk_size; chunk->prev = 0; /* The initial chunk now contains no empty object. */ h->maybe_empty_object = 0; h->alloc_failed = 0; return 1; } /* Allocate a new current chunk for the obstack *H on the assumption that LENGTH bytes need to be added to the current object, or a new object of length LENGTH allocated. Copies any partial object from the end of the old chunk to the beginning of the new one. */ void _obstack_newchunk (struct obstack *h, int length) { register struct _obstack_chunk *old_chunk = h->chunk; register struct _obstack_chunk *new_chunk; register long new_size; register long obj_size = h->next_free - h->object_base; register long i; long already; char *object_base; /* Compute size for new chunk. */ new_size = (obj_size + length) + (obj_size >> 3) + h->alignment_mask + 100; if (new_size < h->chunk_size) new_size = h->chunk_size; /* Allocate and initialize the new chunk. */ new_chunk = CALL_CHUNKFUN (h, new_size); if (!new_chunk) (*obstack_alloc_failed_handler) (); h->chunk = new_chunk; new_chunk->prev = old_chunk; new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size; /* Compute an aligned object_base in the new chunk */ object_base = __PTR_ALIGN ((char *) new_chunk, new_chunk->contents, h->alignment_mask); /* Move the existing object to the new chunk. Word at a time is fast and is safe if the object is sufficiently aligned. */ if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT) { for (i = obj_size / sizeof (COPYING_UNIT) - 1; i >= 0; i--) ((COPYING_UNIT *)object_base)[i] = ((COPYING_UNIT *)h->object_base)[i]; /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT, but that can cross a page boundary on a machine which does not do strict alignment for COPYING_UNITS. */ already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT); } else already = 0; /* Copy remaining bytes one by one. */ for (i = already; i < obj_size; i++) object_base[i] = h->object_base[i]; /* If the object just copied was the only data in OLD_CHUNK, free that chunk and remove it from the chain. But not if that chunk might contain an empty object. */ if (! h->maybe_empty_object && (h->object_base == __PTR_ALIGN ((char *) old_chunk, old_chunk->contents, h->alignment_mask))) { new_chunk->prev = old_chunk->prev; CALL_FREEFUN (h, old_chunk); } h->object_base = object_base; h->next_free = h->object_base + obj_size; /* The new chunk certainly contains no empty object yet. */ h->maybe_empty_object = 0; } # ifdef _LIBC libc_hidden_def (_obstack_newchunk) # endif /* Return nonzero if object OBJ has been allocated from obstack H. This is here for debugging. If you use it in a program, you are probably losing. */ /* Suppress -Wmissing-prototypes warning. We don't want to declare this in obstack.h because it is just for debugging. */ int _obstack_allocated_p (struct obstack *h, void *obj); int _obstack_allocated_p (struct obstack *h, void *obj) { register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ register struct _obstack_chunk *plp; /* point to previous chunk if any */ lp = (h)->chunk; /* We use >= rather than > since the object cannot be exactly at the beginning of the chunk but might be an empty object exactly at the end of an adjacent chunk. */ while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj)) { plp = lp->prev; lp = plp; } return lp != 0; } /* Free objects in obstack H, including OBJ and everything allocate more recently than OBJ. If OBJ is zero, free everything in H. */ # undef obstack_free void obstack_free (struct obstack *h, void *obj) { register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ register struct _obstack_chunk *plp; /* point to previous chunk if any */ lp = h->chunk; /* We use >= because there cannot be an object at the beginning of a chunk. But there can be an empty object at that address at the end of another chunk. */ while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj)) { plp = lp->prev; CALL_FREEFUN (h, lp); lp = plp; /* If we switch chunks, we can't tell whether the new current chunk contains an empty object, so assume that it may. */ h->maybe_empty_object = 1; } if (lp) { h->object_base = h->next_free = (char *) (obj); h->chunk_limit = lp->limit; h->chunk = lp; } else if (obj != 0) /* obj is not in any of the chunks! */ abort (); } # ifdef _LIBC /* Older versions of libc used a function _obstack_free intended to be called by non-GCC compilers. */ strong_alias (obstack_free, _obstack_free) # endif int _obstack_memory_used (struct obstack *h) { register struct _obstack_chunk* lp; register int nbytes = 0; for (lp = h->chunk; lp != 0; lp = lp->prev) { nbytes += lp->limit - (char *) lp; } return nbytes; } #if OUTSIDE_GEOMVIEW /* Define the error handler. */ # ifdef _LIBC # include # else # include "gettext.h" # endif # ifndef _ # define _(msgid) gettext (msgid) # endif #else # ifndef _ # define _(msgid) msgid # endif #endif # ifdef _LIBC # include # endif # ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) # define __attribute__(Spec) /* empty */ # endif # endif static void __attribute__ ((noreturn)) print_and_abort (void) { /* Don't change any of these strings. Yes, it would be possible to add the newline to the string and use fputs or so. But this must not happen because the "memory exhausted" message appears in other places like this and the translation should be reused instead of creating a very similar string which requires a separate translation. */ # ifdef _LIBC (void) __fxprintf (NULL, "%s\n", _("memory exhausted")); # else fprintf (stderr, "%s\n", _("memory exhausted")); # endif exit (obstack_exit_failure); } #endif /* !ELIDE_CODE */ geomview-1.9.4/src/lib/aclib/obstack.h0000644000175000001440000004632010521374102014472 00000000000000/* obstack.h - object stack macros Copyright (C) 1988-1994,1996-1999,2003,2004,2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Summary: All the apparent functions defined here are macros. The idea is that you would use these pre-tested macros to solve a very specific set of problems, and they would run fast. Caution: no side-effects in arguments please!! They may be evaluated MANY times!! These macros operate a stack of objects. Each object starts life small, and may grow to maturity. (Consider building a word syllable by syllable.) An object can move while it is growing. Once it has been "finished" it never changes address again. So the "top of the stack" is typically an immature growing object, while the rest of the stack is of mature, fixed size and fixed address objects. These routines grab large chunks of memory, using a function you supply, called `obstack_chunk_alloc'. On occasion, they free chunks, by calling `obstack_chunk_free'. You must define them and declare them before using any obstack macros. Each independent stack is represented by a `struct obstack'. Each of the obstack macros expects a pointer to such a structure as the first argument. One motivation for this package is the problem of growing char strings in symbol tables. Unless you are "fascist pig with a read-only mind" --Gosper's immortal quote from HAKMEM item 154, out of context--you would not like to put any arbitrary upper limit on the length of your symbols. In practice this often means you will build many short symbols and a few long symbols. At the time you are reading a symbol you don't know how long it is. One traditional method is to read a symbol into a buffer, realloc()ating the buffer every time you try to read a symbol that is longer than the buffer. This is beaut, but you still will want to copy the symbol from the buffer to a more permanent symbol-table entry say about half the time. With obstacks, you can work differently. Use one obstack for all symbol names. As you read a symbol, grow the name in the obstack gradually. When the name is complete, finalize it. Then, if the symbol exists already, free the newly read name. The way we do this is to take a large chunk, allocating memory from low addresses. When you want to build a symbol in the chunk you just add chars above the current "high water mark" in the chunk. When you have finished adding chars, because you got to the end of the symbol, you know how long the chars are, and you can create a new object. Mostly the chars will not burst over the highest address of the chunk, because you would typically expect a chunk to be (say) 100 times as long as an average object. In case that isn't clear, when we have enough chars to make up the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed) so we just point to it where it lies. No moving of chars is needed and this is the second win: potentially long strings need never be explicitly shuffled. Once an object is formed, it does not change its address during its lifetime. When the chars burst over a chunk boundary, we allocate a larger chunk, and then copy the partly formed object from the end of the old chunk to the beginning of the new larger chunk. We then carry on accreting characters to the end of the object as we normally would. A special macro is provided to add a single char at a time to a growing object. This allows the use of register variables, which break the ordinary 'growth' macro. Summary: We allocate large chunks. We carve out one object at a time from the current chunk. Once carved, an object never moves. We are free to append data of any size to the currently growing object. Exactly one object is growing in an obstack at any one time. You can run one obstack per control block. You may have as many control blocks as you dare. Because of the way we do it, you can `unwind' an obstack back to a previous state. (You may remove objects much as you would with a stack.) */ /* Don't do the contents of this file more than once. */ #ifndef _OBSTACK_H #define _OBSTACK_H 1 #ifdef __cplusplus extern "C" { #endif /* We need the type of a pointer subtraction. If __PTRDIFF_TYPE__ is defined, as with GNU C, use that; that way we don't pollute the namespace with 's symbols. Otherwise, include and use ptrdiff_t. */ #ifdef __PTRDIFF_TYPE__ # define PTR_INT_TYPE __PTRDIFF_TYPE__ #else # include # define PTR_INT_TYPE ptrdiff_t #endif /* If B is the base of an object addressed by P, return the result of aligning P to the next multiple of A + 1. B and P must be of type char *. A + 1 must be a power of 2. */ #define __BPTR_ALIGN(B, P, A) ((B) + (((P) - (B) + (A)) & ~(A))) /* Similiar to _BPTR_ALIGN (B, P, A), except optimize the common case where pointers can be converted to integers, aligned as integers, and converted back again. If PTR_INT_TYPE is narrower than a pointer (e.g., the AS/400), play it safe and compute the alignment relative to B. Otherwise, use the faster strategy of computing the alignment relative to 0. */ #define __PTR_ALIGN(B, P, A) \ __BPTR_ALIGN (sizeof (PTR_INT_TYPE) < sizeof (void *) ? (B) : (char *) 0, \ P, A) #include struct _obstack_chunk /* Lives at front of each chunk. */ { char *limit; /* 1 past end of this chunk */ struct _obstack_chunk *prev; /* address of prior chunk or NULL */ char contents[4]; /* objects begin here */ }; struct obstack /* control current object in current chunk */ { long chunk_size; /* preferred size to allocate chunks in */ struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */ char *object_base; /* address of object we are building */ char *next_free; /* where to add next char to current object */ char *chunk_limit; /* address of char after current chunk */ union { PTR_INT_TYPE tempint; void *tempptr; } temp; /* Temporary for some macros. */ int alignment_mask; /* Mask of alignment for each object. */ /* These prototypes vary based on `use_extra_arg', and we use casts to the prototypeless function type in all assignments, but having prototypes here quiets -Wstrict-prototypes. */ struct _obstack_chunk *(*chunkfun) (void *, long); void (*freefun) (void *, struct _obstack_chunk *); void *extra_arg; /* first arg for chunk alloc/dealloc funcs */ unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */ unsigned maybe_empty_object:1;/* There is a possibility that the current chunk contains a zero-length object. This prevents freeing the chunk if we allocate a bigger chunk to replace it. */ unsigned alloc_failed:1; /* No longer used, as we now call the failed handler on error, but retained for binary compatibility. */ }; /* Declare the external functions we use; they are in obstack.c. */ extern void _obstack_newchunk (struct obstack *, int); extern int _obstack_begin (struct obstack *, int, int, void *(*) (long), void (*) (void *)); extern int _obstack_begin_1 (struct obstack *, int, int, void *(*) (void *, long), void (*) (void *, void *), void *); extern int _obstack_memory_used (struct obstack *); void obstack_free (struct obstack *obstack, void *block); /* Error handler called when `obstack_chunk_alloc' failed to allocate more memory. This can be set to a user defined function which should either abort gracefully or use longjump - but shouldn't return. The default action is to print a message and abort. */ extern void (*obstack_alloc_failed_handler) (void); /* Exit value used when `print_and_abort' is used. */ extern int obstack_exit_failure; /* Pointer to beginning of object being allocated or to be allocated next. Note that this might not be the final address of the object because a new chunk might be needed to hold the final size. */ #define obstack_base(h) ((void *) (h)->object_base) /* Size for allocating ordinary chunks. */ #define obstack_chunk_size(h) ((h)->chunk_size) /* Pointer to next byte not yet allocated in current chunk. */ #define obstack_next_free(h) ((h)->next_free) /* Mask specifying low bits that should be clear in address of an object. */ #define obstack_alignment_mask(h) ((h)->alignment_mask) /* To prevent prototype warnings provide complete argument list. */ #define obstack_init(h) \ _obstack_begin ((h), 0, 0, \ (void *(*) (long)) obstack_chunk_alloc, \ (void (*) (void *)) obstack_chunk_free) #define obstack_begin(h, size) \ _obstack_begin ((h), (size), 0, \ (void *(*) (long)) obstack_chunk_alloc, \ (void (*) (void *)) obstack_chunk_free) #define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ _obstack_begin ((h), (size), (alignment), \ (void *(*) (long)) (chunkfun), \ (void (*) (void *)) (freefun)) #define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ _obstack_begin_1 ((h), (size), (alignment), \ (void *(*) (void *, long)) (chunkfun), \ (void (*) (void *, void *)) (freefun), (arg)) #define obstack_chunkfun(h, newchunkfun) \ ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun)) #define obstack_freefun(h, newfreefun) \ ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun)) #define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar)) #define obstack_blank_fast(h,n) ((h)->next_free += (n)) #define obstack_memory_used(h) _obstack_memory_used (h) #if defined __GNUC__ && defined __STDC__ && __STDC__ /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and does not implement __extension__. But that compiler doesn't define __GNUC_MINOR__. */ # if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__) # define __extension__ # endif /* For GNU C, if not -traditional, we can define these macros to compute all args only once without using a global variable. Also, we can avoid using the `temp' slot, to make faster code. */ # define obstack_object_size(OBSTACK) \ __extension__ \ ({ struct obstack const *__o = (OBSTACK); \ (unsigned) (__o->next_free - __o->object_base); }) # define obstack_room(OBSTACK) \ __extension__ \ ({ struct obstack const *__o = (OBSTACK); \ (unsigned) (__o->chunk_limit - __o->next_free); }) # define obstack_make_room(OBSTACK,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ if (__o->chunk_limit - __o->next_free < __len) \ _obstack_newchunk (__o, __len); \ (void) 0; }) # define obstack_empty_p(OBSTACK) \ __extension__ \ ({ struct obstack const *__o = (OBSTACK); \ (__o->chunk->prev == 0 \ && __o->next_free == __PTR_ALIGN ((char *) __o->chunk, \ __o->chunk->contents, \ __o->alignment_mask)); }) # define obstack_grow(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ if (__o->next_free + __len > __o->chunk_limit) \ _obstack_newchunk (__o, __len); \ memcpy (__o->next_free, where, __len); \ __o->next_free += __len; \ (void) 0; }) # define obstack_grow0(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ if (__o->next_free + __len + 1 > __o->chunk_limit) \ _obstack_newchunk (__o, __len + 1); \ memcpy (__o->next_free, where, __len); \ __o->next_free += __len; \ *(__o->next_free)++ = 0; \ (void) 0; }) # define obstack_1grow(OBSTACK,datum) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ if (__o->next_free + 1 > __o->chunk_limit) \ _obstack_newchunk (__o, 1); \ obstack_1grow_fast (__o, datum); \ (void) 0; }) /* These assume that the obstack alignment is good enough for pointers or ints, and that the data added so far to the current object shares that much alignment. */ # define obstack_ptr_grow(OBSTACK,datum) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ if (__o->next_free + sizeof (void *) > __o->chunk_limit) \ _obstack_newchunk (__o, sizeof (void *)); \ obstack_ptr_grow_fast (__o, datum); }) \ # define obstack_int_grow(OBSTACK,datum) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ if (__o->next_free + sizeof (int) > __o->chunk_limit) \ _obstack_newchunk (__o, sizeof (int)); \ obstack_int_grow_fast (__o, datum); }) # define obstack_ptr_grow_fast(OBSTACK,aptr) \ __extension__ \ ({ struct obstack *__o1 = (OBSTACK); \ *(const void **) __o1->next_free = (aptr); \ __o1->next_free += sizeof (const void *); \ (void) 0; }) # define obstack_int_grow_fast(OBSTACK,aint) \ __extension__ \ ({ struct obstack *__o1 = (OBSTACK); \ *(int *) __o1->next_free = (aint); \ __o1->next_free += sizeof (int); \ (void) 0; }) # define obstack_blank(OBSTACK,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ if (__o->chunk_limit - __o->next_free < __len) \ _obstack_newchunk (__o, __len); \ obstack_blank_fast (__o, __len); \ (void) 0; }) # define obstack_alloc(OBSTACK,length) \ __extension__ \ ({ struct obstack *__h = (OBSTACK); \ obstack_blank (__h, (length)); \ obstack_finish (__h); }) # define obstack_copy(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__h = (OBSTACK); \ obstack_grow (__h, (where), (length)); \ obstack_finish (__h); }) # define obstack_copy0(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__h = (OBSTACK); \ obstack_grow0 (__h, (where), (length)); \ obstack_finish (__h); }) /* The local variable is named __o1 to avoid a name conflict when obstack_blank is called. */ # define obstack_finish(OBSTACK) \ __extension__ \ ({ struct obstack *__o1 = (OBSTACK); \ void *__value = (void *) __o1->object_base; \ if (__o1->next_free == __value) \ __o1->maybe_empty_object = 1; \ __o1->next_free \ = __PTR_ALIGN (__o1->object_base, __o1->next_free, \ __o1->alignment_mask); \ if (__o1->next_free - (char *)__o1->chunk \ > __o1->chunk_limit - (char *)__o1->chunk) \ __o1->next_free = __o1->chunk_limit; \ __o1->object_base = __o1->next_free; \ __value; }) # define obstack_free(OBSTACK, OBJ) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ void *__obj = (OBJ); \ if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \ __o->next_free = __o->object_base = (char *)__obj; \ else (obstack_free) (__o, __obj); }) #else /* not __GNUC__ or not __STDC__ */ # define obstack_object_size(h) \ (unsigned) ((h)->next_free - (h)->object_base) # define obstack_room(h) \ (unsigned) ((h)->chunk_limit - (h)->next_free) # define obstack_empty_p(h) \ ((h)->chunk->prev == 0 \ && (h)->next_free == __PTR_ALIGN ((char *) (h)->chunk, \ (h)->chunk->contents, \ (h)->alignment_mask)) /* Note that the call to _obstack_newchunk is enclosed in (..., 0) so that we can avoid having void expressions in the arms of the conditional expression. Casting the third operand to void was tried before, but some compilers won't accept it. */ # define obstack_make_room(h,length) \ ( (h)->temp.tempint = (length), \ (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0)) # define obstack_grow(h,where,length) \ ( (h)->temp.tempint = (length), \ (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0), \ memcpy ((h)->next_free, where, (h)->temp.tempint), \ (h)->next_free += (h)->temp.tempint) # define obstack_grow0(h,where,length) \ ( (h)->temp.tempint = (length), \ (((h)->next_free + (h)->temp.tempint + 1 > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), (h)->temp.tempint + 1), 0) : 0), \ memcpy ((h)->next_free, where, (h)->temp.tempint), \ (h)->next_free += (h)->temp.tempint, \ *((h)->next_free)++ = 0) # define obstack_1grow(h,datum) \ ( (((h)->next_free + 1 > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), 1), 0) : 0), \ obstack_1grow_fast (h, datum)) # define obstack_ptr_grow(h,datum) \ ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \ obstack_ptr_grow_fast (h, datum)) # define obstack_int_grow(h,datum) \ ( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ obstack_int_grow_fast (h, datum)) # define obstack_ptr_grow_fast(h,aptr) \ (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr)) # define obstack_int_grow_fast(h,aint) \ (((int *) ((h)->next_free += sizeof (int)))[-1] = (aint)) # define obstack_blank(h,length) \ ( (h)->temp.tempint = (length), \ (((h)->chunk_limit - (h)->next_free < (h)->temp.tempint) \ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0), \ obstack_blank_fast (h, (h)->temp.tempint)) # define obstack_alloc(h,length) \ (obstack_blank ((h), (length)), obstack_finish ((h))) # define obstack_copy(h,where,length) \ (obstack_grow ((h), (where), (length)), obstack_finish ((h))) # define obstack_copy0(h,where,length) \ (obstack_grow0 ((h), (where), (length)), obstack_finish ((h))) # define obstack_finish(h) \ ( ((h)->next_free == (h)->object_base \ ? (((h)->maybe_empty_object = 1), 0) \ : 0), \ (h)->temp.tempptr = (h)->object_base, \ (h)->next_free \ = __PTR_ALIGN ((h)->object_base, (h)->next_free, \ (h)->alignment_mask), \ (((h)->next_free - (char *) (h)->chunk \ > (h)->chunk_limit - (char *) (h)->chunk) \ ? ((h)->next_free = (h)->chunk_limit) : 0), \ (h)->object_base = (h)->next_free, \ (h)->temp.tempptr) # define obstack_free(h,obj) \ ( (h)->temp.tempint = (char *) (obj) - (char *) (h)->chunk, \ ((((h)->temp.tempint > 0 \ && (h)->temp.tempint < (h)->chunk_limit - (char *) (h)->chunk)) \ ? (int) ((h)->next_free = (h)->object_base \ = (h)->temp.tempint + (char *) (h)->chunk) \ : (((obstack_free) ((h), (h)->temp.tempint + (char *) (h)->chunk), 0), 0))) #endif /* not __GNUC__ or not __STDC__ */ #ifdef __cplusplus } /* C++ */ #endif #endif /* obstack.h */ geomview-1.9.4/src/lib/aclib/strcasecmp.c0000644000175000001440000000253710455703304015213 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif int strcasecmp(char *a, char *b) { int ca, cb; while((ca = *a) && (cb = *b)) { if(ca != cb) { if(ca >= 'A' && ca <= 'Z') ca += 'a' - 'A'; if(cb >= 'A' && cb <= 'Z') cb += 'a' - 'A'; if(ca != cb) return ca - cb; } a++, b++; } return 0; } geomview-1.9.4/src/lib/aclib/putenv.c0000644000175000001440000000766210615626422014377 00000000000000/* * The following copyright notice applies to everything in this * file from here on down. */ /* * Copyright (c) 1987 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)getenv.c 5.5 (Berkeley) 6/27/88"; #endif /* LIBC_SCCS and not lint */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include /* * _findenv -- * Returns pointer to value associated with name, if any, else NULL. * Sets offset to be the offset of the name/value combination in the * environmental array, for use by setenv(3)/putenv(3) and unsetenv(3). * Explicitly removes '=' in argument name. */ static char *_findenv(char *name, int *offset) { extern char **environ; int len; char **P, *C; for (C = name, len = 0; *C && *C != '='; ++C, ++len); for (P = environ; *P; ++P) if (!strncmp(*P, name, len)) if (*(C = *P + len) == '=') { *offset = P - environ; return(++C); } return(NULL); } #if defined(LIBC_SCCS) && !defined(lint) /* static char sccsid[] = "@(#)setenv.c 5.2 (Berkeley) 6/27/88"; */ #endif /* LIBC_SCCS and not lint */ #include /* Note: we do not use OOGLNew() & friends because libc would neither do so. */ static inline void *xmalloc(size_t size) { void *ptr; if ((ptr = malloc(size)) == NULL) { fprintf(stderr, "malloc(%d) failed in putenv().\n", size); exit(EXIT_FAILURE); } return ptr; } static inline void *xrealloc(void *oldptr, size_t newsize) { void *ptr; if ((ptr = realloc(oldptr, newsize)) == NULL) { fprintf(stderr, "realloc(%p, %d) failed in putenv().\n", oldptr, newsize); exit(EXIT_FAILURE); } return ptr; } /* * putenv -- * Put a string of the form "name=value" into the environment. * [Adapted from BSD routine setenv(name, value, rewrite).] */ putenv(char *name) { extern char **environ; static int alloced; /* if allocated space before */ char *value; char *C; int l_value, offset; value = strchr(name, '='); value = value ? value+1 : name; l_value = strlen(value); if ((C = _findenv(name, &offset))) { /* find if already exists */ if (strlen(C) >= l_value) { /* old larger; copy over */ while (*C++ = *value++); return(0); } } else { /* create new slot */ int cnt; char **P; for (P = environ, cnt = 0; *P; ++P, ++cnt); if (alloced) { /* just increase size */ environ = (char **)realloc((char *)environ, (u_int)(sizeof(char *) * (cnt + 2))); if (!environ) return(-1); } else { /* get new space */ alloced = 1; /* copy old entries into it */ P = (char **)xmalloc((u_int)(sizeof(char *) * (cnt + 2))); if (!P) return(-1); memcpy(P, environ, cnt * sizeof(char *)); environ = P; } environ[cnt + 1] = NULL; offset = cnt; } for (C = name; *C && *C != '='; ++C); /* no `=' in name */ if (!(environ[offset] = /* name + `=' + value */ xmalloc((u_int)((int)(C - name) + l_value + 2)))) return(-1); for (C = environ[offset]; (*C = *name++) && *C != '='; ++C); for (*C++ = '='; *C++ = *value++;); return(0); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/aclib/lstat.c0000644000175000001440000000376410463345062014203 00000000000000/* Copyright (C) 2006 Claus-Justus Heine. * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #undef lstat #if HAVE_SYS_TYPES_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_LIMITS_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_ERRNO_H # include #endif #if !HAVE_DECL_ERRNO extern int errno; #endif #ifndef PATH_MAX # define PATH_MAX 1024 #endif #ifndef ENOENT # define ENOENT 255 #endif #ifndef ENAMETOOLONG # define ENAMETOOLONG 255 #endif #ifndef ENOSYS # define ENOSYS 255 #endif int gv_lstat(const char *path, struct stat *buf) { #if !LSTAT_FOLLOWS_SLASHED_SYMLINK size_t pathlen; char mypath[PATH_MAX+1]; #endif #if HAVE_LSTAT_EMPTY_STRING_BUG if (path == NULL || *path == '\0') { errno = ENOENT; return -1; } #endif #if !LSTAT_FOLLOWS_SLASHED_SYMLINK pathlen = strlen(path); if (pathlen > 0 && path[pathlen-1] == '/') { if (pathlen == PATH_MAX) { errno = ENAMETOOLONG; return -1; } memcpy(mypath, path, pathlen); path = mypath; mypath[pathlen++] = '.'; mypath[pathlen++] = '\0'; } #endif #if HAVE_LSTAT return lstat(path, buf); #else errno = ENOSYS; return -1; #endif } geomview-1.9.4/src/lib/aclib/Makefile.am0000644000175000001440000000020610615625667014743 00000000000000EXTRA_DIST = Headers noinst_LTLIBRARIES = libacgeomview.la libacgeomview_la_SOURCES = libacgeomview_la_LIBADD = @LTLIBOBJS@ @ALLOCA@ geomview-1.9.4/src/lib/aclib/Makefile.in0000644000175000001440000003727010665240500014747 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/aclib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in acosh.c \ alloca.c fmemopen.c lstat.c memcmp.c obstack.c obstack.h \ popen.c putenv.c stat.c strcasecmp.c strdup.c strncasecmp.c \ strtod.c ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libacgeomview_la_DEPENDENCIES = @LTLIBOBJS@ @ALLOCA@ am_libacgeomview_la_OBJECTS = libacgeomview_la_OBJECTS = $(am_libacgeomview_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libacgeomview_la_SOURCES) DIST_SOURCES = $(libacgeomview_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = Headers noinst_LTLIBRARIES = libacgeomview.la libacgeomview_la_SOURCES = libacgeomview_la_LIBADD = @LTLIBOBJS@ @ALLOCA@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/aclib/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/aclib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libacgeomview.la: $(libacgeomview_la_OBJECTS) $(libacgeomview_la_DEPENDENCIES) $(LINK) $(libacgeomview_la_OBJECTS) $(libacgeomview_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/acosh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/fmemopen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lstat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memcmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/obstack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/popen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/putenv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/stat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strcasecmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strdup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strncasecmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtod.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf $(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf $(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/aclib/acosh.c0000644000175000001440000000262610455703343014146 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include /* HP-UX native cc does have finite() and acosh() in its library, * but gcc (at least our 2.5.8) doesn't find it there. */ double acosh(double c) { /* cosh(x) = (e^x + e^-x)/2 * u = e^x * u^2 - 2c u + 1 = 0 * u = c +/- sqrt(c^2 - 1) */ return log(c + sqrt(c*c - 1)); } geomview-1.9.4/src/lib/aclib/stat.c0000644000175000001440000000307610463345062014023 00000000000000/* Copyright (C) 2006 Claus-Justus Heine. * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #undef stat #undef fstat #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_ERRNO_H # include #endif #if !HAVE_DECL_ERRNO extern int errno; #endif #ifndef ENOENT # define ENOENT 255 #endif #ifndef ENOSYS # define ENOSYS 255 #endif int gv_stat(const char *path, struct stat *buf) { #if HAVE_LSTAT_EMPTY_STRING_BUG if (path == NULL || *path == '\0') { errno = ENOENT; return -1; } #endif #if HAVE_STAT return stat(path, buf); #else errno = ENOSYS; return -1; #endif } int gv_fstat(int fd, struct stat *buf) { #if HAVE_FSTAT return fstat(fd, buf); #else errno = ENOSYS; return -1; #endif } geomview-1.9.4/src/lib/aclib/strncasecmp.c0000644000175000001440000000256310455703243015372 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif int strncasecmp(char *a, char *b, int n) { int ca, cb; while(--n >= 0 && (ca = *a) && (cb = *b)) { if(ca != cb) { if(ca >= 'A' && ca <= 'Z') ca += 'a' - 'A'; if(cb >= 'A' && cb <= 'Z') cb += 'a' - 'A'; if(ca != cb) return ca - cb; } a++, b++; } return 0; } geomview-1.9.4/src/lib/aclib/fmemopen.c0000644000175000001440000000326710455701010014646 00000000000000/* * Copyright (C) 2006 Claus-Justus Heine This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * Clean stdio replacement for fmemopen, using a temporary file. No * more fiddling with stdio internals. Gnah. */ /* As a special exception the author of this files permits the * distribution of this software with Geomview. As long as this file * is distributed with Geomview, the conditions of the GNU Lesser * Public Licence apply. See the file "COPYING" in the top-level * directory. */ #include /* Come on, folks, let's just do it the CleanWay (tm): open a * temporary file, write the string to that file, rewind the file, * unlink the file (then fclose() will remove it). Grin. A * brain-damaged system might fail to actually delete that file, but * we do not care. */ FILE *fmemopen (void *buf, size_t size, const char *mode) { FILE *tmp = tmpfile(); if (*mode != 'r') { return NULL; } if (fwrite(buf, size, 1, tmp) != 1) { fclose(tmp); return NULL; } if (fseek(tmp, 0L, SEEK_SET) != 0) { fclose(tmp); return NULL; } return tmp; } geomview-1.9.4/src/lib/aclib/alloca.c0000644000175000001440000003332010461140703014267 00000000000000/* alloca.c -- allocate automatically reclaimed memory (Mostly) portable public-domain implementation -- D A Gwyn This implementation of the PWB library alloca function, which is used to allocate space off the run-time stack so that it is automatically reclaimed upon procedure exit, was inspired by discussions with J. Q. Johnson of Cornell. J.Otto Tennant contributed the Cray support. There are some preprocessor constants that can be defined when compiling for your specific system, for improved efficiency; however, the defaults should be okay. The general concept of this implementation is to keep track of all alloca-allocated blocks, and reclaim any that are found to be deeper in the stack than the current invocation. This heuristic does not reclaim storage as soon as it becomes invalid, but it will do so eventually. As a special case, alloca(0) reclaims storage without allocating any. It is a good idea to use alloca(0) in your main control loop, etc. to force garbage collection. */ /* @deftypefn Replacement void* alloca (size_t @var{size}) This function allocates memory which will be automatically reclaimed after the procedure exits. The @libib{} implementation does not free the memory immediately but will do so eventually during subsequent calls to this function. Memory is allocated using @code{xmalloc} under normal circumstances. The header file @file{alloca-conf.h} can be used in conjunction with the GNU Autoconf test @code{AC_FUNC_ALLOCA} to test for and properly make available this function. The @code{AC_FUNC_ALLOCA} test requires that client code use a block of preprocessor code to be safe (see the Autoconf manual for more); this header incorporates that logic and more, including the possibility of a GCC built-in function. @end deftypefn */ #ifdef HAVE_CONFIG_H #include #endif #include #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_STDLIB_H #include #endif /* These variables are used by the ASTRDUP implementation that relies on C_alloca. */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ const char *libiberty_optr; char *libiberty_nptr; unsigned long libiberty_len; #ifdef __cplusplus } #endif /* __cplusplus */ /* If your stack is a linked list of frames, you have to provide an "address metric" ADDRESS_FUNCTION macro. */ #if defined (CRAY) && defined (CRAY_STACKSEG_END) static long i00afunc (); #define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) #else #define ADDRESS_FUNCTION(arg) &(arg) #endif #ifndef NULL #define NULL 0 #endif /* Define STACK_DIRECTION if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #ifndef STACK_DIRECTION #define STACK_DIRECTION 0 /* Direction unknown. */ #endif #if STACK_DIRECTION != 0 #define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ #else /* STACK_DIRECTION == 0; need run-time code. */ static int stack_dir; /* 1 or -1 once known. */ #define STACK_DIR stack_dir static void find_stack_direction (void) { static char *addr = NULL; /* Address of first `dummy', once known. */ auto char dummy; /* To get stack address. */ if (addr == NULL) { /* Initial entry. */ addr = ADDRESS_FUNCTION (dummy); find_stack_direction (); /* Recurse once. */ } else { /* Second entry. */ if (ADDRESS_FUNCTION (dummy) > addr) stack_dir = 1; /* Stack grew upward. */ else stack_dir = -1; /* Stack grew downward. */ } } #endif /* STACK_DIRECTION == 0 */ /* An "alloca header" is used to: (a) chain together all alloca'ed blocks; (b) keep track of stack depth. It is very important that sizeof(header) agree with malloc alignment chunk size. The following default should work okay. */ #ifndef ALIGN_SIZE #define ALIGN_SIZE sizeof(double) #endif typedef union hdr { char align[ALIGN_SIZE]; /* To force sizeof(header). */ struct { union hdr *next; /* For chaining headers. */ char *deep; /* For stack depth measure. */ } h; } header; static header *last_alloca_header = NULL; /* -> last alloca header. */ /* Return a pointer to at least SIZE bytes of storage, which will be automatically reclaimed upon exit from the procedure that called alloca. Originally, this space was supposed to be taken from the current stack frame of the caller, but that method cannot be made to work for some implementations of C, for example under Gould's UTX/32. */ /* @undocumented C_alloca */ PTR C_alloca (size_t size) { auto char probe; /* Probes stack depth: */ char *depth = ADDRESS_FUNCTION (probe); #if STACK_DIRECTION == 0 if (STACK_DIR == 0) /* Unknown growth direction. */ find_stack_direction (); #endif /* Reclaim garbage, defined as all alloca'd storage that was allocated from deeper in the stack than currently. */ { header *hp; /* Traverses linked list. */ for (hp = last_alloca_header; hp != NULL;) if ((STACK_DIR > 0 && hp->h.deep > depth) || (STACK_DIR < 0 && hp->h.deep < depth)) { header *np = hp->h.next; free ((PTR) hp); /* Collect garbage. */ hp = np; /* -> next header. */ } else break; /* Rest are not deeper. */ last_alloca_header = hp; /* -> last valid storage. */ } if (size == 0) return NULL; /* No allocation required. */ /* Allocate combined header + user data storage. */ { void *new_storage = XNEWVEC (char, sizeof (header) + size); /* Address of header. */ if (new_storage == 0) abort(); ((header *) new_storage)->h.next = last_alloca_header; ((header *) new_storage)->h.deep = depth; last_alloca_header = (header *) new_storage; /* User storage begins just after header. */ return (PTR) ((char *) new_storage + sizeof (header)); } } #if defined (CRAY) && defined (CRAY_STACKSEG_END) #ifdef DEBUG_I00AFUNC #include #endif #ifndef CRAY_STACK #define CRAY_STACK #ifndef CRAY2 /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ struct stack_control_header { long shgrow:32; /* Number of times stack has grown. */ long shaseg:32; /* Size of increments to stack. */ long shhwm:32; /* High water mark of stack. */ long shsize:32; /* Current size of stack (all segments). */ }; /* The stack segment linkage control information occurs at the high-address end of a stack segment. (The stack grows from low addresses to high addresses.) The initial part of the stack segment linkage control information is 0200 (octal) words. This provides for storage for the routine which overflows the stack. */ struct stack_segment_linkage { long ss[0200]; /* 0200 overflow words. */ long sssize:32; /* Number of words in this segment. */ long ssbase:32; /* Offset to stack base. */ long:32; long sspseg:32; /* Offset to linkage control of previous segment of stack. */ long:32; long sstcpt:32; /* Pointer to task common address block. */ long sscsnm; /* Private control structure number for microtasking. */ long ssusr1; /* Reserved for user. */ long ssusr2; /* Reserved for user. */ long sstpid; /* Process ID for pid based multi-tasking. */ long ssgvup; /* Pointer to multitasking thread giveup. */ long sscray[7]; /* Reserved for Cray Research. */ long ssa0; long ssa1; long ssa2; long ssa3; long ssa4; long ssa5; long ssa6; long ssa7; long sss0; long sss1; long sss2; long sss3; long sss4; long sss5; long sss6; long sss7; }; #else /* CRAY2 */ /* The following structure defines the vector of words returned by the STKSTAT library routine. */ struct stk_stat { long now; /* Current total stack size. */ long maxc; /* Amount of contiguous space which would be required to satisfy the maximum stack demand to date. */ long high_water; /* Stack high-water mark. */ long overflows; /* Number of stack overflow ($STKOFEN) calls. */ long hits; /* Number of internal buffer hits. */ long extends; /* Number of block extensions. */ long stko_mallocs; /* Block allocations by $STKOFEN. */ long underflows; /* Number of stack underflow calls ($STKRETN). */ long stko_free; /* Number of deallocations by $STKRETN. */ long stkm_free; /* Number of deallocations by $STKMRET. */ long segments; /* Current number of stack segments. */ long maxs; /* Maximum number of stack segments so far. */ long pad_size; /* Stack pad size. */ long current_address; /* Current stack segment address. */ long current_size; /* Current stack segment size. This number is actually corrupted by STKSTAT to include the fifteen word trailer area. */ long initial_address; /* Address of initial segment. */ long initial_size; /* Size of initial segment. */ }; /* The following structure describes the data structure which trails any stack segment. I think that the description in 'asdef' is out of date. I only describe the parts that I am sure about. */ struct stk_trailer { long this_address; /* Address of this block. */ long this_size; /* Size of this block (does not include this trailer). */ long unknown2; long unknown3; long link; /* Address of trailer block of previous segment. */ long unknown5; long unknown6; long unknown7; long unknown8; long unknown9; long unknown10; long unknown11; long unknown12; long unknown13; long unknown14; }; #endif /* CRAY2 */ #endif /* not CRAY_STACK */ #ifdef CRAY2 /* Determine a "stack measure" for an arbitrary ADDRESS. I doubt that "lint" will like this much. */ static long i00afunc (long *address) { struct stk_stat status; struct stk_trailer *trailer; long *block, size; long result = 0; /* We want to iterate through all of the segments. The first step is to get the stack status structure. We could do this more quickly and more directly, perhaps, by referencing the $LM00 common block, but I know that this works. */ STKSTAT (&status); /* Set up the iteration. */ trailer = (struct stk_trailer *) (status.current_address + status.current_size - 15); /* There must be at least one stack segment. Therefore it is a fatal error if "trailer" is null. */ if (trailer == 0) abort (); /* Discard segments that do not contain our argument address. */ while (trailer != 0) { block = (long *) trailer->this_address; size = trailer->this_size; if (block == 0 || size == 0) abort (); trailer = (struct stk_trailer *) trailer->link; if ((block <= address) && (address < (block + size))) break; } /* Set the result to the offset in this segment and add the sizes of all predecessor segments. */ result = address - block; if (trailer == 0) { return result; } do { if (trailer->this_size <= 0) abort (); result += trailer->this_size; trailer = (struct stk_trailer *) trailer->link; } while (trailer != 0); /* We are done. Note that if you present a bogus address (one not in any segment), you will get a different number back, formed from subtracting the address of the first block. This is probably not what you want. */ return (result); } #else /* not CRAY2 */ /* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. Determine the number of the cell within the stack, given the address of the cell. The purpose of this routine is to linearize, in some sense, stack addresses for alloca. */ static long i00afunc (long address) { long stkl = 0; long size, pseg, this_segment, stack; long result = 0; struct stack_segment_linkage *ssptr; /* Register B67 contains the address of the end of the current stack segment. If you (as a subprogram) store your registers on the stack and find that you are past the contents of B67, you have overflowed the segment. B67 also points to the stack segment linkage control area, which is what we are really interested in. */ stkl = CRAY_STACKSEG_END (); ssptr = (struct stack_segment_linkage *) stkl; /* If one subtracts 'size' from the end of the segment, one has the address of the first word of the segment. If this is not the first segment, 'pseg' will be nonzero. */ pseg = ssptr->sspseg; size = ssptr->sssize; this_segment = stkl - size; /* It is possible that calling this routine itself caused a stack overflow. Discard stack segments which do not contain the target address. */ while (!(this_segment <= address && address <= stkl)) { #ifdef DEBUG_I00AFUNC fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); #endif if (pseg == 0) break; stkl = stkl - pseg; ssptr = (struct stack_segment_linkage *) stkl; size = ssptr->sssize; pseg = ssptr->sspseg; this_segment = stkl - size; } result = address - this_segment; /* If you subtract pseg from the current end of the stack, you get the address of the previous stack segment's end. This seems a little convoluted to me, but I'll bet you save a cycle somewhere. */ while (pseg != 0) { #ifdef DEBUG_I00AFUNC fprintf (stderr, "%011o %011o\n", pseg, size); #endif stkl = stkl - pseg; ssptr = (struct stack_segment_linkage *) stkl; size = ssptr->sssize; pseg = ssptr->sspseg; result += size; } return (result); } #endif /* not CRAY2 */ #endif /* CRAY */ geomview-1.9.4/src/lib/aclib/strdup.c0000644000175000001440000000336010615626364014373 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include /* Note: we do not use OOGLNew() & friends because libc would neither do so. */ static inline void *xmalloc(size_t size) { void *ptr; if ((ptr = malloc(size)) == NULL) { fprintf(stderr, "malloc(%d) failed in strdup().\n", size); exit(EXIT_FAILURE); } return ptr; } #undef strdup char *strdup(const char *str ) { char *s; int len; if(str == NULL) return NULL; len = strlen(str); s = xmalloc(len+1); memcpy(s, str, len+1); return s; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/aclib/strtod.c0000644000175000001440000000001510455701010014343 00000000000000#error FIXME geomview-1.9.4/src/lib/aclib/popen.c0000644000175000001440000000234410455703411014163 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include FILE *popen(char *name, char *mode) { fprintf(stderr, "Call to stub popen(%s, %s)!\n", name, mode); return NULL; } geomview-1.9.4/src/lib/aclib/Headers0000644000175000001440000000001210521404313014153 00000000000000obstack.h geomview-1.9.4/src/lib/aclib/memcmp.c0000644000175000001440000000001510455701010014302 00000000000000#error FIXME geomview-1.9.4/src/lib/color/0000777000175000001440000000000010665240670013031 500000000000000geomview-1.9.4/src/lib/color/color.c0000644000175000001440000000630210455701000014212 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" #include void CoPrint( Color *c ) { } void CoCopy( Color *c1, Color *c2 ) { *c2 = *c1; } void CoACopy( ColorA *c1, ColorA *c2 ) { *c2 = *c1; } void CoFrom( Color *c, float r, float g, float b ) { c->r = r; c->g = g; c->b = b; } void CoAdd( Color *c1,Color *c2, Color *c3 ) { c3->r = c1->r + c2->r; c3->g = c1->g + c2->g; c3->b = c1->b + c2->b; } void CoSub( Color *c1, Color *c2, Color *c3 ) { c3->r = c1->r - c2->r; c3->g = c1->g - c2->g; c3->b = c1->b - c2->b; } void CoFilter( Color *c1, Color *c2, Color *c3 ) { c3->r = c1->r * c2->r; c3->g = c1->g * c2->g; c3->b = c1->b * c2->b; } #define vH (hsv->r) #define vS (hsv->g) #define vV (hsv->b) /* HSV to RGB conversion from Ken Fishkin, pixar!fishkin */ void hsv2rgb(Color *hsv, Color *rgb) { float h = 6.0 * (vH < 0 ? vH + (1 - (int)vH) : vH - (int)vH); int sextant = (int) h; /* implicit floor */ float fract = h - sextant; float vsf = vS*vV*fract; float min = (1-vS)*vV; float mid1 = min + vsf; float mid2 = vV - vsf; switch (sextant%6) { case 0: rgb->r = vV; rgb->g = mid1; rgb->b = min; break; case 1: rgb->r = mid2; rgb->g = vV; rgb->b = min; break; case 2: rgb->r = min; rgb->g = vV; rgb->b = mid1; break; case 3: rgb->r = min; rgb->g = mid2; rgb->b = vV; break; case 4: rgb->r = mid1; rgb->g = min; rgb->b = vV; break; case 5: rgb->r = vV; rgb->g = min; rgb->b = mid2; break; } } void rgb2hsv(Color *rgb, Color *hsv) { #define cRGB (&rgb->r) int min, max; float dv; if(cRGB[0] < cRGB[1]) min = 0, max = 1; else min = 1, max = 0; if(cRGB[min] > cRGB[2]) min = 2; else if(cRGB[max] < cRGB[2]) max = 2; vV = cRGB[max]; dv = cRGB[max] - cRGB[min]; if(dv == 0) { vH = 0; /* hue undefined, use 0 */ vS = 0; } else { float dh = (cRGB[3 - max - min] - cRGB[min]) / (6*dv); vH = (3+max-min)%3==1 ? max/3.0 + dh : max/3.0 - dh; if(vH < 0) vH += 1 + (int)vH; if(vH > 1) vH -= (int)vH; vS = dv / cRGB[max]; } } geomview-1.9.4/src/lib/color/color.h0000644000175000001440000000300210455701000014211 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef COLORDEFS #define COLORDEFS typedef struct { float r, g, b; } Color; typedef struct { float r, g, b, a; } ColorA; extern void CoPrint(Color *c); extern void CoCopy(Color *c0, Color *c1); extern void CoACopy(ColorA *c0, ColorA *c1); extern void CoFrom(Color *c, float r, float g, float b); extern void CoAdd(Color *c0, Color *c1, Color *c2); extern void CoSub(Color *c0, Color *c1, Color *c2); extern void CoFilter(Color *c0, Color *c1, Color *c2); extern void hsv2rgb(Color *hsv, Color *rgb); extern void rgb2hsv(Color *rgb, Color *hsv); #endif geomview-1.9.4/src/lib/color/mergeover.c0000644000175000001440000000315210461140703015073 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void MergeOver( f, b, t ) ColorA *f, *b, *t; { float a = 1.0 - f->a; t->r = f->r + a * b->r; t->g = f->g + a * b->g; t->b = f->b + a * b->b; t->a = f->a + a * b->a; } void MergeOverN( f, b, t, n ) ColorA *f, *b, *t; int n; { float a; while( n-- ) { a = 1.0 - f->a; t->r = f->r + a * b->r; t->g = f->g + a * b->g; t->b = f->b + a * b->b; t->a = f->a + a * b->a; f++; b++; t++; } } geomview-1.9.4/src/lib/color/mergeplus.c0000644000175000001440000000300610455701000015075 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void MergePlus( ColorA *f,ColorA *b, ColorA *t ) { t->r = f->r + b->r; t->g = f->g + b->g; t->b = f->b + b->b; t->a = f->a + b->a; } void MergePlusN( ColorA *f,ColorA * b,ColorA * t, int n ) { while( n-- ) { t->r = f->r + b->r; t->g = f->g + b->g; t->b = f->b + b->b; t->a = f->a + b->a; f++; b++; t++; } } geomview-1.9.4/src/lib/color/paintcopy.c0000644000175000001440000000326610461140703015114 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void PaintCopy( f, b, t, m ) ColorA *f, *b, *t; float *m; { float a = 1.0 - *m; t->r = *m * f->r + a * b->r; t->g = *m * f->g + a * b->g; t->b = *m * f->b + a * b->b; t->a = *m * f->a + a * b->a; } void PaintCopyN( f, b, t, m, n ) ColorA *f, *b, *t; float *m; int n; { float a; while( n-- ) { a = 1.0 - *m; t->r = *m * f->r + a * b->r; t->g = *m * f->g + a * b->g; t->b = *m * f->b + a * b->b; t->a = *m * f->a + a * b->a; f++; b++; t++; m++; } } geomview-1.9.4/src/lib/color/mergeunder.c0000644000175000001440000000315410461140703015237 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void MergeUnder( f, b, t ) ColorA *f, *b, *t; { float a = 1.0 - b->a; t->r = a * f->r + b->r; t->g = a * f->g + b->g; t->b = a * f->b + b->b; t->a = a * f->a + b->a; } void MergeUnderN( f, b, t, n ) ColorA *f, *b, *t; int n; { float a; while( n-- ) { a = 1.0 - b->a; t->r = a * f->r + b->r; t->g = a * f->g + b->g; t->b = a * f->b + b->b; t->a = a * f->a + b->a; f++; b++; t++; } } geomview-1.9.4/src/lib/color/paintover.c0000644000175000001440000000330410461140703015106 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void PaintOver( f, b, t, m ) ColorA *f, *b, *t; float *m; { float a = 1.0 - *m * f->a; t->r = *m * f->r + a * b->r; t->g = *m * f->g + a * b->g; t->b = *m * f->b + a * b->b; t->a = *m * f->a + a * b->a; } void PaintOverN( f, b, t, m, n ) ColorA *f, *b, *t; float *m; int n; { float a; while( n-- ) { a = 1.0 - *m * f->a; t->r = *m * f->r + a * b->r; t->g = *m * f->g + a * b->g; t->b = *m * f->b + a * b->b; t->a = *m * f->a + a * b->a; f++; b++; t++; m++; } } geomview-1.9.4/src/lib/color/merge.h0000644000175000001440000000244110455701000014200 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MERGEDEFS #define MERGEDEFS #include "color.h" extern void MergePlus(), MergePlusN(); extern void MergeIn(), MergeInN(); extern void MergeOut(), MergeOutN(); extern void MergeOver(), MergeOverN(); extern void MergeUnder(), MergeUnderN(); extern void PaintCopy(), PaintCopyN(); extern void PaintOver(), PaintOverN(); #endif geomview-1.9.4/src/lib/color/Makefile.am0000644000175000001440000000034310455665330015002 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcolor.la libcolor_la_SOURCES = \ color.c mergein.c mergeout.c mergeover.c mergeplus.c mergeunder.c paintcopy.c paintover.c \ color.h merge.h geomview-1.9.4/src/lib/color/Makefile.in0000644000175000001440000003653710665240500015020 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/color DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcolor_la_LIBADD = am_libcolor_la_OBJECTS = color.lo mergein.lo mergeout.lo mergeover.lo \ mergeplus.lo mergeunder.lo paintcopy.lo paintover.lo libcolor_la_OBJECTS = $(am_libcolor_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libcolor_la_SOURCES) DIST_SOURCES = $(libcolor_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcolor.la libcolor_la_SOURCES = \ color.c mergein.c mergeout.c mergeover.c mergeplus.c mergeunder.c paintcopy.c paintover.c \ color.h merge.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/color/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/color/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libcolor.la: $(libcolor_la_OBJECTS) $(libcolor_la_DEPENDENCIES) $(LINK) $(libcolor_la_OBJECTS) $(libcolor_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/color.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mergein.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mergeout.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mergeover.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mergeplus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mergeunder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paintcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paintover.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/color/mergein.c0000644000175000001440000000304310461140703014525 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void MergeIn( ColorA *f, ColorA *b,ColorA * t ) { float a = b->a; t->r = a * f->r; t->g = a * f->g; t->b = a * f->b; t->a = a * f->a; } void MergeInN( ColorA *f,ColorA * b,ColorA * t,int n ) { float a; while( n-- ) { a = b->a; t->r = a * f->r; t->g = a * f->g; t->b = a * f->b; t->a = a * f->a; f++; b++; t++; } } geomview-1.9.4/src/lib/color/mergeout.c0000644000175000001440000000306710461140703014734 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "color.h" void MergeOut( f, b, t ) ColorA *f, *b, *t; { float a = 1.0 - b->a; t->r = a * f->r; t->g = a * f->g; t->b = a * f->b; t->a = a * f->a; } void MergeOutN( f, b, t, n ) ColorA *f, *b, *t; int n; { float a; while( n-- ) { a = 1.0 - b->a; t->r = a * f->r; t->g = a * f->g; t->b = a * f->b; t->a = a * f->a; f++; b++; t++; } } geomview-1.9.4/src/lib/color/Headers0000644000175000001440000000002007730236277014242 00000000000000color.h merge.h geomview-1.9.4/src/lib/fexpr/0000777000175000001440000000000010665240675013044 500000000000000geomview-1.9.4/src/lib/fexpr/monfuncs.c0000644000175000001440000000237210455701000014735 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "fexpr.h" #include #include #include struct expr_monfunc expr_monfuncs[]= { DEFAULT_EXPR_MONFUNCS, {NULL, NULL, NULL} }; geomview-1.9.4/src/lib/fexpr/parse.tab.c-saved0000644000175000001440000007753410454402420016103 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* A Bison parser, made from ../parse.y with Bison version GNU Bison version 1.24 */ #define YYBISON 1 /* Identify Bison output. */ #define IDENT 258 #define NUMBER 259 #define MINUS 260 #line 1 "../parse.y" #include "fexpr.h" #include #include #include #include extern void fparse_yyerror(char *); extern int fparse_yyparse(); extern int fparse_yyrestart(void *); extern void expr_lex_reset_input(char *buf); extern int fparse_yylex(void); #define YYDEBUG 1 struct expr_tree { struct expr_elem elem; struct expr_tree *sub1; struct expr_tree *sub2; }; struct expr_tree *expr_parsed; struct expression *expr_current; static struct expr_parse_free { void *dat; struct expr_parse_free *next; } *freers = NULL; static void expr_free_dat(void *dat) { struct expr_parse_free *f; f=malloc(sizeof(struct expr_parse_free)); f->next=freers; freers=f; f->dat = dat; } static void expr_free_freers() { struct expr_parse_free *f, *next=NULL; for (f=freers; f; f=next) { next = f->next; free(f->dat); free(f); } freers = NULL; } static void expr_free_freers_no_dat() { struct expr_parse_free *f, *next=NULL; for (f=freers; f; f=next) { next = f->next; free(f); } freers = NULL; } static int count_nodes(struct expr_tree *e) { if (!e) return 0; return count_nodes(e->sub1) + count_nodes(e->sub2) + 1; } static void store_nodes(struct expr_tree *e, int *pos) { if (!e) return; store_nodes(e->sub2, pos); store_nodes(e->sub1, pos); expr_current->elems[*pos] = e->elem; (*pos)++; } static char *error_return; char *expr_parse(struct expression *expr, char *str) { int i; error_return = NULL; expr_current = expr; if (!str || !*str) return "Empty expression"; expr_lex_reset_input(str); i = fparse_yyparse(); /* do all the work. */ fparse_yyrestart(NULL); /* clean up so we can do this again. */ if (i) { expr_free_freers(); return "Parse error"; } if (error_return) { expr_free_freers(); return error_return; } expr_free_freers_no_dat(); /* ok. now we convert the parsed expression to a execution vector. whee. */ expr->nelem = count_nodes(expr_parsed); expr->elems = malloc (expr->nelem * sizeof (struct expr_elem)); /* we let i be a counter variable for where we're writing in * the vectorized expression. */ i = 0; store_nodes(expr_parsed, &i); return NULL; } static struct expr_monfunc lookup_monfunc(char *s) { struct expr_monfunc *i; static struct expr_monfunc fail = { NULL, NULL, NULL }; for (i=expr_monfuncs; i->name; i++) if (!strcmp(i->name,s)) return *i; { static char buf[1024]; sprintf(buf,"Undefined unary function: %s",s); error_return = buf; } return fail; } static struct expr_binfunc lookup_binfunc(char *s) { struct expr_binfunc *i; static struct expr_binfunc fail = { NULL, NULL, NULL }; for (i=expr_binfuncs; i->name; i++) if (!strcmp(i->name,s)) return *i; { static char buf[1024]; sprintf(buf,"Undefined binary function: %s",s); error_return = buf; } return fail; } static struct expr_tree *expr_parse_monop(int opr, struct expr_tree *sub) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = MONOP; op->elem.u.monop.op = opr; op->sub1 = sub; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_binop(int opr, struct expr_tree *sub1, struct expr_tree *sub2) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = BINOP; op->elem.u.binop.op = opr; op->sub1 = sub1; op->sub2 = sub2; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_monfunc(struct expr_monfunc f, struct expr_tree *sub1) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = MONFUNC; op->elem.u.monfunc.func = f.func; op->elem.u.monfunc.cfunc = f.cfunc; op->sub1 = sub1; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_binfunc(struct expr_binfunc f, struct expr_tree *sub1, struct expr_tree *sub2) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = BINFUNC; op->elem.u.binfunc.func = f.func; op->elem.u.binfunc.cfunc = f.cfunc; op->sub1 = sub1; op->sub2 = sub2; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_var(char *s) { struct expr_tree *op; int i=0; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.u.pushvar.varnum = -1; op->elem.op = PUSHVAR; for (i=0; invars; i++) if (!strcmp(expr_current->varnames[i], s)) op->elem.u.pushvar.varnum = i; if (op->elem.u.pushvar.varnum == -1) { static char buf[1024]; sprintf(buf,"Undefined variable: %s", s); error_return = buf; } expr_free_dat(op); return op; } static struct expr_tree *expr_parse_num(double d) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = PUSHNUM; op->elem.u.pushnum.number = d; expr_free_dat(op); return op; } void fparse_yyerror(char *errorstr) { error_return = errorstr; } #line 246 "../parse.y" typedef union { char *string; struct expr_tree *expression; double number; } YYSTYPE; #ifndef YYLTYPE typedef struct fparse_yyltype { int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; } fparse_yyltype; #define YYLTYPE fparse_yyltype #endif #include #ifndef __cplusplus #ifndef __STDC__ #define const #endif #endif #define YYFINAL 25 #define YYFLAG -32768 #define YYNTBASE 13 #define YYTRANSLATE(x) ((unsigned)(x) <= 260 ? fparse_yytranslate[x] : 15) static const char fparse_yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, 9, 5, 12, 6, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 7 }; #if YYDEBUG != 0 static const short fparse_yyprhs[] = { 0, 0, 2, 6, 10, 14, 18, 22, 25, 30, 37, 39 }; static const short fparse_yyrhs[] = { 14, 0, 10, 14, 11, 0, 14, 5, 14, 0, 14, 6, 14, 0, 14, 9, 14, 0, 14, 8, 14, 0, 6, 14, 0, 3, 10, 14, 11, 0, 3, 10, 14, 12, 14, 11, 0, 3, 0, 4, 0 }; #endif #if YYDEBUG != 0 static const short fparse_yyrline[] = { 0, 263, 265, 267, 268, 269, 270, 271, 272, 273, 274, 275 }; static const char * const fparse_yytname[] = { "$","error","$undefined.","IDENT", "NUMBER","'+'","'-'","MINUS","'/'","'*'","'('","')'","','","totexpression","expr", "" }; #endif static const short fparse_yyr1[] = { 0, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14 }; static const short fparse_yyr2[] = { 0, 1, 3, 3, 3, 3, 3, 2, 4, 6, 1, 1 }; static const short fparse_yydefact[] = { 0, 10, 11, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 2, 3, 4, 6, 5, 8, 0, 0, 9, 0, 0, 0 }; static const short fparse_yydefgoto[] = { 23, 5 }; static const short fparse_yypact[] = { 17, -8,-32768, 17, 17, 34, 17, -4, 20, 17, 17, 17, 17, 7,-32768, -4, -4,-32768,-32768,-32768, 17, 27,-32768, 10, 11,-32768 }; static const short fparse_yypgoto[] = {-32768, -3 }; #define YYLAST 43 static const short fparse_yytable[] = { 7, 8, 6, 13, 11, 12, 15, 16, 17, 18, 24, 25, 9, 10, 0, 11, 12, 21, 19, 20, 1, 2, 0, 3, 0, 9, 10, 4, 11, 12, 0, 14, 9, 10, 0, 11, 12, 0, 22, 9, 10, 0, 11, 12 }; static const short fparse_yycheck[] = { 3, 4, 10, 6, 8, 9, 9, 10, 11, 12, 0, 0, 5, 6, -1, 8, 9, 20, 11, 12, 3, 4, -1, 6, -1, 5, 6, 10, 8, 9, -1, 11, 5, 6, -1, 8, 9, -1, 11, 5, 6, -1, 8, 9 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/local/lib/bison.simple" /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ #ifndef alloca #ifdef __GNUC__ #define alloca __builtin_alloca #else /* not GNU C. */ #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) #include #else /* not sparc */ #if defined (MSDOS) && !defined (__TURBOC__) #include #else /* not MSDOS, or __TURBOC__ */ #if defined(_AIX) #include #pragma alloca #else /* not MSDOS, __TURBOC__, or _AIX */ #ifdef __hpux #ifdef __cplusplus extern "C" { void *alloca (unsigned int); }; #else /* not __cplusplus */ void *alloca (); #endif /* not __cplusplus */ #endif /* __hpux */ #endif /* not _AIX */ #endif /* not MSDOS, or __TURBOC__ */ #endif /* not sparc. */ #endif /* not GNU C. */ #endif /* alloca not defined. */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. It was written by Richard Stallman by simplifying the hairy parser used when %semantic_parser is specified. */ /* Note: there must be only one dollar sign in this file. It is replaced by the list of actions, each action as one case of the switch. */ #define fparse_yyerrok (fparse_yyerrstatus = 0) #define fparse_yyclearin (fparse_yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 #define YYACCEPT return(0) #define YYABORT return(1) #define YYERROR goto fparse_yyerrlab1 /* Like YYERROR except do call fparse_yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto fparse_yyerrlab #define YYRECOVERING() (!!fparse_yyerrstatus) #define YYBACKUP(token, value) \ do \ if (fparse_yychar == YYEMPTY && fparse_yylen == 1) \ { fparse_yychar = (token), fparse_yylval = (value); \ fparse_yychar1 = YYTRANSLATE (fparse_yychar); \ YYPOPSTACK; \ goto fparse_yybackup; \ } \ else \ { fparse_yyerror ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 #ifndef YYPURE #define YYLEX fparse_yylex() #endif #ifdef YYPURE #ifdef YYLSP_NEEDED #ifdef YYLEX_PARAM #define YYLEX fparse_yylex(&fparse_yylval, &fparse_yylloc, YYLEX_PARAM) #else #define YYLEX fparse_yylex(&fparse_yylval, &fparse_yylloc) #endif #else /* not YYLSP_NEEDED */ #ifdef YYLEX_PARAM #define YYLEX fparse_yylex(&fparse_yylval, YYLEX_PARAM) #else #define YYLEX fparse_yylex(&fparse_yylval) #endif #endif /* not YYLSP_NEEDED */ #endif /* If nonreentrant, generate the variables here */ #ifndef YYPURE int fparse_yychar; /* the lookahead symbol */ YYSTYPE fparse_yylval; /* the semantic value of the */ /* lookahead symbol */ #ifdef YYLSP_NEEDED YYLTYPE fparse_yylloc; /* location data for the lookahead */ /* symbol */ #endif int fparse_yynerrs; /* number of parse errors so far */ #endif /* not YYPURE */ #if YYDEBUG != 0 int fparse_yydebug; /* nonzero means print parse trace */ /* Since this is uninitialized, it does not stop multiple parsers from coexisting. */ #endif /* YYINITDEPTH indicates the initial size of the parser's stacks */ #ifndef YYINITDEPTH #define YYINITDEPTH 200 #endif /* YYMAXDEPTH is the maximum size the stacks can grow to (effective only if the built-in stack extension method is used). */ #if YYMAXDEPTH == 0 #undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH #define YYMAXDEPTH 10000 #endif /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ int fparse_yyparse (void); #endif #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #define __fparse_yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) #else /* not GNU C or C++ */ #ifndef __cplusplus /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ static void __fparse_yy_memcpy (from, to, count) char *from; char *to; int count; { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #else /* __cplusplus */ /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ static void __fparse_yy_memcpy (char *from, char *to, int count) { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #endif #endif #line 192 "/usr/local/lib/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into fparse_yyparse. The argument should have type void *. It should actually point to an object. Grammar actions can access the variable by casting it to the proper pointer type. */ #ifdef YYPARSE_PARAM #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; #else #define YYPARSE_PARAM #define YYPARSE_PARAM_DECL #endif int fparse_yyparse(YYPARSE_PARAM) YYPARSE_PARAM_DECL { register int fparse_yystate; register int fparse_yyn; register short *fparse_yyssp; register YYSTYPE *fparse_yyvsp; int fparse_yyerrstatus; /* number of tokens to shift before error messages enabled */ int fparse_yychar1 = 0; /* lookahead token as an internal (translated) token number */ short fparse_yyssa[YYINITDEPTH]; /* the state stack */ YYSTYPE fparse_yyvsa[YYINITDEPTH]; /* the semantic value stack */ short *fparse_yyss = fparse_yyssa; /* refer to the stacks thru separate pointers */ YYSTYPE *fparse_yyvs = fparse_yyvsa; /* to allow fparse_yyoverflow to reallocate them elsewhere */ #ifdef YYLSP_NEEDED YYLTYPE fparse_yylsa[YYINITDEPTH]; /* the location stack */ YYLTYPE *fparse_yyls = fparse_yylsa; YYLTYPE *fparse_yylsp; #define YYPOPSTACK (fparse_yyvsp--, fparse_yyssp--, fparse_yylsp--) #else #define YYPOPSTACK (fparse_yyvsp--, fparse_yyssp--) #endif int fparse_yystacksize = YYINITDEPTH; #ifdef YYPURE int fparse_yychar; YYSTYPE fparse_yylval; int fparse_yynerrs; #ifdef YYLSP_NEEDED YYLTYPE fparse_yylloc; #endif #endif YYSTYPE fparse_yyval; /* the variable used to return */ /* semantic values from the action */ /* routines */ int fparse_yylen; #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Starting parse\n"); #endif fparse_yystate = 0; fparse_yyerrstatus = 0; fparse_yynerrs = 0; fparse_yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ fparse_yyssp = fparse_yyss - 1; fparse_yyvsp = fparse_yyvs; #ifdef YYLSP_NEEDED fparse_yylsp = fparse_yyls; #endif /* Push a new state, which is found in fparse_yystate . */ /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ fparse_yynewstate: *++fparse_yyssp = fparse_yystate; if (fparse_yyssp >= fparse_yyss + fparse_yystacksize - 1) { /* Give user a chance to reallocate the stack */ /* Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *fparse_yyvs1 = fparse_yyvs; short *fparse_yyss1 = fparse_yyss; #ifdef YYLSP_NEEDED YYLTYPE *fparse_yyls1 = fparse_yyls; #endif /* Get the current used size of the three stacks, in elements. */ int size = fparse_yyssp - fparse_yyss + 1; #ifdef fparse_yyoverflow /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. */ #ifdef YYLSP_NEEDED /* This used to be a conditional around just the two extra args, but that might be undefined if fparse_yyoverflow is a macro. */ fparse_yyoverflow("parser stack overflow", &fparse_yyss1, size * sizeof (*fparse_yyssp), &fparse_yyvs1, size * sizeof (*fparse_yyvsp), &fparse_yyls1, size * sizeof (*fparse_yylsp), &fparse_yystacksize); #else fparse_yyoverflow("parser stack overflow", &fparse_yyss1, size * sizeof (*fparse_yyssp), &fparse_yyvs1, size * sizeof (*fparse_yyvsp), &fparse_yystacksize); #endif fparse_yyss = fparse_yyss1; fparse_yyvs = fparse_yyvs1; #ifdef YYLSP_NEEDED fparse_yyls = fparse_yyls1; #endif #else /* no fparse_yyoverflow */ /* Extend the stack our own way. */ if (fparse_yystacksize >= YYMAXDEPTH) { fparse_yyerror("parser stack overflow"); return 2; } fparse_yystacksize *= 2; if (fparse_yystacksize > YYMAXDEPTH) fparse_yystacksize = YYMAXDEPTH; fparse_yyss = (short *) alloca (fparse_yystacksize * sizeof (*fparse_yyssp)); __fparse_yy_memcpy ((char *)fparse_yyss1, (char *)fparse_yyss, size * sizeof (*fparse_yyssp)); fparse_yyvs = (YYSTYPE *) alloca (fparse_yystacksize * sizeof (*fparse_yyvsp)); __fparse_yy_memcpy ((char *)fparse_yyvs1, (char *)fparse_yyvs, size * sizeof (*fparse_yyvsp)); #ifdef YYLSP_NEEDED fparse_yyls = (YYLTYPE *) alloca (fparse_yystacksize * sizeof (*fparse_yylsp)); __fparse_yy_memcpy ((char *)fparse_yyls1, (char *)fparse_yyls, size * sizeof (*fparse_yylsp)); #endif #endif /* no fparse_yyoverflow */ fparse_yyssp = fparse_yyss + size - 1; fparse_yyvsp = fparse_yyvs + size - 1; #ifdef YYLSP_NEEDED fparse_yylsp = fparse_yyls + size - 1; #endif #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Stack size increased to %d\n", fparse_yystacksize); #endif if (fparse_yyssp >= fparse_yyss + fparse_yystacksize - 1) YYABORT; } #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Entering state %d\n", fparse_yystate); #endif goto fparse_yybackup; fparse_yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* fparse_yyresume: */ /* First try to decide what to do without reference to lookahead token. */ fparse_yyn = fparse_yypact[fparse_yystate]; if (fparse_yyn == YYFLAG) goto fparse_yydefault; /* Not known => get a lookahead token if don't already have one. */ /* fparse_yychar is either YYEMPTY or YYEOF or a valid token in external form. */ if (fparse_yychar == YYEMPTY) { #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Reading a token: "); #endif fparse_yychar = YYLEX; } /* Convert token to internal form (in fparse_yychar1) for indexing tables with */ if (fparse_yychar <= 0) /* This means end of input. */ { fparse_yychar1 = 0; fparse_yychar = YYEOF; /* Don't call YYLEX any more */ #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Now at end of input.\n"); #endif } else { fparse_yychar1 = YYTRANSLATE(fparse_yychar); #if YYDEBUG != 0 if (fparse_yydebug) { fprintf (stderr, "Next token is %d (%s", fparse_yychar, fparse_yytname[fparse_yychar1]); /* Give the individual parser a way to print the precise meaning of a token, for further debugging info. */ #ifdef YYPRINT YYPRINT (stderr, fparse_yychar, fparse_yylval); #endif fprintf (stderr, ")\n"); } #endif } fparse_yyn += fparse_yychar1; if (fparse_yyn < 0 || fparse_yyn > YYLAST || fparse_yycheck[fparse_yyn] != fparse_yychar1) goto fparse_yydefault; fparse_yyn = fparse_yytable[fparse_yyn]; /* fparse_yyn is what to do for this token type in this state. Negative => reduce, -fparse_yyn is rule number. Positive => shift, fparse_yyn is new state. New state is final state => don't bother to shift, just return success. 0, or most negative number => error. */ if (fparse_yyn < 0) { if (fparse_yyn == YYFLAG) goto fparse_yyerrlab; fparse_yyn = -fparse_yyn; goto fparse_yyreduce; } else if (fparse_yyn == 0) goto fparse_yyerrlab; if (fparse_yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Shifting token %d (%s), ", fparse_yychar, fparse_yytname[fparse_yychar1]); #endif /* Discard the token being shifted unless it is eof. */ if (fparse_yychar != YYEOF) fparse_yychar = YYEMPTY; *++fparse_yyvsp = fparse_yylval; #ifdef YYLSP_NEEDED *++fparse_yylsp = fparse_yylloc; #endif /* count tokens shifted since error; after three, turn off error status. */ if (fparse_yyerrstatus) fparse_yyerrstatus--; fparse_yystate = fparse_yyn; goto fparse_yynewstate; /* Do the default action for the current state. */ fparse_yydefault: fparse_yyn = fparse_yydefact[fparse_yystate]; if (fparse_yyn == 0) goto fparse_yyerrlab; /* Do a reduction. fparse_yyn is the number of a rule to reduce with. */ fparse_yyreduce: fparse_yylen = fparse_yyr2[fparse_yyn]; if (fparse_yylen > 0) fparse_yyval = fparse_yyvsp[1-fparse_yylen]; /* implement default value of the action */ #if YYDEBUG != 0 if (fparse_yydebug) { int i; fprintf (stderr, "Reducing via rule %d (line %d), ", fparse_yyn, fparse_yyrline[fparse_yyn]); /* Print the symbols being reduced, and their result. */ for (i = fparse_yyprhs[fparse_yyn]; fparse_yyrhs[i] > 0; i++) fprintf (stderr, "%s ", fparse_yytname[fparse_yyrhs[i]]); fprintf (stderr, " -> %s\n", fparse_yytname[fparse_yyr1[fparse_yyn]]); } #endif switch (fparse_yyn) { case 1: #line 263 "../parse.y" { expr_parsed = fparse_yyvsp[0].expression; ; break;} case 2: #line 266 "../parse.y" { fparse_yyval.expression = fparse_yyvsp[-1].expression; ; break;} case 3: #line 267 "../parse.y" { fparse_yyval.expression = expr_parse_binop('+', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 4: #line 268 "../parse.y" { fparse_yyval.expression = expr_parse_binop('-', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 5: #line 269 "../parse.y" { fparse_yyval.expression = expr_parse_binop('*', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 6: #line 270 "../parse.y" { fparse_yyval.expression = expr_parse_binop('/', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 7: #line 271 "../parse.y" { fparse_yyval.expression = expr_parse_monop('-', fparse_yyvsp[0].expression); ; break;} case 8: #line 272 "../parse.y" { fparse_yyval.expression = expr_parse_monfunc(lookup_monfunc(fparse_yyvsp[-3].string), fparse_yyvsp[-1].expression); ; break;} case 9: #line 273 "../parse.y" { fparse_yyval.expression = expr_parse_binfunc(lookup_binfunc(fparse_yyvsp[-5].string), fparse_yyvsp[-3].expression, fparse_yyvsp[-1].expression); ; break;} case 10: #line 274 "../parse.y" { fparse_yyval.expression = expr_parse_var(fparse_yyvsp[0].string); ; break;} case 11: #line 275 "../parse.y" { fparse_yyval.expression = expr_parse_num(fparse_yyvsp[0].number); ; break;} } /* the action file gets copied in in place of this dollarsign */ #line 487 "/usr/local/lib/bison.simple" fparse_yyvsp -= fparse_yylen; fparse_yyssp -= fparse_yylen; #ifdef YYLSP_NEEDED fparse_yylsp -= fparse_yylen; #endif #if YYDEBUG != 0 if (fparse_yydebug) { short *ssp1 = fparse_yyss - 1; fprintf (stderr, "state stack now"); while (ssp1 != fparse_yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif *++fparse_yyvsp = fparse_yyval; #ifdef YYLSP_NEEDED fparse_yylsp++; if (fparse_yylen == 0) { fparse_yylsp->first_line = fparse_yylloc.first_line; fparse_yylsp->first_column = fparse_yylloc.first_column; fparse_yylsp->last_line = (fparse_yylsp-1)->last_line; fparse_yylsp->last_column = (fparse_yylsp-1)->last_column; fparse_yylsp->text = 0; } else { fparse_yylsp->last_line = (fparse_yylsp+fparse_yylen-1)->last_line; fparse_yylsp->last_column = (fparse_yylsp+fparse_yylen-1)->last_column; } #endif /* Now "shift" the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ fparse_yyn = fparse_yyr1[fparse_yyn]; fparse_yystate = fparse_yypgoto[fparse_yyn - YYNTBASE] + *fparse_yyssp; if (fparse_yystate >= 0 && fparse_yystate <= YYLAST && fparse_yycheck[fparse_yystate] == *fparse_yyssp) fparse_yystate = fparse_yytable[fparse_yystate]; else fparse_yystate = fparse_yydefgoto[fparse_yyn - YYNTBASE]; goto fparse_yynewstate; fparse_yyerrlab: /* here on detecting error */ if (! fparse_yyerrstatus) /* If not already recovering from an error, report this error. */ { ++fparse_yynerrs; #ifdef YYERROR_VERBOSE fparse_yyn = fparse_yypact[fparse_yystate]; if (fparse_yyn > YYFLAG && fparse_yyn < YYLAST) { int size = 0; char *msg; int x, count; count = 0; /* Start X at -fparse_yyn if nec to avoid negative indexes in fparse_yycheck. */ for (x = (fparse_yyn < 0 ? -fparse_yyn : 0); x < (sizeof(fparse_yytname) / sizeof(char *)); x++) if (fparse_yycheck[x + fparse_yyn] == x) size += strlen(fparse_yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); if (msg != 0) { strcpy(msg, "parse error"); if (count < 5) { count = 0; for (x = (fparse_yyn < 0 ? -fparse_yyn : 0); x < (sizeof(fparse_yytname) / sizeof(char *)); x++) if (fparse_yycheck[x + fparse_yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); strcat(msg, fparse_yytname[x]); strcat(msg, "'"); count++; } } fparse_yyerror(msg); free(msg); } else fparse_yyerror ("parse error; also virtual memory exceeded"); } else #endif /* YYERROR_VERBOSE */ fparse_yyerror("parse error"); } goto fparse_yyerrlab1; fparse_yyerrlab1: /* here on error raised explicitly by an action */ if (fparse_yyerrstatus == 3) { /* if just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (fparse_yychar == YYEOF) YYABORT; #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Discarding token %d (%s).\n", fparse_yychar, fparse_yytname[fparse_yychar1]); #endif fparse_yychar = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ fparse_yyerrstatus = 3; /* Each real token shifted decrements this */ goto fparse_yyerrhandle; fparse_yyerrdefault: /* current state does not do anything special for the error token. */ #if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ fparse_yyn = fparse_yydefact[fparse_yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ if (fparse_yyn) goto fparse_yydefault; #endif fparse_yyerrpop: /* pop the current state because it cannot handle the error token */ if (fparse_yyssp == fparse_yyss) YYABORT; fparse_yyvsp--; fparse_yystate = *--fparse_yyssp; #ifdef YYLSP_NEEDED fparse_yylsp--; #endif #if YYDEBUG != 0 if (fparse_yydebug) { short *ssp1 = fparse_yyss - 1; fprintf (stderr, "Error: state stack now"); while (ssp1 != fparse_yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif fparse_yyerrhandle: fparse_yyn = fparse_yypact[fparse_yystate]; if (fparse_yyn == YYFLAG) goto fparse_yyerrdefault; fparse_yyn += YYTERROR; if (fparse_yyn < 0 || fparse_yyn > YYLAST || fparse_yycheck[fparse_yyn] != YYTERROR) goto fparse_yyerrdefault; fparse_yyn = fparse_yytable[fparse_yyn]; if (fparse_yyn < 0) { if (fparse_yyn == YYFLAG) goto fparse_yyerrpop; fparse_yyn = -fparse_yyn; goto fparse_yyreduce; } else if (fparse_yyn == 0) goto fparse_yyerrpop; if (fparse_yyn == YYFINAL) YYACCEPT; #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Shifting error token, "); #endif *++fparse_yyvsp = fparse_yylval; #ifdef YYLSP_NEEDED *++fparse_yylsp = fparse_yylloc; #endif fparse_yystate = fparse_yyn; goto fparse_yynewstate; } #line 279 "../parse.y" /* more c */ geomview-1.9.4/src/lib/fexpr/fexprnew.h0000644000175000001440000001410310455701000014743 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* $Id: fexprnew.h,v 1.2 2000/09/01 22:38:09 mphillips Exp $ */ /* new fast expression library! wheee! */ #ifndef fexpr_h_included #define fexpr_h_included typedef enum { FNONE, FREAL, FCOMPLEX, FDERIV, FRDERIV } ftype; struct fexpression { struct fcode *code; struct ffunctable *funcs; ftype type; }; typedef struct { double real,imag; } fcomplex; struct fcode; /* forward reference */ typedef struct fvalue_struct fvalue; typedef struct { int nderivs; fvalue *values; } fjet; struct fvalue_struct { ftype type; union fval_union { fcomplex complex; double real; fjet deriv; } value; }; typedef struct { struct { double (*real)(int nargs, double *args, void *); void *data; } r; struct { void (*complex)(int nargs, fcomplex *args, fcomplex *op, void *); void *data; } c; struct { void (*deriv)(int nargs, fjet *args, fjet *op, void *data); void *data; } d; } fevalfunc; struct ffuncstruct { char *name; fevalfunc function; int nargs; }; #if 0 struct ffunctableent { char *name; fevalfunc function; int nargs; /* negative if we don't * care. otherwise, the only numbers * of arguments this will take. 0 * means probably is just a constant * variable. */ }; #endif #if 0 struct ffunctiontableent { char *name; ftype type; void *function; int nargs; }; #endif struct fcode { int ninsts; struct finst { enum { FIFUNC, FINUMBER } type; union { struct { int nargs; struct ffuncstruct ent; /* functions are null if they haven't been linked. */ } func; fvalue number; } u; } *insts; }; struct ffunctable { int nents; struct ffuncstruct *ents; struct ffunctable *next; }; #if 0 typedef struct ffunctiontableent ffunctiontable[]; #endif /* functions */ /* operates on a whole bundle -- for simple users */ extern struct fexpression *fnew_expr(ftype); extern char *fexpr_parse(struct fexpression *, char *); extern fvalue *fexpr_getvar(struct fexpression *, char *name); extern void fexpr_evaluate(struct fexpression *, fvalue *op); extern void fexpr_free(struct fexpression *); extern void fexpr_cleanup(void); /* run at end of program */ /* code functions */ extern struct fcode *fnew_code(void); extern char *fcode_parse(struct fcode *, char *); extern int fcode_link(struct fcode *, struct ffunctable *, ftype); extern void fcode_run(struct fcode *, ftype, fvalue *op, ...); extern void fcode_free(struct fcode *); extern void fapplyv(struct ffuncstruct *, ftype, fvalue *op, int nargs, ...); extern void fapply(struct ffuncstruct *, ftype, int nargs, fvalue *args, fvalue *op); /* func functions */ extern struct ffunctable *fnew_func(void); extern struct ffunctable *fnew_func_with_defaults(void); extern fvalue *ffunc_getvar(struct ffunctable *, char *, ftype); extern struct ffuncstruct *ffunc_findfunc(struct ffunctable *, char *, ftype, int); extern void ffunc_free(struct ffunctable *); extern struct ffuncstruct *ffunc_create(struct ffunctable *, char *, fevalfunc, int); extern void ffunc_free_builtins(void); /* value functions */ extern void fvalue_free(fvalue *); extern void fvalue_free_parts(fvalue *); extern void fvalue_from_double(fvalue *,ftype,double); extern int fvalue_iszero(fvalue *); extern int fvalue_isone(fvalue *); #ifdef EOF extern void fvalue_print(FILE *,fvalue *); #endif /* miscelaneous other things */ extern fvalue *fderiv_variable; /* default functions and constants */ extern struct ffunctable *fbuiltins; extern void fbuiltins_build(); /* internal stuff */ extern char *fparse_code_internal(struct fcode *, char *); extern void fparse_set_string(char *); extern int fparse_yyparse(void); extern void fparse_yyerror(char *); extern int fparse_yylex(void); #ifdef MNEM extern void fparse_free_dat_int(int, void *, int); #else extern void fparse_free_dat(void *, int); #endif /* external stuff. user defines this, if e wants to change it. default * is to just print on stderr. */ extern void fexpr_error(char *); #define FBUF_SIZE 1024 #if defined (FCOMPAT) /* compatibility stuff. don't use this, as it might be removed soon. */ struct expression { ftype type; struct fcode *code; struct ffunctable *funcs; }; typedef char *expr_var; /* just the name */ extern struct expression *expr_new(ftype type); extern void expr_free(struct expression *); extern char *expr_parse(struct expression *expr, char *e); extern double expr_evaluate(struct expression *e); extern void expr_evaluate_some(struct expression *e, expr_var v, double min, double max, int npoints, double *buffer); extern void expr_evaluate_complex(struct expression *e, fcomplex *op); extern expr_var expr_create_variable(struct expression *e, char *name, double val); extern void expr_set_variable(struct expression *e, expr_var v, double val); extern void expr_set_variable_complex(struct expression *e, expr_var v, fcomplex *val); extern double expr_get_variable(struct expression *e, expr_var v); extern void expr_get_variable_complex(struct expression *e, expr_var v, fcomplex *op); extern void expr_copy_variables(struct expression *source, struct expression *dest); #endif /* fcompat */ #endif /* fexpr_h_included */ geomview-1.9.4/src/lib/fexpr/complex.c0000644000175000001440000002072710455701000014560 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "fexpr.h" #ifndef M_E #define M_E 2.71828182845904 #endif void fcomplex_re(fcomplex *s,fcomplex *op) { op->real = s->real; op->imag = 0; } void fcomplex_im(fcomplex *s,fcomplex *op) { op->real = 0; op->imag = s->imag; } void fcomplex_abs(fcomplex *s,fcomplex *op) { op->imag = 0; op->real = sqrt(s->real*s->real+s->imag*s->imag); } void fcomplex_log(fcomplex *s,fcomplex *op) { /* e^(a + bi)= e^a(cos b+i sin b). b is argument of s, e^a is abs of s. */ op->real = log(s->real*s->real+s->imag*s->imag)/2; /* log(sqrt(..)) */ op->imag = atan2(s->imag,s->real); } void fcomplex_log10(fcomplex *s,fcomplex *op) { /* log10(z) = log(z)/log(10) */ fcomplex_log(s,op); #ifndef M_LN10 #define M_LN10 log(10); #endif op->real /= M_LN10; op->imag /= M_LN10; } void fcomplex_sqrt(fcomplex *s,fcomplex *op) { fcomplex tmp; tmp.real = 0.5; tmp.imag = 0; fcomplex_pow(s,&tmp,op); } void fcomplex_exp(fcomplex *s,fcomplex *op) { fcomplex tmp; tmp.real = M_E; tmp.imag = 0; fcomplex_pow(&tmp,s,op); } void fcomplex_cos(fcomplex *s,fcomplex *op) { /* cos(a+bi) = cos(a)cos(bi) - sin(a)sin(bi) = cos(a)cosh(b) - i sin(a)sinh(b) */ op->real = cos(s->real) * cosh(s->imag); op->imag = - sin(s->real) * sinh(s->imag); } void fcomplex_arccos(fcomplex *s,fcomplex *op) { /* if w = cos z, z = -i*ln(w+sqrt(w*w-1)) */ fcomplex tmp1,tmp2; /* tmp1 = w*w-1 */ tmp1.real = s->real*s->real-s->imag*s->imag - 1; tmp1.imag = s->real*s->imag; /* tmp2 = sqrt(tmp1); */ fcomplex_sqrt(&tmp1,&tmp2); /* tmp2 += w */ tmp2.real += s->real; tmp2.imag += s->imag; /* tmp1 = ln(tmp2); */ fcomplex_log(&tmp2,&tmp1); /* op = -i*tmp1 */ op->imag = -tmp1.real; op->real = tmp1.imag; } void fcomplex_sin(fcomplex *s,fcomplex *op) { /* sin(a+bi) = sin(a)cos(bi) + sin(bi)cos(a) = sin(a)cosh(b) + isinh(b)cos(a) */ op->real = sin(s->real)*cosh(s->imag); op->imag = cos(s->real)*sinh(s->imag); } void fcomplex_arcsin(fcomplex *s,fcomplex *op) { /* if w = sin z, z = -i*ln(i*w+sqrt(i*(w*w-1))) */ fcomplex tmp1, tmp2; /* tmp1 = i*(w*w-1) */ tmp1.real = -s->real*s->imag; tmp1.imag = s->real*s->real-s->imag*s->imag-1; /* tmp2 = sqrt(tmp1); */ fcomplex_sqrt(&tmp1,&tmp2); /* tmp2 += i*w; */ tmp2.real -= s->imag; tmp2.imag += s->real; /* tmp1 = ln(tmp2); */ fcomplex_log(&tmp2,&tmp1); /* op = -i*tmp1 */ op->imag = -tmp1.real; op->real = tmp1.imag; } void fcomplex_tan(fcomplex *s,fcomplex *op) { /* tan a+bi= Sin[2a]/(Cos[2a]+Cosh[2b]) + i*Sinh[2b]/(Cos[2a]+Cosh[2b]) */ /* or so says mathematica(probably a registered trademark of wolfram) */ op->real = sin(s->real*2)/(cos(s->real*2)+cosh(s->imag*2)); op->imag = sinh(s->imag*2)/(cos(s->real*2)+cosh(s->imag*2)); } void fcomplex_arctan(fcomplex *s,fcomplex *op) { /* if w = tan z, z = i ln(1-iw)/2 */ fcomplex tmp1,tmp2; /* tmp1 = 1-iw */ tmp1.real = 1+s->imag; tmp1.imag = -s->real; /* tmp2 = ln(tmp1); */ fcomplex_log(&tmp2, &tmp1); /* op = i*tmp2/2 */ op->real = -tmp2.imag/2; op->imag = tmp2.real/2; } void fcomplex_cot(fcomplex *s,fcomplex *op) { /* cot = 1 / tan */ fcomplex tmp1; /* tmp1 = tan s */ fcomplex_tan(s,&tmp1); /* op = 1/tmp1 */ op->real = tmp1.real/(tmp1.real*tmp1.real+tmp1.imag*tmp1.imag); op->imag = -tmp1.imag/(tmp1.real*tmp1.real+tmp1.imag*tmp1.imag); } void fcomplex_sec(fcomplex *s,fcomplex *op) { fcomplex tmp1; fcomplex_cos(s,&tmp1); op->real = tmp1.real/(tmp1.real*tmp1.real+tmp1.imag*tmp1.imag); op->imag = -tmp1.imag/(tmp1.real*tmp1.real+tmp1.imag*tmp1.imag); } void fcomplex_csc(fcomplex *s,fcomplex *op) { fcomplex tmp1; fcomplex_sin(s,&tmp1); op->real = tmp1.real/(tmp1.real*tmp1.real+tmp1.imag*tmp1.imag); op->imag = -tmp1.imag/(tmp1.real*tmp1.real+tmp1.imag*tmp1.imag); } void fcomplex_cosh(fcomplex *s,fcomplex *op) { /* cosh[a + b i] = cos[b - ai] */ fcomplex tmp1; tmp1.real = s->imag; tmp1.imag = -s->real; fcomplex_cos(&tmp1,op); } void fcomplex_sinh(fcomplex *s,fcomplex *op) { /* sinh [a + b i] = i * sin[ b - a i] */ fcomplex tmp1,tmp2; tmp1.real = s->imag; tmp1.imag = -s->real; fcomplex_sin(&tmp1, &tmp2); op->real = -tmp2.imag; op->imag = tmp2.real; } void fcomplex_tanh(fcomplex *s,fcomplex *op) { /* tanh[a+bi] = i*tan[b - a i] */ fcomplex tmp1,tmp2; tmp1.real = s->imag; tmp1.imag = -s->real; fcomplex_tan(&tmp1,&tmp2); op->real = -tmp2.imag; op->imag = tmp2.real; } void fcomplex_arccosh(fcomplex *s,fcomplex *op) { /* z=cos[iw]=cosh[w] arccosh[z] = w = arccos[z]/i arccosh[z] = arccos[z]/i */ fcomplex tmp1; fcomplex_arccos(s, &tmp1); op->real = tmp1.imag; op->imag = -tmp1.real; } void fcomplex_arcsinh(fcomplex *s,fcomplex *op) { /* zi=sin[iw]=isinh[w] arcsinh[z] = w = arcsin[zi]/i arcsinh[z] = arcsin[zi]/i */ fcomplex tmp1,tmp2; /* tmp1 = i*z */ tmp1.real = -s->imag; tmp1.imag = s->real; fcomplex_arcsin(&tmp1,&tmp2); /* op = tmp2/i */ tmp2.real = tmp1.imag; tmp2.imag = -tmp1.real; } void fcomplex_arctanh(fcomplex *s,fcomplex *op) { /* works same as arcsinh.. */ fcomplex tmp1,tmp2; /* tmp1 = i*z */ tmp1.real = -s->imag; tmp1.imag = s->real; fcomplex_arctan(&tmp1,&tmp2); /* op = tmp2/i */ tmp2.real = tmp1.imag; tmp2.imag = -tmp1.real; } void fcomplex_floor(fcomplex *s,fcomplex *op) { /* just floor the components, i guess... */ op->real = floor(s->real); op->imag = floor(s->imag); } void fcomplex_round(fcomplex *s,fcomplex *op) { op->real = rint(s->real); op->imag = rint(s->imag); } void fcomplex_ceiling(fcomplex *s,fcomplex *op) { op->real = ceil(s->real); op->imag = ceil(s->imag); } void fcomplex_pow(fcomplex *base,fcomplex *exponent,fcomplex*op) { double Abs, Arg; double c=exponent->real,d=exponent->imag; Abs = base->imag*base->imag + base->real*base->real; Arg = atan2(base->imag,base->real); if (Abs==0) { /* if we don't do this, then the log(Abs) below returns * NaN, and throws everything off. */ op->real = op->imag = 0; } else { op->real = pow(Abs,c/2.0)*cos(c*Arg + d*log(Abs)/2.0)*exp(-d*Arg); op->imag = pow(Abs,c/2.0)*sin(c*Arg + d*log(Abs)/2.0)*exp(-d*Arg); } } /* cos(a+b) = cos(a)*cos(b) - sin(a)*sin(b) cos(a+bi) = cos(a)*cosh(b) - sin(a)*i*sinh(b) sin(a+b) = cos(a)*sin(b) + cos(b)*sin(a) sin(a+bi) = cos(a)*i*sinh(b) + cosh(b)*sin(a) (a+bi)^(c+di) = (a+bi)^c*(a+bi)^(di) is (from mathematica): Power(Abs,c)* Cos(c*Arg + d*Log(Abs))/ Power(E,d*Arg) + Complex(0,1)*Power(Abs,c)* Sin(c*Arg + d*Log(Abs))/ Power(E,d*Arg) */ void fcomplex_atan2(fcomplex *y, fcomplex *x, fcomplex *op) { /* mathematica says: -i log((x+yi)/sqrt(x^2+y^2)), so i'm going to do: i ( log(x^2+y^2)/2 - log(x+y i) ) */ fcomplex tmp1, tmp2, tmp3; /* tmp1 = x^2 + y^2 */ tmp1.real=x->real*x->real-x->imag*x->imag+y->real*y->real-y->imag*y->imag; /* tmp2 = log(tmp1) */ fcomplex_log(&tmp1,&tmp2); /* tmp1 = x + y i */ tmp1.real = x->real - y->imag; tmp1.imag = x->imag + y->real; /* tmp3 = log(tmp1) */ fcomplex_log(&tmp3,&tmp1); /* op = i (tmp2/2 - tmp3) */ op->real = -tmp2.imag/2 + tmp3.imag; op->imag = tmp2.real/2 - tmp3.real; } /* stubs */ void fcomplex_monstub(fcomplex *arg, fcomplex *op) { op->real = op->imag = atof("NaN"); } void fcomplex_binstub(fcomplex *arg1, fcomplex *arg2, fcomplex *op) { op->real = op->imag = atof("NaN"); } geomview-1.9.4/src/lib/fexpr/evaluate.c0000644000175000001440000001157010455701000014713 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "fexpr.h" #define PUSH(val) (op=(val),stack[stackpos++]=op) #define POP() (stack[--stackpos]) double expr_evaluate(struct expression *e) { double op, *stack; int stackpos=0; int vectpos; /* where we are in the vector. */ double temp1,temp2; stack = malloc (sizeof (double) *e->nelem); for (vectpos=0; vectposnelem; vectpos++) { struct expr_elem *k; k = &(e->elems[vectpos]); switch(k->op) { case MONOP: switch (k->u.monop.op) { case '-': temp1 = POP(); PUSH(temp1); default: abort(); /* help! help! */ break; }; case BINOP: switch (k->u.binop.op) { case '+': temp1 = POP(); temp2 = POP(); PUSH(temp2+temp1); break; case '-': temp1 = POP(); temp2 = POP(); PUSH(temp1-temp2); break; case '*': temp1 = POP(); temp2 = POP(); PUSH(temp1*temp2); break; case '/': temp1 = POP(); temp2 = POP(); PUSH(temp1/temp2); break; case '^': temp1 = POP(); temp2 = POP(); PUSH(pow(temp1,temp2)); break; default: abort(); /* help! help! */ break; }; break; case MONFUNC: temp1 = POP(); PUSH((*k->u.monfunc.func)(temp1)); break; case BINFUNC: temp1 = POP(); temp2 = POP(); PUSH((*k->u.binfunc.func)(temp1,temp2)); break; case PUSHVAR: PUSH(e->varvals[k->u.pushvar.varnum].real); break; case PUSHNUM: PUSH(k->u.pushnum.number); break; default: break; } } op = POP(); free(stack); return op; } void expr_evaluate_some(struct expression *e, expr_var v, double min, double max, int npoints, double *buffer) { int i; for (i=0; inelem); for (vectpos=0; vectposnelem; vectpos++) { struct expr_elem *k; k = &(e->elems[vectpos]); switch(k->op) { case MONOP: switch (k->u.monop.op) { case '-': POP(reg1); reg1.real *= -1; reg1.imag *= -1; PUSH(reg1); default: abort(); /* help! help! */ break; }; break; case BINOP: switch (k->u.binop.op) { case '+': POP(reg1); POP(reg2); reg1.real += reg2.real; reg1.imag += reg2.imag; PUSH(reg1); break; case '-': POP(reg1); POP(reg2); reg1.real -= reg2.real; reg1.imag -= reg2.imag; PUSH(reg1); break; case '*': POP(reg1); POP(reg2); reg3.real = reg2.real*reg1.real-reg2.imag*reg1.imag; reg3.imag = reg2.imag*reg1.real+reg1.imag*reg2.real; PUSH(reg3); break; case '/': POP(reg1); POP(reg2); reg3.real = (reg1.real*reg2.real-reg1.imag*reg2.imag )/ (reg2.real*reg2.real+reg2.imag*reg2.imag); reg3.imag = (reg1.imag*reg2.real - reg2.imag*reg1.real ) / (reg2.real*reg2.real + reg2.imag*reg2.imag); PUSH(reg3); break; case '^': POP(reg1); POP(reg2); fcomplex_pow(®1, ®2, ®3); PUSH(reg3); default: abort(); /* help! help! */ break; }; break; case MONFUNC: POP(reg1); (*k->u.monfunc.cfunc)(®1,®2); PUSH(reg2); break; case BINFUNC: POP(reg1); POP(reg2); (*k->u.binfunc.cfunc)(®1,®2,®3); PUSH(reg3); break; case PUSHVAR: PUSH(e->varvals[k->u.pushvar.varnum]); break; case PUSHNUM: reg1.real = k->u.pushnum.number; reg1.imag = 0; PUSH(reg1); break; default: break; } } POP(*op); free(stack); } geomview-1.9.4/src/lib/fexpr/fexpr.h0000644000175000001440000001376310455701000014244 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* expression, version 1.0 */ typedef int expr_var; typedef struct { double real; double imag; } fcomplex; struct expression { int nvars; char **varnames; fcomplex *varvals; int nelem; /* number of elements in the vector. */ struct expr_elem *elems; }; typedef double (*func_double)(double); typedef double (*func_double_double)(double, double); typedef void (*func_complex)(fcomplex *source, fcomplex*result); typedef void (*func_complex_complex)(fcomplex *source1, fcomplex *source2, fcomplex*result); struct expr_elem { enum expr_op { MONOP, BINOP, MONFUNC, BINFUNC, PUSHVAR, PUSHNUM } op; union { struct { char op; } monop; struct { char op; } binop; struct { func_double func; func_complex cfunc; } monfunc; struct { func_double_double func; func_complex_complex cfunc; } binfunc; struct { int varnum; } pushvar; struct { double number; } pushnum; } u; }; extern struct expression *expr_new(void); extern void expr_free(struct expression *); extern char *expr_parse(struct expression *expr, char *e); extern double expr_evaluate(struct expression *e); extern void expr_evaluate_some(struct expression *e, expr_var v, double min, double max, int npoints, double *buffer); extern void expr_evaluate_complex(struct expression *e, fcomplex *op); extern expr_var expr_create_variable(struct expression *e, char *name, double val); extern void expr_set_variable(struct expression *e, expr_var v, double val); extern void expr_set_variable_complex(struct expression *e, expr_var v, fcomplex *val); extern double expr_get_variable(struct expression *e, expr_var v); extern void expr_get_variable_complex(struct expression *e, expr_var v, fcomplex *op); extern void expr_copy_variables(struct expression *source, struct expression *dest); extern struct expr_monfunc { char *name; func_double func; func_complex cfunc; } expr_monfuncs[]; extern struct expr_binfunc { char *name; func_double_double func; func_complex_complex cfunc; } expr_binfuncs[]; extern void fcomplex_re(fcomplex *,fcomplex *); extern void fcomplex_im(fcomplex *,fcomplex *); extern void fcomplex_abs(fcomplex *,fcomplex *); extern void fcomplex_log(fcomplex *,fcomplex *); extern void fcomplex_log10(fcomplex *,fcomplex *); extern void fcomplex_sqrt(fcomplex *,fcomplex *); extern void fcomplex_cos(fcomplex *,fcomplex *); extern void fcomplex_arccos(fcomplex *,fcomplex *); extern void fcomplex_sin(fcomplex *,fcomplex *); extern void fcomplex_arcsin(fcomplex *,fcomplex *); extern void fcomplex_tan(fcomplex *,fcomplex *); extern void fcomplex_arctan(fcomplex *,fcomplex *); extern void fcomplex_cot(fcomplex *,fcomplex *); extern void fcomplex_sec(fcomplex *,fcomplex *); extern void fcomplex_csc(fcomplex *,fcomplex *); extern void fcomplex_cosh(fcomplex *,fcomplex *); extern void fcomplex_sinh(fcomplex *,fcomplex *); extern void fcomplex_tanh(fcomplex *,fcomplex *); extern void fcomplex_arccosh(fcomplex *,fcomplex *); extern void fcomplex_arcsinh(fcomplex *,fcomplex *); extern void fcomplex_arctanh(fcomplex *,fcomplex *); extern void fcomplex_floor(fcomplex *,fcomplex *); extern void fcomplex_round(fcomplex *,fcomplex *); extern void fcomplex_ceiling(fcomplex *,fcomplex *); extern void fcomplex_exp(fcomplex *,fcomplex *); extern void fcomplex_pow(fcomplex *,fcomplex *,fcomplex *); extern void fcomplex_atan2(fcomplex *,fcomplex *,fcomplex *); extern double freal_re(double); extern double freal_im(double); extern double freal_cot(double); extern double freal_sec(double); extern double freal_csc(double); extern void fcomplex_monstub(fcomplex *,fcomplex *); extern void fcomplex_binstub(fcomplex *,fcomplex *, fcomplex *); extern double freal_monstub(double); extern double freal_binstub(double,double); #define DEFAULT_EXPR_MONFUNCS \ {"re", freal_re, fcomplex_re}, \ {"im", freal_im, fcomplex_im}, \ {"abs", fabs, fcomplex_abs}, \ {"log", log, fcomplex_log}, \ {"log10", log10, fcomplex_log10}, \ {"sqrt", sqrt, fcomplex_sqrt}, \ {"cos", cos, fcomplex_cos}, \ {"arccos", acos, fcomplex_arccos}, \ {"sin", sin, fcomplex_sin}, \ {"arcsin", asin, fcomplex_arcsin}, \ {"tan", tan, fcomplex_tan}, \ {"arctan", atan, fcomplex_arctan}, \ {"cot", freal_cot, fcomplex_cot}, \ {"sec", freal_sec, fcomplex_sec}, \ {"csc", freal_csc, fcomplex_csc}, \ {"cosh", cosh, fcomplex_cosh}, \ {"sinh", sinh, fcomplex_sinh}, \ {"tanh", tanh, fcomplex_tanh}, \ {"arccosh", acosh, fcomplex_arccosh}, \ {"arcsinh", asinh, fcomplex_arcsinh}, \ {"arctanh", atanh, fcomplex_arctanh}, \ {"floor", floor, fcomplex_floor}, \ {"round", rint, fcomplex_round}, \ {"ceiling", ceil, fcomplex_ceiling}, \ {"exp", exp, fcomplex_exp} #define DEFAULT_EXPR_BINFUNCS \ {"pow", pow, fcomplex_pow}, \ {"arctan2", atan2, fcomplex_atan2} geomview-1.9.4/src/lib/fexpr/exprs.c0000644000175000001440000000322210455701000014241 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "fexpr.h" struct expression *expr_new() { struct expression *op; op = malloc (sizeof (struct expression)); op ->nvars = 0; op->varnames = NULL; op->varvals = NULL; op->nelem = 0; op->elems = NULL; return op; } void expr_free(struct expression *e) { if (!e) return; if (e->varnames) { int i; for (i=0; invars; i++) if (e->varnames[i]) free (e->varnames[i]); free (e->varnames); } if (e->varvals) free (e->varvals); if (e->elems) free (e->elems); free(e); } geomview-1.9.4/src/lib/fexpr/lex.yy.c0000644000175000001440000012262110461140703014341 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #line 2 "lex.fparse_yy.c" /* A lexical scanner generated by flex */ /* Scanner skeleton version: * $Header: /cvsroot/geomview/geomview/src/lib/fexpr/lex.yy.c,v 1.5 2006/07/15 19:05:57 rotdrop Exp $ */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #include /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #include #include /* Use prototypes in function declarations. */ #define YY_USE_PROTOS /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ #if __STDC__ #define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef __TURBOC__ #pragma warn -rch #pragma warn -use #include #include #define YY_USE_CONST #define YY_USE_PROTOS #endif #ifdef YY_USE_CONST #define fparse_yyconst const #else #define fparse_yyconst #endif #ifdef YY_USE_PROTOS #define YY_PROTO(proto) proto #else #define YY_PROTO(proto) () #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN fparse_yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((fparse_yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE fparse_yyrestart( fparse_yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #define YY_BUF_SIZE 16384 typedef struct fparse_yy_buffer_state *YY_BUFFER_STATE; extern int fparse_yyleng; extern FILE *fparse_yyin, *fparse_yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* The funky do-while in the following #define is used to turn the definition * int a single C statement (which needs a semi-colon terminator). This * avoids problems with code like: * * if ( condition_holds ) * fparse_yyless( 5 ); * else * do_something_else(); * * Prior to using the do-while the compiler would get upset at the * "else" because it interpreted the "if" statement as being all * done when it reached the ';' after the fparse_yyless() call. */ /* Return all but the first 'n' matched characters back to the input stream. */ #define fparse_yyless(n) \ do \ { \ /* Undo effects of setting up fparse_yytext. */ \ *fparse_yy_cp = fparse_yy_hold_char; \ fparse_yy_c_buf_p = fparse_yy_cp = fparse_yy_bp + n - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up fparse_yytext again */ \ } \ while ( 0 ) #define unput(c) fparse_yyunput( c, fparse_yytext_ptr ) /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ typedef unsigned int fparse_yy_size_t; struct fparse_yy_buffer_state { FILE *fparse_yy_input_file; char *fparse_yy_ch_buf; /* input buffer */ char *fparse_yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ fparse_yy_size_t fparse_yy_buf_size; /* Number of characters read into fparse_yy_ch_buf, not including EOB * characters. */ int fparse_yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int fparse_yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int fparse_yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int fparse_yy_at_bol; /* Whether to try to fill the input buffer when we reach the * end of it. */ int fparse_yy_fill_buffer; int fparse_yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via fparse_yyrestart()), so that the user can continue scanning by * just pointing fparse_yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; static YY_BUFFER_STATE fparse_yy_current_buffer = 0; /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". */ #define YY_CURRENT_BUFFER fparse_yy_current_buffer /* fparse_yy_hold_char holds the character lost when fparse_yytext is formed. */ static char fparse_yy_hold_char; static int fparse_yy_n_chars; /* number of characters read into fparse_yy_ch_buf */ int fparse_yyleng; /* Points to current character in buffer. */ static char *fparse_yy_c_buf_p = (char *) 0; static int fparse_yy_init = 1; /* whether we need to initialize */ static int fparse_yy_start = 0; /* start state number */ /* Flag which is used to allow fparse_yywrap()'s to do buffer switches * instead of setting up a fresh fparse_yyin. A bit of a hack ... */ static int fparse_yy_did_buffer_switch_on_eof; void fparse_yyrestart YY_PROTO(( FILE *input_file )); void fparse_yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); void fparse_yy_load_buffer_state YY_PROTO(( void )); YY_BUFFER_STATE fparse_yy_create_buffer YY_PROTO(( FILE *file, int size )); void fparse_yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); void fparse_yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); void fparse_yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); #define YY_FLUSH_BUFFER fparse_yy_flush_buffer( fparse_yy_current_buffer ) YY_BUFFER_STATE fparse_yy_scan_buffer YY_PROTO(( char *base, fparse_yy_size_t size )); YY_BUFFER_STATE fparse_yy_scan_string YY_PROTO(( fparse_yyconst char *str )); YY_BUFFER_STATE fparse_yy_scan_bytes YY_PROTO(( fparse_yyconst char *bytes, int len )); static void *fparse_yy_flex_alloc YY_PROTO(( fparse_yy_size_t )); static void *fparse_yy_flex_realloc YY_PROTO(( void *, fparse_yy_size_t )); static void fparse_yy_flex_free YY_PROTO(( void * )); #define fparse_yy_new_buffer fparse_yy_create_buffer #define fparse_yy_set_interactive(is_interactive) \ { \ if ( ! fparse_yy_current_buffer ) \ fparse_yy_current_buffer = fparse_yy_create_buffer( fparse_yyin, YY_BUF_SIZE ); \ fparse_yy_current_buffer->fparse_yy_is_interactive = is_interactive; \ } #define fparse_yy_set_bol(at_bol) \ { \ if ( ! fparse_yy_current_buffer ) \ fparse_yy_current_buffer = fparse_yy_create_buffer( fparse_yyin, YY_BUF_SIZE ); \ fparse_yy_current_buffer->fparse_yy_at_bol = at_bol; \ } #define YY_AT_BOL() (fparse_yy_current_buffer->fparse_yy_at_bol) typedef unsigned char YY_CHAR; FILE *fparse_yyin = (FILE *) 0, *fparse_yyout = (FILE *) 0; typedef int fparse_yy_state_type; extern char *fparse_yytext; #define fparse_yytext_ptr fparse_yytext static fparse_yy_state_type fparse_yy_get_previous_state YY_PROTO(( void )); static fparse_yy_state_type fparse_yy_try_NUL_trans YY_PROTO(( fparse_yy_state_type current_state )); static int fparse_yy_get_next_buffer YY_PROTO(( void )); static void fparse_yy_fatal_error YY_PROTO(( fparse_yyconst char msg[] )); /* Done after the current pattern has been matched and before the * corresponding action - sets up fparse_yytext. */ #define YY_DO_BEFORE_ACTION \ fparse_yytext_ptr = fparse_yy_bp; \ fparse_yyleng = (int) (fparse_yy_cp - fparse_yy_bp); \ fparse_yy_hold_char = *fparse_yy_cp; \ *fparse_yy_cp = '\0'; \ fparse_yy_c_buf_p = fparse_yy_cp; #define YY_NUM_RULES 4 #define YY_END_OF_BUFFER 5 static fparse_yyconst short int fparse_yy_accept[19] = { 0, 0, 0, 5, 3, 4, 3, 1, 2, 1, 1, 1, 0, 2, 1, 0, 1, 1, 0 } ; static fparse_yyconst int fparse_yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 4, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 7, 1, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static fparse_yyconst int fparse_yy_meta[9] = { 0, 1, 1, 1, 1, 2, 2, 2, 2 } ; static fparse_yyconst short int fparse_yy_base[20] = { 0, 0, 0, 21, 22, 22, 14, 5, 0, 9, 11, 0, 15, 0, 0, 10, 7, 22, 22, 9 } ; static fparse_yyconst short int fparse_yy_def[20] = { 0, 18, 1, 18, 18, 18, 18, 18, 19, 18, 9, 7, 18, 19, 10, 18, 18, 18, 0, 18 } ; static fparse_yyconst short int fparse_yy_nxt[31] = { 0, 4, 5, 4, 6, 7, 8, 4, 8, 10, 11, 13, 17, 12, 9, 16, 14, 12, 15, 9, 16, 18, 3, 18, 18, 18, 18, 18, 18, 18, 18 } ; static fparse_yyconst short int fparse_yy_chk[31] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 19, 16, 7, 9, 15, 10, 9, 12, 6, 12, 3, 18, 18, 18, 18, 18, 18, 18, 18, 18 } ; static fparse_yy_state_type fparse_yy_last_accepting_state; static char *fparse_yy_last_accepting_cpos; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define fparse_yymore() fparse_yymore_used_but_not_detected #define YY_MORE_ADJ 0 char *fparse_yytext; #line 1 "../lexical.l" #define INITIAL 0 #line 2 "../lexical.l" #include #include #include "parse.tab.h" #define fparse_yywrap() 1 static int inputpos=0; static char *bufptr; static int buflen; void expr_lex_reset_input(char *buf) { bufptr = buf; inputpos = 0; buflen = strlen(buf); } #undef YY_INPUT #define YY_INPUT(buf,result,max_size) do_fparse_yy_input((buf),&(result),(max_size)) void do_fparse_yy_input(char *buf, int *result, int max_size) { if (inputpos == buflen) { (*result) = 0; } else { int size = max_size < buflen-inputpos ? max_size : buflen-inputpos; memcpy (buf, bufptr+inputpos, size); (*result) = size; inputpos += size; } } #line 403 "lex.fparse_yy.c" /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int fparse_yywrap YY_PROTO(( void )); #else extern int fparse_yywrap YY_PROTO(( void )); #endif #endif #ifndef YY_NO_UNPUT static void fparse_yyunput YY_PROTO(( int c, char *buf_ptr )); #endif #ifndef fparse_yytext_ptr static void fparse_yy_flex_strncpy YY_PROTO(( char *, fparse_yyconst char *, int )); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int fparse_yyinput YY_PROTO(( void )); #else static int input YY_PROTO(( void )); #endif #endif #if YY_STACK_USED static int fparse_yy_start_stack_ptr = 0; static int fparse_yy_start_stack_depth = 0; static int *fparse_yy_start_stack = 0; #ifndef YY_NO_PUSH_STATE static void fparse_yy_push_state YY_PROTO(( int new_state )); #endif #ifndef YY_NO_POP_STATE static void fparse_yy_pop_state YY_PROTO(( void )); #endif #ifndef YY_NO_TOP_STATE static int fparse_yy_top_state YY_PROTO(( void )); #endif #else #define YY_NO_PUSH_STATE 1 #define YY_NO_POP_STATE 1 #define YY_NO_TOP_STATE 1 #endif #ifdef YY_MALLOC_DECL YY_MALLOC_DECL #else #if __STDC__ #ifndef __cplusplus #include #endif #else /* Just try to get by without declaring the routines. This will fail * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) * or sizeof(void*) != sizeof(int). */ #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO (void) fwrite( fparse_yytext, fparse_yyleng, 1, fparse_yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( fparse_yy_current_buffer->fparse_yy_is_interactive ) \ { \ int c = '*', n; \ for ( n = 0; n < max_size && \ (c = getc( fparse_yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( fparse_yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else if ( ((result = fread( buf, 1, max_size, fparse_yyin )) == 0) \ && ferror( fparse_yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "fparse_yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef fparse_yyterminate #define fparse_yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) fparse_yy_fatal_error( msg ) #endif /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL int fparse_yylex YY_PROTO(( void )) #endif /* Code executed at the beginning of each rule, after fparse_yytext and fparse_yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION YY_DECL { fparse_yy_state_type fparse_yy_current_state; char *fparse_yy_cp, *fparse_yy_bp; int fparse_yy_act; #line 41 "../lexical.l" #line 554 "lex.fparse_yy.c" if ( fparse_yy_init ) { fparse_yy_init = 0; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! fparse_yy_start ) fparse_yy_start = 1; /* first start state */ if ( ! fparse_yyin ) fparse_yyin = stdin; if ( ! fparse_yyout ) fparse_yyout = stdout; if ( ! fparse_yy_current_buffer ) fparse_yy_current_buffer = fparse_yy_create_buffer( fparse_yyin, YY_BUF_SIZE ); fparse_yy_load_buffer_state(); } while ( 1 ) /* loops until end-of-file is reached */ { fparse_yy_cp = fparse_yy_c_buf_p; /* Support of fparse_yytext. */ *fparse_yy_cp = fparse_yy_hold_char; /* fparse_yy_bp points to the position in fparse_yy_ch_buf of the start of * the current run. */ fparse_yy_bp = fparse_yy_cp; fparse_yy_current_state = fparse_yy_start; fparse_yy_match: do { YY_CHAR fparse_yy_c = fparse_yy_ec[YY_SC_TO_UI(*fparse_yy_cp)]; if ( fparse_yy_accept[fparse_yy_current_state] ) { fparse_yy_last_accepting_state = fparse_yy_current_state; fparse_yy_last_accepting_cpos = fparse_yy_cp; } while ( fparse_yy_chk[fparse_yy_base[fparse_yy_current_state] + fparse_yy_c] != fparse_yy_current_state ) { fparse_yy_current_state = (int) fparse_yy_def[fparse_yy_current_state]; if ( fparse_yy_current_state >= 19 ) fparse_yy_c = fparse_yy_meta[(unsigned int) fparse_yy_c]; } fparse_yy_current_state = fparse_yy_nxt[fparse_yy_base[fparse_yy_current_state] + (unsigned int) fparse_yy_c]; ++fparse_yy_cp; } while ( fparse_yy_base[fparse_yy_current_state] != 22 ); fparse_yy_find_action: fparse_yy_act = fparse_yy_accept[fparse_yy_current_state]; if ( fparse_yy_act == 0 ) { /* have to back up */ fparse_yy_cp = fparse_yy_last_accepting_cpos; fparse_yy_current_state = fparse_yy_last_accepting_state; fparse_yy_act = fparse_yy_accept[fparse_yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( fparse_yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *fparse_yy_cp = fparse_yy_hold_char; fparse_yy_cp = fparse_yy_last_accepting_cpos; fparse_yy_current_state = fparse_yy_last_accepting_state; goto fparse_yy_find_action; case 1: YY_RULE_SETUP #line 44 "../lexical.l" { fparse_yylval.number = atof(fparse_yytext); return NUMBER; } YY_BREAK case 2: YY_RULE_SETUP #line 45 "../lexical.l" { fparse_yylval.string = malloc(strlen(fparse_yytext)+1); strcpy (fparse_yylval.string, fparse_yytext); return IDENT; } YY_BREAK case 3: YY_RULE_SETUP #line 46 "../lexical.l" { if (*fparse_yytext != ' ' && *fparse_yytext != '\n' && *fparse_yytext != '\t') return *fparse_yytext; } YY_BREAK case 4: YY_RULE_SETUP #line 47 "../lexical.l" ECHO; YY_BREAK #line 657 "lex.fparse_yy.c" case YY_STATE_EOF(INITIAL): fparse_yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int fparse_yy_amount_of_matched_text = (int) (fparse_yy_cp - fparse_yytext_ptr) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *fparse_yy_cp = fparse_yy_hold_char; if ( fparse_yy_current_buffer->fparse_yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed fparse_yyin at a new source and called * fparse_yylex(). If so, then we have to assure * consistency between fparse_yy_current_buffer and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ fparse_yy_n_chars = fparse_yy_current_buffer->fparse_yy_n_chars; fparse_yy_current_buffer->fparse_yy_input_file = fparse_yyin; fparse_yy_current_buffer->fparse_yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for fparse_yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since fparse_yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( fparse_yy_c_buf_p <= &fparse_yy_current_buffer->fparse_yy_ch_buf[fparse_yy_n_chars] ) { /* This was really a NUL. */ fparse_yy_state_type fparse_yy_next_state; fparse_yy_c_buf_p = fparse_yytext_ptr + fparse_yy_amount_of_matched_text; fparse_yy_current_state = fparse_yy_get_previous_state(); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * fparse_yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ fparse_yy_next_state = fparse_yy_try_NUL_trans( fparse_yy_current_state ); fparse_yy_bp = fparse_yytext_ptr + YY_MORE_ADJ; if ( fparse_yy_next_state ) { /* Consume the NUL. */ fparse_yy_cp = ++fparse_yy_c_buf_p; fparse_yy_current_state = fparse_yy_next_state; goto fparse_yy_match; } else { fparse_yy_cp = fparse_yy_c_buf_p; goto fparse_yy_find_action; } } else switch ( fparse_yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { fparse_yy_did_buffer_switch_on_eof = 0; if ( fparse_yywrap() ) { /* Note: because we've taken care in * fparse_yy_get_next_buffer() to have set up * fparse_yytext, we can now set up * fparse_yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ fparse_yy_c_buf_p = fparse_yytext_ptr + YY_MORE_ADJ; fparse_yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! fparse_yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: fparse_yy_c_buf_p = fparse_yytext_ptr + fparse_yy_amount_of_matched_text; fparse_yy_current_state = fparse_yy_get_previous_state(); fparse_yy_cp = fparse_yy_c_buf_p; fparse_yy_bp = fparse_yytext_ptr + YY_MORE_ADJ; goto fparse_yy_match; case EOB_ACT_LAST_MATCH: fparse_yy_c_buf_p = &fparse_yy_current_buffer->fparse_yy_ch_buf[fparse_yy_n_chars]; fparse_yy_current_state = fparse_yy_get_previous_state(); fparse_yy_cp = fparse_yy_c_buf_p; fparse_yy_bp = fparse_yytext_ptr + YY_MORE_ADJ; goto fparse_yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of fparse_yylex */ /* fparse_yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int fparse_yy_get_next_buffer() { char *dest = fparse_yy_current_buffer->fparse_yy_ch_buf; char *source = fparse_yytext_ptr; int number_to_move, i; int ret_val; if ( fparse_yy_c_buf_p > &fparse_yy_current_buffer->fparse_yy_ch_buf[fparse_yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( fparse_yy_current_buffer->fparse_yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( fparse_yy_c_buf_p - fparse_yytext_ptr - YY_MORE_ADJ == 1 ) { /* We matched a singled characater, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) (fparse_yy_c_buf_p - fparse_yytext_ptr) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( fparse_yy_current_buffer->fparse_yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ fparse_yy_n_chars = 0; else { int num_to_read = fparse_yy_current_buffer->fparse_yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ #ifdef YY_USES_REJECT YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); #else /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = fparse_yy_current_buffer; int fparse_yy_c_buf_p_offset = (int) (fparse_yy_c_buf_p - b->fparse_yy_ch_buf); if ( b->fparse_yy_is_our_buffer ) { int new_size = b->fparse_yy_buf_size * 2; if ( new_size <= 0 ) b->fparse_yy_buf_size += b->fparse_yy_buf_size / 8; else b->fparse_yy_buf_size *= 2; b->fparse_yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ fparse_yy_flex_realloc( (void *) b->fparse_yy_ch_buf, b->fparse_yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->fparse_yy_ch_buf = 0; if ( ! b->fparse_yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); fparse_yy_c_buf_p = &b->fparse_yy_ch_buf[fparse_yy_c_buf_p_offset]; num_to_read = fparse_yy_current_buffer->fparse_yy_buf_size - number_to_move - 1; #endif } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&fparse_yy_current_buffer->fparse_yy_ch_buf[number_to_move]), fparse_yy_n_chars, num_to_read ); } if ( fparse_yy_n_chars == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; fparse_yyrestart( fparse_yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; fparse_yy_current_buffer->fparse_yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; fparse_yy_n_chars += number_to_move; fparse_yy_current_buffer->fparse_yy_ch_buf[fparse_yy_n_chars] = YY_END_OF_BUFFER_CHAR; fparse_yy_current_buffer->fparse_yy_ch_buf[fparse_yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; fparse_yytext_ptr = &fparse_yy_current_buffer->fparse_yy_ch_buf[0]; return ret_val; } /* fparse_yy_get_previous_state - get the state just before the EOB char was reached */ static fparse_yy_state_type fparse_yy_get_previous_state() { fparse_yy_state_type fparse_yy_current_state; char *fparse_yy_cp; fparse_yy_current_state = fparse_yy_start; for ( fparse_yy_cp = fparse_yytext_ptr + YY_MORE_ADJ; fparse_yy_cp < fparse_yy_c_buf_p; ++fparse_yy_cp ) { YY_CHAR fparse_yy_c = (*fparse_yy_cp ? fparse_yy_ec[YY_SC_TO_UI(*fparse_yy_cp)] : 1); if ( fparse_yy_accept[fparse_yy_current_state] ) { fparse_yy_last_accepting_state = fparse_yy_current_state; fparse_yy_last_accepting_cpos = fparse_yy_cp; } while ( fparse_yy_chk[fparse_yy_base[fparse_yy_current_state] + fparse_yy_c] != fparse_yy_current_state ) { fparse_yy_current_state = (int) fparse_yy_def[fparse_yy_current_state]; if ( fparse_yy_current_state >= 19 ) fparse_yy_c = fparse_yy_meta[(unsigned int) fparse_yy_c]; } fparse_yy_current_state = fparse_yy_nxt[fparse_yy_base[fparse_yy_current_state] + (unsigned int) fparse_yy_c]; } return fparse_yy_current_state; } /* fparse_yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = fparse_yy_try_NUL_trans( current_state ); */ #ifdef YY_USE_PROTOS static fparse_yy_state_type fparse_yy_try_NUL_trans( fparse_yy_state_type fparse_yy_current_state ) #else static fparse_yy_state_type fparse_yy_try_NUL_trans( fparse_yy_current_state ) fparse_yy_state_type fparse_yy_current_state; #endif { int fparse_yy_is_jam; char *fparse_yy_cp = fparse_yy_c_buf_p; YY_CHAR fparse_yy_c = 1; if ( fparse_yy_accept[fparse_yy_current_state] ) { fparse_yy_last_accepting_state = fparse_yy_current_state; fparse_yy_last_accepting_cpos = fparse_yy_cp; } while ( fparse_yy_chk[fparse_yy_base[fparse_yy_current_state] + fparse_yy_c] != fparse_yy_current_state ) { fparse_yy_current_state = (int) fparse_yy_def[fparse_yy_current_state]; if ( fparse_yy_current_state >= 19 ) fparse_yy_c = fparse_yy_meta[(unsigned int) fparse_yy_c]; } fparse_yy_current_state = fparse_yy_nxt[fparse_yy_base[fparse_yy_current_state] + (unsigned int) fparse_yy_c]; fparse_yy_is_jam = (fparse_yy_current_state == 18); return fparse_yy_is_jam ? 0 : fparse_yy_current_state; } #ifndef YY_NO_UNPUT #ifdef YY_USE_PROTOS static void fparse_yyunput( int c, char *fparse_yy_bp ) #else static void fparse_yyunput( c, fparse_yy_bp ) int c; char *fparse_yy_bp; #endif { char *fparse_yy_cp = fparse_yy_c_buf_p; /* undo effects of setting up fparse_yytext */ *fparse_yy_cp = fparse_yy_hold_char; if ( fparse_yy_cp < fparse_yy_current_buffer->fparse_yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ int number_to_move = fparse_yy_n_chars + 2; char *dest = &fparse_yy_current_buffer->fparse_yy_ch_buf[ fparse_yy_current_buffer->fparse_yy_buf_size + 2]; char *source = &fparse_yy_current_buffer->fparse_yy_ch_buf[number_to_move]; while ( source > fparse_yy_current_buffer->fparse_yy_ch_buf ) *--dest = *--source; fparse_yy_cp += (int) (dest - source); fparse_yy_bp += (int) (dest - source); fparse_yy_n_chars = fparse_yy_current_buffer->fparse_yy_buf_size; if ( fparse_yy_cp < fparse_yy_current_buffer->fparse_yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--fparse_yy_cp = (char) c; fparse_yytext_ptr = fparse_yy_bp; fparse_yy_hold_char = *fparse_yy_cp; fparse_yy_c_buf_p = fparse_yy_cp; } #endif /* ifndef YY_NO_UNPUT */ #ifdef __cplusplus static int fparse_yyinput() #else static int input() #endif { int c; *fparse_yy_c_buf_p = fparse_yy_hold_char; if ( *fparse_yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* fparse_yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( fparse_yy_c_buf_p < &fparse_yy_current_buffer->fparse_yy_ch_buf[fparse_yy_n_chars] ) /* This was really a NUL. */ *fparse_yy_c_buf_p = '\0'; else { /* need more input */ fparse_yytext_ptr = fparse_yy_c_buf_p; ++fparse_yy_c_buf_p; switch ( fparse_yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { if ( fparse_yywrap() ) { fparse_yy_c_buf_p = fparse_yytext_ptr + YY_MORE_ADJ; return EOF; } if ( ! fparse_yy_did_buffer_switch_on_eof ) YY_NEW_FILE; #ifdef __cplusplus return fparse_yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: fparse_yy_c_buf_p = fparse_yytext_ptr + YY_MORE_ADJ; break; case EOB_ACT_LAST_MATCH: #ifdef __cplusplus YY_FATAL_ERROR( "unexpected last match in fparse_yyinput()" ); #else YY_FATAL_ERROR( "unexpected last match in input()" ); #endif } } } c = *(unsigned char *) fparse_yy_c_buf_p; /* cast for 8-bit char's */ *fparse_yy_c_buf_p = '\0'; /* preserve fparse_yytext */ fparse_yy_hold_char = *++fparse_yy_c_buf_p; return c; } #ifdef YY_USE_PROTOS void fparse_yyrestart( FILE *input_file ) #else void fparse_yyrestart( input_file ) FILE *input_file; #endif { if ( ! fparse_yy_current_buffer ) fparse_yy_current_buffer = fparse_yy_create_buffer( fparse_yyin, YY_BUF_SIZE ); fparse_yy_init_buffer( fparse_yy_current_buffer, input_file ); fparse_yy_load_buffer_state(); } #ifdef YY_USE_PROTOS void fparse_yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) #else void fparse_yy_switch_to_buffer( new_buffer ) YY_BUFFER_STATE new_buffer; #endif { if ( fparse_yy_current_buffer == new_buffer ) return; if ( fparse_yy_current_buffer ) { /* Flush out information for old buffer. */ *fparse_yy_c_buf_p = fparse_yy_hold_char; fparse_yy_current_buffer->fparse_yy_buf_pos = fparse_yy_c_buf_p; fparse_yy_current_buffer->fparse_yy_n_chars = fparse_yy_n_chars; } fparse_yy_current_buffer = new_buffer; fparse_yy_load_buffer_state(); /* We don't actually know whether we did this switch during * EOF (fparse_yywrap()) processing, but the only time this flag * is looked at is after fparse_yywrap() is called, so it's safe * to go ahead and always set it. */ fparse_yy_did_buffer_switch_on_eof = 1; } #ifdef YY_USE_PROTOS void fparse_yy_load_buffer_state( void ) #else void fparse_yy_load_buffer_state() #endif { fparse_yy_n_chars = fparse_yy_current_buffer->fparse_yy_n_chars; fparse_yytext_ptr = fparse_yy_c_buf_p = fparse_yy_current_buffer->fparse_yy_buf_pos; fparse_yyin = fparse_yy_current_buffer->fparse_yy_input_file; fparse_yy_hold_char = *fparse_yy_c_buf_p; } #ifdef YY_USE_PROTOS YY_BUFFER_STATE fparse_yy_create_buffer( FILE *file, int size ) #else YY_BUFFER_STATE fparse_yy_create_buffer( file, size ) FILE *file; int size; #endif { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) fparse_yy_flex_alloc( sizeof( struct fparse_yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in fparse_yy_create_buffer()" ); b->fparse_yy_buf_size = size; /* fparse_yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->fparse_yy_ch_buf = (char *) fparse_yy_flex_alloc( b->fparse_yy_buf_size + 2 ); if ( ! b->fparse_yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in fparse_yy_create_buffer()" ); b->fparse_yy_is_our_buffer = 1; fparse_yy_init_buffer( b, file ); return b; } #ifdef YY_USE_PROTOS void fparse_yy_delete_buffer( YY_BUFFER_STATE b ) #else void fparse_yy_delete_buffer( b ) YY_BUFFER_STATE b; #endif { if ( ! b ) return; if ( b == fparse_yy_current_buffer ) fparse_yy_current_buffer = (YY_BUFFER_STATE) 0; if ( b->fparse_yy_is_our_buffer ) fparse_yy_flex_free( (void *) b->fparse_yy_ch_buf ); fparse_yy_flex_free( (void *) b ); } #ifndef YY_ALWAYS_INTERACTIVE #ifndef YY_NEVER_INTERACTIVE extern int isatty YY_PROTO(( int )); #endif #endif #ifdef YY_USE_PROTOS void fparse_yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) #else void fparse_yy_init_buffer( b, file ) YY_BUFFER_STATE b; FILE *file; #endif { fparse_yy_flush_buffer( b ); b->fparse_yy_input_file = file; b->fparse_yy_fill_buffer = 1; #if YY_ALWAYS_INTERACTIVE b->fparse_yy_is_interactive = 1; #else #if YY_NEVER_INTERACTIVE b->fparse_yy_is_interactive = 0; #else b->fparse_yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; #endif #endif } #ifdef YY_USE_PROTOS void fparse_yy_flush_buffer( YY_BUFFER_STATE b ) #else void fparse_yy_flush_buffer( b ) YY_BUFFER_STATE b; #endif { b->fparse_yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->fparse_yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->fparse_yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->fparse_yy_buf_pos = &b->fparse_yy_ch_buf[0]; b->fparse_yy_at_bol = 1; b->fparse_yy_buffer_status = YY_BUFFER_NEW; if ( b == fparse_yy_current_buffer ) fparse_yy_load_buffer_state(); } #ifndef YY_NO_SCAN_BUFFER #ifdef YY_USE_PROTOS YY_BUFFER_STATE fparse_yy_scan_buffer( char *base, fparse_yy_size_t size ) #else YY_BUFFER_STATE fparse_yy_scan_buffer( base, size ) char *base; fparse_yy_size_t size; #endif { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) fparse_yy_flex_alloc( sizeof( struct fparse_yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in fparse_yy_scan_buffer()" ); b->fparse_yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->fparse_yy_buf_pos = b->fparse_yy_ch_buf = base; b->fparse_yy_is_our_buffer = 0; b->fparse_yy_input_file = 0; b->fparse_yy_n_chars = b->fparse_yy_buf_size; b->fparse_yy_is_interactive = 0; b->fparse_yy_at_bol = 1; b->fparse_yy_fill_buffer = 0; b->fparse_yy_buffer_status = YY_BUFFER_NEW; fparse_yy_switch_to_buffer( b ); return b; } #endif #ifndef YY_NO_SCAN_STRING #ifdef YY_USE_PROTOS YY_BUFFER_STATE fparse_yy_scan_string( fparse_yyconst char *str ) #else YY_BUFFER_STATE fparse_yy_scan_string( str ) fparse_yyconst char *str; #endif { int len; for ( len = 0; str[len]; ++len ) ; return fparse_yy_scan_bytes( str, len ); } #endif #ifndef YY_NO_SCAN_BYTES #ifdef YY_USE_PROTOS YY_BUFFER_STATE fparse_yy_scan_bytes( fparse_yyconst char *bytes, int len ) #else YY_BUFFER_STATE fparse_yy_scan_bytes( bytes, len ) fparse_yyconst char *bytes; int len; #endif { YY_BUFFER_STATE b; char *buf; fparse_yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = len + 2; buf = (char *) fparse_yy_flex_alloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in fparse_yy_scan_bytes()" ); for ( i = 0; i < len; ++i ) buf[i] = bytes[i]; buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; b = fparse_yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in fparse_yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->fparse_yy_is_our_buffer = 1; return b; } #endif #ifndef YY_NO_PUSH_STATE #ifdef YY_USE_PROTOS static void fparse_yy_push_state( int new_state ) #else static void fparse_yy_push_state( new_state ) int new_state; #endif { if ( fparse_yy_start_stack_ptr >= fparse_yy_start_stack_depth ) { fparse_yy_size_t new_size; fparse_yy_start_stack_depth += YY_START_STACK_INCR; new_size = fparse_yy_start_stack_depth * sizeof( int ); if ( ! fparse_yy_start_stack ) fparse_yy_start_stack = (int *) fparse_yy_flex_alloc( new_size ); else fparse_yy_start_stack = (int *) fparse_yy_flex_realloc( (void *) fparse_yy_start_stack, new_size ); if ( ! fparse_yy_start_stack ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } fparse_yy_start_stack[fparse_yy_start_stack_ptr++] = YY_START; BEGIN(new_state); } #endif #ifndef YY_NO_POP_STATE static void fparse_yy_pop_state() { if ( --fparse_yy_start_stack_ptr < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN(fparse_yy_start_stack[fparse_yy_start_stack_ptr]); } #endif #ifndef YY_NO_TOP_STATE static int fparse_yy_top_state() { return fparse_yy_start_stack[fparse_yy_start_stack_ptr - 1]; } #endif #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif #ifdef YY_USE_PROTOS static void fparse_yy_fatal_error( fparse_yyconst char msg[] ) #else static void fparse_yy_fatal_error( msg ) char msg[]; #endif { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine fparse_yyless() so it works in section 3 code. */ #undef fparse_yyless #define fparse_yyless(n) \ do \ { \ /* Undo effects of setting up fparse_yytext. */ \ fparse_yytext[fparse_yyleng] = fparse_yy_hold_char; \ fparse_yy_c_buf_p = fparse_yytext + n - YY_MORE_ADJ; \ fparse_yy_hold_char = *fparse_yy_c_buf_p; \ *fparse_yy_c_buf_p = '\0'; \ fparse_yyleng = n; \ } \ while ( 0 ) /* Internal utility routines. */ #ifndef fparse_yytext_ptr #ifdef YY_USE_PROTOS static void fparse_yy_flex_strncpy( char *s1, fparse_yyconst char *s2, int n ) #else static void fparse_yy_flex_strncpy( s1, s2, n ) char *s1; fparse_yyconst char *s2; int n; #endif { int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_USE_PROTOS static void *fparse_yy_flex_alloc( fparse_yy_size_t size ) #else static void *fparse_yy_flex_alloc( size ) fparse_yy_size_t size; #endif { return (void *) malloc( size ); } #ifdef YY_USE_PROTOS static void *fparse_yy_flex_realloc( void *ptr, fparse_yy_size_t size ) #else static void *fparse_yy_flex_realloc( ptr, size ) void *ptr; fparse_yy_size_t size; #endif { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } #ifdef YY_USE_PROTOS static void fparse_yy_flex_free( void *ptr ) #else static void fparse_yy_flex_free( ptr ) void *ptr; #endif { free( ptr ); } #if YY_MAIN int main() { fparse_yylex(); return 0; } #endif #line 47 "../lexical.l" /* more c stuff */ geomview-1.9.4/src/lib/fexpr/Makefile.am0000644000175000001440000000051410461140703014775 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers parse.tab.c-saved noinst_LTLIBRARIES = libfexpr.la libfexpr_la_SOURCES = \ binfuncs.c complex.c evaluate.c exprs.c lex.yy.c monfuncs.c parse.tab.c real.c vars.c \ fexpr.h parse.tab.h fexprnew.h parse.tab.c: parse.tab.c-saved cp $(srcdir)/parse.tab.c-saved parse.tab.c geomview-1.9.4/src/lib/fexpr/Makefile.in0000644000175000001440000003677710665240500015034 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/fexpr DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libfexpr_la_LIBADD = am_libfexpr_la_OBJECTS = binfuncs.lo complex.lo evaluate.lo exprs.lo \ lex.yy.lo monfuncs.lo parse.tab.lo real.lo vars.lo libfexpr_la_OBJECTS = $(am_libfexpr_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libfexpr_la_SOURCES) DIST_SOURCES = $(libfexpr_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers parse.tab.c-saved noinst_LTLIBRARIES = libfexpr.la libfexpr_la_SOURCES = \ binfuncs.c complex.c evaluate.c exprs.c lex.yy.c monfuncs.c parse.tab.c real.c vars.c \ fexpr.h parse.tab.h fexprnew.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/fexpr/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/fexpr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libfexpr.la: $(libfexpr_la_OBJECTS) $(libfexpr_la_DEPENDENCIES) $(LINK) $(libfexpr_la_OBJECTS) $(libfexpr_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binfuncs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evaluate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exprs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lex.yy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/monfuncs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.tab.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/real.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vars.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am parse.tab.c: parse.tab.c-saved cp $(srcdir)/parse.tab.c-saved parse.tab.c # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/fexpr/parse.tab.c0000644000175000001440000007753410463157130015010 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* A Bison parser, made from ../parse.y with Bison version GNU Bison version 1.24 */ #define YYBISON 1 /* Identify Bison output. */ #define IDENT 258 #define NUMBER 259 #define MINUS 260 #line 1 "../parse.y" #include "fexpr.h" #include #include #include #include extern void fparse_yyerror(char *); extern int fparse_yyparse(); extern int fparse_yyrestart(void *); extern void expr_lex_reset_input(char *buf); extern int fparse_yylex(void); #define YYDEBUG 1 struct expr_tree { struct expr_elem elem; struct expr_tree *sub1; struct expr_tree *sub2; }; struct expr_tree *expr_parsed; struct expression *expr_current; static struct expr_parse_free { void *dat; struct expr_parse_free *next; } *freers = NULL; static void expr_free_dat(void *dat) { struct expr_parse_free *f; f=malloc(sizeof(struct expr_parse_free)); f->next=freers; freers=f; f->dat = dat; } static void expr_free_freers() { struct expr_parse_free *f, *next=NULL; for (f=freers; f; f=next) { next = f->next; free(f->dat); free(f); } freers = NULL; } static void expr_free_freers_no_dat() { struct expr_parse_free *f, *next=NULL; for (f=freers; f; f=next) { next = f->next; free(f); } freers = NULL; } static int count_nodes(struct expr_tree *e) { if (!e) return 0; return count_nodes(e->sub1) + count_nodes(e->sub2) + 1; } static void store_nodes(struct expr_tree *e, int *pos) { if (!e) return; store_nodes(e->sub2, pos); store_nodes(e->sub1, pos); expr_current->elems[*pos] = e->elem; (*pos)++; } static char *error_return; char *expr_parse(struct expression *expr, char *str) { int i; error_return = NULL; expr_current = expr; if (!str || !*str) return "Empty expression"; expr_lex_reset_input(str); i = fparse_yyparse(); /* do all the work. */ fparse_yyrestart(NULL); /* clean up so we can do this again. */ if (i) { expr_free_freers(); return "Parse error"; } if (error_return) { expr_free_freers(); return error_return; } expr_free_freers_no_dat(); /* ok. now we convert the parsed expression to a execution vector. whee. */ expr->nelem = count_nodes(expr_parsed); expr->elems = malloc (expr->nelem * sizeof (struct expr_elem)); /* we let i be a counter variable for where we're writing in * the vectorized expression. */ i = 0; store_nodes(expr_parsed, &i); return NULL; } static struct expr_monfunc lookup_monfunc(char *s) { struct expr_monfunc *i; static struct expr_monfunc fail = { NULL, NULL, NULL }; for (i=expr_monfuncs; i->name; i++) if (!strcmp(i->name,s)) return *i; { static char buf[1024]; sprintf(buf,"Undefined unary function: %s",s); error_return = buf; } return fail; } static struct expr_binfunc lookup_binfunc(char *s) { struct expr_binfunc *i; static struct expr_binfunc fail = { NULL, NULL, NULL }; for (i=expr_binfuncs; i->name; i++) if (!strcmp(i->name,s)) return *i; { static char buf[1024]; sprintf(buf,"Undefined binary function: %s",s); error_return = buf; } return fail; } static struct expr_tree *expr_parse_monop(int opr, struct expr_tree *sub) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = MONOP; op->elem.u.monop.op = opr; op->sub1 = sub; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_binop(int opr, struct expr_tree *sub1, struct expr_tree *sub2) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = BINOP; op->elem.u.binop.op = opr; op->sub1 = sub1; op->sub2 = sub2; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_monfunc(struct expr_monfunc f, struct expr_tree *sub1) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = MONFUNC; op->elem.u.monfunc.func = f.func; op->elem.u.monfunc.cfunc = f.cfunc; op->sub1 = sub1; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_binfunc(struct expr_binfunc f, struct expr_tree *sub1, struct expr_tree *sub2) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = BINFUNC; op->elem.u.binfunc.func = f.func; op->elem.u.binfunc.cfunc = f.cfunc; op->sub1 = sub1; op->sub2 = sub2; expr_free_dat(op); return op; } static struct expr_tree *expr_parse_var(char *s) { struct expr_tree *op; int i=0; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.u.pushvar.varnum = -1; op->elem.op = PUSHVAR; for (i=0; invars; i++) if (!strcmp(expr_current->varnames[i], s)) op->elem.u.pushvar.varnum = i; if (op->elem.u.pushvar.varnum == -1) { static char buf[1024]; sprintf(buf,"Undefined variable: %s", s); error_return = buf; } expr_free_dat(op); return op; } static struct expr_tree *expr_parse_num(double d) { struct expr_tree *op; op = malloc (sizeof (struct expr_tree)); op->sub1 = op->sub2 = NULL; op->elem.op = PUSHNUM; op->elem.u.pushnum.number = d; expr_free_dat(op); return op; } void fparse_yyerror(char *errorstr) { error_return = errorstr; } #line 246 "../parse.y" typedef union { char *string; struct expr_tree *expression; double number; } YYSTYPE; #ifndef YYLTYPE typedef struct fparse_yyltype { int timestamp; int first_line; int first_column; int last_line; int last_column; char *text; } fparse_yyltype; #define YYLTYPE fparse_yyltype #endif #include #ifndef __cplusplus #ifndef __STDC__ #define const #endif #endif #define YYFINAL 25 #define YYFLAG -32768 #define YYNTBASE 13 #define YYTRANSLATE(x) ((unsigned)(x) <= 260 ? fparse_yytranslate[x] : 15) static const char fparse_yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, 9, 5, 12, 6, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 7 }; #if YYDEBUG != 0 static const short fparse_yyprhs[] = { 0, 0, 2, 6, 10, 14, 18, 22, 25, 30, 37, 39 }; static const short fparse_yyrhs[] = { 14, 0, 10, 14, 11, 0, 14, 5, 14, 0, 14, 6, 14, 0, 14, 9, 14, 0, 14, 8, 14, 0, 6, 14, 0, 3, 10, 14, 11, 0, 3, 10, 14, 12, 14, 11, 0, 3, 0, 4, 0 }; #endif #if YYDEBUG != 0 static const short fparse_yyrline[] = { 0, 263, 265, 267, 268, 269, 270, 271, 272, 273, 274, 275 }; static const char * const fparse_yytname[] = { "$","error","$undefined.","IDENT", "NUMBER","'+'","'-'","MINUS","'/'","'*'","'('","')'","','","totexpression","expr", "" }; #endif static const short fparse_yyr1[] = { 0, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14 }; static const short fparse_yyr2[] = { 0, 1, 3, 3, 3, 3, 3, 2, 4, 6, 1, 1 }; static const short fparse_yydefact[] = { 0, 10, 11, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 2, 3, 4, 6, 5, 8, 0, 0, 9, 0, 0, 0 }; static const short fparse_yydefgoto[] = { 23, 5 }; static const short fparse_yypact[] = { 17, -8,-32768, 17, 17, 34, 17, -4, 20, 17, 17, 17, 17, 7,-32768, -4, -4,-32768,-32768,-32768, 17, 27,-32768, 10, 11,-32768 }; static const short fparse_yypgoto[] = {-32768, -3 }; #define YYLAST 43 static const short fparse_yytable[] = { 7, 8, 6, 13, 11, 12, 15, 16, 17, 18, 24, 25, 9, 10, 0, 11, 12, 21, 19, 20, 1, 2, 0, 3, 0, 9, 10, 4, 11, 12, 0, 14, 9, 10, 0, 11, 12, 0, 22, 9, 10, 0, 11, 12 }; static const short fparse_yycheck[] = { 3, 4, 10, 6, 8, 9, 9, 10, 11, 12, 0, 0, 5, 6, -1, 8, 9, 20, 11, 12, 3, 4, -1, 6, -1, 5, 6, 10, 8, 9, -1, 11, 5, 6, -1, 8, 9, -1, 11, 5, 6, -1, 8, 9 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/local/lib/bison.simple" /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ #ifndef alloca #ifdef __GNUC__ #define alloca __builtin_alloca #else /* not GNU C. */ #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) #include #else /* not sparc */ #if defined (MSDOS) && !defined (__TURBOC__) #include #else /* not MSDOS, or __TURBOC__ */ #if defined(_AIX) #include #pragma alloca #else /* not MSDOS, __TURBOC__, or _AIX */ #ifdef __hpux #ifdef __cplusplus extern "C" { void *alloca (unsigned int); }; #else /* not __cplusplus */ void *alloca (); #endif /* not __cplusplus */ #endif /* __hpux */ #endif /* not _AIX */ #endif /* not MSDOS, or __TURBOC__ */ #endif /* not sparc. */ #endif /* not GNU C. */ #endif /* alloca not defined. */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. It was written by Richard Stallman by simplifying the hairy parser used when %semantic_parser is specified. */ /* Note: there must be only one dollar sign in this file. It is replaced by the list of actions, each action as one case of the switch. */ #define fparse_yyerrok (fparse_yyerrstatus = 0) #define fparse_yyclearin (fparse_yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 #define YYACCEPT return(0) #define YYABORT return(1) #define YYERROR goto fparse_yyerrlab1 /* Like YYERROR except do call fparse_yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto fparse_yyerrlab #define YYRECOVERING() (!!fparse_yyerrstatus) #define YYBACKUP(token, value) \ do \ if (fparse_yychar == YYEMPTY && fparse_yylen == 1) \ { fparse_yychar = (token), fparse_yylval = (value); \ fparse_yychar1 = YYTRANSLATE (fparse_yychar); \ YYPOPSTACK; \ goto fparse_yybackup; \ } \ else \ { fparse_yyerror ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 #ifndef YYPURE #define YYLEX fparse_yylex() #endif #ifdef YYPURE #ifdef YYLSP_NEEDED #ifdef YYLEX_PARAM #define YYLEX fparse_yylex(&fparse_yylval, &fparse_yylloc, YYLEX_PARAM) #else #define YYLEX fparse_yylex(&fparse_yylval, &fparse_yylloc) #endif #else /* not YYLSP_NEEDED */ #ifdef YYLEX_PARAM #define YYLEX fparse_yylex(&fparse_yylval, YYLEX_PARAM) #else #define YYLEX fparse_yylex(&fparse_yylval) #endif #endif /* not YYLSP_NEEDED */ #endif /* If nonreentrant, generate the variables here */ #ifndef YYPURE int fparse_yychar; /* the lookahead symbol */ YYSTYPE fparse_yylval; /* the semantic value of the */ /* lookahead symbol */ #ifdef YYLSP_NEEDED YYLTYPE fparse_yylloc; /* location data for the lookahead */ /* symbol */ #endif int fparse_yynerrs; /* number of parse errors so far */ #endif /* not YYPURE */ #if YYDEBUG != 0 int fparse_yydebug; /* nonzero means print parse trace */ /* Since this is uninitialized, it does not stop multiple parsers from coexisting. */ #endif /* YYINITDEPTH indicates the initial size of the parser's stacks */ #ifndef YYINITDEPTH #define YYINITDEPTH 200 #endif /* YYMAXDEPTH is the maximum size the stacks can grow to (effective only if the built-in stack extension method is used). */ #if YYMAXDEPTH == 0 #undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH #define YYMAXDEPTH 10000 #endif /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ int fparse_yyparse (void); #endif #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #define __fparse_yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) #else /* not GNU C or C++ */ #ifndef __cplusplus /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ static void __fparse_yy_memcpy (from, to, count) char *from; char *to; int count; { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #else /* __cplusplus */ /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ static void __fparse_yy_memcpy (char *from, char *to, int count) { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #endif #endif #line 192 "/usr/local/lib/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into fparse_yyparse. The argument should have type void *. It should actually point to an object. Grammar actions can access the variable by casting it to the proper pointer type. */ #ifdef YYPARSE_PARAM #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; #else #define YYPARSE_PARAM #define YYPARSE_PARAM_DECL #endif int fparse_yyparse(YYPARSE_PARAM) YYPARSE_PARAM_DECL { register int fparse_yystate; register int fparse_yyn; register short *fparse_yyssp; register YYSTYPE *fparse_yyvsp; int fparse_yyerrstatus; /* number of tokens to shift before error messages enabled */ int fparse_yychar1 = 0; /* lookahead token as an internal (translated) token number */ short fparse_yyssa[YYINITDEPTH]; /* the state stack */ YYSTYPE fparse_yyvsa[YYINITDEPTH]; /* the semantic value stack */ short *fparse_yyss = fparse_yyssa; /* refer to the stacks thru separate pointers */ YYSTYPE *fparse_yyvs = fparse_yyvsa; /* to allow fparse_yyoverflow to reallocate them elsewhere */ #ifdef YYLSP_NEEDED YYLTYPE fparse_yylsa[YYINITDEPTH]; /* the location stack */ YYLTYPE *fparse_yyls = fparse_yylsa; YYLTYPE *fparse_yylsp; #define YYPOPSTACK (fparse_yyvsp--, fparse_yyssp--, fparse_yylsp--) #else #define YYPOPSTACK (fparse_yyvsp--, fparse_yyssp--) #endif int fparse_yystacksize = YYINITDEPTH; #ifdef YYPURE int fparse_yychar; YYSTYPE fparse_yylval; int fparse_yynerrs; #ifdef YYLSP_NEEDED YYLTYPE fparse_yylloc; #endif #endif YYSTYPE fparse_yyval; /* the variable used to return */ /* semantic values from the action */ /* routines */ int fparse_yylen; #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Starting parse\n"); #endif fparse_yystate = 0; fparse_yyerrstatus = 0; fparse_yynerrs = 0; fparse_yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ fparse_yyssp = fparse_yyss - 1; fparse_yyvsp = fparse_yyvs; #ifdef YYLSP_NEEDED fparse_yylsp = fparse_yyls; #endif /* Push a new state, which is found in fparse_yystate . */ /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ fparse_yynewstate: *++fparse_yyssp = fparse_yystate; if (fparse_yyssp >= fparse_yyss + fparse_yystacksize - 1) { /* Give user a chance to reallocate the stack */ /* Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *fparse_yyvs1 = fparse_yyvs; short *fparse_yyss1 = fparse_yyss; #ifdef YYLSP_NEEDED YYLTYPE *fparse_yyls1 = fparse_yyls; #endif /* Get the current used size of the three stacks, in elements. */ int size = fparse_yyssp - fparse_yyss + 1; #ifdef fparse_yyoverflow /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. */ #ifdef YYLSP_NEEDED /* This used to be a conditional around just the two extra args, but that might be undefined if fparse_yyoverflow is a macro. */ fparse_yyoverflow("parser stack overflow", &fparse_yyss1, size * sizeof (*fparse_yyssp), &fparse_yyvs1, size * sizeof (*fparse_yyvsp), &fparse_yyls1, size * sizeof (*fparse_yylsp), &fparse_yystacksize); #else fparse_yyoverflow("parser stack overflow", &fparse_yyss1, size * sizeof (*fparse_yyssp), &fparse_yyvs1, size * sizeof (*fparse_yyvsp), &fparse_yystacksize); #endif fparse_yyss = fparse_yyss1; fparse_yyvs = fparse_yyvs1; #ifdef YYLSP_NEEDED fparse_yyls = fparse_yyls1; #endif #else /* no fparse_yyoverflow */ /* Extend the stack our own way. */ if (fparse_yystacksize >= YYMAXDEPTH) { fparse_yyerror("parser stack overflow"); return 2; } fparse_yystacksize *= 2; if (fparse_yystacksize > YYMAXDEPTH) fparse_yystacksize = YYMAXDEPTH; fparse_yyss = (short *) alloca (fparse_yystacksize * sizeof (*fparse_yyssp)); __fparse_yy_memcpy ((char *)fparse_yyss1, (char *)fparse_yyss, size * sizeof (*fparse_yyssp)); fparse_yyvs = (YYSTYPE *) alloca (fparse_yystacksize * sizeof (*fparse_yyvsp)); __fparse_yy_memcpy ((char *)fparse_yyvs1, (char *)fparse_yyvs, size * sizeof (*fparse_yyvsp)); #ifdef YYLSP_NEEDED fparse_yyls = (YYLTYPE *) alloca (fparse_yystacksize * sizeof (*fparse_yylsp)); __fparse_yy_memcpy ((char *)fparse_yyls1, (char *)fparse_yyls, size * sizeof (*fparse_yylsp)); #endif #endif /* no fparse_yyoverflow */ fparse_yyssp = fparse_yyss + size - 1; fparse_yyvsp = fparse_yyvs + size - 1; #ifdef YYLSP_NEEDED fparse_yylsp = fparse_yyls + size - 1; #endif #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Stack size increased to %d\n", fparse_yystacksize); #endif if (fparse_yyssp >= fparse_yyss + fparse_yystacksize - 1) YYABORT; } #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Entering state %d\n", fparse_yystate); #endif goto fparse_yybackup; fparse_yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* fparse_yyresume: */ /* First try to decide what to do without reference to lookahead token. */ fparse_yyn = fparse_yypact[fparse_yystate]; if (fparse_yyn == YYFLAG) goto fparse_yydefault; /* Not known => get a lookahead token if don't already have one. */ /* fparse_yychar is either YYEMPTY or YYEOF or a valid token in external form. */ if (fparse_yychar == YYEMPTY) { #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Reading a token: "); #endif fparse_yychar = YYLEX; } /* Convert token to internal form (in fparse_yychar1) for indexing tables with */ if (fparse_yychar <= 0) /* This means end of input. */ { fparse_yychar1 = 0; fparse_yychar = YYEOF; /* Don't call YYLEX any more */ #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Now at end of input.\n"); #endif } else { fparse_yychar1 = YYTRANSLATE(fparse_yychar); #if YYDEBUG != 0 if (fparse_yydebug) { fprintf (stderr, "Next token is %d (%s", fparse_yychar, fparse_yytname[fparse_yychar1]); /* Give the individual parser a way to print the precise meaning of a token, for further debugging info. */ #ifdef YYPRINT YYPRINT (stderr, fparse_yychar, fparse_yylval); #endif fprintf (stderr, ")\n"); } #endif } fparse_yyn += fparse_yychar1; if (fparse_yyn < 0 || fparse_yyn > YYLAST || fparse_yycheck[fparse_yyn] != fparse_yychar1) goto fparse_yydefault; fparse_yyn = fparse_yytable[fparse_yyn]; /* fparse_yyn is what to do for this token type in this state. Negative => reduce, -fparse_yyn is rule number. Positive => shift, fparse_yyn is new state. New state is final state => don't bother to shift, just return success. 0, or most negative number => error. */ if (fparse_yyn < 0) { if (fparse_yyn == YYFLAG) goto fparse_yyerrlab; fparse_yyn = -fparse_yyn; goto fparse_yyreduce; } else if (fparse_yyn == 0) goto fparse_yyerrlab; if (fparse_yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Shifting token %d (%s), ", fparse_yychar, fparse_yytname[fparse_yychar1]); #endif /* Discard the token being shifted unless it is eof. */ if (fparse_yychar != YYEOF) fparse_yychar = YYEMPTY; *++fparse_yyvsp = fparse_yylval; #ifdef YYLSP_NEEDED *++fparse_yylsp = fparse_yylloc; #endif /* count tokens shifted since error; after three, turn off error status. */ if (fparse_yyerrstatus) fparse_yyerrstatus--; fparse_yystate = fparse_yyn; goto fparse_yynewstate; /* Do the default action for the current state. */ fparse_yydefault: fparse_yyn = fparse_yydefact[fparse_yystate]; if (fparse_yyn == 0) goto fparse_yyerrlab; /* Do a reduction. fparse_yyn is the number of a rule to reduce with. */ fparse_yyreduce: fparse_yylen = fparse_yyr2[fparse_yyn]; if (fparse_yylen > 0) fparse_yyval = fparse_yyvsp[1-fparse_yylen]; /* implement default value of the action */ #if YYDEBUG != 0 if (fparse_yydebug) { int i; fprintf (stderr, "Reducing via rule %d (line %d), ", fparse_yyn, fparse_yyrline[fparse_yyn]); /* Print the symbols being reduced, and their result. */ for (i = fparse_yyprhs[fparse_yyn]; fparse_yyrhs[i] > 0; i++) fprintf (stderr, "%s ", fparse_yytname[fparse_yyrhs[i]]); fprintf (stderr, " -> %s\n", fparse_yytname[fparse_yyr1[fparse_yyn]]); } #endif switch (fparse_yyn) { case 1: #line 263 "../parse.y" { expr_parsed = fparse_yyvsp[0].expression; ; break;} case 2: #line 266 "../parse.y" { fparse_yyval.expression = fparse_yyvsp[-1].expression; ; break;} case 3: #line 267 "../parse.y" { fparse_yyval.expression = expr_parse_binop('+', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 4: #line 268 "../parse.y" { fparse_yyval.expression = expr_parse_binop('-', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 5: #line 269 "../parse.y" { fparse_yyval.expression = expr_parse_binop('*', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 6: #line 270 "../parse.y" { fparse_yyval.expression = expr_parse_binop('/', fparse_yyvsp[-2].expression, fparse_yyvsp[0].expression); ; break;} case 7: #line 271 "../parse.y" { fparse_yyval.expression = expr_parse_monop('-', fparse_yyvsp[0].expression); ; break;} case 8: #line 272 "../parse.y" { fparse_yyval.expression = expr_parse_monfunc(lookup_monfunc(fparse_yyvsp[-3].string), fparse_yyvsp[-1].expression); ; break;} case 9: #line 273 "../parse.y" { fparse_yyval.expression = expr_parse_binfunc(lookup_binfunc(fparse_yyvsp[-5].string), fparse_yyvsp[-3].expression, fparse_yyvsp[-1].expression); ; break;} case 10: #line 274 "../parse.y" { fparse_yyval.expression = expr_parse_var(fparse_yyvsp[0].string); ; break;} case 11: #line 275 "../parse.y" { fparse_yyval.expression = expr_parse_num(fparse_yyvsp[0].number); ; break;} } /* the action file gets copied in in place of this dollarsign */ #line 487 "/usr/local/lib/bison.simple" fparse_yyvsp -= fparse_yylen; fparse_yyssp -= fparse_yylen; #ifdef YYLSP_NEEDED fparse_yylsp -= fparse_yylen; #endif #if YYDEBUG != 0 if (fparse_yydebug) { short *ssp1 = fparse_yyss - 1; fprintf (stderr, "state stack now"); while (ssp1 != fparse_yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif *++fparse_yyvsp = fparse_yyval; #ifdef YYLSP_NEEDED fparse_yylsp++; if (fparse_yylen == 0) { fparse_yylsp->first_line = fparse_yylloc.first_line; fparse_yylsp->first_column = fparse_yylloc.first_column; fparse_yylsp->last_line = (fparse_yylsp-1)->last_line; fparse_yylsp->last_column = (fparse_yylsp-1)->last_column; fparse_yylsp->text = 0; } else { fparse_yylsp->last_line = (fparse_yylsp+fparse_yylen-1)->last_line; fparse_yylsp->last_column = (fparse_yylsp+fparse_yylen-1)->last_column; } #endif /* Now "shift" the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ fparse_yyn = fparse_yyr1[fparse_yyn]; fparse_yystate = fparse_yypgoto[fparse_yyn - YYNTBASE] + *fparse_yyssp; if (fparse_yystate >= 0 && fparse_yystate <= YYLAST && fparse_yycheck[fparse_yystate] == *fparse_yyssp) fparse_yystate = fparse_yytable[fparse_yystate]; else fparse_yystate = fparse_yydefgoto[fparse_yyn - YYNTBASE]; goto fparse_yynewstate; fparse_yyerrlab: /* here on detecting error */ if (! fparse_yyerrstatus) /* If not already recovering from an error, report this error. */ { ++fparse_yynerrs; #ifdef YYERROR_VERBOSE fparse_yyn = fparse_yypact[fparse_yystate]; if (fparse_yyn > YYFLAG && fparse_yyn < YYLAST) { int size = 0; char *msg; int x, count; count = 0; /* Start X at -fparse_yyn if nec to avoid negative indexes in fparse_yycheck. */ for (x = (fparse_yyn < 0 ? -fparse_yyn : 0); x < (sizeof(fparse_yytname) / sizeof(char *)); x++) if (fparse_yycheck[x + fparse_yyn] == x) size += strlen(fparse_yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); if (msg != 0) { strcpy(msg, "parse error"); if (count < 5) { count = 0; for (x = (fparse_yyn < 0 ? -fparse_yyn : 0); x < (sizeof(fparse_yytname) / sizeof(char *)); x++) if (fparse_yycheck[x + fparse_yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); strcat(msg, fparse_yytname[x]); strcat(msg, "'"); count++; } } fparse_yyerror(msg); free(msg); } else fparse_yyerror ("parse error; also virtual memory exceeded"); } else #endif /* YYERROR_VERBOSE */ fparse_yyerror("parse error"); } goto fparse_yyerrlab1; fparse_yyerrlab1: /* here on error raised explicitly by an action */ if (fparse_yyerrstatus == 3) { /* if just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (fparse_yychar == YYEOF) YYABORT; #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Discarding token %d (%s).\n", fparse_yychar, fparse_yytname[fparse_yychar1]); #endif fparse_yychar = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ fparse_yyerrstatus = 3; /* Each real token shifted decrements this */ goto fparse_yyerrhandle; fparse_yyerrdefault: /* current state does not do anything special for the error token. */ #if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ fparse_yyn = fparse_yydefact[fparse_yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ if (fparse_yyn) goto fparse_yydefault; #endif fparse_yyerrpop: /* pop the current state because it cannot handle the error token */ if (fparse_yyssp == fparse_yyss) YYABORT; fparse_yyvsp--; fparse_yystate = *--fparse_yyssp; #ifdef YYLSP_NEEDED fparse_yylsp--; #endif #if YYDEBUG != 0 if (fparse_yydebug) { short *ssp1 = fparse_yyss - 1; fprintf (stderr, "Error: state stack now"); while (ssp1 != fparse_yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif fparse_yyerrhandle: fparse_yyn = fparse_yypact[fparse_yystate]; if (fparse_yyn == YYFLAG) goto fparse_yyerrdefault; fparse_yyn += YYTERROR; if (fparse_yyn < 0 || fparse_yyn > YYLAST || fparse_yycheck[fparse_yyn] != YYTERROR) goto fparse_yyerrdefault; fparse_yyn = fparse_yytable[fparse_yyn]; if (fparse_yyn < 0) { if (fparse_yyn == YYFLAG) goto fparse_yyerrpop; fparse_yyn = -fparse_yyn; goto fparse_yyreduce; } else if (fparse_yyn == 0) goto fparse_yyerrpop; if (fparse_yyn == YYFINAL) YYACCEPT; #if YYDEBUG != 0 if (fparse_yydebug) fprintf(stderr, "Shifting error token, "); #endif *++fparse_yyvsp = fparse_yylval; #ifdef YYLSP_NEEDED *++fparse_yylsp = fparse_yylloc; #endif fparse_yystate = fparse_yyn; goto fparse_yynewstate; } #line 279 "../parse.y" /* more c */ geomview-1.9.4/src/lib/fexpr/parse.tab.h0000644000175000001440000000207310455701000014767 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ typedef union { char *string; struct expr_tree *expression; double number; } YYSTYPE; #define IDENT 258 #define NUMBER 259 #define MINUS 260 extern YYSTYPE fparse_yylval; geomview-1.9.4/src/lib/fexpr/real.c0000644000175000001440000000304610455701001014030 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "fexpr.h" double freal_cot(double a) { return cos(a)/sin(a); } double freal_sec(double a) { return 1/cos(a); } double freal_csc(double a) { return 1/sin(a); } double freal_re(double a) { return a; } double freal_im(double a) { return 0; } double freal_monstub(double a) { double b = 0.0; double c = 0.0; return b/c; } double freal_binstub(double a1, double a2) { double a = 0.0; double b = 0.0; return a/b; } geomview-1.9.4/src/lib/fexpr/vars.c0000644000175000001440000000434610455701001014064 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "fexpr.h" #include #include expr_var expr_create_variable(struct expression *e, char *name, double val) { int i; if (e->varnames) for (i=0; invars; i++) if (!strcmp(e->varnames[i], name)) { e->varvals[i].real = val; return i; } if (e->nvars) { e->varnames = realloc(e->varnames, (1+e->nvars)*sizeof(char *)); e->varvals = realloc (e->varvals, (1+e->nvars)*sizeof(fcomplex)); } else { e->varnames = malloc ((e->nvars+1)*sizeof(char *)); e->varvals = malloc ((e->nvars+1) * sizeof(fcomplex)); } e->varnames[e->nvars] = malloc(strlen(name)+1); strcpy (e->varnames[e->nvars],name); e->varvals[e->nvars].real = val; e->varvals[e->nvars].imag = 0; return e->nvars++; } void expr_set_variable(struct expression *e, expr_var v, double val) { e->varvals[v].real = val; } double expr_get_variable(struct expression *e, expr_var v) { return e->varvals[v].real; } void expr_set_variable_complex(struct expression *e, expr_var v, fcomplex*val) { e->varvals[v] = *val; } void expr_get_variable_complex(struct expression *e, expr_var v,fcomplex *op) { *op = e->varvals[v]; } geomview-1.9.4/src/lib/fexpr/binfuncs.c0000644000175000001440000000237210455701000014714 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "fexpr.h" #include #include #include struct expr_binfunc expr_binfuncs[]= { DEFAULT_EXPR_BINFUNCS, {NULL, NULL, NULL} }; geomview-1.9.4/src/lib/fexpr/Headers0000644000175000001440000000002407730236324014245 00000000000000fexpr.h fexprnew.h geomview-1.9.4/src/lib/forms/0000777000175000001440000000000010665240677013050 500000000000000geomview-1.9.4/src/lib/forms/Makefile.am0000644000175000001440000000010407730236363015007 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers xforms-compat.h geomview-1.9.4/src/lib/forms/Makefile.in0000644000175000001440000002462710665240500015025 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/forms DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers xforms-compat.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/forms/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/forms/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/forms/xforms-compat.h0000644000175000001440000000464410461140703015723 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Include this file after forms.h, but before Forms-designer-generated code. */ #if defined(FL_INCLUDE_VERSION) || defined(FL_FORMS_H) #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef XFORMS # define XFORMS 1 #endif #define foreground() /* nothing */ #define winset(w) fl_winset(w) #define winpop() (fl_winget() && XRaiseWindow(fl_display, fl_winget())) #define minsize(x, y) fl_winminsize(fl_winget(), x, y) #define maxsize(x, y) fl_winmaxsize(fl_winget(), x, y) #if FL_INCLUDE_VERSION <= 75 /* Old XForms */ #define FL_INITIALIZE(name) { \ static int argc = 1; \ static char *argv[] = {name, 0}; \ fl_initialize(argv[0],argv[0], NULL, 0, &argc, argv); \ } #define DrawButton DrawBtn /* Avoid name conflict with XForms typedef! */ #define FLXWRAPPER(xfunc, formsfunc) \ FL_OBJECT *xfunc(int kind, float x, float y, float w, float h, char *name) { \ return formsfunc(kind, x, y, w, h, name); \ } #else /* Modern XForms */ #define FL_INITIALIZE(name) { \ static int argc = 1; \ static char *argv[] = {name, 0}; \ fl_initialize(&argc, argv, argv[0], 0, 0); \ } extern inline void flx_end_form() { FL_OBJECT *obj = NULL; if(fl_current_form) obj = fl_current_form->first; for( ; obj; obj = obj->next) { obj->y = fl_current_form->h - obj->y - obj->h; if(obj->col1 == 47) obj->col1 = FL_COL1; if(obj->col2 == 47) obj->col2 = FL_COL1; } fl_end_form(); } #define fl_end_form() flx_end_form() #endif #else /* Non-XForms */ #define FL_INITIALIZE(name) /* nothing */ #endif geomview-1.9.4/src/lib/forms/Headers0000644000175000001440000000002007730236363014246 00000000000000xforms-compat.h geomview-1.9.4/src/lib/gprim/0000777000175000001440000000000010665240675013036 500000000000000geomview-1.9.4/src/lib/gprim/bbox/0000777000175000001440000000000010665240671013764 500000000000000geomview-1.9.4/src/lib/gprim/bbox/bboxload.c0000644000175000001440000000474210521221056015630 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" BBox * BBoxFLoad(IOBFILE *f, char *fname) { BBox *bbox; char *token = GeomToken(f); int dimn = 3, nd = 0, pdim = 4; HPointN *min, *max; HPtNCoord *minv, *maxv; if(*token == '4') { dimn = 4; token++; } if(*token == 'n') { nd = 1; token++; } if(strcmp(token, "BBOX")) return NULL; if(nd) { if(iobfgetni(f, 1, &pdim, 0) <= 0) { OOGLSyntax(f, "Reading nBBOX from \"%s\": Expected dimension", fname); return NULL; } ++pdim; } if (pdim == 4) { if (dimn == 4) { pdim++; } min = HPtNCreate(pdim, NULL); max = HPtNCreate(pdim, NULL); minv = min->v+1; maxv = max->v+1; } else { min = HPtNCreate(pdim, NULL); max = HPtNCreate(pdim, NULL); if (dimn == 4) { minv = min->v; maxv = max->v; } else { minv = min->v+1; maxv = max->v+1; dimn = pdim-1; } } if(iobfgetnf(f, dimn, minv, 0) != dimn || iobfgetnf(f, dimn, maxv, 0) != dimn) { OOGLSyntax(f, "Reading BBOX from \"%s\": expected %d floats", fname, dimn * 2); HPtNDelete(min); HPtNDelete(max); return NULL; } bbox = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, min, CR_NMAX, max, CR_END); return bbox; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bbox/bboxsave.c0000644000175000001440000000316010516717553015660 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" BBox *BBoxFSave(BBox *bbox, FILE *f, char *fname) { int i; if (bbox->pdim == 4) { fprintf(f, "BBOX\n"); } else { fprintf(f, "nBBOX %d\n", bbox->pdim-1); } for (i = 1; i < bbox->pdim; i++) { fprintf(f, " %g", bbox->min->v[i]); } fprintf(f, "\n"); for (i = 1; i < bbox->pdim; i++) { fprintf(f, " %g", bbox->max->v[i]); } return bbox; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bbox/bboxtransform.c0000644000175000001440000000656310517007734016741 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" static BBox *BBoxTransformN(BBox *bbox, TransformN *TN) { int dim, numvert, i, j; HPointN **ptN, *p; HPtNCoord c = bbox->min->v[0] != 1.0 ? bbox->min->v[0] : 1.0; HPtNCoord C = bbox->max->v[0] != 1.0 ? bbox->max->v[0] : 1.0; if (!TN) return bbox; dim = bbox->pdim-1; numvert = 1 << dim; ptN = (HPointN **)alloca(numvert*sizeof(HPointN *)); for (i = 0; i < numvert; i++) { ptN[i] = HPtNCreate(bbox->pdim, NULL); for (j = 1; j < bbox->pdim; j++) { ptN[i]->v[j] = (i & (1 << j)) ? bbox->min->v[j]/c : bbox->max->v[j]/C; } } p = ptN[0]; HPtNTransform(TN, p, p); HPtNDehomogenize(p, p); HPtNCopy(p, bbox->min); HPtNCopy(p, bbox->max); HPtNDelete(p); for (i = 1; i < numvert; i++) { p = ptN[i]; HPtNTransform(TN, p, p); HPtNDehomogenize(p, p); for (j = 1; j < bbox->pdim; j++) { if (p->v[j] < bbox->min->v[j]) bbox->min->v[j] = p->v[j]; else if (p->v[j] > bbox->max->v[j]) bbox->max->v[j] = p->v[j]; } HPtNDelete(p); } return bbox; } BBox *BBoxTransform(BBox *bbox, Transform T, TransformN *TN) { int dim, numvert, i, j; HPointN **ptN, *p; HPtNCoord c = bbox->min->v[0] != 1.0 ? bbox->min->v[0] : 1.0; HPtNCoord C = bbox->max->v[0] != 1.0 ? bbox->max->v[0] : 1.0; if ((!T || T == TM_IDENTITY) && !TN) return bbox; if (TN) { return BBoxTransformN(bbox, TN); } dim = bbox->pdim-1; numvert = 1 << dim; ptN = (HPointN **)alloca(numvert*sizeof(HPointN *)); for (i = 0; i < numvert; i++) { ptN[i] = HPtNCreate(bbox->pdim, NULL); for (j = 1; j < bbox->pdim; j++) { ptN[i]->v[j] = (i & (1 << j)) ? bbox->min->v[j]/c : bbox->max->v[j]/C; } } p = ptN[0]; HPtNTransform3(T, NULL, p, p); HPtNDehomogenize(p, p); HPtNCopy(p, bbox->min); HPtNCopy(p, bbox->max); HPtNDelete(p); for (i = 1; i < numvert; i++) { p = ptN[i]; HPtNTransform3(T, NULL, p, p); HPtNDehomogenize(p, p); for (j = 1; j < bbox->pdim; j++) { if (p->v[j] < bbox->min->v[j]) bbox->min->v[j] = p->v[j]; else if (p->v[j] > bbox->max->v[j]) bbox->max->v[j] = p->v[j]; } HPtNDelete(p); } return bbox; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bbox/bboxbound.c0000644000175000001440000000567710517007273016040 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" BBox *BBoxBound(BBox *bbox, Transform T, TransformN *TN) { if (bbox == NULL) return NULL; if (bbox->pdim < 4) return NULL; /* should not happen */ if (!T && !TN) { return (BBox *)GeomCopy((Geom *)bbox); } if (TN) { /* real ND bbox */ int i; HPointN *minN; HPointN *maxN; HPtNCoord tmp; BBox *result; minN = HPtNTransform(TN, bbox->min, NULL); maxN = HPtNTransform(TN, bbox->max, NULL); HPtNDehomogenize(minN, minN); HPtNDehomogenize(maxN, maxN); /* and now swap coordinates between min and max as necessary */ for (i = 1; i < TN->odim; i++) { if (minN->v[i] > maxN->v[i]) { tmp = maxN->v[i]; maxN->v[i] = minN->v[i]; minN->v[i] = tmp; } } /* At this point we are ready to generate an Nd bounding box */ result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(minN); HPtNDelete(maxN); return result; } if (T) { HPoint3 min, max; HPt3Coord tmp; HPtNToHPt3(bbox->min, NULL, &min); HPtNToHPt3(bbox->max, NULL, &max); HPt3Transform(T, &min, &min); HPt3Transform(T, &max, &max); HPt3Dehomogenize(&min, &min); HPt3Dehomogenize(&max, &max); /* and now swap coordinates between min and max as necessary */ if (min.x > max.x) { tmp = max.x; max.x = min.x; min.x = tmp; } if (min.y > max.y) { tmp = max.y; max.y = min.y; min.y = tmp; } if (min.z > max.z) { tmp = max.z; max.z = min.z; min.z = tmp; } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bbox/bboxcenter.c0000644000175000001440000000333710517011550016171 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "bboxP.h" static void _BBoxCenter(BBox *bbox, HPtNCoord *center) { int i; HPtNDehomogenize(bbox->min, bbox->min); HPtNDehomogenize(bbox->max, bbox->max); center[0] = 1.0; for (i = 1; i < bbox->pdim; i++) { center[i] = 0.5 * (bbox->min->v[i] + bbox->max->v[i]); } } HPointN *BBoxCenterND(BBox *bbox, HPointN *center) { if (!center) { center = HPtNCreate(bbox->pdim, NULL); } else if (center->dim != bbox->pdim) { center->v= OOGLRenewNE(HPtNCoord, center->v, bbox->pdim, "renew HPointN"); center->dim = bbox->pdim; } _BBoxCenter(bbox, (HPtNCoord *)center->v); return center; } void BBoxCenter(BBox *bbox, HPoint3 *center) { HPointN *Ncenter; Ncenter = BBoxCenterND(bbox, NULL); HPtNToHPt3(Ncenter, NULL, center); HPtNDelete(Ncenter); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bbox/bboxclass.c0000644000175000001440000000454110516545743016033 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" static GeomClass *aBBoxMethods = NULL; int BBoxPresent = 1; static char bboxName[] = "bbox"; extern BBox *BBoxCopy ( BBox * ); extern BBox *BBoxDelete ( BBox * ); extern BBox *BBoxCreate (BBox *exist, GeomClass *classp, va_list *a_list); extern BBox *BBoxFSave( BBox *, FILE *, char * ); extern BBox *BBoxFLoad( FILE *, char * ); extern int BBoxGet(BBox *bbox, int attr, void *attrp); char * BBoxName() { return bboxName; } GeomClass * BBoxMethods() { if (!aBBoxMethods) { aBBoxMethods = GeomClassCreate(bboxName); aBBoxMethods->name = (GeomNameFunc *) BBoxName; aBBoxMethods->bound = (GeomBoundFunc *) BBoxBound; aBBoxMethods->copy = (GeomCopyFunc *) BBoxCopy; aBBoxMethods->create = (GeomCreateFunc *) BBoxCreate; aBBoxMethods->Delete = (GeomDeleteFunc *) BBoxDelete; aBBoxMethods->draw = (GeomDrawFunc *) BBoxDraw; aBBoxMethods->methods = (GeomMethodsFunc *) BBoxMethods; aBBoxMethods->name = (GeomNameFunc *) BBoxName; aBBoxMethods->transform = (GeomTransformFunc *) BBoxTransform; aBBoxMethods->fsave = (GeomFSaveFunc *) BBoxFSave; aBBoxMethods->fload = (GeomFLoadFunc *) BBoxFLoad; aBBoxMethods->get = (GeomGetFunc *)BBoxGet; } return aBBoxMethods; } geomview-1.9.4/src/lib/gprim/bbox/bbox.h0000644000175000001440000000337710514661167015015 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef BBOXDEF #define BBOXDEF #include "geom.h" #define BBOXMAGIC GeomMagic ('x', 1) typedef struct BBox BBox; extern GeomClass *BBoxMethods( void ); extern char *BBoxName( void ); extern BBox *BBoxBound( BBox *, Transform T, TransformN *TN); extern BBox *BBoxDraw( BBox * ); extern BBox *BBoxTransform( BBox *, Transform T, TransformN *TN ); extern BBox *BBoxMinMax( BBox *, HPoint3 *min, HPoint3 *max ); extern BBox *BBoxMinMaxND( BBox *, HPointN **min, HPointN **max ); extern void BBoxCenter(BBox *bbox, HPoint3 *center); extern HPointN *BBoxCenterND(BBox *bbox, HPointN *center); extern BBox *BBoxUnion( BBox *, BBox * ); extern BBox *BBoxUnion3( BBox *b1, BBox *b2, BBox *result ); #ifdef GEOM_SM extern int BBoxShare( Geom *obj, GeomSMRegion *sm ); extern BBox *BBoxPrivate(); #endif #endif geomview-1.9.4/src/lib/gprim/bbox/Makefile.am0000644000175000001440000000041210511417162015720 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libbbox.la libbbox_la_SOURCES = \ bboxbound.c bboxclass.c bboxcopy.c bboxcreate.c bboxdraw.c bboxload.c \ bboxminmax.c bboxcenter.c bboxsave.c bboxtransform.c bboxunion.c \ bbox.h bboxP.h geomview-1.9.4/src/lib/gprim/bbox/Makefile.in0000644000175000001440000003724410665240502015750 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/bbox DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libbbox_la_LIBADD = am_libbbox_la_OBJECTS = bboxbound.lo bboxclass.lo bboxcopy.lo \ bboxcreate.lo bboxdraw.lo bboxload.lo bboxminmax.lo \ bboxcenter.lo bboxsave.lo bboxtransform.lo bboxunion.lo libbbox_la_OBJECTS = $(am_libbbox_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libbbox_la_SOURCES) DIST_SOURCES = $(libbbox_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libbbox.la libbbox_la_SOURCES = \ bboxbound.c bboxclass.c bboxcopy.c bboxcreate.c bboxdraw.c bboxload.c \ bboxminmax.c bboxcenter.c bboxsave.c bboxtransform.c bboxunion.c \ bbox.h bboxP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/bbox/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/bbox/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbbox.la: $(libbbox_la_OBJECTS) $(libbbox_la_DEPENDENCIES) $(LINK) $(libbbox_la_OBJECTS) $(libbbox_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxcenter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxminmax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxtransform.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bboxunion.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/bbox/bboxP.h0000644000175000001440000000333510516545742015131 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef BBOXPDEF #define BBOXPDEF #include "geomclass.h" #include "bbox.h" #include "hpointn.h" /* * The vert[] array lists vertices, indexed by binary order of initial axes, * where X has weight 1, Y weight 2, Z weight 4. * Initially "min" corresponds to 0, "max" to 1. * Specifically GeomCreate("bbox", CR_MIN, min, CR_MAX, max) makes a bbox with: * vert[0] = (min.x, min.y, min.z) * vert[1] = (max.x, min.y, min.z) * vert[2] = (min.x, max.y, min.z) ... * vert[7] = (max.x, max.y, max.z). * Note this property isn't necessarily preserved if the bbox is transformed. */ /* We always use projective coordinates, i.e. min and max are vectors * of length pdim */ struct BBox { GEOMFIELDS; HPointN *center; HPointN *min, *max; }; #endif /* ! BBOXPDEF */ geomview-1.9.4/src/lib/gprim/bbox/bboxminmax.c0000644000175000001440000000335610516715143016213 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" BBox *BBoxMinMax(BBox *bbox, HPoint3 *min, HPoint3 *max) { static HPoint3 nullpoint = {0,0,0,1}; if (bbox != NULL) { HPtNToHPt3(bbox->min, NULL, min); HPtNToHPt3(bbox->max, NULL, max); } else { *min = nullpoint; *max = nullpoint; } return bbox; } BBox *BBoxMinMaxND(BBox *bbox, HPointN **min, HPointN **max) { if (bbox != NULL) { *min = HPtNCopy(bbox->min, *min); *max = HPtNCopy(bbox->max, *max); } else { *min = NULL; *max = NULL; } return bbox; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bbox/bboxunion.c0000644000175000001440000000473310517010005016034 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" #define BB_MIN(a,b) ( (a) <= (b) ? a : b ) #define BB_MAX(a,b) ( (a) >= (b) ? a : b ) BBox * BBoxUnion(BBox *bbox1, BBox *bbox2) { return BBoxUnion3(bbox1, bbox2, NULL); } BBox * BBoxUnion3(BBox *bbox1, BBox *bbox2, BBox *result) { /* TAKE CARE OF THE CASE OF EITHER CUBE BEING NULL */ if (!bbox1) { if(!bbox2) { static Point Max = { -1e10,-1e10,-1e10, 1 }; static Point Min = { 1e10, 1e10, 1e10, 1 }; return (BBox *)GeomCCreate((Geom *)result, BBoxMethods(), CR_4MIN, Min, CR_4MAX, Max, CR_END); } bbox1 = bbox2; bbox2 = NULL; } /* Make sure bbox1 is the one with the larger dimension */ if (bbox2 && bbox2->pdim > bbox1->pdim) { BBox *bboxswap = bbox1; bbox1 = bbox2; bbox2 = bboxswap; } result = (BBox *)GeomCCreate((Geom *)result, BBoxMethods(), CR_NMIN, bbox1->min, CR_NMAX, bbox1->max, CR_END); if (bbox2) { int i; for (i = 1; i < bbox2->pdim; i++) { if (result->min->v[i] > bbox2->min->v[i]) { result->min->v[i] = bbox2->min->v[i]; } if (result->max->v[i] < bbox2->max->v[i]) { result->max->v[i] = bbox2->max->v[i]; } } result->center = BBoxCenterND(result, result->center); } return result; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bbox/bboxcopy.c0000644000175000001440000000305610516713412015666 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" BBox *BBoxCopy(BBox *source_bbox) { BBox *dest_bbox; if(source_bbox == NULL) return NULL; if ((dest_bbox = GeomNew(BBox)) == NULL) { GeomError(0, "Can't allocate space for BBox"); return NULL; } *dest_bbox = *source_bbox; dest_bbox->min = HPtNCopy(dest_bbox->min, NULL); dest_bbox->max = HPtNCopy(dest_bbox->max, NULL); return (dest_bbox); } geomview-1.9.4/src/lib/gprim/bbox/bboxdraw.c0000644000175000001440000001003310557142374015652 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" #include "mg.h" #include "hpointn.h" #include #ifndef alloca #include #endif static void draw_projected_bbox(mgNDctx *NDctx, BBox *bbox, const Appearance *ap) { int i, e, numvert, dim; ColorA edgecolor; HPointN *ptN; HPoint3 *pts3; mgNDmapfunc mapHPtN = NDctx->mapHPtN; *(Color *)(void *)&edgecolor = ap->mat->edgecolor; edgecolor.a = 1; dim = bbox->pdim-1; HPtNDehomogenize(bbox->min, bbox->min); HPtNDehomogenize(bbox->max, bbox->max); ptN = HPtNCreate(dim+1, NULL); numvert = 1 << dim; pts3 = (HPoint3 *)alloca(numvert*sizeof(HPoint3)); for (i = 0; i < numvert; i++) { int mask; for (mask = 1, e = 1; e < dim+1; e++, mask <<= 1) { ptN->v[e] = (i & mask) ? bbox->min->v[e] : bbox->max->v[e]; } mapHPtN(NDctx, ptN, &pts3[i], NULL); } HPtNDelete(ptN); *(Color *)(void *)&edgecolor = ap->mat->edgecolor; edgecolor.a = 1; for(i = 0; i < numvert; i++) { int j, incr; HPoint3 edge[2]; for(j = 0; j < dim; j ++) { /* connect this vertex to its nearest neighbors if they * follow it in lexicographical order */ incr = 1 << j; /* is the j_th bit a zero? */ if ( ! (i & incr) ) { /* if so, draw the edge to the vertex whose number is * gotten from i by making the j_th bit a one */ edge[0] = pts3[i]; edge[1] = pts3[i + incr]; mgpolyline(2, edge, 1, &edgecolor, 0) ; } } } } BBox *BBoxDraw(BBox *bbox) { int i, numvert; const int dimn = 3; HPoint3 vert[16]; HPoint3 min, max; ColorA edgecolor; const Appearance *ap = mggetappearance(); mgNDctx *NDctx = NULL; if(!(ap->flag & APF_EDGEDRAW)) return bbox; mgctxget(MG_NDCTX, &NDctx); if (NDctx) { draw_projected_bbox(NDctx, bbox, ap); return bbox; } HPtNToHPt3(bbox->min, NULL, &min); HPtNToHPt3(bbox->max, NULL, &max); /* dehomogenize min, max vals */ HPt3Dehomogenize(&min, &min); HPt3Dehomogenize(&max, &max); /* fill in the vertices of the (hyper) cube */ for(i = 0; i < (1 << dimn); i++) { vert[i].x = i&1 ? min.x : max.x; vert[i].y = i&2 ? min.y : max.y; vert[i].z = i&4 ? min.z : max.z; vert[i].w = 1.0; } numvert = 1 << dimn; /* turn on the edge color to draw the bbox */ *(Color *)(void *)&edgecolor = ap->mat->edgecolor; edgecolor.a = 1; for(i = 0; i < numvert; i++) { int j, incr; HPoint3 edge[2]; for(j = 0; j < dimn; j ++) { /* connect this vertex to its nearest neighbors if they * follow it in lexicographical order */ incr = 1 << j; /* is the j_th bit a zero? */ if ( ! (i & incr) ) { /* if so, draw the edge to the vertex whose number is * gotten from i by making the j_th bit a one */ edge[0] = vert[i]; edge[1] = vert[i + incr]; mgpolyline(2, edge, 1, &edgecolor, 0) ; } } } return bbox; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bbox/Headers0000644000175000001440000000001707730236723015176 00000000000000bbox.h bboxP.h geomview-1.9.4/src/lib/gprim/bbox/bboxcreate.c0000644000175000001440000001465710532356175016177 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" #include "appearance.h" #ifndef max # define max(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef min # define min(a,b) ((a) < (b) ? (a) : (b)) #endif /* Retrieve min/max/center of bbox */ int BBoxGet(BBox *bbox, int attr, void *attrp) { HPoint3 min3, max3; switch (attr) { case CR_FLAG: *(int *)attrp = 0; break; case CR_MIN: HPtNToHPt3(bbox->min, NULL, &min3); HPt3Dehomogenize(&min3, &min3); *(Point3 *)attrp = *(Point3 *)(void *)&min3; break; case CR_MAX: HPtNToHPt3(bbox->max, NULL, &max3); HPt3Dehomogenize(&max3, &max3); *(Point3 *)attrp = *(Point3 *)(void *)&max3; break; case CR_4MIN: HPtNToHPt3(bbox->min, NULL, (HPoint3 *)attrp); break; case CR_4MAX: HPtNToHPt3(bbox->max, NULL, (HPoint3 *)attrp); break; case CR_NMIN: *(HPointN **)attrp = HPtNCopy(bbox->min, NULL); break; case CR_NMAX: *(HPointN **)attrp = HPtNCopy(bbox->max, NULL); break; case CR_CENTER: HPtNToHPt3(bbox->center, NULL, (HPoint3 *)attrp); break; case CR_NCENTER: *(HPointN **)attrp = HPtNCopy(bbox->center, NULL); break; default: return -1; } return 1; } /*-------------------------------------------------------------------------- * Function: BBoxCreate * Description: creates or edits a bounding box * Args: BBox *exist: existing bbox to be edited, if using editing. * NULL otherwise. * GeomClass *classp: * a_list: List of option type - option pairs. Option types * are specified by integers, with 0 signifying end of * list. * Returns: Pointer to BBox created or edited. */ BBox *BBoxCreate (BBox *exist, GeomClass *classp, va_list *a_list) { HPoint3 min3, max3; int min3p = 0, max3p = 0; HPointN *minN = NULL, *maxN = NULL; int minNp = 0, maxNp = 0; BBox *bbox; int attr, copy = 1, need_update = 0; if (exist == NULL) { bbox = OOGLNewE(BBox, "BBoxCreate BBox"); bbox->min = HPtNCreate(4, NULL); bbox->max = HPtNCreate(4, NULL); bbox->center = HPtNCreate(4, NULL); GGeomInit (bbox, classp, BBOXMAGIC, NULL); } else { /* FIXME: Check that exist is in fact a BBox. */ bbox = exist; } while ((attr = va_arg (*a_list, int))) { switch (attr) { case CR_FLAG: break; case CR_MIN: if (minNp || maxNp) { OOGLError(1, "BBoxCreate(): ND minimum already specified.\n"); goto error; } Pt3ToHPt3(va_arg(*a_list, Point3 *), &min3, 1); min3p = need_update = 1; break; case CR_MAX: if (minNp || maxNp) { OOGLError(1, "BBoxCreate(): ND maximum already specified.\n"); goto error; } Pt3ToHPt3(va_arg(*a_list, Point3 *), &max3, 1); max3p = need_update = 1; break; case CR_4MIN: if (minNp || maxNp) { OOGLError(1, "BBoxCreate(): ND minimum already specified.\n"); goto error; } min3 = *va_arg(*a_list, HPoint3 *); min3p = need_update = 1; break; case CR_4MAX: if (minNp || maxNp) { OOGLError(1, "BBoxCreate(): ND maximum already specified.\n"); goto error; } max3 = *va_arg(*a_list, HPoint3 *); max3p = need_update = 1; break; case CR_NMIN: if (min3p || max3p) { OOGLError(1, "BBoxCreate(): 3D minimum already specified.\n"); goto error; } minN = va_arg(*a_list, HPointN *); minNp = need_update = 1; break; case CR_NMAX: if (min3p || max3p) { OOGLError(1, "BBoxCreate(): 3D maximum already specified.\n"); goto error; } maxN = va_arg(*a_list, HPointN *); maxNp = need_update = 1; break; default: if (GeomDecorate (bbox, ©, attr, a_list)) { OOGLError(0, "BBoxCreate: Undefined attribute: %d", attr); HPtNDelete(bbox->min); HPtNDelete(bbox->max); HPtNDelete(bbox->center); OOGLFree(bbox); return NULL; } } } /* The VERT_4D flag is set by GeomDecorate(), so it is only now that * we can decide what to do. */ if (need_update) { int pdim = bbox->pdim; if (min3p && max3p) { if (bbox->geomflags & VERT_4D) pdim = 5; else pdim = 4; } if (minNp) { pdim = max(pdim, minN->dim); } if (maxNp) { pdim = max(pdim, maxN->dim); } if (bbox->min->dim != pdim) { bbox->min->v = OOGLRenewNE(HPtNCoord, bbox->min->v, pdim, "Renew min coords"); bbox->min->dim = pdim; } if (bbox->max->dim != pdim) { bbox->max->v = OOGLRenewNE(HPtNCoord, bbox->max->v, pdim, "Renew max coords"); bbox->max->dim = pdim; } if (min3p) { if (bbox->geomflags & VERT_4D) Pt4ToHPtN(&min3, bbox->min); else HPt3ToHPtN(&min3, NULL, bbox->min); } if (max3p) { if (bbox->geomflags & VERT_4D) Pt4ToHPtN(&max3, bbox->max); else HPt3ToHPtN(&max3, NULL, bbox->max); } if (minNp) { HPtNCopy(minN, bbox->min); } if (maxNp) { HPtNCopy(maxN, bbox->max); } bbox->pdim = pdim; bbox->center = BBoxCenterND(bbox, bbox->center); } bbox->geomflags &= ~VERT_4D; /* bboxes are always N-dim */ if (exist != NULL) return exist; return bbox; error: HPtNDelete(bbox->min); HPtNDelete(bbox->max); HPtNDelete(bbox->center); OOGLFree(bbox); return NULL; } void BBoxDelete(BBox *bbox) { if (bbox) { HPtNDelete(bbox->min); HPtNDelete(bbox->max); HPtNDelete(bbox->center); } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/0000777000175000001440000000000010665240673013763 500000000000000geomview-1.9.4/src/lib/gprim/geom/geomclass.h0000644000175000001440000002056610624071442016025 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef GEOMCLASSDEF #define GEOMCLASSDEF #undef GEOM_SM #include "geom.h" #include "appearance.h" #include "ooglutil.h" #include "pick.h" #include "bsptree.h" #include "freelist.h" #include "dbllist.h" typedef char *GeomNameFunc( void ); typedef GeomClass *GeomMethodsFunc( Geom *object ); typedef Geom *GeomMessageFunc( Geom *, int ac, char *av[] ); typedef Geom *GeomCopyFunc( Geom *object ); typedef Geom *GeomCreateFunc( Geom *existing, GeomClass *Class, va_list *args ); typedef int GeomGetFunc( Geom *g, int attribute, void *attrp ); typedef int GeomDeleteFunc( Geom *object ); typedef Geom *GeomReplaceFunc( Geom *object, Geom *newchild ); typedef Geom *GeomIterateFunc( GeomIter *iter, int op ); /* What should the interface be? */ typedef Geom *GeomLoadFunc( char *name ); typedef Geom *GeomFLoadFunc( IOBFILE *file, char *name ); typedef Geom *GeomSaveFunc( Geom *object, char *name ); typedef Geom *GeomFSaveFunc( Geom *object, FILE *file, char *name ); typedef Geom *GeomPositionFunc( Geom *object, Transform T ); typedef Geom *GeomTransformFunc( Geom *object, Transform T, TransformN *TN ); typedef Geom *GeomTransformToFunc( Geom *object, Transform T, TransformN *TN ); typedef Geom *GeomRotateFunc( Geom *object, float angle, Point3 *axis ); typedef Geom *GeomTranslateFunc( Geom *object, float x, float y, float z ); typedef Geom *GeomScaleFunc( Geom *object, float x, float y, float z ); typedef Geom *GeomEvertFunc( Geom *object ); typedef Geom *GeomBoundFunc( Geom *object, Transform T, TransformN *TN ); typedef Geom *GeomBoundSphereFunc( Geom *object, Transform T, TransformN *TN, int * axes, int space ); typedef Geom *GeomEvalFunc( Geom *object, float u, float v ); typedef Geom *GeomDiceFunc( Geom *object, int nu, int nv ); typedef Geom *GeomSubdivideFunc( /* Geom *object */ ); typedef Geom * GeomPickFunc(Geom *, Pick *, Appearance *, Transform, TransformN *, int *axes); typedef Geom *GeomFacingFunc( /* Geom *object, ... */ ); typedef Geom *GeomDrawFunc(Geom *object); typedef Geom *GeomBSPTreeFunc(Geom *object, BSPTree *tree, int action); /* GeomBSPTree action values */ enum { BSPTREE_CREATE = 0, /* simply record tree in geom-struct */ BSPTREE_DELETE = 1, /* delete the tree or the reference to it */ BSPTREE_ADDGEOM = 2 /* add polyhedrons to the tree's poly-list */ }; typedef int GeomExportFunc( Geom *object, Pool *p ); typedef Geom *GeomImportFunc( Pool *p ); typedef Geom *GeomUnexportFunc( Handle *h ); typedef Geom *GeomScanFunc( Geom *g, int (*func)(/*Geom*,Handle**,void *arg*/), void *arg ); typedef Geom *GeomAppendFunc( Geom *g, Handle *h, Geom *newitem ); struct GeomClass { /* General Methods */ GeomClass *super; /* superclass of this class */ GeomNameFunc *name; GeomMethodsFunc *methods; GeomMessageFunc *message; GeomGetFunc *get; GeomCreateFunc *create; GeomDeleteFunc *Delete; GeomCopyFunc *copy; GeomReplaceFunc *replace; GeomFLoadFunc *fload; GeomFSaveFunc *fsave; GeomExtFunc **extensions; /* Extension methods live here */ int n_extensions; /* Size of extensions[] array */ /* Geometric Methods */ GeomPositionFunc *position; GeomTransformFunc *transform; GeomTransformToFunc *transformto; GeomEvertFunc *evert; GeomBoundFunc *bound; GeomEvalFunc *eval; GeomDiceFunc *dice; GeomSubdivideFunc *subdivide; /* Picking methods */ GeomPickFunc *pick; GeomBoundSphereFunc *boundsphere; GeomIterateFunc *iterate; GeomAppendFunc *append; /* Append new item to hierarchy object */ GeomScanFunc *scan; /* Graphics Methods */ GeomFacingFunc *facing; GeomDrawFunc *draw; GeomBSPTreeFunc *bsptree; /* Communications methods */ GeomExportFunc *export; GeomImportFunc *import; GeomUnexportFunc *unexport; }; extern GeomClass *GeomClassCreate(); extern GeomClass *GeomSubClassCreate(); extern GeomClass *GeomClassLookup(char *classname); extern void *GeomClassIterate(); extern GeomClass *GeomNextClass( void *iter ); extern GeomClass *GeomFName2Class( char *fname ); extern Geom *GeomBoundSphereFromBBox(Geom *, Transform, TransformN *, int *axes, int space); /* internal routine used by file-reading routines */ extern char *GeomToken(IOBFILE *f); /* flag values for "geomflags" */ #define VERT_N (1 << 0) #define VERT_C (1 << 1) #define VERT_4D (1 << 2) #define VERT_ST (1 << 3) /* texture */ #define FACET_C (1 << 4) #define COLOR_ALPHA (1 << 5) /* VERT_C or FACET_C have alpha != 1 */ #define GEOM_ALPHA (1 << 6) /* geom color or mat. color have alpha != 1 */ #define GEOM_COLOR (VERT_C|FACET_C) #define GEOMFL_SHIFT 8 #define GEOMFL_MASK ~(~0U << GEOMFL_SHIFT) /* per class additions should be defined using this macro: */ #define GEOMFLAG(bits) ((bits) << GEOMFL_SHIFT) /* 32-bit magic numbers for OOGL data types */ #define GeomMagic(key, ver) OOGLMagic('g', ((key) << 8) | ((ver)&0xff)) #define GeomIsMagic(magic) (((magic) & 0xffff0000) == GeomMagic(0,0)) /* This is the "common" geom stuff which starts every geom */ #define GEOMFIELDS \ REFERENCEFIELDS; /* magic, ref_count, handle */ \ struct GeomClass *Class; \ Appearance *ap; \ Handle *aphandle; \ int geomflags; \ int pdim; /* does this belong here? */ \ /* The following three fields are used to attach data to a geometry \ * objects which depends on the position of the Geom in the object \ * hierarchy. As a Geom object can be referenced by Handles the Geom \ * might occur in many positions inside the hierarchy. See also the \ * comment in front of "struct NodeData" below. \ * \ * The components "ppath" and "ppathlen" newpl.ppath = pl->ppath; newpl.ppathlen = pl->ppathlen; are non-persistent and only \ * valid through tree traversal with GeomDraw(). \ */ \ DblListNode pernode; /* per-node data */ \ char *ppath; /* parent path */ \ int ppathlen; /* its length */ \ /* Also a non-persistent entry: the bsptree for correct rendering of \ * translucent objects with alpha-blending. If non-NULL, this is the \ * tree for the object sub-hierarchy starting at this object. \ */ \ BSPTree *bsptree struct Geom { /* common data structures for all Geom's */ GEOMFIELDS; }; typedef struct HGeom { /* This tuple appears in hierarchy objects */ Handle *h; Geom *g; } HGeom; static inline bool GeomHasAlpha(Geom *geom, const Appearance *ap) { if ((ap->flag & APF_TRANSP) && (ap->flag & APF_FACEDRAW)) { if ((ap->flag & APF_TEXTURE) && ap->tex && ap->tex->apply != TXF_DECAL && ap->tex->image && (ap->tex->image->channels % 2 == 0)) { /* maybe the picture code should set a flag if the alpha channel * indeed has values != 255. */ geom->geomflags |= GEOM_ALPHA; return true; } else if ((ap->mat->valid & MTF_ALPHA) && ((ap->mat->override & MTF_ALPHA) || !(geom->geomflags & GEOM_COLOR))) { if (ap->mat->diffuse.a != 1.0) { geom->geomflags |= GEOM_ALPHA; return true; } } else if (geom->geomflags & COLOR_ALPHA) { geom->geomflags |= GEOM_ALPHA; return true; } } geom->geomflags &= ~GEOM_ALPHA; return false; } #endif /*GEOMCLASSDEF*/ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/extend.c0000644000175000001440000000773010461140705015326 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "string.h" #include "geomclass.h" #include static struct extmethods { char *methodname; GeomExtFunc *defaultfunc; } *extmethods = NULL; static int n_extmethods = 1, max_extmethods = 0; int GeomMethodSel(char *methodname) { struct extmethods *m; int i; for(i = 1; i < n_extmethods; i++) if((m = &extmethods[i])->methodname != NULL && strcmp(m->methodname, methodname) == 0) return i; return 0; } int GeomNewMethod(char *methodname, GeomExtFunc *defaultfunc) { int sel; int oldmax = max_extmethods; sel = GeomMethodSel(methodname); if(sel > 0) return 0; sel = n_extmethods++; if(sel >= oldmax) { extmethods = (oldmax == 0) ? OOGLNewNE(struct extmethods, (max_extmethods = 7), "Extension methods") : OOGLRenewNE(struct extmethods, extmethods, (max_extmethods *= 2), "Extension methods"); memset(&extmethods[oldmax], 0, (max_extmethods - oldmax) * sizeof(struct extmethods)); } extmethods[sel].defaultfunc = defaultfunc; extmethods[sel].methodname = strdup(methodname); return sel; } char * GeomMethodName(int sel) { return (sel <= 0 || sel >= n_extmethods) ? NULL : extmethods[sel].methodname; } GeomExtFunc * GeomSpecifyMethod( int sel, GeomClass *Class, GeomExtFunc *func ) { int oldmax; int need; GeomExtFunc *oldfunc; if(Class == NULL || sel <= 0 || sel >= n_extmethods) return NULL; oldmax = Class->n_extensions; if(sel >= oldmax) { need = (oldmax == 0) ? 7 : oldmax*2; if(need <= sel) need = sel+1; Class->extensions = (oldmax == 0) ? OOGLNewNE(GeomExtFunc *, need, "Extension func vector") : OOGLRenewNE(GeomExtFunc *, Class->extensions, need, "Extension func vector"); Class->n_extensions = need; memset(&Class->extensions[oldmax], 0, (need - oldmax) * sizeof(GeomExtFunc *)); } oldfunc = Class->extensions[sel]; Class->extensions[sel] = func; return oldfunc; } void * GeomCall(int sel, Geom *geom, ...) { GeomClass *C; GeomExtFunc *ext = NULL; void *result = NULL; va_list args; if(geom == NULL || sel <= 0 || sel >= n_extmethods) return NULL; C = geom->Class; while(sel >= C->n_extensions || (ext = C->extensions[sel]) == NULL) { if((C = C->super) == NULL) { ext = extmethods[sel].defaultfunc; break; } } if(ext) { va_start(args, geom); result = (*ext)(sel, geom, &args); va_end(args); } return result; } void * GeomCallV(int sel, Geom *geom, va_list *args) { GeomClass *C; GeomExtFunc *ext = NULL; if(geom == NULL || sel <= 0 || sel >= n_extmethods) return NULL; C = geom->Class; while(sel >= C->n_extensions || (ext = C->extensions[sel]) == NULL) { if((C = C->super) == NULL) { ext = extmethods[sel].defaultfunc; break; } } return ext ? (*ext)(sel, geom, args) : NULL; } geomview-1.9.4/src/lib/gprim/geom/replace.c0000644000175000001440000000300710624072063015445 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" #include "nodedata.h" void GeomReplace(Geom *parent, Geom *newchild) { if(parent != NULL && parent->Class->replace != NULL) { RefIncr((Ref *)newchild); GeomDelete((*parent->Class->replace)(parent, newchild)); GeomNodeDataPrune(parent); } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/evert.c0000644000175000001440000000250610455701003015155 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" Geom * GeomEvert( object ) Geom *object; { if( object && object->Class->evert ) (*object->Class->evert)(object); return object; } geomview-1.9.4/src/lib/gprim/geom/copy.c0000644000175000001440000000406510573773255015027 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" /* this needs to be here so that the shared memory code can work */ Geom * GGeomCopy(Geom *g, Geom *object) { RefInit((Ref *)g, object->magic); g->Class = object->Class; g->ap = object->ap; if(g->ap != NULL) { g->ap = ApCopy(g->ap, NULL); } g->aphandle = NULL; DblListInit(&g->handles); DblListInit(&g->pernode); return g; } Geom * GeomCopy(Geom *object) { Geom *g; /* this is a little tricky */ if( object == NULL ) return NULL; if( object->Class->copy ) { g = (*object->Class->copy)(object); if(g != NULL) { GGeomCopy(g, object); } } else { GeomError(1/*Warning-unimpl*/,"GeomCopy: no copy method for %s: %x", GeomName(object), object); RefIncr((Ref *)object); /* Copy by reference -- XXX stopgap! */ g = object; } return g; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/dice.c0000644000175000001440000000323310557630535014750 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" Geom * GeomDice( Geom *g, int nu, int nv ) { if (g == NULL) { return NULL; } if(g->ap && g->ap->valid & APF_DICE) { nu = g->ap->dice[0]; /* Propagate "dice" appearance values */ nv = g->ap->dice[1]; /* Note we ignore overrides, so this may not be * correct in some cases. */ } if(g->Class->dice ) { (*g->Class->dice)(g, nu, nv); } return g; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/draw.c0000644000175000001440000000502710601100715014762 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" #include "mg.h" #include "bsptreeP.h" static inline void maybe_tag_appearance(Geom *geom, const Appearance *ap) { NodeData *data; if (GeomHasAlpha(geom, ap)) { data = GeomNodeDataCreate(geom, NULL); if (data->tagged_ap) { mguntagappearance(data->tagged_ap); data->tagged_ap = NULL; } data->tagged_ap = mgtagappearance(); } else if ((data = GeomNodeDataByPath(geom, NULL)) && data->tagged_ap) { mguntagappearance(data->tagged_ap); data->tagged_ap = NULL; } } Geom *GeomDraw(Geom *geom) { if (geom && geom->Class->draw) { const Appearance *ap; if (geom->bsptree != NULL) { mgNDctx *NDctx = NULL; mgctxget(MG_NDCTX, &NDctx); if (NDctx != NULL) { NDctx->bsptree = geom->bsptree; BSPTreeSet(NDctx->bsptree, BSPTREE_ONESHOT, true, BSPTREE_END); BSPTreeSetId(geom->bsptree); } } if (geom->ap != NULL) { mgpushappearance(); ap = mgsetappearance(geom->ap, 1); /* Merge into inherited ap */ } else { ap = mggetappearance(); } maybe_tag_appearance(geom, ap); (*geom->Class->draw)(geom); if(geom->ap != NULL) { mgpopappearance(); } if (geom->bsptree != NULL && (geom->geomflags & GEOM_ALPHA)) { GeomBSPTreeDraw(geom); } } return geom; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/geom.h0000644000175000001440000001534110577535005015001 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef GEOMDEF #define GEOMDEF #include "handle.h" #include "3d.h" #include "create.h" #ifndef __cplusplus typedef struct Geom Geom; /* Complete OOGL object */ typedef struct GeomClass GeomClass; /* Virtual func tbl for Geom */ typedef struct GeomIter GeomIter; /* opaque iteration handle */ #else struct Geom; struct GeomClass; struct GeomIter; #endif struct BSPTree; extern char *GeomName( Geom *obj ); extern GeomClass *GeomMethods( Geom * ); extern Geom *GeomMessage( Geom *obj, int ac, char *av[] ); extern Geom *GeomCopy( Geom *obj ); extern Geom *GeomCreate( char *classname, ... ); extern Geom *GeomCCreate( Geom *existing_value, GeomClass *Class, ... ); extern void GeomDelete( Geom *obj ); extern Geom *GeomLoad( char *name ); extern Geom *GeomFLoad( IOBFILE *inf, char *fname ); /* name for errs & type-guessing, may be NULL */ extern int GeomFLoadEmbedded( Geom **obj, Handle **handlep, IOBFILE *inf, char *fname ); extern int GeomStreamIn( Pool *, Handle **handlep, Geom **geomp ); extern int GeomStreamOut( Pool *, Handle *h, Geom *g ); extern Geom *GeomSave( Geom *obj, char *name ); extern Geom *GeomFSave( Geom *obj, FILE *outf, char *fname ); extern Geom *GeomFSaveEmbedded( Geom *obj, Handle *handle, FILE *inf, char *fname ); extern void GeomReplace( Geom *parent, Geom *newchild ); extern Geom *GeomEvert( Geom *obj ); extern Geom *GeomBound( Geom *obj, Transform T, TransformN *TN); extern Geom *GeomBoundSphere( Geom *obj, Transform T, TransformN *, int *axes, int space ); extern Geom *GeomEval( Geom *obj ); extern Geom *GeomDice( Geom *obj, int nu, int nv ); extern Geom *GeomSubdivide( Geom *obj ); extern Geom *GeomPosition( Geom *obj, Transform T ); extern Geom *GeomTransform( Geom *obj, Transform T, TransformN *TN ); extern Geom *GeomTransformTo( Geom *obj, Transform T, TransformN *TN ); extern int GeomSet( Geom *g, /* int attr, */ ... /* , CR_END */ ); extern int GeomGet( Geom *g, int attr, void *attrp ); extern void GeomHandleScan( Geom *g, int (*func)(), void *arg ); extern Geom *GeomDraw( Geom *obj ); /* Using current mg context */ extern struct BSPTree * GeomBSPTree(Geom *geom, struct BSPTree *tree, int action); extern Geom *GeomBSPTreeDraw(Geom *geom); /* only for transparency */ /* Extensions. These are roughly objective-C style. * Extension-functions are named with ASCII strings; for efficiency, * the library interface uses integer "selectors". Typical usage: * int sel = GeomNewMethod( "new_method_name", my_default_func ); * to define a new method, and/or * GeomDefineMethod( sel, PolyListMethods(), my_func_for_polylists ); * GeomDefineMethod( sel, InstMethods(), my_func_for_insts ); * ... * to define a new method & its behavior on various object types. Or: * int sel = GeomMethodSel( "method_name" ); * returns the selector of an already-defined extension. * (GeomMethodSel() returns 0 for undefined extensions). * To use the new method: * result = GeomCall( sel, geom, ... ); */ typedef void *GeomExtFunc( int sel, Geom *geom, va_list *args ); extern int GeomMethodSel( char *name ); /* name -> selector, or 0 */ extern char *GeomMethodName( int sel ); /* selector -> name or NULL */ extern int GeomNewMethod( char *name, GeomExtFunc *defaultfunc );/* -> selector */ GeomExtFunc *GeomSpecifyMethod( int sel, GeomClass *Class, GeomExtFunc *func ); extern void *GeomCall( int sel, Geom *geom, ... ); extern void *GeomCallV( int sel, Geom *geom, va_list *args ); /* Notes: * GeomMethodSel() returns the selector for a given extension; 0 = unknown. * GeomMethodName() returns the string naming an extension; NULL = unknown. * GeomNewMethod() returns the newly assigned selector. * GeomSpecifyMethod() returns the old method function, or NULL if none. * GeomCall() invokes a method function; if none was specified for that * object class, the method's default function is called. * GeomCallV() takes a va_list rather than GeomCall's explicit param list. */ /* Iteration */ /* Iterate() flag bits: */ #define SHALLOW 1 /* Shallow traversal */ #define DEEP 0 /* vs. Fully recursive */ #define TRANSFORMED 2 /* Fully flatten all Geom's */ #define INSTANCED 0 /* vs. Return Inst -> Geom's (saves copying data) */ #define RETAIN 4 /* Retain returned Geom's indefinitely */ #define DESTROY 0 /* vs. Destroy returned Geom's at next iteration step */ extern GeomIter *_GeomIterate( Geom *root, int flags ); extern Geom *NextGeom( GeomIter * ); extern int _NextTransform( GeomIter *, Transform T ); extern void DestroyIter( GeomIter * ); static inline GeomIter *GeomIterate(Geom *root, int flags) { if (!root) { return NULL; } else { return _GeomIterate(root, flags); } } static inline int NextTransform(GeomIter *iter, Transform T) { if (iter == NULL) { return 0; } return _NextTransform(iter, T); } /* Import/export */ extern int GeomUpdate( Geom *obj, int doImport ); /* Recursive bind */ /* to support compatibility with the old way of doing it */ #define GeomScale(ggg, sx, sy, sz) { \ Transform t; \ Tm3Scale(t, sz, sy, sz); \ GeomTransform(ggg, t); } #define GeomTranslate(ggg, tx, ty, tz) { \ Transform t; \ Tm3Translate(t, tz, ty, tz); \ GeomTransform(ggg, t); } #define GeomRotate(ggg, aa, axis) { \ Transform t; \ Tm3Rotate(t, aa, axis); \ GeomTransform(ggg, t); } extern Geom *GeomCCreate(Geom *g, GeomClass *c, ...); extern int GeomDecorate(/* Geom *g, int *copyp, int feature, va_list *ap */); extern void GeomAcceptToken(); extern void GGeomInit(/*Geom *g, GeomClass *Class, int magic, Appearance *ap*/); extern void GeomKnownClassInit(); extern void GeomAddTranslator(char *prefix, char *cmd); #endif /*GEOMDEF*/ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/geomclass_sm.h0000644000175000001440000000304010455701003016503 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GEOMCLASS_SM_ #define _GEOMCLASS_SM_ #define IsInSM(addr, sm) ((sm)->sm_base <= (char *)(addr) && \ (char *)(addr) < (sm)->sm_base + (sm)->sm_mapped) #define GeomRefreshSM(sm) ((sm)->sm_mapped < ROOTSYM(sm)->s_size ? GeomRemapSM(sm) : (sm)->sm_mapped) #define ROOTSYM(sm) ((GeomSMSym *)(sm)->sm_base) #define GOffset(sym, type, ptr) ((type *)(((char *)(ptr)) + \ (((char *)(sym)) - (sym)->s_here))) #define MAXSM 4 /* Max number of simultaneous shared mem's */ #define SM_MAGIC 0x4AB3B8B9 /* s_version field for SM root symbol */ #endif _GEOMCLASS_SM_ geomview-1.9.4/src/lib/gprim/geom/Makefile.am0000644000175000001440000000101210624367374015730 00000000000000# # $(OPENGLINCLUDE) is needed for bsptree.c to get the correct # location of the glu.h header file. # INCLUDES = $(default_includes) $(OPENGLINCLUDE) EXTRA_DIST = Headers noinst_LTLIBRARIES = libgeom.la libgeom_la_SOURCES = \ bound.c boundsphere.c class.c copy.c create.c delete.c dice.c draw.c \ evert.c extend.c geomstream.c handlescan.c iterate.c knownclass.c message.c \ name.c pick.c replace.c transform.c \ geomclass.h geomclass_sm.h geom.h pick.h pickP.h vert.h \ bsptree.c bsptree.h bsptreeP.h nodedata.h geomview-1.9.4/src/lib/gprim/geom/Makefile.in0000644000175000001440000004111610665240503015737 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/geom DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgeom_la_LIBADD = am_libgeom_la_OBJECTS = bound.lo boundsphere.lo class.lo copy.lo \ create.lo delete.lo dice.lo draw.lo evert.lo extend.lo \ geomstream.lo handlescan.lo iterate.lo knownclass.lo \ message.lo name.lo pick.lo replace.lo transform.lo bsptree.lo libgeom_la_OBJECTS = $(am_libgeom_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libgeom_la_SOURCES) DIST_SOURCES = $(libgeom_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ # # $(OPENGLINCLUDE) is needed for bsptree.c to get the correct # location of the glu.h header file. # INCLUDES = $(default_includes) $(OPENGLINCLUDE) EXTRA_DIST = Headers noinst_LTLIBRARIES = libgeom.la libgeom_la_SOURCES = \ bound.c boundsphere.c class.c copy.c create.c delete.c dice.c draw.c \ evert.c extend.c geomstream.c handlescan.c iterate.c knownclass.c message.c \ name.c pick.c replace.c transform.c \ geomclass.h geomclass_sm.h geom.h pick.h pickP.h vert.h \ bsptree.c bsptree.h bsptreeP.h nodedata.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/geom/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/geom/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgeom.la: $(libgeom_la_OBJECTS) $(libgeom_la_DEPENDENCIES) $(LINK) $(libgeom_la_OBJECTS) $(libgeom_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bsptree.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/class.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/draw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extend.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geomstream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handlescan.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knownclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/name.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/replace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/geom/geomstream.c0000644000175000001440000003144710622716754016220 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "geomclass.h" #include "streampool.h" #include "handleP.h" #if HAVE_UNISTD_H # include #endif #if HAVE_IO_H # include /* _WIN32 */ #endif #include #if POPEN_ACCEPTS_RB # define POPEN_RB "rb" #else # define POPEN_RB "r" #endif HandleOps GeomOps = { "geom", (int ((*)()))GeomStreamIn, (int ((*)()))GeomStreamOut, (void ((*)()))GeomDelete, NULL, /* resync */ NULL, /* close pool */ }; Geom * GeomLoad(char *fname) { IOBFILE *inf = iobfopen(fname, "rb"); Geom *g; if (inf == NULL) { OOGLError(0, "GeomLoad: can't open %s: %s", fname, sperror()); return NULL; } g = GeomFLoad(inf, fname); iobfclose(inf); return g; } Geom * GeomFLoad(IOBFILE *inf, char *fname) { Pool *p; Geom *g = NULL; p = PoolStreamTemp(fname, inf, NULL, 0, NULL); GeomStreamIn(p, NULL, &g); PoolDelete(p); return g; } int GeomFLoadEmbedded( Geom **gp, Handle **hp, IOBFILE *inf, char *fname ) { Pool *p; int nope; p = PoolStreamTemp(fname, inf, NULL, 0, NULL); nope = GeomStreamIn(p, hp, gp); PoolDelete(p); return !nope; } Geom * GeomSave(Geom *g, char *fname) { Pool *p; int ok; FILE *outf; if ((outf = fopen(fname, "wb")) == NULL) { OOGLError(0, "GeomSave: Can't open %s: %s", fname, sperror()); return NULL; } p = PoolStreamTemp(fname, NULL, outf, 1, &GeomOps); if (p == NULL) { OOGLError(0, "GeomSave: Can't open %s: %s", fname, sperror()); return NULL; } PoolSetOType(p, PO_DATA); ok = GeomStreamOut(p, NULL, g); PoolClose(p); PoolDelete(p); return ok ? g : NULL; } Geom * GeomFSave(Geom *g, FILE *outf, char *fname) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_DATA); PoolIncLevel(p,1); ok = GeomStreamOut(p, NULL, g); PoolDelete(p); return ok ? g : NULL; } Geom * GeomFSaveEmbedded( Geom *g, Handle *handle, FILE *outf, char *fname ) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_HANDLES); PoolIncLevel(p, 1); /* Enforce level > 0 to get { braces } */ ok = GeomStreamOut(p, handle, g); PoolDelete(p); return ok ? g : NULL; } int GeomEmbedPrefix(int c) { return (c == '{' || c == '=' || c == '@' || c == '<'); } static char *geomtoken; char * GeomToken(IOBFILE *f) { if (geomtoken) return geomtoken; geomtoken = iobfdelimtok("{}()<:@=", f, 0); return geomtoken ? geomtoken : ""; } void GeomAcceptToken() { geomtoken = NULL; } vvec geomtransl; int comment_translators = 0; struct GeomTranslator { int prefixlen; char *prefix; char *cmd; }; void GeomAddTranslator(char *prefix, char *cmd) { struct GeomTranslator *gt; int i; if (VVCOUNT(geomtransl) == 0) VVINIT(geomtransl, struct GeomTranslator, 4); cmd = cmd && cmd[0] ? strdup(cmd) : ""; if (prefix[0] == '#') comment_translators = 1; gt = VVEC(geomtransl, struct GeomTranslator); for (i = VVCOUNT(geomtransl); --i >= 0; gt++) { if (strcmp(prefix, gt->prefix) == 0) { if (gt->cmd) OOGLFree(gt->cmd); gt->cmd = cmd[0]!='\0' ? cmd : NULL; return; } } gt = VVAPPEND(geomtransl, struct GeomTranslator); gt->prefixlen = strlen(prefix); gt->prefix = strdup(prefix); gt->cmd = cmd[0]!='\0' ? cmd : NULL; } int GeomInvokeTranslator(Pool *p, char *prefix, char *cmd, Handle **hp, Geom **gp) { IOBFILE *tf, *pf = PoolInputFile(p); long pos = iobftell(pf) - strlen(prefix); int ok, oldstdin; Pool *tp; void (*oldchld)(); #if defined(unix) || defined(__unix) /* Rewind file descriptor to previous position */ if (iobfseek(pf, pos, SEEK_SET) < 0) { OOGLError(1, "%s: can only use external format-translators on disk files", PoolName(p)); return 0; } oldstdin = dup(0); close(0); dup(iobfileno(pf)); oldchld = signal(SIGCHLD, SIG_DFL); tf = iobpopen(cmd, POPEN_RB); close(0); if (oldstdin > 0) { dup(oldstdin); close(oldstdin); } tp = PoolStreamTemp(PoolName(p), tf, NULL, 0, &GeomOps); ok = GeomStreamIn(tp, hp, gp); iobpclose(tf); PoolClose(tp); PoolDelete(tp); signal(SIGCHLD, oldchld); iobfseek(pf, 0, SEEK_END); /* Seek input to EOF to avoid confusion */ return ok; #else /* non-unix -- give up */ return 0; #endif } int GeomStreamIn(Pool *p, Handle **hp, Geom **gp) { IOBFILE *f; Handle *h = NULL; Handle *hname = NULL; Geom *g = NULL; Handle *aphandle = NULL; Appearance *ap = NULL; GeomClass *Class; void *it; int i, first; int empty = 1, braces = 0; int c; char *w, *raww; int brack = 0; int more; if (p == NULL || (f = PoolInputFile(p)) == NULL) return 0; /* Hack for external support for additional file formats, VRML/Inventor in * particular, which alas use a # convention for its header, so we must * bypass default comment parsing. * If first character is a #, grab first line as a token and * match against known patterns. */ if (comment_translators) { struct GeomTranslator *gt; char prefix[256]; if ((c = iobfgetc(f)) == '#') { prefix[0] = '#'; iobfgets(prefix+1, sizeof(prefix)-1, f); gt = VVEC(geomtransl, struct GeomTranslator); for (i = VVCOUNT(geomtransl); --i >= 0; gt++) { if (strncmp(gt->prefix, prefix, gt->prefixlen) == 0) { return GeomInvokeTranslator(p, prefix, gt->cmd, hp, gp); } } /* Nope, not one we recognize. Finish consuming comment line * in case the prefix[] buffer didn't hold it all. */ if (strchr(prefix, '\n') == NULL) while((c = iobfgetc(f)) != '\n' && c != EOF) ; } else if (c != EOF) iobfungetc(c, f); } /* Skip a semicolon if it's the first thing we see -- 'stuff' compatibility. */ if (iobfnextc(f, 0) == ';') iobfgetc(f); do { more = 0; geomtoken = NULL; /* Fetch a new token */ w = GeomToken(f); c = w[0]; geomtoken = NULL; /* Clear cache unless we know we'll need it */ switch(c) { case '<': case ':': case '@': w = iobfdelimtok("{}()", f, 0); /* Consider doing a path search. * Do this before calling HandleReferringTo() * to prevent spurious error messages. */ if (c == '<' && (h = HandleByName(w, &GeomOps)) == NULL && w[0] != '/') { w = findfile(PoolName(p), raww = w); if (w == NULL) { OOGLSyntax(f, "Error reading \"%s\": can't find file \"%s\"", PoolName(p), raww); } } else if (h) { /* HandleByName() increases the ref. count s.t. the * caller of HandleByName() owns the returned handle. */ HandleDelete(h); } h = HandleReferringTo(c, w, &GeomOps, NULL); if (h != NULL) { /* Increment the ref. count. This way we can call * HandleDelete() and GeomDelete() independently. */ g = REFGET(Geom, HandleObject(h)); } break; case '{': brack++; break; case '}': if (brack--) braces = 1; else iobfungetc(c, f); break; case '=': more = 1; break; default: if (strcmp(w, "geom") == 0) { more = 1; break; } if (strcmp(w, "define") == 0) { more = 1; hname = HandleCreateGlobal(iobftoken(f, 0), &GeomOps); break; } if (strcmp(w, "appearance") == 0) { more = 1; if (!ApStreamIn(p, &aphandle, &ap)) { OOGLSyntax(f, "%s: appearance definition expected", PoolName(p)); GeomDelete(g); return false; } break; } /* Stuff token in the cache so all geom readers can see it */ geomtoken = w; /* * Load literal object. * First try to guess object type from its file name. */ empty = 0; PoolSetMark(p); Class = GeomFName2Class( PoolName(p) ); g = NULL; first = 1; if (Class) { if (Class->import) g = (*Class->import)(p); else if (Class->fload) g = (*Class->fload)(f, PoolName(p)); first = 0; if (g) break; } /* * If not, try all known classes. */ GeomKnownClassInit(); /* Ensure all classes entered */ it = GeomClassIterate(); while (g == NULL && (Class = GeomNextClass(&it)) != NULL) { if (Class->import == NULL && Class->fload == NULL) continue; /* * Try to seek back to our initial position. */ if (!first && !PoolSeekMark(p)) { /* No luck. Might as well give up right now. */ OOGLSyntax(f, "Error reading \"%s\": PoolSetMark() failed.", PoolName(p)); break; } if (Class->import) g = (*Class->import)(p); else if (Class->fload) g = (*Class->fload)(f, PoolName(p)); first = 0; } geomtoken = NULL; if (g == NULL) { PoolClearMark(p); return 0; } } } while (brack > 0 || more); /* Leave results where we're told to */ if (ap != NULL || aphandle != NULL) { Geom *container; /* If we're given an appearance and a reference to a handle, * insert an INST to hang the appearance onto. * (But still allow { define X appearance { ... } } to bind * an appearance to a handle. Just disallow it when referring to * an existing handle.) */ if (h != NULL) { container = GeomCreate("inst", CR_HANDLE_GEOM, h, g, CR_END); HandleDelete(h); /* Decr ref count; the INST now owns it. */ GeomDelete(g); g = container; h = NULL; } else if (g == NULL) { g = GeomCreate("inst", CR_END); } if (g->ap) { ApDelete(g->ap); } if (g->aphandle) { HandlePDelete(&g->aphandle); } g->ap = ap; g->aphandle = aphandle; if (g->aphandle) { HandleRegister(&g->aphandle, (Ref *)g, &g->ap, HandleUpdRef); } } if (hname != NULL) { if (g) { HandleSetObject(hname, (Ref *)g); } if (h) { /* HandleReferringTo() has passed the ownership to us, so * delete h because we do not need it anymore. */ HandleDelete(h); } h = hname; } /* Pass the ownership of h and g to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp != NULL) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (gp != NULL) { if (*gp != NULL) { GeomDelete(*gp); } *gp = g; } else if (g) { GeomDelete(g); } PoolClearMark(p); return (g != NULL || h != NULL || (empty && braces)); } int GeomStreamOut(Pool *p, Handle *h, Geom *g) { int brack; if (PoolOutputFile(p) == NULL) return 0; if (g == NULL && h != NULL && h->object != NULL) g = (Geom *)h->object; if (g == NULL && h == NULL) { fprintf(PoolOutputFile(p), "{ }\n"); return 1; } brack = true || (p->level > 0 || (g && (g->ap || g->aphandle)) || h != NULL); if (brack) { fprintf(PoolOutputFile(p), "{"); PoolIncLevel(p, 1); } if (p->otype & 4) { fprintf(PoolOutputFile(p), " # %d refs\n", g->ref_count); /* debug */ } else { fprintf(PoolOutputFile(p), "\n"); } if (g && (g->ap || g->aphandle)) { PoolPrint(p, ""); /* use the proper indentation */ ApStreamOut(p, g->aphandle, g->ap); } if (PoolStreamOutHandle(p, h, g != NULL)) { if (g->Class->export) (*g->Class->export)(g, p); else if (g->Class->fsave) (*g->Class->fsave)(g, PoolOutputFile(p), PoolName(p)); } if (brack) { PoolIncLevel(p, -1); PoolPrint(p, "}\n"); } return !ferror(PoolOutputFile(p)); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/iterate.c0000644000175000001440000001624210577535005015503 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * iterate.c -- iteration over OOGL hierarchies */ #include #include "listP.h" #include "tlistP.h" #include "instP.h" #include "sphereP.h" #include "discgrpP.h" #define UNKNOWN 0 #define LIST 1 #define TLIST 2 #define INST 3 #define SPHERE 4 #define DISCGRP 5 #define OTHER 6 #define VALID 0x13ac2480 /* Magic number */ struct istate { /* Iteration state structure: per nest lvl */ struct istate *parent; Geom *g; int kind; int seq; /* Seq number within Tlist */ Transform Ti; }; struct GeomIter { struct istate *stack; int flags; }; static union itpool { union itpool *next; struct GeomIter iter; } *itpool; static struct istate *ispool; #define NewIter(it) \ if (itpool) { \ it = &itpool->iter; \ itpool = itpool->next; \ } else { \ it = OOGLNewE(GeomIter, "GeomIter"); \ } #define NewIstate(is) \ if (ispool) { \ is = ispool; \ ispool = ispool->parent; \ } else { \ is = OOGLNewE(struct istate, "GeomIter state"); \ } #define FreeIter(it) \ ((union itpool *)(it))->next = itpool, itpool = (union itpool *)(it) #define FreeIstate(is) (is)->parent = ispool, ispool = (is) GeomIter *_GeomIterate(Geom *g, int flags) { GeomIter *it; struct istate *is; NewIter(it); it->flags = (flags & 0xf) | VALID; NewIstate(is); it->stack = is; is->kind = UNKNOWN; is->g = g; is->parent = NULL; return it; } /* * Iterate over an OOGL hierarchy, producing one Transform per call. * Returns 1 normally, 0 when no more Transforms remain. * Destroys the GeomIter upon returning 0. * * To make this work as a coroutine we effectively unroll the recursive * hierarchy traversal, so please excuse the goto's. * * For speed, we act as a friend to the List, TList, Inst, and Sphere * classes. XXX * * This function has to be called through the inline function * NextTransform(); we assume here that iter != NULL and it->stack != * NULL. */ int _NextTransform(GeomIter *it, Transform T) { struct istate *is; Geom *g; if ((is = it->stack) == NULL) { goto gone; } g = is->g; again: switch(is->kind) { case UNKNOWN: /* Determine type */ discover: if(g->Class == TlistClass) { if(g->magic != TLISTMAGIC) { GeomError(0,"NextTransform: Surprise Tlist %x", g); goto pop; } is->kind = TLIST; is->seq = 0; goto isTLIST; } if(g->Class == DiscGrpClass) { if(g->magic != DISCGRPMAGIC) { GeomError(0,"NextTransform: Surprise DiscGrp %x", g); goto pop; } is->kind = DISCGRP; is->seq = 0; goto isDISCGRP; } if(g->Class == ListClass) { if(g->magic != LISTMAGIC) { GeomError(0,"NextTransform: Surprise List %x", g); goto pop; } is->kind = LIST; goto isLIST; } if(g->Class == InstClass || g->Class == SphereClass) { Inst *inst = (Inst *)g; if(inst->magic != INSTMAGIC && inst->magic != SPHEREMAGIC) { GeomError(0,"NextTransform: Surprise Inst %x", g); goto pop; } if(inst->tlist == NULL) { /* * Just use this transform. We're a leaf, so return it now. * Also pop stack for next iteration. */ if((is = is->parent)) TmConcat(inst->axis, is->Ti, T); else TmCopy(inst->axis, T); FreeIstate(it->stack); it->stack = is; return 1; } else { /* * Inst has a child. * The axis field is *ignored* in this case; just * traverse the child. */ is->g = g = inst->tlist; /*is->kind = UNKNOWN;*/ goto discover; } } /* Other objects aren't relevant for NextTransform(), so discard. */ goto pop; case TLIST: isTLIST: { Tlist *TL = (Tlist *)g; TransformPtr Tp; /* ought to be ``Transform *Tp'' */ if(is->seq >= TL->nelements) goto pop; Tp = TL->elements[is->seq++]; if(TL->tlist != NULL && !(it->flags & SHALLOW)) { if(is->parent) TmConcat(Tp, is->parent->Ti, is->Ti); else TmCopy(Tp, is->Ti); g = TL->tlist; goto push; } /* We're a leaf -- return a matrix now */ if(is->parent) TmConcat(Tp, is->parent->Ti, T); else TmCopy(Tp, T); return 1; } case DISCGRP: isDISCGRP: { DiscGrp *dg = (DiscGrp *)g; TransformPtr Tp; /* ought to be ``Transform *Tp'' */ if(is->seq >= dg->big_list->num_el) goto pop; Tp = dg->big_list->el_list[is->seq++].tform; /* if it's another discrete group ... */ if(dg->geom != NULL && dg->geom->magic == DISCGRPMAGIC && !(it->flags & SHALLOW)) { if(is->parent) TmConcat(Tp, is->parent->Ti, is->Ti); else TmCopy(Tp, is->Ti); g = dg->geom; goto push; } /* We're a leaf -- return a matrix now */ if(is->parent) TmConcat(Tp, is->parent->Ti, T); else TmCopy(Tp, T); return 1; } case LIST: isLIST: { /* Might need some intra-List state too if List format * gets fancier -- if we have one List object which contains a * bundle of Geom's. */ List *L = (List *)g; if(L == NULL) goto pop; while(L->car == NULL) { L = L->cdr; if(L == NULL) goto pop; } g = L->car; is->g = (Geom *)L->cdr; if(is->parent) TmCopy(is->parent->Ti, is->Ti); else TmIdentity(is->Ti); goto push; } default: GeomError(1,"NextTransform: called with invalid GeomIter (%x)", it); return 0; } push: /* Push g as a new element */ /* is->Ti *must* be set correctly before getting here! */ NewIstate(is); is->g = g; is->parent = it->stack; it->stack = is; goto discover; /* Recurse */ pop: is = is->parent; FreeIstate(it->stack); it->stack = is; if(is != NULL) { g = is->g; goto again; /* Recurse -- type already determined */ } /* stack empty -- finished */ gone: it->flags = 0; it->stack = NULL; FreeIter(it); return 0; } void DestroyIter(it) GeomIter *it; { if((it->flags & 0xfffffff0) == VALID) { it->flags = 0; it->stack = NULL; FreeIter(it); } else { GeomError(1,"DestroyIter -- already destroyed %x", it); } } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/name.c0000644000175000001440000000251410455701003014747 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" char * GeomName( object ) Geom *object; { if( object && object->Class->name ) { return (*object->Class->name)(); } return NULL; } geomview-1.9.4/src/lib/gprim/geom/delete.c0000644000175000001440000000617710624072046015310 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" #include "handleP.h" #include "mg.h" #include "nodedata.h" int PoolDoCacheFiles; DEF_FREELISTHEAD(NodeData); void GeomDelete(Geom *object) { Handle *h; int np; if (object == NULL) { return; } if (!GeomIsMagic(object->magic)) { OOGLWarn("Internal warning: GeomDelete of non-Geom %x (%x !~ %xxxxx)", object, object->magic, (GeomMagic(0,0)>>16)&0xFFFF); return; } /* If we're not caching contents of files, and this object was loaded * from a file, and the sole reference to it is from the Handle, * delete it now (and delete the handle and possibly close the file). */ for (np = 0, h = HandleRefIterate((Ref *)object, NULL); h; h = HandleRefIterate((Ref *)object, h)) { if (HandlePool(h) != NULL && !PoolDoCacheFiles) { np++; } } if (REFPUT(object) == np && np > 0) { /* can this happen??? at all ??? */ for (h = HandleRefIterate((Ref *)object, NULL); h; h = HandleRefIterate((Ref *)object, h)) { if (HandlePool(h) != NULL && !PoolDoCacheFiles) { /* REFPUT() is enough, HandleRefIterate() will call * HandleDelete() */ REFPUT(h); } } return; } else if (REFCNT(object) < 0 || REFCNT(object) > 100000) { /* XXX debug */ OOGLError(1, "GeomDelete(%x) -- ref count %d?", object, REFCNT(object)); return; } else if (REFCNT(object) > 0) { return; } /* Actually delete it */; /* we may need to iterate over a list, or access INST->geom, so * call the destructor for the BSP-tree before calling * Class->Delete() */ GeomBSPTree(object, NULL, BSPTREE_DELETE); GeomNodeDataPrune(object); if(object->aphandle) { HandlePDelete(&object->aphandle); } if(object->ap) { ApDelete(object->ap); object->ap = NULL; } if(object->Class->Delete) { (*object->Class->Delete)(object); } object->magic ^= 0x80000000; OOGLFree(object); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/pick.c0000644000175000001440000002027710623654010014765 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include "geomclass.h" #include "pickP.h" #include "bbox.h" #define PICK_WANTED(pick, ap) \ (pick->want & (!(pick->want & PW_VISIBLE) \ || ap == NULL || (ap->flag & APF_FACEDRAW) \ ? PW_VERT | PW_EDGE | PW_FACE : \ (ap->flag & (APF_EDGEDRAW|APF_VECTDRAW)) \ ? PW_VERT|PW_EDGE : 0)) int PickFace(int n_verts, Point3 *verts, Pick *pick, Appearance *ap) { Point3 got, ep; int v, e; if (PolyNearPosZInt(n_verts, verts, pick->thresh, &got, &v, &e, &ep, PICK_WANTED(pick, ap), pick->got.z)) return PickFillIn(pick, n_verts, &got, v, e, ap); else return 0; } int PickFillIn(Pick *pick, int n_verts, Point3 *got, int vertex, int edge, Appearance *ap) { int found = 0; pick->got = *got; vvcopy(&pick->gcur, &pick->gpath); found = 0; if (vertex != -1) { found |= PW_VERT; pick->vi = vertex; } if (edge != -1) { found |= PW_EDGE; pick->ei[0] = edge; pick->ei[1] = (edge + 1) % n_verts; } if (pick->want & PW_FACE) { found |= PW_FACE; pick->fn = n_verts; } if (found) { pick->found = found; if (pick->f != NULL) OOGLFree(pick->f); pick->f = NULL; } return found; } Geom * GeomMousePick(Geom *g, Pick *p, Appearance *ap, Transform Tg, TransformN *TgN, int *axes, double x, double y) { Pick *pick = NULL; Transform Txy, T; TransformN *TN = NULL; if (!p) pick = p = PickSet(NULL, PA_END); p->x0 = x; p->y0 = y; if (TgN) { HPointN *tmp = HPtNCreate(TgN->odim, NULL); tmp->v[axes[0]] = -x; tmp->v[axes[1]] = -y; TN = TmNTranslateOrigin(NULL, tmp); HPtNDelete(tmp); TmNConcat(TgN, TN, TN); } else { TmTranslate(Txy, -x, -y, 0.); TmConcat(Tg, Txy, T); } g = GeomPick(g, p, ap, T, TN, axes); if (g && !pick) { /* Only bother if the caller will get to see these */ if (TN) { p->TmirpN = TmNInvert(p->TprimN, p->TmirpN); p->TwN = TmNInvert(TN, p->TwN); } else { TmInvert(p->Tprim, p->Tmirp); TmInvert(T, p->Tw); } } if (pick) PickDelete(pick); if (TN) TmNDelete(TN); return g; } /* * Simple generic Pick routine based on bounding-box intersection. * We succeed if the picked point lies within the screen projection of the * object, i.e. if the picked point lies within the smallest screen square * surrounding the object. The depth is that of the midpoint of the * bounding box: average of min and max depth. */ static Geom * GenericPick(Geom *g, Pick *p, Appearance *ap, Transform T, TransformN *TN, int axes[4]) { Geom *bbox; HPoint3 min, max; if (TN) { TransformN *proj; int i; proj = TmNCreate(TN->idim, 4, NULL); for (i = 0; i < TN->idim; i++) { proj->a[i*4+0] = TN->a[i*TN->odim+axes[3]]; proj->a[i*4+1] = TN->a[i*TN->odim+axes[0]]; proj->a[i*4+2] = TN->a[i*TN->odim+axes[1]]; proj->a[i*4+3] = TN->a[i*TN->odim+axes[2]]; } bbox = GeomBound(g, NULL, proj); TmNDelete(proj); } else { bbox = GeomBound(g, T, NULL); } BBoxMinMax((BBox*)bbox, &min, &max); if (min.x <= 0 && max.x >= 0 && min.y <= 0 && max.y >= 0 && .5*(min.z + max.z) <= p->got.z) { p->got.x = p->got.y = 0; p->got.z = .5 * (min.z + max.z); p->gprim = g; if (TN) { p->TprimN = TmNCopy(TN, p->TprimN); memcpy(p->axes, axes, sizeof(p->axes)); } else { TmCopy(T, p->Tprim); } return g; } return NULL; } Geom * GeomPick(Geom *g, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { Appearance *nap = ap; Geom *result; if(g == NULL) return NULL; if(g->Class->pick == NULL) { /* OOGLError(1, "Note: using GenericPick for class %s", (*g->Class->name)()); */ g->Class->pick = (GeomPickFunc *)GenericPick; } if(g->ap && (p->want & PW_VISIBLE)) nap = ApMerge( g->ap, ap, 0 ); result = (*g->Class->pick)(g, p, nap, T, TN, axes); if(ap != nap) ApDelete(nap); return result; } void PickDelete(Pick *p) { /* Note we don't GeomDelete(p->gprim); it wasn't RefIncr'd */ if(p) { if (p->f) OOGLFree(p->f); /* free the face list, if any */ if (p->TprimN) TmNDelete(p->TprimN); if (p->TmirpN) TmNDelete(p->TmirpN); if (p->TwN) TmNDelete(p->TwN); if (p->TselfN) TmNDelete(p->TselfN); vvfree(&p->gcur); vvfree(&p->gpath); OOGLFree(p); } } Pick * PickSet(Pick *p, int attr, ...) { va_list al; int a; if(p == NULL) { /* * Create new Pick structure */ p = OOGLNewE(Pick, "new Pick"); p->got.x = 0; p->got.y = 0; p->got.z = 1; p->thresh = 0.02; p->want = 0; p->found = 0; VVINIT(p->gcur, int, 1); VVINIT(p->gpath, int, 1); p->gprim = NULL; p->TprimN = NULL; p->TmirpN = NULL; p->TwN = NULL; p->TselfN = NULL; HPt3From(&p->v, 0.0, 0.0, 0.0, 1.0); p->vi = -1; HPt3From(&p->e[0], 0.0, 0.0, 0.0, 1.0); HPt3From(&p->e[1], 0.0, 0.0, 0.0, 1.0); p->ei[0] = -1; p->ei[1] = -1; p->f = NULL; p->fn = 0; p->fi = -1; TmIdentity(p->Tw2n); TmIdentity(p->Tc2n); TmIdentity(p->Ts2n); TmIdentity(p->Tprim); TmIdentity(p->Tmirp); TmIdentity(p->Tw); TmIdentity(p->Tself); } va_start(al, attr); for(a = attr; a != PA_END; a = va_arg(al, int)) { switch(a) { case PA_WANT: p->want = va_arg(al, int); break; case PA_THRESH: p->thresh = va_arg(al, double); break; case PA_POINT: p->got = *va_arg(al, Point3 *); break; case PA_DEPTH: p->got.z = va_arg(al, double); break; case PA_GPRIM: p->gprim = va_arg(al, Geom *); break; case PA_TPRIM: TmCopy(*va_arg(al, Transform *), p->Tprim); break; case PA_TPRIMN: p->TprimN = TmNCopy(*va_arg(al, TransformN **), p->TprimN); break; case PA_VERT: p->v = *va_arg(al, HPoint3 *); break; case PA_EDGE: { HPoint3 *e = va_arg(al, HPoint3 *); p->e[0] = e[0]; p->e[1] = e[1]; } break; case PA_FACE: p->f = va_arg(al, HPoint3 *); break; case PA_FACEN: p->fn = va_arg(al, int); break; case PA_TW2N: TmCopy(*va_arg(al, Transform *), p->Tw2n); break; case PA_TC2N: TmCopy(*va_arg(al, Transform *), p->Tc2n); break; case PA_TS2N: TmCopy(*va_arg(al, Transform *), p->Ts2n); break; default: OOGLError(1, "PickSet: unknown attribute %d", a); va_end(al); return p; } } va_end(al); return p; } int PickGet(Pick *p, int attr, void *attrp) { if(p == NULL) return -1; switch(attr) { case PA_WANT: *(int *)attrp = p->want; return 1; case PA_THRESH: *(float *)attrp = p->thresh; return 1; case PA_POINT: *(Point3 *)attrp = p->got; break; case PA_DEPTH: *(float *)attrp = p->got.z; break; case PA_GPRIM: *(Geom **)attrp = p->gprim; break; case PA_TPRIM: TmCopy(p->Tprim, *(Transform *)attrp); break; case PA_TPRIMN: *((TransformN **)attrp) = TmNCopy(p->TprimN, *((TransformN **)attrp)); break; case PA_TWORLD: TmCopy(p->Tw, *(Transform *)attrp); break; case PA_VERT: *(HPoint3 *)attrp = p->v; break; case PA_EDGE: ((HPoint3 *)attrp)[0] = p->e[0]; ((HPoint3 *)attrp)[1] = p->e[1]; break; case PA_FACE: *(HPoint3 **)attrp = p->f; break; case PA_FACEN: *(int *)attrp = p->fn; break; default: return -1; } return p->found; } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/pick.h0000644000175000001440000001153110522673176014777 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef PICKDEF #define PICKDEF /* * Public definitions for Geom Picking. */ typedef struct Pick Pick; /* Things to look for while picking * Specify PW_VERT|PW_EDGE|PW_FACE for all, * or a subset for more specific picks. * PW_VISIBLE checks Appearance to see what's * actually visible. */ #define PW_VERT 1 #define PW_EDGE 2 #define PW_FACE 4 #define PW_VISIBLE 8 #define PA_END 100 #define PA_THRESH 101 /* float; x/y threshold (in projected space) */ #define PA_POINT 102 /* Point3 *; Picked 3D point (object space) */ /* Note PA_POINT gives a Point3, not an HPoint3! */ #define PA_DEPTH 103 /* float; depth (== PA_POINT's screen z component) */ #define PA_GPRIM 104 /* Geom *; geometric primitive picked if any */ #define PA_TPRIM 105 /* Transform; from PA_GPRIM to PA_POINT, PA_VERT, etc. */ #define PA_TPRIMN 128 /* TransformN; from PA_GPRIM to PA_POINT, PA_VERT, etc. */ #define PA_TWORLD 111 /* Transform; from PA_POINT, PA_VERT, etc. to * world coords */ #define PA_TWORLDN 129 /* Transform; from PA_POINT, PA_VERT, etc. to * world coords */ #define PA_WANT 106 /* int; bitmask of desirable values */ #define PA_VERT 107 /* HPoint3 v; picked vertex, if any */ #define PA_EDGE 108 /* HPoint3 e[2]; endpoints of picked edge, if any */ #define PA_FACE 109 /* HPoint3 *f; pointer to array of vertices of picked face, if any */ #define PA_FACEN 110 /* number of elements in PA_FACE array; NOTE: when setting PA_FACE you must also set PA_FACEN. */ /* Stuff to specify via PickSet() to allow * INSTs with "location" fields to be pickable. */ #define PA_TC2N 112 /* Tfm camera coords to NDC (-1..+1) */ #define PA_TW2N 113 /* Tfm global coords to NDC */ #define PA_TS2N 114 /* Tfm screen (pixels; 0,0=lower left) to NDC */ extern Pick *PickSet( Pick *, int attr, ... ); extern int PickGet( Pick *, int attr, void *attrp ); extern void PickDelete( Pick * ); /* * Geometric Picking routines. * GeomMousePick() is intended for normal use by application programs. * g is the root of the Geom tree * p is the Pick structure created by PickSet(), etc., or NULL for default; * If p!=NULL, it is modified in place, so results of the pick can be * retrieved by later PickGet() calls. * ap is the Appearance in effect when g is drawn, used to determine * visibility of features if PW_VISIBLE is set; * Tproj is the complete object-to-screen projection matrix; * it normally maps world coordinates in g's space to * the unit cube -1 <= {x, y, z} <= 1, * with z = -1 at the near and z = +1 at the far clipping plane, * x = y = 0 at the center of the screen; * xpick and ypick are the relative (-1 <= {x,y} <= 1) window * coordinates of the pick. * * Typical use: * Point3 rawpt, pickworld, pickprim; * double mousex, mousey; ( each reduced to range -1 .. +1; 0=center ) * Geom *world, *g; * Pick *p = PickSet(NULL, PA_END); * Transform Tworld2screen, Tpick2world, Tpick2prim; * CamView( camera, Tworld2screen ); ( camera's world to screen ) * * g = GeomMousePick( world, p, ap, Tworld2screen, mousex, mousey ); * if(g != NULL) { (then g == world) * PickGet(p, PA_POINT, &rawpt); * PickGet(p, PA_TWORLD, Tpick2world); * Pt3Transform(Tpick2world, &rawpt, &pickworld); (in "world"'s coords) * * PickGet(p, PA_TPRIM, Tpick2prim); * Pt3Transform(Tpick2prim, &rawpt, &pickprim); (in leaf-level gprim's coords) * } */ extern Geom *GeomMousePick(Geom *g, Pick *p, Appearance *ap, Transform Tproj, TransformN *TNproj, int *axes, double xpick, double ypick ); /* * GeomPick() is an internal routine: * g, p, ap are as above for GeomMousePick. * T is adapted for convenience in pick calculations; * it is translated such that the pick goes through (x,y) = (0,0). */ extern Geom *GeomPick(Geom *g, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes); #endif /*PICKDEF*/ geomview-1.9.4/src/lib/gprim/geom/bsptree.c0000644000175000001440000012306610653722214015510 00000000000000/* Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif /* BSP-tree implementation. The members of the BSP-tree will be * polyhedrons, but the goal is to generate BSP-trees for QUADs and * MESHes too. Not for ND-objects, would probably not work. */ #include "geomclass.h" #include "polylistP.h" #include "mg.h" #include "mesh.h" #include "meshP.h" #include "quadP.h" #include "meshflag.h" #include "bsptree.h" #include "bsptreeP.h" #define BSPTREE_STATS 0 #if BSPTREE_STATS static int n_initial_polys; static int n_tree_polys; static int tree_depth; #endif #if 1 /* maybe lower the floating point tolerances a little bit? */ /* FLT_EPSILON: 1.19209290e-7F */ # undef TOLERANCE # undef fneg # undef fpos # undef fzero # undef fz # undef fnz /* BIG FAT NOTE: even 1e-3 seems to give reasonable rendering results, * though 1-e3 is quite large a tolerance. We should weight the * tolerance by the modulus of the co-ordinate data, this would make * the stuff more sane. */ # define TOLERANCE 1e-3 # define fneg(a) ((a)<-TOLERANCE) # define fpos(a) ((a)> TOLERANCE) # define fzero(a) (((a)-TOLERANCE)) # define fz(a) fzero(a) # define fnz(a) (!fzero(a)) #endif #define obstack_chunk_alloc malloc #define obstack_chunk_free free #define POLY_SCRATCH 0x80000000 /* Flag indicates that this polylives * on our obstack */ static void check_poly(Poly *poly) { int i; for (i = 0; i < poly->n_vertices; i++) { if (!finite(poly->v[i]->pt.x + poly->v[i]->pt.y + poly->v[i]->pt.z + poly->v[i]->pt.w)) { abort(); } } } #define ListPush(head, new_node) \ { \ PolyListNode *_lp_tmp_ = (new_node); \ _lp_tmp_->next = (head); (head) = _lp_tmp_; \ } #define ListPop(head, car) \ (car) = (head); (head) = (head)->next; (car)->next = NULL; typedef enum PolyPos { BACKOF = -1, COPLANAR = 0, INFRONTOF = 1, BOTH_SIDES = 2 } PolyPos; typedef struct EdgeIntersection { int v[2]; /* The vertex number of the enclosing points */ HPt3Coord scp[2]; /* The position of the vertices relative to the * intersection plane. */ } EdgeIntersection; static void BSPTreeCreateRecursive(BSPTreeNode *tree, PolyListNode *pllist, #if BSPTREE_STATS int depth, #endif struct obstack *scratch); static inline Poly *new_poly(int nv, Vertex **v, struct obstack *scratch) { Poly *newp; newp = obstack_alloc(scratch, sizeof(Poly)); memset(newp, 0, sizeof(Poly)); newp->flags = POLY_SCRATCH; newp->n_vertices = nv; if (v) { newp->v = v; } else { newp->v = obstack_alloc(scratch, nv*sizeof(Vertex *)); } if (newp->v) { memset(newp->v, 0, nv*sizeof(Vertex *)); } return newp; } static inline PolyListNode *new_poly_list_node(const void **tagged_app, struct obstack *scratch) { PolyListNode *new_pn; new_pn = obstack_alloc(scratch, sizeof(PolyListNode)); new_pn->pn = NULL; new_pn->tagged_app = tagged_app; return new_pn; } /* Generate a transformed copy of poly. */ static inline Poly *transform_poly(Transform T, Transform Tdual, Transform TxT, Poly *poly, struct obstack *scratch) { Poly *newp; int i; newp = new_poly(poly->n_vertices, NULL, scratch); for (i = 0; i < poly->n_vertices; i++) { newp->v[i] = obstack_alloc(scratch, sizeof(Vertex)); HPt3Transform(T, &poly->v[i]->pt, &newp->v[i]->pt); if (poly->flags & PL_HASVCOL) { newp->v[i]->vcol = poly->v[i]->vcol; } if (poly->flags & PL_HASVN) { NormalTransform(Tdual, &poly->v[i]->vn, &newp->v[i]->vn); } if (poly->flags & PL_HASST) { TxSTTransform (TxT, &poly->v[i]->st, &newp->v[i]->st); } } if (poly->flags & PL_HASPCOL) { newp->pcol = poly->pcol; } if (poly->flags & PL_HASPN) { NormalTransform(Tdual, &poly->pn, &newp->pn); } newp->flags = poly->flags; return newp; } /* Split the given polygon -- which must describe a quadrilateral -- * along the diagonal starting at "vertex". Used for splitting * non-flat or concave quadrilaterals. */ static inline void split_quad_poly(int vertex, Poly *poly0, PolyListNode **plist, const void **tagged_app, struct obstack *scratch) { PolyListNode *new_pn; Poly *poly[2]; Poly savedp; Vertex *savedv[4]; int i, v; if (poly0->flags & POLY_SCRATCH) { /* reuse the space */ savedp = *poly0; savedp.v = savedv; memcpy(savedp.v, poly0->v, 4*sizeof(Vertex *)); new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = poly[0] = poly0; poly[0]->n_vertices = 3; ListPush(*plist, new_pn); poly0 = &savedp; } for (i = (poly0->flags & POLY_SCRATCH) != 0; i < 2; i++) { new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = poly[i] = new_poly(3, NULL, scratch); ListPush(*plist, new_pn); } for (i = 0; i < 2; i++) { poly[i]->pcol = poly0->pcol; poly[i]->pn = poly0->pn; poly[i]->flags |= poly0->flags; } /* copy over vertex information, the _REAL_ poly normal will be * computed later, the need for that is flagged by POLY_SCRATCH. */ v = vertex; for (i = 0; i < 3; i++) { poly[0]->v[i] = poly0->v[v++]; v %= 4; } v = (v - 1 + 4) % 4; for (i = 0; i < 3; i++) { poly[1]->v[i] = poly0->v[v++]; v %= 4; } } static inline void meshv_to_polyv(Vertex *pv, Mesh *mesh, int vidx) { memset(pv, 0, sizeof(Vertex)); pv->pt = mesh->p[vidx]; #if 0 #if 0 HPt3Dehomogenize(&pv->pt, &pv->pt); #else Pt3ToHPt3((Point3 *)(void *)&pv->pt, &pv->pt, 1); #endif #endif if (mesh->geomflags & MESH_N) { pv->vn = mesh->n[vidx]; } if (mesh->geomflags & MESH_C) { pv->vcol = mesh->c[vidx]; } if (mesh->geomflags & MESH_U) { pv->st = mesh->u[vidx]; } } static inline void meshv_to_polyv_trans(Transform T, Transform Tdual, Transform TxT, Vertex *pv, Mesh *mesh, int vidx) { memset(pv, 0, sizeof(Vertex)); HPt3Transform(T, &mesh->p[vidx], &pv->pt); #if 0 /* why should we */ #if 0 HPt3Dehomogenize(&pv->pt, &pv->pt); #else Pt3ToHPt3((Point3 *)(void *)&pv->pt, &pv->pt, 1); #endif #endif if (mesh->geomflags & MESH_N) { NormalTransform(Tdual, &mesh->n[vidx], &pv->vn); } if (mesh->geomflags & MESH_C) { pv->vcol = mesh->c[vidx]; } if (mesh->geomflags & MESH_U) { TxSTTransform(TxT, &mesh->u[vidx], &pv->st); } } static PolyListNode * QuadToLinkedPolyList(Transform T, Transform Tdual, Transform TxT, const void **tagged_app, PolyListNode **plistp, Quad *quad, struct obstack *scratch) { PolyListNode *plist = NULL; Poly *qpoly; int i, j, concave; if (!plistp) { plistp = &plist; } if(!(quad->geomflags & QUAD_N)) { QuadComputeNormals(quad); } qpoly = NULL; for (i = 0; i < quad->maxquad; i++) { /* First try to create a single polygon, if that mesh-cell is * non-flat or concave, then sub-divide it. */ if (!qpoly) { qpoly = new_poly(4, NULL, scratch); for (j = 0; j < 4; j++) { qpoly->v[j] = obstack_alloc(scratch, sizeof(Vertex)); } } if (T && T != TM_IDENTITY) { for (j = 0; j < 4; j++) { memset(qpoly->v[j], 0, sizeof(Vertex)); HPt3Transform(T, &quad->p[i][j], &qpoly->v[j]->pt); NormalTransform(T, &quad->n[i][j], &qpoly->v[j]->vn); } } else { for (j = 0; j < 4; j++) { memset(qpoly->v[j], 0, sizeof(Vertex)); qpoly->v[j]->pt = quad->p[i][j]; qpoly->v[j]->vn = quad->n[i][j]; } } qpoly->flags |= PL_HASVN; if (quad->geomflags & QUAD_C) { qpoly->flags |= PL_HASVCOL; for (j = 0; j < 4; j++) { qpoly->v[j]->vcol = quad->c[i][j]; } } if (quad->geomflags & COLOR_ALPHA) { qpoly->flags |= COLOR_ALPHA; } PolyNormal(qpoly, &qpoly->pn, quad->geomflags & VERT_4D, false, &qpoly->flags, &concave); qpoly->flags |= PL_HASPN; if (qpoly->flags & POLY_NOPOLY) { /* degenerated, skip it, but reuse the memory region. */ qpoly->flags = 0; } else if (qpoly->flags & (POLY_CONCAVE|POLY_NONFLAT)) { /* we need to split it */ split_quad_poly(concave, qpoly, plistp, tagged_app, scratch); qpoly = NULL; } else { PolyListNode *new_pn; new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = qpoly; ListPush(*plistp, new_pn); qpoly = NULL; } } return *plistp; } /* Convert a Mesh into linked list of PolyListNodes, subdivide * non-flat or concave quadrilaterals. */ static PolyListNode * MeshToLinkedPolyList(Transform T, Transform Tdual, Transform TxT, const void **tagged_app, PolyListNode **plistp, Mesh *mesh, struct obstack *scratch) { PolyListNode *plist = NULL; Poly *qpoly; int v0 = 1, prev0v = 0; int u0 = 1, prev0u = 0; int u, v, prevu, prevv; int concave; int i; if (!plistp) { plistp = &plist; } MeshComputeNormals(mesh, MESH_N); if(mesh->geomflags & MESH_UWRAP) { v0 = 0, prev0v = mesh->nv-1; } if(mesh->geomflags & MESH_VWRAP) { u0 = 0, prev0u = mesh->nu-1; } #define MESHIDX(u, v, mesh) ((v)*(mesh)->nu + (u)) qpoly = NULL; for(prevv = prev0v, v = v0; v < mesh->nv; prevv = v, v++) { for(prevu = prev0u, u = u0; u < mesh->nu; prevu = u, u++) { /* First try to create a single polygon, if that mesh-cell is * non-flat or concave, then sub-divide it. */ if (!qpoly) { qpoly = new_poly(4, NULL, scratch); for (i = 0; i < 4; i++) { qpoly->v[i] = obstack_alloc(scratch, sizeof(Vertex)); } } if (T && T != TM_IDENTITY) { meshv_to_polyv_trans(T, Tdual, TxT, qpoly->v[0], mesh, MESHIDX(prevu, prevv, mesh)); meshv_to_polyv_trans(T, Tdual, TxT, qpoly->v[1], mesh, MESHIDX(u, prevv, mesh)); meshv_to_polyv_trans(T, Tdual, TxT, qpoly->v[2], mesh, MESHIDX(u, v, mesh)); meshv_to_polyv_trans(T, Tdual, TxT, qpoly->v[3], mesh, MESHIDX(prevu, v, mesh)); } else { meshv_to_polyv(qpoly->v[0], mesh, MESHIDX(prevu, prevv, mesh)); meshv_to_polyv(qpoly->v[1], mesh, MESHIDX(u, prevv, mesh)); meshv_to_polyv(qpoly->v[2], mesh, MESHIDX(u, v, mesh)); meshv_to_polyv(qpoly->v[3], mesh, MESHIDX(prevu, v, mesh)); } if (mesh->geomflags & MESH_C) { qpoly->flags |= PL_HASVCOL; } if (mesh->geomflags & COLOR_ALPHA) { qpoly->flags |= COLOR_ALPHA; } if (mesh->geomflags & MESH_N) { qpoly->flags |= PL_HASVN; } if (mesh->geomflags & MESH_U) { qpoly->flags |= PL_HASST; } PolyNormal(qpoly, &qpoly->pn, mesh->geomflags & VERT_4D, false, &qpoly->flags, &concave); qpoly->flags |= PL_HASPN; if (qpoly->flags & POLY_NOPOLY) { /* polygon is degenerated, we just do NOT draw it, edges are * drawn by other methods. Just do nothing, qpoly will be * re-used for the next quad. */ qpoly->flags = 0; } else if (qpoly->flags & (POLY_CONCAVE|POLY_NONFLAT)) { /* we need to split it */ split_quad_poly(concave, qpoly, plistp, tagged_app, scratch); qpoly = NULL; } else { PolyListNode *new_pn; new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = qpoly; ListPush(*plistp, new_pn); qpoly = NULL; } } } #undef MESHIDX return *plistp; } #if HAVE_LIBGLU # include # include /* GLU tesselator interface for non-convex multi-vertex (> 4) * polygons. We allocate new vertices using the BSPTree obstack. */ struct tess_data { PolyListNode **plistp; const void **tagged_app; Poly *trickyp; /* original polygon */ unsigned polyflags; Point3 *pn; GLenum type; Poly *p; /* current polygon */ int vcnt; /* vertex count after begin() callback */ Vertex *v[2]; /* for TRIANGLE_STRIP and TRIANGLE_FAN */ struct obstack *scratch; }; void tess_combine_data(GLdouble coords[3], Vertex *vertex_data[4], GLfloat weight[4], Vertex **outData, struct tess_data *data) { Vertex *v = obstack_alloc(data->scratch, sizeof(Vertex)); HPt3Coord w; int i, n; /* Although otherwise documented at least the Mesa version of the * GLU tesselator sometimes does not fill vertex_data with valid * pointers. */ for (n = 3; n >= 0 && vertex_data[n] == NULL; --n); ++n; if (data->polyflags & VERT_ST) { /* texture co-ordinates */ for (i = 0; i < n; i++) { v->st.s += weight[i] * vertex_data[i]->st.s; v->st.t += weight[i] * vertex_data[i]->st.t; } /* same linear combination stuff as in SplitPolyNode(); be careful * not to dehomogenize, otherwise texturing might come out wrong. */ for (i = 0, w = 0.0; i < n; i++) { w += weight[i] * vertex_data[i]->pt.w; } } else { /* just use whatever has been passed in coords */ w = 1.0; } v->pt.x = coords[0] * w; v->pt.y = coords[1] * w; v->pt.z = coords[2] * w; v->pt.w = w; if (data->polyflags & VERT_C) { /* colors */ memset(&v->vcol, 0, sizeof(v->vcol)); for (i = 0; i < n; i++) { v->vcol.r += weight[i] * vertex_data[i]->vcol.r; v->vcol.g += weight[i] * vertex_data[i]->vcol.g; v->vcol.b += weight[i] * vertex_data[i]->vcol.b; v->vcol.a += weight[i] * vertex_data[i]->vcol.a; } } if (true || (data->polyflags & VERT_N)) { /* we _have_ normals */ /* The averaged vertex normals do not have an orientation, so try * to orient them w.r.t. the polygon normal before computing the * linear combination. */ memset(&v->vn, 0, sizeof(v->vn)); for (i = 0; i < n; i++) { Point3 *vn = &vertex_data[i]->vn; if (Pt3Dot(vn, data->pn) < 0.0) { Pt3Comb(-weight[i], vn, 1.0, &v->vn, &v->vn); } else { Pt3Comb(weight[i], vn, 1.0, &v->vn, &v->vn); } } Pt3Unit(&v->vn); } *outData = v; } void tess_begin_data(GLenum type, struct tess_data *data) { data->type = type; data->vcnt = 0; /* reset counter */ } void tess_vertex_data(Vertex *v, struct tess_data *data) { /* Here we have to do all the work, depending on what flag * previously has been passed to the begin() callback. */ if (data->vcnt == 0) { /* create a new polygon */ data->p = new_poly(3, NULL, data->scratch); data->p->flags |= data->polyflags; if (data->polyflags & FACET_C) { data->p->pcol = data->trickyp->pcol; } data->p->pn = *data->pn; /* always inherit the normal */ } switch (data->type) { case GL_TRIANGLES: /* the easy case */ /* add the vertex */ data->p->v[data->vcnt] = v; if (++data->vcnt == 3) { /* add the polygon to *data->plistp */ PolyListNode *new_pn; data->vcnt = 0; new_pn = new_poly_list_node(data->tagged_app, data->scratch); new_pn->poly = data->p; data->p = NULL; ListPush(*data->plistp, new_pn); } break; case GL_TRIANGLE_STRIP: /* pairs of triangles, all with the same orientation */ if (data->vcnt > 2) { /* create a new polygon */ data->p = new_poly(3, NULL, data->scratch); data->p->flags |= data->polyflags; if (data->polyflags & FACET_C) { data->p->pcol = data->trickyp->pcol; } data->p->pn = *data->pn; /* always inherit the normal */ data->p->v[0] = data->v[0]; data->p->v[1] = data->v[1]; /* add the vertex */ data->p->v[2] = v; } else { /* add the vertex */ data->p->v[data->vcnt] = v; } if (++data->vcnt > 2) { /* add the polygon to *data->plistp */ PolyListNode *new_pn; if (data->vcnt & 1) { data->v[0] = data->p->v[2]; data->v[1] = data->p->v[1]; } else { data->v[0] = data->p->v[0]; data->v[1] = data->p->v[2]; } new_pn = new_poly_list_node(data->tagged_app, data->scratch); new_pn->poly = data->p; ListPush(*data->plistp, new_pn); } break; case GL_TRIANGLE_FAN: if (data->vcnt > 2) { /* create a new polygon */ data->p = new_poly(3, NULL, data->scratch); data->p->flags |= data->polyflags; if (data->polyflags & FACET_C) { data->p->pcol = data->trickyp->pcol; } data->p->pn = *data->pn; /* always inherit the normal */ data->p->v[0] = data->v[0]; data->p->v[1] = data->v[1]; /* add the vertex */ data->p->v[2] = v; } else { if (data->vcnt == 0) { data->v[0] = v; } data->p->v[data->vcnt] = v; } if (++data->vcnt > 2) { /* add the polygon to *data->plistp */ PolyListNode *new_pn; data->v[1] = data->p->v[2]; new_pn = new_poly_list_node(data->tagged_app, data->scratch); new_pn->poly = data->p; ListPush(*data->plistp, new_pn); } break; default: break; } } #endif /* convert a PolyList into a linked list of PolyListNodes, subdivide * non-flat or concave polgons */ static PolyListNode * PolyListToLinkedPoyList(Transform T, Transform Tdual, Transform TxT, const void **tagged_app, PolyListNode **plistp, PolyList *pl, struct obstack *scratch) { PolyListNode *plist = NULL; int pnr; if (!plistp) { plistp = &plist; } PolyListComputeNormals(pl, PL_HASVN|PL_HASPN|PL_HASPFL); for (pnr = 0; pnr < pl->n_polys; pnr++) { PolyListNode *new_pn; Poly *poly; if (pl->p[pnr].flags & POLY_NOPOLY) { /* degenerated, just skip it */ continue; } poly = &pl->p[pnr]; poly->flags |= pl->geomflags; if (T && T != TM_IDENTITY) { poly = transform_poly(T, Tdual, TxT, poly, scratch); } switch (pl->p[pnr].n_vertices) { case 3: /* ok */ new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = poly; ListPush(*plistp, new_pn); break; #if !HAVE_LIBGLU case 4: /* supported */ if (pl->p[pnr].flags & (POLY_NONFLAT|POLY_CONCAVE)) { /* split this polygon along a diagonal, if the polygon is * concave: split across the unique concave vertex. */ int concave; if (pl->p[pnr].flags & POLY_CONCAVE) { Point3 nu; /* We need to determine the concave vertex */ PolyNormal(poly, &nu, pl->geomflags & VERT_4D, false, NULL, &concave); } else { concave= 0; } split_quad_poly(concave, poly, plistp, tagged_app, scratch); } else { new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = poly; ListPush(*plistp, new_pn); } break; default: if (pl->p[pnr].flags & (POLY_NONFLAT|POLY_CONCAVE)) { static int was_here; if (!was_here ) { GeomError(1, "Non-flat or concave polygons not supported yet.\n"); was_here = 1; } } new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = poly; ListPush(*plistp, new_pn); break; #else case 4: /* if we want to be able to render polygons with * self-intersections "correctly", then we always have to use * the GLU tesselater for polygons with more than 4 vertices and * for non-convex quadrilaterals. We can handle non-flat * quadrilaterals ourselves. */ if ((pl->p[pnr].flags & (POLY_NONFLAT|POLY_CONCAVE)) == POLY_NONFLAT) { /* Split this polygon along a diagonal. Leave concave * quadrilaterals to the GLU tesselator; they could have * self-intersections. */ split_quad_poly(0, poly, plistp, tagged_app, scratch); } else if ((pl->p[pnr].flags & POLY_CONCAVE) == 0) { new_pn = new_poly_list_node(tagged_app, scratch); new_pn->poly = poly; ListPush(*plistp, new_pn); } /* otherwise fall into the > 4 vertices case and leave * everything to the GLU tesselator. */ default: { /* We use the GLU tesselator here, if available. It is not * necessary to reinvent the wheel; also, the OpenGL MG backend * also uses the tesselator (so we will get comparable shapes * w/o translucency). */ static GLUtesselator *glutess; struct tess_data tessdata[1]; VARARRAY2(dv, GLdouble, poly->n_vertices, 3); Vertex **vp; int i; if (glutess == NULL) { glutess = gluNewTess(); gluTessProperty(glutess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO); gluTessCallback(glutess, GLU_TESS_BEGIN_DATA, (GLvoid (*)())tess_begin_data); gluTessCallback(glutess, GLU_TESS_VERTEX_DATA, (GLvoid (*)())tess_vertex_data); gluTessCallback(glutess, GLU_TESS_COMBINE_DATA, (GLvoid (*)())tess_combine_data); } tessdata->trickyp = poly; tessdata->polyflags = poly->flags; tessdata->pn = &poly->pn; tessdata->scratch = scratch; tessdata->plistp = plistp; tessdata->tagged_app = tagged_app; /* tell GLU what we think is a good approximation for the normal */ gluTessNormal(glutess, poly->pn.x, poly->pn.y, poly->pn.z); /* rest is done in the callback functions */ gluTessBeginPolygon(glutess, tessdata); gluTessBeginContour(glutess); for (i = 0, vp = poly->v; i < poly->n_vertices; i++, vp++) { HPt3Coord w = (*vp)->pt.w ? (*vp)->pt.w : 1e20; if (w == 1.0) { dv[i][0] = (*vp)->pt.x; dv[i][1] = (*vp)->pt.y; dv[i][2] = (*vp)->pt.z; } else { dv[i][0] = (*vp)->pt.x / w; dv[i][1] = (*vp)->pt.y / w; dv[i][2] = (*vp)->pt.z / w; } gluTessVertex(glutess, dv[i], *vp); } gluTessEndContour(glutess); gluTessEndPolygon(glutess); break; /* out of switch */ } /* default */ #endif } /* switch */ } /* for */ return *plistp; } /* Create an empty BSP-tree and attach "object" to it. */ BSPTree *BSPTreeCreate(BSPTree *tree, Geom *object) { if (tree) { BSPTreeFreeTree(tree); } else { tree = OOGLNewE(BSPTree, "new BSP tree root"); memset(tree, 0, sizeof(BSPTree)); obstack_init(&tree->obst); } tree->geom = object; tree->T = TM_IDENTITY; tree->TxT = TM_IDENTITY; tree->tagged_app = NULL; return tree; } /* Add "object" to "bsptree"'s _INITIAL_ list of polygons; * bsptree->tree has to be NULL at this point, otherwise this is a * no-op. * * BUG: this should probably converted into a "method" which is * attached to each instance of a Geom. Do that later. If I find the * time. Never do that ... */ void BSPTreeAddObject(BSPTree *bsptree, Geom *object) { if (bsptree->tree) { static int was_here; if (!was_here ) { GeomError(1, "Adding polygons to a finalized BSP-tree is " "not implemented.\n"); was_here = 1; } return; /* Cannot add to finalized tree */ } /* Make a linked list of polyhedrons from object */ switch (object->magic) { case PLMAGIC: PolyListToLinkedPoyList(bsptree->T, bsptree->Tdual, bsptree->TxT, bsptree->tagged_app, &bsptree->init_lpl, (PolyList *)object, &bsptree->obst); break; case MESHMAGIC: MeshToLinkedPolyList(bsptree->T, bsptree->Tdual, bsptree->TxT, bsptree->tagged_app, &bsptree->init_lpl, (Mesh *)object, &bsptree->obst); break; case QUADMAGIC: QuadToLinkedPolyList(bsptree->T, bsptree->Tdual, bsptree->TxT, bsptree->tagged_app, &bsptree->init_lpl, (Quad *)object, &bsptree->obst); break; default: /* Do nothing */ break; } } /* The work-horse: really generate the tree, sub-divide as necessary. * We build a complete bsp-tree, i.e. each leaf-node contains only * co-planar polygons. */ void BSPTreeFinalize(BSPTree *bsptree) { if (bsptree->tree) { return; } #if BSPTREE_STATS { PolyListNode *pos; n_initial_polys = 0; for (pos = bsptree->init_lpl; pos; pos = pos->next) { ++n_initial_polys; } OOGLWarn("#initial polygons: %d", n_initial_polys); } #endif /* After bsptree->tree has been allocated adding to the tree is no * longer possible. */ bsptree->tree = obstack_alloc(&bsptree->obst, sizeof(BSPTreeNode)); if (!bsptree->init_lpl) { /* create an empty tree */ memset(bsptree->tree, 0, sizeof(BSPTreeNode)); return; } #if BSPTREE_STATS n_tree_polys = n_initial_polys; tree_depth = 0; #endif /* Do it. */ BSPTreeCreateRecursive(bsptree->tree, bsptree->init_lpl, #if BSPTREE_STATS 0, #endif &bsptree->obst); /* We build a complete tree, and discard all degenerated polygons, * so the polygon list is empty after creating the tree. */ bsptree->init_lpl = NULL; #if BSPTREE_STATS OOGLWarn("#tree polygons: %d", n_tree_polys); OOGLWarn("tree depth: %d", tree_depth); #endif } void BSPTreeFreeTree(const BSPTree *_tree) { BSPTree *tree = (BSPTree *)_tree; if (tree->tree != NULL || tree->init_lpl != NULL) { obstack_free(&tree->obst, NULL); obstack_init(&tree->obst); tree->tree = NULL; tree->init_lpl = NULL; tree->Tid = NULL; tree->Tidinv = NULL; tree->tagged_app = NULL; tree->oneshot = false; } } /* Geometries attached to INSTs or LISTs can be deleted underneath the * BSP-tree; so INSTs and LISTs must register a callback with their * handles. */ void BSPTreeInvalidate(Handle **chp, Ref *unused, BSPTree *self) { BSPTreeFreeTree(self); } /* This is really easy, 'cause we are using an obstack. */ void BSPTreeFree(BSPTree *tree) { if (tree != NULL) { obstack_free(&tree->obst, NULL); OOGLFree(tree); } } BSPTree *BSPTreeSet(BSPTree *tree, int attr1, ...) { int attr; va_list alist; #undef NEXT #define NEXT(type) va_arg(alist, type) va_start(alist, attr1); for (attr = attr1; attr != BSPTREE_END; attr = NEXT(int)) { switch (attr) { case BSPTREE_ONESHOT: tree->oneshot = NEXT(int); break; default: OOGLError(1, "BSPTreeSet: unknown attribute %d", attr); break; } } va_end(alist); return tree; } BSPTree *GeomBSPTree(Geom *geom, BSPTree *tree, int action) { const void **tagged_app = NULL; NodeData *pernode; if (!geom) { return NULL; } if (!geom->Class->bsptree) { return NULL; } switch (action) { case BSPTREE_CREATE: if (tree == NULL) { geom->bsptree = tree = BSPTreeCreate(geom->bsptree, geom); } pernode = GeomNodeDataCreate(geom, NULL); pernode->node_tree = tree; break; case BSPTREE_ADDGEOM: if (geom == tree->geom) { BSPTreeSetId(tree); } tagged_app = BSPTreePushAppearance(tree, geom); break; case BSPTREE_DELETE: if (tree == NULL || (tree = geom->bsptree) == NULL) { return NULL; } break; default: break; } (*geom->Class->bsptree)(geom, tree, action); switch (action) { case BSPTREE_DELETE: pernode = GeomNodeDataByPath(geom, NULL); pernode->node_tree = NULL; if (tree->geom == geom) { BSPTreeFree(tree); tree = geom->bsptree = NULL; } break; case BSPTREE_ADDGEOM: BSPTreePopAppearance(tree, tagged_app); break; default: break; } return tree; } Geom *GeomBSPTreeDraw(Geom *geom) { BSPTree *tree = geom->bsptree; if (tree == NULL || !(geom->geomflags & GEOM_ALPHA)) { return NULL; } /* 3d-view: tree might be persistent, but is only created on * demand. Do that now. * * Nd-view: tree is not persistent, but tree->init_lpl should be != * NULL at this stage. */ if (tree->tree == NULL) { if (tree->init_lpl == NULL) { GeomBSPTree((Geom *)geom, tree, BSPTREE_ADDGEOM); } BSPTreeFinalize(tree); } mgbsptree(tree); if (tree->oneshot) { /* This means we have an INST with location/origin != LOCAL; or * ND-drawing. Free the tree now. */ BSPTreeFreeTree(tree); } return geom; } static inline void CoLinSum(float a, ColorA *ca, float b, ColorA *cb, ColorA *cres) { cres->r = a*ca->r + b*cb->r; cres->g = a*ca->g + b*cb->g; cres->b = a*ca->b + b*cb->b; cres->a = a*ca->a + b*cb->a; } /* Split plnode along plane. We know that plane really intersects * plnode->poly. We also know that plnode->poly is planar and convex. * * Given this assumptions we know that plnode->poly has to be split * into exactly two pieces. */ static inline void SplitPolyNode(PolyListNode *plnode, PolyListNode **front, PolyListNode **back, EdgeIntersection edges[2], struct obstack *scratch) { const void **tagged_app = plnode->tagged_app; Poly *poly, savedp; Vertex *v0, *v1, **vpos, **savedv; int istart[2], iend[2], i, nv[2]; Vertex *vstart[2], *vend[2]; #if BSPTREE_STATS ++n_tree_polys; #endif poly = plnode->poly; vstart[0] = vstart[1] = vend[0] = vend[1] = NULL; istart[0] = istart[1] = iend[0] = iend[1] = -1; /* first point of intersection */ if (fzero(edges[0].scp[0])) { v0 = poly->v[edges[0].v[0]]; if (fpos(edges[0].scp[1])) { istart[0] = edges[0].v[0]; iend[1] = edges[0].v[0]; } else { istart[1] = edges[0].v[0]; iend[0] = edges[0].v[0]; } } else if (fzero(edges[0].scp[1])) { v0 = poly->v[edges[0].v[1]]; if (fpos(edges[0].scp[0])) { istart[1] = edges[0].v[1]; iend[0] = edges[0].v[1]; } else { istart[0] = edges[0].v[1]; iend[1] = edges[0].v[1]; } } else { HPt3Coord mu0, mu1; Vertex *V0 = poly->v[edges[0].v[0]]; Vertex *V1 = poly->v[edges[0].v[1]]; v0 = obstack_alloc(scratch, sizeof(Vertex)); mu0 = edges[0].scp[1]/(edges[0].scp[1]-edges[0].scp[0]); #if 0 mu1 = edges[0].scp[0]/(edges[0].scp[0]-edges[0].scp[1]); #else mu1 = 1.0 - mu0; #endif /* Use denormalized variant; otherwise textures may come out wrong * because the homogeneous divisor is used for perspective * corrections. */ if (poly->flags & VERT_ST) { v0->st.s = mu0 * V0->st.s + mu1 * V1->st.s; v0->st.t = mu0 * V0->st.t + mu1 * V1->st.t; HPt3LinSumDenorm(mu0, &V0->pt, mu1, &V1->pt, &v0->pt); } else { HPt3LinSum(mu0, &V0->pt, mu1, &V1->pt, &v0->pt); } if (!finite(v0->pt.x + v0->pt.y + v0->pt.z)){ abort(); } if (poly->flags & VERT_C) { CoLinSum(mu0, &V0->vcol, mu1, &V1->vcol, &v0->vcol); } if (true || (poly->flags & VERT_N)) { /* The averaged vertex normals do not have an orientation, so * try to orient them w.r.t. the polygon normal before computing * the linear combination. */ if (Pt3Dot(&V0->vn, &poly->pn)*Pt3Dot(&V1->vn, &poly->pn) < 0) { Pt3Comb(-mu0, &V0->vn, mu1, &V1->vn, &v0->vn); } else { Pt3Comb(mu0, &V0->vn, mu1, &V1->vn, &v0->vn); } Pt3Unit(&v0->vn); } if (fpos(edges[0].scp[0])) { vstart[1] = vend[0] = v0; istart[1] = edges[0].v[1]; iend[0] = edges[0].v[0]; } else { vstart[0] = vend[1] = v0; istart[0] = edges[0].v[1]; iend[1] = edges[0].v[0]; } } /* second point of intersection */ if (fzero(edges[1].scp[0])) { v1 = poly->v[edges[1].v[0]]; if (fpos(edges[1].scp[1])) { istart[0] = edges[1].v[0]; iend[1] = edges[1].v[0]; } else { istart[1] = edges[1].v[0]; iend[0] = edges[1].v[0]; } } else if (fzero(edges[1].scp[1])) { v1 = poly->v[edges[1].v[1]]; if (fpos(edges[1].scp[0])) { istart[1] = edges[1].v[1]; iend[0] = edges[1].v[1]; } else { istart[0] = edges[1].v[1]; iend[1] = edges[1].v[1]; } } else { HPt3Coord mu0, mu1; Vertex *V0 = poly->v[edges[1].v[0]]; Vertex *V1 = poly->v[edges[1].v[1]]; v1 = obstack_alloc(scratch, sizeof(Vertex)); mu0 = edges[1].scp[1]/(edges[1].scp[1]-edges[1].scp[0]); #if 0 mu1 = edges[1].scp[0]/(edges[1].scp[0]-edges[1].scp[1]); #else mu1 = 1.0 - mu0; #endif if (poly->flags & VERT_ST) { v1->st.s = mu0 * V0->st.s + mu1 * V1->st.s; v1->st.t = mu0 * V0->st.t + mu1 * V1->st.t; HPt3LinSumDenorm(mu0, &V0->pt, mu1, &V1->pt, &v1->pt); } else { HPt3LinSum(mu0, &V0->pt, mu1, &V1->pt, &v1->pt); } if (!finite(v1->pt.x + v1->pt.y + v1->pt.z)) abort(); if (poly->flags & VERT_C) { CoLinSum(mu0, &V0->vcol, mu1, &V1->vcol, &v1->vcol); } if (true || (poly->flags & VERT_N)) { if (Pt3Dot(&V0->vn, &poly->pn)*Pt3Dot(&V1->vn, &poly->pn) < 0) { Pt3Comb(-mu0, &V0->vn, mu1, &V1->vn, &v1->vn); } else { Pt3Comb(mu0, &V0->vn, mu1, &V1->vn, &v1->vn); } Pt3Unit(&v1->vn); } if (fpos(edges[1].scp[0])) { vstart[1] = vend[0] = v1; istart[1] = edges[1].v[1]; iend[0] = edges[1].v[0]; } else { vstart[0] = vend[1] = v1; istart[0] = edges[1].v[1]; iend[1] = edges[1].v[0]; } } ListPush(*front, plnode); ListPush(*back, new_poly_list_node(tagged_app, scratch)); if ((poly->flags & POLY_NONFLAT)) { if (!(*front)->pn) { /* Compute the normal on the parent element to avoid numerical * instabilities on increasingly degenerated polygons. */ (*front)->pn = obstack_alloc(scratch, sizeof(Point3)); PolyNormal(poly, (*front)->pn, true /* 4d */, false /* evert */, NULL, NULL); } (*back)->pn = (*front)->pn; } for (i = 0; i < 2; i++) { nv[i] = iend[i] - istart[i] + 1; if (nv[i] < 0) { nv[i] += poly->n_vertices; } nv[i] += (vstart[i] != NULL) + (vend[i] != NULL); } if (poly->flags & POLY_SCRATCH) { savedp = *poly; savedv = alloca(poly->n_vertices*sizeof(Vertex *)); memcpy(savedv, poly->v, poly->n_vertices*sizeof(Vertex *)); if (nv[0] <= poly->n_vertices) { poly->n_vertices = nv[0]; (*front)->poly = poly; (*back)->poly = new_poly(nv[1], NULL, scratch); } else { if (nv[1] > poly->n_vertices) { abort(); } poly->n_vertices = nv[1]; (*back)->poly = poly; (*front)->poly = new_poly(nv[0], NULL, scratch); } /* Attention: gcc had problems with this code snippet with * -fstrict-aliasing, the "#if 1" stuff seems to work. In the * "#else" version gcc somehow lost the "savedp.v = savedv" * assignment. I think this is a compiler bug. */ poly = &savedp; #if 1 poly->v = savedv; #else savedp.v = savedv; #endif } else { (*front)->poly = new_poly(nv[0], NULL, scratch); (*back)->poly = new_poly(nv[1], NULL, scratch); } for (i = 0; i < 2; i++) { PolyListNode *half = (i == 0) ? *front : *back; int j; vpos = half->poly->v; if (vstart[i] != NULL) { *vpos++ = vstart[i]; } if (istart[i] <= iend[i]) { for (j = istart[i]; j <= iend[i] && j < poly->n_vertices; j++) { *vpos++ = poly->v[j]; } } else { for (j = istart[i]; j < poly->n_vertices; j++) { *vpos++ = poly->v[j]; } for (j = 0; j <= iend[i]; j++) { *vpos++ = poly->v[j]; } } if (vend[i] != NULL) { *vpos++ = vend[i]; } half->poly->pcol = poly->pcol; half->poly->pn = poly->pn; half->poly->flags = poly->flags|POLY_SCRATCH; check_poly(half->poly); } } /* Compute the plane equation for this polygon; copy the normal for * originally flat polygons, really compute it for polygons created by * sub-division from non-flat polygons. */ static inline void PolyPlane(PolyListNode *plnode, HPoint3 *plane) { if (plnode->pn) { *(Point3 *)plane = *plnode->pn; } else if (plnode->poly->flags & POLY_NONFLAT) { /* The polygon actually _IS_ flat -- BSPTreeCreate() is * responsible to make that sure, but we have to compute the * normal ourselves. We do not need to remember the normal because * when this function is called, then plnode has found its "home" * tree-node. */ PolyNormal(plnode->poly, (Point3 *)(void *)plane, true /* fourd */, false /* evert */, NULL, NULL); } else { *(Point3 *)plane = plnode->poly->pn; } plane->w = HPt3DotPt3(&plnode->poly->v[0]->pt, (Point3 *)(void *)plane); } static inline HPt3Coord PlaneDistance(HPoint3 *plane, HPoint3 *v) { HPt3Coord dist; dist = HPt3DotPt3(v, (Point3 *)plane) - plane->w; if (!finite(dist)) { dist = 1e8; /* infinity */ } return dist; } /* Loop over all vertices and determine on which side of the plane * defined by "n" we live, if not on both sides. We assume at this * point that the polygon is _FLAT_. The main entry-point * BSPTreeCreate() has to split polygons such that this is true. Maybe * we will allow for non-convex polygons here, but _FLAT_ is a must. */ static inline PolyPos ClassifyPoly(HPoint3 *plane, Poly *poly, EdgeIntersection edges[2]) { HPt3Coord scp0, scp1 = 0.0, scp2, scp3 = 0.0; PolyPos sign0, sign1 = COPLANAR, sign2, sign3 = COPLANAR; int i, i0, i2; scp0 = PlaneDistance(plane, &poly->v[0]->pt); sign0 = (PolyPos)(fpos(scp0) - fneg(scp0)); if (sign0 == COPLANAR) { for (i = 1; i < poly->n_vertices; i++) { scp1 = PlaneDistance(plane, &poly->v[i]->pt); sign1 = (PolyPos)(fpos(scp1) - fneg(scp1)); if (sign1 != COPLANAR) { break; } scp0 = scp1; sign0 = sign1; } if (i >= 2) { return sign1; } /* at this point: sign0 == 0 and sign1 != 0, loop until we find * the next zero crossing. */ i0 = 0; sign2 = sign1; scp2 = scp1; for (++i; i < poly->n_vertices; i++) { scp3 = PlaneDistance(plane, &poly->v[i]->pt); sign3 = (PolyPos)(fpos(scp3) - fneg(scp3)); if (sign3 != sign2) { break; } scp2 = scp3; sign2 = sign3; } if (i == poly->n_vertices) { return sign1; } /* At this point we have sign0 == 0 != sign1 == sign2 != sign3. If * sign3 == 0, then the next vertex may also be located on the * plane => sign1 == sign2 determine the side we are located on. * * Otherwise sign3 must be != sign1 and we have to sub-divide this * polygon. */ if (sign3 == COPLANAR) { if (i == poly->n_vertices-1) { return sign1; } scp2 = scp3; sign2 = sign3; scp3 = PlaneDistance(plane, &poly->v[++i]->pt); sign3 = (PolyPos)(fpos(scp3) - fneg(scp3)); if (sign3 == COPLANAR) { return sign1; } else if (sign3 == sign1) { /* impossible case with exact arithmetic; this should mean * that we are in the COPLANAR case. Assume that? Or retry * with increased telerance? */ return COPLANAR; /* FIXME */ } } /* At this point we have sign0 == 0 != sign1. sign2 may be 0, then * sign3 != sign1. Or 0 == sign0 != sign1 == sign2 != sign 3. At * any rate we are located on both sides. */ i2 = i-1; } else { /* Loop until we find a change of sign */ for (i = 1; i < poly->n_vertices; i++) { scp1 = PlaneDistance(plane, &poly->v[i]->pt); sign1 = (PolyPos)(fpos(scp1) - fneg(scp1)); if (sign1 != sign0) { break; } scp0 = scp1; sign0 = sign1; } if (i == poly->n_vertices) { return sign1; } i0 = i-1; sign2 = sign1; scp2 = scp1; if (sign2 == COPLANAR) { /* if sign2 is accidentally 0, then the next point must be != 0, * or sign0 determines the proper side. */ ++i; i %= poly->n_vertices; scp3 = PlaneDistance(plane, &poly->v[i]->pt); sign3 = (PolyPos)(fpos(scp3) - fneg(scp3)); if (sign3 == COPLANAR || sign3 == sign0) { return sign0; } scp2 = scp3; sign2 = sign3; } /* loop until we find the next zero crossing, at this point we * have 0 != sign0 != sign1, 0 != sign2 != sign0, the polygon * cannot be on one side of the plane. */ for (++i; i < poly->n_vertices; i++) { scp3 = PlaneDistance(plane, &poly->v[i]->pt); sign3 = (PolyPos)(fpos(scp3) - fneg(scp3)); if (sign3 != sign2) { break; } scp2 = scp3; sign2 = sign3; } if (i == poly->n_vertices) { if (i0 == 0) { scp3 = scp0; sign3 = sign0; } else { scp3 = PlaneDistance(plane, &poly->v[0]->pt); sign3 = (PolyPos)(fpos(scp3) - fneg(scp3)); } } i2 = i-1; } /* points of intersection between [i0,i0+1], [i2,i2+1] */ edges[0].v[0] = i0; edges[0].v[1] = i0+1; edges[0].scp[0] = scp0; edges[0].scp[1] = scp1; edges[1].v[0] = i2; edges[1].v[1] = (i2+1) % poly->n_vertices; edges[1].scp[0] = scp2; edges[1].scp[1] = scp3; return BOTH_SIDES; } static void BSPTreeCreateRecursive(BSPTreeNode *tree, PolyListNode *pllist, #if BSPTREE_STATS int depth, #endif struct obstack *scratch) { PolyListNode *plnode, *front, *back; EdgeIntersection edges[2]; tree->front = tree->back = NULL; ListPop(pllist, plnode); tree->polylist = plnode; check_poly(plnode->poly); PolyPlane(plnode, &tree->plane); front = back = NULL; while (pllist) { ListPop(pllist, plnode); check_poly(plnode->poly); switch (ClassifyPoly(&tree->plane, plnode->poly, edges)) { case BACKOF: check_poly(plnode->poly); ListPush(back, plnode); break; case COPLANAR: check_poly(plnode->poly); ListPush(tree->polylist, plnode); break; case INFRONTOF: check_poly(plnode->poly); ListPush(front, plnode); break; case BOTH_SIDES: check_poly(plnode->poly); SplitPolyNode(plnode, &front, &back, edges, scratch); break; } } if (front) { tree->front = obstack_alloc(scratch, sizeof(*tree->front)); BSPTreeCreateRecursive(tree->front, front, #if BSPTREE_STATS depth+1, #endif scratch); } if (back) { tree->back = obstack_alloc(scratch, sizeof(*tree->back)); BSPTreeCreateRecursive(tree->back, back, #if BSPTREE_STATS depth+1, #endif scratch); } #if BSPTREE_STATS if (depth > tree_depth) { tree_depth = depth; } #endif } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/bsptree.h0000644000175000001440000000323610624071753015514 00000000000000/* Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _GV_BSPTREE_H_ #define _GV_BSPTREE_H_ #include "geom.h" typedef struct BSPTree BSPTree; extern BSPTree *BSPTreeCreate(BSPTree *tree, Geom *object); extern void BSPTreeAddObject(BSPTree *bsp_tree, Geom *object); extern void BSPTreeFinalize(BSPTree *bsp); extern void BSPTreeFree(BSPTree *bsp); extern void BSPTreeFreeTree(const BSPTree *tree); extern void BSPTreeSetAppearance(Geom *object); extern BSPTree *BSPTreeSet(BSPTree *tree, int attr1, ...); /* Geometries attached to INSTs or LISTs can be deleted underneath the * BSP-tree; so INSTs and LISTs must register a callback with their * handles. */ extern void BSPTreeInvalidate(Handle **chp, Ref *unused, BSPTree *tree); /* Attributes for BSPTreeSet */ #define BSPTREE_ONESHOT 42001 #define BSPTREE_END 42999 #endif /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/vert.h0000644000175000001440000000213310516714433015022 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef VERTDEFS #define VERTDEFS #define VERT_P 0 #define VERT_N (1 << 0) #define VERT_C (1 << 1) #define VERT_4D (1 << 2) #endif geomview-1.9.4/src/lib/gprim/geom/transform.c0000644000175000001440000000333210517455262016055 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" Geom * GeomPosition(Geom *object, Transform T) { if( object && object->Class->position ) (*object->Class->position)(object, T); else if (T) TmIdentity(T); return object; } Geom *GeomTransformTo(Geom *object, Transform T, TransformN *TN) { if( object && object->Class->transformto ) (*object->Class->transformto)(object, T, TN); return object; } Geom *GeomTransform(Geom *object, Transform T, TransformN *TN) { if( object && object->Class->transform ) (*object->Class->transform)(object, T, TN); return object; } geomview-1.9.4/src/lib/gprim/geom/knownclass.c0000644000175000001440000001015310463662406016223 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * $Header: /cvsroot/geomview/geomview/src/lib/gprim/geom/knownclass.c,v 1.6 2006/08/01 03:38:48 smr99 Exp $ */ #include #include "geomclass.h" /* * Here's we list all classes known to this object library. * Edit this if you add a new class for general use. * It's not mandatory to list a class here, but it helps -- generic * GeomLoad, GeomPrivate, GeomClassForAll routines benefit from this. * * Some may not really be linked in, but only ghosts from the stub library. * We tell ghosts from warm bodies by their "present" tag -- an int * which is 1 for real object routines, 0 for stubs. * * If you call GeomKnownClassInit(), better link either with all * object libraries or with the stub library! * */ extern int BBoxPresent, BezierListPresent, BezierPresent, CommentPresent, DiscGrpPresent, InstPresent, LincolnPresent, ListPresent, MeshPresent, NDMeshPresent, NPolyListPresent, PolyListPresent, QuadPresent, SkelPresent, SpherePresent, TlistPresent, VectPresent; typedef GeomClass *GeomClassPtr; extern GeomClassPtr BBoxMethods(), BezierListMethods(), BezierMethods(), CommentMethods(), DiscGrpMethods(), InstMethods(), LincolnMethods(), ListMethods(), MeshMethods(), NDMeshMethods(), NPolyListMethods(), PolyListMethods(), QuadMethods(), SkelMethods(), SphereMethods(), TlistMethods(), VectMethods(); static struct knownclass { int *presenttag; GeomClass *(*methods)(); char *loadsuffix; } known[] = { /* Testing _WIN32 here is wrong, but the Visual C++ compiler * has an ANSI C preprocessor but doesn't define either of these. */ #if defined(__STDC__) || defined(__ANSI_CPP__) || defined(_WIN32) #define KNOWN(name, suffix) \ { &name##Present, (GeomClass *(*)())name##Methods, suffix } #else /* non-ANSI */ #define KNOWN(name, suffix) \ { &name/**/Present, (GeomClass *(*)())name/**/Methods, suffix } #endif KNOWN(Bezier, NULL), KNOWN(BezierList, "bez"), KNOWN(BezierList, "bbp"), KNOWN(Comment, NULL), KNOWN(DiscGrp, "dgp"), KNOWN(PolyList, "off"), KNOWN(Sphere, "sph"), KNOWN(Tlist, "tl"), KNOWN(Tlist, "prj"), KNOWN(BBox, NULL), KNOWN(Inst, NULL), KNOWN(List, "list"), KNOWN(Quad, "quad"), KNOWN(Mesh, "mesh"), KNOWN(NDMesh, "mesh"), KNOWN(Vect, "vect"), KNOWN(Skel, "skel"), KNOWN(NPolyList, "off"), KNOWN(Lincoln, "iL"), {NULL, NULL, NULL} }; void GeomKnownClassInit() { struct knownclass *k; static char done = 0; if(!done) { done = 1; for(k = known; k->presenttag != NULL; k++) if(*k->presenttag) (void) (*k->methods)(); } } /* * This should really be in per-class attributes, not this * centralized table, but there's no mechanism for that yet. */ GeomClass * GeomFName2Class(str) char *str; { char *p; struct knownclass *k; if(str == NULL || (p = strrchr(str, '.')) == NULL) return NULL; p++; for(k = known; k->presenttag != NULL; k++) if(*k->presenttag && k->loadsuffix != NULL && strcmp(p, k->loadsuffix) == 0) return((*k->methods)()); return NULL; } geomview-1.9.4/src/lib/gprim/geom/create.c0000644000175000001440000001015210573773723015312 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" Geom * GeomCreate(char *type, ...) { va_list a_list; Geom *newgeom = (Geom *) NULL; GeomClass *Class = (GeomClass *) NULL; va_start (a_list, type); Class = GeomClassLookup(type); /* now use the create method to get a new geom ... */ if (Class == NULL) { GeomError(0/*Unknown Class XXX*/, "GeomCreate: unknown object class %s", type); va_end (a_list); return NULL; } if (Class->create) newgeom = (Geom *) (*Class->create)(NULL, Class, &a_list); /* need error check here */ va_end (a_list); return newgeom; } int GeomSet(Geom *g, ...) { int ok = -1; va_list a_list; va_start (a_list, g); if (g && g->Class && g->Class->create) if((*g->Class->create)(g, g->Class, &a_list)) ok = 1; va_end (a_list); return ok; } int GeomGet(Geom *g, int attr, void *attrp) { if(g == NULL) return -1; switch(attr) { case CR_APPEAR: *(Appearance **)attrp = g->ap; break; #if 0 case CR_HANDLE: *(Handle **)attrp = g->handle; break; #endif default: if(g->Class->get) return (*g->Class->get)(g, attr, attrp); } return 0; } Geom * GeomCCreate(Geom *g, GeomClass *c, ...) { va_list a_list; Geom *newgeom = g; GeomClass *Class = c; va_start (a_list, c); if(Class == NULL && newgeom != NULL) Class = newgeom->Class; if (Class && Class->create) newgeom = (Geom *) (*Class->create)(newgeom, Class, &a_list); /* need error check here */ va_end (a_list); return newgeom; } /* * Initialize common data for Geom objects */ void GGeomInit(Geom *g, GeomClass *Class, int magic, Appearance *ap) { RefInit((Ref *)g, magic); g->Class = Class; g->ap = ap; if(ap != NULL) { /* If it's a real Appearance, bump its ref count */ RefIncr((Ref *)ap); } g->aphandle = NULL; g->geomflags = 0; g->pdim = 4; g->bsptree = NULL; g->ppath = NULL; g->ppathlen = 0; DblListInit(&g->pernode); } /* * Handle one exceptional item from a GeomCreate() arg list. * We know how to set common Geom fields. */ /* copyp: Flag: "copy" parameters passed by reference? */ /* feature: Attribute -- value already va_arg'ed by caller */ int GeomDecorate(Geom *g, int *copyp, int feature, va_list *ap) { Appearance *nap; int val; if(feature == 0 || g == NULL) return 1; switch(feature) { case CR_4D: /* this is a token, value pair so it can be set conditionally */ val = va_arg(*ap, int); g->geomflags &= ~VERT_4D; g->geomflags |= val ? VERT_4D : 0; break; case CR_APPEAR: /* Assign or remove Appearance. */ nap = va_arg(*ap, Appearance *); if(nap && *copyp) RefIncr((Ref *)nap); if(g->ap) ApDelete(g->ap); g->ap = nap; break; case CR_COPY: *copyp = 1; break; case CR_NOCOPY: *copyp = 0; break; default: return 1; /* Unknown attribute */ } return 0; } Appearance * GeomAppearance(Geom *g) { return g ? g->ap : NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/boundsphere.c0000644000175000001440000000540110517054651016354 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "hpoint3.h" #include "geomclass.h" #include "geom.h" #include "bbox.h" #include "create.h" /* Take this out once the create flags are all in the right place */ #include "sphereP.h" Geom *GeomBoundSphereFromBBox(Geom *geom, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere, *bbox; HPoint3 minmax[2]; /* The BoundSphere really is something 3-dimensional */ if (axes == NULL) { static int dflt_axes[] = { 1, 2, 3, 0 }; axes = dflt_axes; } bbox = GeomBound(geom, T, TN); if (bbox == NULL) return NULL; if (TN) { HPointN *minmaxN[2] = { NULL, NULL }; BBoxMinMaxND((BBox *)bbox, &minmaxN[0], &minmaxN[1]); GeomDelete(bbox); HPtNToHPt3(minmaxN[0], axes, &minmax[0]); HPtNToHPt3(minmaxN[1], axes, &minmax[1]); HPtNDelete(minmaxN[0]); HPtNDelete(minmaxN[1]); } else { BBoxMinMax((BBox *)bbox, &minmax[0], &minmax[1]); GeomDelete(bbox); } HPt3Dehomogenize(&minmax[0], &minmax[0]); HPt3Dehomogenize(&minmax[1], &minmax[1]); sphere = GeomCreate("sphere", CR_ENCOMPASS_POINTS, minmax, CR_NENCOMPASS_POINTS, 2, CR_SPACE, space, CR_END); #if 0 /* ???? is this correct? The bounding box has already been transformed by T ... */ if (sphere != NULL && T != NULL) GeomTransform(sphere, T, TN); #endif return sphere; } Geom *GeomBoundSphere(Geom *geom, Transform T, TransformN *TN, int *axes, int space) { if (geom && geom->Class->boundsphere) { return (*geom->Class->boundsphere) (geom, T, TN, axes, space); } return GeomBoundSphereFromBBox(geom, T, TN, axes, space); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/message.c0000644000175000001440000000256610455701003015462 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" Geom * GeomMessage( object, ac, av ) Geom *object; int ac; char *av[]; { if( object && object->Class->message ) (*object->Class->message)(object,ac,av); return object; } geomview-1.9.4/src/lib/gprim/geom/pickP.h0000644000175000001440000001031710623657601015115 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #ifndef PICKPDEF #define PICKPDEF /* * Private definitions for picking. */ #include "pick.h" #include "ooglutil.h" struct Pick { Point3 got; float thresh; int want; /* Fields wanted */ int found; /* Fields found */ vvec gcur; /* Path to the current primitive - used for recursion */ vvec gpath; /* Path to picked primitive */ Geom *gprim; /* Picked primitive */ HPoint3 v; /* picked vertex, if any */ int vi; /* index of picked vertex */ HPoint3 e[2]; /* endpoints of picked edge, if any */ int ei[2]; /* indices of endpoints of picked edge */ Transform Tprim; /* gprim -> screen */ Transform Tmirp; Transform Tw; Transform Tself; /* for ND-viewing. */ TransformN *TprimN; TransformN *TmirpN; int axes[4]; /* the relevant sub-space of the output of * TprimN. */ TransformN *TwN; TransformN *TselfN; HPoint3 *f; /* array of vertices of picked face, if any */ int fn; /* number of vertices in array f */ int fi; /* index of picked face */ Transform Ts2n; /* NDC to screen tfm */ Transform Tc2n; /* NDC to camera tfm */ Transform Tw2n; /* NDC to world (global) tfm */ float x0, y0; /* NDC coords of original pick */ }; /* * PickFace() is used to test a face for a pick and modify the pick * structure if necessary. * n_verts is the number of vertices in the face. * verts is the list of vertices in the face. * pick is the pick structure. * ap is the appearance (not currently used). * The following fields of the pick structure will be filled in: * found - what has been found. * vi - index of the picked vertex in the verts array. * ei - indices of the endpoints of the picked edge in the verts array. * f - freed if non-NULL and set to NULL * PickFace() returns nonzero if something was picked. The calling * program is responsible for using the data returned in the pick * structure to fill in the actual points and correct the indices. */ int PickFace(int n_verts, Point3 *verts, Pick *pick, Appearance *ap); /* * PickFillIn() is used to fill in the fields of a pick structure once * a pick has been found. * pick is the pick structure. * n_verts is the number of points in the face. * got is the interesection of the pick ray with the face. * vertex is the index of the picked vertex (-1 if none). * edge is the index of the first vertex of the hit line (-1 if none). * ep is the picked point on the edge. * The routine fills in the following fields of the pick structure: * got - filled in with the parameter got. * found - filled in with what was found. * vi - the index of the picked vertex. * ei - the indices of the endpoints of the picked edge. * f - freed if non-null and set to null. * fn - the number of vertices in the face * gpath - the path to the picked primitive (copy of gcur) * The rest of the fields are left unchanged. * Returns pick->found. */ int PickFillIn(Pick *pick, int n_verts, Point3 *got, int vertex, int edge, Appearance *ap); #endif /*PICKPDEF*/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/geom/handlescan.c0000644000175000001440000000273110455701003016130 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" void GeomHandleScan(Geom *g, int (*func)(), void *arg) { if(g == NULL) return; if(g->aphandle) (*func)(&g->aphandle, g, arg); if(g->ap && g->ap->tex && g->ap->tex->tfmhandle) (*func)(&g->ap->tex->tfmhandle, g, arg); if(g->Class->scan) (*g->Class->scan)(g, func, arg); } geomview-1.9.4/src/lib/gprim/geom/bound.c0000644000175000001440000000302610514661167015151 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" /* * Compute the bounding box of a geom. * If a transform T is supplied, compute bbox of geom transformed by T; * if T is NULL, compute bbox of geom in its native coordinates. */ Geom *GeomBound(Geom *geom, Transform T, TransformN *TN) { if (geom && geom->Class->bound) { return (*geom->Class->bound) (geom, T, TN); } return NULL; } geomview-1.9.4/src/lib/gprim/geom/Headers0000644000175000001440000000013010624071433015156 00000000000000geom.h geomclass.h geomclass_sm.h pick.h pickP.h vert.h bsptree.h bsptreeP.h nodedata.h geomview-1.9.4/src/lib/gprim/geom/nodedata.h0000644000175000001440000000730310624072601015617 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _GV_NODEDATA_H_ #define _GV_NODEDATA_H_ #include "geomclass.h" #include "mg.h" /* A geometry hierarchy may refer aribitrarily often to the same * Geometry object via "Handle" references. In some cases, however, we * need data which is attached to a node in the hierarchy tree. For * the time being the only case is the "tagged apperance" handle used * to refer to appearances out of BSPTree nodes. * * "path" is a unique tag and is computed during hierarchy * traversal. 'L' stands for a list element, 'I' for Inst. * * L -> (L) -> nil * | | * G1 I * | * G2 * * The leaf-nodes of the hierarchy will have the paths "L" and * "LI". This should be a unique id for earch hierarchy node, because * it records the history of the path through the hierarchy to the * node. Only the head of a list is included in the path, so the * second id is "LI" and not "LLI" in the example above. */ typedef struct NodeData { DblListNode node; /* Link into Geom->pernode */ char *ppath; /* The path to this geom in the hierarchy (copy).*/ const void *tagged_ap; /* tagged appearance pointer */ const BSPTree *node_tree; /* BSP-tree we belong to, if any */ } NodeData; #define GeomMakePath(geom, c, path, pathlen) \ int pathlen = (geom)->ppathlen+1; \ char *path = alloca(pathlen+1); \ \ memcpy(path, (geom)->ppath, (geom)->ppathlen); \ path[pathlen-1] = c; \ path[pathlen] = '\0' /* Transfer one Geom's per-node data to another Geom. Priamrily meant * as hack during ND-drawing */ static inline void GeomNodeDataMove(Geom *from, Geom *to) { DblListMove(&from->pernode, &to->pernode); to->ppath = from->ppath; to->ppathlen = from->ppathlen; } static inline NodeData *GeomNodeDataByPath(Geom *geom, const char *ppath) { NodeData *pos; if (!ppath) { ppath = geom->ppath ? geom->ppath : ""; } DblListIterateNoDelete(&geom->pernode, NodeData, node, pos) { if (strcmp(pos->ppath, ppath) == 0) { return pos; } } return NULL; } extern DEF_FREELIST(NodeData); static inline NodeData *GeomNodeDataCreate(Geom *geom, const char *ppath) { NodeData *data; if (!ppath) { ppath = geom->ppath ? geom->ppath : ""; } data = GeomNodeDataByPath(geom, ppath); if (data == NULL) { FREELIST_NEW(NodeData, data); data->ppath = strdup(ppath); data->tagged_ap = NULL; data->node_tree = NULL; DblListAdd(&geom->pernode, &data->node); } return data; } static inline void GeomNodeDataPrune(Geom *geom) { NodeData *data, *data_next; DblListIterate(&geom->pernode, NodeData, node, data, data_next) { DblListDelete(&data->node); if (data->tagged_ap) { mguntagappearance(data->tagged_ap); } if (data->node_tree) { BSPTreeFreeTree(data->node_tree); } if (data->ppath) { free(data->ppath); data->ppath = NULL; } FREELIST_FREE(NodeData, data); } } #endif geomview-1.9.4/src/lib/gprim/geom/class.c0000644000175000001440000000564610461140705015150 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "string.h" #include "geomclass.h" static struct classtable { struct classtable *next; char *classname; GeomClass *Class; } *table = NULL; GeomClass * GeomClassLookup( name ) char *name; { static char done = 0; struct classtable *cp; if(!done) { done = 1; GeomKnownClassInit(); } for(cp = table; cp != NULL; cp = cp->next) if( strcmp( cp->classname, name ) == 0 ) return cp->Class; return NULL; } static void GeomClassInstall( name, Class ) char *name; GeomClass *Class; { struct classtable *cp; cp = OOGLNewE(struct classtable, "GeomClass table"); cp->next = table; table = cp; cp->classname = strdup(name); cp->Class = Class; } GeomClass * GeomSubClassCreate( classname, subclassname ) char *classname, *subclassname; { GeomClass *Class, *subclass; Class = GeomClassLookup( classname ); if( !Class ) { Class = OOGLNewE(GeomClass, "GeomClass"); memset( (char *)Class, 0, sizeof(GeomClass) ); GeomClassInstall( classname, Class ); } subclass = OOGLNewE(GeomClass, "GeomClass"); memcpy( (char *)subclass, (char *)Class, sizeof(GeomClass) ); subclass->super = Class; GeomClassInstall( subclassname, subclass ); return subclass; } GeomClass * GeomClassCreate( name ) char *name; { return GeomSubClassCreate( "geom", name ); } GeomClass * GeomMethods( object ) Geom *object; { return object ? object->Class : NULL; } /* * Call a function for all known classes. */ void * GeomClassIterate( ) { return (void *)table; } GeomClass * GeomNextClass( it ) void *it; { GeomClass *c; #define iter ((struct classtable **)it) if(*iter == NULL) return NULL; c = (*iter)->Class; *iter = (*iter)->next; return c; #undef iter } geomview-1.9.4/src/lib/gprim/geom/bsptreeP.h0000644000175000001440000001326310624071543015632 00000000000000/* Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _GV_BSPTREE_P_H_ #define _GV_BSPTREE_P_H_ #include "geomclass.h" #include "nodedata.h" #include "bsptree.h" #include "obstack.h" struct Poly; typedef struct PolyListNode PolyListNode; struct PolyListNode { PolyListNode *next; struct Poly *poly; Point3 *pn; /* If we split a polygon we compute the normal on * the parent to avoid numerical instabilities * caused by increasingly degenerated polygons. */ const void **tagged_app; /* pointer to shared storage for the * return value of mgtagappearance(). */ }; typedef struct BSPTreeNode BSPTreeNode; struct BSPTreeNode { BSPTreeNode *front; BSPTreeNode *back; HPoint3 plane; PolyListNode *polylist; }; struct BSPTree { BSPTreeNode *tree; /* The root of the BSPtree itself */ Geom *geom; /* The top-level Geom we belong to */ bool oneshot; /* Tree is destroyed after drawing; useful * for location/oring != LOCAL INSTs and * during ND-drawing. The oneshot flag is * reset after it took affect. */ PolyListNode *init_lpl; /* While tree == NULL elements can be * added to this list */ TransformPtr Tid; /* INST support: to support absolute * positioning (location and origin != * LOCAL) we need the position of the * top-level geometry (the one who owns the * tree, i.e. tree->geom). */ TransformPtr Tidinv; /* Inverse of Tid, only computed on demand */ TransformPtr T; /* INST support: transform polygons during * tree generation, i.e. before adding * them to init_lpl. */ Transform Tdual; /* We need the dual of T to transform the normals * correctly ( y^t x = 0 <=> y^t T T^{-tr}x = 0). */ TransformPtr TxT; /* texture transform */ const void **tagged_app; struct obstack obst; /* Scratch space for new polygons etc */ }; /* if we have an appearance (but no handle to an appearance ) which * overrides the transparency flag to false _or_ a material which * overrides the alpha value to 1.0 (and no own color spec with alpha * != 1.0) then we need not add ourselves to the BSP-tree: no facet of * this Geom will ever be translucent. * * This does, of course, not work with INSTs or LISTs, but only with * "atomic" Geom's */ static inline bool never_translucent(Geom *geom) { Appearance *ap = geom->ap; return (ap && !geom->aphandle && (((ap->override & APF_FACEDRAW) && (ap->flag & APF_FACEDRAW) == 0) || ((ap->override & APF_TRANSP) && (ap->flag & APF_TRANSP) == 0) || ((geom->geomflags & COLOR_ALPHA) == 0 && ap->mat && (ap->mat->override & MTF_ALPHA) && ap->mat->diffuse.a == 1.0))); } /* Load the current transform form the MG-layer into tree->Tid */ static inline void BSPTreeSetId(BSPTree *tree) { Transform T; if (tree->geom == NULL || tree != tree->geom->bsptree) { abort(); } /* make sure the top-level geom has per-node data */ GeomNodeDataCreate(tree->geom, NULL); mggettransform(T); if (memcmp(T, TM_IDENTITY, sizeof(Transform)) != 0) { tree->Tid = obstack_alloc(&tree->obst, sizeof(Transform)); TmCopy(T, tree->Tid); } else { tree->Tid = TM_IDENTITY; } tree->Tidinv = NULL; } static inline const void **BSPTreePushAppearance(BSPTree *bsptree, Geom *geom) { NodeData *data = GeomNodeDataCreate(geom, NULL); const void **tagged_app = bsptree->tagged_app; bsptree->tagged_app = &data->tagged_ap; return tagged_app; } static inline void BSPTreePopAppearance(BSPTree *bsptree, const void **old_tagged_app) { if (bsptree != NULL && old_tagged_app != NULL) { bsptree->tagged_app = old_tagged_app; } } static inline TransformPtr BSPTreePushTransform(BSPTree *tree, TransformPtr T) { TransformPtr old_T; if (tree != NULL) { old_T = tree->T; tree->T = T; if (T != TM_IDENTITY) { TmDual(T, tree->Tdual); } return old_T; } else { return TM_IDENTITY; } } static inline void BSPTreeSetTransform(BSPTree *tree, TransformPtr T) { if (tree != NULL) { tree->T = T; if (T != TM_IDENTITY) { TmDual(T, tree->Tdual); } } } static inline void BSPTreePopTransform(BSPTree *tree, TransformPtr old_T) { if (tree != NULL) { tree->T = old_T; if (old_T != TM_IDENTITY) { TmDual(old_T, tree->Tdual); } } } static inline TransformPtr BSPTreePushTxTransform(BSPTree *tree, TransformPtr T) { TransformPtr old_TxT; if (tree != NULL) { old_TxT = tree->TxT; tree->TxT = T; return old_TxT; } else { return TM_IDENTITY; } } static inline void BSPTreeSetTxTransform(BSPTree *tree, TransformPtr T) { if (tree != NULL) { tree->TxT = T; } } static inline void BSPTreePopTxTransform(BSPTree *tree, TransformPtr old_T) { if (tree != NULL) { tree->TxT = old_T; } } #endif /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/inst/0000777000175000001440000000000010665240673014011 500000000000000geomview-1.9.4/src/lib/gprim/inst/instbound.c0000644000175000001440000000720310574306562016077 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Compute bounding box of an Inst */ #include "instP.h" BBox * InstBound(Inst *inst, Transform T, TransformN *TN) { BBox *geombbox; Transform Tnew; GeomIter *it; if( inst == NULL || inst->geom == NULL) return NULL; /* Insts which tie themselves to particular locations have no * bounding box, either. */ if( inst->location > L_LOCAL || inst->origin > L_LOCAL ) return NULL; /* FIXME: if inst->NDaxis != NULL and/or TN != NULL we have to do * something here. * * If TN != NULL, then Tnew should be prepended to TN w.r.t. to * the default x,y,z space (because this is the way we interprete * 3d objects in Nd). * * GeomIterate() should not be necessary in this case; MMmh. */ if (inst->NDaxis == NULL) { if (T == NULL) T = TM_IDENTITY; if (TN == NULL) { it = GeomIterate( (Geom *)inst, DEEP ); geombbox = NULL; while(NextTransform(it, Tnew) > 0) { BBox *box; TmConcat( Tnew, T, Tnew ); if((box = (BBox *)GeomBound( inst->geom, Tnew, NULL)) != NULL) { if(geombbox) { BBoxUnion3(geombbox, box, geombbox); GeomDelete((Geom *)box); } else geombbox = box; } } } else { TransformN *TnewN = TmNCopy(TN, NULL); static int dflt_axes[] = { 1, 2, 3, 0 }; it = GeomIterate( (Geom *)inst, DEEP ); geombbox = NULL; while(NextTransform(it, Tnew) > 0) { BBox *box; TmNCopy(TN, TnewN); TmNApplyT3TN(Tnew, dflt_axes, TnewN); if((box = (BBox *)GeomBound( inst->geom, NULL, TnewN)) != NULL) { if(geombbox) { BBoxUnion3(geombbox, box, geombbox); GeomDelete((Geom *)box); } else geombbox = box; } } TmNDelete(TnewN); } } else { /* we do not support ND-TLISTs yet, so we assume here that we have * only one ND-transformation, hence we do not call GeomIterate() * here. */ if (TN) { TransformN *TnewN; TnewN = TmNConcat(inst->NDaxis, TN, NULL); geombbox = (BBox *)GeomBound(inst->geom, NULL, TnewN); TmNDelete(TnewN); } else if (T) { TransformN *TnewN = TmNCopy(inst->NDaxis, NULL); static int dflt_axes[] = { 1, 2, 3, 0 }; BBox *box; TmNApplyDN(TnewN, dflt_axes, T); box = (BBox *)GeomBound(inst->geom, NULL, TnewN); geombbox = (BBox *)GeomBound((Geom *)box, TM_IDENTITY, NULL); GeomDelete((Geom *)box); TmNDelete(TnewN); } else { geombbox = (BBox *)GeomBound(inst->geom, NULL, inst->NDaxis); } } return geombbox; } geomview-1.9.4/src/lib/gprim/inst/instclass.c0000644000175000001440000000507210560653364016077 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "instP.h" #include "pick.h" GeomClass *InstClass = NULL; int InstPresent = 1; static char instName[] = "inst"; char * InstName() { return instName; } extern Geom *InstPick( Geom *, Pick *, Appearance *, Transform ); extern GeomScanFunc InstHandleScan; GeomClass * InstMethods() { if( !InstClass ) { InstClass = GeomClassCreate(instName); InstClass->name = InstName; InstClass->methods = (GeomMethodsFunc *)InstMethods; InstClass->create = (GeomCreateFunc *)InstCreate; InstClass->Delete = (GeomDeleteFunc *)InstDelete; InstClass->copy = (GeomCopyFunc *)InstCopy; InstClass->bound = (GeomBoundFunc *)InstBound; InstClass->boundsphere = (GeomBoundSphereFunc *)InstBoundSphere; InstClass->evert = (GeomEvertFunc *)InstEvert; InstClass->dice = (GeomDiceFunc *)InstDice; InstClass->position = (GeomPositionFunc *)InstPosition; InstClass->transformto = (GeomTransformToFunc *)InstTransformTo; InstClass->transform = (GeomTransformFunc *)InstTransform; InstClass->pick = (GeomPickFunc *)InstPick; InstClass->draw = (GeomDrawFunc *)InstDraw; InstClass->bsptree = (GeomBSPTreeFunc *)InstBSPTree; InstClass->replace = (GeomReplaceFunc *)InstReplace; InstClass->get = (GeomGetFunc *)InstGet; InstClass->scan = (GeomScanFunc *)InstHandleScan; InstClass->import = InstImport; InstClass->export = (GeomExportFunc *)InstExport; } return InstClass; } geomview-1.9.4/src/lib/gprim/inst/instdraw.c0000644000175000001440000002403310623652261015720 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Draw an Inst using the mg library. */ #include "instP.h" #include "mgP.h" #include "bsptreeP.h" static TmCoord (*coords2W(int system))[4] { WnPosition vp; static Transform Tndc; switch(system) { case L_GLOBAL: return TM3_IDENTITY; case L_CAMERA: return _mgc->C2W; case L_SCREEN: return _mgc->S2W; case L_NDC: WnGet(_mgc->win, WN_VIEWPORT, &vp); TmScale(Tndc, .5*(vp.xmax-vp.xmin+1), .5*(vp.ymax-vp.ymin+1), 1.0); CtmTranslate(Tndc, 1.0, 1.0, 0.0); TmConcat(Tndc, _mgc->S2W, Tndc); return Tndc; default: return _mgc->xstk->T; /* Default is local coords: obj->world */ } } static TmCoord (*coordsto(int from, int to))[4] { WnPosition vp; static Transform Tmap; if(from == L_NONE) from = L_LOCAL; if(to == L_NONE) to = L_LOCAL; if(from == to) return TM3_IDENTITY; switch(to) { case L_GLOBAL: return coords2W(from); case L_LOCAL: if(!(_mgc->has & HAS_S2O)) mg_findS2O(); switch(from) { case L_GLOBAL: return _mgc->xstk->Tinv; /* W2O */ case L_SCREEN: return _mgc->S2O; } break; case L_SCREEN: switch(from) { case L_GLOBAL: return _mgc->W2S; case L_LOCAL: if(!(_mgc->has & HAS_S2O)) mg_findS2O(); return _mgc->O2S; case L_NDC: WnGet(_mgc->win, WN_VIEWPORT, &vp); TmScale(Tmap, .5*(vp.xmax-vp.xmin+1), .5*(vp.ymax-vp.ymin+1), 1.0); CtmTranslate(Tmap, 1.0, 1.0, 0.0); return Tmap; } break; case L_CAMERA: if(from == L_GLOBAL) return _mgc->W2C; break; case L_NDC: switch(from) { case L_GLOBAL: TmConcat(_mgc->W2S, coordsto(L_SCREEN, L_NDC), Tmap); return Tmap; case L_SCREEN: WnGet(_mgc->win, WN_VIEWPORT, &vp); TmTranslate(Tmap, -1.0, -1.0, 0.0); CtmScale(Tmap, 2.0/(vp.xmax-vp.xmin+1), 2.0/(vp.ymax-vp.ymin+1), 1.0); return Tmap; } break; default: OOGLError(1, "InstDraw: internal error: unknown coord system 0x%x in coordsto(0x%x, 0x%x)", to, from, to); return TM3_IDENTITY; } /* It's safe to call both of these, since coords2W() can never return Tmap. */ TmConcat(coords2W(from), coordsto(L_GLOBAL, to), Tmap); return Tmap; } Inst *InstDraw(Inst *inst) { GeomIter *it, *txit = NULL; Transform T, tT, Tl2o, Ttx; mgNDctx *NDctx = NULL; void *saved_ctx; GeomMakePath(inst, 'I', path, pathlen); if (inst->geom == NULL) { return inst; } inst->geom->ppath = path; inst->geom->ppathlen = pathlen; inst->geomflags &= ~GEOM_ALPHA; mgctxget(MG_NDCTX, &NDctx); if (NDctx) { if (inst->location > L_LOCAL) { /* temporarily disable ND-drawing, makes sense only for * L_LOCAL, really. The universe is 3d in Geomview, in * some sense. */ mgctxset(MG_NDCTX, NULL, MG_END); } else if (inst->origin != L_NONE) { static int was_here; if (!was_here) OOGLError(1, "FIXME: don't know how to handle origin != L_LOCAL " "with ND-drawing.\n"); return NULL; } else { if (inst->NDaxis) { saved_ctx = NDctx->saveCTX(NDctx); NDctx->pushTN(NDctx, inst->NDaxis); GeomDraw(inst->geom); NDctx->restoreCTX(NDctx, saved_ctx); } else { it = GeomIterate((Geom *)inst, DEEP); txit = GeomIterate((Geom *)inst->txtlist, DEEP); while (NextTransform(it, T)) { if (!NextTransform(txit, Ttx)) { txit = NULL; } else { mgpushtxtransform(); mgtxtransform(Ttx); } saved_ctx = NDctx->saveCTX(NDctx); NDctx->pushT(NDctx, T); GeomDraw(inst->geom); NDctx->restoreCTX(NDctx, saved_ctx); if (txit != NULL) { mgpoptxtransform(); } } } if (inst->geom->geomflags & GEOM_ALPHA) { inst->geomflags |= GEOM_ALPHA; } return inst; } } it = GeomIterate((Geom *)inst, DEEP); txit = GeomIterate((Geom *)inst->txtlist, DEEP); while (NextTransform(it, T)) { mgpushtransform(); if (!NextTransform(txit, Ttx)) { txit = NULL; } else { mgpushtxtransform(); mgtxtransform(Ttx); } /* Compute origin *before* changing mg tfm */ if (inst->origin != L_NONE) { Point3 originwas, delta; TmCoord (*l2o)[4], (*o2W)[4]; static HPoint3 zero = { 0, 0, 0, 1 }; /* We have location2W, origin2W. We want to translate * in 'origin' coords such that (0,0,0) in location * coords maps to originpt in origin coords. */ o2W = coords2W(inst->origin); l2o = coordsto(inst->location, inst->origin); HPt3TransPt3(l2o, &zero, &originwas); Pt3Sub(&inst->originpt, &originwas, &delta); TmTranslate(tT, delta.x, delta.y, delta.z); TmConcat(l2o, tT, Tl2o); TmConcat(T, Tl2o, tT); TmConcat(tT, o2W, T); mgsettransform(T); } else if (inst->location > L_LOCAL) { TmConcat(T, coords2W(inst->location), T); mgsettransform(T); } else { mgtransform(T); } GeomDraw(inst->geom); mgpoptransform(); if (txit != NULL) { mgpoptxtransform(); } } if(NDctx) { /* restore the ND-context, also: if we have a BSP-tree, then we * need to add our object to the tree, because GeomBSPTreeDraw() * does not do so for ND drawing. */ if (NDctx->bsptree != NULL && (inst->geom->geomflags & GEOM_ALPHA)) { GeomBSPTree((Geom *)inst, NDctx->bsptree, BSPTREE_ADDGEOM); } mgctxset(MG_NDCTX, NDctx, MG_END); } if (inst->geom->geomflags & GEOM_ALPHA) { inst->geomflags |= GEOM_ALPHA; } return inst; } Inst *InstBSPTree(Inst *inst, BSPTree *bsptree, int action) { TransformPtr oldT, oldTxT; GeomIter *it, *txit; Transform T, tT, Tl2o, TxT; if (inst->geom) { GeomMakePath(inst, 'I', path, pathlen); inst->geom->ppath = path; inst->geom->ppathlen = pathlen; } /* No need to loop over all transforms unless action == BSPTREE_ADDGEOM */ switch (action) { case BSPTREE_CREATE: GeomBSPTree(inst->geom, bsptree, action); HandleRegister(&inst->geomhandle, (Ref *)inst, bsptree, BSPTreeInvalidate); HandleRegister(&inst->tlisthandle, (Ref *)inst, bsptree, BSPTreeInvalidate); HandleRegister(&inst->axishandle, (Ref *)inst, bsptree, BSPTreeInvalidate); HandleRegister(&inst->NDaxishandle, (Ref *)inst, bsptree, BSPTreeInvalidate); return inst; case BSPTREE_DELETE: /* unregister any pending callback */ HandleUnregisterJust(&inst->geomhandle, (Ref *)inst, bsptree, BSPTreeInvalidate); HandleUnregisterJust(&inst->tlisthandle, (Ref *)inst, bsptree, BSPTreeInvalidate); HandleUnregisterJust(&inst->axishandle, (Ref *)inst, bsptree, BSPTreeInvalidate); HandleUnregisterJust(&inst->NDaxishandle, (Ref *)inst, bsptree, BSPTreeInvalidate); GeomBSPTree(inst->geom, bsptree, action); return inst; case BSPTREE_ADDGEOM: if (inst->NDaxis) { /* No need to add to the BSPTree here, will be handled by the * various draw_projected_BLAH() stuff. */ return inst; } if ((inst->origin != L_NONE || inst->location > L_LOCAL)) { BSPTreeSet(bsptree, BSPTREE_ONESHOT, true, BSPTREE_END); if (bsptree->Tidinv == NULL) { if (bsptree->Tid != TM_IDENTITY) { bsptree->Tidinv = obstack_alloc(&bsptree->obst, sizeof(Transform)); TmInvert(bsptree->Tid, bsptree->Tidinv); } else { bsptree->Tidinv = TM_IDENTITY; } } } oldT = BSPTreePushTransform(bsptree, TM_IDENTITY); oldTxT = BSPTreePushTxTransform(bsptree, TM_IDENTITY); it = GeomIterate((Geom *)inst, DEEP); txit = GeomIterate((Geom *)inst->txtlist, DEEP); while (NextTransform(it, T)) { /* Compute origin *before* changing mg tfm */ if (inst->origin != L_NONE) { Point3 originwas, delta; TmCoord (*l2o)[4], (*o2W)[4]; static HPoint3 zero = { 0, 0, 0, 1 }; /* We have location2W, origin2W. We want to translate * in 'origin' coords such that (0,0,0) in location * coords maps to originpt in origin coords. */ o2W = coords2W(inst->origin); l2o = coordsto(inst->location, inst->origin); HPt3TransPt3(l2o, &zero, &originwas); Pt3Sub(&inst->originpt, &originwas, &delta); TmTranslate(tT, delta.x, delta.y, delta.z); TmConcat(l2o, tT, Tl2o); TmConcat(T, Tl2o, tT); TmConcat(tT, o2W, T); /* finally concat with tree->Tid^{-1} to get the correct * absolute positioning. */ if (bsptree->Tid != TM_IDENTITY) { TmConcat(T, bsptree->Tidinv, T); } } else if (inst->location > L_LOCAL) { TmConcat(T, coords2W(inst->location), T); if (bsptree->Tid != TM_IDENTITY) { TmConcat(T, bsptree->Tidinv, T); } } else { TmConcat(T, oldT, T); } BSPTreeSetTransform(bsptree, T); if (!NextTransform(txit, TxT)) { txit = NULL; } else { TmConcat(TxT, oldTxT, TxT); BSPTreeSetTxTransform(bsptree, TxT); } GeomBSPTree(inst->geom, bsptree, action); } BSPTreePopTxTransform(bsptree, oldT); BSPTreePopTransform(bsptree, oldT); return inst; default: return NULL; } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/inst/instcreate.c0000644000175000001440000001742210624072150016224 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Inst creation, editing, retrieval and deletion. */ #include "instP.h" #include "transobj.h" #include "ntransobj.h" #include "freelist.h" #include "nodedata.h" void InstDelete(Inst *inst) { if (inst) { if (inst->geomhandle) HandlePDelete(&inst->geomhandle); if (inst->geom) GeomDelete(inst->geom); if (inst->tlisthandle) HandlePDelete(&inst->tlisthandle); if (inst->tlist) GeomDelete(inst->tlist); if (inst->txtlisthandle) HandlePDelete(&inst->txtlisthandle); if (inst->txtlist) GeomDelete(inst->txtlist); if (inst->axishandle) HandlePDelete(&inst->axishandle); if (inst->NDaxishandle) HandlePDelete(&inst->NDaxishandle); if (inst->NDaxis) NTransDelete(inst->NDaxis); } } Inst *InstCopy(Inst *inst) { Inst *ni; ni = OOGLNewE(Inst, "InstCopy: Inst"); GGeomInit(ni, inst->Class, inst->magic, NULL); TmCopy(inst->axis, ni->axis); if (inst->NDaxis) { ni->NDaxis = NTransCreate(inst->NDaxis); } ni->geom = GeomCopy(inst->geom); ni->geomhandle = NULL; ni->tlist = GeomCopy(inst->tlist); ni->tlisthandle = NULL; ni->txtlist = GeomCopy(inst->txtlist); ni->txtlisthandle = NULL; ni->axishandle = NULL; ni->NDaxishandle = NULL; ni->geomflags = inst->geomflags; ni->location = inst->location; ni->origin = inst->origin; ni->originpt = inst->originpt; return ni; } Geom *InstReplace(Inst *inst, Geom *geom) { Geom *old; if(inst == NULL) return NULL; old = inst->geom; inst->geom = geom; return old; } int InstGet(Inst *inst, int attr, void *attrp) { switch(attr) { case CR_GEOM: *(Geom **)attrp = inst->geom; break; case CR_GEOMHANDLE: *(Handle **)attrp = inst->geomhandle; break; case CR_TLIST: *(Geom **)attrp = inst->tlist; break; case CR_TLISTHANDLE: *(Geom **)attrp = (Geom *)inst->tlisthandle; break; case CR_TXTLIST: *(Geom **)attrp = inst->txtlist; break; case CR_TXTLISTHANDLE: *(Geom **)attrp = (Geom *)inst->txtlisthandle; break; case CR_NDAXISHANDLE: *(Handle **)attrp = inst->NDaxishandle; break; case CR_NDAXIS: *(TransformN **)attrp = inst->NDaxis; break; case CR_AXISHANDLE: *(Handle **)attrp = inst->axishandle; break; case CR_AXIS: TmCopy(inst->axis, (void *)attrp); return (inst->tlist == NULL && inst->tlisthandle == NULL) ? 1 : 0; case CR_LOCATION: *(int *)attrp = inst->location; break; default: return -1; } return 1; } Inst *InstCreate(Inst *exist, GeomClass *classp, va_list *a_list) { Inst *inst; int attr; int copy = 1; TransformPtr t; TransformN *nt; Geom *g; Handle *h; bool tree_changed = false; if (exist == NULL) { inst = OOGLNewE(Inst, "InstCreate inst"); GGeomInit (inst, classp, INSTMAGIC, NULL); TmIdentity(inst->axis); inst->NDaxis = NULL; inst->geomhandle = NULL; inst->geom = NULL; inst->tlisthandle = NULL; inst->tlist = NULL; inst->txtlisthandle = NULL; inst->txtlist = NULL; inst->axishandle = NULL; inst->NDaxishandle = NULL; inst->location = L_NONE; inst->origin = L_NONE; } else { /* Check that exist is an inst. */ inst = exist; } while ((attr = va_arg (*a_list, int))) { switch(attr) { case CR_GEOMHANDLE: h = va_arg(*a_list, Handle *); if (copy) { REFINCR(h); } if (inst->geomhandle) { HandlePDelete(&inst->geomhandle); } inst->geomhandle = h; HandleRegister(&inst->geomhandle, (Ref *)inst, &inst->geom, HandleUpdRef); tree_changed = true; break; case CR_HANDLE_GEOM: h = va_arg(*a_list, Handle *); g = va_arg(*a_list, Geom *); if (copy) { REFINCR(h); REFINCR(g); } if (inst->geomhandle) { HandlePDelete(&inst->geomhandle); } if (inst->geom) { GeomDelete(inst->geom); } inst->geomhandle = h; inst->geom = g; if (h) { HandleRegister(&inst->geomhandle, (Ref *)inst, &inst->geom, HandleUpdRef); HandleSetObject(inst->geomhandle, (Ref *)g); } tree_changed = true; break; case CR_GEOM: g = va_arg(*a_list, Geom *); if (copy) { REFINCR(g); } if (inst->geom) { GeomDelete(inst->geom); } inst->geom = g; if (inst->geomhandle) { HandlePDelete(&inst->geomhandle); } tree_changed = true; break; case CR_AXIS: t = va_arg(*a_list, TransformPtr); InstTransformTo(inst, t, NULL); tree_changed = true; break; case CR_NDAXIS: nt = va_arg(*a_list, TransformN *); InstTransformTo(inst, NULL, nt); tree_changed = true; break; case CR_AXISHANDLE: h = va_arg(*a_list, Handle *); if (copy) { REFINCR(h); } if (inst->axishandle) { HandlePDelete(&inst->axishandle); } inst->axishandle = h; if (h) { HandleRegister(&inst->axishandle, (Ref *)inst, inst->axis, TransUpdate); } tree_changed = true; break; case CR_NDAXISHANDLE: h = va_arg(*a_list, Handle *); if(copy) { REFINCR(h); } if(inst->NDaxishandle) { HandlePDelete(&inst->NDaxishandle); } inst->NDaxishandle = h; HandleRegister(&inst->NDaxishandle, (Ref *)inst, &inst->NDaxis, HandleUpdRef); tree_changed = true; break; case CR_TLIST: g = va_arg (*a_list, Geom *); if(copy) { REFINCR(g); } if(inst->tlist) { GeomDelete(inst->tlist); } inst->tlist = g; tree_changed = true; break; case CR_TLISTHANDLE: h = va_arg(*a_list, Handle *); if(copy) { REFINCR(h); } if(inst->tlisthandle != NULL) { HandlePDelete(&inst->tlisthandle); } inst->tlisthandle = h; HandleRegister(&inst->tlisthandle, (Ref *)inst, &inst->tlist, HandleUpdRef); tree_changed = true; break; case CR_TXTLIST: g = va_arg (*a_list, Geom *); if(copy) { REFINCR(g); } if(inst->txtlist) { GeomDelete(inst->txtlist); } inst->txtlist = g; break; case CR_TXTLISTHANDLE: h = va_arg(*a_list, Handle *); if(copy) { REFINCR(h); } if(inst->txtlisthandle != NULL) { HandlePDelete(&inst->txtlisthandle); } inst->txtlisthandle = h; HandleRegister(&inst->txtlisthandle, (Ref *)inst, &inst->txtlist, HandleUpdRef); break; case CR_LOCATION: inst->location = va_arg(*a_list, int); break; default: if(GeomDecorate(inst, ©, attr, a_list)) { OOGLError (0, "InstCreate: Undefined option: %d", attr); if(exist == NULL) { GeomDelete ((Geom *)inst); } return NULL; } } } if (tree_changed) { GeomNodeDataPrune((Geom *)inst); } return inst; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/inst/Makefile.am0000644000175000001440000000034610455665332015764 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libinst.la libinst_la_SOURCES = \ instbound.c instclass.c instcreate.c instdraw.c instmisc.c instpick.c instsphere.c inststream.c \ inst.h instP.h geomview-1.9.4/src/lib/gprim/inst/Makefile.in0000644000175000001440000003656510665240503016001 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/inst DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libinst_la_LIBADD = am_libinst_la_OBJECTS = instbound.lo instclass.lo instcreate.lo \ instdraw.lo instmisc.lo instpick.lo instsphere.lo \ inststream.lo libinst_la_OBJECTS = $(am_libinst_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libinst_la_SOURCES) DIST_SOURCES = $(libinst_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libinst.la libinst_la_SOURCES = \ instbound.c instclass.c instcreate.c instdraw.c instmisc.c instpick.c instsphere.c inststream.c \ inst.h instP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/inst/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/inst/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libinst.la: $(libinst_la_OBJECTS) $(libinst_la_DEPENDENCIES) $(LINK) $(libinst_la_OBJECTS) $(libinst_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instmisc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inststream.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/inst/instmisc.c0000644000175000001440000001051210574765576015736 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "instP.h" #include "tlistP.h" #include "ntransobj.h" Inst * InstDice( Inst *inst, int nu, int nv ) { GeomDice(inst->geom, nu, nv); return inst; } Inst * InstEvert( Inst *inst ) { GeomEvert( inst->geom ); return inst; } void InstHandleScan( Inst *inst, int (*func)(), void *arg ) { if(inst == NULL) return; if(inst->axishandle) (*func)(&inst->axishandle, inst, arg); if(inst->tlisthandle) (*func)(&inst->tlisthandle, inst, arg); if(inst->geomhandle) (*func)(&inst->geomhandle, inst, arg); if(inst->geom) GeomHandleScan(inst->geom, func, arg); if(inst->tlist) GeomHandleScan(inst->tlist, func, arg); } Inst *InstPosition(Inst *inst, Transform T) { GeomIter *it; it = GeomIterate((Geom *)inst, DEEP); if(NextTransform(it, T) > 0) { if(NextTransform(it, T) == 0) return inst; DestroyIter(it); return NULL; /* Error -- InstPosition on a multi-element inst */ } return NULL; /* Bizarre but possible -- no transforms at all */ } /* * Force a single transform equal to T. * We discard any tlist/tlisthandle and just assign to axis. * * Note: setting T leaves any installed TN alone, setting TN lets T * settings alone. */ Inst * InstTransformTo(Inst *inst, Transform T, TransformN *TN) { if(inst->tlist) { GeomDelete(inst->tlist); inst->tlist = NULL; } if(inst->tlisthandle) { HandlePDelete(&inst->tlisthandle); inst->tlisthandle = NULL; } if (T && inst->axishandle) { HandlePDelete(&inst->axishandle); inst->axishandle = NULL; } if (TN && inst->NDaxishandle) { HandlePDelete(&inst->NDaxishandle); inst->NDaxishandle = NULL; } if (TN) { if (inst->NDaxis && RefCount((Ref *)inst->NDaxis) > 1) { NTransDelete(inst->NDaxis); inst->NDaxis = NULL; } inst->NDaxis = TmNCopy(TN, inst->NDaxis); } else { if (0 && inst->NDaxis) { NTransDelete(inst->NDaxis); inst->NDaxis = NULL; } TmCopy(T ? T : TM_IDENTITY, inst->axis); } return inst; } /* * Postmultiply inst by transform T. Tricky: * - If this is a simple inst, just apply transform to axis. * - Otherwise, if leading node of tlist is an unshared, single-element TList, * multiply our transform into its matrix. * - Failing that, insert a single-element TList as top of hierarchy. */ Inst * InstTransform(Inst *inst, Transform T, TransformN *TN) { Tlist *tl; if (TN == NULL && (T == NULL || T == TM_IDENTITY)) { return inst; } if (inst->tlist == NULL && inst->tlisthandle == NULL) { if (TN) { if (inst->NDaxis) { TmNConcat(inst->NDaxis, TN, inst->NDaxis); } else { inst->NDaxis = TmNCopy(TN, NULL); } } else { TmConcat(inst->axis, T, inst->axis); } } else if (TN == NULL) { tl = (Tlist *)inst->tlist; if(tl != NULL && tl->Class == TlistClass && tl->nelements == 1 && tl->ref_count == 1) { TmConcat( tl->elements[0], T, tl->elements[0] ); } else { inst->tlist = GeomCCreate(NULL, TlistMethods(), CR_NELEM, 1, CR_ELEM, T, CR_HANDLE_GEOM, inst->tlisthandle, tl, CR_END); inst->tlisthandle = NULL; } } return inst; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/inst/inst.h0000644000175000001440000000470110563062217015046 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef INSTDEFS #define INSTDEFS /* * Private definitions for Inst's. */ #include "bbox.h" #include "bsptree.h" enum InstLocation { /* Coordinate system where inst lives */ L_NONE = 0, L_LOCAL = 1, /* local coordinates in hierarchy (default) */ L_GLOBAL = 2, /* Global (just above Geomview world) */ L_CAMERA = 3, /* In 3-D camera space (cam=0,0,0, look=-Z) */ L_NDC = 4, /* NDC space: -1 <= X,Y,Z <= 1 */ L_SCREEN = 5 /* screen space: X,Y in 0..screensize, Z in -1..1 */ }; typedef struct Inst Inst; extern GeomClass *InstClass; /* Public read-only; valid only * after first call to InstMethods() */ extern GeomClass *InstMethods( void ); extern Geom *InstImport( Pool *p ); extern int InstExport( Inst *, Pool * ); extern int InstGet( Inst *, int attr, void *attrp ); extern Inst *InstLoad( char * ); extern Inst *InstFLoad( FILE *, char *name ); extern Inst *InstSave( Inst *, char * ); extern Inst *InstFSave( Inst *, FILE *, char * ); extern BBox *InstBound( Inst *, Transform T, TransformN *TN); extern Geom *InstBoundSphere( Inst *, Transform T, TransformN *TN, int *axes, int ); extern Inst *InstPosition( Inst *, Transform T ); extern Inst *InstTransformTo( Inst *, Transform T, TransformN *TN ); extern Inst *InstTransform( Inst *, Transform T, TransformN *TN ); extern Inst *InstEvert( Inst * ); extern Inst *InstDraw( Inst * ); extern Geom *InstReplace( Inst *, Geom * ); extern Inst *InstBSPTree(Inst *inst, BSPTree *tree, int action); #endif /*INSTDEFS*/ geomview-1.9.4/src/lib/gprim/inst/inststream.c0000644000175000001440000001641610606531710016260 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "instP.h" #include "streampool.h" #include "transobj.h" #include "ntransobj.h" #include "handleP.h" static char *locations[] = { "none", /* L_NONE */ "local", /* L_LOCAL */ "global", /* L_GLOBAL */ "camera", /* L_CAMERA */ "ndc", /* L_NDC */ "screen", /* L_SCREEN */ }; static int getlocation(char *name) { int i; if(name == NULL) { return -1; } for(i = COUNT(locations); --i >= 0 && strcasecmp(name, locations[i]) != 0; ) ; return i; /* Return location number, or -1 if not found. */ } Geom *InstImport(Pool *p) { Inst *inst = NULL; IOBFILE *file; char *expect = NULL; int c; if(p == NULL || (file = PoolInputFile(p)) == NULL) { return 0; } if(strcmp(GeomToken(file), "INST")) { return 0; } for(;;) { switch((c = iobfnextc(file, 0))) { case EOF: case CKET: goto done; case 'l': if(iobfexpectstr(file, expect = "location")) { goto syntax; } if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } inst->location = getlocation( iobfdelimtok("(){}", file, 0) ); expect = "location [local|global|camera|ndc|screen]"; if(inst->location < 0) { goto syntax; } break; case 'o': if(iobfexpectstr(file, expect = "origin")) { goto syntax; } if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } expect = "origin [local|global|camera|ndc|screen] X Y Z"; inst->origin = getlocation( iobfdelimtok("(){}", file, 0) ); if(inst->origin < 0) { goto syntax; } if(iobfgetnf(file, 3, &inst->originpt.x, 0) < 3) { goto syntax; } break; case 'u': if(iobfexpectstr(file, expect = "unit")) { goto syntax; } goto geom; case 'g': if(iobfexpectstr(file, expect = "geom")) goto syntax; geom: if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } expect = "geometry"; if(!GeomStreamIn(p, &inst->geomhandle, &inst->geom)) { goto failed; } if(inst->geomhandle) { HandleRegister(&inst->geomhandle, (Ref *)inst, &inst->geom, HandleUpdRef); } break; case 'n': /* ntransform */ if(iobfexpectstr(file, (expect = "ntransform"))) { goto syntax; } if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } expect = "ntransform matrix"; if(!NTransStreamIn(p, &inst->NDaxishandle, &inst->NDaxis)) { goto failed; } if(inst->NDaxishandle) { HandleRegister(&inst->NDaxishandle, (Ref *)inst, &inst->NDaxis, HandleUpdRef); } break; case 't': /* tlist ... or transform ... */ if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } iobfgetc(file); switch((c = iobfgetc(file))) { case 'l': if(iobfexpectstr(file, (expect = "tlist")+2)) { /* "tlist" */ goto syntax; } transforms: if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } expect = "TLIST object"; if(!GeomStreamIn(p, &inst->tlisthandle, &inst->tlist)) { goto failed; } if(inst->tlisthandle) { HandleRegister(&inst->tlisthandle, (Ref *)inst, &inst->tlist, HandleUpdRef); } break; case 'r': if(iobfexpectstr(file, (expect = "transform")+2)) { /* "transform" */ goto syntax; } if(iobfexpectstr(file, "s") == 0) { /* transforms = tlist */ goto transforms; } if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } expect = "transform matrix"; if (!TransStreamIn(p, &inst->axishandle, inst->axis)) { goto failed; } if (inst->axishandle) { HandleRegister(&inst->axishandle, (Ref *)inst, inst->axis, TransUpdate); } break; case 'x': if (iobfexpectstr(file, (expect = "txtransforms")+2)) { goto syntax; } if(inst == NULL) { inst = (Inst *)GeomCCreate(NULL, InstMethods(), NULL); } expect = "TLIST object"; if(!GeomStreamIn(p, &inst->txtlisthandle, &inst->txtlist)) { goto failed; } if(inst->txtlisthandle) { HandleRegister(&inst->txtlisthandle, (Ref *)inst, &inst->txtlist, HandleUpdRef); } break; default: expect = "something"; goto syntax; } break; default: syntax: OOGLSyntax(file, "Couldn't read INST in \"%s\": " "syntax error, expected %s, got char %c", p->poolname, expect, c); goto bogus; failed: OOGLSyntax(file, "Couldn't read INST in \"%s\": expected %s", PoolName(p), expect); bogus: GeomDelete((Geom *)inst); return NULL; } } done: return (Geom *)inst; } int InstExport(Inst *inst, Pool *pool) { FILE *outf; int ok = 1; if(inst == NULL || pool == NULL || (outf = PoolOutputFile(pool)) == NULL) return 0; PoolFPrint(pool, outf, "INST\n"); if(inst->origin != L_NONE && (unsigned)inst->origin < COUNT(locations)) { PoolFPrint(pool, outf, "origin %s ", locations[inst->origin]); fputnf(pool->outf, 3, &inst->originpt.x, 0); fputc('\n', pool->outf); } if(inst->location != L_LOCAL && inst->location != L_NONE && (unsigned)inst->location < COUNT(locations)) PoolFPrint(pool, outf, "location %s\n", locations[inst->location]); if(inst->tlist != NULL || inst->tlisthandle != NULL) { PoolFPrint(pool, outf, "transforms "); ok &= GeomStreamOut(pool, inst->tlisthandle, inst->tlist); } else if(inst->tlist != NULL || inst->tlisthandle != NULL) { PoolFPrint(pool, outf, "txtransforms "); ok &= GeomStreamOut(pool, inst->tlisthandle, inst->tlist); } else if (memcmp(inst->axis, TM_IDENTITY, sizeof(Transform)) != 0) { PoolFPrint(pool, outf, ""); ok &= TransStreamOut(pool, inst->axishandle, inst->axis); } else if (inst->NDaxis != NULL) { PoolFPrint(pool, outf, ""); ok &= NTransStreamOut(pool, inst->NDaxishandle, inst->NDaxis); } if(inst->geom != NULL || inst->geomhandle != NULL) { PoolFPrint(pool, outf, "geom "); ok &= GeomStreamOut(pool, inst->geomhandle, inst->geom); } return ok; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/inst/instpick.c0000644000175000001440000001072010523116621015701 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include "instP.h" #include "ooglutil.h" #include "pickP.h" static TmCoord (*coords2NDC(int system, Pick *p, Transform Tl2n))[4] { switch(system) { case L_CAMERA: return p->Tc2n; case L_NDC: return TM3_IDENTITY; case L_SCREEN: return p->Ts2n; case L_GLOBAL: return p->Tw2n; default: return Tl2n; } } static TmCoord (*coordsbtwn(int from, int to, Pick *p, Transform Tl2n))[4] { static Transform Tmap; if(from == L_NONE) from = L_LOCAL; if(to == L_NONE) to = L_LOCAL; if(from == to) return TM3_IDENTITY; if(to == L_NDC) return coords2NDC(from, p, Tl2n); TmInvert( coords2NDC(to, p, Tl2n), Tmap ); TmConcat( coords2NDC(from, p, Tl2n), Tmap, Tmap ); return Tmap; } Geom * InstPick(Inst *inst, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { int elem = 0, pathInd; Transform tT; GeomIter *it; Geom *v = NULL; if(inst == NULL || inst->geom == NULL) return NULL; if (TN && inst->origin != L_NONE) { static int was_here; if (!was_here) OOGLError(1, "FIXME: \"origin\" unsupported int ND-context.\n"); return NULL; } if (inst->NDaxis) { TransformN *tT; if (TN) { pathInd = VVCOUNT(p->gcur); vvneeds(&p->gcur, pathInd + 1); *VVINDEX(p->gcur, int, pathInd) = elem; tT = TmNConcat(inst->NDaxis, TN, NULL); if (GeomPick(inst->geom, p, ap, NULL, tT, axes)) v = (Geom *)inst; TmNDelete(tT); } return v; } if (inst->origin > L_LOCAL || inst->location > L_LOCAL) { TmTranslate( tT, p->x0, p->y0, 0. ); TmConcat( T, tT, T ); if (inst->origin > L_LOCAL) { Point3 originwas, delta; TmCoord (*l2o)[4], (*o2N)[4]; Transform Tl2o; static HPoint3 zero = { 0, 0, 0, 1 }; /* We have location2W, origin2W. * We want to translate in 'origin' coords such that * (0,0,0) in location coords maps to originpt in origin coords. */ o2N = coords2NDC(inst->origin, p, T); l2o = coordsbtwn(inst->location, inst->origin, p, T); HPt3TransPt3(l2o, &zero, &originwas); Pt3Sub(&inst->originpt, &originwas, &delta); TmTranslate( tT, delta.x, delta.y, delta.z ); TmConcat( l2o, tT, Tl2o ); TmConcat( T, Tl2o, tT ); TmConcat( tT, o2N, T ); } else { TmCopy( coords2NDC(inst->location, p, T), T ); } TmTranslate( tT, -p->x0, -p->y0, 0. ); TmConcat( T, tT, T ); } if (!TN || inst->location > L_LOCAL) { pathInd = VVCOUNT(p->gcur); vvneeds(&p->gcur, pathInd + 1); VVCOUNT(p->gcur)++; it = GeomIterate((Geom *)inst, DEEP); while (NextTransform(it, tT)) { *VVINDEX(p->gcur, int, pathInd) = elem; TmConcat(tT, T, tT); if (GeomPick(inst->geom, p, ap, tT, NULL, NULL)) v = (Geom *)inst; elem++; } VVCOUNT(p->gcur)--; return v; } else { TransformN *tTN = NULL; pathInd = VVCOUNT(p->gcur); vvneeds(&p->gcur, pathInd + 1); VVCOUNT(p->gcur)++; it = GeomIterate((Geom *)inst, DEEP); while (NextTransform(it, tT)) { *VVINDEX(p->gcur, int, pathInd) = elem; tTN = TmNCopy(TN, tTN); TmNApplyT3TN(tT, NULL, tTN); if (GeomPick(inst->geom, p, ap, NULL, tTN, axes)) v = (Geom *)inst; elem++; } VVCOUNT(p->gcur)--; if (tTN) { TmNDelete(tTN); } return v; } return v; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/inst/instsphere.c0000644000175000001440000000631110516745353016256 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "instP.h" #include "sphere.h" Geom *InstBoundSphere(Inst *inst, Transform T, TransformN *TN, int *axes, int space) { Sphere *geomsphere, *sphere; Transform Tnew; GeomIter *it; if (inst == NULL || inst->geom == NULL) return NULL; if (inst->location > L_LOCAL || inst->origin > L_LOCAL) return NULL; if (T == NULL) T = TM_IDENTITY; if (inst->NDaxis == NULL) { if (TN == NULL) { it = GeomIterate((Geom *)inst, DEEP); geomsphere = NULL; while (NextTransform(it, Tnew) > 0) { TmConcat(Tnew, T, Tnew); sphere = (Sphere *)GeomBoundSphere(inst->geom, Tnew, NULL, NULL, space); if (sphere != NULL) { if (geomsphere != NULL) { SphereUnion3(geomsphere, sphere, geomsphere); GeomDelete((Geom *)sphere); } else geomsphere = sphere; } } } else { TransformN *TnewN = TmNCopy(TN, NULL); static int dflt_axes[] = { 1, 2, 3, 0 }; it = GeomIterate((Geom *)inst, DEEP); geomsphere = NULL; while (NextTransform(it, Tnew) > 0) { /* If TN != NULL, then Tnew is first applied to the x,y,z * sub-space of the object, then folded into TN, and finally * the product is projected down to the sub-space defined by * the "axes" argument. */ TmNCopy(TN, TnewN); TmNApplyT3TN(Tnew, dflt_axes, TnewN); sphere = (Sphere *)GeomBoundSphere(inst->geom, NULL, TnewN, axes, space); if (sphere != NULL) { if (geomsphere != NULL) { SphereUnion3(geomsphere, sphere, geomsphere); GeomDelete((Geom *)sphere); } else geomsphere = sphere; } } TmNDelete(TnewN); } } else { if (TN) { TransformN *TnewN; TnewN = TmNConcat(inst->NDaxis, TN, NULL); geomsphere = (Sphere *)GeomBoundSphere(inst->geom, NULL, TnewN, axes, space); TmNDelete(TnewN); } else { TransformN *TnewN = TmNCopy(inst->NDaxis, NULL); static int dflt_axes[] = { 1, 2, 3, 0 }; TmNApplyDN(TnewN, dflt_axes, T); geomsphere = (Sphere *)GeomBoundSphere(inst->geom, NULL, TnewN, dflt_axes, space); TmNDelete(TnewN); } } return (Geom *)geomsphere; } geomview-1.9.4/src/lib/gprim/inst/instP.h0000644000175000001440000000404010577535005015167 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef INSTPDEFS #define INSTPDEFS /* * Private definitions for Inst's. */ #include "inst.h" #include "bboxP.h" /* includes geomclass.h */ #define INSTMAGIC GeomMagic('i', 3) #define INSTFIELDS \ GEOMFIELDS; \ Geom *geom; \ Handle *geomhandle; \ Transform axis; /* this ought to go... */ \ Handle *axishandle; \ TransformN *NDaxis; /* maybe not. */ \ Handle *NDaxishandle; \ Geom *tlist; \ Handle *tlisthandle; \ Geom *txtlist; \ Handle *txtlisthandle; \ int location; /* L_LOCAL, etc. */ \ int origin; /* L_NONE, L_LOCAL, etc. */ \ Point3 originpt /* Only if origin != L_NONE */ struct Inst { INSTFIELDS; }; extern GeomClass *InstClass; /* Public read-only; valid only * after first call to InstMethods() */ extern Inst *InstCreate( Inst *exist, GeomClass *Class, va_list *attrs ); extern void InstDelete( Inst * ); extern Inst *InstCopy( Inst * ); extern Inst *InstDice( Inst *, int nu, int nv ); #endif /*INSTPDEFS*/ /* * Local Variables *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/inst/Headers0000644000175000001440000000001707730237236015221 00000000000000inst.h instP.h geomview-1.9.4/src/lib/gprim/list/0000777000175000001440000000000010665240673014007 500000000000000geomview-1.9.4/src/lib/gprim/list/listcreate.c0000644000175000001440000001431610624072353016224 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "listP.h" #include "nodedata.h" /* * List editing, deletion and creation. */ Geom *ListReplace(List *list, Geom *geom) { Geom *g; if(list == NULL) { return NULL; } g = list->car; list->car = geom; return g; } Geom *ListRemove(Geom *list, Geom *g) { List *l; List **prev; if (list == NULL) { return NULL; } if (list->Class != ListClass) { OOGLError(1, "ListRemove: %x is a %s not a List!", list, GeomName(list)); return NULL; } for (prev = (List **)(void *)&list; (l = *prev) != NULL; prev = &l->cdr) { if (l->car == g) { *prev = l->cdr; l->cdr = NULL; GeomDelete( (Geom *)l ); break; } } return list; } /* * Delete a List. * Don't use a for-loop over all the list elements; * someone else might have pointers to them. */ void ListDelete(List *l) { if (l->cdr) GeomDelete((Geom *)l->cdr); if (l->car) GeomDelete(l->car); if (l->carhandle) HandlePDelete(&l->carhandle); } List *ListCopy(List *list) { List *l, *nl; Geom *newcar; List *newlist; List **tailp = &newlist; for (l = list; l != NULL; l = l->cdr) { newcar = GeomCopy(l->car); if (newcar == NULL) continue; nl = OOGLNewE(List, "ListCopy: List"); GGeomInit(nl, list->Class, list->magic, NULL); *tailp = nl; tailp = &nl->cdr; nl->car = newcar; nl->carhandle = NULL; } *tailp = NULL; return newlist; } int ListGet(List *l, int attr, void *attrp) { switch(attr) { case CR_GEOM: *(Geom **)attrp = l->car; break; case CR_GEOMHANDLE: *(Handle **)attrp = l->carhandle; break; case CR_CDR: *(Geom **)attrp = (Geom *)l->cdr; break; default: return -1; } return 1; } Geom *ListAppend(Geom *lg, Geom *g) { List *new = OOGLNewE(List, "ListAppend: List"); List *l = (List*)lg; if (l && l->Class->Delete != (GeomDeleteFunc *)ListDelete) { OOGLError(0, "ListAppend: attempt to append to a %s, not a List", GeomName((Geom *)l)); return NULL; } new->car = g; new->cdr = NULL; if (l) { while (l->cdr) l = l->cdr; l->cdr = new; GGeomInit(new, lg->Class, lg->magic, NULL); } else { l = new; GGeomInit(new, ListClass, LISTMAGIC, NULL); } new->carhandle = NULL; return lg ? lg : (Geom *)new; } List *ListCreate (List *exist, GeomClass *Classp, va_list *a_list ) { List *list, *l; int attr, copy = 1; Handle *h; Geom *g; bool tree_changed = false; if (exist == NULL) { list = OOGLNewE( List, "ListCreate: new List" ); GGeomInit(list, Classp, LISTMAGIC, NULL); list->cdr = NULL; list->carhandle = NULL; list->car = NULL; } else { if (exist->Class != Classp) { OOGLError(0, "ListCreate: existing_value %x (magic %x) not a List", exist, exist->magic); return NULL; } list = exist; } while ((attr = va_arg (*a_list, int))) switch (attr) { case CR_HANDLE_GEOM: /* * Like GeomReplace, but takes a Handle too. */ h = va_arg(*a_list, Handle *); g = va_arg(*a_list, Geom *); if (g == NULL && h != NULL) g = (Geom *)HandleObject(h); if (copy) { if (h) RefIncr((Ref *)h); RefIncr((Ref *)g); } GeomDelete(list->car); HandlePDelete(&list->carhandle); list->carhandle = h; list->car = g; if (h) { HandleRegister(&list->carhandle, (Ref *)list, &list->car, HandleUpdRef); HandleSetObject(list->carhandle, (Ref *)g); } tree_changed = true; break; case CR_GEOM: /* == CR_CAR */ if (list->car != NULL || list->carhandle != NULL) { l = OOGLNewE(List, "ListCreate: List"); GGeomInit(l, Classp, LISTMAGIC, NULL); l->car = list->car; l->carhandle = list->carhandle; RefIncr((Ref *)list->carhandle); l->cdr = list->cdr; list->cdr = l; } list->car = va_arg (*a_list, Geom *); if (copy) { RefIncr((Ref *)list->car); } tree_changed = true; break; case CR_GEOMHANDLE: if (list->car != NULL || list->carhandle != NULL) { l = OOGLNewE(List, "ListCreate: List"); l->car = list->car; l->carhandle = list->carhandle; l->cdr = list->cdr; list->cdr = l; list->car = NULL; } h = va_arg(*a_list, Handle *); if (copy) RefIncr((Ref *)h); HandlePDelete(&list->carhandle); list->carhandle = h; HandleRegister(&list->carhandle, (Ref *)list, &list->car, HandleUpdRef); tree_changed = true; break; case CR_CDR: l = va_arg (*a_list, List *); if (l && l->Class != Classp) { OOGLError(0, "ListCreate: CDR %x (magic %x) not a List", l, l->magic); goto fail; } if (list->cdr) { GeomDelete((Geom *)list->cdr); } if (copy) { RefIncr((Ref *)l); } list->cdr = l; tree_changed = true; break; default: if (GeomDecorate (list, ©, attr, a_list)) { OOGLError (0, "ListCreate: Undefined attribute: %d", attr); fail: if (exist == NULL) { GeomDelete ((Geom *)list); } return NULL; } } if (tree_changed) { GeomNodeDataPrune((Geom *)list); } return list; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/list/liststream.c0000644000175000001440000000650410575101562016254 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "inst.h" #include "streampool.h" #include "transobj.h" #include "handleP.h" #include "listP.h" List * ListImport( Pool *p ) { List *list = NULL; List *new, **tailp = &list; int c, prevc = 0; int brack = 0; int any = 0; IOBFILE *file; if(p == NULL || (file = PoolInputFile(p)) == NULL) return NULL; if(strcmp(GeomToken(file), "LIST") != 0) return NULL; while((c = iobfnextc(file, 0)) != EOF) { switch(c) { case ';': case ')': goto done; case CBRA: brack++; iobfgetc(file); continue; case CKET: if(--brack < 0) goto done; iobfgetc(file); if(prevc == CBRA) { /* Interpret "{ }" as a NULL entry in a list. Leave it * there as a placeholder -- could be deliberate. */ new = (List *)GeomCCreate(NULL, ListMethods(), CR_END); *tailp = new; tailp = &new->cdr; any = 1; } break; default: new = (List *)GeomCCreate(NULL, ListMethods(), CR_END); if(GeomStreamIn(p, &new->carhandle, &new->car)) { *tailp = new; tailp = &new->cdr; if(new->carhandle) HandleRegister(&new->carhandle, (Ref *)new, (Ref **)(void *)&new->car, HandleUpdRef); } else { OOGLSyntax(file, "Couldn't read LIST in \"%s\": error reading embedded object", p->poolname); GeomDelete((Geom *)new); GeomDelete((Geom *)list); return NULL; } any = 1; break; } prevc = c; } /* * If no list members appeared at all, call it a valid, empty List. * But if there were list members but none were readable, fail. * Hence the "any" flag. */ done: if(brack > 0) OOGLSyntax(file, "Couldn't read LIST in \"%s\": too many %c's", p->poolname, CBRA); if(!any) return (List *)GeomCCreate(NULL, ListMethods(), CR_END); /* null LIST */ return list; } int ListExport(List *l, Pool *p) { if(p == NULL || p->outf == NULL) { return 0; } PoolFPrint(p, p->outf, "LIST\n"); while(l != NULL) { PoolFPrint(p, p->outf, ""); if(!GeomStreamOut( p, l->carhandle, l->car )) { return 0; } l = l->cdr; } return 1; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/list/listP.h0000644000175000001440000000311710572372765015176 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef LISTPDEF #define LISTPDEF #include "geomclass.h" #include "list.h" struct List { GEOMFIELDS; Geom *car; Handle *carhandle; struct List *cdr; }; extern List *ListCreate( List *exist, GeomClass *, va_list *a_list); extern void ListDelete( List * ); extern List *ListCopy( List * ); extern List *ListImport( Pool * ); extern int ListExport( List *, Pool * ); extern Geom *ListPick(List *list, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes); extern List *ListBSPTree(List *list, BSPTree *bsptree, int action); extern List *ListDice(List *list, int nu, int nv); #endif /*LISTPDEF*/ geomview-1.9.4/src/lib/gprim/list/listdraw.c0000644000175000001440000000677610624066413015731 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "listP.h" #include "mg.h" #include "bsptreeP.h" List *ListDraw(List *list) { List *l; GeomMakePath(list, 'L', path, pathlen); list->geomflags &= ~GEOM_ALPHA; for (l = list; l != NULL; l = l->cdr) { int lpathlen = pathlen+1; char *lpath = alloca(lpathlen+1); memcpy(lpath, path, pathlen); lpath[lpathlen-1] = 'l'; lpath[lpathlen] = '\0'; if (l->car) { l->car->ppath = lpath; l->car->ppathlen = lpathlen; GeomDraw(l->car); if (l->car->geomflags & GEOM_ALPHA) { list->geomflags |= GEOM_ALPHA; } } path = lpath; pathlen = lpathlen; } return list; } List *ListBSPTree(List *list, BSPTree *bsptree, int action) { List *l; GeomMakePath(list, 'L', path, pathlen); switch (action) { case BSPTREE_CREATE: for (l = list; l != NULL; l = l->cdr) { int lpathlen = pathlen+1; char *lpath = alloca(lpathlen+1); memcpy(lpath, path, pathlen); lpath[lpathlen-1] = 'l'; lpath[lpathlen] = '\0'; if (l->car) { l->car->ppath = lpath; l->car->ppathlen = lpathlen; GeomBSPTree(l->car, bsptree, action); } HandleRegister(&l->carhandle, (Ref *)l, bsptree, BSPTreeInvalidate); path = lpath; pathlen = lpathlen; } return list; case BSPTREE_DELETE: for (l = list; l != NULL; l = l->cdr) { int lpathlen = pathlen+1; char *lpath = alloca(lpathlen+1); memcpy(lpath, path, pathlen); lpath[lpathlen-1] = 'l'; lpath[lpathlen] = '\0'; if (l->car) { l->car->ppath = lpath; l->car->ppathlen = lpathlen; GeomBSPTree(l->car, bsptree, action); } HandleUnregisterJust(&l->carhandle, (Ref *)l, bsptree, BSPTreeInvalidate); path = lpath; pathlen = lpathlen; } return list; case BSPTREE_ADDGEOM: for (l = list; l != NULL; l = l->cdr) { int lpathlen = pathlen+1; char *lpath = alloca(lpathlen+1); memcpy(lpath, path, pathlen); lpath[lpathlen-1] = 'l'; lpath[lpathlen] = '\0'; if (l->car) { l->car->ppath = lpath; l->car->ppathlen = lpathlen; GeomBSPTree(l->car, bsptree, action); } path = lpath; pathlen = lpathlen; } return list; default: return NULL; } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/list/listclass.c0000644000175000001440000000511410557512271016065 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "listP.h" GeomClass *ListClass = NULL; int ListPresent = 1; static char listName[] = "list"; char *ListName(void) { return listName; } extern void ListHandleScan( List *, int (*func)(), void *arg ); GeomClass *ListMethods(void) { if( !ListClass ) { ListClass = GeomClassCreate(listName); ListClass->name = ListName; ListClass->methods = (GeomMethodsFunc *)ListMethods; ListClass->create = (GeomCreateFunc *)ListCreate; ListClass->get = (GeomGetFunc *)ListGet; ListClass->Delete = (GeomDeleteFunc *)ListDelete; ListClass->bound = (GeomBoundFunc *)ListBound; ListClass->boundsphere = (GeomBoundSphereFunc *)ListBoundSphere; ListClass->evert = (GeomEvertFunc *)ListEvert; ListClass->dice = (GeomDiceFunc *)ListDice; ListClass->transform = (GeomTransformFunc *)ListTransform; ListClass->transformto = (GeomTransformToFunc *)ListTransform; ListClass->pick = (GeomPickFunc *)ListPick; ListClass->copy = (GeomCopyFunc *)ListCopy; ListClass->draw = (GeomDrawFunc *)ListDraw; ListClass->bsptree = (GeomBSPTreeFunc *)ListBSPTree; ListClass->replace = (GeomReplaceFunc *)ListReplace; ListClass->scan = (GeomScanFunc *)ListHandleScan; ListClass->import = (GeomImportFunc *)ListImport; ListClass->export = (GeomExportFunc *)ListExport; } return ListClass; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/list/listmisc.c0000644000175000001440000000435110514661170015711 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "listP.h" void ListHandleScan( List *list, int (*func)(), void *arg ) { while(list) { if(list->carhandle) (*func)(&list->carhandle, list, arg); GeomHandleScan( list->car, func, arg ); list = list->cdr; } } List * ListDice( List *list, int nu, int nv ) { List *l; for(l = list; l != NULL; l = l->cdr) GeomDice(l->car, nu, nv); return list; } List * ListEvert( List *list ) { List *l; for(l = list; l != NULL; l = l->cdr) GeomEvert( l->car ); return list; } BBox *ListBound(List *list, Transform T, TransformN *TN) { Geom *carbox = NULL; BBox *bbox = NULL; List *l; for(l = list; l != NULL; l = l->cdr) { carbox = GeomBound( l->car, T, TN ); if(carbox == NULL) continue; if(bbox) { BBoxUnion3(bbox, (BBox *)carbox, bbox); GeomDelete( carbox ); } else { bbox = (BBox *)carbox; } } return bbox; } List *ListTransform(List *list, Transform T, TransformN *TN) { List *l; for(l = list; l != NULL; l = l->cdr) GeomTransform( l->car, T, TN ); return list; } geomview-1.9.4/src/lib/gprim/list/listpick.c0000644000175000001440000000337510522731371015711 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include "listP.h" #include "ooglutil.h" #include "pickP.h" Geom * ListPick(List *list, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { int elem = 0, pathInd; List *l; Geom *v = NULL; pathInd = VVCOUNT(p->gcur); vvneeds(&p->gcur, pathInd + 1); VVCOUNT(p->gcur)++; for(l = list; l != NULL; l = l->cdr) { *VVINDEX(p->gcur, int, pathInd) = elem; if(l->car) if(GeomPick(l->car, p, ap, T, TN, axes)) v = (Geom *)list; elem++; } VVCOUNT(p->gcur)--; return v; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/list/listsphere.c0000644000175000001440000000321210510667537016250 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "listP.h" #include "sphere.h" Geom *ListBoundSphere(List *list, Transform T, TransformN *TN, int *axes, int space) { Geom *carsphere = NULL, *sphere = NULL; List *l; for (l = list; l != NULL; l = l->cdr) { carsphere = GeomBoundSphere(l->car, T, TN, axes, space); if (carsphere == NULL) continue; if (sphere != NULL) { SphereUnion3((Sphere *)sphere, (Sphere *)carsphere, (Sphere *)sphere); GeomDelete(carsphere); } else sphere = carsphere; } return sphere; } geomview-1.9.4/src/lib/gprim/list/Makefile.am0000644000175000001440000000033210455665332015755 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = liblist.la liblist_la_SOURCES = \ listclass.c listcreate.c listdraw.c listmisc.c listpick.c listsphere.c liststream.c \ list.h listP.h geomview-1.9.4/src/lib/gprim/list/Makefile.in0000644000175000001440000003641710665240503015773 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/list DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) liblist_la_LIBADD = am_liblist_la_OBJECTS = listclass.lo listcreate.lo listdraw.lo \ listmisc.lo listpick.lo listsphere.lo liststream.lo liblist_la_OBJECTS = $(am_liblist_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(liblist_la_SOURCES) DIST_SOURCES = $(liblist_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = liblist.la liblist_la_SOURCES = \ listclass.c listcreate.c listdraw.c listmisc.c listpick.c listsphere.c liststream.c \ list.h listP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/list/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/list/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done liblist.la: $(liblist_la_OBJECTS) $(liblist_la_DEPENDENCIES) $(LINK) $(liblist_la_OBJECTS) $(liblist_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listmisc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liststream.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/list/list.h0000644000175000001440000000406710514661170015046 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef LISTDEF #define LISTDEF #include "bbox.h" #define LISTMAGIC GeomMagic ('l', 1) typedef struct List List; extern Geom *ListRemove( Geom *list, Geom *car_of_member ); extern Geom *ListAppend( Geom *list, Geom *new_member_car ); extern GeomClass *ListClass; extern GeomClass *ListMethods( void ); extern char *ListName( void ); extern List *ListLoad( char *fname ); extern List *ListFLoad( FILE *f, char *fname ); extern BBox *ListBound( List *, Transform, TransformN *TN); extern Geom *ListBoundSphere( List *, Transform, TransformN *TN, int *axes, int ); extern List *ListTransform( List *, Transform, TransformN* ); extern List *ListRotate( List *, float, Point * ); extern List *ListTranslate( List *, float, float, float ); extern List *ListScale( List *, float, float, float ); extern List *ListEvert( List * ); extern Geom *ListReplace( List *, Geom * ); extern List *ListDraw( List * ); extern List *ListSave( List *, char * ); extern List *ListFSave( List *, FILE *file, char *fname ); extern int ListGet( List *, int attr, void *attrp ); extern List *ListImport( Pool * ); #endif /*LISTDEF*/ geomview-1.9.4/src/lib/gprim/list/Headers0000644000175000001440000000001707730237304015213 00000000000000list.h listP.h geomview-1.9.4/src/lib/gprim/mesh/0000777000175000001440000000000010665240673013770 500000000000000geomview-1.9.4/src/lib/gprim/mesh/meshdelete.c0000644000175000001440000000260010564035073016157 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" Mesh * MeshDelete(Mesh *m) { if (m) { if (m->p) GeomFree(m->p); if (m->n) GeomFree(m->n); if (m->c) GeomFree(m->c); if (m->u) GeomFree(m->u); } return NULL; } geomview-1.9.4/src/lib/gprim/mesh/meshevert.c0000644000175000001440000000331010560442501016033 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" Mesh *MeshEvert(Mesh *m) { int i; Point3 *n; if (m) { if (m->geomflags & MESH_EVERT) m->geomflags &= ~MESH_EVERT; else m->geomflags |= MESH_EVERT; if (m->geomflags & MESH_N) { for (i = 0, n = m->n; i < m->nu*m->nv; i++,n++){ n->x = -n->x; n->y = -n->y; n->z = -n->z; } } if (m->geomflags & MESH_NQ) { for (i = 0, n = m->nq; i < m->nu*m->nv; i++,n++){ n->x = -n->x; n->y = -n->y; n->z = -n->z; } } MeshComputeNormals(m, MESH_N|MESH_NQ); } return m; } geomview-1.9.4/src/lib/gprim/mesh/meshcreate.c0000644000175000001440000001206510622716754016175 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" static int tossmesh(Mesh *); static int meshfield(int copy, int amount, void **fieldp, void *value, char *name); Mesh * MeshCreate (Mesh *exist, GeomClass *classp, va_list *a_list) { Mesh *mesh; int attr, copy = 1; int npts; Point3 *p3; ColorA *c; c = NULL; p3 = NULL; if (exist == NULL) { mesh = OOGLNewE(Mesh, "MeshCreate mesh"); memset(mesh, 0, sizeof(Mesh)); GGeomInit (mesh, classp, MESHMAGIC, NULL); mesh->bsptree = NULL; mesh->nu = 1; mesh->nv = 1; mesh->umin = -1; mesh->umax = -1; mesh->vmin = -1; mesh->vmax = -1; } else { /* Check that exist is a Mesh... */ mesh = exist; } npts = mesh->nu * mesh->nv; mesh->pdim = 4; /* hard-wired */ while ((attr = va_arg (*a_list, int))) switch (attr) { case CR_FLAG: mesh->geomflags = va_arg (*a_list, int); break; case CR_NU: mesh->nu = va_arg (*a_list, int); tossmesh(mesh); npts = mesh->nu * mesh->nv; break; case CR_NV: mesh->nv = va_arg (*a_list, int); tossmesh(mesh); npts = mesh->nu * mesh->nv; break; case CR_UMIN: mesh->umin = va_arg (*a_list, int); break; case CR_UMAX: mesh->umax = va_arg (*a_list, int); break; case CR_VMIN: mesh->vmin = va_arg (*a_list, int); break; case CR_VMAX: mesh->vmax = va_arg (*a_list, int); break; case CR_POINT: mesh->geomflags &= ~MESH_NQ; if(mesh->p) OOGLFree(mesh->p); mesh->p = OOGLNewNE(HPoint3, npts, "mesh points"); p3 = va_arg(*a_list, Point3 *); Pt3ToHPt3(p3, mesh->p, npts); if(!copy) OOGLFree(p3); break; case CR_POINT4: mesh->geomflags &= ~MESH_NQ; meshfield(copy, npts*sizeof(HPoint3), (void **)(void *)&mesh->p, (void *)va_arg (*a_list, HPoint3 *), "mesh points"); break; case CR_NORMAL: mesh->geomflags = (mesh->geomflags & ~MESH_N) | (MESH_N & meshfield(copy, npts*sizeof(Point3), (void **)(void *)&mesh->n, (void *)va_arg (*a_list, Point3 *), "mesh normals")); break; case CR_U: mesh->geomflags = (mesh->geomflags & ~MESH_U) | (MESH_U & meshfield(copy, npts*sizeof(TxST), (void **)(void *)&mesh->u, (void *)va_arg (*a_list, TxST *), "mesh texture coords")); break; case CR_COLOR: mesh->geomflags &= ~COLOR_ALPHA; mesh->geomflags = (mesh->geomflags & ~MESH_C) | (MESH_C & meshfield(copy, npts*sizeof(ColorA), (void **)(void *)&mesh->c, (void *)(c = va_arg (*a_list, ColorA *)), "mesh colors")); break; default: if (GeomDecorate (mesh, ©, attr, a_list)) { GeomError (0, "MeshCreate: Undefined option: %d", attr); OOGLFree (mesh); return NULL; } } /* set submesh dimensions if not otherwise set */ if (mesh->umin == -1) mesh->umin = 0; if (mesh->umax == -1) mesh->umax = mesh->nu-1; if (mesh->vmin == -1) mesh->vmin = 0; if (mesh->vmax == -1) mesh->vmax = mesh->nv-1; if (c) { int i; for (i = 0; i < mesh->nu*mesh->nv; i++) { if (mesh->c[i].a < 1.0) { mesh->geomflags |= COLOR_ALPHA; } } } return mesh; } static int tossmesh(Mesh *m) { if(m->p) OOGLFree(m->p); if(m->n) OOGLFree(m->n); if(m->nq) OOGLFree(m->nq); if(m->c) OOGLFree(m->c); if(m->u) OOGLFree(m->u); m->p = NULL; m->n = NULL; m->nq = NULL; m->c = NULL; m->u = NULL; m->umin = m->umax = m->vmin = m->vmax = -1; m->geomflags &= ~MESH_NQ; return 0; } static int meshfield(int copy, int amount, void **fieldp, void *value, char *name) { if(value) { if(copy) { if(*fieldp == NULL) *fieldp = OOGLNewNE(char, amount, name); memcpy(*fieldp, value, amount); } else { if(*fieldp) OOGLFree(*fieldp); *fieldp = value; } return ~0; } else { if(*fieldp) OOGLFree(*fieldp); *fieldp = NULL; return 0; } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/mesh/meshP.h0000644000175000001440000000365410577535005015137 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MESHPDEF #define MESHPDEF #include "geomclass.h" #include "mesh.h" #include "bsptree.h" struct Mesh { GEOMFIELDS; int seq; int nu, nv; int umin, umax, vmin, vmax; HPoint3 *p; Point3 *n; Point3 *nq; /* per quad normals */ TxST *u; ColorA *c; }; #define nuverts(m) (m)->nu #define nvverts(m) (m)->nv #define nuquads(m) (((m)->flag & MESH_UWRAP) ? (m)->nu : (m)->nu - 1) #define nvquads(m) (((m)->flag & MESH_VWRAP) ? (m)->nv : (m)->nv - 1) /* * MESHINDEX(u, v, mesh) * Returns the index of a point into the mesh->array given its u & v * coordinates. */ #define MESHINDEX(u, v, mesh) \ (((v)%(mesh)->nv)*(mesh)->nu + ((u)%(mesh)->nu)) /* * MESHPOINT(u, v, mesh, plist) * Returns plist[MESHINDEX(u, v, mesh)] */ #define MESHPOINT(u, v, mesh, plist) ((plist)[MESHINDEX(u, v, mesh)]) extern Mesh *MeshComputeNormals(Mesh *m, int need); #endif /* ! MESHPDEF */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/mesh/Makefile.am0000644000175000001440000000047310455665332015744 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmesh.la libmesh_la_SOURCES = \ meshbound.c meshclass.c meshcopy.c meshcreate.c meshdelete.c meshdice.c meshdraw.c meshevert.c meshload.c meshnormal.c meshpick.c meshsave.c meshsphere.c meshtransform.c \ meshflag.h mesh.h meshP.h geomview-1.9.4/src/lib/gprim/mesh/Makefile.in0000644000175000001440000003773310665240503015756 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/mesh DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libmesh_la_LIBADD = am_libmesh_la_OBJECTS = meshbound.lo meshclass.lo meshcopy.lo \ meshcreate.lo meshdelete.lo meshdice.lo meshdraw.lo \ meshevert.lo meshload.lo meshnormal.lo meshpick.lo meshsave.lo \ meshsphere.lo meshtransform.lo libmesh_la_OBJECTS = $(am_libmesh_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libmesh_la_SOURCES) DIST_SOURCES = $(libmesh_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libmesh.la libmesh_la_SOURCES = \ meshbound.c meshclass.c meshcopy.c meshcreate.c meshdelete.c meshdice.c meshdraw.c meshevert.c meshload.c meshnormal.c meshpick.c meshsave.c meshsphere.c meshtransform.c \ meshflag.h mesh.h meshP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/mesh/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/mesh/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libmesh.la: $(libmesh_la_OBJECTS) $(libmesh_la_DEPENDENCIES) $(LINK) $(libmesh_la_OBJECTS) $(libmesh_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshdelete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshdice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshevert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshnormal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meshtransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/mesh/meshcopy.c0000644000175000001440000000462110577535005015700 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" Mesh * MeshCopy(Mesh *obj) { Mesh *m; Mesh *om = obj; int n; if (om == NULL) return (NULL); if ( (m = GeomNew(Mesh)) == NULL ) { GeomError(0,"Can't allocate space for mesh"); return (NULL); } *m = *om; /* copy scalar fields */ n = m->nu * m->nv; if ((m->p = GeomNewN(HPoint3, n)) == NULL) { GeomError(0,"Can't allocate space for mesh vertices"); return (NULL); } memcpy(m->p, om->p, n * sizeof(HPoint3)); if (m->geomflags & MESH_N) { if ((m->n = GeomNewN(Point3, n)) == NULL) { GeomError(0,"Can't allocate space for mesh normals"); return(NULL); } memcpy(m->n, om->n, n * sizeof(Point3)); } else m->n = NULL; if (m->geomflags & MESH_C) { if ((m->c = GeomNewN(ColorA, n)) == NULL) { GeomError(0,"Can't allocate space for mesh colors"); return(NULL); } memcpy(m->c, om->c, n * sizeof(ColorA)); } else { m->c = NULL; } if (m->geomflags & MESH_U) { if ((m->u = GeomNewN(TxST, n)) == NULL) { GeomError(0,"Can't allocate space for mesh texture"); return(NULL); } memcpy(m->u, om->u, n * sizeof(TxST)); } else m->u = NULL; return m; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/mesh/meshdice.c0000644000175000001440000000343510455701003015620 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" Mesh * MeshDice(m, proc) Mesh *m; int (*proc) (); { int u, v; int nu, nv; float umin, umax, vmin, vmax; float fu, fv; Point3 *n; HPoint3 *p; if (m && proc) { umin = m->umin; umax = m->umax; vmin = m->vmin; vmax = m->vmax; nu = m->nu; nv = m->nv; p = m->p; n = m->n; for (v = 0; v < nv; v++) { for (u = 0; u < nu; u++) { fu = umin + ((umax - umin) * u) / (nu - 1); fv = vmin + ((vmax - vmin) * v) / (nv - 1); (*proc) (fu, fv, p, n); if (n) n++; p++; } } } return m; } geomview-1.9.4/src/lib/gprim/mesh/meshdraw.c0000644000175000001440000001476410622374333015670 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "meshP.h" #include "mgP.h" #include "hpointn.h" #include "cmodel.h" #include "bsptreeP.h" static int draw_projected_mesh(mgNDctx *NDctx, Mesh *mesh) { Mesh m = *mesh; HPointN *h; HPoint3 *op, *np; int i, colored = 0, alpha = 0; int npts = m.nu * m.nv; mgNDmapfunc mapHPtN = NDctx->mapHPtN; const Appearance *ap = &_mgc->astk->ap; const Material *mat = &_mgc->astk->mat; int normal_need; m.p = OOGLNewNE(HPoint3, npts, "projected points"); m.n = NULL; m.nq = NULL; m.c = OOGLNewNE(ColorA, npts, "ND colors"); m.ap = NULL; RefInit((Ref *)(void *)&m, mesh->magic); DblListInit(&m.pernode); h = HPtNCreate(5, NULL); if (ap->flag & APF_KEEPCOLOR) { colored = 0; } else { HPoint3 dummyv; ColorA dummyc; /* Dummy transform to determine whether we have ND colors or not */ colored = mapHPtN(NDctx, h, &dummyv, &dummyc); } m.geomflags &= ~VERT_4D; for(i = 0, op = mesh->p, np = m.p; i < npts; i++, op++, np++) { if (mesh->geomflags & VERT_4D) { /* Set the point's first four components from our 4-D mesh vertex */ Pt4ToHPtN(op, h); } else { /* Set the point's first THREE components from our 4-D mesh vertex */ HPt3ToHPtN(op, NULL, h); } if (colored) { mapHPtN(NDctx, h, np, &m.c[i]); if (m.c[i].a < 1.0) { alpha = 1; } } else { mapHPtN(NDctx, h, np, NULL); } } if (colored) { if (alpha) { m.geomflags |= COLOR_ALPHA; } else { m.geomflags &= ~COLOR_ALPHA; } m.geomflags |= MESH_C; } /* The drawing routines might need either polygon or vertex normals, * so if either is missing and either might be needed, we force it * to be computed. */ m.geomflags &= ~(MESH_N|MESH_NQ); normal_need = (ap->flag & APF_NORMALDRAW) ? MESH_N|MESH_NQ : 0; if (ap->flag & APF_FACEDRAW) { switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: normal_need |= MESH_NQ; break; case APF_SMOOTH: normal_need |= MESH_N; break; default: break; } if (GeomHasAlpha((Geom *)(void *)&m, ap)) { /* could re-use per quad normals here */ } } if (normal_need) { MeshComputeNormals(&m, normal_need); } if ((_mgc->astk->flags & MGASTK_SHADER) && !(m.geomflags & GEOM_ALPHA)) { ColorA *c = colored ? m.c : (mat->override & MTF_DIFFUSE) ? NULL : mesh->c; Point3 *n; switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: n = m.nq; break; case APF_SMOOTH: n = m.n; break; default: n = NULL; break; } if (c) { (*_mgc->astk->shader)(npts, m.p, n, c, m.c); } else { for(i = 0; i < npts; i++) { (*_mgc->astk->shader)(1, m.p + i, n + i, (ColorA *)&_mgc->astk->mat.diffuse, m.c + i); } } colored = true; } mgmeshst(MESH_MGWRAP(m.geomflags), m.nu, m.nv, m.p, m.n, m.nq, colored ? m.c : mesh->c, mesh->u, m.geomflags); /* Generate a BSP-tree if the object or parts of it might be * translucent. */ if (NDctx->bsptree && (m.geomflags & GEOM_ALPHA)) { GeomNodeDataMove((Geom *)mesh, (Geom *)(void *)&m); GeomBSPTree((Geom *)(void *)&m, NDctx->bsptree, BSPTREE_ADDGEOM); GeomNodeDataMove((Geom *)(void *)&m, (Geom *)mesh); } if (m.n) { OOGLFree(m.n); } if (m.nq) { OOGLFree(m.nq); } HPtNDelete(h); OOGLFree(m.p); OOGLFree(m.c); return 0; } Mesh * MeshDraw(Mesh *mesh) { mgNDctx *NDctx = NULL; const Appearance *ap = &_mgc->astk->ap; mgctxget(MG_NDCTX, &NDctx); if(NDctx) { draw_projected_mesh(NDctx, mesh); return mesh; } if ((mesh->geomflags & (MESH_N|MESH_NQ)) != (MESH_N|MESH_NQ)) { int need = 0; if (ap->flag & APF_NORMALDRAW) { need = MESH_N|MESH_NQ; } else if (ap->flag & APF_FACEDRAW) { switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: need |= MESH_NQ; break; case APF_SMOOTH: need |= MESH_N; break; default: break; } } if (need) { MeshComputeNormals(mesh, need); } } if (_mgc->space & TM_CONFORMAL_BALL) { cmodel_clear(_mgc->space); if (!(mesh->geomflags & MESH_N)) { MeshComputeNormals(mesh, MESH_N); } cm_draw_mesh(mesh); return mesh; } else if((_mgc->astk->flags & MGASTK_SHADER) && !(mesh->geomflags & GEOM_ALPHA)) { int i, npts = mesh->nu * mesh->nv; ColorA *c = (ColorA *)alloca(npts * sizeof(ColorA)); Point3 *n; switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: n = mesh->nq; break; case APF_SMOOTH: n = mesh->n; break; default: n = NULL; break; } if(mesh->c && !(_mgc->astk->mat.override & MTF_DIFFUSE)) { (*_mgc->astk->shader)(npts, mesh->p, n, mesh->c, c); } else { for(i = 0; i < npts; i++) { (*_mgc->astk->shader)(1, mesh->p + i, n + i, (ColorA *)&_mgc->astk->mat.diffuse, c + i); } } mgmeshst(MESH_MGWRAP(mesh->geomflags), mesh->nu, mesh->nv, mesh->p, mesh->n, mesh->nq, c, mesh->u, mesh->geomflags | MESH_C); } else { mgmeshst(MESH_MGWRAP(mesh->geomflags), mesh->nu, mesh->nv, mesh->p, mesh->n, mesh->nq, mesh->c, mesh->u, mesh->geomflags); } return mesh; } Mesh *MeshBSPTree(Mesh *mesh, BSPTree *tree, int action) { if (!never_translucent((Geom *)mesh) && action == BSPTREE_ADDGEOM) { BSPTreeAddObject(tree, (Geom *)mesh); } return mesh; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/mesh/meshflag.h0000644000175000001440000000263610560447707015653 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MESHFLAGDEFS #define MESHFLAGDEFS #include "mg.h" #include "geomclass.h" #define MESH_C VERT_C #define MESH_N VERT_N #define MESH_4D VERT_4D #define MESH_U VERT_ST #define MESH_UWRAP GEOMFLAG(0x001) #define MESH_VWRAP GEOMFLAG(0x002) #define MESH_NQ GEOMFLAG(0x020) #define MESH_EVERT GEOMFLAG(0x040) #define MESH_BINARY GEOMFLAG(0x080) #define MESH_Z GEOMFLAG(0x100) #define MESH_MGWRAP(mfl) ((mfl) >> GEOMFL_SHIFT) #endif /*MESHFLAGDEFS*/ geomview-1.9.4/src/lib/gprim/mesh/mesh.h0000644000175000001440000000366110563062347015014 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MESHDEF #define MESHDEF #include "bbox.h" #include "meshflag.h" #include "bsptree.h" #ifndef NULL #define NULL 0 #endif #ifndef FALSE #define FALSE 0 #endif #define MESHMAGIC GeomMagic ('m', 1) typedef struct Mesh Mesh; extern GeomClass *MeshMethods( void ); extern char *MeshName( void ); extern Mesh *MeshFLoad( IOBFILE *, char * ); extern Mesh *MeshLoad( char * ); extern Mesh *MeshSave( Mesh *, char * ); extern Mesh *MeshFSave( Mesh *, FILE * ); extern BBox *MeshBound( Mesh *, Transform T, TransformN *TN); extern Geom *MeshBoundSphere( Mesh *, Transform T, TransformN *TN, int *axes, int ); extern Mesh *MeshDice( Mesh *, int (*proc)() ); extern Mesh *MeshEvert( Mesh * ); extern Mesh *MeshDraw( Mesh * ); extern Mesh *MeshBSPTree(Mesh *mesh, BSPTree *bsptree, int action); extern Mesh *MeshPick( Mesh *, Pick *, Appearance *, Transform, TransformN *, int *axes ); extern Mesh *MeshTransform( Mesh *, Transform, TransformN * ); #endif /*MESHDEF*/ geomview-1.9.4/src/lib/gprim/mesh/meshnormal.c0000644000175000001440000001743410611511772016216 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Claus-Justus Heine */ #include "meshP.h" static void mnorm(HPoint3 *ap, Point3 *an, int nu, int nv, bool uwrap, bool vwrap, bool evert); static void mnormq(HPoint3 *ap, Point3 *an, int nu, int nv, bool uwrap, bool vwrap, bool evert); Mesh * MeshComputeNormals(Mesh *m, int need) { HPoint3 *normp = NULL, *normptr, *pptr; int i; need &= ~m->geomflags; if (!(need & (MESH_N|MESH_NQ))) { return m; } /* if this a '4D' mesh, we need to truncate (temporarily) * before computing the normals */ if (m->geomflags & VERT_4D) { normp = GeomNewN(HPoint3, m->nu * m->nv); for (normptr = normp, pptr = m->p, i=0; i < m->nu * m->nv; ++i, ++pptr, ++normptr) { #if 0 HPt3Dehomogenize(pptr, normptr); #else Pt3ToHPt3((Point3 *)pptr, normptr, 1); #endif } } if (need & MESH_N) { if (m->n) { GeomFree(m->n); } m->n = GeomNewN(Point3, m->nu * m->nv); m->geomflags |= MESH_N; mnorm(m->geomflags & VERT_4D ? normp : m->p, m->n, m->nu, m->nv, m->geomflags & MESH_UWRAP, m->geomflags & MESH_VWRAP, m->geomflags & MESH_EVERT); } if (need & MESH_NQ) { if (m->nq) { GeomFree(m->nq); } m->nq = GeomNewN(Point3, m->nu * m->nv); m->geomflags |= MESH_NQ; mnormq(m->geomflags & VERT_4D ? normp : m->p, m->nq, m->nu, m->nv, m->geomflags & MESH_UWRAP, m->geomflags & MESH_VWRAP, m->geomflags & MESH_EVERT); } if (m->geomflags & VERT_4D) GeomFree(normp); return m; } static void QuadNormal(HPoint3 *v[4], Point3 *nu_av) { int n; HPoint3 *v1, *v2, *v3, **vp; Point3 nu; nu_av->x = nu_av->y = nu_av->z = 0.0; n = 4; v1 = v[n-2]; v2 = v[n-1]; vp = v; #define ANTI(P,Q) \ ((v2->P - v1->P) * (v3->Q - v1->Q) - \ (v2->Q - v1->Q) * (v3->P - v1->P)) do { v3 = *vp++; nu.x = ANTI(y,z); nu.y = ANTI(z,x); nu.z = ANTI(x,y); if (Pt3Dot(&nu, nu_av) >= 0) { Pt3Add(nu_av, &nu, nu_av); } else { Pt3Sub(nu_av, &nu, nu_av); } v1 = v2; v2 = v3; } while(--n > 0); Pt3Unit(nu_av); } static void mnormq(HPoint3 *ap, Point3 *an, int nu, int nv, bool uwrap, bool vwrap, bool evert) { int v0 = 1, prev0v = 0; int u0 = 1, prev0u = 0; int u, v, prevu, prevv; HPoint3 *vq[4]; if (vwrap) { v0 = 0, prev0v = nv-1; } if (uwrap) { u0 = 0, prev0u = nu-1; } #define MESHIDX(u, v) ((v)*nu + (u)) for (prevv = prev0v, v = v0; v < nv; prevv = v, v++) { for (prevu = prev0u, u = u0; u < nu; prevu = u, u++) { /* quad normals are ordered according to the least-numbered * vertex, i.e. the normal of the quad * * (v,u) (v,u+1) * (v+1,u) (v+1,u+1) * * is to be found at position MESHIDX(v, u) */ vq[0] = ap + MESHIDX(prevu, prevv); vq[1] = ap + MESHIDX(u, prevv); vq[2] = ap + MESHIDX(u, v); vq[3] = ap + MESHIDX(prevu, v); QuadNormal(vq, an + MESHIDX(u, prevv /*prevu, prevv*/)); } /* Also initialize the normal at position 0 (if !u_wrap) */ if (!uwrap) { an[MESHIDX(0, prevv)] = an[MESHIDX(1, prevv)]; } } if (!vwrap) { for (u = 0; u < nu; u++) { an[MESHIDX(u, nv-1)] = an[MESHIDX(u, nv-2)]; } } #undef MESHIDX } static void mnorm(HPoint3 *ap, Point3 *an, int nu, int nv, bool uwrap, bool vwrap, bool evert) { HPoint3 *prev, *next; Point3 *n; int k; int u, v; Pt3Coord x,y,z, norm; Pt3Coord unit; /* * We set the normal at each point to be the mean of the * cross products at the four adjacent points. I.e.: * n Given mesh point p and its four orthogonal neighbors * w p e e, n, w, s we define displacements E=e-p, N=n-p, ... * s and compute normal(p) = ExN + NxW + WxS + SxE * This turns out to be equal to (e-w) x (n-s) -- independent of p! * * Since the index arithmetic gets a bit messy at the boundaries * we make two passes. Pass 1 computes e-w and holds it in * the array to be filled with normals. * Pass 2 computes n-s, takes the cross product and normalizes. */ unit = evert ? -1.0 : 1.0; for (u = 0; u < nu; u++) { if (u == 0) { prev = &ap[uwrap ? nu-1 : 0]; next = &ap[u+1]; } else if (u == nu-1) { prev = &ap[u-1]; next = &ap[uwrap ? 0 : u]; } else { prev = &ap[u-1]; next = &ap[u+1]; } n = &an[u]; k = nv; do { n->x = next->x - prev->x; /* e - w */ n->y = next->y - prev->y; n->z = next->z - prev->z; n += nu; /* advance to next v row */ prev += nu; next += nu; } while(--k > 0); } for (v = 0; v < nv; v++) { if (v == 0) { prev = &ap[vwrap ? nu*(nv-1) : 0]; next = &ap[nu*1]; } else if (v == nv-1) { prev = &ap[nu*(v-1)]; next = &ap[vwrap ? 0 : nu*v]; } else { prev = &ap[nu*(v-1)]; next = &ap[nu*(v+1)]; } n = &an[nu*v]; k = nu; do { Point3 t; t.x = next->x - prev->x; t.y = next->y - prev->y; t.z = next->z - prev->z; x = n->y * t.z - n->z * t.y; y = n->z * t.x - n->x * t.z; z = n->x * t.y - n->y * t.x; norm = x*x + y*y + z*z; if (norm == 0.0) { /* * Oh no, degenerate norm. * Let's hope it happened because (part of) a row of * mesh points coincided -- maybe even though N=S, * NE != SE or NW != SW. */ if (t.x == 0.0 && t.y == 0.0 && t.z == 0.0) { if (k > 1) { t.x = (next+1)->x - (prev+1)->x; t.y = (next+1)->y - (prev+1)->y; t.z = (next+1)->z - (prev+1)->z; } if (t.x == 0.0 && t.y == 0.0 && t.z == 0.0 && k < nu) { t.x = (next-1)->x - (prev-1)->x; t.y = (next-1)->y - (prev-1)->y; t.z = (next-1)->z - (prev-1)->z; } } if (n->x == 0.0 && n->y == 0.0 && n->z == 0.0) { /* Do likewise in E-W direction. */ HPoint3 *cur = &ap[nu*(v+1) - k]; if (k == 1) cur--; else if (k == nu) cur++; if (v > 0) { cur -= nu; /* SE-SW */ n->x = (cur+1)->x - (cur-1)->x; n->y = (cur+1)->y - (cur-1)->y; n->z = (cur+1)->z - (cur-1)->z; } if (n->x==0.0 && n->y==0.0 && n->z==0.0 && v < nv-1) { cur += 2*nu; /* NE-NW */ n->x = (cur+1)->x - (cur-1)->x; n->y = (cur+1)->y - (cur-1)->y; n->z = (cur+1)->z - (cur-1)->z; } } x = n->y * t.z - n->z * t.y; y = n->z * t.x - n->x * t.z; z = n->x * t.y - n->y * t.x; norm = x*x + y*y + z*z; if (norm == 0.0) { /* Oh well. */ n->x = unit; norm = 1.0; } } norm = unit / sqrt(norm); n->x = x*norm; n->y = y*norm; n->z = z*norm; n++; /* Next u column */ prev++; next++; } while(--k > 0); } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/mesh/meshload.c0000644000175000001440000001130210644020461015625 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "meshP.h" /* actually u, the texture parameter */ static bool getmeshvert(IOBFILE *file, int flag, int u, int v, HPoint3 *p, Point3 *n, ColorA *c, TxST *st) { int binary = flag&MESH_BINARY; if (flag & MESH_Z) { p->x = (float) u; p->y = (float) v; p->w = 1.0; if (iobfgetnf(file, 1, &p->z, binary) <= 0) { return false; } } else if (flag & MESH_4D) { if (iobfgetnf(file, 4, (float *)p, binary) < 4) { return false; } } else { if (iobfgetnf(file, 3, (float *)p, binary) < 3) { return false; } p->w = 1.0; } if ((flag & MESH_N) && iobfgetnf(file, 3, (float *)n, binary) < 3) { return false; } if ((flag & MESH_C) && iobfgetnf(file, 4, (float *)c, binary) < 4) { return false; } if (flag & MESH_U) { if (iobfgetnf(file, 2, (float *)st, binary) < 2) { return false; } else { /* consume unused "r" component for compatibility */ float dummy; int c; if ((c = iobfnextc(file, 1)) != '\n' && c != '}' && c != EOF) { if (iobfgetnf(file, 1, &dummy, 0) < 1) { return false; } } } } return true; } /* static char oldbinary; *//* Old binary format -- has 3-component colors */ static int getheader(IOBFILE *file) { int i, flag; char *token; static char keys[] = "UCNZ4Uuv"; static int bit[] = { MESH_U, MESH_C, MESH_N, MESH_Z, MESH_4D, MESH_U, MESH_UWRAP, MESH_VWRAP }; /* Parse [ST][C][N][Z][4][U][u][v]MESH[ BINARY]\n */ flag = 0; token = GeomToken(file); for (i = 0; keys[i] != '\0'; i++) { if (*token == keys[i]) { flag |= bit[i]; token++; } } if (strcmp(token, "MESH") != 0) { return(-1); } if (iobfnextc(file, 1) == 'B') { if (iobfexpectstr(file, "BINARY")) { return(-1); } flag |= MESH_BINARY; if (iobfnextc(file, 1) == '\n') { (void) iobfgetc(file); /* Toss \n */ } } return(flag); } Mesh * MeshFLoad(IOBFILE *file, char *fname) { Mesh m; int n; int i, u, v; int binary; if (!file) return NULL; if ((m.geomflags = getheader(file)) == -1) return NULL; binary = m.geomflags & MESH_BINARY; if (iobfgetni(file, 1, &m.nu, binary) <= 0 || iobfgetni(file, 1, &m.nv, binary) <= 0) { OOGLSyntax(file,"Reading MESH from \"%s\": expected mesh grid size", fname); return NULL; } if (m.nu <= 0 || m.nv <= 0 || m.nu > 9999999 || m.nv > 9999999) { OOGLSyntax(file,"Reading MESH from \"%s\": invalid mesh size %d %d", fname,m.nu,m.nv); return NULL; } n = m.nu * m.nv; m.p = OOGLNewNE(HPoint3, n, "MeshFLoad: vertices"); m.n = NULL; m.u = NULL; m.c = NULL; if (m.geomflags & MESH_N) { m.n = OOGLNewNE(Point3, n, "MeshFLoad: normals"); } if (m.geomflags & MESH_C) { m.c = OOGLNewNE(ColorA, n, "MeshFLoad: colors"); } if (m.geomflags & MESH_U) { m.u = OOGLNewNE(TxST, n, "MeshFLoad: texture coords"); } for (i = 0, v = 0; v < m.nv; v++) { for (u = 0; u < m.nu; u++, i++) { if (getmeshvert(file, m.geomflags, u, v, &m.p[i], &m.n[i], &m.c[i], &m.u[i]) == 0) { OOGLSyntax(file, "Reading MESH from \"%s\": bad element (%d,%d) of (%d,%d)", fname, u,v, m.nu, m.nv); return NULL; } } } return (Mesh *)GeomCCreate (NULL, MeshMethods(), CR_NOCOPY, CR_4D, (m.geomflags & MESH_4D), CR_FLAG, m.geomflags, CR_NU, m.nu, CR_NV, m.nv, CR_POINT4, m.p, CR_COLOR, m.c, CR_NORMAL, m.n, CR_U, m.u, NULL); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/mesh/meshpick.c0000644000175000001440000001176410622716755015666 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include "meshP.h" #include "pickP.h" #include "appearance.h" Mesh * MeshPick(Mesh *mesh, Pick *pick, Appearance *ap, Transform T, TransformN *TN, int *axes) { Point3 plist[4]; int nu, nv, maxnu, maxnv; int foundu, foundv, v4d; unsigned int apflag = 0; HPt3Coord xa, xb, xc, xd; foundu = foundv = -1; v4d = (mesh->geomflags & VERT_4D) != 0; maxnu = mesh->nu; maxnv = mesh->nv; /* Make sure that vects do not as visible - otherwise they * will wreak havoc with the edge picking stuff. */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_VECTDRAW; } for (nv = 0; nv < ((mesh->geomflags & MESH_VWRAP) ? maxnv : maxnv-1); nv++) { for (nu =0; nu < ((mesh->geomflags & MESH_UWRAP) ? maxnu : maxnu-1); nu++) { /* Demand that at least 1 of the vertices be in front of the viewer. * Note: we must ensure that all four are evaluated! */ if (TN) { xa = HPt3NTransPt3(TN, axes, &MESHPOINT(nu, nv, mesh, mesh->p), v4d, &plist[0]); xb = HPt3NTransPt3(TN, axes, &MESHPOINT(nu+1, nv, mesh, mesh->p), v4d, &plist[1]); xc = HPt3NTransPt3(TN, axes, &MESHPOINT(nu+1, nv+1, mesh, mesh->p), v4d, &plist[2]); xd = HPt3NTransPt3(TN, axes, &MESHPOINT(nu, nv+1, mesh, mesh->p), v4d, &plist[3]); } else { xa = HPt3TransPt3(T, &MESHPOINT(nu, nv, mesh, mesh->p), &plist[0]); xb = HPt3TransPt3(T, &MESHPOINT(nu+1, nv, mesh, mesh->p), &plist[1]); xc = HPt3TransPt3(T, &MESHPOINT(nu+1, nv+1, mesh, mesh->p), &plist[2]); xd = HPt3TransPt3(T, &MESHPOINT(nu, nv+1, mesh, mesh->p), &plist[3]); } if((0 < xa) || (0 < xb) || (0 < xc) || (0 < xd)) { if (PickFace(4, plist, pick, ap)) { foundu = nu; foundv = nv; } } } } if (ap != NULL) ap->flag = apflag; if (foundu == -1) return NULL; if (pick->found & PW_VERT) { pick->vi = MESHINDEX(foundu + ((pick->vi == 1 || pick->vi == 2) ? 1 : 0), foundv + pick->vi/2, mesh); if (TN) HPt3NTransHPt3(TN, axes, &mesh->p[pick->vi], v4d, &pick->v); else HPt3Transform(T, &mesh->p[pick->vi], &pick->v); } if (pick->found & PW_EDGE) { pick->ei[0] = MESHINDEX(foundu + ((pick->ei[0] == 1 || pick->ei[0] == 2) ? 1 : 0), foundv + pick->ei[0]/2, mesh); pick->ei[1] = MESHINDEX(foundu + ((pick->ei[1] == 1 || pick->ei[1] == 2) ? 1 : 0), foundv + pick->ei[1]/2, mesh); if (TN) { HPt3NTransHPt3(TN, axes, &mesh->p[pick->ei[0]], v4d, &pick->e[0]); HPt3NTransHPt3(TN, axes, &mesh->p[pick->ei[1]], v4d, &pick->e[1]); } else { HPt3Transform(T, &mesh->p[pick->ei[0]], &pick->e[0]); HPt3Transform(T, &mesh->p[pick->ei[1]], &pick->e[1]); } } if (pick->found & PW_FACE) { if(pick->f) OOGLFree(pick->f); pick->f = OOGLNewNE(HPoint3, 4, "Mesh pick"); pick->fi = MESHINDEX(foundu, foundv, mesh); if (TN) { HPt3NTransHPt3(TN, axes, &MESHPOINT(foundu, foundv, mesh, mesh->p), v4d, &pick->f[0]); HPt3NTransHPt3(TN, axes, &MESHPOINT(foundu+1, foundv, mesh, mesh->p), v4d, &pick->f[1]); HPt3NTransHPt3(TN, axes, &MESHPOINT(foundu+1, foundv+1, mesh, mesh->p), v4d, &pick->f[2]); HPt3NTransHPt3(TN, axes, &MESHPOINT(foundu, foundv+1, mesh, mesh->p), v4d, &pick->f[3]); } else { HPt3Transform(T, &MESHPOINT(foundu, foundv, mesh, mesh->p), &pick->f[0]); HPt3Transform(T, &MESHPOINT(foundu+1, foundv, mesh, mesh->p), &pick->f[1]); HPt3Transform(T, &MESHPOINT(foundu+1, foundv+1, mesh, mesh->p), &pick->f[2]); HPt3Transform(T, &MESHPOINT(foundu, foundv+1, mesh, mesh->p), &pick->f[3]); } } if (TN) { pick->TprimN = TmNCopy(TN, pick->TprimN); memcpy(pick->axes, axes, sizeof(pick->axes)); } else TmCopy(T, pick->Tprim); return mesh; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/mesh/meshsphere.c0000644000175000001440000000355410560443021016204 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "meshP.h" #include "sphere.h" Geom *MeshBoundSphere(Mesh *mesh, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere; if (TN) { /* Create a dummy sphere, the center will be corrected later */ sphere = GeomCreate("sphere", CR_SPACE, space, CR_END); SphereEncompassPoints((Sphere *)sphere, (float *)mesh->p, (mesh->geomflags & MESH_4D) != 0, 4, mesh->nu * mesh->nv, NULL, TN, axes); } else { if(mesh->geomflags & MESH_4D) return GeomBoundSphereFromBBox((Geom *)mesh, T, TN, axes, space); sphere = GeomCreate("sphere", CR_ENCOMPASS_POINTS, mesh->p, CR_NENCOMPASS_POINTS, (mesh->nu * mesh->nv), CR_AXIS, T, CR_SPACE, space, CR_END); } return sphere; } geomview-1.9.4/src/lib/gprim/mesh/meshsave.c0000644000175000001440000000641010622716755015666 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" Mesh *MeshFSave(Mesh *m, FILE *outf) { int i, j; HPoint3 *p = m->p; Point3 *n = m->n; ColorA *c = m->c; TxST *u = m->u; if (!outf || !m) return NULL; if (m->n == NULL) m->geomflags &= ~MESH_N; if (m->c == NULL) m->geomflags &= ~MESH_C; if (m->u == NULL) m->geomflags &= ~MESH_U; if (m->geomflags & MESH_C) fputc('C', outf); if (m->geomflags & MESH_N) fputc('N', outf); if (m->geomflags & MESH_Z) fputc('Z', outf); if (m->geomflags & VERT_4D) fputc('4', outf); if (m->geomflags & MESH_U) fputc('U', outf); if (m->geomflags & MESH_UWRAP) fputc('u', outf); if (m->geomflags & MESH_VWRAP) fputc('v', outf); if (m->geomflags & MESH_BINARY) /* Hack -- should be sent by context */ { fprintf(outf, "MESH BINARY\n"); fwrite(&m->nu, 4, 1, outf); fwrite(&m->nv, 4, 1, outf); for (i = 0; i < m->nv; i++) { for (j = 0; j < m->nu; j++) { if (m->geomflags & MESH_Z) fwrite(&p->z, 4, 1, outf); else if (m->geomflags & MESH_4D) fwrite(p, 4, 4, outf); else fwrite(p, 4, 3, outf); p++; if (m->geomflags & MESH_N) { fwrite(n, 4, 3, outf); n++; } if (m->geomflags & MESH_C) { fwrite(c, 4, 4, outf); c++; } if (m->geomflags & MESH_U) { fwrite(u, 4, 3, outf); u++; } } } } else { fprintf(outf, "MESH\n%d %d\n", m->nu, m->nv); for (i = 0; i < m->nv; i++) { for (j = 0; j < m->nu; j++) { if(!(m->geomflags & MESH_Z)) fprintf(outf, "%.8g %.8g ", p->x, p->y); fprintf(outf, "%.8g ", p->z); if (m->geomflags & VERT_4D) fprintf(outf, "%.8g ", p->w); p++; if (m->geomflags & MESH_N) { fprintf(outf, " %.8g %.8g %.8g ", n->x, n->y, n->z); n++; } if (m->geomflags & MESH_C) { fprintf(outf, " %.3g %.3g %.3g %.3g ", c->r, c->g, c->b, c->a); c++; } if (m->geomflags & MESH_U) { fprintf(outf, " %.8g %.8g 0", u->s, u->t); u++; } fputc('\n', outf); } fputc('\n', outf); } } return m; } Mesh *MeshSave(Mesh *m, char *name) { Mesh *tm; FILE *outf; outf = fopen(name, "w"); if (!outf) { perror(name); return NULL; } tm = MeshFSave(m, outf); fclose(outf); return tm; } geomview-1.9.4/src/lib/gprim/mesh/meshtransform.c0000644000175000001440000000322110574525006016731 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "hpoint3.h" #include "point3.h" #include "meshP.h" Mesh *MeshTransform(Mesh *m, Transform T, TransformN *TN) { if (!T) { return m; } m->geomflags &= ~MESH_Z; if (HPt3TransformN(T, m->p, m->p, m->nu * m->nv)) { m->geomflags |= VERT_4D; } if (m->geomflags & MESH_N) { Transform Tit; TmDual(T, Tit); NormalTransformN(Tit, m->n, m->n, m->nu * m->nv); } return m; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/mesh/meshbound.c0000644000175000001440000000743510574313737016046 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" #include "meshP.h" BBox *MeshBound(Mesh *mesh, Transform T, TransformN *TN) { int n; HPoint3 *p; HPoint3 min, max; HPoint3 clean, tmp; n = mesh->nu * mesh->nv; p = mesh->p; min = *p; while(--n >= 0 && !finite(p->x + p->y + p->z + p->w)) p++; if(n <= 0) return NULL; /* No finite elements! */ /* First handle the case without transformations, this means that we return a 3d bbox for 3d meshs, and a 4d bboy for 4d meshs. */ if ((T == TM_IDENTITY || !T) && !TN) { if (!T && (mesh->geomflags & VERT_4D)) { max = min; while(--n >= 0) { Pt4MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_4D, 1, CR_END); } else { HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { HPt3MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *ptN; HPointN *minN; HPointN *maxN; BBox *result; ptN = HPtNCreate(5, NULL); if (mesh->geomflags & VERT_4D) { Pt4ToHPtN(&min, ptN); } else { HPt3ToHPtN(&min, NULL, ptN); } minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); while(--n >= 0) { if (mesh->geomflags & VERT_4D) { Pt4ToHPtN(++p, ptN); } else { HPt3ToHPtN(++p, NULL, ptN); } HPtNTransform(TN, ptN, ptN); HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ if (false && (mesh->geomflags & VERT_4D)) { /* We operate on the 3d x,y,z space */ min.w = 1.0; HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = *(++p); tmp.w = 1.0; HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } else { /* ordinary 3d object */ HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = *(++p); HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/mesh/meshclass.c0000644000175000001440000000462310557510305016027 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "meshP.h" static GeomClass *aMeshMethods = NULL; int MeshPresent = 1; static char meshName[] = "mesh"; extern Mesh *MeshCreate( va_list ); extern Mesh *MeshDelete( Mesh * ); extern Mesh *MeshCopy( Mesh * ); char * MeshName() { return meshName; } GeomClass *MeshMethods(void) { if (!aMeshMethods) { aMeshMethods = GeomClassCreate(meshName); aMeshMethods->name = MeshName; aMeshMethods->methods = (GeomMethodsFunc *) MeshMethods; aMeshMethods->create = (GeomCreateFunc *) MeshCreate; aMeshMethods->Delete = (GeomDeleteFunc *) MeshDelete; aMeshMethods->copy = (GeomCopyFunc *) MeshCopy; aMeshMethods->fload = (GeomFLoadFunc *) MeshFLoad; aMeshMethods->fsave = (GeomFSaveFunc *) MeshFSave; aMeshMethods->bound = (GeomBoundFunc *) MeshBound; aMeshMethods->boundsphere = (GeomBoundSphereFunc *) MeshBoundSphere; aMeshMethods->evert = (GeomEvertFunc *) MeshEvert; aMeshMethods->draw = (GeomDrawFunc *) MeshDraw; aMeshMethods->bsptree = (GeomBSPTreeFunc *) MeshBSPTree; aMeshMethods->pick = (GeomPickFunc *) MeshPick; aMeshMethods->transform = (GeomTransformFunc *) MeshTransform; aMeshMethods->transformto = (GeomTransformToFunc *) MeshTransform; } return aMeshMethods; } geomview-1.9.4/src/lib/gprim/mesh/Headers0000644000175000001440000000003207730237333015173 00000000000000mesh.h meshP.h meshflag.h geomview-1.9.4/src/lib/gprim/quad/0000777000175000001440000000000010665240674013767 500000000000000geomview-1.9.4/src/lib/gprim/quad/quadclass.c0000644000175000001440000000465710557511040016027 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" static GeomClass *aQuadMethods = NULL; /* these are known only to the library, not the user */ extern Quad *QuadCopy( Quad * ); extern Quad *QuadDelete( Quad * ); extern Geom *QuadCreate ( va_list); int QuadPresent = 1; static char quadName[] = "quad"; char * QuadName() { return quadName; } GeomClass * QuadMethods() { if( !aQuadMethods ) { aQuadMethods = GeomClassCreate(quadName); aQuadMethods->name = QuadName; aQuadMethods->methods = (GeomMethodsFunc *)QuadMethods; aQuadMethods->copy = (GeomCopyFunc *)QuadCopy; aQuadMethods->create = (GeomCreateFunc *)QuadCreate; aQuadMethods->fload = (GeomFLoadFunc *)QuadFLoad; aQuadMethods->fsave = (GeomFSaveFunc *)QuadFSave; aQuadMethods->Delete = (GeomDeleteFunc *)QuadDelete; aQuadMethods->bound = (GeomBoundFunc *)QuadBound; aQuadMethods->boundsphere = (GeomBoundSphereFunc *)QuadSphere; aQuadMethods->evert = (GeomEvertFunc *)QuadEvert; aQuadMethods->draw = (GeomDrawFunc *)QuadDraw; aQuadMethods->bsptree = (GeomBSPTreeFunc *)QuadBSPTree; aQuadMethods->pick = (GeomPickFunc *) QuadPick; aQuadMethods->transform = (GeomTransformFunc *) QuadTransform; aQuadMethods->transformto = (GeomTransformToFunc *) QuadTransformTo; } return aQuadMethods; } geomview-1.9.4/src/lib/gprim/quad/quadcreate.c0000644000175000001440000001047210560445772016171 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" Quad * QuadCreate (Quad *exist, GeomClass *classp, va_list *a_list) { Quad *q; QuadP *p = (QuadP *)NULL; Point3 *p3; QuadN *n = (QuadN *)NULL; QuadC *c = (QuadC *)NULL; int attr, i; int copy = 1; if (exist == NULL) { q = OOGLNewE(Quad, "QuadCreate: new Quad"); GGeomInit (q, classp, QUADMAGIC, NULL); q->geomflags = q->maxquad = 0; q->p = (QuadP *)NULL; q->n = (QuadN *)NULL; q->c = (QuadC *)NULL; } else { /* Check that exist is a Quad. */ q = exist; } q->pdim = 4; while ((attr = va_arg(*a_list, int))) /* parse argument list */ switch (attr) { case CR_FLAG: q->geomflags = va_arg(*a_list, int); break; case CR_NELEM: q->maxquad = va_arg(*a_list, int); break; case CR_POINT4: p = va_arg(*a_list, QuadP *); if (exist) OOGLFree(q->p); if (p == NULL) { q->p = NULL; q->maxquad = 0; } else if (copy) { q->p = OOGLNewNE(QuadP,q->maxquad,"QuadCreate vertices"); memcpy(q->p, p, q->maxquad * sizeof(QuadP)); } else { q->p = p; /* caller relinquishes ownership of data */ } break; case CR_POINT: p3 = va_arg(*a_list, Point3 *); if (exist) OOGLFree(q->p); if (p3 == NULL) { q->p = NULL; q->maxquad = 0; } else if (copy) { q->p = OOGLNewNE(QuadP,q->maxquad,"QuadCreate vertices"); Pt3ToHPt3(p3, &q->p[0][0], q->maxquad * 4); } else { Pt3ToHPt3(p3, &q->p[0][0], q->maxquad * 4); } break; case CR_NORMAL: q->geomflags &= ~QUAD_N; if (exist && q->n) OOGLFree(q->n); n = va_arg(*a_list, QuadN *); if (n == NULL) { q->n = NULL; } else if (copy) { q->n = OOGLNewNE(QuadN,q->maxquad,"QuadCreate normals"); memcpy(q->n, n, q->maxquad*sizeof(QuadN)); q->geomflags |= QUAD_N; } else { q->n = n; q->geomflags |= QUAD_N; } break; case CR_COLOR: q->geomflags &= ~COLOR_ALPHA; q->geomflags &= ~QUAD_C; if (exist && q->c) OOGLFree(q->c); c = va_arg(*a_list, QuadC *); if (c == NULL) { q->c = NULL; } else { q->geomflags |= QUAD_C; if (copy) { q->c = OOGLNewNE(QuadC, q->maxquad, "QuadCreate: colors"); memcpy(q->c, c, q->maxquad*sizeof(QuadC)); } else { q->c = c; q->geomflags |= QUAD_C; } for (i = 0; i < q->maxquad; i++) { if (q->c[i][0].a < 1.0 || q->c[i][1].a < 1.0 || q->c[i][2].a < 1.0 || q->c[i][3].a < 1.0) { q->geomflags |= COLOR_ALPHA; } } } break; default: if (GeomDecorate(q, ©, attr, a_list)) { OOGLError (0, "QuadCreate: Undefined option: %d",attr); if (!exist) GeomDelete((Geom *)q); return NULL; } } if ((q->p == NULL && q->maxquad > 0) || (q->p != NULL && q->maxquad <= 0) ) { OOGLError (0,"QuadCreate: inconsistent number of quads"); if (!exist) GeomDelete((Geom *)q); return NULL; } return (Quad *) q; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/quad/quadP.h0000644000175000001440000000302710560435435015123 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef QUADPDEFS #define QUADPDEFS #include "geomclass.h" #include "quad.h" #include "bsptree.h" #define QUAD_N VERT_N #define QUAD_C VERT_C #define QUAD_BINARY GEOMFLAG(0x01) typedef HPoint3 QuadP[4]; typedef Point3 QuadN[4]; typedef ColorA QuadC[4]; struct Quad { GEOMFIELDS; int maxquad; QuadP *p; QuadN *n; QuadC *c; }; Quad *QuadPick(Quad *, Pick *, Appearance *, Transform, TransformN *, int *axes); Quad *QuadComputeNormals(Quad *q); #endif /* ! QUADPDEFS */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/quad/quadnormal.c0000644000175000001440000000410410560446127016204 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" Quad * QuadComputeNormals( Quad *q ) { int i; Point3 nor; float len; HPoint3 *p; Point3 *n; /* * Only compute if not present! */ if( !(q->geomflags & QUAD_N) ) { if(q->n == NULL) q->n = OOGLNewNE(QuadN, q->maxquad, "QuadComputeNormals normals"); p = &q->p[0][0]; n = &q->n[0][0]; for( i = q->maxquad; --i >= 0; p += 4) { #define TERM(S, T) (p[0].S - p[1].S) * (p[1].T + p[0].T) + \ (p[1].S - p[2].S) * (p[2].T + p[1].T) + \ (p[2].S - p[3].S) * (p[3].T + p[2].T) + \ (p[3].S - p[0].S) * (p[0].T + p[3].T) nor.x = TERM(y, z); nor.y = TERM(z, x); nor.z = TERM(x, y); len = nor.x*nor.x + nor.y*nor.y + nor.z*nor.z; if( len != 0.0 ) { len = 1.0 / sqrt(len); nor.x *= len; nor.y *= len; nor.z *= len; } *n++ = nor; *n++ = nor; *n++ = nor; *n++ = nor; } q->geomflags |= QUAD_N; } return q; } geomview-1.9.4/src/lib/gprim/quad/quadcopy.c0000644000175000001440000000345310560444112015664 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" Quad * QuadCopy(oq) Quad *oq; { Quad *q; if (!oq) return NULL; q = OOGLNewE(Quad, "new Quad"); q->p = OOGLNewNE(QuadP, oq->maxquad, "quad verts"); q->geomflags = oq->geomflags; q->maxquad = oq->maxquad; memcpy(q->p, oq->p, oq->maxquad * sizeof(QuadP)); if(oq->geomflags & QUAD_N) { q->n = OOGLNewNE(QuadN, oq->maxquad, "quad normals"); memcpy(q->n, oq->n, oq->maxquad * sizeof(QuadN)); } else q->n = NULL; if(oq->geomflags & QUAD_C) { q->c = OOGLNewNE(QuadC, oq->maxquad, "quad colors"); memcpy(q->c, oq->c, oq->maxquad * sizeof(QuadC)); } else q->c = NULL; return q; } geomview-1.9.4/src/lib/gprim/quad/quaddraw.c0000644000175000001440000001174610611530575015661 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "quadP.h" #include "mgP.h" #include "cmodel.h" #include "hpointn.h" #include "bsptreeP.h" static void draw_projected_quad(mgNDctx *NDctx, Quad *qquad) { Quad q = *qquad; HPointN *h; HPoint3 *op, *np; ColorA *nc; int npts = 4 * qquad->maxquad; int i, colored = 0, alpha = 0; mgNDmapfunc mapHPtN = NDctx->mapHPtN; Appearance *ap = &_mgc->astk->ap; /* TODO: do NOT use alloca */ q.p = (QuadP *)alloca(npts*sizeof(HPoint3)); q.n = NULL; q.c = (QuadC *)alloca(npts*sizeof(ColorA)); q.ap = NULL; RefInit((Ref *)(void *)&q, qquad->magic); DblListInit(&q.pernode); nc = q.c[0]; np = q.p[0]; op = qquad->p[0]; h = HPtNCreate(5, NULL); if (ap->flag & APF_KEEPCOLOR) { colored = 0; } else { HPoint3 dummyv; ColorA dummyc; /* Dummy transform to determine whether we have ND colors or not */ colored = mapHPtN(NDctx, h, &dummyv, &dummyc); } q.geomflags &= ~VERT_4D; for(i = 0; i < npts; i++, op++, np++, nc++) { if (qquad->geomflags & VERT_4D) { /* Set the point's first THREE components from our 4-D vertex */ Pt4ToHPtN(op, h); } else { /* Set the point's first four components from our 4-D vertex */ HPt3ToHPtN(op, NULL, h); } if (colored) { mapHPtN(NDctx, h, np, nc); if (nc->a < 1.0) { alpha = 1; } } else { mapHPtN(NDctx, h, np, NULL); } } if(colored) { if (alpha) { q.geomflags |= COLOR_ALPHA; } else { q.geomflags &= ~COLOR_ALPHA; } q.geomflags |= QUAD_C; } if (ap->flag & APF_FACEDRAW) { if (IS_SHADED(ap->shading)) { QuadComputeNormals(&q); } if (GeomHasAlpha((Geom *)(void *)&q, ap)) { /* could re-use per quad normals here ? */ } } mgquads(q.maxquad, q.p[0], q.n[0], colored ? q.c[0] : qquad->c[0], q.geomflags); if (NDctx->bsptree && (q.geomflags & GEOM_ALPHA)) { GeomNodeDataMove((Geom *)qquad, (Geom *)(void *)&q); GeomBSPTree((Geom *)(void *)&q, NDctx->bsptree, BSPTREE_ADDGEOM); GeomNodeDataMove((Geom *)(void *)&q, (Geom *)qquad); } OOGLFree(q.n); HPtNDelete(h); } Quad * QuadDraw(Quad *q) { mgNDctx *NDctx = NULL; mgctxget(MG_NDCTX, &NDctx); if(NDctx) { draw_projected_quad(NDctx, q); return q; } if ((((Quad *)q)->geomflags & VERT_N) == 0) { const Appearance *ap = mggetappearance(); if ((ap->flag & APF_NORMALDRAW) || (ap->flag & APF_FACEDRAW && IS_SHADED(ap->shading))) { QuadComputeNormals(q); q->geomflags |= VERT_N; } } if (_mgc->space & TM_CONFORMAL_BALL) { cmodel_clear(_mgc->space); cm_read_quad(q); cmodel_draw(PL_HASVN|PL_HASPN|PL_HASVCOL); } else if ((_mgc->astk->flags & MGASTK_SHADER) && !(q->geomflags & GEOM_ALPHA)) { /* * Special software shading */ int i, step, lim = q->maxquad * 4; HPoint3 *v = q->p[0]; Point3 *n = q->n[0]; int cquad = q->c && !(_mgc->astk->mat.override & MTF_DIFFUSE); ColorA *oc = cquad ? q->c[0] : (ColorA *)&_mgc->astk->mat.diffuse; ColorA *c = (ColorA *)alloca(lim * sizeof(ColorA)); ColorA *tc = c; step = (_mgc->astk->ap.shading == APF_SMOOTH) ? 1 : 4; for(i = 0; i < lim; i += step) { (*_mgc->astk->shader)(1, v, n, oc, tc); if(cquad) oc += step; if(step == 4) { tc[1] = *tc; tc[2] = *tc; tc[3] = *tc; v += 4; n += 4; tc += 4; } else { v++; n++; tc++; } } mgquads(q->maxquad, q->p[0], q->n[0], c, q->geomflags); } else { /* * Ordinary shading */ mgquads(q->maxquad, q->p[0], q->n[0], q->c[0], q->geomflags); } return q; } Quad *QuadBSPTree(Quad *q, BSPTree *tree, int action) { if (!never_translucent((Geom *)q) && action == BSPTREE_ADDGEOM) { BSPTreeAddObject(tree, (Geom *)q); } return q; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/quad/quadevert.c0000644000175000001440000000274310461140706016042 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" /* * Note: Calling QuadNormal will undo this! */ Quad * QuadEvert( q ) Quad *q; { int i; Point3 *np; if(q != NULL && (np = &q->n[0][0]) != NULL) { for(i = 4 * q->maxquad; --i >= 0; np++) { np->x = -np->x; np->y = -np->y; np->z = -np->z; } } return q; } geomview-1.9.4/src/lib/gprim/quad/quadsphere.c0000644000175000001440000000304210517062471016200 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "quadP.h" #include "sphere.h" Geom *QuadSphere(Quad *q, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere; /* Create a dummy sphere, the center will be corrected later */ sphere = GeomCreate("sphere", CR_SPACE, space, CR_END); SphereEncompassPoints((Sphere *)sphere, (float *)q->p, (q->geomflags & VERT_4D) != 0, 4, q->maxquad * 4, T, TN, axes); return sphere; } geomview-1.9.4/src/lib/gprim/quad/quadload.c0000644000175000001440000001227610560446243015643 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "quadP.h" static int getquads(IOBFILE *file, Quad *pquad, int off, int binary, int dimn) { HPoint3 *p; Point3 *n; ColorA *c; int k; p = &pquad->p[off][0]; n = (pquad->geomflags & QUAD_N) ? &pquad->n[off][0] : NULL; c = (pquad->geomflags & QUAD_C) ? &pquad->c[off][0] : NULL; for (k = 4 * (pquad->maxquad - off); --k >= 0; ) { if (iobfgetnf(file, dimn, (float *)p, binary) < dimn) break; /* set the w-coordinate if the points are 3 dim'nal */ if (dimn == 3) p->w = 1.0; p++; if (n != NULL) { if(iobfgetnf(file, 3, (float *)n, binary) < 3) return -1; n++; } if (c != NULL) { if (iobfgetnf(file, 4, (float *)c, binary) < 4) return -1; if (c->a < 1.0) pquad->geomflags |= COLOR_ALPHA; c++; } } k++; if (k % 4 != 0) return(-1); return pquad->maxquad - k/4; } Quad * QuadFLoad( IOBFILE *file, char *fname ) { Quad q; int binary = 0; char *token; int ngot; int dimn = 3; q.geomflags = 0; q.p = NULL; q.n = NULL; q.c = NULL; token = GeomToken(file); /* Parse [C][N][4]{QUAD|POLY}[ BINARY]\n */ if(*token == 'C') { q.geomflags = QUAD_C; token++; } if(*token == 'N') { q.geomflags |= QUAD_N; token++; } if(*token == '4') { q.geomflags |= VERT_4D; dimn = 4; token++; } if(strcmp(token, "POLY") && strcmp(token, "QUAD")) { return NULL; } /* Got valid header, now read the file. */ if(iobfnextc(file, 1) == 'B' && iobfexpectstr(file, "BINARY") == 0) { binary = 1; if(iobfnextc(file, 1) != '\n') { /* Expect \n after BINARY */ OOGLSyntax(file,"QuadFLoad: bad QUAD file header on %s", fname); return NULL; } (void) iobfgetc(file); /* Toss \n */ } if(binary) { /* * Binary case is easy. * Read the q count, then the P, N and C arrays. * Error if we get less than the q count promised. */ if(iobfgetni(file, 1, &q.maxquad, 1) <= 0) return NULL; if(q.maxquad <= 0 || q.maxquad > 10000000) { OOGLError(0, "Reading QUAD BINARY from \"%s\": incredible q count 0x%x", fname, q.maxquad); return NULL; } q.p = OOGLNewNE(QuadP, q.maxquad, "QuadFLoad: vertices"); if(q.geomflags & QUAD_N) q.n = OOGLNewNE(QuadN, q.maxquad, "QuadFLoad: normals"); if(q.geomflags & QUAD_C) q.c = OOGLNewNE(QuadC, q.maxquad, "QuadFLoad: colors"); ngot = getquads(file, &q, 0, 1, dimn); if(ngot != q.maxquad) { OOGLFree(q.p); if(q.n) OOGLFree(q.n); if(q.c) OOGLFree(q.c); goto fail; } } else { /* * ASCII case is harder. * Guess how many quads we need, and realloc() if we need more. */ #define TRYQUADS 1000 QuadP qp[TRYQUADS]; QuadN qn[TRYQUADS]; QuadC qc[TRYQUADS]; vvec vp, vn, vc; VVINIT(vp, QuadP, TRYQUADS); vvuse(&vp, qp, TRYQUADS); if(q.geomflags & QUAD_N) { VVINIT(vn, QuadN, TRYQUADS); vvuse(&vn, qn, TRYQUADS); } if(q.geomflags & QUAD_C) { VVINIT(vc, QuadC, TRYQUADS); vvuse(&vc, qc, TRYQUADS); } q.maxquad = TRYQUADS; ngot = 0; for(;;) { q.p = VVEC(vp, QuadP); if(q.geomflags & QUAD_N) q.n = VVEC(vn, QuadN); if(q.geomflags & QUAD_C) q.c = VVEC(vc, QuadC); ngot = getquads(file, &q, ngot, 0, dimn); VVCOUNT(vp) = VVCOUNT(vn) = VVCOUNT(vc) = ngot; if(ngot < q.maxquad) break; q.maxquad *= 2; vvneeds(&vp, q.maxquad); if(q.geomflags & QUAD_N) vvneeds(&vn, q.maxquad); if(q.geomflags & QUAD_C) vvneeds(&vc, q.maxquad); } if(ngot <= 0) { vvfree(&vp); vvfree(&vn); vvfree(&vc); goto fail; } /* Release unneeded storage */ q.maxquad = ngot; vvtrim(&vp); q.p = VVEC(vp, QuadP); if (q.geomflags & QUAD_N) { vvtrim(&vn); q.n = VVEC(vn, QuadN); } if (q.geomflags & QUAD_C) { vvtrim(&vc); q.c = VVEC(vc, QuadC); } } return (Quad *) GeomCCreate(NULL, QuadMethods(), CR_4D, (dimn == 4) ? 1 : 0, CR_NOCOPY, CR_FLAG, q.geomflags, CR_NELEM, q.maxquad, CR_POINT4, q.p, CR_NORMAL, q.n, CR_COLOR, q.c, 0); fail: OOGLSyntax(file, "Error reading QUADs in \"%s\"", fname); return NULL; } geomview-1.9.4/src/lib/gprim/quad/Makefile.am0000644000175000001440000000044510455665335015744 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libquad.la libquad_la_SOURCES = \ quadbound.c quadclass.c quadcopy.c quadcreate.c quaddelete.c quaddraw.c quadevert.c quadload.c quadnormal.c quadpick.c quadsave.c quadsphere.c quadtransform.c \ quad.h quadP.h geomview-1.9.4/src/lib/gprim/quad/Makefile.in0000644000175000001440000003756010665240504015753 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/quad DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libquad_la_LIBADD = am_libquad_la_OBJECTS = quadbound.lo quadclass.lo quadcopy.lo \ quadcreate.lo quaddelete.lo quaddraw.lo quadevert.lo \ quadload.lo quadnormal.lo quadpick.lo quadsave.lo \ quadsphere.lo quadtransform.lo libquad_la_OBJECTS = $(am_libquad_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libquad_la_SOURCES) DIST_SOURCES = $(libquad_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libquad.la libquad_la_SOURCES = \ quadbound.c quadclass.c quadcopy.c quadcreate.c quaddelete.c quaddraw.c quadevert.c quadload.c quadnormal.c quadpick.c quadsave.c quadsphere.c quadtransform.c \ quad.h quadP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/quad/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/quad/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libquad.la: $(libquad_la_OBJECTS) $(libquad_la_DEPENDENCIES) $(LINK) $(libquad_la_OBJECTS) $(libquad_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quaddelete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quaddraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadevert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadnormal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadtransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/quad/quadpick.c0000644000175000001440000000757710523143424015654 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include #include "quadP.h" #include "hpoint3.h" #include "point3.h" #include "pickP.h" #include "appearance.h" Quad *QuadPick(Quad *q, Pick *pick, Appearance *ap, Transform T, TransformN *TN, int *axes) { Point3 plist[4]; int i; int found, v4d; unsigned int apflag = 0; HPt3Coord xa, xb, xc, xd; found = -1; v4d = (q->geomflags & VERT_4D) != 0; /* Make sure that vectors do not appear visible to the pick code - * otherwise they will screw up edge picking */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_VECTDRAW; } for (i = 0; i < q->maxquad; i++) { if (TN) { xa = HPt3NTransPt3(TN, axes, &q->p[i][0], v4d, &plist[0]); xb = HPt3NTransPt3(TN, axes, &q->p[i][1], v4d, &plist[1]); xc = HPt3NTransPt3(TN, axes, &q->p[i][2], v4d, &plist[2]); xd = HPt3NTransPt3(TN, axes, &q->p[i][3], v4d, &plist[3]); } else { xa = HPt3TransPt3(T, &q->p[i][0], &plist[0]); xb = HPt3TransPt3(T, &q->p[i][1], &plist[1]); xc = HPt3TransPt3(T, &q->p[i][2], &plist[2]); xd = HPt3TransPt3(T, &q->p[i][3], &plist[3]); } /* Note -- we need to be sure that all four are evaluated!! */ if((xa > 0) || (xb > 0) || (xc > 0) || (xd > 0)) { if(PickFace(4, plist, pick, ap)) found = i; } } if (ap != NULL) ap->flag = apflag; if (found == -1) return NULL; if (pick->found & PW_VERT) { if (TN) { HPt3NTransHPt3(TN, axes, &q->p[found][pick->vi], v4d, &pick->v); } else { HPt3Transform(T, &q->p[found][pick->vi], &pick->v); } pick->vi = found*4 + pick->vi; } if (pick->found & PW_EDGE) { if (TN) { HPt3NTransHPt3(TN, axes, &q->p[found][pick->ei[0]], v4d, &pick->e[0]); HPt3NTransHPt3(TN, axes, &q->p[found][pick->ei[1]], v4d, &pick->e[1]); } else { HPt3Transform(T, &q->p[found][pick->ei[0]], &pick->e[0]); HPt3Transform(T, &q->p[found][pick->ei[1]], &pick->e[1]); } pick->ei[0] = found*4 + pick->ei[0]; pick->ei[1] = found*4 + pick->ei[1]; } if (pick->found & PW_FACE) { if(pick->f) OOGLFree(pick->f); pick->f = OOGLNewNE(HPoint3, 4, "Quad pick"); if (TN) { HPt3NTransHPt3(TN, axes, &q->p[found][0], v4d, &pick->f[0]); HPt3NTransHPt3(TN, axes, &q->p[found][1], v4d, &pick->f[1]); HPt3NTransHPt3(TN, axes, &q->p[found][2], v4d, &pick->f[2]); HPt3NTransHPt3(TN, axes, &q->p[found][3], v4d, &pick->f[3]); } else HPt3TransformN(T, q->p[found], pick->f, 4); pick->fi = found; } if (TN) { pick->TprimN = TmNCopy(TN, pick->TprimN); memcpy(pick->axes, axes, sizeof(pick->axes)); } else TmCopy(T, pick->Tprim); return q; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/quad/quadsave.c0000644000175000001440000000404510560446146015657 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" Quad * QuadFSave(Quad *q, FILE *f, char *fname) { int i; HPoint3 *p; Point3 *n; ColorA *c; if(q == NULL || f == NULL) return(NULL); if(q->geomflags & QUAD_C) fputc('C', f); if(q->geomflags & QUAD_N) fputc('N', f); if(q->geomflags & VERT_4D) fputc('4', f); fprintf(f, "QUAD\n"); p = &q->p[0][0]; n = (q->geomflags & QUAD_N) ? &q->n[0][0] : NULL; c = (q->geomflags & QUAD_C) ? &q->c[0][0] : NULL; for(i = 4 * q->maxquad; --i >= 0 && !ferror(f); ) { if (q->geomflags & VERT_4D) fprintf(f, "%g %g %g %g", p->x, p->y, p->z, p->w); else fprintf(f, "%g %g %g", p->x, p->y, p->z); p++; if(n) { fprintf(f, " %g %g %g", n->x, n->y, n->z); n++; } if(c) { fprintf(f, " %.3g %.3g %.3g %.3g", c->r, c->g, c->b, c->a); c++; } fputc('\n', f); if((i & 3) == 0) fputc('\n', f); } return(ferror(f) ? NULL : q); } geomview-1.9.4/src/lib/gprim/quad/quad.h0000644000175000001440000000334510563062264015005 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef QUADDEFS #define QUADDEFS #include "bbox.h" #include "bsptree.h" #define QUADMAGIC GeomMagic ('q', 1) typedef struct Quad Quad; extern GeomClass *QuadMethods( void ); extern char *QuadName( void ); extern Quad *QuadLoad( char * ); extern Quad *QuadFLoad( IOBFILE *, char *fname ); extern Quad *QuadSave( Quad *, char * ); extern Quad *QuadFSave( Quad *, FILE *, char *fname ); extern BBox *QuadBound(Quad *q, Transform T, TransformN *TN); extern Geom *QuadSphere(Quad *q, Transform T, TransformN *TN, int *axes, int space); extern Quad *QuadEvert( Quad * ); extern Quad *QuadDraw( Quad * ); extern Quad *QuadBSPTree(Quad *quad, BSPTree *bsptree, int action); extern Quad *QuadTransform( Quad *, Transform ); extern Quad *QuadTransformTo( Quad *, Transform ); #endif geomview-1.9.4/src/lib/gprim/quad/quaddelete.c0000644000175000001440000000253610564035073016163 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" Quad * QuadDelete(Quad *q) { if(q) { if(q->p != NULL) GeomFree(q->p); if(q->c != NULL) GeomFree(q->c); if(q->n != NULL) GeomFree(q->n); } return NULL; } geomview-1.9.4/src/lib/gprim/quad/quadbound.c0000644000175000001440000000736010574314157016034 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "quadP.h" BBox *QuadBound(Quad *q, Transform T, TransformN *TN) { int n; HPoint3 min, max, clean, tmp, *p; n = q->maxquad * 4; p = q->p[0]; min = *p; /* First handle the case without transformations, this means that we return a 3d bbox for 3d quads, and a 4d bboy for 4d quads. */ if ((T == TM_IDENTITY || !T) && !TN) { if (!T && (q->geomflags & VERT_4D)) { max = min; while(--n >= 0) { Pt4MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_4D, 1, CR_END); } else { HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { HPt3MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *ptN; HPointN *minN; HPointN *maxN; BBox *result; ptN = HPtNCreate(5, NULL); if (q->geomflags & VERT_4D) { Pt4ToHPtN(&min, ptN); } else { HPt3ToHPtN(&min, NULL, ptN); } minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); while(--n > 0) { if (q->geomflags & VERT_4D) { Pt4ToHPtN(++p, ptN); } else { HPt3ToHPtN(++p, NULL, ptN); } HPtNTransform(TN, ptN, ptN); HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ if (false && (q->geomflags & VERT_4D)) { /* We operate on the 3x3 x,y,z space */ min.w = 1.0; HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { tmp = *(++p); tmp.w = 1.0; HPt3Transform(T, &tmp, &clean); HPt3Dehomogenize(&clean, &clean); Pt3MinMax(&min, &max, &clean); } } else { /* ordinary 3d object */ HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { tmp = *(++p); HPt3Transform(T, &tmp, &clean); HPt3Dehomogenize(&clean, &clean); Pt3MinMax(&min, &max, &clean); } } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/quad/Headers0000644000175000001440000000001707730237522015174 00000000000000quad.h quadP.h geomview-1.9.4/src/lib/gprim/quad/quadtransform.c0000644000175000001440000000333110564221646016731 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "hpoint3.h" #include "point3.h" #include "quadP.h" Quad *QuadTransform(Quad *q, Transform T) { int i; for (i = 0; i < q->maxquad; i++) { HPt3TransformN(T, q->p[i], q->p[i], 4); } if (q->geomflags & QUAD_N) { Transform Tit; TmDual(T, Tit); for (i = 0; i < q->maxquad; i++) { NormalTransformN(Tit, q->n[i], q->n[i], 4); } } return q; } Quad *QuadTransformTo(Quad *q, Transform T) { return QuadTransform(q, T); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/skel/0000777000175000001440000000000010665240674013773 500000000000000geomview-1.9.4/src/lib/gprim/skel/skelP.h0000644000175000001440000000443510605752715015142 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef SKELPDEF #define SKELPDEF #include "geomclass.h" #include "skel.h" typedef struct Skline { int nv; /* Number of vertices for this polyline */ int v0; /* offset into vi[] of all vertices on line */ int nc; /* Number of colors for this polyline */ int c0; /* index into c[] of first color */ } Skline; struct Skel { GEOMFIELDS; int nvert, nlines; float *p; /* Array[nvert][pdim] of point coords */ Skline *l; /* nl[nlines] */ int nvi; /* Total number of vertex indices */ int *vi; /* All vertex index lists */ int nc; /* Total number of colors */ ColorA *c; /* Array of per-polyline colors */ ColorA *vc; /* Array of per-vertex colors */ }; extern Skel *SkelCreate( Skel *, GeomClass *, va_list *a_list); extern void SkelDelete( Skel * ); extern Skel *SkelCopy( Skel * ); extern Skel *SkelPick( Skel *, Pick *, Appearance *, Transform, TransformN *TN, int *axes ); extern Skel *SkelFLoad( IOBFILE *f, char *fname ); extern Skel *SkelFSave( Skel *, FILE * ); extern BBox *SkelBound(Skel *s, Transform T, TransformN *TN); extern Skel *SkelDraw( Skel * ); extern Skel *SkelTransform( Skel *s, Transform T, TransformN *TN ); extern Geom *SkelBoundSphere(Skel *skel, Transform T, TransformN *TN, int *axes, int space); #endif /*SKELPDEF*/ geomview-1.9.4/src/lib/gprim/skel/Makefile.am0000644000175000001440000000037210514661170015734 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libskel.la libskel_la_SOURCES = \ skelbound.c skelclass.c skelcreate.c skeldraw.c skelload.c skelpick.c \ skelsave.c skeltransform.c skelsphere.c \ skel.h skelP.h geomview-1.9.4/src/lib/gprim/skel/Makefile.in0000644000175000001440000003674410665240504015762 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/skel DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libskel_la_LIBADD = am_libskel_la_OBJECTS = skelbound.lo skelclass.lo skelcreate.lo \ skeldraw.lo skelload.lo skelpick.lo skelsave.lo \ skeltransform.lo skelsphere.lo libskel_la_OBJECTS = $(am_libskel_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libskel_la_SOURCES) DIST_SOURCES = $(libskel_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libskel.la libskel_la_SOURCES = \ skelbound.c skelclass.c skelcreate.c skeldraw.c skelload.c skelpick.c \ skelsave.c skeltransform.c skelsphere.c \ skel.h skelP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/skel/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/skel/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libskel.la: $(libskel_la_OBJECTS) $(libskel_la_DEPENDENCIES) $(LINK) $(libskel_la_OBJECTS) $(libskel_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skeldraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skelsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skeltransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/skel/skelcreate.c0000644000175000001440000001264610550515421016172 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "skelP.h" /* * Vect object creation, editing, copying, deletion. */ Skel *SkelCopy(Skel *os) { Skel *s; if (os == NULL) return (NULL); s = OOGLNewE(Skel, "new SKEL"); *s = *os; s->p = OOGLNewNE(float, os->nvert * os->pdim, "Skel vertices"); s->c = os->nc > 0 ? OOGLNewNE(ColorA, os->nc, "Skel colors") : NULL; s->l = OOGLNewNE(Skline, os->nlines, "Skel lines"); s->vi = OOGLNewNE(int, os->nvi, "Skel nverts"); if (s->vc) { s->vc = OOGLNewNE(ColorA, os->nvert, "Skel vertex colors"); } memcpy(s->p, os->p, os->nvert * os->pdim * sizeof(float)); memcpy(s->l, os->l, os->nlines * sizeof(Skline)); if(os->nc > 0) memcpy(s->c, os->c, os->nc * sizeof(ColorA)); memcpy(s->vi, os->vi, os->nvi * sizeof(int)); if (os->vc) memcpy(s->vc, os->vc, os->nvert * sizeof(ColorA)); return s; } void SkelDelete(Skel *s) { if (s) { if (s->p != NULL) OOGLFree(s->p); if (s->c != NULL) OOGLFree(s->c); if (s->vi != NULL) OOGLFree(s->vi); if (s->vc != NULL) OOGLFree(s->vc); } } Skel *SkelCreate(Skel *exist, GeomClass *classp, va_list *a_list) { Skel *s; if (exist == NULL) { s = OOGLNewE(Skel, "new skel"); GGeomInit (s, classp, SKELMAGIC, NULL); s->nlines = 0; s->nvert = 0; s->nvi = 0; s->p = NULL; s->c = NULL; s->vi = NULL; s->vc = NULL; } else { /* Should check that exist is a vect */ s = exist; } #ifdef notyet while (attr = va_arg (*a_list, int)) switch (attr) { case CR_FLAG: vect->flag = va_arg (*a_list, int); break; case CR_NVECT: vect->nvec = va_arg (*a_list, int); break; case CR_NVERT: vect->nvert = va_arg (*a_list, int); break; case CR_NCOLR: vect->ncolor = va_arg (*a_list, int); break; case CR_VECTC: vectcounts = va_arg (*a_list, short *); if (vectcounts == NULL) { vect->vnvert = NULL; vect->nvert = 0; } else if (copy) { vect->vnvert = OOGLNewNE(short, vect->nvec, "vect vert counts"); memcpy(vect->vnvert, vectcounts, vect->nvec*sizeof(*vect->vnvert)); } else { vect->vnvert = vectcounts; } break; case CR_COLRC: colorcounts = va_arg (*a_list, short *); if (colorcounts == NULL) { vect->vncolor = NULL; vect->nvert = 0; } else if (copy) { vect->vncolor = OOGLNewNE(short, vect->nvec, "vect vert counts"); memcpy(vect->vncolor, colorcounts, vect->nvec*sizeof(*vect->vncolor)); } else { vect->vncolor = colorcounts; } break; case CR_POINT: v3 = va_arg (*a_list, Point3 *); if (v3 == NULL) { vect->p = NULL; vect->nvert = 0; } else if (copy) { vect->p = OOGLNewNE(HPoint3, vect->nvert, "vect points"); Pt3ToPt4(v3, vect->p, vect->nvert); } else { Pt3ToPt4(v3, vect->p, vect->nvert); } break; case CR_POINT4: v4 = va_arg (*a_list, HPoint3 *); if (v4 == NULL) { vect->p = NULL; vect->nvert = 0; } else if (copy) { vect->p = OOGLNewNE(HPoint3, vect->nvert, "vect points"); memcpy(vect->p, v4, vect->nvert*sizeof(HPoint3)); } else { vect->p = v4; } break; case CR_COLOR: colors = va_arg (*a_list, ColorA *); if (colors == NULL) { vect->c = NULL; vect->ncolor = 0; } else if (copy) { vect->c = OOGLNewNE(ColorA, vect->ncolor, "vect colors"); memcpy(vect->c, colors, vect->ncolor*sizeof(ColorA)); } else { vect->c = colors; } break; default: if (GeomDecorate (s, ©, attr, a_list)) { OOGLError (0, "VectCreate: Undefined option: %d\n", attr); OOGLFree (vect); return NULL; } } if (!SkelSane(s)) { OOGLError (0, "SkelCreate: Bogus data supplied"); GeomDelete((Geom *)s); return NULL; } /* end police work */ if (exist != NULL) return exist; #endif return s; } int SkelSane(Skel *s) { int i; Skline *l; if (s == NULL || s->vi==NULL || s->p==NULL || s->nlines < 0 || s->nvert < 0 || s->nc < 0 || (s->nc>0 && s->c==NULL)) return 0; for (i = s->nlines, l = s->l; --i >= 0; ) { if (l->v0 < 0 || l->nv < 0 || l->nv + l->v0 > s->nvi) return 0; if (l->nc < 0 || l->c0 < 0 || l->c0 + l->nc > s->nc) return 0; } for (i = 0; i < s->nvi; i++) if ((unsigned)s->vi[i] >= s->nvi) return 0; return 1; } geomview-1.9.4/src/lib/gprim/skel/skeldraw.c0000644000175000001440000001417210554525127015670 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: * Draw a Vect (collection of vectors). * */ #include "mgP.h" #include "skelP.h" #include "hpointn.h" #include "transformn.h" #include "cmodel.h" #include #ifndef alloca #include #endif #define MAXPLINE 32 /* Temp buffer size. Must be a power of 2! */ static void draw_projected_skel(mgNDctx *NDctx, Skel *s, int flags, int penultimate, int hascolor) { HPointN *h; float *op; HPoint3 *np, *newp; Skline *l; ColorA *c, *lastcolor, *newc; int i, colored = 0; HPoint3 tv[MAXPLINE]; ColorA tc[MAXPLINE]; mgNDmapfunc mapHPtN = NDctx->mapHPtN; Appearance *ap = &_mgc->astk->ap; newp = (HPoint3 *)alloca(s->nvert*sizeof(HPoint3)); h = HPtNCreate(s->pdim, NULL); if (ap->flag & APF_KEEPCOLOR) { colored = 0; } else { HPoint3 dummyv; ColorA dummyc; /* Dummy transform to determine whether we have ND colors or not */ colored = mapHPtN(NDctx, h, &dummyv, &dummyc); } if (colored) { newc = (ColorA *)alloca(s->nvert*sizeof(ColorA)); } else { newc = s->vc; } /* VERT_4D is only honoured here if pdim == 4 */ if (s->pdim == 4) { for (i = 0, op = s->p, np = newp; i < s->nvert; i++, op += s->pdim, np++) { if (s->geomflags & VERT_4D) { Pt4ToHPtN((HPoint3 *)op, h); } else { HPt3ToHPtN((HPoint3 *)op, NULL, h); } if (colored) { mapHPtN(NDctx, h, np, &newc[i]); } else { mapHPtN(NDctx, h, np, NULL); } } } else { /* Real ND case, i.e. pdim >= 5 */ float *hdata= h->v; for (i = 0, op = s->p, np = newp; i < s->nvert; i++, op += s->pdim, np++) { h->v = op; if (colored) { mapHPtN(NDctx, h, np, &newc[i]); } else { mapHPtN(NDctx, h, np, NULL); } } h->v = hdata; } HPtNDelete(h); if (!hascolor) { colored = 0; } else if (newc) { colored = 1; } lastcolor = (ColorA *)(void *)&_mgc->astk->mat.edgecolor; for(i = 0, l = s->l, c = colored ? newc : s->c; i < s->nlines; i++, l++) { int nleft = l->nv; int *vleft = &s->vi[l->v0]; int j; if(l->nc > 0 && hascolor) lastcolor = &s->c[l->c0]; while(nleft > MAXPLINE) { if(colored) { for(np = tv, c = tc, j = MAXPLINE; --j >= 0; vleft++) { *np++ = newp[*vleft]; *c++ = newc[*vleft]; } mgpolyline(MAXPLINE, tv, MAXPLINE, tc, flags); } else { for(np = tv, j = MAXPLINE; --j >= 0; vleft++) *np++ = newp[*vleft]; mgpolyline(MAXPLINE, tv, 1, lastcolor, flags); } nleft -= MAXPLINE-1; vleft--; flags = 6; } if(colored) { for(np = tv, c = tc, j = nleft; --j >= 0; vleft++) { *np++ = newp[*vleft]; *c++ = newc[*vleft]; } flags = (i < penultimate) ? 6 : 2; mgpolyline(nleft, tv, nleft, tc, flags); } else { for(np = tv, j = nleft; --j >= 0; vleft++) *np++ = newp[*vleft]; flags = (i < penultimate) ? 6 : 2; mgpolyline(nleft, tv, 1, lastcolor, flags); } } } Skel *SkelDraw(Skel *s) { int i, hascolor; Skline *l; int flags, penultimate; ColorA *lastcolor=NULL; HPoint3 tv[MAXPLINE]; ColorA tc[MAXPLINE]; mgNDctx *NDctx = NULL; /* Don't draw if vect-drawing is off. */ if (s == NULL || (_mgc->astk->ap.flag & APF_VECTDRAW) == 0) return NULL; /* draw in conformal model if necessary */ if (_mgc->space & TM_CONFORMAL_BALL) { cmodel_clear(_mgc->space); /* cm_read_skel(s); */ cmodel_draw(0); return s; } hascolor = !(_mgc->astk->mat.override & MTF_EDGECOLOR); penultimate = s->nlines - 2; flags = penultimate>0 ? 4 : 0; /* 4: not last mbr of batch of lines */ mgctxget(MG_NDCTX, &NDctx); if (NDctx) { draw_projected_skel(NDctx, s, flags, penultimate, hascolor); return s; } lastcolor = (ColorA *)(void *)&_mgc->astk->mat.edgecolor; for (i = 0, l = s->l; i < s->nlines; i++, l++) { int nleft = l->nv; int *vleft = &s->vi[l->v0]; int j; if (l->nc > 0 && hascolor) lastcolor = &s->c[l->c0]; while (nleft > MAXPLINE) { for (j = 0; j < MAXPLINE; j++) { if (hascolor && s->vc) tc[j] = s->vc[*vleft]; tv[j] = *(HPoint3 *)&(s->p)[(*vleft++)*s->pdim]; if (s->pdim < 4) { if (s->pdim < 3) { tv[j].y = 0; } tv[j].z = 0; tv[j].w = 1; } } if (hascolor && s->vc) mgpolyline(MAXPLINE, tv, MAXPLINE, tc, flags); else mgpolyline(MAXPLINE, tv, 1, lastcolor, flags); nleft -= MAXPLINE-1; vleft--; flags = 6; } for(j = 0; j < nleft; j++) { if (hascolor && s->vc) tc[j] = s->vc[*vleft]; tv[j] = *(HPoint3 *)&(s->p)[(*vleft++)*s->pdim]; if (s->pdim < 4) { if (s->pdim < 3) { tv[j].y = 0; } tv[j].z = 0; tv[j].w = 1; } } flags = (i < penultimate) ? 6 : 2; if (hascolor && s->vc) mgpolyline(nleft, tv, nleft, tc, flags); else mgpolyline(nleft, tv, 1, lastcolor, flags); } return s; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/skel/skel.h0000644000175000001440000000227510561424357015021 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef SKELDEF #define SKELDEF #ifndef NULL #define NULL 0 #endif #include "bbox.h" #define SKELMAGIC GeomMagic ('s', 1) /* For checking whether a vect. */ typedef struct Skel Skel; GeomClass *SkelMethods(); #endif /*SKELDEF*/ geomview-1.9.4/src/lib/gprim/skel/skelload.c0000644000175000001440000001456110622716755015661 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justs Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Create and load a vert object from a file. * */ #include #include "skelP.h" Skel *SkelFLoad(IOBFILE *file, char *fname) { Skel *s; int dimn = 3, pdim = 4; bool nd = false, vc = false, binary = false; char *token; float *vp; Skline *lp; int i, k; ColorA *cp; static ColorA black = { 0,0,0,1 }; vvec colors; vvec verts; if (file == NULL) return NULL; token = GeomToken(file); if (*token == 'C') { vc = true; token++; } if(*token == '4') { /* Really means "homogeneous coords" */ dimn = 4; token++; } if(*token == 'n') { nd = true; token++; } if (strcmp(token, "SKEL")) return NULL; if(nd) { if(iobfgetni(file, 1, &pdim, 0) <= 0) { OOGLSyntax(file, "Reading nSKEL from \"%s\": Expected dimension", fname); return NULL; } if (pdim < 4) { OOGLSyntax(file, "Reading nSKEL from \"%s\": dimension %d < 4", fname, pdim); return NULL; } ++pdim; } if(iobfnextc(file, 1) == 'B' && iobfexpectstr(file, "BINARY") == 0) { binary = true; if(iobfnextc(file, 1) != '\n') /* Expect \n after BINARY */ return NULL; (void) iobfgetc(file); /* Toss \n */ } s = OOGLNewE(Skel, "SkelFLoad: skel"); GGeomInit(s, SkelMethods(), SKELMAGIC, NULL); s->geomflags = (dimn == 4) ? VERT_4D : 0; if (vc) { s->geomflags |= VERT_C; } s->pdim = pdim; s->p = NULL; s->l = NULL; s->c = NULL; s->vc = NULL; s->vi = NULL; s->nvi = s->nc = 0; if(iobfgetni(file, 1, &s->nvert, binary) <= 0 || iobfgetni(file, 1, &s->nlines, binary) <= 0) { OOGLSyntax(file, "Reading SKEL from \"%s\": expected nvertices, nlines"); goto bogus; } s->p = OOGLNewNE(float, s->nvert * s->pdim, "SKEL vertices"); s->l = OOGLNewNE(Skline, s->nlines, "SKEL lines"); if (vc) { s->vc = OOGLNewNE(ColorA, s->nvert, "SKEL vertex colors"); } VVINIT(colors, ColorA, 10); VVINIT(verts, int, 40); if (pdim == 4) { for (i = 0, vp = s->p; i < s->nvert; i++, vp += 4) { vp[3] = 1.0; /* homogeneous component */ if (iobfgetnf(file, dimn, vp, binary) < dimn) { OOGLSyntax(file, "Reading SKEL from \"%s\": error reading vertex %d of %d", fname, i, s->nvert); goto bogus; } if (vc) { if (iobfgetnf(file, 4, (float *)&s->vc[i], binary) < 4) { OOGLSyntax(file, "Reading SKEL from \"%s\": " "error reading vertex color %d of %d", fname, i, s->nvert); goto bogus; } } } } else { dimn = dimn == 4 ? s->pdim : s->pdim - 1; for (i = 0, vp = s->p; i < s->nvert; i++, vp += s->pdim) { vp[0] = 1.0; /* homogeneous component */ if(iobfgetnf(file, dimn, vp + (pdim == dimn+1), binary) < dimn) { OOGLSyntax(file, "Reading SKEL from \"%s\": error reading vertex %d of %d", fname, i, s->nvert); goto bogus; } if (vc) { if (iobfgetnf(file, 4, (float *)&s->vc[i], binary) < 4) { OOGLSyntax(file, "Reading SKEL from \"%s\": " "error reading vertex color %d of %d", fname, i, s->nvert); goto bogus; } } } } for (i = 0, lp = s->l; i < s->nlines; i++, lp++) { /* Read one polyline */ if(iobfgetni(file, 1, &lp->nv, binary) <= 0 || lp->nv <= 0) { OOGLSyntax(file, "Reading SKEL from \"%s\": " "expected vertex count on polyline %d of %d", fname, i, s->nlines); goto bogus; } /* Add its vertex-indices to our global list */ lp->v0 = k = VVCOUNT(verts); VVCOUNT(verts) += lp->nv; vvneeds(&verts, VVCOUNT(verts)); if(iobfgetni(file, lp->nv, VVEC(verts, int) + k, binary) < lp->nv) { OOGLSyntax(file, "Reading SKEL from \"%s\": expected %d vertex indices on polyline %d of %d", fname, lp->nv, i, s->nlines); goto bogus; } /* Check for color (sigh) by testing for end of line. */ vvneeds(&colors, VVCOUNT(colors)+1); cp = &VVEC(colors, ColorA)[VVCOUNT(colors)]; *cp = black; /* Pick up the color, if any. * In ASCII format, take whatever's left before end-of-line */ if (!binary) { for(k = 0; k < 4 && iobfnextc(file, 1) != '\n'; k++) { if(iobfgetnf(file, 1, ((float *)cp)+k, 0) < 1) { OOGLSyntax(file, "Reading SKEL from \"%s\": polyline %d of %d: expected color component", fname, i, s->nlines); goto bogus; } } } else { int ncol; if (iobfgetni(file, 1, &ncol, 1) <= 0 || iobfgetnf(file, ncol, (float *)cp, 1) < ncol) { OOGLSyntax(file, "Reading binary SKEL from \"%s\": " "polyline %d of %d: expected color component", fname, i, s->nlines); goto bogus; } k = ncol; } lp->c0 = VVCOUNT(colors); if (k > 0) { lp->nc = 1; VVCOUNT(colors)++; s->geomflags |= FACET_C; } else { lp->nc = 0; } } /* Note we don't vvfree() the verts and colors arrays -- * we simply use the pointers to data they've already malloced, if any. */ s->nvi = VVCOUNT(verts); s->vi = VVEC(verts, int); s->nc = VVCOUNT(colors); s->c = VVEC(colors, ColorA); return s; bogus: GeomDelete((Geom *)s); return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/skel/skelpick.c0000644000175000001440000001576110622716756015674 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "skelP.h" #include "pickP.h" static Skel *NSkelPick(Skel *s, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { Point3 plist[2]; int i, j, ok[2]; bool found; unsigned int apflag = 0; HPointN ptN[1]; if (!TN) return NULL; /* we have full-featured ND-points here. */ ptN->flags = 0; ptN->dim = s->pdim; /* Make sure that the edges do not count as visible - otherwise * they could really mess things up */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_EDGEDRAW; } found = false; for (i = 0; i < s->nlines && !found; i++) { int nv = abs(s->l[i].nv); int *idx = s->vi + s->l[i].v0; ptN->v = s->p + idx[0]*s->pdim; ok[0] = (0 < HPtNNTransPt3(TN, axes, ptN, &plist[0])); if (nv == 1) { if (ok[0] && PickFace(1, &plist[0], p, ap)) { found = true; p->vi = idx[0]; break; } continue; } for (j = 0; j < nv - 1;) { ptN->v = s->p + idx[++j]*s->pdim; ok[1] = (0 < HPtNNTransPt3(TN, axes, ptN, &plist[1])); if ((ok[0]||ok[1]) && PickFace(2, plist, p, ap)) { found = true; p->vi = p->vi ? idx[j] : idx[j-1]; p->ei[0] = idx[j-1]; p->ei[1] = idx[j]; break; } ok[0] = ok[1]; plist[0] = plist[1]; } if (s->l[i].nv < 0) { ptN->v = s->p + idx[0]*s->pdim; ok[1] = (0 < HPtNNTransPt3(TN, axes, ptN, &plist[1])); if ((ok[0]||ok[1]) && PickFace(2, plist, p, ap)) { found = true; p->vi = p->vi ? idx[0] : idx[j]; p->ei[0] = idx[j]; p->ei[1] = idx[0]; break; } } if (found) { break; } } if (ap != NULL) ap->flag = apflag; if (!found) { return NULL; } if (p->found & PW_VERT) { ptN->v = s->p + p->vi*s->pdim; HPtNTransformComponents(TN, ptN, axes, &p->v); } else p->vi = -1; if (p->found & PW_EDGE) { ptN->v = s->p + p->ei[0]*s->pdim; HPtNTransformComponents(TN, ptN, axes, &p->e[0]); ptN->v = s->p + p->ei[1]*s->pdim; HPtNTransformComponents(TN, ptN, axes, &p->e[1]); } else p->ei[0] = p->ei[1] = -1; if (p->found & PW_FACE) { p->fi = i; if (p->f) { OOGLFree(p->f); } p->f = OOGLNewNE(HPoint3, p->fn, "Skel pick"); for (i = 0; i < p->fn; i++) { int vi = s->vi[s->l[p->fi].v0+i]; ptN->v = s->p + vi*s->pdim; HPtNTransformComponents(TN, ptN, axes, &p->f[i]); } } if (TN) { p->TprimN = TmNCopy(TN, p->TprimN); memcpy(p->axes, axes, sizeof(p->axes)); } else TmCopy(T, p->Tprim); return s; } Skel *SkelPick(Skel *s, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { Point3 plist[2]; int i, j, ok[2]; bool found; int v4d; unsigned int apflag = 0; if (s->pdim > 4) { return NSkelPick(s, p, ap, T, TN, axes); } /* Make sure that the edges do not count as visible - otherwise * they could really mess things up */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_EDGEDRAW; } found = false; v4d = (s->geomflags & VERT_4D) != 0; for (i = 0; i < s->nlines && !found; i++) { int nv = abs(s->l[i].nv); int *idx = &s->vi[s->l[i].v0]; if (TN) { ok[0] = (0 < HPt3NTransPt3(TN, axes, (HPoint3 *)(s->p + idx[0]*s->pdim), v4d, &plist[0])); } else { ok[0] = (0 < HPt3TransPt3(T, (HPoint3 *)(s->p + idx[0]*s->pdim), &plist[0])); } if (nv == 1) { if (ok[0] && PickFace(1, &plist[0], p, ap)) { found = true; p->vi = idx[0]; break; } continue; } for (j = 0; j < nv - 1;) { if (TN) { ok[1] = (0 < HPt3NTransPt3(TN, axes, (HPoint3 *)(s->p + idx[++j]*s->pdim), v4d, &plist[1])); } else { ok[1] = (0 < HPt3TransPt3(T, (HPoint3 *)(s->p + idx[++j]*s->pdim), &plist[1])); } if ((ok[0]||ok[1]) && PickFace(2, plist, p, ap)) { found = true; p->vi = p->vi ? idx[j] : idx[j-1]; p->ei[0] = idx[j-1]; p->ei[1] = idx[j]; break; } ok[0] = ok[1]; plist[0] = plist[1]; } if (s->l[i].nv < 0) { if (TN) ok[1] = (0 < HPt3NTransPt3(TN, axes, (HPoint3 *)(s->p + idx[0]*s->pdim), v4d, &plist[1])); else ok[1] = (0 < HPt3TransPt3(T, (HPoint3 *)(s->p + idx[0]*s->pdim), &plist[1])); if ((ok[0]||ok[1]) && PickFace(2, plist, p, ap)) { found = true; p->vi = p->vi ? idx[0] : idx[j]; p->ei[0] = idx[j]; p->ei[1] = idx[0]; break; } } if (found) { break; } } if (ap != NULL) { ap->flag = apflag; } if (!found) { return NULL; } if (p->found & PW_VERT) { if (TN) { HPt3NTransHPt3(TN, axes, (HPoint3 *)(s->p + p->vi*s->pdim), v4d, &p->v); } else { HPt3Transform(T, (HPoint3 *)(s->p + p->vi*s->pdim), &p->v); } } else { p->vi = -1; } if (p->found & PW_EDGE) { if (TN) { HPt3NTransHPt3(TN, axes, (HPoint3 *)(s->p + p->ei[0]*s->pdim), v4d, &p->e[0]); HPt3NTransHPt3(TN, axes, (HPoint3 *)(s->p + p->ei[1]*s->pdim), v4d, &p->e[1]); } else { HPt3Transform(T, (HPoint3 *)(s->p + p->ei[0]*s->pdim), &p->e[0]); HPt3Transform(T, (HPoint3 *)(s->p + p->ei[1]*s->pdim), &p->e[1]); } } else { p->ei[0] = p->ei[1] = -1; } if (p->found & PW_FACE) { p->fi = i; if (p->f) { OOGLFree(p->f); } p->f = OOGLNewNE(HPoint3, p->fn, "Skel pick"); if (TN) { for (i = 0; i < p->fn; i++) { int vi = s->vi[s->l[p->fi].v0+i]; HPt3NTransHPt3(TN, axes, (HPoint3 *)(s->p + vi*s->pdim), v4d, &p->f[i]); } } else { for (i = 0; i < p->fn; i++) { int vi = s->vi[s->l[p->fi].v0+i]; HPt3Transform(T, (HPoint3 *)(s->p + vi*s->pdim), &p->f[i]); } } } else { p->fi = -1; } if (TN) { p->TprimN = TmNCopy(TN, p->TprimN); memcpy(p->axes, axes, sizeof(p->axes)); } else TmCopy(T, p->Tprim); return s; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/skel/skelsave.c0000644000175000001440000000514010550515421015654 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Save a skel object to a file. * */ #include "skelP.h" Skel *SkelFSave(Skel *s, FILE *f) { int i, j, d, o; float *p; int *vp; Skline *l; /* This one just saves in ASCII format */ if(s == NULL || f == NULL) return NULL; d = s->geomflags & VERT_4D ? s->pdim : s->pdim-1; o = s->geomflags & VERT_4D ? 0 : 1; if (s->vc) fprintf(f, "C"); if (s->geomflags & VERT_4D) fprintf(f, "4"); fprintf(f, s->pdim==4 ? "SKEL" : "nSKEL %d", s->pdim-1); fprintf(f, "\n%d %d\n\n", s->nvert, s->nlines); if (s->pdim == 4) { for (i = 0, p = s->p; i < s->nvert; i++, p += s->pdim) { fputnf(f, d, p, 0); if (s->vc) { fputc(' ', f); fputnf(f, 4, (float *)&s->vc[i], 0); } fputc('\n', f); } fputc('\n', f); } else { for(i = 0, p = s->p; i < s->nvert; i++, p += s->pdim) { fputnf(f, d, p + o, 0); if (s->vc) { fputc(' ', f); fputnf(f, 4, (float *)&s->vc[i], 0); } fputc('\n', f); } fputc('\n', f); } for(i = 0, l = s->l; i < s->nlines; i++, l++) { fprintf(f, "%d\t", l->nv); for(j = 0, vp = &s->vi[l->v0]; j < l->nv; j++, vp++) fprintf(f, "%d ", *vp); if(l->nc > 0) { fputc('\t', f); fputnf(f, 4, &s->c[l->c0].r, 0); } fputc('\n', f); } return ferror(f) ? NULL : s; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/skel/skelbound.c0000644000175000001440000001361410574314057016042 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Return the bounding box of a collection of vectors. * */ #include "skelP.h" /* An extra function for the pure ND case */ static BBox *NSkelBound(Skel *s, Transform T, TransformN *TN) { BBox *result; int n, pdim; HPoint3 min, max, tmp, clean; HPointN ptN[1]; n = s->nvert; pdim = s->pdim; ptN->v = s->p; ptN->dim = pdim; /* First handle the case without transformations, this means that we * return an Nd bbox. */ if (!T && !TN) { HPointN *min; HPointN *max; min = HPtNCopy(ptN, NULL); HPtNDehomogenize(min, min); max = HPtNCopy(min, NULL); while(--n > 0) { ptN->v += pdim; HPtNMinMax(min, max, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, min, CR_NMAX, max, CR_END); HPtNDelete(min); HPtNDelete(max); return result; } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *minN; HPointN *maxN; HPointN *clean; BBox *result; minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); clean = HPtNCreate(s->pdim, NULL); while(--n > 0) { ptN->v += pdim; HPtNTransform(TN, ptN, clean); HPtNMinMax(minN, maxN, clean); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(minN); HPtNDelete(maxN); HPtNDelete(clean); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ HPtNToHPt3(ptN, NULL, &min); HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { ptN->v += pdim; HPtNToHPt3(ptN, NULL, &tmp); HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } BBox *SkelBound(Skel *s, Transform T, TransformN *TN) { int n; HPoint3 min, max, clean, tmp, *p; if (s->pdim > 4) { /* extra function for ND case. */ return NSkelBound(s, T, TN); } n = s->nvert; p = (HPoint3 *)s->p; while(--n >= 0 && !finite(p->x + p->y + p->z + p->w)) ++p; if(n < 0) return NULL; min = *p; /* First handle the case without transformations, this means that we return a 3d bbox for 3d ss, and a 4d bboy for 4d ss. */ if ((T == TM_IDENTITY || !T) && !TN) { if (!T && (s->geomflags & VERT_4D)) { max = min; while(--n >= 0) { Pt4MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_4D, 1, CR_END); } else { HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { HPt3MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *ptN; HPointN *minN; HPointN *maxN; BBox *result; ptN = HPtNCreate(5, NULL); if (s->geomflags & VERT_4D) { Pt4ToHPtN(&min, ptN); } else { HPt3ToHPtN(&min, NULL, ptN); } minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); while(--n >= 0) { if (s->geomflags & VERT_4D) { Pt4ToHPtN(++p, ptN); } else { HPt3ToHPtN(++p, NULL, ptN); } HPtNTransform(TN, ptN, ptN); HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ if (false && (s->geomflags & VERT_4D)) { /* We operate on the 3x3 x,y,z space */ min.w = 1.0; HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = *(++p); tmp.w = 1.0; HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } else { /* ordinary 3d object */ HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = *(++p); HPt3Transform(T, &tmp, &clean); Pt3MinMax(&min, &max, &clean); } } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/skel/Headers0000644000175000001440000000001707730237565015207 00000000000000skel.h skelP.h geomview-1.9.4/src/lib/gprim/skel/skelclass.c0000644000175000001440000000425010514661170016027 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "skelP.h" static GeomClass *aSkelMethods = NULL; int SkelPresent = 1; static char skelName[] = "skel"; char * SkelName() { return skelName; } GeomClass *SkelMethods(void) { if (!aSkelMethods) { aSkelMethods = GeomClassCreate(skelName); aSkelMethods->name = SkelName; aSkelMethods->methods = (GeomMethodsFunc *) SkelMethods; aSkelMethods->create = (GeomCreateFunc *) SkelCreate; aSkelMethods->fload = (GeomFLoadFunc *) SkelFLoad; aSkelMethods->fsave = (GeomFSaveFunc *) SkelFSave; aSkelMethods->bound = (GeomBoundFunc *) SkelBound; aSkelMethods->boundsphere = (GeomBoundSphereFunc *) SkelBoundSphere; aSkelMethods->Delete = (GeomDeleteFunc *) SkelDelete; aSkelMethods->draw = (GeomDrawFunc *) SkelDraw; aSkelMethods->copy = (GeomCopyFunc *) SkelCopy; aSkelMethods->pick = (GeomPickFunc *) SkelPick; aSkelMethods->transform = (GeomTransformFunc *) SkelTransform; aSkelMethods->transformto = (GeomTransformToFunc *) SkelTransform; } return aSkelMethods; } geomview-1.9.4/src/lib/gprim/skel/skeltransform.c0000644000175000001440000000342510514661170016740 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "skelP.h" Skel *SkelTransform( Skel *s, Transform T, TransformN *TN ) { #if 0 if (T && T != TM_IDENTITY) { if(s->pdim == 4) { HPt3TransformN(T, (HPoint3 *)s->p, (HPoint3 *)s->p, s->nvert); } else if (s->pdim > 4) { HPointN *tmp = HPtNCreate(s->dim, NULL); float *tmp_data = tmp->v; int i; for (tmp->v = s->p, i = 0; i < s->nvert; i++, tmp->v += s->dim) { HPtNTransform(T, tmp, tmp); } tmp->v = tmp_data; HPtNDelete(tmp); } } else { OOGLError(1, "Can't SkelTransform() %d-D Skel", s->dim); } #endif return s; } geomview-1.9.4/src/lib/gprim/skel/skelsphere.c0000644000175000001440000000310610517062520016204 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "skelP.h" #include "sphere.h" Geom *SkelBoundSphere(Skel *skel, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere; /* Create a dummy sphere, the center will be corrected later */ sphere = GeomCreate("sphere", CR_SPACE, space, CR_END); SphereEncompassPoints((Sphere *)sphere, skel->p, skel->pdim == 4 && (skel->geomflags & VERT_4D) != 0, skel->pdim, skel->nvert, T, TN, axes); return sphere; } geomview-1.9.4/src/lib/gprim/stub/0000777000175000001440000000000010665240674014012 500000000000000geomview-1.9.4/src/lib/gprim/stub/stubdraw.c0000644000175000001440000000373710455701004015721 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ void CommentDraw() { OOGLWarn("Call to stub CommentDraw"); } void DiscGrpDraw() { OOGLWarn("Call to stub DiscGrpDraw"); } void MeshDraw() { OOGLWarn("Call to stub MeshDraw"); } void NDMeshDraw() { OOGLWarn("Call to stub NDMeshDraw"); } void InstDraw() { OOGLWarn("Call to stub InstDraw"); } void ListDraw() { OOGLWarn("Call to stub ListDraw"); } void QuadDraw() { OOGLWarn("Call to stub QuadDraw"); } void NPolyListDraw() { OOGLWarn("Call to stub NPolyListDraw"); } void PolyListDraw() { OOGLWarn("Call to stub PolyListDraw"); } void BBoxDraw() { OOGLWarn("Call to stub BBoxDraw"); } void BezierDraw() { OOGLWarn("Call to stub BezierDraw"); } void VectDraw() { OOGLWarn("Call to stub VectDraw"); } void TlistDraw() { OOGLWarn("Call to stub TlistDraw"); } void SkelDraw() { OOGLWarn("Call to stub SkelDraw"); } geomview-1.9.4/src/lib/gprim/stub/comment.c0000644000175000001440000000236710455701004015526 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ #include "stub.h" STUBMETHODS(Comment, "Comment", "comment") geomview-1.9.4/src/lib/gprim/stub/sphere.c0000644000175000001440000000307410455701004015346 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" static char prefix[] = "Sphere"; static char lib[] = "sphere"; GeomClass *SphereClass; STUBMETHODS(Sphere, prefix, lib) void SphereEncompassBounds() { StubRoutine(prefix, "EncompassBounds", lib); } void SphereAddHPt3() { StubRoutine(prefix, "AddHPt3", lib); } void MaxDimensionalSpan() { StubRoutine("MaxDimensionalSpan", "", lib); } void SphereUnion3() { StubRoutine(prefix, "Union3", lib); } geomview-1.9.4/src/lib/gprim/stub/polylist.c0000644000175000001440000000233710455701004015740 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(PolyList, "PolyList", "polylist") geomview-1.9.4/src/lib/gprim/stub/bbox.c0000644000175000001440000000232310455701004015006 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(BBox, "BBox", "bbox") geomview-1.9.4/src/lib/gprim/stub/ndmesh.c0000644000175000001440000000233110455701004015331 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(NDMesh, "NDMesh", "ndmesh") geomview-1.9.4/src/lib/gprim/stub/tlist.c0000644000175000001440000000232610455701004015216 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Tlist, "Tlist", "tlist") geomview-1.9.4/src/lib/gprim/stub/Makefile.am0000644000175000001440000000044610455665335015770 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libstub.la libstub_la_SOURCES = \ bbox.c bezier.c bezierlist.c comment.c discgrp.c inst.c lincoln.c list.c mesh.c ndmesh.c npolylist.c polylist.c quad.c skel.c sphere.c stub.c stubdraw.c tlist.c vect.c \ stub.h geomview-1.9.4/src/lib/gprim/stub/Makefile.in0000644000175000001440000004037510665240504015774 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/stub DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libstub_la_LIBADD = am_libstub_la_OBJECTS = bbox.lo bezier.lo bezierlist.lo comment.lo \ discgrp.lo inst.lo lincoln.lo list.lo mesh.lo ndmesh.lo \ npolylist.lo polylist.lo quad.lo skel.lo sphere.lo stub.lo \ stubdraw.lo tlist.lo vect.lo libstub_la_OBJECTS = $(am_libstub_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libstub_la_SOURCES) DIST_SOURCES = $(libstub_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libstub.la libstub_la_SOURCES = \ bbox.c bezier.c bezierlist.c comment.c discgrp.c inst.c lincoln.c list.c mesh.c ndmesh.c npolylist.c polylist.c quad.c skel.c sphere.c stub.c stubdraw.c tlist.c vect.c \ stub.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/stub/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/stub/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libstub.la: $(libstub_la_OBJECTS) $(libstub_la_DEPENDENCIES) $(LINK) $(libstub_la_OBJECTS) $(libstub_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bbox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezier.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezierlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comment.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discgrp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lincoln.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/npolylist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polylist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stub.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stubdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vect.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/stub/inst.c0000644000175000001440000000232310455701004015031 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Inst, "Inst", "inst") geomview-1.9.4/src/lib/gprim/stub/list.c0000644000175000001440000000232310455701004015027 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(List, "List", "list") geomview-1.9.4/src/lib/gprim/stub/mesh.c0000644000175000001440000000232310455701004015010 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Mesh, "Mesh", "mesh") geomview-1.9.4/src/lib/gprim/stub/bezier.c0000644000175000001440000000242110455701004015333 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Bezier, "Bezier", "bezier") void *BezierReDice() { BezierMethods(); return NULL; } geomview-1.9.4/src/lib/gprim/stub/npolylist.c0000644000175000001440000000234210455701004016112 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(NPolyList, "NPolyList", "npolylist") geomview-1.9.4/src/lib/gprim/stub/quad.c0000644000175000001440000000232310455701004015006 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Quad, "Quad", "quad") geomview-1.9.4/src/lib/gprim/stub/skel.c0000644000175000001440000000232310455701004015012 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Skel, "Skel", "skel") geomview-1.9.4/src/lib/gprim/stub/stub.c0000644000175000001440000000311110455701004015025 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geomclass.h" static GeomClass *aStubMethods; void StubRoutine(prefix, rest, lib) char *prefix, *rest, *lib; { OOGLError(1, "Trying to use stub %s%s() routine! Relink with lib%s.a", prefix, rest, lib); } GeomClass * StubMethods(prefix, lib) char *prefix, *lib; { StubRoutine(prefix, "Methods", lib); if(aStubMethods == NULL) aStubMethods = GeomClassCreate("stub"); return aStubMethods; } geomview-1.9.4/src/lib/gprim/stub/stub.h0000644000175000001440000000376710455701004015053 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef STUBDEFS #define STUBDEFS #include "geomclass.h" extern GeomClass *StubMethods(); void StubRoutine(); /* * This file is #include'd by aspiring per-class stub routines. * Each STUBMETHODS() macro creates a Present tag indicating that the * corresponding library is not loaded, and a Methods() routine * which complains if called. * They're useful as components of a libstub.a library used to link with * applications that only need a few of the OOGL object-types. * Assuming classA, classB, etc. are needed, link as in * -lgeom -lclassA -lclassB ... -lgeom -lstub -lbbox -l3d -lm * * Use of the method-specific stubs (e.g. libstubdraw) is quite different; * see stubdraw.c. */ #if defined(__STDC__) || defined(__ANSI_CPP__) #define STUBMETHODS(prefix, meth, lib) \ int prefix##Present = 0; \ GeomClass *prefix##Methods() { return StubMethods(meth, lib); } #else /*plain C*/ #define STUBMETHODS(prefix, meth, lib) \ int prefix/**/Present = 0; \ GeomClass *prefix/**/Methods() { return StubMethods(meth, lib); } #endif #endif geomview-1.9.4/src/lib/gprim/stub/bezierlist.c0000644000175000001440000000234110455701004016230 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(BezierList, "BezierList", "bezier") geomview-1.9.4/src/lib/gprim/stub/vect.c0000644000175000001440000000232310455701004015015 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Vect, "Vect", "vect") geomview-1.9.4/src/lib/gprim/stub/lincoln.c0000644000175000001440000000233410455701004015514 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(Lincoln, "Lincoln", "lincoln") geomview-1.9.4/src/lib/gprim/stub/discgrp.c0000644000175000001440000000236110455701004015511 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stub.h" STUBMETHODS(DiscGrp, "DiscGrp", "dg") GeomClass *DiscGrpClass; geomview-1.9.4/src/lib/gprim/stub/Headers0000644000175000001440000000000707730237642015221 00000000000000stub.h geomview-1.9.4/src/lib/gprim/vect/0000777000175000001440000000000010665240675013777 500000000000000geomview-1.9.4/src/lib/gprim/vect/vectsphere.c0000644000175000001440000000356010560446543016227 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "vectP.h" #include "sphere.h" Geom *VectBoundSphere(Vect *vect, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere; if (TN) { /* Create a dummy sphere, the center will be corrected later */ sphere = GeomCreate("sphere", CR_SPACE, space, CR_END); SphereEncompassPoints((Sphere *)sphere, (float *)vect->p, (vect->geomflags & VERT_4D) ? 4 : 3, 4, vect->nvert, T, TN, axes); } else { if(vect->geomflags & VERT_4D) return GeomBoundSphereFromBBox((Geom *)vect, T, TN, axes, space); sphere = GeomCreate("sphere", CR_ENCOMPASS_POINTS, vect->p, CR_NENCOMPASS_POINTS, vect->nvert, CR_AXIS, T ? T : TM_IDENTITY, CR_SPACE, space, CR_END); } return sphere; } geomview-1.9.4/src/lib/gprim/vect/vectload.c0000644000175000001440000001010310560446534015647 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Create and load a vect object from a file. * */ #include "vectP.h" Vect * VectFLoad(IOBFILE *file, char *fname) { Vect *v; int binary = 0, dimn = 3; char *token; int i; static char badvert[] = "Reading VECT from \"%s\": bad %dth vertex (of %d)"; if (file == NULL) return NULL; token = GeomToken(file); if(*token == '4') { dimn = 4; token++; } if(strcmp(token, "VECT")) return NULL; if(iobfnextc(file, 1) == 'B') { if(iobfexpectstr(file, "BINARY")) return NULL; binary = 1; if(iobfnextc(file, 1) == '\n') (void) iobfgetc(file); /* Toss \n */ } v = OOGLNewE(Vect, "VectFLoad: Vect"); GGeomInit(v, VectMethods(), VECTMAGIC, NULL); v->geomflags = (dimn == 4) ? VERT_4D : 0; v->geomflags = 0; v->vnvert = NULL; v->vncolor = NULL; v->p = NULL; v->c = NULL; if(iobfgetni(file, 1, &v->nvec, binary) <= 0 || iobfgetni(file, 1, &v->nvert, binary) <= 0 || iobfgetni(file, 1, &v->ncolor, binary) <= 0) { OOGLSyntax(file, "Reading VECT from \"%s\": can't read header counts", fname); goto bogus; } if(!vSane(v)) { OOGLSyntax(file, "Reading VECT from \"%s\": inconsistent VECT header counts %d %d %d", fname, v->nvec, v->nvert, v->ncolor); goto bogus; } v->vnvert = OOGLNewNE(short, 2*v->nvec, "VECT nvec counts"); v->p = OOGLNewNE(HPoint3, v->nvert, "VECT vertices"); v->c = OOGLNewNE(ColorA, (v->ncolor>0) ? v->ncolor : 1, "VECT colors"); v->vncolor = v->vnvert + v->nvec; if((i = iobfgetns(file, v->nvec, v->vnvert, binary)) < v->nvec) { OOGLSyntax(file, "Reading VECT from \"%s\": bad vertex count in %d'th polyline (of %d)", fname, i, v->nvec); goto bogus; } if((i = iobfgetns(file, v->nvec, v->vncolor, binary)) < v->nvec) { OOGLSyntax(file, "Reading VECT from \"%s\": bad color count in %d'th polyline (of %d)", fname, i, v->nvec); goto bogus; } /* if the points are 3D points, we have to convert them to the native 4D data structure */ if (dimn == 3) { HPoint3 *p; for(i = v->nvert, p = v->p; --i >= 0; p++) { if (iobfgetnf(file, 3, (float *)p, binary) < 3) { OOGLSyntax(file, badvert, fname, v->nvert - i, v->nvert); goto bogus; } p->w = 1; } } else { i = iobfgetnf(file, 4*v->nvert, (float *)v->p, binary); if(i < 4*v->nvert) { OOGLSyntax(file, badvert, fname, i/4, v->nvert); goto bogus; } } if (v->ncolor > 0 && (i = iobfgetnf(file, 4*v->ncolor, (float *)v->c, binary)) < 4*v->ncolor) { OOGLSyntax(file, "Reading VECT from \"%s\": bad %dth color (of %d)", fname, i/4, v->ncolor); goto bogus; } if(!VectSane(v)) { OOGLError(0, "Reading VECT from \"%s\": VECT polyline/color counts inconsistent with header", fname); goto bogus; } return v; bogus: GeomDelete((Geom *)v); return NULL; } geomview-1.9.4/src/lib/gprim/vect/vectpick.c0000644000175000001440000000720110622716756015670 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include /* for abs() */ #include "vectP.h" #include "pickP.h" #include "appearance.h" Vect *VectPick(Vect *v, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { Point3 plist[2]; int i, j, k, ok[2]; int found, v4d; unsigned int apflag = 0; /* Make sure that the edges do not count as visible - otherwise * they could really mess things up */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_EDGEDRAW; } found = 0; v4d = (v->geomflags & VERT_4D) != 0; for (i = k = 0; i < v->nvec; i++) { int nv = abs(v->vnvert[i]); if (TN) ok[0] = (0 < HPt3NTransPt3(TN, axes, &v->p[k], v4d, &plist[0])); else ok[0] = (0 < HPt3TransPt3(T, &v->p[k], &plist[0])); if(nv == 1) { if(ok[0] && PickFace(1, &plist[0], p, ap)) { found = 1; p->vi = k; } k++; continue; } for (j = 0; j < nv - 1;) { if (TN) ok[1] = (0 < HPt3NTransPt3(TN, axes, &v->p[k + (++j)], v4d, &plist[1])); else ok[1] = (0 < HPt3TransPt3(T, &v->p[k + (++j)], &plist[1])); if ((ok[0]||ok[1]) && PickFace(2, plist, p, ap)) { found = 1; p->vi = p->vi ? k + j : k + j - 1; p->ei[0] = k + j - 1; p->ei[1] = k + j; } ok[0] = ok[1]; plist[0] = plist[1]; } if (v->vnvert[i] < 0) { if (TN) ok[1] = (0 < HPt3NTransPt3(TN, axes, &v->p[k], v4d, &plist[1])); else ok[1] = (0 < HPt3TransPt3(T, &v->p[k], &plist[1])); if ((ok[0]||ok[1]) && PickFace(2, plist, p, ap)) { found = 1; p->vi = p->vi ? k : k + j; p->ei[0] = k + j; p->ei[1] = k; } } k += nv; } if (ap != NULL) ap->flag = apflag; if (!found) return NULL; if (p->found & PW_VERT) { if (TN) HPt3NTransHPt3(TN, axes, &v->p[p->vi], v4d, &p->v); else HPt3Transform(T, &v->p[p->vi], &p->v); } else p->vi = -1; if (p->found & PW_EDGE) { if (TN) { HPt3NTransHPt3(TN, axes, &v->p[p->ei[0]], v4d, &p->e[0]); HPt3NTransHPt3(TN, axes, &v->p[p->ei[1]], v4d, &p->e[1]); } else { HPt3Transform(T, &v->p[p->ei[0]], &p->e[0]); HPt3Transform(T, &v->p[p->ei[1]], &p->e[1]); } } else p->ei[0] = p->ei[1] = -1; /* It really doesn't make sense to claim that we found a face hit...*/ p->found &= ~PW_FACE; p->fi = -1; if (TN) { p->TprimN = TmNCopy(TN, p->TprimN); memcpy(p->axes, axes, sizeof(p->axes)); } else TmCopy(T, p->Tprim); return v; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/vect/vectsave.c0000644000175000001440000000423210461140706015664 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Save a vect object to a file. * */ #include "vectP.h" Vect * VectFSave(v, f) Vect *v; FILE *f; { int i; HPoint3 *p; ColorA *c; /* This one just saves in ASCII format */ if(v == NULL || f == NULL) return NULL; if (v->geomflags & VERT_4D) fprintf(f, "4"); fprintf(f, "VECT\n%d %d %d\n", v->nvec, v->nvert, v->ncolor); for(i = 0; i < v->nvec; i++) fprintf(f, "%d\n", v->vnvert[i]); fputc('\n', f); for(i = 0; i < v->nvec; i++) fprintf(f, "%d\n", v->vncolor[i]); fputc('\n', f); if (v->geomflags & VERT_4D) { for(i = v->nvert, p = v->p; --i >= 0; p++) fprintf(f, "%g %g %g %g\n", p->x, p->y, p->z, p->w); } else { for(i = v->nvert, p = v->p; --i >= 0; p++) fprintf(f, "%g %g %g\n", p->x, p->y, p->z); } fputc('\n', f); for(i = v->ncolor, c = v->c; --i >= 0; c++) fprintf(f, "%.3g %.3g %.3g %.3g\n", c->r, c->g, c->b, c->a); return ferror(f) ? NULL : v; } geomview-1.9.4/src/lib/gprim/vect/vectbound.c0000644000175000001440000000767310574314120016047 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Return the bounding box of a collection of vectors. * */ #include "vectP.h" #include "bboxP.h" BBox *VectBound(Vect *v, Transform T, TransformN *TN) { int n; HPoint3 min, max, clean, tmp, *p; n = v->nvert; p = v->p; while(--n >= 0 && !finite(p->x + p->y + p->z + p->w)) p++; if(n <= 0) return NULL; /* No (finite) points! */ min = *p; /* First handle the case without transformations, this means that we return a 3d bbox for 3d vects, and a 4d bboy for 4d vects. */ if ((T == TM_IDENTITY || !T) && !TN) { if (!T && (v->geomflags & VERT_4D)) { max = min; while(--n >= 0) { Pt4MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_4D, 1, CR_END); } else { HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { Pt3MinMax(&min, &max, ++p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *ptN; HPointN *minN; HPointN *maxN; BBox *result; ptN = HPtNCreate(5, NULL); if (v->geomflags & VERT_4D) { Pt4ToHPtN(&min, ptN); } else { HPt3ToHPtN(&min, NULL, ptN); } minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); while(--n >= 0) { if (v->geomflags & VERT_4D) { Pt4ToHPtN(++p, ptN); } else { HPt3ToHPtN(++p, NULL, ptN); } HPtNTransform(TN, ptN, ptN); HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ if (false && (v->geomflags & VERT_4D)) { /* We operate on the 3x3 x,y,z space */ min.w = 1.0; HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = *(++p); tmp.w = 1.0; HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } else { /* ordinary 3d object */ HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = *(++p); HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/vect/vectclass.c0000644000175000001440000000423310455701005016032 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "vectP.h" static GeomClass *aVectMethods = NULL; int VectPresent = 1; static char vectName[] = "vect"; char * VectName() { return vectName; } GeomClass * VectMethods() { if (!aVectMethods) { aVectMethods = GeomClassCreate(vectName); aVectMethods->name = VectName; aVectMethods->methods = (GeomMethodsFunc *) VectMethods; aVectMethods->create = (GeomCreateFunc *) VectCreate; aVectMethods->fload = (GeomFLoadFunc *) VectFLoad; aVectMethods->fsave = (GeomFSaveFunc *) VectFSave; aVectMethods->bound = (GeomBoundFunc *) VectBound; aVectMethods->boundsphere = (GeomBoundSphereFunc *) VectBoundSphere; aVectMethods->Delete = (GeomDeleteFunc *) VectDelete; aVectMethods->draw = (GeomDrawFunc *) VectDraw; aVectMethods->copy = (GeomCopyFunc *) VectCopy; aVectMethods->pick = (GeomPickFunc *) VectPick; aVectMethods->transform = (GeomTransformFunc *) VectTransform; aVectMethods->transformto = (GeomTransformToFunc *) VectTransformTo; } return aVectMethods; } geomview-1.9.4/src/lib/gprim/vect/Makefile.am0000644000175000001440000000036410455665335015753 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libvect.la libvect_la_SOURCES = \ vectbound.c vectclass.c vectcreate.c vectdraw.c vectload.c vectpick.c vectsave.c vectsphere.c vecttransform.c \ vect.h vectP.h geomview-1.9.4/src/lib/gprim/vect/Makefile.in0000644000175000001440000003673610665240505015767 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/vect DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libvect_la_LIBADD = am_libvect_la_OBJECTS = vectbound.lo vectclass.lo vectcreate.lo \ vectdraw.lo vectload.lo vectpick.lo vectsave.lo vectsphere.lo \ vecttransform.lo libvect_la_OBJECTS = $(am_libvect_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libvect_la_SOURCES) DIST_SOURCES = $(libvect_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libvect.la libvect_la_SOURCES = \ vectbound.c vectclass.c vectcreate.c vectdraw.c vectload.c vectpick.c vectsave.c vectsphere.c vecttransform.c \ vect.h vectP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/vect/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/vect/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libvect.la: $(libvect_la_OBJECTS) $(libvect_la_DEPENDENCIES) $(LINK) $(libvect_la_OBJECTS) $(libvect_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vecttransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/vect/vectcreate.c0000644000175000001440000001441510560446524016204 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "vectP.h" /* * Vect object creation, editing, copying, deletion. */ Vect * VectCopy(Vect *ov) { Vect *v; if (ov == NULL) return (NULL); v = OOGLNewE(Vect, "new Vect"); *v = *ov; v->p = OOGLNewNE(HPoint3, ov->nvert, "Vect vertices"); v->c = ov->ncolor ? OOGLNewNE(ColorA, ov->ncolor, "Vect colors") : NULL; v->vnvert = OOGLNewNE(short, ov->nvec, "Vect nverts"); v->vncolor = OOGLNewNE(short, ov->nvec, "Vect nverts"); memcpy(v->p, ov->p, ov->nvert * sizeof(HPoint3)); memcpy(v->c, ov->c, ov->ncolor * sizeof(ColorA)); memcpy(v->vnvert, ov->vnvert, ov->nvec * sizeof(short)); memcpy(v->vncolor, ov->vncolor, ov->nvec * sizeof(short)); return(v); } void VectDelete( Vect *v ) { if (v) { if(v->p != NULL) OOGLFree(v->p); if(v->c != NULL) OOGLFree(v->c); if(v->vnvert != NULL) OOGLFree(v->vnvert); } } Vect * VectCreate ( Vect *exist, GeomClass *classp, va_list *a_list ) { Vect *vect; int attr, copy = 1; int police = 1; /* by default, check the input to see it's good */ short *vectcounts; /* vectcounts[0..nvec-1] */ short *colorcounts; /* colorcounts[0..nvec-1] */ Point3 *v3; HPoint3 *v4; /* vertices[0..nvert-1] */ ColorA *colors; /* colors[0..ncolor-1] */ if (exist == NULL) { vect = OOGLNewE(Vect, "new vect"); GGeomInit (vect, classp, VECTMAGIC, NULL); vect->nvec = 0; vect->nvert = 0; vect->ncolor = 0; vect->p = NULL; vect->c = NULL; vect->vnvert = NULL; vect->vncolor = NULL; } else { /* Should check that exist is a vect */ vect = exist; } while ((attr = va_arg (*a_list, int))) switch (attr) { case CR_POLICE: police = 1; break; case CR_NOPOLICE: police = 0; break; case CR_FLAG: vect->geomflags = va_arg (*a_list, int); break; case CR_NVECT: vect->nvec = va_arg (*a_list, int); break; case CR_NVERT: vect->nvert = va_arg (*a_list, int); break; case CR_NCOLR: vect->ncolor = va_arg (*a_list, int); break; case CR_VECTC: vectcounts = va_arg (*a_list, short *); if(vect->vnvert) OOGLFree(vect->vnvert); if (vectcounts == NULL) { vect->vnvert = NULL; vect->nvert = 0; } else if (copy) { vect->vnvert = OOGLNewNE(short, vect->nvec, "vect vert counts"); memcpy(vect->vnvert, vectcounts, vect->nvec*sizeof(*vect->vnvert)); } else { vect->vnvert = vectcounts; } break; case CR_COLRC: colorcounts = va_arg (*a_list, short *); if(vect->vncolor) OOGLFree(vect->vncolor); if (colorcounts == NULL) { vect->vncolor = NULL; vect->nvert = 0; } else if (copy) { vect->vncolor = OOGLNewNE(short, vect->nvec, "vect vert counts"); memcpy(vect->vncolor, colorcounts, vect->nvec*sizeof(*vect->vncolor)); } else { vect->vncolor = colorcounts; } break; case CR_POINT: v3 = va_arg (*a_list, Point3 *); if(vect->p) OOGLFree(vect->p); if (v3 == NULL) { vect->p = NULL; vect->nvert = 0; } else { vect->p = OOGLNewNE(HPoint3, vect->nvert, "vect points"); Pt3ToHPt3(v3, vect->p, vect->nvert); if(!copy) OOGLFree(v3); } break; case CR_POINT4: v4 = va_arg (*a_list, HPoint3 *); if(vect->p) OOGLFree(vect->p); if (v4 == NULL) { vect->p = NULL; vect->nvert = 0; } else if (copy) { vect->p = OOGLNewNE(HPoint3, vect->nvert, "vect points"); memcpy(vect->p, v4, vect->nvert*sizeof(HPoint3)); } else { vect->p = v4; } break; case CR_COLOR: colors = va_arg (*a_list, ColorA *); if(vect->c) OOGLFree(vect->c); if (colors == NULL) { vect->c = NULL; vect->ncolor = 0; } else if (copy) { vect->c = OOGLNewNE(ColorA, vect->ncolor, "vect colors"); memcpy(vect->c, colors, vect->ncolor*sizeof(ColorA)); } else { vect->c = colors; } break; default: if (GeomDecorate (vect, ©, attr, a_list)) { OOGLError (0, "VectCreate: Undefined option: %d\n", attr); OOGLFree (vect); return NULL; } } if (police) { if(0 > vect->ncolor || 0 > vect->nvec ) OOGLError(0, "VectCreate: ncol=%d nvert=%d; need 0ncolor, vect->nvert); if ( 0 > vect->nvec || vect->nvec > vect->nvert || vect->nvert > 99999999) { OOGLError (0, "VectCreate: nvec=%d, nvert=%d; need 0<=nvec<=nvert<=1e8", vect->nvec, vect->nvert); return(NULL); } if (!VectSane(vect)) { OOGLError (0, "VectCreate: Bogus data supplied"); GeomDelete((Geom *)vect); return NULL; } } /* end police work */ if (exist != NULL) return exist; return vect; } int VectSane(vect) Vect *vect; { int i; int vleft, cleft; short *p, *c; if(!vSane(vect)) return(0); vleft = vect->nvert; cleft = vect->ncolor; for(i = vect->nvec, p = vect->vnvert, c = vect->vncolor; --i >= 0; p++, c++) { if(*p == 0 || (vleft -= vcount(*p)) < 0) return(0); if(*c < 0 || (cleft -= *c) < 0) return(0); } if(vleft || cleft) return(0); return(1); } geomview-1.9.4/src/lib/gprim/vect/vectP.h0000644000175000001440000000642710560435643015151 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef VECTPDEF #define VECTPDEF #include "geomclass.h" #include "vect.h" /* * A Vect is a collection of polylines. * It's represented by: * p, an array of vertices (for all the polylines in sequence), * c, an array of r/g/b/alpha colors (not necessarily one per vertex), * vnvert, an array of sizes (vertex counts) of each polyline, * vncolor, an array of numbers of colors (c[] entry counts) of each polyline, * nvec, giving the number of polylines (entries in vnvert and vncolor), * nvert, giving the total number of vertices (entries in p), * ncolor, the total number of colors (entries in c). * * Here's the association: * Let vN = sum from i = 0 to N-1 of vnvert[i], * and cN = sum from i = 0 to N-1 of vncolor[i], * then polyline N comprises the vnvert[N] vertices * from p[vN] through p[vN + vnvert[N] - 1] * and is drawn using the vncolor[N] different colors * from c[cN] through c[cN + vncolor[N] - 1]. * * This encoding implies colors and vertices may not be reused from line to * line (but the previous color persists for lines with 0 colors, see below). * * Closed polylines: * A polyline is drawn closed (the last element connected to the first) * if its vnvert[N] is negative. It's then considered to have * abs(vnvert[N]) vertices in the p[] array. * * A polyline with 1 vertex is a point. 0 vertices are illegal. * * Coloring: * It's intended that polylines will be specified with either * 0, 1, or abs(vnvert[N]) colors. The effects in each case are: * 0: the polyline is drawn with the same color as the previous polyline. * 1: the polyline is drawn with the specified single color. * abs(vnvert[N]): each vertex is colored with the specified color. * intermediate points on the line are interpolated. */ struct Vect { GEOMFIELDS; int nvec, nvert, ncolor; short *vnvert; /* vnvert[nvec] (# p[]'s per vec) */ short *vncolor; /* vncolor[nvec] (# c[]'s per vec) */ /* NOTE: vnvert and vncolor lie in a *single* malloc'ed area */ /* To free, OOGLFree(vnvert). */ HPoint3 *p; /* p[nvert] */ ColorA *c; /* c[ncolor] */ }; extern Vect *VectCreate( Vect *, GeomClass *, va_list *a_list); extern void VectDelete( Vect * ); extern Vect *VectCopy( Vect * ); extern Vect *VectPick( Vect *, Pick *, Appearance *, Transform, TransformN *, int *axes ); #endif /*VECTPDEF*/ geomview-1.9.4/src/lib/gprim/vect/vect.h0000644000175000001440000000344110455701005015011 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef VECTDEF #define VECTDEF #ifndef NULL #define NULL 0 #endif #include /* abs() */ #include "bbox.h" #define VECT_MAGIC 0x4ac95203 /* For binary external format */ #define VECTMAGIC GeomMagic ('v', 1) /* For checking whether a vect. */ typedef struct Vect Vect; #define vcount(code) (abs(code)) #define vwrapped(code) ((code) < 0) #define vSane(v) (0 <= (v)->ncolor && (v)->ncolor <= (v)->nvert && \ (v)->nvec <= (v)->nvert && (v)->nvert < 9999999) GeomClass *VectMethods(); char *VectName(); Vect *VectLoad(); Vect *VectFLoad(); Vect *VectSave(); Vect *VectFSave(); BBox *VectBound(); Geom *VectBoundSphere(); Vect *VectDraw(); int VectShare(); int VectPrivate(); void RendLine(); Vect *VectTransform( Vect *, Transform ); Vect *VectTransformTo(Vect *, Transform ); int VectSane(Vect *); #endif /*VECTDEF*/ geomview-1.9.4/src/lib/gprim/vect/vecttransform.c0000644000175000001440000000267010455701005016743 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "hpoint3.h" #include "vectP.h" Vect * VectTransform( v, T ) Vect *v; Transform T; { HPt3TransformN(T, v->p, v->p, v->nvert); return(v); } Vect * VectTransformTo( v, T ) Vect *v; Transform T; { return(VectTransform(v, T)); } geomview-1.9.4/src/lib/gprim/vect/Headers0000644000175000001440000000001707730237735015211 00000000000000vect.h vectP.h geomview-1.9.4/src/lib/gprim/vect/vectdraw.c0000644000175000001440000001212210560636726015674 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: * Draw a Vect (collection of vectors). * */ #include "mgP.h" #include "vectP.h" #include "hpointn.h" #include "transformn.h" #include "cmodel.h" #include #ifndef alloca #include #endif static void draw_projected_vect(mgNDctx *NDctx, Vect *v, int flags, int penultimate, int hascolor) { HPointN *h = HPtNCreate(5, NULL); HPoint3 *p, *op, *np, *newp; ColorA *lastcolor = NULL, *c, *newc; int i, nc = 0, colored = 0; mgNDmapfunc mapHPtN = NDctx->mapHPtN; newp = (HPoint3 *)alloca(v->nvert*sizeof(HPoint3)); newc = (ColorA *)alloca(v->nvert*sizeof(ColorA)); if (v->geomflags & VERT_4D) { for(i = 0, op = v->p, np = newp; i < v->nvert; i++, op++, np++) { Pt4ToHPtN(op, h); colored = mapHPtN(NDctx, h, np, &newc[i]); } } else { for(i = 0, op = v->p, np = newp; i < v->nvert; i++, op++, np++) { HPt3ToHPtN(op, NULL, h); colored = mapHPtN(NDctx, h, np, &newc[i]); } } if (!hascolor) colored = 0; for(i = 0, p = newp, c = colored ? newc : v->c; i < v->nvec; i++) { int nv; nv = vcount(v->vnvert[i]); if(colored) nc = nv; else if (hascolor) nc = v->vncolor[i]; flags |= vwrapped(v->vnvert[i]); if(nc==0) if(lastcolor) mgpolyline(nv,p,1,lastcolor, flags); else mgpolyline(nv,p,nc,c,flags); else mgpolyline(nv,p,nc, lastcolor=c, flags); p += nv; if (hascolor) c += nc; flags = (i < penultimate) ? 6 : 2; /* 2: not first batch member */ } HPtNDelete(h); } Vect * VectDraw(v) Vect *v; { HPoint3 *p; ColorA *c; ColorA edgecolor; int n, hascolor, nc; int flags, penultimate; ColorA *lastcolor=NULL; const Appearance *ap = &_mgc->astk->ap; mgNDctx *NDctx = NULL; /* Don't draw if vect-drawing is off. */ if (v == NULL || (ap->flag & APF_VECTDRAW) == 0) return NULL; /* draw in conformal model if necessary */ if (_mgc->space & TM_CONFORMAL_BALL) { cmodel_clear(_mgc->space); cm_read_vect(v); cmodel_draw(0); return v; } p = v->p; c = v->c; hascolor = (v->ncolor > 0) && !(ap->mat && (ap->mat->override & MTF_EDGECOLOR)); if (!hascolor && ap->mat) { *(Color *)(void *)&edgecolor = ap->mat->edgecolor; edgecolor.a = 1; c = &edgecolor; nc = 1; } flags = v->nvec > 1 ? 4 : 0; /* 4: not last mbr of batch of lines */ penultimate = v->nvec - 2; mgctxget(MG_NDCTX, &NDctx); if(NDctx) { draw_projected_vect(NDctx, v, flags, penultimate, hascolor); return v; } if(_mgc->astk->ap.flag & APF_SHADELINES && _mgc->astk->flags & MGASTK_SHADER) { ColorA *cs = (ColorA *)alloca(v->nvert * sizeof(ColorA)); HPoint3 *tp = p; ColorA *tc = c - hascolor; ColorA *tcs = cs; if(!(_mgc->has & HAS_CPOS)) mg_findcam(); for(n = 0; n < v->nvec; n++) { int i, nv = vcount(v->vnvert[n]); nc = hascolor ? v->vncolor[n] : 0; if(nc > 0) tc++; for(i = 0; i < nv; i++, tp++, tcs++) { (*_mgc->astk->shader)(1, tp, &_mgc->camZ, tc, tcs); if(nc > 1) { tc++; nc--; } } } tcs = cs; nc = v->nvert; hascolor = 0; for(n = 0; n < v->nvec; n++) { int nv = vcount(v->vnvert[n]); flags |= vwrapped(v->vnvert[n]); mgpolyline(nv, p, nv, tcs, flags); /* One color per vert */ tcs += nv; p += nv; flags = (n < penultimate) ? 6 : 2; } return v; } for(n = 0; n < v->nvec; n++) { int nv; nv = vcount(v->vnvert[n]); if (hascolor) nc = v->vncolor[n]; flags |= vwrapped(v->vnvert[n]); if(nc == 0) if(lastcolor) mgpolyline(nv, p, 1, lastcolor, flags); else mgpolyline(nv, p, nc, c, flags); else mgpolyline(nv,p,nc,lastcolor=c, flags); p += nv; if (hascolor) c += nc; flags = (n < penultimate) ? 6 : 2; /* 2: not first batch member */ } return v; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/comment/0000777000175000001440000000000010665240672014475 500000000000000geomview-1.9.4/src/lib/gprim/comment/commentstream.c0000644000175000001440000000615410571314275017436 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ #include #include "commentP.h" #include "streampool.h" #include "handleP.h" static char * fbalanced(IOBFILE *file) { int depth = 1; int bufsize = 10240; char *buf = OOGLNewNE(char, bufsize, "Comment data"); char *bufp = buf; if (iobfexpectstr(file, "{")) return NULL; do { int c = EOF; if (bufp - buf >= bufsize - 2) buf = OOGLRenewNE(char, buf, bufsize += 10240, "Comment data"); while (bufp - buf < bufsize - 2) { *bufp++ = c = iobfgetc(file); if (c == '{' || c == '}') { break; } } switch(c) { case '}': depth--; break; case '{': depth++; break; } } while (depth > 0); *--bufp = '\0'; return OOGLRenewNE(char, buf, strlen(buf)+1, "Comment data"); } Geom * CommentImport( Pool *p ) { char *str; Comment *comment; IOBFILE *file; if (p == NULL || (file = PoolInputFile(p)) == NULL) return NULL; if (strcmp(GeomToken(file), "COMMENT")) return NULL; comment = (Comment *)GeomCCreate(NULL, CommentMethods(), NULL); if ((str = iobftoken(file, 0)) == NULL) return NULL; comment->name = OOGLNewNE(char, strlen(str)+1, "Comment name"); strcpy(comment->name, str); if ((str = iobftoken(file, 0)) == NULL) return NULL; comment->type = OOGLNewNE(char, strlen(str)+1, "Comment type"); strcpy(comment->type, str); if (iobfnextc(file, 0) == '{' ) { comment->data = fbalanced(file); /* read until '}' */ } else { if (iobfgetni(file, 1, &comment->length, 0) != 1) return NULL; if (comment->length == 0) return NULL; if (iobfexpectstr(file, " ")) return NULL; comment->data = OOGLNewNE(char, comment->length, "Comment data"); if (iobfread(comment->data, comment->length, 1, file) != 1) return NULL; } return (Geom *)comment; } int CommentExport( Comment *comment, Pool *pool ) { if (comment == NULL || pool == NULL || pool->outf == NULL) return 0; (void) CommentFSave(comment, pool->outf, ""); return 1; } geomview-1.9.4/src/lib/gprim/comment/comment.h0000644000175000001440000000312210455701002016204 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ #ifndef COMMENTDEFS #define COMMENTDEFS /* * Private definitions for Comments */ #include "bbox.h" typedef struct Comment Comment; extern GeomClass *CommentClass; /* Public read-only; valid only * after first call to CommentMethods() */ extern GeomClass *CommentMethods( void ); extern Geom *CommentImport( Pool *p ); extern int CommentExport( Comment *, Pool * ); extern Comment *CommentLoad( char * ); extern Comment *CommentFLoad( FILE *, char *name ); extern Comment *CommentSave( Comment *, char * ); extern Comment *CommentFSave( Comment *, FILE *, char * ); #endif /*COMMENTDEFS*/ geomview-1.9.4/src/lib/gprim/comment/commentsave.c0000644000175000001440000000375110461140705017072 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ /* * Save an Comment in a file. */ #include #include "commentP.h" Comment * CommentFSave( comment, file, fname ) Comment *comment; FILE *file; char *fname; { if(comment == NULL || file == NULL) return NULL; fprintf(file, "COMMENT %s %s", comment->name, comment->type); if (comment->length == 0) fprintf(file, " {%s}\n", comment->data); else { fprintf(file, " %d ", comment->length); fwrite(comment->data, comment->length, 1, file); fprintf(file, "\n"); } return comment; } Comment * CommentSave( comment, name ) Comment *comment; char *name; { FILE *file; file = fopen( name, "w" ); if( file == NULL ) { perror( name ); return NULL; } comment = CommentFSave( comment, file, name ); fclose(file); return comment; } geomview-1.9.4/src/lib/gprim/comment/commentclass.c0000644000175000001440000000410410521736720017237 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ #include "commentP.h" GeomClass *CommentClass = NULL; int CommentPresent = 1; static char commentName[] = "comment"; char * CommentName() { return commentName; } /* Comments should NOT be pickable... Mon Jun 20 19:46:55 1994 TMM */ static Geom * CommentPick(Geom *g, Pick *p, Appearance *ap, Transform T, TransformN *TN) { return NULL; } GeomClass * CommentMethods() { if( !CommentClass ) { CommentClass = GeomClassCreate(commentName); CommentClass->name = CommentName; CommentClass->methods = (GeomMethodsFunc *)CommentMethods; CommentClass->create = (GeomCreateFunc *)CommentCreate; CommentClass->Delete = (GeomDeleteFunc *)CommentDelete; CommentClass->copy = (GeomCopyFunc *)CommentCopy; CommentClass->pick = (GeomPickFunc *)CommentPick; CommentClass->import = CommentImport; CommentClass->export = (GeomExportFunc *)CommentExport; } return CommentClass; } geomview-1.9.4/src/lib/gprim/comment/Makefile.am0000644000175000001440000000031710455665331016446 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcomment.la libcomment_la_SOURCES = \ commentclass.c commentcreate.c commentsave.c commentstream.c \ comment.h commentP.h geomview-1.9.4/src/lib/gprim/comment/Makefile.in0000644000175000001440000003610310665240503016452 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/comment DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcomment_la_LIBADD = am_libcomment_la_OBJECTS = commentclass.lo commentcreate.lo \ commentsave.lo commentstream.lo libcomment_la_OBJECTS = $(am_libcomment_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libcomment_la_SOURCES) DIST_SOURCES = $(libcomment_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcomment.la libcomment_la_SOURCES = \ commentclass.c commentcreate.c commentsave.c commentstream.c \ comment.h commentP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/comment/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/comment/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libcomment.la: $(libcomment_la_OBJECTS) $(libcomment_la_DEPENDENCIES) $(LINK) $(libcomment_la_OBJECTS) $(libcomment_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commentclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commentcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commentsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commentstream.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/comment/commentP.h0000644000175000001440000000324310511417162016334 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ #ifndef COMMENTPDEFS #define COMMENTPDEFS /* * Private definitions for Comments. */ #include "comment.h" #include "bboxP.h" /* includes geomclass.h */ #define COMMENTMAGIC GeomMagic('c', 1) struct Comment { GEOMFIELDS; char *name; char *type; int length; /* 0 if data is ASCII */ char *data; }; extern GeomClass *CommentClass; /* Public read-only; valid only * after first call to CommentMethods() */ extern Comment *CommentCreate( Comment *exist, GeomClass *Class, va_list *attrs ); extern void CommentDelete( Comment * ); extern Comment *CommentCopy( Comment * ); extern Comment *CommentDice( Comment *, int nu, int nv ); #endif /*COMMENTPDEFS*/ geomview-1.9.4/src/lib/gprim/comment/commentcreate.c0000644000175000001440000000557610571314243017410 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Nathaniel Thurston */ /* * Comment creation, editing, retrieval and deletion. */ #include "commentP.h" #include "transobj.h" void CommentDelete(Comment *comment) { if (comment) { if (comment->name) OOGLFree(comment->name); if (comment->type) OOGLFree(comment->type); if (comment->data) OOGLFree(comment->data); } } Comment * CommentCopy(Comment *comment) { Comment *nc; int datalength = comment->length; if (datalength == 0) datalength = strlen(comment->data)+1; nc = OOGLNewE(Comment, "CommentCopy: Comment"); GGeomInit(nc, comment->Class, comment->magic, NULL); nc->name = OOGLNewNE(char, strlen(comment->name)+1, "Comment name"); nc->type = OOGLNewNE(char, strlen(comment->type)+1, "Comment type"); nc->data = OOGLNewNE(char, datalength, "Comment data"); strcpy(nc->name, comment->name); strcpy(nc->type, comment->type); nc->length = comment->length; strcpy(nc->data, comment->data); return(nc); } Comment * CommentCreate (Comment *exist, GeomClass *classp, va_list *a_list) { Comment *comment; int attr; int copy = 1; if (exist == NULL) { comment = OOGLNewE(Comment, "CommentCreate comment"); GGeomInit (comment, classp, COMMENTMAGIC, NULL); comment->name = NULL; comment->type = NULL; comment->length = 0; comment->data = NULL; } else { /* Check that exist is an comment. */ comment = exist; } while ((attr = va_arg (*a_list, int))) { switch(attr) { default: if (GeomDecorate(comment, ©, attr, a_list)) { OOGLError (0, "CommentCreate: Undefined option: %d", attr); if (exist == NULL) GeomDelete ((Geom *)comment); return NULL; } } } return comment; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/comment/Headers0000644000175000001440000000002507730237020015674 00000000000000comment.h commentP.h geomview-1.9.4/src/lib/gprim/discgrp/0000777000175000001440000000000010665240672014466 500000000000000geomview-1.9.4/src/lib/gprim/discgrp/dgdelete.c0000644000175000001440000000377110455701002016315 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrpP.h" DiscGrpElList * DiscGrpElListDelete (DiscGrpElList *exist) { if (exist) { if (exist->el_list) OOGLFree(exist->el_list); OOGLFree(exist); } return NULL; } DiscGrp * DiscGrpDelete(dg) DiscGrp *dg; { if (dg) { if (dg->name) OOGLFree(dg->name); if (dg->comment) OOGLFree(dg->comment); if (dg->fsa) OOGLFree(dg->fsa); if (dg->gens) { if (dg->gens->el_list) OOGLFree(dg->gens->el_list); OOGLFree(dg->gens); } if (dg->nhbr_list) { if (dg->nhbr_list->el_list) OOGLFree(dg->nhbr_list->el_list); OOGLFree(dg->nhbr_list); } if (dg->big_list) { if (dg->big_list->el_list) OOGLFree(dg->big_list->el_list); OOGLFree(dg->big_list); } if (dg->geom && dg->geom != dg->ddgeom) GeomDelete(dg->geom); if (dg->ddgeom) GeomDelete(dg->ddgeom); } return NULL; } geomview-1.9.4/src/lib/gprim/discgrp/extern.h0000644000175000001440000000255610455701002016052 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include #include "color.h" typedef double vec4[4]; /* in xform.c */ extern proj_matrix *matmatmul4 (); extern vec4 *vecmatmul4 (); extern vec4 *matvecmul4 (); /* in projective.c */ extern vec4 *conf2proj (); extern vec4 *proj2conf (); extern vec4 *hs2ball (); extern proj_matrix *sl2c2proj (); /* in polyhedron.c */ extern Geom *WEPolyhedronToPolyList(); extern Geom *WEPolyhedronToVect(); /* colormap.c */ extern int readcmap(); extern ColorA GetCmapEntry(); geomview-1.9.4/src/lib/gprim/discgrp/complex.c0000644000175000001440000001151210461140705016203 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "options.h" #include "complex.h" complex one = {1.0, 0.0}; complex zero = {0.0, 0.0}; complex cplx_plus(z0, z1) complex z0, z1; { complex sum; sum.real = z0.real + z1.real; sum.imag = z0.imag + z1.imag; return(sum); } complex cplx_minus(z0, z1) complex z0, z1; { complex diff; diff.real = z0.real - z1.real; diff.imag = z0.imag - z1.imag; return(diff); } complex cplx_div(z0, z1) complex z0, z1; { double mod_sq; complex quotient; mod_sq = z1.real * z1.real + z1.imag * z1.imag; quotient.real = (z0.real * z1.real + z0.imag * z1.imag)/mod_sq; quotient.imag = (z0.imag * z1.real - z0.real * z1.imag)/mod_sq; return(quotient); } complex cplx_mult(z0, z1) complex z0, z1; { complex product; product.real = z0.real * z1.real - z0.imag * z1.imag; product.imag = z0.real * z1.imag + z0.imag * z1.real; return(product); } double modulus(z0) complex z0; { return( sqrt(z0.real * z0.real + z0.imag * z0.imag) ); } complex cplx_sqrt(z) complex z; { double mod, arg; complex result; mod = sqrt(modulus(z)); if (mod == 0.0) return(zero); arg = 0.5 * atan2(z.imag, z.real); result.real = mod * cos(arg); result.imag = mod * sin(arg); return(result); } void sl2c_mult(a, b, product) sl2c_matrix a, b, product; { sl2c_matrix temp; temp[0][0] = cplx_plus(cplx_mult(a[0][0], b[0][0]), cplx_mult(a[0][1], b[1][0])); temp[0][1] = cplx_plus(cplx_mult(a[0][0], b[0][1]), cplx_mult(a[0][1], b[1][1])); temp[1][0] = cplx_plus(cplx_mult(a[1][0], b[0][0]), cplx_mult(a[1][1], b[1][0])); temp[1][1] = cplx_plus(cplx_mult(a[1][0], b[0][1]), cplx_mult(a[1][1], b[1][1])); product[0][0] = temp[0][0]; product[0][1] = temp[0][1]; product[1][0] = temp[1][0]; product[1][1] = temp[1][1]; return; } void sl2c_copy(a, b) sl2c_matrix a, b; { a[0][0] = b[0][0]; a[0][1] = b[0][1]; a[1][0] = b[1][0]; a[1][1] = b[1][1]; return; } /* normalizes a matrix to have determinant one */ void sl2c_normalize(a) sl2c_matrix a; { complex det, factor; double arg, mod; /* compute determinant */ det = cplx_minus(cplx_mult(a[0][0], a[1][1]), cplx_mult(a[0][1], a[1][0])); if (det.real == 0.0 && det.imag == 0.0) { printf("singular sl2c_matrix\n"); exit(0); } /* convert to polar coordinates */ arg = atan2(det.imag, det.real); mod = modulus(det); /* take square root */ arg *= 0.5; mod = sqrt(mod); /* take reciprocal */ arg = -arg; mod = 1.0/mod; /* return to rectangular coordinates */ factor.real = mod * cos(arg); factor.imag = mod * sin(arg); /* normalize matrix */ a[0][0] = cplx_mult(a[0][0], factor); a[0][1] = cplx_mult(a[0][1], factor); a[1][0] = cplx_mult(a[1][0], factor); a[1][1] = cplx_mult(a[1][1], factor); return; } /* inverts a matrix; assumes determinant is already one */ void sl2c_invert(a, a_inv) sl2c_matrix a, a_inv; { complex temp; temp = a[0][0]; a_inv[0][0] = a[1][1]; a_inv[1][1] = temp; a_inv[0][1].real = -a[0][1].real; a_inv[0][1].imag = -a[0][1].imag; a_inv[1][0].real = -a[1][0].real; a_inv[1][0].imag = -a[1][0].imag; return; } /* computes the square of the norm of a matrix */ /* relies on the assumption that the sl2c matrix is stored in memory as 8 consecutive doubles */ /* IS THIS RELIABLE? */ double sl2c_norm_squared(a) sl2c_matrix a; { int i; double *p; double sum; p = (double *) a; sum = 0.0; for (i=8; --i>=0; ) { sum += *p * *p; p++; } return(sum); } void sl2c_adjoint(a, ad_a) sl2c_matrix a, ad_a; { complex temp; /* transpose */ temp = a[0][1]; ad_a[0][0] = a[0][0]; ad_a[0][1] = a[1][0]; ad_a[1][0] = temp; ad_a[1][1] = a[1][1]; /* conjugate */ ad_a[0][0].imag = -ad_a[0][0].imag; ad_a[0][1].imag = -ad_a[0][1].imag; ad_a[1][0].imag = -ad_a[1][0].imag; ad_a[1][1].imag = -ad_a[1][1].imag; return; } geomview-1.9.4/src/lib/gprim/discgrp/complex.h0000644000175000001440000000361510455701003016212 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _complex_ #define _complex_ #include typedef struct { double real, imag; } complex; typedef complex sl2c_matrix[2][2]; #ifndef PROTOTYPES Please #include options.h BEFORE complex.h. #endif #if PROTOTYPES extern complex cplx_minus(complex, complex), cplx_plus(complex, complex), cplx_mult(complex, complex), cplx_div(complex, complex); extern double modulus(complex); extern complex cplx_sqrt(complex); extern void sl2c_mult(sl2c_matrix, sl2c_matrix, sl2c_matrix); extern void sl2c_copy(sl2c_matrix, sl2c_matrix); extern void sl2c_normalize(sl2c_matrix); extern void sl2c_invert(sl2c_matrix, sl2c_matrix); extern double sl2c_norm_squared(sl2c_matrix); extern void sl2c_adjoint(sl2c_matrix, sl2c_matrix); extern double acosh(double); #else extern complex cplx_minus(), cplx_plus(), cplx_mult(), cplx_div(); extern double modulus(); extern complex cplx_sqrt(); extern double sl2c_norm_squared(); /*extern double acosh();*/ #endif extern complex zero; extern complex one; #endif geomview-1.9.4/src/lib/gprim/discgrp/dgcreate.c0000644000175000001440000002457510600215312016317 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrp.h" #include "discgrpP.h" DiscGrp * DiscGrpSetPreDraw( DiscGrp *dg, void (*predraw)() ) { dg->predraw = predraw; return (dg); } DiscGrpElList * DiscGrpElListCreate (DiscGrpElList *exist, ...) { va_list a_list; DiscGrpElList *dgellist; DiscGrpEl *passedin; Transform *tformin; ColorA *colorin; char (*wordin)[DG_WORDLENGTH] = NULL; int *attrin; int attr, copy = 1; int i; va_start (a_list, exist); if (exist == NULL) { dgellist = OOGLNewE(DiscGrpElList, "DiscGrpElListCreate discgrp"); memset(dgellist, 0, sizeof(DiscGrpElList)); } else (dgellist = exist); while ((attr = va_arg (a_list, int))) switch (attr) { case CR_NELEM: dgellist->num_el = va_arg (a_list, int); if (dgellist->el_list) OOGLFree(dgellist->el_list); dgellist->el_list = OOGLNewNE(DiscGrpEl, dgellist->num_el, "DiscGrpElListCreate: unable to allocate"); memset(dgellist->el_list, 0, sizeof(DiscGrpEl) * dgellist->num_el); break; case DGCR_ELEM: /* already packed up */ passedin = va_arg (a_list, DiscGrpEl *); if (copy) { for (i=0; inum_el; ++i) { dgellist->el_list[i] = passedin[i]; TmCopy(passedin[i].tform, dgellist->el_list[i].tform); } } else { if (dgellist->el_list) OOGLFree(dgellist->el_list); dgellist->el_list = passedin; } break; case CR_ELEM: tformin = va_arg (a_list, Transform *); for (i=0; inum_el; ++i) TmCopy(tformin[i], dgellist->el_list[i].tform); break; case CR_COLOR: colorin = va_arg (a_list, ColorA *); for (i=0; inum_el; ++i) dgellist->el_list[i].color = colorin[i]; break; /* we assume attributes is constant for this list */ case DGCR_ATTRIBUTE: attr = va_arg (a_list, int); for (i=0; inum_el; ++i) dgellist->el_list[i].attributes = attr; break; /* or can be passed in as a list */ case DGCR_ATTRIBUTELIST: attrin = va_arg (a_list, int *); for (i=0; inum_el; ++i) dgellist->el_list[i].attributes = attrin[i]; break; case DGCR_WORD: wordin = (char (*)[DG_WORDLENGTH] ) va_arg (a_list, char *); for (i=0; inum_el; ++i) strcpy(dgellist->el_list[i].word, wordin[i]); break; default: if (GeomDecorate (dgellist, ©, attr, &a_list)) { GeomError (0, "DiscGrpElListCreate: Undefined option: %d", attr); OOGLFree (dgellist); return NULL; } } va_end (a_list); return(dgellist); } int DiscGrpGet(DiscGrp *discgrp, int attr, void *attrp) { switch (attr) { case DGCR_NAME: *(char **)attrp = discgrp->name; break; case DGCR_COMMENT: *(char **)attrp = discgrp->comment; break; case DGCR_FLAG: *(unsigned *)attrp = discgrp->flag; break; case DGCR_ATTRIBUTE: *(int *)attrp = discgrp->attributes; break; case DGCR_GENS: *(DiscGrpElList **)attrp = discgrp->gens; break; case DGCR_BIGLIST: *(DiscGrpElList **)attrp = discgrp->big_list; break; case DGCR_CPOINT: *(HPoint3 *)attrp = discgrp->cpoint; break; case DGCR_ENUMDEPTH: *(int *)attrp = discgrp->enumdepth; break; case DGCR_ENUMDIST: *(float *)attrp = discgrp->enumdist; break; case DGCR_DRAWDIST: *(float *)attrp = discgrp->drawdist; break; case DGCR_SCALE: *(float *)attrp = discgrp->scale; break; case DGCR_CAMGEOM: *(Geom **)attrp = discgrp->camgeom; break; case DGCR_CAMGEOMHANDLE: *(Handle **)attrp = discgrp->camgeomhandle; break; case DGCR_DDGEOM: *(Geom **)attrp = discgrp->ddgeom; break; case DGCR_DDGEOMHANDLE: *(Handle **)attrp = discgrp->ddgeomhandle; break; case CR_GEOM: *(Geom **)attrp = discgrp->geom; break; case CR_GEOMHANDLE: *(Handle **)attrp = discgrp->geomhandle; break; default: return -1; } return 1; } DiscGrp * DiscGrpCreate (DiscGrp *exist, GeomClass *classp, va_list *a_list) { DiscGrp *discgrp; int attr, copy = 1; Geom *g; Handle *h; if (exist == NULL) { discgrp = OOGLNewE(DiscGrp, "DiscGrpCreate discgrp"); memset(discgrp, 0, sizeof(DiscGrp)); GGeomInit (discgrp, classp, DISCGRPMAGIC, NULL); discgrp->flag = DG_DDSLICE; /* default is to slice off cusps */ discgrp->name = NULL; discgrp->comment = NULL; discgrp->attributes = 0; discgrp->c2m = NULL; discgrp->fsa = NULL; discgrp->dimn = 3; /* make a guess */ discgrp->gens = NULL; discgrp->nhbr_list = NULL; discgrp->big_list = NULL; discgrp->cpoint = DGorigin; discgrp->camgeom = NULL; discgrp->ddgeom = NULL; discgrp->geom = NULL; discgrp->camgeomhandle = NULL; discgrp->ddgeomhandle = NULL; discgrp->geomhandle = NULL; discgrp->scale = .2; discgrp->enumdepth = 2; discgrp->enumdist = 5.0; discgrp->drawdist = 5.0; discgrp->predraw = NULL; } else { /* Check that exist is a DiscGrp... */ discgrp = exist; } while ((attr = va_arg (*a_list, int))) switch (attr) { case DGCR_NAME: discgrp->name = va_arg (*a_list, char *); break; case DGCR_COMMENT: discgrp->comment = va_arg (*a_list, char *); break; case DGCR_FLAG: discgrp->flag = va_arg (*a_list, int); break; case DGCR_ATTRIBUTE: discgrp->attributes = va_arg (*a_list, int); break; case DGCR_GENS: discgrp->gens = va_arg (*a_list, DiscGrpElList *); break; case DGCR_BIGLIST: discgrp->big_list = va_arg (*a_list, DiscGrpElList *); break; case DGCR_CPOINT: { HPoint3 *cptr; cptr = va_arg (*a_list, HPoint3 *); discgrp->cpoint = *cptr; } break; case DGCR_ENUMDEPTH: discgrp->enumdepth = va_arg (*a_list, int); break; case DGCR_ENUMDIST: discgrp->enumdist = ((float) va_arg (*a_list, double)); break; case DGCR_DRAWDIST: discgrp->drawdist = ((float) va_arg (*a_list, double)); break; case DGCR_SCALE: discgrp->scale = ((float) va_arg (*a_list, double)); break; /* Geometries and their handles: copy the logic from InstCreate() and * duplicate it for ddgeom and camgeom. */ case CR_GEOMHANDLE: h = va_arg(*a_list, Handle *); if (copy) { REFINCR(h); } if (discgrp->geomhandle) { HandlePDelete(&discgrp->geomhandle); } discgrp->geomhandle = h; HandleRegister(&discgrp->geomhandle, (Ref *)discgrp, &discgrp->geom, HandleUpdRef); break; case CR_HANDLE_GEOM: h = va_arg(*a_list, Handle *); g = va_arg(*a_list, Geom *); if (copy) { REFINCR(h); REFINCR(g); } if (discgrp->geomhandle) { HandlePDelete(&discgrp->geomhandle); } if (discgrp->geom) { GeomDelete(discgrp->geom); } discgrp->geomhandle = h; discgrp->geom = g; if (h) { HandleRegister(&discgrp->geomhandle, (Ref *)discgrp, &discgrp->geom, HandleUpdRef); HandleSetObject(discgrp->geomhandle, (Ref *)g); } break; case CR_GEOM: g = va_arg (*a_list, Geom *); if (copy) { REFINCR(g); } if (discgrp->geom) { GeomDelete(discgrp->geom); } discgrp->geom = g; if (discgrp->geomhandle) { HandlePDelete(&discgrp->geomhandle); } break; case DGCR_CAMGEOMHANDLE: h = va_arg(*a_list, Handle *); if (copy) { REFINCR(h); } if (discgrp->camgeomhandle) { HandlePDelete(&discgrp->camgeomhandle); } discgrp->camgeomhandle = h; HandleRegister(&discgrp->camgeomhandle, (Ref *)discgrp, &discgrp->camgeom, HandleUpdRef); break; case DGCR_HANDLE_CAMGEOM: h = va_arg(*a_list, Handle *); g = va_arg(*a_list, Geom *); if (copy) { REFINCR(h); REFINCR(g); } if (discgrp->camgeomhandle) { HandlePDelete(&discgrp->camgeomhandle); } if (discgrp->camgeom) { GeomDelete(discgrp->camgeom); } discgrp->camgeomhandle = h; discgrp->camgeom = g; if (h) { HandleRegister(&discgrp->camgeomhandle, (Ref *)discgrp, &discgrp->camgeom, HandleUpdRef); HandleSetObject(discgrp->camgeomhandle, (Ref *)g); } break; case DGCR_CAMGEOM: g = va_arg (*a_list, Geom *); if (copy) { REFINCR(g); } if (discgrp->camgeom) { GeomDelete(discgrp->camgeom); } discgrp->camgeom = g; if (discgrp->camgeomhandle) { HandlePDelete(&discgrp->camgeomhandle); } break; case DGCR_DDGEOMHANDLE: h = va_arg(*a_list, Handle *); if (copy) { REFINCR(h); } if (discgrp->ddgeomhandle) { HandlePDelete(&discgrp->ddgeomhandle); } discgrp->ddgeomhandle = h; HandleRegister(&discgrp->ddgeomhandle, (Ref *)discgrp, &discgrp->ddgeom, HandleUpdRef); break; case DGCR_HANDLE_DDGEOM: h = va_arg(*a_list, Handle *); g = va_arg(*a_list, Geom *); if (copy) { REFINCR(h); REFINCR(g); } if (discgrp->ddgeomhandle) { HandlePDelete(&discgrp->ddgeomhandle); } if (discgrp->ddgeom) { GeomDelete(discgrp->ddgeom); } discgrp->ddgeomhandle = h; discgrp->ddgeom = g; if (h) { HandleRegister(&discgrp->ddgeomhandle, (Ref *)discgrp, &discgrp->ddgeom, HandleUpdRef); HandleSetObject(discgrp->ddgeomhandle, (Ref *)g); } break; case DGCR_DDGEOM: g = va_arg (*a_list, Geom *); if (copy) { REFINCR(g); } if (discgrp->ddgeom) { GeomDelete(discgrp->ddgeom); } discgrp->ddgeom = g; if (discgrp->ddgeomhandle) { HandlePDelete(&discgrp->ddgeomhandle); } break; default: if (GeomDecorate (discgrp, ©, attr, a_list)) { GeomError (0, "DiscGrpCreate: Undefined option: %d", attr); OOGLFree (discgrp); return NULL; } } return discgrp; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/discgrp/dhpoint3.c0000644000175000001440000000614710455701002016270 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "vec4.h" #include "dgflag.h" #include "math.h" double DHPt3Dot(point4 v0, point4 v1, int metric) { switch (metric) { case DG_EUCLIDEAN: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]); break; case DG_HYPERBOLIC: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3]); break; case DG_SPHERICAL: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]); break; } return (double)0; } double DHPt3Dot3(point4 v0, point4 v1, int metric) { switch (metric) { case DG_EUCLIDEAN: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]); break; case DG_HYPERBOLIC: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3]); break; case DG_SPHERICAL: return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]); break; } return (double)0; } double DHPt3Distance(point4 p0, point4 p1, int metric) { double d0, d1; point4 diff; switch (metric) { case DG_EUCLIDEAN: VSUB3(p0,p1, diff); return(MAGNITUDE3(diff)); break; case DG_HYPERBOLIC: d0 =INPRO31(p0, p0); d1 =INPRO31(p1, p1); if (d0 >= 0.0 || d1 >= 0.0) { fprintf(stderr,"Invalid points in dist_proj3\n"); return(0.0); } return(acosh( ABS( INPRO31(p0, p1) / sqrt(d0 * d1)))); break; case DG_SPHERICAL: d0 =INPRO31(p0, p0); d1 =INPRO31(p1, p1); return(acos( ABS( INPRO4(p0, p1) / sqrt(d0 * d1)))); break; } return (double)0; } void DHPt3PerpBisect(point4 p0, point4 p1, point4 result, int metric) { switch (metric) { case DG_EUCLIDEAN: { point4 tmp; VSUB3(p1, p0, result) VADD3(p0, p1, tmp) VSCALE3(tmp, .5, tmp) result[3] = -(VDOT3(tmp, result)); } break; case DG_HYPERBOLIC: NORMALIZE31(p0); NORMALIZE31(p1); VSUB4(p0, p1, result) if (INPRO31(p0, result) > 0.0) VSCALE4(result, -1, result) break; case DG_SPHERICAL: NORMALIZE4(p0); NORMALIZE4(p1); VSUB4(p0, p1, result) if (INPRO4(p0, result) > 0.0) VSCALE4(result, -1, result) break; } } geomview-1.9.4/src/lib/gprim/discgrp/dgtransform.c0000644000175000001440000000264510455701002017065 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "3d.h" #include "discgrpP.h" DiscGrp * DiscGrpTransform( dg, T ) DiscGrp *dg; Transform T; { return dg; } DiscGrp * DiscGrpTransformTo( dg, T ) DiscGrp *dg; Transform T; { return(DiscGrpTransform(dg, T)); } geomview-1.9.4/src/lib/gprim/discgrp/dgstream.c0000644000175000001440000003015710622716753016363 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "discgrpP.h" #include "options.h" #include "complex.h" /* in case file has elements of SL(2,C) */ #include #include "mgP.h" #include "streampool.h" #include "transobj.h" #include "handleP.h" #include "projective.h" int fsaparse(); #define DG_GROUPNAME 1 #define DG_COMMENT 2 #define DG_ATTRIBUTE 3 #define DG_MODEL 4 #define DG_NGENS 5 #define DG_NELS 6 #define DG_GENS 7 #define DG_ELS 8 #define DG_DIMN 9 #define DG_CAMGEOM 10 #define DG_GEOM 11 #define DG_CAMGEOMFILE 12 #define DG_GEOMFILE 13 #define DG_WAFILE 14 #define DG_MATRIXGROUP 15 #define DG_CPOINT 16 #define DG_ENUMDEPTH 17 #define DG_ENUMDIST 18 #define DG_DSPYATTR 19 #define DG_SCALE 20 #define DG_C2M 21 #define DG_DRAWDIST 22 #define DG_NUMKEYWORDS 24 /* 2 redundant keywords */ keytokenpair keytokenlist[] = { {"group", DG_GROUPNAME}, {"comment", DG_COMMENT}, {"attribute", DG_ATTRIBUTE}, {"model", DG_MODEL}, {"ngens", DG_NGENS}, {"nels", DG_NELS}, {"gens", DG_GENS}, {"els", DG_ELS}, {"dimn", DG_DIMN}, {"dimension", DG_DIMN}, {"camgeom", DG_CAMGEOM}, {"geom", DG_GEOM}, {"camgeomfile", DG_CAMGEOMFILE}, {"geomfile", DG_GEOMFILE}, {"wafile", DG_WAFILE}, {"matrixgroup", DG_MATRIXGROUP}, {"mgroup", DG_MATRIXGROUP}, {"cpoint", DG_CPOINT}, {"enumdepth", DG_ENUMDEPTH}, {"enumdist", DG_ENUMDIST}, {"drawdist", DG_DRAWDIST}, {"display", DG_DSPYATTR}, {"scale", DG_SCALE}, {"cam2model", DG_C2M} }; keytokenpair attr_list[DG_NUM_ATTR] = { {"hyperbolic", DG_HYPERBOLIC}, {"euclidean", DG_EUCLIDEAN}, {"spherical", DG_SPHERICAL}, {"finite", DG_FINITE}, {"transposed", DG_TRANSPOSED}, {"conformalball", DG_CONFORMALBALL}, {"upperhalfspace", DG_UPPERHALFSPACE}, {"projective", DG_PROJECTIVEMODEL} }; keytokenpair dspyattr_list[DG_NUM_DSPYATTR] = { {"centercam", DG_CENTERCAM}, {"zcull", DG_ZCULL}, {"drawcam", DG_DRAWCAM}, {"drawdirdom", DG_DRAWDIRDOM}, {"drawgeom", DG_DRAWGEOM} }; /* Name can be {GL | SL | SO } ( {n},{k},{R | C} ) */ matrixgroup cgroup = { DG_GENERAL | DG_REAL, 4, 0}; static char delims[] = "%{}();"; static char errfmt[] = "Reading discrete group from \"%s\": %s"; static int token_from_string(char *s, keytokenpair *kl, int n) { int i; for (i=0; inum_el; ++i) { dgellist->el_list[i].attributes = 0; dgellist->el_list[i].color = white; dgellist->el_list[i].inverse = NULL; c = iobfnextc(fp, 0); /* get the name if it's alphabetic */ if ( c >= 'A' && c <= 'z' ) { name = iobfdelimtok(delims, fp, 0); if (strlen(name) > DG_WORDLENGTH) { OOGLSyntax(fp,"Reading discrete group from \"%s\": Words limited to length %d", fname, DG_WORDLENGTH); return; } strcpy(dgellist->el_list[i].word, name); } else { /* make up a name for this gen */ dgellist->el_list[i].word[0] = 'a' + i; dgellist->el_list[i].word[1] = 0; } switch(discgrp->attributes & DG_MODEL_BITS){ case DG_CONFORMALBALL: OOGLSyntax(fp,errfmt,fname,"Unimplemented conformal model"); break; case DG_UPPERHALFSPACE: { sl2c_matrix mylf; proj_matrix mypm; int k,m; for (k=0; k<2; ++k) for (m=0; m<2; ++m) { iobfgetnd(fp, 1, &mylf[k][m].real, 0); iobfgetnd(fp, 1, &mylf[k][m].imag, 0); } sl2c_to_proj(mylf, mypm); for (k=0; k<4; ++k) for (m=0; m<4; ++m) dgellist->el_list[i].tform[k][m] = mypm[k][m]; } break; default: if (iobfgettransform(fp,1,(float *)dgellist->el_list[i].tform,0) != 1) { OOGLSyntax(fp,errfmt,fname,"Error reading generator"); return; } if (discgrp->attributes & DG_TRANSPOSED) TmTranspose(dgellist->el_list[i].tform, discgrp->big_list->el_list[i].tform); break; } } discgrp->attributes &= ~DG_UPPERHALFSPACE; } Geom * DiscGrpImport(Pool *p) { char *name, *fname; char keyword[DG_KEYWORDSIZE]; DiscGrp *discgrp; IOBFILE *fp; FILE *wafp; char *expect; if(p == NULL || (fp = PoolInputFile(p)) == NULL) return 0; /* check for 'DISCGRP' at head of file */ if(strcmp(GeomToken(fp), "DISCGRP")) return(NULL); /* now the parentheses begin */ if (iobfnextc(fp, 0) != '(') return(NULL); discgrp = (DiscGrp*)GeomCreate("discgrp",CR_END); while (get_keyword(fp, keyword,p->poolname)) { switch ( token_from_string(keyword, keytokenlist,sizeof(keytokenlist)/sizeof(keytokenpair) )) { case DG_WAFILE: name = iobfdelimtok(delims, fp, 0); fname = findfile(PoolName(p), name); if(fname == NULL || (wafp = fopen(fname, "rb")) == NULL) { OOGLSyntax(fp, "Reading discrete group from \"%s\": can't open wafile \"%s\"", p->poolname, name); return(NULL); } discgrp->fsa = OOGLNew(wa); fsaparse(wafp, discgrp->fsa); fclose(wafp); break; case DG_DSPYATTR: name = iobfdelimtok(delims, fp, 0); discgrp->flag |= token_from_string(name, dspyattr_list,sizeof(dspyattr_list)/sizeof(keytokenpair)); break; case DG_ATTRIBUTE: case DG_MODEL: name = iobfdelimtok(delims, fp, 0); discgrp->attributes |= token_from_string(name, attr_list,sizeof(attr_list)/sizeof(keytokenpair)); break; case DG_COMMENT: discgrp->comment = strdup(iobfdelimtok(delims, fp, 0)); break; case DG_MATRIXGROUP: parse_group_name(iobfdelimtok(delims, fp, 0)); break; case DG_SCALE: if(iobfgetnf(fp, 1, &discgrp->scale, 0) <= 0) { OOGLSyntax(fp,errfmt, p->poolname, "Invalid scale"); return(NULL); } break; case DG_C2M: discgrp->c2m = (float (*)[4])OOGLNewNE(float, 16, "Transform"); if (iobfgettransform(fp,1,(float *)discgrp->c2m,0) != 1) { OOGLSyntax(fp,errfmt,p->poolname,"Error reading cam2model"); return(NULL); } break; case DG_ENUMDEPTH: if(iobfgetni(fp, 1, &discgrp->enumdepth, 0) <= 0) { OOGLSyntax(fp,errfmt, p->poolname, "Invalid enumdepth"); return(NULL); } break; case DG_ENUMDIST: if(iobfgetnf(fp, 1, &discgrp->enumdist, 0) <= 0) { OOGLSyntax(fp,errfmt, p->poolname, "Invalid enumdist"); return(NULL); } break; case DG_DRAWDIST: if(iobfgetnf(fp, 1, &discgrp->drawdist, 0) <= 0) { OOGLSyntax(fp,errfmt, p->poolname, "Invalid drawdist"); return(NULL); } break; case DG_CPOINT: if(iobfgetnf(fp, 4, (float *)&discgrp->cpoint, 0) <= 0) { OOGLSyntax(fp,errfmt, p->poolname, "Invalid Cpoint"); return(NULL); } break; case DG_CAMGEOM: expect = "camgeometry"; if(!GeomStreamIn(p, &discgrp->camgeomhandle, &discgrp->camgeom)) goto failed; if(discgrp->camgeomhandle) HandleRegister(&discgrp->camgeomhandle, (Ref *)discgrp, &discgrp->camgeom, HandleUpdRef); break; case DG_ELS: discgrp->big_list->mgroup = cgroup; get_el_list(discgrp, discgrp->big_list, fp, p->poolname); discgrp->flag |= DG_SAVEBIGLIST; break; case DG_GROUPNAME: discgrp->name = strdup(iobfdelimtok(delims, fp, 0)); break; case DG_GENS: { int i; static char name[2] = "a"; discgrp->gens->mgroup = cgroup; get_el_list(discgrp, discgrp->gens, fp, p->poolname); /* make up names for the generators if not given */ if (strcmp(discgrp->gens->el_list[0].word, "") == 0) { for (i=0; igens->num_el; ++i) { strcpy(discgrp->gens->el_list[i].word,name); name[0]++; } } } break; case DG_GEOM: expect = "geometry"; if(!GeomStreamIn(p, &discgrp->geomhandle, &discgrp->geom)) goto failed; if(discgrp->geomhandle) HandleRegister(&discgrp->geomhandle, (Ref *)discgrp, &discgrp->geom, HandleUpdRef); break; case DG_DIMN: if(iobfgetni(fp, 1, &discgrp->dimn, 0) <= 0 || discgrp->dimn > 4) { OOGLSyntax(fp,errfmt, p->poolname, "Invalid Dimension"); return(NULL); } cgroup.dimn = discgrp->dimn+1; /* default matrix group */ break; case DG_NGENS: { int ngens; if(iobfgetni(fp, 1, &ngens, 0) <= 0 || ngens <= 0) { OOGLSyntax(fp,errfmt,p->poolname, "Invalid generator count"); return(NULL); } discgrp->gens = OOGLNewE(DiscGrpElList, "DiscGrp gens"); discgrp->gens->num_el = ngens; discgrp->gens->el_list = OOGLNewNE(DiscGrpEl, discgrp->gens->num_el, "DiscGrp gens elem list"); } break; case DG_NELS: { int nels; if(iobfgetni(fp, 1, &nels, 0) <= 0 || nels <= 0) { OOGLSyntax(fp,errfmt,p->poolname, "Invalid generator count"); return(NULL); } discgrp->big_list = OOGLNewE(DiscGrpElList, "DiscGrp el_list"); discgrp->big_list->num_el = nels; discgrp->big_list->el_list = OOGLNewNE(DiscGrpEl, discgrp->big_list->num_el, "DiscGrp elem list"); } break; failed: OOGLSyntax(fp, "Couldn't read DISCGRP in \"%s\": expected %s", PoolName(p), expect); break; default: OOGLError(1,"Bad keyword DiscGrpFLoad %s",keyword); break; } if ( !(get_matching_parenthesis(fp,p->poolname))) break; } /* make sure the generator list includes all inverses */ DiscGrpAddInverses(discgrp); /* if (discgrp->geom == NULL) { discgrp->flag |= DG_DRAWDIRDOM; DiscGrpSetupDirdom(discgrp); discgrp->ddgeom = DiscGrpDirDom(discgrp); } */ if (discgrp->big_list == NULL) { DiscGrpInitStandardConstraint(discgrp->enumdepth, discgrp->enumdist, discgrp->enumdist); discgrp->big_list = DiscGrpEnum(discgrp, DiscGrpStandardConstraint); } return(( Geom *) discgrp); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/discgrp/dgbound.c0000644000175000001440000000501310514661167016166 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" #include "discgrpP.h" BBox * DiscGrpBound(DiscGrp *discgrp, Transform T, TransformN *TN) { BBox *geombbox; Transform Tnew; GeomIter *it; #ifdef BADVELOCITY /* strange flying mode velocity comps require this */ int nels; #endif if( discgrp == NULL) return NULL; if (T == NULL) T = TM_IDENTITY; if (discgrp->geom == NULL) return NULL; it = GeomIterate( (Geom *)discgrp, DEEP ); geombbox = NULL; /* this is a horrible hack to allow us to continue to fly around at * reasonable speeds when in centercam mode, since the speed is * proportional to the bbox of the world. Solution: we only look * at the identity element's bbox */ #ifdef BADVELOCITY /* strange flying mode velocity comps require this */ if (discgrp->attributes & DG_SPHERICAL || discgrp->flag & DG_CENTERCAM) { nels = discgrp->big_list->num_el; discgrp->big_list->num_el = 1; } #endif while(NextTransform(it, Tnew) > 0) { BBox *box; TmConcat( Tnew, T, Tnew ); if((box = (BBox *)GeomBound(discgrp->geom, Tnew, NULL)) != NULL) { if(geombbox) { BBoxUnion3(geombbox, box, geombbox); GeomDelete((Geom *)box); } else geombbox = box; } } #ifdef BADVELOCITY if (discgrp->attributes & DG_SPHERICAL || discgrp->flag & DG_CENTERCAM) discgrp->big_list->num_el = nels; #endif return geombbox; } geomview-1.9.4/src/lib/gprim/discgrp/stack.c0000644000175000001440000000473310455701002015644 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include #include "enum.h" #include "ooglutil.h" #define CHUNKSIZE 10000 typedef struct entry {char word[MAXDEPTH]; } entry; static entry *stack = NULL, *old, *oldtop, *oldbase, *new; static int numchunks = 1; /* new points to the next empty space in the stack */ /* old points to the first non-empty space in the stack */ void init_stack() { if (stack) OOGLFree(stack); stack = OOGLNewN(entry, CHUNKSIZE); if (stack == NULL) exit(fprintf(stderr,"init_stack: no space\n")); old = oldbase = new = stack; oldtop = stack - 1; } void make_new_old() { /* oldbase and oldtop are inclusive limits if non-empty words */ oldbase = oldtop+1; old = oldtop = new-1; } char * pop_old_stack() { if (old >= oldbase) return((old--)->word); else return(NULL); } int push_new_stack(word) char *word; { entry * oldstack; if (new >= stack + numchunks * CHUNKSIZE) { oldstack = stack; numchunks *= 2; if ((stack = OOGLRenewN(entry, stack, numchunks * CHUNKSIZE )) == (entry *) NULL) return (0); new = (entry *) stack + (new - oldstack); old = (entry *) stack + (old - oldstack); oldtop = (entry *) stack + (oldtop - oldstack); oldbase = (entry *) stack + (oldbase - oldstack); if (stack == NULL) exit(fprintf(stderr,"push_new_stack: no space\n")); } strcpy(new->word, word); new++; return 0; } geomview-1.9.4/src/lib/gprim/discgrp/weeks_dirdom.c0000644000175000001440000013036610522122002017205 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Comments on numerical issues: Dirichlet() uses two constants, namely VERTEX_EPSILON and MATRIX_EPSILON, to decide when two real numbers are equal. Setting the values of these constants is tricky. In situations where the polyhedron has very tiny faces and the initial list of generators is sufficiently precise (e.g. (40, 1) surgery on the figure eight knot) the constants should be set fairly small. In situations where the polyhedron has no small faces and the generators are very imprecise (e.g. (1,-1)(-5,1)(-5,1) surgery on the Borromean rings, which gives the manifold of volume 0.94...) the constants must be fairly large. (The more complicated Dehn fillings give less precise generators not because the original solution to the gluing equations is less accurate, but because the original set of generators is far from the canonical set, and a lot of roundoff error accumulates in the basepoint finding routine.) */ /* #define PRECISE_GENERATORS 1 for high precision generators and tiny faces, or #define PRECISE_GENERATORS 0 for low precision generators and large faces. */ #define PRECISE_GENERATORS 0 /* Dirichlet() uses an algorithm based on checking that that corresponding faces do in fact match up. Specifically, for each face it checks that (the image of) its matching face does not extend beyond the perimeter of the given face. It checks that the matching face does not extend beyond any Dirichlet plane determined by a group element (alpha)(beta), where alpha is the group element associated with the matching face, and beta is the group element associated with one of the faces bordering the given face. When the faces do match up correctly the program can verify the fact very quickly, because in the typical case where the edges are of order three the group element (alpha)(beta) is exactly the group element associated with a face bordering on the matching face. So the program can traverse the original face counterclockwise while simultaneously traversing the matching face clockwise and noting that group elements correspond correctly. If a group element fails to correspond, then the program must check that no vertices of the matching face lie beyond the Dirichlet plane corresponding to (alpha)(beta). But even this is pretty fast--it just needs to evaluate some inner products and check that none are positive. In the event that some vertices do lie beyond the Dirichlet plane corresponding to (alpha)(beta), the program knows to add this plane (and its inverse) to the collection of faces of the polyhedron. Thus the program adds only faces that are actually needed. This allows it to quickly find Dirichlet domains whose vertices (and face planes) are too far from the origin to be found by enumerating all group elements at that distance (e.g. (40,1) Dehn filling on a knot complement). The results of this algorithm can be made rigorous by checking that the sum of the dihedral angles around each edge add up to 2pi and that the face pairings are sufficient to generate the original group, but I haven't written the code to do this yet. (In fact, the condition that the face pairings generate the original group might be satisfied automatically given that we start with a generating set that includes all group elements up to some norm. Perhaps there's also a way to prove that the edge angles must add up correctly.) */ /* Note: Dirichlet() does not require inverses of generators */ /* to be present. It provides any inverses which may be */ /* missing. */ #include "options.h" #include "projective.h" #include "complex.h" #include "winged_edge.h" #include "3d.h" #include "dgflag.h" #include #include "extern.h" #include "discgrpP.h" #define free32(ptr) free(ptr) #define malloc32(size) malloc(size) #if PRECISE_GENERATORS #define VERTEX_EPSILON (1e9 * HARDWARE_PRECISION) #define MATRIX_EPSILON (1e7 * HARDWARE_PRECISION) #else #define VERTEX_EPSILON 1e-3 #define MATRIX_EPSILON 1e-5 #endif #define MIN_DL_FILL_TONE 0 #define MAX_DL_FILL_TONE 64 typedef double vector[4]; /*static void convert_generators(sl2c_matrix *m, proj_matrix **mm, int foo);*/ static void make_cube(WEpolyhedron *poly); /*static void make_hypercube(WEpolyhedron *poly);*/ static void initialize_polyhedron(WEpolyhedron *poly, proj_matrix *m, int n); static int find_Dirichlet_domain(WEpolyhedron *poly); static int check_face(WEpolyhedron *poly, WEface *face); static int all_dirty_faces_unmatched(WEpolyhedron *poly); static int unsophisticated_search(WEpolyhedron *poly); static int add_element(WEpolyhedron *poly, proj_matrix m); static void slice_off_cusps(WEpolyhedron *poly); static int add_face(WEpolyhedron *poly, proj_matrix m, WEface *face); static void cut_edges(WEpolyhedron *poly); static void adjust_f_e_ptrs(WEpolyhedron *poly); static void cut_faces(WEpolyhedron *poly, WEface *face); static void remove_dead_edges(WEpolyhedron *poly); static void remove_dead_vertices(WEpolyhedron *poly); static void number_faces(WEpolyhedron *poly); /*static void read_vertices(WEface *face, double (*foo)[3]);*/ /*static void print_statistics(WEpolyhedron *poly);*/ static void print_poly(WEpolyhedron *poly); static void print_vef(WEpolyhedron *poly); /*static void print_vertex_distances(WEpolyhedron *poly);*/ static void print_vertices(WEpolyhedron *poly); /*static void print_edge_lengths(WEpolyhedron *poly);*/ /*static void print_face_distances(WEpolyhedron *poly);*/ /*static void saveOOGL(WEpolyhedron *poly);*/ /*static void free_polyhedron(WEpolyhedron *poly);*/ static void roundoff_message(char *message); static int matrix_epsilon_message_given, vertex_epsilon_message_given; static point origin; static int metric, debug; static WEpolyhedron the_polyhedron; /* we'd use the geometry library routines here if they were double precision */ extern double DHPt3Dot3(); extern double DHPt3Dot(); static WEedge edgeheap[1024]; static int heapcount = 0; int proj_same_matrix(); void do_weeks_code(WEpolyhedron **wepolyhedron, point oo, proj_matrix *gen_list, int n, int met, int slice) { int i; for (i=0; i<4; ++i) origin[i] = oo[i]; heapcount = 0; metric = met; *wepolyhedron = &the_polyhedron; /* if (metric == DG_SPHERICAL) make_hypercube(*wepolyhedron); else make_cube(*wepolyhedron); */ make_cube(*wepolyhedron); initialize_polyhedron(*wepolyhedron, gen_list, n); if (find_Dirichlet_domain(*wepolyhedron) == 0) *wepolyhedron = NULL; else { if (debug == 2) print_poly(*wepolyhedron); number_faces(*wepolyhedron); } if (slice && (metric == DG_HYPERBOLIC)) slice_off_cusps(*wepolyhedron); } #define MAGIC_SCALE .99 static void slice_off_cusps(poly) WEpolyhedron *poly; { WEvertex *vptr, *vlist; Transform tlate; proj_matrix dtlate; HPoint3 tlatept; int i,j; /* make a copy of the vertex list as it stands now */ vlist = (WEvertex *) malloc32(poly->num_vertices * sizeof(WEvertex)); vptr = poly->vertex_list; i = 0; do { vlist[i] = *vptr; vlist[i].next = &vlist[i+1]; vptr = vptr->next; i++; } while (vptr != NULL); vlist[i-1].next = NULL; /* now cycle through these vertices */ vptr = vlist; do { vptr->ideal = ( (DHPt3Dot(vptr->x, vptr->x, metric)) >= -.00005) ? 1 : 0; if (vptr->ideal) { tlatept.x = vptr->x[0] * MAGIC_SCALE; tlatept.y = vptr->x[1] * MAGIC_SCALE; tlatept.z = vptr->x[2] * MAGIC_SCALE; tlatept.w = vptr->x[3]; Tm3HypTranslateOrigin(tlate, &tlatept); for (i=0;i<4;++i) for (j=0;j<4;++j) dtlate[j][i] = tlate[i][j]; add_element(poly, dtlate); } vptr = vptr->next; } while (vptr != NULL); } #if 0 static void convert_generators(sl2c_generators, proj_generators_ptr, num_generators) sl2c_matrix *sl2c_generators; proj_matrix **proj_generators_ptr; int num_generators; { int i; *proj_generators_ptr = (proj_matrix *) malloc32((MyInt32) num_generators * sizeof(proj_matrix)); for (i=num_generators; --i>=0; ) sl2c_to_proj(sl2c_generators[i], (*proj_generators_ptr)[i]); return; } #endif #if 0 static void make_hypercube(polyhedron) WEpolyhedron *polyhedron; { int i; WEvertex *initial_vertices[16]; WEedge *initial_edges[24]; WEface *initial_faces[12]; static int edata[24][8] = { {0, 4, 8, 4, 9, 6, 1,0}, {2, 6, 4, 16, 6, 11, 0,8}, {1, 5, 20, 8, 7, 9, 5,1}, {3, 11, 10, 5, 22, 17, 7,6}, {0, 2, 0, 8, 1, 10, 0,2}, {1, 3, 8, 20, 10, 3, 2,6}, {4, 6, 12, 0, 11, 1, 3,0}, {5, 13, 2, 9, 14, 21, 5, 4}, {0, 1, 4, 0, 5, 2, 2,1}, {4, 5, 0, 12, 2, 7, 1,4}, {2, 3, 16, 4, 3, 5, 7,2}, {6, 14, 6, 1, 18, 13, 3,8}, {4, 4+8, 9, 6, 9+12, 6+12, 4,3}, {2+8, 6+8, 4+12, 10+12, 11, 11+12, 8,10}, {1+8, 5+8, 5+12, 8+12, 7+12, 7, 9,5}, {3+8, 7+8, 10+12, 5+12, 11+12, 7+12, 10,9}, {2, 2+8, 1, 10, 1+12, 10+12, 8,7}, {1+8, 3+8, 8+12, 2+12, 3, 3+12, 6,9}, {4+8, 6+8, 9+12, 0+12, 11+12, 11, 11,3}, {5+8, 7+8, 2+12, 9+12, 3+12, 11+12, 9,11}, {1, 1+8, 5, 2, 5+12, 2+12, 6,5}, {4+8, 5+8, 0+12, 6+12, 7, 7+12, 4,11}, {2+8, 3+8, 1+12, 4+12, 3+12, 3, 10,7}, {6+8, 7+8, 6+12, 1+12, 7+12, 3+12, 11,10}}; static int fdata[12] = {0, 8,4,6,9,2,5,10,1,15,23,19}; polyhedron->num_vertices = 16; polyhedron->num_edges = 24; polyhedron->num_faces = 12; /* vt = (WEvertex *) malloc32( 16 * sizeof(WEvertex)); et = (WEedge *) malloc32( 24 * sizeof(WEedge)); ft = (WEface *) malloc32( 12 * sizeof(WEface)); */ for (i=16; --i>=0; ) initial_vertices[i] = (WEvertex *) malloc32((MyInt32) sizeof(WEvertex)); for (i=24; --i>=0; ) initial_edges[i] = (WEedge *) malloc32((MyInt32) sizeof(WEedge)); for (i=12; --i>=0; ) initial_faces[i] = (WEface *) malloc32((MyInt32) sizeof(WEface)); /* for (i=0; i<16; ++i) initial_vertices[i] = &vt[i]; for (i=0; i<24; ++i ) initial_edges[i] = &et[i]; for (i=0; i <12; ++i ) initial_faces[i] = &ft[i]; */ polyhedron->vertex_list = initial_vertices[0]; polyhedron->edge_list = initial_edges[0]; polyhedron->face_list = initial_faces[0]; polyhedron->dirty0.nxt = initial_faces[0]; polyhedron->dirty0.prv = NULL; /* should be unnecessary */ polyhedron->dirty1.nxt = NULL; /* should be unnecessary */ polyhedron->dirty1.prv = initial_faces[11]; polyhedron->clean0.nxt = &polyhedron->clean1; polyhedron->clean0.prv = NULL; /* should be unnecessary */ polyhedron->clean1.nxt = NULL; /* should be unnecessary */ polyhedron->clean1.prv = &polyhedron->clean0; for (i=0; i<16; ++i ) { initial_vertices[i]->x[0] = (i & 8) ? 1.0 : -1.0; initial_vertices[i]->x[1] = (i & 4) ? 1.0 : -1.0; initial_vertices[i]->x[2] = (i & 2) ? 1.0 : -1.0; initial_vertices[i]->x[3] = (i & 1) ? 1.0 : -1.0; initial_vertices[i]->next = initial_vertices[i+1]; } initial_vertices[15]->next = NULL; /* delete vertices # 7 and 8 */ initial_vertices[6]->next = initial_vertices[9]; polyhedron->num_vertices = 14; for (i=0; i< 24; ++i ) { initial_edges[i]->v0 = initial_vertices[edata[i][0]]; initial_edges[i]->v1 = initial_vertices[edata[i][1]]; initial_edges[i]->e0L = initial_edges[edata[i][2]]; initial_edges[i]->e0R = initial_edges[edata[i][3]]; initial_edges[i]->e1L = initial_edges[edata[i][4]]; initial_edges[i]->e1R = initial_edges[edata[i][5]]; initial_edges[i]->fL = initial_faces[edata[i][6]]; initial_edges[i]->fR = initial_faces[edata[i][7]]; initial_edges[i]->next = initial_edges[i+1]; } initial_edges[23]->next = NULL; for (i=0; i<12; ++i) { initial_faces[i]->order = 4; initial_faces[i]->fill_tone = -2; initial_faces[i]->some_edge = initial_edges[fdata[i]]; initial_faces[i]->inverse = NULL; initial_faces[i]->next = initial_faces[i+1]; initial_faces[i]->prv = initial_faces[i-1]; initial_faces[i]->nxt = initial_faces[i+1]; } initial_faces[11]->next = NULL; initial_faces[0]->prv = &polyhedron->dirty0; initial_faces[11]->nxt = &polyhedron->dirty1; return; } #endif static void make_cube(polyhedron) WEpolyhedron *polyhedron; { int i; WEvertex *initial_vertices[8]; WEedge *initial_edges[12]; WEface *initial_faces[6]; static int edata[12][8] = { {0, 4, 8, 4, 9, 6, 2, 4}, {2, 6, 4, 10, 6, 11, 4, 3}, {1, 5, 5, 8, 7, 9, 5, 2}, {3, 7, 10, 5, 11, 7, 3, 5}, {0, 2, 0, 8, 1, 10, 4, 0}, {1, 3, 8, 2, 10, 3, 0, 5}, {4, 6, 9, 0, 11, 1, 1, 4}, {5, 7, 2, 9, 3, 11, 5, 1}, {0, 1, 4, 0, 5, 2, 0, 2}, {4, 5, 0, 6, 2, 7, 2, 1}, {2, 3, 1, 4, 3, 5, 3, 0}, {6, 7, 6, 1, 7, 3, 1, 3}}; static int fdata[6] = {4, 6, 0, 1, 0, 2}; polyhedron->num_vertices = 8; polyhedron->num_edges = 12; polyhedron->num_faces = 6; for (i=8; --i>=0; ) initial_vertices[i] = (WEvertex *) malloc32((MyInt32) sizeof(WEvertex)); for (i=12; --i>=0; ) initial_edges[i] = (WEedge *) malloc32((MyInt32) sizeof(WEedge)); for (i=6; --i>=0; ) initial_faces[i] = (WEface *) malloc32((MyInt32) sizeof(WEface)); polyhedron->vertex_list = initial_vertices[0]; polyhedron->edge_list = initial_edges[0]; polyhedron->face_list = initial_faces[0]; polyhedron->dirty0.nxt = initial_faces[0]; polyhedron->dirty0.prv = NULL; /* should be unnecessary */ polyhedron->dirty1.nxt = NULL; /* should be unnecessary */ polyhedron->dirty1.prv = initial_faces[5]; polyhedron->clean0.nxt = &polyhedron->clean1; polyhedron->clean0.prv = NULL; /* should be unnecessary */ polyhedron->clean1.nxt = NULL; /* should be unnecessary */ polyhedron->clean1.prv = &polyhedron->clean0; for (i=8; --i>=0; ) { initial_vertices[i]->x[0] = (i & 4) ? 17.0 : -17.0; initial_vertices[i]->x[1] = (i & 2) ? 17.0 : -17.0; initial_vertices[i]->x[2] = (i & 1) ? 17.0 : -17.0; /* if (metric & DG_SPHERICAL) initial_vertices[i]->x[3] = 0.0; else */ initial_vertices[i]->x[3] = 1.0; initial_vertices[i]->next = initial_vertices[i+1]; } initial_vertices[7]->next = NULL; for (i=12; --i>=0; ) { initial_edges[i]->v0 = initial_vertices[edata[i][0]]; initial_edges[i]->v1 = initial_vertices[edata[i][1]]; initial_edges[i]->e0L = initial_edges[edata[i][2]]; initial_edges[i]->e0R = initial_edges[edata[i][3]]; initial_edges[i]->e1L = initial_edges[edata[i][4]]; initial_edges[i]->e1R = initial_edges[edata[i][5]]; initial_edges[i]->fL = initial_faces[edata[i][6]]; initial_edges[i]->fR = initial_faces[edata[i][7]]; initial_edges[i]->next = initial_edges[i+1]; } initial_edges[11]->next = NULL; for (i=6; --i>=0; ) { initial_faces[i]->order = 4; initial_faces[i]->fill_tone = -2; initial_faces[i]->some_edge = initial_edges[fdata[i]]; initial_faces[i]->inverse = NULL; initial_faces[i]->next = initial_faces[i+1]; initial_faces[i]->prv = initial_faces[i-1]; initial_faces[i]->nxt = initial_faces[i+1]; } initial_faces[5]->next = NULL; initial_faces[0]->prv = &polyhedron->dirty0; initial_faces[5]->nxt = &polyhedron->dirty1; return; } static void initialize_polyhedron(polyhedron, proj_generators, num_generators) WEpolyhedron *polyhedron; proj_matrix *proj_generators; int num_generators; { int i; WEface *face; for (i=num_generators; --i>=0; ) { add_element(polyhedron, proj_generators[i]); if (debug == 2) print_poly(polyhedron); } /* make sure no faces of the original cube remain */ for (face=polyhedron->face_list; face; face=face->next) if (debug) if (face->fill_tone == -2) { fprintf(stderr, "A face of the original cube is inside the polyhedron\n"); fprintf(stderr, "determined by the initial generators. This program\n"); fprintf(stderr, "could be modified to deal with this situation, but\n"); fprintf(stderr, "it's not ready yet.\n"); /* the solution would be to tile to some small */ /* radius (or increase the size of the cube!) */ return; } return; } static int check_face(polyhedron, face) WEpolyhedron *polyhedron; WEface *face; { /* We want to see whether the image of the matching face */ /* is entirely contained within the given face. To do this */ /* we'll examine the edges of the given face one at a time */ /* and make sure the image of the matching face doesn't */ /* extend past any edge. We do this as follows. Let alpha */ /* be the inverse of the group element associated with the */ /* given face, and beta be the group element associated */ /* with one of its neighboring faces. We want to make sure */ /* that none of the vertices of the matching face extend */ /* beyond the Dirichlet plane determined by (alpha)(beta). */ /* This will be true for all beta iff the image of the */ /* matching face is contained within the given face. */ /* */ /* We want this routine to run correctly in all cases and */ /* to run quickly in the typical case. In the typical case */ /* the faces will already match exactly, and the edges will */ /* all be of order three, so (alpha)(beta) will in fact */ /* be the group element associated with one of the faces */ /* bordering on the matching face. So in this case we */ /* simply traverse the given face in the counterclockwise */ /* while simultaneously traversing the matching face in the */ /* clockwise direction, and check that each (alpha)(beta) */ /* coincides with a gamma bordering the matching face. If */ /* this fails (as will occur when the faces do not coincide */ /* or the edges are not of order 3) then our fallback plan */ /* is to check that all vertices of the matching face lie */ /* on the correct side of the Dirichlet plane determined by */ /* (alpha)(beta). */ /* */ /* (Note: there may be a better way to structure the */ /* algorithm so that we check edges instead of faces. For */ /* a typical edge (of order three) we want to check that */ /* the product of the three surrounding group elements is */ /* the identity. But that will wait for another day.) */ WEface *match_face; WEedge *edge, *edge0, *placeholder; WEvertex *vertex; double (*alpha)[4], /* these are proj_matrices with */ (*beta)[4], /* no storage attached */ (*gamma)[4]; vector planne; proj_matrix alphabeta; int alphabeta_found; point gorigin; /* If the given face doesn't have an active matching face */ /* (i.e. its mate lies entirely outside the polyhedron) */ /* then we put it at the end of the dirty list and hope it */ /* goes away. */ /* Dec. 8, 92: don't bother with putting the original faces of */ /* the cube on the dirty list. */ if (face->inverse == NULL) { if (face->fill_tone != -2) { face->nxt = &polyhedron->dirty1; face->prv = polyhedron->dirty1.prv; polyhedron->dirty1.prv->nxt = face; polyhedron->dirty1.prv = face; polyhedron->pending0.nxt = &polyhedron->pending1; polyhedron->pending1.prv = &polyhedron->pending0; } /* Be sure the dirty queue contains at least one */ /* face with an active inverse face. If it doesn't */ /* call a routine to try to create some new faces. */ /* If that fails, print a message and exit. */ while (all_dirty_faces_unmatched(polyhedron)) { if (debug) fprintf(stderr, "searching for more group elements\n"); if ( ! unsophisticated_search(polyhedron)) { if (debug) fprintf(stderr, "The dirty list in Dirichlet.c contains only unmatched faces.\n"); return(0); } } return(1); } match_face = face->inverse; alpha = match_face->group_element; /* The value of edge0 is maintained from one use of the */ /* inner loop to the next to improve efficiency in the */ /* case where the faces match exactly. */ edge0 = match_face->some_edge; /* traverse the face */ edge = face->some_edge; do { if (edge->fL == face) { /* edge points counterclockwise */ beta = edge->fR->group_element; edge = edge->e1L; } else { /* edge points clockwise */ beta = edge->fL->group_element; edge = edge->e0R; } proj_mult(alpha, beta, alphabeta); /* is alphabeta the matrix associated with a */ /* neighbor of match_face? */ alphabeta_found = 0; placeholder = edge0; do { /* edge points counterclockwise */ if (edge0->fL == match_face) { gamma = edge0->fR->group_element; edge0 = edge0->e0L; /* traverse CLOCKWISE */ } else { /* edge points clockwise */ gamma = edge0->fL->group_element; edge0 = edge0->e1R; /* traverse CLOCKWISE */ } if (proj_same_matrix(alphabeta, gamma)) { alphabeta_found = 1; break; } } while (edge0 != placeholder); /* If alphabeta_found == 1 we know the image of the */ /* match_face doesn't extend beyond this edge. If */ /* alphabeta_found == 0 we need to investigate */ /* further by checking whether the vertices of the */ /* match_face all lie on the correct side of the */ /* Dirichlet plane determined by alphabeta. */ if ( ! alphabeta_found) { /* see comments in add_face() */ /* first get the image of origin */ matvecmul4(alphabeta, origin, gorigin); DHPt3PerpBisect( origin, gorigin, planne,metric); do { if (edge0->fL == match_face) { /* CCL */ vertex = edge0->v0; edge0 = edge0->e1L; } else { /* CL */ vertex = edge0->v1; edge0 = edge0->e0R; } if (DHPt3Dot(planne, vertex->x,metric) > VERTEX_EPSILON) { /* add the new group element */ add_element(polyhedron, alphabeta); /* if face has been modified, go home */ if (polyhedron->pending0.nxt != face) return(1); /* otherwise if match_face still exists, */ /* keep checking face */ if (face->inverse) { edge0 = match_face->some_edge; break; } /* otherwise put face on the dirty list and */ /* go home */ face->nxt = &polyhedron->dirty1; face->prv = polyhedron->dirty1.prv; polyhedron->dirty1.prv->nxt = face; polyhedron->dirty1.prv = face; polyhedron->pending0.nxt = &polyhedron->pending1; polyhedron->pending1.prv = &polyhedron->pending0; return(1); } } while (edge0 != placeholder); } } while (edge != face->some_edge); return(1); } static int find_Dirichlet_domain(polyhedron) WEpolyhedron *polyhedron; { /* By the time this routine is called the faces */ /* corresponding to the initial generators should all */ /* be on the dirty list, and the clean list should be */ /* empty. The faces are examined one at a time to see */ /* whether (the image of) the matching face is entirely */ /* contained within the given face. If it is, the face */ /* is put on the clean list. If it's not, a new face */ /* is added to the polyhedron. New faces, and old */ /* faces which have been cut, are put on the dirty list.*/ WEface *face; while (polyhedron->dirty0.nxt != &polyhedron->dirty1) { /* pull a face off the dirty list */ face = polyhedron->dirty0.nxt; polyhedron->dirty0.nxt = face->nxt; face->nxt->prv = &polyhedron->dirty0; /* put the face on the pending list so that if */ /* add_face() feels the need to put it on the */ /* dirty list, it will have a list to remove */ /* it from */ face->nxt = &polyhedron->pending1; face->prv = &polyhedron->pending0; polyhedron->pending0.nxt = face; polyhedron->pending1.prv = face; /* check the face */ if (check_face(polyhedron, face) == 0) /* don't worry if original faces hang around */ if (face->fill_tone != -2) return 0; /* if the face is still on the pending list, */ /* move it to the clean list */ if (polyhedron->pending0.nxt == face) { face->nxt = polyhedron->clean0.nxt; face->prv = &polyhedron->clean0; polyhedron->clean0.nxt->prv = face; polyhedron->clean0.nxt = face; } } return 1; } static int all_dirty_faces_unmatched(polyhedron) WEpolyhedron *polyhedron; { WEface *face; int realdirty = 0; /* If at least one face on the dirty list has a */ /* matching face, or the dirty list is empty, */ /* return 0. Otherwise return 1. */ /* Make a change to this routine to ignore faces of the original cube */ if (polyhedron->dirty0.next == &polyhedron->dirty1) return(0); /* shouldn't occur in practice */ for (face = polyhedron->dirty0.nxt; face != &polyhedron->dirty1; face = face->nxt) { if (face->fill_tone != -2) /* not face of original cube */ { if ( face->inverse) return(0); else realdirty = 1; /* there exist unmatched, real faces */ } } return(realdirty); } /* unsophisticated_search() returns 1 if it */ /* manages to add a new face, 0 if it doesn't. */ static int unsophisticated_search(polyhedron) WEpolyhedron *polyhedron; { /* This routine serves as a backup for the more efficient */ /* algorithm which is normally used. On rare occasions */ /* (e.g. for wh_left) the usual algorithm ends up with only */ /* unmatched faces on the dirty list, so it cannot proceed. */ /* This routine tries looking at all products of two */ /* elements in an effort to scare up a new face. */ WEface *face0, *face1; proj_matrix alpha; for (face0=polyhedron->face_list; face0; face0=face0->next) for (face1=polyhedron->face_list; face1; face1=face1->next) { proj_mult(face0->group_element, face1->group_element, alpha); if (add_element(polyhedron, alpha)) return(1); } return(0); } /* Faces are created in matched pairs (corresponding to a */ /* group element and its inverse) by add_element(). If one */ /* element of a pair is killed, the inverse pointer of its */ /* mate is set to NULL. */ /* add_element() returns 1 if it adds a face, 0 if it doesn't */ static int add_element(polyhedron, m0) WEpolyhedron *polyhedron; proj_matrix m0; { proj_matrix m1; WEface *new_face0, *new_face1; int result0, result1, order2 = 0; /* compute the inverse matrix */ proj_invert(m0, m1); if (proj_same_matrix(m0, m1)) order2 = 1; /* create the new faces */ new_face0 = (WEface *) malloc32((MyInt32) sizeof(WEface)); new_face1 = (WEface *) malloc32((MyInt32) sizeof(WEface)); /* set their inverse pointers */ new_face0->inverse = new_face1; new_face1->inverse = new_face0; /* attempt to add the faces */ /* If for any reason one (or both) is unnecessary, */ /* add_face() will free the one and adjust the */ /* inverse pointer of the other. */ if (order2) { new_face0->inverse = new_face0; result0 = add_face(polyhedron, m0, new_face0); return(result0 ); } else { result0 = add_face(polyhedron, m0, new_face0); result1 = add_face(polyhedron, m1, new_face1); return(result0 || result1); } } /* add_face() returns 1 if it adds a face, 0 if it doesn't */ static int add_face(polyhedron, matrix, new_face) WEpolyhedron *polyhedron; proj_matrix matrix; WEface *new_face; { vector planne, gorigin; WEvertex *vertex; int face_is_needed; /* get the normal (in the Minkowski metric) */ /* to the Dirichlet hyperplane */ /* first get the image of origin */ matvecmul4(matrix,origin, gorigin); DHPt3PerpBisect(origin, gorigin, planne,metric); /* Compute the "distance" from each vertex to the */ /* Dirichlet plane. Count the number of vertices */ /* on or beyond the plane. Vertices within */ /* VERTEX_EPSILON of the plane are assumed to lie */ /* on the plane. */ face_is_needed = 0; for (vertex=polyhedron->vertex_list; vertex; vertex=vertex->next) { vertex->dist = DHPt3Dot( planne, vertex->x, metric); if (vertex->dist > VERTEX_EPSILON) face_is_needed = 1; else if (vertex->dist > - VERTEX_EPSILON) { if (fabs(vertex->dist) > 1e-2 * VERTEX_EPSILON && ! vertex_epsilon_message_given) { if (debug) roundoff_message("VERTEX_EPSILON"); vertex_epsilon_message_given = 1; } vertex->dist = 0.0; } } if ( ! face_is_needed) { if (new_face->inverse) new_face->inverse->inverse = NULL; free32(new_face); return(0); } /* put a vertex in the middle of each cut edge */ cut_edges(polyhedron); /* set the new face */ new_face->order = 0; new_face->fill_tone = -1; proj_copy(new_face->group_element, matrix); /* install the new face in the polyhedron */ adjust_f_e_ptrs(polyhedron); cut_faces(polyhedron, new_face); remove_dead_edges(polyhedron); remove_dead_vertices(polyhedron); /* put the new face on the face lists */ new_face->next = polyhedron->face_list; polyhedron->face_list = new_face; new_face->nxt = polyhedron->dirty0.nxt; new_face->prv = &polyhedron->dirty0; polyhedron->dirty0.nxt->prv = new_face; polyhedron->dirty0.nxt = new_face; polyhedron->num_faces++; return(1); } static void cut_edges(polyhedron) WEpolyhedron *polyhedron; { int i; double d0, d1, t, s; WEedge *edge, *new_edge, *nbr_edge; WEvertex *new_vertex; for (edge=polyhedron->edge_list; edge; edge=edge->next) { d0 = edge->v0->dist; d1 = edge->v1->dist; if ((d0 < 0.0 && d1 > 0.0) || (d0 > 0.0 && d1 < 0.0)) { new_vertex = (WEvertex *) malloc32((MyInt32) sizeof(WEvertex)); new_edge = (WEedge *) malloc32((MyInt32) sizeof(WEedge)); t = -d0/(d1 - d0); s = 1.0 - t; for (i=4; --i>=0; ) new_vertex->x[i] = s * edge->v0->x[i] + t * edge->v1->x[i]; new_vertex->dist = 0.0; new_vertex->next = polyhedron->vertex_list; polyhedron->vertex_list = new_vertex; polyhedron->num_vertices++; new_edge->v1 = edge->v1; new_edge->v0 = new_vertex; edge->v1 = new_vertex; nbr_edge = edge->e1L; new_edge->e1L = nbr_edge; if (nbr_edge->e0L == edge) nbr_edge->e0L = new_edge; else nbr_edge->e1R = new_edge; nbr_edge = edge->e1R; new_edge->e1R = nbr_edge; if (nbr_edge->e0R == edge) nbr_edge->e0R = new_edge; else nbr_edge->e1L = new_edge; new_edge->e0L = edge; new_edge->e0R = edge; edge->e1L = new_edge; edge->e1R = new_edge; new_edge->fL = edge->fL; new_edge->fR = edge->fR; edge->fL->order++; edge->fR->order++; new_edge->next = polyhedron->edge_list; polyhedron->edge_list = new_edge; polyhedron->num_edges++; } } return; } static void adjust_f_e_ptrs(polyhedron) WEpolyhedron *polyhedron; { WEedge *edge; /* make sure each good face "sees" a good edge */ for (edge=polyhedron->edge_list; edge; edge=edge->next) if (edge->v0->dist < 0.0 || edge->v1->dist < 0.0) { edge->fL->some_edge = edge; edge->fR->some_edge = edge; } return; } /* check each old face: */ /* (1) if a face is entirely >= 0, remove it */ /* (this can be checked immediately, because each */ /* good face sees a good edge at this point) */ /* (check that removing dead faces doesn't */ /* change the group) */ /* (2) if a face is entirely <=0, leave it alone */ /* (but make sure any 0-0 edges "see" the new face */ /* and the new face sees the 0-0 edges) */ /* also set order of new face */ /* (3) otherwise bisect the face with a new edge, and */ /* make sure the new edge "sees" the new new face */ /* and the old face "sees" a valid edge */ static void cut_faces(polyhedron, new_face) WEpolyhedron *polyhedron; WEface *new_face; { int zero_count, count, count1 = 0, count3 = 0; double d0, d1; WEvertex *v01, *v23; WEedge *edge, *next_edge, *new_edge, *e0 = NULL, *e1 = NULL, *e2 = NULL, *e3 = NULL; WEface *f_list, *face; /* to facilitate removing unneeded faces, first move all */ /* the faces onto f_list, then move the good faces back */ /* onto polyhedron->face_list as they are processed */ f_list = polyhedron->face_list; polyhedron->face_list = NULL; /* we'll count the order of the new_face as we go */ new_face->order = 0; while (f_list) { /* pull a face off f_list */ face = f_list; f_list = f_list->next; /* Is the face entirely >= 0 ? */ /* Note: adjust_f_e_ptrs() has been called, */ /* so all good faces see good edges. */ /* Some fL and fR pointers on 0-0 edges may */ /* temporarily be left dangling when face is freed. */ if (face->some_edge->v0->dist >= 0 && face->some_edge->v1->dist >= 0) { if (face->inverse) face->inverse->inverse = NULL; face->prv->nxt = face->nxt; face->nxt->prv = face->prv; free32(face); --polyhedron->num_faces; continue; } /* cut the face if necessary */ /* counts number of vertices at dist 0 (two consecutive */ /* vertices at dist 0 are counted as one (or none) */ /* because we don't need to cut such a face) */ zero_count = 0; /* We'll traverse the face counterwise to find the */ /* edges going in and out of the "zero vertices" (i.e. */ /* the vertices at dist 0) */ /* e0 = negative to zero */ /* e1 = zero to positive */ /* e2 = positive to zero */ /* e3 = zero to negative */ count = 0; /* for use in finding order of new face */ edge = face->some_edge; do { /* which way does the edge point? */ /* edge points counterclockwise */ if (edge->fL == face) { d0 = edge->v0->dist; d1 = edge->v1->dist; next_edge = edge->e1L; } else { /* edge points clockwise */ d0 = edge->v1->dist; d1 = edge->v0->dist; next_edge = edge->e0R; } if (d0 == 0.0) { if (d1 == 0.0) { if (edge->fL == face) edge->fR = new_face; else edge->fL = new_face; new_face->some_edge = edge; new_face->order++; break; } zero_count++; if (d1 < 0.0) { e3 = edge; count3 = count; } else { /* d1 > 0.0 */ e1 = edge; count1 = count; } } else if (d1 == 0.0) { if (d0 < 0.0) e0 = edge; else /* d0 > 0.0 */ e2 = edge; } edge = next_edge; count++; } while (edge != face->some_edge); if (zero_count == 2) { /* we need to make a cut */ new_edge = &edgeheap[heapcount++]; new_edge = (WEedge *) malloc32((MyInt32) sizeof(WEedge)); polyhedron->num_edges++; new_edge->next = polyhedron->edge_list; polyhedron->edge_list = new_edge; /* v01 = vertex between edges e0 and e1 */ /* v23 = vertex between edges e2 and e3 */ v01 = (e0->v0->dist == 0.0) ? e0->v0 : e0->v1; v23 = (e2->v0->dist == 0.0) ? e2->v0 : e2->v1; new_edge->v0 = v01; new_edge->v1 = v23; new_edge->e0L = e0; new_edge->e0R = e1; new_edge->e1L = e3; new_edge->e1R = e2; new_edge->fL = face; new_edge->fR = new_face; if (e0->v0 == v01) e0->e0R = new_edge; else e0->e1L = new_edge; if (e1->v0 == v01) e1->e0L = new_edge; else e1->e1R = new_edge; if (e2->v0 == v23) e2->e0R = new_edge; else e2->e1L = new_edge; if (e3->v0 == v23) e3->e0L = new_edge; else e3->e1R = new_edge; new_face->some_edge = new_edge; new_face->order++; face->order = (count1 - count3 + face->order)%face->order + 1; /* transfer face to dirty list */ face->prv->nxt = face->nxt; face->nxt->prv = face->prv; face->nxt = polyhedron->dirty0.nxt; face->prv = &polyhedron->dirty0; polyhedron->dirty0.nxt->prv = face; polyhedron->dirty0.nxt = face; } /* put the face back on polyhedron->face_list */ face->next = polyhedron->face_list; polyhedron->face_list = face; } return; } static void remove_dead_edges(polyhedron) WEpolyhedron *polyhedron; { WEedge *e_list, *edge; /* Move all edges onto e_list, then move the good edges */ /* back onto polyhedron->edge_list. */ e_list = polyhedron->edge_list; polyhedron->edge_list = NULL; while (e_list) { /* pull an edge off e_list */ edge = e_list; e_list = e_list->next; /* if it has one or more bad vertices, throw it away */ if (edge->v0->dist > 0.0 || edge->v1->dist > 0.0) { /* first tidy up at vertices of dist 0.0 */ if (edge->v0->dist == 0.0) { if (edge->e0L->e0R == edge) edge->e0L->e0R = edge->e0R; else edge->e0L->e1L = edge->e0R; if (edge->e0R->e0L == edge) edge->e0R->e0L = edge->e0L; else edge->e0R->e1R = edge->e0L; } if (edge->v1->dist == 0.0) { if (edge->e1L->e1R == edge) edge->e1L->e1R = edge->e1R; else edge->e1L->e0L = edge->e1R; if (edge->e1R->e1L == edge) edge->e1R->e1L = edge->e1L; else edge->e1R->e0R = edge->e1L; } /* throw away the edge */ free32(edge); --polyhedron->num_edges; } else { /* put it back on polyhedron->edge_list */ edge->next = polyhedron->edge_list; polyhedron->edge_list = edge; } } return; } static void remove_dead_vertices(polyhedron) WEpolyhedron *polyhedron; { WEvertex *v_list, *vertex; /* Move all vertices onto v_list, then move the */ /* good vertices back onto polyhedron->vertex_list. */ v_list = polyhedron->vertex_list; polyhedron->vertex_list = NULL; while (v_list) { /* pull an vertex off v_list */ vertex = v_list; v_list = v_list->next; /* if it's been cut off, throw it away */ if (vertex->dist > 0.0) { free32(vertex); --polyhedron->num_vertices; } else { /* put it back on polyhedron->vertex_list */ vertex->next = polyhedron->vertex_list; polyhedron->vertex_list = vertex; } } return; } static void number_faces(polyhedron) WEpolyhedron *polyhedron; { int count; WEface *face; /* at this point just assign consecutive indices to the */ /* faces, and let the routines for making display lists,*/ /* saving in other file formats, etc. set the actual */ /* fill tones */ count = 0; for (face=polyhedron->face_list; face; face=face->next) { /* skip faces which were already assigned fill_tones */ /* when their inverses were found */ if (face->fill_tone >= 0) continue; if (face->inverse == NULL) { if (debug) fprintf(stderr, "unmatched faces in Dirichlet.c\n"); } face->fill_tone = count; if (face->inverse) face->inverse->fill_tone = count; count++; } return; } #if 0 static void read_vertices(face, v) WEface *face; double (*v)[3]; { int i; WEedge *edge; edge = face->some_edge; do { if (edge->fL == face) { /* edge points counterclockwise */ for (i=3; --i>=0; ) (*v)[i] = edge->v0->x[i]; v++; edge = edge->e1L; } else { /* edge points clockwise */ for (i=3; --i>=0; ) (*v)[i] = edge->v1->x[i]; v++; edge = edge->e0R; } } while (edge != face->some_edge); return; } #endif static void print_poly(polyhedron) WEpolyhedron *polyhedron; { print_vef(polyhedron); print_vertices(polyhedron); } #if 0 static void print_statistics(polyhedron) WEpolyhedron *polyhedron; { print_vef(polyhedron); print_vertex_distances(polyhedron); print_edge_lengths(polyhedron); print_face_distances(polyhedron); return; } #endif static void print_vef(polyhedron) WEpolyhedron *polyhedron; { if (debug) fprintf(stderr, "%d vertices, %d edges, %d faces\n", polyhedron->num_vertices, polyhedron->num_edges, polyhedron->num_faces); if (polyhedron->num_vertices - polyhedron->num_edges + polyhedron->num_faces != 2) { if (debug) fprintf(stderr, "Euler characteristic error in Dirichlet.c\n"); return; } return; } #if 0 static void saveOOGL(polyhedron) WEpolyhedron *polyhedron; { FILE *fp = fopen("/tmp/test.off","w"); GeomFSave(WEPolyhedronToPolyList(polyhedron), fp, "/tmp/test.off"); fclose(fp); } #endif static void print_vertices(polyhedron) WEpolyhedron *polyhedron; { WEvertex *vertex; fprintf(stderr, "Vertices:\n"); for (vertex=polyhedron->vertex_list; vertex; vertex=vertex->next) fprintf(stderr, "%f\t%f\t%f\t%f\n",vertex->x[0], vertex->x[1], vertex->x[2], vertex->x[3]); } #if 0 static void print_vertex_distances(polyhedron) WEpolyhedron *polyhedron; { WEvertex *vertex; int ideal_vertex_present, finite_vertex_present, i; double norm, max, min, ideal_point_norm; /* Note: the following statement revealed that "infinity" */ /* is at a distance of about 17 on a Mac. */ /* fprintf(stderr, "infinity = %lf\n", acosh(1.0/ideal_point_norm)); */ ideal_point_norm = sqrt(1e5 * HARDWARE_PRECISION); ideal_vertex_present = 0; finite_vertex_present = 0; min = cosh(17.0); max = 0.0; if (metric == DG_HYPERBOLIC) { for (vertex=polyhedron->vertex_list; vertex; vertex=vertex->next) { norm = sqrt(fabs(DHPt3Dot3(vertex->x, vertex->x, metric))); if (norm < ideal_point_norm) { vertex->ideal = 1; ideal_vertex_present = 1; } else { vertex->ideal = 0; for (i=4; --i>=0; ) vertex->x[i] /= norm; if (vertex->x[3] < min) min = vertex->x[3]; if (vertex->x[3] > max) max = vertex->x[3]; finite_vertex_present = 1; } } if (finite_vertex_present) { fprintf(stderr, "closest vertex %.6f\n", acosh(min)); if (ideal_vertex_present) fprintf(stderr, "furthest finite vertex %.6f\n", acosh(max)); else fprintf(stderr, "furthest vertex %.6f\n", acosh(max)); } else fprintf(stderr, "all vertices are at infinity\n"); } return; } #endif /* Note: print_edge_lengths() assumes print_vertex_distances() */ /* has already been called to normalize the vertices. */ #if 0 static void print_edge_lengths(polyhedron) WEpolyhedron *polyhedron; { WEedge *edge; int finite_edge_present, infinite_edge_present; double dot, min, max; min = cosh(17.0); max = 1.0; finite_edge_present = 0; infinite_edge_present = 0; for (edge=polyhedron->edge_list; edge; edge=edge->next) if (edge->v0->ideal || edge->v1->ideal) infinite_edge_present = 1; else { finite_edge_present = 1; dot = -DHPt3Dot3( edge->v0->x,edge->v1->x, metric); if (dot < min) min = dot; if (dot > max) max = dot; } if (finite_edge_present) if (infinite_edge_present) { fprintf(stderr, "shortest finite edge %.6f\n", acosh(min)); fprintf(stderr, "longest finite edge %.6f\n", acosh(max)); } else { fprintf(stderr, "shortest edge %.6f\n", acosh(min)); fprintf(stderr, "longest edge %.6f\n", acosh(max)); } else fprintf(stderr, "all edges are infinite\n"); return; } #endif #if 0 static void print_face_distances(polyhedron) WEpolyhedron *polyhedron; { WEface *face; double min, max; min = 1e308; /* ieee max double */ max = 0; for (face=polyhedron->face_list; face; face=face->next) { if (face->group_element[3][3] < min) min = face->group_element[3][3]; if (face->group_element[3][3] > max) max = face->group_element[3][3]; } fprintf(stderr, "closest face plane %.6f\n", 0.5 * acosh(min)); fprintf(stderr, "furthest face plane %.6f\n", 0.5 * acosh(max)); return; } #endif #if 0 static void free_polyhedron(polyhedron) WEpolyhedron *polyhedron; { WEvertex *dead_vertex; WEedge *dead_edge; WEface *dead_face; while (polyhedron->vertex_list) { dead_vertex = polyhedron->vertex_list; polyhedron->vertex_list = dead_vertex->next; free32(dead_vertex); } while (polyhedron->edge_list) { dead_edge = polyhedron->edge_list; polyhedron->edge_list = dead_edge->next; free32(dead_edge); } while (polyhedron->face_list) { dead_face = polyhedron->face_list; polyhedron->face_list = dead_face->next; free32(dead_face); } return; } #endif static void roundoff_message(epsilon_name) char *epsilon_name; { #if PRECISE_GENERATORS fprintf(stderr,"\nWARNING: roundoff error is getting a bit large. (%s)\n", epsilon_name); #else fprintf(stderr,"\nWARNING: roundoff error is getting perilously large. (%s)\n", epsilon_name); #endif fprintf(stderr,"To verify the correctness of the final Dirichlet domain,\n"); fprintf(stderr,"move off to another point in the Dehn filling plane, then\n"); fprintf(stderr,"return to the present point, recompute the Dirichlet domain,\n"); fprintf(stderr,"and see whether you get the same number of vertices, edges\n"); fprintf(stderr,"and faces. (Moving to a different point and then returning\n"); fprintf(stderr,"will randomize the roundoff error.)\n\n"); return; } int proj_same_matrix(m0, m1) proj_matrix m0, m1; { int i, j; double diff; for (i=4; --i>=0; ) for (j=4; --j>=0; ) { diff = fabs(m0[i][j] - m1[i][j]); if (diff > MATRIX_EPSILON) return(0); if (diff > 1e-2 * MATRIX_EPSILON && ! matrix_epsilon_message_given) { if (debug) roundoff_message("MATRIX_EPSILON"); matrix_epsilon_message_given = 1; } } return(1); } geomview-1.9.4/src/lib/gprim/discgrp/winged_edge.h0000644000175000001440000000417010455701003017001 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _winged_edge_ #define _winged_edge_ #ifndef _proj_matrix_ #define _proj_matrix_ typedef double proj_matrix[4][4]; typedef double point[4]; #endif typedef struct WEvertex { double x[4]; /* coordinates (x[3] == 1) */ double dist; /* distance from slicing plane (used locally) */ int ideal; /* is this an ideal vertex (used locally) */ struct WEvertex *next; } WEvertex; typedef struct WEedge { struct WEvertex *v0, /* tail */ *v1; /* tip */ struct WEedge *e0L, /* back left */ *e0R, /* back right */ *e1L, /* front left */ *e1R; /* front right */ struct WEface *fL, /* left face */ *fR; /* right face */ struct WEedge *next; } WEedge; typedef struct WEface { int order; int fill_tone; struct WEedge *some_edge; proj_matrix group_element; struct WEface *inverse; struct WEface *next; /* general use */ struct WEface *prv; /* used for clean and dirty lists */ struct WEface *nxt; } WEface; typedef struct { int num_vertices, num_edges, num_faces; WEvertex *vertex_list; WEedge *edge_list; WEface *face_list; WEface dirty0, /* dummy faces to serve as start and */ dirty1, /* finish of doubly linked lists */ clean0, clean1, pending0, pending1; } WEpolyhedron; #endif geomview-1.9.4/src/lib/gprim/discgrp/enum.h0000644000175000001440000000225010455701002015500 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #define MAXDEPTH 32 #define INSERT 1 #define MATCH 2 #define BEGIN 4 /* loaded at beginning: don't print it */ #define insert_mat(xxx) insert_or_match_mat(xxx, INSERT) #define match_mat(xxx) insert_or_match_mat(xxx, MATCH) #define begin_mat(xxx) insert_or_match_mat(xxx, INSERT | BEGIN) geomview-1.9.4/src/lib/gprim/discgrp/dgclass.c0000644000175000001440000000520010600206434016146 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrpP.h" GeomClass *DiscGrpClass = NULL; int DiscGrpPresent = 1; static char discgrpName[] = "discgrp"; extern DiscGrp *DiscGrpCreate( DiscGrp *, GeomClass *, va_list * ); extern DiscGrp *DiscGrpDelete( DiscGrp * ); extern DiscGrp *DiscGrpCopy( DiscGrp * ); extern int DiscGrpGet( DiscGrp *, int attr, void *attrp ); extern GeomScanFunc DiscGrpHandleScan; char * DiscGrpName() { return discgrpName; } GeomClass * DiscGrpMethods() { if (!DiscGrpClass) { DiscGrpClass = GeomClassCreate(discgrpName); DiscGrpClass->name = DiscGrpName; DiscGrpClass->methods = (GeomMethodsFunc *) DiscGrpMethods; DiscGrpClass->create = (GeomCreateFunc *) DiscGrpCreate; DiscGrpClass->Delete = (GeomDeleteFunc *) DiscGrpDelete; DiscGrpClass->copy = (GeomCopyFunc *) DiscGrpCopy; DiscGrpClass->fsave = (GeomFSaveFunc *) DiscGrpFSave; DiscGrpClass->bound = (GeomBoundFunc *) DiscGrpBound; DiscGrpClass->pick = (GeomPickFunc *) DiscGrpPick; DiscGrpClass->draw = (GeomDrawFunc *) DiscGrpDraw; DiscGrpClass->scan = (GeomScanFunc *)DiscGrpHandleScan; DiscGrpClass->import = (GeomImportFunc *) DiscGrpImport; DiscGrpClass->get = (GeomGetFunc *) DiscGrpGet; /* DiscGrpClass->fload = (GeomFLoadFunc *) DiscGrpFLoad; DiscGrpClass->evert = (GeomEvertFunc *) DiscGrpEvert; DiscGrpClass->transform = (GeomTransformFunc *) DiscGrpTransform; DiscGrpClass->transformto = (GeomTransformToFunc *) DiscGrpTransformTo; */ } return DiscGrpClass; } geomview-1.9.4/src/lib/gprim/discgrp/matlist.c0000644000175000001440000001300110461140705016204 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include #include "vec4.h" #include "enum.h" #include "transform.h" #include "dgflag.h" extern int debug, stringent, metric; static float epsilon = .005; void traverse_list(); int is_same(); struct node { Transform t; struct node *l,*r, *p; /* left, right, parent */ struct node *same; /* if it's "close" to this one */ int num; int type; /* process but don't print? */ float norm; char *word; } ; static struct node *head; double getnorm(int metric, Transform t) { switch (metric) { case DG_EUCLIDEAN: return(sqrt(t[3][0]*t[3][0] + t[3][1]*t[3][1] + t[3][2]*t[3][2])); break; case DG_HYPERBOLIC: if (ABS(t[3][3]) < 1.0) return(0.0); return ( acosh( ABS( t[3][3])) ); break; case DG_SPHERICAL: { float sum = 0; int i,j; for (i=0; i<4; ++i) for (j=0; j<4; ++j) sum += fabs(t[i][j] - (i==j)); return(sum); } break; } return (double)0; } static struct node * alloc_node() { struct node *n; n = (struct node *) malloc(sizeof(struct node) ); if (n == NULL) exit(printf("Unable to allocate: alloc_node\n")); n->p = n->l = n->r = n->same = NULL; n->num = 1; return(n); } int insert_or_match_mat(mat, mode) Transform mat; int mode; /* insert or match? */ { struct node *n = NULL, *p; float d; struct node tnode; double getnorm(); if (debug == 4) traverse_list(head); if (mode & INSERT ) n = alloc_node(); else if (mode & MATCH) n = &tnode; else n->type = 0; n->norm = getnorm(metric, mat); TmCopy(mat, n->t); if (head == NULL) { if (mode & MATCH) return(0); /* no match */ else if (mode & INSERT) { head = n; return(1); /* successful insert */ } } /* ...else... */ for (p = head; p != NULL; ) { d = fabs(p->norm - n->norm); if (ABS(d) < epsilon) { /* insert! */ if (mode & INSERT) { /* and stick it at the end of the cluster */ p->num++; /* count this one */ for ( ; p->same != NULL; p = p->same) ; /* back up one */ p->same = n; n->p = p; /* mark the parent */ return(1); } else { /* look here for a match */ for ( ; p != NULL; p = p->same) if (is_same(p->t, n->t)) return( 1 ); /* matched! */ return(0); } } else if (d > 0) { /* go right */ if (p->r == NULL) { if (mode & INSERT) { p->r = n; n->p = p; return(1); } else { /* no match */ return(0); } } else p = p->r; /* continue search */ } else if (d < 0) { /* go left */ if (p->l == NULL) { if (mode & INSERT) { p->l = n; n->p = p; return(1); } else { /* no match */ return(0); } } else p = p->l; /* continue search */ } } return 0; } int is_same(t0, t1) Transform t0, t1; { int i, j, same = 1; if (stringent) { float factor, fepsilon; Transform tt1, tt2; Tm3Invert(t0, tt1); Tm3Concat(t1,tt1,tt2); /* is tt2 the identity, or a multiple of the identity? */ factor = tt2[0][0]; fepsilon = ABS(factor * epsilon); for (i=0; i<4; ++i) for (j=0; j<4; ++j) { /* check against identity matrix */ if ( ABS( tt2[i][j] - factor * ((i == j) ? 1 : 0) ) > fepsilon ) { same = 0; goto OUT; } } } else { for (i=0; i<4; ++i) { for (j=0; j<4; ++j) if (ABS(t0[i][j] - t1[i][j]) > epsilon) { same = 0; goto OUT; } } } OUT: return(same); } int is_new(t) Transform t; { if ( insert_or_match_mat(t, MATCH) ) { return(0); } return(DG_CONSTRAINT_NEW); } void traverse_list(n) struct node *n; { if (n == NULL) return; traverse_list(n->l); fprintf(stderr,"%10f\t%d\n",n->t[3][3], n->num); traverse_list(n->r); } static void _delete_list(n) struct node *n; { struct node *nt, *ot; if (n == NULL) return; _delete_list(n->l); _delete_list(n->r); /* erase the cluster of equal values at this node */ /* first go to the end of the cluster ... */ for (ot = n ; ot->same != NULL; ot = ot->same) ; /* ... then climb back up, erasing as you go */ if (ot != n) for ( ; ot->p != n; ) { nt = ot->p; free(ot); ot = nt; } /* erase the evidence of this node in its parent */ if (n->p) { if (n->p->l == n) n->p->l = NULL; if (n->p->r == n) n->p->r = NULL; } free(n); } void delete_list() { _delete_list(head); head = NULL; } geomview-1.9.4/src/lib/gprim/discgrp/Makefile.am0000644000175000001440000000101610600646505016426 00000000000000INCLUDES = $(default_includes) man_MANS = discgrp.5gv EXTRA_DIST = Headers $(man_MANS) noinst_LTLIBRARIES = libdg.la libdg_la_SOURCES = \ colormap.c complex.c dgbound.c dgclass.c dgconstraint.c dgcopy.c dgcreate.c dgdelete.c dgdirdom.c dgdraw.c dgenum.c dgevert.c dgmisc.c dgpick.c dgsave.c dgstream.c dgtransform.c dhpoint3.c matlist.c outstack.c polyhedron.c projective.c stack.c util.c weeks_dirdom.c xform.c \ complex.h dgflag.h discgrp.h discgrpP.h enum.h extern.h options.h projective.h vec4.h winged_edge.h geomview-1.9.4/src/lib/gprim/discgrp/Makefile.in0000644000175000001440000004553210665240503016451 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/discgrp DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libdg_la_LIBADD = am_libdg_la_OBJECTS = colormap.lo complex.lo dgbound.lo dgclass.lo \ dgconstraint.lo dgcopy.lo dgcreate.lo dgdelete.lo dgdirdom.lo \ dgdraw.lo dgenum.lo dgevert.lo dgmisc.lo dgpick.lo dgsave.lo \ dgstream.lo dgtransform.lo dhpoint3.lo matlist.lo outstack.lo \ polyhedron.lo projective.lo stack.lo util.lo weeks_dirdom.lo \ xform.lo libdg_la_OBJECTS = $(am_libdg_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libdg_la_SOURCES) DIST_SOURCES = $(libdg_la_SOURCES) man5dir = $(mandir)/man5 am__installdirs = "$(DESTDIR)$(man5dir)" NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) man_MANS = discgrp.5gv EXTRA_DIST = Headers $(man_MANS) noinst_LTLIBRARIES = libdg.la libdg_la_SOURCES = \ colormap.c complex.c dgbound.c dgclass.c dgconstraint.c dgcopy.c dgcreate.c dgdelete.c dgdirdom.c dgdraw.c dgenum.c dgevert.c dgmisc.c dgpick.c dgsave.c dgstream.c dgtransform.c dhpoint3.c matlist.c outstack.c polyhedron.c projective.c stack.c util.c weeks_dirdom.c xform.c \ complex.h dgflag.h discgrp.h discgrpP.h enum.h extern.h options.h projective.h vec4.h winged_edge.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/discgrp/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/discgrp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libdg.la: $(libdg_la_OBJECTS) $(libdg_la_DEPENDENCIES) $(LINK) $(libdg_la_OBJECTS) $(libdg_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/colormap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgconstraint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgdelete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgdirdom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgenum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgevert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgmisc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgstream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgtransform.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhpoint3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/outstack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polyhedron.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/projective.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weeks_dirdom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man5: $(man5_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)" @list='$(man5_MANS) $(dist_man5_MANS) $(nodist_man5_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.5*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 5*) ;; \ *) ext='5' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst"; \ done uninstall-man5: @$(NORMAL_UNINSTALL) @list='$(man5_MANS) $(dist_man5_MANS) $(nodist_man5_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.5*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 5*) ;; \ *) ext='5' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man5dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man5dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(MANS) installdirs: for dir in "$(DESTDIR)$(man5dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-man5 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man5 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man5 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-man uninstall-man5 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/discgrp/polyhedron.c0000644000175000001440000001442210622716753016735 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * polyhedron.c: routines which operate on the polyhedron data structure */ /* */ #include "geom.h" #include "geomclass.h" #include "polylistP.h" #include "ooglutil.h" #include "point.h" #include "winged_edge.h" #include "extern.h" Geom * WEPolyhedronToVect(WEpolyhedron *poly, HPoint3 origin) { int i, ii, jj; Geom *orbit; HPoint3 gorigin; /*static HPoint3 origin2 = {0,0,0,1};*/ WEface *fptr; Transform T; short *vnvert; short *vncolor; HPoint3 *p; ColorA *c; vnvert = OOGLNewN(short, poly->num_faces); vncolor = OOGLNewN(short, poly->num_faces); p = OOGLNewN(HPoint3, 2*poly->num_faces); c = OOGLNewN(ColorA, poly->num_faces); for (i=0, fptr=poly->face_list; inum_faces; ++i, fptr = fptr->next) { vnvert[i] = 2; /* line segment! */ vncolor[i] = 1; /* next two lines assume the indices in two sorts of groups match */ c[i] = GetCmapEntry( fptr->fill_tone); for (ii=0; ii<4; ++ii) for (jj=0; jj<4; ++jj) /* fptr's tforms are transposed! */ T[jj][ii] = fptr->group_element[ii][jj]; HPt3Transform( T, &origin, &gorigin); p[2*i] = origin; p[2*i+1] = gorigin; } orbit = GeomCreate("vect", CR_NOCOPY, CR_NVECT, poly->num_faces, CR_NVERT, 2*poly->num_faces, CR_NCOLR, poly->num_faces, CR_VECTC, vnvert, CR_COLRC, vncolor, CR_POINT4, p, CR_COLOR, c, CR_4D, 1, CR_END); return(orbit); } /*static ColorA white = {1,1,1,1};*/ Geom * WEPolyhedronToPolyList(poly) WEpolyhedron *poly; { ColorA *colors = NULL; HPoint3 *points = NULL; int *nvert = NULL; int *vindex = NULL; WEvertex *vptr; WEedge *eptr; WEface *fptr; int cnt, cnt2, total; Geom *plist; points = OOGLNewN(HPoint3, poly->num_vertices); colors = OOGLNewN(ColorA,poly->num_faces); nvert = OOGLNewN(int, poly->num_faces); vptr = poly->vertex_list; cnt = 0; do { points[cnt].x = vptr->x[0]; points[cnt].y = vptr->x[1]; points[cnt].z = vptr->x[2]; points[cnt].w = vptr->x[3]; vptr->ideal = cnt++; vptr = vptr->next; } while (vptr != NULL); cnt = 0; fptr = poly->face_list; total = 0; do { colors[cnt] = GetCmapEntry(fptr->fill_tone); nvert[cnt] = fptr->order; total += nvert[cnt++]; fptr = fptr->next; } while (fptr != NULL); vindex = OOGLNewN(int, total); cnt = 0; fptr = poly->face_list; do { eptr = fptr->some_edge; cnt2 = 0; do { if (eptr->fL == fptr) { vindex[cnt+cnt2] = eptr->v0->ideal; cnt2++; eptr = eptr->e1L; } else { vindex[cnt+cnt2] = eptr->v1->ideal; cnt2++; eptr = eptr->e0R; } } while (eptr != fptr->some_edge); cnt+= fptr->order; fptr = fptr->next; } while (fptr != NULL); plist = GeomCreate("polylist", /*CR_NOCOPY, isn't supported for polylists! */ CR_4D, 1, CR_NPOLY, poly->num_faces, CR_NVERT, nvert, CR_VERT, vindex, CR_POINT4, points, CR_POLYCOLOR, colors, CR_FLAG, PL_HASPCOL, /* put this here or meet a bug libpolylist */ CR_END); return(plist); } Geom * WEPolyhedronToBeams( WEpolyhedron *poly, float alpha) { WEedge *eptr; WEvertex *vptr; Geom *beams; HPoint3 *points, p0, p1, v0, v1; ColorA *colors; int *nvert, *vindex, vcnt, fcnt; float omega; static ColorA white = {1,1,1,1}; points = OOGLNewN(HPoint3, 4 * poly->num_edges); colors = OOGLNewN(ColorA, poly->num_edges); nvert = OOGLNewN(int, poly->num_edges); vindex = OOGLNewN(int, 4*poly->num_edges); omega = 1.0 - alpha; vcnt = fcnt = 0; eptr = poly->edge_list; #define CCOPY( d4, hpt3) \ (hpt3)->x = d4[0]; \ (hpt3)->y = d4[1]; \ (hpt3)->z = d4[2]; \ (hpt3)->w = d4[3]; do { CCOPY( eptr->v0->x, &v0); if ((eptr->e0L->v0 = eptr->v0)) vptr = eptr->e0L->v1; else vptr = eptr->e0L->v0; CCOPY( vptr->x, &v1); HPt3Scale(omega, &v0, &p0); HPt3Scale(alpha, &v1, &p1); HPt3Add(&p0, &p1, &points[vcnt]); vindex[vcnt] = vcnt; vcnt++; if (eptr->fR == eptr->e0R->fR) if ((eptr->e0R->v0 = eptr->v0)) vptr = eptr->e0R->v1; else vptr = eptr->e0R->v0; else if ((eptr->e0L->v0 = eptr->v0)) vptr = eptr->e0L->v1; else vptr = eptr->e0L->v0; CCOPY( vptr->x, &v1); HPt3Scale(alpha, &v1, &p1); HPt3Add(&p0, &p1, &points[vcnt]); vindex[vcnt] = vcnt; vcnt++; CCOPY( eptr->v1->x, &v0); if ((eptr->e1R->v0 = eptr->v1)) vptr = eptr->e1R->v1; else vptr = eptr->e1R->v0; CCOPY( vptr->x, &v1); HPt3Scale(omega, &v0, &p0); HPt3Scale(alpha, &v1, &p1); HPt3Add(&p0, &p1, &points[vcnt]); vindex[vcnt] = vcnt; vcnt++; if ((eptr->e1L->v0 = eptr->v1)) vptr = eptr->e1L->v1; else vptr = eptr->e1L->v0; CCOPY( vptr->x, &v1); HPt3Scale(alpha, &v1, &p1); HPt3Add(&p0, &p1, &points[vcnt]); vindex[vcnt] = vcnt; vcnt++; colors[fcnt] = white; nvert[fcnt] = 4; fcnt++; eptr = eptr->next; } while (eptr != NULL); beams = GeomCreate("polylist", CR_NPOLY, poly->num_edges, CR_NVERT, nvert, CR_VERT, vindex, CR_POINT4, points, CR_POLYCOLOR, colors, CR_FLAG, PL_HASPCOL, /* put this here or meet a bug libpolyli st */ CR_END); return(beams); } geomview-1.9.4/src/lib/gprim/discgrp/outstack.c0000644000175000001440000000436510455701002016375 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* This file is for managing the output stack of group elements */ #include "discgrpP.h" static int BlockSize, array_size; static DiscGrpEl *mystack = NULL, *stackptr = NULL; static int count = 0, debug = 0; int init_out_stack() { array_size = 1; BlockSize = 1024; count = 0; if ((mystack = OOGLNewN (DiscGrpEl, BlockSize )) == (DiscGrpEl *) NULL) return(0); stackptr = mystack; return(1); } int enumpush(pp) DiscGrpEl *pp; { if (stackptr >= &mystack[BlockSize*array_size]) { if (debug) fprintf(stderr,"allocating again: size is now %d\n",array_size*BlockSize); array_size = array_size*2; if ((mystack = OOGLRenewN(DiscGrpEl,mystack, array_size*BlockSize)) == (DiscGrpEl *) NULL) return (0); stackptr = &mystack[count]; } *stackptr = *pp; TmCopy(pp->tform, stackptr->tform); stackptr++; count++; return(1); } int enumgetsize() { return(count); } DiscGrpEl * enumgetstack() { DiscGrpEl *thisptr; thisptr = OOGLNewN (DiscGrpEl, count ); if (thisptr == NULL) return ( (DiscGrpEl *) NULL); memcpy(thisptr, mystack, sizeof(DiscGrpEl) * count); OOGLFree(mystack); return(thisptr); } geomview-1.9.4/src/lib/gprim/discgrp/colormap.c0000644000175000001440000000555010455701002016351 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include #include "ooglutil.h" #include "color.h" ColorA builtin[] = { { 0.8, 0.1, 0.1, 0.75}, { 0.1, 0.65, 0.4, 0.75}, { 0.1, 0.1, 0.8, 0.75}, { 0.9, 0.6, 0, 0.75}, { 0, 0.6, 0.8, 0.75}, { 0.5, 0, 0.9, 0.75}, {.7, .15, .1, .75}, {.2, .2, .8, .75}, {.9, .6, .02, .75}, {.1, .3, .8, .75}, {.1, .7, .2, .75}, {.8, .8, .4, .75}, {.7, .7, 0, .75}, {.7, 0, .7, .75}, {0, .7, .7, .75}, {.9, 0, .2, .75}, {.2, .9, 0, .75}, {0, .2, .9, .75}, {.75, .75, .75, .75}, {.8, .4, 0, .75}, {.8, .4, 0, .75}, {0, .4, .8, .75}, {0, .4, .8, .75}, {0, .8, .4, .75}, {0, .8, .4, .75}, {.4, 0, .8, .75} }; ColorA *colormap = NULL; static int cnt; static int doneread = 0; static char default_name[] = "sample.cmap"; int readcmap(cmapfname) char *cmapfname; { FILE *fp; int size = 256; if (cmapfname == NULL) cmapfname = getenv("CMAP_FILE"); if (cmapfname == NULL) cmapfname = findfile(NULL, default_name); doneread = 1; fp = fopen(cmapfname,"r"); if (fp == NULL) goto ZXCV; cnt = 0; colormap = (ColorA *) malloc(sizeof(ColorA) * size); while (fscanf(fp, "%f%f%f%f", &colormap[cnt].r, &colormap[cnt].g, &colormap[cnt].b, &colormap[cnt].a) == 4) { cnt++; if (cnt > size) { size *= 2; colormap = (ColorA *) realloc(colormap, sizeof(ColorA) * size); if (colormap == NULL) goto ZXCV; } } return(cnt); /* fprintf(stderr,"readcmap: %d entries read\n",cnt); */ ZXCV: colormap = builtin; cnt = sizeof(builtin); return(cnt); } ColorA GetCmapEntry(n) int n; { if (!doneread) { char *cmapfile; cmapfile = getenv("CMAP_FILE"); fprintf(stderr,"Using CMAP_FILE environment variable to read color map\n"); readcmap(cmapfile); } if (n < 0 || n > cnt) return(colormap[0]); else return (colormap[n]); } geomview-1.9.4/src/lib/gprim/discgrp/options.h0000644000175000001440000000410010455701002016223 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _options_ #define _options_ #define MAC 0 #define SUN 1 #define VAX 2 #define CRAY 3 #define GENERIC 4 #define HOST GENERIC /* LightspeedC has a few idiosyncracies which vary from one version to the next. If you are using LightspeedC (a.k.a. THINK C) define the appropriate version number here (e.g. #define LSC 4 for version 4.0). If you aren't using LightspeedC (and perhaps not even using a Mac at all) you should #define LSC 0. */ #if (HOST == MAC) #define LSC 4 #else #define LSC 0 #endif #define PROTOTYPES 1 #if (LSC == 3) #define _MC68881_ #endif #if (HOST == MAC) typedef long int MyInt32; #else #include /* to get size_t definition */ typedef size_t MyInt32; #endif /* The constant HARDWARE_PRECISION gives the accuracy of a double */ /* precision floating point number on the host hardware. I.e. if */ /* the mantissa of a double has b bits, HARDWARE_PRECISION is 2^-b. */ /* Note: in the unlikely event that HARDWARE_PRECISION < 1e-21 */ /* you'll have to provide more coefficients in the series for the */ /* Lobachevsky function in volume.c. */ #if (HOST == MAC) #define HARDWARE_PRECISION 6e-20 #else #define HARDWARE_PRECISION 4e-15 #endif #endif geomview-1.9.4/src/lib/gprim/discgrp/vec4.h0000644000175000001440000000750610455701003015407 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #include typedef double point4[4]; typedef double plane4[4]; typedef double matrix4[4][4]; #define ABS(aaa) (( (aaa) > 0) ? (aaa) : -(aaa)) #define VDOT3(v0,v1) (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]) #define INPRO31(v0,v1) (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3]) #define INPRO4(v0,v1) (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]) #define MAGNITUDE3(v0) (sqrt (VDOT3(v0, v0))) #define MAGNITUDE31(v0) (sqrt (ABS (INPRO31(v0, v0)))) #define MAGNITUDE4(v0) (sqrt (INPRO4(v0, v0))) #define PROJECT4(v0) \ {float d = v0[3]; \ if (d) { \ d = 1.0/d; \ v0[0] = v0[0] * d; \ v0[1] = v0[1] * d; \ v0[2] = v0[2] * d; \ v0[3] = 1.0; }} #define NORMALIZE3(v0) \ {double xxx; \ if (xxx = MAGNITUDE3(v0)) \ {v0[0] /= xxx; v0[1] /= xxx; v0[2] /= xxx; } } #define NORMALIZE31(v) \ {double tmp = INPRO31(v,v); \ if (tmp) { tmp = 1.0/sqrt(ABS(tmp)); v[0] *= tmp; v[1] *= tmp; v[2] *= tmp; v[3] *= tmp; }} #define NORMALIZE4(v) \ {double tmp = INPRO4(v,v); \ if (tmp) { tmp = 1.0/sqrt(ABS(tmp)); v[0] *= tmp; v[1] *= tmp; v[2] *= tmp; v[3] *= tmp; }} #define VPRINT3(name,v) printf("name\t%f %f %f\n",v[0],v[1],v[2]); #define VPRINT4(name,v) printf("name\t%f %f %f %f %f\n",v[0],v[1],v[2],v[3]); #define VADD3(v0,v1,v2) \ {v2[0] = v0[0] + v1[0]; \ v2[1] = v0[1] + v1[1]; \ v2[2] = v0[2] + v1[2]; \ v2[3] = 1.0; } #define VADD4(v0,v1,v2) \ {v2[0] = v0[0] + v1[0]; \ v2[1] = v0[1] + v1[1]; \ v2[2] = v0[2] + v1[2]; \ v2[3] = v0[3] + v1[3]; } #define VSUB3(v0,v1,v2) \ {v2[0] = v0[0] - v1[0]; \ v2[1] = v0[1] - v1[1]; \ v2[2] = v0[2] - v1[2]; \ v2[3] = 1.0;} #define VSUB4(v0,v1,v2) \ {v2[0] = v0[0] - v1[0]; \ v2[1] = v0[1] - v1[1]; \ v2[2] = v0[2] - v1[2]; \ v2[3] = v0[3] - v1[3];} #define MIDPOINT4(v0,v1,v2) \ {v2[0] = (v0[0] + v1[0])/2.0; \ v2[1] = (v0[1] + v1[1])/2.0; \ v2[2] = (v0[2] + v1[2])/2.0; \ v2[3] = (v0[3] + v1[3])/2.0; } #define VISZERO4(v) (v[0] == 0 && v[1] == 0 && v[2] == 0 && v[3] == 0) #define MIDPOINT31(v0,v1,v2) \ {float m00, m11, a,v3[4]; \ VSUB4(v0, v1, v3); \ if (VISZERO4(v3)) \ VCOPY4(v0,v2) \ else { \ m00 = INPRO31(v0,v3); \ m11 = INPRO31(v1,v3); \ v2[0] = m11*v0[0] - m00*v1[0]; \ v2[1] = m11*v0[1] - m00*v1[1]; \ v2[2] = m11*v0[2] - m00*v1[2]; \ v2[3] = m11*v0[3] - m00*v1[3]; }} #define XPRO3(v0,v1,v2) \ {v2[0] = v0[1]*v1[2] - v0[2]*v1[1]; \ v2[1] = v0[2]*v1[0] - v0[0]*v1[2]; \ v2[2] = v0[0]*v1[1] - v0[1]*v1[0]; } #define VSCALE3(v0, s, v1) \ {v1[0] = s * v0[0]; \ v1[1] = s * v0[1]; \ v1[2] = s * v0[2]; } #define VSCALE4(v0, s, v1) \ {v1[0] = s * v0[0]; \ v1[1] = s * v0[1]; \ v1[2] = s * v0[2]; \ v1[3] = s * v0[3]; } #define VCOPY3(v0, v1) \ {v1[0] = v0[0]; \ v1[1] = v0[1]; \ v1[2] = v0[2]; } #define VCOPY4(v0, v1) \ {v1[0] = v0[0]; \ v1[1] = v0[1]; \ v1[2] = v0[2]; \ v1[3] = v0[3];} #define VZERO3(v0) \ {v0[0] = 0; \ v0[1] = 0; \ v0[2] = 0; \ v0[3] = 1.0; } #define COPYMAT4(m1, m2) \ memcpy(m2, m1, (sizeof(m1[0][0]) * 16)); geomview-1.9.4/src/lib/gprim/discgrp/util.c0000644000175000001440000000437110455701002015512 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* routines for making sure matrix is orthogonal in Minkowski metric */ #include "3d.h" /* row-orthogonalize an isometry of Minkowski space */ void tuneup(Transform m1, int metric) { HPt3SpaceNormalize((HPoint3 *)m1[0], metric); HPt3SpaceGramSchmidt((HPoint3 *)m1[0], (HPoint3 *)m1[1], metric); HPt3SpaceNormalize((HPoint3 *)m1[1], metric); HPt3SpaceGramSchmidt((HPoint3 *)m1[0], (HPoint3 *)m1[2], metric); HPt3SpaceGramSchmidt((HPoint3 *)m1[1], (HPoint3 *)m1[2], metric); HPt3SpaceNormalize((HPoint3 *)m1[2], metric); HPt3SpaceGramSchmidt((HPoint3 *)m1[0], (HPoint3 *)m1[3], metric); HPt3SpaceGramSchmidt((HPoint3 *)m1[1], (HPoint3 *)m1[3], metric); HPt3SpaceGramSchmidt((HPoint3 *)m1[2], (HPoint3 *)m1[3], metric); HPt3SpaceNormalize((HPoint3 *)m1[3], metric); } /* following only works now with hyperbolic mode */ int needstuneup(Transform m1) { int i,j; float d; for (i=0; i<4; ++i) for (j=i; j<4; ++j) { d = m1[i][0] * m1[j][0] + m1[i][1] * m1[j][1] + m1[i][2] * m1[j][2] - m1[i][3] * m1[j][3]; if (i == 3) d *= -1; if (fabs ( d - ( i == j ) ) > .01 ) return (1); } return (0); } geomview-1.9.4/src/lib/gprim/discgrp/dgdirdom.c0000644000175000001440000002710210461140705016327 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "polylistP.h" #include "discgrpP.h" #include "point.h" #include "winged_edge.h" #include "transform.h" #include "math.h" static WEpolyhedron *wepoly1, **wepoly2; HPoint3 DGorigin = {0,0,0,1}; HPoint3 DGrandom = {.1,.2,.3,.4}; extern void do_weeks_code(); static int is_id(Transform t) { int i,j; for (i=0; i<4; ++i) for (j=0; j<4; ++j) if (fabs(t[i][j] - (i == j)) > .0005) return(0); return(1); } /* make sure that the center point attached to the discrete group isn't fixed by some generator; if it is; redefine the center point to be the center of gravity of the orbit by the generators */ void DiscGrpCheckCPoint(DiscGrp *dg) { int i, cnt, fixed; HPoint3 tmp, out; float d; if (dg->gens == NULL) { return; } /* go through the generators, checking for fixed-pointed-ness */ for (i = 0, fixed = 0 ; i < dg->gens->num_el; ++i ) { HPt3Transform(dg->gens->el_list[i].tform, &dg->cpoint, &tmp); d = HPt3SpaceDistance(&dg->cpoint, &tmp, dg->attributes & DG_METRIC_BITS); if (fabs(d) < .0005) { fixed = 1; break; } } /* no fixed points */ if (fixed == 0) return; /* clean out the special bit */ for (i = 0 ; i < dg->gens->num_el; ++i ) dg->gens->el_list[i].attributes &= ~DG_TMP; out.x = out.y = out.z = out.w = 0.0; /* don't average but one of each generator, inverse pair */ for (cnt = 0, i = 0 ; i < dg->gens->num_el; ++i ) { if (!(dg->gens->el_list[i].attributes & DG_TMP)) { HPt3Transform(dg->gens->el_list[i].tform, &DGrandom, &tmp); HPt3Add(&tmp, &out, &out); dg->gens->el_list[i].inverse->attributes |= DG_TMP; cnt++; } } HPt3Dehomogenize(&out, &out); /* return it or set cpoint?? */ dg->cpoint = out; } void DiscGrpAddInverses(DiscGrp *discgrp) { int i, j, found = 0; Transform product; DiscGrpElList *newgens; /* remove all identity matrices */ for (j=0, i=0; igens->num_el; ++i) { if ( !is_id(discgrp->gens->el_list[i].tform) ) { /* ought to have a DiscGrpElCopy() */ discgrp->gens->el_list[j] = discgrp->gens->el_list[i]; TmCopy(discgrp->gens->el_list[i].tform, discgrp->gens->el_list[j].tform); j++; } } /* store the new count */ discgrp->gens->num_el = j; for (i=0; igens->num_el; ++i) { if (discgrp->gens->el_list[i].inverse == NULL) { /* look for inverse among the existing generators */ for (j=i; jgens->num_el; ++j) { TmConcat(discgrp->gens->el_list[i].tform, discgrp->gens->el_list[j].tform, product); if ( is_id(product) ) { discgrp->gens->el_list[i].inverse = &discgrp->gens->el_list[j]; discgrp->gens->el_list[j].inverse = &discgrp->gens->el_list[i]; found++; } } } else found++; } newgens = OOGLNew(DiscGrpElList); newgens->num_el = 2 * discgrp->gens->num_el - found; newgens->el_list = OOGLNewN(DiscGrpEl, newgens->num_el ); memcpy(newgens->el_list, discgrp->gens->el_list, sizeof(DiscGrpEl) * discgrp->gens->num_el); /* now go through looking for group elements without inverses */ { char c; j = discgrp->gens->num_el; for (i=0; igens->num_el; ++i) { if (newgens->el_list[i].inverse == NULL) { newgens->el_list[j+i] = newgens->el_list[i]; /* make the symbol of the inverse be the 'other case' */ c = newgens->el_list[i].word[0]; if (c < 'a') newgens->el_list[j+i].word[0] = c + 32; else newgens->el_list[j+i].word[0] = c - 32; TmInvert( newgens->el_list[i].tform, newgens->el_list[j+i].tform); newgens->el_list[j+i].inverse = &newgens->el_list[i]; newgens->el_list[i].inverse = &newgens->el_list[j+i]; } else j--; } } DiscGrpElListDelete(discgrp->gens); discgrp->gens = newgens; } void DiscGrpSetupDirdom(DiscGrp *discgrp) { WEpolyhedron *dd; if ( discgrp->nhbr_list ) { OOGLFree(discgrp->nhbr_list->el_list); OOGLFree(discgrp->nhbr_list); } /* worry about fixed points */ DiscGrpCheckCPoint(discgrp); dd = DiscGrpMakeDirdom(discgrp, &discgrp->cpoint, 0); discgrp->nhbr_list = DiscGrpExtractNhbrs(dd); } /* find the group element whose 'center point' is closest to the point poi */ DiscGrpEl * DiscGrpClosestGroupEl(DiscGrp *discgrp, HPoint3 *poi) { int count, i, closeri; int metric; float min = 0, d; HPoint3 pt0, pt1; DiscGrpEl *closer = NULL, *closest = OOGLNew(DiscGrpEl); Transform cinv; TmIdentity(closest->tform); closest->attributes = 0; if (!discgrp->nhbr_list) DiscGrpSetupDirdom(discgrp); metric = discgrp->attributes & (DG_METRIC_BITS); /* iterate until we're in the fundamental domain */ count = 0; closeri = -1; pt0 = *poi; while (count < 1000 && closeri != 0) { for (i = 0; inhbr_list->num_el; ++i) { HPt3Transform(discgrp->nhbr_list->el_list[i].tform, &discgrp->cpoint, &pt1); d = HPt3SpaceDistance(&pt0, &pt1, metric); if (i==0) { min = d; closer = &discgrp->nhbr_list->el_list[i]; closeri = i; } else if (d < min) { min = d; closer = &discgrp->nhbr_list->el_list[i]; closeri = i; } } count++; if (closeri) { TmConcat(closer->tform, closest->tform, closest->tform); /* move the point of interest by the inverse of the closest nhbr and iterate */ TmInvert(closest->tform, cinv); HPt3Transform(cinv, poi, &pt0); } /* if (needstuneup(closest->tform)) tuneup(closest->tform, metric); */ } if (is_id(closest->tform)) closest->attributes |= DGEL_IS_IDENTITY; return (closest); } static ColorA white = {1,1,1,1}; /* return a list of group elements corresponding to the faces of the dirichlet domain */ DiscGrpElList * DiscGrpExtractNhbrs( WEpolyhedron *wepoly ) { int i,j,k; WEface *fptr; DiscGrpElList *mylist; ColorA GetCmapEntry(); if (!wepoly) return(NULL); /* should use realloc() here to take care of large groups...*/ mylist = OOGLNew(DiscGrpElList); mylist->el_list = OOGLNewN(DiscGrpEl, wepoly->num_faces + 1); mylist->num_el = wepoly->num_faces + 1; /* include the identity matrix */ TmIdentity( mylist->el_list[0].tform); mylist->el_list[0].color = white; mylist->el_list[0].attributes = DGEL_IS_IDENTITY; /* read the matrices corresponding to the faces of dirichlet domain */ for (fptr = wepoly->face_list, k = 1; k<=wepoly->num_faces && fptr != NULL; k++, fptr = fptr->next) { for (i=0; i<4; ++i) for (j=0; j<4; ++j) /* the group elements stored in fptr are transposed! */ mylist->el_list[k].tform[j][i] = fptr->group_element[i][j]; mylist->el_list[k].color = GetCmapEntry(fptr->fill_tone); } if (mylist->num_el != k) OOGLError(1,"Incorrect number of nhbrs.\n");; return(mylist); } /* attempt to create a scaled copy of fundamental domain for spherical groups by taking weighted sum of vertices with the distinguished point */ static void DiscGrpScalePolyList(DiscGrp *dg, PolyList *dirdom, HPoint3 *pt0, float scale) { int i, metric; HPoint3 tmp1, tmp2, tpt0, tpt1; HPt3Copy(pt0, &tpt0); metric = dg->attributes & DG_METRIC_BITS; if (metric != DG_EUCLIDEAN) { HPt3SpaceNormalize(&tpt0, metric); HPt3Scale( 1.0 - scale, &tpt0, &tmp2); for (i=0; in_verts; ++i) { HPt3Copy(&dirdom->vl[i].pt, &tpt1); HPt3SpaceNormalize(&tpt1, metric); HPt3SpaceNormalize(&tpt1, metric); HPt3Scale( scale, &tpt1, &tmp1); HPt3Add(&tmp1, &tmp2, &dirdom->vl[i].pt); } } else { Transform T, TT, ITT, tmp; static HPoint3 average = {0,0,0,0}; /* compute average */ for (i=0; in_verts; ++i) HPt3Add(&average, &dirdom->vl[i].pt, &average); HPt3Dehomogenize(&average, &average); TmTranslate(TT, average.x, average.y, average.z ); TmInvert(TT, ITT); TmScale(T, scale, scale, scale); TmConcat(ITT, T, tmp); TmConcat(tmp, TT, tmp); for (i=0; in_verts; ++i) HPt3Transform(tmp, &dirdom->vl[i].pt, &dirdom->vl[i].pt); } } Geom *small_dd, *large_dd; Geom * DiscGrpDirDom(DiscGrp *dg) { Geom *oogldirdom; WEpolyhedron *dd; extern Geom *WEPolyhedronToPolyList(); Geom *mylist, *smlist; if (dg->flag & DG_DDBEAM) { WEpolyhedron *poly = DiscGrpMakeDirdom( dg, &dg->cpoint, 0); Geom *beams; beams = WEPolyhedronToBeams(poly, dg->scale); return(beams); } else { float scale; /* first a full-size, wireframe version of dd */ dd = DiscGrpMakeDirdom(dg, &dg->cpoint, 0); if (dd) { oogldirdom = WEPolyhedronToPolyList(dd); scale = 1.0; DiscGrpScalePolyList(dg, (PolyList *)oogldirdom, &dg->cpoint, scale); large_dd = oogldirdom; large_dd->ap = ApCreate(AP_DO, APF_EDGEDRAW, AP_DONT, APF_FACEDRAW, AP_END); } else return((Geom *) NULL); /* next a scaled version with cusps cut off */ dd = DiscGrpMakeDirdom(dg, &dg->cpoint, 1); if (dd) { oogldirdom = WEPolyhedronToPolyList(dd); DiscGrpScalePolyList(dg, (PolyList *)oogldirdom, &dg->cpoint, dg->scale); small_dd = oogldirdom; small_dd->ap = ApCreate(AP_DONT, APF_EDGEDRAW, AP_DO, APF_FACEDRAW, AP_END); } else return((Geom *) NULL); smlist = GeomCreate("list", CR_GEOM, small_dd, CR_END); mylist = GeomCreate("list", CR_GEOM, large_dd, CR_CDR, smlist, CR_END); return(mylist); } } WEpolyhedron * DiscGrpMakeDirdom(DiscGrp *gamma, HPoint3 *poi, int slice) { int i, j, k; proj_matrix *gen_list; point origin; int metric, transp; transp = gamma->attributes & DG_TRANSPOSED; /* transform from floating point to double, essentially */ gen_list = OOGLNewNE(proj_matrix, gamma->gens->num_el, "DiscGrp gens"); /* jeff week's code basically uses transposed matrices, so if the transposed flag is set, we do nothing, otherwise we have to transpose! */ for (i=0; igens->num_el; ++i) for (j=0; j<4; ++j) for (k=0; k<4; ++k) { if (transp) gen_list[i][j][k] = gamma->gens->el_list[i].tform[j][k]; else gen_list[i][k][j] = gamma->gens->el_list[i].tform[j][k]; } origin[0] = poi->x; origin[1] = poi->y; origin[2] = poi->z; origin[3] = poi->w; wepoly2 = &wepoly1; metric = (gamma->attributes & DG_METRIC_BITS); do_weeks_code(wepoly2, origin, gen_list, gamma->gens->num_el, metric,slice); OOGLFree(gen_list); /* turn off the 'new dirdom' bit */ gamma->flag &= ~DG_NEWDIRDOM; return(*wepoly2); } geomview-1.9.4/src/lib/gprim/discgrp/dgconstraint.c0000644000175000001440000000407510455701002017235 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "discgrpP.h" static int constraint_depth; static float constraint_stored, constraint_printd; void DiscGrpInitStandardConstraint(int depth, float ind0, float ind1) { constraint_depth = depth; constraint_stored = ind0; constraint_printd = ind1; } static HPoint3 origin = {0.0, 0.0, 0.0, 1.0}; int DiscGrpStandardConstraint(DiscGrpEl *dgel) { int big=0, l; float d; HPoint3 image; int metric = dgel->attributes & DG_METRIC_BITS; extern double getnorm(); if ((l = strlen(dgel->word)) > constraint_depth) return(DG_CONSTRAINT_LONG); if (l == constraint_depth) big |= DG_CONSTRAINT_MAXLEN; /* find hyperbolic distance of image from origin: take short cut */ HPt3Transform(dgel->tform, &origin, &image); d = HPt3SpaceDistance(&origin, &image, metric); if ( d < constraint_stored) { big |= DG_CONSTRAINT_STORE; if ( d < constraint_printd) { big |= DG_CONSTRAINT_PRINT; } } else { big |= DG_CONSTRAINT_TOOFAR; } return(big); } geomview-1.9.4/src/lib/gprim/discgrp/dgcopy.c0000644000175000001440000000274610461140705016032 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrpP.h" DiscGrp * DiscGrpCopy(obj) DiscGrp *obj; { DiscGrp *m; DiscGrp *om = obj; if (om == NULL) return (NULL); if ( (m = OOGLNew(DiscGrp)) == NULL ) { OOGLError(0,"Can't allocate space for discgrp"); return (NULL); } *m = *om; /* copy scalar fields */ return m; } geomview-1.9.4/src/lib/gprim/discgrp/dgdraw.c0000644000175000001440000002176310622716753016030 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrpP.h" #include "mgP.h" #include "math.h" /* this method is called before drawing, to set up a standard data * structure containing a description of the camera; the user can * replace it with his/her own routine that gets this information * from somewhere else. */ void DiscGrpStandardPreDraw(DiscGrp *discgrp) { float halfy, aspect, halfx; static float magic_scale = 1.2; /* we're about to mess around with the camera matrix; before doing so, get the current one (it's already been set for this frame) to use in culling later on */ if (discgrp->flag & (DG_DRAWCAM | DG_ZCULL | DG_CENTERCAM)) { /* get the pieces of the model to viewing transform */ CamGet(_mgc->cam, CAM_W2C, discgrp->viewinfo.w2c); TmInvert(discgrp->viewinfo.w2c, discgrp->viewinfo.c2w); /* concatenate the model to world coordinate transform */ mg_gettransform(discgrp->viewinfo.m2w); TmInvert(discgrp->viewinfo.m2w, discgrp->viewinfo.w2m); TmConcat(discgrp->viewinfo.m2w, discgrp->viewinfo.w2c, discgrp->viewinfo.m2c); TmInvert(discgrp->viewinfo.m2c, discgrp->viewinfo.c2m); CamGet(_mgc->cam, CAM_HALFYFIELD, &halfy); CamGet(_mgc->cam, CAM_ASPECT, &aspect); halfy = halfy * magic_scale; halfx = aspect * halfy; /* Hack to get culling to work -Celeste */ halfx = (halfx > halfy) ? halfx : halfy; halfy = halfx; /* the frustrum planes evaluate positive on cull-able points */ #define INITPT(ptr,xx,yy,zz,ww) { ((ptr)->x) = (xx); \ ((ptr)->y) = (yy); \ ((ptr)->z) = (zz); \ ((ptr)->w) = (ww); } INITPT(&discgrp->viewinfo.frustrum[0], -1, 0, halfx, 0) INITPT(&discgrp->viewinfo.frustrum[1], 1, 0, halfx, 0) INITPT(&discgrp->viewinfo.frustrum[2], 0, -1, halfy, 0) INITPT(&discgrp->viewinfo.frustrum[3], 0, 1, halfy, 0) } } static float visd1 = 2.0; /* for debugging */ DiscGrp * DiscGrpDraw(DiscGrp *discgrp) { static HPoint3 origin = {0,0,0,1}, cpos; Transform c2wprime; DiscGrpEl *nhbr; int metric; /* set up the viewing system dependent matrices, etc */ if (discgrp->predraw) (*discgrp->predraw)(discgrp); else DiscGrpStandardPreDraw(discgrp); metric = discgrp->attributes & DG_METRIC_BITS; /* make sure we have some geometry to display; the control code * is a bit suspiciously topheavy */ if (discgrp->geom == NULL || discgrp->flag & DG_NEWDIRDOM || (discgrp->flag & DG_DRAWDIRDOM && discgrp->ddgeom == NULL)) { discgrp->ddgeom = DiscGrpDirDom(discgrp); if (discgrp->geom == NULL ) discgrp->geom = discgrp->ddgeom; /* turn off the alarm */ discgrp->flag &= ~DG_NEWDIRDOM; if (!discgrp->ddgeom) { OOGLError(1,"DiscGrpDraw: Unable to create dirichlet domain\n"); } } /* be sure we have some group elements */ if (discgrp->big_list == NULL ) { if (discgrp->nhbr_list != NULL) { discgrp->big_list = discgrp->nhbr_list; } else { return(discgrp); } } /* * the main idea here is to find out the position of the current camera * and use it to make sure the group elements used are centered at the * camera. We do this by looking at the orbit of the origin and seeing * if the camera is closer to */ if (discgrp->flag & DG_CENTERCAM ) { Transform cinv, hprime, h; /* use it to derive the model coordinates of the camera */ HPt3Transform(discgrp->viewinfo.c2m, &origin, &cpos); /* compute the group element which is 'closest' to the camera */ nhbr = DiscGrpClosestGroupEl(discgrp, &cpos); /* apply the inverse of this transform to the camera */ TmInvert(nhbr->tform, h); /* this requires conjugating cinv by the w2m transform: * * C --- c2w ---> W ---- w2m ----> M * \ | | * \ h' h = nhbr->tform inverse * c2w' | | * \---------> W <--- m2w ----- M * * In the above diagram we want c2w' = c2w h' */ TmConcat(h, discgrp->viewinfo.m2w, cinv); TmConcat(discgrp->viewinfo.w2m, cinv, hprime); TmConcat(discgrp->viewinfo.c2w, hprime, c2wprime); if (discgrp->attributes & DG_HYPERBOLIC && needstuneup(c2wprime)) { tuneup(c2wprime, metric); if (needstuneup(c2wprime)) OOGLError(1,"DiscGrpDraw: tuneup failed\n"); } CamSet(_mgc->cam, CAM_C2W, c2wprime, CAM_END); } { int viscnt = 0; /*float ratio = 1.0;*/ HPoint3 image; int vis; float d; Transform tile2c; #ifdef UNNECESSARY extern Geom *large_dd, *small_dd; /*very ugly but appearances don't work correctly when pushed down into a list */ #endif Transform Tnew; GeomIter *it; it = GeomIterate( (Geom *)discgrp, DEEP ); /* loop through them */ while(NextTransform(it, Tnew) > 0) { vis = 1; if (discgrp->flag & DG_ZCULL) { TmConcat(Tnew, discgrp->viewinfo.m2c, tile2c); HPt3Transform(tile2c, &discgrp->cpoint, &image); d = HPt3SpaceDistance(&image, &discgrp->cpoint, metric); /* discard images that are too far away */ if (d > discgrp->drawdist) vis = 0; /* some close copies are guaranteed to be drawn... */ else if (d > visd1 ) { /* only discard far-away tiles */ /* first discard the ones behind the eye, if that makes sense */ if (metric != DG_SPHERICAL && image.z*image.w > 0.0) vis = 0; else { /* then test outside the camera frustrum */ { int i; for (i=0; i<4; ++i) { d = HPt3R40Dot(&image, &discgrp->viewinfo.frustrum[i]); if ( d > 0) { vis = 0; break; } } } } } } /* if the tile has passed the visibility tests... */ if (vis) { viscnt++; mgpushtransform(); mgtransform( Tnew ); /* while the appearance stuff doesn't work correctly, we have to * commit some pretty terrible crimes...we'd like to be able to * just say GeomDraw(discgrp->geom)...but we can't as long as * appearances don't work as advertised */ if (discgrp->ddgeom && discgrp->flag & DG_DRAWDIRDOM) { if (discgrp->flag & DG_DDBEAM) GeomDraw(discgrp->ddgeom); else { GeomDraw(discgrp->ddgeom); #ifdef UNNECESSARY mgpushappearance(); mgctxset(MG_ApSet, AP_DONT, APF_FACEDRAW, AP_DO, APF_EDGEDRAW, AP_END, MG_END); GeomDraw(large_dd); mgpopappearance(); mgpushappearance(); mgctxset(MG_ApSet, AP_DO, APF_FACEDRAW, AP_END, MG_END); GeomDraw(small_dd); mgpopappearance(); #endif /*UNNECESSARY*/ } } if (discgrp->flag & DG_DRAWGEOM && discgrp->geom && discgrp->geom != discgrp->ddgeom) GeomDraw( discgrp->geom ); if ((discgrp->flag & DG_DRAWCAM) && (discgrp->camgeom)) { mgpushtransform(); mgtransform( discgrp->viewinfo.c2m ); GeomDraw(discgrp->camgeom); mgpoptransform(); } mgpoptransform(); } } /* for debugging to see how culling works */ /*ratio = viscnt / ((double) discgrp->big_list->num_el);*/ } return(discgrp); } #ifdef REASONABLE TmScale( scaler, discgrp->scale, discgrp->scale, discgrp->scale); large = DiscGrpDirDom(discgrp, &discgrp->cpoint); large->ap = ApCreate(AP_DO, APF_EDGEDRAW, AP_DONT, APF_FACEDRAW, AP_END); ap = ApCreate(AP_DONT, APF_EDGEDRAW, AP_DO, APF_FACEDRAW, AP_END); small = GeomCreate("inst", CR_GEOM, large, CR_AXIS, scaler, CR_APPEAR, ap, CR_END); smlist = GeomCreate("list", CR_GEOM, small, CR_END); mylist = GeomCreate("list", CR_GEOM, large, CR_CDR, smlist, CR_END); discgrp->ddgeom = mylist; TmScale( scaler, discgrp->scale, discgrp->scale, discgrp->scale); Tm3SpaceTranslateOrigin(tlate, &discgrp->cpoint, metric); /* perform translation so cpoint is at origin */ TmInvert(tlate, invtlate); /* apply scaling transform centered at cpoint */ TmConcat(invtlate, scaler, tmp); /* and move cpoint back to where it started */ TmConcat(tmp, tlate, tmp); d = HPt3SpaceDistance( &discgrp->cpoint, &image, metric); #else #endif geomview-1.9.4/src/lib/gprim/discgrp/dgenum.c0000644000175000001440000001367710461140705016031 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "wa.h" #include "vec4.h" #include "dgflag.h" #include "enum.h" #include "color.h" #include "3d.h" #include "ooglutil.h" #include "discgrpP.h" static DiscGrp *mydg; static ColorA white = {1,1,1,.75}; /*static DiscGrpEl grpel;*/ static Transform mlist[128]; static int (*constraintfn)(); int check_big = 1, /* this is currently never non-zero */ check_new = 1, /* ditto */ have_matrices = 1, metric = DG_HYPERBOLIC, stringent = 0; int long_cnt = 0, same_cnt = 0, far_cnt = 0, print_cnt = 0, store_cnt = 0; /*static int numchunks = 1;*/ static int ngens = 0; int debug = 0; static char symbollist[64]; static void get_matrices(); int getindex(c) char c; { int i; for (i=0; itform); if (is_n) { is_big = constraintfn(dgel); if (is_big & DG_CONSTRAINT_LONG) long_cnt++; if (is_big & DG_CONSTRAINT_PRINT) print_cnt++; if (is_big & DG_CONSTRAINT_STORE) store_cnt++; if (is_big & DG_CONSTRAINT_TOOFAR) far_cnt++; } else same_cnt++; return(is_big | is_n ); } static int process(DiscGrpEl *dgel, int stacking) { int is_ok = 0; if (have_matrices) { is_ok = is_big_and_new(dgel); /* remember that only NEW and PRINT are required to be here */ if (is_ok & DG_CONSTRAINT_NEW ) { if (!(is_ok & DG_CONSTRAINT_LONG)) { if (is_ok & (DG_CONSTRAINT_STORE | DG_CONSTRAINT_PRINT)) { if (check_new) { insert_mat(dgel->tform); /* and put it on the stack */ if (stacking) push_new_stack(dgel->word); } if (is_ok & DG_CONSTRAINT_PRINT) enumpush(dgel); } } } } return(is_ok); } static int enumerate(int state, int depth, DiscGrpEl *dgel) { int i, newstate, pval; if ( ! ((pval = process(dgel, 0)) & DG_CONSTRAINT_STORE)) return 0; if (pval & DG_CONSTRAINT_MAXLEN) return 0; if (depth > MAXDEPTH) return 0; for (i=1; ifsa->ngens; ++i) { newstate = mydg->fsa->action[state][i]; if ( newstate != mydg->fsa->fail) { dgel->word[depth] = mydg->fsa->genlist[i-1][0]; dgel->word[depth+1] = 0; /* null-terminate */ word_to_mat(dgel->word, dgel->tform); enumerate(newstate, depth+1, dgel); } } return 1; } static int dumb_enumerate(int depth, DiscGrpEl *dgel) { int i, j; char *word; extern char *pop_old_stack(); init_stack(); process(dgel, 1); for (j = 0; j < MAXDEPTH ; ++j) { make_new_old(); /* are we interested in his descendents ? */ while ( (word = pop_old_stack()) != NULL) { /* these words have length j */ strcpy(dgel->word, word); for (i=0; iword[j] = symbollist[i]; dgel->word[j+1] = 0; /* null-terminate */ word_to_mat(dgel->word, dgel->tform); process(dgel, 1); } } } return 1; } /*static char emptyword[64] = "";*/ /* * hack together an enumerate routine */ DiscGrpElList * DiscGrpEnum(DiscGrp *discgrp, int (* constraint)(void) ) { DiscGrpElList *enum_list = OOGLNewE(DiscGrpElList, "DiscGrpEnum"); extern DiscGrpEl *enumgetstack(); DiscGrpEl dgel; /* initialize the local variables */ constraintfn = constraint; have_matrices = 1; same_cnt = 0; far_cnt = 0; print_cnt = 0; store_cnt = 0; long_cnt = 0; ngens = discgrp->gens->num_el; metric = discgrp->attributes & DG_METRIC_BITS; memset(dgel.word, 0, sizeof(dgel.word)); dgel.attributes = discgrp->attributes; TmIdentity(dgel.tform); dgel.color = white; mydg = discgrp; init_out_stack(); get_matrices(); if (mydg->fsa) enumerate(mydg->fsa->start, 0, &dgel); else dumb_enumerate(0,&dgel); /* clean up the mess */ delete_list(); enum_list->num_el = enumgetsize(); enum_list->el_list = enumgetstack(); if (mydg->flag & DG_DEBUG) { fprintf(stderr,"%d elements printed \n",print_cnt); fprintf(stderr,"%d elements stored \n",store_cnt); fprintf(stderr,"%d elements move too far \n",far_cnt); fprintf(stderr,"%d elements too long \n",long_cnt); fprintf(stderr,"%d elements duplicates \n",same_cnt); } return(enum_list); } static void get_matrices() { int i; for (i=0; igens->num_el; ++i) { symbollist[i] = mydg->gens->el_list[i].word[0]; TmCopy(mydg->gens->el_list[i].tform, mlist[i]); } fprintf(stderr,"%d generators read\n",i); } geomview-1.9.4/src/lib/gprim/discgrp/dgflag.h0000644000175000001440000000544110455701002015765 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef DGFLAGDEFS #define DGFLAGDEFS #define DG_HYPERBOLIC 1 #define DG_EUCLIDEAN 2 #define DG_SPHERICAL 4 #define DG_FINITE 8 #define DG_TRANSPOSED 16 #define DG_CONFORMALBALL 32 #define DG_UPPERHALFSPACE 64 #define DG_PROJECTIVEMODEL 128 #define DG_NUM_ATTR 8 /* the above are the attributes */ #define DG_METRIC_BITS (DG_HYPERBOLIC | DG_EUCLIDEAN | DG_SPHERICAL) #define DG_MODEL_BITS (DG_CONFORMALBALL | DG_UPPERHALFSPACE | DG_PROJECTIVE) /* for the matrix group entries */ #define DG_GENERAL 0x000 /* general invertible group: default */ #define DG_SPECIAL 0x100 /* determinant +/- 1 */ #define DG_ORTHOGONAL 0x200 /* M.Transpose(M) = d.I */ #define DG_PROJECTIVE 0x400 /* M.Transpose(M) = d.I */ #define DG_REAL 0x000 /* default is real */ #define DG_COMPLEX 0x800 /* default is real */ #define DG_TMP 0x10000 /* flag */ #define DG_CENTERCAM 1 #define DG_NEWDIRDOM 2 /* recompute dirdom */ #define DG_DRAWDIRDOM 4 #define DG_ZCULL 8 /* don't draw those behind the camera */ #define DG_DRAWCAM 0x10 #define DG_DDBEAM 0x20 /* compute beamed dirichlet domain */ #define DG_DDSLICE 0x40 /* slice off cusps in dirichlet domain */ #define DG_DEBUG 0x100 #define DG_SAVEBIGLIST 0x200 /* does DiscGrpSave write out the group elements? */ #define DG_SAVEDIRDOM 0x400 /* does DiscGrpSave write out the dirichlet domain? */ #define DG_DRAWGEOM 0x800 /* draw other geometry? */ #define DG_NUM_DSPYATTR 5 /* zcull, cenercam, drawcam, drawdirdom, and drawgeom are externally settable */ /* constraint return values (only DG_CONSTRAINT_VALID is required) */ #define DG_CONSTRAINT_PRINT 1 #define DG_CONSTRAINT_TOOFAR 2 #define DG_CONSTRAINT_STORE 4 #define DG_CONSTRAINT_LONG 8 #define DG_CONSTRAINT_NEW 16 #define DG_CONSTRAINT_MAXLEN 32 /* bits in DiscGrpEl.attributes */ #define DGEL_IS_IDENTITY 0x1 /* need to mark the identity matrix */ #endif /*DGFLAGDEFS*/ geomview-1.9.4/src/lib/gprim/discgrp/projective.c0000644000175000001440000001260210461140705016707 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "options.h" #include "complex.h" #include "projective.h" /* sl2c_to_proj() converts sl2c_matrices to proj_matrices. It is based on an explanation provided by Craig Hodgson of a program written by Diane Hoffoss which in turn was based on an algorithm explained to her by Bill Thurston. */ void sl2c_to_proj(s, p) sl2c_matrix s; proj_matrix p; { int j; /* which column of p */ sl2c_matrix ad_s, /* s* = adjoint of s */ fs, /* f(s) = s m s* */ temp; static sl2c_matrix m[4] = {{{{ 0.0, 0.0},{ 0.0, 1.0}}, {{ 0.0,-1.0},{ 0.0, 0.0}}}, {{{ 0.0, 0.0},{ 1.0, 0.0}}, {{ 1.0, 0.0},{ 0.0, 0.0}}}, {{{-1.0, 0.0},{ 0.0, 0.0}}, {{ 0.0, 0.0},{ 1.0, 0.0}}}, {{{ 1.0, 0.0},{ 0.0, 0.0}}, {{ 0.0, 0.0},{ 1.0, 0.0}}}}; for (j=0; j<4; j++) { sl2c_adjoint(s, ad_s); sl2c_mult(s, m[j], temp); sl2c_mult(temp, ad_s, fs); p[0][j] = fs[0][1].imag; p[1][j] = fs[0][1].real; p[2][j] = 0.5 * (fs[1][1].real - fs[0][0].real); p[3][j] = 0.5 * (fs[1][1].real + fs[0][0].real); } return; } void proj_to_sl2c(p, s) proj_matrix p; sl2c_matrix s; { double t2, t3, aa, bb; /* Notation: The entries of s are a, b, c, d (as is standard). */ /* The complex conjugate of a is written as a' (read "a-bar"). */ /* Outline of algorithm: Write down the four matrices {sM0s*, */ /* sM1s*, sM2s*, sM3s*} in terms of {a, b, c, d}, and find */ /* expressions for {2a'a, 2a'b, 2a'c, 2a'd} as differences of */ /* matrix entries. Express these differences as functions of */ /* the entries of p. The matrix (2a'a, 2a'b; 2a'c, 2a'd) is a */ /* multiple of the desired matrix (a, b; c, d), so when we */ /* normalize the former we get the latter (we'd have to */ /* normalize in any case, since this scheme can find */ /* (a, b; c, d) only up to multiplication by a complex number */ /* of modulus one). */ /* a may be zero, but a and b can't both be zero. We'll use */ /* the one with the bigger norm. */ t2 = p[3][2] - p[2][2]; /* 00 entry of F(M2) */ t3 = p[3][3] - p[2][3]; /* 00 entry of F(M3) */ aa = t3 - t2; /* aa = 2 * |a|^2 */ bb = t3 + t2; /* bb = 2 * |b|^2 */ if (aa > bb) { s[0][0].real = aa; s[0][0].imag = 0.0; s[0][1].real = p[3][1] - p[2][1]; s[0][1].imag = p[3][0] - p[2][0]; s[1][0].real = p[1][3] - p[1][2]; s[1][0].imag = p[0][2] - p[0][3]; s[1][1].real = p[0][0] + p[1][1]; s[1][1].imag = p[1][0] - p[0][1]; } else { s[0][0].real = p[3][1] - p[2][1]; s[0][0].imag = p[2][0] - p[3][0]; s[0][1].real = bb; s[0][1].imag = 0.0; s[1][0].real = p[1][1] - p[0][0]; s[1][0].imag = - p[0][1] - p[1][0]; s[1][1].real = p[1][3] + p[1][2]; s[1][1].imag = - p[0][2] - p[0][3]; } sl2c_normalize(s); return; } void proj_mult(a, b, product) proj_matrix a, b, product; { int i, j, k; double sum; proj_matrix temp; for (i=0; i<4; i++) for (j=0; j<4; j++) { sum = 0.0; for (k=0; k<4; k++) sum += a[i][k] * b[k][j]; temp[i][j] = sum; } for (i=0; i<4; i++) for (j=0; j<4; j++) product[i][j] = temp[i][j]; return; } void proj_copy(a, b) proj_matrix a, b; { int i, j; for (i=0; i<4; i++) for (j=0; j<4; j++) a[i][j] = b[i][j]; return; } /* proj_invert() assumes the matrix a is nonsingular, as will always */ /* be the case for matrices representing isometries of H^3. */ void proj_invert(m, m_inv) proj_matrix m, m_inv; { int i, j, k; double scratch[4][8], *a[4], *temp; /* set up */ for (i=4; --i>=0; ) { for (j=4; --j>=0; ) { scratch[i][j] = m[i][j]; scratch[i][j+4] = (i == j) ? 1.0 : 0.0; } a[i] = scratch[i]; } /* do the forward part of Gaussian elimination */ for (j=0; j<4; j++) { /* find the best pivot */ for (i=j+1; i<4; i++) if (fabs(a[i][j]) > fabs(a[j][j])) { temp = a[i]; a[i] = a[j]; a[j] = temp; } /* normalize row j */ for (i=j+1; i<8; i++) a[j][i] /= a[j][j]; /* clear the lower part of column j */ for (i=j+1; i<4; i++) for (k=j+1; k<8; k++) a[i][k] -= a[i][j] * a[j][k]; } /* do the back substitution */ for (j=4; --j>=0; ) for (i=j; --i>=0; ) for (k=4; k<8; k++) a[i][k] -= a[i][j] * a[j][k]; /* copy the answer into m_inv */ for (i=4; --i>=0; ) for (j=4; --j>=0; ) m_inv[i][j] = a[i][j+4]; return; } geomview-1.9.4/src/lib/gprim/discgrp/projective.h0000644000175000001440000000257510455701002016720 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _projective_ #define _projective_ #ifndef _proj_matrix_ #define _proj_matrix_ typedef double proj_matrix[4][4]; typedef double point[4]; #endif #if PROTOTYPES /* in sl2c_to_proj.c */ extern void sl2c_to_proj(/*sl2c_matrix, proj_matrix*/); extern void proj_to_sl2c(/*proj_matrix, sl2c_matrix*/); extern void proj_mult(/*proj_matrix, proj_matrix, proj_matrix*/); extern void proj_copy(/*proj_matrix, proj_matrix*/); extern void proj_invert(/*proj_matrix, proj_matrix*/); #endif #endif geomview-1.9.4/src/lib/gprim/discgrp/discgrp.5gv0000644000175000001440000001154110600646522016453 00000000000000.TH discgrp 5gv "Date: 92/08/26" " " "Geometry Project Programs" .SH NAME discrete group file formats .SH SYNOPSIS An ascii file representation of a discrete geometric group. .SH SUMMARY This file format applies to a wide variety of groups encountered in topology and geometry. At the beginning of the file is the string DISCGRP, in conformity with other OOGL file formats (see oogl(5)). The remainder of the file is a series of parenthesized expressions. The file format is based on an expandable set of key markers and values. A typical entry would be .RS .nf (group borromean ) .fi .RE where parentheses enclose the expression. The string 'group' is called the key marker. The remaining text contains a value, in this case a character string which is the name of the group. .Pp Key markers currently recognized and their values include: .RS .nf group A name for this group. comment An arbitrary comment [maximum length 256 bytes] [must be enclosed in double quotes] attribute One of a several keyword identifiers including: euclidean is a euclidean group hyperbolic is a hyperbolic group spherical is a spherical group transposed the matrices are transposed finite this is a finite group model In the case that 'hyperbolic' is an attribute, and the dimension is three, this keyword sets the model that is expected for reading subsequent isometries, i.e., expects elements of SL(2,C) if the model is upperhalfspace or conformalball and O(3,1,R) if it is projective. projective default upperhalfspace conformalball [not currently implemented] display These values set characteristics of the the display of the discrete group. centercam keeps the camera centered in central dirichlet domain. zcull removes tiles which lie behind the camera. showcam if centercam is set, displays camgeom, if provided (see below). dimn The dimension of the space. ngens Number of generators. gens List of generators. nels Number of group elements. els List of group elements. wafile Word acceptor file (in DEAGL format version 2.2) camgeom An OOGL-format geometry description to represent the observer. geom An OOGL-format geometry description. Will replace the default Dirichlet domain computation. .fi .RE .PP String-matching of key markers and attribute values is case-insensitive. .PP Currently all matrices must be 4x4 real matrices. Hence the only valid dimensions are 2,3, or 4. The typical case is dimension 3 where there are projective models for hyperbolic, euclidean, and spherical geometry. Dimension 2 groups should leave the z-coordinate unchanged. .PP Matrices are considered transposed if they are considered to act on column vectors as in: M.v = v'. This is the usual mathematical convention convention. So, if you use this convention you must mark your matrices as being transposed. .PP Group elements are specified by an optional character string followed by a list of 16 real numbers. For the case of generators, the character string represents the name of that generator. Its main use is with the automatic group software: the name used here should match that of the generator in the word acceptor file. It should, for example, be a single character for the software to work reliably. For composite elements, the string is the word in the generators which describes this group element. .PP OOGL libraries expect discrete group files to use the '.dgp' suffix. .PP A file which describes the group of the three dimensional torus follows: .RS .nf DISCGRP (group 3torus ) (comment " This is a test of the new discrete group library. " ) (attribute Euclidean ) (display centercam ) (enumdepth 3 ) # look at all words of length 3 or less in generators (enumdist 10.0 ) # and which don't move the origin more than 10.0 (dimn 3 ) (ngens 3 ) (gens a 1 0 0 0 0 1 0 0 0 0 1 0 1 0 -0.1 1 b 1 0 0 0 0 1 0 0 0 0 1 0 0.1 1 0 1 c 1 0 0 0 0 1 0 0 0 0 1 0 0 0.2 1 1 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) (camgeom { = OFF 5 2 5 0 0 0 -0.1 0 0.5 0.1 0 0.5 0 -0.1 0.5 0 0.1 0.5 3 0 1 2 200 200 0 .8 3 0 3 4 0 200 200 .8 } ) .fi .RE .PP .SH FILES Example group files are to be found in the OOGL release in ${GEOM}/data/groups, where e.g., GEOM = /u/gcg/ngrap. See also discgrp(3) and automata(1). .SH AUTHORS Charlie Gunn. .SH BUGS For dimension 2, the code should read and write 3 x 3 matrices. geomview-1.9.4/src/lib/gprim/discgrp/discgrp.h0000644000175000001440000000723110600215371016174 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef DISCGRPDEF #define DISCGRPDEF #include "bbox.h" #include "dgflag.h" #include "create.h" #include "appearance.h" #include "pick.h" #include "streampool.h" #ifndef NULL #define NULL 0 #endif #ifndef FALSE #define FALSE 0 #endif #define DISCGRPMAGIC GeomMagic('d',1) typedef struct DiscGrp DiscGrp ; extern DiscGrp * DiscGrpPick( DiscGrp *, Pick *, Appearance *, Transform, TransformN *, int * ); extern GeomClass *DiscGrpMethods( void ); extern char *DiscGrpName( void ); /* extern DiscGrp *DiscGrpFLoad( FILE *, char * ); extern DiscGrp *DiscGrpLoad( char * ); */ extern Geom *DiscGrpImport (Pool * ); extern DiscGrp *DiscGrpSave( DiscGrp *, char * ); extern DiscGrp *DiscGrpFSave( DiscGrp *, FILE *, char * ); extern BBox *DiscGrpBound( DiscGrp *, Transform T, TransformN *TN); extern DiscGrp *DiscGrpDraw( DiscGrp * ); /* extern DiscGrpElList *DiscGrpElListCreate(DiscGrpElList *, ...); extern DiscGrp *DiscGrpEvert( DiscGrp * ); extern DiscGrp *DiscGrpTransform( DiscGrp *, Transform ); extern DiscGrp *DiscGrpTransformTo( DiscGrp *, Transform ); */ /* tokens used by the create routines, not duplicated in create.h */ /* we'll use the '900' region: this ought to be registered somewhere */ /* DGELC == DiscGrpElListCreate DGC == DiscGrpCreate */ enum { DGCR_ATTRIBUTE = 900, /* int : attributes in both DGC and DGELC */ DGCR_ATTRIBUTELIST, /* int * : list of attributes in DGELC */ DGCR_WORD, /* char (*)[DG_WORDLENGTH] : used by * DiscGrpElListCreate */ DGCR_ELEM, /* DiscGrpEl * : used in DGELC note that * CR_ELEM is also used here */ DGCR_CPOINT, /* HPoint3 * :base point of dirichlet domain: */ DGCR_CAMGEOM, /* Geom * :geometry used to represent the observer*/ DGCR_CAMGEOMHANDLE, /* Handle * */ DGCR_HANDLE_CAMGEOM, /* Handle *, Geom * */ DGCR_DDGEOM, /* Geom * :geometry for Dirichlet domain */ DGCR_DDGEOMHANDLE, /* Handle * */ DGCR_HANDLE_DDGEOM, /* Handle *, Geom * */ DGCR_GENS, /* DiscGrpElList * : generators */ DGCR_BIGLIST, /* DiscGrpElList * : general list */ DGCR_ENUMDEPTH, /* int : depth to compute wordlist */ DGCR_ENUMDIST, /* float : maximum distance of tiles */ DGCR_SCALE, /* float : scaling factor for dirdom */ DGCR_FLAG, /* the flag field of the DiscGrp */ DGCR_NAME, /* the flag field of the DiscGrp */ DGCR_COMMENT, /* the flag field of the DiscGrp */ DGCR_DRAWDIST, /* max distance grp el moves cpoint for * drawing purposes (generally less than * enumdist)_ */ DGCR_END }; #endif /*DISCGRPDEF*/ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/discgrp/discgrpP.h0000644000175000001440000001037110600206702016311 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef DISCGRPPDEF #define DISCGRPPDEF #include "geomclass.h" #include "discgrp.h" #include "3d.h" #include "wa.h" #include "winged_edge.h" /* attributes */ #define DG_KEYWORDSIZE 32 #define DG_NAMESIZE 128 #define DG_LABELSIZE 256 #define DG_WORDLENGTH 32 #define DG_MAXGENS 128 /* MAXGENS appears in fsa.h */ struct DiscGrpEl { int attributes; /* type? fixed points, etc? */ char word[DG_WORDLENGTH]; /* the 'string' in the generators? */ Transform tform; ColorA color; struct DiscGrpEl *inverse; }; typedef struct DiscGrpEl DiscGrpEl; typedef struct keytokenpair { char key[32]; int token; } keytokenpair; typedef struct { int attributes; /* special, orthogonal, projective, etc */ /* plus entry type ... */ int dimn; /* dimension of matrix */ int sig; /* signature of group */ } matrixgroup; typedef struct { int num_el; matrixgroup mgroup; DiscGrpEl *el_list; } DiscGrpElList; typedef struct { #define FRUS_LEFT 0 #define FRUS_RIGHT 1 #define FRUS_TOP 2 #define FRUS_BOTOM 3 HPoint3 frustrum[4]; /* planes for culling against view frustum */ Transform m2w, w2m, c2w, w2c, c2m, m2c; } dgviewinfo; struct DiscGrp { GEOMFIELDS; char *name; char *comment; unsigned flag; /* graphics flags */ int attributes; /* group attributes */ int dimn; float (*c2m)[4]; /* record the transform taking cam->model*/ wa *fsa; /* word acceptor */ DiscGrpElList *gens; /* generators */ DiscGrpElList *nhbr_list; /* dirdom neighbors */ DiscGrpElList *big_list; /* some arbitrary list of group el's */ HPoint3 cpoint; /* center point for dirichlet domain */ Geom *camgeom; /* camera geom: moves w/ camera */ Handle *camgeomhandle; Geom *ddgeom; /* special geom*/ Handle *ddgeomhandle; Geom *geom; /* geometry for one fund domain */ Handle *geomhandle; float scale; /* shrink dirdom before drawing... */ int enumdepth; /* max word length for big_list */ float enumdist; /* max distance grp el moves cpoint */ float drawdist; /* max distance grp el moves cpoint for drawing purposes (generally less than enumdist)_ */ void (*predraw)(); dgviewinfo viewinfo; /* camera position, etc */ } ; extern HPoint3 DGorigin; extern GeomClass *DiscGrpClass; /* private methods */ extern void DiscGrpSetupDirdom( DiscGrp *discgrp); extern DiscGrpEl *DiscGrpClosestGroupEl( DiscGrp *discgrp, HPoint3 *poi); extern DiscGrpElList *DiscGrpExtractNhbrs( WEpolyhedron *wepoly ); extern Geom *DiscGrpDirDom( DiscGrp *dg); extern Geom *WEPolyhedronToBeams( WEpolyhedron *poly, float alpha); extern WEpolyhedron *DiscGrpMakeDirdom( DiscGrp *dg, HPoint3 *pt0, int slice); extern DiscGrpElList *DiscGrpEnum( DiscGrp *dg, int (*constraintfn)()); extern void DiscGrpInitStandardConstraint( int depth, float d0, float d1); extern int DiscGrpStandardConstraint( DiscGrpEl *dgel); extern DiscGrpElList *DiscGrpElListDelete (DiscGrpElList *exist); extern void DiscGrpAddInverses(DiscGrp *discgrp); void DHPt3PerpBisect(/*point4 p0, point4 p1, point4 result, int metric*/); extern int needstuneup(); extern void tuneup(); extern int is_new(); extern int insert_or_match_mat(); extern int push_new_stack(); extern int enumpush(); extern void init_stack(); extern void make_new_old(); extern int init_out_stack(); extern void delete_list(); extern int enumgetsize(); #endif /* ! DISCGRPPDEF */ geomview-1.9.4/src/lib/gprim/discgrp/dgmisc.c0000644000175000001440000000307210455701002016000 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "discgrpP.h" void DiscGrpHandleScan( DiscGrp *dg, int (*func)(), void *arg ) { if(dg == NULL) return; if(dg->geomhandle) (*func)(&dg->geomhandle, dg, arg); if(dg->ddgeomhandle) (*func)(&dg->ddgeomhandle, dg, arg); if(dg->camgeomhandle) (*func)(&dg->camgeomhandle, dg, arg); if(dg->geom) GeomHandleScan(dg->geom, func, arg); if(dg->ddgeom) GeomHandleScan(dg->ddgeom, func, arg); if(dg->camgeom) GeomHandleScan(dg->camgeom, func, arg); } geomview-1.9.4/src/lib/gprim/discgrp/dgevert.c0000644000175000001440000000240210455701002016166 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrpP.h" DiscGrp * DiscGrpEvert(dg) DiscGrp *dg; { return dg; } geomview-1.9.4/src/lib/gprim/discgrp/dgpick.c0000644000175000001440000000362610522675066016017 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include "discgrpP.h" #include "ooglutil.h" #include "pickP.h" DiscGrp * DiscGrpPick(DiscGrp *dg, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { int elem = 0, pathInd; Transform t; GeomIter *it; DiscGrp *v = NULL; if (TN) return NULL; if(dg == NULL || dg->geom == NULL) return NULL; pathInd = VVCOUNT(p->gcur); vvneeds(&p->gcur, pathInd + 1); VVCOUNT(p->gcur)++; it = GeomIterate((Geom *)dg, DEEP); while(NextTransform(it, t)) { *VVINDEX(p->gcur, int, pathInd) = elem; TmConcat(t,T, t); if(GeomPick(dg->geom, p, ap, t, NULL, NULL)) v = dg; elem++; } VVCOUNT(p->gcur)--; return v; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/discgrp/Headers0000644000175000001440000000014407730237040015671 00000000000000complex.h dgflag.h discgrp.h discgrpP.h enum.h extern.h options.h projective.h vec4.h winged_edge.h geomview-1.9.4/src/lib/gprim/discgrp/dgsave.c0000644000175000001440000000661010622716753016023 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "discgrpP.h" extern keytokenpair attr_list[], dspyattr_list[]; DiscGrp * DiscGrpFSave(DiscGrp *dg, FILE *fp, char *fname) { int i; fprintf(fp,"DISCGRP\n"); if (dg->name) fprintf(fp,"(group \" %s \" )\n",dg->name); if (dg->comment) fprintf(fp,"(comment \" %s \" )\n",dg->comment); for (i=0; iattributes & attr_list[i].token) fprintf(fp,"(attribute %s )\n",attr_list[i].key); } for (i=0; iflag & dspyattr_list[i].token) fprintf(fp,"(display %s )\n",dspyattr_list[i].key); } fprintf(fp,"(dimn %d )\n",dg->dimn); fprintf(fp,"(ngens %d )\n",dg->gens->num_el); fprintf(fp,"(gens\n"); for (i=0; igens->num_el; ++i) { fprintf(fp,"%s\n",dg->gens->el_list[i].word); fputtransform(fp, 1, (float *)dg->gens->el_list[i].tform, 0); } fprintf(fp,")\n"); if (dg->flag & DG_SAVEBIGLIST && dg->big_list) { fprintf(fp,"(nels %d )\n",dg->big_list->num_el); fprintf(fp,"(els\n"); for (i=0; ibig_list->num_el; ++i) { fprintf(fp,"# %s\n",dg->big_list->el_list[i].word); fputtransform(fp, 1, (float *)dg->big_list->el_list[i].tform, 0); } fprintf(fp,")\n"); } fprintf(fp,"(cpoint %f %f %f %f )\n", dg->cpoint.x, dg->cpoint.y, dg->cpoint.z, dg->cpoint.w); if (dg->c2m) { fprintf(fp,"(c2m "); fputtransform(fp, 1, (float *) dg->c2m, 0); fprintf(fp,")\n"); } fprintf(fp,"(enumdepth %d )\n",dg->enumdepth); fprintf(fp,"(enumdist %g )\n",dg->enumdist); fprintf(fp,"(drawdist %g )\n",dg->drawdist); fprintf(fp,"(scale %g )\n",dg->scale); if (dg->geom && dg->geom != dg->ddgeom) { fprintf(fp,"(geom\n"); GeomFSave(dg->geom, fp, fname); fprintf(fp,")\n"); } else if (dg->ddgeom && dg->flag & DG_SAVEDIRDOM ) { fprintf(fp,"(geom\n"); GeomFSave(dg->ddgeom, fp, fname); fprintf(fp,")\n"); } if (dg->camgeom) { fprintf(fp,"(camgeom\n"); GeomFSave(dg->camgeom, fp, fname); fprintf(fp,")\n"); } return(dg); } DiscGrp* DiscGrpSave(DiscGrp *dg, char *name) { DiscGrp *tdg; FILE *outf; outf = fopen(name, "w"); if (!outf) { OOGLError(1,"Unable to open file %s\n",name); return NULL; } tdg = DiscGrpFSave(dg, outf, name); fclose(outf); return (tdg); } geomview-1.9.4/src/lib/gprim/discgrp/xform.c0000644000175000001440000000400410461140705015665 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif typedef double point4[4]; typedef double plane4[4]; typedef double matrix4[4][4]; void matvecmul4(m,v1,v2) matrix4 m; point4 v1,v2; { int i,j; double tmp[4], *tv1, *tv2; tv1 = (double *) v1; tv2 = (double *) v2; for (i=0; i<4; ++i) for (tmp[i]=0, j = 0; j<4; ++j) tmp[i] += m[i][j] * tv1[j]; for (i=0; i<4; ++i) tv2[i] = tmp[i]; } void vecmatmul4(v1,m,v2) matrix4 m; point4 v1,v2; { int i,j; double tmp[4], *tv1, *tv2; tv1 = (double *) v1; tv2 = (double *) v2; for (i=0; i<4; ++i) for (tmp[i]=0, j = 0; j<4; ++j) tmp[i] += m[j][i] * tv1[j]; for (i=0; i<4; ++i) tv2[i] = tmp[i]; } void matmatmul4 (mat1, mat2, mat3) matrix4 mat1, mat2, mat3; { int i, j, k; double tmp[4]; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { tmp[j] = 0.0; for (k = 0; k < 4; k++) { tmp[j] += mat1[i][k] * mat2[k][j]; } mat3[i][j] = tmp[j]; } } } geomview-1.9.4/src/lib/gprim/tlist/0000777000175000001440000000000010665240675014175 500000000000000geomview-1.9.4/src/lib/gprim/tlist/tlcreate.c0000644000175000001440000001024610461140706016047 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "tlistP.h" /* * Tlist creation, editing and deletion */ void TlistDelete( Tlist *tlist ) { if(tlist) { if(tlist->tlist != NULL) GeomDelete(tlist->tlist); if(tlist->tlisthandle != NULL) HandlePDelete(&tlist->tlisthandle); if(tlist->elements != NULL) OOGLFree(tlist->elements); } } Tlist * TlistCopy( Tlist *t) { Tlist *nt; int i; nt = OOGLNewE(Tlist, "TlistCopy: Tlist"); GGeomInit(nt, t->Class, t->magic, NULL); nt->nelements = t->nelements; nt->elements = OOGLNewNE(Transform, nt->nelements, "TList transforms"); for (i = 0; i < nt->nelements; i++) TmCopy(t->elements[i], nt->elements[i]); nt->tlist = GeomCopy(t->tlist); nt->tlisthandle = NULL; return(nt); } Geom * TlistReplace( Tlist *tlist, Geom *geom ) { Geom *old; if(tlist == NULL) return NULL; old = tlist->tlist; tlist->tlist = geom; return old; } int TlistGet( Tlist *tlist, int attr, void *attrp ) { switch(attr) { case CR_GEOM: *(Geom **)attrp = (Geom *)tlist->tlist; break; default: return -1; } return 1; } Tlist * TlistCreate(Tlist *exist, GeomClass *Classp, va_list *a_list) { Tlist *tlist; Geom *g; Handle *h; int copy = 1; int copyel = 0; int attr; int i; Transform *elements = (Transform *) NULL; if (exist == NULL) { tlist = OOGLNewE(Tlist, "TlistCreate tlist"); tlist->tlisthandle = NULL; tlist->tlist = NULL; tlist->nelements = 0; tlist->elements = NULL; GGeomInit (tlist, Classp, TLISTMAGIC, NULL); } else { /* XXX Check that exist is a tlist. */ tlist = exist; } while ((attr = va_arg (*a_list, int))) switch(attr) { case CR_GEOM: case CR_TLIST: h = NULL; goto settlist; case CR_HANDLE_GEOM: h = va_arg(*a_list, Handle *); settlist: g = va_arg(*a_list, Geom *); if(copy) RefIncr((Ref *)g); if(tlist->tlist) GeomDelete(tlist->tlist); tlist->tlist = g; sethandle: if(tlist->tlisthandle) HandleDelete(tlist->tlisthandle); if(copy && h) RefIncr((Ref *)h); tlist->tlisthandle = h; break; case CR_TLISTHANDLE: h = va_arg(*a_list, Handle *); goto sethandle; case CR_ELEM: elements = va_arg (*a_list, Transform *); copyel = copy; break; case CR_NELEM: tlist->nelements = va_arg (*a_list, int); if (tlist->elements != NULL) { OOGLFree (tlist->elements); tlist->elements = NULL; } break; default: if(GeomDecorate(tlist, ©, attr, a_list)) { OOGLError (0, "TlistCreate: undefined option: %d", attr); if (exist == NULL) GeomDelete ((Geom *) tlist); return NULL; } } if ((tlist->elements == NULL) && (tlist->nelements > 0)) { if (elements != NULL && !copyel) tlist->elements = elements; else { tlist->elements = OOGLNewNE(Transform, tlist->nelements, "TlistCreate: matrices"); if (elements == NULL) for (i=0; inelements; i++) TmIdentity (tlist->elements[i] ); else memcpy (tlist->elements, elements, tlist->nelements * sizeof (Transform)); } } return tlist; } geomview-1.9.4/src/lib/gprim/tlist/tlistP.h0000644000175000001440000000341010511417163015523 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef TLISTPDEFS #define TLISTPDEFS #include "tlist.h" #include "bboxP.h" #define TLISTMAGIC GeomMagic ('t', 1) /* * A Transformation List is a collection of 4x4 transformation matrices. * May take as argument another Tlist (or List of TList's); * if so, we act as the outer product: all our elements multiplied by * all those in the given tlist. */ struct Tlist { GEOMFIELDS; int nelements; Transform *elements; Geom *tlist; /* More transformations: take product */ Handle *tlisthandle; }; extern char *TlistName( void ); extern Tlist *TlistCreate( Tlist *existing, GeomClass *Class, va_list *args ); extern Tlist *TlistCopy( Tlist *t); extern void TlistDelete( Tlist * ); extern Geom *TlistImport( Pool *p ); extern int TlistExport( Tlist *tl, Pool *p ); #endif /*TLISTPDEFS*/ geomview-1.9.4/src/lib/gprim/tlist/tlstream.c0000644000175000001440000001303210455701004016070 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "tlistP.h" #include "inst.h" #include "list.h" #include "handleP.h" #include "transobj.h" Geom * TlistImport( Pool *p ) { Geom *subtlist = NULL; Geom *list = NULL; Geom *groupinst = NULL; Geom *geom = NULL; Geom *g = NULL; Transform tfm; Handle *geomhandle = NULL, *tfmhandle = NULL, *subtlisthandle = NULL; char *token; static char errfmt[] = "Reading TLIST from \"%s\": %s"; int i, nel; vvec v; vvec vinst; int brack = 0; int binary = 0; int sawheader = 1; float *tp; float preread = 0; int got_preread = 0; IOBFILE *file; Transform TT[100]; if((file = PoolInputFile(p)) == NULL) return NULL; token = GeomToken(file); if(strcmp(token, "GROUP") == 0 || strcmp(token, "TLIST") == 0) { sawheader = 1; } else { if(*token == '\0') return NULL; if(*token == '-' || isdigit(*token) || *token == '.') preread = strtod(token, &token); if(*token != '\0') return NULL; got_preread = 1; } VVINIT(vinst, Geom *, 7); if (sawheader && (iobfnextc(file, 1) == 'B')) { if(iobfexpectstr(file, "BINARY")) return NULL; if(iobfnextc(file, 1) == '\n') (void) iobfgetc(file); /* * TLIST BINARY ... \n * * */ if(iobfgetni(file, 1, &nel, binary) != 1 || nel < 0 || nel > 9999999) return NULL; VVINIT(v, Transform, 1); vvneeds(&v, nel); if((VVCOUNT(v) = iobfgettransform(file, nel, (float *)VVEC(v,Transform), 1)) < nel) { vvfree(&v); OOGLError(0, "Reading binary TLIST from \"%s\": got only %d of %d transforms expected", PoolName(p), VVCOUNT(v), nel); return NULL; } } else { VVINIT(v, Transform, 100); vvuse(&v, TT, 100); } for(;;) { switch(iobfnextc(file, 0)) { case ':': case '<': case '@': case 'd': tfmobject: if(TransStreamIn(p, &tfmhandle, tfm)) { *VVAPPEND(vinst, Geom *) = GeomCCreate(NULL, InstMethods(), CR_AXIS, tfm, CR_AXISHANDLE, tfmhandle, CR_END); } break; case CBRA: iobfgetc(file); brack++; break; case CKET: if(--brack >= 0) { iobfgetc(file); break; } /* If brackets matched, fall into... */ case EOF: case ';': case ')': goto done; case 't': iobfgetc(file); if(iobfexpectstr(file, /*t*/"ransform") == 0) goto tfmobject; if(iobfexpecttoken(file, /*t*/"list")) goto syntax; if(!GeomStreamIn(p, &subtlisthandle, &subtlist)) { OOGLSyntax(file, errfmt, PoolName(p), "failed reading 'tlist'"); return NULL; } break; case 'u': case 'g': if(iobfexpecttoken(file, "unit") && iobfexpecttoken(file, "geom")) goto syntax; /* * "GROUP" Compatibility mode -- create an Inst comprising our * Tlist and the given object. */ if(!GeomStreamIn(p, &geomhandle, &geom)) OOGLSyntax(file, errfmt, PoolName(p), "failed reading 'geom'"); else groupinst = GeomCCreate(NULL, InstMethods(), CR_HANDLE_GEOM, geomhandle, geom, CR_END); break; default: tp = VVAPPEND(v, float); if(got_preread) { got_preread = 0; *tp++ = preread; if(iobfgetnf(file, 15, tp, 0) == 15) break; } else { if(iobfgettransform(file, 1, tp, 0) > 0) break; } /* Else fall into... */ syntax: if(sawheader) OOGLSyntax(file, errfmt, PoolName(p), "unknown keyword"); vvfree(&v); return NULL; } } done: if(brack > 0) OOGLSyntax(file, errfmt, PoolName(p), "unclosed '{'"); /* } */ if(VVCOUNT(v) > 0) { vvtrim(&v); *VVAPPEND(vinst, Geom *) = GeomCCreate(NULL,TlistMethods(), CR_NOCOPY, CR_NELEM, VVCOUNT(v), CR_ELEM, VVEC(v,float), CR_END); } for(i = 0, list = g = NULL; i < VVCOUNT(vinst); i++) { g = VVEC(vinst, Geom *)[i]; GeomSet(g, CR_HANDLE_GEOM, subtlisthandle, subtlist, CR_END); if(VVCOUNT(vinst) > 1) list = ListAppend(list, g); } if(list) g = list; if(groupinst) { GeomSet(groupinst, CR_TLIST, g, CR_END); g = groupinst; } return g; } int TlistExport( Tlist *tl, Pool *p ) { FILE *outf; if(tl == NULL || tl->elements == NULL || (outf = PoolOutputFile(p)) == NULL) return 0; fprintf(outf, "TLIST\n"); if(fputtransform(outf, tl->nelements, (float *)tl->elements, 0) != tl->nelements) return 0; if(tl->tlist != NULL) { fprintf(outf, " tlist "); GeomStreamOut( p, tl->tlisthandle, tl->tlist ); } return 1; } geomview-1.9.4/src/lib/gprim/tlist/tlist.h0000644000175000001440000000326010516136516015413 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef TLISTDEFS #define TLISTDEFS /* * Public definitions for a Tlist */ #include "tlist.h" #include "bboxP.h" #define TLISTMAGIC GeomMagic ('t', 1) typedef struct Tlist Tlist; extern GeomClass *TlistClass; /* Our class pointer */ extern GeomClass *TlistMethods( void ); extern Geom *TlistFLoad( FILE *, char *fname ); extern Tlist *TlistFSave( Tlist *, FILE *, char *fname ); extern Tlist *TlistTransform( Tlist *, Transform, TransformN * ); extern Tlist *TlistPosition( Tlist *, Transform ); extern Geom *TlistReplace( Tlist *tlist, Geom *newtlist ); extern int TlistGet( Tlist *tlist, int attr, void *attrp ); extern Geom *TlistImport( Pool * ); extern int TlistExport( Tlist *, Pool * ); #endif /*TLISTDEFS*/ geomview-1.9.4/src/lib/gprim/tlist/Makefile.am0000644000175000001440000000027010455665335016145 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtlist.la libtlist_la_SOURCES = \ tlclass.c tlcreate.c tlstream.c tltransform.c \ tlist.h tlistP.h geomview-1.9.4/src/lib/gprim/tlist/Makefile.in0000644000175000001440000003576210665240504016162 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/tlist DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libtlist_la_LIBADD = am_libtlist_la_OBJECTS = tlclass.lo tlcreate.lo tlstream.lo \ tltransform.lo libtlist_la_OBJECTS = $(am_libtlist_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libtlist_la_SOURCES) DIST_SOURCES = $(libtlist_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtlist.la libtlist_la_SOURCES = \ tlclass.c tlcreate.c tlstream.c tltransform.c \ tlist.h tlistP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/tlist/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/tlist/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libtlist.la: $(libtlist_la_OBJECTS) $(libtlist_la_DEPENDENCIES) $(LINK) $(libtlist_la_OBJECTS) $(libtlist_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlstream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tltransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/tlist/tlclass.c0000644000175000001440000000402510455701004015704 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "tlistP.h" GeomClass *TlistClass = NULL; int TlistPresent = 1; static char tlistName[] = "tlist"; char * TlistName() { return tlistName; } GeomClass * TlistMethods() { if( !TlistClass ) { TlistClass = GeomClassCreate(tlistName); TlistClass->name = TlistName; TlistClass->methods = (GeomMethodsFunc *)TlistMethods; TlistClass->create = (GeomCreateFunc *)TlistCreate; TlistClass->copy = (GeomCopyFunc *)TlistCopy; TlistClass->Delete = (GeomDeleteFunc *)TlistDelete; TlistClass->transform = (GeomTransformFunc *)TlistTransform; TlistClass->replace = (GeomReplaceFunc *)TlistReplace; TlistClass->position = (GeomPositionFunc *)TlistPosition; TlistClass->get = (GeomGetFunc *)TlistGet; TlistClass->import = (GeomImportFunc *)TlistImport; TlistClass->export = (GeomExportFunc *)TlistExport; } return TlistClass; } geomview-1.9.4/src/lib/gprim/tlist/tltransform.c0000644000175000001440000000334210516550163016621 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "tlistP.h" Tlist * TlistPosition(Tlist *tlist, Transform T) { TmIdentity(T); if( tlist ) { GeomIter *it = GeomIterate( (Geom *)tlist, DEEP ); NextTransform( it, T ); DestroyIter( it ); } return tlist; } Tlist * TlistTransform(Tlist *tlist, Transform T, TransformN *TN) { int i; if (!tlist) return NULL; if (TN) { /* We would have to generate an NTlist here ... */ return NULL; } if (T && T != TM_IDENTITY) { for(i = tlist->nelements; --i >= 0; ) TmPreConcat( T, tlist->elements[i] ); } return tlist; } geomview-1.9.4/src/lib/gprim/tlist/Headers0000644000175000001440000000002107730237715015400 00000000000000tlist.h tlistP.h geomview-1.9.4/src/lib/gprim/lincoln/0000777000175000001440000000000010665240673014472 500000000000000geomview-1.9.4/src/lib/gprim/lincoln/lincolnclass.c0000644000175000001440000000350310455701003017221 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: * Return the geometry class structure for Lincoln * */ #include "polylistP.h" #include "lincolndefs.h" static GeomClass *aLincolnMethods = NULL; int LincolnPresent = 1; static char lincolnName[] = "lincoln"; char * LincolnName() { return lincolnName; } GeomClass * LincolnMethods() { if (!aLincolnMethods) { PolyListMethods(); /* Create the polylist class first, */ aLincolnMethods = GeomSubClassCreate("polylist", lincolnName); aLincolnMethods->fload = (GeomFLoadFunc *) LincolnFLoad; aLincolnMethods->name = (GeomNameFunc *) LincolnName; } return aLincolnMethods; } geomview-1.9.4/src/lib/gprim/lincoln/lincolndefs.h0000644000175000001440000000236610455701003017050 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* Geometry Routines Geometry Supercomputer Project ROUTINE DESCRIPTION: The header file for the lincoln object */ #ifndef LINCOLNDEFS #define LINCOLNDEFS /* FUNCTION DECLARATIONS */ extern GeomClass *LincolnMethods(); extern PolyList *LincolnFLoad(); #endif /*LINCOLNDEFS*/ geomview-1.9.4/src/lib/gprim/lincoln/Makefile.am0000644000175000001440000000026210455665332016442 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = liblincoln.la liblincoln_la_SOURCES = \ lincolnclass.c lincolnload.c \ lincolndefs.h lincoln.h geomview-1.9.4/src/lib/gprim/lincoln/Makefile.in0000644000175000001440000003554510665240503016457 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/lincoln DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) liblincoln_la_LIBADD = am_liblincoln_la_OBJECTS = lincolnclass.lo lincolnload.lo liblincoln_la_OBJECTS = $(am_liblincoln_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(liblincoln_la_SOURCES) DIST_SOURCES = $(liblincoln_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = liblincoln.la liblincoln_la_SOURCES = \ lincolnclass.c lincolnload.c \ lincolndefs.h lincoln.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/lincoln/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/lincoln/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done liblincoln.la: $(liblincoln_la_OBJECTS) $(liblincoln_la_DEPENDENCIES) $(LINK) $(liblincoln_la_OBJECTS) $(liblincoln_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lincolnclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lincolnload.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/lincoln/lincolnload.c0000644000175000001440000001001610560442144017035 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Load a polylist in the Lincoln file format. */ #include "polylistP.h" #include "lincoln.h" #define CONV(ptr,list) if (ptr) (ptr) = list + ((long)(ptr) - 1); PolyList * LincolnFLoad(IOBFILE *inf) { struct data header; struct vertex *vertex_list; struct edge *edge_list; struct face *face_list; struct vertex *vp; struct edge *ep; struct face *fp; int i,j; Vertex *v_list; PolyList *new; if(iobfnextc(inf,0) != '\0') /* Demand null title string */ return NULL; if(iobfread(&header,sizeof(struct data),1,inf) <= 0) return NULL; vertex_list = OOGLNewNE(struct vertex, header.nvertices, "Lincoln vertices"); edge_list = OOGLNewNE(struct edge, header.nedges, "Lincoln edges"); face_list = OOGLNewNE(struct face, header.nfaces, "Lincoln faces"); if(iobfread(vertex_list,sizeof(struct vertex),header.nvertices,inf) <= 0 || iobfread(edge_list,sizeof(struct edge),header.nedges,inf) <= 0 || iobfread(face_list,sizeof(struct face),header.nfaces,inf) <= 0) return NULL; for (vp = vertex_list; vpe,edge_list); } for (ep = edge_list; epf0,face_list); CONV(ep->f1,face_list); CONV(ep->v0,vertex_list); CONV(ep->v1,vertex_list); CONV(ep->e00,edge_list); CONV(ep->e01,edge_list); CONV(ep->e10,edge_list); CONV(ep->e11,edge_list); } for (fp= face_list; fp < face_list+header.nfaces; fp++) { CONV(fp->e,edge_list); } new = OOGLNewE(PolyList, "Lincoln"); /* should do a PolyListCreate here but time's short...*/ GGeomInit(new, PolyListMethods(), PLMAGIC, NULL); v_list = new->vl = OOGLNewNE(Vertex, header.nvertices, "Lincoln verts"); new->p = OOGLNewNE(Poly, header.nfaces, "Lincoln faces"); memset(v_list, 0, header.nvertices * sizeof(Vertex)); new->geomflags = PL_HASPCOL; /* We have a color-per-face, no normals */ new->n_polys = header.nfaces; new->n_verts = header.nvertices; v_list = new->vl; for (i = 0; i < header.nfaces; i++) { Poly *p; fp = face_list + i; ep = fp->e; if (ep->f1 == fp) vp = ep->v0; else vp = ep->v1; p = &new->p[i]; p->n_vertices = fp->order; p->v = OOGLNewNE(Vertex *, fp->order, "Lincoln face"); p->pcol.r = ((fp->chars.color>>16) &0xFF) / 255.0; p->pcol.g = ((fp->chars.color>>8) &0xFF) / 255.0; p->pcol.b = ((fp->chars.color) &0xFF) / 255.0; p->pcol.a = (fp->chars.color&0xFF000000) ? (((fp->chars.color>>24) & 0xFF) / 255.0) : 1.0; for (j = 0; j < fp->order; j++) { Vertex *v = &v_list[vp - vertex_list]; p->v[j]= v; v->pt.x = vp->pos.x; v->pt.y = vp->pos.y; v->pt.z = vp->pos.z; if (ep->v0 == vp) { vp = ep->v1; ep = ((ep->f0==fp) ? (ep->e01) : (ep->e11)) ; } else { vp = ep->v0; ep = ((ep->f0==fp) ? (ep->e00) : (ep->e10)) ; } } } OOGLFree((char*)vertex_list); OOGLFree((char*)edge_list); OOGLFree((char*)face_list); return new; } geomview-1.9.4/src/lib/gprim/lincoln/lincoln.h0000644000175000001440000000433410455701003016203 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* Winged edge data structure represented in Lincoln file format \ / \ / \ / \ / e00\ /e10 \ / \ / v0 | | | f0 |e f1 | | | | v1 / \ / \ e01/ \e11 / \ / \ / \ */ #define BUFSIZE 256 struct position { float x,y,z,w; }; struct equation { float x,y,z,w; }; /* struct vertexchars { information will be stored here to give the characteristics of an vertex (e.g. pointtype, color,...) } */ struct vertex { struct position pos; struct edge *e; int order; /* struct vertexchars chars; */ }; /* struct edgechars { information will be stored here to give the characteristics of an edge (e.g. thickness, color,...) } */ struct edge { struct vertex *v0,*v1; struct face *f0,*f1; struct edge *e00,*e01,*e10,*e11; /* struct edgechars chars; */ }; struct facechars { int color; }; struct face { struct equation eqn; struct edge *e; int order; struct facechars chars; }; struct data { char title[BUFSIZE]; int dim, nvertices, nedges, nfaces, nobjects ;} ; geomview-1.9.4/src/lib/gprim/lincoln/Headers0000644000175000001440000000003007730237270015673 00000000000000lincoln.h lincolndefs.h geomview-1.9.4/src/lib/gprim/polylist/0000777000175000001440000000000010665240674014714 500000000000000geomview-1.9.4/src/lib/gprim/polylist/plcreate.c0000644000175000001440000001476110653722144016576 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * PolyList creation, editing, and deletion. */ #include "polylistP.h" #include "bsptree.h" /* * Free a PolyList. */ #include "polylistP.h" PolyList * PolyListDelete(PolyList *pl) { int i; Poly *p; if (pl == NULL) { return NULL; } if((p = pl->p) != NULL) { for(i = pl->n_polys; --i >= 0; p++) { if(p->v != NULL) OOGLFree(p->v); } OOGLFree(pl->p); } if(pl->vl != NULL) { OOGLFree(pl->vl); } PolyListDelete(pl->plproj); return NULL; } PolyList * PolyListCreate(PolyList *exist, GeomClass *classp, va_list *a_list) { PolyList *pl; Vertex *v; int *nvertperpol=NULL, *verts=NULL; int npolyflag=0, nvertflag=0, vertflag=0, pointflag=0; HPoint3 *v4 = NULL; Point3 *v3 = NULL, *vn = NULL, *pn = NULL; ColorA *vc = NULL, *pc = NULL; int *pf = NULL; int attr, copy=1; int numentries=0, numvertices=0; int i; int j, k=0, dimn = 3; if (exist == NULL) { pl = OOGLNewE(PolyList,"PolyListCreate polylist"); GGeomInit(pl, classp, PLMAGIC, NULL); pl->geomflags = pl->n_polys = pl->n_verts = 0; pl->pdim = 4; pl->p = (Poly *)NULL; pl->vl = (Vertex *)NULL; pl->plproj = NULL; } else { pl = exist; PolyListDelete(pl->plproj); /* better delete it. */ pl->plproj = NULL; } while ((attr = va_arg(*a_list, int))) switch (attr) { case CR_NOCOPY: OOGLError(0,"Note: NOCOPY option not used by PolyListCreate()"); break; case CR_FLAG: pl->geomflags = va_arg(*a_list, int); break; case CR_NPOLY: pl->n_polys = va_arg(*a_list, int); npolyflag = 1; break; case CR_NVERT: /* number of verts of each polygon */ nvertperpol = va_arg(*a_list, int*); nvertflag = 1; break; case CR_VERT: /* indices of all verts of all polygons, concatenated */ /* verts[] contains sum(nvertperpol[]) elements */ verts = va_arg(*a_list, int*); vertflag = 1; break; case CR_POINT: v3 = va_arg(*a_list, Point3 *); pointflag = 1; dimn = 3; pl->geomflags &= ~(PL_HASVN | PL_HASPN | PL_HASPFL); break; case CR_POINT4: v4 = va_arg(*a_list, HPoint3 *); pointflag = 1; dimn = 4; pl->geomflags &= ~(PL_HASVN | PL_HASPN | PL_HASPFL); break; case CR_NORMAL: vn = va_arg(*a_list, Point3 *); /* if no normal bit has been set... */ if (vn) pl->geomflags |= PL_HASVN; break; case CR_COLOR: pl->geomflags &= ~COLOR_ALPHA; vc = va_arg(*a_list, ColorA *); if (vc) { pl->geomflags |= PL_HASVCOL; } break; case CR_POLYNORMAL: pn = va_arg(*a_list, Point3 *); if (pn) pl->geomflags |= PL_HASPN; break; case CR_POLYFLAGS: pf = va_arg(*a_list, int *); if (pf) pl->geomflags |= PL_HASPFL; break; case CR_POLYCOLOR: pl->geomflags &= ~COLOR_ALPHA; pc = va_arg(*a_list, ColorA *); if (pc) { pl->geomflags |= PL_HASPCOL; } break; default: if (GeomDecorate(pl, ©, attr, a_list)) { OOGLError(0,"Undefined PolyList option: %d", attr); if (!exist) GeomDelete((Geom *)pl); return NULL; } } if (!exist && (!npolyflag || !nvertflag || !vertflag || !pointflag)) { if (!npolyflag) OOGLError(0,"Must specify number of polygons"); if (!nvertflag) OOGLError(0,"Must specify NVERT array"); if (!vertflag) OOGLError(0,"Must specify VERT array"); if (!pointflag) OOGLError(0,"Must specify vertices"); GeomDelete((Geom *)pl); return NULL; } if(nvertflag) { for (i=0; in_polys; i++) numentries += nvertperpol[i]; for (i=0; i numvertices) numvertices = verts[i]; pl->n_verts = numvertices + 1; if(pl->vl) OOGLFree(pl->vl); pl->vl = OOGLNewNE(Vertex, pl->n_verts, "polylist vertices"); } if(pointflag) { /* if dimn == 3, copy over into 4-vector area and add a '1' in * the 4th coordinate */ int needhomog = 0; v = pl->vl; i = pl->n_verts; if (dimn == 3) { while(--i >= 0) { *(Point3 *)(void *)&(v->pt) = *v3++; v->pt.w = 1.0; v++; } } else { while(--i >= 0) { v->pt = *v4++; if(v->pt.w != 1) needhomog = VERT_4D; v++; } } pl->geomflags = (pl->geomflags & ~VERT_4D) | needhomog; } if(nvertflag) { pl->p = OOGLNewNE(Poly, pl->n_polys, "PolyListCreate polygons"); k = 0; for (i=0; i < pl->n_polys; i++) { int nv = nvertperpol[i]; pl->p[i].flags = 0; pl->p[i].n_vertices = nv; pl->p[i].v = OOGLNewNE(Vertex *, nvertperpol[i], "PolyListCreate poly vert pointers"); for (j = 0; j < nv; j++) pl->p[i].v[j] = &pl->vl[verts[k++]]; } } if (vn) for (i = 0, v = pl->vl; i < pl->n_verts; i++, v++) v->vn = vn[i]; if (pn) for (i = 0; i < pl->n_polys; i++) pl->p[i].pn = pn[i]; if (pf) for (i = 0; i < pl->n_polys; i++) pl->p[i].flags = pf[i]; if (vc) { for (i = 0, v = pl->vl; i < pl->n_verts; i++, v++) { v->vcol = vc[i]; if (vc[i].a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } } if (pc) { for (i = 0; i < pl->n_polys; i++) { pl->p[i].pcol = pc[i]; if (pc[i].a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } } return pl; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/polylist/plbound.c0000644000175000001440000001143310574314463016436 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Return the bounding box of a polylist. * * T TN AXES BBOX * NULL NULL NULL return the objects "native" bounding box * !NULL NULL NULL return a transformed bounding box, Nd objects * interprete T as acting on the x,y,z sub-space. * NULL !NULL NULL return a "native" transformed bounding box, Nd objects * just let TN act on their coordinates, 3d objects are * implicitly padded with zeros * NULL !NULL !NULL return a transformed and projected 3d bounding box. * 3d objects are implicitly padded with zeroes before * the projection is applied. * * All other combinations are unsupported. */ #include "polylistP.h" BBox *PolyListBound(PolyList *polylist, Transform T, TransformN *TN) { int n; Vertex *v; HPoint3 min, max; HPoint3 clean, tmp; n = polylist->n_verts; v = polylist->vl; min = v->pt; /* We assume all the vertices in vl[] are actually used... */ while(--n >= 0 && !finite(v->pt.x + v->pt.y + v->pt.z + v->pt.w)) v++; if(n <= 0) return NULL; /* No finite points */ /* First handle the case without transformations, this means that we return a 3d bbox for 3d polylists, and a 4d bboy for 4d polylists. */ if ((T == TM_IDENTITY || !T) && !TN) { if (!T && (polylist->geomflags & VERT_4D)) { max = min; while(--n >= 0) { Pt4MinMax(&min, &max, &(++v)->pt); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_4D, 1, CR_END); } else { HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { HPt3MinMax(&min, &max, &(++v)->pt); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *ptN; HPointN *minN; HPointN *maxN; BBox *result; ptN = HPtNCreate(5, NULL); if (polylist->geomflags & VERT_4D) { minN = Pt4NTransform(TN, &min, NULL); } else { minN = HPt3NTransform(TN, &min, NULL); } HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); while(--n >= 0) { if (polylist->geomflags & VERT_4D) { Pt4NTransform(TN, &(++v)->pt, ptN); } else { HPt3NTransform(TN, &(++v)->pt, ptN); } HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ if (false && polylist->geomflags & VERT_4D) { /* We operate on the 3x3 x,y,z space, this means that we just * have to omit the "w" coordinate. */ min.w = 1.0; HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = (++v)->pt; tmp.w = 1.0; HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } else { /* ordinary 3d object */ HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n >= 0) { tmp = (++v)->pt; HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/polylist/polylist.h0000644000175000001440000000372710560655113016661 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef POLYLISTDEFS #define POLYLISTDEFS /* * Public definitions for PolyList's */ #include "bbox.h" typedef struct PolyList PolyList; /* Per-polygon flags, set with CR_POLYFLAGS */ #define POLY_CONCAVE GEOMFLAG(0x0100) /* polygon is not convex */ #define POLY_NONFLAT GEOMFLAG(0x0200) /* polygon is not flat */ #define POLY_NOPOLY GEOMFLAG(0x0400) /* polygon is degenerated */ extern PolyList *PolyListDraw( PolyList * ); extern BBox *PolyListBound(PolyList *polylist, Transform T, TransformN *TN); extern Geom *PolyListSphere( PolyList *, Transform, TransformN *TN, int *axes, int ); extern PolyList *PolyListEvert( PolyList * ); extern PolyList *PolyListLoad( char * ); /* Loads "off" files */ extern PolyList *PolyListFLoad( IOBFILE *, char *fname ); extern char *PolyListName( void ); extern PolyList *PolyListSave( PolyList *, char * ); extern PolyList *PolyListFSave( PolyList *, FILE *, char * ); extern PolyList *PolyListTransform( PolyList *, Transform, TransformN * ); #endif/*POLYLISTDEFS*/ geomview-1.9.4/src/lib/gprim/polylist/plclass.c0000644000175000001440000000516510563126067016440 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/polylist/plclass.c,v 1.7 2007/02/09 17:15:35 rotdrop Exp $ */ /* * Initialize the PolyList class record. */ #include "polylistP.h" static GeomClass *aPolyListMethods = NULL; int PolyListPresent = 1; static char polylistName[] = "polylist"; char * PolyListName() { return polylistName; } GeomClass *PolyListMethods(void) { if (!aPolyListMethods) { aPolyListMethods = GeomClassCreate(polylistName); aPolyListMethods->name = (GeomNameFunc *) PolyListName; aPolyListMethods->methods = (GeomMethodsFunc *) PolyListMethods; aPolyListMethods->draw = (GeomDrawFunc *) PolyListDraw; aPolyListMethods->bsptree = (GeomBSPTreeFunc *) PolyListBSPTree; aPolyListMethods->bound = (GeomBoundFunc *) PolyListBound; aPolyListMethods->boundsphere = (GeomBoundSphereFunc *) PolyListSphere; aPolyListMethods->evert = (GeomEvertFunc *) PolyListEvert; aPolyListMethods->create = (GeomCreateFunc *) PolyListCreate; aPolyListMethods->copy = (GeomCopyFunc *) PolyListCopy; aPolyListMethods->fsave = (GeomFSaveFunc *) PolyListFSave; aPolyListMethods->Delete = (GeomDeleteFunc *) PolyListDelete; aPolyListMethods->fload = (GeomFLoadFunc *) PolyListFLoad; aPolyListMethods->pick = (GeomPickFunc *) PolyListPick; aPolyListMethods->transform = (GeomTransformFunc *) PolyListTransform; aPolyListMethods->transformto = (GeomTransformToFunc *) PolyListTransform; } return aPolyListMethods; } geomview-1.9.4/src/lib/gprim/polylist/plnormal.c0000644000175000001440000002260110653722144016613 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Compute the normals to each surface in a polylist. */ #include "polylistP.h" void PolyNormal(Poly *p, Point3 *nu_av, int fourd, int evert, int *flagsp, int *first_concave) { int flags = 0, n; Vertex **vp; Vertex *v1, *v2, *v3; Pt3Coord w1, w2, w3, len; Point3 nu; if (first_concave){ *first_concave = 0; } nu_av->x = nu_av->y = nu_av->z = 0.0; if((n = p->n_vertices) >= 3) { v1 = p->v[n-2]; v2 = p->v[n-1]; vp = p->v; if (fourd) { #undef ANTI_4D #define ANTI_4D(P,Q) \ ((v2->pt.P*w2 - v1->pt.P*w1) * (v3->pt.Q*w3 - v1->pt.Q*w1) - \ (v2->pt.Q*w2 - v1->pt.Q*w1) * (v3->pt.P*w3 - v1->pt.P*w1)) w1 = !fzero(v1->pt.w) ? 1.0 / v1->pt.w : 1.0; w2 = !fzero(v2->pt.w) ? 1.0 / v2->pt.w : 1.0; do { v3 = *vp++; w3 = !fzero(v3->pt.w) ? 1.0 / v3->pt.w : 1.0; nu.x = ANTI_4D(y,z); nu.y = ANTI_4D(z,x); nu.z = ANTI_4D(x,y); if (!fneg(Pt3Dot(&nu, nu_av))) { Pt3Add(nu_av, &nu, nu_av); } else { Pt3Sub(nu_av, &nu, nu_av); flags |= POLY_CONCAVE; if (first_concave) { *first_concave = p->n_vertices - n; first_concave = NULL; } } v1 = v2; w1 = w2; v2 = v3; w2 = w3; } while(--n > 0); #undef ANTI_4D } else { #undef ANTI #define ANTI(P,Q) \ ((v2->pt.P - v1->pt.P) * (v3->pt.Q - v1->pt.Q) - \ (v2->pt.Q - v1->pt.Q) * (v3->pt.P - v1->pt.P)) do { v3 = *vp++; nu.x = ANTI(y,z); nu.y = ANTI(z,x); nu.z = ANTI(x,y); /*Pt3Unit(&nu);*/ if (!fneg(Pt3Dot(&nu, nu_av))) { Pt3Add(nu_av, &nu, nu_av); } else { Pt3Sub(nu_av, &nu, nu_av); flags |= POLY_CONCAVE; if (first_concave) { *first_concave = p->n_vertices - n; first_concave = NULL; } } /*Pt3Unit(nu_av);*/ v1 = v2; v2 = v3; } while(--n > 0); #undef ANTI } } len = Pt3Length(nu_av); #if 0 static Pt3Coord min_len = 1e8; if (!fzero(len) && len < min_len) { min_len = len; fprintf(stderr, "min_len: %e\n", min_len); } #endif if (fzero(len)) { /* degenerated */ flags |= POLY_NOPOLY; } else { if(evert) len = -len; Pt3Mul(1.0/len, nu_av, nu_av); if (flagsp && (n = p->n_vertices) > 3) { /* determine whether this polygon is flat or not */ Point3 diff; v1 = p->v[n-1]; vp = p->v; do { v2 = *vp++; if (fourd) { HPt3SubPt3(&v2->pt, &v1->pt, &diff); } else { Pt3Sub((Point3 *)(void *)&v2->pt, (Point3 *)(void *)&v1->pt, &diff); } if (!fzero(Pt3Dot(nu_av, &diff))) { p->flags |= POLY_NONFLAT; break; } v1 = v2; } while (--n > 0); } } if (flagsp) { *flagsp |= flags; } } PolyList * PolyListComputeNormals(PolyList *polylist, int need) { int i, n, fourd, evert; Poly *p; Vertex **vp; Pt3Coord len; Point3 nu_av; if (!polylist) return NULL; need &= ~polylist->geomflags; fourd = (polylist->geomflags & VERT_4D) != 0; evert = (polylist->geomflags & PL_EVNORM) != 0; if (need & (PL_HASPN|PL_HASPFL)) { /* Create per-polygon normals */ for (i = polylist->n_polys, p = polylist->p; --i >= 0; p++) { if((n = p->n_vertices) >= 3) { if (need & PL_HASPFL) { p->flags = 0; PolyNormal(p, &nu_av, evert, fourd, &p->flags, NULL); } else { PolyNormal(p, &nu_av, evert, fourd, NULL, NULL); } if (need & PL_HASPN) { p->pn = nu_av; } } } } if (need & PL_HASVN) { #if 0 for(i = polylist->n_verts, v = polylist->vl; --i >= 0; v++) { v->vn.x = v->vn.y = v->vn.z = 0.0; } for(i = polylist->n_polys, p = polylist->p; --i >= 0; p++) { for(n = p->n_vertices, vp = p->v; --n >= 0; vp++) { v = *vp; if (fneg(Pt3Dot(&v->vn, &p->pn))) { Pt3Sub(&p->pn, &v->vn, &v->vn); } else { Pt3Add(&p->pn, &v->vn, &v->vn); } } } for(i = polylist->n_verts, v = polylist->vl; --i >= 0; v++) { len = Pt3Length(&v->vn); if(fpos(len)) { if(polylist->flags & PL_EVNORM) len = -len; Pt3Mul(1.0/len, &v->vn, &v->vn); } } #else int *e_idx = OOGLNewNE(int, polylist->n_verts+1, "Adjacent edge indexes"); HPoint3 **edges; int n_edges = 0; Vertex *vl; #define V_IDX(elem, base) \ (int)((long)((char *)(elem) - (char *)(base))/sizeof(*elem)) memset(e_idx, 0, polylist->n_verts*sizeof(int)); for(i = polylist->n_polys, p = polylist->p; --i >= 0; p++) { for(n = p->n_vertices, vp = p->v; --n >= 0; vp++) { int v_idx = V_IDX(*vp, polylist->vl); e_idx[v_idx] += 2; n_edges += 2; } } edges = OOGLNewNE(HPoint3 *, n_edges, "Adjacent edges"); n_edges = e_idx[0]; e_idx[0] = 0; edges[e_idx[0]] = (void *)(long)(n_edges-1); for (i = 1; i < polylist->n_verts; i++) { int v_n_edges = e_idx[i]; e_idx[i] = n_edges; n_edges += v_n_edges; edges[e_idx[i]] = (void *)(long)(v_n_edges-1); } e_idx[i] = n_edges; for(i = polylist->n_polys, p = polylist->p; --i >= 0; p++) { int v_idx, cnt, j; vp = p->v; v_idx = V_IDX(*vp, polylist->vl); cnt = (int)(long)edges[e_idx[v_idx]]; edges[e_idx[v_idx]+cnt--] = &vp[p->n_vertices-1]->pt; edges[e_idx[v_idx]+cnt--] = &vp[1]->pt; if (cnt > 0) { edges[e_idx[v_idx]] = (void *)(long)cnt; } for (j = 1, ++vp; j < p->n_vertices-1; ++j, ++vp) { v_idx = V_IDX(*vp, polylist->vl); cnt = (int)(long)edges[e_idx[v_idx]]; edges[e_idx[v_idx]+cnt--] = &vp[1]->pt; edges[e_idx[v_idx]+cnt--] = &vp[-1]->pt; if (cnt > 0) { edges[e_idx[v_idx]] = (void *)(long)cnt; } } v_idx = V_IDX(*vp, polylist->vl); cnt = (int)(long)edges[e_idx[v_idx]]; edges[e_idx[v_idx]+cnt--] = &p->v[0]->pt; edges[e_idx[v_idx]+cnt--] = &vp[-1]->pt; if (cnt > 0) { edges[e_idx[v_idx]] = (void *)(long)cnt; } } for (i = 0, vl = polylist->vl; i < polylist->n_verts; ++i, ++vl) { bool patch_end; Point3 patch_nu; HPt3Coord w = 0.0; int v_idx, j, k; v_idx = V_IDX(vl, polylist->vl); vl->vn.x = vl->vn.y = vl->vn.z = 0.0; if (fourd) { w = 1.0/vl->pt.w; } patch_nu.x = patch_nu.y = patch_nu.z = 0.0; patch_end = false; for (j = e_idx[v_idx]; j < e_idx[v_idx+1]; j += 2) { HPoint3 *swap; HPoint3 *p1, *p2; Point3 nu; HPt3Coord w1, w2; p1 = edges[j]; p2 = edges[j+1]; if (fourd) { #undef ANTI_4D #define ANTI_4D(P, Q) \ ((p1->P*w1 - vl->pt.P*w) * (p2->Q*w2 - vl->pt.Q*w) - \ (p1->Q*w1 - vl->pt.Q*w) * (p2->P*w2 - vl->pt.P*w)) w1 = 1.0/p1->w; w2 = 1.0/p2->w; nu.x = ANTI_4D(y,z); nu.y = ANTI_4D(z,x); nu.z = ANTI_4D(x,y); #undef ANTI_4D } else { #undef ANTI #define ANTI(P, Q) \ ((p1->P - vl->pt.P) * (p2->Q - vl->pt.Q) - \ (p1->Q - vl->pt.Q) * (p2->P - vl->pt.P)) nu.x = ANTI(y,z); nu.y = ANTI(z,x); nu.z = ANTI(x,y); #undef ANTI } Pt3Add(&patch_nu, &nu, &patch_nu); /* Try to find the next adjacent edges pair and give it the proper orientation. */ if (j+2 < e_idx[v_idx+1]) { if (edges[j+2] == edges[j+1]) { /* ok */ } else if (edges[j+3] == edges[j+1]) { swap = edges[j+2]; edges[j+2] = edges[j+3]; edges[j+3] = swap; } else { for (k = j + 4; k < e_idx[v_idx+1]; k += 2) { if (edges[k] == edges[j+1]) { swap = edges[j+2]; edges[j+2] = edges[k]; edges[k] = swap; swap = edges[j+3]; edges[j+3] = edges[k+1]; edges[k+1] = swap; break; } else if (edges[k+1] == edges[j+1]) { swap = edges[j+2]; edges[j+2] = edges[k+1]; edges[k+1] = swap; swap = edges[j+3]; edges[j+3] = edges[k]; edges[k] = swap; break; } } if (k >= e_idx[v_idx+1]) { patch_end = true; } } } else { patch_end = true; } if (patch_end) { /* try to match the orientation with the normal of the * previous patch-component (if any). */ if (fneg(Pt3Dot(&patch_nu, &vl->vn))) { Pt3Sub(&vl->vn, &patch_nu, &vl->vn); } else { Pt3Add(&vl->vn, &patch_nu, &vl->vn); } patch_nu.x = patch_nu.y = patch_nu.z = 0.0; patch_end = false; } } len = Pt3Length(&vl->vn); if(len > 0.0) { if(polylist->geomflags & PL_EVNORM) len = -len; Pt3Mul(1.0/len, &vl->vn, &vl->vn); } } OOGLFree(edges); OOGLFree(e_idx); #endif } polylist->geomflags |= need; return polylist; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/polylist/Makefile.am0000644000175000001440000000042010600311616016640 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libpolylist.la libpolylist_la_SOURCES = \ plbound.c plclass.c plcopy.c plcreate.c pldraw.c plevert.c plload.c plnormal.c plpick.c plsave.c plsphere.c pltransform.c \ polylist.h polylistP.h geomview-1.9.4/src/lib/gprim/polylist/Makefile.in0000644000175000001440000003740710665240504016700 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/polylist DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libpolylist_la_LIBADD = am_libpolylist_la_OBJECTS = plbound.lo plclass.lo plcopy.lo \ plcreate.lo pldraw.lo plevert.lo plload.lo plnormal.lo \ plpick.lo plsave.lo plsphere.lo pltransform.lo libpolylist_la_OBJECTS = $(am_libpolylist_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libpolylist_la_SOURCES) DIST_SOURCES = $(libpolylist_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libpolylist.la libpolylist_la_SOURCES = \ plbound.c plclass.c plcopy.c plcreate.c pldraw.c plevert.c plload.c plnormal.c plpick.c plsave.c plsphere.c pltransform.c \ polylist.h polylistP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/polylist/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/polylist/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libpolylist.la: $(libpolylist_la_OBJECTS) $(libpolylist_la_DEPENDENCIES) $(LINK) $(libpolylist_la_OBJECTS) $(libpolylist_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pldraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plevert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plnormal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pltransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/polylist/plsphere.c0000644000175000001440000001054110643673756016626 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "polylistP.h" #include "sphere.h" Geom *PolyListSphere(PolyList *p, Transform T, TransformN *TN, int *axes, int space) { int i; Sphere *sphere; if (p == NULL || p->n_verts == 0 || p->n_polys == 0) return NULL; if (TN) { HPointN *tmp = HPtNCreate(5, NULL); HPointN *spanPts[2*4]; HPoint3 spanPts3[2*4]; /* Create a dummy sphere, the center will be corrected later */ sphere = (Sphere *)GeomCreate("sphere", CR_CENTER, &p->vl[0].pt, CR_RADIUS, 0.0, CR_AXIS, T, CR_SPACE, space, CR_END); if(p->geomflags & VERT_4D) { for (i = 0; i < 2*4; i++) { spanPts[i] = HPtNCreate(5, NULL); Pt4ToHPtN(&p->vl[0].pt, spanPts[i]); } for (i = 1; i < p->n_verts; i++) { Pt4ToHPtN(&p->vl[i].pt, tmp); MaxDimensionalSpanHPtN(spanPts, tmp); } for (i = 0; i < 2*4; i++) { HPtNTransformComponents(TN, spanPts[i], axes, &spanPts3[i]); HPtNDelete(spanPts[i]); } SphereEncompassBoundsN(sphere, spanPts3, 4); for (i = 0; i < p->n_verts; i++) { Pt4ToHPtN(&p->vl[i].pt, tmp); SphereAddHPtN(sphere, tmp, NULL, TN, axes); } } else { for (i = 0; i < 2*4; i++) { spanPts[i] = HPtNCreate(5, NULL); HPt3ToHPtN(&p->vl[0].pt, NULL, spanPts[i]); } for (i = 0; i < p->n_verts; i++) { HPt3ToHPtN(&p->vl[i].pt, NULL, tmp); MaxDimensionalSpanHPtN(spanPts, tmp); } for (i = 0; i < 2*4; i++) { HPtNTransformComponents(TN, spanPts[i], axes, &spanPts3[i]); /*HPt3Dehomogenize(&spanPts3[i], &spanPts3[i]);*/ HPtNDelete(spanPts[i]); } SphereEncompassBoundsN(sphere, spanPts3, 4); for (i = 0; i < p->n_verts; i++) { HPt3ToHPtN(&p->vl[i].pt, NULL, tmp); SphereAddHPtN(sphere, tmp, NULL, TN, axes); } } HPtNDelete(tmp); } else { HPoint3 spanPts[6]; if(false && (p->geomflags & VERT_4D)) { /* 4d, but no 4d transform, act on x,y,z sub-space */ HPoint3 tmp; Pt4ToHPt3(&p->vl[0].pt, NULL, &tmp); sphere = (Sphere *)GeomCreate("sphere", CR_CENTER, &tmp, CR_RADIUS, 0.0, CR_AXIS, T, CR_SPACE, space, CR_END); /* For convenience (if not efficiency) assume all the vertices * are used */ for (i = 0; i < 6; i++) { Pt4ToHPt3(&p->vl[0].pt, NULL, &spanPts[i]); } for (i = 0; i < p->n_verts; i++) { Pt4ToHPt3(&p->vl[i].pt, NULL, &tmp); MaxDimensionalSpan(spanPts, &tmp); } HPt3TransformN(T, spanPts, spanPts, 6); SphereEncompassBounds(sphere, spanPts); for (i = 0; i < p->n_verts; i++) { Pt4ToHPt3(&p->vl[i].pt, NULL, &tmp); SphereAddHPt3(sphere, &tmp, T); } } else { sphere = (Sphere *)GeomCreate("sphere", CR_CENTER, &p->vl[0].pt, CR_RADIUS, 0.0, CR_AXIS, T, CR_SPACE, space, CR_END); /* For convenience (if not efficiency) assume all the vertices * are used */ for (i = 0; i < 6; i++) spanPts[i] = p->vl[0].pt; for (i = 0; i < p->n_verts; i++) MaxDimensionalSpan(spanPts, &p->vl[i].pt); HPt3TransformN(T, spanPts, spanPts, 6); SphereEncompassBounds(sphere, spanPts); for (i = 0; i < p->n_verts; i++) SphereAddHPt3(sphere, &p->vl[i].pt, T); } } return (Geom *)sphere; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/polylist/plcopy.c0000644000175000001440000000437410574525522016307 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/polylist/plcopy.c,v 1.6 2007/03/10 12:57:54 rotdrop Exp $ */ /* * Geometry object routines * * Copy a PolyList. */ #include "polylistP.h" PolyList *PolyListCopy(PolyList *polylist) { PolyList *newpl; Poly *newp; Vertex *newvl; int i, j; Poly *op, *np; if(polylist == NULL) return NULL; newvl = OOGLNewNE(Vertex, polylist->n_verts, "PolyList verts"); newp = OOGLNewNE(Poly, polylist->n_polys, "PolyList polygons"); newpl = OOGLNewE(PolyList, "PolyList"); *newpl = *polylist; newpl->p = newp; newpl->vl = newvl; memcpy(newvl, polylist->vl, polylist->n_verts * sizeof(Vertex)); memcpy(newp, polylist->p, polylist->n_polys * sizeof(Poly)); for(i = polylist->n_polys, op = polylist->p, np = newp; --i >= 0; op++, np++) { np->v = OOGLNewNE(Vertex *, op->n_vertices, "PolyList vert list"); for(j = op->n_vertices; --j >= 0; ) np->v[j] = &newvl[ op->v[j] - polylist->vl ]; } newpl->plproj = NULL; return newpl; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/polylist/pldraw.c0000644000175000001440000002260610613722707016266 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/polylist/pldraw.c,v 1.19 2007/04/25 19:02:31 rotdrop Exp $ */ /* * Draw a PolyList using mg library. */ #include #include "polylistP.h" #include "appearance.h" #include "mgP.h" /* need mgP.h (instead of mg.h) for _mgc below */ #include "cmodel.h" #include "hpointn.h" #include "bsptreeP.h" static void draw_projected_polylist(mgNDctx *NDctx, PolyList *pl) { PolyList *npl; HPointN *h; Poly *np; Vertex *ov, *nv; int i, j; bool colored = false, alpha = false; mgNDmapfunc mapHPtN = NDctx->mapHPtN; Appearance *ap = &_mgc->astk->ap; Material *mat = &_mgc->astk->mat; int normal_need; if (pl->plproj == NULL) { pl->plproj = (PolyList *)GeomCopy((Geom *)pl); ApDelete(pl->plproj->ap); } npl = pl->plproj; h = HPtNCreate(5, NULL); if (ap->flag & APF_KEEPCOLOR) { colored = false; } else { HPoint3 dummyv; ColorA dummyc; /* Dummy transform to determine whether we have ND colors or not */ colored = mapHPtN(NDctx, h, &dummyv, &dummyc) != 0; } /* Transform vertices */ npl->geomflags &= ~VERT_4D; for(i = 0, ov = pl->vl, nv = npl->vl; i < pl->n_verts; i++, ov++, nv++) { if (pl->geomflags & VERT_4D) { /* Set the point's first four components from our 4-D vertex */ Pt4ToHPtN(&ov->pt, h); } else { /* Set the point's first THREE components from our 4-D vertex */ HPt3ToHPtN(&ov->pt, NULL, h); } if (colored) { mapHPtN(NDctx, h, &nv->pt, &nv->vcol); if (nv->vcol.a < 1.0) { alpha = true; } } else { nv->vcol = ov->vcol; mapHPtN(NDctx, h, &nv->pt, NULL); } } if (colored) { if (alpha) { npl->geomflags |= COLOR_ALPHA; } else { npl->geomflags &= ~COLOR_ALPHA; } npl->geomflags &= ~PL_HASPCOL; npl->geomflags |= PL_HASVCOL; } else if (npl->geomflags & GEOM_COLOR) { colored = true; } /* The drawing routines might need either polygon or vertex normals, * so if either is missing and either might be needed, we force it * to be computed. */ npl->geomflags &= ~(PL_HASVN|PL_HASPN|PL_HASPFL); normal_need = (ap->flag & APF_NORMALDRAW) ? PL_HASPN|PL_HASVN : 0; if (ap->flag & APF_FACEDRAW) { switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: normal_need |= PL_HASPN; break; case APF_SMOOTH: normal_need |= PL_HASVN; break; default: break; } if (GeomHasAlpha((Geom *)npl, ap)) { normal_need |= PL_HASPFL|PL_HASPN; } } if (normal_need) { PolyListComputeNormals(npl, normal_need); } if ((_mgc->astk->flags & MGASTK_SHADER) && !(npl->geomflags & GEOM_ALPHA)) { ColorA *c = !colored || (mat->override & MTF_DIFFUSE) ? (ColorA *)&mat->diffuse : NULL; switch (ap->shading) { case APF_SMOOTH: for (i = 0, nv = npl->vl; i < npl->n_verts; i++, nv++) { (*_mgc->astk->shader)(1, &nv->pt, &nv->vn, c ? c : &nv->vcol, &nv->vcol); } npl->geomflags |= PL_HASVCOL; mgpolylist(npl->n_polys, npl->p, npl->n_verts, npl->vl, npl->geomflags); break; case APF_FLAT: for (i = 0, np = npl->p; i < npl->n_polys; i++, np++) { (*_mgc->astk->shader)(1, &np->v[0]->pt, &np->pn, c ? c : &np->pcol, &np->pcol); } npl->geomflags |= PL_HASPCOL; mgpolylist(npl->n_polys, npl->p, npl->n_verts, npl->vl, npl->geomflags); break; case APF_VCFLAT: for (i = 0, np = npl->p; i < npl->n_polys; i++, np++) { VARARRAY(V, HPoint3, np->n_vertices); VARARRAY(C, ColorA, np->n_vertices); for (j = 0; j < np->n_vertices; j++) { V[j] = np->v[j]->pt; C[j] = (npl->geomflags & PL_HASVCOL) ? np->v[j]->vcol : ((npl->geomflags & PL_HASPCOL) || c == NULL ? np->pcol : *c); (*_mgc->astk->shader)(1, &V[j], (Point3 *)&np->pn, &C[j], &C[j]); } mgpolygon(np->n_vertices, V, 1, &np->pn, np->n_vertices, C); } break; } } else { /* ordinary shading */ mgpolylist(npl->n_polys, npl->p, npl->n_verts, npl->vl, npl->geomflags); } /* Generate a BSP-tree if the object or parts of it might be * translucent. */ if (NDctx->bsptree && (npl->geomflags & GEOM_ALPHA)) { GeomNodeDataMove((Geom *)pl, (Geom *)npl); GeomBSPTree((Geom *)npl, NDctx->bsptree, BSPTREE_ADDGEOM); GeomNodeDataMove((Geom *)npl, (Geom *)pl); } HPtNDelete(h); } PolyList *PolyListDraw(PolyList *pl) { mgNDctx *NDctx = NULL; Appearance *ap = &_mgc->astk->ap; mgctxget(MG_NDCTX, &NDctx); if (NDctx) { draw_projected_polylist(NDctx, pl); return pl; } /* The drawing routines might need either polygon or vertex normals, * so if either is missing and either might be needed, we force it * to be computed. */ if ((pl->geomflags & (PL_HASVN|PL_HASPN|PL_HASPFL)) != (PL_HASVN|PL_HASPN|PL_HASPFL)) { int need = PL_HASPFL; if (ap->flag & APF_NORMALDRAW) { need |= PL_HASPN|PL_HASVN; } else if (ap->flag & APF_FACEDRAW) { switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: need |= PL_HASPN; break; case APF_SMOOTH: need |= PL_HASVN; break; default: break; } } if (need) { PolyListComputeNormals(pl, need); } } if (_mgc->space & TM_CONFORMAL_BALL) { cmodel_clear(_mgc->space); cm_read_polylist(pl); cmodel_draw(pl->geomflags); } else if (!(pl->geomflags & GEOM_ALPHA) && _mgc->astk->flags & MGASTK_SHADER) { /* * Software shading */ Poly *p; ColorA *c0 = (ColorA *)&_mgc->astk->mat.diffuse; ColorA pc, *nc = NULL, *savedc = NULL; int i, j; int flags = pl->geomflags; /* Smooth or facetted? */ switch (ap->shading) { case APF_SMOOTH: { Vertex *v; if (flags & PL_HASVCOL) { savedc = OOGLNewNE(ColorA, pl->n_verts, "saved colours"); } else if(flags & PL_HASPCOL) { /* Rats. We need vertex colors, but only face colors are * supplied. Associate a face with each vertex. */ p = pl->p; for(i = 0; i < pl->n_polys; i++, p++) for(j = p->n_vertices; --j >= 0; ) p->v[j]->vcol = p->pcol; c0 = &pc; } for (i = 0, nc = savedc, v = pl->vl; i < pl->n_verts; i++, v++) { if (savedc) { /* If we had per-vertex colors, save & use them */ *nc = v->vcol; (*_mgc->astk->shader)(1, &v->pt, &v->vn, nc, &v->vcol); nc++; } else { /* If no per-vertex colors, use material default */ if (flags & PL_HASPCOL) { pc = v->vcol; } (*_mgc->astk->shader)(1, &v->pt, &v->vn, c0, &v->vcol); } } mgpolylist(pl->n_polys, pl->p, pl->n_verts, pl->vl, flags|PL_HASVCOL); /* Restore colors if trashed */ if(savedc) { for(i = 0, v = pl->vl, nc = savedc; i < pl->n_verts; i++, v++) { v->vcol = *nc++; } OOGLFree(savedc); } break; } case APF_FLAT: if (flags & PL_HASPCOL) { nc = savedc = OOGLNewNE(ColorA, pl->n_polys, "saved colours"); } for (i = 0, p = pl->p; i < pl->n_polys; i++, p++) { if (savedc) { *nc = p->pcol; (*_mgc->astk->shader)(1, &p->v[0]->pt, (Point3 *)&p->pn, nc, &p->pcol); nc++; } else { (*_mgc->astk->shader)(1, &p->v[0]->pt, (Point3 *)&p->pn, flags & PL_HASVCOL ? &p->v[0]->vcol : c0, &p->pcol); } } mgpolylist(pl->n_polys, pl->p, pl->n_verts, pl->vl, flags|PL_HASPCOL); /* Restore colors if trashed */ if (savedc) { for (i = 0, p = pl->p, nc = savedc; i < pl->n_polys; i++, p++) { p->pcol = *nc++; } OOGLFree(savedc); } break; case APF_VCFLAT: for (i = 0, p = pl->p; i < pl->n_polys; i++, p++) { VARARRAY(V, HPoint3, p->n_vertices); VARARRAY(C, ColorA, p->n_vertices); for (j = 0; j < p->n_vertices; j++) { V[j] = p->v[j]->pt; C[j] = (flags & PL_HASVCOL) ? p->v[j]->vcol : ((flags & PL_HASPCOL) ? p->pcol : *c0); (*_mgc->astk->shader)(1, &V[j], (Point3 *)&p->pn, &C[j], &C[j]); } mgpolygon(p->n_vertices, V, 1, &p->pn, p->n_vertices, C); } break; } } else { /* * Ordinary shading */ mgpolylist(pl->n_polys, pl->p, pl->n_verts, pl->vl, pl->geomflags); } return pl; } PolyList *PolyListBSPTree(PolyList *pl, BSPTree *tree, int action) { if (!never_translucent((Geom *)pl) && action == BSPTREE_ADDGEOM) { BSPTreeAddObject(tree, (Geom *)pl); } return pl; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/polylist/pltransform.c0000644000175000001440000000357410564221646017350 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "point3.h" #include "polylistP.h" PolyList *PolyListTransform(PolyList *p, Transform T, TransformN *TN) { int i; if (!T) { return p; } for (i = 0; i < p->n_verts; i++) { HPt3Transform(T, &p->vl[i].pt, &p->vl[i].pt); } if (p->geomflags & (PL_HASVN|PL_HASPN)) { Transform Tit; TmDual(T, Tit); if (p->geomflags & PL_HASVN) { for (i = 0; i < p->n_verts; i++) { NormalTransform(Tit, &p->vl[i].vn, &p->vl[i].vn); } } if (p->geomflags & PL_HASPN) { for (i = 0; i < p->n_polys; i++) { NormalTransform(T, &p->p[i].pn, &p->p[i].pn); } } } return p; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/polylist/plevert.c0000644000175000001440000000410010563124453016441 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/polylist/plevert.c,v 1.7 2007/02/09 17:02:35 rotdrop Exp $ */ /* $Source: /cvsroot/geomview/geomview/src/lib/gprim/polylist/plevert.c,v $ */ /* * Evert all the normals in a polylist. */ #include "polylistP.h" PolyList * PolyListEvert( PolyList *polylist ) { Poly *p; Vertex *v; int i; polylist->geomflags ^= PL_EVNORM; if ((polylist->geomflags & (PL_HASVN|PL_HASPN)) == 0) { PolyListComputeNormals(polylist, PL_HASVN|PL_HASPN|PL_HASPFL); } else { i = polylist->n_polys; for (p = polylist->p; --i >= 0; p++) { p->pn.x = -p->pn.x; p->pn.y = -p->pn.y; p->pn.z = -p->pn.z; } i = polylist->n_verts; for (v = polylist->vl; --i >= 0; v++) { v->vn.x = -v->vn.x; v->vn.y = -v->vn.y; v->vn.z = -v->vn.z; } } return (polylist); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/polylist/polylistP.h0000644000175000001440000000571210653722144016777 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef POLYLISTPDEFS #define POLYLISTPDEFS /* * Private definitions for PolyList's */ #include "bboxP.h" #include "polylist.h" #include "bsptree.h" #define PLMAGIC GeomMagic ('p', 1) typedef struct Vertex { HPoint3 pt; ColorA vcol; Point3 vn; TxST st; } Vertex; typedef struct Poly { int n_vertices; Vertex **v; ColorA pcol; Point3 pn; /* average normal */ int flags; /* the flags below are valid if PL_HASPFL is set */ } Poly; struct PolyList { GEOMFIELDS; int n_polys; int n_verts; Poly *p; Vertex *vl; PolyList *plproj; /* Projected list during ND-drawing. The idea is * to get rid of alloca() and not to have to * regenerated the connectivity structure all the * time. */ # define PL_HASVN VERT_N /* Per-vertex normals (vn) valid */ # define PL_HASVCOL VERT_C /* Per-vertex colors (vcol) valid */ # define PL_HASST VERT_ST /* Has s,t texture coords */ # define PL_HASPCOL FACET_C /* Per-polygon colors (pcol) valid */ # define PL_HASPN GEOMFLAG(0x01) /* Per-polygon normals (pn) valid */ # define PL_EVNORM GEOMFLAG(0x04) /* Normals are everted */ # define PL_HASPFL GEOMFLAG(0x08) /* Has per-poly flags */ /* For 4-D points, see geomflags & VERT_4D */ }; extern PolyList *PolyListCreate(PolyList *exist, GeomClass *Class, va_list *a_list); extern PolyList *PolyListCopy( PolyList *poly ); extern PolyList *PolyListDelete( PolyList *poly ); extern PolyList *PolyListPick( PolyList *, Pick *, Appearance *, Transform T, TransformN *TN, int *axes ); extern GeomClass *PolyListMethods(); extern PolyList *PolyListComputeNormals(PolyList *polyList, int flags_needed); extern void PolyNormal(Poly *p, Point3 *nu_av, int fourd, int evert, int *flagsp, int *first_concave); extern PolyList *PolyListBSPTree(PolyList *poly, BSPTree *bsptree, int action); #endif /*POLYLISTPDEFS*/ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/polylist/plload.c0000644000175000001440000001514410653722144016246 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Load a PolyList object from an "off"-format file. * */ #include #include #include "polylistP.h" #define SIZEOF_CMAP 256 static ColorA *colormap; static void LoadCmap(char *file) { IOBFILE *fp; colormap = OOGLNewNE(ColorA, 256, "PolyList colormap"); if((file = findfile(NULL, file)) != NULL && (fp = iobfopen(file,"r")) != NULL) { iobfgetnf(fp, SIZEOF_CMAP*4, (float *)colormap, 0); iobfclose(fp); } } PolyList * PolyListFLoad(IOBFILE *file, char *fname) { PolyList *pl; int edges; int i; char *token; Vertex *v; int binary = 0; int preread = 0; int headerseen = 0; int flags = 0; bool makenorm = false; int dimn = 3; static ColorA black = { 0,0,0,0 }; if (file == NULL) return NULL; token = GeomToken(file); if(strncmp(token, "ST", 2) == 0) { flags |= PL_HASST; token += 2; } if(*token == 'C') { flags |= PL_HASVCOL; /* Per-vertex colors */ token++; } if(*token == 'N') { flags |= PL_HASVN; /* Per-vertex normals */ token++; } if(*token == '4') { dimn = 4; token++; } if(*token == 'S') { /* "smooth surface": we compute vtx normals */ makenorm = true; token++; } if(strcmp(token, "OFF") == 0) { headerseen = 1; if(iobfnextc(file, 1) == 'B' && iobfexpectstr(file, "BINARY") == 0) { binary = 1; if(iobfnextc(file, 1) != '\n') /* Expect \n after BINARY */ return NULL; (void) iobfgetc(file); /* Toss \n */ } } else { /* Hack, in case first token was a number */ if(dimn == 4) token--; preread = strtol(token, &token, 10); if(*token != '\0') return NULL; /* May be a header-less OFF */ flags = 0; dimn = 3; } pl = OOGLNewE(PolyList, "PolyListFLoad PolyList"); GGeomInit(pl, PolyListMethods(), PLMAGIC, NULL); pl->p = NULL; pl->vl = NULL; pl->n_verts = preread; /* In case prefetched token was our vert count */ pl->geomflags = flags | ((dimn == 4) ? VERT_4D : 0); pl->pdim = 4; pl->plproj = NULL; if((!preread && iobfgetni(file, 1, &pl->n_verts, binary) <= 0) || iobfgetni(file, 1, &pl->n_polys, binary) <= 0 || iobfgetni(file, 1, &edges, binary) <= 0) { if(headerseen) OOGLSyntax(file, "PolyList %s: Bad vertex/face/edge counts", fname); goto bogus; } pl->vl = OOGLNewNE(Vertex, pl->n_verts, "PolyListFLoad vertices"); for(v = pl->vl, i = 0; i < pl->n_verts; v++, i++) { if((iobfgetnf(file, dimn, (float *)&v->pt, binary) < dimn) || (flags & PL_HASVN && iobfgetnf(file, 3, (float *)&v->vn, binary) < 3) || (flags & PL_HASVCOL && iobfgetnf(file, 4, (float *)&v->vcol, binary) < 4) || (flags & PL_HASST && iobfgetnf(file, 2, (float *)&v->st, binary) < 2) ) { OOGLSyntax(file, "PolyList %s: Bad vertex %d (of %d)", fname, i, pl->n_verts); goto bogus; } if (dimn == 3) v->pt.w = 1.0; if ((flags & PL_HASVCOL) && v->vcol.a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } pl->p = OOGLNewNE(Poly, pl->n_polys, "PolyListFLoad polygons"); for(i = 0; i < pl->n_polys; ) { Poly *p; int k,index; p = &pl->p[i]; if(iobfgetni(file, 1, &p->n_vertices, binary) <= 0 || p->n_vertices <= 0) { OOGLSyntax(file, "PolyList %s: bad %d'th polygon (of %d)", fname, i, pl->n_polys); goto bogus_face; } p->v = OOGLNewNE(Vertex *, p->n_vertices, "PolyListFLoad polygon"); i++; for(k = 0; k < p->n_vertices; k++) { int index; if(iobfgetni(file, 1, &index, binary) <= 0 || index < 0 || index >= pl->n_verts) { OOGLSyntax(file, "PolyList: %s: bad index %d on %d'th polygon (of %d)", fname, index, i, p->n_vertices); goto bogus_face; } p->v[k] = &pl->vl[index]; } /* Pick up the color, if any. * In ASCII format, take whatever's left before end-of-line * (or end-of-file, or close-brace) */ p->pcol = black; if(binary) { int ncol; if(iobfgetni(file, 1, &ncol, 1) <= 0 || iobfgetnf(file, ncol, (float *)&p->pcol, 1) < ncol) goto bogus_face_color; k = ncol; } else { int c; for(k = 0; k < 4 && (c = iobfnextc(file, 1)) != '\n' && c!='}' && c!=EOF; k++) { if(iobfgetnf(file, 1, ((float *)(&p->pcol))+k, 0) < 1) { goto bogus_face_color; } } } if(true || (flags & PL_HASVCOL) == 0) { if(k > 0) pl->geomflags |= PL_HASPCOL; if(k != 1 && (p->pcol.r>1||p->pcol.g>1||p->pcol.b>1||p->pcol.a>1)) { p->pcol.r /= 255, p->pcol.g /= 255, p->pcol.b /= 255, p->pcol.a /= 255; } switch(k) { case 0: p->pcol.r = 170/255.0; /* Gray */ p->pcol.g = p->pcol.r; case 2: p->pcol.b = p->pcol.g; case 3: p->pcol.a = 170/255.0; /* Semitransparent */ break; case 1: /* use colormap */ if ( colormap == NULL ) LoadCmap("cmap.fmap"); index = p->pcol.r; if((unsigned)index >= SIZEOF_CMAP) index = 0; p->pcol = colormap[index]; } /* case 4, all components supplied */ } if ((pl->geomflags & PL_HASPCOL) && p->pcol.a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } if(makenorm && !(flags & PL_HASVN)) { pl->geomflags |= PL_HASVN; /* ???? where ???? */ } return pl; bogus_face_color: OOGLSyntax(file, "PolyList %s: bad face color on face %d (of %d)", fname, i, pl->n_polys); bogus_face: pl->n_polys = i; bogus: GeomDelete((Geom *)pl); return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/polylist/plpick.c0000644000175000001440000000715310523143230016243 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, * Celeste Fowler */ #include #include "ooglutil.h" #include "polylistP.h" #include "point3.h" #include "hpoint3.h" #include "polyint.h" #include "pickP.h" #include "appearance.h" PolyList * PolyListPick(PolyList *pl, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { int i; vvec plist; int fi, vi, ok, found = -1, v4d; Poly *poly; unsigned int apflag = 0; /* Make sure that vects do not count as visible - otherwise they * will wreak havoc with the edge picking stuff. */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_VECTDRAW; } v4d = (pl->geomflags & VERT_4D) != 0; VVINIT(plist, Point3, 0); found = -1; for (fi=0, poly=pl->p; fin_polys; ++fi, ++poly) { vvneeds(&plist, poly->n_vertices); ok = 0; if (TN) { for (vi=0; vin_vertices; vi++) { if (0 < HPt3NTransPt3(TN, axes, &poly->v[vi]->pt, v4d, VVINDEX(plist, Point3, vi))) ok = 1; } } else { for (vi=0; vin_vertices; vi++) { if (0 < HPt3TransPt3(T, &poly->v[vi]->pt, VVINDEX(plist, Point3, vi))) ok = 1; } } if (ok && PickFace(poly->n_vertices, VVINDEX(plist, Point3, 0), p, ap)) found = fi; } vvfree(&plist); if (ap != NULL) ap->flag = apflag; if (found == -1) return NULL; if (p->found & PW_VERT) { p->vi = pl->p[found].v[p->vi] - pl->vl; if (TN) HPt3NTransHPt3(TN, axes, &pl->vl[p->vi].pt, v4d, &p->v); else HPt3Transform(T, &pl->vl[p->vi].pt, &p->v); } if (p->found & PW_EDGE) { p->ei[0] = pl->p[found].v[p->ei[0]] - pl->vl; p->ei[1] = pl->p[found].v[p->ei[1]] - pl->vl; if (TN) { HPt3NTransHPt3(TN, axes, &pl->vl[p->ei[0]].pt, v4d, &p->e[0]); HPt3NTransHPt3(TN, axes, &pl->vl[p->ei[1]].pt, v4d, &p->e[1]); } else { HPt3Transform(T, &pl->vl[p->ei[0]].pt, &p->e[0]); HPt3Transform(T, &pl->vl[p->ei[1]].pt, &p->e[1]); } } if (p->found & PW_FACE) { if(p->f) OOGLFree(p->f); p->f = OOGLNewNE(HPoint3, p->fn, "PolyList pick"); if (TN) { for (i = 0; i < p->fn; i++) HPt3NTransHPt3(TN, axes, &pl->p[found].v[i]->pt, v4d, &p->f[i]); } else { for (i = 0; i < p->fn; i++) HPt3Transform(T, &pl->p[found].v[i]->pt, &p->f[i]); } p->fi = found; } if (TN) { p->TprimN = TmNCopy(TN, p->TprimN); memcpy(p->axes, axes, sizeof(p->axes)); } else TmCopy(T, p->Tprim); return pl; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/polylist/Headers0000644000175000001440000000002707730237460016123 00000000000000polylist.h polylistP.h geomview-1.9.4/src/lib/gprim/polylist/plsave.c0000644000175000001440000000560010577535006016265 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Save a PolyList (in .off format). */ #include "polylistP.h" PolyList * PolyListFSave(polylist, outf, fname) PolyList *polylist; /* Thing to save */ FILE *outf; /* Stream to save it on */ char *fname; /* File name for error msgs */ { int i, n; Poly *p; Vertex **vp, *v; /* We don't really know the number of edges and it's a pain to count. * Assume Euler number 2. */ fprintf(outf, "%s%s%s%sOFF\n%d %d %d\n", &"ST"[polylist->geomflags & PL_HASST ? 0 : 2], &"C"[polylist->geomflags & PL_HASVCOL ? 0 : 1], &"N"[polylist->geomflags & PL_HASVN ? 0 : 1], &"4"[polylist->geomflags & VERT_4D ? 0 : 1], polylist->n_verts, polylist->n_polys, polylist->n_verts + polylist->n_polys - 2); for(i = polylist->n_verts, v = polylist->vl; --i >= 0; v++) { if (polylist->geomflags & VERT_4D) fprintf(outf, "\n%.8g %.8g %.8g %.8g", v->pt.x, v->pt.y, v->pt.z, v->pt.w); else fprintf(outf, "\n%.8g %.8g %.8g", v->pt.x, v->pt.y, v->pt.z); if(polylist->geomflags & PL_HASVN) fprintf(outf, " %.8g %.8g %.8g", v->vn.x, v->vn.y, v->vn.z); if(polylist->geomflags & PL_HASVCOL) fprintf(outf, " %g %g %g %g", v->vcol.r, v->vcol.g, v->vcol.b, v->vcol.a); if(polylist->geomflags & PL_HASST) fprintf(outf, " %.8g %.8g", v->st.s, v->st.t); } fputc('\n', outf); for(i = polylist->n_polys, p = polylist->p; --i >= 0; p++) { n = p->n_vertices; fprintf(outf, "\n%d ", n); for(vp = p->v; --n >= 0; vp++) fprintf(outf, " %d", (int)((*vp) - polylist->vl)); if((polylist->geomflags & (PL_HASPCOL|PL_HASVCOL)) == PL_HASPCOL) { fprintf(outf, "\t%g %g %g %g", p->pcol.r, p->pcol.g, p->pcol.b, p->pcol.a); } } fputc('\n', outf); return (ferror(outf) ? NULL : polylist); } geomview-1.9.4/src/lib/gprim/npolylist/0000777000175000001440000000000010665240674015072 500000000000000geomview-1.9.4/src/lib/gprim/npolylist/nplpick.c0000644000175000001440000000614110536061375016610 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include "ooglutil.h" #include "npolylistP.h" #include "point3.h" #include "hpoint3.h" #include "polyint.h" #include "pickP.h" #include "appearance.h" NPolyList * NPolyListPick(NPolyList *pl, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes) { int i; vvec plist; int fi, vi, ok, found = -1; Poly *poly; unsigned int apflag = 0; HPointN ptN[1]; if (!TN) return NULL; /* no 3d pick for ND object. */ /* we have full-featured ND-points here. */ ptN->flags = 0; ptN->dim = pl->pdim; /* Make sure that vects do not count as visible - otherwise they * will wreak havoc with the edge picking stuff. */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_VECTDRAW; } VVINIT(plist, Point3, 0); found = -1; for (fi = 0, poly = pl->p; fi < pl->n_polys; ++fi, ++poly) { int *idx = pl->vi + pl->pv[fi]; vvneeds(&plist, poly->n_vertices); ok = 0; for (vi= 0 ; vi < poly->n_vertices; vi++) { ptN->v = pl->v + idx[vi]*pl->pdim; if (0 < HPtNNTransPt3(TN, axes, ptN, VVINDEX(plist, Point3, vi))) ok = 1; } if (ok && PickFace(poly->n_vertices, VVINDEX(plist, Point3, 0), p, ap)) found = fi; } vvfree(&plist); if (ap != NULL) ap->flag = apflag; if (found == -1) return NULL; if (p->found & PW_VERT) { p->vi = pl->vi[pl->pv[found]+p->vi]; ptN->v = pl->v + p->vi*pl->pdim; HPtNTransformComponents(TN, ptN, axes, &p->v); } if (p->found & PW_EDGE) { p->ei[0] = pl->vi[pl->pv[found]+p->ei[0]]; p->ei[1] = pl->vi[pl->pv[found]+p->ei[1]]; ptN->v = pl->v + p->ei[0]*pl->pdim; HPtNTransformComponents(TN, ptN, axes, &p->e[0]); ptN->v = pl->v + p->ei[1]*pl->pdim; HPtNTransformComponents(TN, ptN, axes, &p->e[1]); } if (p->found & PW_FACE) { if(p->f) OOGLFree(p->f); p->f = OOGLNewNE(HPoint3, p->fn, "PolyList pick"); for (i = 0; i < p->fn; i++) { ptN->v = pl->v + pl->vi[pl->pv[found]+i]*pl->pdim; HPtNTransformComponents(TN, ptN, axes, &p->f[i]); } p->fi = found; } if (TN) { p->TprimN = TmNCopy(TN, p->TprimN); memcpy(p->axes, axes, sizeof(p->axes)); } else TmCopy(T, p->Tprim); return pl; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/npolylist/nplsave.c0000644000175000001440000000625710577535006016632 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Claus-Justus Heine */ /* * Save a NPolyList (in .off format). */ #include "npolylistP.h" NPolyList * NPolyListFSave(NPolyList *pl, FILE *outf, char *fname) { int i, k; HPtNCoord *v; ColorA *c; /* We don't really know the number of edges and it's a pain to count. * Assume Euler number 2. */ if (pl->pdim == 4) { fprintf(outf, "%s%s%sOFF\n%d %d %d\n", pl->geomflags & PL_HASST ? "ST" : "", pl->geomflags & PL_HASVCOL ? "C" : "", pl->geomflags & VERT_4D ? "4" : "", pl->n_verts, pl->n_polys, 0); } else { fprintf(outf, "%s%s%snOFF %d\n%d %d %d\n", pl->geomflags & PL_HASST ? "ST" : "", pl->geomflags & PL_HASVCOL ? "C" : "", pl->geomflags & VERT_4D ? "4" : "", pl->pdim - 1, pl->n_verts, pl->n_polys, 0); } for(i = 0, v = pl->v, c = pl->vcol; i < pl->n_verts; ++i, ++c) { if(pl->geomflags & VERT_4D) { if (pl->pdim == 4) { float denom = *v++; for(k = pl->pdim-1; --k >= 0; ) { fprintf(outf, "%.8g ", *v++); } fprintf(outf, "%.8g ", denom); } else { for(k = pl->pdim; --k >= 0; ) fprintf(outf, "%.8g ", *v++); } } else { float denom = *v++; for(k = pl->pdim; --k > 0; ) fprintf(outf, "%.8g ", *v++/denom); } if(pl->geomflags & PL_HASVCOL) { fprintf(outf, " %.8g %.8g %.8g %.8g", c->r, c->g, c->b, c->a); } if (pl->geomflags & PL_HASST) { fprintf(outf, " %.8g %.8g", pl->vl[i].st.s, pl->vl[i].st.t); } fputc('\n', outf); } fputc('\n', outf); for(i = 0; i < pl->n_polys; i++) { Poly *p = &pl->p[i]; fprintf(outf, "\n%d ", p->n_vertices); for(k = 0; k < p->n_vertices; k++) fprintf(outf, " %d", pl->vi[pl->pv[i] + k]); if((pl->geomflags & (PL_HASPCOL|PL_HASVCOL)) == PL_HASPCOL) { fprintf(outf, "\t%.8g %.8g %.8g %.8g", p->pcol.r, p->pcol.g, p->pcol.b, p->pcol.a); } } fputc('\n', outf); return (ferror(outf) ? NULL : pl); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: * */ geomview-1.9.4/src/lib/gprim/npolylist/npolylistP.h0000644000175000001440000000466710560435556017350 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef NPOLYLISTPDEFS #define NPOLYLISTPDEFS /* * Private definitions for PolyList's */ #include "geom.h" #include "bboxP.h" #include "polylistP.h" #include "npolylist.h" #define NPLMAGIC GeomMagic ('P', 1) struct NPolyList { GEOMFIELDS; int n_polys; int n_verts; int *vi; /* array of vertex indices (all faces) */ int nvi; /* room allocated for vertex indices */ int *pv; /* start index for each poly into vi */ HPtNCoord *v; /* v[n_verts][pdim] */ ColorA *vcol; /* per vertex colors */ Poly *p; /* list of polygons, including projected vertices * when drawing the list. */ Vertex *vl; /* 3d vertex definitions, including texture * coordinates and per vertex colors, * projected vertices and normals when * drawing. */ }; #define NPL_HASVLVCOL GEOMFLAG(0x8000) /* pl->vl[i].vcol is uptodate */ extern NPolyList *NPolyListCreate(NPolyList *exist, GeomClass *Class, va_list *a_list); extern NPolyList *NPolyListCopy( NPolyList *poly ); extern NPolyList *NPolyListDelete( NPolyList *poly ); extern NPolyList *NPolyListTransform(NPolyList *np, Transform T, TransformN *TN); extern Geom *NPolyListSphere(NPolyList *npl, Transform T, TransformN *TN, int *axes, int space); extern GeomClass *NPolyListMethods(); #endif/*NPOLYLISTPDEFS*/ /* * Local Variables: *** * c-basic-offset: 2 *** * End: * */ geomview-1.9.4/src/lib/gprim/npolylist/nplbound.c0000644000175000001440000000655310517010216016763 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Geometry Routines * * Geometry Supercomputer Project * * ROUTINE DESCRIPTION: Return the bounding box of a polylist. * * if T != NULL then we act only on the 3d sub-space of the first 3 * components. */ #include "npolylistP.h" BBox *NPolyListBound(NPolyList *np, Transform T, TransformN *TN) { BBox *result; int n, pdim; HPoint3 min, max, tmp, clean; HPointN ptN[1]; n = np->n_verts; pdim = np->pdim; ptN->v = np->v; ptN->dim = pdim; /* First handle the case without transformations, this means that we * return an Nd bbox. */ if (!T && !TN) { HPointN *min = HPtNCreate(pdim, np->v); HPointN *max; HPtNDehomogenize(min, min); max = HPtNCopy(min, NULL); while(--n > 0) { ptN->v += pdim; HPtNMinMax(min, max, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, min, CR_NMAX, max, CR_END); HPtNDelete(min); HPtNDelete(max); return result; } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *minN; HPointN *maxN; HPointN *clean; BBox *result; minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); clean = HPtNCreate(np->pdim, NULL); while(--n > 0) { ptN->v += pdim; HPtNTransform(TN, ptN, clean); HPtNMinMax(minN, maxN, clean); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(minN); HPtNDelete(maxN); HPtNDelete(clean); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform */ HPtNToHPt3(ptN, NULL, &min); HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { ptN->v += pdim; HPtNToHPt3(ptN, NULL, &tmp); HPt3Transform(T, &tmp, &clean); HPt3Dehomogenize(&clean, &clean); Pt3MinMax(&min, &max, &clean); } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/npolylist/npltransform.c0000644000175000001440000000260510510666536017700 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif /* N-transform of an NPolylist */ #include "npolylistP.h" NPolyList *NPolyListTransform(NPolyList *np, Transform dummy, TransformN *T) { if (T != NULL && T != (void *)TM_IDENTITY) { HPointN *tmp = HPtNCreate(np->pdim, NULL); float *tmp_data = tmp->v; int i; for (tmp->v = np->v, i = 0; i < np->n_verts; i++, tmp->v += np->pdim) { HPtNTransform(T, tmp, tmp); } tmp->v = tmp_data; HPtNDelete(tmp); } return np; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/npolylist/nplclass.c0000644000175000001440000000612210563130775016767 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/npolylist/nplclass.c,v 1.9 2007/02/09 17:40:13 rotdrop Exp $ */ /* * Initialize the PolyList class record. */ #include "npolylistP.h" static GeomClass *aNPolyListMethods = NULL; extern NPolyList *NPolyListDraw(NPolyList *); extern NPolyList *NPolyListCreate(NPolyList *exist, GeomClass *classp, va_list *a_list); extern NPolyList *NPolyListCopy(NPolyList *); extern NPolyList *NPolyListFSave(NPolyList *, FILE *outf, char *fname); extern NPolyList *NPolyListDelete(NPolyList *); extern NPolyList *NPolyListPick(NPolyList *pl, Pick *p, Appearance *ap, Transform T, TransformN *TN, int *axes); extern NPolyList *NPolyListBSPTree(NPolyList *mesh, BSPTree *tree, int action); int NPolyListPresent = 1; static char npolylistName[] = "npolylist"; char * NPolyListName() { return npolylistName; } GeomClass *NPolyListMethods(void) { if (!aNPolyListMethods) { aNPolyListMethods = GeomClassCreate(npolylistName); aNPolyListMethods->name = (GeomNameFunc *) NPolyListName; aNPolyListMethods->methods = (GeomMethodsFunc *) NPolyListMethods; aNPolyListMethods->draw = (GeomDrawFunc *) NPolyListDraw; aNPolyListMethods->bsptree = (GeomBSPTreeFunc *) NPolyListBSPTree; aNPolyListMethods->bound = (GeomBoundFunc *) NPolyListBound; aNPolyListMethods->boundsphere = (GeomBoundSphereFunc *) NPolyListSphere; aNPolyListMethods->create = (GeomCreateFunc *) NPolyListCreate; aNPolyListMethods->copy = (GeomCopyFunc *) NPolyListCopy; aNPolyListMethods->fsave = (GeomFSaveFunc *) NPolyListFSave; aNPolyListMethods->Delete = (GeomDeleteFunc *) NPolyListDelete; aNPolyListMethods->fload = (GeomFLoadFunc *) NPolyListFLoad; aNPolyListMethods->transform = (GeomTransformFunc *) NPolyListTransform; aNPolyListMethods->transformto = (GeomTransformToFunc *) NPolyListTransform; aNPolyListMethods->pick = (GeomPickFunc *) NPolyListPick; } return aNPolyListMethods; } geomview-1.9.4/src/lib/gprim/npolylist/nplcreate.c0000644000175000001440000001514510624074213017122 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * NPolyList creation, editing, and deletion. */ #include "npolylistP.h" /* * Free a NPolyList. */ #include "npolylistP.h" NPolyList * NPolyListDelete( NPolyList *np ) { if (np == NULL) return NULL; OOGLFree(np->vi); OOGLFree(np->pv); OOGLFree(np->v); OOGLFree(np->vcol); OOGLFree(np->p[0].v); OOGLFree(np->p); OOGLFree(np->vl); np->vi = NULL; np->pv = NULL; np->v = NULL; np->vcol = NULL; np->p = NULL; np->vl = NULL; return NULL; } NPolyList * NPolyListCreate(NPolyList *exist, GeomClass *classp, va_list *a_list) { NPolyList *pl; int *nvertperpol=NULL, *verts=NULL; int npolyflag=0, nvertflag=0, vertflag=0, pointflag=0, pointhomog = 0; float *v = NULL; ColorA *vc = NULL, *pc = NULL; int attr, copy=1; int numentries=0, numvertices=0; int i; int j,k=0; if (exist == NULL) { pl = OOGLNewE(NPolyList,"NPolyListCreate npolylist"); memset(pl, 0, sizeof(NPolyList)); GGeomInit(pl, classp, NPLMAGIC, NULL); pl->pdim = 4; /* 3-D plus homogeneous component */ } else { pl = exist; } while ((attr = va_arg(*a_list, int))) switch (attr) { case CR_NOCOPY: OOGLError(0,"Note: NOCOPY option not used by NPolyListCreate()"); break; case CR_FLAG: pl->geomflags = va_arg(*a_list, int); break; case CR_NPOLY: pl->n_polys = va_arg(*a_list, int); npolyflag = 1; break; case CR_NVERT: /* number of verts of each polygon */ nvertperpol = va_arg(*a_list, int*); nvertflag = 1; break; case CR_VERT: /* indices of all verts of all polygons, concatenated */ /* verts[] contains sum(nvertperpol[]) elements */ verts = va_arg(*a_list, int*); vertflag = 1; break; case CR_DIM: pl->pdim = va_arg(*a_list, int) + 1; break; case CR_POINT4: /* CR_POINT4, */ pointhomog = 1; /* Fall into CR_POINT */ case CR_POINT: /* CR_POINT, */ v = va_arg(*a_list, HPtNCoord *); pointflag = 1; break; case CR_COLOR: /* CR_COLOR, geomflags &= ~COLOR_ALPHA; vc = va_arg(*a_list, ColorA *); if (vc) { pl->geomflags |= PL_HASVCOL; } break; case CR_POLYCOLOR: pl->geomflags &= ~COLOR_ALPHA; pc = va_arg(*a_list, ColorA *); if (pc) { pl->geomflags |= PL_HASPCOL; } break; default: if (GeomDecorate(pl, ©, attr, a_list)) { OOGLError(0,"Undefined PolyList option: %d", attr); if (!exist) GeomDelete((Geom *)pl); return NULL; } } if (!exist && (!npolyflag || !nvertflag || !vertflag || !pointflag)) { if (!npolyflag) OOGLError(0,"Must specify number of polygons"); if (!nvertflag) OOGLError(0,"Must specify NVERT array"); if (!vertflag) OOGLError(0,"Must specify VERT array"); if (!pointflag) OOGLError(0,"Must specify vertices"); if (pl->pdim < 5)OOGLError(0, "Dimension %d too small, " "please use ordinary OFF format", pl->pdim-1); GeomDelete((Geom *)pl); return NULL; } if(nvertflag && vertflag) { numentries = 0; for (i=0; in_polys; i++) { numentries += nvertperpol[i]; } for (i=0; i numvertices) { numvertices = verts[i]; } } pl->n_verts = numvertices + 1; if(pl->v) { OOGLFree(pl->v); } pl->v = OOGLNewNE(HPtNCoord, pl->n_verts * pl->pdim, "polylist vertices"); if (pl->vl) { OOGLFree(pl->vl); } pl->vl = OOGLNewNE(Vertex, pl->n_verts, "polylist vertex info"); } if(pointflag) { /* if dimn == 3, copy over into 4-vector area and add a '1' in * the 4th coordinate */ if (pointhomog) { memcpy(pl->v, v, pl->pdim*pl->n_verts*sizeof(HPtNCoord)); } else { float *pv; for(i = pl->n_verts, pv = pl->v; --i >= 0; ) { *pv++ = 1.0; /* Add homogenous '1' */ for(j = 1; j < pl->pdim; j++) *pv++ = *v++; } } } if(npolyflag) { if(pl->p) { if (pl->p[0].v) { OOGLFree(pl->p[0].v); } OOGLFree(pl->p); } pl->p = OOGLNewNE(Poly, pl->n_polys, "nPolyListCreate polygons"); if (pl->pv) { OOGLFree(pl->pv); } pl->pv = OOGLNewNE(int, pl->n_polys, "nPolyListCreate polygon verts"); } if(nvertflag && vertflag) { Vertex **vp; k = 0; for (i=0; in_polys; i++) { pl->pv[i] = k; k += (pl->p[i].n_vertices = nvertperpol[i]); } if(pl->vi) { OOGLFree(pl->vi); } pl->vi = OOGLNewNE(int, numentries, "nPolyListCreate vertex indices"); pl->nvi = k; memcpy(pl->vi, verts, k*sizeof(int)); /* Also update the connectivity info stored in pl->p[] */ vp = OOGLNewNE(Vertex *, numentries, "nPolyListCreate connectivity"); for (i = 0; i < pl->n_polys; i++) { Poly *p = &pl->p[i]; p->v = vp; vp += p->n_vertices; for (k = 0; k < p->n_vertices; k++) { p->v[k] = &pl->vl[pl->vi[pl->pv[i]+k]]; } } } if(vc) { for (i = 0; i < pl->n_verts; i++) { pl->vcol[i] = pl->vl[i].vcol = vc[i]; if (vc[i].a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } pl->geomflags |= NPL_HASVLVCOL; } if (pc) { for (i = 0; i < pl->n_polys; i++) { pl->p[i].pcol = pc[i]; if (pc[i].a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } } return pl; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/npolylist/Makefile.am0000644000175000001440000000041110523161056017023 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libnpolylist.la libnpolylist_la_SOURCES = \ nplbound.c nplclass.c nplcopy.c nplcreate.c npldraw.c nplload.c nplsave.c \ npolylist.h npolylistP.h npltransform.c nplsphere.c nplpick.c geomview-1.9.4/src/lib/gprim/npolylist/Makefile.in0000644000175000001440000003717210665240504017055 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/npolylist DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libnpolylist_la_LIBADD = am_libnpolylist_la_OBJECTS = nplbound.lo nplclass.lo nplcopy.lo \ nplcreate.lo npldraw.lo nplload.lo nplsave.lo npltransform.lo \ nplsphere.lo nplpick.lo libnpolylist_la_OBJECTS = $(am_libnpolylist_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libnpolylist_la_SOURCES) DIST_SOURCES = $(libnpolylist_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libnpolylist.la libnpolylist_la_SOURCES = \ nplbound.c nplclass.c nplcopy.c nplcreate.c npldraw.c nplload.c nplsave.c \ npolylist.h npolylistP.h npltransform.c nplsphere.c nplpick.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/npolylist/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/npolylist/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libnpolylist.la: $(libnpolylist_la_OBJECTS) $(libnpolylist_la_DEPENDENCIES) $(LINK) $(libnpolylist_la_OBJECTS) $(libnpolylist_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/npldraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nplsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/npltransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/npolylist/npolylist.h0000644000175000001440000000301610514661170017203 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef NPOLYLISTDEFS #define NPOLYLISTDEFS /* * Public definitions for PolyList's */ #include "bbox.h" typedef struct NPolyList NPolyList; extern NPolyList *NPolyListDraw( NPolyList * ); extern BBox *NPolyListBound(NPolyList *np, Transform T, TransformN *TN); extern NPolyList *NPolyListEvert( NPolyList * ); extern NPolyList *NPolyListLoad( char * ); /* Loads "off" files */ extern NPolyList *NPolyListFLoad( IOBFILE *, char *fname ); extern char *NPolyListName( void ); extern NPolyList *NPolyListFSave( NPolyList *, FILE *, char * ); #endif/*NPOLYLISTDEFS*/ geomview-1.9.4/src/lib/gprim/npolylist/nplcopy.c0000644000175000001440000000574510611531075016636 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/npolylist/nplcopy.c,v 1.7 2007/04/19 00:05:17 rotdrop Exp $ */ /* * Geometry object routines * * Copy an NPolyList. */ #include "npolylistP.h" NPolyList * NPolyListCopy(NPolyList *pl) { NPolyList *newpl; Poly *newp; Vertex *newvl; HPtNCoord *newv; int *newvi; int *newpv; ColorA *newvcol = NULL; Vertex **newvp; int i, k; if (pl == NULL) { return NULL; } newv = OOGLNewNE(HPtNCoord, pl->pdim*pl->n_verts, "NPolyList verts"); newvl = OOGLNewNE(Vertex, pl->n_verts, "NPolyList verts description"); newp = OOGLNewNE(Poly, pl->n_polys, "NPolyList polygons"); newvi = OOGLNewNE(int, pl->nvi, "NPolyList vert indices"); newpv = OOGLNewNE(int, pl->n_polys, "NPolyList polygon vertices"); if (pl->vcol) { newvcol = OOGLNewNE(ColorA, pl->n_verts, "NPolyList vertex colors"); } newpl = OOGLNewE(NPolyList, "NPolyList"); *newpl = *pl; newpl->vi = newvi; newpl->pv = newpv; newpl->v = newv; newpl->vcol = pl->vcol ? newvcol : NULL; newpl->p = newp; newpl->vl = newvl; memcpy(newvi, pl->vi, pl->nvi * sizeof(int)); memcpy(newpv, pl->pv, pl->n_polys * sizeof(int)); memcpy(newv, pl->v, pl->n_verts * pl->pdim * sizeof(HPtNCoord)); if (pl->vcol) { memcpy(newvcol, pl->vcol, pl->n_verts * sizeof(ColorA)); } memcpy(newp, pl->p, pl->n_polys * sizeof(Poly)); memcpy(newvl, pl->vl, pl->n_verts * sizeof(Vertex)); newvp = OOGLNewNE(Vertex *, pl->nvi, "NPolyList 3d connectivity"); for (i = 0; i < newpl->n_polys; i++) { Poly *p = &newpl->p[i]; p->v = newvp; newvp += p->n_vertices; for (k = 0; k < p->n_vertices; k++) { p->v[k] = &newpl->vl[newpl->vi[newpl->pv[i]+k]]; } } return newpl; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/npolylist/nplsphere.c0000644000175000001440000000250010517062457017144 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "geom.h" #include "create.h" #include "npolylistP.h" #include "sphere.h" Geom *NPolyListSphere(NPolyList *npl, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere; /* Create a dummy sphere, the center will be corrected later */ sphere = GeomCreate("sphere", CR_SPACE, space, CR_END); SphereEncompassPoints((Sphere *)sphere, npl->v, 0 /* vert_4d */, npl->pdim, npl->n_verts, T, TN, axes); return sphere; } geomview-1.9.4/src/lib/gprim/npolylist/npldraw.c0000644000175000001440000001470010613722707016616 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* $Header: /cvsroot/geomview/geomview/src/lib/gprim/npolylist/npldraw.c,v 1.18 2007/04/25 19:02:31 rotdrop Exp $ */ /* * Draw a PolyList using mg library. */ #include "npolylistP.h" #include "polylistP.h" /* Need plain PolyList, too, for mgpolylist() */ #include "appearance.h" #include "mgP.h" /* need mgP.h (instead of mg.h) for _mgc below */ #include "bsptreeP.h" #include "hpointn.h" #include static void draw_projected_polylist(mgNDctx *NDctx, NPolyList *pl) { PolyList npl; HPointN *h; Poly *np; Vertex *nv; float *ov; ColorA *oc; int i, j; bool colored = false, alpha = false; float *hdata; mgNDmapfunc mapHPtN = NDctx->mapHPtN; Appearance *ap = &_mgc->astk->ap; Material *mat = &_mgc->astk->mat; int normal_need; /* Copy the PolyList onto the stack. */ memset(&npl, 0, sizeof(PolyList)); GGeomInit((Geom *)(void *)&npl, PolyListMethods(), PLMAGIC, NULL); npl.n_polys = pl->n_polys; npl.n_verts = pl->n_verts; npl.geomflags = pl->geomflags; npl.vl = pl->vl; npl.p = pl->p; h = HPtNCreate(pl->pdim, NULL); if (ap->flag & APF_KEEPCOLOR) { colored = false; } else { HPoint3 dummyv; ColorA dummyc; /* Dummy transform to determine whether we have ND colors or not */ colored = mapHPtN(NDctx, h, &dummyv, &dummyc) != 0; } /* Transform vertices */ hdata = h->v; npl.geomflags &= ~VERT_4D; for(i = 0, ov = pl->v, nv = npl.vl; i < pl->n_verts; i++, nv++) { h->v = ov; if (colored) { mapHPtN(NDctx, h, &nv->pt, &nv->vcol); if (nv->vcol.a != 1.0) { alpha = true; } } else { mapHPtN(NDctx, h, &nv->pt, NULL); } ov += pl->pdim; } if (colored) { if (alpha) { npl.geomflags |= COLOR_ALPHA; } else { npl.geomflags &= ~COLOR_ALPHA; } npl.geomflags &= ~PL_HASPCOL; npl.geomflags |= PL_HASVCOL; pl->geomflags &= ~NPL_HASVLVCOL; /* mark as invalid */ } else if ((pl->geomflags & PL_HASVCOL) && !(pl->geomflags & NPL_HASVLVCOL)) { /* copy per vertex colors into vertex list */ for(i = 0, nv = npl.vl, oc = pl->vcol; i < pl->n_verts; ++i, ++nv, ++oc) { nv->vcol = *oc; } pl->geomflags |= NPL_HASVLVCOL; /* mark as valid */ } else if (npl.geomflags & GEOM_COLOR) { colored = true; } /* The drawing routines might need either polygon or vertex normals, * so if either is missing and either might be needed, we force it * to be computed. */ npl.geomflags &= ~(PL_HASVN|PL_HASPN|PL_HASPFL); normal_need = (ap->flag & APF_NORMALDRAW) ? PL_HASPN|PL_HASVN : 0; if (ap->flag & APF_FACEDRAW) { switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: normal_need |= PL_HASPN; break; case APF_SMOOTH: normal_need |= PL_HASVN; break; default: break; } if (GeomHasAlpha((Geom *)(void *)&npl, ap)) { normal_need |= PL_HASPFL|PL_HASPN; } } if (normal_need) { PolyListComputeNormals(&npl, normal_need); } if((_mgc->astk->flags & MGASTK_SHADER) && !(npl.geomflags & GEOM_ALPHA)) { ColorA *c = !colored || (mat->override & MTF_DIFFUSE) ? (ColorA *)&mat->diffuse : NULL; switch (ap->shading) { case APF_SMOOTH: if (!(npl.geomflags & PL_HASVCOL)) { if (npl.geomflags & PL_HASPCOL) { for (i = 0, np = npl.p; i < npl.n_polys; i++, np++) { for (j = 0; j < np->n_vertices; j++) { np->v[j]->vcol = np->pcol; } } } } for (i = 0, nv = npl.vl; i < npl.n_verts; i++, nv++) { (*_mgc->astk->shader)(1, &nv->pt, &nv->vn, c ? c : &nv->vcol, &nv->vcol); } npl.geomflags |= PL_HASVCOL; mgpolylist(npl.n_polys, npl.p, npl.n_verts, npl.vl, npl.geomflags); break; case APF_FLAT: for (i = 0, np = npl.p; i < npl.n_polys; i++, np++) { (*_mgc->astk->shader)(1, &np->v[0]->pt, (Point3 *)&np->pn, c ? c : &np->pcol, &np->pcol); } npl.geomflags |= PL_HASPCOL; mgpolylist(npl.n_polys, npl.p, npl.n_verts, npl.vl, npl.geomflags); break; case APF_VCFLAT: for (i = 0, np = npl.p; i < npl.n_polys; i++, np++) { VARARRAY(V, HPoint3, np->n_vertices); VARARRAY(C, ColorA, np->n_vertices); for (j = 0; j < np->n_vertices; j++) { V[j] = np->v[j]->pt; C[j] = (npl.geomflags & PL_HASVCOL) ? np->v[j]->vcol : ((npl.geomflags & PL_HASPCOL) ? np->pcol : *c); (*_mgc->astk->shader)(1, &V[j], (Point3 *)&np->pn, &C[j], &C[j]); } mgpolygon(np->n_vertices, V, 1, &np->pn, np->n_vertices, C); } break; } } else { /* ordinary shading */ mgpolylist(npl.n_polys, npl.p, npl.n_verts, npl.vl, npl.geomflags); } /* Generate a BSP-tree if the object or parts of it might be * translucent. */ if (NDctx->bsptree && (npl.geomflags & GEOM_ALPHA)) { GeomNodeDataMove((Geom *)pl, (Geom *)(void *)&npl); GeomBSPTree((Geom *)(void *)&npl, NDctx->bsptree, BSPTREE_ADDGEOM); GeomNodeDataMove((Geom *)(void *)&npl, (Geom *)pl); } h->v = hdata; HPtNDelete(h); } NPolyList *NPolyListDraw(NPolyList *pl) { mgNDctx *NDctx = NULL; mgctxget(MG_NDCTX, &NDctx); if(NDctx) { draw_projected_polylist(NDctx, pl); return pl; } return NULL; } /* A dummy, just to make GeomBSPTree() not bail out. */ NPolyList *NPolyListBSPTree(NPolyList *pl, BSPTree *tree, int action) { return pl; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/npolylist/Headers0000644000175000001440000000003107730237430016271 00000000000000npolylist.h npolylistP.h geomview-1.9.4/src/lib/gprim/npolylist/nplload.c0000644000175000001440000001700210622716755016604 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ /* * Load a NPolyList object from an "nOFF"-format file. * */ #include #include "npolylistP.h" #define SIZEOF_CMAP 256 static ColorA *colormap; static void LoadCmap(char *file) { IOBFILE *fp; colormap = OOGLNewNE(ColorA, 256, "PolyList colormap"); if((file = findfile(NULL, file)) != NULL && (fp = iobfopen(file,"r")) != NULL) { iobfgetnf(fp, SIZEOF_CMAP*4, (float *)colormap, 0); iobfclose(fp); } } NPolyList * NPolyListFLoad(IOBFILE *file, char *fname) { NPolyList *pl; Vertex **vp; int edges; int i; float *v; int binary = 0; int headerseen = 0; int flags = 0; char *token; int dimn = 3, pdim; static ColorA black = { 0,0,0,0 }; vvec vi; if (file == NULL) return NULL; token = GeomToken(file); if(strncmp(token, "ST", 2) == 0) { flags |= PL_HASST; token += 2; } if(*token == 'C') { flags = PL_HASVCOL; /* Per-vertex colors */ token++; } if(*token == '4') { dimn = 4; token++; } if(*token == 'S') { /* "smooth surface": we compute vtx normals */ /* ??? normals ??? */ token++; } if(strcmp(token, "nOFF") == 0) { headerseen = 1; if(iobfgetni(file, 1, &pdim, binary) == 0) { OOGLSyntax(file, "nOFF %s: expected dimension", fname); return NULL; } if (pdim < 4) { OOGLSyntax(file, "nOFF %s: dimension %d must be > 4", fname, pdim); return NULL; } if(iobfnextc(file, 1) == 'B' && iobfexpectstr(file, "BINARY") == 0) { binary = 1; if(iobfnextc(file, 1) != '\n') /* Expect \n after BINARY */ return NULL; (void) iobfgetc(file); /* Toss \n */ } } else { return NULL; } pl = OOGLNewE(NPolyList, "NPolyListFLoad NPolyList"); memset(pl, 0, sizeof(NPolyList)); GGeomInit(pl, NPolyListMethods(), NPLMAGIC, NULL); pl->geomflags = flags | ((dimn == 4) ? VERT_4D : 0); #if 0 /* wrong: the Ndim number of the nOFF and 4nOFF file formats does _NOT_ include the homogeneous component */ pl->pdim = pdim + (dimn == 4 ? 0 : 1); #else pl->pdim = pdim + 1; pdim += dimn == 4; /* number of coordinates specified in OFF file */ #endif if(iobfgetni(file, 1, &pl->n_verts, binary) <= 0 || iobfgetni(file, 1, &pl->n_polys, binary) <= 0 || iobfgetni(file, 1, &edges, binary) <= 0) { if(headerseen) OOGLSyntax(file, "PolyList %s: Bad vertex/face/edge counts", fname); goto bogus; } VVINIT(vi, int, 5*pl->n_polys); pl->v = OOGLNewNE(HPtNCoord, pl->n_verts*pl->pdim, "NPolyListFLoad vertices"); pl->vl = OOGLNewNE(Vertex, pl->n_verts, "NPolyListFLoad vertex descriptions"); if(pl->geomflags & PL_HASVCOL) pl->vcol = OOGLNewNE(ColorA, pl->n_verts, "NPolyListFLoad vertex colors"); for(v = pl->v, i = 0; i < pl->n_verts; v += pl->pdim, i++) { if(iobfgetnf(file, pdim, v + (pdim != pl->pdim ? 1 : 0), binary) < pdim || ((flags & PL_HASVCOL) && iobfgetnf(file, 4, (float *)&pl->vcol[i], binary) < 4) || ((flags & PL_HASST) && iobfgetnf(file, 2, (float *)&pl->vl[i].st, binary) < 2)) { OOGLSyntax(file, "nOFF %s: Bad vertex %d (of %d)", fname, i, pl->n_verts); goto bogus; } if (flags & PL_HASVCOL) { pl->vl[i].vcol = pl->vcol[i]; if (pl->vcol[i].a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } if (dimn == 3) v[0] = 1.0; } if (flags & PL_HASVCOL) { /* vcol and vl[].vcol are in sync */ pl->geomflags |= NPL_HASVLVCOL; } pl->pv = OOGLNewNE(int, pl->n_polys, "NPolyListFLoad polygon vertices"); pl->p = OOGLNewNE(Poly, pl->n_polys, "NPolyListFLoad polygons"); for(i = 0; i < pl->n_polys; ++i) { Poly *p; int k, index; p = &pl->p[i]; if(iobfgetni(file, 1, &p->n_vertices, binary) <= 0 || p->n_vertices <= 0) { OOGLSyntax(file, "PolyList %s: bad %d'th polygon (of %d)", fname, i, pl->n_polys); goto bogus_face; } pl->pv[i] = VVCOUNT(vi); VVCOUNT(vi) += p->n_vertices; vvneeds(&vi, VVCOUNT(vi)); for(k = 0; k < p->n_vertices; k++) { int index; if(iobfgetni(file, 1, &index, binary) <= 0 || index < 0 || index >= pl->n_verts) { OOGLSyntax(file, "PolyList: %s: bad index %d on %d'th polygon (of %d)", fname, index, i, p->n_vertices); goto bogus_face; } VVEC(vi, int)[pl->pv[i]+k] = index; } /* Pick up the color, if any. * In ASCII format, take whatever's left before end-of-line */ p->pcol = black; if(binary) { int ncol; if(iobfgetni(file, 1, &ncol, 1) <= 0 || iobfgetnf(file, ncol, (float *)&p->pcol, 1) < ncol) goto bogus_face_color; k = ncol; } else { for(k = 0; k < 4 && iobfnextc(file, 1) != '\n'; k++) { if(iobfgetnf(file, 1, ((float *)(&p->pcol))+k, 0) < 1) goto bogus_face_color; } } if((flags & PL_HASVCOL) == 0) { if(k > 0) pl->geomflags |= PL_HASPCOL; if(k != 1 && (p->pcol.r>1||p->pcol.g>1||p->pcol.b>1||p->pcol.a>1)) { p->pcol.r /= 255, p->pcol.g /= 255, p->pcol.b /= 255, p->pcol.a /= 255; } switch(k) { case 0: p->pcol.r = 170/255.0; /* Gray */ p->pcol.g = p->pcol.r; case 2: p->pcol.b = p->pcol.g; case 3: p->pcol.a = 170/255.0; /* Semitransparent */ break; case 1: /* use colormap */ if ( colormap == NULL ) LoadCmap("cmap.fmap"); index = p->pcol.r; if((unsigned)index >= SIZEOF_CMAP) index = 0; p->pcol = colormap[index]; } /* case 4, all components supplied */ } if ((pl->geomflags & PL_HASPCOL) && p->pcol.a != 1.0) { pl->geomflags |= COLOR_ALPHA; } } /* Hand the list of vertex-indices on to the new object */ vvtrim(&vi); pl->nvi = VVCOUNT(vi); pl->vi = VVEC(vi, int); /* Now generate the necessary information for pl->p[], i.e. insert * the pointers to the 3d vertices in the proper places; there * really is no need to do this evertime again and again when * drawing the object. */ vp = OOGLNewNE(Vertex *, pl->nvi, "NPolyList 3d connectivity"); for (i = 0; i < pl->n_polys; i++) { Poly *p = &pl->p[i]; int k; p->v = vp; vp += p->n_vertices; for (k = 0; k < p->n_vertices; k++) { p->v[k] = &pl->vl[pl->vi[pl->pv[i]+k]]; } } return pl; bogus_face_color: OOGLSyntax(file, "PolyList %s: bad face color on face %d (of %d)", fname, i, pl->n_polys); bogus_face: pl->n_polys = i; bogus: GeomDelete((Geom *)pl); return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bezier/0000777000175000001440000000000010665240671014312 500000000000000geomview-1.9.4/src/lib/gprim/bezier/bezsphere.c0000644000175000001440000000274710560661125016366 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "create.h" #include "bezierP.h" Geom *BezierBoundSphere(Bezier *bezier, Transform T, TransformN *TN, int *axes, int space) { if(bezier->geomflags & BEZ_REMESH || bezier->mesh == NULL || bezier->mesh->p == NULL) { if(BezierReDice(bezier) == NULL) return NULL; /* Oh no */ } return MeshBoundSphere( bezier->mesh, T, TN, axes, space ); } geomview-1.9.4/src/lib/gprim/bezier/bezbound.c0000644000175000001440000001004510622716753016204 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bezierP.h" BBox *BezierBound(Bezier *bezier, Transform T, TransformN *TN) { float *p; int n; HPoint3 min, max, clean; p = bezier->CtrlPnts; n = (bezier->degree_u + 1) * (bezier->degree_v + 1); /* First handle the case without transformations, this means that we return a 3d bbox for 3d beziers, and a 4d bbox for 4d beziers. */ if ((T == TM_IDENTITY || !T) && !TN) { min = *(HPoint3 *)p; if (bezier->dimn == 4) { if (!T) { max = min; while(--n > 0) { p += 4; Pt4MinMax(&min, &max, (HPoint3 *)p); } } else { HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { p += 4; HPt3MinMax(&min, &max, (HPoint3 *)p); } } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_4D, 1, CR_END); } else { min.w = 1.0; max = min; while(--n > 0) { p += 3; Pt3MinMax(&min, &max, (HPoint3 *)p); } return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *ptN; HPointN *minN; HPointN *maxN; BBox *result; ptN = HPtNCreate(5, NULL); if (bezier->dimn == 3) { Pt3ToHPtN((Point3 *)p, ptN); } else if (!(bezier->geomflags & VERT_4D)) { HPt3ToHPtN((HPoint3 *)p, NULL, ptN); } else { Pt4ToHPtN((HPoint3 *)p, ptN); } minN = HPtNTransform(TN, ptN, NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); while(--n > 0) { if (bezier->dimn == 3) { p += 3; Pt3ToHPtN((Point3 *)p, ptN); } else { p += 4; if (!(bezier->geomflags & VERT_4D)) { HPt3ToHPtN((HPoint3 *)p, NULL, ptN); } else { Pt4ToHPtN((HPoint3 *)p, ptN); } } HPtNTransform(TN, ptN, ptN); HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { int stride = bezier->dimn; /* ordinary 3d transform, treat 4d co-ordinates as homogeneous * co-ordinates. */ if (stride == 3) { Pt3ToHPt3((Point3 *)p, &min, 1); } else { min = *(HPoint3 *)p; } HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { p += stride; if (stride == 3) { Pt3ToHPt3((Point3 *)p, &clean, 1); } else { clean = *(HPoint3 *)p; } HPt3Transform(T, &clean, &clean); HPt3MinMax(&min, &max, &clean); } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bezier/bezclass.c0000644000175000001440000000575010560665673016216 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bezierP.h" static GeomClass *aBezierMethods = NULL; static GeomClass *aBezierListMethods = NULL; int BezierPresent = 1; int BezierListPresent = 1; static char nameBezier[] = "bezier"; static char nameBezierList[] = "bezierlist"; char * BezierName() { return nameBezier; } char * BezierListName() { return nameBezierList; } GeomClass * BezierMethods() { if( !aBezierMethods ) { aBezierMethods = GeomClassCreate(nameBezier); aBezierMethods->name = BezierName; aBezierMethods->methods = (GeomMethodsFunc *)BezierMethods; aBezierMethods->create = (GeomCreateFunc *)BezierCreate; aBezierMethods->evert = (GeomEvertFunc *)BezierEvert; aBezierMethods->Delete = (GeomDeleteFunc *)BezierDelete; aBezierMethods->bound = (GeomBoundFunc *)BezierBound; aBezierMethods->boundsphere = (GeomBoundSphereFunc *)BezierBoundSphere; aBezierMethods->draw = (GeomDrawFunc *)BezierDraw; aBezierMethods->bsptree = (GeomBSPTreeFunc *)BezierBSPTree; aBezierMethods->copy = (GeomCopyFunc *)BezierCopy; aBezierMethods->pick = (GeomPickFunc *)BezierPick; aBezierMethods->dice = (GeomDiceFunc *)BezierDice; aBezierMethods->transform = (GeomTransformFunc *)BezierTransform; aBezierMethods->transformto = (GeomTransformToFunc *)BezierTransform; } return aBezierMethods; } GeomClass * BezierListMethods() { if( !aBezierListMethods ) { (void) ListMethods(); aBezierListMethods = GeomSubClassCreate("list", "bezierlist"); aBezierListMethods->name = BezierListName; aBezierListMethods->methods = (GeomMethodsFunc *)BezierListMethods; aBezierListMethods->fload = (GeomFLoadFunc *)BezierListFLoad; aBezierListMethods->fsave = (GeomFSaveFunc *)BezierListFSave; aBezierListMethods->import = NULL; aBezierListMethods->export = NULL; } return aBezierListMethods; } geomview-1.9.4/src/lib/gprim/bezier/bezdice.c0000644000175000001440000002452510577535004016006 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Silvio Levy, Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "math.h" #include "bezierP.h" #include "bsptreeP.h" void bezier_interp(); Bezier * BezierDice(Bezier *bezier, int nu, int nv) { if(nu < 2) nu = BEZ_DEFAULT_MESH_SIZE; if(nv < 2) nv = BEZ_DEFAULT_MESH_SIZE; if(nu != bezier->nu || nv != bezier->nv) { bezier->geomflags |= BEZ_REMESH; bezier->nu = nu; bezier->nv = nv; } return bezier; } /* this gets called when it's time to remesh, so the current mesh is destroyed and a new one is allocated */ Mesh *BezierReDice(Bezier *bezier) { int u, v, d; int dimn, nu, nv, degree_u, degree_v; float *tmpp0, *tmpp1, *tmpp2, *p; float *tmpdv, *tmpdv0, *tmpdv1, *tmpdv2, *dv; float *tmpdu, *tmpdu0, *tmpdu1, *tmpdu2, *du; float norm; HPoint3 *bmp; Point3 *bmn; TxST *bmt; Mesh m; dimn = bezier->dimn; degree_u = bezier->degree_u; degree_v = bezier->degree_v; if (bezier->nu <= 1) bezier->nu = BEZ_DEFAULT_MESH_SIZE; if (bezier->nv <= 1) bezier->nv = BEZ_DEFAULT_MESH_SIZE; nu = bezier->nu; nv = bezier->nv; m.nu = nv; m.nv = nu; m.geomflags = MESH_N; if (bezier->geomflags & BEZ_C) { m.geomflags |= MESH_C; } m.p = NULL; m.c = NULL; m.n = NULL; m.u = NULL; m.p = OOGLNewNE(HPoint3, nu*nv, "BezierReDice: mesh points"); m.n = OOGLNewNE(Point3, nu*nv, "BezierReDice: mesh normals"); if(bezier->geomflags & BEZ_C) m.c = OOGLNewNE(ColorA, nu*nv, "BezierReDice: mesh colors"); if(bezier->geomflags & BEZ_ST) m.u = OOGLNewNE(TxST, nu*nv, "BezierReDice: mesh txcoords"); /* compute first pass: interpolate mesh points in u direction */ tmpdv = OOGLNewNE(float, dimn * degree_v * (degree_u+1), "BezierReDice: tempdv"); for (v=0; vCtrlPnts + dimn * ((v+1)*(degree_u+1)+u)+d)- *(bezier->CtrlPnts + dimn * (v*(degree_u+1)+u)+d); /* printf("%f ", *(tmpdv+dimn*(v*(degree_u+1)+u)+d)); */ } /* printf("\n"); */ } tmpdu = OOGLNewNE(float,dimn*(degree_v+1)*degree_u,"BezierReDice:tmpdu"); /* printf("this is du\n"); */ for (v=0; vCtrlPnts + dimn * (v*(degree_u+1)+u+1)+d)- *(bezier->CtrlPnts + dimn * (v*(degree_u+1)+u)+d); /* printf("%f ", *(tmpdv+dimn*(v*degree_u+u)+d)); */ } /* printf("\n"); */ } /* printf("this is tmpp0\n"); */ tmpp0 = OOGLNewNE(float, dimn * (degree_v+1) * nu, "BezierReDice: tmpp0"); for (v=0; vCtrlPnts + v * dimn * (degree_u+1), tmpp0 + v * dimn * nu, degree_u, nu, dimn); tmpdv0 = OOGLNewNE(float, dimn * degree_v * nu, "BezierReDice: tmpdv0"); /* printf("this is tmpdv0\n"); */ for (v=0; vSTCoords[0].s*(1-tu) + bezier->STCoords[1].s*tu; txds = bezier->STCoords[2].s*(1-tu) + bezier->STCoords[3].s*tu - txs0; txt0 = bezier->STCoords[0].t*(1-tu) + bezier->STCoords[1].t*tu; txdt = bezier->STCoords[2].t*(1-tu) + bezier->STCoords[3].t*tu - txt0; } for (v=0, p=tmpp2, dv=tmpdv2, du=tmpdu2; vw = 1.; bmp++; bmn->x = -du[1]*dv[2]+du[2]*dv[1]; bmn->y = -du[2]*dv[0]+du[0]*dv[2]; bmn->z = -du[0]*dv[1]+du[1]*dv[0]; norm=bmn->x *bmn->x +bmn->y *bmn->y +bmn->z *bmn->z; if (norm==0.0) {bmn->x=1.; norm=1.;} norm=sqrt(norm); bmn->x /= norm; bmn->y /= norm; bmn->z /= norm; bmn++; if(bmt) { float tv = (float)v/(nv-1); bmt->s = txs0 + txds*tv; bmt->t = txt0 + txdt*tv; bmt++; } } } GeomFree(tmpp0); GeomFree(tmpp1); GeomFree(tmpp2); GeomFree(tmpdu); GeomFree(tmpdu0); GeomFree(tmpdu1); GeomFree(tmpdu2); GeomFree(tmpdv); GeomFree(tmpdv0); GeomFree(tmpdv1); GeomFree(tmpdv2); bezier->geomflags &= ~BEZ_REMESH; /* turn off this bit */ if(bezier->geomflags & BEZ_C) { float fu, unu, fv, unv; ColorA u0, u1; ColorA *cp; #define INTC(c0, c1, t, unt, dest) /* Interpolate color */ \ dest.r = c0.r * unt + c1.r * t; \ dest.g = c0.g * unt + c1.g * t; \ dest.b = c0.b * unt + c1.b * t; \ dest.a = c0.a * unt + c1.a * t; cp = m.c; for(v = 0; v < nv; v++) { fv = (float) v / (nv - 1); unv = 1 - fv; INTC(bezier->c[0], bezier->c[1], fv, unv, u0); INTC(bezier->c[2], bezier->c[3], fv, unv, u1); for(u = 0; u < nu; u++) { fu = (float) u / (nu - 1); unu = 1 - fu; INTC(u0, u1, fu, unu, (*cp)); cp++; } } } GeomDelete((Geom *)bezier->mesh); HandleSetObject(bezier->meshhandle, NULL); bezier->mesh = (Mesh *) GeomCreate("mesh", CR_NOCOPY, /* For now, assume these are rational beziers hence belong in 3-space CR_4D, (dimn == 4) ? 1 : 0, */ CR_FLAG, m.geomflags, CR_NU, m.nu, CR_NV, m.nv, CR_POINT4, m.p, CR_NORMAL, m.n, CR_COLOR, m.c, CR_U, m.u, CR_END); if (bezier->mesh == NULL) { OOGLError(1, "BezierReDice: can't create Mesh"); return NULL; } HandleSetObject(bezier->meshhandle, (Ref *)bezier->mesh); /*GeomCCreate(bezier->mesh, NULL, CR_COPY, CR_APPEAR, bezier->ap, CR_END);*/ #if 0 /* should be handled by a call-back now */ if (bezier->bsptree != NULL && bezier->bsptree->tree != NULL) { /* simply free the tree */ BSPTreeFreeTree(bezier->bsptree); } #endif return bezier->mesh; } /* Takes a list of control points describing a spline */ /* and produces values for the spline */ /* at n equally spaced points. */ #if 0 float *in; /* input array of control points */ float *out; /* output array */ int deg; /* degree of spline */ int n; /* number of points to interpolate */ int dimn; /* dimension of range */ #endif void bezier_interp(float *in, float *out, int deg, int n, int dimn) { int m, offset, k, j; float p[(MAX_BEZ_DEGREE+1)*MAX_BEZ_DIMN]; float t; /* for (j=0; j0) { mgbezier (bezier->degree_u, bezier->degree_v , bezier->dimn, bezier->CtrlPnts, (bezier->geomflags & BEZ_ST) ? bezier->STCoords : NULL, (bezier->geomflags & BEZ_C) ? bezier->c : NULL); } else { GeomMakePath(bezier, 'B', path, pathlen); if (ap->valid & APF_DICE) { bezier->nu = ap->dice[0]; bezier->nv = ap->dice[1]; } if (bezier->mesh == NULL || bezier->mesh->nu != bezier->nu || bezier->mesh->nv != bezier->nv) bezier->geomflags |= BEZ_REMESH; if (bezier->geomflags & BEZ_REMESH) { BezierReDice(bezier); } bezier->mesh->ppath = path; bezier->mesh->ppathlen = pathlen; GeomDraw( (Geom *)bezier->mesh ); } return bezier; } Bezier *BezierBSPTree(Bezier *bezier, BSPTree *bsptree, int action) { if (never_translucent((Geom *)bezier)) { return bezier; } switch (action) { case BSPTREE_CREATE: HandleRegister(&bezier->meshhandle, (Ref *)bezier, bsptree, BSPTreeInvalidate); return bezier; case BSPTREE_DELETE: HandleUnregisterJust(&bezier->meshhandle, (Ref *)bezier, bsptree,BSPTreeInvalidate); return bezier; case BSPTREE_ADDGEOM: if (bezier->mesh == NULL || bezier->mesh->nu != bezier->nu || bezier->mesh->nv != bezier->nv) { bezier->geomflags |= BEZ_REMESH; } if (bezier->geomflags & BEZ_REMESH) { BezierReDice(bezier); } BSPTreeAddObject(bsptree, (Geom *)bezier->mesh); return bezier; default: return NULL; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bezier/bezierP.h0000644000175000001440000000325310577535005016002 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef BEZIERPDEFS #define BEZIERPDEFS #include "geomclass.h" #include "bezier.h" #include "meshP.h" struct Bezier { GEOMFIELDS; int degree_u, degree_v, dimn; int nu, nv; /* these must match mesh dimensions or remake mesh */ float *CtrlPnts; TxST STCoords[4]; Mesh *mesh; Handle *meshhandle; /* to be able to define call-backs when remeshing */ ColorA c[4]; /* if flag & BEZ_C */ }; /* * Hidden routines, not user-callable */ extern Bezier *BezierCreate( Bezier *exist, GeomClass *, va_list *attrlist ); extern void BezierDelete( Bezier * ); extern Bezier *BezierCopy( Bezier * ); #endif /* ! BEZIERPDEFS */ /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bezier/Makefile.am0000644000175000001440000000041010455665331016256 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libbezier.la libbezier_la_SOURCES = \ bezbound.c bezclass.c bezcreate.c bezdice.c bezdraw.c bezevert.c bezload.c bezpick.c bezsave.c bezsphere.c beztransform.c \ bezier.h bezierP.h geomview-1.9.4/src/lib/gprim/bezier/Makefile.in0000644000175000001440000003724410665240502016276 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/bezier DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libbezier_la_LIBADD = am_libbezier_la_OBJECTS = bezbound.lo bezclass.lo bezcreate.lo \ bezdice.lo bezdraw.lo bezevert.lo bezload.lo bezpick.lo \ bezsave.lo bezsphere.lo beztransform.lo libbezier_la_OBJECTS = $(am_libbezier_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libbezier_la_SOURCES) DIST_SOURCES = $(libbezier_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libbezier.la libbezier_la_SOURCES = \ bezbound.c bezclass.c bezcreate.c bezdice.c bezdraw.c bezevert.c bezload.c bezpick.c bezsave.c bezsphere.c beztransform.c \ bezier.h bezierP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/bezier/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/bezier/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbezier.la: $(libbezier_la_OBJECTS) $(libbezier_la_DEPENDENCIES) $(LINK) $(libbezier_la_OBJECTS) $(libbezier_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezdice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezevert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beztransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/bezier/bezload.c0000644000175000001440000001235110577535005016014 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "bezierP.h" /* a hack: introduce new names of the form BEZUVM and BEZUVM_ST, where U is u-degree of the polynomial and V is v-degree of the polynomial and M is the dimension of the points involved */ static int bezierheader(IOBFILE *file, Bezier *bezier) { int binary = 0; char *token; /* Parse {BBP|STBBP|BEZuvn[_ST]} [BINARY] */ bezier->geomflags = BEZ_REMESH; bezier->dimn = 3; bezier->degree_u = bezier->degree_v = 3; /* Default bicubic 3-D patch */ bezier->nu = bezier->nv = 0; token = GeomToken(file); if(strncmp(token, "ST", 2) == 0) { bezier->geomflags |= BEZ_ST; token += 2; } if(*token == 'C') { bezier->geomflags |= BEZ_C; token++; } if(strncmp(token, "BEZ", 3) == 0) { int haveuvn = 0; token += 3; if(*token >= '0' && *token <= '9') { haveuvn = 1; bezier->degree_u = *token++ - '0'; bezier->degree_v = *token++ - '0'; bezier->dimn = *token++ - '0'; } if(strcmp(token, "_ST") == 0) { token += 3; bezier->geomflags |= BEZ_ST; } if(!haveuvn) { /* [C]BEZ[_ST] u v n -- expect u, v, n as separate numbers */ if(iobfgetni(file, 1, &bezier->degree_u, 0) <= 0 || iobfgetni(file, 1, &bezier->degree_v, 0) <= 0 || iobfgetni(file, 1, &bezier->dimn, 0) <= 0) return -1; } if(bezier->degree_u <= 0 || bezier->degree_u > MAX_BEZ_DEGREE || bezier->degree_v <= 0 || bezier->degree_v > MAX_BEZ_DEGREE || bezier->dimn < 3 || bezier->dimn > MAX_BEZ_DIMN) return -1; } else if(strcmp(token, "BBP") != 0) { return -1; } GeomAcceptToken(); if(iobfnextc(file, 1) == 'B') { if(iobfexpectstr(file, "BINARY")) return -1; binary = 1; if(iobfnextc(file, 1) == '\n') (void) iobfgetc(file); /* Toss \n */ } bezier->CtrlPnts = NULL; bezier->mesh = NULL; return(binary); } List * BezierListFLoad(IOBFILE *file, char *fname) { Geom *bezierlist; Bezier proto, bez; int totalfloats; int nf, ok, c; int binary; Geom *geom; binary = bezierheader( file, &proto ); if(binary < 0) return NULL; /* begin a list with empty list */ bezierlist = NULL; for(;;) { /* get new space */ ok = 0; bez = proto; /* should be a call to GeomCopy */ /* copy over header info */ totalfloats = (proto.degree_u+1)*(proto.degree_v+1)*proto.dimn; bez.CtrlPnts = OOGLNewNE(float,totalfloats, "Bezier control pnts"); nf = iobfgetnf(file, totalfloats, bez.CtrlPnts, binary); if(nf < totalfloats) { if(nf != 0) break; /* Incomplete array of control points -> error */ /* Maybe another Bezier header follows. * Take care not to call bezierheader(), which will * invoke GeomToken(), unless we actually seem to have * another letter following. Without the isalpha() * test, we might consume e.g. a close-brace which * doesn't belong to us. */ c = iobfnextc(file, 0); if((isascii(c) && isalpha(c)) && (binary = bezierheader( file, &proto )) >= 0) continue; /* No. If this doesn't look like the end of a * Bezier list, it's an error. */ if(c == EOF || c == CKET || c == ';') ok = 1; break; } if (bez.geomflags & BEZ_ST) { if(iobfgetnf(file, 8, (float *)bez.STCoords, binary) != 8) break; } if (bez.geomflags & BEZ_C) { /* Load 4 colors, for the 4 corners of the patch, v-major order. */ if(iobfgetnf(file, 16, (float *)bez.c, binary) != 16) break; } /* successful read; append to list */ geom = GeomCCreate (NULL,BezierMethods(), CR_NOCOPY, CR_FLAG, bez.geomflags | BEZ_REMESH, CR_DEGU, bez.degree_u, CR_DEGV, bez.degree_v, CR_DIM, bez.dimn, CR_POINT, bez.CtrlPnts, CR_ST, bez.STCoords, CR_COLOR, bez.c, CR_END); if(bezierlist) ListAppend(bezierlist, geom); else bezierlist = GeomCCreate(NULL, BezierListMethods(), CR_GEOM, geom, CR_END); } if(!ok) { OOGLSyntax(file, "Reading Bezier from \"%s\"", fname); GeomDelete(bezierlist); /* Scrap everything on error */ return NULL; } return (List *)bezierlist; } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bezier/bezpick.c0000644000175000001440000000323010560661137016015 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "mg.h" #include "bezierP.h" Geom * BezierPick( Bezier *bezier, Pick *pick, Appearance *ap, Transform T, TransformN *TN, int *axes ) { if (bezier->mesh == NULL || bezier->mesh->nu != bezier->nu || bezier->mesh->nv != bezier->nv) bezier->geomflags |= BEZ_REMESH; if (bezier->geomflags & BEZ_REMESH) { BezierReDice(bezier); } return GeomPick( (Geom *)bezier->mesh, pick, ap, T, TN, axes ); } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bezier/bezier.h0000644000175000001440000000430210563062116015647 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef BEZIERDEFS #define BEZIERDEFS #include "mesh.h" #include "list.h" #include "bsptree.h" #define BEZIERMAGIC GeomMagic ('b', 1) #define BEZ_ST VERT_ST #define BEZ_C VERT_C #define BEZ_4D VERT_4D #define BEZ_BINARY GEOMFLAG(0x01) #define BEZ_REMESH GEOMFLAG(0x02) /* need to recompute mesh */ #define MAX_BEZ_DEGREE 12 #define MAX_BEZ_DIMN 4 #define BEZ_DEFAULT_MESH_SIZE 10 typedef struct Bezier Bezier; GeomClass *BezierMethods(), *BezierListMethods(); Mesh *BezierReDice( Bezier * ); Bezier *BezierDice( Bezier *, int nu, int nv ); char *BezierListName(); List *BezierListLoad(); List *BezierListFLoad(); List *BezierListSave(); List *BezierListFSave(); char *BezierName(); BBox *BezierBound(); Geom *BezierBoundSphere( Bezier *, Transform T, TransformN *TN, int *axes, int ); Bezier *BezierEvert(); Bezier *BezierDraw( Bezier *bezier ); Bezier *BezierBSPTree(Bezier *bezier, BSPTree *tree, int action); Geom *BezierPick( Bezier *, Pick *, Appearance *, Transform, TransformN *, int *axes ); Bezier *BezierTransform( Bezier *, Transform, TransformN * ); int BezierExport(); int BezierUnexport(); Bezier *BezierImport(); #endif /* ! BEZIERDEFS */ geomview-1.9.4/src/lib/gprim/bezier/bezsave.c0000644000175000001440000000636010577535005016036 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bezierP.h" #include "listP.h" List * BezierListSave(bezierlist, fname) List *bezierlist; char *fname; { List *q; FILE *f; if((f = fopen(fname, "w")) == NULL) return NULL; q = BezierListFSave(bezierlist, f); fclose(f); return q; } List * BezierListFSave(bezierlist, f) List *bezierlist; FILE *f; { List *bl; Bezier *bez; float *p; int u, v; int dimwas = -1, uwas = -1, vwas = -1, flagwas = -1; for(bl = bezierlist; bl != NULL; bl = bl->cdr) { if(bl->car == NULL) continue; if((bez = (Bezier *)(bl->car)) == NULL) continue; if(bez->magic != BEZIERMAGIC) { GeomError(1/*warning-mismatch*/, "BezierListFSave: Non-Bezier object on BezierList: %x magic %x", bez, bez->magic); continue; } if(bez->dimn != dimwas || bez->geomflags != flagwas || bez->degree_u != uwas || bez->degree_v != vwas) { if(bez->dimn == 3 && bez->degree_u == 3 && bez->degree_v == 3 && !(bez->geomflags & BEZ_C)) { fputs(bez->geomflags & BEZ_ST ? "STBBP" : "BBP", f); } else { if(bez->geomflags & BEZ_C) fputc('C', f); fprintf(f, "BEZ%c%c%c", bez->degree_u + '0', bez->degree_v + '0', bez->dimn + '0'); if(bez->geomflags & BEZ_ST) fputs("_ST", f); } dimwas = bez->dimn; flagwas = bez->geomflags; uwas = bez->degree_u; vwas = bez->degree_v; } fputc('\n', f); p = bez->CtrlPnts; for(v = 0; v <= bez->degree_v; v++) { fputc('\n', f); for(u = 0; u <= bez->degree_u; u++) { if(bez->dimn == 4) fprintf(f, "%11.8g ", *p++); fprintf(f, "%11.8g %11.8g %11.8g\n", p[0], p[1], p[2]); p += 3; } } if(bez->geomflags & BEZ_ST) { fputc('\n', f); for(u = 0; u < 4; u++) fprintf(f, "%8g %8g ", bez->STCoords[u].s, bez->STCoords[u].t); } if(bez->geomflags & BEZ_C && bez->c != NULL) { fputc('\n', f); for(u = 0, p = (float *)bez->c; u < 4; u++, p += 4) fprintf(f, "%6g %6g %6g %6g\n", p[0], p[1], p[2], p[3]); } } return bezierlist; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bezier/beztransform.c0000644000175000001440000000350210510667536017110 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #include "hpoint3.h" #include "point3.h" #include "bezierP.h" Bezier * BezierTransform(Bezier *b, Transform T, TransformN *dummy) { int i; Point3 *p; HPoint3 *hp; int limit = (b->degree_u + 1)*(b->degree_v + 1); if (b->CtrlPnts != NULL) { if (b->dimn == 3) for (i = 0, p = (Point3 *)b->CtrlPnts; i < limit; i++, p++) Pt3Transform(T, p, p); else if (b->dimn == 4) for (i = 0, hp = (HPoint3 *)b->CtrlPnts; i < limit; i++, hp++) HPt3Transform(T, hp, hp); else { OOGLError(1, "Bezier patch of unfamiliar dimensions."); return NULL; } } GeomDelete((Geom *)b->mesh); b->mesh = NULL; return(b); } geomview-1.9.4/src/lib/gprim/bezier/bezevert.c0000644000175000001440000000412310560660741016216 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bezierP.h" /* * evert patch by transposing control points. * If mesh has been computed, also call MeshEvert * Next time mesh is computed, its normals will be correct. */ Bezier * BezierEvert( bezier ) Bezier *bezier; { #ifdef FOO int index0, index1, i,j,k; /* index0 will be linear index of control point... */ for( i = 0; i< bezier->degree+1; ++i) for( j = i+1; j< bezier->degree+1; ++j) { /* ... compute index1 for transpose control point */ index1 = bezier->dimn * (j * (bezier->degree+1) + i); index0 = bezier->dimn * (i * (bezier->degree+1) + j); for( k = 0; k< bezier->dimn; ++k) { tmp = bezier->CtrlPnts[index0+k]; bezier->CtrlPnts[index0+k] = bezier->CtrlPnts[index1+k]; bezier->CtrlPnts[index1+k] = tmp; } } #endif if (bezier->geomflags & BEZ_REMESH || bezier->mesh == NULL) BezierReDice(bezier); MeshEvert(bezier->mesh); return bezier; } geomview-1.9.4/src/lib/gprim/bezier/bezcreate.c0000644000175000001440000001111410577535004016333 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bezierP.h" /* * Bezier creation, deletion and editing. */ static inline void bez_make_meshhandle(Bezier *bezier) { char meshhname[sizeof("\aBezier::")+sizeof(void *)*2]; extern HandleOps GeomOps; sprintf(meshhname, "\aBezier::%lx", (unsigned long)bezier); bezier->meshhandle = HandleCreate(meshhname, &GeomOps); HandleSetObject(bezier->meshhandle, (Ref *)bezier->mesh); } Bezier * BezierCopy(Bezier *ob) { Bezier *b; int n; if (ob == NULL) { return NULL; } b = OOGLNewE(Bezier, "new Bezier"); *b = *ob; /* Copy all fields */ GGeomInit(b, BezierMethods(), BEZIERMAGIC, NULL); if (ob->CtrlPnts != NULL) { n = (b->degree_u + 1) * (b->degree_v + 1) * b->dimn; b->CtrlPnts = OOGLNewNE(float, n, "Bezier control points"); memcpy(b->CtrlPnts, ob->CtrlPnts, n * sizeof(float)); } if (ob->mesh != NULL && (b->geomflags & BEZ_REMESH) == 0) { /* just increment the refcount, no need to do a real copy * here; the mesh will be regenerated on demand as needed. */ b->mesh = REFGET(Mesh, ob->mesh); } else { b->mesh = NULL; } bez_make_meshhandle(b); return b; } void BezierDelete(Bezier *bezier) { if (bezier) { if (bezier->CtrlPnts != NULL) { OOGLFree(bezier->CtrlPnts); } if (bezier->mesh != NULL) { GeomDelete((Geom *)bezier->mesh); } if (bezier->meshhandle != NULL) { HandlePDelete(&bezier->meshhandle); } } } /* ZZZ: note: BezierCreate doesn't observe the copy directive: always copies pointers */ Bezier * BezierCreate( Bezier *exist, GeomClass *classp, va_list *a_list ) { Bezier *bezier; int attr, copy = 1, i; ColorA *color = NULL; if (exist == NULL) { bezier = OOGLNewE(Bezier, "BezierCreate Bezier"); memset(bezier, 0, sizeof(Bezier)); GGeomInit (bezier, classp, BEZIERMAGIC, NULL); bezier->CtrlPnts = NULL; bezier->nu = bezier->nv = 0; /* no mesh yet */ bezier->mesh = NULL; bez_make_meshhandle(bezier); } else { /* Check that exist is a Bezier. */ bezier = exist; } bezier->pdim = 4; /* hard-wired */ while ((attr = va_arg (*a_list, int))) switch (attr) { case CR_FLAG: bezier->geomflags = va_arg (*a_list, int); break; case CR_DEGU: bezier->degree_u = va_arg (*a_list, int); break; case CR_DEGV: bezier->degree_v = va_arg (*a_list, int); break; case CR_DIM: bezier->dimn = va_arg (*a_list, int); if (bezier->dimn == bezier->pdim) { bezier->geomflags |= VERT_4D; } break; case CR_NU: bezier->nu = va_arg (*a_list, int); break; case CR_NV: bezier->nv = va_arg (*a_list, int); break; case CR_POINT: bezier->CtrlPnts = va_arg (*a_list, float *); break; case CR_MESH: bezier->mesh = va_arg (*a_list, Mesh *); break; case CR_ST: memcpy(bezier->STCoords, va_arg(*a_list, TxST *), 4*sizeof(TxST)); break; case CR_COLOR: color = va_arg (*a_list, ColorA *); if (color != NULL) for (i=0; i<4; i++) bezier->c[i] = color[i]; break; default: if (GeomDecorate (bezier, ©, attr, a_list)) { OOGLError (0, "BezierCreate: undefined option: %d", attr); OOGLFree (bezier); return NULL; } } if (bezier->dimn > MAX_BEZ_DIMN) { OOGLError (0, "BezierCreate: dimension (%d) too high.", bezier->dimn); OOGLFree (bezier); return NULL; } if (exist != NULL) return exist; return bezier; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/bezier/Headers0000644000175000001440000000002307730236757015530 00000000000000bezier.h bezierP.h geomview-1.9.4/src/lib/gprim/Makefile.am0000644000175000001440000000030407730236720014776 00000000000000SUBDIRS = \ bbox \ bezier \ comment \ discgrp \ geom \ inst \ lincoln \ list \ mesh \ ndmesh \ npolylist \ polylist \ quad \ skel \ sphere \ stub \ tlist \ vect geomview-1.9.4/src/lib/gprim/Makefile.in0000644000175000001440000003773410665240502015022 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = \ bbox \ bezier \ comment \ discgrp \ geom \ inst \ lincoln \ list \ mesh \ ndmesh \ npolylist \ polylist \ quad \ skel \ sphere \ stub \ tlist \ vect all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/ndmesh/0000777000175000001440000000000010665240673014312 500000000000000geomview-1.9.4/src/lib/gprim/ndmesh/ndmeshtransform.c0000644000175000001440000000265710517455236017615 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "ndmeshP.h" /* */ NDMesh *NDMeshTransform(NDMesh *m, Transform T, TransformN *TN) { if (TN) { HPointN **p; int i, n = m->mdim[0] * m->mdim[1]; for (p = m->p, i = 0; i < n; i++, p++) { HPtNTransform(TN, *p, *p); HPtNDehomogenize(*p, *p); } } if (T) { HPointN **p; int i, n = m->mdim[0] * m->mdim[1]; for (p = m->p, i = 0; i < n; i++, p++) { HPtNTransform3(T, NULL, *p, *p); HPtNDehomogenize(*p, *p); } } return m; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/ndmesh/ndmeshsphere.c0000644000175000001440000000250010514010462017034 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "geom.h" #include "create.h" #include "ndmeshP.h" #include "sphere.h" Geom *NDMeshBoundSphere(NDMesh *mesh, Transform T, TransformN *TN, int *axes, int space) { Geom *sphere; /* Create a dummy sphere, the center will be corrected later */ sphere = GeomCreate("sphere", CR_SPACE, space, CR_END); SphereEncompassHPtNN((Sphere *)sphere, mesh->p, mesh->mdim[0]*mesh->mdim[1], T, TN, axes); return sphere; } geomview-1.9.4/src/lib/gprim/ndmesh/ndmesh.h0000644000175000001440000000361310523174717015656 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef NDMESHDEF #define NDMESHDEF #include "bbox.h" #include "meshflag.h" #ifndef NULL #define NULL 0 #endif #ifndef FALSE #define FALSE 0 #endif #define NDMESHMAGIC GeomMagic ('N', 1) typedef struct NDMesh NDMesh; extern GeomClass *NDMeshMethods( void ); extern char *NDMeshName( void ); extern NDMesh *NDMeshFLoad( IOBFILE *, char * ); extern NDMesh *NDMeshLoad( char * ); extern NDMesh *NDMeshSave( NDMesh *, char * ); extern NDMesh *NDMeshFSave( NDMesh *, FILE * ); extern BBox *NDMeshBound(NDMesh *, Transform T, TransformN *TN); extern Geom *NDMeshBoundSphere(NDMesh *mesh, Transform T, TransformN *TN, int *axes, int space); extern NDMesh *NDMeshDice( NDMesh *, int (*proc)() ); extern NDMesh *NDMeshDraw( NDMesh * ); extern NDMesh *NDMeshPick( NDMesh *, Pick *, Appearance *, Transform, TransformN *TN, int *axes ); extern NDMesh *NDMeshTransform(NDMesh *m, Transform T, TransformN *TN); #endif /*MESHDEF*/ geomview-1.9.4/src/lib/gprim/ndmesh/Makefile.am0000644000175000001440000000044110523174703016252 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libndmesh.la libndmesh_la_SOURCES = \ ndmeshbound.c ndmeshclass.c ndmeshcreate.c ndmeshdraw.c ndmeshload.c \ ndmeshsave.c ndmeshtransform.c ndmeshsphere.c \ ndmeshflag.h ndmesh.h ndmeshP.h ndmeshpick.c geomview-1.9.4/src/lib/gprim/ndmesh/Makefile.in0000644000175000001440000003711310665240503016270 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/gprim/ndmesh DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libndmesh_la_LIBADD = am_libndmesh_la_OBJECTS = ndmeshbound.lo ndmeshclass.lo \ ndmeshcreate.lo ndmeshdraw.lo ndmeshload.lo ndmeshsave.lo \ ndmeshtransform.lo ndmeshsphere.lo ndmeshpick.lo libndmesh_la_OBJECTS = $(am_libndmesh_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libndmesh_la_SOURCES) DIST_SOURCES = $(libndmesh_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libndmesh.la libndmesh_la_SOURCES = \ ndmeshbound.c ndmeshclass.c ndmeshcreate.c ndmeshdraw.c ndmeshload.c \ ndmeshsave.c ndmeshtransform.c ndmeshsphere.c \ ndmeshflag.h ndmesh.h ndmeshP.h ndmeshpick.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/ndmesh/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/ndmesh/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libndmesh.la: $(libndmesh_la_OBJECTS) $(libndmesh_la_DEPENDENCIES) $(LINK) $(libndmesh_la_OBJECTS) $(libndmesh_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshbound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshcreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshdraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshpick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshsave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshsphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndmeshtransform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/ndmesh/ndmeshbound.c0000644000175000001440000000622010622716755016702 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "bboxP.h" #include "ndmeshP.h" BBox *NDMeshBound(NDMesh *mesh, Transform T, TransformN *TN) { BBox *result; int n; HPoint3 min, max, tmp, clean; HPointN **p; if (mesh->meshd > 2) return NULL; n = mesh->mdim[0]*mesh->mdim[1]; /* more is not implemented yet */ p = mesh->p; /* First handle the case without transformations, this means that we * return an Nd bbox. */ if (!T && !TN) { HPointN *min; HPointN *max; min = HPtNCopy(p[0], NULL); HPtNDehomogenize(min, min); max = HPtNCopy(min, NULL); while(--n > 0) { HPtNMinMax(min, max, *(++p)); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, min, CR_NMAX, max, CR_END); HPtNDelete(min); HPtNDelete(max); return result; } if (TN) { /* Nd bounding box is requested, with transformation. */ HPointN *minN; HPointN *maxN; HPointN *ptN; BBox *result; minN = HPtNTransform(TN, p[0], NULL); HPtNDehomogenize(minN, minN); maxN = HPtNCopy(minN, NULL); ptN = HPtNCreate(TN->odim, NULL); while(--n > 0) { HPtNTransform(TN, *(++p), ptN); HPtNMinMax(minN, maxN, ptN); } result = (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_NMIN, minN, CR_NMAX, maxN, CR_END); HPtNDelete(ptN); HPtNDelete(minN); HPtNDelete(maxN); return result; } /* A 3d bbox is requested, with transformations */ if (T) { /* ordinary 3d transform, we simply operate on the x, y, z sub-space. */ HPtNToHPt3(*p, NULL, &min); HPt3Transform(T, &min, &min); HPt3Dehomogenize(&min, &min); max = min; while(--n > 0) { HPtNToHPt3(*(++p), NULL, &tmp); HPt3Transform(T, &tmp, &clean); HPt3MinMax(&min, &max, &clean); } /* At this point we are ready to generate a 3d bounding box */ return (BBox *)GeomCCreate(NULL, BBoxMethods(), CR_4MIN, &min, CR_4MAX, &max, CR_END); } return NULL; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/ndmesh/ndmeshdraw.c0000644000175000001440000001107610613453263016525 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "ndmeshP.h" #include "mesh.h" /* plain old 3-D mesh */ #include "mgP.h" #include "meshP.h" #include "mg.h" #include "hpointn.h" #include "bsptreeP.h" #include static void draw_projected_ndmesh(mgNDctx *NDctx, NDMesh *mesh) { Mesh m; HPointN **op; HPoint3 *np; int i, colored = 0, alpha = 0; int npts = mesh->mdim[0] * mesh->mdim[1]; mgNDmapfunc mapHPtN = NDctx->mapHPtN; Appearance *ap = &_mgc->astk->ap; Material *mat = &_mgc->astk->mat; int normal_need; memset(&m, 0, sizeof(m)); GGeomInit((Geom *)(void *)&m, MeshMethods(), MESHMAGIC, NULL); m.p = OOGLNewNE(HPoint3, npts, "projected points"); m.n = NULL; m.c = OOGLNewNE(ColorA, npts, "ND colors"); m.nu = mesh->mdim[0]; m.nv = mesh->mdim[1]; m.geomflags = mesh->geomflags & ~MESH_4D; if (ap->flag & APF_KEEPCOLOR) { colored = 0; } else { HPoint3 dummyv; ColorA dummyc; /* Dummy transform to determine whether we have ND colors or not */ colored = mapHPtN(NDctx, *mesh->p, &dummyv, &dummyc); } for(i = 0, op = mesh->p, np = m.p; i < npts; i++, op++, np++) { /* Set the point's first four components from our N-D mesh vertex */ if (colored) { mapHPtN(NDctx, *op, np, &m.c[i]); if (m.c[i].a < 1.0) { alpha = 1; } } else { mapHPtN(NDctx, *op, np, NULL); } } if (colored) { if (alpha) { m.geomflags |= COLOR_ALPHA; } else { m.geomflags &= ~COLOR_ALPHA; } m.geomflags |= MESH_C; } /* The drawing routines might need either polygon or vertex normals, * so if either is missing and either might be needed, we force it * to be computed. */ normal_need = 0; m.geomflags &= ~(MESH_N|MESH_NQ); if (ap->flag & APF_NORMALDRAW) { normal_need = MESH_N|MESH_NQ; } else if (ap->flag & APF_FACEDRAW) { switch (ap->shading) { case APF_FLAT: case APF_VCFLAT: normal_need |= MESH_NQ; break; case APF_SMOOTH: normal_need |= MESH_N; break; default: break; } if (GeomHasAlpha((Geom *)(void *)&m, ap)) { /* could re-use per quad normals here */ } } if (normal_need) { MeshComputeNormals(&m, normal_need); } if(_mgc->astk->flags & MGASTK_SHADER) { ColorA *c = colored ? m.c : (mat->override & MTF_DIFFUSE) ? NULL : mesh->c; if(c) { (*_mgc->astk->shader)(npts, m.p, m.n ? m.n : m.nq, c, mesh->c); } else { for(i = 0; i < npts; i++) { (*_mgc->astk->shader)(1, m.p + i, m.n + i, (ColorA *)&_mgc->astk->mat.diffuse, m.c + i); } } colored = 1; } mgmesh(MESH_MGWRAP(m.geomflags), m.nu, m.nv, m.p, m.n, m.nq, colored ? m.c : mesh->c, m.geomflags); /* Generate a BSP-tree if the object or parts of it might be * translucent. */ if (NDctx->bsptree && (m.geomflags & GEOM_ALPHA)) { GeomNodeDataMove((Geom *)mesh, (Geom *)(void *)&m); GeomBSPTree((Geom *)(void *)&m, NDctx->bsptree, BSPTREE_ADDGEOM); GeomNodeDataMove((Geom *)(void *)&m, (Geom *)mesh); } if (m.n) { OOGLFree(m.n); } if (m.nq) { OOGLFree(m.nq); } OOGLFree(m.p); OOGLFree(m.c); } NDMesh * NDMeshDraw(NDMesh *mesh) { mgNDctx *NDctx = NULL; mgctxget(MG_NDCTX, &NDctx); if(NDctx) { draw_projected_ndmesh(NDctx, mesh); } return mesh; } /* A dummy, just to make GeomBSPTree() not bail out. */ NDMesh *NDMeshBSPTree(NDMesh *mesh, BSPTree *tree, int action) { return mesh; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/ndmesh/ndmeshclass.c0000644000175000001440000000467710563130126016700 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "ndmeshP.h" static GeomClass *aNDMeshMethods = NULL; int NDMeshPresent = 1; static char ndmeshName[] = "ndmesh"; extern NDMesh *NDMeshCreate( va_list ); extern NDMesh *NDMeshDelete( NDMesh * ); extern NDMesh *NDMeshCopy( NDMesh * ); extern NDMesh *NDMeshBSPTree(NDMesh *mesh, BSPTree *tree, int action); char * NDMeshName() { return ndmeshName; } GeomClass *NDMeshMethods(void) { if (!aNDMeshMethods) { aNDMeshMethods = GeomClassCreate(ndmeshName); aNDMeshMethods->name = NDMeshName; aNDMeshMethods->methods = (GeomMethodsFunc *) NDMeshMethods; aNDMeshMethods->create = (GeomCreateFunc *) NDMeshCreate; aNDMeshMethods->Delete = (GeomDeleteFunc *) NDMeshDelete; aNDMeshMethods->fload = (GeomFLoadFunc *) NDMeshFLoad; aNDMeshMethods->fsave = (GeomFSaveFunc *) NDMeshFSave; aNDMeshMethods->bound = (GeomBoundFunc *) NDMeshBound; aNDMeshMethods->boundsphere = (GeomBoundSphereFunc *) NDMeshBoundSphere; aNDMeshMethods->draw = (GeomDrawFunc *) NDMeshDraw; aNDMeshMethods->bsptree = (GeomBSPTreeFunc *)NDMeshBSPTree; aNDMeshMethods->transform = (GeomTransformFunc *) NDMeshTransform; aNDMeshMethods->transformto = (GeomTransformToFunc *) NDMeshTransform; aNDMeshMethods->pick = (GeomPickFunc *) NDMeshPick; } return aNDMeshMethods; } geomview-1.9.4/src/lib/gprim/ndmesh/ndmeshflag.h0000644000175000001440000000244710455701003016500 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef MESHFLAGDEFS #define MESHFLAGDEFS #define MESH_UWRAP 0x1 #define MESH_VWRAP 0x2 #define MESH_C 0x4 #define MESH_N 0x8 #define MESH_U 0x10 #define MESH_D 0x20 #define MESH_EVERT 0x40 #define MESH_BINARY 0x80 #define MESH_Z 0x100 #define MESH_4D 0x200 /* Special 4-D flag to MeshCreate; not stored */ #endif /*MESHFLAGDEFS*/ geomview-1.9.4/src/lib/gprim/ndmesh/ndmeshload.c0000644000175000001440000001107510577535005016512 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "ndmeshP.h" static bool getmeshvert(IOBFILE *file, int flag, int pdim, int u, int v, HPointN **p, ColorA *c, TxST *st) { float inputs[128]; /* really plenty */ float *readv = flag&MESH_4D ? inputs : inputs+1; int readdim = flag&MESH_4D ? pdim : pdim - 1; int binary = flag&MESH_BINARY; inputs[0] = 1.0; if (iobfgetnf(file, readdim, readv, binary) < readdim) { return false; } *p = HPtNCreate(pdim, inputs); if ((flag & MESH_C) && iobfgetnf(file, 4, (float *)c, binary) < 4) { return false; } if (flag & MESH_U && iobfgetnf(file, 2, (float *)st, binary) < 2) { return false; } else { /* consume unused "r" component for compatibility */ float dummy; int c; if ((c = iobfnextc(file, 1)) != '\n' && c != '}' && c != EOF) { if (iobfgetnf(file, 1, &dummy, 0) < 1) { return false; } } } return true; } static int getheader(IOBFILE *file, const char *fname, int *dimp) { int i, flag; char *token; static char keys[] = "UCN4HUuv"; static short bit[] = { MESH_U, MESH_C, MESH_N, MESH_4D, MESH_4D, MESH_U, MESH_UWRAP, MESH_VWRAP }; /* Parse [U][C][N][Z][4][u][v]MESH[ BINARY]\n */ flag = 0; token = GeomToken(file); for(i = 0; keys[i] != '\0'; i++) { if (*token == keys[i]) { flag |= bit[i]; token++; } } if (strcmp(token, "nMESH")) return -1; if (iobfgetni(file, 1, dimp, 0) <= 0) return -1; if (*dimp < 4) { OOGLSyntax(file, "Reading nMESH from \"%s\": dimension %d < 4", fname, *dimp); } (*dimp)++; if (iobfnextc(file, 1) == 'B') { if (iobfexpectstr(file, "BINARY")) return(-1); flag |= MESH_BINARY; if (iobfnextc(file, 1) == '\n') (void) iobfgetc(file); /* Toss \n */ } return flag; } NDMesh * NDMeshFLoad(IOBFILE *file, char *fname) { NDMesh m; int n; int i, u, v; int size[2]; int binary; if (!file) return NULL; if ((m.geomflags = getheader(file, fname, &m.pdim)) == -1) return NULL; m.meshd = 2; /* Hack. Should allow general meshes */ binary = m.geomflags & MESH_BINARY; if (iobfgetni(file, m.meshd, size, binary) < 2) { OOGLSyntax(file,"Reading nMESH from \"%s\": expected mesh grid size", fname); return NULL; } if (size[0] <= 0 || size[1] <= 0 || size[0] > 9999999 || size[1] > 9999999) { OOGLSyntax(file,"Reading nMESH from \"%s\": invalid mesh size %d %d", fname,size[0],size[1]); return NULL; } n = size[0] * size[1]; m.p = OOGLNewNE(HPointN *, n, "NDMeshFLoad: vertices"); m.u = NULL; m.c = NULL; if (m.geomflags & MESH_C) { m.c = OOGLNewNE(ColorA, n, "NDMeshFLoad: colors"); } if (m.geomflags & MESH_U) { m.u = OOGLNewNE(TxST, n, "NDMeshFLoad: texture coords"); } for (i = 0, v = 0; v < size[1]; v++) { for (u = 0; u < size[0]; u++, i++) { if (getmeshvert(file, m.geomflags, m.pdim, u, v, &m.p[i], &m.c[i], &m.u[i]) == 0) { OOGLSyntax(file, "Reading nMESH from \"%s\": bad element (%d,%d) of (%d,%d)", fname, u, v, size[0], size[1]); return NULL; } } } return (NDMesh *)GeomCCreate(NULL, NDMeshMethods(), CR_NOCOPY, CR_MESHDIM, 2, CR_MESHSIZE, size, CR_DIM, m.pdim-1, CR_4D, (m.geomflags & MESH_4D), CR_FLAG, m.geomflags, CR_POINT4, m.p, CR_COLOR, m.c, CR_U, m.u, CR_END); } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/ndmesh/ndmeshP.h0000644000175000001440000000357710577535005016007 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef NDMESHPDEF #define NDMESHPDEF #include "geomclass.h" #include "hpointn.h" #include "ndmesh.h" struct NDMesh { GEOMFIELDS; int seq; /* cH: what is this??? */ int meshd; /* mesh dimension */ int *mdim; /* mesh size, indexed 0..meshd-1 */ HPointN **p; /* N-D vertices; dim[0] axis varies fastest */ ColorA *c; /* vertex colors, indexed likewise */ TxST *u; /* texture coordinates, should we need any */ }; /* NOTE that these meshes may have missing vertices; some of the p[] * and c[] entries may be NULL. */ /* * mesh indexing: * given a mesh index vector (of length 'meshd') i[0] i[1] ... i[meshd-1] * the corresponding index into the p[] and c[] arrays is given by * index = 0; size = 1; * for(k = 0; k < meshd; k++) { index += size*i[k]; size *= dim[k]; } */ #endif /* ! NDMESHPDEF */ geomview-1.9.4/src/lib/gprim/ndmesh/ndmeshpick.c0000644000175000001440000001002510622716755016517 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "ndmeshP.h" #include "pickP.h" #include "appearance.h" /* from meshP.h, works only has long as mdim is fixed at 2 */ #define MESHINDEX(u, v, mesh) \ (((v)%(mesh)->mdim[1])*(mesh)->mdim[0] + ((u)%(mesh)->mdim[0])) #define MESHPOINT(u, v, mesh, plist) ((plist)[MESHINDEX(u, v, mesh)]) NDMesh * NDMeshPick(NDMesh *mesh, Pick *pick, Appearance *ap, Transform T, TransformN *TN, int *axes) { Point3 plist[4]; int nu, nv, maxnu, maxnv; int foundu, foundv; unsigned int apflag = 0; HPt3Coord xa, xb, xc, xd; if (!TN) return NULL; /* no 3d pick for ND object. */ if (mesh->meshd > 2) return NULL; foundu = foundv = -1; maxnu = mesh->mdim[0]; maxnv = mesh->mdim[1]; /* Make sure that vects do not as visible - otherwise they * will wreak havoc with the edge picking stuff. */ if (ap != NULL) { apflag = ap->flag; ap->flag &= ~APF_VECTDRAW; } for (nv = 0; nv < ((mesh->geomflags & MESH_VWRAP) ? maxnv : maxnv-1); nv++) { for (nu =0; nu < ((mesh->geomflags & MESH_UWRAP) ? maxnu : maxnu-1); nu++) { /* Demand that at least 1 of the vertices be in front of the viewer. * Note: we must ensure that all four are evaluated! */ xa = HPtNNTransPt3(TN, axes, MESHPOINT(nu, nv, mesh, mesh->p), &plist[0]); xb = HPtNNTransPt3(TN, axes, MESHPOINT(nu+1, nv, mesh, mesh->p), &plist[1]); xc = HPtNNTransPt3(TN, axes, MESHPOINT(nu+1, nv+1, mesh, mesh->p), &plist[2]); xd = HPtNNTransPt3(TN, axes, MESHPOINT(nu, nv+1, mesh, mesh->p), &plist[3]); if((0 < xa) || (0 < xb) || (0 < xc) || (0 < xd)) { if (PickFace(4, plist, pick, ap)) { foundu = nu; foundv = nv; } } } } if (ap != NULL) ap->flag = apflag; if (foundu == -1) return NULL; if (pick->found & PW_VERT) { pick->vi = MESHINDEX(foundu + ((pick->vi == 1 || pick->vi == 2) ? 1 : 0), foundv + pick->vi/2, mesh); HPtNTransformComponents(TN, mesh->p[pick->vi], axes, &pick->v); } if (pick->found & PW_EDGE) { pick->ei[0] = MESHINDEX(foundu + ((pick->ei[0] == 1 || pick->ei[0] == 2) ? 1 : 0), foundv + pick->ei[0]/2, mesh); pick->ei[1] = MESHINDEX(foundu + ((pick->ei[1] == 1 || pick->ei[1] == 2) ? 1 : 0), foundv + pick->ei[1]/2, mesh); HPtNTransformComponents(TN, mesh->p[pick->ei[0]], axes, &pick->e[0]); HPtNTransformComponents(TN, mesh->p[pick->ei[1]], axes, &pick->e[1]); } if (pick->found & PW_FACE) { if(pick->f) OOGLFree(pick->f); pick->f = OOGLNewNE(HPoint3, 4, "Mesh pick"); pick->fi = MESHINDEX(foundu, foundv, mesh); HPtNTransformComponents(TN, MESHPOINT(foundu, foundv, mesh, mesh->p), axes, &pick->f[0]); HPtNTransformComponents(TN, MESHPOINT(foundu+1, foundv, mesh, mesh->p), axes, &pick->f[1]); HPtNTransformComponents(TN, MESHPOINT(foundu+1, foundv+1, mesh, mesh->p), axes, &pick->f[2]); HPtNTransformComponents(TN, MESHPOINT(foundu, foundv+1, mesh, mesh->p), axes, &pick->f[3]); } if (TN) { pick->TprimN = TmNCopy(TN, pick->TprimN); memcpy(pick->axes, axes, sizeof(pick->axes)); } else TmCopy(T, pick->Tprim); return mesh; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/ndmesh/ndmeshsave.c0000644000175000001440000000551010577535005016526 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "ndmeshP.h" NDMesh * NDMeshFSave(NDMesh *m, FILE *outf) { int i, j, k, wdim, offset; HPointN **p = m->p; ColorA *c = m->c; TxST *u = m->u; if (!outf || !m) return NULL; if (m->c == NULL) m->geomflags &= ~MESH_C; if (m->u == NULL) m->geomflags &= ~MESH_U; wdim = m->pdim; if (m->geomflags & MESH_C) fputc('C', outf); if (m->geomflags & VERT_4D) { fputc('4', outf); offset = 0; } else { --wdim; offset = 1; } if (m->geomflags & MESH_U) fputc('U', outf); if (m->geomflags & MESH_UWRAP) fputc('u', outf); if (m->geomflags & MESH_VWRAP) fputc('v', outf); /* dim is always pdim-1, even for 4nMESH */ fprintf(outf, "nMESH %d", m->pdim-1); if (m->geomflags & MESH_BINARY) { /* Hack -- should be sent by context */ fprintf(outf, "BINARY\n"); fwrite(&m->mdim, sizeof(int), m->meshd, outf); for (i = 0; i < m->mdim[1]; i++) { for (j = 0; j < m->mdim[0]; j++) { fwrite((*p)->v+offset, sizeof(float), wdim, outf); p++; if (m->geomflags & MESH_C) { fwrite(c, 4, 4, outf); c++; } if (m->geomflags & MESH_U) { fwrite(u, 4, 3, outf); u++; } } } } else { fprintf(outf, "\n%d %d\n", m->mdim[0], m->mdim[1]); for (i = 0; i < m->mdim[1]; i++) { for (j = 0; j < m->mdim[0]; j++) { for(k = 0; k < wdim; k++) fprintf(outf, "%g ", (*p)->v[k+offset]); p++; if (m->geomflags & MESH_C) { fprintf(outf, " %.3g %.3g %.3g %.3g ", c->r, c->g, c->b, c->a); c++; } if (m->geomflags & MESH_U) { fprintf(outf, " %g %g 0", u->s, u->t); u++; } fputc('\n', outf); } fputc('\n', outf); } } return m; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/ndmesh/Headers0000644000175000001440000000004007730237402015511 00000000000000ndmesh.h ndmeshP.h ndmeshflag.h geomview-1.9.4/src/lib/gprim/ndmesh/ndmeshcreate.c0000644000175000001440000001130110622716755017032 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "ndmeshP.h" static int ndmeshfield(int copy, int amount, void **fieldp, void *value, char *name); static int ndmeshsize(NDMesh *m) { int i, s; for(i = m->meshd, s = 1; --i >= 0; ) s *= m->mdim[i]; return s; } static void tosspoints(NDMesh *m) { int n; HPointN **p; if(m->mdim && m->p) { for(n = ndmeshsize(m), p = m->p; --n >= 0; p++) if(*p) HPtNDelete( *p ); } } static void tossmesh(NDMesh *m) { tosspoints(m); if(m->p) OOGLFree(m->p); if(m->c) OOGLFree(m->c); if(m->u) OOGLFree(m->u); m->p = NULL; m->c = NULL; m->u = NULL; } NDMesh * NDMeshCreate (NDMesh *exist, GeomClass *classp, va_list *a_list) { NDMesh *m; int attr, copy = 1; int i; int npts; ColorA *c; c = NULL; if (exist == NULL) { m = OOGLNewE(NDMesh, "NDMeshCreate mesh"); memset(m, 0, sizeof(NDMesh)); GGeomInit (m, classp, NDMESHMAGIC, NULL); m->geomflags = 0; m->meshd = 2; m->mdim = OOGLNewNE(int, m->meshd, "NDMesh dim"); memset(m->mdim, 0, m->meshd * sizeof(int)); } else { /* Check that exist is a NDMesh... */ m = exist; } npts = ndmeshsize( m ); while ((attr = va_arg (*a_list, int))) switch (attr) { case CR_FLAG: m->geomflags = va_arg (*a_list, int); break; case CR_MESHDIM: i = va_arg (*a_list, int); if(i <= 0 || i >= 1000) { OOGLError(1, "Incredible NDMesh dimension %d", i); return NULL; } m->meshd = i; OOGLFree(m->mdim); m->mdim = OOGLNewNE(int, m->meshd, "NDMesh dim"); memset(m->mdim, 0, m->meshd * sizeof(int)); tossmesh(m); npts = 0; break; case CR_MESHSIZE: memcpy(m->mdim, va_arg (*a_list, int *), m->meshd*sizeof(int)); tossmesh(m); npts = ndmeshsize(m); break; case CR_DIM: m->pdim = va_arg(*a_list, int); if (m->pdim < 4) { OOGLError(1, "Dimension %d < 4", m->pdim); return NULL; } m->pdim++; /* should be the projective dimension */ break; case CR_POINT: case CR_POINT4: tosspoints(m); ndmeshfield(copy, npts*sizeof(HPointN *), (void **)(void *)&m->p, (void *)va_arg (*a_list, HPointN **), "ND mesh points"); break; case CR_U: m->geomflags = (m->geomflags & ~MESH_U) | (MESH_U & ndmeshfield(copy, npts*sizeof(TxST), (void **)(void *)&m->u, (void *)va_arg (*a_list, TxST *), "ndmesh texture coords")); break; case CR_COLOR: m->geomflags &= ~COLOR_ALPHA; m->geomflags = (m->geomflags & ~MESH_C) | (MESH_C & ndmeshfield(copy, npts*sizeof(ColorA), (void **)(void *)&m->c, (void *)(c = va_arg (*a_list, ColorA *)), "ndmesh colors")); break; default: if (GeomDecorate (m, ©, attr, a_list)) { GeomError (0, "NDMeshCreate: Undefined option: %d", attr); OOGLFree (m); return NULL; } } if (c) { int i; for (i = 0; i < m->mdim[0]*m->mdim[1]; i++) { if (m->c[i].a < 1.0) { m->geomflags |= COLOR_ALPHA; } } } return m; } static int ndmeshfield(int copy, int amount, void **fieldp, void *value, char *name) { if(value) { if(copy) { if(*fieldp == NULL) *fieldp = OOGLNewNE(char, amount, name); memcpy(*fieldp, value, amount); } else { if(*fieldp) OOGLFree(*fieldp); *fieldp = value; } return ~0; } else { if(*fieldp) OOGLFree(*fieldp); *fieldp = NULL; return 0; } } NDMesh * NDMeshDelete(NDMesh *m) { if (m) { tossmesh(m); OOGLFree(m->mdim); } return NULL; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/gprim/sphere/0000777000175000001440000000000010665240674014323 500000000000000geomview-1.9.4/src/lib/gprim/sphere/spheredice.c0000644000175000001440000001022110636353760016511 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "sphereP.h" Sphere *SphereDice(Sphere *sphere, int nu, int nv) { if (nu < 2) nu = SPHERE_DEFAULT_MESH_SIZE; if (nv < 2) nv = SPHERE_DEFAULT_MESH_SIZE; if (nu != sphere->ntheta || nv != sphere->nphi) { sphere->geomflags |= SPHERE_REMESH; sphere->ntheta = nu; sphere->nphi = nv; } return sphere; } void SphereReDice(Sphere *sphere) { Geom *facet; Point3 *spherepoints; Point3 *spherenormals; TxST *spheretexcoord = NULL; int npts; float theta, phi, thetafrac, phifrac, x, y, z, r; float phiscale, thetascale, thetastart; int i, j, ptno, nphi, ntheta; nphi = sphere->nphi; phiscale = 0.25; ntheta = sphere->ntheta; thetascale = 0.5; thetastart = 0; switch (sphere->geomflags & SPHERE_TXMASK) { case SPHERE_TXSTEREOGRAPHIC: ntheta = 2*sphere->ntheta; thetastart = -0.5; thetascale = 1.0; break; case SPHERE_TXSINUSOIDAL: nphi = 4*sphere->nphi; phiscale = 1.0; break; } npts = nphi * ntheta; spherepoints = OOGLNewNE(Point3, npts, "sphere mesh points"); spherenormals = OOGLNewNE(Point3, npts, "sphere mesh normals"); if ((sphere->geomflags & SPHERE_TXMASK) != SPHERE_TXNONE) { spheretexcoord = OOGLNewNE(TxST, npts, "sphere texture coords"); } /* Generate the part of the sphere in the positive quadrant, after * translating into the center-of-mass co-ordinate system. * * The +z pole is at \theta = +\pi/2. The minimal resolution will * yield an Octahedron. */ for (ptno = j = 0; j < ntheta; j++) { thetafrac = thetascale * (float)j / (float)(ntheta-1); theta = (thetastart + thetafrac) * M_PI; r = cos(theta); z = sin(theta); for (i = 0; i < nphi; i++) { phifrac = phiscale * (float)i / (float)(nphi-1); phi = 2.0 * phifrac * M_PI; spherenormals[ptno].x = x = cos(phi) * r; spherenormals[ptno].y = y = sin(phi) * r; spherenormals[ptno].z = z; Pt3Copy(spherenormals + ptno, spherepoints + ptno); Pt3Mul(sphere->radius, spherepoints + ptno, spherepoints + ptno); switch (sphere->geomflags & SPHERE_TXMASK) { case SPHERE_TXNONE: break; case SPHERE_TXSINUSOIDAL: spheretexcoord[ptno].s = 0.5 + r * (phifrac - 0.5); spheretexcoord[ptno].t = 0.5 + thetafrac; break; case SPHERE_TXCYLINDRICAL: spheretexcoord[ptno].s = phifrac; spheretexcoord[ptno].t = 0.5 + thetafrac; break; case SPHERE_TXRECTANGULAR: spheretexcoord[ptno].s = phifrac; spheretexcoord[ptno].t = 0.5 * (z + 1.0); break; case SPHERE_TXSTEREOGRAPHIC: spheretexcoord[ptno].s = 0.5 + x / (1.0 + (z < -0.9999 ? -0.9999 : z)); spheretexcoord[ptno].t = 0.5 + y / (1.0 + (z < -0.9999 ? -0.9999 : z)); break; case SPHERE_ONEFACE: spheretexcoord[ptno].s = 0.5 * (x + 1.0); spheretexcoord[ptno].t = 0.5 * (z + 1.0); break; } ++ptno; } } facet = GeomCCreate(NULL, MeshMethods(), CR_NOCOPY, CR_NV, ntheta, CR_NU, nphi, CR_POINT, spherepoints, CR_NORMAL, spherenormals, spheretexcoord ? CR_U : CR_END, spheretexcoord, CR_END); if (facet == NULL) { OOGLError(1, "SphereReDice: can't create Mesh"); } HandleSetObject(sphere->geomhandle, (Ref *)facet); sphere->geomflags &= ~SPHERE_REMESH; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/sphere/spheredraw.c0000644000175000001440000000432410576546213016551 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "mg.h" #include "sphereP.h" #include "bsptreeP.h" static inline bool check_remesh(Sphere *sphere, const Appearance *ap) { if (sphere->geomflags & SPHERE_REMESH) { return true; } if (ap->valid & APF_DICE) { if (sphere->ntheta == ap->dice[0] && sphere->nphi == ap->dice[1]) { return false; } sphere->ntheta = ap->dice[0]; sphere->nphi = ap->dice[1]; sphere->geomflags |= SPHERE_REMESH; return true; } return false; } Sphere * SphereDraw(Sphere *sphere) { /* the mesh is generated lazily on demand, so do it now if necessary */ if (check_remesh(sphere, mggetappearance())) { SphereReDice(sphere); } /* then just call the method from the base-class */ return (Sphere *)sphere->Class->super->draw((Geom *)sphere); } Sphere *SphereBSPTree(Sphere *sphere, BSPTree *bsptree, int action) { /* no need to do stuff if we cannot be translucent */ if (never_translucent((Geom *)sphere)) { return sphere; } /* the mesh is generated lazily on demand, so do it now if necessary */ if (action == BSPTREE_ADDGEOM && (sphere->geomflags & SPHERE_REMESH)) { SphereReDice(sphere); } /* and now call the method from the base class */ return (Sphere *)sphere->Class->super->bsptree((Geom *)sphere, bsptree, action); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/sphere/sphereload.c0000644000175000001440000000562110577535006016533 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "geom.h" #include "geomclass.h" #include "transform.h" #include "sphereP.h" static const char *texmap[] = { "SINUSOIDAL", "CYLINDRICAL", "RECTANGULAR", "STEREOGRAPHIC", "ONEFACE", NULL }; Sphere *SphereFLoad(IOBFILE *file, char *fname) { HPoint3 center; float radius; Geom *sphere; char *token; int space, i, c; unsigned txmapmeth = SPHERE_TXCYLINDRICAL; bool tex = false; if (file == NULL) return NULL; space = TM_EUCLIDEAN; token = GeomToken(file); if (token[0] == 'S' && token[1] == 'T') { tex = true; token += 2; } switch(*token) { case 'E': space = TM_EUCLIDEAN; token++; break; case 'H': space = TM_HYPERBOLIC; token++; break; case 'S': if(token[1] == 'S') { space = TM_SPHERICAL; token++; } break; } if(strcmp(token, "SPHERE") != 0) { return NULL; } GeomAcceptToken(); if (tex) { c = iobfnextc(file, 0); for (i = 0; texmap[i] != NULL; i++) { if (c == (int)texmap[i][0]) { break; } } if (texmap[i] != NULL) { token = GeomToken(file); for (i = 0; texmap[i] != NULL; i++) { if (strcmp(texmap[i], token) == 0) { break; } } if (texmap[i] == NULL) { OOGLSyntax(file, "%s: SPHERE: expected texture mapping method", fname); return NULL; } txmapmeth = GEOMFLAG((i+1) << 1); } } if (iobfgetnf(file, 1, &radius, 0) != 1 || iobfgetnf(file, 3, ¢er.x, 0) != 3) { OOGLSyntax(file, "%s: SPHERE: expected radius, then x y z", fname); return NULL; } center.w = 1.0; sphere = GeomCreate("sphere", CR_RADIUS, (double)radius, CR_CENTER, ¢er, CR_SPACE, space, tex ? CR_SPHERETX : CR_END, txmapmeth, CR_END); return (Sphere *)sphere; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/sphere/spheremisc.c0000644000175000001440000003142110622716756016550 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "geom.h" #include "geomclass.h" #include "transform.h" #include "sphereP.h" #include "hpoint3.h" #ifndef FUDGE #define FUDGE 1e-6 #endif void SphereMinMax(Sphere *sphere, HPoint3 *min, HPoint3 *max) { Geom *bbox; bbox = GeomBound((Geom *)sphere, TM_IDENTITY, NULL); BBoxMinMax((BBox *)bbox, min, max); GeomDelete(bbox); HPt3Dehomogenize(min, min); HPt3Dehomogenize(max, max); } void SphereCenter(Sphere *sphere, HPoint3 *center) { *center = sphere->center; } float SphereRadius(Sphere *sphere) { return sphere->radius; } void SphereSwitchSpace(Sphere *sphere, int space) { Transform T; sphere->space = space; TmScale(sphere->axis, sphere->radius, sphere->radius, sphere->radius); TmSpaceTranslate(T, sphere->center.x, sphere->center.y, sphere->center.z, sphere->space); GeomTransform((Geom*)sphere, T, NULL); } Sphere *SphereUnion3(Sphere *a, Sphere *b, Sphere *dest) { int space; HPoint3 center, diff; float radius = 0.0; if (a == NULL && b == NULL) return NULL; space = (a != NULL) ? a->space : b->space; if (dest == NULL) dest = (Sphere *)GeomCreate("sphere", CR_SPACE, space, CR_END); if (a == NULL || b == NULL) { if (a == NULL) { radius = b->radius; center = b->center; space = b->space; } else if (b == NULL) { radius = a->radius; center = a->center; space = a->space; } GeomSet((Geom*)dest, CR_RADIUS, radius, CR_CENTER, ¢er, CR_SPACE, space, CR_END); } else { if (a->space != b->space) OOGLError(1, "Uniting two spheres existing in different spaces."); space = a->space; if (space != TM_EUCLIDEAN) OOGLError(1, "SphereUnion3 currently only works reliably in\n%s", "Euclidean space."); HPt3Sub(&b->center, &a->center, &diff); Pt3Unit((Point3*)(void *)&diff); center.x = b->center.x + diff.x*b->radius; center.y = b->center.y + diff.y*b->radius; center.z = b->center.z + diff.z*b->radius; center.w = 1.0; GeomSet((Geom*)dest, CR_RADIUS, a->radius, CR_CENTER, &a->center, CR_END); SphereAddHPt3(dest, ¢er, TM_IDENTITY); } return dest; } void SphereEncompassBoundsN(Sphere *sphere, HPoint3 *points, int dim) { int i, j; float span, maxspan; HPoint3 *d1, *d2, center; d1 = d2 = &points[0]; maxspan = 0.0; for (i = 0; i < 2*dim; i++) for (j = i+1; j < 2*dim; j++) { span = HPt3SpaceDistance(&points[i], &points[j], sphere->space); if (span > maxspan) { maxspan = span; d1 = &points[i]; d2 = &points[j]; } } /* Find the midpoint here - this will not work in non-Euclidean space */ center.x = (d1->x/d1->w + d2->x/d2->w) / 2.0; center.y = (d1->y/d1->w + d2->y/d2->w) / 2.0; center.z = (d1->z/d1->w + d2->z/d2->w) / 2.0; center.w = 1.0; GeomSet((Geom *)sphere, CR_RADIUS, maxspan / 2.0, CR_CENTER, ¢er, CR_END); } void SphereEncompassBounds(Sphere *sphere, HPoint3 *points) { SphereEncompassBoundsN(sphere, points, 3); } int SphereAddHPt3(Sphere *sphere, HPoint3 *point, Transform T) { float radius, old_to_p, old_to_new; HPoint3 center, newpoint; HPt3Transform(T, point, &newpoint); if(newpoint.w != 1) HPt3Dehomogenize(&newpoint, &newpoint); old_to_p = HPt3SpaceDistance(&newpoint, &sphere->center, sphere->space); if (old_to_p > sphere->radius) { radius = (sphere->radius + old_to_p) / 2.0; old_to_new = old_to_p - radius; center.x = sphere->center.x + (newpoint.x - sphere->center.x)*old_to_new / old_to_p; center.y = sphere->center.y + (newpoint.y - sphere->center.y)*old_to_new / old_to_p; center.z = sphere->center.z + (newpoint.z - sphere->center.z)*old_to_new / old_to_p; center.w = 1.0; GeomSet((Geom *)sphere, CR_RADIUS, radius, CR_CENTER, ¢er, CR_END); return 1; } else return 0; } int SphereAddHPt3N(Sphere *sphere, HPoint3 *point, int n, Transform T) { int i, ans = 0; for (i = 0; i < n; i++) ans |= SphereAddHPt3(sphere, &point[i], T); return ans; } void SphereEncompassHPt3N(Sphere *sphere, HPoint3 *point, int n, Transform T) { int i; HPoint3 spanPts[6]; if (!n) return; spanPts[0] = point[0]; HPt3Dehomogenize(&spanPts[0], &spanPts[0]); for (i = 1; i < 6; i++) { spanPts[i] = spanPts[0]; } MaxDimensionalSpanN(spanPts, point+1, n-1); HPt3TransformN(T, spanPts, spanPts, 6); SphereEncompassBounds(sphere, spanPts); SphereAddHPt3N(sphere, point, n, T); } /* 0 has min x, 1 has max x, 2 has min y... */ void MaxDimensionalSpan(HPoint3 *spanPts, HPoint3 *point) { HPoint3 pt; if(point->w != 1 && point->w != 0) { HPt3Dehomogenize(point, &pt); point = &pt; } if (point->x < spanPts[0].x) spanPts[0] = *point; else if (point->x > spanPts[1].x) spanPts[1] = *point; if (point->y < spanPts[2].y) spanPts[2] = *point; else if (point->y > spanPts[3].y) spanPts[3] = *point; if (point->z < spanPts[4].z) spanPts[4] = *point; else if (point->z > spanPts[5].z) spanPts[5] = *point; } void MaxDimensionalSpanN(HPoint3 *spanPts, HPoint3 *points, int n) { int i; for (i = 0; i < n; i++) { MaxDimensionalSpan(spanPts, &points[i]); } } /* Same stuff as above, but for HPointN case */ int SphereAddHPtN(Sphere *sphere, HPointN *point, Transform T, TransformN *TN, int *axes) { float radius, old_to_p, old_to_new; HPoint3 center, newpoint, tmp; if (TN) { HPtNTransformComponents(TN, point, axes, &newpoint); } else { HPtNToHPt3(point, axes, &tmp); HPt3Transform(T, &tmp, &newpoint); } HPt3Dehomogenize(&newpoint, &newpoint); old_to_p = HPt3SpaceDistance(&newpoint, &sphere->center, sphere->space); if (old_to_p > sphere->radius) { radius = (sphere->radius + old_to_p) / 2.0; old_to_new = old_to_p - radius; center.x = sphere->center.x + (newpoint.x - sphere->center.x)*old_to_new / old_to_p; center.y = sphere->center.y + (newpoint.y - sphere->center.y)*old_to_new / old_to_p; center.z = sphere->center.z + (newpoint.z - sphere->center.z)*old_to_new / old_to_p; center.w = 1.0; GeomSet((Geom *)sphere, CR_RADIUS, radius, CR_CENTER, ¢er, CR_END); return 1; } else { return 0; } } int SphereAddHPtNN(Sphere *sphere, HPointN **point, int n, Transform T, TransformN *TN, int *axes) { int i, ans = 0; for (i = 0; i < n; i++) ans |= SphereAddHPtN(sphere, point[i], T, TN, axes); return ans; } void SphereEncompassHPtNN(Sphere *sphere, HPointN **point, int n, Transform T, TransformN *TN, int *axes) { int i, dim = point[0]->dim-1; HPointN **spanPts; HPoint3 *spanPts3; if (!n) return; spanPts = alloca(2*dim*sizeof(HPointN *)); spanPts3 = alloca(2*dim*sizeof(HPoint3)); spanPts[0] = HPtNCopy(point[0], NULL); HPtNDehomogenize(spanPts[0], spanPts[0]); for (i = 1; i < 2*dim; i++) { spanPts[i] = HPtNCopy(spanPts[0], NULL); } MaxDimensionalSpanHPtNN(spanPts, point+1, n-1); if (TN) { for (i = 0; i < 2*dim; i++) { HPtNTransformComponents(TN, spanPts[i], axes, &spanPts3[i]); HPtNDelete(spanPts[i]); } } else { HPoint3 tmp; for (i = 0; i < 2*dim; i++) { HPtNToHPt3(spanPts[i], axes, &tmp); HPt3Transform(T, &tmp, &spanPts3[i]); HPtNDelete(spanPts[i]); } } SphereEncompassBoundsN(sphere, spanPts3, dim); SphereAddHPtNN(sphere, point, n, T, TN, axes); } /* 0 has min x, 1 has max x, 2 has min y... */ void MaxDimensionalSpanHPtN(HPointN **spanPts, HPointN *point) { int dim = point->dim, i; HPointN tmp; if (point->v[dim-1] != 1 && point->v[dim-1] != 0) { tmp.dim = dim; tmp.flags = 0; tmp.v = alloca(dim*sizeof(float)); point = HPtNCopy(point, &tmp); HPtNDehomogenize(point, point); } for (i = 0; i < dim-1; i++) { if (point->v[i] < spanPts[2*i]->v[i]) HPtNCopy(point, spanPts[2*i]); else if (point->v[i] > spanPts[2*i+1]->v[i]) HPtNCopy(point, spanPts[2*i+1]); } } void MaxDimensionalSpanHPtNN(HPointN **spanPts, HPointN **points, int n) { int i; for (i = 0; i < n; i++) { MaxDimensionalSpanHPtN(spanPts, points[i]); } } /* Same as above, but for contiguous data, as used in mesh, ndmesh, * npolylist, skel, can be used for VERT_4D case. */ int SphereAddPoint(Sphere *sphere, float *point, int vert_4d, int pdim, Transform T, TransformN *TN, int *axes) { float radius, old_to_p, old_to_new; HPoint3 center, newpoint, tmp3; HPointN tmp; HPtNCoord v[5]; tmp.flags = 0; if (pdim == 4) { tmp.v = v; if (vert_4d) { tmp.dim = 5; Pt4ToHPtN((HPoint3 *)point, &tmp); } else { tmp.dim = 4; HPt3ToHPtN((HPoint3 *)point, NULL, &tmp); } } else { tmp.v = point; tmp.dim = pdim; } if (TN) { HPtNTransformComponents(TN, &tmp, axes, &newpoint); } else { HPtNToHPt3(&tmp, axes, &tmp3); HPt3Transform(T, &tmp3, &newpoint); } HPt3Dehomogenize(&newpoint, &newpoint); old_to_p = HPt3SpaceDistance(&newpoint, &sphere->center, sphere->space); if (old_to_p > sphere->radius) { radius = (sphere->radius + old_to_p) / 2.0; old_to_new = old_to_p - radius; center.x = sphere->center.x + (newpoint.x - sphere->center.x)*old_to_new / old_to_p; center.y = sphere->center.y + (newpoint.y - sphere->center.y)*old_to_new / old_to_p; center.z = sphere->center.z + (newpoint.z - sphere->center.z)*old_to_new / old_to_p; center.w = 1.0; GeomSet((Geom *)sphere, CR_RADIUS, radius, CR_CENTER, ¢er, CR_END); return 1; } else { return 0; } } int SphereAddPoints(Sphere *sphere, float *point, int vert_4d, int pdim, int n, Transform T, TransformN *TN, int *axes) { int i, ans = 0; for (i = 0; i < n; i++, point += pdim) { ans |= SphereAddPoint(sphere, point, vert_4d, pdim, T, TN, axes); } return ans; } void SphereEncompassPoints(Sphere *sphere, float *points, int vert_4d, int pdim, int n, Transform T, TransformN *TN, int *axes) { int i, dim; HPointN **spanPts; HPoint3 *spanPts3; if (!n) return; if (pdim != 4) vert_4d = 0; dim = vert_4d ? pdim : pdim - 1; spanPts = alloca(2*dim*sizeof(HPointN *)); spanPts3 = alloca(2*dim*sizeof(HPoint3)); if (pdim == 4) { if (vert_4d) { spanPts[0] = Pt4ToHPtN((HPoint3 *)points, NULL); } else { spanPts[0] = HPt3ToHPtN((HPoint3 *)points, NULL, NULL); } } else { spanPts[0] = HPtNCreate(pdim, points); } HPtNDehomogenize(spanPts[0], spanPts[0]); for (i = 1; i < 2*dim; i++) { spanPts[i] = HPtNCopy(spanPts[0], NULL); } MaxNDimensionalSpanN(spanPts, points+pdim, vert_4d, pdim, n-1); if (TN) { for (i = 0; i < 2*dim; i++) { HPtNTransformComponents(TN, spanPts[i], axes, &spanPts3[i]); } } else { HPoint3 pt3; for (i = 0; i < 2*dim; i++) { HPtNToHPt3(spanPts[i], axes, &pt3); HPt3Transform(T, &pt3, &spanPts3[i]); } } SphereEncompassBoundsN(sphere, spanPts3, dim); SphereAddPoints(sphere, points, vert_4d, pdim, n, T, TN, axes); for (i = 0; i < 2*dim; i++) { HPtNDelete(spanPts[i]); } } void MaxNDimensionalSpanN(HPointN **spanPts, float *points, int vert_4d, int pdim, int n) { int i; HPointN tmp; tmp.flags = 0; if (pdim == 4) { HPtNCoord v[5]; tmp.v = v; if (vert_4d) { tmp.dim = 5; for (i = 0; i < n; i++) { Pt4ToHPtN((HPoint3 *)points, &tmp); MaxDimensionalSpanHPtN(spanPts, &tmp); points += 4; } } else { tmp.dim = 4; for (i = 0; i < n; i++) { HPt3ToHPtN((HPoint3 *)points, NULL, &tmp); MaxDimensionalSpanHPtN(spanPts, &tmp); points += 4; } } } else { tmp.v = points; tmp.dim = pdim; for (i = 0; i < n; i++) { MaxDimensionalSpanHPtN(spanPts, &tmp); tmp.v += pdim; } } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/sphere/sphere.h0000644000175000001440000000612510576566671015713 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef SPHERE_H #define SPHERE_H #include "geomclass.h" typedef struct Sphere Sphere; extern GeomClass *SphereClass; void SphereMinMax(Sphere *sphere, HPoint3 *min, HPoint3 *max); void SphereCenter(Sphere *sphere, HPoint3 *center); float SphereRadius(Sphere *sphere); void SphereSwitchSpace(Sphere *sphere, int space); /* Makes sphere encompassing both other spheres - new sphere if dest == NULL, * just puts results in dest otherwise */ Sphere *SphereUnion3(Sphere *a, Sphere *b, Sphere *dest); /* points is actually a (2*dim)-element array containing the points with * the minimum and maximum x, y, and z coordinates. */ void SphereEncompassBoundsN(Sphere *sphere, HPoint3 *points, int dim); void SphereEncompassBounds(Sphere *sphere, HPoint3 *points); /* Returns zero if didn't change sphere, non-zero if did */ int SphereAddHPt3(Sphere *sphere, HPoint3 *point, Transform T); int SphereAddHPt3N(Sphere *sphere, HPoint3 *point, int n, Transform T); int SphereAddHPtN(Sphere *sphere, HPointN *point, Transform T, TransformN *TN, int *axes); int SphereAddHPtNN(Sphere *sphere, HPointN **point, int n, Transform T, TransformN *TN, int *axes); int SphereAddPoint(Sphere *sphere, float *point, int dim, int pdim, Transform T, TransformN *TN, int *axes); int SphereAddPoints(Sphere *sphere, float *point, int dim, int pdim, int n, Transform T, TransformN *TN, int *axes); /* Modifies sphere to surround all points */ void SphereEncompassHPt3N(Sphere *sphere, HPoint3 *point, int n, Transform T); void SphereEncompassHPtNN(Sphere *sphere, HPointN **point, int n, Transform T, TransformN *TN, int *axes); void SphereEncompassPoints(Sphere *sphere, float *points, int dim, int pdim, int n, Transform T, TransformN *TN, int *axes); /* Finds points with the maximum dimensional span - spanPts is an array * of 6 elements (2 points per axis) */ void MaxDimensionalSpan(HPoint3 *spanPts, HPoint3 *point); void MaxDimensionalSpanN(HPoint3 *spanPts, HPoint3 *points, int n); void MaxDimensionalSpanHPtN(HPointN **spanPts, HPointN *pt); void MaxDimensionalSpanHPtNN(HPointN **spanPts, HPointN **points, int n); void MaxNDimensionalSpanN(HPointN **spanPts, float *points, int dim, int pdim, int n); #endif geomview-1.9.4/src/lib/gprim/sphere/sphereP.h0000644000175000001440000000531110577535006016014 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef SPHEREP_H #define SPHEREP_H #include "sphere.h" #include "instP.h" #include "mesh.h" #ifndef BEZIER_SPHERES # define BEZIER_SPHERES 0 /* define to 1 to use bezier splines, to 0 to * use a mesh based on a polar co-ordinate * system. */ #endif #define SPHEREFIELDS \ INSTFIELDS; \ float radius; \ HPoint3 center; \ int space; \ int ntheta; \ int nphi struct Sphere { SPHEREFIELDS; }; #define SPHEREMAGIC GeomMagic('s', 1) #define SPHERE_REMESH GEOMFLAG(0x01) /* need to recompute the mesh */ #define SPHERE_DEFAULT_MESH_SIZE 10 /* otherwise from ap->dice */ /* texture co-ordinates a la Orrery's mkmeshtx*/ enum { SPHERE_TXNONE = GEOMFLAG(0 << 1), /* 0x0 */ SPHERE_TXSINUSOIDAL = GEOMFLAG(1 << 1), /* 0x2 */ SPHERE_TXCYLINDRICAL = GEOMFLAG(2 << 1), /* 0x4 */ SPHERE_TXRECTANGULAR = GEOMFLAG(3 << 1), /* 0x6 */ SPHERE_TXSTEREOGRAPHIC = GEOMFLAG(4 << 1), /* 0x8 */ SPHERE_ONEFACE = GEOMFLAG(5 << 1) /* 0xa */ }; #define SPHERE_TXMASK GEOMFLAG(0xe) #define SPHERE_TXMETH(flags) (((flags) & SPHERE_TXMASK) >> (GEOMFL_SHIFT+1)) extern GeomClass *SphereMethods(); extern Sphere *SphereCreate(Geom *, GeomClass *, va_list *a_list ); extern Sphere *SphereFLoad(IOBFILE *, char *); extern Sphere *SphereSave(Sphere *, char *); extern Sphere *SphereFSave(Sphere *, FILE *, char *); extern Sphere *SphereDice(Sphere *sphere, int nu, int nv); #if !BEZIER_SPHERES extern void SphereReDice(Sphere *sphere); extern Sphere *SphereBSPTree(Sphere *sphere, BSPTree *bsptree, int action); extern Sphere *SphereDraw(Sphere *sphere); #endif extern Sphere *SphereCopy(Sphere *os); /* These are non-mallocing if sphere exists; will create a new sphere and * return it if sphere does not exist */ #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/sphere/spheresave.c0000644000175000001440000000345610577535006016556 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include "transform.h" #include "geom.h" #include "geomclass.h" #include "sphereP.h" static const char *texmap[] = { "SINUSOIDAL", "CYLINDRICAL", "RECTANGULAR", "STEREOGRAPHIC", "ONEFACE" }; Sphere *SphereFSave(Sphere *sphere, FILE *f, char *fname) { int texmeth = 0; if (sphere == NULL) { return NULL; } if ((texmeth = SPHERE_TXMETH(sphere->geomflags)) != 0) { fprintf(f, "ST"); } switch(sphere->space) { case TM_HYPERBOLIC: fprintf(f, "%c", 'H'); break; case TM_SPHERICAL: fprintf(f, "%c", 'S'); break; } fprintf(f, "SPHERE"); if (texmeth != 0) { fprintf(f, " %s\n", texmap[texmeth-1]); } else { fprintf(f, "\n"); } fprintf(f, "%g %g %g %g\n", sphere->radius, sphere->center.x, sphere->center.y, sphere->center.z); return (ferror(f) ? NULL : sphere); } geomview-1.9.4/src/lib/gprim/sphere/Makefile.am0000644000175000001440000000043010576566671016301 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libsphere.la libsphere_la_SOURCES = \ sphereclass.c spherecreate.c sphereload.c spheremisc.c spheresave.c \ sphere.h sphereP.h if !BEZIER_SPHERES libsphere_la_SOURCES += spheredice.c spheredraw.c endif geomview-1.9.4/src/lib/gprim/sphere/Makefile.in0000644000175000001440000003712310665240504016302 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @BEZIER_SPHERES_FALSE@am__append_1 = spheredice.c spheredraw.c subdir = src/lib/gprim/sphere DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libsphere_la_LIBADD = am__libsphere_la_SOURCES_DIST = sphereclass.c spherecreate.c \ sphereload.c spheremisc.c spheresave.c sphere.h sphereP.h \ spheredice.c spheredraw.c @BEZIER_SPHERES_FALSE@am__objects_1 = spheredice.lo spheredraw.lo am_libsphere_la_OBJECTS = sphereclass.lo spherecreate.lo sphereload.lo \ spheremisc.lo spheresave.lo $(am__objects_1) libsphere_la_OBJECTS = $(am_libsphere_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libsphere_la_SOURCES) DIST_SOURCES = $(am__libsphere_la_SOURCES_DIST) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libsphere.la libsphere_la_SOURCES = sphereclass.c spherecreate.c sphereload.c \ spheremisc.c spheresave.c sphere.h sphereP.h $(am__append_1) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/gprim/sphere/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/gprim/sphere/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libsphere.la: $(libsphere_la_OBJECTS) $(libsphere_la_DEPENDENCIES) $(LINK) $(libsphere_la_OBJECTS) $(libsphere_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sphereclass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spherecreate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spheredice.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spheredraw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sphereload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spheremisc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spheresave.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/gprim/sphere/sphereclass.c0000644000175000001440000000420510576566671016731 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Celeste Fowler, Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "geom.h" #include "geomclass.h" #include "sphereP.h" static char nameSphere[] = "sphere"; GeomClass *SphereClass = NULL; int SpherePresent = 1; char *SphereName() { return nameSphere; } GeomClass *SphereMethods() { if (SphereClass == NULL) { (void) InstMethods(); SphereClass = GeomSubClassCreate("inst", "sphere"); SphereClass->name = SphereName; SphereClass->methods = (GeomMethodsFunc *)SphereMethods; SphereClass->create = (GeomCreateFunc *)SphereCreate; SphereClass->fsave = (GeomFSaveFunc *)SphereFSave; SphereClass->fload = (GeomFLoadFunc *)SphereFLoad; SphereClass->copy = (GeomCopyFunc *)SphereCopy; #if !BEZIER_SPHERES SphereClass->dice = (GeomDiceFunc *)SphereDice; SphereClass->draw = (GeomDrawFunc *)SphereDraw; SphereClass->bsptree = (GeomBSPTreeFunc *)SphereBSPTree; #endif SphereClass->export = NULL; SphereClass->import = NULL; SphereClass->unexport = NULL; } return SphereClass; } geomview-1.9.4/src/lib/gprim/sphere/spherecreate.c0000644000175000001440000003007210622716756017061 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include "geom.h" #include "geomclass.h" #include "transform.h" #include "hpoint3.h" #include "sphereP.h" #include "tlist.h" #if BEZIER_SPHERES #include "bezier.h" static float ctrlPnts[] = { #if old 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 2, 2, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 0, 4, 4 #else 0, 0, 1, 1, 0, 1, 1, 1, 0, 2, 0, 2, 1, 0, 1, 1, 1, 1, 1, 1, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 4, 0, 0, 4, #endif }; #endif /* To support all texture mappings supported by mktxmesh we have to * compose the sphere of different parts. */ static const int ngeomtfm[] = { 8, 2, 8, 8, 4, 8 }; static const Transform geomtfm[][8] = { { /* SPHERE_TXNONE, octants */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}} }, { /* SPHERE_TXSINUSOIDAL, reflection on (x,y)-plane */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, }, { /* SPHERE_TXCYLINDRIAL, octants */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}} }, { /* SPHERE_TXRECTANGULAR, octants */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}} }, { /* SPHERE_TXSTEREOGRAPHIC, quarters */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, }, { /* SPHERE_TXONESIDE, octants */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0,-1, 0}, {0, 0, 0, 1}} }, }; /* for the transformation of the texture co-ordinates (if any) */ static const Transform textfm[][8] = { { /* SPHERE_TXNONE, nothing */ {{ 0, }}, }, { /* SPHERE_TXSINUSOIDAL */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 1, 0, 1}}, }, {/* SPHERE_TXCYLINDRIAL */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0.0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {1.0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0.5, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0.5, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0.0, 1, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {1.0, 1, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0.5, 1, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0.5, 1, 0, 1}}, }, { /* SPHERE_TXRECTANGULAR */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {1.0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0.5, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0.5, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0.0, 1, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {1.0, 1, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0.5, 1, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0.5, 1, 0, 1}}, }, { /* SPHERE_TXSTEREOGRAPHIC */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, }, { /* SPHERE_TXONESIDE */ {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 1}}, {{-1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {1, 0, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 1, 0, 1}}, {{ 1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {0, 1, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {1, 1, 0, 1}}, {{-1, 0, 0, 0}, {0,-1, 0, 0}, {0, 0, 1, 0}, {1, 1, 0, 1}}, } }; static inline void sphere_make_meshhandle(Sphere *sphere) { char meshhname[sizeof("\aSphere::")+sizeof(void *)*2]; extern HandleOps GeomOps; Handle *handle; sprintf(meshhname, "\aSphere::%lx", (unsigned long)sphere); handle = HandleCreate(meshhname, &GeomOps); GeomCCreate((Geom *)sphere, InstMethods(), CR_NOCOPY, CR_GEOMHANDLE, handle, CR_END); } /* Do we need a SphereCopy()? In principle yes. */ Sphere *SphereCopy(Sphere *sphere) { Sphere *nsphere; /* simply create a new one and copy over the three defining fields */ nsphere = (Sphere *)GeomCCreate(NULL, SphereMethods(), CR_SPACE, sphere->space, CR_CENTER, &sphere->center, CR_RADIUS, &sphere->radius, CR_SPHERETX, sphere->geomflags & SPHERE_TXMASK, CR_END); TmCopy(sphere->axis, nsphere->axis); return nsphere; } Sphere *SphereCreate(Geom *exist, GeomClass *classp, va_list *a_list) { Sphere *sphere; int nencompass_points = 0; int attr, copy = 1; unsigned texmeth; Transform *axis = NULL; HPoint3 *encompass_points = NULL; if (exist == NULL) { sphere = OOGLNewE(Sphere, "SphereCreate: new Sphere"); GGeomInit(sphere, classp, SPHEREMAGIC, NULL); TmIdentity(sphere->axis); sphere->NDaxis = NULL; sphere->geomhandle = NULL; sphere->geom = NULL; sphere->tlisthandle = NULL; sphere->tlist = NULL; sphere->txtlisthandle = NULL; sphere->txtlist = NULL; sphere->axishandle = NULL; sphere->NDaxishandle = NULL; sphere->location = L_NONE; sphere->origin = L_NONE; sphere->radius = 1.0; sphere->space = TM_EUCLIDEAN; HPt3From(&(sphere->center), 0.0, 0.0, 0.0, 1.0); sphere->ntheta = sphere->nphi = SPHERE_DEFAULT_MESH_SIZE; } else { sphere = (Sphere *)exist; } texmeth = sphere->geomflags & SPHERE_TXMASK; while ((attr = va_arg (*a_list, int))) switch (attr) { case CR_CENTER: sphere->center = *va_arg(*a_list, HPoint3 *); break; case CR_RADIUS: sphere->radius = va_arg(*a_list, double); break; case CR_SPACE: sphere->space = va_arg(*a_list, int); break; case CR_ENCOMPASS_POINTS: encompass_points = va_arg(*a_list, HPoint3 *); break; case CR_NENCOMPASS_POINTS: nencompass_points = va_arg(*a_list, int); break; case CR_SPHERETX: switch (texmeth = va_arg(*a_list, int)) { case SPHERE_TXNONE: case SPHERE_TXSINUSOIDAL: case SPHERE_TXCYLINDRICAL: case SPHERE_TXRECTANGULAR: case SPHERE_TXSTEREOGRAPHIC: case SPHERE_ONEFACE: break; default: OOGLError(1, "Undefined texture mapping method: %d", texmeth); if (exist == NULL) { GeomDelete ((Geom *)sphere); } return NULL; } break; case CR_AXIS: axis = va_arg(*a_list, Transform *); break; default: if (GeomDecorate(sphere, ©, attr, a_list)) { OOGLError (0, "ListCreate: Undefined attribute: %d", attr); if(exist == NULL) GeomDelete ((Geom *)sphere); return NULL; } break; } HPt3Dehomogenize(&(sphere->center), &(sphere->center)); #if BEZIER_SPHERES if (sphere->geom == NULL) { /* No need to generate those objects anew if we already have a * sphere, they never change. Also, we need to make a copy of the * control-points with malloc(); should probably change the Bezier * object instead. */ float *CPctrlPnts; Geom *quadrant; Geom *unitsphere; /* Bezier does not make a copy of the control points */ CPctrlPnts = OOGLNewNE(float, (2+1)*(2+1)*4, "copy of sphere ctrl points"); memcpy(CPctrlPnts, ctrlPnts, sizeof(ctrlPnts)); quadrant = GeomCCreate(NULL, BezierMethods(), CR_DEGU, 2, CR_DEGV, 2, CR_DIM, 4, CR_POINT, CPctrlPnts, CR_END); /* TList does make a copy of the transformations */ unitsphere = GeomCreate("tlist", CR_NELEM, 8, CR_ELEM, V4, CR_END); GeomCCreate((Geom *)sphere, InstMethods(), CR_GEOM, quadrant, CR_TLIST, unitsphere, CR_END); GeomDelete(quadrant); GeomDelete(unitsphere); } #else if (sphere->geomhandle == NULL) { /* force remeshing on redraw, but not earlier. */ sphere->geomflags |= SPHERE_REMESH; sphere_make_meshhandle(sphere); } if (texmeth != (sphere->geomflags & SPHERE_TXMASK)) { Geom *txtlist = NULL; int texidx = SPHERE_TXMETH(texmeth); /* force remeshing on redraw, but not earlier. */ sphere->geomflags |= SPHERE_REMESH; sphere->geomflags &= ~SPHERE_TXMASK; sphere->geomflags |= texmeth; if (texmeth > 0) { txtlist = GeomCCreate(NULL , TlistMethods(), CR_NELEM, ngeomtfm[texidx], CR_ELEM, textfm[texidx], CR_END); } GeomCCreate((Geom *)sphere, InstMethods(), CR_NOCOPY, CR_TLIST, NULL, CR_TXTLIST, txtlist, CR_END); } if (sphere->tlist == NULL) { Geom *tlist; int texidx = SPHERE_TXMETH(sphere->geomflags); /* force remeshing on redraw, but not earlier. */ sphere->geomflags |= SPHERE_REMESH; tlist = GeomCCreate(NULL , TlistMethods(), CR_NELEM, ngeomtfm[texidx], CR_ELEM, geomtfm[texidx], CR_END); GeomCCreate((Geom *)sphere, InstMethods(), CR_NOCOPY, CR_TLIST, tlist, CR_END); } #endif SphereSwitchSpace(sphere, sphere->space); if (nencompass_points && encompass_points != NULL) SphereEncompassHPt3N(sphere, encompass_points, nencompass_points, (axis == NULL) ? TM_IDENTITY : *axis); if (sphere->ap && sphere->ap->mat && (sphere->ap->mat->valid & MTF_ALPHA) && sphere->ap->mat->diffuse.a != 1.0) { sphere->geomflags |= COLOR_ALPHA; } else { sphere->geomflags &= ~COLOR_ALPHA; } return sphere; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/gprim/sphere/Headers0000644000175000001440000000002307730237617015532 00000000000000sphere.h sphereP.h geomview-1.9.4/src/lib/shade/0000777000175000001440000000000010665240671013000 500000000000000geomview-1.9.4/src/lib/shade/appearance.c0000644000175000001440000002502610575035653015166 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "appearance.h" #include "transobj.h" #include "handleP.h" #include #include #define MAXSHININESS 1024.0 extern LmLighting * _LmSet(LmLighting *, int attr1, va_list *); extern Material * _MtSet(Material *, int attr1, va_list *); Appearance * _ApSet(Appearance *ap, int attr1, va_list *alist) { int mask; int attr; #define NEXT(type) va_arg(*alist, type) if (ap == NULL) { /* * New Appearance created here. */ ap = OOGLNewE(Appearance, "ApCreate Appearance"); ApDefault(ap); } for ( attr = attr1; attr != AP_END; attr = NEXT(int)) { switch (attr) { /* parse argument list */ case AP_DO: mask = NEXT(int); ap->flag |= mask; ap->valid |= mask; break; case AP_DONT: mask = NEXT(int); ap->flag &= ~mask; ap->valid |= mask; break; case AP_INVALID: ap->valid &= ~NEXT(int); break; case AP_OVERRIDE: ap->override |= NEXT(int); break; case AP_NOOVERRIDE: ap->override &= ~NEXT(int); break; case AP_MAT: ap->mat = NEXT(Material*); break; case AP_MtSet: ap->mat = _MtSet(ap->mat, va_arg(*alist, int), alist); break; case AP_LGT: ap->lighting = NEXT(LmLighting*); break; case AP_LmSet: if (!ap->lighting) ap->lighting = LmCreate(LM_END); ap->lighting = _LmSet(ap->lighting, va_arg(*alist, int), alist); break; case AP_NORMSCALE: ap->nscale = NEXT(double); ap->valid |= APF_NORMSCALE; break; case AP_LINEWIDTH: ap->linewidth = NEXT(int); ap->valid |= APF_LINEWIDTH; break; case AP_SHADING: /* should be APF_{CONSTANT,FLAT,SMOOTH} */ ap->shading = NEXT(int); ap->valid |= APF_SHADING; break; case AP_DICE: ap->dice[0] = NEXT(int); ap->dice[1] = NEXT(int); ap->valid |= APF_DICE; break; default: OOGLError (0, "_ApSet: undefined option: %d\n", attr); return NULL; break; } } return ap; #undef NEXT } Appearance * ApCreate(int a1, ...) { va_list alist; Appearance *ap; va_start(alist,a1); ap = _ApSet(NULL, a1, &alist); va_end(alist); return ap; } Appearance * ApSet(Appearance *ap, int a1, ... ) { va_list alist; va_start(alist,a1); ap = _ApSet(ap, a1, &alist); va_end(alist); return ap; } int ApGet(Appearance *ap, int attr, void *value) { if (!ap) return -1; switch (attr) { case AP_DO: case AP_DONT: *(int *) value = ap->flag; break; case AP_OVERRIDE: case AP_NOOVERRIDE: *(int *) value = ap->override; break; case AP_VALID: case AP_INVALID: *(int *) value = ap->valid; break; case AP_MAT: *(Material **) value = ap->mat; break; case AP_LGT: *(LmLighting **) value = ap->lighting; break; case AP_NORMSCALE: *(double *) value = ap->nscale; break; case AP_LINEWIDTH: *(int *) value = ap->linewidth; break; case AP_SHADING: *(int *)value = ap->shading; break; case AP_DICE: ((int *)value)[0] = ap->dice[0]; ((int *)value)[1] = ap->dice[1]; break; default: OOGLError (0, "ApGet: undefined option: %d\n", attr); return -1; break; } return attr; } void ApDelete(Appearance *ap) { if (ap == NULL || RefDecr((Ref *)ap) > 0) return; if (ap->magic != APMAGIC) { OOGLError(1, "ApDelete(%x) of non-Appearance: magic %x != %x", ap, ap->magic, APMAGIC); return; } if (ap->mat) MtDelete(ap->mat); if (ap->lighting) LmDelete(ap->lighting); if (ap->tex) TxDelete(ap->tex); OOGLFree(ap); } /* * Copies just the Appearance part, not its Material and LmLighting children. * Pointers to the latter are retained BUT their reference counts are NOT * incremented. The caller MUST either RefIncr() or reassign mat and lighting. */ Appearance * ApCopyShallow(const Appearance *ap, Appearance *into ) { if (ap == NULL) return NULL; if (into == NULL) { into = OOGLNewE(Appearance, "ApCopy: Appearance"); *into = *ap; into->mat = NULL; into->backmat = NULL; into->lighting = NULL; into->tex = NULL; RefInit((Ref *)into, APMAGIC); } else { into->flag = ap->flag; into->valid = ap->valid; into->override = ap->override; into->nscale = ap->nscale; into->linewidth = ap->linewidth; into->shading = ap->shading; into->dice[0] = ap->dice[0]; into->dice[1] = ap->dice[1]; } return into; } Appearance * ApCopy(const Appearance *ap, Appearance *into ) { if (ap == NULL) return into; into = ApCopyShallow( ap, into ); if (ap->mat) into->mat = MtCopy(ap->mat, into->mat); if (ap->backmat) into->backmat = MtCopy(ap->backmat, into->backmat); if (ap->lighting) into->lighting = LmCopy(ap->lighting, into->lighting); if (ap->tex) into->tex = TxCopy(ap->tex, into->tex); return into; } Appearance * ApCopyShared(const Appearance *ap, Appearance *into ) { if (ap == NULL) return into; into = ApCopyShallow( ap, into ); if (ap->mat) { if (into->mat) MtCopy(ap->mat, into->mat); else RefIncr((Ref *)(into->mat = ap->mat)); } if (ap->backmat) { if (into->backmat) MtCopy(ap->backmat, into->backmat); else RefIncr((Ref *)(into->backmat = ap->backmat)); } if (ap->lighting) { if (into->lighting) LmCopy(ap->lighting, into->lighting); else RefIncr((Ref *)(into->lighting = ap->lighting)); } if (ap->tex) { if (into->tex) TxCopy(ap->tex, into->tex); else RefIncr((Ref *)(into->tex = ap->tex)); } return into; } /* * Merges appearance properties of src into dst. * If "inplace" is true, data are modified in place. * Otherwise if any modifications are needed to dst, a copy is made & returned. * If no modifications are necessary, the returned Appearance's reference * count is still incremented. * Thus, in all cases, the caller should ApDelete() the returned value * when finished with it. */ Appearance * ApMerge(const Appearance *src, Appearance *dst, int mergeflags ) { int mask; Material *mt, *bmt; LmLighting *lts; Texture *tex; if (dst == NULL) return ApCopy(src, NULL); if (src == NULL) { RefIncr((Ref *)dst); return dst; } /* Mask of fields to copy to dst */ mask = (mergeflags & APF_OVEROVERRIDE) ? src->valid : src->valid &~ ( dst->override &~ src->override); mt = MtMerge(src->mat, dst->mat, mergeflags); bmt = MtMerge(src->backmat, dst->backmat, mergeflags); lts = LmMerge(src->lighting, dst->lighting, mergeflags); tex = TxMerge(src->tex, dst->tex, mergeflags); if ((mergeflags & APF_INPLACE) || (mask == 0 && mt == dst->mat && lts == dst->lighting && bmt == dst->backmat && tex == dst->tex)) { /* * No changes, or we're asked to merge in place. Bump ref count. */ RefIncr((Ref *)dst); } else { /* * Another special case: Copy appearance, don't copy the items already * copied by {Mt,Lm}Merge. We're about to overwrite these values, so * toss the old ones. Pretty kludgy, but what can we do? */ dst = ApCopyShallow(dst, NULL); } #if 0 if (mt != dst->mat) MtDelete(dst->mat); if (bmt != dst->backmat) MtDelete(dst->backmat); if (lts != dst->lighting) LmDelete(dst->lighting); if (tex != dst->tex && dst->tex) TxDelete(dst->tex); #else MtDelete(dst->mat); MtDelete(dst->backmat); LmDelete(dst->lighting); TxDelete(dst->tex); #endif dst->mat = mt; dst->backmat = bmt; dst->lighting = lts; dst->tex = tex; if (mask) { /* Merge together appearance-specific data */ dst->flag = (src->flag & mask) | (dst->flag & ~mask); dst->valid = (src->valid & mask) | (dst->valid & ~mask); dst->override = (src->override & mask) | (dst->override & ~mask); if (mask & APF_NORMSCALE) dst->nscale = src->nscale; if (mask & APF_LINEWIDTH) dst->linewidth = src->linewidth; if (mask & APF_SHADING) dst->shading = src->shading; if (mask & APF_DICE) { dst->dice[0] = src->dice[0]; dst->dice[1] = src->dice[1]; } } return dst; } Appearance * ApDefault(Appearance *ap) { ap->valid = ap->override = 0; memset(ap, 0, sizeof(Appearance)); RefInit((Ref *)ap, APMAGIC); ap->mat = NULL; ap->lighting = NULL; return ap; } void ApUseOverrides(Appearance *ap, int use_overrides) { Material *mat; if (ap == NULL) return; ap->override = ap->valid & use_overrides; if ((mat = ap->mat) != NULL) { mat->override = mat->valid & use_overrides; mat->changed = 1; } if ((mat = ap->backmat) != NULL) { mat->override = mat->valid & use_overrides; mat->changed = 1; } if (ap->lighting) { ap->lighting->override = ap->lighting->valid & use_overrides; ap->lighting->changed = 1; } } /* * We assume dst is a child of src in the inheritance tree. * Erase all settings in dst that are defined in src, * so that src's settings can propagate to (the children of) dst. */ void ApLetPropagate(Appearance *src, Appearance *dst) { if (src == NULL || dst == NULL) return; dst->valid &= ~src->valid; dst->override &= ~src->valid; if (dst->mat && src->mat) { dst->mat->valid &= ~src->mat->valid; dst->mat->override &= ~src->mat->valid; dst->mat->changed = 1; } if (dst->backmat && src->backmat) { dst->backmat->valid &= ~src->backmat->valid; dst->backmat->override &= ~src->backmat->valid; dst->backmat->changed = 1; } if (dst->lighting && src->lighting) { dst->lighting->valid &= ~src->lighting->valid; dst->lighting->override &= ~src->lighting->valid; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/shade/appearance.h0000644000175000001440000005104210622716760015166 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef APPEARANCEDEF #define APPEARANCEDEF /* #define AP_IDEBUG before #including this file to compile for debugging */ #include #include "ooglutil.h" #include "transobj.h" #include "3d.h" #include "color.h" #include "streampool.h" #include "dbllist.h" #define DONE 1 #define ANOTHER 2 typedef struct LtLight { REFERENCEFIELDS; Color ambient; Color color; Point position; /* application-specified light position */ Point globalposition; /* real light position; set & used only by mg */ float intensity; int Private; /* private part; used only by mg */ short location; /* How to interpret the "position": */ #define LTF_GLOBAL 0x0 /* global coordinate system */ #define LTF_CAMERA 0x1 /* camera coordinates */ #define LTF_LOCAL 0x2 /* local coordinates * where appearance is attached. */ short changed; } LtLight; #define AP_MAXLIGHTS 8 typedef struct LmLighting { REFERENCEFIELDS; int valid, override; /* LMF_* inheritance bits */ Color ambient; int localviewer; float attenconst, attenmult, attenmult2; LtLight *lights[AP_MAXLIGHTS]; int Private; int changed; } LmLighting; #define LM_ANY_LIGHTS(lm) ((lm)->lights[0] != NULL) #define LM_FOR_ALL_LIGHTS(lm, i,lp) for((i)=0, (lp) = &(lm)->lights[0]; \ (i) 8 then the * most significant byte comes first (BIG-ENDIAN). */ } Image; typedef struct TxUser TxUser; /* Textures are bulky and need active management! */ struct TxUser { struct TxUser *next; /* Next user in tx->users list */ struct Texture *tx; /* Which texture is ours? */ int id; /* Slot for e.g. graphics-system texture id */ void *ctx; /* Slot for e.g. mg context */ void *data; /* Any other data the user needs */ int flags; /* flags for user to determine usage */ int (*needed)(TxUser *); /* user answers "d'you still need this?" */ void (*purge)(TxUser *); /* request to user to purge this texture */ }; typedef struct Texture { REFERENCEFIELDS; Image *image; /* underlying pixmap */ Handle *imghandle; Transform tfm; /* texture-coord transformation */ Handle *tfmhandle; unsigned int flags; /* clamp, etc. */ enum apply_enum { tx_modulate, tx_decal, tx_blend, tx_replace } apply; /* Application style * (TXF_DECAL, TXF_MODULATE, TXF_BLEND, TXF_REPLACE) */ Color background; /* background color for TXF_BLEND */ TxUser *users; /* Users of this texture register here */ #if 0 int coords; /* Texture-coord auto generation (not implemented) */ #endif /*****************************************/ /* the old and deprecated way to do stuff */ char *filename; /* ppm or pgm (.Z) file */ char *alphafilename; /* If present, this is a .pgm (.Z) file */ /*****************************************/ DblListNode loadnode; } Texture; extern DblListNode AllLoadedTextures; /* List of em */ typedef struct Appearance { REFERENCEFIELDS; Material *mat, *backmat; /* material properties */ LmLighting *lighting; /* attached lighting */ Texture *tex; /* Texture-map object */ unsigned int flag; /* APF_* shading,faces/edges,normals,transparency */ unsigned int valid; /* APF_* bits control inheritance of these fields */ unsigned int override; /* same APF_* flags: parent overrides child */ float nscale; /* scale factor for drawing normals */ int linewidth; /* how wide do lines appear (pixels) ? */ int shading; /* APF_{CONSTANT,FLAT,SMOOTH} */ short dice[2]; /* u, v patch dicing parameters */ } Appearance; extern HandleOps AppearanceOps; extern HandleOps ImageOps; extern HandleOps TextureOps; /* the following tokens are used in LtSet and LtGet */ #define LT_END 700 #define LT_AMBIENT 701 /* Color ambient */ #define LT_COLOR 702 /* Color color */ #define LT_POSITION 703 /* Point position */ #define LT_INTENSITY 704 /* double intensity */ #define LT_LOCATION 705 /* int location: LTF_{GLOBAL,CAMERA,LOCAL} */ #define LT_ABLOCK 706 /* void **ablock ??? cH: unimplemented ??? */ /* the following tokens are used in LmSet and LmGet */ #define LM_END 600 #define LM_AMBIENT 601 /* Color ambient */ #define LM_LOCALVIEWER 602 /* int localviewer */ #define LM_ATTENC 603 /* double attenconst */ #define LM_ATTENM 604 /* double attenmult */ #define LM_ATTEN2 612 /* double attenmult2 */ #define LM_LtSet 605 /* ... */ #define LM_LIGHT 606 /* LtLight *light */ #define LM_VALID 607 /* int mask (Get only) */ #define LM_INVALID 608 /* int mask (unsets valid bits) */ #define LM_OVERRIDE 609 /* int mask (sets override bits) */ #define LM_NOOVERRIDE 610 /* int mask (unsets override bits) */ #define LM_REPLACELIGHTS 611 /* int replace */ #define LM_ABLOCK 613 /* void **ablock ??? cH: unimplemented ??? */ /* the following tokens are used in MtSet and MtGet */ #define MT_END 500 #define MT_EMISSION 501 /* Color *emission */ #define MT_AMBIENT 502 /* Color *ambient */ #define MT_DIFFUSE 503 /* Color *diffuse */ #define MT_SPECULAR 504 /* Color *specular */ #define MT_Ka 505 /* double ka */ #define MT_Kd 506 /* double kd */ #define MT_Ks 507 /* double ks */ #define MT_ALPHA 508 /* double alpha */ #define MT_SHININESS 509 /* double shininess */ #define MT_EDGECOLOR 510 /* Color *edgecolor (for edges & vectors) */ #define MT_NORMALCOLOR 511 /* Color *normalcolor (for surface normals) */ #define MT_VALID 512 /* int mask (Get only) */ #define MT_INVALID 513 /* int mask (unsets valid bits) */ #define MT_OVERRIDE 514 /* int mask (sets override bits) */ #define MT_NOOVERRIDE 515 /* int mask (unsets override bits) */ #define MT_ABLOCK 516 /* void **ablock ??? cH: unimplemented ??? */ /* the following tokens are used in ApSet and ApGet */ #define AP_END 400 #define AP_DO 401 /* int mask (set flag bits) */ #define AP_DONT 402 /* int mask (unset flag bits) */ #define AP_MAT 403 /* Material *mat */ #define AP_MtSet 404 /* ... */ #define AP_LGT 405 /* LmLighting *lgt */ #define AP_LmSet 406 /* ... */ #define AP_NORMSCALE 407 /* float nscale */ #define AP_LINEWIDTH 408 /* int linewidth */ #define AP_VALID 409 /* int mask (Get only) */ #define AP_INVALID 410 /* int mask (unsets valid bits) */ #define AP_OVERRIDE 411 /* int mask (sets override bits) */ #define AP_NOOVERRIDE 412 /* int mask (unsets override bits) */ #define AP_SHADING 413 /* int shading (set to APF_{CONSTANT,FLAT,SMOOTH} */ #define AP_BACKMAT 414 /* Material *backmaterial */ #define AP_ABLOCK 415 /* void **ablock ??? cH: unimplemented ??? */ #define AP_DICE 416 /* int udice, vdice (set); int dice[2] (get) */ #define AP_TEXTURE 417 /* Texture *tx */ #define AP_TxSet 418 /* ... */ /* Flags to ApMerge, etc. */ #define APF_INPLACE 0x1 /* Merge in place */ #define APF_OVEROVERRIDE 0x2 /* src replaces dst even without src override */ /* This model of texture-mapping shamelessly stolen * from GL/Open-GL */ #define TXMAGIC OOGLMagic('t', 1) #define TX_DOCLAMP 450 #define TXF_SCLAMP 0x1 /* Clamp if s outside 0..1 (else wrap) */ #define TXF_TCLAMP 0x2 /* Clamp if t outside 0..1 (else wrap) */ #define TXF_LOADED 0x4 /* Has this texture been loaded? * (tried to read those files yet?) */ #define TXF_RGBA 0x8 /* In loaded data, is R first byte? (else ABGR) */ #define TXF_USED 0x10 /* "Recently rendered a geom containing this texture"*/ #define TX_APPLY 451 /* Interpret texture values to... */ #define TXF_MODULATE tx_modulate #define TXF_DECAL tx_decal #define TXF_BLEND tx_blend #define TXF_REPLACE tx_replace #define TX_HANDLE_IMAGE 452 #define TX_HANDLE_TRANSFORM 453 #define TX_BACKGROUND 454 #define TX_FILE 455 /* deprecated (really?) */ #define TX_ALPHAFILE 456 /* deprecated (really?) */ #define TX_CHANNELS 457 /* deprecated (really?) */ #define TX_XSIZE 458 /* deprecated (really?) */ #define TX_YSIZE 459 /* deprecated (really?) */ #if 0 /* not implemented */ #define TX_COORDS 458 /* Texture coordinates come from... */ #define TXF_COORD_GIVEN 0 /* given as part of object (default) In * fact, only TXF_COORD_GIVEN works now. */ # define TXF_COORD_LOCAL 1 /* In coord system of texture map */ # define TXF_COORD_CAMERA 2 /* In camera coords */ # define TXF_COORD_NORMAL 3 /* Taken from surface-normal, for env map */ #endif #define TX_ABLOCK 464 /* ??? cH: unimplemented ??? */ #define TX_END 465 #define IMGMAGIC OOGLMagic('i', 1) /* ImgSet() commands */ #define IMG_WIDTH 1000 #define IMG_HEIGHT 1001 #define IMG_CHANNELS 1002 #define IMG_MAXVAL 1003 #define IMG_DATA 1004 #define IMG_DATA_CHAN_FILE 1005 /* CHMASK, FILTER/NULL, FILENAME */ #define IMG_DATA_CHAN_DATA 1006 /* CHMASK, FILTER/NULL, DATA, DATASZ */ #define IMGF_LUMINANCE 0x1 #define IMGF_LUMINANCE_ALPHA 0x3 #define IMGF_RGB 0x7 #define IMGF_RGBA 0xf #define IMGF_ALPHA 0x100 #define IMGF_AUTO 0x200 #define IMG_END 1042 typedef struct TxST { float s; float t; } TxST; /* Transformation of (s,t)-texture co-ordinates. (s,t,r,q) with r = 0, * q = 1 */ static inline void TxSTTransform(Transform T, TxST *in, TxST *out) { float s, t, q; if (T == NULL || T == TM_IDENTITY) { *out = *in; return; } s = in->s; t = in->t; q = T[TMX][TMW]*s + T[TMY][TMW]*t + T[TMW][TMW]; if(q != 1.0) { q = 1.0 / q; out->s = q * (s*T[TMX][TMX] + t*T[TMY][TMX] + T[TMW][TMX]); out->t = q * (s*T[TMX][TMY] + t*T[TMY][TMY] + T[TMW][TMY]); } else { out->s = s*T[TMX][TMX] + t*T[TMY][TMX] + T[TMW][TMX]; out->t = s*T[TMX][TMY] + t*T[TMY][TMY] + T[TMW][TMY]; } } Appearance * ApCreate( int attr, ... ); Appearance * ApSet( Appearance *ap, int attr, ... ); Appearance * _ApSet(Appearance *ap, int attr1, va_list *alist); int ApGet( Appearance *ap, int attr, void *valuep ); void ApDelete( Appearance *ap ); Appearance * ApDefault( Appearance *ap ); Appearance * ApCopy(const Appearance *from, Appearance *into ); Appearance * ApMerge(const Appearance *src, Appearance *dst, int inplace ); Appearance * ApFLoad(IOBFILE *inf, char *fname); Appearance * ApCopyShared(const Appearance *ap, Appearance *into ); Appearance * ApFSave(Appearance *ap, FILE *f, char *fname); int ApStreamIn(Pool *p, Handle **hp, Appearance **app); int ApStreamOut(Pool *p, Handle *h, Appearance *ap); /* Force 'override' bits on (for all valid fields) * or off, in an Appearance. */ void ApUseOverrides( Appearance *ap, int use_overrides ); /* Erase fields in 'dst' corresponding to any in 'src'; * allows 'src' settings to propagate through 'dst', * when 'dst' is its child. */ void ApLetPropagate( Appearance *src, Appearance *dst ); int TxStreamIn( Pool *, Handle **, Texture ** ); int TxStreamOut( Pool *, Handle *, Texture * ); void TxDelete( Texture * ); int ImgStreamIn(Pool *p, Handle **hp, Image **imgp); int ImgStreamOut(Pool *p, Handle *h, Image *tx); Image *ImgFSave(Image *img, FILE *outf, char *fname); void ImgDelete(Image *img); Image *ImgCreate(int a1, ...); int ImgWritePGM(Image *img, int channel, bool compressed, char **buffer); int ImgWritePNM(Image *img, unsigned chmask, bool compressed, char **buffer); int ImgWritePAM(Image *img, unsigned chmask, bool compressed, char **buffer); bool ImgWriteFilter(Image *img, unsigned chmask, const char *filter); Texture * TxFLoad( IOBFILE *inf, char *fname ); Texture * TxFSave(Texture *tx, FILE *outf, char *fname); Texture * TxSet( Texture *, int attr, ... ); Texture * TxCreate( int attr, ... ); Texture * TxCopy( Texture *src, Texture *dst ); Texture * TxMerge( Texture *src, Texture *dst, int mergeflags ); void TxPurge( Texture * ); TxUser *TxAddUser(Texture *, int id, int (*needed)(TxUser *), void (*purge)(TxUser *)); void TxRemoveUser(TxUser *user); #ifndef AP_IDEBUG Material * MtCreate( int attr, ... ); Material * MtSet( Material *, int attr, ... ); #endif int MtGet( Material *, int attr, void *valuep ); void MtDelete( Material * ); Material * MtDefault( Material * ); Material * MtLoad( Material *, char *filename ); Material * MtCopy( Material *from, Material *into ); Material * MtMerge( Material *src, Material *dst, int inplace ); Material * MtFLoad( Material *into, IOBFILE *stream, char *filename ); int MtSave( Material *, char *filename ); int MtFSave( Material *mat, FILE *stream, Pool *p ); void MtPrint( Material * ); #ifndef AP_IDEBUG LtLight * LtCreate( int attr, ... ); LtLight * LtSet( LtLight *, int attr, ... ); #endif int LtGet( LtLight *, int attr, void *valuep ); void LtDelete( LtLight * ); LtLight * LtCopy( LtLight *, LtLight * ); LtLight * LtMerge( LtLight *, LtLight * ); LtLight * LtDefault( LtLight * ); void LtProperties( LtLight *, float, Color *, Point * ); LtLight * LtFLoad( LtLight *, IOBFILE *, char *filename); #define LTMAGIC OOGLMagic('l', 2) #ifndef AP_IDEBUG LmLighting * LmCreate( int attr, ... ); LmLighting * LmSet( LmLighting *, int attr, ... ); #endif int LmGet( LmLighting *, int attr, void *valuep ); void LmDelete( LmLighting * ); void LmDelete( LmLighting * ); void LmDefault( LmLighting * ); LmLighting * LmLoad( LmLighting *, char *filename ); LmLighting * LmFLoad( LmLighting *, IOBFILE *, char *filename ); void LmSave( LmLighting *, char *filename ); void LmFSave( LmLighting *, FILE *, char *filename, Pool *p ); LmLighting * LmMerge( LmLighting *src, LmLighting *dst, int inplace ); LmLighting * LmCopy( LmLighting *src, LmLighting *dst ); void LmAddLight( LmLighting *dst, LtLight *light ); void LmRemoveLight( LmLighting *dst, LtLight *light ); void LmCopyLights( LmLighting *src, LmLighting *dst ); void LmDeleteLights( LmLighting *lm ); #define LIGHTINGMAGIC OOGLMagic('l', 1) #define LMF_LOCALVIEWER 0x1 /* Local viewer (flag valid) */ #define LMF_AMBIENT 0x2 /* Ambient light color */ #define LMF_ATTENC 0x4 /* attenuation constant factor */ #define LMF_ATTENM 0x8 /* attenuation linear factor */ #define LMF_ATTEN2 0x20 /* 1/r^2 attenuation factor */ #define LMF_REPLACELIGHTS 0x10 /* When merging, use only new lights, not union */ #define MATMAGIC OOGLMagic('m', 1) #define MTF_EMISSION 0x1 #define MTF_AMBIENT 0x2 #define MTF_DIFFUSE 0x4 #define MTF_SPECULAR 0x8 #define MTF_Ka 0x10 #define MTF_Kd 0x20 #define MTF_Ks 0x40 #define MTF_ALPHA 0x80 #define MTF_SHININESS 0x100 #define MTF_EDGECOLOR 0x200 #define MTF_NORMALCOLOR 0x400 #define APMAGIC OOGLMagic('a', 1) /* The following bits are used in 'flag', 'valid', 'override' */ #define APF_FACEDRAW 0x2 /* Draw faces */ #define APF_EDGEDRAW 0x10 /* Draw edges */ #define APF_TRANSP 0x20 /* Enable transparency */ #define APF_EVERT 0x40 /* Evert surface normals */ #define APF_NORMALDRAW 0x80 /* Draw surface normals */ #define APF_VECTDRAW 0x100 /* Draw vectors/points */ #define APF_KEEPCOLOR 0x200 /* Not susceptible to N-D coloring */ #define APF_TEXTURE 0x400 /* Enable texture mapping */ #define APF_BACKCULL 0x800 /* Enable back-face culling */ #define APF_SHADELINES 0x2000 /* Enable line (edge & vect) lighting&shading */ #define APF_CONCAVE 0x4000 /* Expect concave polygons */ #define APF_TXMIPMAP 0x8000 /* Mip-mapped textures */ #define APF_TXMIPINTERP 0x10000 /* Interpolate between mipmaps */ #define APF_TXLINEAR 0x20000 /* Interpolate between texture pixels */ /* The following bits are used in 'valid', 'override' */ #define APF_SHADING 0x1 /* Use 'shading' value */ #define APF_NORMSCALE 0x4 /* Use 'nscale' value to draw normals */ #define APF_LINEWIDTH 0x8 /* Use 'linewidth' value */ #define APF_DICE 0x1000 /* Dicing (use udice, vdice fields) */ /* Possible values for ap->shading field; these MUST be consecutive !! (code outside the appearance library depends on this fact) */ #define APF_CONSTANT 0 /* constant-colored (unlighted) faces */ #define APF_FLAT 1 /* Flat-shaded, lighted faces */ #define APF_SMOOTH 2 /* Gouraud-shaded faces, with lighting */ #define APF_CSMOOTH 3 /* Gouraud-shaded faces, without lighting */ #define APF_VCFLAT 4 /* Gouraud-coloured, but flat faces */ #define IS_SMOOTH(shading) ((shading) >= APF_SMOOTH) #define IS_SHADED(shading) \ ((1<<(shading)) & ((1<ambient = *NEXT(Color *); light->changed = 1; break; case LT_COLOR: light->color = *NEXT(Color *); light->changed = 1; break; case LT_POSITION: light->position = *NEXT(HPoint3 *); light->changed = 1; break; case LT_INTENSITY: light->intensity = NEXT(double); light->changed = 1; break; case LT_LOCATION: light->location = NEXT(int); light->changed = 1; break; default: OOGLError (0, "_LtSet: undefined option: %d\n", attr); return NULL; break; } } return light; #undef NEXT } LtLight * LtCreate(int a1, ... ) { va_list alist; LtLight *light; va_start(alist,a1); light = _LtSet(NULL, a1, &alist); va_end(alist); return light; } LtLight * LtSet(LtLight *light, int attr, ...) { va_list alist; va_start(alist,attr); light = _LtSet(light,attr,&alist); va_end(alist); return light; } int LtGet(LtLight *light, int attr, void * value) { if (!light) return 0; switch (attr) { case LT_AMBIENT: *(Color *) value = light->ambient; break; case LT_COLOR: *(Color *) value = light->color; break; case LT_POSITION: *(Point *) value = light->position; break; case LT_INTENSITY: *(double *) value = light->intensity; break; case LT_LOCATION: *(int *)value = light->location; break; default: OOGLError (0, "LtGet: undefined option: %d\n", attr); return -1; break; } return 1; } void LtDelete(LtLight *l) { if(l == NULL || RefDecr((Ref *)l) > 0) return; if(l->magic != LTMAGIC) { OOGLError(1, "LtDelete(%x) of non-light: magic %x != %x", l, l->magic, LTMAGIC); return; } l->magic = LTMAGIC ^ 0x80000000; FreeLtLight(l); } LtLight * LtCopy( LtLight *l1, LtLight *l2 ) { if(l2 == NULL) l2 = NewLtLight(); *l2 = *l1; /* Don't reset the 'changed' & 'Private' fields */ /* Reset private and changed flags */ l2->Private = 0; l2->changed = 1; RefInit((Ref *)l2, LTMAGIC); return l2; } LtLight * LtDefault( LtLight *light ) { static HPoint3 defposition = { 0.0, 0.0, 1.0, 0.0 }; static Color deflight = { 1.0, 1.0, 1.0 }; light->intensity = 1.0; light->ambient = black; light->color = deflight; light->position = defposition; light->location = LTF_GLOBAL; light->Private = 0; light->changed = 1; return light; } /* * Set the intensity, color and position of a light. */ void LtProperties( LtLight *light, float intensity, Color *color, Point *position ) { light->intensity = intensity; light->color = *color; light->position = *position; light->location = LTF_GLOBAL; light->changed = 1; } /* * Load a lighting description from a file. */ LtLight * LtLoad(LtLight *li, char *name) { IOBFILE *f; if(name == NULL || (f = iobfopen(name, "r")) == NULL) { OOGLError(1, "Can't find light file %s: %s", name, sperror()); return NULL; } li = LtFLoad(li, f, name); iobfclose(f); return li; } /* * Load Light from file. * Syntax: * < "filename_containing_material" [or] * { keyword value keyword value ... } * */ LtLight * LtFLoad(LtLight *lite, IOBFILE *f, char *fname) { char *w; int i; float v[4]; int brack = 0; static char *lkeys[] = { "ambient", "color", "position", "location", "global", "camera", "local" }; static short largs[] = { 3, 3, 4, 0, ~LTF_GLOBAL, ~LTF_CAMERA, ~LTF_LOCAL }; int got; LtLight l; LtDefault(&l); for(;;) { switch(iobfnextc(f, 0)) { case '<': iobfgetc(f); if(LtLoad(&l, iobfdelimtok("(){}", f, 0)) == NULL) return NULL; if(!brack) goto done; break; case '{': brack++; iobfgetc(f); break; case '}': if(brack) { iobfgetc(f); } goto done; default: w = iobftoken(f, 0); if(w == NULL) goto done; for(i = sizeof(lkeys)/sizeof(lkeys[0]); --i >= 0; ) if(!strcmp(w, lkeys[i])) break; if( i < 0) { OOGLSyntax(f, "Reading light from %s: unknown keyword %s",fname,w); return NULL; } else if( largs[i] > 0 && (got=iobfgetnf(f, largs[i], v, 0)) != largs[i] ) { OOGLSyntax(f, "Reading light from %s: \"%s\" expects %d values, got %d", fname, w, largs[i], got); return NULL; } switch(i) { case 0: l.ambient = *(Color *)(void *)v; break; case 1: l.color = *(Color *)(void *)v; norm( &l.color, &l.intensity ); break; case 2: l.position = *(HPoint3 *)(void *)v; break; case 3: break; default: l.location = ~largs[i]; break; } } } done: lite = LtCopy(&l, lite); return lite; } void LtFSave(LtLight *l, FILE *f, Pool *p) { PoolFPrint(p, f, "ambient %f %f %f\n", l->ambient.r, l->ambient.g, l->ambient.b); PoolFPrint(p, f, "color %f %f %f\n", l->intensity*l->color.r, l->intensity*l->color.g, l->intensity*l->color.b); PoolFPrint(p, f, "position %f %f %f %f\n", l->position.x, l->position.y, l->position.z, l->position.w); if(l->location != LTF_GLOBAL) PoolFPrint(p, f, "location %s\n", l->location == LTF_CAMERA ? "camera" : "local"); /* PoolFPrint(p, f,"intensity %f\n", la->intensity); */ } /* * Create a list of lights and a lighting model. */ LmLighting * _LmSet(LmLighting *lgt, int a1, va_list *alist) { int attr; #define NEXT(type) va_arg(*alist, type) if (!alist) return lgt; if (lgt == NULL) { /* * New Lighting created here. */ lgt = OOGLNewE(LmLighting, "LmCreate Lighting"); LmDefault(lgt); } for(attr = a1; attr != LM_END; attr = NEXT(int)) { switch (attr) { /* parse argument list */ case LM_LtSet: LmAddLight(lgt, _LtSet(NULL, va_arg(*alist, int), alist)); break; case LM_LIGHT: LmAddLight(lgt, NEXT(LtLight *)); break; case LM_REPLACELIGHTS: if (NEXT(int)) lgt->valid |= LMF_REPLACELIGHTS; else lgt->valid &= ~LMF_REPLACELIGHTS; break; case LM_AMBIENT: lgt->ambient = *NEXT(Color *); lgt->valid |= LMF_AMBIENT; break; case LM_LOCALVIEWER: lgt->localviewer = NEXT(int); lgt->valid |= LMF_LOCALVIEWER; break; case LM_ATTENC: lgt->attenconst = NEXT(double); lgt->valid |= LMF_ATTENC; break; case LM_ATTENM: lgt->attenmult = NEXT(double); lgt->valid |= LMF_ATTENM; break; case LM_OVERRIDE: lgt->override |= NEXT(int); break; case LM_NOOVERRIDE: lgt->override &= ~NEXT(int); break; case LM_INVALID: lgt->valid &= ~NEXT(int); break; default: OOGLError (0, "_LmSet: undefined option: %d\n", attr); return NULL; break; } } return lgt; #undef NEXT } LmLighting * LmCreate(int attr, ... ) { va_list alist; LmLighting *lgt; va_start(alist,attr); lgt = _LmSet(NULL, attr, &alist); va_end(alist); return lgt; } LmLighting * LmSet(LmLighting *lgt, int a1, ... ) { va_list alist; va_start(alist,a1); lgt = _LmSet(lgt, a1, &alist); va_end(alist); return lgt; } int LmGet(LmLighting *lgt, int attr, void *value) { if (!lgt) return 0; switch (attr) { case LM_LIGHT: *(LtLight ***) value = &lgt->lights[0]; break; case LM_REPLACELIGHTS: *(int*)value = lgt->valid & LMF_REPLACELIGHTS; break; case LM_AMBIENT: *(Color *) value = lgt->ambient; break; case LM_LOCALVIEWER: *(double *) value = lgt->localviewer; break; case LM_ATTENC: *(double *) value = lgt->attenconst; break; case LM_ATTENM: *(double *) value = lgt->attenmult; break; case LM_ATTEN2: *(double *) value = lgt->attenmult2; break; case LM_OVERRIDE: case LM_NOOVERRIDE: *(int *) value = lgt->override; break; case LM_VALID: case LM_INVALID: *(int *) value = lgt->valid; break; default: OOGLError (0, "LmGet: undefined option: %d\n", attr); return -1; break; } return 1; } LmLighting * LmMerge(LmLighting *src, LmLighting *dst, int mergeflags) { unsigned int mask; if(dst == NULL) return LmCopy(src, NULL); mask = src ? (mergeflags & APF_OVEROVERRIDE) ? src->valid : src->valid & ~(dst->override &~ src->override) : 0; if(src == NULL || (mask == 0 && src->lights == NULL)) { RefIncr((Ref *)dst); return dst; } if(mask && !(mergeflags & APF_INPLACE)) dst = LmCopy(dst, NULL); dst->changed |= src->changed; dst->valid = (src->valid & mask) | (dst->valid & ~mask); dst->override = (src->override & mask) | (dst->override & ~mask); if(mask & LMF_LOCALVIEWER) dst->localviewer = src->localviewer; if(mask & LMF_AMBIENT) dst->ambient = src->ambient; if(mask & LMF_ATTENC) dst->attenconst = src->attenconst; if(mask & LMF_ATTENM) dst->attenmult = src->attenmult; if(mask & LMF_ATTEN2) dst->attenmult2 = src->attenmult2; /* LMF_REPLACELIGHTS: replace lights rather than merging with them */ if((mask & LMF_REPLACELIGHTS)) LmDeleteLights(dst); if(LM_ANY_LIGHTS(src)) LmCopyLights(src, dst); RefIncr((Ref *)dst); return dst; } LmLighting * LmCopy(LmLighting *from, LmLighting *to) { Ref r; if (from == NULL || from == to) return NULL; if(to == NULL) { to = OOGLNewE(LmLighting, "LmCopy LmLighting"); RefInit((Ref *)&r, LIGHTINGMAGIC); } else { r = *(Ref *)to; } *to = *from; RefInit((Ref *)to, LIGHTINGMAGIC); to->Private = 0; memset(&to->lights, 0, AP_MAXLIGHTS*sizeof(LtLight *)); LmCopyLights(from, to); *(Ref *)to = r; /* Restore ref header */ return to; } void LmCopyLights(LmLighting *from, LmLighting *to) { int i; LtLight **lp; LM_FOR_ALL_LIGHTS(from, i, lp) { LmAddLight(to, *lp); } } void LmDefault( LmLighting *l ) { RefInit((Ref *)l, LIGHTINGMAGIC); l->valid = l->override = 0; l->ambient = black; l->localviewer = 1; l->attenconst = 1.0; l->attenmult = 0.0; l->attenmult2 = 0.0; l->changed = 1; l->Private = 0; memset(&l->lights, 0, AP_MAXLIGHTS*sizeof(LtLight *)); } /* * Delete a list of lights and all the lights in the list. */ void LmDelete(LmLighting *lm) { if(lm == NULL || RefDecr((Ref *)lm) > 0) return; if(lm->magic != LIGHTINGMAGIC) { OOGLError(1, "LmDelete(%x) of non-LmLighting: magic %x != %x", lm, lm->magic, LIGHTINGMAGIC); return; } LmDeleteLights(lm); lm->magic = LIGHTINGMAGIC ^ 0x80000000; OOGLFree(lm); } void LmRemoveLight(LmLighting *lm, LtLight *lt) { LtLight **lp; LtLight **found = NULL, **last = NULL; int i; LM_FOR_ALL_LIGHTS(lm, i,lp) { if(*lp == lt) found = lp; last = lp; } if(found != NULL) { *found = *last; *last = NULL; } } void LmAddLight(LmLighting *lm, LtLight *lt) { LtLight **lp; int i; if(lt == NULL) return; LM_FOR_ALL_LIGHTS(lm, i,lp) { if(*lp == lt) { OOGLWarn("add dup light?"); break; } } if(i < AP_MAXLIGHTS) { *lp = lt; RefIncr((Ref *)lt); } else { OOGLError(1, "Can't have more than AP_MAXLIGHTS (%d) lights.", AP_MAXLIGHTS); } } void LmDeleteLights(LmLighting *lm) { LtLight **lp; int i; LM_FOR_ALL_LIGHTS(lm, i,lp) { LtDelete(*lp); *lp = NULL; } } #ifndef max # define max(a, b) ((a) > (b) ?( a) : (b)) #endif static void norm( color, coeff ) Color *color; float *coeff; { *coeff = max(color->r, color->g); *coeff = max(color->b, *coeff); if( *coeff != 0.0 ) { color->r /= *coeff; color->g /= *coeff; color->b /= *coeff; } } /* * Load Lighting from file. * Syntax: * < "filename_containing_material" [or] * { keyword value keyword value ... } * * Each keyword may be prefixed by "*", indicating that its value should * override corresponding settings in child objects. [By default, * children's appearance values supercede those of their parents.] * */ LmLighting * LmLoad(LmLighting *lgt, char *fname) { IOBFILE *f = iobfopen(fname, "r"); if(f == NULL) return NULL; lgt = LmFLoad(lgt, f, fname); iobfclose(f); return lgt; } LmLighting * LmFLoad(LmLighting *lgt, IOBFILE *f, char *fname) { char *w; int i; float v[3]; int brack = 0; int over, not; static char *lkeys[] = { "ambient", "localviewer", "attenconst", "attenmult", "attenmult2", "light", "replacelights" }; static char largs[] = { 3, 1, 1, 1, 1, 0, 0}; static unsigned short lbits[] = { LMF_AMBIENT, LMF_LOCALVIEWER, LMF_ATTENC, LMF_ATTENM, LMF_ATTEN2, 0, LMF_REPLACELIGHTS }; int got; LmLighting l; if(lgt == NULL) lgt = LmCreate(LM_END); over = not = 0; for(;;) { switch(iobfnextc(f, 0)) { case '<': iobfgetc(f); if(LmLoad(&l, iobftoken(f, 0)) == NULL) return NULL; if(!brack) goto done; break; case '{': brack++; iobfgetc(f); break; case '}': if(brack) { iobfgetc(f); } goto done; case '*': over = 1; iobfgetc(f); break; /* 'override' prefix */ case '!': not = 1; iobfgetc(f); break; default: w = iobftoken(f, 0); if(w == NULL) return lgt; for(i = sizeof(lkeys)/sizeof(lkeys[0]); --i >= 0; ) if(!strcmp(w, lkeys[i])) break; if( i < 0) { OOGLError(1, "LmFLoad: %s: unknown lighting keyword %s",fname,w); return NULL; } else if( !not && (got=iobfgetnf(f, largs[i], v, 0)) != largs[i] ) { OOGLError(1, "LmFLoad: %s: \"%s\" expects %d values, got %d", fname, w, largs[i], got); return NULL; } if(not) { if(!over) lgt->valid &= ~lbits[i]; lgt->override &= ~lbits[i]; } else { lgt->valid |= lbits[i]; if(over) lgt->override |= lbits[i]; switch(i) { case 0: lgt->ambient = *(Color *)(void *)v; break; case 1: lgt->localviewer = v[0]; break; case 2: lgt->attenconst = v[0]; break; case 3: lgt->attenmult = v[0]; break; case 4: lgt->attenmult2 = v[0]; break; case 5: LmAddLight( lgt, LtFLoad( NULL, f, fname ) ); break; } } over = not = 0; } } done: return lgt; } /* * Save a light description in a file. */ void LmFSave(LmLighting *li, FILE *f, char *fname, Pool *p) { LtLight **lp; int i; PoolFPrint(p, f, "ambient %.8g %.8g %.8g\n", li->ambient.r, li->ambient.g, li->ambient.b); PoolFPrint(p, f, "localviewer %d\n", li->localviewer); PoolFPrint(p, f, "attenconst %.8g\n", li->attenconst); PoolFPrint(p, f, "attenmult %.8g\n", li->attenmult); if(li->valid & LMF_ATTEN2) { PoolFPrint(p, f,"attenmult2 %.8g\n", li->attenmult2); } if (li->valid & LMF_REPLACELIGHTS) { PoolFPrint(p, f, "replacelights\n"); } LM_FOR_ALL_LIGHTS(li, i,lp) { PoolFPrint(p, f, "light {\n"); PoolIncLevel(p, 1); LtFSave( *lp, f, p ); PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/shade/Makefile.am0000644000175000001440000000027610571511107014744 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libshade.la libshade_la_SOURCES = \ appearance.c apstream.c appearance.h \ texture.c material.c light.c image.c geomview-1.9.4/src/lib/shade/Makefile.in0000644000175000001440000003620210665240507014762 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/shade DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libshade_la_LIBADD = am_libshade_la_OBJECTS = appearance.lo apstream.lo texture.lo \ material.lo light.lo image.lo libshade_la_OBJECTS = $(am_libshade_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libshade_la_SOURCES) DIST_SOURCES = $(libshade_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libshade.la libshade_la_SOURCES = \ appearance.c apstream.c appearance.h \ texture.c material.c light.c image.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/shade/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/shade/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libshade.la: $(libshade_la_OBJECTS) $(libshade_la_DEPENDENCIES) $(LINK) $(libshade_la_OBJECTS) $(libshade_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/appearance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apstream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/image.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/light.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/material.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texture.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/shade/material.c0000644000175000001440000002661510575036017014665 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "appearance.h" #include "transobj.h" #include "handleP.h" #include #include extern int Apsavepfx(int valid, int override, int mask, char *keyword, FILE *f, Pool *p); Material * _MtSet(Material *mat, int attr1, va_list *alist) { int attr; #define NEXT(type) va_arg(*alist, type) if (mat == NULL) { /* * New Material created here. */ mat = OOGLNewE(Material, "new Material"); MtDefault(mat); } for (attr = attr1; attr != MT_END; attr = NEXT(int)) { switch (attr) { /* parse argument list */ case MT_AMBIENT: mat->ambient = *NEXT(Color *); mat->valid |= MTF_AMBIENT; break; case MT_DIFFUSE: *(Color *)(void *)&mat->diffuse = *NEXT(Color *); mat->valid |= MTF_DIFFUSE; break; case MT_SPECULAR: mat->specular = *NEXT(Color *); mat->valid |= MTF_SPECULAR; break; case MT_EMISSION: mat->emission = *NEXT(Color *); mat->valid |= MTF_EMISSION; break; case MT_ALPHA: mat->diffuse.a = NEXT(double); mat->valid |= MTF_ALPHA; break; case MT_Ka: mat->ka = NEXT(double); mat->valid |= MTF_Ka; break; case MT_Kd: mat->kd = NEXT(double); mat->valid |= MTF_Kd; break; case MT_Ks: mat->ks = NEXT(double); mat->valid |= MTF_Ks; break; case MT_SHININESS: mat->shininess = NEXT(double); mat->valid |= MTF_SHININESS; break; case MT_EDGECOLOR: mat->edgecolor = *NEXT(Color *); mat->valid |= MTF_EDGECOLOR; break; case MT_NORMALCOLOR: mat->normalcolor = *NEXT(Color *); mat->valid |= MTF_NORMALCOLOR; break; case MT_INVALID: mat->valid &= ~NEXT(int); break; case MT_OVERRIDE: mat->override |= NEXT(int); break; case MT_NOOVERRIDE: mat->override &= ~NEXT(int); break; default: OOGLError (0, "_MtSet: undefined option: %d\n", attr); return NULL; break; } } return mat; #undef NEXT } Material * MtCreate(int a1, ... ) { va_list alist; Material *mat; va_start(alist,a1); mat = _MtSet(NULL, a1, &alist); va_end(alist); return mat; } Material * MtSet(Material *mat, int attr, ... ) { va_list alist; va_start(alist,attr); mat = _MtSet(mat,attr,&alist); va_end(alist); return mat; } int MtGet(Material *mat, int attr, void * value) { if (mat == NULL) return -1; switch (attr) { case MT_AMBIENT: *(Color *) value = mat->ambient; break; case MT_DIFFUSE: *(Color *) value = *(Color *)(void *)&mat->diffuse; break; case MT_SPECULAR: *(Color *) value = mat->specular; break; case MT_EMISSION: *(Color *) value = mat->emission; break; case MT_ALPHA: *(double *) value = mat->diffuse.a; break; case MT_Ka: *(double *) value = mat->ka; break; case MT_Kd: *(double *) value = mat->kd; break; case MT_Ks: *(double *) value = mat->ks; break; case MT_SHININESS: *(double *) value = mat->shininess; break; case MT_EDGECOLOR: *(Color *)value = mat->edgecolor; break; case MT_NORMALCOLOR: *(Color *)value = mat->normalcolor; break; case MT_OVERRIDE: case MT_NOOVERRIDE: *(int *) value = mat->override; break; case MT_VALID: case MT_INVALID: *(int *) value = mat->valid; break; default: OOGLError (0, "MtGet: undefined option: %d\n", attr); return -1; break; } return 1; } void MtDelete(Material *mat) { if (mat && RefDecr((Ref *)mat) <= 0) { if (mat->magic != MATMAGIC) { OOGLError(1, "MtDelete(%x) of non-Material: magic %x != %x", mat, mat->magic, MATMAGIC); return; } mat->magic = MATMAGIC ^ 0x80000000; OOGLFree(mat); } } Material * MtDefault( Material *mat ) { memset(mat, 0, sizeof(Material)); RefInit((Ref *)mat, MATMAGIC); mat->valid = mat->override = 0; mat->diffuse.a = 1.0; mat->Private = 0; mat->changed = 1; return mat; } Material * MtCopy( Material *src, Material *dst ) { if (!src) return NULL; if (dst == NULL) dst = OOGLNewE(Material, "MtCopy: Material"); *dst = *src; dst->Private = 0; RefInit((Ref *)dst, MATMAGIC); dst->changed = 1; return dst; } #ifndef max # define max(a,b) ((a) > (b) ? (a) : (b)) #endif #if 0 static void norm( color, coeff ) Color *color; float *coeff; { *coeff = max(color->r, color->g); *coeff = max(color->b, *coeff); if ( *coeff != 0.0 ) { color->r /= *coeff; color->g /= *coeff; color->b /= *coeff; } } #endif /* * MtMerge(src, dst, mergeflags) * Merge Material values: src into dst, controlled by flag. * If "inplace" is true, changes are made in dst itself; otherwise, * the dst material is copied if any changes need be made to it. * The returned Material's reference count is incremented as appropriate; * thus the caller should MtDelete() the returned Material when done. */ Material * MtMerge(Material *src, Material *dst, int mergeflags) { int mask; if (dst == NULL) return MtCopy(src, NULL); /* Fields to merge in */ mask = src ? (mergeflags & APF_OVEROVERRIDE) ? src->valid : src->valid & ~(dst->override &~ src->override) : 0; if (mergeflags & APF_INPLACE) RefIncr((Ref *)dst); else dst = MtCopy(dst, NULL); if (mask == 0) /* No changes to dst */ return dst; dst->changed |= src->changed; dst->valid = (src->valid & mask) | (dst->valid & ~mask); dst->override = (src->override & mask) | (dst->override & ~mask); if (mask & MTF_EMISSION) dst->emission = src->emission; if (mask & MTF_AMBIENT) dst->ambient = src->ambient; if (mask & MTF_DIFFUSE) { dst->diffuse.r = src->diffuse.r; dst->diffuse.g = src->diffuse.g; dst->diffuse.b = src->diffuse.b; } if (mask & MTF_SPECULAR) dst->specular = src->specular; if (mask & MTF_Ka) dst->ka = src->ka; if (mask & MTF_Kd) dst->kd = src->kd; if (mask & MTF_Ks) dst->ks = src->ks; if (mask & MTF_ALPHA) dst->diffuse.a = src->diffuse.a; if (mask & MTF_SHININESS) dst->shininess = src->shininess; if (mask & MTF_EDGECOLOR) dst->edgecolor = src->edgecolor; if (mask & MTF_NORMALCOLOR) dst->normalcolor = src->normalcolor; return dst; } int MtSave(Material *mat, char *name) { FILE *f; int ok; f = fopen(name,"w"); if (!f) { perror(name); return -1; } ok = MtFSave(mat, f, NULL); fclose(f); return ok; } Material *MtLoad(Material *mat, char *name) { IOBFILE *f = iobfopen(name,"rb"); if (f == NULL) { OOGLError(0, "MtLoad: can't open %s: %s", name, sperror()); return NULL; } mat = MtFLoad(mat, f, name); iobfclose(f); return mat; } /* * Load Material from file. * Syntax: * < "filename_containing_material" [or] * { keyword value keyword value ... } * * Each keyword may be prefixed by "*", indicating that its value should * override corresponding settings in child objects. [By default, * children's appearance values supercede those of their parents.] * * Note: don't overwrite ka, kd, ks if they're already set when we read in * the corresponding color. */ static char *mt_kw[] = { "shininess", "ka", "kd", "ks", "alpha", "backdiffuse", "emission", "ambient", "diffuse", "specular", "edgecolor", "normalcolor", "material" }; static unsigned short mt_flags[] = { MTF_SHININESS, MTF_Ka, MTF_Kd, MTF_Ks, MTF_ALPHA, MTF_EMISSION, MTF_EMISSION, MTF_AMBIENT, MTF_DIFFUSE, MTF_SPECULAR, MTF_EDGECOLOR, MTF_NORMALCOLOR, 0 }; static char mt_args[] = { 1,1,1,1,1, 3,3,3,3,3,3,3, 0 }; /* fname used for error msgs, may be NULL */ Material * MtFLoad(Material *mat, IOBFILE *f, char *fname) { char *w; int i; float v[3]; int brack = 0; int over, not; int got; Material m; MtDefault(&m); over = not = 0; for (;;) { switch(iobfnextc(f, 0)) { case '<': iobfgetc(f); if (MtLoad(&m, iobfdelimtok("{}()", f, 0)) == NULL) return NULL; if (!brack) goto done; break; case '{': brack++; iobfgetc(f); break; case '}': if (brack) { iobfgetc(f); } goto done; case '*': over = 1; iobfgetc(f); break; /* 'override' prefix */ case '!': not = 1; iobfgetc(f); break; default: w = iobfdelimtok("{}()", f, 0); if (w == NULL) return MtCopy(&m, mat); /* break; */ /* done */ for (i = sizeof(mt_kw)/sizeof(mt_kw[0]); --i >= 0; ) if (!strcmp(w, mt_kw[i])) break; if ( i < 0) { OOGLError(1, "MtFLoad: %s: unknown material keyword %s",fname,w); return NULL; } else if ( !not && (got=iobfgetnf(f, mt_args[i], v, 0)) != mt_args[i] ) { OOGLError(1, "MtFLoad: %s: \"%s\" expects %d values, got %d", fname, w, mt_args[i], got); return NULL; } if (not) { if (!over) m.valid &= ~mt_flags[i]; m.override &= ~mt_flags[i]; } else { switch(i) { case 0: m.shininess = v[0]; break; case 1: m.ka = v[0]; break; case 2: m.kd = v[0]; break; case 3: m.ks = v[0]; break; case 4: m.diffuse.a = v[0]; break; case 5: case 6: m.emission = *(Color *)(void *)v; break; case 7: m.ambient = *(Color *)(void *)v; break; case 8: *(Color *)(void *)&m.diffuse = *(Color *)(void *)v; break; case 9: m.specular = *(Color *)(void *)v; break; case 10: m.edgecolor = *(Color *)(void *)v; break; case 11: m.normalcolor = *(Color *)(void *)v; break; } m.valid |= mt_flags[i]; if (over) m.override |= mt_flags[i]; } over = not = 0; } } done: return MtCopy(&m, mat); } int MtFSave(Material *mat, FILE *f, Pool *p) { int i; float v; Color *c; for (i = 0; i < sizeof(mt_kw)/sizeof(mt_kw[0]); i++) { if (Apsavepfx(mat->valid, mat->override, mt_flags[i], mt_kw[i], f, p)) { switch(mt_flags[i]) { case MTF_Ka: v = mat->ka; goto pfloat; case MTF_Kd: v = mat->kd; goto pfloat; case MTF_Ks: v = mat->ks; goto pfloat; case MTF_SHININESS: v = mat->shininess; goto pfloat; case MTF_ALPHA: v = mat->diffuse.a; goto pfloat; pfloat: fprintf(f, "%f\n", v); break; case MTF_DIFFUSE: c = (Color *)(void *)&mat->diffuse; goto pcolor; case MTF_AMBIENT: c = &mat->ambient; goto pcolor; case MTF_EMISSION: c = &mat->emission; goto pcolor; case MTF_SPECULAR: c = &mat->specular; goto pcolor; case MTF_EDGECOLOR: c = &mat->edgecolor; goto pcolor; case MTF_NORMALCOLOR: c = &mat->normalcolor; goto pcolor; pcolor: fprintf(f, "%f %f %f\n", c->r, c->g, c->b); break; } } } return ferror(f); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/shade/texture.c0000644000175000001440000005117710622716760014573 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006-2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include "appearance.h" #include "transobj.h" #include "handleP.h" #include "dbllist.h" DBLLIST(AllLoadedTextures); Texture * TxFLoad(IOBFILE *inf, char *fname) { Pool *p; Texture *tx = NULL; p = PoolStreamTemp(fname, inf, NULL, 0, &TextureOps); TxStreamIn(p, NULL, &tx); PoolDelete(p); return tx; } Texture * TxFSave(Texture *tx, FILE *outf, char *fname) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_DATA); PoolIncLevel(p, 1); ok = TxStreamOut(p, NULL, tx); PoolDelete(p); return ok ? tx : NULL; } void TxUpdateImage(Handle **hp, Ref *parentobj, Image **imgp) { Texture *tx = (Texture *)parentobj; TxPurge(tx); HandleUpdRef(hp, parentobj, (Ref **)imgp); } static inline Texture *TxDefault(Texture *tx) { memset((char *)tx, 0, sizeof(Texture)); RefInit((Ref *)tx, TXMAGIC); TmIdentity(tx->tfm); DblListInit(&tx->loadnode); return tx; } Texture * _TxSet(Texture *tx, int attr1, va_list *alist) { int mask; Handle *h; Image *img; TransformPtr f; int attr; char *str; bool do_purge = false; bool img_files = false; bool do_delete = false; if (tx == NULL) { tx = OOGLNewE(Texture, "TxCreate Texture"); TxDefault(tx); do_delete = true; } #define NEXT(type) va_arg(*alist, type) for ( attr = attr1; attr != TX_END; attr = NEXT(int)) { switch (attr) { /* parse argument list */ case TX_DOCLAMP: mask = NEXT(int); tx->flags = (tx->flags & ~(TXF_SCLAMP|TXF_TCLAMP)) | (mask & (TXF_SCLAMP|TXF_TCLAMP)); break; case TX_APPLY: mask = NEXT(int); if (mask < TXF_MODULATE || mask > TXF_REPLACE) { OOGLError(1, "TxSet: bad value for TX_APPLY: %d must be %d..%d", mask, TXF_MODULATE, TXF_DECAL); goto nope; } tx->apply = (enum apply_enum)mask; break; case TX_FILE: str = NEXT(char *); if (str && tx->filename && strcmp(str, tx->filename) == 0) { break; } if (tx->filename) { OOGLFree(tx->filename); } tx->filename = str ? strdup(str) : NULL; do_purge = true; img_files = true; break; case TX_ALPHAFILE: str = NEXT(char *); if (str && tx->alphafilename && strcmp(str, tx->alphafilename) == 0) { break; } if (tx->alphafilename) { OOGLFree(tx->alphafilename); } tx->alphafilename = str ? strdup(str) : NULL; do_purge = true; img_files = true; break; #if 0 case TX_DATA: str = NEXT(char *); if (tx->data && str != tx->data) OOGLFree(tx->data); tx->data = str; if (str) tx->flags |= TXF_LOADED; break; case TX_XSIZE: mask = NEXT(int); if (mask != tx->xsize) tx->flags &= ~TXF_LOADED; tx->xsize = mask; break; case TX_YSIZE: mask = NEXT(int); if (mask != tx->ysize) tx->flags &= ~TXF_LOADED; tx->ysize = mask; break; case TX_CHANNELS: mask = NEXT(int); if (mask != tx->channels) tx->flags &= ~TXF_LOADED; tx->channels = mask; break; #endif #if 0 /* not implemented */ case TX_COORDS: mask = NEXT(int); if (mask < TXF_COORD_GIVEN||mask > TXF_COORD_NORMAL) { OOGLError(1, "TxSet: bad value for TX_APPLY: %d must be %d..%d", mask, TXF_MODULATE, TXF_DECAL); goto nope; } tx->coords = mask; break; #endif case TX_BACKGROUND: tx->background = *NEXT(Color *); break; case TX_HANDLE_IMAGE: h = NEXT(Handle *); img = NEXT(Image *); if (tx->imghandle) { HandlePDelete(&tx->imghandle); } tx->imghandle = REFGET(Handle, h); if (h) { HandleRegister(&tx->imghandle, (Ref *)tx, &tx->image, TxUpdateImage); HandleSetObject(tx->imghandle, (Ref *)img); } else { tx->image = REFGET(Image, img); } do_purge = true; break; case TX_HANDLE_TRANSFORM: h = NEXT(Handle *); f = NEXT(TransformPtr); if (tx->tfmhandle) { HandlePDelete( &tx->tfmhandle ); } tx->tfmhandle = REFGET(Handle, h); TmCopy(f, tx->tfm); if (h) { HandleRegister(&tx->tfmhandle, (Ref *)tx, tx->tfm, TransUpdate); } break; default: OOGLError(1, "TxSet: unknown attribute %d", attr); goto nope; } } if (do_purge) { tx->flags &= ~TXF_LOADED; TxPurge(tx); } if (img_files) { } return tx; nope: if (do_delete) { TxDelete(tx); } return NULL; } Texture * TxCreate(int a1, ...) { va_list alist; Texture *tx; va_start(alist,a1); tx = _TxSet(NULL, a1, &alist); va_end(alist); return tx; } Texture * TxSet(Texture *tx, int a1, ... ) { va_list alist; va_start(alist,a1); tx = _TxSet(tx, a1, &alist); va_end(alist); return tx; } TxUser * TxAddUser(Texture *tx, int id, int (*needed)(TxUser *), void (*purge)(TxUser *)) { TxUser *tu = OOGLNew(TxUser); memset((void *)tu, 0, sizeof(TxUser)); /* flags = 0, ctx = NULL, data = NULL */ tu->tx = tx; tu->id = id; tu->needed = needed; tu->purge = purge; tu->next = tx->users; tx->users = tu; if (DblListEmpty(&tx->loadnode)) { /* Ensure this texture is on the AllLoadedTextures list. */ DblListAdd(&AllLoadedTextures, &tx->loadnode); } return tu; } void TxRemoveUser(TxUser *tu) { TxUser **tup; Texture *tx; if (tu == NULL) { return; } tx = tu->tx; for (tup = &tx->users; *tup != NULL; tup = &(*tup)->next) { if (tu == *tup) { *tup = tu->next; if (tu->purge) { (*tu->purge)(tu); } OOGLFree(tu); break; } } if (tx->users == NULL) { TxPurge(tx); } } /* Reclaim memory from texture, but don't discard essential stuff * Notify all users to purge their information. This will be their * only notice. */ void TxPurge(Texture *tx) { /* Tell each user to get lost */ TxUser *u, *nextu; DblListDelete(&tx->loadnode); for (u = tx->users; u != NULL; u = nextu) { nextu = u->next; if (u->purge) { (*u->purge)(u); } OOGLFree(u); } tx->users = NULL; tx->flags &= ~TXF_USED; } void TxDelete(Texture *tx) { if (tx == NULL) { return; } if (tx->magic != TXMAGIC) { OOGLWarn("Internal warning: TxDelete on non-Texture %x (%x != %x)", tx, tx->magic, TXMAGIC); return; } if (RefDecr((Ref *)tx) > 0) { return; } TxPurge(tx); if (tx->filename) OOGLFree(tx->filename); if (tx->alphafilename) OOGLFree(tx->alphafilename); if (tx->tfmhandle) HandlePDelete(&tx->tfmhandle); if (tx->imghandle) HandlePDelete(&tx->imghandle); if (tx->image) ImgDelete(tx->image); OOGLFree(tx); } HandleOps TextureOps = { "texture", (int ((*)()))TxStreamIn, (int ((*)()))TxStreamOut, (void ((*)()))TxDelete, NULL, NULL }; static struct txkw { char *word; unsigned int aval; /* attribute or attribute value value for _TxSet() */ int args; /* > 0: number of following args, * < 0: -number of following keywords determine * attribute value. */ } tx_kw[] = { { "texture", 0, 1 }, { "clamp", TX_DOCLAMP, -4 }, { "none", 0, 0 }, { "s", TXF_SCLAMP, 0 }, { "t", TXF_TCLAMP, 0 }, { "st", TXF_SCLAMP|TXF_TCLAMP, 0 }, { "image", TX_HANDLE_IMAGE, 0 }, { "apply", TX_APPLY, -4 }, { "blend", TXF_BLEND, 0 }, { "modulate", TXF_MODULATE, 0 }, { "decal", TXF_DECAL, 0 }, { "replace", TXF_REPLACE, 0 }, { "transform", TX_HANDLE_TRANSFORM, 0 }, /*(s,t,r,q) . tfm = tx coords */ { "background", TX_BACKGROUND, 3 }, /* deprecated, maybe */ { "file", TX_FILE, 0 }, { "alphafile", TX_ALPHAFILE, 0 }, #if 0 { "xsize", TX_XSIZE, 1 }, { "ysize", TX_YSIZE, 1 }, { "channels", TX_CHANNELS, 1 }, #endif /********************/ #if 0 /* not implemented ... original comment: */ /* Let's not implement this initially */ { "coords", TX_COORDS, -4 }, { "given", TXF_COORD_GIVEN, 0 }, { "local", TXF_COORD_LOCAL, 0 }, { "camera", TXF_COORD_CAMERA, 0 }, { "normal", TXF_COORD_NORMAL, 0 }, #endif }; #if SIZEOF_INO_T == 0 # undef SIZEOF_INO_T # define SIZEOF_INO_T SIZEOF_LONG #endif #if SIZEOF_DEV_T == 0 # undef SIZEOF_DEV_T # define SIZEOF_DEV_T SIZEOF_LONG #endif #if SIZEOF_TIME_T == 0 # undef SIZEOF_TIME_T # define SIZEOF_TIME_T SIZEOF_LONG #endif #define INO_T_LSIZE (SIZEOF_INO_T+SIZEOF_INO_T-1)/SIZEOF_LONG #define DEV_T_LSIZE (SIZEOF_DEV_T+SIZEOF_DEV_T-1)/SIZEOF_LONG #define TIME_T_LSIZE (SIZEOF_TIME_T+SIZEOF_TIME_T-1)/SIZEOF_LONG #define LONG_CHARS (SIZEOF_LONG*2) static inline int stat_to_handle(char *str, dev_t dev, ino_t ino, time_t time) { union { ino_t ino; long data[INO_T_LSIZE]; } ino_t_conv; union { dev_t dev; long data[DEV_T_LSIZE]; } dev_t_conv; union { time_t time; long data[TIME_T_LSIZE]; } time_t_conv; int i, cnt, len; strcpy(str, "::"); str += (cnt = 2); ino_t_conv.ino = ino; for (i = 0; i < INO_T_LSIZE; i++) { #if 0 len = sprintf(str, "%0*lx", LONG_CHARS, ino_t_conv.data[i]); #else len = sprintf(str, "%lx", ino_t_conv.data[i]); #endif str += len; cnt += len; } *str++ = '@'; cnt++; dev_t_conv.dev = dev; for (i = 0; i < DEV_T_LSIZE; i++) { #if 0 len = sprintf(str, "%0*lx", LONG_CHARS, dev_t_conv.data[i]); #else len = sprintf(str, "%lx", dev_t_conv.data[i]); #endif str += len; cnt += len; } *str++ = '@'; cnt++; time_t_conv.time = time; for (i = 0; i < TIME_T_LSIZE; i++) { #if 0 len = sprintf(str, "%0*lx", LONG_CHARS, time_t_conv.data[i]); #else len = sprintf(str, "%lx", time_t_conv.data[i]); #endif str += len; cnt += len; } return cnt; } /* see the comments in src/lib/gprim/geom/geomstream.c */ int TxStreamIn(Pool *p, Handle **hp, Texture **txp) { IOBFILE *stream; char *fname; Handle *h = NULL; Texture *tx = NULL; float val[16]; struct txkw *kw; char *w, *raww; int i, k = 0; int brack = 0; int empty = 1; bool braces = true; /*int plus = 0;*/ bool more, mine = true; /* Questionable -- we'll report all errors */ if ((stream = PoolInputFile(p)) == NULL) { return 0; } fname = PoolName(p); more = false; do { iobfnextc(stream, 0); switch(i = iobfgetc(stream)) { case ':': case '<': w = iobfdelimtok("{}()", stream, 0); /* * Consider doing a path search. * Do this before calling HandleReferringTo() * to prevent spurious error messages. */ if (i == '<' && (h = HandleByName(w, &TextureOps)) == NULL && w[0] != '/') { w = findfile(fname, raww = w); if (w == NULL) { OOGLSyntax(PoolInputFile(p), "Error reading \"%s\": can't find file \"%s\"", fname, raww); } } else if (h) { HandleDelete(h); } h = HandleReferringTo(i, w, &TextureOps, NULL); if (h != NULL) { tx = (Texture *)HandleObject(h); RefIncr((Ref*)tx); } break; case EOF: brack = 0; break; case '{': brack++; braces = true; break; case '}': if (brack-- <= 0) { iobfungetc(i, stream); } break; case '-': case '!': /*plus = -1;*/ break; case '+': /*plus = 1;*/ break; case '*': break; default: more = false; iobfungetc(i, stream); w = iobfdelimtok("{}()", stream, 0); if (w == NULL) { break; } for (i = sizeof(tx_kw)/sizeof(tx_kw[0]), kw = tx_kw; --i >= 0; kw++) if (!strcmp(kw->word, w)) break; if (i < 0) { if (mine) OOGLSyntax(stream, "%s: unknown texture keyword %s", fname, w); return 0; } if (tx == NULL) { tx = TxCreate(TX_END); } if (kw->args < 0) { char allowed[256], *tail = allowed; w = iobfdelimtok("{}()", stream, 0); if (w == NULL) w = ""; allowed[0] = '\0'; for (k = 1; strcmp((kw+k)->word, w); k++) { sprintf(tail, " %s", (kw+k)->word); tail += strlen(tail); if (k + kw->args >= 0) { OOGLSyntax(stream, "%s: %s %s: expected one of: %s", fname, kw->word, w, allowed); TxDelete(tx); return 0; } } } else if (kw->args > 0) { int n = iobfgetnf(stream, kw->args, val, 0); if (n != kw->args) { OOGLSyntax(stream, "%s: %s expected %d numeric values", fname, w, kw->args); TxDelete(tx); return 0; } } empty++; switch((int)kw->aval) { case -1: mine = more = true; empty--; break; case TX_APPLY: tx->apply = (enum apply_enum)(kw+k)->aval; break; case TX_FILE: case TX_ALPHAFILE: raww = iobfdelimtok("{}()", stream, 0); w = findfile(fname, raww); if (w == NULL) { OOGLSyntax(stream, "Warning: reading \"%s\": can't find file \"%s\", ignoring texture", fname, raww); } else { TxSet(tx, kw->aval, w, TX_END); } break; #if 0 /* does not belong here */ case TX_XSIZE: case TX_YSIZE: case TX_CHANNELS: if (val[0] < 1 || val[0] > (tx_kw[i].aval==TX_CHANNELS) ? 4 : 100000) { OOGLSyntax(stream, "%s: Bad value for %s: %s", fname, kw->word, w); TxDelete(tx); return 0; } TxSet(tx, kw->aval, (int)val[0], TX_END); break; #endif #if 0 /* not implemented */ case TX_COORDS: tx->coords = (kw+k)->aval; break; #endif case TX_BACKGROUND: { /* We allow ColorA for compatibility, but the texture * background color really is only RGB, not RGBA (see * glTexEnvf(3)). So: if the next character is not a closing * brace and not '\n', consume the next float which should be * the alpha component */ float dummy; int c; if ((c = iobfnextc(stream, 1)) != '\n' && c != '}' && c != EOF) { if (iobfgetnf(stream, 1, &dummy, 0) < 1) { OOGLSyntax(stream, "%s: background color expected", fname); TxDelete(tx); return false; } } TxSet(tx, kw->aval, val, TX_END); break; } case TX_HANDLE_IMAGE: if (!ImgStreamIn(p, &tx->imghandle, &tx->image)) { OOGLSyntax(stream, "%s: texture image definition expected", fname); TxDelete(tx); return false; } if (tx->filename) { OOGLFree(tx->filename); tx->filename = NULL; } if (tx->alphafilename) { OOGLFree(tx->alphafilename); tx->alphafilename = NULL; } if (tx->imghandle) { HandleRegister(&tx->imghandle, (Ref *)tx, &tx->image, TxUpdateImage); } break; case TX_HANDLE_TRANSFORM: if (!TransStreamIn(p, &tx->tfmhandle, tx->tfm)) { OOGLSyntax(stream, "%s: 4x4 texture transform expected", fname); TxDelete(tx); return false; } if (tx->tfmhandle) { HandleRegister(&tx->tfmhandle, (Ref *)tx, tx->tfm, TransUpdate); } break; case TX_DOCLAMP: tx->flags = (kw+k)->aval; break; default: break; } /*plus = 0;*/ } } while (brack > 0 || more); /* handle file and alphafile constructs */ if (h == NULL && tx->filename) { struct stat st; char hname[2*(4+(INO_T_LSIZE+DEV_T_LSIZE+TIME_T_LSIZE)*SIZEOF_LONG)+1]; char *ptr; if (tx->imghandle) { HandlePDelete(&tx->imghandle); tx->imghandle = NULL; } if (tx->image) { ImgDelete(tx->image); tx->image = NULL; } if (stat(tx->filename, &st) < 0) { OOGLSyntax(stream, "%s: cannot stat file %s", fname, tx->filename); TxDelete(tx); return 0; } ptr = hname; ptr += stat_to_handle(ptr, st.st_dev, st.st_ino, st.st_mtime); if (tx->alphafilename) { if (stat(tx->alphafilename, &st) < 0) { OOGLSyntax(stream, "%s: cannot stat file %s", fname, tx->filename); TxDelete(tx); return 0; } ptr += stat_to_handle(ptr, st.st_dev, st.st_ino, st.st_mtime); } /* we share texture images defined by the same files, as was * the previous behaviour. However, this is implemented using * references and handles to image objects. */ tx->imghandle = HandleByName(hname, &ImageOps); if (tx->imghandle != NULL) { tx->image = REFGET(Image, HandleObject(tx->imghandle)); } else { /* This means there is no image, create one */ tx->image = tx->alphafilename ? ImgCreate(IMG_DATA_CHAN_FILE, IMGF_AUTO, NULL, tx->filename, IMG_DATA_CHAN_FILE, IMGF_ALPHA, NULL, tx->alphafilename, IMG_END) : ImgCreate(IMG_DATA_CHAN_FILE, IMGF_AUTO, NULL, tx->filename, IMG_END); if (!tx->image) { OOGLSyntax(stream, "%s: cannot create image from given files " "(\"%s\"/\"%s\"", fname, tx->filename, tx->alphafilename); TxDelete(tx); return 0; } /* Generate a new reference */ tx->imghandle = HandleAssign(hname, &ImageOps, (Ref *)tx->image); tx->imghandle->permanent = false; } } /* Pass the ownership of h and tx to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp != NULL) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (txp != NULL) { if (*txp != NULL) { TxDelete(*txp); } *txp = tx; } else if(tx) { TxDelete(tx); } return (tx != NULL || h != NULL || (empty && braces)); } int TxStreamOut(Pool *p, Handle *h, Texture *tx) { static const char *clamps[] = {"none", "s", "t", "st"}; static const char *applies[] = {"modulate", "decal", "blend", "replace"}; FILE *f = PoolOutputFile(p); if (f == NULL) { return 0; } PoolFPrint(p, f, "texture {\n"); PoolIncLevel(p, 1); PoolFPrint(p, f, "clamp %s\n", clamps[tx->apply & (TXF_SCLAMP|TXF_TCLAMP)]); PoolFPrint(p, f, "apply %s\n", (unsigned int)tx->apply < COUNT(applies) ? applies[tx->apply] : "???"); PoolFPrint(p, f, "background %.8g %.8g %.8g\n", tx->background.r, tx->background.g, tx->background.b); PoolFPrint(p, f, ""); TransStreamOut(p, tx->tfmhandle, tx->tfm); if (tx->filename) { PoolFPrint(p, f, "file %s\n", tx->filename); if (tx->alphafilename) { PoolFPrint(p, f, "alphafile %s\n", tx->alphafilename); } } else { PoolFPrint(p, f, ""); ImgStreamOut(p, tx->imghandle, tx->image); } PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); return !ferror(f); } Texture * TxCopy(Texture *src, Texture *dst) { Ref r; if (src == NULL) { if (dst) { TxDelete(dst); } return NULL; } else if (src == dst) { return dst; } else { if (dst == NULL) { dst = TxCreate(TX_END); } else { TxPurge(dst); if (dst->filename) OOGLFree(dst->filename); if (dst->alphafilename) OOGLFree(dst->alphafilename); if (dst->tfmhandle) HandlePDelete(&dst->tfmhandle); if (dst->imghandle) HandlePDelete(&dst->imghandle); if (dst->image) ImgDelete(dst->image); } r = *(Ref *)dst; *dst = *src; *(Ref *)dst = r; if (dst->filename) dst->filename = strdup(dst->filename); if (dst->alphafilename) dst->alphafilename = strdup(dst->alphafilename); if (dst->tfmhandle) dst->tfmhandle = REFGET(Handle, dst->tfmhandle); if (dst->imghandle) dst->imghandle = REFGET(Handle, dst->imghandle); if (dst->image) dst->image = REFGET(Image, dst->image); return dst; } } Texture * TxMerge(Texture *src, Texture *dst, int mergeflags) { if (src == NULL) return REFGET(Texture, dst); if (dst == NULL) { return REFGET(Texture, src); } /* Oh, well. XXX. Leave real merging for later, if at all. * Meanwhile, any new texture completely replaces any old one. */ return REFGET(Texture, src); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/shade/apstream.c0000644000175000001440000002466110611511667014702 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "appearance.h" #include "handleP.h" HandleOps AppearanceOps = { "ap", (int ((*)(Pool *p, Handle **hp, Ref **rp)))ApStreamIn, (int ((*)(Pool *p, Handle *h, Ref *r)))ApStreamOut, (void ((*)(Ref *rp)))ApDelete, NULL, NULL }; static struct { char *word; int amask; int aval; } ap_kw[] = { { "appearance", 0, 1 }, { "face", APF_FACEDRAW, 0 }, { "edge", APF_EDGEDRAW, 0 }, { "vect", APF_VECTDRAW, 0 }, { "transparent", APF_TRANSP, 0 }, { "evert", APF_EVERT, 0 }, { "keepcolor", APF_KEEPCOLOR, 0 }, { "texturing", APF_TEXTURE, 0 }, { "backcull", APF_BACKCULL, 0 }, { "shadelines", APF_SHADELINES, 0 }, { "concave", APF_CONCAVE, 0 }, { "shading", APF_SHADING, 2 }, { "smooth", APF_SHADING, AP_SHADING + APF_SMOOTH }, { "flat", APF_SHADING, AP_SHADING + APF_FLAT }, { "constant", APF_SHADING, AP_SHADING + APF_CONSTANT }, { "csmooth", APF_SHADING, AP_SHADING + APF_CSMOOTH }, { "vcflat", APF_VCFLAT, AP_SHADING + APF_VCFLAT }, { "mipmap", APF_TXMIPMAP, 0 }, { "mipinterp", APF_TXMIPINTERP, 0 }, { "linear", APF_TXLINEAR, 0 }, { "normal", APF_NORMALDRAW, 0 }, { "normscale", APF_NORMSCALE, 3 }, { "linewidth", APF_LINEWIDTH, 4 }, { "material", 0, 5 }, { "backmaterial", 0, 7 }, { "patchdice", APF_DICE, 9 }, { "light", 0, 6 }, { "lighting", 0, 6 }, { "texture", 0, 8 }, }; int ApStreamIn(Pool *p, Handle **hp, Appearance **app) { Handle *h = NULL; Handle *hname = NULL; Appearance *ap = NULL; IOBFILE *inf; char *fname; char *w, *raww; int c, i; int brack = 0; bool over, not, more, empty, braces; int value; int mask, flagmask; bool mine = true; /* Questionable -- we'll report all errors */ if (p == NULL || (inf = PoolInputFile(p)) == NULL) { return 0; } fname = PoolName(p); over = not = false; value = ~0; more = false; empty = true; braces = false; do { switch(c = iobfnextc(inf, 0)) { case '{': brack++; braces = true; iobfgetc(inf); break; case '}': if (brack--) iobfgetc(inf); break; case '+': value = ~0; iobfgetc(inf); break; case '-': value = 0; iobfgetc(inf); break; case '!': not = 1; iobfgetc(inf); break; case '*': over = 1; iobfgetc(inf); break; case '<': case ':': case '@': iobfgetc(inf); w = iobfdelimtok("{}()", inf, 0); if (c == '<' && (h = HandleByName(w, &ImageOps)) == NULL && w[0] != '/') { w = findfile(PoolName(p), raww = w); if (w == NULL) { OOGLSyntax(inf, "Reading image from \"%s\": " "can't find file \"%s\"", PoolName(p), raww); return false; } } else if (h) { /* HandleByName() increases the ref. count s.t. the * caller of HandleByName() owns the returned handle. */ HandleDelete(h); } h = HandleReferringTo(c, w, &AppearanceOps, NULL); if (h) { ap = (Appearance *)HandleObject(h); /* Increment the ref. count. This way we can call * HandleDelete() and ImgDelete() independently. */ REFGET(Appearance, ap); } break; default: more = 0; w = iobfdelimtok("{}()", inf, 0); if (w == NULL) { break; } if (strcmp(w, "define") == 0) { hname = HandleCreateGlobal(iobftoken(inf, 0), &AppearanceOps); break; } for (i = sizeof(ap_kw)/sizeof(ap_kw[0]); --i >= 0; ) { if (!strcmp(ap_kw[i].word, w)) { break; } } if (i < 0) { if (mine) { OOGLError(1, "ApStreamIn: file %s: unknown appearance keyword %s", fname, w); ApDelete(ap); return false; } } if (ap == NULL) { ap = ApCreate(AP_END); } empty = false; mask = flagmask = ap_kw[i].amask; if (not) { switch(ap_kw[i].aval) { case 5: MtDelete(ap->mat); ap->mat = NULL; break; case 6: LmDelete(ap->lighting); ap->lighting = NULL; break; case 8: TxDelete(ap->tex); ap->tex = NULL; break; } ap->flag &= ~mask; if (!over) ap->valid &= ~mask; ap->override &= ~mask; } else { switch(ap_kw[i].aval) { case 0: break; case 1: mine = more = 1; break; case 2: iobfgetni(inf, 1, &ap->shading, 0); break; case 3: if (iobfgetnf(inf, 1, &ap->nscale, 0) <= 0) { OOGLError(1,"ApFLoad: %s: \"normscale\": value expected", fname); } break; case 4: if (iobfgetni(inf, 1, &ap->linewidth, 0) <= 0) { OOGLSyntax(inf, "%s \"linewidth\": value expected", fname); } break; case 5: if ((ap->mat = MtFLoad(ap->mat, inf, fname)) == NULL) { OOGLSyntax(inf,"Can't read material in %s", fname); } break; case 6: ap->lighting = LmFLoad(ap->lighting, inf, fname); if (ap->lighting == NULL) { OOGLError(1,"Can't read lighting, file %s", fname); } break; case 7: if ((ap->backmat = MtFLoad(ap->backmat, inf, fname)) == NULL) { OOGLError(1,"Can't read backmaterial, file %s", fname); } break; case 8: if (!TxStreamIn(p, NULL, &ap->tex)) { OOGLError(1, "%s: Can't read texture", fname); } break; case 9: if (iobfgetns(inf, 2, ap->dice, 0) < 2) { OOGLSyntax(inf, "%s \"patchdice\": " "expected integer u- and v- dicing values", fname); } break; default: if (ap_kw[i].aval >= AP_SHADING) { ap->shading = ap_kw[i].aval - AP_SHADING; } } if (value) { ap->flag |= flagmask; } else { ap->flag &= ~flagmask; } ap->valid |= mask; if (over) { ap->override |= mask; } } /* Reset for next keyword */ over = not = 0; value = ~0; } } while(brack > 0 || more); if (hname != NULL) { if (ap) { HandleSetObject(hname, (Ref *)ap); } if (h) { /* HandleReferringTo() has passed the ownership to use, so * delete h because we do not need it anymore. */ HandleDelete(h); } h = hname; } /* Pass the ownership of h and ap to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp != NULL) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (app != NULL) { if (*app != NULL) { ApDelete(*app); } *app = ap; } else if(ap) { ApDelete(ap); } return (h != NULL || ap != NULL || (empty && braces)); } int Apsavepfx(int valid, int override, int mask, char *keyword, FILE *f, Pool *p) { if ((valid & mask) == 0) { return 0; } PoolFPrint(p, f, ""); if (override & mask) { fputc('*', f); } if (keyword && *keyword) { fprintf(f, "%s ", keyword); } return 1; } int ApStreamOut(Pool *p, Handle *h, Appearance *ap) { FILE *f = PoolOutputFile(p); int valid; int mask; int i; if (f == NULL || (ap == NULL && (h == NULL || (ap = (Appearance *)HandleObject(h)) == NULL))) { return false; } valid = ap->valid; fprintf(f, "appearance {\n"); PoolIncLevel(p, 1); if (PoolStreamOutHandle(p, h, ap != NULL)) { for (i = 0; i < sizeof(ap_kw)/sizeof(ap_kw[0]); i++) { mask = ap_kw[i].amask; if ((valid & mask) == 0) continue; Apsavepfx(valid, ap->override, mask, "", f, p); if (ap_kw[i].aval == 0) { if ((mask & ap->flag) == 0) fputc('-', f); fputs(ap_kw[i].word, f); } valid &= ~mask; switch(mask) { case APF_SHADING: fputs("shading ", f); switch(ap->shading) { case APF_SMOOTH: fputs("smooth", f); break; case APF_FLAT: fputs("flat", f); break; case APF_CONSTANT: fputs("constant", f); break; case APF_CSMOOTH: fputs("csmooth", f); break; case APF_VCFLAT: fputs("vcflat", f); break; default: fprintf(f, "%d", ap->shading); break; } break; case APF_NORMSCALE: fprintf(f, "normscale %.8g", ap->nscale); break; case APF_LINEWIDTH: fprintf(f, "linewidth %d ", ap->linewidth); break; case APF_DICE: fprintf(f, "patchdice %d %d", ap->dice[0], ap->dice[1]); break; } fputc('\n', f); } if (ap->mat) { PoolFPrint(p, f, "material {\n"); PoolIncLevel(p, 1); MtFSave(ap->mat, f, p); PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); } if (ap->backmat) { PoolFPrint(p, f, "backmaterial {\n"); PoolIncLevel(p, 1); MtFSave(ap->backmat, f, p); PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); } if (ap->lighting) { PoolFPrint(p, f, "lighting {\n"); PoolIncLevel(p, 1); LmFSave(ap->lighting, f, p->poolname, p); PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); } if (ap->tex) { TxStreamOut(p, NULL, ap->tex); } } PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); return !ferror(f); } Appearance * ApFLoad(IOBFILE *inf, char *fname) { Pool *p; Appearance *ap = NULL; p = PoolStreamTemp(fname, inf, NULL, 0, &AppearanceOps); ApStreamIn(p, NULL, &ap); PoolDelete(p); return ap; } Appearance * ApFSave(Appearance *ap, FILE *outf, char *fname) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_DATA); PoolIncLevel(p, 1); ok = ApStreamOut(p, NULL, ap); PoolDelete(p); return ok ? ap : NULL; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/shade/image.c0000644000175000001440000013400510653572570014150 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #include #include /*#undef HAVE_LIBZ*/ #ifndef HAVE_LIBZ # define HAVE_LIBZ 0 #endif #if HAVE_LIBZ # include #endif #include "appearance.h" #include "handleP.h" #ifndef max # define max(a, b) ((a) >= (b) ? (a) : (b)) #endif #ifndef min # define min(a, b) ((a) <= (b) ? (a) : (b)) #endif HandleOps ImageOps = { "img", (int ((*)(Pool *p, Handle **hp, Ref **rp)))ImgStreamIn, (int ((*)(Pool *p, Handle *h, Ref *r)))ImgStreamOut, (void ((*)(Ref *rp)))ImgDelete, NULL, NULL }; struct imgheader { int xsize, ysize, channels, maxval; enum _format { IMGF_BYTE, IMGF_BIT, IMGF_ASCII, IMGF_SGIRLE, /* SGI RLE image */ IMGF_SGIRAW /* for (z) for (y=bottom to top) { data } */ } format; int *rleoff; /* For IMGF_SGIRLE: offsets[z][y], then lengths[z][y] */ char *rledata; /* For IMGF_SGIRLE: all data * (don't fseek so we can read from pipe) */ }; static bool readimage(Image *img, unsigned *chmask, char *filter, char *imgfname, char *imgdata, int datalen); static bool parseheader(Image *img, IOBFILE *imgf, unsigned *chmask, const char *type, struct imgheader *header); static bool readdata(Image *img, IOBFILE *imgf, unsigned chmask, struct imgheader *header); static int run_filter(const char *filter, int fdin, bool wronly, int *cpidp); static int data_pipe(const char *data, int datalen, int *cpidp); #if HAVE_LIBZ static int gv_compress2(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level); #endif Image *ImgDefault(Image *img) { memset((char *)img, 0, sizeof(*img)); RefInit((Ref *)img, IMGMAGIC); img->maxval = 255; return img; } Image *_ImgSet(Image *img, int attr1, va_list *alist) { int attr, val; bool newimg; char *chanfile, *filter; unsigned chmask; void *chandata; int chansize = 0; #undef NEXT #define NEXT(type) va_arg(*alist, type) if (img == NULL) { /* * New Image created here. */ img = OOGLNewE(Image, "ImgCreate Image"); ImgDefault(img); newimg = true; } for (attr = attr1; attr != IMG_END; attr = NEXT(int)) { switch (attr) { /* parse argument list */ case IMG_WIDTH: val = NEXT(int); if (val != img->width && img->data != NULL) { OOGLFree(img->data); img->data = NULL; } img->width = val; break; case IMG_HEIGHT: val = NEXT(int); if (val != img->height && img->data != NULL) { OOGLFree(img->data); img->data = NULL; } img->height = val; break; case IMG_CHANNELS: val = NEXT(int); if (val != img->channels && img->data != NULL) { OOGLFree(img->data); img->data = NULL; } img->channels = val; break; case IMG_MAXVAL: val = NEXT(int); if (val != img->maxval && img->data != NULL) { OOGLFree(img->data); img->data = NULL; } img->maxval = val; if (img->maxval != 255) { OOGLError(1, "ImgSet: " "maxval is tied to 255, nothing else is implemented"); goto nope; } break; case IMG_DATA: if (img->data) { OOGLFree(img->data); } img->data = NEXT(char *); break; case IMG_DATA_CHAN_FILE: case IMG_DATA_CHAN_DATA: chmask = NEXT(unsigned); filter = NEXT(char *); /* can be NULL */ if (attr == IMG_DATA_CHAN_FILE) { chanfile = NEXT(char *); chandata = NULL; } else { chandata = NEXT(void *); chansize = NEXT(int); chanfile = NULL; } if (chmask == IMGF_ALPHA) { if (img->channels == 0) { OOGLError(1, "ImgSet(): data: " "don't know which channel is the alpha mask"); goto nope; } switch (img->channels) { case 1: case 2: chmask = 0x2; break; case 3: case 4: chmask = 0x8; break; } } else if (chmask == IMGF_AUTO) { chmask = 0; } /* try to suck it in, readimage() will examine filter * and the suffix of imgfname and the magic bytes at * the beginning of the image data. An explicitly * specified filter will take precedence. */ if (!readimage(img, &chmask, filter, chanfile, chandata, chansize)) { goto nope; } break; default: OOGLError(1, "ImgSet: unknown attribute %d", attr); break; } } return img; nope: if (newimg) { ImgDelete(img); } return NULL; } Image *ImgCreate(int a1, ...) { va_list alist; Image *img; va_start(alist, a1); img = _ImgSet(NULL, a1, &alist); va_end(alist); return img; } void ImgDelete(Image *img) { if (img == NULL) { return; } if (img->magic != IMGMAGIC) { OOGLWarn("Internal warning: ImgDelete on non-Imag %x (%x != %x)", img, img->magic, IMGMAGIC); return; } if (RefDecr((Ref *)img) > 0) { return; } if (img->data) { OOGLFree(img->data); } OOGLFree(img); } Image *ImgSet(Image *img, int a1, ...) { va_list alist; va_start(alist, a1); img = _ImgSet(img, a1, &alist); va_end(alist); return img; } /* see the comments in src/lib/gprim/geom/geomstream.c */ int ImgStreamIn(Pool *p, Handle **hp, Image **imgp) { Handle *h = NULL; Handle *hname = NULL; Image *img = NULL; char *w, *raww = NULL; int c, i, val; int moredata; int brack = 0; IOBFILE *inf; char *fname, *imgfname = NULL, *filter, *imgdata = NULL; char filterpath[PATH_MAX]; long datasize = 0; unsigned long chmask; bool have_chdata; static const struct imgkw { const char *word; int aval; int nargs; int min; int max; } imgkw[] = { { "width", IMG_WIDTH, 1, 1, 0 }, { "height", IMG_HEIGHT, 1, 1, 0 }, { "channels", IMG_CHANNELS, 1, 1, 4 }, { "maxval", IMG_MAXVAL, 1, 255, 255 }, { "data", IMG_DATA, -1, 1, 0 } /* data chmask filter DATA */ }; const struct imgkw *kw; static const struct chflkw { const char *word; int value; } chflkw[] = { { "LUMINANCE", IMGF_LUMINANCE }, { "LUMINANCE_ALPHA", IMGF_LUMINANCE_ALPHA }, { "RGB", IMGF_RGB }, { "RGBA", IMGF_RGBA }, { "ALPHA", IMGF_ALPHA }, { "AUTO", IMGF_AUTO } }; const struct chflkw *chfl; #undef N_ITEMS #define N_ITEMS(array) (sizeof(array)/sizeof(*(array))) if (p == NULL || (inf = PoolInputFile(p)) == NULL) { return 0; } fname = PoolName(p); have_chdata = false; do { switch(c = iobfnextc(inf, 0)) { case '{': brack++; iobfgetc(inf); break; case '}': if (brack--) iobfgetc(inf); break; case '<': case ':': case '@': iobfgetc(inf); w = iobfdelimtok("{}()", inf, 0); if (c == '<' && (h = HandleByName(w, &ImageOps)) == NULL && w[0] != '/') { w = findfile(PoolName(p), raww = w); if (w == NULL) { OOGLSyntax(inf, "Reading image from \"%s\": " "can't find file \"%s\"", PoolName(p), raww); return false; } } else if (h) { /* HandleByName() increases the ref. count s.t. the * caller of HandleByName() owns the returned handle. */ HandleDelete(h); } h = HandleReferringTo(c, w, &ImageOps, NULL); if (h) { img = (Image *)HandleObject(h); /* Increment the ref. count. This way we can call * HandleDelete() and ImgDelete() independently. */ REFGET(Image, img); } break; default: w = iobfdelimtok("{}()", inf, 0); if (w == NULL) { break; } if (strcmp(w, "define") == 0) { hname = HandleCreateGlobal(iobftoken(inf, 0), &ImageOps); break; } for (i = N_ITEMS(imgkw), kw = imgkw; --i >= 0; kw++) { if (!strcmp(kw->word, w)) { break; } } if (i < 0) { OOGLSyntax(inf, "%s: unknown image keyword %s", fname, w); ImgDelete(img); return false; } if (img == NULL) { img = ImgCreate(IMG_END); } if (kw->nargs == 1) { int val, n; if (have_chdata) { OOGLSyntax(inf, "%s: %s must be specified before defining the image data", fname, w); ImgDelete(img); return false; } n = iobfgetni(inf, kw->nargs, &val, 0); if (n != kw->nargs) { OOGLSyntax(inf, "%s: %s expected %d numeric values", fname, w, kw->nargs); ImgDelete(img); return false; } if (kw->min <= kw->max && (val < kw->min || val > kw->max)) { OOGLSyntax(inf, "%s: %s value %d out of range (min %d, max %d", fname, w, val, kw->min, kw->max); } ImgSet(img, kw->aval, val, IMG_END); } else { /* data CHANNELMASK [FILTER] [{] < FILENAME [}] * * or * * data CHANNELMASK [FILTER] DATASIZE [{]\nDATA ... [}] * * FILTER may be a program or one of the know types, i.e. one * of raw, png, tif[f], jpeg, gif, gzip, bzip2, compress. If * FILTER is a program, then it must convert FILENAME to pnm * and the output must be presented at stdout. If no type is * specified, then the data must bin SGIRAW or SGIRLE or PNM * format. These formats are autodetected. If no SGIRAW, * SGIRLE or PNM format could be detected, then "raw" is * assumed. * * If the FILENAME has a known suffix (Z, z, gz, bz2, * raw, tiff, tif, png, gif) then the input filter is * deduced from the suffix. * * DATASIZE _must_ be specified for embedded images and gives * the size of the embedded data. */ w = iobfdelimtok("{}()", inf, 0); if (w == NULL) { OOGLSyntax(inf, "%s: data: expected the channel mask", fname); ImgDelete(img); return false; } for (i = N_ITEMS(chflkw), chfl = chflkw; --i >= 0; chfl++) { if (!strcmp(chfl->word, w)) { chmask = chfl->value; break; } } if (i < 0) { /* should be a numerical value */ chmask = strtol(w, NULL, 0); if (datasize == LONG_MIN || datasize == LONG_MAX) { OOGLSyntax(inf, "%s: data: bogus channel mask definition: \"%s\"", fname, w); ImgDelete(img); return false; } chmask &= 0xf; } imgfname = NULL; filter = NULL; moredata = 0; datasize = -1; do { switch(c = iobfnextc(inf, 1)) { case '{': /* allow brackets around data and file-name, i.e. * data MASK [FILTER] { < FILENAME } * or * data MASK [FILTER] DATASIZE {\n * data bytes ... * } */ brack++; iobfgetc(inf); moredata = 1; break; case '<': /* read from a file, find and open it */ iobfgetc(inf); /* consume '<' */ w = iobfdelimtok("{}()", inf, 0); imgfname = findfile(fname, w); if (imgfname == NULL) { OOGLSyntax(inf, "Warning: reading \"%s\": can't find file \"%s\"", fname, raww); ImgDelete(img); return false; } moredata = 0; break; case '\n': /* read embedded data from _this_ file */ if (datasize < 0) { /* this means that the "filter" token is actually the * size of the data section */ if (filter == NULL) { OOGLSyntax(inf, "%s: the size of the embedded image data is missing", fname); ImgDelete(img); return false; } datasize = strtol(filter, NULL, 0); if (datasize == LONG_MIN || datasize == LONG_MAX) { OOGLSyntax(inf, "%s: bogus size definition: \"%s\"", fname, filter); ImgDelete(img); return false; } filter = NULL; } iobfgetc(inf); /* consume '\n', image data follows */ /* read all the stuff in, we do it here to maintain the * file position */ imgdata = OOGLNewNE(char, datasize, "embedded image data"); if (iobfread(imgdata, datasize, 1, inf) <= 0) { OOGLError(0, "%s: can't read embedded image data", fname); OOGLFree(imgdata); ImgDelete(img); return false; } moredata = 0; break; default: /* assume that it is a filter definition _or_ the data-size. */ if (filter) { /* must be the data-size */ if (iobfgetni(inf, 1, &val, 0) != 1) { OOGLSyntax(inf, "%s: expected the data size", fname); ImgDelete(img); return false; } datasize = val; } else { /* maybe a filter of the data size, decide later */ filter = iobfdelimtok("{}()", inf, 0); if (filter == NULL) { OOGLSyntax(inf, "%s: expected an input filter or " "the size of the data-section", fname); ImgDelete(img); return false; } /* we leave it to readimage() to determine * whether this is a valid filter program, or * prefix, file type spec. * * We have to save the filter because thiobfdelimtok() * would otherwise overwrite it with the next token. */ strncpy(filterpath, filter, PATH_MAX); filterpath[PATH_MAX-1] = '\0'; filter = filterpath; moredata = 1; } break; } } while (moredata); if ((imgfname ? ImgSet(img, IMG_DATA_CHAN_FILE, chmask, filter, imgfname, IMG_END) : ImgSet(img, IMG_DATA_CHAN_DATA, chmask, filter, imgdata, (int)datasize, IMG_END)) == NULL) { #if 1 OOGLSyntax(inf, "%s: unable to read data for channelmask 0x%x, " "continuing anyway", fname, (int)chmask); #else ImgDelete(img); if (imgdata) { /* free buffer for embedded data */ OOGLFree(imgdata); } return false; #endif } if (imgdata) { /* free buffer for embedded data */ OOGLFree(imgdata); imgdata = NULL; } else { imgfname = NULL; } have_chdata = true; } break; } } while (brack); if (hname != NULL) { if (img) { HandleSetObject(hname, (Ref *)img); } if (h) { /* HandleReferringTo() has passed the ownership to us, so delete * h because we do not need it anymore. */ HandleDelete(h); } h = hname; } /* Pass the ownership of h and img to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp != NULL) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (imgp != NULL) { if (*imgp != NULL) { ImgDelete(*imgp); } *imgp = img; } else if(img) { ImgDelete(img); } return (h != NULL || img != NULL); } /* We do not record the file-name, so we can only output raw image * data. What format to choose? Highly compressed would be best; we * choose "gzip --best" or "bzip --best" if available; the * alpha-channel is output as pgm and the image data as RGB pnm * (channels == 4) or also as pgm (channels == 2). */ int ImgStreamOut(Pool *p, Handle *h, Image *img) { FILE *f = PoolOutputFile(p); char *obuf; int olen; if (f == NULL || (img == NULL && (h == NULL || (img = (Image *)HandleObject(h)) == NULL))) { return false; } fprintf(f, "image {\n"); PoolIncLevel(p, 1); if (PoolStreamOutHandle(p, h, img != NULL)) { PoolFPrint(p, f, "width %d\n", img->width); PoolFPrint(p, f, "height %d\n", img->height); PoolFPrint(p, f, "channels %d\n", img->channels); PoolFPrint(p, f, "maxval %d\n", img->maxval); /* For convenience we dump the stuff in pnm/pgm format with separate * alpha channel. */ switch (img->channels) { case 2: /* two greymaps, luminance and alpha */ #if 1 olen = ImgWritePAM(img, 0x3, HAVE_LIBZ, &obuf); PoolFPrint(p, f, "data LUMINANCE_ALPHA %s%d {\n", HAVE_LIBZ ? "gzip " : "", olen); fwrite(obuf, olen, 1, f); fprintf(f, "\n"); PoolFPrint(p, f, "}\n"); OOGLFree(obuf); break; #else olen = ImgWritePGM(img, 1, HAVE_LIBZ, obuf); PoolFPrint(p, f, "data ALPHA %s%d {\n", HAVE_LIBZ ? "gzip " : "", olen); fwrite(obuf, olen, 1, f); fprintf(f, "\n"); PoolFPrint(p, f, "}\n"); OOGLFree(obuf); /* fall through to luminance only */ #endif case 1: /* greymap, luminance */ olen = ImgWritePGM(img, 0, HAVE_LIBZ, &obuf); PoolFPrint(p, f, "data LUMINANCE %s%d {\n", HAVE_LIBZ ? "gzip " : "", olen); fwrite(obuf, olen, 1, f); fprintf(f, "\n"); PoolFPrint(p, f, "}\n"); OOGLFree(obuf); break; case 4: /* RGBA */ #if 1 olen = ImgWritePAM(img, 0xf, HAVE_LIBZ, &obuf); PoolFPrint(p, f, "data RGBA %s%d {\n", HAVE_LIBZ ? "gzip " : "", olen); fwrite(obuf, olen, 1, f); fprintf(f, "\n"); PoolFPrint(p, f, "}\n"); OOGLFree(obuf); break; #else olen = ImgWritePGM(img, 3, HAVE_LIBZ, &obuf); PoolFPrint(p, f, "data ALPHA %s%d {\n", HAVE_LIBZ ? "gzip " : "", olen); fwrite(obuf, olen, 1, f); fprintf(f, "\n"); PoolFPrint(p, f, "}\n"); OOGLFree(obuf); /* fall through to RGB */ #endif case 3: /* RGB only */ olen = ImgWritePNM(img, 0x07, HAVE_LIBZ, &obuf); PoolFPrint(p, f, "data RGB %s%d {\n", HAVE_LIBZ ? "gzip " : "", olen); fwrite(obuf, olen, 1, f); fprintf(f, "\n"); PoolFPrint(p, f, "}\n"); OOGLFree(obuf); break; } } PoolIncLevel(p, -1); PoolFPrint(p, f, "}\n"); return !ferror(f); } Image *ImgFSave(Image *img, FILE *outf, char *fname) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_DATA); PoolIncLevel(p, 1); ok = ImgStreamOut(p, NULL, img); PoolDelete(p); return ok ? img : NULL; } Image *ImgFLoad(IOBFILE *inf, char *fname) { Pool *p; Image *img = NULL; p = PoolStreamTemp(fname, inf, NULL, 0, &ImageOps); ImgStreamIn(p, NULL, &img); PoolDelete(p); return img; } /* Compress the contents of *buffer, free *buffer and return the * compressed buffer in a newly allocated chunk pointed to by * *buffer. Return the amount of compressed data. */ static inline int maybe_compress_buffer(char **buffer, int n_bytes) { #if HAVE_LIBZ # if !HAVE_COMPRESSBOUND # define compressBound(slen) ((slen) + ((slen) >> 12) + ((slen) >> 14) + 11) # endif char *bufptr; unsigned long c_n_bytes; /* we do it inefficient and quick and dirty: we simply call the * compress() function and compress the entire buffer */ bufptr = *buffer; c_n_bytes = compressBound(n_bytes); *buffer = OOGLNewNE(char, c_n_bytes, "compressed buffer"); if (gv_compress2((Bytef *)*buffer, &c_n_bytes, (Bytef *)bufptr, n_bytes, 9) != Z_OK) { OOGLFree(*buffer); *buffer = bufptr; } else { OOGLFree(bufptr); n_bytes = c_n_bytes; } #endif return n_bytes; } #define PNM_HEADER_LEN (2 + 1 + 10 + 1 + 10 + 1 + 5 + 1) /* P5 1000000000 1000000000 65535\n */ /* Pack one channel of the image data into an PGM image and write that * data to *buffer. *buffer is allocated in this function, its length * is returned. If channel >= img->channel, then the result will be an * all-black PGM image. Optionally compress the image. */ int ImgWritePGM(Image *img, int channel, bool compressed, char **buffer) { int row, col, stride, rowlen, depth; unsigned long n_bytes, h_len; char *imgptr, *bufptr; depth = (img->maxval > 255) + 1; rowlen = depth * img->width; n_bytes = rowlen * img->height + PNM_HEADER_LEN; bufptr = *buffer = OOGLNewNE(char, n_bytes, "PGM buffer"); bufptr += h_len = sprintf(*buffer, "P5 %d %d %d\n", img->width, img->height, img->maxval); n_bytes -= PNM_HEADER_LEN - h_len; if (channel >= img->channels) { memset(*buffer, 0, n_bytes); } else { stride = img->channels * depth; for (row = img->height-1; row >= 0; row--) { imgptr = img->data + channel + rowlen * img->channels * row; for (col = 0; col < img->width; col++) { *bufptr++ = *imgptr; if (depth == 2) { *bufptr++ = *(imgptr+1); } imgptr += stride; } } } return compressed ? maybe_compress_buffer(buffer, n_bytes) : n_bytes; } /* Pack up to 3 channels of the image data into an PNM image and write * that data to *buffer. *buffer is allocated in this functions, its * length is returned. Missing channels are filled with 0's. * * Optionally compress the image. */ int ImgWritePNM(Image *img, unsigned chmask, bool compressed, char **buffer) { int row, col, stride, depth, rowlen; unsigned long n_bytes, h_len; int channels[3], i, j; char *imgptr, *bufptr; depth = (img->maxval > 255) + 1; rowlen = 3 * depth * img->width; n_bytes = rowlen * img->height + PNM_HEADER_LEN; bufptr = *buffer = OOGLNewNE(char, n_bytes, "PNM buffer"); channels[0] = channels[1] = channels[2] = -1; for (i = j = 0; i < img->channels && j < 3 && chmask; i++, chmask >>= 1) { if (chmask & 1) { channels[j++] = i; } } bufptr += h_len = sprintf(*buffer, "P6 %d %d %d\n", img->width, img->height, img->maxval); n_bytes -= PNM_HEADER_LEN - h_len; imgptr = img->data; stride = img->channels * depth; for (row = img->height-1; row >= 0; row--) { imgptr = img->data + stride * img->width * row; for (col = 0; col < img->width; col++) { for (j = 0; j < 3; j++) { if (channels[j] >= 0) { for (i = 0; i < depth; i++) { *bufptr++ = *(imgptr + channels[j] + i); } } else { for (i = 0; i < depth; i++) { *bufptr++ = '\0'; } } } imgptr += stride; } } return compressed ? maybe_compress_buffer(buffer, n_bytes) : n_bytes; } /* Pack any number of channels into a PAM image. Optionally compress * the image. Excess bits set in chmask are ignored. The destination * image will have min(img->channels, #chmask bits) channels (i.e. at * most 4). * * The destination image is written into memory, allocated in * *buffer. The amount of data in *buffer is returned (size after * compression). */ /* worst case header length for our case */ #define PAM_HEADER_LEN \ sizeof("P7\n" \ "WIDTH 1000000000\n" \ "HEIGHT 1000000000\n" \ "DEPTH 4\n" \ "MAXVAL 65535\n" \ "ENDHDR\n") int ImgWritePAM(Image *img, unsigned chmask, bool compressed, char **buffer) { int row, col, stride, depth, rowlen; unsigned long n_bytes, h_len; int channels[4], n_chan, i, j; char *imgptr, *bufptr; for (i = n_chan = 0; i < img->channels && chmask; i++, chmask >>= 1) { if (chmask & 1) { channels[n_chan++] = i; } } depth = (img->maxval > 255) + 1; /* #bytes for a single channel */ rowlen = n_chan * depth * img->width; n_bytes = rowlen * img->height + PAM_HEADER_LEN; bufptr = *buffer = OOGLNewNE(char, n_bytes, "PAM buffer"); bufptr += h_len = sprintf(*buffer, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH %d\nMAXVAL %d\nENDHDR\n", img->width, img->height, n_chan, img->maxval); n_bytes -= PAM_HEADER_LEN - h_len; imgptr = img->data; stride = img->channels * depth; for (row = img->height-1; row >= 0; row--) { imgptr = img->data + stride * img->width * row; for (col = 0; col < img->width; col++) { for (j = 0; j < n_chan; j++) { for (i = 0; i < depth; i++) { *bufptr++ = *(imgptr + channels[j] + i); } } imgptr += stride; } } return compressed ? maybe_compress_buffer(buffer, n_bytes) : n_bytes; } /* Dump an image to disk through the given filter. The filter must * read from stdin. The output of the filter is discarded, it is * assumed that "filter" writes the data to disk or to whatever * destination itself. * * This is mainly to support textures with the RenderMan MG backend. * * The image filter must understand PAM image data if chmask has 2 or * 4 bits set, otherwise it must understand PNM data. * * This routine is ugly: we simply convert the image data into a PGM, * PNM or PAM image in memory using ImgWritePGM/PNM/PAM() and then * pipe the resulting data with data_pipe() to the stdin of the * filter. * * E.g.: * * ImgWriteFilter(img, 0xf, "pamtotiff -lzw -truecolor > img.tiff"); * */ bool ImgWriteFilter(Image *img, unsigned chmask, const char *filter) { int n_chan, buflen = 0; unsigned mask; char *buf = NULL; int data_fd = -1; int data_pid = -1, filter_pid = -1; int result = false; void (*old_sigchld)(int); for (n_chan = 0, mask = chmask; mask; n_chan += mask & 1, mask >>= 1); n_chan = min(img->channels, n_chan); switch (n_chan) { case 1: buflen = ImgWritePGM(img, 0, false, &buf); break; case 3: buflen = ImgWritePNM(img, chmask, false, &buf); break; case 2: case 4: buflen = ImgWritePAM(img, chmask, false, &buf); break; } if ((data_fd = data_pipe(buf, buflen, &data_pid)) <= 0) { OOGLError(1, "ImgWriteFilter(): unable to generate data pipe"); goto out; } if (run_filter(filter, data_fd, true, &filter_pid) < 0) { OOGLError(1, "ImgWriteFilter(): unable to run image filter"); goto out; } result = true; out: if (buf) { OOGLFree(buf); } if (data_fd) { close(data_fd); } /* This could cause problems when an emodule exits during the short * period of SIGDFLT being in action ... */ signal(SIGCHLD, old_sigchld = signal(SIGCHLD, SIG_DFL)); if (old_sigchld != SIG_DFL && old_sigchld != SIG_IGN && old_sigchld != SIG_ERR) { /* ... send ourselves a SIGCHLD in this case. */ kill(getpid(), SIGCHLD); } else { /* possibly wait for the filter processes. */ while (filter_pid != -1 || data_pid != -1) { int cpid, status; cpid = wait(&status); if (cpid == filter_pid) { filter_pid = -1; } else if (cpid == data_pid) { data_pid = -1; } if (cpid == -1) { break; } } } return result; } /* reading of images */ struct filter { struct filter *next; const char *program; const char *suffixes[10]; }; static struct filter decompressors[] = { { decompressors+1, "gzip -dc", { "z", "gz", "gzip", NULL } }, { NULL, "bzip2 -dc", { "bz2", "bzip2", NULL } }, }; static struct filter converters[] = { { converters+1, "tifftopnm", { "tiff", "tif", NULL } }, { converters+2, "pngtopnm", { "png", NULL } }, { converters+3, "giftoppm", { "gif", NULL } }, { NULL, "jpegtopnm", { "jpeg", "jpg", NULL } }, }; static bool readimage(Image *img, unsigned *chmask, char *filtertype, char *imgfname, char *imgdata, int datalen) { struct filter *filters[2] = { decompressors, converters }, *filter; int filterpids[2] = { -1, -1 }, datapid = -1; int filterfds[2] = { -1, -1 }; IOBFILE *imgf = NULL; int imgfd = -1; char *suffix, *explicit_filter = NULL; struct imgheader header; int i, j; bool result = true; void (*old_sigchld)(int); if (imgfname) { if ((imgfd = open(imgfname, O_RDONLY)) == -1) { OOGLError(0, "can't open file \"%s\"", imgfname); return false; } } else { /* What to do with imgdata? If we do not need a filter, then we * could just use the data-block we have already read in. If we * need a filter, then we fork a child that pipes imgdata to the * filter (in order to prevent deadlocks). */ } if (filtertype == NULL) { filtertype = strdup(imgfname); } else { filtertype = strdup(filtertype); explicit_filter = filtertype; } for (j = 0; j < 2; j++) { if (filtertype == NULL || (suffix = strrchr(filtertype, '.')) == NULL) { suffix = filtertype; } else { suffix++; /* advance past '.' */ } if (suffix) { for (filter = filters[j]; filter != NULL; filter = filter->next) { for (i = 0; filter->suffixes[i] != NULL; i++) { if (strcasecmp(suffix, filter->suffixes[i]) == 0) { if (imgfd == -1) { imgfd = data_pipe(imgdata, datalen, &datapid); if (imgfd < 0) { result = false; goto out; } } filterfds[j] = run_filter(filter->program, imgfd, false, &filterpids[j]); if (filterfds[j] < 0) { result = false; goto out; } if (suffix != filtertype) { suffix--; } *suffix = '\0'; /* mark this part as handled */ break; } } if (filterfds[j] >= 0) { close(imgfd); imgfd = filterfds[j]; break; } } } } /* try to run any explicitly specified filter, but omit the dummy * filter "raw", which just means to interprete the stuff literally. */ if (filterfds[1] < 0 && explicit_filter && *explicit_filter != '\0' && strcasecmp(suffix, "raw") != 0) { /* explicitly specified filter */ filterfds[1] = run_filter(explicit_filter, imgfd, false, &filterpids[1]); if (filterfds[1] < 0) { result = false; goto out; } else { close(imgfd); imgfd = filterfds[1]; } } /* at this point we assume that reading from imgfd will give us raw, * SGI or PNM data. We generate an IOBFILE, simply because we want * to be able to use those iobfgetni() etc. functions, and because * parseheader() might want to set a file-marker. */ if (imgfd == -1) { if ((imgf = iobfileopen(fmemopen(imgdata, datalen, "r"))) == NULL) { result = false; goto out; } } else { if ((imgf = iobfileopen(fdopen(imgfd, "r"))) == NULL) { result = false; goto out; } } if (filtertype == NULL || (suffix = strrchr(filtertype, '.')) == NULL) { suffix = filtertype; } else { suffix++; /* advance past '.' */ } if (!parseheader(img, imgf, chmask, suffix, &header) || !readdata(img, imgf, *chmask, &header)) { result = false; goto out; } out: free(filtertype); /* undo strdup() */ /* This could cause problems when an emodule exits during the short * period of SIGDFLT being in action ... */ signal(SIGCHLD, old_sigchld = signal(SIGCHLD, SIG_DFL)); if (old_sigchld != SIG_DFL && old_sigchld != SIG_IGN && old_sigchld != SIG_ERR) { /* ... send us a SIGCHLD in this case. */ kill(getpid(), SIGCHLD); } else { /* possibly wait for the filter processes. */ while (filterpids[0] != -1 || filterpids[1] != -1 || datapid != -1) { int cpid, status; cpid = wait(&status); for (j = 0; j < 2; j++) { if (cpid == filterpids[j]) { filterpids[j] = -1; } } if (cpid == datapid) { datapid = -1; } if (cpid == -1) { break; } } } if (imgf) { iobfclose(imgf); } return result; } static bool parseheader(Image *img, IOBFILE *imgf, unsigned *chmask, const char *type, struct imgheader *header) { char scratch[1024]; char *w; int chmask_channels; unsigned mask; int i, c; char *msg = NULL; IOBFILE *f = NULL; header->rleoff = NULL; header->rledata = NULL; chmask_channels = 0; for (i = 0, mask = *chmask; i < 4 && mask; i++, mask >>= 1) { if (mask & 1) { chmask_channels++; } } if (type && strcasecmp(type, "raw") == 0) { if (*chmask == IMGF_AUTO) { OOGLError(1, "parseheader(): " "chmask == AUTO cannot work with raw image data"); return false; } header->format = IMGF_BYTE; header->xsize = img->width; header->ysize = img->height; header->maxval = img->maxval ? img->maxval : 255; header->channels = chmask_channels; } else { if (iobfsetmark(imgf) < 0) { OOGLError(1, "parseheader(): cannot set file mark"); return false; } c = iobfgetc(imgf); if (c == 0x01 && (c = iobfgetc(imgf)) == 0xDA) { /* SGI image file */ short shorts[3]; int storage = iobfgetc(imgf); int bpp = iobfgetc(imgf); if (bpp != 1) { msg = "%s: must have 8-bit image values"; goto nope; } iobfgetc(imgf); iobfgetc(imgf); /* Skip "dimension" */ iobfgetns(imgf, 3, shorts, 1); /* Read big-endian 16-bit values */ header->xsize = shorts[0]; header->ysize = shorts[1]; header->channels = shorts[2]; header->maxval = 255; if (iobfread(scratch, 4+4+492, 1, imgf) <= 0) { /* Skip min, max, pad data */ msg = "can't consume pad data"; goto nope; } header->format = (storage == 0x01) ? IMGF_SGIRLE : IMGF_SGIRAW; if (header->format == IMGF_SGIRLE) { /* Inhale offset&length table */ int n = header->ysize * header->channels; int max = 0; header->rleoff = OOGLNewNE(int, n*2, "IMGF_SGIRLE offsets"); msg = "%s: can't read RLE offsets"; if (iobfgetni(imgf, n*2, header->rleoff, 1) != n*2) { goto nope; } if (iobftell(imgf) < 0) { for (i = 0; i < n; i++) { if (max < header->rleoff[i]) { max = header->rleoff[i] + header->rleoff[i+n]; } } header->rledata = OOGLNewNE(char, max+1, "IMGF_SGIRLE data"); if (iobfread(header->rledata, max, 1, f) <= 0) { goto nope; } } } } else if (c == 'P' && (c = iobfgetc(imgf)) >= '1' && c <= '7') { if (c <= '6') { msg = "%s: Bad header on PNM image"; header->channels = (c == '3' || c == '6') ? 3 : 1; if (iobfgetni(imgf, 1, &header->xsize, 0) != 1) { goto nope; } if (iobfgetni(imgf, 1, &header->ysize, 0) != 1) { goto nope; } if (c != '1' && c != '4') { if (iobfgetni(imgf, 1, &header->maxval, 0) <= 0) { goto nope; } } else { header->maxval = 255; } switch(c) { case '1': case '2': case '3': header->format = IMGF_ASCII; break; case '4': header->format = IMGF_BIT; break; case '5': case '6': header->format = IMGF_BYTE; break; } while((c = iobfgetc(imgf)) != '\n' && c != EOF); } else { int need = 4; /* newer PAM format, possibly including an alpha channel */ msg = "%s: Bad header on PAM image"; while ((w = iobftoken(imgf, 0)) != NULL) { if (strncmp(w, "ENDHDR", 6) == 0) { break; } else if (strncmp(w, "HEIGHT", 6) == 0) { if (iobfgetni(imgf, 1, &header->ysize, 0) != 1) { goto nope; } --need; } else if (strncmp(w, "WIDTH", 5) == 0) { if (iobfgetni(imgf, 1, &header->xsize, 0) != 1) { goto nope; } --need; } else if (strncmp(w, "DEPTH", 5) == 0) { if (iobfgetni(imgf, 1, &header->channels, 0) != 1) { goto nope; } --need; } else if (strncmp(w, "MAXVAL", 5) == 0) { if (iobfgetni(imgf, 1, &header->maxval, 0) != 1) { goto nope; } if (header->maxval > 255) { msg = "%s: PAM herader: sorry, 16 bits per channel is unsupported"; goto nope; } --need; } else { /* just skip everything else, i.e. the tuple type. We * interprete 1 channel as luminance, 2 channels as * luminance & alpha, 3 channels as RGB and 4 channels as * RGBA, no matter what the header says. */ } } if (need != 0) { goto nope; /* did not find all required fields */ } header->format = IMGF_BYTE; /* will work */ } } else { /* assume raw pixel data */ iobfseekmark(imgf); iobfclearmark(imgf); if (*chmask == 0xf) { OOGLError(1, "parseheader(): " "chmask == AUTO cannot work with raw image data"); return false; } header->format = IMGF_BYTE; header->xsize = img->width; header->ysize = img->height; header->maxval = img->maxval ? img->maxval : 255; header->channels = chmask_channels; } } /* set image dimensions from the data if the user did not specify * them explicitly. */ if (img->width <= 0) { img->width = header->xsize; } if (img->height <= 0) { img->height = header->ysize; } /* Check for consistency. The number of channels can be different, * but the x- and y-size must match the width and height of the * image. */ if (img->width != header->xsize || img->height != header->ysize) { msg = "%s: specified image dimensions do not match the image data"; goto nope; } if (*chmask == 0) { /* determine channels from image header */ *chmask = (1 << header->channels) - 1; } else if (chmask_channels > header->channels && header->channels != 1) { /* We allow to fill several destination channels with a single * grey-level image, but otherwise the user has to provide enough * channels such that the number destination and source channels * match. */ OOGLError(1, "parseheader(): " "source image has only %d channels, needed are %d channels", header->channels, chmask_channels); msg = NULL; goto nope; } return true; nope: header->xsize = header->ysize = header->channels = 0; if (msg) { OOGLError(0, msg, "parseheader()"); } return false; } static bool readdata(Image *img, IOBFILE *imgf, unsigned chmask, struct imgheader *header) { int val, bit, i, j, k, depth; int chan_map[4] = { -1, -1, -1, -1 }; int n_chan, maxval, mask_channels; unsigned mask; int rowsize, stride, yup, rlebase; if (header->xsize <= 0 || header->ysize <= 0) { return false; } /* readdata() only works with maxval == 255; and nothing else is * used elsewhere in Geomview, so what. */ if (img->maxval != 255) { OOGLError(0, "readdata(): maxval != 255 is not supported yet"); return false; } maxval = 255; /* chan_map[j] == i: stuff the j-th source channel into the i-th * destination channel */ for (i = mask_channels = 0, mask = chmask; i < 4 && mask != 0; i++, mask >>= 1) { if (mask & 1) { chan_map[mask_channels++] = i; } } n_chan = max(img->channels, i); depth = ((maxval > 255) + 1); stride = n_chan * depth; rowsize = img->width * stride; if (img->data == NULL || img->channels < n_chan) { char *old_data = img->data; char *new_data; int old_stride; char *old_buf = old_data; img->data = new_data = OOGLNewNE(char, img->height * rowsize, "New image data"); old_stride = old_data ? img->channels : 0; for (i = 0; i < img->height * img->width; i++) { for (k = 0; k < old_stride; k++) { new_data[k] = old_data[k]; } /* Also initialize any new fields. This would only be needed for * channels not set in chmask, but the conditional would * probably eat up more time than the assignment. Reverting the * loop-order would also do no good because this is a pixmap: * iterating over the channels in the outer loop would be very * unfriendly for the cache. */ for (; k < stride-1; k++) { new_data[k] = '\0'; } new_data[stride-1] = (char)0xff; /* alpha channel defaults to 0xff */ old_data += old_stride; new_data += stride; } OOGLFree(old_buf); img->channels = n_chan; } switch (header->format) { case IMGF_SGIRAW: for (k = 0; k < min(mask_channels, header->channels); k++) { int dst_chan = chan_map[k]; for (i = 0; i < header->ysize; i++) { char *pix = img->data + dst_chan + rowsize * i; j = header->xsize; do { *pix = iobfgetc(imgf); pix += stride; } while(--j > 0); } if (iobfeof(imgf)) { goto nope; } } break; case IMGF_SGIRLE: yup = header->rleoff[0] < header->rleoff[1]; rlebase = 512 + header->channels*header->ysize*4; for (k = 0; k < min(mask_channels, header->channels); k++) { int dst_chan = chan_map[k]; for (i = 0; i < header->ysize; i++) { char *rle = NULL; int row = (yup ? i : header->ysize-i-1); char *pix = img->data + dst_chan + rowsize * row; int foff = header->rleoff[k*header->ysize + row]; /*int len = header->rleoff[(k+header->channels)*header->ysize + row];*/ int count; j = header->xsize; if (header->rledata) { rle = header->rledata + foff - rlebase; } else { iobfseek(imgf, foff, SEEK_SET); } while ((count = rle ? *rle++ : iobfgetc(imgf)) > 0) { if (count & 0x80) { count &= 0x7F; do { *pix = rle ? *rle++ : iobfgetc(imgf); pix += stride; } while(--count > 0); } else { int val = rle ? *rle++ : iobfgetc(imgf); do { *pix = val; pix += stride; } while(--count > 0); } } if (iobfeof(imgf)) { goto nope; } } } case IMGF_BYTE: case IMGF_BIT: case IMGF_ASCII: for (i = 0; i < header->ysize; i++) { char *row = img->data + rowsize * (header->ysize - i - 1); if (img->channels == header->channels && header->format == IMGF_BYTE && (chmask ^ ((1 << n_chan) - 1)) == 0 && header->maxval == 255){ /* all channels specified, so just copy the row in one run */ j = iobfread(row, header->channels, header->xsize, imgf); } else { char *pix = row; j = header->xsize; switch(header->format) { case IMGF_BYTE: do { for (k = 0; k < min(mask_channels, header->channels); k++) { pix[chan_map[k]] = iobfgetc(imgf) * 255 / header->maxval; } for (; k < header->channels; k++) { iobfgetc(imgf); /* consume any remaining channels */ } pix += stride; } while(--j); break; case IMGF_BIT: bit = 0; do { if (--bit < 0) { bit = 7; k = iobfgetc(imgf); } pix[chan_map[0]] = (k >> bit) & 1; pix += stride; } while(--j > 0); break; case IMGF_ASCII: do { for (k = 0; k < min(mask_channels, header->channels); k++) { iobfgetni(imgf, 1, &val, 0); pix[chan_map[k]] = val * 255 / header->maxval; } for (; k < header->channels; k++) { iobfgetni(imgf, 1, &val, 0); /* consume any remaining channels */ } pix += stride; } while(--j > 0); break; default: break; } } if (iobfeof(imgf)) break; } } if (header->channels == 1 && mask_channels > 1) { /* clone the data from chan_map[0] into all other channels; this * allows to generate an RGB(A) image from a single grey-map */ char *pix = img->data; for (i = 0; i < img->height * rowsize; i++) { for (j = 1; j < mask_channels; j++) { for (k = 0; k < depth; k++) { pix[chan_map[j]+k] = pix[chan_map[0]+k]; } } pix += stride; } } nope: if (header->rleoff) { OOGLFree(header->rleoff); } if (header->rledata) { OOGLFree(header->rledata); } header->rleoff = NULL; header->rledata = NULL; if (i < header->ysize) { OOGLError(0, "readdata(): Error reading image row %d of %d", i, header->ysize); return false; } return true; } /* Take a file-descriptor and connect it to the stdin of a filter * program, return a file descriptor which is connected to stdout of * the filter. * * If wronly == true, then also close the read-part of the pipe and * return 0 on success. */ static int run_filter(const char *filter, int fdin, bool wronly, int *cpidp) { int pfd[2]; int cpid; if (!wronly) { if (pipe(pfd) == -1) { OOGLError(1, "%s: pipe() failed", filter); return -1; } } if ((cpid = fork()) == -1) { OOGLError(1, "%s: fork() failed", filter); return -1; } if (cpid == 0) { /* child (filter process), close pdf[0] (the reader), connect fdin * to stdin, and pdf[1] to stdout. */ close(STDIN_FILENO); if (dup2(fdin, STDIN_FILENO) != STDIN_FILENO) { OOGLError(1, "%s: cannot reassign STDIN_FILENO"); _exit(EXIT_FAILURE); } close(fdin); if (wronly) { /* close stdout and duplicate it on stderr, otherwise a process * listening on our stdout might get confused. */ close(STDOUT_FILENO); if (dup2(STDERR_FILENO, STDOUT_FILENO) != STDOUT_FILENO) { OOGLError(1, "%s: cannot reassign STDOUT_FILENO"); _exit(EXIT_FAILURE); } } else { /* if !wronly close the read-end of the pipe and dup the write * end on STDOUT. */ close(pfd[0]); close(STDOUT_FILENO); if (dup2(pfd[1], STDOUT_FILENO) != STDOUT_FILENO) { OOGLError(1, "%s: cannot reassign STDOUT_FILENO"); _exit(EXIT_FAILURE); } close(pfd[1]); } /* now run the filter process, run it through sh 'cause `filter' * can be a command with arguments (and possibly file descriptor * redirections). */ execl("/bin/sh", "sh", "-c", filter, NULL); OOGLError(1, "execl(%s) failed.", filter); _exit(EXIT_FAILURE); } else { /* parent */ if (cpidp) { *cpidp = cpid; } if (!wronly) { close(pfd[1]); /* close the write end */ } } return wronly ? 0 : pfd[0]; /* return the read end */ } /* Fork a child which pipes data through a pipe to the parent. * * The return value is a pipe descriptor connected to the child's * output. */ static int data_pipe(const char *data, int datalen, int *cpidp) { int pfd[2]; int cpid; if (pipe(pfd) == -1) { OOGLError(1, "data_pipe(): pipe() failed"); return -1; } if ((cpid = fork()) == -1) { OOGLError(1, "data_pipe(): fork() failed"); return -1; } if (cpid == 0) { /* child */ /* NOTE: we use _exit() and not exit() to avoid calling atexit() * functions inherited from the parent. */ close(pfd[0]); /* close the reader */ if (write(pfd[1], data, datalen) != datalen) { OOGLError(1, "data_pipe(): write() failed"); _exit(EXIT_FAILURE); } if (close(pfd[1]) < 0) { OOGLError(1, "data_pipe(): close() failed"); _exit(EXIT_FAILURE); } _exit(EXIT_SUCCESS); } else { /* parent */ if (cpidp) { *cpidp = cpid; } close(pfd[1]); /* close the write end */ } return pfd[0]; /* return the read end */ } #if HAVE_LIBZ static int gv_compress2(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level) { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit2(&stream, level, Z_DEFLATED, MAX_WBITS+16, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } #endif /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/shade/Headers0000644000175000001440000000001507730240432014200 00000000000000appearance.h geomview-1.9.4/src/lib/geometry/0000777000175000001440000000000010665240670013546 500000000000000geomview-1.9.4/src/lib/geometry/transobj/0000777000175000001440000000000010665240670015370 500000000000000geomview-1.9.4/src/lib/geometry/transobj/transobj.c0000644000175000001440000001427710600044560017272 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform.h" #include "transobj.h" #include "handleP.h" #include "freelist.h" /* * Operations on TransObj objects. */ void TransPosition(TransObj *tobj, Transform T) /* Get transform into T */ { TmCopy(tobj->T, T); } void TransTransformTo(TransObj *tobj, Transform T) /* Set transform from T */ { TmCopy(T, tobj->T); } static DEF_FREELIST(TransObj); void TransDelete(TransObj *tobj) { if(tobj == NULL) { return; } if(tobj->magic != TRANSMAGIC) { OOGLWarn("Internal warning: TransDelete'ing non-TransObj %x (%x != %x)", tobj, tobj->magic, TRANSMAGIC); return; } if(tobj != NULL && RefDecr((Ref *)tobj) <= 0) { FREELIST_FREE(TransObj, tobj); } } TransObj * TransCreate(Transform T) { TransObj *tobj; FREELIST_NEW(TransObj, tobj); RefInit((Ref*)tobj, TRANSMAGIC); if (T != NULL) { TmCopy(T, tobj->T); } return tobj; } /* * Communications */ HandleOps TransOps = { "trans", (int ((*)()))TransObjStreamIn, (int ((*)()))TransObjStreamOut, (void ((*)()))TransDelete, NULL, NULL }; void TransUpdate(Handle **hp, Ref *ignored, Transform Tfixme) { Handle *h = *hp; if (h != NULL && h->object != NULL) { TmCopy(((TransObj *)(h->object))->T, Tfixme); } } int TransStreamIn(Pool *p, Handle **hp, Transform T) { TransObj *tobj = NULL; if (TransObjStreamIn(p, hp, &tobj)) { if (tobj) { TmCopy(tobj->T, T); TransDelete(tobj); } return true; } return false; } int TransObjStreamIn(Pool *p, Handle **hp, TransObj **tobjp) { Handle *h = NULL; Handle *hname = NULL; TransObj *tobj = NULL; char *w, *raww; int c; int more = 0; int brack = 0; IOBFILE *inf; if(p == NULL || (inf = PoolInputFile(p)) == NULL) { return 0; } do { more = 0; switch(c = iobfnextc(inf, 0)) { case '{': brack++; iobfgetc(inf); break; case '}': if(brack--) iobfgetc(inf); break; case 't': if(iobfexpectstr(inf, "transform")) { return 0; } more = 1; break; case 'd': if(iobfexpectstr(inf, "define")) { return 0; } w = iobftoken(inf, 0); hname = HandleCreateGlobal(w, &TransOps); break; case '<': case ':': case '@': iobfgetc(inf); w = iobfdelimtok("{}()", inf, 0); if (c == '<' && (h = HandleByName(w, &TransOps)) == NULL) { w = findfile(PoolName(p), raww = w); if(w == NULL) { OOGLSyntax(inf, "Reading transform from \"%s\": can't find file \"%s\"", PoolName(p), raww); } } else if (h) { HandleDelete(h); } h = HandleReferringTo(c, w, &TransOps, NULL); if (h) { /* Increment the ref. count. This way we can call * HandleDelete() and TransDelete() independently. */ tobj = REFGET(TransObj, HandleObject(h)); } break; default: /* * Anything else should be a 4x4 matrix */ if(tobj == NULL) { tobj = TransCreate(NULL); } if(iobfgettransform(inf, 1, &tobj->T[0][0], 0) <= 0) { return 0; } } } while(brack || more); if(hname != NULL) { if (tobj) { HandleSetObject(hname, (Ref *)tobj); } if (h) { /* HandleReferringTo() has passed the ownership to use, so * delete h because we do not need it anymore. */ HandleDelete(h); } h = hname; } /* Pass the ownership of h and tobj to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (tobjp != NULL) { if (*tobjp) { TransDelete(*tobjp); } *tobjp = tobj; } else if(tobj) { TransDelete(tobj); } return (h != NULL || tobj != NULL); } int TransObjStreamOut(Pool *p, Handle *h, TransObj *tobj) { return TransStreamOut(p, h, tobj->T); } int TransStreamOut(Pool *p, Handle *h, Transform T) { FILE *outf; if ((outf = PoolOutputFile(p)) == NULL) { return false; } fprintf(outf, "transform {\n"); PoolIncLevel(p, 1); if (PoolStreamOutHandle(p, h, true)) { fputtransform(outf, 1, &T[0][0], 0); } PoolIncLevel(p, -1); PoolFPrint(p, outf, "}\n"); return !ferror(outf); } TransObj *TransObjFSave(TransObj *t, FILE *outf, char *fname) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_DATA); PoolIncLevel(p, 1); ok = TransObjStreamOut(p, NULL, t); PoolDelete(p); return ok ? t : NULL; } TransformPtr TransFSave(Transform T, FILE *outf, char *fname) { Pool *p; int ok; p = PoolStreamTemp(fname, NULL, outf, 1, NULL); PoolSetOType(p, PO_DATA); PoolIncLevel(p, 1); ok = TransStreamOut(p, NULL, T); PoolDelete(p); return ok ? T : NULL; } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/geometry/transobj/transobj.h0000644000175000001440000000356310570634056017306 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_TRANSOBJ_H_ #define _GV_TRANSOBJ_H_ #include "reference.h" #include "handle.h" #include "transform.h" #define TRANSMAGIC OOGLMagic('t', 1) typedef struct TransObj { REFERENCEFIELDS; Transform T; } TransObj; extern void TransPosition(TransObj *tobj, Transform Tinto); extern void TransTransformTo(TransObj *tobj, Transform Tfrom); extern void TransDelete(TransObj *tobj); extern int TransStreamIn(Pool *, Handle **, Transform T); extern int TransStreamOut(Pool *, Handle *, Transform T); extern TransformPtr TransFSave(Transform T, FILE *outf, char *fname); extern int TransObjStreamIn(Pool *p, Handle **hp, TransObj **tobjp); extern int TransObjStreamOut(Pool *, Handle *, TransObj *tobj); extern TransObj *TransObjFSave(TransObj *t, FILE *outf, char *fname); extern void TransUpdate(Handle **hp, Ref *ignored, Transform Tfixme); extern TransObj *TransCreate(Transform); #endif /*_TRANSOBJ_*/ geomview-1.9.4/src/lib/geometry/transobj/Makefile.am0000644000175000001440000000022510455665331017341 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtransobj.la libtransobj_la_SOURCES = \ transobj.c \ transobj.h geomview-1.9.4/src/lib/geometry/transobj/Makefile.in0000644000175000001440000003537410665240501017356 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/transobj DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libtransobj_la_LIBADD = am_libtransobj_la_OBJECTS = transobj.lo libtransobj_la_OBJECTS = $(am_libtransobj_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libtransobj_la_SOURCES) DIST_SOURCES = $(libtransobj_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtransobj.la libtransobj_la_SOURCES = \ transobj.c \ transobj.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/transobj/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/transobj/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libtransobj.la: $(libtransobj_la_OBJECTS) $(libtransobj_la_DEPENDENCIES) $(LINK) $(libtransobj_la_OBJECTS) $(libtransobj_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transobj.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geometry/transobj/Headers0000644000175000001440000000001307730236600016571 00000000000000transobj.h geomview-1.9.4/src/lib/geometry/transform3/0000777000175000001440000000000010665240670015644 500000000000000geomview-1.9.4/src/lib/geometry/transform3/3d.h0000644000175000001440000000240110510667535016236 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _3dDEFS_ #define _3dDEFS_ #include #include #include "point.h" #include "plane.h" #include "line.h" #include "point3.h" #include "hpointn.h" #include "transform.h" #include "transformn.h" #include "radians.h" #include "ooglutil.h" #include "polyint.h" #endif geomview-1.9.4/src/lib/geometry/transform3/tm3rotate.c0000644000175000001440000001321210532340143017632 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips, Nathaniel Thurston */ #include #include "radians.h" #include "transform3.h" #include "point3.h" Point3 TM3_XAXIS = { 1.0, 0.0, 0.0 }; Point3 TM3_YAXIS = { 0.0, 1.0, 0.0 }; Point3 TM3_ZAXIS = { 0.0, 0.0, 1.0 }; void Tm3RotateX( Transform3 T, float angle ) { Tm3Identity( T ); Ctm3RotateX( T, angle ); } void Tm3RotateY( Transform3 T, float angle ) { Tm3Identity( T ); Ctm3RotateY( T, angle ); } void Tm3RotateZ( Transform3 T, float angle ) { Tm3Identity( T ); Ctm3RotateZ( T, angle ); } /* * Construct the matrix for a rotation about an axis. */ void Tm3Rotate( Transform3 T, float angle, Point3 *axis ) { Point3 Vu; float sinA, cosA, versA; if( axis == &TM3_XAXIS ) Tm3RotateX( T, angle ); else if( axis == &TM3_YAXIS ) Tm3RotateY( T, angle ); else if( axis == &TM3_ZAXIS ) Tm3RotateZ( T, angle ); else { Pt3Copy( axis, (Point3 *)&Vu ); Pt3Unit( &Vu ); sinA = sin(angle); cosA = cos(angle); versA = 1 - cosA; Tm3Identity( T ); T[TMX][TMX] = Vu.x*Vu.x*versA + cosA; T[TMY][TMX] = Vu.x*Vu.y*versA - Vu.z*sinA; T[TMZ][TMX] = Vu.x*Vu.z*versA + Vu.y*sinA; T[TMX][TMY] = Vu.y*Vu.x*versA + Vu.z*sinA; T[TMY][TMY] = Vu.y*Vu.y*versA + cosA; T[TMZ][TMY] = Vu.y*Vu.z*versA - Vu.x*sinA; T[TMX][TMZ] = Vu.x*Vu.z*versA - Vu.y*sinA; T[TMY][TMZ] = Vu.y*Vu.z*versA + Vu.x*sinA; T[TMZ][TMZ] = Vu.z*Vu.z*versA + cosA; } } /* * Construct the matrix for the geodesic rotation between two vectors. */ void Tm3RotateBetween( Transform3 T, Point3 *vfrom, Point3 *vto ) { Point3 Vu; float len, sinA, cosA, versA; Tm3Identity( T ); len = sqrt(Pt3Dot(vfrom,vfrom) * Pt3Dot(vto,vto)); if(len == 0) return; cosA = Pt3Dot(vfrom,vto) / len; versA = 1 - cosA; Pt3Cross( vfrom, vto, &Vu ); sinA = Pt3Length( &Vu ) / len; if(sinA == 0) return; Pt3Mul( 1/(len*sinA), &Vu, &Vu ); /* Normalize Vu */ T[TMX][TMX] = Vu.x*Vu.x*versA + cosA; T[TMY][TMX] = Vu.x*Vu.y*versA - Vu.z*sinA; T[TMZ][TMX] = Vu.x*Vu.z*versA + Vu.y*sinA; T[TMX][TMY] = Vu.y*Vu.x*versA + Vu.z*sinA; T[TMY][TMY] = Vu.y*Vu.y*versA + cosA; T[TMZ][TMY] = Vu.y*Vu.z*versA - Vu.x*sinA; T[TMX][TMZ] = Vu.x*Vu.z*versA - Vu.y*sinA; T[TMY][TMZ] = Vu.y*Vu.z*versA + Vu.x*sinA; T[TMZ][TMZ] = Vu.z*Vu.z*versA + cosA; } /*----------------------------------------------------------------------- * Function: Tm3RotateTowardZ * Description: Rotation of 3-space moving pt to positive z-axis * Args: T: output matrix * pt: input point * Returns: nothing * Author: njt (comments by mbp) * Date: (before) Tue Aug 18 23:31:58 1992 */ void Tm3RotateTowardZ( Transform3 T, HPoint3 *pt ) { Transform3 S; float r = pt->z; /* Construct T = rotation about x-axis moving pt into x-z plane */ Tm3Identity(T); r = sqrt(pt->y*pt->y + r*r); if (r > 0) { T[2][1] = -(T[1][2] = pt->y/r); T[2][2] = T[1][1] = pt->z/r; } /* Construct S = rotation about y axis moving T(pt) into y-z plane */ Tm3Identity(S); r = sqrt(pt->x*pt->x + r*r); if (r > 0) { S[2][0] = -(S[0][2] = pt->x/r); S[2][2] = S[0][0] = sqrt(pt->z*pt->z + pt->y*pt->y)/r; } /* Desired transform is then S * T */ Tm3Concat(T, S, T); } /* Tm3CarefulRotateTowardZ gives a matrix which rotates the world * about an axis perpendicular to both pos and the z axis, which moves * the -Z axis to pos (so [0,0,-1,0] * T = pos). * Unlike Tm3RotateTowardZ, the "twist" is well-defined * provided that it is not asked to rotate the negative z axis toward * the positive z axis. */ void Tm3CarefulRotateTowardZ( Transform3 T, HPoint3 *pos ) { Transform3 S; Transform3 Sinv; static HPoint3 minusZ = { 0,0,-1,0 }; HPoint3 perp, axis, posxy; double dist, c, s; /* first, find a rotation takes both pos and the z axis into the xy plane */ perp.x = -pos->y; perp.y = pos->x; perp.z = 0; perp.w = 1; Tm3RotateTowardZ(S, &perp); /* now, rotate pos and the -Z axis to this plane */ HPt3Transform(S, &minusZ, &axis); HPt3Transform(S, pos, &posxy); /* find the rotation matrix for the transformed points */ c = axis.x * posxy.x + axis.y * posxy.y; s = axis.x * posxy.y - axis.y * posxy.x; dist = sqrt(c*c+s*s); Tm3Identity(T); if (dist > 0) { c /= dist; s /= dist; T[0][0] = c; T[0][1] = s; T[1][0] = -s; T[1][1] = c; } else if(pos->z > 0) { T[1][1] = T[2][2] = -1; /* Singular rotation: arbitrarily flip YZ */ } /* else no rotation */ /* Finally, conjugate the result back to the original coordinate system */ Tm3Invert(S, Sinv); Tm3Concat(S, T, T); Tm3Concat(T, Sinv, T); } geomview-1.9.4/src/lib/geometry/transform3/tm3conjugate.c0000644000175000001440000000403010514661166020324 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /*----------------------------------------------------------------------- * Function: Tm3Conjugate * Description: conjugate one transform by another * Args: T: one transform ("conjugatee") (INPUT) * Tcon: another transform ("conjugater") (INPUT) * Tres: the result * Returns: nothing * Author: mbp * Date: Thu Aug 8 15:42:41 1991 * Notes: Sets Tres = Inverse[Tcon} * T * Tcon */ void Tm3Conjugate( T, Tcon, Tres ) Transform3 T, Tcon, Tres; { Transform3 Tconinv; /* We actually use adjoint instead of inverse, because the det factors would cancel out anyway cH: the above is obviously not true, maybe this routine was only used for conformal geometry; then it is true. Otherwise not. */ Tm3Adjoint( Tcon, Tconinv ); Tm3Concat( Tconinv, T, Tres ); Tm3Concat( Tres, Tcon, Tres ); } geomview-1.9.4/src/lib/geometry/transform3/tm3translate.c0000644000175000001440000001017110455701001020330 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips, Nathaniel Thurston */ #include "transform.h" #include #include void Tm3Translate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz ) { HPoint3 pt; pt.x = tx; pt.y = ty; pt.z = tz; pt.w = 1; Tm3TranslateOrigin(T, &pt); } void Tm3TranslateOrigin( Transform3 T, HPoint3 *pt ) { Tm3Identity(T); T[3][0] = pt->x / pt->w; T[3][1] = pt->y / pt->w; T[3][2] = pt->z / pt->w; } /************************************************************************/ void Tm3HypTranslate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz ) { HPoint3 pt; float t = sqrt( tx*tx + ty*ty + tz*tz ); if(t > 0) { pt.x = sinh(t) * tx / t; pt.y = sinh(t) * ty / t; pt.z = sinh(t) * tz / t; pt.w = cosh(t); Tm3HypTranslateOrigin(T, &pt); } else { Tm3Identity(T); } } static void minkowski_normalize( HPoint3 *pt ) { float f = sqrt( pt->w*pt->w - pt->x*pt->x - pt->y*pt->y - pt->z*pt->z ); pt->x /= f; pt->y /= f; pt->z /= f; pt->w /= f; } void Tm3HypTranslateOrigin( Transform3 T, HPoint3 *pt ) { Transform R, Rinv; minkowski_normalize(pt); Tm3Identity(T); T[2][3] = T[3][2] = sqrt(pt->x*pt->x + pt->y*pt->y + pt->z*pt->z); T[2][2] = T[3][3] = pt->w; Tm3RotateTowardZ(R, pt); Tm3Invert(R, Rinv); Tm3Concat(R, T, T); Tm3Concat(T, Rinv, T); } /***********************************************************************/ void Tm3SphTranslate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz ) { HPoint3 pt; float t = sqrt( tx*tx + ty*ty + tz*tz ); if(t > 0) { pt.x = sin(t) * tx / t; pt.y = sin(t) * ty / t; pt.z = sin(t) * tz / t; pt.w = cos(t); Tm3SphTranslateOrigin(T, &pt); } else { Tm3Identity(T); } } static void sph_normalize(HPoint3 *pt) { /* the following line originally did not have sqrt; but I think it should. Right? -- mbp Thu Dec 10 11:02:46 1992 */ float t = sqrt( pt->x*pt->x + pt->y*pt->y + pt->z*pt->z + pt->w*pt->w ); if(t > 0) { pt->x /= t; pt->y /= t; pt->z /= t; pt->w /= t; } } void Tm3SphTranslateOrigin( Transform3 T, HPoint3 *pt ) { Transform R, Rinv; sph_normalize(pt); Tm3Identity(T); T[2][3] = -(T[3][2] = sqrt(pt->x*pt->x + pt->y*pt->y + pt->z*pt->z)); T[2][2] = T[3][3] = pt->w; Tm3RotateTowardZ(R, pt); Tm3Invert(R, Rinv); Tm3Concat(R, T, T); Tm3Concat(T, Rinv, T); } void Tm3SpaceTranslate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz, int space) { switch (TM_SPACE(space)) { case TM_EUCLIDEAN: default: Tm3Translate(T, tx, ty, tz); break; case TM_HYPERBOLIC: Tm3HypTranslate(T, tx, ty, tz); break; case TM_SPHERICAL: Tm3SphTranslate(T, tx, ty, tz); break; } } void Tm3SpaceTranslateOrigin( Transform3 T, HPoint3 *pt, int space) { switch (TM_SPACE(space)) { case TM_EUCLIDEAN: default: Tm3TranslateOrigin(T, pt); break; case TM_HYPERBOLIC: Tm3HypTranslateOrigin(T, pt); break; case TM_SPHERICAL: Tm3SphTranslateOrigin(T, pt); break; } } geomview-1.9.4/src/lib/geometry/transform3/ctm3scale.c0000644000175000001440000000340510461140704017573 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /* pre-multiply a matrix by scale * * ( sx 0 0 0 ) * ( 0 sy 0 0 ) * [a] = ( 0 0 sz 0 ) * [a] * ( 0 0 0 1 ) */ void Ctm3Scale( Transform3 T, float sx, float sy, float sz ) { Tm3Coord *aptr; aptr=T[0]; /* row 1 */ *aptr++ *= sx; *aptr++ *= sx; *aptr++ *= sx; *aptr++ *= sx; /* row 2 */ *aptr++ *= sy; *aptr++ *= sy; *aptr++ *= sy; *aptr++ *= sy; /* row 3 */ *aptr++ *= sz; *aptr++ *= sz; *aptr++ *= sz; *aptr++ *= sz; /* row 4 is unchanged */ } geomview-1.9.4/src/lib/geometry/transform3/radians.h0000644000175000001440000000231210455701001017333 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef RADIANSDEF #define RADIANSDEF /* From Knuth: vol I */ #ifndef PI #define PI 3.1415926535897932384626433832795028841972 #endif #define RADIANS(angle) ((PI/180.0)*(angle)) #define DEGREES(angle) ((180.0/PI)*(angle)) #endif geomview-1.9.4/src/lib/geometry/transform3/tm3polardecomp.c0000644000175000001440000000600410514661166020655 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include "transform3.h" /* Compute the polar decomposition of a 3x3 matrix by means of a fast * Newton's iteration: * * A. A. DUBRULLE. AN OPTIMUM ITERATION FOR THE MATRIX POLAR DECOMPOSITION. * Electronic Transactions on Numerical Analysis, Volume 8, 1999, pp. 21-25, * Kent State University. * * Actually, we just compute the ortogonal factor Q, for any square * matrix A we have A=SQ with S symmetric pos. semi-definite and Q an * orthogonal matrix. Q is unique (up to renumbering of basis vectors) * if S is spd. */ static Tm3Coord frob_norm(Transform3 A); static void invt3x3(Transform3 A, Transform3 Ainv); static inline void axpbyt3x3(Tm3Coord a, Transform3 x, Tm3Coord b, Transform3 y, Transform3 res); #define EPS 1e-8 void Tm3PolarDecomp(Transform3 A, Transform3 Q) { Tm3Coord limit, g, f, pf; Transform3 a; Tm3Copy(A, Q); limit = (1.0+EPS)*sqrt(3.0); invt3x3(Q, a); g = sqrt(frob_norm(a)/frob_norm(Q)); axpbyt3x3(0.5*g, Q, 0.5/g, a, Q); f = frob_norm(Q); pf = 1e8; while (f > limit && f < pf) { pf = f; invt3x3(Q, a); g = sqrt(frob_norm(a) / f); axpbyt3x3(0.5*g, Q, 0.5/g, a, Q); f = frob_norm(Q); } } static Tm3Coord frob_norm(Transform3 A) { int i, j; Tm3Coord res = 0.0; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { res += A[i][j]* A[i][j]; } } return sqrt(res); } static void wedge(Tm3Coord v[3], Tm3Coord w[3], Tm3Coord z[3]) { z[0] = v[1]*w[2] - v[2]*w[1]; z[1] = v[2]*w[0] - v[0]*w[2]; z[2] = v[0]*w[1] - v[1]*w[0]; } static Tm3Coord scp(Tm3Coord v[3], Tm3Coord w[3]) { return v[0]*w[0] + v[1]*w[1] + v[2]*w[2]; } static void invt3x3(Transform3 A, Transform3 Ainv) { Tm3Coord det_1; int i, j; wedge(A[1], A[2], Ainv[0]); wedge(A[2], A[0], Ainv[1]); wedge(A[0], A[1], Ainv[2]); det_1 = 1.0/scp(A[0], Ainv[0]); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { Ainv[i][j] *= det_1; } } } static inline void axpbyt3x3(Tm3Coord a, Transform3 x, Tm3Coord b, Transform3 y, Transform3 res) { int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { res[i][j] = a * x[i][j] + b * y[j][i]; } } } geomview-1.9.4/src/lib/geometry/transform3/tm3stack.c0000644000175000001440000000315510455701001017444 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "stdio.h" #include "transform3.h" # define MAXSTACK 32 static int maxstack = 0; static Transform3 stack[MAXSTACK]; void Tm3Push( T ) Transform3 T; { if( maxstack < MAXSTACK ) Tm3Copy( T, stack[maxstack++] ); else fprintf( stderr, "Stack Overflow at 32\n" ); } void Tm3Pop( T ) Transform3 T; { if( maxstack > 0 ) Tm3Copy( stack[--maxstack], T ); else fprintf( stderr, "Stack Underflow\n" ); } geomview-1.9.4/src/lib/geometry/transform3/tm3transpose.c0000644000175000001440000000363510461140704020364 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /*----------------------------------------------------------------------- * Function: Tm3Transpose * Description: transpose a matrix * Args: T: the matrix to transpose (INPUT) * Ttrans: the transposed matrix (OUTPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 14:41:24 1991 * Notes: */ void Tm3Transpose( T, Ttrans ) Transform3 T, Ttrans; { int i, j; double t; if( T != Ttrans ) { for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) Ttrans[i][j] = T[j][i]; } else { for( i=0; i<4; i++ ) for( j=0; j #include /*----------------------------------------------------------------------- * Function: Tm3Copy * Description: copy a transform * Args: Tsrc: source transform (INPUT) * Tdst: destination transform (OUTPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 15:40:09 1991 * Notes: */ void Tm3Copy( Tsrc, Tdst ) Transform3 Tsrc, Tdst; { memcpy( (char *)Tdst, (char *)Tsrc, sizeof(Transform3) ); } /*----------------------------------------------------------------------- * Function: Tm3Compare * Description: compare 2 transforms * Args: T1, T2: the two transforms * tol: tolerance * Returns: 1 if equal, 0 if not * Author: hanrahan, mbp * Date: Thu Aug 8 15:40:09 1991 * Notes: "equal" means corresponding elements are within tol of * each other. */ int Tm3Compare( Transform3 T1, Transform3 T2, float tol ) { int i,j; double d; for (i=0; i<4; ++i) for (j=0; j<4; ++j) { d = T1[i][j] - T2[i][j]; if (fabs(d) > tol) { return 0; } } return 1; } geomview-1.9.4/src/lib/geometry/transform3/tm3dual.c0000644000175000001440000000322210564221642017270 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /*----------------------------------------------------------------------- * Function: Tm3Dual * Description: compute the dual of a matrix * Args: T: the matrix to compute the dual of (INPUT) * Tdual: the dual matrix (OUTPUT) * Returns: nothing * Author: mbp * Date: Thu Aug 8 14:43:24 1991 * Notes: dual = transpose of adjoint matrix */ void Tm3Dual(Transform3 T, Transform3 Tdual) { Tm3Adjoint( T, Tdual ); Tm3Transpose( Tdual, Tdual ); } geomview-1.9.4/src/lib/geometry/transform3/tm3align.c0000644000175000001440000000377710455701001017443 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" void Tm3AlignX( Transform3 T, Point3 *axis ) { Tm3Align( T, axis, &TM3_XAXIS ); } void Tm3AlignY( Transform3 T, Point3 *axis ) { Tm3Align( T, axis, &TM3_YAXIS ); } void Tm3AlignZ( Transform3 T, Point3 *axis ) { Tm3Align( T, axis, &TM3_ZAXIS ); } void Tm3Align( Transform3 T, Point3 *axis, Point3 *newaxis ) { Transform3 Tr; Transform3 Tinv; Point3 o, zaxis, yaxis, newyaxis; o.x = o.y = o.z = 0.; Pt3Cross( axis, newaxis, &zaxis ); Pt3Cross( &zaxis, axis, &yaxis ); Pt3Cross( &zaxis, newaxis, &newyaxis ); Pt3Unit(axis); Pt3Unit(&yaxis); Pt3Unit(&zaxis); Tm3Tetrad3( T, axis, &yaxis, &zaxis, &o ); Tm3Invert( T, Tinv ); Pt3Unit(newaxis); Pt3Unit(&newyaxis); Tm3Tetrad3( Tr, newaxis, &newyaxis, &zaxis, &o ); Tm3Concat(Tinv, Tr, T); } geomview-1.9.4/src/lib/geometry/transform3/ctm3translate.c0000644000175000001440000000310210461140704020473 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /* * Pre-multiply a matrix by translation * * ( 1 0 0 0 ) * ( 0 1 0 0 ) * [a] = ( 0 0 1 0 ) * [a] * ( tx ty tz 1 ) */ void Ctm3Translate( Transform3 T, float tx, float ty, float tz ) { Tm3Coord *aptr; int cnt; aptr=T[0]; cnt=4; do{ aptr[12] += aptr[0]*tx+aptr[4]*ty+aptr[8]*tz; ++aptr; }while (--cnt); } geomview-1.9.4/src/lib/geometry/transform3/tm3invert.c0000644000175000001440000000511110564221642017651 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /*----------------------------------------------------------------------- * Function: Tm3Invert * Description: compute the inverse of a Transform * Args: m: the transform (INPUT) * mi: the inverse transform (OUTPUT) * Returns: nothing * Author: njt * Date: Sat Jul 18 12:04:19 CDT 1992 */ float Tm3Invert(Transform3 m, Transform3 mi) { int i, j; int k; float x; Transform3 t; float f; Tm3Copy(m, t); Tm3Copy(TM3_IDENTITY, mi); /* Components of unrolled inner loops: */ #define SUB(v,k) v[j][k] -= f*v[i][k] #define SWAP(v,k) x = v[i][k], v[i][k] = v[largest][k], v[largest][k] = x for (i = 0; i < 4; i++) { int largest = i; float largesq = t[i][i]*t[i][i]; for (j = i+1; j < 4; j++) if ((x = t[j][i]*t[j][i]) > largesq) largest = j, largesq = x; /* swap t[i][] with t[largest][] */ SWAP(t,0); SWAP(t,1); SWAP(t,2); SWAP(t,3); SWAP(mi,0); SWAP(mi,1); SWAP(mi,2); SWAP(mi,3); for (j = i+1; j < 4; j++) { f = t[j][i] / t[i][i]; /* subtract f*t[i][] from t[j][] */ SUB(t,0); SUB(t,1); SUB(t,2); SUB(t,3); SUB(mi,0); SUB(mi,1); SUB(mi,2); SUB(mi,3); } } for (i = 0; i < 4; i++) { f = t[i][i]; for (k = 0; k < 4; k++) { t[i][k] /= f; mi[i][k] /= f; } } for (i = 3; i >= 0; i--) for (j = i-1; j >= 0; j--) { f = t[j][i]; SUB(t,0); SUB(t,1); SUB(t,2); SUB(t,3); SUB(mi,0); SUB(mi,1); SUB(mi,2); SUB(mi,3); } return 1; } geomview-1.9.4/src/lib/geometry/transform3/tm3persp.c0000644000175000001440000000521410455701001017466 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "transform3.h" #include "ooglutil.h" /* For OOGLError */ /* * ( 2*n/(r-l) 0 0 0 ) * ( 0 2*n/(t-b) 0 0 ) * T = ( (r+l)/(r-l) (t+b)/(t-b) (f+n)/(n-f) -1 ) * ( 0 0 2*f*n/(n-f) 0 ) * * Transform a row vector {xw,yw,zw,w} * T => {X,Y,Z,-z} * mapping the given viewing frustum into the cube -1 <= {X,Y,Z} <= 1, * with Z = -1 at near plane (z = -n), +1 at far plane (z = -f) * since the camera is looking in its -Z direction. * Here l and r are the x coordinates, and b and t the y coordinates, * of the edges of the viewing frustum at the near plane, z = -n. * * Note that n and f should be the positive distances to the near & far planes, * not the negative Z coordinates of those planes. */ void Tm3Perspective( Transform3 T, float l, float r, float b, float t, float n, float f ) { Tm3Identity( T ); if( l == r ) { OOGLError(1/*UserError*/, "Tm3Perspective: l and r must be different." ); return; } if( b == t ) { OOGLError(1/*UserError*/, "Tm3Perspective: b and t must be different." ); return; } if( n == f ) { OOGLError(1/*UserError*/, "Tm3Perspective: n and f must be different." ); return; } T[TMX][TMX] = 2*n/(r-l); T[TMY][TMY] = 2*n/(t-b); T[TMZ][TMZ] = -(f+n)/(f-n); T[TMW][TMW] = 0.; T[TMZ][TMW] = -1; T[TMZ][TMX] = (r+l)/(r-l); T[TMZ][TMY] = (t+b)/(t-b); T[TMW][TMZ] = 2*n*f/(n-f); } geomview-1.9.4/src/lib/geometry/transform3/tm3ortho.c0000644000175000001440000000414110455701001017466 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "transform3.h" /* * ( 2/(r-l) 0 0 0 ) * ( 0 2/(t-b) 0 0 ) * T = ( 0 0 -2/(f-n) 0 ) * ( -(r+l)/(r-l) -(t+b)/(t-b) -(f+n)/(f-n) 1 ) * * Transform to the unit cube! Also flips from rh to lh. */ void Tm3Orthographic( Transform3 T, float l, float r, float b, float t, float n, float f ) { Tm3Identity( T ); if( l == r ) { fprintf( stderr, "Tm3Orthographic: l and r must be different.\n" ); return; } if( b == t ) { fprintf( stderr, "Tm3Orthographic: b and t must be different.\n" ); return; } if( n == f ) { fprintf( stderr, "Tm3Orthographic: n and f must be different.\n" ); return; } T[TMX][TMX] = 2/(r-l); T[TMY][TMY] = 2/(t-b); T[TMZ][TMZ] = -2/(f-n); T[TMW][TMX] = -(r+l)/(r-l); T[TMW][TMY] = -(t+b)/(t-b); T[TMW][TMZ] = -(f+n)/(f-n); } geomview-1.9.4/src/lib/geometry/transform3/Makefile.am0000644000175000001440000000100110464073635017606 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtransform3.la libtransform3_la_SOURCES = \ ctm3align.c ctm3ortho.c ctm3persp.c ctm3perspfov.c ctm3rotate.c ctm3scale.c ctm3tetrad.c ctm3translate.c tm3adjoint.c tm3align.c tm3concat.c tm3conjugate.c tm3copy.c tm3dual.c tm3identity.c tm3invert.c tm3ortho.c tm3persp.c tm3perspfov.c tm3print.c tm3rotate.c tm3scale.c tm3stack.c tm3tetrad.c tm3translate.c tm3transpose.c tm3polardecomp.c \ 3d.h radians.h transform3.h transform.h geomview-1.9.4/src/lib/geometry/transform3/Makefile.in0000644000175000001440000004262210665240501017624 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/transform3 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libtransform3_la_LIBADD = am_libtransform3_la_OBJECTS = ctm3align.lo ctm3ortho.lo ctm3persp.lo \ ctm3perspfov.lo ctm3rotate.lo ctm3scale.lo ctm3tetrad.lo \ ctm3translate.lo tm3adjoint.lo tm3align.lo tm3concat.lo \ tm3conjugate.lo tm3copy.lo tm3dual.lo tm3identity.lo \ tm3invert.lo tm3ortho.lo tm3persp.lo tm3perspfov.lo \ tm3print.lo tm3rotate.lo tm3scale.lo tm3stack.lo tm3tetrad.lo \ tm3translate.lo tm3transpose.lo tm3polardecomp.lo libtransform3_la_OBJECTS = $(am_libtransform3_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libtransform3_la_SOURCES) DIST_SOURCES = $(libtransform3_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtransform3.la libtransform3_la_SOURCES = \ ctm3align.c ctm3ortho.c ctm3persp.c ctm3perspfov.c ctm3rotate.c ctm3scale.c ctm3tetrad.c ctm3translate.c tm3adjoint.c tm3align.c tm3concat.c tm3conjugate.c tm3copy.c tm3dual.c tm3identity.c tm3invert.c tm3ortho.c tm3persp.c tm3perspfov.c tm3print.c tm3rotate.c tm3scale.c tm3stack.c tm3tetrad.c tm3translate.c tm3transpose.c tm3polardecomp.c \ 3d.h radians.h transform3.h transform.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/transform3/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/transform3/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libtransform3.la: $(libtransform3_la_OBJECTS) $(libtransform3_la_DEPENDENCIES) $(LINK) $(libtransform3_la_OBJECTS) $(libtransform3_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3align.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3ortho.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3persp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3perspfov.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3rotate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3scale.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3tetrad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctm3translate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3adjoint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3align.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3concat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3conjugate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3copy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3dual.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3identity.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3invert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3ortho.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3persp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3perspfov.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3polardecomp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3print.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3rotate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3scale.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3stack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3tetrad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3translate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tm3transpose.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geometry/transform3/ctm3align.c0000644000175000001440000000314310455701001017571 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" void Ctm3AlignX( Transform3 T, Point3 *axis ) { Ctm3Align( T, axis, &TM3_XAXIS ); } void Ctm3AlignY( Transform3 T, Point3 *axis ) { Ctm3Align( T, axis, &TM3_YAXIS ); } void Ctm3AlignZ( Transform3 T, Point3 *axis ) { Ctm3Align( T, axis, &TM3_ZAXIS ); } void Ctm3Align( Transform3 T, Point3 *axis, Point3 *newaxis ) { Transform3 Ta; Tm3Align( Ta, axis, newaxis ); Tm3Concat(Ta, T, T); } geomview-1.9.4/src/lib/geometry/transform3/tm3print.c0000644000175000001440000000311110623615571017500 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "transform3.h" void Tm3Print(FILE *f, Transform3 T) { int i, j; if (f == NULL) { return; } fprintf(f, "transform {\n"); for (i=0; i<4; i++) { fprintf(f, " "); for (j=0; j<4; j++) { fprintf(f, "%10.7f ", T[i][j] ); } fprintf(f, "\n" ); } fprintf(f, "}\n" ); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/geometry/transform3/ctm3persp.c0000644000175000001440000000307210455701001017631 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /* * Premultiply T by the given perspective projection. * Probably not too useful; a projection matrix should be postmultiplied, * not premultiplied, by a world-to-camera transform. */ void Ctm3Perspective( Transform3 T, float l, float r, float b, float t, float n, float f ) { Transform3 P; Tm3Perspective( P, l, r, b, t, n, f ); Tm3Concat( P, T, T ); } geomview-1.9.4/src/lib/geometry/transform3/ctm3ortho.c0000644000175000001440000000257510455701001017642 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" void Ctm3Orthographic( Transform3 T, float l, float r, float b, float t, float n, float f ) { Transform3 P; Tm3Orthographic( P, l, r, b, t, n, f ); Tm3Concat(P, T, T); } geomview-1.9.4/src/lib/geometry/transform3/ctm3tetrad.c0000644000175000001440000000356510455701001017772 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /*----------------------------------------------------------------------- * Function: Ctm3Tetrad * Description: concatenate a transform with given columns to the right * of another transform * Args: T: the transform to modify * x: column 1 of right factor * y: column 2 of right factor * z: column 3 of right factor * w: column 4 of right factor * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 14:54:56 1991 * Notes: sets T to T * S, where S is the transform with * columns x, y, z, w. */ void Ctm3Tetrad( T, x, y, z, w ) Transform3 T; HPoint3 *x, *y, *z, *w; { Transform3 Ta; Tm3Tetrad( Ta, x, y, z, w ); Tm3Concat(Ta, T, T); } geomview-1.9.4/src/lib/geometry/transform3/transform.h0000644000175000001440000000635710464113173017751 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef TRANSFORMDEFS #define TRANSFORMDEFS #include "transform3.h" typedef Transform3 Transform; typedef Tm3Coord TmCoord; #define TmAdjoint Tm3Adjoint #define TmInvert Tm3Invert #define TmDeterminant Tm3Determinant #define TmDual Tm3Dual #define TmTranspose Tm3Transpose #define TmPostConcat Tm3PostConcat #define TmPreConcat Tm3PreConcat #define TmConcat Tm3Concat #define TmConjugate Tm3Conjugate #define TmPolarDecomp Tm3PolarDecomp #define TmPrint Tm3Print #define TmCopy Tm3Copy #define TmCompare Tm3Compare #define TmPush Tm3Push #define TmPop Tm3Pop #define TmIdentity Tm3Identity #define TmScale Tm3Scale #define TmRotateX Tm3RotateX #define TmRotateY Tm3RotateY #define TmRotateZ Tm3RotateZ #define TmRotate Tm3Rotate #define TmRotateBetween Tm3RotateBetween #define TmRotateTowardZ Tm3RotateTowardZ #define TmCarefulRotateTowardZ Tm3CarefulRotateTowardZ #define TmAlignX Tm3AlignX #define TmAlignY Tm3AlignY #define TmAlignZ Tm3AlignZ #define TmAlign Tm3Align #define CtmTranslate Ctm3Translate #define CtmScale Ctm3Scale #define CtmRotateX Ctm3RotateX #define CtmRotateY Ctm3RotateY #define CtmRotateZ Ctm3RotateZ #define CtmRotate Ctm3Rotate #define CtmAlignX Ctm3AlignX #define CtmAlignY Ctm3AlignY #define CtmAlignZ Ctm3AlignZ #define CtmAlign Ctm3Align #define TM_XAXIS TM3_XAXIS #define TM_YAXIS TM3_YAXIS #define TM_ZAXIS TM3_ZAXIS #define TM_IDENTITY TM3_IDENTITY #define TmTranslate Tm3Translate #define TmTranslateOrigin Tm3TranslateOrigin #define TmHypTranslate Tm3HypTranslate #define TmHypTranslateOrigin Tm3HypTranslateOrigin #define TmSphTranslate Tm3SphTranslate #define TmSphTranslateOrigin Tm3SphTranslateOrigin #define TmSpaceTranslate Tm3SpaceTranslate #define TmSpaceTranslateOrigin Tm3SpaceTranslateOrigin #define TmProject Tm3Project #define CtmProject Ctm3Project #define TmReflect Tm3Reflect #define CtmReflect Ctm3Reflect #define CtmRefract Ctm3Refract #define CtmRefract2 Ctm3Refract2 #define TmRefract Tm3Refract #define TmRefract2 Tm3Refract2 #define TmSkew Tm3Skew #define TmShear Tm3Shear #define TmPerspective Tm3Perspective #define TmOrthographic Tm3Orthographic #define TmWindow Tm3Window #define CtmSkew Ctm3Skew #define CtmShear Ctm3Shear #define CtmWindow Ctm3Window #define CtmPerspective Ctm3Perspective #define CtmOrthographic Ctm3Orthographic #endif geomview-1.9.4/src/lib/geometry/transform3/tm3tetrad.c0000644000175000001440000000473210455701001017624 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" /*----------------------------------------------------------------------- * Function: Tm3Tetrad * Description: create a matrix with given vectors as rows * Args: T: the created matrix (OUTPUT) * x: row 1 (INPUT) * y: row 2 (INPUT) * z: row 3 (INPUT) * w: row 4 (INPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 13:06:48 1991 * Notes: */ void Tm3Tetrad( Transform3 T, HPoint3 *x, HPoint3 *y, HPoint3 *z, HPoint3 *w ) { T[TMX][TMX] = x->x; T[TMX][TMY] = x->y; T[TMX][TMZ] = x->z; T[TMX][TMW] = x->w; T[TMY][TMX] = y->x; T[TMY][TMY] = y->y; T[TMY][TMZ] = y->z; T[TMY][TMW] = y->w; T[TMZ][TMX] = z->x; T[TMZ][TMY] = z->y; T[TMZ][TMZ] = z->z; T[TMZ][TMW] = z->w; T[TMW][TMX] = w->x; T[TMW][TMY] = w->y; T[TMW][TMZ] = w->z; T[TMW][TMW] = w->w; } void Tm3Tetrad3( Transform3 T, Point3 *x, Point3 *y, Point3 *z, Point3 *w ) { T[TMX][TMX] = x->x; T[TMX][TMY] = x->y; T[TMX][TMZ] = x->z; T[TMX][TMW] = 0; T[TMY][TMX] = y->x; T[TMY][TMY] = y->y; T[TMY][TMZ] = y->z; T[TMY][TMW] = 0; T[TMZ][TMX] = z->x; T[TMZ][TMY] = z->y; T[TMZ][TMZ] = z->z; T[TMZ][TMW] = 0; T[TMW][TMX] = w->x; T[TMW][TMY] = w->y; T[TMW][TMZ] = w->z; T[TMW][TMW] = 1; } geomview-1.9.4/src/lib/geometry/transform3/tm3adjoint.c0000644000175000001440000000702010564221642017773 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" #define det( a1, a2, a3, b1, b2, b3, c1, c2, c3 ) \ (a1*(b2*c3-c2*b3) - a2*(b1*c3-c1*b3) + a3*(b1*c2-c1*b2)) static float cofactor(Transform3 T, int x, int y) { static Tm3Coord mat3x3[3][3]; Tm3Coord *dst = mat3x3[0]; Tm3Coord *src = T[0]; int i; for( i=0; i<4; i++, src += 4 ) { if(i == x) continue; if(y != 0) *dst++ = src[0]; if(y != 1) *dst++ = src[1]; if(y != 2) *dst++ = src[2]; if(y != 3) *dst++ = src[3]; } return det( mat3x3[0][0], mat3x3[0][1], mat3x3[0][2], mat3x3[1][0], mat3x3[1][1], mat3x3[1][2], mat3x3[2][0], mat3x3[2][1], mat3x3[2][2] ); } static void adjoint(Transform3 T, Transform3 Tadj) { int x, y; float cof; for( x=0; x<4; x++ ) for( y=0; y<4; y++ ) { cof = cofactor( T, y, x ); Tadj[x][y] = ((x+y)&1) ? -cof : cof; } } /*----------------------------------------------------------------------- * Function: Tm3Adjoint * Description: compute the adjoint of a transform * Args: T: the transform (INPUT) * Tadj: the adjoint of T (OUTPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 15:38:56 1991 * Notes: */ void Tm3Adjoint(Transform3 T, Transform3 Tadj) { if( T == Tadj ) { Transform3 Ttmp; adjoint( T, Ttmp ); Tm3Copy( Ttmp, Tadj ); } else { adjoint( T, Tadj ); } } /*----------------------------------------------------------------------- * Function: determinant * Description: compute the determinant of a transform, using an already * computed adjoint transform * Args: T: the transform (INPUT) * Tadj: T's adjoint transform (INPUT) * Returns: det(T) * Author: hanrahan, mbp * Date: Thu Aug 8 15:23:53 1991 * Notes: */ static float determinant( T, Tadj ) Transform3 T, Tadj; { return T[0][0]*Tadj[0][0] + T[0][1]*Tadj[1][0] + T[0][2]*Tadj[2][0] + T[0][3]*Tadj[3][0]; } /*----------------------------------------------------------------------- * Function: Tm3Determinant * Description: compute the determinant of a transform * Args: T: the transform (INPUT) * Returns: det(T) * Author: mbp * Date: Thu Aug 8 15:27:52 1991 * Notes: */ float Tm3Determinant(Transform3 T) { Transform3 Tadj; Tm3Adjoint( T, Tadj ); return determinant( T, Tadj ); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/geometry/transform3/tm3scale.c0000644000175000001440000000247410455701001017431 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" void Tm3Scale( Transform3 T, float sx, float sy, float sz ) { Tm3Identity( T ); Ctm3Scale( T, sx, sy, sz ); } geomview-1.9.4/src/lib/geometry/transform3/tm3concat.c0000644000175000001440000000733310461140704017614 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "transform3.h" /************************************************************************ * NOTE: we're taking out PostConcat and PreConcat. They're being left * * here for a short while longer as a memorial. * ************************************************************************/ /*----------------------------------------------------------------------- * Function: Tm3PostConcat * Description: concatenate one transform to another on the right * Args: Ta: left transform (INPUT & OUTPUT) * Tb: right transform (INPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 13:31:35 1991 * Notes: Sets Ta to Ta * Tb. */ void Tm3PostConcat( Ta, Tb ) Transform3 Ta, Tb; { fprintf(stderr, "WARNING: obsolete function Tm3PostConcat called. Use\n\ Tm3Concat instead.\n"); Tm3Concat( Ta, Tb, Ta ); } /*----------------------------------------------------------------------- * Function: Tm3PreConcat * Description: concatenate one transform to another on the left * Args: Ta: left transform (INPUT) * Tb: right transform (INPUT & OUTPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 13:31:35 1991 * Notes: Sets Tb to Ta * Tb. */ void Tm3PreConcat( Ta, Tb ) Transform3 Ta, Tb; { fprintf(stderr, "WARNING: obsolete function Tm3PreConcat called. Use\n\ Tm3Concat instead.\n"); Tm3Concat( Ta, Tb, Tb ); } /*----------------------------------------------------------------------- * Function: Tm3Concat * Description: concatenate two transforms * Args: Ta: left factor (INPUT) * Tb: right factor (INPUT) * Tprod: product (OUTPUT) * Returns: nothing * Author: hanrahan, mbp * Date: Thu Aug 8 13:15:08 1991 * Notes: Passing the same transform for either factor and the * product is allowed. */ void Tm3Concat( Ta, Tb, Tprod ) Transform3 Ta, Tb, Tprod; { int i; #define MAKEPRODUCT(T) \ for( i=0; i<4; i++ ) { \ T[i][0] = Ta[i][0]*Tb[0][0] + \ Ta[i][1]*Tb[1][0] + \ Ta[i][2]*Tb[2][0] + \ Ta[i][3]*Tb[3][0]; \ T[i][1] = Ta[i][0]*Tb[0][1] + \ Ta[i][1]*Tb[1][1] + \ Ta[i][2]*Tb[2][1] + \ Ta[i][3]*Tb[3][1]; \ T[i][2] = Ta[i][0]*Tb[0][2] + \ Ta[i][1]*Tb[1][2] + \ Ta[i][2]*Tb[2][2] + \ Ta[i][3]*Tb[3][2]; \ T[i][3] = Ta[i][0]*Tb[0][3] + \ Ta[i][1]*Tb[1][3] + \ Ta[i][2]*Tb[2][3] + \ Ta[i][3]*Tb[3][3]; \ } if( Ta == Tprod || Tb == Tprod ) { Transform3 T; MAKEPRODUCT(T); memcpy( Tprod, T, sizeof(Transform3) ); } else { MAKEPRODUCT(Tprod); } #undef MAKEPRODUCT } geomview-1.9.4/src/lib/geometry/transform3/transform3.h0000644000175000001440000001424410570565755020045 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_TRANSFORM3_H_ #define _GV_TRANSFORM3_H_ #include #include "geomtypes.h" /* * Space & model flags; used to specify what space we're in, and * a model for hyperbolic space. The actual value may be a logical * OR of a space and a model value. */ #define TM_HYPERBOLIC 0x0001 #define TM_EUCLIDEAN 0x0002 #define TM_SPHERICAL 0x0004 #define TM_SPACE(x) (x & 0x00ff) #define TM_MODEL(x) (x & 0xff00) #define TM_VIRTUAL 0x0100 #define TM_PROJECTIVE 0x0200 #define TM_CONFORMAL_BALL 0x0400 #define TMNULL ((TransformPtr)NULL) /* How to pass a NULL Transform3 ptr */ #define TMX 0 #define TMY 1 #define TMZ 2 #define TMW 3 extern Point3 TM3_XAXIS; extern Point3 TM3_YAXIS; extern Point3 TM3_ZAXIS; extern Transform3 TM3_IDENTITY; extern void Tm3Adjoint( Transform3, Transform3 ); extern float Tm3Invert( Transform3 T, Transform3 Tinv ); extern float Tm3Determinant( Transform3 T ); extern void Tm3Dual( Transform3 T, Transform3 Tdual ); extern void Tm3Transpose( Transform3 Ta, Transform3 Tb ); extern void Tm3PostConcat( Transform3 Ta, Transform3 Tb ); extern void Tm3PreConcat( Transform3 Ta, Transform3 Tb ); extern void Tm3Concat( Transform3 Ta, Transform3 Tb, Transform3 Tc ); extern void Tm3PolarDecomp( Transform3, Transform3 ); extern void Tm3Print(FILE *f, Transform3 T); extern void Tm3Copy( Transform3 Tsrc, Transform3 Tdst ); extern int Tm3Compare( Transform3 T1, Transform3 T2, float tol ); extern void Tm3Push( Transform3 T ); extern void Tm3Pop( Transform3 T ); extern void Tm3Conjugate( Transform3 T, Transform3 Tcon, Transform3 Tres ); extern void Tm3Identity( Transform3 T ); extern void Tm3Tetrad( Transform3 T, HPoint3 *x,HPoint3 *y,HPoint3 *z,HPoint3 *w ); extern void Tm3Tetrad3( Transform3 T, Point3 *x,Point3 *y,Point3 *z,Point3 *w ); extern void Tm3Translate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz ); extern void Tm3TranslateOrigin( Transform3 T, HPoint3 *pt ); extern void Tm3HypTranslate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz ); extern void Tm3HypTranslateOrigin( Transform3 T, HPoint3 *pt ); extern void Tm3SphTranslate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz ); extern void Tm3SphTranslateOrigin( Transform3 T, HPoint3 *pt ); extern void Tm3SpaceTranslate( Transform3 T, Tm3Coord tx, Tm3Coord ty, Tm3Coord tz, int space ); extern void Tm3SpaceTranslateOrigin( Transform3 T, HPoint3 *pt, int space ); extern void Tm3RotateX( Transform3 T, float angle ); extern void Tm3RotateY( Transform3 T, float angle ); extern void Tm3RotateZ( Transform3 T, float angle ); extern void Tm3Rotate( Transform3 T, float angle, Point3 *axis ); extern void Tm3RotateBetween( Transform3 T, Point3 *from, Point3 *to ); extern void Tm3CarefulRotateTowardZ( Transform3 T, HPoint3 *pos ); extern void Tm3RotateTowardZ( Transform3 T, HPoint3 *pos ); extern void Tm3AlignX( Transform3 T, Point3 *axis ); extern void Tm3AlignY( Transform3 T, Point3 *axis ); extern void Tm3AlignZ( Transform3 T, Point3 *axis ); extern void Tm3Align( Transform3 T, Point3 *axis, Point3 *newaxis ); extern void Tm3Scale( Transform3 T, float sx, float sy, float sz ); extern void Tm3Skew( Transform3 T, float angle, Point3 *axis1, Point3 *axis2 ); extern void Tm3Shear( Transform3 T, Point3 *pt, HPlane3 *pl ); extern void Tm3Reflect( Transform3 T, HPlane3 *pl ); extern int Tm3Refract( Transform3 T, HPlane3 *pl, float eta ); extern int Tm3Refract2( Transform3 T, HPlane3 *pl, float eta ); extern void Tm3Project( Transform3 T, HPlane3 *pl, Point3 *pt ); extern void Tm3Orthographic( Transform3 T, float l, float r, float b, float t, float n, float f ); extern void Tm3Perspective( Transform3 T, float l, float r, float b, float t, float n, float f ); extern void Tm3Window( Transform3 T, float l, float r, float b, float t ); extern void Tm3PerspectiveFOV( Transform3 T, float fov, float aspect, float n, float f ); extern void Ctm3Translate( Transform3 T, float tx, float ty, float tz ); extern void Ctm3RotateX( Transform3 T, float angle ); extern void Ctm3RotateY( Transform3 T, float angle ); extern void Ctm3RotateZ( Transform3 T, float angle ); extern void Ctm3Rotate( Transform3 T, float angle, Point3 *axis ); extern void Ctm3AlignX( Transform3 T, Point3 *axis ); extern void Ctm3AlignY( Transform3 T, Point3 *axis ); extern void Ctm3AlignZ( Transform3 T, Point3 *axis ); extern void Ctm3Align( Transform3 T, Point3 *axis, Point3 *newaxis ); extern void Ctm3Scale( Transform3 T, float sx, float sy, float sz ); extern void Ctm3Skew( Transform3 T, float angle, Point3 *axis1, Point3 *axis2 ); extern void Ctm3Shear( Transform3 T, Point3 *pt, HPlane3 *pl ); extern void Ctm3Reflect( Transform3 T, HPlane3 *pl ); extern int Ctm3Refract( Transform3 T, HPlane3 *pl, float eta ); extern int Ctm3Refract2( Transform3 T, HPlane3 *pl, float eta ); extern void Ctm3Project( Transform3 T, HPlane3 *pl, Point3 *pt ); extern void Ctm3Orthographic( Transform3 T, float l, float r, float b, float t, float n, float f ); extern void Ctm3Perspective( Transform3 T, float l, float r, float b, float t, float n, float f ); extern void Ctm3Window( Transform3 T, float l, float r, float b, float t ); /* include it after defining all prototypes */ #include "point3.h" #include "hpoint3.h" #endif /* _GV_TRANSFORM3_H_ */ geomview-1.9.4/src/lib/geometry/transform3/tm3perspfov.c0000644000175000001440000000430410455701001020200 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "radians.h" #include "transform3.h" #include "ooglutil.h" /* For OOGLError() */ /* * * ( cot(fov/2)/aspect 0 0 0 ) * ( 0 cot(fov/2) 0 0 ) * T = ( 0 0 -(f+n)/(f-n) -1 ) * ( 0 0 -2*f*n/(f-n) 0 ) * * Transform to the unit cube. Also flip from rh to lh. */ void Tm3PerspectiveFOV( Transform3 T, float fov, float aspect, float n, float f ) { float cotfov; Tm3Identity( T ); if( n == f ) { OOGLError(1/*UserError*/, "Tm3Perspective: n and f must be different" ); return; } if( fov == 0. ) { OOGLError(1/*UserError*/, "Tm3Perspective: fov must not equal 0" ); return; } cotfov = tan( RADIANS(fov)/2.0 ); if( cotfov != 0. ) cotfov = 1. / cotfov; T[TMX][TMX] = cotfov/aspect; T[TMY][TMY] = cotfov; T[TMZ][TMZ] = -2*(f+n)/(f-n); T[TMW][TMZ] = -2*f*n/(f-n); T[TMX][TMW] = -1.; T[TMW][TMW] = 0.; } geomview-1.9.4/src/lib/geometry/transform3/ctm3rotate.c0000644000175000001440000000571210461140704020005 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "radians.h" #include "transform3.h" /* * Pre-multiply a matrix by a rotate about the x axis. * * ( 1 0 0 0 ) * ( 0 c s 0 ) * [a] = ( 0 -s c 0 ) * [a] * ( 0 0 0 1 ) */ void Ctm3RotateX( Transform3 T, float angle ) { int i; double t,s,c; s=sin(angle); c=cos(angle); for (i=0; i<4; ++i) { t = T[1][i] * c + T[2][i] * s; T[2][i] = T[2][i] * c - T[1][i] * s; T[1][i] = t; } } /* * Pre-multiply a matrix by a rotate about the y axis. * * ( c 0 s 0 ) * ( 0 1 0 0 ) * [a] = ( -s 0 c 0 ) * [a] * ( 0 0 0 1 ) */ void Ctm3RotateY( Transform3 T, float angle ) { int i; double t,s,c; s=sin(angle); c=cos(angle); for (i=0; i<4; ++i) { t = T[2][i] * c - T[0][i] * s; T[0][i] = T[0][i] * c + T[2][i] * s; T[2][i] = t; } } /* * Pre-multiply a matrix by a rotate about the z axis. * * ( c s 0 0 ) * ( -s c 0 0 ) * [a] = ( 0 0 1 0 ) * [a] * ( 0 0 0 1 ) */ void Ctm3RotateZ( Transform3 T, float angle ) { int i; double t,s,c; s=sin(angle); c=cos(angle); for (i=0; i<4; ++i) { t = T[0][i] * c + T[1][i] * s; T[1][i] = T[1][i] * c - T[0][i] * s; T[0][i] = t; } } /* * Pre-multiply a matrix by a rotate about an arbitrary axis * * [a] = [ rotation] * [a] * */ void Ctm3Rotate( Transform3 T, float angle, Point3 *axis ) { if( axis == &TM3_XAXIS ) Ctm3RotateX( T, angle ); else if( axis == &TM3_YAXIS ) Ctm3RotateY( T, angle ); else if( axis == &TM3_ZAXIS ) Ctm3RotateZ( T, angle ); else { Transform3 Ta; Tm3Rotate( Ta, angle, axis ); Tm3Concat(Ta, T, T); } } geomview-1.9.4/src/lib/geometry/transform3/Headers0000644000175000001440000000005007730236476017061 000000000000003d.h radians.h transform.h transform3.h geomview-1.9.4/src/lib/geometry/transform3/tm3identity.c0000644000175000001440000000303610455701001020166 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include "transform3.h" Transform3 TM3_IDENTITY = { {1.0, 0.0, 0.0, 0.0}, {0.0, 1.0, 0.0, 0.0}, {0.0, 0.0, 1.0, 0.0}, {0.0, 0.0, 0.0, 1.0} }; /* * Initialize a matrix to identity * * ( 1 0 0 0 ) * ( 0 1 0 0 ) * [a] = ( 0 0 1 0 ) * ( 0 0 0 1 ) */ void Tm3Identity( T ) Transform3 T; { Tm3Copy( TM3_IDENTITY, T ); } geomview-1.9.4/src/lib/geometry/transformn/0000777000175000001440000000000010665240670015737 500000000000000geomview-1.9.4/src/lib/geometry/transformn/Makefile.am0000644000175000001440000000024110532354523017700 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtransformn.la libtransformn_la_SOURCES = \ tmNpolardecomp.c \ transformn.h geomview-1.9.4/src/lib/geometry/transformn/Makefile.in0000644000175000001440000003546010665240501017721 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/transformn DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libtransformn_la_LIBADD = am_libtransformn_la_OBJECTS = tmNpolardecomp.lo libtransformn_la_OBJECTS = $(am_libtransformn_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libtransformn_la_SOURCES) DIST_SOURCES = $(libtransformn_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libtransformn.la libtransformn_la_SOURCES = \ tmNpolardecomp.c \ transformn.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/transformn/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/transformn/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libtransformn.la: $(libtransformn_la_OBJECTS) $(libtransformn_la_DEPENDENCIES) $(LINK) $(libtransformn_la_OBJECTS) $(libtransformn_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tmNpolardecomp.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geometry/transformn/transformn.h0000644000175000001440000010110110623621744020206 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, * Mark Phillips, Olaf Holt, Claus-Justus Heine */ #ifndef _GV_TRANSFORMN_H_ #define _GV_TRANSFORMN_H_ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "geomtypes.h" #include "freelist.h" #define TMNMAGIC OOGLMagic('T', 1) extern DEF_FREELIST(TransformN); /* Refer to the (i,j)'th entry in a TransformN object; * beware that (i,j) are not checked! */ #define TmNentry(T, i, j) ((T)->a[(i)*(T)->odim + (j)]) extern TransformN *TmNPolarDecomp(const TransformN *A, TransformN *Q); static inline TransformN *TmNCreate(int idim, int odim, HPtNCoord *a); static inline void TmNDelete(TransformN *T); static inline int TmNSpace(const TransformN *T); static inline TransformN *TmNSetSpace(TransformN *T, int space); static inline TransformN *TmNInvert(const TransformN *T, TransformN *Tinv); static inline TransformN *TmNTranspose(const TransformN *from, TransformN *to); static inline TransformN *TmNConcat(const TransformN *A, const TransformN *B, TransformN *result); static inline TransformN *TmNCopy(const TransformN *Tsrc, TransformN *Tdst); static inline TransformN *TmNIdentity(TransformN *T); static inline TransformN *TmNTranslateOrigin(TransformN *T, const HPointN *pt); static inline TransformN *TmNPad(const TransformN *Tin, int idim, int odim, TransformN *Tout); static inline TransformN *TmNPadZero(const TransformN *Tin, int idim, int odim, TransformN *Tout); static inline TransformN *TmNSpaceTranslateOrigin( TransformN *T, HPointN *pt ); static inline TransformN *TmNScale(TransformN *T, const HPointN *amount); static inline TransformN *TmNRotate(TransformN *T, const HPointN *from, const HPointN *toward); static inline TransformN *TmNApplyDN(TransformN *mat, int *perm, Transform3 delta); static inline TransformN *TmNApplyT3TN(Transform3 T3, int *perm, TransformN *mat); static inline TransformN *TmNMap(const TransformN *from, int *axes, TransformN *to); static inline TransformN *TmNProject(const TransformN *from, int *perm, TransformN *to); static inline int TmNGetSize(const TransformN *T, int *idim, int *odim); static inline void TmNPrint(FILE *f, const TransformN *T); static inline TransformN *TmNRead(IOBFILE *f, int binary); #include "hpointn.h" #include "hpoint3.h" #ifndef max # define _gv_tmn_max_ # define max(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef min # define _gv_tmn_min_ # define min(a,b) ((a) < (b) ? (a) : (b)) #endif /* BIG FAT NOTE: internally the homogeneous component of a vector is * located at 0, consequently the translation part of a transform is * stored in the 0-th row of a matrix. This just makes concatenation * etc. much easier when the dimensions of objects do not match. * * Prolongation/truncation is defined as follows: if an input vectors * dim does not match a TransformN's idim, then the input vector is * implicitly padded with zero's (if idim > dim) or the matrix is * interpreted as identity on the "missing" dimensions up to odim (if * dim > idim). The part of the vector with dim > odim is mapped to 0 * (during padding) */ /* Construct a transform. NULL a => identity */ static inline TransformN * TmNCreate(int idim, int odim, HPtNCoord *a) { TransformN *T; FREELIST_NEW(TransformN, T); RefInit((Ref *)T, TMNMAGIC); if (idim <= 0) idim = 1; if (odim <= 0) odim = 1; T->idim = idim; T->odim = odim; T->a = OOGLNewNE(HPtNCoord, idim*odim, "new TransformN data"); if (a == NULL) memset(T->a, 0, idim*odim*sizeof(HPtNCoord)); else memcpy(T->a, a, idim*odim*sizeof(HPtNCoord)); return T; } /* Destroy */ static inline void TmNDelete(TransformN *T) { if (T && RefDecr((Ref*)T) == 0) { if (T->a) { OOGLFree(T->a); } FREELIST_FREE(TransformN, T); } } /* Get and set space */ static inline int TmNSpace(const TransformN *T) { return TM_EUCLIDEAN; } static inline TransformN * TmNSetSpace(TransformN *T, int space) { if (space != TM_EUCLIDEAN) { OOGLError(1, "Non-Euclidean space not support in higher dimensions.\n"); return NULL; } return T; } /* Invert */ static inline TransformN * TmNInvert(const TransformN *T, TransformN *Tinv) { int i, j, k; HPtNCoord x; HPtNCoord f; int dim = T->idim; TransformN *t = TmNCreate(dim, dim, T->a); if (T->odim != dim) { OOGLError(1, "Matrix for inversion is not square"); return 0; } if (Tinv == NULL) { Tinv = TmNCreate(dim, dim, NULL); } else if (Tinv->idim != dim || Tinv->odim != dim) { Tinv->a = OOGLRenewNE(HPtNCoord, Tinv->a, dim*dim, "renew TransformN"); Tinv->idim = dim; Tinv->odim = dim; } TmNIdentity(Tinv); /* Components of unrolled inner loops: */ #define SUB(v, k) v[j*dim+k] -= f*v[i*dim+k] #define SWAP(v, k) x = v[i*dim+k], v[i*dim+k] = v[largest*dim+k], v[largest*dim+k] = x for (i = 0; i < dim; i++) { int largest = i; HPtNCoord largesq = t->a[i*dim+i]*t->a[i*dim+i]; for (j = i+1; j < dim; j++) if ((x = t->a[j*dim+i]*t->a[j*dim+i]) > largesq) largest = j, largesq = x; /* swap t->a[i][] with t->a[largest][] */ for(k = 0; k < dim; k++) { SWAP(t->a, k); SWAP(Tinv->a, k); } for (j = i+1; j < dim; j++) { f = t->a[j*dim+i] / t->a[i*dim+i]; /* subtract f*t->a[i][] from t->a[j][] */ for(k = 0; k < dim; k++) { SUB(t->a, k); SUB(Tinv->a, k); } } } for (i = 0; i < dim; i++) { f = t->a[i*dim+i]; for (k = 0; k < dim; k++) { t->a[i*dim+k] /= f; Tinv->a[i*dim+k] /= f; } } for (i = dim-1; i >= 0; i--) for (j = i-1; j >= 0; j--) { f = t->a[j*dim+i]; for(k = 0; k < dim; k++) { SUB(t->a, k); SUB(Tinv->a, k); } } #undef SUB #undef SWAP TmNDelete(t); /* those Geometry Center peoples forgot that ... (cH) */ return Tinv; } /* Transpose */ static inline TransformN * TmNTranspose(const TransformN *from, TransformN *to) { int i, j; int idim = from->idim, odim = from->odim; HPtNCoord t; if (from != to) { if (to == NULL) to = TmNCreate(odim, idim, NULL); else if (to->idim != odim || to->odim != idim) { to->a = OOGLRenewNE(HPtNCoord, to->a, idim*odim, "renew TransformN"); to-> idim = odim; to->odim = idim; } for (i = 0; i < idim; i++) for( j=0; ja[j*idim+i] = from->a[i*odim+j]; } else { #define SWITCH(a, b) t = a; a = b; b = t; if (idim == odim) { for (i = 0; i < idim; i++) for (j = 0; j < i; j++) { SWITCH(to->a[i*odim+j], to->a[j*odim+i]); } } else { int remainder, dividend; to->idim = odim; to->odim = idim; for(i=0; i < idim; i++) for(j=0; j < odim; j++) { remainder = (i*idim +j)%odim; dividend = (i*idim + j -remainder)/odim; SWITCH(to->a[i*odim+j], to->a[dividend*odim+remainder]); } } #undef SWITCH } return to; } /* Multiply transforms * * We pad as necessary, filling diagonals down with 1's as * appropriate. We do not use PadZero(), because the concatenation * would not commute with the matrix operation; i.e. (v A) B should be * the same as v (A B). */ static inline TransformN * TmNConcat(const TransformN *A, const TransformN *B, TransformN *result) { int i, j, k; int dim1, dim2, dim3; if (A == NULL && B == NULL) { return NULL; } else if (A == NULL) { return TmNCopy(B, result); } else if (B == NULL) { return TmNCopy(A, result); } dim1 = A->idim; dim2 = A->odim; dim3 = B->odim; #define MAKEPRODUCT(T, A, B) \ T->idim = dim1; T->odim = dim3; \ for( i=0; ia[i*dim3+j] = 0; \ for( k=0; ka[i*dim3+j] += A->a[i*dim2+k] * B->a[k*dim3+j]; \ } if (B->idim == dim2) { /* the easy case, padding not necessary */ if ( A == result || B == result ) { TransformN *T = TmNCreate( dim1, dim3, NULL); MAKEPRODUCT(T, A, B); TmNCopy(T, result); TmNDelete(T); } else { if (result == NULL) result = TmNCreate(dim1, dim3, NULL); else if (result->idim != dim1 || result->odim != dim3) { result->a = OOGLRenewNE(HPtNCoord, result->a, dim1*dim3, "renew TransformN"); result->idim = dim1; result->odim = dim3; } MAKEPRODUCT(result, A, B); } } else if ( B->idim > dim2) { TransformN *Atmp = TmNCreate(dim1, dim2, NULL); dim2 = B->idim; TmNPad(A, dim1, dim2, Atmp); if ( B == result ) { TransformN *T = TmNCreate( dim1, dim3, NULL); MAKEPRODUCT(T, Atmp, B); TmNCopy(T, result); TmNDelete(T); } else { if (result == NULL) result = TmNCreate(dim1, dim3, NULL); else if (result->idim != dim1 || result->odim != dim3) { result->a = OOGLRenewNE(HPtNCoord, result->a, dim1*dim3, "renew TransformN"); result->idim = dim1; result->odim = dim3; } MAKEPRODUCT(result, Atmp, B); } TmNDelete(Atmp); } else { /* B->idim < dim2 */ TransformN *Btmp = TmNCreate(dim2, dim3, NULL); TmNPad(B, dim2, dim3, Btmp); if ( A == result ) { TransformN *T = TmNCreate( dim1, dim3, NULL); MAKEPRODUCT(T, A, Btmp); TmNCopy(T, result); TmNDelete(T); } else { if (result == NULL) result = TmNCreate(dim1, dim3, NULL); else if (result->idim != dim1 || result->odim != dim3) { result->a = OOGLRenewNE(HPtNCoord, result->a, dim1*dim3, "renew TransformN"); result->idim = dim1; result->odim = dim3; } MAKEPRODUCT(result, A, Btmp); } TmNDelete(Btmp); } #undef MAKEPRODUCT return result; } /* Copy */ static inline TransformN * TmNCopy(const TransformN *Tsrc, TransformN *Tdst) { if (Tsrc != Tdst) { if (Tdst == NULL) { Tdst = TmNCreate(Tsrc->idim, Tsrc->odim, Tsrc->a); } else { if (Tdst->idim != Tsrc->idim || Tdst->odim != Tsrc->odim) { Tdst->a = OOGLRenewNE(HPtNCoord, Tdst->a, Tsrc->idim*Tsrc->odim, "renew TransformN"); Tdst->idim = Tsrc->idim; Tdst->odim = Tsrc->odim; } memcpy(Tdst->a, Tsrc->a, Tsrc->idim*Tsrc->odim*sizeof(HPtNCoord)); } } return Tdst; } /* Set to identity */ static inline TransformN * TmNIdentity(TransformN *T) { if (T == NULL) { T = TmNCreate(1, 1, NULL); T->a[0] = 1; } else { int i; int idim = T->idim, odim = T->odim; memset(T->a, 0, idim*odim*sizeof(HPtNCoord)); if (idim == odim || idim < odim) { for(i = 0; i < idim; i++) T->a[i*odim+i] = 1; } else { /* idim > odim */ for(i = 0; i < odim; i++) T->a[i*odim+i] = 1; } } return T; } /* Euclidean translations * * Be careful: the homogeneous component is now located at index 0. */ static inline TransformN * TmNTranslateOrigin(TransformN *T, const HPointN *pt) { int i; HPtNCoord c = pt->v[0]; int dim = pt->dim; /* first make sure T has the appropriate size etc. */ if (T == NULL) { T = TmNCreate(dim, dim, NULL); TmNIdentity(T); } else { TmNIdentity(T); if (dim > T->odim) { TmNPad(T, T->idim, dim, T); } } /* its so easy now! */ for(i = 1; i < dim; i++) { T->a[i] = pt->v[i] / c; } return T; } /* Pad the transform, with ones down the main diagonal, not assuming a * homogeneous coordinate that needs special attention. This function * explicitly performs the padding which is used implicitly by, * e.g. HPtNTransform() if the dimensions do not match. * * Padding is really simple now because the homogeneous component is * (internally) located at index 0 for HPointN and TransformN. * Therefor TmNPadSimple() has simply be renamed to TmNPad() because * it does the right thing automatically now. */ static inline TransformN * TmNPad(const TransformN *Tin, int idim, int odim, TransformN *Tout) { if (Tin == NULL) { if (Tout == NULL) { Tout = TmNCreate(idim, odim, NULL); } else { Tout->a = OOGLRenewNE(HPtNCoord, Tout->a, idim*odim, "renew TransformN"); Tout->idim = idim; Tout->odim = odim; } TmNIdentity(Tout); } else if ( odim <= 0 || idim <= 0 ) { ; /* do nothing */ } else { int oldidim = Tin->idim, oldodim = Tin->odim; int i, j; if (Tin != Tout) { if (Tout == NULL) { Tout = TmNCreate(idim, odim, NULL); } else if (Tout->idim != idim || Tout->odim != odim) { Tout->a = OOGLRenewNE(HPtNCoord, Tout->a, idim*odim, "renew TransformN"); Tout->idim = idim; Tout->odim = odim; } if (oldidim < idim && oldodim < odim) { /* copy over first oldidim rows */ for (i = 0; i < oldidim; i++) { /* copy start of row */ for(j = 0; j < oldodim; j++) Tout->a[i*odim+j] = Tin->a[i*oldodim+j]; /* fill remaining part */ for(; j < odim; j++) if (i == j) Tout->a[i*odim+j] = 1.0; else Tout->a[i*odim+j] = 0.0; } /* fill remaining rows */ for (; i < idim; i++) { for(j = 0; j < odim; j++) if (i==j) Tout->a[i*odim+j] = 1; else Tout->a[i*odim+j] = 0; } } else if (oldidim < idim && oldodim >= odim) { /* copy over the first oldidim rows, excess colomns are discarded */ for (i = 0; i < oldidim; i++) { for(j = 0; j < odim; j++) Tout->a[i*odim+j] = Tin->a[i*oldodim+j]; } /* copy over the remaining rows, discarding excess columns */ for (; ia[i*odim+j] = 1.0; else Tout->a[i*odim+j] = 0.0; } } else if (oldidim >= idim && oldodim < odim) { /* copy over the first idim rows, excess rows are discarded */ for (i=0; i < idim; i++) { for(j = 0; j < oldodim; j++) Tout->a[i*odim+j] = Tin->a[i*oldodim+j]; for(; j < odim; j++) if (i == j) Tout->a[i*odim+j] = 1; else Tout->a[i*odim+j] = 0; } } else if (oldidim >= idim && oldodim >= odim) { /* copy operation, discard excess columns and rows */ for (i = 0; i < idim; i++) for(j = 0; j < odim; j++) Tout->a[i*odim+j] = Tin->a[i*oldodim+j]; } } else { TransformN *Tnew = TmNCreate(idim, odim, NULL); if ( oldidim < idim && oldodim < odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; for( j=oldodim; ja[i*odim+j] = 1; } for ( i=oldidim; ia[i*odim+j] = 1; } } else if ( oldidim < idim && oldodim >= odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } for ( i=oldidim; ia[i*odim+j] = 1; } } else if ( oldidim >= idim && oldodim < odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; for( j=oldodim; ja[i*odim+j] = 1; } } else if ( oldidim >= idim && oldodim >= odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } TmNCopy(Tnew, Tout); TmNDelete(Tnew); } } return Tout; } /* Pad with zeroes */ static inline TransformN * TmNPadZero(const TransformN *Tin, int idim, int odim, TransformN *Tout) { if (Tin == NULL) { if (Tout == NULL) { Tout = TmNCreate(idim, odim, NULL); } else { Tout->a = OOGLRenewNE(HPtNCoord, Tout->a, idim*odim, "renew TransformN"); memset(Tout->a, 0, idim*odim*sizeof(HPtNCoord)); Tout->idim = idim; Tout->odim = odim; } } else if ( odim <= 0 || idim <= 0 ) { ; /* do nothing */ } else { int oldidim = Tin->idim, oldodim = Tin->odim; int i, j; if (Tin != Tout) { if (Tout == NULL) { Tout = TmNCreate(idim, odim, NULL); } else if (Tout->idim != idim || Tout->odim != odim) { Tout->a = OOGLRenewNE(HPtNCoord, Tout->a, idim*odim, "renew TransformN"); Tout->idim = idim; Tout->odim = odim; } memset(Tout->a, 0, idim*odim*sizeof(HPtNCoord) ); if ( oldidim < idim && oldodim < odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else if ( oldidim < idim && oldodim >= odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else if ( oldidim >= idim && oldodim < odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else if ( oldidim >= idim && oldodim >= odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else { TransformN *Tnew = TmNCreate(idim, odim, NULL); if ( oldidim < idim && oldodim < odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else if ( oldidim < idim && oldodim >= odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else if ( oldidim >= idim && oldodim < odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } } else if ( oldidim >= idim && oldodim >= odim) { for ( i=0; ia[i*odim+j] = Tin->a[i*oldodim+j]; } TmNCopy(Tnew, Tout); TmNDelete(Tnew); } } return Tout; } /* Translations by the space of 'pt' */ static inline TransformN * TmNSpaceTranslateOrigin( TransformN *T, HPointN *pt ) { /* this has not yet been implemented * for now, just call the euclidean one */ return TmNTranslateOrigin(T, pt); } /* Scale by the components of 'amount' * * I.e. generate a matrix which acts as such a scaling. Therefore, if * T != NULL, we resize T such that idim >= dim and odim >= dim. */ static inline TransformN * TmNScale(TransformN *T, const HPointN *amount) { int i; int dim = amount->dim; if (T == NULL) { T = TmNCreate(dim, dim, NULL); } TmNIdentity(T); if (dim != T->idim || dim != T->odim) { #if 0 /* this seems overly complicated ??? */ int idim = T->idim, odim = T->odim; switch( (dim > idim) + 2*(dim>odim) + 4*(idim>odim) ) { case 0: /* odim > idim > dim */ idim = odim; break; case 1: /* odim > dim > idim */ idim = odim; break; case 2: /* impossible */ OOGLError(1, "incorrect switch"); break; case 3: /* dim > odim > idim */ odim = dim; idim = dim; break; case 4: /* idim > odim > dim */ odim = idim; break; case 5: /* impossible */ OOGLError(1, "incorrect switch"); break; case 6: /* idim > dim > odim */ odim = idim; break; case 7: /* dim > idim > odim */ odim = dim; idim = dim; break; } #else /* T shall act as a scaling, so we just have to make sure that * input and output dimension are >= dim. */ int idim = max(T->idim, dim), odim = max(T->odim, dim); #endif TmNPad(T, idim, odim, T); } for(i = 0; i < dim; i++) { T->a[i*T->odim+i] = amount->v[i]; } return T; } /* Construct a geodesic rotation taking vector 'from' to 'toward' */ static inline TransformN * TmNRotate(TransformN *T, const HPointN *from, const HPointN *toward) { int i, j, k; int dim = from->dim; HPtNCoord len, proj, cosA, sinA; HPtNCoord *planebasis1, *planebasis2; /* not homogeneous coords!*/ HPtNCoord planecoord1, planecoord2; planebasis1 = OOGLNewNE(HPtNCoord, 2*dim, "TmNRotate data"); planebasis2 = planebasis1 + dim; #define NORMALIZE(v, vout) \ len = 0; \ for (k = 1; k < dim; k++) \ len += v[k] * v[k]; \ if (len == 0) { \ len = 1; \ } else \ len = sqrt(len); \ for(k = 1; k < dim; k++) \ vout[k] = v[k] / len; #define DOTPRODUCT(v1, v2, result) \ result = 0; \ for (i = 1; i < dim; i++) \ result += v1[i] * v2[i]; if (dim != toward->dim) { if (toward->dim < dim) { HPointN *towardtmp = HPtNCreate(dim, NULL); HPtNPad((HPointN *)toward, dim, towardtmp); if (T == NULL) T = TmNCreate(dim, dim, NULL); else if (T->idim != dim || T->odim != dim) { T->a = OOGLRenewNE(HPtNCoord, T->a, dim*dim, "renew TransformN"); T->idim = dim; T->odim = dim; } memset(T->a+1, 0, (dim*dim-1)*sizeof(HPtNCoord)); T->a[0] = 1.0; NORMALIZE(from->v, planebasis1); DOTPRODUCT(towardtmp->v, planebasis1, proj); for (i = 1; i < dim; i++) planebasis2[i] = towardtmp->v[i] - proj * planebasis1[i]; NORMALIZE(planebasis2, planebasis2); DOTPRODUCT(towardtmp->v, towardtmp->v, len); if ((len = sqrt(len)) == 0) { OOGLError(1, "zero vector unexpected"); return NULL; } cosA = proj / len; sinA = sqrt(1-cosA*cosA); for(i = 1; i < dim; i++) { /* each basis vector */ planecoord1 = (cosA - 1) * planebasis1[i] + sinA * planebasis2[i]; planecoord2 = -sinA * planebasis1[i] + (cosA - 1) * planebasis2[i]; for(j = 1; j < dim; j++) { if (i == j) { T->a[j*dim+i] = 1 + planecoord1*planebasis1[j] + planecoord2*planebasis2[j]; } else { T->a[j*dim+i] = planecoord1*planebasis1[j] + planecoord2*planebasis2[j]; } } } } else { HPointN *fromtmp = HPtNCreate(dim, NULL); dim = toward->dim; HPtNPad((HPointN *)from, dim, fromtmp); if (T == NULL) T = TmNCreate(dim, dim, NULL); else if (T->idim != dim || T->odim != dim) { T->a = OOGLRenewNE(HPtNCoord, T->a, dim*dim, "renew TransformN"); T->idim = dim; T->odim = dim; } memset(T->a+1, 0, (dim*dim-1)*sizeof(HPtNCoord)); T->a[0] = 1.0; NORMALIZE(fromtmp->v, planebasis1); DOTPRODUCT(toward->v, planebasis1, proj); for (i = 1; i < dim; i++) planebasis2[i] = toward->v[i] - proj * planebasis1[i]; NORMALIZE(planebasis2, planebasis2); DOTPRODUCT(toward->v, toward->v, len); if ((len = sqrt(len)) == 0) { OOGLError(1, "zero vector unexpected"); return NULL; } cosA = proj / len; sinA = sqrt(1-cosA*cosA); for (i = 1; i < dim; i++) { /* each basis vector */ planecoord1 = (cosA - 1) * planebasis1[i] + sinA * planebasis2[i]; planecoord2 = -sinA * planebasis1[i] + (cosA - 1) * planebasis2[i]; for (j = 1; j < dim; j++) { if (i == j) { T->a[j*dim+i] = 1 + planecoord1*planebasis1[j] + planecoord2*planebasis2[j]; } else { T->a[j*dim+i] = planecoord1*planebasis1[j] + planecoord2*planebasis2[j]; } } } } } else { if (T == NULL) T = TmNCreate(dim, dim, NULL); else if (T->idim != dim || T->odim != dim) { T->a = OOGLRenewNE(HPtNCoord, T->a, dim*dim, "renew TransformN"); T->idim = dim; T->odim = dim; } memset(T->a+1, 0, (dim*dim-1)*sizeof(HPtNCoord)); T->a[0] = 1; /* form orthonormal basis for plane */ NORMALIZE(from->v, planebasis1); DOTPRODUCT(toward->v, planebasis1, proj); for (i = 1; i < dim; i++) planebasis2[i] = toward->v[i] - proj * planebasis1[i]; NORMALIZE(planebasis2, planebasis2); /* now that we have the basis vectors for the plane, calculate the rotation matrix */ DOTPRODUCT(toward->v, toward->v, len); if ((len = sqrt(len)) == 0) { OOGLError(1, "zero vector unexpected"); return NULL; } cosA = proj / len; sinA = sqrt(1-cosA*cosA); for(i = 1; i < dim; i++) { /* each basis vector */ planecoord1 = (cosA - 1) * planebasis1[i] + sinA * planebasis2[i]; planecoord2 = -sinA * planebasis1[i] + (cosA - 1) * planebasis2[i]; for(j = 1; j < dim; j++) if (i == j) T->a[j*dim+i] = 1 + planecoord1*planebasis1[j] + planecoord2*planebasis2[j]; else T->a[j*dim+i] = planecoord1*planebasis1[j] + planecoord2*planebasis2[j]; } } #undef DOTPRODUCT #undef NORMALIZE OOGLFree(planebasis1); return T; } /* special operation for computing n-d counterpart for movement in a * subspace * * permute tells which dimensions are projected * * delta is the usual 4x4 matrix used in Geomview * * NOTE: this functions computes mat * delta, i.e. delta is applied * from the right */ static inline TransformN * TmNApplyDN(TransformN *mat, int *perm, Transform3 delta) { HPtNCoord sum; int idim, odim; const int d3 = 4; /* this is the dimension of the delta matrix */ HPtNCoord *tmp; int i, j, k; int perm_dim; static const int dflt_perm[] = { 1, 2, 3, 0 }; if (!perm) { perm = (int *)dflt_perm; } perm_dim = perm[0]; for (i = 0; i < d3; i++) { perm_dim = max(perm[i], perm_dim); } ++perm_dim; idim = mat->idim; if (mat->odim < perm_dim) { odim = max(mat->odim, perm_dim); TmNPad(mat, idim, odim, mat); /* Note: the input matrix is changed here */ } else { odim = mat->odim; } /* Make a "copy" of mat, copying only the COLUMNS mentioned in perm. * As delta operates from the right, we need only those columns, but * all rows of mat. */ tmp = OOGLNewNE(HPtNCoord, idim*d3, "TmNApplyDN data"); for (i = 0; i < idim; i++) { for (j= 0; j < d3; j++) { tmp[i*d3+j] = mat->a[i*odim+perm[j]]; } } /* apply delta to the appropriate columns and copy the result back * to mat */ for(i = 0; i < idim; i++) { for (j= 0; j < d3; j++) { sum = 0; for(k = 0; k < d3; k++) { sum += tmp[i*d3+k] * delta[k][j]; } mat->a[i*odim + perm[j]] = sum; } } OOGLFree(tmp); return mat; } /* Apply a 3d transformation from the left (in contrast to * TmNApplyDN() which applies it from the right. */ static inline TransformN * TmNApplyT3TN(Transform3 T3, int *perm, TransformN *mat) { HPtNCoord sum; int idim, odim, d3 = 4; /* this is the dimension of the delta matrix */ HPtNCoord *tmp; int i, j, k; int perm_dim; static const int dflt_perm[] = { 1, 2, 3, 0 }; if (!perm) { perm = (int *)dflt_perm; } /* As TransfromN's are virtually infinite (i.e. act as identity if * the input dimensions do not match), we only have to make sure * that "mat" has enough space such that perm can be applied. */ perm_dim = perm[0]; for (i = 0; i < d3; i++) { perm_dim = max(perm[i], perm_dim); } ++perm_dim; if (!mat) { idim = odim = perm_dim; mat = TmNCreate(idim, odim, NULL); TmNIdentity(mat); } else { odim = mat->odim; if (mat->idim < perm_dim) { idim = max(mat->idim, perm_dim); TmNPad(mat, idim, odim, mat); /* Note: the input matrix is changed here */ } else { idim = mat->idim; } } /* Make a "copy" of mat, copying only the ROWS mentioned in perm. * As delta operates from the right, we need only those rows, but * all columns of mat. */ tmp = OOGLNewNE(HPtNCoord, odim*d3, "TmNApplyDN data"); for(i = 0; i < d3; i++) { for(j= 0; j < odim; j++) { tmp[i*odim+j] = mat->a[perm[i]*odim+j]; } } for (i = 0; i < d3; i++) { for (j = 0; j < odim; j++) { sum = 0; for(k = 0; k < d3; k++) { sum += T3[i][k] * tmp[k*odim+j]; } mat->a[perm[i]*odim + j] = sum; } } OOGLFree(tmp); return mat; } /* concatenate (from the left) with a permutation matrix which maps x, * y, z to the 3d sub-space described by "perm". This means that we * simply have to interchange the rows of from. * * This is meant to map a 3d object to another 3d sub-space, * e.g. a camera geometry. This means that we really want to use * * dflt_perm^{-1} perm * * as permutation. */ static inline TransformN * TmNMap(const TransformN *from, int *axes, TransformN *to) { const int d3 = 4; int odim; int row1, row2, col; int perm_dim, i; static const int dflt_perm[] = { 1, 2, 3, 0 }; static const int inv_perm[] = { 3, 0, 1, 2 }; int perm[4]; if (!axes) { axes = (int *)dflt_perm; } perm_dim = axes[0]; for (i = 1; i < d3; i++) { perm_dim = max(axes[i], perm_dim); } ++perm_dim; for (i = 0; i < d3; i++) { perm[i] = axes[inv_perm[i]]; } if (from == NULL) { odim = perm_dim; to = TmNPadZero(to, d3, odim, to); for (i = 0; i < d3; i++) { to->a[odim*i+perm[i]] = 1.0; } return to; } if (to != from) { odim = from->odim; to = TmNPadZero(to, d3, odim, to); for (row1 = 0; row1 < d3; row1++) { row2 = perm[row1]; for (col = 0; col < odim; col++) { to->a[row1*odim+col] = from->a[row2*odim+col]; } } return to; } /* from == to, need to swap rows in place */ if (to->odim < perm_dim) { TmNPad(to, from->idim, perm_dim, to); } odim = to->odim; for (row1 = 0; row1 < d3; row1++) { row2 = perm[row1]; for (col = 0; col < odim; col++) { HPtNCoord swap = to->a[row1*odim+col]; to->a[row1*odim+col] = to->a[row2*odim+col]; to->a[row2*odim+col] = swap; } } /* simply discard all excess rows */ to->a = OOGLRenewNE(HPtNCoord, to->a, d3*odim, "renew TransformN"); to->idim = d3; return to; } /* Concatenate (from the right) from with the permutation and * projection defined by perm. This function creates an N-transform * which has the effect of HPtNTransformComponents(), but doing the * projection and permutation by a single matrix multiplication spares * a lot of floating point operations, especially in higher * diemensions. * * To will be an idim x 4 matrix. If "perm" contains dimensions not * present in "from", then we can simply ignore those. */ static inline TransformN * TmNProject(const TransformN *from, int *perm, TransformN *to) { static const int dflt_perm[] = { 1, 2, 3, 0 }; const int d3 = 4; /* grin */ int perm_dim, i, j, idim, odim; if (!perm) { perm = (int *)dflt_perm; } perm_dim = perm[0]; for (i = 0; i < d3; i++) { perm_dim = max(perm[i], perm_dim); } ++perm_dim; if (from == NULL) { idim = perm_dim; odim = 0; } else { idim = from->idim; odim = from->odim; } if (to == NULL) { to = TmNCreate(max(perm_dim, idim), d3, NULL); } else { to->idim = max(perm_dim, idim); to->odim = d3; to->a = OOGLRenewNE(HPtNCoord, to->a, to->idim*d3, "renew TransformN"); memset(to->a, 0, perm_dim*d3*sizeof(HPtNCoord)); } for (j = 0; j < d3; j++) { if (perm[j] < odim) { for (i = 0; i < idim; i++) { to->a[i*d3+j] = from->a[i*odim+perm[j]]; } } else { to->a[perm[j]*d3+j] = 1.0; } } return to; } /* Return dimensions of a TransformN. Value is first dimension. */ /* idim and/or odim may be NULL, in which case they're not returned */ static inline int TmNGetSize(const TransformN *T, int *idim, int *odim) { if ( T == NULL) return 0; if (idim) *idim = T->idim; if (odim) *odim = T->odim; return T->idim; } static inline void TmNPrint(FILE *f, const TransformN *T) { int i, j; int idim = T->idim, odim = T->odim; if (f == NULL) { return; } fprintf(f, "ntransform { %d %d\n", idim, odim); for(i = 0; i < idim; i++) { for(j = 0; j < odim; j++) { fprintf(f, "%10.7f ", T->a[i*odim+j]); } fprintf(f, "\n"); } fprintf(f, "}\n"); } static inline TransformN * TmNRead(IOBFILE *f, int binary) { HPtNCoord *a; int got, n, brack = 0; int dim[2]; iobfexpecttoken(f, "ntransform"); if (iobfnextc(f, 0) == '{') brack = iobfgetc(f); if (iobfgetni(f, 2, dim, binary) < 2 || dim[0] <= 0 || dim[1] <= 0) { OOGLSyntax(f, "Expected dimensions of N-D transform"); return NULL; } n = dim[0]*dim[1]; a = OOGLNewNE(HPtNCoord, n, "new TransformN data"); got = iobfgetnf(f, n, a, binary); if (got < n) { OOGLSyntax(f, "N-D transform: error reading %d'th of %d values.", got, n); OOGLFree(a); return NULL; } if (brack) iobfexpecttoken(f, "}"); return TmNCreate(dim[0], dim[1], a); } #ifdef _gv_tmn_max_ # undef max # undef _gv_tmn_max_ #endif #ifdef _gv_tmn_min_ # undef min # undef _gv_tmn_min_ #endif #endif /* _GV_TRANSFORMN_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geometry/transformn/tmNpolardecomp.c0000644000175000001440000000521610516705632021006 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include "transformn.h" /* Compute the polar decomposition of a NxN matrix by means of a fast * Newton's iteration: * * A. A. DUBRULLE. AN OPTIMUM ITERATION FOR THE MATRIX POLAR DECOMPOSITION. * Electronic Transactions on Numerical Analysis, Volume 8, 1999, pp. 21-25, * Kent State University. * * Actually, we just compute the ortogonal factor Q, for any square * matrix A we have A=SQ with S symmetric pos. semi-definite and Q an * orthogonal matrix. Q is unique (up to renumbering of basis vectors) * if S is spd. * * We leave the translation and homogeneous part as is, that is * axpbyNxN() only copies the lower NxN square. */ #define EPS 1e-8 static inline HPtNCoord frob_norm(TransformN *A) { int i, j; HPtNCoord res = 0.0; int idim = A->idim, odim = A->odim; for (i = 1; i < idim; i++) { for (j = 1; j < odim; j++) { res += A->a[i*odim+j]* A->a[i*odim+j]; } } return sqrt(res); } /* a X + b Y^t */ static inline void axpbytNxN(HPtNCoord a, TransformN *x, HPtNCoord b, TransformN *y, TransformN *res) { int i, j; int dim = x->idim; for (i = 1; i < dim; i++) { for (j = 1; j < dim; j++) { res->a[i*dim+j] = a * x->a[i*dim+j] + b * y->a[j*dim+i]; } } } TransformN *TmNPolarDecomp(const TransformN *A, TransformN *Q) { HPtNCoord limit, g, f, pf; TransformN *a; Q = TmNCopy(A, Q); limit = (1.0+EPS)*sqrt((float)(A->odim-1)); a = TmNInvert(Q, NULL); g = sqrt(frob_norm(a)/frob_norm(Q)); axpbytNxN(0.5*g, Q, 0.5/g, a, Q); f = frob_norm(Q); pf = 1e8; while (f > limit && f < pf) { pf = f; TmNInvert(Q, a); g = sqrt(frob_norm(a) / f); axpbytNxN(0.5*g, Q, 0.5/g, a, Q); f = frob_norm(Q); } TmNDelete(a); return Q; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geometry/transformn/Headers0000644000175000001440000000001507730236566017155 00000000000000transformn.h geomview-1.9.4/src/lib/geometry/ntransobj/0000777000175000001440000000000010665240670015546 500000000000000geomview-1.9.4/src/lib/geometry/ntransobj/ntransobj.c0000644000175000001440000001252410606540144017624 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "transformn.h" #include "ntransobj.h" #include "handleP.h" #include "freelist.h" DEF_FREELISTHEAD(TransformN); DEF_FREELISTHEAD(HPointN); /* * Operations on NTransObj objects. */ void NTransPosition(TransformN *ntobj, TransformN *T) /* Get transform into T */ { TmNCopy(ntobj, T); } void NTransTransformTo(TransformN *ntobj, TransformN *T) /* Set transform from T */ { TmNCopy(T, ntobj); } void NTransDelete(TransformN *ntobj) { if (ntobj == NULL) { return; } if (ntobj->magic != TMNMAGIC) { OOGLWarn("Internal warning: " "NTransDelete'ing non-TransformN %x (%x != %x)", ntobj, ntobj->magic, TMNMAGIC); return; } if (ntobj != NULL && RefDecr((Ref *)ntobj) <= 0) { TmNDelete(REFGET(TransformN, ntobj)); } } TransformN * NTransCreate(TransformN *T) { TransformN *ntobj; if (T) { ntobj = TmNCopy(T, NULL); } else { ntobj = TmNCreate(0, 0, NULL); } return ntobj; } /* * Communications */ HandleOps NTransOps = { "ntrans", (int ((*)()))NTransStreamIn, (int ((*)()))NTransStreamOut, (void ((*)()))NTransDelete, NULL, NULL }; int NTransStreamIn(Pool *p, Handle **hp, TransformN **ntobjp) { Handle *h = NULL; Handle *hname = NULL; TransformN *ntobj = NULL; TransformN *tmp = NULL; char *w, *raww; int c; int more = 0; int brack = 0; IOBFILE *inf; if (p == NULL || (inf = PoolInputFile(p)) == NULL) return 0; do { more = 0; switch(c = iobfnextc(inf, 0)) { case '{': brack++; iobfgetc(inf); break; case '}': if (brack--) iobfgetc(inf); break; case 'n': if (iobfexpectstr(inf, "ntransform")) return 0; more = 1; break; case 'd': if (iobfexpectstr(inf, "define")) { return 0; } hname = HandleCreateGlobal(iobftoken(inf, 0), &NTransOps); break; case '<': case ':': case '@': iobfgetc(inf); w = iobfdelimtok("{}()", inf, 0); if (c == '<' && (h = HandleByName(w, &NTransOps)) == NULL) { w = findfile(PoolName(p), raww = w); if (w == NULL) { OOGLSyntax(inf, "Reading ntransform from \"%s\": " "can't find file \"%s\"", PoolName(p), raww); } } h = HandleReferringTo(c, w, &NTransOps, NULL); if (h) { ntobj = (TransformN *)HandleObject(h); /* Increment the ref. count. This way we can call * HandleDelete() and NTransDelete() independently. */ RefIncr((Ref*)ntobj); } break; default: /* * Anything else should be the ntransform data. */ if (ntobj != NULL) { tmp = ntobj; } ntobj = TmNRead(inf, 0); if (ntobj == NULL) { OOGLSyntax(inf, "Reading ntransform from \"%s\": " "can't read ntransform data", PoolName(p)); } else if (tmp) { TmNCopy(ntobj, tmp); TmNDelete(ntobj); ntobj = tmp; } break; } } while (brack || more); if (hname != NULL) { if (ntobj != NULL) { HandleSetObject(hname, (Ref *)ntobj); } if (h) { /* HandleReferringTo() has passed the ownership to use, so * delete h because we do not need it anymore. */ HandleDelete(h); } h = hname; } /* Pass the ownership of h and ntobj to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (ntobjp != NULL) { if (*ntobjp) { NTransDelete(*ntobjp); } *ntobjp = ntobj; } else if(ntobj) { NTransDelete(ntobj); } return (h != NULL || ntobj != NULL); } int NTransStreamOut(Pool *p, Handle *h, TransformN *T) { int i, j; int idim = T->idim, odim = T->odim; FILE *outf; if ((outf = PoolOutputFile(p)) == NULL) { return 0; } fprintf(outf, "ntransform {\n"); PoolIncLevel(p, 1); if (PoolStreamOutHandle(p, h, T != NULL)) { PoolFPrint(p, outf, "%d %d\n", idim, odim); for(i = 0; i < idim; i++) { PoolFPrint(p, outf, ""); for(j = 0; j < odim; j++) { fprintf(outf, "%10.7f ", T->a[i*odim+j]); } fprintf(outf, "\n"); } } PoolIncLevel(p, -1); PoolFPrint(p, outf, "}\n"); return !ferror(outf); } /* * Local Variables: *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/geometry/ntransobj/ntransobj.h0000644000175000001440000000243310572372176017641 00000000000000/* Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef _NTRANSOBJ_H_ #define _NTRANSOBJ_H_ #ifndef _HANDLE_ # include "handle.h" #endif /*_HANDLE_*/ extern void NTransPosition(TransformN *tobj, TransformN *Tinto); extern void NTransTransformTo(TransformN *tobj, TransformN *Tfrom); extern void NTransDelete(TransformN *ntobj); extern int NTransStreamIn(Pool *, Handle **, TransformN **); extern int NTransStreamOut(Pool *, Handle *, TransformN *); extern TransformN *NTransCreate(TransformN *); #endif /*_TRANSOBJ_*/ geomview-1.9.4/src/lib/geometry/ntransobj/Makefile.am0000644000175000001440000000023110514540760017506 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libntransobj.la libntransobj_la_SOURCES = \ ntransobj.c \ ntransobj.h geomview-1.9.4/src/lib/geometry/ntransobj/Makefile.in0000644000175000001440000003542010665240501017524 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/ntransobj DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libntransobj_la_LIBADD = am_libntransobj_la_OBJECTS = ntransobj.lo libntransobj_la_OBJECTS = $(am_libntransobj_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libntransobj_la_SOURCES) DIST_SOURCES = $(libntransobj_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libntransobj.la libntransobj_la_SOURCES = \ ntransobj.c \ ntransobj.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/ntransobj/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/ntransobj/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libntransobj.la: $(libntransobj_la_OBJECTS) $(libntransobj_la_DEPENDENCIES) $(LINK) $(libntransobj_la_OBJECTS) $(libntransobj_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntransobj.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geometry/ntransobj/Headers0000644000175000001440000000001410514540760016747 00000000000000ntransobj.h geomview-1.9.4/src/lib/geometry/cmodel/0000777000175000001440000000000010665240667015017 500000000000000geomview-1.9.4/src/lib/geometry/cmodel/cmodelP.h0000644000175000001440000000674110455701001016454 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef PMH #define PMH #include "point3.h" #include "hpoint3.h" #include "polylistP.h" #include "color.h" #include "vectP.h" #include "quadP.h" #include "cmodel.h" /* decls for cmodel_data.c */ struct vertex { Vertex V, *vxp; int visible; HPoint3 polar; struct vertex *next; }; #undef small /* Blast Windows. How can they co-opt "small"? */ struct edge { struct vertex *v1, *v2; HPoint3 polar; int small, /* says the edge is too short to consider splitting */ visible, /* says we should display this edge */ hascolor, split; /* says we just split this edge, this is one half ...*/ struct edge *other_half, /* .. and the other half is here */ *next; }; struct triangle { int small, /* says the triangle has 3 short edges */ o1, o2, o3; struct edge *e1, *e2, *e3; Poly *orig_poly; Vertex *v[3]; /* only used at the end */ struct triangle *next; }; #define edgeBLOCKSIZE 120 void initialize_edges(void); void clear_all_edges(void); struct edge *new_edge(struct vertex *v1, struct vertex *v2, HPoint3 *polar); struct edge *first_edge(void); struct edge *get_last_edge(void); #define triangleBLOCKSIZE 80 int triangle_count(void); void initialize_triangles(void); void clear_all_triangles(void); struct triangle *new_triangle(struct edge *e1, struct edge *e2, struct edge *e3, int o1, int o2, int o3, Poly *p); struct triangle *first_triangle(void); struct triangle *get_last_triangle(void); #define vertexBLOCKSIZE 40 void initialize_vertexs(void); void clear_all_vertexs(void); int vertex_count(void); struct vertex *new_vertex(Point3 *pt, struct vertex *v1, struct vertex *v2); struct vertex *simple_new_vertex(HPoint3 *pt, ColorA *col); struct vertex *first_vertex(void); struct vertex *get_last_vertex(void); /* decls for cm_geometry.c */ /* any function of type "splitfunc" takes an edge, decides whether to split it or not and then returns either a pointer to the midpoint or a null pointer. */ typedef struct vertex *(*splitfunc)(struct edge *e, double cosmaxbend); void projective_to_conformal(int curv, HPoint3 *proj, Transform T, Point3 *poinc); void projective_vector_to_conformal(int curv, HPoint3 *pt, Point3 *v, Transform T, Point3 *ppt, Point3 *pv); struct vertex * edge_split(struct edge *e, double cosmaxbend); void edge_polar_point(int curv, const Point3 *a, const Point3 *b, HPoint3 *p); void triangle_polar_point(int curv, const Point3 *a, const Point3 *b, const Point3 *c, HPoint3 *p); int vertex_count(void); int triangle_count(void); #define FALSE 0 #define TRUE 1 #endif geomview-1.9.4/src/lib/geometry/cmodel/cmodel.c0000644000175000001440000004063610622374326016344 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* conformal model graphics for geomview */ #include #include "cmodelP.h" #include "mgP.h" static int cm_show_subdivision = 0; static int cm_maxrefine = 6; /*static double cm_cosmaxbend = .95;*/ static double cm_cosmaxbend = .98; static int alldone = TRUE; static int curv; struct vertex *edge_start(struct edge *e, int ori); void split_triangle(struct triangle *t); void split_edge(struct edge *e, splitfunc split); void refine_once(splitfunc split); void refine(); struct edge *new_edge_p(struct vertex *v1, struct vertex *v2); void make_new_quad(Transform T, HPoint3 *p, ColorA *c); void make_new_triangle(HPoint3 *a, HPoint3 *b, HPoint3 *c, ColorA *col, Transform T, Poly *p, int allvisible); void set_cm_refine(double cm_cmb, int cm_mr, int cm_ss) { /* These tests allow us to call this routine in a way that sets only some of the values; parameters with out-of-range values are not set. */ if (cm_cmb >= -1 && cm_cmb <=1) cm_cosmaxbend = cm_cmb; if (cm_mr >=0) cm_maxrefine = cm_mr; if (cm_mr >=0) cm_show_subdivision = cm_ss; return; } void cmodel_clear(int space) { static int initialized = FALSE; if (initialized) { clear_all_vertexs(); clear_all_edges(); clear_all_triangles(); } else { initialize_vertexs(); initialize_edges(); initialize_triangles(); initialized = TRUE; } if (space & TM_SPHERICAL) curv = 1; else if (space & TM_HYPERBOLIC) curv = -1; else if (space & TM_EUCLIDEAN) curv = 0; /* else error */ } void cm_read_quad(Quad *q) { int i = q->maxquad; QuadP *qp = q->p; QuadC *qc = q->c; Transform T; mggettransform(T); if (q->geomflags & QUAD_C) { while (i-- > 0) make_new_quad(T, (HPoint3 *)qp++, (ColorA *)qc++); } else { while (i-- > 0) make_new_quad(T, (HPoint3 *)qp++, NULL); } return; } void make_new_quad(Transform T, HPoint3 *p, ColorA *c) { HPoint3 tp, polar; int i; struct vertex *v[4]; struct edge *e1, *e2, *e3, *e4, *e5; int apflags = _mgc->astk->ap.flag; if ((apflags & (APF_EDGEDRAW | APF_FACEDRAW | APF_NORMALDRAW)) == 0) return; /* make 4 new vertices */ tp.w = 1.; if (c) { /* vertex colors defined */ for (i = 0; i < 4; i++) { projective_to_conformal(curv, p++, T, (Point3 *)(void *)&tp); v[i] = simple_new_vertex(&tp, c++); } } else { /* no vertex colors so get color from appearance stack */ c = (ColorA*)&_mgc->astk->ap.mat->diffuse; for (i = 0; i < 4; i++) { projective_to_conformal(curv, p++, T, (Point3 *)(void *)&tp); v[i] = simple_new_vertex(&tp, c); } } triangle_polar_point(curv, (Point3 *)(void *)&v[0]->V.pt, (Point3 *)(void *)&v[1]->V.pt, (Point3 *)(void *)&v[2]->V.pt, &polar); for (i=0; i<4; i++) v[i]->polar = polar; e1 = new_edge_p(v[0], v[1]); e2 = new_edge_p(v[1], v[2]); e4 = new_edge_p(v[2], v[3]); e5 = new_edge_p(v[3], v[0]); if (apflags & (APF_FACEDRAW|APF_NORMALDRAW)) { /* make two triangles and five edges */ new_triangle(e1, e2, e3 = new_edge_p(v[2], v[0]), TRUE, TRUE, TRUE, NULL); new_triangle(e3, e4, e5, FALSE, TRUE, TRUE, NULL); } /* set the four original edges visible if required */ if (apflags & APF_EDGEDRAW) { e1->visible = TRUE; e2->visible = TRUE; e4->visible = TRUE; e5->visible = TRUE; } return; } void cm_draw_mesh(Mesh *m) { HPoint3 *pt, *newpt, *ppt; Point3 *n, *newn, *pn; ColorA *c = NULL, *newc = NULL, *pc = NULL; mgshadefunc shader = _mgc->astk->shader; int i, npt; Transform T; mggettransform(T); mgpushtransform(); mgidentity(); npt = m->nu * m->nv; pt = m->p; n = m->n; newpt = ppt = OOGLNewNE(HPoint3, npt, "CModel mesh points"); newn = pn = OOGLNewNE(Point3, npt, "CModel mesh normals"); if (_mgc->astk->flags & MGASTK_SHADER) { newc = pc = OOGLNewNE(ColorA, npt, "CModel mesh color"); c = m->c ? m->c : (ColorA *)&_mgc->astk->mat.diffuse; } for (i = 0; i < npt; ++i) { projective_vector_to_conformal(curv, pt, n, T, (Point3 *)ppt, pn); ppt->w = 1.; if (newc) { (*shader)(1, ppt, pn, c, pc); pc++; if (m->c) c++; } ++pt; ++n; ++ppt; ++pn; } mgmesh(MESH_MGWRAP(m->geomflags), m->nu, m->nv, newpt, newn, NULL, newc ? newc : m->c, m->geomflags); OOGLFree(newpt); OOGLFree(newn); if (newc) { OOGLFree(newc); } mgpoptransform(); } void cm_read_vect(Vect *v) { int i, nv, nc; HPoint3 pt, *p = v->p; ColorA *c = v->c, *col = (ColorA *)(void *)&_mgc->astk->mat.edgecolor; struct vertex *v0, *v1, *v2; struct edge *e; Transform T; mggettransform(T); pt.w = 1.; for (i = 0; i < v->nvec; i++) { nv = abs(v->vnvert[i]); nc = v->vncolor[i]; /* get position, color and make a new vertex */ projective_to_conformal(curv, p++, T, (Point3 *)(void *)&pt); if (nc > 0) {nc--; col = c++;} v0 = v1 = simple_new_vertex(&pt, col); if (nv == 1) { /* point, not polyline */ v0->visible = TRUE; continue; } do { /* copy polyline */ /* get position, color and make a new vertex */ projective_to_conformal(curv, p++, T, (Point3 *)(void *)&pt); if (nc > 0) {nc--; col = c++;} v2 = simple_new_vertex(&pt, col); e = new_edge_p(v1, v2); e->visible = e->hascolor = TRUE; v1 = v2; } while(--nv > 1); if (v->vnvert[i] < 0) { /* if polyline is closed */ e = new_edge_p(v2, v0); e->visible = e->hascolor = TRUE; } } } void cm_read_polylist(PolyList *polylist) { int i, j, nv, n, vertcolors, facecolors; HPoint3 center; ColorA *col; Transform T; Poly *p; mggettransform(T); p = polylist->p; n = polylist->n_polys; vertcolors = (polylist->geomflags & (PL_HASVCOL|PL_HASPCOL)) == PL_HASVCOL; facecolors = (polylist->geomflags & PL_HASPCOL); col = (ColorA*)&_mgc->astk->mat.diffuse; for (i = 0; i < n; i++) { if (facecolors) col = &p->pcol; nv = p->n_vertices; if (nv == 3) { make_new_triangle(&p->v[0]->pt, &p->v[1]->pt, &p->v[2]->pt, col, T, p, TRUE); } else { center.x = center.y = center.z = center.w = 0; for (j = 0; j < nv; j++) HPt3Add(¢er, &p->v[j]->pt, ¢er); for (j = 1; j < nv; j++) make_new_triangle(&p->v[j-1]->pt, &p->v[j]->pt, ¢er, vertcolors ? &p->v[j]->vcol : col, T, p, FALSE); make_new_triangle(&p->v[nv-1]->pt, &p->v[0]->pt, ¢er, vertcolors ? &p->v[0]->vcol : col, T, p, FALSE); } ++p; } } void make_new_triangle(HPoint3 *a, HPoint3 *b, HPoint3 *c, ColorA *col, Transform T, Poly *p, int allvisible) { struct vertex v, *v1, *v2, *v3; Point3 ap, bp, cp; struct edge *e1, *e2, *e3; int apflags = _mgc->astk->ap.flag; projective_to_conformal(curv, a, T, &ap); projective_to_conformal(curv, b, T, &bp); projective_to_conformal(curv, c, T, &cp); /*fprintf(stderr,"Making tri %.1f %.1f %.1f, %.1f %.1f %.1f, %.1f %.1f %.1f\n",ap.x,ap.y,ap.z,bp.x,bp.y,bp.z,cp.x,cp.y,cp.z);*/ /* convert to the conformal model */ /* make a model vertex */ triangle_polar_point(curv,&ap, &bp, &cp, &v.polar); v.V.vcol = *col; v1 = new_vertex(&ap, &v, NULL); v2 = new_vertex(&bp, &v, NULL); v3 = new_vertex(&cp, &v, NULL); e1 = new_edge_p(v1, v2); e2 = new_edge_p(v2, v3); e3 = new_edge_p(v3, v1); if (apflags & (APF_FACEDRAW|APF_NORMALDRAW)) new_triangle(e1, e2, e3, TRUE, TRUE, TRUE, p); if (apflags & APF_EDGEDRAW) { e1->visible = TRUE; if (allvisible) { e2->visible = TRUE; e3->visible = TRUE; } } return; } struct edge *new_edge_p(struct vertex *v1, struct vertex *v2) { HPoint3 polar; edge_polar_point(curv,(Point3 *)(void *)&v1->V.pt,(Point3 *)(void *)&v2->V.pt, &polar); return new_edge(v1,v2,&polar); } void set_normal(HPoint3 *point, HPoint3 *polar, Point3 *normal) { Point3 t; if (polar == NULL) return; Pt3Mul(polar->w, (Point3 *)point, &t); Pt3Sub((Point3 *)polar, &t, normal); /*fprintf(stderr,"sn gives %.2f %.2f %.2f (%.2f) for polar %.2f %.2f %.2f %.2f\n",normal->x,normal->y,normal->z,sqrt(Pt3Dot(normal,normal)),polar->x,polar->y,polar->z,polar->w);*/ Pt3Unit(normal); } void cmodel_draw(int plflags) { struct triangle *tp; struct edge *ep; struct vertex *vp; ColorA col[2]; HPoint3 pts[2]; Vertex *Vertp = NULL, *verts = NULL; Poly *Polyp = NULL, *polys = NULL; int npolys, keepflags, nverts, useshader, shading; mgshadefunc shader; refine(); /* set the transform to the identity before displaying anything since Poincare model data is already transformed */ mgpushtransform(); mgidentity(); if ((npolys = triangle_count()) != 0) { polys = Polyp = OOGLNewNE(Poly, npolys, "CModel Polys"); } if ((nverts = vertex_count()) != 0) { verts = Vertp = OOGLNewNE(Vertex, nverts, "CModel Vertices"); } shading = _mgc->astk->ap.shading; useshader = _mgc->astk->flags & MGASTK_SHADER; shader = _mgc->astk->shader; vp = first_vertex(); while (vp != NULL) { Vertp->pt = vp->V.pt; /* visible vertices must be displayed invisible vertices are part of faces so we must compute normals */ if (vp->visible) { mgpolyline(1, &Vertp->pt, 1, &vp->V.vcol, 0); } else if (IS_SMOOTH(shading)) { set_normal(&vp->V.pt, &vp->polar, &Vertp->vn); if (useshader) (*shader)(1, &Vertp->pt, &Vertp->vn, &vp->V.vcol, &Vertp->vcol); else Vertp->vcol = vp->V.vcol; } vp->vxp = Vertp++; vp = vp->next; } ep = first_edge(); while (ep != NULL) { /* draw visible edges */ if (ep->visible) { pts[0] = ep->v1->V.pt; pts[1] = ep->v2->V.pt; if (ep->hascolor) { col[0] = ep->v1->V.vcol; col[1] = ep->v2->V.vcol; mgpolyline(2, pts, 2, col, 0); } else *(Color *)(void *)&col[0] = _mgc->astk->ap.mat->edgecolor; col[0].a = 1; mgpolyline(2, pts, 1, &col[0], 0); } ep = ep->next; } tp = first_triangle(); while (tp != NULL) { tp->v[0] = edge_start(tp->e1, tp->o1)->vxp; tp->v[1] = edge_start(tp->e2, tp->o2)->vxp; tp->v[2] = edge_start(tp->e3, tp->o3)->vxp; Polyp->flags = plflags & (PL_HASPCOL|PL_HASVCOL); Polyp->n_vertices = 3; Polyp->v = tp->v; /* computation is not exact here: assume triangle is small so center and vertex are very close together */ if (IS_SHADED(shading)) { set_normal(&tp->e1->v1->V.pt, &tp->e1->v1->polar, (Point3 *)&Polyp->pn); Polyp->flags |= PL_HASPN; } if (IS_SMOOTH(shading)) { Polyp->flags |= PL_HASVN; } if (useshader) { (*shader)(1, &tp->v[0]->pt, (Point3 *)&Polyp->pn, &tp->e1->v1->V.vcol, &Polyp->pcol); } else { Polyp->pcol = tp->e1->v1->V.vcol; } Polyp++; tp = tp->next; } if (npolys) { keepflags = _mgc->astk->ap.flag; if (!cm_show_subdivision) _mgc->astk->ap.flag &= ~APF_EDGEDRAW; plflags = (plflags &~ (PL_HASPCOL|PL_HASVCOL)) | (IS_SMOOTH(shading) ? PL_HASVCOL : PL_HASPCOL); mgpolylist(npolys, polys, nverts, verts, plflags); _mgc->astk->ap.flag = keepflags; } /* restore the current transform */ mgpoptransform(); if (polys) { OOGLFree(polys); } if (verts) { OOGLFree(verts); } } void refine() { int maxsteps = cm_maxrefine; alldone = FALSE; /* should do edges at infinity here first */ while (!alldone && maxsteps-- > 0) { alldone = TRUE; refine_once(edge_split); } return; } void refine_once(splitfunc split) { struct edge *ep = first_edge(), *le = get_last_edge(); struct triangle *tp = first_triangle(), *lt = get_last_triangle(); /* split all long edges */ while (ep != NULL) { split_edge(ep, split); if (ep == le) break; ep = ep->next; } if (alldone) return; /* now split all triangles that have had edges split */ while (tp != NULL) { split_triangle(tp); if (tp == lt) break; tp = tp->next; } return; } /* decides whether to split an edge and if so sets the split flag, creates a new edge and drops it into the structure */ void split_edge(struct edge *e, splitfunc split) { struct vertex *mid; if (e->small) return; mid = (*split)(e, cm_cosmaxbend); if (mid == NULL) { e->split = FALSE; e->small = TRUE; return; } e->split = TRUE; e->other_half = new_edge(mid, e->v2, &e->polar); e->other_half->visible = e->visible; e->other_half->hascolor = e->hascolor; e->v2 = mid; alldone = FALSE; return; } struct vertex *edge_start(struct edge *e, int ori) { return ori ? e->v1 : e->v2; } struct vertex *edge_mid(struct edge *e) { return e->v2; } struct edge *first_half(struct edge *e, int ori) { return ori ? e : e->other_half; } void split_triangle_at_one_edge(struct edge **e1, struct edge **e2, struct edge **e3, int *o1, int *o2, int *o3, Poly *orig) { struct edge *ne; ne = new_edge_p(edge_mid(*e1), edge_start(*e3, *o3)); new_triangle(first_half(*e1, !*o1), *e2, ne, *o1, *o2, FALSE, orig); *e1 = first_half(*e1, *o1); *e2 = ne; *o2 = TRUE; return; } void split_triangle_at_two_edges(struct edge **e1, struct edge **e2, struct edge **e3, int *o1, int *o2, int *o3, Poly *orig) { struct edge *ne1, *ne2; ne1 = new_edge_p(edge_mid(*e1), edge_start(*e3, *o3)); ne2 = new_edge_p(edge_mid(*e1), edge_mid(*e2)); new_triangle(first_half(*e1, !*o1), first_half(*e2, *o2), ne2, *o1, *o2, FALSE, orig); new_triangle(first_half(*e2, !*o2), ne1, ne2, *o2, FALSE, TRUE, orig); *e1 = first_half(*e1, *o1); *e2 = ne1; *o2 = TRUE; return; } void split_triangle_at_three_edges(struct edge **e1, struct edge **e2, struct edge **e3, int *o1, int *o2, int *o3, Poly *orig) { struct edge *ne1, *ne2, *ne3; ne1 = new_edge_p(edge_mid(*e1), edge_mid(*e2)); ne2 = new_edge_p(edge_mid(*e2), edge_mid(*e3)); ne3 = new_edge_p(edge_mid(*e3), edge_mid(*e1)); new_triangle(first_half(*e1, !*o1), first_half(*e2, *o2), ne1, *o1, *o2, FALSE, orig); new_triangle(first_half(*e2, !*o2), first_half(*e3, *o3), ne2, *o2, *o3, FALSE, orig); new_triangle(ne1, ne2, ne3, TRUE, TRUE, TRUE, orig); *e1 = first_half(*e1, *o1); *e2 = ne3; *o2 = FALSE; *e3 = first_half(*e3, !*o3); return; } void split_triangle(struct triangle *t) { int magic; Poly *orig; if (t->small) return; orig = t->orig_poly; magic = t->e1->split + 2 * t->e2->split + 4 * t->e3->split; switch (magic) { case 0: t->small = TRUE; break; case 1: split_triangle_at_one_edge(&t->e1, &t->e2, &t->e3, &t->o1, &t->o2, &t->o3, orig); break; case 2: split_triangle_at_one_edge(&t->e2, &t->e3, &t->e1, &t->o2, &t->o3, &t->o1, orig); break; case 4: split_triangle_at_one_edge(&t->e3, &t->e1, &t->e2, &t->o3, &t->o1, &t->o2, orig); break; case 3: split_triangle_at_two_edges(&t->e1, &t->e2, &t->e3, &t->o1, &t->o2, &t->o3, orig); break; case 6: split_triangle_at_two_edges(&t->e2, &t->e3, &t->e1, &t->o2, &t->o3, &t->o1, orig); break; case 5: split_triangle_at_two_edges(&t->e3, &t->e1, &t->e2, &t->o3, &t->o1, &t->o2, orig); break; case 7: split_triangle_at_three_edges(&t->e1, &t->e2, &t->e3, &t->o1, &t->o2, &t->o3, orig); break; default: break; } return; } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geometry/cmodel/cmodel.h0000644000175000001440000000262110455701001016325 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * cmodel.h: declarations for functions dealing with * conformal model of hyperbolic or spherical space */ #ifndef CMODEL_H #define CMODEL_H #include "polylistP.h" #include "vectP.h" #include "meshP.h" #include "quadP.h" void set_cm_refine(double cosmaxbend, int maxrefine, int show_subdivision); void cmodel_clear(int space); void cm_read_polylist(PolyList *polylist); void cm_read_vect(Vect *v); void cm_read_quad(Quad *q); void cmodel_draw(int plflags); void cm_draw_mesh(Mesh *m); #endif /* CMODEL_H */ geomview-1.9.4/src/lib/geometry/cmodel/Makefile.am0000644000175000001440000000025010455665331016760 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcmodel.la libcmodel_la_SOURCES = cm_geometry.c cmodel.c cmodel_data.c cmodel.h cmodelP.h geomview-1.9.4/src/lib/geometry/cmodel/Makefile.in0000644000175000001440000003564410665240501016777 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/cmodel DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcmodel_la_LIBADD = am_libcmodel_la_OBJECTS = cm_geometry.lo cmodel.lo cmodel_data.lo libcmodel_la_OBJECTS = $(am_libcmodel_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libcmodel_la_SOURCES) DIST_SOURCES = $(libcmodel_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcmodel.la libcmodel_la_SOURCES = cm_geometry.c cmodel.c cmodel_data.c cmodel.h cmodelP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/cmodel/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/cmodel/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libcmodel.la: $(libcmodel_la_OBJECTS) $(libcmodel_la_DEPENDENCIES) $(LINK) $(libcmodel_la_OBJECTS) $(libcmodel_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cm_geometry.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmodel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmodel_data.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geometry/cmodel/cm_geometry.c0000644000175000001440000001200710455701001017366 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* do the actual geometric computation parts of the "cmodel" program */ #include #include "cmodelP.h" void projective_to_conformal(int curv, HPoint3 *proj, Transform T, Point3 *conf) { double norm, scale; HPoint3 pt; HPt3Transform(T, proj, &pt); norm = pt.x*pt.x + pt.y*pt.y + pt.z*pt.z; if (curv) { norm = curv*norm + pt.w*pt.w; norm = (norm < 0)? 0 : sqrt(norm); scale = pt.w-curv*norm; } else scale = -norm/pt.w; Pt3Mul(1 / scale, (Point3 *)(void *)&pt, conf); return; } void TgtTransform(Transform T, HPoint3 *p, Point3 *v, HPoint3 *tp, Point3 *tv) { HPoint3 hv, thv; Pt3Copy(v, (Point3 *)(void *)&hv); hv.w = 0; HPt3Transform(T, p, tp); HPt3Transform(T, &hv, &thv); Pt3Comb(1/tp->w, (Point3 *)(void *)&thv, -thv.w/tp->w/tp->w, (Point3 *)(void *)tp, tv); return; } /* map a tangent vector from Projective model to Conformal model */ void projective_vector_to_conformal(int curv, HPoint3 *pt, Point3 *v, Transform T, Point3 *ppt, Point3 *pv) { HPoint3 tp; Point3 tv; double norm,scale; /* transform point */ TgtTransform(T, pt, v, &tp, &tv); norm = tp.x*tp.x + tp.y*tp.y + tp.z*tp.z; if (curv) { norm = curv*norm + tp.w*tp.w; norm = (norm < 0)? 0 : sqrt(norm); scale = tp.w-curv*norm; } else scale = -norm/tp.w; Pt3Mul(1 / scale, (Point3 *)(void *)&tp, ppt); if (curv) Pt3Comb(norm/scale, &tv, Pt3Dot(ppt, &tv), ppt, pv); else Pt3Comb(tp.w/scale, &tv, 2*Pt3Dot(ppt, &tv), ppt, pv); Pt3Unit(pv); return; } /* given three vertices of a triangle in the conformal model this computes the center of the sphere on which the triangle lies. */ void triangle_polar_point(int curv, const Point3 *a, const Point3 *b, const Point3 *c, HPoint3 *p) { Point3 ab, bc, ca; Pt3Cross(a, b, &ab); Pt3Cross(b, c, &bc); Pt3Cross(c, a, &ca); p->w = 2*Pt3Dot(a, &bc); Pt3Mul(Pt3Dot(a, a) - curv, &bc, &bc); Pt3Mul(Pt3Dot(b, b) - curv, &ca, &ca); Pt3Mul(Pt3Dot(c, c) - curv, &ab, &ab); Pt3Add(&ab, &bc, (Point3 *)p); Pt3Add(&ca, (Point3 *)p, (Point3 *)p); /*fprintf(stderr,"In triangle_polar got %f %f %f %f\n",p->x,p->y,p->z,p->w);*/ return; } /* given two points on a geodesic in the conformal model this computes the centre of the euclidean circle formed by the geodesic */ void edge_polar_point(int curv, const Point3 *a, const Point3 *b, HPoint3 *p) { double aa, ab, bb, ca, cb; aa = Pt3Dot(a, a); ab = Pt3Dot(a, b); bb = Pt3Dot(b, b); ca = (aa-ab)*bb + curv*(ab - bb); cb = (bb-ab)*aa + curv*(ab - aa); Pt3Comb(ca, a, cb, b, (Point3 *)p); p->w = 2 * (aa * bb - ab * ab); return; } struct vertex *edge_split(struct edge *e, double cosmaxbend) { double cosbend, w; Point3 m, mp, x, y, *a, *b, p; double aa,ab,bb,ma,mb; a = (Point3 *)(void *)&e->v1->V.pt; b = (Point3 *)(void *)&e->v2->V.pt; w = e->polar.w; /*fprintf(stderr,"In edge_split\n");*/ if (w < .001) return NULL; Pt3Mul(1./w, (Point3 *)(void *)&e->polar, &p); Pt3Sub(a, &p, &x); Pt3Sub(b, &p, &y); cosbend = Pt3Dot(&x,&y)/sqrt(Pt3Dot(&x,&x) * Pt3Dot(&y,&y)); if (cosmaxbend < cosbend) return NULL; /*fprintf(stderr,"end pts %f %f %f, %f %f %f, polar %f %f %f %f\n", a->x,a->y,a->z, b->x,b->y,b->z, e->polar.x,e->polar.y,e->polar.z,e->polar.w);*/ Pt3Add(&x, &y, &m); Pt3Mul(sqrt(Pt3Dot(&x, &x) / Pt3Dot(&m, &m)), &m, &m); Pt3Add(&p, &m, &mp); aa = Pt3Dot(a,a); ab = Pt3Dot(a,b); bb = Pt3Dot(b,b); ma = Pt3Dot(a,&mp); mb = Pt3Dot(b,&mp); if (aa*mb < ab*ma || bb*ma < ab*mb) Pt3Sub(&p,&m,&mp); /* to check we're doing the right thing we could do: ma = Pt3Dot(a,&mp); mb = Pt3Dot(b,&mp); if (aa*mb < ab*ma || bb*ma < ab*mb) fprintf(stderr,"Can't find right subdivision\n"); */ return new_vertex(&mp, e->v1, e->v2); } geomview-1.9.4/src/lib/geometry/cmodel/cmodel_data.c0000644000175000001440000001670410455701001017320 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "cmodelP.h" /* created from link_list.c */ struct vertex_block { struct vertex_block *next; struct vertex block[ vertexBLOCKSIZE ]; }; static struct vertex_block first_vertex_block, *curr_vertex_block; static struct vertex *last_vertex; static int vx_count = 0; int vertex_count() { return vx_count; } /* once off initialization at the start */ void initialize_vertexs() { curr_vertex_block = &first_vertex_block; first_vertex_block.next = NULL; last_vertex = first_vertex_block.block; first_vertex_block.block->next = NULL; vx_count = 0; return; } struct vertex *first_vertex() { return first_vertex_block.block->next; } void clear_all_vertexs() { struct vertex_block *this_block, *tmp; /* free each block */ this_block = first_vertex_block.next; while(this_block != NULL) { tmp = this_block->next; free(this_block); this_block = tmp; } initialize_vertexs(); return; } struct vertex_block *new_vertex_block() { struct vertex_block *n_block; curr_vertex_block->next = n_block = (struct vertex_block *)malloc(sizeof(struct vertex_block)); n_block->next = NULL; return curr_vertex_block = n_block; } struct vertex *new_vertex(Point3 *pt, struct vertex *v1, struct vertex *v2) { struct vertex *n_vertex; /* allocate a new vertex and link it in */ n_vertex = last_vertex + 1; if (n_vertex - curr_vertex_block->block >= vertexBLOCKSIZE) n_vertex = (new_vertex_block())->block; last_vertex->next = n_vertex; n_vertex->next = NULL; last_vertex = n_vertex; vx_count++; /* now initialize n_vertex */ Pt3Copy(pt, (Point3 *)(void *)&n_vertex->V.pt); n_vertex->V.pt.w = 1.; /* interpolate between two vertex colors */ if (v2 != NULL) { n_vertex->V.vcol.r = .5 * v1->V.vcol.r + .5 * v2->V.vcol.r; n_vertex->V.vcol.g = .5 * v1->V.vcol.g + .5 * v2->V.vcol.g; n_vertex->V.vcol.b = .5 * v1->V.vcol.b + .5 * v2->V.vcol.b; n_vertex->V.vcol.a = .5 * v1->V.vcol.a + .5 * v2->V.vcol.a; } else n_vertex->V.vcol = v1->V.vcol; n_vertex->visible = FALSE; HPt3Copy(&v1->polar, &n_vertex->polar); return n_vertex; } struct vertex *simple_new_vertex(HPoint3 *pt, ColorA *col) { struct vertex *n_vertex; /* allocate a new vertex and link it in */ n_vertex = last_vertex + 1; if (n_vertex - curr_vertex_block->block >= vertexBLOCKSIZE) n_vertex = (new_vertex_block())->block; last_vertex->next = n_vertex; n_vertex->next = NULL; last_vertex = n_vertex; vx_count++; /* now initialize n_vertex */ HPt3Copy(pt, &n_vertex->V.pt); n_vertex->V.vcol = *col; n_vertex->visible = FALSE; /* polar is not used in this case */ return n_vertex; } struct edge_block { struct edge_block *next; struct edge block[ edgeBLOCKSIZE ]; }; static struct edge_block first_edge_block, *curr_edge_block; static struct edge *last_edge; /* once off initialization at the start */ void initialize_edges() { curr_edge_block = &first_edge_block; first_edge_block.next = NULL; last_edge = first_edge_block.block; first_edge_block.block->next = NULL; return; } struct edge *first_edge() { return first_edge_block.block->next; } struct edge *get_last_edge() { return last_edge; } void clear_all_edges() { struct edge_block *this_block, *tmp; /* free each block */ this_block = first_edge_block.next; while(this_block != NULL) { tmp = this_block->next; free(this_block); this_block = tmp; } initialize_edges(); return; } struct edge_block *new_edge_block() { struct edge_block *n_block; curr_edge_block->next = n_block = (struct edge_block *)malloc(sizeof(struct edge_block)); n_block->next = NULL; return curr_edge_block = n_block; } struct edge *new_edge(struct vertex *v1, struct vertex *v2, HPoint3 *polar) { struct edge *n_edge; /* allocate a new edge and link it in */ n_edge = last_edge + 1; if (n_edge - curr_edge_block->block >= edgeBLOCKSIZE) n_edge = (new_edge_block())->block; last_edge->next = n_edge; n_edge->next = NULL; last_edge = n_edge; /* now initialize n_edge */ n_edge->v1 = v1; n_edge->v2 = v2; HPt3Copy(polar, &n_edge->polar); n_edge->small = n_edge->split = n_edge->visible = n_edge->hascolor = FALSE; n_edge->other_half = NULL; return n_edge; } /* created from link_list.c */ struct triangle_block { struct triangle_block *next; struct triangle block[ triangleBLOCKSIZE ]; }; static struct triangle_block first_triangle_block, *curr_triangle_block; static struct triangle *last_triangle; static int tri_count = 0; int triangle_count() { return tri_count; } /* once off initialization at the start */ void initialize_triangles() { curr_triangle_block = &first_triangle_block; first_triangle_block.next = NULL; last_triangle = first_triangle_block.block; first_triangle_block.block->next = NULL; tri_count = 0; return; } struct triangle *first_triangle() { return first_triangle_block.block->next; } struct triangle *get_last_triangle() { return last_triangle; } void clear_all_triangles() { struct triangle_block *this_block, *tmp; /* free each block */ this_block = first_triangle_block.next; while(this_block != NULL) { tmp = this_block->next; free(this_block); this_block = tmp; } initialize_triangles(); return; } struct triangle_block *new_triangle_block() { struct triangle_block *n_block; curr_triangle_block->next = n_block = (struct triangle_block *)malloc(sizeof(struct triangle_block)); n_block->next = NULL; return curr_triangle_block = n_block; } struct triangle *new_triangle(struct edge *e1, struct edge *e2, struct edge *e3, int o1, int o2, int o3, Poly *orig) { struct triangle *t; /* allocate a new triangle and link it in */ t = last_triangle + 1; if (t - curr_triangle_block->block >= triangleBLOCKSIZE) t = (new_triangle_block())->block; last_triangle->next = t; t->next = NULL; last_triangle = t; /* now initialize t */ t->small = FALSE; t->e1 = e1; t->e2 = e2; t->e3 = e3; t->o1 = o1; t->o2 = o2; t->o3 = o3; t->orig_poly = orig; ++tri_count; return t; } geomview-1.9.4/src/lib/geometry/cmodel/Headers0000644000175000001440000000002307730236374016223 00000000000000cmodel.h cmodelP.h geomview-1.9.4/src/lib/geometry/Makefile.am0000644000175000001440000000016410532331627015513 00000000000000SUBDIRS = cmodel hpoint3 hpointn point3 transform3 transformn transobj ntransobj EXTRA_DIST = Headers geomtypes.h geomview-1.9.4/src/lib/geometry/Makefile.in0000644000175000001440000003762410665240500015533 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = cmodel hpoint3 hpointn point3 transform3 transformn transobj ntransobj EXTRA_DIST = Headers geomtypes.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geometry/point3/0000777000175000001440000000000010665240667014770 500000000000000geomview-1.9.4/src/lib/geometry/point3/point3.h0000644000175000001440000001754010564221642016266 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips, Celeste Fowler */ #ifndef _GV_POINT3_H_ #define _GV_POINT3_H_ /* ** point3.c - 3D vector arithmetic module. ** ** pat hanrahan ** ** cH: now as inline functions for efficiency ** */ #include #include #include "tolerance.h" #include "geomtypes.h" #define Pt3X(pt) (pt)->x #define Pt3Y(pt) (pt)->y #define Pt3Z(pt) (pt)->z extern Pt3Coord SgSgDistance(Point3 *a1, Point3 *a2, Point3 *b1, Point3 *b2); static const Point3 Pt3Origin = { 0., 0., 0. }; static inline void Pt3Print(const Point3 *v); static inline void Pt3From(Point3 *v, double x, double y, double z); static inline void Pt3Copy(const Point3 *v1, Point3 *v2); static inline void Pt3Add(const Point3 *v1, const Point3 *v2, Point3 *v3); static inline void Pt3Sub(const Point3 *v1, const Point3 *v2, Point3 *v3); static inline void Pt3Mul(double s, const Point3 *v1, Point3 *v2); static inline Pt3Coord Pt3Dot(const Point3 *v1, const Point3 *v2); static inline void Pt3Cross(const Point3 *v1, const Point3 *v2, Point3 *v3); static inline Pt3Coord Pt3TripleDot(const Point3 *v1, const Point3 *v2, const Point3 *v3); static inline void Pt3TripleCross(const Point3 *v1, const Point3 *v2, const Point3 *v3, Point3 *v4); static inline Pt3Coord Pt3Length(const Point3 *v); static inline Pt3Coord Pt3Distance(const Point3 *v1, const Point3 *v2); static inline Pt3Coord Pt3Angle(const Point3 *v1, const Point3 *v2); static inline void Pt3Unit(Point3 *v); static inline void Pt3Lerp(double t, const Point3 *v1, const Point3 *v2, Point3 *v3); static inline void Pt3Comb(double t1, const Point3 *v1, double t2, const Point3 *v2, Point3 *v3); static inline int Pt3Equal(const Point3 *v1, const Point3 *v2); static inline int Pt3Parallel(const Point3 *v1, const Point3 *v2); static inline int Pt3Perpendicular(const Point3 *v1, const Point3 *v2); static inline void Pt3Transform(Transform3 T, Point3 *p1, Point3 *p2); static inline void Pt3TransformN(Transform3 T, Point3 *p1, Point3 *p2, int n); static inline void NormalTransform(Transform3 T, Point3 *a, Point3 *b); static inline void NormalTransformN(Transform3 T, Point3 *a, Point3 *b, int n); #include "transform3.h" /* print vector */ static inline void Pt3Print(const Point3 *v) { /* Only works if Pt3Coord is a float */ printf("[%g %g %g]\n", v->x, v->y, v->z); } static inline void Pt3From(Point3 *v, double x, double y, double z) { v->x = x; v->y = y; v->z = z; } /* v2 = v1 */ static inline void Pt3Copy( const Point3 *v1, Point3 *v2 ) { v2->x = v1->x; v2->y = v1->y; v2->z = v1->z; } /* v3 = v1 + v2 */ static inline void Pt3Add( const Point3 *v1, const Point3 *v2, Point3 *v3 ) { v3->x = v1->x + v2->x; v3->y = v1->y + v2->y; v3->z = v1->z + v2->z; } /* v3 = v1 - v2 */ static inline void Pt3Sub( const Point3 *v1, const Point3 *v2, Point3 *v3) { v3->x = v1->x - v2->x; v3->y = v1->y - v2->y; v3->z = v1->z - v2->z; } /* v2 = s * v1 */ static inline void Pt3Mul( double s, const Point3 *v1, Point3 *v2 ) { v2->x = s*v1->x; v2->y = s*v1->y; v2->z = s*v1->z; } /* v1 . v2 */ static inline Pt3Coord Pt3Dot( const Point3 *v1, const Point3 *v2 ) { return v1->x*v2->x+v1->y*v2->y+v1->z*v2->z; } /* v3 = v1 x v2 */ static inline void Pt3Cross( const Point3 *v1, const Point3 *v2, Point3 *v3 ) { v3->x = v1->y*v2->z-v1->z*v2->y; v3->y = v1->z*v2->x-v1->x*v2->z; v3->z = v1->x*v2->y-v1->y*v2->x; } /* v1 . (v2 x v3) */ static inline Pt3Coord Pt3TripleDot( const Point3 *v1, const Point3 *v2, const Point3 *v3 ) { return v1->x*(v2->y*v3->z-v2->z*v3->y) + v1->y*(v2->z*v3->x-v2->x*v3->z) + v1->z*(v2->x*v3->y-v2->y*v3->x); } /* v4 = (v1 x v2) x v3 */ static inline void Pt3TripleCross( const Point3 *v1, const Point3 *v2, const Point3 *v3, Point3 *v4 ) { Point3 v; Pt3Cross( v1, v2, &v ); Pt3Cross( &v, v3, v4 ); } static inline Pt3Coord Pt3Length( const Point3 *v ) { return sqrt( v->x*v->x + v->y*v->y + v->z*v->z ); } static inline Pt3Coord Pt3Distance( const Point3 *v1, const Point3 *v2 ) { Point3 v12; Pt3Sub(v1,v2,&v12); return Pt3Length(&v12); } static inline Pt3Coord Pt3Angle( const Point3 *v1, const Point3 *v2 ) { return(acos(Pt3Dot(v1, v2) / (Pt3Length(v1) * Pt3Length(v2)))); } static inline void Pt3Unit( Point3 *v ) { Pt3Coord len; len = Pt3Length(v); if( len != 0. && len != 1. ) Pt3Mul( 1./len, v, v ); } /* * lerp - linear interpolation * * v3 = (1-t)*v1 + t*v2 */ static inline void Pt3Lerp( double t, const Point3 *v1, const Point3 *v2, Point3 *v3 ) { v3->x = (1.-t)*v1->x + t*v2->x; v3->y = (1.-t)*v1->y + t*v2->y; v3->z = (1.-t)*v1->z + t*v2->z; } static inline void Pt3Comb( double t1, const Point3 *v1, double t2, const Point3 *v2, Point3 *v3 ) { v3->x = t1*v1->x + t2*v2->x; v3->y = t1*v1->y + t2*v2->y; v3->z = t1*v1->z + t2*v2->z; } /* vectors equal */ static inline int Pt3Equal( const Point3 *v1, const Point3 *v2 ) { Pt3Coord v; v = Pt3Distance(v1, v2); return fz(v); } /* parallel vectors */ static inline int Pt3Parallel( const Point3 *v1, const Point3 *v2 ) { Point3 v3; Pt3Coord v; Pt3Cross(v1,v2,&v3); v=Pt3Length(&v3); return fz(v); } /* perpendicular vectors */ static inline int Pt3Perpendicular( const Point3 *v1, const Point3 *v2 ) { Pt3Coord v; v=Pt3Dot(v1,v2); return fz(v); } static inline void Pt3Transform( Transform3 T, Point3 *p1, Point3 *p2 ) { Pt3Coord x, y, z, w; x = p1->x; y = p1->y; z = p1->z; w = (T[TMX][TMW]*x + T[TMY][TMW]*y + T[TMZ][TMW]*z + T[TMW][TMW]); if(w != 1.0) { w = 1.0 / w; p2->x = w * (x*T[TMX][TMX] + y*T[TMY][TMX] + z*T[TMZ][TMX] + T[TMW][TMX]); p2->y = w * (x*T[TMX][TMY] + y*T[TMY][TMY] + z*T[TMZ][TMY] + T[TMW][TMY]); p2->z = w * (x*T[TMX][TMZ] + y*T[TMY][TMZ] + z*T[TMZ][TMZ] + T[TMW][TMZ]); } else { p2->x = x*T[TMX][TMX] + y*T[TMY][TMX] + z*T[TMZ][TMX] + T[TMW][TMX]; p2->y = x*T[TMX][TMY] + y*T[TMY][TMY] + z*T[TMZ][TMY] + T[TMW][TMY]; p2->z = x*T[TMX][TMZ] + y*T[TMY][TMZ] + z*T[TMZ][TMZ] + T[TMW][TMZ]; } } static inline void Pt3TransformN( Transform3 T, Point3 *p1, Point3 *p2, int n ) { while( n-- ) Pt3Transform( T, p1++, p2++ ); } /* Behold: if T is not orthogonal, then this function has to be called * with T^{-tr}, or the adj(T)^{tr}, otherwise the result will be * wrong. */ static inline void NormalTransform(Transform3 Tdual, Point3 *a, Point3 *b) { #if 0 Pt3Transform(T, a, b); b->x -= T[TMW][TMX]; b->y -= T[TMW][TMY]; b->z -= T[TMW][TMZ]; #else Pt3Coord x, y, z; x = a->x; y = a->y; z = a->z; b->x = x*Tdual[TMX][TMX] + y*Tdual[TMY][TMX] + z*Tdual[TMZ][TMX]; b->y = x*Tdual[TMX][TMY] + y*Tdual[TMY][TMY] + z*Tdual[TMZ][TMY]; b->z = x*Tdual[TMX][TMZ] + y*Tdual[TMY][TMZ] + z*Tdual[TMZ][TMZ]; #endif Pt3Unit(b); } static inline void NormalTransformN( Transform3 T, Point3 *a, Point3 *b, int n ) { while ( n-- ) NormalTransform( T, a++, b++ ); } #endif /* _GV_POINT3_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geometry/point3/Makefile.am0000644000175000001440000000022710532311770016724 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libpoint3.la libpoint3_la_SOURCES = polyint.c segments.c point3.h polyint.h geomview-1.9.4/src/lib/geometry/point3/Makefile.in0000644000175000001440000003546410665240501016750 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/point3 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libpoint3_la_LIBADD = am_libpoint3_la_OBJECTS = polyint.lo segments.lo libpoint3_la_OBJECTS = $(am_libpoint3_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libpoint3_la_SOURCES) DIST_SOURCES = $(libpoint3_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libpoint3.la libpoint3_la_SOURCES = polyint.c segments.c point3.h polyint.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/point3/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/point3/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libpoint3.la: $(libpoint3_la_OBJECTS) $(libpoint3_la_DEPENDENCIES) $(LINK) $(libpoint3_la_OBJECTS) $(libpoint3_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polyint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/segments.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geometry/point3/segments.c0000644000175000001440000002052510532311452016661 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "3d.h" #include "ooglutil.h" static void PtNormalPlane(Point3 *base, Point3 *normal, HPoint3 *ans); static void Proj(Point3 *a, Point3 *b, Point3 *ans); static void Orth(Point3 *a, Point3 *b, Point3 *ans); static float ParSgSgDistance(Point3 *a1, Point3 *a2, Point3 *adir, Point3 *b1, Point3 *b2); static float SgPtDistance(Point3 *p, Point3 *a1, Point3 *a2, Point3 *dir); static void SgPlMinPoint(HPoint3 *pl, Point3 *a, Point3 *b, Point3 *dir, Point3 *ans); static void TComb(Point3 *a, float t, Point3 *dir, Point3 *b); static int LnPlIntersect(HPoint3 *pl, Point3 *a, Point3 *dir, float *t); /*----------------------------------------------------------------------- * Function: SgSgDistance * Description: distance between two line segments * Args: a1,a2: first segment * b1,b2: second segment * Returns: distance between segment [a1,a2] and segment [b1,b2] * Author: mbp * Date: Mon Dec 23 15:17:30 1991 * Notes: This procedure is totally general; either or both * segments may in fact be points. */ Pt3Coord SgSgDistance(Point3 *a1, Point3 *a2, Point3 *b1, Point3 *b2) { Point3 adir, bdir, amin, bmin, na, nb; HPoint3 aplane, bplane; Pt3Coord alen, blen, d, cosang; Pt3Sub(a2,a1, &adir); alen = Pt3Length( &adir ); Pt3Sub(b2,b1, &bdir); blen = Pt3Length( &bdir ); switch ( ((alen<1.e-12)<<1) | (blen<1.e-12) ) { case 1: /* b is a point, a is not */ d = SgPtDistance(b1, a1,a2,&adir); return d; case 2: /* a is a point, b is not */ d = SgPtDistance(a1, b1,b2,&bdir); return d; case 3: /* both a and b are points */ d = Pt3Distance(a1,b1); return d; } /* * We fall thru the above switch if neither segment is a point. * Now check for parallelism. */ cosang = Pt3Dot(&adir,&bdir) / ( alen * blen ); if ( fabs((double)cosang) > .99 ) { /* segments are essentially parallel */ d = ParSgSgDistance(a1,a2,&adir,b1,b2); } else { /* segments are skew */ Orth(&adir, &bdir, &na); Orth(&bdir, &adir, &nb); PtNormalPlane(a1, &na, &aplane); PtNormalPlane(b1, &nb, &bplane); SgPlMinPoint(&aplane, b1, b2, &bdir, &bmin); SgPlMinPoint(&bplane, a1, b2, &adir, &amin); d = Pt3Distance(&amin, &bmin); } return d; } /*----------------------------------------------------------------------- * Function: PtNormalPlane * Description: compute homog coords of a plane * Args: *base: point on plane * *normal: normal vector to plane * *ans: homog coords of plane * Returns: nothing * Author: mbp * Date: Mon Dec 23 15:08:46 1991 */ static void PtNormalPlane(Point3 *base, Point3 *normal, HPoint3 *ans) { ans->x = normal->x; ans->y = normal->y; ans->z = normal->z; ans->w = - Pt3Dot(base, normal); } /*----------------------------------------------------------------------- * Function: Proj * Description: projection of a onto b * Args IN: a,b * OUT: ans * Returns: nothing * Author: mbp * Date: Mon Dec 23 15:09:29 1991 */ static void Proj(Point3 *a, Point3 *b, Point3 *ans) { Pt3Mul( Pt3Dot(a,b) / Pt3Dot(a,a), a, ans ); } /*----------------------------------------------------------------------- * Function: Orth * Description: orthogonalization of b wrt a * Args IN: a, b * OUT: ans * Returns: nothing * Author: mbp * Date: Mon Dec 23 15:09:54 1991 * Notes: answer is vector in plane spanned * by a & b, orthogonal to a. */ static void Orth(Point3 *a, Point3 *b, Point3 *ans) { Point3 p; Proj(a,b,&p); Pt3Sub(b, &p, ans); } /*----------------------------------------------------------------------- * Function: ParSgSgDistance * Description: compute distance between two line segments on * parallel lines * Args: a1, a2: first segment * *adir: a2 - a1 * b1,b2: second segment * Returns: distance between segments [a1,a2] and [b1,b2] * Author: mbp * Date: Mon Dec 23 15:11:38 1991 * Notes: segments must lie on parallel lines in order for * this to work. * adir must be exactly a2 - a1 upon input. It appears * as an argument to this procedure because we assume * the caller has already computed it, and we need it * here, so why recompute it?!! */ static Pt3Coord ParSgSgDistance(Point3 *a1, Point3 *a2, Point3 *adir, Point3 *b1, Point3 *b2) { Point3 b1p,b2p; HPoint3 b1plane, b2plane; Pt3Coord d,t1 = 0.0 ,t2 = 0.0; Pt3Sub(a2,a1,adir); PtNormalPlane(b1, adir, &b1plane); LnPlIntersect(&b1plane, a1, adir, &t1); TComb(a1, t1, adir, &b1p); d = Pt3Distance(b1, &b1p); if ( (t1>=0) && (t1<=1) ) return d; PtNormalPlane(b2, adir, &b2plane); LnPlIntersect(&b2plane, a1, adir, &t2); TComb(a1, t2, adir, &b2p); if ( (t2>=0) && (t2<=1) ) return d; if ( t2 > t1 ) { if ( t1 > 1 ) d = Pt3Distance(a2,b1); else d = Pt3Distance(a1,b2); } else { if ( t2 > 1 ) d = Pt3Distance(a2,b2); else d = Pt3Distance(a1,b1); } return d; } /*----------------------------------------------------------------------- * Function: SgPtDistance * Description: distance from a segment to a point * Args: p: the point * a1,a2: the segment * *dir: a2 - a1 * Returns: the distance from p to segment [a1,a2] * Author: mbp * Date: Mon Dec 23 15:15:19 1991 * Notes: dir must be a2 - a1 upon input */ static Pt3Coord SgPtDistance(Point3 *p, Point3 *a1, Point3 *a2, Point3 *dir) { HPoint3 pl; Point3 min; Pt3Coord d; PtNormalPlane(p, dir, &pl); SgPlMinPoint(&pl, a1, a2, dir, &min); d = Pt3Distance(p, &min); return d; } /*----------------------------------------------------------------------- * Function: SgPlMinPoint * Description: find the point of a segment closest to a plane * Args: pl: homog coords of the plane * a,b: the segment * dir: b - a * ans: the point of segment [a,b] closest to plane * Returns: nothing * Author: mbp * Date: Mon Dec 23 15:19:02 1991 * Notes: dir must be b - a upon input */ static void SgPlMinPoint(HPoint3 *pl, Point3 *a, Point3 *b, Point3 *dir, Point3 *ans) { Pt3Coord t = 0.0; LnPlIntersect(pl, a, dir, &t); if (t <= 0) *ans = *a; else if (t >= 1) *ans = *b; else TComb(a, t, dir, ans); } /*----------------------------------------------------------------------- * Function: TComb * Description: form a t combination: b = a + t * dir * Args IN: a,dir,t * OUT: b: a + t * dir * Returns: nothing * Author: mbp * Date: Mon Dec 23 15:20:43 1991 */ static void TComb(Point3 *a, Pt3Coord t, Point3 *dir, Point3 *b) { b->x = a->x + t * dir->x; b->y = a->y + t * dir->y; b->z = a->z + t * dir->z; } /*----------------------------------------------------------------------- * Function: LnPlIntersect * Description: intersect a plane with a line * Arg IN: pl: the plane * a: base point of line * dir: direction vector of line * OUT: t: t value such that a + t * dir lies on plane * Returns: 1 if successful, 0 if not * Author: mbp * Date: Mon Dec 23 15:22:25 1991 * Notes: return value of 0 means line is parallel to plane */ static int LnPlIntersect(HPoint3 *pl, Point3 *a, Point3 *dir, Pt3Coord *t) { Pt3Coord d; d = pl->x*dir->x + pl->y*dir->y + pl->z*dir->z; if (d == 0) return 0; *t = - ( a->x * pl->x + a->y * pl->y + a->z * pl->z + pl->w ) / d; return 1; } geomview-1.9.4/src/lib/geometry/point3/polyint.c0000644000175000001440000002256010455701001016530 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "point3.h" #include "transform.h" #include "ooglutil.h" #include "polyint.h" #define FUDGE2 1.e-12 #define PT3SUB_XY(a, b, dst) { (dst).x = (a).x - (b).x; \ (dst).y = (a).y - (b).y; \ (dst).z = (a).z - (b).z; } #define PT3LENGTH_XY(a) sqrt((a).x*(a).x + (a).y*(a).y) #define PT3DOT_XY(a, b) ((a).x*(b).x + (a).y*(b).y) struct PolyHit { Point3 hitpt; int vno; int edgevno; }; /* * Internal routines. These should not need to be called directly. */ static int PolyInt_InBBox(int n_verts, Point3 *verts, float tol); static int PolyInt_Origin(int n_verts, Point3 *verts, Point3 *origin); int PolyZInt(int n_verts, Point3 *verts, float tol, int wanted, vvec *hits) { int i; int count = 0; struct PolyHit *ph; Point3 pt, bma, *thisp, *nextp; float thisd2, nextd2, od2, tol2, len2, f; float angsum = 0.0; /* Do test for trivial rejection */ if (!PolyInt_InBBox(n_verts, verts, tol)) return 0; /* If we have just one vertex, and passed the above test, it's a hit. */ if(n_verts == 1 && wanted&PW_VERT) { ph = VVAPPEND(*hits, struct PolyHit); ph->vno = 0; ph->edgevno = -1; ph->hitpt = verts[0]; return 1; } tol2 = tol*tol; /* Go through the edges of the polygon looking for edge and vertex hits. */ thisp = &verts[n_verts-1]; thisd2 = PT3DOT_XY(*thisp, *thisp); nextp = &verts[0]; for (i = 0; i < n_verts; i++, thisp = nextp++, thisd2 = nextd2) { /* Line equation: this + t*(next-this)/|next-this|, for 0<=t<=1 */ /* Find closest point on line to origin. */ nextd2 = PT3DOT_XY(*nextp, *nextp); PT3SUB_XY(*thisp, *nextp, bma); len2 = PT3DOT_XY(bma, bma); if(nextd2 < tol2 && wanted&PW_VERT) { count++; ph = VVAPPEND(*hits, struct PolyHit); ph->hitpt = *nextp; ph->vno = i; ph->edgevno = -1; } else if(len2 > 0) { f = -PT3DOT_XY(*thisp, bma) / len2; pt.x = thisp->x + f*bma.x; pt.y = thisp->y + f*bma.y; od2 = PT3DOT_XY(pt, pt); if(od2 < tol2 && wanted&PW_EDGE && (thisd2 > tol2 || !(wanted&PW_VERT))) { count++; ph = VVAPPEND(*hits, struct PolyHit); pt.z = thisp->z + f*bma.z; ph->hitpt = pt; ph->vno = -1; ph->edgevno = (i==0) ? n_verts-1 : i-1; } if(len2 > FUDGE2) { /* Add in the (signed) angle subtended by this edge as seen from * the origin: atan2( this cross next, this dot next ) */ angsum += atan2( thisp->x * nextp->y - thisp->y * nextp->x, PT3DOT_XY(*thisp, *nextp) ); } } } /* Look for the face hits */ if (wanted&PW_FACE && count == 0 && n_verts > 2 && fabs(angsum) > M_PI && PolyInt_Origin(n_verts, verts, &pt)) { count++; ph = VVAPPEND(*hits, struct PolyHit); ph->hitpt = pt; ph->vno = -1; ph->edgevno = -1; } return(count); } int PolyNearPosZInt(int n_verts, Point3 *verts, float tol, Point3 *ip, int *vertex, int *edge, Point3 *ep, int wanted, float zclose) { int i; vvec hits; struct PolyHit *ph, *closest, phits[32]; VVINIT(hits, struct PolyHit, 32); vvuse(&hits, phits, 32); if (!PolyZInt(n_verts, verts, tol, wanted, &hits)) return 0; closest = NULL; for (i = 0, ph = VVEC(hits, struct PolyHit); i < VVCOUNT(hits); i++, ph++) { if (ph->hitpt.z > -1.0 && ph->hitpt.z < zclose) { closest = ph; zclose = ph->hitpt.z; } } if (closest) { *ip = closest->hitpt; *vertex = closest->vno; *edge = closest->edgevno; *ep = closest->hitpt; } vvfree(&hits); return (closest ? 1 : 0); } #ifdef UNUSED int PolyLineInt(Point3 *pt1, Point3 *pt2, int n_verts, Point3 *verts, float tol, vvec *ip, vvec *vertices, vvec *edges, vvec *ep) { int i; int n_hits, old_n_hits; Point3 *vertcopy; Transform T, Tinv; PolyInt_Align(pt1, pt2, T); TmInvert(T, Tinv); vertcopy = OOGLNewNE(Point3, n_verts, msg); for (i = 0; i < n_verts; i++) Pt3Transform(T, &verts[i], &vertcopy[i]); old_n_hits = VVCOUNT(*ip); n_hits = PolyZInt(n_verts, vertcopy, tol, ip, vertices, edges, ep, PW_EDGE|PW_VERT); for (i = 0; i < n_hits; i++) { Pt3Transform(Tinv, VVINDEX(*ip, Point3, old_n_hits + i), VVINDEX(*ip, Point3, old_n_hits + i)); Pt3Transform(Tinv, VVINDEX(*ep, Point3, old_n_hits + i), VVINDEX(*ep, Point3, old_n_hits + i)); } OOGLFree(vertcopy); return n_hits; } int PolyRayInt(Point3 *pt1, Point3 *pt2, int n_verts, Point3 *verts, float tol, vvec *ip, vvec *vertices, vvec *edges, vvec *ep) { int i, j; int n_hits, old_n_hits; Point3 *vertcopy; Transform T, Tinv; PolyInt_Align(pt1, pt2, T); TmInvert(T, Tinv); vertcopy = OOGLNewNE(Point3, n_verts, msg); for (i = 0; i < n_verts; i++) Pt3Transform(T, &verts[i], &vertcopy[i]); old_n_hits = VVCOUNT(*ip); n_hits = PolyZInt(n_verts, vertcopy, tol, ip, vertices, edges, ep, PW_EDGE|PW_VERT); for (i = j = 0; i < n_hits; i++) if (VVINDEX(*ip, Point3, old_n_hits + i)->z <= 0) { Pt3Transform(Tinv, VVINDEX(*ip, Point3, old_n_hits + i), VVINDEX(*ip, Point3, old_n_hits + j)); Pt3Transform(Tinv, VVINDEX(*ep, Point3, old_n_hits + i), VVINDEX(*ep, Point3, old_n_hits + j)); j++; } OOGLFree(vertcopy); return j; } int PolySegmentInt(Point3 *pt1, Point3 *pt2, int n_verts, Point3 *verts, float tol, vvec *ip, vvec *vertices, vvec *edges, vvec *ep) { int i, j; int n_hits, old_n_hits; Point3 *vertcopy; Transform T, Tinv; PolyInt_Align(pt1, pt2, T); TmInvert(T, Tinv); vertcopy = OOGLNewNE(Point3, n_verts, msg); for (i = 0; i < n_verts; i++) Pt3Transform(T, &verts[i], &vertcopy[i]); old_n_hits = VVCOUNT(*ip); n_hits = PolyZInt(n_verts, vertcopy, tol, ip, vertices, edges, ep, PW_EDGE|PW_VERT); for (i = j = 0; i < n_hits; i++) if ((VVINDEX(*ip, Point3, old_n_hits + i)->z <= 0) && (VVINDEX(*ip, Point3, old_n_hits + i)->z >= -1.0)) { Pt3Transform(Tinv, VVINDEX(*ip, Point3, old_n_hits + i), VVINDEX(*ip, Point3, old_n_hits + j)); Pt3Transform(Tinv, VVINDEX(*ep, Point3, old_n_hits + i), VVINDEX(*ep, Point3, old_n_hits + j)); j++; } OOGLFree(vertcopy); VVCOUNT(*ip) = old_n_hits + j; vvtrim(ip); return j; } #endif /*UNUSED*/ void PolyInt_Align(Point3 *pt1, Point3 *pt2, Transform T) { Point3 newpt2; Transform Ttmp; if (!memcmp(pt1, pt2, sizeof(Point3))) { OOGLError(1, "PolyInt_Align called with identical points."); TmIdentity(T); return; } TmTranslate(T, -pt1->x, -pt1->y, -pt1->z); Pt3Transform(T, pt2, &newpt2); TmRotateY(Ttmp, -atan2(newpt2.x, -newpt2.z)); TmConcat(T, Ttmp, T); Pt3Transform(T, pt2, &newpt2); TmRotateX(Ttmp, -atan2(newpt2.y, -newpt2.z)); TmConcat(T, Ttmp, T); Pt3Transform(T, pt2, &newpt2); if (newpt2.z == 0.0) { OOGLError(1, "Second point too close to first point in PolyInt_Align"); TmIdentity(T); return; } TmScale(Ttmp, -1.0 / newpt2.z, -1.0 / newpt2.z, -1.0 / newpt2.z); TmConcat(T, Ttmp, T); } /* * PolyInt_InBBox * Returns non-zero if the origin is inside the polygon described by * verts or within tol of begin so; returns 0 otherwise. */ static int PolyInt_InBBox(int n_verts, Point3 *verts, float tol) { int i; int posx = 0, negx = 0, posy = 0, negy = 0; for (i = 0; i < n_verts; i++, verts++) { if (verts->x < tol) negx |= 1; if (verts->x > -tol) posx |= 1; if (verts->y < tol) negy |= 1; if (verts->y > -tol) posy |= 1; } return (posx & negx & posy & negy); } static int PolyInt_Origin(int n_verts, Point3 *verts, Point3 *origin) { int bi, ci; float pz = 0, pw; /* Find the first vertex different from the 0th vertex */ for (bi = 0; bi < n_verts && !memcmp(&verts[0], &verts[bi], sizeof(Point3)); bi++); if (bi >= n_verts) { Pt3Copy(&verts[0], origin); return 0; } /* Find the first vertex not collinear with the other two vertices */ for (ci = bi+1; ci < n_verts; ci++) { pz = (verts[0].x * (verts[bi].y - verts[ci].y) - verts[0].y * (verts[bi].x - verts[ci].x) + (verts[bi].x * verts[ci].y - verts[bi].y * verts[ci].x)); if (pz*pz > FUDGE2) break; } if (ci >= n_verts) { Pt3Copy(&verts[0], origin); return 0; } pw = (verts[0].x * (verts[bi].z*verts[ci].y - verts[bi].y*verts[ci].z) - verts[0].y * (verts[bi].z*verts[ci].x - verts[bi].x*verts[ci].z) + verts[0].z * (verts[bi].y*verts[ci].x - verts[bi].x*verts[ci].y)); origin->x = origin->y = 0.0; origin->z = -pw / pz; return 1; } geomview-1.9.4/src/lib/geometry/point3/polyint.h0000644000175000001440000001343710455701001016540 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef POLYINT_H #define POLYINT_H #define PW_VERT 1 /* What kinds of polygon intersections do we want? */ #define PW_EDGE 2 #define PW_FACE 4 #define PW_VISIBLE 8 /* * Tolerance - a good value to pass to PolyZInt and its subsidiaries. */ #define POLYINT_TOL 1.e-6 /* * PolyZInt * Finds intersection of z-axis and arbitrary flat polygon. * * Input: * n_verts # of vertices in polygon (the length of the verts array) * verts vertices of polygon * tol Tolerance. Any point whose distance from the z-axis * is less than tol will be considered hit. * * Output: * All output values are vvecs (See ooglutil.h). They must already be * initialized when passed to PolyZInt. Any new intersection points found * by PolyZInt will be appended onto the vvec. The count field of all the * vvecs must be up to date. When PolyZInt returns, this field will reflect * any new elements that have been added to the vvec (ie, the new count * field will be equal to the old count field plus the number of intersection * points found by PolyZInt). Note that all the vvecs will be the same * length. PolyZInt will return the number of intersection points found. * ip Intersection points (Point3). These are the points where * the Z-axis intersects the plane containing the polygon. * Note that if tol > 0.0, these points may not actually * be inside the polygon. * vertices Vertex intersections (ints - indices into verts). If no * vertex intersection was found, the corresponding element * in this vvec will be set to -1. * edges Edge intersections (ints - indices of first point in * verts list). If no edge intersection was found, the * corresponding element in this vvec will be set to -1. * ep Edge intersection locations, if any were found (Point3). * An element of this array will contain valid data iff * the corresponding element of the edges vvec is not equal * to -1. The elements of this are guarenteed to be points * on the edge, but, because of the tolerance, may not be * equal to the corresponding elements of the ip array. * For every intersection point found, ip will be filled in. vertices will * be filled in only if a vertices was within tol of the intersection point. * If a vertices was within tol of the intersection point, the edges to which * the point belongs will not be considered to have been hit. */ int PolyZInt(int n_verts, Point3 *verts, float tol, int wanted, vvec *hits); /* * PolyNearNegZInt * Wrapper for PolyZInt designed for mouse picking. Finds the * intersection closest to the origin on the positive Z axis. * Returns non-zero if there was a hit. * * Input: * (See above) * Output: * ip Intersection point. * vertex Index of vertex or -1 if there was no vertex hit. * edge Index of first vertex of edge or -1 if there was no * edge hit. * ep Edge point. * wanted Bit-mask of PW_{FACE|VERT|EDGE}: want which kinds of picks? * zmin Only accept picks where z # include #include "tolerance.h" #include "ooglutil.h" #include "geomtypes.h" static inline char *Hg4Create(void); static inline void Hg4Delete(Hg4Tensor1 p); static inline void Hg4Print(Hg4Tensor1 p); static inline void Hg4From(Hg4Tensor1 p, Hg4Coord x, Hg4Coord y, Hg4Coord z, Hg4Coord w); static inline void Hg4Copy(Hg4Tensor1 a, Hg4Tensor1 b); static inline void Hg4Add(Hg4Tensor1 p1, Hg4Tensor1 p2, Hg4Tensor1 p3); static inline int Hg4Compare(Hg4Tensor1 p1, Hg4Tensor1 p2); static inline int Hg4Coincident(Hg4Tensor1 p1, Hg4Tensor1 p2); static inline int Hg4Undefined(Hg4Tensor1 a); static inline int Hg4Infinity(Hg4Tensor1 p, int dual); static inline void Hg4Normalize(Hg4Tensor1 p, Hg4Tensor1 q); static inline void Hg4Pencil(Hg4Coord t1, Hg4Tensor1 p1, Hg4Coord t2, Hg4Tensor1 p2, Hg4Tensor1 p); static inline void Hg4Transform(Transform3 T, Hg4Tensor1 p1, Hg4Tensor1 p2); static inline void Hg4Print2(Hg4Tensor2 L); static inline void Hg4Copy2(Hg4Tensor2 L, Hg4Tensor2 K); static inline int Hg4Compare2(Hg4Tensor2 L, Hg4Tensor2 K); static inline int Hg4Undefined2(Hg4Tensor2 L); static inline int Hg4Infinity2(Hg4Tensor2 L, int dual); static inline void Hg4Transform2(Transform3 T, Hg4Tensor2 p1, Hg4Tensor2 p2); static inline void Hg4AntiProductPiQj(Hg4Tensor2 L, Hg4Tensor1 p1, Hg4Tensor1 p2); static inline Hg4Coord Hg4ContractPiQi(Hg4Tensor1 pl, Hg4Tensor1 pt); static inline void Hg4AntiContractPijQj(Hg4Tensor2 L, Hg4Tensor1 p1, Hg4Tensor1 p2); static inline void Hg4ContractPijQjk(Hg4Tensor2 a, Hg4Tensor2 b, Hg4Tensor2 c); static inline Hg4Coord Hg4ContractPii(Hg4Tensor2 L); static inline int Hg4Intersect2(Hg4Tensor2 L, Hg4Tensor1 a, Hg4Tensor1 b); static inline int Hg4Intersect3(Hg4Tensor1 a, Hg4Tensor1 b, Hg4Tensor1 c, Hg4Tensor1 p, int dual); static inline int Hg4Intersect4(Hg4Tensor2 K, Hg4Tensor2 L, Hg4Tensor1 pl, Hg4Tensor1 pt); static inline void Hg4Dual(Hg4Tensor2 L, Hg4Tensor2 K); #include "transform3.h" /* Tensor of Order 1 */ static inline char * Hg4Create(void) { return (char *) OOGLNewE(Hg4Tensor1, "Hg4Create"); } static inline void Hg4Delete(Hg4Tensor1 p) { OOGLFree( (char *) p ); } static inline void Hg4Print(Hg4Tensor1 p) { if( p ) printf( "%g %g %g %g\n", p[TMX], p[TMY], p[TMZ], p[TMW] ); } static inline void Hg4From(Hg4Tensor1 p, Hg4Coord x, Hg4Coord y, Hg4Coord z, Hg4Coord w) { p[TMX] = x; p[TMY] = y; p[TMZ] = z; p[TMW] = w; } static inline void Hg4Copy(Hg4Tensor1 a, Hg4Tensor1 b) { memcpy( (char *)b, (char *)a, sizeof(Hg4Tensor1) ); } static inline void Hg4Add(Hg4Tensor1 p1, Hg4Tensor1 p2, Hg4Tensor1 p3) { int i; for (i=0; i<4; ++i) p3[i] = p1[i] + p2[i]; } static inline int Hg4Compare(Hg4Tensor1 p1, Hg4Tensor1 p2) { Hg4Coord test; test = p1[TMX]*p2[TMY] - p1[TMY]*p2[TMX]; if( fneg(test) ) return -1; if( fpos(test) ) return 1; test = p1[TMX]*p2[TMZ] - p1[TMZ]*p2[TMX]; if( fneg(test) ) return -1; if( fpos(test) ) return 1; test = p1[TMY]*p2[TMZ] - p1[TMZ]*p2[TMY]; if( fneg(test) ) return -1; if( fpos(test) ) return 1; test = p1[TMX]*p2[TMW] - p1[TMW]*p2[TMX]; if( fneg(test) ) return -1; if( fpos(test) ) return 1; test = p1[TMY]*p2[TMW] - p1[TMW]*p2[TMY]; if( fneg(test) ) return -1; if( fpos(test) ) return 1; test = p1[TMZ]*p2[TMW] - p1[TMW]*p2[TMZ]; if( fneg(test) ) return -1; if( fpos(test) ) return 1; return 0; } static inline int Hg4Coincident(Hg4Tensor1 p1, Hg4Tensor1 p2) { return Hg4Compare( p1, p2 ) == 0; } static inline int Hg4Undefined(Hg4Tensor1 a) { if( !fzero(a[TMX]) ) return 0; if( !fzero(a[TMY]) ) return 0; if( !fzero(a[TMZ]) ) return 0; if( !fzero(a[TMW]) ) return 0; return 1; } static inline int Hg4Infinity(Hg4Tensor1 p, int dual) { /* Assume not undefined */ if( dual ) { /* plane */ if( !fzero(p[TMX]) ) return 0; if( !fzero(p[TMY]) ) return 0; if( !fzero(p[TMZ]) ) return 0; return 1; } else { /* point */ if( !fzero(p[TMW]) ) return 0; return 1; } } static inline void Hg4Normalize(Hg4Tensor1 p, Hg4Tensor1 q) { Hg4Copy( p, q ); if( q[TMW] != 1. && q[TMW] != 0. ) { q[TMX] /= q[TMW]; q[TMY] /= q[TMW]; q[TMZ] /= q[TMW]; q[TMW] = 1.; } } static inline void Hg4Pencil(Hg4Coord t1, Hg4Tensor1 p1, Hg4Coord t2, Hg4Tensor1 p2, Hg4Tensor1 p) { p[TMW] = t1 * p1[TMW] + t2 * p2[TMW]; /* Keep W positive */ if( p[TMW] < 0. ) { p[TMW] = -p[TMW]; t1 = -t1; t2 = -t2; } p[TMX] = t1 * p1[TMX] + t2 * p2[TMX]; p[TMY] = t1 * p1[TMY] + t2 * p2[TMY]; p[TMZ] = t1 * p1[TMZ] + t2 * p2[TMZ]; } /* * transform a 3d point * * pt2 = pt1 * [a] * */ static inline void Hg4Transform(Transform3 T, Hg4Tensor1 p1, Hg4Tensor1 p2) { Tm3Coord *aptr; Hg4Coord *pptr; Hg4Coord x, y, z, w; int cnt; x = p1[TMX]; y = p1[TMY]; z = p1[TMZ]; w = p1[TMW]; aptr= T[0]; pptr= p2; cnt=4; do{ *pptr++ = aptr[0]*x + aptr[4]*y + aptr[8]*z + aptr[12]*w; ++aptr; } while(--cnt); } /* Tensor of Order 2 */ static inline void Hg4Print2(Hg4Tensor2 L) { printf( "[%g %g %g %g\n", L[TMX][TMX], L[TMX][TMY], L[TMX][TMZ], L[TMX][TMW] ); printf( " %g %g %g %g\n", L[TMY][TMX], L[TMY][TMY], L[TMY][TMZ], L[TMY][TMW] ); printf( " %g %g %g %g\n", L[TMZ][TMX], L[TMZ][TMY], L[TMZ][TMZ], L[TMZ][TMW] ); printf( " %g %g %g %g]\n", L[TMW][TMX], L[TMW][TMY], L[TMW][TMZ], L[TMW][TMW] ); } static inline void Hg4Copy2(Hg4Tensor2 L, Hg4Tensor2 K) { memcpy( (char *)K, (char *)L, sizeof(Hg4Tensor2) ); } static inline int Hg4Compare2(Hg4Tensor2 L, Hg4Tensor2 K) { Hg4Coord t; Hg4Tensor2 N; Hg4ContractPijQjk( K, L, N ); t = Hg4ContractPii( N ); if( fzero(t) ) return 0; if( t < 0. ) return -1; return 1; } static inline int Hg4Undefined2(Hg4Tensor2 L) { if( !fzero(L[TMX][TMY]) ) return 0; if( !fzero(L[TMX][TMZ]) ) return 0; if( !fzero(L[TMX][TMW]) ) return 0; if( !fzero(L[TMY][TMZ]) ) return 0; if( !fzero(L[TMY][TMW]) ) return 0; if( !fzero(L[TMZ][TMW]) ) return 0; return 1; } static inline int Hg4Infinity2(Hg4Tensor2 L, int dual) { /* plane form */ if( dual ) { if( !fzero(L[TMX][TMY]) ) return 0; if( !fzero(L[TMX][TMZ]) ) return 0; if( !fzero(L[TMY][TMZ]) ) return 0; return 1; } else { if( !fzero(L[TMX][TMW]) ) return 0; if( !fzero(L[TMY][TMW]) ) return 0; if( !fzero(L[TMZ][TMW]) ) return 0; return 1; } } static inline void Hg4Transform2(Transform3 T, Hg4Tensor2 p1, Hg4Tensor2 p2) { Transform3 Tt; fprintf(stderr,"\nWARNING: dubious procedure Hg4Transform2 being called.\n\ This procedure may not have been correctly updated for new transform\n\ library. Ask me about this. --- mbp Mon Aug 19 10:38:19 1991.\n\n"); /* In fact, this procedure has not been updated at all. This is the old version. I don't know whether this depends on a notion of col vs row vectors, or right vs left mult. I think it does but I'm not sure how, so I'll deal with it later. -- mbp */ /* Assume p1 is the plane-form */ Tm3Transpose(T, Tt); Hg4ContractPijQjk( T, p1, p2 ); Hg4ContractPijQjk( p2, Tt, p2 ); } static inline void Hg4AntiProductPiQj(Hg4Tensor2 L, Hg4Tensor1 p1, Hg4Tensor1 p2) { L[TMX][TMX] = L[TMY][TMY] = L[TMZ][TMZ] = L[TMW][TMW] = 0.; L[TMX][TMY] = p1[TMX]*p2[TMY] - p1[TMY]*p2[TMX]; L[TMX][TMZ] = p1[TMX]*p2[TMZ] - p1[TMZ]*p2[TMX]; L[TMX][TMW] = p1[TMX]*p2[TMW] - p1[TMW]*p2[TMX]; L[TMY][TMZ] = p1[TMY]*p2[TMZ] - p1[TMZ]*p2[TMY]; L[TMY][TMW] = p1[TMY]*p2[TMW] - p1[TMW]*p2[TMY]; L[TMZ][TMW] = p1[TMZ]*p2[TMW] - p1[TMW]*p2[TMZ]; L[TMY][TMX] = -L[TMX][TMY]; L[TMZ][TMX] = -L[TMX][TMZ]; L[TMW][TMX] = -L[TMX][TMW]; L[TMZ][TMY] = -L[TMY][TMZ]; L[TMW][TMY] = -L[TMY][TMW]; L[TMW][TMZ] = -L[TMZ][TMW]; } /* contraction of various tensors */ static inline Hg4Coord Hg4ContractPiQi(Hg4Tensor1 pl, Hg4Tensor1 pt) { Hg4Coord sum; sum = 0.; sum += pl[TMX] * pt[TMX]; sum += pl[TMY] * pt[TMY]; sum += pl[TMZ] * pt[TMZ]; sum += pl[TMW] * pt[TMW]; return sum; } static inline void Hg4AntiContractPijQj(Hg4Tensor2 L, Hg4Tensor1 p1, Hg4Tensor1 p2) { Hg4Coord x, y, z, w; Hg4Coord xy, xz, xw, yz, yw, zw; x = p1[TMX]; y = p1[TMY]; z = p1[TMZ]; w = p1[TMW]; xy = L[TMX][TMY]; xz = L[TMX][TMZ]; xw = L[TMX][TMW]; yz = L[TMY][TMZ]; yw = L[TMY][TMW]; zw = L[TMZ][TMW]; p2[TMX] = xy * y + xz * z + xw * w; p2[TMY] = -xy * x + yz * z + yw * w; p2[TMZ] = -xz * x - yz * y + zw * w; p2[TMW] = -xw * x - yw * y - zw * z; } static inline void Hg4ContractPijQjk(Hg4Tensor2 a, Hg4Tensor2 b, Hg4Tensor2 c) { Hg4Tensor2 d; int i, j, k; /* This can be made more efficient */ for( i=0; i<4; i++ ) for( j=0; j<4; j++ ) { d[i][j] = 0.; for( k=0; k<4; k++ ) d[i][j] += a[i][k] * b[k][j]; } Hg4Copy2( d, c ); } static inline Hg4Coord Hg4ContractPii(Hg4Tensor2 L) { return L[TMX][TMX] + L[TMY][TMY] + L[TMZ][TMZ] + L[TMW][TMW]; } static inline int Hg4Intersect2(Hg4Tensor2 L, Hg4Tensor1 a, Hg4Tensor1 b) { Hg4AntiContractPijQj( L, a, b ); return Hg4Undefined( b ); } static inline int Hg4Intersect3(Hg4Tensor1 a, Hg4Tensor1 b, Hg4Tensor1 c, Hg4Tensor1 p, int dual) { Hg4Tensor2 L; Hg4AntiProductPiQj( L, a, b ); if( dual ) Hg4Dual( L, L ); Hg4AntiContractPijQj( L, c, p ); return Hg4Undefined( p ); } /* ** Hg4Intersect4 - predicate which tests for 3d line intersection and ** if an intersection is found returns the point at which th ** two lines cross and the plane in which the two lines lie. ** ** Note: One of the lines should be in the "plane-form" and the ** other in the "point-form." ** ** Assume K is plane-form, L is point-form */ static inline int Hg4Intersect4(Hg4Tensor2 K, Hg4Tensor2 L, Hg4Tensor1 pl, Hg4Tensor1 pt) { int flag; int i, j; Hg4Tensor2 N; Hg4Coord t; Hg4ContractPijQjk( K, L, N ); Hg4From( pl, 0., 0., 0., 0. ); Hg4From( pt, 0., 0., 0., 0. ); t = Hg4ContractPii( N ); if( fzero(t) ) { /* Look for a non-zero row */ flag = 0; for( i=0; i<4; i++ ) { for( j=0; j<4; j++ ) { pt[j] = N[i][j]; if( !fzero( pt[j] ) ) flag++; } if( flag ) break; } /* Look for a non-zero col */ flag = 0; for( i=0; i<4; i++ ) { for( j=0; j<4; j++ ) { pl[j] = N[j][i]; if( !fzero( pl[j] ) ) flag++; } if( flag ) break; } } return fzero(t); } static inline void Hg4Dual(Hg4Tensor2 L, Hg4Tensor2 K) { Hg4Coord p, q, r, u, t, s; /* t = xy; xy = -zw; zw = -t; t = xz; xz = yw; yw = t; t = yz; yz = -xw; xw = -t; */ if( L != K ) Hg4Copy2( L, K ); p = K[TMX][TMY]; u = K[TMZ][TMW]; K[TMZ][TMW] = -p; K[TMW][TMZ] = p; K[TMX][TMY] = -u; K[TMY][TMX] = u; q = K[TMZ][TMX]; t = K[TMW][TMY]; K[TMY][TMW] = -q; K[TMW][TMY] = q; K[TMX][TMZ] = -t; K[TMZ][TMX] = t; s = K[TMY][TMZ]; r = K[TMX][TMW]; K[TMX][TMW] = -s; K[TMW][TMX] = s; K[TMY][TMZ] = -r; K[TMZ][TMY] = r; } #endif /* _GV_HG4_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geometry/hpoint3/hplane3.h0000644000175000001440000001307010532336601016543 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* ** hplane3.c - procedural interface to 3D plane geometry ** ** pat hanrahan */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_HPLANE3_H_ #define _GV_HPLANE3_H_ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "tolerance.h" #include "geomtypes.h" static inline HPlane3 *HPl3Create(void); static inline void HPl3Delete(HPlane3 *pl); static inline void HPl3Print(HPlane3 *pl); static inline void HPl3Copy(HPlane3 *pl1, HPlane3 *pl2); static inline void HPl3From(HPlane3 *pl, HPl3Coord a, HPl3Coord b, HPl3Coord c, HPl3Coord d); static inline int HPl3From3HPt3s(HPlane3 *pl, HPoint3 *pt1, HPoint3 *pt2, HPoint3 *pt3); static inline int HPl3From2HLn3s(HPlane3 *pl, HLine3 *ln1, HLine3 *ln2); static inline int HPl3IntersectHPl3(HPlane3 *pl1, HPlane3 *pl2, HLine3 *ln); static inline void HPl3Pencil( HPl3Coord t1, HPlane3 *pl1, HPl3Coord t2, HPlane3 *pl2, HPlane3 *pl3 ); static inline HPt3Coord HPl3DotHPt3(HPlane3 *pl, HPoint3 *pt); static inline int HPl3Undefined(HPlane3 *pl); static inline int HPl3Infinity(HPlane3 *pl); static inline int HPl3Compare(HPlane3 *pl1, HPlane3 *pl2); static inline int HPl3CoincidentHPt3(HPlane3 *pl, HPoint3 *pt); static inline int HPl3CoincidentHLn3(HPlane3 *pl, HLine3 *ln); static inline int HPl3CoincidentHPl3( HPlane3 *pl1, HPlane3 *pl2 ); static inline void HPl3Transform(Transform3 T, HPlane3 *pl1, HPlane3 *pl2); static inline void HPl3TransformN(Transform3 T, HPlane3 *pl1, HPlane3 *pl2, int n ); static inline void HPl3Dual(HPlane3 *pl, HPoint3 *pt); static inline void HPl3Perp(HPlane3 *pl, HPoint3 *pt); #include "hg4.h" #include "hline3.h" #include "transform3.h" static const HPlane3 HPl3Ideal = { 0., 0., 0., 1. }; static inline HPlane3 * HPl3Create(void) { return (HPlane3 *) Hg4Create(); } static inline void HPl3Delete( HPlane3 *pl ) { Hg4Delete( (Hg4Tensor1Ptr)pl ); } static inline void HPl3Print( HPlane3 *pl ) { Hg4Print( (Hg4Tensor1Ptr)pl ); } static inline void HPl3Copy( HPlane3 *pl1, HPlane3 *pl2 ) { Hg4Copy( (Hg4Tensor1Ptr)pl1, (Hg4Tensor1Ptr)pl2 ); } static inline void HPl3From( HPlane3 *pl, HPl3Coord a, HPl3Coord b, HPl3Coord c, HPl3Coord d ) { Hg4From( (Hg4Tensor1Ptr)pl, a, b, c, d ); } static inline int HPl3From3HPt3s( HPlane3 *pl, HPoint3 *pt1, HPoint3 *pt2, HPoint3 *pt3 ) { return Hg4Intersect3( (Hg4Tensor1Ptr)pt1, (Hg4Tensor1Ptr)pt2, (Hg4Tensor1Ptr)pt3, (Hg4Tensor1Ptr)pl, 1 ); } static inline int HPl3From2HLn3s( HPlane3 *pl, HLine3 *ln1, HLine3 *ln2 ) { HPoint3 pt; return HLn3IntersectHLn3( ln1, ln2, pl, &pt ); } static inline int HPl3IntersectHPl3( HPlane3 *pl1, HPlane3 *pl2, HLine3 *ln ) { return HLn3From2HPl3s( ln, pl1, pl2 ); } static inline void HPl3Pencil( HPl3Coord t1, HPlane3 *pl1, HPl3Coord t2, HPlane3 *pl2, HPlane3 *pl3 ) { Hg4Pencil( t1, (Hg4Tensor1Ptr)pl1, t2, (Hg4Tensor1Ptr)pl2, (Hg4Tensor1Ptr)pl3 ); } static inline HPt3Coord HPl3DotHPt3( HPlane3 *pl, HPoint3 *pt ) { return Hg4ContractPiQi( (Hg4Tensor1Ptr)pl, (Hg4Tensor1Ptr)pt ); } static inline int HPl3Undefined( HPlane3 *pl ) { return Hg4Undefined( (Hg4Tensor1Ptr)pl ); } static inline int HPl3Infinity( HPlane3 *pl ) { return Hg4Infinity( (Hg4Tensor1Ptr) pl, 1 ); } static inline int HPl3Compare( HPlane3 *pl1, HPlane3 *pl2 ) { return Hg4Compare( (Hg4Tensor1Ptr)pl1, (Hg4Tensor1Ptr)pl2 ); } static inline int HPl3CoincidentHPt3( HPlane3 *pl, HPoint3 *pt ) { return fzero(HPl3DotHPt3(pl,pt)); } static inline int HPl3CoincidentHLn3( HPlane3 *pl, HLine3 *ln ) { HPoint3 pt; return HLn3IntersectHPl3( ln, pl, &pt ); } static inline int HPl3CoincidentHPl3( HPlane3 *pl1, HPlane3 *pl2 ) { return Hg4Coincident( (Hg4Tensor1Ptr)pl1, (Hg4Tensor1Ptr)pl2 ); } static inline void HPl3Transform( Transform3 T, HPlane3 *pl1, HPlane3 *pl2 ) { Hg4Transform( T, (Hg4Tensor1Ptr)pl1, (Hg4Tensor1Ptr)pl2 ); } static inline void HPl3TransformN( Transform3 T, HPlane3 *pl1, HPlane3 *pl2, int n ) { while( n-- ) Hg4Transform( T, (Hg4Tensor1Ptr)pl1++, (Hg4Tensor1Ptr)pl2++ ); } static inline void HPl3Dual( HPlane3 *pl, HPoint3 *pt ) { pt->x = pl->a; pt->y = pl->b; pt->z = pl->c; pt->w = pl->d; } static inline void HPl3Perp( HPlane3 *pl, HPoint3 *pt ) { /* HLine3 ln, lndual; HQuadric Q; HLn3From2HPl3s( &ln, pl, &HPl3Ideal ); HLn3CorrelateHLn3( &ln, Q, &lndual ); HLn3Perp( &lndual, pt ): */ /* if HPl3Ideal == (0,0,0,1) */ pt->x = pl->a; pt->y = pl->b; pt->z = pl->c; pt->w = 0; } #endif /* _GV_HPLANE3_H_ */ geomview-1.9.4/src/lib/geometry/hpoint3/Makefile.am0000644000175000001440000000041210604514331017066 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers\ hg4.h hline3.h hplane3.h hpoint3.h line.h plane.h point.h tolerance.h #noinst_LTLIBRARIES = libhpoint3.la # #libhpoint3_la_SOURCES = \ # hg4.h hline3.h hplane3.h hpoint3.h line.h plane.h point.h tolerance.h geomview-1.9.4/src/lib/geometry/hpoint3/Makefile.in0000644000175000001440000002517610665240501017117 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/hpoint3 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers\ hg4.h hline3.h hplane3.h hpoint3.h line.h plane.h point.h tolerance.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/hpoint3/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/hpoint3/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am #noinst_LTLIBRARIES = libhpoint3.la # #libhpoint3_la_SOURCES = \ # hg4.h hline3.h hplane3.h hpoint3.h line.h plane.h point.h tolerance.h # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geometry/hpoint3/tolerance.h0000644000175000001440000000241610532313651017167 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_TOLERANVE_H_ # define _GV_TOLERANVE_H_ /* FLT_EPSILON: 1.19209290e-7F */ # define TOLERANCE 1e-6 # define fneg(a) ((a)<-TOLERANCE) # define fpos(a) ((a)> TOLERANCE) # define fzero(a) (((a)-TOLERANCE)) # define fz(a) fzero(a) # define fnz(a) (!fzero(a)) #endif geomview-1.9.4/src/lib/geometry/hpoint3/line.h0000644000175000001440000000322310455701001016131 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef LINEDEFS #define LINEDEFS #include "hline3.h" typedef HLine3 Line; #define LnCreate HLn3Create #define LnDelete HLn3Delete #define LnPrint HLn3Print #define LnCopy HLn3Copy #define LnFrom2Pts HLn3From2HPt3s #define LnFrom2Pls HLn3From2HPl3s #define LnUndefined HLn3Undefined #define LnInfinity HLn3Infinity #define LnCompare HLn3Compare #define LnCoincidentPt HLn3CoincidentHPt3 #define LnCoincidentLn HLn3CoincidentHLn3 #define LnCoincidentPl HLn3CoincidentHPl3 #define LnTransform HLn3Transform #define LnIntersectPt HLn3IntersectHPt3 #define LnIntersectPl HLn3IntersectHPl3 #define LnIntersectLn HLn3IntersectHLn3 #define LnDual HLn3Dual #define LnPerp HLn3Perp #endif geomview-1.9.4/src/lib/geometry/hpoint3/plane.h0000644000175000001440000000351310455701001016303 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef PLANEDEFS #define PLANEDEFS #include "hplane3.h" typedef HPlane3 Plane; #define PlCreate HPl3Create #define PlDelete HPl3Delete #define PlPrint HPl3Print #define PlCopy HPl3Copy #define PlFrom HPl3From #define PlFrom3Pls HPl3From3HPl3s #define PlFrom2Lns HPl3From2HLn3s #define PlIntersectPl HPl3IntersectHPl3 #define PlPencil HPl3Pencil #define PlDotPt HPl3DotHPt3 /* Not used? mbp Tue May 16 16:51:40 2000 */ /*#define PlNormalize HPl3Normalize*/ #define PlUndefined HPl3Undefined #define PlInfinity HPl3Infinity #define PlCompare HPl3Compare #define PlCoincidentPl HPl3CoincidentHPl3 #define PlCoincidentLn HPl3CoincidentHLn3 #define PlCoincidentPl HPl3CoincidentHPl3 #define PlTransform HPl3Transform #define PlTransformN HPl3TransformN #define PlDual HPl3Dual #define PlIdeal HPl3Ideal #define PlPerp HPl3Perp #define PlAngle HPl3Angle #endif geomview-1.9.4/src/lib/geometry/hpoint3/point.h0000644000175000001440000000344710455701001016343 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef POINTDEFS #define POINTDEFS #include "hpoint3.h" typedef HPoint3 Point; #define PtCreate HPt3Create #define PtDelete HPt3Delete #define PtPrint HPt3Print #define PtCopy HPt3Copy #define PtFrom HPt3From #define PtFrom3Pls HPt3From3HPl3s #define PtFrom2Lns HPt3From2HLn3s #define PtIntersectPt HPt3IntersectHPt3 #define PtPencil HPt3Pencil #define PtDotPl HPt3DotHPl3 #define PtNormalize HPt3Normalize #define PtUndefined HPt3Undefined #define PtInfinity HPt3Infinity #define PtCompare HPt3Compare #define PtCoincidentPt HPt3CoincidentHPt3 #define PtCoincidentLn HPt3CoincidentHLn3 #define PtCoincidentPl HPt3CoincidentHPl3 #define PtTransform HPt3Transform #define PtTransformN HPt3TransformN #define PtDistance HPt3Distance #define PtDual HPt3Dual #define PtLinSum HPt3LinSum #define PtSizeOne HPt3SizeOne #endif geomview-1.9.4/src/lib/geometry/hpoint3/hpoint3.h0000644000175000001440000004507110622716747016620 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* ** hpoint3.h - procedural interface to 3D point geometry ** ** pat hanrahan */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_HPOINT3_H_ #define _GV_HPOINT3_H_ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "tolerance.h" /* for safety we make forward declarations for all functions defined * * here, only then we include other header files containing inline * functions, they will follow the same scheme and everything will * work. */ #include "geomtypes.h" static inline HPoint3 *HPt3Create(void); static inline void HPt3Delete(HPoint3 *pt); static inline void HPt3Print(HPoint3 *pt); static inline void HPt3Copy(HPoint3 *pt1, HPoint3 *pt2); static inline void HPt3Add(HPoint3 *pt1, HPoint3 *pt2, HPoint3 *pt3); static inline void HPt3From(HPoint3 *pt, HPt3Coord x, HPt3Coord y, HPt3Coord z, HPt3Coord w); static inline int HPt3From3HPl3s(HPoint3 *pt, HPlane3 *pl1, HPlane3 *pl2, HPlane3 *pl3); static inline int HPt3From2HLn3s( HPoint3 *pt, HLine3 *ln1, HLine3 *ln2 ); static inline int HPt3IntersectHPt3( HPoint3 *pt1, HPoint3 *pt2, HLine3 *ln ); static inline void HPt3Pencil(HPt3Coord t1, HPoint3 *pt1, HPt3Coord t2, HPoint3 *pt2, HPoint3 *pt3 ); static inline HPt3Coord HPt3DotHPl3(HPoint3 *pt, HPlane3 *pl); static inline int HPt3Compare(HPoint3 *pt1, HPoint3 *pt2); static inline int HPt3Undefined(HPoint3 *pt); static inline int HPt3Infinity(HPoint3 *pt); static inline int HPt3CoincidentHPl3(HPoint3 *pt, HPlane3 *pl); static inline int HPt3CoincidentHLn3(HPoint3 *pt, HLine3 *ln); static inline int HPt3CoincidentHPt3(HPoint3 *pt1, HPoint3 *pt2); static inline void HPt3Transform(Transform3 T, HPoint3 *pt1, HPoint3 *pt2); static inline int HPt3TransformN(Transform3 T, HPoint3 *pt1, HPoint3 *pt2, int n); static inline HPt3Coord HPt3TransPt3(Transform3 T, HPoint3 *pin, Point3 *pout); static inline void Pt3ToHPt3(Point3 *v3, HPoint3 *v4, int n); static inline void HPt3ToPt3(HPoint3 *hp, Point3 *p); static inline void Pt4ToHPt3(HPoint3 *pt4, int *axes, HPoint3 *hp3); static inline void HPt3Dehomogenize(HPoint3 *hp1, HPoint3 *hp2); static inline void HPt3Dual(HPoint3 *pt, HPlane3 *pl); static inline void HPt3LinSum(HPt3Coord scale1, HPoint3 *in1, HPt3Coord scale2, HPoint3 *in2, HPoint3 *out); static inline void HPt3LinSumDenorm(HPt3Coord scale1, HPoint3 *in1, HPt3Coord scale2, HPoint3 *in2, HPoint3 *out); static inline void HPt3SizeOne(HPoint3 *pt, HPoint3 *out); static inline HPt3Coord HPt3R40Dot(HPoint3 *a, HPoint3 *b); static inline HPt3Coord HPt3R31Dot(HPoint3 *a, HPoint3 *b); static inline HPt3Coord HPt3R30Dot(HPoint3 *a, HPoint3 *b); static inline HPt3Coord HPt3SpaceDot(HPoint3 *a, HPoint3 *b, int space); static inline HPt3Coord HPt3DotPt3(HPoint3 *a, Point3 *b); static inline void HPt3R40Normalize(HPoint3 *a); static inline void HPt3R31Normalize(HPoint3 *a); static inline void HPt3R30Normalize(HPoint3 *a); static inline void HPt3SpaceNormalize(HPoint3 *a, int space); static inline HPt3Coord HPt3HypDistance(HPoint3 *a, HPoint3 *b); static inline HPt3Coord HPt3Distance(HPoint3 *a, HPoint3 *b); static inline HPt3Coord HPt3SphDistance(HPoint3 *a, HPoint3 *b); static inline HPt3Coord HPt3SpaceDistance(HPoint3 *a, HPoint3 *b, int space); static inline void HPt3Sub(HPoint3 *a, HPoint3 *b, HPoint3 *aminusb); static inline void HPt3Scale(HPt3Coord s, HPoint3 *a, HPoint3 *sa); static inline void HPt3GramSchmidt(HPoint3 *base, HPoint3 *v); static inline void HPt3HypGramSchmidt(HPoint3 *base, HPoint3 *v); static inline void HPt3SphGramSchmidt(HPoint3 *base, HPoint3 *v); static inline void HPt3SpaceGramSchmidt(HPoint3 *base, HPoint3 *v, int space); #if 0 static inline HPt3Coord HPt3Angle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2); static inline HPt3Coord HPt3HypAngle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2); static inline HPt3Coord HPt3SphAngle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2); static inline HPt3Coord HPt3SpaceAngle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2, int space); #endif static inline void HPt3SubPt3(HPoint3 *p1, HPoint3 *p2, Point3 *v); static inline void HPt3MinMax(HPoint3 *min, HPoint3 *max, HPoint3 *other); static inline void Pt3MinMax(HPoint3 *min, HPoint3 *max, HPoint3 *other); static inline void Pt4MinMax(HPoint3 *min, HPoint3 *max, HPoint3 *other); #include "hg4.h" #include "hline3.h" #include "hplane3.h" #include "point3.h" static inline HPoint3 *HPt3Create(void) { return (HPoint3 *) Hg4Create(); } static inline void HPt3Delete( HPoint3 *pt ) { Hg4Delete( (Hg4Tensor1Ptr) pt ); } static inline void HPt3Print( HPoint3 *pt ) { Hg4Print( (Hg4Tensor1Ptr) pt ); } static inline void HPt3Copy(HPoint3 *pt1, HPoint3 *pt2) { *pt2 = *pt1; } static inline void HPt3Add(HPoint3 *pt1, HPoint3 *pt2, HPoint3 *pt3) { Hg4Add( (Hg4Tensor1Ptr) pt1, (Hg4Tensor1Ptr) pt2 , (Hg4Tensor1Ptr) pt3); } static inline void HPt3From(HPoint3 *pt, HPt3Coord x, HPt3Coord y, HPt3Coord z, HPt3Coord w) { Hg4From( (Hg4Tensor1Ptr)pt, x, y, z, w ); } static inline int HPt3From3HPl3s( HPoint3 *pt, HPlane3 *pl1, HPlane3 *pl2, HPlane3 *pl3 ) { return Hg4Intersect3( (Hg4Tensor1Ptr)pl1, (Hg4Tensor1Ptr)pl2, (Hg4Tensor1Ptr)pl3, (Hg4Tensor1Ptr)pt, 1 ); } static inline int HPt3From2HLn3s( HPoint3 *pt, HLine3 *ln1, HLine3 *ln2 ) { HPlane3 pl; return HLn3IntersectHLn3( ln1, ln2, &pl, pt ); } static inline int HPt3IntersectHPt3( HPoint3 *pt1, HPoint3 *pt2, HLine3 *ln ) { return HLn3From2HPt3s( ln, pt1, pt2 ); } static inline void HPt3Pencil( HPt3Coord t1, HPoint3 *pt1, HPt3Coord t2, HPoint3 *pt2, HPoint3 *pt3 ) { Hg4Pencil( t1, (Hg4Tensor1Ptr)pt1, t2, (Hg4Tensor1Ptr)pt2, (Hg4Tensor1Ptr)pt3); } static inline HPt3Coord HPt3DotHPl3( HPoint3 *pt, HPlane3 *pl ) { return Hg4ContractPiQi( (Hg4Tensor1Ptr)pt, (Hg4Tensor1Ptr)pl ); } static inline int HPt3Compare( HPoint3 *pt1, HPoint3 *pt2 ) { return Hg4Compare( (Hg4Tensor1Ptr)pt1, (Hg4Tensor1Ptr)pt2 ); } static inline int HPt3Undefined( HPoint3 *pt ) { return Hg4Undefined( (Hg4Tensor1Ptr)pt ); } static inline int HPt3Infinity( HPoint3 *pt ) { return Hg4Infinity( (Hg4Tensor1Ptr)pt, 0 ); } static inline int HPt3CoincidentHPl3( HPoint3 *pt, HPlane3 *pl ) { return fzero(HPt3DotHPl3(pt,pl)); } static inline int HPt3CoincidentHLn3( HPoint3 *pt, HLine3 *ln ) { HPlane3 pl; return HLn3IntersectHPt3( ln, pt, &pl ); } static inline int HPt3CoincidentHPt3( HPoint3 *pt1, HPoint3 *pt2 ) { return Hg4Coincident( (Hg4Tensor1Ptr)pt1, (Hg4Tensor1Ptr)pt2 ); } /* * pt2 = pt1 * T */ static inline void HPt3Transform(Transform3 T, HPoint3 *pt1, HPoint3 *pt2) { HPt3Coord x = pt1->x, y = pt1->y, z = pt1->z, w = pt1->w; pt2->x = x*T[0][0] + y*T[1][0] + z*T[2][0] + w*T[3][0]; pt2->y = x*T[0][1] + y*T[1][1] + z*T[2][1] + w*T[3][1]; pt2->z = x*T[0][2] + y*T[1][2] + z*T[2][2] + w*T[3][2]; pt2->w = x*T[0][3] + y*T[1][3] + z*T[2][3] + w*T[3][3]; } static inline int HPt3TransformN(Transform3 T, HPoint3 *pt1, HPoint3 *pt2, int n) { int res = 0; while (--n >= 0) { HPt3Transform(T, pt1++, pt2); if ((pt2++)->w != 1.0) { res = 1; } } return res; } /* * Transform and project an HPoint3 onto a plain Point3. * Transforms pin . T -> pout, * then projects pout.{x,y,z} /= pout.w. * Returns pout.w. */ static inline HPt3Coord HPt3TransPt3( Transform3 T, HPoint3 *pin, Point3 *pout ) { HPoint3 tp; HPt3Transform( T, pin, &tp ); if(tp.w != 1.0 && tp.w != 0.0) { pout->x = tp.x / tp.w; pout->y = tp.y / tp.w; pout->z = tp.z / tp.w; } else { *pout = *(Point3 *)(void *)&tp; } return tp.w; } /* * Pt3ToHPt4: convert 3-vectors to 4-vectors by padding with 1.0 's. * * Charlie Gunn * Nov 26, 1991: originally written */ static inline void Pt3ToHPt3(Point3 *v3, HPoint3 *v4, int n) { int i; for (i = 0; i < n; ++i) { *(Point3 *)&v4[i] = v3[i]; v4[i].w = 1.0; } } static inline void HPt3ToPt3( HPoint3 *hp, Point3 *p ) { if(hp->w == 1.0 || hp->w == 0.0) { *p = *(Point3 *)hp; } else { p->x = hp->x / hp->w; p->y = hp->y / hp->w; p->z = hp->z / hp->w; } } /* Transform a 4-point to a 3-point according to the mapping defined * in "axes" */ static inline void Pt4ToHPt3(HPoint3 *pt4, int *axes, HPoint3 *hp3) { HPt3Coord *from = (HPt3Coord *)pt4, *to = (HPt3Coord *)hp3; HPoint3 tmp; int i; if (!axes) { if (pt4 != hp3) { hp3->x = pt4->x; hp3->y = pt4->y; hp3->z = pt4->z; } hp3->w = 1.0; return; } if (pt4 == hp3) { tmp = *pt4; from = (HPt3Coord *)&tmp; } for (i = 0; i < 3; i++) { if (axes[i] > 3) { to[i] = 0.0; } else if (axes[i] != -1) { to[i] = from[axes[i]]; } } hp3->w = 1.0; } /* also need an in-place dehomogenization routine which sets the w-coordinate to 1.0, unless the original one is zero */ static inline void HPt3Dehomogenize(HPoint3 *hp1, HPoint3 *hp2) { HPt3Coord inv; if (hp1->w == 1.0 || hp1->w == 0.0) { if (hp2 != hp1) *hp2 = *hp1; return; } /* else if ( || hp->w == 0.0) hp->w = .000001;*/ inv = 1.0 / hp1->w; hp2->x = hp1->x * inv; hp2->y = hp1->y * inv; hp2->z = hp1->z * inv; hp2->w = 1.0; } /* Fishy procedure */ static inline void HPt3Dual( HPoint3 *pt, HPlane3 *pl ) { pl->a = pt->x; pl->b = pt->y; pl->c = pt->z; pl->d = pt->w; } static inline void HPt3LinSum (HPt3Coord scale1, HPoint3 *in1, HPt3Coord scale2, HPoint3 *in2, HPoint3 *out) { if ((in1->w == 0) || (in2->w == 0)) { out->w = 0; out->x = scale1 * in1->x + scale2 * in2->x; out->y = scale1 * in1->y + scale2 * in2->y; out->z = scale1 * in1->z + scale2 * in2->z; return; } out->w = 1; out->x = scale1 * (in1->x/in1->w) + scale2 * (in2->x/in2->w); out->y = scale1 * (in1->y/in1->w) + scale2 * (in2->y/in2->w); out->z = scale1 * (in1->z/in1->w) + scale2 * (in2->z/in2->w); } static inline void HPt3LinSumDenorm(HPt3Coord scale1, HPoint3 *in1, HPt3Coord scale2, HPoint3 *in2, HPoint3 *out) { if ((in1->w == 0) || (in2->w == 0)) { out->w = 0; out->x = scale1 * in1->x + scale2 * in2->x; out->y = scale1 * in1->y + scale2 * in2->y; out->z = scale1 * in1->z + scale2 * in2->z; return; } out->w = scale1 * in1->w + scale2 * in2->w; scale1 = scale1 * out->w / in1->w; scale2 = scale2 * out->w / in2->w; out->x = scale1 * in1->x + scale2 * in2->x; out->y = scale1 * in1->y + scale2 * in2->y; out->z = scale1 * in1->z + scale2 * in2->z; } static inline void HPt3SizeOne ( HPoint3 *pt, HPoint3 *out ) { HPt3Coord size; size = sqrt (pt->x * pt->x + pt->y * pt->y + pt->z * pt->z); if (size == 0) return; out->x = pt->x / size; out->y = pt->y / size; out->z = pt->z / size; out->w = 1.; } /* inner product of R4 */ static inline HPt3Coord HPt3R40Dot(HPoint3 *a, HPoint3 *b) { return a->x*b->x + a->y*b->y + a->z*b->z + a->w*b->w; } /* inner product of R(3,1) */ static inline HPt3Coord HPt3R31Dot(HPoint3 *a, HPoint3 *b) { return a->x*b->x + a->y*b->y + a->z*b->z - a->w*b->w; } /* inner product of R(3,0) */ static inline HPt3Coord HPt3R30Dot(HPoint3 *a, HPoint3 *b) { double w2 = a->w*b->w; if (w2 == 1.0 || w2 == 0.0) return a->x*b->x + a->y*b->y + a->z*b->z; else return (a->x*b->x + a->y*b->y + a->z*b->z) / w2; } static inline HPt3Coord HPt3SpaceDot(HPoint3 *a, HPoint3 *b, int space) { switch (space) { case TM_EUCLIDEAN: default: return HPt3R30Dot(a,b); break; case TM_HYPERBOLIC: return HPt3R31Dot(a,b); break; case TM_SPHERICAL: return HPt3R40Dot(a,b); break; } } static inline HPt3Coord HPt3DotPt3(HPoint3 *a, Point3 *b) { HPt3Coord scp; scp = a->x*b->x + a->y*b->y + a->z*b->z; if (a->w != 0 && a->w != 1.0) { return scp / a->w; } else { return scp; } } /* normalize a point a in R4 so that = 1 */ static inline void HPt3R40Normalize(HPoint3 *a) { float len = sqrt( (double)(HPt3R40Dot(a,a)) ); if (len > 0) { len = 1 / len; a->x *= len; a->y *= len; a->z *= len; a->w *= len; } } /* normalize a point a in R(3,1) so that = sign() */ static inline void HPt3R31Normalize(HPoint3 *a) { float len = sqrt( fabs( (double)(HPt3R31Dot(a,a)) ) ); if (len > 0) { len = 1 / len; a->x *= len; a->y *= len; a->z *= len; a->w *= len; } } /* normalize a point a in R(3,0) so that = 1 */ static inline void HPt3R30Normalize(HPoint3 *a) { float len = sqrt( (double)(HPt3R30Dot(a,a)) ); if (len > 0) { len = 1 / len; a->x *= len; a->y *= len; a->z *= len; } } static inline void HPt3SpaceNormalize(HPoint3 *a, int space) { switch (space) { case TM_EUCLIDEAN: default: HPt3R30Normalize(a); break; case TM_HYPERBOLIC: HPt3R31Normalize(a); break; case TM_SPHERICAL: HPt3R40Normalize(a); break; } } static inline HPt3Coord HPt3HypDistance(HPoint3 *a, HPoint3 *b) { float aa, bb, ab; aa = HPt3R31Dot(a,a); bb = HPt3R31Dot(b,b); ab = HPt3R31Dot(a,b); return acosh( fabs(ab / sqrt( aa * bb ) )); } static inline HPt3Coord HPt3Distance(HPoint3 *a, HPoint3 *b) { float dx, dy, dz; float w1w2; w1w2 = a->w * b->w; if( w1w2 == 0. ) return 0.; dx = b->w * a->x - b->x * a->w; dy = b->w * a->y - b->y * a->w; dz = b->w * a->z - b->z * a->w; return (sqrt( dx*dx + dy*dy + dz*dz )) / w1w2; } static inline HPt3Coord HPt3SphDistance(HPoint3 *a, HPoint3 *b) { return acos( HPt3R40Dot(a,b) / sqrt( HPt3R40Dot(a,a) * HPt3R40Dot(b,b) ) ); } static inline HPt3Coord HPt3SpaceDistance(HPoint3 *a, HPoint3 *b, int space) { switch (space) { case TM_EUCLIDEAN: default: return HPt3Distance(a,b); break; case TM_HYPERBOLIC: return HPt3HypDistance(a,b); break; case TM_SPHERICAL: return HPt3SphDistance(a,b); break; } } static inline void HPt3Sub(HPoint3 *a, HPoint3 *b, HPoint3 *aminusb) { aminusb->x = a->x - b->x; aminusb->y = a->y - b->y; aminusb->z = a->z - b->z; aminusb->w = a->w - b->w; } static inline void HPt3Scale(HPt3Coord s, HPoint3 *a, HPoint3 *sa) { sa->x = s * a->x; sa->y = s * a->y; sa->z = s * a->z; sa->w = s * a->w; } static inline void HPt3GramSchmidt(HPoint3 *base, HPoint3 *v) { HPt3SpaceGramSchmidt(base, v, TM_EUCLIDEAN); } static inline void HPt3HypGramSchmidt(HPoint3 *base, HPoint3 *v) { HPt3SpaceGramSchmidt(base, v, TM_HYPERBOLIC); } static inline void HPt3SphGramSchmidt(HPoint3 *base, HPoint3 *v) { HPt3SpaceGramSchmidt(base, v, TM_SPHERICAL); } /* Modifies v to arrange that = 0, i.e. v is a tangent vector based at base */ static inline void HPt3SpaceGramSchmidt(HPoint3 *base, HPoint3 *v, int space) { HPt3Coord d,e; HPoint3 tmp; d = HPt3SpaceDot(base,v,space); e = HPt3SpaceDot(base,base,space); if (e == 0.0) { fprintf(stderr, "GramSchmidt: invalid base point.\n"); e = 1.0; } HPt3Scale((HPt3Coord)(d / e), base, &tmp); HPt3Sub(v, &tmp, v); } #if 0 /* This stuff doesn't compile yet; in progress: */ static inline HPt3Coord HPt3Angle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2) { /* * I'm not sure that this will work in the euclidean case!!! mbp */ return HPt3SpaceAngle(base, v1, v2, TM_EUCLIDEAN); } static inline HPt3Coord HPt3HypAngle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2) { return HPt3SpaceAngle(base, v1, v2, TM_HYPERBOLIC); } static inline HPt3Coord HPt3SphAngle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2) { return HPt3SpaceAngle(base, v1, v2, TM_SPHERICAL); } static inline HPt3Coord HPt3SpaceAngle(HPoint3 *base, HPoint3 *v1, HPoint3 *v2, int space) { double d, n; HPoint3 v1n = *v1; HPoint3 v2n = *v2; HPt3SpaceGramSchmidt(base, &v1n, space); HPt3SpaceGramSchmidt(base, &v2n, space); d = HPt3SpaceDot(&v1n,&v1n,space) * HPt3SpaceDot(&v2n,&v2n,space); if (d <= 0.0) { fprintf(stderr,"HPt3SpaceAngle: invalid denominator\n"); return 0.0; } n = HPt3SpaceDot(&v1n, &v2n, space); return acos( n / sqrt(d) ); } #endif static inline void HPt3SubPt3(HPoint3 *p1, HPoint3 *p2, Point3 *v) { if (p1->w == p2->w) { v->x = p1->x - p2->x; v->y = p1->y - p2->y; v->z = p1->z - p2->z; } else if (p1->w == 0) { *v = *(Point3 *)p1; return; } else if (p2->w == 0) { *v = *(Point3 *)p2; Pt3Mul(-1.0, v, v); return; } else { HPt3Coord s = p2->w / p1->w; v->x = p1->x*s - p2->x; v->y = p1->y*s - p2->y; v->z = p1->z*s - p2->z; } if(p2->w != 1.0 && p2->w != 0.0) v->x /= p2->w, v->y /= p2->w, v->z /= p2->w; } /* assume that min and max are dehomogenized */ static inline void HPt3MinMax(HPoint3 *min, HPoint3 *max, HPoint3 *other) { HPt3Coord oc = other->w; if (oc == 0.0) { oc = 1.0; } if(oc * min->x > other->x) min->x = other->x / oc; else if(oc * max->x < other->x) max->x = other->x / oc; if(oc * min->y > other->y) min->y = other->y / oc; else if(oc * max->y < other->y) max->y = other->y / oc; if(oc * min->z > other->z) min->z = other->z / oc; else if(oc * max->z < other->z) max->z = other->z / oc; } static inline void Pt3MinMax(HPoint3 *min, HPoint3 *max, HPoint3 *other) { if(min->x > other->x) min->x = other->x; else if(max->x < other->x) max->x = other->x; if(min->y > other->y) min->y = other->y; else if(max->y < other->y) max->y = other->y; if(min->z > other->z) min->z = other->z; else if(max->z < other->z) max->z = other->z; } static inline void Pt4MinMax(HPoint3 *min, HPoint3 *max, HPoint3 *other) { if(min->x > other->x) min->x = other->x; else if(max->x < other->x) max->x = other->x; if(min->y > other->y) min->y = other->y; else if(max->y < other->y) max->y = other->y; if(min->z > other->z) min->z = other->z; else if(max->z < other->z) max->z = other->z; if(min->w > other->w) min->w = other->w; else if(max->w < other->w) max->w = other->w; } #endif /* _GV_HPOINT3_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geometry/hpoint3/Headers0000644000175000001440000000010607730236414016341 00000000000000hg4.h hline3.h hplane3.h hpoint3.h line.h plane.h point.h tolerance.h geomview-1.9.4/src/lib/geometry/hpoint3/hline3.h0000644000175000001440000001557610532355566016423 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* ** hline3.h - procedural interface to 3D line geometry ** ** pat hanrahan */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef _GV_HLINE3_H_ #define _GV_HLINE3_H_ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "ooglutil.h" #include "geomtypes.h" static inline HLine3 *HLn3Create(void); static inline void HLn3Delete(HLine3 *ln); static inline void HLn3Print(HLine3 *ln); static inline void HLn3Copy(HLine3 *ln1, HLine3 *ln2); static inline int HLn3From2HPt3s(HLine3 *ln, HPoint3 *pt1, HPoint3 *pt2); static inline int HLn3From2HPl3s(HLine3 *ln, HPlane3 *pl1, HPlane3 *pl2); static inline int HLn3IntersectHPl3(HLine3 * ln, HPlane3 * pl, HPoint3 * pt); static inline int HLn3IntersectHPt3(HLine3 * ln, HPoint3 * pt, HPlane3 * pl); static inline int HLn3IntersectHLn3(HLine3 * ln1, HLine3 * ln2, HPlane3 * pl, HPoint3 * pt); static inline int HLn3Undefined(HLine3 * ln); static inline int HLn3Infinity(HLine3 * ln); static inline int HLn3Compare(HLine3 * ln1, HLine3 * ln2); static inline int HLn3CoincidentHPt3(HLine3 * ln, HPoint3 * pt); static inline int HLn3CoincidentHLn3(HLine3 * ln1, HLine3 * ln2); static inline int HLn3CoincidentHPl3(HLine3 * ln, HPlane3 * pl); static inline void HLn3Transform(Transform3 T, HLine3 * ln1, HLine3 * ln2); static inline void HLn3Dual(HLine3 * ln, HLine3 * lndual); static inline void HLn3Perp(HLine3 * ln, HLine3 * lnperp); #include "hg4.h" #include "hpoint3.h" #include "hplane3.h" #include "transform3.h" #define HLN3_POINT_FORM -1 #define HLN3_PLANE_FORM 1 #define HLN3_DUAL_FORM(f) (-(f)) static inline HLine3 *HLn3Create(void) { return OOGLNewE(HLine3, "HLine3"); } static inline void HLn3Delete(HLine3 *ln) { OOGLFree(ln); } static inline void HLn3Print(HLine3 *ln) { printf("ln(%s) \n", ln->type == HLN3_POINT_FORM ? "pt" : "pl"); Hg4Print2(ln->L); } static inline void HLn3Copy(HLine3 *ln1, HLine3 *ln2) { memcpy((char *) ln2, (char *) ln1, sizeof(HLine3)); } /* ** Form the anti-symmetric line tensor from two points. ** ** Note: pt * L = pl. ** (1) pl is the plane formed from the line and the pt. ** (2) each col of L is a plane containing the line. ** (3) if pl is identically 0 then the pt lies on the line. */ static inline int HLn3From2HPt3s(HLine3 *ln, HPoint3 *pt1, HPoint3 *pt2) { ln->type = HLN3_POINT_FORM; Hg4AntiProductPiQj(ln->L, (Hg4Tensor1Ptr)pt1, (Hg4Tensor1Ptr)pt2); return Hg4Undefined2(ln->L); } /* ** Form the anti-symmetric line tensor from two planes. ** ** Note: K * pl = pt. ** (1) pt is the point formed from the line and the pl. ** (2) each row of K is a point on the line. ** (3) if pt is identically 0 then the pl lies on the line. */ static inline int HLn3From2HPl3s(HLine3 *ln, HPlane3 *pl1, HPlane3 *pl2) { ln->type = HLN3_PLANE_FORM; Hg4AntiProductPiQj(ln->L, (Hg4Tensor1Ptr)pl1, (Hg4Tensor1Ptr)pl2); return Hg4Undefined2(ln->L); } static inline int HLn3IntersectHPl3(HLine3 * ln, HPlane3 * pl, HPoint3 * pt) { HLine3 aln; if (ln->type == HLN3_PLANE_FORM) { HLn3Dual(ln, &aln); ln = &aln; } return Hg4Intersect2(ln->L, (Hg4Tensor1Ptr)pl, (Hg4Tensor1Ptr)pt); } static inline int HLn3IntersectHPt3(HLine3 * ln, HPoint3 * pt, HPlane3 * pl) { HLine3 aln; if (ln->type == HLN3_POINT_FORM) { HLn3Dual(ln, &aln); ln = &aln; } return Hg4Intersect2(ln->L, (Hg4Tensor1Ptr)pt, (Hg4Tensor1Ptr)pl); } /* ** predicate which tests for 3d line intersection and ** if an intersection is found returns the point at which th ** two lines cross and the plane in which the two lines lie. ** ** Note: One of the lines should be in the "plane-form" and the ** other in the "point-form." */ static inline int HLn3IntersectHLn3(HLine3 * ln1, HLine3 * ln2, HPlane3 * pl, HPoint3 * pt) { HLine3 ln; if (ln1->type == ln2->type) { Hg4Dual((Hg4Tensor2Ptr)(void *)ln2, (Hg4Tensor2Ptr)(void *)&ln); ln2 = &ln; } if (ln1->type == HLN3_POINT_FORM) return Hg4Intersect4(ln1->L, ln2->L, (Hg4Tensor1Ptr)pt, (Hg4Tensor1Ptr)pl); else return Hg4Intersect4(ln1->L, ln2->L, (Hg4Tensor1Ptr)pl, (Hg4Tensor1Ptr)pt); } static inline int HLn3Undefined(HLine3 * ln) { return Hg4Undefined2(ln->L); } static inline int HLn3Infinity(HLine3 * ln) { return Hg4Infinity2(ln->L, ln->type == HLN3_PLANE_FORM); } static inline int HLn3Compare(HLine3 * ln1, HLine3 * ln2) { /* Do the types have to agree? */ return Hg4Compare2(ln1->L, ln2->L); } static inline int HLn3CoincidentHPt3(HLine3 * ln, HPoint3 * pt) { HPlane3 pl; return HLn3IntersectHPt3(ln, pt, &pl); } static inline int HLn3CoincidentHLn3(HLine3 * ln1, HLine3 * ln2) { HPlane3 pl; HPoint3 pt; if (HLn3IntersectHLn3(ln1, ln2, &pl, &pt)) return HPl3Undefined(&pl); return 0; } static inline int HLn3CoincidentHPl3(HLine3 * ln, HPlane3 * pl) { HPoint3 pt; return HLn3IntersectHPl3(ln, pl, &pt); } static inline void HLn3Transform(Transform3 T, HLine3 * ln1, HLine3 * ln2) { /* Assume T is a point transform */ if (ln1->type == HLN3_PLANE_FORM) { HLn3Dual(ln1, ln2); Hg4Transform2(T, ln2->L, ln2->L); HLn3Dual(ln2, ln2); } else { Hg4Transform2(T, ln1->L, ln2->L); ln2->type = ln1->type; } } /* ** Convert the matrix formed from planes/points to that formed ** from points/planes. ** ** Note: ** (1) pu-qt+sr=0. ** (2) (s,q,p,0) is parallel to the line. ** (3) (-r,t,-u,0) is a plane containing the line and the origin. ** (4) K*L = 0. */ static inline void HLn3Dual(HLine3 * ln, HLine3 * lndual) { Hg4Dual(ln->L, lndual->L); lndual->type = HLN3_DUAL_FORM(ln->type); } static inline void HLn3Perp(HLine3 * ln, HLine3 * lnperp) { HPoint3 pt; HPlane3 pl; /* LnIntersectPl( ln, &HPl3Ideal, &pt ); */ HPt3Copy((HPoint3 *) ln->L[3], &pt); HPt3Dual(&pt, &pl); HLn3From2HPl3s(lnperp, &pl, (HPlane3 *)&HPl3Ideal); } #endif /* _GV_HLINE3_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geometry/hpointn/0000777000175000001440000000000010665240667015233 500000000000000geomview-1.9.4/src/lib/geometry/hpointn/Makefile.am0000644000175000001440000000021010604514331017155 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers hpointn.h #noinst_LTLIBRARIES = libhpointn.la # #libhpointn_la_SOURCES = hpointn.h geomview-1.9.4/src/lib/geometry/hpointn/Makefile.in0000644000175000001440000002477410665240501017215 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geometry/hpointn DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers hpointn.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geometry/hpointn/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geometry/hpointn/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am #noinst_LTLIBRARIES = libhpointn.la # #libhpointn_la_SOURCES = hpointn.h # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geometry/hpointn/hpointn.h0000644000175000001440000005573510624127173017005 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2006 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Pat Hanrahan, Stuart Levy, Tamara Munzner, * Mark Phillips, Claus-Justus Heine */ #ifndef _GV_HPOINTN_H_ #define _GV_HPOINTN_H_ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #ifndef alloca #include #endif #include #include #include #include "geomtypes.h" #include "freelist.h" extern DEF_FREELIST(HPointN); static inline HPointN *HPtNCreate(int dim, const HPtNCoord *vec); static inline void HPtNDelete(HPointN *pt); static inline HPointN *HPtNCopy(const HPointN *pt1, HPointN *pt2); static inline HPointN *Pt4ToHPtN(const HPoint3 *v4, HPointN *vN); static inline HPointN *Pt3ToHPtN(Point3 *v3, HPointN *vN); static inline HPointN *HPt3ToHPtN(const HPoint3 *v4, int *perm, HPointN *vN); static inline HPoint3 *HPtNToHPt3(const HPointN *from, int *axes, HPoint3 *hp3); static inline HPointN *HPtNPad(const HPointN *pt1, int dim2, HPointN *pt2); static inline HPointN *HPtNAdd(const HPointN *pt1, const HPointN *pt2, HPointN *sum); static inline int HPtNSpace(const HPointN *pt); static inline HPointN *HPtNSetSpace(HPointN *pt, int space); static inline HPointN *HPtNComb(HPtNCoord s1, const HPointN *pt1, HPtNCoord s2, const HPointN *pt2, HPointN *sum); static inline HPtNCoord HPtNDot(const HPointN *p1, const HPointN *p2); static inline HPtNCoord HPtNDehomogenize(const HPointN *from, HPointN *to); static inline HPointN *HPtNTransform3(Transform3 T, int *perm, const HPointN *from, HPointN *to); static inline HPointN *HPtNTransform(const TransformN *T, const HPointN *from, HPointN *to); static inline HPointN *HPtNTTransform(const TransformN *T, const HPointN *from, HPointN *to); static inline HPoint3 *HPtNTransProj(const TransformN *T, const HPointN *from, HPoint3 *result); static inline HPoint3 *HPtNTransformComponents(const TransformN *T, const HPointN *from, int *perm, HPoint3 *results); static inline HPointN *HPt3NTransform(const TransformN *T, const HPoint3 *from, HPointN *to); static inline HPointN *Pt4NTransform(const TransformN *T, const HPoint3 *from, HPointN *to); static inline HPt3Coord HPtNNTransPt3(TransformN *TN, int *axes, const HPointN *ptN, Point3 *result); static inline HPt3Coord HPt3NTransPt3(TransformN *TN, int *axes, const HPoint3 *hpt4, int v4d, Point3 *result); static inline void HPt3NTransHPt3(TransformN *TN, int *axes, const HPoint3 *hpt4, int v4d, HPoint3 *result); static inline void HPtNMinMax(HPointN *min, HPointN *max, HPointN *other); #include "transform3.h" #ifndef max # define _gv_hptn_max_ # define max(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef min # define _gv_hptn_min_ # define min(a,b) ((a) < (b) ? (a) : (b)) #endif static inline HPointN * HPtNCreate(int dim, const HPtNCoord *vec) { HPointN *pt; FREELIST_NEW(HPointN, pt); if(dim <= 0) dim = 1; pt->dim = dim; pt->flags = 0; /* for now */ pt->v = OOGLNewNE(HPtNCoord, dim, "new HPointN data"); if(vec == NULL) { memset(pt->v+1, 0, (dim-1)*sizeof(HPtNCoord)); pt->v[0] = 1.0; } else { memcpy(pt->v, vec, dim*sizeof(HPtNCoord)); } return pt; } static inline void HPtNDelete(HPointN *pt) { if(pt) { if(pt->v) OOGLFree(pt->v); FREELIST_FREE(HPointN, pt); } } static inline HPointN * HPtNCopy(const HPointN *pt1, HPointN *pt2) { if(pt2 == NULL) { pt2 = HPtNCreate(pt1->dim, pt1->v); } else { if(pt2->dim != pt1->dim) { pt2->v = OOGLRenewNE(HPtNCoord, pt2->v, pt1->dim, "renew HPointN"); pt2->dim = pt1->dim; } memcpy(pt2->v, pt1->v, pt1->dim*sizeof(HPtNCoord)); } return pt2; } /* Convert a HPoint3 into a HPointN while interpreting the HPoint3 as * a 4-point. This means that we do NOT perfom dehomogenization here. */ static inline HPointN * Pt4ToHPtN(const HPoint3 *v4, HPointN *vN) { int i; if (!vN) { vN = HPtNCreate(5, NULL); } else if (vN->dim < 5) { vN->v = OOGLRenewNE(HPtNCoord, vN->v, 5, "renew HPointN"); vN->dim = 5; } vN->v[0] = 1.0; for (i = 0; i < 4; ++i) { vN->v[i+1] = ((HPt3Coord *)v4)[i]; } for (++i; i < vN->dim; i++) { vN->v[i] = 0.0; } return vN; } /* Convert a Point3 into a HPointN */ static inline HPointN * Pt3ToHPtN(Point3 *v3, HPointN *vN) { int i; if (!vN) { vN = HPtNCreate(4, NULL); } else if (vN->dim < 4) { vN->v = OOGLRenewNE(HPtNCoord, vN->v, 4, "renew HPointN"); vN->dim = 5; } vN->v[0] = 1.0; for (i = 0; i < 3; ++i) { vN->v[i+1] = ((HPt3Coord *)v3)[i]; } for (++i; i < vN->dim; i++) { vN->v[i] = 0.0; } return vN; } /* Convert a HPoint3 into a HPointN while interpreting the HPoint3 as * a 3-point. The homogeneous component of v4 is moved to vN->v[0]. */ static inline HPointN * HPt3ToHPtN(const HPoint3 *v4, int *perm, HPointN *vN) { const int d3 = 4; int i; int perm_dim; if (!perm) { perm_dim = 4; } else { perm_dim = perm[0]; for (i = 0; i < d3; i++) { perm_dim = max(perm[i], perm_dim); } ++perm_dim; } if (!vN) { vN = HPtNCreate(perm_dim, NULL); } else if (vN->dim < perm_dim) { vN->v = OOGLRenewNE(HPtNCoord, vN->v, perm_dim, "renew HPointN"); vN->dim = perm_dim; } if (!perm) { vN->v[0] = v4->w; vN->v[1] = v4->x; vN->v[2] = v4->y; vN->v[3] = v4->z; for (i = 4; i < vN->dim; i++) { vN->v[i] = 0.0; } } else { memset(vN->v, 0, vN->dim*sizeof(HPtNCoord)); for (i = 0; i < d3; i++) { vN->v[perm[i]] = ((HPt3Coord *)v4)[i]; } } return vN; } /* Transform a 4-point to a 3-point according to the mapping defined * in "axes". */ static inline HPoint3 * HPtNToHPt3(const HPointN *from, int *axes, HPoint3 *hp3) { HPt3Coord *to = (HPt3Coord *)hp3; int i, dim = from->dim; if (!axes) { hp3->w = from->v[0]; hp3->x = from->v[1]; hp3->y = from->v[2]; hp3->z = from->v[3]; } else { for (i = 0; i < 4; i++) { if (axes[i] > dim-1) { to[i] = 0.0; } else { to[i] = from->v[axes[i]]; } } } return hp3; } /* Copy pt1 to pt2 and make sure that pt2 has dimension dim2. If * pt1->dim < dim2, then pt1 is implicitly padded with zeros. */ static inline HPointN * HPtNPad(const HPointN *pt1, int dim2, HPointN *pt2) { int dim1 = pt1->dim; if( dim2 < 1 ) { /* Uhh? */ return(NULL); } if(pt1 == NULL) { pt2 = HPtNCreate(dim2, NULL); return pt2; } if(pt1 != pt2) { if(pt2 == NULL) { pt2 = HPtNCreate(dim2,NULL); } else if (pt2->dim != dim2) { pt2->v = OOGLRenewNE(HPtNCoord, pt2->v, dim2, "renew HPointN"); pt2->dim = dim2; } if (dim1 <= dim2) { memcpy(pt2->v, pt1->v, dim1* sizeof(HPtNCoord)); memset(pt2->v+dim1, 0, (dim2-dim1)*sizeof(HPtNCoord)); } else { memcpy(pt2->v, pt1->v, dim2*sizeof(HPtNCoord)); } } else { /* now that the homogeneous component is at 0 this is a simple * padding operation. */ if (pt2->dim != dim2) { pt2->v = OOGLRenewNE(HPtNCoord, pt2->v, dim2, "renew HPointN"); } if (dim2 > pt2->dim) { memset(pt2->v+pt2->dim, 0, (dim2-pt2->dim)*sizeof(HPtNCoord)); } } return pt2; } /* Add two HPointN's */ static inline HPointN * HPtNAdd(const HPointN *pt1, const HPointN *pt2, HPointN *sum) { int dim1 = pt1->dim, dim2 = pt2->dim; HPtNCoord c1 = pt1->v[0], c2 = pt2->v[0]; int i; if (dim1 == dim2) { if (sum == NULL) { sum = HPtNCreate(dim1, NULL); } else if(sum->dim < dim1) { sum->v = OOGLRenewNE(HPtNCoord, sum->v, dim1, "renew HPointN"); sum->dim = dim1; } sum->v[0] = c1*c2; for (i = 1; i < dim1; i++) { sum->v[i] = c2*pt1->v[i] + c1*pt2->v[i]; } } else { /* make sure pt1 is the larger one */ if (dim1 < dim2) { const HPointN *swap = pt1; pt1 = pt2; pt2 = swap; dim2 = dim1; dim1 = pt1->dim; } if (sum == NULL) { sum = HPtNCreate(dim1,NULL); } else if(sum->dim < dim1) { sum->v = OOGLRenewNE(HPtNCoord, sum->v, dim1, "renew HPointN"); sum->dim = dim1; } sum->v[0] = c1*c2; for (i = 1; i < dim2; i++) { sum->v[i] = c2*pt1->v[i] + c1*pt2->v[i]; } for (; i < dim1; i++) { sum->v[i] = c2*pt1->v[i]; } } return sum; } /* Space */ static inline int HPtNSpace(const HPointN *pt) { return TM_EUCLIDEAN; } static inline HPointN * HPtNSetSpace(HPointN *pt, int space) { if (space != TM_EUCLIDEAN) { OOGLError(1, "Non-Euclidean space not support in higher dimensions.\n"); return NULL; } return pt; } /* Linear combination */ static inline HPointN * HPtNComb(HPtNCoord s1, const HPointN *pt1, HPtNCoord s2, const HPointN *pt2, HPointN *sum) { int dim1 = pt1->dim, dim2 = pt2->dim; HPtNCoord c1 = pt1->v[0], c2 = pt2->v[0]; int i; if (dim1 == dim2) { if (sum == NULL) { sum = HPtNCreate(dim1, NULL); } else if(sum->dim < dim1) { sum->v = OOGLRenewNE(HPtNCoord, sum->v, dim1, "renew HPointN"); sum->dim = dim1; } sum->v[0] = c1*c2; for (i = 1; i < dim1; i++) { sum->v[i] = c2*s1*pt1->v[i] + c1*s2*pt2->v[i]; } } else { /* make sure pt1 is the larger one */ if (dim1 < dim2) { const HPointN *swap = pt1; pt1 = pt2; pt2 = swap; dim2 = dim1; dim1 = pt1->dim; } if (sum == NULL) { sum = HPtNCreate(dim1,NULL); } else if(sum->dim < dim1) { sum->v = OOGLRenewNE(HPtNCoord, sum->v, dim1, "renew HPointN"); sum->dim = dim1; } sum->v[0] = c1*c2; for (i = 1; i < dim2; i++) { sum->v[i] = c2*s1*pt1->v[i] + c1*s2*pt2->v[i]; } for (; i < dim1; i++) { sum->v[i] = c2*s1*pt1->v[i]; } } return sum; } /* Dot product of two vectors */ static inline HPtNCoord HPtNDot(const HPointN *p1, const HPointN *p2) { HPtNCoord result; int i; int dim = p1->dim; if (p2->dim < dim) { dim = p2->dim; } result = 0; for(i = 1; i< dim; i++) result += p1->v[i] * p2->v[i]; return result / (p1->v[0] * p2->v[0]); } /* Dehomogenize */ static inline HPtNCoord HPtNDehomogenize(const HPointN *from, HPointN *to) { int dim = from->dim; HPtNCoord c = from->v[0], inv = 1.0 / c; int i; if (c == 1.0 || c == 0.0) { if (from != to) { HPtNCopy(from, to); } return (HPtNCoord)0.0; } if (to == NULL) { to = HPtNCreate(dim, NULL); } else if (to->dim != dim) { to->v = OOGLRenewNE(HPtNCoord, to->v, dim, "renew HPointN"); to->dim = dim; } for( i=1; i < dim; i++) to->v[i] = from->v[i] * inv; to->v[0] = 1.0; return c; } /* Transform an HPointN according to a 3d transform acting only on the * sub-space defined by "axes". The standard axes should look like * {dx,dy,dz,0} because the homogeneous divisor of HPoint3's is * located at index 3. */ static inline HPointN * HPtNTransform3(Transform3 T, int *perm, const HPointN *from, HPointN *to) { const int d3 = 4; int i; HPt3Coord from3[4]; int perm_dim; if (!perm) { perm_dim = 4; } else { perm_dim = perm[0]; for (i = 0; i < d3; i++) { perm_dim = max(perm[i], perm_dim); } ++perm_dim; } HPtNToHPt3(from, perm, (HPoint3 *)(void *)from3); HPt3Transform(T, (HPoint3 *)(void *)from3, (HPoint3 *)(void *)from3); if (from->dim < perm_dim) { to = HPtNPad(from, perm_dim, to); } else { to = HPtNCopy(from, to); } if (perm) { for (i = 0; i < 4; i++) { to->v[perm[i]] = from3[i]; } } else { to->v[0] = from3[3]; to->v[1] = from3[0]; to->v[2] = from3[1]; to->v[3] = from3[2]; } return to; } /* Apply a TransformN to an HPointN. * * If from->dim < T->idim, then from is implicitly padded with zeros, * if from->dim > T->idim, then T is interpreted as identity on the * sub-space defined by T->idim < idx < T->odim, the remaining input * components are mapped to zero. */ static inline HPointN * HPtNTransform(const TransformN *T, const HPointN *from, HPointN *to) { int idim, odim, dim = from->dim; int i, j; HPtNCoord *v; if (!T) { return HPtNCopy(from, to); } idim = T->idim; odim = T->odim; if (from == to) { v = (HPtNCoord *)alloca(dim*sizeof(HPtNCoord)); for (i = 0; i < dim; i++) { v[i] = from->v[i]; } } else { v = from->v; } if(to == NULL) { to = HPtNCreate(odim, NULL); } else if (to->dim != odim) { to->v = OOGLRenewNE(HPtNCoord, to->v, odim, "renew HPointN"); to->dim = odim; } if (idim == dim) { /* the easy case */ for (i = 0; i < odim; i++) { to->v[i] = 0; for (j = 0; j < idim; j++) { to->v[i] += v[j] * T->a[j*odim+i]; } } } else if (idim > dim) { /* pad with zeroes, the homogeneous component sits at index zero and is automatically handled correctly. */ for(i = 0; i < odim; i++) { to->v[i] = 0; for (j = 0; j < dim; j++) { to->v[i] += v[j] * T->a[j*odim+i]; } } } else { /* obviously the case idim < dim */ /* implicitly pad the matrix, i.e. T acts as unity on the missing * dimens+ions. */ for (i = 0; i < odim; i++) { to->v[i] = 0; for (j = 0; j < idim; j++) { to->v[i] += v[j] * T->a[j*odim+i]; } if (i >= idim && i < dim) { to->v[i] += v[i]; } } } return to; } /* Apply the transpose of a TransformN to an HPointN. * * If from->dim < T->odim, then form is implicitly padded with zeros, * if from->dim > T->odim, then T is interpreted as identity on the * sub-space defined by T->odim < idx < T->idim, the remaining input * components are mapped to zero. */ static inline HPointN * HPtNTTransform(const TransformN *T, const HPointN *from, HPointN *to) { int idim, odim, dim = from->dim; int i, j; HPtNCoord *v; if (!T) { return HPtNCopy(from, to); } idim = T->idim; odim = T->odim; if (from == to) { v = (HPtNCoord *)alloca(dim*sizeof(HPtNCoord)); for (i = 0; i < dim; i++) { v[i] = from->v[i]; } } else { v = from->v; } if(to == NULL) { to = HPtNCreate(odim, NULL); } else if (to->dim != idim) { to->v = OOGLRenewNE(HPtNCoord, to->v, idim, "renew HPointN"); to->dim = idim; } if (odim == dim) { /* the easy case */ for (i = 0; i < idim; i++) { to->v[i] = 0; for (j = 0; j < odim; j++) { to->v[i] += v[j] * T->a[i*odim+j]; } } } else if (odim > dim) { /* pad with zeroes, the homogeneous component sits at index zero and is automatically handled correctly. */ for(i = 0; i < idim; i++) { to->v[i] = 0; for (j = 0; j < dim; j++) { to->v[i] += v[j] * T->a[i*odim+j]; } } } else { /* obviously the case odim < dim */ /* implicitly pad the matrix, i.e. T acts as unity on the missing * dimens+ions. */ for (i = 0; i < idim; i++) { to->v[i] = 0; for (j = 0; j < odim; j++) { to->v[i] += v[j] * T->a[i*odim+j]; } if (i >= odim && i < dim) { to->v[i] += v[i]; } } } return to; } /* A short and efficient routine. This routine assumes that T is the * result of a call to TmNProject() and is therefor non-NULL. "from" * may have more or less dimensions than T->idim, it is padded with * zeroes or truncated as necessary. from must have dimension 1 at * least. * * T already contains all necessary permutations and the projection to * map "from" to result "properly". */ static inline HPoint3 * HPtNTransProj(const TransformN *T, const HPointN *from, HPoint3 *result) { HPtNCoord *v = from->v; int idim; const int odim = 4; /* must be 4 */ int i; idim = T->idim > from->dim ? from->dim : T->idim; result->x = v[0] * T->a[0*odim+0]; result->y = v[0] * T->a[0*odim+1]; result->z = v[0] * T->a[0*odim+2]; result->w = v[0] * T->a[0*odim+3]; for (i = 1; i < idim; i++) { result->x += v[i] * T->a[i*odim+0]; result->y += v[i] * T->a[i*odim+1]; result->z += v[i] * T->a[i*odim+2]; result->w += v[i] * T->a[i*odim+3]; } return result; } /* Transform p by T and then project to the sub-space defined by * "perm". */ static inline HPoint3 * HPtNTransformComponents(const TransformN *T, const HPointN *from, int *perm, HPoint3 *results) { int idim = T->idim, odim = T->odim, dim = from->dim; int i, j, k; HPt3Coord *res = (HPt3Coord *)results; if (idim == dim) { /* the easy case */ for (k = 0; k < 4; k++) { i = perm[k]; if (i > odim) continue; res[k] = 0; for (j = 0; j < idim; j++) { res[k] += from->v[j] * T->a[j*odim+i]; } } } else if (idim > dim) { /* pad with zeroes, the homogeneous component sits at index zero and is automatically handled correctly. */ for (k = 0; k < 4; k++) { i = perm[k]; if (i > odim) continue; res[k] = 0; for (j = 0; j < dim; j++) { res[k] += from->v[j] * T->a[j*odim+i]; } } } else { /* obviously the case idim < dim */ /* implicitly pad the matrix, i.e. T acts as unity on the missing * dimens+ions. */ for (k = 0; k < 4; k++) { i = perm[k]; if (i > odim) continue; res[k] = 0; for (j = 0; j < idim; j++) { res[k] += from->v[j] * T->a[j*odim+i]; } if (i >= idim && i < dim) { res[k] += from->v[i]; } } } return results; } static inline HPointN * HPt3NTransform(const TransformN *T, const HPoint3 *from, HPointN *to) { int idim, odim; int i, j; HPtNCoord *v; if (!T) { return HPt3ToHPtN(from, NULL, to); } v = (HPtNCoord *)from; idim = T->idim; odim = T->odim; if(to == NULL) { to = HPtNCreate(odim, NULL); } else if (to->dim != odim) { to->v = OOGLRenewNE(HPtNCoord, to->v, odim, "renew HPointN"); to->dim = odim; } if (idim == 4) { /* the easy case */ for (i = 0; i < odim; i++) { to->v[i] = 0; for (j = 0; j < idim; j++) { to->v[i] += v[(j+3)%4] * T->a[j*odim+i]; } } } else if (idim > 4) { /* pad with zeroes, the homogeneous component sits at index zero and is automatically handled correctly. */ for(i = 0; i < odim; i++) { to->v[i] = 0; for (j = 0; j < 4; j++) { to->v[i] += v[(j+3)%4] * T->a[j*odim+i]; } } } else { /* obviously the case idim < dim */ /* implicitly pad the matrix, i.e. T acts as unity on the missing * dimens+ions. */ for (i = 0; i < odim; i++) { to->v[i] = 0; for (j = 0; j < idim; j++) { to->v[i] += v[(j+3) % 4] * T->a[j*odim+i]; } if (i >= idim && i < 4) { to->v[i] += v[i]; } } } return to; } static inline HPointN * Pt4NTransform(const TransformN *T, const HPoint3 *from, HPointN *to) { int idim, odim; int i, j; HPtNCoord *v; if (!T) { return Pt4ToHPtN(from, to); } v = (HPtNCoord *)from; idim = T->idim; odim = T->odim; if(to == NULL) { to = HPtNCreate(odim, NULL); } else if (to->dim != odim) { to->v = OOGLRenewNE(HPtNCoord, to->v, odim, "renew HPointN"); to->dim = odim; } if (idim == 5) { /* the easy case */ for (i = 0; i < odim; i++) { to->v[i] = T->a[i]; for (j = 1; j < idim; j++) { to->v[i] += v[j-1] * T->a[j*odim+i]; } } } else if (idim > 5) { /* pad with zeroes, the homogeneous component sits at index zero and is automatically handled correctly. */ for(i = 0; i < odim; i++) { to->v[i] = T->a[i]; for (j = 1; j < 5; j++) { to->v[i] += v[j-1] * T->a[j*odim+i]; } } } else { /* obviously the case idim < dim */ /* implicitly pad the matrix, i.e. T acts as unity on the missing * dimens+ions. */ for (i = 0; i < odim; i++) { to->v[i] = T->a[i]; for (j = 0; j < idim; j++) { to->v[i] += v[j-1] * T->a[j*odim+i]; } if (i >= idim && i < 5) { to->v[i] += v[i-1]; } } } return to; } static inline HPt3Coord HPtNNTransPt3(TransformN *TN, int *axes, const HPointN *ptN, Point3 *result) { HPoint3 tmp; HPtNTransformComponents(TN, ptN, axes, &tmp); result->x = tmp.x / tmp.w; result->y = tmp.y / tmp.w; result->z = tmp.z / tmp.w; return tmp.w; } static inline HPt3Coord HPt3NTransPt3(TransformN *TN, int *axes, const HPoint3 *hpt4, int v4d, Point3 *result) { HPointN *tmp; HPt3Coord retval; /* axes[3] should be 0 */ if (v4d) { tmp = Pt4NTransform(TN, hpt4, NULL); } else { tmp = HPt3NTransform(TN, hpt4, NULL); } result->x = tmp->v[axes[0]] / tmp->v[axes[3]]; result->y = tmp->v[axes[1]] / tmp->v[axes[3]]; result->z = tmp->v[axes[2]] / tmp->v[axes[3]]; retval = tmp->v[axes[3]]; HPtNDelete(tmp); return retval; } static inline void HPt3NTransHPt3(TransformN *TN, int *axes, const HPoint3 *hpt4, int v4d, HPoint3 *result) { HPointN *tmp; if (v4d) { tmp = Pt4NTransform(TN, hpt4, NULL); } else { tmp = HPt3NTransform(TN, hpt4, NULL); } result->w = tmp->v[axes[3]]; result->x = tmp->v[axes[0]]; result->y = tmp->v[axes[1]]; result->z = tmp->v[axes[2]]; HPtNDelete(tmp); } /* Utility function for bounding box computations. We assume that min * and max are dehomogenized (third part of the #if clause below), and * that they are large enough (min->dim >= other->dim <= max->dim) */ static inline void HPtNMinMax(HPointN *min, HPointN *max, HPointN *other) { #if 0 int i; for (i = 1; i < other->dim; i++) { if (min->v[i] > other->v[i]) { min->v[i] = other->v[i]; } else if (max->v[i] < other->v[i]) { max->v[i] = other->v[i]; } } #elif 0 int i; HPtNCoord c = min->v[0], C = max->v[0], oc = other->v[0]; for (i = 1; i < other->dim; i++) { if (oc * min->v[i] > c * other->v[i]) { min->v[i] = other->v[i] * c / oc ; } else if (oc * max->v[i] < C * other->v[i]) { max->v[i] = other->v[i] * C / oc; } } #else int i; HPtNCoord oc = other->v[0]; for (i = 1; i < other->dim; i++) { if (oc * min->v[i] > other->v[i]) { min->v[i] = other->v[i] / oc ; } else if (oc * max->v[i] < other->v[i]) { max->v[i] = other->v[i] / oc; } } #endif } #ifdef _gv_hptn_max_ # undef max #endif #ifdef _gv_hptn_min_ # undef min #endif #endif /* _GV_HPOINTN_H_ */ /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geometry/hpointn/Headers0000644000175000001440000000001207730236444016433 00000000000000hpointn.h geomview-1.9.4/src/lib/geometry/Headers0000644000175000001440000000001410532331570014744 00000000000000geomtypes.h geomview-1.9.4/src/lib/geomutil/0000777000175000001440000000000010665240675013545 500000000000000geomview-1.9.4/src/lib/geomutil/bdy/0000777000175000001440000000000010665240675014323 500000000000000geomview-1.9.4/src/lib/geomutil/bdy/bdy.c0000644000175000001440000001076410532353115015154 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * bdy.c * author: Celeste Fowler * date: June 12, 1992 */ #include #include "geom.h" #include "polylistP.h" #include "ooglutil.h" #include "plutil.h" #include "bdy.h" #ifndef min # define min(a, b) ((a < b) ? a : b) #endif #ifndef max # define max(a, b) ((a > b) ? a : b) #endif static char msg[] = "bdy.c"; /* Precision. The global declaration is a hack to get the value out * of Bdy and into EdgeCmp where it is needed (EdgeCmp must be called by * qsort. */ static float precision; int EdgeCmp(HPoint3 **a, HPoint3 **b) { int d; float dist00, dist01, dist11, dist10; while (1) { dist00 = HPt3Distance(a[0], b[0]); dist01 = HPt3Distance(a[0], b[1]); dist11 = HPt3Distance(a[1], b[1]); dist10 = HPt3Distance(a[1], b[0]); if (dist00 > precision && dist01 > precision) break; if (dist11 > precision && dist10 > precision) break; if (dist00 < precision && dist11 > precision) break; if (dist01 < precision && dist10 > precision) break; if (dist11 < precision && dist00 > precision) break; if (dist10 < precision && dist01 > precision) break; return 0; } d = memcmp(a[0], b[0], sizeof(HPoint3)); if(d == 0) d = memcmp(a[1], b[1], sizeof(HPoint3)); return d; } Geom *Bdy(Geom *g, float prec) { int i, j, k; PolyList *p; int n_edges; HPoint3 **edges; Geom *vect; short *vcounts, *ccounts; Point3 *verts; ColorA color; g = (Geom *)AnyToPL(g, TM_IDENTITY); if (g == NULL) return NULL; precision = prec; /* Get a consolidated version of the polylist. */ p = (PolyList *)PLConsol(g, 0.0); GeomDelete(g); /* Count the number of edges in the polygon */ for (i = n_edges = 0; i < p->n_polys; i++) n_edges += p->p[i].n_vertices; /* Put the edges in an array and sort it */ edges = OOGLNewNE(HPoint3 *, 2 * n_edges, msg); for (i = k = 0; i < p->n_polys; i++) { for (j = 0; j < p->p[i].n_vertices; j++) { edges[k * 2] = (HPoint3 *) min(p->p[i].v[j], p->p[i].v[(j + 1) % p->p[i].n_vertices]); edges[k * 2 + 1] = (HPoint3 *) max(p->p[i].v[j], p->p[i].v[(j + 1) % p->p[i].n_vertices]); k++; } if (p->p[i].n_vertices == 2) k--; } n_edges = k; precision = 0.0; qsort(edges, n_edges, 2 * sizeof(HPoint3 *), (int (*)())EdgeCmp); precision = prec; /* Eliminate everything mentioned more than once */ for (i = j = k = 0; i < n_edges; i++) if (EdgeCmp(&edges[i*2], &edges[k*2])) { if (i == k + 1) { edges[j*2] = edges[k*2]; edges[j*2 + 1] = edges[k*2 + 1]; j++; } k = i; } if (i == k + 1) { edges[j*2] = edges[k*2]; edges[j*2 + 1] = edges[k*2 + 1]; j++; } if (!j) { OOGLFree(edges); GeomDelete((Geom *)p); return NULL; } /* Call the vect create routine */ vcounts = OOGLNewNE(short, j, msg); ccounts = OOGLNewNE(short, j, msg); verts = OOGLNewNE(Point3, j*2, msg); for (i = 0; i < j; i++) { vcounts[i] = 2; ccounts[i] = 0; Pt3Copy((const Point3 *)edges[i*2], &verts[i*2]); Pt3Copy((const Point3 *)edges[i*2 + 1], &verts[i*2 + 1]); } ccounts[0] = 1; color.r = 0.0; color.g = 0.0; color.b = 0.0; color.a = 1.0; vect = GeomCreate("vect", CR_NVECT, j, CR_VECTC, vcounts, CR_NVERT, j*2, CR_POINT, verts, CR_NCOLR, 1, CR_COLRC, ccounts, CR_COLOR, &color, CR_END); OOGLFree(ccounts); OOGLFree(vcounts); OOGLFree(edges); GeomDelete((Geom *)p); return vect; } geomview-1.9.4/src/lib/geomutil/bdy/bdy.h0000644000175000001440000000203510455701001015144 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * bdy.h * author: Celeste Fowler * date: June 12, 1992 */ #ifndef BDY_H #define BDY_H Geom *Bdy(Geom *g, float prec); #endif /* BDY_H */ geomview-1.9.4/src/lib/geomutil/bdy/Makefile.am0000644000175000001440000000024210600605705016255 00000000000000INCLUDES = $(default_includes) man_MANS = bdy.3gv EXTRA_DIST = Headers $(man_MANS) noinst_LTLIBRARIES = libbdy.la libbdy_la_SOURCES = \ bdy.c \ bdy.h geomview-1.9.4/src/lib/geomutil/bdy/Makefile.in0000644000175000001440000004065010665240502016276 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geomutil/bdy DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libbdy_la_LIBADD = am_libbdy_la_OBJECTS = bdy.lo libbdy_la_OBJECTS = $(am_libbdy_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libbdy_la_SOURCES) DIST_SOURCES = $(libbdy_la_SOURCES) man3dir = $(mandir)/man3 am__installdirs = "$(DESTDIR)$(man3dir)" NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) man_MANS = bdy.3gv EXTRA_DIST = Headers $(man_MANS) noinst_LTLIBRARIES = libbdy.la libbdy_la_SOURCES = \ bdy.c \ bdy.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geomutil/bdy/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geomutil/bdy/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbdy.la: $(libbdy_la_OBJECTS) $(libbdy_la_DEPENDENCIES) $(LINK) $(libbdy_la_OBJECTS) $(libbdy_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bdy.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man3: $(man3_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.3*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 3*) ;; \ *) ext='3' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \ done uninstall-man3: @$(NORMAL_UNINSTALL) @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.3*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 3*) ;; \ *) ext='3' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man3dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(MANS) installdirs: for dir in "$(DESTDIR)$(man3dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-man3 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man3 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man3 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-man uninstall-man3 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geomutil/bdy/bdy.3gv0000644000175000001440000000223510600600312015411 00000000000000.TH bdy 3gv "June 15, 1992" "Geometry Center" .SH NAME bdy -\ boundary curve finder .SH SYNOPSIS #include "bdy.h" Geom *Bdy(Geom *, float prec); .SH DESCRIPTION .PP Bdy() is a function which takes a geom as its argument. The geom is then converted to a polylist, which is compressed (See plconsol(3). Bdy() then counts the number of edges in the polylist used once and only once, and returns a vector object containing these edges. The precision, prec, is used to determine the maximum distance between vertices which may be considered identical. If the vertices must have identical coordinates, this value should be set to 0.0. It is generally desirable to set the value somewhat higher to allow for round-off error. .PP The vector object is always black. .SH BUGS The vector object is not a particularly compact representation of itself, since it contains many 2-vertex segments which could be combined into a longer polyline. .SH LINKING Bdy() is part of the geomutil library; see geomutil(3) for information on how to link your program with this library. .SH SEE ALSO bdy(1), geomview(1), anytopl(3), geomutil(3) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.4/src/lib/geomutil/bdy/Headers0000644000175000001440000000000607730236616015530 00000000000000bdy.h geomview-1.9.4/src/lib/geomutil/dim/0000777000175000001440000000000010665240675014316 500000000000000geomview-1.9.4/src/lib/geomutil/dim/dim.c0000644000175000001440000000616410514661166015151 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Get the dimension of the space in which a Geom lives */ #include "geomclass.h" #include "skelP.h" #include "ndmeshP.h" #include "polylistP.h" #include "npolylistP.h" #include "bezierP.h" #include "quadP.h" #include "meshP.h" #include "vectP.h" #include "listP.h" #include "discgrpP.h" #include "instP.h" #include "hpoint3.h" #include "point3.h" #include "dim.h" static void *dimdefault(int sel, Geom *g, va_list *args) { return (void *)(long)((g && (g->geomflags & VERT_4D)) ? g->pdim : g->pdim-1); } static void *dimSkel(int sel, Geom *g, va_list *args) { return (void *)(long)(((Skel *)g)->pdim-1); } static void *dimNDMesh(int sel, Geom *g, va_list *args) { return (void *)(long)(((NDMesh *)g)->pdim-1); } static void *dimNPolyList(int sel, Geom *g, va_list *args) { return (void *)(long)(((NPolyList *)g)->pdim-1); } static void *dimQuad(int sel, Geom *g, va_list *args) { return (void *)(long)((g && (g->geomflags & VERT_4D)) ? 4 : 3); } static void *dimMesh(int sel, Geom *g, va_list *args) { return (void *)(long)((g && (g->geomflags & VERT_4D)) ? 4 : 3); } static void *dimList(int sel, Geom *g, va_list *args) { int dim, maxdim = 3; List *l; for(l = (List *)g; l != NULL; l = l->cdr) { dim = GeomDimension(l->car); if(maxdim < dim) maxdim = dim; } return (void *)(long)maxdim; } static void *dimInst(int sel, Geom *g, va_list *args) { return (void *)(long)GeomDimension(((Inst *)g)->geom); } static int DimSel = 0; int GeomDimension(Geom *g) { if(DimSel == 0) { DimSel = GeomNewMethod("dimension", dimdefault); GeomSpecifyMethod(DimSel, SkelMethods(), dimSkel); GeomSpecifyMethod(DimSel, NDMeshMethods(), dimNDMesh); GeomSpecifyMethod(DimSel, NPolyListMethods(), dimNPolyList); GeomSpecifyMethod(DimSel, ListMethods(), dimList); GeomSpecifyMethod(DimSel, InstMethods(), dimInst); GeomSpecifyMethod(DimSel, InstMethods(), dimInst); GeomSpecifyMethod(DimSel, QuadMethods(), dimQuad); GeomSpecifyMethod(DimSel, MeshMethods(), dimMesh); } return (int)(long)GeomCall( DimSel, g ); } geomview-1.9.4/src/lib/geomutil/dim/dim.h0000644000175000001440000000220610455701002015133 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * dim.h */ #ifndef DIM_H #define DIM_H /* * Return the dimension of the space in which this Geom lives. * For objects with components of different dimensions, * returns the highest dimension. */ int GeomDimension(Geom *g); #endif /* DIM_H */ geomview-1.9.4/src/lib/geomutil/dim/Makefile.am0000644000175000001440000000020110455665331016254 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libdim.la libdim_la_SOURCES = \ dim.c \ dim.h geomview-1.9.4/src/lib/geomutil/dim/Makefile.in0000644000175000001440000003523010665240502016267 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geomutil/dim DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libdim_la_LIBADD = am_libdim_la_OBJECTS = dim.lo libdim_la_OBJECTS = $(am_libdim_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libdim_la_SOURCES) DIST_SOURCES = $(libdim_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libdim.la libdim_la_SOURCES = \ dim.c \ dim.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geomutil/dim/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geomutil/dim/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libdim.la: $(libdim_la_OBJECTS) $(libdim_la_DEPENDENCIES) $(LINK) $(libdim_la_OBJECTS) $(libdim_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dim.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geomutil/dim/Headers0000644000175000001440000000000607730236663015525 00000000000000dim.h geomview-1.9.4/src/lib/geomutil/crayplutil/0000777000175000001440000000000010665240675015735 500000000000000geomview-1.9.4/src/lib/geomutil/crayplutil/crayPolylist.c0000644000175000001440000001651510605757307020522 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "geom.h" #include "polylistP.h" #include "crayolaP.h" void *cray_polylist_HasColor(int sel, Geom *geom, va_list *args); void *cray_polylist_HasVColor(int sel, Geom *geom, va_list *args); void *cray_polylist_HasFColor(int sel, Geom *geom, va_list *args); void *cray_polylist_UseVColor(int sel, Geom *geom, va_list *args); void *cray_polylist_UseFColor(int sel, Geom *geom, va_list *args); void *cray_polylist_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_polylist_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_polylist_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_polylist_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_polylist_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_polylist_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_polylist_GetColorAtV(int sel, Geom *geom, va_list *args); void *cray_polylist_GetColorAtF(int sel, Geom *geom, va_list *args); #define MAX_METHODS 15 static craySpecFunc methods[] = { {"crayHasColor", cray_polylist_HasColor}, {"crayHasVColor", cray_polylist_HasVColor}, {"crayHasFColor", cray_polylist_HasFColor}, {"crayCanUseVColor", crayTrue}, {"crayCanUseFColor", crayTrue}, {"crayUseVColor", cray_polylist_UseVColor}, {"crayUseFColor", cray_polylist_UseFColor}, {"crayEliminateColor", cray_polylist_EliminateColor}, {"craySetColorAll", cray_polylist_SetColorAll}, {"craySetColorAt", cray_polylist_SetColorAt}, {"craySetColorAtV", cray_polylist_SetColorAtV}, {"craySetColorAtF", cray_polylist_SetColorAtF}, {"crayGetColorAt", cray_polylist_GetColorAt}, {"crayGetColorAtV", cray_polylist_GetColorAtV}, {"crayGetColorAtF", cray_polylist_GetColorAtF} }; int cray_polylist_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("polylist")); return 0; } void *cray_polylist_HasColor(int sel, Geom *geom, va_list *args) { return (void *)(long)(crayHasVColor(geom, NULL) || crayHasFColor(geom, NULL)); } void *cray_polylist_HasVColor(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; return (void *)(long)(p->geomflags & PL_HASVCOL); } void *cray_polylist_HasFColor(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; return (void *)(long)(p->geomflags & PL_HASPCOL); } void *cray_polylist_UseVColor(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; ColorA *def; int i, j; def = va_arg(*args, ColorA *); for (i = 0; i < p->n_verts; i++) p->vl[i].vcol = *def; if (p->geomflags & PL_HASPCOL) { for (i = 0; i < p->n_polys; i++) for (j = 0; j < p->p[i].n_vertices; j++) p->p[i].v[j]->vcol = p->p[i].pcol; p->geomflags ^= PL_HASPCOL; } p->geomflags |= PL_HASVCOL; return (void *)p; } void *cray_polylist_UseFColor(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; ColorA *def; int i; def = va_arg(*args, ColorA *); for (i = 0; i < p->n_polys; i++) p->p[i].pcol = *def; if (p->geomflags & PL_HASVCOL) { for (i = 0; i < p->n_polys; i++) if (p->p[i].n_vertices) p->p[i].pcol = p->p[i].v[0]->vcol; p->geomflags ^= PL_HASVCOL; } p->geomflags |= PL_HASPCOL; return (void *)p; } void *cray_polylist_EliminateColor(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; if (!crayHasColor(geom, NULL)) return 0; p->geomflags &= ~PL_HASVCOL; p->geomflags &= ~PL_HASPCOL; return (void *)p; } void *cray_polylist_SetColorAll(int sel, Geom *geom, va_list *args) { int i; PolyList *p = (PolyList *)geom; ColorA *color = va_arg(*args, ColorA *); if (!crayHasVColor(geom, NULL)) return NULL; for (i = 0; i < p->n_verts; i++) p->vl[i].vcol = *color; for (i = 0; i < p->n_polys; i++) p->p[i].pcol = *color; return geom; } void *cray_polylist_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex, *eindex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); eindex = va_arg(*args, int *); if (crayHasVColor(geom, NULL)) { if (vindex != -1) return (void *)(long)craySetColorAtV(geom, color, vindex, NULL, NULL); if (eindex[0] != eindex[1]) { craySetColorAtV(geom, color, eindex[0], NULL, NULL); return (void *)(long)craySetColorAtV(geom, color, eindex[1], NULL, NULL); } } return (void *)(long)craySetColorAtF(geom, color, findex, NULL); } void *cray_polylist_SetColorAtV(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) return (void *)0; p->vl[index].vcol = *color; return (void *)geom; } void *cray_polylist_SetColorAtF(int sel, Geom *geom, va_list *args) { int i; PolyList *p = (PolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1) return (void *)0; if (crayHasFColor(geom, NULL)) p->p[index].pcol = *color; else if (crayHasVColor(geom, NULL)) for (i = 0; i < p->p[index].n_vertices; i++) p->p[index].v[i]->vcol = *color; return (void *)geom; } void *cray_polylist_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); if (crayHasVColor(geom, NULL)) return (void *)(long)crayGetColorAtV(geom, color, vindex, NULL, NULL); if (crayHasFColor(geom, NULL)) return (void *)(long)crayGetColorAtF(geom, color, findex, NULL); return NULL; } void *cray_polylist_GetColorAtV(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) return (void *)0; *color = p->vl[index].vcol; return (void *)geom; } void *cray_polylist_GetColorAtF(int sel, Geom *geom, va_list *args) { PolyList *p = (PolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasFColor(geom, NULL) || index == -1) return (void *)0; *color = p->p[index].pcol; return (void *)geom; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geomutil/crayplutil/crayNPolylist.c0000644000175000001440000001757110624105201020620 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include "geom.h" #include "npolylistP.h" #include "crayolaP.h" void *cray_npolylist_HasColor(int sel, Geom *geom, va_list *args); void *cray_npolylist_HasVColor(int sel, Geom *geom, va_list *args); void *cray_npolylist_HasFColor(int sel, Geom *geom, va_list *args); void *cray_npolylist_UseVColor(int sel, Geom *geom, va_list *args); void *cray_npolylist_UseFColor(int sel, Geom *geom, va_list *args); void *cray_npolylist_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_npolylist_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_npolylist_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_npolylist_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_npolylist_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_npolylist_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_npolylist_GetColorAtV(int sel, Geom *geom, va_list *args); void *cray_npolylist_GetColorAtF(int sel, Geom *geom, va_list *args); #define MAX_METHODS 15 static craySpecFunc methods[] = { {"crayHasColor", cray_npolylist_HasColor}, {"crayHasVColor", cray_npolylist_HasVColor}, {"crayHasFColor", cray_npolylist_HasFColor}, {"crayCanUseVColor", crayTrue}, {"crayCanUseFColor", crayTrue}, {"crayUseVColor", cray_npolylist_UseVColor}, {"crayUseFColor", cray_npolylist_UseFColor}, {"crayEliminateColor", cray_npolylist_EliminateColor}, {"craySetColorAll", cray_npolylist_SetColorAll}, {"craySetColorAt", cray_npolylist_SetColorAt}, {"craySetColorAtV", cray_npolylist_SetColorAtV}, {"craySetColorAtF", cray_npolylist_SetColorAtF}, {"crayGetColorAt", cray_npolylist_GetColorAt}, {"crayGetColorAtV", cray_npolylist_GetColorAtV}, {"crayGetColorAtF", cray_npolylist_GetColorAtF} }; int cray_npolylist_init(void) { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("npolylist")); return 0; } void *cray_npolylist_HasColor(int sel, Geom *geom, va_list *args) { return (void *)(long)(crayHasVColor(geom, NULL) || crayHasFColor(geom, NULL)); } void *cray_npolylist_HasVColor(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; return (void *)(long)(p->geomflags & PL_HASVCOL); } void *cray_npolylist_HasFColor(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; return (void *)(long)(p->geomflags & PL_HASPCOL); } void *cray_npolylist_UseVColor(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; ColorA *def; int i, j; def = va_arg(*args, ColorA *); if (!p->vcol) { p->vcol = OOGLNewNE(ColorA, p->n_verts, "NPolyList vertex colors"); } for (i = 0; i < p->n_verts; i++) { p->vcol[i] = *def; } if (p->vl) { for (i = 0; i < p->n_verts; i++) { p->vl[i].vcol = *def; } } if (p->geomflags & PL_HASPCOL) { for (i = 0; i < p->n_polys; i++) { for (j = 0; j < p->p[i].n_vertices; j++) { p->p[i].v[j]->vcol = p->p[i].pcol; } } p->geomflags ^= PL_HASPCOL; } p->geomflags |= PL_HASVCOL; return (void *)p; } void *cray_npolylist_UseFColor(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; ColorA *def; int i; def = va_arg(*args, ColorA *); for (i = 0; i < p->n_polys; i++) { p->p[i].pcol = *def; } if (p->geomflags & PL_HASVCOL) { for (i = 0; i < p->n_polys; i++) { if (p->p[i].n_vertices) { p->p[i].pcol = p->vcol[p->vi[p->pv[i]]]; } } p->geomflags ^= PL_HASVCOL; } p->geomflags |= PL_HASPCOL; return (void *)p; } void *cray_npolylist_EliminateColor(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; if (!crayHasColor(geom, NULL)) { return NULL; } p->geomflags &= ~PL_HASVCOL; p->geomflags &= ~PL_HASPCOL; OOGLFree(p->vcol); p->vcol = NULL; return (void *)p; } void *cray_npolylist_SetColorAll(int sel, Geom *geom, va_list *args) { int i; NPolyList *p = (NPolyList *)geom; ColorA *color = va_arg(*args, ColorA *); if (!crayHasVColor(geom, NULL)) { return NULL; } for (i = 0; i < p->n_verts; i++) { p->vcol[i] = *color; } for (i = 0; i < p->n_polys; i++) { p->p[i].pcol = *color; } return geom; } void *cray_npolylist_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex, *eindex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); eindex = va_arg(*args, int *); if (crayHasVColor(geom, NULL)) { if (vindex != -1) return (void *)(long)craySetColorAtV(geom, color, vindex, NULL, NULL); if (eindex[0] != eindex[1]) { craySetColorAtV(geom, color, eindex[0], NULL, NULL); return (void *)(long)craySetColorAtV(geom, color, eindex[1], NULL, NULL); } } return (void *)(long)craySetColorAtF(geom, color, findex, NULL); } void *cray_npolylist_SetColorAtV(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) { return NULL; } p->vcol[index] = p->vl[index].vcol = *color; return (void *)geom; } void *cray_npolylist_SetColorAtF(int sel, Geom *geom, va_list *args) { int i; NPolyList *p = (NPolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1) { return (void *)NULL; } if (crayHasFColor(geom, NULL)) { p->p[index].pcol = *color; } else if (crayHasVColor(geom, NULL)) { for (i = 0; i < p->p[index].n_vertices; i++) { p->p[index].v[i]->vcol = *color; p->vcol[p->vi[p->pv[i] + i]] = *color; } } return (void *)geom; } void *cray_npolylist_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); if (crayHasVColor(geom, NULL)) { return (void *)(long)crayGetColorAtV(geom, color, vindex, NULL, NULL); } if (crayHasFColor(geom, NULL)) { return (void *)(long)crayGetColorAtF(geom, color, findex, NULL); } return NULL; } void *cray_npolylist_GetColorAtV(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) { return NULL; } *color = p->vcol[index]; return (void *)geom; } void *cray_npolylist_GetColorAtF(int sel, Geom *geom, va_list *args) { NPolyList *p = (NPolyList *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasFColor(geom, NULL) || index == -1) { return NULL; } *color = p->p[index].pcol; return (void *)geom; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geomutil/crayplutil/crayolaP.h0000644000175000001440000000360310624104204017554 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef CRAYOLAP_H #define CRAYOLAP_H #include "crayola.h" #define CRAYOLA_MAXNAME 128 /* * WARNING: The order of the names of the routines is hardcoded * into the functions themselves. */ #define CRAYOLA_MAXMETH 15 #define CRAYOLA_METHNAMES "crayHasColor", "crayHasVColor", "crayHasFColor", \ "crayCanUseVColor", "crayCanUseFColor", \ "crayUseVColor", "crayUseFColor", "crayEliminateColor", \ "craySetColorAll", \ "craySetColorAt", "craySetColorAtV", "craySetColorAtF", \ "crayGetColorAt", "crayGetColorAtV", "crayGetColorAtF" typedef struct { char name[CRAYOLA_MAXNAME]; GeomExtFunc *func; } craySpecFunc; void crayInitSpec(craySpecFunc *specfunc, int n_func, GeomClass *class); void *crayTrue(int sel, Geom *geom, va_list *args); void *crayFalse(int sel, Geom *geom, va_list *args); int cray_bezier_init(); int cray_inst_init(); int cray_list_init(); int cray_mesh_init(); int cray_polylist_init(); int cray_npolylist_init(); int cray_quad_init(); int cray_vect_init(); int cray_skel_init(); #endif geomview-1.9.4/src/lib/geomutil/crayplutil/crayBezier.c0000644000175000001440000001460710560666243020121 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "point3.h" #include "hpoint3.h" #include "geom.h" #include "bezierP.h" #include "crayolaP.h" #ifndef FUDGE #define FUDGE .1 #endif void *cray_bezier_HasVColor(int sel, Geom *geom, va_list *args); void *cray_bezier_UseVColor(int sel, Geom *geom, va_list *args); void *cray_bezier_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_bezier_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_bezier_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_bezier_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_bezier_GetColorAt(int sel, Geom *geom, va_list *args); #define MAX_METHODS 10 static craySpecFunc methods[] = { {"crayHasColor", cray_bezier_HasVColor}, {"crayHasVColor", cray_bezier_HasVColor}, {"crayCanUseVColor", crayTrue}, {"crayUseVColor", cray_bezier_UseVColor}, {"crayEliminateColor", cray_bezier_EliminateColor}, {"craySetColorAll", cray_bezier_SetColorAll}, {"craySetColorAt", cray_bezier_SetColorAt}, {"craySetColorAtF", cray_bezier_SetColorAtF}, {"crayGetColorAt", cray_bezier_GetColorAt}, {"crayGetColorAtV", cray_bezier_GetColorAt} }; int cray_bezier_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("bezier")); return 0; } void *cray_bezier_HasVColor(int sel, Geom *geom, va_list *args) { Bezier *b = (Bezier *)geom; return (void *)(long)(b->geomflags & BEZ_C); } void *cray_bezier_UseVColor(int sel, Geom *geom, va_list *args) { int i; Bezier *b = (Bezier *)geom; ColorA *def; if (crayHasColor(geom, NULL)) return 0; def = va_arg(*args, ColorA *); for (i = 0; i < 4; i++) b->c[i] = *def; b->geomflags |= BEZ_C; return (void *)geom; } void *cray_bezier_EliminateColor(int sel, Geom *geom, va_list *args) { Bezier *b = (Bezier *)geom; if (!crayHasColor(geom, NULL)) return NULL; b->geomflags ^= BEZ_C; return (void *)geom; } void *cray_bezier_SetColorAll(int sel, Geom *geom, va_list *args) { int i; Bezier *b = (Bezier *)geom; ColorA *color; if (!crayHasColor(geom, NULL)) return NULL; color = va_arg(*args, ColorA *); for (i = 0; i < 4; i++) b->c[i] = *color; return (void *)geom; } #define prtpt3(pt) fprintf(stderr, "%.3f %.3f %.3f\n", \ ((Point3 *)(pt))->x, ((Point3 *)(pt))->y, \ ((Point3 *)(pt))->z) #define prtpt4(pt) fprintf(stderr, "%.3f %.3f %.3f %.3f\n", \ ((HPoint3 *)(pt))->x, ((HPoint3 *)(pt))->y, \ ((HPoint3 *)(pt))->z, ((HPoint3 *)(pt))->w) static int WhichCorner(Bezier *b, int vindex, HPoint3 *pt) { float close, newclose; const Point3 *pt3; HPoint3 *pt4; int index; pt3 = (Point3 *)pt; pt4 = pt; if (b->dimn != 3 && b->dimn != 4) { OOGLError(1, "Bezier patch of unrecognized dimension %d.\n", b->dimn); return -1; } /* Hits on a corner of the mesh are vertex hits. Other hits are face * hits and color the entire thing */ close = FUDGE; index = -1; newclose = b->dimn == 3 ? Pt3Distance(pt3, (const Point3 *)(&b->CtrlPnts[0])) : HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[0])); if (newclose < close) { index = 0; close = newclose; } newclose = b->dimn == 3 ? Pt3Distance(pt3, (Point3 *)(&b->CtrlPnts[b->degree_u * 3])) : HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[b->degree_u * 4])); if (newclose < close) { index = 1; close = newclose; } newclose = b->dimn == 3 ? Pt3Distance(pt3, (const Point3 *)(&b->CtrlPnts[((b->degree_v + 1) * b->degree_u) * 3])) : HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[((b->degree_v + 1) * b->degree_u) * 4])); if (newclose < close) { index = 2; close = newclose; } newclose = b->dimn == 3 ? Pt3Distance(pt3, (const Point3 *)(&b->CtrlPnts[((b->degree_v + 1) * (b->degree_u + 1) - 1) * 3])) : HPt3Distance(pt4, (HPoint3 *)(&b->CtrlPnts[((b->degree_v + 1) * (b->degree_u + 1) - 1) * 4])); if (newclose < close) { index = 3; newclose = close; } return index; } void *cray_bezier_SetColorAt(int sel, Geom *geom, va_list *args) { Bezier *b = (Bezier *)geom; ColorA *color; int vindex, index; HPoint3 *pt; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); (void)va_arg(*args, int); /* findex */ (void)va_arg(*args, int *); /* edge */ (void)va_arg(*args, int *); /* gpath */ pt = va_arg(*args, HPoint3 *); index = WhichCorner(b, vindex, pt); if (index < 0) return (void *)(long)craySetColorAtF(geom, color, 0, NULL); b->c[index] = *color; return (void *)geom; } void *cray_bezier_SetColorAtF(int sel, Geom *geom, va_list *args) { int i; Bezier *b = (Bezier *)geom; ColorA *color; if (!crayHasColor(geom, NULL)) return NULL; color = va_arg(*args, ColorA *); for (i = 0; i < 4; i++) b->c[i] = *color; return (void *)geom; } void *cray_bezier_GetColorAt(int sel, Geom *geom, va_list *args) { Bezier *b = (Bezier *)geom; ColorA *color; int vindex, index; HPoint3 *pt; if (!crayHasColor(geom, NULL)) return NULL; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); (void)va_arg(*args, int); /* findex */ (void)va_arg(*args, int *); /* edge */ (void)va_arg(*args, int *); /* gpath */ pt = va_arg(*args, HPoint3 *); index = WhichCorner(b, vindex, pt); if (index < 0) index = 0; *color = b->c[index]; return (void *)geom; } geomview-1.9.4/src/lib/geomutil/crayplutil/crayola.c0000644000175000001440000000775610624104223017445 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "color.h" #include "crayolaP.h" ColorA crayDefColor = {CRAY_DEFR, CRAY_DEFG, CRAY_DEFB, CRAY_DEFA}; static char methods[][CRAYOLA_MAXNAME] = { CRAYOLA_METHNAMES }; int sel[CRAYOLA_MAXMETH]; void crayolaInit(void) { int i; for (i = 0; i < CRAYOLA_MAXMETH; i++) sel[i] = GeomNewMethod(methods[i], crayFalse); cray_bezier_init(); cray_inst_init(); cray_list_init(); cray_mesh_init(); cray_polylist_init(); cray_npolylist_init(); cray_quad_init(); cray_vect_init(); cray_skel_init(); } void crayInitSpec(craySpecFunc *specfunc, int n_func, GeomClass *class) { int i; for (i = 0; i < n_func; i++) GeomSpecifyMethod(GeomMethodSel(specfunc[i].name), class, specfunc[i].func); } int crayHasColor(Geom *geom, int *gpath) { return (int)(long)GeomCall(sel[0], geom, gpath); } int crayHasVColor(Geom *geom, int *gpath) { return (int)(long)GeomCall(sel[1], geom, gpath); } int crayHasFColor(Geom *geom, int *gpath) { return (int)(long)GeomCall(sel[2], geom, gpath); } int crayCanUseVColor(Geom *geom, int *gpath) { return (int)(long)GeomCall(sel[3], geom, gpath); } int crayCanUseFColor(Geom *geom, int *gpath) { return (int)(long)GeomCall(sel[4], geom, gpath); } int crayUseVColor(Geom *geom, ColorA *color, int *gpath) { return (int)(long)GeomCall(sel[5], geom, color, gpath); } int crayUseFColor(Geom *geom, ColorA *color, int *gpath) { return (int)(long)GeomCall(sel[6], geom, color, gpath); } int crayEliminateColor(Geom *geom, int *gpath) { return (int)(long)GeomCall(sel[7], geom, gpath); } int craySetColorAll(Geom *geom, ColorA *color, int *gpath) { return (int)(long)GeomCall(sel[8], geom, color, gpath); } int craySetColorAt(Geom *geom, ColorA *color, int vindex, int findex, int *edge, int *gpath, HPoint3 *pt) { return (int)(long)GeomCall(sel[9], geom, color, vindex, findex, edge, gpath, pt); } int craySetColorAtV(Geom *geom, ColorA *color, int index, int *gpath, HPoint3 *pt) { return (int)(long)GeomCall(sel[10], geom, color, index, gpath, pt); } int craySetColorAtF(Geom *geom, ColorA *color, int index, int *gpath) { return (int)(long)GeomCall(sel[11], geom, color, index, gpath); } int crayGetColorAt(Geom *geom, ColorA *color, int vindex, int findex, int *edge, int *gpath, HPoint3 *pt) { return (int)(long)GeomCall(sel[12], geom, color, vindex, findex, edge, gpath, pt); } int crayGetColorAtV(Geom *geom, ColorA *color, int index, int *gpath, HPoint3 *pt) { return (int)(long)GeomCall(sel[13], geom, color, index, gpath, pt); } int crayGetColorAtF(Geom *geom, ColorA *color, int index, int *gpath) { return (int)(long)GeomCall(sel[14], geom, color, index, gpath); } void *crayTrue(int sel, Geom *geom, va_list *args) { return (void *)1; } void *crayFalse(int sel, Geom *geom, va_list *args) { return (void *)0; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geomutil/crayplutil/crayola.h0000644000175000001440000000442310455701001017435 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #ifndef CRAYOLA_H #define CRAYOLA_H #include "color.h" /* * Default color */ #define CRAY_DEFR 1.0 #define CRAY_DEFG 1.0 #define CRAY_DEFB 1.0 #define CRAY_DEFA 1.00 extern ColorA crayDefColor; /* * Initialize the extended routines */ void crayolaInit(); int crayHasColor(Geom *geom, int *gpath); int crayHasVColor(Geom *geom, int *gpath); int crayHasFColor(Geom *geom, int *gpath); int crayCanUseVColor(Geom *geom, int *gpath); int crayCanUseFColor(Geom *geom, int *gpath); int crayUseVColor(Geom *geom, ColorA *def, int *gpath); int crayUseFColor(Geom *geom, ColorA *def, int *gpath); int crayEliminateColor(Geom *geom, int *gpath); /* * The point itself is last because no one except beziers really cares * about it so we won't force them to read past it in the arguement list. */ int craySetColorAll(Geom *geom, ColorA *color, int *gpath); int craySetColorAt(Geom *geom, ColorA *color, int vindex, int findex, int *edge, int *gpath, HPoint3 *pt); int craySetColorAtV(Geom *geom, ColorA *color, int index, int *gpath, HPoint3 *pt); int craySetColorAtF(Geom *geom, ColorA *color, int index, int *gpath); int crayGetColorAt(Geom *geom, ColorA *color, int vindex, int findex, int *edge, int *gpath, HPoint3 *pt); int crayGetColorAtV(Geom *geom, ColorA *color, int index, int *gpath, HPoint3 *pt); int crayGetColorAtF(Geom *geom, ColorA *color, int index, int *gpath); #endif geomview-1.9.4/src/lib/geomutil/crayplutil/Makefile.am0000644000175000001440000000041210624075315017672 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcrayplutil.la libcrayplutil_la_SOURCES =\ crayBezier.c crayInst.c crayList.c crayMesh.c\ crayPolylist.c crayNPolylist.c crayQuad.c crayVect.c craySkel.c\ crayola.c crayola.h crayolaP.h geomview-1.9.4/src/lib/geomutil/crayplutil/Makefile.in0000644000175000001440000003724510665240502017716 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geomutil/crayplutil DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcrayplutil_la_LIBADD = am_libcrayplutil_la_OBJECTS = crayBezier.lo crayInst.lo crayList.lo \ crayMesh.lo crayPolylist.lo crayNPolylist.lo crayQuad.lo \ crayVect.lo craySkel.lo crayola.lo libcrayplutil_la_OBJECTS = $(am_libcrayplutil_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libcrayplutil_la_SOURCES) DIST_SOURCES = $(libcrayplutil_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcrayplutil.la libcrayplutil_la_SOURCES = \ crayBezier.c crayInst.c crayList.c crayMesh.c\ crayPolylist.c crayNPolylist.c crayQuad.c crayVect.c craySkel.c\ crayola.c crayola.h crayolaP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geomutil/crayplutil/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geomutil/crayplutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libcrayplutil.la: $(libcrayplutil_la_OBJECTS) $(libcrayplutil_la_DEPENDENCIES) $(LINK) $(libcrayplutil_la_OBJECTS) $(libcrayplutil_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayBezier.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayInst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayMesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayNPolylist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayPolylist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayQuad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/craySkel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayVect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crayola.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geomutil/crayplutil/crayInst.c0000644000175000001440000001575010455701002017600 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "instP.h" #include "crayolaP.h" void *cray_inst_HasColor(int sel, Geom *geom, va_list *args); void *cray_inst_HasVColor(int sel, Geom *geom, va_list *args); void *cray_inst_HasFColor(int sel, Geom *geom, va_list *args); void *cray_inst_CanUseVColor(int sel, Geom *geom, va_list *args); void *cray_inst_CanUseFColor(int sel, Geom *geom, va_list *args); void *cray_inst_UseVColor(int sel, Geom *geom, va_list *args); void *cray_inst_UseFColor(int sel, Geom *geom, va_list *args); void *cray_inst_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_inst_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_inst_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_inst_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_inst_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_inst_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_inst_GetColorAtV(int sel, Geom *geom, va_list *args); void *cray_inst_GetColorAtF(int sel, Geom *geom, va_list *args); #define MAX_METHODS 14 static craySpecFunc methods[] = { {"crayHasColor", cray_inst_HasColor}, {"crayHasVColor", cray_inst_HasVColor}, {"crayHasFColor", cray_inst_HasFColor}, {"crayCanUseVColor", cray_inst_CanUseVColor}, {"crayCanUseFColor", cray_inst_CanUseFColor}, {"crayUseVColor", cray_inst_UseVColor}, {"crayUseFColor", cray_inst_UseFColor}, {"crayEliminateColor", cray_inst_EliminateColor}, {"craySetColorAll", cray_inst_SetColorAll}, {"craySetColorAt", cray_inst_SetColorAt}, {"craySetColorAtV", cray_inst_SetColorAtV}, {"craySetColorAtF", cray_inst_SetColorAtF}, {"crayGetColorAt", cray_inst_GetColorAt}, {"crayGetColorAtV", cray_inst_GetColorAtV}, {"crayGetColorAtF", cray_inst_GetColorAtF} }; int cray_inst_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("inst")); return 0; } void *cray_inst_HasColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); return (void *)(long)(crayHasColor(((Inst *)geom)->geom, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_HasVColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); return (void *)(long)(crayHasVColor(((Inst *)geom)->geom, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_HasFColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); return (void *)(long)(crayHasFColor(((Inst *)geom)->geom, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_CanUseVColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); return (void *)(long)(crayCanUseVColor(((Inst *)geom)->geom, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_CanUseFColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); return (void *)(long)(crayCanUseFColor(((Inst *)geom)->geom, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_UseVColor(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int *gpath = va_arg(*args, int *); return (void *)(long)(crayUseVColor(((Inst *)geom)->geom, c, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_UseFColor(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int *gpath = va_arg(*args, int *); return (void *)(long)(crayUseFColor(((Inst *)geom)->geom, c, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_EliminateColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); return (void *)(long)(crayEliminateColor(((Inst *)geom)->geom, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_SetColorAll(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int *gpath = va_arg(*args, int *); return (void *)(long)(craySetColorAll(((Inst *)geom)->geom, c, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int vindex = va_arg(*args, int), findex = va_arg(*args, int), *edge = va_arg(*args, int *), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); return (void *)(long)(craySetColorAt(((Inst *)geom)->geom, c, vindex, findex, edge, gpath == NULL ? NULL : gpath + 1, pt)); } void *cray_inst_SetColorAtV(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); return (void *)(long)(craySetColorAtV(((Inst *)geom)->geom, c, index, gpath == NULL ? NULL : gpath + 1, pt)); } void *cray_inst_SetColorAtF(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); return (void *)(long)(craySetColorAtF(((Inst *)geom)->geom, c, index, gpath == NULL ? NULL : gpath + 1)); } void *cray_inst_GetColorAt(int sel, Geom *geom, va_list *args) { Geom *newgeom = ((Inst *)geom)->geom; ColorA *c = va_arg(*args, ColorA *); int vindex = va_arg(*args, int), findex = va_arg(*args, int), *edge = va_arg(*args, int *), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); return (void *)(long)(crayGetColorAt(newgeom, c, vindex, findex, edge, gpath == NULL ? NULL : gpath + 1, pt)); } void *cray_inst_GetColorAtV(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); return (void *)(long)(crayGetColorAtV(((Inst *)geom)->geom, c, index, gpath == NULL ? NULL : gpath + 1, pt)); } void *cray_inst_GetColorAtF(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); return (void *)(long)(crayGetColorAtF(((Inst *)geom)->geom, c, index, gpath == NULL ? NULL : gpath + 1)); } geomview-1.9.4/src/lib/geomutil/crayplutil/crayList.c0000644000175000001440000002111510455701002017566 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "listP.h" #include "crayolaP.h" void *cray_list_HasColor(int sel, Geom *geom, va_list *args); void *cray_list_HasVColor(int sel, Geom *geom, va_list *args); void *cray_list_HasFColor(int sel, Geom *geom, va_list *args); void *cray_list_CanUseVColor(int sel, Geom *geom, va_list *args); void *cray_list_CanUseFColor(int sel, Geom *geom, va_list *args); void *cray_list_UseVColor(int sel, Geom *geom, va_list *args); void *cray_list_UseFColor(int sel, Geom *geom, va_list *args); void *cray_list_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_list_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_list_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_list_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_list_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_list_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_list_GetColorAtV(int sel, Geom *geom, va_list *args); void *cray_list_GetColorAtF(int sel, Geom *geom, va_list *args); #define MAX_METHODS 14 static craySpecFunc methods[] = { {"crayHasColor", cray_list_HasColor}, {"crayHasVColor", cray_list_HasVColor}, {"crayHasFColor", cray_list_HasFColor}, {"crayCanUseVColor", cray_list_CanUseVColor}, {"crayCanUseFColor", cray_list_CanUseFColor}, {"crayUseVColor", cray_list_UseVColor}, {"crayUseFColor", cray_list_UseFColor}, {"crayEliminateColor", cray_list_EliminateColor}, {"craySetColorAll", cray_list_SetColorAll}, {"craySetColorAt", cray_list_SetColorAt}, {"craySetColorAtV", cray_list_SetColorAtV}, {"craySetColorAtF", cray_list_SetColorAtF}, {"crayGetColorAt", cray_list_GetColorAt}, {"crayGetColorAtV", cray_list_GetColorAtV}, {"crayGetColorAtF", cray_list_GetColorAtF} }; int cray_list_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("list")); return 0; } static Geom *ListElement(Geom *list, int elem) { int i; List *l = (List *)list; for (i = 0; i < elem && l != NULL; i++) l = l->cdr; if (l == NULL) { OOGLError(1, "Unable to retrieve list element %d\n", elem); return NULL; } return l->car; } /* * Performs the named function (with its arguements included) on each * element of the list found in the variable geom, then returns the * result of all of them |'d together */ #define LIST_EACH(list, func) \ { \ long val; \ for (val = 0; (list = (Geom*)((List *)(list))->cdr);) \ val |= (long)func; \ return (void *)val; \ } void *cray_list_HasColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayHasColor(ListElement(geom, *gpath), gpath + 1)); LIST_EACH(geom, crayHasColor(((List *)geom)->car, NULL)); } void *cray_list_HasVColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayHasVColor(ListElement(geom, *gpath), gpath + 1)); LIST_EACH(geom, crayHasVColor(((List *)geom)->car, NULL)); } void *cray_list_HasFColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayHasFColor(ListElement(geom, *gpath), gpath + 1)); LIST_EACH(geom, crayHasFColor(((List *)geom)->car, NULL)); } void *cray_list_CanUseVColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayCanUseVColor(ListElement(geom, *gpath), gpath + 1)); LIST_EACH(geom, crayCanUseVColor(((List *)geom)->car, NULL)); } void *cray_list_CanUseFColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayCanUseFColor(ListElement(geom, *gpath), gpath + 1)); LIST_EACH(geom, crayCanUseFColor(((List *)geom)->car, NULL)); } void *cray_list_UseVColor(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayUseVColor(ListElement(geom, *gpath), c, gpath + 1)); LIST_EACH(geom, crayUseVColor(((List *)geom)->car, c, NULL)); } void *cray_list_UseFColor(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayUseFColor(ListElement(geom, *gpath), c, gpath + 1)); LIST_EACH(geom, crayUseFColor(((List *)geom)->car, c, NULL)); } void *cray_list_EliminateColor(int sel, Geom *geom, va_list *args) { int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayEliminateColor(ListElement(geom, *gpath), gpath + 1)); LIST_EACH(geom, crayEliminateColor(((List *)geom)->car, NULL)); } void *cray_list_SetColorAll(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)craySetColorAll(ListElement(geom, *gpath), c, gpath + 1); LIST_EACH(geom, craySetColorAll(((List *)geom)->car, c, NULL)); } void *cray_list_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int vindex = va_arg(*args, int), findex = va_arg(*args, int), *edge = va_arg(*args, int *), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); if (gpath != NULL) return (void *)(long)(craySetColorAt(ListElement(geom, *gpath), c, vindex, findex, edge, gpath + 1, pt)); LIST_EACH(geom, craySetColorAt(((List *)geom)->car, c, vindex, findex, edge, NULL, pt)); } void *cray_list_SetColorAtV(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); if (gpath != NULL) return (void *)(long)(craySetColorAtV(ListElement(geom, *gpath), c, index, gpath + 1, pt)); LIST_EACH(geom, craySetColorAtV(((List *)geom)->car, c, index, NULL, pt)); } void *cray_list_SetColorAtF(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(craySetColorAtF(ListElement(geom, *gpath), c, index, gpath + 1)); LIST_EACH(geom, craySetColorAtF(((List *)geom)->car, c, index, NULL)); } void *cray_list_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int vindex = va_arg(*args, int), findex = va_arg(*args, int), *edge = va_arg(*args, int *), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); if (gpath != NULL) return (void *)(long)(crayGetColorAt(ListElement(geom, *gpath), c, vindex, findex, edge, gpath + 1, pt)); LIST_EACH(geom, crayGetColorAt(((List *)geom)->car, c, vindex, findex, edge, NULL, pt)); } void *cray_list_GetColorAtV(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); HPoint3 *pt = va_arg(*args, HPoint3 *); if (gpath != NULL) return (void *)(long)(crayGetColorAtV(ListElement(geom, *gpath), c, index, gpath + 1, pt)); LIST_EACH(geom, crayGetColorAtV(((List *)geom)->car, c, index, NULL, pt)); } void *cray_list_GetColorAtF(int sel, Geom *geom, va_list *args) { ColorA *c = va_arg(*args, ColorA *); int index = va_arg(*args, int), *gpath = va_arg(*args, int *); if (gpath != NULL) return (void *)(long)(crayGetColorAtF(ListElement(geom, *gpath), c, index, gpath + 1)); LIST_EACH(geom, crayGetColorAtF(((List *)geom)->car, c, index, NULL)); } geomview-1.9.4/src/lib/geomutil/crayplutil/crayMesh.c0000644000175000001440000001277710605732650017577 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "ooglutil.h" #include "geom.h" #include "meshP.h" #include "crayolaP.h" static char msg[] = "crayMesh.c"; void *cray_mesh_HasVColor(int sel, Geom *geom, va_list *args); void *cray_mesh_UseVColor(int sel, Geom *geom, va_list *args); void *cray_mesh_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_mesh_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_mesh_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_mesh_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_mesh_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_mesh_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_mesh_GetColorAtV(int sel, Geom *geom, va_list *args); #define MAX_METHODS 11 static craySpecFunc methods[] = { {"crayHasColor", cray_mesh_HasVColor}, {"crayHasVColor", cray_mesh_HasVColor}, {"crayCanUseVColor", crayTrue}, {"crayUseVColor", cray_mesh_UseVColor}, {"crayEliminateColor", cray_mesh_EliminateColor}, {"craySetColorAll", cray_mesh_SetColorAll}, {"craySetColorAt", cray_mesh_SetColorAt}, {"craySetColorAtF", cray_mesh_SetColorAtF}, {"craySetColorAtV", cray_mesh_SetColorAtV}, {"crayGetColorAt", cray_mesh_GetColorAt}, {"crayGetColorAtV", cray_mesh_GetColorAtV} }; int cray_mesh_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("mesh")); return 0; } void *cray_mesh_HasVColor(int sel, Geom *geom, va_list *args) { Mesh *m = (Mesh *)geom; return (void *)(long)(m->geomflags & MESH_C); } void *cray_mesh_UseVColor(int sel, Geom *geom, va_list *args) { int i; Mesh *m = (Mesh *)geom; ColorA *def; if (crayHasVColor(geom, NULL)) return 0; def = va_arg(*args, ColorA *); m->c = OOGLNewNE(ColorA, m->nu * m->nv, msg); for (i = 0; i < m->nu * m->nv; i++) { m->c[i].r = def->r; m->c[i].g = def->g; m->c[i].b = def->b; m->c[i].a = def->a; } m->geomflags |= MESH_C; return (void *)geom; } void *cray_mesh_EliminateColor(int sel, Geom *geom, va_list *args) { Mesh *m = (Mesh *)geom; if (!crayHasColor(geom, NULL)) return 0; OOGLFree(m->c); m->c = NULL; m->geomflags ^= MESH_C; return (void *)geom; } void *cray_mesh_SetColorAll(int sel, Geom *geom, va_list *args) { int i; Mesh *m = (Mesh *)geom; ColorA *color; if (!crayHasVColor(geom, NULL)) return NULL; color = va_arg(*args, ColorA *); for (i = 0; i < m->nu * m->nv; i++) m->c[i] = *color; return (void *)geom; } void *cray_mesh_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex, *eindex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); eindex = va_arg(*args, int *); if (vindex != -1) return (void *)(long)craySetColorAtV(geom, color, vindex, NULL, NULL); if (eindex[0] != eindex[1]) { craySetColorAtV(geom, color, eindex[0], NULL, NULL); return (void *)(long)craySetColorAtV(geom, color, eindex[1], NULL, NULL); } return (void *)(long)craySetColorAtF(geom, color, findex, NULL); } void *cray_mesh_SetColorAtV(int sel, Geom *geom, va_list *args) { Mesh *m = (Mesh *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) return 0; m->c[index].r = color->r; m->c[index].g = color->g; m->c[index].b = color->b; m->c[index].a = color->a; return (void *)color; } void *cray_mesh_SetColorAtF(int sel, Geom *geom, va_list *args) { Mesh *m = (Mesh *)geom; ColorA *color; int index, u, v; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasColor(geom, NULL) || index == -1) return 0; u = index % m->nu; v = index / m->nu; m->c[MESHINDEX(u, v, m)] = *color; m->c[MESHINDEX(u+1, v, m)] = *color; m->c[MESHINDEX(u+1, v+1, m)] = *color; m->c[MESHINDEX(u, v+1, m)] = *color; return (void *)m; } void *cray_mesh_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int i; color = va_arg(*args, ColorA *); i = va_arg(*args, int); return (void *)(long)crayGetColorAtV(geom, color, i, NULL, NULL); } void *cray_mesh_GetColorAtV(int sel, Geom *geom, va_list *args) { ColorA *color; int i; Mesh *m = (Mesh *)geom; if (!crayHasVColor(geom, NULL)) return 0; color = va_arg(*args, ColorA *); i = va_arg(*args, int); color->r = m->c[i].r; color->g = m->c[i].g; color->b = m->c[i].b; color->a = m->c[i].a; return (void *)color; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geomutil/crayplutil/crayQuad.c0000644000175000001440000001403710605733020017554 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include "geom.h" #include "quadP.h" #include "crayolaP.h" static char msg[] = "crayQuad.c"; void *cray_quad_HasVColor(int sel, Geom *geom, va_list *args); void *cray_quad_UseVColor(int sel, Geom *geom, va_list *args); void *cray_quad_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_quad_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_quad_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_quad_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_quad_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_quad_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_quad_GetColorAtV(int sel, Geom *geom, va_list *args); void *cray_quad_GetColorAtF(int sel, Geom *geom, va_list *args); #define MAX_METHODS 12 static craySpecFunc methods[] = { {"crayHasColor", cray_quad_HasVColor}, {"crayHasVColor", cray_quad_HasVColor}, {"crayCanUseVColor", crayTrue}, {"crayUseVColor", cray_quad_UseVColor}, {"crayEliminateColor", cray_quad_EliminateColor}, {"craySetColorAll", cray_quad_SetColorAll}, {"craySetColorAt", cray_quad_SetColorAt}, {"craySetColorAtV", cray_quad_SetColorAtV}, {"craySetColorAtF", cray_quad_SetColorAtF}, {"crayGetColorAt", cray_quad_GetColorAt}, {"crayGetColorAtV", cray_quad_GetColorAtV}, {"crayGetColorAtF", cray_quad_GetColorAtF} }; int cray_quad_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("quad")); return 0; } void *cray_quad_HasVColor(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; return (void *)(long)(q->geomflags & QUAD_C); } void *cray_quad_UseVColor(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; ColorA *color; int i; if (crayHasVColor(geom, NULL)) return 0; color = va_arg(*args, ColorA *); q->c = OOGLNewNE(QuadC, q->maxquad, msg); for (i = 0; i < q->maxquad; i++) q->c[i][0] = q->c[i][1] = q->c[i][2] = q->c[i][3] = *color; q->geomflags |= QUAD_C; return (void *)geom; } void *cray_quad_EliminateColor(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; if (!crayHasVColor(geom, NULL)) return 0; OOGLFree(q->c); q->c = NULL; q->geomflags &= ~QUAD_C; return (void *)geom; } void *cray_quad_SetColorAll(int sel, Geom *geom, va_list *args) { int i; Quad *q = (Quad *)geom; ColorA *color = va_arg(*args, ColorA *); if (!crayHasColor(geom, NULL)) return NULL; for (i = 0; i < q->maxquad; i++) { q->c[i][0] = *color; q->c[i][1] = *color; q->c[i][2] = *color; q->c[i][3] = *color; } return (void *)geom; } void *cray_quad_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex, *eindex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); eindex = va_arg(*args, int *); if (vindex != -1) return (void *)(long)craySetColorAtV(geom, color, vindex, NULL, NULL); if (eindex[0] != eindex[1]) { craySetColorAtV(geom, color, eindex[0], NULL, NULL); return (void *)(long)craySetColorAtV(geom, color, eindex[1], NULL, NULL); } return (void *)(long)craySetColorAtF(geom, color, findex, NULL); } void *cray_quad_SetColorAtV(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1 || !crayHasVColor(geom, NULL)) return 0; q->c[0][index] = *color; return (void *)geom; } /* * Note - this is somewhat strangely written. Quad colors may be set * (and gotten) by vertex or by face, although they are always stored * by vertex. */ void *cray_quad_SetColorAtF(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1 || !crayHasVColor(geom, NULL)) return 0; q->c[index][0] = q->c[index][1] = q->c[index][2] = q->c[index][3] = *color; return (void *)geom; } void *cray_quad_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); if (!crayHasVColor(geom, NULL)) return 0; if (vindex != -1) return (void *)(long)crayGetColorAtV(geom, color, vindex, NULL, NULL); return (void *)(long)crayGetColorAtF(geom, color, findex, NULL); } void *cray_quad_GetColorAtV(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) return 0; *color = q->c[0][index]; return (void *)geom; } void *cray_quad_GetColorAtF(int sel, Geom *geom, va_list *args) { Quad *q = (Quad *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) return 0; *color = q->c[index][0]; return (void *)geom; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geomutil/crayplutil/craySkel.c0000644000175000001440000002044410606531704017565 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include /* for abs() */ #include "geom.h" #include "skelP.h" #include "crayolaP.h" static char msg[] = "craySkel.c"; void *cray_skel_HasColor(int sel, Geom *geom, va_list *args); void *cray_skel_HasVColor(int sel, Geom *geom, va_list *args); void *cray_skel_HasFColor(int sel, Geom *geom, va_list *args); void *cray_skel_UseVColor(int sel, Geom *geom, va_list *args); void *cray_skel_UseFColor(int sel, Geom *geom, va_list *args); void *cray_skel_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_skel_SetColorAll(int sel, Geom *geom, va_list *args); void *cray_skel_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_skel_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_skel_SetColorAtF(int sel, Geom *geom, va_list *args); void *cray_skel_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_skel_GetColorAtV(int sel, Geom *geom, va_list *args); void *cray_skel_GetColorAtF(int sel, Geom *geom, va_list *args); #define MAX_METHODS 15 static craySpecFunc methods[] = { {"crayHasColor", cray_skel_HasColor}, {"crayHasVColor", cray_skel_HasVColor}, {"crayHasFColor", cray_skel_HasFColor}, {"crayCanUseVColor", crayTrue}, {"crayCanUseFColor", crayTrue}, {"crayUseVColor", cray_skel_UseVColor}, {"crayUseFColor", cray_skel_UseFColor}, {"crayEliminateColor", cray_skel_EliminateColor}, {"craySetColorAll", cray_skel_SetColorAll}, {"craySetColorAt", cray_skel_SetColorAt}, {"craySetColorAtV", cray_skel_SetColorAtV}, {"craySetColorAtF", cray_skel_SetColorAtF}, {"crayGetColorAt", cray_skel_GetColorAt}, {"crayGetColorAtV", cray_skel_GetColorAtV}, {"crayGetColorAtF", cray_skel_GetColorAtF} }; int cray_skel_init(void) { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("skel")); return 0; } void *cray_skel_HasColor(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; return (void *)(long)((s->geomflags & GEOM_COLOR) != 0); } void *cray_skel_HasFColor(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; return (void *)(long)((s->geomflags & FACET_C) != 0); } void *cray_skel_HasVColor(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; return (void *)(long)((s->geomflags & VERT_C) != 0); } /* Make sure the given SKEL has per-vertex colours, initialize a * default colour. */ void *cray_skel_UseVColor(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; int i, j, k, ic; ColorA *def; def = va_arg(*args, ColorA *); if (s->vc == NULL) { s->vc = OOGLNewNE(ColorA, s->nvert, msg); } /* install the given default colour */ for (i = 0; i < s->nvert; i++) s->vc[i] = *def; /* if s has per-segment colours, initialize the vertex colours with * them. Of course, this cannot work properly. Should we do some * averaging? */ if (s->geomflags & FACET_C) { for (i = 0; i < s->nlines; i++) { if (s->l[i].nc == 0) { continue; } ic = s->l[i].c0; /* index of first and only colour */ for (j = 0; j < s->l[i].nv; j++) { k = s->vi[s->l[i].v0+j]; /* vertex colour index */ s->vc[k] = s->c[ic]; } } } s->geomflags |= VERT_C; return (void *)geom; } /* Same as above, but make sure the Skel object has facet (== segment) colour */ void *cray_skel_UseFColor(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; int i; ColorA *color, *def; def = va_arg(*args, ColorA *); color = OOGLNewNE(ColorA, s->nlines, msg); for (i = 0; i < s->nlines; i++) { if (s->l[i].nc == 1) { color[i] = s->c[s->l[i].c0]; } else if (s->geomflags & VERT_C) { /* initialize with first vertex color */ color[i] = s->vc[s->vi[s->l[i].v0]]; } else { /* initialize with default colour */ color[i] = *def; } s->l[i].c0 = i; /* use a linear mapping, no holes anymore */ } if (s->c) { OOGLFree(s->c); } s->c = color; s->geomflags |= FACET_C; return (void *)geom; } void *cray_skel_EliminateColor(int sel, Geom *geom, va_list *args) { int i; Skel *s = (Skel *)geom; if (!crayHasColor(geom, NULL)) return 0; if (s->c) { OOGLFree(s->c); s->c = NULL; } if (s->vc) { OOGLFree(s->vc); s->vc = NULL; } for (i = 0; i < s->nlines; i++) { s->l[i].nc = 0; s->l[i].c0 = -1; } s->geomflags &= ~GEOM_COLOR; return (void *)geom; } void *cray_skel_SetColorAll(int sel, Geom *geom, va_list *args) { int i; Skel *s = (Skel *)geom; ColorA *color = va_arg(*args, ColorA *); if (!crayHasVColor(geom, NULL)) return NULL; if (s->c) { for (i = 0; i < s->nlines; i++) { s->c[s->l[i].c0] = *color; } } if (s->vc) { for (i = 0; i < s->nvert; i++) { s->vc[i] = *color; } } return geom; } void *cray_skel_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex, *eindex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); eindex = va_arg(*args, int *); if (crayHasVColor(geom, NULL)) { if (vindex != -1) return (void *)(long)craySetColorAtV(geom, color, vindex, NULL, NULL); if (eindex[0] != eindex[1]) { craySetColorAtV(geom, color, eindex[0], NULL, NULL); return (void *)(long)craySetColorAtV(geom, color, eindex[1], NULL, NULL); } } return (void *)(long)craySetColorAtF(geom, color, findex, NULL); } void *cray_skel_SetColorAtV(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) { return NULL; } s->vc[index] = *color; return (void *)geom; } void *cray_skel_SetColorAtF(int sel, Geom *geom, va_list *args) { int i; Skel *s = (Skel *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1) { return NULL; } if (crayHasFColor(geom, NULL)) { /* The current facet possibly has no color */ if (s->l[index].nc == 0) { s->c = OOGLRenewNE(ColorA, s->c, s->nc+1, msg); s->l[index].c0 = s->nc++; s->l[index].nc = 1; } s->c[s->l[index].c0] = *color; } else if (crayHasVColor(geom, NULL)) { for (i = 0; i < s->l[index].nv; i++) { s->vc[s->vi[s->l[index].v0+i]] = *color; } } return (void *)geom; } void *cray_skel_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, findex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); findex = va_arg(*args, int); if (crayHasVColor(geom, NULL)) { return (void *)(long)crayGetColorAtV(geom, color, vindex, NULL, NULL); } if (crayHasFColor(geom, NULL)) { return (void *)(long)crayGetColorAtF(geom, color, findex, NULL); } return NULL; } void *cray_skel_GetColorAtV(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasVColor(geom, NULL) || index == -1) { return NULL; } *color = s->vc[index]; return (void *)geom; } void *cray_skel_GetColorAtF(int sel, Geom *geom, va_list *args) { Skel *s = (Skel *)geom; ColorA *color; int index; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (!crayHasFColor(geom, NULL) || index == -1) { return NULL; } if (s->l[index].nc == 0) { return NULL; } *color = s->c[s->l[index].c0]; return (void *)geom; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/geomutil/crayplutil/Headers0000644000175000001440000000002507730236630017137 00000000000000crayola.h crayolaP.h geomview-1.9.4/src/lib/geomutil/crayplutil/crayVect.c0000644000175000001440000001546110623612010017560 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include /* for abs() */ #include "geom.h" #include "vectP.h" #include "crayolaP.h" static char msg[] = "crayVect.c"; void *cray_vect_HasColor(int sel, Geom *geom, va_list *args); void *cray_vect_HasVColor(int sel, Geom *geom, va_list *args); void *cray_vect_HasFColor(int sel, Geom *geom, va_list *args); void *cray_vect_UseVColor(int sel, Geom *geom, va_list *args); void *cray_vect_UseFColor(int sel, Geom *geom, va_list *args); void *cray_vect_EliminateColor(int sel, Geom *geom, va_list *args); void *cray_vect_SetColorAt(int sel, Geom *geom, va_list *args); void *cray_vect_SetColorAtV(int sel, Geom *geom, va_list *args); void *cray_vect_GetColorAt(int sel, Geom *geom, va_list *args); void *cray_vect_GetColorAtV(int sel, Geom *geom, va_list *args); #define MAX_METHODS 12 static craySpecFunc methods[] = { {"crayHasColor", cray_vect_HasColor}, {"crayHasVColor", cray_vect_HasVColor}, {"crayHasFColor", cray_vect_HasFColor}, {"crayCanUseVColor", crayTrue}, {"crayCanUseFColor", crayTrue}, {"crayUseVColor", cray_vect_UseVColor}, {"crayUseFColor", cray_vect_UseFColor}, {"crayEliminateColor", cray_vect_EliminateColor}, {"craySetColorAt", cray_vect_SetColorAt}, {"craySetColorAtV", cray_vect_SetColorAtV}, {"crayGetColorAt", cray_vect_GetColorAt}, {"crayGetColorAtV", cray_vect_GetColorAtV} }; int cray_vect_init() { crayInitSpec(methods, MAX_METHODS, GeomClassLookup("vect")); return 0; } void *cray_vect_HasColor(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; return (void *)(long)(v->ncolor); } void *cray_vect_HasFColor(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; return (void *)(long)((v->ncolor == v->nvec) ? 1 : 0); } void *cray_vect_HasVColor(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; return (void *)(long)((v->ncolor == v->nvert) ? 1 : 0); } void *cray_vect_UseVColor(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; int h, i, j, k; ColorA *color, *def; def = va_arg(*args, ColorA *); /* h = current point * i = current polyline * j = current point in polyline * k = current color index (in cold list of colors) */ color = OOGLNewNE(ColorA, v->nvert, msg); for (h = i = k = 0; i < v->nvec; i++) { if (v->vncolor[i]) def = &v->c[k]; for (j = 0; j < abs(v->vnvert[i]); j++) { color[h++] = *def; if (v->vncolor[i] > 1) def++; } k += v->vncolor[i]; v->vncolor[i] = abs(v->vnvert[i]); } if (v->c != NULL) OOGLFree(v->c); v->c = color; v->ncolor = v->nvert; return (void *)geom; } void *cray_vect_UseFColor(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; int i, k; ColorA *color, *def; def = va_arg(*args, ColorA *); color = OOGLNewNE(ColorA, v->nvec, msg); /* * i = current polyline * j = current vertex of current polyline * k = current color * h = current vertex of vect */ for (i = k = 0; i < v->nvec; i++) { switch(v->vncolor[i]) { case 1: def = &v->c[k++]; case 0: color[i] = *def; break; default: if (v->vncolor[i] != abs(v->vnvert[i])) { OOGLError(1, "Illegal # of colors / # of vertices combination."); return (void *)0; } def = &v->c[k + 1]; color[i] = *def; k += abs(v->vnvert[i]); break; } v->vncolor[i] = 1; } if (v->c != NULL) OOGLFree(v->c); v->c = color; v->ncolor = v->nvec; return (void *)geom; } void *cray_vect_EliminateColor(int sel, Geom *geom, va_list *args) { int i; Vect *v = (Vect *)geom; if (!crayHasColor(geom, NULL)) return 0; if (v->ncolor) OOGLFree(v->c); v->c = NULL; v->ncolor = 0; for (i = 0; i < v->nvec; i++) v->vncolor[i] = 0; return (void *)geom; } void *cray_vect_SetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, *eindex; HPoint3 *pt; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); /*findex = */(void)va_arg(*args, int); eindex = va_arg(*args, int *); pt = va_arg(*args, HPoint3 *); if (vindex != -1) craySetColorAtV(geom, color, vindex, NULL, pt); else { craySetColorAtV(geom, color, eindex[0], NULL, pt); craySetColorAtV(geom, color, eindex[1], NULL, pt); } return (void *)geom; } void *cray_vect_SetColorAtV(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; ColorA *color; int index; int i, j, k; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1) return NULL; for (i = j = k = 0; i < v->nvec; i++, j+= abs(v->vnvert[i]), k += v->vncolor[i]) if (j + abs(v->vnvert[i]) > index) break; switch(v->vncolor[i]) { case 0: return NULL; case 1: v->c[k] = *color; break; default: v->c[k + (index - j)] = *color; break; } return (void *)geom; } void *cray_vect_GetColorAt(int sel, Geom *geom, va_list *args) { ColorA *color; int vindex, *eindex; color = va_arg(*args, ColorA *); vindex = va_arg(*args, int); /*findex = */(void)va_arg(*args, int); eindex = va_arg(*args, int *); if (vindex != -1) return (void *)(long)crayGetColorAtV(geom, color, vindex, NULL, NULL); else return (void *)(long)crayGetColorAtV(geom, color, eindex[0], NULL, NULL); } void *cray_vect_GetColorAtV(int sel, Geom *geom, va_list *args) { Vect *v = (Vect *)geom; ColorA *color; int index; int i, j, k; color = va_arg(*args, ColorA *); index = va_arg(*args, int); if (index == -1 || !v->ncolor) return NULL; for (i = j = k = 0; i < v->nvec; i++, j+= abs(v->vnvert[i]), k += v->vncolor[i]) if (j + abs(v->vnvert[i]) > index) break; switch(v->vncolor[i]) { case 1: k++; case 0: *color = v->c[k]; break; default: *color = v->c[k + (index - j)]; break; } return (void *)geom; } geomview-1.9.4/src/lib/geomutil/Makefile.am0000644000175000001440000000012710600605634015502 00000000000000SUBDIRS = bdy crayplutil dim plutil man_MANS = geomutil.3gv EXTRA_DIST = $(man_MANS) geomview-1.9.4/src/lib/geomutil/Makefile.in0000644000175000001440000004315010665240502015516 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geomutil DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive man3dir = $(mandir)/man3 am__installdirs = "$(DESTDIR)$(man3dir)" NROFF = nroff MANS = $(man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = bdy crayplutil dim plutil man_MANS = geomutil.3gv EXTRA_DIST = $(man_MANS) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geomutil/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geomutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man3: $(man3_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.3*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 3*) ;; \ *) ext='3' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \ done uninstall-man3: @$(NORMAL_UNINSTALL) @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.3*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 3*) ;; \ *) ext='3' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man3dir)/$$inst"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(MANS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man3dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-man install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-man3 install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man3 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man3 install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am uninstall-man \ uninstall-man3 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geomutil/geomutil.3gv0000644000175000001440000000177010600600312015705 00000000000000.TH geomutil 3gv "July 10, 1992" "Geometry Center" .SH NAME geomutil -\ various geometry utilities (introduction) .SH DESCRIPTION .PP The geomutil library contains a collection of miscellaneous geometric utility functions: .nf AnyToPL() - convert any geom to a polylist PLCombine() - combine two polylists into one PLConsol() - consolidate vertices in a polylist Bdy() - generate the boundary (edge) of a geom .fi Each function has its own manual page which gives usage details. .PP To link your program with the geomutil library you should specify -lgeomutil followed by the usual list of OOGL libraries, as in .nf cc -L${LIBDIR} prog.c -lgeomutil \\ -lstubdraw -lgeom -lvect -lpolylist -lquad \\ -lmesh -lbezier -linst -ltlist -llist -lstub \\ -lgeom -loogl -lbbox -lshade -lcolor -l3d -lm .fi .SH SEE ALSO .nf anytopl(3), plcombine(3), plconsol(3), bdy(3), anytooff(1), offcombine(1), offconsol(1), bdy(1), geomview(1) .fi .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.4/src/lib/geomutil/plutil/0000777000175000001440000000000010665240675015056 500000000000000geomview-1.9.4/src/lib/geomutil/plutil/plutil.h0000644000175000001440000000277210510667535016461 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* * plutil.h * author: Celeste Fowler * date: June 12, 1992 */ #ifndef PLUTIL_H #define PLUTIL_H #include "appearance.h" #include "transformn.h" typedef struct _PLData PLData; Geom *PLCombine(Geom *a1, Geom *b1); Geom *AnyToPL(Geom *old, Transform T); Geom *PLConsol(Geom *g, float prec); PLData *AnyGeomToPLData(Geom *old, Transform T, TransformN *Tn, Appearance *ap, PLData *pd); Geom *PLDataToGeom(PLData *pd, int want, int unwant); #define PL_C 0x1 /* Bits for "want" and "unwant" flags. */ #define PL_N 0x2 #define PL_H 0x4 #define PL_ND 0x8 #endif /* PLUTIL_H */ geomview-1.9.4/src/lib/geomutil/plutil/plconsol.3gv0000644000175000001440000000160510600600312017217 00000000000000.TH plconsol 3gv "June 25, 1992" "Geometry Center" .SH NAME PLConsol() -\ polylist consolidator. .SH SYNOPSIS Geom *PLConsol(Geom *g, float prec); .SH DESCRIPTION .PP PLConsol() is a function which takes a geom, which must be a polylist, as its argument and returns a version of the polylist which has no repeated vertices. Two vertices are considered to be identical if they are within prec of one another. The comparison takes into account only the location of the points, not their normals or colors. .PP The vertices of the resultant polyline have been sorted, and so there order bears no resemblance to the order of the point in the original polylist. .SH LINKING PLConsol() is part of the geomutil library; see geomutil(3) for information on how to link your program with this library. .SH SEE ALSO offconsol(1), geomview(1), geomutil(3) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.4/src/lib/geomutil/plutil/anytopl.c0000644000175000001440000005033310622716753016626 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * anytopl.c * author: Celeste Fowler * date: June 12, 1992 * Rewritten, Stuart Levy, July, 1996. */ #include #include #include "transformn.h" #include "polylistP.h" #include "npolylistP.h" #include "bezierP.h" #include "quadP.h" #include "meshP.h" #include "ndmeshP.h" #include "vectP.h" #include "listP.h" #include "discgrpP.h" #include "instP.h" #include "skelP.h" #include "hpoint3.h" #include "point3.h" #include "plutil.h" #ifndef alloca #include #endif #define PL_C 0x1 #define PL_N 0x2 #define PL_H 0x4 #define PL_ND 0x8 #define PL_HASPC PL_HASPCOL #define PL_HASVC PL_HASVCOL typedef struct _face { int nv; /* Number of vertices on this face */ int v0; /* Index of first vertex in vtable */ ColorA fcolor; /* Face color if specified */ } Face; typedef struct _vert { HPoint3 p; ColorA c; Point3 n; float *ndp; /* Pointer to raw data for N-D vertex */ int hdim; /* Dimension of this point */ int has; } Vert; struct _PLData { int maxdim; int some, all; /* PL_HASVN, PL_HASVC, PL_HASPN, PL_HASPC */ vvec faces; /* Table {Face} of all faces */ vvec verts; /* Table {Vert} of vertices */ vvec vtable; /* Table of vertex-indices for all faces */ /* Top of stacks of... */ TransformN *Tn; /* N-D to 3-D transform */ Transform T; /* 3-D transform */ Appearance *ap; /* appearance */ }; #define PLnextvert(PL) VVCOUNT((PL)->verts) Geom *PLDataToGeom(PLData *PL, int want, int unwant); static void PLDataDelete(PLData *PL); static PLData *PLDataCreate(); static void initmethods(); static void PLaddface(PLData *PL, int nv, int verts[], ColorA *c); static void PLaddvect(PLData *PL, int nv, int verts[], ColorA *c); static int PLaddverts(PLData *PL, int nv, HPoint3 *v, ColorA *c, Point3 *n); static int PLaddNDverts(PLData *PL, int nv, int hdim, float *v, ColorA *c); static void PLaddseg(PLData *PL, int v0, int v1, ColorA *c); static int toPLsel; static ColorA white = {1,1,1,1}; static ColorA black = {0,0,0,1}; static Point3 noNormal = {0,0,0}; /* * AnyToPL converter. * Converts any geomview object to a polylist and returns a pointer * to the polylist. NB to future developers: * There are a lot of assumptions about the internals ofny * the various data types. If anything changes, things will have to * be adjusted accordingly. */ Geom *AnyToPL(Geom *g, Transform T) { PLData *pd = AnyGeomToPLData(g, T, NULL, NULL, NULL); Geom *ng = PLDataToGeom(pd, 0, PL_ND); PLDataDelete(pd); return ng; } static HPoint3 *hpoints(PLData *PL) { HPointN hp; int i; HPoint3 *pts = OOGLNewNE(HPoint3, VVCOUNT(PL->verts), "PL verts"); HPoint3 *p = pts; Vert *v = VVEC(PL->verts, Vert); static int xyzw[] = {0, 1, 2, -1}; for(i = 0; i < VVCOUNT(PL->verts); i++, p++, v++) { if(v->hdim == 0) { *p = v->p; } else { if(PL->Tn) { hp.dim = v->hdim; hp.v = v->ndp; HPtNTransformComponents(PL->Tn, &hp, xyzw, p); } else { /* Project to 3-space: just take first 3 and final components. */ memcpy(p, v->ndp, 3*sizeof(float)); p->w = v->ndp[v->hdim-1]; } } } return pts; } static float *ndpoints(PLData *PL) { HPointN hp; int i; int hdim = PL->maxdim ? PL->maxdim : 4; float *pts = OOGLNewNE(float, hdim*VVCOUNT(PL->verts), "PL ndverts"); float *p = pts; Vert *v = VVEC(PL->verts, Vert); int *comp = (int *)alloca(hdim*sizeof(int)); for(i = 0; i < hdim; i++) comp[i] = i; comp[hdim-1] = -1; for(i = 0; i < VVCOUNT(PL->verts); i++, v++, p += hdim) { if(PL->Tn) { if(v->hdim) { hp.dim = v->hdim; hp.v = v->ndp; } else { hp.dim = 4; hp.v = &v->p.x; } HPtNTransformComponents(PL->Tn, &hp, comp, (HPoint3 *)p); } else { if(v->hdim == hdim) { memcpy(p, v->ndp, hdim*sizeof(float)); } else if(v->hdim == 0) { memcpy(p, &v->p, 3*sizeof(float)); memset(p+3, 0, (hdim-4)*sizeof(float)); p[hdim-1] = v->p.w; } else if(v->hdim < hdim) { memcpy(p, v->ndp, (v->hdim-1)*sizeof(float)); memset(p+v->hdim, 0, (hdim - v->hdim - 1)*sizeof(float)); p[hdim-1] = v->ndp[v->hdim-1]; } else { memcpy(p, v->ndp, (hdim-1)*sizeof(float)); p[hdim-1] = v->ndp[v->hdim-1]; } } } return pts; } /* Unpack PLData */ Geom *PLDataToGeom(PLData *PL, int want, int unwant) { HPoint3 *hpts = NULL; float *nhpts = NULL; ColorA *c = NULL, *pc = NULL; Point3 *n = NULL; int *nvert; int i; Face *fp; Vert *vp; Geom *pl, *npl; if(PL == NULL || VVCOUNT(PL->faces) == 0 || VVCOUNT(PL->verts) == 0) return NULL; nvert = (int *)alloca(VVCOUNT(PL->faces) * sizeof(int)); fp = VVEC(PL->faces, Face); for(i = 0; i < VVCOUNT(PL->faces); i++, fp++) nvert[i] = fp->nv; if((PL->some & PL_HASVC) && !(unwant & PL_C)) { c = (ColorA *)alloca(VVCOUNT(PL->verts)*sizeof(ColorA)); for(i = 0, vp = VVEC(PL->verts, Vert); i < VVCOUNT(PL->verts); i++, vp++) c[i] = vp->c; } if((PL->some & PL_HASPC) && !(unwant & PL_C)) { pc = (ColorA *)alloca(VVCOUNT(PL->faces)*sizeof(ColorA)); for(i = 0, fp = VVEC(PL->faces, Face); i < VVCOUNT(PL->faces); i++, fp++) pc[i] = fp->fcolor; } if((PL->some & PL_HASVN) && !(unwant & PL_N)) { n = (Point3 *)alloca(VVCOUNT(PL->verts)*sizeof(Point3)); for(i = 0, vp = VVEC(PL->verts, Vert); i < VVCOUNT(PL->verts); i++, vp++) n[i] = vp->n; } /* Do we need to remap points? */ if(PL->maxdim > 4 && !(unwant & PL_ND)) { nhpts = ndpoints(PL); npl = GeomCCreate(NULL, NPolyListMethods(), CR_DIM, PL->maxdim-1, CR_NPOLY, VVCOUNT(PL->faces), CR_NVERT, nvert, CR_VERT, VVEC(PL->vtable, int), CR_POINT4, nhpts, CR_COLOR, c, CR_POLYCOLOR, pc, CR_END); return npl; } else { hpts = hpoints(PL); pl = GeomCCreate(NULL, PolyListMethods(), CR_NPOLY, VVCOUNT(PL->faces), CR_NVERT, nvert, CR_VERT, VVEC(PL->vtable, int), CR_POINT4, hpts, CR_NORMAL, n, CR_COLOR, c, CR_POLYCOLOR, pc, CR_END); if(want & PL_N) PolyListComputeNormals((PolyList *)pl, PL_HASPN|PL_HASPFL); return pl; } } static PLData * PLDataCreate() { PLData *PL = OOGLNewE(PLData, "PLData"); if(toPLsel == 0) initmethods(); PL->maxdim = 0; PL->some = 0; PL->all = PL_HASVC|PL_HASPC|PL_HASVN; VVINIT(PL->faces, Face, 1000); vvzero(&PL->faces); VVINIT(PL->verts, Vert, 1000); vvzero(&PL->faces); VVINIT(PL->vtable, int, 4000); PL->Tn = NULL; TmIdentity(PL->T); PL->ap = ApCreate(AP_DO, APF_FACEDRAW|APF_VECTDRAW, AP_LINEWIDTH, 1, AP_NORMSCALE, 1.0, AP_SHADING, APF_FLAT, AP_END); return PL; } static void PLDataDelete(PLData *PL) { if(PL) { vvfree(&PL->faces); vvfree(&PL->verts); vvfree(&PL->vtable); if(PL->Tn) TmNDelete(PL->Tn); if(PL->ap) ApDelete(PL->ap); } } static void *beziertoPL(int sel, Bezier *bez, va_list *args) { PLData *PL = va_arg(*args, PLData *); if(PL->ap && (PL->ap->flag & APF_DICE)) BezierDice( bez, PL->ap->dice[0], PL->ap->dice[1] ); if(bez->mesh == NULL || bez->geomflags & BEZ_REMESH) BezierReDice(bez); return GeomCall(sel, (Geom *)bez->mesh, PL); } static void *discgrptoPL(int sel, DiscGrp *dg, va_list *args) { Geom *geom = NULL; PLData *PL = va_arg(*args, PLData *); int i; if(dg->big_list == NULL || dg->big_list->el_list == NULL) return NULL; geom = dg->geom ? dg->geom : dg->ddgeom ? dg->ddgeom : DiscGrpDirDom(dg); for (i=0; ibig_list->num_el; ++i) { AnyGeomToPLData(geom, dg->big_list->el_list[i].tform, NULL, NULL, PL); if(dg->camgeom) AnyGeomToPLData(dg->camgeom, dg->big_list->el_list[i].tform, NULL, NULL, PL); } return PL; } static void *insttoPL(int sel, Inst *inst, va_list *args) { GeomIter *it; Transform T; PLData *PL = va_arg(*args, PLData *); it = GeomIterate((Geom *)inst, DEEP); while(NextTransform(it, T)) { AnyGeomToPLData(inst->geom, T, NULL, NULL, PL); } return PL; } static void *listtoPL(int sel, List *list, va_list *args) { List *l; PLData *PL = va_arg(*args, PLData *); for(l = list; l != NULL; l = l->cdr) { GeomCall(sel, l->car, PL); } return PL; } static void putmesh(PLData *PL, int base, int nu, int nv, int uwrap, int vwrap) { int v0 = 1, prev0v = 0; int u0 = 1, prev0u = 0; int u, v, prevu, prevv; if(vwrap) { v0 = 0, prev0v = nv-1; } if(uwrap) { u0 = 0, prev0u = nu-1; } #define MESHV(u,v) (base + nu*(v) + u) if(PL->ap->flag & (APF_FACEDRAW|APF_NORMALDRAW)) { for(prevv = prev0v, v = v0; v < nv; prevv = v, v++) { for(prevu = prev0u, u = u0; u < nu; prevu = u, u++) { int face[4]; face[0] = MESHV(prevu,prevv); face[1] = MESHV(u,prevv); face[2] = MESHV(u,v); face[3] = MESHV(prevu,v); PLaddface(PL, 4, face, NULL); } } } if(nu == 1 || nv == 1 || (PL->ap->flag & (APF_EDGEDRAW|APF_FACEDRAW|APF_NORMALDRAW)) == APF_EDGEDRAW) { for(v = 0; v < nv; v++) for(prevu = prev0u, u = u0; u < nu; prevu = u, u++) PLaddseg(PL, MESHV(prevu, v), MESHV(u, v), NULL); for(u = 0; u < nu; u++) for(prevv = prev0v, v = v0; v < nv; prevv = v, v++) PLaddseg(PL, MESHV(u, prevv), MESHV(u, v), NULL); } #undef MESHV } static void *meshtoPL(int sel, Mesh *m, va_list *args) { int base; PLData *PL = va_arg(*args, PLData *); base = PLaddverts(PL, m->nu*m->nv, m->p, m->c, m->n); putmesh(PL, base, m->nu, m->nv, m->geomflags & MESH_UWRAP, m->geomflags & MESH_VWRAP); return PL; } static void *ndmeshtoPL(int sel, NDMesh *ndm, va_list *args) { int nu = ndm->mdim[0]; int nv = ndm->meshd > 1 ? ndm->mdim[1] : 1; int u, v, base = -1; PLData *PL = va_arg(*args, PLData *); HPointN **pp = ndm->p; ColorA *c = ndm->c; base = PLnextvert(PL); pp = ndm->p; for(v = 0; v < nv; v++) { for(u = 0; u < nu; u++, pp++) { PLaddNDverts(PL, 1, (*pp)->dim, (*pp)->v, c); if(c) c++; } } putmesh(PL, base, nu, nv, 0, 0); return PL; } static void *npolylisttoPL(int sel, NPolyList *npl, va_list *args) { PLData *PL = va_arg(*args, PLData *); int base; Poly *p; int i, vi; #define VMAX 100 int face[VMAX]; base = PLaddNDverts(PL, npl->n_verts, npl->pdim, npl->v, npl->vcol); vvneeds(&PL->vtable, VVCOUNT(PL->vtable) + npl->nvi); for(i = 0, p = npl->p; i < npl->n_polys; i++, p++) { int *vip = face; if(p->n_vertices > VMAX) vip = OOGLNewNE(int, p->n_vertices, "npolylist face"); for(vi = 0; vi < p->n_vertices; vi++) vip[vi] = base + npl->vi[vi + npl->pv[i]]; PLaddface(PL, p->n_vertices, vip, npl->geomflags & PL_HASPCOL ? &p->pcol : NULL); if(p->n_vertices > VMAX) OOGLFree(vip); } return PL; } static void *polylisttoPL(int sel, PolyList *pl, va_list *args) { PLData *PL = va_arg(*args, PLData *); Poly *p; Vertex *v = pl->vl; int base, i, vi; int face[VMAX]; base = PLnextvert(PL); for(i = 0; i < pl->n_verts; i++, v++) { PLaddverts(PL, 1, &v->pt, pl->geomflags & PL_HASVCOL ? &v->vcol : NULL, pl->geomflags & PL_HASVN ? &v->vn : NULL); } p = pl->p; for(i = 0; i < pl->n_polys; i++, p++) { int *vip = face; if(p->n_vertices > VMAX) vip = OOGLNewNE(int, p->n_vertices, "polylist face"); for(vi = 0; vi < p->n_vertices; vi++) vip[vi] = base + (p->v[vi] - pl->vl); PLaddface(PL, p->n_vertices, vip, pl->geomflags & PL_HASPCOL ? &p->pcol : NULL); if(p->n_vertices > VMAX) OOGLFree(vip); } return PL; } static void *quadtoPL(int sel, Quad *q, va_list *args) { PLData *PL = va_arg(*args, PLData *); int base, v, i; base = PLaddverts(PL, q->maxquad*4, *q->p, *q->c, *q->n); for(i = 0, v = base; i < q->maxquad; i++) { int face[4]; face[0] = v++; face[1] = v++; face[2] = v++; face[3] = v++; PLaddface(PL, 4, face, NULL); } return PL; } static void *skeltoPL(int sel, Skel *s, va_list *args) { PLData *PL = va_arg(*args, PLData *); int base, i; int vert, edge[2]; Skline *l = s->l; if(PL->ap && (PL->ap->flag & APF_VECTDRAW) == 0) return NULL; base = s->pdim == 4 ? PLaddverts(PL, s->nvert, (HPoint3 *)s->p, NULL, NULL) : PLaddNDverts(PL, s->nvert, s->pdim, s->p, NULL); vvneeds(&PL->vtable, VVCOUNT(PL->vtable) + 2*s->nvi); for(i = 0; i < s->nlines; i++, l++) { int v = l->v0; int nv = l->nv; int c = l->c0; int nc = l->nc; if(nv == 1) { vert = s->vi[v] + base; PLaddvect(PL, 1, &vert, nc>0 ? &s->c[c] : NULL); } else { while(--nv > 0) { edge[0] = s->vi[v] + base; edge[1] = s->vi[++v] + base; PLaddvect(PL, 2, edge, nc>0 ? &s->c[c] : NULL); nc--; c++; } } } return PL; } static void *vecttoPL(int sel, Vect *v, va_list *args) { PLData *PL = va_arg(*args, PLData *); int base, i, vno; short *vip, *cip; ColorA *cp, *lastc; if(PL->ap && (PL->ap->flag & APF_VECTDRAW) == 0) return NULL; base = PLaddverts(PL, v->nvert, v->p, NULL, NULL); vvneeds(&PL->vtable, VVCOUNT(PL->vtable) + 2*v->nvert); vno = base; vip = v->vnvert; cip = v->vncolor; cp = v->c; lastc = (v->ncolor>0) ? cp : NULL; for(i = 0, vno = base; i < v->nvec; i++, vip++, cip++) { int nv = *vip; int nc = *cip; if(nv < 0) nv = -nv; if(nv == 1) { PLaddvect(PL, 1, &vno, nc>0 ? cp : lastc); } else { while(--nv > 0) { PLaddseg(PL, vno, vno+1, nc>0 ? cp : lastc); vno++; if(nc > 1) { nc--; cp++; } } if(*vip < 0) PLaddseg(PL, vno, vno + *vip + 1, nc>0 ? cp : lastc); } if(nc > 0) { lastc = cp + nc - 1; cp += nc; } vno++; } return PL; } static int PLaddverts(PLData *PL, int nv, HPoint3 *v, ColorA *c, Point3 *n) { Vert *vp; Material *mat; int i; int base = PLnextvert(PL); int has = 0; ColorA *cdef = &white; if(nv <= 0) return base; /* Apply appearance */ if(PL->ap && (mat = PL->ap->mat) != NULL) { if(mat->override & MTF_DIFFUSE) c = NULL; if(mat->valid & MTF_DIFFUSE) { cdef = &mat->diffuse; has = PL_HASVC; } } if(c) has = PL_HASVC; if(n) has |= PL_HASVN; PL->some |= has; PL->all &= ~has; vvneeds(&PL->verts, VVCOUNT(PL->verts) + nv); vp = &VVEC(PL->verts, Vert)[ VVCOUNT(PL->verts) ]; for(i = 0; i < nv; i++, vp++) { vp->has = has; HPt3Transform(PL->T, v++, &vp->p); vp->c = c ? *c++ : *cdef; vp->n = (n != NULL) ? *n++ : noNormal; vp->hdim = 0; vp->ndp = NULL; } VVCOUNT(PL->verts) += nv; return base; } static int PLaddNDverts(PLData *PL, int nv, int hdim, float *v, ColorA *c) { Vert *vp; Material *mat; int i; int base = PLnextvert(PL); int has = 0; ColorA *cdef = &white; if(nv <= 0) return base; if(PL->maxdim < hdim) PL->maxdim = hdim; /* Apply appearance */ if((mat = PL->ap->mat) != NULL) { if(mat->override & MTF_DIFFUSE) c = NULL; if(mat->valid & MTF_DIFFUSE) { cdef = (ColorA *)&mat->diffuse; has = PL_HASVC; } } if(c) has = PL_HASVC; PL->some |= has; PL->all &= ~has; vvneeds(&PL->verts, VVCOUNT(PL->verts) + nv); vp = &VVEC(PL->verts, Vert)[ VVCOUNT(PL->verts) ]; for(i = 0; i < nv; i++, vp++) { vp->has = has; /* If we could have N-D transforms embedded in an OOGL tree, * this part might change to alloc'ing a new N-D point, applying the * current N-D transform to this point, and storing vp->ndp as pointing * to the new copy. */ vp->hdim = hdim; vp->ndp = v; v += hdim; vp->c = *(c ? c++ : cdef); } VVCOUNT(PL->verts) += nv; return base; } static void PLaddface(PLData *PL, int nv, int verts[], ColorA *c) { Material *mat; Face *fp; int i; if(nv <= 0) return; if(PL->ap->flag & APF_FACEDRAW) { vvneeds(&PL->vtable, VVCOUNT(PL->vtable) + nv); memcpy( &VVEC(PL->vtable, int)[VVCOUNT(PL->vtable)], verts, nv*sizeof(int)); fp = VVAPPEND(PL->faces, Face); fp->v0 = VVCOUNT(PL->vtable); fp->nv = nv; VVCOUNT(PL->vtable) += nv; /* Apply appearance */ if((mat = PL->ap->mat) != NULL) { if(mat->override & MTF_DIFFUSE) c = NULL; if(mat->valid & MTF_DIFFUSE) c = (ColorA *)&mat->diffuse; } if(c) { fp->fcolor = *c; PL->some |= PL_HASPC; } else { fp->fcolor = white; PL->all &= ~PL_HASPC; } } if(PL->ap->flag & APF_EDGEDRAW && nv>1) { PLaddseg(PL, verts[nv-1], verts[0], NULL); for(i = 1; i < nv; i++) PLaddseg(PL, verts[i-1], verts[i], NULL); } #ifdef notyet if(PL->ap->flag & APF_NORMALDRAW) { /* Well, maybe not now. */ } #endif } static void PLaddseg(PLData *PL, int v0, int v1, ColorA *c) { Face *fp = VVAPPEND(PL->faces, Face); Material *mat = PL->ap->mat; if(mat && (mat->valid & MTF_EDGECOLOR)) { if(c == NULL || mat->override & MTF_EDGECOLOR) { *(Color *)(void *)&fp->fcolor = mat->edgecolor; fp->fcolor.a = mat->diffuse.a; PL->some |= PL_HASPC; } else if(c) { fp->fcolor = *c; PL->some |= PL_HASPC; } } else if(c) { fp->fcolor = *c; PL->some |= PL_HASPC; } else { PL->all &= ~PL_HASPC; } fp->v0 = VVCOUNT(PL->vtable); fp->nv = 2; *VVAPPEND(PL->vtable, int) = v0; *VVAPPEND(PL->vtable, int) = v1; } static void PLaddvect(PLData *PL, int nv, int verts[], ColorA *c) { Material *mat; ColorA edgec; Face *fp; if(nv <= 0) return; if(!(PL->ap->flag & APF_VECTDRAW)) return; vvneeds(&PL->vtable, VVCOUNT(PL->vtable) + nv); memcpy( &VVEC(PL->vtable, int)[VVCOUNT(PL->vtable)], verts, nv*sizeof(int)); fp = VVAPPEND(PL->faces, Face); fp->v0 = VVCOUNT(PL->vtable); fp->nv = nv; VVCOUNT(PL->vtable) += nv; /* Apply appearance */ if((mat = PL->ap->mat) != NULL) { if(mat->override & MTF_EDGECOLOR) c = NULL; if((mat->valid & MTF_EDGECOLOR) && c == NULL) { *(Color *)(void *)&edgec = mat->edgecolor; edgec.a = mat->diffuse.a; c = &edgec; } } if(c) { fp->fcolor = *c; PL->some |= PL_HASPC; } else { fp->fcolor = black; PL->all &= ~PL_HASPC; } } static void initmethods() { toPLsel = GeomNewMethod( "toPLData", NULL ); GeomSpecifyMethod( toPLsel, BezierMethods(), (GeomExtFunc*)beziertoPL ); GeomSpecifyMethod( toPLsel, DiscGrpMethods(), (GeomExtFunc*)discgrptoPL ); GeomSpecifyMethod( toPLsel, InstMethods(), (GeomExtFunc*)insttoPL ); GeomSpecifyMethod( toPLsel, ListMethods(), (GeomExtFunc*)listtoPL ); GeomSpecifyMethod( toPLsel, MeshMethods(), (GeomExtFunc*)meshtoPL ); GeomSpecifyMethod( toPLsel, NDMeshMethods(), (GeomExtFunc*)ndmeshtoPL ); GeomSpecifyMethod( toPLsel, NPolyListMethods(), (GeomExtFunc*)npolylisttoPL ); GeomSpecifyMethod( toPLsel, PolyListMethods(), (GeomExtFunc*)polylisttoPL ); GeomSpecifyMethod( toPLsel, QuadMethods(), (GeomExtFunc*)quadtoPL ); GeomSpecifyMethod( toPLsel, SkelMethods(), (GeomExtFunc*)skeltoPL ); GeomSpecifyMethod( toPLsel, VectMethods(), (GeomExtFunc*)vecttoPL ); } PLData *AnyGeomToPLData(Geom *g, Transform T, TransformN *Tn, Appearance *pap, PLData *PL) { Transform Told; TransformN *Tnold = NULL; Appearance *apold = NULL; if(g == NULL) return PL; if(PL == NULL) PL = PLDataCreate(); if(pap || g->ap) { apold = PL->ap; if(pap && g->ap) { PL->ap = ApMerge(pap, PL->ap, 0); ApMerge(g->ap, PL->ap, APF_INPLACE); } else { PL->ap = ApMerge(pap ? pap : g->ap, PL->ap, 0); } } if(T) { TmCopy(PL->T, Told); TmConcat(T, Told, PL->T); } if(Tn) { Tnold = PL->Tn; PL->Tn = TmNConcat(Tn, PL->Tn, NULL); } GeomCall(toPLsel, g, PL); if(apold) { ApDelete(PL->ap); PL->ap = apold; } if(T) TmCopy(Told, PL->T); if(Tn) { TmNDelete(PL->Tn); PL->Tn = Tnold; } return PL; } geomview-1.9.4/src/lib/geomutil/plutil/Makefile.am0000644000175000001440000000034510600606051017007 00000000000000INCLUDES = $(default_includes) man_MANS = anytopl.3gv plcombine.3gv plconsol.3gv EXTRA_DIST = Headers $(man_MANS) noinst_LTLIBRARIES = libplutil.la libplutil_la_SOURCES = \ anytopl.c plcombine.c plconsol.c \ plutil.h geomview-1.9.4/src/lib/geomutil/plutil/Makefile.in0000644000175000001440000004131110665240502017024 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/geomutil/plutil DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libplutil_la_LIBADD = am_libplutil_la_OBJECTS = anytopl.lo plcombine.lo plconsol.lo libplutil_la_OBJECTS = $(am_libplutil_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libplutil_la_SOURCES) DIST_SOURCES = $(libplutil_la_SOURCES) man3dir = $(mandir)/man3 am__installdirs = "$(DESTDIR)$(man3dir)" NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) man_MANS = anytopl.3gv plcombine.3gv plconsol.3gv EXTRA_DIST = Headers $(man_MANS) noinst_LTLIBRARIES = libplutil.la libplutil_la_SOURCES = \ anytopl.c plcombine.c plconsol.c \ plutil.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/geomutil/plutil/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/geomutil/plutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libplutil.la: $(libplutil_la_OBJECTS) $(libplutil_la_DEPENDENCIES) $(LINK) $(libplutil_la_OBJECTS) $(libplutil_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anytopl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plcombine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plconsol.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man3: $(man3_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.3*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 3*) ;; \ *) ext='3' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \ done uninstall-man3: @$(NORMAL_UNINSTALL) @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.3*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 3*) ;; \ *) ext='3' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man3dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(MANS) installdirs: for dir in "$(DESTDIR)$(man3dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-man3 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man3 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man3 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-man uninstall-man3 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/geomutil/plutil/anytopl.3gv0000644000175000001440000000370610600600312017060 00000000000000.TH AnyToPL 3gv "June 15, 1992" "Geometry Center" .SH NAME AnyToPL -\ convert an arbitrary geom to a polylist (OFF file format) .SH SYNOPSIS .nf #include "geomutil.h" Geom *AnyToPL(Geom *, Transform); .fi .SH DESCRIPTION .PP AnyToPL() takes any geom as an arguement. It then returns a polylist object which is geometrically identical to the original geom. The transform argument is the transform applied to the entire object; it should generally be set to TM_IDENTITY when AnyToPL() is first called. Geometric objects are handled in the following ways: .PP Polylists: A transformed copy of the original is returned. .PP Bezier: The object is rediced if necessary, then handled as a mesh object. .PP Quad: The object is directly transformed into a new polylist. .PP Mesh: The object is directly transformed into a new polylist, with extra polygons added to do the wrapping if necessary. .PP Vect: The object is converted into a polylist containing a 2-gon for every segment in the original vector object. The colors of the faces are the same as the colors of the original object, but this generally is irrelevant since the faces are not visible. Note that edge visibility must be enabled for an object which has been converted from a vect to a polylist to be visible in geomview. .PP List: AnyToPL() is called recursively and the resultant polylists are combined using PLCombine(3). Inst: AnyToPL() is called recursively with a new transformation matrix. The resultant polylists are combined using PLCombine(3). .PP No effort is made to eliminate identical vertices. However, no extraneous repeated vertexes should be created. The resultant polylist should have the same number of vertexes as the original object. .PP .SH LINKING AnyToPL() is part of the geomutil library; see geomutil(3) for information on how to link your program with this library. .SH SEE ALSO plcombine(3), anytooff(1), geomview(1), geomutil(3) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.4/src/lib/geomutil/plutil/plconsol.c0000644000175000001440000000633110455701002016751 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif #include #include #include "geomclass.h" #include "geom.h" #include "polylist.h" #include "polylistP.h" #include "hpoint3.h" #include "plutil.h" static char msg[] = "plconsol.c"; /* This is the precision, declared globally so that it will * be accessible in the compare routine which must be called * from qsort */ static float precision; float Pt4Distance(HPoint3 *a, HPoint3 *b) { float dx, dy, dz, dw; dx = a->x - b->x; dy = a->y - b->y; dz = a->z - b->z; dw = a->w - b->w; return (sqrt(dx*dx + dy*dy + dz*dz + dw*dw)); } /* * Note: This deals only with the location of the points, not with * their colors or normals. */ int VertexCmp(const void *a, const void *b) { if (Pt4Distance(&((Vertex *)a)->pt, &((Vertex *)b)->pt) > precision) { return memcmp(a, b, sizeof(Vertex)); } return 0; } Geom *PLConsol(Geom *g, float prec) { Vertex **table; PolyList *o = (PolyList *)g, *o2; int i, j; if (g == NULL) return NULL; /* Make sure we have the right thing. */ if (strcmp(GeomName(g), "polylist")) { OOGLError(0, "Object not of polylist type."); return NULL; } precision = prec; /* Create a copy of the data structure. */ o2 = (PolyList *)GeomCopy((Geom *)o); /* Sort the new array. */ precision = 0.0; qsort(o2->vl, o2->n_verts, sizeof(Vertex), VertexCmp); precision = prec; /* Consolidate the new array to eliminate identical vertices. */ for (i = j = 0; i < o2->n_verts; i++) if (VertexCmp(&o2->vl[i], &o2->vl[j])) o2->vl[++j] = o2->vl[i]; o2->n_verts = j+1; /* Create a lookup table of the new addresses of the vertices. */ table = (Vertex **)OOG_NewE(o->n_verts * sizeof(Vertex *), msg); for (i = 0; i < o->n_verts; i++) table[i] = bsearch(&(o->vl[i]), o2->vl, o2->n_verts, sizeof(Vertex), VertexCmp); /* Match the polygons in the structure with the new vertices. */ for (i = 0; i < o2->n_polys; i++) for (j = 0; j < o2->p[i].n_vertices; j++) o2->p[i].v[j] = table[o2->p[i].v[j] - o2->vl]; /* Trim off the excess memory */ o2->vl = OOGLRenewNE(Vertex, o2->vl, o2->n_verts, msg); return((Geom *)o2); } geomview-1.9.4/src/lib/geomutil/plutil/plcombine.3gv0000644000175000001440000000333710600600312017342 00000000000000.TH plcombine 3gv "June 15, 1992" "Geometry Center" .SH NAME PLCombine -\ polylist two polylists (OFF file format) into one .SH SYNOPSIS .nf Geom *PLCombine(Geom *, Geom *); .fi .SH DESCRIPTION .PP PLCombine() combines two polylists into a single polylist and returns the new polylist. If either of the old polylists was NULL, a copy of the other polylist (or NULL if both polylists were NULL) is returned. PLCombine() will generate an error if either of the parameters was not of the polylist type. .PP If the two polylists represent color in an inconsistant way, PLCombine will attempt to preserve the color data. If either polylist has per-polygon colors, the result will have per-polygon colors. If the other object originally had per-vertex colors, the color of the first point of each polygon will be used as the color of the polygon. If the other polylist originally had no colors, the rgba value 0.15, 0.15, 0.15, 1.0 will be used as the color of each of that polyline's polygons. .PP If neither of the polylists had per-polygon colors but one had per-vertex colors, the value 0.15, 0.15, 0.15, 1.0 will be used as the color value for each of the vertices of the colorless polylist. .PP If neither polylist had color data, the result will not have color date. .PP The result of PLCombine() will not include normal data if the two polylists represent normals in an inconsistent way, for example, if one has per-vertex data and one has per-face data or one has per-vertex data and one has no data. .SH LINKING PLCombine() is part of the geomutil library; see geomutil(3) for information on how to link your program with this library. .SH SEE ALSO offcombine(1), geomview(1), geomutil(3) .SH AUTHOR .nf Celeste Fowler The Geometry Center .fi geomview-1.9.4/src/lib/geomutil/plutil/Headers0000644000175000001440000000001107730236674016263 00000000000000plutil.h geomview-1.9.4/src/lib/geomutil/plutil/plcombine.c0000644000175000001440000001374710560447030017106 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* * plcombine.c * author: Celeste Fowler * date: June 12, 1992 */ #include #include "transformn.h" #include "polylistP.h" #include "hpoint3.h" #include "point3.h" #include "plutil.h" static char msg[] = "plcombine.c"; /* * PolyList combiner. * A minor sideshow. If a and b differ in some fundamental way in terms * of per vertex / per face colors / normals, the colors / normals will * be eliminated in the result. If one polylist is three-d and the other * is four-d, the result will be three-d */ Geom *PLCombine(Geom *a1, Geom *b1) { PolyList *a = (PolyList *)a1, *b = (PolyList *)b1; int i, j, k; HPoint3 *point4; ColorA *color, *polycolor; Point3 *normal; Point3 *polynormal; int *vert, nvertices, *nvert, *polyflags; Geom *new; int flags, fourd = 0; if (a == NULL) return(GeomCopy((Geom *)b)); if (b == NULL) return(GeomCopy((Geom *)a)); if (strcmp(GeomName(a1), "polylist") || strcmp(GeomName(b1), "polylist")) OOGLError(0, "Arguements to PLCombine() not of polylist type."); nvertices = a->n_verts + b->n_verts; /* Copy points, normals, colors. */ point4 = (HPoint3 *)OOG_NewE(nvertices * sizeof(HPoint3), msg); color = (ColorA *)OOG_NewE(nvertices * sizeof(ColorA), msg); normal = (Point3 *)OOG_NewE(nvertices * sizeof(Point3), msg); for (i = 0; i < a->n_verts; i++) { point4[i] = a->vl[i].pt; color[i] = a->vl[i].vcol; normal[i] = a->vl[i].vn; } for (i = 0; i < b->n_verts; i++) { point4[a->n_verts + i] = b->vl[i].pt; color[a->n_verts + i] = b->vl[i].vcol; normal[a->n_verts + i] = b->vl[i].vn; } /* Create polygons */ nvert = (int *)OOG_NewE((a->n_polys + b->n_polys) * sizeof(int), msg); polycolor = (ColorA *)OOG_NewE((a->n_polys + b->n_polys) * sizeof(ColorA), msg); polynormal = (Point3 *)OOG_NewE((a->n_polys + b->n_polys) * sizeof(Point3), msg); polyflags = (int *)OOG_NewE((a->n_polys + b->n_polys) * sizeof(int), msg); for (i = j = 0; i < a->n_polys; i++) j += a->p[i].n_vertices; for (i = 0; i < b->n_polys; i++) j += b->p[i].n_vertices; vert = (int *)OOG_NewE(j * sizeof(int), msg); for (i = k = 0; i < a->n_polys; i++) { nvert[i] = a->p[i].n_vertices; polycolor[i] = a->p[i].pcol; polynormal[i] = a->p[i].pn; polyflags[i] = a->p[i].flags; for (j = 0; j < a->p[i].n_vertices; j++) vert[k++] = a->p[i].v[j] - a->vl; } for (i = 0; i < b->n_polys; i++) { nvert[a->n_polys + i] = b->p[i].n_vertices; polycolor[a->n_polys + i] = b->p[i].pcol; polynormal[a->n_polys + i] = b->p[i].pn; polyflags[a->n_polys + i] = b->p[i].flags; for (j = 0; j < b->p[i].n_vertices; j++) vert[k++] = a->n_verts + b->p[i].v[j] - b->vl; } flags = a->geomflags; fourd = (a->geomflags & VERT_4D) ? 1 : 0; if ((a->geomflags & PL_HASVCOL) && !(b->geomflags & PL_HASVCOL)) { if (b->geomflags & PL_HASPCOL) { for (i = 0; i < a->n_polys; i++) polycolor[i] = a->p[i].v[0]->vcol; flags ^= PL_HASVCOL; flags |= PL_HASPCOL; } else for (i = 0; i < b->n_verts; i++) { color[a->n_verts + i].r = color[a->n_verts + i].g = color[a->n_verts + i].b = 0.15; color[a->n_verts + i].a = 1.0; } } if ((a->geomflags & PL_HASPCOL) && !(b->geomflags & PL_HASPCOL)) { if (b->geomflags & PL_HASVCOL) { for (i = 0; i < b->n_polys; i++) polycolor[a->n_polys + i] = b->p[i].v[0]->vcol; } else for (i = 0; i < b->n_polys; i++) { polycolor[a->n_polys + i].r = polycolor[a->n_polys + i].g = polycolor[a->n_polys + i].b = 0.15; polycolor[a->n_polys + i].a = 1.0; } } if (!(flags & PL_HASVCOL) && !(flags & PL_HASPCOL)) { if (b->geomflags & PL_HASPCOL) { for (i = 0; i < a->n_polys; i++) { polycolor[i].r = polycolor[i].g = polycolor[i].b = 0.15; polycolor[i].a = 1.0; } flags |= PL_HASPCOL; } if (b->geomflags & PL_HASVCOL) { for (i = 0; i < a->n_verts; i++) { color[i].r = color[i].g = color[i].b = 0.15; color[i].a = 1.0; } flags |= PL_HASVCOL; } } if ((a->geomflags & PL_HASVN) && !(b->geomflags & PL_HASVN)) flags ^= PL_HASVN; if ((a->geomflags & PL_HASPN) && !(b->geomflags & PL_HASPN)) flags ^= PL_HASPN; if ((a->geomflags & PL_HASPFL) && !(b->geomflags & PL_HASPFL)) flags ^= PL_HASPFL; if ((a->geomflags & VERT_4D) || (b->geomflags & VERT_4D)) fourd = 1; new = GeomCreate("polylist", CR_NPOLY, a->n_polys + b->n_polys, CR_POINT4, point4, CR_NORMAL, normal, CR_COLOR, color, CR_NVERT, nvert, CR_VERT, vert, CR_POLYNORMAL, polynormal, CR_POLYFLAGS, polyflags, CR_POLYCOLOR, polycolor, CR_FLAG, flags, CR_4D, fourd, CR_END); OOGLFree(point4); OOGLFree(color); OOGLFree(normal); OOGLFree(nvert); OOGLFree(polycolor); OOGLFree(polynormal); OOGLFree(polyflags); OOGLFree(vert); return(new); } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/camera/0000777000175000001440000000000010665240670013143 500000000000000geomview-1.9.4/src/lib/camera/camstream.c0000644000175000001440000002517610575044670015214 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "handleP.h" #include "cameraP.h" #include "transobj.h" HandleOps CamOps = { "cam", (int ((*)()))CamStreamIn, (int ((*)()))CamStreamOut, (void ((*)()))CamDelete, NULL, /* Resync */ NULL /* close pool */ }; /* * Load Camera from file. * Syntax: * [camera] < "filename_containing_camera" [or] * [camera] { keyword value keyword value ... } * */ int CamStreamIn(Pool *p, Handle **hp, Camera **camp) { char *w, *raww; IOBFILE *f; Handle *h = NULL; Handle *hname = NULL; Camera *cam = NULL; int credible = 0; int i; int got; float v; int brack = 0; int empty = 1, braces = 0; static struct kw { char *name; char args; int kbit; } kw[] = { { "camtoworld", 0, CAMF_NEWC2W }, { "worldtocam", 0, CAMF_W2C }, { "flag", 1, CAMF_PERSP|CAMF_STEREO }, { "halfyfield", 1, CAMF_FOV }, { "frameaspect",1, CAMF_ASPECT }, { "focus", 1, CAMF_FOCUS }, /* 5 */ { "near", 1, CAMF_NEAR }, { "far", 1, CAMF_FAR }, { "stereo_sep", 1, CAMF_STEREOGEOM }, { "stereo_angle",1, CAMF_STEREOGEOM }, { "stereyes", 0, CAMF_STEREOXFORM }, /* 10 */ { "whicheye", 1, CAMF_EYE }, { "define", 0, 0 }, { "camera", 0, 0 }, { "perspective",1, CAMF_PERSP }, { "stereo", 1, CAMF_STEREO }, /* 15 */ { "hyperbolic", 1, 0 /* CAMF_HYPERBOLIC is now obsolete */ }, { "fov", 1, CAMF_FOV }, { "bgcolor", 0, 0 }, { "bgimage", 0, 0 }, }; if ((f = PoolInputFile(p)) == NULL) return 0; for(;;) { switch(i = iobfnextc(f, 0)) { case '<': case ':': case '@': iobfgetc(f); w = iobfdelimtok("(){}", f, 0); if (i == '<' && (h = HandleByName(w, &CamOps)) == NULL && w[0] != '\0') { w = findfile(PoolName(p), raww = w); if (w == NULL) { OOGLSyntax(f, "Reading camera from \"%s\": can't find file \"%s\"", PoolName(p), raww); } } else if (h) { /* HandleByName() increases the ref. count s.t. the * caller of HandleByName() owns the returned handle. */ HandleDelete(h); } if ((h = HandleReferringTo(i, w, &CamOps, hp)) != NULL) { cam = (Camera *)h->object; /* Increment the ref. count. This way we can call * HandleDelete() and CamDelete() independently. */ RefIncr((Ref*)cam); } if (!brack) goto done; break; case '{': brack++; iobfgetc(f); break; case '}': if (brack > 0) { iobfgetc(f); braces = 1; } if (--brack <= 0) goto done; /* Otherwise, fall through into... */ default: empty = 0; w = iobfdelimtok("(){}", f, 0); if (w == NULL) goto done; for(i = sizeof(kw)/sizeof(kw[0]); --i >= 0; ) if (!strcmp(w, kw[i].name)) break; if (i < 0) { if (credible) OOGLSyntax(f, "Reading camera from \"%s\": unknown camera keyword \"%s\"", PoolName(p), w); if (cam) CamDelete(cam); return 0; } else if ( (got= iobfgetnf(f, kw[i].args, &v, 0)) != kw[i].args ) { OOGLSyntax(f, "Reading camera from \"%s\": \"%s\" expects %d values, got %d", PoolName(p), w, kw[i].args, got); CamDelete(cam); return false; } if (i != 13 && cam == NULL) { cam = CamCreate(CAM_END); credible = 1; } if (cam) { cam->changed |= kw[i].kbit; } switch (i) { case 0: { TransObj *tobj = NULL; Handle *thandle = NULL; if (TransObjStreamIn(p, &thandle, &tobj)) { CamSet(cam, CAM_C2W, tobj->T, CAM_C2WHANDLE, thandle, CAM_END); HandleDelete(thandle); TransDelete(tobj); } break; } case 1: { TransObj *tobj = NULL; Handle *thandle = NULL; if (TransObjStreamIn(p, &thandle, &tobj)) { CamSet(cam, CAM_W2C, tobj, CAM_W2CHANDLE, thandle, CAM_END); HandleDelete(thandle); TransDelete(tobj); } break; } case 2: cam->flag = (int)v; break; case 3: CamSet(cam, CAM_HALFYFIELD, v, CAM_END); break; case 4: CamSet(cam, CAM_ASPECT, v, CAM_END); break; case 5: CamSet(cam, CAM_FOCUS, v, CAM_END); break; case 6: cam->cnear = v; break; case 7: cam->cfar = v; break; case 8: CamSet(cam, CAM_STEREOSEP, v, CAM_END); break; case 9: CamSet(cam, CAM_STEREOANGLE, v, CAM_END); break; case 10: { TransObj *tobj[2] = { NULL, NULL }; Handle *thandle[2] = { NULL, NULL }; int i; if (TransObjStreamIn(p, &thandle[0], &tobj[0]) && TransObjStreamIn(p, &thandle[1], &tobj[1])) { TmCopy(tobj[0]->T, cam->stereyes[0]); TmCopy(tobj[1]->T, cam->stereyes[1]); CamSet(cam, CAM_STEREYES, cam->stereyes, CAM_STERHANDLES, thandle, CAM_END); } for (i = 0; i < 2; i++) { HandleDelete(thandle[i]); TransDelete(tobj[i]); } } break; case 11: cam->whicheye = (int)v; break; case 12: /* "define" */ hname = HandleCreateGlobal(iobfdelimtok("(){}", f, 0), &CamOps); break; case 13: /* "camera" */ break; case 14: /* "perspective" */ case 15: /* "stereo" */ cam->flag &= ~kw[i].kbit; if (v != 0) cam->flag |= kw[i].kbit; break; case 16: /* "hyperbolic" */ /* The "hyperbolic" field is obsolete (replaced by the "space" field. Ignore it for now [ Mon Dec 7 14:05:50 1992 ]. After a few months [ say in March 1993 ] add a warning message to be printed out at this point in the code, and after a few more months [ say June 1993 ], remove it completely. -- mbp */ break; case 17: /* "fov" */ CamSet(cam, CAM_FOV, v, CAM_END); break; case 18: /* bgcolor */ /* we always expect RGB values in the range 0..1 as floating * point values. */ if ((got = iobfgetnf(f, 3, (float *)&cam->bgcolor, 0)) != 3) { OOGLSyntax(f, "Reading camera from \"%s\": \"%s\" expects " "an RGB(A) color specification " "(got only %d values, not 3 or 4)", PoolName(p), "bgcolor", got); CamDelete(cam); return false; } if (got == 3 && iobfgetnf(f, 1, (float *)&cam->bgcolor+3, 0) != 1) { cam->bgcolor.a = 1.0; } break; case 19: /* bgimage */ if (!ImgStreamIn(p, &cam->bgimghandle, &cam->bgimage)) { OOGLSyntax(f, "Reading camera from \"%s\": " "unable to read background image", PoolName(p)); CamDelete(cam); return false; } break; } } } done: if (hname) { if (cam) { HandleSetObject(hname, (Ref *)cam); } if (h) { /* HandleReferringTo() has passed the ownership to use, so * delete h because we do not need it anymore. */ HandleDelete(h); } h = hname; } /* Pass the ownership of h and cam to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp != NULL) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (camp != NULL) { if (*camp) { CamDelete(*camp); } *camp = cam; } else if(cam) { CamDelete(cam); } return (cam != NULL || h != NULL || (empty && braces)); } int CamStreamOut(Pool *p, Handle *h, Camera *cam) { float fov; FILE *outf; if ((outf = PoolOutputFile(p)) == NULL) { return 0; } fprintf(outf, "camera {\n"); PoolIncLevel(p, 1); if (cam == NULL && h != NULL && h->object != NULL) { cam = (Camera *)h->object; } if (PoolStreamOutHandle(p, h, cam != NULL)) { if (cam->w2chandle) { PoolFPrint(p, outf, "worldtocam "); TransStreamOut(p, cam->w2chandle, cam->worldtocam); } else { PoolFPrint(p, outf, "camtoworld "); TransStreamOut(p, cam->c2whandle, cam->camtoworld); } PoolFPrint(p, outf, "perspective %d stereo %d\n", cam->flag & CAMF_PERSP ? 1 : 0, cam->flag & CAMF_STEREO ? 1 : 0); CamGet(cam, CAM_FOV, &fov); PoolFPrint(p, outf, "fov %g\n", fov); PoolFPrint(p, outf, "frameaspect %g\n", cam->frameaspect); PoolFPrint(p, outf, "focus %g\n", cam->focus); PoolFPrint(p, outf, "near %g\n", cam->cnear); PoolFPrint(p, outf, "far %g\n", cam->cfar); if (cam->flag & CAMF_STEREOGEOM) { PoolFPrint(p, outf, "stereo_sep %g\n", cam->stereo_sep); PoolFPrint(p, outf, "stereo_angle %g\n", cam->stereo_angle); } if (cam->flag & CAMF_EYE) PoolFPrint(p, outf, "whicheye %d\n", cam->whicheye); if (cam->flag & CAMF_STEREOXFORM) { PoolFPrint(p, outf, "stereyes\n"); TransStreamOut(p, cam->sterhandle[0], cam->stereyes[0]); fputc('\n', outf); TransStreamOut(p, cam->sterhandle[1], cam->stereyes[1]); } PoolFPrint(p, outf, "bgcolor %g %g %g %g\n", cam->bgcolor.r, cam->bgcolor.g, cam->bgcolor.b, cam->bgcolor.a); if (cam->bgimage) { PoolFPrint(p, outf, "bg"); ImgStreamOut(p, cam->bgimghandle, cam->bgimage); } } PoolIncLevel(p, -1); PoolFPrint(p, outf, "}\n"); return !ferror(outf); } void CamHandleScan( Camera *cam, int (*func)(), void *arg ) { if (cam) { if (cam->c2whandle) (*func)(&cam->c2whandle, cam, arg); if (cam->w2chandle) (*func)(&cam->w2chandle, cam, arg); } } void CamTransUpdate(Handle **hp, Camera *cam, Transform T) { TransUpdate(hp, (Ref *)cam, T); if (hp == &cam->c2whandle) { TmInvert(cam->camtoworld, cam->worldtocam); } else if (hp == &cam->w2chandle) { TmInvert(cam->worldtocam, cam->camtoworld); } } /* * Local Variables: *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/camera/camera.c0000644000175000001440000004263010574637362014467 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "geomclass.h" #include "cameraP.h" #include "mg.h" #include "reference.h" Camera * _CamSet(Camera *cam, int attr, va_list *a_list); #define SETFLAG(flag, bit, value) \ if (value) flag |= bit; \ else flag &= ~bit #define GETFLAG(flag, bit) ( (flag & bit) != 0 ) static float GetHalfField( Camera *cam ); static void SetHalfField( Camera *cam, float halffield ); static void CamStereoCompute( Camera *cam ); Camera * CamCreate(int a1, ...) { Camera *thiscam; va_list a_list; thiscam = OOGLNewE(Camera, "CamCreate: unable to allocate camera\n"); memset(thiscam, 0, sizeof(Camera)); if (thiscam == NULL) return(NULL); RefInit((Ref *)thiscam, CAMMAGIC); CamDefault(thiscam); thiscam->changed = 0; va_start( a_list, a1 ); _CamSet(thiscam, a1, &a_list); va_end(a_list); return thiscam; } void CamDefault(Camera *cam) { cam->flag = CAMF_PERSP; cam->frameaspect = 4.0/3.0; cam->focus = 3.0; cam->stereo_sep = 0.5; cam->stereo_angle = .08; cam->c2whandle = NULL; cam->w2chandle = NULL; cam->sterhandle[0] = NULL; cam->sterhandle[1] = NULL; CamStereoCompute(cam); cam->whicheye = 0; /* only applies to stereo */ cam->space = TM_EUCLIDEAN; cam->bgcolor.r = cam->bgcolor.g = cam->bgcolor.b = 1.0/3.0; cam->bgcolor.a = 1.0; cam->bgimage = NULL; cam->bgimghandle = NULL; CamReset( cam ); } Camera * CamSet(Camera *cam, int a1, ...) { va_list a_list; va_start(a_list, a1); return ( _CamSet(cam, a1, &a_list) ); } Camera * _CamSet(Camera *cam, int attr, va_list *alist) { TransformPtr tt; int sethalffield = 0, setaspect = 0, setstereogeom = 0; double halffield = 0, v; Handle *h; int bit, unbit; char **ablock = NULL; #define NEXT(type) OOGL_VA_ARG(type,alist,ablock) while (attr != CAM_END) { bit = unbit = 0; switch(attr) { case CAM_ABLOCK: ablock = NEXT(char**); break; case CAM_C2W: tt = NEXT(TransformPtr); bit = CAMF_NEWC2W, unbit = CAMF_W2C; TmCopy(tt, cam->camtoworld); TmInvert(cam->camtoworld, cam->worldtocam); break; case CAM_W2C: tt = NEXT(TransformPtr); bit = CAMF_W2C, unbit = CAMF_NEWC2W; TmCopy(tt, cam->worldtocam); TmInvert(cam->worldtocam, cam->camtoworld); break; case CAM_FOV: v = NEXT(double) / 2; bit = CAMF_FOV; if(cam->flag & CAMF_PERSP) { if(v >= 180/2) v = 120/2; v = tan( RADIANS(v) ); } halffield = v; sethalffield = 1; break; case CAM_HALFYFIELD: cam->halfyfield = NEXT(double); if(cam->flag & CAMF_PERSP) cam->halfyfield *= cam->focus; bit = CAMF_FOV; break; case CAM_HALFFIELD: halffield = NEXT(double); sethalffield = 1; bit = CAMF_FOV; break; case CAM_ASPECT: if((v = NEXT(double)) > 0.) { if (!sethalffield) halffield = GetHalfField(cam); cam->frameaspect = v; bit = CAMF_ASPECT; setaspect = 1; } break; case CAM_FOCUS: if((v = NEXT(double)) > 0) { if(cam->flag & CAMF_PERSP) cam->halfyfield *= v / cam->focus; cam->focus = v; bit = CAMF_FOCUS; } break; case CAM_NEAR: cam->cnear = NEXT(double); bit = CAMF_NEAR; break; case CAM_FAR: cam->cfar = NEXT(double); bit = CAMF_FAR; break; case CAM_STEREOSEP: cam->stereo_sep = NEXT(double); bit = CAMF_STEREOGEOM, unbit = CAMF_STEREOXFORM; setstereogeom = 1; break; case CAM_STEREOANGLE: cam->stereo_angle = NEXT(double); bit = CAMF_STEREOGEOM, unbit = CAMF_STEREOXFORM; setstereogeom = 1; break; case CAM_STEREOEYE: cam->whicheye = NEXT(int); bit = CAMF_EYE; break; case CAM_PERSPECTIVE: bit = CAMF_PERSP; goto flagbit; case CAM_STEREO: bit = CAMF_STEREO; goto flagbit; flagbit: SETFLAG(cam->flag, bit, NEXT(int)); break; case CAM_STEREYES: memcpy(cam->stereyes, NEXT(TransformPtr), 2*sizeof(Transform)); bit = CAMF_STEREOXFORM, unbit = CAMF_STEREOGEOM; break; case CAM_STERHANDLES: memcpy(cam->sterhandle, NEXT(Handle **), 2*sizeof(Handle *)); bit = CAMF_STEREOXFORM, unbit = CAMF_STEREOGEOM; break; case CAM_C2WHANDLE: h = NEXT(Handle *); if (cam->c2whandle) { HandlePDelete(&cam->c2whandle); } cam->c2whandle = REFGET(Handle, h); if (h) { HandleRegister(&cam->c2whandle, (Ref *)cam, cam->camtoworld, CamTransUpdate); } bit = CAMF_NEWC2W, unbit = CAMF_W2C; break; case CAM_W2CHANDLE: h = NEXT(Handle *); if (cam->w2chandle) { HandlePDelete(&cam->w2chandle); } cam->w2chandle = REFGET(Handle, h); if (h) { HandleRegister(&cam->w2chandle, (Ref *)cam, cam->worldtocam, CamTransUpdate); } bit = CAMF_W2C, unbit = CAMF_NEWC2W; break; case CAM_SPACE: { int space = NEXT(int); if ( space != TM_EUCLIDEAN && space != TM_HYPERBOLIC && space != TM_SPHERICAL) { OOGLError(0,"illegal space value %1d\n", space); } else { cam->space = space; bit = CAMF_SPACE; } } break; case CAM_BGCOLOR: cam->bgcolor = *NEXT(ColorA *); break; case CAM_BGIMAGE: if (cam->bgimghandle) { HandlePDelete(&cam->bgimghandle); } if (cam->bgimage) { ImgDelete(cam->bgimage); } cam->bgimage = REFGET(Image, NEXT(Image *)); break; case CAM_BGIMGHANDLE: if (cam->bgimghandle) { HandlePDelete(&cam->bgimghandle); } cam->bgimghandle = REFGET(Handle, NEXT(Handle *)); if (cam->bgimghandle) { HandleRegister(&cam->bgimghandle, (Ref *)cam, &cam->bgimage, HandleUpdRef); } break; default: OOGLError (0, "CamSet: Undefined attribute: %d", attr); return NULL; } cam->changed &= ~unbit; cam->changed |= bit; attr = NEXT(int); } /* (sethalffield) means we have a new halffield value, stored in local var "halffield". (setaspect) means we have a new aspect ratio, and the halffield must be updated in accordance with this. In this case, "halffield" holds either the original halffield value, if a new one hasn't been explicitly set with CAM_HALFFIELD or CAM_FOV, or the new value, if it was explicitly set. All of these cases are dealt with by the following call to SetHalfField. */ if (setaspect || sethalffield) SetHalfField(cam, halffield); /* following works since the only way to change stereo parameters is by using this routine */ if (setstereogeom) CamStereoCompute(cam); return cam; #undef NEXT } /*----------------------------------------------------------------------- * Function: CamGet * Description: query a camera * Args: *cam: the camera to query * attr: the attribute to query * value: attr's value is written here * Returns: 1: attr is valid and value has been written * 0: attr is valid but currently does not * have a value * -1: invalid attr * Author: mbp * Date: Thu Aug 8 10:09:10 1991 * Notes: At present, there are no camera attr's that might * not be set, so 0 is never returned. This might change * in the future. */ int CamGet(Camera *cam, int attr, void *value) { #define VALUE(type) ((type*)value) switch (attr) { case CAM_PERSPECTIVE: *VALUE(int) = GETFLAG(cam->flag, CAMF_PERSP); break; case CAM_STEREO: *VALUE(int) = GETFLAG(cam->flag, CAMF_STEREO); break; case CAM_C2W: /* camtoworld is always up to date, so just copy */ TmCopy(cam->camtoworld, (TransformPtr)value); break; case CAM_W2C: /* worldtocam is not always up to date, so update if necessary ... */ if (cam->flag & CAMF_NEWC2W ) { TmInvert( cam->camtoworld, cam->worldtocam ); cam->flag &= ~CAMF_NEWC2W; } /* ... then copy */ TmCopy( cam->worldtocam, (TransformPtr)value ); break; case CAM_FOV: *VALUE(float) = 2 * ( (cam->flag & CAMF_PERSP) ? DEGREES( atan( (double)(GetHalfField(cam)) ) ) : GetHalfField(cam)); break; case CAM_HALFYFIELD: *VALUE(float) = (cam->flag & CAMF_PERSP) ? cam->halfyfield / cam->focus : cam->halfyfield; break; case CAM_HALFFIELD: *VALUE(float) = GetHalfField(cam); break; case CAM_ASPECT: *VALUE(float) = cam->frameaspect; break; case CAM_FOCUS: *VALUE(float) = cam->focus; break; case CAM_NEAR: *VALUE(float) = cam->cnear; break; case CAM_FAR: *VALUE(float) = cam->cfar; break; case CAM_STEREOSEP: *VALUE(float) = cam->stereo_sep; break; case CAM_STEREOANGLE: *VALUE(float) = cam->stereo_angle; break; case CAM_STEREOEYE: *VALUE(int) = cam->whicheye; break; case CAM_C2WHANDLE: *VALUE(Handle *) = cam->c2whandle; break; case CAM_W2CHANDLE: *VALUE(Handle *) = cam->w2chandle; break; case CAM_STEREYES: memcpy(value, cam->stereyes, 2*sizeof(Transform)); break; case CAM_STERHANDLES: memcpy(value, cam->sterhandle, 2*sizeof(Handle *)); break; case CAM_SPACE: *VALUE(int) = cam->space; break; case CAM_BGCOLOR: *VALUE(ColorA) = cam->bgcolor; break; case CAM_BGIMAGE: *VALUE(Image *) = cam->bgimage; break; case CAM_BGIMGHANDLE: *VALUE(Handle *) = cam->bgimghandle; break; default: return -1; break; } return 1; #undef VALUE } void CamDelete( Camera *cam ) { if(cam == NULL) return; if(cam->magic != CAMMAGIC) { OOGLWarn("Internal warning: trying to CamDelete non-Camera %x (%x != %x)", cam, cam->magic, CAMMAGIC); return; } if(RefDecr((Ref *)cam) <= 0) { cam->magic ^= 0x80000000; /* Invalidate */ if(cam->c2whandle) HandlePDelete( &cam->c2whandle ); if(cam->w2chandle) HandlePDelete( &cam->w2chandle ); if(cam->sterhandle[0]) HandlePDelete( &cam->sterhandle[0] ); if(cam->sterhandle[1]) HandlePDelete( &cam->sterhandle[1] ); if (cam->bgimghandle) HandlePDelete(&cam->bgimghandle); if (cam->bgimage) ImgDelete(cam->bgimage); OOGLFree(cam); } } Camera * CamCopy( Camera *src, Camera *dst ) { if (src == NULL) { return NULL; } if (dst == NULL) { dst = OOGLNewE(Camera, "CamCopy Camera"); } #if 0 else HandleDelete(dst->handle); #endif *dst = *src; dst->ref_count = 1; /*dst->handle = NULL;*/ return dst; } void CamReset( Camera *cam ) { Transform T; int persp; CamGet(cam, CAM_PERSPECTIVE, &persp); switch (cam->space) { case TM_EUCLIDEAN: CamSet( cam, CAM_NEAR, .07, CAM_FAR, 100.0, CAM_FOCUS, 3.0, CAM_FOV, persp ? 40.0 : 2.2, CAM_END); break; case TM_HYPERBOLIC: CamSet( cam, CAM_NEAR, .07, CAM_FAR, 100.0, CAM_FOCUS, 2.5, CAM_FOV, persp ? 40.0 : 2.2, CAM_END); break; case TM_SPHERICAL: CamSet( cam, CAM_NEAR, .05, CAM_FAR, -.05, CAM_FOCUS, 0.5, CAM_FOV, persp ? 90.0 : 2.2, CAM_END); break; } TmSpaceTranslate( T, 0.0, 0.0, cam->focus, cam->space ); CamSet(cam, CAM_C2W, T, CAM_END); } /* * Return camera's projection transform in proj. * See CamView below for the range of the projection. */ void CamViewProjection( Camera *cam, Transform proj ) { float y; float x; y = cam->halfyfield; if(cam->flag & CAMF_PERSP) y *= cam->cnear / cam->focus; x = cam->frameaspect * y; if(cam->flag & CAMF_PERSP) { TmPerspective( proj, -x, x, -y, y, cam->cnear, cam->cfar ); } else { TmOrthographic( proj, -x, x, -y, y, cam->cnear, cam->cfar ); } if (cam->flag & CAMF_STEREO) TmConcat( cam->stereyes[cam->whicheye], proj, proj ); } /* * Computes complete transformation from world -> projected coordinates * and leaves it in T. * Projected coordinates map the visible world into -1 <= {X,Y,Z} <= 1, * with Z = -1 at the near plane and Z = +1 at the far plane. */ void CamView( Camera *cam, Transform T ) { Transform t; CamViewProjection( cam, t ); if(cam->flag & CAMF_NEWC2W) { TmInvert( cam->camtoworld, cam->worldtocam ); cam->flag &= ~CAMF_NEWC2W; } TmConcat( cam->worldtocam, t, T ); } void CamRotateX( Camera *cam, float angle ) { CtmRotateX( cam->camtoworld, angle ); cam->flag |= CAMF_NEWC2W; } void CamRotateY( Camera *cam, float angle ) { CtmRotateY( cam->camtoworld, angle ); cam->flag |= CAMF_NEWC2W; } void CamRotateZ( Camera *cam, float angle ) { CtmRotateZ( cam->camtoworld, angle ); cam->flag |= CAMF_NEWC2W; } /* translate the camera, using the camera's notion of what space it is in */ void CamTranslate( Camera *cam, float tx, float ty, float tz ) { Transform T; TmSpaceTranslate( T, tx, ty, tz, cam->space ); TmConcat(T, cam->camtoworld, cam->camtoworld); cam->flag |= CAMF_NEWC2W; } /* CamScale is a noop if the camera is not in Euclidean space */ void CamScale( Camera *cam, float sx, float sy, float sz ) { if (cam->space == TM_EUCLIDEAN) { CtmScale( cam->camtoworld, sx, sy, sz ); cam->flag |= CAMF_NEWC2W; } } void CamAlignZ( Camera *cam, float x, float y, float z ) { Point3 axis; axis.x = x; axis.y = y; axis.z = z; CtmAlignZ( cam->camtoworld, &axis ); cam->flag |= CAMF_NEWC2W; } /* * Apply T to camera as seen by world (== T^-1 to world, as seen by camera) */ void CamTransform( Camera *cam, Transform T ) { TmConcat(T, cam->camtoworld, cam->camtoworld); cam->flag |= CAMF_NEWC2W; } static void CamStereoCompute( Camera *cam ) { float tanconv = tan(cam->stereo_angle); TmTranslate( cam->stereyes[CAM_RIGHT], cam->stereo_sep, 0., 0. ); TmTranslate( cam->stereyes[CAM_LEFT], -cam->stereo_sep, 0., 0. ); cam->stereyes[CAM_RIGHT][TMZ][TMX] = -tanconv; cam->stereyes[CAM_LEFT][TMZ][TMX] = tanconv; } /*----------------------------------------------------------------------- * Function: SetHalfField * Description: set camera's "halffield" value * Args: *cam: the camera * halffield: the halffied value to set to * Returns: nothing * Author: mbp * Date: Wed Aug 21 14:26:43 1991 * Notes: This procedure modifies the halfyfield member of cam * in such a way as to guarantee that the min half-width * of the view window is halffield. This depends on the * camera's current aspect ratio. */ static void SetHalfField( Camera *cam, float halffield ) { cam->halfyfield = (cam->frameaspect < 1 && cam->frameaspect > 0) ? halffield / cam->frameaspect : halffield; if(cam->flag & CAMF_PERSP) cam->halfyfield *= cam->focus; } /*----------------------------------------------------------------------- * Function: GetHalfField * Description: return camera's "halffield" value * Args: *cam: the camera * Returns: the halffield value * Author: mbp * Date: Wed Aug 21 14:29:31 1991 * Notes: the "halffield" is the min half-width of the view * window. If the aspect ratio is >= 1, this is * the vertical half-width (halfyfield). If the aspect * ratio is < 1, this is the horizontal half-width. */ static float GetHalfField( Camera *cam ) { float v = cam->halfyfield; if(cam->frameaspect < 1) v *= cam->frameaspect; if(cam->flag & CAMF_PERSP) v /= cam->focus; return v; } /* * Merge one Camera's changed values into another Camera */ Camera * CamMerge(Camera *src, Camera *dst) { int chg; float fov; if(src == NULL) return dst; if(dst == NULL) return NULL; chg = src->changed; if(chg & CAMF_NEWC2W) CamSet(dst, CAM_C2WHANDLE, src->c2whandle, CAM_C2W, src->camtoworld, CAM_END); if(chg & CAMF_STEREOGEOM) CamSet(dst, CAM_STEREOSEP, src->stereo_sep, CAM_STEREOANGLE, src->stereo_angle, CAM_END); if(chg & CAMF_STEREOXFORM) CamSet(dst, CAM_STEREYES, src->stereyes, CAM_STERHANDLES, src->sterhandle, CAM_END); if(chg & CAMF_W2C) CamSet(dst, CAM_W2CHANDLE, src->w2chandle, CAM_W2C, src->worldtocam, CAM_END); CamGet(src, CAM_FOV, &fov); if(chg & CAMF_FOCUS) CamSet(dst, CAM_FOCUS, src->focus, CAM_END); if(chg & CAMF_PERSP) CamSet(dst,CAM_PERSPECTIVE,src->flag&CAMF_PERSP,CAM_END); if(chg & CAMF_FOV) CamSet(dst, CAM_FOV, fov, CAM_END); if(chg & CAMF_ASPECT) CamSet(dst, CAM_ASPECT, src->frameaspect, CAM_END); if(chg & CAMF_NEAR) dst->cnear = src->cnear; if(chg & CAMF_FAR) dst->cfar = src->cfar; if(chg & CAMF_EYE) dst->whicheye = src->whicheye; if(chg & CAMF_STEREO) CamSet(dst,CAM_STEREO,src->flag&CAMF_STEREO,CAM_END); if(chg & CAMF_SPACE) dst->space = src->space; return dst; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/src/lib/camera/camera.h0000644000175000001440000001505610573306545014471 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef CAMERA_H #define CAMERA_H #include "3d.h" #include "handle.h" #include "color.h" #include typedef struct Camera Camera; /* Public Camera methods (more below): */ Camera *CamCreate( int attr1, ... ); Camera *CamSet( Camera *, int attr1, ... ); Camera * _CamSet(Camera *cam, int attr, va_list *a_list); int CamGet( Camera *, int attr, void *value); void CamDelete( Camera * ); Camera *CamCopy( Camera *src, Camera *dst ); Camera *CamMerge( Camera *src, Camera *dst ); /* Camera attributes: */ /* Set/Create type Get type */ #define CAM_END 800 /* --------------- -------- */ #define CAM_PERSPECTIVE 801 /* int int * */ #define CAM_C2W 802 /* Transform Transform */ #define CAM_W2C 803 /* Transform Transform */ #define CAM_FOV 804 /* float float * */ #define CAM_HALFYFIELD 805 /* float float * */ #define CAM_HALFFIELD 806 /* float float * */ #define CAM_ASPECT 807 /* float float * */ #define CAM_FOCUS 808 /* float float * */ #define CAM_NEAR 809 /* float float * */ #define CAM_FAR 810 /* float float * */ #define CAM_STEREO 811 /* int int * */ #define CAM_STEREOSEP 812 /* float float * */ #define CAM_STEREOANGLE 813 /* float float * */ #define CAM_STEREOEYE 814 /* int int * */ #define CAM_C2WHANDLE 815 /* Handle * Handle ** */ #define CAM_W2CHANDLE 816 /* Handle * Handle ** */ #define CAM_STEREYES 817 /* Transform [2] Transform [2] */ #define CAM_STERHANDLES 818 /* Handle *[2] Handle *[2] */ #define CAM_SPACE 819 /* int int * */ #define CAM_BGCOLOR 820 /* ColorA * ColorA * */ #define CAM_BGIMAGE 821 /* Image * Image ** */ #define CAM_BGIMGHANDLE 822 /* Handle * Handle ** */ #define CAM_ABLOCK 899 /* void **ablock */ /* CAM_END: end of attribute list CAM_PERSPECTIVE: perspective (1) or ortho (0) projection (default:1) CAM_C2W: camera-to-world transform: * C2W = CAM_W2C: world-to-camera transform (inverse of CAM_C2W) CAM_C2WHANDLE: Handle onto CAM_C2W CAM_W2CHANDLE: Handle onto CAM_W2C CAM_FOV: field of view (in degrees) CAM_HALFYFIELD: FOV half-width at z=1 (Y direction) CAM_HALFFIELD: min FOV half-width CAM_ASPECT: aspect ratio, X/Y CAM_FOCUS: nominal focal distance for perspec<->ortho CAM_NEAR: near clipping plane CAM_FAR: far clipping plane CAM_STEREO: stereo (1) or mono (0) (default:0) CAM_STEREOSEP: separation distance between stereo eyes CAM_STEREOANGLE: angle between stereo eyes (degrees) CAM_STEREYES: array of two transforms resp. for left & right eye, applied as * C2W * STEREYE * projection CAM_STERHANDLES: Handles for left and right eye transforms CAM_STEREOEYE: Which stereo eye selected: CAM_LEFT or CAM_RIGHT CAM_SPACE: TM_EUCLIDEAN, TM_HYPERBOLIC, or TM_SPHERICAL */ #define CAM_LEFT 0 #define CAM_RIGHT 1 /* * Additional public Camera methods: */ /* Reset to defaults */ void CamReset( Camera * ); /* return Camera's projection xform; doesn't change camera at all */ void CamViewProjection( Camera *, Transform ); /* Complete cam world->proj xform; doesn't change camera at all */ void CamView( Camera *, Transform ); /* Apply T to camtoworld xform */ void CamTransform( Camera *, Transform T ); /* Rotate camera about X */ void CamRotateX( Camera *, float angle ); /* Rotate about Y (radians) */ void CamRotateY( Camera *, float ); /* Rotate about Z */ void CamRotateZ( Camera *, float ); /* Translate X,Y,Z */ void CamTranslate( Camera *, float,float,float ); /* Hyperbolic xlate */ void CamHypTranslate( Camera *, float,float,float, float ); /* Zoom in X,Y,Z */ void CamScale( Camera *, float,float,float ); /* ??? */ void CamAlignZ( Camera *, float,float,float ); /* Save to file */ void CamSave(Camera *, char *); void CamFSave(Camera *, FILE *, char *); /* Load from file */ Camera *CamLoad(Camera *, char *); Camera *CamFLoad(Camera *, IOBFILE *, char *); /************************************************************************ * The following procedures are on death row; they will be taken out * * soon because they have been superceded by CamGet and CamSet * ************************************************************************/ /* Get object xform */ void CamCurrentPosition( Camera *, Transform ); /* Camera's world->camera xform (inverse of CamCurrentPosition) */ void CamViewWorld( Camera *, Transform ); /* Set "focal" length */ void CamFocus( Camera *, float focus ); /* Get focal length */ float CamCurrentFocus( Camera * ); /* Set X/Y aspect */ void CamFrameAspect( Camera *, float aspectratio ); /* Get X/Y aspect */ float CamCurrentAspect( Camera * ); /* camtoworld xform = T */ void CamTransformTo( Camera *, Transform T ); /* Left/Right/Mono */ void CamStereoEye( Camera *cam, int whicheye ); /* Set clip planes */ void CamClipping( Camera *, float near, float far ); /* Get clipping */ void CamCurrentClipping( Camera *, float *near, float *far ); /* Set field: minfov/2 */ void CamHalfField( Camera *, float halffield ); /* Set field: Yfov/2 */ void CamHalfYField( Camera *, float halfyfield ); /* perspective/ortho */ void CamPerspective( Camera *, int perspective ); /* or orthographic */ int CamIsPerspective( Camera * ); /* Get fov/2 (max way) */ float CamCurrentHalfField( Camera * ); /* Get fov/2 (Y dir) */ float CamCurrentHalfYField( Camera * ); /* Get xfms, cur eye */ int CamCurrentStereo( Camera *, Transform leye, Transform reye ); void CamDefault(Camera *cam); int CamStreamIn(Pool *p, Handle **hp, Camera **camp); int CamStreamOut(Pool *p, Handle *hp, Camera *cam); void CamHandleScan( Camera *cam, int (*func)(), void *arg ); #endif /* !CAMERA_H */ geomview-1.9.4/src/lib/camera/Makefile.am0000644000175000001440000000025710455665330015120 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcamera.la libcamera_la_SOURCES = \ camcompat.c camera.c camstream.c \ camera.h cameraP.h geomview-1.9.4/src/lib/camera/Makefile.in0000644000175000001440000003561110665240500015122 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/camera DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcamera_la_LIBADD = am_libcamera_la_OBJECTS = camcompat.lo camera.lo camstream.lo libcamera_la_OBJECTS = $(am_libcamera_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libcamera_la_SOURCES) DIST_SOURCES = $(libcamera_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libcamera.la libcamera_la_SOURCES = \ camcompat.c camera.c camstream.c \ camera.h cameraP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/camera/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/camera/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libcamera.la: $(libcamera_la_OBJECTS) $(libcamera_la_DEPENDENCIES) $(LINK) $(libcamera_la_OBJECTS) $(libcamera_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camcompat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camera.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camstream.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/camera/cameraP.h0000644000175000001440000000672710573306607014615 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef CAMERAP_H #define CAMERAP_H #include "camera.h" #include "appearance.h" #define CAMMAGIC 0x9c816301 struct Camera { REFERENCEFIELDS; Handle *c2whandle; /* Handle for external camtoworld's */ Transform camtoworld; /* this moves the camera to its spot */ Handle *w2chandle; /* Handle for external worldtocam's */ Transform worldtocam; /* this puts the camera at the origin, etc*/ int flag; /* perspective? stereo? */ float halfyfield, /* FOV half-width at z=1 (Y direction) */ frameaspect, /* Aspect ratio, X/Y */ focus, /* Nominal focal distance for perspec<->ortho*/ cnear, cfar, /* Near & far clipping distances */ stereo_sep, stereo_angle; Handle *sterhandle[2]; Transform stereyes[2]; /* For stereo separation */ int whicheye; /* Current stereo eye selection */ int changed; /* Mask of "changed" fields, for CamMerge */ int space; /* TM_EUCLIDEAN, TM_HYPERBOLIC, or TM_SPHERICAL */ #if 1 /* cH: Background information. Does this belong here? I think * so. The background layout is clearly no property of the drawing * routines (mg-layer), and it has nothing to do with the window * system. Arguably it also has nothing to do with the camera, but * would be a global property of the entire scene. OTH, it is nice * to have cameras with different backgrounds, at least with * different background colours. * * Note that this image is not scaled, it just sits at the center * of the window (if the underlying mg-routines support a * background image at all). The mg-layer may or may not use alpha * blending with the background color if this is a four channel * image. */ ColorA bgcolor; /* background color */ Image *bgimage; /* background image, potentionally with alpha */ Handle *bgimghandle; /* handle for background image */ #endif }; /* bits for 'flag' and 'changed' fields */ #define CAMF_PERSP 0x01 #define CAMF_STEREO 0x02 #define CAMF_NEWC2W 0x04 /* bits for 'changed' only */ #define CAMF_EYE 0x20 #define CAMF_STEREOXFORM 0x40 #define CAMF_STEREOGEOM 0x80 #define CAMF_W2C 0x100 #define CAMF_FOV 0x200 #define CAMF_ASPECT 0x400 #define CAMF_FOCUS 0x800 #define CAMF_NEAR 0x1000 #define CAMF_FAR 0x2000 #define CAMF_SPACE 0x4000 /* * routine for updating transforms */ void CamTransUpdate(Handle **, Camera *, Transform); #endif /* !CAMERAP_H */ /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/camera/camcompat.c0000644000175000001440000001174610461140703015166 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include #include "ooglutil.h" #include "handle.h" #include "streampool.h" #include "cameraP.h" #include "transobj.h" extern HandleOps CamOps; Camera * CamFLoad(Camera *proto, IOBFILE *inf, char *fname) { Pool *p; Camera *cam = NULL; p = PoolStreamTemp(fname, inf, NULL, 0, &CamOps); if(p == NULL) return NULL; if(proto != NULL) OOGLError(1, "Note: CamFLoad(cam, ...) can't handle cam != NULL"); (void) CamStreamIn(p, NULL, &cam); PoolDelete(p); return cam; } void CamFSave(Camera *cam, FILE *outf, char *fname) { Pool *p = PoolStreamTemp(fname, NULL, outf, 1, &CamOps); if(p == NULL) return; (void) CamStreamOut(p, NULL, cam); PoolDelete(p); } Camera * CamLoad(Camera *cam, char *name) { IOBFILE *f; if((f = iobfopen(name,"r")) == NULL) { perror(name); return NULL; } cam = CamFLoad(cam, f, name); iobfclose(f); return cam; } void CamSave(Camera *cam, char *name) { FILE *f; if((f = fopen(name, "w")) == NULL) { perror(name); return; } CamFSave(cam, f, name); fclose(f); } /* I'm not sure what to do with the following procedure. On one hand I think it should come out and be replaced by get-only attributes?? On the other hand, it's nice to be able to get both eyes in one call. I need to understand more about how stereo works. Until then, I'm commenting this procedure out. -- mbp Fri Aug 9 00:32:36 1991 */ #ifdef notdef int CamCurrentStereo( Camera *cam, Transform leye, Transform reye ) { if(leye != TMNULL) TmCopy(cam->stereyes[0], leye); if(reye != TMNULL) TmCopy(cam->stereyes[1], reye); return cam->whicheye; } #endif /************************************************************************ * The following procedures are on death row; they will be taken out * * soon because they have been superceded by CamGet and CamSet * ************************************************************************/ void CamCurrentPosition( Camera *cam, Transform T ) { TmCopy( cam->camtoworld, T ); } /* * Return world -> camera coordinate transform in T. * Note this is the inverse of the transform given by CamCurrentPosition(). */ void CamViewWorld( Camera *cam, Transform T ) { if (cam->flag & CAMF_NEWC2W ) { TmInvert( cam->camtoworld, cam->worldtocam ); cam->flag &= ~CAMF_NEWC2W; } /* else we have the actual worldtocam transform already computed */ TmCopy( cam->worldtocam, T ); } void CamFocus( Camera *cam, float focus ) { cam->focus = focus; } float CamCurrentFocus( Camera *cam ) { return cam->focus; } float CamCurrentAspect( Camera *cam ) { return cam->frameaspect; } /* * Set aspect ratio; preserve minimum field-of-view. */ void CamFrameAspect( Camera *cam, float aspect ) { cam->frameaspect = aspect; } void CamTransformTo( Camera *cam, Transform T ) { TmCopy( T, cam->camtoworld ); cam->flag |= CAMF_NEWC2W; } /* * Select which eye to view through in stereo mode. */ /* incorporate into CamSet & remove: */ void CamStereoEye( Camera *cam, int whicheye ) { if(whicheye > 1) whicheye = 1; cam->whicheye = whicheye; } void CamClipping( Camera *cam, float cnear, float cfar ) { cam->cnear = cnear; cam->cfar = cfar; } void CamCurrentClipping( Camera *cam, float *cnear, float *cfar ) { *cnear = cam->cnear; *cfar = cam->cfar; } void CamHalfYField( Camera *cam, float halfyfov ) { cam->halfyfield = halfyfov; } float CamCurrentHalfYField( Camera *cam ) { return cam->halfyfield; } float CamCurrentHalfField( Camera *cam ) { return cam->frameaspect > 1 ? cam->halfyfield : cam->halfyfield * cam->frameaspect; } void CamPerspective( Camera *cam, int persp ) { if (persp) cam->flag |= CAMF_PERSP; else cam->flag &= ~CAMF_PERSP; } int CamIsPerspective( Camera *cam ) { return ((cam->flag & CAMF_PERSP) != 0); } geomview-1.9.4/src/lib/camera/Headers0000644000175000001440000000002307730236257014355 00000000000000camera.h cameraP.h geomview-1.9.4/src/lib/Makefile.am0000644000175000001440000000065310600603451013654 00000000000000SUBDIRS = geometry camera color oogl shade window gprim fexpr geomutil \ pointlist mg mib forms aclib if INSTALL_LIBGEOMVIEW lib_LTLIBRARIES = libgeomview.la else noinst_LTLIBRARIES = libgeomview.la endif libgeomview_la_SOURCES = libgeomview_la_LIBADD = \ $(OOGLLIBS) $(OPENGLLIBS) $(SOCKETLIBS) $(XLIBS) $(ZLIB_LIB) libgeomview_la_DEPENDENCIES = $(OOGLLIBS) Makefile.am libgeomview_la_LDFLAGS = -release @PACKAGE_VERSION@ geomview-1.9.4/src/lib/Makefile.in0000644000175000001440000004672110665240500013676 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(libdir)" libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = am_libgeomview_la_OBJECTS = libgeomview_la_OBJECTS = $(am_libgeomview_la_OBJECTS) libgeomview_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libgeomview_la_LDFLAGS) $(LDFLAGS) -o $@ @INSTALL_LIBGEOMVIEW_FALSE@am_libgeomview_la_rpath = @INSTALL_LIBGEOMVIEW_TRUE@am_libgeomview_la_rpath = -rpath $(libdir) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libgeomview_la_SOURCES) DIST_SOURCES = $(libgeomview_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = geometry camera color oogl shade window gprim fexpr geomutil \ pointlist mg mib forms aclib @INSTALL_LIBGEOMVIEW_TRUE@lib_LTLIBRARIES = libgeomview.la @INSTALL_LIBGEOMVIEW_FALSE@noinst_LTLIBRARIES = libgeomview.la libgeomview_la_SOURCES = libgeomview_la_LIBADD = \ $(OOGLLIBS) $(OPENGLLIBS) $(SOCKETLIBS) $(XLIBS) $(ZLIB_LIB) libgeomview_la_DEPENDENCIES = $(OOGLLIBS) Makefile.am libgeomview_la_LDFLAGS = -release @PACKAGE_VERSION@ all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ f=$(am__strip_dir) \ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ else :; fi; \ done uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ p=$(am__strip_dir) \ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgeomview.la: $(libgeomview_la_OBJECTS) $(libgeomview_la_DEPENDENCIES) $(libgeomview_la_LINK) $(am_libgeomview_la_rpath) $(libgeomview_la_OBJECTS) $(libgeomview_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-exec-am: install-libLTLIBRARIES install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ ctags ctags-recursive distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-libLTLIBRARIES \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/window/0000777000175000001440000000000010665240671013223 500000000000000geomview-1.9.4/src/lib/window/windowP.h0000644000175000001440000000466110573274205014744 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef WINDOWPDEF #define WINDOWPDEF #include #include "window.h" /* Private definitions for Window package */ /* * Private flag bits: * "flag" indicates whether corresponding field valid, * "changed" indicates whether changed since someone last unset "changed". */ #define WNF_ENLARGE 0x01 /* Allow window to be enlarged from pref size*/ #define WNF_SHRINK 0x02 /* Allow window to be shrunk */ #define WNF_NOBORDER 0x04 /* Draw window without frame */ #define WNF_HASPREF 0x10 /* Requested position */ #define WNF_HASSIZE 0x20 /* Requested size */ #define WNF_HASVP 0x40 /* Drawing viewport within window */ #define WNF_HASCUR 0x80 /* Window's "current position" */ #define WNF_HASNAME 0x100 /* Window's title */ #define WNF_HASPIXASPECT 0x200 /* pixel aspect ratio? */ struct WnWindow { REFERENCEFIELDS; int flag; /* Which fields are set? */ int xsize, ysize; /* Window size */ WnPosition pref; /* Requested abs win position */ WnPosition cur; /* Current position */ WnPosition viewport; /* Relative viewport in win */ char *win_name; /* Window title */ float aspect; /* X/Y Aspect ratio (of cur pos) */ float pixaspect; /* Aspect ratio of hardware pixels */ int changed; /* These fields changed */ }; extern WnWindow *_WnSet(WnWindow *, int firstattr, va_list *alist); #define WINDOWMAGIC OOGLMagic('w', 1) #endif /* WINDOWPDEF */ /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/window/winstream.c0000644000175000001440000001507710574560322015323 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Stuart Levy, Tamara Munzner, Mark Phillips */ #include "windowP.h" int WnStreamIn( Pool *, Handle **, WnWindow ** ); int WnStreamOut( Pool *, Handle *, WnWindow * ); HandleOps WindowOps = { "window", (int ((*)()))WnStreamIn, (int ((*)()))WnStreamOut, (void ((*)()))WnDelete, NULL, NULL }; static struct winkeyword { char *kw; int flag; } wn_kw[] = { { "window", 0 }, { "define", 0 }, { "size", WNF_HASSIZE }, { "position", WNF_HASPREF }, { "noborder", WNF_NOBORDER }, { "border", WNF_NOBORDER }, { "pixelaspect", WNF_HASPIXASPECT }, { "resize", WNF_ENLARGE|WNF_SHRINK }, { "curpos", WNF_HASCUR }, { "viewport", WNF_HASVP }, { "title", WNF_HASNAME }, }; /* See the comments in src/lib/gprim/geom/geomstream.c for the logic * behind HandleDelete(), RefIncr(), RefDecr() etc. */ int WnStreamIn( Pool *p, Handle **hp, WnWindow **wp ) { Handle *h = NULL; Handle *hname = NULL; WnWindow *win = NULL; IOBFILE *inf; char *w, *raww, *err, *title; int i, c; int more, unset; int brack = 0; static char poserr[] = "xmin xmax ymin ymax"; if(p == NULL || (inf = PoolInputFile(p)) == NULL) return 0; win = WnCreate(WN_END); do { more = unset = 0; switch(c = iobfnextc(inf, 0)) { case '{': brack++; iobfgetc(inf); break; case '}': if(brack--) iobfgetc(inf); break; case '<': case ':': case '@': iobfgetc(inf); w = iobfdelimtok("{}()", inf, 0); if(c == '<' && (h = HandleByName(w, &WindowOps)) == NULL) { w = findfile(PoolName(p), raww = w); if(w == NULL) { OOGLSyntax(inf, "Reading window from \"%s\": can't find file \"%s\"", PoolName(p), raww); break; } } else if (h) { HandleDelete(h); /* undo HandleByName() */ } h = HandleReferringTo(c, w, &WindowOps, NULL); if(h) { win = (WnWindow *)HandleObject(h); RefIncr((Ref *)win); } break; case '-': iobfgetc(inf); unset = 1; /* and fall into... */ default: w = iobfdelimtok("{}()", inf, 0); if(w == NULL) goto error; for(i = sizeof(wn_kw)/sizeof(wn_kw[0]); strcmp(w, wn_kw[--i].kw); ) if(i == 0) { OOGLSyntax(inf, "Reading window from \"%s\": unknown keyword \"%s\"", PoolName(p), w); goto error; } win->changed |= wn_kw[i].flag; if(unset) { win->flag &= ~wn_kw[i].flag; continue; } win->flag |= wn_kw[i].flag; switch(i) { case 0: more = 1; break; /* window */ case 1: /* define */ hname = HandleCreateGlobal(iobftoken(inf, 0), &WindowOps); more = 1; break; case 2: /* size */ err = "xsize ysize"; if(iobfgetni(inf, 1, (int *)(void *)&win->xsize, 0) <= 0 || iobfgetni(inf, 1, (int *)(void *)&win->ysize, 0) <= 0) goto expect; break; case 3: /* position */ err = poserr; if(iobfgetni(inf, 4, (int *)&win->pref, 0) != 4) goto expect; break; /* "noborder" and "resize" are just flag manipulation */ case 5: /* border */ win->flag &= ~wn_kw[i].flag; break; case 6: /* pixelaspect */ err = "pixel-aspect-ratio(X/Y)"; if(iobfgetnf(inf, 1, &win->pixaspect, 0) <= 0) goto expect; break; case 8: /* curpos */ err = poserr; if(iobfgetni(inf, 4, (int *)&win->cur, 0) != 4) goto expect; break; case 9: /* viewport */ err = poserr; if(iobfgetni(inf, 4, (int *)&win->viewport, 0) != 4) goto expect; break; case 10: err = "window title string"; title = iobfdelimtok("{}()", inf, 0); if(title == NULL) goto expect; WnSet(win, WN_NAME, title, WN_END); break; } break; expect: OOGLSyntax(inf, "Reading window from \"%s\": \"%s\" expects %s", PoolName(p), w, err); error: if(win && !h) WnDelete(win); return 0; } } while (brack || more); if (hname != NULL) { if (win) { HandleSetObject(hname, (Ref *)win); } if (h) { HandleDelete(h); } h = hname; } /* Pass the ownership of h and win to the caller if requested */ if (hp != NULL) { /* pass on ownership of the handle h to the caller of this function */ if (*hp != NULL) { if (*hp != h) { HandlePDelete(hp); } else { HandleDelete(*hp); } } *hp = h; } else if (h) { /* Otherwise delete h because we are its owner. Note that * HandleReferringTo() has passed the ownership of h to us; * explicitly defined handles (hdefine and define constructs) * will not be deleted by this call. */ HandleDelete(h); } /* same logic as for hp */ if (wp != NULL) { if (*wp != NULL) { WnDelete(*wp); } *wp = win; } else if(win) { WnDelete(win); } return (h != NULL || win != NULL); } int WnStreamOut( Pool *p, Handle *h, WnWindow *win ) { int i; WnPosition *wp; FILE *f; if((f = PoolOutputFile(p)) == NULL) return 0; fprintf(f, "window {"); if(PoolStreamOutHandle( p, h, win != NULL)) { for(i = 2; i < sizeof(wn_kw)/sizeof(wn_kw[0]); i++) { if(win->flag & wn_kw[i].flag) { if(wn_kw[i].flag & WNF_HASNAME) continue; fprintf(f, " %s", wn_kw[i].kw); switch(i) { case 2: fprintf(f, " %d %d", win->xsize, win->ysize); break; case 3: wp = &win->pref; goto dowp; case 6: fprintf(f, " %g", win->pixaspect); break; case 10: break; case 8: wp = &win->cur; goto dowp; case 9: wp = &win->viewport; /* Fall into dowp */ dowp: fprintf(f, " %d %d %d %d", wp->xmin, wp->xmax, wp->ymin, wp->ymax); break; } } } } fputs(" }\n", f); return 1; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 4 *** * End: *** */ geomview-1.9.4/src/lib/window/Makefile.am0000644000175000001440000000024310455665340015173 00000000000000INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libwindow.la libwindow_la_SOURCES = \ window.c winstream.c \ window.h windowP.h geomview-1.9.4/src/lib/window/Makefile.in0000644000175000001440000003544610665240507015216 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/lib/window DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libwindow_la_LIBADD = am_libwindow_la_OBJECTS = window.lo winstream.lo libwindow_la_OBJECTS = $(am_libwindow_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libwindow_la_SOURCES) DIST_SOURCES = $(libwindow_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ INCLUDES = $(default_includes) EXTRA_DIST = Headers noinst_LTLIBRARIES = libwindow.la libwindow_la_SOURCES = \ window.c winstream.c \ window.h windowP.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/window/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/window/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libwindow.la: $(libwindow_la_OBJECTS) $(libwindow_la_DEPENDENCIES) $(LINK) $(libwindow_la_OBJECTS) $(libwindow_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/window.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/winstream.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/src/lib/window/window.c0000644000175000001440000002003010571031700014570 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ #if HAVE_CONFIG_H # include "config.h" #endif #if 0 static char copyright[] = "Copyright (C) 1992-1998 The Geometry Center\n\ Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips"; #endif /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #include #include "ooglutil.h" #include "windowP.h" #define SETFLAG(flag, bit, value) \ if (value) flag |= bit; \ else flag &= ~bit #define GETFLAG(flag, bit) ( (flag & bit) != 0 ) static void WnSetName(WnWindow *win, char *name); WnWindow * WnCreate(int firstattr, ...) { WnWindow *win; va_list a_list; win = OOGLNewE ( WnWindow, "WnCreate WnWindow" ); RefInit((Ref *)win, WINDOWMAGIC); win->xsize = -1; win->ysize = -1; win->pixaspect = 1.0; win->win_name = NULL; win->changed = win->flag = WNF_ENLARGE | WNF_SHRINK; va_start(a_list, firstattr); win = _WnSet(win, firstattr, &a_list); va_end( a_list ); return win; } static void WnSetName(WnWindow *win, char *name) { if (win->win_name != NULL) free(win->win_name); win->win_name = name ? strdup(name) : NULL; } WnWindow * WnSet(WnWindow *win, int firstattr, ...) { va_list a_list; va_start(a_list, firstattr); win = _WnSet(win, firstattr, &a_list); va_end( a_list ); return win; } WnWindow * _WnSet(WnWindow *win, int firstattr, va_list *alist) { int attr; WnPosition *pos; int oldflag; char *name; char **ablock = NULL; #define NEXT(type) OOGL_VA_ARG(type,alist,ablock) /* Parse args */ for(attr = firstattr; attr != WN_END; attr = NEXT(int)) { switch (attr) { case WN_ABLOCK: ablock = NEXT(char **); break; case WN_XSIZE: win->xsize = NEXT(int); goto sized; case WN_YSIZE: win->ysize = NEXT(int); sized: win->flag |= WNF_HASSIZE; win->changed |= WNF_HASSIZE; break; case WN_CURPOS: pos = NEXT(WnPosition *); if(pos) { win->cur = *pos; win->aspect = (pos->ymax != pos->ymin) ? (double)(pos->xmax - pos->xmin) / (double)(pos->ymax - pos->ymin) : 1.0; win->xsize = win->cur.xmax - win->cur.xmin + 1; win->ysize = win->cur.ymax - win->cur.ymin + 1; win->flag |= WNF_HASCUR|WNF_HASSIZE; } else { win->flag &= ~WNF_HASCUR; } win->changed |= WNF_HASCUR; break; case WN_PREFPOS: pos = NEXT(WnPosition *); if(pos) { win->pref = *pos; win->flag |= WNF_HASPREF; } else win->flag &= ~WNF_HASPREF; win->changed |= WNF_HASPREF; break; case WN_VIEWPORT: pos = NEXT(WnPosition *); if(pos) { win->viewport = *pos; win->flag |= WNF_HASVP; } else { win->flag &= ~WNF_HASVP; } win->changed |= WNF_HASVP; break; case WN_NAME: name = NEXT(char *); WnSetName(win, name); if (name != NULL) win->flag |= WNF_HASNAME; else win->flag &= ~WNF_HASNAME; win->changed |= WNF_HASNAME; break; case WN_ENLARGE: oldflag = win->flag; SETFLAG(win->flag, WNF_ENLARGE, NEXT(int)); if (oldflag != win->flag) win->changed |= WNF_ENLARGE; break; case WN_SHRINK: oldflag = win->flag; SETFLAG(win->flag, WNF_SHRINK, NEXT(int)); if (oldflag != win->flag) win->changed |= WNF_SHRINK; break; case WN_NOBORDER: oldflag = win->flag; SETFLAG(win->flag, WNF_NOBORDER, NEXT(int)); if (oldflag != win->flag) win->changed |= WNF_NOBORDER; break; case WN_PIXELASPECT: win->pixaspect = NEXT(double); win->changed |= WNF_HASPIXASPECT; win->flag |= WNF_HASPIXASPECT; break; default: OOGLError (0, "_WnSet: Undefined attribute: %d", attr); return NULL; } } return(win); #undef NEXT } /* * Get a value. * Returns -1 for invalid attribute, 0 if no value set, 1 if valid value. */ int WnGet(WnWindow *win, int attr, void *valp) { int bit; #define WnPos WnPosition switch(attr) { case WN_XSIZE: case WN_YSIZE: bit = WNF_HASSIZE; if(win->flag & WNF_HASCUR) { win->xsize = win->cur.xmax - win->cur.xmin + 1; win->ysize = win->cur.ymax - win->cur.ymin + 1; bit = WNF_HASCUR; } else if((win->flag & (WNF_HASPREF|WNF_HASSIZE)) == WNF_HASPREF) { win->xsize = win->pref.xmax - win->pref.xmin + 1; win->ysize = win->pref.ymax - win->pref.ymin + 1; bit = WNF_HASPREF; } *(int *)valp = attr == WN_XSIZE ? win->xsize : win->ysize; break; case WN_CURPOS: if(!(win->flag & WNF_HASCUR)) { win->cur.xmin = win->cur.ymin = 0; win->cur.xmax = win->xsize + 1; win->cur.ymax = win->ysize + 1; } *(WnPos *)valp = win->cur; bit=WNF_HASCUR; break; case WN_PREFPOS: *(WnPos *)valp = win->pref; bit=WNF_HASPREF; break; case WN_VIEWPORT: if(!(win->flag & WNF_HASVP)) { /* Fill in viewport structure with something reasonable, if we can. */ win->viewport.xmin = 0; win->viewport.ymin = 0; if(win->flag & WNF_HASCUR) { win->viewport.xmax = win->cur.xmax - win->cur.xmin + 1; win->viewport.ymax = win->cur.ymax - win->cur.ymin + 1; } else if(win->flag & WNF_HASSIZE) { win->viewport.xmax = win->xsize; win->viewport.ymax = win->ysize; } else { win->viewport.xmax = win->pref.xmax - win->pref.xmin + 1; win->viewport.ymax = win->pref.ymax - win->pref.ymin + 1; } } *(WnPos *)valp = win->viewport; bit=WNF_HASVP; break; case WN_NAME: *(char**)valp = win->win_name; bit=WNF_HASNAME; break; case WN_ENLARGE: *(int*)valp = GETFLAG(win->flag,WNF_ENLARGE); return 1; case WN_SHRINK: *(int*)valp = GETFLAG(win->flag,WNF_SHRINK); return 1; case WN_NOBORDER: *(int*)valp = GETFLAG(win->flag,WNF_NOBORDER); return 1; case WN_ASPECT: *(float*)valp = win->aspect*win->pixaspect; return 1; case WN_PIXELASPECT: *(float*)valp = win->pixaspect; return 1; default: return -1; } return win->flag & bit ? 1 : 0; } void WnDelete(WnWindow *win) { if(win == NULL) return; if(win->magic != WINDOWMAGIC) { OOGLWarn("Internal warning: WnDelete on non-WnWindow %x (%x != %x)", win, win->magic, WINDOWMAGIC); return; } if(RefDecr((Ref *)win) > 0) return; win->magic ^= 0x80000000; OOGLFree(win); } WnWindow * WnCopy(WnWindow *win) { WnWindow *nw = WnCreate(WN_END); if(win) { *nw = *win; RefInit((Ref *)nw, WINDOWMAGIC); /* * This code assumes there are no (other) pointers in a WnWindow, * i.e. a bitwise copy is enough. */ if(nw->win_name) nw->win_name = strdup(nw->win_name); } return nw; } WnWindow * WnMerge(WnWindow *src, WnWindow *dst) { int chg; if(src == NULL) return dst; if(dst == NULL) return NULL; chg = src->changed; dst->flag = (dst->flag & ~chg) | (src->flag & chg); dst->changed |= chg; if(chg & WNF_HASPREF) dst->pref = src->pref; if(chg & WNF_HASCUR) dst->cur = src->cur, dst->aspect = src->aspect; if(chg & WNF_HASSIZE) { dst->xsize = src->xsize; dst->ysize = src->ysize; /* If "size" is set and not cur/pref/vp, invalidate those. */ dst->flag &= ~((WNF_HASCUR|WNF_HASPREF|WNF_HASVP) & ~chg); } if(chg & WNF_HASVP) dst->viewport = src->viewport; if(chg & src->flag & WNF_HASNAME) WnSetName(dst, src->win_name); if(chg & WNF_HASPIXASPECT) dst->pixaspect = src->pixaspect; return dst; } geomview-1.9.4/src/lib/window/window.h0000644000175000001440000000710710455701010014606 00000000000000/* Copyright (C) 1992-1998 The Geometry Center * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */ #ifndef WINDOWDEF #define WINDOWDEF #include #include #include "reference.h" #include "ooglutil.h" #include "streampool.h" typedef struct { int xmin, xmax, ymin, ymax; } WnPosition; typedef struct WnWindow WnWindow; /* Public WnWindow methods: */ extern WnWindow *WnCreate(int firstattr, ... /*, WN_END */); extern WnWindow *WnSet(WnWindow *, int firstattr, ... /*, WN_END */); extern int WnGet(WnWindow *, int attr, void *value); extern void WnDelete(WnWindow *); extern WnWindow *WnCopy(WnWindow *); extern WnWindow *WnMerge(WnWindow *src, WnWindow *dst); extern WnWindow *_WnSet(WnWindow *win, int firstattr, va_list *alist); extern int WnStreamOut( Pool *, Handle *, WnWindow * ); extern int WnStreamIn( Pool *p, Handle **hp, WnWindow **wp ); /* * Attributes for WnCreate(), WnSet(), WnGet(). * * Supplying a NULL pointer, or -1 value, for one of these * unsets the corresponding value. * * Initially, all values are unset. * * WnGet()'s returned value * on an invalid token is -1 * on an unset value is 0 * on a set value is 1 */ /* Set/Create type Get type */ #define WN_END 900 /* --------------- -------- */ #define WN_XSIZE 901 /* int int * */ #define WN_YSIZE 902 /* int int * */ #define WN_PREFPOS 903 /* WnPosition * WnPosition * */ #define WN_VIEWPORT 904 /* WnPosition * WnPosition * */ #define WN_CURPOS 905 /* WnPosition * WnPosition * */ #define WN_NAME 906 /* char * char ** */ /* * The following attributes always have a value (may not be "unset"): */ #define WN_ENLARGE 907 /* int int * */ #define WN_SHRINK 908 /* int int * */ #define WN_NOBORDER 909 /* int int * */ #define WN_ASPECT 910 /* --- unsettable --- float * */ #define WN_PIXELASPECT 911 /* float float * */ #define WN_ABLOCK 912 /* void **ablock --ungettable-- */ /* WN_END: end of attribute list WN_XSIZE: desired window width in pixels WN_YSIZE: desired window height in pixels WN_PREFPOS: desired absolute position of window (pixels) WN_VIEWPORT: viewport relative to window (pixels) WN_CURPOS: window's real position (pixels) WN_NAME: window name WN_ENLARGE: window enlargable from pref size? (1=yes, 0=no) (default:1) WN_SHRINK: window shrinkable from pref size? (1=yes, 0=no) (default:1) WN_NOBORDER: draw window without border? (1=yes, 0=no) (default:0) WN_ASPECT: the window's current aspect ratio; the window package updates this automatically when you set the CURPOS attribute. WN_PIXELASPECT: pixel aspect ratio, i.e. screen X pixel size / Y pixel size. Default is 1.0, but may change e.g. for stereo hardware. Taken into account by WN_ASPECT */ #endif /* WINDOWDEF */ geomview-1.9.4/src/lib/window/Headers0000644000175000001440000000002307730240453014425 00000000000000window.h windowP.h geomview-1.9.4/src/lib/ChangeLog0000644000175000001440000000423710463662402013404 000000000000002006-07-31 Steve M. Robbins * gprim/geom/knownclass.c: In list of function prototypes, fix bug arising from the fact that the "*" in C attaches to the declarator rather than the type. Patch from Karl Chen (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=366381). * oogl/util/ooglutil.h: Remove declaration of fmemopen(), as it is already in porting.h, included by this header. 2002-10-26 Steve M. Robbins * oogl/util/futil.c: Add defined(__CYGWIN__) to __FreeBSD__ version of stdio buffer fields. * oogl/util/error.c (sperrno): Add !defined(__CYGWIN__) to list of conditions. * oogl/lisp/lisp.c (ulongpull): Use "unsigned long" (not ulong) as second argument. 2002-04-13 Steve M. Robbins * mg/opengl/mgopenglshade.c: Update the declarations for glBindTextureEXT and glDeleteTexturesEXT. * fexpr/real.c: Use variables to compute 0/0. * gprim/geom/geomstream.c: * mg/common/mgtexture.c: * oogl/util/findfile.c: * oogl/util/glob.c: Add __unix__ to list of CPP symbols used to detect unix systems. * oogl/refcomm/handleP.h: Include . * shade/appearance.c: Bugfix; variable 'c' was used uninitialized. 2001-03-21 Steve M. Robbins * mib/mibToggle.c (mib_create_Toggle, mib_load_Toggle): * mib/mibload.c (mib_load_public, mib_reset_size): Set width and height only if non-zero. 2001-02-17 Steve Robbins * oogl/util/futil.c: Use WORDS_BIGENDIAN instead of old BIG_ENDIAN; the latter is defined on some linux machines, even little-endian ones. Clean code a bit to placate "gcc -Wall". * oogl/util/glibglue.C: Convert FILE* to istdiostream class from which we obtain the rdbuf structure that can set and seek to marks. 2000-11-05 Steve Robbins * oogl/lisp/Makefile.am (BUILT_SOURCES): Declare clisp.c and clisp.h. 2000-10-29 Steve Robbins * oogl/lisp/Makefile.am (clisp.c): * oogl/wa/Makefile.am (wa.yacc.c, wa.lex.c): * fexpr/Makefile.am (parse.tab.c): Use $srcdir to refer to files in the source hierarchy. geomview-1.9.4/src/Makefile.am0000644000175000001440000000142110603772077013116 00000000000000SUBDIRS = lib bin bin_SCRIPTS = geomview CLEANFILES = geomview geomview: $(top_srcdir)/geomview.sh Makefile sed -e 's|%GEOMROOT%|$(prefix)|g' \ -e 's|%GEOMVIEW_GVX%|$(moduledir)/gvx|g' \ -e 's|%MACHTYPE%|$(MACHTYPE)|g' \ -e 's|%GEOMDATA%|$(geomdatadir)|g' \ -e 's|%MODULESDIR%|$(moduledir)|g' \ -e "s|%LD_LIBRARY_PATH_SETTINGS%|$(LD_LIBRARY_PATH_SETTINGS)|" \ -e "s|%GEOMVIEW_LIB%|$(libdir)|g" \ -e "s|%GEOMVIEW_INCLUDE%|$(pkgincludedir)|g" \ -e "s|%PACKAGE_VERSION%|$(PACKAGE_VERSION)|g" \ -e "s|%GEOMDOCDIR%|$(docdir)|g" \ < $(top_srcdir)/geomview.sh > geomview chmod +x geomview geomview-1.9.4/src/Makefile.in0000644000175000001440000004301510665240474013133 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" binSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(bin_SCRIPTS) SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = lib bin bin_SCRIPTS = geomview CLEANFILES = geomview all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_SCRIPTS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f $$d$$p; then \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ else :; fi; \ done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; for p in $$list; do \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(SCRIPTS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-exec-am: install-binSCRIPTS install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binSCRIPTS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binSCRIPTS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-binSCRIPTS geomview: $(top_srcdir)/geomview.sh Makefile sed -e 's|%GEOMROOT%|$(prefix)|g' \ -e 's|%GEOMVIEW_GVX%|$(moduledir)/gvx|g' \ -e 's|%MACHTYPE%|$(MACHTYPE)|g' \ -e 's|%GEOMDATA%|$(geomdatadir)|g' \ -e 's|%MODULESDIR%|$(moduledir)|g' \ -e "s|%LD_LIBRARY_PATH_SETTINGS%|$(LD_LIBRARY_PATH_SETTINGS)|" \ -e "s|%GEOMVIEW_LIB%|$(libdir)|g" \ -e "s|%GEOMVIEW_INCLUDE%|$(pkgincludedir)|g" \ -e "s|%PACKAGE_VERSION%|$(PACKAGE_VERSION)|g" \ -e "s|%GEOMDOCDIR%|$(docdir)|g" \ < $(top_srcdir)/geomview.sh > geomview chmod +x geomview # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/NEWS0000644000175000001440000002103710663333333010771 000000000000001.9.4 August 2007 * Translation of the manual to Brazilian Portuguese, courtesy of Jorge Barros de Abreu . * Image-stream filter bug fixes. * Fixed (transform ...), (transform-incr ...) interests (broken by previous change since 1.9.0) * Improved computation of averaged per-vertex polygon normals (taking the relative orientation of the facets in to account). * Loading of textured meshes was broken by a previous change since 1.9.0, fix that. * GEOMROOT environment variable has been resurrected, needed by some external modules (e.g. StageTools). 1.9.3 June 2007 * Drawing of spheres was severely broken. 1.9.2 June 2007 * Bug-fix release for 1.9.0 (see ChangeLog) * ND-picking was not fully implemented; should work now * PICKFUNC() interface has changed 1.9.1 May 2007 * Bug-fix release for 1.9.0 * versions strings were wrong in some places * textures would not be reloaded after deleting all cameras (OpenGL MG-backend) 1.9.0 April 2007 * the OpenGL `MG' back-end is now able to display translucent object _correctly_. More specifically: translucency will be displayed correctly for each separate top-level object (those which appear in the object browser). Different translucent top-level objects will not be rendered correctly w.r.t. to each other. Translucency also works for non-flat or concave polygons if the Geomview is configured for OpenGL and if libGLU is found; in that case the GLU tesselator is used to compute a triangulation of concave or even self-intersecting polygons. * new GCL object: Image. Image data for textures or background can now be embedded into the ordinary GCL data stream. Images can be given symbolic names via (read image { define ... }) and (hdefine...). * Appearances can now be given symbolic names via `define' and `hdefine' * RenderMan output now supports texturing. I had to write some more shaders to support this. The new shaders do not seem to work with the old BMRT (Blue Moon Render Tools) package, because BMRT does not seem to understand the `textureinfo' command. More recent renderers like Aqsis, 3Delight and Pixie seem to work. Also, writing bianry RIB files was broken on Big-Endian machines in all previous releases of Geomview. * Textures can be applied in "replace" mode: the texture colour simply replaces the surface color. * support for translucent textures * The Sphere OOGL objects now have support for texture-xmapping; the details are documented in the Geomview manual. * new GCL command `hdelete' (lazy deletion of global handles) * new GCL commands (dump-handles) and (write-handle FILENAME) to aid debugging * All emodules which need the XForms library have been moved to the separate package `gvemodules-xforms', the `ndutils', `NDview', `Crayola' and `Labeler' emodules have been moved to separate packages. * External extension modules ("emodules") no longer neeed to be compiled inside the Geomview source-tree; they can now be built separately, using an installed version of the OOGL library and the header files. Compiling external add-ons inside the source tree is no longer supported. I have ported `Maniview' and the `Orrery' to this new scheme. * another bunch of internal fixes, most notably fixing of reference counts * The manual now has cross-references for individual GCL commands. cH 1.8.2 November 2006 (never released) * I/O with release <= 1.8.1 was just broken, they used internals of opaque data-types (e.g. the FILE handle of the stdio library) * Maple V8 interface * VRML2 interface * build-system fixes (ported to recent automake/autoconf combo) * standard GNU installation paths: PREFIX/bin, PREFIX/share/geomview, PREFIX/libexec/geomview etc. * variable argument fixes, was also broken in <= 1.8.1 releases. * Documentation can be regenerated with recent texinfo releases. * OpenGL is now optional * one big shared libgeomview library * fmemopen() by using temporary files (not using stdio internals) * I have resurrected a couple of old modules: NDview, clipboard, cplxview, crayola, flythrough, gvclock, hinge, labeler, ndutils. * New "BBox Center" toggle in the tools menu (use the center of the current object's bouding box for the CENTER object) * optionally use the window-manager's idea of the focus for the camera windows instead of forcing a mouse-cross policy -- new GCL function (ui-cam-focus [focus-change|mouse-cross]) * Fixed a couple (Ups!) of long-standing memory leaks. * The Nd code in Geomview was one big ugly memory leak. Fixed that. * ND transformations and vectors now have their homogeneous component at index 0. * It is now possible to define handles for "ntransform" objects, i.e. "(read ntransfrom { define fred ... })" works now. * Each camera of a cluster now has it's (additional) private 3d transform, the focal-length hack has gone. * The look commands work now in the context of ND-viewing. * Basic INST support for ND transformations. * Picking works now with ND-viewing. cH 1.8.1 March, 2001 This is a bugfix release. * No segfaults at startup on linux. * Toggle buttons are visible again. * Binary I/O on linux works. 1.8.0 November 17, 2000 The software in this release is almost the same as in the 1.7.* series. The main difference is that it has an improved configure script and Makefiles that allow for several new things. (a) VPATH builds now supported (b) Additional external modules can simply be dropped into place in the "src/bin" directory, and Geomview's configure script will notice their presence and configure/build them when you configure/build Geomview. (This only works with module distributions that have been specifically packed up for this purpose; see http://www.geomview.org/download for more details.) (c) The binary Intel/Linux XFORMS distribution is no longer a part of the Geomview source distribution. Users who want it can download it separately, unpack it into the Geomview source tree, and Geomview's configure script will notice it's there and use it. (This works with the binary XFORMS distribution for any system, not just Intel/Linux.) (d) 'togeomview' program now included in the release (this program, used to facilitate communication between Geomview and other programs, got temporarily dropped in release 1.7.0, but now is back). (e) a few minor bug fixes; see ChangeLog for details 1.7.10 Nov 1, 2000 Attempted to fix bug which caused Geomview to crash immediately upon startup on some newer GNU/Linux systems. The bug has to do with Geomview's use of the 'fmemopen' system function. This release attempts to autodetect which version of this function to use. If it still crashes for you, pass the flag "--enable-fstropen-1" to "configure" and try again. If you still have problems, let me [mbp@geomtech.com] know. Misc fixes to allow compilation on wider variety of platforms 1.7.9 Oct 20, 2000 Minor change to allow compilation with Mesa-3.3 (related to how Mesa-3.3 declares prototypes for GL extention functions). No change in functionality, but this version compiles without errors with Mesa-3.3, which previous versions didn't. 1.7.8 Oct 14, 2000 Fixed bug which prevented compressed textures from working on some Linux systems Fixed several compilation/configuration problems. Now tested on: Linux: RedHat 6.1, 7.0 Mandrake 7.0 Caldera-2.3 Mandrake-7.0 Slackware-7.0 Solaris-2.6 (SunOS 5.6) AIX 4.3.2 IRIX 6.3 1.7.7 August 22, 2000 Added some of the external modules to the distribution, but haven't actually tested them. Updated the documentation to reflect the fact that the geomview-users mailing list is now hosted at lists.sourceforge.net. 1.7.6 May 25, 2000 This is the first release of Geomview to use GNU autoconf. The autoconf script has been tested on Linux (RedHat 6.1), IRIX 6.3, and AIX 4.3.2. It's untested on other platforms and may need tweaking to work on them. Also, note that this release does not include the external modules. If you want any of them, use an older release, or wait for a future one. geomview-1.9.4/data/0000777000175000001440000000000010665240703011264 500000000000000geomview-1.9.4/data/geom/0000777000175000001440000000000010665240703012213 500000000000000geomview-1.9.4/data/geom/cube0000644000175000001440000000062607730233106012772 00000000000000OFF 8 6 12 -0.5 -0.5 -0.5 # 0 0.5 -0.5 -0.5 # 1 0.5 0.5 -0.5 # 2 -0.5 0.5 -0.5 # 3 -0.5 -0.5 0.5 # 4 0.5 -0.5 0.5 # 5 0.5 0.5 0.5 # 6 -0.5 0.5 0.5 # 7 4 3 2 1 0 0.800 0.098 0.098 4 4 5 6 7 0.098 0.647 0.400 4 2 3 7 6 0.098 0.098 0.800 4 0 1 5 4 0.898 0.600 0.000 4 0 4 7 3 0.000 0.600 0.800 4 1 2 6 5 0.498 0.000 0.898 geomview-1.9.4/data/geom/tetra.off0000644000175000001440000000033107730233143013736 00000000000000OFF 4 4 6 0.0 0.0 2.0 1.632993 -0.942809 -0.666667 0.000000 1.885618 -0.666667 -1.632993 -0.942809 -0.666667 3 1 0 3 0.784 0.000 0.000 3 2 0 1 0.784 0.000 0.000 3 3 0 2 0.784 0.000 0.000 3 3 2 1 0.784 0.000 0.000 geomview-1.9.4/data/geom/ztent.mesh0000644000175000001440000000003407730233152014145 00000000000000ZMESH 3 3 0 1 0 0 1 0 0 1 0 geomview-1.9.4/data/geom/tri.vect0000644000175000001440000000021107730233017013601 00000000000000VECT 1 3 0 -3 0 # 0.2 0.0 0.0 0.5 0.7 0.0 0.9 0.0 0.0 # 0.5 0.1 0.1 0.5 0.7 0.5 0.5 0.9 0.9 0.2 0.1 0.1 0.5 0.7 0.4 0.9 0.1 0.7 geomview-1.9.4/data/geom/tref.off0000644000175000001440000012022307730233013013556 00000000000000 OFF 1280 320 1280 5.40414 0.269732 0.917559 4.68585 0.381459 0.739248 4.35375 -1.08202 1.25418 5.02057 -1.34041 1.47509 4.68585 0.381459 0.739248 4.26875 0.269732 0.127895 3.9607 -1.10742 0.617722 4.35375 -1.08202 1.25418 4.26875 0.269732 0.127895 4.39716 2.04672e-08 -0.558376 4.07166 -1.40172 -0.0614581 3.9607 -1.10742 0.617722 4.39716 2.04672e-08 -0.558376 4.99586 -0.269732 -0.917559 4.62163 -1.79253 -0.385507 4.07166 -1.40172 -0.0614581 4.99586 -0.269732 -0.917559 5.71414 -0.381459 -0.739248 5.28845 -2.05092 -0.164601 4.62163 -1.79253 -0.385507 5.71414 -0.381459 -0.739248 6.13125 -0.269732 -0.127895 5.68151 -2.02552 0.471856 5.28845 -2.05092 -0.164601 6.13125 -0.269732 -0.127895 6.00284 -3.25924e-08 0.558376 5.57054 -1.73122 1.15104 5.68151 -2.02552 0.471856 6.00284 -3.25924e-08 0.558376 5.40414 0.269732 0.917559 5.02057 -1.34041 1.47509 5.57054 -1.73122 1.15104 5.02057 -1.34041 1.47509 4.35375 -1.08202 1.25418 3.50273 -2.13266 1.65138 3.97329 -2.64537 1.92691 4.35375 -1.08202 1.25418 3.9607 -1.10742 0.617722 3.21023 -1.99079 0.977188 3.50273 -2.13266 1.65138 3.9607 -1.10742 0.617722 4.07166 -1.40172 -0.0614581 3.26714 -2.30288 0.299266 3.21023 -1.99079 0.977188 4.07166 -1.40172 -0.0614581 4.62163 -1.79253 -0.385507 3.64011 -2.88609 0.0147317 3.26714 -2.30288 0.299266 4.62163 -1.79253 -0.385507 5.28845 -2.05092 -0.164601 4.11067 -3.3988 0.29026 3.64011 -2.88609 0.0147317 5.28845 -2.05092 -0.164601 5.68151 -2.02552 0.471856 4.40317 -3.54067 0.964452 4.11067 -3.3988 0.29026 5.68151 -2.02552 0.471856 5.57054 -1.73122 1.15104 4.34626 -3.22858 1.64237 4.40317 -3.54067 0.964452 5.57054 -1.73122 1.15104 5.02057 -1.34041 1.47509 3.97329 -2.64537 1.92691 4.34626 -3.22858 1.64237 3.97329 -2.64537 1.92691 3.50273 -2.13266 1.65138 2.32872 -2.69887 1.86633 2.51647 -3.36069 2.16123 3.50273 -2.13266 1.65138 3.21023 -1.99079 0.977188 2.21874 -2.4407 1.17246 2.32872 -2.69887 1.86633 3.21023 -1.99079 0.977188 3.26714 -2.30288 0.299266 2.25095 -2.73741 0.486061 2.21874 -2.4407 1.17246 3.26714 -2.30288 0.299266 3.64011 -2.88609 0.0147317 2.40649 -3.41519 0.20923 2.25095 -2.73741 0.486061 3.64011 -2.88609 0.0147317 4.11067 -3.3988 0.29026 2.59424 -4.07701 0.504126 2.40649 -3.41519 0.20923 4.11067 -3.3988 0.29026 4.40317 -3.54067 0.964452 2.70422 -4.33518 1.198 2.59424 -4.07701 0.504126 4.40317 -3.54067 0.964452 4.34626 -3.22858 1.64237 2.67201 -4.03847 1.8844 2.70422 -4.33518 1.198 4.34626 -3.22858 1.64237 3.97329 -2.64537 1.92691 2.51647 -3.36069 2.16123 2.67201 -4.03847 1.8844 2.51647 -3.36069 2.16123 2.32872 -2.69887 1.86633 1.09146 -2.76847 1.84044 0.988244 -3.45903 2.11005 2.32872 -2.69887 1.86633 2.21874 -2.4407 1.17246 1.21227 -2.47805 1.16127 1.09146 -2.76847 1.84044 2.21874 -2.4407 1.17246 2.25095 -2.73741 0.486061 1.27989 -2.7579 0.47038 1.21227 -2.47805 1.16127 2.25095 -2.73741 0.486061 2.40649 -3.41519 0.20923 1.25472 -3.44407 0.17249 1.27989 -2.7579 0.47038 2.40649 -3.41519 0.20923 2.59424 -4.07701 0.504126 1.1515 -4.13463 0.442098 1.25472 -3.44407 0.17249 2.59424 -4.07701 0.504126 2.70422 -4.33518 1.198 1.03069 -4.42505 1.12127 1.1515 -4.13463 0.442098 2.70422 -4.33518 1.198 2.67201 -4.03847 1.8844 0.963072 -4.1452 1.81216 1.03069 -4.42505 1.12127 2.67201 -4.03847 1.8844 2.51647 -3.36069 2.16123 0.988244 -3.45903 2.11005 0.963072 -4.1452 1.81216 0.988244 -3.45903 2.11005 1.09146 -2.76847 1.84044 -0.0214467 -2.47149 1.55103 -0.338791 -3.11465 1.76516 1.09146 -2.76847 1.84044 1.21227 -2.47805 1.16127 0.308461 -2.22665 0.925385 -0.0214467 -2.47149 1.55103 1.21227 -2.47805 1.16127 1.27989 -2.7579 0.47038 0.457677 -2.52356 0.25472 0.308461 -2.22665 0.925385 1.27989 -2.7579 0.47038 1.25472 -3.44407 0.17249 0.338791 -3.18829 -0.0681003 0.457677 -2.52356 0.25472 1.25472 -3.44407 0.17249 1.1515 -4.13463 0.442098 0.0214468 -3.83145 0.146028 0.338791 -3.18829 -0.0681003 1.1515 -4.13463 0.442098 1.03069 -4.42505 1.12127 -0.308461 -4.07629 0.771671 0.0214468 -3.83145 0.146028 1.03069 -4.42505 1.12127 0.963072 -4.1452 1.81216 -0.457677 -3.77938 1.44234 -0.308461 -4.07629 0.771671 0.963072 -4.1452 1.81216 0.988244 -3.45903 2.11005 -0.338791 -3.11465 1.76516 -0.457677 -3.77938 1.44234 -0.338791 -3.11465 1.76516 -0.0214467 -2.47149 1.55103 -0.940341 -2.01935 1.05187 -1.3601 -2.61621 1.2185 -0.0214467 -2.47149 1.55103 0.308461 -2.22665 0.925385 -0.487221 -1.83222 0.486294 -0.940341 -2.01935 1.05187 0.308461 -2.22665 0.925385 0.457677 -2.52356 0.25472 -0.266176 -2.16446 -0.146929 -0.487221 -1.83222 0.486294 0.457677 -2.52356 0.25472 0.338791 -3.18829 -0.0681003 -0.406691 -2.82143 -0.476862 -0.266176 -2.16446 -0.146929 0.338791 -3.18829 -0.0681003 0.0214468 -3.83145 0.146028 -0.826453 -3.4183 -0.310235 -0.406691 -2.82143 -0.476862 0.0214468 -3.83145 0.146028 -0.308461 -4.07629 0.771671 -1.27957 -3.60542 0.255346 -0.826453 -3.4183 -0.310235 -0.308461 -4.07629 0.771671 -0.457677 -3.77938 1.44234 -1.50062 -3.27318 0.888569 -1.27957 -3.60542 0.255346 -0.457677 -3.77938 1.44234 -0.338791 -3.11465 1.76516 -1.3601 -2.61621 1.2185 -1.50062 -3.27318 0.888569 -1.3601 -2.61621 1.2185 -0.940341 -2.01935 1.05187 -1.70702 -1.58035 0.496374 -2.15583 -2.1609 0.643822 -0.940341 -2.01935 1.05187 -0.487221 -1.83222 0.486294 -1.22742 -1.40801 -0.0518083 -1.70702 -1.58035 0.496374 -0.487221 -1.83222 0.486294 -0.266176 -2.16446 -0.146929 -0.997998 -1.74483 -0.679606 -1.22742 -1.40801 -0.0518083 -0.266176 -2.16446 -0.146929 -0.406691 -2.82143 -0.476862 -1.15313 -2.3935 -1.01926 -0.997998 -1.74483 -0.679606 -0.406691 -2.82143 -0.476862 -0.826453 -3.4183 -0.310235 -1.60194 -2.97405 -0.871816 -1.15313 -2.3935 -1.01926 -0.826453 -3.4183 -0.310235 -1.27957 -3.60542 0.255346 -2.08153 -3.14639 -0.323634 -1.60194 -2.97405 -0.871816 -1.27957 -3.60542 0.255346 -1.50062 -3.27318 0.888569 -2.31096 -2.80957 0.304164 -2.08153 -3.14639 -0.323634 -1.50062 -3.27318 0.888569 -1.3601 -2.61621 1.2185 -2.15583 -2.1609 0.643822 -2.31096 -2.80957 0.304164 -2.15583 -2.1609 0.643822 -1.70702 -1.58035 0.496374 -2.39421 -1.15689 0.0458258 -2.87646 -1.71508 0.172585 -1.70702 -1.58035 0.496374 -1.22742 -1.40801 -0.0518083 -1.94502 -0.964008 -0.520957 -2.39421 -1.15689 0.0458258 -1.22742 -1.40801 -0.0518083 -0.997998 -1.74483 -0.679606 -1.79203 -1.24942 -1.19575 -1.94502 -0.964008 -0.520957 -0.997998 -1.74483 -0.679606 -1.15313 -2.3935 -1.01926 -2.02486 -1.84594 -1.58327 -1.79203 -1.24942 -1.19575 -1.15313 -2.3935 -1.01926 -1.60194 -2.97405 -0.871816 -2.50711 -2.40413 -1.45651 -2.02486 -1.84594 -1.58327 -1.60194 -2.97405 -0.871816 -2.08153 -3.14639 -0.323634 -2.9563 -2.59701 -0.889727 -2.50711 -2.40413 -1.45651 -2.08153 -3.14639 -0.323634 -2.31096 -2.80957 0.304164 -3.10929 -2.3116 -0.214934 -2.9563 -2.59701 -0.889727 -2.31096 -2.80957 0.304164 -2.15583 -2.1609 0.643822 -2.87646 -1.71508 0.172585 -3.10929 -2.3116 -0.214934 -2.87646 -1.71508 0.172585 -2.39421 -1.15689 0.0458258 -3.04681 -0.626351 -0.229998 -3.61906 -1.10217 -0.150354 -2.39421 -1.15689 0.0458258 -1.94502 -0.964008 -0.520957 -2.61474 -0.409077 -0.801241 -3.04681 -0.626351 -0.229998 -1.94502 -0.964008 -0.520957 -1.79203 -1.24942 -1.19575 -2.57594 -0.577628 -1.52946 -2.61474 -0.409077 -0.801241 -1.79203 -1.24942 -1.19575 -2.02486 -1.84594 -1.58327 -2.95314 -1.03327 -1.98807 -2.57594 -0.577628 -1.52946 -2.02486 -1.84594 -1.58327 -2.50711 -2.40413 -1.45651 -3.52539 -1.50909 -1.90842 -2.95314 -1.03327 -1.98807 -2.50711 -2.40413 -1.45651 -2.9563 -2.59701 -0.889727 -3.95746 -1.72636 -1.33718 -3.52539 -1.50909 -1.90842 -2.9563 -2.59701 -0.889727 -3.10929 -2.3116 -0.214934 -3.99626 -1.55781 -0.608963 -3.95746 -1.72636 -1.33718 -3.10929 -2.3116 -0.214934 -2.87646 -1.71508 0.172585 -3.61906 -1.10217 -0.150354 -3.99626 -1.55781 -0.608963 -3.61906 -1.10217 -0.150354 -3.04681 -0.626351 -0.229998 -3.61886 0.159764 -0.313688 -4.30848 -0.129308 -0.281055 -3.04681 -0.626351 -0.229998 -2.61474 -0.409077 -0.801241 -3.1525 0.355248 -0.865511 -3.61886 0.159764 -0.313688 -2.61474 -0.409077 -0.801241 -2.57594 -0.577628 -1.52946 -3.18259 0.342633 -1.61327 -3.1525 0.355248 -0.865511 -2.57594 -0.577628 -1.52946 -2.95314 -1.03327 -1.98807 -3.69152 0.129307 -2.11895 -3.18259 0.342633 -1.61327 -2.95314 -1.03327 -1.98807 -3.52539 -1.50909 -1.90842 -4.38114 -0.159764 -2.08631 -3.69152 0.129307 -2.11895 -3.52539 -1.50909 -1.90842 -3.95746 -1.72636 -1.33718 -4.8475 -0.355248 -1.53449 -4.38114 -0.159764 -2.08631 -3.95746 -1.72636 -1.33718 -3.99626 -1.55781 -0.608963 -4.81741 -0.342633 -0.786727 -4.8475 -0.355248 -1.53449 -3.99626 -1.55781 -0.608963 -3.61906 -1.10217 -0.150354 -4.30848 -0.129308 -0.281055 -4.81741 -0.342633 -0.786727 -4.30848 -0.129308 -0.281055 -3.61886 0.159764 -0.313688 -3.91921 1.25858 -0.190259 -4.66728 1.24921 -0.167393 -3.61886 0.159764 -0.313688 -3.1525 0.355248 -0.865511 -3.4073 1.35338 -0.728003 -3.91921 1.25858 -0.190259 -3.1525 0.355248 -0.865511 -3.18259 0.342633 -1.61327 -3.43141 1.47808 -1.46562 -3.4073 1.35338 -0.728003 -3.18259 0.342633 -1.61327 -3.69152 0.129307 -2.11895 -3.97742 1.55963 -1.97103 -3.43141 1.47808 -1.46562 -3.69152 0.129307 -2.11895 -4.38114 -0.159764 -2.08631 -4.72549 1.55026 -1.94816 -3.97742 1.55963 -1.97103 -4.38114 -0.159764 -2.08631 -4.8475 -0.355248 -1.53449 -5.2374 1.45546 -1.41042 -4.72549 1.55026 -1.94816 -4.8475 -0.355248 -1.53449 -4.81741 -0.342633 -0.786727 -5.21329 1.33076 -0.672799 -5.2374 1.45546 -1.41042 -4.81741 -0.342633 -0.786727 -4.30848 -0.129308 -0.281055 -4.66728 1.24921 -0.167393 -5.21329 1.33076 -0.672799 -4.66728 1.24921 -0.167393 -3.91921 1.25858 -0.190259 -3.7162 2.51802 0.1314 -4.40172 2.81292 0.189037 -3.91921 1.25858 -0.190259 -3.4073 1.35338 -0.728003 -3.20952 2.45964 -0.41639 -3.7162 2.51802 0.1314 -3.4073 1.35338 -0.728003 -3.43141 1.47808 -1.46562 -3.17847 2.67196 -1.13344 -3.20952 2.45964 -0.41639 -3.43141 1.47808 -1.46562 -3.97742 1.55963 -1.97103 -3.64124 3.03062 -1.59972 -3.17847 2.67196 -1.13344 -3.97742 1.55963 -1.97103 -4.72549 1.55026 -1.94816 -4.32676 3.32552 -1.54208 -3.64124 3.03062 -1.59972 -4.72549 1.55026 -1.94816 -5.2374 1.45546 -1.41042 -4.83344 3.3839 -0.994294 -4.32676 3.32552 -1.54208 -5.2374 1.45546 -1.41042 -5.21329 1.33076 -0.672799 -4.86449 3.17158 -0.27724 -4.83344 3.3839 -0.994294 -5.21329 1.33076 -0.672799 -4.66728 1.24921 -0.167393 -4.40172 2.81292 0.189037 -4.86449 3.17158 -0.27724 -4.40172 2.81292 0.189037 -3.7162 2.51802 0.1314 -2.92684 3.61849 0.592935 -3.42313 4.16536 0.71483 -3.7162 2.51802 0.1314 -3.20952 2.45964 -0.41639 -2.50141 3.40931 0.0137415 -2.92684 3.61849 0.592935 -3.20952 2.45964 -0.41639 -3.17847 2.67196 -1.13344 -2.39605 3.66033 -0.683465 -2.50141 3.40931 0.0137415 -3.17847 2.67196 -1.13344 -3.64124 3.03062 -1.59972 -2.67247 4.22452 -1.09027 -2.39605 3.66033 -0.683465 -3.64124 3.03062 -1.59972 -4.32676 3.32552 -1.54208 -3.16876 4.77139 -0.968377 -2.67247 4.22452 -1.09027 -4.32676 3.32552 -1.54208 -4.83344 3.3839 -0.994294 -3.59419 4.98057 -0.389184 -3.16876 4.77139 -0.968377 -4.83344 3.3839 -0.994294 -4.86449 3.17158 -0.27724 -3.69955 4.72955 0.308023 -3.59419 4.98057 -0.389184 -4.86449 3.17158 -0.27724 -4.40172 2.81292 0.189037 -3.42313 4.16536 0.71483 -3.69955 4.72955 0.308023 -3.42313 4.16536 0.71483 -2.92684 3.61849 0.592935 -1.69742 4.24431 1.09751 -1.91179 4.93433 1.29277 -2.92684 3.61849 0.592935 -2.50141 3.40931 0.0137415 -1.4194 3.93231 0.476566 -1.69742 4.24431 1.09751 -2.50141 3.40931 0.0137415 -2.39605 3.66033 -0.683465 -1.24057 4.1811 -0.206321 -1.4194 3.93231 0.476566 -2.39605 3.66033 -0.683465 -2.67247 4.22452 -1.09027 -1.26569 4.84495 -0.551127 -1.24057 4.1811 -0.206321 -2.67247 4.22452 -1.09027 -3.16876 4.77139 -0.968377 -1.48006 5.53497 -0.355869 -1.26569 4.84495 -0.551127 -3.16876 4.77139 -0.968377 -3.59419 4.98057 -0.389184 -1.75808 5.84697 0.265073 -1.48006 5.53497 -0.355869 -3.59419 4.98057 -0.389184 -3.69955 4.72955 0.308023 -1.93691 5.59818 0.947961 -1.75808 5.84697 0.265073 -3.69955 4.72955 0.308023 -3.42313 4.16536 0.71483 -1.91179 4.93433 1.29277 -1.93691 5.59818 0.947961 -1.91179 4.93433 1.29277 -1.69742 4.24431 1.09751 -0.332444 4.23989 1.53801 -0.226866 4.93456 1.79588 -1.69742 4.24431 1.09751 -1.4194 3.93231 0.476566 -0.24328 3.90175 0.876246 -0.332444 4.23989 1.53801 -1.4194 3.93231 0.476566 -1.24057 4.1811 -0.206321 -0.011607 4.11822 0.198249 -0.24328 3.90175 0.876246 -1.24057 4.1811 -0.206321 -1.26569 4.84495 -0.551127 0.226866 4.7625 -0.098823 -0.011607 4.11822 0.198249 -1.26569 4.84495 -0.551127 -1.48006 5.53497 -0.355869 0.332443 5.45717 0.15905 0.226866 4.7625 -0.098823 -1.48006 5.53497 -0.355869 -1.75808 5.84697 0.265073 0.24328 5.79531 0.82081 0.332443 5.45717 0.15905 -1.75808 5.84697 0.265073 -1.93691 5.59818 0.947961 0.0116062 5.57884 1.49881 0.24328 5.79531 0.82081 -1.93691 5.59818 0.947961 -1.91179 4.93433 1.29277 -0.226866 4.93456 1.79588 0.0116062 5.57884 1.49881 -0.226866 4.93456 1.79588 -0.332444 4.23989 1.53801 0.855804 3.65823 1.82156 1.25493 4.22065 2.11241 -0.332444 4.23989 1.53801 -0.24328 3.90175 0.876246 0.746559 3.38793 1.1322 0.855804 3.65823 1.82156 -0.24328 3.90175 0.876246 -0.011607 4.11822 0.198249 0.991187 3.56808 0.448155 0.746559 3.38793 1.1322 -0.011607 4.11822 0.198249 0.226866 4.7625 -0.098823 1.44639 4.09315 0.170129 0.991187 3.56808 0.448155 0.226866 4.7625 -0.098823 0.332443 5.45717 0.15905 1.84552 4.65557 0.460984 1.44639 4.09315 0.170129 0.332443 5.45717 0.15905 0.24328 5.79531 0.82081 1.95476 4.92587 1.15034 1.84552 4.65557 0.460984 0.24328 5.79531 0.82081 0.0116062 5.57884 1.49881 1.71013 4.74572 1.83439 1.95476 4.92587 1.15034 0.0116062 5.57884 1.49881 -0.226866 4.93456 1.79588 1.25493 4.22065 2.11241 1.71013 4.74572 1.83439 1.25493 4.22065 2.11241 0.855804 3.65823 1.82156 1.67381 2.69508 1.88053 2.28014 3.03259 2.161 0.855804 3.65823 1.82156 0.746559 3.38793 1.1322 1.39961 2.58551 1.19277 1.67381 2.69508 1.88053 0.746559 3.38793 1.1322 0.991187 3.56808 0.448155 1.61817 2.76807 0.500584 1.39961 2.58551 1.19277 0.991187 3.56808 0.448155 1.44639 4.09315 0.170129 2.20146 3.13581 0.209458 1.61817 2.76807 0.500584 1.44639 4.09315 0.170129 1.84552 4.65557 0.460984 2.80779 3.47332 0.489925 2.20146 3.13581 0.209458 1.84552 4.65557 0.460984 1.95476 4.92587 1.15034 3.08199 3.58289 1.17769 2.80779 3.47332 0.489925 1.95476 4.92587 1.15034 1.71013 4.74572 1.83439 2.86343 3.40033 1.86988 3.08199 3.58289 1.17769 1.71013 4.74572 1.83439 1.25493 4.22065 2.11241 2.28014 3.03259 2.161 2.86343 3.40033 1.86988 2.28014 3.03259 2.161 1.67381 2.69508 1.88053 2.08869 1.58409 1.67757 2.7921 1.69244 1.90928 1.67381 2.69508 1.88053 1.39961 2.58551 1.19277 1.72313 1.68221 1.03185 2.08869 1.58409 1.67757 1.39961 2.58551 1.19277 1.61817 2.76807 0.500584 1.90955 1.92931 0.350383 1.72313 1.68221 1.03185 1.61817 2.76807 0.500584 2.20146 3.13581 0.209458 2.53876 2.18066 0.032359 1.90955 1.92931 0.350383 2.20146 3.13581 0.209458 2.80779 3.47332 0.489925 3.24217 2.28901 0.264073 2.53876 2.18066 0.032359 2.80779 3.47332 0.489925 3.08199 3.58289 1.17769 3.60773 2.1909 0.90979 3.24217 2.28901 0.264073 3.08199 3.58289 1.17769 2.86343 3.40033 1.86988 3.42131 1.94379 1.59126 3.60773 2.1909 0.90979 2.86343 3.40033 1.86988 2.28014 3.03259 2.161 2.7921 1.69244 1.90928 3.42131 1.94379 1.59126 2.7921 1.69244 1.90928 2.08869 1.58409 1.67757 2.21251 0.519551 1.23531 2.93865 0.481104 1.41266 2.08869 1.58409 1.67757 1.72313 1.68221 1.03185 1.8231 0.784179 0.653465 2.21251 0.519551 1.23531 1.72313 1.68221 1.03185 1.90955 1.92931 0.350383 1.99854 1.11997 0.00795818 1.8231 0.784179 0.653465 1.90955 1.92931 0.350383 2.53876 2.18066 0.032359 2.63605 1.33023 -0.323081 1.99854 1.11997 0.00795818 2.53876 2.18066 0.032359 3.24217 2.28901 0.264073 3.36219 1.29178 -0.145733 2.63605 1.33023 -0.323081 3.24217 2.28901 0.264073 3.60773 2.1909 0.90979 3.7516 1.02715 0.436113 3.36219 1.29178 -0.145733 3.60773 2.1909 0.90979 3.42131 1.94379 1.59126 3.57616 0.691358 1.08162 3.7516 1.02715 0.436113 3.42131 1.94379 1.59126 2.7921 1.69244 1.90928 2.93865 0.481104 1.41266 3.57616 0.691358 1.08162 2.93865 0.481104 1.41266 2.21251 0.519551 1.23531 2.22497 -0.407733 0.677821 2.95272 -0.4979 0.827717 2.21251 0.519551 1.23531 1.8231 0.784179 0.653465 1.83407 -0.0787205 0.130867 2.22497 -0.407733 0.677821 1.8231 0.784179 0.653465 1.99854 1.11997 0.00795818 2.009 0.296405 -0.492747 1.83407 -0.0787205 0.130867 1.99854 1.11997 0.00795818 2.63605 1.33023 -0.323081 2.64728 0.497901 -0.827717 2.009 0.296405 -0.492747 2.63605 1.33023 -0.323081 3.36219 1.29178 -0.145733 3.37503 0.407733 -0.677821 2.64728 0.497901 -0.827717 3.36219 1.29178 -0.145733 3.7516 1.02715 0.436113 3.76593 0.0787212 -0.130867 3.37503 0.407733 -0.677821 3.7516 1.02715 0.436113 3.57616 0.691358 1.08162 3.591 -0.296404 0.492748 3.76593 0.0787212 -0.130867 3.57616 0.691358 1.08162 2.93865 0.481104 1.41266 2.95272 -0.4979 0.827717 3.591 -0.296404 0.492748 2.95272 -0.4979 0.827717 2.22497 -0.407733 0.677821 2.21551 -1.22908 0.179609 2.94232 -1.34697 0.314034 2.22497 -0.407733 0.677821 1.83407 -0.0787205 0.130867 1.82368 -0.921732 -0.379158 2.21551 -1.22908 0.179609 1.83407 -0.0787205 0.130867 2.009 0.296405 -0.492747 1.99636 -0.604974 -1.03495 1.82368 -0.921732 -0.379158 2.009 0.296405 -0.492747 2.64728 0.497901 -0.827717 2.63238 -0.464356 -1.40361 1.99636 -0.604974 -1.03495 2.64728 0.497901 -0.827717 3.37503 0.407733 -0.677821 3.35919 -0.58225 -1.26918 2.63238 -0.464356 -1.40361 3.37503 0.407733 -0.677821 3.76593 0.0787212 -0.130867 3.75102 -0.889596 -0.710418 3.35919 -0.58225 -1.26918 3.76593 0.0787212 -0.130867 3.591 -0.296404 0.492748 3.57834 -1.20635 -0.0546273 3.75102 -0.889596 -0.710418 3.591 -0.296404 0.492748 2.95272 -0.4979 0.827717 2.94232 -1.34697 0.314034 3.57834 -1.20635 -0.0546273 2.94232 -1.34697 0.314034 2.21551 -1.22908 0.179609 2.13317 -2.04219 -0.157256 2.84615 -2.24907 -0.0619664 2.21551 -1.22908 0.179609 1.82368 -0.921732 -0.379158 1.73199 -1.77342 -0.729121 2.13317 -2.04219 -0.157256 1.82368 -0.921732 -0.379158 1.99636 -0.604974 -1.03495 1.8776 -1.60022 -1.44257 1.73199 -1.77342 -0.729121 1.99636 -0.604974 -1.03495 2.63238 -0.464356 -1.40361 2.48471 -1.62403 -1.87967 1.8776 -1.60022 -1.44257 2.63238 -0.464356 -1.40361 3.35919 -0.58225 -1.26918 3.19769 -1.83091 -1.78438 2.48471 -1.62403 -1.87967 3.35919 -0.58225 -1.26918 3.75102 -0.889596 -0.710418 3.59887 -2.09968 -1.21252 3.19769 -1.83091 -1.78438 3.75102 -0.889596 -0.710418 3.57834 -1.20635 -0.0546273 3.45326 -2.27288 -0.499071 3.59887 -2.09968 -1.21252 3.57834 -1.20635 -0.0546273 2.94232 -1.34697 0.314034 2.84615 -2.24907 -0.0619664 3.45326 -2.27288 -0.499071 2.84615 -2.24907 -0.0619664 2.13317 -2.04219 -0.157256 1.84486 -2.91718 -0.306775 2.48637 -3.30036 -0.263648 2.13317 -2.04219 -0.157256 1.73199 -1.77342 -0.729121 1.43529 -2.63184 -0.864489 1.84486 -2.91718 -0.306775 1.73199 -1.77342 -0.729121 1.8776 -1.60022 -1.44257 1.49758 -2.61149 -1.61009 1.43529 -2.63184 -0.864489 1.8776 -1.60022 -1.44257 2.48471 -1.62403 -1.87967 1.99523 -2.86804 -2.10681 1.49758 -2.61149 -1.61009 2.48471 -1.62403 -1.87967 3.19769 -1.83091 -1.78438 2.63674 -3.25122 -2.06369 1.99523 -2.86804 -2.10681 3.19769 -1.83091 -1.78438 3.59887 -2.09968 -1.21252 3.04631 -3.53656 -1.50597 2.63674 -3.25122 -2.06369 3.59887 -2.09968 -1.21252 3.45326 -2.27288 -0.499071 2.98402 -3.55691 -0.760371 3.04631 -3.53656 -1.50597 3.45326 -2.27288 -0.499071 2.84615 -2.24907 -0.0619664 2.48637 -3.30036 -0.263648 2.98402 -3.55691 -0.760371 2.48637 -3.30036 -0.263648 1.84486 -2.91718 -0.306775 1.18771 -3.78053 -0.253501 1.6523 -4.36707 -0.235078 1.84486 -2.91718 -0.306775 1.43529 -2.63184 -0.864489 0.818574 -3.41446 -0.791968 1.18771 -3.78053 -0.253501 1.43529 -2.63184 -0.864489 1.49758 -2.61149 -1.61009 0.761125 -3.48331 -1.53505 0.818574 -3.41446 -0.791968 1.49758 -2.61149 -1.61009 1.99523 -2.86804 -2.10681 1.04902 -3.94673 -2.04746 0.761125 -3.48331 -1.53505 1.99523 -2.86804 -2.10681 2.63674 -3.25122 -2.06369 1.51361 -4.53327 -2.02904 1.04902 -3.94673 -2.04746 2.63674 -3.25122 -2.06369 3.04631 -3.53656 -1.50597 1.88275 -4.89934 -1.49057 1.51361 -4.53327 -2.02904 3.04631 -3.53656 -1.50597 2.98402 -3.55691 -0.760371 1.94019 -4.83049 -0.747489 1.88275 -4.89934 -1.49057 2.98402 -3.55691 -0.760371 2.48637 -3.30036 -0.263648 1.6523 -4.36707 -0.235078 1.94019 -4.83049 -0.747489 1.6523 -4.36707 -0.235078 1.18771 -3.78053 -0.253501 0.108625 -4.3857 0.00606821 0.299132 -5.10845 0.0455106 1.18771 -3.78053 -0.253501 0.818574 -3.41446 -0.791968 -0.145512 -3.93407 -0.533985 0.108625 -4.3857 0.00606821 0.818574 -3.41446 -0.791968 0.761125 -3.48331 -1.53505 -0.31441 -4.01812 -1.25829 -0.145512 -3.93407 -0.533985 0.761125 -3.48331 -1.53505 1.04902 -3.94673 -2.04746 -0.29913 -4.58861 -1.74257 -0.31441 -4.01812 -1.25829 1.04902 -3.94673 -2.04746 1.51361 -4.53327 -2.02904 -0.108624 -5.31136 -1.70312 -0.29913 -4.58861 -1.74257 1.51361 -4.53327 -2.02904 1.88275 -4.89934 -1.49057 0.145513 -5.76299 -1.16307 -0.108624 -5.31136 -1.70312 1.88275 -4.89934 -1.49057 1.94019 -4.83049 -0.747489 0.314411 -5.67894 -0.438763 0.145513 -5.76299 -1.16307 1.94019 -4.83049 -0.747489 1.6523 -4.36707 -0.235078 0.299132 -5.10845 0.0455106 0.314411 -5.67894 -0.438763 0.299132 -5.10845 0.0455106 0.108625 -4.3857 0.00606821 -1.22485 -4.46327 0.430515 -1.34907 -5.19507 0.52674 0.108625 -4.3857 0.00606821 -0.145512 -3.93407 -0.533985 -1.3138 -3.98124 -0.135122 -1.22485 -4.46327 0.430515 -0.145512 -3.93407 -0.533985 -0.31441 -4.01812 -1.25829 -1.5638 -4.03133 -0.838828 -1.3138 -3.98124 -0.135122 -0.31441 -4.01812 -1.25829 -0.29913 -4.58861 -1.74257 -1.82841 -4.58421 -1.26838 -1.5638 -4.03133 -0.838828 -0.29913 -4.58861 -1.74257 -0.108624 -5.31136 -1.70312 -1.95263 -5.31601 -1.17216 -1.82841 -4.58421 -1.26838 -0.108624 -5.31136 -1.70312 0.145513 -5.76299 -1.16307 -1.86368 -5.79804 -0.60652 -1.95263 -5.31601 -1.17216 0.145513 -5.76299 -1.16307 0.314411 -5.67894 -0.438763 -1.61368 -5.74795 0.0971859 -1.86368 -5.79804 -0.60652 0.314411 -5.67894 -0.438763 0.299132 -5.10845 0.0455106 -1.34907 -5.19507 0.52674 -1.61368 -5.74795 0.0971859 -1.34907 -5.19507 0.52674 -1.22485 -4.46327 0.430515 -2.48435 -3.90592 0.932929 -2.8963 -4.50756 1.10186 -1.22485 -4.46327 0.430515 -1.3138 -3.98124 -0.135122 -2.40247 -3.47358 0.327462 -2.48435 -3.90592 0.932929 -1.3138 -3.98124 -0.135122 -1.5638 -4.03133 -0.838828 -2.69861 -3.4638 -0.359864 -2.40247 -3.47358 0.327462 -1.5638 -4.03133 -0.838828 -1.82841 -4.58421 -1.26838 -3.1993 -3.88232 -0.726422 -2.69861 -3.4638 -0.359864 -1.82841 -4.58421 -1.26838 -1.95263 -5.31601 -1.17216 -3.61125 -4.48396 -0.557487 -3.1993 -3.88232 -0.726422 -1.95263 -5.31601 -1.17216 -1.86368 -5.79804 -0.60652 -3.69313 -4.9163 0.0479803 -3.61125 -4.48396 -0.557487 -1.86368 -5.79804 -0.60652 -1.61368 -5.74795 0.0971859 -3.39699 -4.92608 0.735306 -3.69313 -4.9163 0.0479803 -1.61368 -5.74795 0.0971859 -1.34907 -5.19507 0.52674 -2.8963 -4.50756 1.10186 -3.39699 -4.92608 0.735306 -2.8963 -4.50756 1.10186 -2.48435 -3.90592 0.932929 -3.34524 -2.83435 1.40634 -3.95958 -3.18994 1.64375 -2.48435 -3.90592 0.932929 -2.40247 -3.47358 0.327462 -3.12704 -2.52998 0.758304 -3.34524 -2.83435 1.40634 -2.40247 -3.47358 0.327462 -2.69861 -3.4638 -0.359864 -3.43278 -2.45512 0.0792394 -3.12704 -2.52998 0.758304 -2.69861 -3.4638 -0.359864 -3.1993 -3.88232 -0.726422 -4.08338 -2.65362 -0.233062 -3.43278 -2.45512 0.0792394 -3.1993 -3.88232 -0.726422 -3.61125 -4.48396 -0.557487 -4.69772 -3.00921 0.0043401 -4.08338 -2.65362 -0.233062 -3.61125 -4.48396 -0.557487 -3.69313 -4.9163 0.0479803 -4.91592 -3.31358 0.65238 -4.69772 -3.00921 0.0043401 -3.69313 -4.9163 0.0479803 -3.39699 -4.92608 0.735306 -4.61018 -3.38844 1.33144 -4.91592 -3.31358 0.65238 -3.39699 -4.92608 0.735306 -2.8963 -4.50756 1.10186 -3.95958 -3.18994 1.64375 -4.61018 -3.38844 1.33144 -3.95958 -3.18994 1.64375 -3.34524 -2.83435 1.40634 -3.6318 -1.52494 1.75109 -4.32367 -1.56765 2.03342 -3.34524 -2.83435 1.40634 -3.12704 -2.52998 0.758304 -3.34445 -1.41163 1.06933 -3.6318 -1.52494 1.75109 -3.12704 -2.52998 0.758304 -3.43278 -2.45512 0.0792394 -3.62993 -1.2941 0.387497 -3.34445 -1.41163 1.06933 -3.43278 -2.45512 0.0792394 -4.08338 -2.65362 -0.233062 -4.32103 -1.24119 0.105002 -3.62993 -1.2941 0.387497 -4.08338 -2.65362 -0.233062 -4.69772 -3.00921 0.0043401 -5.0129 -1.2839 0.387327 -4.32103 -1.24119 0.105002 -4.69772 -3.00921 0.0043401 -4.91592 -3.31358 0.65238 -5.30025 -1.39721 1.06909 -5.0129 -1.2839 0.387327 -4.91592 -3.31358 0.65238 -4.61018 -3.38844 1.33144 -5.01477 -1.51474 1.75092 -5.30025 -1.39721 1.06909 -4.61018 -3.38844 1.33144 -3.95958 -3.18994 1.64375 -4.32367 -1.56765 2.03342 -5.01477 -1.51474 1.75092 -4.32367 -1.56765 2.03342 -3.6318 -1.52494 1.75109 -3.36153 -0.267629 1.89071 -3.99896 -0.000434571 2.17793 -3.6318 -1.52494 1.75109 -3.34445 -1.41163 1.06933 -3.0981 -0.37805 1.19888 -3.36153 -0.267629 1.89071 -3.34445 -1.41163 1.06933 -3.62993 -1.2941 0.387497 -3.36299 -0.267015 0.507707 -3.0981 -0.37805 1.19888 -3.62993 -1.2941 0.387497 -4.32103 -1.24119 0.105002 -4.00104 0.000433318 0.222073 -3.36299 -0.267015 0.507707 -4.32103 -1.24119 0.105002 -5.0129 -1.2839 0.387327 -4.63847 0.267628 0.509295 -4.00104 0.000433318 0.222073 -5.0129 -1.2839 0.387327 -5.30025 -1.39721 1.06909 -4.9019 0.378049 1.20112 -4.63847 0.267628 0.509295 -5.30025 -1.39721 1.06909 -5.01477 -1.51474 1.75092 -4.63701 0.267014 1.89229 -4.9019 0.378049 1.20112 -5.01477 -1.51474 1.75092 -4.32367 -1.56765 2.03342 -3.99896 -0.000434571 2.17793 -4.63701 0.267014 1.89229 -3.99896 -0.000434571 2.17793 -3.36153 -0.267629 1.89071 -2.69163 0.746882 1.77633 -3.18839 1.24832 2.02534 -3.36153 -0.267629 1.89071 -3.0981 -0.37805 1.19888 -2.54311 0.433386 1.1131 -2.69163 0.746882 1.77633 -3.0981 -0.37805 1.19888 -3.36299 -0.267015 0.507707 -2.82982 0.491474 0.424158 -2.54311 0.433386 1.1131 -3.36299 -0.267015 0.507707 -4.00104 0.000433318 0.222073 -3.38381 0.88712 0.113083 -2.82982 0.491474 0.424158 -4.00104 0.000433318 0.222073 -4.63847 0.267628 0.509295 -3.88057 1.38856 0.362095 -3.38381 0.88712 0.113083 -4.63847 0.267628 0.509295 -4.9019 0.378049 1.20112 -4.02909 1.70205 1.02532 -3.88057 1.38856 0.362095 -4.9019 0.378049 1.20112 -4.63701 0.267014 1.89229 -3.74238 1.64397 1.71426 -4.02909 1.70205 1.02532 -4.63701 0.267014 1.89229 -3.99896 -0.000434571 2.17793 -3.18839 1.24832 2.02534 -3.74238 1.64397 1.71426 -3.18839 1.24832 2.02534 -2.69163 0.746882 1.77633 -1.8423 1.46983 1.40514 -2.20333 2.09676 1.59706 -2.69163 0.746882 1.77633 -2.54311 0.433386 1.1131 -1.83763 1.0249 0.803287 -1.8423 1.46983 1.40514 -2.54311 0.433386 1.1131 -2.82982 0.491474 0.424158 -2.19207 1.02259 0.14406 -1.83763 1.0249 0.803287 -2.82982 0.491474 0.424158 -3.38381 0.88712 0.113083 -2.69799 1.46426 -0.186375 -2.19207 1.02259 0.14406 -3.38381 0.88712 0.113083 -3.88057 1.38856 0.362095 -3.05902 2.09119 0.0055466 -2.69799 1.46426 -0.186375 -3.88057 1.38856 0.362095 -4.02909 1.70205 1.02532 -3.06369 2.53612 0.607399 -3.05902 2.09119 0.0055466 -4.02909 1.70205 1.02532 -3.74238 1.64397 1.71426 -2.70925 2.53843 1.26663 -3.06369 2.53612 0.607399 -3.74238 1.64397 1.71426 -3.18839 1.24832 2.02534 -2.20333 2.09676 1.59706 -2.70925 2.53843 1.26663 -2.20333 2.09676 1.59706 -1.8423 1.46983 1.40514 -1.01372 1.98527 0.866354 -1.30899 2.65549 1.02071 -1.8423 1.46983 1.40514 -1.83763 1.0249 0.803287 -1.0938 1.48605 0.314462 -1.01372 1.98527 0.866354 -1.83763 1.0249 0.803287 -2.19207 1.02259 0.14406 -1.50232 1.45028 -0.311673 -1.0938 1.48605 0.314462 -2.19207 1.02259 0.14406 -2.69799 1.46426 -0.186375 -1.99997 1.89891 -0.645268 -1.50232 1.45028 -0.311673 -2.69799 1.46426 -0.186375 -3.05902 2.09119 0.0055466 -2.29524 2.56913 -0.49091 -1.99997 1.89891 -0.645268 -3.05902 2.09119 0.0055466 -3.06369 2.53612 0.607399 -2.21516 3.06835 0.0609821 -2.29524 2.56913 -0.49091 -3.06369 2.53612 0.607399 -2.70925 2.53843 1.26663 -1.80664 3.10412 0.687117 -2.21516 3.06835 0.0609821 -2.70925 2.53843 1.26663 -2.20333 2.09676 1.59706 -1.30899 2.65549 1.02071 -1.80664 3.10412 0.687117 -1.30899 2.65549 1.02071 -1.01372 1.98527 0.866354 -0.278682 2.40709 0.331668 -0.552041 3.08975 0.471175 -1.01372 1.98527 0.866354 -1.0938 1.48605 0.314462 -0.359558 1.90704 -0.219348 -0.278682 2.40709 0.331668 -1.0938 1.48605 0.314462 -1.50232 1.45028 -0.311673 -0.747291 1.88251 -0.859093 -0.359558 1.90704 -0.219348 -1.50232 1.45028 -0.311673 -1.99997 1.89891 -0.645268 -1.21475 2.34789 -1.21281 -0.747291 1.88251 -0.859093 -1.99997 1.89891 -0.645268 -2.29524 2.56913 -0.49091 -1.48811 3.03055 -1.07331 -1.21475 2.34789 -1.21281 -2.29524 2.56913 -0.49091 -2.21516 3.06835 0.0609821 -1.40724 3.5306 -0.522292 -1.48811 3.03055 -1.07331 -2.21516 3.06835 0.0609821 -1.80664 3.10412 0.687117 -1.0195 3.55513 0.117453 -1.40724 3.5306 -0.522292 -1.80664 3.10412 0.687117 -1.30899 2.65549 1.02071 -0.552041 3.08975 0.471175 -1.0195 3.55513 0.117453 -0.552041 3.08975 0.471175 -0.278682 2.40709 0.331668 0.441229 2.76906 -0.0640377 0.224691 3.47706 0.0458149 -0.278682 2.40709 0.331668 -0.359558 1.90704 -0.219348 0.399301 2.28508 -0.633434 0.441229 2.76906 -0.0640377 -0.359558 1.90704 -0.219348 -0.747291 1.88251 -0.859093 0.123468 2.30861 -1.32883 0.399301 2.28508 -0.633434 -0.747291 1.88251 -0.859093 -1.21475 2.34789 -1.21281 -0.224692 2.82588 -1.74287 0.123468 2.30861 -1.32883 -1.21475 2.34789 -1.21281 -1.48811 3.03055 -1.07331 -0.44123 3.53388 -1.63302 -0.224692 2.82588 -1.74287 -1.48811 3.03055 -1.07331 -1.40724 3.5306 -0.522292 -0.399302 4.01786 -1.06362 -0.44123 3.53388 -1.63302 -1.40724 3.5306 -0.522292 -1.0195 3.55513 0.117453 -0.123469 3.99433 -0.368226 -0.399302 4.01786 -1.06362 -1.0195 3.55513 0.117453 -0.552041 3.08975 0.471175 0.224691 3.47706 0.0458149 -0.123469 3.99433 -0.368226 0.224691 3.47706 0.0458149 0.441229 2.76906 -0.0640377 1.28094 3.0216 -0.277521 1.21738 3.76515 -0.219965 0.441229 2.76906 -0.0640377 0.399301 2.28508 -0.633434 1.25109 2.52991 -0.84105 1.28094 3.0216 -0.277521 0.399301 2.28508 -0.633434 0.123468 2.30861 -1.32883 1.14532 2.57811 -1.58044 1.25109 2.52991 -0.84105 0.123468 2.30861 -1.32883 -0.224692 2.82588 -1.74287 1.02558 3.13795 -2.06258 1.14532 2.57811 -1.58044 -0.224692 2.82588 -1.74287 -0.44123 3.53388 -1.63302 0.962025 3.8815 -2.00502 1.02558 3.13795 -2.06258 -0.44123 3.53388 -1.63302 -0.399302 4.01786 -1.06362 0.991873 4.37319 -1.44149 0.962025 3.8815 -2.00502 -0.399302 4.01786 -1.06362 -0.123469 3.99433 -0.368226 1.09764 4.32499 -0.702097 0.991873 4.37319 -1.44149 -0.123469 3.99433 -0.368226 0.224691 3.47706 0.0458149 1.21738 3.76515 -0.219965 1.09764 4.32499 -0.702097 1.21738 3.76515 -0.219965 1.28094 3.0216 -0.277521 2.30983 3.01577 -0.293692 2.4938 3.74101 -0.273837 1.28094 3.0216 -0.277521 1.25109 2.52991 -0.84105 2.2147 2.50854 -0.835798 2.30983 3.01577 -0.293692 1.25109 2.52991 -0.84105 1.14532 2.57811 -1.58044 2.26412 2.51645 -1.5826 2.2147 2.50854 -0.835798 1.14532 2.57811 -1.58044 1.02558 3.13795 -2.06258 2.42916 3.03487 -2.09662 2.26412 2.51645 -1.5826 1.02558 3.13795 -2.06258 0.962025 3.8815 -2.00502 2.61313 3.76011 -2.07677 2.42916 3.03487 -2.09662 0.962025 3.8815 -2.00502 0.991873 4.37319 -1.44149 2.70826 4.26734 -1.53466 2.61313 3.76011 -2.07677 0.991873 4.37319 -1.44149 1.09764 4.32499 -0.702097 2.65884 4.25943 -0.787864 2.70826 4.26734 -1.53466 1.09764 4.32499 -0.702097 1.21738 3.76515 -0.219965 2.4938 3.74101 -0.273837 2.65884 4.25943 -0.787864 2.4938 3.74101 -0.273837 2.30983 3.01577 -0.293692 3.41078 2.5587 -0.100919 3.86347 3.1542 -0.075158 2.30983 3.01577 -0.293692 2.2147 2.50854 -0.835798 3.19001 2.08448 -0.636257 3.41078 2.5587 -0.100919 2.2147 2.50854 -0.835798 2.26412 2.51645 -1.5826 3.33049 2.00932 -1.36758 3.19001 2.08448 -0.636257 2.26412 2.51645 -1.5826 2.42916 3.03487 -2.09662 3.74993 2.37726 -1.86648 3.33049 2.00932 -1.36758 2.42916 3.03487 -2.09662 2.61313 3.76011 -2.07677 4.20262 2.97276 -1.84072 3.74993 2.37726 -1.86648 2.61313 3.76011 -2.07677 2.70826 4.26734 -1.53466 4.42339 3.44698 -1.30538 4.20262 2.97276 -1.84072 2.70826 4.26734 -1.53466 2.65884 4.25943 -0.787864 4.28291 3.52214 -0.574064 4.42339 3.44698 -1.30538 2.65884 4.25943 -0.787864 2.4938 3.74101 -0.273837 3.86347 3.1542 -0.075158 4.28291 3.52214 -0.574064 3.86347 3.1542 -0.075158 3.41078 2.5587 -0.100919 4.29059 1.58749 0.276467 4.9453 1.94285 0.349222 3.41078 2.5587 -0.100919 3.19001 2.08448 -0.636257 3.94665 1.21982 -0.277369 4.29059 1.58749 0.276467 3.19001 2.08448 -0.636257 3.33049 2.00932 -1.36758 4.11495 1.05521 -0.987856 3.94665 1.21982 -0.277369 3.33049 2.00932 -1.36758 3.74993 2.37726 -1.86648 4.6969 1.19009 -1.4388 4.11495 1.05521 -0.987856 3.74993 2.37726 -1.86648 4.20262 2.97276 -1.84072 5.35161 1.54545 -1.36605 4.6969 1.19009 -1.4388 4.20262 2.97276 -1.84072 4.42339 3.44698 -1.30538 5.69555 1.91312 -0.812209 5.35161 1.54545 -1.36605 4.42339 3.44698 -1.30538 4.28291 3.52214 -0.574064 5.52725 2.07773 -0.101722 5.69555 1.91312 -0.812209 4.28291 3.52214 -0.574064 3.86347 3.1542 -0.075158 4.9453 1.94285 0.349222 5.52725 2.07773 -0.101722 4.9453 1.94285 0.349222 4.29059 1.58749 0.276467 4.63689 0.137701 0.787583 5.34579 0.348913 0.901858 4.29059 1.58749 0.276467 3.94665 1.21982 -0.277369 4.25785 -0.154175 0.211953 4.63689 0.137701 0.787583 3.94665 1.21982 -0.277369 4.11495 1.05521 -0.987856 4.43071 -0.355738 -0.487837 4.25785 -0.154175 0.211953 4.11495 1.05521 -0.987856 4.6969 1.19009 -1.4388 5.05421 -0.348913 -0.901858 4.43071 -0.355738 -0.487837 4.6969 1.19009 -1.4388 5.35161 1.54545 -1.36605 5.76311 -0.137701 -0.787583 5.05421 -0.348913 -0.901858 5.35161 1.54545 -1.36605 5.69555 1.91312 -0.812209 6.14215 0.154175 -0.211953 5.76311 -0.137701 -0.787583 5.69555 1.91312 -0.812209 5.52725 2.07773 -0.101722 5.96929 0.355738 0.487836 6.14215 0.154175 -0.211953 5.52725 2.07773 -0.101722 4.9453 1.94285 0.349222 5.34579 0.348913 0.901858 5.96929 0.355738 0.487836 4 0 1 2 3 4 4 5 6 7 4 8 9 10 11 4 12 13 14 15 4 16 17 18 19 4 20 21 22 23 4 24 25 26 27 4 28 29 30 31 4 32 33 34 35 4 36 37 38 39 4 40 41 42 43 4 44 45 46 47 4 48 49 50 51 4 52 53 54 55 4 56 57 58 59 4 60 61 62 63 4 64 65 66 67 4 68 69 70 71 4 72 73 74 75 4 76 77 78 79 4 80 81 82 83 4 84 85 86 87 4 88 89 90 91 4 92 93 94 95 4 96 97 98 99 4 100 101 102 103 4 104 105 106 107 4 108 109 110 111 4 112 113 114 115 4 116 117 118 119 4 120 121 122 123 4 124 125 126 127 4 128 129 130 131 4 132 133 134 135 4 136 137 138 139 4 140 141 142 143 4 144 145 146 147 4 148 149 150 151 4 152 153 154 155 4 156 157 158 159 4 160 161 162 163 4 164 165 166 167 4 168 169 170 171 4 172 173 174 175 4 176 177 178 179 4 180 181 182 183 4 184 185 186 187 4 188 189 190 191 4 192 193 194 195 4 196 197 198 199 4 200 201 202 203 4 204 205 206 207 4 208 209 210 211 4 212 213 214 215 4 216 217 218 219 4 220 221 222 223 4 224 225 226 227 4 228 229 230 231 4 232 233 234 235 4 236 237 238 239 4 240 241 242 243 4 244 245 246 247 4 248 249 250 251 4 252 253 254 255 4 256 257 258 259 4 260 261 262 263 4 264 265 266 267 4 268 269 270 271 4 272 273 274 275 4 276 277 278 279 4 280 281 282 283 4 284 285 286 287 4 288 289 290 291 4 292 293 294 295 4 296 297 298 299 4 300 301 302 303 4 304 305 306 307 4 308 309 310 311 4 312 313 314 315 4 316 317 318 319 4 320 321 322 323 4 324 325 326 327 4 328 329 330 331 4 332 333 334 335 4 336 337 338 339 4 340 341 342 343 4 344 345 346 347 4 348 349 350 351 4 352 353 354 355 4 356 357 358 359 4 360 361 362 363 4 364 365 366 367 4 368 369 370 371 4 372 373 374 375 4 376 377 378 379 4 380 381 382 383 4 384 385 386 387 4 388 389 390 391 4 392 393 394 395 4 396 397 398 399 4 400 401 402 403 4 404 405 406 407 4 408 409 410 411 4 412 413 414 415 4 416 417 418 419 4 420 421 422 423 4 424 425 426 427 4 428 429 430 431 4 432 433 434 435 4 436 437 438 439 4 440 441 442 443 4 444 445 446 447 4 448 449 450 451 4 452 453 454 455 4 456 457 458 459 4 460 461 462 463 4 464 465 466 467 4 468 469 470 471 4 472 473 474 475 4 476 477 478 479 4 480 481 482 483 4 484 485 486 487 4 488 489 490 491 4 492 493 494 495 4 496 497 498 499 4 500 501 502 503 4 504 505 506 507 4 508 509 510 511 4 512 513 514 515 4 516 517 518 519 4 520 521 522 523 4 524 525 526 527 4 528 529 530 531 4 532 533 534 535 4 536 537 538 539 4 540 541 542 543 4 544 545 546 547 4 548 549 550 551 4 552 553 554 555 4 556 557 558 559 4 560 561 562 563 4 564 565 566 567 4 568 569 570 571 4 572 573 574 575 4 576 577 578 579 4 580 581 582 583 4 584 585 586 587 4 588 589 590 591 4 592 593 594 595 4 596 597 598 599 4 600 601 602 603 4 604 605 606 607 4 608 609 610 611 4 612 613 614 615 4 616 617 618 619 4 620 621 622 623 4 624 625 626 627 4 628 629 630 631 4 632 633 634 635 4 636 637 638 639 4 640 641 642 643 4 644 645 646 647 4 648 649 650 651 4 652 653 654 655 4 656 657 658 659 4 660 661 662 663 4 664 665 666 667 4 668 669 670 671 4 672 673 674 675 4 676 677 678 679 4 680 681 682 683 4 684 685 686 687 4 688 689 690 691 4 692 693 694 695 4 696 697 698 699 4 700 701 702 703 4 704 705 706 707 4 708 709 710 711 4 712 713 714 715 4 716 717 718 719 4 720 721 722 723 4 724 725 726 727 4 728 729 730 731 4 732 733 734 735 4 736 737 738 739 4 740 741 742 743 4 744 745 746 747 4 748 749 750 751 4 752 753 754 755 4 756 757 758 759 4 760 761 762 763 4 764 765 766 767 4 768 769 770 771 4 772 773 774 775 4 776 777 778 779 4 780 781 782 783 4 784 785 786 787 4 788 789 790 791 4 792 793 794 795 4 796 797 798 799 4 800 801 802 803 4 804 805 806 807 4 808 809 810 811 4 812 813 814 815 4 816 817 818 819 4 820 821 822 823 4 824 825 826 827 4 828 829 830 831 4 832 833 834 835 4 836 837 838 839 4 840 841 842 843 4 844 845 846 847 4 848 849 850 851 4 852 853 854 855 4 856 857 858 859 4 860 861 862 863 4 864 865 866 867 4 868 869 870 871 4 872 873 874 875 4 876 877 878 879 4 880 881 882 883 4 884 885 886 887 4 888 889 890 891 4 892 893 894 895 4 896 897 898 899 4 900 901 902 903 4 904 905 906 907 4 908 909 910 911 4 912 913 914 915 4 916 917 918 919 4 920 921 922 923 4 924 925 926 927 4 928 929 930 931 4 932 933 934 935 4 936 937 938 939 4 940 941 942 943 4 944 945 946 947 4 948 949 950 951 4 952 953 954 955 4 956 957 958 959 4 960 961 962 963 4 964 965 966 967 4 968 969 970 971 4 972 973 974 975 4 976 977 978 979 4 980 981 982 983 4 984 985 986 987 4 988 989 990 991 4 992 993 994 995 4 996 997 998 999 4 1000 1001 1002 1003 4 1004 1005 1006 1007 4 1008 1009 1010 1011 4 1012 1013 1014 1015 4 1016 1017 1018 1019 4 1020 1021 1022 1023 4 1024 1025 1026 1027 4 1028 1029 1030 1031 4 1032 1033 1034 1035 4 1036 1037 1038 1039 4 1040 1041 1042 1043 4 1044 1045 1046 1047 4 1048 1049 1050 1051 4 1052 1053 1054 1055 4 1056 1057 1058 1059 4 1060 1061 1062 1063 4 1064 1065 1066 1067 4 1068 1069 1070 1071 4 1072 1073 1074 1075 4 1076 1077 1078 1079 4 1080 1081 1082 1083 4 1084 1085 1086 1087 4 1088 1089 1090 1091 4 1092 1093 1094 1095 4 1096 1097 1098 1099 4 1100 1101 1102 1103 4 1104 1105 1106 1107 4 1108 1109 1110 1111 4 1112 1113 1114 1115 4 1116 1117 1118 1119 4 1120 1121 1122 1123 4 1124 1125 1126 1127 4 1128 1129 1130 1131 4 1132 1133 1134 1135 4 1136 1137 1138 1139 4 1140 1141 1142 1143 4 1144 1145 1146 1147 4 1148 1149 1150 1151 4 1152 1153 1154 1155 4 1156 1157 1158 1159 4 1160 1161 1162 1163 4 1164 1165 1166 1167 4 1168 1169 1170 1171 4 1172 1173 1174 1175 4 1176 1177 1178 1179 4 1180 1181 1182 1183 4 1184 1185 1186 1187 4 1188 1189 1190 1191 4 1192 1193 1194 1195 4 1196 1197 1198 1199 4 1200 1201 1202 1203 4 1204 1205 1206 1207 4 1208 1209 1210 1211 4 1212 1213 1214 1215 4 1216 1217 1218 1219 4 1220 1221 1222 1223 4 1224 1225 1226 1227 4 1228 1229 1230 1231 4 1232 1233 1234 1235 4 1236 1237 1238 1239 4 1240 1241 1242 1243 4 1244 1245 1246 1247 4 1248 1249 1250 1251 4 1252 1253 1254 1255 4 1256 1257 1258 1259 4 1260 1261 1262 1263 4 1264 1265 1266 1267 4 1268 1269 1270 1271 4 1272 1273 1274 1275 4 1276 1277 1278 1279 geomview-1.9.4/data/geom/sph12.mesh0000644000175000001440000002477207730233137013760 00000000000000CNMESH # 1/12th of a sphere. 13 13 1.525731 -0.723607 0.447213 0.525731 -0.723607 0.447213 1 0 0 1 1.586899 -0.658726 0.470776 0.586899 -0.658726 0.470776 1 0 0 1 1.643075 -0.588241 0.490334 0.643075 -0.588241 0.490334 1 0 0 1 1.693780 -0.512753 0.505721 0.693780 -0.512753 0.505721 1 0 0 1 1.738585 -0.432903 0.516806 0.738585 -0.432903 0.516806 1 0 0 1 1.777106 -0.349370 0.523495 0.777106 -0.349370 0.523495 1 0 0 1 1.809017 -0.262866 0.525731 0.809017 -0.262866 0.525731 1 0 0 1 1.834046 -0.174125 0.523495 0.834046 -0.174125 0.523495 1 0 0 1 1.851981 -0.083904 0.516806 0.851981 -0.083904 0.516806 1 0 0 1 1.862669 0.007031 0.505721 0.862669 0.007031 0.505721 1 0 0 1 1.866018 0.097907 0.490334 0.866018 0.097907 0.490334 1 0 0 1 1.862001 0.187949 0.470776 0.862001 0.187949 0.470776 1 0 0 1 1.850651 0.276393 0.447213 0.850651 0.276393 0.447213 1 0 0 1 1.499277 -0.687196 0.527716 0.499277 -0.687196 0.527716 1 0 0 1 1.553453 -0.623532 0.552176 0.553453 -0.623532 0.552176 1 0 0 1 1.603430 -0.555138 0.572446 0.603430 -0.555138 0.572446 1 0 0 1 1.648829 -0.482532 0.588373 0.648829 -0.482532 0.588373 1 0 0 1 1.689306 -0.406266 0.599837 0.689306 -0.406266 0.599837 1 0 0 1 1.724554 -0.326917 0.606751 0.724554 -0.326917 0.606751 1 0 0 1 1.754305 -0.245089 0.609061 0.754305 -0.245089 0.609061 1 0 0 1 1.778334 -0.161401 0.606751 0.778334 -0.161401 0.606751 1 0 0 1 1.796458 -0.076489 0.599837 0.796458 -0.076489 0.599837 1 0 0 1 1.808539 0.009004 0.588373 0.808539 0.009004 0.588373 1 0 0 1 1.814487 0.094428 0.572446 0.814487 0.094428 0.572446 1 0 0 1 1.814256 0.179136 0.552176 0.814256 0.179136 0.552176 1 0 0 1 1.807847 0.262485 0.527716 0.807847 0.262485 0.527716 1 0 0 1 1.468576 -0.644939 0.603730 0.468576 -0.644939 0.603730 1 0 0 1 1.515607 -0.583178 0.627736 0.515607 -0.583178 0.627736 1 0 0 1 1.559235 -0.517566 0.647597 0.559235 -0.517566 0.647597 1 0 0 1 1.599169 -0.448536 0.663183 0.599169 -0.448536 0.663183 1 0 0 1 1.635148 -0.376545 0.674389 0.635148 -0.376545 0.674389 1 0 0 1 1.666933 -0.302068 0.681142 0.666933 -0.302068 0.681142 1 0 0 1 1.694314 -0.225597 0.683399 0.694314 -0.225597 0.683399 1 0 0 1 1.717111 -0.147635 0.681142 0.717111 -0.147635 0.681142 1 0 0 1 1.735173 -0.068699 0.674389 0.735173 -0.068699 0.674389 1 0 0 1 1.748381 0.010690 0.663183 0.748381 0.010690 0.663183 1 0 0 1 1.756648 0.090009 0.647597 0.756648 0.090009 0.647597 1 0 0 1 1.759918 0.168734 0.627736 0.759918 0.168734 0.627736 1 0 0 1 1.758172 0.246345 0.603730 0.758172 0.246345 0.603730 1 0 0 1 1.433888 -0.597197 0.674609 0.433888 -0.597197 0.674609 1 0 0 1 1.473922 -0.538133 0.697001 0.473922 -0.538133 0.697001 1 0 0 1 1.511305 -0.476061 0.715495 0.511305 -0.476061 0.715495 1 0 0 1 1.545829 -0.411326 0.729988 0.545829 -0.411326 0.729988 1 0 0 1 1.577300 -0.344290 0.740398 0.577300 -0.344290 0.740398 1 0 0 1 1.605542 -0.275330 0.746667 0.605542 -0.275330 0.746667 1 0 0 1 1.630398 -0.204829 0.748761 0.630398 -0.204829 0.748761 1 0 0 1 1.651728 -0.133183 0.746667 0.651728 -0.133183 0.746667 1 0 0 1 1.669414 -0.060792 0.740398 0.669414 -0.060792 0.740398 1 0 0 1 1.683356 0.011939 0.729988 0.683356 0.011939 0.729988 1 0 0 1 1.693476 0.084603 0.715495 0.693476 0.084603 0.715495 1 0 0 1 1.699718 0.156794 0.697001 0.699718 0.156794 0.697001 1 0 0 1 1.702047 0.228109 0.674609 0.702047 0.228109 0.674609 1 0 0 1 1.395511 -0.544374 0.739749 0.395511 -0.544374 0.739749 1 0 0 1 1.428920 -0.488877 0.759623 0.428920 -0.488877 0.759623 1 0 0 1 1.460361 -0.431135 0.776009 0.460361 -0.431135 0.776009 1 0 0 1 1.489688 -0.371414 0.788833 0.489688 -0.371414 0.788833 1 0 0 1 1.516767 -0.309988 0.798035 0.516767 -0.309988 0.798035 1 0 0 1 1.541473 -0.247139 0.803573 0.541473 -0.247139 0.803573 1 0 0 1 1.563693 -0.183155 0.805422 0.563693 -0.183155 0.805422 1 0 0 1 1.583325 -0.118330 0.803573 0.583325 -0.118330 0.803573 1 0 0 1 1.600280 -0.052962 0.798035 0.600280 -0.052962 0.798035 1 0 0 1 1.614478 0.012649 0.788833 0.614478 0.012649 0.788833 1 0 0 1 1.625855 0.078202 0.776009 0.625855 0.078202 0.776009 1 0 0 1 1.634359 0.143396 0.759623 0.634359 0.143396 0.759623 1 0 0 1 1.639950 0.207932 0.739749 0.639950 0.207932 0.739749 1 0 0 1 1.353768 -0.486921 0.798596 0.353768 -0.486921 0.798596 1 0 0 1 1.381084 -0.435887 0.815339 0.381084 -0.435887 0.815339 1 0 0 1 1.407016 -0.383270 0.829121 0.407016 -0.383270 0.829121 1 0 0 1 1.431470 -0.329262 0.839893 0.431470 -0.329262 0.839893 1 0 0 1 1.454357 -0.274058 0.847615 0.454357 -0.274058 0.847615 1 0 0 1 1.475595 -0.217860 0.852260 0.475595 -0.217860 0.852260 1 0 0 1 1.495106 -0.160870 0.853810 0.495106 -0.160870 0.853810 1 0 0 1 1.512819 -0.103296 0.852260 0.512819 -0.103296 0.852260 1 0 0 1 1.528670 -0.045347 0.847615 0.528670 -0.045347 0.847615 1 0 0 1 1.542602 0.012767 0.839893 0.542602 0.012767 0.839893 1 0 0 1 1.554563 0.070834 0.829121 0.554563 0.070834 0.829121 1 0 0 1 1.564511 0.128644 0.815339 0.564511 0.128644 0.815339 1 0 0 1 1.572410 0.185987 0.798596 0.572410 0.185987 0.798596 1 0 0 1 1.309017 -0.425326 0.850651 0.309017 -0.425326 0.850651 1 0 0 1 1.330853 -0.379639 0.863950 0.330853 -0.379639 0.863950 1 0 0 1 1.351783 -0.332913 0.874882 0.351783 -0.332913 0.874882 1 0 0 1 1.371748 -0.285273 0.883415 0.371748 -0.285273 0.883415 1 0 0 1 1.390694 -0.236852 0.889527 0.390694 -0.236852 0.889527 1 0 0 1 1.408570 -0.187782 0.893201 0.408570 -0.187782 0.893201 1 0 0 1 1.425325 -0.138197 0.894427 0.425325 -0.138197 0.894427 1 0 0 1 1.440915 -0.088233 0.893201 0.440915 -0.088233 0.893201 1 0 0 1 1.455297 -0.038027 0.889527 0.455297 -0.038027 0.889527 1 0 0 1 1.468430 0.012283 0.883415 0.468430 0.012283 0.883415 1 0 0 1 1.480279 0.062559 0.874882 0.480279 0.062559 0.874882 1 0 0 1 1.490812 0.112664 0.863950 0.490812 0.112664 0.863950 1 0 0 1 1.500000 0.162460 0.850651 0.500000 0.162460 0.850651 1 0 0 1 1.261637 -0.360112 0.895469 0.261637 -0.360112 0.895469 1 0 0 1 1.278632 -0.320607 0.905304 0.278632 -0.320607 0.905304 1 0 0 1 1.295084 -0.280478 0.913377 0.295084 -0.280478 0.913377 1 0 0 1 1.310962 -0.239802 0.919672 0.310962 -0.239802 0.919672 1 0 0 1 1.326235 -0.198660 0.924178 0.326235 -0.198660 0.924178 1 0 0 1 1.340873 -0.157132 0.926885 0.340873 -0.157132 0.926885 1 0 0 1 1.354848 -0.115297 0.927787 0.354848 -0.115297 0.927787 1 0 0 1 1.368132 -0.073238 0.926885 0.368132 -0.073238 0.926885 1 0 0 1 1.380699 -0.031037 0.924178 0.380699 -0.031037 0.924178 1 0 0 1 1.392526 0.011225 0.919672 0.392526 0.011225 0.919672 1 0 0 1 1.403589 0.053465 0.913377 0.403589 0.053465 0.913377 1 0 0 1 1.413866 0.095601 0.905304 0.413866 0.095601 0.905304 1 0 0 1 1.423338 0.137551 0.895469 0.423338 0.137551 0.895469 1 0 0 1 1.212031 -0.291836 0.932671 0.212031 -0.291836 0.932671 1 0 0 1 1.224792 -0.259259 0.939283 0.224792 -0.259259 0.939283 1 0 0 1 1.237268 -0.226353 0.944706 0.237268 -0.226353 0.944706 1 0 0 1 1.249443 -0.193159 0.948930 0.249443 -0.193159 0.948930 1 0 0 1 1.261301 -0.159721 0.951951 0.261301 -0.159721 0.951951 1 0 0 1 1.272829 -0.126081 0.953765 0.272829 -0.126081 0.953765 1 0 0 1 1.284010 -0.092281 0.954370 0.284010 -0.092281 0.954370 1 0 0 1 1.294832 -0.058363 0.953765 0.294832 -0.058363 0.953765 1 0 0 1 1.305279 -0.024372 0.951951 0.305279 -0.024372 0.951951 1 0 0 1 1.315340 0.009650 0.948930 0.315340 0.009650 0.948930 1 0 0 1 1.325000 0.043660 0.944706 0.325000 0.043660 0.944706 1 0 0 1 1.334249 0.077615 0.939283 0.334249 0.077615 0.939283 1 0 0 1 1.343074 0.111471 0.932671 0.343074 0.111471 0.932671 1 0 0 1 1.160622 -0.221077 0.961938 0.160622 -0.221077 0.961938 1 0 0 1 1.169683 -0.196060 0.965799 0.169683 -0.196060 0.965799 1 0 0 1 1.178622 -0.170902 0.968962 0.178622 -0.170902 0.968962 1 0 0 1 1.187432 -0.145620 0.971424 0.187432 -0.145620 0.971424 1 0 0 1 1.196106 -0.120232 0.973184 0.196106 -0.120232 0.973184 1 0 0 1 1.204638 -0.094758 0.974240 0.204638 -0.094758 0.974240 1 0 0 1 1.213023 -0.069215 0.974592 0.213023 -0.069215 0.974592 1 0 0 1 1.221253 -0.043623 0.974240 0.221253 -0.043623 0.974240 1 0 0 1 1.229324 -0.017998 0.973184 0.229324 -0.017998 0.973184 1 0 0 1 1.237229 0.007639 0.971424 0.237229 0.007639 0.971424 1 0 0 1 1.244962 0.033271 0.968962 0.244962 0.033271 0.968962 1 0 0 1 1.252518 0.058879 0.965799 0.252518 0.058879 0.965799 1 0 0 1 1.259892 0.084444 0.961938 0.259892 0.084444 0.961938 1 0 0 1 1.107846 -0.148438 0.983024 0.107846 -0.148438 0.983024 1 0 0 1 1.113637 -0.131476 0.984785 0.113637 -0.131476 0.984785 1 0 0 1 1.119391 -0.114472 0.986226 0.119391 -0.114472 0.986226 1 0 0 1 1.125106 -0.097431 0.987348 0.125106 -0.097431 0.987348 1 0 0 1 1.130781 -0.080358 0.988149 0.130781 -0.080358 0.988149 1 0 0 1 1.136413 -0.063259 0.988630 0.136413 -0.063259 0.988630 1 0 0 1 1.142001 -0.046139 0.988791 0.142001 -0.046139 0.988791 1 0 0 1 1.147543 -0.029004 0.988630 0.147543 -0.029004 0.988630 1 0 0 1 1.153037 -0.011860 0.988149 0.153037 -0.011860 0.988149 1 0 0 1 1.158481 0.005287 0.987348 0.158481 0.005287 0.987348 1 0 0 1 1.163874 0.022433 0.986226 0.163874 0.022433 0.986226 1 0 0 1 1.169214 0.039572 0.984785 0.169214 0.039572 0.984785 1 0 0 1 1.174499 0.056698 0.983024 0.174499 0.056698 0.983024 1 0 0 1 1.054154 -0.074536 0.995747 0.054154 -0.074536 0.995747 1 0 0 1 1.056972 -0.065969 0.996194 0.056972 -0.065969 0.996194 1 0 0 1 1.059787 -0.057396 0.996560 0.059787 -0.057396 0.996560 1 0 0 1 1.062596 -0.048819 0.996844 0.062596 -0.048819 0.996844 1 0 0 1 1.065400 -0.040238 0.997048 0.065400 -0.040238 0.997048 1 0 0 1 1.068199 -0.031654 0.997169 0.068199 -0.031654 0.997169 1 0 0 1 1.070992 -0.023067 0.997210 0.070992 -0.023067 0.997210 1 0 0 1 1.073780 -0.014478 0.997169 0.073780 -0.014478 0.997169 1 0 0 1 1.076561 -0.005888 0.997048 0.076561 -0.005888 0.997048 1 0 0 1 1.079336 0.002703 0.996844 0.079336 0.002703 0.996844 1 0 0 1 1.082105 0.011293 0.996560 0.082105 0.011293 0.996560 1 0 0 1 1.084867 0.019882 0.996194 0.084867 0.019882 0.996194 1 0 0 1 1.087622 0.028470 0.995747 0.087622 0.028470 0.995747 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 1.000000 0.000000 1.000000 0.000000 0.000000 1.000000 1 0 0 1 } geomview-1.9.4/data/geom/unitcube.off0000644000175000001440000000043507730233146014445 00000000000000OFF 8 6 12 0 0 0 # 0 1 0 0 # 1 1 1 0 # 2 0 1 0 # 3 0 0 1 # 4 1 0 1 # 5 1 1 1 # 6 0 1 1 # 7 4 0 1 2 3 0.800 0.098 0.098 4 4 5 6 7 0.098 0.647 0.400 4 2 3 7 6 0.098 0.098 0.800 4 0 1 5 4 0.898 0.600 0.000 4 0 4 7 3 0.000 0.600 0.800 4 1 2 6 5 0.498 0.000 0.898 geomview-1.9.4/data/geom/br4fd.grp0000644000175000001440000000640307730233101013636 00000000000000# first group is generated by mirrors in axial planes: an 8-group GROUP 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 # gen a -1.61803 1.61803 0 -2.05817 -1.61803 0 0 -1.27202 0 0 1. 0 2.05817 -1.27202 0 2.61803 # gen d -1.61803 1.61803 0 2.05817 -1.61803 0 0 1.27202 0 0 1. 0 -2.05817 1.27202 0 2.61803 # gen b 1. 0 0 0 0 -1.61803 1.61803 -2.05817 0 -1.61803 0 -1.27202 0 2.05817 -1.27202 2.61803 # gen e 1. 0 0 0 0 -1.61803 1.61803 2.05817 0 -1.61803 0 1.27202 0 -2.05817 1.27202 2.61803 # gen c 0 0 -1.61803 -1.27202 0 1. 0 0 1.61803 0 -1.61803 -2.05817 -1.27202 0 2.05817 2.61803 # gen f 0 0 -1.61803 1.27202 0 1. 0 0 1.61803 0 -1.61803 2.05817 1.27202 0 -2.05817 2.61803 # gen A -1.61803 -1.61803 0 -2.05817 1.61803 0 0 1.27202 0 0 1. 0 2.05817 1.27202 0 2.61803 # gen D -1.61803 -1.61803 0 2.05817 1.61803 0 0 -1.27202 0 0 1. 0 -2.05817 -1.27202 0 2.61803 # gen B 1. 0 0 0 0 -1.61803 -1.61803 -2.05817 0 1.61803 0 1.27202 0 2.05817 1.27202 2.61803 # gen E 1. 0 0 0 0 -1.61803 -1.61803 2.05817 0 1.61803 0 -1.27202 0 -2.05817 -1.27202 2.61803 # gen C 0 0 1.61803 1.27202 0 1. 0 0 -1.61803 0 -1.61803 -2.05817 1.27202 0 2.05817 2.61803 # gen F 0 0 1.61803 -1.27202 0 1. 0 0 -1.61803 0 -1.61803 2.05817 -1.27202 0 -2.05817 2.61803 unit { = GROUP 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 unit { = GROUP # 3-fold rotation around corner of cube: permute axes 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 unit { = OFF 10 3 0 0.7579059138615393 0 0 0.76651332039993 0.03177568660262966 0 0.761643475234047 0 0.3154303394649576 0.7690740946291093 0.02763226360843495 0.3108379510433509 0.7861517593139627 0 0.2661280023229838 0.7738976242448507 -0.01982764615896841 0.2833485453167403 0.769074105124659 -0.02763227943718742 0.3108379445592113 0.4753137794988412 0.502946214098463 0.4582362038235173 0.4584672578570311 0.4905491851102674 0.478294998570738 0.4582361416623694 0.4753138842983664 0.502946150726337 4 0 1 3 2 4 4 5 8 7 4 5 6 9 8 } } } geomview-1.9.4/data/geom/diamond0000644000175000001440000000063507730233107013470 00000000000000{ = OFF 8 6 12 -2.39634e-09 5.55112e-17 -0.00781639 -2.39634e-09 0 0.107816 -0.5 -0.288675 -0.00781641 -0.5 -0.288675 0.107816 0.5 -0.288675 -0.00781641 0.5 -0.288675 0.107816 -5.09434e-09 -0.57735 -0.00781642 -5.09434e-09 -0.57735 0.107816 4 4 5 7 6 0.800 0.098 0.098 4 0 1 5 4 0.098 0.647 0.400 4 2 0 4 6 0.098 0.098 0.800 4 3 7 5 1 0.098 0.098 0.800 4 2 3 1 0 0.098 0.647 0.400 4 7 3 2 6 0.800 0.098 0.098 } geomview-1.9.4/data/geom/triangle0000644000175000001440000000046407730233145013664 00000000000000{ = OFF 6 5 9 0.5 -0.5 -6.93889e-18 -0.5 -0.5 -3.46945e-17 4.16334e-17 -5.55112e-17 -5.55112e-17 0.5 -0.5 0.346901 2.95038e-17 -3.12521e-17 0.346901 -0.5 -0.5 0.346901 3 3 4 5 0.800 0.098 0.098 4 2 4 3 0 0.098 0.647 0.400 3 1 2 0 0.098 0.098 0.800 4 4 2 1 5 0.098 0.647 0.400 4 0 3 5 1 0.898 0.600 0.000 } geomview-1.9.4/data/geom/csquare.quad0000644000175000001440000000010707730233105014441 00000000000000CQUAD -1 -1 0 1 0 0 1 1 -1 0 0 1 0 1 1 1 0 0 1 0 1 -1 1 0 1 0 0 1 geomview-1.9.4/data/geom/tent.mesh0000644000175000001440000000024607730233142013757 00000000000000CMESH 3 3 0 0 0 1 0 0 1 1 0 1 0 1 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 2 1 0 0 0 1 1 0 2 0 1 0 0 1 1 2 1 0 1 0 1 2 2 0 0 0 1 1 geomview-1.9.4/data/geom/twosidedsquare.quad0000644000175000001440000000044107730233145016046 00000000000000#example of two sided surface #should be viewed with backface culling CQUAD -1 -1 0 1 0 0 1 1 -1 0 1 0 0 1 1 1 0 1 0 0 1 -1 1 0 1 0 0 1 #same points, with orientation reversed (clockwise instead of counterclockwise) -1 -1 0 0 1 0 1 -1 1 0 0 1 0 1 1 1 0 0 1 0 1 1 -1 0 0 1 0 1 geomview-1.9.4/data/geom/br4.20000644000175000001440000005025407730233101012700 00000000000000 LIST { = GROUP 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 4.236044 3.236073 4.116320 6.660357 3.235988 4.236019 4.116247 6.660248 4.116301 4.116336 6.236025 8.472079 6.660302 6.660353 8.472052 12.708088 -2.617999 -2.272019 -0.272003 -3.330168 -2.272008 -0.618038 -0.786144 -2.272018 -0.272028 -0.786152 -0.999997 -0.831882 3.330156 2.272020 0.831867 4.236049 2.618007 5.508067 4.388304 7.446465 -2.272011 -3.162078 -4.022202 -5.508070 -0.272013 1.213862 1.544039 1.712165 3.330163 6.388349 6.067897 9.472075 0.000000 -0.999998 -1.272012 -1.272010 5.116331 2.544046 6.912269 8.912268 -1.964029 -1.559860 -1.544020 -2.770302 5.388344 2.984180 7.126113 9.472123 0.000000 -0.999998 -1.272012 -1.272010 -3.116338 -2.544059 -2.795927 -4.795938 4.508048 5.676205 3.544003 8.006355 5.388326 6.220252 4.582050 9.472104 0.000000 -0.999998 -1.272012 -1.272010 -1.000000 -3.572320 -0.867825 -3.676210 -1.272012 -0.867820 -0.663762 -1.345997 1.272012 3.676218 1.346000 4.236064 0.000000 -0.999998 -1.272012 -1.272010 -0.999997 -0.427698 -0.103902 -0.440135 -1.272013 -0.103898 -3.808371 -3.890051 1.272011 0.440132 3.890051 4.236062 2.618016 2.964040 6.388338 7.446500 0.272012 1.925997 2.449896 2.964024 -2.272008 -2.786151 -3.544029 -4.948209 3.330168 4.388352 7.640223 9.472095 -2.618012 0.272012 -2.272033 -3.330192 0.272026 -0.618037 -0.786136 -0.272001 -2.272007 -0.786154 -1.000003 -2.404184 3.330165 0.272025 2.404194 4.236067 -4.236044 -3.236073 -4.116320 -6.660357 3.236055 2.236084 1.572307 4.116349 4.116380 1.572353 3.000040 5.236146 6.660381 4.116380 5.236080 9.472168 -1.000000 -0.000004 -0.000007 -0.000006 0.000004 -0.999992 -2.544026 -2.544023 0.000010 -2.544028 -2.236040 -3.236036 -0.000011 2.544025 3.236036 4.236032 4.236044 3.235988 4.116301 -6.660302 3.236073 4.236019 4.116336 -6.660353 4.116320 4.116247 6.236025 -8.472052 -6.660357 -6.660248 -8.472079 12.708088 2.618031 2.963989 6.388348 -7.446500 0.272032 1.926005 2.449948 -2.964076 -2.272021 -2.786110 -3.544030 4.948198 -3.330190 -4.388296 -7.640247 9.472105 -2.618007 0.272061 -2.271986 3.330141 0.272020 -0.618034 -0.786155 0.272021 -2.272023 -0.786121 -0.999990 2.404168 -3.330172 -0.271973 -2.404150 4.236019 0.000000 -0.999993 -1.272025 1.272019 -1.000012 -3.572304 -0.867851 3.676214 -1.272023 -0.867825 -0.663762 1.346010 -1.272032 -3.676202 -1.346029 4.236074 0.000000 -0.999993 -1.272025 1.272019 -0.999997 -0.427687 -0.103886 0.440116 -1.272015 -0.103871 -3.808358 3.890039 -1.272012 -0.440105 -3.890043 4.236052 0.000000 -0.999993 -1.272025 1.272020 5.116311 2.543937 6.912225 -8.912189 -1.964071 -1.559846 -1.544063 2.770348 -5.388341 -2.984078 -7.126082 9.472063 0.000000 -0.999993 -1.272025 1.272019 -3.116346 -2.543999 -2.795922 4.795907 4.508118 5.676173 3.544054 -8.006397 -5.388390 -6.220198 -4.582090 9.472125 -2.618054 -2.272011 -0.272022 3.330191 -2.272021 -0.618012 -0.786138 2.272001 -0.272015 -0.786138 -1.000003 0.831875 -3.330207 -2.272001 -0.831875 4.236057 2.618018 5.508010 4.388318 -7.446449 -2.272020 -3.162049 -4.022220 5.508078 -0.272028 1.213837 1.544030 -1.712140 -3.330179 -6.388280 -6.067918 9.472061 -1.000000 0.000007 0.000010 -0.000009 0.000013 -0.999974 -2.544025 2.544015 0.000009 -2.544033 -2.236094 3.236081 0.000009 -2.544022 -3.236081 4.236068 -4.236055 -3.235998 -4.116312 6.660321 3.236075 2.236038 1.572294 -4.116322 4.116332 1.572247 2.999970 -5.236019 -6.660372 -4.116253 -5.236030 9.472063 2.618031 0.272032 -2.272021 3.330190 2.963989 1.926005 -2.786110 4.388296 6.388348 2.449948 -3.544030 7.640247 7.446500 2.964076 -4.948198 9.472105 4.236020 4.116331 -3.236044 6.660333 -4.116338 -2.236086 2.544038 -5.236072 3.236065 2.544057 -1.000002 4.116352 6.660347 5.236076 -4.116323 9.472108 -1.618031 -1.272026 0.999996 -2.058171 8.624448 1.618065 -2.890058 9.184317 -0.119716 0.346013 0.999997 -0.366131 8.718570 1.831914 -3.058173 9.472159 -1.618031 -1.272026 0.999996 -2.058171 -1.272026 -0.045745 1.653995 -1.831896 0.999997 1.653996 -2.572300 3.058174 2.058172 1.831897 -3.058173 4.236076 -1.618031 -1.272026 0.999996 -2.058171 -1.271997 -3.190330 0.890057 -3.404172 0.999993 0.890066 0.572303 1.058175 2.058151 3.404185 -1.058171 4.236058 -1.618031 -1.272026 0.999996 -2.058171 2.152287 1.618037 0.346019 2.523908 -8.352424 -2.890084 0.999993 -8.838301 8.718563 3.404215 -1.058162 9.472156 9.472139 4.116378 -3.236056 10.776736 4.116328 3.000010 -1.572291 5.236060 -3.236082 -1.572323 2.236068 -4.116361 10.776725 5.236108 -4.116329 12.708218 -4.236081 -0.000018 0.000014 -4.116356 0.000016 -0.236076 0.971735 0.000012 -0.000013 0.971735 0.236076 -0.000010 4.116356 0.000015 -0.000012 4.236081 -2.618031 -0.272032 2.272021 -3.330190 -0.272006 -0.618028 -0.786166 0.272035 2.272045 -0.786144 -1.000032 2.404221 3.330215 -0.272003 -2.404211 4.236100 2.618011 2.272015 0.272027 3.330170 -5.508077 -3.162086 1.213837 -6.388357 -4.388333 -4.022221 1.544023 -6.067927 7.446496 5.508092 -1.712135 9.472106 2.618007 -2.272011 -0.272013 -3.330163 5.508067 -3.162078 1.213862 -6.388349 4.388304 -4.022202 1.544039 -6.067897 -7.446465 5.508070 -1.712165 9.472075 4.236020 -4.116338 3.236065 -6.660347 4.116331 -2.236086 2.544057 -5.236076 -3.236044 2.544038 -1.000002 4.116323 -6.660333 5.236072 -4.116352 9.472108 -1.618022 1.272020 -1.000004 2.058164 -8.624422 1.618049 -2.890086 9.184299 0.119704 0.346019 0.999993 -0.366122 -8.718543 1.831897 -3.058201 9.472140 -1.618022 1.272020 -1.000004 2.058164 1.272008 -0.045736 1.653994 -1.831883 -0.999972 1.653983 -2.572295 3.058153 -2.058141 1.831881 -3.058170 4.236052 -1.618022 1.272020 -1.000004 2.058165 1.271992 -3.190327 0.890061 -3.404168 -1.000001 0.890070 0.572296 1.058182 -2.058146 3.404181 -1.058178 4.236054 -1.618022 1.272020 -1.000004 2.058164 -2.152294 1.618040 0.346007 2.523915 8.352421 -2.890080 1.000028 -8.838300 -8.718561 3.404211 -1.058200 9.472156 -4.236081 0.000014 -0.000011 4.116355 -0.000010 -0.236064 0.971737 0.000006 0.000008 0.971737 0.236064 -0.000005 -4.116356 0.000012 -0.000010 4.236081 9.472050 -4.116313 3.236070 -10.776637 -4.116356 3.000013 -1.572325 5.236094 3.236039 -1.572294 2.236070 -4.116317 -10.776644 5.236050 -4.116354 12.708133 2.618007 -0.272020 2.272023 -3.330172 -2.964008 1.925992 -2.786153 4.388329 -6.388363 2.449933 -3.544093 7.640285 -7.446501 2.964054 -4.948261 9.472132 -2.618019 2.272017 0.272013 3.330177 2.272031 -0.618043 -0.786143 -2.272031 0.272024 -0.786153 -0.999999 -0.831885 -3.330192 2.272027 0.831870 4.236070 0.000000 5.116331 -1.964029 -5.388344 -0.999998 2.544046 -1.559860 -2.984180 -1.272012 6.912269 -1.544020 -7.126113 1.272010 -8.912268 2.770302 9.472123 -1.618031 8.624448 -0.119716 -8.718570 -1.272026 1.618065 0.346013 -1.831914 0.999996 -2.890058 0.999997 3.058173 2.058171 -9.184317 0.366131 9.472159 -1.618022 -8.624422 0.119704 8.718543 1.272020 1.618049 0.346019 -1.831897 -1.000004 -2.890086 0.999993 3.058201 -2.058164 -9.184299 0.366122 9.472140 1.000000 0.000000 0.000000 0.000000 0.000000 1.000032 1.119731 -1.119759 0.000000 -9.352438 -1.000013 9.352439 0.000000 -9.352442 -1.119742 9.472169 1.000000 0.000000 0.000000 0.000000 0.000000 12.560243 -1.307936 -12.588503 0.000000 -1.308035 1.147992 1.424374 0.000000 -12.588513 1.424284 12.708235 1.000000 0.000000 0.000000 0.000000 0.000000 -3.000013 1.572299 3.236078 0.000000 1.572326 -2.236074 -2.544060 0.000000 -3.236092 2.544042 4.236088 -1.618035 -1.272032 1.000004 2.058181 -1.272018 -3.190345 0.890049 3.404191 1.000003 0.890054 0.572301 -1.058173 -2.058172 -3.404198 1.058171 4.236078 -1.618014 1.271980 -0.999990 -2.058126 1.272025 -3.190328 0.890049 3.404178 -0.999996 0.890034 0.572306 -1.058153 2.058156 -3.404158 1.058160 4.236036 0.000000 1.000012 1.272023 -1.272032 0.999993 -3.572304 -0.867846 3.676207 1.272025 -0.867869 -0.663786 1.346052 1.272019 -3.676232 -1.346034 4.236098 0.000000 -5.116342 1.964034 5.388357 0.999998 2.544048 -1.559860 -2.984182 1.272016 6.912281 -1.544025 -7.126126 -1.272015 -8.912283 2.770309 9.472139 0.000000 -3.116338 4.508048 -5.388326 -0.999998 -2.544059 5.676205 -6.220252 -1.272012 -2.795927 3.544003 -4.582050 1.272010 4.795938 -8.006355 9.472104 1.000000 0.000000 0.000000 0.000000 0.000000 1.000032 -9.352438 9.352442 0.000000 1.119731 -1.000013 1.119742 0.000000 1.119759 -9.352439 9.472169 1.000000 0.000000 0.000000 0.000000 0.000000 -2.999986 1.572267 -3.236038 0.000000 1.572322 -2.236064 2.544047 0.000000 3.236065 -2.544014 4.236050 1.000000 0.000000 0.000000 0.000000 0.000000 2.384071 -3.780106 4.355801 0.000000 -3.780160 11.324184 -11.896502 0.000000 4.355847 -11.896485 12.708255 -1.618035 2.152331 -8.352434 8.718584 -1.272018 1.618044 -2.890051 3.404188 1.000003 0.346006 1.000018 -1.058188 -2.058172 2.523949 -8.838302 9.472168 -1.618014 -2.152306 8.352391 -8.718534 1.272025 1.618046 -2.890083 3.404218 -0.999996 0.346016 1.000004 -1.058171 2.058156 2.523929 -8.838270 9.472130 0.000000 0.999997 1.272015 -1.272012 0.999993 -0.427705 -0.103897 0.440128 1.272025 -0.103904 -3.808382 3.890067 1.272019 -0.440135 -3.890063 4.236076 0.000000 3.116347 -4.508065 5.388346 0.999998 -2.544060 5.676209 -6.220256 1.272016 -2.795937 3.544023 -4.582073 -1.272015 4.795949 -8.006377 9.472129 0.000000 5.116311 -1.964071 5.388341 -0.999993 2.543937 -1.559846 2.984078 -1.272025 6.912225 -1.544063 7.126082 -1.272020 8.912189 -2.770348 9.472063 1.000000 0.000000 0.000000 0.000000 0.000000 12.560243 -1.308035 12.588513 0.000000 -1.307936 1.147992 -1.424284 0.000000 12.588503 -1.424374 12.708235 1.000000 0.000000 0.000000 0.000000 0.000000 1.000018 1.119723 1.119739 0.000000 -9.352461 -0.999961 -9.352457 0.000000 9.352463 1.119688 9.472184 -1.618035 8.624450 -0.119761 8.718573 -1.272018 1.618037 0.346010 1.831884 1.000003 -2.890057 1.000011 -3.058178 -2.058172 9.184314 -0.366179 9.472158 -1.618014 -8.624428 0.119766 -8.718547 1.272025 1.618081 0.346007 1.831926 -0.999996 -2.890050 1.000013 -3.058170 2.058157 9.184298 -0.366183 9.472139 0.000000 -5.116311 1.964071 -5.388341 0.999993 2.544026 -1.559877 2.984170 1.272025 6.912321 -1.544100 7.126182 1.272020 8.912285 -2.770384 9.472163 0.000000 1.000010 1.272015 1.272023 0.999999 -3.572323 -0.867820 -3.676221 1.272016 -0.867837 -0.663765 -1.346013 -1.272015 3.676223 1.346001 4.236078 0.000000 -3.116346 4.508118 5.388390 -0.999993 -2.543999 5.676173 6.220198 -1.272025 -2.795922 3.544054 4.582090 -1.272019 -4.795907 8.006397 9.472125 -1.618031 2.152287 -8.352424 -8.718563 -1.272026 1.618037 -2.890084 -3.404215 0.999996 0.346019 0.999993 1.058162 2.058171 -2.523908 8.838301 9.472156 -1.618022 -2.152294 8.352421 8.718561 1.272020 1.618040 -2.890080 -3.404211 -1.000004 0.346007 1.000028 1.058200 -2.058164 -2.523915 8.838300 9.472156 1.000000 0.000000 0.000000 0.000000 0.000000 2.384071 -3.780160 -4.355847 0.000000 -3.780106 11.324184 11.896485 0.000000 -4.355801 11.896502 12.708255 1.000000 0.000000 0.000000 0.000000 0.000000 1.000018 -9.352461 -9.352463 0.000000 1.119723 -0.999961 -1.119688 0.000000 -1.119739 9.352457 9.472184 -1.618035 -1.272018 1.000003 2.058172 -1.272018 -0.045729 1.653987 1.831882 1.000003 1.653986 -2.572309 -3.058178 -2.058172 -1.831882 3.058178 4.236073 -1.618014 1.272017 -0.999975 -2.058142 1.272025 -0.045737 1.653979 1.831881 -0.999996 1.653987 -2.572299 -3.058167 2.058156 -1.831882 3.058157 4.236051 0.000000 3.116346 -4.508118 -5.388390 0.999993 -2.544048 5.676232 6.220272 1.272025 -2.795980 3.544138 4.582191 1.272019 -4.795965 8.006481 9.472226 0.000000 0.999999 1.272015 1.272014 0.999998 -0.427698 -0.103900 -0.440134 1.272016 -0.103903 -3.808373 -3.890055 -1.272015 0.440136 3.890055 4.236067 2.618016 0.272012 -2.272008 -3.330168 2.964040 1.925997 -2.786151 -4.388352 6.388338 2.449896 -3.544029 -7.640223 -7.446500 -2.964024 4.948209 9.472095 9.472139 4.116328 -3.236082 -10.776725 4.116378 3.000010 -1.572323 -5.236108 -3.236056 -1.572291 2.236068 4.116329 -10.776736 -5.236060 4.116361 12.708218 -1.618035 -1.272018 1.000003 2.058172 2.152331 1.618044 0.346006 -2.523949 -8.352434 -2.890051 1.000018 8.838302 -8.718584 -3.404188 1.058188 9.472168 -1.618035 -1.272018 1.000003 2.058172 8.624450 1.618037 -2.890057 -9.184314 -0.119761 0.346010 1.000011 0.366179 -8.718573 -1.831884 3.058178 9.472158 4.236006 4.116304 -3.236038 -6.660304 -4.116344 -2.236078 2.544051 5.236079 3.236054 2.544031 -0.999997 -4.116326 -6.660337 -5.236038 4.116325 9.472081 2.618054 2.272021 0.272015 -3.330207 -5.508090 -3.162067 1.213847 6.388361 -4.388431 -4.022258 1.544048 6.068028 -7.446584 -5.508107 1.712166 9.472189 -2.618022 -0.272014 2.272014 3.330177 -0.272022 -0.618033 -0.786151 -0.272019 2.272019 -0.786151 -1.000001 -2.404186 -3.330187 0.272020 2.404185 4.236066 2.618018 -2.272020 -0.272028 3.330179 5.508010 -3.162049 1.213837 6.388280 4.388318 -4.022220 1.544030 6.067918 7.446449 -5.508078 1.712140 9.472061 9.472050 -4.116356 3.236039 10.776644 -4.116313 3.000013 -1.572294 -5.236050 3.236070 -1.572325 2.236070 4.116354 10.776637 -5.236094 4.116317 12.708133 -1.618014 1.272025 -0.999996 -2.058156 -2.152306 1.618046 0.346016 -2.523929 8.352391 -2.890083 1.000004 8.838270 8.718534 -3.404218 1.058171 9.472130 -1.618014 1.272025 -0.999996 -2.058157 -8.624428 1.618081 -2.890050 -9.184298 0.119766 0.346007 1.000013 0.366183 8.718547 -1.831926 3.058170 9.472139 4.236006 -4.116344 3.236054 6.660337 4.116304 -2.236078 2.544031 5.236038 -3.236038 2.544051 -0.999997 -4.116325 6.660304 -5.236079 4.116326 9.472081 -2.618018 2.272020 0.272028 -3.330179 2.272034 -0.618051 -0.786148 2.272037 0.272058 -0.786168 -1.000013 0.831927 3.330206 -2.272039 -0.831893 4.236092 2.618018 -0.272028 2.272013 3.330175 -2.964012 1.926009 -2.786142 -4.388333 -6.388313 2.449934 -3.544027 -7.640213 7.446469 -2.964065 4.948206 9.472082 -4.236044 3.236055 4.116380 -6.660381 -3.236073 2.236084 1.572353 -4.116380 -4.116320 1.572307 3.000040 -5.236080 6.660357 -4.116349 -5.236146 9.472168 2.618007 -2.964008 -6.388363 7.446501 -0.272020 1.925992 2.449933 -2.964054 2.272023 -2.786153 -3.544093 4.948261 3.330172 -4.388329 -7.640285 9.472132 0.000000 0.999993 1.272025 -1.272020 -5.116311 2.544026 6.912321 -8.912285 1.964071 -1.559877 -1.544100 2.770384 5.388341 -2.984170 -7.126182 9.472163 0.000000 0.999993 1.272025 -1.272019 3.116346 -2.544048 -2.795980 4.795965 -4.508118 5.676232 3.544138 -8.006481 5.388390 -6.220272 -4.582191 9.472226 2.618054 -5.508090 -4.388431 7.446584 2.272021 -3.162067 -4.022258 5.508107 0.272015 1.213847 1.544048 -1.712166 3.330207 -6.388361 -6.068028 9.472189 4.236055 -3.236066 -4.116391 6.660400 -3.236075 4.236069 4.116400 -6.660418 -4.116332 4.116330 6.236118 -8.472154 6.660372 -6.660371 -8.472223 12.708243 -4.236055 3.236075 4.116332 6.660372 -3.235998 2.236038 1.572247 4.116253 -4.116312 1.572294 2.999970 5.236030 -6.660321 4.116322 5.236019 9.472063 2.618011 -5.508077 -4.388333 -7.446496 2.272015 -3.162086 -4.022221 -5.508092 0.272027 1.213837 1.544023 1.712135 -3.330170 6.388357 6.067927 9.472106 0.000000 0.999998 1.272016 1.272015 -5.116342 2.544048 6.912281 8.912283 1.964034 -1.559860 -1.544025 -2.770309 -5.388357 2.984182 7.126126 9.472139 0.000000 0.999998 1.272016 1.272015 3.116347 -2.544060 -2.795937 -4.795949 -4.508065 5.676209 3.544023 8.006377 -5.388346 6.220256 4.582073 9.472129 2.618018 -2.964012 -6.388313 -7.446469 -0.272028 1.926009 2.449934 2.964065 2.272013 -2.786142 -3.544027 -4.948206 -3.330175 4.388333 7.640213 9.472082 4.236055 -3.236075 -4.116332 -6.660372 -3.236066 4.236069 4.116330 6.660371 -4.116391 4.116400 6.236118 8.472223 -6.660400 6.660418 8.472154 12.708243 unit { = INST transform 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 unit { = OFF 20 12 30 0.485869 0.081684 -0.682249 -0.485869 0.0816845 -0.682249 -0.786152 -0.185585 -0.236068 0.786152 0.185584 0.236068 1.64908e-08 0.249799 0.803619 -0.485867 0.68225 0.0816817 -1.10828e-06 0.721938 0.432444 -0.300283 0.618035 -0.485868 0.300283 0.618035 -0.485867 0.485866 0.68225 0.0816816 0.48587 -0.682248 -0.0816834 0.300283 -0.618035 0.485868 -0.300282 -0.618035 0.485867 1.18342e-06 -0.249798 -0.803619 1.31609e-06 -0.721936 -0.432451 -0.485869 -0.682249 -0.0816828 -0.485868 -0.0816825 0.682249 -0.786152 0.185586 0.236067 0.786152 -0.185584 -0.236069 0.485868 -0.0816818 0.682249 5 3 9 6 4 19 0.800 0.098 0.098 5 13 14 15 2 1 0.098 0.647 0.400 5 3 18 0 8 9 0.098 0.098 0.800 5 2 17 5 7 1 0.898 0.600 0.000 5 11 12 15 14 10 0.000 0.600 0.800 5 7 8 0 13 1 0.498 0.000 0.898 5 5 6 9 8 7 0.498 0.000 0.898 5 11 19 4 16 12 0.000 0.600 0.800 5 17 2 15 12 16 0.898 0.600 0.000 5 18 3 19 11 10 0.098 0.098 0.800 5 14 13 0 18 10 0.098 0.647 0.400 5 17 16 4 6 5 0.800 0.098 0.098 } } } geomview-1.9.4/data/geom/dodec0000644000175000001440000000173607730233107013136 00000000000000OFF 20 12 30 0.485869 0.081684 -0.682249 -0.485869 0.0816845 -0.682249 -0.786152 -0.185585 -0.236068 0.786152 0.185584 0.236068 1.64908e-08 0.249799 0.803619 -0.485867 0.68225 0.0816817 -1.10828e-06 0.721938 0.432444 -0.300283 0.618035 -0.485868 0.300283 0.618035 -0.485867 0.485866 0.68225 0.0816816 0.48587 -0.682248 -0.0816834 0.300283 -0.618035 0.485868 -0.300282 -0.618035 0.485867 1.18342e-06 -0.249798 -0.803619 1.31609e-06 -0.721936 -0.432451 -0.485869 -0.682249 -0.0816828 -0.485868 -0.0816825 0.682249 -0.786152 0.185586 0.236067 0.786152 -0.185584 -0.236069 0.485868 -0.0816818 0.682249 5 3 9 6 4 19 0.800 0.098 0.098 5 13 14 15 2 1 0.098 0.647 0.400 5 3 18 0 8 9 0.098 0.098 0.800 5 2 17 5 7 1 0.898 0.600 0.000 5 11 12 15 14 10 0.000 0.600 0.800 5 7 8 0 13 1 0.498 0.000 0.898 5 5 6 9 8 7 0.498 0.000 0.898 5 11 19 4 16 12 0.000 0.600 0.800 5 17 2 15 12 16 0.898 0.600 0.000 5 18 3 19 11 10 0.098 0.098 0.800 5 14 13 0 18 10 0.098 0.647 0.400 5 17 16 4 6 5 0.800 0.098 0.098 geomview-1.9.4/data/geom/tetra0000644000175000001440000000033107730233142013164 00000000000000OFF 4 4 6 0.0 0.0 2.0 1.632993 -0.942809 -0.666667 0.000000 1.885618 -0.666667 -1.632993 -0.942809 -0.666667 3 1 0 3 0.784 0.000 0.000 3 2 0 1 0.000 0.784 0.000 3 3 0 2 0.000 0.000 0.784 3 3 2 1 0.392 0.392 0.392 geomview-1.9.4/data/geom/torus3.oogl0000644000175000001440000000342607730233144014255 00000000000000INST transforms { TLIST # Reflect about X and Z axes 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 } geom { LIST { INST transform # Semicircular ends of torus 1 0 0 0 0 1 0 0 0 0 1 0 4 0 0 1 geom < pieces/linkA.bez } { INST transforms { TLIST # Joining pieces 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -4 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 1 } geom { < pieces/linkB.bez } } } # #! /bin/sh # # case "$1" in # [0-9]*) ;; # *) # echo "Usage: mktorus nholes >torus.oogl # Constructs an N-holed torus using Bezier patch pieces in the data directory. # setenv GEOM_PATH /data when displaying the resulting objects # if you're not already in the data directory." >&2 # exit 1 # ;; # esac # # awk ' # BEGIN { # n = '$1'; # xfmt = "\t1 0 0 0\n\t0 %g 0 0\n\t0 0 1 0\n\t%g 0 0 1\n\n"; # print "INST transforms { TLIST # Reflect about X and Z axes"; # print " 1 0 0 0\n 0 1 0 0\n 0 0 1 0\n 0 0 0 1\n"; # print " 1 0 0 0\n 0 1 0 0\n 0 0 -1 0\n 0 0 0 1\n"; # print " -1 0 0 0\n 0 1 0 0\n 0 0 1 0\n 0 0 0 1\n"; # print " -1 0 0 0\n 0 1 0 0\n 0 0 -1 0\n 0 0 0 1\n"; # print " } geom {"; # print " LIST"; # print " { INST transform # Semicircular ends of torus"; # printf xfmt, 1, 2*(n-1); # print " geom < pieces/linkA.bez"; # print " }"; # if(n > 1) { # print " { INST transforms { TLIST # Joining pieces" # for(i = 0; i < n-1; i++) { # printf xfmt, 1, 4*i - 2*n + 2; # printf xfmt, -1, 4*i - 2*n + 2; # } # print " } geom { < pieces/linkB.bez }"; # print " }"; # } # print " }"; # exit # }' geomview-1.9.4/data/geom/cube.off0000644000175000001440000000063607730233106013544 00000000000000OFF 8 6 12 1.632993 0.000000 1.154701 0.000000 1.632993 1.154701 -1.632993 0.000000 1.154701 -0.000000 -1.632993 1.154701 1.632993 -0.000000 -1.154701 0.000000 1.632993 -1.154701 -1.632993 0.000000 -1.154701 -0.000000 -1.632993 -1.154701 4 0 1 2 3 0.784 0.000 0.000 4 7 4 0 3 0.784 0.000 0.000 4 4 5 1 0 0.784 0.000 0.000 4 5 6 2 1 0.784 0.000 0.000 4 3 2 6 7 0.784 0.000 0.000 4 6 5 4 7 0.784 0.000 0.000 geomview-1.9.4/data/geom/wraptent.mesh0000644000175000001440000000024707730233150014651 00000000000000CuMESH 3 3 0 0 0 1 0 0 1 1 0 1 0 1 0 1 2 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 2 1 0 0 0 1 1 0 2 0 1 0 0 1 1 2 1 0 1 0 1 2 2 0 0 0 1 1 geomview-1.9.4/data/geom/square.quad0000644000175000001440000000004207730233140014273 00000000000000QUAD -1 -1 0 1 -1 0 1 1 0 -1 1 0 geomview-1.9.4/data/geom/facecube.off0000644000175000001440000000056607730233112014362 00000000000000# off file with per face color OFF 8 6 12 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 -1.0 -1.0 -1.0 1.0 -1.0 -1.0 -1.0 4 0 2 3 1 .05 .8 .1 .75 4 4 5 7 6 .2 .05 .8 .75 4 0 4 6 2 .9 .9 .02 .75 4 1 3 7 5 .0 .7 .4 .75 4 0 1 5 4 .1 .4 .7 .75 4 2 6 7 3 .7 .7 0 .75 geomview-1.9.4/data/geom/spherical/0000777000175000001440000000000010665240703014165 500000000000000geomview-1.9.4/data/geom/spherical/twosided.flattorus0000644000175000001440000006733407730233054017705 00000000000000{ LIST {appearance {material {diffuse 0 0 1}} 4uvMESH 16 16 0 0.7071067811865475 0 0.7071067811865475 0 0.7071067811865475 0.2705980500730984 0.6532814824381882 0 0.7071067811865475 0.5 0.5 0 0.7071067811865475 0.6532814824381882 0.2705980500730984 0 0.7071067811865475 0.7071067811865475 0 0 0.7071067811865475 0.6532814824381882 -0.2705980500730984 0 0.7071067811865475 0.5 -0.5 0 0.7071067811865475 0.2705980500730985 -0.6532814824381882 0 0.7071067811865475 0 -0.7071067811865475 0 0.7071067811865475 -0.2705980500730984 -0.6532814824381882 0 0.7071067811865475 -0.5 -0.5 0 0.7071067811865475 -0.653281482438188 -0.2705980500730989 0 0.7071067811865475 -0.7071067811865475 0 0 0.7071067811865475 -0.6532814824381882 0.2705980500730986 0 0.7071067811865475 -0.5 0.5 0 0.7071067811865475 -0.2705980500730989 0.653281482438188 0.2705980500730984 0.6532814824381882 0 0.7071067811865475 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.5 0.5 0.2705980500730984 0.6532814824381882 0.6532814824381882 0.2705980500730984 0.2705980500730984 0.6532814824381882 0.7071067811865475 0 0.2705980500730984 0.6532814824381882 0.6532814824381882 -0.2705980500730984 0.2705980500730984 0.6532814824381882 0.5 -0.5 0.2705980500730984 0.6532814824381882 0.2705980500730985 -0.6532814824381882 0.2705980500730984 0.6532814824381882 0 -0.7071067811865475 0.2705980500730984 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.5 -0.5 0.2705980500730984 0.6532814824381882 -0.653281482438188 -0.2705980500730989 0.2705980500730984 0.6532814824381882 -0.7071067811865475 0 0.2705980500730984 0.6532814824381882 -0.6532814824381882 0.2705980500730986 0.2705980500730984 0.6532814824381882 -0.5 0.5 0.2705980500730984 0.6532814824381882 -0.2705980500730989 0.653281482438188 0.5 0.5 0 0.7071067811865475 0.5 0.5 0.2705980500730984 0.6532814824381882 0.5 0.5 0.5 0.5 0.5 0.5 0.6532814824381882 0.2705980500730984 0.5 0.5 0.7071067811865475 0 0.5 0.5 0.6532814824381882 -0.2705980500730984 0.5 0.5 0.5 -0.5 0.5 0.5 0.2705980500730985 -0.6532814824381882 0.5 0.5 0 -0.7071067811865475 0.5 0.5 -0.2705980500730984 -0.6532814824381882 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.653281482438188 -0.2705980500730989 0.5 0.5 -0.7071067811865475 0 0.5 0.5 -0.6532814824381882 0.2705980500730986 0.5 0.5 -0.5 0.5 0.5 0.5 -0.2705980500730989 0.653281482438188 0.6532814824381882 0.2705980500730984 0 0.7071067811865475 0.6532814824381882 0.2705980500730984 0.2705980500730984 0.6532814824381882 0.6532814824381882 0.2705980500730984 0.5 0.5 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.7071067811865475 0 0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.6532814824381882 0.2705980500730984 0.5 -0.5 0.6532814824381882 0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.6532814824381882 0.2705980500730984 0 -0.7071067811865475 0.6532814824381882 0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 0.2705980500730984 -0.5 -0.5 0.6532814824381882 0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.6532814824381882 0.2705980500730984 -0.7071067811865475 0 0.6532814824381882 0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.6532814824381882 0.2705980500730984 -0.5 0.5 0.6532814824381882 0.2705980500730984 -0.2705980500730989 0.653281482438188 0.7071067811865475 0 0 0.7071067811865475 0.7071067811865475 0 0.2705980500730984 0.6532814824381882 0.7071067811865475 0 0.5 0.5 0.7071067811865475 0 0.6532814824381882 0.2705980500730984 0.7071067811865475 0 0.7071067811865475 0 0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 0.7071067811865475 0 0.5 -0.5 0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 0.7071067811865475 0 0 -0.7071067811865475 0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 0.7071067811865475 0 -0.5 -0.5 0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 0.7071067811865475 0 -0.7071067811865475 0 0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 0.7071067811865475 0 -0.5 0.5 0.7071067811865475 0 -0.2705980500730989 0.653281482438188 0.6532814824381882 -0.2705980500730984 0 0.7071067811865475 0.6532814824381882 -0.2705980500730984 0.2705980500730984 0.6532814824381882 0.6532814824381882 -0.2705980500730984 0.5 0.5 0.6532814824381882 -0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.5 -0.5 0.6532814824381882 -0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 0 -0.7071067811865475 0.6532814824381882 -0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 -0.5 -0.5 0.6532814824381882 -0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.6532814824381882 -0.2705980500730984 -0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.6532814824381882 -0.2705980500730984 -0.5 0.5 0.6532814824381882 -0.2705980500730984 -0.2705980500730989 0.653281482438188 0.5 -0.5 0 0.7071067811865475 0.5 -0.5 0.2705980500730984 0.6532814824381882 0.5 -0.5 0.5 0.5 0.5 -0.5 0.6532814824381882 0.2705980500730984 0.5 -0.5 0.7071067811865475 0 0.5 -0.5 0.6532814824381882 -0.2705980500730984 0.5 -0.5 0.5 -0.5 0.5 -0.5 0.2705980500730985 -0.6532814824381882 0.5 -0.5 0 -0.7071067811865475 0.5 -0.5 -0.2705980500730984 -0.6532814824381882 0.5 -0.5 -0.5 -0.5 0.5 -0.5 -0.653281482438188 -0.2705980500730989 0.5 -0.5 -0.7071067811865475 0 0.5 -0.5 -0.6532814824381882 0.2705980500730986 0.5 -0.5 -0.5 0.5 0.5 -0.5 -0.2705980500730989 0.653281482438188 0.2705980500730985 -0.6532814824381882 0 0.7071067811865475 0.2705980500730985 -0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730985 -0.6532814824381882 0.5 0.5 0.2705980500730985 -0.6532814824381882 0.6532814824381882 0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.5 -0.5 0.2705980500730985 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 0 -0.7071067811865475 0.2705980500730985 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 -0.5 -0.5 0.2705980500730985 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 0.2705980500730985 -0.6532814824381882 -0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 0.2705980500730985 -0.6532814824381882 -0.5 0.5 0.2705980500730985 -0.6532814824381882 -0.2705980500730989 0.653281482438188 0 -0.7071067811865475 0 0.7071067811865475 0 -0.7071067811865475 0.2705980500730984 0.6532814824381882 0 -0.7071067811865475 0.5 0.5 0 -0.7071067811865475 0.6532814824381882 0.2705980500730984 0 -0.7071067811865475 0.7071067811865475 0 0 -0.7071067811865475 0.6532814824381882 -0.2705980500730984 0 -0.7071067811865475 0.5 -0.5 0 -0.7071067811865475 0.2705980500730985 -0.6532814824381882 0 -0.7071067811865475 0 -0.7071067811865475 0 -0.7071067811865475 -0.2705980500730984 -0.6532814824381882 0 -0.7071067811865475 -0.5 -0.5 0 -0.7071067811865475 -0.653281482438188 -0.2705980500730989 0 -0.7071067811865475 -0.7071067811865475 0 0 -0.7071067811865475 -0.6532814824381882 0.2705980500730986 0 -0.7071067811865475 -0.5 0.5 0 -0.7071067811865475 -0.2705980500730989 0.653281482438188 -0.2705980500730984 -0.6532814824381882 0 0.7071067811865475 -0.2705980500730984 -0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.5 0.5 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.5 -0.5 -0.2705980500730984 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0 -0.7071067811865475 -0.2705980500730984 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 -0.5 -0.5 -0.2705980500730984 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 -0.2705980500730984 -0.6532814824381882 -0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 -0.2705980500730984 -0.6532814824381882 -0.5 0.5 -0.2705980500730984 -0.6532814824381882 -0.2705980500730989 0.653281482438188 -0.5 -0.5 0 0.7071067811865475 -0.5 -0.5 0.2705980500730984 0.6532814824381882 -0.5 -0.5 0.5 0.5 -0.5 -0.5 0.6532814824381882 0.2705980500730984 -0.5 -0.5 0.7071067811865475 0 -0.5 -0.5 0.6532814824381882 -0.2705980500730984 -0.5 -0.5 0.5 -0.5 -0.5 -0.5 0.2705980500730985 -0.6532814824381882 -0.5 -0.5 0 -0.7071067811865475 -0.5 -0.5 -0.2705980500730984 -0.6532814824381882 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.653281482438188 -0.2705980500730989 -0.5 -0.5 -0.7071067811865475 0 -0.5 -0.5 -0.6532814824381882 0.2705980500730986 -0.5 -0.5 -0.5 0.5 -0.5 -0.5 -0.2705980500730989 0.653281482438188 -0.653281482438188 -0.2705980500730989 0 0.7071067811865475 -0.653281482438188 -0.2705980500730989 0.2705980500730984 0.6532814824381882 -0.653281482438188 -0.2705980500730989 0.5 0.5 -0.653281482438188 -0.2705980500730989 0.6532814824381882 0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 0.6532814824381882 -0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.5 -0.5 -0.653281482438188 -0.2705980500730989 0.2705980500730985 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 0 -0.7071067811865475 -0.653281482438188 -0.2705980500730989 -0.2705980500730984 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 -0.5 -0.5 -0.653281482438188 -0.2705980500730989 -0.653281482438188 -0.2705980500730989 -0.653281482438188 -0.2705980500730989 -0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 -0.6532814824381882 0.2705980500730986 -0.653281482438188 -0.2705980500730989 -0.5 0.5 -0.653281482438188 -0.2705980500730989 -0.2705980500730989 0.653281482438188 -0.7071067811865475 0 0 0.7071067811865475 -0.7071067811865475 0 0.2705980500730984 0.6532814824381882 -0.7071067811865475 0 0.5 0.5 -0.7071067811865475 0 0.6532814824381882 0.2705980500730984 -0.7071067811865475 0 0.7071067811865475 0 -0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 -0.7071067811865475 0 0.5 -0.5 -0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 -0.7071067811865475 0 0 -0.7071067811865475 -0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 -0.7071067811865475 0 -0.5 -0.5 -0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 -0.7071067811865475 0 -0.7071067811865475 0 -0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 -0.7071067811865475 0 -0.5 0.5 -0.7071067811865475 0 -0.2705980500730989 0.653281482438188 -0.6532814824381882 0.2705980500730986 0 0.7071067811865475 -0.6532814824381882 0.2705980500730986 0.2705980500730984 0.6532814824381882 -0.6532814824381882 0.2705980500730986 0.5 0.5 -0.6532814824381882 0.2705980500730986 0.6532814824381882 0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.5 -0.5 -0.6532814824381882 0.2705980500730986 0.2705980500730985 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 0 -0.7071067811865475 -0.6532814824381882 0.2705980500730986 -0.2705980500730984 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 -0.5 -0.5 -0.6532814824381882 0.2705980500730986 -0.653281482438188 -0.2705980500730989 -0.6532814824381882 0.2705980500730986 -0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 -0.6532814824381882 0.2705980500730986 -0.6532814824381882 0.2705980500730986 -0.5 0.5 -0.6532814824381882 0.2705980500730986 -0.2705980500730989 0.653281482438188 -0.5 0.5 0 0.7071067811865475 -0.5 0.5 0.2705980500730984 0.6532814824381882 -0.5 0.5 0.5 0.5 -0.5 0.5 0.6532814824381882 0.2705980500730984 -0.5 0.5 0.7071067811865475 0 -0.5 0.5 0.6532814824381882 -0.2705980500730984 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.2705980500730985 -0.6532814824381882 -0.5 0.5 0 -0.7071067811865475 -0.5 0.5 -0.2705980500730984 -0.6532814824381882 -0.5 0.5 -0.5 -0.5 -0.5 0.5 -0.653281482438188 -0.2705980500730989 -0.5 0.5 -0.7071067811865475 0 -0.5 0.5 -0.6532814824381882 0.2705980500730986 -0.5 0.5 -0.5 0.5 -0.5 0.5 -0.2705980500730989 0.653281482438188 -0.2705980500730989 0.653281482438188 0 0.7071067811865475 -0.2705980500730989 0.653281482438188 0.2705980500730984 0.6532814824381882 -0.2705980500730989 0.653281482438188 0.5 0.5 -0.2705980500730989 0.653281482438188 0.6532814824381882 0.2705980500730984 -0.2705980500730989 0.653281482438188 0.7071067811865475 0 -0.2705980500730989 0.653281482438188 0.6532814824381882 -0.2705980500730984 -0.2705980500730989 0.653281482438188 0.5 -0.5 -0.2705980500730989 0.653281482438188 0.2705980500730985 -0.6532814824381882 -0.2705980500730989 0.653281482438188 0 -0.7071067811865475 -0.2705980500730989 0.653281482438188 -0.2705980500730984 -0.6532814824381882 -0.2705980500730989 0.653281482438188 -0.5 -0.5 -0.2705980500730989 0.653281482438188 -0.653281482438188 -0.2705980500730989 -0.2705980500730989 0.653281482438188 -0.7071067811865475 0 -0.2705980500730989 0.653281482438188 -0.6532814824381882 0.2705980500730986 -0.2705980500730989 0.653281482438188 -0.5 0.5 -0.2705980500730989 0.653281482438188 -0.2705980500730989 0.653281482438188 } {appearance {material {diffuse 0 1 0}} N4uvMESH 16 16 0 0.707107 0 0.707107 0 -1 0 0 0.707107 0.270598 0.653281 0 -0.92388 0.382683 0 0.707107 0.5 0.5 0 -0.794104 0.607781 0 0.707107 0.653281 0.270598 0 0.382683 -0.92388 0 0.707107 0.707107 0 0 0.678598 -0.73451 0 0.707107 0.653281 -0.270598 0 -0.626943 0.779065 0 0.707107 0.5 -0.5 0 0.794104 -0.607781 0 0.707107 0.270598 -0.653281 0 0.92388 -0.382683 0 0.707107 0 -0.707107 0 1 0 0 0.707107 -0.270598 -0.653281 0 0.92388 0.382683 0 0.707107 -0.5 -0.5 0 0.794104 0.607781 0 0.707107 -0.653281 -0.270598 0 -0.626943 -0.779065 0 0.707107 -0.707107 0 0 0.678598 0.73451 0 0.707107 -0.653281 0.270598 0 0.382683 0.92388 0 0.707107 -0.5 0.5 0 -0.794104 -0.607781 0 0.707107 -0.270598 0.653281 0 -0.92388 -0.382683 0.270598 0.653281 0 0.707107 -0.382683 -0.92388 0 0.270598 0.653281 0.270598 0.653281 -0.353553 -0.853553 0.382683 0.270598 0.653281 0.5 0.5 -0.303891 -0.733657 0.607781 0.270598 0.653281 0.653281 0.270598 0.146447 0.353553 -0.92388 0.270598 0.653281 0.707107 0 0.259688 0.626943 -0.73451 0.270598 0.653281 0.653281 -0.270598 -0.239921 -0.57922 0.779065 0.270598 0.653281 0.5 -0.5 0.303891 0.733657 -0.607781 0.270598 0.653281 0.270598 -0.653281 0.353553 0.853553 -0.382683 0.270598 0.653281 0 -0.707107 0.382683 0.92388 0 0.270598 0.653281 -0.270598 -0.653281 0.353553 0.853553 0.382683 0.270598 0.653281 -0.5 -0.5 0.303891 0.733657 0.607781 0.270598 0.653281 -0.653281 -0.270598 -0.239921 -0.57922 -0.779065 0.270598 0.653281 -0.707107 0 0.259688 0.626943 0.73451 0.270598 0.653281 -0.653281 0.270598 0.146447 0.353553 0.92388 0.270598 0.653281 -0.5 0.5 -0.303891 -0.733657 -0.607781 0.270598 0.653281 -0.270598 0.653281 -0.353553 -0.853553 -0.382683 0.5 0.5 0 0.707107 -0.707107 -0.707107 0 0.5 0.5 0.270598 0.653281 -0.653281 -0.653281 0.382683 0.5 0.5 0.5 0.5 -0.561517 -0.561517 0.607781 0.5 0.5 0.653281 0.270598 0.270598 0.270598 -0.92388 0.5 0.5 0.707107 0 0.479841 0.479841 -0.73451 0.5 0.5 0.653281 -0.270598 -0.443316 -0.443316 0.779065 0.5 0.5 0.5 -0.5 0.561517 0.561517 -0.607781 0.5 0.5 0.270598 -0.653281 0.653281 0.653281 -0.382683 0.5 0.5 0 -0.707107 0.707107 0.707107 0 0.5 0.5 -0.270598 -0.653281 0.653281 0.653281 0.382683 0.5 0.5 -0.5 -0.5 0.561517 0.561517 0.607781 0.5 0.5 -0.653281 -0.270598 -0.443316 -0.443316 -0.779065 0.5 0.5 -0.707107 0 0.479841 0.479841 0.73451 0.5 0.5 -0.653281 0.270598 0.270598 0.270598 0.92388 0.5 0.5 -0.5 0.5 -0.561517 -0.561517 -0.607781 0.5 0.5 -0.270598 0.653281 -0.653281 -0.653281 -0.382683 0.653281 0.270598 0 0.707107 -0.92388 -0.382683 0 0.653281 0.270598 0.270598 0.653281 -0.853553 -0.353553 0.382683 0.653281 0.270598 0.5 0.5 -0.733657 -0.303891 0.607781 0.653281 0.270598 0.653281 0.270598 0.353553 0.146447 -0.92388 0.653281 0.270598 0.707107 0 0.626943 0.259688 -0.73451 0.653281 0.270598 0.653281 -0.270598 -0.57922 -0.239921 0.779065 0.653281 0.270598 0.5 -0.5 0.733657 0.303891 -0.607781 0.653281 0.270598 0.270598 -0.653281 0.853553 0.353553 -0.382683 0.653281 0.270598 0 -0.707107 0.92388 0.382683 0 0.653281 0.270598 -0.270598 -0.653281 0.853553 0.353553 0.382683 0.653281 0.270598 -0.5 -0.5 0.733657 0.303891 0.607781 0.653281 0.270598 -0.653281 -0.270598 -0.57922 -0.239921 -0.779065 0.653281 0.270598 -0.707107 0 0.626943 0.259688 0.73451 0.653281 0.270598 -0.653281 0.270598 0.353553 0.146447 0.92388 0.653281 0.270598 -0.5 0.5 -0.733657 -0.303891 -0.607781 0.653281 0.270598 -0.270598 0.653281 -0.853553 -0.353553 -0.382683 0.707107 0 0 0.707107 -1 0 0 0.707107 0 0.270598 0.653281 -0.92388 0 0.382683 0.707107 0 0.5 0.5 -0.794104 0 0.607781 0.707107 0 0.653281 0.270598 0.382683 0 -0.92388 0.707107 0 0.707107 0 0.678598 0 -0.73451 0.707107 0 0.653281 -0.270598 -0.626943 0 0.779065 0.707107 0 0.5 -0.5 0.794104 0 -0.607781 0.707107 0 0.270598 -0.653281 0.92388 0 -0.382683 0.707107 0 0 -0.707107 1 0 0 0.707107 0 -0.270598 -0.653281 0.92388 0 0.382683 0.707107 0 -0.5 -0.5 0.794104 0 0.607781 0.707107 0 -0.653281 -0.270598 -0.626943 0 -0.779065 0.707107 0 -0.707107 0 0.678598 0 0.73451 0.707107 0 -0.653281 0.270598 0.382683 0 0.92388 0.707107 0 -0.5 0.5 -0.794104 0 -0.607781 0.707107 0 -0.270598 0.653281 -0.92388 0 -0.382683 0.653281 -0.270598 0 0.707107 -0.92388 0.382683 0 0.653281 -0.270598 0.270598 0.653281 -0.853553 0.353553 0.382683 0.653281 -0.270598 0.5 0.5 -0.733657 0.303891 0.607781 0.653281 -0.270598 0.653281 0.270598 0.353553 -0.146447 -0.92388 0.653281 -0.270598 0.707107 0 0.626943 -0.259688 -0.73451 0.653281 -0.270598 0.653281 -0.270598 -0.57922 0.239921 0.779065 0.653281 -0.270598 0.5 -0.5 0.733657 -0.303891 -0.607781 0.653281 -0.270598 0.270598 -0.653281 0.853553 -0.353553 -0.382683 0.653281 -0.270598 0 -0.707107 0.92388 -0.382683 0 0.653281 -0.270598 -0.270598 -0.653281 0.853553 -0.353553 0.382683 0.653281 -0.270598 -0.5 -0.5 0.733657 -0.303891 0.607781 0.653281 -0.270598 -0.653281 -0.270598 -0.57922 0.239921 -0.779065 0.653281 -0.270598 -0.707107 0 0.626943 -0.259688 0.73451 0.653281 -0.270598 -0.653281 0.270598 0.353553 -0.146447 0.92388 0.653281 -0.270598 -0.5 0.5 -0.733657 0.303891 -0.607781 0.653281 -0.270598 -0.270598 0.653281 -0.853553 0.353553 -0.382683 0.5 -0.5 0 0.707107 -0.707107 0.707107 0 0.5 -0.5 0.270598 0.653281 -0.653281 0.653281 0.382683 0.5 -0.5 0.5 0.5 -0.561517 0.561517 0.607781 0.5 -0.5 0.653281 0.270598 0.270598 -0.270598 -0.92388 0.5 -0.5 0.707107 0 0.479841 -0.479841 -0.73451 0.5 -0.5 0.653281 -0.270598 -0.443316 0.443316 0.779065 0.5 -0.5 0.5 -0.5 0.561517 -0.561517 -0.607781 0.5 -0.5 0.270598 -0.653281 0.653281 -0.653281 -0.382683 0.5 -0.5 0 -0.707107 0.707107 -0.707107 0 0.5 -0.5 -0.270598 -0.653281 0.653281 -0.653281 0.382683 0.5 -0.5 -0.5 -0.5 0.561517 -0.561517 0.607781 0.5 -0.5 -0.653281 -0.270598 -0.443316 0.443316 -0.779065 0.5 -0.5 -0.707107 0 0.479841 -0.479841 0.73451 0.5 -0.5 -0.653281 0.270598 0.270598 -0.270598 0.92388 0.5 -0.5 -0.5 0.5 -0.561517 0.561517 -0.607781 0.5 -0.5 -0.270598 0.653281 -0.653281 0.653281 -0.382683 0.270598 -0.653281 0 0.707107 -0.382683 0.92388 0 0.270598 -0.653281 0.270598 0.653281 -0.353553 0.853553 0.382683 0.270598 -0.653281 0.5 0.5 -0.303891 0.733657 0.607781 0.270598 -0.653281 0.653281 0.270598 0.146447 -0.353553 -0.92388 0.270598 -0.653281 0.707107 0 0.259688 -0.626943 -0.73451 0.270598 -0.653281 0.653281 -0.270598 -0.239921 0.57922 0.779065 0.270598 -0.653281 0.5 -0.5 0.303891 -0.733657 -0.607781 0.270598 -0.653281 0.270598 -0.653281 0.353553 -0.853553 -0.382683 0.270598 -0.653281 0 -0.707107 0.382683 -0.92388 0 0.270598 -0.653281 -0.270598 -0.653281 0.353553 -0.853553 0.382683 0.270598 -0.653281 -0.5 -0.5 0.303891 -0.733657 0.607781 0.270598 -0.653281 -0.653281 -0.270598 -0.239921 0.57922 -0.779065 0.270598 -0.653281 -0.707107 0 0.259688 -0.626943 0.73451 0.270598 -0.653281 -0.653281 0.270598 0.146447 -0.353553 0.92388 0.270598 -0.653281 -0.5 0.5 -0.303891 0.733657 -0.607781 0.270598 -0.653281 -0.270598 0.653281 -0.353553 0.853553 -0.382683 0 -0.707107 0 0.707107 0 1 0 0 -0.707107 0.270598 0.653281 0 0.92388 0.382683 0 -0.707107 0.5 0.5 0 0.794104 0.607781 0 -0.707107 0.653281 0.270598 0 -0.382683 -0.92388 0 -0.707107 0.707107 0 0 -0.678598 -0.73451 0 -0.707107 0.653281 -0.270598 0 0.626943 0.779065 0 -0.707107 0.5 -0.5 0 -0.794104 -0.607781 0 -0.707107 0.270598 -0.653281 0 -0.92388 -0.382683 0 -0.707107 0 -0.707107 0 -1 0 0 -0.707107 -0.270598 -0.653281 0 -0.92388 0.382683 0 -0.707107 -0.5 -0.5 0 -0.794104 0.607781 0 -0.707107 -0.653281 -0.270598 0 0.626943 -0.779065 0 -0.707107 -0.707107 0 0 -0.678598 0.73451 0 -0.707107 -0.653281 0.270598 0 -0.382683 0.92388 0 -0.707107 -0.5 0.5 0 0.794104 -0.607781 0 -0.707107 -0.270598 0.653281 0 0.92388 -0.382683 -0.270598 -0.653281 0 0.707107 0.382683 0.92388 0 -0.270598 -0.653281 0.270598 0.653281 0.353553 0.853553 0.382683 -0.270598 -0.653281 0.5 0.5 0.303891 0.733657 0.607781 -0.270598 -0.653281 0.653281 0.270598 -0.146447 -0.353553 -0.92388 -0.270598 -0.653281 0.707107 0 -0.259688 -0.626943 -0.73451 -0.270598 -0.653281 0.653281 -0.270598 0.239921 0.57922 0.779065 -0.270598 -0.653281 0.5 -0.5 -0.303891 -0.733657 -0.607781 -0.270598 -0.653281 0.270598 -0.653281 -0.353553 -0.853553 -0.382683 -0.270598 -0.653281 0 -0.707107 -0.382683 -0.92388 0 -0.270598 -0.653281 -0.270598 -0.653281 -0.353553 -0.853553 0.382683 -0.270598 -0.653281 -0.5 -0.5 -0.303891 -0.733657 0.607781 -0.270598 -0.653281 -0.653281 -0.270598 0.239921 0.57922 -0.779065 -0.270598 -0.653281 -0.707107 0 -0.259688 -0.626943 0.73451 -0.270598 -0.653281 -0.653281 0.270598 -0.146447 -0.353553 0.92388 -0.270598 -0.653281 -0.5 0.5 0.303891 0.733657 -0.607781 -0.270598 -0.653281 -0.270598 0.653281 0.353553 0.853553 -0.382683 -0.5 -0.5 0 0.707107 0.707107 0.707107 0 -0.5 -0.5 0.270598 0.653281 0.653281 0.653281 0.382683 -0.5 -0.5 0.5 0.5 0.561517 0.561517 0.607781 -0.5 -0.5 0.653281 0.270598 -0.270598 -0.270598 -0.92388 -0.5 -0.5 0.707107 0 -0.479841 -0.479841 -0.73451 -0.5 -0.5 0.653281 -0.270598 0.443316 0.443316 0.779065 -0.5 -0.5 0.5 -0.5 -0.561517 -0.561517 -0.607781 -0.5 -0.5 0.270598 -0.653281 -0.653281 -0.653281 -0.382683 -0.5 -0.5 0 -0.707107 -0.707107 -0.707107 0 -0.5 -0.5 -0.270598 -0.653281 -0.653281 -0.653281 0.382683 -0.5 -0.5 -0.5 -0.5 -0.561517 -0.561517 0.607781 -0.5 -0.5 -0.653281 -0.270598 0.443316 0.443316 -0.779065 -0.5 -0.5 -0.707107 0 -0.479841 -0.479841 0.73451 -0.5 -0.5 -0.653281 0.270598 -0.270598 -0.270598 0.92388 -0.5 -0.5 -0.5 0.5 0.561517 0.561517 -0.607781 -0.5 -0.5 -0.270598 0.653281 0.653281 0.653281 -0.382683 -0.653281 -0.270598 0 0.707107 0.92388 0.382683 0 -0.653281 -0.270598 0.270598 0.653281 0.853553 0.353553 0.382683 -0.653281 -0.270598 0.5 0.5 0.733657 0.303891 0.607781 -0.653281 -0.270598 0.653281 0.270598 -0.353553 -0.146447 -0.92388 -0.653281 -0.270598 0.707107 0 -0.626943 -0.259688 -0.73451 -0.653281 -0.270598 0.653281 -0.270598 0.57922 0.239921 0.779065 -0.653281 -0.270598 0.5 -0.5 -0.733657 -0.303891 -0.607781 -0.653281 -0.270598 0.270598 -0.653281 -0.853553 -0.353553 -0.382683 -0.653281 -0.270598 0 -0.707107 -0.92388 -0.382683 0 -0.653281 -0.270598 -0.270598 -0.653281 -0.853553 -0.353553 0.382683 -0.653281 -0.270598 -0.5 -0.5 -0.733657 -0.303891 0.607781 -0.653281 -0.270598 -0.653281 -0.270598 0.57922 0.239921 -0.779065 -0.653281 -0.270598 -0.707107 0 -0.626943 -0.259688 0.73451 -0.653281 -0.270598 -0.653281 0.270598 -0.353553 -0.146447 0.92388 -0.653281 -0.270598 -0.5 0.5 0.733657 0.303891 -0.607781 -0.653281 -0.270598 -0.270598 0.653281 0.853553 0.353553 -0.382683 -0.707107 0 0 0.707107 1 0 0 -0.707107 0 0.270598 0.653281 0.92388 0 0.382683 -0.707107 0 0.5 0.5 0.794104 0 0.607781 -0.707107 0 0.653281 0.270598 -0.382683 0 -0.92388 -0.707107 0 0.707107 0 -0.678598 0 -0.73451 -0.707107 0 0.653281 -0.270598 0.626943 0 0.779065 -0.707107 0 0.5 -0.5 -0.794104 0 -0.607781 -0.707107 0 0.270598 -0.653281 -0.92388 0 -0.382683 -0.707107 0 0 -0.707107 -1 0 0 -0.707107 0 -0.270598 -0.653281 -0.92388 0 0.382683 -0.707107 0 -0.5 -0.5 -0.794104 0 0.607781 -0.707107 0 -0.653281 -0.270598 0.626943 0 -0.779065 -0.707107 0 -0.707107 0 -0.678598 0 0.73451 -0.707107 0 -0.653281 0.270598 -0.382683 0 0.92388 -0.707107 0 -0.5 0.5 0.794104 0 -0.607781 -0.707107 0 -0.270598 0.653281 0.92388 0 -0.382683 -0.653281 0.270598 0 0.707107 0.92388 -0.382683 0 -0.653281 0.270598 0.270598 0.653281 0.853553 -0.353553 0.382683 -0.653281 0.270598 0.5 0.5 0.733657 -0.303891 0.607781 -0.653281 0.270598 0.653281 0.270598 -0.353553 0.146447 -0.92388 -0.653281 0.270598 0.707107 0 -0.626943 0.259688 -0.73451 -0.653281 0.270598 0.653281 -0.270598 0.57922 -0.239921 0.779065 -0.653281 0.270598 0.5 -0.5 -0.733657 0.303891 -0.607781 -0.653281 0.270598 0.270598 -0.653281 -0.853553 0.353553 -0.382683 -0.653281 0.270598 0 -0.707107 -0.92388 0.382683 0 -0.653281 0.270598 -0.270598 -0.653281 -0.853553 0.353553 0.382683 -0.653281 0.270598 -0.5 -0.5 -0.733657 0.303891 0.607781 -0.653281 0.270598 -0.653281 -0.270598 0.57922 -0.239921 -0.779065 -0.653281 0.270598 -0.707107 0 -0.626943 0.259688 0.73451 -0.653281 0.270598 -0.653281 0.270598 -0.353553 0.146447 0.92388 -0.653281 0.270598 -0.5 0.5 0.733657 -0.303891 -0.607781 -0.653281 0.270598 -0.270598 0.653281 0.853553 -0.353553 -0.382683 -0.5 0.5 0 0.707107 0.707107 -0.707107 0 -0.5 0.5 0.270598 0.653281 0.653281 -0.653281 0.382683 -0.5 0.5 0.5 0.5 0.561517 -0.561517 0.607781 -0.5 0.5 0.653281 0.270598 -0.270598 0.270598 -0.92388 -0.5 0.5 0.707107 0 -0.479841 0.479841 -0.73451 -0.5 0.5 0.653281 -0.270598 0.443316 -0.443316 0.779065 -0.5 0.5 0.5 -0.5 -0.561517 0.561517 -0.607781 -0.5 0.5 0.270598 -0.653281 -0.653281 0.653281 -0.382683 -0.5 0.5 0 -0.707107 -0.707107 0.707107 0 -0.5 0.5 -0.270598 -0.653281 -0.653281 0.653281 0.382683 -0.5 0.5 -0.5 -0.5 -0.561517 0.561517 0.607781 -0.5 0.5 -0.653281 -0.270598 0.443316 -0.443316 -0.779065 -0.5 0.5 -0.707107 0 -0.479841 0.479841 0.73451 -0.5 0.5 -0.653281 0.270598 -0.270598 0.270598 0.92388 -0.5 0.5 -0.5 0.5 0.561517 -0.561517 -0.607781 -0.5 0.5 -0.270598 0.653281 0.653281 -0.653281 -0.382683 -0.270598 0.653281 0 0.707107 0.382683 -0.92388 0 -0.270598 0.653281 0.270598 0.653281 0.353553 -0.853553 0.382683 -0.270598 0.653281 0.5 0.5 0.303891 -0.733657 0.607781 -0.270598 0.653281 0.653281 0.270598 -0.146447 0.353553 -0.92388 -0.270598 0.653281 0.707107 0 -0.259688 0.626943 -0.73451 -0.270598 0.653281 0.653281 -0.270598 0.239921 -0.57922 0.779065 -0.270598 0.653281 0.5 -0.5 -0.303891 0.733657 -0.607781 -0.270598 0.653281 0.270598 -0.653281 -0.353553 0.853553 -0.382683 -0.270598 0.653281 0 -0.707107 -0.382683 0.92388 0 -0.270598 0.653281 -0.270598 -0.653281 -0.353553 0.853553 0.382683 -0.270598 0.653281 -0.5 -0.5 -0.303891 0.733657 0.607781 -0.270598 0.653281 -0.653281 -0.270598 0.239921 -0.57922 -0.779065 -0.270598 0.653281 -0.707107 0 -0.259688 0.626943 0.73451 -0.270598 0.653281 -0.653281 0.270598 -0.146447 0.353553 0.92388 -0.270598 0.653281 -0.5 0.5 0.303891 -0.733657 -0.607781 -0.270598 0.653281 -0.270598 0.653281 0.353553 -0.853553 -0.382683 } } geomview-1.9.4/data/geom/spherical/dodecaplex.off0000644000175000001440000010320607730233047016711 000000000000004OFF 600 720 1200 -1. -1. -1. -4.23607 -1. -1. -1. 4.23607 -1. -1. 1. -4.23607 -1. -1. 1. 4.23607 -1. -1. -4.23607 -1. -1. -1. -4.23607 1. -1. -1. 4.23607 -1. -1. -1. 4.23607 1. -1. 0 -3.61803 -2.61803 -1. 0 -3.61803 2.61803 -1. 0 3.61803 -2.61803 -1. 0 3.61803 2.61803 -1. 1. -1. -4.23607 -1. 1. -1. 4.23607 -1. 1. 1. -4.23607 -1. 1. 1. 4.23607 -1. 1. -4.23607 -1. -1. 1. -4.23607 1. -1. 1. 4.23607 -1. -1. 1. 4.23607 1. -1. -4.23607 -1. -1. -1. -4.23607 -1. 1. -1. -4.23607 1. -1. -1. -4.23607 1. 1. -1. -3.61803 -2.61803 0 -1. -3.61803 2.61803 0 -1. -2.61803 0 -3.61803 -1. -2.61803 0 3.61803 -1. -2.61803 -3.23607 -1.61803 -1. -2.61803 -3.23607 1.61803 -1. -2.61803 3.23607 -1.61803 -1. -2.61803 3.23607 1.61803 -1. -3.23607 -1.61803 -2.61803 -1. -3.23607 -1.61803 2.61803 -1. -3.23607 1.61803 -2.61803 -1. -3.23607 1.61803 2.61803 -1. -1.61803 -2.61803 -3.23607 -1. -1.61803 -2.61803 3.23607 -1. -1.61803 2.61803 -3.23607 -1. -1.61803 2.61803 3.23607 -1. 1.61803 -2.61803 -3.23607 -1. 1.61803 -2.61803 3.23607 -1. 1.61803 2.61803 -3.23607 -1. 1.61803 2.61803 3.23607 -1. 3.23607 -1.61803 -2.61803 -1. 3.23607 -1.61803 2.61803 -1. 3.23607 1.61803 -2.61803 -1. 3.23607 1.61803 2.61803 -1. 2.61803 0 -3.61803 -1. 2.61803 0 3.61803 -1. 2.61803 -3.23607 -1.61803 -1. 2.61803 -3.23607 1.61803 -1. 2.61803 3.23607 -1.61803 -1. 2.61803 3.23607 1.61803 -1. 3.61803 -2.61803 0 -1. 3.61803 2.61803 0 -1. 4.23607 -1. -1. -1. 4.23607 -1. 1. -1. 4.23607 1. -1. -1. 4.23607 1. 1. 0 -1. -2.61803 -3.61803 0 -1. -2.61803 3.61803 0 -1. 2.61803 -3.61803 0 -1. 2.61803 3.61803 0 0 -3.23607 -3.23607 0 0 -3.23607 3.23607 0 0 3.23607 -3.23607 0 0 3.23607 3.23607 0 1. -2.61803 -3.61803 0 1. -2.61803 3.61803 0 1. 2.61803 -3.61803 0 1. 2.61803 3.61803 0 -4.23607 -0.618034 -1.61803 0 -4.23607 -0.618034 1.61803 0 -4.23607 0.618034 -1.61803 0 -4.23607 0.618034 1.61803 0 -3.61803 -1. -2.61803 0 -3.61803 -1. 2.61803 0 -3.61803 1. -2.61803 0 -3.61803 1. 2.61803 0 -2.61803 -3.61803 -1. 0 -2.61803 -3.61803 1. 0 -2.61803 3.61803 -1. 0 -2.61803 3.61803 1. 0 -0.618034 -1.61803 -4.23607 0 -0.618034 -1.61803 4.23607 0 -0.618034 1.61803 -4.23607 0 -0.618034 1.61803 4.23607 0 0.618034 -1.61803 -4.23607 0 0.618034 -1.61803 4.23607 0 0.618034 1.61803 -4.23607 0 0.618034 1.61803 4.23607 0 -3.23607 0 -3.23607 0 -3.23607 0 3.23607 0 -3.23607 -3.23607 0 0 -3.23607 3.23607 0 0 -1.61803 -4.23607 -0.618034 0 -1.61803 -4.23607 0.618034 0 -1.61803 4.23607 -0.618034 0 -1.61803 4.23607 0.618034 0 1.61803 -4.23607 -0.618034 0 1.61803 -4.23607 0.618034 0 1.61803 4.23607 -0.618034 0 1.61803 4.23607 0.618034 0 3.23607 0 -3.23607 0 3.23607 0 3.23607 0 3.23607 -3.23607 0 0 3.23607 3.23607 0 0 2.61803 -3.61803 -1. 0 2.61803 -3.61803 1. 0 2.61803 3.61803 -1. 0 2.61803 3.61803 1. 0 3.61803 -1. -2.61803 0 3.61803 -1. 2.61803 0 3.61803 1. -2.61803 0 3.61803 1. 2.61803 0 4.23607 -0.618034 -1.61803 0 4.23607 -0.618034 1.61803 0 4.23607 0.618034 -1.61803 0 4.23607 0.618034 1.61803 1. -1. -1. -4.23607 1. -1. -1. 4.23607 1. -1. 1. -4.23607 1. -1. 1. 4.23607 1. -1. -4.23607 -1. 1. -1. -4.23607 1. 1. -1. 4.23607 -1. 1. -1. 4.23607 1. 1. 0 -3.61803 -2.61803 1. 0 -3.61803 2.61803 1. 0 3.61803 -2.61803 1. 0 3.61803 2.61803 1. 1. -1. -4.23607 1. 1. -1. 4.23607 1. 1. 1. -4.23607 1. 1. 1. 4.23607 1. 1. -4.23607 -1. 1. 1. -4.23607 1. 1. 1. 4.23607 -1. 1. 1. 4.23607 1. 1. -4.23607 -1. -1. 1. -4.23607 -1. 1. 1. -4.23607 1. -1. 1. -4.23607 1. 1. 1. -3.61803 -2.61803 0 1. -3.61803 2.61803 0 1. -2.61803 0 -3.61803 1. -2.61803 0 3.61803 1. -2.61803 -3.23607 -1.61803 1. -2.61803 -3.23607 1.61803 1. -2.61803 3.23607 -1.61803 1. -2.61803 3.23607 1.61803 1. -3.23607 -1.61803 -2.61803 1. -3.23607 -1.61803 2.61803 1. -3.23607 1.61803 -2.61803 1. -3.23607 1.61803 2.61803 1. -1.61803 -2.61803 -3.23607 1. -1.61803 -2.61803 3.23607 1. -1.61803 2.61803 -3.23607 1. -1.61803 2.61803 3.23607 1. 1.61803 -2.61803 -3.23607 1. 1.61803 -2.61803 3.23607 1. 1.61803 2.61803 -3.23607 1. 1.61803 2.61803 3.23607 1. 3.23607 -1.61803 -2.61803 1. 3.23607 -1.61803 2.61803 1. 3.23607 1.61803 -2.61803 1. 3.23607 1.61803 2.61803 1. 2.61803 0 -3.61803 1. 2.61803 0 3.61803 1. 2.61803 -3.23607 -1.61803 1. 2.61803 -3.23607 1.61803 1. 2.61803 3.23607 -1.61803 1. 2.61803 3.23607 1.61803 1. 3.61803 -2.61803 0 1. 3.61803 2.61803 0 1. 4.23607 -1. -1. 1. 4.23607 -1. 1. 1. 4.23607 1. -1. 1. 4.23607 1. 1. -4.23607 -1. -1. -1. -4.23607 -1. -1. 1. -4.23607 -1. 1. -1. -4.23607 -1. 1. 1. -4.23607 0 -1.61803 -0.618034 -4.23607 0 -1.61803 0.618034 -4.23607 0 1.61803 -0.618034 -4.23607 0 1.61803 0.618034 -4.23607 1. -1. -1. -4.23607 1. -1. 1. -4.23607 1. 1. -1. -4.23607 1. 1. 1. -4.23607 -0.618034 0 -1.61803 -4.23607 -0.618034 0 1.61803 -4.23607 0.618034 0 -1.61803 -4.23607 0.618034 0 1.61803 -4.23607 -1.61803 -0.618034 0 -4.23607 -1.61803 0.618034 0 -4.23607 1.61803 -0.618034 0 -4.23607 1.61803 0.618034 0 -3.61803 -1. 0 -2.61803 -3.61803 -1. 0 2.61803 -3.61803 0 -2.61803 -1. -3.61803 0 -2.61803 1. -3.61803 0 2.61803 -1. -3.61803 0 2.61803 1. -3.61803 1. 0 -2.61803 -3.61803 1. 0 2.61803 -3.61803 -2.61803 -1. 0 -3.61803 -2.61803 1. 0 -3.61803 -1.61803 -1.61803 -1.61803 -3.61803 -1.61803 -1.61803 1.61803 -3.61803 -1.61803 1.61803 -1.61803 -3.61803 -1.61803 1.61803 1.61803 -3.61803 1.61803 -1.61803 -1.61803 -3.61803 1.61803 -1.61803 1.61803 -3.61803 1.61803 1.61803 -1.61803 -3.61803 1.61803 1.61803 1.61803 -3.61803 2.61803 -1. 0 -3.61803 2.61803 1. 0 -2.61803 -1. -3.61803 0 -2.61803 -1. -1.61803 -3.23607 -2.61803 -1. -1.61803 3.23607 -2.61803 -1. 1.61803 -3.23607 -2.61803 -1. 1.61803 3.23607 -2.61803 -1. 3.61803 0 -2.61803 0 -1. -3.61803 -2.61803 0 -1. 3.61803 -2.61803 0 1. -3.61803 -2.61803 0 1. 3.61803 -2.61803 1. -3.61803 0 -2.61803 1. -1.61803 -3.23607 -2.61803 1. -1.61803 3.23607 -2.61803 1. 1.61803 -3.23607 -2.61803 1. 1.61803 3.23607 -2.61803 1. 3.61803 0 -2.61803 -3.61803 0 -1. -2.61803 -3.61803 0 1. -2.61803 -2.61803 -2.61803 -0.618034 -2.61803 -2.61803 -2.61803 0.618034 -2.61803 -2.61803 -0.618034 -2.61803 -2.61803 -2.61803 -0.618034 2.61803 -2.61803 -2.61803 0.618034 -2.61803 -2.61803 -2.61803 0.618034 2.61803 -2.61803 -2.61803 2.61803 -0.618034 -2.61803 -2.61803 2.61803 0.618034 -2.61803 -0.618034 -2.61803 -2.61803 -2.61803 -0.618034 -2.61803 2.61803 -2.61803 -0.618034 2.61803 -2.61803 -2.61803 -0.618034 2.61803 2.61803 -2.61803 0.618034 -2.61803 -2.61803 -2.61803 0.618034 -2.61803 2.61803 -2.61803 0.618034 2.61803 -2.61803 -2.61803 0.618034 2.61803 2.61803 -2.61803 -3.23607 -1. -1.61803 -2.61803 -3.23607 -1. 1.61803 -2.61803 -3.23607 1. -1.61803 -2.61803 -3.23607 1. 1.61803 -2.61803 -1.61803 -3.23607 -1. -2.61803 -1.61803 -3.23607 1. -2.61803 -1.61803 3.23607 -1. -2.61803 -1.61803 3.23607 1. -2.61803 1.61803 -3.23607 -1. -2.61803 1.61803 -3.23607 1. -2.61803 1.61803 3.23607 -1. -2.61803 1.61803 3.23607 1. -2.61803 3.23607 -1. -1.61803 -2.61803 3.23607 -1. 1.61803 -2.61803 3.23607 1. -1.61803 -2.61803 3.23607 1. 1.61803 -2.61803 2.61803 -2.61803 -0.618034 -2.61803 2.61803 -2.61803 0.618034 -2.61803 2.61803 -0.618034 -2.61803 -2.61803 2.61803 -0.618034 2.61803 -2.61803 2.61803 0.618034 -2.61803 -2.61803 2.61803 0.618034 2.61803 -2.61803 2.61803 2.61803 -0.618034 -2.61803 2.61803 2.61803 0.618034 -2.61803 3.61803 0 -1. -2.61803 3.61803 0 1. -0.618034 0 -4.23607 -1.61803 -0.618034 0 -4.23607 1.61803 -0.618034 0 4.23607 -1.61803 -0.618034 0 4.23607 1.61803 -0.618034 -4.23607 -1.61803 0 -0.618034 -4.23607 1.61803 0 -0.618034 -2.61803 -2.61803 -2.61803 -0.618034 -2.61803 -2.61803 2.61803 -0.618034 -2.61803 2.61803 -2.61803 -0.618034 -2.61803 2.61803 2.61803 -0.618034 -1.61803 0 -4.23607 -0.618034 -1.61803 0 4.23607 -0.618034 1.61803 0 -4.23607 -0.618034 1.61803 0 4.23607 -0.618034 2.61803 -2.61803 -2.61803 -0.618034 2.61803 -2.61803 2.61803 -0.618034 2.61803 2.61803 -2.61803 -0.618034 2.61803 2.61803 2.61803 -0.618034 4.23607 -1.61803 0 -0.618034 4.23607 1.61803 0 0.618034 0 -4.23607 -1.61803 0.618034 0 -4.23607 1.61803 0.618034 0 4.23607 -1.61803 0.618034 0 4.23607 1.61803 0.618034 -4.23607 -1.61803 0 0.618034 -4.23607 1.61803 0 0.618034 -2.61803 -2.61803 -2.61803 0.618034 -2.61803 -2.61803 2.61803 0.618034 -2.61803 2.61803 -2.61803 0.618034 -2.61803 2.61803 2.61803 0.618034 -1.61803 0 -4.23607 0.618034 -1.61803 0 4.23607 0.618034 1.61803 0 -4.23607 0.618034 1.61803 0 4.23607 0.618034 2.61803 -2.61803 -2.61803 0.618034 2.61803 -2.61803 2.61803 0.618034 2.61803 2.61803 -2.61803 0.618034 2.61803 2.61803 2.61803 0.618034 4.23607 -1.61803 0 0.618034 4.23607 1.61803 0 -3.23607 -1. -2.61803 -1.61803 -3.23607 -1. -2.61803 1.61803 -3.23607 -1. 2.61803 -1.61803 -3.23607 -1. 2.61803 1.61803 -3.23607 0 0 -3.23607 -3.23607 0 0 3.23607 -3.23607 0 -3.23607 0 -3.23607 0 3.23607 0 -3.23607 1. -2.61803 -1.61803 -3.23607 1. -2.61803 1.61803 -3.23607 1. 2.61803 -1.61803 -3.23607 1. 2.61803 1.61803 -3.23607 -2.61803 -1.61803 -1. -3.23607 -2.61803 -1.61803 1. -3.23607 -2.61803 1.61803 -1. -3.23607 -2.61803 1.61803 1. -3.23607 -3.23607 0 0 -3.23607 -1.61803 -1. -2.61803 -3.23607 -1.61803 -1. 2.61803 -3.23607 -1.61803 1. -2.61803 -3.23607 -1.61803 1. 2.61803 -3.23607 1.61803 -1. -2.61803 -3.23607 1.61803 -1. 2.61803 -3.23607 1.61803 1. -2.61803 -3.23607 1.61803 1. 2.61803 -3.23607 3.23607 0 0 -3.23607 2.61803 -1.61803 -1. -3.23607 2.61803 -1.61803 1. -3.23607 2.61803 1.61803 -1. -3.23607 2.61803 1.61803 1. -1.61803 -1. -3.23607 -2.61803 -1.61803 -1. -3.23607 2.61803 -1.61803 -1. 3.23607 -2.61803 -1.61803 -1. 3.23607 2.61803 -1.61803 0 -0.618034 -4.23607 -1.61803 0 -0.618034 4.23607 -1.61803 0 0.618034 -4.23607 -1.61803 0 0.618034 4.23607 -1.61803 1. -3.23607 -2.61803 -1.61803 1. -3.23607 2.61803 -1.61803 1. 3.23607 -2.61803 -1.61803 1. 3.23607 2.61803 -1.61803 -4.23607 0 -0.618034 -1.61803 -4.23607 0 0.618034 -1.61803 -3.61803 -1.61803 -1.61803 -1.61803 -3.61803 -1.61803 1.61803 -1.61803 -3.61803 1.61803 -1.61803 -1.61803 -3.61803 1.61803 1.61803 -1.61803 -2.61803 -1. -3.23607 -1.61803 -2.61803 -1. 3.23607 -1.61803 -2.61803 1. -3.23607 -1.61803 -2.61803 1. 3.23607 -1.61803 -0.618034 -4.23607 0 -1.61803 -0.618034 4.23607 0 -1.61803 0.618034 -4.23607 0 -1.61803 0.618034 4.23607 0 -1.61803 -3.23607 -2.61803 -1. -1.61803 -3.23607 -2.61803 1. -1.61803 -3.23607 2.61803 -1. -1.61803 -3.23607 2.61803 1. -1.61803 -1.61803 -3.61803 -1.61803 -1.61803 -1.61803 -3.61803 1.61803 -1.61803 -1.61803 -1.61803 -3.61803 -1.61803 -1.61803 -1.61803 3.61803 -1.61803 -1.61803 1.61803 -3.61803 -1.61803 -1.61803 1.61803 3.61803 -1.61803 -1.61803 3.61803 -1.61803 -1.61803 -1.61803 3.61803 1.61803 -1.61803 1.61803 -3.61803 -1.61803 -1.61803 1.61803 -3.61803 1.61803 -1.61803 1.61803 -1.61803 -3.61803 -1.61803 1.61803 -1.61803 3.61803 -1.61803 1.61803 1.61803 -3.61803 -1.61803 1.61803 1.61803 3.61803 -1.61803 1.61803 3.61803 -1.61803 -1.61803 1.61803 3.61803 1.61803 -1.61803 3.23607 -2.61803 -1. -1.61803 3.23607 -2.61803 1. -1.61803 3.23607 2.61803 -1. -1.61803 3.23607 2.61803 1. -1.61803 2.61803 -1. -3.23607 -1.61803 2.61803 -1. 3.23607 -1.61803 2.61803 1. -3.23607 -1.61803 2.61803 1. 3.23607 -1.61803 3.61803 -1.61803 -1.61803 -1.61803 3.61803 -1.61803 1.61803 -1.61803 3.61803 1.61803 -1.61803 -1.61803 3.61803 1.61803 1.61803 -1.61803 4.23607 0 -0.618034 -1.61803 4.23607 0 0.618034 1.61803 -1. -3.23607 -2.61803 1.61803 -1. -3.23607 2.61803 1.61803 -1. 3.23607 -2.61803 1.61803 -1. 3.23607 2.61803 1.61803 0 -0.618034 -4.23607 1.61803 0 -0.618034 4.23607 1.61803 0 0.618034 -4.23607 1.61803 0 0.618034 4.23607 1.61803 1. -3.23607 -2.61803 1.61803 1. -3.23607 2.61803 1.61803 1. 3.23607 -2.61803 1.61803 1. 3.23607 2.61803 1.61803 -4.23607 0 -0.618034 1.61803 -4.23607 0 0.618034 1.61803 -3.61803 -1.61803 -1.61803 1.61803 -3.61803 -1.61803 1.61803 1.61803 -3.61803 1.61803 -1.61803 1.61803 -3.61803 1.61803 1.61803 1.61803 -2.61803 -1. -3.23607 1.61803 -2.61803 -1. 3.23607 1.61803 -2.61803 1. -3.23607 1.61803 -2.61803 1. 3.23607 1.61803 -0.618034 -4.23607 0 1.61803 -0.618034 4.23607 0 1.61803 0.618034 -4.23607 0 1.61803 0.618034 4.23607 0 1.61803 -3.23607 -2.61803 -1. 1.61803 -3.23607 -2.61803 1. 1.61803 -3.23607 2.61803 -1. 1.61803 -3.23607 2.61803 1. 1.61803 -1.61803 -3.61803 -1.61803 1.61803 -1.61803 -3.61803 1.61803 1.61803 -1.61803 -1.61803 -3.61803 1.61803 -1.61803 -1.61803 3.61803 1.61803 -1.61803 1.61803 -3.61803 1.61803 -1.61803 1.61803 3.61803 1.61803 -1.61803 3.61803 -1.61803 1.61803 -1.61803 3.61803 1.61803 1.61803 1.61803 -3.61803 -1.61803 1.61803 1.61803 -3.61803 1.61803 1.61803 1.61803 -1.61803 -3.61803 1.61803 1.61803 -1.61803 3.61803 1.61803 1.61803 1.61803 -3.61803 1.61803 1.61803 1.61803 3.61803 1.61803 1.61803 3.61803 -1.61803 1.61803 1.61803 3.61803 1.61803 1.61803 3.23607 -2.61803 -1. 1.61803 3.23607 -2.61803 1. 1.61803 3.23607 2.61803 -1. 1.61803 3.23607 2.61803 1. 1.61803 2.61803 -1. -3.23607 1.61803 2.61803 -1. 3.23607 1.61803 2.61803 1. -3.23607 1.61803 2.61803 1. 3.23607 1.61803 3.61803 -1.61803 -1.61803 1.61803 3.61803 -1.61803 1.61803 1.61803 3.61803 1.61803 -1.61803 1.61803 3.61803 1.61803 1.61803 1.61803 4.23607 0 -0.618034 1.61803 4.23607 0 0.618034 3.23607 -1. -2.61803 -1.61803 3.23607 -1. -2.61803 1.61803 3.23607 -1. 2.61803 -1.61803 3.23607 -1. 2.61803 1.61803 3.23607 0 0 -3.23607 3.23607 0 0 3.23607 3.23607 0 -3.23607 0 3.23607 0 3.23607 0 3.23607 1. -2.61803 -1.61803 3.23607 1. -2.61803 1.61803 3.23607 1. 2.61803 -1.61803 3.23607 1. 2.61803 1.61803 3.23607 -2.61803 -1.61803 -1. 3.23607 -2.61803 -1.61803 1. 3.23607 -2.61803 1.61803 -1. 3.23607 -2.61803 1.61803 1. 3.23607 -3.23607 0 0 3.23607 -1.61803 -1. -2.61803 3.23607 -1.61803 -1. 2.61803 3.23607 -1.61803 1. -2.61803 3.23607 -1.61803 1. 2.61803 3.23607 1.61803 -1. -2.61803 3.23607 1.61803 -1. 2.61803 3.23607 1.61803 1. -2.61803 3.23607 1.61803 1. 2.61803 3.23607 3.23607 0 0 3.23607 2.61803 -1.61803 -1. 3.23607 2.61803 -1.61803 1. 3.23607 2.61803 1.61803 -1. 3.23607 2.61803 1.61803 1. 2.61803 -1. -3.61803 0 2.61803 -1. -1.61803 -3.23607 2.61803 -1. -1.61803 3.23607 2.61803 -1. 1.61803 -3.23607 2.61803 -1. 1.61803 3.23607 2.61803 -1. 3.61803 0 2.61803 0 -1. -3.61803 2.61803 0 -1. 3.61803 2.61803 0 1. -3.61803 2.61803 0 1. 3.61803 2.61803 1. -3.61803 0 2.61803 1. -1.61803 -3.23607 2.61803 1. -1.61803 3.23607 2.61803 1. 1.61803 -3.23607 2.61803 1. 1.61803 3.23607 2.61803 1. 3.61803 0 2.61803 -3.61803 0 -1. 2.61803 -3.61803 0 1. 2.61803 -2.61803 -2.61803 -0.618034 2.61803 -2.61803 -2.61803 0.618034 2.61803 -2.61803 -0.618034 -2.61803 2.61803 -2.61803 -0.618034 2.61803 2.61803 -2.61803 0.618034 -2.61803 2.61803 -2.61803 0.618034 2.61803 2.61803 -2.61803 2.61803 -0.618034 2.61803 -2.61803 2.61803 0.618034 2.61803 -0.618034 -2.61803 -2.61803 2.61803 -0.618034 -2.61803 2.61803 2.61803 -0.618034 2.61803 -2.61803 2.61803 -0.618034 2.61803 2.61803 2.61803 0.618034 -2.61803 -2.61803 2.61803 0.618034 -2.61803 2.61803 2.61803 0.618034 2.61803 -2.61803 2.61803 0.618034 2.61803 2.61803 2.61803 -3.23607 -1. -1.61803 2.61803 -3.23607 -1. 1.61803 2.61803 -3.23607 1. -1.61803 2.61803 -3.23607 1. 1.61803 2.61803 -1.61803 -3.23607 -1. 2.61803 -1.61803 -3.23607 1. 2.61803 -1.61803 3.23607 -1. 2.61803 -1.61803 3.23607 1. 2.61803 1.61803 -3.23607 -1. 2.61803 1.61803 -3.23607 1. 2.61803 1.61803 3.23607 -1. 2.61803 1.61803 3.23607 1. 2.61803 3.23607 -1. -1.61803 2.61803 3.23607 -1. 1.61803 2.61803 3.23607 1. -1.61803 2.61803 3.23607 1. 1.61803 2.61803 2.61803 -2.61803 -0.618034 2.61803 2.61803 -2.61803 0.618034 2.61803 2.61803 -0.618034 -2.61803 2.61803 2.61803 -0.618034 2.61803 2.61803 2.61803 0.618034 -2.61803 2.61803 2.61803 0.618034 2.61803 2.61803 2.61803 2.61803 -0.618034 2.61803 2.61803 2.61803 0.618034 2.61803 3.61803 0 -1. 2.61803 3.61803 0 1. 3.61803 -1. 0 -2.61803 3.61803 -1. 0 2.61803 3.61803 0 -2.61803 -1. 3.61803 0 -2.61803 1. 3.61803 0 2.61803 -1. 3.61803 0 2.61803 1. 3.61803 1. 0 -2.61803 3.61803 1. 0 2.61803 3.61803 -2.61803 -1. 0 3.61803 -2.61803 1. 0 3.61803 -1.61803 -1.61803 -1.61803 3.61803 -1.61803 -1.61803 1.61803 3.61803 -1.61803 1.61803 -1.61803 3.61803 -1.61803 1.61803 1.61803 3.61803 1.61803 -1.61803 -1.61803 3.61803 1.61803 -1.61803 1.61803 3.61803 1.61803 1.61803 -1.61803 3.61803 1.61803 1.61803 1.61803 3.61803 2.61803 -1. 0 3.61803 2.61803 1. 0 4.23607 -1. -1. -1. 4.23607 -1. -1. 1. 4.23607 -1. 1. -1. 4.23607 -1. 1. 1. 4.23607 0 -1.61803 -0.618034 4.23607 0 -1.61803 0.618034 4.23607 0 1.61803 -0.618034 4.23607 0 1.61803 0.618034 4.23607 1. -1. -1. 4.23607 1. -1. 1. 4.23607 1. 1. -1. 4.23607 1. 1. 1. 4.23607 -0.618034 0 -1.61803 4.23607 -0.618034 0 1.61803 4.23607 0.618034 0 -1.61803 4.23607 0.618034 0 1.61803 4.23607 -1.61803 -0.618034 0 4.23607 -1.61803 0.618034 0 4.23607 1.61803 -0.618034 0 4.23607 1.61803 0.618034 0 5 0 84 60 36 382 5 0 290 26 368 382 5 0 354 226 221 382 5 1 85 61 37 383 5 1 291 27 369 383 5 1 355 227 222 383 5 2 86 62 38 384 5 2 290 26 370 384 5 2 356 228 223 384 5 2 356 354 0 290 5 3 87 63 39 385 5 3 291 27 371 385 5 3 357 229 224 385 5 3 357 355 1 291 5 4 96 80 28 380 5 4 280 8 350 380 5 4 372 220 258 380 5 5 97 81 29 381 5 5 97 96 4 372 5 5 281 9 351 381 5 5 372 220 259 381 5 6 98 82 30 386 5 6 282 10 352 386 5 6 373 225 260 386 5 7 99 83 31 387 5 7 99 98 6 373 5 7 283 11 353 387 5 7 373 225 261 387 5 12 88 68 40 390 5 12 88 84 0 354 5 12 292 48 400 390 5 12 354 226 231 390 5 13 89 69 41 391 5 13 89 85 1 355 5 13 293 49 401 391 5 13 355 227 232 391 5 14 90 70 42 392 5 14 90 86 2 356 5 14 292 48 402 392 5 14 356 228 233 392 5 14 356 354 12 292 5 15 91 71 43 393 5 15 91 87 3 357 5 15 293 49 403 393 5 15 357 229 234 393 5 15 357 355 13 293 5 16 100 108 50 388 5 16 280 8 358 388 5 16 374 230 262 388 5 16 374 372 4 280 5 17 101 100 16 374 5 17 101 109 51 389 5 17 281 9 359 389 5 17 374 230 263 389 5 17 374 372 5 281 5 18 102 110 52 394 5 18 282 10 360 394 5 18 375 235 264 394 5 18 375 373 6 282 5 19 103 102 18 375 5 19 103 111 53 395 5 19 283 11 361 395 5 19 375 235 265 395 5 19 375 373 7 283 5 20 72 76 32 364 5 20 284 24 376 364 5 20 362 236 254 364 5 21 73 77 33 365 5 21 284 24 377 365 5 21 363 237 255 365 5 21 363 362 20 284 5 22 74 72 20 362 5 22 74 78 34 366 5 22 285 25 378 366 5 22 362 236 256 366 5 23 75 73 21 363 5 23 75 79 35 367 5 23 285 25 379 367 5 23 363 237 257 367 5 23 363 362 22 285 5 26 92 76 32 368 5 26 92 78 34 370 5 27 93 77 33 369 5 27 93 79 35 371 5 28 380 350 36 286 5 29 381 351 37 287 5 30 386 352 38 288 5 31 387 353 39 289 5 32 364 376 28 286 5 33 365 377 29 287 5 34 366 378 30 288 5 35 367 379 31 289 5 36 382 368 32 286 5 37 383 369 33 287 5 38 384 370 34 288 5 39 385 371 35 289 5 40 390 400 44 294 5 41 391 401 45 295 5 42 392 402 46 296 5 43 393 403 47 297 5 44 404 396 50 294 5 45 405 397 51 295 5 46 406 398 52 296 5 47 407 399 53 297 5 48 104 112 44 400 5 48 104 114 46 402 5 49 105 113 45 401 5 49 105 115 47 403 5 50 388 358 40 294 5 51 389 359 41 295 5 52 394 360 42 296 5 53 395 361 43 297 5 56 116 112 44 404 5 56 298 54 396 404 5 56 408 278 266 404 5 57 117 113 45 405 5 57 298 54 397 405 5 57 409 279 267 405 5 57 409 408 56 298 5 58 118 114 46 406 5 58 118 116 56 408 5 58 299 55 398 406 5 58 408 278 268 406 5 59 119 115 47 407 5 59 119 117 57 409 5 59 299 55 399 407 5 59 409 279 269 407 5 59 409 408 58 299 5 60 64 8 350 36 5 60 64 128 410 156 5 61 65 9 351 37 5 61 65 129 411 157 5 62 66 10 352 38 5 62 66 130 412 158 5 63 67 11 353 39 5 63 67 131 413 159 5 68 64 8 358 40 5 68 64 128 418 160 5 68 88 84 60 64 5 69 65 9 359 41 5 69 65 129 419 161 5 69 89 85 61 65 5 70 66 10 360 42 5 70 66 130 420 162 5 70 90 86 62 66 5 71 67 11 361 43 5 71 67 131 421 163 5 71 91 87 63 67 5 78 74 72 76 92 5 79 75 73 77 93 5 80 94 24 376 28 5 80 94 144 436 148 5 81 94 24 377 29 5 81 94 144 437 149 5 81 97 96 80 94 5 82 95 25 378 30 5 82 95 145 438 150 5 83 95 25 379 31 5 83 95 145 439 151 5 83 99 98 82 95 5 108 106 54 396 50 5 108 106 174 456 170 5 109 101 100 108 106 5 109 106 54 397 51 5 109 106 174 457 171 5 110 107 55 398 52 5 110 107 175 458 172 5 111 103 102 110 107 5 111 107 55 399 53 5 111 107 175 459 173 5 114 118 116 112 104 5 115 119 117 113 105 5 120 84 60 156 442 5 120 310 146 428 442 5 120 310 290 0 84 5 120 414 506 501 442 5 121 85 61 157 443 5 121 311 147 429 443 5 121 311 291 1 85 5 121 415 507 502 443 5 122 86 62 158 444 5 122 310 146 430 444 5 122 310 290 2 86 5 122 416 414 120 310 5 122 416 508 503 444 5 123 87 63 159 445 5 123 311 147 431 445 5 123 311 291 3 87 5 123 417 415 121 311 5 123 417 509 504 445 5 124 96 80 148 440 5 124 300 128 410 440 5 124 300 280 4 96 5 124 432 500 538 440 5 125 97 81 149 441 5 125 97 96 124 432 5 125 301 129 411 441 5 125 301 281 5 97 5 125 432 500 539 441 5 126 98 82 150 446 5 126 302 130 412 446 5 126 302 282 6 98 5 126 433 505 540 446 5 127 99 83 151 447 5 127 99 98 126 433 5 127 303 131 413 447 5 127 303 283 7 99 5 127 433 505 541 447 5 128 300 280 8 64 5 129 301 281 9 65 5 130 302 282 10 66 5 131 303 283 11 67 5 132 88 68 160 450 5 132 88 84 120 414 5 132 312 168 460 450 5 132 312 292 12 88 5 132 414 506 511 450 5 133 89 69 161 451 5 133 89 85 121 415 5 133 313 169 461 451 5 133 313 293 13 89 5 133 415 507 512 451 5 134 90 70 162 452 5 134 90 86 122 416 5 134 312 168 462 452 5 134 312 292 14 90 5 134 416 414 132 312 5 134 416 508 513 452 5 135 91 71 163 453 5 135 91 87 123 417 5 135 313 169 463 453 5 135 313 293 15 91 5 135 417 415 133 313 5 135 417 509 514 453 5 136 100 108 170 448 5 136 300 128 418 448 5 136 300 280 16 100 5 136 434 432 124 300 5 136 434 510 542 448 5 137 101 100 136 434 5 137 101 109 171 449 5 137 301 129 419 449 5 137 301 281 17 101 5 137 434 432 125 301 5 137 434 510 543 449 5 138 102 110 172 454 5 138 302 130 420 454 5 138 302 282 18 102 5 138 435 433 126 302 5 138 435 515 544 454 5 139 103 102 138 435 5 139 103 111 173 455 5 139 303 131 421 455 5 139 303 283 19 103 5 139 435 433 127 303 5 139 435 515 545 455 5 140 72 76 152 424 5 140 304 144 436 424 5 140 304 284 20 72 5 140 422 516 534 424 5 141 73 77 153 425 5 141 304 144 437 425 5 141 304 284 21 73 5 141 423 422 140 304 5 141 423 517 535 425 5 142 74 72 140 422 5 142 74 78 154 426 5 142 305 145 438 426 5 142 305 285 22 74 5 142 422 516 536 426 5 143 75 73 141 423 5 143 75 79 155 427 5 143 305 145 439 427 5 143 305 285 23 75 5 143 423 422 142 305 5 143 423 517 537 427 5 144 304 284 24 94 5 145 305 285 25 95 5 146 92 76 152 428 5 146 92 78 154 430 5 146 310 290 26 92 5 147 93 77 153 429 5 147 93 79 155 431 5 147 311 291 27 93 5 148 306 286 28 80 5 148 440 410 156 306 5 149 307 287 29 81 5 149 441 411 157 307 5 150 308 288 30 82 5 150 446 412 158 308 5 151 309 289 31 83 5 151 447 413 159 309 5 152 306 286 32 76 5 152 424 436 148 306 5 153 307 287 33 77 5 153 425 437 149 307 5 154 308 288 34 78 5 154 426 438 150 308 5 155 309 289 35 79 5 155 427 439 151 309 5 156 306 286 36 60 5 156 442 428 152 306 5 157 307 287 37 61 5 157 443 429 153 307 5 158 308 288 38 62 5 158 444 430 154 308 5 159 309 289 39 63 5 159 445 431 155 309 5 160 314 294 40 68 5 160 450 460 164 314 5 161 315 295 41 69 5 161 451 461 165 315 5 162 316 296 42 70 5 162 452 462 166 316 5 163 317 297 43 71 5 163 453 463 167 317 5 164 314 294 44 112 5 164 464 456 170 314 5 165 315 295 45 113 5 165 465 457 171 315 5 166 316 296 46 114 5 166 466 458 172 316 5 167 317 297 47 115 5 167 467 459 173 317 5 168 104 112 164 460 5 168 104 114 166 462 5 168 312 292 48 104 5 169 105 113 165 461 5 169 105 115 167 463 5 169 313 293 49 105 5 170 314 294 50 108 5 170 448 418 160 314 5 171 315 295 51 109 5 171 449 419 161 315 5 172 316 296 52 110 5 172 454 420 162 316 5 173 317 297 53 111 5 173 455 421 163 317 5 174 318 298 54 106 5 175 319 299 55 107 5 176 116 112 164 464 5 176 318 174 456 464 5 176 318 298 56 116 5 176 468 558 546 464 5 177 117 113 165 465 5 177 318 174 457 465 5 177 318 298 57 117 5 177 469 468 176 318 5 177 469 559 547 465 5 178 118 114 166 466 5 178 118 116 176 468 5 178 319 175 458 466 5 178 319 299 58 118 5 178 468 558 548 466 5 179 119 115 167 467 5 179 119 117 177 469 5 179 319 175 459 467 5 179 319 299 59 119 5 179 469 468 178 319 5 179 469 559 549 467 5 180 184 202 320 210 5 180 192 200 337 210 5 180 196 208 332 210 5 181 185 184 180 196 5 181 185 203 321 211 5 181 193 201 338 211 5 181 196 208 333 211 5 182 186 204 322 212 5 182 192 200 339 212 5 182 197 196 180 192 5 182 197 209 334 212 5 183 187 186 182 197 5 183 187 205 323 213 5 183 193 201 340 213 5 183 197 196 181 193 5 183 197 209 335 213 5 188 184 202 328 214 5 188 194 192 180 184 5 188 194 206 341 214 5 188 198 218 346 214 5 189 185 184 188 198 5 189 185 203 329 215 5 189 195 193 181 185 5 189 195 207 342 215 5 189 198 218 347 215 5 190 186 204 330 216 5 190 194 192 182 186 5 190 194 206 343 216 5 190 199 198 188 194 5 190 199 219 348 216 5 191 187 186 190 199 5 191 187 205 331 217 5 191 195 193 183 187 5 191 195 207 344 217 5 191 199 198 189 195 5 191 199 219 349 217 5 202 326 220 258 320 5 202 326 230 262 328 5 203 185 184 202 326 5 203 326 220 259 321 5 203 326 230 263 329 5 204 327 225 260 322 5 204 327 235 264 330 5 205 187 186 204 327 5 205 327 225 261 323 5 205 327 235 265 331 5 206 194 192 200 324 5 207 195 193 201 325 5 209 197 196 208 336 5 219 199 198 218 345 5 221 382 36 350 246 5 222 383 37 351 247 5 223 384 38 352 248 5 224 385 39 353 249 5 226 324 200 337 221 5 226 324 206 341 231 5 227 325 201 338 222 5 227 325 207 342 232 5 228 324 200 339 223 5 228 324 206 343 233 5 228 356 354 226 324 5 229 325 201 340 224 5 229 325 207 344 234 5 229 357 355 227 325 5 230 374 372 220 326 5 231 250 246 221 226 5 231 390 40 358 250 5 232 251 247 222 227 5 232 391 41 359 251 5 233 252 248 223 228 5 233 392 42 360 252 5 234 253 249 224 229 5 234 393 43 361 253 5 235 375 373 225 327 5 236 336 208 332 254 5 236 336 209 334 256 5 237 336 208 333 255 5 237 336 209 335 257 5 237 363 362 236 336 5 254 364 32 368 240 5 255 365 33 369 241 5 256 242 240 254 236 5 256 366 34 370 242 5 257 243 241 255 237 5 257 367 35 371 243 5 258 380 28 376 238 5 259 239 238 258 220 5 259 381 29 377 239 5 260 386 30 378 244 5 261 245 244 260 225 5 261 387 31 379 245 5 262 388 50 396 270 5 263 271 270 262 230 5 263 389 51 397 271 5 264 394 52 398 276 5 265 277 276 264 235 5 265 395 53 399 277 5 266 404 44 400 272 5 267 405 45 401 273 5 268 274 272 266 278 5 268 406 46 402 274 5 269 275 273 267 279 5 269 407 47 403 275 5 278 345 218 346 266 5 278 345 219 348 268 5 279 345 218 347 267 5 279 345 219 349 269 5 279 409 408 278 345 5 320 210 337 221 246 5 321 211 338 222 247 5 322 212 339 223 248 5 323 213 340 224 249 5 328 214 341 231 250 5 328 250 246 320 202 5 329 215 342 232 251 5 329 251 247 321 203 5 330 216 343 233 252 5 330 252 248 322 204 5 331 217 344 234 253 5 331 253 249 323 205 5 332 210 320 258 238 5 333 211 321 259 239 5 333 239 238 332 208 5 334 212 322 260 244 5 335 213 323 261 245 5 335 245 244 334 209 5 337 210 332 254 240 5 338 211 333 255 241 5 339 212 334 256 242 5 339 242 240 337 200 5 340 213 335 257 243 5 340 243 241 338 201 5 341 214 346 266 272 5 342 215 347 267 273 5 343 216 348 268 274 5 343 274 272 341 206 5 344 217 349 269 275 5 344 275 273 342 207 5 346 214 328 262 270 5 347 215 329 263 271 5 347 271 270 346 218 5 348 216 330 264 276 5 349 217 331 265 277 5 349 277 276 348 219 5 350 380 258 320 246 5 351 381 259 321 247 5 352 386 260 322 248 5 353 387 261 323 249 5 358 250 246 350 8 5 358 388 262 328 250 5 359 251 247 351 9 5 359 389 263 329 251 5 360 252 248 352 10 5 360 394 264 330 252 5 361 253 249 353 11 5 361 395 265 331 253 5 368 382 221 337 240 5 369 383 222 338 241 5 370 242 240 368 26 5 370 384 223 339 242 5 371 243 241 369 27 5 371 385 224 340 243 5 376 364 254 332 238 5 377 239 238 376 24 5 377 365 255 333 239 5 378 366 256 334 244 5 379 245 244 378 25 5 379 367 257 335 245 5 396 404 266 346 270 5 397 271 270 396 54 5 397 405 267 347 271 5 398 406 268 348 276 5 399 277 276 398 55 5 399 407 269 349 277 5 400 390 231 341 272 5 401 391 232 342 273 5 402 274 272 400 48 5 402 392 233 343 274 5 403 275 273 401 49 5 403 393 234 344 275 5 410 440 538 470 526 5 411 441 539 471 527 5 412 446 540 472 528 5 413 447 541 473 529 5 418 448 542 478 530 5 418 530 526 410 128 5 419 449 543 479 531 5 419 531 527 411 129 5 420 454 544 480 532 5 420 532 528 412 130 5 421 455 545 481 533 5 421 533 529 413 131 5 428 442 501 487 520 5 429 443 502 488 521 5 430 444 503 489 522 5 430 522 520 428 146 5 431 445 504 490 523 5 431 523 521 429 147 5 436 424 534 482 518 5 437 425 535 483 519 5 437 519 518 436 144 5 438 426 536 484 524 5 439 427 537 485 525 5 439 525 524 438 145 5 456 464 546 496 550 5 457 465 547 497 551 5 457 551 550 456 174 5 458 466 548 498 556 5 459 467 549 499 557 5 459 557 556 458 175 5 460 450 511 491 552 5 461 451 512 492 553 5 462 452 513 493 554 5 462 554 552 460 168 5 463 453 514 494 555 5 463 555 553 461 169 5 470 570 487 501 526 5 471 571 488 502 527 5 472 572 489 503 528 5 473 573 490 504 529 5 478 530 526 470 562 5 478 574 491 511 530 5 479 531 527 471 563 5 479 575 492 512 531 5 480 532 528 472 564 5 480 576 493 513 532 5 481 533 529 473 565 5 481 577 494 514 533 5 482 570 470 538 518 5 483 519 518 482 568 5 483 571 471 539 519 5 484 572 472 540 524 5 485 525 524 484 569 5 485 573 473 541 525 5 487 570 482 534 520 5 488 571 483 535 521 5 489 522 520 487 560 5 489 572 484 536 522 5 490 523 521 488 561 5 490 573 485 537 523 5 491 574 496 546 552 5 492 575 497 547 553 5 493 554 552 491 566 5 493 576 498 548 554 5 494 555 553 492 567 5 494 577 499 549 555 5 496 574 478 542 550 5 497 551 550 496 578 5 497 575 479 543 551 5 498 576 480 544 556 5 499 557 556 498 579 5 499 577 481 545 557 5 501 442 156 410 526 5 502 443 157 411 527 5 503 444 158 412 528 5 504 445 159 413 529 5 506 474 560 487 501 5 506 474 566 491 511 5 507 475 561 488 502 5 507 475 567 492 512 5 508 416 414 506 474 5 508 474 560 489 503 5 508 474 566 493 513 5 509 417 415 507 475 5 509 475 561 490 504 5 509 475 567 494 514 5 510 434 432 500 476 5 511 450 160 418 530 5 511 530 526 501 506 5 512 451 161 419 531 5 512 531 527 502 507 5 513 452 162 420 532 5 513 532 528 503 508 5 514 453 163 421 533 5 514 533 529 504 509 5 515 435 433 505 477 5 516 486 568 482 534 5 516 486 569 484 536 5 517 423 422 516 486 5 517 486 568 483 535 5 517 486 569 485 537 5 534 424 152 428 520 5 535 425 153 429 521 5 536 426 154 430 522 5 536 522 520 534 516 5 537 427 155 431 523 5 537 523 521 535 517 5 538 440 148 436 518 5 539 441 149 437 519 5 539 519 518 538 500 5 540 446 150 438 524 5 541 447 151 439 525 5 541 525 524 540 505 5 542 448 170 456 550 5 543 449 171 457 551 5 543 551 550 542 510 5 544 454 172 458 556 5 545 455 173 459 557 5 545 557 556 544 515 5 546 464 164 460 552 5 547 465 165 461 553 5 548 466 166 462 554 5 548 554 552 546 558 5 549 467 167 463 555 5 549 555 553 547 559 5 558 495 578 496 546 5 558 495 579 498 548 5 559 469 468 558 495 5 559 495 578 497 547 5 559 495 579 499 549 5 562 476 500 538 470 5 562 476 510 542 478 5 563 476 500 539 471 5 563 476 510 543 479 5 563 585 584 562 476 5 564 477 505 540 472 5 564 477 515 544 480 5 565 477 505 541 473 5 565 477 515 545 481 5 565 587 586 564 477 5 566 594 592 560 474 5 567 595 593 561 475 5 569 597 596 568 486 5 579 599 598 578 495 5 580 584 562 470 570 5 580 592 560 487 570 5 580 596 568 482 570 5 581 585 563 471 571 5 581 585 584 580 596 5 581 593 561 488 571 5 581 596 568 483 571 5 582 586 564 472 572 5 582 592 560 489 572 5 582 597 569 484 572 5 582 597 596 580 592 5 583 587 565 473 573 5 583 587 586 582 597 5 583 593 561 490 573 5 583 597 569 485 573 5 583 597 596 581 593 5 588 584 562 478 574 5 588 594 566 491 574 5 588 594 592 580 584 5 588 598 578 496 574 5 589 585 563 479 575 5 589 585 584 588 598 5 589 595 567 492 575 5 589 595 593 581 585 5 589 598 578 497 575 5 590 586 564 480 576 5 590 594 566 493 576 5 590 594 592 582 586 5 590 599 579 498 576 5 590 599 598 588 594 5 591 587 565 481 577 5 591 587 586 590 599 5 591 595 567 494 577 5 591 595 593 583 587 5 591 599 579 499 577 5 591 599 598 589 595 geomview-1.9.4/data/geom/spherical/tetraplex.off0000644000175000001440000004443207730233053016613 000000000000004OFF 120 1200 720 -2. 0 0 0 -1. -1. -1. -1. -1. -1. -1. 1. -1. -1. 1. -1. -1. -1. 1. 1. -1. 0 -0.618034 -1.61803 -1. 0 -0.618034 1.61803 -1. 0 0.618034 -1.61803 -1. 0 0.618034 1.61803 -1. 1. -1. -1. -1. 1. -1. 1. -1. 1. 1. -1. -1. 1. 1. 1. -1. -0.618034 -1.61803 0 -1. -0.618034 1.61803 0 -1. 0.618034 -1.61803 0 -1. 0.618034 1.61803 0 -1. -1.61803 0 -0.618034 -1. -1.61803 0 0.618034 -1. 1.61803 0 -0.618034 -1. 1.61803 0 0.618034 0 -2. 0 0 0 -1. -1.61803 -0.618034 0 -1. -1.61803 0.618034 0 -1. 1.61803 -0.618034 0 -1. 1.61803 0.618034 0 0 -2. 0 0 0 0 -2. 0 0 0 2. 0 0 2. 0 0 1. -1.61803 -0.618034 0 1. -1.61803 0.618034 0 1. 1.61803 -0.618034 0 1. 1.61803 0.618034 0 2. 0 0 0 -0.618034 -1. -1.61803 0 -0.618034 -1. 1.61803 0 -0.618034 1. -1.61803 0 -0.618034 1. 1.61803 0 0.618034 -1. -1.61803 0 0.618034 -1. 1.61803 0 0.618034 1. -1.61803 0 0.618034 1. 1.61803 0 -1.61803 -0.618034 -1. 0 -1.61803 -0.618034 1. 0 -1.61803 0.618034 -1. 0 -1.61803 0.618034 1. 0 1.61803 -0.618034 -1. 0 1.61803 -0.618034 1. 0 1.61803 0.618034 -1. 0 1.61803 0.618034 1. 1. -1. -1. -1. 1. -1. -1. 1. 1. -1. 1. -1. 1. -1. 1. 1. 1. 0 -0.618034 -1.61803 1. 0 -0.618034 1.61803 1. 0 0.618034 -1.61803 1. 0 0.618034 1.61803 1. 1. -1. -1. 1. 1. -1. 1. 1. 1. 1. -1. 1. 1. 1. 1. 1. -0.618034 -1.61803 0 1. -0.618034 1.61803 0 1. 0.618034 -1.61803 0 1. 0.618034 1.61803 0 1. -1.61803 0 -0.618034 1. -1.61803 0 0.618034 1. 1.61803 0 -0.618034 1. 1.61803 0 0.618034 2. 0 0 0 -0.618034 -1. 0 -1.61803 -0.618034 -1. 0 1.61803 -0.618034 0 -1.61803 -1. -0.618034 0 -1.61803 1. -0.618034 0 1.61803 -1. -0.618034 0 1.61803 1. -0.618034 1. 0 -1.61803 -0.618034 1. 0 1.61803 -0.618034 -1.61803 -1. 0 -0.618034 -1.61803 1. 0 -0.618034 1.61803 -1. 0 -0.618034 1.61803 1. 0 0.618034 -1. 0 -1.61803 0.618034 -1. 0 1.61803 0.618034 0 -1.61803 -1. 0.618034 0 -1.61803 1. 0.618034 0 1.61803 -1. 0.618034 0 1.61803 1. 0.618034 1. 0 -1.61803 0.618034 1. 0 1.61803 0.618034 -1.61803 -1. 0 0.618034 -1.61803 1. 0 0.618034 1.61803 -1. 0 0.618034 1.61803 1. 0 -1.61803 -1. -0.618034 0 -1.61803 -1. 0.618034 0 -1.61803 0 -1. -0.618034 -1.61803 0 -1. 0.618034 -1.61803 0 1. -0.618034 -1.61803 0 1. 0.618034 -1.61803 1. -0.618034 0 -1.61803 1. 0.618034 0 -1.61803 -0.618034 0 -1. -1.61803 -0.618034 0 1. -1.61803 0.618034 0 -1. -1.61803 0.618034 0 1. 1.61803 -1. -0.618034 0 1.61803 -1. 0.618034 0 1.61803 0 -1. -0.618034 1.61803 0 -1. 0.618034 1.61803 0 1. -0.618034 1.61803 0 1. 0.618034 1.61803 1. -0.618034 0 1.61803 1. 0.618034 0 1.61803 -0.618034 0 -1. 1.61803 -0.618034 0 1. 1.61803 0.618034 0 -1. 1.61803 0.618034 0 1. 3 0 96 97 3 0 98 99 3 0 100 101 3 0 102 103 3 0 104 106 3 0 105 107 3 5 7 27 3 6 8 28 3 13 15 26 3 14 16 29 3 17 18 21 3 19 20 34 3 21 43 45 3 21 44 46 3 21 67 68 3 21 80 92 3 21 81 93 3 22 23 26 3 24 25 29 3 26 30 31 3 26 63 65 3 26 74 86 3 26 75 87 3 27 35 39 3 27 37 41 3 27 55 57 3 27 72 84 3 27 78 90 3 28 36 40 3 28 38 42 3 28 56 58 3 28 73 85 3 28 79 91 3 29 32 33 3 29 64 66 3 29 76 88 3 29 77 89 3 34 47 49 3 34 48 50 3 34 69 70 3 34 82 94 3 34 83 95 3 71 108 109 3 71 110 111 3 71 112 113 3 71 114 115 3 71 116 118 3 71 117 119 3 0 96 98 3 0 96 99 3 0 96 104 3 0 96 105 3 0 97 100 3 0 97 101 3 0 97 104 3 0 97 105 3 0 98 102 3 0 98 104 3 0 98 106 3 0 99 102 3 0 99 105 3 0 99 107 3 0 100 103 3 0 100 104 3 0 100 106 3 0 101 103 3 0 101 105 3 0 101 107 3 0 102 106 3 0 102 107 3 0 103 106 3 0 103 107 3 5 27 35 3 5 27 39 3 5 27 72 3 5 27 78 3 6 28 36 3 6 28 40 3 6 28 73 3 6 28 79 3 7 27 37 3 7 27 41 3 7 27 72 3 7 27 78 3 8 28 38 3 8 28 42 3 8 28 73 3 8 28 79 3 13 22 26 3 13 23 26 3 13 26 74 3 13 26 75 3 14 24 29 3 14 25 29 3 14 29 76 3 14 29 77 3 15 26 30 3 15 26 31 3 15 26 74 3 15 26 75 3 16 29 32 3 16 29 33 3 16 29 76 3 16 29 77 3 17 21 43 3 17 21 45 3 17 21 80 3 17 21 81 3 18 21 44 3 18 21 46 3 18 21 80 3 18 21 81 3 19 34 47 3 19 34 49 3 19 34 82 3 19 34 83 3 20 34 48 3 20 34 50 3 20 34 82 3 20 34 83 3 21 43 67 3 21 43 80 3 21 43 92 3 21 44 68 3 21 44 80 3 21 44 92 3 21 45 67 3 21 45 81 3 21 45 93 3 21 46 68 3 21 46 81 3 21 46 93 3 21 67 92 3 21 67 93 3 21 68 92 3 21 68 93 3 22 26 63 3 22 26 74 3 22 26 86 3 23 26 63 3 23 26 75 3 23 26 87 3 24 29 64 3 24 29 76 3 24 29 88 3 25 29 64 3 25 29 77 3 25 29 89 3 26 30 65 3 26 30 74 3 26 30 86 3 26 31 65 3 26 31 75 3 26 31 87 3 26 63 86 3 26 63 87 3 26 65 86 3 26 65 87 3 27 35 55 3 27 35 72 3 27 35 84 3 27 37 57 3 27 37 72 3 27 37 84 3 27 39 55 3 27 39 78 3 27 39 90 3 27 41 57 3 27 41 78 3 27 41 90 3 27 55 84 3 27 55 90 3 27 57 84 3 27 57 90 3 28 36 56 3 28 36 73 3 28 36 85 3 28 38 58 3 28 38 73 3 28 38 85 3 28 40 56 3 28 40 79 3 28 40 91 3 28 42 58 3 28 42 79 3 28 42 91 3 28 56 85 3 28 56 91 3 28 58 85 3 28 58 91 3 29 32 66 3 29 32 76 3 29 32 88 3 29 33 66 3 29 33 77 3 29 33 89 3 29 64 88 3 29 64 89 3 29 66 88 3 29 66 89 3 34 47 69 3 34 47 82 3 34 47 94 3 34 48 70 3 34 48 82 3 34 48 94 3 34 49 69 3 34 49 83 3 34 49 95 3 34 50 70 3 34 50 83 3 34 50 95 3 34 69 94 3 34 69 95 3 34 70 94 3 34 70 95 3 71 108 110 3 71 108 111 3 71 108 116 3 71 108 117 3 71 109 112 3 71 109 113 3 71 109 116 3 71 109 117 3 71 110 114 3 71 110 116 3 71 110 118 3 71 111 114 3 71 111 117 3 71 111 119 3 71 112 115 3 71 112 116 3 71 112 118 3 71 113 115 3 71 113 117 3 71 113 119 3 71 114 118 3 71 114 119 3 71 115 118 3 71 115 119 3 1 5 35 3 1 5 72 3 1 13 22 3 1 13 74 3 1 17 43 3 1 17 80 3 1 22 74 3 1 35 72 3 1 43 80 3 1 96 98 3 1 96 104 3 1 98 104 3 2 6 36 3 2 6 73 3 2 13 23 3 2 13 75 3 2 18 44 3 2 18 80 3 2 23 75 3 2 36 73 3 2 44 80 3 2 96 99 3 2 96 105 3 2 99 105 3 3 7 37 3 3 7 72 3 3 14 24 3 3 14 76 3 3 17 45 3 3 17 81 3 3 24 76 3 3 37 72 3 3 45 81 3 3 97 100 3 3 97 104 3 3 100 104 3 4 8 38 3 4 8 73 3 4 14 25 3 4 14 77 3 4 18 46 3 4 18 81 3 4 25 77 3 4 38 73 3 4 46 81 3 4 97 101 3 4 97 105 3 4 101 105 3 5 9 39 3 5 9 78 3 6 10 40 3 6 10 79 3 7 11 41 3 7 11 78 3 8 12 42 3 8 12 79 3 9 15 30 3 9 15 74 3 9 19 47 3 9 19 82 3 9 30 74 3 9 39 78 3 9 47 82 3 9 98 102 3 9 98 106 3 9 102 106 3 10 15 31 3 10 15 75 3 10 20 48 3 10 20 82 3 10 31 75 3 10 40 79 3 10 48 82 3 10 99 102 3 10 99 107 3 10 102 107 3 11 16 32 3 11 16 76 3 11 19 49 3 11 19 83 3 11 32 76 3 11 41 78 3 11 49 83 3 11 100 103 3 11 100 106 3 11 103 106 3 12 16 33 3 12 16 77 3 12 20 50 3 12 20 83 3 12 33 77 3 12 42 79 3 12 50 83 3 12 101 103 3 12 101 107 3 12 103 107 3 22 51 63 3 22 51 86 3 23 52 63 3 23 52 87 3 24 53 64 3 24 53 88 3 25 54 64 3 25 54 89 3 30 59 65 3 30 59 86 3 31 60 65 3 31 60 87 3 32 61 66 3 32 61 88 3 33 62 66 3 33 62 89 3 35 51 55 3 35 51 84 3 36 52 56 3 36 52 85 3 37 53 57 3 37 53 84 3 38 54 58 3 38 54 85 3 39 55 59 3 39 59 90 3 40 56 60 3 40 60 91 3 41 57 61 3 41 61 90 3 42 58 62 3 42 62 91 3 43 51 67 3 43 51 92 3 44 52 68 3 44 52 92 3 45 53 67 3 45 53 93 3 46 54 68 3 46 54 93 3 47 59 69 3 47 59 94 3 48 60 70 3 48 60 94 3 49 61 69 3 49 61 95 3 50 62 70 3 50 62 95 3 51 55 84 3 51 63 86 3 51 67 92 3 51 108 110 3 51 108 116 3 51 110 116 3 52 56 85 3 52 63 87 3 52 68 92 3 52 108 111 3 52 108 117 3 52 111 117 3 53 57 84 3 53 64 88 3 53 67 93 3 53 109 112 3 53 109 116 3 53 112 116 3 54 58 85 3 54 64 89 3 54 68 93 3 54 109 113 3 54 109 117 3 54 113 117 3 55 59 90 3 56 60 91 3 57 61 90 3 58 62 91 3 59 65 86 3 59 69 94 3 59 110 114 3 59 110 118 3 59 114 118 3 60 65 87 3 60 70 94 3 60 111 114 3 60 111 119 3 60 114 119 3 61 66 88 3 61 69 95 3 61 112 115 3 61 112 118 3 61 115 118 3 62 66 89 3 62 70 95 3 62 113 115 3 62 113 119 3 62 115 119 3 1 5 104 3 1 13 98 3 1 17 96 3 1 22 80 3 1 35 74 3 1 43 72 3 2 6 105 3 2 13 99 3 2 18 96 3 2 23 80 3 2 36 75 3 2 44 73 3 3 7 104 3 3 14 100 3 3 17 97 3 3 24 81 3 3 37 76 3 3 45 72 3 4 8 105 3 4 14 101 3 4 18 97 3 4 25 81 3 4 38 77 3 4 46 73 3 5 9 106 3 6 10 107 3 7 11 106 3 8 12 107 3 9 15 98 3 9 19 102 3 9 30 82 3 9 39 74 3 9 47 78 3 10 15 99 3 10 20 102 3 10 31 82 3 10 40 75 3 10 48 79 3 11 16 100 3 11 19 103 3 11 32 83 3 11 41 76 3 11 49 78 3 12 16 101 3 12 20 103 3 12 33 83 3 12 42 77 3 12 50 79 3 22 51 92 3 23 52 92 3 24 53 93 3 25 54 93 3 30 59 94 3 31 60 94 3 32 61 95 3 33 62 95 3 35 51 86 3 36 52 87 3 37 53 88 3 38 54 89 3 39 59 86 3 40 60 87 3 41 61 88 3 42 62 89 3 43 51 84 3 44 52 85 3 45 53 84 3 46 54 85 3 47 59 90 3 48 60 91 3 49 61 90 3 50 62 91 3 51 55 116 3 51 63 110 3 51 67 108 3 52 56 117 3 52 63 111 3 52 68 108 3 53 57 116 3 53 64 112 3 53 67 109 3 54 58 117 3 54 64 113 3 54 68 109 3 55 59 118 3 56 60 119 3 57 61 118 3 58 62 119 3 59 65 110 3 59 69 114 3 60 65 111 3 60 70 114 3 61 66 112 3 61 69 115 3 62 66 113 3 62 70 115 3 1 5 74 3 1 5 98 3 1 13 80 3 1 13 96 3 1 17 72 3 1 17 104 3 1 22 35 3 1 22 43 3 1 35 43 3 1 72 104 3 1 74 98 3 1 80 96 3 2 6 75 3 2 6 99 3 2 13 80 3 2 13 96 3 2 18 73 3 2 18 105 3 2 23 36 3 2 23 44 3 2 36 44 3 2 73 105 3 2 75 99 3 2 80 96 3 3 7 76 3 3 7 100 3 3 14 81 3 3 14 97 3 3 17 72 3 3 17 104 3 3 24 37 3 3 24 45 3 3 37 45 3 3 72 104 3 3 76 100 3 3 81 97 3 4 8 77 3 4 8 101 3 4 14 81 3 4 14 97 3 4 18 73 3 4 18 105 3 4 25 38 3 4 25 46 3 4 38 46 3 4 73 105 3 4 77 101 3 4 81 97 3 5 9 74 3 5 9 98 3 6 10 75 3 6 10 99 3 7 11 76 3 7 11 100 3 8 12 77 3 8 12 101 3 9 15 82 3 9 15 102 3 9 19 78 3 9 19 106 3 9 30 39 3 9 30 47 3 9 39 47 3 9 74 98 3 9 78 106 3 9 82 102 3 10 15 82 3 10 15 102 3 10 20 79 3 10 20 107 3 10 31 40 3 10 31 48 3 10 40 48 3 10 75 99 3 10 79 107 3 10 82 102 3 11 16 83 3 11 16 103 3 11 19 78 3 11 19 106 3 11 32 41 3 11 32 49 3 11 41 49 3 11 76 100 3 11 78 106 3 11 83 103 3 12 16 83 3 12 16 103 3 12 20 79 3 12 20 107 3 12 33 42 3 12 33 50 3 12 42 50 3 12 77 101 3 12 79 107 3 12 83 103 3 22 35 51 3 22 43 51 3 23 36 52 3 23 44 52 3 24 37 53 3 24 45 53 3 25 38 54 3 25 46 54 3 30 39 59 3 30 47 59 3 31 40 60 3 31 48 60 3 32 41 61 3 32 49 61 3 33 42 62 3 33 50 62 3 35 43 51 3 36 44 52 3 37 45 53 3 38 46 54 3 39 47 59 3 40 48 60 3 41 49 61 3 42 50 62 3 51 55 86 3 51 55 110 3 51 63 92 3 51 63 108 3 51 67 84 3 51 67 116 3 51 84 116 3 51 86 110 3 51 92 108 3 52 56 87 3 52 56 111 3 52 63 92 3 52 63 108 3 52 68 85 3 52 68 117 3 52 85 117 3 52 87 111 3 52 92 108 3 53 57 88 3 53 57 112 3 53 64 93 3 53 64 109 3 53 67 84 3 53 67 116 3 53 84 116 3 53 88 112 3 53 93 109 3 54 58 89 3 54 58 113 3 54 64 93 3 54 64 109 3 54 68 85 3 54 68 117 3 54 85 117 3 54 89 113 3 54 93 109 3 55 59 86 3 55 59 110 3 56 60 87 3 56 60 111 3 57 61 88 3 57 61 112 3 58 62 89 3 58 62 113 3 59 65 94 3 59 65 114 3 59 69 90 3 59 69 118 3 59 86 110 3 59 90 118 3 59 94 114 3 60 65 94 3 60 65 114 3 60 70 91 3 60 70 119 3 60 87 111 3 60 91 119 3 60 94 114 3 61 66 95 3 61 66 115 3 61 69 90 3 61 69 118 3 61 88 112 3 61 90 118 3 61 95 115 3 62 66 95 3 62 66 115 3 62 70 91 3 62 70 119 3 62 89 113 3 62 91 119 3 62 95 115 3 5 74 98 3 6 75 99 3 7 76 100 3 8 77 101 3 13 80 96 3 14 81 97 3 15 82 102 3 16 83 103 3 17 72 104 3 18 73 105 3 19 78 106 3 20 79 107 3 22 35 43 3 23 36 44 3 24 37 45 3 25 38 46 3 30 39 47 3 31 40 48 3 32 41 49 3 33 42 50 3 55 86 110 3 56 87 111 3 57 88 112 3 58 89 113 3 63 92 108 3 64 93 109 3 65 94 114 3 66 95 115 3 67 84 116 3 68 85 117 3 69 90 118 3 70 91 119 3 5 35 72 3 5 39 78 3 6 36 73 3 6 40 79 3 7 37 72 3 7 41 78 3 8 38 73 3 8 42 79 3 13 22 74 3 13 23 75 3 14 24 76 3 14 25 77 3 15 30 74 3 15 31 75 3 16 32 76 3 16 33 77 3 17 43 80 3 17 45 81 3 18 44 80 3 18 46 81 3 19 47 82 3 19 49 83 3 20 48 82 3 20 50 83 3 22 63 86 3 23 63 87 3 24 64 88 3 25 64 89 3 30 65 86 3 31 65 87 3 32 66 88 3 33 66 89 3 35 55 84 3 36 56 85 3 37 57 84 3 38 58 85 3 39 55 90 3 40 56 91 3 41 57 90 3 42 58 91 3 43 67 92 3 44 68 92 3 45 67 93 3 46 68 93 3 47 69 94 3 48 70 94 3 49 69 95 3 50 70 95 3 96 98 104 3 96 99 105 3 97 100 104 3 97 101 105 3 98 102 106 3 99 102 107 3 100 103 106 3 101 103 107 3 108 110 116 3 108 111 117 3 109 112 116 3 109 113 117 3 110 114 118 3 111 114 119 3 112 115 118 3 113 115 119 3 5 7 72 3 5 7 78 3 5 35 39 3 6 8 73 3 6 8 79 3 6 36 40 3 7 37 41 3 8 38 42 3 13 15 74 3 13 15 75 3 13 22 23 3 14 16 76 3 14 16 77 3 14 24 25 3 15 30 31 3 16 32 33 3 17 18 80 3 17 18 81 3 17 43 45 3 18 44 46 3 19 20 82 3 19 20 83 3 19 47 49 3 20 48 50 3 22 23 63 3 22 74 86 3 23 75 87 3 24 25 64 3 24 76 88 3 25 77 89 3 30 31 65 3 30 74 86 3 31 75 87 3 32 33 66 3 32 76 88 3 33 77 89 3 35 39 55 3 35 72 84 3 36 40 56 3 36 73 85 3 37 41 57 3 37 72 84 3 38 42 58 3 38 73 85 3 39 78 90 3 40 79 91 3 41 78 90 3 42 79 91 3 43 45 67 3 43 80 92 3 44 46 68 3 44 80 92 3 45 81 93 3 46 81 93 3 47 49 69 3 47 82 94 3 48 50 70 3 48 82 94 3 49 83 95 3 50 83 95 3 55 57 84 3 55 57 90 3 56 58 85 3 56 58 91 3 63 65 86 3 63 65 87 3 64 66 88 3 64 66 89 3 67 68 92 3 67 68 93 3 69 70 94 3 69 70 95 3 96 97 104 3 96 97 105 3 96 98 99 3 97 100 101 3 98 99 102 3 98 104 106 3 99 105 107 3 100 101 103 3 100 104 106 3 101 105 107 3 102 103 106 3 102 103 107 3 108 109 116 3 108 109 117 3 108 110 111 3 109 112 113 3 110 111 114 3 110 116 118 3 111 117 119 3 112 113 115 3 112 116 118 3 113 117 119 3 114 115 118 3 114 115 119 3 5 35 74 3 5 39 74 3 5 72 104 3 5 78 106 3 5 98 104 3 5 98 106 3 6 36 75 3 6 40 75 3 6 73 105 3 6 79 107 3 6 99 105 3 6 99 107 3 7 37 76 3 7 41 76 3 7 72 104 3 7 78 106 3 7 100 104 3 7 100 106 3 8 38 77 3 8 42 77 3 8 73 105 3 8 79 107 3 8 101 105 3 8 101 107 3 13 22 80 3 13 23 80 3 13 74 98 3 13 75 99 3 13 96 98 3 13 96 99 3 14 24 81 3 14 25 81 3 14 76 100 3 14 77 101 3 14 97 100 3 14 97 101 3 15 30 82 3 15 31 82 3 15 74 98 3 15 75 99 3 15 98 102 3 15 99 102 3 16 32 83 3 16 33 83 3 16 76 100 3 16 77 101 3 16 100 103 3 16 101 103 3 17 43 72 3 17 45 72 3 17 80 96 3 17 81 97 3 17 96 104 3 17 97 104 3 18 44 73 3 18 46 73 3 18 80 96 3 18 81 97 3 18 96 105 3 18 97 105 3 19 47 78 3 19 49 78 3 19 82 102 3 19 83 103 3 19 102 106 3 19 103 106 3 20 48 79 3 20 50 79 3 20 82 102 3 20 83 103 3 20 102 107 3 20 103 107 3 22 35 74 3 22 35 86 3 22 43 80 3 22 43 92 3 22 63 92 3 23 36 75 3 23 36 87 3 23 44 80 3 23 44 92 3 23 63 92 3 24 37 76 3 24 37 88 3 24 45 81 3 24 45 93 3 24 64 93 3 25 38 77 3 25 38 89 3 25 46 81 3 25 46 93 3 25 64 93 3 30 39 74 3 30 39 86 3 30 47 82 3 30 47 94 3 30 65 94 3 31 40 75 3 31 40 87 3 31 48 82 3 31 48 94 3 31 65 94 3 32 41 76 3 32 41 88 3 32 49 83 3 32 49 95 3 32 66 95 3 33 42 77 3 33 42 89 3 33 50 83 3 33 50 95 3 33 66 95 3 35 43 72 3 35 43 84 3 35 55 86 3 36 44 73 3 36 44 85 3 36 56 87 3 37 45 72 3 37 45 84 3 37 57 88 3 38 46 73 3 38 46 85 3 38 58 89 3 39 47 78 3 39 47 90 3 39 55 86 3 40 48 79 3 40 48 91 3 40 56 87 3 41 49 78 3 41 49 90 3 41 57 88 3 42 50 79 3 42 50 91 3 42 58 89 3 43 67 84 3 44 68 85 3 45 67 84 3 46 68 85 3 47 69 90 3 48 70 91 3 49 69 90 3 50 70 91 3 55 84 116 3 55 90 118 3 55 110 116 3 55 110 118 3 56 85 117 3 56 91 119 3 56 111 117 3 56 111 119 3 57 84 116 3 57 90 118 3 57 112 116 3 57 112 118 3 58 85 117 3 58 91 119 3 58 113 117 3 58 113 119 3 63 86 110 3 63 87 111 3 63 108 110 3 63 108 111 3 64 88 112 3 64 89 113 3 64 109 112 3 64 109 113 3 65 86 110 3 65 87 111 3 65 110 114 3 65 111 114 3 66 88 112 3 66 89 113 3 66 112 115 3 66 113 115 3 67 92 108 3 67 93 109 3 67 108 116 3 67 109 116 3 68 92 108 3 68 93 109 3 68 108 117 3 68 109 117 3 69 94 114 3 69 95 115 3 69 114 118 3 69 115 118 3 70 94 114 3 70 95 115 3 70 114 119 3 70 115 119 3 5 7 104 3 5 7 106 3 5 104 106 3 6 8 105 3 6 8 107 3 6 105 107 3 7 104 106 3 8 105 107 3 13 15 98 3 13 15 99 3 13 98 99 3 14 16 100 3 14 16 101 3 14 100 101 3 15 98 99 3 16 100 101 3 17 18 96 3 17 18 97 3 17 96 97 3 18 96 97 3 19 20 102 3 19 20 103 3 19 102 103 3 20 102 103 3 22 23 80 3 22 23 92 3 22 80 92 3 23 80 92 3 24 25 81 3 24 25 93 3 24 81 93 3 25 81 93 3 30 31 82 3 30 31 94 3 30 82 94 3 31 82 94 3 32 33 83 3 32 33 95 3 32 83 95 3 33 83 95 3 35 39 74 3 35 39 86 3 35 74 86 3 36 40 75 3 36 40 87 3 36 75 87 3 37 41 76 3 37 41 88 3 37 76 88 3 38 42 77 3 38 42 89 3 38 77 89 3 39 74 86 3 40 75 87 3 41 76 88 3 42 77 89 3 43 45 72 3 43 45 84 3 43 72 84 3 44 46 73 3 44 46 85 3 44 73 85 3 45 72 84 3 46 73 85 3 47 49 78 3 47 49 90 3 47 78 90 3 48 50 79 3 48 50 91 3 48 79 91 3 49 78 90 3 50 79 91 3 55 57 116 3 55 57 118 3 55 116 118 3 56 58 117 3 56 58 119 3 56 117 119 3 57 116 118 3 58 117 119 3 63 65 110 3 63 65 111 3 63 110 111 3 64 66 112 3 64 66 113 3 64 112 113 3 65 110 111 3 66 112 113 3 67 68 108 3 67 68 109 3 67 108 109 3 68 108 109 3 69 70 114 3 69 70 115 3 69 114 115 3 70 114 115 geomview-1.9.4/data/geom/spherical/octaplex.off0000644000175000001440000000265607730233051016422 000000000000004OFF 24 96 96 -1. -1. 0 0 -1. 0 -1. 0 -1. 0 0 -1. -1. 0 0 1. -1. 0 1. 0 -1. 1. 0 0 0 -1. -1. 0 0 -1. 0 -1. 0 -1. 0 1. 0 -1. 1. 0 0 0 -1. -1. 0 0 -1. 1. 0 0 1. -1. 0 0 1. 1. 0 1. -1. 0 0 1. 0 -1. 0 1. 0 1. 0 1. 1. 0 1. -1. 0 0 1. 0 -1. 0 1. 0 0 -1. 1. 0 0 1. 1. 0 1. 0 1. 1. 0 0 3 0 1 2 3 0 1 3 3 0 2 4 3 0 3 4 3 0 6 7 3 0 6 8 3 0 7 9 3 0 8 9 3 1 2 5 3 1 3 5 3 1 6 10 3 1 6 11 3 1 10 14 3 1 11 14 3 2 4 5 3 2 7 10 3 2 7 12 3 2 10 15 3 2 12 15 3 3 4 5 3 3 8 11 3 3 8 13 3 3 11 16 3 3 13 16 3 4 9 12 3 4 9 13 3 4 12 17 3 4 13 17 3 5 14 15 3 5 14 16 3 5 15 17 3 5 16 17 3 6 7 18 3 6 8 18 3 6 10 19 3 6 11 19 3 7 9 18 3 7 10 20 3 7 12 20 3 8 9 18 3 8 11 21 3 8 13 21 3 9 12 22 3 9 13 22 3 10 14 19 3 10 15 20 3 11 14 19 3 11 16 21 3 12 15 20 3 12 17 22 3 13 16 21 3 13 17 22 3 14 15 23 3 14 16 23 3 15 17 23 3 16 17 23 3 18 19 20 3 18 19 21 3 18 20 22 3 18 21 22 3 19 20 23 3 19 21 23 3 20 22 23 3 21 22 23 3 0 1 6 3 0 2 7 3 0 3 8 3 0 4 9 3 1 2 10 3 1 3 11 3 1 5 14 3 2 4 12 3 2 5 15 3 3 4 13 3 3 5 16 3 4 5 17 3 6 7 10 3 6 8 11 3 6 18 19 3 7 9 12 3 7 18 20 3 8 9 13 3 8 18 21 3 9 18 22 3 10 14 15 3 10 19 20 3 11 14 16 3 11 19 21 3 12 15 17 3 12 20 22 3 13 16 17 3 13 21 22 3 14 19 23 3 15 20 23 3 16 21 23 3 17 22 23 geomview-1.9.4/data/geom/spherical/flattorus.mesh0000644000175000001440000003301607730233047017007 000000000000004uvMESH 16 16 0 0.7071067811865475 0 0.7071067811865475 0 0.7071067811865475 0.2705980500730984 0.6532814824381882 0 0.7071067811865475 0.5 0.5 0 0.7071067811865475 0.6532814824381882 0.2705980500730984 0 0.7071067811865475 0.7071067811865475 0 0 0.7071067811865475 0.6532814824381882 -0.2705980500730984 0 0.7071067811865475 0.5 -0.5 0 0.7071067811865475 0.2705980500730985 -0.6532814824381882 0 0.7071067811865475 0 -0.7071067811865475 0 0.7071067811865475 -0.2705980500730984 -0.6532814824381882 0 0.7071067811865475 -0.5 -0.5 0 0.7071067811865475 -0.653281482438188 -0.2705980500730989 0 0.7071067811865475 -0.7071067811865475 0 0 0.7071067811865475 -0.6532814824381882 0.2705980500730986 0 0.7071067811865475 -0.5 0.5 0 0.7071067811865475 -0.2705980500730989 0.653281482438188 0.2705980500730984 0.6532814824381882 0 0.7071067811865475 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.5 0.5 0.2705980500730984 0.6532814824381882 0.6532814824381882 0.2705980500730984 0.2705980500730984 0.6532814824381882 0.7071067811865475 0 0.2705980500730984 0.6532814824381882 0.6532814824381882 -0.2705980500730984 0.2705980500730984 0.6532814824381882 0.5 -0.5 0.2705980500730984 0.6532814824381882 0.2705980500730985 -0.6532814824381882 0.2705980500730984 0.6532814824381882 0 -0.7071067811865475 0.2705980500730984 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.5 -0.5 0.2705980500730984 0.6532814824381882 -0.653281482438188 -0.2705980500730989 0.2705980500730984 0.6532814824381882 -0.7071067811865475 0 0.2705980500730984 0.6532814824381882 -0.6532814824381882 0.2705980500730986 0.2705980500730984 0.6532814824381882 -0.5 0.5 0.2705980500730984 0.6532814824381882 -0.2705980500730989 0.653281482438188 0.5 0.5 0 0.7071067811865475 0.5 0.5 0.2705980500730984 0.6532814824381882 0.5 0.5 0.5 0.5 0.5 0.5 0.6532814824381882 0.2705980500730984 0.5 0.5 0.7071067811865475 0 0.5 0.5 0.6532814824381882 -0.2705980500730984 0.5 0.5 0.5 -0.5 0.5 0.5 0.2705980500730985 -0.6532814824381882 0.5 0.5 0 -0.7071067811865475 0.5 0.5 -0.2705980500730984 -0.6532814824381882 0.5 0.5 -0.5 -0.5 0.5 0.5 -0.653281482438188 -0.2705980500730989 0.5 0.5 -0.7071067811865475 0 0.5 0.5 -0.6532814824381882 0.2705980500730986 0.5 0.5 -0.5 0.5 0.5 0.5 -0.2705980500730989 0.653281482438188 0.6532814824381882 0.2705980500730984 0 0.7071067811865475 0.6532814824381882 0.2705980500730984 0.2705980500730984 0.6532814824381882 0.6532814824381882 0.2705980500730984 0.5 0.5 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730984 0.7071067811865475 0 0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.6532814824381882 0.2705980500730984 0.5 -0.5 0.6532814824381882 0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.6532814824381882 0.2705980500730984 0 -0.7071067811865475 0.6532814824381882 0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 0.2705980500730984 -0.5 -0.5 0.6532814824381882 0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.6532814824381882 0.2705980500730984 -0.7071067811865475 0 0.6532814824381882 0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.6532814824381882 0.2705980500730984 -0.5 0.5 0.6532814824381882 0.2705980500730984 -0.2705980500730989 0.653281482438188 0.7071067811865475 0 0 0.7071067811865475 0.7071067811865475 0 0.2705980500730984 0.6532814824381882 0.7071067811865475 0 0.5 0.5 0.7071067811865475 0 0.6532814824381882 0.2705980500730984 0.7071067811865475 0 0.7071067811865475 0 0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 0.7071067811865475 0 0.5 -0.5 0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 0.7071067811865475 0 0 -0.7071067811865475 0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 0.7071067811865475 0 -0.5 -0.5 0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 0.7071067811865475 0 -0.7071067811865475 0 0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 0.7071067811865475 0 -0.5 0.5 0.7071067811865475 0 -0.2705980500730989 0.653281482438188 0.6532814824381882 -0.2705980500730984 0 0.7071067811865475 0.6532814824381882 -0.2705980500730984 0.2705980500730984 0.6532814824381882 0.6532814824381882 -0.2705980500730984 0.5 0.5 0.6532814824381882 -0.2705980500730984 0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.6532814824381882 -0.2705980500730984 0.5 -0.5 0.6532814824381882 -0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 0 -0.7071067811865475 0.6532814824381882 -0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 -0.5 -0.5 0.6532814824381882 -0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.6532814824381882 -0.2705980500730984 -0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.6532814824381882 -0.2705980500730984 -0.5 0.5 0.6532814824381882 -0.2705980500730984 -0.2705980500730989 0.653281482438188 0.5 -0.5 0 0.7071067811865475 0.5 -0.5 0.2705980500730984 0.6532814824381882 0.5 -0.5 0.5 0.5 0.5 -0.5 0.6532814824381882 0.2705980500730984 0.5 -0.5 0.7071067811865475 0 0.5 -0.5 0.6532814824381882 -0.2705980500730984 0.5 -0.5 0.5 -0.5 0.5 -0.5 0.2705980500730985 -0.6532814824381882 0.5 -0.5 0 -0.7071067811865475 0.5 -0.5 -0.2705980500730984 -0.6532814824381882 0.5 -0.5 -0.5 -0.5 0.5 -0.5 -0.653281482438188 -0.2705980500730989 0.5 -0.5 -0.7071067811865475 0 0.5 -0.5 -0.6532814824381882 0.2705980500730986 0.5 -0.5 -0.5 0.5 0.5 -0.5 -0.2705980500730989 0.653281482438188 0.2705980500730985 -0.6532814824381882 0 0.7071067811865475 0.2705980500730985 -0.6532814824381882 0.2705980500730984 0.6532814824381882 0.2705980500730985 -0.6532814824381882 0.5 0.5 0.2705980500730985 -0.6532814824381882 0.6532814824381882 0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 0.2705980500730985 -0.6532814824381882 0.5 -0.5 0.2705980500730985 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 0 -0.7071067811865475 0.2705980500730985 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 -0.5 -0.5 0.2705980500730985 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 0.2705980500730985 -0.6532814824381882 -0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 0.2705980500730985 -0.6532814824381882 -0.5 0.5 0.2705980500730985 -0.6532814824381882 -0.2705980500730989 0.653281482438188 0 -0.7071067811865475 0 0.7071067811865475 0 -0.7071067811865475 0.2705980500730984 0.6532814824381882 0 -0.7071067811865475 0.5 0.5 0 -0.7071067811865475 0.6532814824381882 0.2705980500730984 0 -0.7071067811865475 0.7071067811865475 0 0 -0.7071067811865475 0.6532814824381882 -0.2705980500730984 0 -0.7071067811865475 0.5 -0.5 0 -0.7071067811865475 0.2705980500730985 -0.6532814824381882 0 -0.7071067811865475 0 -0.7071067811865475 0 -0.7071067811865475 -0.2705980500730984 -0.6532814824381882 0 -0.7071067811865475 -0.5 -0.5 0 -0.7071067811865475 -0.653281482438188 -0.2705980500730989 0 -0.7071067811865475 -0.7071067811865475 0 0 -0.7071067811865475 -0.6532814824381882 0.2705980500730986 0 -0.7071067811865475 -0.5 0.5 0 -0.7071067811865475 -0.2705980500730989 0.653281482438188 -0.2705980500730984 -0.6532814824381882 0 0.7071067811865475 -0.2705980500730984 -0.6532814824381882 0.2705980500730984 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.5 0.5 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 0.6532814824381882 -0.2705980500730984 -0.2705980500730984 -0.6532814824381882 0.5 -0.5 -0.2705980500730984 -0.6532814824381882 0.2705980500730985 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0 -0.7071067811865475 -0.2705980500730984 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 -0.2705980500730984 -0.6532814824381882 -0.5 -0.5 -0.2705980500730984 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 -0.2705980500730984 -0.6532814824381882 -0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 -0.2705980500730984 -0.6532814824381882 -0.5 0.5 -0.2705980500730984 -0.6532814824381882 -0.2705980500730989 0.653281482438188 -0.5 -0.5 0 0.7071067811865475 -0.5 -0.5 0.2705980500730984 0.6532814824381882 -0.5 -0.5 0.5 0.5 -0.5 -0.5 0.6532814824381882 0.2705980500730984 -0.5 -0.5 0.7071067811865475 0 -0.5 -0.5 0.6532814824381882 -0.2705980500730984 -0.5 -0.5 0.5 -0.5 -0.5 -0.5 0.2705980500730985 -0.6532814824381882 -0.5 -0.5 0 -0.7071067811865475 -0.5 -0.5 -0.2705980500730984 -0.6532814824381882 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.653281482438188 -0.2705980500730989 -0.5 -0.5 -0.7071067811865475 0 -0.5 -0.5 -0.6532814824381882 0.2705980500730986 -0.5 -0.5 -0.5 0.5 -0.5 -0.5 -0.2705980500730989 0.653281482438188 -0.653281482438188 -0.2705980500730989 0 0.7071067811865475 -0.653281482438188 -0.2705980500730989 0.2705980500730984 0.6532814824381882 -0.653281482438188 -0.2705980500730989 0.5 0.5 -0.653281482438188 -0.2705980500730989 0.6532814824381882 0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 0.6532814824381882 -0.2705980500730984 -0.653281482438188 -0.2705980500730989 0.5 -0.5 -0.653281482438188 -0.2705980500730989 0.2705980500730985 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 0 -0.7071067811865475 -0.653281482438188 -0.2705980500730989 -0.2705980500730984 -0.6532814824381882 -0.653281482438188 -0.2705980500730989 -0.5 -0.5 -0.653281482438188 -0.2705980500730989 -0.653281482438188 -0.2705980500730989 -0.653281482438188 -0.2705980500730989 -0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 -0.6532814824381882 0.2705980500730986 -0.653281482438188 -0.2705980500730989 -0.5 0.5 -0.653281482438188 -0.2705980500730989 -0.2705980500730989 0.653281482438188 -0.7071067811865475 0 0 0.7071067811865475 -0.7071067811865475 0 0.2705980500730984 0.6532814824381882 -0.7071067811865475 0 0.5 0.5 -0.7071067811865475 0 0.6532814824381882 0.2705980500730984 -0.7071067811865475 0 0.7071067811865475 0 -0.7071067811865475 0 0.6532814824381882 -0.2705980500730984 -0.7071067811865475 0 0.5 -0.5 -0.7071067811865475 0 0.2705980500730985 -0.6532814824381882 -0.7071067811865475 0 0 -0.7071067811865475 -0.7071067811865475 0 -0.2705980500730984 -0.6532814824381882 -0.7071067811865475 0 -0.5 -0.5 -0.7071067811865475 0 -0.653281482438188 -0.2705980500730989 -0.7071067811865475 0 -0.7071067811865475 0 -0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 -0.7071067811865475 0 -0.5 0.5 -0.7071067811865475 0 -0.2705980500730989 0.653281482438188 -0.6532814824381882 0.2705980500730986 0 0.7071067811865475 -0.6532814824381882 0.2705980500730986 0.2705980500730984 0.6532814824381882 -0.6532814824381882 0.2705980500730986 0.5 0.5 -0.6532814824381882 0.2705980500730986 0.6532814824381882 0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 0.6532814824381882 -0.2705980500730984 -0.6532814824381882 0.2705980500730986 0.5 -0.5 -0.6532814824381882 0.2705980500730986 0.2705980500730985 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 0 -0.7071067811865475 -0.6532814824381882 0.2705980500730986 -0.2705980500730984 -0.6532814824381882 -0.6532814824381882 0.2705980500730986 -0.5 -0.5 -0.6532814824381882 0.2705980500730986 -0.653281482438188 -0.2705980500730989 -0.6532814824381882 0.2705980500730986 -0.7071067811865475 0 -0.6532814824381882 0.2705980500730986 -0.6532814824381882 0.2705980500730986 -0.6532814824381882 0.2705980500730986 -0.5 0.5 -0.6532814824381882 0.2705980500730986 -0.2705980500730989 0.653281482438188 -0.5 0.5 0 0.7071067811865475 -0.5 0.5 0.2705980500730984 0.6532814824381882 -0.5 0.5 0.5 0.5 -0.5 0.5 0.6532814824381882 0.2705980500730984 -0.5 0.5 0.7071067811865475 0 -0.5 0.5 0.6532814824381882 -0.2705980500730984 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.2705980500730985 -0.6532814824381882 -0.5 0.5 0 -0.7071067811865475 -0.5 0.5 -0.2705980500730984 -0.6532814824381882 -0.5 0.5 -0.5 -0.5 -0.5 0.5 -0.653281482438188 -0.2705980500730989 -0.5 0.5 -0.7071067811865475 0 -0.5 0.5 -0.6532814824381882 0.2705980500730986 -0.5 0.5 -0.5 0.5 -0.5 0.5 -0.2705980500730989 0.653281482438188 -0.2705980500730989 0.653281482438188 0 0.7071067811865475 -0.2705980500730989 0.653281482438188 0.2705980500730984 0.6532814824381882 -0.2705980500730989 0.653281482438188 0.5 0.5 -0.2705980500730989 0.653281482438188 0.6532814824381882 0.2705980500730984 -0.2705980500730989 0.653281482438188 0.7071067811865475 0 -0.2705980500730989 0.653281482438188 0.6532814824381882 -0.2705980500730984 -0.2705980500730989 0.653281482438188 0.5 -0.5 -0.2705980500730989 0.653281482438188 0.2705980500730985 -0.6532814824381882 -0.2705980500730989 0.653281482438188 0 -0.7071067811865475 -0.2705980500730989 0.653281482438188 -0.2705980500730984 -0.6532814824381882 -0.2705980500730989 0.653281482438188 -0.5 -0.5 -0.2705980500730989 0.653281482438188 -0.653281482438188 -0.2705980500730989 -0.2705980500730989 0.653281482438188 -0.7071067811865475 0 -0.2705980500730989 0.653281482438188 -0.6532814824381882 0.2705980500730986 -0.2705980500730989 0.653281482438188 -0.5 0.5 -0.2705980500730989 0.653281482438188 -0.2705980500730989 0.653281482438188 geomview-1.9.4/data/geom/spherical/orthoplex.off0000644000175000001440000000052107730233051016614 000000000000004OFF 8 32 24 1 0 0 0 -1 0 0 0 0 1 0 0 0 -1 0 0 0 0 1 0 0 0 -1 0 0 0 0 1 0 0 0 -1 3 0 2 4 3 1 2 4 3 0 3 4 3 1 3 4 3 0 2 5 3 1 2 5 3 0 3 5 3 1 3 5 3 2 4 6 3 3 4 6 3 2 5 6 3 3 5 6 3 2 4 7 3 3 4 7 3 2 5 7 3 3 5 7 3 0 4 6 3 1 4 6 3 0 5 6 3 1 5 6 3 0 4 7 3 1 4 7 3 0 5 7 3 1 5 7 3 0 2 6 3 1 2 6 3 0 3 6 3 1 3 6 3 0 2 7 3 1 2 7 3 0 3 7 3 1 3 7 geomview-1.9.4/data/geom/spherical/ruledtorus.mesh0000644000175000001440000006551707730233052017203 000000000000004uvMESH 20 20 0.5877852522924732 0.809016994374947 0. 1. 0.809016994374947 0.5877852522924732 -0.3090169943749474 0.951056516295153 0.951056516295153 0.3090169943749474 -0.5877852522924732 0.809016994374947 1. 0. -0.809016994374947 0.5877852522924732 0.951056516295154 -0.3090169943749474 -0.951056516295153 0.3090169943749474 0.809016994374947 -0.587785252292473 -1. 0. 0.5877852522924733 -0.809016994374947 -0.951056516295154 -0.3090169943749474 0.3090169943749475 -0.951056516295153 -0.809016994374947 -0.587785252292473 0. -1. -0.5877852522924733 -0.809016994374947 -0.3090169943749477 -0.951056516295153 -0.3090169943749475 -0.951056516295153 -0.587785252292473 -0.809016994374947 0. -1. -0.809016994374947 -0.5877852522924733 0.3090169943749477 -0.951056516295153 -0.951056516295153 -0.3090169943749475 0.587785252292473 -0.809016994374947 -1. 0. 0.809016994374947 -0.5877852522924733 -0.951056516295154 0.3090169943749472 0.951056516295153 -0.3090169943749475 -0.809016994374948 0.587785252292473 1. 0. -0.5877852522924734 0.809016994374947 0.951056516295154 0.3090169943749472 -0.3090169943749476 0.951056516295153 0.809016994374948 0.587785252292473 0. 1. 0.5877852522924734 0.809016994374947 0.3090169943749472 0.951056516295154 0.3090169943749476 0.951056516295153 0.809016994374947 0.5877852522924732 0.3090169943749474 0.951056516295153 0.951056516295153 0.3090169943749474 0. 1. 1. 0. -0.3090169943749474 0.951056516295153 0.951056516295154 -0.3090169943749474 -0.5877852522924732 0.809016994374947 0.809016994374947 -0.587785252292473 -0.809016994374947 0.5877852522924732 0.5877852522924733 -0.809016994374947 -0.951056516295153 0.3090169943749474 0.3090169943749475 -0.951056516295153 -1. 0. 0. -1. -0.951056516295154 -0.3090169943749474 -0.3090169943749477 -0.951056516295153 -0.809016994374947 -0.587785252292473 -0.587785252292473 -0.809016994374947 -0.5877852522924733 -0.809016994374947 -0.809016994374947 -0.5877852522924733 -0.3090169943749475 -0.951056516295153 -0.951056516295153 -0.3090169943749475 0. -1. -1. 0. 0.3090169943749477 -0.951056516295153 -0.951056516295154 0.3090169943749472 0.587785252292473 -0.809016994374947 -0.809016994374948 0.587785252292473 0.809016994374947 -0.5877852522924733 -0.5877852522924734 0.809016994374947 0.951056516295153 -0.3090169943749475 -0.3090169943749476 0.951056516295153 1. 0. 0. 1. 0.951056516295154 0.3090169943749472 0.3090169943749472 0.951056516295154 0.809016994374948 0.587785252292473 0.5877852522924736 0.809016994374947 0.5877852522924734 0.809016994374947 0.951056516295153 0.3090169943749474 0.5877852522924732 0.809016994374947 1. 0. 0.3090169943749474 0.951056516295153 0.951056516295154 -0.3090169943749474 0. 1. 0.809016994374947 -0.587785252292473 -0.3090169943749474 0.951056516295153 0.5877852522924733 -0.809016994374947 -0.5877852522924732 0.809016994374947 0.3090169943749475 -0.951056516295153 -0.809016994374947 0.5877852522924732 0. -1. -0.951056516295153 0.3090169943749474 -0.3090169943749477 -0.951056516295153 -1. 0. -0.587785252292473 -0.809016994374947 -0.951056516295154 -0.3090169943749474 -0.809016994374947 -0.5877852522924733 -0.809016994374947 -0.587785252292473 -0.951056516295153 -0.3090169943749475 -0.5877852522924733 -0.809016994374947 -1. 0. -0.3090169943749475 -0.951056516295153 -0.951056516295154 0.3090169943749472 0. -1. -0.809016994374948 0.587785252292473 0.3090169943749477 -0.951056516295153 -0.5877852522924734 0.809016994374947 0.587785252292473 -0.809016994374947 -0.3090169943749476 0.951056516295153 0.809016994374947 -0.5877852522924733 0. 1. 0.951056516295153 -0.3090169943749475 0.3090169943749472 0.951056516295154 1. 0. 0.5877852522924736 0.809016994374947 0.951056516295154 0.3090169943749472 0.809016994374947 0.5877852522924741 0.809016994374948 0.587785252292473 1. 0. 0.809016994374947 0.5877852522924732 0.951056516295154 -0.3090169943749474 0.5877852522924732 0.809016994374947 0.809016994374947 -0.587785252292473 0.3090169943749474 0.951056516295153 0.5877852522924733 -0.809016994374947 0. 1. 0.3090169943749475 -0.951056516295153 -0.3090169943749474 0.951056516295153 0. -1. -0.5877852522924732 0.809016994374947 -0.3090169943749477 -0.951056516295153 -0.809016994374947 0.5877852522924732 -0.587785252292473 -0.809016994374947 -0.951056516295153 0.3090169943749474 -0.809016994374947 -0.5877852522924733 -1. 0. -0.951056516295153 -0.3090169943749475 -0.951056516295154 -0.3090169943749474 -1. 0. -0.809016994374947 -0.587785252292473 -0.951056516295154 0.3090169943749472 -0.5877852522924733 -0.809016994374947 -0.809016994374948 0.587785252292473 -0.3090169943749475 -0.951056516295153 -0.5877852522924734 0.809016994374947 0. -1. -0.3090169943749476 0.951056516295153 0.3090169943749477 -0.951056516295153 0. 1. 0.587785252292473 -0.809016994374947 0.3090169943749472 0.951056516295154 0.809016994374947 -0.5877852522924733 0.5877852522924736 0.809016994374947 0.951056516295153 -0.3090169943749475 0.809016994374947 0.5877852522924741 1. 0. 0.951056516295153 0.3090169943749477 0.951056516295154 0.3090169943749472 0.951056516295154 -0.3090169943749474 0.951056516295153 0.3090169943749474 0.809016994374947 -0.587785252292473 0.809016994374947 0.5877852522924732 0.5877852522924733 -0.809016994374947 0.5877852522924732 0.809016994374947 0.3090169943749475 -0.951056516295153 0.3090169943749474 0.951056516295153 0. -1. 0. 1. -0.3090169943749477 -0.951056516295153 -0.3090169943749474 0.951056516295153 -0.587785252292473 -0.809016994374947 -0.5877852522924732 0.809016994374947 -0.809016994374947 -0.5877852522924733 -0.809016994374947 0.5877852522924732 -0.951056516295153 -0.3090169943749475 -0.951056516295153 0.3090169943749474 -1. 0. -1. 0. -0.951056516295154 0.3090169943749472 -0.951056516295154 -0.3090169943749474 -0.809016994374948 0.587785252292473 -0.809016994374947 -0.587785252292473 -0.5877852522924734 0.809016994374947 -0.5877852522924733 -0.809016994374947 -0.3090169943749476 0.951056516295153 -0.3090169943749475 -0.951056516295153 0. 1. 0. -1. 0.3090169943749472 0.951056516295154 0.3090169943749477 -0.951056516295153 0.5877852522924736 0.809016994374947 0.587785252292473 -0.809016994374947 0.809016994374947 0.5877852522924741 0.809016994374947 -0.5877852522924733 0.951056516295153 0.3090169943749477 0.951056516295153 -0.3090169943749475 1. 0. 1. 0. 0.809016994374947 -0.587785252292473 1. 0. 0.5877852522924733 -0.809016994374947 0.951056516295153 0.3090169943749474 0.3090169943749475 -0.951056516295153 0.809016994374947 0.5877852522924732 0. -1. 0.5877852522924732 0.809016994374947 -0.3090169943749477 -0.951056516295153 0.3090169943749474 0.951056516295153 -0.587785252292473 -0.809016994374947 0. 1. -0.809016994374947 -0.5877852522924733 -0.3090169943749474 0.951056516295153 -0.951056516295153 -0.3090169943749475 -0.5877852522924732 0.809016994374947 -1. 0. -0.809016994374947 0.5877852522924732 -0.951056516295154 0.3090169943749472 -0.951056516295153 0.3090169943749474 -0.809016994374948 0.587785252292473 -1. 0. -0.5877852522924734 0.809016994374947 -0.951056516295154 -0.3090169943749474 -0.3090169943749476 0.951056516295153 -0.809016994374947 -0.587785252292473 0. 1. -0.5877852522924733 -0.809016994374947 0.3090169943749472 0.951056516295154 -0.3090169943749475 -0.951056516295153 0.5877852522924736 0.809016994374947 0. -1. 0.809016994374947 0.5877852522924741 0.3090169943749477 -0.951056516295153 0.951056516295153 0.3090169943749477 0.587785252292473 -0.809016994374947 1. 0. 0.809016994374947 -0.5877852522924733 0.951056516295154 -0.3090169943749471 0.951056516295153 -0.3090169943749475 0.5877852522924733 -0.809016994374947 0.951056516295154 -0.3090169943749474 0.3090169943749475 -0.951056516295153 1. 0. 0. -1. 0.951056516295153 0.3090169943749474 -0.3090169943749477 -0.951056516295153 0.809016994374947 0.5877852522924732 -0.587785252292473 -0.809016994374947 0.5877852522924732 0.809016994374947 -0.809016994374947 -0.5877852522924733 0.3090169943749474 0.951056516295153 -0.951056516295153 -0.3090169943749475 0. 1. -1. 0. -0.3090169943749474 0.951056516295153 -0.951056516295154 0.3090169943749472 -0.5877852522924732 0.809016994374947 -0.809016994374948 0.587785252292473 -0.809016994374947 0.5877852522924732 -0.5877852522924734 0.809016994374947 -0.951056516295153 0.3090169943749474 -0.3090169943749476 0.951056516295153 -1. 0. 0. 1. -0.951056516295154 -0.3090169943749474 0.3090169943749472 0.951056516295154 -0.809016994374947 -0.587785252292473 0.5877852522924736 0.809016994374947 -0.5877852522924733 -0.809016994374947 0.809016994374947 0.5877852522924741 -0.3090169943749475 -0.951056516295153 0.951056516295153 0.3090169943749477 0. -1. 1. 0. 0.3090169943749477 -0.951056516295153 0.951056516295154 -0.3090169943749471 0.587785252292473 -0.809016994374947 0.809016994374948 -0.5877852522924729 0.809016994374947 -0.5877852522924733 0.3090169943749475 -0.951056516295153 0.809016994374947 -0.587785252292473 0. -1. 0.951056516295154 -0.3090169943749474 -0.3090169943749477 -0.951056516295153 1. 0. -0.587785252292473 -0.809016994374947 0.951056516295153 0.3090169943749474 -0.809016994374947 -0.5877852522924733 0.809016994374947 0.5877852522924732 -0.951056516295153 -0.3090169943749475 0.5877852522924732 0.809016994374947 -1. 0. 0.3090169943749474 0.951056516295153 -0.951056516295154 0.3090169943749472 0. 1. -0.809016994374948 0.587785252292473 -0.3090169943749474 0.951056516295153 -0.5877852522924734 0.809016994374947 -0.5877852522924732 0.809016994374947 -0.3090169943749476 0.951056516295153 -0.809016994374947 0.5877852522924732 0. 1. -0.951056516295153 0.3090169943749474 0.3090169943749472 0.951056516295154 -1. 0. 0.5877852522924736 0.809016994374947 -0.951056516295154 -0.3090169943749474 0.809016994374947 0.5877852522924741 -0.809016994374947 -0.587785252292473 0.951056516295153 0.3090169943749477 -0.5877852522924733 -0.809016994374947 1. 0. -0.3090169943749475 -0.951056516295153 0.951056516295154 -0.3090169943749471 0. -1. 0.809016994374948 -0.5877852522924729 0.3090169943749477 -0.951056516295153 0.5877852522924734 -0.809016994374947 0.587785252292473 -0.809016994374947 0. -1. 0.5877852522924733 -0.809016994374947 -0.3090169943749477 -0.951056516295153 0.809016994374947 -0.587785252292473 -0.587785252292473 -0.809016994374947 0.951056516295154 -0.3090169943749474 -0.809016994374947 -0.5877852522924733 1. 0. -0.951056516295153 -0.3090169943749475 0.951056516295153 0.3090169943749474 -1. 0. 0.809016994374947 0.5877852522924732 -0.951056516295154 0.3090169943749472 0.5877852522924732 0.809016994374947 -0.809016994374948 0.587785252292473 0.3090169943749474 0.951056516295153 -0.5877852522924734 0.809016994374947 0. 1. -0.3090169943749476 0.951056516295153 -0.3090169943749474 0.951056516295153 0. 1. -0.5877852522924732 0.809016994374947 0.3090169943749472 0.951056516295154 -0.809016994374947 0.5877852522924732 0.5877852522924736 0.809016994374947 -0.951056516295153 0.3090169943749474 0.809016994374947 0.5877852522924741 -1. 0. 0.951056516295153 0.3090169943749477 -0.951056516295154 -0.3090169943749474 1. 0. -0.809016994374947 -0.587785252292473 0.951056516295154 -0.3090169943749471 -0.5877852522924733 -0.809016994374947 0.809016994374948 -0.5877852522924729 -0.3090169943749475 -0.951056516295153 0.5877852522924734 -0.809016994374947 0. -1. 0.3090169943749478 -0.951056516295153 0.3090169943749477 -0.951056516295153 -0.3090169943749477 -0.951056516295153 0.3090169943749475 -0.951056516295153 -0.587785252292473 -0.809016994374947 0.5877852522924733 -0.809016994374947 -0.809016994374947 -0.5877852522924733 0.809016994374947 -0.587785252292473 -0.951056516295153 -0.3090169943749475 0.951056516295154 -0.3090169943749474 -1. 0. 1. 0. -0.951056516295154 0.3090169943749472 0.951056516295153 0.3090169943749474 -0.809016994374948 0.587785252292473 0.809016994374947 0.5877852522924732 -0.5877852522924734 0.809016994374947 0.5877852522924732 0.809016994374947 -0.3090169943749476 0.951056516295153 0.3090169943749474 0.951056516295153 0. 1. 0. 1. 0.3090169943749472 0.951056516295154 -0.3090169943749474 0.951056516295153 0.5877852522924736 0.809016994374947 -0.5877852522924732 0.809016994374947 0.809016994374947 0.5877852522924741 -0.809016994374947 0.5877852522924732 0.951056516295153 0.3090169943749477 -0.951056516295153 0.3090169943749474 1. 0. -1. 0. 0.951056516295154 -0.3090169943749471 -0.951056516295154 -0.3090169943749474 0.809016994374948 -0.5877852522924729 -0.809016994374947 -0.587785252292473 0.5877852522924734 -0.809016994374947 -0.5877852522924733 -0.809016994374947 0.3090169943749478 -0.951056516295153 -0.3090169943749475 -0.951056516295153 0. -1. 0. -1. -0.587785252292473 -0.809016994374947 0. -1. -0.809016994374947 -0.5877852522924733 0.3090169943749475 -0.951056516295153 -0.951056516295153 -0.3090169943749475 0.5877852522924733 -0.809016994374947 -1. 0. 0.809016994374947 -0.587785252292473 -0.951056516295154 0.3090169943749472 0.951056516295154 -0.3090169943749474 -0.809016994374948 0.587785252292473 1. 0. -0.5877852522924734 0.809016994374947 0.951056516295153 0.3090169943749474 -0.3090169943749476 0.951056516295153 0.809016994374947 0.5877852522924732 0. 1. 0.5877852522924732 0.809016994374947 0.3090169943749472 0.951056516295154 0.3090169943749474 0.951056516295153 0.5877852522924736 0.809016994374947 0. 1. 0.809016994374947 0.5877852522924741 -0.3090169943749474 0.951056516295153 0.951056516295153 0.3090169943749477 -0.5877852522924732 0.809016994374947 1. 0. -0.809016994374947 0.5877852522924732 0.951056516295154 -0.3090169943749471 -0.951056516295153 0.3090169943749474 0.809016994374948 -0.5877852522924729 -1. 0. 0.5877852522924734 -0.809016994374947 -0.951056516295154 -0.3090169943749474 0.3090169943749478 -0.951056516295153 -0.809016994374947 -0.587785252292473 0. -1. -0.5877852522924733 -0.809016994374947 -0.309016994374947 -0.951056516295154 -0.3090169943749475 -0.951056516295153 -0.809016994374947 -0.5877852522924733 -0.3090169943749477 -0.951056516295153 -0.951056516295153 -0.3090169943749475 0. -1. -1. 0. 0.3090169943749475 -0.951056516295153 -0.951056516295154 0.3090169943749472 0.5877852522924733 -0.809016994374947 -0.809016994374948 0.587785252292473 0.809016994374947 -0.587785252292473 -0.5877852522924734 0.809016994374947 0.951056516295154 -0.3090169943749474 -0.3090169943749476 0.951056516295153 1. 0. 0. 1. 0.951056516295153 0.3090169943749474 0.3090169943749472 0.951056516295154 0.809016994374947 0.5877852522924732 0.5877852522924736 0.809016994374947 0.5877852522924732 0.809016994374947 0.809016994374947 0.5877852522924741 0.3090169943749474 0.951056516295153 0.951056516295153 0.3090169943749477 0. 1. 1. 0. -0.3090169943749474 0.951056516295153 0.951056516295154 -0.3090169943749471 -0.5877852522924732 0.809016994374947 0.809016994374948 -0.5877852522924729 -0.809016994374947 0.5877852522924732 0.5877852522924734 -0.809016994374947 -0.951056516295153 0.3090169943749474 0.3090169943749478 -0.951056516295153 -1. 0. 0. -1. -0.951056516295154 -0.3090169943749474 -0.309016994374947 -0.951056516295154 -0.809016994374947 -0.587785252292473 -0.5877852522924729 -0.809016994374948 -0.5877852522924733 -0.809016994374947 -0.951056516295153 -0.3090169943749475 -0.587785252292473 -0.809016994374947 -1. 0. -0.3090169943749477 -0.951056516295153 -0.951056516295154 0.3090169943749472 0. -1. -0.809016994374948 0.587785252292473 0.3090169943749475 -0.951056516295153 -0.5877852522924734 0.809016994374947 0.5877852522924733 -0.809016994374947 -0.3090169943749476 0.951056516295153 0.809016994374947 -0.587785252292473 0. 1. 0.951056516295154 -0.3090169943749474 0.3090169943749472 0.951056516295154 1. 0. 0.5877852522924736 0.809016994374947 0.951056516295153 0.3090169943749474 0.809016994374947 0.5877852522924741 0.809016994374947 0.5877852522924732 0.951056516295153 0.3090169943749477 0.5877852522924732 0.809016994374947 1. 0. 0.3090169943749474 0.951056516295153 0.951056516295154 -0.3090169943749471 0. 1. 0.809016994374948 -0.5877852522924729 -0.3090169943749474 0.951056516295153 0.5877852522924734 -0.809016994374947 -0.5877852522924732 0.809016994374947 0.3090169943749478 -0.951056516295153 -0.809016994374947 0.5877852522924732 0. -1. -0.951056516295153 0.3090169943749474 -0.309016994374947 -0.951056516295154 -1. 0. -0.5877852522924729 -0.809016994374948 -0.951056516295154 -0.3090169943749474 -0.809016994374947 -0.5877852522924735 -0.809016994374947 -0.587785252292473 -1. 0. -0.809016994374947 -0.5877852522924733 -0.951056516295154 0.3090169943749472 -0.587785252292473 -0.809016994374947 -0.809016994374948 0.587785252292473 -0.3090169943749477 -0.951056516295153 -0.5877852522924734 0.809016994374947 0. -1. -0.3090169943749476 0.951056516295153 0.3090169943749475 -0.951056516295153 0. 1. 0.5877852522924733 -0.809016994374947 0.3090169943749472 0.951056516295154 0.809016994374947 -0.587785252292473 0.5877852522924736 0.809016994374947 0.951056516295154 -0.3090169943749474 0.809016994374947 0.5877852522924741 1. 0. 0.951056516295153 0.3090169943749477 0.951056516295153 0.3090169943749474 1. 0. 0.809016994374947 0.5877852522924732 0.951056516295154 -0.3090169943749471 0.5877852522924732 0.809016994374947 0.809016994374948 -0.5877852522924729 0.3090169943749474 0.951056516295153 0.5877852522924734 -0.809016994374947 0. 1. 0.3090169943749478 -0.951056516295153 -0.3090169943749474 0.951056516295153 0. -1. -0.5877852522924732 0.809016994374947 -0.309016994374947 -0.951056516295154 -0.809016994374947 0.5877852522924732 -0.5877852522924729 -0.809016994374948 -0.951056516295153 0.3090169943749474 -0.809016994374947 -0.5877852522924735 -1. 0. -0.951056516295153 -0.3090169943749478 -0.951056516295154 -0.3090169943749474 -0.951056516295154 0.3090169943749472 -0.951056516295153 -0.3090169943749475 -0.809016994374948 0.587785252292473 -0.809016994374947 -0.5877852522924733 -0.5877852522924734 0.809016994374947 -0.587785252292473 -0.809016994374947 -0.3090169943749476 0.951056516295153 -0.3090169943749477 -0.951056516295153 0. 1. 0. -1. 0.3090169943749472 0.951056516295154 0.3090169943749475 -0.951056516295153 0.5877852522924736 0.809016994374947 0.5877852522924733 -0.809016994374947 0.809016994374947 0.5877852522924741 0.809016994374947 -0.587785252292473 0.951056516295153 0.3090169943749477 0.951056516295154 -0.3090169943749474 1. 0. 1. 0. 0.951056516295154 -0.3090169943749471 0.951056516295153 0.3090169943749474 0.809016994374948 -0.5877852522924729 0.809016994374947 0.5877852522924732 0.5877852522924734 -0.809016994374947 0.5877852522924732 0.809016994374947 0.3090169943749478 -0.951056516295153 0.3090169943749474 0.951056516295153 0. -1. 0. 1. -0.309016994374947 -0.951056516295154 -0.3090169943749474 0.951056516295153 -0.5877852522924729 -0.809016994374948 -0.5877852522924732 0.809016994374947 -0.809016994374947 -0.5877852522924735 -0.809016994374947 0.5877852522924732 -0.951056516295153 -0.3090169943749478 -0.951056516295153 0.3090169943749474 -1. 0. -1. 0. -0.809016994374948 0.587785252292473 -1. 0. -0.5877852522924734 0.809016994374947 -0.951056516295153 -0.3090169943749475 -0.3090169943749476 0.951056516295153 -0.809016994374947 -0.5877852522924733 0. 1. -0.587785252292473 -0.809016994374947 0.3090169943749472 0.951056516295154 -0.3090169943749477 -0.951056516295153 0.5877852522924736 0.809016994374947 0. -1. 0.809016994374947 0.5877852522924741 0.3090169943749475 -0.951056516295153 0.951056516295153 0.3090169943749477 0.5877852522924733 -0.809016994374947 1. 0. 0.809016994374947 -0.587785252292473 0.951056516295154 -0.3090169943749471 0.951056516295154 -0.3090169943749474 0.809016994374948 -0.5877852522924729 1. 0. 0.5877852522924734 -0.809016994374947 0.951056516295153 0.3090169943749474 0.3090169943749478 -0.951056516295153 0.809016994374947 0.5877852522924732 0. -1. 0.5877852522924732 0.809016994374947 -0.309016994374947 -0.951056516295154 0.3090169943749474 0.951056516295153 -0.5877852522924729 -0.809016994374948 0. 1. -0.809016994374947 -0.5877852522924735 -0.3090169943749474 0.951056516295153 -0.951056516295153 -0.3090169943749478 -0.5877852522924732 0.809016994374947 -1. 0. -0.809016994374947 0.5877852522924732 -0.951056516295154 0.309016994374947 -0.951056516295153 0.3090169943749474 -0.5877852522924734 0.809016994374947 -0.951056516295154 0.3090169943749472 -0.3090169943749476 0.951056516295153 -1. 0. 0. 1. -0.951056516295153 -0.3090169943749475 0.3090169943749472 0.951056516295154 -0.809016994374947 -0.5877852522924733 0.5877852522924736 0.809016994374947 -0.587785252292473 -0.809016994374947 0.809016994374947 0.5877852522924741 -0.3090169943749477 -0.951056516295153 0.951056516295153 0.3090169943749477 0. -1. 1. 0. 0.3090169943749475 -0.951056516295153 0.951056516295154 -0.3090169943749471 0.5877852522924733 -0.809016994374947 0.809016994374948 -0.5877852522924729 0.809016994374947 -0.587785252292473 0.5877852522924734 -0.809016994374947 0.951056516295154 -0.3090169943749474 0.3090169943749478 -0.951056516295153 1. 0. 0. -1. 0.951056516295153 0.3090169943749474 -0.309016994374947 -0.951056516295154 0.809016994374947 0.5877852522924732 -0.5877852522924729 -0.809016994374948 0.5877852522924732 0.809016994374947 -0.809016994374947 -0.5877852522924735 0.3090169943749474 0.951056516295153 -0.951056516295153 -0.3090169943749478 0. 1. -1. 0. -0.3090169943749474 0.951056516295153 -0.951056516295154 0.309016994374947 -0.5877852522924732 0.809016994374947 -0.809016994374948 0.5877852522924729 -0.809016994374947 0.5877852522924732 -0.3090169943749476 0.951056516295153 -0.809016994374948 0.587785252292473 0. 1. -0.951056516295154 0.3090169943749472 0.3090169943749472 0.951056516295154 -1. 0. 0.5877852522924736 0.809016994374947 -0.951056516295153 -0.3090169943749475 0.809016994374947 0.5877852522924741 -0.809016994374947 -0.5877852522924733 0.951056516295153 0.3090169943749477 -0.587785252292473 -0.809016994374947 1. 0. -0.3090169943749477 -0.951056516295153 0.951056516295154 -0.3090169943749471 0. -1. 0.809016994374948 -0.5877852522924729 0.3090169943749475 -0.951056516295153 0.5877852522924734 -0.809016994374947 0.5877852522924733 -0.809016994374947 0.3090169943749478 -0.951056516295153 0.809016994374947 -0.587785252292473 0. -1. 0.951056516295154 -0.3090169943749474 -0.309016994374947 -0.951056516295154 1. 0. -0.5877852522924729 -0.809016994374948 0.951056516295153 0.3090169943749474 -0.809016994374947 -0.5877852522924735 0.809016994374947 0.5877852522924732 -0.951056516295153 -0.3090169943749478 0.5877852522924732 0.809016994374947 -1. 0. 0.3090169943749474 0.951056516295153 -0.951056516295154 0.309016994374947 0. 1. -0.809016994374948 0.5877852522924729 -0.3090169943749474 0.951056516295153 -0.5877852522924735 0.809016994374947 -0.5877852522924732 0.809016994374947 0. 1. -0.5877852522924734 0.809016994374947 0.3090169943749472 0.951056516295154 -0.809016994374948 0.587785252292473 0.5877852522924736 0.809016994374947 -0.951056516295154 0.3090169943749472 0.809016994374947 0.5877852522924741 -1. 0. 0.951056516295153 0.3090169943749477 -0.951056516295153 -0.3090169943749475 1. 0. -0.809016994374947 -0.5877852522924733 0.951056516295154 -0.3090169943749471 -0.587785252292473 -0.809016994374947 0.809016994374948 -0.5877852522924729 -0.3090169943749477 -0.951056516295153 0.5877852522924734 -0.809016994374947 0. -1. 0.3090169943749478 -0.951056516295153 0.3090169943749475 -0.951056516295153 0. -1. 0.5877852522924733 -0.809016994374947 -0.309016994374947 -0.951056516295154 0.809016994374947 -0.587785252292473 -0.5877852522924729 -0.809016994374948 0.951056516295154 -0.3090169943749474 -0.809016994374947 -0.5877852522924735 1. 0. -0.951056516295153 -0.3090169943749478 0.951056516295153 0.3090169943749474 -1. 0. 0.809016994374947 0.5877852522924732 -0.951056516295154 0.309016994374947 0.5877852522924732 0.809016994374947 -0.809016994374948 0.5877852522924729 0.3090169943749474 0.951056516295153 -0.5877852522924735 0.809016994374947 0. 1. -0.3090169943749479 0.951056516295153 -0.3090169943749474 0.951056516295153 0.3090169943749472 0.951056516295154 -0.3090169943749476 0.951056516295153 0.5877852522924736 0.809016994374947 -0.5877852522924734 0.809016994374947 0.809016994374947 0.5877852522924741 -0.809016994374948 0.587785252292473 0.951056516295153 0.3090169943749477 -0.951056516295154 0.3090169943749472 1. 0. -1. 0. 0.951056516295154 -0.3090169943749471 -0.951056516295153 -0.3090169943749475 0.809016994374948 -0.5877852522924729 -0.809016994374947 -0.5877852522924733 0.5877852522924734 -0.809016994374947 -0.587785252292473 -0.809016994374947 0.3090169943749478 -0.951056516295153 -0.3090169943749477 -0.951056516295153 0. -1. 0. -1. -0.309016994374947 -0.951056516295154 0.3090169943749475 -0.951056516295153 -0.5877852522924729 -0.809016994374948 0.5877852522924733 -0.809016994374947 -0.809016994374947 -0.5877852522924735 0.809016994374947 -0.587785252292473 -0.951056516295153 -0.3090169943749478 0.951056516295154 -0.3090169943749474 -1. 0. 1. 0. -0.951056516295154 0.309016994374947 0.951056516295153 0.3090169943749474 -0.809016994374948 0.5877852522924729 0.809016994374947 0.5877852522924732 -0.5877852522924735 0.809016994374947 0.5877852522924732 0.809016994374947 -0.3090169943749479 0.951056516295153 0.3090169943749474 0.951056516295153 0. 1. 0. 1. geomview-1.9.4/data/geom/spherical/simplex.off0000644000175000001440000000047107730233053016257 000000000000004OFF 5 10 10 3.8541 -.618 -.618 -.618 -.618 3.8541 -.618 -.618 -.618 -.618 3.8541 -.618 -.618 -.618 -.618 3.8541 -2 -2 -2 -2 3 0 1 2 .7 .35 0 3 0 1 3 0 .7 .35 3 0 1 4 .35 0 .7 3 0 2 3 .35 .7 0 3 0 2 4 .7 0 .35 3 0 3 4 0 .35 .7 3 1 2 3 .35 .35 .35 3 1 2 4 .7 0 0 3 1 3 4 0 .7 0 3 2 3 4 0 0 .7 geomview-1.9.4/data/geom/spherical/hypercube.off0000644000175000001440000000153207730233050016560 000000000000004OFF 16 24 32 -1. -1. -1. -1. -1. -1. -1. 1. -1. -1. 1. -1. -1. -1. 1. 1. -1. 1. -1. -1. -1. 1. -1. 1. -1. 1. 1. -1. -1. 1. 1. 1. 1. -1. -1. -1. 1. -1. -1. 1. 1. -1. 1. -1. 1. -1. 1. 1. 1. 1. -1. -1. 1. 1. -1. 1. 1. 1. 1. -1. 1. 1. 1. 1. 4 0 1 3 2 200 100 200 4 0 1 5 4 100 200 200 4 0 1 9 8 200 000 200 4 0 2 6 4 200 100 200 4 0 2 10 8 000 000 000 4 0 4 12 8 100 000 000 4 1 3 7 5 200 000 000 4 1 3 11 9 000 100 000 4 1 5 13 9 100 100 000 4 2 3 7 6 200 100 000 4 2 3 11 10 000 200 000 4 2 6 14 10 100 200 000 4 3 7 15 11 200 200 000 4 4 5 7 6 000 000 100 4 4 5 13 12 100 000 100 4 4 6 14 12 200 000 100 4 5 7 15 13 000 100 100 4 6 7 15 14 100 100 100 4 8 9 11 10 200 100 100 4 8 9 13 12 000 200 100 4 8 10 14 12 100 200 100 4 9 11 15 13 200 200 100 4 10 11 15 14 000 000 200 4 12 13 15 14 100 000 200 geomview-1.9.4/data/geom/torus8.oogl0000644000175000001440000000470310622716740014263 00000000000000INST transforms { TLIST # Reflect about X and Z axes 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 } geom { LIST { INST transform # Semicircular ends of torus 1 0 0 0 0 1 0 0 0 0 1 0 14 0 0 1 geom < pieces/linkA.bez } { INST transforms { TLIST # Joining pieces 1 0 0 0 0 1 0 0 0 0 1 0 -14 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -14 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 -10 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -10 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 -6 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -6 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 -2 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 6 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 6 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 10 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 10 0 0 1 } geom { < pieces/linkB.bez } } } # #! /bin/sh # # case "$1" in # [0-9]*) ;; # *) # echo "Usage: mktorus nholes >torus.oogl # Constructs an N-holed torus using Bezier patch pieces in the data directory. # setenv GEOM_PATH /data when displaying the resulting objects # if you're not already in the data directory." >&2 # exit 1 # ;; # esac # # awk ' # BEGIN { # n = '$1'; # xfmt = "\t1 0 0 0\n\t0 %g 0 0\n\t0 0 1 0\n\t%g 0 0 1\n\n"; # print "INST transforms { TLIST # Reflect about X and Z axes"; # print " 1 0 0 0\n 0 1 0 0\n 0 0 1 0\n 0 0 0 1\n"; # print " 1 0 0 0\n 0 1 0 0\n 0 0 -1 0\n 0 0 0 1\n"; # print " -1 0 0 0\n 0 1 0 0\n 0 0 1 0\n 0 0 0 1\n"; # print " -1 0 0 0\n 0 1 0 0\n 0 0 -1 0\n 0 0 0 1\n"; # print " } geom {"; # print " LIST"; # print " { INST transform # Semicircular ends of torus"; # printf xfmt, 1, 2*(n-1); # print " geom < pieces/linkA.bez"; # print " }"; # if(n > 1) { # print " { INST transforms { TLIST # Joining pieces" # for(i = 0; i < n-1; i++) { # printf xfmt, 1, 4*i - 2*n + 2; # printf xfmt, -1, 4*i - 2*n + 2; # } # print " } geom { < pieces/linkB.bez }"; # print " }"; # } # print " }"; # exit # }' # geomview-1.9.4/data/geom/xyz.grp0000644000175000001440000000106707730233151013475 00000000000000 GROUP 1 0 0 0 0 1 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 -1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 -1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 -1 -1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 1 -1 1 1 0 0 0 0 1 0 0 0 0 1 0 -1 1 -1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 -1 -1 1 1 0 0 0 0 1 0 0 0 0 1 0 -1 -1 -1 1 unit { = VECT 8 19 3 2 2 2 2 2 3 2 4 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 0 0 0 0 1 0 -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 0 0 0 0 0 1 -.05 .25 1 .05 .25 1 -.05 .05 1 .05 .05 1 1 0 0 1 0 1 0 1 0 .6 1 1 } geomview-1.9.4/data/geom/abstr.off0000644000175000001440000000267507730233043013746 00000000000000OFF #created by dirichlet domain computation. 36 20 54 -0.586233 0.192482 -0.019732 -0.344233 0.301871 0.358301 0.344233 -0.301871 0.358301 0.179112 -0.514398 -0.290554 0.011612 -0.564879 0.137037 -0.011612 0.564879 0.137037 -0.179112 0.514398 -0.290554 -0.151548 -0.185001 -0.529915 -0.055686 -0.430284 -0.411612 -0.364663 -0.382652 -0.277601 -0.394163 -0.151218 -0.422176 0.055686 0.430284 -0.411612 0.364663 0.382652 -0.277601 0.394163 0.151218 -0.422176 0.151548 0.185001 -0.529915 0.361372 0.268614 0.393607 0.246149 0.511456 0.185169 0.417404 0.426728 -0.011876 0.510787 0.234322 0.148969 -0.361372 -0.268614 0.393608 -0.510787 -0.234322 0.148969 -0.417404 -0.426728 -0.011876 -0.246149 -0.511456 0.185169 0.430396 -0.334808 -0.249032 0.586233 -0.192482 -0.019732 0.587567 -0.188189 -0.021408 0.509201 -0.136702 -0.282307 -0.430396 0.334808 -0.249032 -0.509201 0.136702 -0.282307 -0.587567 0.188189 -0.021408 -0.272269 -0.118712 0.520703 -0.248355 0.095223 0.535651 0.272269 0.118712 0.520703 -0.000222 0.002388 0.617335 0.000222 -0.002388 0.617335 0.248355 -0.095223 0.535651 7 32 15 18 25 24 2 35 9 7 35 2 4 22 19 30 34 6 7 33 31 1 5 16 15 32 7 7 28 10 7 14 11 6 27 7 7 3 23 26 13 14 7 8 6 5 27 6 5 1 0 8 5 2 24 23 3 4 8 7 1 31 30 19 20 29 0 9 6 29 20 21 9 10 28 10 6 13 26 25 18 17 12 11 6 22 4 3 8 9 21 11 6 12 17 16 5 6 11 10 4 8 7 10 9 12 4 12 11 14 13 13 4 15 16 17 18 13 4 20 19 22 21 12 4 23 24 25 26 14 4 28 27 0 29 15 4 34 30 31 33 15 4 33 32 35 34 14 geomview-1.9.4/data/geom/antoine0.oogl0000644000175000001440000000052107730233074014526 00000000000000VECT 1 16 1 -16 1 0 0 1 0.382683 0 0.92388 0.707106 0 0.707107 0.923879 0 0.382684 1 0 1.32679e-06 0.92388 0 -0.382682 0.707108 0 -0.707105 0.382686 0 -0.923879 2.65359e-06 0 -1 -0.382681 0 -0.923881 -0.707104 0 -0.707109 -0.923878 0 -0.382687 -1 0 -3.98038e-06 -0.923881 0 0.382679 -0.70711 0 0.707103 -0.382688 0 0.923878 1 .8 .1 1 geomview-1.9.4/data/geom/antoine1.oogl0000644000175000001440000000454707730233074014543 00000000000000GROUP 1 0 0 0 0 1 0 0 0 0 1 0 0.75 0 0 1. 0.309017 0. 0.951057 0. 0. 1. 0. 0. -0.951057 0. 0.309017 0. 0.231763 0. 0.713292 1. -0.809017 0. 0.587785 0. 0. 1. 0. 0. -0.587785 0. -0.809017 0. -0.606763 0. 0.440839 1. -0.809017 0. -0.587785 0. 0. 1. 0. 0. 0.587785 0. -0.809017 0. -0.606763 0. -0.440839 1. 0.309017 0. -0.951057 0. 0. 1. 0. 0. 0.951057 0. 0.309017 0. 0.231763 0. -0.713292 1. 0. -1. 0. 0. 0.809017 0. 0.587785 0. -0.587785 0. 0.809017 0. 0.566312 0. 0.41145 1. 0. -1. 0. 0. -0.309017 0. 0.951057 0. -0.951057 0. -0.309017 0. -0.216312 0. 0.66574 1. 0. -1. 0. 0. -1. 0. 0. 0. 0. 0. -1. 0. -0.7 0. 0.0 1. 0. -1. 0. 0. -0.309017 0. -0.951057 0. 0.951057 0. -0.309017 0. -0.216312 0. -0.66574 1. 0. -1. 0. 0. 0.809017 0. -0.587785 0. 0.587785 0. 0.809017 0. 0.566312 0. -0.41145 1. unit { = INST transform .35 0 0 0 0 .4 0 0 0 0 .48 0 0 0 0 1 unit < antoine0.oogl } geomview-1.9.4/data/geom/moebius.4d.mesh0000644000175000001440000000676207730233125014770 000000000000004MESH 11 11 0. 0. 0. 3 -0.309017 0. 0. 2.951057 -0.587785 0. 0. 2.809017 -0.809017 0. 0. 2.587785 -0.951057 0. 0. 2.309017 -1. 0. 0. 2 -0.951057 0. 0. 1.690983 -0.809017 0. 0. 1.412215 -0.587785 0. 0. 1.190983 -0.309017 0. 0. 1.048943 0. 0. 0. 1 0. 0. -0.309017 2.951057 -0.25 -0.181636 -0.293893 2.904508 -0.475528 -0.345492 -0.25 2.769421 -0.654508 -0.475528 -0.181636 2.559017 -0.769421 -0.559017 -0.0954915 2.293893 -0.809017 -0.587785 0. 2 -0.769421 -0.559017 0.0954915 1.706107 -0.654508 -0.475528 0.181636 1.440983 -0.475528 -0.345492 0.25 1.230579 -0.25 -0.181636 0.293893 1.095492 0. 0. 0.309017 1.048943 0. 0. -0.587785 2.809017 -0.0954915 -0.293893 -0.559017 2.769421 -0.181636 -0.559017 -0.475528 2.654508 -0.25 -0.769421 -0.345492 2.475528 -0.293893 -0.904508 -0.181636 2.25 -0.309017 -0.951057 0. 2 -0.293893 -0.904508 0.181636 1.75 -0.25 -0.769421 0.345492 1.524472 -0.181636 -0.559017 0.475528 1.345492 -0.0954915 -0.293893 0.559017 1.230579 0. 0. 0.587785 1.190983 0. 0. -0.809017 2.587785 0.0954915 -0.293893 -0.769421 2.559017 0.181636 -0.559017 -0.654508 2.475528 0.25 -0.769421 -0.475528 2.345492 0.293893 -0.904508 -0.25 2.181636 0.309017 -0.951057 0. 2 0.293893 -0.904508 0.25 1.818364 0.25 -0.769421 0.475528 1.654508 0.181636 -0.559017 0.654508 1.524472 0.0954915 -0.293893 0.769421 1.440983 0. 0. 0.809017 1.412215 0. 0. -0.951057 2.309017 0.25 -0.181636 -0.904508 2.293893 0.475528 -0.345492 -0.769421 2.25 0.654508 -0.475528 -0.559017 2.181636 0.769421 -0.559017 -0.293893 2.095492 0.809017 -0.587785 0. 2 0.769421 -0.559017 0.293893 1.904508 0.654508 -0.475528 0.559017 1.818364 0.475528 -0.345492 0.769421 1.75 0.25 -0.181636 0.904508 1.706107 0. 0. 0.951057 1.690983 0. 0. -1. 2 0.309017 0. -0.951057 2 0.587785 0. -0.809017 2 0.809017 0. -0.587785 2 0.951057 0. -0.309017 2 1. 0. 0. 2 0.951057 0. 0.309017 2 0.809017 0. 0.587785 2 0.587785 0. 0.809017 2 0.309017 0. 0.951057 2 0. 0. 1. 2 0. 0. -0.951057 1.690983 0.25 0.181636 -0.904508 1.706107 0.475528 0.345492 -0.769421 1.75 0.654508 0.475528 -0.559017 1.818364 0.769421 0.559017 -0.293893 1.904508 0.809017 0.587785 0. 2 0.769421 0.559017 0.293893 2.095492 0.654508 0.475528 0.559017 2.181636 0.475528 0.345492 0.769421 2.25 0.25 0.181636 0.904508 2.293893 0. 0. 0.951057 2.309017 0. 0. -0.809017 1.412215 0.0954915 0.293893 -0.769421 1.440983 0.181636 0.559017 -0.654508 1.524472 0.25 0.769421 -0.475528 1.654508 0.293893 0.904508 -0.25 1.818364 0.309017 0.951057 0. 2 0.293893 0.904508 0.25 2.181636 0.25 0.769421 0.475528 2.345492 0.181636 0.559017 0.654508 2.475528 0.0954915 0.293893 0.769421 2.559017 0. 0. 0.809017 2.587785 0. 0. -0.587785 1.190983 -0.0954915 0.293893 -0.559017 1.230579 -0.181636 0.559017 -0.475528 1.345492 -0.25 0.769421 -0.345492 1.524472 -0.293893 0.904508 -0.181636 1.75 -0.309017 0.951057 0. 2 -0.293893 0.904508 0.181636 2.25 -0.25 0.769421 0.345492 2.475528 -0.181636 0.559017 0.475528 2.654508 -0.0954915 0.293893 0.559017 2.769421 0. 0. 0.587785 2.809017 0. 0. -0.309017 1.048943 -0.25 0.181636 -0.293893 1.095492 -0.475528 0.345492 -0.25 1.230579 -0.654508 0.475528 -0.181636 1.440983 -0.769421 0.559017 -0.0954915 1.706107 -0.809017 0.587785 0. 2 -0.769421 0.559017 0.0954915 2.293893 -0.654508 0.475528 0.181636 2.559017 -0.475528 0.345492 0.25 2.769421 -0.25 0.181636 0.293893 2.904508 0. 0. 0.309017 2.951057 0. 0. 0. 1 -0.309017 0. 0. 1.048943 -0.587785 0. 0. 1.190983 -0.809017 0. 0. 1.412215 -0.951057 0. 0. 1.690983 -1. 0. 0. 2 -0.951057 0. 0. 2.309017 -0.809017 0. 0. 2.587785 -0.587785 0. 0. 2.809017 -0.309017 0. 0. 2.951057 0. 0. 0. 3 geomview-1.9.4/data/geom/dodec.off0000644000175000001440000000142307730233110013672 00000000000000OFF 20 12 30 1.214124 0.000000 1.589309 0.375185 1.154701 1.589309 -0.982247 0.713644 1.589309 -0.982247 -0.713644 1.589309 0.375185 -1.154701 1.589309 1.964494 0.000000 0.375185 0.607062 1.868345 0.375185 -1.589309 1.154701 0.375185 -1.589309 -1.154701 0.375185 0.607062 -1.868345 0.375185 1.589309 1.154701 -0.375185 -0.607062 1.868345 -0.375185 -1.964494 0.000000 -0.375185 -0.607062 -1.868345 -0.375185 1.589309 -1.154701 -0.375185 0.982247 0.713644 -1.589309 -0.375185 1.154701 -1.589309 -1.214124 0.000000 -1.589309 -0.375185 -1.154701 -1.589309 0.982247 -0.713644 -1.589309 5 0 1 2 3 4 5 0 5 10 6 1 5 1 6 11 7 2 5 2 7 12 8 3 5 3 8 13 9 4 5 4 9 14 5 0 5 15 10 5 14 19 5 16 11 6 10 15 5 17 12 7 11 16 5 18 13 8 12 17 5 19 14 9 13 18 5 19 18 17 16 15 geomview-1.9.4/data/geom/antoine2.oogl0000644000175000001440000000507707730233075014544 00000000000000GROUP 1 0 0 0 0 1 0 0 0 0 1 0 0.75 0 0 1. 0.309017 0. 0.951057 0. 0. 1. 0. 0. -0.951057 0. 0.309017 0. 0.231763 0. 0.713292 1. -0.809017 0. 0.587785 0. 0. 1. 0. 0. -0.587785 0. -0.809017 0. -0.606763 0. 0.440839 1. -0.809017 0. -0.587785 0. 0. 1. 0. 0. 0.587785 0. -0.809017 0. -0.606763 0. -0.440839 1. 0.309017 0. -0.951057 0. 0. 1. 0. 0. 0.951057 0. 0.309017 0. 0.231763 0. -0.713292 1. 0. -1. 0. 0. 0.809017 0. 0.587785 0. -0.587785 0. 0.809017 0. 0.566312 0. 0.41145 1. 0. -1. 0. 0. -0.309017 0. 0.951057 0. -0.951057 0. -0.309017 0. -0.216312 0. 0.66574 1. 0. -1. 0. 0. -1. 0. 0. 0. 0. 0. -1. 0. -0.7 0. 0.0 1. 0. -1. 0. 0. -0.309017 0. -0.951057 0. 0.951057 0. -0.309017 0. -0.216312 0. -0.66574 1. 0. -1. 0. 0. 0.809017 0. -0.587785 0. 0.587785 0. 0.809017 0. 0.566312 0. -0.41145 1. unit { = INST transform .35 0 0 0 0 .4 0 0 0 0 .48 0 0 0 0 1 unit < antoine1.oogl } geomview-1.9.4/data/geom/jungle.list0000644000175000001440000000627207730233120014311 00000000000000LIST { appearance {linewidth 3} LIST # first, the x, y, and z labels { VECT 5 13 0 2 2 2 3 4 0 0 0 0 0 # the x: 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 # the y: -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 # the z: -.05 .25 1 .05 .25 1 -.05 .05 1 .05 .05 1 } # make an object to inst. # now make a list of the 3 instances of oneaxis, one for each axis. { LIST { appearance {material {edgecolor 1 0 0} } INST transform 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 unit { define oneaxis { VECT 37 74 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 -0.9 .05 0 -0.9 -.05 0 -0.9 0 .05 -0.9 0 -.05 -0.8 .05 0 -0.8 -.05 0 -0.8 0 .05 -0.8 0 -.05 -0.7 .05 0 -0.7 -.05 0 -0.7 0 .05 -0.7 0 -.05 -0.6 .05 0 -0.6 -.05 0 -0.6 0 .05 -0.6 0 -.05 -0.5 .05 0 -0.5 -.05 0 -0.5 0 .05 -0.5 0 -.05 -0.4 .05 0 -0.4 -.05 0 -0.4 0 .05 -0.4 0 -.05 -0.3 .05 0 -0.3 -.05 0 -0.3 0 .05 -0.3 0 -.05 -0.2 .05 0 -0.2 -.05 0 -0.2 0 .05 -0.2 0 -.05 -0.1 .05 0 -0.1 -.05 0 -0.1 0 .05 -0.1 0 -.05 0.1 .05 0 0.1 -.05 0 0.1 0 .05 0.1 0 -.05 0.2 .05 0 0.2 -.05 0 0.2 0 .05 0.2 0 -.05 0.3 .05 0 0.3 -.05 0 0.3 0 .05 0.3 0 -.05 0.4 .05 0 0.4 -.05 0 0.4 0 .05 0.4 0 -.05 0.5 .05 0 0.5 -.05 0 0.5 0 .05 0.5 0 -.05 0.6 .05 0 0.6 -.05 0 0.6 0 .05 0.6 0 -.05 0.7 .05 0 0.7 -.05 0 0.7 0 .05 0.7 0 -.05 0.8 .05 0 0.8 -.05 0 0.8 0 .05 0.8 0 -.05 0.9 .05 0 0.9 -.05 0 0.9 0 .05 0.9 0 -.05 } } } { appearance {material {edgecolor 0 1 0} } INST transform 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 unit : oneaxis } { appearance {material {edgecolor 0 0 1} } INST transform 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 unit : oneaxis } } } { INST transforms { TLIST 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 } geom { INST transforms { TLIST 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.2 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.4 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.6 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.8 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -0.2 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -0.4 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -0.6 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -0.8 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -1 1 } geom { VECT 11 22 0 2 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 .2 -1 0 .2 1 0 .4 -1 0 .4 1 0 .6 -1 0 .6 1 0 .8 -1 0 .8 1 0 1 -1 0 1 1 0 -0.2 -1 0 -0.2 1 0 -0.4 -1 0 -0.4 1 0 -0.6 -1 0 -0.6 1 0 -0.8 -1 0 -0.8 1 0 -1 -1 0 -1 1 0 } } } geomview-1.9.4/data/geom/antoine3.oogl0000644000175000001440000000507707730233075014545 00000000000000GROUP 1 0 0 0 0 1 0 0 0 0 1 0 0.75 0 0 1. 0.309017 0. 0.951057 0. 0. 1. 0. 0. -0.951057 0. 0.309017 0. 0.231763 0. 0.713292 1. -0.809017 0. 0.587785 0. 0. 1. 0. 0. -0.587785 0. -0.809017 0. -0.606763 0. 0.440839 1. -0.809017 0. -0.587785 0. 0. 1. 0. 0. 0.587785 0. -0.809017 0. -0.606763 0. -0.440839 1. 0.309017 0. -0.951057 0. 0. 1. 0. 0. 0.951057 0. 0.309017 0. 0.231763 0. -0.713292 1. 0. -1. 0. 0. 0.809017 0. 0.587785 0. -0.587785 0. 0.809017 0. 0.566312 0. 0.41145 1. 0. -1. 0. 0. -0.309017 0. 0.951057 0. -0.951057 0. -0.309017 0. -0.216312 0. 0.66574 1. 0. -1. 0. 0. -1. 0. 0. 0. 0. 0. -1. 0. -0.7 0. 0.0 1. 0. -1. 0. 0. -0.309017 0. -0.951057 0. 0.951057 0. -0.309017 0. -0.216312 0. -0.66574 1. 0. -1. 0. 0. 0.809017 0. -0.587785 0. 0.587785 0. 0.809017 0. 0.566312 0. -0.41145 1. unit { = INST transform .35 0 0 0 0 .4 0 0 0 0 .48 0 0 0 0 1 unit < antoine2.oogl } geomview-1.9.4/data/geom/axes.list0000644000175000001440000000440207730233076013770 00000000000000{ LIST # first, the x, y, and z labels { VECT 5 13 0 2 2 2 3 4 0 0 0 0 0 # the x: 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 # the y: -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 # the z: -.05 .25 1 .05 .25 1 -.05 .05 1 .05 .05 1 } # make an object to inst. # now make a list of the 3 instances of oneaxis, one for each axis. { LIST { appearance {material {edgecolor 1 0 0} } INST transform 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 unit { define oneaxis { VECT 37 74 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 -0.9 .05 0 -0.9 -.05 0 -0.9 0 .05 -0.9 0 -.05 -0.8 .05 0 -0.8 -.05 0 -0.8 0 .05 -0.8 0 -.05 -0.7 .05 0 -0.7 -.05 0 -0.7 0 .05 -0.7 0 -.05 -0.6 .05 0 -0.6 -.05 0 -0.6 0 .05 -0.6 0 -.05 -0.5 .05 0 -0.5 -.05 0 -0.5 0 .05 -0.5 0 -.05 -0.4 .05 0 -0.4 -.05 0 -0.4 0 .05 -0.4 0 -.05 -0.3 .05 0 -0.3 -.05 0 -0.3 0 .05 -0.3 0 -.05 -0.2 .05 0 -0.2 -.05 0 -0.2 0 .05 -0.2 0 -.05 -0.1 .05 0 -0.1 -.05 0 -0.1 0 .05 -0.1 0 -.05 0.1 .05 0 0.1 -.05 0 0.1 0 .05 0.1 0 -.05 0.2 .05 0 0.2 -.05 0 0.2 0 .05 0.2 0 -.05 0.3 .05 0 0.3 -.05 0 0.3 0 .05 0.3 0 -.05 0.4 .05 0 0.4 -.05 0 0.4 0 .05 0.4 0 -.05 0.5 .05 0 0.5 -.05 0 0.5 0 .05 0.5 0 -.05 0.6 .05 0 0.6 -.05 0 0.6 0 .05 0.6 0 -.05 0.7 .05 0 0.7 -.05 0 0.7 0 .05 0.7 0 -.05 0.8 .05 0 0.8 -.05 0 0.8 0 .05 0.8 0 -.05 0.9 .05 0 0.9 -.05 0 0.9 0 .05 0.9 0 -.05 } } } { appearance {material {edgecolor 0 1 0} } INST transform 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 unit : oneaxis } { appearance {material {edgecolor 0 0 1} } INST transform 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 unit : oneaxis } } } geomview-1.9.4/data/geom/nsquare.quad0000644000175000001440000000010607730233126014456 00000000000000NQUAD -1 -1 0 0 0 -1 1 -1 0 0 0 -1 1 1 0 0 0 -1 -1 1 0 0 0 -1 geomview-1.9.4/data/geom/tri.4d.vect0000644000175000001440000000022607730233016014114 000000000000004VECT 1 3 0 -3 0 # 0.2 0.0 0.0 0.5 0.7 0.0 0.9 0.0 0.0 # 0.5 0.1 0.1 0.5 0.7 0.5 0.5 0.9 0.9 0.2 0.1 0.1 1.0 0.5 0.7 0.4 1.0 0.9 0.1 0.7 1.0 geomview-1.9.4/data/geom/dodec2.off0000644000175000001440000000161407730233112013760 00000000000000OFF 20 12 30 0. 0. 1. .666667 0. .745356 -.333333 .577350 .745356 -.333333 -.577350 .745356 .722234 .606026 .333333 .163717 .928486 .333333 -.885951 .322460 .333333 -.885951 -.322460 .333333 .163717 -.928486 .333333 .722234 -.606026 .333333 .885951 .322460 -.333333 -.163717 .928486 -.333333 -.722234 .606026 -.333333 -.722234 -.606026 -.333333 -.163717 -.928486 -.333333 .885951 -.322460 -.333333 .333333 .577350 -.745356 -.666667 0. -.745356 .333333 -.577350 -.745356 0. 0. -1. 5 0 1 4 5 2 1.000 1.000 0.000 5 0 2 6 7 3 1.000 1.000 0.000 5 0 3 8 9 1 1.000 1.000 0.000 5 1 9 15 10 4 1.000 1.000 0.000 5 2 5 11 12 6 1.000 1.000 0.000 5 3 7 13 14 8 1.000 1.000 0.000 5 19 16 10 15 18 1.000 1.000 0.000 5 19 18 14 13 17 1.000 1.000 0.000 5 19 17 12 11 16 1.000 1.000 0.000 5 18 15 9 8 14 1.000 1.000 0.000 5 17 13 7 6 12 1.000 1.000 0.000 5 16 11 5 4 10 1.000 1.000 0.000 geomview-1.9.4/data/geom/dodec.quad0000644000175000001440000001535707730233111014066 00000000000000QUAD 0.467086 0.151765 0.794654 0.356822 0.491123 0.794654 0 0.491123 0.794654 0 0 0.794654 4.89153e-09 0.491123 0.794654 -0.356822 0.491123 0.794654 -0.467086 0.151765 0.794654 0 0 0.794654 -0.467086 0.151766 0.794654 -0.57735 -0.187593 0.794654 -0.288675 -0.397327 0.794654 0 0 0.794654 -0.288675 -0.397327 0.794654 4.36694e-09 -0.607062 0.794654 0.288675 -0.397327 0.794654 0 0 0.794654 0.288675 -0.397327 0.794654 0.57735 -0.187592 0.794654 0.467086 0.151766 0.794654 0 0 0.794654 -0.467086 0.642889 0.491123 -0.356822 0.491123 0.794654 0 0.491123 0.794654 0 0.710761 0.35538 -4.89153e-09 0.491123 0.794654 0.356822 0.491123 0.794654 0.467086 0.642889 0.491123 0 0.710761 0.35538 0.467086 0.642889 0.491123 0.57735 0.794654 0.187592 0.288675 0.888451 -1.14076e-08 0 0.710761 0.35538 0.288675 0.888451 -7.3664e-09 -4.36694e-09 0.982247 -0.187593 -0.288675 0.888451 -1.14076e-08 0 0.710761 0.35538 -0.288675 0.888451 -5.26782e-09 -0.57735 0.794654 0.187592 -0.467086 0.642889 0.491123 0 0.710761 0.35538 -0.755761 -0.245562 0.491123 -0.57735 -0.187593 0.794654 -0.467086 0.151765 0.794654 -0.675974 0.219637 0.35538 -0.467086 0.151765 0.794654 -0.356822 0.491123 0.794654 -0.467086 0.642889 0.491123 -0.675974 0.219637 0.35538 -0.467086 0.642889 0.491123 -0.57735 0.794655 0.187592 -0.755761 0.549093 -1.14076e-08 -0.675974 0.219637 0.35538 -0.755761 0.549093 -7.3664e-09 -0.934172 0.303531 -0.187593 -0.934172 -2.07029e-08 -1.14076e-08 -0.675974 0.219637 0.35538 -0.934172 -1.71496e-08 -5.26782e-09 -0.934172 -0.303531 0.187592 -0.755761 -0.245562 0.491123 -0.675974 0.219637 0.35538 -1.00113e-08 -0.794654 0.491123 4.54901e-08 -0.607062 0.794654 -0.288675 -0.397327 0.794654 -0.417775 -0.575017 0.35538 -0.288675 -0.397327 0.794654 -0.57735 -0.187592 0.794654 -0.755761 -0.245562 0.491123 -0.417775 -0.575017 0.35538 -0.755761 -0.245562 0.491123 -0.934172 -0.303531 0.187592 -0.755761 -0.549093 -1.14076e-08 -0.417775 -0.575017 0.35538 -0.755761 -0.549093 -7.3664e-09 -0.57735 -0.794654 -0.187593 -0.288675 -0.888451 -1.14076e-08 -0.417775 -0.575017 0.35538 -0.288675 -0.888451 -5.26782e-09 1.00383e-07 -0.982247 0.187592 4.30641e-08 -0.794654 0.491123 -0.417775 -0.575017 0.35538 0.755761 -0.245562 0.491123 0.57735 -0.187592 0.794654 0.288675 -0.397327 0.794654 0.417775 -0.575017 0.35538 0.288675 -0.397327 0.794654 -6.64812e-08 -0.607062 0.794654 -1.37909e-08 -0.794654 0.491123 0.417775 -0.575017 0.35538 -2.23522e-08 -0.794654 0.491123 -8.1395e-08 -0.982247 0.187592 0.288675 -0.888451 -1.14076e-08 0.417775 -0.575017 0.35538 0.288675 -0.888451 -7.3664e-09 0.57735 -0.794654 -0.187593 0.755761 -0.549093 -1.14076e-08 0.417775 -0.575017 0.35538 0.755761 -0.549093 -5.26782e-09 0.934172 -0.303531 0.187592 0.755761 -0.245562 0.491123 0.417775 -0.575017 0.35538 0.467086 0.642889 0.491123 0.356822 0.491124 0.794654 0.467086 0.151766 0.794654 0.675974 0.219637 0.35538 0.467086 0.151766 0.794654 0.57735 -0.187593 0.794654 0.755761 -0.245562 0.491123 0.675974 0.219637 0.35538 0.755761 -0.245562 0.491123 0.934172 -0.303531 0.187592 0.934172 -1.1657e-08 -1.14076e-08 0.675974 0.219637 0.35538 0.934172 7.38211e-09 -7.3664e-09 0.934172 0.303531 -0.187593 0.755761 0.549093 -1.14076e-08 0.675974 0.219637 0.35538 0.755761 0.549093 -5.26782e-09 0.57735 0.794655 0.187592 0.467086 0.642889 0.491123 0.675974 0.219637 0.35538 0.467086 -0.151766 -0.794654 0.356822 -0.491124 -0.794654 -1.84541e-09 -0.491123 -0.794655 -1.90518e-08 -1.23409e-08 -0.794655 0.288675 0.397327 -0.794654 0.57735 0.187593 -0.794654 0.467086 -0.151766 -0.794655 5.84952e-09 -2.19329e-08 -0.794655 -0.288675 0.397327 -0.794654 -7.49759e-09 0.607062 -0.794654 0.288675 0.397327 -0.794655 2.2667e-08 -1.2144e-09 -0.794655 -0.467086 -0.151766 -0.794654 -0.57735 0.187593 -0.794654 -0.288675 0.397327 -0.794655 8.15945e-09 2.11823e-08 -0.794655 -1.20299e-08 -0.491124 -0.794654 -0.356822 -0.491124 -0.794654 -0.467086 -0.151766 -0.794655 -1.76242e-08 1.43058e-08 -0.794655 -0.467086 -0.642889 -0.491123 -0.356822 -0.491123 -0.794655 1.84541e-09 -0.491123 -0.794654 1.90518e-08 -0.710761 -0.35538 -0.288675 -0.888451 2.22646e-08 -0.57735 -0.794655 -0.187592 -0.467086 -0.642889 -0.491123 -5.84952e-09 -0.710761 -0.35538 0.288675 -0.888451 6.16147e-08 7.49759e-09 -0.982247 0.187593 -0.288675 -0.888451 2.2589e-08 -2.2667e-08 -0.710761 -0.35538 0.467086 -0.642889 -0.491123 0.57735 -0.794655 -0.187592 0.288675 -0.888451 1.69983e-08 -8.15945e-09 -0.710761 -0.35538 1.20299e-08 -0.491123 -0.794655 0.356822 -0.491123 -0.794655 0.467086 -0.642889 -0.491123 1.76242e-08 -0.710761 -0.35538 0.467086 -0.642889 -0.491123 0.356822 -0.491124 -0.794655 0.467086 -0.151765 -0.794654 0.675974 -0.219637 -0.35538 0.755761 -0.549093 2.22646e-08 0.57735 -0.794655 -0.187592 0.467086 -0.642889 -0.491123 0.675974 -0.219637 -0.35538 0.934173 2.46164e-08 6.16147e-08 0.934173 -0.303531 0.187593 0.755761 -0.549093 2.2589e-08 0.675974 -0.219637 -0.35538 0.755761 0.245562 -0.491123 0.934173 0.303531 -0.187592 0.934172 1.72476e-08 1.69983e-08 0.675974 -0.219637 -0.35538 0.467086 -0.151765 -0.794655 0.57735 0.187593 -0.794655 0.755761 0.245562 -0.491123 0.675974 -0.219637 -0.35538 0.755761 0.245562 -0.491123 0.57735 0.187592 -0.794655 0.288675 0.397327 -0.794654 0.417775 0.575018 -0.35538 0.755761 0.549093 2.22646e-08 0.934173 0.303531 -0.187592 0.755761 0.245562 -0.491123 0.417775 0.575017 -0.35538 0.288675 0.888451 6.16147e-08 0.57735 0.794655 0.187593 0.755761 0.549093 2.2589e-08 0.417775 0.575017 -0.35538 -9.5395e-08 0.794655 -0.491123 -1.48376e-07 0.982247 -0.187592 0.288675 0.888451 1.69983e-08 0.417775 0.575018 -0.35538 0.288675 0.397327 -0.794655 -1.13967e-07 0.607062 -0.794655 -5.42455e-08 0.794655 -0.491123 0.417775 0.575018 -0.35538 6.30315e-08 0.794655 -0.491123 1.12471e-07 0.607062 -0.794655 -0.288675 0.397327 -0.794654 -0.417775 0.575017 -0.35538 -0.288675 0.888451 2.22646e-08 8.93221e-08 0.982247 -0.187592 2.49723e-08 0.794655 -0.491123 -0.417775 0.575017 -0.35538 -0.755761 0.549093 6.16147e-08 -0.57735 0.794655 0.187593 -0.288675 0.888451 2.2589e-08 -0.417775 0.575018 -0.35538 -0.755761 0.245562 -0.491123 -0.934173 0.303531 -0.187592 -0.755761 0.549093 1.69983e-08 -0.417775 0.575018 -0.35538 -0.288675 0.397327 -0.794655 -0.57735 0.187592 -0.794655 -0.755761 0.245562 -0.491123 -0.417775 0.575017 -0.35538 -0.755761 0.245562 -0.491123 -0.57735 0.187593 -0.794655 -0.467086 -0.151766 -0.794654 -0.675974 -0.219637 -0.35538 -0.934173 1.57169e-08 2.22646e-08 -0.934173 0.303531 -0.187592 -0.755761 0.245562 -0.491123 -0.675974 -0.219637 -0.35538 -0.755761 -0.549093 6.16147e-08 -0.934173 -0.303531 0.187593 -0.934173 2.62936e-08 2.2589e-08 -0.675974 -0.219637 -0.35538 -0.467086 -0.642889 -0.491123 -0.57735 -0.794655 -0.187592 -0.755761 -0.549093 1.69983e-08 -0.675974 -0.219637 -0.35538 -0.467086 -0.151766 -0.794655 -0.356822 -0.491124 -0.794655 -0.467086 -0.642889 -0.491123 -0.675974 -0.219637 -0.35538 geomview-1.9.4/data/geom/icosa.quad0000644000175000001440000011372607730233120014105 00000000000000QUAD 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0.447214 0.723607 0 0.894427 0.447214 0 0 1 0 0.894427 0.447214 0.28355 0.390273 0.631476 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.28355 0.390273 0.631476 0.425325 0.138197 0.723607 0 0 1 0.425325 0.138197 0.723607 0.425325 0.138197 0.723607 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.425325 0.138197 0.723607 -0.850651 0.276393 0.447214 0 0 1 -0.850651 0.276393 0.447214 -0.28355 0.390273 0.631476 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.28355 0.390273 0.631476 8.32667e-17 0.447214 0.723607 0 0 1 8.32667e-17 0.447214 0.723607 8.32667e-17 0.447214 0.723607 0 0 1 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.447214 0.723607 0 0 1 0 0.894427 0.447214 0 0 1 -0.28355 0.390273 0.631476 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 -0.28355 0.390273 0.631476 -0.425325 0.58541 0.447214 0 0.894427 0.447214 -0.425325 0.58541 0.447214 -0.425325 0.58541 0.447214 0 0.894427 0.447214 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.262866 -0.361803 0.723607 0.525731 -0.723607 0.447214 0 0 1 0.525731 -0.723607 0.447214 2.62845e-13 -0.482405 0.631476 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 2.62845e-13 -0.482405 0.631476 -0.262866 -0.361803 0.723607 0 0 1 -0.262866 -0.361803 0.723607 -0.262866 -0.361803 0.723607 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.425325 0.138197 0.723607 0.850651 0.276393 0.447214 0 0 1 0.850651 0.276393 0.447214 0.458794 -0.149071 0.631476 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.458794 -0.149071 0.631476 0.262866 -0.361803 0.723607 0 0 1 0.262866 -0.361803 0.723607 0.262866 -0.361803 0.723607 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.262866 -0.361803 0.723607 -0.525731 -0.723607 0.447214 0 0 1 -0.525731 -0.723607 0.447214 -0.458794 -0.149071 0.631476 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -0.458794 -0.149071 0.631476 -0.425325 0.138197 0.723607 0 0 1 -0.425325 0.138197 0.723607 -0.425325 0.138197 0.723607 0 0 1 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0.425325 0.58541 0.447214 0.850651 0.276393 0.447214 0 0.894427 0.447214 0.850651 0.276393 0.447214 0.28355 0.390273 0.631476 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0.28355 0.390273 0.631476 -8.32667e-17 0.447214 0.723607 0 0.894427 0.447214 -8.32667e-17 0.447214 0.723607 -8.32667e-17 0.447214 0.723607 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0.262866 0.809017 6.66134e-16 0.525731 0.723607 -0.447214 0 0.894427 0.447214 0.525731 0.723607 -0.447214 0.458794 0.631476 0.149071 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0.458794 0.631476 0.149071 0.425325 0.58541 0.447214 0 0.894427 0.447214 0.425325 0.58541 0.447214 0.425325 0.58541 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 -0.262866 0.809017 6.10623e-16 -0.525731 0.723607 -0.447214 0 0.894427 0.447214 -0.525731 0.723607 -0.447214 -2.62845e-13 0.780547 -0.149071 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 -2.62845e-13 0.780547 -0.149071 0.262866 0.809017 7.77156e-16 0 0.894427 0.447214 0.262866 0.809017 7.77156e-16 0.262866 0.809017 6.66134e-16 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 -0.425325 0.58541 0.447214 -0.850651 0.276393 0.447214 0 0.894427 0.447214 -0.850651 0.276393 0.447214 -0.458794 0.631476 0.149071 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 0 0.894427 0.447214 -0.458794 0.631476 0.149071 -0.262866 0.809017 6.10623e-16 0 0.894427 0.447214 -0.262866 0.809017 6.10623e-16 -0.262866 0.809017 4.996e-16 0 0.894427 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.425325 0.138197 0.723607 5.55112e-17 0 1 -0.850651 0.276393 0.447214 5.55112e-17 0 1 -0.458794 -0.149071 0.631476 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.458794 -0.149071 0.631476 -0.688191 -0.223607 0.447214 -0.850651 0.276393 0.447214 -0.688191 -0.223607 0.447214 -0.688191 -0.223607 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.425325 0.58541 0.447214 -2.77556e-16 0.894427 0.447214 -0.850651 0.276393 0.447214 -2.77556e-16 0.894427 0.447214 -0.28355 0.390273 0.631476 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.28355 0.390273 0.631476 -0.425325 0.138197 0.723607 -0.850651 0.276393 0.447214 -0.425325 0.138197 0.723607 -0.425325 0.138197 0.723607 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.688191 0.5 6.66134e-16 -0.525731 0.723607 -0.447214 -0.850651 0.276393 0.447214 -0.525731 0.723607 -0.447214 -0.458794 0.631476 0.149071 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.458794 0.631476 0.149071 -0.425325 0.58541 0.447214 -0.850651 0.276393 0.447214 -0.425325 0.58541 0.447214 -0.425325 0.58541 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 1.38778e-16 6.10623e-16 -0.850651 -0.276393 -0.447214 -0.850651 0.276393 0.447214 -0.850651 -0.276393 -0.447214 -0.742344 0.241202 -0.149071 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.742344 0.241202 -0.149071 -0.688191 0.5 7.77156e-16 -0.850651 0.276393 0.447214 -0.688191 0.5 7.77156e-16 -0.688191 0.5 6.66134e-16 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.688191 -0.223607 0.447214 -0.525731 -0.723607 0.447214 -0.850651 0.276393 0.447214 -0.525731 -0.723607 0.447214 -0.742344 -0.241202 0.149071 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.850651 0.276393 0.447214 -0.742344 -0.241202 0.149071 -0.850651 3.05311e-16 6.10623e-16 -0.850651 0.276393 0.447214 -0.850651 3.05311e-16 6.10623e-16 -0.850651 2.22045e-16 4.996e-16 -0.850651 0.276393 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.262866 -0.361803 0.723607 -2.77556e-17 0 1 -0.525731 -0.723607 0.447214 -2.77556e-17 0 1 -2.63067e-13 -0.482405 0.631476 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -2.63067e-13 -0.482405 0.631476 -2.22045e-16 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -2.22045e-16 -0.723607 0.447214 -5.55112e-17 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.688191 -0.223607 0.447214 -0.850651 0.276393 0.447214 -0.525731 -0.723607 0.447214 -0.850651 0.276393 0.447214 -0.458794 -0.149071 0.631476 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.458794 -0.149071 0.631476 -0.262866 -0.361803 0.723607 -0.525731 -0.723607 0.447214 -0.262866 -0.361803 0.723607 -0.262866 -0.361803 0.723607 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.688191 -0.5 6.66134e-16 -0.850651 -0.276393 -0.447214 -0.525731 -0.723607 0.447214 -0.850651 -0.276393 -0.447214 -0.742344 -0.241202 0.149071 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.742344 -0.241202 0.149071 -0.688191 -0.223607 0.447214 -0.525731 -0.723607 0.447214 -0.688191 -0.223607 0.447214 -0.688191 -0.223607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.262866 -0.809017 6.10623e-16 -6.10623e-16 -0.894427 -0.447214 -0.525731 -0.723607 0.447214 -6.10623e-16 -0.894427 -0.447214 -0.458794 -0.631476 -0.149071 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.458794 -0.631476 -0.149071 -0.688191 -0.5 7.77156e-16 -0.525731 -0.723607 0.447214 -0.688191 -0.5 7.77156e-16 -0.688191 -0.5 6.66134e-16 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -1.11022e-16 -0.723607 0.447214 0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 -3.88578e-16 -0.780547 0.149071 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 -3.88578e-16 -0.780547 0.149071 -0.262866 -0.809017 6.10623e-16 -0.525731 -0.723607 0.447214 -0.262866 -0.809017 6.10623e-16 -0.262866 -0.809017 4.996e-16 -0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.262866 -0.361803 0.723607 2.77556e-17 0 1 0.525731 -0.723607 0.447214 2.77556e-17 0 1 0.458794 -0.149071 0.631476 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.458794 -0.149071 0.631476 0.688191 -0.223607 0.447214 0.525731 -0.723607 0.447214 0.688191 -0.223607 0.447214 0.688191 -0.223607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 -5.55112e-17 -0.723607 0.447214 -0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 -0.525731 -0.723607 0.447214 5.55112e-17 -0.482405 0.631476 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 5.55112e-17 -0.482405 0.631476 0.262866 -0.361803 0.723607 0.525731 -0.723607 0.447214 0.262866 -0.361803 0.723607 0.262866 -0.361803 0.723607 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.262866 -0.809017 6.66134e-16 3.60822e-16 -0.894427 -0.447214 0.525731 -0.723607 0.447214 3.60822e-16 -0.894427 -0.447214 2.63123e-13 -0.780547 0.149071 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 2.63123e-13 -0.780547 0.149071 1.66533e-16 -0.723607 0.447214 0.525731 -0.723607 0.447214 1.66533e-16 -0.723607 0.447214 5.55112e-17 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.688191 -0.5 6.10623e-16 0.850651 -0.276393 -0.447214 0.525731 -0.723607 0.447214 0.850651 -0.276393 -0.447214 0.458794 -0.631476 -0.149071 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.458794 -0.631476 -0.149071 0.262866 -0.809017 7.77156e-16 0.525731 -0.723607 0.447214 0.262866 -0.809017 7.77156e-16 0.262866 -0.809017 6.66134e-16 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.688191 -0.223607 0.447214 0.850651 0.276393 0.447214 0.525731 -0.723607 0.447214 0.850651 0.276393 0.447214 0.742344 -0.241202 0.149071 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.525731 -0.723607 0.447214 0.742344 -0.241202 0.149071 0.688191 -0.5 6.10623e-16 0.525731 -0.723607 0.447214 0.688191 -0.5 6.10623e-16 0.688191 -0.5 4.996e-16 0.525731 -0.723607 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.425325 0.138197 0.723607 0 -1.38778e-17 1 0.850651 0.276393 0.447214 0 -1.38778e-17 1 0.28355 0.390273 0.631476 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.28355 0.390273 0.631476 0.425325 0.58541 0.447214 0.850651 0.276393 0.447214 0.425325 0.58541 0.447214 0.425325 0.58541 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.688191 -0.223607 0.447214 0.525731 -0.723607 0.447214 0.850651 0.276393 0.447214 0.525731 -0.723607 0.447214 0.458794 -0.149071 0.631476 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.458794 -0.149071 0.631476 0.425325 0.138197 0.723607 0.850651 0.276393 0.447214 0.425325 0.138197 0.723607 0.425325 0.138197 0.723607 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0 6.66134e-16 0.850651 -0.276393 -0.447214 0.850651 0.276393 0.447214 0.850651 -0.276393 -0.447214 0.742344 -0.241202 0.149071 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.742344 -0.241202 0.149071 0.688191 -0.223607 0.447214 0.850651 0.276393 0.447214 0.688191 -0.223607 0.447214 0.688191 -0.223607 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.688191 0.5 6.10623e-16 0.525731 0.723607 -0.447214 0.850651 0.276393 0.447214 0.525731 0.723607 -0.447214 0.742344 0.241202 -0.149071 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.742344 0.241202 -0.149071 0.850651 -2.77556e-17 7.77156e-16 0.850651 0.276393 0.447214 0.850651 -2.77556e-17 7.77156e-16 0.850651 -1.11022e-16 6.66134e-16 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.425325 0.58541 0.447214 4.44089e-16 0.894427 0.447214 0.850651 0.276393 0.447214 4.44089e-16 0.894427 0.447214 0.458794 0.631476 0.149071 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.850651 0.276393 0.447214 0.458794 0.631476 0.149071 0.688191 0.5 6.10623e-16 0.850651 0.276393 0.447214 0.688191 0.5 6.10623e-16 0.688191 0.5 4.996e-16 0.850651 0.276393 0.447214 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -6.1749e-16 -0.447214 -0.723607 -6.56092e-16 -0.894427 -0.447214 -5.78888e-16 -1.36342e-15 -1 -6.56092e-16 -0.894427 -0.447214 0.28355 -0.390273 -0.631476 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 -5.78888e-16 -1.36342e-15 -1 0.28355 -0.390273 -0.631476 0.425325 -0.138197 -0.723607 -5.78888e-16 -1.36342e-15 -1 0.425325 -0.138197 -0.723607 0.425325 -0.138197 -0.723607 -5.78888e-16 -1.36342e-15 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 0.425325 -0.138197 -0.723607 0.850651 -0.276393 -0.447214 1.1178e-15 -9.71874e-16 -1 0.850651 -0.276393 -0.447214 0.458794 0.149071 -0.631476 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 1.1178e-15 -9.71874e-16 -1 0.458794 0.149071 -0.631476 0.262866 0.361803 -0.723607 1.1178e-15 -9.71874e-16 -1 0.262866 0.361803 -0.723607 0.262866 0.361803 -0.723607 1.1178e-15 -9.71874e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 0.262866 0.361803 -0.723607 0.525731 0.723607 -0.447214 1.26973e-15 7.62767e-16 -1 0.525731 0.723607 -0.447214 2.63925e-13 0.482405 -0.631476 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 1.26973e-15 7.62767e-16 -1 2.63925e-13 0.482405 -0.631476 -0.262866 0.361803 -0.723607 1.26973e-15 7.62767e-16 -1 -0.262866 0.361803 -0.723607 -0.262866 0.361803 -0.723607 1.26973e-15 7.62767e-16 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -0.262866 0.361803 -0.723607 -0.525731 0.723607 -0.447214 -3.33067e-16 1.44329e-15 -1 -0.525731 0.723607 -0.447214 -0.458794 0.149071 -0.631476 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -3.33067e-16 1.44329e-15 -1 -0.458794 0.149071 -0.631476 -0.425325 -0.138197 -0.723607 -3.33067e-16 1.44329e-15 -1 -0.425325 -0.138197 -0.723607 -0.425325 -0.138197 -0.723607 -3.33067e-16 1.44329e-15 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -0.425325 -0.138197 -0.723607 -0.850651 -0.276393 -0.447214 -1.47557e-15 1.29236e-16 -1 -0.850651 -0.276393 -0.447214 -0.28355 -0.390273 -0.631476 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -1.47557e-15 1.29236e-16 -1 -0.28355 -0.390273 -0.631476 -1.20651e-15 -0.447214 -0.723607 -1.47557e-15 1.29236e-16 -1 -1.20651e-15 -0.447214 -0.723607 -1.23427e-15 -0.447214 -0.723607 -1.47557e-15 1.29236e-16 -1 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 6.1749e-16 -0.447214 -0.723607 6.56092e-16 1.33227e-15 -1 5.78888e-16 -0.894427 -0.447214 6.56092e-16 1.33227e-15 -1 -0.28355 -0.390273 -0.631476 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 5.78888e-16 -0.894427 -0.447214 -0.28355 -0.390273 -0.631476 -0.425325 -0.58541 -0.447214 5.78888e-16 -0.894427 -0.447214 -0.425325 -0.58541 -0.447214 -0.425325 -0.58541 -0.447214 5.78888e-16 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -0.425325 -0.58541 -0.447214 -0.850651 -0.276393 -0.447214 -1.1178e-15 -0.894427 -0.447214 -0.850651 -0.276393 -0.447214 -0.458794 -0.631476 -0.149071 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -1.1178e-15 -0.894427 -0.447214 -0.458794 -0.631476 -0.149071 -0.262866 -0.809017 -1.4988e-15 -1.1178e-15 -0.894427 -0.447214 -0.262866 -0.809017 -1.4988e-15 -0.262866 -0.809017 -1.38778e-15 -1.1178e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -0.262866 -0.809017 5.55112e-17 -0.525731 -0.723607 0.447214 -1.26973e-15 -0.894427 -0.447214 -0.525731 -0.723607 0.447214 -2.63925e-13 -0.780547 0.149071 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -1.26973e-15 -0.894427 -0.447214 -2.63925e-13 -0.780547 0.149071 0.262866 -0.809017 -1.66533e-16 -1.26973e-15 -0.894427 -0.447214 0.262866 -0.809017 -1.66533e-16 0.262866 -0.809017 -1.11022e-16 -1.26973e-15 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 0.262866 -0.809017 7.21645e-16 0.525731 -0.723607 0.447214 3.33067e-16 -0.894427 -0.447214 0.525731 -0.723607 0.447214 0.458794 -0.631476 -0.149071 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 3.33067e-16 -0.894427 -0.447214 0.458794 -0.631476 -0.149071 0.425325 -0.58541 -0.447214 3.33067e-16 -0.894427 -0.447214 0.425325 -0.58541 -0.447214 0.425325 -0.58541 -0.447214 3.33067e-16 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 0.425325 -0.58541 -0.447214 0.850651 -0.276393 -0.447214 1.47557e-15 -0.894427 -0.447214 0.850651 -0.276393 -0.447214 0.28355 -0.390273 -0.631476 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 1.47557e-15 -0.894427 -0.447214 0.28355 -0.390273 -0.631476 1.20651e-15 -0.447214 -0.723607 1.47557e-15 -0.894427 -0.447214 1.20651e-15 -0.447214 -0.723607 1.23427e-15 -0.447214 -0.723607 1.47557e-15 -0.894427 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.425325 -0.138197 -0.723607 -1.16573e-15 1.04083e-15 -1 0.850651 -0.276393 -0.447214 -1.16573e-15 1.04083e-15 -1 0.28355 -0.390273 -0.631476 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.28355 -0.390273 -0.631476 0.425325 -0.58541 -0.447214 0.850651 -0.276393 -0.447214 0.425325 -0.58541 -0.447214 0.425325 -0.58541 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.425325 -0.58541 -0.447214 -1.22125e-15 -0.894427 -0.447214 0.850651 -0.276393 -0.447214 -1.22125e-15 -0.894427 -0.447214 0.458794 -0.631476 -0.149071 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.458794 -0.631476 -0.149071 0.688191 -0.5 -1.4988e-15 0.850651 -0.276393 -0.447214 0.688191 -0.5 -1.4988e-15 0.688191 -0.5 -1.38778e-15 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.688191 -0.5 5.55112e-17 0.525731 -0.723607 0.447214 0.850651 -0.276393 -0.447214 0.525731 -0.723607 0.447214 0.742344 -0.241202 0.149071 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.742344 -0.241202 0.149071 0.850651 -1.30451e-15 -1.66533e-16 0.850651 -0.276393 -0.447214 0.850651 -1.30451e-15 -1.66533e-16 0.850651 -1.249e-15 -1.11022e-16 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -2.77556e-17 7.21645e-16 0.850651 0.276393 0.447214 0.850651 -0.276393 -0.447214 0.850651 0.276393 0.447214 0.742344 0.241202 -0.149071 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.742344 0.241202 -0.149071 0.688191 0.223607 -0.447214 0.850651 -0.276393 -0.447214 0.688191 0.223607 -0.447214 0.688191 0.223607 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.688191 0.223607 -0.447214 0.525731 0.723607 -0.447214 0.850651 -0.276393 -0.447214 0.525731 0.723607 -0.447214 0.458794 0.149071 -0.631476 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.850651 -0.276393 -0.447214 0.458794 0.149071 -0.631476 0.425325 -0.138197 -0.723607 0.850651 -0.276393 -0.447214 0.425325 -0.138197 -0.723607 0.425325 -0.138197 -0.723607 0.850651 -0.276393 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.262866 0.361803 -0.723607 -1.30451e-15 -6.66134e-16 -1 0.525731 0.723607 -0.447214 -1.30451e-15 -6.66134e-16 -1 0.458794 0.149071 -0.631476 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.458794 0.149071 -0.631476 0.688191 0.223607 -0.447214 0.525731 0.723607 -0.447214 0.688191 0.223607 -0.447214 0.688191 0.223607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.688191 0.223607 -0.447214 0.850651 -0.276393 -0.447214 0.525731 0.723607 -0.447214 0.850651 -0.276393 -0.447214 0.742344 0.241202 -0.149071 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.742344 0.241202 -0.149071 0.688191 0.5 -1.4988e-15 0.525731 0.723607 -0.447214 0.688191 0.5 -1.4988e-15 0.688191 0.5 -1.38778e-15 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.688191 0.5 5.55112e-17 0.850651 0.276393 0.447214 0.525731 0.723607 -0.447214 0.850651 0.276393 0.447214 0.458794 0.631476 0.149071 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.458794 0.631476 0.149071 0.262866 0.809017 -1.66533e-16 0.525731 0.723607 -0.447214 0.262866 0.809017 -1.66533e-16 0.262866 0.809017 -1.11022e-16 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.262866 0.809017 7.21645e-16 2.77556e-16 0.894427 0.447214 0.525731 0.723607 -0.447214 2.77556e-16 0.894427 0.447214 2.63234e-13 0.780547 -0.149071 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 2.63234e-13 0.780547 -0.149071 3.88578e-16 0.723607 -0.447214 0.525731 0.723607 -0.447214 3.88578e-16 0.723607 -0.447214 2.77556e-16 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 -1.05471e-15 0.723607 -0.447214 -0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -8.88178e-16 0.482405 -0.631476 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 -8.88178e-16 0.482405 -0.631476 0.262866 0.361803 -0.723607 0.525731 0.723607 -0.447214 0.262866 0.361803 -0.723607 0.262866 0.361803 -0.723607 0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.262866 0.361803 -0.723607 3.33067e-16 -1.55431e-15 -1 -0.525731 0.723607 -0.447214 3.33067e-16 -1.55431e-15 -1 -2.62901e-13 0.482405 -0.631476 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -2.62901e-13 0.482405 -0.631476 -2.22045e-16 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -2.22045e-16 0.723607 -0.447214 -1.66533e-16 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 1.22125e-15 0.723607 -0.447214 0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 0.525731 0.723607 -0.447214 8.88178e-16 0.780547 -0.149071 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 8.88178e-16 0.780547 -0.149071 -0.262866 0.809017 -1.4988e-15 -0.525731 0.723607 -0.447214 -0.262866 0.809017 -1.4988e-15 -0.262866 0.809017 -1.38778e-15 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.262866 0.809017 5.55112e-17 9.71445e-16 0.894427 0.447214 -0.525731 0.723607 -0.447214 9.71445e-16 0.894427 0.447214 -0.458794 0.631476 0.149071 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.458794 0.631476 0.149071 -0.688191 0.5 -1.66533e-16 -0.525731 0.723607 -0.447214 -0.688191 0.5 -1.66533e-16 -0.688191 0.5 -1.11022e-16 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.688191 0.5 7.21645e-16 -0.850651 0.276393 0.447214 -0.525731 0.723607 -0.447214 -0.850651 0.276393 0.447214 -0.742344 0.241202 -0.149071 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.742344 0.241202 -0.149071 -0.688191 0.223607 -0.447214 -0.525731 0.723607 -0.447214 -0.688191 0.223607 -0.447214 -0.688191 0.223607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.688191 0.223607 -0.447214 -0.850651 -0.276393 -0.447214 -0.525731 0.723607 -0.447214 -0.850651 -0.276393 -0.447214 -0.458794 0.149071 -0.631476 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.525731 0.723607 -0.447214 -0.458794 0.149071 -0.631476 -0.262866 0.361803 -0.723607 -0.525731 0.723607 -0.447214 -0.262866 0.361803 -0.723607 -0.262866 0.361803 -0.723607 -0.525731 0.723607 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.425325 -0.138197 -0.723607 1.4988e-15 -1.94289e-16 -1 -0.850651 -0.276393 -0.447214 1.4988e-15 -1.94289e-16 -1 -0.458794 0.149071 -0.631476 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.458794 0.149071 -0.631476 -0.688191 0.223607 -0.447214 -0.850651 -0.276393 -0.447214 -0.688191 0.223607 -0.447214 -0.688191 0.223607 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.688191 0.223607 -0.447214 -0.525731 0.723607 -0.447214 -0.850651 -0.276393 -0.447214 -0.525731 0.723607 -0.447214 -0.742344 0.241202 -0.149071 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.742344 0.241202 -0.149071 -0.850651 8.88178e-16 -1.4988e-15 -0.850651 -0.276393 -0.447214 -0.850651 8.88178e-16 -1.4988e-15 -0.850651 9.71445e-16 -1.38778e-15 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 1.19349e-15 5.55112e-17 -0.850651 0.276393 0.447214 -0.850651 -0.276393 -0.447214 -0.850651 0.276393 0.447214 -0.742344 -0.241202 0.149071 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.742344 -0.241202 0.149071 -0.688191 -0.5 -1.66533e-16 -0.850651 -0.276393 -0.447214 -0.688191 -0.5 -1.66533e-16 -0.688191 -0.5 -1.11022e-16 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.688191 -0.5 7.21645e-16 -0.525731 -0.723607 0.447214 -0.850651 -0.276393 -0.447214 -0.525731 -0.723607 0.447214 -0.458794 -0.631476 -0.149071 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.458794 -0.631476 -0.149071 -0.425325 -0.58541 -0.447214 -0.850651 -0.276393 -0.447214 -0.425325 -0.58541 -0.447214 -0.425325 -0.58541 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.425325 -0.58541 -0.447214 6.66134e-16 -0.894427 -0.447214 -0.850651 -0.276393 -0.447214 6.66134e-16 -0.894427 -0.447214 -0.28355 -0.390273 -0.631476 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.850651 -0.276393 -0.447214 -0.28355 -0.390273 -0.631476 -0.425325 -0.138197 -0.723607 -0.850651 -0.276393 -0.447214 -0.425325 -0.138197 -0.723607 -0.425325 -0.138197 -0.723607 -0.850651 -0.276393 -0.447214 geomview-1.9.4/data/geom/textured/0000777000175000001440000000000010665240703014057 500000000000000geomview-1.9.4/data/geom/textured/Earth.pam.bz20000644000175000001440000013711210622661064016236 00000000000000BZh91AY&SY‚ü¤XhõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÅy{çqZpêÝÎÙ×UßmîížûÏ{Þ[ݵ÷n2N»7jΪª(( R÷o@ñ ¢»jŠAQW½|Å«+*eYŠ¬Í¶Ð¶ZVÖͶZ¦-33cbš’³fË5¦Ö–Fb–£KHÃɶ¶FUSMm)3YªÊ¶ÐÆÆIÕc ÖµimS4¢ÛFlÉQ£(++*µ™1‰Mµ­¶‰‰¤§è@>@€{¹@P)* ­ö³}îú»›6}cÄ•R*…HöeR©*‚Š•IVûêßwkît÷•×­³m»¹ÝÝVÛº7;4í–ØÛ§*:®šhSqw+¹¥­Û¸¨´Z­µF»»vW,ÓÍ´Ù­­–Õ­ÜζÝ] ž²w¦¹ˆ¦–Ò­±Y¤™]²I ;»¦íu]œºÎîv6î³¥Wmm[2;9ÖV&b5l±@¥G.ã>ym¶uÛo}ï{åÞûíÛÛ{u7Ÿw®¾½öê½M“]wm³¯­Ôó½ÚåPÓ :}G$ŸowC­Ûu-kîçzîzÚ ÈH¥HÐhQ¦¶À@ VÛìthi¤„Ð&š4Â421dÐh¢a¡¦@ €ŒCFšh€L™1M£!¨ÔðÑ2™ªy¦ž©šdÉ‘êz¨4Ò"dhž€Àj2M0ƒI2&˜Ñ¥=O§ø&šAá&ѦMTÿS*~jb§â§á2ž*~™&ž ÓTÙO(òj4õPõ Ò žÕˆMdÑ0CI¦F&Ѧ“d Tý=LèL§©²ž‘ê=2§è§Šy )å?Tõ=4žiFÔÓF(zž‰£õF†Ôhd €=@Ó#jM0§¨!R‰ d€&Òž˜C&&šªOF•=Oòj”ý©á*~ÕOô*¤õ–1p£—™ ·Ó³>ç3"l:*°0°«ËÑã]÷G†Äs£ƒs.lð`F¢RN‡•Ì’}ƒÌ´oam{¼}mÃåó< ß«í§ßÂK=‚Ðò椥jös"ÏV$ &$4W]æéÕ»ÚÁaEµáA¸íñJHÇ$É8xEðð½SQÐÚÆ€¤ ž›—ÑŽþS‡:1ÆßàN¶ã`9Häh~§k…2.U`—/}ŒmfÃ,>w‘{v×G»¶|¿©(3uÅ^.oE Äo4‚ÐC@1¯uQÓ¯µ}ç>©ìãdéïò `î­p"X30}W*Œ„Ši-O?oãÛSÝq'‡×ÂÜ´Ö`IG6÷D}í±HRÝJfbäd8Ðd¶åO)Ðea@ïžîjh3e BÐyÖôÑÙéÐ|¬¾/¹Òô³xšš0]Ì|öæG2TénÑ%i4_a®>|oOe‘¼»Thôû(¹·µ¯0Ô½¯zA G p*$ ž¡ð÷¸ß»/s#ÕîÅÚpþž³²Òa(œæbðN99{}MDkùL ¦äË#d ¦qšxÙì¤'"QµHaئ°`„€ßñ '^;¯J'xÊô)W rº9=ܸ¯¡°Ñzýl²§!CÜ@”‹3«îoø<ïgKÞú˜ö¸xàÂu·ûüŸô¤|NÄo¤eD’’MÃ'äa÷²î1_^bñY ¹'lr°#aáƒÀTÎŒ¨D¹¬–K°« ž[­žò‘×m`šÙ¶ª.¦ÀšWŒ™ú\máÑó2«¥ÈÂòžž°©„B‡J‡‡|—+‡ƒ&”ûì¸Ybõœ;EŠRß®ÂÅï]Ä{Eƒ¶BD 9ÐQ¦r*«~ËDb%8´>Âä^mYº"Ì  D !¦35.›Crô ŸoŽg_;›V@ó`VT„'?‰åàíõý/­äñ룣绖I (6Ùgñ©,ÚLɪ1F8Ž Köù¦ ý+"î»k%q8°ñ3„4˜™áÝÒ÷±ÇØï,EÜïOÜÐ ©a `†.…úšÏÓ.ËæÐä5©í}¾×pýåÙÝF-¯˽Øçèùù5ãz1öy˜íe‚vo>–Ï¡Ûh<°.”) €ˆP"e§ð¡É»¸w®÷!y2qìrþ_ø?WÂßíZðÈÚ½¸û7Å|w:X@8¢}Á–e†hKO]â´ˆ6èô €!$$ž£A…˜rdÔ‰yØø­DþJ‡œ ûYÄâºw8QÃ|Eìí¬GC}€é$`mÊAàòõúû®Ïð±žï¯·>îly~&=H;c®«*H€äo ŒyšÖ ǃÂo…es} Ò Ñ)šuÃ(6e1– Ó”ñÙ·`‹æ˜&ƒõnãïô} ÃÉfWÈò¶zêtZ5@…@…ÏFôj'VËe8åvÓÖ I¥¡¤³ÁP¶Wh@æšÛeDiœ ÒM`†ûç´ñ{ç£e;Û½oeÂèYRñ™òýOW½{ŸÜ|š—VÎ[×tð [¦xA¬lÅ]Vùþe~G§£év],|{ƒ2FThI0C¡ò³f{³¡®´eœöC¬îòky å¥Ü^eæÔéȘ.Ÿ3µ”sñXκO5³‹§<8õ„f@AŽ&Pˆ@§±–†ÜѹÃ׿Fâ!_*Z @`“0ò/Ýò_òcÓøñó=¿_o[ÂèÙ;8Ðg³7UÛµü)5¾lyî¶|®Ò½`TÜ!°”Pšªö¸ú·Ð1î)€@ "V¬¡µ[#“غfV¡ÿ3”¸pµLº"@¦ˆÊ)^ü§j£Ì)—"p¿"ˆ@›k¡$¿ƒØúØäì¶™|[´—膊 J2Çx\ Ñ Ú,û[†#W°Ð5”D¿¯wÉÚDÚkûì=õåJÙ±G6áqHðDB''\¢‚ˆQì¡åÍ~\ÆÇXž„?s„ã©xAŒHb„¾¤cèæŒ,ÍáøhöÖõqòþ¡Åø>ž@±ñ8ý ? Ô€èuñkïÙÚwž\ñ?#o"K„ `ž;ünŸc“äzžmà-ø}9¼žÞª{žçOâilV…A,ÈÒCA‰¤~HŠÞ˦€À8÷÷ZØ—X;%ž"䣨—«wÊÞ…(*ÍÑŒ¸G¼bÌ5€hbÒðr>«›±ø¶óºÈê€À4ìö—êÇ]³åIè{ý.uïÆò>6ì¦|ì Þ­c®Õî¾½í¼·Ñ_[¨˜C¥6x-Ýíüç™…DÁ9$&›Z¨Ø€‚š<ɸ¦ã"g_Àb?³®ÄãÍ~¤Èh&“öQ0D]kÙgä*cDQoW¹²Ñ:uKvÁê?׳?¹TÄ¢Ù±n}=Í×z^YÔÁËð1¾¾'1ýþ¶K½ÛÌh/ÝévþN‡àˆýÜ•ÿ«ë÷èÿÑûõ0WÛÛ¸×Î¥_ÿm¦UçÆÞ£öòl·ŸdÞœü_E ëÇ”‚Ês‰òsî?wwäî¾ÿO®ÿH†~[Ïú©‹„ÅÉ׿¼n6®Ê„7ügþ=§*Чçrúƒ=ñ^AUÖ¾{gýþôgn7}Öþ¿ãû /ŸGþN{?¤¤ÖŠÃQeÿ‡ñ³Žåk®ÛÞpUóKŒD«1’i;ÞgïfWøoýgïIï¬ùvÞF~ïb?ðCãnŸ<ˆÌ7ù¨!å EÙÞþŸ®³lÞ‹êçì®ßR:É““–·Öz­̃Ùhºù¢×cŒ×1Dý­ÝK2Õ”µá×òu@çs8øNµî{îpèÛÎ|€}¢‰ ”þà‹>‡òä<¼á:ŽôÝÁv ßaë_ïzi; Œ,ίëÐa;üHºÚ×w}ÿÏZ _}f|5j-ÐÁX¾g߉jãþ78¹Åp®Ó«ÿèöåÝÝ>4S”—4Né}Z}£¦éÁõˆDý™—ÜñþV§¥þå|GÅ4žš”•ïÏÁܳÊÿ3ßy‡{`Áþš…æ˜¥.ïÑü­?û„ò6PÏåkžÿ.LÚýROi³éé«Ï¾bÕ­-á±_'ØÌxÎ ûe²ÂQÖÍfû.ö9Ý=½3ä¿úan#¹û}=ÝV—ï-ﱑðJÁpS©“>B-Ê|óø³/zfϨ¼=ªÿ/ªµŸxåÏë({|¢>Ÿ¯R¾½ƒ‚O FÍì¬û¿fÞ»Á‡ù'Ñd“>eOOÛÛ=Pm_»F%¬ý>½Þö@•ÁÚ2´‰/ÿêªÓâÖc5ˆóâ€N†NŠG5~ï]è-žYµóÚ–í[KÔFè]}œ?iŸÌ¥A¼Ôý˜s—Nî—cUé ºÖKÔÔODÜ_By®ßð]³²lãn?÷?Ñrm‹‹ÿ˜Í[kù|†·~ÚÉUáI5?¼UYhUOæ×›ƒpDIMê4)éÔ^:QÁ"?Ÿ×`tçU.»ÄZ¯•ts[¬¹Ãt_n¿gq¿¤¥‘ñêH˪¤Þðo® ç ¼ƒB£­j÷Ƥl” Aú ZYÎ13?¯€k²p ¿ç‹K€Ú³Š& R–ŠB$ÙÚîDŸ cÒˆ.9}No{+ƒE*õ#ž*8qHG=V£C ³§‰Š²¤ 2¨Œ;ÿUƒ&"›¢Î)Tjd3 èàƒ°góÏ-‰¥#w†²—ïú¶ô*‚Úè`ôsê(ã”I]:}õÝ€w·æù?ØÐï,)O®µR°¤OˆˆNBIOÅZ´§¦FA§ìYt›-òÎ# æžÛÜæ^ë–I¿%F3å|:fVþü ßéÏqFáíÓ@"žF>}ˆ&¸+7+Î`×S‘Ý£dÃ^…Ô¶‚`çÏB§nТ!´=Ö=´úüg(²Î´ñÛ‰Þ]«‘¥5†ƒÿê­¥Sbî¥xe9EfèØ+*¢®š/Uèãm¹P_/Œ±Ïgî/? 8æè¦†ykþ½Fa§ÖK·î®;k«Í(“¸VÐõ–¼Ü‹’ª‹Á¹ÍuQß¾”@G ¢Í{¬NNÇ…¥ìµSê:Ó÷Cü»{Àì<ÚX{ÉPÎÙQ ¢P9Ôü{oË_×wM¯È–¶lbŽO{3Yï säcýвŸºý¢Í¿™¹ýƒÃέ£óæ%Fwë 7L­Õ¶ÄÔ{[+wA"ˇfDoözɾ5Z¤œ½mcB<ìŠQƺ´oŸ‹t¯RºÂþ¢ÚÞKëÅô:øÙr4¢søžé»ý_D/R—2£a¿lj¸Ê*«gãžKËIVñ½ÿGŒ7g¸ÒJ» >a|«¼»IxpÊKµ¶g分ž’Ð4{øôþkÞÕUí&¥ë[Ü x-›–z´p@µÅ)xF¹ÅD,ŧÈÊÜâ:Ùã`0 ?;4HÖ7’dJÝî ø_N”ÙYo$oQ5åƒ?¦ÀˆðÉC:éÃ}Q=†ö±èwüÕHMäcn“)Ι¹€x!VÑàTP'Åš~gŸ¨“Z]³`™“´ßS²£H£ò¼ÆÖ´ç:±/÷NÛèAÚj>[c×3cÑåº&”Š%‰Øq¸zOÜ€.tŠrú7ãÛÏ•|y9îÏêÇbz÷.Cµq3°›<¼Ôq¤òXca¯1öŒáY?‹ÉeOÙ°âµÞÅ’Ž‹÷m+ž§ѾÓqN£bÄL¢þ׿ÑᑨtÈÀ F5ÏêÙ Ž)µ/ Ź å£÷ðv±Ú_>Ì:0>PlnU’Úðrªj²ñbݨٓ˜¶#‚Mâ¢ZøŠ"u[¿‘£Ù„í‘D“h@~rÌìE‰O©XðsrïX.ˆãVþú[Gp‹ãÒ(”×Ê//Ôt "¼œõ’'÷ž“RÜ¢›ò”KÒjZídDç]N„ðN"‘iœ_¦¼\ºMÀ>YzEiòŠêÄ MÑTÂØáEä[:¯Ô ÛvÐ"Ä£J„Pé¨èH Õ"ƒçÌüN(õ^/@€îÙv‡ê6ýD™9[†ò BˆÒ@°¨×nÚÒCëšKZªFn•wexfˆ¤æ£ÑðÆÔ¹äƱq%¸ìKƒöÈŽ;H•¼#œ@!,d^²Ô‰uÎKQ´/ ¨=¬(`ÎÙª8EiKÓ A ú_ïK¼¢"È“~VͽªÃRì9.®\I‹¿‘7b˜2rÜ8ì<Œ·™O×dIÙ¶  ­’„>®K/¸Ê–U2œ8™N‡åŸ8´ÆûÓ˜3AuHOÀaí¨<½WYWtÎi¤jWlQdé6%9= UÔŠŽázDá#õ¼TµqPc—ÅáØ×¨ÍÁI3¢M¾ ‹È¼rZ=ÕAΔ’ê±ýÅhòw´ïÖoõ“œB’«¥ö÷z–¦ +߉\C=e{’J鬢Œðôü–¸„ùñ+75Éd)ÌI˜!¯6åˆ)ˆˆ(Iñ*>¢«è¾îç oÞ„há»#Ë3ÝõÅ–Âßf›so²\HM„µ4LÝXy§wѸ«¹rì µó#Èÿ2aDÓæ„È¢¤´>bø’xúø÷G7 ™­ä_ymÒ(]¹Ž{ ÕÁvžFØŒÜRÇŽ]‹4çVy‡&®ü/œàŽ8dbâ¨é×—§P3xë"gR”Ô éA(H:w²3nÜøZ9©%ˆöopNB‘’»âr™8 û?Ñ¿'kvâTÅe•Ž5¥zÕ9‡Ýøl“Åæw>ã·\•…WŒva©ðG¢%ñªð^Ûò™îˊݹÊ)^cA@è”é™B3oÙ¨6¬Èj¥+5ZÓ»Dy¢sD£‚ÖžîdÖå½(8Mªú-YÄÖìçzókmh|Žº°>+æññõ—3;Px?æ—„T[ªucÁÿƒŽIÅZ³Æªýã€á×+RsV®œ`S¤!8Æø€ƒ‹Ö÷ö Àpßðšî¦x Wß*iŠJœÒ%?OBû”Ñ4 êw”×:Ž€GwòÞ2A#ßß~óiD­;3jB˜>\Ç Ê{r×ã¡PÆ(Æ¢qÅ2¦W˜©˜4ä '-ývĵ^„ehôê¦ÎÎè¶u£ê^O_{U‚ò0ÖG…)ÉNöö–{Ú‡#Ù( N–ñåD÷=¯iCÕ}»æ«±•­Å_×&Ý#Ì+{&ÒðéÊ]ËZÈ>‘Ý:¬®]ëí/ W@bÑsÛGò¥Œ`ÓS´,?]®Ó²ÚKO®p€9vRˆÒ-ÈM¾†êO7™ìé4yyüx”Óé ¿WØŽ7âzÎHSÅ2åìq£Õ0kx²]'­I÷sÐõ ñÈ »ƒ—`%ÀtD_ÃŲ'_®Ø69$> P‘(oÑl Äî{SÎÛˆÍÂßãLÅQI‡lcÁ‡@ݤÛy¦¶–†Ûk°d‰·.ñÖ5Ëô€+Ì"Øó.¸Ëø7û˜ý6·U¬„}Ž6khš Mœj­ˆJ Cž#LPaH?ésí‡í®é€ZI³i6æm×§»9š;kOâÓIÏö.˜äãM]˜Þ©o÷Uz®fòVLŒÆ2iÐ(b\1±¢·wËàÁÅeÏÁÑ`D­;£ïåe0O/ÊI9 oÊxrÖÐøiÇÕW6ßÞÅfÊÊîwEú¢añ+ã½$ëèÜVh;ûH¯\ÜÒìHA@nŸ`°#ñ¤wí”O‘ëúó¬7¹vnrV ÍÄËŒèv64¾¿%‰¬(‚‘GJwH>êô%¨JÂ4 Ï1lŒgdîÙÍnqz8Ý€ØÑÐÝo±y¹ØZ*~×6MÛ\ÃÖ6oŠ;kÌÎLÞ8’¥æz¸ñç{#ðFhS-ÄžFzYO.6ç… Ô»‹…×À=‘‡6i±o Ì'™<¸ä ϽY{(ïàùÒâ\Òô%y8@ÿ6/؃ÔÛã`Â…ÚƒFì_zx±óç³>Üg¼SðI¯ È‘ôg§¯ÃÒs®ÞSåËÇ€=)^îe}Hz1¾6X3d*8'&RûpýÙ Ü›ø{9OèÃÀ“º—W.só°ëHˆ]œ§ö³ô wp^çJ98Øäõºé`^™‡ÊŸ‚yÐtî´nà8°/"èHŽXC.OðõÌ!Ê“ƒ"Rz’ž¤=ˆüïdyð&Ü-x>+L>†Æ8S½‡ÓŸ£><¾„‰þäpïà<™þ7ëc¯t#µ7så•Ûs0x{<<¸n@ÓïñÖŽDèÂóàOÇ ±éÆ%Ѓօ<ØæÀú¿¹„M6¶…I·> {°!ˆíC×üŇ¿v çÎÔ€ô£‹/Ú‡‡ no§–W©)ö|ü ÁŸ~^ï£Ï¹÷NC, ypðaåF¼'Á{’žÖ†õwøá^t#÷0«ëÁæÏ6m÷àéÁÙ÷5àx°y_­€î$yéOR9t¥¬'fCЃ>$±w×&< ¸DýÙ9Pl]˜5¥ßÉ‹•)âm°ªÿ:8Sóyü²Æøîú8°iÞt.l£Ò•< Í•ù'g=üîáÝBp;éêG*÷#'6\±À‡B8sòcrS¹mݸåÛ£Ù‘Ô¸Ù€sKùò¾?›ƒÎ”Ù÷øýxÌ&÷a„<©C“!Ñ„x².ÌŠqá"~|<9$ùw2`™ òú¸Ñ’âPÖƒZq¡x0 ³^^ ¯Ko#Ó§ ëøw{üˆSÊ“fOÕŸÏü<ïüÜ ú29Mäž,ŽòCµ½;ÈÓv¤<é_ S:ó } ÕÕÂ~ür¤:Òd®”Rvaîà](NòÝ@lHmH¼éËïHrã­’3B§›Álj¹ ‡½§r¯+Е?nò éÊrdùÅ'Å“ ðÂýˆáBŸßËò ý˜ûz¸Uö¥÷åÜ…2já ‹}eû1ñÊ8™ÿ‡iúÐ½Ì oå4¤¤›éóeîòg‰)÷`æ@·²/.@ìʽ™3Þ@ç@€Nd+âBý©]ܦî9ÐhË¥ ›èÚ“±qäÝ`—q! ¨ ܆œ ñÀyÒ¿F^þä¾´§µ*kB¤‰§ »•\Jöz˜ûÓö%NŒuàä§¹ â¡rHž¼·#µ/úQЄCØ”ÙàBõ | ‘ nJº‰üì%L’=œŸâÈr>¤ÉœÐÙó$àÂ'|éÉ)É”&'ÅŸ§èBô¥Ð6$xðëÔƒ'»:‘Ó€OCôðVC•!×€ÐÄÄ =©à—Å·%N\‚îãуöû™#ó¤S…ä»i s(kÊö²#Ðã[pó Nœ äJ÷)Ä—Ïv¤CBz÷"|¸ߺ0&¤)øý< KO èÿ24/G¹s¤ÇÊÀ¼yG‡„;p)ûrua:2jK¥<˜Ô“VA?jPÓ¹DâBä8ÙÈ!»“Ñ€C‰Å•^ÆQ6 M©DÞB¦hO•C»"œ‰@Ï*Tð2áÐ=8ü2ö¥¡ ùÐ'DçÀ'Zì CZL’o¡6å]f])БéHœØO:D Ÿ‚Ê€2È'½ /Jì(œˆG£#Ãþl¼•>d¢z0L÷#ôeMX÷ øå{0®¼Ø,:þ¦mweÚP6¤Ë l@­!æÝIýy9°î]œ=D7Pµò'JCð s(‡JEù 2ÂÖ‘è§‘ xrudjCèHt ½¸ûÑÊ¡èȆ̙¯2PâÂöí¡>Y|™2G~^ü(~ü(‡äz89–Y :>¬ gÈ'èÉß@‰èNÚ¡ ¼y\kH ¥ teêHñ Páʧw}/½oa]Wёϕ$«§"Ÿ }’äÀ®hB^¨H\ÒŒ‹d!÷ 2ÀšÐޤ¦îW$«Í±;˜èJ O›ˆDñ!G• f‘ÞHR)Õ·ßHž~|odÏMXGê@&„u$]Ì»p;0>$†!5¥Ó”S$'Ë\"Ø$;É4e_&Gf?ƒ+Õ€@ÔiZG»¤õcÑ‘§Ÿ?F]hE< B‡{¬¢tåGÊ€ŽF@ñ$5$Cƨ ·<ˆN ò`ñäâBe|¹|ÙP;˜ìàÑ5 L²!Ì7’Ü&!   kÈ §€NˆW¡"†¬ÍìŠñ¤ÜAÞ@ŠíƬ ›èu ËļèŠÚH9²†œœˆP6R(äe„Óä çB›iVAØJù’½ ÓM«•(¼ùñeïÈÖ]¼(£Ä“±ä‘]«òB‰Ûž4¨< üò¨‰DûÐ)©ãÁ©"±+Õ€çÀ§fñeS‰éáëBƒº€÷ ²…J‘"2Qòà^D ‰C$FArÂܨ‡g*=Ï€tàýh°#ãÀ¾,¨o S«('N´—k»iÜȧ2 ²ì¥S^xpd‘DåIͤ€}û©('¥#ÚÉÌ“íÈ<8UðäÑ‘ND § çȧà äÀ·(÷rTˆò{l"쨙aNîÄ †Y,ô!Ù_Ì@ô!>¤»RØUôo‚B:9—R_W…± &œ  ©Î•LØPzr›.MìªÁ Œ é~”œiMSÇ€DÏ*!ÎÖÀªŸ¨'·JAN< }¸:0ˆ›8Téʯ2 )½”Å…SZPô!rJ4¢'Ó•ÙLø|xyr± îUuåC§:0LJs‡Á'u9`׀ąÉ"6U8‡­å”M¼ éK¡ž´‚fB‡Ÿ!äNHi‹ ¡Ø”(’~ì*ç€Ù€TøáCè@/ñB†êP6aC×^<§y(:0‚{‘Ÿ?.Ey!áHœÉæÈ§.@FçÈ.Ü(}ûyñ¤yëÆöâH/³"†ÜªzøúІ¥¹€Ë wÐ#º€LZ0»øS«(‡·„SB:röUÉ÷àCbý¨ó¤ó¤WéH=ùSJ6dVZGÒƒVãJy×—*{2oa²©Átàø!6Ÿô²+µ„z2(¼¹G,¨µžTÔƒ›Þá"Ž%u`àJëʉΑsáƒ(yr½IëJ½üŽöCNWBQô.t ßH‡‘)º”ZD>dƒÖ”ÚGy*‰ÝÀ<˜MÌzÐ ö 5àģɅMx= ‰n QðdD ×O*)@uåRDàÊ ÄëÂv‘ðÃöeU|¸Ô„NŒ‹Áöà5e‡ì@/s ¼xóBëJ"TI;i7rð¤TÞ@ƒÝ€W±*œÈÙ‘7’ÌŠøEûò‚/&W} ¾Ô¨'"GVD~Ì»0+š|ˆPôeSÉ„W»‘\ g•^ªzP‚ÙDäA×éB ÌDÓ…—"¼àáâ…DÝH ßHme šp ô!:ò 9aMü"d6P#–C¯hYdC6™"äJ":²H@ãÊ"n¤åH "BAt`Q D7p!çÁ«8PàÀ¡É•C4j¥ õ'¥*? hÂŽ|†ä ¿çŠ;¨¥ lÀbQ:R¢œH‹ »ˆ\¢‡Þ•S‘ìá6á|)QâÀ#´Žîis¥Qñå9ð"=Ô)vÒ‚™Ò8LéT´"þQCNTÙ4 EäBvàG­$ ЫДSÈ”Q¡ ¡æÂÝ‘îaE~ T;ÉP;*iÈ«=yU5äMĪt¥QÓS¼…4çfMYEiÝ@‹¯+À92§a ÅëcFyì"†žL ~Ü.ËΔÌ9Ó¸Tô N´*kÈ›ÈÆ7Ç€ú;éíH&´(›xA7ÐèQZTSV8!Ÿ*b~Œ ä…ãHn@ âH\ŽþT ˆjƒ*œB øM˜Ntˆ$=ŸrìH/"3È”wWRE<ªô£ƒŸ*oä}O^TzÙ…S$ ßB¦¬p¯©9$C½9O"xÒ ”ŠjÂ9`GÛ‘3®Œ(.î@Є3¥PB ‚~”ª}yG©íAÕ¹ryò¼^öC x0¢0"¾®ï /µÚ6ZØ ´œÙ&\¸  ì¨ èÂ+þ4 'ÙKׇo Ê…ZÒ€3¥Nü†]̧Óq()Æ„5áЄNä«ïBØ]¹B•øaéËȇ¯. ä/¿"êfgyü(èùŸ»GbÔ™d:0 saN\m!6RŠtä{C w2¡õmü+©>œ‚õaPâÆ i9ò)úRx=YGV;u8âHœ"¾„ñzø,"ô¥|™DÉ*tñ¯DêJÉ” © ùxNt4ž)—Œ‚ƒøåyð"Pxp©Â„;ØД5¤±*úÞþ>Qu$4´Š¦Ôªâ”>EÔ÷ð†¼ ™`vªž´¢m­¬ >?'ž2Â!º…ÄŠøðs.T zClÀ¡&h9ò¢ý6å3¥;°'™"gÈž¤¢ ÓŸ*( š<)±¸…R…¥E¡Z¦%+bP ämHæ‘ ézô 3™) ,ü®XN–wk" q¤NLªº°îÓP÷à×€Ôg€]YE) I÷`UÕ…DÛJ#úÒ¹`UÙˆS{ƒ–j ܆#N\FI? §óaE7p }X]üŠr¤^¤¢' ?¥(!âÀ¡Ä“Núr‡ëH:pÑ„iEî@(™!@ëÀ®œ ï ö!U<ãÊ#µ©»€ä‘S“.ITDŒ*Á‘Q7r  ø0 ¡¯"ðáT Ä ©*Š ¥fÆ¡*¨ó%DëHˆhׄP2@ |1ô!íÀ(odt C•#û2ˆŠŽY¬—‰åJyÒ;S‹( |üÈPÓ”O¹¯* Ü*~ìª÷dÚ‘CNjEåÀ ë¿jAË}éG“ Ÿ!Åßȉ’AVND®ÒWN}ØSÀ„_Û„÷¡ht¥Í ÷eT ôÞ„6PN¢¢läEzR&Ê@óåC½y'Z@ƒƒŸ )¸…SƀĈ«(m"¯Ã)ïJ@JEsØ‘Cb>䢯»¼ÙD´m¶™2)­*z—#Ñ€»€ÙMI'e.þÐS‘"'‘‡»*ne{É7ˆ›]>¾ACéB£Ô‘¦Ô©*ƒÞ½ICåKè@‰|[Õ‡ ²ø’(f^&Ivá~Ü öP¦ê{A ° ñ¥>W$³ d@îȯ³'‘)êÀ‹·(hSéB¤… ¿bAjsH¡ùò"í@Þ…2Âͬü!ìB!’Ú•}ÈDÄ ·ßÉ„• ¼yC*f“Ê…S«{²óeA8[[lŠ!Ó•@û’›8O±Ô”_N7Ðt"”†Ô¡ß…@Ô•çÂ&X][Þ…÷©SJN”ífÂ.´­ <ˆö¥úr Ó‘4 F‘Z(jAfÜ€bäJÑ”9R¢ï-8C >œ¾ÔèÈ9äSB7p*ü¸7¯FQŒ(žTµ„fQyR'{(/“(tƒ(YSŸ.ÚB• Ì"{’Ô7ðšQÅ’CnDðaCÛž„º!¦ÚqúRË ‡ö¡UЀ‡ÍGŸ¿*u l‡6éÊ´&„€‡i*jÀkÀÇ€q ¿…NŒ!ú²¸„Còç— E9òžì®âD:‡JêJ)ÖÏ"nz2‘"êúxâB†hî¤ðeC­­;ÈOk€SZ«Æ€NÁ”u¥{9?¼‹+À—éÈvvÖ¾0td¿ ô†ê4`×µeïœxq ”»"ICÌ ¹Tñe^ìÊ;ð†ÜèNT éÊ=hC½»ƒ>ÞÂùÒ=HC iJ8úp}éõ¥áJz²>S£+ˆwR®âDú² øò/ƒ|B@Ó”åÜTþlRW4ZãÂx|;‹…þœ'"P8Œ+ñÊ6Ö“×ð%¾…ú0§Ð„Cy ïöøA8m@éOÜþd‘@¯Ý€êÏ6Džµ›Í«&¬|"x°/íÈ8÷».œ£áH§} í`üÉtgÜ„8’/c)F´?:AíB.sdÀ‡ÃbCÄŽ r¶0Ÿf7QÔ4£"ô9X@ßÛP)Õ‘Òû’¦öSíÈ;éÑ„ð`>L§ïüL)ÔÏ—oBSo´._2^t £ñeOü°½ ¬®Ü!î@ì@P‹…ó ð`æ@uäãJsàxrxpê\ |^ÂM^NØ6ò ¯<™ЃÓÙ`S½"{ÖöPð¤Þu°§/:7’xм(¼{2¼òïØ”3@ð'zOŽq(î¤Ø“j_“Ç$¸Aåʹ£NSy>™ìãVÌ„î£Ñ¹›kŸÐñ2 ø·xTùðž”å[­„ÛÈëIHg/aü½÷ uçØDýWÆ”:,´»Ùý©*TЄù`áÈéÈz¿qù˜›Ï€O"ç ú''"+Ú4¡ſ†êAßÏnG4¾´Ø¡>^PóáÞJt#u på{Ú_ŠGFUÛBýøWÆ€7žFs Ä—gŒ rgÒ”zrÈõaOj¹ hNÏ„Γ£âÆä”}]œ)Ù“y#ö9Xv'—½ø@óaÌx0>Ô;hz0._._Ÿµ õ%ãCI¯~]Þ“­|2½¹ñeàêáM™S‰w¤Î•úR>r=ûjý‹îí`ñ-õ"玢\¼~-×®Zê¯ã†e-œàZSŵðè¢4»'_û´ñBX¬œT,e=³„Õ”¢þsõsß“\驃u4 X‘|e¸ìÏË!úçñq²`†1Déz08¿øÛ'l´ç ¿Ì:®r'š ‚ƒÚ šocŦjŒ£U k’üµžóvŸ7?·Ú M4¯øHt.•Íkî\ ÏE@…’˜kq9»ÆÑTjŽQHrÿµËjíÞ8,u¾»¯¼tðé*ï/⛈¥Æg Ékagý»¿½«zŸ6Ùm`9²^®½Í嬣H+ å¸ÖoÒ ½‹Y9Ž´¶í»îªÒ‘4rŒ~$>¯R+õN’B굚gj™‚‘¦½ÚÈiq†iYHÆgV³©ß‰”‹òº0š“aµ0/·e$HâÎÈ2À±½Uóª½}!;ÇW;jxyÝVÞÝÝ×J9ëa ôó’½ø6ó»?ž(Tº t÷Ìë¾Ý¯'ü)ç4Ø×.@ëý?M°'K•æ=ˆ÷fŠÓœiVqŽœ¥Îöp„Ѹ[ª¾‘=¯Äû¹æÇÆîý(Ý4žF“U1°ê0'@‹ž‰¨”Y}4FŠ{ë¼bïü|ŒOƒÜ’ër]Vj\¹µ`uÁ`çžä‘ P‘š%Òì6Ýyÿ^k¬Ô6Õâ&›Ùƨýµ]×VTüŒÍ ă±Ö"Ì Œ!0»ê–æXøÞtÌ7µ¾‹tЏÐfÿ Í‘€«‰ïÌ:žõ4¬J Yv#EôzY–° ÒÙG#Ë×äм nF²7ÿ»MfêJòª4¹yPÓF‡Ë××ì7/ìIåd¡-ÞZì÷wµì@?‚…4¬™Ç2ceÙG#óŽß{Ͻåjûµ6®Â9F¨9JEAÓ3ËM)äÆ^ݵööÙáµ€Ö¾©0ä$ÉAhRÕ§»kÚ’Û²k S±Sš>-¼O›ôëäsUmÑdÑóæ$á)ÈöJ•мÚÇå^Å;Dünzލ›Æá(²¥œ³k¡|Ìú‹ÅÇTAp@÷~œÇå~ ŽûýþçmùñIyFÜÍeÿßË—ªêð'Ûý½{Óx¨‚»3øwxuî â4çWÄ"™¸Øï;Ètî…~¯‘‡ý›1©=Œ¥DLz™¸Ëæ¼s+ê÷˜89K¡>GÒ¹¬yNcZÙoo+pꚺ²ƒ–@æáöH¦ =#þeèÿí¤E0Sÿ ß ê×oòüX-êïEŸùTo3jä„È~Qžý^í–.qP9…J©"}‚"Ž5oOx÷;Lé‰ÞÈ«ìÿçb"`x*ø££wCŒÖhuÚ÷±<[ô5äLï›;Êj‹UŸÑ@>#œ ! Ý Côü:»þ‹säTïzå6”þŒEÓC Uíu›ÿçûüñ˜žMÝ 2<§p ºöŸÙ7ËyæV4a“¾š©9N¿?âtzPzy±ûX¿†3Ë·þñ­~&É®ÙsÑ(Ü­´Pˆ£ü¯ÑÏP_xî´FëßþŽª§2ÙW­Œ2>BK>ì)i^?S/ýÏ8+PmPâ›#2{p=ö ÎîWôÐ…ßQb6^5|¶¿Ä|îcìX.ÂÖÛë-Ö ¢»Þ—fËOòmAgr±Ñ’\–©­»>ŒÝ—b›Vòô¶7»¹ÚpÌΓ”[Ü8ÆžÅÇè7?s=6î/V 'JSüØÿ-–kzG.Þ{™C‰¬çëcžø¾t”.^sM÷FßÇWS¼õ-¢£Óð‘¥!2Ó6ãmî8‚;wWÝ—jýÎ M÷åªå_ŠWбÿÊ€ë¥hUHòƒ¯Ô•ñ¸³ÞFÑà $ÝéS¹ð³I ðQGæüa zãÇ/€w2öÛ: 95ªcs=\¯A­¶À,„Ÿ¡žêqé#31î´/‘=EG®éU ƒx~WJÉéOò¼‡²ê—Y­3yøž ÄÆ~‰þLõ`° ¼ºÓ™23{œÅPŸ.«ßÛxíÕJG2n/ÚÜz“nyoaØ‘Åv ºùºVÓÃÒ¥`{´Zß&R*fµÈÍ&ÓZÓê¿Sª¼sÖ‡¾Øð}¸#À9L‚jNpÐÔ®‹ixÐ’î?w¬¨ü{~î…ÿƒ³Õ< Ôïâ7:¨6䆣üx¶p®&qØ“údÖ·=~Íw—ó¾Äî^`l)ªë?å}9™^ÎrW ª:±ªÂ-Í9MD>õ.‚ºvbºj”½mU4*0ù°*ÎnÍÒ=%åkŽ£0G‘—T¥#ŠKì3û˜ é=ã&>föoÊx×ÌkµÎ‹†bÎaòŸæ°Ðª˜î…sÂÎqµÀ½ |m4˜¨Î¤Wî>Í¿uŽDôH‡"+µ@àás§nßÐï'(àý˜Î±6Mù0 ×Ôšò”gd¦£"ª±Ûh¬àºŸãßÚÀF¨øÊB‘ï}ü¨Þøõâ!¡¤<ŠÛ¹]C“~ÿfwÔ°bVಯäjÿÅš^ÿ ûÁƒÖãØÓq­œPƒá)_+úaÚïšÏ㕃ÎuË3Àïϑϼ'‡æ6騺V¿geüßÍ÷!öît4ñ|ïV™™¨Åš9õ Ž@㉥úyòÀîBY!êç]ï¹ ˆ7Q<.·o;m˜‡»dùÅϾâP93ÞÅÕÁ\v›ÉÊX^jŽÔâ€5y›Ód·çCV²sMÎgP¥·üCÄJ:u•Q¨’¯²çl+þÔ‡Ãï/%ËhS{‹7S™d9áМ²<¿ÃIÖ‘†Ÿôâã»/€±7ÔñîÿKõ¥üsû-º}x;Œ»Æq†7/¿bAƒvP±â”æBºgßÑ`~”PŸƒ;å|ñ³ŽauŸUâ7G`£ã"á°¬i)«W]8ækwBÍgzñƒ“x©íЉږ«zÕ°­x~WX81–:UÀµ{ ªs'>P§Ÿéð3†>}ÓÑ6 LÅê™È’Y-Ñï:,LB–_’5¿ÛÙÄyfl á@i¿’&uLãæy·˜‘#ÔCøO°Rä¦÷v“Vo}+—«u+Mß'_Óf¶-u~ÿ4£%ïYÎåì–ùÛcTEÁÜÖ˜Ž“¼i×Ù{Qù|0N%MÎñ‰ÖÌ(ïƒ'¡ÿªÙÉW›.MËþ­Ó $¶ïvæÐºãq`öžc•f6®–íM¹ûazZùíõK§<ªæ{¥ž¦pLˆ±îDôR¦ñßùžüW|×éLO½?q‹…ïdÃBr2ðãÚvºÝΣ ײ¾x=²ûÒ`¾í( ´"pä~¶n8WŒÜ×ðc~™I›Ý¯:]¯?=ÞD?‰‡ी»gæ¿KÄPO:µ”è{­Kh•-ù½ÆÃ)U[O˜ô¬öÂZ;íK,\;’&Kû¸ÚÖ¤^Äe¸‘»—Uñð,å­®á’.–Ov¡áæâ|6\Ë´§êçþ{½Ì&¹{<ï=¯Ås`´QvMðZubhÎëA½w£äPºOÔ* û¼¯Ö·k4­™Ÿ¢ÎâF8:8«(sÁŸK«\Ôÿ?0÷{Ë]aï*Çé ˜6ò•Ú]ÃBy"4ßÞ»×|~#=‚-  H Z¡Bj:YÝLÖ’‚íÿKõ¨v¯ÛjÒAÝu÷3v˜OÔiû¶]À:Å?¯)`¿Î~=§Úeµ!1qè²tüL´‹¿¨ Ö…1xs=¦g²0ºóÎŽ\c»(,„ƒ;ÍçåkýL!xF‹¬½Ó‹5.Áƒõ½6Ç/1²Šþø©ß«þ×Fö¯Ûï^D&×g]mYÄ¿„B,<Œî²©ôF¥ËXuùe¨y|ôÄ Õuà«7Ö:þë½5r“p79?W4ö“í{ÛŒ›¡@A³ [Ö(ƒá®\Ÿ‡lÄJh¯²vKôKÔð]cÍAy×ÛÖŽµÛì!♓}ìÌ1üÊn”r!í9¥Ñ‚RE­÷÷?Z/ýcÜ ˜ 'sI/ QŠ{Ñü<³UÚ•LRùÎb¢qvÀFÄÓç^ù†¿Ù¢•¬yþ»7ž6m};¥ ˆ^#ý[ÉýŠÃ0ù–ªÆ¦ˆÎœƒ—½T)ær”e/JQ9@6±Oõe¤¬/Õòð©ÀàaL²hKÞý¼iAê[¨={Ò?ck }X]YCäìþ ‰Þ‡ô1‘~‰®¸ÿµ©Öî`]Â/-gwÕîR±“ i‚íqŠ —öÎÅÿf`Çêf´–¶Î§øZxæ¥ñ”Bñ½ª ôîñ6GL¹_ÿÆVQðrš ñ'Hlð &'CoÝ’lNJ¾õšDÒŠýf Õ§žé/eß3£ºæy­[u s b6™•Œ&!¥1R'¿dŠÍÍ=ß)¤$¢9žµœ¦9>‡ÕÉ¿Åpc³±?íAäŽeÁ¤>­Óê_Ï*å™ÐT{?'ž j¿Àí¡l@ûíWjí%\ñ½âpJgU­ä|12 »°oïÙ_;Ê®åMÔöaÉ«•AצŠ`DòJ锑rdal•*È}¤YÂ?Z~·&ÀOdß´“ÝÍ2ÊuÄ á®äôÍAˆÍ@Ñð©«·®Ò¤¢Pe•àA¿3_Òò;snsÈ‚ú/4]¿Îa½#®‘d-Œ+ò?¾/}^â2Šfvk¨ ¯<4Ú fF@bÑ>^-ÏU‰f:¶ìi)*—‰ç+†ZÏÎ{¬n”,'\°…-MñLô:ö»^Ñ“­ü](ymŽ<€,>‹&{ÀYhÊûŽpüI úÉo,µø~Å*OKBÄ„´>ŒÇ”àÑ»³¼jz•B_#óù{G0~%¸ixzïZu± Þé0o2pë±(žL:w½!”¼)gü»#‡U™0Ñ DŽi´ñ½ÞÛ@X‘m b ¢+aq¯kì\ÍÜ5Ä1ÍàžqAýǪyクMÖË`èdš~t4iÔœ`íN»ÍrÔ@Z9š²p0¥ùM—…6:ëé ÃìZ½»9ëªSbPyX¾ÏÍE.ki²¶® 2깋½Q›ÎÜc麃žRè‹Î2ëùøý-÷:í¶¯“ñ™‘c\ïî²r^Õ™úÈÎrÑ6 üo°É-·‹×Á›qXÄ‘@¹ \ñp¶Ó9.zGÕ¨å¼h¯<Ò›êcfø¾!èÓ3 äÉ_î¯þzÝN›À‚A°5UJþu/õ۔߶ý(òS!m¼_¡ý’ô syL™î;šî·B[;"4¦·¦¹º—r›ozÇêv7¹íÓ%ö:Mˆá[yn€ä “®€‰}·™ÇÒ»MG¿ÞDý³3]Ö>(%½d)cPô=óËÄÉi/‰Ã¤^!2»)&€’ÄeAß™â‰Y4µ»Å[|„”ÛÙ¹)[µbl]YD2&Ní/¹ùëž'W=šíé›D÷ÎA BR—å%ˆƒäÌîÚ;À‘Ò€ñdÄ«ïÂûðêCñÉáÚWðàü:?½ #Â:%}/È#›E¤Ü̼síX}qÏhóízŒÛ¬zv´üò¿þVÓ‡jTßÛw±"dŸ†7Àùѹ‰ÍóG~Œîã¥é¶9·J“o'˜¦@ØhÍÒ—¦°€‚R§ü+{—'Ç´dׇö|ß·“̶ïäBmB:²'ÞéÁÆ€MˆMiq r¤yщÞu~^CÝ”ÝÃÚ„v¤×ýŒ!Ýϵ '½×æy×:óÀèp¨T#²“$nM¡â¿)fD‰HR(Œ¹D‡3F3s¹×4ð¤ßêÖˆ‰'R·úŠ0@…>‘—"ü§H¦À©ÑŠœi7ÿÀÀ~.ó Òƒã9}ø}Øè§ƒ§ÆžÅÿ_•F¾?|×-–´rß×÷°.kFN m™Û—v3¯L³ :”ÂP)D?ieÄ#Û5€D»šTë{'ÝyÛž÷òôX‚w² E"P¤·¡£˜é(¢.uÖÔá@Ñ–BkðŠ Þ˜Òœ(e®CTB Ÿ·„¾ƒô™ý>å¢q¨4!­³W«æ*öpv±Bj‘«úÔ›X©jS¶Pn ϹTOµ“Áüšùüéð<œ?¡ŸRG^w+øì²¯…<Ùƒ¾k[‘ý_Ñüº%æ=&‡ÖyáuL Ë€ÆÐÆ%K`Kß´5¤~J¶ /ÏÊsû¿¥`xíûoȤ|sšmHÜõÁë1Ûª…Õæ#ZÄr•-=eãáW0 H=¹|ˆCmƹ= Ü€v½Æ6R†dJSc/ ·À}™>¼éM: Wà‡ç]<¸^ìd=™Ï"q$åa‘ ï ïú8SÓ€ëBšPRûÐFzÝŸ{óux¿KÔí¼Ýè_¥z}†7~”qj'’ñˆ*H°™Â÷ }W‡ë75 JÅÏÚ{jçÝ­Z}o+´ÚVW/@ ¬Ï€Ù .Š Âé bm¸Ô˜?Qíöç°>/N>¾³©‚P`’ˆ§! pÁ#“2¥Ÿˆï )ð•^ú­”1–wÖTv\ª”I†€…×@wÐnt†ï=•Ü;Qᤀ¤h Ч5ôÔe×›¤t~«ñ¯€Äo£eK23QöŒôL9:~m:ÞZhl"T)”í2#·–Ýò´®9¢3ä{`8§rGY¶õÍ "H¸9géU¸¶u6cÄÓìŽÞ(Ì9ËwpPÌÖ$Eçø{(ö’£â?Õ!ÃÞV(5kqÌ[Øè¨¼Q‚fò“ò0ümjgžeFàØëäsŠňÔ6,(û,F0Æ¿ìÝ5FGÛyÈói³Çy¹ qñÌ&O¡©å0ÍÊ„&áV¾&"õÚǽv¿ódë_æAº¥²ƒ=~ß‹ábS™¶×lŸé¨ìÈÅj<½Ö…¤kHè<›^ÒÏ7žÑvô)åÙ@:9à¥v¤Œ£Ò¤¤…h %Nie`cOpÏ4à:;²Éãæ½ÝÇ·bH=\sâP/î¶Åšd MÊŽ ë&ûê:ö˜ZRl‰zx7º|ºçå‹yù˜6t«ºÞs˜þÂåe²™Î£©¾6qˆëmóØ0¢wY΀©0„È)ŽõaËY¬+û6ÿó½qâ„ßå(ãœò0Í«PÄàÚ±ˆÖåÜ0ÌÑ·èÀ-k¯É‘]Cà¼ï<½ê„îä*xÐÚ:¤©ö¬r¡BN5±‹ ·*jÜÊ‘‘ôxï¡Ö”Î9ã8,÷¹ÍÌèâØqÏ!Б÷oJØ¡?w§&‚L¿ÄBè—2Í&‡ø|îh½Çí¡Å¢|þ/+Ö(Í‘ªeIzžV׫Ӥ´¹t–³ª2HÃÍ, לÒ„ÙK5á鬞õgŒ=ý1i"Y?œb r­PÂÿëÐÌÔTÞK±Im!"úF^-ÑVv˜mÊ$ u ¢þ¯°.8nüy‰ü¢ÐМ©é&@‘tùQéHâÿP,¥ø¬4ÛY8ÛePßÎ6V Èo¯Nò>ºz›eïáËèÛ².Dd(x6šNi×|]LGû;™XÎ}«ÕoÌPð€ÈUÙÕÍ1f”zÏþ¹RòüqˆCiTvèMÛN^EðŸJàœª8©|ý/†Ç+‚õß=ëp4°þágJõ‰ˆâçûh(<kýµ UþË7ô¹®IŒÂ]‘Hc”bŠAåÔCH¨›>›Š1Í=><{ HÎå€Z™µK¿­PmÈÔÖ(¤Ž^i–‹Q¬TaИ*ŠoŠ&;‰£cG¥Ö*&ò9ë`^]ó–8MšL±N¹À‘P7D BÏ:KV×@‡á·Qµ)eÙ²˜ÍÖ¸:uJsˆczš¦ƒ]QfÀì‹Õ™’è Mu£TC_/ çG„²M>gÁN¾œeÛÌ EIÜ:¥AJýlÊP Qþ‹ô»«È)À =?{…DÛcšx_4—îjJYE7Eb uúj?6>i¤ˆ"P‡„O!ˆvB›6ŰQId±¦0¥Üº´G£®—wì¥ò#éaÛH_žÁÁ.’¢u6ÿQ>d¶Sbû¬Úu5sÛq 6ø¦ šéË[3NQÁ[µªˆ+ˆ[«³#©¸œãEÇ“rõ£hùm^®,ço R˸¨0u=vÖ¯?1ågWÜê´E ÕKÃTo[Æ«!ÄÑ+ó8tø'R ÷yâN?ZE£34Øy- ÊÅ™†í©Ìàùž#R|©ÆA*Øâ¯ƒLéÔûøyŽì)éJÕݬ‡‹í:AÊ!( Æ•¯ÊÖdN:¤cèW3›@/K,ñå™XczvŒ óýHS}s™êô[Њ£¹2D‹r‰nEѦÚM15|E‰›¿å>Ùȯx¦/ÛQô5s8«³ ¶$œVG§Ÿ_5ÊcŒDq~µÅ,Ên˜ËÂÖ52¬rXñ,¤kò¼c¾c1"ve–‘.–Šu¸¯åáçï¯Ý\v_ ‰™‡È‹#WÖTŠ0 ãÈóû®yØÌX%ÕÃfüБÇ6}’µFNS¤i Oª äK7HÐY5‰–Õï9ö ušÉ¥£¢ldP»¯özÉ[Ç“2ðOØðÜÌg÷›^óþ¤g­Ø,³ž.‡¦÷™ã¼JÃX@›³¦‹íPýÚØ¾]ÕX‹õzP"4¦ ï,¬K¶†¼ Ì5ä8­ œ—_c—‹ƒ¯2õ‰`qýUI*X6V”(ÄoÜì´lê¼EvHå÷¼÷ÌËÀÅÉn%˜®}Û»þ¤[L¨“ Çüí`fèñ5Ú«§û7Š$x‹˜7¦5TCG–«Õ†Ïi|ÉÓ¡$}Ü$öê$®?!€«m6¼%É [CÒ#¼u¤ ¹åD®jÓ”ÆóFÍèxò]ÛœFb²ºMZÍç™»ûS¬’Ør¨ÚýɆ¦ÌghÄüR VLl_vK³­| IžÓeT ÷¶ï>jX®Ô>«zŽ—;uYSp¡8U*ÃY†¨@6GX)åI…ÿ·¹­sBVP¨O¨6´¾×«eÚnoKŸQñ"é6ŽÛŠÄ¬ï•yg®µÏß°î”sLHõ7Ûræÿ¾SoÛü¯E/9ò˜‘®%°&M¾§gAÀ2£ë˜€d›’HGýk Fy“‹¹æßŽ#—yš,©t)"΋%ð<5­ªQ¹5mÇíªÉÜB°'á‚’\µ S¯¼Ë»JN¤dJìaü«ö’&…@î¨ýÞþ—䨬¸v€^’@ ,ŠÂ‚‰ø2¹nÚA\ç%á[8ü9l³wþN‹ÇÒŒ¬_?„ÛWò^÷è`{ÿ¯ƒŸËñY{qyd=Áù#ùîpt÷ÜÆ´Ã¸‰zÐY6΃qŒ]ÿßðRǸ6Ï÷Ì1’Ì›( w/XŸGP }Ò±Ä3¿«vÒp`½¶[û˜LÒ˜‚€PÌ/ŽP ­8%©$F‘>l°µ¬¯’ü‘o>‚ì§>ÝG¯ÐÓ}]“i›Ôøõ6T¯¹«•=ÆámçHÑÁ»é¾ð/[ÓÍSµÁ!,§´-Þ#Àâîºü®«|J æÞw$ô Ì¬¼(5s(–"ׯĮhN5v×ÚçGÃN½UFA×µ\’šF b^x’ŠbSÎ"H òééó­Ln[ö1n¨Ó`\˜]j´)«õ¯5”R¸Q¼ì›×’VL ¼£”;}6÷Ëoã#¾-=KC ˆHŠí=dcƒPj©1«Ú1¹X×®ûº–8ÕÐa¶{Çkûn …Âð‰žOB4´_>L#írdU8€oA(½0NQžD=®·e9?4~m¹~èÑ7ü}J†Ã lõ_–ܦ2¤âÉöÙÉL=G쇛Ì[C>»ƒP7±$¦›|Eï-ÆýEq)ådN(︣î7yS.;w,-ýS*¾žR9 5{ØWA¥Ò.¸ &cõª!a³Lš<ؾSõ—¶òû·Ãâææâ £—OY+“›^ËÛÀsX£O¡>³×ÓzìFg¾il†Ñ¼kÊ—‹ÈדÄêF̆%îËáA÷$Ú·ñãCëBG Ñ“FMüúšSBjÁžPåmã&Ä©9¤ögnô'N=™O̓ìÁïHç^¬íC’\óµ6TÏÜJåþN>¬ s‡æãgÈy²ofXÑG}›‡[êØù°40Ùõ!¯òãlï%ÝÛŽ†2ZòßÈn áÆœ¸›y& 3ãJ4n§÷§?;î?Ôèeî]¸70éo‡s*lAñ_y º:òŸrSSèÏ>M´» µµ!>_bG·”4a ßÛ©ä֣Ğúýˆõ¿kö!ñcbOfÒÏë9 9‡²£g®qÄ ë.¶« Ë©Jˆy@–ÄMyAºÈT¡pdâϱrgàþ&òÿåG§y²~¼'߀5nôzCÏŠ?ŸçBñg…‹Ø“Á½¨æAχ¯¼¸ýý\/²ŒBÂGÜèþ¤®HO­ÑÀó¥Ùž|tåëI§éàЄùP~|÷ Í'›.NêCïOxW¥òì°uatçoõg{áaË!Õ“—.IO}h¡>l»ø;÷ÌŸB>ܼ « À‘>dø5¤ JU"×¼Â&ê^4 Ÿ éÂæƒ±þwÒœÏÍÂ9t½ßåÿÓôScDO±«Ò”Ë&´"Û€|Èw‘ìBWƒÿCAlñ‰kÅGÄ‘MxVÕÝZ7&Ðíp‹§)åKú°?»{Œ#§ õ#Réy8;9%Ø4|Ži´mûØHW24~¬£ÙÏ™; ÄüF%çÕƒùä~Ì©äÎò>¬Œ†Í@?,'è@}}©<}¼£+o0AæÎ,²¦„„5ÔiK+aç>=³âßàHŽk¾¦ês;F µ óàד¯'±ËÀú¸Às` ä ðÀ½ÕΓ,§ÃÀwaóç}&iÍ' 6 ;ÛZy?.3ÂŽçpaÞƒ‰*åŸnêB:d+H†¼#Ǹ?ƒ e³!? +ɱ’ Hzr¾Œ¹ö„¡)ÙGÜKi Ä€=ˆ]Üp >¤§y>~_æc÷ ÆÏ; ²¸ð<ùM죳Èßä,”d!<3à7 çÉÉ”âßÃ(l§/a‡§+ù› |‰€;O Ù]9?†SøíXƒZ>±ˆz:¹09¥6%à^™y?ÿ3ÇΔçÀÖÒL²ŸÞq°žœéÞT¹óÞ÷ø2KòNú6n_}èÁÔº3»>}ãHqä;ýÆÝ“^<Ëà—N4!êÊæ¡ËrlÃþÜ0éÈú¶¼l'Ç jÈ™>÷lFÒsá6²?ÉŽ|:]?‚ÙþÎãÀ¿èOÜÀ=œø^|d#NGìÛ¯? ó¸¿M¸>WóG>¤CÔ‡B4áÄÿuodñc• ~ä]ë‰q ˆû_NßN¤׃Zü½ÞÂÛCæÝ´>¬NЃw.ë­ÜéeDüp;73óð&þMKÃí`Ak­+]ÎAcÀÖN\jÕ÷L£rÑá]~ާ}( ñµÛÊVPùN=Yñï«È»án¶ºùƒ²ƒ•!ÙBóoŠ )vP>e£øq‰9ñºx1't¬Ø2Âr éCôeàõ°&æGù´¥póç±)Î5à Mœ.îPÝ´XÂæYz ÛPp#E‘£Ž,Ùˆë˜{îç¸ÈgÅ/«Ô=.Þ×—j_ô¯»zèÝh,­%x»?•‘t½üc¼ ÙA§>\n`3çÊžtý8ôc{.hô£só°qìï”ÿ:Î5¤çÀtàñoN]x3á ÍË”ùPéIƒNâÁüYZO¡ ¡'Ù—Û—ãµe J—­f„mmãYâ˜T쵤 mV TÀ¾ûÍ(F›M¢¨2ù“ôa=ÙÚ[øxò>•êÀq wИ‡q`ueìÆþËžw+G#܃¡uåÜŸ ¿èìfWJ\ˆÙ„2HVrÍ'jäÙ$äɦó:>Á¥ŠzÙªÌM-ªà4SHJÆ—vÐŒöÜ<C.@;‰1.xЩÚ³n0z2‡B·ÍÆ=K›k¡!óãêHe仨2@ëH¹6º9Ýχ»µ¡9rÿ{ åjaCx<,¸R«Óý¤ò³`xP~ÞÇ3 žÝȇÀþÚ{}ü;˜ yÄ}|9.<¸‘ÓƒŸ!îKçËÝÂïÖùÙ7ö¤*¸€9¼)Ocƒƒ»æã²‡k“™ mš£óÙ[xíC0°Ò}þH/4‘àቄ6­ÍLâG6;òlÖÄ'¿ ’Nü0:RYSnAµÜû¯ˆ@&†9’ëÀû§ûõa9Úx{;HxóödÔèà^ÒCfC•hIÄïÞ<»ËÊïäN4ºPŸkµÐ©3¤ã@™dáOÒ‡Þ—4èC–xñ—s ±uüœÙº“Ò t/^\·Òƒ,yš¸xòøpæËìN´©´Ž”™dçBbåûX~ì!Ÿ­€Í=ëgþ¶^¾=ÙÔ“?~Òìð/¯”';k½ÛnòÌéä;ùH ¬ƒû2!ׇ«dàKćs ïq› e^¬¿.4$ìúxN#ä‰áö0Ç”<MhÐbSž¶<™Ù”–=Ôa™‚]ãIvÞï‘(òy°íÀçÃÀƒ{w¡yq¡G—#«#š|ƒ»9ÅÄ/‘…Îäõµp=ýH4v¿ÝA—ìà5ä;ø{붺ðŸS—„Å)ÂÕÂ)wÖ:ÖHC282Òѳ xu?†Òð¡ ™§)Ã!ӟѵ§¡ŒnO™‡RàÉ÷eîà}ÿìsòn^Lä –O.éG“ t$^Oá`êYÒPýYî$6#,~ìhÎ~—sÛsµtË' 5ãR÷e9Ó©?R¹ôI^¤9Ù°<ù=™9S©yk݉îüì!µiG§q#4Ü<ˆNU© lð0dɀħvo"æ[RêKÊ¿“ ÎÓÁÈ•éÀi|xK}áÂ24·øsê5å±W¼éH;§¦öýì.+\\°û<v {0yìÉüh I9Pœ®Ž,¾¤/-æCšMK³nãFn<ŸÄƒß—SKRÆS4ô`y{°zðc·ÂìJþìíBòä= äfŸ™ÉÀh¤'‰&Ä»‘âÀjùs÷0=½\'BCæÇ6˜8³š_RéÇ‚ÂæW‘‚ƒsKñ±P¬gx΋;MÌîX~¬ú5 ôc«)±X7óåO S£yö|ö-çs‹|H:p&ž†Î…{0k‘zÐü®.ZLÓšv t ö.l9¤íBt,’mF/›‘3AÚ“4 q}ØfÖJ ¹Bþc#V Z Ë绹pÐTÒ Œo·gA£–Å‚¨9gË̃JÒ‘Ä»!Éöòä@ÖÇ—%§i{øì[øüµ±&o#n}i~´ÿâ@|¹ x ÝG£8¼ ‰ Ї©ƒ÷3à7q¤92ò¿.6W*Rî³p‡FWÁž%ù$9rœy@ì®/¥.”.„&â|iL±–]œ¯Öƒm.Ö°ûP†[áÖ†8²=ô´‡q!­¸ÃÜHlCž Ô;É<9}ûu)§|¬šøQÓh-î°JD±;YI§—4F#9‰u¯®}&>dô¡ä@lB~Lº| !«ûí\‰¼„Ø“…gA&§' ðôð†öéÞ´ºRøu Ä.Hs:`…èêÇ®Í6+ØK_Q£aŸËa•‚?"Ï™ äô$úò{w£öauçDõ°'L‘’AóaÁ¬éd1¯ÚâNX7p»¨¡>\8E׃qˆUÝÊÇ7 õ!t›2˹–¼?O:ywéKèÈfµ#ãÝc±[@Ô¼ Ôó¼,‰ÑžžÜ®”ø^íùòþ³ « Ÿc àäÂqd9òŽèÁš_Þ„6äèAâÂo¡Í=I fùfæFåÜ”âIêGåBìA•âHo¤3í‹>l¦KÉw.¼÷exœ^nEçK¯s 7ð™Æ8±· o¡v ÚÒ8MÝáÆt}Û5‘}I4 ,êCö§V mA}¤°ð0iеÓé0G €m5…–°KŠÑsÒæà7¼\0zÒ‡b{žFýYüæä€Í²;[ZO!µ‡6DÔ6ðØŒÎN§ug³Ž¬º3âHX.äšÚØWr8|þnGńԃ>¡=ØÚåÂnsñš¾Ž8—õ×òd:ú¸fLÖÔ>.ãÈfVq 7V”9¤];âõp¡ £òfÀÜÿ™ÁÁ±}Æìå9:CÙƒÞ“±Bö­ÌümÁìÉÕúxçKÛ„ñ.¬­ÿ&¡ô¼¼½ÆweßáZ ÙCùneÕ3¤ÙÈ÷qÅŽ¾\+½ŒÈ?´‘ÍĦ|gA»ƒ:]…Óž,¹#‰Ë€ÛË¡)ÞÏ&vq–{™ù°¹Ó¯.¤¸‡áËïä_§&¼Èø¶¿')¥îãô'^ú‘£èa8‘Ë×ÚZü¸ý¬Ü/ÁXx’†Œ Ї…©ZO½&ÿ_ 8ø|,‹ŸjÈìC͓ⱠN¥Ì…þoÍŽý¨Ö”ü›¸:³©(f˜?4†Ã}„MµóoB|Þÿm‘M^DžŸK ïäËÛlrˆÒŒðu`Û²È:^ÛÁ–SÙ¼).÷©á•êNXwºö³ûL¨9Ò ó%u!16])Ë èHìù!ìÞ´ì} NÄ»7&LèJ^ÝáëA£4lÉîI¥x0•uá§2åJò˜zR¾ÝÙÈä7äéÁgÀjÒ¸Hò;œ¯ ­i4á6âwÒ,ëHþ¤.âw}|+á}Lœ™ÆÕÂe‹Z ì)±(š2&yýéíJ™ ó$Í„4eχ$y‰ 9ð?Å(yPœ taÙÉ¿´ }hg |’fAæÃ½I7P¿j@è›i ÜŽ:870÷òX4.´ëB'•/n?bLøä‡h³p3p:râôá<T!¯l¥Î€ßlq§£ÃÝÕR^«¹‚Z¬ãµ}‚\ é<–±?Q†;{©3jÀ§ssî NN P?nCB6¥Í+·…zc69pQƃRý‰:Z"Æfh¯Äƒ÷ côj„ZK³acÐ`UTmå8Ò†INŒèÎljOo|3âô°;É72&t´¡õoKùœœxlBé|ü?†S7ÊÂÒŸ¯:z8Ä4†—™…7 3 Ù€4³ðøVÌ™æÂgÉ¿€ö¡VOwð`ò$âZ1Î(5;œ´™!M?kmî7²f„>Ip«?f£Æ‘уBF]‹Ké}|ŸŽìË'*~„¦Ã…ÜÇSswiØ“‘'ƒÐËM©!ìYòøpê@x²}h ½­áaÓ³£C'+'êöxO­–SJ^¯~ïÁÜ܉E7°yt¡Ú”ò`ðà^L†Ä®îr7°hJ<ÈO>²fNo¤¡ïCàB ~DgÁ©áC‰ö'ÉŒûZ A³/2éèay°¾œæYòpev¾]­&u– Jslû›jδ)–É ¥ZÒ—$È2Àõ¡Û•tlJz‘ÂÜÁíÇ húuáJSëÀo¯V^¬?£ÊÆœî@ôäÜ«,:6Ô.ê]õáÛ†âÄ9àØ*G£:JÝÂgÊkC‰çÈ“*gJ{ðê|XçKóá4Mç/wp!Ãðçj}9Pî@ò`êA¥;sˆ;0qåwvöýNGo¹˜É ÐâqèN濟27°§J_£òáVlœ),ø5-LaKW•©•@ïä´9 GZGbPÒgO…?:ìÂ÷ã¿!šúqÛÖºväéI΀^NļY +õ ³hÿy…óü.û f@l6øOß®óÀ¼^&Г™&”¾¬&¤!ȸrJŽ ¸‹dÔž ?ë@jÏBâÊnäÍ:0ðÛ¹<„²ÏÁ­'·òú™5$t`V–"C­¸Â´?ŽW‰ éh|(ëÀÁ'N]m¬ pc(hÎúÑý )ìÚ’š0¾t'=8,šœnv)Ár¡E–4¹8_NÙË"~”;9æu`6öòÃ…ö5p©ÕÌ ßN”§— «ý™>Ô¹Òš<›mhÊnä^´èÔI9±£#¡ÓÀZöp¾<hÕ…xŸ/íá?–tá?§«!–ßBœ­©<˜ñ—'u”ÊEÓÉ?^õe.E3e ÔŒaíÏÐü {Ó½‡ôµ0­>uózXü(:2{²>Än%Д÷áÔù°æ$6$â4r5â¶µ}Ä-`~P˜Ø›]´qnºµ[~…±žíµ¬T>‡ ÃÛÇíŸv©.Ãnäõ ò%2ÃE;[}ü‰µ*š± x²Xü3Ý€>b÷mÔš6{Â{2†}í…{ÜœLŽXú Ôo$þdГ4/w{„‚Ò„>>ŽÜÉçΤ¦þôÿWô$|¹ýÈC¸ŸjG¯àîò=YâºrŸ¹*~‡mÓ×€ Ð´d9vÒDtº}œ€?Á—¡ÝàSΟFêB}É«i÷¸ÜF¼ŽÝøç§kÏñ¥} ¨ï1…>ôÝîe†ö9ö¬y6bøå)ùð‡©>µ¡ÙÉMh§Co$63cñØ€~dwWŸkÀv’&”®„{ÐVàK™:±”ú³ ÓŽŒï'$´€72Ÿ¿œ—0h2ÀýXìáN4:{ž&ðÈx‡áú$‡ÔÙÁ½¤;h>Å­ t'6iw&O:7ðšÀøgMy&´¿$®ž\gup†îþÇéî0†HL’!å[éìÁ»¹0ÙBGZÝIñÃ’ч¡/{(çÛyg+ÂöðÖJÝGqjI´ÂjFH¤ æÊ¹!¡ÎÀ=œ¾ÖÀìáÏ#ZÇæc©~üñšNÚŽ}–G/NL©–tóãq!–úO¥PïNml!Ï—Ú¸] |¾ì9Ð?¯"rax0œl˜tá ÊÆ‹<[.Ôꑹ“ÅÒ09¬Ò€ÄÔ óHwð†iÑ÷ O&C»ŒºXGjt rl0åød2AÄíp‰¿½ÙíäÜHç\ï±÷äÚ…ö NêsA·óB#œoì0»ØÑ—ÔŸãƒË³å|^_g‘>Žçw?p`Ýq0ÒÇŸ^Ò€áÜÞn=™ßéáÞÀ“ Ø—ãƒ$‡©ŸW‰{ëBnv1л™Ë#±:²¡¥h[y ¿Ï™sp ñ@èAÇ“…#ãÇã‡2Ûo“{™òK±ñð’¯Rs#6CÏ•zòvÞëÃ΀äAûP¯;¾€5¤x²9n\< ‡jO6Dþî‹;xGJ7ðþŒ<éûpb‡'Þ—:ýÀ„µ™ ÍÞÊ?‚C,hÀø^GƒbêGNþâ `\@èÊóï³mJx×Z_È”ÏæÈ¾t‰ÌÑæä7°8…>‡[› \iÃÎö°iÞ­éÇDýYN„÷ëHqáâÂõ¥×…ãI›<ùÔŽ+éøØ;PìA¼“jy'‡g‹©#»—>=È:œ x¬67þî7°êƒ&Hkõ%É ´x{RŽÓY;çà5¤>Üu$̶òž~~Ëi:ð.ÝÈÐÂzòbC£cC ‚ÍnJw§Ä†…ýéV4 MHÞH˜ÒÀe> zò9dЄyòL˜Dñ¥æÀ©t¥Î„~ ICò­ä‡L×^QÛ—§;É yò¥1)Ã…Þ@ëÁ–hJàÁ¹.‘ ñïpgÈljáEÉNþßHlO‘/¿!½ˆ ,îN…§#ÚœÐï¤~µö ÓšC{³t¥ÜÁóAñÁìïxÙQõ!øeø¡|ݬÊÞÔ&ÑnH©¥Fôã”Ð-§ $:±Il´9üŠdÌíår^…ßî°Žn\jÊÞõ¡ ìødwqHšß—ft­HÁO§bèKéHm¥Ÿ4ØÁIìÈ’2ÆwPű§„„{ ž›/Ô‡J •€ ¨Ù’ƒ­lO.§ÝÀ™eÛ… ޼l•dƒ›.Ü#ïÇC™!çÀ¯é\èxÜ®VæQð¡9²›)Û\çÙ³£/<ø¤.u£&ËEöO3ĉHu@!©m¦ÎÝ ²ØICˆ„yІh˜ÞG½Éáœø §%.´úOQ Ðü8 ZÕåÇ £|û&¤`öÝ”ŠXQŠð`LÆÔ¼{)úQÓÐÞd:’m¥ó!N%–O"åƒ{l$;(ß‘Îü s¤äùZYåA’׽ɊN|®¼‡t%Ñ„àÂR{ÒÊ”ôäL¤ re8ŽöP~)L°”4ëZ2ñ$È|xC: ’ìNçãÑù–XtãB<~ÿ¥¦9SÈÂ>¾L žœø¿&®¦À”Ndd€ô8˜C$!¼ƒÝöðèFœ‡à—“gÔ…P:sšEÚIó5ð‡åƒÅ”V®3á{h}éÕØÕ€5òà:S½€8r´§§š^þGw"½¸WëÊ|1–N!ˆSG6ô Ì€þY7òfPö¤ô¶øNÒ]Õ•:r2^m»hB{q±Q³.Ì?nü«“:ðgëã‘Ú ;»ºQX{˜ÕúøÍmCh`ô Äleüî%_‡‡¥.¤<ØÐ‘¥Ó´àÍw#ã—BjFò`èB?’ùpçN†–Ü@š^¬.ÞrÈ™û¬ kƵЀy’#Ó„þ¶Ts@üÉVJáÝ_—g ˜…ç@ñááδúR=´­_Å€ô££.Ü&¶¯OÆËšW÷ü|;0)Õ”Mü‹’]85á4ì@¾Ôt¥ Èré`qs¡€w²Thɶ„ìdÉ t£;S äÃ΃NPíd׿'w“ïý½Ò—› jBÝ– ü¹äÙ‡¡.y;ráø ]äIÛI·JsO‹~ã)ü¬˜CBLOË9¥6 ·8nÆð8Ø;]î¦AƒF¡+í}ûJÆpiD¥ `rÑÑaJ¢'¡#ûPéÜX¥+’<âPêÊì´áñ 6!!°’„Ä;9¿g„NUÑ„ÝÎú}ÉF]ì)ÜÆ5!{ИΑåHŸ«2¹eÖ„\šçNt€s¥nÎ^ŽU~½©&X;É\>ž2FÔy„©(f…¹8Ì”ìÎhëÂFæB]Ì)ø’/©K­)½ŠPôa9ª~YWu¬ˆæÁº¿~D7pžÎ,-ü­†\‡ ,Ϲë·vy›•n äI—kԇȑóà{²2ù$9R‡gjHê?’w;(CiÙ€ÞÇ{ j6SJG.”Ï€O¶Á‹›°dÉE…>Ä?jãHP«mFÔ‰±*{r'ôÐb7–3ñp ve ’Q:R¦òMä&´ £o­¥_Î=™Nd)ÙB½9Wµòð¢¿n@v$ØâáM+û¸>¿w{–î‡ýT޼®Ü/nçB´§ZçÇf@4¤{rf“Ò~LÒ-ñ'Æ…5dMƵ î§§/½ ¡)îMÜdØÈ§áò7¸Ofõý<†<¹C‘"{‘σøwÍ!­(WbN5ÝJž”y0o¥ù4ä´¡ü¸¿ð¡sä„9p½©µ¾—Òø{Y‡:rSNJráèÉ»‡Ÿ bèGƒ9ä(䞌‡.í ÀÖ‡Û€Mœ¨l${èÜÊsàMXб'P Ü&ÌëʆÔRô¡vð=–†ü¦^ÛÜØ|™…"¸²ÚP¹¥][…3àäU£Ÿ0ï æÎϱ€Tï@>|.Lø£"|‰6$©«ö²&:{ÈiNÔ<ÙGÌ…xu%sä “ŽVUâÈzòäŸÜ€N /fïm{s;UÆÖÈ¡îJ)²…Mä ö°;¸_‚óãÖ\è4aC«*>Œ¼˜.GéÏ{}¨GòÉ´Ü`UåJ }‰9°*S,«’uðœÈG˜“4'NœÕ€ô¤ ¨AáÀ'e(¾„€çÊžl«íHN< ~üo ãÀ'N@6д‹üÐ&öèH`kžþçÈ:€qä{É}˜ÄŽÎÄ)¼ÎÞB|{ð‡SèÈî%\/<‰{û‰"äªe…7°£ˆŠî¤wð#Ñ“w· ÁúâQvÒ‰ò GÙ€;¸ð czÛÌ"íÖÒ:P€PƒÏ„]˜þ,¨ŸtåäÀ©ìÈ ·ä|’'¿ŸN5¤• Ò¥*…ƒ ðdÉÞÂ> z’^v#­!δr`âÀ|°e‘9°»0/wlÉÀ…5"”Ó€ÜÂ'©€ÍiÝO±)–˾ÍÜ2ì"±Ë—-/5‹ÒiKoÙsYší˜dg°Å…ñâ“ 0Û¥)bÁ2{ñækBÓi£{0™åô!ì:ÿÍì¤44„0@‚êÃërµæßóìýk}ë¿v÷/òZÓàiHeb!Z1#ýK¾·±ÿÊ¥Ÿ«_øÍú;¹ý >C$Gº>äï%à„÷J&š“Cí4ƒê!ÿ‚¥¡ùyÖ)D­)÷ ù?>´rRU!’j¦Ÿqþå“jà\Ëf:nõÖ¾?óä?ºÿaç<ñ¤0ŠÀÀ/ÒÜnµ“ü¼?Îú÷Ž¿ëP(ÈÿÓ÷=¿Ãûøç¥¸aäGúRJ²'æPŸÊQRªG¤#Øæµ§ùÙ±¾ïçÀTyþ~çF#¥jÉË!  øæ3YÿµþÞâ? Cæfp÷ýK÷Å¥Z:·›Úf$I‚»´zÞUäx\Èô4¿àI÷?^:_³“õi‰k½fbaÚÕð·\¬¦Kº¿ùŸZ=‰ù?7 üQàz˜7‰ ÂŒ(ùhÆ._>g•¼kðsFþ™«óêÿwü£¯kCkÚ¥…]˜OиzEO¢g ûÝ|õ+mgÖÖÁ 0ÎnÖ.움?£üO¶Dæ¯þ==¾–iÊ“K£âü9òÊ2€J‡û)ânú[ž_/Ýû^ÇgYö/ô™Ækµöq¦ÖPi дx8þ/´§ÁöÙ½õ½«ó›÷‰‚ !Ï›:ô(j‘sffÙk?ª‰xH† t*¢<ÏiÙ»3ðøtoû¡9 À,´ûóñêß“íiÆÝ³©…ÓE:¼l•DÖT\×ÿ^6Os¡ãíhócúWÍ}káÓ‰'d͆³Æ!‚[t³ÉÛeàó}¤ìW ßuÌ•‘¤ÇzÉ‘à:ÀÛZ´ÿý_ÀÕññÕ)ª®uÿý~ƈ¥¹?$;‰Mê’P¬"®~Ž—³°÷³?Á³^èF(ä9Ô~3­ˆÂÁ1!†DHËZ k<^³-GÏÏÿëZÏåbÉÂ0ÈúºVíKlÖéŠ (¤ÁÅ Tà,¤§ÀĘ6GÿhNH£*y¦‡+ÊçlrŸsù°þ×Êï3`C$ x´‹»æ£ÕG—ëüé_w¸ƒ…Û[v¼·ùRwñ [Øìö¯#8 ˜>ηúXÍ+¾P ÇM?þ¯ØßÿC.m”š¤Ñó°š $ JºeûЙå×cW9bù@¯Ë³Sþ;ãèØ# ÎãA'HÏ×È¢ši– š,ÏãþŽãÎËíCïi`8) @¤!Øj*ÿ²â ø;¯_"ÒÕþià"!%?tKÍ49ùÉ– â;Æ`¤7³)·›lmŒ5ÂÔ±9A q9Š"@‹â7‡.oä®éÄ4ðJ*B,¢Àšƒ´ñ£ò·¸ý=?)ú˜åG­]þ6D×JLÀû”iÈô듾ڵ4µœêMôv¸ºðîÿN0€.má ÐV„4sÝ€óíOÀÏhë‘yÌ\Cäi÷ì”ABQ  #·ô~NãðþÓðù›Óã´Ã³>,p ×„…½‘ÐðãéEæêüÈ×-öÓõñŽùþ«-¦ €§þâØÈ‚™ã»þ³&=fðcÚàõ¼\&¿ÖÈ&üeQ…5 GÉÌß—uòó@a#x£leËð  Ä_Ì£»ccRÞgêj­Ï ÁÔͪN7snrvgèíYN¢D¬v(»„¾KŠ=üGOP‹(ÐbÈHó1ÐòXòñ@2È„A3£|ÓÑä4øØWWmÚ~qÊ“˜Ë>Ö¬ƒbÊÒ!…VyŸ°à=í[§ôñn¼ÊÑbꆕš)Ÿ)‡ØÒ:hrA£TRòlhí´J0‹VñzêLÛaÏËÝhdçòþµ“óöûîVTý l:ò¹aQ•ñMtáGVðÿ•¥ÁæðtSß?KôgFS\•‘aƆ B6öµ:v“tb2ËÁT³»è°[Ø[°8N5æÿ‡œp@ÈÅ\h§ñ.1%¾¿éO°Ñyþ;ë|9Üö””pù0.°o4‚€#€Fn³¨ëëö1Z²çiãZyb¼Øµo8S‡«Œö4 ãëžS=lEžÏ:žÕž'g“–ëZƒ]! (àÔõ¹8]:±²±<üh½ôì ´ï¼¶bït+ãJV¸²QFõ]½™½Ëì¤ápž_E\í%¦î¤ÎÒ~¸¶tÓ8:׸GiC eýÜ©o¦»7¶úñ£+‡êñ]ûñ7[)|Ý¥«:¾:íöz³Ÿ?F3ùÆèPãUÚ±jº*«ƒ†?7ñØWÆ>!ûå¹Ì4Ð(I#ô”Î)Êj€I’¢¸¦»pÖmàñÛQc€·Œñ¬;lÎc¬ÌÜ0qÈÎnæú“"bâg¿p Â5øJÒ’MQ` dÇ_݉M™‡pû-ª*sZ)ÞB©ƒeözì6Íz¨Z®:»Xïû ãñp…½Tv@è–ÃÊe-ò'XÀúíG®Y™e£î#žW¤O´¸ÓK&@˜.Š)'Â] n‘`§Ð6ÌšEI-ú ä]â3]ž/‹{D‘ü.›–jN4ÚÓ÷~=T@yM ` & Ú¼ìç¾sçþg&ËüwêO—½£çhNΩ=.Fí¸[ÛIÿ%>uþ|5‹‘"Á^Ï”ßੵx¾œºQ§ˆËüˆÚj¦ øVD² ükçö<®º«*éÈ^rÏdÕŒ Ã1~|ùË%øcFu¼Ž¬äîàÁtñ—'ñ9;ÍJ*Ë Ç»,æ»þÕ­ˆBå$!0æ—h´×-LT®‘”Du£æÂa !±rËuíÎ3@rä;é½RÏPÜíÕ°ŽÈÖLðgXïï¡éº£JD FêÃòåâk^RÒmþ¹QÀL±,XDñ³ʽ®Fð«rt84·‡Æ‰Ü[®rYême¶›óÏÁÁq$ïAZZAžÒ\y±}8 ·zR£úã& 5ÂÙœBôÐF½‘i$ÝZP53•Cé(i€E¤»Ó¨Õ”m T>»eÁÖŽ/*àÌÊô°ÌKn:,P:w±è²U¥/#'Ãp¼ JR€ÈîeLnÙ­K¼h^C?ˆöš/5Ôgžx3Up{§¯÷øÝY¶1_*Ëd¸°;:x3þ¦0N|/ÚƒÁž$¾¬¦K¡+š=v +ê5³¹‹1W(MÇ‹D±?ƒ óôð‚fF¹%.œ8„:öH¬¥Žt~ƒ1G]=ÁÃô ê5ÂDž‹SÀ€ú¬9œbÿwŸŒB"0 ,ØÕŽÎ÷ù•kW¥Žî–neãmg¿ˆIÛùlžGû=7Xã«RÕIÜf4ø[ü Qð'4sn¬;»£|˜s2†Q!F0›6ï%“~Þ” 0õ!êä¹®%<?³fê]mËu'y”øÌöˆÏ¨]}z¦üŽóŽËýÇ"¿q‰ $ÓAØb(dÕ>^5‹t G޼Þ·¯•€¬ @ #Vrïµnx„¯!F©Ùñæy:Ƕ©Ù1áÆ ®*B#(¤H‘ô!MqJ³Ú/ ñr;Îbi .Hð>‰~xä"8wó«*D¾Ñj@šDBˆˆ€‚ŒôªÜÁÛ7â#›í}ï"ÍÍÃç.dýÖÁ“]ofÚB{ó= †EŒvîå^³XXs„E‘´!¨çöÜQFeou¶í‰Âdô ™‡5­ßAûí”ÙqÒƒ¼D@*DB–Q‰›"¯Š¯ ^{ʘœÞk /lÄ–íc0æÕó}\Òò$(nG_ý;ƒ†tëuqÁv6š¨NÅ·šõú‡Ø†ŒîBfá½Åœ,ÔÍ?mj翆7^÷™mòïdö+À€ÀÅ^'£+ÖäÇš ~S[éu)Eô+æMšóQA¿¾ª`Óº÷Ø#NÂR7Šõ°”ͪ ©uÁ:óß Á>D©«¸Q ð¨$³Ú Fá¨à&SF@"~7Ûb'0‹c½>a]Z¡êFßÜ #åB+ !<ž,|qñwŸ'ékÿK'qcžšãj¬&`j¹N3ÐòeêíýLLnt{öÊ3‹uû<>;HÏ‹×dKòÚ~$u¾gÆ×ƒÜ‰e¹NaD$´ò€ðŠÒ6²K½,ñMì”je•Q*"!EÅZÜ‘“©‡©šcDEc®¿kjkjÔ]x™]uïjø#3¼®g]ÓoþÊÊzÞgÏO£Ükr«xº®ÃõO§Y+´޽tSìuíÕÿíûìL´­ƒÉ8K6Cúëàƒô󙯋§-öšAÁ·Šõ¨Úwâyö?ÅŸs„S¨i«ñKBÉ|ºo ¬"'­ü£ã¨"WCíP5ž#¡ ¬yX"º ÃÙ:_ ›o^¸9ìT „c|–0sáÏ@o‹FË÷¼˜&†1÷¦6}K•¦ªhb]1%ÛÃg”j»ŒA¢aéú§Œ}zýƈäeŽ~zÕ†k)QÈÕ,+ÎPKñä»ìx%mn[±¼`Ãæ7’¢Í.€!úí@€)Æ”]_){Å9^zŽÕêþ _)å<ò€÷ï—×ÿ#k+Þ\æF!:«¶ŽAêˆ! 1¾ñ¥¥ZÍÜfµïÖPvj«dþþWR3Ƥûþ,ã<çà×pt´Î|úÓT*#E€åG‡šØ¿QÔqW+õ¾–œ yì3Ôl’t‡¦Bp ‹AM 6=LÇÉ>ÿ$òÊ|ÄÌ¢PViXÌ‘¤ Z—ÄYŸ<÷ŒÝû–§úâÏc¹„Õïat¯âÃû’êÝ~æ8·íCö¡(ÌJ@ódÆ»ˆ·Ð‹¾Ö×ö©œÖÅBs´Ö§CÓŽî2{öçcé‡v´ÝÃ7‘Óл„¨eü}7Ümh5>“·ê̶‰`é{kÜSœ†¸œšèêý£Šêäg_܎髵Ùq|ke"Ë9Œü? !yODŠwÕr§Â•7wtùF9LÉaFFwÒï6ECt|]‚¢AáænT<„A¥ðmn/{hŽQx2 \2iAÅpS°U•4Rl cl°¦aµÎ˜¼5õ·‹ôW(ƒ™£„Ø>´i,-A´(Š oAt’÷ÄE)wT©IGL´ŒÈѧèx®Ža®) “Y³P*rÝbp‘ï¾²É#7Ð[S}„°DD@Ø(h…£ŒgŸ1¿`Ú‡ˆc²têýÆgá”h–¸Ø2p€áäê–F¢™gµMˆØx† ½(Øjy~öBóìZ?¾Ò<Ƭ|Vx *ˆí_%šÝ‰¿•Ébyfü¦…MSR~±®8œ@5§ˆRYDÂ)ÅbŠg±1mœæßa={ˆ6à9Œ9£=Nñ#§q2áõãI™ˆz¦"qNÿ)QݨüAdÊ(%˜!%¼ÅòÙ`ÒYXŽG‘ª‰‰HéûxœPW¬ã€ÐK² %÷›Ãf zýëšöRÄÀÒtäõ^ýƒÅ‚îû¬Ù¶¢ò›J™{e†~`âŒ:Å”Æ6W¬ |þ£§a`À @Cá0h ?ÛT zV òϸý…„C[2©“ÂZŠ86 ü¥A÷HMÅÚ ¤(‚LƒžÖǵ€òýÌ}âE¿—H’ßír·ĦçäÈ% ügKïgš^Êëqé=¡e1Ä‚ŒéDh†T¨Þ,EÅãaþå‰hPJMG2ê…pˆðí"L *qLN&ú )Õku}êõì5ˆn}éÊ8æý~²£â”Z¦ ¦šwßh`™Î·6å †+¿ G˜¬-CMÙnh°lx5 Ãy{½e8Å Åë·«Å϶¬ïˆ@¤ ÏüP$ Ô Aì”ñˆ ´ GlÙ*ï)È¾ÒÆV-½½ÎÈu/bJð­”ýˆwñîNu‹ù/ŽM‡—•‘£~ó¼ÈIw€€´ô¼}Ü™ÿ£ƒ_óèóm.¹úk8ÞúÖ}Ñxs41l׬¿q¾ÙG¦z%xæx„êÅŠˆ) DD°a]HbzC=qåÁg‹¯â×´ Àwøø üDN"¿Í]ÑKÒ‰rúq’°J73ê7Ð@øZØ&~ŠéÚ,Å«æXY¨’Ù*ã)?hϳœ©‚ó)€h£cF+¿;˜¬Zúnk-ˆá@`”J TætÙ{¤£gP }ùŸ„û/‡l¶zD½zå×­ÉB}zÛ¥V±e…N†Õ‚ ¢ j…€\vÊVÂu¿6Úåú~µFÏX´ç÷ÇÆ#tÏ=®ç›æ—=–o¾®û—TmA•ªyP [„’¯Qw“ÃkùlWö üþÈÇü˜må<ĵ‡½xsþY{kš)…ÅYríhÙeê+˜}Ö¥Ô—±¸`Zå_£ÆË£±‡BkÔ·Ê,Èaþä"ÑTA&ecV±ÀÂ1½àÌDÚÔ[HqZ²ùWPb]}ºžÀP;d ÛýÎÆW?­ŒWtøð}~^\ªžX ÉÅýÚáF&~4¹ñî¤G ó(~wÒý:Žƒnÿ%Aⱞ2m!ë&à2Ÿf¼ºˆÜE‘Ñú3½Ù?u\1¾(¦k8Ng? ‚‘Ä)¶_MnçòPºƒØ¾T`¦»`gòªTFA$ùʤ (4¼ m6Á˜ LÕŠ‰)J&WQ*%Vöy‰<ª-NXŠO`=îã‘ûÛ;îIOù·=?ýžãð¿§‘Öþ·t„D†@ˆCòBÿ"ŸÆme IVÅdojpgÌ?&ÊÍþÀ¢†¯ÚJ]F¦+sFÛ» §Uà“Iñ#}Y'´®?~ÃÁª'ë’ˆ×ÓÆx“)U3òÊ^ÅP, ¨×1ù²¦Taé(‘ÆIªþ- l87t^‰ä|g2jÄ:8f#L,³•fÁù¥Ë­‡‡pWFzR ®¢F{Ó;½r×ù˜äb.°×6Hº…Pûzô â* v϶mß­ÄF2ï‚ñ®„ú8½à·°›Ÿë_Á$ ×¶gÃ÷'¼éÛÕÞZ<­)ß4ò@{Qȃ©~üþ4ªœàA“i4m~n†ÞëŸúùû“×áo½[æý•ë†׈\æ¨ðiÌ  Âã±qµ²á¢<ýSGJÊÑ ÐXV`ëæôÙ£—c“§{Ê2 ÆÈ}„+KžÔ‡/Ÿ+ãµ ÖÝ‹ØxšÈ̹ñ­ÝB¼Ð$n@Hx’ÊÒæ5þ™úí@èãB(ñP#5xÏ3Æ$@g‘Çzš9c^ÓtkÞZ, † £²`bªíõ,˜Ðw¬„ØÛiìÆÿK E1Å¿c«ûÔ+h ÄC22¸34eÉŸ¥¸ÛÖ¬ªlΛçfZ×€‘¸ÖôEö°¼Îs¤áeЇ­{{)³¾h ä¼È"$eÎE[O"U=m¹ˆõÒh@K“̯” ˆª.p÷íK¼(hF³„›yZÜ:سSœŒ 7.\ÖˆbjˆÌ8¹Ì©îÃŒx!)£F®(X^6b@¬9mRÝ[(+x1©U4)SB/4—ë0Âê…¸ N…q¼âBZL®”6 ጌ60AdA$6ÚÛâ„o/F–„ŠI,˜1‹U›‚cú1€µã­¹Pع£cGgHóäM‹j8ö÷µ±‘ØÿçC,•NY§…&#jõ¨`‡û0±Þ¦vùƳ¹ªb„ÏTpÃ@…¢ èëm±¤k9½3z!•D1Óü4RÁ,eÛxÄÒ¿‚¢êN°PÄÎAÕu#‹z*xmÜ cZmCËöœ¶ËÓ¸º$ý«¨°4ûG“=(ÑšM8ÑÞ`x I–t¤Ùšn@S‚‚&ɧ²kdDÒÞ&$‰âË­ è +ªÕhWY{mE…¡-&$m1 Í£&û4eyki²Þ»Hsî@` W«CÂÛf”j”´f, Þs©ì¼Í!¶I` ³½vßÏ”¯Ã\lGG‡…ØMEC0ÝU)i]B¾Í»Xn‹™cI^JꢶÆ,ë>Í5*Í~Vµö#Bh<(hllzÚó%ö‰i^f\q¯¶….Œz±nVD¼Va¨öX„-XÐ,Çÿpò©Š yÑOÚkJ 4-m†&`B,(À¹åz1Šª$%—,6¾6B,ØÅ3—4p≤`Ò€Å=ì®b(Ì-_½0$„;A›c$0°-9ûfp! –³.ÚéF7’/ߦ›YÌ1¼˜ ¥S µÉ/îÄk0† ¶Ú‡Æ(ÀÓa-^a,B‡¿Å 6ørÐBz,T³9äÄ€ÁŽc@ÐÞ¶)Ë­šuš£ŒI Ô½I }\›Xµ±¬XÌŠs þ— Å1A¾ÆAj0†6ô5%FX/´fkH13Që:õa°È«÷H€ ’JãXÐccÌÀºôì 4\Ð òI#…“%l¤‚D9ˆ0¦Á ˜‹ ‰ŠJ†662_íÉÜêW;«×HhܸOé˳ö@]…AÕ6¹š9 5°/ô7é®Å(gÛs\#+ ífF\ë²0ã‰yFPï¼°¥–R4¢š\Ô&1ß„}׫¹‡~eëîö}(Ì ÐxÞ›Û°B3ÐÎWí¡p\bŽƒ{‡ÿ5%Õ”2H+¬ˆº_ÿU ïéÚÊ42_Ç*hð5¥{4γF+ª¸€@b¯bE¬ð m6 m0m…¼Ë™s.fâ¸T¢€Z¬ÀêuD……$ ಢŠíPÓ`ÆÚA )ûÑk– Vf®æ*ŒXpT#‰$©&cÉ\%¤24£M’Ð틜±°ŒJ1f{f°19xFCF{ Ì%\BT„*_¸0ÎI¾ÒW^×&ØI®j¦I,aGU$ Q„e·Y&$*™Šô0ФZÆ2¦1d®mŠ%˜«€¾Õ¤À퀗ªÀÐrÆÈˆSIÆ’qK!aŠÕ‹X2B­‰"ðZ%%÷‚tZI+ú1£—R·z3P+.…aÍT£SzF’µÛ9ì–ÅF-ÅèF‘äaŸT`jû˜m²–US!‚®À êkhf²*jëã0âv­yrÙ¡CE + XÞK«YÔ–’J ™ ™PN<©’"¸ `Q1¡¢k€­œÒ1b×s  –`°…rÁl /µa‚¹iŒÂÕn—D1_\„Û[~k›!Ó “1âc:¥–‘[(æ!˜& h²`%46&“3Ød¨‚Ž,™K/RÑkEVW6´Ú Ú„ú2»!$A[…s‚ eÌ12êFˆ\—¡ DF M—R&úns,‚°µF*2§T…¥ÈÐXëjXV5B£ÆÈ`¢:%&Õëb‚#!Sâ¶’6Ø€°@WsKت¹@1¶&Û¶Úé-ÒC…¯²XÆ6‘.¹†0­¥A¹ËbHƒRp@fœBPªèŠ®z­mPÅ"ê)¸pØ¥’Ûlm&Ä…ZÊ™&@ N\I9­bÈc`ÂV& qŒC Œü8'KbqƒjÉ cN¨Bµ$ Ä…Qe’Ûem@R'ngáÁAU4@&p ” ‹D•4Ñe#¨š¦ 1§ƒ ÉÀXRjX£ÒÆ2à1¹ÒâBª!P3 ˜3²˜DŠ1†(ÁƒN1špc b@rŠ™rDAB! [ŒEƒ*Äb11ŒØ“IJF04CÐÐhN ¤¦©)Lª‹Ù„L첡iX“Æ0¶ ÄS‰J(¢$G"‘U2%%§‹*±4°bÆ ÁP%ŒUX%Š’š(¡¦Š& Z H©¢aA2" É %1R”Ä Ð!HD°ŒÕ@2DTCJQT‰KHª¢ PDÌL„ÀPD-LBSDKTÒ@S#PU@SÁIIS4„LAAQU,0SDÌIBQERTÄÓÍ% D“IRAÐUMEÐLDRSRHD”AMAUEM$L3IT‘LÓME$EÄEIT12ÁQ$”A5ÓUTBÓ2PMMS4DÅE$ÌEEU1U1DÔQM‘HDTÄSC-KTT’U$DD‘2E T1A1 4ÍE3DCÅDLÁLPBKAAL‘Q ÑCI0EQQE4Ô¥U4D±T“•RÓRÈÁIAKL•PÅP•HEK0%D¤AT³IÒ„DC$PÕ¥L3UCJÄD” (KJ„DÀD‘LJQ4ƒPÁÑB•ÃHE@IIJTM Q 2P´‘EHÓ$C)QUU ¤ÓTDCMU)4“ L•HÌÉ(T34HÃAP3¤HL,RPÉPÒ±!TÔÔKI@  ¨E @”¨L 4ªEHPP(P ÑLQÄ)E*RA´ˆÕRQ #S ,1!T Ð**ªQ\²((©J¢£ÿùŠ É2šÎY$X·ÿÿïþÿíÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsøCË[mÎØ5|J Pèpõ&½m*2•C¢&‚"ž§éO&“ÓS)úG©¡ä§äL¦hÓiO”xM&ÔÓÔö‰¦Ldb1ôdÔÚ™ˆÓ)²M3)èÂzeAž‰Ñ6“M4õ ”24ôš3SЀ4@Ð  $Ñ¡©¢mSÔò›Òi6=OIí(Ä4ÐdÑ¡èi= bFC¦jhÐ~© 4¤4Ä52hÄ €  hˆ£COH%4¦iQú“=¤M2~¨ÓO)ú“Àšjz€iê žˆõ4Sš ž£Aê=@ƒ@ Mh=@i h¦€Ä*ª!¦M3Q¡ Ñ“G¤ÄÂi¦A¦Œša4Ñê`ŒƒFŒ#ÓL&šhiˆÀ€0€ 0 ÈѦL!¡¦L4”D!¢hhhLbMMŠze<Œ¯]Ÿn$,Þ@ˆ h›JÜBÁž—ÉÊé‘bÅ}’X5£¸ÆE".ÖòÂÀL$¹¬œÞgçæK,ÓãæÑ–§å ¤Œ ‡ Ò&Iv¶qµNM3.p9iNŒÁ:n?¦â‰’–Œ˜O²¥»K–Íát¹šSc™‚¬Î:ž ¨®idšRI»Ñ¦¼¶Ýã6‰5j ‚Zúüpi}Ùî1)ð &  EpÄ#f€ÓÏ3c‰!!ëK¥Q•! ´Æ“Õ5Þ=Ò\A\Ò¿¬$ aêÊ»Å7£ÁµÁÞê.íïð1a6­ßzlA“"€—ð¼”ÚÛŽ•ðè çYÇè²mi¶Ô͉,&¦"†9(²V/ô{ÏÎMˆK}ZÝiQ®ÿ „ŒfËdȯ ´Ÿ|d(ÕôúyŽ·o­u’e@ø¿5Öôœx*ž%+Ë1ÝŸí¡ª—¦eå×6(\µ—)—\óy-xÉêç,¯)xBá¿ùÁ^ g5»žâ0š€ H£—Ó‹„窢í}+vÎÑÖl€äï–Â*\Áa¶0Ïüüý?Ï!œIg_¸^ý„µu„ÊVSŒ˜÷ýaÚaUè CímiáV=ž•f™‘`Z-ÜL‘ëeͯl–ú¢Ø8IÄ1ª,gG`sÕÀ¿E§šÝ®I ”.^³Ðô[k™jNÛú½…ûµ¨’ýÉ@$°á} Þ6i2Ð(êÜL ¿C«‹ùÜ4ðj¸Y¥©ÔX"Rké(ü7üñ–v'ªÔñšüò!ð’ŽpZ´¬üê™h×d$¤qn/ã†8‚J!Ú 0«Ÿ[‚u¦ze€LZha>. ]Øfõ–ÍZµÎdYįfQã úÖ0íP˜´A?@ú+îžñ<3²“ÁÉÿ`6c)>í¼†~Éö‘Ãsyøú,u¼q*Š µé5ëXµ¶:üÁZÝ; xŠI4ò‘PÙÀéú âC2+®ÜÐÁ‚Y4°Cq x=TUå!‰œ¡ÛBüÏùÊ&Þ s°ÜÎæ lâ†Æï`¾º)Ñ@_ˆóÝDZ¬RDv7Xá ¨Z¢U¢•#ý@¡Š¡Ù@]äN*ÿÑD¿A(øª÷PQó`ƒuˆ'GG΀5HŽ‚•Š˜±TòðE^ 43Eå eÄG©Š P[AC()Ð@U²ÄU[,Z câȨ‚Š1PNz ÝDßAæ"‡iU±AZ\TBÙ9¨"5¸*'-WšŠ è"€2©ØDC& ŠR—" kbªä"‚èàŠº¨"ˆeD/À@Ɉ/Š…DÜÅ^VeE<\ž£ü`ˆî ¨÷øtÞÁÌ€½Þ€n ¿ˆ"âÄ@ήº ± lV(QATNZ -ª*#i€€§'À€ p ¹±uT ¦*"7"‚`@S”€ CMGuÇ‚¨kôÔ98 [MdTëáÜÄ7¸T¤+ $9¸šXsÐK ¸ðÍœ„Pçãňl¦Ö7æLÆÛÐNª(¢9GS‰A î5<”Cy]œQ¾!ÙÎ.  †Šª€£‚.4v‘D9ø¨m¢È‚8Ø£‡ß7uõóú:ž.‡XŽÑÒõθq¸†NÛdá‡bW¯ P?£óû}®Ðj·çÖž-D‘·v2ù6‡Ö‹Ù¿pñùí<üSÂM“2Ð9IdRt+§ßYcÖÈ+Ë‹"³@+Ïy-S©\ÔiÄ!3…ÕöÙâé=VV•m{äkêþÔeQ«Ôæ8Ÿ…ÅB©qwË®¨Ê!¹Bq.c}îú‰:x™×µ o5fXâ¤0¼šÃuLê°û¯“,h Óc%R\$E«À¤ÎïÛ ’[V³(ß [‘i™¨PòªåxᾺL2+ÕÒýr@mf¯Ž€™Ùµ•Z¤b—Ý' …žUð©CÊ‘óí<¬Ê \§ £3£É-Ž)ù‡G[ˆ]¨LwéKSm}»Úf kâCR"ž~DÏZg Sl's9)–IÔÔ7•úÆËY[C6H ›ÛïŸî]auºí©2Zyù@CÒË'‹·îwèP®8n{¥ W ÆÙâ>O5^µM2È›E@;ì*·Q½)7`ÑVù7’œòIXU‰Ñº¼«Ð¥/³SØ8]³&YHÆY¤æzEàÖE™ÃGÚcÐ¥·bí|Wæ7«•GÁ¸8&Ь8m̤6tÂ["ÓšCýsˆ÷\¦—ˆÐ=àV꘯¥»†f?œ˜¢Ói®gšò|çU§ kØ•þ}N‘=EÅ™ñûw&ˆUœI“~fi¹-›–ú,TKåU$ª …î¦hà hÙ|G³b¦Êï:â”äȈJRª|ŒØ°iËš%»<@^;¥á XS¶QçÑ<8ÇŒ‡¦[Õè}7Ew)QùɧÐ88Ë£xxˆ74'XĤ™¨7VH~ÒñíÎ>"¿ôù°°1XÔøÍÍ: Ð > ‹H˜ôSp±¸YZßÀ9TU,„çî–ú†n"¹Ækô¾Ò+ÎDùx¶;Zváh·"†Êp PÈ6ò€ê"î=¬Gó DCÿDx0ZÄ ¬ñ1qbh'KÛÀ?¤Ø.ö [ßÅÓÀî ¾bfø~W}2fÊ‚sQx°Pó‘C­Šx#Gˆ#C9È*öªE:¢†\UDÚ@¿; tA¤T¢€Š-"a X" ÜC= ŠhªQ@WÀ¨´m0EÇÄÖ"äKóbØÒé”T¨l8Âþp/Ý;LƒÐ[½” ¸uªn¯_¦î”mm ÜíjX±)êfÂQÕ5`W…QEDÁ‹Yšë^^j:º7¾„GIëíøøw,Ü2Š•oÁ¨Ô·Ž Õov¸Úë}!. ¢ÂÁõ´½¸…˜¥K¨]Õ5j>m 2†‚a.'HÔ< Ÿs…Š æGy &®ÃÊ¡i`ì}].U-h]ÔÙ\h%Ó±À [3öP {Œò´¡y lJ]—TÖ&!©îÒ$% ªô¦‘Ÿ§›5åFâ\M— ±.ÙwCƒâÜjD¹¡K¯РbÜì¿bZ–¹èT¨Ý3íZ¸—‚¡P´Ä@ªpaa§²«VèÔjvå(6g$J¥L{#V«zÂH@©X„Ã¥D*Dd TB1’0$‘ HH„ˆÈŒˆ‚ ¥PE?ø»’)„†vîEÐgeomview-1.9.4/data/geom/textured/geologo.pgm.gz0000644000175000001440000003001510622666054016555 00000000000000‹–dKFgeologo.pgmì XNYû}Z•¤RÉ–”²‹hÃØRöe˜1-Ö²Ea ƒ²d™ÁX’a²Me' Ù2vc©1 ‘5J”˜ÈRÎι÷[ªû}÷Þ¾[2Ïÿ>|˽çž÷œw_Î7ÀÙÐÎÆÆ¦çÄÉÁ!SlF‡O´ùª§——MÐÄ‘cÛÙŒ ž<&¸åԠѣ œ]lð?ü¿³!ú?ü*òsr_‘·þ¸_]ëc_5Ss÷n]½Bç…ÍYvèxüü¹aóÇvõððlU‚'@ÏqLÌíÏù[Q> •ñ©fß#dEbê‹<×çqw4ð}JdvD‹Ñ‡Š*5ö§ÆY³S5èû\²aÓæ»È¨ÀqnåÕŠ§ÊfÙvžÔÜzn‚ŒŒ&UÎøC†½ýø3åbJÄ{×dõhð?•û8Væ™øÄ¿+·‡<[ß±#õž¬TØosc±½WÎOºàÃRY%Zý.…=óò¸R)°¿é[‘ØÓðÖb|¤™/>9öo1N‹ÃòøÔ«¡Œ'ÝxÛ'Fÿ¸+G“Ÿ^‰Z´WYÇWüZŠ\òŽEŸ|,pˆ{S­è“Jeø ΡþÏ¢DþŽ®õÌ«ãÛj^Uúðeô·ndO\g,¿öFÀ0Ù3«R×*âõ'¾pUm2íIâüÓCrŸÆqÔ†¬¢M³yzyõiRÌó·êóãñgü\Ð^Ü:á“ ŸÜž>Ýã´Èûþ¬ÍZÈäO­V¥"?ÕºÖbÜ¿ÅIoù¬ŽÆôRŸ;~8µDÌ£ÄßyÝ‚NÚ¶:«7æ­úq…ÿ~¥'¶f^ÛŽ?¢^Äç…RU`[ÁØßgHoÔݲÜü[U;ò§îÁ,„F*ðÿ‚·{äo]xBgºÑËBÞV$úg¶;\ÆÛ?ž]2¸šõèCof0ž­‰­,FXÿÓrŸ—çß¡zCBcÚ®³æ©m½ ¹³óŠC?ŒÎ5¬P“12©ØÎÜ3â kÅÞ7K[Ș6Рë@ÿùýذqý©©ê†¢XÍŠ²î÷!³‘Lê¾»{4aMBÒ_÷aئOôì9´c}6|¤¥ˆ¢µñ‡ê!–W©8`h¿w¹»ï¯ÿ9Á£žÖðÕ•$ÃvÕʨiñ@þ,º's+"UõüÒßôf:äïÐU×>¥^‘ÕÆržRª³´´/þZжt¤4Ð[elåGÊß”«KtÒ¶üiŸÓaX„ÐN&ÈÐ9Q-xÝ-¿iÄÒÐnØÇOåo ØO ‡ Ȧ<`WnapjžÆ|Z“:Uà8‹Î;ÊçÉÓhþà§Ž8¼<Ý@?Ûïýzdå²EÓ©¯õwe9íh `8%ë«¢/ubÊ ýNé•"ä†ÞmŲÎh×WI6å²}¿TYàÕ2l6{ãø&½U9,E?äªDЧôÕ_¥¿xØGò è/E• þìŽÅÀÊÒŸ ‘x(ú‹Qåƒ-ØñºTêãBi Ò¢ÅÖø«Êw(úKP%…“XÜ>*ÇøŽ ?UZx9ÀdW)@„ ¶–àV‚¾o¥.»ØÓ:”ÖD Zjì $E\½> J ¦sDFÒ‰!d§¡7˜B"QŽÐgçJzåIÄöÒ(ðœ¸Ôõï|è_€š'Jú4 ¢É £ñƇ?ôÑã&Ǹ¼A Bb›‰ Ý…>xÖvpŬÊý‡$â~¨pD Ú~áU8Ïž=s_°ê)äS$"Ô¹Œañw]4eŸ²ÁPBµÎÉO‡· ºG«A¯Eç*£Ë&,¤l÷ÿªIVÅ㿊I7#Èë0  Þ&‹Ð¿‹û~“)v°d.Sfh¾QÿÄ'`ä'l—ˆéÔóž^ÜX—®ÇÇuøï˜«÷D޶œ¤ÆÊ þ±Òœù_‰|äÞöå“)Ó¹_÷ïv’rºöŠ&Iµ:Ç‹µl"@sæ·Øµ¦(¯i;­hŠÃ¯2O÷/å¯.µhÿd&6ôI¨sª˜aŸ–IhÌü¯'tVó_øáõÛœK/2O†‚‰»À|òá:p+~Õ÷F`Õæ?=8›$«ÅÌä8" $â5dþ3ê1Õ ê¯:¾*¤Ÿ¥• ˜› 4Ê K¾ùà8ºu⨌ƒþÞ4‡”º8R³¿Š+¬D±yäa?–ýôlÊÖ_5Y‰èaZ²ö§{èÆTtƒXÚ¢ïVà=·"ªà;ò.÷K¨.ŠH}€˜¾Ç7ôÑ(fP-* \e![ÒP*äœ|B–îߟÚÕ­­eb¨nÞ2ZCöí¼{.ˆÙžÖ`{SÄt2‰+("g›b`xIüÝÁãÉh\êó¿oÀ2åî4’ÉÔê8ó` 3ŒâØÔoõ•Â[ãŒÇáÏóýÌi­´ÉëfQfý’º^'ø%¾|†èp¢åmö›K¤KŽbñæpâw¢ÍÜ#8jø ~û®›Óé¢ßañÐ`0‡ ò<‹ÑcÏ"N|w+WÄŒºâ1‰±|r5À–µÝÆÄ{þœ¬$’V²è¸©vª>œC‹M›‚Ô¾« ŽAãIÅ`ŸAÈׯ`ÙÿœºÀÍ4åZ‰3˜ƒL–Ê>#Âo»F†ÏMÌÇ §N®Cö:a|¡å—±D¬ý¬J_Þæ˜;ûgSaµÈ?›õO&¨&—•£º×UÑ v•Ð烅M~2¾Ô[3Ão'Ø“ÿæ²µK4-ïý½ Ç/­ óèR÷Æï»¨ Â7xWܱC³oú„¾Ñú=Z®½Tß‹ÍÞÔMp{]õîi†ÿj¨vâÁ²/ˆŒï{àvVê/ð««ý°ùMÙ†\`ã'KÀm¢šsYœêaëC‰‰ãˆq)Ä‹ìNÌÅ)‹4Âÿ^Ìä´²1‚ùà¶&Ú ð½à1Þ+'[_† ùWþö#–ГsP8«¾?£%v—”Þ“ŠÕ™ü&†ïÐR3xD‹ä̶“ÄD~Þòyû‘³:‚U&ý }zÖ¯ÙrúªŸÖ$Îñ^{v™ƒLõ˸ÁÛ—·A=5ÔôÀ”#BW± 5ä‡çâ‰ëÛÞ Ø»6„þäÕEk‹šØ‘ =î€Ö2ÿI¼õâE³u8ΘW½p&ôÐEÝ@—‹e@f’ž!¾‡/ÃUÑ’$×ÛÁÿ4™~(ºFG̪À¯Wð Oã?Ý"O3·¶NŒåÓ¶Dá_fÐ!Ý€[ÕµÀVÁEÙÄ äé{AéÌJ€?6#öÿ£Èˆ·Q#˜Ôˆúê­þ¶)Ñ·üíÙiRh–O£Ø%ËìÏ`_h¿tâ™Â|¥ àT~XÆPÛ*I9ý±õöOácZÛ¾ƒ¦ÙAý¤1f– Ä,à0í—MDàÅÄž… ˜¯t¯²ß{ÏŒò˜í7z( þ÷±Ò¶ÖÝ•öÄÿžÈ²²ú Ò|Åͱ2¶'¹‡¼%cÂKÀÏ&_W×ÊG¿2O –(’÷v-L?ˆœhüa:õù¦¨¿ç@Ø Â&nû±&®:pµÏÛÌEd£ñUìè©[2Æè„á^Õ‚†ëß¡Kõ˜øË³Ø9q¼m«Ž0“Y\$¢À™Øÿ*á¹hSÊ[ýæng©nóDÐc¦=FÏà!<Ç]ØËëXê¯ÃÌ ö\þÒ&ð²4ûqž°ªvƒh±¯34çu•ïôn%4ó‘vï>I– ­ÈÑ7Çl©£Z~™’, ORõå6Ò•6(ìñ<ܳ˜ ð‘ED~»‰ @ ¨« u™vÇí±fF©A"0REžøKRNÁ/&¶´ÑTœP™¨ «ÅMóå½ lSå ŒzË+Í¡Ó3$ÌåþêŸ*Xç’üÉÀ©—ÒÛ(…Ny½hH·:NË÷ª/Œ,´$Q8!Ž¿¿I$‘/`nrävÀIy{C²ØLõJQ3JZ Úv25Ýîo„/ŠTh¯FeÊ®¥+i'îí!N9Õ‹™+ ëÂpvŠUjÇN¨hÀZ ºSHPY·Óâý«†c£É$ñiÓ©É}\׎4Y€`$¬ÇÓ äúâ©–QD0t\= MàÐ×{ :?qæÙ¬aR”L÷›¥XO[€}GShÏ™ò[^ÚO³mØÿÅßàWáEý¡zàiÉð†Ý¦\)/ž®:,kÉ 2èNc¤íj*åõDüºgL‘bƒ±èxöcÍÁµ'Á°¸úúsš-;z'~Åi`/Ùºååa•f¢\Añ‚±×Í,¡9¾DÍAwæ&ÐgÂÈWF(.ÍŠ©Ð¡o p¸·…°FùýfRØà2a,1sÃùgÜEÎ$µ7€[ЖˆzƇ¹¥¥6‹l„F7r%~cÅZí]#€~7±¢·© 8Ú£FC¥wOñ¸MIJ¾7MøäðÍxÀ%éð‡‘ÐOãTŒ%ã£'µÙ6ý‰X„ODIrç ƒòö3ÍÚ¦$kߨFr %^†ž;³“,/å)>YU¬ý &på¥ï4(Å»«ÑöÓéi0g˜9†ÍЇ è ¶hÓ¦ê±ÿ­Â¥7oêâ%”ƒL¹Òo|ï½J…8V†à'!þç€FÒ‹Ãà´h ®¶h´ûá>¬êuÇU•¥EN‚ÞSR[֜ٺtXdûo‰ £Â`4úY ''ªÕi˜a!‰Œª‡`<–ÚRç²8ã«Îr\;Q‚ôi.ŒÄÏpH¥†ÉnÆ5f]æÇ“©`ºøþ›ŠØ vˆbõYuÛž‰"u~iU)þ›?¹øG±ãŠ¥Çžö5ãÖ>n`ÍÖ]ÇÞiÔnCyWD À)€$ «°q…»Äzø…ŽôíÏ }G@¢„ø§a™æZ*VÉÚ¾¥•eÊy˜Ÿ2ÉN)…žÒ›Íj1R­‹‰*xð5CA2ÞØÝV3Û8V†fëÃzž7‡µR2&F“â‡Ö·Ž!m{ñÿ7:ØŽ¹Ì+÷20×ZæüA2§R½}ŽGˆ_Å'·v`™@_A\BKÂ3ážLá‡TY*Á‹å‘=—wJ¯ Am7f¾ C˜6¬:æXz°¯·YQG]¶¼0Æ– W¬JC•uÃX¦Š‡†ºxR¢Aðµ”ø§àGŽ.ÎÑUU “B„Ö9R‹¡‹6‹‰‘Q[0O´>³¡9Æg'½ä"ÀÏêž6ûU§ØÈ²ÇÖ Æ<ºNlŸhYÈ̓gÂ3‹ÙOÃ{¶”JÙŸW]R•߯𠋧¥´˜XkñZ½ÒÒ/\uS€¥Á¤S×¾Ïà cuÁ¤11Ù’—^P_Ò¼…:Ê®ê8&=­h”~ü¿·~úM+džtªz³ôºóˆïôÙ-»9wk¯Ú²åkzåC2Æé9Pb*ß|wC]Iñ_Å ìúÛ©Œá2gsm‘ù£wVlNgÅç[rÚþžÛÎ†Ý NÏ´$ÁÍhyˆu*ÀŸü1ẅR €±J쯧®>ʤH=q¡¯¸‡“(³’÷°¬ßV4þD´R¼áÈ0*à&NŸù„3s|“¸ØäáÎz0KÙå/3Þ u¤mAÃ@÷¦’Aºªk’öaæ×ârRÓʰæð»7éžÖoɼ7D@3IѧQ0yDý}C¬ÑÔ ‰ît-¹ÇÏNxb%rmi³@“óPŠ:•öŸb€ŽÒâG_ÉK-i”„31çJ’ßJ"ŦɢR¯‰m=ÚÛe#Y·¥»¶8 ÖZùÒ.@k%ƒ8,u÷ÓÑLNŸ'aŽð­ê‹&FEÅþY<_HJÈ3Ã5–¿¶‚îŸk4«pY–±Ø”ïíædúÓdo© sAÕŇ˜*ïâ…_ŽÐv¸0»§îY‹©µ]¶¤ø“b ?–¸ë§4Üm ÕW¬•kðöðU Åj””4F`Ö¬TÇHð9k¡õ­´РKÂn:ÊÞ“ÄöíÌ…“×ëèæÐ˜ÒFÒ¼a›&Ð:m¸ Ð3B­âÒFæ¨Ch÷¯€'Î0õä 1ˆƒdüpV X— ¨Fã¯c.¨3ÂgH3€Z5`KÑ®$ýU€t„î—H€ç°gÅk©V}RS>*ѧðòeaa²°‰ý |ãF–™ͶRö†š&t÷&tÖðŸÐ=ÿÍ¿£Fró™À^Ò’4¶¨ñêc±iåy˜šcÀk’‘¹´mȯëÊ›sN/äV “ÄÆæ´¨yؘQÓ÷c˱¡…TB&*’íÛ&eXH˜÷F E¼¡hÉžÛ/E^àøFxÂÐ>›–Pæc$-`¦·|)·…Ÿ”±ªN˜ž‘©§FØÛLòŸ:²_ý0°kàÐßoHŸ6Îm±Øs¿¿ “É€%wѲY(w_¨#écŠÆ¤U_eQHNMèÓʶ'SôŠ™‡úß•´3•Nš<›,ð®ûÆ@*š£*$æ†.ãÖ_̸ÐÙ^·DÝ*! ¿M°]¬ž¾Ô•re‹òT»={Á4Ù·û¹Ô8Â,DN9za§¿JBü#ðD˜³Ü¾Ä›&´ào%ÔÉÁæOXˆ¸ýåŒS1q›¦øŽpëâLÏ¥mr4¡øÉüªSÕ¾sÏò?æ©×õ#¾ÿØ”áÝÄ´°ð1ú–ÉüÑ:B­Koê6φڷ¾®êÊG4y?.ÙEbDM ±á ½FÞ+„¥ñœH3°úÕöÿ³Ë]¦ÏË’y–À[G+‡¦¤¯° Ìx‡gTó¾ {5TõÝúèžp¶?IÒ¶…£`"ÚÚFàd3ª<×Y'%=àtPæEvŸæx÷Ï yš€àÔ²¶›Ñú†ÏY´CuøãƒYñøa[Ô—_ƒ\Ä¿R·ü²~²;w=ÿÃhTC—±ˆÄ]ÖpNšÇÿG:M² Z0·W('N€ŒÔ™õLÈ áÜ#}¹YPÍ“lŸkb˜éRZ_*Íüry¬ß"2{„@p[©ÿHÐæ]ŽÁQ2WÁ_Œ4=Kü÷ #(D­Ïßã)K{ #æÏ*íáÏuÚߺ=˜e_µ†Ï–l†#l&ë7šiÝö 75‘lë`Ã:?YžH`…´W¦£Lu\+äxuÔ)¾‹Át;nØœçc¥‡ÎÙ±cõ†°zd JQ›P’q^†Áõ:£r‹}–¥:ü½t¼345v„–ÂÆiTZö´½×(¾=ȳJ{ÖööMÙKͯ¦,Té±?™¨,“˜j/þESê >.Åá'QÏSÛ[m W(äìBsD9d®©*ê<~¢lÕÄdÜ‚  M²ƒÑ¾ˆ‘ÖT/t2ÚŸ·Õ`u «×·„zË\ ™–³â_ó”Áæ}?˜ p›k/jÂy øÑoaÇ<ûS >ÔÌ´bV8ú‡HËÉ0y‚FÂ¥M^†`zÑÊžlvƒãò¨:ã–ô…ÿjòh{ᮓä÷F@ %ߪ )pOw›4¹*®!À7²óË·´ÖÃÙ¹÷B$6mI]}ˆŒâ÷³jÿ?™óÅ&¢ ¢Î툀[wêçtÊØXLúo9hYÆ‚Áµ0º3K±.†Ó˜ê¼èbÜþòd±°Ñi²eÐì]"*äÐ&G±B­’1½É}FsÏ\ˆ²Ž¨¤b91¾¿šuz%¥’­gGëÐp¦Ç0æ”Ì OO›ì |Œ&+뻵V­Òȸ]Ø^Fª»M|†ÐÄÊû¢Òí…x+Õ}°z×-É÷kìT>ù‡a«FbÊXú|'¡êÑ«&ÏÈ­ŠÆëú¹-JD¢Q´Pï?D¬uEtëT½¹Ïy°Ö!˜Ã [pæøË^õqm¾?Ý ì/[Y4¾‡H}ØW„b©/¾Ôs¹d4j‚yDÈÍiΪÜ÷Pø«ë#»êá8/jÁ÷íµ££fä›õu§nÉå1Aœ.Aq&rMÃ1€/¥ßõÿ}*D Ó¡ÏèÄn—,øyk’X^¤ €S-¼M.ñW-€ƒ6ßßv !'ìñ!YB#¬ŽðÞq«/¼Œw…z Ìð®ѯÃI Á…¯Ðgµ*¤0¾Ý™þ×€F±Vo}z® µR~:‚V´hRL¾E5²)ì'BvÂÏx¨U€.—MZK¾€Ëuò2ý{ \瓳k‡Ö&4C£ÞL•'ÙA#‰µ‡Î4»)Iv  i£ã-ít@Cº|ÿ¾ôm³l¶Ã*ÖÎ Ã(d&š‘mâã .ˆ2®ÔÕ^åžX9:V¨Ógpê|Ô诱C¤À®Küókózl#ûb™”ÕÂ4wÊ, 7t¯·N‡ï¿ÆKòa±ü½ÿÌù€Fm ë‚5øØ/æØô _‡µ®)vªÚjÎnAðœægt7ˆËÒµ¡þcNô£+Ç]O9l5ä•k¿m–jc›µOÈ3/vFÃïrŽîŠ5åi_ÛGRt+ëÉ’¢iåÔDªð¸O·]xf(êÁ"`Ž&À;|\Â6¾ôjëÝñ†v‡âpÙbâR,ÃM¥b¾ÇUÈ&£An~S^;·Q?qsKþ•Ã§ÑØåiÆ*¿»q*JA FÄܤtaˆÖÎv¿:)QIRŒò,¿|æŠìŠ?c“2ë°"ƽ†6f=÷}Þë°sÝ,›³¶Þ7k–n5ÕF0³*ÓXîj]8÷^¬,'Vòn WI´St¦5|eåñOfý~Uz<ÿ¬†}%¼)øíYP3E»>µ"P>þß™ ô¬xCwHbLÑÝÜ—üÙ8?k^;<„¥tÉŸ…êDm­Ú *ñ^äRÆgÕ ¬Aÿóæº¡;Æè§nðó€·4ѳ|o&æBýM>i |«ëoã4S/àa LË~Ë´&ðÒÊÁõ¢«ÌhÂÈð—ŠÑÊ ìÎrº¹yO£ð|!f“TÑ]Åêk$Î%Š8líèüLoð +(`Xsø«mˆxî€YÙš© ”¢«÷øKó}èþ\%ñpÏ=íQެ[ÌNêHìÿ×dœ>\ïúä/…MÑX;%ù¹ŸzF%öë/n­ŽVäÇúÛMÕ¬^‚_ˆ‡3êHè2Í÷—Qhœ7÷#)õó ´åÜë–Â5Óh˜WWpö .0wöý’itø9I{Jȭʈo+EIŒ…è•¿¥»§?à™cµáß«Ž Æo»Ú™;ä®ëZÁ®»Žü69Kâ{ŒV7iø£Ä¿§£¦ÿ†ÔFVÔÙw£ìÀtÖÃ/¢‡BPIýâçÅßH+‡ÐÞ~í#Wl 7…i̾ûÀ±FMÍ­6þZ¦Øqëë;"¢Ž–ß;r7/_&2™.SYãO Æ}CiWevÜrûÛ4¨öÈàòTlÛ5Ïü íZÅðÆMÉÝ0ÔÄáŒ0qÙoDYiü ¨fŠòÍÊBM½Û±ôøZ()hC"«ÄHÑÐdõ§»]j…Ò‰xô“¦j)“ôÀ?Dc¥æñwO,h#¬áþ?Újø‡é<%±d» o,°Õ¨ÁRéÏR›Ý’ËPÕrÊû•è´‘ Åùø³ð£Úük¶kÉòqg¨ärTÖ?¿˜ª¹]`Š}÷>aÃzCjºÉb=û.ä±LM€zs`½Ä&Ÿ,"‡¹x ×Âb ŸâšHdW1h­,FPj$[­†$nSúp…3ÑjØÉó C8:µ—¦x2yÎL‰„7£ÏY}øÙ•e¨|<‰4ª¯o7ÍkÖ-e&a8ðUAÖâ@T¿¤™ô²O;׎¾‰0uxø=|6}wµð™ðàS·÷¦ŸÂ1k¨ ‘7^¤FuÉ‚£i4ò`-nƒ»RçÑ—'³Î³`ÄmWÂt–h-DGµà¤ Ô _ĆŽaìlbËâPx²îðţРnU?HïïJ#âáßå‰2ÿcÀ›Ï²&¬Óy+Öëøp‰*Hv_ a”°<ŠöFOçå¥w½VU¤xÑ\fOóL†­Ù!íØ ®žš¾è}úÕæ²qL¦ï}¯ãr]©ðÐLpîZÇðpóÚ «ÄýÔñ¶Sjh_ @ØCòbÞÈÖ)É3°w YM 'Ê_ZVêì„eïÒ¾;dßä0 â8!9qôüŽˆ9…šñš¹ì»ÁØ[‡ ŽðM C4ª²IL›”Í ŸSVþ¶ïÈTHaªö’êáG¶e߸õú/ç±»1ÜÉÆEX9ñ¸oŽ×UkÁÜQÂߢ.Añ¸«è?Eñ°û¸SÏmmùðsÌ`x_ ”J‹¿(°Îâ„€ƒ¸\¹§:ù×p]6 µJœÓMÕ•½´:ÔH¥Ï!¼D~„ilù"ÐbfêKV è$û´Ôr’º«¡gÓ„L¦¿—Ö‰ÓÙÞæ[îǽœÄ j*ñbŸF~¤œ&uíÉöey¬ ÀçÛ³âƒu™)ìS,~ýì3 ¼"ÿ¼YR—&Üà“U“»NÿŠANžœdRnƒNäll 4ÞÇd#ûé$çè\ó±ÄT¤áù?½¯[ãã7¯{4C’u°08‘Kç^5d.Ì[›ùë³Ñ%q…<û£ÎLzè©©ÙðøSô¹'¸è`ÇÔ΀7÷[åãO4ëÔÜ iKÀIÏDí UTV÷æð†*Ä<Ôq芩›×$EåçÇrD+u{žúÓOã 8ÎÛ<°ý´–ÿ•y¿¸Øê•]Òè¤wê½åp+ž];TeQüŽ6Sž0rÿ·»Q—)Phëø8M€)s \G$¤SoÝ: ßÍüøÕ¹   ÓÇÍ'{Í}<Êw––ÚdŽA‹_vlÑŨ4û¢ý-Ýÿç–èPf‘2ÊCÎ.ÊZc;÷³ “ÝŸYtÏ_Áâ$¾%àGxn°àйv8öÚ _ùä|;«ÁsÌ$)r&wõñ–ióSäÙë_| 9‹àÖ"Ð%ÇôZêÕ´Ÿ6Ó¿¨®%ý¾_N³öðÅ kÌöú˜>ìkMJŒÒ–Xâý÷µþð•`Œ O0ˆ1:œ¨…6hïBU ¹l1|åèýLú4¾‹4¾œaÇrœžZ¢—àföëϪg›áÓÀl´ ˆ…@¨1dëÖQž1ä–È|cn†Ún[ Ÿ:Bܬ!ýŒDºhôÐU:,éaf}c±âwuû.cm. b³ä434+úEú ë«é§ QA}¤w…zÇNA~&/ν¼› Q+ÓÌû›ÇOǵÄf6“ge§Iç ž£1h½sWz§9–&ÄBlš$q¥˜ëúÜêÍ$iƶO°öÒñÚ>œ¿Ðãã\ª‹*ÈŠŒ¢ú²&ÂryNª®|²í@8ïCzšØÔÒ[ó‡ü“ô3þ Ñ`µÙšÙ ¢ë¬ø}Ñ-SÚ•òH¶O4¯gùÅV3ç>g×¾‡ØØžMµ“ù d:§Ú®Rvè±¼€Ÿí…÷ÁDº2”ÄPêbeY0÷ý¾#¥`©¬4ˆ28 7f±î~½¦ì#ù¬^(êmíb¢î ¸°òçfëP s?æ<)ËíÊ¿2Ny¼‘8P¿|Ä8LOwTÊŸdÀܦäñcñæÝÐ|>÷'”žˆï,¾Œ–Õ“÷Øä6ÅtwL8î>šµRŠ¢1â­šhÁ:< ûssnæôÝHJÑRYm Õ—Ë;ëÆê)Í*À]¡Lû;tá8 ðý‡9üû{“\KspsTî‰÷O§s™ŠïôLòÃg„WW\1š<:õRæÏmE)Ï}¥-¨ÀUú>– •eÊ­v<×ê±¥?â·a`_k¶г½Ýðí¤ ,“g˜",×µf=þªü³é ’ŒG³x‘ÜuZ)ûYit´ËŸÂ…'´NåO¾ò•’5áöã›üêq§I™Ù“9|-séoeæ;x~ýŠiw© §ûO߃»$ â–6ÂÔßHÊÔÎtfmo³‹k¸êù®wÑubEIbäO7G *Xc˾sÙ¦Zˆ2“8™Œ|/*ü6g毛$±  -?Ñîy ¬pª›EO€‰ÑAÁ)à7ª^Œ#5 ÕÊÕä5±¬q<»¼¥&«Ü[áF~¨ý‚{äõ±¬±¢Sµ4׌€äÖ-z~üªœJ UŽþµjÙHíÊÜ`áÖ<ã×ÉÜM¬ 9ëe¤dœ»¤­(‡ÖüûòúÙýùâ@À‡{å¹òÙóz4÷m2p‘a'¾p}Oñ×›n$¯©Ý_¡ mÌËo5V,?2*P‰”j³ž¼Îvx”¿êN—Z…â[t2±‘ú©ž'¯»lˆw8Öž’iÑØÿ»,>æ~Uef9ª• °¯÷þóä].-¯©BzÈ^UËÖNM wTݼ¢å¸{.J/êÜÿïÎ…Ã8¨Îwk¶4‡ü¿Yqfr¿5ÄvÕZÆÏÚög¾±LÅ£«S&wkRYã4§#7_'ÿ§öâôо¡(an5cÚŒŸ>íÓù»öîÙýÇí×~ݽgÊÿVS[Ûêd'É¢–Í(kùÿCüº0É[’æÂ%¥½dÈû>žXÒg!ÁÆ@ à’qÈèXñ×ÿá>ÝÞÙ_ì¥/$ˆÃ㢖ճ>þúXƒwoOìÞ»og_Ccs©‡S`]ScCßÎ}{w]úøáÿ~ýúõýíë÷?ôŸsźw:geomview-1.9.4/data/geom/textured/dodec.off0000644000175000001440000000236610622716742015560 00000000000000appearance { +texturing texture { file grid.pgm.gz } } STOFF 20 12 30 3.8857806e-16 0 0.99999963 0.5 1 -0.33333364 0.57735 0.74535523 0.83333318 0.87267785 -0.87267743 0.356822 0.33333299 0.93822533 0.6666666 -0.87267743 -0.356822 0.33333299 0.061774672 0.6666666 -0.33333364 -0.57735 0.74535523 0.16666682 0.87267785 0.66666678 0 0.74535584 0.5 0.87267793 0.1273222 0.934172 0.33333299 0.72844078 0.66666657 -0.74535523 0.57735 -0.33333364 0.89510732 0.33333308 -0.74535523 -0.57735 -0.33333364 0.10489268 0.33333308 0.1273222 -0.934172 0.33333299 0.27155922 0.66666657 0.74535523 0.57735 0.33333364 0.60489231 0.66666692 -0.1273222 0.934172 -0.33333299 0.77155885 0.33333343 -0.66666678 0 -0.74535584 0.99999963 0.12732207 -0.1273222 -0.934172 -0.33333299 0.22844115 0.33333343 0.74535523 -0.57735 0.33333364 0.39510769 0.66666692 0.87267743 0.356822 -0.33333299 0.5617743 0.3333334 0.33333364 0.57735 -0.74535523 0.66666645 0.12732215 -3.8857806e-16 0 -0.99999963 0.99999963 0 0.33333364 -0.57735 -0.74535523 0.33333355 0.12732215 0.87267743 -0.356822 -0.33333299 0.4382257 0.3333334 5 0 1 2 3 4 5 0 5 10 6 1 5 1 6 11 7 2 5 2 7 12 8 3 5 3 8 13 9 4 5 4 9 14 5 0 5 15 10 5 14 19 5 16 11 6 10 15 5 17 12 7 11 16 5 18 13 8 12 17 5 19 14 9 13 18 5 19 18 17 16 15 geomview-1.9.4/data/geom/textured/GCGball0000644000175000001440000006017510622716742015166 00000000000000# ../solar/junk/mkearthtx -stereographic 28 14 appearance { *-evert -backcull +texturing shading smooth texture { #clamp st file geologo.pgm.gz transform 1.5 0 0 0 0 1.5 0 0 0 0 1 0 -.25 -.25 0 1 } } # We could also use: # # STSPHERE STEREOGRAPHIC 1 0 0 0 # # Make sure to disable backculling in this case. # NUMESH 29 14 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.2393 0.0000 0.9709 0.239 0.000 0.971 0.6214 0.5000 0 0.2333 0.0533 0.9709 0.233 0.053 0.971 0.6184 0.5270 0 0.2156 0.1038 0.9709 0.216 0.104 0.971 0.6094 0.5527 0 0.1871 0.1492 0.9709 0.187 0.149 0.971 0.5949 0.5757 0 0.1492 0.1871 0.9709 0.149 0.187 0.971 0.5757 0.5949 0 0.1038 0.2156 0.9709 0.104 0.216 0.971 0.5527 0.6094 0 0.0533 0.2333 0.9709 0.053 0.233 0.971 0.5270 0.6184 0 0.0000 0.2393 0.9709 0.000 0.239 0.971 0.5000 0.6214 0 -0.0533 0.2333 0.9709 -0.053 0.233 0.971 0.4730 0.6184 0 -0.1038 0.2156 0.9709 -0.104 0.216 0.971 0.4473 0.6094 0 -0.1492 0.1871 0.9709 -0.149 0.187 0.971 0.4243 0.5949 0 -0.1871 0.1492 0.9709 -0.187 0.149 0.971 0.4051 0.5757 0 -0.2156 0.1038 0.9709 -0.216 0.104 0.971 0.3906 0.5527 0 -0.2333 0.0533 0.9709 -0.233 0.053 0.971 0.3816 0.5270 0 -0.2393 0.0000 0.9709 -0.239 0.000 0.971 0.3786 0.5000 0 -0.2333 -0.0533 0.9709 -0.233 -0.053 0.971 0.3816 0.4730 0 -0.2156 -0.1038 0.9709 -0.216 -0.104 0.971 0.3906 0.4473 0 -0.1871 -0.1492 0.9709 -0.187 -0.149 0.971 0.4051 0.4243 0 -0.1492 -0.1871 0.9709 -0.149 -0.187 0.971 0.4243 0.4051 0 -0.1038 -0.2156 0.9709 -0.104 -0.216 0.971 0.4473 0.3906 0 -0.0533 -0.2333 0.9709 -0.053 -0.233 0.971 0.4730 0.3816 0 0.0000 -0.2393 0.9709 0.000 -0.239 0.971 0.5000 0.3786 0 0.0533 -0.2333 0.9709 0.053 -0.233 0.971 0.5270 0.3816 0 0.1038 -0.2156 0.9709 0.104 -0.216 0.971 0.5527 0.3906 0 0.1492 -0.1871 0.9709 0.149 -0.187 0.971 0.5757 0.4051 0 0.1871 -0.1492 0.9709 0.187 -0.149 0.971 0.5949 0.4243 0 0.2156 -0.1038 0.9709 0.216 -0.104 0.971 0.6094 0.4473 0 0.2333 -0.0533 0.9709 0.233 -0.053 0.971 0.6184 0.4730 0 0.2393 0.0000 0.9709 0.239 0.000 0.971 0.6214 0.5000 0 0.4647 0.0000 0.8855 0.465 0.000 0.885 0.7465 0.5000 0 0.4531 0.1034 0.8855 0.453 0.103 0.885 0.7403 0.5548 0 0.4187 0.2016 0.8855 0.419 0.202 0.885 0.7221 0.6069 0 0.3633 0.2898 0.8855 0.363 0.290 0.885 0.6927 0.6537 0 0.2898 0.3633 0.8855 0.290 0.363 0.885 0.6537 0.6927 0 0.2016 0.4187 0.8855 0.202 0.419 0.885 0.6069 0.7221 0 0.1034 0.4531 0.8855 0.103 0.453 0.885 0.5548 0.7403 0 0.0000 0.4647 0.8855 0.000 0.465 0.885 0.5000 0.7465 0 -0.1034 0.4531 0.8855 -0.103 0.453 0.885 0.4452 0.7403 0 -0.2016 0.4187 0.8855 -0.202 0.419 0.885 0.3931 0.7221 0 -0.2898 0.3633 0.8855 -0.290 0.363 0.885 0.3463 0.6927 0 -0.3633 0.2898 0.8855 -0.363 0.290 0.885 0.3073 0.6537 0 -0.4187 0.2016 0.8855 -0.419 0.202 0.885 0.2779 0.6069 0 -0.4531 0.1034 0.8855 -0.453 0.103 0.885 0.2597 0.5548 0 -0.4647 0.0000 0.8855 -0.465 0.000 0.885 0.2535 0.5000 0 -0.4531 -0.1034 0.8855 -0.453 -0.103 0.885 0.2597 0.4452 0 -0.4187 -0.2016 0.8855 -0.419 -0.202 0.885 0.2779 0.3931 0 -0.3633 -0.2898 0.8855 -0.363 -0.290 0.885 0.3073 0.3463 0 -0.2898 -0.3633 0.8855 -0.290 -0.363 0.885 0.3463 0.3073 0 -0.2016 -0.4187 0.8855 -0.202 -0.419 0.885 0.3931 0.2779 0 -0.1034 -0.4531 0.8855 -0.103 -0.453 0.885 0.4452 0.2597 0 0.0000 -0.4647 0.8855 0.000 -0.465 0.885 0.5000 0.2535 0 0.1034 -0.4531 0.8855 0.103 -0.453 0.885 0.5548 0.2597 0 0.2016 -0.4187 0.8855 0.202 -0.419 0.885 0.6069 0.2779 0 0.2898 -0.3633 0.8855 0.290 -0.363 0.885 0.6537 0.3073 0 0.3633 -0.2898 0.8855 0.363 -0.290 0.885 0.6927 0.3463 0 0.4187 -0.2016 0.8855 0.419 -0.202 0.885 0.7221 0.3931 0 0.4531 -0.1034 0.8855 0.453 -0.103 0.885 0.7403 0.4452 0 0.4647 0.0000 0.8855 0.465 0.000 0.885 0.7465 0.5000 0 0.6631 0.0000 0.7485 0.663 0.000 0.749 0.8792 0.5000 0 0.6465 0.1476 0.7485 0.646 0.148 0.749 0.8697 0.5844 0 0.5975 0.2877 0.7485 0.597 0.288 0.749 0.8417 0.6646 0 0.5185 0.4135 0.7485 0.518 0.413 0.749 0.7965 0.7365 0 0.4135 0.5185 0.7485 0.413 0.518 0.749 0.7365 0.7965 0 0.2877 0.5975 0.7485 0.288 0.597 0.749 0.6646 0.8417 0 0.1476 0.6465 0.7485 0.148 0.646 0.749 0.5844 0.8697 0 0.0000 0.6631 0.7485 0.000 0.663 0.749 0.5000 0.8792 0 -0.1476 0.6465 0.7485 -0.148 0.646 0.749 0.4156 0.8697 0 -0.2877 0.5975 0.7485 -0.288 0.597 0.749 0.3354 0.8417 0 -0.4135 0.5185 0.7485 -0.413 0.518 0.749 0.2635 0.7965 0 -0.5185 0.4135 0.7485 -0.518 0.413 0.749 0.2035 0.7365 0 -0.5975 0.2877 0.7485 -0.597 0.288 0.749 0.1583 0.6646 0 -0.6465 0.1476 0.7485 -0.646 0.148 0.749 0.1303 0.5844 0 -0.6631 0.0000 0.7485 -0.663 0.000 0.749 0.1208 0.5000 0 -0.6465 -0.1476 0.7485 -0.646 -0.148 0.749 0.1303 0.4156 0 -0.5975 -0.2877 0.7485 -0.597 -0.288 0.749 0.1583 0.3354 0 -0.5185 -0.4135 0.7485 -0.518 -0.413 0.749 0.2035 0.2635 0 -0.4135 -0.5185 0.7485 -0.413 -0.518 0.749 0.2635 0.2035 0 -0.2877 -0.5975 0.7485 -0.288 -0.597 0.749 0.3354 0.1583 0 -0.1476 -0.6465 0.7485 -0.148 -0.646 0.749 0.4156 0.1303 0 0.0000 -0.6631 0.7485 0.000 -0.663 0.749 0.5000 0.1208 0 0.1476 -0.6465 0.7485 0.148 -0.646 0.749 0.5844 0.1303 0 0.2877 -0.5975 0.7485 0.288 -0.597 0.749 0.6646 0.1583 0 0.4135 -0.5185 0.7485 0.413 -0.518 0.749 0.7365 0.2035 0 0.5185 -0.4135 0.7485 0.518 -0.413 0.749 0.7965 0.2635 0 0.5975 -0.2877 0.7485 0.597 -0.288 0.749 0.8417 0.3354 0 0.6465 -0.1476 0.7485 0.646 -0.148 0.749 0.8697 0.4156 0 0.6631 0.0000 0.7485 0.663 0.000 0.749 0.8792 0.5000 0 0.8230 0.0000 0.5681 0.823 0.000 0.568 1.0248 0.5000 0 0.8023 0.1831 0.5681 0.802 0.183 0.568 1.0117 0.6168 0 0.7415 0.3571 0.5681 0.741 0.357 0.568 0.9729 0.7277 0 0.6434 0.5131 0.5681 0.643 0.513 0.568 0.9103 0.8272 0 0.5131 0.6434 0.5681 0.513 0.643 0.568 0.8272 0.9103 0 0.3571 0.7415 0.5681 0.357 0.741 0.568 0.7277 0.9729 0 0.1831 0.8023 0.5681 0.183 0.802 0.568 0.6168 1.0117 0 0.0000 0.8230 0.5681 0.000 0.823 0.568 0.5000 1.0248 0 -0.1831 0.8023 0.5681 -0.183 0.802 0.568 0.3832 1.0117 0 -0.3571 0.7415 0.5681 -0.357 0.741 0.568 0.2723 0.9729 0 -0.5131 0.6434 0.5681 -0.513 0.643 0.568 0.1728 0.9103 0 -0.6434 0.5131 0.5681 -0.643 0.513 0.568 0.0897 0.8272 0 -0.7415 0.3571 0.5681 -0.741 0.357 0.568 0.0271 0.7277 0 -0.8023 0.1831 0.5681 -0.802 0.183 0.568 -0.0117 0.6168 0 -0.8230 0.0000 0.5681 -0.823 0.000 0.568 -0.0248 0.5000 0 -0.8023 -0.1831 0.5681 -0.802 -0.183 0.568 -0.0117 0.3832 0 -0.7415 -0.3571 0.5681 -0.741 -0.357 0.568 0.0271 0.2723 0 -0.6434 -0.5131 0.5681 -0.643 -0.513 0.568 0.0897 0.1728 0 -0.5131 -0.6434 0.5681 -0.513 -0.643 0.568 0.1728 0.0897 0 -0.3571 -0.7415 0.5681 -0.357 -0.741 0.568 0.2723 0.0271 0 -0.1831 -0.8023 0.5681 -0.183 -0.802 0.568 0.3832 -0.0117 0 0.0000 -0.8230 0.5681 0.000 -0.823 0.568 0.5000 -0.0248 0 0.1831 -0.8023 0.5681 0.183 -0.802 0.568 0.6168 -0.0117 0 0.3571 -0.7415 0.5681 0.357 -0.741 0.568 0.7277 0.0271 0 0.5131 -0.6434 0.5681 0.513 -0.643 0.568 0.8272 0.0897 0 0.6434 -0.5131 0.5681 0.643 -0.513 0.568 0.9103 0.1728 0 0.7415 -0.3571 0.5681 0.741 -0.357 0.568 0.9729 0.2723 0 0.8023 -0.1831 0.5681 0.802 -0.183 0.568 1.0117 0.3832 0 0.8230 0.0000 0.5681 0.823 0.000 0.568 1.0248 0.5000 0 0.9350 0.0000 0.3546 0.935 0.000 0.355 1.1903 0.5000 0 0.9116 0.2081 0.3546 0.912 0.208 0.355 1.1729 0.6536 0 0.8424 0.4057 0.3546 0.842 0.406 0.355 1.1219 0.7995 0 0.7310 0.5830 0.3546 0.731 0.583 0.355 1.0397 0.9304 0 0.5830 0.7310 0.3546 0.583 0.731 0.355 0.9304 1.0397 0 0.4057 0.8424 0.3546 0.406 0.842 0.355 0.7995 1.1219 0 0.2081 0.9116 0.3546 0.208 0.912 0.355 0.6536 1.1729 0 0.0000 0.9350 0.3546 0.000 0.935 0.355 0.5000 1.1903 0 -0.2081 0.9116 0.3546 -0.208 0.912 0.355 0.3464 1.1729 0 -0.4057 0.8424 0.3546 -0.406 0.842 0.355 0.2005 1.1219 0 -0.5830 0.7310 0.3546 -0.583 0.731 0.355 0.0696 1.0397 0 -0.7310 0.5830 0.3546 -0.731 0.583 0.355 -0.0397 0.9304 0 -0.8424 0.4057 0.3546 -0.842 0.406 0.355 -0.1219 0.7995 0 -0.9116 0.2081 0.3546 -0.912 0.208 0.355 -0.1729 0.6536 0 -0.9350 0.0000 0.3546 -0.935 0.000 0.355 -0.1903 0.5000 0 -0.9116 -0.2081 0.3546 -0.912 -0.208 0.355 -0.1729 0.3464 0 -0.8424 -0.4057 0.3546 -0.842 -0.406 0.355 -0.1219 0.2005 0 -0.7310 -0.5830 0.3546 -0.731 -0.583 0.355 -0.0397 0.0696 0 -0.5830 -0.7310 0.3546 -0.583 -0.731 0.355 0.0696 -0.0397 0 -0.4057 -0.8424 0.3546 -0.406 -0.842 0.355 0.2005 -0.1219 0 -0.2081 -0.9116 0.3546 -0.208 -0.912 0.355 0.3464 -0.1729 0 0.0000 -0.9350 0.3546 0.000 -0.935 0.355 0.5000 -0.1903 0 0.2081 -0.9116 0.3546 0.208 -0.912 0.355 0.6536 -0.1729 0 0.4057 -0.8424 0.3546 0.406 -0.842 0.355 0.7995 -0.1219 0 0.5830 -0.7310 0.3546 0.583 -0.731 0.355 0.9304 -0.0397 0 0.7310 -0.5830 0.3546 0.731 -0.583 0.355 1.0397 0.0696 0 0.8424 -0.4057 0.3546 0.842 -0.406 0.355 1.1219 0.2005 0 0.9116 -0.2081 0.3546 0.912 -0.208 0.355 1.1729 0.3464 0 0.9350 0.0000 0.3546 0.935 0.000 0.355 1.1903 0.5000 0 0.9927 0.0000 0.1205 0.993 0.000 0.121 1.3859 0.5000 0 0.9678 0.2209 0.1205 0.968 0.221 0.121 1.3637 0.6971 0 0.8944 0.4307 0.1205 0.894 0.431 0.121 1.2982 0.8844 0 0.7761 0.6189 0.1205 0.776 0.619 0.121 1.1926 1.0524 0 0.6189 0.7761 0.1205 0.619 0.776 0.121 1.0524 1.1926 0 0.4307 0.8944 0.1205 0.431 0.894 0.121 0.8844 1.2982 0 0.2209 0.9678 0.1205 0.221 0.968 0.121 0.6971 1.3637 0 0.0000 0.9927 0.1205 0.000 0.993 0.121 0.5000 1.3859 0 -0.2209 0.9678 0.1205 -0.221 0.968 0.121 0.3029 1.3637 0 -0.4307 0.8944 0.1205 -0.431 0.894 0.121 0.1156 1.2982 0 -0.6189 0.7761 0.1205 -0.619 0.776 0.121 -0.0524 1.1926 0 -0.7761 0.6189 0.1205 -0.776 0.619 0.121 -0.1926 1.0524 0 -0.8944 0.4307 0.1205 -0.894 0.431 0.121 -0.2982 0.8844 0 -0.9678 0.2209 0.1205 -0.968 0.221 0.121 -0.3637 0.6971 0 -0.9927 0.0000 0.1205 -0.993 0.000 0.121 -0.3859 0.5000 0 -0.9678 -0.2209 0.1205 -0.968 -0.221 0.121 -0.3637 0.3029 0 -0.8944 -0.4307 0.1205 -0.894 -0.431 0.121 -0.2982 0.1156 0 -0.7761 -0.6189 0.1205 -0.776 -0.619 0.121 -0.1926 -0.0524 0 -0.6189 -0.7761 0.1205 -0.619 -0.776 0.121 -0.0524 -0.1926 0 -0.4307 -0.8944 0.1205 -0.431 -0.894 0.121 0.1156 -0.2982 0 -0.2209 -0.9678 0.1205 -0.221 -0.968 0.121 0.3029 -0.3637 0 0.0000 -0.9927 0.1205 0.000 -0.993 0.121 0.5000 -0.3859 0 0.2209 -0.9678 0.1205 0.221 -0.968 0.121 0.6971 -0.3637 0 0.4307 -0.8944 0.1205 0.431 -0.894 0.121 0.8844 -0.2982 0 0.6189 -0.7761 0.1205 0.619 -0.776 0.121 1.0524 -0.1926 0 0.7761 -0.6189 0.1205 0.776 -0.619 0.121 1.1926 -0.0524 0 0.8944 -0.4307 0.1205 0.894 -0.431 0.121 1.2982 0.1156 0 0.9678 -0.2209 0.1205 0.968 -0.221 0.121 1.3637 0.3029 0 0.9927 0.0000 0.1205 0.993 0.000 0.121 1.3859 0.5000 0 0.9927 0.0000 -0.1205 0.993 0.000 -0.121 1.6288 0.5000 0 0.9678 0.2209 -0.1205 0.968 0.221 -0.121 1.6005 0.7512 0 0.8944 0.4307 -0.1205 0.894 0.431 -0.121 1.5170 0.9898 0 0.7761 0.6189 -0.1205 0.776 0.619 -0.121 1.3825 1.2038 0 0.6189 0.7761 -0.1205 0.619 0.776 -0.121 1.2038 1.3825 0 0.4307 0.8944 -0.1205 0.431 0.894 -0.121 0.9898 1.5170 0 0.2209 0.9678 -0.1205 0.221 0.968 -0.121 0.7512 1.6005 0 0.0000 0.9927 -0.1205 0.000 0.993 -0.121 0.5000 1.6288 0 -0.2209 0.9678 -0.1205 -0.221 0.968 -0.121 0.2488 1.6005 0 -0.4307 0.8944 -0.1205 -0.431 0.894 -0.121 0.0102 1.5170 0 -0.6189 0.7761 -0.1205 -0.619 0.776 -0.121 -0.2038 1.3825 0 -0.7761 0.6189 -0.1205 -0.776 0.619 -0.121 -0.3825 1.2038 0 -0.8944 0.4307 -0.1205 -0.894 0.431 -0.121 -0.5170 0.9898 0 -0.9678 0.2209 -0.1205 -0.968 0.221 -0.121 -0.6005 0.7512 0 -0.9927 0.0000 -0.1205 -0.993 0.000 -0.121 -0.6288 0.5000 0 -0.9678 -0.2209 -0.1205 -0.968 -0.221 -0.121 -0.6005 0.2488 0 -0.8944 -0.4307 -0.1205 -0.894 -0.431 -0.121 -0.5170 0.0102 0 -0.7761 -0.6189 -0.1205 -0.776 -0.619 -0.121 -0.3825 -0.2038 0 -0.6189 -0.7761 -0.1205 -0.619 -0.776 -0.121 -0.2038 -0.3825 0 -0.4307 -0.8944 -0.1205 -0.431 -0.894 -0.121 0.0102 -0.5170 0 -0.2209 -0.9678 -0.1205 -0.221 -0.968 -0.121 0.2488 -0.6005 0 0.0000 -0.9927 -0.1205 0.000 -0.993 -0.121 0.5000 -0.6288 0 0.2209 -0.9678 -0.1205 0.221 -0.968 -0.121 0.7512 -0.6005 0 0.4307 -0.8944 -0.1205 0.431 -0.894 -0.121 0.9898 -0.5170 0 0.6189 -0.7761 -0.1205 0.619 -0.776 -0.121 1.2038 -0.3825 0 0.7761 -0.6189 -0.1205 0.776 -0.619 -0.121 1.3825 -0.2038 0 0.8944 -0.4307 -0.1205 0.894 -0.431 -0.121 1.5170 0.0102 0 0.9678 -0.2209 -0.1205 0.968 -0.221 -0.121 1.6005 0.2488 0 0.9927 0.0000 -0.1205 0.993 0.000 -0.121 1.6288 0.5000 0 0.9350 0.0000 -0.3546 0.935 0.000 -0.355 1.9488 0.5000 0 0.9116 0.2081 -0.3546 0.912 0.208 -0.355 1.9124 0.8224 0 0.8424 0.4057 -0.3546 0.842 0.406 -0.355 1.8053 1.1286 0 0.7310 0.5830 -0.3546 0.731 0.583 -0.355 1.6327 1.4033 0 0.5830 0.7310 -0.3546 0.583 0.731 -0.355 1.4033 1.6327 0 0.4057 0.8424 -0.3546 0.406 0.842 -0.355 1.1286 1.8053 0 0.2081 0.9116 -0.3546 0.208 0.912 -0.355 0.8224 1.9124 0 0.0000 0.9350 -0.3546 0.000 0.935 -0.355 0.5000 1.9488 0 -0.2081 0.9116 -0.3546 -0.208 0.912 -0.355 0.1776 1.9124 0 -0.4057 0.8424 -0.3546 -0.406 0.842 -0.355 -0.1286 1.8053 0 -0.5830 0.7310 -0.3546 -0.583 0.731 -0.355 -0.4033 1.6327 0 -0.7310 0.5830 -0.3546 -0.731 0.583 -0.355 -0.6327 1.4033 0 -0.8424 0.4057 -0.3546 -0.842 0.406 -0.355 -0.8053 1.1286 0 -0.9116 0.2081 -0.3546 -0.912 0.208 -0.355 -0.9124 0.8224 0 -0.9350 0.0000 -0.3546 -0.935 0.000 -0.355 -0.9488 0.5000 0 -0.9116 -0.2081 -0.3546 -0.912 -0.208 -0.355 -0.9124 0.1776 0 -0.8424 -0.4057 -0.3546 -0.842 -0.406 -0.355 -0.8053 -0.1286 0 -0.7310 -0.5830 -0.3546 -0.731 -0.583 -0.355 -0.6327 -0.4033 0 -0.5830 -0.7310 -0.3546 -0.583 -0.731 -0.355 -0.4033 -0.6327 0 -0.4057 -0.8424 -0.3546 -0.406 -0.842 -0.355 -0.1286 -0.8053 0 -0.2081 -0.9116 -0.3546 -0.208 -0.912 -0.355 0.1776 -0.9124 0 0.0000 -0.9350 -0.3546 0.000 -0.935 -0.355 0.5000 -0.9488 0 0.2081 -0.9116 -0.3546 0.208 -0.912 -0.355 0.8224 -0.9124 0 0.4057 -0.8424 -0.3546 0.406 -0.842 -0.355 1.1286 -0.8053 0 0.5830 -0.7310 -0.3546 0.583 -0.731 -0.355 1.4033 -0.6327 0 0.7310 -0.5830 -0.3546 0.731 -0.583 -0.355 1.6327 -0.4033 0 0.8424 -0.4057 -0.3546 0.842 -0.406 -0.355 1.8053 -0.1286 0 0.9116 -0.2081 -0.3546 0.912 -0.208 -0.355 1.9124 0.1776 0 0.9350 0.0000 -0.3546 0.935 0.000 -0.355 1.9488 0.5000 0 0.8230 0.0000 -0.5681 0.823 0.000 -0.568 2.4053 0.5000 0 0.8023 0.1831 -0.5681 0.802 0.183 -0.568 2.3576 0.9240 0 0.7415 0.3571 -0.5681 0.741 0.357 -0.568 2.2167 1.3267 0 0.6434 0.5131 -0.5681 0.643 0.513 -0.568 1.9897 1.6880 0 0.5131 0.6434 -0.5681 0.513 0.643 -0.568 1.6880 1.9897 0 0.3571 0.7415 -0.5681 0.357 0.741 -0.568 1.3267 2.2167 0 0.1831 0.8023 -0.5681 0.183 0.802 -0.568 0.9240 2.3576 0 0.0000 0.8230 -0.5681 0.000 0.823 -0.568 0.5000 2.4053 0 -0.1831 0.8023 -0.5681 -0.183 0.802 -0.568 0.0760 2.3576 0 -0.3571 0.7415 -0.5681 -0.357 0.741 -0.568 -0.3267 2.2167 0 -0.5131 0.6434 -0.5681 -0.513 0.643 -0.568 -0.6880 1.9897 0 -0.6434 0.5131 -0.5681 -0.643 0.513 -0.568 -0.9897 1.6880 0 -0.7415 0.3571 -0.5681 -0.741 0.357 -0.568 -1.2167 1.3267 0 -0.8023 0.1831 -0.5681 -0.802 0.183 -0.568 -1.3576 0.9240 0 -0.8230 0.0000 -0.5681 -0.823 0.000 -0.568 -1.4053 0.5000 0 -0.8023 -0.1831 -0.5681 -0.802 -0.183 -0.568 -1.3576 0.0760 0 -0.7415 -0.3571 -0.5681 -0.741 -0.357 -0.568 -1.2167 -0.3267 0 -0.6434 -0.5131 -0.5681 -0.643 -0.513 -0.568 -0.9897 -0.6880 0 -0.5131 -0.6434 -0.5681 -0.513 -0.643 -0.568 -0.6880 -0.9897 0 -0.3571 -0.7415 -0.5681 -0.357 -0.741 -0.568 -0.3267 -1.2167 0 -0.1831 -0.8023 -0.5681 -0.183 -0.802 -0.568 0.0760 -1.3576 0 0.0000 -0.8230 -0.5681 0.000 -0.823 -0.568 0.5000 -1.4053 0 0.1831 -0.8023 -0.5681 0.183 -0.802 -0.568 0.9240 -1.3576 0 0.3571 -0.7415 -0.5681 0.357 -0.741 -0.568 1.3267 -1.2167 0 0.5131 -0.6434 -0.5681 0.513 -0.643 -0.568 1.6880 -0.9897 0 0.6434 -0.5131 -0.5681 0.643 -0.513 -0.568 1.9897 -0.6880 0 0.7415 -0.3571 -0.5681 0.741 -0.357 -0.568 2.2167 -0.3267 0 0.8023 -0.1831 -0.5681 0.802 -0.183 -0.568 2.3576 0.0760 0 0.8230 0.0000 -0.5681 0.823 0.000 -0.568 2.4053 0.5000 0 0.6631 0.0000 -0.7485 0.663 0.000 -0.749 3.1368 0.5000 0 0.6465 0.1476 -0.7485 0.646 0.148 -0.749 3.0707 1.0867 0 0.5975 0.2877 -0.7485 0.597 0.288 -0.749 2.8757 1.6441 0 0.5185 0.4135 -0.7485 0.518 0.413 -0.749 2.5615 2.1440 0 0.4135 0.5185 -0.7485 0.413 0.518 -0.749 2.1440 2.5615 0 0.2877 0.5975 -0.7485 0.288 0.597 -0.749 1.6441 2.8757 0 0.1476 0.6465 -0.7485 0.148 0.646 -0.749 1.0867 3.0707 0 0.0000 0.6631 -0.7485 0.000 0.663 -0.749 0.5000 3.1368 0 -0.1476 0.6465 -0.7485 -0.148 0.646 -0.749 -0.0867 3.0707 0 -0.2877 0.5975 -0.7485 -0.288 0.597 -0.749 -0.6441 2.8757 0 -0.4135 0.5185 -0.7485 -0.413 0.518 -0.749 -1.1440 2.5615 0 -0.5185 0.4135 -0.7485 -0.518 0.413 -0.749 -1.5615 2.1440 0 -0.5975 0.2877 -0.7485 -0.597 0.288 -0.749 -1.8757 1.6441 0 -0.6465 0.1476 -0.7485 -0.646 0.148 -0.749 -2.0707 1.0867 0 -0.6631 0.0000 -0.7485 -0.663 0.000 -0.749 -2.1368 0.5000 0 -0.6465 -0.1476 -0.7485 -0.646 -0.148 -0.749 -2.0707 -0.0867 0 -0.5975 -0.2877 -0.7485 -0.597 -0.288 -0.749 -1.8757 -0.6441 0 -0.5185 -0.4135 -0.7485 -0.518 -0.413 -0.749 -1.5615 -1.1440 0 -0.4135 -0.5185 -0.7485 -0.413 -0.518 -0.749 -1.1440 -1.5615 0 -0.2877 -0.5975 -0.7485 -0.288 -0.597 -0.749 -0.6441 -1.8757 0 -0.1476 -0.6465 -0.7485 -0.148 -0.646 -0.749 -0.0867 -2.0707 0 0.0000 -0.6631 -0.7485 0.000 -0.663 -0.749 0.5000 -2.1368 0 0.1476 -0.6465 -0.7485 0.148 -0.646 -0.749 1.0867 -2.0707 0 0.2877 -0.5975 -0.7485 0.288 -0.597 -0.749 1.6441 -1.8757 0 0.4135 -0.5185 -0.7485 0.413 -0.518 -0.749 2.1440 -1.5615 0 0.5185 -0.4135 -0.7485 0.518 -0.413 -0.749 2.5615 -1.1440 0 0.5975 -0.2877 -0.7485 0.597 -0.288 -0.749 2.8757 -0.6441 0 0.6465 -0.1476 -0.7485 0.646 -0.148 -0.749 3.0707 -0.0867 0 0.6631 0.0000 -0.7485 0.663 0.000 -0.749 3.1368 0.5000 0 0.4647 0.0000 -0.8855 0.465 0.000 -0.885 4.5572 0.5000 0 0.4531 0.1034 -0.8855 0.453 0.103 -0.885 4.4554 1.4028 0 0.4187 0.2016 -0.8855 0.419 0.202 -0.885 4.1554 2.2603 0 0.3633 0.2898 -0.8855 0.363 0.290 -0.885 3.6720 3.0296 0 0.2898 0.3633 -0.8855 0.290 0.363 -0.885 3.0296 3.6720 0 0.2016 0.4187 -0.8855 0.202 0.419 -0.885 2.2603 4.1554 0 0.1034 0.4531 -0.8855 0.103 0.453 -0.885 1.4028 4.4554 0 0.0000 0.4647 -0.8855 0.000 0.465 -0.885 0.5000 4.5572 0 -0.1034 0.4531 -0.8855 -0.103 0.453 -0.885 -0.4028 4.4554 0 -0.2016 0.4187 -0.8855 -0.202 0.419 -0.885 -1.2603 4.1554 0 -0.2898 0.3633 -0.8855 -0.290 0.363 -0.885 -2.0296 3.6720 0 -0.3633 0.2898 -0.8855 -0.363 0.290 -0.885 -2.6720 3.0296 0 -0.4187 0.2016 -0.8855 -0.419 0.202 -0.885 -3.1554 2.2603 0 -0.4531 0.1034 -0.8855 -0.453 0.103 -0.885 -3.4554 1.4028 0 -0.4647 0.0000 -0.8855 -0.465 0.000 -0.885 -3.5572 0.5000 0 -0.4531 -0.1034 -0.8855 -0.453 -0.103 -0.885 -3.4554 -0.4028 0 -0.4187 -0.2016 -0.8855 -0.419 -0.202 -0.885 -3.1554 -1.2603 0 -0.3633 -0.2898 -0.8855 -0.363 -0.290 -0.885 -2.6720 -2.0296 0 -0.2898 -0.3633 -0.8855 -0.290 -0.363 -0.885 -2.0296 -2.6720 0 -0.2016 -0.4187 -0.8855 -0.202 -0.419 -0.885 -1.2603 -3.1554 0 -0.1034 -0.4531 -0.8855 -0.103 -0.453 -0.885 -0.4028 -3.4554 0 0.0000 -0.4647 -0.8855 0.000 -0.465 -0.885 0.5000 -3.5572 0 0.1034 -0.4531 -0.8855 0.103 -0.453 -0.885 1.4028 -3.4554 0 0.2016 -0.4187 -0.8855 0.202 -0.419 -0.885 2.2603 -3.1554 0 0.2898 -0.3633 -0.8855 0.290 -0.363 -0.885 3.0296 -2.6720 0 0.3633 -0.2898 -0.8855 0.363 -0.290 -0.885 3.6720 -2.0296 0 0.4187 -0.2016 -0.8855 0.419 -0.202 -0.885 4.1554 -1.2603 0 0.4531 -0.1034 -0.8855 0.453 -0.103 -0.885 4.4554 -0.4028 0 0.4647 0.0000 -0.8855 0.465 0.000 -0.885 4.5572 0.5000 0 0.2393 0.0000 -0.9709 0.239 0.000 -0.971 8.7357 0.5000 0 0.2333 0.0533 -0.9709 0.233 0.053 -0.971 8.5293 2.3326 0 0.2156 0.1038 -0.9709 0.216 0.104 -0.971 7.9201 4.0734 0 0.1871 0.1492 -0.9709 0.187 0.149 -0.971 6.9390 5.6349 0 0.1492 0.1871 -0.9709 0.149 0.187 -0.971 5.6349 6.9390 0 0.1038 0.2156 -0.9709 0.104 0.216 -0.971 4.0734 7.9201 0 0.0533 0.2333 -0.9709 0.053 0.233 -0.971 2.3326 8.5293 0 0.0000 0.2393 -0.9709 0.000 0.239 -0.971 0.5000 8.7357 0 -0.0533 0.2333 -0.9709 -0.053 0.233 -0.971 -1.3326 8.5293 0 -0.1038 0.2156 -0.9709 -0.104 0.216 -0.971 -3.0734 7.9201 0 -0.1492 0.1871 -0.9709 -0.149 0.187 -0.971 -4.6349 6.9390 0 -0.1871 0.1492 -0.9709 -0.187 0.149 -0.971 -5.9390 5.6349 0 -0.2156 0.1038 -0.9709 -0.216 0.104 -0.971 -6.9201 4.0734 0 -0.2333 0.0533 -0.9709 -0.233 0.053 -0.971 -7.5293 2.3326 0 -0.2393 0.0000 -0.9709 -0.239 0.000 -0.971 -7.7357 0.5000 0 -0.2333 -0.0533 -0.9709 -0.233 -0.053 -0.971 -7.5293 -1.3326 0 -0.2156 -0.1038 -0.9709 -0.216 -0.104 -0.971 -6.9201 -3.0734 0 -0.1871 -0.1492 -0.9709 -0.187 -0.149 -0.971 -5.9390 -4.6349 0 -0.1492 -0.1871 -0.9709 -0.149 -0.187 -0.971 -4.6349 -5.9390 0 -0.1038 -0.2156 -0.9709 -0.104 -0.216 -0.971 -3.0734 -6.9201 0 -0.0533 -0.2333 -0.9709 -0.053 -0.233 -0.971 -1.3326 -7.5293 0 0.0000 -0.2393 -0.9709 0.000 -0.239 -0.971 0.5000 -7.7357 0 0.0533 -0.2333 -0.9709 0.053 -0.233 -0.971 2.3326 -7.5293 0 0.1038 -0.2156 -0.9709 0.104 -0.216 -0.971 4.0734 -6.9201 0 0.1492 -0.1871 -0.9709 0.149 -0.187 -0.971 5.6349 -5.9390 0 0.1871 -0.1492 -0.9709 0.187 -0.149 -0.971 6.9390 -4.6349 0 0.2156 -0.1038 -0.9709 0.216 -0.104 -0.971 7.9201 -3.0734 0 0.2333 -0.0533 -0.9709 0.233 -0.053 -0.971 8.5293 -1.3326 0 0.2393 0.0000 -0.9709 0.239 0.000 -0.971 8.7357 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 geomview-1.9.4/data/geom/textured/square.off0000644000175000001440000000037010622716742015773 00000000000000appearance { +texturing texture { #file ../../modules/orrery/earth.ppm.Z file grid.pgm.gz } } # STOFF # 4 1 4 # # 0 0 0 0 0 # 1 0 0 1 0 # 1 1 0 1 1 # 0 1 0 0 1 # # 4 0 1 2 3 UMESH 2 2 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 1 0 1 1 0 geomview-1.9.4/data/geom/textured/Antenna.geom0000644000175000001440000002022010622716741016227 00000000000000appearance { shading smooth +texturing texture { file white.pgm.gz alphafile grid.pgm.gz apply modulate transform 2 0 0 0 0 2 0 0 0 0 1 0 0 0 0 1 } } # ../orbit/mkparaboloid .5 1 -t NUMESH 20 7 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0 0 0 0 0 1 0.5 0.5 0 0.16667 0 0.013889 -0.1644 0 0.9864 0.5833 0.5 0 0.15764 0.054117 0.013889 -0.1555 -0.05338 0.9864 0.5788 0.5271 0 0.13152 0.10237 0.013889 -0.1297 -0.101 0.9864 0.5658 0.5512 0 0.091158 0.13953 0.013889 -0.08992 -0.1376 0.9864 0.5456 0.5698 0 0.040914 0.16157 0.013889 -0.04036 -0.1594 0.9864 0.5205 0.5808 0 -0.013763 0.1661 0.013889 0.01358 -0.1638 0.9864 0.4931 0.583 0 -0.066949 0.15263 0.013889 0.06604 -0.1506 0.9864 0.4665 0.5763 0 -0.11288 0.12262 0.013889 0.1113 -0.121 0.9864 0.4436 0.5613 0 -0.14658 0.079325 0.013889 0.1446 -0.07825 0.9864 0.4267 0.5397 0 -0.16439 0.027433 0.013889 0.1622 -0.02706 0.9864 0.4178 0.5137 0 -0.16439 -0.027432 0.013889 0.1622 0.02706 0.9864 0.4178 0.4863 0 -0.14658 -0.079324 0.013889 0.1446 0.07824 0.9864 0.4267 0.4603 0 -0.11288 -0.12262 0.013889 0.1113 0.121 0.9864 0.4436 0.4387 0 -0.06695 -0.15263 0.013889 0.06604 0.1506 0.9864 0.4665 0.4237 0 -0.013764 -0.1661 0.013889 0.01358 0.1638 0.9864 0.4931 0.417 0 0.040914 -0.16157 0.013889 -0.04036 0.1594 0.9864 0.5205 0.4192 0 0.091157 -0.13953 0.013889 -0.08992 0.1376 0.9864 0.5456 0.4302 0 0.13152 -0.10237 0.013889 -0.1297 0.101 0.9864 0.5658 0.4488 0 0.15764 -0.054117 0.013889 -0.1555 0.05338 0.9864 0.5788 0.4729 0 0.16667 -8.8453e-07 0.013889 -0.1644 8.725e-07 0.9864 0.5833 0.5 0 0.33333 0 0.055556 -0.3162 0 0.9487 0.6667 0.5 0 0.31527 0.10823 0.055556 -0.2991 -0.1027 0.9487 0.6576 0.5541 0 0.26305 0.20474 0.055556 -0.2495 -0.1942 0.9487 0.6315 0.6024 0 0.18232 0.27906 0.055556 -0.173 -0.2647 0.9487 0.5912 0.6395 0 0.081829 0.32313 0.055556 -0.07763 -0.3066 0.9487 0.5409 0.6616 0 -0.027526 0.33219 0.055556 0.02611 -0.3151 0.9487 0.4862 0.6661 0 -0.1339 0.30526 0.055556 0.127 -0.2896 0.9487 0.4331 0.6526 0 -0.22576 0.24524 0.055556 0.2142 -0.2327 0.9487 0.3871 0.6226 0 -0.29316 0.15865 0.055556 0.2781 -0.1505 0.9487 0.3534 0.5793 0 -0.32879 0.054866 0.055556 0.3119 -0.05205 0.9487 0.3356 0.5274 0 -0.32879 -0.054864 0.055556 0.3119 0.05205 0.9487 0.3356 0.4726 0 -0.29316 -0.15865 0.055556 0.2781 0.1505 0.9487 0.3534 0.4207 0 -0.22576 -0.24524 0.055556 0.2142 0.2327 0.9487 0.3871 0.3774 0 -0.1339 -0.30526 0.055556 0.127 0.2896 0.9487 0.4331 0.3474 0 -0.027528 -0.33219 0.055556 0.02612 0.3151 0.9487 0.4862 0.3339 0 0.081827 -0.32313 0.055556 -0.07763 0.3066 0.9487 0.5409 0.3384 0 0.18231 -0.27906 0.055556 -0.173 0.2647 0.9487 0.5912 0.3605 0 0.26305 -0.20474 0.055556 -0.2495 0.1942 0.9487 0.6315 0.3976 0 0.31527 -0.10823 0.055556 -0.2991 0.1027 0.9487 0.6576 0.4459 0 0.33333 -1.7691e-06 0.055556 -0.3162 1.678e-06 0.9487 0.6667 0.5 0 0.5 0 0.125 -0.4472 0 0.8944 0.75 0.5 0 0.47291 0.16235 0.125 -0.423 -0.1452 0.8944 0.7365 0.5812 0 0.39457 0.30711 0.125 -0.3529 -0.2747 0.8944 0.6973 0.6536 0 0.27347 0.41858 0.125 -0.2446 -0.3744 0.8944 0.6367 0.7093 0 0.12274 0.4847 0.125 -0.1098 -0.4335 0.8944 0.5614 0.7423 0 -0.041289 0.49829 0.125 0.03693 -0.4457 0.8944 0.4794 0.7491 0 -0.20085 0.45789 0.125 0.1796 -0.4095 0.8944 0.3996 0.7289 0 -0.33864 0.36786 0.125 0.3029 -0.329 0.8944 0.3307 0.6839 0 -0.43974 0.23797 0.125 0.3933 -0.2129 0.8944 0.2801 0.619 0 -0.49318 0.082299 0.125 0.4411 -0.07361 0.8944 0.2534 0.5411 0 -0.49318 -0.082296 0.125 0.4411 0.07361 0.8944 0.2534 0.4589 0 -0.43974 -0.23797 0.125 0.3933 0.2128 0.8944 0.2801 0.381 0 -0.33864 -0.36786 0.125 0.3029 0.329 0.8944 0.3307 0.3161 0 -0.20085 -0.45789 0.125 0.1796 0.4095 0.8944 0.3996 0.2711 0 -0.041292 -0.49829 0.125 0.03693 0.4457 0.8944 0.4794 0.2509 0 0.12274 -0.4847 0.125 -0.1098 0.4335 0.8944 0.5614 0.2576 0 0.27347 -0.41858 0.125 -0.2446 0.3744 0.8944 0.6367 0.2907 0 0.39457 -0.30711 0.125 -0.3529 0.2747 0.8944 0.6973 0.3464 0 0.47291 -0.16235 0.125 -0.423 0.1452 0.8944 0.7365 0.4188 0 0.5 -2.6536e-06 0.125 -0.4472 2.373e-06 0.8944 0.75 0.5 0 0.66667 0 0.22222 -0.5547 0 0.8321 0.8333 0.5 0 0.63054 0.21647 0.22222 -0.5246 -0.1801 0.8321 0.8153 0.6082 0 0.52609 0.40947 0.22222 -0.4377 -0.3407 0.8321 0.763 0.7047 0 0.36463 0.55811 0.22222 -0.3034 -0.4644 0.8321 0.6823 0.7791 0 0.16366 0.64627 0.22222 -0.1362 -0.5377 0.8321 0.5818 0.8231 0 -0.055052 0.66439 0.22222 0.04581 -0.5528 0.8321 0.4725 0.8322 0 -0.2678 0.61052 0.22222 0.2228 -0.508 0.8321 0.3661 0.8053 0 -0.45152 0.49048 0.22222 0.3757 -0.4081 0.8321 0.2742 0.7452 0 -0.58632 0.3173 0.22222 0.4878 -0.264 0.8321 0.2068 0.6586 0 -0.65757 0.10973 0.22222 0.5471 -0.0913 0.8321 0.1712 0.5549 0 -0.65757 -0.10973 0.22222 0.5471 0.0913 0.8321 0.1712 0.4451 0 -0.58632 -0.3173 0.22222 0.4878 0.264 0.8321 0.2068 0.3414 0 -0.45152 -0.49048 0.22222 0.3757 0.4081 0.8321 0.2742 0.2548 0 -0.2678 -0.61051 0.22222 0.2228 0.508 0.8321 0.3661 0.1947 0 -0.055055 -0.66439 0.22222 0.04581 0.5528 0.8321 0.4725 0.1678 0 0.16365 -0.64627 0.22222 -0.1362 0.5377 0.8321 0.5818 0.1769 0 0.36463 -0.55811 0.22222 -0.3034 0.4644 0.8321 0.6823 0.2209 0 0.52609 -0.40948 0.22222 -0.4377 0.3407 0.8321 0.763 0.2953 0 0.63054 -0.21647 0.22222 -0.5246 0.1801 0.8321 0.8153 0.3918 0 0.66667 -3.5381e-06 0.22222 -0.5547 2.944e-06 0.8321 0.8333 0.5 0 0.83333 0 0.34722 -0.6402 0 0.7682 0.9167 0.5 0 0.78818 0.27058 0.34722 -0.6055 -0.2079 0.7682 0.8941 0.6353 0 0.65762 0.51184 0.34722 -0.5052 -0.3932 0.7682 0.8288 0.7559 0 0.45579 0.69764 0.34722 -0.3501 -0.5359 0.7682 0.7279 0.8488 0 0.20457 0.80783 0.34722 -0.1572 -0.6206 0.7682 0.6023 0.9039 0 -0.068815 0.83049 0.34722 0.05287 -0.638 0.7682 0.4656 0.9152 0 -0.33474 0.76314 0.34722 0.2572 -0.5863 0.7682 0.3326 0.8816 0 -0.5644 0.6131 0.34722 0.4336 -0.471 0.7682 0.2178 0.8066 0 -0.73289 0.39662 0.34722 0.563 -0.3047 0.7682 0.1336 0.6983 0 -0.82197 0.13716 0.34722 0.6315 -0.1054 0.7682 0.08902 0.5686 0 -0.82197 -0.13716 0.34722 0.6315 0.1054 0.7682 0.08902 0.4314 0 -0.7329 -0.39662 0.34722 0.563 0.3047 0.7682 0.1336 0.3017 0 -0.5644 -0.6131 0.34722 0.4336 0.471 0.7682 0.2178 0.1934 0 -0.33475 -0.76314 0.34722 0.2572 0.5863 0.7682 0.3326 0.1184 0 -0.068819 -0.83049 0.34722 0.05287 0.638 0.7682 0.4656 0.08476 0 0.20457 -0.80783 0.34722 -0.1572 0.6206 0.7682 0.6023 0.09608 0 0.45579 -0.69764 0.34722 -0.3501 0.5359 0.7682 0.7279 0.1512 0 0.65761 -0.51185 0.34722 -0.5052 0.3932 0.7682 0.8288 0.2441 0 0.78818 -0.27059 0.34722 -0.6055 0.2079 0.7682 0.8941 0.3647 0 0.83333 -4.4226e-06 0.34722 -0.6402 3.398e-06 0.7682 0.9167 0.5 0 1 0 0.5 -0.7071 0 0.7071 1 0.5 0 0.94582 0.3247 0.5 -0.6688 -0.2296 0.7071 0.9729 0.6623 0 0.78914 0.61421 0.5 -0.558 -0.4343 0.7071 0.8946 0.8071 0 0.54695 0.83717 0.5 -0.3868 -0.592 0.7071 0.7735 0.9186 0 0.24549 0.9694 0.5 -0.1736 -0.6855 0.7071 0.6227 0.9847 0 -0.082578 0.99658 0.5 0.05839 -0.7047 0.7071 0.4587 0.9983 0 -0.40169 0.91577 0.5 0.284 -0.6476 0.7071 0.2992 0.9579 0 -0.67728 0.73573 0.5 0.4789 -0.5202 0.7071 0.1614 0.8679 0 -0.87947 0.47595 0.5 0.6219 -0.3365 0.7071 0.06026 0.738 0 -0.98636 0.1646 0.5 0.6975 -0.1164 0.7071 0.00682 0.5823 0 -0.98636 -0.16459 0.5 0.6975 0.1164 0.7071 0.006819 0.4177 0 -0.87948 -0.47594 0.5 0.6219 0.3365 0.7071 0.06026 0.262 0 -0.67728 -0.73572 0.5 0.4789 0.5202 0.7071 0.1614 0.1321 0 -0.4017 -0.91577 0.5 0.284 0.6475 0.7071 0.2992 0.04211 0 -0.082583 -0.99658 0.5 0.0584 0.7047 0.7071 0.4587 0.001708 0 0.24548 -0.9694 0.5 -0.1736 0.6855 0.7071 0.6227 0.0153 0 0.54694 -0.83717 0.5 -0.3867 0.592 0.7071 0.7735 0.08142 0 0.78914 -0.61422 0.5 -0.558 0.4343 0.7071 0.8946 0.1929 0 0.94582 -0.3247 0.5 -0.6688 0.2296 0.7071 0.9729 0.3376 0 1 -5.3072e-06 0.5 -0.7071 3.753e-06 0.7071 1 0.5 0 geomview-1.9.4/data/geom/textured/sphere.gcl0000644000175000001440000000061510622661065015753 00000000000000(read image { define worldimage data RGBA { < Earth.pam.bz2 } }) (read appearance { define texap -transparent texturing shading flat * mipmap * mipinterp * linear edge material { diffuse 0.839000 1.000000 0.461000 } texture { clamp none apply replace image { : worldimage } } }) (geometry sphere { appearance { : texap } STSPHERE CYLINDRICAL 1 0 0 0 }) geomview-1.9.4/data/geom/textured/rabbitball0000644000175000001440000006000307730233064016014 00000000000000# ../solar/junk/mkearthtx -stereographic 28 14 appearance { *-evert backcull +texturing shading smooth texture { file rabbits.ppm.gz transform 1.5 0 0 0 0 1.5 0 0 0 0 1 0 -.25 -.25 0 1 } } NUMESH 29 14 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.0000 0.0000 1.0000 0.000 0.000 1.000 0.5000 0.5000 0 0.2393 0.0000 0.9709 0.239 0.000 0.971 0.6214 0.5000 0 0.2333 0.0533 0.9709 0.233 0.053 0.971 0.6184 0.5270 0 0.2156 0.1038 0.9709 0.216 0.104 0.971 0.6094 0.5527 0 0.1871 0.1492 0.9709 0.187 0.149 0.971 0.5949 0.5757 0 0.1492 0.1871 0.9709 0.149 0.187 0.971 0.5757 0.5949 0 0.1038 0.2156 0.9709 0.104 0.216 0.971 0.5527 0.6094 0 0.0533 0.2333 0.9709 0.053 0.233 0.971 0.5270 0.6184 0 0.0000 0.2393 0.9709 0.000 0.239 0.971 0.5000 0.6214 0 -0.0533 0.2333 0.9709 -0.053 0.233 0.971 0.4730 0.6184 0 -0.1038 0.2156 0.9709 -0.104 0.216 0.971 0.4473 0.6094 0 -0.1492 0.1871 0.9709 -0.149 0.187 0.971 0.4243 0.5949 0 -0.1871 0.1492 0.9709 -0.187 0.149 0.971 0.4051 0.5757 0 -0.2156 0.1038 0.9709 -0.216 0.104 0.971 0.3906 0.5527 0 -0.2333 0.0533 0.9709 -0.233 0.053 0.971 0.3816 0.5270 0 -0.2393 0.0000 0.9709 -0.239 0.000 0.971 0.3786 0.5000 0 -0.2333 -0.0533 0.9709 -0.233 -0.053 0.971 0.3816 0.4730 0 -0.2156 -0.1038 0.9709 -0.216 -0.104 0.971 0.3906 0.4473 0 -0.1871 -0.1492 0.9709 -0.187 -0.149 0.971 0.4051 0.4243 0 -0.1492 -0.1871 0.9709 -0.149 -0.187 0.971 0.4243 0.4051 0 -0.1038 -0.2156 0.9709 -0.104 -0.216 0.971 0.4473 0.3906 0 -0.0533 -0.2333 0.9709 -0.053 -0.233 0.971 0.4730 0.3816 0 0.0000 -0.2393 0.9709 0.000 -0.239 0.971 0.5000 0.3786 0 0.0533 -0.2333 0.9709 0.053 -0.233 0.971 0.5270 0.3816 0 0.1038 -0.2156 0.9709 0.104 -0.216 0.971 0.5527 0.3906 0 0.1492 -0.1871 0.9709 0.149 -0.187 0.971 0.5757 0.4051 0 0.1871 -0.1492 0.9709 0.187 -0.149 0.971 0.5949 0.4243 0 0.2156 -0.1038 0.9709 0.216 -0.104 0.971 0.6094 0.4473 0 0.2333 -0.0533 0.9709 0.233 -0.053 0.971 0.6184 0.4730 0 0.2393 0.0000 0.9709 0.239 0.000 0.971 0.6214 0.5000 0 0.4647 0.0000 0.8855 0.465 0.000 0.885 0.7465 0.5000 0 0.4531 0.1034 0.8855 0.453 0.103 0.885 0.7403 0.5548 0 0.4187 0.2016 0.8855 0.419 0.202 0.885 0.7221 0.6069 0 0.3633 0.2898 0.8855 0.363 0.290 0.885 0.6927 0.6537 0 0.2898 0.3633 0.8855 0.290 0.363 0.885 0.6537 0.6927 0 0.2016 0.4187 0.8855 0.202 0.419 0.885 0.6069 0.7221 0 0.1034 0.4531 0.8855 0.103 0.453 0.885 0.5548 0.7403 0 0.0000 0.4647 0.8855 0.000 0.465 0.885 0.5000 0.7465 0 -0.1034 0.4531 0.8855 -0.103 0.453 0.885 0.4452 0.7403 0 -0.2016 0.4187 0.8855 -0.202 0.419 0.885 0.3931 0.7221 0 -0.2898 0.3633 0.8855 -0.290 0.363 0.885 0.3463 0.6927 0 -0.3633 0.2898 0.8855 -0.363 0.290 0.885 0.3073 0.6537 0 -0.4187 0.2016 0.8855 -0.419 0.202 0.885 0.2779 0.6069 0 -0.4531 0.1034 0.8855 -0.453 0.103 0.885 0.2597 0.5548 0 -0.4647 0.0000 0.8855 -0.465 0.000 0.885 0.2535 0.5000 0 -0.4531 -0.1034 0.8855 -0.453 -0.103 0.885 0.2597 0.4452 0 -0.4187 -0.2016 0.8855 -0.419 -0.202 0.885 0.2779 0.3931 0 -0.3633 -0.2898 0.8855 -0.363 -0.290 0.885 0.3073 0.3463 0 -0.2898 -0.3633 0.8855 -0.290 -0.363 0.885 0.3463 0.3073 0 -0.2016 -0.4187 0.8855 -0.202 -0.419 0.885 0.3931 0.2779 0 -0.1034 -0.4531 0.8855 -0.103 -0.453 0.885 0.4452 0.2597 0 0.0000 -0.4647 0.8855 0.000 -0.465 0.885 0.5000 0.2535 0 0.1034 -0.4531 0.8855 0.103 -0.453 0.885 0.5548 0.2597 0 0.2016 -0.4187 0.8855 0.202 -0.419 0.885 0.6069 0.2779 0 0.2898 -0.3633 0.8855 0.290 -0.363 0.885 0.6537 0.3073 0 0.3633 -0.2898 0.8855 0.363 -0.290 0.885 0.6927 0.3463 0 0.4187 -0.2016 0.8855 0.419 -0.202 0.885 0.7221 0.3931 0 0.4531 -0.1034 0.8855 0.453 -0.103 0.885 0.7403 0.4452 0 0.4647 0.0000 0.8855 0.465 0.000 0.885 0.7465 0.5000 0 0.6631 0.0000 0.7485 0.663 0.000 0.749 0.8792 0.5000 0 0.6465 0.1476 0.7485 0.646 0.148 0.749 0.8697 0.5844 0 0.5975 0.2877 0.7485 0.597 0.288 0.749 0.8417 0.6646 0 0.5185 0.4135 0.7485 0.518 0.413 0.749 0.7965 0.7365 0 0.4135 0.5185 0.7485 0.413 0.518 0.749 0.7365 0.7965 0 0.2877 0.5975 0.7485 0.288 0.597 0.749 0.6646 0.8417 0 0.1476 0.6465 0.7485 0.148 0.646 0.749 0.5844 0.8697 0 0.0000 0.6631 0.7485 0.000 0.663 0.749 0.5000 0.8792 0 -0.1476 0.6465 0.7485 -0.148 0.646 0.749 0.4156 0.8697 0 -0.2877 0.5975 0.7485 -0.288 0.597 0.749 0.3354 0.8417 0 -0.4135 0.5185 0.7485 -0.413 0.518 0.749 0.2635 0.7965 0 -0.5185 0.4135 0.7485 -0.518 0.413 0.749 0.2035 0.7365 0 -0.5975 0.2877 0.7485 -0.597 0.288 0.749 0.1583 0.6646 0 -0.6465 0.1476 0.7485 -0.646 0.148 0.749 0.1303 0.5844 0 -0.6631 0.0000 0.7485 -0.663 0.000 0.749 0.1208 0.5000 0 -0.6465 -0.1476 0.7485 -0.646 -0.148 0.749 0.1303 0.4156 0 -0.5975 -0.2877 0.7485 -0.597 -0.288 0.749 0.1583 0.3354 0 -0.5185 -0.4135 0.7485 -0.518 -0.413 0.749 0.2035 0.2635 0 -0.4135 -0.5185 0.7485 -0.413 -0.518 0.749 0.2635 0.2035 0 -0.2877 -0.5975 0.7485 -0.288 -0.597 0.749 0.3354 0.1583 0 -0.1476 -0.6465 0.7485 -0.148 -0.646 0.749 0.4156 0.1303 0 0.0000 -0.6631 0.7485 0.000 -0.663 0.749 0.5000 0.1208 0 0.1476 -0.6465 0.7485 0.148 -0.646 0.749 0.5844 0.1303 0 0.2877 -0.5975 0.7485 0.288 -0.597 0.749 0.6646 0.1583 0 0.4135 -0.5185 0.7485 0.413 -0.518 0.749 0.7365 0.2035 0 0.5185 -0.4135 0.7485 0.518 -0.413 0.749 0.7965 0.2635 0 0.5975 -0.2877 0.7485 0.597 -0.288 0.749 0.8417 0.3354 0 0.6465 -0.1476 0.7485 0.646 -0.148 0.749 0.8697 0.4156 0 0.6631 0.0000 0.7485 0.663 0.000 0.749 0.8792 0.5000 0 0.8230 0.0000 0.5681 0.823 0.000 0.568 1.0248 0.5000 0 0.8023 0.1831 0.5681 0.802 0.183 0.568 1.0117 0.6168 0 0.7415 0.3571 0.5681 0.741 0.357 0.568 0.9729 0.7277 0 0.6434 0.5131 0.5681 0.643 0.513 0.568 0.9103 0.8272 0 0.5131 0.6434 0.5681 0.513 0.643 0.568 0.8272 0.9103 0 0.3571 0.7415 0.5681 0.357 0.741 0.568 0.7277 0.9729 0 0.1831 0.8023 0.5681 0.183 0.802 0.568 0.6168 1.0117 0 0.0000 0.8230 0.5681 0.000 0.823 0.568 0.5000 1.0248 0 -0.1831 0.8023 0.5681 -0.183 0.802 0.568 0.3832 1.0117 0 -0.3571 0.7415 0.5681 -0.357 0.741 0.568 0.2723 0.9729 0 -0.5131 0.6434 0.5681 -0.513 0.643 0.568 0.1728 0.9103 0 -0.6434 0.5131 0.5681 -0.643 0.513 0.568 0.0897 0.8272 0 -0.7415 0.3571 0.5681 -0.741 0.357 0.568 0.0271 0.7277 0 -0.8023 0.1831 0.5681 -0.802 0.183 0.568 -0.0117 0.6168 0 -0.8230 0.0000 0.5681 -0.823 0.000 0.568 -0.0248 0.5000 0 -0.8023 -0.1831 0.5681 -0.802 -0.183 0.568 -0.0117 0.3832 0 -0.7415 -0.3571 0.5681 -0.741 -0.357 0.568 0.0271 0.2723 0 -0.6434 -0.5131 0.5681 -0.643 -0.513 0.568 0.0897 0.1728 0 -0.5131 -0.6434 0.5681 -0.513 -0.643 0.568 0.1728 0.0897 0 -0.3571 -0.7415 0.5681 -0.357 -0.741 0.568 0.2723 0.0271 0 -0.1831 -0.8023 0.5681 -0.183 -0.802 0.568 0.3832 -0.0117 0 0.0000 -0.8230 0.5681 0.000 -0.823 0.568 0.5000 -0.0248 0 0.1831 -0.8023 0.5681 0.183 -0.802 0.568 0.6168 -0.0117 0 0.3571 -0.7415 0.5681 0.357 -0.741 0.568 0.7277 0.0271 0 0.5131 -0.6434 0.5681 0.513 -0.643 0.568 0.8272 0.0897 0 0.6434 -0.5131 0.5681 0.643 -0.513 0.568 0.9103 0.1728 0 0.7415 -0.3571 0.5681 0.741 -0.357 0.568 0.9729 0.2723 0 0.8023 -0.1831 0.5681 0.802 -0.183 0.568 1.0117 0.3832 0 0.8230 0.0000 0.5681 0.823 0.000 0.568 1.0248 0.5000 0 0.9350 0.0000 0.3546 0.935 0.000 0.355 1.1903 0.5000 0 0.9116 0.2081 0.3546 0.912 0.208 0.355 1.1729 0.6536 0 0.8424 0.4057 0.3546 0.842 0.406 0.355 1.1219 0.7995 0 0.7310 0.5830 0.3546 0.731 0.583 0.355 1.0397 0.9304 0 0.5830 0.7310 0.3546 0.583 0.731 0.355 0.9304 1.0397 0 0.4057 0.8424 0.3546 0.406 0.842 0.355 0.7995 1.1219 0 0.2081 0.9116 0.3546 0.208 0.912 0.355 0.6536 1.1729 0 0.0000 0.9350 0.3546 0.000 0.935 0.355 0.5000 1.1903 0 -0.2081 0.9116 0.3546 -0.208 0.912 0.355 0.3464 1.1729 0 -0.4057 0.8424 0.3546 -0.406 0.842 0.355 0.2005 1.1219 0 -0.5830 0.7310 0.3546 -0.583 0.731 0.355 0.0696 1.0397 0 -0.7310 0.5830 0.3546 -0.731 0.583 0.355 -0.0397 0.9304 0 -0.8424 0.4057 0.3546 -0.842 0.406 0.355 -0.1219 0.7995 0 -0.9116 0.2081 0.3546 -0.912 0.208 0.355 -0.1729 0.6536 0 -0.9350 0.0000 0.3546 -0.935 0.000 0.355 -0.1903 0.5000 0 -0.9116 -0.2081 0.3546 -0.912 -0.208 0.355 -0.1729 0.3464 0 -0.8424 -0.4057 0.3546 -0.842 -0.406 0.355 -0.1219 0.2005 0 -0.7310 -0.5830 0.3546 -0.731 -0.583 0.355 -0.0397 0.0696 0 -0.5830 -0.7310 0.3546 -0.583 -0.731 0.355 0.0696 -0.0397 0 -0.4057 -0.8424 0.3546 -0.406 -0.842 0.355 0.2005 -0.1219 0 -0.2081 -0.9116 0.3546 -0.208 -0.912 0.355 0.3464 -0.1729 0 0.0000 -0.9350 0.3546 0.000 -0.935 0.355 0.5000 -0.1903 0 0.2081 -0.9116 0.3546 0.208 -0.912 0.355 0.6536 -0.1729 0 0.4057 -0.8424 0.3546 0.406 -0.842 0.355 0.7995 -0.1219 0 0.5830 -0.7310 0.3546 0.583 -0.731 0.355 0.9304 -0.0397 0 0.7310 -0.5830 0.3546 0.731 -0.583 0.355 1.0397 0.0696 0 0.8424 -0.4057 0.3546 0.842 -0.406 0.355 1.1219 0.2005 0 0.9116 -0.2081 0.3546 0.912 -0.208 0.355 1.1729 0.3464 0 0.9350 0.0000 0.3546 0.935 0.000 0.355 1.1903 0.5000 0 0.9927 0.0000 0.1205 0.993 0.000 0.121 1.3859 0.5000 0 0.9678 0.2209 0.1205 0.968 0.221 0.121 1.3637 0.6971 0 0.8944 0.4307 0.1205 0.894 0.431 0.121 1.2982 0.8844 0 0.7761 0.6189 0.1205 0.776 0.619 0.121 1.1926 1.0524 0 0.6189 0.7761 0.1205 0.619 0.776 0.121 1.0524 1.1926 0 0.4307 0.8944 0.1205 0.431 0.894 0.121 0.8844 1.2982 0 0.2209 0.9678 0.1205 0.221 0.968 0.121 0.6971 1.3637 0 0.0000 0.9927 0.1205 0.000 0.993 0.121 0.5000 1.3859 0 -0.2209 0.9678 0.1205 -0.221 0.968 0.121 0.3029 1.3637 0 -0.4307 0.8944 0.1205 -0.431 0.894 0.121 0.1156 1.2982 0 -0.6189 0.7761 0.1205 -0.619 0.776 0.121 -0.0524 1.1926 0 -0.7761 0.6189 0.1205 -0.776 0.619 0.121 -0.1926 1.0524 0 -0.8944 0.4307 0.1205 -0.894 0.431 0.121 -0.2982 0.8844 0 -0.9678 0.2209 0.1205 -0.968 0.221 0.121 -0.3637 0.6971 0 -0.9927 0.0000 0.1205 -0.993 0.000 0.121 -0.3859 0.5000 0 -0.9678 -0.2209 0.1205 -0.968 -0.221 0.121 -0.3637 0.3029 0 -0.8944 -0.4307 0.1205 -0.894 -0.431 0.121 -0.2982 0.1156 0 -0.7761 -0.6189 0.1205 -0.776 -0.619 0.121 -0.1926 -0.0524 0 -0.6189 -0.7761 0.1205 -0.619 -0.776 0.121 -0.0524 -0.1926 0 -0.4307 -0.8944 0.1205 -0.431 -0.894 0.121 0.1156 -0.2982 0 -0.2209 -0.9678 0.1205 -0.221 -0.968 0.121 0.3029 -0.3637 0 0.0000 -0.9927 0.1205 0.000 -0.993 0.121 0.5000 -0.3859 0 0.2209 -0.9678 0.1205 0.221 -0.968 0.121 0.6971 -0.3637 0 0.4307 -0.8944 0.1205 0.431 -0.894 0.121 0.8844 -0.2982 0 0.6189 -0.7761 0.1205 0.619 -0.776 0.121 1.0524 -0.1926 0 0.7761 -0.6189 0.1205 0.776 -0.619 0.121 1.1926 -0.0524 0 0.8944 -0.4307 0.1205 0.894 -0.431 0.121 1.2982 0.1156 0 0.9678 -0.2209 0.1205 0.968 -0.221 0.121 1.3637 0.3029 0 0.9927 0.0000 0.1205 0.993 0.000 0.121 1.3859 0.5000 0 0.9927 0.0000 -0.1205 0.993 0.000 -0.121 1.6288 0.5000 0 0.9678 0.2209 -0.1205 0.968 0.221 -0.121 1.6005 0.7512 0 0.8944 0.4307 -0.1205 0.894 0.431 -0.121 1.5170 0.9898 0 0.7761 0.6189 -0.1205 0.776 0.619 -0.121 1.3825 1.2038 0 0.6189 0.7761 -0.1205 0.619 0.776 -0.121 1.2038 1.3825 0 0.4307 0.8944 -0.1205 0.431 0.894 -0.121 0.9898 1.5170 0 0.2209 0.9678 -0.1205 0.221 0.968 -0.121 0.7512 1.6005 0 0.0000 0.9927 -0.1205 0.000 0.993 -0.121 0.5000 1.6288 0 -0.2209 0.9678 -0.1205 -0.221 0.968 -0.121 0.2488 1.6005 0 -0.4307 0.8944 -0.1205 -0.431 0.894 -0.121 0.0102 1.5170 0 -0.6189 0.7761 -0.1205 -0.619 0.776 -0.121 -0.2038 1.3825 0 -0.7761 0.6189 -0.1205 -0.776 0.619 -0.121 -0.3825 1.2038 0 -0.8944 0.4307 -0.1205 -0.894 0.431 -0.121 -0.5170 0.9898 0 -0.9678 0.2209 -0.1205 -0.968 0.221 -0.121 -0.6005 0.7512 0 -0.9927 0.0000 -0.1205 -0.993 0.000 -0.121 -0.6288 0.5000 0 -0.9678 -0.2209 -0.1205 -0.968 -0.221 -0.121 -0.6005 0.2488 0 -0.8944 -0.4307 -0.1205 -0.894 -0.431 -0.121 -0.5170 0.0102 0 -0.7761 -0.6189 -0.1205 -0.776 -0.619 -0.121 -0.3825 -0.2038 0 -0.6189 -0.7761 -0.1205 -0.619 -0.776 -0.121 -0.2038 -0.3825 0 -0.4307 -0.8944 -0.1205 -0.431 -0.894 -0.121 0.0102 -0.5170 0 -0.2209 -0.9678 -0.1205 -0.221 -0.968 -0.121 0.2488 -0.6005 0 0.0000 -0.9927 -0.1205 0.000 -0.993 -0.121 0.5000 -0.6288 0 0.2209 -0.9678 -0.1205 0.221 -0.968 -0.121 0.7512 -0.6005 0 0.4307 -0.8944 -0.1205 0.431 -0.894 -0.121 0.9898 -0.5170 0 0.6189 -0.7761 -0.1205 0.619 -0.776 -0.121 1.2038 -0.3825 0 0.7761 -0.6189 -0.1205 0.776 -0.619 -0.121 1.3825 -0.2038 0 0.8944 -0.4307 -0.1205 0.894 -0.431 -0.121 1.5170 0.0102 0 0.9678 -0.2209 -0.1205 0.968 -0.221 -0.121 1.6005 0.2488 0 0.9927 0.0000 -0.1205 0.993 0.000 -0.121 1.6288 0.5000 0 0.9350 0.0000 -0.3546 0.935 0.000 -0.355 1.9488 0.5000 0 0.9116 0.2081 -0.3546 0.912 0.208 -0.355 1.9124 0.8224 0 0.8424 0.4057 -0.3546 0.842 0.406 -0.355 1.8053 1.1286 0 0.7310 0.5830 -0.3546 0.731 0.583 -0.355 1.6327 1.4033 0 0.5830 0.7310 -0.3546 0.583 0.731 -0.355 1.4033 1.6327 0 0.4057 0.8424 -0.3546 0.406 0.842 -0.355 1.1286 1.8053 0 0.2081 0.9116 -0.3546 0.208 0.912 -0.355 0.8224 1.9124 0 0.0000 0.9350 -0.3546 0.000 0.935 -0.355 0.5000 1.9488 0 -0.2081 0.9116 -0.3546 -0.208 0.912 -0.355 0.1776 1.9124 0 -0.4057 0.8424 -0.3546 -0.406 0.842 -0.355 -0.1286 1.8053 0 -0.5830 0.7310 -0.3546 -0.583 0.731 -0.355 -0.4033 1.6327 0 -0.7310 0.5830 -0.3546 -0.731 0.583 -0.355 -0.6327 1.4033 0 -0.8424 0.4057 -0.3546 -0.842 0.406 -0.355 -0.8053 1.1286 0 -0.9116 0.2081 -0.3546 -0.912 0.208 -0.355 -0.9124 0.8224 0 -0.9350 0.0000 -0.3546 -0.935 0.000 -0.355 -0.9488 0.5000 0 -0.9116 -0.2081 -0.3546 -0.912 -0.208 -0.355 -0.9124 0.1776 0 -0.8424 -0.4057 -0.3546 -0.842 -0.406 -0.355 -0.8053 -0.1286 0 -0.7310 -0.5830 -0.3546 -0.731 -0.583 -0.355 -0.6327 -0.4033 0 -0.5830 -0.7310 -0.3546 -0.583 -0.731 -0.355 -0.4033 -0.6327 0 -0.4057 -0.8424 -0.3546 -0.406 -0.842 -0.355 -0.1286 -0.8053 0 -0.2081 -0.9116 -0.3546 -0.208 -0.912 -0.355 0.1776 -0.9124 0 0.0000 -0.9350 -0.3546 0.000 -0.935 -0.355 0.5000 -0.9488 0 0.2081 -0.9116 -0.3546 0.208 -0.912 -0.355 0.8224 -0.9124 0 0.4057 -0.8424 -0.3546 0.406 -0.842 -0.355 1.1286 -0.8053 0 0.5830 -0.7310 -0.3546 0.583 -0.731 -0.355 1.4033 -0.6327 0 0.7310 -0.5830 -0.3546 0.731 -0.583 -0.355 1.6327 -0.4033 0 0.8424 -0.4057 -0.3546 0.842 -0.406 -0.355 1.8053 -0.1286 0 0.9116 -0.2081 -0.3546 0.912 -0.208 -0.355 1.9124 0.1776 0 0.9350 0.0000 -0.3546 0.935 0.000 -0.355 1.9488 0.5000 0 0.8230 0.0000 -0.5681 0.823 0.000 -0.568 2.4053 0.5000 0 0.8023 0.1831 -0.5681 0.802 0.183 -0.568 2.3576 0.9240 0 0.7415 0.3571 -0.5681 0.741 0.357 -0.568 2.2167 1.3267 0 0.6434 0.5131 -0.5681 0.643 0.513 -0.568 1.9897 1.6880 0 0.5131 0.6434 -0.5681 0.513 0.643 -0.568 1.6880 1.9897 0 0.3571 0.7415 -0.5681 0.357 0.741 -0.568 1.3267 2.2167 0 0.1831 0.8023 -0.5681 0.183 0.802 -0.568 0.9240 2.3576 0 0.0000 0.8230 -0.5681 0.000 0.823 -0.568 0.5000 2.4053 0 -0.1831 0.8023 -0.5681 -0.183 0.802 -0.568 0.0760 2.3576 0 -0.3571 0.7415 -0.5681 -0.357 0.741 -0.568 -0.3267 2.2167 0 -0.5131 0.6434 -0.5681 -0.513 0.643 -0.568 -0.6880 1.9897 0 -0.6434 0.5131 -0.5681 -0.643 0.513 -0.568 -0.9897 1.6880 0 -0.7415 0.3571 -0.5681 -0.741 0.357 -0.568 -1.2167 1.3267 0 -0.8023 0.1831 -0.5681 -0.802 0.183 -0.568 -1.3576 0.9240 0 -0.8230 0.0000 -0.5681 -0.823 0.000 -0.568 -1.4053 0.5000 0 -0.8023 -0.1831 -0.5681 -0.802 -0.183 -0.568 -1.3576 0.0760 0 -0.7415 -0.3571 -0.5681 -0.741 -0.357 -0.568 -1.2167 -0.3267 0 -0.6434 -0.5131 -0.5681 -0.643 -0.513 -0.568 -0.9897 -0.6880 0 -0.5131 -0.6434 -0.5681 -0.513 -0.643 -0.568 -0.6880 -0.9897 0 -0.3571 -0.7415 -0.5681 -0.357 -0.741 -0.568 -0.3267 -1.2167 0 -0.1831 -0.8023 -0.5681 -0.183 -0.802 -0.568 0.0760 -1.3576 0 0.0000 -0.8230 -0.5681 0.000 -0.823 -0.568 0.5000 -1.4053 0 0.1831 -0.8023 -0.5681 0.183 -0.802 -0.568 0.9240 -1.3576 0 0.3571 -0.7415 -0.5681 0.357 -0.741 -0.568 1.3267 -1.2167 0 0.5131 -0.6434 -0.5681 0.513 -0.643 -0.568 1.6880 -0.9897 0 0.6434 -0.5131 -0.5681 0.643 -0.513 -0.568 1.9897 -0.6880 0 0.7415 -0.3571 -0.5681 0.741 -0.357 -0.568 2.2167 -0.3267 0 0.8023 -0.1831 -0.5681 0.802 -0.183 -0.568 2.3576 0.0760 0 0.8230 0.0000 -0.5681 0.823 0.000 -0.568 2.4053 0.5000 0 0.6631 0.0000 -0.7485 0.663 0.000 -0.749 3.1368 0.5000 0 0.6465 0.1476 -0.7485 0.646 0.148 -0.749 3.0707 1.0867 0 0.5975 0.2877 -0.7485 0.597 0.288 -0.749 2.8757 1.6441 0 0.5185 0.4135 -0.7485 0.518 0.413 -0.749 2.5615 2.1440 0 0.4135 0.5185 -0.7485 0.413 0.518 -0.749 2.1440 2.5615 0 0.2877 0.5975 -0.7485 0.288 0.597 -0.749 1.6441 2.8757 0 0.1476 0.6465 -0.7485 0.148 0.646 -0.749 1.0867 3.0707 0 0.0000 0.6631 -0.7485 0.000 0.663 -0.749 0.5000 3.1368 0 -0.1476 0.6465 -0.7485 -0.148 0.646 -0.749 -0.0867 3.0707 0 -0.2877 0.5975 -0.7485 -0.288 0.597 -0.749 -0.6441 2.8757 0 -0.4135 0.5185 -0.7485 -0.413 0.518 -0.749 -1.1440 2.5615 0 -0.5185 0.4135 -0.7485 -0.518 0.413 -0.749 -1.5615 2.1440 0 -0.5975 0.2877 -0.7485 -0.597 0.288 -0.749 -1.8757 1.6441 0 -0.6465 0.1476 -0.7485 -0.646 0.148 -0.749 -2.0707 1.0867 0 -0.6631 0.0000 -0.7485 -0.663 0.000 -0.749 -2.1368 0.5000 0 -0.6465 -0.1476 -0.7485 -0.646 -0.148 -0.749 -2.0707 -0.0867 0 -0.5975 -0.2877 -0.7485 -0.597 -0.288 -0.749 -1.8757 -0.6441 0 -0.5185 -0.4135 -0.7485 -0.518 -0.413 -0.749 -1.5615 -1.1440 0 -0.4135 -0.5185 -0.7485 -0.413 -0.518 -0.749 -1.1440 -1.5615 0 -0.2877 -0.5975 -0.7485 -0.288 -0.597 -0.749 -0.6441 -1.8757 0 -0.1476 -0.6465 -0.7485 -0.148 -0.646 -0.749 -0.0867 -2.0707 0 0.0000 -0.6631 -0.7485 0.000 -0.663 -0.749 0.5000 -2.1368 0 0.1476 -0.6465 -0.7485 0.148 -0.646 -0.749 1.0867 -2.0707 0 0.2877 -0.5975 -0.7485 0.288 -0.597 -0.749 1.6441 -1.8757 0 0.4135 -0.5185 -0.7485 0.413 -0.518 -0.749 2.1440 -1.5615 0 0.5185 -0.4135 -0.7485 0.518 -0.413 -0.749 2.5615 -1.1440 0 0.5975 -0.2877 -0.7485 0.597 -0.288 -0.749 2.8757 -0.6441 0 0.6465 -0.1476 -0.7485 0.646 -0.148 -0.749 3.0707 -0.0867 0 0.6631 0.0000 -0.7485 0.663 0.000 -0.749 3.1368 0.5000 0 0.4647 0.0000 -0.8855 0.465 0.000 -0.885 4.5572 0.5000 0 0.4531 0.1034 -0.8855 0.453 0.103 -0.885 4.4554 1.4028 0 0.4187 0.2016 -0.8855 0.419 0.202 -0.885 4.1554 2.2603 0 0.3633 0.2898 -0.8855 0.363 0.290 -0.885 3.6720 3.0296 0 0.2898 0.3633 -0.8855 0.290 0.363 -0.885 3.0296 3.6720 0 0.2016 0.4187 -0.8855 0.202 0.419 -0.885 2.2603 4.1554 0 0.1034 0.4531 -0.8855 0.103 0.453 -0.885 1.4028 4.4554 0 0.0000 0.4647 -0.8855 0.000 0.465 -0.885 0.5000 4.5572 0 -0.1034 0.4531 -0.8855 -0.103 0.453 -0.885 -0.4028 4.4554 0 -0.2016 0.4187 -0.8855 -0.202 0.419 -0.885 -1.2603 4.1554 0 -0.2898 0.3633 -0.8855 -0.290 0.363 -0.885 -2.0296 3.6720 0 -0.3633 0.2898 -0.8855 -0.363 0.290 -0.885 -2.6720 3.0296 0 -0.4187 0.2016 -0.8855 -0.419 0.202 -0.885 -3.1554 2.2603 0 -0.4531 0.1034 -0.8855 -0.453 0.103 -0.885 -3.4554 1.4028 0 -0.4647 0.0000 -0.8855 -0.465 0.000 -0.885 -3.5572 0.5000 0 -0.4531 -0.1034 -0.8855 -0.453 -0.103 -0.885 -3.4554 -0.4028 0 -0.4187 -0.2016 -0.8855 -0.419 -0.202 -0.885 -3.1554 -1.2603 0 -0.3633 -0.2898 -0.8855 -0.363 -0.290 -0.885 -2.6720 -2.0296 0 -0.2898 -0.3633 -0.8855 -0.290 -0.363 -0.885 -2.0296 -2.6720 0 -0.2016 -0.4187 -0.8855 -0.202 -0.419 -0.885 -1.2603 -3.1554 0 -0.1034 -0.4531 -0.8855 -0.103 -0.453 -0.885 -0.4028 -3.4554 0 0.0000 -0.4647 -0.8855 0.000 -0.465 -0.885 0.5000 -3.5572 0 0.1034 -0.4531 -0.8855 0.103 -0.453 -0.885 1.4028 -3.4554 0 0.2016 -0.4187 -0.8855 0.202 -0.419 -0.885 2.2603 -3.1554 0 0.2898 -0.3633 -0.8855 0.290 -0.363 -0.885 3.0296 -2.6720 0 0.3633 -0.2898 -0.8855 0.363 -0.290 -0.885 3.6720 -2.0296 0 0.4187 -0.2016 -0.8855 0.419 -0.202 -0.885 4.1554 -1.2603 0 0.4531 -0.1034 -0.8855 0.453 -0.103 -0.885 4.4554 -0.4028 0 0.4647 0.0000 -0.8855 0.465 0.000 -0.885 4.5572 0.5000 0 0.2393 0.0000 -0.9709 0.239 0.000 -0.971 8.7357 0.5000 0 0.2333 0.0533 -0.9709 0.233 0.053 -0.971 8.5293 2.3326 0 0.2156 0.1038 -0.9709 0.216 0.104 -0.971 7.9201 4.0734 0 0.1871 0.1492 -0.9709 0.187 0.149 -0.971 6.9390 5.6349 0 0.1492 0.1871 -0.9709 0.149 0.187 -0.971 5.6349 6.9390 0 0.1038 0.2156 -0.9709 0.104 0.216 -0.971 4.0734 7.9201 0 0.0533 0.2333 -0.9709 0.053 0.233 -0.971 2.3326 8.5293 0 0.0000 0.2393 -0.9709 0.000 0.239 -0.971 0.5000 8.7357 0 -0.0533 0.2333 -0.9709 -0.053 0.233 -0.971 -1.3326 8.5293 0 -0.1038 0.2156 -0.9709 -0.104 0.216 -0.971 -3.0734 7.9201 0 -0.1492 0.1871 -0.9709 -0.149 0.187 -0.971 -4.6349 6.9390 0 -0.1871 0.1492 -0.9709 -0.187 0.149 -0.971 -5.9390 5.6349 0 -0.2156 0.1038 -0.9709 -0.216 0.104 -0.971 -6.9201 4.0734 0 -0.2333 0.0533 -0.9709 -0.233 0.053 -0.971 -7.5293 2.3326 0 -0.2393 0.0000 -0.9709 -0.239 0.000 -0.971 -7.7357 0.5000 0 -0.2333 -0.0533 -0.9709 -0.233 -0.053 -0.971 -7.5293 -1.3326 0 -0.2156 -0.1038 -0.9709 -0.216 -0.104 -0.971 -6.9201 -3.0734 0 -0.1871 -0.1492 -0.9709 -0.187 -0.149 -0.971 -5.9390 -4.6349 0 -0.1492 -0.1871 -0.9709 -0.149 -0.187 -0.971 -4.6349 -5.9390 0 -0.1038 -0.2156 -0.9709 -0.104 -0.216 -0.971 -3.0734 -6.9201 0 -0.0533 -0.2333 -0.9709 -0.053 -0.233 -0.971 -1.3326 -7.5293 0 0.0000 -0.2393 -0.9709 0.000 -0.239 -0.971 0.5000 -7.7357 0 0.0533 -0.2333 -0.9709 0.053 -0.233 -0.971 2.3326 -7.5293 0 0.1038 -0.2156 -0.9709 0.104 -0.216 -0.971 4.0734 -6.9201 0 0.1492 -0.1871 -0.9709 0.149 -0.187 -0.971 5.6349 -5.9390 0 0.1871 -0.1492 -0.9709 0.187 -0.149 -0.971 6.9390 -4.6349 0 0.2156 -0.1038 -0.9709 0.216 -0.104 -0.971 7.9201 -3.0734 0 0.2333 -0.0533 -0.9709 0.233 -0.053 -0.971 8.5293 -1.3326 0 0.2393 0.0000 -0.9709 0.239 0.000 -0.971 8.7357 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 0.0000 0.0000 -1.0000 0.000 0.000 -1.000 0.5000 0.5000 0 geomview-1.9.4/data/geom/textured/themi.bez0000644000175000001440000000055510622716742015614 00000000000000appearance { +texturing texture { file geologo.pgm.gz } } # # homogeneous biquadratic Bezier patch for a hemisphere # CBEZ224_ST 1 0 0 1 0 0 1 0 -1 0 0 1 0 1 0 0 0 0 0 0 0 -1 0 0 -1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 # RGBA colors for each corner of the hemisphere patch .3 1 .3 1 1 .3 .3 1 .3 .3 1 1 1 .3 1 1 geomview-1.9.4/data/geom/textured/NASA.pgm.gz0000644000175000001440000000717610622666054015660 00000000000000‹–dKFNASA.pgmí ”ŽÕ€×G 3ÔdnWRf2×O™j¸¡´\¡üDä§¹37”Œ)Éÿ ³¬ôGCÕš."”©H‘1‰Aù)Ì0?5 #RC™ü¥xï|óÍÌ÷íýî½Ï9ï7ݵZ}{µ¢sö9û<ï÷¾çgïý¾=Ð:82¢ô·t1zÔØÄ¡ñ cGˆèß½K—ˆa#?6´]D¯Žý:Þš8,!Á­éiܪu›ˆ–­î(ý³u°+  H@€$  H@€üY%¼~·á«÷¦5ª"ÿ@ÍÆ®+_ý‡¡¿{ñ‰£—¬R9±}˜ÿ½]1uþÆ“ s~ʉm×î@ß,Õò‘7úÙ]ƒ,ŸÞRþã¯;|@ø'®wÖ<ÍB²€U} sçå+–—ɪ™!´ÎDØÙû÷‹«ZùŸ•î¿Ö¨^Mküÿ©´UÒÓœ>ø#Ë&K™'÷& 5’R©¶wöê5¢ýj1«òrönZ¹h䬼=9e²'7mGÚè”ÜÜO“Æ—ËS½¹öíÖø›ÛÔ”?Ý"$+ˆÔ}(Í¡®æb{g"xëW¥n±ô„éàÑ3Píô3üu´µ¤ò4 ³„ÐÈ¥:û‚µ^=ßÒ•dÏØ5ÁÆ™‹¥´_*Çì 3èÎVsï.m|«?ÕA4¥yŸ>~½_8s¿6Vòj«¿•ëž—bOêã[ƒˆþz”Ò<ÜÖùÔï•×”ü mõk¹ÎŽPÆZ&Nô°“Vý^?T2XOÅW׿;û‡½³NFø±ŠŒâtu§€w$ƒ©*þS¸:Žïl«½³ýfüwÚ{ø™ÓýZ“ÿ7ÉàÏ*þb\%ôV+?m†o=fͽ¼r/-üº²ÅÛ ùäÎðˆšâ[Ñ&wïF-~Åøœ!ÿx©³·‘òǦü-l»~Aù¢áÆ™”ý þ“¨vÔÙ¨{ƒ)¾Õ&^Ò¾[‡ÿW…É¿Èü' ˪”_3æ·J3%íUømU&Ÿ”ù?€•]åÎb€²1¾U欤}Tƒ¸Êä'2ÿ\XùŠÜÙ»¾ºÓ«€_VRó'¨L—ùçÁʹ³Ý¾º_úÏßAVo]ü– uE_?úè†Xþó¿!«O¯ þÎüm .f|ð•ÕÏ™óŸ[‘¥ØKü¨býXüíçÿ«UúW*ù‡ üî¶Õ.ƒùïmdÉë¨àMfÏ•~%ÿdØÀí©ý»|„üÒô÷¥Ëõ-,Ùáu’9Àÿ e#>ôŸ7ÁQî²íâ(í/– ¶ó½w»nÇ[˜˜œžYMÐ,;ÚA̦좈¸%®7ãÏô‘&ÿ1û P¥¿ MŒuð/±ì®È÷`ÙÃfüë=…³¥±ñüMÐÅ/ ô`&K:FêÉw°NÄ=‘nÆ_~ØyJŸßwþK¤PñJò¯uÂO9®U¹/Dþ<…=¤àEbÆ ÃHå¡C´à׃]l÷”~¯1cøG‘>Á¥ÿ"Ÿšs°Y’§t,M#ù—9àG+èOébˆÇ_‘÷ð•0¸P÷:û{X=Å-é'Ý~äûiBîAbñÃm{hñ·ÃÀ‡ñki Éÿ®þ2TÓÜRƧÕüÏ A¸8òVŒefú °¸ÅŸá÷ôÇ,,ñ'Q0xæ^ç­Xm®(O‚åÉÔ0O›ã‡’ÓŸÍ¡[× ?Ìñ°îõmQÄ-Ü…Œã´ yž¶ˆƒ—‘ åTfÚÞ ?Ýxžÿ{?Þ\Q~=y£"ïß[Æü;™ßh¢í ê€?/çïïóźºÈˆBŠó„²×Êûü6eÐUƒ9ýlÙç?ïáp4{jBnŠæt lR3WÐÕWºj‡Öto•)˜×±ó¬¸äˆ¦ÔüâÛb5ãÿÛí¾ÇFy'•&ÛÜÅë??˜Ÿòùþm…Ó_˜²yÖ S§NO¨Çm+æ±^‘'ü·@¹¤2vM_o‹ö°&—ZùoÆ#ÑôÀÇAÅÞšùÊœ5ÿ°FlþW%ÿíhäÕ½-êÀšo ƒŸy÷7!·¨ÖUìå~Ì 3ØG¼š¿ÅçÅ3ãYÇçsªé½ÜyNø]çÙÕiÍ /ð0õ4¥›x~—bO~X¿Mp‹ð?QYžÍFywÒüëÏû»°Î“ÅkäúÎE©x`õá`ÔTŸÿñÊòÙÄ#ë‘c4‰pÑï±(/›¡ó?t¹ž×ÍÞuÆ„>QƒÒ@‡Û‘×ð„t‹o ¦Ögášž’ñy×N5¨˜Jk`LT&MYŽzoiÎïßÀ³,EÝyv›ÒKÚmS ?ÿ¾ñ)Âsh6ÿãG;Õþu£éXgšöLf]Ø‘½{ïþ]ÙÙÙy³wädçäŒ[Wú_{Vï,ýwöîlµ?è%ÞÜ'@ñGZé3‘_í•Ê@yx¾‰hXÚXU/xsIrH’ZâÃå;–ïðçžÂ_ÆïÀ/ø‘zXÒ³MÞᑨv´ñx ¥É쇪ç¬AÍD ~|ó67Ïf‰ÿ*Çß&™ƒiw™üýpõQÓM–”è7ïƒ:?j¹d¨½Òˆßö½»—LØJÐ]~ó(P ØWFZÂá–ä·}¤r°é¯ê/þé0“Cd :yÀ„¿‘á×É»9ùGvæâè”ÔÒp”(øQ˜RbdþEþÎöK´w?ö£Ó'üifT¼nÙÙ?üyøÍtņå/8á0 ê{µüã¿ÉЇôOµ£\Å/bèÂZè†_øsð™ö²ÂÚuøò9à·@OÅY’ÿ@å”2“ý¶Ägf—{œ~ì¶ó•sh‹á}ç“©~ðw°m žV™ƒi0ŽøcøµÇUº3ù±ö¹l/Í5Q™[Ô79âÇÉdÞ§/7ß«öç8¥?ÙÍÝú È—ôRº4øqä®BFÛ¾61KÍ_ä ÿ·›‰ä¥5ôñÓóoù¹<}jÍ´Wó§9Â?Sžâ¿x¢ñÑèÞ¼Á®3Cé^"ÏØ‡´ÃÆ'h¥trtó7%—/<Vù¦zl8vé\*N㺉ÌÃkÑOÅq·;¾<ý£XëöLSøCýz‘”< kCÕ1ç¢oñH´ð¿(éáû¹¾Ã)ân=)%µ[rÊ”)Ó†‡ë9ôgí+•¯Š¬ü}e’oýZPxö«}…­}……nyIAAYÒÇ7…ûw=?­ s¢?ÒLÇZº“#%Õ».û8sUïþëÖmÞÀŸŽ\õBJ¥vƒž5CʤF‡»‚ê´ªÖ³Npphï¾1QAAQ1}úö ®‹²$ìS!qô¬%g­Í\:vãÚµ™kºº€$  ÈŸWþò{*F€geomview-1.9.4/data/geom/textured/lunar-t.oogl0000644000175000001440000023136310622716742016253 00000000000000# Hey, Emacs, we're -*-gvcl-*- mode { # World INST geom {appearance { -edge } { LIST # World list { # Model0 INST geom {appearance { -edge } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 0.69999999 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 -0.5 -0.5 -0.5 1 } geom { LIST { } { appearance { material { *diffuse 1.000000 1.000000 1.000000 } } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { NOFF 8 5 11 0 0 0 -0.707107 0 -0.707107 1 0 0 0.707107 0 -0.707107 1 1 0 0.57735 0.57735 -0.57735 0 1 0 -0.57735 0.57735 -0.57735 0 0 1 -0.707107 0 0.707107 1 0 1 0.707107 0 0.707107 1 1 1 0.57735 0.57735 0.57735 0 1 1 -0.57735 0.57735 0.57735 4 3 2 1 0 4 4 5 6 7 4 2 3 7 6 4 0 4 7 3 4 1 2 6 5 } { appearance { +texturing texture { file NASA.pgm.gz clamp st apply blend background 1 0 0 1 transform 2 0 0 0 0 2 0 0 0 0 1 0 -.5 -.5 0 1 } shading smooth } = NUMESH 2 2 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0.34999999 0.34999999 -0.34999999 1 } geom { INST transform { 0.19909699 -0.800915 -0.564722 0 -0.800915 0.19909699 -0.564722 0 0.564722 0.564722 -0.601816 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.15000001 0 0 0 0 0.15000001 0 0 0 0 0.15000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { -0.86602598 0.49999899 0 0 -0.49999899 -0.86602598 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.050000001 0 0 0 0 0.050000001 0 0 0 0 0.050000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 0.46947101 0.88294798 0 0 -0.88294798 0.46947101 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1.2 1 } geom { INST transform { -1 0 -1.34641e-06 0 0 1 0 0 1.34641e-06 0 -1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.2 0 0 0 0 0.2 0 0 0 0 0.2 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { material { *diffuse 1.000000 1.000000 1.000000 } } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { CBEZ224 1 0 0 1 0 0 1 0 -1 0 0 1 0 1 0 0 0 0 0 0 0 -1 0 0 -1 0 0 1 0 0 1 0 1 0 0 1 0.3 1 0.3 1 1 0.3 0.3 1 0.3 0.3 1 1 1 0.3 1 1 } } } } } } } } } } } } } } } } } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0.34999999 -0.34999999 -0.34999999 1 } geom { INST transform { 0.14033499 0.85967499 -0.49119899 0 0.85967499 0.14033499 0.49119899 0 0.49119899 -0.49119899 -0.71934098 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.15000001 0 0 0 0 0.15000001 0 0 0 0 0.15000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.78801101 0.61566198 0 0 -0.61566198 0.78801101 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.050000001 0 0 0 0 0.050000001 0 0 0 0 0.050000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 0.86602497 0.5 0 0 -0.5 0.86602497 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1.2 1 } geom { INST transform { -1 0 -1.34641e-06 0 0 1 0 0 1.34641e-06 0 -1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.2 0 0 0 0 0.2 0 0 0 0 0.2 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { material { *diffuse 1.000000 1.000000 1.000000 } } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { CBEZ224 1 0 0 1 0 0 1 0 -1 0 0 1 0 1 0 0 0 0 0 0 0 -1 0 0 -1 0 0 1 0 0 1 0 1 0 0 1 0.3 1 0.3 1 1 0.3 0.3 1 0.3 0.3 1 1 1 0.3 1 1 } } } } } } } } } } } } } } } } } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 -0.34999999 -0.34999999 -0.34999999 1 } geom { INST transform { 0.265268 -0.73473901 0.62434 0 -0.73473901 0.265268 0.62434 0 -0.62434 -0.62434 -0.46947199 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.15000001 0 0 0 0 0.15000001 0 0 0 0 0.15000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.66913003 -0.74314499 0 0 0.74314499 0.66913003 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.050000001 0 0 0 0 0.050000001 0 0 0 0 0.050000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 0.46947101 0.88294798 0 0 -0.88294798 0.46947101 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1.2 1 } geom { INST transform { -1 0 -1.34641e-06 0 0 1 0 0 1.34641e-06 0 -1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.2 0 0 0 0 0.2 0 0 0 0 0.2 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { material { *diffuse 1.000000 1.000000 1.000000 } } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { CBEZ224 1 0 0 1 0 0 1 0 -1 0 0 1 0 1 0 0 0 0 0 0 0 -1 0 0 -1 0 0 1 0 0 1 0 1 0 0 1 0.3 1 0.3 1 1 0.3 0.3 1 0.3 0.3 1 1 1 0.3 1 1 } } } } } } } } } } } } } } } } } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 -0.34999999 0.34999999 -0.34999999 1 } geom { INST transform { 0.13432799 0.86567998 0.48224699 0 0.86567998 0.13432799 -0.48224699 0 -0.48224699 0.48224699 -0.731354 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.15000001 0 0 0 0 0.15000001 0 0 0 0 0.15000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { -0.68199903 -0.73135298 0 0 0.73135298 -0.68199903 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.050000001 0 0 0 0 0.050000001 0 0 0 0 0.050000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { SPHERE 1 0 0 0} } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 } geom { INST transform { 1 0 0 0 0 0.89100599 0.453991 0 0 -0.453991 0.89100599 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.039999999 0 0 0 0 0.039999999 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { shading smooth } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { OFF 80 40 118 1 0 0 1 0 1 0.987688 0.156434 0 0.987688 0.156434 1 0.951057 0.309017 0 0.951057 0.309017 1 0.891007 0.45399 0 0.891007 0.45399 1 0.809017 0.587785 0 0.809017 0.587785 1 0.707107 0.707107 0 0.707107 0.707107 1 0.587785 0.809017 0 0.587785 0.809017 1 0.45399 0.891007 0 0.45399 0.891007 1 0.309017 0.951057 0 0.309017 0.951057 1 0.156434 0.987688 0 0.156434 0.987688 1 0 1 0 0 1 1 -0.156434 0.987688 0 -0.156434 0.987688 1 -0.309017 0.951057 0 -0.309017 0.951057 1 -0.45399 0.891007 0 -0.45399 0.891007 1 -0.587785 0.809017 0 -0.587785 0.809017 1 -0.707107 0.707107 0 -0.707107 0.707107 1 -0.809017 0.587785 0 -0.809017 0.587785 1 -0.891007 0.45399 0 -0.891007 0.45399 1 -0.951057 0.309017 0 -0.951057 0.309017 1 -0.987688 0.156434 0 -0.987688 0.156434 1 -1 0 0 -1 0 1 -0.987688 -0.156434 0 -0.987688 -0.156434 1 -0.951057 -0.309017 0 -0.951057 -0.309017 1 -0.891007 -0.45399 0 -0.891007 -0.45399 1 -0.809017 -0.587785 0 -0.809017 -0.587785 1 -0.707107 -0.707107 0 -0.707107 -0.707107 1 -0.587785 -0.809017 0 -0.587785 -0.809017 1 -0.45399 -0.891007 0 -0.45399 -0.891007 1 -0.309017 -0.951057 0 -0.309017 -0.951057 1 -0.156434 -0.987688 0 -0.156434 -0.987688 1 0 -1 0 0 -1 1 0.156434 -0.987688 0 0.156434 -0.987688 1 0.309017 -0.951057 0 0.309017 -0.951057 1 0.45399 -0.891007 0 0.45399 -0.891007 1 0.587785 -0.809017 0 0.587785 -0.809017 1 0.707107 -0.707107 0 0.707107 -0.707107 1 0.809017 -0.587785 0 0.809017 -0.587785 1 0.891007 -0.45399 0 0.891007 -0.45399 1 0.951057 -0.309017 0 0.951057 -0.309017 1 0.987688 -0.156434 0 0.987688 -0.156434 1 4 0 1 3 2 4 2 3 5 4 4 4 5 7 6 4 6 7 9 8 4 8 9 11 10 4 10 11 13 12 4 12 13 15 14 4 14 15 17 16 4 16 17 19 18 4 18 19 21 20 4 20 21 23 22 4 22 23 25 24 4 24 25 27 26 4 26 27 29 28 4 28 29 31 30 4 30 31 33 32 4 32 33 35 34 4 34 35 37 36 4 36 37 39 38 4 38 39 41 40 4 40 41 43 42 4 42 43 45 44 4 44 45 47 46 4 46 47 49 48 4 48 49 51 50 4 50 51 53 52 4 52 53 55 54 4 54 55 57 56 4 56 57 59 58 4 58 59 61 60 4 60 61 63 62 4 62 63 65 64 4 64 65 67 66 4 66 67 69 68 4 68 69 71 70 4 70 71 73 72 4 72 73 75 74 4 74 75 77 76 4 76 77 79 78 4 78 79 1 0 } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1.2 1 } geom { INST transform { -1 0 -1.34641e-06 0 0 1 0 0 1.34641e-06 0 -1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.2 0 0 0 0 0.2 0 0 0 0 0.2 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { material { *diffuse 1.000000 1.000000 1.000000 } } = INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { CBEZ224 1 0 0 1 0 0 1 0 -1 0 0 1 0 1 0 0 0 0 0 0 0 -1 0 0 -1 0 0 1 0 0 1 0 1 0 0 1 0.3 1 0.3 1 1 0.3 0.3 1 0.3 0.3 1 1 1 0.3 1 1 } } } } } } } } } } } } } } } } } } } } } } } } } } } { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.69999999 1 } geom { INST transform { 1 0 0 0 0 -6.7320502e-07 1 0 0 -1 -6.7320502e-07 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { LIST { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { INST transform { 0.40000001 0 0 0 0 0.40000001 0 0 0 0 0.40000001 0 0 0 0 1 } geom { INST transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } geom { LIST { } { appearance { * -evert +texturing shading smooth texture { clamp st file geologo.pgm.gz transform 1.5 0 0 0 0 1.5 0 0 0 0 1 0 -.25 -.25 0 1 } } = UMESH 29 14 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0 0 1 0.5 0.5 0 0.2393 0 0.9709 0.6214 0.5 0 0.2333 0.0533 0.9709 0.6184 0.527 0 0.2156 0.1038 0.9709 0.6094 0.5527 0 0.1871 0.1492 0.9709 0.5949 0.5757 0 0.1492 0.1871 0.9709 0.5757 0.5949 0 0.1038 0.2156 0.9709 0.5527 0.6094 0 0.0533 0.2333 0.9709 0.527 0.6184 0 0 0.2393 0.9709 0.5 0.6214 0 -0.0533 0.2333 0.9709 0.473 0.6184 0 -0.1038 0.2156 0.9709 0.4473 0.6094 0 -0.1492 0.1871 0.9709 0.4243 0.5949 0 -0.1871 0.1492 0.9709 0.4051 0.5757 0 -0.2156 0.1038 0.9709 0.3906 0.5527 0 -0.2333 0.0533 0.9709 0.3816 0.527 0 -0.2393 0 0.9709 0.3786 0.5 0 -0.2333 -0.0533 0.9709 0.3816 0.473 0 -0.2156 -0.1038 0.9709 0.3906 0.4473 0 -0.1871 -0.1492 0.9709 0.4051 0.4243 0 -0.1492 -0.1871 0.9709 0.4243 0.4051 0 -0.1038 -0.2156 0.9709 0.4473 0.3906 0 -0.0533 -0.2333 0.9709 0.473 0.3816 0 0 -0.2393 0.9709 0.5 0.3786 0 0.0533 -0.2333 0.9709 0.527 0.3816 0 0.1038 -0.2156 0.9709 0.5527 0.3906 0 0.1492 -0.1871 0.9709 0.5757 0.4051 0 0.1871 -0.1492 0.9709 0.5949 0.4243 0 0.2156 -0.1038 0.9709 0.6094 0.4473 0 0.2333 -0.0533 0.9709 0.6184 0.473 0 0.2393 0 0.9709 0.6214 0.5 0 0.4647 0 0.8855 0.7465 0.5 0 0.4531 0.1034 0.8855 0.7403 0.5548 0 0.4187 0.2016 0.8855 0.7221 0.6069 0 0.3633 0.2898 0.8855 0.6927 0.6537 0 0.2898 0.3633 0.8855 0.6537 0.6927 0 0.2016 0.4187 0.8855 0.6069 0.7221 0 0.1034 0.4531 0.8855 0.5548 0.7403 0 0 0.4647 0.8855 0.5 0.7465 0 -0.1034 0.4531 0.8855 0.4452 0.7403 0 -0.2016 0.4187 0.8855 0.3931 0.7221 0 -0.2898 0.3633 0.8855 0.3463 0.6927 0 -0.3633 0.2898 0.8855 0.3073 0.6537 0 -0.4187 0.2016 0.8855 0.2779 0.6069 0 -0.4531 0.1034 0.8855 0.2597 0.5548 0 -0.4647 0 0.8855 0.2535 0.5 0 -0.4531 -0.1034 0.8855 0.2597 0.4452 0 -0.4187 -0.2016 0.8855 0.2779 0.3931 0 -0.3633 -0.2898 0.8855 0.3073 0.3463 0 -0.2898 -0.3633 0.8855 0.3463 0.3073 0 -0.2016 -0.4187 0.8855 0.3931 0.2779 0 -0.1034 -0.4531 0.8855 0.4452 0.2597 0 0 -0.4647 0.8855 0.5 0.2535 0 0.1034 -0.4531 0.8855 0.5548 0.2597 0 0.2016 -0.4187 0.8855 0.6069 0.2779 0 0.2898 -0.3633 0.8855 0.6537 0.3073 0 0.3633 -0.2898 0.8855 0.6927 0.3463 0 0.4187 -0.2016 0.8855 0.7221 0.3931 0 0.4531 -0.1034 0.8855 0.7403 0.4452 0 0.4647 0 0.8855 0.7465 0.5 0 0.6631 0 0.7485 0.8792 0.5 0 0.6465 0.1476 0.7485 0.8697 0.5844 0 0.5975 0.2877 0.7485 0.8417 0.6646 0 0.5185 0.4135 0.7485 0.7965 0.7365 0 0.4135 0.5185 0.7485 0.7365 0.7965 0 0.2877 0.5975 0.7485 0.6646 0.8417 0 0.1476 0.6465 0.7485 0.5844 0.8697 0 0 0.6631 0.7485 0.5 0.8792 0 -0.1476 0.6465 0.7485 0.4156 0.8697 0 -0.2877 0.5975 0.7485 0.3354 0.8417 0 -0.4135 0.5185 0.7485 0.2635 0.7965 0 -0.5185 0.4135 0.7485 0.2035 0.7365 0 -0.5975 0.2877 0.7485 0.1583 0.6646 0 -0.6465 0.1476 0.7485 0.1303 0.5844 0 -0.6631 0 0.7485 0.1208 0.5 0 -0.6465 -0.1476 0.7485 0.1303 0.4156 0 -0.5975 -0.2877 0.7485 0.1583 0.3354 0 -0.5185 -0.4135 0.7485 0.2035 0.2635 0 -0.4135 -0.5185 0.7485 0.2635 0.2035 0 -0.2877 -0.5975 0.7485 0.3354 0.1583 0 -0.1476 -0.6465 0.7485 0.4156 0.1303 0 0 -0.6631 0.7485 0.5 0.1208 0 0.1476 -0.6465 0.7485 0.5844 0.1303 0 0.2877 -0.5975 0.7485 0.6646 0.1583 0 0.4135 -0.5185 0.7485 0.7365 0.2035 0 0.5185 -0.4135 0.7485 0.7965 0.2635 0 0.5975 -0.2877 0.7485 0.8417 0.3354 0 0.6465 -0.1476 0.7485 0.8697 0.4156 0 0.6631 0 0.7485 0.8792 0.5 0 0.823 0 0.5681 1.0248 0.5 0 0.8023 0.1831 0.5681 1.0117 0.6168 0 0.7415 0.3571 0.5681 0.9729 0.7277 0 0.6434 0.5131 0.5681 0.9103 0.8272 0 0.5131 0.6434 0.5681 0.8272 0.9103 0 0.3571 0.7415 0.5681 0.7277 0.9729 0 0.1831 0.8023 0.5681 0.6168 1.0117 0 0 0.823 0.5681 0.5 1.0248 0 -0.1831 0.8023 0.5681 0.3832 1.0117 0 -0.3571 0.7415 0.5681 0.2723 0.9729 0 -0.5131 0.6434 0.5681 0.1728 0.9103 0 -0.6434 0.5131 0.5681 0.0897 0.8272 0 -0.7415 0.3571 0.5681 0.0271 0.7277 0 -0.8023 0.1831 0.5681 -0.0117 0.6168 0 -0.823 0 0.5681 -0.0248 0.5 0 -0.8023 -0.1831 0.5681 -0.0117 0.3832 0 -0.7415 -0.3571 0.5681 0.0271 0.2723 0 -0.6434 -0.5131 0.5681 0.0897 0.1728 0 -0.5131 -0.6434 0.5681 0.1728 0.0897 0 -0.3571 -0.7415 0.5681 0.2723 0.0271 0 -0.1831 -0.8023 0.5681 0.3832 -0.0117 0 0 -0.823 0.5681 0.5 -0.0248 0 0.1831 -0.8023 0.5681 0.6168 -0.0117 0 0.3571 -0.7415 0.5681 0.7277 0.0271 0 0.5131 -0.6434 0.5681 0.8272 0.0897 0 0.6434 -0.5131 0.5681 0.9103 0.1728 0 0.7415 -0.3571 0.5681 0.9729 0.2723 0 0.8023 -0.1831 0.5681 1.0117 0.3832 0 0.823 0 0.5681 1.0248 0.5 0 0.935 0 0.3546 1.1903 0.5 0 0.9116 0.2081 0.3546 1.1729 0.6536 0 0.8424 0.4057 0.3546 1.1219 0.7995 0 0.731 0.583 0.3546 1.0397 0.9304 0 0.583 0.731 0.3546 0.9304 1.0397 0 0.4057 0.8424 0.3546 0.7995 1.1219 0 0.2081 0.9116 0.3546 0.6536 1.1729 0 0 0.935 0.3546 0.5 1.1903 0 -0.2081 0.9116 0.3546 0.3464 1.1729 0 -0.4057 0.8424 0.3546 0.2005 1.1219 0 -0.583 0.731 0.3546 0.0696 1.0397 0 -0.731 0.583 0.3546 -0.0397 0.9304 0 -0.8424 0.4057 0.3546 -0.1219 0.7995 0 -0.9116 0.2081 0.3546 -0.1729 0.6536 0 -0.935 0 0.3546 -0.1903 0.5 0 -0.9116 -0.2081 0.3546 -0.1729 0.3464 0 -0.8424 -0.4057 0.3546 -0.1219 0.2005 0 -0.731 -0.583 0.3546 -0.0397 0.0696 0 -0.583 -0.731 0.3546 0.0696 -0.0397 0 -0.4057 -0.8424 0.3546 0.2005 -0.1219 0 -0.2081 -0.9116 0.3546 0.3464 -0.1729 0 0 -0.935 0.3546 0.5 -0.1903 0 0.2081 -0.9116 0.3546 0.6536 -0.1729 0 0.4057 -0.8424 0.3546 0.7995 -0.1219 0 0.583 -0.731 0.3546 0.9304 -0.0397 0 0.731 -0.583 0.3546 1.0397 0.0696 0 0.8424 -0.4057 0.3546 1.1219 0.2005 0 0.9116 -0.2081 0.3546 1.1729 0.3464 0 0.935 0 0.3546 1.1903 0.5 0 0.9927 0 0.1205 1.3859 0.5 0 0.9678 0.2209 0.1205 1.3637 0.6971 0 0.8944 0.4307 0.1205 1.2982 0.8844 0 0.7761 0.6189 0.1205 1.1926 1.0524 0 0.6189 0.7761 0.1205 1.0524 1.1926 0 0.4307 0.8944 0.1205 0.8844 1.2982 0 0.2209 0.9678 0.1205 0.6971 1.3637 0 0 0.9927 0.1205 0.5 1.3859 0 -0.2209 0.9678 0.1205 0.3029 1.3637 0 -0.4307 0.8944 0.1205 0.1156 1.2982 0 -0.6189 0.7761 0.1205 -0.0524 1.1926 0 -0.7761 0.6189 0.1205 -0.1926 1.0524 0 -0.8944 0.4307 0.1205 -0.2982 0.8844 0 -0.9678 0.2209 0.1205 -0.3637 0.6971 0 -0.9927 0 0.1205 -0.3859 0.5 0 -0.9678 -0.2209 0.1205 -0.3637 0.3029 0 -0.8944 -0.4307 0.1205 -0.2982 0.1156 0 -0.7761 -0.6189 0.1205 -0.1926 -0.0524 0 -0.6189 -0.7761 0.1205 -0.0524 -0.1926 0 -0.4307 -0.8944 0.1205 0.1156 -0.2982 0 -0.2209 -0.9678 0.1205 0.3029 -0.3637 0 0 -0.9927 0.1205 0.5 -0.3859 0 0.2209 -0.9678 0.1205 0.6971 -0.3637 0 0.4307 -0.8944 0.1205 0.8844 -0.2982 0 0.6189 -0.7761 0.1205 1.0524 -0.1926 0 0.7761 -0.6189 0.1205 1.1926 -0.0524 0 0.8944 -0.4307 0.1205 1.2982 0.1156 0 0.9678 -0.2209 0.1205 1.3637 0.3029 0 0.9927 0 0.1205 1.3859 0.5 0 0.9927 0 -0.1205 1.6288 0.5 0 0.9678 0.2209 -0.1205 1.6005 0.7512 0 0.8944 0.4307 -0.1205 1.517 0.9898 0 0.7761 0.6189 -0.1205 1.3825 1.2038 0 0.6189 0.7761 -0.1205 1.2038 1.3825 0 0.4307 0.8944 -0.1205 0.9898 1.517 0 0.2209 0.9678 -0.1205 0.7512 1.6005 0 0 0.9927 -0.1205 0.5 1.6288 0 -0.2209 0.9678 -0.1205 0.2488 1.6005 0 -0.4307 0.8944 -0.1205 0.0102 1.517 0 -0.6189 0.7761 -0.1205 -0.2038 1.3825 0 -0.7761 0.6189 -0.1205 -0.3825 1.2038 0 -0.8944 0.4307 -0.1205 -0.517 0.9898 0 -0.9678 0.2209 -0.1205 -0.6005 0.7512 0 -0.9927 0 -0.1205 -0.6288 0.5 0 -0.9678 -0.2209 -0.1205 -0.6005 0.2488 0 -0.8944 -0.4307 -0.1205 -0.517 0.0102 0 -0.7761 -0.6189 -0.1205 -0.3825 -0.2038 0 -0.6189 -0.7761 -0.1205 -0.2038 -0.3825 0 -0.4307 -0.8944 -0.1205 0.0102 -0.517 0 -0.2209 -0.9678 -0.1205 0.2488 -0.6005 0 0 -0.9927 -0.1205 0.5 -0.6288 0 0.2209 -0.9678 -0.1205 0.7512 -0.6005 0 0.4307 -0.8944 -0.1205 0.9898 -0.517 0 0.6189 -0.7761 -0.1205 1.2038 -0.3825 0 0.7761 -0.6189 -0.1205 1.3825 -0.2038 0 0.8944 -0.4307 -0.1205 1.517 0.0102 0 0.9678 -0.2209 -0.1205 1.6005 0.2488 0 0.9927 0 -0.1205 1.6288 0.5 0 0.935 0 -0.3546 1.9488 0.5 0 0.9116 0.2081 -0.3546 1.9124 0.8224 0 0.8424 0.4057 -0.3546 1.8053 1.1286 0 0.731 0.583 -0.3546 1.6327 1.4033 0 0.583 0.731 -0.3546 1.4033 1.6327 0 0.4057 0.8424 -0.3546 1.1286 1.8053 0 0.2081 0.9116 -0.3546 0.8224 1.9124 0 0 0.935 -0.3546 0.5 1.9488 0 -0.2081 0.9116 -0.3546 0.1776 1.9124 0 -0.4057 0.8424 -0.3546 -0.1286 1.8053 0 -0.583 0.731 -0.3546 -0.4033 1.6327 0 -0.731 0.583 -0.3546 -0.6327 1.4033 0 -0.8424 0.4057 -0.3546 -0.8053 1.1286 0 -0.9116 0.2081 -0.3546 -0.9124 0.8224 0 -0.935 0 -0.3546 -0.9488 0.5 0 -0.9116 -0.2081 -0.3546 -0.9124 0.1776 0 -0.8424 -0.4057 -0.3546 -0.8053 -0.1286 0 -0.731 -0.583 -0.3546 -0.6327 -0.4033 0 -0.583 -0.731 -0.3546 -0.4033 -0.6327 0 -0.4057 -0.8424 -0.3546 -0.1286 -0.8053 0 -0.2081 -0.9116 -0.3546 0.1776 -0.9124 0 0 -0.935 -0.3546 0.5 -0.9488 0 0.2081 -0.9116 -0.3546 0.8224 -0.9124 0 0.4057 -0.8424 -0.3546 1.1286 -0.8053 0 0.583 -0.731 -0.3546 1.4033 -0.6327 0 0.731 -0.583 -0.3546 1.6327 -0.4033 0 0.8424 -0.4057 -0.3546 1.8053 -0.1286 0 0.9116 -0.2081 -0.3546 1.9124 0.1776 0 0.935 0 -0.3546 1.9488 0.5 0 0.823 0 -0.5681 2.4053 0.5 0 0.8023 0.1831 -0.5681 2.3576 0.924 0 0.7415 0.3571 -0.5681 2.2167 1.3267 0 0.6434 0.5131 -0.5681 1.9897 1.688 0 0.5131 0.6434 -0.5681 1.688 1.9897 0 0.3571 0.7415 -0.5681 1.3267 2.2167 0 0.1831 0.8023 -0.5681 0.924 2.3576 0 0 0.823 -0.5681 0.5 2.4053 0 -0.1831 0.8023 -0.5681 0.076 2.3576 0 -0.3571 0.7415 -0.5681 -0.3267 2.2167 0 -0.5131 0.6434 -0.5681 -0.688 1.9897 0 -0.6434 0.5131 -0.5681 -0.9897 1.688 0 -0.7415 0.3571 -0.5681 -1.2167 1.3267 0 -0.8023 0.1831 -0.5681 -1.3576 0.924 0 -0.823 0 -0.5681 -1.4053 0.5 0 -0.8023 -0.1831 -0.5681 -1.3576 0.076 0 -0.7415 -0.3571 -0.5681 -1.2167 -0.3267 0 -0.6434 -0.5131 -0.5681 -0.9897 -0.688 0 -0.5131 -0.6434 -0.5681 -0.688 -0.9897 0 -0.3571 -0.7415 -0.5681 -0.3267 -1.2167 0 -0.1831 -0.8023 -0.5681 0.076 -1.3576 0 0 -0.823 -0.5681 0.5 -1.4053 0 0.1831 -0.8023 -0.5681 0.924 -1.3576 0 0.3571 -0.7415 -0.5681 1.3267 -1.2167 0 0.5131 -0.6434 -0.5681 1.688 -0.9897 0 0.6434 -0.5131 -0.5681 1.9897 -0.688 0 0.7415 -0.3571 -0.5681 2.2167 -0.3267 0 0.8023 -0.1831 -0.5681 2.3576 0.076 0 0.823 0 -0.5681 2.4053 0.5 0 0.6631 0 -0.7485 3.1368 0.5 0 0.6465 0.1476 -0.7485 3.0707 1.0867 0 0.5975 0.2877 -0.7485 2.8757 1.6441 0 0.5185 0.4135 -0.7485 2.5615 2.144 0 0.4135 0.5185 -0.7485 2.144 2.5615 0 0.2877 0.5975 -0.7485 1.6441 2.8757 0 0.1476 0.6465 -0.7485 1.0867 3.0707 0 0 0.6631 -0.7485 0.5 3.1368 0 -0.1476 0.6465 -0.7485 -0.0867 3.0707 0 -0.2877 0.5975 -0.7485 -0.6441 2.8757 0 -0.4135 0.5185 -0.7485 -1.144 2.5615 0 -0.5185 0.4135 -0.7485 -1.5615 2.144 0 -0.5975 0.2877 -0.7485 -1.8757 1.6441 0 -0.6465 0.1476 -0.7485 -2.0707 1.0867 0 -0.6631 0 -0.7485 -2.1368 0.5 0 -0.6465 -0.1476 -0.7485 -2.0707 -0.0867 0 -0.5975 -0.2877 -0.7485 -1.8757 -0.6441 0 -0.5185 -0.4135 -0.7485 -1.5615 -1.144 0 -0.4135 -0.5185 -0.7485 -1.144 -1.5615 0 -0.2877 -0.5975 -0.7485 -0.6441 -1.8757 0 -0.1476 -0.6465 -0.7485 -0.0867 -2.0707 0 0 -0.6631 -0.7485 0.5 -2.1368 0 0.1476 -0.6465 -0.7485 1.0867 -2.0707 0 0.2877 -0.5975 -0.7485 1.6441 -1.8757 0 0.4135 -0.5185 -0.7485 2.144 -1.5615 0 0.5185 -0.4135 -0.7485 2.5615 -1.144 0 0.5975 -0.2877 -0.7485 2.8757 -0.6441 0 0.6465 -0.1476 -0.7485 3.0707 -0.0867 0 0.6631 0 -0.7485 3.1368 0.5 0 0.4647 0 -0.8855 4.5572 0.5 0 0.4531 0.1034 -0.8855 4.4554 1.4028 0 0.4187 0.2016 -0.8855 4.1554 2.2603 0 0.3633 0.2898 -0.8855 3.672 3.0296 0 0.2898 0.3633 -0.8855 3.0296 3.672 0 0.2016 0.4187 -0.8855 2.2603 4.1554 0 0.1034 0.4531 -0.8855 1.4028 4.4554 0 0 0.4647 -0.8855 0.5 4.5572 0 -0.1034 0.4531 -0.8855 -0.4028 4.4554 0 -0.2016 0.4187 -0.8855 -1.2603 4.1554 0 -0.2898 0.3633 -0.8855 -2.0296 3.672 0 -0.3633 0.2898 -0.8855 -2.672 3.0296 0 -0.4187 0.2016 -0.8855 -3.1554 2.2603 0 -0.4531 0.1034 -0.8855 -3.4554 1.4028 0 -0.4647 0 -0.8855 -3.5572 0.5 0 -0.4531 -0.1034 -0.8855 -3.4554 -0.4028 0 -0.4187 -0.2016 -0.8855 -3.1554 -1.2603 0 -0.3633 -0.2898 -0.8855 -2.672 -2.0296 0 -0.2898 -0.3633 -0.8855 -2.0296 -2.672 0 -0.2016 -0.4187 -0.8855 -1.2603 -3.1554 0 -0.1034 -0.4531 -0.8855 -0.4028 -3.4554 0 0 -0.4647 -0.8855 0.5 -3.5572 0 0.1034 -0.4531 -0.8855 1.4028 -3.4554 0 0.2016 -0.4187 -0.8855 2.2603 -3.1554 0 0.2898 -0.3633 -0.8855 3.0296 -2.672 0 0.3633 -0.2898 -0.8855 3.672 -2.0296 0 0.4187 -0.2016 -0.8855 4.1554 -1.2603 0 0.4531 -0.1034 -0.8855 4.4554 -0.4028 0 0.4647 0 -0.8855 4.5572 0.5 0 0.2393 0 -0.9709 8.7357 0.5 0 0.2333 0.0533 -0.9709 8.5293 2.3326 0 0.2156 0.1038 -0.9709 7.9201 4.0734 0 0.1871 0.1492 -0.9709 6.939 5.6349 0 0.1492 0.1871 -0.9709 5.6349 6.939 0 0.1038 0.2156 -0.9709 4.0734 7.9201 0 0.0533 0.2333 -0.9709 2.3326 8.5293 0 0 0.2393 -0.9709 0.5 8.7357 0 -0.0533 0.2333 -0.9709 -1.3326 8.5293 0 -0.1038 0.2156 -0.9709 -3.0734 7.9201 0 -0.1492 0.1871 -0.9709 -4.6349 6.939 0 -0.1871 0.1492 -0.9709 -5.939 5.6349 0 -0.2156 0.1038 -0.9709 -6.9201 4.0734 0 -0.2333 0.0533 -0.9709 -7.5293 2.3326 0 -0.2393 0 -0.9709 -7.7357 0.5 0 -0.2333 -0.0533 -0.9709 -7.5293 -1.3326 0 -0.2156 -0.1038 -0.9709 -6.9201 -3.0734 0 -0.1871 -0.1492 -0.9709 -5.939 -4.6349 0 -0.1492 -0.1871 -0.9709 -4.6349 -5.939 0 -0.1038 -0.2156 -0.9709 -3.0734 -6.9201 0 -0.0533 -0.2333 -0.9709 -1.3326 -7.5293 0 0 -0.2393 -0.9709 0.5 -7.7357 0 0.0533 -0.2333 -0.9709 2.3326 -7.5293 0 0.1038 -0.2156 -0.9709 4.0734 -6.9201 0 0.1492 -0.1871 -0.9709 5.6349 -5.939 0 0.1871 -0.1492 -0.9709 6.939 -4.6349 0 0.2156 -0.1038 -0.9709 7.9201 -3.0734 0 0.2333 -0.0533 -0.9709 8.5293 -1.3326 0 0.2393 0 -0.9709 8.7357 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 0 0 -1 0.5 0.5 0 } } } } } } } } } } } } } } } } } } } } } } } # end (geom and INST) Model0 } #end of World List } } # end of World and INST geomview-1.9.4/data/geom/textured/rabbits.ppm.gz0000644000175000001440000024000410622716742016562 00000000000000‹X®14ý›ɶ&Œf•XJIIAÉ Æbf&»Ì m¦"3wÛm..CÃî}Ι33ß<÷þÉéù®]­’…±Öz!2båᮤkYÖì½µÕ×®Z×7VïYÇf§¦¬[÷.߸Ögm\þå—[î×ܺ~=Ùìì±ÚmɶÎΤeÙEÇ¡›XyÇñÃÕ,×É{N%çUÝ\!ç”*[kèKÅ*n‡¨¤(®|EÂJÚÀ‘€–9}‚$YA‚¢¦`ãR¨‰ÜîÀÃ=ätpì>7*%$O€DA&̺úV),"™BÁ†Àƒ‡&%.&6’¨Àëb–½ ˆ)$UY•PWånU™¨â¹¼ÞcÐ —NB:æÐmd¦@fÔKÅŠ„û=¼T%g:Ôi-TÀÙ†rµI©“£º|¬†u8ä¹’Ñ/kÓ*#¨¤œŒ]1øvU”+€yx"¯¶¹Ã:0j'¤]Sº)ìÒP‡¡”5hÄÁÓp‡IlÚañ~mãBãÆ|áØœd6?œÓœ1jŽ®iUßîm !–é–Ë~ï8™˜ÖrÝpT¯Í6Êž_ÓŽžlÎ×ýšÑÙîÕÊ%«hE»c±~æd½«^ÀMmRÞNèX)P­æØž©Ú-ù†ïÔ{ã'{úúªÄ7A‡ç7|ŒTËÖº F³h7ê^G^ïëô:‹šå«–¡ê€ Ù`À‚=&éTQSÅe„›wÒÉÆ_F–frdBÇ]YУÁ^Øt˜¨E^e™W2,7 ÜKHQ].šöµ!“%V¡jg%’ʺ@¶²YœÎÒ¸PB¸(#-£€¤$QE5+i:„ªäbXðèPA©è]n 2’Ó&Ëêá^z¼B»‰2X!½ÕSAÍe2@I7$=¶Ú›·û}<âã¾ ë"cyÜî‚Î",ÀF"g‚¢Š*2H6%%Kíp@“")¾(øjÖÅB‡‰F(é$¨MSêæ(ò4˜ÓH]ÃM4m¹ßÕ&jtÐÃÝˆÖ R˜%!ŒUl¸ª %¡HDÖu仨0U *2”¡¡jŽ3Ø6tGÓÓ¤SÕÐU°ÂSdI6mªc”Ž¥‘€‰@$¤Ã265[Ó-D½Ša»†¯›eÇš]PËÏ7\Y%ª…ý<­8jÓ×jñE1¯P#«ú î4Èù~ûÌ`a¦Yê’ŒºmŒ¸ú°Cû5µÇD½ž*ãu|ªÇ¾=]»4P8Ûë›°¯ŽåÎtæÏwŽ4½)ß\èp : ÎщʃÓ‡ŠU 1` `•¨)PÍB9 ¨¤ŽwY]G“B8ËÄÓÙN´Š©¸¥“‰”±•¡Ä/B ¨l̃ñDmH©%"=#˱,Žˆ8&É(%e*fTA€f± Rd"fä8Ȇ3ˆÁDReùà jLD)EHˆb‹˜å²é–4IZR‘ÓB:!“$€­YSuA1dhìhØ¥H –€MqÕ Oks†…›\sL± ÄXp*‘®d€J4ª¬xKšiBÌ AH5ia¸6ÝV¯ZElÓ-– †é™VÝÕʦáZZ±Ï/µçdE²LÒ]¶›yÃ6¨“§–IKEg¾·Þf[–ov´y]Žë *AÈ%¤á¢É)ýĈ5\´†;ÍÉvûÈxýPi¢Ãšîµæ†¹!olÐi+õ¸ê€AËTó,Ú^!S5:]§G:íź7XRë.éi˜£Ãîl¿3ßáNÏ”—gëËU«Ë•óT®j¥Œ †!bƒ–S|šˆQKËïôhÅÇÅâáL,$F¸x+M´òÙLF”d> cáL*Ì i€)ËFTÕ—Á¸ "jDTÓiM‚¸#¢ã‘l4–ˆGb±P2R¤(‚¼(óé4ŸÎ&À‹HY5(@VNK Âˆ H‚­ˆíhWÅ<{ z— ñUê@d 8/ã6ƒô{´ÍÓü<‹„Î0ÒÄT)I#AQ€ˆ£3.–‰b(–ch.‹³Â¢ïXúôlma¢Þ™g±ÀÝž1PÀMöuÚtÔ’ccM=G±&)E¦KM_õMT&°iIÓmàì´9X"Õ¢6ØcÍöäg,¯Ã¤£U­O£DÁMWmwP͆W PUIɤݾєi=ƒ}Iµ4d@¢B] ""H’¦†‡Jv·gw•µnÇmÚF›C§jÎxÞiȰ¤ÈM,·h²l_˜i®åýŒJø”CNf•+‡äD%šÕ±ÚN53­¤¢™h,¥¢\¢…‹¶¶ð±Pœ¤²1‡“IžÏP¨‚•è ïd@…4Nµ.‰c¢,HiQɲÒfÐGäL„Gy>®ðq1šJD^̈BZ’3<”¢D”QZÎ$3é¤ É²fcU…À‚ІP’UlRdLdh}%ËV±¤"§`:iwŸ6Úm5ŠlˆèPÝ®Ö iA € IVÄbFJIٔͲS%+9+«ª¡˜m‘ã-r¢%K|EÇ#CmvÓeé¡ôõî¼Ù—7*ɹ¨ÂÒ&§V-T0PA¥–Œr.¬•T×БåâI.«+RSÁ #g9AŒ§áXœKÉœ,sb6-I22$bBY¥†äŸ¢³¢˜ÊòQ!™åDVNKÔU †¼;T5}ðžU2¤aCG–NMª²<—#N f‚ƒ•~˜!GHŽ· Ñx6ËDbR(¡DÂRœËD‰x<™ŒC>¡fZE)žµ(pTjBj¨ÔóhÙVó:ÑuMgáÓ©«S‡R›Õ~V@’„M("!DÉÈf\(Z€ã¢¡k=es²aOûùtʺZª•Dƒ}Â8‚!€UÌÓÎuÊž­ÕÕ­SÓЊ¶Ñði›KóÍ[,X¨£Jûª´ª,± &ö âBšÇ°«däý¦‰ìÁ˜¡«ó´ƒ! Â+$¤È­Èft‘I&%ÉIB«˜GÀ‘“¤˜"G9 äRŒžÊ+JX‘Bd°Ž¨KÙËÂ.‡ú •³˜©,_‘+*ª;¸nãŠK<ÔE¯ŒØC–¡œF ™ð†Œ˜ 9Ë`12à|›zgD;ÙA{d!PpÀx¨y¬ÖeIyIdeÍDcRŸÁ?ÃXÏÖ)U$ò²$"ƒ¬p\]3)eXÁ8‰VFÊB†ËF[a¬…´„pK$C0Ɖ‘ Ei*®¶„øX$.ÄD!)gâPl/Yžê䨧Â,ˆy‡–\Õg‘Õ˜gÑ,ÛÀDÅ ÓVQc&BÒ1KK¦±èBÉ2‹¾î:ÌžäscõZ7 qG¾ÍöP„uHY12`”©žÓ ã/–Œ®m|·d@É@ViFõ0yµf¨ŒŠÄÉ)el¢ -G5jŒ²jJÝ>r "ÈSäbjÄJ1Œ“s†Þã™UC-QÜeÑ^ôwØ#¥&uêŽÑcêm–Ö]7»fOÑèÆ´›jÞ֮ªŽË@Åí*îa|ä`–NU‚}u¾aïtOÔÜ×飰@’óMx·½0Oý’Œ-Yt±X¦ n€<ómY¬ëxªŽOwãÉ"lS!£•&Lÿû`ÆÃ 1Æ -žÈðEDƒˆd’Q ¨6Ö M+{´ÝU‹q cQŒE‘ýGmB(Á˜²¿š‘³LØR¥µk¶™3‚qbÚ•ê<ƒ„”¤$Ô‰]ptjx¶Ú¬X¾­±×clçRÖmË0)4MX×™“ é°ÚtdËÀf¯ÄteF¸Â,i-µb°Ø  è¢êZAÓ›¦9f;Ó¦3á8¦ÑíêØ)dÔá¢v¨Ó­¹‡ûü‹ÝùCUóP¿}zÀ=ÖãžésOuZ‹mt©CŸmäçþR»{¶Ë»Ö4ŽÕ´Cîánw¤F:<^ÏOWܱ‚>YÌMz椇]ÏûhVƒD8”ÏÀ‚ ªi`'å)*Íj`ºNªãz0ã‚Sy¼láIöXÊ„‘³E7+·°ü'B¡¥5ã2L9³œêoØÇ;ë]À,‹¨ÆØ0X9gI%¦0êŒq‚B$91fØ bQœÃH”‘¬n‘#!¦¥dÕT…ŒhI¤b©L(+FyæòZCéL+åCR2’âcs¯Ñ–ÏñR\@€r )U©,Jét†©Š`1w¯Š,JYý«HÇ€t­@´‘fþT—·Ð᜚ñW•Ö5¯-^?ÕvûxuýBááåæÓ«=.u¬^l»sºëþ…λ—:î­Þ9åßüÅ[»äÝ:“¿²œpyà契gºž^éy|¡ëÉùæ««C// ¼8×ÿüôèÓó#÷—:×½£¹[‹¥Û‡;/Ž·Ÿ_Ì]žóOMU.ê;?^;Ú•;Öë²µÙÇÇ‹‹Þ…9ïÌ ujÂ:6ä-‹“¾1U'C6©ÈJSs5`=›µùŒ+gÚ5¹‡Ê!Ó ¥aªŒYhP#=Y4„³SŽ0ã¡~V \’e'ŽÝ.„³N*ãKòÏ#S%;"+‘¨#fÚâdi& “-<?±’¦Md’ ûÎXáòáʵ37›=S:4(QjØ±Ú O" Ðå)4Sr6£É) òIYaüm@•2¢ñt’•mB†XV,aºì1ˆÉEi zÚ­ùN³Ni" ™ÕöuäQ$ÄlJÒ¥Y‡í…`N¦»¬uõy=ÝÕ|)׃µ*ä u±‚çÚáÙÙÜícÝjµqjÍô£ÝΙÑÊ¥Iÿ€=áXSec±ªn7Tœ)ƒ2>ÕíëÔ–h®—ûÍSý…åžòÉ>÷\›uº¡4ïœ/^™«ž­Ü[®ß:T;>ž?;Y¼¬M4Í6ßê,š½–9’·f:œå1÷ø¸·ØgM¶¹ãmÖd§1Ý¥.uÒ“½ÞÉvãh•ÌúxÊÂC&î1pŸ‡ ‚¸; q¡ÄËF\È‹Ùn@ñ¬‡Žz䨗|pØÇK9ëÐiƒæ€X6³]žÜeâNç‰\WAY–s2è„°Ža;‚mö8  b ÒlŠÕFšOb9É”["GÄÛ>®Üj»Ð›»½Ô>ïW´$ µ$£Y1«S‰>¡ˆ,¦‰%`4ZcÙÓÆQãÖæ"ÙHBNf³Q]Š(ÍÄã‘(Û†ª&$˜;cì.(‰L:&·Æd.™¥¤cŸy¥„"Çj6m$ÅlT sb²UB‰˜'‹}«Ë2-&s5l2iDik}Ô˜ôüÝfìyd$wb&·ÕéM·ùcL&µmF³¤ù6­úfG^smÂ|âܸ6“¿7U<ÛD‡}5<â’Ðáº~¢¬¬ÂÙn×шG0éâYÏñôR0l)c9ÔoêyV+é¨*¦\ YQg1E EMR F[T…a)ÍeØ ‡Ì9G…xZÐP]qküàÕ¹ß.O¬o_»Ü~i¦ÞîzLs‡99’³aÓvÐdFOesHé ªÇKNL)ñâ”™9šK/[ÊQ /˜`HcRG)Tä:ª‚RG¨7¥¸¥›Hã™ôµ1—ŒØ`ÄQú‘2í£A‡)„ÐŒ!"„a“HI0ÛÆR\5X*@BRVeS„š(QQ$Ù¬N”‰.üüfÛ»•ž×7Û»×ÿÛÕÁõ…öc.Ñ0â@ad¨«€X0„%æb •@bBá%cn;˜Ø”Q«$§_+ì# •Ù0ˆ“ PW–t=RôÍ¢c8¶æššgS“+:ôp‚ —ͶfS±„ŠI­­V"kDCfKÒ=–ì% /#5ÒÉ. 6 F›¦w¸t¹f\*™³²ÖA”Á’v¦·xÒwÇ-<Ÿs‡¯¢ê¶D˜Ž¶ Ψ· ¶#2[²ùv¦61nG¸ÎòK”4”îÀ¸SÁ‘ËŠ8V'':ôn_:Z¹;P›wÕÀ1‰Ìf¸\Öóhº`01vcÊe°s$µ­~¡Ç9Ñ¡]¶î[WÌ[ãþA÷Ñ‚¹:Y½2hœªH‹¾6WP—‹úñ†v¼G»Ô«ëÕΗy_=Z4NÔCe|²“.'ºÕM y•I[í(þî´IY¥]&iæhAUM(×-ÐÏÒ ŒG›t¨Aª&-¨Ç Jó²4¥ìòhñí•­ïNv=ºÐöòzÏïOúßÞY24130u ]7 ³ª9&ŠÙÕ¤ÌK3+£•Çf G$ªˆ™˜¥‘1fy˜MÆ8Ïþ- X-)@g¶®ìväíÕê¦ÖÐeæµHG*FÝÐ)@F¥‰ªy¨u¸Kѧ*z¿«Öûä°Ì$¥… êá.p²“\¨ØšÚÅ®>ttª8U׎õ—+¥‰ŠQ¦Šo¢š­w°Bpˆ@#{Lµ¬A²¦d¢"h©¨“n"ç4Õ"(G”1NP8YÈ.×ЈC}Ñ,ÀRÖBLh€œ†ºtu’Ũj©™‡\¸X X(J‡ÚÀñ ½Ü­ßônMÊsÚÊ´v©ÈôpàaÙ˜ûT¬ÚEÉ€…m0ì(C†2¨£n PéÑŸW,!¤u¬T°BâËéª,i˜ÌbbÉ-#I°TÙ¢ @@) ¬øP%K@ð!LVËH6Q®_­þñúÌ_ïOýøýÊΣåµé׆_¨ß›Èå¦ñ µR4›=u‡ÚæOTÍHZ†:‚f2™×IWÎ(äLÏ5]×t\¯¯-בÏåsf>WÍw8Ý­#GÛ}£V4Ëecl<7Ó_ì¬Ðö2.—«®¡:^©«áVmjâDUíõ5†ºyËÒ =ïêNmLJF03ê1Mc~Ô§Ú $ª` –%¢…™¥Vʈ!R^HJkŠ„!Ê3Ì<RˆÕR¼Ä#DäiZ‘Ã)ª0Ì÷(\p‚.ÉG+¹ù¼1]t®æô1MË3;Ÿ…@}—tÔcâéú¥ýÒ@G xÙËʉvtª‰ïµnuÙ7:s³ÄXÄðBM=] c&èÒPgF¯µ)á² ÕrTØÇPËÝèÐA•‚wØA‚Ópe 4-\E¤’¦Fº ÒG%qJºúz"ì   €Ñž´H!Sƺˆì4*© ”Ÿ;Ôùåöä×õ±Ýýû/Ný‹ßœzwvôñ™ê…ÎzS6«¶>:Ü>Þ_h4î†65­šÊÔòmVw·ÙÙŸë±*9Yàš¯ç,»gÊïŸpò%Ãu‰á»í½f£h:Îå4®|^«”ì21ò†î††dV0¶N4æ)eJ‰±±ÆIžA-Sò¬ê&•)Ù‚³i+=*šbrQ T€ºUÓ×Õöº>’3J5£b©6A*ÓæÐ] ÓÌx º¢¨™ŒžQ\¼¨2»Ç0–ÁI…0OždTËhÐ&mšÜÐPM%,oó d¨zØÃÔŨÏ}&^Ê™c®ÚçãBh\g°Ÿ=\A—zÉùuÑQæ,yÉ"C3TÉØPqIm‹¹<*Aì©‘‚u‰ÉH©’…HîU`7€m)±)ÝXhK‚ Du×T©BdLÂÛX¶à(ÀP2Tª4L¥ÍD ‚Ò\(“æÑÑDAí_ºØuðæÈŸ¿ýúp|÷ÞäþÆìîýC?žÎn=Y=Þv­àç‹°³«Ð,ú–ëØ:cJݳT]Ñ-ƒê–j±ÃV!ÄXCšKtÃ&’n#G@¶ƒXZ®aÛŒd ¿˜óý¢U¶ŠN­/_í)Ú.sc,H-éÔÒp"‹T€óù,…JAÏPÌŒÔIDFY¢¦bgÞ—¡¼¨ÇKÝ<‚bTB¢’Ò­‚Eb2£´*°„RR4cB,&&¹DŠùñ(`:!‘À©V9Cbp[J%„xÄâHj­Q˜e”lZÓÌdi!•&)…„!HJšŸA)ÄÚ*hÙ`§i^ÉÍšùñ¼5ëK5÷hž9,÷p{ítS¿Üpg æ Ý†:TÐç½åœ;ÓãÏ—­aOc¢ýH9Ýo.åNL7.Ž—O޶ép&úÌKó¹©ÉÂdÓîðôɼ6]4f}u:o.æÕ†Ž{lÜÔ Ã¨F¾ r±Ñ L!bˆ™¦Æék§+?žýõaù_Ïoݟܾ߿½:øöôàÓåÇ×ûÞ¯t•²ÉBG˜¬÷±oÏöJyÓ3 ßÌ™¦©k¾o³bԱƑö8t¸GëW‹9Xô oû«·Åàq¦aÚž¯5Jºï'hÆžp0-­@˜¬*±"I r ¦“™TJáCb:Æ­\ˆãBQ.nMqœ’Í$Ä„ðÇG¹TˆKq­®%ÂqY.¢dC˜ã’q.ÊsÇ%ZB.–Mr ljq.çÒñ˜jR!!ʼn©Pk”K œk€¸H!‚+!Ä`’‹³Ç ?¥{".µÆ%I-Š‹Ú€GGêÆ`Ã7ÎÏ槺‹Ëýþl§{}&q rz.wb¬xdÀŸì,žËŸÍ çûó#½ZÅ¥5K­åýN×ìÕ3uŠíLªK££E·¯h2|®ÉLpkEÙ:.¸¸êâZç5Í¥þBÕhØjÑÄõªÑkÃÖ u»Z«çM×VÒù´tñdîÛà OO|}6÷õÑôîƒÉïï.}}|zï÷Åï÷gwWÆŽXN£¦kPeH4©RÍÑRÞÉYX¥ ¥„"•²›L+,FФ* Ä2PˆšQ4>Ë2^D̾*iLi1[+g0aDˆ¥ aÙR¨KI‰‹|LŠÄøT*aE“@‘¸o¡‰P8ÌÅÃ-ìH³#ıÆbŸàø–p(Nò)Úš“GEÚk˜0…@ÄA(3ÓE(!ŠÌª‚°’ )0D3J†}4Lè•5ÍÓ¨ *JHHä&êáH’ãR©„ÄGøx88 ˇ^ÂM§ÂÌ‹¦º)dò°¦«‰T±ªe“Š9¹¯îw¤¨‘²ith¨_ƒšV3È&ÐÂÔ6r®a9:kËOÖ kÈñæ»ÍÞ¢ÝÉdn\dB×Q±÷ó°)#S¬*X$È ÃNT–fˆg% \]ͱÇ0ÌJóǪÿ<ûú°ëãrï›ËÅO·š¿ß¨}¼ÕýæJû‡•á¿~›|¼8\ˆc@q&žJðrŒ²’¾v ‚ãÀ˜ìßeæ± ÁÄ5˜Ébè 1 ŒÇDQPbˆ`J±40PF’ÒiQ–¬¤‘"#öME ó©ß '“ÉXJPÂb&–àâ‹oˆ …¸èÏŸ¡ôÿ{ƒgƒK(iNâ’Bš–Ž›yT6©XŒØc굯 6 ,ƒ“»ºëšŸ×¨ަ"]5±a[cv‚}Ë®›f•'þ˜Íñ4â3夕½Q˜aˆ³¤jáÙû&B).&ø–îPæˆeRö^¹jÁ· {Ó7MWËUê“ÃþPÁ,4JLªŽæV=Ïòœ‚ãÖ<ö(ýxwfçÖÔ£Cö‡Õñ÷ο¿Ð{RSÃQ…}¶P\‰¥R<ã¸Â>¿$ªéiȬ„C±4» ZΙs†Û%µ0‚qVBé8MKrHP[¡¯A7%8-¢×":)ÑO‰/Q>e+‘¼]xÕaHf\C@HR„¦ØI‰¥“I ´ a‘Ž'|™*ò™ÈÊŒ&`RI °¿ @c¬àŒ@Æ}Œp¡¦‹\ƒx8˜„±æa’Å ò°¡b=XÇEU‘ã"K¹xráT"Ä—nŒSà 1–X”ã!F R©@Žð©Ÿµ›Ù0àb@SŽŒÅÓ¡4#JH32ZmˆÌ 3#,„Ë>ƈ@PZxv;ÆeC±(c•(ǰ"–âd1še ’eHÅÛ”9¦’ëÇžÉ.“ Žp<ˆK µð ’R8)`XUÃC+b±“P8¥…yµ%f¦T´‹iJcG(F¸ha¹‘¹4Žð8Ì‹\D #fÏͶ㰃T Ú„9,C ‘¬®úUG-ê¶íè†FLæsm¨Áøg[4 ¦20“ƒ050a¬Àð˜iù˜Â $ÙÀZœS¡˜R•I@ª9„ÙÆ÷ì}Øàg$ÄÀ1f“ˆ]4*9— ¨ªšOmIÕÊ‚§AÇz F P ~µáEO¶œq]öb,ÙÊ ²{€–LíP 0ÉŒƒšL%— Z)kÓ#µ£ãærVDZΡ‡×«/owþïíËÿýáòß—¿­MmÞu¹ÿþ/Oo4ÎÚ.l‘£œ,%2Rµr±Ÿ@š 1²àâ .NVÔ×;wVGwî÷ö¿?^Þ°¼½:öùÞìÓQ·úK‚l iÀI"-ÉTP³1… +-1˘-+jÊIfâ°`pâbzBrb "Z\Ñâ ‰0$dC©(ó\¡4ÛbX8FÜi&>"\<ÝÂTiIó-üϹ…S†±pZà•LZ öð‚”…h<Ík‡xÁ$ŽpŠÂ)bHaRJªJTaâ Ê8+Ž E HDÁ:Æa—Y Œ™ÏfìªÈ¬ÆƒÕ#鸒ˆ#9!Q©, †H•U”ebŸ½0Hµ Q˜í‚ð1¦ZVIAŠF8¼br@Kbœ•aVVe# 6EøDÑzd‚y~ÌòL l<›.U\4žS'uyZ“Û-˜ƒÁ¬Ú\›tó—âÿ³w÷Ç“Åý‹»kËŸÖ&¾<~q¢ëñI÷֡Ƙì&R$,{ V[Lݵð- óHB£=ðù³Ñÿ|vÿñ¹½õ…Ý•CŸoÚ»?ùõñÌ¿~;ºûøøæýãŸþÇöÙÿxs¦/š4²Š˜Ž2>•ÂVÓ‘H$Ç,^*¼tšËjDRPj‘p‚8$|3›$¨˜!n,™b,H€t„ËíÄhDni qÁDD<Ô s-,ñX†ÃÉXK¤…cŽ6®"k†^²LÃQD”…™¦$cÊL«†õºj• Çb¤37YÎcßÄ–Y5;ŽY®Um]ÏùN©BÛó´îÓZŽúD%L#™˜93 3e…ÓB°|ON£`=¿©WzÅf’œŒtçNø³]Í6ר眺j&îðp“Y`Œó*ì•2ÝMzdX'}%z² Κ`ƒÃ¨CØÔH'S>Ñô50¬üQ £®’.Oà™Šz±¨ ÖÉé~§Ò’FlCÍô#³Î×£¿¾qð`iïÁÌΓc;ÏN<˜ùëÉÜÖÊðýc…µY¯ QYø¨ ñÆì­ápk:Ó*öu—÷†ÿýèôÎÊÒæõ¶Í;cïN]]üt¯gÿÉù½ùÕñÍ;S»wz?ž©»  2²JÉB,•l ‡‰X\ ÇQ,Ád^"ÎtEDŠ'ÄT0[+$â")³„ia T%Ê’<Ò­É–`1Vª…AG"3!…ƒÜÖÝý n"eõ©Q‰¥ «îp8 ‰͔¡3E–eé¤0›À‹ èÈHÌL»24d¹ a™ˆÃ:ê²p§F»\µ¡«†@*–D`&è€K—JÚ¬­ç¬3LU$â`k‚¤+ªšŽsH®˜—«Þù6ÿPÍZnhËåü„átzxÀ·æóúqŸN:Ú‚e$Zãa=­6àe+–µœ"ⱘBRC¤`€º®TŒL ëwºJ)Tò8Ó´@CcæNe…lBèP„dbÅ…V^lÿbê?ßžü~q÷Îô—Õ±oOÎo><÷ùÙÄ—k£tÞªžòsÔÊ„x„Ã|$”&²0Öã¼Ù`Ø{qÿñìæJcóöЇ­{߯޼]Þ]Ÿg±þrüà÷>êÉÄT9›JÆRq>OÇâr"†Ò1À“ê0Î ¹ElMÈ‚LÉE" ¬9‡ DÒ!‡p È)” V2ò¡p: â£e>OÇCJ¸E µŸæBñ´¼Œ’"FD€&i©@H¿kÍ_éË+èÃŽfjzEE#&8Z¡çJε!÷zwùx»z{”>rŸÚ÷Ǭ«ƒ¹ 5}¶BõkçÚCÚ‹ÓôùiýÁ¼½”·˜²òt x¨Ý¸ÐïÿÒf\ìòO–½¹’viؽ3fß™+­Ÿ©¬.Nôë·gŒóuc¦GŠæÅÁòõ¦~y\»3kwá°®ŒQ¥OK#îç²–‚ÆKj ‚DFkj+)Q̾” ‘õ,‚)‘¡™*ŠH4Ñ™´!ñ¨µ•å:DRJ>:f<¹Ô¶ÿhòë‹£{mm,}º9úâôàÛkÍÕÑýÇ3Nt]êÈYLÀKJ<Ágâ±Ö(¯FÀxC{r·ëËí±Í{;ëã{wV'ö×÷oõîÝí`°¼½1¾wkhw½gó^} c- Ò)æËdÙDB²" B:AÓYɰøfZâIV¶1fÆã8…B“œlq0°$!жò,‚ìˆqL¶´„Ã!þÿ_°ÉpKˆ•mkH@€˜yV1 \ƒ¡$Mr¤‹ž¶®UìyÜ îÐá„f(žöµ¥ª~´ªNXêɉgÈÕ6m9gŽ"£!%]Ì'X剼v(‡<^W0«w)+¥³™¦FT¼…`-±?bZžšÉ¹ÏTG©r¬“^lzí–:쩃6¬S±¬í5¨ÙŠÑmà†TA±´’ÃB€0 ¦í瓈'vÅ‚ƒ˜À$·Ì ‹©÷lZ•¢B„©ë¤SP©LUbkPäe˜ ª†ŒT9> ŸÞ`*héßÏî¬Ïï®Mì=ßy5¾·>µ³:öõÑôÛ‹cçÚÝ#e·–Õ#œoMÔŠøâ¡êË•¡ûó[«óìYLDí=œÚ{гw·º÷xhÿñðÁË‘ïÏOüõjêàé𢉠p¡X:žâã|„1!sOqšŒ Á¶æøbÙÀÄ%”hT ”{”$§I$QJJ+H„„–P„1)c[ƪ\$ÝÒ·rÙp«ޤÂ%JGZ2©´L(4™˜ÍŠ/¦9Q’˜ø„yO•ðÕnóJÙ]òÕ ØÚ„E•å¼6“Óæ ´ßÀƒsÈ’‡Î6¤ËMt®Nú5jµ¬š=ž÷Èñ¢µXõ ÛÁÜÀ÷åŒSeºìisEópMobܤ¤ÓÄÞ)’ãmj‡†{}ú²Öûá^×çµVõ;ëc;GöíÝïÙ[8¸;øÇý©¿^M~}8p¼˜ó ‘DŠed¼5’hÇc©D+LªDÄT‹‹ˆ1–ªÑD‚1i°Ù0ËGp* £ÌìF„Nˆ´¤Â-<Ç%~ž¯I±\K’ ‰­\†ã"QñP4ÌE‘•´ÄÇ mȾ‘–¢†PÙU‡óÚ\^ë5u“ P£²5Å×½êŠÐÕƒŠšF‹”‘)A­Ì†’ ¦Ÿ(…Ì3ëÁPQŒÈrB°u¦©pIÞ=«*bEC!0 ð PÍÕÄ6–È •á,“È˪"‹ ^H¥PgZSÑÀâ(8.ÔÚf!NF•HRŒ…3‘P<NF9!£„¨$DqBÂaÈÒ^ÀÀ¡¤ËÀíôúlÝ[,jÃf8™G«¿ÿõáèÞã™/wú?\ëùýÊà—_ú>Üîÿr¯ëÝݶ7‡?­??Ý}­¿~¥§ðàN}ëÙñ­µ™µé­»ã[÷FwVg?ßÿp»kkc|{ctczïÁÜÞ“…?^þöxæÒˆ—g>›Ë²He#$އZ#-@†=Š˜©x’ã¢YNŒ‡²\,‰$¡$38 F¼„#'¬«T¨‚lSñmÕÀ dÁaŸTmÒ–§5WÏk´ÛGƒ µ³Fëh¦Ì·¦y‚Ó¬))"v#“‘¥h&Ép?çiÑL&„!‘k#œÈ2-IÉ-jº…gŸAH+>ËÅ#ɸgÏ %b‘{L<˜yHÆBJ,â‘LºERZ2R‹kIFBÑTˆ¡ÓÏlL r†¡O4‘İ’ä–Íq‰gÄH0áÐaäÆlG†½~$œe %ZZ¢‘Öl"ØÇœM·FxfÜBlXR™pFf6Á‘ªò-µì«U”  bÁ±ºzlP»ÔIÏušW{ü[ãÞå§ß†6yžšÓvŸŒüuñÓÅÞO÷ú>­÷¿»×óemäÇ‹“ßysyòý­é׿Œ¼8Óþälߋ˽{¦¾=™ØºÞóá—âæÝòöÚÞÝñ¿ß{¸p²jW q ÆÓÃŽŠ mj–,¤*RÉ#mÊ>pvè¤H´²¡Ö]X¤°æ¢î†ÚÈÁZ…Ô|µf‚Δ´é’QÖ5×5Ú›ZG!XNæ %ÀÐX¥`GW]5˜Ýe˜e âä8'·°9ƒâ‹N2É2K&Bé¡À­³#Ñ€.™ˆf™­J2_ÜÒ¡t2 o,Ì寢©8;ZƒÜ E™“…‘8ä0‘`BÌÄ).»¢† ••„Ì“Š©*!¤„T1Š…8ƒdãÁÆ2ɨ‹³ÜÈÆ[¢ñp2Þ‹„Ä©)fét‚I…¤1Í@+•Öø0‘dªSVLT,’Ùn<]FS5{©Ë›,é¥,bÚ@Ëf›5úø~ï_/|¿7ÿåöÐËãë“öƒ+Í­õéÏ–¿<:ÿéÖ¡÷·§?ÜøxwôËÆì&cáû“{/æö[Ú¾5ùë™ÞSõ'§ À÷žÎ}½îû“£?Ïþx>±³Ò}±ÃhS‰¬S…jFV„`Û {7 ˜u‘TÐIÃ&U WK¨lëÇ\Ue~¤¨’<@º 0|3Y¤ °U¥ª?8Õ'i¥€G+˜¢‘ 9S‚%d 9[§h4Oú˜2Ö‚En„*Ê$)cÄ(¢$y(G ‰@–¤´$F%¦9iZqmÅ(*Z*¤'ÉÓ4q%ÆIæîãr2ŽÃ ™¹¶lJq D³8Ì Uy¤D± ¶”J`ŽÈ ¦P: Ù§T°Ó·(„—ŸÁ)$d™= LKñt:ÎGãJ<޲q™D Ë ,*!…ý @¶¢»Î›vS0dƒQ‹tÕ¢¨¢‘1Wë7µ ¤¦JLá,Ûi)‘° ´0@ßßmüñûø—©W†?Þúxsü÷o. ½½Ùûézßç[CÛ÷ÆöÖæÌí>a~gÿîøî­Á­ùÏ÷æß]Ÿ|smìÃæÎ­öÝõ©ƒû“ûëCßý~±ÞÕlF4°°ý)Šœ–Ò1 ÇÒJŒ™^E)ÆÛtPDÐeVNÆF,Ø«ÐíÀ“”U\³aI5tø ;‡Ë|ØßF†J¸b@ËB†Ž4ë,‚ºlØê1£!ŠgÀ6”ö[ÈÛ¸ªã²EØ¿b Ûºèá¬OEÕ–‰aâ8‡™¤ ¦RÓ¥ˆq Þ¬·ŽÁT “â9…é9Äì3R@àä Š„ì RÓ,¬²™˜Q•$ˆÆ‚--E¬Zª*‰$›RÒYIæ$`žNàCYIRDA!r6¡°Æ’å³,ª¢Ü%)=XÔÑ„‹–+ø|{´=ßã©ceÜð1A2–“r:Æ'á$#‚l<"Kiy¨©­ž¬±ðíÞ>¼}çÈ»«Ão.ulÞkì­w|ºÓµ¹>»½1¿û`éàÉÂþÆÀû˕ֶ߮žo?™ýý|ßËcµ×{·6†¿¾:ôýÕ±¯g¿?[8x4õ¯ß§·ïv<7)‘İ&We¤2r&cÙ¢iIDb&_±¡Ø4áBAp £ ¦dÓ3¨Ó&&*ÑÓEEꢔéÏ<l9ëa˜ÃHW$IÅ#1.’ Ų-¡4+·d‹šlɆc).–Â<Ʀ,“¦…UfCÅT-2TJ%[Ù¢þqYd3"Ê9 ÓÌsÄ­­8ž‚ÄfrºÁ%XË ²ga–†¦ÙšaØŽæùšãÐ|…–JFÁ±«õÜäDîê²snÌZhW ¹§†Ü±’1Þ®]™óÖK·‹WûógúÊK½þÙaú˰qiÈ85l.¶»c¾q´Ç?ÒîŽçü™¢7äÁùš¶ÜAOÌånÏV®äÏŽ»¦òwÊ7Ù=î)ýx/èõ¥Þ(Qö½`*‘M…øtËÿel,,g³Š*É3ƒÞó×so—~¬M~øeúõõñ‡×úŸ]ï}s®ëñ¹ú«•‰—wÖæ·Öú?Ýzs­ÿÍ™—{wŸLï<>ùeutç^ó`càÇã©O–þõòè¿^ÿþêЧÕþ{ýÞ‚¦ê5+Ý-Ζ݊¢¦9VÙl&,nÈÊ’Û-`³•L T:¨P)Ûî¢EWTˆ),Ì‚¦Û\\4AÙ‚uƒ/0ØKpBkÐÁ# 0$~ÑVŽ©´ ‰I±[ žgè¶F˜Á4G¬|°Î…E³È2mɪ;ØÓ’‰n‰H ^„HömÐa›uݶ‰¡QÍÒ)ÓÕ5¢6m½®k +6éõÜ~ßô>—4²õã]Î\Ý›­;ÇÚãuk:G™ëémš‡'Šg' '§¼¥«/GÛ=u¢jŒ5VwýE½'OFú¡Z~È6º ú@—=;lN7´îœÚWÒF*´¿` –œ±ª5â‘O4iŸIPæ=µâj0Å=Ãj,8ø“|/†a:NŠ:96D~»3òÏ›‹{–?]úõxïï§>ý2ýèhûË[ý_ŸbÌûãÕÉm,î¬öï¿Yøútzgeôã­ÎOw»vïOí?]úñlö' ߟúþ`îàÑøöÊèë_zoÎÚ—+àz}uľ9nŸ¬ºí$Ð8ñV9œlŒÇPñ14eADÌ\Bf2½* B;EEÔÞ„Š¢ôèhØ¢"nHÒd‡âȨ%çÂÁÊB†á$èx4è`ÅXÒfÄàÄ¢Ì?*&BúÏSä.ŶÊtªÛA=‚@ÆÁ)uc¦˜Ñ1ÒunÄ>ÓæÍ˜ÖHEh£]æò v²ï³&ªÖpI;>džò/ÌÚgF….ãÌŒsoÙÙ˜ô×ç½µ£ÎúÑÜ¥^a ¢‡ëì²i¯£6ˆ^ÐiµHÛ‹FY£%J-…Ú„á*-ZBš‘}D*©RÜiÒfÎn¯ù= »¯FGÚõáª9\Ò»ó¤d*Ef¸R œfê:ã©P&ËKb@¢Ö¬“δå3W/uýøíØŸí=_Þ}}dûÑäö³‰Ï7‡?ž/í­wWûvž-ÿõêì·µ¥/«3[k»«c{«S³_×–ö×çöMðíåô¿^þë·#?ž/|8?úêôèæêìÁjsûN×þ£Ù?ž/î?ß¹?µwwz÷ÞäöÊüæ½éƒÕéÝÙíÇ3Û÷'¶ï ¾»2ðêÆÀÓ_:î®ÞœÌ_óN9fGÐ PYê­‘™¢ÖFHb7 k è@1Ì©P©b%—U¨¬´hˆéEÍ«ÈÊVƒL-5PÃ'í&¯OU=2pÖ2€HPUDª>V\Ì*˜Œæñ\^^®ÚKEkº© åI»ÎĤQ.iõNÛ3©CpÓÑ}M.Úª)±BÌ&³ñD ±UUÕqÑFuhj§Fzh'JÝDÃ/Õ%†<¾1¨ªv2+Ä·9 ˜Š°dE@Fvª‘,"@RJ„‘QÝdb’v´ ` â‚¡öäÌ~W«ab¢fQª%›  ²Ñ$-©Ÿ¤&eÌ˘|TÉg—¡]¶Úª…¦ïtÓ3£mÒµóö§µ‰¯§÷W÷ׯöWÇîÿûõü_O}¼4òùnïü~ê¿^ŸÜ}8±ótj÷ñÌ΃C»ï¿\þöâÄ¿~¿ü×Ó#;Ó»ö6FwׯvÌíß_Ú}0»Ãº1¼ù¤ÿãZ÷ûë~éüíâðã½÷ëÏ®ö\tÊRV@Ùv÷Ú°Ý&M ¨TQAAƒÌ¼˜²ÄÂ盪KˆËV:\è#¡n£ Œ Õ „‚ d1" Av(RiÍ ¨ú9»žÖ¨(™˜€/Qˆ*TG,a€ŒvJz#Ÿs$ÇÒ<ªRcÓ1U\=Y¸C‡ëd¤viGƒŽÖèp·51l. ™#=ZgM+ø¤YRûÛèФ>=æ,Œ•æ*§ÆsǧüÙAoªßëð&GŒ‰~}¶Ïžïuf{½žŠ†eœŒ&¢AÙÁÌ_3… ŠUòWÉRÍf­h»®ž¯~Á´Š*`3̓”8PÆçù»Á´ÃéýŒpç>ÝšütgdóîÐç+ý/.ö¼8Óøt¯sc|{ut{uagcäÛã¹ïOþümò?_Íÿùˆ¥Ä¡?žÿãéÌ×—S{&öŒ~{:óÇ«¥ý‡ ïÎw|¸Ý·ýëáÏ÷gßÜx~©üëµÊÇÃ+ãæ/íŽ+S¹Ef,"1‘H)±,ˆ)RŒQI2 }¡PQ£M' Ÿ)»ým……Ñæ s"ƒt~Ò™ªë3=ölž–˜áÕ•+wÔ%ó%ÒIQ¿ ›"¬è¸bšÚ(’“A3 )Áj&bÌöK*h ³V#“`i“1*Ã}˜ÁÀ̋ګÑ^Jg<£ßÒ;-¥Ç6ú»¦š¶¤©Y¬KXO«LŸ›HµY 2(FÞÐ*”3vlËÔš‰>Ìc»¸bišQÑ•‚ŽòŽšcZ‚½£¡Šj%§Ú ¦ˆRªUËF¹à ¶S±iÎ1™àP)€Œ¯•Ó-Ï „h«fSY)+c™JPñÁ“]ÿþíÄOïl ½»Ö÷ä”ý~½ôùF}çî—ã{FNïlÌ|fBëÁäÿøpæß/O½¿´óxæûó“;—w-l¯,}º3³¹:¹óìÌ——¾ßŸg²êóõ¾÷W:__n¾½>¼snhójÿ—Ûƒ[7‡_^o¼¸Ô>L/KÒ-ŠO¨i¦E’¡,J1^H¤˜ 2Œ€móU<Ì4’ÎFÊ’'¦¼éÁ\wA¯µ§ vçÕ¦«v{°ˆɦZødVv‰ÒP”´¬8¢ârQGVJ"ÎD±ŸÅv0U#‹@Lf`–ÏðL[*"'ª2tXLÓ8ÍK<‹®Œ°‹ªmšÊ¼ð ­æÒ”$aÝ®ÕÜ ÊéÄ ˜häg³9h«ŠN4††x,m_Õ ¢hXT%BSSÉ`I šrП)q(VØÿ‚›=—êÈR‘ξ¹jV¨l€úÙK€P$Éb2$p±US È2ñPZI*Œkt&¿U$©P )‰4 —,lKÒÙùJ°DüáÉ­{]_®wÿ~µëÓÍO7«lÞ¹Õ¿³1vðdiïÑìþÚäöÝêÁÑ?žÎþõs5ã΃Qv#YVËÛ§÷Ögw¯Ô¾=ýûãá?ŸL¼˜ØZ=ôñüà—õá?vŽí=ý¼:º¹qzóîøÞÝ¡ßη½èÏiJ’ 0c )")¢èz–š™Є•3AÛG$f¡@ ¨IbV{‹î\›;RÐ*tnÔî­im>õ|=T‘ƒŒC›Y:c}uÆ5zU™’,ŠÏô«ëSS)5NZ Œ +ÔGaÐùvÆq‚nW*î·qÒ.J|ý\·Ù«h}”¶SmÑÑflíD]*ê{ý_ëqõ¦+A7_Õ×hIf[sßɸ¢ÑŠI\Õ0±YRgo‘M1’XŠÌœ–}§@E¦ÿÊ \1¡åa‰ˆ…Â*ÓqAˆÆÅT’qL<ž‰ðñ׋$YÚǹX‚\:Ÿ‰&“ì-: eÌT³)Àª5KS•ˆr|6ý×Ë‘ÿóúô>s1kGVv¾¿¿´ùKÛ‡õÁ­û³;wfönMí¬î¯Ooo´í= ù½=ÿ}máÍ/m[Ϧö-îÜ[ÚÜèØ}4²ÿjúïß.þýbù?^]ú¾²ðñfÇç_‡Þݾ{¢ôéÖÜÖ¹¡o/ævWú6ïö¼¾5ôùBw)ef²˜H´ÄS‘PLÎ" '2<»Kb¾”ª"‰ˆ0,Š™l‰dx©ÔÔ{ûÌvÔðPÅQ­¼¦Ä†?V&é£cæ³ÙÜ‹cÕÕ^õF£|»¬ßêo•Ñ©šv­Hkòɳñ'RSGšv¬ŽŠÚ¨¹ÇT†sÊBNøêÕIÿZ¿¿ÔCOV舉Ž´ŸêÀ¿tÐÞµ†{¯™ŸÏé}.:ÖÐ.Ô¬ ·ÏÁí;R‡¢ž::”¯÷kVÁ&ÆCŽÖ¡“>S;Þ´Îujcê7•ñœx¢Dµ ƒÖ£!³S5¤¤Ü‰q1!Sâ±t$–âR8&Á”"ñ V­ )E#B¥©O¶Ñ†¦ÔeÒéªK£¹»×ÜG·ýCCÞh§SŠWhH=;[9x¼ôçÙϷ:7ït|¸0ðéÞè¿^Û¼<ðþFÿÞÓ½¿òÇæ‰ÿï΃¯vïþñûâ/ŽîÝú¶Ö»ûËðÇ{ÍÝc[¦öîŸÚý¥móÁèÞ³éo/¦Oî¬4?ß(º;üy­ÿ?>œúçñÒöÚÔνá/wú>]™øxyàF.§Æãñ°Š¥c±”ÃDA3ØÙ¬×a_<ÜvæpíôÑŽ Ó¹™!w|Ð?>“¿¶Ðwz¸9èYC ýÌdþî¢öëÝ‘¿>œü¶Þ³û ÷óÕÁ·FßÞèß½?}°:ùîæÄ§+åíë›÷ç·Öº·Wj{«cûw¦÷6>/~¹3ù_oN|{6·÷haïÑø¿šÿ¶>tðplûÎä×Çç÷ïß[™ÝypþÓµÁÕÜÁý1öÜGìõûöžNþ×ûSont,`%+€à w*¥ZÁ’bJºLHZ ºË^æSJ*¦¤„Öˆè 4£QfóZ¸TiI¾$³Šñ­®j'ËÚé’{±AWÊöqƒññ/Mm­K¸†qw_(i‹îçpN»ÚÔ®7¼N•4­âa 3/y¾Û¾Ùoóè´†ëé4ìnMŸ«Ê‡Ûéñꌃç\s†9PW›r´)O»Ð‰zuìaÜ‹qàN‚»4|®ˆûdÀPf}r¢ ÈÓ9]¾1¨?ž®Î—à‘¦v¢¨]óñÅ.ír{åÅñÆ¢Kd ëÓ‚©‹q©AŠãhLÊòAª‡Rñ, 6c‹ÙZÕn#vYÈX",)°«é- {Ï·¯,µõšäð€sy¡òèØÀÇk}Ÿ¯ö}¼ÓÜZÙ^=ôe}tÿaÿ³3#o®µm?Ÿúëã¡mûëñ‰ƒõK[çF¶VÖ'öž.nÝÞz8±ýpöýÆðŸOÎí­î¿œþëÕâw&®žNüùxôàåé¿_ß¿{hoeêëÉïöïOï¯On®Llß›=x¸øûµ‰‡'‹‚™LÈJA‰H ¡%¦ e ÍÅäDLK )&®R"Љ*HKÿùŒž†$ʈÒÌÀ)Túl/kx¤ _Ä·ûð½í\A¼?­Íçñ°;î0ƒvOY!èc´ìj#êuи+óq¯‰!£;ÐÊž+n\êútÿÖï—ÛßÝnÿr9(±µÆ³eýÕš¿³qt{uúÛãc»kK›û÷Ÿýôt’i­íã;NïÝ©o¯öo­µí?œØ»äàÃüÁÇK_×ÎmÞ­<Ù]Ý»5ðùÎðׇ£=œ?xpjocqÿñáïŒÊ7†Yp¿lLo=ùº:øöz×h:™DœJb.ØxŠ%É€¢§ŽÍŸýR<!í`X#´Ó ý0 (›Ô¢ §‹Å =rpNÇ ã6 Rf˜€8¢“Sr¢R–”RÊf-ae%H{m“QÌîJÑb€°($²Ï\C]é‰Aþçì‡Q#&bQƒ-Þ6Âid%!Xb` R1-gÛ‰ Y$ רeQÍU5“É^[ˆ¨/ˆiE‚,c7N<ÓI0ãq;žh'‚å÷YNŒ…"¡Dœg®g*›gYÈ9õ™ßöŸþûEÇ¿žõïßÚZ›ø× ßÞ]›Ø½]Üݘؽӿ¿¸µ2öåúÔÖ½ñ¿>ÎïÝŠse|kŠ[¢DeEð)èP•’ª8ˆ0ËÆ šA—yÕ8S û{¹Mï°H3˜Á£“• ù¤ÎóͺêJ’áò9ìX³ Â!Vh]­P¬""ÊÀ¡i"ªŒ¿ ƒ!ñ@ DZ óU["ƒD%RXˆSmáÙÏ0sÊ*vØCØ(«ÁD¥›PU!ÑNà¡($•HD`¯d^HÛ¿Éàlå¦8Ò\ —Rbœk ¶’±#Â%ĨM*§$9 îQ¸˜"de™=3¹VEua§åõøx¤â®{SÝÎá†ÓCšjôäû:Ë7Ž——óý¾õêÚÀï7·Wg¾¾:òévÏÖÊüÖúÔöûÓ»#Ÿ.¶m¯.}^ûsó—¿ß\Ý»¿°ýhrw}hçáìþ«“Ÿ®üùöäçÇžœøþhô`­—•ó«+Þ¯¿4÷VzwVêÛ×»·VšÛW½½•±ï/ÏìmŒ³È~}8òýñò_/Oî<™Ú]cï;²µ~tocd÷Fq-ËÒXR‰ËìL)I¤ê ðUjb€c0™ˆ‚5AõŠi%ƒNú)Qh‰ú*Ipœ?xpöðÿ¬Ë}w¦üùVíÇË {÷'vî6vVûOüõøÔîý™½ûãû/Ø o®N~ºÞûöL÷&»ç·™ƒ[‡¬(Oe)Ø0áÏÕ¡0—‚¹)_…2„<–˜k+íÅPDdöˆc¿Fùx*çyK1ÉI\K"—B¡D€c‘t4XW‰pAÓ>œNsé8ýD:X”æcÁ¿FC\6ÄÅÂ\,æá yT(œI„”(G8.™"ÂA¯Ъ” ET*1 UdDPBX¸ÒªìY¨§˜¯—Bð ¾Yä ¦;Q¨äUÍÕ¨é¢ P£X÷ýœîwùf¡ÐñJÝjα£¢åÂIÈ#””$‘aN4Ï ¶aZªS}f3œž¦Õ[Úk ±Uw°æ¶—Ig›V*;–mš)nœk<»4úû•á_O Y›Ûy4óyýøöýÉÏ7Æ7_²ú:ùþÊX°@ñõÌŸo}}vqÿÉL°°üÎÌö½î?=ùoÏþx±üõé¡¿^/ÜßÝèøŸ_NìéúÝ“?ŒÑϧ ;7Gî0ë:ºy{`gctÿÓÆóÛ«‹ûgöû¶:úéf×çÕ‘ÍõùÝ'Ë?~]Ή fɹP¨…‹$"é–Ÿ[ªC\2ÄÊéçž»`§& GB ÇS‘Öd:寂%^Z°É+–J³d³|H¦z<‚Õ쵇ùp84ã’Q®•ã‚7,|‰`{&ûÉÞ/Ä,Á…C?7„ïæ‚M œCMÑ4Y’*&ËØÊ)ªª"æ†t)«P^¥Y\°õÁvo¾âHš¡(DhA 3¹y @’²\*Ú’ÊJØ®Pfèä¨ D‘OÛ”8 E¦êU À1¿ÊXÂ"Á¹'Z7Ô¶lÚÄÁJ³Zµ¬®ÞütÍmº“u¯¿awåÚ ¦…}T .IàÜ>Vz{sâíµþw;?œíûõÞ—õS¬x?žï~¼¤}2ÅlοߞúñìÐîÃɯë#/5_ßmßý2÷×Û_þ~ê¯×'vÖGwn?˜ûö|òǧ…?/Œ|Ô³OÒÊs‚ßYp÷jyÿZçö­ž­[=_®ô}¹Õõn¥÷ÃjÏîêÔ&¯õ=»Ööy½—eÔ×çS.´c.¤†XípI.ÑÚO´$-™D0·=k~îᣱ`5x$œÊ„’±Pk:ІBi.ޤ‰d&ˆŸ$‡bÁ¥R¬*“á`¯®,<`bFIp×eqGƒ+%[X¼˜Ë€¡ŒE‹Ñ(Œ·B¾•)EBØ(ZÍzaf¬Ü“Ë«¥z_i¨žï,—†s•†«ÅÉR¥¯Yï+ôëé̈5]%*Ê•¨i²Â£Ð¤ˆé< ³ˆË&ÔJ””MÍ6©£æ»±ÑF¹`5Jz½‘ˆ2¼Ã@È uòv_Y›u.Œ7Žwçf*æ½CæDEí¨¨ËUs¶ÝÌ[eôw›‡G©¢Sö1ŸBB8Óíÿvcâû‹³Ï//¼»3öyuö˵Ñw§êï77÷}vìàñì·gG¾==üíÙÉ͇ ûÏf¿¾œ?X?±}µþíéÒ÷ǧÿ|uòûÃɃû‡÷×O<ëøóõìÿÙ˜ÿ‚õ×qá¾’y¤Êïý½‡ý»7véß¹Ú¿ûpèŸÇGvV§¶nÏ~þÅۺ߻o`ïÞðÿþýâßæÊÌg ZPT-ñ.Æ¢ zîEBA[¶T+á<2M+rBˆp1b.žVx(„$¾UIqR(“ÄØJÌÀàB3q Atô²­b3—ól£­L …²¬h â8^®Fš2©¤kjŽ=NW(1ŠŽìkÌD¡º­šlüMÕðQ®ny¶ê;v­àU¼|ÑÏwøÕ.×fPé;®Ï`Ð@΄2±d4ÃìÃ…Å—R ))Æ[…d,ƾP(á[eã †RFT²¬ìùøÏÎ'2 fCœÐlkj•|cìò3H€‚èÉØµP·§tèPH ^Ö±]Gm(Á9£øõýúþ³Á¯Óoo\íû|oêÓÊ¡ß/¼\ê~s¦±ûhêÛó™ÿ|»ô_oÎýóøð橎w&·ÖOþxzê?^úÏßÏþóéÜ¿ßû±>ðýåäÁ«‰oÏýõëÒÿóüð–­ÿšÞFÅ_9þ­“ù|§góöèÖjßæíÞ×»>­±÷šú¸Þÿáæàǵé7«_nuïn4¿>;¼µÞ3 ¢ð\”Ï´¦å 6ÓA51¾ §Â1F”@ŠŠ(*Ú¦TÃØ0ˆÏ  2É(Û6]=IÅ6sÝÎüX±P(ižf¸N®aŽLWÆšù¶ß´4Ï :²bªcBö»›·\‡É[æ™{û«˜‡´ET‚È3 c0«˜ËkféÄÐ5Û+Ö‰mª8®iض öQTÃ@†!#-žQ.h# <õ“P"‘€¾¶‡S\Ћc¾¸… ¨ %æRIö½â Á±t‚[81lO‹gR»†'¨|¸,ž´ñœ,Åø\#:i— çòêTÇluÒ&Mæ×$¥ê€¥>úñFßöÕ±Ý3[×F¾\Ú¾3÷;“=¿N¼8º÷`æû‹ãû«‡¶v{4òíáÔ ô‡Cÿ|¹ü_¿]úûÙüŸÏ¦¾¿ÿóùÌß/Žl¯î?Yúñtþdzù?în÷˜¯8ùQkö…ˆ>v·W™ö¾ÛÿéÞØ›óC[+ƒŸ®õ¼»1þúúà§•‰×?ßÝ|<²³1ýû‰ÆŒœ¶3Y1œÂÙ4MC*pZ™¤‡d JSÅTаh¢`1R’ ™‚­ ’J€,N]ƒˆ_ÖFºu›9=©ºŠ‘Š ±4Y3±_¨ÖêʼnñB¡Ý¡9C¶t£¢Úu 3›K4¨kÐR™Z’±\jÉÐP krš©g˜Ù2TæI%h¾™w}×Õ]Ït|TÕ4 ë@E"RVtá––H¢…g$ ZC¤“­i¤‚öš?ܨ4Ìî¼S5íf)?\0G¬|I;=¡Ÿì¢3éÈÓ¦M–Y6È «^^0W—+÷Ot¾þ¥oc¦¸~|¸l¼¸^{·:þÛ•ò¯WòWgJÏ®w¼?Y¼î}µ[ä°·õzàÓúÈ‹ mŸ mߟ9Øþº6öîdÿó[C;çÿã÷ÓÿãÃéþccúÏ•™í[}ï/”6WFÿüíü÷§‡¿>Ÿûñ¬ïÇÓéƒg§¿½XüûéÌ?OGþ|zäï'—ÿ}íð^Õ{Åqobü—ÙÒמ­;mïöoÝ_Þ\Ü\iûr{äÍÅ‘G—:>Üêøp£¸y·‡ æ¿^.|{<}¤F+‚¸ ³<)MLQ!%'ù4s© í0‘%ÊcfŸR’Œg3ñ˜,e2—¨®Óåª*jTVU‰"ÍÔ|‡q‹-‘ .–@IŠL©åzD3¥, ó"P45\(“£å]'"µJZw—Þc«¥¦93æMÕéT—Õ§«^‹Ø AM”|Ø_ÔkºáÊZ#rj àlRho€Jÿ¼>òéÖøæ­ñ½Õ©Ýõ¹í[cŸnõî>šýñ”óÜýºôÏ›3ßží¼šÞ{½È8÷ë‹ñ?^ÏüçËcÿ¼:ÆøwçÅâî£C_îÏo³”xqôÏßoÿxyúÏóÿùîÔ\êý¤’ßâî½ÂÁ½Ý[ÃÛ¿ôn1yüzߨeÇÉ{³íŒg>¦´&“HáYR™Ÿþ¤T`fSñX*œNk:Æ¥CÊDB0-ú:©j¸±nPßÒt(JÆÇÈ ^%"fQPQÃÀ‘°"®LøìO“ÃøŽ¥Gd@wž iª›@BLÑDP&ÄK±J ÚÂ;Áì.DI$¥J°‘L¤˜XBr+YS•ŠXnŠRà»TPV1‹Î2ò†UÛmjsÝÚ|M›­j#¾Vó4‡j?¯¶Àü a/¤¬Ät\ÎlXz›gä5¦€Ë´€GKmZA%AÓšµ<Õõ,Ç£n›žµiªý\îðŸÝjüz£ûÎøöÊÌÎÝ£ï¯ö¾¹Þ÷üjß«µÞÝ—ó?žþãÁòÞ™o¯gÿü°´¹>ó‰I¬•ù½õY¦„ÿy²ü×ýåo–÷ÚYŸÚº7½¹±øýéÑo¦¼ž9x¼ðçËK?î.|öß/ôìÝ_ü~bÿáÄîýÑ{Œ¯çÿ|°øÇ“Ñ?7z?žÍ}¹ÝõåÁÌöÓ…_ÏþñxâàöÀõ¡r» GZ"q.Éì©…-É&˜Æ "ȧ¸D<˜pÀ‘ëÂÑÀ 1å[“).éÐ 6Þ’Q[õh*R‚e›vP܆µ6â” jˆ€d€+ÁºDŠÙ,ÄV †`2è¬liO-r4¯-¹´¯¢LåŽÌV6œ…6o®Y8”£ãq¬ÉŠ;ßSì6µKíª“"j"X–3˜£g»õ ÿÖ@ùîlÿå®z'9ä Ruô:3® 0l¥á¨EM#¥xAá$¥ELr™ËÛ°nÍf¢I)Y Hi Ƴ˜ 9¡¸¢´))Ô@‚ãd•L’—ãB<)#U^^r_î~rbìíÕ…ýÕñ­Û_î1nûðK÷‡KãŸ/·Ö»vúñûñÿµyòŸ'§¶oÌ¿^.¿»Pý´Ñ»÷pbÿñè×Ëÿzuþ{pj`áàÙâþ«3»Ï'¿½Û¹=øõþÔWGþ|½üï'þøtb÷Á(ÓE÷ÙMmÝ™Ü\ŸÞ}ôÛïg÷Žï¯îÞú¸2ùöVÏo:~½ØöõÕÔ×—³o/NWU†],^ÁfufZ[˜Iý¼ û³BLœˆI^ˆñbœ—©L”Á5+ry¹„NµY«#ÞͪºX¢ú%O²áÑŠz®Ë<Ò0|u”ª FŠðD#¸JÃÂ}®ßïØ%Cu5외äÑzNmú¤-ÇjŠØm8cU¿3otT®¦ÑÓÔû‘žüàH~t 2ÚÁ|náü©ö‰‘ÂÌTñÔLéøpîâ”ýË‘êʱó³=ÓƒÕ¡.»¿éõÔK,š–Ì´†"¾¢K¦’BDE¬fcr–ã³i–yòT‘‘Ó<ŒqÌ*(RXb *˜™V™= "(HŽfÅgÄ6B®ÕÞ\Þ~6¾Ëjdudóf÷çÛ]Ÿî¶¸7üá鱃w7þzq럿ߞ۾ÛöåA×ÎË£ßÞÿñêð§þZ=»}mòíÚ·G<[üóñ‰›c¯O6ß\jî<˜Ø¼=¹½~hçÞÜÎ푽û“;¬–ïNî?Ÿýãáo¯Oí¬ßYÛ[™Ú¹<¹õKÇסÝõáÍÛC_n ïÞŸß{4³{êójß³S•qÏá8æîx&œP,EÒWl^rÉR^‘ò¢äk³•Q*9¥j"Š>”µ”¬!ÙWA§ ªVUZSJZ*¶ƒîz˜¹M=#ƒŒ  ?/£€DÇKívW¡Û7 Í\°)‹Ü¨(rÕÇmnÀ¤²u]-bTQpNÖ\ƒTXf–W…*’ózi¬Å1JÁ’£O6sýU£»Mï®çšžŸÓìÁÞâñ¡Fg—r†kÒ¢CúÚp¿U­åK^Ù÷}lQ¨’|Õî,–+9Ã3Km…žöR—£tÃÐM-Oke£ÏR:ñM³Ø°Š9ꨤÛÓN6œë³Å_ïÏì==öåZ×çÛý_˜¹3üéÎøç›ÃïÏ?™êxr¶¾ûzòŸ½‹ÿÞ>ÿ¯çKûw&¶®ílÌmmLo?Ý»¼ûbaw•9 C{fw7Æ·Ö§w6f¿¾\:¸?õåZÏîj÷ÁFç÷çÇþxròàÁáoÏO~{zx÷öøÎ­‘­Û;÷:¿=Yøë·“>ùvpw}j{}b{íøÖZï»õ®í§§ÿxvñÓ™¡I_Æ‚6M‰7¡lª¢M¤Vò8ê8«¦RÁŸÒ<ÉÈ”™w ¢M¥• S¾Yeð³“RpÁ¶Ÿ ¥ó?ñ8) qI¶Š™ŒÈ¥²‘Œ ÈŠtòRÊu8U¡³íÍã®<éµ #ܹ’7äJ†Ñå¨ìþNVξ֛7úsö@ÁtͺcŽ5왊Ñ]5ëÆhÙl÷j5_/ùÅv¿s´ÞÞSovz½½¾ç™H3©CKÓ|-WuòÕ¢åûªa Á™aê8– u«õksíñ‚ÑæªHXð{NwÅÉÑ`{š+!ÏtzÊÕ#ÅSÍ7—‡7oN¼3°½>½}õЯ'_]ØÚùçó¹ÿõuå¿~½ôÏÆ™íó£û+cÿþíÜŸÏOÿùîäî_ýï§þ~|øëúÉ/G?ÝÙy<úu}âÛ½‘•ÑÍõ±ƒ§‡ÿ|yäë“é¯Ïfþx¹ÌS=ŸÙ8»rÿáÌÞ³‘¯Ïºwîv~¼Õ·ÿtñë«ã{«ûëŒy‡¶îÏìÜŸÞ¹;ºµ6¾ýxîóí¹éš—hIX2壥58ËœÆ|Œ¤x]LkÌ·FRÙ8/&5•1„‘D DZƒ áX0aÌY%#A×÷$Ìç$c>h¿þy (ÒI­>[“Q^æ5"–@ÃrŽBbK.® \x6v4ªSlÄѰmB×Um Z–âU°ŸC–˜’q-lZÁe¯-æ_rõL%g¼‹®äº¨èå*9˶5DleEuËè®Ðj•ÖrÐwEËUV˜ºÓK®i¢á:™i3®Ö§¡*F% &(œÁ ¯È¦€|A)ØŸ×Nä×Ou¼c*èÙñíµ©Ï×&>ÞœØüõÔþ‹³3û¦¾ÞŸß}0µûnîÇæÅ?½ðÇ«#=;ô}}aoåÐç'þ|{ôà×C{/—6oM¼=?üyeêë‹Éo/Ƕ×?¯ ~Y›ÜZ›øÂÐõÑØÖ㥽µ#ßV§ö<Ÿÿöìð×;=Ÿ/—Þ_ï}kxs­wÿþàþÚàÞÚÐîÚèöêø—Õá­õÉLJ¶ÍoÝùt¾kÌ'a.¥Š­`#©¢™Ä-&šÁ¥x ò†Vc1”I— ¹KWÊvÛ°×bÏú¿ÀEÆÑÑ–P8hÏÿ–dœKGƒÛ­ñ -g&Þ"Äcb$Á“ÑìžH¢5¸v*¯Ê2‘ƒ«Ôƒ°™kn@2üR"*dxÆåXœ ™Å¢DÓ"i ®¢„4 §ŒÈ²(‰@ŠfN“Heö:rJ–ªdq" BaŠRÓÁZfœ”DðQÈ>RDÒ1H!P¨Ñé<¾@ñ4¥}‚ÒK÷ñb/Âý„tˈ‘…—|öæ•âæ“é½ÕÙ­•ÑíµÑýWó{3¿ª½<⿻ݾõëÄ~:ü?ŸžüziðýÅŽ÷w‡6WÆ¿>›ý[ËÿsÿÒ½¿ôׯ±­+[7F·ïŽn>Ùy4±÷¨go£óó…þ'«o¯æ¾\jÿpypseâÛã鿟L~»=²uª÷óµÞmæ‚-¬Œl]©m߬înô<þöttwc`{¥oûVs÷nãóJχ»½›OÞ­ >™ëêÏÅ´lªŒ¥¦¦4-0VÆ E}ÒSºY(©:Ì\¥ɶQ¾@&ûëªØFƒVœ­?ÏÄý %?›4²£5˜Ç‹mý"J<‚SaÂ@ ãTTf`Ë-ñD6‘U3Š#CGFjqÙÈ ª(¸P&q9 ®Ð¤fD&W@R”Â" 1–E1-f¢¢a‚8‚ÓJpwZJ+—˜tebfãÁe%S)9òñD*,ÍkRÉKñÉT<2m,Ä£b2L?¢¤\£`ƒaIìÅbFòx¹ÁK¬˜¡Ï>˜”ív饾Òúlço熿lÌì=ûº2õñ\óÃjûÞ§S?>\øúdùÓ¥÷¾íœþçÛõ?;ùãáÔßÏÿxvìã­á/kcß~[üñÛÒßï–ÿcûä¿~;|°2¿uo~wcú;ó>+ »w˜;¼ÿîÔŸoŽ~{6qðqæûï‡ ï?ïÝ{1ýùîÔ»Û}Ÿž ~Xï}s®ýÕÑΗ§ï®´oßèݹ;¸»:tðxnïéÂÖúÄ—»í¿Ýxp¤«IƒKCT*k 5­Ç…5äu`“àòßvБW’ÂBCGM¢˜RÆDÀUàÏòLG¸d ki‰þŒ, ZD[¹d„Õ,#\ùLž”(;¨)A(  €”xжZ· ­CÅy—a/`¼–SaŽâІ|"ZTtIpu'Æ4¸€H9HBr,³Äˆ Áb—˜œN$äÖàªáP"Ê~ÍŠi)-Ç„`BT[e)ôg†Ž%.#±Üú`£P$Å13JXP.Ë ‘‘Û‚Ëcbo 6#b>µÅ¬–R'æÛ;>¿œù÷‡“ߟ/í¬ôl­ôín,¾8ûx¡ôø¸÷ýÉüÿçÝÿ|~ö˵‰wçú?\Þ|>¾ólèàþÌŸÏ~ùñôì‡Óûwf7ïN1©sðhìÇ“¥ƒã›K;¿N>ýéÆèã]OO5;Þñë|ÛãSÍ7ú~»V}Ù~¹þábïÛË=ï¯Ü_ôïŸ)¼^{s«ïóƒÞ͇ã×&‚ã+ &÷߸üùÖüÛÓÃýJr))–¥’` E—K½ 0‰U¬`Í›`"¹@qICÊÁEs˜ƒà*KÁ‰×t88b-Ì<^I §NÓ”Mg³-¼ÌÉ¡° Ë(31˜ˆ(^”RFDÂËj" cJΪ @˜¤Œ™zZ¡)¢ fƒÓ˜Y,CŠ˜™‘0Ó8p.#!舢ɦ%ÝÖJe»n›6&RÛ›FÉ2±8j£lw5ݪ«)AïHè2a“£9uÞ”Ž“à¢ií*ì3À«¶ë„D²Í>¶èÞ:Z|{¦ûÝñáÇG»Þ\ïÞ»?¼wdkmhçåØ_¿Ÿþóé±?=üïo¿üýåâ_ÿx·°÷pæãÙÉÏ¿Œ2 ôýåé￞þñbþÇ£Ñ?Ìþñäè÷gG¾>>¼·6²µÂ<ËøçÛ#ï¯ ¼½Öÿy}`÷ÙÜÎÆè—Õž/«£®üv¼¼½1¸ykôå¹6&}?Ý{nðþ‘ÊÚ©òë Õߎç-;¿ž¯|º^ÛZØ{°°óbñÓ½¡ßOÖGlj¤™É€6Â~°Dûx?ÛA÷BÑ€é1ÛŒ­”¥„($’™ˆI¢­-‘(—¶E”Ê–Unp66!]eêÄbŠ:-gRJ&$ö³ULD’Rp /J¢\Tª1ìËP‰m`š$ÌÎP4 ¯´ÃƒÖÅ%÷òtýBwe¡776šï-º Ö\µîÒzÃì(›}í¥þr¥=ov­Þ¢1V0&æá.s¦]i#¾1çƒnpe™›ö–õ¾œÖëéÃ*ÓV¤[à 5¼è¨Ó6\̃æÁ­l•l²‚4S2®tÓ‡Gûöž1¥t8Xþèd0†¦·×^œêxôKuóÑìß¿]ý÷ó Ì„®î?Ú}4þýÅáÿ½sý¿ßßú¾²üþ^ç—Ç=__Müx·ø÷ï—ÿùýüŸÏî1%¶6Ì2©ütîËýÉÍ{cÛ÷&·îlÞéÚºÓ»y§óýÝÞwÛ¶nv>9Õ\¹X|y½óóZ÷Ç«]¯Nµ½½ÓõùÑØïwÆÞ¯~Zغ׶uw䀱ÿ³Á¿ŽO—©­+“ø”a`€ºfÐÜÚ<ÖDÅ’%C”4Q4ðUXÁÐÌJÏè€Ê­é.ÄX5ÍIÁꈖDpÑ´–ÿSÁÜJÖ´‹‚ö6ÉXT¥[2È ²l1³™™ÅÌ2³˜É°÷îî—¾ósçÎÄDLÄü¿YÕçÎÄtT¸;Ô¶lU®|`U®ÌÞ¾žþ®ä¾Ò *ôO# CÅv÷âѹäx<¦ÂôCdÚ£0)‘A ðhd“&@›-¥AtÚXlT!gy4Ëcg–{:3¨™`Z&8Ë-‹a h…|)‡!‡ªAd]Ì0Ž2—xl‡6;@SϱŽ˜Ûƒ ËýÈÀ»2 Œƒ\ã0cs Ù™e®Ïq du„®ÀKù”Õ äH†ìM!ÖAX7H3 3U\Ò:kâq¸;zÿ¬(ÝJ!5Ð6è‘çkK-¾TqHKnqãqçãnó;¾üWýôüŠþ~?j^¯—£–BP[ˆh\Ýí?l·®­5§ºæRÕ½æªM׌~Ýí5oL­äîÇÍn%dy?½\ÎUêfÔð$®¨ÇÌy§&s4›ó.6ÛÕ€µè¢w²à/Û E›éõd"z ˆnË'ÂçL&¸P¼ÑUÖr@ÿq·´\Ø„Ú×÷õÐpýänrgw_ڹƠîìîèÅôö’úÑãÍ0¡X×îÜáO?À@Ìi6CÈ¢Š™Ð<àÄ~¸ƒ c OcÀ,b“¦€K")½dFÛ R¿q¨¤q.4Æ„ÆÈ) R'ŒyM¢N1é x Íð;j^dWäÕL×GÂk³þµI‡w¶RkV÷~¿í|>n·îЖ­Är-¼øu§ú}k.…5ïú»G]D5Õ®M­»½ÏÈòѭϨ©3ÔbëµÐF=¸QX›7t+ÄÚ¯É9i»âñDt»5þæ^ÈDÔ•¤®ÞÌÇ-” Üg„ŒˆÔÕEíÁ`{;z{ÛI=íÔž.Bïßm±Iݸ~ >»ûÚº@JöR»shoax„ŽF‡M" Рaˆõ(½dN'Äl#11D60P€¶¨°`~EÚÙó£—Ð…ý»W$–ÒI¢w“ýTVÂÄÑéè˜rò ѸtÙ{‚nè.Œ#Ú)rd@3ÁØ•3vÆ¢¢CÊ DÄ¢ÍBÐ<žhrmg˜±ÊC„lÒ L6ÐèK@î²)æqŽ•Î²à‘Ý)®g{Ä>;$£ô/Ш‘H„Ñn²„ÌÐQHsH¯‘ÃÒñI†!Òºhͳ\Z|õŠjú*àĈ¥îpXW\i8tÎÉçëùúþëzå_都Ÿþãñ¸q³][-½R>ñ‹{òÜÊ?ŠGÿH£û‡'ÓY¯¼ÐÕmÒZl£~½Q‹›[wÆï”¥š´æšJ@Rõ.æl yŸ©xkø¾Uf‚òàhÄ–Öÿ«`ÿënÿ#¶ÑŒ™~MÑ©ªÜh€*n„ÅïjÚkÍûŒÙ @ëÏvcÒ81F…ú» ”>¨GzÛKÃP` A'¼“ÉhÓBƒë#tÒû‰ýÔ o°Tfàÿ%Ã$Z7éÀ2úˆ, ÜL°Èó|"›DcàÈŒx>PÔ$¨·­—‚Ö±`‰,éïêG2‹žpîCÏnð`Úæ!íÝ:ÐMeñ<ˆLï ;ˆ*•CÆsˆÄ!n¢È8TºÀ¤jx}”v!`ʸå 2ÍdY$ÌC1SÇGtcŒÕiÚÑä •@·ò‘ñ€kmȹ4è=˜»³ÎìRû%ý½úqΦqÄc¾Z>3 Gö†\š‘Zp0:hœdîKxÞ½Ùld¿î_/:e¥ûÃ’}©T}=ZËçú÷ÐDéDq§`?Úå_•ý6þÕ:ýy³Y»¾.d.Ui·±r½úq«ÿ}wñGÌðá[¨ú§k·êŸGQc¬¾56ü›%ÛBúPôp©¨Þ~¿_.¦ÃëÔÄæ°O-pëÁMvòD”Ž+ËïšÆ›å?…“?îW?oµÿ¾ÙüŠ.ÿñ®«Ä-Y¿þåd¢öj­ÅÔ®õ©CÕØ™BÁ‘á^2¡‡Œï©„9…E€Äõ0LmnIm¸ ÛùAÀ©=®‡Œ>ùë'B}T¸OêÅQÿþ)¸— ü#BƒHHð‰>’µªƒwÒ ,úA·cºÛzre€BœC˜LÄ PùT¿Ÿ%±W¦8á@ƒÎ. ¢éd\…ÔCƒˆ£u°ØâZßž£¸»ãÜå9Êæm=hîí³¡ÓIó$kšOéC÷’zÈÝØ~êûºˆÇ=„¾>tö,ßAÄàÆ²º1´nÂH2ÜAœÁM$ƒëoÇ¢O0;ºpXL'Dìēіæ8¨Ëì!Ámôî‡Å2*™: sqQ‰ø<6›É`²éÓ#L¡€9Ìgóy|pb~ˆÉ¤!,êä(‡Á„8“4Ö sŽÏa÷Qúz€ï'´7šOePô㛢‘õqÖæ4óD5q47y¡µK§Üfadgøör ²=–Üž kf’Ûˆj4¶3þ|)½?Þ/=^©Nåñ½ÅØît|o*y0?Þ ïN§sË·‡Ê÷[uÕµ‚>ÇqjÓ~E-niÄŒõ„áÀàÍi5a.Tµ—õ„õ}ìñt¢|#ý.­ý»qüëy·u»äSÍk.…LøR5¢þ¼]þ¾Ýj>®dlúÛ“¹\À\OZ׿zt àsÙ¹Xñˆ‹þ‰rd®ת֭ì_E\)ÓÓ¤‘úÑzo?Ê…5óœÓU¶g‹g_ŠZG<«ÌÐö\hOä?šK\Í¥ãÚØáœÓ*ˆ,¸†Ùë0“I"ƒ(ˆ{IS=ÈxÙL¤*Èt9†m ö¯ãigC×G6’!‡wH¥G  x`ŸLq ’ðmè\°¶î^º…؇íÀbºp ²ÔNž€EH=Ä6Xâð cŽ3"ššFå0x h€Í( ,(x&L¾™B#RÉýmP[êaá6,‹BaS‰Ãl´×S×µ ”À°‘SiC}Ë8k_Âw˜ý«ÓI÷b*(ŽìÎ&Ž&^“Óy¿9R?_ªžÝŠrððöJôt¹OH?‚Ö2H:—6ëT¿jºTb÷§÷´â3äoô­[s!`z÷j?=æ¢_öûd…¤éÅ.”.5UÐOa)øî®®NjÂcp”~BâÐg§Ù²YÄ âÛöćjEÄÜT [=ºáUáÀÂËÀ!ÛXT ™j¥¯qèK,º†ÍÔ1黎–ÁXgÃf6I?Hœƒˆcd¢žŒÁf‰D!–(ê#ʰ¤… ºIÄb3Ù„ Ln'™Ò†Ç£ƒúè=t†ÈšÔÖÆB¬j¾eF04ÄÖ-ðgØh@ :ÂDX á T„‹†"Pp#£,:ÂâÑçÆøæÙ! ’ ²¹Œ9w–w%9bsí+#Ñab[òP¤l†ì±úõBœvmæÝšÊ¥%¨M»´¹ (w%}·Íü²\È\_–œÂBÈRŸ|+ªàW´2¦jêð5°’>šK»Õ)¯¼~ÍnûGÄØíWÂúBØPóh s€ú# )¥¹°²þºóûîèûVñõfúý+ô3¹SO®”ÖRh©56ã ¸k·kßw›@ _ë ¡Ù÷>Sׯ•͸ågÌÔêË^yéDø÷a؃JhÝùG—„ñ…eÛ„€C¢Áx\w{':¯­§¯§“ØÙÇj#’:{Ƚí0La2*K¥ÒÈ×ÏáÁÓC§CèÀÍôSÔTÆ š"1¦ˆ¬)¡’Ǩ4‘:ÝŽ÷Sù]„©ˆ÷ÆtÀ†>dÛ&ÃÒ°d…hÆÁC0qvYd"\áÑ“qx´,ÛسÆuwCÄQð,S58"äðÚ0l»ŸÜG¢R„ÅcÍqâÒ@2’hD:@b…ƒÐÒµv\‰8?[LCŒA½˜¹=ƿЎ†×Fëw¦'ûüýîxl}îæJY´ë_Æ\`¿à_/ÙÍuçÜïçýßw«µÈZ%hú|=-ؤy‡2¹5Ÿó«qåûº!ãVT}ŠŒw¼UW½ËeçüÛÕD%j*øù°¶p¦MùŒµ¸µ6ÿ#“,Hn/&þU¼úù¾QºVdþJl~Å7«qiëéð+b¨Æ×‹ÁÍ‚Ï\Ë!YÞ§JŽ—úÚÝÖçãÚWzå+d¬ nIÎ«ÉØUµ€¸¾Fݸ;¯FVÊ!S5ºU÷XšÁùfDñûVW9œ©Ïœ i *‰@èô1Ûÿ.R´ázz0í½Ä> ¹»§êì‡Ú`:‰À&AttÜ,DÅÀL*Ä„a2 É™Ìóù{Z΢XÌ"D@¤è"4KdZ†V ¤ Á#ývUÁ‚çðÈ0Ž4D&qHDþ02â2Âæ²p Šˆ#cñ¹›±¨ŒHdhl€>ǥϊXÒQæÜ»£¯ üŸÉb0‘AÂFçC3Gè;LMr&˜@%ý€°m±‚‘õ(_7Î<• Î'¹.ËD6¾[ ì¾\inNG3Ù˹*´?ÂQ /VœÞl4ßÎ~Ý\|e¶?Ÿ—ɽڽòWÞY¹\F>v?£ÆÏû•Fh»q·ý}sYr€¤67Ö·ƒ’GˆÞdŸ5í×VîÅÕ¸ªy»Ô «òÅW\UpŠAuÚ¦Î/|&¬ÿx:úçÛñçÍÆçµñwÝ\6Ð’˜´ò!"ˇÕ9‡ê;½þÇãvÓ¶V¸Ô6³²†Måy%8ÕxQþ¼¾ú¾_ú~µÔlËå êïS9kÕˆ±’Ô#ÆÖ©ù¨ù¯êÊN% ¸¾®Ž¾ÞN,:²³—„Á00=0P¹¸‹AxIô 0‘“ÈxûQû!"ŽJ¦Ñ$Ü‘ {€Éäý=ŒfAèÝ À|2LÃÂ4ðVð)µŸDíáá:zpL ÏlëøÀ >‡13It†RËÆàq˜É&SúHt¸ŸÑÝCa²™ ™‹'rúá<Ç¢ŒóØS$Ê>5Șf1æ³| ‡)L:mv6‚£ƒ'"x:I2Îñ¯Ì=_©|–©xp*unŽmÏßœ)RvmæLYò‚®~vHj¯kÇd:0Ú¼Û-{ 9‡(oSÖbËÍØz#`­‡V¿ž7cK%Çô{XôqkG³°hyw؛뀓ʬ¾u½×ЬW@Zíé5^ôŠÓ6mêRXò­ä\ÚŠÛ˜?”¶ ç?ŸN*7ÛŸ«ÿþ8þëåìãM÷ŸârÖ)K‡Œ_‘bÀPðë’›c進õêúݬǗ*þ¹F\Wò©Ênaíd¬3ÿºSüº3×·×–JÔ\ šË.MÚ.-ÛeõäÑ<Û`h©¤Q cHX`X0俇¨‚[ŠïÆáÀí¥ðÐÇgx<„ƒ!d+ƒ‰íº°B¤²9tˆ ]4‹ÉäQÐv›ô.˜N…©TDì#µwÄQ{0˜ö6lG¹§³ãÞÑŽëÅb;ɘt¶ÚÜZœÀåòxíÔ `R Ö}ä^œV(ƶÔS{–IÇ’òrqjqaXc‘¨t‰@??º½4´<ÏߘTp$lŽaš})¬MrVç‡wg†.AùÓùBrO•Ø;–89Ÿ>}¢Ï¦Ì¿3Ge—)s q‡ŸìòŠKVuë!K#"mD ¿Ÿÿx0Öo·›/»_Ù¥ÆÉRí|¡y³Yò›rV#–´Ë˜Š÷î¨u³Òð+šÉ•ªs²ú¶ îy=cù¯wO9qô°¥ö²ÓºÞ*œÍ|6vÝ_”“ß7'_÷g÷G_7û_I}Õ§yŠ+â¼GúçÍq:,«Þÿ|Yª„SŸ”gJÁùZÒT ™Þ/ Í'ë¯ïwtù×Ûæ?ßv±õJ@_±KK~]åz©VWÚjÜðÓ¹ø+¹©¥Â´n\ƒ'añ$ âpX<ŒÅ2ù,2ÆÂ¶Q;{ ÜAÁãÀ¡Bä&cŒ‰Gèä.:™Ç$²éÐuQI¸>2&ã FŒÁ€Àµwöâú¶cÛIxÓcÚq˜NôÜz´‹žôbs¨L ž˜™#Ú¬«Vçé&ëäô}BÄž™ Ë’iþØ]<ÉfO²fxãSì-¹àТ0KgW—yÒ1íì u‘ïÛ<±$ƒ†AÚ‘q*°ÿ‘´Öc‹­Äf=¦ÿ}õûnûóö¤™´V#հ⯠òuk(2$OëÞ©zt½âÔ”¼ÖJ`»ä4Cúx0Õ¸–Ò¬k8”ÏøÚ¶¿î·þxßÿ£n«ß¯6þ~RóGÞü+²üé}õⓎ®õ%¯:糤â–ÏûZb#ߎì“ÆÚõûaýãÖúyoýº]ÿ²9¶Yq«Ë~eÞ-*øÄàëÍåLÁ/MÙÇŠþ¹y*GÀ#z:ýšÔד€Mè€{: v•+ééƒp=h1COwQq$9Œ‡q0z˜¥§«¯ƒ„t@Ĉ‚qmÄ6 ÚS… r¿=A‰Ö¦¢×ÒÞÑßÅÅ`úè‘9ÆF˜Êä’ˆ,Ahl& Cô~Këé ˜lj/­n#ÓÉ0ûï3P <–A$³9¼a‡3÷¿nvë1Íwh©ì©FµµkmÑ>•ñOîäõ€6azpŽÁÖ¸YýO츸aHŸ5׫ž£Ì¹ªÖ"Óõ¨¾™\ÿ~8ú#aý -|\oÔ‚—i»ˆ«¼×„>ÈsiÊEÃ!y^^ì& ÒHDftR)(&“H8´õ ½!÷ñt"K„ú(¦võ`a<ê¡¶azX—ˆã{±ø6®·, øÙ^&JaR«ƒîJ”!Æýb *zÛm˜±‘A°%“Ec"¤>2™Åb pGC#\>ˆ2O8lÖ ‰e‚Í5ŪpxJ0DbÌ Óæ'‡µ(ŒÉ!Ƙ€3'à,Œ0Tóœ]1ÿÀÈlÍ<ûåvÅ»_ú°<þUüYq|¾ì彯´WWíå´Ù+Y–±óûqíÛ³WºRæŽæò~U%dÎÍ•±™\­ß˜ZAkd™‘w‹+WŠÛƒ‘¼s¶z»Ú¸]©íê]Ξ/Åvå¯W¦‚GŸqÍ–Cª’K] JAM hª00/ºVÒÚ@ ußæÆýQ>`¬$7ª¡å÷ÝœWùx8û~2‰ú¦ÀæÍ²0ã˜üL…òޱb\÷ÇïÍÏÛµrX’ñΔ£²œGýr©)Åw`ETÍÇ寇ͯ‡¯Çuø!ãSV£ª¯K%"oÞ[J‡Ò;+›Ñ щL † @9¡ÃÊéL R ýüZMDQ¢Só°X ®¯‡î¥b{‰Ø^ ¾‡ëÁQûhØö¶®® 0Mm=?ºI–HâùËʼnD|BþѼ ­Lê$ŽñHòa†q˜Ç„hl: ˆafðLÁÔdŽ'—Î*å“ ãS³ÓÜɺ\ÍËFç&9só¼Ý íšvP2ÁbiŠÇÄQÃlxž /ÍÜ] ŸìÊ’sî~w6}§h%œ©-ýýÖÀõélꜜKÁ?óëZSwšÒ;sÏl)`D‹íïtÿzâ–L@R½¶üu½W‹/×^[kÕ§­¬—µ9.zÆÊEÑk*&–jwÛ9Ÿ¬Z(D¥¥è* àJLܼ^/™²nC%bþ¥œ<Ï/<_ÎÆVéïÉB@œ /|UpÏTcªrXU *+®‰šº¢y½üù´^­„uˆºŒ³s.åYÈ8§<’AB[ÜM"÷’úÐ23r?ZÒCèiƒúÚ zµ= õ´ñ 1“±ä6,±£·ÓAkGHèÙî¶®ŽÉ‰60’:¸ÛQ!2ŠŽî`r¹Úkœ>Æa/r¹6¤•2ô»–Þ˜ o )K£ÜõÁQÃÈ`\5êQÍlh§”³GÒÙ%Õô40Á‚G‡˜tþÂk–G“Ίh´>¤M0älî²tüT#ó­OÜxæ³WŠ\X˜µ·ƒñ‚ÛXzZnÄNÿ¸µ5€ý×\¯J’ç³é¤ùYÇ×ÓùwâòiUv®ddBê?Ÿë¡õÜ­æÝ)Î;LÏ'ª˜MQˆÌVÐQ솼GQôÌTƒÅ€hæÏ»«Ï—«ŠO•óHŸÏUö…ŒÛvH Àõ$W«qs3¦«%‡!{©¬][³aC%¡®ß(j¯†ªS“S#»ßœ ï Å‹/¤µ”\¨^¯dcÆVjûߟ¾ºs9s¹PMl×"ºêõj#¸ZôLåÚBT$Öç“å§åïÛ¯$PΆtd´ ¡OYŽ.ÔB’×ãa‡”?„¡ÊFÉN ËȇgÄá>’ Ÿ¦dl¹îµa—xtg†/§Ð ?ˆøÔÞ>"õéAVsذ^ÍAûÄrè:á€ØRÑèÔ4{hfdvnf‚ÇE/XÒ©l];ÇÒphƒ4<=ÌRÍ0¤ãŒ…1Æ¡„ï’ ‰x{^|}ÞiQ;wçý‹×Wšõ‰IÑp¼ì‘qöøÌȈ€3=Æ;X¨ørC2À²Nr/µƒ›CÐÕ÷#fn ×k…c#¸iÅÜzóá(w¢Oy%ï1ñËÁxézï;íÊI2—óá}w,ëVÚª^­ÜÏÝŸÏ?ˆ_¶ä)Ëw©óù´}®p²P ]$yÛ›IŒBÚ†Ëð¶:šuÈ‹žÅŒm¶´Vý–—maÚn~½å½Y×\ãúàóÆZ‰Z·h3¯®øÝ/ËŸ,ä.&êS͵TòkJy+¼Q ­T õ;}-²Õºµ~Å7kkÉ)ÏÅ E§(çW5BÊŠ±y³¤T#ËàkIi!¦.Fô?ï6ÇLÕ*ã5î$ÿˆªÊa!(ÌÏß®Lœˆwf™WêA§vôjy8¼2r©x6&NÔÃ6ódp}™Üš>™æË8š¢3ÈýJO'L€fg¸[ªÑ glœ3^ï%kD¤¢G–J©dJ7‘@éåqFè,‰Ê§Ãƒ€aû:޾0ÀZ— Ÿ,K/æ…kSl÷¥8p&?^e'ó÷nmÝ¢™œ iì &wœÅd ²ÇgY3º‚Žl‹9òÁ#íȃGùtd¸¹˜/].¦œ’Zr«~’?ü¥o\›âËòä™ôÏøUŽ™=ŸG% .IÍŸ÷K…SÑíö´cÿv));4¯¬×½Ì¼ éõùgçâçãÎ÷íêÿÈ.ý¯üÖ¿Û¿W¾Ÿ·ªAM-|ÜnÖÚ¯Ôa9²œ ŠaKán³µÇñëyë÷Ç_·§_‰­fb³y»× .žÏFÕÍ;Í^÷¿ž—ª!C!$oÄõ­˜®~­h>-ýºÝþº]j$õàûkQS=jø×U#:@£õØR9¤oÜlU“ªÆµ¶U5âæ_1ógbýëzëûaígÜH¤Õ×Ôõ¤6µ³ø~&¾Þ˜s+x!ëdtc&aYôÌO¸MC‡J®OÎvÎÃ×ûŠÌ‘êzs8²>u$<°ÅÃãÈÅ̰q|\FAÄkŠM›¢ÀÓ|&s€If íhL:ƒA§ré$>ƒL¤ö¢z(&waÓh#l‡E`Âcté lXîÌkæ4Ó<•qN>?-ç¯o ·–§æf8ƒ\L/pHd*p‡,ÆŸyf½Ž]if#û²Ø±ìöbþÑ.ºu•o-§:{(.Ĭ­»ãœC^öªÊ1Õ¯Ôù¯äÒ1SÚ!Ì»TÙ+ùó¡èaw$µ7ó´3ó|!ÏÙToÇ‹9§ñý@žè[@$£˵ÐnÅ¯Ïø5Ÿ®p¥.ÚµO;³ˆþ;’Ñó/•ky‡æí@u{,®øåE—¢qkþ}»ñqmúŒ¬Ö=æ‚×\EÙ˜jnUéJÿëúø+rÓô7~¿¬~§Z±J|÷ëaåûn£ê]ÍúTE¿ééRõt:÷p"hÞ™>béõ¹lp¦XlÄÕèðˆÐx–úƒüÕðbÖ7™ ÉKAeÍ%Ï«1yÞ1ñJ+¡ÝÌÕb>$ùH©?^¬‰Ý’OñëÉ–hîA[{Ñ¡ý…¢æÛӱ냟b<²Î ›GŽ`÷ÎhÌ#>jò²`‰BíÁ°¤>,‰ÜG"wz;H$l¡šDÄàû±=´± O$“¨‘I'`ˆT6$#0Éáqé,&ò&˜#|‰ŒÐXL*Ì€)`©°Xd6­Ÿ5" ïNœ‰ØŸ¸pgªût©3ùÛ¥¼R–¯Ô§¢Q~$wþŠœ6ýæïÄz=d®ºT­ØÁçµáóÞ\¶)ÊqÁ&~;œ;•<ârB^›>GõàþÇÝaóZߊ/Ƕ¾bÆßQy=¬o^/ýН7b毧½fÎë!CóÎü tr|éWîêŸÙ«æír+bŽõçÍÅwb¦”Þùõ°ú_ÍÃÿ.n}^ëK(îw[1óÇÝò? ›ðFÔ^ ¦ÓÝ×Õ×Õ†ÜíïÅÓûh´^±ÐÖÙÛ݆°ÝhƒM\‚âóh4Â`Ñ`:"âa ‘’#,{”70Ç` ó8ÉàŽN syÓÃlûêì“Mßš½Ý_|ØßÍ=œ o²F|£ >£M—¾’•ƒKÕëÝÏ÷ÓïŽÀh~‡ô5Ç|3"©Ú¥Oçòúµñ`´cYîP˜ «÷;ÄÊŸ‰Õ/¸›?_7~¿îý•:úŠ.5£ËŸ±ƒzxµì›+_iÒÇ’JPYië~ËÇõú¯Øæ—w¹áQä\ µðFɵQ½Þÿˆ›«aõ×ÍæWbµu·Ô¼ ºñ+¹ùÖ•CšF`£~®ªÚæÝYÿñ°ò+¹× [ê ”š‹¡‰ÚÓjãe m7~Þ˜ÿx\úLXRvS*¢+†­eŸ.µw«*K5¢©„”%·*ëF.‡L÷r1Äž1k[(ºj^EæRòx,J9Ti·"ã–¤.ç%÷çs"k×¥Üú´M–>“¦²·‹…›ìáJµöx&{<zäô+ kW64Ieôôtõuþèî. $jo? qô‰!—Ãýd:à!,2 ÆPÙ šlÈhº€Áš€YL2Œ <] `ó¹\dbš™`ÎOrXý4"‰>"`ŠfØëÒÛ–ð!¨À…¦ê‰$³9T° €RÍ{–JqíçÛa3l­,u§²n—üYØý}»\>–ãÚêíZÝonÆõÏbêL–ò龞·þ™üŒ×<¦Š×ô=ù3yZ¸R‚ûÜŠ[ëè:s½Ã»Eïv%iþߪ–~5lÿx·}%¶€j7ÿ•9úçÓÖï»­¯ëŸÛh,î _/GNÿzÛøù²_¿;kº¼[¯ß¬<µî×þz?øãù°u¿Ôx4ÿLo}߬UóÏBõb®«Å%õØv3jhÅeÐd=ª-»W%/Œ¯WâØñø³WQðëVÜÒ‚s±äÑ»vÊç 9ÛD> (&EŸµèˆ$ÊíåRøêe]ÒŒMž¾¿Ÿ,¼]̤À+@ð,…© àýa¹ZÉ:UÀ,MH}ŸüÙ)Ž[EWSäÝAÒMÂt žÞþ~\/dh'¡Ï„ÉChíi?"އ ¡™´‘‘†¹,éì°fndœƒN(bÒéL>‘10T:ŸÉ ˜Fƒ™ôùÁ¥w6n“$V'ï·ÏÛsï§¢¼G™¶+^ÜŠBH’:›{qÌ”¢tRF|ùÏÛƒò‰.}2_Hè‹Þ¿¨{7{¡/ºÕaËgè æ4ׂ’ÆãJýé¢Þ©†4ß1k#¾ÒDg}nµb[¡Í ,ÿLÖ¾„ÖëÉøíÖÐë¥$åžÎ{æ2nu>ÞÁ\k¿’ë_0“úŸ7›`-}\€\ÿJšÿ|:©ú­™ E+(i%Õ˜¶’€ï [Z^YÅ?_Žk Ã˹¸tký|Ü­%ÖªAK3¬.å¥ÈR5rR¿ßk¾¯×ïVK}Ù£ÉJŸWçž$·§€a¥ûbÎ+©Ýì6C+å8ëšO»Åi·<ãœO]ÞN…7{¢È!ÐóSMŸrÖ¯MyMi§¸à_]ë mÞ§K»·0ë›Í…Ôúl:åT¿9 ¹äÁ›Íx2ÍR\­¿ ÍÊþ^¾ôñ ¦è$,D'õ1 ˆM£òF¸ tÃÐÈe¬24CŒ1=@SN2ýžk‘m™Ü–ŒŠG8>—Oè¬5‘àÒ8u{%KÙÔ9§)ã0ý suÅKÕþðúPT ªKɵrh·à7±=›-Ä_«_quÑ©Ì^ÊÞ/¤ïnE%ªýŒÑ¥Z|³~³ÙŒ›SÇÂØ27ë™­½ªš7ÖªO˜7çÒßž=¹æÀ§.z Y§âÝ5ûæœÊ8ôeÿn1j,&Œ7¸ÿšFråëfïçÝÞGt½•XªÄ5µëµ¯»Ÿw–?së•®¾îZo‡Ÿ¯'Ÿ·›ß'Üÿq·õÏûßÑåÂõâדùøÜíÅ̹(·ïÇíföÿ¼_ÄÚŠ­5<òšMTò( aÁ ®±jtñ×­&&¼¿¯„Ù­¹ôîXîj¾èç=’¼Cþ~¨º?Ñ^_Jo·®y×Ç‹·§óOvQÊ%}½œ}:šIÙ•Å 1fs-dœ“o®±¬GZöjË^SÖca}uªžìÊ›#ibmΣ>™å8 ŽŒë&’@ w“úûHhã„í%õö‘èý$¤·"ö“q8rO—‘Ï:šåžyæ!Žf‘òèëææ“ä5BdÒ†˜èùcÑ$íÌ2œ<˜­;Õu×JÑ­«:te»¥ä0—. `1—üÊôöâóÎbby,~"¨¾ÿ|ÜΟˆo÷GS—â¬CZp©ŠUÁ®Ê9¥…°¦žØi&ö~kÝ%k&^e\˯—ó5¯6{©}w«jáÍJ`¿àV䮤ésåËžôegá~gúæh:ïS/Õ¯ë“׫ܧƒ‰÷Ó…W—¸”0V¢Àz˜?b+Íèêgbë×[¿kÈJÓoȹåïK-¨ÿ¾ÖüºÞø¾[ÿ|Âx¯à7ÝìL½]¡†ëweÿ.ÿñ´óëvùëmF]OZkIkãz ý ëµÀjþR—:V&wïBŠbXŸŠ"llÞ®~ƒI®ÕºŒü1¼_•qªoö…·Ç‹±­©Àæ@Ê%){5ïç·ˉ¬OXö£ÇÛ —ªü©>ïUe\ /ó‚Š!K¬ùëõJtØŠŒ{þÅ%y·ë“ëóåQ—†kbÃ#X2 ýè¤b1¸‡`ÐÓÍ}Ýd,®JÃÒ&£ðáI:}arÙŒQÀ¿OF9á“ÑÓŒ$,µ¯ŸÂåÑW‡c‡¢{·þÝg@O(ø4¨FõKëIɯÌFÅ¥K펗‚²ÚÝò÷ÛV+²•4,:uôWÛBîÂòt.)Õ°)c7¤œ†¼M\r‰ë1Kë~õçËæ¯×=޼}¾ì’–ܦèúWÄú³|Ķë‰åƵ¢‘Ð7cƇåVj¥vk.‡õ€ïêQÓG|­•8h&@ÕŸQñWDöy·÷\ÿù ù3eýygn& Ÿ7ÆŸæ¿7þx:üÇûå¿SξÛþx9üºßýŒ[?ÂêzXYòŠ3'¢èª x2’O*¾oŸ cëý ~K3djt57ÈD¯…Ú­ê×½¥~¦x9{³Ïg 倮èS¤Ü3ÚnUÝ+{9œŒl³Á’¾ÛŸ{v/>œË}Æ™ÄÆÄëÕìë¥âñíDDrÎ5_ˆ)‹ ]Ñk,ù y,kŸ-;¤e—1g—dìÓYÝåë•æõJúx>Ý™qÇ.ä#ža„AëÀv¶ww£L;;;~ôvá°$*Ž‚ …L"˜t¤Fë¢ÂXˆØ ѰР‚! Q:! ‘2ÄcšF¸6 /v0u³;ønŸ­DŒ_7ÛÜœ}ú×€ê(ë1`ö>"öª{ãuw:¹3úÐWýú—ƒ™»ãéw§ááH“8œ9“dNóçsY÷|>¬¬&L˜¥ìÒÒbH]Œ+!1`Ã逸u½²æ v´Ú­Õ†ªMQ=U4î7ãÊb@÷¯füzÜýçÓQË­.%•4ïœ+ÊpÈÑy—` ”9›8k›O_J#›£ñ-þÓþtbgúÕ¥Ì9U·G7ž©÷ÀâãÕüÃåüûÕüó¥0u.ËîÏÜì '.fò>I`²s1ÐûP0áõTzw&}¾œ¿;œH‰=Fá¹pð\>`eÒq­$'S @üR)4 Nd 2ˆL ŽB±pê? ¨íÝm‡(=îG7– 2GЧ«­›#Ãó•â= Îz Õˆ¾þbjÞ/7£æÏǃÖívÞ¿˜Ë?ï~Þ]Vü›oÇ É£‰W·¸äÔd=†bp«äQWbâï×õzdýíR§ÔÕâÖ&ú¬ÍZ®ìÖœM]ñéêÑåÆÍæwúìWúEÅ»õ§M ?žÿõ|ú™ÜúŠn´"–ÏÊæVDUŽÐa¯Qe=¦kF­µ¨±Ó7ãÛ•Ðz5¾Ñº9øˆí} çw>ÿõrùë}àþ¸>fùLn|ÆÖÊam*¢úxÙûJ–\@?˜òQsxÛàzȳ˜®1Õbò’O’»T¥/d/´{®0T‚K55o×¼»d©«ùëÝÑäÞTrmܽ4Ú›H.Ï\oÌÜŸLßlO·§®Ïfo6Æ\fÆýÉpÉ5[r «nch$¯8ë–Üí/6DÞý™°mò)(zqÊâ'¢G§,ãTeíª§«ÅÄÕôõ…ðùRôæZŒ-ÏÛfÆ–Ùlúp÷èÌ¢s™,Éþ»©‹Ô ÓˆH•Ô!d„3Äd2=0 D¶—63Äu¬Î^_ɳ^uÉ­I]Jß=‹?o–þ¸ÙøN3lA;CF”°´–}… áÍZh½ä3—ì&@…E»¤èg½@.οÛ3'ÒÒá|Ñ&ʹ4¯‡ Ïgs¯ˆ¥×ó…ÄÉÌ‹_^ÈKae=n­DÖ sÉ'ÿŒ«~Æ­6ë‘çƒÚÖ-H½_Ï럷& o>öªÀ„ú俪旖|“Í{ÙŸ¯»^¼Q!‰æ•”^tŸï–ï[å7«ŸQK-ªhÝjš×@˜‰@Þ}Ü™ên}n]öt(øºWÿ;»ý´fN2néÇãá¯ÇÃÏ8ãgRÝŒİšâ¹©`3½êŒWòîW|úªÓ9G­Aúr±æÑ”/%/§“içìëÙøÃádáJü| Œ…÷x¡ Á‹cêÍ>ûä)½Ê«I#ÚµÀ#ZúÝ6r̽ï-øuƒ¡Í¡ûã±§ÓùœC—wS<=à$ÏoÏgoNiŸ |sòh`i’ —‚¡ŽÐ‘¹A®pzpN<8³024ÆG»zÌ LNrG8f1O;ÃÑβf×%Qûp½f(•P”ÜF°’[À?׳†JÈðõløý¼ô;¹[=ZzÝQä\²FTÓLHV‚¦ü‰:çÑ4ÞŒ׺&º^sΡÉ{ µ‡u`?ë¡ÕÇ õƒ ÜÙ»]ù|(½;>ìÎ¥=Ó判àÖ—#@âÕ¢›¥mÑ6y£rÚdp3¨«_-]ó¥²’–ƒâ¢CšsŠ›Ú¿ž>¨e­;k)䇤T×#è4œfÜÚº>¬'Öj1SÙ®+]hK§êw›ü5 |I>Þ÷ÿgÑýÇÃV#n¬8üY«;dUŸú#Ð{¥ŸKùt.ÏÞݘJ¹Ýêµµ6”ݪ‡Satg"±5ßÞ¸gn“Ñ“ÙÈÅ\ør,x6te`_. ÄìbïÒÌñ4ó`žq¬áŽžåá3ùÀ©‚æY¸ñó7’¸¬èQ¥còÚƒ¥´¾Û”÷ `=KåÐFƦ>?_ _â×+ùÛÅüÝÁ”geâ\1±2ÂA Á4sA8(™.Î/gFG‡x„…gÐ!ÆfÀó\XÊDF(0N0ÝÛSåµq»ÑŒ¯·Â› +^ýWÌTOhK1é÷³á¿KÿGÊö gúL,5ƒ€+ µðjáLS8¯y¤5ïBÞ§Ì™×TúVÜR¯d½šgÇâ‹Kž ªË~uέÍGWJSùj¦R6®-å„5’ÿ½!lJ)ߎ…/— 9ÿb.´ðûvã?wçßñ¥FÄPëJžy`xËnCÅkV¨³4âúæƒòóqµ[{wσ‹_IÃçäû^ ˜·î×|Óµ¨¼WV"1ÔµPwË5—ê#ªûõ¸ñóaéûÚüý´ôûéðã|Ru)¦o¥6ÿùvÜòZ^–E63¼¥íÀ¤,OZB÷‡¿“Ë¥K­K6º=Î<‘/…´“Qö‰³6ЬÏÒl*¦aVòó$G1Ê]qŽ9»‹œÿ@È;œgzWG¢G‹É³ù—+õãÅâ“wãü¡úÝ©ÈÅÖŠ‰ÕL@öæ™HùDé &ZλU9¢ÒÄvæ.$c“ŒþN6ÊY YeûzáÖ¼`~pH44,PM ZDç ã±¥ñÉa‘ͧ³ÝÇ’æÓRóÖܸ^ùùzùuoiD„_šÏÄJÕm®y5M¯°æ›«WšIk Hš°´š¬DdÍ;ÓWÒÚ: úëù¢éÛË_©›×à^íe½ÚG»äÕ©È» gò^9ÈèôéBÁgª>,7î‹~CÖ®NËr!UíÑR‹£•Ÿ²äSÔB’ï»?6%”€º_úëv»î”f“Å€¦æ×6ï _wÆ·%}9›‹'—þ¸^­•äkICãv¹q»ôwÏ4m3bÎ]ª³mõÞÚ|^û.œ~<ì—bÖjB”s+²S *Qs,TªVÕãÚÆ‹áWÞòû@Êvóú¸p¤yܬÄÍi·äúBsÏvGºáS)÷B:p"bìÍA[dyˆv ælNqe]H£,²¨ÚÆÒ}e†±ü:*úy¯¨èW—o¶‹î•ü±&u¥z÷Î×"ª¯Øn͵\ó/5“Ku§¨t® T‹¿Ÿ¶KöÕ´ÝPt*ó—òª[QnË=SöË›×æ?·¿bËõä3±ðóq½•Ü™þ™YH›³Oüz;ø|pTbe¯%bï¨^ËyDi‡"åÐ#ú º± 46påªê™*¦ÎÕÄV=¸\r.¡ûÒ Mh€ÀlåZÜ|\ú~\i­©mYÐ4äÜ|pμú%™ÈzI5 ~Û›I(Çl£üý)dy–¾LŸàÀSLê$ ^šáȇÌIˆÏ§óxì±Q‹ÈÄ!ó¢‰Ï· mëc¹¨¢5|DÖ?C«M—¹ZýJl¢®BÚ0Ú.psÕ2k›KyUE¯.ã’æ¼’zHYêÝV ,yþbáåd0},¤_Lµî4@m–¦jð²¶7~Ýž|ÞÛ¾ÐGoKŸ™Ã:ðé~U) ¯ñ6þ ›?Öœ¯……­°î+jhÆôõ$ð¹€µÍõàB- ªx y¿¡þjH›u-fÁZ ªêÑ­R`=w±Pw/ÔÜšBHT¿úJS°Ë>b[­ÄÒwÚôûýðÏìů°´¶¾Gß©à¿_ÃvEÎ?•½0g åÐìP\·Ëå¨1ïÒälª²KS 1©|ˆÊ€ QšAh3tš”7 e²Çh”6e˜LV"ÇVö]H˜9ŸÞ“>; ©Ðbíe©ì3½í+ˆÃÆü™&ïT”“òïÅí΢m^0D¡ÂäŽËòˆLà!dð»ƒcãC£#ÃSCƒ¢©w±q¯rjÇ “þÝù  ?Ÿ%íY¬†µ¨ú÷Ý_w‡-ðb@¡ü¸ûùpþ}»ÛŒ®æÎLY—®è0ì Åd%‡ºÑV#µàJýn½è’\S/È\ÐHéÉ»ÛPŠí~ÆO[¡­Rp-ëCkšÆ²êS½»5•ˆ¡^jÆV¾n,ͨ±ÝhD·*þ•rÐ\‰k¾% ^ÊAi%j¨Å—ZQ+:k;¤«ø¤ù¥5ʼGžuÌåÖFr·umýx]~³Ò-?oV¾êzX¼'ð¡€m+w`«Û×J'ÊWÏtæÚTo×c¦ZXWM¨?7¿â+¹½‘·SAöf©þ|RyXÿšr.eÁo fæé ašA–³¡¥Ahs:˜ m#›Cˆ|q ½Ðþ!txˆ q¡ac˜C× #‹dˆóñDNa„HÑO²ŽdÜB\þïòa=¶Zð3m*°œr©S—ãyÿt#.¢ñÙ>õêŸqoÖgØ |7‚Å#ý$jÂxòÌšžŠ&fgFc,æÐ¦aÀk™4Œ"îáí¹8íÑ£]a÷À_j¸,e oC«•àV¨å YöX•¿’fÜJÊn¬E‡ùÕ®|‹jÓNõÛ%ºã—‹€®Ì¶½–ÖÜú¢ÏP›χ¡ζ‘mtǸŒÛ•Fxµä3Ö£ÚZÌØ¼Vÿ¼µ|Ä,¥£¹ôù$°·uïJÎ7[¾‘•}*€¨Y·,P£ŠBP\÷iKM!°”³O—‚ ¿özoáõRòt9òî•]Úç}AÆ).ÚTE‡±äÿ=3E[ ëks1¼úýzô_w[?vþ¸Ûýõ¸ôù¸ñ+sú3d¼Yz=—d½ÂRTVI˜êÛë°°[ Kñl::[8“dlò7€E¶É_/ÛÝoó‡ga“*eA*"áÑ×EÈÊ"CNƒ$cÉu„Æ`“葌H0‰D‚HbÓa.fÁ… þÁ³aè`‰çÚöŒd½î4 sáår\Déó™4ê¹VÇNTƒ«ct9aÊ$ƒ9Ž óÙD@çÒh8Þ@1wˆ5ÌgSú á(kEʓٗ;óïqs#²ÿ]iäUŽþ‘_ýùvñu,?Z¥Ÿª¯Û_÷çŸÑí§Sí‹KR¼‘ç\†§ÝÙ×ýÉÔ™èýx6e›)ˮմSRŠoÖã@B/ÕAŒâÊÏëï¤ù3¾Z>’£u&·ÖÆÃNëÖÔˆj“âÔçýò;cÝ¡}rks·–¢SQ°Í3/û³ogsïû‹/²g»¸ø—£¡÷+aúr!±9ò~%w }úÔ¥èÉ9›qk#Û“—¤36žvª>KæX™Ú“dÒª@–k‰•b|½]A+ï7J~k5bn>­ÿ™ZýãzåùHs{0 @à;yÖºÞyÝysñÊٵʩ–§B´DÖ®‰\Œ<ŸÛãÈ4£‚qòšb¡½Û9thAËü‡éÐ4hIîÃàq=d<±½­·­«­³€Åú»Ûá<ÒC¤ö0ÚUx…{5îÕ1ÿ¡È·5}iž8×°.waÇÌÍÞÔ‰`À:Ç7ˆZSDg zù4*µG…t,2‹É¢PœA°d†8úÉñðèø{BÀ¶jø)ÿ::Š(jÎïækWš ¼[ÿJ¬ýº?jø—+çêŒk²ÔÔ¦JT[òofݺ÷KYþF•õ*Ó.iÙ£x¿~:.¹aͯۓïävÓkiF4_1k-¹ñy³ùõ¼õççÇOWs,äíÓY×D!¨hÜ®þº±µ|ÚFH^)²Ž©—KIÊ&Ë])›ÉõRÀ˜ ¨SmÖ£/Ú-¿’šÜ¥øýRôr8õx²ˆ.‡¼”å/´/ 9EÆ·X ÎÖãŠçí_ÏÛ‡ÍÖÓÚï—ÝšGYoþu}ùŸ‡½¿nÿãÖÑŠ«¯šjtçþxöñRšnÔý{Ù3`œ™²Ô‹×[­Èfű”ÞQ†–G½+Ó¡A@5ë§ðaª€öwñq&‘Hé ’Úˆ ~€JåÂÔ!2L ±qZ'¹«‡†í¤áÛHø.¨ ²ŽIgÐ)L‰ÆÄãHÄ™9Æžubs’¾#†÷æ6/Í#'’áK9×k^Ÿg+øÌi 2Æ¥‰F:sŒ5 Â'Ò/Œ¨†‡G¸ü1®`˜Ëâ#Ðà }t€A ´.Ú ›I®WÂë9§¡ùdùWÞþïüá?óŽÏÇ«_×Ë_×+­—ãïøZÅ®¬Wò~S.D‘¶˜¨‡¶ K÷ûâwP§ò‚ТòdÎÿ¼ßn ½ñ-÷ÇŸ»ÀV|'6¿­äZëv½–£ŠÆµþ#¾\hïÑÔÆjD½(º$¯çò§ÓÅ‚MWõ«óeÁmMÛ¶’g“¯6 êþÜò§KtSâåj.|<ýâ˜O‡Vs!å›W“šIM#fh„ÍŸ·Žºw)瞬„(kƒµt³ßº[k>,½l5bêk%¨Ï„fËí‡o=ïZüãå¬ì’eB²æíVózëãÖTôËsYíÉô•1¶ž5E»ùé}N}{-l=)Äý4 ⣧ªÈÄ„`ėʧA#ú8‚(' ƒÊƒð¹êÅ‘{¨=0¥@$Sè,ÜO'c©…*@èƒ4úBž§ÁƒdÒæKõÚ˜«jqë×ýò÷óÊŸ‘µ§Ca.¨ÿ?ÊWu—&z2QòÊ+v-Hüj\ |ЛI˜ç†Ðò-Cöbâ PmTVs‹…ôÓyÚ¡HhCKêYà¢G’É4„ÇF”"æÌ8—Ãà2†¹¼ƒÁâƒÛM‚ûÚz†ÇÙ\ϧ©Y£|„ˤÍ ,}tˆ¾0IŸ¤“µƪ?Á€™ˆÖGb0©3ÂäB½d>FØL˜Ï˜f2ЉLÖ0Íã!0 -“…~å"L&•Â'3íWS¹ÄVíæøûñàç½ç#´WñLŸÒJ¬UïÖ+·Gßo¶ÏèQÅiÉ©Þ.Å/îů‡¥bØœ ¨Þk/§’›Í¹»sií]ûµ´šÿ™ò5½[ùà( µ:0ÂQ蘆áÕç=+•Àj9,Èt,ଚ_[ ¬´â¨ Šhó^I`~Lžò© çÀ³hªù•þy[š²“Š— å­}6çU§]óù ´äÜz_¯?¨ÿÊß%и]ûŒ›š‘ÕVx£0•+¼6TB’ºSU J>’KÕ€ªy­ÿ绣\ªÅ5ß¹ó_÷'ˆ¥.xøóz¯37ß´_Ù¥?o?"–ÏgÉ?ï¥>I3d,ºõâûáÃöDÆ>_\·S±½müD%äÍŒ0%c¬Ñi›Íb0i¼ÁáAîä cn˜3;<<+Ð,ò¦Ñ)HˆB00Âá ñAèYc\„‚PT:K"ÀDd˜9'` p˜>•Ë¢Ž°éÃl&‡„£ôR暈N›¤Í±™óÃ\ã Gð`d’ǘá1fyLÉ“Ρ!€p™\ÂíèdHfyÑQÖ¹–uèÊ~MÍ+ÎüyÓ6b'¹²d·w—¢jB[‰/×#¦ŠK“·‰3Àv*Öé,ãQ½‚¯^cΫ,…s°Xˆª¾³û_Áó;ÛxÖÍ«…5¨©™ßúʜՂ'÷{Æœk¹è1¿îò>IíQY[ZÕËÚXÂ>òÇÓaÔÊ|\c׋[¿Ûw{ã­‡¼K;z8›»]›ñŒ=:”͈áå`¦5ÿ™Û+û&ãVÁõ± Rüº?k¼ïÿëÍ[òòWÚrx®YüL­×âê´]VNè*Q •­è³³ÀNÃ7V÷ëëQÍ¿{_ÏæŠ]“Þ™}ÚÖn7 sêT“¶ÞÝ’rH^¸”½ž-<Ï—c’—ÄÜׇNN`Ó°$2¤f1èL6LшPYT‹Æ¡ 2‡9@±ÒØ6ø7H)“ÆfÐùLΓ ¡3E‰l·Ÿ3Íæ0ÔQošÀîì!ûh˜´Ù–p²>½¯åŽÑ˜KúAˆ«_â,M/ rMSÌÕ)–’OÍ11½ŒN LçprcBÂ,uÿ+sUž–#ºgŽÿˆlܯ–ÒÏ-:޶“ßU¿ï+nÏT¯—†|XÐ2‡z™É’KXqŠJ~YùNõx.~?¾ž3~ÕçÓÞó®2mWeHnsÞíÓù«ÅŒM]sh¦¯×%/ž™PVW’·=E1¦ùù°÷r5^ˆ(kÏú²Í?“å}òꓪîßÉ*ÞmÊœm1¡*©ÊöŲMüx6R@k’Í¿Ÿ®>ãÖBÂô×ûꯥæ×UÞôßiןg_ñFÐøÛΟOòjØ ¨üî@äÚø§yQ>| ¢BZS!ãð˜\>‹@—E£±B‰ä°ú0‡F‡™ý=Œ˜>ãñœ91Ã2:HdÑ.V¸›Óƒ‡Û‚ÐÁ¼^5Šh¢ë2Ýâèj|–+FÆXûjÁæø˜ÇçGH4à cáŒÑ)clÚ0á“‘e4ñÇtC|áà ‘HåPCN9¸“¹3ÃÓ¡´’\ûãmãÓwœÚSC5iü_•Óšs7åA‹sþ»}]Ö))Úø^ÄÓ2Ô|ÙoÔ¹ ¹×UŸÍ夸’Ô×té+ñ«GWhê7âϤ²r6Xõ3¦¹Û”E,Üüåt% dØF%ÂýŒJ ^i&¢Oµ!óä­eàùLT½™üÏ›RÐNô·Q!"™@2Ì"ZfY's\vcfÂD*¥­kt˜¹6/\å*FXòa悳¿*’¨9›ŠÙ¹Q†Ì08‹PTëÜc«@7Ê–L²S|dhŠÁ˜„•&|V0B§Ò’YÆúø ÜG0QNŸdÊ™"þß}XˆI@·Žò*¾bxl”1ñN8—ÞNey‡õÅ¡! ¹¶nO–ìûÕßîŸñÝRP‘>Ÿ¹ÛæÄ.‡nœ³þ‘ȹ´¨Ð¹“=—¦œÓÕ[åWb9ã1£Å~‡†Â2íS~Œ-¿¡Ôfíš\È÷ë žÅÔ±¨–”¿ïU\Ê¢KùîÒpÿŠ©#Ö±ëã…g»$u4rJîN§Ÿ/&rgòûÕÑÄþtx‰{{¶òp$³×ýRÚRði³6e)<“w/f/dY·ª•2 Ê'âgÛ»M’ ‰*@!éò‹¯+‹7Ó›%ç3ÜÛù½‰|`©”•\²JÔ„ú÷ÝN#®ª<ŠaiíÆòUð§÷ åÛÑÂÝ–ðýLÒº1½{f/,Ïò`R70„!‘zÉl2I \™£ú6YÁÎîÊ莖+°IúŒŽµ´Â•(Ð ÂeÓ†X3HÝýØ>Kd÷b¤)a¦f”¡äqelÆøÃ<Ï™é¡ð 4L™c1ULÖ$c`fŒ&A84ƃ‡Yð>484H–4H§S ˆW‡õœA ªÐhø°Á@»‰Ê?öZ!}þj.Xù¹ª_îÜ‹ûdæXòìÿ¬äúG]öéÊWºÔ¶ôîTúîUï U¯°à\¨%¶>bË ¿ü}ª”Vkq]%¢nùÌu—¼ukûWü$ëÒ—¼{9ïB#¾WKj _B€ÖMy‡¨^+zR®™ò¦ìT튢ký~m>y4Vðοû%õ‡Ú™úæ\¼êwD[ôkó—¦Ç3 dLu¯&ï< 9»µ”4F”Õ¨ºèRùÍôë~þj¤õ¼Ôºu4£Çµ¤±um©ú—óniÉ­­¸Ñ–‰è$—9©,ºEE÷ôë©<±%|9å½2tŽÏùBñ ЫðÎ-ÎÝ+žÎ•Û“öQ$q>œ¾.¢{mP7™=00Àe“ðDñ(M=ÌáàX<˜ÂFX`-m҆͜„ QQ&])àÏph㜡d~ލS¤D¶4,£Š©ž`‘ –B1¤˜š£OÍÒ‡¸ô~˜Ê€!03 ˜Fê!õôP{zH¤vV?Lû#2!„΀zˆý¸žÕ1¦™?¸ÀæLÓ|ZødñþДñÈËÀ€D-ÍÌÙ÷óú??ÿñ|øÜÕï·íÿ®Ù~?íU|†ìábÒ©*>˜ 1YéX mÝ)µIß.åè9šó¿ËöŸÏâÏ;Ió@˜>yq ó¯KåøIùv¥qgùL+qkÅn(8Õ¿o¶…Ì¥0•æê9·§G›“HžÏ%Yt¯¼â•¥/´wgªÇ]Yìd2pÊKœNßžN?\-d¼²ÛXåÁ\r+ß\sŸïÎ*:{E\¿[®—+^MѦèýx>s±Õº?ª…޳ž…FÈÒŠhËOú&pdŽÙ?ß-e»$휯¿» ‘Ý‚[‘÷ˆªaý×íåWÂðù¤Îèãv½ä5¼;o/x§swG#ÏóéÀܳkÚm|òŽéXx"ŒôÀLˆ üÎ1©ÙŽ¥ÉM9wq%@ØdhdlÀleé„Epé“CÈègd€3=Ãb°¸*• ý ÑÈ@O)Fcq Ë >Bµí>µ‘,‰ÔA"v [ÄøÎ^"îÅP5†qdj ‡Ž>„™XßEÒL ËØÃS¬!Bâã+YÕŸ«%ç^ȤøÒwr¿Ø®„¶Ëž­Šwõݦ/… µ¤ª•´þ;½öyY>7g7å1ËÈ«KRˆIÓÎ…’_ñÇíQÅaÈ]Éž7'¯‡›µã_qOÁµ‘w€TÒ†W„q›¬Ž> 4U–ŠCS)/h{¥0ÿVq.„ …+UÁ9—÷(^O )›$¿Ÿ^Î ïWúûK)º1eW¿È#‡’ü¡ˆ>ƒP5#–ZPžvk3v-ZR3”|šœ[—ó›Ê!3Z‘$}P›Û›Ží|ÄÍ :¢®4gÏgó^õû¹ôåL\ºÔ׫ÿ~^¯ºµ±]γSYŽî6ƒ+ùKÃû†øáL»T>œÎÇ7gŽÆ–áÇÝñ=ŒÅA2:»€Z¢ÐGé›EgSYCQéd{€±HíD šiD" ‡îá ÜCEúˆÝ8L'žˆ%âz{ "ÈG,‹Î§ëèÄöüèëÀvuôâº08BžÒ¨}=Øž¿Ûîá°XÇ‘!á T¬‘(§Ç†Øô~Æ(Œ„ö)—¾ìSU€»÷«Zw‡ÿ³qñ×ëé÷íÁ×ãþ?òÇ?: Ÿ¯“ùk Ú+¥oÞªŠÕÜñìûÉôë±,TÔãòúíÒ2±O÷Aú\”¾’g/$¥€¶ÛéõJóâ4•#ë¿&ï—ÒüátÖ©h%Ö[/·¼`—üŠîíÀ„J öÅ¢S^õèŠ.ýë•úîbñÑ#sÉs^Iů¨DL%¿¾ä’䕇º–ý¼Ö·®W›±¹¢Gž ®~Ýmüëv­\*{u…ÀÂ×ÍÙw|·•Üj%—›ëÏÛ³o@ÐnUÙkÈï‹sà·Õ{ “-™ ²ÖTüº‚ßT ,U"ÆŸ×êfT\ˆÉß¶&ÞÏéžf"Úñ=-÷twHÏæÐz(L"‘ÔM¤¶©ÝÄþ6h< C¡´áimÜ ‘IB¡»´uö’€‘éìÁãâ)]ÄÎÎþLÚ ƒÇà,Ĩ‡ëÆô÷w1ÚÚq]í¸¿ç€£S–ÛÚº1}XÛÓ×ÝÙÕŽv’ï¶á!:È\*¹tA“¾d„'è0D7o þÝÚùno|£î·—}kõÛzl-LºYm%õ7 ËaåÇÃê¿_ßÞ­ÔöðýÑ|Þ!)8%Y—¤W7Ó{ußÖëæ‚eÂ5y™ÿwýèóÖRh+!90³Ù«å×#Q|s yÌ/º ý N]Þ»Z ËŠ>e!(mDжµˆ`lÖ¾™q‹AmѧÎE¤¯ëòÛ­¹´c>oW¦O”ñí…¼S¬w5ªª'v*É¥FØ\uèËWŠÜålÊ­(‡M͸õ÷Íy5°òP”ï—+×Æê½¡ñdk=ìüNn|%Ìõ¨©°|ÝÒWš¬m)<^p óNS#¢(ûäµ€)çžÉÄÀÎ×ÚÔÆdÖ;™È¦yÛòˆgsòR Ɇw†É$‡1€÷!XKcÎÔF84ˆE§±: FVÓI$È-Gaõ!0fr`–†ë¡`::{»1D ŽÍø;[»ÑfzÚùßÓvz;Ú‰í¬Î¸Þ.<CÅ÷ñØvtL^/¦‹À'! *mdt`rš-*f‡F` f(&ŸN—žÎ •ànói¯àZº;Õׂ‡ÑÃ_·»_·[o—µ¨Èæ\ÌÒ|°þ|;n]ïÖ¯­© Íý™0s6üî˜}w‹Êþ“Fdÿûa­|¬YÕ§N@º)²^Å›s¤ü•äébááB’¶««~U „ծ̻¤ÅÈbÙ+¯Ú49›¤mŧ.¸€ŠS½íKòs1nÎ^)ß:žÅ,•¤q£©†ÌåÈF#±QòͽÊûƒ©Øå\éÑÔ 82GÚ7»´Ò6»ŸIKïÎìOçÎQk=¸V¶ËJQÕÏ×Vd)mŸ}»œ üî‘ç"º$ø¤«µÄ6ÐØ¹+qÆ9“·i a XÕ•„´p-~?<›|X׆¥^ÙÝijíL˜‡¨ý$dЦ†,&Ã0a Al¦’0þ{0+Ì Ãp'"Kî'!àU2BÙMÄ\íÄ£WP@0¶‹ÜÓÖ Úцikëmoïý;¸ ĘvlWW_†BøAjoëG_iÃ`: t~+BCM46 ¤shB9%ñnùÿ~®G¶*!KþèÌÚURS M×Ó°®â±¾:æžl“e¯¹æV7\j ¦ù‡óÅ”]hÚiÊÚ¦ñ“™Ö«¶y­«ELÛ•úÍ~ dAÜúï׋†Óøv:]ò«šQyÉ+ÎÛÔ¹3eölªÑ6ž62vt|F1*Ê»‡3>åÝÖtüx4——жK⻣ÉÇÓ±‚S•”×ë!U#¶Ü|^e´©+e%lþ|Z®ÆÕ®_ýˆ|%ÐA¢­ÔÊ×ûÚWþì#ãhÞÕâ«Í8øqð2×ÒtH“>”?oO¼ÙõécíÛÑTÚ#ÌDYŸ¬r­B»úG·š>CáHQ8—”ìâÌÙÜÍùxäœ{©Úç/ó˜Sýd˜øƒ Óø„Þ bŒä3ËèÇ’ðXR–Hê%ºH½´t¶± ²<ŠïøíèêéìÂ`zq==½]?ºÚÐi,]èô¶ÝíÝÝ]$J×A&tvLñáQ¢ô‘á¢l‹ï§ú4˜Í¤„à\ÚnY>Twî<ïëßýÚÏkc-j©&Œ_É­ÏÄf#´ÝL®}=î5‚»hÅéÝÒïÜþ2gu·.ëT>‹îOfžŽ…onÕ›Ó\tiÊiéJ—Ù·¤Ïõ9Ÿ*íÔäC›i‡åÕ!/Ge?oöZ7ÖV`¥t¡)y¥hïÊÄZëñ¨]Ê´9·äÍ©y¸4</Þí _ŽÆžf³þ™J\“ºÜŠÏæ2EáRõz8Ÿ¹š/…åÕçõfÄÜŒY[1KÑk.^ªKÀµ¡‡å92ãŸ.=l–‚›¹+ù˱9z8û0bæbÔT{\®Þ­>Š‚Ë‚Øþx>¤¬Ý«>%Z¸åSÞ¯²n·Æº»sÕ빬v»×ˆY?’ÖJt½0œË÷VYX6´Ë—/e"ŽÄ%# x€M¥‘ 0@æ^2 ×ÕCûAÁx* CëÃñÝ$| ßAèë¥vvôwuötutµ·÷t sëPøB©Ÿ€!aèø^«·Ÿˆ¡ôvb‰ý>úh€20Dš¦Ãºjf`farI”^R÷<¾—N!Æ4.—?ÄãqØc ^,dú}Ÿ‰Ãû˯ÛÍŸ×[ÝïýñxÚJìWƒ+%¯*ïž/ù– çšì‰"w¦ªºtÅ UúTüp1÷p¡y»RלšªÇXr[Ò.S&nü×ëÖG@“ßZ-‡7_l¢—ö °Ûãy݄߯GVKUH¦Ðj3´ÖÐTuŸ"s*¹Ý=ìÍ?Éíºä¹ì€ƒ]Ò¶ä7§²ŒSž©+1ÝçóFɹv¿;QL®´Ï«—’üéB.¨©'ÍßIëÏÈjÞcIŸi_Ï vmÉgÌz%Y÷bêRöz¢Ê\Èàd.åï—êšg9ç4׫U·í«Mûx¥Ê‡LÕäZ-¶]‹í\–Ô‰8ï3—ýÆ’GŸè+1 zÊ!z¾˜|8›:™Øû ,v\SuëÒ§²×ã…¬KV (+AY9$mݘ¾n· 6E=,ùJJ>nw«¡å¢g<ã?ºÔ™€,ï[*Í@EWüú•¦àU<ê´C’v-ÃârXZÀ¾¸˜Í„$Å€¡ê_*ûõi¯.ï2¤mš”Oš»–ƒê”MŸv(óUýÆÐxX­õ¯‡3aígAàÑ |š‰ÝA® ¦t#C¡ö@#䤫’` !“éý0½Â€ L&e˜B£#$– u‹D„H$×OìÆþÝ‚¸ó£ ßÕMoïããú†{H, ŽÔÑEjÇÌõ&)TƒÌ#cÇ`ŒŒL2è\:Jìûñ£d}{gÏNLW'žÑ\ÀxˆÅƒ7wþð¿²û_+M÷fÅ»Üz:ü™:úù¾û[ýˆ›>_6þHÙ›‘í,Z†´PöNg¯„o6ùí™"¶!Ž¯Í½: ¨¢¾ÙiÜ®âºÒÃR1´^ð¯–ÂûY§õþtüþb2í4TcšZrˆíŸ×GõÈI.ºÙ¸ÛýJ4B†b@›¶©Þmâûã¹›#ùÓ™*u!{w.¦<¢|LnÑoÍ8—ÒU)b.„Ì•ÄÒ×µ95qNÿ|^ùïüáçÍ~5´‚[Oœeì[/š÷Sõõ¦äöRY}Ø«E­%×BÞ·øæœJ»§šÑ•šw)ç4å®4w;³7…òµ²ÆœÇPpš SÊiLÙó®¹”]r¨2àuÀ#~sÉ¿žµ-?;”o^ÅÓÉ´oiòP:ªf1ÔQq@SÙT:‹CãqaLfaè(ƒ Óé0‹3éè)¹aæR Jo?è(`|º{~”Lš%ÐFzN/•Þ 3°0»—DÃàÈ=8"†È¢R9¬~˜‚Y§ôb»;º0m?:ÚºÊÂtà8dtV)bqiȆqö×Ý^Öf,G-ÿgÍÿßÏç §¾è0å]Ë¹àæ»×”ñë?ov둽´]>x1j)Ä´Ù€þͦ îŒùŽç_"šRØTv.çl[oûÖ°~>².È4æ½Ky°6šRÐT ˜ªvCÝc*‡,Å ¾Æd¥3ÔƒJ`a^ìÒû YÒ&Î:ã3Öb’ŠGY´o—¦’s¢à—‚²Vtí3yZuî¥O4¹¨Ó–ÏôÙS}9hn$7Êô™:í2¼yÍù¡36|šÇÓ…È– }$-û”U¯5±ú~¥,Ƶµ°¥ì3|Ýš?­U¼êŸ¡å–ߊv‰®W¯÷Š!}ø2¯6ãR¿ªÞÏà}îÎgÓ~q#l|=W c6!+¤çùµ‚óYxc˜¨e!£$„ÒÓÏ ÷²˜“@a’úùlhŒ Sv?…ÖO¤÷RØ=èC;‘B§@|&2ÌFØîíÇ·÷vÕô£ÓÙGnu“Û{q]m]]mÀõõþÍÅ}í½„6ðA=m˜î¶~lG_w;:+­3< ×ÑÇ@t¡R`~ÿÁ¥âÿVöü¾YiÆ–jуJtåëÞü3½úWþð¿~G–[ɵßw;ÍàJνº³6|Ë©ùÃÁüÝØc»\æ$Ïf‹>s5²T¿Agš<ælTW»Y+xÖ³gKy§!çY*W7+7kß7»ŸñÃjt³~»Û¼;)†ŽrNYÅ1]¶I^O„·‡c)»$ïÕ7"[ða1¦)¤OûÂäÞèÃåTίo]/ÿŽo×CY·!ëÔ|Ý®ý¼Þ)95­ëïÔE=aIϼ¹$e÷bÃ+ö õ?^WZqU%¼TìÝKE»¸‘–¢šëC‰ouÚ}8º˜| OUïÔ͵6Ù®¬Göz‰vKÎØ€”’< ïOæîfŸŽ'ž®Do~õãùBhc,¼9á5^Íñ´LFo_± ËÂX0… !l*ÌeÃlbÉÄn2p4Ì¢’؀Ĕ ¤-LPµ¿Ðõ¿ƒÕ†%µaÈm\^¨¥ýцéýû6§¯­ߎǢs*Û~ ãG±mý]íø¾ؾ¶^Úõ‰ÞEC˜äÍõ©ï‡`Û«IpÍðvÉ®*ØôùcõûÕ\:0SK®5žv*ISÖ©+ØuÀÝ7“G­äv ÉSUhWÞ>ŸˆË~qÙ£¨x-•€¥ÐWn–Z‰ÝZà°š<(‡€ÖV}«õàN#¾YlVý›e¿Èã|À”ukSîù”s2”WcëÐzÞ˜¨¬2Z'ÉØ4yŸ¢–T6cšª]³+Ó^MƨSûz®|¹’ÔÃê¯k``õUŸ¥`×”ÜÒæ­-µò«óg³ïǬKY)óžÅ‡‹é´w¾šçÜ‹×ËÓÍð•Qp¡åÛLÂsýÄ™‘{g6ï-ÍpaºŒ_]@•Ûê»s9ëR_þr%{vŠž‚ûã™Ûù͉$¾»è7_©x.ÃÀ†1@"1è¦`6&SÑ}?<¾¯·«£§«­½¯«ׇëìÄvvöc1T,ºµ?êêÂaÚûºAV¢ãr:€«õ°?Úú:Úðh·Û¿ímG['¸º`0]}˜8tFðÿ5X¶½»»¡H§`)„¾~2ÈY˜º·-ùýæúpž”+ͻ寇ݾŸÿ§tøgöüûÆSs/W‚sÕˆ¸ÅjÈZ‰l4‭ˆ²âU¼ˆ|&T"¾zT¥ÐR1²T¾]ª^oTÑiâŸ)ó×ó^)°™q cýyçëõâ3¾] ˜Ë¨¯—^B†Ç+ÙËùbæLS²Û"©†Ð]ýœ×ôn—ÖcæÏøZÑ¥Ì:¤ïUÖ£-´¥;}ón¿n3íÂú˜²¢ÛZô©^âWû|1¬D»kúõ¥°²Y.»×Þ¯Ô)z\ôÉ¡¸¹†öž•ÉÀ2? Äí²ðpqdG1°)clŠé{Ræ©qÀµ=·Í–B²Ÿ!}Éeʺ´i§âÕ®º='÷%·§ÊÛSÙí©øåD\p®Ä®Uvd‡ç[½Ò ާ™KLd‡`zúÛº0K;0íè¾6jG;Üñ·Æ´õý5´êß[èæ!š˜íà›ÑðaÐ òÜÞÖ׎Žó8Œùÿ~îøiïÂtþ@S¸óG_g'ð^B7‰ÜIÅvö“:a|; P_ÿ’q ‘ÝøgÙö}»Òjš!m¸ƒ­Å·KQåNñÇû毇“zh³XȼŠç¾ó\ûÑqh@JÛ¬/ŠÜ¹¡zi©z Ÿ ÓWÜ\¢#¨šÑeà7ëQc-¤ÍÛçKNU+zØ m”Ýš7›ævOuw,~w‹^¯äÏ—âßtýÖð•\G¥¬ÜR ÚÛͦ}¾§y÷h5¼P±K²G’bÔúù¾Wóè¯7&oÎfòyæDóz"-:$›žNÅ·Gœy$å\É8»sL±Ž1÷瘇B¦eŒ>Ë¥ŒÓ¡14‰P'˜1L–zœcÓñÛ#×WÒœ[ÛècQ¼žË“‡‹×ÇÂ'V`‡í²”Sôx9ÿìš}vŒÞ^Œù6&.Uûün'„i#ôv÷œímëÔ lÏÜß{†]=h¼p¸v|g[_Ûß‘úߑڽÐW:;Û;@Ô0=x€ÛmmØÎÿw žÛôw`ð½ý}½Ýݘn<C»Êôý}aHC4*‡ ³‰4üH¬*æ6ÿ»áüóÅÖŠŸW=›9§îéHñnÓTË­Ûe X>â«5¿µDrD÷+iýu»ôûî¸á]É]I_AtN$›3™‹ÅjÈPoÕ£G­èVùT‘:—¼«…sSæD›n1 ÜÇ^Õ¿\pšPÁì´¾^(žÏ¦ž/¦3Mh3¦ìV½²"àkÏÒÓ©øþJ”»6•cÀ‹éj¡•²m9¹P@§9X A]> Ëy•%g7>ŸÈ_O%YÛÂÛ¹(±;î· ø­¼°ehg’=Ï¢ s¡Q>uŠAá1©Ã0u‚Fž¦ƒŠ°(È™e!ã,d˜ƒ Ò ˆJ¦Y4«„{fôoÝz„ù°"u,¿Þ‘\ï NE)›üfO;½ÙŸ [f›“O{Ó “ ´:~{85 kyG!¶÷õµw1½Ô^„ÖCgô’Éäq*u˜M@@&ýÝ~¼­¯§(^4j ±íL;jcöýÀãÑUуiG¯nÀÒ`% ¬ÚׇބîÃv÷Q€BÝD%P Øn,¦OÍ`O3˜:±Ó!™‚ŽÄ•sMÎ¥+Ý-7Nèæê :¦$i@ ¾ßTôêÊncÅg®Ý,ÿÌýU»ú#uZô.çBêÜ™üq_’ñ›+Is%*T˜ëþîB BÏwÄVkÑõRp%Ü-†6Šž…¢ORôëŠ.UñøÖ¹»ó¹»ãô4KUö®5ük9›öÝ)ͺå©sùõ. Íݹ9z0ws1óîB£_p ³~]Þ®MH3Wš<Àösñûéüóùlò`6¸:aW ‹˜–Yºf‚) Ã4 •A‚8d5˜E…hÈŽ–¬ÐY#—ÅaÀLð"f0ûf?DÇÃ0 ¢j縛 C‡*ĵ1üæÒT#ë)·öúl•Ì,Ì¥ ¢™­úÔÙÓé竹‚GRØóò×õ°¨Y—9ã2¥ ogšÿÁgh©´”AJzÐCsõÐR=¼Z÷-•ÎtE‡¼’沬_RõY«NÃóÅäÍÅè»s¡èÔ€·-Z3Ñ~Ôš¬S‘¹’¦mÒjRV·ÎaLƒµ§ªß­•ýÚ¼mxX¿±Ö#êbhµîÒ”½ÂøÒ¸G>x.çìÏqTlú8Ž6ÔE¤R&8èk¡ŸÝO`ˆlˆ:4Ñ‘~¸—LÁC BÐ)œ4&Ò`2à'j?Ž‘9‚É3<ÚŠ˜w¢sí̆/…7G¢»cÕû™*eWÜ_*îÎÄÏç9÷\ñBš9‘¾ÍÞ‹¯f«ãc\¨‹ïîeõ÷Ž@d!ÌXäÀ«È—¾Éf˜8°€™Ìécôw‰½P¶ƒ%÷ ÐJêÆ1!Œë†z;¸”~>ŽÀíÇ ¨$n?GÀA}8‡ôã°8Z/®´ ÓÓÑÑ÷£ߎá¨<2Ì¢Á˜NªRÏÏÄ4 n¾ IËçù+vPõ¯•<æŒCñêPdíÒÊ­îãæ¸ÞüN®~EÖ>ÐRmkÅmÈœ.^oN=.¼])@*zmœˆŽ5|ã˸À<Ö2÷¤ôC)ceй$b¯MK¹ƒ4†a :é‡hxGÄwÉà"àhT:µN‡¨|˜Î&Ãt`R"QX Šx„}¨ž°¯NÝìϼ^-Ôãò¼ ð¸øáBöî¢}ï½Ë»!w%;?ª£V^BBîƒpm“@•±©ÇCÐÖ´?H=åS×ÇéKØÀƒ,l’™EÝ…-<î “-ÀS‡û)*„:M%L ؈2HƒGTÀ#ÓÃd‡Ìîïc $®ŸÚ×MííëiÛK#uP ÖÞ‰kë¾iB†!˜K‚€íµ¬ê©ÝŸ7§yº‘×Ãò¨ h¡†WQqªŸ®F³nsþÊX°éR~y 5ò–ê½ñãÚXŽÒ¥ÉØEïAÞ#}>Pd<ÚVh¥â6WÂëµða5hmÆ–Ý®µ¢kÙsé³c!’üë‡1u!É¢E E—¸ÔAìœÊl0»´îU\¢œG\ui^lbÀ¹ùSSrCq}>—½Y,ä)àqlC9—°Ö¾Úd¾Õပ3‡PI½xDðéKÐæ4]3Š,/òíB•Ù ÃŒÈàP™¤N ®—Hí¡BdˆÓxt&ŸAb0¦Yôù1dbå°&øŒ2‹Ž¨ÇY›sÌc9Ûµ"¸>šÎ;VJž­¬S™ J nYѯ.¹UŸ6ŸâÊü…"w¤4 ñú >LÐ Q—Ð"ZÑ]‹l3‡¤P6`3‡¨á’e¤³ÂX$ÒM¡ý À]8t’¦‡ÔÞEBËfÐǸ]€˜±Ä^Ü,ÑáÚ Oΰ#W ŸM xŠcÅ›KQMè~Ævóní»m1z"yº’o &w?£[øF è×\îRò²¿øv.»9\HnÏ]4#ëùKñÛ)'ënâþlüæxôùB˜uÉë ïœêŒÄKZpH3gó© qÞ­®=n|…7 ¶©B\X½Wƒ—±èÔ¥ìâœKš>SäëïÇ*ÿÒðÖ"KÈ  AÔ2™Q…†uj ¤q.¶&èÎåѳb€:ϧr˜,‘É£Ðp$˜Lâ°GøœÉÖÒ,K=ÏÒÈlå}ŠÃg²FX ÖÈ™`sYb]?HßÕ°o#ŠÏ÷ã_·+@¥—¼ÒjXTõé NËÓ¾4¾6ò¸7û|n¸Ý] Äx:„§òéÐ$Ä…h„"e’Æñ˜Q}„JgR× I´ 2m"‘H|"f¦wS¹$ —@ec , i€Jç’¨\*:Cd‚Š#ôà˜ý¬þ>‹Ãwôö·uô¶µ÷uc©]86‘*„issŠÆbàÈ›Gã?Ÿ×KaUöÆ9Дʯ—óªc:q(~¸Z̺de¯äoG£"¹|e-6Ëhri6…Çó¥àúÓ….±9“uˆê!c)$þÇëæglýΩIû”õ°PäÕâÍ®+ùuï§r¯~Ö¹ýêœ;Zä30D QñèñFÐè"™FljΞ˜¥C´<†„M™fRçÚ3ð$&¸Kd"pYÈ„À26@f0`1†Ð§`dFÈ$@ÍT*‘ ©$ð•LÅ÷S¡^¢€H[Ó÷çî/f3h]½¹])£zæ|Hÿómç×ûÙ«}¢D7¦.$Cf„-¢0¦ ,½ Ë%c‡ §À!aø$ò •Ägâ‡ù´a&Y€ l …M' Ó9L¨¡`Ù0–ã¨X,B!"0™ HC%ôà‰è¾¾§ûG__¨ëŽ^Ü^ ÍÝX&wÁg„†&"‡À5ÓÓ¸¤wî—³æ’<ž4üÚæãáGÒò+h|Ü™¼· ¥=3µ˜®êÕVì㥠±³.••ˆ¢S ?^Š_.Ï‹¯s%²[Zó~uÞ.Ì]Èò‚¢s:ï–½ÛŸ/eOÕ›Cûr)¿¹”ÞÛeO¨+ÎHÿv©Lĸ”¾lJãûóO‡sésqãR‘=†w9ùKåë®äö5¼y§¦ì\+Ûõ÷û3±Í¹„zd¦Ÿ2 ¬Om§B0­¦öºq¸ *<BÆ€§yèñd>ƒ3ÃlâÀ¸…âQ6mŠÌ2i‹$çQGašŒ‰¬Ž°D$:¦Iyô˜]t›ÿKAU%²Ü­7ý–÷SadK˜8¤½’lDs³3Ø´éÆ—†øtBÛAÁai8LÀá»ðlÀ :Ž wb1}d,™€ÁQ°à°$L'¦§ߥü@ÕT{7HÒNb[_{d+PM,×\n7¶‡ëêæGWßðãs,§ÑD0²#ˆ>ÆgG½ÓÿãÝÒŠ*ÉÏøF+¤­¹Ö5äüËÁDÑ·P ZáóŠHb-PPÕÐJ5¦)º¹ÙÓ©äé\ß4&ŽÅÏvÍ£]’ èKw뵘`o6€Ö`Æ|îæhÈyÏòp`süælæöhâîhªàZÌ£=º³Ù³Cÿê–§²”{4ã5½_¨oŽ…×3ñÃñ7Ç|Î)}Þ[x9_È$ÅÑ}…G,`‘°@ä°Ñ1 0 A4\$™?DeÒ OÀáÐBPG„!1á‘i‹M&òªdœfeë†Y[2D-ðiƒ4„‹ú8ÙÃãÀS#´É挀%—0“¬…ú0™¡ÀËD¿m´™³þ~ØkF-µøz Æix?²Ü9µwŽ¥”Mÿ|¸_Dµa „Þ.R/Z¥†í©×ÕÓÌ, Jôñ¹×Ó†#¶uà{°¤öþž¶î~–ÁÀÑúq”^< t2ŽÞ‹§õâa nÇ‘;ðäN°˜û#Ƶ·cÚ:°mmÄ‚Åé"Âó©dL'~ídìÿ|²¹–K6méRVõO5"êjМÛŒ&y³©ò!u)a­ÅŒå€¥²ÔƒË@ÊVýêº[Qu+žŽDOÎżÏ0³“{cO§ oç’ü…4oSeö&ì’»#ÕÍîÈ£m*ëP= oo•áÝÉèÉäÓùP•é3ùëéâËàýJÚðH²ÛòÄ!ú&)—äùDz·5ë3MÜŸ¹¢lÝ®§ŽT.5¼/T޲ð¸n:‡Ådá %R)T¢Â„LDHsi0½ŸÌ€ð³tÊBâ`çé$3)Ð b0©ãDJGý‡HçS©<•SÁÏòˆ8¢ d€JãBÌq.s– V2ô'™dnhm{“ùˆüW`¥âÑf¼Ú´O²)î÷FÞÝ”SšöÊß½›ÏWâu‹ÑF"ü½£ˆC7 ±ÄX2†JíÂã;p¸><:³ƒ#!¨OÆtÑ{Ñô¤÷¡KÀt1X¨³—ÐÖ†ëùAÁPÐ3½x|'×ÙV¹Ývƶa€‚b¶A4*ĦÐG\‘Bì£iågU1ª)ßXŠÎÝÔ…¦ê3ÄåÞh*b‡yäþB”v)‹m+²òZ®ß˜ÿwUCE‡èíbäöhêîd>±Å¿ÛÆ­¢ÐÑÔó•2—ÃëçÊÃîB:(«:U¯'’ȹ4}1ÿâƒOýz¡Nl-:–%©syÑcLÛ…¸. ^´-fc—mIgG»H½9õ/6éóÕì›[’ñmä"ÚÈÚ„œÃÆQ˜:Dv–ßßË Q™DúDg0a6¡‡@Â’ð=D*ˆ,‚«"Pé,:˜šA¦v·Sú±,*!Ra I>Ãf ðÅ2ŒN²8CúÌúŽ;Gç€÷çr•‹Ü¹Ö ‹†'#,>X"¬i"áLË û4ÏqÉãåäÓ¥xów— å“çC+5·$ °ÅiÊž¯{ÔÓÛœ¾Ž>":,­§§cЦÄv<¦·§ç ¶¸,¥ƒÈÄÂØžNJOÔI&a©0¶—†¥’TJžØ£uàhX,Û3@%3ôòð»êewuv÷a ©)à´C¸v°„úéýH?™Dn'¼Ø5o'K‘þ»W cÁ½^òè³6uê\ ð3¹7yw¹ð}£.*ãGÂbDV™ »ºˆmîÙ¡ô/‹bÇÓéËÕä¡üfO±LÄw¢¦G–³-¾„WŸÏ•Áý±ûKÑó™.åÒ§€ˆ å¸üÝ&.Ÿ…wÆo/•™K£ÿHtœ»–ºÔG„¬â\,ùörNãíÚÀ#:îj=oÝìŒíMsz©ml šˆÂæ°YÆÂl:HTb"d¸ G¢ü áûaX*BhŠGxt‚!:ŸÅšd!C@³†™0†IÌA˜Äár©d2 íQ€Gˆ‹ŠA £ Ii<„CïãDÇãIÂqúòè`tyÔ»A´éë (tog‹i‡²–[)?­•}ºæýFrM¾E§öü Q{±@A=X&–̧’˜XéèèïèCpd6†Ä!“d2Û þ/üß^Äsƒ¤i d²ÌÁQ*ƒÃb’ 4.“¹29È£RxT"ƒºp4Ìé€X‚IT*ćÇáÀ;Ãô>*BE× @ObƒS©µ‹Ð¸›ŒkP/O†ßüÒªCŸ¾”Å÷äï;üûmöíÅLÆ­*„t•c9µu%ãàpÓ\ê0‡4Ì ÑÉ“Y#ª!d& Ã$ƒ4N&1‘i˜Am#1qT×ÛÓAéÁQº±D\ ®–Bë&SÛ:¸¶~|'Û?R;-ƒúA÷–À2ÃßUõ0XâÆ2ýÿþeÿ?­t/ Ž…œG¿\}ÜŸ{¹?ŸÏ¼\)ŠmÙ£ÿÿÔô~mkÛþ Á¸J²ÕöÖÞª–änƒ¶± ¦·4H%ôz:©@ ½œrß½ï¾÷+ó›¿u–ÎÌpôI|ˆlKZk}Ë®<]þëñôo‡/»­/ÁíáÓõÊ_GÃÿûõä_;ÃÊŸ'·Ï¶:Ÿ¶J÷†ßß/\n.»ßžµ¿Ým|Ý(þ_³ÕüëIãêo7ßG?­TÎT/¶«ðE›÷«Ý—׫§;îç;#_ާ~ÿ´ùk÷þ—îÃ{ÝùZ‘<ÂBBœìciˆ+BHYžc‰'L vㆮ”“´ãÐ’[feÀp+®YðÖRÃU½œV4oô¾ïB´>YÓ„QsÄjÀ\ÀÛT#Šªiüe#dD9DõÚœâÄùvN/ĕޅW¯¤ÏÞÏüŸÇ¿ï6þ%¨ fe&„8Q (,óaàd?p ‰ûýa– ù}}=},áX¿¯Çïóù}‚/(øü~_È× ùBSÍäæbmg:wcx`µCwrmׄ‹U#Ìû­ÿëhãÇþЗwþ|:~ºÖ¹Üúkoö?æ{0ýsuî×ÃA¥÷ºß&þãëÌG~Û¿úçë› ¡/×þ8j~Ýl|z0üíãèÿýaûÛñ¯ÿ޾[øù¬ûóhòlmèËáÿuxç_Çv?®·O¶ïwZÅ[­Ë±ó­ÎÙnñËVþÃVãreìÅzëËþկϧÿ:Zü¼2|¹W_j)õ´ìjJL D(¯„æØ ntFÌZ¦¦(–@(Ð*!\,9ãõäRêúhf¾=8Jë3©›ÕþÑ‚[u¬”®©Š ‡%™øÿ]óP¹”¡#+š®2ª™R5Ó’Ý+cyiåÓSVÍÔdYÖ9þj3{²Tß™H>¼Vy¸Òz»Û¾8X|wTûÏ÷¬O«D4°®|€“Ũ®¨•¬’UTfȱ>F yšp:bDáü\Ÿ¿/Üúÿúp}õëëóùúÀãÈ~Ù éõ1ŒÏݲ®ö;j¿ i¼<Ú¶&’RŒ~X8ØÈ~<©{kãïÎ|ۘ؟¯~?þëåµÿútó¿ß_ýã`ôçjãçÆ õ·ÝéÏwJ<½úÛƒÆÓ¥ð˜?šŸWjï6«?6«CŸöÛù¼Óx¿×þ¼1ôb¹ó~£ý~søëãÉß§~î}Ø,ÿ<ù¶sï|³óqsîû!œ0tv¿uz½þz5y±ÛþòdòëÁü×õ/;Å_Ïfþëíê?oæâ}1):ñþú“½ýÞ.Λ¿(›ZÚ°$x!Q9(Ь›PLÇ1ky³êš’AS6&Ž:š4K¶YMŠ#¹E=­IÍTG'Ô¤”j ’)a‰æ¸¶Óïèk"D%‘c´, ±«#ÍÈXD·¿€D9òÖln¥Úh‘;y{={¼ÒØ«ª›cF®Pˆ}!¾Oôú@·jfü±>oˆ…¿À…ľ¾€/áý<ù|½=>6èg¡>£P¢¾^e YÌhjYÅé´Ñ5Є©¥AUr+&¸Z¸xJ’ ä’†g‰A¬Öá£ê¿N[ÿ÷«{ÿ8_þy0úë õÇnö?Žç~-µ¿wÿõî꿞Ýh¿ßþóáÈÍÿxpóãfõ·£ÖÏΗ­äåJíÅ­Ú»¡¿N@O|ß›ÿãáõ_ûíﯻ£oV;oŒþ|<õç«…»ÍÛý†¾v¾<0|yoøÝj÷Óîð§­¹Ï^ÃÔøo» ?÷¯þ~´ôesör­ôe·’QA»¢&•…Ú –dMÍ¥ Í2%˜IÃq@1T¦6a(Y[ó6É6±N,›¨Š)A !ŰtU#¡Š¦AŽ Tš ª‰âD£ÅXÀH„¤0UŽóLŸ ð¸"nŠK×[)­Ý¯udZŒ#—C£YñvM™Ð[iåFZº7@Ök‰Ý!mJ'e].ÑXaÝÛ²÷[òÍ­è(M°Ê’$Ï'bXéæ‹Ù\Šn¡x7.˜> ²«_±]KÌ#2¤iõ–$ÜÁXéáãQ&ìm“‡Q‹ ßcHéArŸ¬< TŽ)Žº0–~ºŸû?¯Æþ±;òôjâã~û_/7þ÷ë‰ÿ~wóÏVßo |Þùýxô”ám÷·§Ýÿýöʧµþ³ü»ÚåöÕóõâɽòþmût«ùé`äÛÃÙßöF~lt.wËïw»oׇ^ßÏ}Ü©}Þk¿]ožwo ]lT.׫çk­Wõ³åÊë{™ó­ö—3ÿõìàçÑÌç½Á/Çí­77jŽAdLÍÈ›ð`U \¡Ï؈£’à ˜ ¶¼,rRˆc)‹0ëm|äÙ#‹Ø‡|ÂX3¨ª—ã¤8ëä^ÙÇ€2dFfý<ïq==œ7+–‹Eå€_Ì«ºIÔ‚kÍ[†Â6ãíÅ`„†¬µm&¥ ¥Ù1SžÕb 6ªÆÅN‚Îé‚|g@Ü™0o%´iSœsÍ©„rÃT»)áZÍ|V/ÜIH7ŠÊUK¹šTæ½›"£eu&¥ßËÓ®cŽ»âbš4½¹œò‹a o5ΗÝóõ¡gw›Ï—ª+Uˆø‡Áï“îLœ/žÞ~u£è-µåãjù×SÿõêÚ‡WÞ¯O¼Y©~ô6Gþ¼:{v»ýqkìÛ³?¶F/VgOnWÞ®¾íÕ®7.V¾>šÿ}>üb½þt±{.³Þp+Z¬.ñi*MfÝ+®î q‘D"G œ}‹ P¡ A–â<¼{e^b¹hÔ‹(FâAÔ[NZ f•©¨rˆ÷Öð¦¢>’0& OY‘ˆ ÖÔ¤im­^À7g³×:™™ÉÔÛ»Ù£Aky,y+M®7ìíâM“ÞÄxÖÁWlÒR¸{eº–UªIùþ€¼èJ#˜½ZA{}¹nL[Gœ' åû%ívÓ<¿?pØ6­Ã¹Ìó©Ô^ŘH)[¹6¤lŽûýÎBŽ\qö‡rQÉ“Jº0¨‰RKÈPÁIHJ”Åslœ‹«Õx l_Ê2“ ±Á¾åîöÇ[lh×Ó¯6ÿùbóÃöÔÉFçÓNûÓjûÓúÐÅÖÐÅnçÛÐëð­î—W>l½¾S<Ûè¿Xí|ÙÔ¹|P¿Ø{q·ðjÓ~¿ÓÿûöüÅêè§ÝÙ¯»3ßt?lŽ].7ßmTßmÕÎVûßmU/×½íOƒ¯îVnÏVŠ_Žºÿupç×ÑäoÛߟݼ\k/•µ![Ê¢µÄñlñàzþl­õìjóvɹ^³vºÅÍfvgd ›Ô¯9³y}xÒYš.Lìëµü ¥·Ö|´%¤ ðTY#–ˆ $[J¼ÒËEÁºˆ-ꪉ¼]ײN'«U’zRO P½AQ]!;u{1knϦV‡27;îË{Éã)c÷š~Ü4›ÚTR½;bÞLÙi Oér›.gÕ«y|cPoé“ýê¸K¦r´f¹¹VÒÖJ‰¥ZveÈ]n&ïVÕ;ucζ'e2åÒ™”:S"·*æ­ºž¤2¸<ô÷0fIe¿"‡„¨_ŒôF…C`§‚Œ$!ªãœ©ç-­[Òi-kƒŠŠ‘Kåª,OTÛ×~rã-üsÿÊ·½¹/û³ï·FÞ®×.·ZvjgÛé¯ûÿ8è~Þœ}w¿ôêFáɵÄçïëÓëÕã+É—ÛõïWíŒ_l•?lµ¿oµ>n5¾lØ}¿>úîþèë[…“+ÎÙrùâ^ûlµñ~­þæNåå*œ<òu«ûÛAý÷ÇW>í̞ܳžÝHÎ%¨Ç4F2.¹Ò4êÚtݺÒT¯ÔCÚP&ûé¢VM*#u³™3jDËë¼Y²E“€{‡òj%%ï` JÑ›hcßþâBX’1‹$^ŒÅ8Œä¸Èb†õdi^?ƒäÍOU;ÃÖ‘ÂTÕZ™Nß(³yµ…Ô¼£.—Sò’ùþ4ºÒ!i™+êÊœ«g×o)u×(è’ªòiE1 T4ä”%”SÞråçZÆXÍ)›Sic<§ÍWÕV’‚û.ÙâHZ°h!­ukn·l)!Éïõ†¼®„p€WàüfÓýQ‰á§y ðCQ›:* ¨Ä“J\Ϩ:Uñ ƒ â0r5?~à¾|Týð´ûëùȇÝñKàÄõêÅfûb¹ýêFãäNë"»Óý°5ô~§hüa©þn¥óépúýþàñ=÷l³|¾Z|y3óh1sî i¾Øl¼Û?Û=Û{·6üv¹rr¯øq¿ñswøÍÆàåfíýƒæÏgí_:Ÿ›/WÇ?Ï<™J/äã.'X4ž4pÉ¥­¼±0à44e$›K¥‡SæTÅœ°®4RS¥d'kŽjæxŹ=Ô?™O ›É§ÙD+kF2¬²>–ôÅM(^ÞÛ«( ¶•ĈIQí‡ß´*“šF22IëP\úî}½”l¹ZFFeW,eª¬ß«ésiyè\ÜŸyv»õl©v¶Y?]«½\ªœmTÏW[§K­‹µ“»Ù˵ÆåêÐùrãl­ýã`ø¯“Ùÿyyç¯'cß4vGs7²ºA IÕòh}ÂÜëæ&3æÕ¡ÄZ79Q0†l½Y°Ûà[sÊí²1Y ¥‚ÑL«õ´Ú,ª£}±d-O˜+ ÕE*økIrÕ´›†VÑô!˘M¦:v¶•¢cyzظ۲¯¤ì‘¬µÐÊÜi§®UÝý–LRN©smãîµ:”ž«çêyÜ™0 "ÇbDhLŒûE1$ÈBDŽB4%Ä{ÛyÇC‚f1ë QCl<ÄF‚ `} ‰àpTEUˆK8¤iœÖh%}ŠtAPáÓ¢œÄ㬈„…x8ª˜˜OŒö b@À}¢ù°QF#MM´¯'€¯ÑDV™¯Ú·Òî[í¤ôi;‘WT3N 6ôî°~8‘Ú€çy'ñmüßOf>¬½X®¾ÛýçñÔ÷íñ³µ¡³íoÛßWj—©ª« (í¦Zßï6.·ÆÎï Ýz­Ÿ­.¾];]ï^lvß­ÖßmŒ~ÜófÑþûdø·ÃÖ—ý!oó.8â¡—7òSTHþ‰òŠ €÷(©´æÊÃI¥é(é:jŠ*Y;6.¥µëmkg$u-cvš—Å”l•D­“2;i­•SgsfÙ ‡Ô3V'eµÓjÍÖúj 5“xÀUAzºzÓÖŠquœ5T¨Y¬U,»žrsŽ*ó‚aëIkÔQ+„ÑEÑä‘TxŸ÷Åx6"D_lh4Är¡ˆ·JA_4ècX_Ì×ë„Cˆ©Ÿíó³l0 ñ¡^?FÂL4ÀÄ}W†PxNŽ Abb( 1±€ê"}±ˆ/î ‹a9Ÿ lŒÂL$Ⱥç!d)2œ&ƒ˜ôcÒÒiÃÐj¶šSHN'•‚jSñ^ó’p“†‰ºYŸÏŸ¾h}x6õ×Þõ?vGlÚ¬Þÿõdö_/nxå÷‡ã?÷Æ>o~Ûè|\k€…¹Xïÿ°Zþ¸^ù¶»ðemîåRãÜ[ð¿u¾ÙºÜl}Ûú¸Q¿€3ﵞݪ?_ø´×þýíÝ_On^žý°W{r·ØQl[–‰(PÔŽ’¥rQ'%ËHb’4èh’dž¿ëê)ZµI¹` ·µÛéÕ‘|3i´sæµþÔxÒ©›Öí5#YŠž%ZÐ9Ûj'Í~CÓîu¯ëz%œˆj­:ªchŽšÈZZ5£w2ư•ÈÅ5 ûÅi[.&® hóý´›§eR6e¨/žÄ1#"Fi^Òp<Á¦ªËbñ!–íe¹†ë“Ø ŽÇ²–˜^–…ˆ‡#ñ>NÇÅ0’"s> ‡X7ˆ5B"a)ˆJqq^k%d b˜6`e, %oXµ«‘$¥’£()ž3çâ¢_”Ø8$9–€§²BU*ÆN7{t£ÿÓÛ!oÃÖdz=¹Æöåbîýæô§í‘ߎÆMüz2ýg \»Xk¿3ûìÆÏý{ÞzP[ï7.6ÇN7ê¯×ªoVJ—+íwKCKƒï6—û£?^ÿãpñƒ××_ýºß~z½$²b¡pa6ŒCa)ù$ ¾L"×"Jœ7EÅÒi^ӒІe^—ã†,'lˆˆÄ ²¼ÆJÞ˜P=ò–ÔˆÇq<'´Šæ½)w³ã,Úïëÿuvý_/fþ×Å¿ºÿkwÚ›û¿;úu½þ~%ÿiwäÇníÛ~õëñÄ×½ÉÏ«µOûõóï×®|Ýœþ°Ú>_~¿Þy¿Þx¿ßx·1òöÖðÇí‘{^ÿþ÷Ãë—‡‹/¯V& „‚ ù˜¿û°x•¨Àk’¤‚ÌPxJ”—ä ¤+(­K[i%NŠBÈ–ÊÉÕšs;ïÎ8î­Fr½¾ÝHÝk¤oæÓ“w¦æ®O'w‡ÓSº3¶odîT’W‹öµZj¼šœ®™u[µT’€¨Š¢,òª¦“8ýA™ñƹIL*7¥ª.AAj\BQx쀜à‚áYñÊßëÉÏ~šª5%$*aQòB Dœ{cl±aH“ ‹”m€šDY&ƒ Ìe-¨(>Xo‚m˜€ì¢,$àmFJˆÈÆ(­H†“yΑŠM›€ÔGJú Ñ<³Ž“ª®#•È¢KÀpŠ ÈqA°) ^tJÅ–Ñh?Yu¶®®—JÏÖê§&¾>žý¹Ýý¾;úëøÚÏã›6G.wZ_Ž&>?˜õš¶~<ï3üe«v¾2ðj©ÿÕJíÝÖÐùæðéÆÈénëÝÑÐçÃ.”ê¯ÇÞhÉã+•kU+x&áÂl$Š’Eø·G'#„>À:!&Fx&¡IÅ,ng”–Ég\£’¸Öé¿ÝrÖ§œ»ãÉ;ÎÝŽz¥bÏÕÒW†cƒN h7£ÏTÙ¦9S7AßÎõ±¢6^öS5EóNÆ¢$EÁ_Äi9!È"NæY™ãXYdT$„iq‰øyx憌“;§Î!œ"R‘.êÄÃ*äÁf!ÊáPDf9&*qÆ„°ŒB‚‹+’dbÙÆÄF(o¢tl5µ9M…ŠŠàd&n©|5‰; Òqä155 ¬Äƒ Q6$¢"Â:¢«à, ê×´2Uë6àŒ–BئRŠ  Æ£*½i’Aƒ¤â5c*`Ùà'ëÊîBr}ÒÞ™H>ž-€¦útÜúµßüsèó^ý£×k0õýpþ×£éŸÛ#g÷ªŸ÷Gÿ<ºúqsübäSûÝÎÄÅÚÄ«ÅêÉòã«ùç·Š_öF>¯4Ï׊ß6^N‡¨à–ïcÙ>Žíùû;X¶‡eúÂL¯Ÿë KQF9(œR ˆ€NðúŤ¸Ë㜦uít?k[<_OÈc®6b©­„Ú°ÔASÍêS6-#©®ÐiÓVR[9OfKWçÒ¤÷‹“A4À*LXaD‘‹KaB@¤¸…%CñfŽ[21ŸRøºŽJ&r5\qpÍÅ.œÃ‰zHT#2TJ£¬Š’Òd¬ "@(ò&k&Ë(ƒÂ bª!ëXHé1¨&qJQf>#-pÕ"à«Ëšt5!ÞHÑÙ¹] 7RZ]QKr•nÂn˜VÕ²¦ËîõZ¢íªeÃJ˜£ŽÓM$&gÒMMº6pÏQPAU‰žE:’)’›¨)&¨š¤fŠšýi³S3çêúú„ýðNþ󳑟.þy<÷s¯ó~¿}ñ õew跃ηÍÖ‡µÖÛÛå³»Õw›# œ/ŒþÚ¿úukôíúÀÇýѯG“_ƾvߟ¾¼ÓºU¡YÌHl”õsÞ¬%¿7×›ë帞0 ʰOäƒT±â_°IA'e•\öÔ”–K®5RÓn+I »Y}"MÇSê|9±6`.¦µ…FâVͺÓ4.º»£‰Š±Z2o6´{ƒúµ4…™¢ ›–4êHà.…¬JƓƴ£ Ü2ȈI+:qMR/Ù¬1¥(&¾Å²ikTÐYVc"J8¢8#$@ÖyËôÇ8e”«± ñx–!lG£ ×Ò\v–R;£L$O„q‡ÜJi“UyÁÄBà c™É“+yr«¨-äÈ(¸Š ­ªkY“¶Ó‹C™éœÓJ9£iã~×=º’Þuo»·Ú©Ù·  Ñ †>iéUUO{;‘蚢Š×}¢©š©é¶¤cK(Ôu¥föèfõÕÞè÷W \ý~0ósüÏ#oŸ¬?ŽÇÏÿ|6÷Û“©O›³—ëC¶k—ÛõÓÍÚ›ûõó €â‰O[ƒïVΧŸ^l2(?1Žùû8_˜ós\o8ê C”>Жñx‹†™XŠ*¦È6hRÖ%YÑUÓÑì+§ˆhŨÄXÓ4›zû—•3ZÑÔRÉ%ÈHƒÊϘ£9}$C›i$h >JG¶Š&JÈRÕP*iRf!¯g“ZZÅé„’³hŠRG£K+Q<œGí¤l B’ÊIMÖeA×¼µødVT8‚’B‚ k1‰²‚à÷ƒØÕH  S6$G"*Ï‘°è­y$^âB,c—Ü*# ¬šÕ¤ª©´Óx™‚*—¥hÈC™oR¢«ZR%Sɹ¶íºpÛpÍSýt8C²¦š1ÔvR´´ í5X%¤!¤ÊÄÑ´Œ7¦HO$ú"(hBÄY ãöÃ+ÙgËú?g/·ß÷Zìt/VA^¯ö¿Ý®½;l_l\nÿØî~ž]oØì|ܺÜmþ~4ñïGóO¦*¢¬D8ÛX ÷1Á>“¬·œ]F¢bXÀaoÐïqnL$äíb5ŒExé©?,GxŠK‘¨ãTÀèŒáB}BŒÓEd©±æfpr„‹ÙS18¬8Bí‰i>^g`#çB½Qäí¨ló^ǰ®(@©J_L‰ðyMÉyÑ ‹U¤@HŽKJ4F"QÊ€PQPÂ! ®dЦЦ( 81ñ0+FEP¼RÐP 'ÀS a!Ü¢ÌÀEJIu’rÙTtY´UðÄ’‘! ¶"@h’„&!š¦&#I‘‘7µAQ¼•‰ü¨,¢Ä6ÆÓÅv"QIµ»œ7²µâX“ˆ7´S£ÞP koˆ¶Ló¡~c*•ˆ‘E@â…´Žæ*ÆÞÍôgÓ>¹ñópê× ½¸æ÷ýJã·Ý¡?½±7o×›gƒ¯–kg[‹ýÆ£›ßv¯®¶ßnW¾¿l\HÒ(X¶8•™0b#$߃ƒà¼z•qbdO[FäªÄGÂ1Žå£,Ïq1!&#˜ a’.ÃÑ€€ý¬ÒÃi|ÜÑoÚ ë øeTIвEË.õšv%à: E#HŒS¯çäInÓÔ(8èª O{‹ù¨¦kIª™P †–Ói+£:T‰õ‰ëº8+@ôÌÈ!* \˜— w‘*W¼áLA!ì†" CA¸ F†°R€ÅGœ€XP°'ÖÁŸ"¯¹FˆSN°`Ê’ê™Ñ÷ÙÏ&,ˆ!%ê—¹ Dbày½^fE6¨hco»Ÿ4Q³¦‰¡’ãÅ^GDU :Üc’|ˆòJiº@5O?ÝÇ5pØMáæÍÜ׃Ñß÷î5~mwþØø¹?ñu·óe½ýycòûîâåj÷ÝjõýzýçƒÑÍ~Ù}³Qx·Õ8_é\^o ›:Ž"Áp˜¼A˜ˆ\@ŠøcÁP<F\GBÕB ìõÙ1ñ¿ ,–£X°" A’×Ê* Œ&E…]**O4‚¡$y6 ,õövàUR)28 ®Šò^9“0ܲSV"cm@" ðtï° Ã´RY³VÕ‹iÓÍ9ÝHjņ™ËY†©ºfZ¢¦7P‹¸IŒ1T¢P TÆS1„„˜· ®Ð+ ‰ãˆ© û¸PH?Ûà ŒwD| K)ƒZ˜&ØŠPç’Ø ¤Ì% VvJ©$ØÃDz¢lO„ FØp„ ÇâðE! ¹“0¯Š¢At‡jiaFSFñ¶3!÷ˆˆeTL“'Žà€R¢QÀø'ÅÄëãöÏ“é?»÷ûáÔ_‡ÿ<šþº3ñj{äÓÑÂïV?\=]m¼Ù(î|x8ôõÉ·ƒ[ï·†ßo½+t¿8­°~abáèAq<ê‹E}Bo  s¡0ІÁþ@ˆE0ƒRÉPl¥ÄbðôP Hˆ¨±0퉄CáІBÞàF!$F{ƒlÀã¸OŒ6 Çü‚èóD/$| RÝû½ ÅHÕ¨®xÒ<ˆ!9ˆ‚gª“&ðô#<—BxüTÂIˆ¢¸ŒäˆAÖAŽzÙ’£™(”0ƒbaÂùƒ|<2 H}¾ˆwm¡0܄İ’gB|8ŠQǦiÃt±œ3Pø1a®NYª ^C„©ð„ ×Ò¹°ÄFà‚Ö/†‚r4²Iˆ`1" 0σ±Š‚Ý–!í©—qG1 "¯§^AHFšè‘ÉšÞ–À]rÜ5±ÁS©B¤ÙúÖÖÄ×íÙ[Ý/‡£ßŽºß@ôŒ}ßkÿþ|òËþÌçµéó»õ“;çWZ÷_7¿?è|Ø|®¼¾ß<½ÝØhfæ Z;¥p$¿ÉaÅke¡P„÷õq ॠÆÞ[T6Â|$$Bb¨7Üç‹…{bPY^³* Åca$„qî·G{ãbXƒÞ2,\_\ ÆTN ±0‹Ç#" $DÍßÓ)Æ”„«XŽ¡*÷ûª—¦@ PJ×C…lŠ0VpÒÀTç&+È£K‘ÈŠêÁSTÁ[‡‰y‹ˆ1œ Åü=œÏÇøLÐ_Ɇþ /ìe#= µë‹€#ø¼]c’ +i®©% *Á'Æ0ÆÞ.§`µõ +Jq9•¥ˆ‡ºè‹†|½LoŒí>Éa1†ï‡.†ñ˜_„Z†ÚtÒzeU’QP–x¥¢jƒŽV3@I5¢ä0±DÂsbFc­¾Ýù¾îuâó®Ö/C·Ë_[ÿz=ÿ?ÞÎÿ8ì^ìu~>™ût<ûåxæû^÷㈨úÛåòóÅêáDþåÚðÉ•ÚÝRj¶èÌd¬&¯õ‹Æ•!³kéH}|Ô'q>‘óGãÎ^ñ#KœŸaƒq>ŒP#€S⡈Âòj©}ûãÈ/b•ô[VRQ¦ÁÙ…1@”>Q RHà˜(˜V (;¢q$ªðD”´8ãž;#ÂäCæ#7²ITT°åc ¨Y8Aae‘•y^ˆÉ²¬ª*¨VÇ4]w¬D ©z hËÊ`’±!`i1ã÷{}!Ÿ?ô¦ÄÂ>_·~u("C7d^ã‰Á*ºÄÉ’(±>6$—õ€¤bH$Këç£~$øqÌÃ}’×€Šúý¼—j —û°ê×ü>ž<ˆb ˜ PIhšKÍ H} æ‚KGô|M³KªÖ¯éiS­<šýñaé_'[_ö¦ßïÖ¾ì.|?¼ÿùpærµs¶Ô~¿=ñeoáÃvûd£ñjsèteèõzû|­õy§>èõjçå½î³[å“{Õ³í‘ÇÃÙãnòùÍô³ÉÔF%q¬x8U9º’ºRq®çÒÃIÝ!ŠA0ç‰}ˆñGeø¨U*OÓ‘ ÆÇÁ•ɤ)!8cS Q™§¦jQ̙ʀEu^3¤¤€µ ˜PM5Vd‚²¯Ïçú¹Y Èbo˜¡¾>¯±×ç –õÅŸ¤ú0õñbëë“‚>Ñçó÷øØŸàëB}TOœ d"›v’mŒµÒ£#vÕÀƒ ZJ’!WijÊp‚vS‹ò€6ñ>Â>Ä{A§B&Zµñj¾l'&RæTÑØ¾Q™Ë¤*TïvœÙº=ÚµîN L–í¦î ÷ÆŽB16$1>o[ ˜Ç@¡C…Ul¦ƒ<Å Î ÉMLÓ2)`-«è ô몣šMbT }¢¦ ´±Œ6”ÕJ®¦°ÈN ÇûSÿýlö÷½‰ÓÛíÓõÁóÍÖ)q½ò~gàÛîø÷G ?ާÞ-·ß,·.׆/VÆ¿ ÿñ¤óí`ä'@÷ÉôËåúéÞì—Á7»µ7;Ó{c¹çåZñÑbek´°\o¬Uó7³|Û"uW+(¨@u8ÅÇ…y¿ŠÅ4°„(›Dg®?¯ji… ð)’Ë j¿¢UlÒL›á\YJÉ(+(‰NDìónª$ŠÃÅÞ˜ÕˆcPŒ™Ïé(GÕšiN¹üµq$…ò o0«!a•ÅJ“€zýºÂ'u=í+e:]T§+É›¥ÔuÕ¹2 ì篤ÍÙRz£dí&Ÿ\ÏìͧW†Ü5ë~G›/¨su¹`,ô“kMr¥“ŸNÎv­Ù†±8î®w²Ý‚^íWÇúÍé,/êmªv¼„TDøv LàÒ4Ê'¨lä-¨­DY Ñt‚ûH ðœ‡&ªS)IçÔ¬¦ë„‚TÐø(†g‡KÅ*ãù&]öš/",©Tµó‡³Ný:›z·Öy~«ùr¥üöÁàëáí÷íÚà‡­áÛ‹ÚéFýl³u¹×ºÜ;_í~Úºöa{äbsôõRãñÝÚóûƒ§+Ý7ËÍ—KÏW‹ÏÖOî—_®ÔßΔŸÜJ}\Ïï é7\g} ð°›Ç=:T™ÄBXÕ¡`ÙªŽ•6ToØ­k¸–Q+ë­ŒMHtÄ1¯¥ Wªîµ¼YÓ0àX-¡¬»ö5ÍË 5¨å†ìƆ¦MÁðÍÚ¨j))—bEA dÀÂõ4{Ý•ï¦ÈX’fw#•Ps*6rŠ]OBæ”L”w´FB›oiK-íÖ r4Ÿ9êæîÖÓ;³™å«¹û“¹K_Í¿YkîŽlM”W;…û#…¥\vqÀ\i§×ŠÙµº{¥€“¢5¦'Kú˜³3¢ÒM’ëýÊꈾÙq6ºîÁÜ Ï}FrPF1‘O¦"Ѱ¦ :P¾NtHï „Jƒšö'ÄSQDö‰ ¯ycé{ÀÞúc4¡U1¥ ¢`(à4•Ê~î/å?{;ÎwŸ¯v^­¶^-7N®W.V¦/î½¾W~µ2ðö~õÙþwª¯ÁÒ® ¼Úl}>ûyÐý²ãϧ›ïׇŸ\³ßÞpž={0|ºÝx½V}½Þ|~³úaûêÙrûõJåù½ÊÆXåA×x}ØÝëÚϧ’ë9wÈ4Jš·I\²ÆU*ãŠó³1JX•]B‘Ï›^—4›(¦FtQ³x®š–Z JUK rJ¡¦(; ˜8ZÐQYEÕmpôq³5‹@JÔ1ÂhÔ‘G,ZÑä¬B ¼Ñ[£f@”'¨Ü4å!›ÜLë M}.¥Ïå”›ee³.]ë§W“Z'.Ý,Io+_÷Z?v»_ž _Ì}Ù9[ᄎ]?^(=Yoß­¾ÚéßÏÞi¸OVšGßÀ½ÏV:ÙÕ‰ôãi÷hÎÝq—›ÚZ‹l¢gT°ÙÙH¢jYKçÌbÊñ†—7™zBõz®G7]ÊÅIL„º6PLE²L1õD±$j™ñ;€¿À I2õqWF’G#Ÿ¯^ܯ¿Xl¾ùô`ô|køt§óu«ûÏíwÓ•Ö“…Êû¥“åÖùZãÍjãtÓÐ~·Ñ=[i>¾–yz«p²P±T?½;ün£ùi§q¹“û´=øüNåÍýÒåÚà¹7æ9wT;Ûüëåüa7»:¨ÞGI©‹Å…˜t‰FÃ!Ìó‘;–ªcÖ1ä|Ž:¨Ö%rŽâ¤áÓ3Š–¡)—©Êç-9­¢$E‚ ²E 8(g¢ÆYª×ueÈB%TµÕAWB¨¨£,E 騥SxÑÕQÛBs)2á’¶%ç4’¤mWETDrÆ$3#ôíãÚ÷£+ß^/üx8þõqëóÓÖÅöðû]x•+ãÏn4vFKOVÊ/n”voæ÷k{×*Ï÷G®Þu6gœ½ig4µ×v·Ç]9F#ßà …€¢ëcC³µ²¬€Š5¼’ä½Ú£!ºéõfñP³‚  "Bàããš$)"JŒÆ%/Ô¤Jˆ òº-¬Ý°Ÿ^o=_|÷äÎõñ³Í™·›çëÝ×»çë×›­· ƒ'3ý'÷Š/— §+õç·ªo¶jç[[­³µáÇK×KµW«µW+µ“{·3ßï£ïVºoo÷Ÿ,—ßnæ/×vßmM_nM<­Me^,f¤s { ¯½‘hE‚äâ"g*²7¶ S0º²Š‡ÂØD2ˆæj¦±Æ :ì¶%dË"[25“ C@˜ÕX,!ˆ³Àñ±$BvˆwT^o‚HÅ *—(í—QNF3 êp^4Kê2üÌ£- +BË?Ûø‡~ßí|Ý|µÑxr»ùz3}¾;üj­ûônýÑBáÉÕÚÑBaÿþàÖtfsÞڙʬ•Í»5÷Nƒ¬Ù&œag}ØXn¹}a&ñƒ°fÃà"'` 8F¨ °Ë#o¾!¸W_ˆyS“@Ê%:1mK· k¨–™ªg’^ë±Qt[“š•tA¥€`(‹r¸¬3oö*—‡­—K­K•Óýá³ãñÏÏgþq<ñqsüÓæðÙæØÛµÆé½ú»Õ±·÷ëo×Çß®4O®÷¿Y¯ŸoŒ|Ø{¿:ýrnðŽÚËåÚ³;©³Íó­‹êçÃçûå³õÎÙíú›[Æåúàû½á·‹¯6;—OfNï–÷ÚÉG1ì`oLeD5$è<Ò8ͳ …T v¹fM›´-£ªÁ ¹h!I®‰±) Äfe‡ç3|ÈæE]÷¢†øŒÌfd”@l©L³,Ê lÉüé°¸HÎómL²,ob>Åñ ±3v7‚pUFý Ô/ó¶×eùA·(ª T@¨¡E'löÓÉÕ‹ƒÁG¹/{Ó•êéÒà«ë¥··j/ïžÞtçVæ æÓÛõ•ñÔÖ„º9ä¬w’›CæƒéÔáHr·›Ùr7*hyÐðûœ_æü`ÀC1ÞÎ#>,¨«Q• MÃnZ‚h¦c”M œFJI¹Ó´¦ÒfÙ1&KnÒ®kÍ¥´jƪ™ :ørF7MäcŽ+¹taн?™yq»özèÛRéõ­ÌÃÅÆåƒ+oW›—›Õ³ÍÆé“â»0¼‹ÖïÛõÓÕóÍÂùÆÀ©×G{·ZºXÊ-¾¹×øøèÊ·Í+ïW/W.7žM·_@™ož¯5/Ì}yÐ~»Üyr«þl«ýmcä·ã‰­÷A©fE"úLApe~¦„®W®+ßHÈ‹m}:«ÍWô{:[!Si}nH›÷á’E ǧLoN+„‡å] 75ɲP°™T‰ÜÒQ… †‰Æ©\AZ¡:€EY„ó*NõrÞDlÄW(W"h@Aó.ªO¤_D¸ £"•óÔ·¥7òŸîÔίf>‚ãƒÇµT>»_þò°s¾<ñòNédkøa%ûrÎzâZ¥›mg§ënÖ2»#™ýñü~[Ù5¶Ç3»×R$”|(ØHˆ‹`&.`p52Ò0*˜²œÍ{Ó¼æhŽW¼£‘Õ'ËÖhÑZl™kÝꀭ^ÏkW+›J]%‹Žfôš«{ûZ‹¼c±y‡v3ÂBËY¹j,7÷f3ÛkŧëG·'«¥OGƒ¯Û¯—ë€7Ç.´>lÝø²íMÖƒãt!ûæVí ˆ«ÝÂû­Æ{pL[÷{Ýóµy`á÷›Õ“{¥ã›…Ó᳃î_GÝóåÆë{¹W+ÕóÝÆÇ€ÕõOÅ­Žú‰…$QËY1¾å$Z޲T³æk¦¬MZJ ˜®¤OökM[Ï«$IeEÐ.SCUª¯ƒxFý ¬¨æbäbPBU}¦®f(JiZR@e;:J"v)“K&e Šá($mleþÜš9™Î>¿Szu¿óú^íÕRù|¯õúŠût:q²Òz~%óê*7±Ôµïuœéå²}«¥m϶7çókãt³n.¸x¥¬’’{dÙ/Ë= lùH/&HêC8¦ó>ÈHƒGqŸ¦2@M4–.iÞ W•Á¶èÄUxð‡B\NitH£yPSa(vž(‚%ò<냴¯¸òh–6M/±«)¡îê5G½^4Ǩ±X¡Ëz­i_ÉîLZ›óÉ'›¯ZÏï¥NõËÌýóhò·ãÉ_‡ÿóxñãFût¥yº1{¹ž:Ûi~ܼþv¹vzàÑŒñr1ÿz­vñ¨û¯ý+7’—Ëõ×kíŠXŸELR5x—JÍ?•V†ue2§\©ë­4)²£ÊqY”%Ï‚œãõ !F%"‹—xVÁŠF¼¶Fcóª†-ê icÃÇႱ`MJ@­I‚7 GYPV.á…gE£íϼ»?øö^íl¹þveèboúçÖðË»•ƒ«Ée0Àš¢?¡)W͘‰¬iõJÕA*è\S)‡‘·¨ê“Â}(ì¶b"` {9&À{_O Ü õ„ú¼oeË`$!¶ç”ãZˆ¨!Qôa$ ¡·L¤Æce*ÏL[@ý<Qå´Ìåàba@Ç£”–duZÓ}@3Žö+ _. nݬÝÉ=¾ßx­´w½vx£rÔDûÕØÚpr¥ž¸Õɯ6öÇ“Ç퇓γ™ÜÑ”õôJáñüÀÉBæA3³Õ5.fJÈ ’õ&ÄB"‰(ˆ}¡bÂ(*‚ÄR"rÜç-ËÀöy;3>&и ƒœñLˆ‰„à•À‡âQ(`÷€GCbŸŸT‡E±° qÅ[â…zë§Ø†“À™´OñÖ–‰„‰·±2Å¥€! êí¾‘ÔTpÖiU78…J Ø ƒJL=AEÓ é”4ÖÕ®is)²:Eï¶o—Ÿï~ÙŸ¾Ø™zºZ{šêvúVÉ©H”e8êuQÑdXCŒ¥0±d ºôjÒUŒ¸Â† VÖ'r=LÌ‹,ñsœ ô²±1õõzݜގۢ”I†*5[«%è ¡J)‹Šh€,4ÊD¨(ÃãZI­%nVõ©¬6ך M;rÅŒ7óê\Y»—Wï;‹52å Ï×¾o Ÿ,·ݯ]o]í?ž°§‡Zîöòx\;Xèßš©ßK]w_-§Nó'KÉËÉW;©7Û…—w;Ofs[%sQæQHŒ†”Þ öE™^/j ÜŽ?îí_ì‹GþXˆ„B\Ô/„|Òß[N|¬6Ð'±~DE $Æzˆ&8DC½’Ïç½=â—¼‰H1]Š‹XQ… ‘R©b' +¡ ! +ŠE‰È›ŸŒ½ÖLÇ #€Í³ Ó"$Má%ñ»RjjZšPKÑl+Ì„xŽ/`M—•J":Ú¯^/YÛwi(±Õ)¬–Éݺyc01UTàÉ[’Hƒ˜°d ɢϫÀFZ\€Câ1!Š£Œ?Ê@¾ú™>xÞ® @Ÿ7 NȈú¸TUÃKáWÑH•’š„†T'NÑ›¦$%iÐÖs¦^4©­kEƒ€Õ­Rµ¤ky]µUR¢´(Ó¢Bë 5§“A6$©“RîÖ~Üxz³¾=MVæ ûwòÏ–ò‡÷³[MsÉ2neÌûÝÌòty¾áN7ÌÛ {oÊØ¶·Ê‰å÷nÓytÃ:»Ûx1U¼I#JXPྼ‘2"lïß‹©ö‰ {cLCBHaü±€/ØÛÓ'øAK°Á>‘õ,°ÌD„P‡Ã”c‚RP, @½2‘H„‹0LP ôòÁpœ sl,.zkØ!•áD2–C¢Ì°G“E†3‚·´oDèñ‡‚½ P¶r.!á’6í£’õŒ$ou(Dz¦ÏÓÿ‘° K(† +a‚š„‚‘H0‹CåF4"„š•Ùˆ+á0‚·°!õF"(æÁÉ,Û')¯ï›¥Æ‰zBþH¨W K’ÄZ¦¤ رÇZ¾ ¡>AaD|"8ªÈ^c¾"ùJ04 •Ú”‚A3 (’ZÆ¢Ô“…ØEÄ)–¤˜–V´“UÝÉXjÚ$ŽIÓ–fƒ^XPUD$ŽABJÞEyi%G½¡8¼¸ œ!¦M2¯@–Àg&Ô‰²9UJÌÖÜACMRvh;¡&Hü k´S‰‘µÉ¸V;½å¨MG±qÑ”Á8—(*it0­‚Ço ˜M!eýðnþ×þð›ÅÚöxáöDâp¡x²Zz{à­Qù¨bìÃ¥g÷ÇŸo4×ÝGë…çKÅ»¥ÊOT߬^.·.nåo¤p4åA·÷aÞ‡b>ïCJAƆüªAñH N 3<Ž 8Î(ZØ ÜŒ£X±=Ø lz…P/вÁ@$äíI!²Ñ“T1™ ól8Žpa¨ñˆ†⢚"ÐB„8¶—G |5‡0!PÚŒ¨0²·ä Øa,èšbü-µˆ·†•¦ªÔJZ¹|Ê1@m)I]ÏPÕQˆE)J–­- 8µTÞЕ„Jr*µß 9PkÁƒ2'Þà4…”tïÓ)«iC޾¿ÿoç?vŸÞÚ¿^~´V}±}v«øìNýÉxú ­ïÝHíÝÏm\uo'îÎ¥öúL ¬6ÒK…ÄæhúÅrýËÎÈëù쌆IXFq‰:b"«¹) ^Ò`‘Ê"%,Êá8›ÆH@"ƒ1Øó€×AOCÔâ[Ò4•ªH‘6DÇ}\ìïá”ñ>–óólP†bù|a?ЍÑH0 Š2ì÷¬½›½ðá>,öRV0ø…° ÁêÆ1؇˜¨óHëã\Žƒó•øDUuLÅ„)4«i6A./—E2¢‘’¦å-©¨žÍ銭aàh*z£zŠ:*;¨V4GJúBZS•¬‚@¡å]µÖ¯d²´ÙÔo §›ÙÕYë^×ê Z3ÃÆXA«—2WǪÕdiYK/Yz5«7ûÉ€·ãƒRMjí„1â{¢„$ºD 8GA ¾žÇ¬‚lQ;.‚œ È[ÁÆ©€³-§5€å¤bšòh›œí–ŸÜ)/gïg·æòÇ· OWúŸß®Žå7KâzSÞ½Yyp³³\Y*·&‹šÏæûŸÍ¸g·³ï—Š·úŸ§¶Ëª ؇¿¤p^£"rKAàP%Æ‘@œë(AÖðc"Q¤Ö/ÄYQ%" aÄChýrØÛ«±¯× ÷ÆB!(Û(oÔÃdyÖÑê‹FûB,¨Í¾h0c#B,“#EŠä…¨÷s8ÊZPHœ(Æ$,Kš5ÀWÆqBü”R¹_ïæuÐ$T-Ò²éÍue$µÔÎß­™Ó¶ZUIY!)ª¤tœW)Tb¿­Íåô¦¡d5o*“þ÷ŽK ~¯\Ò¯y“ß“D˨Z%¯·*F3«š´fx{ gÌVÚ(»ZÃ1êI34S¦·yºC°kÈY›¦ÄѼ=×*#Sw4MÓIÑò6bK")KŬ¦dU\HhiNÖ2®êRdÊàJÎâÖ\þŽ8*±M|w<÷_'7þ8œ{y½±;S~0WÚIÞHl—Ÿ,ôwí‡×ìWë•7ÛÇ÷jÏï×Î7KŽ*Ÿ ¼¹ç¾ºéœÜÍœn6O®W4]® ¼JP,RJaBÇE#QR6çB,ŽÉ*øI†SB ò³8Ž•q 9g«ŽF‰D˜¾øß¤F£Þn}`âœ7˜c#Áp‘ ò2ê ¾¨ÜüX¢x0î-žïm ÇD}1o‘sL|"èRÑ#3H Å€o¡ªdš’M…¤ARºZ¥Ê¸†:¦P7â*UTi­)ŠF()¯®màQ š ¬:`ÂÓ–l)fÈUIˆéíåëa¼¦ëZÂPuÍuÍHYox^¿ëÍ髤µ”«Y.± ûÞz›Hâ©ÀiHÔ@$pÈÛŽ ¡F¦N5ÍTbÀb"x%‚ðïÖæ'Ç¢ð'ÄCQ&Â( ‘YIfYÄG¨×$Qã `I“îþùyý÷7«ÇÏÖëÇ÷+ÇwóOo7žÞ¨8ǃöÁäþ}ZÙ½ÅêþÚÃ…'óýgs»SÖƒag·á¶ÇÃÖã™Äÿª>vgeomview-1.9.4/data/geom/textured/white.pgm.gz0000644000175000001440000000017410622666054016245 00000000000000‹–dKFwhite.pgmíÊÁ Â@EÑýTñÁ œ0"éÀ…!-„%„!ì_§ 7çÀ}«7–tŠæVßûñYñ<öãpµN¯¥¶ë¼M9—îҮ霯ÑJ¹”ôþîVm¦,=@geomview-1.9.4/data/geom/textured/grid.pgm.gz0000644000175000001440000000113610622666054016051 00000000000000‹–dKFgrid.pgmíš¿J#Q…·ÎSìH„€½ØÛ,ú¢½«ûVÆ-7Š–qkeWL·¦0j¥lR¬‚ …J²â’Ù{¦ú}¸…Ý9Ò|îWÌ\î/33Y)•GÇ>¦_i´R)}@–²,»ÙMd¥VBu~" Œ$M 3.TŽd^Ä~ûí·ß~û‹ð/!ÍDAþ$rÎÒuB§ ƒD¬kéMtêB‘ìgNá¹Aéƒ<'òÂÒkBO Z¨AWä{¡n$=ï?ûí·ß~û‹òï"švžAt¶Ý²ôЈæŸv¿´ô!:‡B‘üöôQ|ösM; ·ºþ,éú_ƒèúw"С£»6kFÒöþ³ß~ûí·Xý-D–^AtØ>°ô7¡;-tÁ©Hü´=‹äÒÓOñ©#ºnO W¶XºKèDó×I?µtüiãN$ÇÞöÛo¿ýöåï#ƒ7HdÀRö½‡üi§à, ½HÑØÚaIsë ˆ®äªZzšÐJ$ÛÞöÛo¿ýÃëAôÝNDo²š,éOúˆü+|ÒÒ³èÌME²ìÓß™@¾ë³!½6=b©£g; ºÿÖ"˜ÕÒ_ÐYš‹¤æýo¿ýöÛoQþqdSçˆÎ¿Kz$Б5‚|ØZDçs>’EòÍÓ‡SF64ÿƒhþgéLó?ˆî¿¯LåÃ:ùH6IÕûß~ûí·xýóˆ>Òèè#é6Kzÿq ¢÷Ûä–jèäÓN5’-ŸþÎ?n¡H@geomview-1.9.4/data/geom/cone.off0000644000175000001440000000207707730233104013551 00000000000000OFF 22 40 120 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.500000 0.000000 0.000000 0.475528 0.000000 0.154508 0.404508 0.000000 0.293893 0.293893 0.000000 0.404508 0.154508 0.000000 0.475528 0.000000 0.000000 0.500000 -0.154508 0.000000 0.475528 -0.293893 0.000000 0.404508 -0.404508 0.000000 0.293893 -0.475528 0.000000 0.154508 -0.500000 0.000000 0.000000 -0.475528 0.000000 -0.154508 -0.404508 0.000000 -0.293893 -0.293893 0.000000 -0.404508 -0.154508 0.000000 -0.475528 -0.000000 0.000000 -0.500000 0.154508 0.000000 -0.475528 0.293893 0.000000 -0.404508 0.404508 0.000000 -0.293893 0.475528 0.000000 -0.154508 3 2 3 0 3 3 2 1 3 3 4 0 3 4 3 1 3 4 5 0 3 5 4 1 3 5 6 0 3 6 5 1 3 6 7 0 3 7 6 1 3 7 8 0 3 8 7 1 3 8 9 0 3 9 8 1 3 9 10 0 3 10 9 1 3 10 11 0 3 11 10 1 3 11 12 0 3 12 11 1 3 12 13 0 3 13 12 1 3 13 14 0 3 14 13 1 3 14 15 0 3 15 14 1 3 15 16 0 3 16 15 1 3 16 17 0 3 17 16 1 3 17 18 0 3 18 17 1 3 18 19 0 3 19 18 1 3 19 20 0 3 20 19 1 3 20 21 0 3 21 20 1 3 21 2 0 3 2 21 1 geomview-1.9.4/data/geom/tref.mesh0000644000175000001440000003274507730233014013754 00000000000000uvMESH 8 60 1.16052 0 0 1.10194 0.0514176 0.131743 0.960519 0.0727155 0.186313 0.819098 0.0514176 0.131743 0.760519 -6.35699e-09 -1.6288e-08 0.819098 -0.0514176 -0.131743 0.960519 -0.0727155 -0.186313 1.10194 -0.0514176 -0.131743 1.11488 -0.274977 0.102787 1.06204 -0.207072 0.229388 0.928492 -0.145075 0.271265 0.792476 -0.125302 0.203885 0.733664 -0.159337 0.06672 0.786508 -0.227241 -0.0598814 0.920053 -0.289238 -0.101758 1.05607 -0.309011 -0.0343783 0.984481 -0.519288 0.195458 0.942273 -0.437567 0.317817 0.829146 -0.339098 0.348438 0.711368 -0.281563 0.269384 0.657932 -0.298665 0.126963 0.700141 -0.380386 0.00460436 0.813268 -0.478854 -0.0260165 0.931045 -0.53639 0.0530378 0.787642 -0.707791 0.268925 0.7591 -0.616615 0.388523 0.676615 -0.489555 0.410508 0.588505 -0.401041 0.322002 0.546385 -0.402923 0.17485 0.574927 -0.494099 0.0552514 0.657412 -0.621159 0.0332663 0.745522 -0.709673 0.121773 0.551007 -0.825521 0.315604 0.536089 -0.730008 0.434289 0.490474 -0.584891 0.451373 0.440882 -0.475178 0.356848 0.416363 -0.465137 0.206085 0.431281 -0.560649 0.0873993 0.476896 -0.705766 0.0703155 0.526488 -0.815479 0.164841 0.304595 -0.870375 0.330244 0.299527 -0.77469 0.449618 0.29148 -0.622739 0.466275 0.285166 -0.503532 0.370456 0.284285 -0.486898 0.218292 0.289353 -0.582583 0.0989174 0.297401 -0.734534 0.0822608 0.303714 -0.853741 0.178079 0.0760747 -0.853537 0.311039 0.0740177 -0.759045 0.431448 0.0980713 -0.609266 0.45192 0.134145 -0.491938 0.360462 0.161108 -0.475792 0.21065 0.163165 -0.570284 0.0902408 0.139112 -0.720064 0.0697688 0.103038 -0.837391 0.161226 -0.1151 -0.796829 0.260925 -0.121743 -0.701586 0.380576 -0.075998 -0.557967 0.407268 -0.0046616 -0.450102 0.325368 0.0504781 -0.441177 0.182849 0.057121 -0.53642 0.0631992 0.0113757 -0.680038 0.0365064 -0.0599607 -0.787903 0.118407 -0.262324 -0.725952 0.188158 -0.278891 -0.626806 0.303602 -0.223522 -0.487739 0.335634 -0.128651 -0.390214 0.265492 -0.0498526 -0.391361 0.134263 -0.0332857 -0.490506 0.0188199 -0.0886548 -0.629573 -0.0132125 -0.183526 -0.727098 0.0569298 -0.372837 -0.660423 0.104212 -0.400224 -0.556537 0.213249 -0.344836 -0.417888 0.247015 -0.239119 -0.325695 0.185731 -0.145 -0.333963 0.0652954 -0.117613 -0.437849 -0.0437417 -0.173 -0.576498 -0.077508 -0.278717 -0.668691 -0.0162238 -0.463765 -0.605984 0.0183554 -0.497614 -0.500255 0.123746 -0.446192 -0.359881 0.156647 -0.339623 -0.267092 0.0977871 -0.240332 -0.276242 -0.0183554 -0.206483 -0.381971 -0.123745 -0.257904 -0.522344 -0.156647 -0.364474 -0.615134 -0.0977871 -0.555166 -0.555798 -0.066053 -0.586487 -0.453333 0.043269 -0.536201 -0.312889 0.0775972 -0.433767 -0.216737 0.0168226 -0.339189 -0.221202 -0.103454 -0.307869 -0.323667 -0.212776 -0.358154 -0.464111 -0.247104 -0.460588 -0.560263 -0.186329 -0.662885 -0.495954 -0.147625 -0.681035 -0.40325 -0.0271753 -0.623495 -0.267743 0.0147582 -0.523972 -0.16881 -0.0463885 -0.440765 -0.164406 -0.174797 -0.422615 -0.257109 -0.295246 -0.480155 -0.392616 -0.33718 -0.579678 -0.491549 -0.276033 -0.791919 -0.408513 -0.220497 -0.789658 -0.333738 -0.0869485 -0.714942 -0.211761 -0.0324458 -0.61154 -0.114033 -0.0889154 -0.540023 -0.0978028 -0.223278 -0.542285 -0.172577 -0.356826 -0.617 -0.294555 -0.411329 -0.720402 -0.392283 -0.354859 -0.931715 -0.276074 -0.274048 -0.908996 -0.227137 -0.130798 -0.811279 -0.130263 -0.0637276 -0.695807 -0.0421996 -0.112126 -0.630221 -0.0145326 -0.247641 -0.65294 -0.0634692 -0.390891 -0.750656 -0.160343 -0.457961 -0.866129 -0.248407 -0.409563 -1.05796 -0.0900454 -0.298258 -1.02124 -0.0713647 -0.150831 -0.902374 -0.0108795 -0.0757118 -0.770979 0.0559787 -0.116904 -0.704029 0.0900453 -0.250278 -0.740742 0.0713646 -0.397705 -0.859612 0.0108794 -0.472824 -0.991007 -0.0559788 -0.431632 -1.14146 0.144012 -0.288402 -1.09994 0.132584 -0.141513 -0.968686 0.149252 -0.0645272 -0.824597 0.184251 -0.102541 -0.752076 0.217079 -0.233287 -0.793604 0.228506 -0.380175 -0.924855 0.211839 -0.457162 -1.06894 0.17684 -0.419148 -1.15776 0.407336 -0.245681 -1.12011 0.369235 -0.102285 -0.988972 0.339958 -0.0289512 -0.84117 0.336655 -0.0686366 -0.76328 0.361261 -0.198094 -0.800931 0.399361 -0.341489 -0.932066 0.428639 -0.414824 -1.07987 0.431942 -0.375138 -1.09299 0.672381 -0.175534 -1.0662 0.612722 -0.0371343 -0.948404 0.540352 0.0285833 -0.808609 0.497665 -0.0168778 -0.728703 0.509666 -0.146887 -0.755493 0.569325 -0.285287 -0.873287 0.641695 -0.351005 -1.01308 0.684382 -0.305544 -0.946467 0.908233 -0.0859502 -0.935708 0.83295 0.046896 -0.84326 0.724417 0.102624 -0.723279 0.646212 0.0485885 -0.646046 0.644146 -0.0835567 -0.656805 0.71943 -0.216403 -0.749252 0.827962 -0.272131 -0.869234 0.906167 -0.218095 -0.730665 1.08623 0.0136632 -0.739325 1.0018 0.14105 -0.681786 0.867199 0.185811 -0.591754 0.76128 0.121727 -0.521967 0.746088 -0.0136633 -0.513307 0.830522 -0.14105 -0.570846 0.965122 -0.185811 -0.660878 1.07104 -0.121727 -0.468928 1.18519 0.11328 -0.498391 1.0984 0.235879 -0.482009 0.950069 0.26995 -0.429379 0.827089 0.195536 -0.37133 0.801501 0.0562271 -0.341867 0.888294 -0.0663717 -0.358249 1.03662 -0.100443 -0.410879 1.1596 -0.0260293 -0.191185 1.19527 0.202956 -0.240448 1.11266 0.322039 -0.267467 0.964058 0.34691 -0.256415 0.836509 0.263001 -0.213766 0.804731 0.119465 -0.164503 0.887339 0.000382881 -0.137484 1.03594 -0.0244886 -0.148536 1.16349 0.0594201 0.0715552 1.11969 0.273525 0.00608762 1.04645 0.390922 -0.0621312 0.910658 0.409301 -0.0931397 0.791852 0.317896 -0.0687734 0.759628 0.17025 -0.00330586 0.832863 0.0528523 0.064913 0.968656 0.0344734 0.0959215 1.08746 0.125879 0.292849 0.974045 0.317339 0.216954 0.912481 0.435158 0.114124 0.800184 0.450866 0.0445936 0.702937 0.355262 0.0490943 0.677706 0.20435 0.124989 0.73927 0.0865311 0.22782 0.851566 0.0708227 0.29735 0.948813 0.166426 0.455666 0.783464 0.329199 0.37588 0.731588 0.449093 0.248388 0.648694 0.466576 0.147872 0.58334 0.371409 0.133214 0.573809 0.219337 0.213 0.625685 0.0994431 0.340493 0.708579 0.0819592 0.441008 0.773933 0.177127 0.555738 0.577783 0.3076 0.477095 0.529256 0.429632 0.335871 0.474933 0.45279 0.214794 0.446635 0.36351 0.184789 0.46094 0.214089 0.263432 0.509467 0.092057 0.404656 0.56379 0.0688984 0.525733 0.592087 0.158179 0.602318 0.384866 0.256 0.526605 0.331302 0.377778 0.380342 0.297973 0.408237 0.249208 0.304402 0.329535 0.21002 0.346823 0.187774 0.285733 0.400387 0.0659964 0.431996 0.433717 0.0355373 0.56313 0.427288 0.11424 0.614539 0.222932 0.182934 0.540936 0.158042 0.300422 0.39403 0.134413 0.336361 0.259876 0.165886 0.2697 0.21706 0.234025 0.139487 0.290664 0.298915 0.0219997 0.43757 0.322544 -0.01394 0.571723 0.291071 0.0527211 0.612979 0.095046 0.0993822 0.54068 0.018068 0.210192 0.394164 -0.00582397 0.247522 0.259256 0.0373657 0.189504 0.214985 0.122337 0.0701247 0.287283 0.199315 -0.040685 0.4338 0.223207 -0.0780146 0.568707 0.180017 -0.0199969 0.611222 -0.010721 0.0137491 0.540538 -0.0942119 0.120822 0.394549 -0.122515 0.157118 0.258772 -0.0790501 0.101377 0.212745 0.0107211 -0.0137491 0.283429 0.094212 -0.120821 0.429418 0.122515 -0.157118 0.565195 0.0790502 -0.101377 0.61339 -0.115192 -0.0708197 0.544285 -0.194706 0.0402366 0.39885 -0.223834 0.0780755 0.262279 -0.185513 0.0205313 0.214574 -0.102191 -0.0986872 0.283678 -0.0226768 -0.209744 0.429113 0.00645086 -0.247582 0.565684 -0.0318703 -0.190038 0.615312 -0.239266 -0.152347 0.547759 -0.302298 -0.0303013 0.402907 -0.322087 0.0150592 0.265607 -0.287041 -0.0428368 0.216288 -0.21769 -0.170075 0.28384 -0.154658 -0.29212 0.428693 -0.134869 -0.337481 0.565993 -0.169915 -0.279585 0.603881 -0.395892 -0.224523 0.540906 -0.432178 -0.0898047 0.399003 -0.429606 -0.0324589 0.261298 -0.389683 -0.0860778 0.208457 -0.335796 -0.219252 0.271432 -0.299511 -0.35397 0.413335 -0.302083 -0.411316 0.551039 -0.342005 -0.357697 0.558831 -0.58399 -0.277133 0.507196 -0.589659 -0.133143 0.375348 -0.554148 -0.0639586 0.240521 -0.49826 -0.110107 0.181696 -0.454733 -0.244556 0.233331 -0.449064 -0.388546 0.365179 -0.484575 -0.45773 0.500006 -0.540463 -0.411581 0.460625 -0.786688 -0.300868 0.42772 -0.765293 -0.152912 0.316741 -0.693136 -0.0760447 0.192699 -0.612486 -0.115294 0.128255 -0.570585 -0.247667 0.161161 -0.59198 -0.395623 0.272139 -0.664137 -0.472491 0.396181 -0.744787 -0.433242 0.299392 -0.976155 -0.291249 0.290011 -0.936038 -0.143824 0.210899 -0.83139 -0.064948 0.108398 -0.723511 -0.100825 0.0425519 -0.675596 -0.230439 0.0519324 -0.715712 -0.377864 0.131045 -0.82036 -0.456741 0.233546 -0.928239 -0.420864 0.0790576 -1.12191 -0.249294 0.0945587 -1.0727 -0.10518 0.0554833 -0.945547 -0.0294313 -0.0152786 -0.814948 -0.0664208 -0.0762758 -0.757403 -0.19448 -0.0917769 -0.806619 -0.338595 -0.0527016 -0.933767 -0.414343 0.0180604 -1.06437 -0.377354 -0.183404 -1.19818 -0.180182 -0.144337 -1.14866 -0.0407094 -0.139327 -1.01205 0.0281752 -0.171308 -0.868386 -0.0138799 -0.221546 -0.801817 -0.142239 -0.260613 -0.851341 -0.281712 -0.265624 -0.987948 -0.350597 -0.233643 -1.13161 -0.308541 -0.461462 -1.18891 -0.0917207 -0.401911 -1.14637 0.0427267 -0.353031 -1.0142 0.102498 -0.343457 -0.869812 0.0525799 -0.378795 -0.797789 -0.0777862 -0.438347 -0.840321 -0.212234 -0.487226 -0.972494 -0.272005 -0.496801 -1.11688 -0.222087 -0.723964 -1.09057 0.00676369 -0.648297 -1.06073 0.136439 -0.559754 -0.946206 0.18619 -0.510202 -0.814079 0.126874 -0.528668 -0.741749 -0.00676382 -0.604335 -0.771588 -0.136439 -0.692878 -0.886115 -0.18619 -0.74243 -1.01824 -0.126874 -0.940824 -0.912865 0.10525 -0.854478 -0.899628 0.23095 -0.734026 -0.814082 0.27101 -0.650028 -0.70634 0.201964 -0.651688 -0.639515 0.0642574 -0.738035 -0.652752 -0.0614428 -0.858487 -0.738297 -0.101503 -0.942485 -0.846039 -0.032457 -1.08853 -0.676881 0.193738 -0.997652 -0.68186 0.316817 -0.855928 -0.633628 0.348744 -0.746373 -0.560439 0.270817 -0.733165 -0.505166 0.128684 -0.824039 -0.500187 0.00560425 -0.965763 -0.548419 -0.0263231 -1.07532 -0.621608 0.0516043 -1.15439 -0.411236 0.262963 -1.06501 -0.433105 0.385288 -0.914415 -0.426383 0.411896 -0.790829 -0.395009 0.327199 -0.766645 -0.35736 0.180812 -0.85603 -0.335492 0.0584864 -1.00662 -0.342213 0.0318787 -1.13021 -0.373588 0.116575 -1.13886 -0.146839 0.305185 -1.05532 -0.180979 0.428825 -0.908191 -0.214866 0.454064 -0.783664 -0.228648 0.366118 -0.754683 -0.214252 0.216504 -0.838224 -0.180112 0.092864 -0.98535 -0.146226 0.0676249 -1.10988 -0.132444 0.155571 -1.05546 0.0887768 0.315236 -0.978545 0.0496374 0.441659 -0.84448 -0.0185791 0.470027 -0.731805 -0.0759122 0.383722 -0.706522 -0.0887771 0.2333 -0.783442 -0.0496376 0.106877 -0.917506 0.0185788 0.0785087 -1.03018 0.075912 0.164814 -0.928331 0.276899 0.291933 -0.854123 0.24053 0.420782 -0.737062 0.148378 0.455941 -0.645721 0.0544246 0.376816 -0.633605 0.0137061 0.229756 -0.707813 0.0500752 0.100907 -0.824874 0.142227 0.0657474 -0.916215 0.236181 0.144873 -0.786413 0.411864 0.239378 -0.707808 0.383561 0.367642 -0.604695 0.27887 0.410525 -0.537477 0.159117 0.342906 -0.545529 0.0944509 0.204396 -0.624135 0.122753 0.0761325 -0.727247 0.227445 0.0332499 -0.794465 0.347198 0.100869 -0.654558 0.501694 0.166578 -0.565659 0.482781 0.289747 -0.468656 0.374476 0.337622 -0.420373 0.240223 0.282157 -0.449092 0.158665 0.155844 -0.537991 0.177579 0.0326744 -0.634994 0.285884 -0.0152002 -0.683277 0.420137 0.0402643 -0.544702 0.56311 0.0840524 -0.44516 0.552075 0.199815 -0.346799 0.44522 0.248176 -0.30724 0.305139 0.200806 -0.349654 0.21389 0.0854545 -0.449197 0.224925 -0.030308 -0.547557 0.33178 -0.0786691 -0.587116 0.47186 -0.0312995 -0.452733 0.613918 -0.00101605 -0.348389 0.607574 0.110803 -0.246189 0.503719 0.157716 -0.206 0.363191 0.11224 -0.251364 0.268308 0.00101618 -0.355707 0.274652 -0.110803 -0.457908 0.378507 -0.157716 -0.498097 0.519035 -0.11224 -0.362631 0.668195 -0.08614 -0.262962 0.661072 0.0298202 -0.160924 0.557952 0.0786647 -0.11629 0.419239 0.031781 -0.155205 0.326191 -0.0833669 -0.254874 0.333313 -0.199327 -0.356913 0.436434 -0.248172 -0.401547 0.575146 -0.201288 -0.254192 0.732783 -0.168653 -0.16974 0.718503 -0.0417848 -0.0772913 0.610587 0.0151249 -0.0310005 0.47225 -0.0312604 -0.0579844 0.384529 -0.153769 -0.142436 0.398809 -0.280637 -0.234885 0.506725 -0.337546 -0.281176 0.645062 -0.291161 -0.110013 0.802289 -0.24109 -0.0503428 0.778216 -0.102197 0.0198902 0.660879 -0.0334163 0.0595441 0.519011 -0.0750398 0.0453902 0.435717 -0.202685 -0.0142803 0.459789 -0.341578 -0.0845133 0.577127 -0.410358 -0.124167 0.718994 -0.368735 0.0781852 0.857898 -0.292909 0.107284 0.827785 -0.145674 0.143006 0.702118 -0.065905 0.164427 0.554511 -0.100328 0.158998 0.471431 -0.228779 0.129899 0.501545 -0.376013 0.0941767 0.627212 -0.455783 0.0727561 0.774818 -0.42136 0.304792 0.874101 -0.315333 0.303296 0.845848 -0.164897 0.296612 0.719644 -0.0785291 0.288656 0.569419 -0.106822 0.284088 0.483172 -0.233202 0.285584 0.511425 -0.383638 0.292268 0.637629 -0.470007 0.300224 0.787854 -0.441714 0.550501 0.828717 -0.304483 0.523383 0.810292 -0.154962 0.47301 0.695234 -0.0674651 0.428891 0.550942 -0.0932475 0.416869 0.46194 -0.217206 0.443987 0.480365 -0.366727 0.494359 0.595424 -0.454224 0.538479 0.739716 -0.428441 0.787182 0.710215 -0.261619 0.741913 0.707197 -0.115423 0.652769 0.615234 -0.0315931 0.571969 0.488195 -0.0592347 0.546845 0.400499 -0.182156 0.592113 0.403517 -0.328351 0.681258 0.49548 -0.412182 0.762058 0.622519 -0.38454 0.984301 0.520595 -0.191897 0.928727 0.535824 -0.0500835 0.810169 0.476747 0.0266331 0.698077 0.377971 -0.00668668 0.658113 0.297358 -0.130525 0.713687 0.282129 -0.272338 0.832245 0.341206 -0.349054 0.944337 0.439981 -0.315735 1.11489 0.274887 -0.10302 1.05624 0.308999 0.0341975 0.920291 0.289311 0.101735 0.786673 0.227356 0.0600301 0.733659 0.159427 -0.0664871 0.792304 0.125315 -0.203704 0.928254 0.145003 -0.271242 1.06187 0.206958 -0.229537 geomview-1.9.4/data/geom/catenoid0000644000175000001440000003634307730233104013645 00000000000000OFF 420 400 820 3.7622 0 -2 3.10747 0 -1.8 2.45131 0.79648 -1.6 2.1509 0 -1.4 2.04563 0.664664 -1.4 1.72204 0.559523 -1.2 1.46756 0.476838 -1 1.54308 0 -1 1.18546 0 -0.6 1.08107 0 -0.4 0.970141 0.315218 0.2 1.02007 0 0.2 1.02816 0.33407 0.4 1.12744 0.366329 0.6 1.18546 0 0.6 1.33744 0 0.8 1.27198 0.41329 0.8 1.46756 0.476838 1 1.54308 0 1 1.72204 0.559523 1.2 2.57746 0 1.6 2.45131 0.79648 1.6 3.10747 0 1.8 3.57806 1.16258 2 3.7622 0 2 3.57806 1.16258 -2 2.514 1.82653 -1.8 2.95538 0.960262 -1.8 1.24838 0.907 -1 1.08201 0.786125 -0.8 1.27198 0.41329 -0.8 1.12744 0.366329 -0.6 1.02816 0.33407 -0.4 0.970141 0.315218 -0.2 0.951057 0.309017 0 0.874606 0.635438 0.4 1.08201 0.786125 0.8 1.24838 0.907 1 1.46485 1.06428 1.2 2.04563 0.664664 1.4 2.95538 0.960262 1.8 3.04368 2.21136 2 3.04368 2.21136 -2 1.82653 2.514 -1.8 2.08521 1.515 -1.6 1.515 2.08521 -1.6 1.74011 1.26427 -1.4 1.06428 1.46485 -1.2 1.46485 1.06428 -1.2 0.907 1.24838 -1 0.696799 0.959062 -0.6 0.959062 0.696799 -0.6 0.874606 0.635438 -0.4 0.635438 0.874606 -0.4 0.825251 0.59958 -0.2 0.59958 0.825251 -0.2 0.587785 0.809017 0 0.809017 0.587785 0 0.59958 0.825251 0.2 0.825251 0.59958 0.2 0.635438 0.874606 0.4 0.959062 0.696799 0.6 0.696799 0.959061 0.6 0.786125 1.08201 0.8 1.74011 1.26427 1.4 1.26427 1.74011 1.4 1.515 2.08521 1.6 2.08521 1.515 1.6 2.514 1.82653 1.8 1.82653 2.514 1.8 2.21136 3.04368 2 2.21136 3.04368 -2 1.16258 3.57806 -2 0.960262 2.95538 -1.8 1.26427 1.74011 -1.4 0.559523 1.72204 -1.2 0.786125 1.08201 -0.8 0.41329 1.27198 -0.8 0.33407 1.02816 -0.4 0.315218 0.970141 -0.2 0.33407 1.02816 0.4 0.41329 1.27198 0.8 0.907 1.24838 1 0.476838 1.46756 1 1.06428 1.46485 1.2 0.79648 2.45131 1.6 0 3.10747 -1.8 0.79648 2.45131 -1.6 0 2.57746 -1.6 0.664664 2.04563 -1.4 0 1.81066 -1.2 0 1.54308 -1 0.476838 1.46756 -1 0 1.33744 -0.8 0.366329 1.12744 -0.6 0 1.18546 -0.6 0.309017 0.951057 0 0.315218 0.970141 0.2 0 1.08107 0.4 0.366329 1.12744 0.6 0 1.18546 0.6 0 1.54308 1 0.559523 1.72204 1.2 0.664664 2.04563 1.4 0 2.57746 1.6 0.960262 2.95538 1.8 1.16258 3.57806 2 0 3.7622 -2 -1.16258 3.57806 -2 -0.960262 2.95538 -1.8 0 2.1509 -1.4 -0.476838 1.46756 -1 0 1.08107 -0.4 0 1.02007 -0.2 -0.309017 0.951057 0 0 1 0 0 1.02007 0.2 -0.315218 0.970141 0.2 -0.41329 1.27198 0.8 0 1.33744 0.8 -0.559523 1.72204 1.2 0 1.81066 1.2 -0.664664 2.04563 1.4 0 2.1509 1.4 -0.79648 2.45131 1.6 0 3.10747 1.8 0 3.7622 2 -2.21136 3.04368 -2 -1.82653 2.514 -1.8 -0.79648 2.45131 -1.6 -0.664664 2.04563 -1.4 -0.559523 1.72204 -1.2 -1.06428 1.46485 -1.2 -0.907 1.24838 -1 -0.786125 1.08201 -0.8 -0.41329 1.27198 -0.8 -0.696799 0.959062 -0.6 -0.366329 1.12744 -0.6 -0.33407 1.02816 -0.4 -0.635438 0.874606 -0.4 -0.315218 0.970141 -0.2 -0.587785 0.809017 0 -0.59958 0.825251 0.2 -0.33407 1.02816 0.4 -0.366329 1.12744 0.6 -0.476838 1.46756 1 -1.06428 1.46485 1.2 -1.26427 1.74011 1.4 -0.960262 2.95538 1.8 -2.21136 3.04368 2 -1.16258 3.57806 2 -3.04368 2.21136 -2 -2.08521 1.515 -1.6 -1.515 2.08521 -1.6 -1.26427 1.74011 -1.4 -1.08201 0.786125 -0.8 -0.874606 0.635438 -0.4 -0.59958 0.825251 -0.2 -0.809017 0.587785 0 -0.825251 0.59958 0.2 -0.635438 0.874606 0.4 -0.696799 0.959062 0.6 -0.786124 1.08201 0.8 -0.907 1.24838 1 -1.74011 1.26427 1.4 -2.08521 1.515 1.6 -1.51499 2.08521 1.6 -1.82653 2.514 1.8 -3.57806 1.16258 -2 -2.514 1.82653 -1.8 -2.95538 0.960262 -1.8 -1.74011 1.26427 -1.4 -1.46485 1.06428 -1.2 -1.24838 0.907 -1 -0.959061 0.696799 -0.6 -1.12744 0.366329 -0.6 -0.825251 0.59958 -0.2 -0.970141 0.315218 -0.2 -0.951057 0.309017 0 -0.874606 0.635438 0.4 -1.12744 0.366329 0.6 -0.959061 0.696799 0.6 -1.08201 0.786125 0.8 -1.24838 0.907 1 -1.46485 1.06428 1.2 -1.72204 0.559523 1.2 -2.514 1.82653 1.8 -3.04368 2.21136 2 -3.7622 0 -2 -2.45131 0.79648 -1.6 -2.1509 0 -1.4 -2.04563 0.664664 -1.4 -1.72204 0.559523 -1.2 -1.46756 0.476838 -1 -1.33744 0 -0.8 -1.27198 0.41329 -0.8 -1.02816 0.33407 -0.4 -1.08107 0 -0.4 -1 0 0 -0.970141 0.315218 0.2 -1.08107 0 0.4 -1.02816 0.33407 0.4 -1.18546 0 0.6 -1.27198 0.41329 0.8 -1.33744 0 0.8 -1.46756 0.476838 1 -1.81066 0 1.2 -2.04563 0.664664 1.4 -2.45131 0.796481 1.6 -2.95538 0.960262 1.8 -3.10747 0 1.8 -3.57806 1.16258 2 -3.10747 0 -1.8 -2.57746 0 -1.6 -2.45131 -0.79648 -1.6 -1.81066 0 -1.2 -1.54308 0 -1 -1.12744 -0.366329 -0.6 -1.18546 0 -0.6 -0.970141 -0.315218 -0.2 -1.02007 0 -0.2 -0.951057 -0.309017 0 -1.02007 0 0.2 -0.970141 -0.315218 0.2 -1.12744 -0.366329 0.6 -1.27198 -0.41329 0.8 -1.54308 0 1 -2.1509 0 1.4 -2.45131 -0.79648 1.6 -2.57746 0 1.6 -2.95538 -0.960262 1.8 -3.7622 0 2 -3.57806 -1.16258 -2 -2.514 -1.82653 -1.8 -2.95538 -0.960262 -1.8 -2.04563 -0.664664 -1.4 -1.72204 -0.559523 -1.2 -1.24838 -0.907 -1 -1.46756 -0.476838 -1 -1.27198 -0.41329 -0.8 -0.959062 -0.696799 -0.6 -1.02816 -0.33407 -0.4 -0.825251 -0.59958 0.2 -1.02816 -0.33407 0.4 -0.874606 -0.635438 0.4 -0.959062 -0.696799 0.6 -1.08201 -0.786124 0.8 -1.24838 -0.907 1 -1.46756 -0.476838 1 -1.72204 -0.559523 1.2 -2.04563 -0.664664 1.4 -3.04368 -2.21136 2 -3.57806 -1.16258 2 -3.04368 -2.21136 -2 -1.82653 -2.514 -1.8 -2.08521 -1.515 -1.6 -1.515 -2.08521 -1.6 -1.74011 -1.26427 -1.4 -1.46485 -1.06428 -1.2 -1.08201 -0.786124 -0.8 -0.786125 -1.08201 -0.8 -0.696799 -0.959061 -0.6 -0.874606 -0.635438 -0.4 -0.635438 -0.874606 -0.4 -0.59958 -0.825251 -0.2 -0.825251 -0.59958 -0.2 -0.809017 -0.587785 0 -0.59958 -0.825251 0.2 -0.635438 -0.874606 0.4 -0.696799 -0.959061 0.6 -0.786125 -1.08201 0.8 -0.907 -1.24838 1 -1.46485 -1.06428 1.2 -1.74011 -1.26427 1.4 -2.08521 -1.51499 1.6 -2.514 -1.82653 1.8 -2.21136 -3.04368 2 -2.21136 -3.04368 -2 -1.16258 -3.57806 -2 -0.664664 -2.04563 -1.4 -1.26427 -1.74011 -1.4 -1.06428 -1.46485 -1.2 -0.559523 -1.72204 -1.2 -0.476838 -1.46756 -1 -0.907 -1.24838 -1 -0.41329 -1.27198 -0.8 -0.315218 -0.970141 -0.2 -0.587785 -0.809017 0 -0.315218 -0.970141 0.2 -0.41329 -1.27198 0.8 -0.476838 -1.46756 1 -1.06428 -1.46485 1.2 -0.664664 -2.04563 1.4 -1.26427 -1.74011 1.4 -0.796481 -2.45131 1.6 -1.515 -2.08521 1.6 -1.82653 -2.514 1.8 -0.960262 -2.95538 -1.8 -0.79648 -2.45131 -1.6 0 -2.1509 -1.4 0 -1.81066 -1.2 0 -1.54308 -1 -0.366329 -1.12744 -0.6 -0.33407 -1.02816 -0.4 0 -1.08107 -0.4 0 -1 0 -0.309017 -0.951056 0 0 -1.02007 0.2 -0.33407 -1.02816 0.4 -0.366329 -1.12744 0.6 0 -1.54308 1 0 -1.81066 1.2 -0.559524 -1.72204 1.2 0 -2.1509 1.4 0 -2.57746 1.6 -0.960262 -2.95538 1.8 0 -3.10747 1.8 0 -3.7622 2 -1.16258 -3.57806 2 0 -3.7622 -2 0 -3.10747 -1.8 0.960262 -2.95538 -1.8 0 -2.57746 -1.6 0 -1.33744 -0.8 0 -1.18546 -0.6 0.33407 -1.02816 -0.4 0 -1.02007 -0.2 0.309017 -0.951057 0 0 -1.08107 0.4 0 -1.18546 0.6 0 -1.33744 0.8 0.41329 -1.27198 0.8 0.476838 -1.46756 1 0.664664 -2.04563 1.4 1.16258 -3.57806 -2 2.21136 -3.04368 -2 1.82653 -2.514 -1.8 0.79648 -2.45131 -1.6 0.664664 -2.04563 -1.4 0.559523 -1.72204 -1.2 1.06428 -1.46485 -1.2 0.476838 -1.46756 -1 0.907 -1.24838 -1 0.41329 -1.27198 -0.8 0.786124 -1.08201 -0.8 0.366329 -1.12744 -0.6 0.315218 -0.970141 -0.2 0.59958 -0.825251 -0.2 0.587785 -0.809017 0 0.315218 -0.970141 0.2 0.59958 -0.825251 0.2 0.33407 -1.02816 0.4 0.366329 -1.12744 0.6 0.786124 -1.08201 0.8 0.559523 -1.72204 1.2 1.06428 -1.46485 1.2 0.79648 -2.45131 1.6 0.960262 -2.95538 1.8 2.21136 -3.04368 2 1.16258 -3.57806 2 3.04368 -2.21136 -2 2.514 -1.82653 -1.8 2.08521 -1.515 -1.6 1.51499 -2.08521 -1.6 1.26427 -1.74011 -1.4 1.08201 -0.786125 -0.8 0.696799 -0.959062 -0.6 0.635438 -0.874606 -0.4 0.874606 -0.635438 -0.4 0.809017 -0.587785 0 0.635438 -0.874606 0.4 0.874606 -0.635438 0.4 0.696799 -0.959062 0.6 0.907 -1.24838 1 1.46485 -1.06428 1.2 1.74011 -1.26427 1.4 1.26427 -1.74011 1.4 1.51499 -2.08521 1.6 1.82653 -2.514 1.8 2.514 -1.82653 1.8 3.57806 -1.16258 -2 2.95538 -0.960262 -1.8 1.74011 -1.26427 -1.4 1.72204 -0.559523 -1.2 1.46485 -1.06428 -1.2 1.24838 -0.907 -1 1.27198 -0.41329 -0.8 1.12744 -0.366329 -0.6 0.959061 -0.696799 -0.6 1.02816 -0.33407 -0.4 0.825251 -0.59958 -0.2 0.951056 -0.309017 0 0.825251 -0.59958 0.2 0.970141 -0.315218 0.2 1.02816 -0.33407 0.4 0.959061 -0.696799 0.6 1.27198 -0.41329 0.8 1.08201 -0.786125 0.8 1.24838 -0.907 1 2.08521 -1.515 1.6 2.95538 -0.960262 1.8 3.04368 -2.21136 2 2.57746 0 -1.6 2.45131 -0.796481 -1.6 2.04563 -0.664664 -1.4 1.81066 0 -1.2 1.46756 -0.476838 -1 1.33744 0 -0.8 1.02007 0 -0.2 0.970141 -0.315218 -0.2 1 0 0 1.08107 0 0.4 1.12744 -0.366329 0.6 1.46756 -0.476838 1 1.72204 -0.559524 1.2 1.81066 0 1.2 2.1509 0 1.4 2.04563 -0.664664 1.4 2.45131 -0.796481 1.6 3.57806 -1.16258 2 4 0 25 27 1 4 1 27 2 402 4 402 2 4 3 4 3 4 5 405 4 405 5 6 7 4 7 6 30 407 4 407 30 31 8 4 8 31 32 9 4 9 32 33 408 4 408 33 34 410 4 410 34 10 11 4 11 10 12 411 4 411 12 13 14 4 14 13 16 15 4 15 16 17 18 4 18 17 19 415 4 415 19 39 416 4 416 39 21 20 4 20 21 40 22 4 22 40 23 24 4 25 42 26 27 4 27 26 44 2 4 2 44 46 4 4 4 46 48 5 4 5 48 28 6 4 6 28 29 30 4 30 29 51 31 4 31 51 52 32 4 32 52 54 33 4 33 54 57 34 4 34 57 59 10 4 10 59 35 12 4 12 35 61 13 4 13 61 36 16 4 16 36 37 17 4 17 37 38 19 4 19 38 64 39 4 39 64 67 21 4 21 67 68 40 4 40 68 41 23 4 42 71 43 26 4 26 43 45 44 4 44 45 74 46 4 46 74 47 48 4 48 47 49 28 4 28 49 76 29 4 29 76 50 51 4 51 50 53 52 4 52 53 55 54 4 54 55 56 57 4 57 56 58 59 4 59 58 60 35 4 35 60 62 61 4 61 62 63 36 4 36 63 82 37 4 37 82 84 38 4 38 84 65 64 4 64 65 66 67 4 67 66 69 68 4 68 69 70 41 4 71 72 73 43 4 43 73 87 45 4 45 87 89 74 4 74 89 75 47 4 47 75 92 49 4 49 92 77 76 4 76 77 94 50 4 50 94 78 53 4 53 78 79 55 4 55 79 96 56 4 56 96 97 58 4 58 97 80 60 4 60 80 99 62 4 62 99 81 63 4 63 81 83 82 4 82 83 102 84 4 84 102 103 65 4 65 103 85 66 4 66 85 105 69 4 69 105 106 70 4 72 107 86 73 4 73 86 88 87 4 87 88 110 89 4 89 110 90 75 4 75 90 91 92 4 92 91 93 77 4 77 93 95 94 4 94 95 112 78 4 78 112 113 79 4 79 113 115 96 4 96 115 116 97 4 97 116 98 80 4 80 98 100 99 4 99 100 119 81 4 81 119 101 83 4 83 101 121 102 4 102 121 123 103 4 103 123 104 85 4 85 104 125 105 4 105 125 126 106 4 107 108 109 86 4 86 109 129 88 4 88 129 130 110 4 110 130 131 90 4 90 131 111 91 4 91 111 135 93 4 93 135 137 95 4 95 137 138 112 4 112 138 140 113 4 113 140 114 115 4 115 114 117 116 4 116 117 143 98 4 98 143 144 100 4 100 144 118 119 4 119 118 145 101 4 101 145 120 121 4 121 120 122 123 4 123 122 124 104 4 104 124 148 125 4 125 148 150 126 4 108 127 128 109 4 109 128 153 129 4 129 153 154 130 4 130 154 132 131 4 131 132 133 111 4 111 133 134 135 4 135 134 136 137 4 137 136 139 138 4 138 139 157 140 4 140 157 141 114 4 114 141 142 117 4 117 142 160 143 4 143 160 161 144 4 144 161 162 118 4 118 162 163 145 4 145 163 146 120 4 120 146 147 122 4 122 147 166 124 4 124 166 167 148 4 148 167 149 150 4 127 151 169 128 4 128 169 152 153 4 153 152 171 154 4 154 171 172 132 4 132 172 173 133 4 133 173 155 134 4 134 155 174 136 4 136 174 156 139 4 139 156 176 157 4 157 176 158 141 4 141 158 159 142 4 142 159 179 160 4 160 179 181 161 4 161 181 182 162 4 162 182 183 163 4 163 183 184 146 4 146 184 164 147 4 147 164 165 166 4 166 165 186 167 4 167 186 187 149 4 151 168 170 169 4 169 170 189 152 4 152 189 191 171 4 171 191 192 172 4 172 192 193 173 4 173 193 195 155 4 155 195 175 174 4 174 175 196 156 4 156 196 177 176 4 176 177 178 158 4 158 178 199 159 4 159 199 201 179 4 179 201 180 181 4 181 180 203 182 4 182 203 205 183 4 183 205 185 184 4 184 185 207 164 4 164 207 208 165 4 165 208 209 186 4 186 209 211 187 4 168 188 212 170 4 170 212 213 189 4 189 213 190 191 4 191 190 215 192 4 192 215 216 193 4 193 216 194 195 4 195 194 218 175 4 175 218 197 196 4 196 197 220 177 4 177 220 198 178 4 178 198 222 199 4 199 222 200 201 4 201 200 202 180 4 180 202 204 203 4 203 204 226 205 4 205 226 206 185 4 185 206 227 207 4 207 227 229 208 4 208 229 210 209 4 209 210 231 211 4 188 232 234 212 4 212 234 214 213 4 213 214 235 190 4 190 235 236 215 4 215 236 238 216 4 216 238 239 194 4 194 239 217 218 4 218 217 241 197 4 197 241 219 220 4 220 219 221 198 4 198 221 223 222 4 222 223 243 200 4 200 243 224 202 4 202 224 225 204 4 204 225 248 226 4 226 248 249 206 4 206 249 250 227 4 227 250 228 229 4 229 228 230 210 4 210 230 252 231 4 232 253 233 234 4 234 233 255 214 4 214 255 257 235 4 235 257 258 236 4 236 258 237 238 4 238 237 259 239 4 239 259 240 217 4 217 240 262 241 4 241 262 265 219 4 219 265 266 221 4 221 266 242 223 4 223 242 244 243 4 243 244 245 224 4 224 245 246 225 4 225 246 247 248 4 248 247 272 249 4 249 272 273 250 4 250 273 274 228 4 228 274 275 230 4 230 275 251 252 4 253 277 254 233 4 233 254 256 255 4 255 256 280 257 4 257 280 281 258 4 258 281 284 237 4 237 284 260 259 4 259 260 261 240 4 240 261 263 262 4 262 263 264 265 4 265 264 287 266 4 266 287 267 242 4 242 267 268 244 4 244 268 269 245 4 245 269 270 246 4 246 270 271 247 4 247 271 291 272 4 272 291 293 273 4 273 293 295 274 4 274 295 296 275 4 275 296 276 251 4 277 278 297 254 4 254 297 298 256 4 256 298 279 280 4 280 279 282 281 4 281 282 283 284 4 284 283 285 260 4 260 285 302 261 4 261 302 303 263 4 263 303 286 264 4 264 286 306 287 4 287 306 288 267 4 267 288 308 268 4 268 308 309 269 4 269 309 289 270 4 270 289 290 271 4 271 290 312 291 4 291 312 292 293 4 293 292 294 295 4 295 294 315 296 4 296 315 318 276 4 278 319 320 297 4 297 320 322 298 4 298 322 299 279 4 279 299 300 282 4 282 300 301 283 4 283 301 323 285 4 285 323 324 302 4 302 324 304 303 4 303 304 326 286 4 286 326 305 306 4 306 305 307 288 4 288 307 328 308 4 308 328 329 309 4 309 329 330 289 4 289 330 310 290 4 290 310 311 312 4 312 311 313 292 4 292 313 314 294 4 294 314 316 315 4 315 316 317 318 4 319 334 321 320 4 320 321 337 322 4 322 337 338 299 4 299 338 339 300 4 300 339 341 301 4 301 341 343 323 4 323 343 345 324 4 324 345 325 304 4 304 325 346 326 4 326 346 327 305 4 305 327 349 307 4 307 349 351 328 4 328 351 352 329 4 329 352 331 330 4 330 331 332 310 4 310 332 354 311 4 311 354 333 313 4 313 333 356 314 4 314 356 357 316 4 316 357 359 317 4 334 335 336 321 4 321 336 363 337 4 337 363 364 338 4 338 364 340 339 4 339 340 342 341 4 341 342 344 343 4 343 344 366 345 4 345 366 367 325 4 325 367 347 346 4 346 347 348 327 4 327 348 350 349 4 349 350 370 351 4 351 370 372 352 4 352 372 353 331 4 331 353 373 332 4 332 373 355 354 4 354 355 376 333 4 333 376 377 356 4 356 377 378 357 4 357 378 358 359 4 335 360 361 336 4 336 361 362 363 4 363 362 382 364 4 364 382 384 340 4 340 384 385 342 4 342 385 365 344 4 344 365 388 366 4 366 388 368 367 4 367 368 390 347 4 347 390 369 348 4 348 369 392 350 4 350 392 371 370 4 370 371 395 372 4 372 395 397 353 4 353 397 398 373 4 373 398 374 355 4 355 374 375 376 4 376 375 399 377 4 377 399 379 378 4 378 379 401 358 4 360 380 381 361 4 361 381 403 362 4 362 403 404 382 4 382 404 383 384 4 384 383 406 385 4 385 406 386 365 4 365 386 387 388 4 388 387 389 368 4 368 389 409 390 4 390 409 391 369 4 369 391 393 392 4 392 393 394 371 4 371 394 412 395 4 395 412 396 397 4 397 396 413 398 4 398 413 414 374 4 374 414 417 375 4 375 417 418 399 4 399 418 400 379 4 379 400 419 401 4 380 0 1 381 4 381 1 402 403 4 403 402 3 404 4 404 3 405 383 4 383 405 7 406 4 406 7 407 386 4 386 407 8 387 4 387 8 9 389 4 389 9 408 409 4 409 408 410 391 4 391 410 11 393 4 393 11 411 394 4 394 411 14 412 4 412 14 15 396 4 396 15 18 413 4 413 18 415 414 4 414 415 416 417 4 417 416 20 418 4 418 20 22 400 4 400 22 24 419 geomview-1.9.4/data/geom/office.oogl0000644000175000001440000112326107730233133014250 00000000000000OFF 6878 3460 0 1543.09 2273.32 1172.05 1542.4 2272.14 1177.69 1543.04 2273.24 1172 1542.36 2272.06 1177.64 1545.87 2270.14 1177.69 1546.55 2271.32 1172.05 1545.82 2270.06 1177.64 1546.5 2271.24 1172 1542.48 2272.13 1177.55 1543.13 2273.26 1172.19 1545.83 2270.2 1177.55 1546.48 2271.33 1172.19 1542.43 2272.05 1177.5 1543.08 2273.18 1172.14 1546.43 2271.24 1172.14 1545.78 2270.12 1177.5 1546.45 2271.28 1172.17 1543.1 2273.22 1172.17 1542.45 2272.09 1177.52 1545.8 2270.16 1177.52 1544.27 2271.37 1176.02 1544.28 2271.46 1175.72 1544.35 2271.42 1175.72 1543.77 2270.51 1172 1543.76 2270.65 1172 1543.9 2270.57 1172 1576.95 2241.16 1164.7 1576.84 2241.64 1165.28 1556.67 2236.87 1165.28 1556.78 2236.39 1164.7 1578.13 2240.86 1165.26 1577.49 2240.82 1164.64 1577.6 2240.36 1164.55 1578.24 2240.4 1165.17 1577.29 2241.68 1165.74 1578.05 2241.22 1165.74 1578.35 2239.95 1173.14 1577.59 2240.41 1173.25 1555.97 2235.13 1165.17 1556.56 2235.39 1164.55 1556.45 2235.84 1164.64 1555.86 2235.59 1165.26 1557.1 2235.06 1164.48 1557.26 2234.35 1164.99 1577.43 2239.12 1164.99 1577.27 2239.83 1164.48 1556.85 2234.17 1165.43 1556.09 2234.63 1165.54 1556.39 2233.37 1172.93 1557.15 2232.9 1172.93 1556.55 2235.43 1173.25 1556.08 2234.68 1173.14 1555.78 2235.95 1165.74 1556.25 2236.71 1165.74 1557.17 2234.75 1174.2 1557 2235.46 1173.69 1577.17 2240.23 1173.69 1577.34 2239.52 1174.2 1556.2 2234.18 1173.5 1556.84 2234.22 1174.12 1556.95 2233.76 1174.04 1556.31 2233.72 1173.42 1578.57 2238.99 1173.42 1577.98 2238.74 1174.04 1577.88 2239.19 1174.12 1578.46 2239.45 1173.5 1578.19 2237.88 1172.93 1578.66 2238.63 1172.93 1578.36 2239.9 1165.54 1577.89 2239.15 1165.43 1577.66 2238.19 1173.97 1577.77 2237.71 1173.39 1557.6 2232.94 1173.39 1557.49 2233.42 1173.97 1577.05 2240.75 1164.45 1556.88 2235.98 1164.45 1556.99 2235.52 1164.37 1577.16 2240.29 1164.37 1555.81 2235.02 1165.61 1555.7 2235.47 1165.7 1556 2234.21 1173.06 1556.11 2233.75 1172.98 1577.45 2239.06 1174.3 1577.56 2238.6 1174.22 1557.39 2233.83 1174.22 1557.28 2234.29 1174.3 1578.44 2240.37 1165.61 1578.73 2239.11 1172.98 1578.63 2239.56 1173.06 1578.33 2240.83 1165.7 1572.82 2258.62 1161.18 1572.97 2258.01 1161.82 1552.79 2253.24 1161.82 1552.65 2253.85 1161.18 1574.01 2258.26 1160.74 1573.25 2258.73 1160.74 1573.25 2258.73 1160.26 1574.01 2258.26 1160.26 1573.5 2257.68 1161.82 1574.12 2257.82 1161.18 1578.6 2238.87 1161.18 1577.99 2238.72 1161.82 1551.75 2252.99 1160.26 1552.22 2253.75 1160.26 1552.22 2253.75 1160.74 1551.75 2252.99 1160.74 1552.65 2253.85 1159.82 1552.79 2253.24 1159.18 1572.97 2258.01 1159.18 1572.82 2258.62 1159.82 1552.46 2252.7 1159.18 1551.85 2252.56 1159.82 1556.34 2233.6 1159.82 1556.95 2233.75 1159.18 1556.95 2233.75 1161.82 1556.34 2233.6 1161.18 1551.85 2252.56 1161.18 1552.46 2252.7 1161.82 1557.63 2232.8 1161.18 1557.49 2233.42 1161.82 1577.66 2238.19 1161.82 1577.8 2237.57 1161.18 1556.44 2233.17 1160.74 1557.2 2232.7 1160.74 1557.2 2232.7 1160.26 1556.44 2233.17 1160.26 1578.7 2238.44 1160.26 1578.24 2237.68 1160.26 1578.24 2237.68 1160.74 1578.7 2238.44 1160.74 1577.99 2238.72 1159.18 1578.6 2238.87 1159.82 1574.12 2257.82 1159.82 1573.5 2257.68 1159.18 1577.8 2237.57 1159.82 1577.66 2238.19 1159.18 1557.49 2233.42 1159.18 1557.63 2232.8 1159.82 1572.78 2258.8 1160.74 1552.61 2254.03 1160.74 1552.61 2254.03 1160.26 1572.78 2258.8 1160.26 1551.67 2252.51 1160.26 1551.67 2252.51 1160.74 1556.16 2233.56 1160.74 1556.16 2233.56 1160.26 1577.84 2237.39 1160.74 1577.84 2237.39 1160.26 1557.67 2232.62 1160.26 1557.67 2232.62 1160.74 1574.3 2257.87 1160.26 1578.78 2238.91 1160.26 1578.78 2238.91 1160.74 1574.3 2257.87 1160.74 1552.26 2253.57 1159.82 1551.93 2253.03 1159.82 1552.36 2253.13 1159.37 1552.26 2253.57 1161.18 1552.36 2253.13 1161.63 1551.93 2253.03 1161.18 1556.62 2233.21 1159.82 1557.15 2232.88 1159.82 1557.05 2233.31 1159.37 1557.15 2232.88 1161.18 1556.62 2233.21 1161.18 1557.05 2233.31 1161.63 1578.09 2238.29 1159.37 1578.19 2237.86 1159.82 1578.52 2238.39 1159.82 1578.52 2238.39 1161.18 1578.19 2237.86 1161.18 1578.09 2238.29 1161.63 1573.4 2258.11 1159.37 1573.83 2258.22 1159.82 1573.3 2258.55 1159.82 1573.3 2258.55 1161.18 1573.83 2258.22 1161.18 1573.4 2258.11 1161.63 1578.16 2239.93 1165.1 1577.71 2239.91 1164.66 1577.83 2239.4 1165.02 1577.85 2241.25 1165.3 1577.32 2241.56 1165.28 1577.39 2241.24 1164.88 1577.65 2240.16 1173.65 1578.18 2239.83 1173.58 1577.77 2239.65 1174.02 1578.08 2238.32 1173.79 1578.49 2238.52 1173.37 1578.16 2237.99 1173.39 1556.61 2235.18 1173.65 1556.73 2234.68 1174.02 1556.28 2234.65 1173.58 1556.59 2233.33 1173.37 1557.04 2233.35 1173.79 1557.12 2233.02 1173.39 1556.28 2236.59 1165.28 1555.94 2236.06 1165.3 1556.35 2236.26 1164.88 1556.67 2234.93 1164.66 1556.25 2234.75 1165.1 1556.79 2234.43 1165.02 1556.94 2235.71 1173.28 1556.94 2235.71 1173.28 1556.64 2236.99 1165.74 1556.64 2236.99 1165.74 1576.81 2241.76 1165.74 1576.81 2241.76 1165.74 1577.11 2240.48 1173.28 1577.11 2240.48 1173.28 1577.55 2238.62 1162 1577.55 2238.62 1162 1557.38 2233.85 1162 1557.38 2233.85 1162 1552.9 2252.8 1162 1552.9 2252.8 1162 1573.07 2257.58 1162 1573.07 2257.58 1162 1573.07 2257.58 1159 1573.07 2257.58 1159 1552.9 2252.8 1159 1552.9 2252.8 1159 1557.38 2233.85 1159 1557.38 2233.85 1159 1577.55 2238.62 1159 1577.55 2238.62 1159 1577.49 2238.87 1165.39 1577.49 2238.87 1165.39 1557.32 2234.1 1165.39 1557.32 2234.1 1165.39 1557.63 2232.82 1172.93 1557.63 2232.82 1172.93 1577.8 2237.59 1172.93 1577.8 2237.59 1172.93 1579.07 2237.69 1141 1578.73 2239.14 1141 1579.46 2239.32 1141 1579.8 2237.86 1141 1579.46 2239.32 1141 1579.46 2239.32 1167 1579.8 2237.86 1167 1579.8 2237.86 1141 1579.8 2237.86 1167 1579.07 2237.69 1167 1579.07 2237.69 1141 1579.8 2237.86 1141 1578.73 2239.14 1141 1579.07 2237.69 1141 1579.07 2237.69 1167 1578.73 2239.14 1167 1579.46 2239.32 1167 1579.46 2239.32 1141 1578.73 2239.14 1141 1578.73 2239.14 1167 1556.1 2233.79 1141 1556.1 2233.79 1167 1556.45 2232.33 1167 1556.45 2232.33 1141 1556.45 2232.33 1167 1555.72 2232.16 1167 1555.72 2232.16 1141 1556.45 2232.33 1141 1555.37 2233.62 1141 1555.72 2232.16 1141 1555.72 2232.16 1167 1555.37 2233.62 1167 1556.1 2233.79 1167 1556.1 2233.79 1141 1555.37 2233.62 1141 1555.37 2233.62 1167 1574.85 2258.78 1141 1574.85 2258.78 1167 1575.2 2257.32 1167 1575.2 2257.32 1141 1575.2 2257.32 1167 1574.47 2257.15 1167 1574.47 2257.15 1141 1575.2 2257.32 1141 1574.12 2258.61 1141 1574.47 2257.15 1141 1574.47 2257.15 1167 1574.12 2258.61 1167 1574.85 2258.78 1167 1574.85 2258.78 1141 1574.12 2258.61 1141 1574.12 2258.61 1167 1551.49 2253.25 1141 1551.49 2253.25 1167 1551.84 2251.79 1167 1551.84 2251.79 1141 1551.84 2251.79 1167 1551.11 2251.62 1167 1551.11 2251.62 1141 1551.84 2251.79 1141 1550.77 2253.08 1141 1551.11 2251.62 1141 1551.11 2251.62 1167 1550.77 2253.08 1167 1551.49 2253.25 1167 1551.49 2253.25 1141 1550.77 2253.08 1141 1550.77 2253.08 1167 1574.29 2257.88 1156.37 1551.67 2252.52 1156.37 1574.35 2257.62 1156.27 1551.73 2252.27 1156.27 1574.38 2257.51 1156 1551.75 2252.16 1156 1574.35 2257.62 1155.73 1551.73 2252.27 1155.73 1574.29 2257.88 1155.62 1551.67 2252.52 1155.62 1574.23 2258.14 1155.73 1551.61 2252.78 1155.73 1574.21 2258.24 1156 1551.58 2252.89 1156 1574.23 2258.14 1156.27 1551.61 2252.78 1156.27 1579.07 2237.69 1167 1574.12 2258.61 1167 1579.28 2237.74 1166.47 1574.33 2258.66 1166.47 1579.8 2237.86 1166.25 1574.85 2258.78 1166.25 1580.32 2237.98 1166.47 1575.37 2258.9 1166.47 1580.53 2238.03 1167 1575.58 2258.95 1167 1580.32 2237.98 1167.53 1575.37 2258.9 1167.53 1579.8 2237.86 1167.75 1574.85 2258.78 1167.75 1579.28 2237.74 1167.53 1574.33 2258.66 1167.53 1579.07 2237.69 1167 1579.28 2237.74 1166.47 1579.8 2237.86 1166.25 1580.32 2237.98 1166.47 1580.53 2238.03 1167 1580.32 2237.98 1167.53 1579.8 2237.86 1167.75 1579.28 2237.74 1167.53 1574.12 2258.61 1167 1574.33 2258.66 1167.53 1574.85 2258.78 1167.75 1575.37 2258.9 1167.53 1575.58 2258.95 1167 1575.37 2258.9 1166.47 1574.85 2258.78 1166.25 1574.33 2258.66 1166.47 1554.99 2231.99 1167 1550.04 2252.91 1167 1555.2 2232.04 1166.47 1550.25 2252.96 1166.47 1555.72 2232.16 1166.25 1550.77 2253.08 1166.25 1556.23 2232.28 1166.47 1551.28 2253.2 1166.47 1556.45 2232.33 1167 1551.49 2253.25 1167 1556.23 2232.28 1167.53 1551.28 2253.2 1167.53 1555.72 2232.16 1167.75 1550.77 2253.08 1167.75 1555.2 2232.04 1167.53 1550.25 2252.96 1167.53 1554.99 2231.99 1167 1555.2 2232.04 1166.47 1555.72 2232.16 1166.25 1556.23 2232.28 1166.47 1556.45 2232.33 1167 1556.23 2232.28 1167.53 1555.72 2232.16 1167.75 1555.2 2232.04 1167.53 1550.04 2252.91 1167 1550.25 2252.96 1167.53 1550.77 2253.08 1167.75 1551.28 2253.2 1167.53 1551.49 2253.25 1167 1551.28 2253.2 1166.47 1550.77 2253.08 1166.25 1550.25 2252.96 1166.47 1559.07 2273.46 1172.11 1559.1 2273.59 1172.14 1558.81 2272.33 1176.97 1558.78 2272.19 1176.94 1558.66 2272.11 1177.68 1558.65 2272.08 1177.67 1558.61 2272.04 1177.92 1558.93 2273.42 1172.09 1558.64 2272.16 1176.92 1558.62 2272.07 1177.67 1558.82 2273.51 1172.11 1558.53 2272.25 1176.94 1558.59 2272.09 1177.67 1558.85 2273.65 1172.14 1558.56 2272.39 1176.97 1558.6 2272.13 1177.68 1558.99 2273.69 1172.16 1558.7 2272.43 1176.99 1558.63 2272.14 1177.69 1558.99 2273.53 1172.12 1558.95 2273.52 1172.11 1558.93 2273.54 1172.12 1558.93 2273.58 1172.13 1558.97 2273.59 1172.13 1558.99 2273.56 1172.13 1559.38 2273.36 1172.11 1559.31 2273.24 1172.14 1559.89 2274.4 1176.97 1559.95 2274.52 1176.94 1559.91 2274.66 1177.68 1559.93 2274.69 1177.67 1559.92 2274.75 1177.92 1559.29 2273.48 1172.09 1559.87 2274.64 1176.92 1559.91 2274.72 1177.67 1559.15 2273.47 1172.11 1559.73 2274.63 1176.94 1559.87 2274.72 1177.67 1559.09 2273.35 1172.14 1559.66 2274.51 1176.97 1559.86 2274.69 1177.68 1559.17 2273.23 1172.16 1559.75 2274.39 1176.99 1559.88 2274.66 1177.69 1559.27 2273.36 1172.12 1559.25 2273.39 1172.11 1559.21 2273.38 1172.12 1559.2 2273.35 1172.13 1559.22 2273.32 1172.13 1559.25 2273.33 1172.13 1559.16 2274.12 1172.09 1559.26 2274.03 1172.12 1558.29 2274.88 1176.95 1558.18 2274.97 1176.92 1558.04 2274.97 1177.67 1558.01 2275 1177.66 1557.96 2275 1177.9 1559.02 2274.07 1172.07 1558.05 2274.92 1176.9 1557.98 2274.98 1177.65 1558.99 2273.93 1172.09 1558.02 2274.78 1176.92 1557.97 2274.95 1177.66 1559.1 2273.84 1172.12 1558.12 2274.69 1176.95 1558 2274.93 1177.67 1559.23 2273.89 1172.14 1558.26 2274.74 1176.97 1558.03 2274.94 1177.67 1559.14 2274.02 1172.1 1559.1 2274.01 1172.1 1559.09 2273.97 1172.1 1559.12 2273.95 1172.11 1559.15 2273.96 1172.11 1559.16 2273.99 1172.11 1558.68 2273.48 1172.11 1558.77 2273.58 1172.14 1557.89 2272.63 1176.97 1557.8 2272.53 1176.94 1557.66 2272.51 1177.68 1557.63 2272.48 1177.67 1557.58 2272.47 1177.92 1558.54 2273.51 1172.09 1557.66 2272.56 1176.92 1557.6 2272.49 1177.67 1558.49 2273.65 1172.11 1557.62 2272.69 1176.94 1557.59 2272.53 1177.67 1558.59 2273.75 1172.14 1557.71 2272.8 1176.97 1557.61 2272.55 1177.68 1558.73 2273.72 1172.16 1557.85 2272.76 1176.99 1557.65 2272.54 1177.69 1558.64 2273.58 1172.12 1558.61 2273.59 1172.11 1558.6 2273.62 1172.12 1558.62 2273.65 1172.13 1558.65 2273.64 1172.13 1558.67 2273.6 1172.13 1559.99 2273.69 1172 1559.97 2273.45 1172 1559.91 2273.21 1172 1559.81 2272.99 1172 1559.66 2272.79 1172 1559.48 2272.63 1172 1559.27 2272.51 1172 1559.03 2272.43 1172 1558.79 2272.39 1172 1558.55 2272.41 1172 1558.31 2272.47 1172 1558.09 2272.57 1172 1557.89 2272.72 1172 1557.73 2272.9 1172 1557.61 2273.11 1172 1557.53 2273.35 1172 1557.49 2273.59 1172 1557.51 2273.83 1172 1557.57 2274.07 1172 1557.67 2274.29 1172 1557.82 2274.49 1172 1558 2274.65 1172 1558.21 2274.77 1172 1558.45 2274.85 1172 1558.69 2274.89 1172 1558.93 2274.87 1172 1559.17 2274.81 1172 1559.39 2274.71 1172 1559.59 2274.56 1172 1559.75 2274.38 1172 1559.87 2274.17 1172 1559.95 2273.93 1172 1560.49 2273.71 1177 1560.47 2273.37 1177 1560.38 2273.04 1177 1560.23 2272.73 1177 1560.03 2272.45 1177 1559.77 2272.23 1177 1559.48 2272.05 1177 1559.15 2271.94 1177 1558.81 2271.89 1177 1558.47 2271.91 1177 1558.14 2272 1177 1557.83 2272.15 1177 1557.55 2272.35 1177 1557.33 2272.61 1177 1557.15 2272.9 1177 1557.04 2273.23 1177 1556.99 2273.57 1177 1557.01 2273.91 1177 1557.1 2274.24 1177 1557.25 2274.55 1177 1557.45 2274.83 1177 1557.71 2275.05 1177 1558 2275.23 1177 1558.33 2275.34 1177 1558.67 2275.39 1177 1559.01 2275.37 1177 1559.34 2275.28 1177 1559.65 2275.13 1177 1559.93 2274.93 1177 1560.15 2274.67 1177 1560.33 2274.38 1177 1560.44 2274.05 1177 1560.36 2273.71 1177 1560.32 2274.02 1177 1560.21 2274.32 1177 1560.05 2274.6 1177 1559.84 2274.84 1177 1559.59 2275.03 1177 1559.3 2275.17 1177 1558.99 2275.25 1177 1558.67 2275.26 1177 1558.36 2275.22 1177 1558.06 2275.11 1177 1557.78 2274.95 1177 1557.54 2274.74 1177 1557.35 2274.49 1177 1557.21 2274.2 1177 1557.13 2273.89 1177 1557.12 2273.57 1177 1557.16 2273.26 1177 1557.27 2272.96 1177 1557.43 2272.68 1177 1557.64 2272.44 1177 1557.89 2272.25 1177 1558.18 2272.11 1177 1558.49 2272.03 1177 1558.81 2272.02 1177 1559.12 2272.06 1177 1559.42 2272.17 1177 1559.7 2272.33 1177 1559.94 2272.54 1177 1560.13 2272.79 1177 1560.27 2273.08 1177 1560.35 2273.39 1177 1559.86 2273.69 1172.12 1559.83 2273.9 1172.12 1559.76 2274.11 1172.12 1559.65 2274.3 1172.12 1559.5 2274.47 1172.12 1559.33 2274.6 1172.12 1559.13 2274.7 1172.12 1558.91 2274.75 1172.12 1558.69 2274.76 1172.12 1558.48 2274.73 1172.12 1558.27 2274.66 1172.12 1558.08 2274.55 1172.12 1557.91 2274.4 1172.12 1557.78 2274.23 1172.12 1557.68 2274.03 1172.12 1557.63 2273.81 1172.12 1557.62 2273.59 1172.12 1557.65 2273.38 1172.12 1557.72 2273.17 1172.12 1557.83 2272.98 1172.12 1557.98 2272.81 1172.12 1558.15 2272.68 1172.12 1558.35 2272.58 1172.12 1558.57 2272.53 1172.12 1558.79 2272.52 1172.12 1559 2272.55 1172.12 1559.21 2272.62 1172.12 1559.4 2272.73 1172.12 1559.57 2272.88 1172.12 1559.7 2273.05 1172.12 1559.8 2273.25 1172.12 1559.85 2273.47 1172.12 1558.74 2273.64 1172.12 1597.13 2289.46 1141 1597.08 2288.73 1141 1596.9 2288.02 1141 1596.58 2287.36 1141 1596.14 2286.77 1141 1595.59 2286.28 1141 1594.96 2285.91 1141 1594.26 2285.67 1141 1593.53 2285.56 1141 1592.8 2285.61 1141 1592.09 2285.79 1141 1591.43 2286.11 1141 1590.84 2286.55 1141 1590.35 2287.1 1141 1589.98 2287.73 1141 1589.74 2288.43 1141 1589.63 2289.16 1141 1589.68 2289.89 1141 1589.86 2290.6 1141 1590.18 2291.26 1141 1590.62 2291.85 1141 1591.17 2292.34 1141 1591.8 2292.71 1141 1592.5 2292.95 1141 1593.23 2293.06 1141 1593.96 2293.01 1141 1594.67 2292.83 1141 1595.33 2292.51 1141 1595.92 2292.07 1141 1596.41 2291.52 1141 1596.78 2290.89 1141 1597.02 2290.19 1141 1598.63 2289.53 1156 1598.57 2288.5 1156 1598.31 2287.5 1156 1597.86 2286.58 1156 1597.24 2285.75 1156 1596.47 2285.07 1156 1595.59 2284.55 1156 1594.62 2284.21 1156 1593.6 2284.06 1156 1592.57 2284.12 1156 1591.57 2284.38 1156 1590.65 2284.83 1156 1589.82 2285.45 1156 1589.14 2286.22 1156 1588.62 2287.1 1156 1588.28 2288.07 1156 1588.13 2289.09 1156 1588.19 2290.12 1156 1588.45 2291.12 1156 1588.9 2292.04 1156 1589.52 2292.87 1156 1590.29 2293.55 1156 1591.17 2294.07 1156 1592.14 2294.41 1156 1593.16 2294.56 1156 1594.19 2294.5 1156 1595.19 2294.24 1156 1596.11 2293.79 1156 1596.94 2293.17 1156 1597.62 2292.4 1156 1598.14 2291.52 1156 1598.48 2290.55 1156 1598.25 2289.51 1156 1598.12 2290.46 1156 1597.8 2291.36 1156 1597.32 2292.18 1156 1596.68 2292.9 1156 1595.92 2293.47 1156 1595.06 2293.89 1156 1594.13 2294.13 1156 1593.18 2294.18 1156 1592.23 2294.05 1156 1591.33 2293.73 1156 1590.51 2293.25 1156 1589.79 2292.61 1156 1589.22 2291.85 1156 1588.8 2290.99 1156 1588.56 2290.06 1156 1588.51 2289.11 1156 1588.64 2288.16 1156 1588.96 2287.26 1156 1589.44 2286.44 1156 1590.08 2285.72 1156 1590.84 2285.15 1156 1591.7 2284.73 1156 1592.63 2284.49 1156 1593.58 2284.44 1156 1594.53 2284.57 1156 1595.43 2284.89 1156 1596.25 2285.37 1156 1596.97 2286.01 1156 1597.54 2286.77 1156 1597.96 2287.63 1156 1598.2 2288.56 1156 1596.75 2289.45 1141.37 1596.66 2290.1 1141.37 1596.44 2290.73 1141.37 1596.11 2291.3 1141.37 1595.67 2291.79 1141.37 1595.14 2292.19 1141.37 1594.54 2292.48 1141.37 1593.9 2292.64 1141.37 1593.24 2292.68 1141.37 1592.59 2292.59 1141.37 1591.96 2292.37 1141.37 1591.39 2292.04 1141.37 1590.9 2291.6 1141.37 1590.5 2291.07 1141.37 1590.21 2290.47 1141.37 1590.05 2289.83 1141.37 1590.01 2289.17 1141.37 1590.1 2288.52 1141.37 1590.32 2287.89 1141.37 1590.65 2287.32 1141.37 1591.09 2286.83 1141.37 1591.62 2286.43 1141.37 1592.22 2286.14 1141.37 1592.86 2285.98 1141.37 1593.52 2285.94 1141.37 1594.17 2286.03 1141.37 1594.8 2286.25 1141.37 1595.37 2286.58 1141.37 1595.86 2287.02 1141.37 1596.26 2287.55 1141.37 1596.55 2288.15 1141.37 1596.71 2288.79 1141.37 1593.38 2289.31 1141.37 1554.53 2295.97 1172.09 1554.53 2295.97 1172.23 1553.6 2291.06 1172.23 1553.6 2291.06 1172.09 1553.37 2290.34 1172.18 1553.37 2290.34 1172.14 1553.29 2290.1 1172.16 1554.41 2296 1172.02 1553.48 2291.09 1172.02 1553.34 2290.35 1172.12 1554.28 2296.02 1172.09 1553.35 2291.11 1172.09 1553.31 2290.35 1172.14 1554.28 2296.02 1172.23 1553.35 2291.11 1172.23 1553.31 2290.35 1172.18 1554.41 2296 1172.3 1553.48 2291.09 1172.3 1553.34 2290.35 1172.2 1554.44 2295.99 1172.14 1554.41 2296 1172.12 1554.37 2296.01 1172.14 1554.37 2296.01 1172.18 1554.41 2296 1172.2 1554.44 2295.99 1172.18 1546.2 2289.69 1174.63 1548.12 2280.39 1174.63 1541.75 2279.08 1174.63 1539.83 2288.38 1174.63 1541.75 2279.08 1174.76 1539.83 2288.38 1174.76 1546.2 2289.69 1174.76 1548.12 2280.39 1174.76 1546.2 2289.69 1175.88 1548.12 2280.39 1175.88 1541.75 2279.08 1175.88 1539.83 2288.38 1175.88 1541.75 2279.08 1176.01 1539.83 2288.38 1176.01 1546.2 2289.69 1176.01 1548.12 2280.39 1176.01 1541.63 2279.05 1174.76 1539.71 2288.36 1174.76 1541.63 2279.05 1175.88 1539.71 2288.36 1175.88 1539.86 2288.26 1175.88 1546.1 2289.55 1175.88 1546.1 2289.55 1174.76 1539.86 2288.26 1174.76 1547.97 2280.49 1175.88 1547.97 2280.49 1174.76 1541.73 2279.2 1175.88 1541.73 2279.2 1174.76 1564.17 2314.13 1156.24 1564.11 2314.37 1156.25 1561.99 2313.58 1156.26 1561.93 2313.82 1156.27 1573.18 2300.76 1142.53 1573.18 2300.76 1141.47 1573.71 2300.01 1142 1574.73 2300.27 1142 1573.29 2301.66 1142 1574.31 2301.92 1142 1574.14 2300.46 1142.85 1573.88 2301.48 1142.85 1574.14 2300.46 1141.15 1573.88 2301.48 1141.15 1574.83 2301.18 1142.53 1574.83 2301.18 1141.47 1569.54 2315.15 1142.53 1569.54 2315.15 1141.47 1570.06 2314.41 1142 1571.08 2314.67 1142 1569.64 2316.06 1142 1570.66 2316.31 1142 1570.49 2314.85 1142.85 1570.23 2315.87 1142.85 1570.49 2314.85 1141.15 1570.23 2315.87 1141.15 1571.19 2315.57 1142.53 1571.19 2315.57 1141.47 1555.14 2311.5 1142.53 1555.14 2311.5 1141.47 1555.67 2310.76 1142 1556.69 2311.02 1142 1555.25 2312.41 1142 1556.27 2312.67 1142 1556.1 2311.2 1142.85 1555.84 2312.22 1142.85 1556.1 2311.2 1141.15 1555.84 2312.22 1141.15 1556.79 2311.92 1142.53 1556.79 2311.92 1141.47 1558.79 2297.11 1142.53 1558.79 2297.11 1141.47 1559.31 2296.36 1142 1560.33 2296.62 1142 1558.9 2298.01 1142 1559.92 2298.27 1142 1559.74 2296.81 1142.85 1559.49 2297.83 1142.85 1559.74 2296.81 1141.15 1559.49 2297.83 1141.15 1560.44 2297.53 1142.53 1560.44 2297.53 1141.47 1568.15 2301.98 1154 1564.28 2301 1154 1561.08 2313.6 1154 1564.96 2314.59 1154 1561.08 2313.6 1156.25 1564.96 2314.59 1156.25 1568.15 2301.98 1156.25 1564.28 2301 1156.25 1561.93 2313.82 1170 1564.11 2314.37 1170 1564.17 2314.13 1170 1561.99 2313.58 1170 1570.47 2312.19 1163.89 1557.38 2308.87 1163.89 1557.02 2310.3 1163.63 1570.11 2313.62 1163.63 1556.95 2310.58 1163.83 1556.95 2310.58 1163.83 1556.59 2312.01 1172.2 1556.59 2312.01 1172.2 1569.67 2315.33 1172.2 1569.67 2315.33 1172.2 1570.03 2313.9 1163.83 1570.03 2313.9 1163.83 1569.98 2315.15 1172.24 1570.34 2313.72 1172.5 1570.7 2312.29 1164.13 1570.34 2313.72 1163.87 1570.09 2313.7 1172.75 1569.72 2315.13 1172.49 1556.64 2311.82 1172.49 1557 2310.39 1172.75 1557.43 2308.67 1164.18 1557.43 2308.67 1164.18 1570.52 2311.99 1164.18 1570.52 2311.99 1164.18 1570.16 2313.42 1172.55 1570.16 2313.42 1172.55 1557.07 2310.1 1172.55 1557.07 2310.1 1172.55 1556.4 2311.71 1172.24 1556.77 2310.28 1163.87 1557.13 2308.85 1164.13 1556.77 2310.28 1172.5 1575.13 2299.88 1156.25 1575.13 2299.88 1156.25 1559.14 2295.83 1156.25 1559.14 2295.83 1156.25 1555.58 2309.89 1156.25 1555.58 2309.89 1156.25 1571.57 2313.94 1156.25 1571.57 2313.94 1156.25 1555.52 2310.13 1156.5 1555.52 2310.13 1159 1571.51 2314.18 1159 1571.51 2314.18 1156.5 1571.81 2314 1159 1575.38 2299.95 1159 1575.38 2299.95 1156.5 1571.81 2314 1156.5 1575.13 2299.88 1159.25 1575.13 2299.88 1159.25 1571.57 2313.94 1159.25 1571.57 2313.94 1159.25 1555.58 2309.89 1159.25 1555.58 2309.89 1159.25 1559.14 2295.83 1159.25 1559.14 2295.83 1159.25 1559.2 2295.59 1156.5 1575.2 2299.64 1156.5 1575.2 2299.64 1159 1559.2 2295.59 1159 1555.34 2309.83 1159 1555.34 2309.83 1156.5 1558.9 2295.77 1156.5 1558.9 2295.77 1159 1566.22 2306.16 1154 1565.73 2305.34 1154 1565.73 2305.34 1143.5 1566.22 2306.16 1143.5 1565.99 2307.09 1154 1565.99 2307.09 1143.5 1575.13 2300.59 1143.5 1574.87 2300.16 1143.5 1565.85 2305.53 1143.5 1566.11 2305.96 1143.5 1566.11 2305.96 1145.5 1575.13 2300.59 1145.5 1565.85 2305.53 1145.5 1574.87 2300.16 1145.5 1565.17 2307.58 1154 1565.17 2307.58 1143.5 1564.24 2307.34 1154 1564.24 2307.34 1143.5 1570.74 2316.48 1143.5 1571.17 2316.22 1143.5 1565.79 2307.2 1143.5 1565.36 2307.46 1143.5 1565.36 2307.46 1145.5 1570.74 2316.48 1145.5 1565.79 2307.2 1145.5 1571.17 2316.22 1145.5 1563.75 2306.52 1154 1563.75 2306.52 1143.5 1563.99 2305.59 1154 1563.99 2305.59 1143.5 1554.85 2312.09 1143.5 1555.1 2312.52 1143.5 1564.12 2307.15 1143.5 1563.87 2306.72 1143.5 1563.87 2306.72 1145.5 1554.85 2312.09 1145.5 1564.12 2307.15 1145.5 1555.1 2312.52 1145.5 1564.81 2305.1 1154 1564.81 2305.1 1143.5 1559.24 2296.2 1143.5 1558.81 2296.45 1143.5 1564.18 2305.48 1143.5 1564.61 2305.22 1143.5 1564.61 2305.22 1145.5 1559.24 2296.2 1145.5 1564.18 2305.48 1145.5 1558.81 2296.45 1145.5 1573.48 2298.13 1172 1573.87 2288.64 1172 1567.38 2288.37 1172.12 1566.99 2297.87 1172.12 1567.38 2288.37 1172.25 1566.99 2297.87 1172.25 1573.48 2298.13 1172.13 1573.87 2288.64 1172.13 1565.86 2297.82 1172.12 1566.25 2288.33 1172.12 1559.76 2288.06 1172 1559.37 2297.55 1172 1559.76 2288.06 1172.13 1559.37 2297.55 1172.13 1565.86 2297.82 1172.25 1566.25 2288.33 1172.25 1566.99 2297.87 1172 1567.38 2288.37 1172 1566.25 2288.33 1172 1565.86 2297.82 1172 1566.43 2297.74 1172.44 1566.47 2297.74 1172.57 1566.53 2297.75 1172.68 1566.61 2297.75 1172.77 1566.71 2297.75 1172.85 1566.83 2297.76 1172.92 1566.97 2297.77 1172.98 1567.13 2297.77 1173.02 1567.3 2297.78 1173.06 1567.49 2297.79 1173.08 1567.69 2297.8 1173.09 1567.91 2297.8 1173.1 1568.14 2297.81 1173.09 1568.37 2297.82 1173.08 1568.62 2297.83 1173.07 1568.88 2297.84 1173.05 1569.14 2297.85 1173.02 1569.41 2297.87 1172.99 1569.69 2297.88 1172.96 1569.97 2297.89 1172.92 1570.25 2297.9 1172.88 1570.54 2297.91 1172.85 1570.83 2297.92 1172.81 1571.11 2297.94 1172.77 1571.4 2297.95 1172.74 1571.68 2297.96 1172.7 1571.97 2297.97 1172.67 1572.24 2297.98 1172.64 1572.51 2297.99 1172.62 1572.78 2298 1172.61 1573.04 2298.02 1172.59 1573.29 2298.03 1172.59 1573.4 2298.03 1172.12 1572.14 2297.98 1172.18 1570.9 2297.93 1172.29 1569.74 2297.88 1172.43 1568.72 2297.84 1172.53 1567.88 2297.8 1172.55 1567.31 2297.78 1172.43 1567.04 2297.77 1172.12 1567.42 2288.48 1172.12 1567.69 2288.49 1172.43 1568.27 2288.51 1172.55 1569.1 2288.55 1172.53 1570.13 2288.59 1172.43 1571.29 2288.64 1172.29 1572.53 2288.69 1172.18 1573.78 2288.74 1172.12 1573.67 2288.73 1172.59 1573.42 2288.72 1172.59 1573.16 2288.71 1172.61 1572.9 2288.7 1172.62 1572.63 2288.69 1172.64 1572.35 2288.68 1172.67 1572.07 2288.67 1172.7 1571.78 2288.66 1172.74 1571.5 2288.64 1172.77 1571.21 2288.63 1172.81 1570.92 2288.62 1172.85 1570.64 2288.61 1172.88 1570.35 2288.6 1172.92 1570.07 2288.59 1172.96 1569.8 2288.57 1172.99 1569.53 2288.56 1173.02 1569.26 2288.55 1173.05 1569.01 2288.54 1173.07 1568.76 2288.53 1173.08 1568.52 2288.52 1173.09 1568.29 2288.51 1173.1 1568.08 2288.5 1173.09 1567.88 2288.49 1173.08 1567.69 2288.49 1173.06 1567.51 2288.48 1173.02 1567.36 2288.47 1172.98 1567.22 2288.47 1172.92 1567.1 2288.46 1172.85 1566.99 2288.46 1172.77 1566.91 2288.45 1172.68 1566.85 2288.45 1172.57 1566.81 2288.45 1172.44 1565.82 2297.72 1172.12 1565.55 2297.71 1172.43 1564.97 2297.68 1172.55 1564.14 2297.65 1172.53 1563.11 2297.61 1172.43 1561.95 2297.56 1172.29 1560.71 2297.51 1172.18 1559.46 2297.46 1172.12 1559.57 2297.46 1172.59 1559.82 2297.47 1172.59 1560.08 2297.48 1172.61 1560.34 2297.49 1172.62 1560.61 2297.5 1172.64 1560.89 2297.51 1172.67 1561.17 2297.53 1172.7 1561.46 2297.54 1172.74 1561.74 2297.55 1172.77 1562.03 2297.56 1172.81 1562.32 2297.57 1172.85 1562.6 2297.59 1172.88 1562.89 2297.6 1172.92 1563.17 2297.61 1172.96 1563.44 2297.62 1172.99 1563.71 2297.63 1173.02 1563.98 2297.64 1173.05 1564.23 2297.65 1173.07 1564.48 2297.66 1173.08 1564.72 2297.67 1173.09 1564.95 2297.68 1173.1 1565.16 2297.69 1173.09 1565.36 2297.7 1173.08 1565.55 2297.71 1173.06 1565.73 2297.71 1173.02 1565.88 2297.72 1172.98 1566.02 2297.73 1172.92 1566.14 2297.73 1172.85 1566.25 2297.74 1172.77 1566.33 2297.74 1172.68 1566.39 2297.74 1172.57 1566.77 2288.45 1172.57 1566.71 2288.45 1172.68 1566.63 2288.44 1172.77 1566.53 2288.44 1172.85 1566.41 2288.43 1172.92 1566.27 2288.43 1172.98 1566.11 2288.42 1173.02 1565.94 2288.41 1173.06 1565.75 2288.41 1173.08 1565.54 2288.4 1173.09 1565.33 2288.39 1173.1 1565.1 2288.38 1173.09 1564.86 2288.37 1173.08 1564.62 2288.36 1173.07 1564.36 2288.35 1173.05 1564.1 2288.34 1173.02 1563.83 2288.33 1172.99 1563.55 2288.32 1172.96 1563.27 2288.3 1172.92 1562.99 2288.29 1172.88 1562.7 2288.28 1172.85 1562.41 2288.27 1172.81 1562.13 2288.26 1172.77 1561.84 2288.25 1172.74 1561.56 2288.23 1172.7 1561.27 2288.22 1172.67 1561 2288.21 1172.64 1560.73 2288.2 1172.62 1560.46 2288.19 1172.61 1560.2 2288.18 1172.59 1559.95 2288.17 1172.59 1559.84 2288.16 1172.12 1561.1 2288.22 1172.18 1562.34 2288.27 1172.29 1563.5 2288.31 1172.43 1564.52 2288.36 1172.53 1565.36 2288.39 1172.55 1565.93 2288.41 1172.43 1566.2 2288.43 1172.12 1578.68 2295 1172.83 1578.71 2294.86 1172.88 1578.65 2294.78 1173 1579.23 2294.99 1173.39 1578.56 2294.81 1173.12 1578.53 2294.95 1173.2 1578.46 2295.07 1173.12 1578.51 2295.15 1173 1579.09 2295.37 1173.39 1578.61 2295.12 1172.88 1579.3 2295.23 1173.25 1579.31 2295.09 1173.29 1579.58 2295.12 1173.79 1579.11 2295.01 1173.48 1579.02 2295.13 1173.52 1579.01 2295.28 1173.48 1579.44 2295.5 1173.79 1579.21 2295.35 1173.29 1579.68 2295.38 1173.71 1579.68 2295.22 1173.73 1579.72 2295.18 1174.16 1579.43 2295.13 1173.84 1579.33 2295.25 1173.86 1579.33 2295.4 1173.84 1579.58 2295.55 1174.16 1579.58 2295.49 1173.73 1579.84 2295.44 1174.18 1579.84 2295.28 1174.17 1579.71 2295.17 1174.5 1579.57 2295.18 1174.16 1579.47 2295.3 1174.15 1579.47 2295.45 1174.16 1579.57 2295.55 1174.5 1579.74 2295.55 1174.17 1579.8 2295.42 1174.6 1579.8 2295.27 1174.57 1579.56 2295.12 1174.77 1579.57 2295.19 1174.43 1579.48 2295.3 1174.4 1579.48 2295.45 1174.43 1579.42 2295.49 1174.77 1579.7 2295.54 1174.57 1579.59 2295.34 1174.93 1579.61 2295.2 1174.88 1579.31 2295.03 1174.93 1579.47 2295.15 1174.65 1579.39 2295.27 1174.6 1579.37 2295.41 1174.65 1579.17 2295.4 1174.93 1579.51 2295.46 1174.88 1579.27 2295.22 1175.13 1579.31 2295.09 1175.07 1579 2294.91 1174.98 1579.28 2295.07 1174.79 1579.22 2295.2 1174.74 1579.18 2295.34 1174.79 1578.86 2295.28 1174.98 1579.21 2295.35 1175.07 1578.98 2295.11 1174.79 1578.64 2294.98 1174.68 1578.92 2295.24 1174.84 1578.57 2295.11 1174.74 1578.51 2295.15 1174.87 1578.85 2295.21 1175.12 1578.5 2295.08 1175.01 1578.88 2295.08 1175.17 1578.53 2294.95 1175.07 1578.94 2294.95 1175.12 1578.6 2294.82 1175.01 1578.65 2294.78 1174.87 1579.02 2294.98 1174.84 1578.67 2294.85 1174.74 1578.58 2294.97 1172 1578.66 2294.68 1172 1578.68 2294.39 1172 1578.64 2294.1 1172 1578.55 2293.82 1172 1578.4 2293.56 1172 1578.2 2293.34 1172 1577.97 2293.16 1172 1577.71 2293.04 1172 1577.42 2292.96 1172 1577.13 2292.94 1172 1576.84 2292.98 1172 1576.56 2293.07 1172 1576.3 2293.22 1172 1576.08 2293.42 1172 1575.9 2293.65 1172 1575.78 2293.91 1172 1575.7 2294.2 1172 1575.68 2294.49 1172 1575.72 2294.78 1172 1575.81 2295.06 1172 1575.96 2295.32 1172 1576.16 2295.54 1172 1576.39 2295.72 1172 1576.65 2295.84 1172 1576.94 2295.92 1172 1577.23 2295.94 1172 1577.52 2295.9 1172 1577.8 2295.81 1172 1578.06 2295.66 1172 1578.28 2295.46 1172 1578.46 2295.23 1172 1578.7 2295.01 1172.12 1578.78 2294.7 1172.12 1578.8 2294.38 1172.12 1578.76 2294.07 1172.12 1578.66 2293.77 1172.12 1578.5 2293.49 1172.12 1578.29 2293.25 1172.12 1578.04 2293.06 1172.12 1577.75 2292.92 1172.12 1577.44 2292.84 1172.12 1577.12 2292.82 1172.12 1576.81 2292.86 1172.12 1576.51 2292.96 1172.12 1576.23 2293.12 1172.12 1575.99 2293.33 1172.12 1575.8 2293.58 1172.12 1575.66 2293.87 1172.12 1575.58 2294.18 1172.12 1575.56 2294.5 1172.12 1575.6 2294.81 1172.12 1575.7 2295.11 1172.12 1575.86 2295.39 1172.12 1576.07 2295.63 1172.12 1576.32 2295.82 1172.12 1576.61 2295.96 1172.12 1576.92 2296.04 1172.12 1577.24 2296.06 1172.12 1577.55 2296.02 1172.12 1577.85 2295.92 1172.12 1578.13 2295.76 1172.12 1578.37 2295.55 1172.12 1578.56 2295.3 1172.12 1578.7 2295.01 1175.62 1578.78 2294.7 1175.62 1578.8 2294.38 1175.62 1578.76 2294.07 1175.62 1578.66 2293.77 1175.62 1578.5 2293.49 1175.62 1578.29 2293.25 1175.62 1578.04 2293.06 1175.62 1577.75 2292.92 1175.62 1577.44 2292.84 1175.62 1577.12 2292.82 1175.62 1576.81 2292.86 1175.62 1576.51 2292.96 1175.62 1576.23 2293.12 1175.62 1575.99 2293.33 1175.62 1575.8 2293.58 1175.62 1575.66 2293.87 1175.62 1575.58 2294.18 1175.62 1575.56 2294.5 1175.62 1575.6 2294.81 1175.62 1575.7 2295.11 1175.62 1575.86 2295.39 1175.62 1576.07 2295.63 1175.62 1576.32 2295.82 1175.62 1576.61 2295.96 1175.62 1576.92 2296.04 1175.62 1577.24 2296.06 1175.62 1577.55 2296.02 1175.62 1577.85 2295.92 1175.62 1578.13 2295.76 1175.62 1578.37 2295.55 1175.62 1578.56 2295.3 1175.62 1578.64 2294.99 1175.69 1578.72 2294.69 1175.69 1578.74 2294.39 1175.69 1578.7 2294.08 1175.69 1578.6 2293.79 1175.69 1578.45 2293.53 1175.69 1578.25 2293.3 1175.69 1578 2293.11 1175.69 1577.73 2292.98 1175.69 1577.43 2292.9 1175.69 1577.13 2292.88 1175.69 1576.82 2292.92 1175.69 1576.53 2293.02 1175.69 1576.27 2293.17 1175.69 1576.04 2293.37 1175.69 1575.85 2293.62 1175.69 1575.72 2293.89 1175.69 1575.64 2294.19 1175.69 1575.62 2294.49 1175.69 1575.66 2294.8 1175.69 1575.76 2295.09 1175.69 1575.91 2295.35 1175.69 1576.11 2295.58 1175.69 1576.36 2295.77 1175.69 1576.63 2295.9 1175.69 1576.93 2295.98 1175.69 1577.23 2296 1175.69 1577.54 2295.96 1175.69 1577.83 2295.86 1175.69 1578.09 2295.71 1175.69 1578.32 2295.51 1175.69 1578.51 2295.26 1175.69 1578.58 2294.97 1175.69 1578.46 2295.23 1175.69 1578.28 2295.46 1175.69 1578.06 2295.66 1175.69 1577.8 2295.81 1175.69 1577.52 2295.9 1175.69 1577.23 2295.94 1175.69 1576.94 2295.92 1175.69 1576.65 2295.84 1175.69 1576.39 2295.72 1175.69 1576.16 2295.54 1175.69 1575.96 2295.32 1175.69 1575.81 2295.06 1175.69 1575.72 2294.78 1175.69 1575.68 2294.49 1175.69 1575.7 2294.2 1175.69 1575.78 2293.91 1175.69 1575.9 2293.65 1175.69 1576.08 2293.42 1175.69 1576.3 2293.22 1175.69 1576.56 2293.07 1175.69 1576.84 2292.98 1175.69 1577.13 2292.94 1175.69 1577.42 2292.96 1175.69 1577.71 2293.04 1175.69 1577.97 2293.16 1175.69 1578.2 2293.34 1175.69 1578.4 2293.56 1175.69 1578.55 2293.82 1175.69 1578.64 2294.1 1175.69 1578.68 2294.39 1175.69 1578.66 2294.68 1175.69 1578.53 2294.94 1175.62 1578.4 2295.2 1175.62 1578.23 2295.42 1175.62 1578.02 2295.61 1175.62 1577.78 2295.75 1175.62 1577.51 2295.84 1175.62 1577.23 2295.88 1175.62 1576.95 2295.86 1175.62 1576.68 2295.79 1175.62 1576.42 2295.66 1175.62 1576.2 2295.49 1175.62 1576.01 2295.28 1175.62 1575.87 2295.04 1175.62 1575.78 2294.77 1175.62 1575.74 2294.49 1175.62 1575.76 2294.21 1175.62 1575.83 2293.94 1175.62 1575.96 2293.68 1175.62 1576.13 2293.46 1175.62 1576.34 2293.27 1175.62 1576.58 2293.13 1175.62 1576.85 2293.04 1175.62 1577.13 2293 1175.62 1577.41 2293.02 1175.62 1577.68 2293.09 1175.62 1577.94 2293.22 1175.62 1578.16 2293.39 1175.62 1578.35 2293.6 1175.62 1578.49 2293.84 1175.62 1578.58 2294.11 1175.62 1578.62 2294.39 1175.62 1578.6 2294.67 1175.62 1578.53 2294.94 1172.19 1578.4 2295.2 1172.19 1578.23 2295.42 1172.19 1578.02 2295.61 1172.19 1577.78 2295.75 1172.19 1577.51 2295.84 1172.19 1577.23 2295.88 1172.19 1576.95 2295.86 1172.19 1576.68 2295.79 1172.19 1576.42 2295.66 1172.19 1576.2 2295.49 1172.19 1576.01 2295.28 1172.19 1575.87 2295.04 1172.19 1575.78 2294.77 1172.19 1575.74 2294.49 1172.19 1575.76 2294.21 1172.19 1575.83 2293.94 1172.19 1575.96 2293.68 1172.19 1576.13 2293.46 1172.19 1576.34 2293.27 1172.19 1576.58 2293.13 1172.19 1576.85 2293.04 1172.19 1577.13 2293 1172.19 1577.41 2293.02 1172.19 1577.68 2293.09 1172.19 1577.94 2293.22 1172.19 1578.16 2293.39 1172.19 1578.35 2293.6 1172.19 1578.49 2293.84 1172.19 1578.58 2294.11 1172.19 1578.62 2294.39 1172.19 1578.6 2294.67 1172.19 1577.18 2294.44 1172.19 1545.49 2290.1 1173.38 1546.9 2280.7 1173.38 1540.47 2279.74 1173.38 1539.06 2289.14 1173.38 1540.47 2279.74 1173.51 1539.06 2289.14 1173.51 1545.49 2290.1 1173.51 1546.9 2280.7 1173.51 1545.49 2290.1 1174.63 1546.9 2280.7 1174.63 1540.47 2279.74 1174.63 1539.06 2289.14 1174.63 1540.47 2279.74 1174.76 1539.06 2289.14 1174.76 1545.49 2290.1 1174.76 1546.9 2280.7 1174.76 1540.35 2279.72 1173.51 1538.94 2289.12 1173.51 1540.35 2279.72 1174.63 1538.94 2289.12 1174.63 1539.08 2289.01 1174.63 1545.39 2289.96 1174.63 1545.39 2289.96 1173.51 1539.08 2289.01 1173.51 1546.76 2280.81 1174.63 1546.76 2280.81 1173.51 1540.45 2279.87 1174.63 1540.45 2279.87 1173.51 1545.39 2289.59 1172 1545.78 2280.09 1172 1539.28 2279.83 1172 1538.89 2289.32 1172 1539.28 2279.83 1172.12 1538.89 2289.32 1172.12 1545.39 2289.59 1172.12 1545.78 2280.09 1172.12 1545.39 2289.59 1173.25 1545.78 2280.09 1173.25 1539.28 2279.83 1173.25 1538.89 2289.32 1173.25 1539.28 2279.83 1173.37 1538.89 2289.32 1173.37 1545.39 2289.59 1173.37 1545.78 2280.09 1173.37 1539.16 2279.82 1172.12 1538.77 2289.31 1172.12 1539.16 2279.82 1173.25 1538.77 2289.31 1173.25 1538.9 2289.19 1173.25 1545.27 2289.46 1173.25 1545.27 2289.46 1172.12 1538.9 2289.19 1172.12 1545.65 2280.21 1173.25 1545.65 2280.21 1172.12 1539.28 2279.95 1173.25 1539.28 2279.95 1172.12 1578.55 2277.01 1173.26 1578.55 2277.01 1172.74 1578.94 2276.78 1173 1579.35 2277.11 1173 1578.41 2277.45 1173 1578.82 2277.77 1173 1579.04 2277.07 1173.43 1578.71 2277.48 1173.43 1579.04 2277.07 1172.57 1579.21 2277.54 1173.26 1579.21 2277.54 1172.74 1581.32 2273.54 1185.48 1581.32 2273.54 1184.95 1581.71 2273.31 1185.22 1582.12 2273.63 1185.22 1581.18 2273.97 1185.22 1581.59 2274.3 1185.22 1581.82 2273.6 1185.64 1581.49 2274.01 1185.64 1581.82 2273.6 1184.79 1581.49 2274.01 1184.79 1581.98 2274.07 1185.48 1581.98 2274.07 1184.95 1575.92 2280.3 1190.48 1575.92 2280.3 1189.95 1576.31 2280.07 1190.22 1576.72 2280.4 1190.22 1576.41 2280.36 1190.64 1576.41 2280.36 1189.79 1576.58 2280.84 1190.48 1576.58 2280.84 1189.95 1574.68 2280.83 1187.02 1574.68 2280.83 1185.71 1575.66 2280.26 1186.36 1576.68 2281.08 1186.36 1574.33 2281.92 1186.36 1575.36 2282.74 1186.36 1575.92 2280.98 1187.43 1575.1 2282.01 1187.43 1575.92 2280.98 1185.3 1575.1 2282.01 1185.3 1576.34 2282.16 1187.02 1576.34 2282.16 1185.71 1579.5 2276.5 1172 1578.46 2275.96 1172 1577.3 2275.86 1172 1576.18 2276.21 1172 1575.29 2276.97 1172 1574.75 2278.01 1172 1574.65 2279.17 1172 1575 2280.29 1172 1575.76 2281.18 1172 1576.8 2281.72 1172 1577.96 2281.82 1172 1579.08 2281.47 1172 1579.97 2280.71 1172 1580.51 2279.67 1172 1580.61 2278.51 1172 1580.26 2277.39 1172 1579.5 2276.5 1172.75 1578.46 2275.96 1172.75 1577.3 2275.86 1172.75 1576.18 2276.21 1172.75 1575.29 2276.97 1172.75 1574.75 2278.01 1172.75 1574.65 2279.17 1172.75 1575 2280.29 1172.75 1575.76 2281.18 1172.75 1576.8 2281.72 1172.75 1577.96 2281.82 1172.75 1579.08 2281.47 1172.75 1579.97 2280.71 1172.75 1580.51 2279.67 1172.75 1580.61 2278.51 1172.75 1580.26 2277.39 1172.75 1579.35 2276.69 1173 1578.39 2276.2 1173 1577.32 2276.11 1173 1576.3 2276.43 1173 1575.48 2277.12 1173 1574.99 2278.08 1173 1574.9 2279.15 1173 1575.22 2280.17 1173 1575.91 2280.99 1173 1576.87 2281.48 1173 1577.94 2281.57 1173 1578.96 2281.25 1173 1579.78 2280.56 1173 1580.27 2279.6 1173 1580.36 2278.53 1173 1580.04 2277.51 1173 1579.02 2277.09 1172.91 1581.8 2273.62 1185.13 1578.94 2277.05 1172.92 1581.71 2273.57 1185.14 1578.84 2277.04 1172.94 1581.62 2273.56 1185.16 1578.75 2277.06 1172.97 1581.53 2273.59 1185.18 1578.68 2277.12 1173 1581.46 2273.65 1185.22 1578.64 2277.2 1173.03 1581.42 2273.73 1185.25 1578.64 2277.3 1173.06 1581.41 2273.82 1185.28 1578.67 2277.39 1173.08 1581.44 2273.91 1185.3 1578.73 2277.46 1173.09 1581.51 2273.99 1185.3 1578.82 2277.51 1173.08 1581.59 2274.03 1185.3 1578.91 2277.52 1173.06 1581.69 2274.04 1185.28 1579 2277.49 1173.03 1581.78 2274.02 1185.25 1579.07 2277.43 1173 1581.85 2273.96 1185.22 1579.11 2277.35 1172.97 1581.89 2273.88 1185.18 1579.12 2277.26 1172.94 1581.89 2273.78 1185.16 1579.09 2277.17 1172.92 1581.86 2273.69 1185.14 1581.73 2273.7 1185.43 1576.33 2280.47 1190.43 1581.65 2273.65 1185.42 1576.25 2280.42 1190.42 1581.57 2273.62 1185.37 1576.17 2280.39 1190.37 1581.5 2273.62 1185.3 1576.1 2280.39 1190.3 1576.05 2280.41 1190.22 1581.44 2273.7 1185.13 1576.04 2280.46 1190.13 1581.46 2273.76 1185.06 1576.06 2280.53 1190.06 1581.51 2273.83 1185.02 1576.1 2280.6 1190.02 1581.57 2273.9 1185 1576.17 2280.67 1190 1581.65 2273.95 1185.02 1576.25 2280.72 1190.02 1581.73 2273.98 1185.06 1576.33 2280.75 1190.06 1581.8 2273.98 1185.13 1576.4 2280.75 1190.13 1576.44 2280.73 1190.22 1581.86 2273.91 1185.3 1576.46 2280.68 1190.3 1581.85 2273.84 1185.37 1576.44 2280.61 1190.37 1581.8 2273.77 1185.42 1576.4 2280.54 1190.42 1576.51 2280.24 1191.16 1576.7 2280.47 1191.17 1576.79 2280.74 1191.2 1576.77 2281.03 1191.24 1576.64 2281.29 1191.29 1576.41 2281.47 1191.34 1576.14 2281.56 1191.38 1575.85 2281.53 1191.41 1575.59 2281.4 1191.42 1575.4 2281.17 1191.41 1575.31 2280.9 1191.38 1575.33 2280.61 1191.34 1575.46 2280.35 1191.29 1575.68 2280.17 1191.24 1575.96 2280.08 1191.2 1576.25 2280.11 1191.17 1576.34 2280.46 1188.16 1576.59 2280.75 1188.17 1576.71 2281.12 1188.21 1576.68 2281.51 1188.27 1576.51 2281.85 1188.33 1576.21 2282.1 1188.4 1575.84 2282.21 1188.46 1575.46 2282.18 1188.49 1575.11 2282 1188.51 1574.86 2281.7 1188.49 1574.74 2281.33 1188.46 1574.77 2280.94 1188.4 1574.94 2280.6 1188.33 1575.24 2280.36 1188.27 1575.61 2280.24 1188.21 1575.99 2280.28 1188.17 1576.5 2280.25 1191.16 1576.28 2280.53 1188.18 1576.69 2280.47 1191.17 1576.5 2280.8 1188.19 1576.78 2280.74 1191.2 1576.61 2281.13 1188.22 1576.76 2281.03 1191.24 1576.59 2281.48 1188.27 1576.63 2281.28 1191.29 1576.43 2281.79 1188.33 1576.41 2281.46 1191.34 1576.16 2282.01 1188.39 1576.14 2281.55 1191.38 1575.83 2282.11 1188.44 1575.85 2281.52 1191.41 1575.48 2282.08 1188.48 1575.59 2281.39 1191.42 1575.17 2281.92 1188.49 1575.41 2281.17 1191.41 1574.94 2281.65 1188.48 1575.32 2280.9 1191.38 1574.84 2281.32 1188.44 1575.34 2280.61 1191.34 1574.86 2280.97 1188.39 1575.47 2280.36 1191.29 1575.02 2280.66 1188.33 1575.69 2280.17 1191.24 1575.29 2280.44 1188.27 1575.96 2280.09 1191.2 1575.62 2280.34 1188.22 1576.25 2280.12 1191.17 1575.97 2280.37 1188.19 1576.85 2279.82 1187 1577.35 2280.42 1187.03 1577.59 2281.16 1187.1 1577.53 2281.93 1187.22 1577.18 2282.61 1187.35 1576.59 2283.1 1187.48 1575.85 2283.33 1187.59 1575.08 2283.26 1187.67 1574.39 2282.9 1187.7 1573.88 2282.31 1187.67 1573.64 2281.57 1187.59 1573.7 2280.8 1187.48 1574.05 2280.11 1187.35 1574.64 2279.62 1187.22 1575.38 2279.39 1187.1 1576.15 2279.46 1187.03 1576.78 2279.9 1187.02 1577.26 2280.46 1187.04 1577.49 2281.17 1187.12 1577.43 2281.9 1187.22 1577.1 2282.55 1187.35 1576.54 2283.02 1187.47 1575.84 2283.23 1187.58 1575.11 2283.17 1187.65 1574.45 2282.82 1187.68 1573.97 2282.26 1187.65 1573.74 2281.56 1187.58 1573.8 2280.83 1187.47 1574.13 2280.18 1187.35 1574.69 2279.71 1187.22 1575.39 2279.49 1187.12 1576.13 2279.56 1187.04 1577.19 2279.39 1184.37 1577.95 2280.28 1184.41 1578.31 2281.39 1184.52 1578.22 2282.55 1184.69 1577.69 2283.57 1184.89 1576.81 2284.31 1185.09 1575.7 2284.66 1185.25 1574.54 2284.55 1185.37 1573.5 2284.01 1185.41 1572.75 2283.12 1185.37 1572.38 2282.01 1185.25 1572.47 2280.86 1185.09 1573 2279.83 1184.89 1573.88 2279.09 1184.69 1574.99 2278.75 1184.52 1576.15 2278.85 1184.41 1577.13 2279.47 1184.38 1577.86 2280.33 1184.42 1578.21 2281.4 1184.53 1578.12 2282.52 1184.69 1577.61 2283.51 1184.89 1576.76 2284.23 1185.08 1575.69 2284.56 1185.24 1574.57 2284.46 1185.35 1573.56 2283.93 1185.39 1572.83 2283.07 1185.35 1572.48 2282 1185.24 1572.57 2280.88 1185.08 1573.08 2279.89 1184.89 1573.93 2279.18 1184.69 1575 2278.84 1184.53 1576.12 2278.95 1184.42 1538.36 2267.67 1171 1537.11 2297.89 1171 1585.57 2299.89 1171 1586.82 2269.67 1171 1585.57 2299.89 1172 1586.82 2269.67 1172 1538.36 2267.67 1172 1537.11 2297.89 1172 1585.57 2269.62 1141 1585.53 2270.61 1141 1586.53 2270.66 1141 1586.57 2269.66 1141 1586.53 2270.66 1171 1586.57 2269.66 1171 1585.57 2269.62 1171 1585.53 2270.61 1171 1538.61 2267.68 1141 1538.57 2268.68 1141 1539.57 2268.72 1141 1539.61 2267.72 1141 1539.57 2268.72 1171 1539.61 2267.72 1171 1538.61 2267.68 1171 1538.57 2268.68 1171 1537.42 2296.66 1141 1537.37 2297.65 1141 1538.37 2297.7 1141 1538.41 2296.7 1141 1538.37 2297.7 1171 1538.41 2296.7 1171 1537.42 2296.66 1171 1537.37 2297.65 1171 1584.38 2298.59 1141 1584.33 2299.59 1141 1585.33 2299.63 1141 1585.37 2298.63 1141 1585.33 2299.63 1171 1585.37 2298.63 1171 1584.38 2298.59 1171 1584.33 2299.59 1171 1539.61 2267.72 1150 1539.57 2268.72 1150 1585.53 2270.61 1150 1585.57 2269.62 1150 1584.38 2298.59 1150 1585.37 2298.63 1150 1586.53 2270.66 1150 1538.57 2268.68 1150 1537.42 2296.66 1150 1538.41 2296.7 1150 1539.57 2268.72 1165 1538.37 2297.7 1165 1552.36 2298.27 1165 1553.56 2269.3 1165 1552.36 2298.27 1171 1553.56 2269.3 1171 1538.37 2297.7 1150 1552.36 2298.27 1150 1553.56 2269.3 1150 1552.36 2298.27 1164.75 1553.56 2269.3 1164.75 1539.57 2268.72 1164.75 1538.37 2297.7 1164.75 1542.83 2298.88 1167.62 1542.81 2299.38 1167.62 1547.8 2299.59 1167.62 1547.82 2299.09 1167.62 1547.8 2299.59 1168.37 1547.82 2299.09 1168.37 1542.83 2298.88 1168.37 1542.81 2299.38 1168.37 1546.87 2298.05 1167.62 1546.83 2299.05 1167.62 1547.32 2299.07 1167.62 1547.37 2298.07 1167.62 1547.32 2299.07 1168.37 1547.37 2298.07 1168.37 1546.87 2298.05 1168.37 1546.83 2299.05 1168.37 1543.37 2297.9 1167.62 1543.33 2298.9 1167.62 1543.83 2298.92 1167.62 1543.87 2297.92 1167.62 1543.83 2298.92 1168.37 1543.87 2297.92 1168.37 1543.37 2297.9 1168.37 1543.33 2298.9 1168.37 1542.83 2298.88 1161.37 1542.81 2299.38 1161.37 1547.8 2299.59 1161.37 1547.82 2299.09 1161.37 1547.8 2299.59 1162.12 1547.82 2299.09 1162.12 1542.83 2298.88 1162.12 1542.81 2299.38 1162.12 1546.87 2298.05 1161.37 1546.83 2299.05 1161.37 1547.32 2299.07 1161.37 1547.37 2298.07 1161.37 1547.32 2299.07 1162.12 1547.37 2298.07 1162.12 1546.87 2298.05 1162.12 1546.83 2299.05 1162.12 1543.37 2297.9 1161.37 1543.33 2298.9 1161.37 1543.83 2298.92 1161.37 1543.87 2297.92 1161.37 1543.83 2298.92 1162.12 1543.87 2297.92 1162.12 1543.37 2297.9 1162.12 1543.33 2298.9 1162.12 1641.66 2333.17 1167 1641.66 2332.57 1167 1620.06 2332.57 1167 1620.06 2333.17 1167 1620.06 2278.57 1167 1619.16 2278.57 1167 1619.16 2332.57 1167 1641.66 2278.57 1167 1641.66 2277.97 1167 1620.06 2277.97 1167 1642.56 2332.57 1167 1642.56 2278.57 1167 1642.56 2278.57 1170 1641.66 2277.97 1170 1620.06 2277.97 1170 1619.16 2278.57 1170 1619.16 2332.57 1170 1620.06 2333.17 1170 1641.66 2333.17 1170 1642.56 2332.57 1170 1641.66 2278.57 1170 1641.66 2332.57 1170 1620.06 2332.57 1170 1620.06 2278.57 1170 1620.06 2283.97 1147 1620.06 2283.97 1148 1620.06 2284.57 1148 1620.06 2284.57 1147 1620.06 2327.77 1141 1620.06 2327.77 1147 1620.96 2327.77 1147 1620.96 2327.77 1141 1620.96 2327.17 1147 1620.96 2327.17 1141 1620.06 2327.17 1147 1620.06 2327.17 1141 1640.76 2327.17 1141 1640.76 2327.17 1147 1640.76 2327.77 1147 1640.76 2327.77 1141 1641.66 2327.77 1147 1641.66 2327.77 1141 1641.66 2327.17 1147 1641.66 2327.17 1141 1640.76 2283.97 1141 1640.76 2283.97 1147 1640.76 2284.57 1147 1640.76 2284.57 1141 1641.66 2284.57 1147 1641.66 2284.57 1141 1641.66 2283.97 1147 1641.66 2283.97 1141 1620.06 2284.57 1141 1620.96 2284.57 1147 1620.96 2284.57 1141 1620.96 2283.97 1147 1620.96 2283.97 1141 1620.06 2283.97 1141 1620.06 2327.77 1148 1641.66 2327.77 1148 1641.66 2327.17 1148 1620.06 2327.17 1148 1641.66 2284.57 1148 1641.66 2283.97 1148 1617.36 2334.37 1171 1617.36 2276.77 1171 1644.36 2276.77 1171 1644.36 2334.37 1171 1624.56 2327.17 1148 1624.56 2327.77 1148 1636.26 2327.17 1148 1636.26 2327.77 1148 1625.46 2327.77 1148 1625.46 2327.17 1148 1637.16 2327.77 1148 1637.16 2327.17 1148 1637.16 2284.57 1148 1637.16 2283.97 1148 1636.26 2283.97 1148 1636.26 2284.57 1148 1625.46 2284.57 1148 1625.46 2283.97 1148 1624.56 2283.97 1148 1624.56 2284.57 1148 1625.46 2327.77 1170 1625.46 2327.17 1170 1624.56 2327.17 1170 1624.56 2327.77 1170 1637.16 2327.77 1170 1637.16 2327.17 1170 1636.26 2327.17 1170 1636.26 2327.77 1170 1636.26 2283.97 1170 1636.26 2284.57 1170 1637.16 2284.57 1170 1637.16 2283.97 1170 1624.56 2283.97 1170 1624.56 2284.57 1170 1625.46 2284.57 1170 1625.46 2283.97 1170 1644.36 2334.37 1170 1617.36 2334.37 1170 1644.36 2276.77 1170 1617.36 2276.77 1170 1477.67 2281.37 1188 1477.67 2329.37 1188 1477.67 2329.37 1228.4 1477.67 2281.37 1228.4 1477.79 2329.37 1188 1477.79 2329.37 1228.4 1477.79 2328.87 1228.4 1477.79 2328.87 1188 1477.27 2328.87 1228.4 1477.27 2328.87 1188 1477.27 2329.37 1188 1477.27 2329.37 1228.4 1477.79 2281.87 1188 1477.79 2281.87 1228.4 1477.79 2281.37 1228.4 1477.79 2281.37 1188 1477.27 2281.37 1228.4 1477.27 2281.37 1188 1477.27 2281.87 1188 1477.27 2281.87 1228.4 1477.79 2329.37 1227.78 1477.79 2281.37 1227.78 1477.27 2281.37 1227.78 1477.27 2329.37 1227.78 1477.79 2329.37 1188.62 1477.79 2281.37 1188.62 1477.27 2281.37 1188.62 1477.27 2329.37 1188.62 1489.42 2189.97 1246 1477.42 2189.97 1246 1489.42 2189.97 1141 1489.42 2188.97 1246 1477.42 2189.97 1141 1477.42 2188.97 1246 1489.42 2188.97 1141 1477.42 2188.97 1141 1489.42 2224.97 1246 1477.42 2224.97 1246 1489.42 2224.97 1141 1489.42 2223.97 1246 1477.42 2224.97 1141 1477.42 2223.97 1246 1489.42 2223.97 1141 1477.42 2223.97 1141 1489.42 2223.97 1142 1477.42 2223.97 1142 1489.42 2223.97 1141 1489.42 2189.97 1142 1477.42 2223.97 1141 1477.42 2189.97 1142 1489.42 2189.97 1141 1477.42 2189.97 1141 1477.13 2189.97 1148.5 1477.13 2189.97 1142 1484.87 2189.97 1142 1484.87 2189.97 1148.5 1484.87 2190.25 1142 1484.87 2190.25 1148.5 1477.13 2190.25 1148.5 1477.13 2190.25 1142 1477.13 2192.79 1148.5 1477.13 2192.79 1142 1484.87 2192.79 1142 1484.87 2192.79 1148.5 1484.87 2193.07 1142 1484.87 2193.07 1148.5 1477.13 2193.07 1148.5 1477.13 2193.07 1142 1485.01 2190.25 1142 1485.01 2190.25 1148.5 1485.01 2192.79 1142 1485.01 2192.79 1148.5 1484.87 2192.79 1148.41 1477.28 2192.79 1148.41 1477.28 2190.25 1148.41 1484.87 2190.25 1148.41 1477.28 2192.79 1142.09 1477.28 2190.25 1142.09 1484.87 2192.79 1142.09 1484.87 2190.25 1142.09 1477.22 2193.32 1148.36 1477.22 2193.32 1142 1482.4 2193.32 1142 1482.4 2193.32 1148.36 1482.4 2193.56 1142 1482.4 2193.56 1148.36 1477.22 2193.56 1148.36 1477.22 2193.56 1142 1477.22 2195.76 1148.36 1477.22 2195.76 1142 1482.4 2195.76 1142 1482.4 2195.76 1148.36 1482.4 2196 1142 1482.4 2196 1148.36 1477.22 2196 1148.36 1477.22 2196 1142 1482.5 2193.56 1142 1482.5 2193.56 1148.36 1482.5 2195.76 1142 1482.5 2195.76 1148.36 1482.4 2195.76 1148.28 1477.32 2195.76 1148.28 1477.32 2193.56 1148.28 1482.4 2193.56 1148.28 1477.32 2195.76 1142.08 1477.32 2193.56 1142.08 1482.4 2195.76 1142.08 1482.4 2193.56 1142.08 1477.22 2196.24 1151.74 1477.22 2196.24 1142 1482.46 2196.24 1142 1482.46 2196.24 1151.74 1482.46 2196.53 1142 1482.46 2196.53 1151.74 1477.22 2196.53 1151.74 1477.22 2196.53 1142 1477.22 2199.11 1151.74 1477.22 2199.11 1142 1482.46 2199.11 1142 1482.46 2199.11 1151.74 1482.46 2199.4 1142 1482.46 2199.4 1151.74 1477.22 2199.4 1151.74 1477.22 2199.4 1142 1482.56 2196.53 1142 1482.56 2196.53 1151.74 1482.56 2199.11 1142 1482.56 2199.11 1151.74 1482.46 2199.11 1151.62 1477.32 2199.11 1151.62 1477.32 2196.53 1151.62 1482.46 2196.53 1151.62 1477.32 2199.11 1142.12 1477.32 2196.53 1142.12 1482.46 2199.11 1142.12 1482.46 2196.53 1142.12 1477.21 2199.65 1152.83 1477.21 2199.65 1142 1482.56 2199.65 1142 1482.56 2199.65 1152.83 1482.56 2199.8 1142 1482.56 2199.8 1152.83 1477.21 2199.8 1152.83 1477.21 2199.8 1142 1477.21 2201.12 1152.83 1477.21 2201.12 1142 1482.56 2201.12 1142 1482.56 2201.12 1152.83 1482.56 2201.27 1142 1482.56 2201.27 1152.83 1477.21 2201.27 1152.83 1477.21 2201.27 1142 1482.66 2199.8 1142 1482.66 2199.8 1152.83 1482.66 2201.12 1142 1482.66 2201.12 1152.83 1482.56 2201.12 1152.68 1477.32 2201.12 1152.68 1477.32 2199.8 1152.68 1482.56 2199.8 1152.68 1477.32 2201.12 1142.14 1477.32 2199.8 1142.14 1482.56 2201.12 1142.14 1482.56 2199.8 1142.14 1477.1 2201.52 1151.98 1477.1 2201.52 1142 1485.4 2201.52 1142 1485.4 2201.52 1151.98 1485.4 2201.59 1142 1485.4 2201.59 1151.98 1477.1 2201.59 1151.98 1477.1 2201.59 1142 1477.1 2202.21 1151.98 1477.1 2202.21 1142 1485.4 2202.21 1142 1485.4 2202.21 1151.98 1485.4 2202.28 1142 1485.4 2202.28 1151.98 1477.1 2202.28 1151.98 1477.1 2202.28 1142 1485.56 2201.59 1142 1485.56 2201.59 1151.98 1485.56 2202.21 1142 1485.56 2202.21 1151.98 1485.4 2202.21 1151.85 1477.25 2202.21 1151.85 1477.25 2201.59 1151.85 1485.4 2201.59 1151.85 1477.25 2202.21 1142.13 1477.25 2201.59 1142.13 1485.4 2202.21 1142.13 1485.4 2201.59 1142.13 1477.11 2202.53 1151.38 1477.11 2202.53 1142 1485.41 2202.53 1142 1485.41 2202.53 1151.38 1485.41 2202.75 1142 1485.41 2202.75 1151.38 1477.11 2202.75 1151.38 1477.11 2202.75 1142 1477.11 2204.73 1151.38 1477.11 2204.73 1142 1485.41 2204.73 1142 1485.41 2204.73 1151.38 1485.41 2204.95 1142 1485.41 2204.95 1151.38 1477.11 2204.95 1151.38 1477.11 2204.95 1142 1485.57 2202.75 1142 1485.57 2202.75 1151.38 1485.57 2204.73 1142 1485.57 2204.73 1151.38 1485.41 2204.73 1151.26 1477.26 2204.73 1151.26 1477.26 2202.75 1151.26 1485.41 2202.75 1151.26 1477.26 2204.73 1142.12 1477.26 2202.75 1142.12 1485.41 2204.73 1142.12 1485.41 2202.75 1142.12 1477.22 2205.18 1148.94 1477.22 2205.18 1142 1482.43 2205.18 1142 1482.43 2205.18 1148.94 1482.43 2205.28 1142 1482.43 2205.28 1148.94 1477.22 2205.28 1148.94 1477.22 2205.28 1142 1477.22 2206.14 1148.94 1477.22 2206.14 1142 1482.43 2206.14 1142 1482.43 2206.14 1148.94 1482.43 2206.24 1142 1482.43 2206.24 1148.94 1477.22 2206.24 1148.94 1477.22 2206.24 1142 1482.53 2205.28 1142 1482.53 2205.28 1148.94 1482.53 2206.14 1142 1482.53 2206.14 1148.94 1482.43 2206.14 1148.85 1477.32 2206.14 1148.85 1477.32 2205.28 1148.85 1482.43 2205.28 1148.85 1477.32 2206.14 1142.09 1477.32 2205.28 1142.09 1482.43 2206.14 1142.09 1482.43 2205.28 1142.09 1477.08 2206.49 1148.74 1477.08 2206.49 1142 1486.01 2206.49 1142 1486.01 2206.49 1148.74 1486.01 2206.59 1142 1486.01 2206.59 1148.74 1477.08 2206.59 1148.74 1477.08 2206.59 1142 1477.08 2207.57 1148.74 1477.08 2207.57 1142 1486.01 2207.57 1142 1486.01 2207.57 1148.74 1486.01 2207.68 1142 1486.01 2207.68 1148.74 1477.08 2207.68 1148.74 1477.08 2207.68 1142 1486.18 2206.59 1142 1486.18 2206.59 1148.74 1486.18 2207.57 1142 1486.18 2207.57 1148.74 1486.01 2207.57 1148.65 1477.25 2207.57 1148.65 1477.25 2206.59 1148.65 1486.01 2206.59 1148.65 1477.25 2207.57 1142.09 1477.25 2206.59 1142.09 1486.01 2207.57 1142.09 1486.01 2206.59 1142.09 1477.21 2207.93 1150.93 1477.21 2207.93 1142.01 1482.73 2207.93 1142.01 1482.73 2207.93 1150.93 1482.73 2208.12 1142.01 1482.73 2208.12 1150.93 1477.21 2208.12 1150.93 1477.21 2208.12 1142.01 1477.21 2209.92 1150.93 1477.21 2209.92 1142.01 1482.73 2209.92 1142.01 1482.73 2209.92 1150.93 1482.73 2210.12 1142.01 1482.73 2210.12 1150.93 1477.21 2210.12 1150.93 1477.21 2210.12 1142.01 1482.84 2208.12 1142.01 1482.84 2208.12 1150.93 1482.84 2209.92 1142.01 1482.84 2209.92 1150.93 1482.73 2209.92 1150.82 1477.31 2209.92 1150.82 1477.31 2208.12 1150.82 1482.73 2208.12 1150.82 1477.31 2209.92 1142.12 1477.31 2208.12 1142.12 1482.73 2209.92 1142.12 1482.73 2208.12 1142.12 1477.22 2210.36 1148.62 1477.22 2210.36 1142 1482.55 2210.36 1142 1482.55 2210.36 1148.62 1482.55 2210.5 1142 1482.55 2210.5 1148.62 1477.22 2210.5 1148.62 1477.22 2210.5 1142 1477.22 2211.78 1148.62 1477.22 2211.78 1142 1482.55 2211.78 1142 1482.55 2211.78 1148.62 1482.55 2211.92 1142 1482.55 2211.92 1148.62 1477.22 2211.92 1148.62 1477.22 2211.92 1142 1482.65 2210.5 1142 1482.65 2210.5 1148.62 1482.65 2211.78 1142 1482.65 2211.78 1148.62 1482.55 2211.78 1148.53 1477.32 2211.78 1148.53 1477.32 2210.5 1148.53 1482.55 2210.5 1148.53 1477.32 2211.78 1142.09 1477.32 2210.5 1142.09 1482.55 2211.78 1142.09 1482.55 2210.5 1142.09 1477.17 2212.16 1148.46 1477.17 2212.16 1142 1483.66 2212.16 1142 1483.66 2212.16 1148.46 1483.66 2212.22 1142 1483.66 2212.22 1148.46 1477.17 2212.22 1148.46 1477.17 2212.22 1142 1477.17 2212.68 1148.46 1477.17 2212.68 1142 1483.66 2212.68 1142 1483.66 2212.68 1148.46 1483.66 2212.74 1142 1483.66 2212.74 1148.46 1477.17 2212.74 1148.46 1477.17 2212.74 1142 1483.78 2212.22 1142 1483.78 2212.22 1148.46 1483.78 2212.68 1142 1483.78 2212.68 1148.46 1483.66 2212.68 1148.38 1477.3 2212.68 1148.38 1477.3 2212.22 1148.38 1483.66 2212.22 1148.38 1477.3 2212.68 1142.08 1477.3 2212.22 1142.08 1483.66 2212.68 1142.08 1483.66 2212.22 1142.08 1477.13 2212.99 1150.01 1477.13 2212.99 1142 1484.62 2212.99 1142 1484.62 2212.99 1150.01 1484.62 2213.2 1142 1484.62 2213.2 1150.01 1477.13 2213.2 1150.01 1477.13 2213.2 1142 1477.13 2215.08 1150.01 1477.13 2215.08 1142 1484.62 2215.08 1142 1484.62 2215.08 1150.01 1484.62 2215.29 1142 1484.62 2215.29 1150.01 1477.13 2215.29 1150.01 1477.13 2215.29 1142 1484.76 2213.2 1142 1484.76 2213.2 1150.01 1484.76 2215.08 1142 1484.76 2215.08 1150.01 1484.62 2215.08 1149.9 1477.27 2215.08 1149.9 1477.27 2213.2 1149.9 1484.62 2213.2 1149.9 1477.27 2215.08 1142.1 1477.27 2213.2 1142.1 1484.62 2215.08 1142.1 1484.62 2213.2 1142.1 1477.11 2215.53 1149.87 1477.11 2215.53 1142.01 1485.07 2215.53 1142.01 1485.07 2215.53 1149.87 1485.07 2215.62 1142.01 1485.07 2215.62 1149.87 1477.11 2215.62 1149.87 1477.11 2215.62 1142.01 1477.11 2216.38 1149.87 1477.11 2216.38 1142.01 1485.07 2216.38 1142.01 1485.07 2216.38 1149.87 1485.07 2216.47 1142.01 1485.07 2216.47 1149.87 1477.11 2216.47 1149.87 1477.11 2216.47 1142.01 1485.22 2215.62 1142.01 1485.22 2215.62 1149.87 1485.22 2216.38 1142.01 1485.22 2216.38 1149.87 1485.07 2216.38 1149.77 1477.27 2216.38 1149.77 1477.27 2215.62 1149.77 1485.07 2215.62 1149.77 1477.27 2216.38 1142.11 1477.27 2215.62 1142.11 1485.07 2216.38 1142.11 1485.07 2215.62 1142.11 1477.18 2216.72 1150.44 1477.18 2216.72 1142 1483.21 2216.72 1142 1483.21 2216.72 1150.44 1483.21 2216.78 1142 1483.21 2216.78 1150.44 1477.18 2216.78 1150.44 1477.18 2216.78 1142 1477.18 2217.28 1150.44 1477.18 2217.28 1142 1483.21 2217.28 1142 1483.21 2217.28 1150.44 1483.21 2217.34 1142 1483.21 2217.34 1150.44 1477.18 2217.34 1150.44 1477.18 2217.34 1142 1483.32 2216.78 1142 1483.32 2216.78 1150.44 1483.32 2217.28 1142 1483.32 2217.28 1150.44 1483.21 2217.28 1150.33 1477.3 2217.28 1150.33 1477.3 2216.78 1150.33 1483.21 2216.78 1150.33 1477.3 2217.28 1142.11 1477.3 2216.78 1142.11 1483.21 2217.28 1142.11 1483.21 2216.78 1142.11 1489.42 2223.97 1155 1477.42 2223.97 1155 1489.42 2223.97 1154 1489.42 2189.97 1155 1477.42 2223.97 1154 1477.42 2189.97 1155 1489.42 2189.97 1154 1477.42 2189.97 1154 1477.1 2189.96 1162.28 1477.1 2189.96 1155 1485.35 2189.96 1155 1485.35 2189.96 1162.28 1485.35 2190.19 1155 1485.35 2190.19 1162.28 1477.1 2190.19 1162.28 1477.1 2190.19 1155 1477.1 2192.25 1162.28 1477.1 2192.25 1155 1485.35 2192.25 1155 1485.35 2192.25 1162.28 1485.35 2192.48 1155 1485.35 2192.48 1162.28 1477.1 2192.48 1162.28 1477.1 2192.48 1155 1485.5 2190.19 1155 1485.5 2190.19 1162.28 1485.5 2192.25 1155 1485.5 2192.25 1162.28 1485.35 2192.25 1162.18 1477.26 2192.25 1162.18 1477.26 2190.19 1162.18 1485.35 2190.19 1162.18 1477.26 2192.25 1155.1 1477.26 2190.19 1155.1 1485.35 2192.25 1155.1 1485.35 2190.19 1155.1 1477.21 2192.73 1164.56 1477.21 2192.73 1155 1482.64 2192.73 1155 1482.64 2192.73 1164.56 1482.64 2192.97 1155 1482.64 2192.97 1164.56 1477.21 2192.97 1164.56 1477.21 2192.97 1155 1477.21 2195.09 1164.56 1477.21 2195.09 1155 1482.64 2195.09 1155 1482.64 2195.09 1164.56 1482.64 2195.33 1155 1482.64 2195.33 1164.56 1477.21 2195.33 1164.56 1477.21 2195.33 1155 1482.74 2192.97 1155 1482.74 2192.97 1164.56 1482.74 2195.09 1155 1482.74 2195.09 1164.56 1482.64 2195.09 1164.43 1477.31 2195.09 1164.43 1477.31 2192.97 1164.43 1482.64 2192.97 1164.43 1477.31 2195.09 1155.13 1477.31 2192.97 1155.13 1482.64 2195.09 1155.13 1482.64 2192.97 1155.13 1477.08 2195.58 1161.93 1477.08 2195.58 1155.01 1486.06 2195.58 1155.01 1486.06 2195.58 1161.93 1486.06 2195.83 1155.01 1486.06 2195.83 1161.93 1477.08 2195.83 1161.93 1477.08 2195.83 1155.01 1477.08 2198.11 1161.93 1477.08 2198.11 1155.01 1486.06 2198.11 1155.01 1486.06 2198.11 1161.93 1486.06 2198.36 1155.01 1486.06 2198.36 1161.93 1477.08 2198.36 1161.93 1477.08 2198.36 1155.01 1486.23 2195.83 1155.01 1486.23 2195.83 1161.93 1486.23 2198.11 1155.01 1486.23 2198.11 1161.93 1486.06 2198.11 1161.84 1477.25 2198.11 1161.84 1477.25 2195.83 1161.84 1486.06 2195.83 1161.84 1477.25 2198.11 1155.1 1477.25 2195.83 1155.1 1486.06 2198.11 1155.1 1486.06 2195.83 1155.1 1477.07 2198.61 1161.06 1477.07 2198.61 1155 1486.15 2198.61 1155 1486.15 2198.61 1161.06 1486.15 2198.97 1155 1486.15 2198.97 1161.06 1477.07 2198.97 1161.06 1477.07 2198.97 1155 1477.07 2202.12 1161.06 1477.07 2202.12 1155 1486.15 2202.12 1155 1486.15 2202.12 1161.06 1486.15 2202.47 1155 1486.15 2202.47 1161.06 1477.07 2202.47 1161.06 1477.07 2202.47 1155 1486.32 2198.97 1155 1486.32 2198.97 1161.06 1486.32 2202.12 1155 1486.32 2202.12 1161.06 1486.15 2202.12 1160.98 1477.24 2202.12 1160.98 1477.24 2198.97 1160.98 1486.15 2198.97 1160.98 1477.24 2202.12 1155.08 1477.24 2198.97 1155.08 1486.15 2202.12 1155.08 1486.15 2198.97 1155.08 1477.11 2202.72 1162.59 1477.11 2202.72 1155 1485.05 2202.72 1155 1485.05 2202.72 1162.59 1485.05 2202.82 1155 1485.05 2202.82 1162.59 1477.11 2202.82 1162.59 1477.11 2202.82 1155 1477.11 2203.76 1162.59 1477.11 2203.76 1155 1485.05 2203.76 1155 1485.05 2203.76 1162.59 1485.05 2203.87 1155 1485.05 2203.87 1162.59 1477.11 2203.87 1162.59 1477.11 2203.87 1155 1485.2 2202.82 1155 1485.2 2202.82 1162.59 1485.2 2203.76 1155 1485.2 2203.76 1162.59 1485.05 2203.76 1162.49 1477.26 2203.76 1162.49 1477.26 2202.82 1162.49 1485.05 2202.82 1162.49 1477.26 2203.76 1155.09 1477.26 2202.82 1155.09 1485.05 2203.76 1155.09 1485.05 2202.82 1155.09 1477.17 2204.11 1162.42 1477.17 2204.11 1155 1483.56 2204.11 1155 1483.56 2204.11 1162.42 1483.56 2204.21 1155 1483.56 2204.21 1162.42 1477.17 2204.21 1162.42 1477.17 2204.21 1155 1477.17 2205.09 1162.42 1477.17 2205.09 1155 1483.56 2205.09 1155 1483.56 2205.09 1162.42 1483.56 2205.19 1155 1483.56 2205.19 1162.42 1477.17 2205.19 1162.42 1477.17 2205.19 1155 1483.68 2204.21 1155 1483.68 2204.21 1162.42 1483.68 2205.09 1155 1483.68 2205.09 1162.42 1483.56 2205.09 1162.32 1477.29 2205.09 1162.32 1477.29 2204.21 1162.32 1483.56 2204.21 1162.32 1477.29 2205.09 1155.1 1477.29 2204.21 1155.1 1483.56 2205.09 1155.1 1483.56 2204.21 1155.1 1477.07 2205.43 1161.09 1477.07 2205.43 1155 1486.2 2205.43 1155 1486.2 2205.43 1161.09 1486.2 2205.77 1155 1486.2 2205.77 1161.09 1477.07 2205.77 1161.09 1477.07 2205.77 1155 1477.07 2208.81 1161.09 1477.07 2208.81 1155 1486.2 2208.81 1155 1486.2 2208.81 1161.09 1486.2 2209.15 1155 1486.2 2209.15 1161.09 1477.07 2209.15 1161.09 1477.07 2209.15 1155 1486.38 2205.77 1155 1486.38 2205.77 1161.09 1486.38 2208.81 1155 1486.38 2208.81 1161.09 1486.2 2208.81 1161 1477.24 2208.81 1161 1477.24 2205.77 1161 1486.2 2205.77 1161 1477.24 2208.81 1155.08 1477.24 2205.77 1155.08 1486.2 2208.81 1155.08 1486.2 2205.77 1155.08 1477.17 2209.39 1162.08 1477.17 2209.39 1155 1483.42 2209.39 1155 1483.42 2209.39 1162.08 1483.42 2209.66 1155 1483.42 2209.66 1162.08 1477.17 2209.66 1162.08 1477.17 2209.66 1155 1477.17 2212.1 1162.08 1477.17 2212.1 1155 1483.42 2212.1 1155 1483.42 2212.1 1162.08 1483.42 2212.37 1155 1483.42 2212.37 1162.08 1477.17 2212.37 1162.08 1477.17 2212.37 1155 1483.54 2209.66 1155 1483.54 2209.66 1162.08 1483.54 2212.1 1155 1483.54 2212.1 1162.08 1483.42 2212.1 1161.99 1477.29 2212.1 1161.99 1477.29 2209.66 1161.99 1483.42 2209.66 1161.99 1477.29 2212.1 1155.09 1477.29 2209.66 1155.09 1483.42 2212.1 1155.09 1483.42 2209.66 1155.09 1477.1 2212.62 1161.27 1477.1 2212.62 1155 1485.39 2212.62 1155 1485.39 2212.62 1161.27 1485.39 2212.72 1155 1485.39 2212.72 1161.27 1477.1 2212.72 1161.27 1477.1 2212.72 1155 1477.1 2213.66 1161.27 1477.1 2213.66 1155 1485.39 2213.66 1155 1485.39 2213.66 1161.27 1485.39 2213.76 1155 1485.39 2213.76 1161.27 1477.1 2213.76 1161.27 1477.1 2213.76 1155 1485.54 2212.72 1155 1485.54 2212.72 1161.27 1485.54 2213.66 1155 1485.54 2213.66 1161.27 1485.39 2213.66 1161.18 1477.26 2213.66 1161.18 1477.26 2212.72 1161.18 1485.39 2212.72 1161.18 1477.26 2213.66 1155.08 1477.26 2212.72 1155.08 1485.39 2213.66 1155.08 1485.39 2212.72 1155.08 1477.15 2214.01 1165.32 1477.15 2214.01 1155 1484.4 2214.01 1155 1484.4 2214.01 1165.32 1484.4 2214.33 1155 1484.4 2214.33 1165.32 1477.15 2214.33 1165.32 1477.15 2214.33 1155 1477.15 2217.25 1165.32 1477.15 2217.25 1155 1484.4 2217.25 1155 1484.4 2217.25 1165.32 1484.4 2217.58 1155 1484.4 2217.58 1165.32 1477.15 2217.58 1165.32 1477.15 2217.58 1155 1484.53 2214.33 1155 1484.53 2214.33 1165.32 1484.53 2217.25 1155 1484.53 2217.25 1165.32 1484.4 2217.25 1165.18 1477.29 2217.25 1165.18 1477.29 2214.33 1165.18 1484.4 2214.33 1165.18 1477.29 2217.25 1155.14 1477.29 2214.33 1155.14 1484.4 2217.25 1155.14 1484.4 2214.33 1155.14 1489.42 2223.97 1168 1477.42 2223.97 1168 1489.42 2223.97 1167 1489.42 2189.97 1168 1477.42 2223.97 1167 1477.42 2189.97 1168 1489.42 2189.97 1167 1477.42 2189.97 1167 1477.22 2189.97 1176.4 1477.22 2189.97 1168 1482.4 2189.97 1168 1482.4 2189.97 1176.4 1482.4 2190.04 1168 1482.4 2190.04 1176.4 1477.22 2190.04 1176.4 1477.22 2190.04 1168 1477.22 2190.62 1176.4 1477.22 2190.62 1168 1482.4 2190.62 1168 1482.4 2190.62 1176.4 1482.4 2190.69 1168 1482.4 2190.69 1176.4 1477.22 2190.69 1176.4 1477.22 2190.69 1168 1482.5 2190.04 1168 1482.5 2190.04 1176.4 1482.5 2190.62 1168 1482.5 2190.62 1176.4 1482.4 2190.62 1176.29 1477.32 2190.62 1176.29 1477.32 2190.04 1176.29 1482.4 2190.04 1176.29 1477.32 2190.62 1168.11 1477.32 2190.04 1168.11 1482.4 2190.62 1168.11 1482.4 2190.04 1168.11 1477.14 2190.94 1178.98 1477.14 2190.94 1168 1484.46 2190.94 1168 1484.46 2190.94 1178.98 1484.46 2191.1 1168 1484.46 2191.1 1178.98 1477.14 2191.1 1178.98 1477.14 2191.1 1168 1477.14 2192.54 1178.98 1477.14 2192.54 1168 1484.46 2192.54 1168 1484.46 2192.54 1178.98 1484.46 2192.7 1168 1484.46 2192.7 1178.98 1477.14 2192.7 1178.98 1477.14 2192.7 1168 1484.6 2191.1 1168 1484.6 2191.1 1178.98 1484.6 2192.54 1168 1484.6 2192.54 1178.98 1484.46 2192.54 1178.84 1477.28 2192.54 1178.84 1477.28 2191.1 1178.84 1484.46 2191.1 1178.84 1477.28 2192.54 1168.14 1477.28 2191.1 1168.14 1484.46 2192.54 1168.14 1484.46 2191.1 1168.14 1477.1 2192.95 1175.22 1477.1 2192.95 1168 1485.3 2192.95 1168 1485.3 2192.95 1175.22 1485.3 2193.19 1168 1485.3 2193.19 1175.22 1477.1 2193.19 1175.22 1477.1 2193.19 1168 1477.1 2195.31 1175.22 1477.1 2195.31 1168 1485.3 2195.31 1168 1485.3 2195.31 1175.22 1485.3 2195.55 1168 1485.3 2195.55 1175.22 1477.1 2195.55 1175.22 1477.1 2195.55 1168 1485.46 2193.19 1168 1485.46 2193.19 1175.22 1485.46 2195.31 1168 1485.46 2195.31 1175.22 1485.3 2195.31 1175.13 1477.26 2195.31 1175.13 1477.26 2193.19 1175.13 1485.3 2193.19 1175.13 1477.26 2195.31 1168.1 1477.26 2193.19 1168.1 1485.3 2195.31 1168.1 1485.3 2193.19 1168.1 1477.07 2195.8 1174.39 1477.07 2195.8 1168.01 1486.05 2195.8 1168.01 1486.05 2195.8 1174.39 1486.05 2195.86 1168.01 1486.05 2195.86 1174.39 1477.07 2195.86 1174.39 1477.07 2195.86 1168.01 1477.07 2196.36 1174.39 1477.07 2196.36 1168.01 1486.05 2196.36 1168.01 1486.05 2196.36 1174.39 1486.05 2196.42 1168.01 1486.05 2196.42 1174.39 1477.07 2196.42 1174.39 1477.07 2196.42 1168.01 1486.22 2195.86 1168.01 1486.22 2195.86 1174.39 1486.22 2196.36 1168.01 1486.22 2196.36 1174.39 1486.05 2196.36 1174.31 1477.24 2196.36 1174.31 1477.24 2195.86 1174.31 1486.05 2195.86 1174.31 1477.24 2196.36 1168.09 1477.24 2195.86 1168.09 1486.05 2196.36 1168.09 1486.05 2195.86 1168.09 1477.09 2196.66 1178.7 1477.09 2196.66 1168 1485.83 2196.66 1168 1485.83 2196.66 1178.7 1485.83 2196.77 1168 1485.83 2196.77 1178.7 1477.09 2196.77 1178.7 1477.09 2196.77 1168 1477.09 2197.71 1178.7 1477.09 2197.71 1168 1485.83 2197.71 1168 1485.83 2197.71 1178.7 1485.83 2197.82 1168 1485.83 2197.82 1178.7 1477.09 2197.82 1178.7 1477.09 2197.82 1168 1485.99 2196.77 1168 1485.99 2196.77 1178.7 1485.99 2197.71 1168 1485.99 2197.71 1178.7 1485.83 2197.71 1178.56 1477.26 2197.71 1178.56 1477.26 2196.77 1178.56 1485.83 2196.77 1178.56 1477.26 2197.71 1168.14 1477.26 2196.77 1168.14 1485.83 2197.71 1168.14 1485.83 2196.77 1168.14 1477.11 2198.07 1174.88 1477.11 2198.07 1168 1485.4 2198.07 1168 1485.4 2198.07 1174.88 1485.4 2198.3 1168 1485.4 2198.3 1174.88 1477.11 2198.3 1174.88 1477.11 2198.3 1168 1477.11 2200.44 1174.88 1477.11 2200.44 1168 1485.4 2200.44 1168 1485.4 2200.44 1174.88 1485.4 2200.68 1168 1485.4 2200.68 1174.88 1477.11 2200.68 1174.88 1477.11 2200.68 1168 1485.55 2198.3 1168 1485.55 2198.3 1174.88 1485.55 2200.44 1168 1485.55 2200.44 1174.88 1485.4 2200.44 1174.79 1477.27 2200.44 1174.79 1477.27 2198.3 1174.79 1485.4 2198.3 1174.79 1477.27 2200.44 1168.09 1477.27 2198.3 1168.09 1485.4 2200.44 1168.09 1485.4 2198.3 1168.09 1477.14 2200.93 1176.83 1477.14 2200.93 1168 1484.3 2200.93 1168 1484.3 2200.93 1176.83 1484.3 2201.18 1168 1484.3 2201.18 1176.83 1477.14 2201.18 1176.83 1477.14 2201.18 1168 1477.14 2203.38 1176.83 1477.14 2203.38 1168 1484.3 2203.38 1168 1484.3 2203.38 1176.83 1484.3 2203.63 1168 1484.3 2203.63 1176.83 1477.14 2203.63 1176.83 1477.14 2203.63 1168 1484.44 2201.18 1168 1484.44 2201.18 1176.83 1484.44 2203.38 1168 1484.44 2203.38 1176.83 1484.3 2203.38 1176.71 1477.28 2203.38 1176.71 1477.28 2201.18 1176.71 1484.3 2201.18 1176.71 1477.28 2203.38 1168.11 1477.28 2201.18 1168.11 1484.3 2203.38 1168.11 1484.3 2201.18 1168.11 1477.21 2203.88 1174.17 1477.21 2203.88 1168.01 1482.54 2203.88 1168.01 1482.54 2203.88 1174.17 1482.54 2204.24 1168.01 1482.54 2204.24 1174.17 1477.21 2204.24 1174.17 1477.21 2204.24 1168.01 1477.21 2207.5 1174.17 1477.21 2207.5 1168.01 1482.54 2207.5 1168.01 1482.54 2207.5 1174.17 1482.54 2207.86 1168.01 1482.54 2207.86 1174.17 1477.21 2207.86 1174.17 1477.21 2207.86 1168.01 1482.64 2204.24 1168.01 1482.64 2204.24 1174.17 1482.64 2207.5 1168.01 1482.64 2207.5 1174.17 1482.54 2207.5 1174.09 1477.31 2207.5 1174.09 1477.31 2204.24 1174.09 1482.54 2204.24 1174.09 1477.31 2207.5 1168.09 1477.31 2204.24 1168.09 1482.54 2207.5 1168.09 1482.54 2204.24 1168.09 1477.09 2208.1 1174.38 1477.09 2208.1 1168 1485.62 2208.1 1168 1485.62 2208.1 1174.38 1485.62 2208.3 1168 1485.62 2208.3 1174.38 1477.09 2208.3 1174.38 1477.09 2208.3 1168 1477.09 2210.08 1174.38 1477.09 2210.08 1168 1485.62 2210.08 1168 1485.62 2210.08 1174.38 1485.62 2210.28 1168 1485.62 2210.28 1174.38 1477.09 2210.28 1174.38 1477.09 2210.28 1168 1485.78 2208.3 1168 1485.78 2208.3 1174.38 1485.78 2210.08 1168 1485.78 2210.08 1174.38 1485.62 2210.08 1174.3 1477.26 2210.08 1174.3 1477.26 2208.3 1174.3 1485.62 2208.3 1174.3 1477.26 2210.08 1168.08 1477.26 2208.3 1168.08 1485.62 2210.08 1168.08 1485.62 2208.3 1168.08 1477.12 2210.53 1175.92 1477.12 2210.53 1168 1484.7 2210.53 1168 1484.7 2210.53 1175.92 1484.7 2210.58 1168 1484.7 2210.58 1175.92 1477.12 2210.58 1175.92 1477.12 2210.58 1168 1477.12 2211.02 1175.92 1477.12 2211.02 1168 1484.7 2211.02 1168 1484.7 2211.02 1175.92 1484.7 2211.07 1168 1484.7 2211.07 1175.92 1477.12 2211.07 1175.92 1477.12 2211.07 1168 1484.84 2210.58 1168 1484.84 2210.58 1175.92 1484.84 2211.02 1168 1484.84 2211.02 1175.92 1484.7 2211.02 1175.82 1477.27 2211.02 1175.82 1477.27 2210.58 1175.82 1484.7 2210.58 1175.82 1477.27 2211.02 1168.1 1477.27 2210.58 1168.1 1484.7 2211.02 1168.1 1484.7 2210.58 1168.1 1477.16 2211.32 1175.84 1477.16 2211.32 1168 1483.99 2211.32 1168 1483.99 2211.32 1175.84 1483.99 2211.49 1168 1483.99 2211.49 1175.84 1477.16 2211.49 1175.84 1477.16 2211.49 1168 1477.16 2213.02 1175.84 1477.16 2213.02 1168 1483.99 2213.02 1168 1483.99 2213.02 1175.84 1483.99 2213.19 1168 1483.99 2213.19 1175.84 1477.16 2213.19 1175.84 1477.16 2213.19 1168 1484.12 2211.49 1168 1484.12 2211.49 1175.84 1484.12 2213.02 1168 1484.12 2213.02 1175.84 1483.99 2213.02 1175.74 1477.29 2213.02 1175.74 1477.29 2211.49 1175.74 1483.99 2211.49 1175.74 1477.29 2213.02 1168.1 1477.29 2211.49 1168.1 1483.99 2213.02 1168.1 1483.99 2211.49 1168.1 1477.17 2213.42 1175.88 1477.17 2213.42 1168 1483.67 2213.42 1168 1483.67 2213.42 1175.88 1483.67 2213.52 1168 1483.67 2213.52 1175.88 1477.17 2213.52 1175.88 1477.17 2213.52 1168 1477.17 2214.38 1175.88 1477.17 2214.38 1168 1483.67 2214.38 1168 1483.67 2214.38 1175.88 1483.67 2214.48 1168 1483.67 2214.48 1175.88 1477.17 2214.48 1175.88 1477.17 2214.48 1168 1483.79 2213.52 1168 1483.79 2213.52 1175.88 1483.79 2214.38 1168 1483.79 2214.38 1175.88 1483.67 2214.38 1175.78 1477.3 2214.38 1175.78 1477.3 2213.52 1175.78 1483.67 2213.52 1175.78 1477.3 2214.38 1168.1 1477.3 2213.52 1168.1 1483.67 2214.38 1168.1 1483.67 2213.52 1168.1 1477.2 2214.73 1175.18 1477.2 2214.73 1168 1482.89 2214.73 1168 1482.89 2214.73 1175.18 1482.89 2214.95 1168 1482.89 2214.95 1175.18 1477.2 2214.95 1175.18 1477.2 2214.95 1168 1477.2 2216.91 1175.18 1477.2 2216.91 1168 1482.89 2216.91 1168 1482.89 2216.91 1175.18 1482.89 2217.13 1168 1482.89 2217.13 1175.18 1477.2 2217.13 1175.18 1477.2 2217.13 1168 1483 2214.95 1168 1483 2214.95 1175.18 1483 2216.91 1168 1483 2216.91 1175.18 1482.89 2216.91 1175.09 1477.31 2216.91 1175.09 1477.31 2214.95 1175.09 1482.89 2214.95 1175.09 1477.31 2216.91 1168.09 1477.31 2214.95 1168.09 1482.89 2216.91 1168.09 1482.89 2214.95 1168.09 1489.42 2223.97 1181 1477.42 2223.97 1181 1489.42 2223.97 1180 1489.42 2189.97 1181 1477.42 2223.97 1180 1477.42 2189.97 1181 1489.42 2189.97 1180 1477.42 2189.97 1180 1477.21 2189.97 1191.64 1477.21 2189.97 1181 1482.73 2189.97 1181 1482.73 2189.97 1191.64 1482.73 2190.17 1181 1482.73 2190.17 1191.64 1477.21 2190.17 1191.64 1477.21 2190.17 1181 1477.21 2191.93 1191.64 1477.21 2191.93 1181 1482.73 2191.93 1181 1482.73 2191.93 1191.64 1482.73 2192.13 1181 1482.73 2192.13 1191.64 1477.21 2192.13 1191.64 1477.21 2192.13 1181 1482.84 2190.17 1181 1482.84 2190.17 1191.64 1482.84 2191.93 1181 1482.84 2191.93 1191.64 1482.73 2191.93 1191.5 1477.31 2191.93 1191.5 1477.31 2190.17 1191.5 1482.73 2190.17 1191.5 1477.31 2191.93 1181.14 1477.31 2190.17 1181.14 1482.73 2191.93 1181.14 1482.73 2190.17 1181.14 1477.12 2192.38 1190.06 1477.12 2192.38 1181.01 1484.81 2192.38 1181.01 1484.81 2192.38 1190.06 1484.81 2192.63 1181.01 1484.81 2192.63 1190.06 1477.12 2192.63 1190.06 1477.12 2192.63 1181.01 1477.12 2194.87 1190.06 1477.12 2194.87 1181.01 1484.81 2194.87 1181.01 1484.81 2194.87 1190.06 1484.81 2195.12 1181.01 1484.81 2195.12 1190.06 1477.12 2195.12 1190.06 1477.12 2195.12 1181.01 1484.96 2192.63 1181.01 1484.96 2192.63 1190.06 1484.96 2194.87 1181.01 1484.96 2194.87 1190.06 1484.81 2194.87 1189.94 1477.27 2194.87 1189.94 1477.27 2192.63 1189.94 1484.81 2192.63 1189.94 1477.27 2194.87 1181.12 1477.27 2192.63 1181.12 1484.81 2194.87 1181.12 1484.81 2192.63 1181.12 1477.16 2195.38 1190.46 1477.16 2195.38 1181 1483.89 2195.38 1181 1483.89 2195.38 1190.46 1483.89 2195.72 1181 1483.89 2195.72 1190.46 1477.16 2195.72 1190.46 1477.16 2195.72 1181 1477.16 2198.76 1190.46 1477.16 2198.76 1181 1483.89 2198.76 1181 1483.89 2198.76 1190.46 1483.89 2199.1 1181 1483.89 2199.1 1190.46 1477.16 2199.1 1190.46 1477.16 2199.1 1181 1484.02 2195.72 1181 1484.02 2195.72 1190.46 1484.02 2198.76 1181 1484.02 2198.76 1190.46 1483.89 2198.76 1190.34 1477.29 2198.76 1190.34 1477.29 2195.72 1190.34 1483.89 2195.72 1190.34 1477.29 2198.76 1181.12 1477.29 2195.72 1181.12 1483.89 2198.76 1181.12 1483.89 2195.72 1181.12 1477.2 2199.35 1188.2 1477.2 2199.35 1181 1482.99 2199.35 1181 1482.99 2199.35 1188.2 1482.99 2199.45 1181 1482.99 2199.45 1188.2 1477.2 2199.45 1188.2 1477.2 2199.45 1181 1477.2 2200.31 1188.2 1477.2 2200.31 1181 1482.99 2200.31 1181 1482.99 2200.31 1188.2 1482.99 2200.41 1181 1482.99 2200.41 1188.2 1477.2 2200.41 1188.2 1477.2 2200.41 1181 1483.1 2199.45 1181 1483.1 2199.45 1188.2 1483.1 2200.31 1181 1483.1 2200.31 1188.2 1482.99 2200.31 1188.11 1477.31 2200.31 1188.11 1477.31 2199.45 1188.11 1482.99 2199.45 1188.11 1477.31 2200.31 1181.09 1477.31 2199.45 1181.09 1482.99 2200.31 1181.09 1482.99 2199.45 1181.09 1477.19 2200.66 1190.88 1477.19 2200.66 1181 1483.24 2200.66 1181 1483.24 2200.66 1190.88 1483.24 2200.98 1181 1483.24 2200.98 1190.88 1477.19 2200.98 1190.88 1477.19 2200.98 1181 1477.19 2203.8 1190.88 1477.19 2203.8 1181 1483.24 2203.8 1181 1483.24 2203.8 1190.88 1483.24 2204.12 1181 1483.24 2204.12 1190.88 1477.19 2204.12 1190.88 1477.19 2204.12 1181 1483.36 2200.98 1181 1483.36 2200.98 1190.88 1483.36 2203.8 1181 1483.36 2203.8 1190.88 1483.24 2203.8 1190.75 1477.3 2203.8 1190.75 1477.3 2200.98 1190.75 1483.24 2200.98 1190.75 1477.3 2203.8 1181.13 1477.3 2200.98 1181.13 1483.24 2203.8 1181.13 1483.24 2200.98 1181.13 1477.16 2204.36 1190.3 1477.16 2204.36 1181.01 1483.93 2204.36 1181.01 1483.93 2204.36 1190.3 1483.93 2204.49 1181.01 1483.93 2204.49 1190.3 1477.16 2204.49 1190.3 1477.16 2204.49 1181.01 1477.16 2205.63 1190.3 1477.16 2205.63 1181.01 1483.93 2205.63 1181.01 1483.93 2205.63 1190.3 1483.93 2205.76 1181.01 1483.93 2205.76 1190.3 1477.16 2205.76 1190.3 1477.16 2205.76 1181.01 1484.06 2204.49 1181.01 1484.06 2204.49 1190.3 1484.06 2205.63 1181.01 1484.06 2205.63 1190.3 1483.93 2205.63 1190.17 1477.29 2205.63 1190.17 1477.29 2204.49 1190.17 1483.93 2204.49 1190.17 1477.29 2205.63 1181.13 1477.29 2204.49 1181.13 1483.93 2205.63 1181.13 1483.93 2204.49 1181.13 1477.2 2206.01 1190.77 1477.2 2206.01 1181 1482.85 2206.01 1181 1482.85 2206.01 1190.77 1482.85 2206.24 1181 1482.85 2206.24 1190.77 1477.2 2206.24 1190.77 1477.2 2206.24 1181 1477.2 2208.34 1190.77 1477.2 2208.34 1181 1482.85 2208.34 1181 1482.85 2208.34 1190.77 1482.85 2208.58 1181 1482.85 2208.58 1190.77 1477.2 2208.58 1190.77 1477.2 2208.58 1181 1482.96 2206.24 1181 1482.96 2206.24 1190.77 1482.96 2208.34 1181 1482.96 2208.34 1190.77 1482.85 2208.34 1190.64 1477.31 2208.34 1190.64 1477.31 2206.24 1190.64 1482.85 2206.24 1190.64 1477.31 2208.34 1181.12 1477.31 2206.24 1181.12 1482.85 2208.34 1181.12 1482.85 2206.24 1181.12 1477.09 2208.82 1188.39 1477.09 2208.82 1181.01 1485.56 2208.82 1181.01 1485.56 2208.82 1188.39 1485.56 2208.98 1181.01 1485.56 2208.98 1188.39 1477.09 2208.98 1188.39 1477.09 2208.98 1181.01 1477.09 2210.4 1188.39 1477.09 2210.4 1181.01 1485.56 2210.4 1181.01 1485.56 2210.4 1188.39 1485.56 2210.56 1181.01 1485.56 2210.56 1188.39 1477.09 2210.56 1188.39 1477.09 2210.56 1181.01 1485.72 2208.98 1181.01 1485.72 2208.98 1188.39 1485.72 2210.4 1181.01 1485.72 2210.4 1188.39 1485.56 2210.4 1188.3 1477.25 2210.4 1188.3 1477.25 2208.98 1188.3 1485.56 2208.98 1188.3 1477.25 2210.4 1181.1 1477.25 2208.98 1181.1 1485.56 2210.4 1181.1 1485.56 2208.98 1181.1 1477.21 2210.8 1191.66 1477.21 2210.8 1181 1482.48 2210.8 1181 1482.48 2210.8 1191.66 1482.48 2210.98 1181 1482.48 2210.98 1191.66 1477.21 2210.98 1191.66 1477.21 2210.98 1181 1477.21 2212.54 1191.66 1477.21 2212.54 1181 1482.48 2212.54 1181 1482.48 2212.54 1191.66 1482.48 2212.72 1181 1482.48 2212.72 1191.66 1477.21 2212.72 1191.66 1477.21 2212.72 1181 1482.58 2210.98 1181 1482.58 2210.98 1191.66 1482.58 2212.54 1181 1482.58 2212.54 1191.66 1482.48 2212.54 1191.52 1477.31 2212.54 1191.52 1477.31 2210.98 1191.52 1482.48 2210.98 1191.52 1477.31 2212.54 1181.14 1477.31 2210.98 1181.14 1482.48 2212.54 1181.14 1482.48 2210.98 1181.14 1477.13 2212.96 1190.38 1477.13 2212.96 1181 1484.75 2212.96 1181 1484.75 2212.96 1190.38 1484.75 2213.23 1181 1484.75 2213.23 1190.38 1477.13 2213.23 1190.38 1477.13 2213.23 1181 1477.13 2215.65 1190.38 1477.13 2215.65 1181 1484.75 2215.65 1181 1484.75 2215.65 1190.38 1484.75 2215.92 1181 1484.75 2215.92 1190.38 1477.13 2215.92 1190.38 1477.13 2215.92 1181 1484.9 2213.23 1181 1484.9 2213.23 1190.38 1484.9 2215.65 1181 1484.9 2215.65 1190.38 1484.75 2215.65 1190.26 1477.27 2215.65 1190.26 1477.27 2213.23 1190.26 1484.75 2213.23 1190.26 1477.27 2215.65 1181.12 1477.27 2213.23 1181.12 1484.75 2215.65 1181.12 1484.75 2213.23 1181.12 1477.17 2216.16 1187.1 1477.17 2216.16 1181 1483.69 2216.16 1181 1483.69 2216.16 1187.1 1483.69 2216.25 1181 1483.69 2216.25 1187.1 1477.17 2216.25 1187.1 1477.17 2216.25 1181 1477.17 2216.99 1187.1 1477.17 2216.99 1181 1483.69 2216.99 1181 1483.69 2216.99 1187.1 1483.69 2217.08 1181 1483.69 2217.08 1187.1 1477.17 2217.08 1187.1 1477.17 2217.08 1181 1483.82 2216.25 1181 1483.82 2216.25 1187.1 1483.82 2216.99 1181 1483.82 2216.99 1187.1 1483.69 2216.99 1187.02 1477.29 2216.99 1187.02 1477.29 2216.25 1187.02 1483.69 2216.25 1187.02 1477.29 2216.99 1181.08 1477.29 2216.25 1181.08 1483.69 2216.99 1181.08 1483.69 2216.25 1181.08 1489.42 2223.97 1194 1477.42 2223.97 1194 1489.42 2223.97 1193 1489.42 2189.97 1194 1477.42 2223.97 1193 1477.42 2189.97 1194 1489.42 2189.97 1193 1477.42 2189.97 1193 1477.07 2189.97 1202.6 1477.07 2189.97 1194 1486.16 2189.97 1194 1486.16 2189.97 1202.6 1486.16 2190.06 1194 1486.16 2190.06 1202.6 1477.07 2190.06 1202.6 1477.07 2190.06 1194 1477.07 2190.86 1202.6 1477.07 2190.86 1194 1486.16 2190.86 1194 1486.16 2190.86 1202.6 1486.16 2190.95 1194 1486.16 2190.95 1202.6 1477.07 2190.95 1202.6 1477.07 2190.95 1194 1486.34 2190.06 1194 1486.34 2190.06 1202.6 1486.34 2190.86 1194 1486.34 2190.86 1202.6 1486.16 2190.86 1202.49 1477.24 2190.86 1202.49 1477.24 2190.06 1202.49 1486.16 2190.06 1202.49 1477.24 2190.86 1194.11 1477.24 2190.06 1194.11 1486.16 2190.86 1194.11 1486.16 2190.06 1194.11 1477.2 2191.2 1201.08 1477.2 2191.2 1194 1482.86 2191.2 1194 1482.86 2191.2 1201.08 1482.86 2191.53 1194 1482.86 2191.53 1201.08 1477.2 2191.53 1201.08 1477.2 2191.53 1194 1477.2 2194.47 1201.08 1477.2 2194.47 1194 1482.86 2194.47 1194 1482.86 2194.47 1201.08 1482.86 2194.8 1194 1482.86 2194.8 1201.08 1477.2 2194.8 1201.08 1477.2 2194.8 1194 1482.96 2191.53 1194 1482.96 2191.53 1201.08 1482.96 2194.47 1194 1482.96 2194.47 1201.08 1482.86 2194.47 1200.99 1477.31 2194.47 1200.99 1477.31 2191.53 1200.99 1482.86 2191.53 1200.99 1477.31 2194.47 1194.09 1477.31 2191.53 1194.09 1482.86 2194.47 1194.09 1482.86 2191.53 1194.09 1477.22 2195.04 1202.74 1477.22 2195.04 1194 1482.46 2195.04 1194 1482.46 2195.04 1202.74 1482.46 2195.23 1194 1482.46 2195.23 1202.74 1477.22 2195.23 1202.74 1477.22 2195.23 1194 1477.22 2196.91 1202.74 1477.22 2196.91 1194 1482.46 2196.91 1194 1482.46 2196.91 1202.74 1482.46 2197.1 1194 1482.46 2197.1 1202.74 1477.22 2197.1 1202.74 1477.22 2197.1 1194 1482.56 2195.23 1194 1482.56 2195.23 1202.74 1482.56 2196.91 1194 1482.56 2196.91 1202.74 1482.46 2196.91 1202.63 1477.32 2196.91 1202.63 1477.32 2195.23 1202.63 1482.46 2195.23 1202.63 1477.32 2196.91 1194.12 1477.32 2195.23 1194.12 1482.46 2196.91 1194.12 1482.46 2195.23 1194.12 1477.18 2197.34 1200.84 1477.18 2197.34 1194 1483.34 2197.34 1194 1483.34 2197.34 1200.84 1483.34 2197.67 1194 1483.34 2197.67 1200.84 1477.18 2197.67 1200.84 1477.18 2197.67 1194 1477.18 2200.69 1200.84 1477.18 2200.69 1194 1483.34 2200.69 1194 1483.34 2200.69 1200.84 1483.34 2201.02 1194 1483.34 2201.02 1200.84 1477.18 2201.02 1200.84 1477.18 2201.02 1194 1483.46 2197.67 1194 1483.46 2197.67 1200.84 1483.46 2200.69 1194 1483.46 2200.69 1200.84 1483.34 2200.69 1200.75 1477.3 2200.69 1200.75 1477.3 2197.67 1200.75 1483.34 2197.67 1200.75 1477.3 2200.69 1194.09 1477.3 2197.67 1194.09 1483.34 2200.69 1194.09 1483.34 2197.67 1194.09 1477.12 2201.27 1200.44 1477.12 2201.27 1194 1485.04 2201.27 1194 1485.04 2201.27 1200.44 1485.04 2201.41 1194 1485.04 2201.41 1200.44 1477.12 2201.41 1200.44 1477.12 2201.41 1194 1477.12 2202.65 1200.44 1477.12 2202.65 1194 1485.04 2202.65 1194 1485.04 2202.65 1200.44 1485.04 2202.79 1194 1485.04 2202.79 1200.44 1477.12 2202.79 1200.44 1477.12 2202.79 1194 1485.19 2201.41 1194 1485.19 2201.41 1200.44 1485.19 2202.65 1194 1485.19 2202.65 1200.44 1485.04 2202.65 1200.36 1477.27 2202.65 1200.36 1477.27 2201.41 1200.36 1485.04 2201.41 1200.36 1477.27 2202.65 1194.08 1477.27 2201.41 1194.08 1485.04 2202.65 1194.08 1485.04 2201.41 1194.08 1477.16 2203.03 1203.67 1477.16 2203.03 1194.01 1483.7 2203.03 1194.01 1483.7 2203.03 1203.67 1483.7 2203.29 1194.01 1483.7 2203.29 1203.67 1477.16 2203.29 1203.67 1477.16 2203.29 1194.01 1477.16 2205.57 1203.67 1477.16 2205.57 1194.01 1483.7 2205.57 1194.01 1483.7 2205.57 1203.67 1483.7 2205.83 1194.01 1483.7 2205.83 1203.67 1477.16 2205.83 1203.67 1477.16 2205.83 1194.01 1483.82 2203.29 1194.01 1483.82 2203.29 1203.67 1483.82 2205.57 1194.01 1483.82 2205.57 1203.67 1483.7 2205.57 1203.55 1477.29 2205.57 1203.55 1477.29 2203.29 1203.55 1483.7 2203.29 1203.55 1477.29 2205.57 1194.13 1477.29 2203.29 1194.13 1483.7 2205.57 1194.13 1483.7 2203.29 1194.13 1477.11 2206.07 1204.86 1477.11 2206.07 1194 1485.26 2206.07 1194 1485.26 2206.07 1204.86 1485.26 2206.3 1194 1485.26 2206.3 1204.86 1477.11 2206.3 1204.86 1477.11 2206.3 1194 1477.11 2208.32 1204.86 1477.11 2208.32 1194 1485.26 2208.32 1194 1485.26 2208.32 1204.86 1485.26 2208.55 1194 1485.26 2208.55 1204.86 1477.11 2208.55 1204.86 1477.11 2208.55 1194 1485.42 2206.3 1194 1485.42 2206.3 1204.86 1485.42 2208.32 1194 1485.42 2208.32 1204.86 1485.26 2208.32 1204.72 1477.26 2208.32 1204.72 1477.26 2206.3 1204.72 1485.26 2206.3 1204.72 1477.26 2208.32 1194.14 1477.26 2206.3 1194.14 1485.26 2208.32 1194.14 1485.26 2206.3 1194.14 1477.08 2208.8 1200.5 1477.08 2208.8 1194 1485.92 2208.8 1194 1485.92 2208.8 1200.5 1485.92 2209.09 1194 1485.92 2209.09 1200.5 1477.08 2209.09 1200.5 1477.08 2209.09 1194 1477.08 2211.73 1200.5 1477.08 2211.73 1194 1485.92 2211.73 1194 1485.92 2211.73 1200.5 1485.92 2212.03 1194 1485.92 2212.03 1200.5 1477.08 2212.03 1200.5 1477.08 2212.03 1194 1486.09 2209.09 1194 1486.09 2209.09 1200.5 1486.09 2211.73 1194 1486.09 2211.73 1200.5 1485.92 2211.73 1200.41 1477.25 2211.73 1200.41 1477.25 2209.09 1200.41 1485.92 2209.09 1200.41 1477.25 2211.73 1194.09 1477.25 2209.09 1194.09 1485.92 2211.73 1194.09 1485.92 2209.09 1194.09 1477.2 2212.27 1204.49 1477.2 2212.27 1194.01 1482.85 2212.27 1194.01 1482.85 2212.27 1204.49 1482.85 2212.4 1194.01 1482.85 2212.4 1204.49 1477.2 2212.4 1204.49 1477.2 2212.4 1194.01 1477.2 2213.52 1204.49 1477.2 2213.52 1194.01 1482.85 2213.52 1194.01 1482.85 2213.52 1204.49 1482.85 2213.65 1194.01 1482.85 2213.65 1204.49 1477.2 2213.65 1204.49 1477.2 2213.65 1194.01 1482.96 2212.4 1194.01 1482.96 2212.4 1204.49 1482.96 2213.52 1194.01 1482.96 2213.52 1204.49 1482.85 2213.52 1204.36 1477.31 2213.52 1204.36 1477.31 2212.4 1204.36 1482.85 2212.4 1204.36 1477.31 2213.52 1194.14 1477.31 2212.4 1194.14 1482.85 2213.52 1194.14 1482.85 2212.4 1194.14 1477.17 2213.91 1201.36 1477.17 2213.91 1194 1483.73 2213.91 1194 1483.73 2213.91 1201.36 1483.73 2214.25 1194 1483.73 2214.25 1201.36 1477.17 2214.25 1201.36 1477.17 2214.25 1194 1477.17 2217.27 1201.36 1477.17 2217.27 1194 1483.73 2217.27 1194 1483.73 2217.27 1201.36 1483.73 2217.61 1194 1483.73 2217.61 1201.36 1477.17 2217.61 1201.36 1477.17 2217.61 1194 1483.85 2214.25 1194 1483.85 2214.25 1201.36 1483.85 2217.27 1194 1483.85 2217.27 1201.36 1483.73 2217.27 1201.26 1477.3 2217.27 1201.26 1477.3 2214.25 1201.26 1483.73 2214.25 1201.26 1477.3 2217.27 1194.1 1477.3 2214.25 1194.1 1483.73 2217.27 1194.1 1483.73 2214.25 1194.1 1489.42 2223.97 1207 1477.42 2223.97 1207 1489.42 2223.97 1206 1489.42 2189.97 1207 1477.42 2223.97 1206 1477.42 2189.97 1207 1489.42 2189.97 1206 1477.42 2189.97 1206 1477.08 2189.97 1214.96 1477.08 2189.97 1207 1485.84 2189.97 1207 1485.84 2189.97 1214.96 1485.84 2190.33 1207 1485.84 2190.33 1214.96 1477.08 2190.33 1214.96 1477.08 2190.33 1207 1477.08 2193.57 1214.96 1477.08 2193.57 1207 1485.84 2193.57 1207 1485.84 2193.57 1214.96 1485.84 2193.93 1207 1485.84 2193.93 1214.96 1477.08 2193.93 1214.96 1477.08 2193.93 1207 1486 2190.33 1207 1486 2190.33 1214.96 1486 2193.57 1207 1486 2193.57 1214.96 1485.84 2193.57 1214.86 1477.25 2193.57 1214.86 1477.25 2190.33 1214.86 1485.84 2190.33 1214.86 1477.25 2193.57 1207.1 1477.25 2190.33 1207.1 1485.84 2193.57 1207.1 1485.84 2190.33 1207.1 1477.16 2194.18 1213.79 1477.16 2194.18 1207 1483.94 2194.18 1207 1483.94 2194.18 1213.79 1483.94 2194.26 1207 1483.94 2194.26 1213.79 1477.16 2194.26 1213.79 1477.16 2194.26 1207 1477.16 2195.02 1213.79 1477.16 2195.02 1207 1483.94 2195.02 1207 1483.94 2195.02 1213.79 1483.94 2195.1 1207 1483.94 2195.1 1213.79 1477.16 2195.1 1213.79 1477.16 2195.1 1207 1484.07 2194.26 1207 1484.07 2194.26 1213.79 1484.07 2195.02 1207 1484.07 2195.02 1213.79 1483.94 2195.02 1213.7 1477.29 2195.02 1213.7 1477.29 2194.26 1213.7 1483.94 2194.26 1213.7 1477.29 2195.02 1207.08 1477.29 2194.26 1207.08 1483.94 2195.02 1207.08 1483.94 2194.26 1207.08 1477.12 2195.35 1213.53 1477.12 2195.35 1207 1484.91 2195.35 1207 1484.91 2195.35 1213.53 1484.91 2195.4 1207 1484.91 2195.4 1213.53 1477.12 2195.4 1213.53 1477.12 2195.4 1207 1477.12 2195.82 1213.53 1477.12 2195.82 1207 1484.91 2195.82 1207 1484.91 2195.82 1213.53 1484.91 2195.87 1207 1484.91 2195.87 1213.53 1477.12 2195.87 1213.53 1477.12 2195.87 1207 1485.06 2195.4 1207 1485.06 2195.4 1213.53 1485.06 2195.82 1207 1485.06 2195.82 1213.53 1484.91 2195.82 1213.44 1477.27 2195.82 1213.44 1477.27 2195.4 1213.44 1484.91 2195.4 1213.44 1477.27 2195.82 1207.08 1477.27 2195.4 1207.08 1484.91 2195.82 1207.08 1484.91 2195.4 1207.08 1477.1 2196.12 1213.06 1477.1 2196.12 1207 1485.57 2196.12 1207 1485.57 2196.12 1213.06 1485.57 2196.26 1207 1485.57 2196.26 1213.06 1477.1 2196.26 1213.06 1477.1 2196.26 1207 1477.1 2197.43 1213.06 1477.1 2197.43 1207 1485.57 2197.43 1207 1485.57 2197.43 1213.06 1485.57 2197.56 1207 1485.57 2197.56 1213.06 1477.1 2197.56 1213.06 1477.1 2197.56 1207 1485.73 2196.26 1207 1485.73 2196.26 1213.06 1485.73 2197.43 1207 1485.73 2197.43 1213.06 1485.57 2197.43 1212.98 1477.26 2197.43 1212.98 1477.26 2196.26 1212.98 1485.57 2196.26 1212.98 1477.26 2197.43 1207.08 1477.26 2196.26 1207.08 1485.57 2197.43 1207.08 1485.57 2196.26 1207.08 1477.21 2197.81 1215.89 1477.21 2197.81 1207.01 1482.44 2197.81 1207.01 1482.44 2197.81 1215.89 1482.44 2197.94 1207.01 1482.44 2197.94 1215.89 1477.21 2197.94 1215.89 1477.21 2197.94 1207.01 1477.21 2199.06 1215.89 1477.21 2199.06 1207.01 1482.44 2199.06 1207.01 1482.44 2199.06 1215.89 1482.44 2199.19 1207.01 1482.44 2199.19 1215.89 1477.21 2199.19 1215.89 1477.21 2199.19 1207.01 1482.54 2197.94 1207.01 1482.54 2197.94 1215.89 1482.54 2199.06 1207.01 1482.54 2199.06 1215.89 1482.44 2199.06 1215.78 1477.31 2199.06 1215.78 1477.31 2197.94 1215.78 1482.44 2197.94 1215.78 1477.31 2199.06 1207.12 1477.31 2197.94 1207.12 1482.44 2199.06 1207.12 1482.44 2197.94 1207.12 1477.18 2199.44 1217.76 1477.18 2199.44 1207.01 1483.21 2199.44 1207.01 1483.21 2199.44 1217.76 1483.21 2199.8 1207.01 1483.21 2199.8 1217.76 1477.18 2199.8 1217.76 1477.18 2199.8 1207.01 1477.18 2203 1217.76 1477.18 2203 1207.01 1483.21 2203 1207.01 1483.21 2203 1217.76 1483.21 2203.36 1207.01 1483.21 2203.36 1217.76 1477.18 2203.36 1217.76 1477.18 2203.36 1207.01 1483.32 2199.8 1207.01 1483.32 2199.8 1217.76 1483.32 2203 1207.01 1483.32 2203 1217.76 1483.21 2203 1217.61 1477.3 2203 1217.61 1477.3 2199.8 1217.61 1483.21 2199.8 1217.61 1477.3 2203 1207.15 1477.3 2199.8 1207.15 1483.21 2203 1207.15 1483.21 2199.8 1207.15 1477.19 2203.6 1214.8 1477.19 2203.6 1207 1483.15 2203.6 1207 1483.15 2203.6 1214.8 1483.15 2203.74 1207 1483.15 2203.74 1214.8 1477.19 2203.74 1214.8 1477.19 2203.74 1207 1477.19 2205 1214.8 1477.19 2205 1207 1483.15 2205 1207 1483.15 2205 1214.8 1483.15 2205.14 1207 1483.15 2205.14 1214.8 1477.19 2205.14 1214.8 1477.19 2205.14 1207 1483.26 2203.74 1207 1483.26 2203.74 1214.8 1483.26 2205 1207 1483.26 2205 1214.8 1483.15 2205 1214.7 1477.3 2205 1214.7 1477.3 2203.74 1214.7 1483.15 2203.74 1214.7 1477.3 2205 1207.1 1477.3 2203.74 1207.1 1483.15 2205 1207.1 1483.15 2203.74 1207.1 1477.07 2205.39 1215.85 1477.07 2205.39 1207 1486.05 2205.39 1207 1486.05 2205.39 1215.85 1486.05 2205.75 1207 1486.05 2205.75 1215.85 1477.07 2205.75 1215.85 1477.07 2205.75 1207 1477.07 2208.91 1215.85 1477.07 2208.91 1207 1486.05 2208.91 1207 1486.05 2208.91 1215.85 1486.05 2209.27 1207 1486.05 2209.27 1215.85 1477.07 2209.27 1215.85 1477.07 2209.27 1207 1486.22 2205.75 1207 1486.22 2205.75 1215.85 1486.22 2208.91 1207 1486.22 2208.91 1215.85 1486.05 2208.91 1215.73 1477.25 2208.91 1215.73 1477.25 2205.75 1215.73 1486.05 2205.75 1215.73 1477.25 2208.91 1207.11 1477.25 2205.75 1207.11 1486.05 2208.91 1207.11 1486.05 2205.75 1207.11 1477.14 2209.51 1217.24 1477.14 2209.51 1207 1484.57 2209.51 1207 1484.57 2209.51 1217.24 1484.57 2209.7 1207 1484.57 2209.7 1217.24 1477.14 2209.7 1217.24 1477.14 2209.7 1207 1477.14 2211.4 1217.24 1477.14 2211.4 1207 1484.57 2211.4 1207 1484.57 2211.4 1217.24 1484.57 2211.59 1207 1484.57 2211.59 1217.24 1477.14 2211.59 1217.24 1477.14 2211.59 1207 1484.71 2209.7 1207 1484.71 2209.7 1217.24 1484.71 2211.4 1207 1484.71 2211.4 1217.24 1484.57 2211.4 1217.11 1477.28 2211.4 1217.11 1477.28 2209.7 1217.11 1484.57 2209.7 1217.11 1477.28 2211.4 1207.13 1477.28 2209.7 1207.13 1484.57 2211.4 1207.13 1484.57 2209.7 1207.13 1477.14 2211.84 1217.92 1477.14 2211.84 1207 1484.4 2211.84 1207 1484.4 2211.84 1217.92 1484.4 2212.06 1207 1484.4 2212.06 1217.92 1477.14 2212.06 1217.92 1477.14 2212.06 1207 1477.14 2213.96 1217.92 1477.14 2213.96 1207 1484.4 2213.96 1207 1484.4 2213.96 1217.92 1484.4 2214.18 1207 1484.4 2214.18 1217.92 1477.14 2214.18 1217.92 1477.14 2214.18 1207 1484.54 2212.06 1207 1484.54 2212.06 1217.92 1484.54 2213.96 1207 1484.54 2213.96 1217.92 1484.4 2213.96 1217.78 1477.28 2213.96 1217.78 1477.28 2212.06 1217.78 1484.4 2212.06 1217.78 1477.28 2213.96 1207.14 1477.28 2212.06 1207.14 1484.4 2213.96 1207.14 1484.4 2212.06 1207.14 1477.14 2214.42 1213.94 1477.14 2214.42 1207 1484.35 2214.42 1207 1484.35 2214.42 1213.94 1484.35 2214.55 1207 1484.35 2214.55 1213.94 1477.14 2214.55 1213.94 1477.14 2214.55 1207 1477.14 2215.67 1213.94 1477.14 2215.67 1207 1484.35 2215.67 1207 1484.35 2215.67 1213.94 1484.35 2215.8 1207 1484.35 2215.8 1213.94 1477.14 2215.8 1213.94 1477.14 2215.8 1207 1484.48 2214.55 1207 1484.48 2214.55 1213.94 1484.48 2215.67 1207 1484.48 2215.67 1213.94 1484.35 2215.67 1213.85 1477.28 2215.67 1213.85 1477.28 2214.55 1213.85 1484.35 2214.55 1213.85 1477.28 2215.67 1207.09 1477.28 2214.55 1207.09 1484.35 2215.67 1207.09 1484.35 2214.55 1207.09 1477.2 2216.05 1214.72 1477.2 2216.05 1207 1483.04 2216.05 1207 1483.04 2216.05 1214.72 1483.04 2216.29 1207 1483.04 2216.29 1214.72 1477.2 2216.29 1214.72 1477.2 2216.29 1207 1477.2 2218.47 1214.72 1477.2 2218.47 1207 1483.04 2218.47 1207 1483.04 2218.47 1214.72 1483.04 2218.71 1207 1483.04 2218.71 1214.72 1477.2 2218.71 1214.72 1477.2 2218.71 1207 1483.15 2216.29 1207 1483.15 2216.29 1214.72 1483.15 2218.47 1207 1483.15 2218.47 1214.72 1483.04 2218.47 1214.62 1477.31 2218.47 1214.62 1477.31 2216.29 1214.62 1483.04 2216.29 1214.62 1477.31 2218.47 1207.1 1477.31 2216.29 1207.1 1483.04 2218.47 1207.1 1483.04 2216.29 1207.1 1489.42 2223.97 1220 1477.42 2223.97 1220 1489.42 2223.97 1219 1489.42 2189.97 1220 1477.42 2223.97 1219 1477.42 2189.97 1220 1489.42 2189.97 1219 1477.42 2189.97 1219 1477.2 2189.97 1227.08 1477.2 2189.97 1220 1482.95 2189.97 1220 1482.95 2189.97 1227.08 1482.95 2190.07 1220 1482.95 2190.07 1227.08 1477.2 2190.07 1227.08 1477.2 2190.07 1220 1477.2 2191.01 1227.08 1477.2 2191.01 1220 1482.95 2191.01 1220 1482.95 2191.01 1227.08 1482.95 2191.12 1220 1482.95 2191.12 1227.08 1477.2 2191.12 1227.08 1477.2 2191.12 1220 1483.06 2190.07 1220 1483.06 2190.07 1227.08 1483.06 2191.01 1220 1483.06 2191.01 1227.08 1482.95 2191.01 1226.99 1477.31 2191.01 1226.99 1477.31 2190.07 1226.99 1482.95 2190.07 1226.99 1477.31 2191.01 1220.09 1477.31 2190.07 1220.09 1482.95 2191.01 1220.09 1482.95 2190.07 1220.09 1477.08 2191.37 1227.93 1477.08 2191.37 1220.01 1485.84 2191.37 1220.01 1485.84 2191.37 1227.93 1485.84 2191.61 1220.01 1485.84 2191.61 1227.93 1477.08 2191.61 1227.93 1477.08 2191.61 1220.01 1477.08 2193.73 1227.93 1477.08 2193.73 1220.01 1485.84 2193.73 1220.01 1485.84 2193.73 1227.93 1485.84 2193.97 1220.01 1485.84 2193.97 1227.93 1477.08 2193.97 1227.93 1477.08 2193.97 1220.01 1486 2191.61 1220.01 1486 2191.61 1227.93 1486 2193.73 1220.01 1486 2193.73 1227.93 1485.84 2193.73 1227.83 1477.25 2193.73 1227.83 1477.25 2191.61 1227.83 1485.84 2191.61 1227.83 1477.25 2193.73 1220.11 1477.25 2191.61 1220.11 1485.84 2193.73 1220.11 1485.84 2191.61 1220.11 1477.08 2194.21 1226.54 1477.08 2194.21 1220 1486.16 2194.21 1220 1486.16 2194.21 1226.54 1486.16 2194.27 1220 1486.16 2194.27 1226.54 1477.08 2194.27 1226.54 1477.08 2194.27 1220 1477.08 2194.72 1226.54 1477.08 2194.72 1220 1486.16 2194.72 1220 1486.16 2194.72 1226.54 1486.16 2194.77 1220 1486.16 2194.77 1226.54 1477.08 2194.77 1226.54 1477.08 2194.77 1220 1486.33 2194.27 1220 1486.33 2194.27 1226.54 1486.33 2194.72 1220 1486.33 2194.72 1226.54 1486.16 2194.72 1226.45 1477.25 2194.72 1226.45 1477.25 2194.27 1226.45 1486.16 2194.27 1226.45 1477.25 2194.72 1220.09 1477.25 2194.27 1220.09 1486.16 2194.72 1220.09 1486.16 2194.27 1220.09 1477.09 2195.01 1230.64 1477.09 2195.01 1220 1485.58 2195.01 1220 1485.58 2195.01 1230.64 1485.58 2195.18 1220 1485.58 2195.18 1230.64 1477.09 2195.18 1230.64 1477.09 2195.18 1220 1477.09 2196.68 1230.64 1477.09 2196.68 1220 1485.58 2196.68 1220 1485.58 2196.68 1230.64 1485.58 2196.85 1220 1485.58 2196.85 1230.64 1477.09 2196.85 1230.64 1477.09 2196.85 1220 1485.74 2195.18 1220 1485.74 2195.18 1230.64 1485.74 2196.68 1220 1485.74 2196.68 1230.64 1485.58 2196.68 1230.5 1477.25 2196.68 1230.5 1477.25 2195.18 1230.5 1485.58 2195.18 1230.5 1477.25 2196.68 1220.14 1477.25 2195.18 1220.14 1485.58 2196.68 1220.14 1485.58 2195.18 1220.14 1477.2 2197.1 1228.02 1477.2 2197.1 1220 1482.95 2197.1 1220 1482.95 2197.1 1228.02 1482.95 2197.35 1220 1482.95 2197.35 1228.02 1477.2 2197.35 1228.02 1477.2 2197.35 1220 1477.2 2199.59 1228.02 1477.2 2199.59 1220 1482.95 2199.59 1220 1482.95 2199.59 1228.02 1482.95 2199.84 1220 1482.95 2199.84 1228.02 1477.2 2199.84 1228.02 1477.2 2199.84 1220 1483.06 2197.35 1220 1483.06 2197.35 1228.02 1483.06 2199.59 1220 1483.06 2199.59 1228.02 1482.95 2199.59 1227.91 1477.31 2199.59 1227.91 1477.31 2197.35 1227.91 1482.95 2197.35 1227.91 1477.31 2199.59 1220.11 1477.31 2197.35 1220.11 1482.95 2199.59 1220.11 1482.95 2197.35 1220.11 1477.21 2200.08 1229.45 1477.21 2200.08 1220.01 1482.44 2200.08 1220.01 1482.44 2200.08 1229.45 1482.44 2200.37 1220.01 1482.44 2200.37 1229.45 1477.21 2200.37 1229.45 1477.21 2200.37 1220.01 1477.21 2203.03 1229.45 1477.21 2203.03 1220.01 1482.44 2203.03 1220.01 1482.44 2203.03 1229.45 1482.44 2203.32 1220.01 1482.44 2203.32 1229.45 1477.21 2203.32 1229.45 1477.21 2203.32 1220.01 1482.54 2200.37 1220.01 1482.54 2200.37 1229.45 1482.54 2203.03 1220.01 1482.54 2203.03 1229.45 1482.44 2203.03 1229.33 1477.31 2203.03 1229.33 1477.31 2200.37 1229.33 1482.44 2200.37 1229.33 1477.31 2203.03 1220.13 1477.31 2200.37 1220.13 1482.44 2203.03 1220.13 1482.44 2200.37 1220.13 1477.16 2203.57 1228.74 1477.16 2203.57 1220 1483.94 2203.57 1220 1483.94 2203.57 1228.74 1483.94 2203.77 1220 1483.94 2203.77 1228.74 1477.16 2203.77 1228.74 1477.16 2203.77 1220 1477.16 2205.55 1228.74 1477.16 2205.55 1220 1483.94 2205.55 1220 1483.94 2205.55 1228.74 1483.94 2205.75 1220 1483.94 2205.75 1228.74 1477.16 2205.75 1228.74 1477.16 2205.75 1220 1484.07 2203.77 1220 1484.07 2203.77 1228.74 1484.07 2205.55 1220 1484.07 2205.55 1228.74 1483.94 2205.55 1228.63 1477.29 2205.55 1228.63 1477.29 2203.77 1228.63 1483.94 2203.77 1228.63 1477.29 2205.55 1220.12 1477.29 2203.77 1220.12 1483.94 2205.55 1220.12 1483.94 2203.77 1220.12 1477.18 2206.01 1228.98 1477.18 2206.01 1220 1483.36 2206.01 1220 1483.36 2206.01 1228.98 1483.36 2206.08 1220 1483.36 2206.08 1228.98 1477.18 2206.08 1228.98 1477.18 2206.08 1220 1477.18 2206.72 1228.98 1477.18 2206.72 1220 1483.36 2206.72 1220 1483.36 2206.72 1228.98 1483.36 2206.79 1220 1483.36 2206.79 1228.98 1477.18 2206.79 1228.98 1477.18 2206.79 1220 1483.48 2206.08 1220 1483.48 2206.08 1228.98 1483.48 2206.72 1220 1483.48 2206.72 1228.98 1483.36 2206.72 1228.86 1477.3 2206.72 1228.86 1477.3 2206.08 1228.86 1483.36 2206.08 1228.86 1477.3 2206.72 1220.12 1477.3 2206.08 1220.12 1483.36 2206.72 1220.12 1483.36 2206.08 1220.12 1477.16 2207.03 1228.12 1477.16 2207.03 1220 1483.95 2207.03 1220 1483.95 2207.03 1228.12 1483.95 2207.34 1220 1483.95 2207.34 1228.12 1477.16 2207.34 1228.12 1477.16 2207.34 1220 1477.16 2210.08 1228.12 1477.16 2210.08 1220 1483.95 2210.08 1220 1483.95 2210.08 1228.12 1483.95 2210.39 1220 1483.95 2210.39 1228.12 1477.16 2210.39 1228.12 1477.16 2210.39 1220 1484.08 2207.34 1220 1484.08 2207.34 1228.12 1484.08 2210.08 1220 1484.08 2210.08 1228.12 1483.95 2210.08 1228.02 1477.29 2210.08 1228.02 1477.29 2207.34 1228.02 1483.95 2207.34 1228.02 1477.29 2210.08 1220.1 1477.29 2207.34 1220.1 1483.95 2210.08 1220.1 1483.95 2207.34 1220.1 1477.07 2210.64 1227.56 1477.07 2210.64 1220 1486.22 2210.64 1220 1486.22 2210.64 1227.56 1486.22 2211 1220 1486.22 2211 1227.56 1477.07 2211 1227.56 1477.07 2211 1220 1477.07 2214.2 1227.56 1477.07 2214.2 1220 1486.22 2214.2 1220 1486.22 2214.2 1227.56 1486.22 2214.56 1220 1486.22 2214.56 1227.56 1477.07 2214.56 1227.56 1477.07 2214.56 1220 1486.39 2211 1220 1486.39 2211 1227.56 1486.39 2214.2 1220 1486.39 2214.2 1227.56 1486.22 2214.2 1227.46 1477.25 2214.2 1227.46 1477.25 2211 1227.46 1486.22 2211 1227.46 1477.25 2214.2 1220.1 1477.25 2211 1220.1 1486.22 2214.2 1220.1 1486.22 2211 1220.1 1477.08 2214.82 1230.86 1477.08 2214.82 1220 1486.01 2214.82 1220 1486.01 2214.82 1230.86 1486.01 2215.04 1220 1486.01 2215.04 1230.86 1477.08 2215.04 1230.86 1477.08 2215.04 1220 1477.08 2217.06 1230.86 1477.08 2217.06 1220 1486.01 2217.06 1220 1486.01 2217.06 1230.86 1486.01 2217.28 1220 1486.01 2217.28 1230.86 1477.08 2217.28 1230.86 1477.08 2217.28 1220 1486.18 2215.04 1220 1486.18 2215.04 1230.86 1486.18 2217.06 1220 1486.18 2217.06 1230.86 1486.01 2217.06 1230.72 1477.25 2217.06 1230.72 1477.25 2215.04 1230.72 1486.01 2215.04 1230.72 1477.25 2217.06 1220.14 1477.25 2215.04 1220.14 1486.01 2217.06 1220.14 1486.01 2215.04 1220.14 1489.42 2223.97 1233 1477.42 2223.97 1233 1489.42 2223.97 1232 1489.42 2189.97 1233 1477.42 2223.97 1232 1477.42 2189.97 1233 1489.42 2189.97 1232 1477.42 2189.97 1232 1477.11 2189.96 1242.86 1477.11 2189.96 1233.01 1485.22 2189.96 1233.01 1485.22 2189.96 1242.86 1485.22 2190.04 1233.01 1485.22 2190.04 1242.86 1477.11 2190.04 1242.86 1477.11 2190.04 1233.01 1477.11 2190.74 1242.86 1477.11 2190.74 1233.01 1485.22 2190.74 1233.01 1485.22 2190.74 1242.86 1485.22 2190.82 1233.01 1485.22 2190.82 1242.86 1477.11 2190.82 1242.86 1477.11 2190.82 1233.01 1485.37 2190.04 1233.01 1485.37 2190.04 1242.86 1485.37 2190.74 1233.01 1485.37 2190.74 1242.86 1485.22 2190.74 1242.73 1477.27 2190.74 1242.73 1477.27 2190.04 1242.73 1485.22 2190.04 1242.73 1477.27 2190.74 1233.13 1477.27 2190.04 1233.13 1485.22 2190.74 1233.13 1485.22 2190.04 1233.13 1477.16 2191.07 1243.5 1477.16 2191.07 1233 1484.12 2191.07 1233 1484.12 2191.07 1243.5 1484.12 2191.33 1233 1484.12 2191.33 1243.5 1477.16 2191.33 1243.5 1477.16 2191.33 1233 1477.16 2193.67 1243.5 1477.16 2193.67 1233 1484.12 2193.67 1233 1484.12 2193.67 1243.5 1484.12 2193.94 1233 1484.12 2193.94 1243.5 1477.16 2193.94 1243.5 1477.16 2193.94 1233 1484.25 2191.33 1233 1484.25 2191.33 1243.5 1484.25 2193.67 1233 1484.25 2193.67 1243.5 1484.12 2193.67 1243.36 1477.29 2193.67 1243.36 1477.29 2191.33 1243.36 1484.12 2191.33 1243.36 1477.29 2193.67 1233.14 1477.29 2191.33 1233.14 1484.12 2193.67 1233.14 1484.12 2191.33 1233.14 1477.21 2194.18 1241.45 1477.21 2194.18 1233.01 1482.5 2194.18 1233.01 1482.5 2194.18 1241.45 1482.5 2194.41 1233.01 1482.5 2194.41 1241.45 1477.21 2194.41 1241.45 1477.21 2194.41 1233.01 1477.21 2196.43 1241.45 1477.21 2196.43 1233.01 1482.5 2196.43 1233.01 1482.5 2196.43 1241.45 1482.5 2196.66 1233.01 1482.5 2196.66 1241.45 1477.21 2196.66 1241.45 1477.21 2196.66 1233.01 1482.6 2194.41 1233.01 1482.6 2194.41 1241.45 1482.6 2196.43 1233.01 1482.6 2196.43 1241.45 1482.5 2196.43 1241.34 1477.31 2196.43 1241.34 1477.31 2194.41 1241.34 1482.5 2194.41 1241.34 1477.31 2196.43 1233.12 1477.31 2194.41 1233.12 1482.5 2196.43 1233.12 1482.5 2194.41 1233.12 1477.14 2196.91 1241.3 1477.14 2196.91 1233 1484.47 2196.91 1233 1484.47 2196.91 1241.3 1484.47 2197.1 1233 1484.47 2197.1 1241.3 1477.14 2197.1 1241.3 1477.14 2197.1 1233 1477.14 2198.86 1241.3 1477.14 2198.86 1233 1484.47 2198.86 1233 1484.47 2198.86 1241.3 1484.47 2199.05 1233 1484.47 2199.05 1241.3 1477.14 2199.05 1241.3 1477.14 2199.05 1233 1484.61 2197.1 1233 1484.61 2197.1 1241.3 1484.61 2198.86 1233 1484.61 2198.86 1241.3 1484.47 2198.86 1241.19 1477.28 2198.86 1241.19 1477.28 2197.1 1241.19 1484.47 2197.1 1241.19 1477.28 2198.86 1233.11 1477.28 2197.1 1233.11 1484.47 2198.86 1233.11 1484.47 2197.1 1233.11 1477.11 2199.31 1243.07 1477.11 2199.31 1233 1485.26 2199.31 1233 1485.26 2199.31 1243.07 1485.26 2199.65 1233 1485.26 2199.65 1243.07 1477.11 2199.65 1243.07 1477.11 2199.65 1233 1477.11 2202.73 1243.07 1477.11 2202.73 1233 1485.26 2202.73 1233 1485.26 2202.73 1243.07 1485.26 2203.07 1233 1485.26 2203.07 1243.07 1477.11 2203.07 1243.07 1477.11 2203.07 1233 1485.41 2199.65 1233 1485.41 2199.65 1243.07 1485.41 2202.73 1233 1485.41 2202.73 1243.07 1485.26 2202.73 1242.93 1477.27 2202.73 1242.93 1477.27 2199.65 1242.93 1485.26 2199.65 1242.93 1477.27 2202.73 1233.13 1477.27 2199.65 1233.13 1485.26 2202.73 1233.13 1485.26 2199.65 1233.13 1477.09 2203.32 1239.82 1477.09 2203.32 1233 1485.64 2203.32 1233 1485.64 2203.32 1239.82 1485.64 2203.64 1233 1485.64 2203.64 1239.82 1477.09 2203.64 1239.82 1477.09 2203.64 1233 1477.09 2206.54 1239.82 1477.09 2206.54 1233 1485.64 2206.54 1233 1485.64 2206.54 1239.82 1485.64 2206.86 1233 1485.64 2206.86 1239.82 1477.09 2206.86 1239.82 1477.09 2206.86 1233 1485.8 2203.64 1233 1485.8 2203.64 1239.82 1485.8 2206.54 1233 1485.8 2206.54 1239.82 1485.64 2206.54 1239.73 1477.25 2206.54 1239.73 1477.25 2203.64 1239.73 1485.64 2203.64 1239.73 1477.25 2206.54 1233.09 1477.25 2203.64 1233.09 1485.64 2206.54 1233.09 1485.64 2203.64 1233.09 1477.12 2207.11 1243.2 1477.12 2207.11 1233 1484.72 2207.11 1233 1484.72 2207.11 1243.2 1484.72 2207.17 1233 1484.72 2207.17 1243.2 1477.12 2207.17 1243.2 1477.12 2207.17 1233 1477.12 2207.73 1243.2 1477.12 2207.73 1233 1484.72 2207.73 1233 1484.72 2207.73 1243.2 1484.72 2207.79 1233 1484.72 2207.79 1243.2 1477.12 2207.79 1243.2 1477.12 2207.79 1233 1484.86 2207.17 1233 1484.86 2207.17 1243.2 1484.86 2207.73 1233 1484.86 2207.73 1243.2 1484.72 2207.73 1243.07 1477.27 2207.73 1243.07 1477.27 2207.17 1243.07 1484.72 2207.17 1243.07 1477.27 2207.73 1233.13 1477.27 2207.17 1233.13 1484.72 2207.73 1233.13 1484.72 2207.17 1233.13 1477.07 2208.04 1241.76 1477.07 2208.04 1233 1486.22 2208.04 1233 1486.22 2208.04 1241.76 1486.22 2208.37 1233 1486.22 2208.37 1241.76 1477.07 2208.37 1241.76 1477.07 2208.37 1233 1477.07 2211.35 1241.76 1477.07 2211.35 1233 1486.22 2211.35 1233 1486.22 2211.35 1241.76 1486.22 2211.68 1233 1486.22 2211.68 1241.76 1477.07 2211.68 1241.76 1477.07 2211.68 1233 1486.4 2208.37 1233 1486.4 2208.37 1241.76 1486.4 2211.35 1233 1486.4 2211.35 1241.76 1486.22 2211.35 1241.64 1477.24 2211.35 1241.64 1477.24 2208.37 1241.64 1486.22 2208.37 1241.64 1477.24 2211.35 1233.12 1477.24 2208.37 1233.12 1486.22 2211.35 1233.12 1486.22 2208.37 1233.12 1477.16 2211.93 1242.67 1477.16 2211.93 1233.01 1483.85 2211.93 1233.01 1483.85 2211.93 1242.67 1483.85 2212.21 1233.01 1483.85 2212.21 1242.67 1477.16 2212.21 1242.67 1477.16 2212.21 1233.01 1477.16 2214.65 1242.67 1477.16 2214.65 1233.01 1483.85 2214.65 1233.01 1483.85 2214.65 1242.67 1483.85 2214.93 1233.01 1483.85 2214.93 1242.67 1477.16 2214.93 1242.67 1477.16 2214.93 1233.01 1483.98 2212.21 1233.01 1483.98 2212.21 1242.67 1483.98 2214.65 1233.01 1483.98 2214.65 1242.67 1483.85 2214.65 1242.55 1477.29 2214.65 1242.55 1477.29 2212.21 1242.55 1483.85 2212.21 1242.55 1477.29 2214.65 1233.13 1477.29 2212.21 1233.13 1483.85 2214.65 1233.13 1483.85 2212.21 1233.13 1477.21 2215.17 1243.24 1477.21 2215.17 1233 1482.58 2215.17 1233 1482.58 2215.17 1243.24 1482.58 2215.37 1233 1482.58 2215.37 1243.24 1477.21 2215.37 1243.24 1477.21 2215.37 1233 1477.21 2217.08 1243.24 1477.21 2217.08 1233 1482.58 2217.08 1233 1482.58 2217.08 1243.24 1482.58 2217.27 1233 1482.58 2217.27 1243.24 1477.21 2217.27 1243.24 1477.21 2217.27 1233 1482.68 2215.37 1233 1482.68 2215.37 1243.24 1482.68 2217.08 1233 1482.68 2217.08 1243.24 1482.58 2217.08 1243.11 1477.32 2217.08 1243.11 1477.32 2215.37 1243.11 1482.58 2215.37 1243.11 1477.32 2217.08 1233.13 1477.32 2215.37 1233.13 1482.58 2217.08 1233.13 1482.58 2215.37 1233.13 1489.42 2223.97 1246 1477.42 2223.97 1246 1489.42 2223.97 1245 1489.42 2189.97 1246 1477.42 2223.97 1245 1477.42 2189.97 1246 1489.42 2189.97 1245 1477.42 2189.97 1245 1489.42 2227.35 1246 1477.42 2227.35 1246 1489.42 2227.35 1141 1489.42 2226.35 1246 1477.42 2227.35 1141 1477.42 2226.35 1246 1489.42 2226.35 1141 1477.42 2226.35 1141 1489.42 2262.35 1246 1477.42 2262.35 1246 1489.42 2262.35 1141 1489.42 2261.35 1246 1477.42 2262.35 1141 1477.42 2261.35 1246 1489.42 2261.35 1141 1477.42 2261.35 1141 1489.42 2261.35 1142 1477.42 2261.35 1142 1489.42 2261.35 1141 1489.42 2227.35 1142 1477.42 2261.35 1141 1477.42 2227.35 1142 1489.42 2227.35 1141 1477.42 2227.35 1141 1477.15 2227.35 1152.4 1477.15 2227.35 1142 1484.24 2227.35 1142 1484.24 2227.35 1152.4 1484.24 2227.69 1142 1484.24 2227.69 1152.4 1477.15 2227.69 1152.4 1477.15 2227.69 1142 1477.15 2230.79 1152.4 1477.15 2230.79 1142 1484.24 2230.79 1142 1484.24 2230.79 1152.4 1484.24 2231.13 1142 1484.24 2231.13 1152.4 1477.15 2231.13 1152.4 1477.15 2231.13 1142 1484.37 2227.69 1142 1484.37 2227.69 1152.4 1484.37 2230.79 1142 1484.37 2230.79 1152.4 1484.24 2230.79 1152.27 1477.29 2230.79 1152.27 1477.29 2227.69 1152.27 1484.24 2227.69 1152.27 1477.29 2230.79 1142.13 1477.29 2227.69 1142.13 1484.24 2230.79 1142.13 1484.24 2227.69 1142.13 1477.18 2231.39 1149.06 1477.18 2231.39 1142.01 1483.36 2231.39 1142.01 1483.36 2231.39 1149.06 1483.36 2231.58 1142.01 1483.36 2231.58 1149.06 1477.18 2231.58 1149.06 1477.18 2231.58 1142.01 1477.18 2233.3 1149.06 1477.18 2233.3 1142.01 1483.36 2233.3 1142.01 1483.36 2233.3 1149.06 1483.36 2233.5 1142.01 1483.36 2233.5 1149.06 1477.18 2233.5 1149.06 1477.18 2233.5 1142.01 1483.48 2231.58 1142.01 1483.48 2231.58 1149.06 1483.48 2233.3 1142.01 1483.48 2233.3 1149.06 1483.36 2233.3 1148.96 1477.3 2233.3 1148.96 1477.3 2231.58 1148.96 1483.36 2231.58 1148.96 1477.3 2233.3 1142.1 1477.3 2231.58 1142.1 1483.36 2233.3 1142.1 1483.36 2231.58 1142.1 1477.07 2233.74 1152.99 1477.07 2233.74 1142.01 1485.93 2233.74 1142.01 1485.93 2233.74 1152.99 1485.93 2234.07 1142.01 1485.93 2234.07 1152.99 1477.07 2234.07 1152.99 1477.07 2234.07 1142.01 1477.07 2236.99 1152.99 1477.07 2236.99 1142.01 1485.93 2236.99 1142.01 1485.93 2236.99 1152.99 1485.93 2237.32 1142.01 1485.93 2237.32 1152.99 1477.07 2237.32 1152.99 1477.07 2237.32 1142.01 1486.1 2234.07 1142.01 1486.1 2234.07 1152.99 1486.1 2236.99 1142.01 1486.1 2236.99 1152.99 1485.93 2236.99 1152.85 1477.24 2236.99 1152.85 1477.24 2234.07 1152.85 1485.93 2234.07 1152.85 1477.24 2236.99 1142.15 1477.24 2234.07 1142.15 1485.93 2236.99 1142.15 1485.93 2234.07 1142.15 1477.13 2237.57 1150.01 1477.13 2237.57 1142 1484.58 2237.57 1142 1484.58 2237.57 1150.01 1484.58 2237.9 1142 1484.58 2237.9 1150.01 1477.13 2237.9 1150.01 1477.13 2237.9 1142 1477.13 2240.82 1150.01 1477.13 2240.82 1142 1484.58 2240.82 1142 1484.58 2240.82 1150.01 1484.58 2241.15 1142 1484.58 2241.15 1150.01 1477.13 2241.15 1150.01 1477.13 2241.15 1142 1484.72 2237.9 1142 1484.72 2237.9 1150.01 1484.72 2240.82 1142 1484.72 2240.82 1150.01 1484.58 2240.82 1149.9 1477.27 2240.82 1149.9 1477.27 2237.9 1149.9 1484.58 2237.9 1149.9 1477.27 2240.82 1142.1 1477.27 2237.9 1142.1 1484.58 2240.82 1142.1 1484.58 2237.9 1142.1 1477.12 2241.39 1149.52 1477.12 2241.39 1142 1484.99 2241.39 1142 1484.99 2241.39 1149.52 1484.99 2241.75 1142 1484.99 2241.75 1149.52 1477.12 2241.75 1149.52 1477.12 2241.75 1142 1477.12 2244.93 1149.52 1477.12 2244.93 1142 1484.99 2244.93 1142 1484.99 2244.93 1149.52 1484.99 2245.29 1142 1484.99 2245.29 1149.52 1477.12 2245.29 1149.52 1477.12 2245.29 1142 1485.14 2241.75 1142 1485.14 2241.75 1149.52 1485.14 2244.93 1142 1485.14 2244.93 1149.52 1484.99 2244.93 1149.42 1477.27 2244.93 1149.42 1477.27 2241.75 1149.42 1484.99 2241.75 1149.42 1477.27 2244.93 1142.1 1477.27 2241.75 1142.1 1484.99 2244.93 1142.1 1484.99 2241.75 1142.1 1477.1 2245.54 1151.56 1477.1 2245.54 1142.01 1485.38 2245.54 1142.01 1485.38 2245.54 1151.56 1485.38 2245.65 1142.01 1485.38 2245.65 1151.56 1477.1 2245.65 1151.56 1477.1 2245.65 1142.01 1477.1 2246.63 1151.56 1477.1 2246.63 1142.01 1485.38 2246.63 1142.01 1485.38 2246.63 1151.56 1485.38 2246.74 1142.01 1485.38 2246.74 1151.56 1477.1 2246.74 1151.56 1477.1 2246.74 1142.01 1485.54 2245.65 1142.01 1485.54 2245.65 1151.56 1485.54 2246.63 1142.01 1485.54 2246.63 1151.56 1485.38 2246.63 1151.43 1477.26 2246.63 1151.43 1477.26 2245.65 1151.43 1485.38 2245.65 1151.43 1477.26 2246.63 1142.13 1477.26 2245.65 1142.13 1485.38 2246.63 1142.13 1485.38 2245.65 1142.13 1489.42 2261.35 1155 1477.42 2261.35 1155 1489.42 2261.35 1154 1489.42 2227.35 1155 1477.42 2261.35 1154 1477.42 2227.35 1155 1489.42 2227.35 1154 1477.42 2227.35 1154 1477.17 2227.35 1161.86 1477.17 2227.35 1155 1483.69 2227.35 1155 1483.69 2227.35 1161.86 1483.69 2227.4 1155 1483.69 2227.4 1161.86 1477.17 2227.4 1161.86 1477.17 2227.4 1155 1477.17 2227.82 1161.86 1477.17 2227.82 1155 1483.69 2227.82 1155 1483.69 2227.82 1161.86 1483.69 2227.87 1155 1483.69 2227.87 1161.86 1477.17 2227.87 1161.86 1477.17 2227.87 1155 1483.82 2227.4 1155 1483.82 2227.4 1161.86 1483.82 2227.82 1155 1483.82 2227.82 1161.86 1483.69 2227.82 1161.77 1477.29 2227.82 1161.77 1477.29 2227.4 1161.77 1483.69 2227.4 1161.77 1477.29 2227.82 1155.09 1477.29 2227.4 1155.09 1483.69 2227.82 1155.09 1483.69 2227.4 1155.09 1477.15 2228.11 1162.78 1477.15 2228.11 1155 1484.2 2228.11 1155 1484.2 2228.11 1162.78 1484.2 2228.33 1155 1484.2 2228.33 1162.78 1477.15 2228.33 1162.78 1477.15 2228.33 1155 1477.15 2230.29 1162.78 1477.15 2230.29 1155 1484.2 2230.29 1155 1484.2 2230.29 1162.78 1484.2 2230.51 1155 1484.2 2230.51 1162.78 1477.15 2230.51 1162.78 1477.15 2230.51 1155 1484.34 2228.33 1155 1484.34 2228.33 1162.78 1484.34 2230.29 1155 1484.34 2230.29 1162.78 1484.2 2230.29 1162.68 1477.28 2230.29 1162.68 1477.28 2228.33 1162.68 1484.2 2228.33 1162.68 1477.28 2230.29 1155.1 1477.28 2228.33 1155.1 1484.2 2230.29 1155.1 1484.2 2228.33 1155.1 1477.16 2230.76 1165.84 1477.16 2230.76 1155 1483.99 2230.76 1155 1483.99 2230.76 1165.84 1483.99 2231.11 1155 1483.99 2231.11 1165.84 1477.16 2231.11 1165.84 1477.16 2231.11 1155 1477.16 2234.27 1165.84 1477.16 2234.27 1155 1483.99 2234.27 1155 1483.99 2234.27 1165.84 1483.99 2234.63 1155 1483.99 2234.63 1165.84 1477.16 2234.63 1165.84 1477.16 2234.63 1155 1484.12 2231.11 1155 1484.12 2231.11 1165.84 1484.12 2234.27 1155 1484.12 2234.27 1165.84 1483.99 2234.27 1165.7 1477.29 2234.27 1165.7 1477.29 2231.11 1165.7 1483.99 2231.11 1165.7 1477.29 2234.27 1155.14 1477.29 2231.11 1155.14 1483.99 2234.27 1155.14 1483.99 2231.11 1155.14 1477.16 2234.88 1164.45 1477.16 2234.88 1155.01 1483.84 2234.88 1155.01 1483.84 2234.88 1164.45 1483.84 2235.09 1155.01 1483.84 2235.09 1164.45 1477.16 2235.09 1164.45 1477.16 2235.09 1155.01 1477.16 2236.95 1164.45 1477.16 2236.95 1155.01 1483.84 2236.95 1155.01 1483.84 2236.95 1164.45 1483.84 2237.16 1155.01 1483.84 2237.16 1164.45 1477.16 2237.16 1164.45 1477.16 2237.16 1155.01 1483.96 2235.09 1155.01 1483.96 2235.09 1164.45 1483.96 2236.95 1155.01 1483.96 2236.95 1164.45 1483.84 2236.95 1164.33 1477.29 2236.95 1164.33 1477.29 2235.09 1164.33 1483.84 2235.09 1164.33 1477.29 2236.95 1155.13 1477.29 2235.09 1155.13 1483.84 2236.95 1155.13 1483.84 2235.09 1155.13 1477.09 2237.41 1162.54 1477.09 2237.41 1155 1485.81 2237.41 1155 1485.81 2237.41 1162.54 1485.81 2237.46 1155 1485.81 2237.46 1162.54 1477.09 2237.46 1162.54 1477.09 2237.46 1155 1477.09 2237.9 1162.54 1477.09 2237.9 1155 1485.81 2237.9 1155 1485.81 2237.9 1162.54 1485.81 2237.95 1155 1485.81 2237.95 1162.54 1477.09 2237.95 1162.54 1477.09 2237.95 1155 1485.97 2237.46 1155 1485.97 2237.46 1162.54 1485.97 2237.9 1155 1485.97 2237.9 1162.54 1485.81 2237.9 1162.44 1477.26 2237.9 1162.44 1477.26 2237.46 1162.44 1485.81 2237.46 1162.44 1477.26 2237.9 1155.1 1477.26 2237.46 1155.1 1485.81 2237.9 1155.1 1485.81 2237.46 1155.1 1477.13 2238.19 1163.32 1477.13 2238.19 1155 1484.75 2238.19 1155 1484.75 2238.19 1163.32 1484.75 2238.44 1155 1484.75 2238.44 1163.32 1477.13 2238.44 1163.32 1477.13 2238.44 1155 1477.13 2240.72 1163.32 1477.13 2240.72 1155 1484.75 2240.72 1155 1484.75 2240.72 1163.32 1484.75 2240.97 1155 1484.75 2240.97 1163.32 1477.13 2240.97 1163.32 1477.13 2240.97 1155 1484.9 2238.44 1155 1484.9 2238.44 1163.32 1484.9 2240.72 1155 1484.9 2240.72 1163.32 1484.75 2240.72 1163.21 1477.27 2240.72 1163.21 1477.27 2238.44 1163.21 1484.75 2238.44 1163.21 1477.27 2240.72 1155.11 1477.27 2238.44 1155.11 1484.75 2240.72 1155.11 1484.75 2238.44 1155.11 1477.21 2241.22 1162.5 1477.21 2241.22 1155 1482.69 2241.22 1155 1482.69 2241.22 1162.5 1482.69 2241.48 1155 1482.69 2241.48 1162.5 1477.21 2241.48 1162.5 1477.21 2241.48 1155 1477.21 2243.86 1162.5 1477.21 2243.86 1155 1482.69 2243.86 1155 1482.69 2243.86 1162.5 1482.69 2244.12 1155 1482.69 2244.12 1162.5 1477.21 2244.12 1162.5 1477.21 2244.12 1155 1482.8 2241.48 1155 1482.8 2241.48 1162.5 1482.8 2243.86 1155 1482.8 2243.86 1162.5 1482.69 2243.86 1162.4 1477.31 2243.86 1162.4 1477.31 2241.48 1162.4 1482.69 2241.48 1162.4 1477.31 2243.86 1155.1 1477.31 2241.48 1155.1 1482.69 2243.86 1155.1 1482.69 2241.48 1155.1 1477.11 2244.36 1165.36 1477.11 2244.36 1155 1485.4 2244.36 1155 1485.4 2244.36 1165.36 1485.4 2244.62 1155 1485.4 2244.62 1165.36 1477.11 2244.62 1165.36 1477.11 2244.62 1155 1477.11 2246.87 1165.36 1477.11 2246.87 1155 1485.4 2246.87 1155 1485.4 2246.87 1165.36 1485.4 2247.12 1155 1485.4 2247.12 1165.36 1477.11 2247.12 1165.36 1477.11 2247.12 1155 1485.55 2244.62 1155 1485.55 2244.62 1165.36 1485.55 2246.87 1155 1485.55 2246.87 1165.36 1485.4 2246.87 1165.22 1477.27 2246.87 1165.22 1477.27 2244.62 1165.22 1485.4 2244.62 1165.22 1477.27 2246.87 1155.14 1477.27 2244.62 1155.14 1485.4 2246.87 1155.14 1485.4 2244.62 1155.14 1489.42 2261.35 1168 1477.42 2261.35 1168 1489.42 2261.35 1167 1489.42 2227.35 1168 1477.42 2261.35 1167 1477.42 2227.35 1168 1489.42 2227.35 1167 1477.42 2227.35 1167 1477.11 2227.34 1174.66 1477.11 2227.34 1168 1485.24 2227.34 1168 1485.24 2227.34 1174.66 1485.24 2227.46 1168 1485.24 2227.46 1174.66 1477.11 2227.46 1174.66 1477.11 2227.46 1168 1477.11 2228.45 1174.66 1477.11 2228.45 1168 1485.24 2228.45 1168 1485.24 2228.45 1174.66 1485.24 2228.56 1168 1485.24 2228.56 1174.66 1477.11 2228.56 1174.66 1477.11 2228.56 1168 1485.4 2227.46 1168 1485.4 2227.46 1174.66 1485.4 2228.45 1168 1485.4 2228.45 1174.66 1485.24 2228.45 1174.58 1477.26 2228.45 1174.58 1477.26 2227.46 1174.58 1485.24 2227.46 1174.58 1477.26 2228.45 1168.08 1477.26 2227.46 1168.08 1485.24 2228.45 1168.08 1485.24 2227.46 1168.08 1477.1 2228.8 1175.12 1477.1 2228.8 1168 1485.55 2228.8 1168 1485.55 2228.8 1175.12 1485.55 2229.12 1168 1485.55 2229.12 1175.12 1477.1 2229.12 1175.12 1477.1 2229.12 1168 1477.1 2232 1175.12 1477.1 2232 1168 1485.55 2232 1168 1485.55 2232 1175.12 1485.55 2232.32 1168 1485.55 2232.32 1175.12 1477.1 2232.32 1175.12 1477.1 2232.32 1168 1485.71 2229.12 1168 1485.71 2229.12 1175.12 1485.71 2232 1168 1485.71 2232 1175.12 1485.55 2232 1175.03 1477.26 2232 1175.03 1477.26 2229.12 1175.03 1485.55 2229.12 1175.03 1477.26 2232 1168.09 1477.26 2229.12 1168.09 1485.55 2232 1168.09 1485.55 2229.12 1168.09 1477.19 2232.57 1175.24 1477.19 2232.57 1168 1483.24 2232.57 1168 1483.24 2232.57 1175.24 1483.24 2232.85 1168 1483.24 2232.85 1175.24 1477.19 2232.85 1175.24 1477.19 2232.85 1168 1477.19 2235.33 1175.24 1477.19 2235.33 1168 1483.24 2235.33 1168 1483.24 2235.33 1175.24 1483.24 2235.61 1168 1483.24 2235.61 1175.24 1477.19 2235.61 1175.24 1477.19 2235.61 1168 1483.36 2232.85 1168 1483.36 2232.85 1175.24 1483.36 2235.33 1168 1483.36 2235.33 1175.24 1483.24 2235.33 1175.14 1477.3 2235.33 1175.14 1477.3 2232.85 1175.14 1483.24 2232.85 1175.14 1477.3 2235.33 1168.1 1477.3 2232.85 1168.1 1483.24 2235.33 1168.1 1483.24 2232.85 1168.1 1477.16 2235.86 1177.12 1477.16 2235.86 1168 1483.81 2235.86 1168 1483.81 2235.86 1177.12 1483.81 2236.02 1168 1483.81 2236.02 1177.12 1477.16 2236.02 1177.12 1477.16 2236.02 1168 1477.16 2237.5 1177.12 1477.16 2237.5 1168 1483.81 2237.5 1168 1483.81 2237.5 1177.12 1483.81 2237.66 1168 1483.81 2237.66 1177.12 1477.16 2237.66 1177.12 1477.16 2237.66 1168 1483.94 2236.02 1168 1483.94 2236.02 1177.12 1483.94 2237.5 1168 1483.94 2237.5 1177.12 1483.81 2237.5 1177 1477.29 2237.5 1177 1477.29 2236.02 1177 1483.81 2236.02 1177 1477.29 2237.5 1168.12 1477.29 2236.02 1168.12 1483.81 2237.5 1168.12 1483.81 2236.02 1168.12 1477.18 2237.91 1175.34 1477.18 2237.91 1168 1483.4 2237.91 1168 1483.4 2237.91 1175.34 1483.4 2238.16 1168 1483.4 2238.16 1175.34 1477.18 2238.16 1175.34 1477.18 2238.16 1168 1477.18 2240.36 1175.34 1477.18 2240.36 1168 1483.4 2240.36 1168 1483.4 2240.36 1175.34 1483.4 2240.61 1168 1483.4 2240.61 1175.34 1477.18 2240.61 1175.34 1477.18 2240.61 1168 1483.52 2238.16 1168 1483.52 2238.16 1175.34 1483.52 2240.36 1168 1483.52 2240.36 1175.34 1483.4 2240.36 1175.24 1477.29 2240.36 1175.24 1477.29 2238.16 1175.24 1483.4 2238.16 1175.24 1477.29 2240.36 1168.1 1477.29 2238.16 1168.1 1483.4 2240.36 1168.1 1483.4 2238.16 1168.1 1477.17 2240.86 1178.48 1477.17 2240.86 1168 1483.6 2240.86 1168 1483.6 2240.86 1178.48 1483.6 2241.11 1168 1483.6 2241.11 1178.48 1477.17 2241.11 1178.48 1477.17 2241.11 1168 1477.17 2243.36 1178.48 1477.17 2243.36 1168 1483.6 2243.36 1168 1483.6 2243.36 1178.48 1483.6 2243.61 1168 1483.6 2243.61 1178.48 1477.17 2243.61 1178.48 1477.17 2243.61 1168 1483.72 2241.11 1168 1483.72 2241.11 1178.48 1483.72 2243.36 1168 1483.72 2243.36 1178.48 1483.6 2243.36 1178.34 1477.29 2243.36 1178.34 1477.29 2241.11 1178.34 1483.6 2241.11 1178.34 1477.29 2243.36 1168.14 1477.29 2241.11 1168.14 1483.6 2243.36 1168.14 1483.6 2241.11 1168.14 1477.17 2243.84 1176.11 1477.17 2243.84 1168 1483.42 2243.84 1168 1483.42 2243.84 1176.11 1483.42 2244.05 1168 1483.42 2244.05 1176.11 1477.17 2244.05 1176.11 1477.17 2244.05 1168 1477.17 2245.85 1176.11 1477.17 2245.85 1168 1483.42 2245.85 1168 1483.42 2245.85 1176.11 1483.42 2246.06 1168 1483.42 2246.06 1176.11 1477.17 2246.06 1176.11 1477.17 2246.06 1168 1483.54 2244.05 1168 1483.54 2244.05 1176.11 1483.54 2245.85 1168 1483.54 2245.85 1176.11 1483.42 2245.85 1176 1477.29 2245.85 1176 1477.29 2244.05 1176 1483.42 2244.05 1176 1477.29 2245.85 1168.1 1477.29 2244.05 1168.1 1483.42 2245.85 1168.1 1483.42 2244.05 1168.1 1489.42 2261.35 1181 1477.42 2261.35 1181 1489.42 2261.35 1180 1489.42 2227.35 1181 1477.42 2261.35 1180 1477.42 2227.35 1181 1489.42 2227.35 1180 1477.42 2227.35 1180 1477.16 2227.35 1187.33 1477.16 2227.35 1181 1483.92 2227.35 1181 1483.92 2227.35 1187.33 1483.92 2227.46 1181 1483.92 2227.46 1187.33 1477.16 2227.46 1187.33 1477.16 2227.46 1181 1477.16 2228.46 1187.33 1477.16 2228.46 1181 1483.92 2228.46 1181 1483.92 2228.46 1187.33 1483.92 2228.57 1181 1483.92 2228.57 1187.33 1477.16 2228.57 1187.33 1477.16 2228.57 1181 1484.05 2227.46 1181 1484.05 2227.46 1187.33 1484.05 2228.46 1181 1484.05 2228.46 1187.33 1483.92 2228.46 1187.24 1477.29 2228.46 1187.24 1477.29 2227.46 1187.24 1483.92 2227.46 1187.24 1477.29 2228.46 1181.08 1477.29 2227.46 1181.08 1483.92 2228.46 1181.08 1483.92 2227.46 1181.08 1477.2 2228.82 1187.76 1477.2 2228.82 1181 1483.1 2228.82 1181 1483.1 2228.82 1187.76 1483.1 2228.97 1181 1483.1 2228.97 1187.76 1477.2 2228.97 1187.76 1477.2 2228.97 1181 1477.2 2230.35 1187.76 1477.2 2230.35 1181 1483.1 2230.35 1181 1483.1 2230.35 1187.76 1483.1 2230.5 1181 1483.1 2230.5 1187.76 1477.2 2230.5 1187.76 1477.2 2230.5 1181 1483.21 2228.97 1181 1483.21 2228.97 1187.76 1483.21 2230.35 1181 1483.21 2230.35 1187.76 1483.1 2230.35 1187.67 1477.31 2230.35 1187.67 1477.31 2228.97 1187.67 1483.1 2228.97 1187.67 1477.31 2230.35 1181.09 1477.31 2228.97 1181.09 1483.1 2230.35 1181.09 1483.1 2228.97 1181.09 1477.16 2230.76 1187.1 1477.16 2230.76 1181 1483.95 2230.76 1181 1483.95 2230.76 1187.1 1483.95 2231.02 1181 1483.95 2231.02 1187.1 1477.16 2231.02 1187.1 1477.16 2231.02 1181 1477.16 2233.4 1187.1 1477.16 2233.4 1181 1483.95 2233.4 1181 1483.95 2233.4 1187.1 1483.95 2233.67 1181 1483.95 2233.67 1187.1 1477.16 2233.67 1187.1 1477.16 2233.67 1181 1484.08 2231.02 1181 1484.08 2231.02 1187.1 1484.08 2233.4 1181 1484.08 2233.4 1187.1 1483.95 2233.4 1187.02 1477.29 2233.4 1187.02 1477.29 2231.02 1187.02 1483.95 2231.02 1187.02 1477.29 2233.4 1181.08 1477.29 2231.02 1181.08 1483.95 2233.4 1181.08 1483.95 2231.02 1181.08 1477.07 2233.91 1190.26 1477.07 2233.91 1181.01 1486.01 2233.91 1181.01 1486.01 2233.91 1190.26 1486.01 2234.14 1181.01 1486.01 2234.14 1190.26 1477.07 2234.14 1190.26 1477.07 2234.14 1181.01 1477.07 2236.18 1190.26 1477.07 2236.18 1181.01 1486.01 2236.18 1181.01 1486.01 2236.18 1190.26 1486.01 2236.41 1181.01 1486.01 2236.41 1190.26 1477.07 2236.41 1190.26 1477.07 2236.41 1181.01 1486.18 2234.14 1181.01 1486.18 2234.14 1190.26 1486.18 2236.18 1181.01 1486.18 2236.18 1190.26 1486.01 2236.18 1190.13 1477.24 2236.18 1190.13 1477.24 2234.14 1190.13 1486.01 2234.14 1190.13 1477.24 2236.18 1181.13 1477.24 2234.14 1181.13 1486.01 2236.18 1181.13 1486.01 2234.14 1181.13 1477.09 2236.65 1188.61 1477.09 2236.65 1181 1485.58 2236.65 1181 1485.58 2236.65 1188.61 1485.58 2236.76 1181 1485.58 2236.76 1188.61 1477.09 2236.76 1188.61 1477.09 2236.76 1181 1477.09 2237.76 1188.61 1477.09 2237.76 1181 1485.58 2237.76 1181 1485.58 2237.76 1188.61 1485.58 2237.87 1181 1485.58 2237.87 1188.61 1477.09 2237.87 1188.61 1477.09 2237.87 1181 1485.74 2236.76 1181 1485.74 2236.76 1188.61 1485.74 2237.76 1181 1485.74 2237.76 1188.61 1485.58 2237.76 1188.5 1477.26 2237.76 1188.5 1477.26 2236.76 1188.5 1485.58 2236.76 1188.5 1477.26 2237.76 1181.1 1477.26 2236.76 1181.1 1485.58 2237.76 1181.1 1485.58 2236.76 1181.1 1477.1 2238.12 1187.54 1477.1 2238.12 1181 1485.65 2238.12 1181 1485.65 2238.12 1187.54 1485.65 2238.23 1181 1485.65 2238.23 1187.54 1477.1 2238.23 1187.54 1477.1 2238.23 1181 1477.1 2239.23 1187.54 1477.1 2239.23 1181 1485.65 2239.23 1181 1485.65 2239.23 1187.54 1485.65 2239.34 1181 1485.65 2239.34 1187.54 1477.1 2239.34 1187.54 1477.1 2239.34 1181 1485.81 2238.23 1181 1485.81 2238.23 1187.54 1485.81 2239.23 1181 1485.81 2239.23 1187.54 1485.65 2239.23 1187.45 1477.26 2239.23 1187.45 1477.26 2238.23 1187.45 1485.65 2238.23 1187.45 1477.26 2239.23 1181.09 1477.26 2238.23 1181.09 1485.65 2239.23 1181.09 1485.65 2238.23 1181.09 1477.09 2239.59 1187.88 1477.09 2239.59 1181 1485.56 2239.59 1181 1485.56 2239.59 1187.88 1485.56 2239.74 1181 1485.56 2239.74 1187.88 1477.09 2239.74 1187.88 1477.09 2239.74 1181 1477.09 2241.08 1187.88 1477.09 2241.08 1181 1485.56 2241.08 1181 1485.56 2241.08 1187.88 1485.56 2241.23 1181 1485.56 2241.23 1187.88 1477.09 2241.23 1187.88 1477.09 2241.23 1181 1485.72 2239.74 1181 1485.72 2239.74 1187.88 1485.72 2241.08 1181 1485.72 2241.08 1187.88 1485.56 2241.08 1187.79 1477.26 2241.08 1187.79 1477.26 2239.74 1187.79 1485.56 2239.74 1187.79 1477.26 2241.08 1181.09 1477.26 2239.74 1181.09 1485.56 2241.08 1181.09 1485.56 2239.74 1181.09 1477.16 2241.48 1187.54 1477.16 2241.48 1181 1483.91 2241.48 1181 1483.91 2241.48 1187.54 1483.91 2241.59 1181 1483.91 2241.59 1187.54 1477.16 2241.59 1187.54 1477.16 2241.59 1181 1477.16 2242.57 1187.54 1477.16 2242.57 1181 1483.91 2242.57 1181 1483.91 2242.57 1187.54 1483.91 2242.68 1181 1483.91 2242.68 1187.54 1477.16 2242.68 1187.54 1477.16 2242.68 1181 1484.04 2241.59 1181 1484.04 2241.59 1187.54 1484.04 2242.57 1181 1484.04 2242.57 1187.54 1483.91 2242.57 1187.45 1477.29 2242.57 1187.45 1477.29 2241.59 1187.45 1483.91 2241.59 1187.45 1477.29 2242.57 1181.09 1477.29 2241.59 1181.09 1483.91 2242.57 1181.09 1483.91 2241.59 1181.09 1477.19 2242.92 1191.07 1477.19 2242.92 1181 1483.22 2242.92 1181 1483.22 2242.92 1191.07 1483.22 2243.25 1181 1483.22 2243.25 1191.07 1477.19 2243.25 1191.07 1477.19 2243.25 1181 1477.19 2246.21 1191.07 1477.19 2246.21 1181 1483.22 2246.21 1181 1483.22 2246.21 1191.07 1483.22 2246.54 1181 1483.22 2246.54 1191.07 1477.19 2246.54 1191.07 1477.19 2246.54 1181 1483.33 2243.25 1181 1483.33 2243.25 1191.07 1483.33 2246.21 1181 1483.33 2246.21 1191.07 1483.22 2246.21 1190.93 1477.31 2246.21 1190.93 1477.31 2243.25 1190.93 1483.22 2243.25 1190.93 1477.31 2246.21 1181.13 1477.31 2243.25 1181.13 1483.22 2246.21 1181.13 1483.22 2243.25 1181.13 1489.42 2261.35 1194 1477.42 2261.35 1194 1489.42 2261.35 1193 1489.42 2227.35 1194 1477.42 2261.35 1193 1477.42 2227.35 1194 1489.42 2227.35 1193 1477.42 2227.35 1193 1477.21 2227.34 1202.13 1477.21 2227.34 1194.01 1482.56 2227.34 1194.01 1482.56 2227.34 1202.13 1482.56 2227.51 1194.01 1482.56 2227.51 1202.13 1477.21 2227.51 1202.13 1477.21 2227.51 1194.01 1477.21 2228.99 1202.13 1477.21 2228.99 1194.01 1482.56 2228.99 1194.01 1482.56 2228.99 1202.13 1482.56 2229.16 1194.01 1482.56 2229.16 1202.13 1477.21 2229.16 1202.13 1477.21 2229.16 1194.01 1482.66 2227.51 1194.01 1482.66 2227.51 1202.13 1482.66 2228.99 1194.01 1482.66 2228.99 1202.13 1482.56 2228.99 1202.03 1477.32 2228.99 1202.03 1477.32 2227.51 1202.03 1482.56 2227.51 1202.03 1477.32 2228.99 1194.11 1477.32 2227.51 1194.11 1482.56 2228.99 1194.11 1482.56 2227.51 1194.11 1477.08 2229.4 1202.38 1477.08 2229.4 1194 1485.9 2229.4 1194 1485.9 2229.4 1202.38 1485.9 2229.55 1194 1485.9 2229.55 1202.38 1477.08 2229.55 1202.38 1477.08 2229.55 1194 1477.08 2230.95 1202.38 1477.08 2230.95 1194 1485.9 2230.95 1194 1485.9 2230.95 1202.38 1485.9 2231.1 1194 1485.9 2231.1 1202.38 1477.08 2231.1 1202.38 1477.08 2231.1 1194 1486.06 2229.55 1194 1486.06 2229.55 1202.38 1486.06 2230.95 1194 1486.06 2230.95 1202.38 1485.9 2230.95 1202.27 1477.25 2230.95 1202.27 1477.25 2229.55 1202.27 1485.9 2229.55 1202.27 1477.25 2230.95 1194.11 1477.25 2229.55 1194.11 1485.9 2230.95 1194.11 1485.9 2229.55 1194.11 1477.08 2231.35 1204.27 1477.08 2231.35 1194 1485.93 2231.35 1194 1485.93 2231.35 1204.27 1485.93 2231.62 1194 1485.93 2231.62 1204.27 1477.08 2231.62 1204.27 1477.08 2231.62 1194 1477.08 2234.08 1204.27 1477.08 2234.08 1194 1485.93 2234.08 1194 1485.93 2234.08 1204.27 1485.93 2234.35 1194 1485.93 2234.35 1204.27 1477.08 2234.35 1204.27 1477.08 2234.35 1194 1486.1 2231.62 1194 1486.1 2231.62 1204.27 1486.1 2234.08 1194 1486.1 2234.08 1204.27 1485.93 2234.08 1204.13 1477.25 2234.08 1204.13 1477.25 2231.62 1204.13 1485.93 2231.62 1204.13 1477.25 2234.08 1194.13 1477.25 2231.62 1194.13 1485.93 2234.08 1194.13 1485.93 2231.62 1194.13 1477.13 2234.6 1203.76 1477.13 2234.6 1194 1484.69 2234.6 1194 1484.69 2234.6 1203.76 1484.69 2234.77 1194 1484.69 2234.77 1203.76 1477.13 2234.77 1203.76 1477.13 2234.77 1194 1477.13 2236.33 1203.76 1477.13 2236.33 1194 1484.69 2236.33 1194 1484.69 2236.33 1203.76 1484.69 2236.5 1194 1484.69 2236.5 1203.76 1477.13 2236.5 1203.76 1477.13 2236.5 1194 1484.84 2234.77 1194 1484.84 2234.77 1203.76 1484.84 2236.33 1194 1484.84 2236.33 1203.76 1484.69 2236.33 1203.63 1477.27 2236.33 1203.63 1477.27 2234.77 1203.63 1484.69 2234.77 1203.63 1477.27 2236.33 1194.13 1477.27 2234.77 1194.13 1484.69 2236.33 1194.13 1484.69 2234.77 1194.13 1477.21 2236.75 1202.26 1477.21 2236.75 1194 1482.67 2236.75 1194 1482.67 2236.75 1202.26 1482.67 2237.04 1194 1482.67 2237.04 1202.26 1477.21 2237.04 1202.26 1477.21 2237.04 1194 1477.21 2239.64 1202.26 1477.21 2239.64 1194 1482.67 2239.64 1194 1482.67 2239.64 1202.26 1482.67 2239.93 1194 1482.67 2239.93 1202.26 1477.21 2239.93 1202.26 1477.21 2239.93 1194 1482.77 2237.04 1194 1482.77 2237.04 1202.26 1482.77 2239.64 1194 1482.77 2239.64 1202.26 1482.67 2239.64 1202.15 1477.32 2239.64 1202.15 1477.32 2237.04 1202.15 1482.67 2237.04 1202.15 1477.32 2239.64 1194.11 1477.32 2237.04 1194.11 1482.67 2239.64 1194.11 1482.67 2237.04 1194.11 1477.21 2240.18 1204.58 1477.21 2240.18 1194.01 1482.58 2240.18 1194.01 1482.58 2240.18 1204.58 1482.58 2240.5 1194.01 1482.58 2240.5 1204.58 1477.21 2240.5 1204.58 1477.21 2240.5 1194.01 1477.21 2243.38 1204.58 1477.21 2243.38 1194.01 1482.58 2243.38 1194.01 1482.58 2243.38 1204.58 1482.58 2243.7 1194.01 1482.58 2243.7 1204.58 1477.21 2243.7 1204.58 1477.21 2243.7 1194.01 1482.68 2240.5 1194.01 1482.68 2240.5 1204.58 1482.68 2243.38 1194.01 1482.68 2243.38 1204.58 1482.58 2243.38 1204.44 1477.32 2243.38 1204.44 1477.32 2240.5 1204.44 1482.58 2240.5 1204.44 1477.32 2243.38 1194.14 1477.32 2240.5 1194.14 1482.58 2243.38 1194.14 1482.58 2240.5 1194.14 1477.21 2243.95 1202.36 1477.21 2243.95 1194.01 1482.77 2243.95 1194.01 1482.77 2243.95 1202.36 1482.77 2244.06 1194.01 1482.77 2244.06 1202.36 1477.21 2244.06 1202.36 1477.21 2244.06 1194.01 1477.21 2245.08 1202.36 1477.21 2245.08 1194.01 1482.77 2245.08 1194.01 1482.77 2245.08 1202.36 1482.77 2245.19 1194.01 1482.77 2245.19 1202.36 1477.21 2245.19 1202.36 1477.21 2245.19 1194.01 1482.88 2244.06 1194.01 1482.88 2244.06 1202.36 1482.88 2245.08 1194.01 1482.88 2245.08 1202.36 1482.77 2245.08 1202.25 1477.31 2245.08 1202.25 1477.31 2244.06 1202.25 1482.77 2244.06 1202.25 1477.31 2245.08 1194.11 1477.31 2244.06 1194.11 1482.77 2245.08 1194.11 1482.77 2244.06 1194.11 1477.13 2245.44 1201.72 1477.13 2245.44 1194 1484.56 2245.44 1194 1484.56 2245.44 1201.72 1484.56 2245.52 1194 1484.56 2245.52 1201.72 1477.13 2245.52 1201.72 1477.13 2245.52 1194 1477.13 2246.22 1201.72 1477.13 2246.22 1194 1484.56 2246.22 1194 1484.56 2246.22 1201.72 1484.56 2246.3 1194 1484.56 2246.3 1201.72 1477.13 2246.3 1201.72 1477.13 2246.3 1194 1484.7 2245.52 1194 1484.7 2245.52 1201.72 1484.7 2246.22 1194 1484.7 2246.22 1201.72 1484.56 2246.22 1201.62 1477.28 2246.22 1201.62 1477.28 2245.52 1201.62 1484.56 2245.52 1201.62 1477.28 2246.22 1194.1 1477.28 2245.52 1194.1 1484.56 2246.22 1194.1 1484.56 2245.52 1194.1 1489.42 2261.35 1207 1477.42 2261.35 1207 1489.42 2261.35 1206 1489.42 2227.35 1207 1477.42 2261.35 1206 1477.42 2227.35 1207 1489.42 2227.35 1206 1477.42 2227.35 1206 1477.14 2227.35 1216.15 1477.14 2227.35 1207.01 1484.65 2227.35 1207.01 1484.65 2227.35 1216.15 1484.65 2227.48 1207.01 1484.65 2227.48 1216.15 1477.14 2227.48 1216.15 1477.14 2227.48 1207.01 1477.14 2228.6 1216.15 1477.14 2228.6 1207.01 1484.65 2228.6 1207.01 1484.65 2228.6 1216.15 1484.65 2228.73 1207.01 1484.65 2228.73 1216.15 1477.14 2228.73 1216.15 1477.14 2228.73 1207.01 1484.79 2227.48 1207.01 1484.79 2227.48 1216.15 1484.79 2228.6 1207.01 1484.79 2228.6 1216.15 1484.65 2228.6 1216.03 1477.28 2228.6 1216.03 1477.28 2227.48 1216.03 1484.65 2227.48 1216.03 1477.28 2228.6 1207.13 1477.28 2227.48 1207.13 1484.65 2228.6 1207.13 1484.65 2227.48 1207.13 1477.07 2228.98 1215.52 1477.07 2228.98 1207 1485.97 2228.98 1207 1485.97 2228.98 1215.52 1485.97 2229.09 1207 1485.97 2229.09 1215.52 1477.07 2229.09 1215.52 1477.07 2229.09 1207 1477.07 2230.13 1215.52 1477.07 2230.13 1207 1485.97 2230.13 1207 1485.97 2230.13 1215.52 1485.97 2230.24 1207 1485.97 2230.24 1215.52 1477.07 2230.24 1215.52 1477.07 2230.24 1207 1486.14 2229.09 1207 1486.14 2229.09 1215.52 1486.14 2230.13 1207 1486.14 2230.13 1215.52 1485.97 2230.13 1215.41 1477.24 2230.13 1215.41 1477.24 2229.09 1215.41 1485.97 2229.09 1215.41 1477.24 2230.13 1207.11 1477.24 2229.09 1207.11 1485.97 2230.13 1207.11 1485.97 2229.09 1207.11 1477.12 2230.48 1217.26 1477.12 2230.48 1207 1484.79 2230.48 1207 1484.79 2230.48 1217.26 1484.79 2230.6 1207 1484.79 2230.6 1217.26 1477.12 2230.6 1217.26 1477.12 2230.6 1207 1477.12 2231.68 1217.26 1477.12 2231.68 1207 1484.79 2231.68 1207 1484.79 2231.68 1217.26 1484.79 2231.8 1207 1484.79 2231.8 1217.26 1477.12 2231.8 1217.26 1477.12 2231.8 1207 1484.94 2230.6 1207 1484.94 2230.6 1217.26 1484.94 2231.68 1207 1484.94 2231.68 1217.26 1484.79 2231.68 1217.13 1477.27 2231.68 1217.13 1477.27 2230.6 1217.13 1484.79 2230.6 1217.13 1477.27 2231.68 1207.14 1477.27 2230.6 1207.14 1484.79 2231.68 1207.14 1484.79 2230.6 1207.14 1477.17 2232.05 1214.17 1477.17 2232.05 1207.01 1483.48 2232.05 1207.01 1483.48 2232.05 1214.17 1483.48 2232.26 1207.01 1483.48 2232.26 1214.17 1477.17 2232.26 1214.17 1477.17 2232.26 1207.01 1477.17 2234.2 1214.17 1477.17 2234.2 1207.01 1483.48 2234.2 1207.01 1483.48 2234.2 1214.17 1483.48 2234.41 1207.01 1483.48 2234.41 1214.17 1477.17 2234.41 1214.17 1477.17 2234.41 1207.01 1483.6 2232.26 1207.01 1483.6 2232.26 1214.17 1483.6 2234.2 1207.01 1483.6 2234.2 1214.17 1483.48 2234.2 1214.08 1477.29 2234.2 1214.08 1477.29 2232.26 1214.08 1483.48 2232.26 1214.08 1477.29 2234.2 1207.1 1477.29 2232.26 1207.1 1483.48 2234.2 1207.1 1483.48 2232.26 1207.1 1477.17 2234.66 1214.92 1477.17 2234.66 1207 1483.6 2234.66 1207 1483.6 2234.66 1214.92 1483.6 2234.85 1207 1483.6 2234.85 1214.92 1477.17 2234.85 1214.92 1477.17 2234.85 1207 1477.17 2236.59 1214.92 1477.17 2236.59 1207 1483.6 2236.59 1207 1483.6 2236.59 1214.92 1483.6 2236.78 1207 1483.6 2236.78 1214.92 1477.17 2236.78 1214.92 1477.17 2236.78 1207 1483.72 2234.85 1207 1483.72 2234.85 1214.92 1483.72 2236.59 1207 1483.72 2236.59 1214.92 1483.6 2236.59 1214.82 1477.3 2236.59 1214.82 1477.3 2234.85 1214.82 1483.6 2234.85 1214.82 1477.3 2236.59 1207.1 1477.3 2234.85 1207.1 1483.6 2236.59 1207.1 1483.6 2234.85 1207.1 1477.14 2237.02 1214.95 1477.14 2237.02 1207.01 1484.43 2237.02 1207.01 1484.43 2237.02 1214.95 1484.43 2237.17 1207.01 1484.43 2237.17 1214.95 1477.14 2237.17 1214.95 1477.14 2237.17 1207.01 1477.14 2238.47 1214.95 1477.14 2238.47 1207.01 1484.43 2238.47 1207.01 1484.43 2238.47 1214.95 1484.43 2238.62 1207.01 1484.43 2238.62 1214.95 1477.14 2238.62 1214.95 1477.14 2238.62 1207.01 1484.57 2237.17 1207.01 1484.57 2237.17 1214.95 1484.57 2238.47 1207.01 1484.57 2238.47 1214.95 1484.43 2238.47 1214.85 1477.28 2238.47 1214.85 1477.28 2237.17 1214.85 1484.43 2237.17 1214.85 1477.28 2238.47 1207.11 1477.28 2237.17 1207.11 1484.43 2238.47 1207.11 1484.43 2237.17 1207.11 1477.14 2238.87 1216.27 1477.14 2238.87 1207 1484.36 2238.87 1207 1484.36 2238.87 1216.27 1484.36 2239.02 1207 1484.36 2239.02 1216.27 1477.14 2239.02 1216.27 1477.14 2239.02 1207 1477.14 2240.36 1216.27 1477.14 2240.36 1207 1484.36 2240.36 1207 1484.36 2240.36 1216.27 1484.36 2240.51 1207 1484.36 2240.51 1216.27 1477.14 2240.51 1216.27 1477.14 2240.51 1207 1484.5 2239.02 1207 1484.5 2239.02 1216.27 1484.5 2240.36 1207 1484.5 2240.36 1216.27 1484.36 2240.36 1216.14 1477.28 2240.36 1216.14 1477.28 2239.02 1216.14 1484.36 2239.02 1216.14 1477.28 2240.36 1207.12 1477.28 2239.02 1207.12 1484.36 2240.36 1207.12 1484.36 2239.02 1207.12 1477.16 2240.75 1213.44 1477.16 2240.75 1207 1483.87 2240.75 1207 1483.87 2240.75 1213.44 1483.87 2240.85 1207 1483.87 2240.85 1213.44 1477.16 2240.85 1213.44 1477.16 2240.85 1207 1477.16 2241.67 1213.44 1477.16 2241.67 1207 1483.87 2241.67 1207 1483.87 2241.67 1213.44 1483.87 2241.77 1207 1483.87 2241.77 1213.44 1477.16 2241.77 1213.44 1477.16 2241.77 1207 1484 2240.85 1207 1484 2240.85 1213.44 1484 2241.67 1207 1484 2241.67 1213.44 1483.87 2241.67 1213.36 1477.29 2241.67 1213.36 1477.29 2240.85 1213.36 1483.87 2240.85 1213.36 1477.29 2241.67 1207.08 1477.29 2240.85 1207.08 1483.87 2241.67 1207.08 1483.87 2240.85 1207.08 1477.07 2242.01 1217.94 1477.07 2242.01 1207 1486.18 2242.01 1207 1486.18 2242.01 1217.94 1486.18 2242.3 1207 1486.18 2242.3 1217.94 1477.07 2242.3 1217.94 1477.07 2242.3 1207 1477.07 2244.9 1217.94 1477.07 2244.9 1207 1486.18 2244.9 1207 1486.18 2244.9 1217.94 1486.18 2245.19 1207 1486.18 2245.19 1217.94 1477.07 2245.19 1217.94 1477.07 2245.19 1207 1486.35 2242.3 1207 1486.35 2242.3 1217.94 1486.35 2244.9 1207 1486.35 2244.9 1217.94 1486.18 2244.9 1217.8 1477.25 2244.9 1217.8 1477.25 2242.3 1217.8 1486.18 2242.3 1217.8 1477.25 2244.9 1207.14 1477.25 2242.3 1207.14 1486.18 2244.9 1207.14 1486.18 2242.3 1207.14 1477.22 2245.45 1217.58 1477.22 2245.45 1207 1482.54 2245.45 1207 1482.54 2245.45 1217.58 1482.54 2245.63 1207 1482.54 2245.63 1217.58 1477.22 2245.63 1217.58 1477.22 2245.63 1207 1477.22 2247.25 1217.58 1477.22 2247.25 1207 1482.54 2247.25 1207 1482.54 2247.25 1217.58 1482.54 2247.44 1207 1482.54 2247.44 1217.58 1477.22 2247.44 1217.58 1477.22 2247.44 1207 1482.64 2245.63 1207 1482.64 2245.63 1217.58 1482.64 2247.25 1207 1482.64 2247.25 1217.58 1482.54 2247.25 1217.44 1477.32 2247.25 1217.44 1477.32 2245.63 1217.44 1482.54 2245.63 1217.44 1477.32 2247.25 1207.14 1477.32 2245.63 1207.14 1482.54 2247.25 1207.14 1482.54 2245.63 1207.14 1489.42 2261.35 1220 1477.42 2261.35 1220 1489.42 2261.35 1219 1489.42 2227.35 1220 1477.42 2261.35 1219 1477.42 2227.35 1220 1489.42 2227.35 1219 1477.42 2227.35 1219 1477.16 2227.35 1229.42 1477.16 2227.35 1220 1483.82 2227.35 1220 1483.82 2227.35 1229.42 1483.82 2227.67 1220 1483.82 2227.67 1229.42 1477.16 2227.67 1229.42 1477.16 2227.67 1220 1477.16 2230.51 1229.42 1477.16 2230.51 1220 1483.82 2230.51 1220 1483.82 2230.51 1229.42 1483.82 2230.83 1220 1483.82 2230.83 1229.42 1477.16 2230.83 1229.42 1477.16 2230.83 1220 1483.94 2227.67 1220 1483.94 2227.67 1229.42 1483.94 2230.51 1220 1483.94 2230.51 1229.42 1483.82 2230.51 1229.3 1477.29 2230.51 1229.3 1477.29 2227.67 1229.3 1483.82 2227.67 1229.3 1477.29 2230.51 1220.12 1477.29 2227.67 1220.12 1483.82 2230.51 1220.12 1483.82 2227.67 1220.12 1477.09 2231.07 1229.39 1477.09 2231.07 1220.01 1485.58 2231.07 1220.01 1485.58 2231.07 1229.39 1485.58 2231.23 1220.01 1485.58 2231.23 1229.39 1477.09 2231.23 1229.39 1477.09 2231.23 1220.01 1477.09 2232.71 1229.39 1477.09 2232.71 1220.01 1485.58 2232.71 1220.01 1485.58 2232.71 1229.39 1485.58 2232.87 1220.01 1485.58 2232.87 1229.39 1477.09 2232.87 1229.39 1477.09 2232.87 1220.01 1485.74 2231.23 1220.01 1485.74 2231.23 1229.39 1485.74 2232.71 1220.01 1485.74 2232.71 1229.39 1485.58 2232.71 1229.27 1477.25 2232.71 1229.27 1477.25 2231.23 1229.27 1485.58 2231.23 1229.27 1477.25 2232.71 1220.13 1477.25 2231.23 1220.13 1485.58 2232.71 1220.13 1485.58 2231.23 1220.13 1477.08 2233.12 1226.79 1477.08 2233.12 1220 1485.93 2233.12 1220 1485.93 2233.12 1226.79 1485.93 2233.36 1220 1485.93 2233.36 1226.79 1477.08 2233.36 1226.79 1477.08 2233.36 1220 1477.08 2235.5 1226.79 1477.08 2235.5 1220 1485.93 2235.5 1220 1485.93 2235.5 1226.79 1485.93 2235.74 1220 1485.93 2235.74 1226.79 1477.08 2235.74 1226.79 1477.08 2235.74 1220 1486.1 2233.36 1220 1486.1 2233.36 1226.79 1486.1 2235.5 1220 1486.1 2235.5 1226.79 1485.93 2235.5 1226.7 1477.25 2235.5 1226.7 1477.25 2233.36 1226.7 1485.93 2233.36 1226.7 1477.25 2235.5 1220.08 1477.25 2233.36 1220.08 1485.93 2235.5 1220.08 1485.93 2233.36 1220.08 1477.11 2235.99 1228.3 1477.11 2235.99 1220 1485.01 2235.99 1220 1485.01 2235.99 1228.3 1485.01 2236.15 1220 1485.01 2236.15 1228.3 1477.11 2236.15 1228.3 1477.11 2236.15 1220 1477.11 2237.61 1228.3 1477.11 2237.61 1220 1485.01 2237.61 1220 1485.01 2237.61 1228.3 1485.01 2237.77 1220 1485.01 2237.77 1228.3 1477.11 2237.77 1228.3 1477.11 2237.77 1220 1485.16 2236.15 1220 1485.16 2236.15 1228.3 1485.16 2237.61 1220 1485.16 2237.61 1228.3 1485.01 2237.61 1228.19 1477.26 2237.61 1228.19 1477.26 2236.15 1228.19 1485.01 2236.15 1228.19 1477.26 2237.61 1220.11 1477.26 2236.15 1220.11 1485.01 2237.61 1220.11 1485.01 2236.15 1220.11 1477.14 2238.02 1227.03 1477.14 2238.02 1220 1484.5 2238.02 1220 1484.5 2238.02 1227.03 1484.5 2238.2 1220 1484.5 2238.2 1227.03 1477.14 2238.2 1227.03 1477.14 2238.2 1220 1477.14 2239.78 1227.03 1477.14 2239.78 1220 1484.5 2239.78 1220 1484.5 2239.78 1227.03 1484.5 2239.96 1220 1484.5 2239.96 1227.03 1477.14 2239.96 1227.03 1477.14 2239.96 1220 1484.64 2238.2 1220 1484.64 2238.2 1227.03 1484.64 2239.78 1220 1484.64 2239.78 1227.03 1484.5 2239.78 1226.93 1477.28 2239.78 1226.93 1477.28 2238.2 1226.93 1484.5 2238.2 1226.93 1477.28 2239.78 1220.09 1477.28 2238.2 1220.09 1484.5 2239.78 1220.09 1484.5 2238.2 1220.09 1477.08 2240.2 1230.76 1477.08 2240.2 1220.01 1485.76 2240.2 1220.01 1485.76 2240.2 1230.76 1485.76 2240.28 1220.01 1485.76 2240.28 1230.76 1477.08 2240.28 1230.76 1477.08 2240.28 1220.01 1477.08 2241 1230.76 1477.08 2241 1220.01 1485.76 2241 1220.01 1485.76 2241 1230.76 1485.76 2241.08 1220.01 1485.76 2241.08 1230.76 1477.08 2241.08 1230.76 1477.08 2241.08 1220.01 1485.92 2240.28 1220.01 1485.92 2240.28 1230.76 1485.92 2241 1220.01 1485.92 2241 1230.76 1485.76 2241 1230.61 1477.25 2241 1230.61 1477.25 2240.28 1230.61 1485.76 2240.28 1230.61 1477.25 2241 1220.15 1477.25 2240.28 1220.15 1485.76 2241 1220.15 1485.76 2240.28 1220.15 1477.09 2241.34 1230.3 1477.09 2241.34 1220 1485.6 2241.34 1220 1485.6 2241.34 1230.3 1485.6 2241.39 1220 1485.6 2241.39 1230.3 1477.09 2241.39 1230.3 1477.09 2241.39 1220 1477.09 2241.83 1230.3 1477.09 2241.83 1220 1485.6 2241.83 1220 1485.6 2241.83 1230.3 1485.6 2241.88 1220 1485.6 2241.88 1230.3 1477.09 2241.88 1230.3 1477.09 2241.88 1220 1485.76 2241.39 1220 1485.76 2241.39 1230.3 1485.76 2241.83 1220 1485.76 2241.83 1230.3 1485.6 2241.83 1230.16 1477.25 2241.83 1230.16 1477.25 2241.39 1230.16 1485.6 2241.39 1230.16 1477.25 2241.83 1220.14 1477.25 2241.39 1220.14 1485.6 2241.83 1220.14 1485.6 2241.39 1220.14 1477.18 2242.12 1230.46 1477.18 2242.12 1220 1483.42 2242.12 1220 1483.42 2242.12 1230.46 1483.42 2242.31 1220 1483.42 2242.31 1230.46 1477.18 2242.31 1230.46 1477.18 2242.31 1220 1477.18 2243.95 1230.46 1477.18 2243.95 1220 1483.42 2243.95 1220 1483.42 2243.95 1230.46 1483.42 2244.14 1220 1483.42 2244.14 1230.46 1477.18 2244.14 1230.46 1477.18 2244.14 1220 1483.54 2242.31 1220 1483.54 2242.31 1230.46 1483.54 2243.95 1220 1483.54 2243.95 1230.46 1483.42 2243.95 1230.32 1477.3 2243.95 1230.32 1477.3 2242.31 1230.32 1483.42 2242.31 1230.32 1477.3 2243.95 1220.14 1477.3 2242.31 1220.14 1483.42 2243.95 1220.14 1483.42 2242.31 1220.14 1477.09 2244.38 1229.32 1477.09 2244.38 1220 1485.91 2244.38 1220 1485.91 2244.38 1229.32 1485.91 2244.57 1220 1485.91 2244.57 1229.32 1477.09 2244.57 1229.32 1477.09 2244.57 1220 1477.09 2246.25 1229.32 1477.09 2246.25 1220 1485.91 2246.25 1220 1485.91 2246.25 1229.32 1485.91 2246.44 1220 1485.91 2246.44 1229.32 1477.09 2246.44 1229.32 1477.09 2246.44 1220 1486.07 2244.57 1220 1486.07 2244.57 1229.32 1486.07 2246.25 1220 1486.07 2246.25 1229.32 1485.91 2246.25 1229.2 1477.26 2246.25 1229.2 1477.26 2244.57 1229.2 1485.91 2244.57 1229.2 1477.26 2246.25 1220.12 1477.26 2244.57 1220.12 1485.91 2246.25 1220.12 1485.91 2244.57 1220.12 1489.42 2261.35 1233 1477.42 2261.35 1233 1489.42 2261.35 1232 1489.42 2227.35 1233 1477.42 2261.35 1232 1477.42 2227.35 1233 1489.42 2227.35 1232 1477.42 2227.35 1232 1477.21 2227.34 1242.72 1477.21 2227.34 1233 1482.73 2227.34 1233 1482.73 2227.34 1242.72 1482.73 2227.55 1233 1482.73 2227.55 1242.72 1477.21 2227.55 1242.72 1477.21 2227.55 1233 1477.21 2229.39 1242.72 1477.21 2229.39 1233 1482.73 2229.39 1233 1482.73 2229.39 1242.72 1482.73 2229.6 1233 1482.73 2229.6 1242.72 1477.21 2229.6 1242.72 1477.21 2229.6 1233 1482.84 2227.55 1233 1482.84 2227.55 1242.72 1482.84 2229.39 1233 1482.84 2229.39 1242.72 1482.73 2229.39 1242.59 1477.31 2229.39 1242.59 1477.31 2227.55 1242.59 1482.73 2227.55 1242.59 1477.31 2229.39 1233.13 1477.31 2227.55 1233.13 1482.73 2229.39 1233.13 1482.73 2227.55 1233.13 1477.1 2229.85 1239.13 1477.1 2229.85 1233.01 1485.34 2229.85 1233.01 1485.34 2229.85 1239.13 1485.34 2230.02 1233.01 1485.34 2230.02 1239.13 1477.1 2230.02 1239.13 1477.1 2230.02 1233.01 1477.1 2231.6 1239.13 1477.1 2231.6 1233.01 1485.34 2231.6 1233.01 1485.34 2231.6 1239.13 1485.34 2231.77 1233.01 1485.34 2231.77 1239.13 1477.1 2231.77 1239.13 1477.1 2231.77 1233.01 1485.5 2230.02 1233.01 1485.5 2230.02 1239.13 1485.5 2231.6 1233.01 1485.5 2231.6 1239.13 1485.34 2231.6 1239.05 1477.26 2231.6 1239.05 1477.26 2230.02 1239.05 1485.34 2230.02 1239.05 1477.26 2231.6 1233.09 1477.26 2230.02 1233.09 1485.34 2231.6 1233.09 1485.34 2230.02 1233.09 1477.09 2232.02 1241.29 1477.09 2232.02 1233 1485.69 2232.02 1233 1485.69 2232.02 1241.29 1485.69 2232.21 1233 1485.69 2232.21 1241.29 1477.09 2232.21 1241.29 1477.09 2232.21 1233 1477.09 2233.91 1241.29 1477.09 2233.91 1233 1485.69 2233.91 1233 1485.69 2233.91 1241.29 1485.69 2234.1 1233 1485.69 2234.1 1241.29 1477.09 2234.1 1241.29 1477.09 2234.1 1233 1485.86 2232.21 1233 1485.86 2232.21 1241.29 1485.86 2233.91 1233 1485.86 2233.91 1241.29 1485.69 2233.91 1241.18 1477.25 2233.91 1241.18 1477.25 2232.21 1241.18 1485.69 2232.21 1241.18 1477.25 2233.91 1233.1 1477.25 2232.21 1233.1 1485.69 2233.91 1233.1 1485.69 2232.21 1233.1 1477.11 2234.35 1241.08 1477.11 2234.35 1233.01 1485.11 2234.35 1233.01 1485.11 2234.35 1241.08 1485.11 2234.59 1233.01 1485.11 2234.59 1241.08 1477.11 2234.59 1241.08 1477.11 2234.59 1233.01 1477.11 2236.71 1241.08 1477.11 2236.71 1233.01 1485.11 2236.71 1233.01 1485.11 2236.71 1241.08 1485.11 2236.95 1233.01 1485.11 2236.95 1241.08 1477.11 2236.95 1241.08 1477.11 2236.95 1233.01 1485.26 2234.59 1233.01 1485.26 2234.59 1241.08 1485.26 2236.71 1233.01 1485.26 2236.71 1241.08 1485.11 2236.71 1240.97 1477.27 2236.71 1240.97 1477.27 2234.59 1240.97 1485.11 2234.59 1240.97 1477.27 2236.71 1233.11 1477.27 2234.59 1233.11 1485.11 2236.71 1233.11 1485.11 2234.59 1233.11 1477.07 2237.19 1241.92 1477.07 2237.19 1233 1486.13 2237.19 1233 1486.13 2237.19 1241.92 1486.13 2237.55 1233 1486.13 2237.55 1241.92 1477.07 2237.55 1241.92 1477.07 2237.55 1233 1477.07 2240.7 1241.92 1477.07 2240.7 1233 1486.13 2240.7 1233 1486.13 2240.7 1241.92 1486.13 2241.05 1233 1486.13 2241.05 1241.92 1477.07 2241.05 1241.92 1477.07 2241.05 1233 1486.3 2237.55 1233 1486.3 2237.55 1241.92 1486.3 2240.7 1233 1486.3 2240.7 1241.92 1486.13 2240.7 1241.81 1477.25 2240.7 1241.81 1477.25 2237.55 1241.81 1486.13 2237.55 1241.81 1477.25 2240.7 1233.11 1477.25 2237.55 1233.11 1486.13 2240.7 1233.11 1486.13 2237.55 1233.11 1477.11 2241.29 1243.04 1477.11 2241.29 1233.01 1485.2 2241.29 1233.01 1485.2 2241.29 1243.04 1485.2 2241.43 1233.01 1485.2 2241.43 1243.04 1477.11 2241.43 1243.04 1477.11 2241.43 1233.01 1477.11 2242.71 1243.04 1477.11 2242.71 1233.01 1485.2 2242.71 1233.01 1485.2 2242.71 1243.04 1485.2 2242.85 1233.01 1485.2 2242.85 1243.04 1477.11 2242.85 1243.04 1477.11 2242.85 1233.01 1485.36 2241.43 1233.01 1485.36 2241.43 1243.04 1485.36 2242.71 1233.01 1485.36 2242.71 1243.04 1485.2 2242.71 1242.9 1477.26 2242.71 1242.9 1477.26 2241.43 1242.9 1485.2 2241.43 1242.9 1477.26 2242.71 1233.14 1477.26 2241.43 1233.14 1485.2 2242.71 1233.14 1485.2 2241.43 1233.14 1477.11 2243.1 1239.08 1477.11 2243.1 1233 1485.32 2243.1 1233 1485.32 2243.1 1239.08 1485.32 2243.22 1233 1485.32 2243.22 1239.08 1477.11 2243.22 1239.08 1477.11 2243.22 1233 1477.11 2244.26 1239.08 1477.11 2244.26 1233 1485.32 2244.26 1233 1485.32 2244.26 1239.08 1485.32 2244.38 1233 1485.32 2244.38 1239.08 1477.11 2244.38 1239.08 1477.11 2244.38 1233 1485.47 2243.22 1233 1485.47 2243.22 1239.08 1485.47 2244.26 1233 1485.47 2244.26 1239.08 1485.32 2244.26 1239 1477.27 2244.26 1239 1477.27 2243.22 1239 1485.32 2243.22 1239 1477.27 2244.26 1233.08 1477.27 2243.22 1233.08 1485.32 2244.26 1233.08 1485.32 2243.22 1233.08 1477.1 2244.62 1242.38 1477.1 2244.62 1233 1485.36 2244.62 1233 1485.36 2244.62 1242.38 1485.36 2244.74 1233 1485.36 2244.74 1242.38 1477.1 2244.74 1242.38 1477.1 2244.74 1233 1477.1 2245.74 1242.38 1477.1 2245.74 1233 1485.36 2245.74 1233 1485.36 2245.74 1242.38 1485.36 2245.86 1233 1485.36 2245.86 1242.38 1477.1 2245.86 1242.38 1477.1 2245.86 1233 1485.52 2244.74 1233 1485.52 2244.74 1242.38 1485.52 2245.74 1233 1485.52 2245.74 1242.38 1485.36 2245.74 1242.26 1477.26 2245.74 1242.26 1477.26 2244.74 1242.26 1485.36 2244.74 1242.26 1477.26 2245.74 1233.12 1477.26 2244.74 1233.12 1485.36 2245.74 1233.12 1485.36 2244.74 1233.12 1489.42 2261.35 1246 1477.42 2261.35 1246 1489.42 2261.35 1245 1489.42 2227.35 1246 1477.42 2261.35 1245 1477.42 2227.35 1246 1489.42 2227.35 1245 1477.42 2227.35 1245 1556.58 2154.17 1165 1544.58 2154.17 1165 1544.58 2153.21 1165 1556.58 2153.21 1165 1544.58 2154.17 1141 1544.58 2153.21 1141 1556.58 2153.21 1141 1556.58 2154.17 1141 1556.58 2177.21 1165 1544.58 2177.21 1165 1556.58 2177.21 1141 1544.58 2177.21 1141 1544.58 2177.21 1141.96 1556.58 2177.21 1141.96 1549.14 2177.69 1158.86 1552.02 2177.69 1158.86 1552.02 2177.69 1158.09 1549.14 2177.69 1158.09 1549.14 2177.21 1158.86 1549.14 2177.21 1158.09 1552.02 2177.21 1158.86 1552.02 2177.21 1158.09 1549.14 2177.69 1147.91 1552.02 2177.69 1147.91 1552.02 2177.69 1147.14 1549.14 2177.69 1147.14 1549.14 2177.21 1147.91 1549.14 2177.21 1147.14 1552.02 2177.21 1147.91 1552.02 2177.21 1147.14 1555.52 2176.92 1142.06 1545.64 2176.92 1142.06 1545.64 2176.92 1153 1555.52 2176.92 1153 1545.54 2177.21 1164.04 1555.62 2177.21 1164.04 1555.52 2176.92 1163.94 1545.64 2176.92 1163.94 1545.54 2177.21 1141.96 1555.62 2177.21 1141.96 1545.54 2177.21 1165 1555.62 2177.21 1165 1572.33 2154.17 1165 1560.33 2154.17 1165 1560.33 2153.21 1165 1572.33 2153.21 1165 1560.33 2154.17 1141 1560.33 2153.21 1141 1572.33 2153.21 1141 1572.33 2154.17 1141 1572.33 2177.21 1165 1560.33 2177.21 1165 1572.33 2177.21 1141 1560.33 2177.21 1141 1560.33 2177.21 1141.96 1572.33 2177.21 1141.96 1564.89 2177.69 1158.86 1567.77 2177.69 1158.86 1567.77 2177.69 1158.09 1564.89 2177.69 1158.09 1564.89 2177.21 1158.86 1564.89 2177.21 1158.09 1567.77 2177.21 1158.86 1567.77 2177.21 1158.09 1564.89 2177.69 1147.91 1567.77 2177.69 1147.91 1567.77 2177.69 1147.14 1564.89 2177.69 1147.14 1564.89 2177.21 1147.91 1564.89 2177.21 1147.14 1567.77 2177.21 1147.91 1567.77 2177.21 1147.14 1571.27 2176.92 1142.06 1561.39 2176.92 1142.06 1561.39 2176.92 1153 1571.27 2176.92 1153 1561.29 2177.21 1164.04 1571.37 2177.21 1164.04 1571.27 2176.92 1163.94 1561.39 2176.92 1163.94 1561.29 2177.21 1141.96 1571.37 2177.21 1141.96 1561.29 2177.21 1165 1571.37 2177.21 1165 1602.76 2154.17 1165 1590.76 2154.17 1165 1590.76 2153.21 1165 1602.76 2153.21 1165 1590.76 2154.17 1141 1590.76 2153.21 1141 1602.76 2153.21 1141 1602.76 2154.17 1141 1602.76 2177.21 1165 1590.76 2177.21 1165 1602.76 2177.21 1141 1590.76 2177.21 1141 1590.76 2177.21 1141.96 1602.76 2177.21 1141.96 1595.32 2177.69 1158.86 1598.2 2177.69 1158.86 1598.2 2177.69 1158.09 1595.32 2177.69 1158.09 1595.32 2177.21 1158.86 1595.32 2177.21 1158.09 1598.2 2177.21 1158.86 1598.2 2177.21 1158.09 1595.32 2177.69 1147.91 1598.2 2177.69 1147.91 1598.2 2177.69 1147.14 1595.32 2177.69 1147.14 1595.32 2177.21 1147.91 1595.32 2177.21 1147.14 1598.2 2177.21 1147.91 1598.2 2177.21 1147.14 1601.7 2176.92 1142.06 1591.82 2176.92 1142.06 1591.82 2176.92 1153 1601.7 2176.92 1153 1591.72 2177.21 1164.04 1601.8 2177.21 1164.04 1601.7 2176.92 1163.94 1591.82 2176.92 1163.94 1591.72 2177.21 1141.96 1601.8 2177.21 1141.96 1591.72 2177.21 1165 1601.8 2177.21 1165 1587.02 2154.17 1165 1575.02 2154.17 1165 1575.02 2153.21 1165 1587.02 2153.21 1165 1575.02 2154.17 1141 1575.02 2153.21 1141 1587.02 2153.21 1141 1587.02 2154.17 1141 1587.02 2177.21 1165 1575.02 2177.21 1165 1587.02 2177.21 1141 1575.02 2177.21 1141 1575.02 2177.21 1141.96 1587.02 2177.21 1141.96 1579.58 2177.69 1158.86 1582.46 2177.69 1158.86 1582.46 2177.69 1158.09 1579.58 2177.69 1158.09 1579.58 2177.21 1158.86 1579.58 2177.21 1158.09 1582.46 2177.21 1158.86 1582.46 2177.21 1158.09 1579.58 2177.69 1147.91 1582.46 2177.69 1147.91 1582.46 2177.69 1147.14 1579.58 2177.69 1147.14 1579.58 2177.21 1147.91 1579.58 2177.21 1147.14 1582.46 2177.21 1147.91 1582.46 2177.21 1147.14 1585.96 2176.92 1142.06 1576.08 2176.92 1142.06 1576.08 2176.92 1153 1585.96 2176.92 1153 1575.98 2177.21 1164.04 1586.06 2177.21 1164.04 1585.96 2176.92 1163.94 1576.08 2176.92 1163.94 1575.98 2177.21 1141.96 1586.06 2177.21 1141.96 1575.98 2177.21 1165 1586.06 2177.21 1165 1647.05 2257.1 1189 1647.05 2210.7 1189 1647.05 2210.7 1227 1647.05 2257.1 1227 1646.55 2209.9 1188 1646.55 2209.9 1228 1647.55 2209.9 1188 1647.55 2209.9 1228 1646.55 2257.9 1228 1646.55 2257.9 1188 1647.55 2257.9 1228 1647.55 2257.9 1188 1646.55 2210.7 1227 1646.55 2210.7 1189 1646.55 2257.1 1227 1646.55 2257.1 1189 1647.55 2210.7 1227 1647.55 2210.7 1189 1647.55 2257.1 1189 1647.55 2257.1 1227 1571.59 2153.19 1212.89 1571.59 2153.19 1213.01 1570.99 2153.19 1212.89 1570.99 2153.19 1213.01 1573.67 2153.19 1215.09 1573.79 2153.19 1215.09 1573.67 2153.19 1215.69 1573.79 2153.19 1215.69 1575.87 2153.19 1213.01 1575.87 2153.19 1212.89 1576.47 2153.19 1213.01 1576.47 2153.19 1212.89 1573.79 2153.19 1210.81 1573.67 2153.19 1210.81 1573.79 2153.19 1210.21 1573.67 2153.19 1210.21 1574.03 2153.19 1213.15 1573.87 2153.19 1213.28 1572.49 2153.19 1211.31 1572.33 2153.19 1211.44 1571.97 2153.19 1210.85 1573.78 2153.19 1212.66 1574.01 2153.19 1212.85 1572.63 2153.19 1214.04 1572.85 2153.19 1214.23 1572.41 2153.19 1214.53 1568.87 2152.45 1212.36 1568.87 2151.84 1212.36 1569.2 2152.45 1211.12 1569.2 2151.84 1211.12 1569.84 2152.45 1210.02 1569.84 2151.84 1210.02 1570.75 2152.45 1209.11 1570.75 2151.84 1209.11 1571.85 2152.45 1208.47 1571.85 2151.84 1208.47 1573.09 2152.45 1208.14 1573.09 2151.84 1208.14 1574.37 2152.45 1208.14 1574.37 2151.84 1208.14 1575.61 2152.45 1208.47 1575.61 2151.84 1208.47 1576.71 2152.45 1209.11 1576.71 2151.84 1209.11 1577.62 2152.45 1210.02 1577.62 2151.84 1210.02 1578.26 2152.45 1211.12 1578.26 2151.84 1211.12 1578.59 2152.45 1212.36 1578.59 2151.84 1212.36 1578.59 2152.45 1213.64 1578.59 2151.84 1213.64 1578.26 2152.45 1214.88 1578.26 2151.84 1214.88 1577.62 2152.45 1215.98 1577.62 2151.84 1215.98 1576.71 2152.45 1216.89 1576.71 2151.84 1216.89 1575.61 2152.45 1217.53 1575.61 2151.84 1217.53 1574.37 2152.45 1217.86 1574.37 2151.84 1217.86 1573.09 2152.45 1217.86 1573.09 2151.84 1217.86 1571.85 2152.45 1217.53 1571.85 2151.84 1217.53 1570.75 2152.45 1216.89 1570.75 2151.84 1216.89 1569.84 2152.45 1215.98 1569.84 2151.84 1215.98 1569.2 2152.45 1214.88 1569.2 2151.84 1214.88 1568.87 2152.45 1213.64 1568.87 2151.84 1213.64 1570.22 2153.34 1212.47 1570.46 2153.34 1211.57 1570.93 2153.34 1210.76 1571.59 2153.34 1210.1 1572.4 2153.34 1209.64 1573.3 2153.34 1209.39 1574.23 2153.34 1209.39 1575.14 2153.34 1209.64 1575.94 2153.34 1210.1 1576.6 2153.34 1210.76 1577.07 2153.34 1211.57 1577.31 2153.34 1212.47 1577.31 2153.34 1213.41 1577.07 2153.34 1214.31 1576.6 2153.34 1215.12 1575.94 2153.34 1215.78 1575.14 2153.34 1216.24 1574.23 2153.34 1216.49 1573.3 2153.34 1216.49 1572.4 2153.34 1216.24 1571.59 2153.34 1215.78 1570.93 2153.34 1215.12 1570.46 2153.34 1214.31 1570.22 2153.34 1213.41 1570.8 2153.34 1212.48 1571 2153.34 1211.74 1571.38 2153.34 1211.07 1571.92 2153.34 1210.53 1572.59 2153.34 1210.15 1573.33 2153.34 1209.95 1574.1 2153.34 1209.95 1574.84 2153.34 1210.15 1575.5 2153.34 1210.53 1576.05 2153.34 1211.07 1576.43 2153.34 1211.74 1576.63 2153.34 1212.48 1576.63 2153.34 1213.25 1576.43 2153.34 1213.99 1576.05 2153.34 1214.65 1575.5 2153.34 1215.2 1574.84 2153.34 1215.58 1574.1 2153.34 1215.78 1573.33 2153.34 1215.78 1572.59 2153.34 1215.58 1571.92 2153.34 1215.2 1571.38 2153.34 1214.65 1571 2153.34 1213.99 1570.8 2153.34 1213.25 4 0 1 8 9 0.286061 0.22624 0.159772 1 4 9 8 12 13 0.286061 0.22624 0.159772 1 4 13 2 0 9 0.286061 0.22624 0.159772 1 4 13 12 3 2 0.286061 0.22624 0.159772 1 4 1 0 2 3 0.286061 0.22624 0.159772 1 4 12 8 1 3 0.286061 0.22624 0.159772 1 4 11 10 4 5 0.286061 0.22624 0.159772 1 4 4 6 7 5 0.286061 0.22624 0.159772 1 4 7 14 11 5 0.286061 0.22624 0.159772 1 4 14 7 6 15 0.286061 0.22624 0.159772 1 4 10 11 14 15 0.286061 0.22624 0.159772 1 4 6 4 10 15 0.286061 0.22624 0.159772 1 4 1 4 10 8 0.286061 0.22624 0.159772 1 4 4 6 15 10 0.286061 0.22624 0.159772 1 4 8 10 15 12 0.286061 0.22624 0.159772 1 4 12 15 6 3 0.286061 0.22624 0.159772 1 4 1 8 12 3 0.286061 0.22624 0.159772 1 4 6 4 1 3 0.286061 0.22624 0.159772 1 4 5 0 9 11 0.286061 0.22624 0.159772 1 4 11 14 7 5 0.286061 0.22624 0.159772 1 4 7 2 0 5 0.286061 0.22624 0.159772 1 4 2 7 14 13 0.286061 0.22624 0.159772 1 4 9 0 2 13 0.286061 0.22624 0.159772 1 4 11 9 13 14 0.286061 0.22624 0.159772 1 4 16 17 18 19 1 1 1 1 4 17 16 19 18 0.4 0.3 0.2 1 4 24 23 20 21 0.286061 0.22624 0.159772 1 4 23 25 22 20 0.286061 0.22624 0.159772 1 4 25 24 21 22 0.286061 0.22624 0.159772 1 4 233 231 229 227 0.9 0.4 0.1 1 4 225 223 221 219 0.9 0.4 0.1 1 4 217 215 213 211 0.9 0.4 0.1 1 4 209 207 205 203 0.9 0.4 0.1 1 3 201 200 199 0.9 0.4 0.1 1 3 198 197 196 0.9 0.4 0.1 1 3 195 194 193 0.9 0.4 0.1 1 3 192 191 190 0.9 0.4 0.1 1 3 189 188 187 0.9 0.4 0.1 1 3 186 185 184 0.9 0.4 0.1 1 3 183 182 181 0.9 0.4 0.1 1 3 180 179 178 0.9 0.4 0.1 1 3 177 176 175 0.9 0.4 0.1 1 3 174 173 172 0.9 0.4 0.1 1 3 171 170 169 0.9 0.4 0.1 1 3 168 167 166 0.9 0.4 0.1 1 3 165 164 163 0.9 0.4 0.1 1 3 162 161 160 0.9 0.4 0.1 1 3 159 158 157 0.9 0.4 0.1 1 3 156 155 154 0.9 0.4 0.1 1 4 153 152 151 150 0.9 0.4 0.1 1 4 149 148 147 146 0.9 0.4 0.1 1 4 145 144 143 142 0.9 0.4 0.1 1 4 141 140 139 138 0.9 0.4 0.1 1 4 137 136 135 134 0.9 0.4 0.1 1 4 133 132 131 130 0.9 0.4 0.1 1 4 129 128 127 126 0.9 0.4 0.1 1 4 125 124 123 122 0.9 0.4 0.1 1 4 121 120 119 118 0.9 0.4 0.1 1 4 117 116 115 114 0.9 0.4 0.1 1 4 113 112 111 110 0.9 0.4 0.1 1 4 109 108 107 106 0.9 0.4 0.1 1 4 105 104 103 102 0.9 0.4 0.1 1 4 101 100 99 98 0.9 0.4 0.1 1 4 97 96 95 94 0.9 0.4 0.1 1 4 93 92 91 90 0.9 0.4 0.1 1 4 89 88 87 86 0.9 0.4 0.1 1 4 85 84 83 82 0.9 0.4 0.1 1 4 81 80 79 78 0.9 0.4 0.1 1 4 77 76 75 74 0.9 0.4 0.1 1 4 73 72 71 70 0.9 0.4 0.1 1 4 69 68 67 66 0.9 0.4 0.1 1 4 65 64 63 62 0.9 0.4 0.1 1 4 61 60 59 58 0.9 0.4 0.1 1 4 57 56 55 54 0.9 0.4 0.1 1 4 53 52 51 50 0.9 0.4 0.1 1 4 49 48 47 46 0.9 0.4 0.1 1 4 45 44 43 42 0.9 0.4 0.1 1 4 41 40 39 38 0.9 0.4 0.1 1 4 37 36 35 34 0.9 0.4 0.1 1 4 33 32 31 30 0.9 0.4 0.1 1 4 29 28 27 26 0.9 0.4 0.1 1 4 232 226 69 66 0.9 0.4 0.1 1 4 230 232 71 72 0.9 0.4 0.1 1 4 228 230 49 46 0.9 0.4 0.1 1 4 226 228 43 44 0.9 0.4 0.1 1 4 224 218 133 130 0.9 0.4 0.1 1 4 222 224 135 136 0.9 0.4 0.1 1 4 220 222 113 110 0.9 0.4 0.1 1 4 218 220 107 108 0.9 0.4 0.1 1 4 216 210 101 98 0.9 0.4 0.1 1 4 214 216 91 92 0.9 0.4 0.1 1 4 212 214 117 114 0.9 0.4 0.1 1 4 210 212 119 120 0.9 0.4 0.1 1 4 208 202 55 56 0.9 0.4 0.1 1 4 206 208 37 34 0.9 0.4 0.1 1 4 204 206 27 28 0.9 0.4 0.1 1 4 202 204 53 50 0.9 0.4 0.1 1 4 201 199 42 43 0.9 0.4 0.1 1 4 200 201 46 47 0.9 0.4 0.1 1 4 199 200 38 39 0.9 0.4 0.1 1 4 198 196 28 29 0.9 0.4 0.1 1 4 197 198 40 41 0.9 0.4 0.1 1 4 196 197 52 53 0.9 0.4 0.1 1 4 195 193 48 49 0.9 0.4 0.1 1 4 194 195 72 73 0.9 0.4 0.1 1 4 193 194 60 61 0.9 0.4 0.1 1 4 192 190 50 51 0.9 0.4 0.1 1 4 191 192 58 59 0.9 0.4 0.1 1 4 190 191 54 55 0.9 0.4 0.1 1 4 189 187 70 71 0.9 0.4 0.1 1 4 188 189 66 67 0.9 0.4 0.1 1 4 187 188 62 63 0.9 0.4 0.1 1 4 186 184 56 57 0.9 0.4 0.1 1 4 185 186 64 65 0.9 0.4 0.1 1 4 184 185 36 37 0.9 0.4 0.1 1 4 183 181 30 31 0.9 0.4 0.1 1 4 182 183 26 27 0.9 0.4 0.1 1 4 181 182 34 35 0.9 0.4 0.1 1 4 180 178 68 69 0.9 0.4 0.1 1 4 179 180 44 45 0.9 0.4 0.1 1 4 178 179 32 33 0.9 0.4 0.1 1 4 177 175 90 91 0.9 0.4 0.1 1 4 176 177 98 99 0.9 0.4 0.1 1 4 175 176 94 95 0.9 0.4 0.1 1 4 174 172 108 109 0.9 0.4 0.1 1 4 173 174 96 97 0.9 0.4 0.1 1 4 172 173 132 133 0.9 0.4 0.1 1 4 171 169 100 101 0.9 0.4 0.1 1 4 170 171 120 121 0.9 0.4 0.1 1 4 169 170 128 129 0.9 0.4 0.1 1 4 168 166 130 131 0.9 0.4 0.1 1 4 167 168 126 127 0.9 0.4 0.1 1 4 166 167 134 135 0.9 0.4 0.1 1 4 165 163 118 119 0.9 0.4 0.1 1 4 164 165 114 115 0.9 0.4 0.1 1 4 163 164 122 123 0.9 0.4 0.1 1 4 162 160 112 113 0.9 0.4 0.1 1 4 161 162 136 137 0.9 0.4 0.1 1 4 160 161 124 125 0.9 0.4 0.1 1 4 159 157 104 105 0.9 0.4 0.1 1 4 158 159 116 117 0.9 0.4 0.1 1 4 157 158 92 93 0.9 0.4 0.1 1 4 156 154 106 107 0.9 0.4 0.1 1 4 155 156 110 111 0.9 0.4 0.1 1 4 154 155 102 103 0.9 0.4 0.1 1 4 153 150 97 94 0.9 0.4 0.1 1 4 152 153 99 100 0.9 0.4 0.1 1 4 151 152 129 126 0.9 0.4 0.1 1 4 150 151 131 132 0.9 0.4 0.1 1 4 149 146 121 118 0.9 0.4 0.1 1 4 148 149 123 124 0.9 0.4 0.1 1 4 147 148 137 134 0.9 0.4 0.1 1 4 146 147 127 128 0.9 0.4 0.1 1 4 145 142 111 112 0.9 0.4 0.1 1 4 144 145 125 122 0.9 0.4 0.1 1 4 143 144 115 116 0.9 0.4 0.1 1 4 142 143 105 102 0.9 0.4 0.1 1 4 141 138 95 96 0.9 0.4 0.1 1 4 140 141 109 106 0.9 0.4 0.1 1 4 139 140 103 104 0.9 0.4 0.1 1 4 138 139 93 90 0.9 0.4 0.1 1 4 89 86 33 30 0.9 0.4 0.1 1 4 88 89 35 36 0.9 0.4 0.1 1 4 87 88 65 62 0.9 0.4 0.1 1 4 86 87 67 68 0.9 0.4 0.1 1 4 85 82 57 54 0.9 0.4 0.1 1 4 84 85 59 60 0.9 0.4 0.1 1 4 83 84 73 70 0.9 0.4 0.1 1 4 82 83 63 64 0.9 0.4 0.1 1 4 81 78 47 48 0.9 0.4 0.1 1 4 80 81 61 58 0.9 0.4 0.1 1 4 79 80 51 52 0.9 0.4 0.1 1 4 78 79 41 38 0.9 0.4 0.1 1 4 77 74 31 32 0.9 0.4 0.1 1 4 76 77 45 42 0.9 0.4 0.1 1 4 75 76 39 40 0.9 0.4 0.1 1 4 74 75 29 26 0.9 0.4 0.1 1 4 222 136 162 113 0.9 0.4 0.1 1 4 220 110 156 107 0.9 0.4 0.1 1 4 218 108 172 133 0.9 0.4 0.1 1 4 224 130 166 135 0.9 0.4 0.1 1 4 173 97 150 132 0.9 0.4 0.1 1 4 176 99 153 94 0.9 0.4 0.1 1 4 169 129 152 100 0.9 0.4 0.1 1 4 168 131 151 126 0.9 0.4 0.1 1 4 170 121 146 128 0.9 0.4 0.1 1 4 163 123 149 118 0.9 0.4 0.1 1 4 161 137 148 124 0.9 0.4 0.1 1 4 167 127 147 134 0.9 0.4 0.1 1 4 212 114 165 119 0.9 0.4 0.1 1 4 210 120 171 101 0.9 0.4 0.1 1 4 216 98 177 91 0.9 0.4 0.1 1 4 214 92 158 117 0.9 0.4 0.1 1 4 155 111 142 102 0.9 0.4 0.1 1 4 160 125 145 112 0.9 0.4 0.1 1 4 164 115 144 122 0.9 0.4 0.1 1 4 159 105 143 116 0.9 0.4 0.1 1 4 175 95 138 90 0.9 0.4 0.1 1 4 174 109 141 96 0.9 0.4 0.1 1 4 154 103 140 106 0.9 0.4 0.1 1 4 157 93 139 104 0.9 0.4 0.1 1 4 228 46 201 43 0.9 0.4 0.1 1 4 226 44 180 69 0.9 0.4 0.1 1 4 178 33 86 68 0.9 0.4 0.1 1 4 181 35 89 30 0.9 0.4 0.1 1 4 185 65 88 36 0.9 0.4 0.1 1 4 188 67 87 62 0.9 0.4 0.1 1 4 186 57 82 64 0.9 0.4 0.1 1 4 191 59 85 54 0.9 0.4 0.1 1 4 194 73 84 60 0.9 0.4 0.1 1 4 187 63 83 70 0.9 0.4 0.1 1 4 202 50 190 55 0.9 0.4 0.1 1 4 208 56 184 37 0.9 0.4 0.1 1 4 200 47 78 38 0.9 0.4 0.1 1 4 193 61 81 48 0.9 0.4 0.1 1 4 192 51 80 58 0.9 0.4 0.1 1 4 197 41 79 52 0.9 0.4 0.1 1 4 183 31 74 26 0.9 0.4 0.1 1 4 179 45 77 32 0.9 0.4 0.1 1 4 199 39 76 42 0.9 0.4 0.1 1 4 198 29 75 40 0.9 0.4 0.1 1 4 232 66 189 71 0.9 0.4 0.1 1 4 230 72 195 49 0.9 0.4 0.1 1 4 206 34 182 27 0.9 0.4 0.1 1 4 204 28 196 53 0.9 0.4 0.1 1 4 234 235 236 237 0.06 0.06 0.06 1 4 238 239 240 241 0.06 0.06 0.06 1 4 242 243 244 245 0.06 0.06 0.06 1 4 246 247 248 249 0.06 0.06 0.06 1 4 250 251 252 253 0.06 0.06 0.06 1 4 254 255 256 257 0.06 0.06 0.06 1 4 258 259 260 261 0.06 0.06 0.06 1 4 262 263 264 265 0.06 0.06 0.06 1 4 266 267 268 269 0.06 0.06 0.06 1 4 270 271 272 273 0.06 0.06 0.06 1 4 274 275 276 277 0.06 0.06 0.06 1 4 278 279 280 281 0.06 0.06 0.06 1 4 282 283 284 285 0.06 0.06 0.06 1 4 286 287 288 289 0.06 0.06 0.06 1 4 290 291 292 293 0.06 0.06 0.06 1 4 294 295 296 297 0.06 0.06 0.06 1 4 298 299 300 301 0.06 0.06 0.06 1 4 302 303 305 304 0.06 0.06 0.06 1 4 304 305 307 306 0.06 0.06 0.06 1 4 306 307 309 308 0.06 0.06 0.06 1 4 308 309 311 310 0.06 0.06 0.06 1 4 310 311 313 312 0.06 0.06 0.06 1 4 312 313 315 314 0.06 0.06 0.06 1 4 314 315 317 316 0.06 0.06 0.06 1 4 316 317 303 302 0.06 0.06 0.06 1 4 318 319 321 320 0.08 0.08 0.08 1 4 320 321 323 322 0.08 0.08 0.08 1 4 322 323 325 324 0.08 0.08 0.08 1 4 324 325 327 326 0.08 0.08 0.08 1 4 326 327 329 328 0.08 0.08 0.08 1 4 328 329 331 330 0.08 0.08 0.08 1 4 330 331 333 332 0.08 0.08 0.08 1 4 332 333 319 318 0.08 0.08 0.08 1 8 334 335 336 337 338 339 340 341 0.08 0.08 0.08 1 8 342 343 344 345 346 347 348 349 0.08 0.08 0.08 1 4 350 351 353 352 0.08 0.08 0.08 1 4 352 353 355 354 0.08 0.08 0.08 1 4 354 355 357 356 0.08 0.08 0.08 1 4 356 357 359 358 0.08 0.08 0.08 1 4 358 359 361 360 0.08 0.08 0.08 1 4 360 361 363 362 0.08 0.08 0.08 1 4 362 363 365 364 0.08 0.08 0.08 1 4 364 365 351 350 0.08 0.08 0.08 1 8 366 367 368 369 370 371 372 373 0.08 0.08 0.08 1 8 374 375 376 377 378 379 380 381 0.08 0.08 0.08 1 4 382 383 384 385 0.6 0.6 0 1 4 386 387 385 384 0.6 0.3 0.2 1 3 388 387 386 0.1 0.1 0.1 1 4 389 382 385 390 0.6 0.6 0 1 4 387 391 390 385 0.6 0.3 0.2 1 3 388 391 387 0.1 0.1 0.1 1 4 392 389 390 393 0.6 0.6 0 1 4 391 394 393 390 0.6 0.3 0.2 1 3 388 394 391 0.1 0.1 0.1 1 4 395 392 393 396 0.6 0.6 0 1 4 394 397 396 393 0.6 0.3 0.2 1 3 388 397 394 0.1 0.1 0.1 1 4 398 395 396 399 0.6 0.6 0 1 4 397 400 399 396 0.6 0.3 0.2 1 3 388 400 397 0.1 0.1 0.1 1 4 383 398 399 384 0.6 0.6 0 1 4 400 386 384 399 0.6 0.3 0.2 1 3 388 386 400 0.1 0.1 0.1 1 6 382 389 392 395 398 383 0.6 0.3 0.2 1 6 401 402 403 404 405 406 0.1 0.1 0.1 1 4 408 407 410 409 0.6 0.6 0 1 4 412 411 409 410 0.6 0.3 0.2 1 3 412 413 411 0.1 0.1 0.1 1 4 407 414 415 410 0.6 0.6 0 1 4 416 412 410 415 0.6 0.3 0.2 1 3 416 413 412 0.1 0.1 0.1 1 4 414 417 418 415 0.6 0.6 0 1 4 419 416 415 418 0.6 0.3 0.2 1 3 419 413 416 0.1 0.1 0.1 1 4 417 420 421 418 0.6 0.6 0 1 4 422 419 418 421 0.6 0.3 0.2 1 3 422 413 419 0.1 0.1 0.1 1 4 420 423 424 421 0.6 0.6 0 1 4 425 422 421 424 0.6 0.3 0.2 1 3 425 413 422 0.1 0.1 0.1 1 4 423 408 409 424 0.6 0.6 0 1 4 411 425 424 409 0.6 0.3 0.2 1 3 411 413 425 0.1 0.1 0.1 1 6 414 407 408 423 420 417 0.6 0.3 0.2 1 6 427 426 431 430 429 428 0.1 0.1 0.1 1 4 433 432 435 434 0.6 0.6 0 1 4 437 436 434 435 0.6 0.3 0.2 1 3 437 438 436 0.1 0.1 0.1 1 4 432 439 440 435 0.6 0.6 0 1 4 441 437 435 440 0.6 0.3 0.2 1 3 441 438 437 0.1 0.1 0.1 1 4 439 442 443 440 0.6 0.6 0 1 4 444 441 440 443 0.6 0.3 0.2 1 3 444 438 441 0.1 0.1 0.1 1 4 442 445 446 443 0.6 0.6 0 1 4 447 444 443 446 0.6 0.3 0.2 1 3 447 438 444 0.1 0.1 0.1 1 4 445 448 449 446 0.6 0.6 0 1 4 450 447 446 449 0.6 0.3 0.2 1 3 450 438 447 0.1 0.1 0.1 1 4 448 433 434 449 0.6 0.6 0 1 4 436 450 449 434 0.6 0.3 0.2 1 3 436 438 450 0.1 0.1 0.1 1 6 439 432 433 448 445 442 0.6 0.3 0.2 1 6 452 451 456 455 454 453 0.1 0.1 0.1 1 4 457 458 459 460 0.6 0.6 0 1 4 461 462 460 459 0.6 0.3 0.2 1 3 463 462 461 0.1 0.1 0.1 1 4 464 457 460 465 0.6 0.6 0 1 4 462 466 465 460 0.6 0.3 0.2 1 3 463 466 462 0.1 0.1 0.1 1 4 467 464 465 468 0.6 0.6 0 1 4 466 469 468 465 0.6 0.3 0.2 1 3 463 469 466 0.1 0.1 0.1 1 4 470 467 468 471 0.6 0.6 0 1 4 469 472 471 468 0.6 0.3 0.2 1 3 463 472 469 0.1 0.1 0.1 1 4 473 470 471 474 0.6 0.6 0 1 4 472 475 474 471 0.6 0.3 0.2 1 3 463 475 472 0.1 0.1 0.1 1 4 458 473 474 459 0.6 0.6 0 1 4 475 461 459 474 0.6 0.3 0.2 1 3 463 461 475 0.1 0.1 0.1 1 6 457 464 467 470 473 458 0.6 0.3 0.2 1 6 476 477 478 479 480 481 0.1 0.1 0.1 1 4 555 537 536 556 0.8 0.8 0.8 1 4 554 538 537 555 0.8 0.8 0.8 1 4 553 539 538 554 0.8 0.8 0.8 1 4 552 540 539 553 0.8 0.8 0.8 1 4 551 541 540 552 0.8 0.8 0.8 1 4 550 542 541 551 0.8 0.8 0.8 1 4 549 543 542 550 0.8 0.8 0.8 1 4 548 544 543 549 0.8 0.8 0.8 1 4 547 545 544 548 0.8 0.8 0.8 1 4 546 514 545 547 0.8 0.8 0.8 1 4 577 515 514 546 0.8 0.8 0.8 1 4 576 516 515 577 0.8 0.8 0.8 1 4 575 517 516 576 0.8 0.8 0.8 1 4 574 518 517 575 0.8 0.8 0.8 1 4 573 519 518 574 0.8 0.8 0.8 1 4 572 520 519 573 0.8 0.8 0.8 1 4 571 521 520 572 0.8 0.8 0.8 1 4 570 522 521 571 0.8 0.8 0.8 1 4 569 523 522 570 0.8 0.8 0.8 1 4 568 524 523 569 0.8 0.8 0.8 1 4 567 525 524 568 0.8 0.8 0.8 1 4 566 526 525 567 0.8 0.8 0.8 1 4 565 527 526 566 0.8 0.8 0.8 1 4 564 528 527 565 0.8 0.8 0.8 1 4 563 529 528 564 0.8 0.8 0.8 1 4 562 530 529 563 0.8 0.8 0.8 1 4 561 531 530 562 0.8 0.8 0.8 1 4 560 532 531 561 0.8 0.8 0.8 1 4 559 533 532 560 0.8 0.8 0.8 1 4 558 534 533 559 0.8 0.8 0.8 1 4 557 535 534 558 0.8 0.8 0.8 1 4 556 536 535 557 0.8 0.8 0.8 1 32 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 0.8 0.8 0.8 1 4 482 514 515 483 0.863 0.165 0.304 1 4 483 515 516 484 0.863 0.165 0.304 1 4 484 516 517 485 0.863 0.165 0.304 1 4 485 517 518 486 0.863 0.165 0.304 1 4 486 518 519 487 0.863 0.165 0.304 1 4 487 519 520 488 0.863 0.165 0.304 1 4 488 520 521 489 0.863 0.165 0.304 1 4 489 521 522 490 0.863 0.165 0.304 1 4 490 522 523 491 0.863 0.165 0.304 1 4 491 523 524 492 0.863 0.165 0.304 1 4 492 524 525 493 0.863 0.165 0.304 1 4 493 525 526 494 0.863 0.165 0.304 1 4 494 526 527 495 0.863 0.165 0.304 1 4 495 527 528 496 0.863 0.165 0.304 1 4 496 528 529 497 0.863 0.165 0.304 1 4 497 529 530 498 0.863 0.165 0.304 1 4 498 530 531 499 0.863 0.165 0.304 1 4 499 531 532 500 0.863 0.165 0.304 1 4 500 532 533 501 0.863 0.165 0.304 1 4 501 533 534 502 0.863 0.165 0.304 1 4 502 534 535 503 0.863 0.165 0.304 1 4 503 535 536 504 0.863 0.165 0.304 1 4 504 536 537 505 0.863 0.165 0.304 1 4 505 537 538 506 0.863 0.165 0.304 1 4 506 538 539 507 0.863 0.165 0.304 1 4 507 539 540 508 0.863 0.165 0.304 1 4 508 540 541 509 0.863 0.165 0.304 1 4 509 541 542 510 0.863 0.165 0.304 1 4 510 542 543 511 0.863 0.165 0.304 1 4 511 543 544 512 0.863 0.165 0.304 1 4 512 544 545 513 0.863 0.165 0.304 1 4 513 545 514 482 0.863 0.165 0.304 1 4 578 546 547 579 0.8 0.8 0.8 1 4 579 547 548 580 0.8 0.8 0.8 1 4 580 548 549 581 0.8 0.8 0.8 1 4 581 549 550 582 0.8 0.8 0.8 1 4 582 550 551 583 0.8 0.8 0.8 1 4 583 551 552 584 0.8 0.8 0.8 1 4 584 552 553 585 0.8 0.8 0.8 1 4 585 553 554 586 0.8 0.8 0.8 1 4 586 554 555 587 0.8 0.8 0.8 1 4 587 555 556 588 0.8 0.8 0.8 1 4 588 556 557 589 0.8 0.8 0.8 1 4 589 557 558 590 0.8 0.8 0.8 1 4 590 558 559 591 0.8 0.8 0.8 1 4 591 559 560 592 0.8 0.8 0.8 1 4 592 560 561 593 0.8 0.8 0.8 1 4 593 561 562 594 0.8 0.8 0.8 1 4 594 562 563 595 0.8 0.8 0.8 1 4 595 563 564 596 0.8 0.8 0.8 1 4 596 564 565 597 0.8 0.8 0.8 1 4 597 565 566 598 0.8 0.8 0.8 1 4 598 566 567 599 0.8 0.8 0.8 1 4 599 567 568 600 0.8 0.8 0.8 1 4 600 568 569 601 0.8 0.8 0.8 1 4 601 569 570 602 0.8 0.8 0.8 1 4 602 570 571 603 0.8 0.8 0.8 1 4 603 571 572 604 0.8 0.8 0.8 1 4 604 572 573 605 0.8 0.8 0.8 1 4 605 573 574 606 0.8 0.8 0.8 1 4 606 574 575 607 0.8 0.8 0.8 1 4 607 575 576 608 0.8 0.8 0.8 1 4 608 576 577 609 0.8 0.8 0.8 1 4 609 577 546 578 0.8 0.8 0.8 1 32 608 609 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 0.8 0.8 0.8 1 4 684 666 665 685 0.8 0.8 0.8 1 4 683 667 666 684 0.8 0.8 0.8 1 4 682 668 667 683 0.8 0.8 0.8 1 4 681 669 668 682 0.8 0.8 0.8 1 4 680 670 669 681 0.8 0.8 0.8 1 4 679 671 670 680 0.8 0.8 0.8 1 4 678 672 671 679 0.8 0.8 0.8 1 4 677 673 672 678 0.8 0.8 0.8 1 4 676 674 673 677 0.8 0.8 0.8 1 4 675 643 674 676 0.8 0.8 0.8 1 4 706 644 643 675 0.8 0.8 0.8 1 4 705 645 644 706 0.8 0.8 0.8 1 4 704 646 645 705 0.8 0.8 0.8 1 4 703 647 646 704 0.8 0.8 0.8 1 4 702 648 647 703 0.8 0.8 0.8 1 4 701 649 648 702 0.8 0.8 0.8 1 4 700 650 649 701 0.8 0.8 0.8 1 4 699 651 650 700 0.8 0.8 0.8 1 4 698 652 651 699 0.8 0.8 0.8 1 4 697 653 652 698 0.8 0.8 0.8 1 4 696 654 653 697 0.8 0.8 0.8 1 4 695 655 654 696 0.8 0.8 0.8 1 4 694 656 655 695 0.8 0.8 0.8 1 4 693 657 656 694 0.8 0.8 0.8 1 4 692 658 657 693 0.8 0.8 0.8 1 4 691 659 658 692 0.8 0.8 0.8 1 4 690 660 659 691 0.8 0.8 0.8 1 4 689 661 660 690 0.8 0.8 0.8 1 4 688 662 661 689 0.8 0.8 0.8 1 4 687 663 662 688 0.8 0.8 0.8 1 4 686 664 663 687 0.8 0.8 0.8 1 4 685 665 664 686 0.8 0.8 0.8 1 32 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 0.8 0.8 0.8 1 4 611 643 644 612 0.05 0.2 0.1 1 4 612 644 645 613 0.05 0.2 0.1 1 4 613 645 646 614 0.05 0.2 0.1 1 4 614 646 647 615 0.05 0.2 0.1 1 4 615 647 648 616 0.05 0.2 0.1 1 4 616 648 649 617 0.05 0.2 0.1 1 4 617 649 650 618 0.05 0.2 0.1 1 4 618 650 651 619 0.05 0.2 0.1 1 4 619 651 652 620 0.05 0.2 0.1 1 4 620 652 653 621 0.05 0.2 0.1 1 4 621 653 654 622 0.05 0.2 0.1 1 4 622 654 655 623 0.05 0.2 0.1 1 4 623 655 656 624 0.05 0.2 0.1 1 4 624 656 657 625 0.05 0.2 0.1 1 4 625 657 658 626 0.05 0.2 0.1 1 4 626 658 659 627 0.05 0.2 0.1 1 4 627 659 660 628 0.05 0.2 0.1 1 4 628 660 661 629 0.05 0.2 0.1 1 4 629 661 662 630 0.05 0.2 0.1 1 4 630 662 663 631 0.05 0.2 0.1 1 4 631 663 664 632 0.05 0.2 0.1 1 4 632 664 665 633 0.05 0.2 0.1 1 4 633 665 666 634 0.05 0.2 0.1 1 4 634 666 667 635 0.05 0.2 0.1 1 4 635 667 668 636 0.05 0.2 0.1 1 4 636 668 669 637 0.05 0.2 0.1 1 4 637 669 670 638 0.05 0.2 0.1 1 4 638 670 671 639 0.05 0.2 0.1 1 4 639 671 672 640 0.05 0.2 0.1 1 4 640 672 673 641 0.05 0.2 0.1 1 4 641 673 674 642 0.05 0.2 0.1 1 4 642 674 643 611 0.05 0.2 0.1 1 4 707 675 676 708 0.8 0.8 0.8 1 4 708 676 677 709 0.8 0.8 0.8 1 4 709 677 678 710 0.8 0.8 0.8 1 4 710 678 679 711 0.8 0.8 0.8 1 4 711 679 680 712 0.8 0.8 0.8 1 4 712 680 681 713 0.8 0.8 0.8 1 4 713 681 682 714 0.8 0.8 0.8 1 4 714 682 683 715 0.8 0.8 0.8 1 4 715 683 684 716 0.8 0.8 0.8 1 4 716 684 685 717 0.8 0.8 0.8 1 4 717 685 686 718 0.8 0.8 0.8 1 4 718 686 687 719 0.8 0.8 0.8 1 4 719 687 688 720 0.8 0.8 0.8 1 4 720 688 689 721 0.8 0.8 0.8 1 4 721 689 690 722 0.8 0.8 0.8 1 4 722 690 691 723 0.8 0.8 0.8 1 4 723 691 692 724 0.8 0.8 0.8 1 4 724 692 693 725 0.8 0.8 0.8 1 4 725 693 694 726 0.8 0.8 0.8 1 4 726 694 695 727 0.8 0.8 0.8 1 4 727 695 696 728 0.8 0.8 0.8 1 4 728 696 697 729 0.8 0.8 0.8 1 4 729 697 698 730 0.8 0.8 0.8 1 4 730 698 699 731 0.8 0.8 0.8 1 4 731 699 700 732 0.8 0.8 0.8 1 4 732 700 701 733 0.8 0.8 0.8 1 4 733 701 702 734 0.8 0.8 0.8 1 4 734 702 703 735 0.8 0.8 0.8 1 4 735 703 704 736 0.8 0.8 0.8 1 4 736 704 705 737 0.8 0.8 0.8 1 4 737 705 706 738 0.8 0.8 0.8 1 4 738 706 675 707 0.8 0.8 0.8 1 32 737 738 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 0.8 0.8 0.8 1 4 740 741 742 743 0.6 0.6 0 1 4 744 745 743 742 0.6 0.3 0.2 1 3 746 745 744 0.1 0.1 0.1 1 4 747 740 743 748 0.6 0.6 0 1 4 745 749 748 743 0.6 0.3 0.2 1 3 746 749 745 0.1 0.1 0.1 1 4 750 747 748 751 0.6 0.6 0 1 4 749 752 751 748 0.6 0.3 0.2 1 3 746 752 749 0.1 0.1 0.1 1 4 753 750 751 754 0.6 0.6 0 1 4 752 755 754 751 0.6 0.3 0.2 1 3 746 755 752 0.1 0.1 0.1 1 4 756 753 754 757 0.6 0.6 0 1 4 755 758 757 754 0.6 0.3 0.2 1 3 746 758 755 0.1 0.1 0.1 1 4 741 756 757 742 0.6 0.6 0 1 4 758 744 742 757 0.6 0.3 0.2 1 3 746 744 758 0.1 0.1 0.1 1 6 740 747 750 753 756 741 0.6 0.3 0.2 1 6 759 760 761 762 763 764 0.1 0.1 0.1 1 4 765 766 767 768 0.163 0.743 0.145 1 4 767 769 770 768 0.163 0.743 0.145 1 4 770 771 765 768 0.163 0.743 0.145 1 4 771 770 769 772 0.163 0.743 0.145 1 4 766 765 771 772 0.163 0.743 0.145 1 4 769 767 766 772 0.163 0.743 0.145 1 4 773 774 775 776 0.163 0.743 0.145 1 4 775 777 778 776 0.163 0.743 0.145 1 4 778 779 773 776 0.163 0.743 0.145 1 4 779 778 777 780 0.163 0.743 0.145 1 4 774 773 779 780 0.163 0.743 0.145 1 4 777 775 774 780 0.163 0.743 0.145 1 4 770 769 781 782 0.163 0.743 0.145 1 4 781 783 784 782 0.163 0.743 0.145 1 4 784 776 770 782 0.163 0.743 0.145 1 4 776 784 783 775 0.163 0.743 0.145 1 4 769 770 776 775 0.163 0.743 0.145 1 4 783 781 769 775 0.163 0.743 0.145 1 4 785 786 787 788 0.7 0.7 0.7 1 4 786 789 790 787 0.7 0.7 0.7 1 4 789 791 792 790 0.7 0.7 0.7 1 3 799 797 798 0.1 0.1 0.1 1 3 801 798 797 0.1 0.1 0.1 1 3 803 799 800 0.1 0.1 0.1 1 3 805 800 799 0.1 0.1 0.1 1 3 804 802 801 0.1 0.1 0.1 1 3 806 801 802 0.1 0.1 0.1 1 3 797 803 804 0.1 0.1 0.1 1 3 807 804 803 0.1 0.1 0.1 1 3 798 806 805 0.1 0.1 0.1 1 3 808 805 806 0.1 0.1 0.1 1 3 800 808 807 0.1 0.1 0.1 1 3 802 807 808 0.1 0.1 0.1 1 3 797 799 803 0.1 0.1 0.1 1 3 805 799 798 0.1 0.1 0.1 1 3 804 801 797 0.1 0.1 0.1 1 3 798 801 806 0.1 0.1 0.1 1 3 803 800 807 0.1 0.1 0.1 1 3 808 800 805 0.1 0.1 0.1 1 3 807 802 804 0.1 0.1 0.1 1 3 806 802 808 0.1 0.1 0.1 1 3 811 809 810 0.1 0.1 0.1 1 3 813 810 809 0.1 0.1 0.1 1 3 815 811 812 0.1 0.1 0.1 1 3 817 812 811 0.1 0.1 0.1 1 3 816 814 813 0.1 0.1 0.1 1 3 818 813 814 0.1 0.1 0.1 1 3 809 815 816 0.1 0.1 0.1 1 3 819 816 815 0.1 0.1 0.1 1 3 810 818 817 0.1 0.1 0.1 1 3 820 817 818 0.1 0.1 0.1 1 3 812 820 819 0.1 0.1 0.1 1 3 814 819 820 0.1 0.1 0.1 1 3 809 811 815 0.1 0.1 0.1 1 3 817 811 810 0.1 0.1 0.1 1 3 816 813 809 0.1 0.1 0.1 1 3 810 813 818 0.1 0.1 0.1 1 3 815 812 819 0.1 0.1 0.1 1 3 820 812 817 0.1 0.1 0.1 1 3 819 814 816 0.1 0.1 0.1 1 3 818 814 820 0.1 0.1 0.1 1 3 823 821 822 0.1 0.1 0.1 1 3 825 822 821 0.1 0.1 0.1 1 3 827 823 824 0.1 0.1 0.1 1 3 829 824 823 0.1 0.1 0.1 1 3 828 826 825 0.1 0.1 0.1 1 3 830 825 826 0.1 0.1 0.1 1 3 821 827 828 0.1 0.1 0.1 1 3 831 828 827 0.1 0.1 0.1 1 3 822 830 829 0.1 0.1 0.1 1 3 832 829 830 0.1 0.1 0.1 1 3 824 832 831 0.1 0.1 0.1 1 3 826 831 832 0.1 0.1 0.1 1 3 821 823 827 0.1 0.1 0.1 1 3 829 823 822 0.1 0.1 0.1 1 3 828 825 821 0.1 0.1 0.1 1 3 822 825 830 0.1 0.1 0.1 1 3 827 824 831 0.1 0.1 0.1 1 3 832 824 829 0.1 0.1 0.1 1 3 831 826 828 0.1 0.1 0.1 1 3 830 826 832 0.1 0.1 0.1 1 3 835 833 834 0.1 0.1 0.1 1 3 837 834 833 0.1 0.1 0.1 1 3 839 835 836 0.1 0.1 0.1 1 3 841 836 835 0.1 0.1 0.1 1 3 840 838 837 0.1 0.1 0.1 1 3 842 837 838 0.1 0.1 0.1 1 3 833 839 840 0.1 0.1 0.1 1 3 843 840 839 0.1 0.1 0.1 1 3 834 842 841 0.1 0.1 0.1 1 3 844 841 842 0.1 0.1 0.1 1 3 836 844 843 0.1 0.1 0.1 1 3 838 843 844 0.1 0.1 0.1 1 3 833 835 839 0.1 0.1 0.1 1 3 841 835 834 0.1 0.1 0.1 1 3 840 837 833 0.1 0.1 0.1 1 3 834 837 842 0.1 0.1 0.1 1 3 839 836 843 0.1 0.1 0.1 1 3 844 836 841 0.1 0.1 0.1 1 3 843 838 840 0.1 0.1 0.1 1 3 842 838 844 0.1 0.1 0.1 1 4 846 847 848 845 0.1 0.1 0.1 1 4 850 848 847 849 0.1 0.1 0.1 1 4 850 851 845 848 0.1 0.1 0.1 1 4 851 850 849 852 0.1 0.1 0.1 1 4 846 845 851 852 0.1 0.1 0.1 1 4 849 847 846 852 0.1 0.1 0.1 1 4 854 794 796 853 0.8 0.8 0.8 1 4 855 793 794 854 0.8 0.8 0.8 1 4 855 854 853 856 0.8 0.8 0.8 1 4 856 795 793 855 0.8 0.8 0.8 1 4 853 796 795 856 0.8 0.8 0.8 1 4 857 858 859 860 0.9 0.4 0.1 1 4 862 864 866 868 0.9 0.4 0.1 1 4 869 870 871 872 0.9 0.4 0.1 1 4 873 874 875 876 0.9 0.4 0.1 1 4 878 880 882 884 0.9 0.4 0.1 1 4 885 886 887 888 0.9 0.4 0.1 1 4 871 857 860 872 0.9 0.4 0.1 1 4 867 865 869 872 0.9 0.4 0.1 1 4 860 859 861 867 0.9 0.4 0.1 1 4 886 885 863 861 0.9 0.4 0.1 1 4 888 876 875 885 0.9 0.4 0.1 1 4 874 865 863 875 0.9 0.4 0.1 1 4 874 873 870 869 0.9 0.4 0.1 1 4 876 883 881 873 0.9 0.4 0.1 1 4 879 871 870 881 0.9 0.4 0.1 1 4 877 883 888 887 0.9 0.4 0.1 1 4 858 857 879 877 0.9 0.4 0.1 1 4 886 859 858 887 0.9 0.4 0.1 1 3 872 860 867 0.9 0.4 0.1 1 3 857 871 879 0.9 0.4 0.1 1 3 869 865 874 0.9 0.4 0.1 1 3 861 859 886 0.9 0.4 0.1 1 3 885 875 863 0.9 0.4 0.1 1 3 877 887 858 0.9 0.4 0.1 1 3 873 881 870 0.9 0.4 0.1 1 3 888 883 876 0.9 0.4 0.1 1 4 890 892 894 896 0.9 0.4 0.1 1 4 897 898 899 900 0.9 0.4 0.1 1 4 901 902 903 904 0.9 0.4 0.1 1 4 906 908 910 912 0.9 0.4 0.1 1 4 913 914 915 916 0.9 0.4 0.1 1 4 917 918 919 920 0.9 0.4 0.1 1 4 903 889 895 904 0.9 0.4 0.1 1 4 900 899 901 904 0.9 0.4 0.1 1 4 895 893 897 900 0.9 0.4 0.1 1 4 918 917 898 897 0.9 0.4 0.1 1 4 920 911 909 917 0.9 0.4 0.1 1 4 907 899 898 909 0.9 0.4 0.1 1 4 907 905 902 901 0.9 0.4 0.1 1 4 911 916 915 905 0.9 0.4 0.1 1 4 914 903 902 915 0.9 0.4 0.1 1 4 913 916 920 919 0.9 0.4 0.1 1 4 891 889 914 913 0.9 0.4 0.1 1 4 918 893 891 919 0.9 0.4 0.1 1 3 904 895 900 0.9 0.4 0.1 1 3 889 903 914 0.9 0.4 0.1 1 3 901 899 907 0.9 0.4 0.1 1 3 897 893 918 0.9 0.4 0.1 1 3 917 909 898 0.9 0.4 0.1 1 3 913 919 891 0.9 0.4 0.1 1 3 905 915 902 0.9 0.4 0.1 1 3 920 916 911 0.9 0.4 0.1 1 6 922 923 929 930 924 921 0.8 0.8 0.8 1 4 925 921 924 926 0.8 0.8 0.8 1 4 927 928 929 930 0.8 0.8 0.8 1 4 931 932 927 930 0.8 0.8 0.8 1 4 932 931 933 934 0.8 0.8 0.8 1 4 928 927 932 934 0.8 0.8 0.8 1 4 933 929 928 934 0.8 0.8 0.8 1 6 925 926 941 942 936 935 0.8 0.8 0.8 1 4 937 935 936 938 0.8 0.8 0.8 1 4 939 940 941 942 0.8 0.8 0.8 1 4 943 944 939 942 0.8 0.8 0.8 1 4 944 943 945 946 0.8 0.8 0.8 1 4 940 939 944 946 0.8 0.8 0.8 1 4 945 941 940 946 0.8 0.8 0.8 1 6 938 953 954 948 947 937 0.8 0.8 0.8 1 4 949 947 948 950 0.8 0.8 0.8 1 4 951 952 953 954 0.8 0.8 0.8 1 4 955 956 951 954 0.8 0.8 0.8 1 4 956 955 957 958 0.8 0.8 0.8 1 4 952 951 956 958 0.8 0.8 0.8 1 4 957 953 952 958 0.8 0.8 0.8 1 6 950 963 964 960 959 949 0.8 0.8 0.8 1 4 922 959 960 923 0.8 0.8 0.8 1 4 961 962 963 964 0.8 0.8 0.8 1 4 965 966 961 964 0.8 0.8 0.8 1 4 966 965 967 968 0.8 0.8 0.8 1 4 962 961 966 968 0.8 0.8 0.8 1 4 967 963 962 968 0.8 0.8 0.8 1 16 923 960 964 963 950 948 954 953 938 936 942 941 926 924 930 929 0.8 0.8 0.8 1 4 969 970 971 972 0.702 0.198 0.106 1 4 971 973 974 972 0.702 0.198 0.106 1 4 974 975 969 972 0.702 0.198 0.106 1 4 975 974 973 976 0.702 0.198 0.106 1 4 970 969 975 976 0.702 0.198 0.106 1 4 973 971 970 976 0.702 0.198 0.106 1 4 977 978 979 980 0.702 0.198 0.106 1 4 979 981 982 980 0.702 0.198 0.106 1 4 982 983 977 980 0.702 0.198 0.106 1 4 983 982 981 984 0.702 0.198 0.106 1 4 978 977 983 984 0.702 0.198 0.106 1 4 981 979 978 984 0.702 0.198 0.106 1 4 985 986 987 988 0.702 0.198 0.106 1 4 987 978 977 988 0.702 0.198 0.106 1 4 977 972 985 988 0.702 0.198 0.106 1 4 972 977 978 971 0.702 0.198 0.106 1 4 986 985 972 971 0.702 0.198 0.106 1 4 978 987 986 971 0.702 0.198 0.106 1 40 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 0.7 0.7 0.7 1 40 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 0.7 0.7 0.7 1 4 989 1068 1067 990 0.7 0.7 0.7 1 4 990 1067 1066 991 0.7 0.7 0.7 1 4 991 1066 1065 992 0.7 0.7 0.7 1 4 992 1065 1064 993 0.7 0.7 0.7 1 4 993 1064 1063 994 0.7 0.7 0.7 1 4 994 1063 1062 995 0.7 0.7 0.7 1 4 995 1062 1061 996 0.7 0.7 0.7 1 4 996 1061 1060 997 0.7 0.7 0.7 1 4 997 1060 1059 998 0.7 0.7 0.7 1 4 998 1059 1058 999 0.7 0.7 0.7 1 4 999 1058 1057 1000 0.7 0.7 0.7 1 4 1000 1057 1056 1001 0.7 0.7 0.7 1 4 1001 1056 1055 1002 0.7 0.7 0.7 1 4 1002 1055 1054 1003 0.7 0.7 0.7 1 4 1003 1054 1053 1004 0.7 0.7 0.7 1 4 1004 1053 1052 1005 0.7 0.7 0.7 1 4 1005 1052 1051 1006 0.7 0.7 0.7 1 4 1006 1051 1050 1007 0.7 0.7 0.7 1 4 1007 1050 1049 1008 0.7 0.7 0.7 1 4 1008 1049 1048 1009 0.7 0.7 0.7 1 6 1011 1010 1009 1048 1047 1046 0.7 0.7 0.7 1 4 1011 1046 1045 1012 0.7 0.7 0.7 1 4 1012 1045 1044 1013 0.7 0.7 0.7 1 4 1013 1044 1043 1014 0.7 0.7 0.7 1 4 1014 1043 1042 1015 0.7 0.7 0.7 1 4 1015 1042 1041 1016 0.7 0.7 0.7 1 4 1016 1041 1040 1017 0.7 0.7 0.7 1 4 1017 1040 1039 1018 0.7 0.7 0.7 1 4 1018 1039 1038 1019 0.7 0.7 0.7 1 4 1019 1038 1037 1020 0.7 0.7 0.7 1 4 1020 1037 1036 1021 0.7 0.7 0.7 1 4 1021 1036 1035 1022 0.7 0.7 0.7 1 4 1022 1035 1034 1023 0.7 0.7 0.7 1 4 1023 1034 1033 1024 0.7 0.7 0.7 1 4 1024 1033 1032 1025 0.7 0.7 0.7 1 4 1025 1032 1031 1026 0.7 0.7 0.7 1 4 1026 1031 1030 1027 0.7 0.7 0.7 1 4 1027 1030 1029 1028 0.7 0.7 0.7 1 4 1028 1029 1068 989 0.7 0.7 0.7 1 40 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 989 0.7 0.7 0.7 1 40 1068 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 0.7 0.7 0.7 1 4 1107 1108 1068 989 0.7 0.7 0.7 1 4 1106 1109 1108 1107 0.7 0.7 0.7 1 4 1105 1110 1109 1106 0.7 0.7 0.7 1 4 1104 1111 1110 1105 0.7 0.7 0.7 1 4 1103 1112 1111 1104 0.7 0.7 0.7 1 4 1102 1113 1112 1103 0.7 0.7 0.7 1 4 1101 1114 1113 1102 0.7 0.7 0.7 1 4 1100 1115 1114 1101 0.7 0.7 0.7 1 4 1099 1116 1115 1100 0.7 0.7 0.7 1 4 1098 1117 1116 1099 0.7 0.7 0.7 1 4 1097 1118 1117 1098 0.7 0.7 0.7 1 4 1096 1119 1118 1097 0.7 0.7 0.7 1 4 1095 1120 1119 1096 0.7 0.7 0.7 1 4 1094 1121 1120 1095 0.7 0.7 0.7 1 4 1093 1122 1121 1094 0.7 0.7 0.7 1 4 1092 1123 1122 1093 0.7 0.7 0.7 1 4 1091 1124 1123 1092 0.7 0.7 0.7 1 4 1090 1125 1124 1091 0.7 0.7 0.7 1 4 1089 1126 1125 1090 0.7 0.7 0.7 1 4 1088 1127 1126 1089 0.7 0.7 0.7 1 6 1129 1128 1127 1088 1087 1086 0.7 0.7 0.7 1 4 1085 1130 1129 1086 0.7 0.7 0.7 1 4 1084 1131 1130 1085 0.7 0.7 0.7 1 4 1083 1132 1131 1084 0.7 0.7 0.7 1 4 1082 1133 1132 1083 0.7 0.7 0.7 1 4 1081 1134 1133 1082 0.7 0.7 0.7 1 4 1080 1135 1134 1081 0.7 0.7 0.7 1 4 1079 1136 1135 1080 0.7 0.7 0.7 1 4 1078 1137 1136 1079 0.7 0.7 0.7 1 4 1077 1138 1137 1078 0.7 0.7 0.7 1 4 1076 1139 1138 1077 0.7 0.7 0.7 1 4 1075 1140 1139 1076 0.7 0.7 0.7 1 4 1074 1141 1140 1075 0.7 0.7 0.7 1 4 1073 1142 1141 1074 0.7 0.7 0.7 1 4 1072 1143 1142 1073 0.7 0.7 0.7 1 4 1071 1144 1143 1072 0.7 0.7 0.7 1 4 1070 1145 1144 1071 0.7 0.7 0.7 1 4 1069 1146 1145 1070 0.7 0.7 0.7 1 4 989 1068 1146 1069 0.7 0.7 0.7 1 4 1147 1157 1158 1148 0.171 0.237 0.875 1 4 1148 1158 1150 1149 0.171 0.237 0.875 1 4 1149 1150 1160 1151 0.171 0.237 0.875 1 4 1151 1160 1161 1152 0.171 0.237 0.875 1 4 1152 1161 1162 1153 0.171 0.237 0.875 1 4 1153 1162 1155 1154 0.171 0.237 0.875 1 4 1154 1155 1164 1156 0.171 0.237 0.875 1 4 1156 1164 1157 1147 0.171 0.237 0.875 1 4 1157 1165 1166 1158 0.171 0.237 0.875 1 4 1158 1166 1159 1150 0.171 0.237 0.875 1 4 1150 1159 1168 1160 0.171 0.237 0.875 1 4 1160 1168 1169 1161 0.171 0.237 0.875 1 4 1161 1169 1170 1162 0.171 0.237 0.875 1 4 1162 1170 1163 1155 0.171 0.237 0.875 1 4 1155 1163 1172 1164 0.171 0.237 0.875 1 4 1164 1172 1165 1157 0.171 0.237 0.875 1 4 1165 1173 1174 1166 0.171 0.237 0.875 1 4 1166 1174 1167 1159 0.171 0.237 0.875 1 4 1159 1167 1176 1168 0.171 0.237 0.875 1 4 1168 1176 1177 1169 0.171 0.237 0.875 1 4 1169 1177 1178 1170 0.171 0.237 0.875 1 4 1170 1178 1171 1163 0.171 0.237 0.875 1 4 1163 1171 1180 1172 0.171 0.237 0.875 1 4 1172 1180 1173 1165 0.171 0.237 0.875 1 4 1173 1181 1182 1174 0.171 0.237 0.875 1 4 1174 1182 1175 1167 0.171 0.237 0.875 1 4 1167 1175 1184 1176 0.171 0.237 0.875 1 4 1176 1184 1185 1177 0.171 0.237 0.875 1 4 1177 1185 1186 1178 0.171 0.237 0.875 1 4 1178 1186 1179 1171 0.171 0.237 0.875 1 4 1171 1179 1188 1180 0.171 0.237 0.875 1 4 1180 1188 1181 1173 0.171 0.237 0.875 1 4 1181 1189 1190 1182 0.171 0.237 0.875 1 4 1182 1190 1183 1175 0.171 0.237 0.875 1 4 1175 1183 1192 1184 0.171 0.237 0.875 1 4 1184 1192 1193 1185 0.171 0.237 0.875 1 4 1185 1193 1194 1186 0.171 0.237 0.875 1 4 1186 1194 1187 1179 0.171 0.237 0.875 1 4 1179 1187 1196 1188 0.171 0.237 0.875 1 4 1188 1196 1189 1181 0.171 0.237 0.875 1 4 1189 1197 1198 1190 0.171 0.237 0.875 1 4 1190 1198 1191 1183 0.171 0.237 0.875 1 4 1183 1191 1200 1192 0.171 0.237 0.875 1 4 1192 1200 1201 1193 0.171 0.237 0.875 1 4 1193 1201 1202 1194 0.171 0.237 0.875 1 4 1194 1202 1195 1187 0.171 0.237 0.875 1 4 1187 1195 1204 1196 0.171 0.237 0.875 1 4 1196 1204 1197 1189 0.171 0.237 0.875 1 4 1197 1212 1214 1198 0.171 0.237 0.875 1 4 1198 1214 1199 1191 0.171 0.237 0.875 1 4 1191 1199 1217 1200 0.171 0.237 0.875 1 4 1200 1217 1205 1201 0.171 0.237 0.875 1 4 1201 1205 1207 1202 0.171 0.237 0.875 1 4 1202 1207 1203 1195 0.171 0.237 0.875 1 4 1195 1203 1210 1204 0.171 0.237 0.875 1 4 1204 1210 1212 1197 0.171 0.237 0.875 1 4 1205 1206 1208 1207 0.171 0.237 0.875 1 4 1207 1208 1209 1203 0.171 0.237 0.875 1 4 1203 1209 1211 1210 0.171 0.237 0.875 1 4 1210 1211 1213 1212 0.171 0.237 0.875 1 4 1212 1213 1215 1214 0.171 0.237 0.875 1 4 1214 1215 1216 1199 0.171 0.237 0.875 1 4 1199 1216 1218 1217 0.171 0.237 0.875 1 4 1217 1218 1206 1205 0.171 0.237 0.875 1 4 1327 1367 1366 1328 0.171 0.237 0.875 1 4 1329 1328 1366 1365 0.171 0.237 0.875 1 4 1330 1329 1365 1364 0.171 0.237 0.875 1 4 1331 1330 1364 1363 0.171 0.237 0.875 1 4 1332 1331 1363 1362 0.171 0.237 0.875 1 4 1333 1332 1362 1361 0.171 0.237 0.875 1 4 1334 1333 1361 1360 0.171 0.237 0.875 1 4 1335 1334 1360 1359 0.171 0.237 0.875 1 4 1336 1335 1359 1358 0.171 0.237 0.875 1 4 1337 1336 1358 1357 0.171 0.237 0.875 1 4 1338 1337 1357 1356 0.171 0.237 0.875 1 4 1339 1338 1356 1355 0.171 0.237 0.875 1 4 1340 1339 1355 1354 0.171 0.237 0.875 1 4 1340 1354 1353 1341 0.171 0.237 0.875 1 4 1341 1353 1352 1342 0.171 0.237 0.875 1 4 1342 1352 1351 1343 0.171 0.237 0.875 1 4 1343 1351 1350 1344 0.171 0.237 0.875 1 4 1344 1350 1349 1345 0.171 0.237 0.875 1 4 1345 1349 1348 1346 0.171 0.237 0.875 1 4 1346 1348 1347 1315 0.171 0.237 0.875 1 4 1315 1347 1378 1316 0.171 0.237 0.875 1 4 1316 1378 1377 1317 0.171 0.237 0.875 1 4 1317 1377 1376 1318 0.171 0.237 0.875 1 4 1318 1376 1375 1319 0.171 0.237 0.875 1 4 1319 1375 1374 1320 0.171 0.237 0.875 1 4 1320 1374 1373 1321 0.171 0.237 0.875 1 4 1321 1373 1372 1322 0.171 0.237 0.875 1 4 1322 1372 1371 1323 0.171 0.237 0.875 1 4 1323 1371 1370 1324 0.171 0.237 0.875 1 4 1324 1370 1369 1325 0.171 0.237 0.875 1 4 1325 1369 1368 1326 0.171 0.237 0.875 1 4 1326 1368 1367 1327 0.171 0.237 0.875 1 32 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 0.171 0.237 0.875 1 4 1219 1251 1252 1220 0.171 0.237 0.875 1 4 1220 1252 1253 1221 0.171 0.237 0.875 1 4 1221 1253 1254 1222 0.171 0.237 0.875 1 4 1222 1254 1255 1223 0.171 0.237 0.875 1 4 1223 1255 1256 1224 0.171 0.237 0.875 1 4 1224 1256 1257 1225 0.171 0.237 0.875 1 4 1225 1257 1258 1226 0.171 0.237 0.875 1 4 1226 1258 1259 1227 0.171 0.237 0.875 1 4 1227 1259 1260 1228 0.171 0.237 0.875 1 4 1228 1260 1261 1229 0.171 0.237 0.875 1 4 1229 1261 1262 1230 0.171 0.237 0.875 1 4 1230 1262 1263 1231 0.171 0.237 0.875 1 4 1231 1263 1264 1232 0.171 0.237 0.875 1 4 1232 1264 1265 1233 0.171 0.237 0.875 1 4 1233 1265 1266 1234 0.171 0.237 0.875 1 4 1234 1266 1267 1235 0.171 0.237 0.875 1 4 1235 1267 1268 1236 0.171 0.237 0.875 1 4 1236 1268 1269 1237 0.171 0.237 0.875 1 4 1237 1269 1270 1238 0.171 0.237 0.875 1 4 1238 1270 1271 1239 0.171 0.237 0.875 1 4 1239 1271 1272 1240 0.171 0.237 0.875 1 4 1240 1272 1273 1241 0.171 0.237 0.875 1 4 1241 1273 1274 1242 0.171 0.237 0.875 1 4 1242 1274 1275 1243 0.171 0.237 0.875 1 4 1243 1275 1276 1244 0.171 0.237 0.875 1 4 1244 1276 1277 1245 0.171 0.237 0.875 1 4 1245 1277 1278 1246 0.171 0.237 0.875 1 4 1246 1278 1279 1247 0.171 0.237 0.875 1 4 1247 1279 1280 1248 0.171 0.237 0.875 1 4 1248 1280 1281 1249 0.171 0.237 0.875 1 4 1249 1281 1282 1250 0.171 0.237 0.875 1 4 1250 1282 1251 1219 0.171 0.237 0.875 1 4 1251 1283 1284 1252 0.171 0.237 0.875 1 4 1252 1284 1285 1253 0.171 0.237 0.875 1 4 1253 1285 1286 1254 0.171 0.237 0.875 1 4 1254 1286 1287 1255 0.171 0.237 0.875 1 4 1255 1287 1288 1256 0.171 0.237 0.875 1 4 1256 1288 1289 1257 0.171 0.237 0.875 1 4 1257 1289 1290 1258 0.171 0.237 0.875 1 4 1258 1290 1291 1259 0.171 0.237 0.875 1 4 1259 1291 1292 1260 0.171 0.237 0.875 1 4 1260 1292 1293 1261 0.171 0.237 0.875 1 4 1261 1293 1294 1262 0.171 0.237 0.875 1 4 1262 1294 1295 1263 0.171 0.237 0.875 1 4 1263 1295 1296 1264 0.171 0.237 0.875 1 4 1264 1296 1297 1265 0.171 0.237 0.875 1 4 1265 1297 1298 1266 0.171 0.237 0.875 1 4 1266 1298 1299 1267 0.171 0.237 0.875 1 4 1267 1299 1300 1268 0.171 0.237 0.875 1 4 1268 1300 1301 1269 0.171 0.237 0.875 1 4 1269 1301 1302 1270 0.171 0.237 0.875 1 4 1270 1302 1303 1271 0.171 0.237 0.875 1 4 1271 1303 1304 1272 0.171 0.237 0.875 1 4 1272 1304 1305 1273 0.171 0.237 0.875 1 4 1273 1305 1306 1274 0.171 0.237 0.875 1 4 1274 1306 1307 1275 0.171 0.237 0.875 1 4 1275 1307 1308 1276 0.171 0.237 0.875 1 4 1276 1308 1309 1277 0.171 0.237 0.875 1 4 1277 1309 1310 1278 0.171 0.237 0.875 1 4 1278 1310 1311 1279 0.171 0.237 0.875 1 4 1279 1311 1312 1280 0.171 0.237 0.875 1 4 1280 1312 1313 1281 0.171 0.237 0.875 1 4 1281 1313 1314 1282 0.171 0.237 0.875 1 4 1282 1314 1283 1251 0.171 0.237 0.875 1 4 1283 1315 1316 1284 0.171 0.237 0.875 1 4 1284 1316 1317 1285 0.171 0.237 0.875 1 4 1285 1317 1318 1286 0.171 0.237 0.875 1 4 1286 1318 1319 1287 0.171 0.237 0.875 1 4 1287 1319 1320 1288 0.171 0.237 0.875 1 4 1288 1320 1321 1289 0.171 0.237 0.875 1 4 1289 1321 1322 1290 0.171 0.237 0.875 1 4 1290 1322 1323 1291 0.171 0.237 0.875 1 4 1291 1323 1324 1292 0.171 0.237 0.875 1 4 1292 1324 1325 1293 0.171 0.237 0.875 1 4 1293 1325 1326 1294 0.171 0.237 0.875 1 4 1294 1326 1327 1295 0.171 0.237 0.875 1 4 1295 1327 1328 1296 0.171 0.237 0.875 1 4 1296 1328 1329 1297 0.171 0.237 0.875 1 4 1297 1329 1330 1298 0.171 0.237 0.875 1 4 1298 1330 1331 1299 0.171 0.237 0.875 1 4 1299 1331 1332 1300 0.171 0.237 0.875 1 4 1300 1332 1333 1301 0.171 0.237 0.875 1 4 1301 1333 1334 1302 0.171 0.237 0.875 1 4 1302 1334 1335 1303 0.171 0.237 0.875 1 4 1303 1335 1336 1304 0.171 0.237 0.875 1 4 1304 1336 1337 1305 0.171 0.237 0.875 1 4 1305 1337 1338 1306 0.171 0.237 0.875 1 4 1306 1338 1339 1307 0.171 0.237 0.875 1 4 1307 1339 1340 1308 0.171 0.237 0.875 1 4 1308 1340 1341 1309 0.171 0.237 0.875 1 4 1309 1341 1342 1310 0.171 0.237 0.875 1 4 1310 1342 1343 1311 0.171 0.237 0.875 1 4 1311 1343 1344 1312 0.171 0.237 0.875 1 4 1312 1344 1345 1313 0.171 0.237 0.875 1 4 1313 1345 1346 1314 0.171 0.237 0.875 1 4 1314 1346 1315 1283 0.171 0.237 0.875 1 4 1379 1347 1348 1380 0.171 0.237 0.875 1 4 1380 1348 1349 1381 0.171 0.237 0.875 1 4 1381 1349 1350 1382 0.171 0.237 0.875 1 4 1382 1350 1351 1383 0.171 0.237 0.875 1 4 1383 1351 1352 1384 0.171 0.237 0.875 1 4 1384 1352 1353 1385 0.171 0.237 0.875 1 4 1385 1353 1354 1386 0.171 0.237 0.875 1 4 1386 1354 1355 1387 0.171 0.237 0.875 1 4 1387 1355 1356 1388 0.171 0.237 0.875 1 4 1388 1356 1357 1389 0.171 0.237 0.875 1 4 1389 1357 1358 1390 0.171 0.237 0.875 1 4 1390 1358 1359 1391 0.171 0.237 0.875 1 4 1391 1359 1360 1392 0.171 0.237 0.875 1 4 1392 1360 1361 1393 0.171 0.237 0.875 1 4 1393 1361 1362 1394 0.171 0.237 0.875 1 4 1394 1362 1363 1395 0.171 0.237 0.875 1 4 1395 1363 1364 1396 0.171 0.237 0.875 1 4 1396 1364 1365 1397 0.171 0.237 0.875 1 4 1397 1365 1366 1398 0.171 0.237 0.875 1 4 1398 1366 1367 1399 0.171 0.237 0.875 1 4 1399 1367 1368 1400 0.171 0.237 0.875 1 4 1400 1368 1369 1401 0.171 0.237 0.875 1 4 1401 1369 1370 1402 0.171 0.237 0.875 1 4 1402 1370 1371 1403 0.171 0.237 0.875 1 4 1403 1371 1372 1404 0.171 0.237 0.875 1 4 1404 1372 1373 1405 0.171 0.237 0.875 1 4 1405 1373 1374 1406 0.171 0.237 0.875 1 4 1406 1374 1375 1407 0.171 0.237 0.875 1 4 1407 1375 1376 1408 0.171 0.237 0.875 1 4 1408 1376 1377 1409 0.171 0.237 0.875 1 4 1409 1377 1378 1410 0.171 0.237 0.875 1 4 1410 1378 1347 1379 0.171 0.237 0.875 1 4 1411 1379 1380 1412 0.171 0.237 0.875 1 4 1412 1380 1381 1413 0.171 0.237 0.875 1 4 1413 1381 1382 1414 0.171 0.237 0.875 1 4 1414 1382 1383 1415 0.171 0.237 0.875 1 4 1415 1383 1384 1416 0.171 0.237 0.875 1 4 1416 1384 1385 1417 0.171 0.237 0.875 1 4 1417 1385 1386 1418 0.171 0.237 0.875 1 4 1418 1386 1387 1419 0.171 0.237 0.875 1 4 1419 1387 1388 1420 0.171 0.237 0.875 1 4 1420 1388 1389 1421 0.171 0.237 0.875 1 4 1421 1389 1390 1422 0.171 0.237 0.875 1 4 1422 1390 1391 1423 0.171 0.237 0.875 1 4 1423 1391 1392 1424 0.171 0.237 0.875 1 4 1424 1392 1393 1425 0.171 0.237 0.875 1 4 1425 1393 1394 1426 0.171 0.237 0.875 1 4 1426 1394 1395 1427 0.171 0.237 0.875 1 4 1427 1395 1396 1428 0.171 0.237 0.875 1 4 1428 1396 1397 1429 0.171 0.237 0.875 1 4 1429 1397 1398 1430 0.171 0.237 0.875 1 4 1430 1398 1399 1431 0.171 0.237 0.875 1 4 1431 1399 1400 1432 0.171 0.237 0.875 1 4 1432 1400 1401 1433 0.171 0.237 0.875 1 4 1433 1401 1402 1434 0.171 0.237 0.875 1 4 1434 1402 1403 1435 0.171 0.237 0.875 1 4 1435 1403 1404 1436 0.171 0.237 0.875 1 4 1436 1404 1405 1437 0.171 0.237 0.875 1 4 1437 1405 1406 1438 0.171 0.237 0.875 1 4 1438 1406 1407 1439 0.171 0.237 0.875 1 4 1439 1407 1408 1440 0.171 0.237 0.875 1 4 1440 1408 1409 1441 0.171 0.237 0.875 1 4 1441 1409 1410 1442 0.171 0.237 0.875 1 4 1442 1410 1379 1411 0.171 0.237 0.875 1 32 1441 1442 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 0.171 0.237 0.875 1 4 1444 1445 1446 1447 0.763 0.143 0.145 1 4 1446 1448 1449 1447 0.763 0.143 0.145 1 4 1449 1450 1444 1447 0.763 0.143 0.145 1 4 1450 1449 1448 1451 0.763 0.143 0.145 1 4 1445 1444 1450 1451 0.763 0.143 0.145 1 4 1448 1446 1445 1451 0.763 0.143 0.145 1 4 1452 1453 1454 1455 0.763 0.143 0.145 1 4 1454 1456 1457 1455 0.763 0.143 0.145 1 4 1457 1458 1452 1455 0.763 0.143 0.145 1 4 1458 1457 1456 1459 0.763 0.143 0.145 1 4 1453 1452 1458 1459 0.763 0.143 0.145 1 4 1456 1454 1453 1459 0.763 0.143 0.145 1 4 1449 1448 1460 1461 0.763 0.143 0.145 1 4 1460 1462 1463 1461 0.763 0.143 0.145 1 4 1463 1455 1449 1461 0.763 0.143 0.145 1 4 1455 1463 1462 1454 0.763 0.143 0.145 1 4 1448 1449 1455 1454 0.763 0.143 0.145 1 4 1462 1460 1448 1454 0.763 0.143 0.145 1 4 1464 1465 1466 1467 0.7 0.7 0.7 1 4 1465 1468 1469 1466 0.7 0.7 0.7 1 4 1468 1470 1471 1469 0.7 0.7 0.7 1 4 1472 1473 1474 1475 0.163 0.143 0.745 1 4 1474 1476 1477 1475 0.163 0.143 0.745 1 4 1477 1478 1472 1475 0.163 0.143 0.745 1 4 1478 1477 1476 1479 0.163 0.143 0.745 1 4 1473 1472 1478 1479 0.163 0.143 0.745 1 4 1476 1474 1473 1479 0.163 0.143 0.745 1 4 1480 1481 1482 1483 0.163 0.143 0.745 1 4 1482 1484 1485 1483 0.163 0.143 0.745 1 4 1485 1486 1480 1483 0.163 0.143 0.745 1 4 1486 1485 1484 1487 0.163 0.143 0.745 1 4 1481 1480 1486 1487 0.163 0.143 0.745 1 4 1484 1482 1481 1487 0.163 0.143 0.745 1 4 1477 1476 1488 1489 0.163 0.143 0.745 1 4 1488 1490 1491 1489 0.163 0.143 0.745 1 4 1491 1483 1477 1489 0.163 0.143 0.745 1 4 1483 1491 1490 1482 0.163 0.143 0.745 1 4 1476 1477 1483 1482 0.163 0.143 0.745 1 4 1490 1488 1476 1482 0.163 0.143 0.745 1 4 1492 1493 1494 1495 0.7 0.7 0.7 1 4 1493 1496 1497 1494 0.7 0.7 0.7 1 4 1496 1498 1499 1497 0.7 0.7 0.7 1 4 1770 1771 1755 1754 0.3 0.2 0.2 1 4 1769 1770 1754 1753 0.3 0.2 0.2 1 4 1768 1769 1753 1752 0.3 0.2 0.2 1 4 1767 1768 1752 1751 0.3 0.2 0.2 1 4 1766 1767 1751 1750 0.3 0.2 0.2 1 4 1765 1766 1750 1749 0.3 0.2 0.2 1 4 1764 1780 1765 1749 0.3 0.2 0.2 1 4 1763 1779 1780 1764 0.3 0.2 0.2 1 4 1779 1763 1762 1778 0.3 0.2 0.2 1 4 1778 1762 1761 1777 0.3 0.2 0.2 1 4 1777 1761 1760 1776 0.3 0.2 0.2 1 4 1776 1760 1759 1775 0.3 0.2 0.2 1 4 1775 1759 1758 1774 0.3 0.2 0.2 1 4 1774 1758 1757 1773 0.3 0.2 0.2 1 4 1756 1755 1771 1772 0.3 0.2 0.2 1 4 1757 1756 1772 1773 0.3 0.2 0.2 1 16 1664 1665 1666 1667 1668 1685 1687 1689 1691 1693 1695 1697 1699 1661 1662 1663 0.3 0.2 0.2 1 3 1502 1500 1501 0.3 0.2 0.2 1 3 1504 1501 1500 0.3 0.2 0.2 1 3 1506 1502 1503 0.3 0.2 0.2 1 3 1508 1503 1502 0.3 0.2 0.2 1 3 1507 1505 1504 0.3 0.2 0.2 1 3 1500 1506 1507 0.3 0.2 0.2 1 3 1509 1507 1506 0.3 0.2 0.2 1 3 1503 1510 1509 0.3 0.2 0.2 1 3 1505 1509 1510 0.3 0.2 0.2 1 3 1500 1502 1506 0.3 0.2 0.2 1 3 1508 1502 1501 0.3 0.2 0.2 1 3 1507 1504 1500 0.3 0.2 0.2 1 3 1506 1503 1509 0.3 0.2 0.2 1 3 1510 1503 1508 0.3 0.2 0.2 1 3 1509 1505 1507 0.3 0.2 0.2 1 3 1513 1511 1512 0.3 0.2 0.2 1 3 1515 1512 1511 0.3 0.2 0.2 1 3 1517 1513 1514 0.3 0.2 0.2 1 3 1519 1514 1513 0.3 0.2 0.2 1 3 1518 1516 1515 0.3 0.2 0.2 1 3 1520 1515 1516 0.3 0.2 0.2 1 3 1511 1517 1518 0.3 0.2 0.2 1 3 1521 1518 1517 0.3 0.2 0.2 1 3 1512 1520 1519 0.3 0.2 0.2 1 3 1522 1519 1520 0.3 0.2 0.2 1 3 1514 1522 1521 0.3 0.2 0.2 1 3 1516 1521 1522 0.3 0.2 0.2 1 3 1511 1513 1517 0.3 0.2 0.2 1 3 1519 1513 1512 0.3 0.2 0.2 1 3 1518 1515 1511 0.3 0.2 0.2 1 3 1512 1515 1520 0.3 0.2 0.2 1 3 1517 1514 1521 0.3 0.2 0.2 1 3 1522 1514 1519 0.3 0.2 0.2 1 3 1521 1516 1518 0.3 0.2 0.2 1 3 1520 1516 1522 0.3 0.2 0.2 1 3 1525 1523 1524 0.3 0.2 0.2 1 3 1527 1525 1526 0.3 0.2 0.2 1 3 1528 1526 1525 0.3 0.2 0.2 1 3 1526 1530 1529 0.3 0.2 0.2 1 3 1523 1525 1527 0.3 0.2 0.2 1 3 1528 1525 1524 0.3 0.2 0.2 1 3 1527 1526 1529 0.3 0.2 0.2 1 3 1530 1526 1528 0.3 0.2 0.2 1 4 1543 1559 1560 1544 0.3 0.2 0.2 1 4 1544 1560 1561 1545 0.3 0.2 0.2 1 4 1545 1561 1562 1546 0.3 0.2 0.2 1 4 1546 1562 1563 1547 0.3 0.2 0.2 1 4 1547 1563 1564 1548 0.3 0.2 0.2 1 4 1548 1564 1565 1549 0.3 0.2 0.2 1 4 1549 1565 1566 1550 0.3 0.2 0.2 1 4 1550 1566 1567 1551 0.3 0.2 0.2 1 4 1551 1567 1568 1552 0.3 0.2 0.2 1 4 1552 1568 1569 1553 0.3 0.2 0.2 1 4 1553 1569 1570 1554 0.3 0.2 0.2 1 4 1554 1570 1571 1555 0.3 0.2 0.2 1 4 1555 1571 1572 1556 0.3 0.2 0.2 1 4 1556 1572 1573 1557 0.3 0.2 0.2 1 4 1557 1573 1574 1558 0.3 0.2 0.2 1 4 1558 1574 1559 1543 0.3 0.2 0.2 1 4 1559 1575 1576 1560 0.3 0.2 0.2 1 4 1560 1576 1577 1561 0.3 0.2 0.2 1 4 1561 1577 1578 1562 0.3 0.2 0.2 1 4 1562 1578 1579 1563 0.3 0.2 0.2 1 4 1563 1579 1580 1564 0.3 0.2 0.2 1 4 1564 1580 1581 1565 0.3 0.2 0.2 1 4 1565 1581 1582 1566 0.3 0.2 0.2 1 4 1566 1582 1583 1567 0.3 0.2 0.2 1 4 1567 1583 1584 1568 0.3 0.2 0.2 1 4 1568 1584 1585 1569 0.3 0.2 0.2 1 4 1569 1585 1586 1570 0.3 0.2 0.2 1 4 1570 1586 1587 1571 0.3 0.2 0.2 1 4 1571 1587 1588 1572 0.3 0.2 0.2 1 4 1572 1588 1589 1573 0.3 0.2 0.2 1 4 1573 1589 1590 1574 0.3 0.2 0.2 1 4 1574 1590 1575 1559 0.3 0.2 0.2 1 16 1575 1590 1589 1588 1587 1586 1585 1584 1583 1582 1581 1580 1579 1578 1577 1576 0.3 0.2 0.2 1 4 1591 1592 1594 1593 0.3 0.2 0.2 1 4 1593 1594 1596 1595 0.3 0.2 0.2 1 4 1595 1596 1598 1597 0.3 0.2 0.2 1 4 1597 1598 1600 1599 0.3 0.2 0.2 1 4 1599 1600 1602 1601 0.3 0.2 0.2 1 4 1601 1602 1604 1603 0.3 0.2 0.2 1 4 1603 1604 1606 1605 0.3 0.2 0.2 1 4 1605 1606 1608 1607 0.3 0.2 0.2 1 4 1607 1608 1610 1609 0.3 0.2 0.2 1 4 1609 1610 1612 1611 0.3 0.2 0.2 1 4 1611 1612 1614 1613 0.3 0.2 0.2 1 4 1613 1614 1616 1615 0.3 0.2 0.2 1 4 1615 1616 1618 1617 0.3 0.2 0.2 1 4 1617 1618 1620 1619 0.3 0.2 0.2 1 4 1619 1620 1622 1621 0.3 0.2 0.2 1 4 1621 1622 1592 1591 0.3 0.2 0.2 1 4 1623 1624 1626 1625 0.3 0.2 0.2 1 4 1625 1626 1628 1627 0.3 0.2 0.2 1 4 1627 1628 1630 1629 0.3 0.2 0.2 1 4 1629 1630 1631 1600 0.3 0.2 0.2 1 4 1600 1631 1633 1632 0.3 0.2 0.2 1 4 1632 1633 1635 1634 0.3 0.2 0.2 1 4 1634 1635 1637 1636 0.3 0.2 0.2 1 4 1636 1637 1639 1638 0.3 0.2 0.2 1 4 1638 1639 1641 1640 0.3 0.2 0.2 1 4 1640 1641 1643 1642 0.3 0.2 0.2 1 4 1642 1643 1645 1644 0.3 0.2 0.2 1 4 1644 1645 1646 1616 0.3 0.2 0.2 1 4 1616 1646 1648 1647 0.3 0.2 0.2 1 4 1647 1648 1650 1649 0.3 0.2 0.2 1 4 1649 1650 1652 1651 0.3 0.2 0.2 1 4 1651 1652 1624 1623 0.3 0.2 0.2 1 4 1653 1669 1670 1654 0.3 0.2 0.2 1 4 1654 1670 1671 1655 0.3 0.2 0.2 1 4 1655 1671 1672 1656 0.3 0.2 0.2 1 4 1656 1672 1673 1657 0.3 0.2 0.2 1 4 1657 1673 1674 1658 0.3 0.2 0.2 1 4 1658 1674 1675 1659 0.3 0.2 0.2 1 4 1659 1675 1676 1660 0.3 0.2 0.2 1 4 1660 1676 1677 1661 0.3 0.2 0.2 1 4 1661 1677 1678 1662 0.3 0.2 0.2 1 4 1662 1678 1679 1663 0.3 0.2 0.2 1 4 1663 1679 1680 1664 0.3 0.2 0.2 1 4 1664 1680 1681 1665 0.3 0.2 0.2 1 4 1665 1681 1682 1666 0.3 0.2 0.2 1 4 1666 1682 1683 1667 0.3 0.2 0.2 1 4 1667 1683 1684 1668 0.3 0.2 0.2 1 4 1668 1684 1669 1653 0.3 0.2 0.2 1 4 1669 1717 1718 1670 0.3 0.2 0.2 1 4 1670 1718 1719 1671 0.3 0.2 0.2 1 4 1671 1719 1720 1672 0.3 0.2 0.2 1 4 1672 1720 1721 1673 0.3 0.2 0.2 1 4 1673 1721 1722 1674 0.3 0.2 0.2 1 4 1674 1722 1723 1675 0.3 0.2 0.2 1 4 1675 1723 1724 1676 0.3 0.2 0.2 1 4 1676 1724 1725 1677 0.3 0.2 0.2 1 4 1677 1725 1726 1678 0.3 0.2 0.2 1 4 1678 1726 1727 1679 0.3 0.2 0.2 1 4 1679 1727 1728 1680 0.3 0.2 0.2 1 4 1680 1728 1729 1681 0.3 0.2 0.2 1 4 1681 1729 1730 1682 0.3 0.2 0.2 1 4 1682 1730 1731 1683 0.3 0.2 0.2 1 4 1683 1731 1732 1684 0.3 0.2 0.2 1 4 1684 1732 1717 1669 0.3 0.2 0.2 1 4 1717 1749 1750 1718 0.3 0.2 0.2 1 4 1718 1750 1751 1719 0.3 0.2 0.2 1 4 1719 1751 1752 1720 0.3 0.2 0.2 1 4 1720 1752 1753 1721 0.3 0.2 0.2 1 4 1721 1753 1754 1722 0.3 0.2 0.2 1 4 1722 1754 1755 1723 0.3 0.2 0.2 1 4 1723 1755 1756 1724 0.3 0.2 0.2 1 4 1724 1756 1757 1725 0.3 0.2 0.2 1 4 1725 1757 1758 1726 0.3 0.2 0.2 1 4 1726 1758 1759 1727 0.3 0.2 0.2 1 4 1727 1759 1760 1728 0.3 0.2 0.2 1 4 1728 1760 1761 1729 0.3 0.2 0.2 1 4 1729 1761 1762 1730 0.3 0.2 0.2 1 4 1730 1762 1763 1731 0.3 0.2 0.2 1 4 1731 1763 1764 1732 0.3 0.2 0.2 1 4 1732 1764 1749 1717 0.3 0.2 0.2 1 4 1686 1685 1687 1688 0.9 0.9 0.9 1 4 1688 1687 1689 1690 0.9 0.9 0.9 1 4 1690 1689 1691 1692 0.9 0.9 0.9 1 4 1692 1691 1693 1694 0.9 0.9 0.9 1 4 1694 1693 1695 1696 0.9 0.9 0.9 1 4 1696 1695 1697 1698 0.9 0.9 0.9 1 4 1698 1697 1699 1700 0.9 0.9 0.9 1 4 1700 1699 1701 1702 0.9 0.9 0.9 1 4 1702 1701 1703 1704 0.9 0.9 0.9 1 4 1704 1703 1705 1706 0.9 0.9 0.9 1 4 1706 1705 1707 1708 0.9 0.9 0.9 1 4 1708 1707 1709 1710 0.9 0.9 0.9 1 4 1710 1709 1711 1712 0.9 0.9 0.9 1 4 1712 1711 1713 1714 0.9 0.9 0.9 1 4 1714 1713 1715 1716 0.9 0.9 0.9 1 4 1716 1715 1685 1686 0.9 0.9 0.9 1 4 1733 1686 1688 1734 0.9 0.9 0.9 1 4 1734 1688 1690 1735 0.9 0.9 0.9 1 4 1735 1690 1692 1736 0.9 0.9 0.9 1 4 1736 1692 1694 1737 0.9 0.9 0.9 1 4 1737 1694 1696 1738 0.9 0.9 0.9 1 4 1738 1696 1698 1739 0.9 0.9 0.9 1 4 1739 1698 1700 1740 0.9 0.9 0.9 1 4 1740 1700 1702 1741 0.9 0.9 0.9 1 4 1741 1702 1704 1742 0.9 0.9 0.9 1 4 1742 1704 1706 1743 0.9 0.9 0.9 1 4 1743 1706 1708 1744 0.9 0.9 0.9 1 4 1744 1708 1710 1745 0.9 0.9 0.9 1 4 1745 1710 1712 1746 0.9 0.9 0.9 1 4 1746 1712 1714 1747 0.9 0.9 0.9 1 4 1747 1714 1716 1748 0.9 0.9 0.9 1 4 1748 1716 1686 1733 0.9 0.9 0.9 1 4 1765 1733 1734 1766 0.9 0.9 0.9 1 4 1766 1734 1735 1767 0.9 0.9 0.9 1 4 1767 1735 1736 1768 0.9 0.9 0.9 1 4 1768 1736 1737 1769 0.9 0.9 0.9 1 4 1769 1737 1738 1770 0.9 0.9 0.9 1 4 1770 1738 1739 1771 0.9 0.9 0.9 1 4 1771 1739 1740 1772 0.9 0.9 0.9 1 4 1772 1740 1741 1773 0.9 0.9 0.9 1 4 1773 1741 1742 1774 0.9 0.9 0.9 1 4 1774 1742 1743 1775 0.9 0.9 0.9 1 4 1775 1743 1744 1776 0.9 0.9 0.9 1 4 1776 1744 1745 1777 0.9 0.9 0.9 1 4 1777 1745 1746 1778 0.9 0.9 0.9 1 4 1778 1746 1747 1779 0.9 0.9 0.9 1 4 1779 1747 1748 1780 0.9 0.9 0.9 1 4 1780 1748 1733 1765 0.9 0.9 0.9 1 3 1533 1531 1532 0 0 0 1 3 1535 1532 1531 0 0 0 1 3 1537 1533 1534 0 0 0 1 3 1539 1534 1533 0 0 0 1 3 1538 1536 1535 0 0 0 1 3 1540 1535 1536 0 0 0 1 3 1531 1537 1538 0 0 0 1 3 1541 1538 1537 0 0 0 1 3 1532 1540 1539 0 0 0 1 3 1542 1539 1540 0 0 0 1 3 1534 1542 1541 0 0 0 1 3 1536 1541 1542 0 0 0 1 3 1531 1533 1537 0 0 0 1 3 1539 1533 1532 0 0 0 1 3 1538 1535 1531 0 0 0 1 3 1532 1535 1540 0 0 0 1 3 1537 1534 1541 0 0 0 1 3 1542 1534 1539 0 0 0 1 3 1541 1536 1538 0 0 0 1 3 1540 1536 1542 0 0 0 1 8 1795 1802 1803 1781 1782 1783 1784 1794 0.1 0.05 0.07 1 4 1783 1785 1786 1784 0.1 0.05 0.07 1 8 1787 1781 1803 1802 1795 1794 1784 1786 0.1 0.05 0.07 1 4 1787 1786 1785 1788 0.1 0.05 0.07 1 4 1782 1781 1787 1788 0.1 0.05 0.07 1 4 1785 1783 1782 1788 0.1 0.05 0.07 1 5 1792 1791 1827 1793 1794 0.586256 0.592891 0.592891 1 5 1794 1795 1824 1789 1792 0.586256 0.592891 0.592891 1 6 1795 1796 1823 1790 1789 1824 0.586256 0.592891 0.592891 1 6 1791 1790 1823 1796 1793 1827 0.586256 0.592891 0.592891 1 8 1801 1802 1821 1800 1799 1822 1842 1831 0.586256 0.592891 0.592891 1 5 1797 1800 1821 1802 1803 0.586256 0.592891 0.592891 1 5 1803 1804 1828 1798 1797 0.586256 0.592891 0.592891 1 8 1799 1798 1828 1804 1801 1831 1842 1822 0.586256 0.592891 0.592891 1 8 1809 1810 1830 1808 1807 1837 1843 1832 0.586256 0.592891 0.592891 1 6 1810 1811 1829 1805 1808 1830 0.586256 0.592891 0.592891 1 5 1806 1805 1829 1811 1812 0.586256 0.592891 0.592891 1 7 1812 1809 1832 1843 1837 1807 1806 0.586256 0.592891 0.592891 1 5 1817 1818 1826 1816 1815 0.586256 0.592891 0.592891 1 6 1818 1819 1825 1813 1816 1826 0.586256 0.592891 0.592891 1 5 1814 1813 1825 1819 1820 0.586256 0.592891 0.592891 1 4 1817 1815 1814 1820 0.586256 0.592891 0.592891 1 5 1821 1822 1839 1823 1824 0.58256 0.592891 0.592891 1 4 1823 1796 1795 1824 0.58256 0.592891 0.592891 1 4 1795 1802 1821 1824 0.58256 0.592891 0.592891 1 5 1795 1796 1836 1801 1802 0.58256 0.592891 0.592891 1 6 1802 1801 1831 1842 1822 1821 0.58256 0.592891 0.592891 1 8 1831 1801 1836 1796 1823 1839 1822 1842 0.58256 0.592891 0.592891 1 4 1823 1825 1826 1827 0.58256 0.592891 0.592891 1 4 1826 1818 1793 1827 0.58256 0.592891 0.592891 1 4 1793 1796 1823 1827 0.58256 0.592891 0.592891 1 4 1796 1793 1818 1819 0.58256 0.592891 0.592891 1 4 1825 1823 1796 1819 0.58256 0.592891 0.592891 1 4 1818 1826 1825 1819 0.58256 0.592891 0.592891 1 4 1828 1829 1830 1822 0.58256 0.592891 0.592891 1 6 1810 1801 1831 1842 1822 1830 0.58256 0.592891 0.592891 1 6 1822 1842 1831 1801 1804 1828 0.58256 0.592891 0.592891 1 4 1804 1801 1810 1811 0.58256 0.592891 0.592891 1 4 1829 1828 1804 1811 0.58256 0.592891 0.592891 1 4 1810 1830 1829 1811 0.58256 0.592891 0.592891 1 4 1831 1832 1833 1834 0.58256 0.592891 0.592891 1 4 1833 1835 1836 1834 0.58256 0.592891 0.592891 1 4 1836 1801 1831 1834 0.58256 0.592891 0.592891 1 5 1835 1809 1810 1801 1836 0.58256 0.592891 0.592891 1 5 1831 1801 1810 1809 1832 0.58256 0.592891 0.592891 1 4 1835 1833 1832 1809 0.58256 0.592891 0.592891 1 5 1839 1822 1830 1837 1838 0.58256 0.592891 0.592891 1 4 1838 1840 1841 1839 0.58256 0.592891 0.592891 1 4 1841 1842 1822 1839 0.58256 0.592891 0.592891 1 4 1842 1841 1840 1843 0.58256 0.592891 0.592891 1 5 1843 1837 1830 1822 1842 0.58256 0.592891 0.592891 1 4 1840 1838 1837 1843 0.58256 0.592891 0.592891 1 8 1853 1862 1861 1844 1845 1846 1847 1854 0.586256 0.592891 0.592891 1 4 1846 1848 1849 1847 0.586256 0.592891 0.592891 1 12 1859 1864 1867 1850 1844 1861 1862 1853 1854 1847 1849 1856 0.586256 0.592891 0.592891 1 8 1851 1850 1867 1864 1859 1856 1849 1848 0.586256 0.592891 0.592891 1 4 1845 1844 1850 1851 0.586256 0.592891 0.592891 1 4 1848 1846 1845 1851 0.586256 0.592891 0.592891 1 4 1852 1853 1854 1855 0.586256 0.592891 0.592891 1 4 1854 1856 1857 1855 0.586256 0.592891 0.592891 1 4 1857 1858 1852 1855 0.586256 0.592891 0.592891 1 4 1858 1857 1856 1859 0.586256 0.592891 0.592891 1 4 1853 1852 1858 1859 0.586256 0.592891 0.592891 1 4 1856 1854 1853 1859 0.586256 0.592891 0.592891 1 4 1860 1861 1862 1863 0.586256 0.592891 0.592891 1 4 1862 1864 1865 1863 0.586256 0.592891 0.592891 1 4 1865 1866 1860 1863 0.586256 0.592891 0.592891 1 4 1866 1865 1864 1867 0.586256 0.592891 0.592891 1 4 1861 1860 1866 1867 0.586256 0.592891 0.592891 1 4 1864 1862 1861 1867 0.586256 0.592891 0.592891 1 8 1877 1886 1885 1868 1869 1870 1871 1878 0.586256 0.592891 0.592891 1 4 1870 1872 1873 1871 0.586256 0.592891 0.592891 1 12 1883 1888 1891 1874 1868 1885 1886 1877 1878 1871 1873 1880 0.586256 0.592891 0.592891 1 8 1875 1874 1891 1888 1883 1880 1873 1872 0.586256 0.592891 0.592891 1 4 1869 1868 1874 1875 0.586256 0.592891 0.592891 1 4 1872 1870 1869 1875 0.586256 0.592891 0.592891 1 4 1876 1877 1878 1879 0.586256 0.592891 0.592891 1 4 1878 1880 1881 1879 0.586256 0.592891 0.592891 1 4 1881 1882 1876 1879 0.586256 0.592891 0.592891 1 4 1882 1881 1880 1883 0.586256 0.592891 0.592891 1 4 1877 1876 1882 1883 0.586256 0.592891 0.592891 1 4 1880 1878 1877 1883 0.586256 0.592891 0.592891 1 4 1884 1885 1886 1887 0.586256 0.592891 0.592891 1 4 1886 1888 1889 1887 0.586256 0.592891 0.592891 1 4 1889 1890 1884 1887 0.586256 0.592891 0.592891 1 4 1890 1889 1888 1891 0.586256 0.592891 0.592891 1 4 1885 1884 1890 1891 0.586256 0.592891 0.592891 1 4 1888 1886 1885 1891 0.586256 0.592891 0.592891 1 4 1892 1893 1894 1895 0.332589 0.204 0.071 1 4 1896 1897 1898 1894 0.332589 0.204 0.071 1 4 1899 1900 1901 1896 0.332589 0.204 0.071 1 4 1902 1903 1899 1893 0.332589 0.204 0.071 1 4 1900 1903 1904 1905 0.332589 0.204 0.071 1 4 1901 1900 1905 1906 0.332589 0.204 0.071 1 4 1897 1901 1906 1907 0.332589 0.204 0.071 1 4 1898 1897 1907 1908 0.332589 0.204 0.071 1 4 1895 1898 1908 1909 0.332589 0.204 0.071 1 4 1892 1895 1909 1910 0.332589 0.204 0.071 1 4 1902 1892 1910 1911 0.332589 0.204 0.071 1 4 1903 1902 1911 1904 0.332589 0.204 0.071 1 4 1893 1899 1912 1913 0.332589 0.204 0.071 1 4 1894 1893 1913 1914 0.332589 0.204 0.071 1 4 1896 1894 1914 1915 0.332589 0.204 0.071 1 4 1899 1896 1915 1912 0.332589 0.204 0.071 1 4 1916 1917 1918 1919 0.332589 0.204 0.071 1 4 1920 1921 1922 1923 0.332589 0.204 0.071 1 4 1923 1922 1924 1925 0.332589 0.204 0.071 1 4 1925 1924 1926 1927 0.332589 0.204 0.071 1 4 1927 1926 1921 1920 0.332589 0.204 0.071 1 4 1928 1929 1930 1931 0.332589 0.204 0.071 1 4 1931 1930 1932 1933 0.332589 0.204 0.071 1 4 1933 1932 1934 1935 0.332589 0.204 0.071 1 4 1935 1934 1929 1928 0.332589 0.204 0.071 1 4 1936 1937 1938 1939 0.332589 0.204 0.071 1 4 1939 1938 1940 1941 0.332589 0.204 0.071 1 4 1941 1940 1942 1943 0.332589 0.204 0.071 1 4 1943 1942 1937 1936 0.332589 0.204 0.071 1 4 1944 1919 1945 1946 0.332589 0.204 0.071 1 4 1946 1945 1947 1948 0.332589 0.204 0.071 1 4 1948 1947 1916 1949 0.332589 0.204 0.071 1 4 1949 1916 1919 1944 0.332589 0.204 0.071 1 4 1929 1924 1922 1930 0.332589 0.204 0.071 1 4 1937 1947 1945 1938 0.332589 0.204 0.071 1 4 1921 1950 1951 1932 0.332589 0.204 0.071 1 4 1932 1951 1952 1934 0.332589 0.204 0.071 1 4 1934 1952 1953 1926 0.332589 0.204 0.071 1 4 1926 1953 1950 1921 0.332589 0.204 0.071 1 4 1919 1918 1954 1940 0.332589 0.204 0.071 1 4 1940 1954 1955 1942 0.332589 0.204 0.071 1 4 1942 1955 1917 1916 0.332589 0.204 0.071 1 4 1916 1917 1918 1919 0.332589 0.204 0.071 1 4 1956 1957 1958 1959 0.3 0.2 0.1 1 4 1960 1961 1950 1953 0.332589 0.204 0.071 1 4 1962 1963 1964 1965 0.332589 0.204 0.071 1 4 1952 1951 1966 1967 0.332589 0.204 0.071 1 4 1955 1954 1968 1969 0.332589 0.204 0.071 1 4 1970 1971 1972 1973 0.332589 0.204 0.071 1 4 1974 1975 1918 1917 0.332589 0.204 0.071 1 4 1964 1976 1977 1965 0.332589 0.204 0.071 1 4 1965 1977 1978 1960 0.332589 0.204 0.071 1 4 1960 1978 1979 1961 0.332589 0.204 0.071 1 4 1961 1979 1976 1964 0.332589 0.204 0.071 1 4 1966 1980 1981 1967 0.332589 0.204 0.071 1 4 1967 1981 1982 1962 0.332589 0.204 0.071 1 4 1962 1982 1983 1963 0.332589 0.204 0.071 1 4 1963 1983 1980 1966 0.332589 0.204 0.071 1 4 1970 1984 1985 1971 0.332589 0.204 0.071 1 4 1971 1985 1986 1968 0.332589 0.204 0.071 1 4 1968 1986 1987 1969 0.332589 0.204 0.071 1 4 1969 1987 1984 1970 0.332589 0.204 0.071 1 4 1974 1988 1989 1975 0.332589 0.204 0.071 1 4 1975 1989 1990 1972 0.332589 0.204 0.071 1 4 1972 1990 1991 1973 0.332589 0.204 0.071 1 4 1973 1991 1988 1974 0.332589 0.204 0.071 1 4 1956 1959 1992 1993 0.3 0.2 0.1 1 4 1959 1958 1994 1992 0.3 0.2 0.1 1 4 1958 1957 1995 1994 0.3 0.2 0.1 1 4 1957 1956 1993 1995 0.3 0.2 0.1 1 4 1994 1995 1993 1992 0.332589 0.204 0.071 1 4 1996 1997 1998 1999 0.64499 0.711458 0.704812 1 4 1997 1996 1999 1998 0.64499 0.711458 0.704812 1 4 2000 2001 2002 2003 0.286061 0.22624 0.159772 1 4 2002 2004 2005 2003 0.286061 0.22624 0.159772 1 4 2005 2006 2000 2003 0.286061 0.22624 0.159772 1 4 2006 2005 2004 2007 0.286061 0.22624 0.159772 1 4 2001 2000 2006 2007 0.286061 0.22624 0.159772 1 4 2004 2002 2001 2007 0.286061 0.22624 0.159772 1 4 2008 2009 2010 2011 0.286061 0.22624 0.159772 1 4 2010 2012 2013 2011 0.286061 0.22624 0.159772 1 4 2013 2014 2008 2011 0.286061 0.22624 0.159772 1 4 2014 2013 2012 2015 0.286061 0.22624 0.159772 1 4 2009 2008 2014 2015 0.286061 0.22624 0.159772 1 4 2012 2010 2009 2015 0.286061 0.22624 0.159772 1 4 2016 2001 2010 2017 0.286061 0.22624 0.159772 1 4 2010 2012 2018 2017 0.286061 0.22624 0.159772 1 4 2018 2019 2016 2017 0.286061 0.22624 0.159772 1 4 2019 2018 2012 2007 0.286061 0.22624 0.159772 1 4 2001 2016 2019 2007 0.286061 0.22624 0.159772 1 4 2012 2010 2001 2007 0.286061 0.22624 0.159772 1 4 2000 2020 2021 2011 0.286061 0.22624 0.159772 1 4 2021 2022 2013 2011 0.286061 0.22624 0.159772 1 4 2013 2006 2000 2011 0.286061 0.22624 0.159772 1 4 2006 2013 2022 2023 0.286061 0.22624 0.159772 1 4 2020 2000 2006 2023 0.286061 0.22624 0.159772 1 4 2022 2021 2020 2023 0.286061 0.22624 0.159772 1 4 2028 2025 2024 2026 0.4 0.3 0.2 1 4 2029 2027 2024 2025 0.4 0.3 0.2 1 4 2030 2026 2024 2027 0.4 0.3 0.2 1 4 2031 2030 2027 2029 0.4 0.3 0.2 1 4 2031 2028 2026 2030 0.4 0.3 0.2 1 4 2031 2029 2025 2028 0.4 0.3 0.2 1 4 2036 2033 2032 2034 0.4 0.3 0.2 1 4 2037 2035 2032 2033 0.4 0.3 0.2 1 4 2038 2034 2032 2035 0.4 0.3 0.2 1 4 2039 2038 2035 2037 0.4 0.3 0.2 1 4 2039 2036 2034 2038 0.4 0.3 0.2 1 4 2039 2037 2033 2036 0.4 0.3 0.2 1 4 2045 2043 2040 2041 0.4 0.3 0.2 1 4 2046 2042 2040 2043 0.4 0.3 0.2 1 4 2047 2044 2042 2046 0.4 0.3 0.2 1 4 2061 2062 2048 2051 0.7 0.7 0.7 1 4 2048 2049 2050 2051 0.672512 0.652607 0.44692 1 4 2050 2052 2053 2051 0.672512 0.652607 0.44692 1 4 2058 2060 2061 2059 0.672512 0.652607 0.44692 1 4 2062 2061 2060 2063 0.672512 0.652607 0.44692 1 4 2053 2052 2064 2065 0.672512 0.652607 0.44692 1 4 2064 2066 2067 2065 0.672512 0.652607 0.44692 1 4 2067 2059 2053 2065 0.672512 0.652607 0.44692 1 4 2059 2067 2066 2058 0.672512 0.652607 0.44692 1 4 2066 2064 2052 2058 0.672512 0.652607 0.44692 1 4 2089 2090 2076 2079 0.7 0.7 0.7 1 4 2076 2077 2078 2079 0.360664 0.453555 0.659242 1 4 2078 2080 2081 2079 0.360664 0.453555 0.659242 1 4 2086 2088 2089 2087 0.360664 0.453555 0.659242 1 4 2090 2089 2088 2091 0.360664 0.453555 0.659242 1 4 2081 2080 2092 2093 0.360664 0.453555 0.659242 1 4 2092 2094 2095 2093 0.360664 0.453555 0.659242 1 4 2095 2087 2081 2093 0.360664 0.453555 0.659242 1 4 2087 2095 2094 2086 0.360664 0.453555 0.659242 1 4 2094 2092 2080 2086 0.360664 0.453555 0.659242 1 4 2117 2118 2104 2107 0.7 0.7 0.7 1 4 2104 2105 2106 2107 0.825119 0.838389 0.705687 1 4 2106 2108 2109 2107 0.825119 0.838389 0.705687 1 4 2114 2116 2117 2115 0.825119 0.838389 0.705687 1 4 2118 2117 2116 2119 0.825119 0.838389 0.705687 1 4 2109 2108 2120 2121 0.825119 0.838389 0.705687 1 4 2120 2122 2123 2121 0.825119 0.838389 0.705687 1 4 2123 2115 2109 2121 0.825119 0.838389 0.705687 1 4 2115 2123 2122 2114 0.825119 0.838389 0.705687 1 4 2122 2120 2108 2114 0.825119 0.838389 0.705687 1 4 2145 2146 2132 2135 0.7 0.7 0.7 1 4 2132 2133 2134 2135 0.672512 0.652607 0.44692 1 4 2134 2136 2137 2135 0.672512 0.652607 0.44692 1 4 2142 2144 2145 2143 0.672512 0.652607 0.44692 1 4 2146 2145 2144 2147 0.672512 0.652607 0.44692 1 4 2137 2136 2148 2149 0.672512 0.652607 0.44692 1 4 2148 2150 2151 2149 0.672512 0.652607 0.44692 1 4 2151 2143 2137 2149 0.672512 0.652607 0.44692 1 4 2143 2151 2150 2142 0.672512 0.652607 0.44692 1 4 2150 2148 2136 2142 0.672512 0.652607 0.44692 1 4 2173 2174 2160 2163 0.7 0.7 0.7 1 4 2160 2161 2162 2163 0.360664 0.453555 0.659242 1 4 2162 2164 2165 2163 0.360664 0.453555 0.659242 1 4 2170 2172 2173 2171 0.360664 0.453555 0.659242 1 4 2174 2173 2172 2175 0.360664 0.453555 0.659242 1 4 2165 2164 2176 2177 0.360664 0.453555 0.659242 1 4 2176 2178 2179 2177 0.360664 0.453555 0.659242 1 4 2179 2171 2165 2177 0.360664 0.453555 0.659242 1 4 2171 2179 2178 2170 0.360664 0.453555 0.659242 1 4 2178 2176 2164 2170 0.360664 0.453555 0.659242 1 4 2201 2202 2188 2191 0.7 0.7 0.7 1 4 2188 2189 2190 2191 0.407109 0.718958 0.48673 1 4 2190 2192 2193 2191 0.407109 0.718958 0.48673 1 4 2198 2200 2201 2199 0.407109 0.718958 0.48673 1 4 2202 2201 2200 2203 0.407109 0.718958 0.48673 1 4 2193 2192 2204 2205 0.407109 0.718958 0.48673 1 4 2204 2206 2207 2205 0.407109 0.718958 0.48673 1 4 2207 2199 2193 2205 0.407109 0.718958 0.48673 1 4 2199 2207 2206 2198 0.407109 0.718958 0.48673 1 4 2206 2204 2192 2198 0.407109 0.718958 0.48673 1 4 2229 2230 2216 2219 0.7 0.7 0.7 1 4 2216 2217 2218 2219 0.672512 0.652607 0.44692 1 4 2218 2220 2221 2219 0.672512 0.652607 0.44692 1 4 2226 2228 2229 2227 0.672512 0.652607 0.44692 1 4 2230 2229 2228 2231 0.672512 0.652607 0.44692 1 4 2221 2220 2232 2233 0.672512 0.652607 0.44692 1 4 2232 2234 2235 2233 0.672512 0.652607 0.44692 1 4 2235 2227 2221 2233 0.672512 0.652607 0.44692 1 4 2227 2235 2234 2226 0.672512 0.652607 0.44692 1 4 2234 2232 2220 2226 0.672512 0.652607 0.44692 1 4 2257 2258 2244 2247 0.7 0.7 0.7 1 4 2244 2245 2246 2247 0.407109 0.718958 0.48673 1 4 2246 2248 2249 2247 0.407109 0.718958 0.48673 1 4 2254 2256 2257 2255 0.407109 0.718958 0.48673 1 4 2258 2257 2256 2259 0.407109 0.718958 0.48673 1 4 2249 2248 2260 2261 0.407109 0.718958 0.48673 1 4 2260 2262 2263 2261 0.407109 0.718958 0.48673 1 4 2263 2255 2249 2261 0.407109 0.718958 0.48673 1 4 2255 2263 2262 2254 0.407109 0.718958 0.48673 1 4 2262 2260 2248 2254 0.407109 0.718958 0.48673 1 4 2285 2286 2272 2275 0.7 0.7 0.7 1 4 2272 2273 2274 2275 0.878199 0.586256 0.47346 1 4 2274 2276 2277 2275 0.878199 0.586256 0.47346 1 4 2282 2284 2285 2283 0.878199 0.586256 0.47346 1 4 2286 2285 2284 2287 0.878199 0.586256 0.47346 1 4 2277 2276 2288 2289 0.878199 0.586256 0.47346 1 4 2288 2290 2291 2289 0.878199 0.586256 0.47346 1 4 2291 2283 2277 2289 0.878199 0.586256 0.47346 1 4 2283 2291 2290 2282 0.878199 0.586256 0.47346 1 4 2290 2288 2276 2282 0.878199 0.586256 0.47346 1 4 2313 2314 2300 2303 0.7 0.7 0.7 1 4 2300 2301 2302 2303 0.672512 0.652607 0.44692 1 4 2302 2304 2305 2303 0.672512 0.652607 0.44692 1 4 2310 2312 2313 2311 0.672512 0.652607 0.44692 1 4 2314 2313 2312 2315 0.672512 0.652607 0.44692 1 4 2305 2304 2316 2317 0.672512 0.652607 0.44692 1 4 2316 2318 2319 2317 0.672512 0.652607 0.44692 1 4 2319 2311 2305 2317 0.672512 0.652607 0.44692 1 4 2311 2319 2318 2310 0.672512 0.652607 0.44692 1 4 2318 2316 2304 2310 0.672512 0.652607 0.44692 1 4 2341 2342 2328 2331 0.7 0.7 0.7 1 4 2328 2329 2330 2331 0.407109 0.718958 0.48673 1 4 2330 2332 2333 2331 0.407109 0.718958 0.48673 1 4 2338 2340 2341 2339 0.407109 0.718958 0.48673 1 4 2342 2341 2340 2343 0.407109 0.718958 0.48673 1 4 2333 2332 2344 2345 0.407109 0.718958 0.48673 1 4 2344 2346 2347 2345 0.407109 0.718958 0.48673 1 4 2347 2339 2333 2345 0.407109 0.718958 0.48673 1 4 2339 2347 2346 2338 0.407109 0.718958 0.48673 1 4 2346 2344 2332 2338 0.407109 0.718958 0.48673 1 4 2369 2370 2356 2359 0.7 0.7 0.7 1 4 2356 2357 2358 2359 0.360664 0.453555 0.659242 1 4 2358 2360 2361 2359 0.360664 0.453555 0.659242 1 4 2366 2368 2369 2367 0.360664 0.453555 0.659242 1 4 2370 2369 2368 2371 0.360664 0.453555 0.659242 1 4 2361 2360 2372 2373 0.360664 0.453555 0.659242 1 4 2372 2374 2375 2373 0.360664 0.453555 0.659242 1 4 2375 2367 2361 2373 0.360664 0.453555 0.659242 1 4 2367 2375 2374 2366 0.360664 0.453555 0.659242 1 4 2374 2372 2360 2366 0.360664 0.453555 0.659242 1 4 2397 2398 2384 2387 0.7 0.7 0.7 1 4 2384 2385 2386 2387 0.878199 0.586256 0.47346 1 4 2386 2388 2389 2387 0.878199 0.586256 0.47346 1 4 2394 2396 2397 2395 0.878199 0.586256 0.47346 1 4 2398 2397 2396 2399 0.878199 0.586256 0.47346 1 4 2389 2388 2400 2401 0.878199 0.586256 0.47346 1 4 2400 2402 2403 2401 0.878199 0.586256 0.47346 1 4 2403 2395 2389 2401 0.878199 0.586256 0.47346 1 4 2395 2403 2402 2394 0.878199 0.586256 0.47346 1 4 2402 2400 2388 2394 0.878199 0.586256 0.47346 1 4 2425 2426 2412 2415 0.7 0.7 0.7 1 4 2412 2413 2414 2415 0.360664 0.453555 0.659242 1 4 2414 2416 2417 2415 0.360664 0.453555 0.659242 1 4 2422 2424 2425 2423 0.360664 0.453555 0.659242 1 4 2426 2425 2424 2427 0.360664 0.453555 0.659242 1 4 2417 2416 2428 2429 0.360664 0.453555 0.659242 1 4 2428 2430 2431 2429 0.360664 0.453555 0.659242 1 4 2431 2423 2417 2429 0.360664 0.453555 0.659242 1 4 2423 2431 2430 2422 0.360664 0.453555 0.659242 1 4 2430 2428 2416 2422 0.360664 0.453555 0.659242 1 4 2445 2443 2440 2441 0.4 0.3 0.2 1 4 2446 2442 2440 2443 0.4 0.3 0.2 1 4 2447 2444 2442 2446 0.4 0.3 0.2 1 4 2461 2462 2448 2451 0.7 0.7 0.7 1 4 2448 2449 2450 2451 0.44692 0.261137 0.48673 1 4 2450 2452 2453 2451 0.44692 0.261137 0.48673 1 4 2458 2460 2461 2459 0.44692 0.261137 0.48673 1 4 2462 2461 2460 2463 0.44692 0.261137 0.48673 1 4 2453 2452 2464 2465 0.44692 0.261137 0.48673 1 4 2464 2466 2467 2465 0.44692 0.261137 0.48673 1 4 2467 2459 2453 2465 0.44692 0.261137 0.48673 1 4 2459 2467 2466 2458 0.44692 0.261137 0.48673 1 4 2466 2464 2452 2458 0.44692 0.261137 0.48673 1 4 2489 2490 2476 2479 0.7 0.7 0.7 1 4 2476 2477 2478 2479 0.825119 0.838389 0.705687 1 4 2478 2480 2481 2479 0.825119 0.838389 0.705687 1 4 2486 2488 2489 2487 0.825119 0.838389 0.705687 1 4 2490 2489 2488 2491 0.825119 0.838389 0.705687 1 4 2481 2480 2492 2493 0.825119 0.838389 0.705687 1 4 2492 2494 2495 2493 0.825119 0.838389 0.705687 1 4 2495 2487 2481 2493 0.825119 0.838389 0.705687 1 4 2487 2495 2494 2486 0.825119 0.838389 0.705687 1 4 2494 2492 2480 2486 0.825119 0.838389 0.705687 1 4 2517 2518 2504 2507 0.7 0.7 0.7 1 4 2504 2505 2506 2507 0.878199 0.586256 0.47346 1 4 2506 2508 2509 2507 0.878199 0.586256 0.47346 1 4 2514 2516 2517 2515 0.878199 0.586256 0.47346 1 4 2518 2517 2516 2519 0.878199 0.586256 0.47346 1 4 2509 2508 2520 2521 0.878199 0.586256 0.47346 1 4 2520 2522 2523 2521 0.878199 0.586256 0.47346 1 4 2523 2515 2509 2521 0.878199 0.586256 0.47346 1 4 2515 2523 2522 2514 0.878199 0.586256 0.47346 1 4 2522 2520 2508 2514 0.878199 0.586256 0.47346 1 4 2545 2546 2532 2535 0.7 0.7 0.7 1 4 2532 2533 2534 2535 0.878199 0.586256 0.47346 1 4 2534 2536 2537 2535 0.878199 0.586256 0.47346 1 4 2542 2544 2545 2543 0.878199 0.586256 0.47346 1 4 2546 2545 2544 2547 0.878199 0.586256 0.47346 1 4 2537 2536 2548 2549 0.878199 0.586256 0.47346 1 4 2548 2550 2551 2549 0.878199 0.586256 0.47346 1 4 2551 2543 2537 2549 0.878199 0.586256 0.47346 1 4 2543 2551 2550 2542 0.878199 0.586256 0.47346 1 4 2550 2548 2536 2542 0.878199 0.586256 0.47346 1 4 2573 2574 2560 2563 0.7 0.7 0.7 1 4 2560 2561 2562 2563 0.360664 0.453555 0.659242 1 4 2562 2564 2565 2563 0.360664 0.453555 0.659242 1 4 2570 2572 2573 2571 0.360664 0.453555 0.659242 1 4 2574 2573 2572 2575 0.360664 0.453555 0.659242 1 4 2565 2564 2576 2577 0.360664 0.453555 0.659242 1 4 2576 2578 2579 2577 0.360664 0.453555 0.659242 1 4 2579 2571 2565 2577 0.360664 0.453555 0.659242 1 4 2571 2579 2578 2570 0.360664 0.453555 0.659242 1 4 2578 2576 2564 2570 0.360664 0.453555 0.659242 1 4 2601 2602 2588 2591 0.7 0.7 0.7 1 4 2588 2589 2590 2591 0.44692 0.261137 0.48673 1 4 2590 2592 2593 2591 0.44692 0.261137 0.48673 1 4 2598 2600 2601 2599 0.44692 0.261137 0.48673 1 4 2602 2601 2600 2603 0.44692 0.261137 0.48673 1 4 2593 2592 2604 2605 0.44692 0.261137 0.48673 1 4 2604 2606 2607 2605 0.44692 0.261137 0.48673 1 4 2607 2599 2593 2605 0.44692 0.261137 0.48673 1 4 2599 2607 2606 2598 0.44692 0.261137 0.48673 1 4 2606 2604 2592 2598 0.44692 0.261137 0.48673 1 4 2629 2630 2616 2619 0.7 0.7 0.7 1 4 2616 2617 2618 2619 0.672512 0.652607 0.44692 1 4 2618 2620 2621 2619 0.672512 0.652607 0.44692 1 4 2626 2628 2629 2627 0.672512 0.652607 0.44692 1 4 2630 2629 2628 2631 0.672512 0.652607 0.44692 1 4 2621 2620 2632 2633 0.672512 0.652607 0.44692 1 4 2632 2634 2635 2633 0.672512 0.652607 0.44692 1 4 2635 2627 2621 2633 0.672512 0.652607 0.44692 1 4 2627 2635 2634 2626 0.672512 0.652607 0.44692 1 4 2634 2632 2620 2626 0.672512 0.652607 0.44692 1 4 2657 2658 2644 2647 0.7 0.7 0.7 1 4 2644 2645 2646 2647 0.672512 0.652607 0.44692 1 4 2646 2648 2649 2647 0.672512 0.652607 0.44692 1 4 2654 2656 2657 2655 0.672512 0.652607 0.44692 1 4 2658 2657 2656 2659 0.672512 0.652607 0.44692 1 4 2649 2648 2660 2661 0.672512 0.652607 0.44692 1 4 2660 2662 2663 2661 0.672512 0.652607 0.44692 1 4 2663 2655 2649 2661 0.672512 0.652607 0.44692 1 4 2655 2663 2662 2654 0.672512 0.652607 0.44692 1 4 2662 2660 2648 2654 0.672512 0.652607 0.44692 1 4 2685 2686 2672 2675 0.7 0.7 0.7 1 4 2672 2673 2674 2675 0.825119 0.838389 0.705687 1 4 2674 2676 2677 2675 0.825119 0.838389 0.705687 1 4 2682 2684 2685 2683 0.825119 0.838389 0.705687 1 4 2686 2685 2684 2687 0.825119 0.838389 0.705687 1 4 2677 2676 2688 2689 0.825119 0.838389 0.705687 1 4 2688 2690 2691 2689 0.825119 0.838389 0.705687 1 4 2691 2683 2677 2689 0.825119 0.838389 0.705687 1 4 2683 2691 2690 2682 0.825119 0.838389 0.705687 1 4 2690 2688 2676 2682 0.825119 0.838389 0.705687 1 4 2713 2714 2700 2703 0.7 0.7 0.7 1 4 2700 2701 2702 2703 0.44692 0.261137 0.48673 1 4 2702 2704 2705 2703 0.44692 0.261137 0.48673 1 4 2710 2712 2713 2711 0.44692 0.261137 0.48673 1 4 2714 2713 2712 2715 0.44692 0.261137 0.48673 1 4 2705 2704 2716 2717 0.44692 0.261137 0.48673 1 4 2716 2718 2719 2717 0.44692 0.261137 0.48673 1 4 2719 2711 2705 2717 0.44692 0.261137 0.48673 1 4 2711 2719 2718 2710 0.44692 0.261137 0.48673 1 4 2718 2716 2704 2710 0.44692 0.261137 0.48673 1 4 2733 2731 2728 2729 0.4 0.3 0.2 1 4 2734 2730 2728 2731 0.4 0.3 0.2 1 4 2735 2732 2730 2734 0.4 0.3 0.2 1 4 2749 2750 2736 2739 0.7 0.7 0.7 1 4 2736 2737 2738 2739 0.360664 0.453555 0.659242 1 4 2738 2740 2741 2739 0.360664 0.453555 0.659242 1 4 2746 2748 2749 2747 0.360664 0.453555 0.659242 1 4 2750 2749 2748 2751 0.360664 0.453555 0.659242 1 4 2741 2740 2752 2753 0.360664 0.453555 0.659242 1 4 2752 2754 2755 2753 0.360664 0.453555 0.659242 1 4 2755 2747 2741 2753 0.360664 0.453555 0.659242 1 4 2747 2755 2754 2746 0.360664 0.453555 0.659242 1 4 2754 2752 2740 2746 0.360664 0.453555 0.659242 1 4 2777 2778 2764 2767 0.7 0.7 0.7 1 4 2764 2765 2766 2767 0.825119 0.838389 0.705687 1 4 2766 2768 2769 2767 0.825119 0.838389 0.705687 1 4 2774 2776 2777 2775 0.825119 0.838389 0.705687 1 4 2778 2777 2776 2779 0.825119 0.838389 0.705687 1 4 2769 2768 2780 2781 0.825119 0.838389 0.705687 1 4 2780 2782 2783 2781 0.825119 0.838389 0.705687 1 4 2783 2775 2769 2781 0.825119 0.838389 0.705687 1 4 2775 2783 2782 2774 0.825119 0.838389 0.705687 1 4 2782 2780 2768 2774 0.825119 0.838389 0.705687 1 4 2805 2806 2792 2795 0.7 0.7 0.7 1 4 2792 2793 2794 2795 0.878199 0.586256 0.47346 1 4 2794 2796 2797 2795 0.878199 0.586256 0.47346 1 4 2802 2804 2805 2803 0.878199 0.586256 0.47346 1 4 2806 2805 2804 2807 0.878199 0.586256 0.47346 1 4 2797 2796 2808 2809 0.878199 0.586256 0.47346 1 4 2808 2810 2811 2809 0.878199 0.586256 0.47346 1 4 2811 2803 2797 2809 0.878199 0.586256 0.47346 1 4 2803 2811 2810 2802 0.878199 0.586256 0.47346 1 4 2810 2808 2796 2802 0.878199 0.586256 0.47346 1 4 2833 2834 2820 2823 0.7 0.7 0.7 1 4 2820 2821 2822 2823 0.672512 0.652607 0.44692 1 4 2822 2824 2825 2823 0.672512 0.652607 0.44692 1 4 2830 2832 2833 2831 0.672512 0.652607 0.44692 1 4 2834 2833 2832 2835 0.672512 0.652607 0.44692 1 4 2825 2824 2836 2837 0.672512 0.652607 0.44692 1 4 2836 2838 2839 2837 0.672512 0.652607 0.44692 1 4 2839 2831 2825 2837 0.672512 0.652607 0.44692 1 4 2831 2839 2838 2830 0.672512 0.652607 0.44692 1 4 2838 2836 2824 2830 0.672512 0.652607 0.44692 1 4 2861 2862 2848 2851 0.7 0.7 0.7 1 4 2848 2849 2850 2851 0.360664 0.453555 0.659242 1 4 2850 2852 2853 2851 0.360664 0.453555 0.659242 1 4 2858 2860 2861 2859 0.360664 0.453555 0.659242 1 4 2862 2861 2860 2863 0.360664 0.453555 0.659242 1 4 2853 2852 2864 2865 0.360664 0.453555 0.659242 1 4 2864 2866 2867 2865 0.360664 0.453555 0.659242 1 4 2867 2859 2853 2865 0.360664 0.453555 0.659242 1 4 2859 2867 2866 2858 0.360664 0.453555 0.659242 1 4 2866 2864 2852 2858 0.360664 0.453555 0.659242 1 4 2889 2890 2876 2879 0.7 0.7 0.7 1 4 2876 2877 2878 2879 0.360664 0.453555 0.659242 1 4 2878 2880 2881 2879 0.360664 0.453555 0.659242 1 4 2886 2888 2889 2887 0.360664 0.453555 0.659242 1 4 2890 2889 2888 2891 0.360664 0.453555 0.659242 1 4 2881 2880 2892 2893 0.360664 0.453555 0.659242 1 4 2892 2894 2895 2893 0.360664 0.453555 0.659242 1 4 2895 2887 2881 2893 0.360664 0.453555 0.659242 1 4 2887 2895 2894 2886 0.360664 0.453555 0.659242 1 4 2894 2892 2880 2886 0.360664 0.453555 0.659242 1 4 2917 2918 2904 2907 0.7 0.7 0.7 1 4 2904 2905 2906 2907 0.878199 0.586256 0.47346 1 4 2906 2908 2909 2907 0.878199 0.586256 0.47346 1 4 2914 2916 2917 2915 0.878199 0.586256 0.47346 1 4 2918 2917 2916 2919 0.878199 0.586256 0.47346 1 4 2909 2908 2920 2921 0.878199 0.586256 0.47346 1 4 2920 2922 2923 2921 0.878199 0.586256 0.47346 1 4 2923 2915 2909 2921 0.878199 0.586256 0.47346 1 4 2915 2923 2922 2914 0.878199 0.586256 0.47346 1 4 2922 2920 2908 2914 0.878199 0.586256 0.47346 1 4 2945 2946 2932 2935 0.7 0.7 0.7 1 4 2932 2933 2934 2935 0.825119 0.838389 0.705687 1 4 2934 2936 2937 2935 0.825119 0.838389 0.705687 1 4 2942 2944 2945 2943 0.825119 0.838389 0.705687 1 4 2946 2945 2944 2947 0.825119 0.838389 0.705687 1 4 2937 2936 2948 2949 0.825119 0.838389 0.705687 1 4 2948 2950 2951 2949 0.825119 0.838389 0.705687 1 4 2951 2943 2937 2949 0.825119 0.838389 0.705687 1 4 2943 2951 2950 2942 0.825119 0.838389 0.705687 1 4 2950 2948 2936 2942 0.825119 0.838389 0.705687 1 4 2973 2974 2960 2963 0.7 0.7 0.7 1 4 2960 2961 2962 2963 0.672512 0.652607 0.44692 1 4 2962 2964 2965 2963 0.672512 0.652607 0.44692 1 4 2970 2972 2973 2971 0.672512 0.652607 0.44692 1 4 2974 2973 2972 2975 0.672512 0.652607 0.44692 1 4 2965 2964 2976 2977 0.672512 0.652607 0.44692 1 4 2976 2978 2979 2977 0.672512 0.652607 0.44692 1 4 2979 2971 2965 2977 0.672512 0.652607 0.44692 1 4 2971 2979 2978 2970 0.672512 0.652607 0.44692 1 4 2978 2976 2964 2970 0.672512 0.652607 0.44692 1 4 3001 3002 2988 2991 0.7 0.7 0.7 1 4 2988 2989 2990 2991 0.360664 0.453555 0.659242 1 4 2990 2992 2993 2991 0.360664 0.453555 0.659242 1 4 2998 3000 3001 2999 0.360664 0.453555 0.659242 1 4 3002 3001 3000 3003 0.360664 0.453555 0.659242 1 4 2993 2992 3004 3005 0.360664 0.453555 0.659242 1 4 3004 3006 3007 3005 0.360664 0.453555 0.659242 1 4 3007 2999 2993 3005 0.360664 0.453555 0.659242 1 4 2999 3007 3006 2998 0.360664 0.453555 0.659242 1 4 3006 3004 2992 2998 0.360664 0.453555 0.659242 1 4 3029 3030 3016 3019 0.7 0.7 0.7 1 4 3016 3017 3018 3019 0.672512 0.652607 0.44692 1 4 3018 3020 3021 3019 0.672512 0.652607 0.44692 1 4 3026 3028 3029 3027 0.672512 0.652607 0.44692 1 4 3030 3029 3028 3031 0.672512 0.652607 0.44692 1 4 3021 3020 3032 3033 0.672512 0.652607 0.44692 1 4 3032 3034 3035 3033 0.672512 0.652607 0.44692 1 4 3035 3027 3021 3033 0.672512 0.652607 0.44692 1 4 3027 3035 3034 3026 0.672512 0.652607 0.44692 1 4 3034 3032 3020 3026 0.672512 0.652607 0.44692 1 4 3057 3058 3044 3047 0.7 0.7 0.7 1 4 3044 3045 3046 3047 0.825119 0.838389 0.705687 1 4 3046 3048 3049 3047 0.825119 0.838389 0.705687 1 4 3054 3056 3057 3055 0.825119 0.838389 0.705687 1 4 3058 3057 3056 3059 0.825119 0.838389 0.705687 1 4 3049 3048 3060 3061 0.825119 0.838389 0.705687 1 4 3060 3062 3063 3061 0.825119 0.838389 0.705687 1 4 3063 3055 3049 3061 0.825119 0.838389 0.705687 1 4 3055 3063 3062 3054 0.825119 0.838389 0.705687 1 4 3062 3060 3048 3054 0.825119 0.838389 0.705687 1 4 3085 3086 3072 3075 0.7 0.7 0.7 1 4 3072 3073 3074 3075 0.878199 0.586256 0.47346 1 4 3074 3076 3077 3075 0.878199 0.586256 0.47346 1 4 3082 3084 3085 3083 0.878199 0.586256 0.47346 1 4 3086 3085 3084 3087 0.878199 0.586256 0.47346 1 4 3077 3076 3088 3089 0.878199 0.586256 0.47346 1 4 3088 3090 3091 3089 0.878199 0.586256 0.47346 1 4 3091 3083 3077 3089 0.878199 0.586256 0.47346 1 4 3083 3091 3090 3082 0.878199 0.586256 0.47346 1 4 3090 3088 3076 3082 0.878199 0.586256 0.47346 1 4 3105 3103 3100 3101 0.4 0.3 0.2 1 4 3106 3102 3100 3103 0.4 0.3 0.2 1 4 3107 3104 3102 3106 0.4 0.3 0.2 1 4 3121 3122 3108 3111 0.7 0.7 0.7 1 4 3108 3109 3110 3111 0.825119 0.838389 0.705687 1 4 3110 3112 3113 3111 0.825119 0.838389 0.705687 1 4 3118 3120 3121 3119 0.825119 0.838389 0.705687 1 4 3122 3121 3120 3123 0.825119 0.838389 0.705687 1 4 3113 3112 3124 3125 0.825119 0.838389 0.705687 1 4 3124 3126 3127 3125 0.825119 0.838389 0.705687 1 4 3127 3119 3113 3125 0.825119 0.838389 0.705687 1 4 3119 3127 3126 3118 0.825119 0.838389 0.705687 1 4 3126 3124 3112 3118 0.825119 0.838389 0.705687 1 4 3149 3150 3136 3139 0.7 0.7 0.7 1 4 3136 3137 3138 3139 0.825119 0.838389 0.705687 1 4 3138 3140 3141 3139 0.825119 0.838389 0.705687 1 4 3146 3148 3149 3147 0.825119 0.838389 0.705687 1 4 3150 3149 3148 3151 0.825119 0.838389 0.705687 1 4 3141 3140 3152 3153 0.825119 0.838389 0.705687 1 4 3152 3154 3155 3153 0.825119 0.838389 0.705687 1 4 3155 3147 3141 3153 0.825119 0.838389 0.705687 1 4 3147 3155 3154 3146 0.825119 0.838389 0.705687 1 4 3154 3152 3140 3146 0.825119 0.838389 0.705687 1 4 3177 3178 3164 3167 0.7 0.7 0.7 1 4 3164 3165 3166 3167 0.672512 0.652607 0.44692 1 4 3166 3168 3169 3167 0.672512 0.652607 0.44692 1 4 3174 3176 3177 3175 0.672512 0.652607 0.44692 1 4 3178 3177 3176 3179 0.672512 0.652607 0.44692 1 4 3169 3168 3180 3181 0.672512 0.652607 0.44692 1 4 3180 3182 3183 3181 0.672512 0.652607 0.44692 1 4 3183 3175 3169 3181 0.672512 0.652607 0.44692 1 4 3175 3183 3182 3174 0.672512 0.652607 0.44692 1 4 3182 3180 3168 3174 0.672512 0.652607 0.44692 1 4 3205 3206 3192 3195 0.7 0.7 0.7 1 4 3192 3193 3194 3195 0.44692 0.261137 0.48673 1 4 3194 3196 3197 3195 0.44692 0.261137 0.48673 1 4 3202 3204 3205 3203 0.44692 0.261137 0.48673 1 4 3206 3205 3204 3207 0.44692 0.261137 0.48673 1 4 3197 3196 3208 3209 0.44692 0.261137 0.48673 1 4 3208 3210 3211 3209 0.44692 0.261137 0.48673 1 4 3211 3203 3197 3209 0.44692 0.261137 0.48673 1 4 3203 3211 3210 3202 0.44692 0.261137 0.48673 1 4 3210 3208 3196 3202 0.44692 0.261137 0.48673 1 4 3233 3234 3220 3223 0.7 0.7 0.7 1 4 3220 3221 3222 3223 0.672512 0.652607 0.44692 1 4 3222 3224 3225 3223 0.672512 0.652607 0.44692 1 4 3230 3232 3233 3231 0.672512 0.652607 0.44692 1 4 3234 3233 3232 3235 0.672512 0.652607 0.44692 1 4 3225 3224 3236 3237 0.672512 0.652607 0.44692 1 4 3236 3238 3239 3237 0.672512 0.652607 0.44692 1 4 3239 3231 3225 3237 0.672512 0.652607 0.44692 1 4 3231 3239 3238 3230 0.672512 0.652607 0.44692 1 4 3238 3236 3224 3230 0.672512 0.652607 0.44692 1 4 3261 3262 3248 3251 0.7 0.7 0.7 1 4 3248 3249 3250 3251 0.360664 0.453555 0.659242 1 4 3250 3252 3253 3251 0.360664 0.453555 0.659242 1 4 3258 3260 3261 3259 0.360664 0.453555 0.659242 1 4 3262 3261 3260 3263 0.360664 0.453555 0.659242 1 4 3253 3252 3264 3265 0.360664 0.453555 0.659242 1 4 3264 3266 3267 3265 0.360664 0.453555 0.659242 1 4 3267 3259 3253 3265 0.360664 0.453555 0.659242 1 4 3259 3267 3266 3258 0.360664 0.453555 0.659242 1 4 3266 3264 3252 3258 0.360664 0.453555 0.659242 1 4 3289 3290 3276 3279 0.7 0.7 0.7 1 4 3276 3277 3278 3279 0.360664 0.453555 0.659242 1 4 3278 3280 3281 3279 0.360664 0.453555 0.659242 1 4 3286 3288 3289 3287 0.360664 0.453555 0.659242 1 4 3290 3289 3288 3291 0.360664 0.453555 0.659242 1 4 3281 3280 3292 3293 0.360664 0.453555 0.659242 1 4 3292 3294 3295 3293 0.360664 0.453555 0.659242 1 4 3295 3287 3281 3293 0.360664 0.453555 0.659242 1 4 3287 3295 3294 3286 0.360664 0.453555 0.659242 1 4 3294 3292 3280 3286 0.360664 0.453555 0.659242 1 4 3317 3318 3304 3307 0.7 0.7 0.7 1 4 3304 3305 3306 3307 0.407109 0.718958 0.48673 1 4 3306 3308 3309 3307 0.407109 0.718958 0.48673 1 4 3314 3316 3317 3315 0.407109 0.718958 0.48673 1 4 3318 3317 3316 3319 0.407109 0.718958 0.48673 1 4 3309 3308 3320 3321 0.407109 0.718958 0.48673 1 4 3320 3322 3323 3321 0.407109 0.718958 0.48673 1 4 3323 3315 3309 3321 0.407109 0.718958 0.48673 1 4 3315 3323 3322 3314 0.407109 0.718958 0.48673 1 4 3322 3320 3308 3314 0.407109 0.718958 0.48673 1 4 3345 3346 3332 3335 0.7 0.7 0.7 1 4 3332 3333 3334 3335 0.878199 0.586256 0.47346 1 4 3334 3336 3337 3335 0.878199 0.586256 0.47346 1 4 3342 3344 3345 3343 0.878199 0.586256 0.47346 1 4 3346 3345 3344 3347 0.878199 0.586256 0.47346 1 4 3337 3336 3348 3349 0.878199 0.586256 0.47346 1 4 3348 3350 3351 3349 0.878199 0.586256 0.47346 1 4 3351 3343 3337 3349 0.878199 0.586256 0.47346 1 4 3343 3351 3350 3342 0.878199 0.586256 0.47346 1 4 3350 3348 3336 3342 0.878199 0.586256 0.47346 1 4 3373 3374 3360 3363 0.7 0.7 0.7 1 4 3360 3361 3362 3363 0.672512 0.652607 0.44692 1 4 3362 3364 3365 3363 0.672512 0.652607 0.44692 1 4 3370 3372 3373 3371 0.672512 0.652607 0.44692 1 4 3374 3373 3372 3375 0.672512 0.652607 0.44692 1 4 3365 3364 3376 3377 0.672512 0.652607 0.44692 1 4 3376 3378 3379 3377 0.672512 0.652607 0.44692 1 4 3379 3371 3365 3377 0.672512 0.652607 0.44692 1 4 3371 3379 3378 3370 0.672512 0.652607 0.44692 1 4 3378 3376 3364 3370 0.672512 0.652607 0.44692 1 4 3401 3402 3388 3391 0.7 0.7 0.7 1 4 3388 3389 3390 3391 0.825119 0.838389 0.705687 1 4 3390 3392 3393 3391 0.825119 0.838389 0.705687 1 4 3398 3400 3401 3399 0.825119 0.838389 0.705687 1 4 3402 3401 3400 3403 0.825119 0.838389 0.705687 1 4 3393 3392 3404 3405 0.825119 0.838389 0.705687 1 4 3404 3406 3407 3405 0.825119 0.838389 0.705687 1 4 3407 3399 3393 3405 0.825119 0.838389 0.705687 1 4 3399 3407 3406 3398 0.825119 0.838389 0.705687 1 4 3406 3404 3392 3398 0.825119 0.838389 0.705687 1 4 3421 3419 3416 3417 0.4 0.3 0.2 1 4 3422 3418 3416 3419 0.4 0.3 0.2 1 4 3423 3420 3418 3422 0.4 0.3 0.2 1 4 3437 3438 3424 3427 0.7 0.7 0.7 1 4 3424 3425 3426 3427 0.878199 0.586256 0.47346 1 4 3426 3428 3429 3427 0.878199 0.586256 0.47346 1 4 3434 3436 3437 3435 0.878199 0.586256 0.47346 1 4 3438 3437 3436 3439 0.878199 0.586256 0.47346 1 4 3429 3428 3440 3441 0.878199 0.586256 0.47346 1 4 3440 3442 3443 3441 0.878199 0.586256 0.47346 1 4 3443 3435 3429 3441 0.878199 0.586256 0.47346 1 4 3435 3443 3442 3434 0.878199 0.586256 0.47346 1 4 3442 3440 3428 3434 0.878199 0.586256 0.47346 1 4 3465 3466 3452 3455 0.7 0.7 0.7 1 4 3452 3453 3454 3455 0.878199 0.586256 0.47346 1 4 3454 3456 3457 3455 0.878199 0.586256 0.47346 1 4 3462 3464 3465 3463 0.878199 0.586256 0.47346 1 4 3466 3465 3464 3467 0.878199 0.586256 0.47346 1 4 3457 3456 3468 3469 0.878199 0.586256 0.47346 1 4 3468 3470 3471 3469 0.878199 0.586256 0.47346 1 4 3471 3463 3457 3469 0.878199 0.586256 0.47346 1 4 3463 3471 3470 3462 0.878199 0.586256 0.47346 1 4 3470 3468 3456 3462 0.878199 0.586256 0.47346 1 4 3493 3494 3480 3483 0.7 0.7 0.7 1 4 3480 3481 3482 3483 0.407109 0.718958 0.48673 1 4 3482 3484 3485 3483 0.407109 0.718958 0.48673 1 4 3490 3492 3493 3491 0.407109 0.718958 0.48673 1 4 3494 3493 3492 3495 0.407109 0.718958 0.48673 1 4 3485 3484 3496 3497 0.407109 0.718958 0.48673 1 4 3496 3498 3499 3497 0.407109 0.718958 0.48673 1 4 3499 3491 3485 3497 0.407109 0.718958 0.48673 1 4 3491 3499 3498 3490 0.407109 0.718958 0.48673 1 4 3498 3496 3484 3490 0.407109 0.718958 0.48673 1 4 3521 3522 3508 3511 0.7 0.7 0.7 1 4 3508 3509 3510 3511 0.878199 0.586256 0.47346 1 4 3510 3512 3513 3511 0.878199 0.586256 0.47346 1 4 3518 3520 3521 3519 0.878199 0.586256 0.47346 1 4 3522 3521 3520 3523 0.878199 0.586256 0.47346 1 4 3513 3512 3524 3525 0.878199 0.586256 0.47346 1 4 3524 3526 3527 3525 0.878199 0.586256 0.47346 1 4 3527 3519 3513 3525 0.878199 0.586256 0.47346 1 4 3519 3527 3526 3518 0.878199 0.586256 0.47346 1 4 3526 3524 3512 3518 0.878199 0.586256 0.47346 1 4 3549 3550 3536 3539 0.7 0.7 0.7 1 4 3536 3537 3538 3539 0.825119 0.838389 0.705687 1 4 3538 3540 3541 3539 0.825119 0.838389 0.705687 1 4 3546 3548 3549 3547 0.825119 0.838389 0.705687 1 4 3550 3549 3548 3551 0.825119 0.838389 0.705687 1 4 3541 3540 3552 3553 0.825119 0.838389 0.705687 1 4 3552 3554 3555 3553 0.825119 0.838389 0.705687 1 4 3555 3547 3541 3553 0.825119 0.838389 0.705687 1 4 3547 3555 3554 3546 0.825119 0.838389 0.705687 1 4 3554 3552 3540 3546 0.825119 0.838389 0.705687 1 4 3577 3578 3564 3567 0.7 0.7 0.7 1 4 3564 3565 3566 3567 0.360664 0.453555 0.659242 1 4 3566 3568 3569 3567 0.360664 0.453555 0.659242 1 4 3574 3576 3577 3575 0.360664 0.453555 0.659242 1 4 3578 3577 3576 3579 0.360664 0.453555 0.659242 1 4 3569 3568 3580 3581 0.360664 0.453555 0.659242 1 4 3580 3582 3583 3581 0.360664 0.453555 0.659242 1 4 3583 3575 3569 3581 0.360664 0.453555 0.659242 1 4 3575 3583 3582 3574 0.360664 0.453555 0.659242 1 4 3582 3580 3568 3574 0.360664 0.453555 0.659242 1 4 3605 3606 3592 3595 0.7 0.7 0.7 1 4 3592 3593 3594 3595 0.825119 0.838389 0.705687 1 4 3594 3596 3597 3595 0.825119 0.838389 0.705687 1 4 3602 3604 3605 3603 0.825119 0.838389 0.705687 1 4 3606 3605 3604 3607 0.825119 0.838389 0.705687 1 4 3597 3596 3608 3609 0.825119 0.838389 0.705687 1 4 3608 3610 3611 3609 0.825119 0.838389 0.705687 1 4 3611 3603 3597 3609 0.825119 0.838389 0.705687 1 4 3603 3611 3610 3602 0.825119 0.838389 0.705687 1 4 3610 3608 3596 3602 0.825119 0.838389 0.705687 1 4 3633 3634 3620 3623 0.7 0.7 0.7 1 4 3620 3621 3622 3623 0.407109 0.718958 0.48673 1 4 3622 3624 3625 3623 0.407109 0.718958 0.48673 1 4 3630 3632 3633 3631 0.407109 0.718958 0.48673 1 4 3634 3633 3632 3635 0.407109 0.718958 0.48673 1 4 3625 3624 3636 3637 0.407109 0.718958 0.48673 1 4 3636 3638 3639 3637 0.407109 0.718958 0.48673 1 4 3639 3631 3625 3637 0.407109 0.718958 0.48673 1 4 3631 3639 3638 3630 0.407109 0.718958 0.48673 1 4 3638 3636 3624 3630 0.407109 0.718958 0.48673 1 4 3661 3662 3648 3651 0.7 0.7 0.7 1 4 3648 3649 3650 3651 0.672512 0.652607 0.44692 1 4 3650 3652 3653 3651 0.672512 0.652607 0.44692 1 4 3658 3660 3661 3659 0.672512 0.652607 0.44692 1 4 3662 3661 3660 3663 0.672512 0.652607 0.44692 1 4 3653 3652 3664 3665 0.672512 0.652607 0.44692 1 4 3664 3666 3667 3665 0.672512 0.652607 0.44692 1 4 3667 3659 3653 3665 0.672512 0.652607 0.44692 1 4 3659 3667 3666 3658 0.672512 0.652607 0.44692 1 4 3666 3664 3652 3658 0.672512 0.652607 0.44692 1 4 3689 3690 3676 3679 0.7 0.7 0.7 1 4 3676 3677 3678 3679 0.360664 0.453555 0.659242 1 4 3678 3680 3681 3679 0.360664 0.453555 0.659242 1 4 3686 3688 3689 3687 0.360664 0.453555 0.659242 1 4 3690 3689 3688 3691 0.360664 0.453555 0.659242 1 4 3681 3680 3692 3693 0.360664 0.453555 0.659242 1 4 3692 3694 3695 3693 0.360664 0.453555 0.659242 1 4 3695 3687 3681 3693 0.360664 0.453555 0.659242 1 4 3687 3695 3694 3686 0.360664 0.453555 0.659242 1 4 3694 3692 3680 3686 0.360664 0.453555 0.659242 1 4 3709 3707 3704 3705 0.4 0.3 0.2 1 4 3710 3706 3704 3707 0.4 0.3 0.2 1 4 3711 3708 3706 3710 0.4 0.3 0.2 1 4 3725 3726 3712 3715 0.7 0.7 0.7 1 4 3712 3713 3714 3715 0.44692 0.261137 0.48673 1 4 3714 3716 3717 3715 0.44692 0.261137 0.48673 1 4 3722 3724 3725 3723 0.44692 0.261137 0.48673 1 4 3726 3725 3724 3727 0.44692 0.261137 0.48673 1 4 3717 3716 3728 3729 0.44692 0.261137 0.48673 1 4 3728 3730 3731 3729 0.44692 0.261137 0.48673 1 4 3731 3723 3717 3729 0.44692 0.261137 0.48673 1 4 3723 3731 3730 3722 0.44692 0.261137 0.48673 1 4 3730 3728 3716 3722 0.44692 0.261137 0.48673 1 4 3753 3754 3740 3743 0.7 0.7 0.7 1 4 3740 3741 3742 3743 0.672512 0.652607 0.44692 1 4 3742 3744 3745 3743 0.672512 0.652607 0.44692 1 4 3750 3752 3753 3751 0.672512 0.652607 0.44692 1 4 3754 3753 3752 3755 0.672512 0.652607 0.44692 1 4 3745 3744 3756 3757 0.672512 0.652607 0.44692 1 4 3756 3758 3759 3757 0.672512 0.652607 0.44692 1 4 3759 3751 3745 3757 0.672512 0.652607 0.44692 1 4 3751 3759 3758 3750 0.672512 0.652607 0.44692 1 4 3758 3756 3744 3750 0.672512 0.652607 0.44692 1 4 3781 3782 3768 3771 0.7 0.7 0.7 1 4 3768 3769 3770 3771 0.878199 0.586256 0.47346 1 4 3770 3772 3773 3771 0.878199 0.586256 0.47346 1 4 3778 3780 3781 3779 0.878199 0.586256 0.47346 1 4 3782 3781 3780 3783 0.878199 0.586256 0.47346 1 4 3773 3772 3784 3785 0.878199 0.586256 0.47346 1 4 3784 3786 3787 3785 0.878199 0.586256 0.47346 1 4 3787 3779 3773 3785 0.878199 0.586256 0.47346 1 4 3779 3787 3786 3778 0.878199 0.586256 0.47346 1 4 3786 3784 3772 3778 0.878199 0.586256 0.47346 1 4 3809 3810 3796 3799 0.7 0.7 0.7 1 4 3796 3797 3798 3799 0.407109 0.718958 0.48673 1 4 3798 3800 3801 3799 0.407109 0.718958 0.48673 1 4 3806 3808 3809 3807 0.407109 0.718958 0.48673 1 4 3810 3809 3808 3811 0.407109 0.718958 0.48673 1 4 3801 3800 3812 3813 0.407109 0.718958 0.48673 1 4 3812 3814 3815 3813 0.407109 0.718958 0.48673 1 4 3815 3807 3801 3813 0.407109 0.718958 0.48673 1 4 3807 3815 3814 3806 0.407109 0.718958 0.48673 1 4 3814 3812 3800 3806 0.407109 0.718958 0.48673 1 4 3837 3838 3824 3827 0.7 0.7 0.7 1 4 3824 3825 3826 3827 0.407109 0.718958 0.48673 1 4 3826 3828 3829 3827 0.407109 0.718958 0.48673 1 4 3834 3836 3837 3835 0.407109 0.718958 0.48673 1 4 3838 3837 3836 3839 0.407109 0.718958 0.48673 1 4 3829 3828 3840 3841 0.407109 0.718958 0.48673 1 4 3840 3842 3843 3841 0.407109 0.718958 0.48673 1 4 3843 3835 3829 3841 0.407109 0.718958 0.48673 1 4 3835 3843 3842 3834 0.407109 0.718958 0.48673 1 4 3842 3840 3828 3834 0.407109 0.718958 0.48673 1 4 3865 3866 3852 3855 0.7 0.7 0.7 1 4 3852 3853 3854 3855 0.44692 0.261137 0.48673 1 4 3854 3856 3857 3855 0.44692 0.261137 0.48673 1 4 3862 3864 3865 3863 0.44692 0.261137 0.48673 1 4 3866 3865 3864 3867 0.44692 0.261137 0.48673 1 4 3857 3856 3868 3869 0.44692 0.261137 0.48673 1 4 3868 3870 3871 3869 0.44692 0.261137 0.48673 1 4 3871 3863 3857 3869 0.44692 0.261137 0.48673 1 4 3863 3871 3870 3862 0.44692 0.261137 0.48673 1 4 3870 3868 3856 3862 0.44692 0.261137 0.48673 1 4 3893 3894 3880 3883 0.7 0.7 0.7 1 4 3880 3881 3882 3883 0.407109 0.718958 0.48673 1 4 3882 3884 3885 3883 0.407109 0.718958 0.48673 1 4 3890 3892 3893 3891 0.407109 0.718958 0.48673 1 4 3894 3893 3892 3895 0.407109 0.718958 0.48673 1 4 3885 3884 3896 3897 0.407109 0.718958 0.48673 1 4 3896 3898 3899 3897 0.407109 0.718958 0.48673 1 4 3899 3891 3885 3897 0.407109 0.718958 0.48673 1 4 3891 3899 3898 3890 0.407109 0.718958 0.48673 1 4 3898 3896 3884 3890 0.407109 0.718958 0.48673 1 4 3921 3922 3908 3911 0.7 0.7 0.7 1 4 3908 3909 3910 3911 0.672512 0.652607 0.44692 1 4 3910 3912 3913 3911 0.672512 0.652607 0.44692 1 4 3918 3920 3921 3919 0.672512 0.652607 0.44692 1 4 3922 3921 3920 3923 0.672512 0.652607 0.44692 1 4 3913 3912 3924 3925 0.672512 0.652607 0.44692 1 4 3924 3926 3927 3925 0.672512 0.652607 0.44692 1 4 3927 3919 3913 3925 0.672512 0.652607 0.44692 1 4 3919 3927 3926 3918 0.672512 0.652607 0.44692 1 4 3926 3924 3912 3918 0.672512 0.652607 0.44692 1 4 3949 3950 3936 3939 0.7 0.7 0.7 1 4 3936 3937 3938 3939 0.407109 0.718958 0.48673 1 4 3938 3940 3941 3939 0.407109 0.718958 0.48673 1 4 3946 3948 3949 3947 0.407109 0.718958 0.48673 1 4 3950 3949 3948 3951 0.407109 0.718958 0.48673 1 4 3941 3940 3952 3953 0.407109 0.718958 0.48673 1 4 3952 3954 3955 3953 0.407109 0.718958 0.48673 1 4 3955 3947 3941 3953 0.407109 0.718958 0.48673 1 4 3947 3955 3954 3946 0.407109 0.718958 0.48673 1 4 3954 3952 3940 3946 0.407109 0.718958 0.48673 1 4 3977 3978 3964 3967 0.7 0.7 0.7 1 4 3964 3965 3966 3967 0.360664 0.453555 0.659242 1 4 3966 3968 3969 3967 0.360664 0.453555 0.659242 1 4 3974 3976 3977 3975 0.360664 0.453555 0.659242 1 4 3978 3977 3976 3979 0.360664 0.453555 0.659242 1 4 3969 3968 3980 3981 0.360664 0.453555 0.659242 1 4 3980 3982 3983 3981 0.360664 0.453555 0.659242 1 4 3983 3975 3969 3981 0.360664 0.453555 0.659242 1 4 3975 3983 3982 3974 0.360664 0.453555 0.659242 1 4 3982 3980 3968 3974 0.360664 0.453555 0.659242 1 4 4005 4006 3992 3995 0.7 0.7 0.7 1 4 3992 3993 3994 3995 0.360664 0.453555 0.659242 1 4 3994 3996 3997 3995 0.360664 0.453555 0.659242 1 4 4002 4004 4005 4003 0.360664 0.453555 0.659242 1 4 4006 4005 4004 4007 0.360664 0.453555 0.659242 1 4 3997 3996 4008 4009 0.360664 0.453555 0.659242 1 4 4008 4010 4011 4009 0.360664 0.453555 0.659242 1 4 4011 4003 3997 4009 0.360664 0.453555 0.659242 1 4 4003 4011 4010 4002 0.360664 0.453555 0.659242 1 4 4010 4008 3996 4002 0.360664 0.453555 0.659242 1 4 4033 4034 4020 4023 0.7 0.7 0.7 1 4 4020 4021 4022 4023 0.878199 0.586256 0.47346 1 4 4022 4024 4025 4023 0.878199 0.586256 0.47346 1 4 4030 4032 4033 4031 0.878199 0.586256 0.47346 1 4 4034 4033 4032 4035 0.878199 0.586256 0.47346 1 4 4025 4024 4036 4037 0.878199 0.586256 0.47346 1 4 4036 4038 4039 4037 0.878199 0.586256 0.47346 1 4 4039 4031 4025 4037 0.878199 0.586256 0.47346 1 4 4031 4039 4038 4030 0.878199 0.586256 0.47346 1 4 4038 4036 4024 4030 0.878199 0.586256 0.47346 1 4 4053 4051 4048 4049 0.4 0.3 0.2 1 4 4054 4050 4048 4051 0.4 0.3 0.2 1 4 4055 4052 4050 4054 0.4 0.3 0.2 1 4 4069 4070 4056 4059 0.7 0.7 0.7 1 4 4056 4057 4058 4059 0.407109 0.718958 0.48673 1 4 4058 4060 4061 4059 0.407109 0.718958 0.48673 1 4 4066 4068 4069 4067 0.407109 0.718958 0.48673 1 4 4070 4069 4068 4071 0.407109 0.718958 0.48673 1 4 4061 4060 4072 4073 0.407109 0.718958 0.48673 1 4 4072 4074 4075 4073 0.407109 0.718958 0.48673 1 4 4075 4067 4061 4073 0.407109 0.718958 0.48673 1 4 4067 4075 4074 4066 0.407109 0.718958 0.48673 1 4 4074 4072 4060 4066 0.407109 0.718958 0.48673 1 4 4097 4098 4084 4087 0.7 0.7 0.7 1 4 4084 4085 4086 4087 0.360664 0.453555 0.659242 1 4 4086 4088 4089 4087 0.360664 0.453555 0.659242 1 4 4094 4096 4097 4095 0.360664 0.453555 0.659242 1 4 4098 4097 4096 4099 0.360664 0.453555 0.659242 1 4 4089 4088 4100 4101 0.360664 0.453555 0.659242 1 4 4100 4102 4103 4101 0.360664 0.453555 0.659242 1 4 4103 4095 4089 4101 0.360664 0.453555 0.659242 1 4 4095 4103 4102 4094 0.360664 0.453555 0.659242 1 4 4102 4100 4088 4094 0.360664 0.453555 0.659242 1 4 4125 4126 4112 4115 0.7 0.7 0.7 1 4 4112 4113 4114 4115 0.44692 0.261137 0.48673 1 4 4114 4116 4117 4115 0.44692 0.261137 0.48673 1 4 4122 4124 4125 4123 0.44692 0.261137 0.48673 1 4 4126 4125 4124 4127 0.44692 0.261137 0.48673 1 4 4117 4116 4128 4129 0.44692 0.261137 0.48673 1 4 4128 4130 4131 4129 0.44692 0.261137 0.48673 1 4 4131 4123 4117 4129 0.44692 0.261137 0.48673 1 4 4123 4131 4130 4122 0.44692 0.261137 0.48673 1 4 4130 4128 4116 4122 0.44692 0.261137 0.48673 1 4 4153 4154 4140 4143 0.7 0.7 0.7 1 4 4140 4141 4142 4143 0.44692 0.261137 0.48673 1 4 4142 4144 4145 4143 0.44692 0.261137 0.48673 1 4 4150 4152 4153 4151 0.44692 0.261137 0.48673 1 4 4154 4153 4152 4155 0.44692 0.261137 0.48673 1 4 4145 4144 4156 4157 0.44692 0.261137 0.48673 1 4 4156 4158 4159 4157 0.44692 0.261137 0.48673 1 4 4159 4151 4145 4157 0.44692 0.261137 0.48673 1 4 4151 4159 4158 4150 0.44692 0.261137 0.48673 1 4 4158 4156 4144 4150 0.44692 0.261137 0.48673 1 4 4181 4182 4168 4171 0.7 0.7 0.7 1 4 4168 4169 4170 4171 0.44692 0.261137 0.48673 1 4 4170 4172 4173 4171 0.44692 0.261137 0.48673 1 4 4178 4180 4181 4179 0.44692 0.261137 0.48673 1 4 4182 4181 4180 4183 0.44692 0.261137 0.48673 1 4 4173 4172 4184 4185 0.44692 0.261137 0.48673 1 4 4184 4186 4187 4185 0.44692 0.261137 0.48673 1 4 4187 4179 4173 4185 0.44692 0.261137 0.48673 1 4 4179 4187 4186 4178 0.44692 0.261137 0.48673 1 4 4186 4184 4172 4178 0.44692 0.261137 0.48673 1 4 4209 4210 4196 4199 0.7 0.7 0.7 1 4 4196 4197 4198 4199 0.825119 0.838389 0.705687 1 4 4198 4200 4201 4199 0.825119 0.838389 0.705687 1 4 4206 4208 4209 4207 0.825119 0.838389 0.705687 1 4 4210 4209 4208 4211 0.825119 0.838389 0.705687 1 4 4201 4200 4212 4213 0.825119 0.838389 0.705687 1 4 4212 4214 4215 4213 0.825119 0.838389 0.705687 1 4 4215 4207 4201 4213 0.825119 0.838389 0.705687 1 4 4207 4215 4214 4206 0.825119 0.838389 0.705687 1 4 4214 4212 4200 4206 0.825119 0.838389 0.705687 1 4 4237 4238 4224 4227 0.7 0.7 0.7 1 4 4224 4225 4226 4227 0.407109 0.718958 0.48673 1 4 4226 4228 4229 4227 0.407109 0.718958 0.48673 1 4 4234 4236 4237 4235 0.407109 0.718958 0.48673 1 4 4238 4237 4236 4239 0.407109 0.718958 0.48673 1 4 4229 4228 4240 4241 0.407109 0.718958 0.48673 1 4 4240 4242 4243 4241 0.407109 0.718958 0.48673 1 4 4243 4235 4229 4241 0.407109 0.718958 0.48673 1 4 4235 4243 4242 4234 0.407109 0.718958 0.48673 1 4 4242 4240 4228 4234 0.407109 0.718958 0.48673 1 4 4265 4266 4252 4255 0.7 0.7 0.7 1 4 4252 4253 4254 4255 0.407109 0.718958 0.48673 1 4 4254 4256 4257 4255 0.407109 0.718958 0.48673 1 4 4262 4264 4265 4263 0.407109 0.718958 0.48673 1 4 4266 4265 4264 4267 0.407109 0.718958 0.48673 1 4 4257 4256 4268 4269 0.407109 0.718958 0.48673 1 4 4268 4270 4271 4269 0.407109 0.718958 0.48673 1 4 4271 4263 4257 4269 0.407109 0.718958 0.48673 1 4 4263 4271 4270 4262 0.407109 0.718958 0.48673 1 4 4270 4268 4256 4262 0.407109 0.718958 0.48673 1 4 4293 4294 4280 4283 0.7 0.7 0.7 1 4 4280 4281 4282 4283 0.44692 0.261137 0.48673 1 4 4282 4284 4285 4283 0.44692 0.261137 0.48673 1 4 4290 4292 4293 4291 0.44692 0.261137 0.48673 1 4 4294 4293 4292 4295 0.44692 0.261137 0.48673 1 4 4285 4284 4296 4297 0.44692 0.261137 0.48673 1 4 4296 4298 4299 4297 0.44692 0.261137 0.48673 1 4 4299 4291 4285 4297 0.44692 0.261137 0.48673 1 4 4291 4299 4298 4290 0.44692 0.261137 0.48673 1 4 4298 4296 4284 4290 0.44692 0.261137 0.48673 1 4 4321 4322 4308 4311 0.7 0.7 0.7 1 4 4308 4309 4310 4311 0.44692 0.261137 0.48673 1 4 4310 4312 4313 4311 0.44692 0.261137 0.48673 1 4 4318 4320 4321 4319 0.44692 0.261137 0.48673 1 4 4322 4321 4320 4323 0.44692 0.261137 0.48673 1 4 4313 4312 4324 4325 0.44692 0.261137 0.48673 1 4 4324 4326 4327 4325 0.44692 0.261137 0.48673 1 4 4327 4319 4313 4325 0.44692 0.261137 0.48673 1 4 4319 4327 4326 4318 0.44692 0.261137 0.48673 1 4 4326 4324 4312 4318 0.44692 0.261137 0.48673 1 4 4349 4350 4336 4339 0.7 0.7 0.7 1 4 4336 4337 4338 4339 0.825119 0.838389 0.705687 1 4 4338 4340 4341 4339 0.825119 0.838389 0.705687 1 4 4346 4348 4349 4347 0.825119 0.838389 0.705687 1 4 4350 4349 4348 4351 0.825119 0.838389 0.705687 1 4 4341 4340 4352 4353 0.825119 0.838389 0.705687 1 4 4352 4354 4355 4353 0.825119 0.838389 0.705687 1 4 4355 4347 4341 4353 0.825119 0.838389 0.705687 1 4 4347 4355 4354 4346 0.825119 0.838389 0.705687 1 4 4354 4352 4340 4346 0.825119 0.838389 0.705687 1 4 4369 4367 4364 4365 0.4 0.3 0.2 1 4 4370 4366 4364 4367 0.4 0.3 0.2 1 4 4371 4368 4366 4370 0.4 0.3 0.2 1 4 4385 4386 4372 4375 0.7 0.7 0.7 1 4 4372 4373 4374 4375 0.407109 0.718958 0.48673 1 4 4374 4376 4377 4375 0.407109 0.718958 0.48673 1 4 4382 4384 4385 4383 0.407109 0.718958 0.48673 1 4 4386 4385 4384 4387 0.407109 0.718958 0.48673 1 4 4377 4376 4388 4389 0.407109 0.718958 0.48673 1 4 4388 4390 4391 4389 0.407109 0.718958 0.48673 1 4 4391 4383 4377 4389 0.407109 0.718958 0.48673 1 4 4383 4391 4390 4382 0.407109 0.718958 0.48673 1 4 4390 4388 4376 4382 0.407109 0.718958 0.48673 1 4 4413 4414 4400 4403 0.7 0.7 0.7 1 4 4400 4401 4402 4403 0.878199 0.586256 0.47346 1 4 4402 4404 4405 4403 0.878199 0.586256 0.47346 1 4 4410 4412 4413 4411 0.878199 0.586256 0.47346 1 4 4414 4413 4412 4415 0.878199 0.586256 0.47346 1 4 4405 4404 4416 4417 0.878199 0.586256 0.47346 1 4 4416 4418 4419 4417 0.878199 0.586256 0.47346 1 4 4419 4411 4405 4417 0.878199 0.586256 0.47346 1 4 4411 4419 4418 4410 0.878199 0.586256 0.47346 1 4 4418 4416 4404 4410 0.878199 0.586256 0.47346 1 4 4441 4442 4428 4431 0.7 0.7 0.7 1 4 4428 4429 4430 4431 0.672512 0.652607 0.44692 1 4 4430 4432 4433 4431 0.672512 0.652607 0.44692 1 4 4438 4440 4441 4439 0.672512 0.652607 0.44692 1 4 4442 4441 4440 4443 0.672512 0.652607 0.44692 1 4 4433 4432 4444 4445 0.672512 0.652607 0.44692 1 4 4444 4446 4447 4445 0.672512 0.652607 0.44692 1 4 4447 4439 4433 4445 0.672512 0.652607 0.44692 1 4 4439 4447 4446 4438 0.672512 0.652607 0.44692 1 4 4446 4444 4432 4438 0.672512 0.652607 0.44692 1 4 4469 4470 4456 4459 0.7 0.7 0.7 1 4 4456 4457 4458 4459 0.360664 0.453555 0.659242 1 4 4458 4460 4461 4459 0.360664 0.453555 0.659242 1 4 4466 4468 4469 4467 0.360664 0.453555 0.659242 1 4 4470 4469 4468 4471 0.360664 0.453555 0.659242 1 4 4461 4460 4472 4473 0.360664 0.453555 0.659242 1 4 4472 4474 4475 4473 0.360664 0.453555 0.659242 1 4 4475 4467 4461 4473 0.360664 0.453555 0.659242 1 4 4467 4475 4474 4466 0.360664 0.453555 0.659242 1 4 4474 4472 4460 4466 0.360664 0.453555 0.659242 1 4 4497 4498 4484 4487 0.7 0.7 0.7 1 4 4484 4485 4486 4487 0.360664 0.453555 0.659242 1 4 4486 4488 4489 4487 0.360664 0.453555 0.659242 1 4 4494 4496 4497 4495 0.360664 0.453555 0.659242 1 4 4498 4497 4496 4499 0.360664 0.453555 0.659242 1 4 4489 4488 4500 4501 0.360664 0.453555 0.659242 1 4 4500 4502 4503 4501 0.360664 0.453555 0.659242 1 4 4503 4495 4489 4501 0.360664 0.453555 0.659242 1 4 4495 4503 4502 4494 0.360664 0.453555 0.659242 1 4 4502 4500 4488 4494 0.360664 0.453555 0.659242 1 4 4525 4526 4512 4515 0.7 0.7 0.7 1 4 4512 4513 4514 4515 0.878199 0.586256 0.47346 1 4 4514 4516 4517 4515 0.878199 0.586256 0.47346 1 4 4522 4524 4525 4523 0.878199 0.586256 0.47346 1 4 4526 4525 4524 4527 0.878199 0.586256 0.47346 1 4 4517 4516 4528 4529 0.878199 0.586256 0.47346 1 4 4528 4530 4531 4529 0.878199 0.586256 0.47346 1 4 4531 4523 4517 4529 0.878199 0.586256 0.47346 1 4 4523 4531 4530 4522 0.878199 0.586256 0.47346 1 4 4530 4528 4516 4522 0.878199 0.586256 0.47346 1 4 4553 4554 4540 4543 0.7 0.7 0.7 1 4 4540 4541 4542 4543 0.825119 0.838389 0.705687 1 4 4542 4544 4545 4543 0.825119 0.838389 0.705687 1 4 4550 4552 4553 4551 0.825119 0.838389 0.705687 1 4 4554 4553 4552 4555 0.825119 0.838389 0.705687 1 4 4545 4544 4556 4557 0.825119 0.838389 0.705687 1 4 4556 4558 4559 4557 0.825119 0.838389 0.705687 1 4 4559 4551 4545 4557 0.825119 0.838389 0.705687 1 4 4551 4559 4558 4550 0.825119 0.838389 0.705687 1 4 4558 4556 4544 4550 0.825119 0.838389 0.705687 1 4 4581 4582 4568 4571 0.7 0.7 0.7 1 4 4568 4569 4570 4571 0.44692 0.261137 0.48673 1 4 4570 4572 4573 4571 0.44692 0.261137 0.48673 1 4 4578 4580 4581 4579 0.44692 0.261137 0.48673 1 4 4582 4581 4580 4583 0.44692 0.261137 0.48673 1 4 4573 4572 4584 4585 0.44692 0.261137 0.48673 1 4 4584 4586 4587 4585 0.44692 0.261137 0.48673 1 4 4587 4579 4573 4585 0.44692 0.261137 0.48673 1 4 4579 4587 4586 4578 0.44692 0.261137 0.48673 1 4 4586 4584 4572 4578 0.44692 0.261137 0.48673 1 4 4609 4610 4596 4599 0.7 0.7 0.7 1 4 4596 4597 4598 4599 0.878199 0.586256 0.47346 1 4 4598 4600 4601 4599 0.878199 0.586256 0.47346 1 4 4606 4608 4609 4607 0.878199 0.586256 0.47346 1 4 4610 4609 4608 4611 0.878199 0.586256 0.47346 1 4 4601 4600 4612 4613 0.878199 0.586256 0.47346 1 4 4612 4614 4615 4613 0.878199 0.586256 0.47346 1 4 4615 4607 4601 4613 0.878199 0.586256 0.47346 1 4 4607 4615 4614 4606 0.878199 0.586256 0.47346 1 4 4614 4612 4600 4606 0.878199 0.586256 0.47346 1 4 4637 4638 4624 4627 0.7 0.7 0.7 1 4 4624 4625 4626 4627 0.672512 0.652607 0.44692 1 4 4626 4628 4629 4627 0.672512 0.652607 0.44692 1 4 4634 4636 4637 4635 0.672512 0.652607 0.44692 1 4 4638 4637 4636 4639 0.672512 0.652607 0.44692 1 4 4629 4628 4640 4641 0.672512 0.652607 0.44692 1 4 4640 4642 4643 4641 0.672512 0.652607 0.44692 1 4 4643 4635 4629 4641 0.672512 0.652607 0.44692 1 4 4635 4643 4642 4634 0.672512 0.652607 0.44692 1 4 4642 4640 4628 4634 0.672512 0.652607 0.44692 1 4 4657 4655 4652 4653 0.4 0.3 0.2 1 4 4658 4654 4652 4655 0.4 0.3 0.2 1 4 4659 4656 4654 4658 0.4 0.3 0.2 1 4 4664 4661 4660 4662 0.4 0.3 0.2 1 4 4665 4663 4660 4661 0.4 0.3 0.2 1 4 4666 4662 4660 4663 0.4 0.3 0.2 1 4 4667 4666 4663 4665 0.4 0.3 0.2 1 4 4667 4664 4662 4666 0.4 0.3 0.2 1 4 4667 4665 4661 4664 0.4 0.3 0.2 1 4 4672 4669 4668 4670 0.4 0.3 0.2 1 4 4673 4671 4668 4669 0.4 0.3 0.2 1 4 4674 4670 4668 4671 0.4 0.3 0.2 1 4 4675 4674 4671 4673 0.4 0.3 0.2 1 4 4675 4672 4670 4674 0.4 0.3 0.2 1 4 4675 4673 4669 4672 0.4 0.3 0.2 1 4 4681 4679 4676 4677 0.4 0.3 0.2 1 4 4682 4678 4676 4679 0.4 0.3 0.2 1 4 4683 4680 4678 4682 0.4 0.3 0.2 1 4 4697 4698 4684 4687 0.7 0.7 0.7 1 4 4684 4685 4686 4687 0.241232 0.287678 0.400474 1 4 4686 4688 4689 4687 0.241232 0.287678 0.400474 1 4 4694 4696 4697 4695 0.241232 0.287678 0.400474 1 4 4698 4697 4696 4699 0.241232 0.287678 0.400474 1 4 4689 4688 4700 4701 0.241232 0.287678 0.400474 1 4 4700 4702 4703 4701 0.241232 0.287678 0.400474 1 4 4703 4695 4689 4701 0.241232 0.287678 0.400474 1 4 4695 4703 4702 4694 0.241232 0.287678 0.400474 1 4 4702 4700 4688 4694 0.241232 0.287678 0.400474 1 4 4725 4726 4712 4715 0.7 0.7 0.7 1 4 4712 4713 4714 4715 0.752133 0.592891 0.639337 1 4 4714 4716 4717 4715 0.752133 0.592891 0.639337 1 4 4722 4724 4725 4723 0.752133 0.592891 0.639337 1 4 4726 4725 4724 4727 0.752133 0.592891 0.639337 1 4 4717 4716 4728 4729 0.752133 0.592891 0.639337 1 4 4728 4730 4731 4729 0.752133 0.592891 0.639337 1 4 4731 4723 4717 4729 0.752133 0.592891 0.639337 1 4 4723 4731 4730 4722 0.752133 0.592891 0.639337 1 4 4730 4728 4716 4722 0.752133 0.592891 0.639337 1 4 4753 4754 4740 4743 0.7 0.7 0.7 1 4 4740 4741 4742 4743 0.44692 0.261137 0.48673 1 4 4742 4744 4745 4743 0.44692 0.261137 0.48673 1 4 4750 4752 4753 4751 0.44692 0.261137 0.48673 1 4 4754 4753 4752 4755 0.44692 0.261137 0.48673 1 4 4745 4744 4756 4757 0.44692 0.261137 0.48673 1 4 4756 4758 4759 4757 0.44692 0.261137 0.48673 1 4 4759 4751 4745 4757 0.44692 0.261137 0.48673 1 4 4751 4759 4758 4750 0.44692 0.261137 0.48673 1 4 4758 4756 4744 4750 0.44692 0.261137 0.48673 1 4 4781 4782 4768 4771 0.7 0.7 0.7 1 4 4768 4769 4770 4771 0.154976 0.400474 0.347394 1 4 4770 4772 4773 4771 0.154976 0.400474 0.347394 1 4 4778 4780 4781 4779 0.154976 0.400474 0.347394 1 4 4782 4781 4780 4783 0.154976 0.400474 0.347394 1 4 4773 4772 4784 4785 0.154976 0.400474 0.347394 1 4 4784 4786 4787 4785 0.154976 0.400474 0.347394 1 4 4787 4779 4773 4785 0.154976 0.400474 0.347394 1 4 4779 4787 4786 4778 0.154976 0.400474 0.347394 1 4 4786 4784 4772 4778 0.154976 0.400474 0.347394 1 4 4809 4810 4796 4799 0.7 0.7 0.7 1 4 4796 4797 4798 4799 0.154976 0.400474 0.347394 1 4 4798 4800 4801 4799 0.154976 0.400474 0.347394 1 4 4806 4808 4809 4807 0.154976 0.400474 0.347394 1 4 4810 4809 4808 4811 0.154976 0.400474 0.347394 1 4 4801 4800 4812 4813 0.154976 0.400474 0.347394 1 4 4812 4814 4815 4813 0.154976 0.400474 0.347394 1 4 4815 4807 4801 4813 0.154976 0.400474 0.347394 1 4 4807 4815 4814 4806 0.154976 0.400474 0.347394 1 4 4814 4812 4800 4806 0.154976 0.400474 0.347394 1 4 4837 4838 4824 4827 0.7 0.7 0.7 1 4 4824 4825 4826 4827 0.241232 0.287678 0.400474 1 4 4826 4828 4829 4827 0.241232 0.287678 0.400474 1 4 4834 4836 4837 4835 0.241232 0.287678 0.400474 1 4 4838 4837 4836 4839 0.241232 0.287678 0.400474 1 4 4829 4828 4840 4841 0.241232 0.287678 0.400474 1 4 4840 4842 4843 4841 0.241232 0.287678 0.400474 1 4 4843 4835 4829 4841 0.241232 0.287678 0.400474 1 4 4835 4843 4842 4834 0.241232 0.287678 0.400474 1 4 4842 4840 4828 4834 0.241232 0.287678 0.400474 1 4 4857 4855 4852 4853 0.4 0.3 0.2 1 4 4858 4854 4852 4855 0.4 0.3 0.2 1 4 4859 4856 4854 4858 0.4 0.3 0.2 1 4 4873 4874 4860 4863 0.7 0.7 0.7 1 4 4860 4861 4862 4863 0.752133 0.592891 0.639337 1 4 4862 4864 4865 4863 0.752133 0.592891 0.639337 1 4 4870 4872 4873 4871 0.752133 0.592891 0.639337 1 4 4874 4873 4872 4875 0.752133 0.592891 0.639337 1 4 4865 4864 4876 4877 0.752133 0.592891 0.639337 1 4 4876 4878 4879 4877 0.752133 0.592891 0.639337 1 4 4879 4871 4865 4877 0.752133 0.592891 0.639337 1 4 4871 4879 4878 4870 0.752133 0.592891 0.639337 1 4 4878 4876 4864 4870 0.752133 0.592891 0.639337 1 4 4901 4902 4888 4891 0.7 0.7 0.7 1 4 4888 4889 4890 4891 0.44692 0.261137 0.48673 1 4 4890 4892 4893 4891 0.44692 0.261137 0.48673 1 4 4898 4900 4901 4899 0.44692 0.261137 0.48673 1 4 4902 4901 4900 4903 0.44692 0.261137 0.48673 1 4 4893 4892 4904 4905 0.44692 0.261137 0.48673 1 4 4904 4906 4907 4905 0.44692 0.261137 0.48673 1 4 4907 4899 4893 4905 0.44692 0.261137 0.48673 1 4 4899 4907 4906 4898 0.44692 0.261137 0.48673 1 4 4906 4904 4892 4898 0.44692 0.261137 0.48673 1 4 4929 4930 4916 4919 0.7 0.7 0.7 1 4 4916 4917 4918 4919 0.752133 0.592891 0.639337 1 4 4918 4920 4921 4919 0.752133 0.592891 0.639337 1 4 4926 4928 4929 4927 0.752133 0.592891 0.639337 1 4 4930 4929 4928 4931 0.752133 0.592891 0.639337 1 4 4921 4920 4932 4933 0.752133 0.592891 0.639337 1 4 4932 4934 4935 4933 0.752133 0.592891 0.639337 1 4 4935 4927 4921 4933 0.752133 0.592891 0.639337 1 4 4927 4935 4934 4926 0.752133 0.592891 0.639337 1 4 4934 4932 4920 4926 0.752133 0.592891 0.639337 1 4 4957 4958 4944 4947 0.7 0.7 0.7 1 4 4944 4945 4946 4947 0.752133 0.592891 0.639337 1 4 4946 4948 4949 4947 0.752133 0.592891 0.639337 1 4 4954 4956 4957 4955 0.752133 0.592891 0.639337 1 4 4958 4957 4956 4959 0.752133 0.592891 0.639337 1 4 4949 4948 4960 4961 0.752133 0.592891 0.639337 1 4 4960 4962 4963 4961 0.752133 0.592891 0.639337 1 4 4963 4955 4949 4961 0.752133 0.592891 0.639337 1 4 4955 4963 4962 4954 0.752133 0.592891 0.639337 1 4 4962 4960 4948 4954 0.752133 0.592891 0.639337 1 4 4985 4986 4972 4975 0.7 0.7 0.7 1 4 4972 4973 4974 4975 0.44692 0.261137 0.48673 1 4 4974 4976 4977 4975 0.44692 0.261137 0.48673 1 4 4982 4984 4985 4983 0.44692 0.261137 0.48673 1 4 4986 4985 4984 4987 0.44692 0.261137 0.48673 1 4 4977 4976 4988 4989 0.44692 0.261137 0.48673 1 4 4988 4990 4991 4989 0.44692 0.261137 0.48673 1 4 4991 4983 4977 4989 0.44692 0.261137 0.48673 1 4 4983 4991 4990 4982 0.44692 0.261137 0.48673 1 4 4990 4988 4976 4982 0.44692 0.261137 0.48673 1 4 5013 5014 5000 5003 0.7 0.7 0.7 1 4 5000 5001 5002 5003 0.44692 0.261137 0.48673 1 4 5002 5004 5005 5003 0.44692 0.261137 0.48673 1 4 5010 5012 5013 5011 0.44692 0.261137 0.48673 1 4 5014 5013 5012 5015 0.44692 0.261137 0.48673 1 4 5005 5004 5016 5017 0.44692 0.261137 0.48673 1 4 5016 5018 5019 5017 0.44692 0.261137 0.48673 1 4 5019 5011 5005 5017 0.44692 0.261137 0.48673 1 4 5011 5019 5018 5010 0.44692 0.261137 0.48673 1 4 5018 5016 5004 5010 0.44692 0.261137 0.48673 1 4 5041 5042 5028 5031 0.7 0.7 0.7 1 4 5028 5029 5030 5031 0.44692 0.261137 0.48673 1 4 5030 5032 5033 5031 0.44692 0.261137 0.48673 1 4 5038 5040 5041 5039 0.44692 0.261137 0.48673 1 4 5042 5041 5040 5043 0.44692 0.261137 0.48673 1 4 5033 5032 5044 5045 0.44692 0.261137 0.48673 1 4 5044 5046 5047 5045 0.44692 0.261137 0.48673 1 4 5047 5039 5033 5045 0.44692 0.261137 0.48673 1 4 5039 5047 5046 5038 0.44692 0.261137 0.48673 1 4 5046 5044 5032 5038 0.44692 0.261137 0.48673 1 4 5069 5070 5056 5059 0.7 0.7 0.7 1 4 5056 5057 5058 5059 0.241232 0.287678 0.400474 1 4 5058 5060 5061 5059 0.241232 0.287678 0.400474 1 4 5066 5068 5069 5067 0.241232 0.287678 0.400474 1 4 5070 5069 5068 5071 0.241232 0.287678 0.400474 1 4 5061 5060 5072 5073 0.241232 0.287678 0.400474 1 4 5072 5074 5075 5073 0.241232 0.287678 0.400474 1 4 5075 5067 5061 5073 0.241232 0.287678 0.400474 1 4 5067 5075 5074 5066 0.241232 0.287678 0.400474 1 4 5074 5072 5060 5066 0.241232 0.287678 0.400474 1 4 5089 5087 5084 5085 0.4 0.3 0.2 1 4 5090 5086 5084 5087 0.4 0.3 0.2 1 4 5091 5088 5086 5090 0.4 0.3 0.2 1 4 5105 5106 5092 5095 0.7 0.7 0.7 1 4 5092 5093 5094 5095 0.241232 0.287678 0.400474 1 4 5094 5096 5097 5095 0.241232 0.287678 0.400474 1 4 5102 5104 5105 5103 0.241232 0.287678 0.400474 1 4 5106 5105 5104 5107 0.241232 0.287678 0.400474 1 4 5097 5096 5108 5109 0.241232 0.287678 0.400474 1 4 5108 5110 5111 5109 0.241232 0.287678 0.400474 1 4 5111 5103 5097 5109 0.241232 0.287678 0.400474 1 4 5103 5111 5110 5102 0.241232 0.287678 0.400474 1 4 5110 5108 5096 5102 0.241232 0.287678 0.400474 1 4 5133 5134 5120 5123 0.7 0.7 0.7 1 4 5120 5121 5122 5123 0.825119 0.765403 0.539811 1 4 5122 5124 5125 5123 0.825119 0.765403 0.539811 1 4 5130 5132 5133 5131 0.825119 0.765403 0.539811 1 4 5134 5133 5132 5135 0.825119 0.765403 0.539811 1 4 5125 5124 5136 5137 0.825119 0.765403 0.539811 1 4 5136 5138 5139 5137 0.825119 0.765403 0.539811 1 4 5139 5131 5125 5137 0.825119 0.765403 0.539811 1 4 5131 5139 5138 5130 0.825119 0.765403 0.539811 1 4 5138 5136 5124 5130 0.825119 0.765403 0.539811 1 4 5161 5162 5148 5151 0.7 0.7 0.7 1 4 5148 5149 5150 5151 0.752133 0.592891 0.639337 1 4 5150 5152 5153 5151 0.752133 0.592891 0.639337 1 4 5158 5160 5161 5159 0.752133 0.592891 0.639337 1 4 5162 5161 5160 5163 0.752133 0.592891 0.639337 1 4 5153 5152 5164 5165 0.752133 0.592891 0.639337 1 4 5164 5166 5167 5165 0.752133 0.592891 0.639337 1 4 5167 5159 5153 5165 0.752133 0.592891 0.639337 1 4 5159 5167 5166 5158 0.752133 0.592891 0.639337 1 4 5166 5164 5152 5158 0.752133 0.592891 0.639337 1 4 5189 5190 5176 5179 0.7 0.7 0.7 1 4 5176 5177 5178 5179 0.154976 0.400474 0.347394 1 4 5178 5180 5181 5179 0.154976 0.400474 0.347394 1 4 5186 5188 5189 5187 0.154976 0.400474 0.347394 1 4 5190 5189 5188 5191 0.154976 0.400474 0.347394 1 4 5181 5180 5192 5193 0.154976 0.400474 0.347394 1 4 5192 5194 5195 5193 0.154976 0.400474 0.347394 1 4 5195 5187 5181 5193 0.154976 0.400474 0.347394 1 4 5187 5195 5194 5186 0.154976 0.400474 0.347394 1 4 5194 5192 5180 5186 0.154976 0.400474 0.347394 1 4 5217 5218 5204 5207 0.7 0.7 0.7 1 4 5204 5205 5206 5207 0.154976 0.400474 0.347394 1 4 5206 5208 5209 5207 0.154976 0.400474 0.347394 1 4 5214 5216 5217 5215 0.154976 0.400474 0.347394 1 4 5218 5217 5216 5219 0.154976 0.400474 0.347394 1 4 5209 5208 5220 5221 0.154976 0.400474 0.347394 1 4 5220 5222 5223 5221 0.154976 0.400474 0.347394 1 4 5223 5215 5209 5221 0.154976 0.400474 0.347394 1 4 5215 5223 5222 5214 0.154976 0.400474 0.347394 1 4 5222 5220 5208 5214 0.154976 0.400474 0.347394 1 4 5245 5246 5232 5235 0.7 0.7 0.7 1 4 5232 5233 5234 5235 0.44692 0.261137 0.48673 1 4 5234 5236 5237 5235 0.44692 0.261137 0.48673 1 4 5242 5244 5245 5243 0.44692 0.261137 0.48673 1 4 5246 5245 5244 5247 0.44692 0.261137 0.48673 1 4 5237 5236 5248 5249 0.44692 0.261137 0.48673 1 4 5248 5250 5251 5249 0.44692 0.261137 0.48673 1 4 5251 5243 5237 5249 0.44692 0.261137 0.48673 1 4 5243 5251 5250 5242 0.44692 0.261137 0.48673 1 4 5250 5248 5236 5242 0.44692 0.261137 0.48673 1 4 5273 5274 5260 5263 0.7 0.7 0.7 1 4 5260 5261 5262 5263 0.752133 0.592891 0.639337 1 4 5262 5264 5265 5263 0.752133 0.592891 0.639337 1 4 5270 5272 5273 5271 0.752133 0.592891 0.639337 1 4 5274 5273 5272 5275 0.752133 0.592891 0.639337 1 4 5265 5264 5276 5277 0.752133 0.592891 0.639337 1 4 5276 5278 5279 5277 0.752133 0.592891 0.639337 1 4 5279 5271 5265 5277 0.752133 0.592891 0.639337 1 4 5271 5279 5278 5270 0.752133 0.592891 0.639337 1 4 5278 5276 5264 5270 0.752133 0.592891 0.639337 1 4 5293 5291 5288 5289 0.4 0.3 0.2 1 4 5294 5290 5288 5291 0.4 0.3 0.2 1 4 5295 5292 5290 5294 0.4 0.3 0.2 1 4 5309 5310 5296 5299 0.7 0.7 0.7 1 4 5296 5297 5298 5299 0.752133 0.592891 0.639337 1 4 5298 5300 5301 5299 0.752133 0.592891 0.639337 1 4 5306 5308 5309 5307 0.752133 0.592891 0.639337 1 4 5310 5309 5308 5311 0.752133 0.592891 0.639337 1 4 5301 5300 5312 5313 0.752133 0.592891 0.639337 1 4 5312 5314 5315 5313 0.752133 0.592891 0.639337 1 4 5315 5307 5301 5313 0.752133 0.592891 0.639337 1 4 5307 5315 5314 5306 0.752133 0.592891 0.639337 1 4 5314 5312 5300 5306 0.752133 0.592891 0.639337 1 4 5337 5338 5324 5327 0.7 0.7 0.7 1 4 5324 5325 5326 5327 0.752133 0.592891 0.639337 1 4 5326 5328 5329 5327 0.752133 0.592891 0.639337 1 4 5334 5336 5337 5335 0.752133 0.592891 0.639337 1 4 5338 5337 5336 5339 0.752133 0.592891 0.639337 1 4 5329 5328 5340 5341 0.752133 0.592891 0.639337 1 4 5340 5342 5343 5341 0.752133 0.592891 0.639337 1 4 5343 5335 5329 5341 0.752133 0.592891 0.639337 1 4 5335 5343 5342 5334 0.752133 0.592891 0.639337 1 4 5342 5340 5328 5334 0.752133 0.592891 0.639337 1 4 5365 5366 5352 5355 0.7 0.7 0.7 1 4 5352 5353 5354 5355 0.825119 0.765403 0.539811 1 4 5354 5356 5357 5355 0.825119 0.765403 0.539811 1 4 5362 5364 5365 5363 0.825119 0.765403 0.539811 1 4 5366 5365 5364 5367 0.825119 0.765403 0.539811 1 4 5357 5356 5368 5369 0.825119 0.765403 0.539811 1 4 5368 5370 5371 5369 0.825119 0.765403 0.539811 1 4 5371 5363 5357 5369 0.825119 0.765403 0.539811 1 4 5363 5371 5370 5362 0.825119 0.765403 0.539811 1 4 5370 5368 5356 5362 0.825119 0.765403 0.539811 1 4 5393 5394 5380 5383 0.7 0.7 0.7 1 4 5380 5381 5382 5383 0.752133 0.592891 0.639337 1 4 5382 5384 5385 5383 0.752133 0.592891 0.639337 1 4 5390 5392 5393 5391 0.752133 0.592891 0.639337 1 4 5394 5393 5392 5395 0.752133 0.592891 0.639337 1 4 5385 5384 5396 5397 0.752133 0.592891 0.639337 1 4 5396 5398 5399 5397 0.752133 0.592891 0.639337 1 4 5399 5391 5385 5397 0.752133 0.592891 0.639337 1 4 5391 5399 5398 5390 0.752133 0.592891 0.639337 1 4 5398 5396 5384 5390 0.752133 0.592891 0.639337 1 4 5421 5422 5408 5411 0.7 0.7 0.7 1 4 5408 5409 5410 5411 0.752133 0.592891 0.639337 1 4 5410 5412 5413 5411 0.752133 0.592891 0.639337 1 4 5418 5420 5421 5419 0.752133 0.592891 0.639337 1 4 5422 5421 5420 5423 0.752133 0.592891 0.639337 1 4 5413 5412 5424 5425 0.752133 0.592891 0.639337 1 4 5424 5426 5427 5425 0.752133 0.592891 0.639337 1 4 5427 5419 5413 5425 0.752133 0.592891 0.639337 1 4 5419 5427 5426 5418 0.752133 0.592891 0.639337 1 4 5426 5424 5412 5418 0.752133 0.592891 0.639337 1 4 5449 5450 5436 5439 0.7 0.7 0.7 1 4 5436 5437 5438 5439 0.619431 0.599526 0.44692 1 4 5438 5440 5441 5439 0.619431 0.599526 0.44692 1 4 5446 5448 5449 5447 0.619431 0.599526 0.44692 1 4 5450 5449 5448 5451 0.619431 0.599526 0.44692 1 4 5441 5440 5452 5453 0.619431 0.599526 0.44692 1 4 5452 5454 5455 5453 0.619431 0.599526 0.44692 1 4 5455 5447 5441 5453 0.619431 0.599526 0.44692 1 4 5447 5455 5454 5446 0.619431 0.599526 0.44692 1 4 5454 5452 5440 5446 0.619431 0.599526 0.44692 1 4 5477 5478 5464 5467 0.7 0.7 0.7 1 4 5464 5465 5466 5467 0.241232 0.287678 0.400474 1 4 5466 5468 5469 5467 0.241232 0.287678 0.400474 1 4 5474 5476 5477 5475 0.241232 0.287678 0.400474 1 4 5478 5477 5476 5479 0.241232 0.287678 0.400474 1 4 5469 5468 5480 5481 0.241232 0.287678 0.400474 1 4 5480 5482 5483 5481 0.241232 0.287678 0.400474 1 4 5483 5475 5469 5481 0.241232 0.287678 0.400474 1 4 5475 5483 5482 5474 0.241232 0.287678 0.400474 1 4 5482 5480 5468 5474 0.241232 0.287678 0.400474 1 4 5505 5506 5492 5495 0.7 0.7 0.7 1 4 5492 5493 5494 5495 0.619431 0.599526 0.44692 1 4 5494 5496 5497 5495 0.619431 0.599526 0.44692 1 4 5502 5504 5505 5503 0.619431 0.599526 0.44692 1 4 5506 5505 5504 5507 0.619431 0.599526 0.44692 1 4 5497 5496 5508 5509 0.619431 0.599526 0.44692 1 4 5508 5510 5511 5509 0.619431 0.599526 0.44692 1 4 5511 5503 5497 5509 0.619431 0.599526 0.44692 1 4 5503 5511 5510 5502 0.619431 0.599526 0.44692 1 4 5510 5508 5496 5502 0.619431 0.599526 0.44692 1 4 5533 5534 5520 5523 0.7 0.7 0.7 1 4 5520 5521 5522 5523 0.752133 0.592891 0.639337 1 4 5522 5524 5525 5523 0.752133 0.592891 0.639337 1 4 5530 5532 5533 5531 0.752133 0.592891 0.639337 1 4 5534 5533 5532 5535 0.752133 0.592891 0.639337 1 4 5525 5524 5536 5537 0.752133 0.592891 0.639337 1 4 5536 5538 5539 5537 0.752133 0.592891 0.639337 1 4 5539 5531 5525 5537 0.752133 0.592891 0.639337 1 4 5531 5539 5538 5530 0.752133 0.592891 0.639337 1 4 5538 5536 5524 5530 0.752133 0.592891 0.639337 1 4 5553 5551 5548 5549 0.4 0.3 0.2 1 4 5554 5550 5548 5551 0.4 0.3 0.2 1 4 5555 5552 5550 5554 0.4 0.3 0.2 1 4 5569 5570 5556 5559 0.7 0.7 0.7 1 4 5556 5557 5558 5559 0.154976 0.400474 0.347394 1 4 5558 5560 5561 5559 0.154976 0.400474 0.347394 1 4 5566 5568 5569 5567 0.154976 0.400474 0.347394 1 4 5570 5569 5568 5571 0.154976 0.400474 0.347394 1 4 5561 5560 5572 5573 0.154976 0.400474 0.347394 1 4 5572 5574 5575 5573 0.154976 0.400474 0.347394 1 4 5575 5567 5561 5573 0.154976 0.400474 0.347394 1 4 5567 5575 5574 5566 0.154976 0.400474 0.347394 1 4 5574 5572 5560 5566 0.154976 0.400474 0.347394 1 4 5597 5598 5584 5587 0.7 0.7 0.7 1 4 5584 5585 5586 5587 0.825119 0.765403 0.539811 1 4 5586 5588 5589 5587 0.825119 0.765403 0.539811 1 4 5594 5596 5597 5595 0.825119 0.765403 0.539811 1 4 5598 5597 5596 5599 0.825119 0.765403 0.539811 1 4 5589 5588 5600 5601 0.825119 0.765403 0.539811 1 4 5600 5602 5603 5601 0.825119 0.765403 0.539811 1 4 5603 5595 5589 5601 0.825119 0.765403 0.539811 1 4 5595 5603 5602 5594 0.825119 0.765403 0.539811 1 4 5602 5600 5588 5594 0.825119 0.765403 0.539811 1 4 5625 5626 5612 5615 0.7 0.7 0.7 1 4 5612 5613 5614 5615 0.241232 0.287678 0.400474 1 4 5614 5616 5617 5615 0.241232 0.287678 0.400474 1 4 5622 5624 5625 5623 0.241232 0.287678 0.400474 1 4 5626 5625 5624 5627 0.241232 0.287678 0.400474 1 4 5617 5616 5628 5629 0.241232 0.287678 0.400474 1 4 5628 5630 5631 5629 0.241232 0.287678 0.400474 1 4 5631 5623 5617 5629 0.241232 0.287678 0.400474 1 4 5623 5631 5630 5622 0.241232 0.287678 0.400474 1 4 5630 5628 5616 5622 0.241232 0.287678 0.400474 1 4 5653 5654 5640 5643 0.7 0.7 0.7 1 4 5640 5641 5642 5643 0.752133 0.592891 0.639337 1 4 5642 5644 5645 5643 0.752133 0.592891 0.639337 1 4 5650 5652 5653 5651 0.752133 0.592891 0.639337 1 4 5654 5653 5652 5655 0.752133 0.592891 0.639337 1 4 5645 5644 5656 5657 0.752133 0.592891 0.639337 1 4 5656 5658 5659 5657 0.752133 0.592891 0.639337 1 4 5659 5651 5645 5657 0.752133 0.592891 0.639337 1 4 5651 5659 5658 5650 0.752133 0.592891 0.639337 1 4 5658 5656 5644 5650 0.752133 0.592891 0.639337 1 4 5681 5682 5668 5671 0.7 0.7 0.7 1 4 5668 5669 5670 5671 0.154976 0.400474 0.347394 1 4 5670 5672 5673 5671 0.154976 0.400474 0.347394 1 4 5678 5680 5681 5679 0.154976 0.400474 0.347394 1 4 5682 5681 5680 5683 0.154976 0.400474 0.347394 1 4 5673 5672 5684 5685 0.154976 0.400474 0.347394 1 4 5684 5686 5687 5685 0.154976 0.400474 0.347394 1 4 5687 5679 5673 5685 0.154976 0.400474 0.347394 1 4 5679 5687 5686 5678 0.154976 0.400474 0.347394 1 4 5686 5684 5672 5678 0.154976 0.400474 0.347394 1 4 5709 5710 5696 5699 0.7 0.7 0.7 1 4 5696 5697 5698 5699 0.619431 0.599526 0.44692 1 4 5698 5700 5701 5699 0.619431 0.599526 0.44692 1 4 5706 5708 5709 5707 0.619431 0.599526 0.44692 1 4 5710 5709 5708 5711 0.619431 0.599526 0.44692 1 4 5701 5700 5712 5713 0.619431 0.599526 0.44692 1 4 5712 5714 5715 5713 0.619431 0.599526 0.44692 1 4 5715 5707 5701 5713 0.619431 0.599526 0.44692 1 4 5707 5715 5714 5706 0.619431 0.599526 0.44692 1 4 5714 5712 5700 5706 0.619431 0.599526 0.44692 1 4 5737 5738 5724 5727 0.7 0.7 0.7 1 4 5724 5725 5726 5727 0.241232 0.287678 0.400474 1 4 5726 5728 5729 5727 0.241232 0.287678 0.400474 1 4 5734 5736 5737 5735 0.241232 0.287678 0.400474 1 4 5738 5737 5736 5739 0.241232 0.287678 0.400474 1 4 5729 5728 5740 5741 0.241232 0.287678 0.400474 1 4 5740 5742 5743 5741 0.241232 0.287678 0.400474 1 4 5743 5735 5729 5741 0.241232 0.287678 0.400474 1 4 5735 5743 5742 5734 0.241232 0.287678 0.400474 1 4 5742 5740 5728 5734 0.241232 0.287678 0.400474 1 4 5765 5766 5752 5755 0.7 0.7 0.7 1 4 5752 5753 5754 5755 0.752133 0.592891 0.639337 1 4 5754 5756 5757 5755 0.752133 0.592891 0.639337 1 4 5762 5764 5765 5763 0.752133 0.592891 0.639337 1 4 5766 5765 5764 5767 0.752133 0.592891 0.639337 1 4 5757 5756 5768 5769 0.752133 0.592891 0.639337 1 4 5768 5770 5771 5769 0.752133 0.592891 0.639337 1 4 5771 5763 5757 5769 0.752133 0.592891 0.639337 1 4 5763 5771 5770 5762 0.752133 0.592891 0.639337 1 4 5770 5768 5756 5762 0.752133 0.592891 0.639337 1 4 5785 5783 5780 5781 0.4 0.3 0.2 1 4 5786 5782 5780 5783 0.4 0.3 0.2 1 4 5787 5784 5782 5786 0.4 0.3 0.2 1 4 5801 5802 5788 5791 0.7 0.7 0.7 1 4 5788 5789 5790 5791 0.44692 0.261137 0.48673 1 4 5790 5792 5793 5791 0.44692 0.261137 0.48673 1 4 5798 5800 5801 5799 0.44692 0.261137 0.48673 1 4 5802 5801 5800 5803 0.44692 0.261137 0.48673 1 4 5793 5792 5804 5805 0.44692 0.261137 0.48673 1 4 5804 5806 5807 5805 0.44692 0.261137 0.48673 1 4 5807 5799 5793 5805 0.44692 0.261137 0.48673 1 4 5799 5807 5806 5798 0.44692 0.261137 0.48673 1 4 5806 5804 5792 5798 0.44692 0.261137 0.48673 1 4 5829 5830 5816 5819 0.7 0.7 0.7 1 4 5816 5817 5818 5819 0.241232 0.287678 0.400474 1 4 5818 5820 5821 5819 0.241232 0.287678 0.400474 1 4 5826 5828 5829 5827 0.241232 0.287678 0.400474 1 4 5830 5829 5828 5831 0.241232 0.287678 0.400474 1 4 5821 5820 5832 5833 0.241232 0.287678 0.400474 1 4 5832 5834 5835 5833 0.241232 0.287678 0.400474 1 4 5835 5827 5821 5833 0.241232 0.287678 0.400474 1 4 5827 5835 5834 5826 0.241232 0.287678 0.400474 1 4 5834 5832 5820 5826 0.241232 0.287678 0.400474 1 4 5857 5858 5844 5847 0.7 0.7 0.7 1 4 5844 5845 5846 5847 0.825119 0.765403 0.539811 1 4 5846 5848 5849 5847 0.825119 0.765403 0.539811 1 4 5854 5856 5857 5855 0.825119 0.765403 0.539811 1 4 5858 5857 5856 5859 0.825119 0.765403 0.539811 1 4 5849 5848 5860 5861 0.825119 0.765403 0.539811 1 4 5860 5862 5863 5861 0.825119 0.765403 0.539811 1 4 5863 5855 5849 5861 0.825119 0.765403 0.539811 1 4 5855 5863 5862 5854 0.825119 0.765403 0.539811 1 4 5862 5860 5848 5854 0.825119 0.765403 0.539811 1 4 5885 5886 5872 5875 0.7 0.7 0.7 1 4 5872 5873 5874 5875 0.619431 0.599526 0.44692 1 4 5874 5876 5877 5875 0.619431 0.599526 0.44692 1 4 5882 5884 5885 5883 0.619431 0.599526 0.44692 1 4 5886 5885 5884 5887 0.619431 0.599526 0.44692 1 4 5877 5876 5888 5889 0.619431 0.599526 0.44692 1 4 5888 5890 5891 5889 0.619431 0.599526 0.44692 1 4 5891 5883 5877 5889 0.619431 0.599526 0.44692 1 4 5883 5891 5890 5882 0.619431 0.599526 0.44692 1 4 5890 5888 5876 5882 0.619431 0.599526 0.44692 1 4 5913 5914 5900 5903 0.7 0.7 0.7 1 4 5900 5901 5902 5903 0.44692 0.261137 0.48673 1 4 5902 5904 5905 5903 0.44692 0.261137 0.48673 1 4 5910 5912 5913 5911 0.44692 0.261137 0.48673 1 4 5914 5913 5912 5915 0.44692 0.261137 0.48673 1 4 5905 5904 5916 5917 0.44692 0.261137 0.48673 1 4 5916 5918 5919 5917 0.44692 0.261137 0.48673 1 4 5919 5911 5905 5917 0.44692 0.261137 0.48673 1 4 5911 5919 5918 5910 0.44692 0.261137 0.48673 1 4 5918 5916 5904 5910 0.44692 0.261137 0.48673 1 4 5941 5942 5928 5931 0.7 0.7 0.7 1 4 5928 5929 5930 5931 0.752133 0.592891 0.639337 1 4 5930 5932 5933 5931 0.752133 0.592891 0.639337 1 4 5938 5940 5941 5939 0.752133 0.592891 0.639337 1 4 5942 5941 5940 5943 0.752133 0.592891 0.639337 1 4 5933 5932 5944 5945 0.752133 0.592891 0.639337 1 4 5944 5946 5947 5945 0.752133 0.592891 0.639337 1 4 5947 5939 5933 5945 0.752133 0.592891 0.639337 1 4 5939 5947 5946 5938 0.752133 0.592891 0.639337 1 4 5946 5944 5932 5938 0.752133 0.592891 0.639337 1 4 5969 5970 5956 5959 0.7 0.7 0.7 1 4 5956 5957 5958 5959 0.154976 0.400474 0.347394 1 4 5958 5960 5961 5959 0.154976 0.400474 0.347394 1 4 5966 5968 5969 5967 0.154976 0.400474 0.347394 1 4 5970 5969 5968 5971 0.154976 0.400474 0.347394 1 4 5961 5960 5972 5973 0.154976 0.400474 0.347394 1 4 5972 5974 5975 5973 0.154976 0.400474 0.347394 1 4 5975 5967 5961 5973 0.154976 0.400474 0.347394 1 4 5967 5975 5974 5966 0.154976 0.400474 0.347394 1 4 5974 5972 5960 5966 0.154976 0.400474 0.347394 1 4 5997 5998 5984 5987 0.7 0.7 0.7 1 4 5984 5985 5986 5987 0.154976 0.400474 0.347394 1 4 5986 5988 5989 5987 0.154976 0.400474 0.347394 1 4 5994 5996 5997 5995 0.154976 0.400474 0.347394 1 4 5998 5997 5996 5999 0.154976 0.400474 0.347394 1 4 5989 5988 6000 6001 0.154976 0.400474 0.347394 1 4 6000 6002 6003 6001 0.154976 0.400474 0.347394 1 4 6003 5995 5989 6001 0.154976 0.400474 0.347394 1 4 5995 6003 6002 5994 0.154976 0.400474 0.347394 1 4 6002 6000 5988 5994 0.154976 0.400474 0.347394 1 4 6025 6026 6012 6015 0.7 0.7 0.7 1 4 6012 6013 6014 6015 0.44692 0.261137 0.48673 1 4 6014 6016 6017 6015 0.44692 0.261137 0.48673 1 4 6022 6024 6025 6023 0.44692 0.261137 0.48673 1 4 6026 6025 6024 6027 0.44692 0.261137 0.48673 1 4 6017 6016 6028 6029 0.44692 0.261137 0.48673 1 4 6028 6030 6031 6029 0.44692 0.261137 0.48673 1 4 6031 6023 6017 6029 0.44692 0.261137 0.48673 1 4 6023 6031 6030 6022 0.44692 0.261137 0.48673 1 4 6030 6028 6016 6022 0.44692 0.261137 0.48673 1 4 6053 6054 6040 6043 0.7 0.7 0.7 1 4 6040 6041 6042 6043 0.825119 0.765403 0.539811 1 4 6042 6044 6045 6043 0.825119 0.765403 0.539811 1 4 6050 6052 6053 6051 0.825119 0.765403 0.539811 1 4 6054 6053 6052 6055 0.825119 0.765403 0.539811 1 4 6045 6044 6056 6057 0.825119 0.765403 0.539811 1 4 6056 6058 6059 6057 0.825119 0.765403 0.539811 1 4 6059 6051 6045 6057 0.825119 0.765403 0.539811 1 4 6051 6059 6058 6050 0.825119 0.765403 0.539811 1 4 6058 6056 6044 6050 0.825119 0.765403 0.539811 1 4 6073 6071 6068 6069 0.4 0.3 0.2 1 4 6074 6070 6068 6071 0.4 0.3 0.2 1 4 6075 6072 6070 6074 0.4 0.3 0.2 1 4 6089 6090 6076 6079 0.7 0.7 0.7 1 4 6076 6077 6078 6079 0.44692 0.261137 0.48673 1 4 6078 6080 6081 6079 0.44692 0.261137 0.48673 1 4 6086 6088 6089 6087 0.44692 0.261137 0.48673 1 4 6090 6089 6088 6091 0.44692 0.261137 0.48673 1 4 6081 6080 6092 6093 0.44692 0.261137 0.48673 1 4 6092 6094 6095 6093 0.44692 0.261137 0.48673 1 4 6095 6087 6081 6093 0.44692 0.261137 0.48673 1 4 6087 6095 6094 6086 0.44692 0.261137 0.48673 1 4 6094 6092 6080 6086 0.44692 0.261137 0.48673 1 4 6117 6118 6104 6107 0.7 0.7 0.7 1 4 6104 6105 6106 6107 0.154976 0.400474 0.347394 1 4 6106 6108 6109 6107 0.154976 0.400474 0.347394 1 4 6114 6116 6117 6115 0.154976 0.400474 0.347394 1 4 6118 6117 6116 6119 0.154976 0.400474 0.347394 1 4 6109 6108 6120 6121 0.154976 0.400474 0.347394 1 4 6120 6122 6123 6121 0.154976 0.400474 0.347394 1 4 6123 6115 6109 6121 0.154976 0.400474 0.347394 1 4 6115 6123 6122 6114 0.154976 0.400474 0.347394 1 4 6122 6120 6108 6114 0.154976 0.400474 0.347394 1 4 6145 6146 6132 6135 0.7 0.7 0.7 1 4 6132 6133 6134 6135 0.241232 0.287678 0.400474 1 4 6134 6136 6137 6135 0.241232 0.287678 0.400474 1 4 6142 6144 6145 6143 0.241232 0.287678 0.400474 1 4 6146 6145 6144 6147 0.241232 0.287678 0.400474 1 4 6137 6136 6148 6149 0.241232 0.287678 0.400474 1 4 6148 6150 6151 6149 0.241232 0.287678 0.400474 1 4 6151 6143 6137 6149 0.241232 0.287678 0.400474 1 4 6143 6151 6150 6142 0.241232 0.287678 0.400474 1 4 6150 6148 6136 6142 0.241232 0.287678 0.400474 1 4 6173 6174 6160 6163 0.7 0.7 0.7 1 4 6160 6161 6162 6163 0.619431 0.599526 0.44692 1 4 6162 6164 6165 6163 0.619431 0.599526 0.44692 1 4 6170 6172 6173 6171 0.619431 0.599526 0.44692 1 4 6174 6173 6172 6175 0.619431 0.599526 0.44692 1 4 6165 6164 6176 6177 0.619431 0.599526 0.44692 1 4 6176 6178 6179 6177 0.619431 0.599526 0.44692 1 4 6179 6171 6165 6177 0.619431 0.599526 0.44692 1 4 6171 6179 6178 6170 0.619431 0.599526 0.44692 1 4 6178 6176 6164 6170 0.619431 0.599526 0.44692 1 4 6201 6202 6188 6191 0.7 0.7 0.7 1 4 6188 6189 6190 6191 0.241232 0.287678 0.400474 1 4 6190 6192 6193 6191 0.241232 0.287678 0.400474 1 4 6198 6200 6201 6199 0.241232 0.287678 0.400474 1 4 6202 6201 6200 6203 0.241232 0.287678 0.400474 1 4 6193 6192 6204 6205 0.241232 0.287678 0.400474 1 4 6204 6206 6207 6205 0.241232 0.287678 0.400474 1 4 6207 6199 6193 6205 0.241232 0.287678 0.400474 1 4 6199 6207 6206 6198 0.241232 0.287678 0.400474 1 4 6206 6204 6192 6198 0.241232 0.287678 0.400474 1 4 6229 6230 6216 6219 0.7 0.7 0.7 1 4 6216 6217 6218 6219 0.752133 0.592891 0.639337 1 4 6218 6220 6221 6219 0.752133 0.592891 0.639337 1 4 6226 6228 6229 6227 0.752133 0.592891 0.639337 1 4 6230 6229 6228 6231 0.752133 0.592891 0.639337 1 4 6221 6220 6232 6233 0.752133 0.592891 0.639337 1 4 6232 6234 6235 6233 0.752133 0.592891 0.639337 1 4 6235 6227 6221 6233 0.752133 0.592891 0.639337 1 4 6227 6235 6234 6226 0.752133 0.592891 0.639337 1 4 6234 6232 6220 6226 0.752133 0.592891 0.639337 1 4 6257 6258 6244 6247 0.7 0.7 0.7 1 4 6244 6245 6246 6247 0.154976 0.400474 0.347394 1 4 6246 6248 6249 6247 0.154976 0.400474 0.347394 1 4 6254 6256 6257 6255 0.154976 0.400474 0.347394 1 4 6258 6257 6256 6259 0.154976 0.400474 0.347394 1 4 6249 6248 6260 6261 0.154976 0.400474 0.347394 1 4 6260 6262 6263 6261 0.154976 0.400474 0.347394 1 4 6263 6255 6249 6261 0.154976 0.400474 0.347394 1 4 6255 6263 6262 6254 0.154976 0.400474 0.347394 1 4 6262 6260 6248 6254 0.154976 0.400474 0.347394 1 4 6285 6286 6272 6275 0.7 0.7 0.7 1 4 6272 6273 6274 6275 0.44692 0.261137 0.48673 1 4 6274 6276 6277 6275 0.44692 0.261137 0.48673 1 4 6282 6284 6285 6283 0.44692 0.261137 0.48673 1 4 6286 6285 6284 6287 0.44692 0.261137 0.48673 1 4 6277 6276 6288 6289 0.44692 0.261137 0.48673 1 4 6288 6290 6291 6289 0.44692 0.261137 0.48673 1 4 6291 6283 6277 6289 0.44692 0.261137 0.48673 1 4 6283 6291 6290 6282 0.44692 0.261137 0.48673 1 4 6290 6288 6276 6282 0.44692 0.261137 0.48673 1 4 6313 6314 6300 6303 0.7 0.7 0.7 1 4 6300 6301 6302 6303 0.619431 0.599526 0.44692 1 4 6302 6304 6305 6303 0.619431 0.599526 0.44692 1 4 6310 6312 6313 6311 0.619431 0.599526 0.44692 1 4 6314 6313 6312 6315 0.619431 0.599526 0.44692 1 4 6305 6304 6316 6317 0.619431 0.599526 0.44692 1 4 6316 6318 6319 6317 0.619431 0.599526 0.44692 1 4 6319 6311 6305 6317 0.619431 0.599526 0.44692 1 4 6311 6319 6318 6310 0.619431 0.599526 0.44692 1 4 6318 6316 6304 6310 0.619431 0.599526 0.44692 1 4 6333 6331 6328 6329 0.4 0.3 0.2 1 4 6334 6330 6328 6331 0.4 0.3 0.2 1 4 6335 6332 6330 6334 0.4 0.3 0.2 1 4 6349 6350 6336 6339 0.7 0.7 0.7 1 4 6336 6337 6338 6339 0.825119 0.765403 0.539811 1 4 6338 6340 6341 6339 0.825119 0.765403 0.539811 1 4 6346 6348 6349 6347 0.825119 0.765403 0.539811 1 4 6350 6349 6348 6351 0.825119 0.765403 0.539811 1 4 6341 6340 6352 6353 0.825119 0.765403 0.539811 1 4 6352 6354 6355 6353 0.825119 0.765403 0.539811 1 4 6355 6347 6341 6353 0.825119 0.765403 0.539811 1 4 6347 6355 6354 6346 0.825119 0.765403 0.539811 1 4 6354 6352 6340 6346 0.825119 0.765403 0.539811 1 4 6377 6378 6364 6367 0.7 0.7 0.7 1 4 6364 6365 6366 6367 0.154976 0.400474 0.347394 1 4 6366 6368 6369 6367 0.154976 0.400474 0.347394 1 4 6374 6376 6377 6375 0.154976 0.400474 0.347394 1 4 6378 6377 6376 6379 0.154976 0.400474 0.347394 1 4 6369 6368 6380 6381 0.154976 0.400474 0.347394 1 4 6380 6382 6383 6381 0.154976 0.400474 0.347394 1 4 6383 6375 6369 6381 0.154976 0.400474 0.347394 1 4 6375 6383 6382 6374 0.154976 0.400474 0.347394 1 4 6382 6380 6368 6374 0.154976 0.400474 0.347394 1 4 6405 6406 6392 6395 0.7 0.7 0.7 1 4 6392 6393 6394 6395 0.825119 0.765403 0.539811 1 4 6394 6396 6397 6395 0.825119 0.765403 0.539811 1 4 6402 6404 6405 6403 0.825119 0.765403 0.539811 1 4 6406 6405 6404 6407 0.825119 0.765403 0.539811 1 4 6397 6396 6408 6409 0.825119 0.765403 0.539811 1 4 6408 6410 6411 6409 0.825119 0.765403 0.539811 1 4 6411 6403 6397 6409 0.825119 0.765403 0.539811 1 4 6403 6411 6410 6402 0.825119 0.765403 0.539811 1 4 6410 6408 6396 6402 0.825119 0.765403 0.539811 1 4 6433 6434 6420 6423 0.7 0.7 0.7 1 4 6420 6421 6422 6423 0.619431 0.599526 0.44692 1 4 6422 6424 6425 6423 0.619431 0.599526 0.44692 1 4 6430 6432 6433 6431 0.619431 0.599526 0.44692 1 4 6434 6433 6432 6435 0.619431 0.599526 0.44692 1 4 6425 6424 6436 6437 0.619431 0.599526 0.44692 1 4 6436 6438 6439 6437 0.619431 0.599526 0.44692 1 4 6439 6431 6425 6437 0.619431 0.599526 0.44692 1 4 6431 6439 6438 6430 0.619431 0.599526 0.44692 1 4 6438 6436 6424 6430 0.619431 0.599526 0.44692 1 4 6461 6462 6448 6451 0.7 0.7 0.7 1 4 6448 6449 6450 6451 0.825119 0.765403 0.539811 1 4 6450 6452 6453 6451 0.825119 0.765403 0.539811 1 4 6458 6460 6461 6459 0.825119 0.765403 0.539811 1 4 6462 6461 6460 6463 0.825119 0.765403 0.539811 1 4 6453 6452 6464 6465 0.825119 0.765403 0.539811 1 4 6464 6466 6467 6465 0.825119 0.765403 0.539811 1 4 6467 6459 6453 6465 0.825119 0.765403 0.539811 1 4 6459 6467 6466 6458 0.825119 0.765403 0.539811 1 4 6466 6464 6452 6458 0.825119 0.765403 0.539811 1 4 6489 6490 6476 6479 0.7 0.7 0.7 1 4 6476 6477 6478 6479 0.825119 0.765403 0.539811 1 4 6478 6480 6481 6479 0.825119 0.765403 0.539811 1 4 6486 6488 6489 6487 0.825119 0.765403 0.539811 1 4 6490 6489 6488 6491 0.825119 0.765403 0.539811 1 4 6481 6480 6492 6493 0.825119 0.765403 0.539811 1 4 6492 6494 6495 6493 0.825119 0.765403 0.539811 1 4 6495 6487 6481 6493 0.825119 0.765403 0.539811 1 4 6487 6495 6494 6486 0.825119 0.765403 0.539811 1 4 6494 6492 6480 6486 0.825119 0.765403 0.539811 1 4 6517 6518 6504 6507 0.7 0.7 0.7 1 4 6504 6505 6506 6507 0.44692 0.261137 0.48673 1 4 6506 6508 6509 6507 0.44692 0.261137 0.48673 1 4 6514 6516 6517 6515 0.44692 0.261137 0.48673 1 4 6518 6517 6516 6519 0.44692 0.261137 0.48673 1 4 6509 6508 6520 6521 0.44692 0.261137 0.48673 1 4 6520 6522 6523 6521 0.44692 0.261137 0.48673 1 4 6523 6515 6509 6521 0.44692 0.261137 0.48673 1 4 6515 6523 6522 6514 0.44692 0.261137 0.48673 1 4 6522 6520 6508 6514 0.44692 0.261137 0.48673 1 4 6545 6546 6532 6535 0.7 0.7 0.7 1 4 6532 6533 6534 6535 0.44692 0.261137 0.48673 1 4 6534 6536 6537 6535 0.44692 0.261137 0.48673 1 4 6542 6544 6545 6543 0.44692 0.261137 0.48673 1 4 6546 6545 6544 6547 0.44692 0.261137 0.48673 1 4 6537 6536 6548 6549 0.44692 0.261137 0.48673 1 4 6548 6550 6551 6549 0.44692 0.261137 0.48673 1 4 6551 6543 6537 6549 0.44692 0.261137 0.48673 1 4 6543 6551 6550 6542 0.44692 0.261137 0.48673 1 4 6550 6548 6536 6542 0.44692 0.261137 0.48673 1 4 6565 6563 6560 6561 0.4 0.3 0.2 1 4 6566 6562 6560 6563 0.4 0.3 0.2 1 4 6567 6564 6562 6566 0.4 0.3 0.2 1 4 6568 6569 6570 6571 0.47 0.2 0.07 1 4 6572 6573 6570 6569 0.47 0.2 0.07 1 4 6574 6575 6568 6571 0.47 0.2 0.07 1 4 6573 6574 6571 6570 0.47 0.2 0.07 1 4 6576 6577 6569 6568 0.47 0.2 0.07 1 4 6578 6579 6580 6581 0.47 0.2 0.07 1 4 6569 6577 6579 6572 0.47 0.2 0.07 1 4 6576 6568 6575 6578 0.47 0.2 0.07 1 4 6582 6583 6584 6585 0.611756 0.259474 0.078 1 4 6586 6582 6585 6587 0.611756 0.259474 0.078 1 4 6583 6588 6589 6584 0.611756 0.259474 0.078 1 4 6583 6582 6586 6588 0.611756 0.259474 0.078 1 4 6585 6584 6589 6587 0.611756 0.259474 0.078 1 4 6590 6591 6592 6593 0.611756 0.259474 0.078 1 4 6594 6590 6593 6595 0.611756 0.259474 0.078 1 4 6591 6596 6597 6592 0.611756 0.259474 0.078 1 4 6591 6590 6594 6596 0.611756 0.259474 0.078 1 4 6593 6592 6597 6595 0.611756 0.259474 0.078 1 4 6598 6599 6600 6601 0.731399 0.651637 0.598462 1 4 6602 6603 6604 6605 0.47 0.2 0.07 1 4 6602 6605 6599 6606 0.47 0.2 0.07 1 4 6607 6606 6599 6598 0.47 0.2 0.07 1 4 6603 6607 6598 6604 0.47 0.2 0.07 1 4 6601 6600 6605 6604 0.731399 0.651637 0.598462 1 4 6602 6608 6609 6603 0.47 0.2 0.07 1 4 6606 6580 6577 6608 0.47 0.2 0.07 1 4 6581 6607 6609 6576 0.47 0.2 0.07 1 4 6610 6611 6612 6613 0.47 0.2 0.07 1 4 6614 6615 6612 6611 0.47 0.2 0.07 1 4 6616 6617 6610 6613 0.47 0.2 0.07 1 4 6615 6616 6613 6612 0.47 0.2 0.07 1 4 6618 6619 6611 6610 0.47 0.2 0.07 1 4 6620 6621 6622 6623 0.47 0.2 0.07 1 4 6611 6619 6621 6614 0.47 0.2 0.07 1 4 6618 6610 6617 6620 0.47 0.2 0.07 1 4 6624 6625 6626 6627 0.611756 0.259474 0.078 1 4 6628 6624 6627 6629 0.611756 0.259474 0.078 1 4 6625 6630 6631 6626 0.611756 0.259474 0.078 1 4 6625 6624 6628 6630 0.611756 0.259474 0.078 1 4 6627 6626 6631 6629 0.611756 0.259474 0.078 1 4 6632 6633 6634 6635 0.611756 0.259474 0.078 1 4 6636 6632 6635 6637 0.611756 0.259474 0.078 1 4 6633 6638 6639 6634 0.611756 0.259474 0.078 1 4 6633 6632 6636 6638 0.611756 0.259474 0.078 1 4 6635 6634 6639 6637 0.611756 0.259474 0.078 1 4 6640 6641 6642 6643 0.731399 0.651637 0.598462 1 4 6644 6645 6646 6647 0.47 0.2 0.07 1 4 6644 6647 6641 6648 0.47 0.2 0.07 1 4 6649 6648 6641 6640 0.47 0.2 0.07 1 4 6645 6649 6640 6646 0.47 0.2 0.07 1 4 6643 6642 6647 6646 0.731399 0.651637 0.598462 1 4 6644 6650 6651 6645 0.47 0.2 0.07 1 4 6648 6622 6619 6650 0.47 0.2 0.07 1 4 6623 6649 6651 6618 0.47 0.2 0.07 1 4 6652 6653 6654 6655 0.47 0.2 0.07 1 4 6656 6657 6654 6653 0.47 0.2 0.07 1 4 6658 6659 6652 6655 0.47 0.2 0.07 1 4 6657 6658 6655 6654 0.47 0.2 0.07 1 4 6660 6661 6653 6652 0.47 0.2 0.07 1 4 6662 6663 6664 6665 0.47 0.2 0.07 1 4 6653 6661 6663 6656 0.47 0.2 0.07 1 4 6660 6652 6659 6662 0.47 0.2 0.07 1 4 6666 6667 6668 6669 0.611756 0.259474 0.078 1 4 6670 6666 6669 6671 0.611756 0.259474 0.078 1 4 6667 6672 6673 6668 0.611756 0.259474 0.078 1 4 6667 6666 6670 6672 0.611756 0.259474 0.078 1 4 6669 6668 6673 6671 0.611756 0.259474 0.078 1 4 6674 6675 6676 6677 0.611756 0.259474 0.078 1 4 6678 6674 6677 6679 0.611756 0.259474 0.078 1 4 6675 6680 6681 6676 0.611756 0.259474 0.078 1 4 6675 6674 6678 6680 0.611756 0.259474 0.078 1 4 6677 6676 6681 6679 0.611756 0.259474 0.078 1 4 6682 6683 6684 6685 0.731399 0.651637 0.598462 1 4 6686 6687 6688 6689 0.47 0.2 0.07 1 4 6686 6689 6683 6690 0.47 0.2 0.07 1 4 6691 6690 6683 6682 0.47 0.2 0.07 1 4 6687 6691 6682 6688 0.47 0.2 0.07 1 4 6685 6684 6689 6688 0.731399 0.651637 0.598462 1 4 6686 6692 6693 6687 0.47 0.2 0.07 1 4 6690 6664 6661 6692 0.47 0.2 0.07 1 4 6665 6691 6693 6660 0.47 0.2 0.07 1 4 6694 6695 6696 6697 0.47 0.2 0.07 1 4 6698 6699 6696 6695 0.47 0.2 0.07 1 4 6700 6701 6694 6697 0.47 0.2 0.07 1 4 6699 6700 6697 6696 0.47 0.2 0.07 1 4 6702 6703 6695 6694 0.47 0.2 0.07 1 4 6704 6705 6706 6707 0.47 0.2 0.07 1 4 6695 6703 6705 6698 0.47 0.2 0.07 1 4 6702 6694 6701 6704 0.47 0.2 0.07 1 4 6708 6709 6710 6711 0.611756 0.259474 0.078 1 4 6712 6708 6711 6713 0.611756 0.259474 0.078 1 4 6709 6714 6715 6710 0.611756 0.259474 0.078 1 4 6709 6708 6712 6714 0.611756 0.259474 0.078 1 4 6711 6710 6715 6713 0.611756 0.259474 0.078 1 4 6716 6717 6718 6719 0.611756 0.259474 0.078 1 4 6720 6716 6719 6721 0.611756 0.259474 0.078 1 4 6717 6722 6723 6718 0.611756 0.259474 0.078 1 4 6717 6716 6720 6722 0.611756 0.259474 0.078 1 4 6719 6718 6723 6721 0.611756 0.259474 0.078 1 4 6724 6725 6726 6727 0.731399 0.651637 0.598462 1 4 6728 6729 6730 6731 0.47 0.2 0.07 1 4 6728 6731 6725 6732 0.47 0.2 0.07 1 4 6733 6732 6725 6724 0.47 0.2 0.07 1 4 6729 6733 6724 6730 0.47 0.2 0.07 1 4 6727 6726 6731 6730 0.731399 0.651637 0.598462 1 4 6728 6734 6735 6729 0.47 0.2 0.07 1 4 6732 6706 6703 6734 0.47 0.2 0.07 1 4 6707 6733 6735 6702 0.47 0.2 0.07 1 4 6736 6737 6738 6739 1 1 1 1 4 6737 6736 6739 6738 1 1 1 1 4 6740 6741 6748 6749 0.286061 0.22624 0.159772 1 4 6749 6748 6752 6753 0.286061 0.22624 0.159772 1 4 6753 6742 6740 6749 0.286061 0.22624 0.159772 1 4 6753 6752 6743 6742 0.286061 0.22624 0.159772 1 4 6741 6740 6742 6743 0.286061 0.22624 0.159772 1 4 6752 6748 6741 6743 0.286061 0.22624 0.159772 1 4 6751 6750 6744 6745 0.286061 0.22624 0.159772 1 4 6744 6746 6747 6745 0.286061 0.22624 0.159772 1 4 6747 6754 6751 6745 0.286061 0.22624 0.159772 1 4 6754 6747 6746 6755 0.286061 0.22624 0.159772 1 4 6750 6751 6754 6755 0.286061 0.22624 0.159772 1 4 6746 6744 6750 6755 0.286061 0.22624 0.159772 1 4 6741 6744 6750 6748 0.286061 0.22624 0.159772 1 4 6744 6746 6755 6750 0.286061 0.22624 0.159772 1 4 6748 6750 6755 6752 0.286061 0.22624 0.159772 1 4 6752 6755 6746 6743 0.286061 0.22624 0.159772 1 4 6741 6748 6752 6743 0.286061 0.22624 0.159772 1 4 6746 6744 6741 6743 0.286061 0.22624 0.159772 1 4 6745 6740 6749 6751 0.286061 0.22624 0.159772 1 4 6751 6754 6747 6745 0.286061 0.22624 0.159772 1 4 6747 6742 6740 6745 0.286061 0.22624 0.159772 1 4 6742 6747 6754 6753 0.286061 0.22624 0.159772 1 4 6749 6740 6742 6753 0.286061 0.22624 0.159772 1 4 6751 6749 6753 6754 0.286061 0.22624 0.159772 1 4 6759 6757 6756 6758 0 0 0 1 4 6763 6761 6760 6762 0 0 0 1 4 6767 6765 6764 6766 0 0 0 1 4 6771 6769 6768 6770 0 0 0 1 5 6772 6774 6776 6775 6773 0 0 0 1 5 6777 6779 6781 6780 6778 0 0 0 1 24 6828 6826 6824 6822 6820 6818 6816 6814 6812 6810 6808 6806 6804 6802 6800 6798 6796 6794 6792 6790 6788 6786 6784 6782 0.9 0.9 0.9 1 4 6808 6810 6811 6809 0.1 0.3 0.1 1 4 6807 6806 6808 6809 0.1 0.3 0.1 1 4 6805 6804 6806 6807 0.1 0.3 0.1 1 4 6803 6802 6804 6805 0.1 0.3 0.1 1 4 6842 6806 6804 6841 0.1 0.3 0.1 1 4 6844 6810 6808 6843 0.1 0.3 0.1 1 4 6806 6842 6841 6804 0.1 0.3 0.1 1 4 6810 6844 6843 6808 0.1 0.3 0.1 1 4 6866 6842 6841 6865 0.1 0.3 0.1 1 4 6867 6843 6842 6866 0.1 0.3 0.1 1 4 6867 6868 6844 6843 0.1 0.3 0.1 1 4 6806 6842 6843 6808 0.1 0.3 0.1 1 4 6841 6804 6802 6840 0.1 0.3 0.1 1 4 6842 6806 6808 6843 0.1 0.3 0.1 1 4 6804 6841 6840 6802 0.1 0.3 0.1 1 4 6865 6841 6840 6864 0.1 0.3 0.1 1 4 6800 6802 6803 6801 0.1 0.3 0.1 1 4 6799 6798 6800 6801 0.1 0.3 0.1 1 4 6797 6796 6798 6799 0.1 0.3 0.1 1 4 6840 6802 6800 6839 0.1 0.3 0.1 1 4 6802 6840 6839 6800 0.1 0.3 0.1 1 4 6864 6840 6839 6863 0.1 0.3 0.1 1 4 6839 6800 6798 6838 0.1 0.3 0.1 1 4 6800 6839 6838 6798 0.1 0.3 0.1 1 4 6863 6839 6838 6862 0.1 0.3 0.1 1 4 6838 6798 6796 6837 0.1 0.3 0.1 1 4 6798 6838 6837 6796 0.1 0.3 0.1 1 4 6862 6838 6837 6861 0.1 0.3 0.1 1 4 6794 6796 6797 6795 0.1 0.3 0.1 1 4 6792 6794 6795 6793 0.1 0.3 0.1 1 4 6790 6792 6793 6791 0.1 0.3 0.1 1 4 6835 6836 6794 6792 0.1 0.3 0.1 1 4 6792 6794 6836 6835 0.1 0.3 0.1 1 4 6859 6860 6836 6835 0.1 0.3 0.1 1 4 6858 6859 6835 6834 0.1 0.3 0.1 1 4 6836 6860 6861 6837 0.1 0.3 0.1 1 4 6794 6836 6837 6796 0.1 0.3 0.1 1 4 6835 6792 6790 6834 0.1 0.3 0.1 1 4 6836 6794 6796 6837 0.1 0.3 0.1 1 4 6792 6835 6834 6790 0.1 0.3 0.1 1 4 6788 6790 6791 6789 0.1 0.3 0.1 1 4 6786 6788 6789 6787 0.1 0.3 0.1 1 4 6784 6786 6787 6785 0.1 0.3 0.1 1 4 6833 6834 6790 6788 0.1 0.3 0.1 1 4 6786 6832 6833 6788 0.1 0.3 0.1 1 4 6788 6790 6834 6833 0.1 0.3 0.1 1 4 6832 6786 6788 6833 0.1 0.3 0.1 1 4 6857 6858 6834 6833 0.1 0.3 0.1 1 4 6856 6857 6833 6832 0.1 0.3 0.1 1 4 6855 6856 6832 6831 0.1 0.3 0.1 1 4 6832 6786 6784 6831 0.1 0.3 0.1 1 4 6786 6832 6831 6784 0.1 0.3 0.1 1 4 6784 6785 6783 6782 0.1 0.3 0.1 1 4 6831 6784 6782 6830 0.1 0.3 0.1 1 4 6784 6831 6830 6782 0.1 0.3 0.1 1 4 6782 6783 6829 6828 0.1 0.3 0.1 1 4 6828 6829 6827 6826 0.1 0.3 0.1 1 4 6855 6831 6830 6854 0.1 0.3 0.1 1 4 6854 6830 6853 6877 0.1 0.3 0.1 1 4 6876 6877 6853 6852 0.1 0.3 0.1 1 4 6828 6853 6830 6782 0.1 0.3 0.1 1 4 6853 6828 6826 6852 0.1 0.3 0.1 1 4 6853 6828 6782 6830 0.1 0.3 0.1 1 4 6828 6853 6852 6826 0.1 0.3 0.1 1 4 6824 6826 6827 6825 0.1 0.3 0.1 1 4 6824 6825 6823 6822 0.1 0.3 0.1 1 4 6850 6851 6824 6822 0.1 0.3 0.1 1 4 6822 6824 6851 6850 0.1 0.3 0.1 1 4 6875 6876 6852 6851 0.1 0.3 0.1 1 4 6874 6875 6851 6850 0.1 0.3 0.1 1 4 6824 6851 6852 6826 0.1 0.3 0.1 1 4 6851 6824 6826 6852 0.1 0.3 0.1 1 4 6820 6822 6823 6821 0.1 0.3 0.1 1 4 6820 6821 6819 6818 0.1 0.3 0.1 1 4 6849 6850 6822 6820 0.1 0.3 0.1 1 4 6848 6849 6820 6818 0.1 0.3 0.1 1 4 6820 6822 6850 6849 0.1 0.3 0.1 1 4 6818 6820 6849 6848 0.1 0.3 0.1 1 4 6873 6874 6850 6849 0.1 0.3 0.1 1 4 6872 6873 6849 6848 0.1 0.3 0.1 1 4 6816 6818 6819 6817 0.1 0.3 0.1 1 4 6847 6848 6818 6816 0.1 0.3 0.1 1 4 6816 6818 6848 6847 0.1 0.3 0.1 1 4 6871 6872 6848 6847 0.1 0.3 0.1 1 4 6816 6817 6815 6814 0.1 0.3 0.1 1 4 6846 6847 6816 6814 0.1 0.3 0.1 1 4 6814 6816 6847 6846 0.1 0.3 0.1 1 4 6870 6871 6847 6846 0.1 0.3 0.1 1 4 6812 6814 6815 6813 0.1 0.3 0.1 1 4 6845 6846 6814 6812 0.1 0.3 0.1 1 4 6812 6814 6846 6845 0.1 0.3 0.1 1 4 6869 6870 6846 6845 0.1 0.3 0.1 1 4 6844 6868 6869 6845 0.1 0.3 0.1 1 4 6810 6844 6845 6812 0.1 0.3 0.1 1 4 6844 6810 6812 6845 0.1 0.3 0.1 1 4 6810 6812 6813 6811 0.1 0.3 0.1 1 geomview-1.9.4/data/geom/alphabet.vect0000644000175000001440000000757707730233055014613 00000000000000# alphabet.vect # # A list of handles defining the uppercase letters and numerals # of the Roman alphabet in a fixed-size 32-by-64 font # (40-unit spacing is recommended). # # Read it into Geomview like this: # # (read geometry { < alphabet.vect }) # # Then you can write out uppercase strings like this: # # (geometry HI { LIST # { INST geom { : H } transform { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 } } # { INST geom { : I } transform { 1 0 0 0 0 1 0 0 0 0 1 0 40 0 0 1 } } # }) # { LIST { define A { VECT 2 5 0 3 2 0 0 0 0 0 16 64 0 32 0 0 8 32 0 24 32 0 } } { define B { VECT 2 12 0 7 5 0 0 0 0 0 0 64 0 16 64 0 28 56 0 28 44 0 20 36 0 0 36 0 20 36 0 32 24 0 32 8 0 24 0 0 0 0 0 } } { define C { VECT 1 8 0 8 0 32 56 0 24 64 0 8 64 0 0 56 0 0 8 0 8 0 0 24 0 0 32 8 0 } } { define D { VECT 1 7 0 7 0 0 0 0 0 64 0 20 64 0 32 52 0 32 8 0 24 0 0 0 0 0 } } { define E { VECT 2 6 0 4 2 0 0 32 64 0 0 64 0 0 0 0 32 0 0 0 36 0 24 36 0 } } { define F { VECT 2 5 0 3 2 0 0 0 0 0 0 64 0 32 64 0 0 36 0 24 36 0 } } { define G { VECT 1 10 0 10 0 32 56 0 24 64 0 8 64 0 0 56 0 0 8 0 8 0 0 24 0 0 32 8 0 32 36 0 16 36 0 } } { define H { VECT 3 6 0 2 2 2 0 0 0 0 0 0 0 64 0 32 0 0 32 64 0 0 36 0 32 36 0 } } { define I { VECT 3 6 0 2 2 2 0 0 0 4 64 0 28 64 0 16 64 0 16 0 0 4 0 0 28 0 0 } } { define J { VECT 2 8 0 2 6 0 0 12 64 0 36 64 0 28 64 0 28 8 0 20 0 0 8 0 0 0 8 0 0 20 0 } } { define K { VECT 2 5 0 2 3 0 0 0 0 0 0 64 0 24 64 0 0 36 0 32 0 0 } } { define L { VECT 1 3 0 3 0 0 64 0 0 0 0 32 0 0 } } { define M { VECT 1 5 0 5 0 0 0 0 0 64 0 16 36 0 32 64 0 32 0 0 } } { define N { VECT 1 4 0 4 0 0 0 0 0 64 0 32 0 0 32 64 0 } } { define O { VECT 1 9 0 9 0 24 0 0 8 0 0 0 8 0 0 52 0 8 64 0 24 64 0 32 52 0 32 8 0 24 0 0 } } { define P { VECT 1 7 0 7 0 0 0 0 0 64 0 16 64 0 28 56 0 28 44 0 20 36 0 0 36 0 } } { define Q { VECT 2 11 0 9 2 0 0 24 0 0 8 0 0 0 8 0 0 52 0 8 64 0 24 64 0 32 52 0 32 8 0 24 0 0 20 16 0 36 0 0 } } { define R { VECT 2 9 0 7 2 0 0 0 0 0 0 64 0 16 64 0 28 56 0 28 44 0 16 36 0 0 36 0 16 36 0 32 0 0 } } { define S { VECT 1 12 0 12 0 32 56 0 24 64 0 8 64 0 0 56 0 0 44 0 8 36 0 20 36 0 32 24 0 32 8 0 24 0 0 8 0 0 0 8 0 } } { define T { VECT 2 4 0 2 2 0 0 0 64 0 32 64 0 16 0 0 16 64 0 } } { define U { VECT 1 6 0 6 0 0 64 0 0 8 0 8 0 0 24 0 0 32 8 0 32 64 0 } } { define V { VECT 1 3 0 3 0 0 64 0 16 0 0 32 64 0 } } { define W { VECT 1 5 0 5 0 0 64 0 4 0 0 16 28 0 28 0 0 32 64 0 } } { define X { VECT 2 4 0 2 2 0 0 0 64 0 32 0 0 0 0 0 32 64 0 } } { define Y { VECT 2 5 0 2 3 0 0 0 64 0 16 36 0 32 64 0 16 36 0 16 0 0 } } { define Z { VECT 1 4 0 4 0 0 64 0 32 64 0 0 0 0 32 0 0 } } { define 0 { VECT 2 11 0 2 9 0 0 0 20 0 28 56 0 24 0 0 8 0 0 0 8 0 0 48 0 8 64 0 24 64 0 32 52 0 32 12 0 24 0 0 } } { define 1 { VECT 2 5 0 2 3 0 0 4 0 0 28 0 0 4 44 0 16 64 0 16 0 0 } } { define 2 { VECT 1 7 0 7 0 0 56 0 8 64 0 24 64 0 32 56 0 32 40 0 0 0 0 32 0 0 } } { define 3 { VECT 2 13 0 2 11 0 0 8 36 0 24 36 0 0 56 0 8 64 0 24 64 0 32 56 0 32 44 0 24 36 0 32 24 0 32 8 0 24 0 0 8 0 0 0 8 0 } } { define 4 { VECT 2 5 0 2 3 0 0 28 64 0 28 0 0 12 64 0 0 36 0 36 36 0 } } { define 5 { VECT 1 9 0 9 0 28 64 0 4 64 0 0 36 0 24 36 0 32 24 0 32 8 0 24 0 0 8 0 0 0 8 0 } } { define 6 { VECT 1 12 0 12 0 32 56 0 24 64 0 8 64 0 0 56 0 0 8 0 8 0 0 24 0 0 32 8 0 32 28 0 24 36 0 8 36 0 0 28 0 } } { define 7 { VECT 1 4 0 4 0 0 56 0 4 64 0 32 64 0 8 0 0 } } { define 8 { VECT 1 16 0 16 0 20 36 0 28 44 0 28 56 0 20 64 0 12 64 0 4 56 0 4 44 0 12 36 0 20 36 0 32 24 0 32 8 0 24 0 0 8 0 0 0 8 0 0 24 0 12 36 0 } } { define 9 { VECT 1 12 0 12 0 32 44 0 24 36 0 8 36 0 0 44 0 0 56 0 8 64 0 24 64 0 32 56 0 32 8 0 24 0 0 8 0 0 0 8 0 } } } geomview-1.9.4/data/geom/klein80000644000175000001440000032646107730233123013255 00000000000000# From Joe Christy: # <False] # OFF 2256 2304 4560 2.42139 0.318783 0.896873 2.85105 0.375348 0.766017 2.97221 0.391299 0.0654031 2.98053 0.392394 -0.193421 2.94276 0.387421 -0.645168 2.89582 0.381242 -0.80753 2.74729 0.361688 -0.951612 2.53371 0.333569 -0.83147 2.40734 0.316932 -0.680564 2.27137 0.299031 -0.482002 1.69441 0.223074 0.482002 1.55844 0.205173 0.680564 1.31799 0.173517 0.924043 1.21849 0.160417 0.951612 1.06996 0.140862 0.80753 0.994856 0.130975 0.435755 1.01881 0.134129 -0.323108 1.0597 0.139512 -0.562104 1.26064 0.165967 -1.01575 1.34818 0.177491 -1.04411 1.44326 0.190009 -1.00367 1.54438 0.203322 -0.896873 2.09524 0.275844 0.266802 2.11667 0.567161 0.529505 2.02422 0.542388 0.273642 2.20652 0.290494 0.515857 2.31564 0.304859 0.730622 2.52252 0.332096 1.00367 2.6176 0.344614 1.04411 2.70514 0.356138 1.01575 2.48294 0.665302 1.08374 2.78351 0.366456 0.920812 2.72747 0.730822 0.821648 2.79384 0.748608 0.621801 2.90608 0.382593 0.562104 2.94697 0.387975 0.323108 2.91395 0.780791 -0.127195 2.88951 0.774243 0.130526 2.97092 0.391129 -0.435755 2.8704 0.769121 -0.745577 2.83041 0.37263 -0.91197 2.64778 0.348588 -0.924043 2.7351 0.732868 -0.899149 2.24275 0.600944 -0.46194 2.08948 0.559875 -0.239568 2.1288 0.280262 -0.249728 1.77422 0.475401 0.239568 1.83697 0.241842 0.249728 1.62095 0.434333 0.46194 1.47622 0.395552 0.651107 1.43207 0.188536 0.83147 1.13537 0.149475 0.91197 0.993305 0.266155 0.745577 1.02302 0.134684 0.645168 0.957936 0.256678 0.580467 0.943782 0.252886 0.369644 0.985249 0.12971 0.193421 0.993568 0.130806 -0.0654031 0.974189 0.261033 -0.130526 1.01501 0.271972 -0.386014 1.06986 0.286668 -0.621801 1.11473 0.146757 -0.766017 1.18227 0.155649 -0.920812 1.21168 0.324668 -0.971655 1.38076 0.369974 -1.08374 1.65452 0.443328 -0.751008 1.65014 0.217246 -0.730622 1.75926 0.23161 -0.515857 1.87054 0.246261 -0.266802 1.98289 0.261052 -9.65804e-15 1.93185 0.517638 -9.90309e-15 1.91938 0.795034 0.27931 1.99216 0.825181 0.540886 2.20918 0.591949 0.751008 2.3015 0.616684 0.92388 2.14473 0.888376 0.94693 2.06707 0.856208 0.768178 2.39306 0.641218 1.03712 2.22528 0.92174 1.06613 2.39254 0.991022 1.10214 2.56983 0.688585 1.06122 2.4764 1.02576 1.01834 2.65202 0.710608 0.971655 2.63289 1.09058 0.678835 2.84869 0.763304 0.386014 2.75389 1.1407 0.19509 2.69948 1.11816 0.447267 2.91992 0.782391 -0.369644 2.81236 1.16492 -0.51328 2.90577 0.778598 -0.580467 2.8134 0.753848 -0.854109 2.66873 1.10542 -0.842836 2.63662 0.706481 -0.878203 2.51987 0.675197 -0.793353 2.38748 0.639724 -0.651107 2.1724 0.899838 -0.4399 2.01268 0.83368 -0.228382 1.68284 0.697054 0.228382 1.37355 0.568943 0.618862 1.34383 0.360079 0.793353 1.12205 0.464766 0.828602 1.22708 0.328795 0.878203 1.1286 0.302408 0.899149 0.954781 0.395483 0.79259 1.0503 0.281428 0.854109 0.949751 0.254485 0.127195 0.902734 0.373925 0.0604246 1.13624 0.304454 -0.821648 1.21912 0.504977 -1.01834 1.29387 0.346691 -1.06122 1.47065 0.394059 -1.03712 1.56221 0.418592 -0.92388 1.47024 0.608994 -1.06613 1.74703 0.468115 -0.529505 1.83948 0.492888 -0.273642 1.70336 0.705553 -0.540886 1.84776 0.765367 -1.01057e-14 1.83649 1.0603 0.54995 1.78323 1.02955 0.283783 1.89368 1.09332 0.782058 1.95619 1.12941 0.965926 2.30825 0.956108 1.11873 2.02478 1.16901 1.09057 2.55746 1.05934 0.87376 2.3464 1.35469 0.92213 2.42799 1.4018 0.732963 2.79278 1.15681 -0.0604246 2.61942 1.51232 0.00660481 2.56857 1.48296 0.258819 2.81313 1.16524 -0.30195 2.65061 1.53033 -0.612372 2.78858 1.15507 -0.680432 2.74074 1.13525 -0.79259 2.57347 1.06597 -0.828602 2.4578 1.41901 -0.775454 2.45692 1.01769 -0.75184 2.32197 0.961791 -0.618862 2.21067 1.27633 -0.583967 2.06063 1.1897 -0.415976 1.56485 0.903467 0.216217 1.52312 0.630895 0.4399 1.2386 0.513046 0.75184 1.00631 0.580991 0.775454 1.02679 0.42531 0.842836 0.906937 0.375666 0.680432 0.851891 0.49184 0.727678 0.883158 0.365816 0.51328 0.882387 0.365497 0.30195 0.844678 0.487675 -0.00660481 0.941632 0.390037 -0.19509 0.996033 0.41257 -0.447267 1.06263 0.440155 -0.678835 1.1177 0.645307 -0.92213 1.13806 0.471398 -0.87376 1.20172 0.693814 -1.06066 1.2849 0.74184 -1.13835 1.30298 0.539711 -1.10214 1.36469 0.787903 -1.14894 1.38727 0.574626 -1.11873 1.55079 0.642357 -0.94693 1.62845 0.674525 -0.768178 1.62762 0.939705 -0.54995 1.77614 0.735699 -0.27931 1.68088 0.970454 -0.283783 1.61876 1.24212 0.28704 1.65364 1.26888 0.55666 1.74148 1.33629 0.980785 2.09941 1.2121 1.14894 1.93639 1.48584 1.16968 2.1792 1.25816 1.13835 2.01646 1.54728 1.09844 2.26238 1.30619 1.06066 2.10045 1.61173 0.966552 2.5034 1.44534 0.506605 2.33796 1.79398 0.321439 2.65214 1.53121 -0.232963 2.39753 1.83969 0.073606 2.66338 1.53771 -0.443895 2.43987 1.87218 -0.162978 2.45816 1.88621 -0.541691 2.61221 1.50816 -0.727678 2.37294 1.82082 -0.719638 2.5477 1.47092 -0.782913 2.29036 1.75746 -0.718984 2.34442 1.35355 -0.707107 2.05452 1.57649 -0.546571 1.75077 1.34341 -0.203127 1.90865 1.46456 -0.39027 1.89925 1.09653 -0.216217 1.40347 0.810295 0.415976 1.42265 1.09163 0.203127 1.25344 0.723672 0.583967 1.11968 0.646447 0.707107 0.916401 0.529084 0.782913 0.800478 0.614228 0.719638 0.813492 0.46967 0.612372 0.800717 0.462294 0.443895 0.715255 0.548835 0.541691 0.811966 0.468789 0.232963 0.895535 0.517037 -0.258819 0.960704 0.554663 -0.506605 1.03611 0.598198 -0.732963 0.988562 0.758551 -0.783952 1.15695 0.887762 -1.09844 1.23703 0.949203 -1.16968 1.43932 0.830991 -1.09057 1.31051 1.00559 -1.17422 1.43193 1.09876 -0.980785 1.50791 0.87059 -0.965926 1.47954 1.13529 -0.79259 1.57042 0.906684 -0.782058 1.73205 1 -1.02651e-14 1.58671 1.21752 -1.03805e-14 1.42945 1.42945 0.289068 1.69387 1.29976 0.79259 1.448 1.448 0.560986 1.55053 1.55053 1.12536 1.79771 1.37943 1.11034 1.86291 1.42946 1.17422 1.74563 1.74563 1.13152 2.18485 1.6765 0.783952 1.90994 1.90994 0.831584 2.26553 1.7384 0.563773 2.18053 2.18053 -0.092296 2.46109 1.88846 -0.372609 2.42904 1.86387 -0.659649 2.19387 2.19387 -0.588796 2.14675 2.14675 -0.653281 2.18318 1.67521 -0.659346 1.85556 1.85556 -0.506835 1.71859 1.71859 -0.362894 1.26476 0.970485 0.39027 1.11889 0.858557 0.546571 0.972872 0.972872 0.506835 0.990232 0.759832 0.659346 0.853228 0.853228 0.608761 0.883049 0.677587 0.718984 0.681676 0.681676 0.653281 0.755143 0.755143 0.659436 0.634553 0.634553 0.588796 0.744374 0.571178 0.659649 0.61411 0.61411 0.46869 0.619318 0.619318 0.299728 0.712319 0.546582 0.372609 0.733547 0.562871 0.162978 0.775881 0.595354 -0.073606 0.835456 0.641068 -0.321439 0.696485 0.696485 -0.140292 0.907886 0.696646 -0.563773 1.07296 0.823315 -0.966552 1.002 1.002 -1.00683 1.0828 1.0828 -1.13152 1.3757 1.05561 -1.11034 1.22287 1.22287 -1.19448 1.32192 1.32192 -0.991445 1.51978 1.16617 -0.55666 1.35556 1.35556 -0.799728 1.55465 1.19293 -0.28704 1.41421 1.41421 -1.04515e-14 1.22421 1.59542 0.562909 1.47287 1.47287 0.799728 1.23607 1.61088 0.803441 1.50651 1.50651 0.991445 1.33434 1.73895 1.20962 1.60556 1.60556 1.19448 1.67112 1.67112 1.196 1.82643 1.82643 1.00683 1.53156 1.99596 1.04281 1.99187 1.99187 0.618527 1.61028 2.09855 0.875654 2.0675 2.0675 0.382683 2.13194 2.13194 0.140292 2.20911 2.20911 -0.299728 2.21432 2.21432 -0.46869 1.92353 2.5068 -0.393681 1.91075 2.49014 -0.515421 2.07328 2.07328 -0.659436 1.9752 1.9752 -0.608761 1.61685 2.10712 -0.464928 1.49346 1.94631 -0.333964 1.56952 1.56952 -0.189167 1.25891 1.25891 0.189167 1.10983 1.10983 0.362894 1.07657 1.40302 0.174397 0.562207 0.732683 0.584127 0.625076 0.814616 0.597064 0.647893 0.647893 0.092296 0.555521 0.723969 0.0212183 0.522714 0.681215 0.225563 0.760932 0.760932 -0.382683 0.671541 0.87517 -0.442289 0.836557 0.836557 -0.618527 0.918491 0.918491 -0.831584 0.824769 1.07486 -0.875654 0.977865 1.27438 -1.15975 0.903489 1.17745 -1.04281 1.15731 1.15731 -1.196 1.2779 1.2779 -1.12536 1.1007 1.43447 -1.20962 1.19897 1.56253 -0.803441 1.17771 1.53482 -0.997859 1.21084 1.57799 -0.562909 1.38043 1.38043 -0.560986 1.39898 1.39898 -0.289068 1.21594 1.58465 -0.289858 1.2191 1.58876 0.289858 0.991815 1.71787 0.289407 0.98893 1.71288 0.803714 0.987072 1.70966 0.562422 1.25734 1.63859 0.997859 1.28982 1.68093 1.13556 1 1.73205 1 1.10205 1.90881 1.23319 1.39061 1.81227 1.2172 1.45718 1.89904 1.15975 1.15849 2.00657 1.18301 1.29326 2.23999 0.915976 1.22327 2.11877 1.07431 1.68915 2.20134 0.670633 1.3646 2.36356 0.719866 1.7635 2.29824 0.442289 1.82852 2.38297 0.206377 1.87952 2.44944 -0.0212183 1.91233 2.4922 -0.225563 1.87284 2.44073 -0.584127 1.80997 2.3588 -0.597064 1.72369 2.24636 -0.55557 1.34248 2.32525 -0.421031 1.23707 2.14267 -0.303603 1.35847 1.7704 -0.174397 0.762928 1.32143 0.303603 0.941588 1.2271 0.333964 0.818197 1.0663 0.464928 0.711356 0.927057 0.55557 0.657517 1.13885 0.421031 0.443814 0.768708 0.512472 0.524293 0.683272 0.515421 0.511513 0.666617 0.393681 0.408494 0.707532 0.316987 0.456742 0.7911 -0.0499502 0.606526 0.79044 -0.206377 0.745899 0.972074 -0.670633 0.776725 1.34533 -1.07431 0.706742 1.22411 -0.915976 1.04444 1.36114 -1.2172 0.897949 1.55529 -1.23319 1.14522 1.49249 -1.13556 0.97788 1.69374 -1.1409 1.00819 1.74623 -0.289407 1.01293 1.75444 -0.562422 1.21752 1.58671 -1.04777e-14 1.02212 1.77036 1.1409 0.753705 1.81961 1.14135 1.05619 1.82937 1.21958 0.777753 1.87766 1.22432 0.812441 1.96141 1.2439 0.909 2.19452 1.10122 0.966411 2.33312 0.952374 1.02581 2.47652 0.766017 1.43301 2.48205 0.5 1.49401 2.58771 0.271579 1.13586 2.74221 0.335617 1.54326 2.673 0.0499502 1.57683 2.73115 -0.150433 1.59151 2.75657 -0.316987 1.20967 2.92041 -0.0746578 1.58501 2.74532 -0.43984 1.22317 2.95299 -0.362374 1.55619 2.69539 -0.512472 1.50508 2.60688 -0.532136 1.16443 2.81119 -0.464928 1.43301 2.48205 -0.5 1.12122 1.94202 -0.158881 0.878776 1.52208 0.158881 0.57671 1.3923 0.271943 0.566987 0.982051 0.5 0.493265 1.19085 0.37533 0.494917 0.857222 0.532136 0.366302 0.884332 0.464928 0.414986 0.718778 0.43984 0.423172 0.732955 0.150433 0.321062 0.775112 0.0746578 0.305683 0.737984 0.238936 0.351716 0.849116 -0.120905 0.505987 0.876395 -0.271579 0.566987 0.982051 -0.5 0.394872 0.953307 -0.335617 0.635397 1.10054 -0.719866 0.504926 1.219 -0.766017 0.564323 1.3624 -0.952374 0.841506 1.45753 -1.18301 0.621734 1.501 -1.10122 0.943814 1.63473 -1.21958 0.718293 1.73411 -1.2439 0.777028 1.87591 -1.14135 1 1.73205 -1 0.790396 1.90818 -0.997859 1.01107 1.75122 -0.803714 0.789317 1.90558 -0.559527 1 1.73205 -1.0459e-14 0.765367 1.84776 -1.03955e-14 0.751872 1.81518 0.287717 0.50366 1.87969 0.284794 0.741417 1.78994 0.559527 0.736797 1.77878 0.800545 0.740338 1.78733 0.997859 0.483855 1.80577 0.991445 0.856804 2.06851 1.20121 0.528351 1.97183 1.24928 0.680437 2.53943 0.808888 1.08356 2.61594 0.55557 1.17902 2.8464 0.120905 1.22505 2.95753 -0.238936 0.818754 3.05563 0.0014367 1.20297 2.90422 -0.438622 0.832732 3.1078 -0.283358 0.794828 2.96634 -0.39573 0.820391 3.06174 -0.362894 1.10859 2.67636 -0.442289 1.03747 2.50467 -0.37533 0.954024 2.30322 -0.271943 0.585219 2.18407 -0.125876 0.861926 2.08087 -0.142684 0.668808 1.61465 0.142684 0.422149 1.01916 0.442289 0.327649 1.2228 0.328023 0.240448 0.897363 0.39573 0.327765 0.791295 0.438622 0.307567 0.742532 0.362374 0.216522 0.808072 -0.0014367 0.273281 1.0199 -0.398218 0.447177 1.07958 -0.55557 0.398079 1.48565 -0.984695 0.354839 1.32428 -0.808888 0.439344 1.63966 -1.12341 0.67393 1.62701 -1.20121 0.476263 1.77744 -1.21427 0.75298 1.81786 -1.22432 0.544828 2.03333 -1.13691 0.551421 2.05793 -0.991445 0.793937 1.91673 -0.800545 0.550471 2.05439 -0.793948 0.778862 1.88034 -0.287717 0.531616 1.98402 -0.284794 0.492003 1.83618 0.554236 0.484805 1.80932 0.793948 0.235588 1.78947 0.980785 0.490448 1.83038 1.13691 0.237664 1.80523 1.12761 0.244382 1.85627 1.21807 0.505273 1.8857 1.22381 0.559013 2.08627 1.21427 0.595932 2.22405 1.12341 0.637197 2.37805 0.984695 0.290862 2.20932 1.14079 0.336073 2.55273 0.848295 0.722973 2.69817 0.608761 0.380622 2.89111 0.459115 0.359187 2.7283 0.659346 0.761996 2.84381 0.398218 0.794756 2.96607 0.191342 0.398874 3.02975 0.260959 0.412572 3.1338 0.0775251 0.420571 3.19456 -0.0801021 0.831914 3.10474 -0.159861 0.756756 2.82425 -0.382683 0.403922 3.0681 -0.324837 0.707627 2.6409 -0.328023 0.359462 2.73038 -0.27931 0.649562 2.4242 -0.239118 0.296136 2.24938 -0.108529 0.225969 1.7164 0.108529 0.450057 1.67964 0.125876 0.385714 1.4395 0.239118 0.162643 1.2354 0.27931 0.27852 1.03945 0.382683 0.137453 1.04406 0.321439 0.214885 0.801963 0.362894 0.202545 0.755907 0.283358 0.203363 0.75896 0.159861 0.123231 0.936029 -0.260959 0.24052 0.897634 -0.191342 0.312303 1.16553 -0.608761 0.162918 1.23748 -0.659346 0.186032 1.41305 -0.848295 0.506925 1.89187 -1.24928 0.530003 1.978 -1.22381 0.277723 2.10951 -1.21807 0.278684 2.11682 -0.546571 0.284353 2.15987 -0.783952 0.543273 2.02752 -0.554236 0.517638 1.93185 -1.02876e-14 0.270518 2.05479 -0.280652 0.251587 1.91099 0.280652 0.243421 1.84896 0.546571 0.237752 1.80591 0.783952 0.255779 1.94283 1.24932 0.271508 2.06231 1.22212 -3.21625e-16 2 1.22474 -3.46274e-16 2.15328 1.15328 -3.74606e-16 2.32946 1.03657 0.312812 2.37605 1.0128 -4.35336e-16 2.70711 0.707107 -4.04932e-16 2.51804 0.88407 -4.63794e-16 2.88407 0.518045 -5.07086e-16 3.15328 0.153281 -4.88317e-16 3.03657 0.329459 -5.18579e-16 3.22474 0 -5.21675e-16 3.244 -0.122027 0.422037 3.20569 -0.203127 0.416506 3.16368 -0.285612 -5.00685e-16 3.11347 -0.252553 0.384652 2.92172 -0.321439 -4.76957e-16 2.96593 -0.258819 0.329482 2.50267 -0.205269 -3.65898e-16 2.27531 -0.0907167 0.192622 1.46311 0.205269 -1.97703e-16 1.2294 0.229402 -2.35338e-16 1.46343 0.170541 -1.66292e-16 1.03407 0.258819 0.118182 0.897684 0.324837 0.105599 0.802102 0.285612 0.100067 0.760087 0.203127 0.101533 0.771223 0.0801021 -1.36163e-16 0.846719 -0.153281 0.109533 0.831984 -0.0775251 -1.79455e-16 1.11593 -0.518045 0.141483 1.07467 -0.459115 -2.07913e-16 1.29289 -0.707107 0.209292 1.58973 -1.0128 -2.38317e-16 1.48196 -0.88407 0.231243 1.75646 -1.14079 0.250597 1.90347 -1.22212 -3.21625e-16 2 -1.22474 0.266326 2.02295 -1.24932 0.284441 2.16054 -1.12761 -3.62238e-16 2.25255 -1.11347 0.286517 2.17631 -0.980785 -3.58515e-16 2.2294 -0.770598 -3.36213e-16 2.09072 -0.275309 -3.4905e-16 2.17054 -0.536566 0.261052 1.98289 -1.01356e-14 -3.07036e-16 1.90928 0.275309 -2.942e-16 1.82946 0.536566 -0.234259 1.77938 0.524263 -0.246887 1.87529 0.268786 -2.84734e-16 1.7706 0.770598 -0.219096 1.6642 0.94693 -0.224595 1.70597 0.753945 -2.80003e-16 1.74118 0.965926 -2.81011e-16 1.74745 1.11347 -0.218653 1.66083 1.09457 -2.88319e-16 1.79289 1.20711 -3.02001e-16 1.87797 1.244 -0.295114 2.24162 1.05589 -0.347114 2.63659 0.75184 -0.371777 2.82393 0.574756 -0.393249 2.98702 0.396549 -0.420042 3.19054 -0.127715 -5.15742e-16 3.20711 -0.207107 -0.389071 2.95528 -0.19509 -4.45546e-16 2.7706 -0.229402 -4.07911e-16 2.53657 -0.170541 -0.22442 1.70464 0.0725165 -2.77352e-16 1.72469 0.0907167 -0.133034 1.0105 0.19509 -0.158726 1.20564 0.178511 -0.11387 0.864931 0.179188 -1.42565e-16 0.886528 0.252553 -1.27507e-16 0.792893 0.207107 -1.21574e-16 0.756002 0.122027 -1.24671e-16 0.775255 2.44249e-15 -1.54932e-16 0.963434 -0.329459 -0.11215 0.851862 -0.228382 -0.150328 1.14185 -0.574756 -0.17499 1.32918 -0.75184 -2.68643e-16 1.67054 -1.03657 -2.96975e-16 1.84672 -1.15328 -0.287566 2.18428 -1.23335 -3.41248e-16 2.12203 -1.244 -3.5493e-16 2.20711 -1.20711 -0.303452 2.30495 -1.09457 -3.63246e-16 2.25882 -0.965926 -0.303009 2.30158 -0.94693 -0.287845 2.1864 -0.524263 -3.21625e-16 2 -9.94013e-15 -0.261052 1.98289 -9.70214e-15 -0.275218 2.09049 -0.268786 -0.485059 1.81027 0.261112 -0.43274 1.61501 0.734063 -0.418592 1.56221 0.92388 -0.223773 1.69972 1.19098 -0.234539 1.7815 1.23335 -0.250597 1.90347 1.22212 -0.271171 2.05975 1.16084 -0.51801 1.93324 1.16342 -0.476263 1.77744 1.21427 -0.320979 2.43808 0.916059 -0.620705 2.3165 0.944125 -0.675197 2.51987 0.793353 -0.409955 3.11392 0.228382 -0.420571 3.19456 0.0801021 -0.831914 3.10474 0.159861 -0.424121 3.22152 -0.0404045 -0.408234 3.10085 -0.179188 -0.811892 3.03002 -0.105055 -0.363379 2.76013 -0.178511 -0.332394 2.52478 -0.135082 -0.723127 2.69875 -0.126856 -0.297685 2.26114 -0.0725165 -0.591348 2.20694 -0.0540057 -0.189711 1.44099 0.135082 -0.312149 1.16496 0.126856 -0.102063 0.775243 0.127715 -0.200892 0.749739 0.0477759 -0.097984 0.744262 0.0404045 -0.1943 0.725137 -0.0413911 -0.101533 0.771223 -0.0801021 -0.128856 0.978755 -0.396549 -0.201126 1.5277 -0.916059 -0.414572 1.5472 -0.944125 -0.468115 1.74703 -1.0707 -0.22699 1.72416 -1.05589 -0.250933 1.90603 -1.16084 -0.271508 2.06231 -1.22212 -0.517266 1.93046 -1.16342 -0.559013 2.08627 -1.21427 -0.590976 2.20555 -1.21743 -0.298332 2.26606 -1.19098 -0.602537 2.2487 -0.734063 -0.29751 2.25981 -0.753945 -0.579526 2.16282 -0.509716 -0.517638 1.93185 -9.42261e-15 -0.550217 2.05344 -0.261112 -0.45575 1.70088 0.509716 -0.661299 1.59652 0.492985 -0.59611 1.43914 0.896873 -0.415216 1.54961 1.07098 -0.597513 1.44253 1.14351 -0.587447 1.41822 1.04281 -0.423714 1.58132 1.16975 -0.4443 1.65815 1.21743 -0.67393 1.62701 1.20121 -0.567161 2.11667 1.0707 -0.811635 1.95946 1.08092 -0.977974 2.36104 0.83147 -0.893802 2.15783 0.968148 -0.726994 2.71318 0.629007 -1.05851 2.55547 0.680564 -0.772496 2.88299 0.46194 -0.808397 3.01698 0.302504 -1.22505 2.95753 0.238936 -0.840976 3.13857 0.0413911 -0.834384 3.11396 -0.0477759 -1.20214 2.90223 -0.030473 -0.774243 2.88951 -0.130526 -1.07172 2.58737 -0.0746578 -0.661085 2.4672 -0.0990458 -0.875471 2.11357 -0.0352636 -0.443928 1.65676 0.0540057 -0.655262 1.58194 0.0352636 -0.374191 1.3965 0.0990458 -0.261033 0.974189 0.130526 -0.223384 0.83368 0.105055 -0.296841 0.716638 -0.0323676 -0.203363 0.75896 -0.159861 -0.226879 0.846723 -0.302504 -0.343949 0.830367 -0.37533 -0.26278 0.980709 -0.46194 -0.400909 0.96788 -0.525353 -0.308282 1.15053 -0.629007 -0.360079 1.34383 -0.793353 -0.636932 1.53769 -0.968148 -0.793937 1.91673 -1.16103 -0.856804 2.06851 -1.20121 -0.611562 2.28238 -1.16975 -0.620061 2.3141 -1.07098 -0.93322 2.25299 -1.14351 -0.616684 2.3015 -0.92388 -0.934623 2.25638 -0.896873 -0.81997 1.97958 -0.252321 -0.710764 1.71594 0.252321 -0.621734 1.501 0.711037 -0.848198 1.46912 0.474144 -0.789485 1.36743 0.684967 -0.75 1.29904 0.866025 -0.626692 1.51297 1.19629 -0.841506 1.45753 1.18301 -0.736797 1.77878 1.16103 -1.02498 1.77531 1.08652 -1.13579 1.96724 0.988026 -1.35993 2.35547 0.729207 -1.25 2.16506 0.866025 -1.12982 2.72764 0.525353 -1.18678 2.86515 0.37533 -1.24139 2.99697 0.12301 -1.59151 2.75657 0.316987 -1.23389 2.97888 0.0323676 -1.60979 2.78824 0.112372 -1.57045 2.7201 0.0442399 -1.5 2.59808 1.66533e-16 -1.14723 2.76966 -0.0654031 -0.979489 2.36469 -0.0625849 -1.28121 2.21912 -0.0258561 -0.551245 1.33082 0.0625849 -0.459011 1.10815 0.0746578 -0.598143 1.03601 0.0221398 -0.718789 1.24498 0.0258561 -0.383503 0.925858 0.0654031 -0.328592 0.793291 0.030473 -0.5 0.866025 3.33067e-16 -0.289346 0.698544 -0.12301 -0.305683 0.737984 -0.238936 -0.408494 0.707532 -0.316987 -0.472225 1.14005 -0.680564 -0.640067 1.10863 -0.729207 -0.552759 1.33448 -0.83147 -0.864211 1.49686 -0.988026 -0.719099 1.73606 -1.08092 -1.15849 2.00657 -1.18301 -0.904042 2.18255 -1.19629 -0.943287 2.2773 -1.04281 -1.25 2.16506 -0.866025 -1.26607 2.19289 -1.01017 -0.909 2.19452 -0.711037 -0.869435 2.099 -0.492985 -0.765367 1.84776 -9.10272e-15 -1.07944 1.86965 -0.242449 -0.92056 1.59446 0.242449 -1.01422 1.32176 0.453272 -0.934492 1.21785 0.655964 -0.733932 1.27121 1.01017 -0.879313 1.14594 0.83147 -0.854053 1.11302 0.9732 -0.743764 1.28824 1.11237 -0.903754 1.1778 1.13876 -0.78008 1.35114 1.17003 -0.924784 1.60177 1.15366 -1.20461 1.56987 1.08746 -1.08021 1.40776 1.14135 -1.48677 1.9376 0.896873 -1.62578 2.11876 0.774727 -1.45799 2.52531 0.586516 -1.85234 2.41402 0.515857 -1.53716 2.66243 0.44655 -1.6166 2.80003 0.204101 -1.92353 2.5068 0.393681 -1.90881 2.48761 0.118763 -1.82498 2.37836 0.0654031 -1.40186 2.42809 -0.0221398 -1.39398 1.81667 0.00259265 -1.1447 1.98268 -0.0163705 -0.855297 1.48142 0.0163705 -0.728419 0.949294 -0.030473 -0.874846 1.14012 -0.0109834 -0.429551 0.744005 -0.0442399 -0.390211 0.675865 -0.112372 -0.526237 0.685806 -0.118763 -0.383404 0.664074 -0.204101 -0.476536 0.621034 -0.284319 -0.462844 0.801669 -0.44655 -0.582703 0.759393 -0.515857 -0.542012 0.938793 -0.586516 -0.75 1.29904 -0.866025 -0.948275 1.23582 -0.896873 -0.975025 1.68879 -1.08652 -1.09189 1.42298 -1.00367 -1.07522 1.86233 -1.15366 -1.35484 1.76566 -1.14135 -1.21992 2.11296 -1.17003 -1.25624 2.17586 -1.11237 -1.21052 2.09667 -0.684967 -1.55573 2.02747 -0.83147 -1.1518 1.99498 -0.474144 -1.42083 1.85166 -0.453272 -1 1.73205 -8.74386e-15 -1.11136 1.44835 0.231538 -0.983754 0.983754 0.793353 -0.861929 1.12329 1.07647 -0.952274 0.952274 1.03596 -0.947922 0.947922 0.932066 -0.977865 1.27438 1.15975 -1.0828 1.0828 1.13152 -1.20227 1.20227 1.12415 -1.34316 1.75044 1.00367 -1.51341 1.51341 1.01502 -1.75059 2.28141 0.645168 -2.12615 2.12615 0.582955 -2.00223 2.00223 0.701057 -1.95851 2.55238 0.284319 -2.25991 2.25991 0.363319 -1.95389 2.54636 0.191896 -2.25884 2.25884 0.270598 -2.11527 2.11527 0.130526 -2.20996 2.20996 0.192778 -1.70663 2.22412 0.030473 -1.5602 2.03329 0.0109834 -1.04107 1.35675 -0.00259265 -0.610065 0.795052 -0.0654031 -0.481154 0.627052 -0.191896 -0.56959 0.56959 -0.270598 -0.511513 0.666617 -0.393681 -0.684458 0.892003 -0.645168 -0.702274 0.702274 -0.582955 -0.826195 0.826195 -0.701057 -0.809268 1.05466 -0.774727 -1.23044 1.60354 -1.08746 -1.31501 1.31501 -1.01502 -1.62615 1.62615 -1.12415 -1.45718 1.89904 -1.15975 -1.53129 1.99562 -1.13876 -1.87615 1.87615 -1.03596 -1.83056 1.83056 -1.10261 -1.57312 2.05013 -1.07647 -1.88051 1.88051 -0.932066 -1.58099 2.06039 -0.9732 -1.84467 1.84467 -0.793353 -1.50055 1.95556 -0.655964 -1.54798 1.54798 -0.219636 -1.32369 1.72507 -0.231538 -1.21752 1.58671 -8.34756e-15 -1.28045 1.28045 0.219636 -1.27708 0.979941 0.405803 -1.15761 1.15761 0.430459 -1.05583 1.05583 0.624151 -1.0163 0.779833 0.886941 -0.997872 0.997872 1.10261 -1.06337 0.815954 1.06174 -1.15695 0.887762 1.09844 -1.34895 1.34895 1.08374 -1.6451 1.26233 1.02202 -1.45741 1.11831 1.07538 -1.68481 1.68481 0.92388 -1.85158 1.85158 0.81693 -2.20866 1.69476 0.753945 -2.03398 1.56073 0.855634 -2.21432 2.21432 0.46869 -2.51468 1.92958 0.440764 -2.4676 1.89346 0.265968 -1.97971 1.97971 0.0829553 -2.21551 1.70002 0.135082 -1.81089 1.81089 0.0477759 -1.61862 1.61862 0.0215447 -1.81443 1.39226 0.0404045 -2.02833 1.5564 0.0843638 -1.20981 1.20981 -0.0215447 -1.01754 1.01754 -0.0477759 -0.84872 0.84872 -0.0829553 -0.713156 0.713156 -0.130526 -0.957903 0.735024 -0.135082 -0.618462 0.618462 -0.192778 -0.705811 0.541588 -0.265968 -0.568512 0.568512 -0.363319 -0.715255 0.548835 -0.541691 -0.658738 0.505467 -0.440764 -0.61411 0.61411 -0.46869 -0.976849 0.976849 -0.81693 -1.14362 1.14362 -0.92388 -1.13944 0.87432 -0.855634 -1.33169 1.02184 -0.94693 -1.47948 1.47948 -1.08374 -1.88232 1.44435 -1.10214 -1.74563 1.74563 -1.13152 -2.11004 1.61909 -1.06174 -2.15712 1.65521 -0.886941 -1.7726 1.7726 -0.624151 -1.89633 1.4551 -0.405803 -1.67082 1.67082 -0.430459 -1.41421 1.41421 -7.91551e-15 -1.42555 1.09387 0.206794 -1.37181 0.792012 0.37941 -1.5448 0.891891 0.193066 -1.15308 0.884791 0.589666 -1.06361 0.816139 0.75184 -1.06049 0.612273 0.838018 -1.01578 0.779435 0.99102 -1.05403 0.608543 0.941832 -1.10186 0.636161 1.01632 -1.20172 0.693814 1.06066 -1.2911 0.990693 1.10214 -1.34763 0.778052 1.07541 -1.5303 0.883519 1.06242 -1.95619 1.12941 0.965926 -1.73777 1.0033 1.02465 -1.84172 1.4132 0.94693 -2.35352 1.80592 0.647557 -2.45816 1.88621 0.541691 -2.65061 1.53033 0.612372 -2.71789 1.56917 0.51632 -2.51828 1.93234 0.348141 -2.72706 1.57447 0.424194 -2.36482 1.81459 0.19509 -2.67651 1.54529 0.338018 -2.40933 1.39103 0.186631 -2.56857 1.48296 0.258819 -2.20832 1.27498 0.12059 -1.35898 1.04278 -0.0404045 -1.14508 0.87865 -0.0843638 -1.25578 0.725025 -0.12059 -0.808597 0.620459 -0.19509 -0.655134 0.502702 -0.348141 -0.746213 0.430826 -0.51632 -0.737041 0.425531 -0.424194 -0.819889 0.629123 -0.647557 -0.813492 0.46967 -0.612372 -0.964756 0.740283 -0.753945 -1.09729 0.633519 -0.803603 -1.50791 0.87059 -0.965926 -1.29332 0.746698 -0.890675 -1.52831 1.17271 -1.02202 -1.71601 1.31674 -1.07538 -2.11648 1.22195 -1.07541 -2.26238 1.30619 -1.06066 -2.01646 1.54728 -1.09844 -2.36224 1.36384 -1.01632 -2.15763 1.65561 -0.99102 -2.40361 1.38773 -0.838018 -2.41007 1.39146 -0.941832 -2.1098 1.61891 -0.75184 -2.23778 1.29198 -0.552657 -2.02033 1.55025 -0.589666 -1.74786 1.34118 -0.206794 -2.0923 1.20799 -0.37941 -1.58671 1.21752 -7.44956e-15 -1.63676 0.677969 0.178511 -1.22632 0.708017 0.552657 -1.11968 0.646447 0.707107 -1.08223 0.448274 0.785507 -1.06908 0.442828 0.88861 -1.21912 0.504977 1.01834 -1.56879 0.649816 1.04491 -1.79193 0.742243 1.02289 -2.17078 1.2533 0.890675 -2.36682 1.36648 0.803603 -2.26098 0.936529 0.921901 -2.65501 1.09974 0.768178 -2.53064 1.46107 0.709386 -1.97781 1.14189 0.0590913 -2.34747 0.972355 0.156301 -1.48629 0.858109 -0.0590913 -1.05477 0.608971 -0.186631 -0.97291 0.402992 -0.321439 -1.13806 0.471398 -0.237381 -0.895535 0.517037 -0.258819 -0.787588 0.454714 -0.338018 -0.814183 0.337246 -0.49843 -0.933463 0.538935 -0.709386 -1.2206 0.505588 -0.849821 -1.90358 0.78849 -1.02289 -1.72633 0.996698 -1.02465 -1.9338 1.11648 -1.06242 -2.58002 1.06868 -0.966552 -2.34442 1.35355 -0.707107 -2.41951 1.0022 -0.51328 -1.9193 1.10811 -0.193066 -1.73205 1 -6.95172e-15 -2.05876 0.852765 -0.178511 -1.44134 0.597025 0.351391 -1.27601 0.528539 0.51328 -1.15315 0.47765 0.659346 -1.16553 0.312303 0.608761 -1.1155 0.462056 0.966552 -1.37355 0.568943 1.04408 -2.028 0.840025 0.980785 -2.47492 1.02515 0.849821 -2.30471 0.617546 0.94918 -2.78858 1.15507 0.680432 -2.866 1.18714 0.589666 -2.88134 1.19349 0.49843 -2.83273 1.17336 0.408621 -2.72261 1.12774 0.321439 -2.82425 0.756756 0.382683 -2.55746 1.05934 0.237381 -2.44331 0.654684 0.191342 -2.10581 0.872254 0.0775251 -1.66753 0.446814 -0.0956269 -1.58971 0.658479 -0.0775251 -1.42039 0.380592 -0.191342 -1.34805 0.558379 -0.156301 -1.20643 0.323263 -0.287114 -0.862784 0.357377 -0.408621 -0.829513 0.343596 -0.589666 -0.906796 0.242975 -0.660487 -0.906937 0.375666 -0.680432 -1.04051 0.430993 -0.768178 -1.43454 0.594205 -0.921901 -1.66752 0.690709 -0.980785 -2.12672 0.880918 -1.04491 -2.32197 0.961791 -1.04408 -2.4764 1.02576 -1.01834 -2.49254 0.667874 -1.00827 -2.62644 1.08791 -0.88861 -2.80036 0.750355 -0.831584 -2.61329 1.08246 -0.785507 -2.54237 1.05308 -0.659346 -2.69817 0.722973 -0.608761 -2.37805 0.637197 -0.321868 -2.25417 0.933709 -0.351391 -2.16326 0.579643 -0.163192 -1.84776 0.765367 -6.4241e-15 -1.7353 0.228456 0.147174 -1.70045 0.455633 0.163192 -1.48565 0.398079 0.321868 -1.50501 0.198139 0.290966 -1.30293 0.349119 0.471705 -1.15853 0.152524 0.55557 -1.08357 0.290342 0.729632 -1.06334 0.284921 0.831584 -1.10685 0.296578 0.912645 -1.07872 0.142016 0.854829 -1.21168 0.324668 0.971655 -1.18227 0.155649 0.920812 -1.37116 0.367402 1.00827 -1.5748 0.421967 1.02293 -1.34324 0.176841 0.968148 -1.80899 0.484718 1.01675 -2.05793 0.551421 0.991445 -2.04773 0.269589 0.997859 -2.53247 0.678572 0.892399 -2.7255 0.730296 0.82368 -2.74235 0.361038 0.875654 -2.8704 0.769121 0.745577 -2.95691 0.792301 0.660487 -2.89582 0.381242 0.80753 -2.97866 0.798131 0.570531 -3.01806 0.397336 0.64019 -2.93363 0.786065 0.477475 -2.87209 0.378118 0.442289 -2.65727 0.712013 0.287114 -2.49433 0.328385 0.225563 -2.70726 0.356418 0.335617 -2.19617 0.588462 0.0956269 -1.47145 0.19372 -0.225563 -1.03945 0.27852 -0.382683 -0.987804 0.130047 -0.544283 -1.09369 0.143987 -0.442289 -0.930069 0.249211 -0.477475 -0.947716 0.124769 -0.64019 -0.885038 0.237145 -0.570531 -1.06996 0.140862 -0.80753 -0.993305 0.266155 -0.745577 -1.1382 0.30498 -0.82368 -1.33124 0.356704 -0.892399 -1.22343 0.161067 -0.875654 -1.66255 0.218878 -0.972395 -1.42559 0.187683 -0.931156 -1.55899 0.41773 -0.94918 -1.80577 0.483855 -0.991445 -2.05471 0.550559 -1.01675 -2.41492 0.31793 -0.996559 -2.17466 0.286299 -1.00625 -2.2889 0.613309 -1.02293 -2.62254 0.345264 -0.968148 -2.78351 0.366456 -0.920812 -2.65202 0.710608 -0.971655 -2.75686 0.738698 -0.912645 -2.92636 0.385263 -0.770996 -2.78013 0.744934 -0.729632 -2.89903 0.381664 -0.670633 -2.80725 0.369581 -0.55557 -2.56077 0.686157 -0.471705 -2.46077 0.323966 -0.290966 -1.93185 0.517638 -5.86898e-15 -1.30815 0.172221 0.428111 -1.29289 1.30665e-15 0.382683 -1.5 1.51596e-15 0.258819 -1.06675 0.140441 0.670633 -1 1.01064e-15 0.707107 -1.03942 0.136842 0.770996 -1.03407 1.04508e-15 0.793353 -1.55086 0.204175 0.996559 -1.79112 0.235806 1.00625 -1.74118 1.75971e-15 0.991445 -2.25882 2.28286e-15 0.991445 -2.30323 0.303227 0.972395 -2.54018 0.334422 0.931156 -2.98995 0.393634 0.72848 -2.97798 0.392058 0.544283 -2.70711 2.73592e-15 0.382683 -2.5 2.52661e-15 0.258819 -2.24741 0.295877 0.113319 -1.71837 0.226228 -0.113319 -1.25852 0.165687 -0.335617 -1.5 1.51596e-15 -0.258819 -1.13397 1.14604e-15 -0.5 -1.03407 1.04508e-15 -0.793353 -0.975834 0.128471 -0.72848 -1.29289 1.30665e-15 -0.92388 -1.74118 1.75971e-15 -0.991445 -1.91805 0.252516 -0.997859 -2 2.02129e-15 -1 -2.5 2.52661e-15 -0.965926 -2.25882 2.28286e-15 -0.991445 -2.70711 2.73592e-15 -0.92388 -2.88706 0.380088 -0.854829 -2.96593 2.99749e-15 -0.608761 -2.65763 0.349884 -0.428111 -2.25882 2.28286e-15 -0.130526 -2.23048 0.293648 -0.147174 -1.98289 0.261052 -5.28872e-15 -2 2.02129e-15 -4.68582e-15 -1.74118 1.75971e-15 0.130526 -1.47145 -0.19372 0.225563 -1.13397 1.14604e-15 0.5 -1.09369 -0.143987 0.442289 -1.03407 1.04508e-15 0.608761 -0.987804 -0.130047 0.544283 -1.13397 1.14604e-15 0.866025 -1.06996 -0.140862 0.80753 -1.29289 1.30665e-15 0.92388 -1.22343 -0.161067 0.875654 -1.5 1.51596e-15 0.965926 -2 2.02129e-15 1 -1.91805 -0.252516 0.997859 -2.5 2.52661e-15 0.965926 -2.62254 -0.345264 0.968148 -2.41492 -0.31793 0.996559 -2.70711 2.73592e-15 0.92388 -2.86603 2.89653e-15 0.866025 -2.96593 2.99749e-15 0.793353 -2.88706 -0.380088 0.854829 -2.78351 -0.366456 0.920812 -3 3.03193e-15 0.707107 -2.92636 -0.385263 0.770996 -2.96593 2.99749e-15 0.608761 -2.86603 2.89653e-15 0.5 -2.65763 -0.349884 0.428111 -2.46077 -0.323966 0.290966 -2.25882 2.28286e-15 0.130526 -2.23048 -0.293648 0.147174 -1.74118 1.75971e-15 -0.130526 -1.30815 -0.172221 -0.428111 -1.50501 -0.198139 -0.290966 -1.29289 1.30665e-15 -0.382683 -1.15853 -0.152524 -0.55557 -1.03407 1.04508e-15 -0.608761 -1 1.01064e-15 -0.707107 -1.13397 1.14604e-15 -0.866025 -1.55086 -0.204175 -0.996559 -1.5 1.51596e-15 -0.965926 -2.30323 -0.303227 -0.972395 -2.86603 2.89653e-15 -0.866025 -2.89582 -0.381242 -0.80753 -2.96593 2.99749e-15 -0.793353 -3 3.03193e-15 -0.707107 -2.86603 2.89653e-15 -0.5 -2.70711 2.73592e-15 -0.382683 -2.87209 -0.378118 -0.442289 -2.49433 -0.328385 -0.225563 -2.5 2.52661e-15 -0.258819 -1.71837 -0.226228 0.113319 -1.20643 -0.323263 0.287114 -1.42039 -0.380592 0.191342 -1.25852 -0.165687 0.335617 -1.03945 -0.27852 0.382683 -0.885038 -0.237145 0.570531 -0.930069 -0.249211 0.477475 -0.947716 -0.124769 0.64019 -0.975834 -0.128471 0.72848 -0.906796 -0.242975 0.660487 -1.42559 -0.187683 0.931156 -1.66255 -0.218878 0.972395 -1.55899 -0.41773 0.94918 -1.80577 -0.483855 0.991445 -2.17466 -0.286299 1.00625 -2.49254 -0.667874 1.00827 -2.2889 -0.613309 1.02293 -2.65202 -0.710608 0.971655 -2.80036 -0.750355 0.831584 -2.89903 -0.381664 0.670633 -2.80725 -0.369581 0.55557 -2.37805 -0.637197 0.321868 -1.7353 -0.228456 -0.147174 -1.06675 -0.140441 -0.670633 -1.08357 -0.290342 -0.729632 -1.06334 -0.284921 -0.831584 -1.03942 -0.136842 -0.770996 -1.07872 -0.142016 -0.854829 -1.18227 -0.155649 -0.920812 -1.21168 -0.324668 -0.971655 -1.34324 -0.176841 -0.968148 -1.37116 -0.367402 -1.00827 -1.79112 -0.235806 -1.00625 -2.04773 -0.269589 -0.997859 -2.30471 -0.617546 -0.94918 -2.54018 -0.334422 -0.931156 -2.74235 -0.361038 -0.875654 -2.53247 -0.678572 -0.892399 -2.98995 -0.393634 -0.72848 -2.8704 -0.769121 -0.745577 -2.97866 -0.798131 -0.570531 -3.01806 -0.397336 -0.64019 -2.97798 -0.392058 -0.544283 -2.93363 -0.786065 -0.477475 -2.70726 -0.356418 -0.335617 -2.65727 -0.712013 -0.287114 -2.82425 -0.756756 -0.382683 -2.24741 -0.295877 -0.113319 -1.98289 -0.261052 -4.06285e-15 -1.66753 -0.446814 0.0956269 -1.34805 -0.558379 0.156301 -0.97291 -0.402992 0.321439 -0.993305 -0.266155 0.745577 -1.1382 -0.30498 0.82368 -1.33124 -0.356704 0.892399 -2.05471 -0.550559 1.01675 -2.32197 -0.961791 1.04408 -2.75686 -0.738698 0.912645 -2.58002 -1.06868 0.966552 -2.78013 -0.744934 0.729632 -2.61329 -1.08246 0.785507 -2.62644 -1.08791 0.88861 -2.69817 -0.722973 0.608761 -2.56077 -0.686157 0.471705 -2.54237 -1.05308 0.659346 -2.25417 -0.933709 0.351391 -2.41951 -1.0022 0.51328 -2.16326 -0.579643 0.163192 -1.70045 -0.455633 -0.163192 -1.48565 -0.398079 -0.321868 -1.30293 -0.349119 -0.471705 -1.44134 -0.597025 -0.351391 -1.16553 -0.312303 -0.608761 -1.08223 -0.448274 -0.785507 -1.10685 -0.296578 -0.912645 -1.37355 -0.568943 -1.04408 -1.5748 -0.421967 -1.02293 -1.80899 -0.484718 -1.01675 -2.05793 -0.551421 -0.991445 -2.7255 -0.730296 -0.82368 -2.95691 -0.792301 -0.660487 -2.83273 -1.17336 -0.408621 -2.55746 -1.05934 -0.237381 -2.72261 -1.12774 -0.321439 -2.44331 -0.654684 -0.191342 -2.19617 -0.588462 -0.0956269 -1.93185 -0.517638 -3.42249e-15 -1.84776 -0.765367 -2.76747e-15 -2.10581 -0.872254 -0.0775251 -1.58971 -0.658479 0.0775251 -1.13806 -0.471398 0.237381 -0.862784 -0.357377 0.408621 -0.814183 -0.337246 0.49843 -0.737041 -0.425531 0.424194 -0.787588 -0.454714 0.338018 -0.829513 -0.343596 0.589666 -0.906937 -0.375666 0.680432 -1.04051 -0.430993 0.768178 -0.813492 -0.46967 0.612372 -1.2206 -0.505588 0.849821 -1.43454 -0.594205 0.921901 -1.66752 -0.690709 0.980785 -1.72633 -0.996698 1.02465 -1.90358 -0.78849 1.02289 -2.12672 -0.880918 1.04491 -2.11648 -1.22195 1.07541 -2.4764 -1.02576 1.01834 -2.36224 -1.36384 1.01632 -2.41007 -1.39146 0.941832 -2.34442 -1.35355 0.707107 -2.0923 -1.20799 0.37941 -2.23778 -1.29198 0.552657 -2.05876 -0.852765 0.178511 -1.9193 -1.10811 0.193066 -1.63676 -0.677969 -0.178511 -1.27601 -0.528539 -0.51328 -1.15315 -0.47765 -0.659346 -1.11968 -0.646447 -0.707107 -1.06908 -0.442828 -0.88861 -1.05403 -0.608543 -0.941832 -1.06049 -0.612273 -0.838018 -1.1155 -0.462056 -0.966552 -1.10186 -0.636161 -1.01632 -1.21912 -0.504977 -1.01834 -1.20172 -0.693814 -1.06066 -1.56879 -0.649816 -1.04491 -1.79193 -0.742243 -1.02289 -1.95619 -1.12941 -0.965926 -1.73777 -1.0033 -1.02465 -2.028 -0.840025 -0.980785 -2.26098 -0.936529 -0.921901 -2.47492 -1.02515 -0.849821 -2.65501 -1.09974 -0.768178 -2.78858 -1.15507 -0.680432 -2.71789 -1.56917 -0.51632 -2.65061 -1.53033 -0.612372 -2.866 -1.18714 -0.589666 -2.72706 -1.57447 -0.424194 -2.88134 -1.19349 -0.49843 -2.20832 -1.27498 -0.12059 -2.34747 -0.972355 -0.156301 -1.97781 -1.14189 -0.0590913 -1.73205 -1 -2.1006e-15 -1.48629 -0.858109 0.0590913 -1.25578 -0.725025 0.12059 -1.05477 -0.608971 0.186631 -0.895535 -0.517037 0.258819 -0.808597 -0.620459 0.19509 -0.957903 -0.735024 0.135082 -0.705811 -0.541588 0.265968 -0.658738 -0.505467 0.440764 -0.746213 -0.430826 0.51632 -0.933463 -0.538935 0.709386 -0.819889 -0.629123 0.647557 -0.964756 -0.740283 0.753945 -1.09729 -0.633519 0.803603 -1.13944 -0.87432 0.855634 -1.29332 -0.746698 0.890675 -1.50791 -0.87059 0.965926 -1.9338 -1.11648 1.06242 -1.52831 -1.17271 1.02202 -1.88232 -1.44435 1.10214 -2.26238 -1.30619 1.06066 -2.11004 -1.61909 1.06174 -2.15763 -1.65561 0.99102 -2.40361 -1.38773 0.838018 -2.15712 -1.65521 0.886941 -1.5448 -0.891891 -0.193066 -1.37181 -0.792012 -0.37941 -1.27708 -0.979941 -0.405803 -1.42555 -1.09387 -0.206794 -1.22632 -0.708017 -0.552657 -1.15308 -0.884791 -0.589666 -1.01578 -0.779435 -0.99102 -1.15695 -0.887762 -1.09844 -1.06337 -0.815954 -1.06174 -1.34763 -0.778052 -1.07541 -1.2911 -0.990693 -1.10214 -1.5303 -0.883519 -1.06242 -1.6451 -1.26233 -1.02202 -2.17078 -1.2533 -0.890675 -2.36682 -1.36648 -0.803603 -2.20866 -1.69476 -0.753945 -2.03398 -1.56073 -0.855634 -2.35352 -1.80592 -0.647557 -2.53064 -1.46107 -0.709386 -2.51468 -1.92958 -0.440764 -2.45816 -1.88621 -0.541691 -2.51828 -1.93234 -0.348141 -2.67651 -1.54529 -0.338018 -2.4676 -1.89346 -0.265968 -2.56857 -1.48296 -0.258819 -2.36482 -1.81459 -0.19509 -2.40933 -1.39103 -0.186631 -1.35898 -1.04278 0.0404045 -1.14508 -0.87865 0.0843638 -0.84872 -0.84872 0.0829553 -1.01754 -1.01754 0.0477759 -0.618462 -0.618462 0.192778 -0.713156 -0.713156 0.130526 -0.655134 -0.502702 0.348141 -0.568512 -0.568512 0.363319 -0.56959 -0.56959 0.270598 -0.715255 -0.548835 0.541691 -0.702274 -0.702274 0.582955 -0.976849 -0.976849 0.81693 -1.33169 -1.02184 0.94693 -1.71601 -1.31674 1.07538 -1.62615 -1.62615 1.12415 -1.47948 -1.47948 1.08374 -2.01646 -1.54728 1.09844 -1.74563 -1.74563 1.13152 -1.83056 -1.83056 1.10261 -1.87615 -1.87615 1.03596 -1.84467 -1.84467 0.793353 -2.1098 -1.61891 0.75184 -2.02033 -1.55025 0.589666 -1.7726 -1.7726 0.624151 -1.89633 -1.4551 0.405803 -1.54798 -1.54798 0.219636 -1.74786 -1.34118 0.206794 -1.28045 -1.28045 -0.219636 -1.05583 -1.05583 -0.624151 -1.06361 -0.816139 -0.75184 -1.0163 -0.779833 -0.886941 -0.983754 -0.983754 -0.793353 -0.952274 -0.952274 -1.03596 -1.45741 -1.11831 -1.07538 -1.34895 -1.34895 -1.08374 -1.84172 -1.4132 -0.94693 -1.85158 -1.85158 -0.81693 -2.00223 -2.00223 -0.701057 -2.21432 -2.21432 -0.46869 -2.20996 -2.20996 -0.192778 -2.21551 -1.70002 -0.135082 -2.02833 -1.5564 -0.0843638 -1.97971 -1.97971 -0.0829553 -1.81443 -1.39226 -0.0404045 -1.58671 -1.21752 -1.42473e-15 -1.41421 -1.41421 -7.42762e-16 -1.61862 -1.61862 -0.0215447 -1.20981 -1.20981 0.0215447 -1.04107 -1.35675 0.00259265 -0.728419 -0.949294 0.030473 -0.610065 -0.795052 0.0654031 -0.526237 -0.685806 0.118763 -0.476536 -0.621034 0.284319 -0.481154 -0.627052 0.191896 -0.61411 -0.61411 0.46869 -0.826195 -0.826195 0.701057 -0.684458 -0.892003 0.645168 -0.809268 -1.05466 0.774727 -1.14362 -1.14362 0.92388 -1.31501 -1.31501 1.01502 -1.35484 -1.76566 1.14135 -1.53129 -1.99562 1.13876 -1.88051 -1.88051 0.932066 -1.67082 -1.67082 0.430459 -1.32369 -1.72507 0.231538 -1.15761 -1.15761 -0.430459 -1.01422 -1.32176 -0.453272 -0.934492 -1.21785 -0.655964 -0.947922 -0.947922 -0.932066 -0.854053 -1.11302 -0.9732 -0.903754 -1.1778 -1.13876 -0.997872 -0.997872 -1.10261 -1.0828 -1.0828 -1.13152 -1.20227 -1.20227 -1.12415 -1.08021 -1.40776 -1.14135 -1.20461 -1.56987 -1.08746 -1.51341 -1.51341 -1.01502 -1.68481 -1.68481 -0.92388 -1.48677 -1.9376 -0.896873 -2.12615 -2.12615 -0.582955 -1.85234 -2.41402 -0.515857 -2.25991 -2.25991 -0.363319 -1.95851 -2.55238 -0.284319 -2.25884 -2.25884 -0.270598 -1.95389 -2.54636 -0.191896 -1.90881 -2.48761 -0.118763 -2.11527 -2.11527 -0.130526 -1.5602 -2.03329 -0.0109834 -1.70663 -2.22412 -0.030473 -1.81089 -1.81089 -0.0477759 -1.21752 -1.58671 -5.76139e-17 -1 -1.73205 0 -0.874846 -1.14012 0.0109834 -0.511513 -0.666617 0.393681 -0.582703 -0.759393 0.515857 -0.462844 -0.801669 0.44655 -0.948275 -1.23582 0.896873 -1.09189 -1.42298 1.00367 -1.23044 -1.60354 1.08746 -1.07522 -1.86233 1.15366 -1.45718 -1.89904 1.15975 -1.57312 -2.05013 1.07647 -1.21992 -2.11296 1.17003 -1.58099 -2.06039 0.9732 -1.55573 -2.02747 0.83147 -1.25 -2.16506 0.866025 -1.26607 -2.19289 1.01017 -1.50055 -1.95556 0.655964 -1.1518 -1.99498 0.474144 -1.21052 -2.09667 0.684967 -1.42083 -1.85166 0.453272 -1.11136 -1.44835 -0.231538 -0.92056 -1.59446 -0.242449 -0.879313 -1.14594 -0.83147 -0.75 -1.29904 -0.866025 -0.733932 -1.27121 -1.01017 -0.861929 -1.12329 -1.07647 -0.977865 -1.27438 -1.15975 -0.841506 -1.45753 -1.18301 -0.924784 -1.60177 -1.15366 -1.02498 -1.77531 -1.08652 -1.34316 -1.75044 -1.00367 -1.25 -2.16506 -0.866025 -1.62578 -2.11876 -0.774727 -1.75059 -2.28141 -0.645168 -1.45799 -2.52531 -0.586516 -1.92353 -2.5068 -0.393681 -1.53716 -2.66243 -0.44655 -1.82498 -2.37836 -0.0654031 -1.5 -2.59808 -2.22045e-15 -1.39398 -1.81667 -0.00259265 -0.655262 -1.58194 -0.0352636 -0.855297 -1.48142 -0.0163705 -0.718789 -1.24498 -0.0258561 -0.459011 -1.10815 -0.0746578 -0.598143 -1.03601 -0.0221398 -0.5 -0.866025 1.16573e-15 -0.429551 -0.744005 0.0442399 -0.328592 -0.793291 -0.030473 -0.390211 -0.675865 0.112372 -0.383404 -0.664074 0.204101 -0.296841 -0.716638 0.0323676 -0.408494 -0.707532 0.316987 -0.542012 -0.938793 0.586516 -0.640067 -1.10863 0.729207 -0.400909 -0.96788 0.525353 -0.472225 -1.14005 0.680564 -0.75 -1.29904 0.866025 -0.864211 -1.49686 0.988026 -0.975025 -1.68879 1.08652 -0.719099 -1.73606 1.08092 -1.15849 -2.00657 1.18301 -0.904042 -2.18255 1.19629 -0.856804 -2.06851 1.20121 -1.25624 -2.17586 1.11237 -0.93322 -2.25299 1.14351 -0.943287 -2.2773 1.04281 -0.909 -2.19452 0.711037 -0.869435 -2.099 0.492985 -1.07944 -1.86965 0.242449 -0.710764 -1.71594 -0.252321 -0.848198 -1.46912 -0.474144 -0.789485 -1.36743 -0.684967 -0.661299 -1.59652 -0.492985 -0.621734 -1.501 -0.711037 -0.587447 -1.41822 -1.04281 -0.743764 -1.28824 -1.11237 -0.78008 -1.35114 -1.17003 -0.597513 -1.44253 -1.14351 -0.736797 -1.77878 -1.16103 -1.13579 -1.96724 -0.988026 -0.977974 -2.36104 -0.83147 -1.35993 -2.35547 -0.729207 -1.59151 -2.75657 -0.316987 -1.24139 -2.99697 -0.12301 -1.6166 -2.80003 -0.204101 -1.60979 -2.78824 -0.112372 -1.57045 -2.7201 -0.0442399 -1.23389 -2.97888 -0.0323676 -1.14723 -2.76966 0.0654031 -1.20214 -2.90223 0.030473 -1.40186 -2.42809 0.0221398 -1.28121 -2.21912 0.0258561 -1.1447 -1.98268 0.0163705 -0.765367 -1.84776 0 -0.443928 -1.65676 -0.0540057 -0.517638 -1.93185 0 -0.551245 -1.33082 -0.0625849 -0.374191 -1.3965 -0.0990458 -0.383503 -0.925858 -0.0654031 -0.261033 -0.974189 -0.130526 -0.200892 -0.749739 -0.0477759 -0.289346 -0.698544 0.12301 -0.305683 -0.737984 0.238936 -0.1943 -0.725137 0.0413911 -0.226879 -0.846723 0.302504 -0.343949 -0.830367 0.37533 -0.552759 -1.33448 0.83147 -0.636932 -1.53769 0.968148 -0.414572 -1.5472 0.944125 -0.793937 -1.91673 1.16103 -0.559013 -2.08627 1.21427 -0.611562 -2.28238 1.16975 -0.620061 -2.3141 1.07098 -0.934623 -2.25638 0.896873 -0.579526 -2.16282 0.509716 -0.81997 -1.97958 0.252321 -0.485059 -1.81027 -0.261112 -0.59611 -1.43914 -0.896873 -0.423714 -1.58132 -1.16975 -0.415216 -1.54961 -1.07098 -0.626692 -1.51297 -1.19629 -0.4443 -1.65815 -1.21743 -0.67393 -1.62701 -1.20121 -0.476263 -1.77744 -1.21427 -0.567161 -2.11667 -1.0707 -0.811635 -1.95946 -1.08092 -0.893802 -2.15783 -0.968148 -0.620705 -2.3165 -0.944125 -1.05851 -2.55547 -0.680564 -0.772496 -2.88299 -0.46194 -1.12982 -2.72764 -0.525353 -1.18678 -2.86515 -0.37533 -1.22505 -2.95753 -0.238936 -0.831914 -3.10474 -0.159861 -1.07172 -2.58737 0.0746578 -0.979489 -2.36469 0.0625849 -0.723127 -2.69875 0.126856 -0.875471 -2.11357 0.0352636 -0.312149 -1.16496 -0.126856 -0.158726 -1.20564 -0.178511 -0.223384 -0.83368 -0.105055 -0.203363 -0.75896 0.159861 -0.097984 -0.744262 -0.0404045 -0.26278 -0.980709 0.46194 -0.11215 -0.851862 0.228382 -0.308282 -1.15053 0.629007 -0.360079 -1.34383 0.793353 -0.201126 -1.5277 0.916059 -0.17499 -1.32918 0.75184 -0.468115 -1.74703 1.0707 -0.517266 -1.93046 1.16342 -0.271508 -2.06231 1.22212 -0.590976 -2.20555 1.21743 -0.298332 -2.26606 1.19098 -0.616684 -2.3015 0.92388 -0.303452 -2.30495 1.09457 -0.602537 -2.2487 0.734063 -0.287845 -2.1864 0.524263 -0.29751 -2.25981 0.753945 -0.550217 -2.05344 0.261112 -0.275218 -2.09049 0.268786 -0.234259 -1.77938 -0.524263 -0.45575 -1.70088 -0.509716 -0.43274 -1.61501 -0.734063 -0.219096 -1.6642 -0.94693 -0.418592 -1.56221 -0.92388 -0.218653 -1.66083 -1.09457 -0.250597 -1.90347 -1.22212 -0.51801 -1.93324 -1.16342 -0.271171 -2.05975 -1.16084 -0.675197 -2.51987 -0.793353 -0.371777 -2.82393 -0.574756 -0.347114 -2.63659 -0.75184 -0.726994 -2.71318 -0.629007 -0.393249 -2.98702 -0.396549 -0.808397 -3.01698 -0.302504 -0.420571 -3.19456 -0.0801021 -0.840976 -3.13857 -0.0413911 -0.834384 -3.11396 0.0477759 -0.811892 -3.03002 0.105055 -0.420042 -3.19054 0.127715 -0.774243 -2.88951 0.130526 -0.408234 -3.10085 0.179188 -0.363379 -2.76013 0.178511 -0.389071 -2.95528 0.19509 -0.661085 -2.4672 0.0990458 -0.591348 -2.20694 0.0540057 -0.297685 -2.26114 0.0725165 -0.332394 -2.52478 0.135082 -0.261052 -1.98289 0 -0.22442 -1.70464 -0.0725165 -5.69646e-15 -2 0 -4.1682e-15 -1.46343 -0.170541 -0.189711 -1.44099 -0.135082 -0.133034 -1.0105 -0.19509 -0.11387 -0.864931 -0.179188 -0.102063 -0.775243 -0.127715 -2.52504e-15 -0.886528 -0.252553 -0.101533 -0.771223 0.0801021 -2.20811e-15 -0.775255 1.66533e-15 -2.41165e-15 -0.846719 0.153281 -0.128856 -0.978755 0.396549 -3.17843e-15 -1.11593 0.518045 -2.74408e-15 -0.963434 0.329459 -0.150328 -1.14185 0.574756 -3.68246e-15 -1.29289 0.707107 -0.22699 -1.72416 1.05589 -5.25988e-15 -1.84672 1.15328 -0.250933 -1.90603 1.16084 -5.69646e-15 -2 1.22474 -0.287566 -2.18428 1.23335 -6.04403e-15 -2.12203 1.244 -6.28635e-15 -2.20711 1.20711 -6.4158e-15 -2.25255 1.11347 -0.303009 -2.30158 0.94693 -6.1822e-15 -2.17054 0.536566 -5.43808e-15 -1.90928 -0.275309 -0.246887 -1.87529 -0.268786 -5.21073e-15 -1.82946 -0.536566 -0.224595 -1.70597 -0.753945 -4.95929e-15 -1.74118 -0.965926 -5.10658e-15 -1.79289 -1.20711 -4.97713e-15 -1.74745 -1.11347 -0.223773 -1.69972 -1.19098 -0.234539 -1.7815 -1.23335 -5.3489e-15 -1.87797 -1.244 -0.295114 -2.24162 -1.05589 -0.320979 -2.43808 -0.916059 -7.17198e-15 -2.51804 -0.88407 -8.2145e-15 -2.88407 -0.518045 -7.71047e-15 -2.70711 -0.707107 -0.409955 -3.11392 -0.228382 -9.18482e-15 -3.22474 -5.55112e-15 -9.23966e-15 -3.244 0.122027 -0.424121 -3.22152 0.0404045 -9.13458e-15 -3.20711 0.207107 -8.86789e-15 -3.11347 0.252553 -6.48061e-15 -2.27531 0.0907167 -7.22473e-15 -2.53657 0.170541 -4.91232e-15 -1.72469 -0.0907167 0.192622 -1.46311 -0.205269 -3.50162e-15 -1.2294 -0.229402 -2.94528e-15 -1.03407 -0.258819 -2.25834e-15 -0.792893 -0.207107 0.105599 -0.802102 -0.285612 -2.15327e-15 -0.756002 -0.122027 0.109533 -0.831984 0.0775251 -4.22095e-15 -1.48196 0.88407 0.186032 -1.41305 0.848295 -4.75809e-15 -1.67054 1.03657 0.231243 -1.75646 1.14079 -6.43364e-15 -2.25882 0.965926 0.284441 -2.16054 1.12761 -6.34985e-15 -2.2294 0.770598 0.284353 -2.15987 0.783952 0.270518 -2.05479 0.280652 -5.95485e-15 -2.09072 0.275309 0.251587 -1.91099 -0.280652 -5.04307e-15 -1.7706 -0.770598 0.235588 -1.78947 -0.980785 0.237664 -1.80523 -1.12761 0.271508 -2.06231 -1.22212 0.255779 -1.94283 -1.24932 -5.69646e-15 -2 -1.22474 -6.13305e-15 -2.15328 -1.15328 0.312812 -2.37605 -1.0128 0.290862 -2.20932 -1.14079 -6.63484e-15 -2.32946 -1.03657 0.336073 -2.55273 -0.848295 0.359187 -2.7283 -0.659346 0.380622 -2.89111 -0.459115 -8.64885e-15 -3.03657 -0.329459 -8.98128e-15 -3.15328 -0.153281 0.420571 -3.19456 0.0801021 -8.44765e-15 -2.96593 0.258819 -7.89131e-15 -2.7706 0.229402 0.384652 -2.92172 0.321439 0.359462 -2.73038 0.27931 0.296136 -2.24938 0.108529 0.261052 -1.98289 0 0.225969 -1.7164 -0.108529 0.450057 -1.67964 -0.125876 0.162643 -1.2354 -0.27931 0.137453 -1.04406 -0.321439 0.27852 -1.03945 -0.382683 0.118182 -0.897684 -0.324837 0.240448 -0.897363 -0.39573 0.100067 -0.760087 -0.203127 0.214885 -0.801963 -0.362894 0.202545 -0.755907 -0.283358 0.101533 -0.771223 -0.0801021 0.203363 -0.75896 -0.159861 0.123231 -0.936029 0.260959 0.141483 -1.07467 0.459115 0.162918 -1.23748 0.659346 0.273281 -1.0199 0.398218 0.209292 -1.58973 1.0128 0.398079 -1.48565 0.984695 0.250597 -1.90347 1.22212 0.439344 -1.63966 1.12341 0.266326 -2.02295 1.24932 0.277723 -2.10951 1.21807 0.530003 -1.978 1.22381 0.551421 -2.05793 0.991445 0.544828 -2.03333 1.13691 0.286517 -2.17631 0.980785 0.550471 -2.05439 0.793948 0.278684 -2.11682 0.546571 0.543273 -2.02752 0.554236 0.492003 -1.83618 -0.554236 0.243421 -1.84896 -0.546571 0.237752 -1.80591 -0.783952 0.484805 -1.80932 -0.793948 0.490448 -1.83038 -1.13691 0.244382 -1.85627 -1.21807 0.528351 -1.97183 -1.24928 0.722973 -2.69817 -0.608761 0.680437 -2.53943 -0.808888 0.398874 -3.02975 -0.260959 0.761996 -2.84381 -0.398218 0.412572 -3.1338 -0.0775251 0.818754 -3.05563 -0.0014367 0.422037 -3.20569 0.203127 0.416506 -3.16368 0.285612 0.794828 -2.96634 0.39573 0.403922 -3.0681 0.324837 0.329482 -2.50267 0.205269 0.585219 -2.18407 0.125876 0.517638 -1.93185 0 0.668808 -1.61465 -0.142684 0.385714 -1.4395 -0.239118 0.493265 -1.19085 -0.37533 0.57671 -1.3923 -0.271943 0.327649 -1.2228 -0.328023 0.366302 -0.884332 -0.464928 0.307567 -0.742532 -0.362374 0.216522 -0.808072 0.0014367 0.24052 -0.897634 0.191342 0.312303 -1.16553 0.608761 0.447177 -1.07958 0.55557 0.354839 -1.32428 0.808888 0.504926 -1.219 0.766017 0.476263 -1.77744 1.21427 0.506925 -1.89187 1.24928 0.75298 -1.81786 1.22432 0.718293 -1.73411 1.2439 0.790396 -1.90818 0.997859 0.778862 -1.88034 0.287717 0.531616 -1.98402 0.284794 0.50366 -1.87969 -0.284794 0.741417 -1.78994 -0.559527 0.740338 -1.78733 -0.997859 0.736797 -1.77878 -0.800545 0.483855 -1.80577 -0.991445 0.753705 -1.81961 -1.14135 0.505273 -1.8857 -1.22381 0.812441 -1.96141 -1.2439 0.559013 -2.08627 -1.21427 0.595932 -2.22405 -1.12341 0.637197 -2.37805 -0.984695 0.966411 -2.33312 -0.952374 1.13586 -2.74221 -0.335617 0.794756 -2.96607 -0.191342 1.20967 -2.92041 0.0746578 0.831914 -3.10474 0.159861 1.22317 -2.95299 0.362374 0.832732 -3.1078 0.283358 0.820391 -3.06174 0.362894 0.756756 -2.82425 0.382683 0.707627 -2.6409 0.328023 0.649562 -2.4242 0.239118 0.765367 -1.84776 0 0.878776 -1.52208 -0.158881 1 -1.73205 0 0.657517 -1.13885 -0.421031 0.566987 -0.982051 -0.5 0.422149 -1.01916 -0.442289 0.327765 -0.791295 -0.438622 0.305683 -0.737984 -0.238936 0.321062 -0.775112 -0.0746578 0.351716 -0.849116 0.120905 0.423172 -0.732955 -0.150433 0.456742 -0.7911 0.0499502 0.394872 -0.953307 0.335617 0.635397 -1.10054 0.719866 0.564323 -1.3624 0.952374 0.621734 -1.501 1.10122 0.67393 -1.62701 1.20121 0.777028 -1.87591 1.14135 1 -1.73205 1 1.01107 -1.75122 0.803714 0.793937 -1.91673 0.800545 0.789317 -1.90558 0.559527 1.01293 -1.75444 0.562422 1.00819 -1.74623 0.289407 0.751872 -1.81518 -0.287717 0.987072 -1.70966 -0.562422 0.991815 -1.71787 -0.289407 0.98893 -1.71288 -0.803714 0.777753 -1.87766 -1.22432 1.05619 -1.82937 -1.21958 0.856804 -2.06851 -1.20121 0.909 -2.19452 -1.10122 1.02581 -2.47652 -0.766017 1.08356 -2.61594 -0.55557 1.3646 -2.36356 -0.719866 1.49401 -2.58771 -0.271579 1.17902 -2.8464 -0.120905 1.54326 -2.673 -0.0499502 1.22505 -2.95753 0.238936 1.58501 -2.74532 0.43984 1.20297 -2.90422 0.438622 1.16443 -2.81119 0.464928 1.10859 -2.67636 0.442289 1.03747 -2.50467 0.37533 0.954024 -2.30322 0.271943 1.12122 -1.94202 0.158881 0.861926 -2.08087 0.142684 0.941588 -1.2271 -0.333964 1.07657 -1.40302 -0.174397 0.762928 -1.32143 -0.303603 0.818197 -1.0663 -0.464928 0.711356 -0.927057 -0.55557 0.494917 -0.857222 -0.532136 0.443814 -0.768708 -0.512472 0.625076 -0.814616 -0.597064 0.524293 -0.683272 -0.515421 0.562207 -0.732683 -0.584127 0.414986 -0.718778 -0.43984 0.408494 -0.707532 -0.316987 0.522714 -0.681215 -0.225563 0.606526 -0.79044 0.206377 0.505987 -0.876395 0.271579 0.566987 -0.982051 0.5 0.745899 -0.972074 0.670633 0.706742 -1.22411 0.915976 0.824769 -1.07486 0.875654 0.776725 -1.34533 1.07431 0.841506 -1.45753 1.18301 0.897949 -1.55529 1.23319 0.943814 -1.63473 1.21958 1.1007 -1.43447 1.20962 1.14522 -1.49249 1.13556 0.97788 -1.69374 1.1409 1.17771 -1.53482 0.997859 1.21084 -1.57799 0.562909 1.22421 -1.59542 -0.562909 1.2191 -1.58876 -0.289858 1.23607 -1.61088 -0.803441 1 -1.73205 -1 1.25734 -1.63859 -0.997859 1.02212 -1.77036 -1.1409 1.10205 -1.90881 -1.23319 1.15849 -2.00657 -1.18301 1.22327 -2.11877 -1.07431 1.29326 -2.23999 -0.915976 1.43301 -2.48205 -0.5 1.7635 -2.29824 -0.442289 1.82852 -2.38297 -0.206377 1.57683 -2.73115 0.150433 1.87952 -2.44944 0.0212183 1.59151 -2.75657 0.316987 1.92353 -2.5068 0.393681 1.55619 -2.69539 0.512472 1.91075 -2.49014 0.515421 1.50508 -2.60688 0.532136 1.43301 -2.48205 0.5 1.34248 -2.32525 0.421031 1.72369 -2.24636 0.55557 1.23707 -2.14267 0.303603 1.35847 -1.7704 0.174397 1.21752 -1.58671 0 1.41421 -1.41421 0 1.10983 -1.10983 -0.362894 0.755143 -0.755143 -0.659436 0.681676 -0.681676 -0.653281 0.511513 -0.666617 -0.393681 0.61411 -0.61411 -0.46869 0.634553 -0.634553 -0.588796 0.555521 -0.723969 -0.0212183 0.696485 -0.696485 0.140292 0.671541 -0.87517 0.442289 0.903489 -1.17745 1.04281 0.977865 -1.27438 1.15975 1.04444 -1.36114 1.2172 1.2779 -1.2779 1.12536 1.19897 -1.56253 0.803441 1.38043 -1.38043 0.560986 1.21594 -1.58465 0.289858 1.448 -1.448 -0.560986 1.42945 -1.42945 -0.289068 1.47287 -1.47287 -0.799728 1.55053 -1.55053 -1.12536 1.50651 -1.50651 -0.991445 1.28982 -1.68093 -1.13556 1.33434 -1.73895 -1.20962 1.39061 -1.81227 -1.2172 1.60556 -1.60556 -1.19448 1.45718 -1.89904 -1.15975 1.67112 -1.67112 -1.196 1.53156 -1.99596 -1.04281 1.74563 -1.74563 -1.13152 1.90994 -1.90994 -0.831584 1.61028 -2.09855 -0.875654 1.68915 -2.20134 -0.670633 1.99187 -1.99187 -0.618527 2.13194 -2.13194 -0.140292 1.91233 -2.4922 0.225563 2.18053 -2.18053 0.092296 2.21432 -2.21432 0.46869 2.20911 -2.20911 0.299728 2.19387 -2.19387 0.588796 1.87284 -2.44073 0.584127 1.80997 -2.3588 0.597064 1.61685 -2.10712 0.464928 1.49346 -1.94631 0.333964 1.85556 -1.85556 0.506835 1.56952 -1.56952 0.189167 1.25891 -1.25891 -0.189167 1.42265 -1.09163 -0.203127 1.11889 -0.858557 -0.546571 0.972872 -0.972872 -0.506835 0.853228 -0.853228 -0.608761 0.990232 -0.759832 -0.659346 0.744374 -0.571178 -0.659649 0.800478 -0.614228 -0.719638 0.619318 -0.619318 -0.299728 0.733547 -0.562871 -0.162978 0.647893 -0.647893 -0.092296 0.760932 -0.760932 0.382683 0.775881 -0.595354 0.073606 0.836557 -0.836557 0.618527 0.835456 -0.641068 0.321439 0.918491 -0.918491 0.831584 1.002 -1.002 1.00683 0.988562 -0.758551 0.783952 1.0828 -1.0828 1.13152 1.15695 -0.887762 1.09844 1.07296 -0.823315 0.966552 1.15731 -1.15731 1.196 1.22287 -1.22287 1.19448 1.3757 -1.05561 1.11034 1.32192 -1.32192 0.991445 1.47954 -1.13529 0.79259 1.43193 -1.09876 0.980785 1.35556 -1.35556 0.799728 1.51978 -1.16617 0.55666 1.39898 -1.39898 0.289068 1.65364 -1.26888 -0.55666 1.61876 -1.24212 -0.28704 1.79771 -1.37943 -1.11034 1.86291 -1.42946 -1.17422 1.82643 -1.82643 -1.00683 2.0675 -2.0675 -0.382683 2.33796 -1.79398 -0.321439 2.43987 -1.87218 0.162978 2.46109 -1.88846 0.372609 2.14675 -2.14675 0.653281 2.07328 -2.07328 0.659436 2.29036 -1.75746 0.718984 1.9752 -1.9752 0.608761 2.05452 -1.57649 0.546571 1.71859 -1.71859 0.362894 1.58671 -1.21752 0 1.73205 -1 0 1.26476 -0.970485 -0.39027 0.883049 -0.677587 -0.718984 1.00631 -0.580991 -0.775454 1.11968 -0.646447 -0.707107 0.916401 -0.529084 -0.782913 0.715255 -0.548835 -0.541691 0.712319 -0.546582 -0.372609 0.800717 -0.462294 -0.443895 0.907886 -0.696646 0.563773 1.03611 -0.598198 0.732963 1.20172 -0.693814 1.06066 1.1177 -0.645307 0.92213 1.23703 -0.949203 1.16968 1.31051 -1.00559 1.17422 1.43932 -0.830991 1.09057 1.55465 -1.19293 0.28704 1.68088 -0.970454 0.283783 1.69387 -1.29976 -0.79259 1.74148 -1.33629 -0.980785 1.89368 -1.09332 -0.782058 2.02478 -1.16901 -1.09057 2.1792 -1.25816 -1.13835 1.93639 -1.48584 -1.16968 2.01646 -1.54728 -1.09844 2.10045 -1.61173 -0.966552 2.42799 -1.4018 -0.732963 2.3464 -1.35469 -0.92213 2.18485 -1.6765 -0.783952 2.26553 -1.7384 -0.563773 2.5034 -1.44534 -0.506605 2.39753 -1.83969 -0.073606 2.56857 -1.48296 -0.258819 2.65214 -1.53121 0.232963 2.45816 -1.88621 0.541691 2.42904 -1.86387 0.659649 2.37294 -1.82082 0.719638 2.34442 -1.35355 0.707107 2.18318 -1.67521 0.659346 1.90865 -1.46456 0.39027 1.75077 -1.34341 0.203127 1.56485 -0.903467 -0.216217 1.84776 -0.765367 0 1.40347 -0.810295 -0.415976 1.68284 -0.697054 -0.228382 1.25344 -0.723672 -0.583967 1.2386 -0.513046 -0.75184 1.37355 -0.568943 -0.618862 1.02679 -0.42531 -0.842836 0.851891 -0.49184 -0.727678 0.813492 -0.46967 -0.612372 0.883158 -0.365816 -0.51328 0.811966 -0.468789 -0.232963 0.882387 -0.365497 -0.30195 0.844678 -0.487675 0.00660481 0.941632 -0.390037 0.19509 0.895535 -0.517037 0.258819 0.960704 -0.554663 0.506605 1.13806 -0.471398 0.87376 1.21912 -0.504977 1.01834 1.2849 -0.74184 1.13835 1.36469 -0.787903 1.14894 1.30298 -0.539711 1.10214 1.50791 -0.87059 0.965926 1.57042 -0.906684 0.782058 1.62762 -0.939705 0.54995 1.77614 -0.735699 0.27931 1.78323 -1.02955 -0.283783 1.83649 -1.0603 -0.54995 1.99216 -0.825181 -0.540886 2.06707 -0.856208 -0.768178 1.95619 -1.12941 -0.965926 2.14473 -0.888376 -0.94693 2.22528 -0.92174 -1.06613 2.09941 -1.2121 -1.14894 2.39254 -0.991022 -1.10214 2.26238 -1.30619 -1.06066 2.63289 -1.09058 -0.678835 2.61942 -1.51232 -0.00660481 2.79278 -1.15681 0.0604246 2.66338 -1.53771 0.443895 2.81313 -1.16524 0.30195 2.65061 -1.53033 0.612372 2.61221 -1.50816 0.727678 2.74074 -1.13525 0.79259 2.5477 -1.47092 0.782913 2.4578 -1.41901 0.775454 2.57347 -1.06597 0.828602 2.32197 -0.961791 0.618862 2.21067 -1.27633 0.583967 2.06063 -1.1897 0.415976 1.89925 -1.09653 0.216217 2.01268 -0.83368 0.228382 1.93185 -0.517638 0 1.62095 -0.434333 -0.46194 1.52312 -0.630895 -0.4399 1.47622 -0.395552 -0.651107 1.34383 -0.360079 -0.793353 1.12205 -0.464766 -0.828602 1.22708 -0.328795 -0.878203 1.1286 -0.302408 -0.899149 0.954781 -0.395483 -0.79259 0.906937 -0.375666 -0.680432 0.993305 -0.266155 -0.745577 0.902734 -0.373925 -0.0604246 0.949751 -0.254485 -0.127195 0.996033 -0.41257 0.447267 1.06263 -0.440155 0.678835 1.38727 -0.574626 1.11873 1.47024 -0.608994 1.06613 1.55079 -0.642357 0.94693 1.65452 -0.443328 0.751008 1.56221 -0.418592 0.92388 1.62845 -0.674525 0.768178 1.70336 -0.705553 0.540886 1.74703 -0.468115 0.529505 1.91938 -0.795034 -0.27931 2.3015 -0.616684 -0.92388 2.39306 -0.641218 -1.03712 2.30825 -0.956108 -1.11873 2.48294 -0.665302 -1.08374 2.4764 -1.02576 -1.01834 2.72747 -0.730822 -0.821648 2.55746 -1.05934 -0.87376 2.69948 -1.11816 -0.447267 2.84869 -0.763304 -0.386014 2.79384 -0.748608 -0.621801 2.88951 -0.774243 -0.130526 2.75389 -1.1407 -0.19509 2.91992 -0.782391 0.369644 2.81236 -1.16492 0.51328 2.78858 -1.15507 0.680432 2.8704 -0.769121 0.745577 2.7351 -0.732868 0.899149 2.66873 -1.10542 0.842836 2.51987 -0.675197 0.793353 2.45692 -1.01769 0.75184 2.38748 -0.639724 0.651107 2.1724 -0.899838 0.4399 1.77422 -0.475401 -0.239568 1.83697 -0.241842 -0.249728 1.98289 -0.261052 0 1.69441 -0.223074 -0.482002 1.55844 -0.205173 -0.680564 1.31799 -0.173517 -0.924043 1.0503 -0.281428 -0.854109 0.957936 -0.256678 -0.580467 1.02302 -0.134684 -0.645168 0.943782 -0.252886 -0.369644 0.994856 -0.130975 -0.435755 0.974189 -0.261033 0.130526 1.01501 -0.271972 0.386014 0.993568 -0.130806 0.0654031 1.06986 -0.286668 0.621801 1.0597 -0.139512 0.562104 1.13624 -0.304454 0.821648 1.11473 -0.146757 0.766017 1.21168 -0.324668 0.971655 1.18227 -0.155649 0.920812 1.29387 -0.346691 1.06122 1.26064 -0.165967 1.01575 1.38076 -0.369974 1.08374 1.47065 -0.394059 1.03712 1.83948 -0.492888 0.273642 1.75926 -0.23161 0.515857 2.02422 -0.542388 -0.273642 2.09524 -0.275844 -0.266802 2.11667 -0.567161 -0.529505 2.20652 -0.290494 -0.515857 2.20918 -0.591949 -0.751008 2.56983 -0.688585 -1.06122 2.70514 -0.356138 -1.01575 2.6176 -0.344614 -1.04411 2.65202 -0.710608 -0.971655 2.85105 -0.375348 -0.766017 2.90608 -0.382593 -0.562104 2.97221 -0.391299 -0.0654031 2.91395 -0.780791 0.127195 2.97092 -0.391129 0.435755 2.90577 -0.778598 0.580467 2.94276 -0.387421 0.645168 2.8134 -0.753848 0.854109 2.74729 -0.361688 0.951612 2.63662 -0.706481 0.878203 2.27137 -0.299031 0.482002 2.40734 -0.316932 0.680564 2.24275 -0.600944 0.46194 2.08948 -0.559875 0.239568 2.1288 -0.280262 0.249728 1.86947 -8.76002e-15 -0.258819 2 -9.37164e-15 0 1.61732 -7.57846e-15 -0.707107 1.74118 -8.15886e-15 -0.5 1.43207 -0.188536 -0.83147 1.5 -7.02873e-15 -0.866025 1.39124 -6.5191e-15 -0.965926 1.21849 -0.160417 -0.951612 1.29289 -6.05827e-15 -1 1.13537 -0.149475 -0.91197 1.13397 -5.3136e-15 -0.866025 1.20665 -5.65413e-15 -0.965926 1.06996 -0.140862 -0.80753 1.03407 -4.84549e-15 -0.5 1.07612 -5.04251e-15 -0.707107 0.985249 -0.12971 -0.193421 1.00856 -4.72591e-15 -0.258819 1 -4.68582e-15 2.66454e-15 1.00856 -4.72591e-15 0.258819 1.01881 -0.134129 0.323108 1.03407 -4.84549e-15 0.5 1.07612 -5.04251e-15 0.707107 1.13397 -5.3136e-15 0.866025 1.29289 -6.05827e-15 1 1.20665 -5.65413e-15 0.965926 1.34818 -0.177491 1.04411 1.44326 -0.190009 1.00367 1.54438 -0.203322 0.896873 1.5 -7.02873e-15 0.866025 1.39124 -6.5191e-15 0.965926 1.65014 -0.217246 0.730622 1.61732 -7.57846e-15 0.707107 1.87054 -0.246261 0.266802 1.74118 -8.15886e-15 0.5 1.86947 -8.76002e-15 0.258819 2.13053 -9.98327e-15 -0.258819 2.31564 -0.304859 -0.730622 2.25882 -1.05844e-14 -0.5 2.42139 -0.318783 -0.896873 2.5 -1.17146e-14 -0.866025 2.38268 -1.11648e-14 -0.707107 2.52252 -0.332096 -1.00367 2.70711 -1.2685e-14 -1 2.60876 -1.22242e-14 -0.965926 2.79335 -1.30892e-14 -0.965926 2.78351 -0.366456 -0.920812 2.86603 -1.34297e-14 -0.866025 2.96593 -1.38978e-14 -0.5 2.92388 -1.37008e-14 -0.707107 2.94697 -0.387975 -0.323108 3 -1.40575e-14 -8.03938e-15 2.99144 -1.40174e-14 -0.258819 2.98053 -0.392394 0.193421 2.99144 -1.40174e-14 0.258819 2.96593 -1.38978e-14 0.5 2.89582 -0.381242 0.80753 2.86603 -1.34297e-14 0.866025 2.92388 -1.37008e-14 0.707107 2.83041 -0.37263 0.91197 2.79335 -1.30892e-14 0.965926 2.70711 -1.2685e-14 1 2.64778 -0.348588 0.924043 2.53371 -0.333569 0.83147 2.5 -1.17146e-14 0.866025 2.60876 -1.22242e-14 0.965926 2.38268 -1.11648e-14 0.707107 2.13053 -9.98327e-15 0.258819 2.25882 -1.05844e-14 0.5 4 2189 2254 22 69 4 2254 2255 25 22 4 2255 2253 26 25 4 2253 2251 0 26 4 2251 2252 27 0 4 2252 2248 28 27 4 2248 2247 29 28 4 2247 2244 31 29 4 2244 2245 1 31 4 2245 2242 34 1 4 2242 2241 35 34 4 2241 2238 2 35 4 2238 2239 3 2 4 2239 2235 38 3 4 2235 2236 4 38 4 2236 2234 5 4 4 2234 2232 40 5 4 2232 2230 6 40 4 2230 2231 41 6 4 2231 2227 7 41 4 2227 2228 8 7 4 2228 2225 9 8 4 2225 2223 45 9 4 2223 2189 69 45 4 2189 2222 47 69 4 2222 2221 10 47 4 2221 2219 11 10 4 2219 2216 50 11 4 2216 2217 12 50 4 2217 2211 13 12 4 2211 2212 51 13 4 2212 2210 14 51 4 2210 2209 53 14 4 2209 2208 15 53 4 2208 2206 56 15 4 2206 2205 57 56 4 2205 2204 16 57 4 2204 2201 17 16 4 2201 2202 61 17 4 2202 2198 62 61 4 2198 2199 18 62 4 2199 2196 19 18 4 2196 2194 20 19 4 2194 2193 21 20 4 2193 2190 66 21 4 2190 2191 67 66 4 2191 2188 68 67 4 2188 2189 69 68 4 69 22 24 70 4 22 25 23 24 4 25 26 73 23 4 26 0 74 73 4 0 27 77 74 4 27 28 30 77 4 28 29 80 30 4 29 31 82 80 4 31 1 32 82 4 1 34 33 32 4 34 35 84 33 4 35 2 37 84 4 2 3 36 37 4 3 38 87 36 4 38 4 89 87 4 4 5 39 89 4 5 40 90 39 4 40 6 42 90 4 6 41 92 42 4 41 7 93 92 4 7 8 94 93 4 8 9 43 94 4 9 45 44 43 4 45 69 70 44 4 69 47 46 70 4 47 10 48 46 4 10 11 49 48 4 11 50 99 49 4 50 12 101 99 4 12 13 102 101 4 13 51 104 102 4 51 14 52 104 4 14 53 54 52 4 53 15 55 54 4 15 56 105 55 4 56 57 58 105 4 57 16 59 58 4 16 17 60 59 4 17 61 107 60 4 61 62 63 107 4 62 18 109 63 4 18 19 64 109 4 19 20 110 64 4 20 21 111 110 4 21 66 65 111 4 66 67 113 65 4 67 68 114 113 4 68 69 70 114 4 70 24 71 116 4 24 23 72 71 4 23 73 76 72 4 73 74 75 76 4 74 77 78 75 4 77 30 121 78 4 30 80 79 121 4 80 82 81 79 4 82 32 123 81 4 32 33 83 123 4 33 84 86 83 4 84 37 85 86 4 37 36 126 85 4 36 87 129 126 4 87 89 88 129 4 89 39 131 88 4 39 90 132 131 4 90 42 91 132 4 42 92 133 91 4 92 93 135 133 4 93 94 136 135 4 94 43 95 136 4 43 44 96 95 4 44 70 116 96 4 70 46 97 116 4 46 48 140 97 4 48 49 98 140 4 49 99 141 98 4 99 101 100 141 4 101 102 143 100 4 102 104 103 143 4 104 52 144 103 4 52 54 146 144 4 54 55 147 146 4 55 105 106 147 4 105 58 149 106 4 58 59 150 149 4 59 60 151 150 4 60 107 153 151 4 107 63 108 153 4 63 109 156 108 4 109 64 158 156 4 64 110 112 158 4 110 111 159 112 4 111 65 160 159 4 65 113 115 160 4 113 114 162 115 4 114 70 116 162 4 116 71 118 211 4 71 72 117 118 4 72 76 119 117 4 76 75 120 119 4 75 78 122 120 4 78 121 167 122 4 121 79 169 167 4 79 81 171 169 4 81 123 124 171 4 123 83 125 124 4 83 86 173 125 4 86 85 128 173 4 85 126 127 128 4 126 129 175 127 4 129 88 177 175 4 88 131 130 177 4 131 132 180 130 4 132 91 182 180 4 91 133 134 182 4 133 135 184 134 4 135 136 137 184 4 136 95 138 137 4 95 96 188 138 4 96 116 211 188 4 116 97 139 211 4 97 140 189 139 4 140 98 191 189 4 98 141 192 191 4 141 100 142 192 4 100 143 193 142 4 143 103 145 193 4 103 144 195 145 4 144 146 196 195 4 146 147 198 196 4 147 106 148 198 4 106 149 199 148 4 149 150 200 199 4 150 151 201 200 4 151 153 152 201 4 153 108 154 152 4 108 156 155 154 4 156 158 157 155 4 158 112 205 157 4 112 159 208 205 4 159 160 210 208 4 160 115 161 210 4 115 162 163 161 4 162 116 211 163 4 211 118 164 212 4 118 117 165 164 4 117 119 214 165 4 119 120 166 214 4 120 122 217 166 4 122 167 218 217 4 167 169 168 218 4 169 171 170 168 4 171 124 172 170 4 124 125 220 172 4 125 173 222 220 4 173 128 174 222 4 128 127 176 174 4 127 175 178 176 4 175 177 224 178 4 177 130 179 224 4 130 180 225 179 4 180 182 181 225 4 182 134 183 181 4 134 184 228 183 4 184 137 185 228 4 137 138 187 185 4 138 188 186 187 4 188 211 212 186 4 211 139 190 212 4 139 189 231 190 4 189 191 232 231 4 191 192 234 232 4 192 142 236 234 4 142 193 194 236 4 193 145 240 194 4 145 195 197 240 4 195 196 243 197 4 196 198 244 243 4 198 148 245 244 4 148 199 246 245 4 199 200 248 246 4 200 201 202 248 4 201 152 249 202 4 152 154 203 249 4 154 155 204 203 4 155 157 206 204 4 157 205 252 206 4 205 208 207 252 4 208 210 209 207 4 210 161 255 209 4 161 163 257 255 4 163 211 212 257 4 212 164 213 258 4 164 165 215 213 4 165 214 260 215 4 214 166 262 260 4 166 217 216 262 4 217 218 264 216 4 218 168 265 264 4 168 170 219 265 4 170 172 266 219 4 172 220 221 266 4 220 222 268 221 4 222 174 270 268 4 174 176 271 270 4 176 178 223 271 4 178 224 272 223 4 224 179 273 272 4 179 225 226 273 4 225 181 227 226 4 181 183 276 227 4 183 228 277 276 4 228 185 229 277 4 185 187 230 229 4 187 186 280 230 4 186 212 258 280 4 212 190 281 258 4 190 231 282 281 4 231 232 233 282 4 232 234 235 233 4 234 236 238 235 4 236 194 237 238 4 194 240 239 237 4 240 197 241 239 4 197 243 242 241 4 243 244 286 242 4 244 245 247 286 4 245 246 289 247 4 246 248 291 289 4 248 202 292 291 4 202 249 250 292 4 249 203 251 250 4 203 204 296 251 4 204 206 253 296 4 206 252 297 253 4 252 207 254 297 4 207 209 256 254 4 209 255 302 256 4 255 257 303 302 4 257 212 258 303 4 258 213 305 350 4 213 215 259 305 4 215 260 261 259 4 260 262 309 261 4 262 216 310 309 4 216 264 263 310 4 264 265 313 263 4 265 219 314 313 4 219 266 267 314 4 266 221 269 267 4 221 268 318 269 4 268 270 320 318 4 270 271 321 320 4 271 223 322 321 4 223 272 323 322 4 272 273 274 323 4 273 226 275 274 4 226 227 324 275 4 227 276 325 324 4 276 277 326 325 4 277 229 278 326 4 229 230 279 278 4 230 280 329 279 4 280 258 350 329 4 258 281 283 350 4 281 282 331 283 4 282 233 332 331 4 233 235 333 332 4 235 238 285 333 4 238 237 284 285 4 237 239 336 284 4 239 241 337 336 4 241 242 288 337 4 242 286 287 288 4 286 247 340 287 4 247 289 290 340 4 289 291 341 290 4 291 292 293 341 4 292 250 295 293 4 250 251 294 295 4 251 296 344 294 4 296 253 298 344 4 253 297 346 298 4 297 254 300 346 4 254 256 299 300 4 256 302 301 299 4 302 303 304 301 4 303 258 350 304 4 350 305 306 399 4 305 259 308 306 4 259 261 307 308 4 261 309 311 307 4 309 310 351 311 4 310 263 353 351 4 263 313 312 353 4 313 314 315 312 4 314 267 317 315 4 267 269 316 317 4 269 318 319 316 4 318 320 359 319 4 320 321 360 359 4 321 322 362 360 4 322 323 363 362 4 323 274 364 363 4 274 275 366 364 4 275 324 368 366 4 324 325 369 368 4 325 326 371 369 4 326 278 327 371 4 278 279 328 327 4 279 329 372 328 4 329 350 399 372 4 350 283 373 399 4 283 331 330 373 4 331 332 334 330 4 332 333 375 334 4 333 285 377 375 4 285 284 335 377 4 284 336 379 335 4 336 337 338 379 4 337 288 380 338 4 288 287 339 380 4 287 340 384 339 4 340 290 385 384 4 290 341 387 385 4 341 293 343 387 4 293 295 342 343 4 295 294 390 342 4 294 344 345 390 4 344 298 392 345 4 298 346 347 392 4 346 300 395 347 4 300 299 397 395 4 299 301 349 397 4 301 304 348 349 4 304 350 399 348 4 399 306 401 400 4 306 308 403 401 4 308 307 404 403 4 307 311 405 404 4 311 351 352 405 4 351 353 354 352 4 353 312 355 354 4 312 315 407 355 4 315 317 356 407 4 317 316 357 356 4 316 319 358 357 4 319 359 410 358 4 359 360 361 410 4 360 362 411 361 4 362 363 365 411 4 363 364 412 365 4 364 366 367 412 4 366 368 414 367 4 368 369 370 414 4 369 371 418 370 4 371 327 419 418 4 327 328 420 419 4 328 372 422 420 4 372 399 400 422 4 399 373 423 400 4 373 330 374 423 4 330 334 376 374 4 334 375 424 376 4 375 377 378 424 4 377 335 427 378 4 335 379 428 427 4 379 338 382 428 4 338 380 381 382 4 380 339 383 381 4 339 384 386 383 4 384 385 431 386 4 385 387 388 431 4 387 343 389 388 4 343 342 391 389 4 342 390 435 391 4 390 345 393 435 4 345 392 437 393 4 392 347 394 437 4 347 395 396 394 4 395 397 440 396 4 397 349 398 440 4 349 348 442 398 4 348 399 400 442 4 400 401 402 491 4 401 403 444 402 4 403 404 445 444 4 404 405 406 445 4 405 352 447 406 4 352 354 450 447 4 354 355 408 450 4 355 407 451 408 4 407 356 452 451 4 356 357 453 452 4 357 358 409 453 4 358 410 456 409 4 410 361 459 456 4 361 411 460 459 4 411 365 413 460 4 365 412 464 413 4 412 367 415 464 4 367 414 417 415 4 414 370 416 417 4 370 418 465 416 4 418 419 467 465 4 419 420 469 467 4 420 422 421 469 4 422 400 491 421 4 400 423 472 491 4 423 374 473 472 4 374 376 425 473 4 376 424 475 425 4 424 378 426 475 4 378 427 477 426 4 427 428 478 477 4 428 382 479 478 4 382 381 429 479 4 381 383 481 429 4 383 386 430 481 4 386 431 482 430 4 431 388 433 482 4 388 389 432 433 4 389 391 434 432 4 391 435 436 434 4 435 393 485 436 4 393 437 486 485 4 437 394 438 486 4 394 396 439 438 4 396 440 441 439 4 440 398 490 441 4 398 442 443 490 4 442 400 491 443 4 491 402 493 541 4 402 444 494 493 4 444 445 495 494 4 445 406 446 495 4 406 447 448 446 4 447 450 449 448 4 450 408 496 449 4 408 451 497 496 4 451 452 454 497 4 452 453 501 454 4 453 409 455 501 4 409 456 458 455 4 456 459 457 458 4 459 460 461 457 4 460 413 462 461 4 413 464 463 462 4 464 415 509 463 4 415 417 510 509 4 417 416 466 510 4 416 465 512 466 4 465 467 468 512 4 467 469 514 468 4 469 421 470 514 4 421 491 541 470 4 491 472 471 541 4 472 473 516 471 4 473 425 474 516 4 425 475 476 474 4 475 426 520 476 4 426 477 521 520 4 477 478 522 521 4 478 479 523 522 4 479 429 525 523 4 429 481 480 525 4 481 430 527 480 4 430 482 483 527 4 482 433 484 483 4 433 432 529 484 4 432 434 531 529 4 434 436 532 531 4 436 485 534 532 4 485 486 487 534 4 486 438 535 487 4 438 439 537 535 4 439 441 489 537 4 441 490 488 489 4 490 443 492 488 4 443 491 541 492 4 541 493 542 585 4 493 494 543 542 4 494 495 546 543 4 495 446 549 546 4 446 448 550 549 4 448 449 552 550 4 449 496 553 552 4 496 497 498 553 4 497 454 499 498 4 454 501 500 499 4 501 455 503 500 4 455 458 502 503 4 458 457 504 502 4 457 461 506 504 4 461 462 505 506 4 462 463 507 505 4 463 509 508 507 4 509 510 559 508 4 510 466 511 559 4 466 512 513 511 4 512 468 561 513 4 468 514 562 561 4 514 470 515 562 4 470 541 585 515 4 541 471 564 585 4 471 516 518 564 4 516 474 517 518 4 474 476 519 517 4 476 520 568 519 4 520 521 569 568 4 521 522 570 569 4 522 523 571 570 4 523 525 524 571 4 525 480 572 524 4 480 527 526 572 4 527 483 528 526 4 483 484 530 528 4 484 529 576 530 4 529 531 577 576 4 531 532 533 577 4 532 534 579 533 4 534 487 580 579 4 487 535 536 580 4 535 537 582 536 4 537 489 538 582 4 489 488 540 538 4 488 492 539 540 4 492 541 585 539 4 585 542 545 586 4 542 543 544 545 4 543 546 548 544 4 546 549 547 548 4 549 550 551 547 4 550 552 591 551 4 552 553 592 591 4 553 498 593 592 4 498 499 594 593 4 499 500 554 594 4 500 503 597 554 4 503 502 555 597 4 502 504 556 555 4 504 506 557 556 4 506 505 600 557 4 505 507 601 600 4 507 508 603 601 4 508 559 558 603 4 559 511 604 558 4 511 513 560 604 4 513 561 606 560 4 561 562 607 606 4 562 515 609 607 4 515 585 586 609 4 585 564 563 586 4 564 518 611 563 4 518 517 566 611 4 517 519 565 566 4 519 568 567 565 4 568 569 613 567 4 569 570 615 613 4 570 571 617 615 4 571 524 573 617 4 524 572 618 573 4 572 526 574 618 4 526 528 575 574 4 528 530 619 575 4 530 576 622 619 4 576 577 623 622 4 577 533 624 623 4 533 579 578 624 4 579 580 628 578 4 580 536 581 628 4 536 582 583 581 4 582 538 630 583 4 538 540 584 630 4 540 539 587 584 4 539 585 586 587 4 586 545 588 632 4 545 544 634 588 4 544 548 589 634 4 548 547 590 589 4 547 551 637 590 4 551 591 640 637 4 591 592 641 640 4 592 593 596 641 4 593 594 595 596 4 594 554 643 595 4 554 597 598 643 4 597 555 599 598 4 555 556 647 599 4 556 557 649 647 4 557 600 650 649 4 600 601 602 650 4 601 603 652 602 4 603 558 653 652 4 558 604 605 653 4 604 560 655 605 4 560 606 608 655 4 606 607 657 608 4 607 609 610 657 4 609 586 632 610 4 586 563 659 632 4 563 611 661 659 4 611 566 612 661 4 566 565 662 612 4 565 567 663 662 4 567 613 614 663 4 613 615 616 614 4 615 617 665 616 4 617 573 666 665 4 573 618 668 666 4 618 574 670 668 4 574 575 671 670 4 575 619 620 671 4 619 622 621 620 4 622 623 625 621 4 623 624 626 625 4 624 578 627 626 4 578 628 675 627 4 628 581 676 675 4 581 583 678 676 4 583 630 629 678 4 630 584 631 629 4 584 587 633 631 4 587 586 632 633 4 632 588 681 726 4 588 634 635 681 4 634 589 682 635 4 589 590 636 682 4 590 637 639 636 4 637 640 638 639 4 640 641 686 638 4 641 596 642 686 4 596 595 688 642 4 595 643 644 688 4 643 598 646 644 4 598 599 645 646 4 599 647 648 645 4 647 649 693 648 4 649 650 694 693 4 650 602 651 694 4 602 652 695 651 4 652 653 697 695 4 653 605 654 697 4 605 655 701 654 4 655 608 656 701 4 608 657 702 656 4 657 610 658 702 4 610 632 726 658 4 632 659 660 726 4 659 661 704 660 4 661 612 705 704 4 612 662 708 705 4 662 663 709 708 4 663 614 664 709 4 614 616 711 664 4 616 665 712 711 4 665 666 667 712 4 666 668 669 667 4 668 670 714 669 4 670 671 716 714 4 671 620 672 716 4 620 621 718 672 4 621 625 673 718 4 625 626 674 673 4 626 627 720 674 4 627 675 677 720 4 675 676 721 677 4 676 678 679 721 4 678 629 724 679 4 629 631 725 724 4 631 633 680 725 4 633 632 726 680 4 726 681 728 775 4 681 635 683 728 4 635 682 684 683 4 682 636 685 684 4 636 639 731 685 4 639 638 734 731 4 638 686 736 734 4 686 642 687 736 4 642 688 737 687 4 688 644 689 737 4 644 646 690 689 4 646 645 692 690 4 645 648 691 692 4 648 693 742 691 4 693 694 744 742 4 694 651 696 744 4 651 695 745 696 4 695 697 698 745 4 697 654 699 698 4 654 701 700 699 4 701 656 749 700 4 656 702 703 749 4 702 658 751 703 4 658 726 775 751 4 726 660 752 775 4 660 704 707 752 4 704 705 706 707 4 705 708 710 706 4 708 709 755 710 4 709 664 756 755 4 664 711 758 756 4 711 712 713 758 4 712 667 760 713 4 667 669 762 760 4 669 714 715 762 4 714 716 763 715 4 716 672 717 763 4 672 718 765 717 4 718 673 767 765 4 673 674 719 767 4 674 720 769 719 4 720 677 770 769 4 677 721 723 770 4 721 679 722 723 4 679 724 771 722 4 724 725 773 771 4 725 680 727 773 4 680 726 775 727 4 775 728 776 820 4 728 683 729 776 4 683 684 730 729 4 684 685 732 730 4 685 731 733 732 4 731 734 778 733 4 734 736 735 778 4 736 687 781 735 4 687 737 739 781 4 737 689 738 739 4 689 690 784 738 4 690 692 740 784 4 692 691 741 740 4 691 742 786 741 4 742 744 743 786 4 744 696 746 743 4 696 745 789 746 4 745 698 791 789 4 698 699 747 791 4 699 700 748 747 4 700 749 795 748 4 749 703 796 795 4 703 751 750 796 4 751 775 820 750 4 775 752 797 820 4 752 707 754 797 4 707 706 753 754 4 706 710 798 753 4 710 755 757 798 4 755 756 799 757 4 756 758 759 799 4 758 713 801 759 4 713 760 761 801 4 760 762 802 761 4 762 715 805 802 4 715 763 764 805 4 763 717 766 764 4 717 765 806 766 4 765 767 768 806 4 767 719 809 768 4 719 769 810 809 4 769 770 813 810 4 770 723 815 813 4 723 722 772 815 4 722 771 817 772 4 771 773 774 817 4 773 727 819 774 4 727 775 820 819 4 820 776 821 868 4 776 729 823 821 4 729 730 824 823 4 730 732 777 824 4 732 733 780 777 4 733 778 779 780 4 778 735 826 779 4 735 781 782 826 4 781 739 783 782 4 739 738 829 783 4 738 784 785 829 4 784 740 832 785 4 740 741 833 832 4 741 786 788 833 4 786 743 787 788 4 743 746 836 787 4 746 789 790 836 4 789 791 792 790 4 791 747 794 792 4 747 748 793 794 4 748 795 839 793 4 795 796 841 839 4 796 750 842 841 4 750 820 868 842 4 820 797 845 868 4 797 754 846 845 4 754 753 847 846 4 753 798 848 847 4 798 757 850 848 4 757 799 800 850 4 799 759 852 800 4 759 801 855 852 4 801 761 803 855 4 761 802 804 803 4 802 805 856 804 4 805 764 857 856 4 764 766 807 857 4 766 806 860 807 4 806 768 808 860 4 768 809 862 808 4 809 810 812 862 4 810 813 811 812 4 813 815 814 811 4 815 772 816 814 4 772 817 865 816 4 817 774 867 865 4 774 819 818 867 4 819 820 868 818 4 868 821 869 923 4 821 823 822 869 4 823 824 872 822 4 824 777 873 872 4 777 780 825 873 4 780 779 875 825 4 779 826 827 875 4 826 782 828 827 4 782 783 879 828 4 783 829 831 879 4 829 785 830 831 4 785 832 884 830 4 832 833 835 884 4 833 788 834 835 4 788 787 885 834 4 787 836 886 885 4 836 790 837 886 4 790 792 889 837 4 792 794 838 889 4 794 793 891 838 4 793 839 840 891 4 839 841 844 840 4 841 842 843 844 4 842 868 923 843 4 868 845 896 923 4 845 846 897 896 4 846 847 849 897 4 847 848 899 849 4 848 850 851 899 4 850 800 900 851 4 800 852 854 900 4 852 855 853 854 4 855 803 903 853 4 803 804 905 903 4 804 856 858 905 4 856 857 859 858 4 857 807 909 859 4 807 860 910 909 4 860 808 861 910 4 808 862 913 861 4 862 812 863 913 4 812 811 915 863 4 811 814 864 915 4 814 816 918 864 4 816 865 920 918 4 865 867 866 920 4 867 818 921 866 4 818 868 923 921 4 923 869 871 955 4 869 822 870 871 4 822 872 925 870 4 872 873 926 925 4 873 825 874 926 4 825 875 876 874 4 875 827 877 876 4 827 828 878 877 4 828 879 880 878 4 879 831 881 880 4 831 830 883 881 4 830 884 882 883 4 884 835 932 882 4 835 834 933 932 4 834 885 936 933 4 885 886 887 936 4 886 837 888 887 4 837 889 890 888 4 889 838 892 890 4 838 891 894 892 4 891 840 893 894 4 840 844 895 893 4 844 843 937 895 4 843 923 955 937 4 923 896 939 955 4 896 897 898 939 4 897 849 940 898 4 849 899 943 940 4 899 851 944 943 4 851 900 902 944 4 900 854 901 902 4 854 853 904 901 4 853 903 946 904 4 903 905 906 946 4 905 858 908 906 4 858 859 907 908 4 859 909 949 907 4 909 910 950 949 4 910 861 911 950 4 861 913 912 911 4 913 863 914 912 4 863 915 917 914 4 915 864 916 917 4 864 918 952 916 4 918 920 919 952 4 920 866 922 919 4 866 921 954 922 4 921 923 955 954 4 955 871 924 999 4 871 870 957 924 4 870 925 958 957 4 925 926 959 958 4 926 874 927 959 4 874 876 928 927 4 876 877 961 928 4 877 878 929 961 4 878 880 962 929 4 880 881 930 962 4 881 883 931 930 4 883 882 963 931 4 882 932 934 963 4 932 933 964 934 4 933 936 935 964 4 936 887 966 935 4 887 888 967 966 4 888 890 968 967 4 890 892 969 968 4 892 894 970 969 4 894 893 972 970 4 893 895 938 972 4 895 937 974 938 4 937 955 999 974 4 955 939 976 999 4 939 898 978 976 4 898 940 942 978 4 940 943 941 942 4 943 944 980 941 4 944 902 945 980 4 902 901 981 945 4 901 904 983 981 4 904 946 984 983 4 946 906 947 984 4 906 908 985 947 4 908 907 986 985 4 907 949 948 986 4 949 950 987 948 4 950 911 988 987 4 911 912 989 988 4 912 914 951 989 4 914 917 991 951 4 917 916 993 991 4 916 952 994 993 4 952 919 953 994 4 919 922 997 953 4 922 954 956 997 4 954 955 999 956 4 999 924 1001 1062 4 924 957 1002 1001 4 957 958 1004 1002 4 958 959 960 1004 4 959 927 1006 960 4 927 928 1007 1006 4 928 961 1008 1007 4 961 929 1010 1008 4 929 962 1012 1010 4 962 930 1013 1012 4 930 931 1015 1013 4 931 963 1016 1015 4 963 934 965 1016 4 934 964 1018 965 4 964 935 1019 1018 4 935 966 1021 1019 4 966 967 1022 1021 4 967 968 1024 1022 4 968 969 1026 1024 4 969 970 971 1026 4 970 972 1028 971 4 972 938 973 1028 4 938 974 1031 973 4 974 999 1062 1031 4 999 976 975 1062 4 976 978 977 975 4 978 942 979 977 4 942 941 1033 979 4 941 980 1036 1033 4 980 945 1038 1036 4 945 981 982 1038 4 981 983 1040 982 4 983 984 1041 1040 4 984 947 1042 1041 4 947 985 1046 1042 4 985 986 1047 1046 4 986 948 1048 1047 4 948 987 1051 1048 4 987 988 990 1051 4 988 989 1054 990 4 989 951 1055 1054 4 951 991 992 1055 4 991 993 1057 992 4 993 994 995 1057 4 994 953 1060 995 4 953 997 996 1060 4 997 956 998 996 4 956 999 1062 998 4 1062 1001 1000 1099 4 1001 1002 1003 1000 4 1002 1004 1063 1003 4 1004 960 1005 1063 4 960 1006 1066 1005 4 1006 1007 1068 1066 4 1007 1008 1009 1068 4 1008 1010 1011 1009 4 1010 1012 1014 1011 4 1012 1013 1070 1014 4 1013 1015 1071 1070 4 1015 1016 1017 1071 4 1016 965 1074 1017 4 965 1018 1075 1074 4 1018 1019 1020 1075 4 1019 1021 1023 1020 4 1021 1022 1076 1023 4 1022 1024 1025 1076 4 1024 1026 1077 1025 4 1026 971 1027 1077 4 971 1028 1030 1027 4 1028 973 1029 1030 4 973 1031 1080 1029 4 1031 1062 1099 1080 4 1062 975 1081 1099 4 975 977 1032 1081 4 977 979 1082 1032 4 979 1033 1035 1082 4 1033 1036 1034 1035 4 1036 1038 1037 1034 4 1038 982 1086 1037 4 982 1040 1039 1086 4 1040 1041 1043 1039 4 1041 1042 1045 1043 4 1042 1046 1044 1045 4 1046 1047 1089 1044 4 1047 1048 1050 1089 4 1048 1051 1049 1050 4 1051 990 1052 1049 4 990 1054 1053 1052 4 1054 1055 1094 1053 4 1055 992 1056 1094 4 992 1057 1058 1056 4 1057 995 1059 1058 4 995 1060 1096 1059 4 1060 996 1061 1096 4 996 998 1098 1061 4 998 1062 1099 1098 4 1099 1000 1101 1100 4 1000 1003 1065 1101 4 1003 1063 1064 1065 4 1063 1005 1103 1064 4 1005 1066 1105 1103 4 1066 1068 1067 1105 4 1068 1009 1069 1067 4 1009 1011 1107 1069 4 1011 1014 1109 1107 4 1014 1070 1111 1109 4 1070 1071 1072 1111 4 1071 1017 1112 1072 4 1017 1074 1073 1112 4 1074 1075 1114 1073 4 1075 1020 1117 1114 4 1020 1023 1118 1117 4 1023 1076 1119 1118 4 1076 1025 1122 1119 4 1025 1077 1124 1122 4 1077 1027 1125 1124 4 1027 1030 1078 1125 4 1030 1029 1079 1078 4 1029 1080 1128 1079 4 1080 1099 1100 1128 4 1099 1081 1130 1100 4 1081 1032 1083 1130 4 1032 1082 1133 1083 4 1082 1035 1084 1133 4 1035 1034 1135 1084 4 1034 1037 1136 1135 4 1037 1086 1085 1136 4 1086 1039 1137 1085 4 1039 1043 1087 1137 4 1043 1045 1139 1087 4 1045 1044 1088 1139 4 1044 1089 1090 1088 4 1089 1050 1092 1090 4 1050 1049 1091 1092 4 1049 1052 1093 1091 4 1052 1053 1141 1093 4 1053 1094 1143 1141 4 1094 1056 1144 1143 4 1056 1058 1095 1144 4 1058 1059 1145 1095 4 1059 1096 1146 1145 4 1096 1061 1149 1146 4 1061 1098 1097 1149 4 1098 1099 1100 1097 4 1100 1101 1150 1198 4 1101 1065 1102 1150 4 1065 1064 1153 1102 4 1064 1103 1104 1153 4 1103 1105 1106 1104 4 1105 1067 1157 1106 4 1067 1069 1158 1157 4 1069 1107 1108 1158 4 1107 1109 1110 1108 4 1109 1111 1160 1110 4 1111 1072 1161 1160 4 1072 1112 1113 1161 4 1112 1073 1164 1113 4 1073 1114 1116 1164 4 1114 1117 1115 1116 4 1117 1118 1121 1115 4 1118 1119 1120 1121 4 1119 1122 1123 1120 4 1122 1124 1169 1123 4 1124 1125 1170 1169 4 1125 1078 1126 1170 4 1078 1079 1127 1126 4 1079 1128 1129 1127 4 1128 1100 1198 1129 4 1100 1130 1172 1198 4 1130 1083 1132 1172 4 1083 1133 1131 1132 4 1133 1084 1134 1131 4 1084 1135 1173 1134 4 1135 1136 1176 1173 4 1136 1085 1177 1176 4 1085 1137 1178 1177 4 1137 1087 1180 1178 4 1087 1139 1138 1180 4 1139 1088 1182 1138 4 1088 1090 1183 1182 4 1090 1092 1140 1183 4 1092 1091 1185 1140 4 1091 1093 1186 1185 4 1093 1141 1142 1186 4 1141 1143 1188 1142 4 1143 1144 1191 1188 4 1144 1095 1192 1191 4 1095 1145 1147 1192 4 1145 1146 1194 1147 4 1146 1149 1148 1194 4 1149 1097 1197 1148 4 1097 1100 1198 1197 4 1198 1150 1199 1236 4 1150 1102 1152 1199 4 1102 1153 1151 1152 4 1153 1104 1154 1151 4 1104 1106 1156 1154 4 1106 1157 1155 1156 4 1157 1158 1159 1155 4 1158 1108 1202 1159 4 1108 1110 1203 1202 4 1110 1160 1204 1203 4 1160 1161 1162 1204 4 1161 1113 1163 1162 4 1113 1164 1205 1163 4 1164 1116 1166 1205 4 1116 1115 1165 1166 4 1115 1121 1167 1165 4 1121 1120 1207 1167 4 1120 1123 1168 1207 4 1123 1169 1209 1168 4 1169 1170 1212 1209 4 1170 1126 1213 1212 4 1126 1127 1171 1213 4 1127 1129 1217 1171 4 1129 1198 1236 1217 4 1198 1172 1218 1236 4 1172 1132 1219 1218 4 1132 1131 1220 1219 4 1131 1134 1222 1220 4 1134 1173 1174 1222 4 1173 1176 1175 1174 4 1176 1177 1224 1175 4 1177 1178 1179 1224 4 1178 1180 1181 1179 4 1180 1138 1226 1181 4 1138 1182 1227 1226 4 1182 1183 1228 1227 4 1183 1140 1184 1228 4 1140 1185 1187 1184 4 1185 1186 1229 1187 4 1186 1142 1189 1229 4 1142 1188 1230 1189 4 1188 1191 1190 1230 4 1191 1192 1193 1190 4 1192 1147 1196 1193 4 1147 1194 1195 1196 4 1194 1148 1234 1195 4 1148 1197 1235 1234 4 1197 1198 1236 1235 4 1236 1199 1239 1237 4 1199 1152 1200 1239 4 1152 1151 1240 1200 4 1151 1154 1201 1240 4 1154 1156 1241 1201 4 1156 1155 1242 1241 4 1155 1159 1245 1242 4 1159 1202 1246 1245 4 1202 1203 1247 1246 4 1203 1204 1249 1247 4 1204 1162 1250 1249 4 1162 1163 1251 1250 4 1163 1205 1253 1251 4 1205 1166 1254 1253 4 1166 1165 1206 1254 4 1165 1167 1256 1206 4 1167 1207 1208 1256 4 1207 1168 1211 1208 4 1168 1209 1210 1211 4 1209 1212 1214 1210 4 1212 1213 1216 1214 4 1213 1171 1215 1216 4 1171 1217 1262 1215 4 1217 1236 1237 1262 4 1236 1218 1264 1237 4 1218 1219 1221 1264 4 1219 1220 1265 1221 4 1220 1222 1266 1265 4 1222 1174 1223 1266 4 1174 1175 1268 1223 4 1175 1224 1271 1268 4 1224 1179 1273 1271 4 1179 1181 1225 1273 4 1181 1226 1275 1225 4 1226 1227 1276 1275 4 1227 1228 1279 1276 4 1228 1184 1280 1279 4 1184 1187 1281 1280 4 1187 1229 1282 1281 4 1229 1189 1283 1282 4 1189 1230 1286 1283 4 1230 1190 1288 1286 4 1190 1193 1231 1288 4 1193 1196 1233 1231 4 1196 1195 1232 1233 4 1195 1234 1290 1232 4 1234 1235 1238 1290 4 1235 1236 1237 1238 4 1237 1239 1293 1292 4 1239 1200 1294 1293 4 1200 1240 1295 1294 4 1240 1201 1296 1295 4 1201 1241 1244 1296 4 1241 1242 1243 1244 4 1242 1245 1301 1243 4 1245 1246 1248 1301 4 1246 1247 1302 1248 4 1247 1249 1305 1302 4 1249 1250 1307 1305 4 1250 1251 1308 1307 4 1251 1253 1252 1308 4 1253 1254 1309 1252 4 1254 1206 1255 1309 4 1206 1256 1312 1255 4 1256 1208 1257 1312 4 1208 1211 1258 1257 4 1211 1210 1315 1258 4 1210 1214 1259 1315 4 1214 1216 1261 1259 4 1216 1215 1260 1261 4 1215 1262 1263 1260 4 1262 1237 1292 1263 4 1237 1264 1317 1292 4 1264 1221 1318 1317 4 1221 1265 1321 1318 4 1265 1266 1267 1321 4 1266 1223 1270 1267 4 1223 1268 1269 1270 4 1268 1271 1272 1269 4 1271 1273 1274 1272 4 1273 1225 1326 1274 4 1225 1275 1328 1326 4 1275 1276 1278 1328 4 1276 1279 1277 1278 4 1279 1280 1330 1277 4 1280 1281 1331 1330 4 1281 1282 1335 1331 4 1282 1283 1285 1335 4 1283 1286 1284 1285 4 1286 1288 1287 1284 4 1288 1231 1339 1287 4 1231 1233 1341 1339 4 1233 1232 1343 1341 4 1232 1290 1289 1343 4 1290 1238 1291 1289 4 1238 1237 1292 1291 4 1292 1293 1344 1388 4 1293 1294 1345 1344 4 1294 1295 1298 1345 4 1295 1296 1297 1298 4 1296 1244 1299 1297 4 1244 1243 1350 1299 4 1243 1301 1300 1350 4 1301 1248 1353 1300 4 1248 1302 1303 1353 4 1302 1305 1304 1303 4 1305 1307 1306 1304 4 1307 1308 1356 1306 4 1308 1252 1310 1356 4 1252 1309 1357 1310 4 1309 1255 1311 1357 4 1255 1312 1360 1311 4 1312 1257 1313 1360 4 1257 1258 1314 1313 4 1258 1315 1316 1314 4 1315 1259 1365 1316 4 1259 1261 1366 1365 4 1261 1260 1368 1366 4 1260 1263 1370 1368 4 1263 1292 1388 1370 4 1292 1317 1320 1388 4 1317 1318 1319 1320 4 1318 1321 1322 1319 4 1321 1267 1373 1322 4 1267 1270 1374 1373 4 1270 1269 1323 1374 4 1269 1272 1325 1323 4 1272 1274 1324 1325 4 1274 1326 1327 1324 4 1326 1328 1377 1327 4 1328 1278 1329 1377 4 1278 1277 1379 1329 4 1277 1330 1333 1379 4 1330 1331 1332 1333 4 1331 1335 1334 1332 4 1335 1285 1337 1334 4 1285 1284 1336 1337 4 1284 1287 1338 1336 4 1287 1339 1340 1338 4 1339 1341 1342 1340 4 1341 1343 1384 1342 4 1343 1289 1385 1384 4 1289 1291 1387 1385 4 1291 1292 1388 1387 4 1388 1344 1391 1389 4 1344 1345 1347 1391 4 1345 1298 1346 1347 4 1298 1297 1349 1346 4 1297 1299 1348 1349 4 1299 1350 1352 1348 4 1350 1300 1351 1352 4 1300 1353 1398 1351 4 1353 1303 1354 1398 4 1303 1304 1399 1354 4 1304 1306 1355 1399 4 1306 1356 1402 1355 4 1356 1310 1403 1402 4 1310 1357 1359 1403 4 1357 1311 1358 1359 4 1311 1360 1361 1358 4 1360 1313 1362 1361 4 1313 1314 1363 1362 4 1314 1316 1406 1363 4 1316 1365 1364 1406 4 1365 1366 1367 1364 4 1366 1368 1407 1367 4 1368 1370 1369 1407 4 1370 1388 1389 1369 4 1388 1320 1371 1389 4 1320 1319 1409 1371 4 1319 1322 1372 1409 4 1322 1373 1375 1372 4 1373 1374 1412 1375 4 1374 1323 1376 1412 4 1323 1325 1415 1376 4 1325 1324 1416 1415 4 1324 1327 1417 1416 4 1327 1377 1378 1417 4 1377 1329 1420 1378 4 1329 1379 1421 1420 4 1379 1333 1380 1421 4 1333 1332 1381 1380 4 1332 1334 1423 1381 4 1334 1337 1382 1423 4 1337 1336 1425 1382 4 1336 1338 1427 1425 4 1338 1340 1383 1427 4 1340 1342 1430 1383 4 1342 1384 1386 1430 4 1384 1385 1433 1386 4 1385 1387 1390 1433 4 1387 1388 1389 1390 4 1389 1391 1392 1434 4 1391 1347 1436 1392 4 1347 1346 1393 1436 4 1346 1349 1394 1393 4 1349 1348 1395 1394 4 1348 1352 1397 1395 4 1352 1351 1396 1397 4 1351 1398 1437 1396 4 1398 1354 1438 1437 4 1354 1399 1400 1438 4 1399 1355 1401 1400 4 1355 1402 1440 1401 4 1402 1403 1441 1440 4 1403 1359 1442 1441 4 1359 1358 1404 1442 4 1358 1361 1444 1404 4 1361 1362 1405 1444 4 1362 1363 1445 1405 4 1363 1406 1447 1445 4 1406 1364 1448 1447 4 1364 1367 1451 1448 4 1367 1407 1454 1451 4 1407 1369 1408 1454 4 1369 1389 1434 1408 4 1389 1371 1455 1434 4 1371 1409 1410 1455 4 1409 1372 1411 1410 4 1372 1375 1457 1411 4 1375 1412 1413 1457 4 1412 1376 1460 1413 4 1376 1415 1414 1460 4 1415 1416 1461 1414 4 1416 1417 1418 1461 4 1417 1378 1419 1418 4 1378 1420 1465 1419 4 1420 1421 1422 1465 4 1421 1380 1467 1422 4 1380 1381 1468 1467 4 1381 1423 1424 1468 4 1423 1382 1470 1424 4 1382 1425 1426 1470 4 1425 1427 1428 1426 4 1427 1383 1429 1428 4 1383 1430 1472 1429 4 1430 1386 1432 1472 4 1386 1433 1431 1432 4 1433 1390 1474 1431 4 1390 1389 1434 1474 4 1434 1392 1476 1435 4 1392 1436 1477 1476 4 1436 1393 1479 1477 4 1393 1394 1480 1479 4 1394 1395 1481 1480 4 1395 1397 1483 1481 4 1397 1396 1484 1483 4 1396 1437 1486 1484 4 1437 1438 1439 1486 4 1438 1400 1487 1439 4 1400 1401 1488 1487 4 1401 1440 1491 1488 4 1440 1441 1492 1491 4 1441 1442 1493 1492 4 1442 1404 1443 1493 4 1404 1444 1495 1443 4 1444 1405 1446 1495 4 1405 1445 1498 1446 4 1445 1447 1450 1498 4 1447 1448 1449 1450 4 1448 1451 1453 1449 4 1451 1454 1452 1453 4 1454 1408 1503 1452 4 1408 1434 1435 1503 4 1434 1455 1456 1435 4 1455 1410 1505 1456 4 1410 1411 1506 1505 4 1411 1457 1458 1506 4 1457 1413 1459 1458 4 1413 1460 1510 1459 4 1460 1414 1511 1510 4 1414 1461 1462 1511 4 1461 1418 1463 1462 4 1418 1419 1464 1463 4 1419 1465 1514 1464 4 1465 1422 1466 1514 4 1422 1467 1516 1466 4 1467 1468 1469 1516 4 1468 1424 1471 1469 4 1424 1470 1517 1471 4 1470 1426 1519 1517 4 1426 1428 1520 1519 4 1428 1429 1521 1520 4 1429 1472 1473 1521 4 1472 1432 1525 1473 4 1432 1431 1526 1525 4 1431 1474 1527 1526 4 1474 1434 1435 1527 4 1435 1476 1475 1528 4 1476 1477 1531 1475 4 1477 1479 1478 1531 4 1479 1480 1533 1478 4 1480 1481 1482 1533 4 1481 1483 1485 1482 4 1483 1484 1536 1485 4 1484 1486 1537 1536 4 1486 1439 1540 1537 4 1439 1487 1489 1540 4 1487 1488 1490 1489 4 1488 1491 1541 1490 4 1491 1492 1542 1541 4 1492 1493 1494 1542 4 1493 1443 1544 1494 4 1443 1495 1497 1544 4 1495 1446 1496 1497 4 1446 1498 1499 1496 4 1498 1450 1500 1499 4 1450 1449 1548 1500 4 1449 1453 1501 1548 4 1453 1452 1502 1501 4 1452 1503 1550 1502 4 1503 1435 1528 1550 4 1435 1456 1504 1528 4 1456 1505 1507 1504 4 1505 1506 1508 1507 4 1506 1458 1552 1508 4 1458 1459 1509 1552 4 1459 1510 1512 1509 4 1510 1511 1555 1512 4 1511 1462 1557 1555 4 1462 1463 1513 1557 4 1463 1464 1560 1513 4 1464 1514 1561 1560 4 1514 1466 1515 1561 4 1466 1516 1563 1515 4 1516 1469 1565 1563 4 1469 1471 1566 1565 4 1471 1517 1567 1566 4 1517 1519 1518 1567 4 1519 1520 1522 1518 4 1520 1521 1524 1522 4 1521 1473 1523 1524 4 1473 1525 1569 1523 4 1525 1526 1570 1569 4 1526 1527 1572 1570 4 1527 1435 1528 1572 4 1528 1475 1529 1530 4 1475 1531 1532 1529 4 1531 1478 1573 1532 4 1478 1533 1534 1573 4 1533 1482 1575 1534 4 1482 1485 1535 1575 4 1485 1536 1538 1535 4 1536 1537 1576 1538 4 1537 1540 1539 1576 4 1540 1489 1578 1539 4 1489 1490 1580 1578 4 1490 1541 1581 1580 4 1541 1542 1543 1581 4 1542 1494 1584 1543 4 1494 1544 1585 1584 4 1544 1497 1545 1585 4 1497 1496 1587 1545 4 1496 1499 1546 1587 4 1499 1500 1547 1546 4 1500 1548 1589 1547 4 1548 1501 1591 1589 4 1501 1502 1549 1591 4 1502 1550 1594 1549 4 1550 1528 1530 1594 4 1528 1504 1551 1530 4 1504 1507 1597 1551 4 1507 1508 1598 1597 4 1508 1552 1600 1598 4 1552 1509 1554 1600 4 1509 1512 1553 1554 4 1512 1555 1556 1553 4 1555 1557 1558 1556 4 1557 1513 1603 1558 4 1513 1560 1559 1603 4 1560 1561 1562 1559 4 1561 1515 1605 1562 4 1515 1563 1608 1605 4 1563 1565 1564 1608 4 1565 1566 1610 1564 4 1566 1567 1568 1610 4 1567 1518 1612 1568 4 1518 1522 1613 1612 4 1522 1524 1614 1613 4 1524 1523 1616 1614 4 1523 1569 1571 1616 4 1569 1570 1620 1571 4 1570 1572 1621 1620 4 1572 1528 1530 1621 4 1530 1529 1625 1624 4 1529 1532 1628 1625 4 1532 1573 1574 1628 4 1573 1534 1629 1574 4 1534 1575 1630 1629 4 1575 1535 1631 1630 4 1535 1538 1577 1631 4 1538 1576 1633 1577 4 1576 1539 1579 1633 4 1539 1578 1636 1579 4 1578 1580 1639 1636 4 1580 1581 1583 1639 4 1581 1543 1582 1583 4 1543 1584 1641 1582 4 1584 1585 1643 1641 4 1585 1545 1586 1643 4 1545 1587 1645 1586 4 1587 1546 1588 1645 4 1546 1547 1590 1588 4 1547 1589 1649 1590 4 1589 1591 1593 1649 4 1591 1549 1592 1593 4 1549 1594 1595 1592 4 1594 1530 1624 1595 4 1530 1551 1652 1624 4 1551 1597 1596 1652 4 1597 1598 1654 1596 4 1598 1600 1599 1654 4 1600 1554 1601 1599 4 1554 1553 1658 1601 4 1553 1556 1659 1658 4 1556 1558 1602 1659 4 1558 1603 1604 1602 4 1603 1559 1661 1604 4 1559 1562 1662 1661 4 1562 1605 1607 1662 4 1605 1608 1606 1607 4 1608 1564 1609 1606 4 1564 1610 1666 1609 4 1610 1568 1611 1666 4 1568 1612 1669 1611 4 1612 1613 1615 1669 4 1613 1614 1617 1615 4 1614 1616 1619 1617 4 1616 1571 1618 1619 4 1571 1620 1623 1618 4 1620 1621 1622 1623 4 1621 1530 1624 1622 4 1624 1625 1674 1626 4 1625 1628 1627 1674 4 1628 1574 1676 1627 4 1574 1629 1677 1676 4 1629 1630 1632 1677 4 1630 1631 1678 1632 4 1631 1577 1680 1678 4 1577 1633 1634 1680 4 1633 1579 1635 1634 4 1579 1636 1638 1635 4 1636 1639 1637 1638 4 1639 1583 1640 1637 4 1583 1582 1682 1640 4 1582 1641 1684 1682 4 1641 1643 1642 1684 4 1643 1586 1644 1642 4 1586 1645 1646 1644 4 1645 1588 1647 1646 4 1588 1590 1648 1647 4 1590 1649 1686 1648 4 1649 1593 1688 1686 4 1593 1592 1650 1688 4 1592 1595 1691 1650 4 1595 1624 1626 1691 4 1624 1652 1651 1626 4 1652 1596 1653 1651 4 1596 1654 1693 1653 4 1654 1599 1655 1693 4 1599 1601 1657 1655 4 1601 1658 1656 1657 4 1658 1659 1660 1656 4 1659 1602 1698 1660 4 1602 1604 1699 1698 4 1604 1661 1702 1699 4 1661 1662 1663 1702 4 1662 1607 1665 1663 4 1607 1606 1664 1665 4 1606 1609 1706 1664 4 1609 1666 1707 1706 4 1666 1611 1667 1707 4 1611 1669 1668 1667 4 1669 1615 1670 1668 4 1615 1617 1671 1670 4 1617 1619 1709 1671 4 1619 1618 1710 1709 4 1618 1623 1673 1710 4 1623 1622 1672 1673 4 1622 1624 1626 1672 4 1626 1674 1715 1714 4 1674 1627 1675 1715 4 1627 1676 1717 1675 4 1676 1677 1718 1717 4 1677 1632 1720 1718 4 1632 1678 1679 1720 4 1678 1680 1722 1679 4 1680 1634 1725 1722 4 1634 1635 1681 1725 4 1635 1638 1727 1681 4 1638 1637 1728 1727 4 1637 1640 1729 1728 4 1640 1682 1683 1729 4 1682 1684 1731 1683 4 1684 1642 1685 1731 4 1642 1644 1733 1685 4 1644 1646 1735 1733 4 1646 1647 1736 1735 4 1647 1648 1687 1736 4 1648 1686 1740 1687 4 1686 1688 1689 1740 4 1688 1650 1742 1689 4 1650 1691 1690 1742 4 1691 1626 1714 1690 4 1626 1651 1692 1714 4 1651 1653 1745 1692 4 1653 1693 1746 1745 4 1693 1655 1694 1746 4 1655 1657 1695 1694 4 1657 1656 1749 1695 4 1656 1660 1697 1749 4 1660 1698 1696 1697 4 1698 1699 1701 1696 4 1699 1702 1700 1701 4 1702 1663 1703 1700 4 1663 1665 1704 1703 4 1665 1664 1705 1704 4 1664 1706 1753 1705 4 1706 1707 1755 1753 4 1707 1667 1708 1755 4 1667 1668 1757 1708 4 1668 1670 1758 1757 4 1670 1671 1760 1758 4 1671 1709 1711 1760 4 1709 1710 1712 1711 4 1710 1673 1761 1712 4 1673 1672 1713 1761 4 1672 1626 1714 1713 4 1714 1715 1716 1763 4 1715 1675 1765 1716 4 1675 1717 1768 1765 4 1717 1718 1719 1768 4 1718 1720 1721 1719 4 1720 1679 1723 1721 4 1679 1722 1724 1723 4 1722 1725 1726 1724 4 1725 1681 1771 1726 4 1681 1727 1772 1771 4 1727 1728 1730 1772 4 1728 1729 1773 1730 4 1729 1683 1775 1773 4 1683 1731 1732 1775 4 1731 1685 1734 1732 4 1685 1733 1777 1734 4 1733 1735 1778 1777 4 1735 1736 1737 1778 4 1736 1687 1739 1737 4 1687 1740 1738 1739 4 1740 1689 1741 1738 4 1689 1742 1743 1741 4 1742 1690 1783 1743 4 1690 1714 1763 1783 4 1714 1692 1784 1763 4 1692 1745 1744 1784 4 1745 1746 1747 1744 4 1746 1694 1788 1747 4 1694 1695 1748 1788 4 1695 1749 1790 1748 4 1749 1697 1750 1790 4 1697 1696 1792 1750 4 1696 1701 1793 1792 4 1701 1700 1794 1793 4 1700 1703 1752 1794 4 1703 1704 1751 1752 4 1704 1705 1754 1751 4 1705 1753 1797 1754 4 1753 1755 1756 1797 4 1755 1708 1799 1756 4 1708 1757 1801 1799 4 1757 1758 1802 1801 4 1758 1760 1759 1802 4 1760 1711 1803 1759 4 1711 1712 1804 1803 4 1712 1761 1805 1804 4 1761 1713 1762 1805 4 1713 1714 1763 1762 4 1763 1716 1764 1806 4 1716 1765 1767 1764 4 1765 1768 1766 1767 4 1768 1719 1811 1766 4 1719 1721 1769 1811 4 1721 1723 1812 1769 4 1723 1724 1770 1812 4 1724 1726 1813 1770 4 1726 1771 1814 1813 4 1771 1772 1815 1814 4 1772 1730 1818 1815 4 1730 1773 1774 1818 4 1773 1775 1776 1774 4 1775 1732 1820 1776 4 1732 1734 1821 1820 4 1734 1777 1822 1821 4 1777 1778 1780 1822 4 1778 1737 1779 1780 4 1737 1739 1823 1779 4 1739 1738 1781 1823 4 1738 1741 1826 1781 4 1741 1743 1827 1826 4 1743 1783 1782 1827 4 1783 1763 1806 1782 4 1763 1784 1830 1806 4 1784 1744 1785 1830 4 1744 1747 1787 1785 4 1747 1788 1786 1787 4 1788 1748 1789 1786 4 1748 1790 1834 1789 4 1790 1750 1791 1834 4 1750 1792 1836 1791 4 1792 1793 1837 1836 4 1793 1794 1795 1837 4 1794 1752 1838 1795 4 1752 1751 1839 1838 4 1751 1754 1796 1839 4 1754 1797 1842 1796 4 1797 1756 1798 1842 4 1756 1799 1844 1798 4 1799 1801 1800 1844 4 1801 1802 1846 1800 4 1802 1759 1847 1846 4 1759 1803 1848 1847 4 1803 1804 1849 1848 4 1804 1805 1850 1849 4 1805 1762 1852 1850 4 1762 1763 1806 1852 4 1806 1764 1807 1808 4 1764 1767 1855 1807 4 1767 1766 1809 1855 4 1766 1811 1810 1809 4 1811 1769 1858 1810 4 1769 1812 1859 1858 4 1812 1770 1863 1859 4 1770 1813 1864 1863 4 1813 1814 1816 1864 4 1814 1815 1817 1816 4 1815 1818 1867 1817 4 1818 1774 1868 1867 4 1774 1776 1819 1868 4 1776 1820 1870 1819 4 1820 1821 1872 1870 4 1821 1822 1873 1872 4 1822 1780 1874 1873 4 1780 1779 1875 1874 4 1779 1823 1878 1875 4 1823 1781 1824 1878 4 1781 1826 1825 1824 4 1826 1827 1828 1825 4 1827 1782 1829 1828 4 1782 1806 1808 1829 4 1806 1830 1832 1808 4 1830 1785 1831 1832 4 1785 1787 1833 1831 4 1787 1786 1884 1833 4 1786 1789 1886 1884 4 1789 1834 1835 1886 4 1834 1791 1887 1835 4 1791 1836 1888 1887 4 1836 1837 1889 1888 4 1837 1795 1890 1889 4 1795 1838 1840 1890 4 1838 1839 1891 1840 4 1839 1796 1841 1891 4 1796 1842 1843 1841 4 1842 1798 1894 1843 4 1798 1844 1896 1894 4 1844 1800 1845 1896 4 1800 1846 1898 1845 4 1846 1847 1900 1898 4 1847 1848 1901 1900 4 1848 1849 1902 1901 4 1849 1850 1904 1902 4 1850 1852 1851 1904 4 1852 1806 1808 1851 4 1808 1807 1854 1906 4 1807 1855 1853 1854 4 1855 1809 1856 1853 4 1809 1810 1857 1856 4 1810 1858 1860 1857 4 1858 1859 1862 1860 4 1859 1863 1861 1862 4 1863 1864 1911 1861 4 1864 1816 1865 1911 4 1816 1817 1914 1865 4 1817 1867 1866 1914 4 1867 1868 1916 1866 4 1868 1819 1869 1916 4 1819 1870 1871 1869 4 1870 1872 1917 1871 4 1872 1873 1918 1917 4 1873 1874 1919 1918 4 1874 1875 1876 1919 4 1875 1878 1877 1876 4 1878 1824 1879 1877 4 1824 1825 1921 1879 4 1825 1828 1880 1921 4 1828 1829 1923 1880 4 1829 1808 1906 1923 4 1808 1832 1882 1906 4 1832 1831 1881 1882 4 1831 1833 1883 1881 4 1833 1884 1885 1883 4 1884 1886 1929 1885 4 1886 1835 1930 1929 4 1835 1887 1931 1930 4 1887 1888 1933 1931 4 1888 1889 1935 1933 4 1889 1890 1938 1935 4 1890 1840 1939 1938 4 1840 1891 1892 1939 4 1891 1841 1893 1892 4 1841 1843 1895 1893 4 1843 1894 1942 1895 4 1894 1896 1897 1942 4 1896 1845 1899 1897 4 1845 1898 1947 1899 4 1898 1900 1948 1947 4 1900 1901 1903 1948 4 1901 1902 1949 1903 4 1902 1904 1950 1949 4 1904 1851 1905 1950 4 1851 1808 1906 1905 4 1906 1854 1953 1907 4 1854 1853 1908 1953 4 1853 1856 1956 1908 4 1856 1857 1957 1956 4 1857 1860 1909 1957 4 1860 1862 1910 1909 4 1862 1861 1913 1910 4 1861 1911 1912 1913 4 1911 1865 1961 1912 4 1865 1914 1963 1961 4 1914 1866 1915 1963 4 1866 1916 1964 1915 4 1916 1869 1966 1964 4 1869 1871 1968 1966 4 1871 1917 1969 1968 4 1917 1918 1971 1969 4 1918 1919 1974 1971 4 1919 1876 1975 1974 4 1876 1877 1920 1975 4 1877 1879 1977 1920 4 1879 1921 1980 1977 4 1921 1880 1922 1980 4 1880 1923 1982 1922 4 1923 1906 1907 1982 4 1906 1882 1925 1907 4 1882 1881 1924 1925 4 1881 1883 1926 1924 4 1883 1885 1928 1926 4 1885 1929 1927 1928 4 1929 1930 1932 1927 4 1930 1931 1934 1932 4 1931 1933 1936 1934 4 1933 1935 1987 1936 4 1935 1938 1937 1987 4 1938 1939 1940 1937 4 1939 1892 1988 1940 4 1892 1893 1941 1988 4 1893 1895 1943 1941 4 1895 1942 1945 1943 4 1942 1897 1944 1945 4 1897 1899 1946 1944 4 1899 1947 1992 1946 4 1947 1948 1993 1992 4 1948 1903 1995 1993 4 1903 1949 1951 1995 4 1949 1950 1997 1951 4 1950 1905 1952 1997 4 1905 1906 1907 1952 4 1907 1953 1954 1998 4 1953 1908 2000 1954 4 1908 1956 1955 2000 4 1956 1957 1958 1955 4 1957 1909 2001 1958 4 1909 1910 1960 2001 4 1910 1913 1959 1960 4 1913 1912 2005 1959 4 1912 1961 2006 2005 4 1961 1963 1962 2006 4 1963 1915 1965 1962 4 1915 1964 1967 1965 4 1964 1966 2008 1967 4 1966 1968 1970 2008 4 1968 1969 1973 1970 4 1969 1971 1972 1973 4 1971 1974 2012 1972 4 1974 1975 2013 2012 4 1975 1920 1976 2013 4 1920 1977 1979 1976 4 1977 1980 1978 1979 4 1980 1922 1981 1978 4 1922 1982 2015 1981 4 1982 1907 1998 2015 4 1907 1925 1984 1998 4 1925 1924 1983 1984 4 1924 1926 2017 1983 4 1926 1928 2018 2017 4 1928 1927 1985 2018 4 1927 1932 1986 1985 4 1932 1934 2022 1986 4 1934 1936 2023 2022 4 1936 1987 2024 2023 4 1987 1937 2027 2024 4 1937 1940 2028 2027 4 1940 1988 1989 2028 4 1988 1941 2030 1989 4 1941 1943 1990 2030 4 1943 1945 1991 1990 4 1945 1944 2033 1991 4 1944 1946 2034 2033 4 1946 1992 2035 2034 4 1992 1993 1994 2035 4 1993 1995 2037 1994 4 1995 1951 1996 2037 4 1951 1997 2038 1996 4 1997 1952 2039 2038 4 1952 1907 1998 2039 4 1998 1954 2040 1999 4 1954 2000 2042 2040 4 2000 1955 2044 2042 4 1955 1958 2003 2044 4 1958 2001 2002 2003 4 2001 1960 2004 2002 4 1960 1959 2048 2004 4 1959 2005 2049 2048 4 2005 2006 2007 2049 4 2006 1962 2051 2007 4 1962 1965 2053 2051 4 1965 1967 2055 2053 4 1967 2008 2056 2055 4 2008 1970 2009 2056 4 1970 1973 2011 2009 4 1973 1972 2010 2011 4 1972 2012 2059 2010 4 2012 2013 2060 2059 4 2013 1976 2014 2060 4 1976 1979 2062 2014 4 1979 1978 2063 2062 4 1978 1981 2064 2063 4 1981 2015 2016 2064 4 2015 1998 1999 2016 4 1998 1984 2066 1999 4 1984 1983 2067 2066 4 1983 2017 2019 2067 4 2017 2018 2070 2019 4 2018 1985 2020 2070 4 1985 1986 2073 2020 4 1986 2022 2021 2073 4 2022 2023 2075 2021 4 2023 2024 2026 2075 4 2024 2027 2025 2026 4 2027 2028 2029 2025 4 2028 1989 2031 2029 4 1989 2030 2077 2031 4 2030 1990 2032 2077 4 1990 1991 2079 2032 4 1991 2033 2081 2079 4 2033 2034 2082 2081 4 2034 2035 2084 2082 4 2035 1994 2085 2084 4 1994 2037 2036 2085 4 2037 1996 2088 2036 4 1996 2038 2089 2088 4 2038 2039 2090 2089 4 2039 1998 1999 2090 4 1999 2040 2043 2041 4 2040 2042 2094 2043 4 2042 2044 2046 2094 4 2044 2003 2045 2046 4 2003 2002 2097 2045 4 2002 2004 2047 2097 4 2004 2048 2100 2047 4 2048 2049 2101 2100 4 2049 2007 2050 2101 4 2007 2051 2052 2050 4 2051 2053 2103 2052 4 2053 2055 2054 2103 4 2055 2056 2105 2054 4 2056 2009 2106 2105 4 2009 2011 2057 2106 4 2011 2010 2058 2057 4 2010 2059 2061 2058 4 2059 2060 2107 2061 4 2060 2014 2108 2107 4 2014 2062 2109 2108 4 2062 2063 2112 2109 4 2063 2064 2113 2112 4 2064 2016 2065 2113 4 2016 1999 2041 2065 4 1999 2066 2115 2041 4 2066 2067 2068 2115 4 2067 2019 2069 2068 4 2019 2070 2071 2069 4 2070 2020 2072 2071 4 2020 2073 2118 2072 4 2073 2021 2074 2118 4 2021 2075 2120 2074 4 2075 2026 2122 2120 4 2026 2025 2076 2122 4 2025 2029 2123 2076 4 2029 2031 2127 2123 4 2031 2077 2078 2127 4 2077 2032 2080 2078 4 2032 2079 2129 2080 4 2079 2081 2130 2129 4 2081 2082 2083 2130 4 2082 2084 2133 2083 4 2084 2085 2086 2133 4 2085 2036 2135 2086 4 2036 2088 2087 2135 4 2088 2089 2137 2087 4 2089 2090 2091 2137 4 2090 1999 2041 2091 4 2041 2043 2138 2092 4 2043 2094 2093 2138 4 2094 2046 2095 2093 4 2046 2045 2096 2095 4 2045 2097 2098 2096 4 2097 2047 2099 2098 4 2047 2100 2144 2099 4 2100 2101 2102 2144 4 2101 2050 2145 2102 4 2050 2052 2147 2145 4 2052 2103 2104 2147 4 2103 2054 2149 2104 4 2054 2105 2150 2149 4 2105 2106 2152 2150 4 2106 2057 2154 2152 4 2057 2058 2156 2154 4 2058 2061 2158 2156 4 2061 2107 2160 2158 4 2107 2108 2161 2160 4 2108 2109 2111 2161 4 2109 2112 2110 2111 4 2112 2113 2114 2110 4 2113 2065 2162 2114 4 2065 2041 2092 2162 4 2041 2115 2164 2092 4 2115 2068 2166 2164 4 2068 2069 2168 2166 4 2069 2071 2116 2168 4 2071 2072 2117 2116 4 2072 2118 2119 2117 4 2118 2074 2169 2119 4 2074 2120 2172 2169 4 2120 2122 2121 2172 4 2122 2076 2125 2121 4 2076 2123 2124 2125 4 2123 2127 2126 2124 4 2127 2078 2176 2126 4 2078 2080 2128 2176 4 2080 2129 2178 2128 4 2129 2130 2131 2178 4 2130 2083 2180 2131 4 2083 2133 2132 2180 4 2133 2086 2182 2132 4 2086 2135 2134 2182 4 2135 2087 2136 2134 4 2087 2137 2185 2136 4 2137 2091 2186 2185 4 2091 2041 2092 2186 4 2092 2138 2139 2140 4 2138 2093 2141 2139 4 2093 2095 2142 2141 4 2095 2096 2192 2142 4 2096 2098 2143 2192 4 2098 2099 2195 2143 4 2099 2144 2197 2195 4 2144 2102 2200 2197 4 2102 2145 2146 2200 4 2145 2147 2148 2146 4 2147 2104 2203 2148 4 2104 2149 2151 2203 4 2149 2150 2207 2151 4 2150 2152 2153 2207 4 2152 2154 2155 2153 4 2154 2156 2157 2155 4 2156 2158 2159 2157 4 2158 2160 2213 2159 4 2160 2161 2214 2213 4 2161 2111 2215 2214 4 2111 2110 2218 2215 4 2110 2114 2163 2218 4 2114 2162 2220 2163 4 2162 2092 2140 2220 4 2092 2164 2165 2140 4 2164 2166 2167 2165 4 2166 2168 2224 2167 4 2168 2116 2226 2224 4 2116 2117 2229 2226 4 2117 2119 2171 2229 4 2119 2169 2170 2171 4 2169 2172 2233 2170 4 2172 2121 2173 2233 4 2121 2125 2174 2173 4 2125 2124 2237 2174 4 2124 2126 2175 2237 4 2126 2176 2240 2175 4 2176 2128 2177 2240 4 2128 2178 2179 2177 4 2178 2131 2243 2179 4 2131 2180 2246 2243 4 2180 2132 2181 2246 4 2132 2182 2249 2181 4 2182 2134 2250 2249 4 2134 2136 2184 2250 4 2136 2185 2183 2184 4 2185 2186 2187 2183 4 2186 2092 2140 2187 4 2140 2139 2188 2189 4 2139 2141 2191 2188 4 2141 2142 2190 2191 4 2142 2192 2193 2190 4 2192 2143 2194 2193 4 2143 2195 2196 2194 4 2195 2197 2199 2196 4 2197 2200 2198 2199 4 2200 2146 2202 2198 4 2146 2148 2201 2202 4 2148 2203 2204 2201 4 2203 2151 2205 2204 4 2151 2207 2206 2205 4 2207 2153 2208 2206 4 2153 2155 2209 2208 4 2155 2157 2210 2209 4 2157 2159 2212 2210 4 2159 2213 2211 2212 4 2213 2214 2217 2211 4 2214 2215 2216 2217 4 2215 2218 2219 2216 4 2218 2163 2221 2219 4 2163 2220 2222 2221 4 2220 2140 2189 2222 4 2140 2165 2223 2189 4 2165 2167 2225 2223 4 2167 2224 2228 2225 4 2224 2226 2227 2228 4 2226 2229 2231 2227 4 2229 2171 2230 2231 4 2171 2170 2232 2230 4 2170 2233 2234 2232 4 2233 2173 2236 2234 4 2173 2174 2235 2236 4 2174 2237 2239 2235 4 2237 2175 2238 2239 4 2175 2240 2241 2238 4 2240 2177 2242 2241 4 2177 2179 2245 2242 4 2179 2243 2244 2245 4 2243 2246 2247 2244 4 2246 2181 2248 2247 4 2181 2249 2252 2248 4 2249 2250 2251 2252 4 2250 2184 2253 2251 4 2184 2183 2255 2253 4 2183 2187 2254 2255 4 2187 2140 2189 2254 geomview-1.9.4/data/geom/pieces/0000777000175000001440000000000010665240702013462 500000000000000geomview-1.9.4/data/geom/pieces/cube1.off0000644000175000001440000000052407730233023015067 00000000000000# off file with one integer of color info (used as lookup in cmap) 8 6 12 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 -1.0 -1.0 -1.0 1.0 -1.0 -1.0 -1.0 4 0 2 3 1 6 4 4 5 7 6 7 4 0 4 6 2 8 4 1 3 7 5 9 4 0 1 5 4 11 4 2 6 7 3 10 geomview-1.9.4/data/geom/pieces/linkA.bez0000644000175000001440000000051507730233024015135 00000000000000BBP # Half torus with R=2, r=1 0.00 1.00 0.00 0.00 1.00 1.32 0.00 3.00 1.32 0.00 3.00 0.00 1.32 1.00 0.00 1.32 1.00 1.32 3.95 3.00 1.32 3.95 3.00 0.00 1.32 -1.00 0.00 1.32 -1.00 1.32 3.95 -3.00 1.32 3.95 -3.00 0.00 0.00 -1.00 0.00 0.00 -1.00 1.32 0.00 -3.00 1.32 0.00 -3.00 0.00 geomview-1.9.4/data/geom/pieces/linkB.bez0000644000175000001440000000120507730233024015133 00000000000000BBP # Building block for N-hole torus lying in XY plane # Major radius 2, minor radius 1 0.00 1.00 0.00 0.00 1.00 1.33 0.00 3.00 1.42 0.00 3.00 0.00 0.56 1.00 0.00 0.56 1.00 1.32 0.50 3.00 1.32 0.50 3.00 0.00 1.00 0.56 0.00 0.60 0.70 1.32 0.80 2.75 1.32 0.80 2.75 0.00 1.00 0.00 0.00 1.00 0.00 1.32 1.00 2.60 1.32 1.00 2.60 0.00 1.00 0.00 0.00 1.00 0.00 1.32 1.00 2.60 1.32 1.00 2.60 0.00 1.00 0.00 1.00 1.10 0.30 1.32 1.40 2.30 1.00 1.40 2.30 0.00 1.00 0.00 1.00 1.44 1.00 1.00 1.44 2.00 0.66 1.44 2.00 0.00 2.00 0.00 1.00 2.00 0.56 1.00 2.00 2.00 0.66 2.00 2.00 0.00 geomview-1.9.4/data/geom/octant.bez0000644000175000001440000000052507730233127014124 00000000000000BEZ224 #1 0 0 1 -1 0 -1 -1 0 0 2 2 #-1 1 0 -1 1 -1 1 1 0 0 -2 -2 #0 -2 0 2 0 2 -2 -2 0 0 4 4 #1 0 0 1 1 0 1 1 0 0 2 2 #1 1 0 1 1 1 1 1 0 0 2 2 #0 2 0 2 0 2 2 2 0 0 4 4 #1 0 0 1 1 1 0 1 0 2 0 2 #1 0 1 1 1 1 1 1 0 2 2 2 #0 0 2 2 0 0 2 2 0 0 4 4 0 0 1 1 0 1 1 1 0 2 0 2 1 0 1 1 1 1 1 1 2 2 0 2 2 0 0 2 2 0 0 2 4 0 0 4 geomview-1.9.4/data/geom/camera-frustum0000644000175000001440000000111007730233103014771 00000000000000# # After loading this file, cameras are drawn (when selected with # "Draw other cameras" on the Cameras panel) with their viewing pyramids # shown: small and large white rectangles for the near and far planes, # connected by pale blue lines marking the edges of the viewing pyramid. # (camera-prop { VECT 6 16 3 -4 -4 2 2 2 2 1 1 1 0 0 0 -1 -1 -1.0 1 -1 -1.0 1 1 -1.0 -1 1 -1.0 -1 -1 1.0 1 -1 1.0 1 1 1.0 -1 1 1.0 -1 -1 -1.0 -1 -1 1.0 -1 1 -1.0 -1 1 1.0 1 1 -1.0 1 1 1.0 1 -1 -1.0 1 -1 1.0 .3 .3 .5 1 .1 .1 .8 1 1 1 1 1 } projective) geomview-1.9.4/data/geom/hdodec.off0000644000175000001440000000173607730233114014055 00000000000000OFF 20 12 30 0.485869 0.081684 -0.682249 -0.485869 0.0816845 -0.682249 -0.786152 -0.185585 -0.236068 0.786152 0.185584 0.236068 1.64908e-08 0.249799 0.803619 -0.485867 0.68225 0.0816817 -1.10828e-06 0.721938 0.432444 -0.300283 0.618035 -0.485868 0.300283 0.618035 -0.485867 0.485866 0.68225 0.0816816 0.48587 -0.682248 -0.0816834 0.300283 -0.618035 0.485868 -0.300282 -0.618035 0.485867 1.18342e-06 -0.249798 -0.803619 1.31609e-06 -0.721936 -0.432451 -0.485869 -0.682249 -0.0816828 -0.485868 -0.0816825 0.682249 -0.786152 0.185586 0.236067 0.786152 -0.185584 -0.236069 0.485868 -0.0816818 0.682249 5 3 9 6 4 19 0.800 0.098 0.098 5 13 14 15 2 1 0.098 0.647 0.400 5 3 18 0 8 9 0.098 0.098 0.800 5 2 17 5 7 1 0.898 0.600 0.000 5 11 12 15 14 10 0.000 0.600 0.800 5 7 8 0 13 1 0.498 0.000 0.898 5 5 6 9 8 7 0.498 0.000 0.898 5 11 19 4 16 12 0.000 0.600 0.800 5 17 2 15 12 16 0.898 0.600 0.000 5 18 3 19 11 10 0.098 0.098 0.800 5 14 13 0 18 10 0.098 0.647 0.400 5 17 16 4 6 5 0.800 0.098 0.098 geomview-1.9.4/data/geom/polyhedra/0000777000175000001440000000000010665240702014201 500000000000000geomview-1.9.4/data/geom/polyhedra/cube0000644000175000001440000000047207730233030014754 00000000000000OFF 8 6 12 1.632993 0.000000 1.154701 0.000000 1.632993 1.154701 -1.632993 0.000000 1.154701 -0.000000 -1.632993 1.154701 1.632993 -0.000000 -1.154701 0.000000 1.632993 -1.154701 -1.632993 0.000000 -1.154701 -0.000000 -1.632993 -1.154701 4 0 1 2 3 4 7 4 0 3 4 4 5 1 0 4 5 6 2 1 4 3 2 6 7 4 6 5 4 7 geomview-1.9.4/data/geom/polyhedra/tetrahedron0000644000175000001440000000022507730233037016360 00000000000000OFF 4 4 6 0.0 0.0 2.0 1.632993 -0.942809 -0.666667 0.000000 1.885618 -0.666667 -1.632993 -0.942809 -0.666667 3 1 0 3 3 2 0 1 3 3 0 2 3 3 2 1 geomview-1.9.4/data/geom/polyhedra/icosahedron0000644000175000001440000000102107730233032016325 00000000000000OFF 12 20 30 0.0 0.0 2.0 1.788854 0.000000 0.894427 0.552786 1.701302 0.894427 -1.447214 1.051462 0.894427 -1.447214 -1.051462 0.894427 0.552786 -1.701302 0.894427 1.447214 1.051462 -0.894427 -0.552786 1.701302 -0.894427 -1.788854 0.000000 -0.894427 -0.552786 -1.701302 -0.894427 1.447214 -1.051462 -0.894427 0.0 0.0 -2.0 3 2 0 1 3 3 0 2 3 4 0 3 3 5 0 4 3 1 0 5 3 2 1 6 3 7 2 6 3 3 2 7 3 8 3 7 3 4 3 8 3 9 4 8 3 5 4 9 3 10 5 9 3 6 1 10 3 1 5 10 3 6 11 7 3 7 11 8 3 8 11 9 3 9 11 10 3 10 11 6 geomview-1.9.4/data/geom/polyhedra/cuboctahedron0000644000175000001440000000105307730233031016653 00000000000000OFF 13 14 26 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 0.000000 -1.000000 1.000000 1.000000 1.000000 0.000000 -1.000000 1.000000 0.000000 0.000000 -1.000000 -1.000000 -1.000000 -0.500000 -0.500000 -1.000000 0.000000 -1.000000 -1.000000 -1.000000 0.000000 1.000000 0.000000 -1.000000 -1.000000 0.000000 1.000000 1.000000 -1.000000 0.000000 0.000000 1.000000 -1.000000 3 1 3 0 4 0 10 2 1 3 10 0 4 5 4 7 6 8 10 3 4 12 7 4 3 12 4 0 3 10 8 2 3 7 5 8 4 9 3 1 11 3 9 12 3 3 11 1 2 4 5 11 2 8 4 12 9 5 7 3 9 11 5 geomview-1.9.4/data/geom/polyhedra/truncated_octahedron0000644000175000001440000000157307730233042020243 00000000000000OFF 28 14 44 0 0.447214 0.894427 0.447214 0 0.894427 0 -0.447214 0.894427 0.447214 0.894427 0 0 0.894427 0.447214 -0.223607 0.223607 -0.894427 -0.447214 0.894427 0 0 0.894427 -0.447214 -0.447214 0 -0.894427 0 -0.447214 -0.894427 -0.894427 0.447214 0 -0.447214 0 0.894427 -0.223607 -0.223607 0.894427 -0.894427 -0.447214 0 -0.894427 -0.223607 -0.223607 -0.894427 0 -0.447214 -0.447214 -0.894427 0 0.894427 0.447214 0 -0.894427 0 0.447214 0 -0.894427 0.447214 0.447214 0 -0.894427 0.894427 0 0.447214 0.447214 -0.894427 0 0 0.447214 -0.894427 0.894427 0 -0.447214 0.894427 -0.447214 0 0.894427 -0.223607 -0.223607 0 -0.894427 -0.447214 6 6 10 18 11 0 4 4 4 3 7 6 6 4 0 1 21 17 3 7 23 5 8 15 10 6 7 4 15 13 18 10 4 2 1 0 11 7 16 19 2 12 11 18 13 6 1 2 19 22 25 21 4 22 19 16 27 6 23 7 3 17 24 20 4 20 9 8 23 4 17 21 25 24 7 26 25 22 27 9 20 24 7 13 14 15 8 9 27 16 geomview-1.9.4/data/geom/polyhedra/octahedron0000644000175000001440000000034207730233033016163 00000000000000OFF 6 8 12 0.0 0.0 2.0 2.000000 0.000000 0.000000 0.000000 2.000000 0.000000 -2.000000 0.000000 0.000000 0.000000 -2.000000 0.000000 0.0 0.0 -2.0 3 1 0 4 3 4 0 3 3 3 0 2 3 2 0 1 3 1 5 2 3 2 5 3 3 3 5 4 3 4 5 1 geomview-1.9.4/data/geom/polyhedra/icosidodecahedron0000644000175000001440000000252507730233032017507 00000000000000OFF 31 32 62 -0.309017 -0.425325 0.850651 0.000000 0.525731 0.850651 0.500000 0.688191 0.525731 -0.500000 0.162460 0.850651 -0.500000 0.688191 0.525731 -1.000000 0.000000 0.000000 -0.809017 -0.262866 0.525731 0.309017 -0.425325 0.850651 0.559017 -0.344095 0.688191 0.000000 -0.850651 0.525731 0.809017 -0.262866 0.525731 0.500000 0.162460 0.850651 -0.500000 -0.162460 -0.850651 0.000000 -0.525731 -0.850651 -0.309017 -0.951057 0.000000 0.309017 -0.951057 0.000000 0.500000 -0.688191 -0.525731 0.500000 -0.162460 -0.850651 0.809017 -0.587785 0.000000 1.000000 0.000000 0.000000 0.809017 0.262866 -0.525731 0.809017 0.587785 0.000000 0.309017 0.951057 0.000000 0.000000 0.850651 -0.525731 0.309017 0.425325 -0.850651 -0.309017 0.425325 -0.850651 -0.309017 0.951057 0.000000 -0.809017 0.587785 0.000000 -0.809017 0.262866 -0.525731 -0.809017 -0.587785 0.000000 -0.500000 -0.688191 -0.525731 5 3 0 7 11 1 3 4 3 1 5 1 2 22 26 4 3 26 27 4 5 3 4 27 5 6 3 6 0 3 5 29 14 9 0 6 6 7 9 15 18 10 8 3 7 0 9 3 9 14 15 3 15 16 18 3 11 2 1 3 11 7 10 3 10 18 19 5 21 2 11 10 19 5 13 12 25 24 17 5 14 30 13 16 15 3 13 17 16 5 17 20 19 18 16 3 17 24 20 3 21 19 20 3 21 22 2 5 23 22 21 20 24 3 23 24 25 3 26 22 23 5 27 26 23 25 28 3 28 25 12 3 5 27 28 5 29 5 28 12 30 3 6 5 29 3 14 29 30 3 12 13 30 geomview-1.9.4/data/geom/polyhedra/dodecahedron0000644000175000001440000000142307730233031016453 00000000000000OFF 20 12 30 1.214124 0.000000 1.589309 0.375185 1.154701 1.589309 -0.982247 0.713644 1.589309 -0.982247 -0.713644 1.589309 0.375185 -1.154701 1.589309 1.964494 0.000000 0.375185 0.607062 1.868345 0.375185 -1.589309 1.154701 0.375185 -1.589309 -1.154701 0.375185 0.607062 -1.868345 0.375185 1.589309 1.154701 -0.375185 -0.607062 1.868345 -0.375185 -1.964494 0.000000 -0.375185 -0.607062 -1.868345 -0.375185 1.589309 -1.154701 -0.375185 0.982247 0.713644 -1.589309 -0.375185 1.154701 -1.589309 -1.214124 0.000000 -1.589309 -0.375185 -1.154701 -1.589309 0.982247 -0.713644 -1.589309 5 0 1 2 3 4 5 0 5 10 6 1 5 1 6 11 7 2 5 2 7 12 8 3 5 3 8 13 9 4 5 4 9 14 5 0 5 15 10 5 14 19 5 16 11 6 10 15 5 17 12 7 11 16 5 18 13 8 12 17 5 19 14 9 13 18 5 19 18 17 16 15 geomview-1.9.4/data/geom/polyhedra/truncated_tetrahedron0000644000175000001440000000046107730233042020427 00000000000000OFF 12 8 18 0.25 -0.75 0.25 -0.75 0.25 0.25 -0.25 -0.75 -0.25 -0.75 -0.25 -0.25 0.25 0.75 -0.25 0.25 0.25 -0.75 -0.25 -0.25 -0.75 -0.25 0.25 0.75 0.25 -0.25 0.75 -0.25 0.75 0.25 0.75 -0.25 0.25 0.75 0.25 -0.25 3 10 8 0 3 7 9 1 3 3 6 2 3 4 11 5 6 11 10 0 2 6 5 6 8 7 1 3 2 0 6 9 4 5 6 3 1 6 7 8 10 11 4 9 geomview-1.9.4/data/geom/polyhedra/snub_cube0000644000175000001440000000162407730233036016011 00000000000000OFF 24 38 60 0.295598 -1 -0.543689 1 -0.295598 0.543689 1 -0.543689 -0.295598 0.295598 -0.543689 1 0.543689 0.295598 1 0.543689 -1 0.295598 0.295598 1 0.543689 -0.295598 1 -0.543689 -1 0.543689 -0.295598 -1 -0.295598 -0.543689 -0.543689 0.295598 -1 -0.543689 -1 -0.295598 -0.295598 -0.543689 -1 0.543689 -0.295598 -1 -0.295598 -1 0.543689 1 0.543689 0.295598 -0.543689 -0.295598 1 -1 -0.543689 0.295598 -1 0.295598 0.543689 -0.543689 1 0.295598 -0.295598 0.543689 1 0.295598 0.543689 -1 0.543689 1 -0.295598 1 0.295598 -0.543689 4 4 20 16 3 4 5 14 11 0 4 15 1 2 23 3 14 3 16 3 14 5 3 3 3 5 1 3 3 1 4 3 4 1 15 3 5 2 1 3 5 0 2 4 10 21 13 12 4 19 6 22 7 4 17 18 8 9 3 7 22 21 3 7 21 10 3 8 7 10 3 8 10 9 3 9 10 12 3 13 0 12 3 12 0 11 3 23 2 13 3 21 23 13 3 13 2 0 3 11 14 17 3 20 6 19 3 6 20 4 3 22 15 23 3 6 15 22 3 6 4 15 3 14 16 17 3 18 17 16 3 18 16 20 3 12 11 9 3 8 19 7 3 18 19 8 3 20 19 18 3 11 17 9 3 21 22 23 geomview-1.9.4/data/geom/polyhedra/rhombitruncated_icosidodecahedron0000644000175000001440000001147007730233036022764 00000000000000OFF 124 62 188 0.131496 0.404703 0.904944 0.344261 0.25012 0.904944 -0.344261 0.25012 0.904944 -0.131496 0.404703 0.904944 -0.131496 0.628418 0.766681 -0.344261 0.697549 0.628418 0.131496 -0.404703 0.904944 -0.131496 -0.404703 0.904944 0.42553 0 0.904944 0.344261 -0.25012 0.904944 -0.344261 -0.25012 0.904944 -0.42553 0 0.904944 0.344261 0.697549 0.628418 0.131496 0.628418 0.766681 0.344261 0.921264 0.180989 0.42553 0.809407 0.404703 -0.131496 0.990396 0.0427257 0.131496 0.990396 0.0427257 -0.42553 0.809407 0.404703 -0.344261 0.921264 0.180989 -0.638295 0.0691316 0.766681 -0.769791 -0.111857 0.628418 -0.557026 0.542967 0.628418 -0.557026 0.319252 0.766681 -0.769791 0.612098 0.180989 -0.638295 0.654824 0.404703 -0.982557 0.180989 0.0427257 -0.901288 0.431109 0.0427257 -0.901288 -0.154583 0.404703 -0.982557 -0.0427257 0.180989 -0.262992 -0.585692 0.766681 -0.131496 -0.766681 0.628418 -0.688522 -0.361978 0.628418 -0.475757 -0.431109 0.766681 -0.820019 -0.542967 0.180989 -0.820019 -0.404703 0.404703 -0.475757 -0.878538 0.0427257 -0.688522 -0.723955 0.0427257 -0.131496 -0.904944 0.404703 -0.262992 -0.94767 0.180989 0.475757 -0.431109 0.766681 0.688522 -0.361978 0.628418 0.131496 -0.766681 0.628418 0.262992 -0.585692 0.766681 0.262992 -0.94767 0.180989 0.131496 -0.904944 0.404703 0.688522 -0.723955 0.0427257 0.475757 -0.878538 0.0427257 0.820019 -0.404703 0.404703 0.820019 -0.542967 0.180989 0.557026 0.319252 0.766681 0.557026 0.542967 0.628418 0.769791 -0.111857 0.628418 0.638295 0.0691316 0.766681 0.982557 -0.0427257 0.180989 0.901288 -0.154583 0.404703 0.860653 0.487038 -0.0691316 0.901288 0.431109 0.0427257 0.982557 0.180989 0.0427257 0.638295 0.654824 0.404703 0.769791 0.612098 0.180989 0.131496 -0.404703 -0.904944 0.344261 -0.25012 -0.904944 0.42553 0 -0.904944 0.344261 0.25012 -0.904944 0.131496 0.404703 -0.904944 -0.131496 0.404703 -0.904944 -0.344261 0.25012 -0.904944 -0.410009 0.340615 -0.835813 -0.42553 0 -0.904944 -0.344261 -0.25012 -0.904944 -0.131496 -0.404703 -0.904944 -0.131496 -0.628418 -0.766681 -0.344261 -0.697549 -0.628418 -0.42553 -0.809407 -0.404703 -0.344261 -0.921264 -0.180989 -0.131496 -0.990396 -0.0427257 0.131496 -0.990396 -0.0427257 0.344261 -0.921264 -0.180989 0.42553 -0.809407 -0.404703 0.344261 -0.697549 -0.628418 0.131496 -0.628418 -0.766681 0.557026 -0.319252 -0.766681 0.557026 -0.542967 -0.628418 0.638295 -0.654824 -0.404703 0.769791 -0.612098 -0.180989 0.901288 -0.431109 -0.0427257 0.982557 -0.180989 -0.0427257 0.982557 0.0427257 -0.180989 0.901288 0.154583 -0.404703 0.769791 0.111857 -0.628418 0.638295 -0.0691316 -0.766681 0.369375 0.508401 -0.766681 0.475757 0.431109 -0.766681 0.688522 0.361978 -0.628418 0.820019 0.404703 -0.404703 0.820019 0.542967 -0.180989 0.688522 0.723955 -0.0427257 0.475757 0.878538 -0.0427257 0.262992 0.94767 -0.180989 0.131496 0.904944 -0.404703 0.131496 0.766681 -0.628418 0.262992 0.585692 -0.766681 -0.262992 0.585692 -0.766681 -0.131496 0.766681 -0.628418 -0.131496 0.904944 -0.404703 -0.262992 0.94767 -0.180989 -0.475757 0.878538 -0.0427257 -0.688522 0.723955 -0.0427257 -0.820019 0.542967 -0.180989 -0.75427 0.633461 -0.111857 -0.820019 0.404703 -0.404703 -0.688522 0.361978 -0.628418 -0.475757 0.431109 -0.766681 -0.638295 -0.0691316 -0.766681 -0.769791 0.111857 -0.628418 -0.901288 0.154583 -0.404703 -0.982557 0.0427257 -0.180989 -0.982557 -0.180989 -0.0427257 -0.901288 -0.431109 -0.0427257 -0.769791 -0.612098 -0.180989 -0.638295 -0.654824 -0.404703 -0.557026 -0.542967 -0.628418 -0.557026 -0.319252 -0.766681 6 50 51 12 13 0 1 6 22 23 2 3 4 5 4 6 43 40 9 10 10 7 6 9 8 1 0 3 2 11 4 2 23 20 11 4 4 3 0 13 6 59 60 97 98 14 15 4 14 98 99 17 10 18 5 4 13 12 15 14 17 16 19 6 32 33 10 11 20 21 4 5 18 25 22 10 24 27 26 29 28 21 20 23 22 25 4 7 10 33 30 4 21 28 35 32 6 28 29 118 119 34 35 4 34 119 120 37 4 45 42 31 38 10 38 31 30 33 32 35 34 37 36 39 10 40 43 42 45 44 47 46 49 48 41 6 6 7 30 31 42 43 6 38 39 76 77 44 45 4 55 52 41 48 6 8 9 40 41 52 53 4 50 1 8 53 4 15 12 51 59 10 59 51 50 53 52 55 54 58 57 60 6 103 104 101 102 65 66 10 67 66 65 64 63 62 61 71 70 69 6 122 123 70 71 72 73 10 75 74 73 72 81 80 79 78 77 76 4 39 36 75 76 4 78 47 44 77 4 83 84 79 80 6 61 62 82 83 80 81 4 72 71 61 81 6 85 46 47 78 79 84 4 49 46 85 86 6 87 54 55 48 49 86 4 88 58 54 87 10 90 89 88 87 86 85 84 83 82 91 4 82 62 63 91 4 64 65 102 93 6 90 91 63 64 93 94 4 89 90 94 95 7 56 57 58 88 89 95 96 4 97 60 57 96 6 100 105 106 16 17 99 4 104 105 100 101 11 101 100 99 98 97 96 95 94 93 92 102 4 66 67 113 103 4 19 16 106 107 11 107 106 105 104 103 113 112 111 109 110 108 6 24 25 18 19 107 108 4 27 24 108 109 4 115 116 111 112 7 112 113 68 67 69 114 115 6 26 27 109 111 116 117 4 118 29 26 117 6 74 75 36 37 120 121 4 122 73 74 121 10 122 121 120 119 118 117 116 115 114 123 4 114 69 70 123 geomview-1.9.4/data/geom/polyhedra/snub_dodecahedron0000644000175000001440000000514107730233037017511 00000000000000OFF 60 92 150 0.544149 -0.494938 0.795558 -0.194436 -0.976275 0.427849 -0.302562 -0.670461 0.795558 0.839268 -0.068253 0.681868 -0.868409 -0.600296 0.243894 -0.108126 -1.07458 -0.086901 -0.416538 -0.90411 -0.427849 0.868409 0.486606 -0.427849 0.302562 1.01141 -0.243894 0.32426 -0.7771 -0.681868 -0.32426 0.262351 1 0.638865 0.364572 0.795558 -0.7191 -0.438092 0.681868 0.416538 -0.021651 1 0.194436 -0.819283 0.681868 0.108126 -0.402842 1 -0.349712 -0.227319 1 0.349712 -0.996087 -0.243894 -0.544148 -0.932911 0.086901 -0.868409 0.600296 -0.243894 0.149309 -0.38946 -1 0.638865 -0.364572 -0.795558 0.544149 0.494938 -0.795558 -0.302562 0.670461 -0.795558 0.839268 0.068253 -0.681868 0.194436 0.819283 -0.681868 0.108126 0.402842 -1 -0.7191 0.438092 -0.681868 -0.149309 -0.7191 -0.795558 0.416538 0.021651 -1 -0.839268 -0.638865 -0.243894 -0.988577 0.116766 -0.427849 -1.0554 0.22923 0.086901 -0.544148 0.932911 -0.086901 -0.839268 0.638865 0.243894 -0.149309 0.720255 0.795558 0.149309 0.38946 1 -0.638865 0.548527 0.681868 -0.731143 0.080569 0.795558 0.731142 0.675536 0.427849 -0.108126 1.07458 0.086901 0.720255 0.805802 -0.086901 0.988577 -0.434898 -0.086901 -0.988577 -0.116766 0.427849 -1.0554 -0.227319 -0.086901 0.988577 0.434898 0.086901 1.0554 -0.024789 0.243894 0.720255 -0.805802 0.086901 0.32426 0.7771 0.681868 0.868409 -0.486606 0.427849 0.302562 -1.01141 0.243894 -0.416538 0.90411 0.427849 -0.349712 0.22923 -1 -0.32426 -0.262351 -1 -0.731143 -0.080569 -0.795558 -0.638865 -0.548527 -0.681868 -0.194436 0.976275 -0.427849 0.731142 -0.675536 -0.427849 0.349712 0.996087 0.243894 1.0554 0.024789 -0.243894 5 16 15 13 36 10 5 18 1 2 12 4 5 51 35 48 58 40 5 39 11 3 46 45 5 47 49 0 14 50 5 43 38 37 34 32 5 26 29 20 53 52 5 33 56 23 27 19 5 9 17 5 6 28 5 59 42 57 21 24 5 22 25 8 41 7 5 31 54 55 30 44 3 10 35 37 3 36 11 48 3 13 0 3 3 15 2 14 3 16 38 12 3 51 33 34 3 39 41 58 3 49 42 46 3 1 5 50 3 43 44 4 3 40 8 56 3 45 59 7 3 47 17 57 3 18 30 6 3 32 19 31 3 53 28 55 3 20 21 9 3 29 22 24 3 26 23 25 3 52 54 27 3 10 36 35 3 36 13 11 3 13 15 0 3 15 16 2 3 16 10 38 3 48 35 36 3 3 11 13 3 14 0 15 3 12 2 16 3 37 38 10 3 35 51 37 3 11 39 48 3 0 49 3 3 2 1 14 3 38 43 12 3 51 40 33 3 39 45 41 3 49 47 42 3 1 18 5 3 43 32 44 3 40 58 8 3 45 46 59 3 47 50 17 3 18 4 30 3 32 34 19 3 58 48 39 3 46 3 49 3 50 14 1 3 4 12 43 3 34 37 51 3 53 20 28 3 20 29 21 3 29 26 22 3 26 52 23 3 52 53 54 3 9 28 20 3 24 21 29 3 25 22 26 3 27 23 52 3 55 54 53 3 28 6 55 3 21 57 9 3 22 7 24 3 23 56 25 3 54 31 27 3 6 5 18 3 57 42 47 3 7 41 45 3 56 33 40 3 31 44 32 3 5 17 50 3 42 59 46 3 41 8 58 3 33 19 34 3 44 30 4 3 17 9 57 3 59 24 7 3 8 25 56 3 19 27 31 3 30 55 6 geomview-1.9.4/data/geom/polyhedra/truncated_cube0000644000175000001440000000177307730233040017033 00000000000000OFF 27 14 42 0.678598 0.281085 0.678598 -0.281085 0.678598 0.678598 -0.678598 0.678598 0.281085 0.678598 -0.281085 0.678598 0.281085 -0.678598 0.678598 0.678598 0.678598 0.281085 0.281085 0.678598 0.678598 -0.281085 0.678598 -0.678598 -0.678598 0.281085 -0.678598 -0.678598 0.281085 0.678598 -0.678598 -0.281085 -0.678598 -0.281085 -0.678598 -0.678598 -0.678598 0.678598 -0.281085 0.678598 0.678598 -0.281085 -0.281085 -0.678598 0.678598 -0.678598 -0.281085 0.678598 -0.678598 -0.678598 -0.281085 -0.678598 -0.678598 0.281085 0.678598 -0.678598 0.281085 0.678598 -0.678598 0 0.281085 -0.678598 -0.678598 0.678598 0.281085 -0.678598 0.281085 0.678598 -0.678598 0 0.678598 -0.678598 0.678598 -0.479842 -0.479842 0.678598 -0.281085 -0.678598 0.678598 -0.678598 -0.281085 8 9 15 14 4 3 0 6 1 3 2 9 1 3 6 0 5 8 2 12 8 10 16 17 15 9 9 12 2 1 6 5 13 22 23 7 8 10 8 7 22 21 25 20 11 3 12 7 8 3 11 16 10 3 15 17 14 8 5 0 3 18 26 25 21 13 9 4 14 17 16 11 20 26 19 18 3 3 4 18 3 13 21 22 4 24 26 20 25 geomview-1.9.4/data/geom/polyhedra/rhombicuboctahedron0000644000175000001440000000202707730233034020061 00000000000000OFF 25 26 50 0.357407 0.357407 0.862856 -0.357407 0.357407 0.862856 -0.357407 0.862856 0.357407 0.357407 -0.357407 0.862856 0.862856 0.357407 0.357407 0.357407 0.862856 0.357407 -0.357407 0.357407 -0.862856 -0.862856 0.357407 0.357407 -0.357407 0.862856 -0.357407 -0.357407 -0.357407 -0.862856 -0.862856 0.357407 -0.357407 0.357407 0.862856 -0.357407 -0.357407 -0.357407 0.862856 -0.862856 -0.357407 -0.357407 -0.357407 -0.862856 0.357407 0.862856 0.357407 -0.357407 0.862856 0 -0.357407 -0.862856 -0.357407 0.357407 0.357407 -0.862856 0.357407 0.357407 -0.357407 -0.862856 0.862856 -0.357407 0.357407 0.357407 -0.862856 -0.357407 0.357407 0.357407 -0.862856 0.862856 -0.357407 -0.357407 -0.357407 -0.862856 -0.357407 4 0 1 12 3 4 4 15 11 5 3 0 4 5 4 11 8 2 5 4 2 1 0 5 4 2 8 10 7 3 1 2 7 3 6 10 8 4 6 9 13 10 4 22 6 8 11 4 14 18 3 12 4 1 7 17 12 3 12 17 14 5 4 20 23 16 15 4 7 10 13 17 3 3 18 20 4 4 0 3 20 4 18 14 24 21 4 19 9 6 22 3 11 15 22 4 19 22 15 23 3 21 19 23 4 20 18 21 23 4 9 19 21 24 3 13 9 24 4 14 17 13 24 geomview-1.9.4/data/geom/polyhedra/truncated_dodecahedron0000644000175000001440000000472007730233040020527 00000000000000OFF 66 32 102 0.168381 0.518225 0.838505 -0.440828 0.32028 0.838505 -0.168381 0.518225 0.838505 -0.440828 0.606748 0.661458 0.168381 -0.518225 0.838505 0.492861 0.16014 0.838505 0.544894 0 0.838505 -0.440828 -0.32028 0.838505 0.440828 0.606748 0.661458 0.544894 0.749982 0.374991 -0.168381 0.981739 -0.0885233 0.168381 0.981739 -0.0885233 -0.544894 0 0.838505 -0.713275 0.695271 0.0885233 -0.544894 0.749982 0.374991 -0.881657 -0.286468 0.374991 -0.168381 -0.518225 0.838505 -0.713275 -0.231757 0.661458 -0.881657 -0.463514 0.0885233 -0.713275 -0.695271 -0.0885233 0 -0.927028 0.374991 -0.168381 -0.981739 0.0885233 0.440828 -0.32028 0.838505 0.0841907 -0.634103 0.749982 0 -0.749982 0.661458 0.713275 -0.695271 -0.0885233 0.440828 -0.893216 -0.0885233 0.881657 -0.286468 0.374991 0.881657 -0.463514 0.0885233 0.440828 0.32028 0.838505 0.713275 -0.231757 0.661458 0.985722 0.143234 -0.0885233 0.713275 0.695271 0.0885233 0.168381 -0.518225 -0.838505 0.440828 -0.32028 -0.838505 -0.304605 0.419253 -0.838505 -0.544894 0 -0.838505 -0.304605 -0.419253 -0.838505 -0.168381 -0.518225 -0.838505 -0.544894 -0.749982 -0.374991 -0.440828 -0.893216 -0.0885233 0.168381 -0.981739 0.0885233 0.304605 -0.937477 0 0.544894 -0.749982 -0.374991 0.440828 -0.606748 -0.661458 0.985722 -0.143234 0.0885233 0.713275 0.231757 -0.661458 0.544894 0 -0.838505 0.440828 0.32028 -0.838505 0.881657 0.286468 -0.374991 0.881657 0.374991 -0.231757 0.881657 0.463514 -0.0885233 0.440828 0.893216 0.0885233 0 0.749982 -0.661458 0.168381 0.518225 -0.838505 -0.168381 0.518225 -0.838505 0 0.927028 -0.374991 -0.440828 0.893216 0.0885233 -0.881657 0.463514 -0.0885233 -0.881657 0.286468 -0.374991 -0.713275 0.231757 -0.661458 -0.440828 0.32028 -0.838505 -0.985722 0.143234 -0.0885233 -0.985722 -0.143234 0.0885233 -0.440828 -0.606748 -0.661458 -0.440828 -0.32028 -0.838505 3 3 1 2 11 6 5 29 0 2 1 12 7 16 4 22 10 52 11 10 57 14 3 2 0 8 9 3 57 13 14 10 62 63 15 17 12 1 3 14 13 58 3 4 16 24 10 17 15 18 19 40 21 20 24 16 7 3 12 17 7 3 39 40 19 11 41 26 25 28 27 30 22 4 23 24 20 3 21 41 20 3 0 29 8 3 6 22 30 3 32 52 9 10 9 8 29 6 30 27 45 31 51 32 10 65 36 61 55 54 48 47 34 33 38 11 21 40 39 64 38 33 44 43 26 42 41 3 43 25 26 3 34 44 33 3 27 28 45 10 46 49 31 45 28 25 43 44 34 47 3 48 46 47 4 50 51 31 49 10 52 32 51 49 46 48 54 53 56 11 3 56 10 11 3 54 55 53 3 59 62 58 11 60 59 58 13 57 10 56 53 55 35 61 3 36 60 61 3 15 63 18 10 18 63 62 59 60 36 65 64 39 19 4 37 38 64 65 geomview-1.9.4/data/geom/polyhedra/truncated_icosahedron0000644000175000001440000000466607730233041020420 00000000000000OFF 65 32 99 0.326477 0.106079 0.939234 -0.326477 0.106079 0.939234 0 0.343279 0.939234 0.201774 -0.277718 0.939234 -0.201774 -0.277718 0.939234 0.326477 0.792636 0.514918 0 0.686557 0.727076 0 0.964275 0.171639 0.201774 0.964275 0.171639 -0.326477 0.792636 0.514918 -0.201774 0.964275 0.171639 -0.854729 -0.0655604 0.514918 -0.652955 0.555436 0.514918 -0.652955 0.212158 0.727076 -0.854729 0.489876 0.171639 -0.979432 0.106079 0.171639 -0.201774 -0.833155 0.514918 -0.403548 -0.555436 0.727076 -0.730026 -0.449358 0.514918 -0.730026 -0.661515 0.171639 -0.403548 -0.898715 0.171639 0.792377 -0.257459 0.514918 0.201774 -0.833155 0.514918 0.403548 -0.555436 0.727076 0.403548 -0.898715 0.171639 0.730026 -0.661515 0.171639 0.730026 -0.449358 0.514918 0.652955 0.555436 0.514918 0.652955 0.212158 0.727076 0.979432 0.106079 0.171639 0.854729 -0.0655604 0.514918 0.854729 0.489876 0.171639 0 -0.343279 -0.939234 0.326477 -0.106079 -0.939234 0.201774 0.277718 -0.939234 -0.201774 0.277718 -0.939234 -0.326477 -0.106079 -0.939234 0 -0.686557 -0.727076 0 -0.514918 -0.833155 -0.326477 -0.792636 -0.514918 -0.201774 -0.964275 -0.171639 0.201774 -0.964275 -0.171639 0.326477 -0.792636 -0.514918 0.652955 -0.212158 -0.727076 0.652955 -0.555436 -0.514918 0.854729 -0.489876 -0.171639 0.91708 -0.297978 -0.171639 0.979432 -0.106079 -0.171639 0.854729 0.0655604 -0.514918 0.730026 0.449358 -0.514918 0.730026 0.661515 -0.171639 0.403548 0.898715 -0.171639 0.201774 0.833155 -0.514918 0.403548 0.555436 -0.727076 -0.403548 0.555436 -0.727076 -0.201774 0.833155 -0.514918 -0.403548 0.898715 -0.171639 -0.730026 0.661515 -0.171639 -0.730026 0.449358 -0.514918 -0.652955 -0.212158 -0.727076 -0.753842 -0.0732987 -0.620997 -0.854729 0.0655604 -0.514918 -0.979432 -0.106079 -0.171639 -0.854729 -0.489876 -0.171639 -0.652955 -0.555436 -0.514918 5 4 3 0 2 1 6 7 10 9 6 5 8 6 11 18 17 4 1 13 6 1 2 6 9 12 13 5 14 15 11 13 12 5 19 20 16 17 18 6 40 41 24 22 16 20 7 21 30 28 0 3 23 26 6 3 4 17 16 22 23 5 25 26 23 22 24 6 5 6 2 0 28 27 5 27 28 30 29 31 5 33 32 36 35 34 6 53 49 48 43 33 34 5 42 41 40 39 37 7 42 37 38 32 33 43 44 6 25 24 41 42 44 45 5 44 43 48 47 45 7 46 47 29 30 26 25 45 5 53 52 51 50 49 6 31 29 47 48 49 50 6 51 8 5 27 31 50 6 52 55 56 10 8 51 6 34 35 54 55 52 53 5 54 58 57 56 55 6 14 12 9 10 56 57 6 35 36 59 61 58 54 6 15 14 57 58 61 62 6 19 18 11 15 62 63 6 64 39 40 20 19 63 6 64 63 62 61 60 59 7 36 32 38 37 39 64 59 geomview-1.9.4/data/geom/polyhedra/rhombicosidodecahedron0000644000175000001440000000532007730233034020535 00000000000000OFF 67 62 134 0.223919 0.308198 0.924594 -0.223919 0.308198 0.924594 -0.223919 0.689152 0.689152 0 -0.380954 0.924594 0.293114 0.0952384 0.924594 0.362309 -0.117721 0.924594 -0.362309 -0.117721 0.924594 0.223919 0.689152 0.689152 0.362309 0.879629 0.308198 0 0.99735 0.0727557 -0.362309 0.879629 0.308198 -0.724617 0 0.689152 -0.586228 0.425919 0.689152 -0.724617 0.616396 0.308198 -0.948536 0.308198 0.0727557 -0.948536 -0.0727557 0.308198 -0.111959 -0.535053 0.806873 -0.223919 -0.689152 0.689152 -0.586228 -0.425919 0.689152 -0.810147 -0.498675 0.308198 -0.586228 -0.806873 0.0727557 -0.223919 -0.924594 0.308198 -0.111959 -0.960972 0.117721 0.586228 -0.425919 0.689152 0.223919 -0.689152 0.689152 0.223919 -0.924594 0.308198 0.586228 -0.806873 0.0727557 0.810147 -0.498675 0.308198 0.586228 0.425919 0.689152 0.724617 0 0.689152 0.948536 -0.0727557 0.308198 0.948536 0.308198 0.0727557 0.724617 0.616396 0.308198 0 -0.308198 -0.924594 0.223919 -0.308198 -0.924594 0.362309 0.117721 -0.924594 0 0.380954 -0.924594 -0.362309 0.117721 -0.924594 -0.223919 -0.308198 -0.924594 -0.223919 -0.689152 -0.689152 -0.293114 -0.78439 -0.498675 -0.405073 -0.557535 -0.689152 -0.362309 -0.879629 -0.308198 0 -0.99735 -0.0727557 0.362309 -0.879629 -0.308198 0.223919 -0.689152 -0.689152 0.223919 -0.498675 -0.806873 0.586228 -0.425919 -0.689152 0.724617 -0.616396 -0.308198 0.948536 -0.308198 -0.0727557 0.948536 0.0727557 -0.308198 0.724617 0 -0.689152 0.586228 0.425919 -0.689152 0.810147 0.498675 -0.308198 0.586228 0.806873 -0.0727557 0.223919 0.924594 -0.308198 0.223919 0.689152 -0.689152 -0.223919 0.689152 -0.689152 -0.223919 0.924594 -0.308198 -0.586228 0.806873 -0.0727557 -0.810147 0.498675 -0.308198 -0.586228 0.425919 -0.689152 -0.724617 0 -0.689152 -0.948536 0.0727557 -0.308198 -0.948536 -0.308198 -0.0727557 -0.724617 -0.616396 -0.308198 -0.586228 -0.425919 -0.689152 6 1 6 3 5 4 0 4 29 28 0 5 4 3 24 23 5 4 1 12 11 6 4 2 1 0 7 5 9 10 2 7 8 3 18 6 11 5 13 14 15 11 12 3 1 2 12 4 12 2 10 13 3 60 63 14 4 19 18 11 15 4 17 3 6 18 4 19 64 65 20 5 17 18 19 20 21 4 22 43 25 21 4 20 42 43 21 4 3 16 17 24 5 26 27 23 24 25 4 24 17 21 25 4 25 43 44 26 3 7 0 28 3 5 23 29 3 27 49 30 4 29 23 27 30 5 32 28 29 30 31 4 8 7 28 32 3 54 8 32 4 51 47 34 35 4 56 52 35 36 4 61 57 36 37 6 37 36 35 34 33 38 4 34 45 39 38 4 41 66 38 39 3 20 65 42 6 44 43 42 40 39 45 4 45 46 34 47 4 44 45 47 48 3 26 44 48 4 49 27 26 48 5 48 47 51 50 49 4 31 30 49 50 4 52 53 50 51 3 51 35 52 3 31 50 53 4 54 32 31 53 5 53 52 56 55 54 4 9 8 54 55 3 56 36 57 4 55 56 57 58 3 9 55 58 4 59 10 9 58 3 13 10 59 4 60 14 13 59 4 62 63 60 61 5 60 59 58 57 61 4 37 38 66 62 3 61 37 62 4 64 15 14 63 3 19 15 64 4 39 42 65 66 5 65 64 63 62 66 geomview-1.9.4/data/geom/polyhedra/rhombitruncated_cubeoctahedron0000644000175000001440000000372507730233035022306 00000000000000OFF 52 26 80 0.215739 0.520841 0.825943 0.215739 0.673392 0.673392 0.36829 0.36829 0.825943 0.520841 0.215739 0.825943 -0.520841 0.215739 0.825943 -0.215739 0.520841 0.825943 -0.36829 0.825943 0.36829 -0.215739 0.825943 0.520841 -0.520841 0.825943 0.215739 0.520841 -0.215739 0.825943 0.215739 -0.520841 0.825943 0.825943 0.215739 0.520841 0.825943 0.520841 0.215739 0.520841 0.825943 0.215739 0.215739 0.825943 0.520841 -0.215739 0.520841 -0.825943 -0.520841 0.215739 -0.825943 -0.825943 0.520841 0.215739 -0.825943 0.215739 0.520841 -0.520841 0.825943 -0.215739 -0.215739 0.825943 -0.520841 -0.520841 -0.215739 -0.825943 -0.215739 -0.520841 -0.825943 -0.825943 0.215739 -0.520841 -0.825943 0.520841 -0.215739 0.215739 0.825943 -0.520841 0.520841 0.825943 -0.215739 -0.215739 -0.520841 0.825943 -0.520841 -0.215739 0.825943 -0.825943 -0.520841 -0.215739 -0.825943 -0.215739 -0.520841 -0.520841 -0.825943 0.215739 -0.215739 -0.825943 0.520841 0.825943 0.520841 -0.215739 0.825943 0.215739 -0.520841 -0.825943 -0.215739 0.520841 -0.825943 -0.520841 0.215739 0.215739 -0.825943 0.520841 0.520841 -0.825943 0.215739 0.215739 -0.520841 -0.825943 0.520841 -0.215739 -0.825943 0.825943 -0.520841 0.215739 0.825943 -0.215739 0.520841 0.520841 -0.825943 -0.215739 0.215739 -0.825943 -0.520841 0.520841 0.215739 -0.825943 0.520841 0 -0.825943 0.215739 0.520841 -0.825943 0.825943 -0.215739 -0.520841 0.825943 -0.520841 -0.215739 -0.215739 -0.825943 -0.520841 -0.520841 -0.825943 -0.215739 4 0 14 7 5 4 3 9 42 11 9 13 26 25 20 19 8 6 7 14 7 1 0 3 11 12 13 14 4 8 19 24 17 6 4 5 7 8 17 18 6 15 16 23 24 19 20 6 33 34 45 47 25 26 9 27 10 9 3 2 0 5 4 28 6 21 22 50 51 29 30 4 23 16 21 30 6 27 28 35 36 31 32 4 26 13 12 33 8 33 12 11 42 41 49 48 34 4 28 4 18 35 8 35 18 17 24 23 30 29 36 4 29 51 31 36 4 10 27 32 37 6 42 9 10 37 38 41 6 39 40 48 49 43 44 9 45 46 40 39 22 21 16 15 47 4 15 20 25 47 4 40 45 34 48 4 41 38 43 49 8 44 43 38 37 32 31 51 50 4 22 39 44 50 geomview-1.9.4/data/geom/sample.mesh0000644000175000001440000001013107730233136014263 00000000000000ZMESH 20 20 -0.219157 0.140415 0.461548 0.711596 0.878454 0.968101 0.998789 0.994056 0.976466 0.963128 0.963128 0.976466 0.994056 0.998789 0.968102 0.878454 0.711596 0.461548 0.140416 -0.219157 0.140415 0.499804 0.773227 0.938511 0.998789 0.976466 0.904231 0.816109 0.740817 0.698209 0.698209 0.740817 0.816109 0.904231 0.976466 0.998789 0.938511 0.773228 0.499804 0.140416 0.461548 0.773227 0.954415 0.998444 0.927061 0.780121 0.603206 0.437096 0.311734 0.245084 0.245084 0.311734 0.437096 0.603205 0.780121 0.927061 0.998444 0.954416 0.773228 0.461548 0.711596 0.938511 0.998444 0.904231 0.69821 0.437096 0.176034 -0.0431453 -0.196277 -0.273822 -0.273822 -0.196277 -0.0431456 0.176033 0.437096 0.698209 0.90423 0.998444 0.938511 0.711597 0.878454 0.998789 0.927061 0.69821 0.375793 0.0316473 -0.273822 -0.504476 -0.650363 -0.718644 -0.718644 -0.650363 -0.504476 -0.273823 0.0316467 0.375792 0.698209 0.927061 0.998789 0.878455 0.968101 0.976466 0.780121 0.437096 0.0316473 -0.351404 -0.650363 -0.84101 -0.936316 -0.970072 -0.970072 -0.936316 -0.84101 -0.650363 -0.351405 0.0316465 0.437096 0.78012 0.976466 0.968102 0.998789 0.904231 0.603206 0.176034 -0.273822 -0.650363 -0.892742 -0.992067 -0.991092 -0.961902 -0.961902 -0.991092 -0.992067 -0.892742 -0.650364 -0.273823 0.176033 0.603205 0.90423 0.998789 0.994056 0.816109 0.437096 -0.0431453 -0.504476 -0.84101 -0.992067 -0.961902 -0.823487 -0.699656 -0.699656 -0.823487 -0.961902 -0.992067 -0.841011 -0.504477 -0.0431462 0.437095 0.816108 0.994056 0.976466 0.740817 0.311734 -0.196277 -0.650363 -0.936316 -0.991092 -0.823487 -0.522306 -0.262148 -0.262147 -0.522306 -0.823486 -0.991092 -0.936317 -0.650364 -0.196278 0.311733 0.740816 0.976466 0.963128 0.698209 0.245084 -0.273822 -0.718644 -0.970072 -0.961902 -0.699656 -0.262148 0.193541 0.193541 -0.262147 -0.699655 -0.961902 -0.970072 -0.718644 -0.273823 0.245083 0.698209 0.963128 0.963128 0.698209 0.245084 -0.273822 -0.718644 -0.970072 -0.961902 -0.699656 -0.262147 0.193541 0.193542 -0.262147 -0.699655 -0.961902 -0.970072 -0.718645 -0.273823 0.245083 0.698209 0.963128 0.976466 0.740817 0.311734 -0.196277 -0.650363 -0.936316 -0.991092 -0.823487 -0.522306 -0.262147 -0.262147 -0.522305 -0.823486 -0.991092 -0.936317 -0.650364 -0.196278 0.311733 0.740816 0.976466 0.994056 0.816109 0.437096 -0.0431456 -0.504476 -0.84101 -0.992067 -0.961902 -0.823486 -0.699655 -0.699655 -0.823486 -0.961902 -0.992067 -0.841011 -0.504477 -0.0431465 0.437095 0.816108 0.994056 0.998789 0.904231 0.603205 0.176033 -0.273823 -0.650363 -0.892742 -0.992067 -0.991092 -0.961902 -0.961902 -0.991092 -0.992067 -0.892742 -0.650364 -0.273823 0.176032 0.603205 0.90423 0.998789 0.968102 0.976466 0.780121 0.437096 0.0316467 -0.351405 -0.650364 -0.841011 -0.936317 -0.970072 -0.970072 -0.936317 -0.841011 -0.650364 -0.351406 0.0316459 0.437095 0.78012 0.976466 0.968102 0.878454 0.998789 0.927061 0.698209 0.375792 0.0316465 -0.273823 -0.504477 -0.650364 -0.718644 -0.718645 -0.650364 -0.504477 -0.273823 0.0316459 0.375792 0.698209 0.92706 0.998789 0.878455 0.711596 0.938511 0.998444 0.90423 0.698209 0.437096 0.176033 -0.0431462 -0.196278 -0.273823 -0.273823 -0.196278 -0.0431465 0.176032 0.437095 0.698209 0.90423 0.998444 0.938511 0.711597 0.461548 0.773228 0.954416 0.998444 0.927061 0.78012 0.603205 0.437095 0.311733 0.245083 0.245083 0.311733 0.437095 0.603205 0.78012 0.92706 0.998444 0.954416 0.773228 0.461549 0.140416 0.499804 0.773228 0.938511 0.998789 0.976466 0.90423 0.816108 0.740816 0.698209 0.698209 0.740816 0.816108 0.90423 0.976466 0.998789 0.938511 0.773228 0.499805 0.140417 -0.219157 0.140416 0.461548 0.711597 0.878455 0.968102 0.998789 0.994056 0.976466 0.963128 0.963128 0.976466 0.994056 0.998789 0.968102 0.878455 0.711597 0.461549 0.140417 -0.219156 geomview-1.9.4/data/geom/xyz.vect0000644000175000001440000000041607730233152013644 00000000000000VECT 8 19 3 2 2 2 2 2 3 2 4 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 0 0 0 0 1 0 -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 0 0 0 0 0 1 -.05 .25 1 .05 .25 1 -.05 .05 1 .05 .05 1 1 0 0 1 0 1 0 1 0 .6 1 1 geomview-1.9.4/data/geom/unit.sphere0000644000175000001440000000001707730233146014316 00000000000000SPHERE 1 0 0 0 geomview-1.9.4/data/geom/mushroom.off0000644000175000001440000004033507730233126014501 00000000000000OFF 226 240 928 0.000000 0.471660 0.000000 0.246229 0.459663 -0.006919 0.451282 0.380737 -0.012681 0.587984 0.289183 -0.016522 0.695863 0.205838 -0.019554 0.686805 0.133226 -0.019299 0.643983 0.082083 -0.018096 0.485869 0.097236 -0.013653 0.226464 0.140172 -0.006364 0.063410 0.107339 -0.001782 0.059293 -0.023362 -0.001666 0.162231 -0.244985 -0.004559 0.216582 -0.399048 -0.006086 0.168819 -0.452717 -0.004744 0.098821 -0.458400 -0.002777 0.000000 -0.455243 0.000000 0.207595 0.459663 0.095878 0.380476 0.380737 0.175722 0.495730 0.289183 0.228952 0.586683 0.205838 0.270959 0.579045 0.133226 0.267431 0.542942 0.082083 0.250757 0.409636 0.097236 0.189190 0.190932 0.140172 0.088182 0.053461 0.107339 0.024691 0.049990 -0.023362 0.023088 0.136777 -0.244985 0.063170 0.182601 -0.399048 0.084334 0.142331 -0.452717 0.065736 0.083316 -0.458400 0.038479 0.142896 0.459663 0.142087 0.261897 0.380737 0.260413 0.341231 0.289183 0.339298 0.403838 0.205838 0.401550 0.398581 0.133226 0.396322 0.373729 0.082083 0.371612 0.281969 0.097236 0.280372 0.131426 0.140172 0.130682 0.036799 0.107339 0.036591 0.034410 -0.023362 0.034215 0.094149 -0.244985 0.093616 0.125691 -0.399048 0.124979 0.097972 -0.452717 0.097417 0.057350 -0.458400 0.057025 0.064001 0.459663 0.223138 0.117299 0.380737 0.408962 0.152831 0.289183 0.532845 0.180872 0.205838 0.630607 0.178517 0.133226 0.622398 0.167387 0.082083 0.583592 0.126289 0.097236 0.440306 0.058864 0.140172 0.205227 0.016482 0.107339 0.057464 0.015412 -0.023362 0.053732 0.042168 -0.244985 0.147017 0.056295 -0.399048 0.196272 0.043880 -0.452717 0.152988 0.025686 -0.458400 0.089554 0.000000 0.459663 0.271818 0.000000 0.380737 0.498182 0.000000 0.289183 0.649091 0.000000 0.205838 0.768182 0.000000 0.133226 0.758182 0.000000 0.082083 0.710909 0.000000 0.097236 0.536364 0.000000 0.140172 0.250000 0.000000 0.107339 0.070000 0.000000 -0.023362 0.065455 0.000000 -0.244985 0.179091 0.000000 -0.399048 0.239091 0.000000 -0.452717 0.186364 0.000000 -0.458400 0.109091 -0.097968 0.459663 0.251127 -0.179554 0.380737 0.460260 -0.233944 0.289183 0.599682 -0.276867 0.205838 0.709707 -0.273263 0.133226 0.700469 -0.256225 0.082083 0.656794 -0.193315 0.097236 0.495535 -0.090105 0.140172 0.230970 -0.025229 0.107339 0.064672 -0.023591 -0.023362 0.060472 -0.064548 -0.244985 0.165458 -0.086173 -0.399048 0.220891 -0.067169 -0.452717 0.172178 -0.039318 -0.458400 0.100787 -0.161049 0.459663 0.180883 -0.295167 0.380737 0.331517 -0.384579 0.289183 0.431940 -0.455139 0.205838 0.511190 -0.449215 0.133226 0.504536 -0.421206 0.082083 0.473078 -0.317790 0.097236 0.356926 -0.148122 0.140172 0.166364 -0.041474 0.107339 0.046582 -0.038781 -0.023362 0.043557 -0.106109 -0.244985 0.119177 -0.141659 -0.399048 0.159104 -0.110418 -0.452717 0.124017 -0.064635 -0.458400 0.072595 -0.201079 0.459663 0.110951 -0.368533 0.380737 0.203349 -0.480169 0.289183 0.264947 -0.568267 0.205838 0.313558 -0.560869 0.133226 0.309476 -0.525899 0.082083 0.290180 -0.396778 0.097236 0.218934 -0.184939 0.140172 0.102045 -0.051783 0.107339 0.028573 -0.048420 -0.023362 0.026717 -0.132483 -0.244985 0.073102 -0.176869 -0.399048 0.097593 -0.137864 -0.452717 0.076070 -0.080701 -0.458400 0.044529 -0.215974 0.459663 0.020757 -0.395831 0.380737 0.038043 -0.515736 0.289183 0.049567 -0.610360 0.205838 0.058661 -0.602415 0.133226 0.057898 -0.564854 0.082083 0.054288 -0.426169 0.097236 0.040959 -0.198638 0.140172 0.019091 -0.055619 0.107339 0.005345 -0.052007 -0.023362 0.004998 -0.142297 -0.244985 0.013676 -0.189970 -0.399048 0.018258 -0.148076 -0.452717 0.014231 -0.086678 -0.458400 0.008331 -0.210854 0.459663 -0.093160 -0.386447 0.380737 -0.170741 -0.503510 0.289183 -0.222461 -0.595891 0.205838 -0.263277 -0.588134 0.133226 -0.259850 -0.551463 0.082083 -0.243648 -0.416066 0.097236 -0.183826 -0.193929 0.140172 -0.085682 -0.054300 0.107339 -0.023991 -0.050774 -0.023362 -0.022433 -0.138924 -0.244985 -0.061379 -0.185467 -0.399048 -0.081943 -0.144565 -0.452717 -0.063872 -0.084624 -0.458400 -0.037388 -0.181022 0.459663 -0.192204 -0.331772 0.380737 -0.352268 -0.432273 0.289183 -0.458976 -0.511583 0.205838 -0.543186 -0.504923 0.133226 -0.536115 -0.473441 0.082083 -0.502688 -0.357200 0.097236 -0.379266 -0.166492 0.140172 -0.176777 -0.046618 0.107339 -0.049497 -0.043591 -0.023362 -0.046283 -0.119268 -0.244985 -0.126636 -0.159226 -0.399048 -0.169063 -0.124112 -0.452717 -0.131779 -0.072651 -0.458400 -0.077139 -0.099841 0.459663 -0.231293 -0.182987 0.380737 -0.423907 -0.238417 0.289183 -0.552317 -0.282160 0.205838 -0.653653 -0.278487 0.133226 -0.645144 -0.261123 0.082083 -0.604919 -0.197011 0.097236 -0.456397 -0.091827 0.140172 -0.212727 -0.025712 0.107339 -0.059564 -0.024042 -0.023362 -0.055696 -0.065782 -0.244985 -0.152390 -0.087820 -0.399048 -0.203445 -0.068453 -0.452717 -0.158579 -0.040070 -0.458400 -0.092826 0.000000 0.459663 -0.236729 0.000000 0.380737 -0.433871 0.000000 0.289183 -0.565299 0.000000 0.205838 -0.669017 0.000000 0.133226 -0.660307 0.000000 0.082083 -0.619137 0.000000 0.097236 -0.467124 0.000000 0.140172 -0.217727 0.000000 0.107339 -0.060964 0.000000 -0.023362 -0.057005 0.000000 -0.244985 -0.155972 0.000000 -0.399048 -0.208226 0.000000 -0.452717 -0.162306 0.000000 -0.458400 -0.095008 0.082387 0.459663 -0.203864 0.150996 0.380737 -0.373636 0.196736 0.289183 -0.486818 0.232831 0.205838 -0.576136 0.229801 0.133226 -0.568636 0.215472 0.082083 -0.533182 0.162569 0.097236 -0.402273 0.075774 0.140172 -0.187500 0.021217 0.107339 -0.052500 0.019839 -0.023362 -0.049091 0.054281 -0.244985 -0.134318 0.072467 -0.399048 -0.179318 0.056486 -0.452717 -0.139773 0.033065 -0.458400 -0.081818 0.171522 0.459663 -0.165809 0.314362 0.380737 -0.303891 0.409588 0.289183 -0.395945 0.484737 0.205838 -0.468591 0.478427 0.133226 -0.462491 0.448597 0.082083 -0.433655 0.338455 0.097236 -0.327182 0.157755 0.140172 -0.152500 0.044171 0.107339 -0.042700 0.041303 -0.023362 -0.039927 0.113010 -0.244985 -0.109245 0.150871 -0.399048 -0.145845 0.117599 -0.452717 -0.113682 0.068838 -0.458400 -0.066545 0.236516 0.459663 -0.104020 0.433481 0.380737 -0.190646 0.564791 0.289183 -0.248396 0.668416 0.205838 -0.293970 0.659714 0.133226 -0.290143 0.618581 0.082083 -0.272053 0.466704 0.097236 -0.205257 0.217532 0.140172 -0.095671 0.060909 0.107339 -0.026788 0.056954 -0.023362 -0.025048 0.155832 -0.244985 -0.068535 0.208039 -0.399048 -0.091496 0.162160 -0.452717 -0.071318 0.094923 -0.458400 -0.041747 3 0 1 16 1.000000 0.000000 1.000000 4 1 2 17 16 1.000000 0.000000 1.000000 4 2 3 18 17 1.000000 0.000000 1.000000 4 3 4 19 18 1.000000 0.000000 1.000000 4 4 5 20 19 1.000000 0.000000 1.000000 4 5 6 21 20 1.000000 0.000000 1.000000 4 6 7 22 21 1.000000 0.000000 1.000000 4 7 8 23 22 1.000000 0.000000 1.000000 4 8 9 24 23 1.000000 0.000000 1.000000 4 9 10 25 24 1.000000 0.000000 1.000000 4 10 11 26 25 1.000000 0.000000 1.000000 4 11 12 27 26 1.000000 0.000000 1.000000 4 12 13 28 27 1.000000 0.000000 1.000000 4 13 14 29 28 1.000000 0.000000 1.000000 3 14 15 29 1.000000 0.000000 1.000000 3 0 16 30 1.000000 0.000000 1.000000 4 16 17 31 30 1.000000 0.000000 1.000000 4 17 18 32 31 1.000000 0.000000 1.000000 4 18 19 33 32 1.000000 0.000000 1.000000 4 19 20 34 33 1.000000 0.000000 1.000000 4 20 21 35 34 1.000000 0.000000 1.000000 4 21 22 36 35 1.000000 0.000000 1.000000 4 22 23 37 36 1.000000 0.000000 1.000000 4 23 24 38 37 1.000000 0.000000 1.000000 4 24 25 39 38 1.000000 0.000000 1.000000 4 25 26 40 39 1.000000 0.000000 1.000000 4 26 27 41 40 1.000000 0.000000 1.000000 4 27 28 42 41 1.000000 0.000000 1.000000 4 28 29 43 42 1.000000 0.000000 1.000000 3 29 15 43 1.000000 0.000000 1.000000 3 0 30 44 1.000000 0.000000 1.000000 4 30 31 45 44 1.000000 0.000000 1.000000 4 31 32 46 45 1.000000 0.000000 1.000000 4 32 33 47 46 1.000000 0.000000 1.000000 4 33 34 48 47 1.000000 0.000000 1.000000 4 34 35 49 48 1.000000 0.000000 1.000000 4 35 36 50 49 1.000000 0.000000 1.000000 4 36 37 51 50 1.000000 0.000000 1.000000 4 37 38 52 51 1.000000 0.000000 1.000000 4 38 39 53 52 1.000000 0.000000 1.000000 4 39 40 54 53 1.000000 0.000000 1.000000 4 40 41 55 54 1.000000 0.000000 1.000000 4 41 42 56 55 1.000000 0.000000 1.000000 4 42 43 57 56 1.000000 0.000000 1.000000 3 43 15 57 1.000000 0.000000 1.000000 3 0 44 58 1.000000 0.000000 1.000000 4 44 45 59 58 1.000000 0.000000 1.000000 4 45 46 60 59 1.000000 0.000000 1.000000 4 46 47 61 60 1.000000 0.000000 1.000000 4 47 48 62 61 1.000000 0.000000 1.000000 4 48 49 63 62 1.000000 0.000000 1.000000 4 49 50 64 63 1.000000 0.000000 1.000000 4 50 51 65 64 1.000000 0.000000 1.000000 4 51 52 66 65 1.000000 0.000000 1.000000 4 52 53 67 66 1.000000 0.000000 1.000000 4 53 54 68 67 1.000000 0.000000 1.000000 4 54 55 69 68 1.000000 0.000000 1.000000 4 55 56 70 69 1.000000 0.000000 1.000000 4 56 57 71 70 1.000000 0.000000 1.000000 3 57 15 71 1.000000 0.000000 1.000000 3 0 58 72 1.000000 0.000000 1.000000 4 58 59 73 72 1.000000 0.000000 1.000000 4 59 60 74 73 1.000000 0.000000 1.000000 4 60 61 75 74 1.000000 0.000000 1.000000 4 61 62 76 75 1.000000 0.000000 1.000000 4 62 63 77 76 1.000000 0.000000 1.000000 4 63 64 78 77 1.000000 0.000000 1.000000 4 64 65 79 78 1.000000 0.000000 1.000000 4 65 66 80 79 1.000000 0.000000 1.000000 4 66 67 81 80 1.000000 0.000000 1.000000 4 67 68 82 81 1.000000 0.000000 1.000000 4 68 69 83 82 1.000000 0.000000 1.000000 4 69 70 84 83 1.000000 0.000000 1.000000 4 70 71 85 84 1.000000 0.000000 1.000000 3 71 15 85 1.000000 0.000000 1.000000 3 0 72 86 1.000000 0.000000 1.000000 4 72 73 87 86 1.000000 0.000000 1.000000 4 73 74 88 87 1.000000 0.000000 1.000000 4 74 75 89 88 1.000000 0.000000 1.000000 4 75 76 90 89 1.000000 0.000000 1.000000 4 76 77 91 90 1.000000 0.000000 1.000000 4 77 78 92 91 1.000000 0.000000 1.000000 4 78 79 93 92 1.000000 0.000000 1.000000 4 79 80 94 93 1.000000 0.000000 1.000000 4 80 81 95 94 1.000000 0.000000 1.000000 4 81 82 96 95 1.000000 0.000000 1.000000 4 82 83 97 96 1.000000 0.000000 1.000000 4 83 84 98 97 1.000000 0.000000 1.000000 4 84 85 99 98 1.000000 0.000000 1.000000 3 85 15 99 1.000000 0.000000 1.000000 3 0 86 100 1.000000 0.000000 1.000000 4 86 87 101 100 1.000000 0.000000 1.000000 4 87 88 102 101 1.000000 0.000000 1.000000 4 88 89 103 102 1.000000 0.000000 1.000000 4 89 90 104 103 1.000000 0.000000 1.000000 4 90 91 105 104 1.000000 0.000000 1.000000 4 91 92 106 105 1.000000 0.000000 1.000000 4 92 93 107 106 1.000000 0.000000 1.000000 4 93 94 108 107 1.000000 0.000000 1.000000 4 94 95 109 108 1.000000 0.000000 1.000000 4 95 96 110 109 1.000000 0.000000 1.000000 4 96 97 111 110 1.000000 0.000000 1.000000 4 97 98 112 111 1.000000 0.000000 1.000000 4 98 99 113 112 1.000000 0.000000 1.000000 3 99 15 113 1.000000 0.000000 1.000000 3 0 100 114 1.000000 0.000000 1.000000 4 100 101 115 114 1.000000 0.000000 1.000000 4 101 102 116 115 1.000000 0.000000 1.000000 4 102 103 117 116 1.000000 0.000000 1.000000 4 103 104 118 117 1.000000 0.000000 1.000000 4 104 105 119 118 1.000000 0.000000 1.000000 4 105 106 120 119 1.000000 0.000000 1.000000 4 106 107 121 120 1.000000 0.000000 1.000000 4 107 108 122 121 1.000000 0.000000 1.000000 4 108 109 123 122 1.000000 0.000000 1.000000 4 109 110 124 123 1.000000 0.000000 1.000000 4 110 111 125 124 1.000000 0.000000 1.000000 4 111 112 126 125 1.000000 0.000000 1.000000 4 112 113 127 126 1.000000 0.000000 1.000000 3 113 15 127 1.000000 0.000000 1.000000 3 0 114 128 1.000000 0.000000 1.000000 4 114 115 129 128 1.000000 0.000000 1.000000 4 115 116 130 129 1.000000 0.000000 1.000000 4 116 117 131 130 1.000000 0.000000 1.000000 4 117 118 132 131 1.000000 0.000000 1.000000 4 118 119 133 132 1.000000 0.000000 1.000000 4 119 120 134 133 1.000000 0.000000 1.000000 4 120 121 135 134 1.000000 0.000000 1.000000 4 121 122 136 135 1.000000 0.000000 1.000000 4 122 123 137 136 1.000000 0.000000 1.000000 4 123 124 138 137 1.000000 0.000000 1.000000 4 124 125 139 138 1.000000 0.000000 1.000000 4 125 126 140 139 1.000000 0.000000 1.000000 4 126 127 141 140 1.000000 0.000000 1.000000 3 127 15 141 1.000000 0.000000 1.000000 3 0 128 142 1.000000 0.000000 1.000000 4 128 129 143 142 1.000000 0.000000 1.000000 4 129 130 144 143 1.000000 0.000000 1.000000 4 130 131 145 144 1.000000 0.000000 1.000000 4 131 132 146 145 1.000000 0.000000 1.000000 4 132 133 147 146 1.000000 0.000000 1.000000 4 133 134 148 147 1.000000 0.000000 1.000000 4 134 135 149 148 1.000000 0.000000 1.000000 4 135 136 150 149 1.000000 0.000000 1.000000 4 136 137 151 150 1.000000 0.000000 1.000000 4 137 138 152 151 1.000000 0.000000 1.000000 4 138 139 153 152 1.000000 0.000000 1.000000 4 139 140 154 153 1.000000 0.000000 1.000000 4 140 141 155 154 1.000000 0.000000 1.000000 3 141 15 155 1.000000 0.000000 1.000000 3 0 142 156 1.000000 0.000000 1.000000 4 142 143 157 156 1.000000 0.000000 1.000000 4 143 144 158 157 1.000000 0.000000 1.000000 4 144 145 159 158 1.000000 0.000000 1.000000 4 145 146 160 159 1.000000 0.000000 1.000000 4 146 147 161 160 1.000000 0.000000 1.000000 4 147 148 162 161 1.000000 0.000000 1.000000 4 148 149 163 162 1.000000 0.000000 1.000000 4 149 150 164 163 1.000000 0.000000 1.000000 4 150 151 165 164 1.000000 0.000000 1.000000 4 151 152 166 165 1.000000 0.000000 1.000000 4 152 153 167 166 1.000000 0.000000 1.000000 4 153 154 168 167 1.000000 0.000000 1.000000 4 154 155 169 168 1.000000 0.000000 1.000000 3 155 15 169 1.000000 0.000000 1.000000 3 0 156 170 1.000000 0.000000 1.000000 4 156 157 171 170 1.000000 0.000000 1.000000 4 157 158 172 171 1.000000 0.000000 1.000000 4 158 159 173 172 1.000000 0.000000 1.000000 4 159 160 174 173 1.000000 0.000000 1.000000 4 160 161 175 174 1.000000 0.000000 1.000000 4 161 162 176 175 1.000000 0.000000 1.000000 4 162 163 177 176 1.000000 0.000000 1.000000 4 163 164 178 177 1.000000 0.000000 1.000000 4 164 165 179 178 1.000000 0.000000 1.000000 4 165 166 180 179 1.000000 0.000000 1.000000 4 166 167 181 180 1.000000 0.000000 1.000000 4 167 168 182 181 1.000000 0.000000 1.000000 4 168 169 183 182 1.000000 0.000000 1.000000 3 169 15 183 1.000000 0.000000 1.000000 3 0 170 184 1.000000 0.000000 1.000000 4 170 171 185 184 1.000000 0.000000 1.000000 4 171 172 186 185 1.000000 0.000000 1.000000 4 172 173 187 186 1.000000 0.000000 1.000000 4 173 174 188 187 1.000000 0.000000 1.000000 4 174 175 189 188 1.000000 0.000000 1.000000 4 175 176 190 189 1.000000 0.000000 1.000000 4 176 177 191 190 1.000000 0.000000 1.000000 4 177 178 192 191 1.000000 0.000000 1.000000 4 178 179 193 192 1.000000 0.000000 1.000000 4 179 180 194 193 1.000000 0.000000 1.000000 4 180 181 195 194 1.000000 0.000000 1.000000 4 181 182 196 195 1.000000 0.000000 1.000000 4 182 183 197 196 1.000000 0.000000 1.000000 3 183 15 197 1.000000 0.000000 1.000000 3 0 184 198 1.000000 0.000000 1.000000 4 184 185 199 198 1.000000 0.000000 1.000000 4 185 186 200 199 1.000000 0.000000 1.000000 4 186 187 201 200 1.000000 0.000000 1.000000 4 187 188 202 201 1.000000 0.000000 1.000000 4 188 189 203 202 1.000000 0.000000 1.000000 4 189 190 204 203 1.000000 0.000000 1.000000 4 190 191 205 204 1.000000 0.000000 1.000000 4 191 192 206 205 1.000000 0.000000 1.000000 4 192 193 207 206 1.000000 0.000000 1.000000 4 193 194 208 207 1.000000 0.000000 1.000000 4 194 195 209 208 1.000000 0.000000 1.000000 4 195 196 210 209 1.000000 0.000000 1.000000 4 196 197 211 210 1.000000 0.000000 1.000000 3 197 15 211 1.000000 0.000000 1.000000 3 0 198 212 1.000000 0.000000 1.000000 4 198 199 213 212 1.000000 0.000000 1.000000 4 199 200 214 213 1.000000 0.000000 1.000000 4 200 201 215 214 1.000000 0.000000 1.000000 4 201 202 216 215 1.000000 0.000000 1.000000 4 202 203 217 216 1.000000 0.000000 1.000000 4 203 204 218 217 1.000000 0.000000 1.000000 4 204 205 219 218 1.000000 0.000000 1.000000 4 205 206 220 219 1.000000 0.000000 1.000000 4 206 207 221 220 1.000000 0.000000 1.000000 4 207 208 222 221 1.000000 0.000000 1.000000 4 208 209 223 222 1.000000 0.000000 1.000000 4 209 210 224 223 1.000000 0.000000 1.000000 4 210 211 225 224 1.000000 0.000000 1.000000 3 211 15 225 1.000000 0.000000 1.000000 3 0 212 1 1.000000 0.000000 1.000000 4 212 213 2 1 1.000000 0.000000 1.000000 4 213 214 3 2 1.000000 0.000000 1.000000 4 214 215 4 3 1.000000 0.000000 1.000000 4 215 216 5 4 1.000000 0.000000 1.000000 4 216 217 6 5 1.000000 0.000000 1.000000 4 217 218 7 6 1.000000 0.000000 1.000000 4 218 219 8 7 1.000000 0.000000 1.000000 4 219 220 9 8 1.000000 0.000000 1.000000 4 220 221 10 9 1.000000 0.000000 1.000000 4 221 222 11 10 1.000000 0.000000 1.000000 4 222 223 12 11 1.000000 0.000000 1.000000 4 223 224 13 12 1.000000 0.000000 1.000000 4 224 225 14 13 1.000000 0.000000 1.000000 3 225 15 14 1.000000 0.000000 1.000000 geomview-1.9.4/data/geom/link2.grp0000644000175000001440000000066507730233124013665 00000000000000GROUP # Reflect about X and Z axes 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 unit { = LIST { = INST # Semicircular ends of torus transform 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 unit < pieces/linkA.bez } { = GROUP # Joining pieces 1 0 0 0 0 1 0 0 0 0 1 0 -2 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 0 1 unit < pieces/linkB.bez } } geomview-1.9.4/data/geom/ico.grp0000644000175000001440000001353307730233116013417 00000000000000GROUP 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0.309017 0.951057 0 0 -0.951057 0.309017 0 0 0 0 1 0 0 0 0 1 -0.809017 0.587785 0 0 -0.587785 -0.809017 0 0 0 0 1 0 0 0 0 1 -0.809017 -0.587785 0 0 0.587785 -0.809017 0 0 0 0 1 0 0 0 0 1 0.309017 -0.951057 0 0 0.951057 0.309017 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 -0.447214 0.894427 0 0 0.894427 0.447214 0 0 0 0 1 -0.309017 -0.425325 0.850651 0 0.951057 -0.138197 0.276393 0 0 0.894427 0.447214 0 0 0 0 1 0.809017 -0.262866 0.525731 0 0.587785 0.361803 -0.723607 0 0 0.894427 0.447214 0 0 0 0 1 0.809017 0.262866 -0.525731 0 -0.587785 0.361803 -0.723607 0 0 0.894427 0.447214 0 0 0 0 1 -0.309017 0.425325 -0.850651 0 -0.951057 -0.138197 0.276393 0 0 0.894427 0.447214 0 0 0 0 1 -0.309017 -0.951057 0 0 0.425325 -0.138197 0.894427 0 -0.850651 0.276393 0.447214 0 0 0 0 1 0.309017 -0.425325 0.850651 0 0.425325 0.861803 0.276393 0 -0.850651 0.276393 0.447214 0 0 0 0 1 0.5 0.688191 0.525731 0 -0.16246 0.67082 -0.723607 0 -0.850651 0.276393 0.447214 0 0 0 0 1 5.08989e-09 0.850651 -0.525731 0 -0.525731 -0.447214 -0.723607 0 -0.850651 0.276393 0.447214 0 0 0 0 1 -0.5 -0.16246 -0.850651 0 -0.16246 -0.947214 0.276393 0 -0.850651 0.276393 0.447214 0 0 0 0 1 0.809017 -0.587785 0 0 0.262866 0.361803 0.894427 0 -0.525731 -0.723607 0.447214 0 0 0 0 1 0.5 0.16246 0.850651 0 -0.688191 0.67082 0.276393 0 -0.525731 -0.723607 0.447214 0 0 0 0 1 -0.5 0.688191 0.525731 0 -0.688191 0.0527864 -0.723607 0 -0.525731 -0.723607 0.447214 0 0 0 0 1 -0.809017 0.262866 -0.525731 0 0.262866 -0.638197 -0.723607 0 -0.525731 -0.723607 0.447214 0 0 0 0 1 1.85405e-08 -0.525731 -0.850651 0 0.850651 -0.447214 0.276393 0 -0.525731 -0.723607 0.447214 0 0 0 0 1 0.809017 0.587785 0 0 -0.262866 0.361803 0.894427 0 0.525731 -0.723607 0.447214 0 0 0 0 1 -5.57011e-09 0.525731 0.850651 0 -0.850651 -0.447214 0.276393 0 0.525731 -0.723607 0.447214 0 0 0 0 1 -0.809017 -0.262866 0.525731 0 -0.262866 -0.638197 -0.723607 0 0.525731 -0.723607 0.447214 0 0 0 0 1 -0.5 -0.688191 -0.525731 0 0.688191 0.0527864 -0.723607 0 0.525731 -0.723607 0.447214 0 0 0 0 1 0.5 -0.16246 -0.850651 0 0.688191 0.670821 0.276393 0 0.525731 -0.723607 0.447214 0 0 0 0 1 -0.309017 0.951057 0 0 -0.425325 -0.138197 0.894427 0 0.850651 0.276393 0.447214 0 0 0 0 1 -0.5 0.16246 0.850651 0 0.16246 -0.947214 0.276393 0 0.850651 0.276393 0.447214 0 0 0 0 1 1.35325e-08 -0.850651 0.525731 0 0.525731 -0.447214 -0.723607 0 0.850651 0.276393 0.447214 0 0 0 0 1 0.5 -0.688191 -0.525731 0 0.16246 0.670821 -0.723607 0 0.850651 0.276393 0.447214 0 0 0 0 1 0.309017 0.425325 -0.850651 0 -0.425325 0.861804 0.276393 0 0.850651 0.276393 0.447214 0 0 0 0 1 1 -3.50347e-08 2.6656e-08 0 3.50347e-08 -1 0 0 -2.39749e-08 -1.55298e-08 -1 0 0 0 0 1 0.309017 0.951057 2.6656e-08 0 0.951057 -0.309017 0 0 7.36109e-09 -2.76005e-08 -1 0 0 0 0 1 -0.809017 0.587785 2.6656e-08 0 0.587785 0.809017 0 0 2.85243e-08 -1.52821e-09 -1 0 0 0 0 1 -0.809017 -0.587785 2.6656e-08 0 -0.587785 0.809017 0 0 1.02679e-08 2.6656e-08 -1 0 0 0 0 1 0.309017 -0.951057 2.6656e-08 0 -0.951057 -0.309017 0 0 -2.21784e-08 1.80025e-08 -1 0 0 0 0 1 -1 3.95099e-08 -1.94151e-08 0 -3.50347e-08 0.447214 -0.894427 0 2.39749e-08 -0.894427 -0.447214 0 0 0 0 1 -0.309017 -0.425325 0.850651 0 -0.951057 0.138197 -0.276393 0 -7.36109e-09 -0.894427 -0.447214 0 0 0 0 1 0.809017 -0.262866 0.525731 0 -0.587785 -0.361803 0.723607 0 -2.85243e-08 -0.894427 -0.447214 0 0 0 0 1 0.809017 0.262866 -0.525731 0 0.587785 -0.361803 0.723607 0 -1.02679e-08 -0.894427 -0.447214 0 0 0 0 1 -0.309017 0.425326 -0.850651 0 0.951057 0.138197 -0.276393 0 2.21784e-08 -0.894427 -0.447214 0 0 0 0 1 -0.309017 -0.951057 -1.94151e-08 0 -0.425325 0.138197 -0.894427 0 0.850651 -0.276393 -0.447214 0 0 0 0 1 0.309017 -0.425326 0.850651 0 -0.425325 -0.861804 -0.276393 0 0.850651 -0.276393 -0.447214 0 0 0 0 1 0.5 0.688191 0.525731 0 0.16246 -0.670821 0.723607 0 0.850651 -0.276393 -0.447214 0 0 0 0 1 8.3379e-10 0.850651 -0.525731 0 0.525731 0.447214 0.723607 0 0.850651 -0.276393 -0.447214 0 0 0 0 1 -0.5 -0.16246 -0.850651 0 0.16246 0.947214 -0.276393 0 0.850651 -0.276393 -0.447214 0 0 0 0 1 0.809017 -0.587785 -1.94151e-08 0 -0.262866 -0.361803 -0.894427 0 0.525731 0.723607 -0.447214 0 0 0 0 1 0.5 0.16246 0.850651 0 0.688191 -0.670821 -0.276393 0 0.525731 0.723607 -0.447214 0 0 0 0 1 -0.5 0.688191 0.525731 0 0.688191 -0.0527864 0.723607 0 0.525731 0.723607 -0.447214 0 0 0 0 1 -0.809017 0.262866 -0.525731 0 -0.262866 0.638197 0.723607 0 0.525731 0.723607 -0.447214 0 0 0 0 1 -2.52757e-08 -0.525731 -0.850651 0 -0.850651 0.447214 -0.276393 0 0.525731 0.723607 -0.447214 0 0 0 0 1 0.809017 0.587785 -1.94151e-08 0 0.262866 -0.361803 -0.894427 0 -0.525731 0.723607 -0.447214 0 0 0 0 1 3.82461e-08 0.525731 0.850651 0 0.850651 0.447214 -0.276393 0 -0.525731 0.723607 -0.447214 0 0 0 0 1 -0.809017 -0.262866 0.525731 0 0.262866 0.638197 0.723607 0 -0.525731 0.723607 -0.447214 0 0 0 0 1 -0.5 -0.688191 -0.525731 0 -0.688191 -0.0527865 0.723607 0 -0.525731 0.723607 -0.447214 0 0 0 0 1 0.5 -0.16246 -0.850651 0 -0.688191 -0.670821 -0.276393 0 -0.525731 0.723607 -0.447214 0 0 0 0 1 -0.309017 0.951057 -1.94151e-08 0 0.425325 0.138197 -0.894427 0 -0.850651 -0.276393 -0.447214 0 0 0 0 1 -0.5 0.16246 0.850651 0 -0.16246 0.947214 -0.276393 0 -0.850651 -0.276393 -0.447214 0 0 0 0 1 1.77886e-08 -0.850651 0.525731 0 -0.525731 0.447214 0.723607 0 -0.850651 -0.276393 -0.447214 0 0 0 0 1 0.5 -0.688191 -0.525731 0 -0.16246 -0.670821 0.723607 0 -0.850651 -0.276393 -0.447214 0 0 0 0 1 0.309017 0.425326 -0.850651 0 0.425326 -0.861804 -0.276393 0 -0.850651 -0.276393 -0.447214 0 0 0 0 1 unit { = CQUAD 0.000000 0.000000 5.137791 .8 .8 .8 .5 0.425325 0.138197 0.723607 .8 .8 .8 .5 0.000000 0.525731 0.850651 .8 .8 .8 .5 0.000000 0.000000 5.137791 .8 .8 .8 .5 0.425325 0.138197 0.723607 .8 .8 .8 .5 0.994885 1.369342 2.215641 .8 .8 .8 .5 0.000000 0.525731 0.850651 .8 .8 .8 .5 0.425325 0.138197 0.723607 .8 .8 .8 .5 } geomview-1.9.4/data/geom/link8.grp0000644000175000001440000000154007730233124013664 00000000000000GROUP # Reflect about X and Z axes 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 unit { = LIST { = INST # Semicircular ends of torus transform 1 0 0 0 0 1 0 0 0 0 1 0 14 0 0 1 unit < pieces/linkA.bez } { = GROUP # Joining pieces 1 0 0 0 0 1 0 0 0 0 1 0 -14 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -14 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 -10 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -10 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 -6 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -6 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 -2 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 6 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 6 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 10 0 0 1 1 0 0 0 0 -1 0 0 0 0 1 0 10 0 0 1 unit < pieces/linkB.bez } } geomview-1.9.4/data/geom/icosa.off0000644000175000001440000000154107730233117013722 00000000000000OFF 12 20 30 0.0 0.0 2.0 1.788854 0.000000 0.894427 0.552786 1.701302 0.894427 -1.447214 1.051462 0.894427 -1.447214 -1.051462 0.894427 0.552786 -1.701302 0.894427 1.447214 1.051462 -0.894427 -0.552786 1.701302 -0.894427 -1.788854 0.000000 -0.894427 -0.552786 -1.701302 -0.894427 1.447214 -1.051462 -0.894427 0.0 0.0 -2.0 3 2 0 1 0.784 0.000 0.000 3 3 0 2 0.784 0.000 0.000 3 4 0 3 0.784 0.000 0.000 3 5 0 4 0.784 0.000 0.000 3 1 0 5 0.784 0.000 0.000 3 2 1 6 0.784 0.000 0.000 3 7 2 6 0.784 0.000 0.000 3 3 2 7 0.784 0.000 0.000 3 8 3 7 0.784 0.000 0.000 3 4 3 8 0.784 0.000 0.000 3 9 4 8 0.784 0.000 0.000 3 5 4 9 0.784 0.000 0.000 3 10 5 9 0.784 0.000 0.000 3 6 1 10 0.784 0.000 0.000 3 1 5 10 0.784 0.000 0.000 3 6 11 7 0.784 0.000 0.000 3 7 11 8 0.784 0.000 0.000 3 8 11 9 0.784 0.000 0.000 3 9 11 10 0.784 0.000 0.000 3 10 11 6 0.784 0.000 0.000 geomview-1.9.4/data/geom/torus.bez0000644000175000001440000000077407730233143014014 00000000000000#rational patches for torus (exact) BEZ224 -1.0 .5 0 1 0 0 1.0 0 1.0 .5 0 1 -.5 0 0 0 0 0 .5 0 .5 0 0 0 -1.0 -.5 0 1 0 0 1.0 0 1.0 -.5 0 1 -1.0 -.5 0 1 0 0 1.0 0 1.0 -.5 0 1 .5 0 0 0 0 0 -.5 0 -.5 0 0 0 -1.0 .5 0 1 0 0 1.0 0 1.0 .5 0 1 -1.0 -.5 0 1 0 0 -1.0 0 1.0 -.5 0 1 -.5 0 0 0 0 0 -.5 0 .5 0 0 0 -1.0 .5 0 1 0 0 -1.0 0 1.0 .5 0 1 -1.0 .5 0 1 0 0 -1.0 0 1.0 .5 0 1 .5 0 0 0 0 0 .5 0 -.5 0 0 0 -1.0 -.5 0 1 0 0 -1.0 0 1.0 -.5 0 1 geomview-1.9.4/data/geom/xwyezed.vect0000644000175000001440000000105707730233151014512 00000000000000VECT 14 41 3 2 2 2 2 5 2 3 2 4 2 4 2 4 5 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 -.05 .05 1 .05 .25 1 .05 .05 1 -.05 .25 0 0 0 0 1 0 .175 1 .25 .15 1 .05 .125 1 .25 .10 1 .05 .075 1 .25 -.05 1 .25 0 1 .15 .05 1 .25 0 1 .15 0 1 .05 -.075 1 .15 -.125 1 .15 -.175 1 .25 -.075 1 .25 -.075 1 .05 -.175 1 .05 0 0 0 0 0 1 -.175 .25 1 -.075 .25 1 -.175 .05 1 -.075 .05 1 -.05 .15 1 0 .15 1 .05 .25 1 -.05 .25 1 -.05 .05 1 .05 .05 1 .075 .25 1 .075 .05 1 .175 .08 1 .175 .22 1 .075 .25 1 0 .8 0 1 .9 .9 0 1 0 .6 1 1 geomview-1.9.4/data/geom/trapezoid.4d.off0000644000175000001440000000073207730233011015125 000000000000004OFF 8 6 12 -1.000000 -1.000000 1.000000 1.0 -1.000000 1.000000 1.000000 1.0 1.000000 1.000000 1.000000 2.0 1.000000 -1.000000 1.000000 2.0 -1.000000 -1.000000 -1.000000 1.0 -1.000000 1.000000 -1.000000 1.0 1.000000 1.000000 -1.000000 2.0 1.000000 -1.000000 -1.000000 2.0 4 0 1 2 3 0.500000 1.000000 0.500000 4 4 5 1 0 1.0 .5 .5 4 2 1 5 6 0.500000 1.000000 0.500000 4 2 6 7 3 1.0 .5 .5 4 0 3 7 4 0.500000 1.000000 0.500000 4 7 6 5 4 0.500000 1.000000 0.500000 geomview-1.9.4/data/geom/teapot.bez0000644000175000001440000003003707730233141014125 00000000000000BBP 0.850000 0.000000 0.863037 0.850000 0.195999 0.863037 0.696000 0.350000 0.863037 0.500000 0.350000 0.863037 0.834375 0.000000 0.895020 0.834375 0.187250 0.895020 0.687250 0.334379 0.895020 0.500000 0.334379 0.895020 0.859375 0.000000 0.895020 0.859375 0.201250 0.895020 0.701250 0.359381 0.895020 0.500000 0.359381 0.895020 0.875000 0.000000 0.863037 0.875000 0.209999 0.863037 0.710000 0.375000 0.863037 0.500000 0.375000 0.863037 0.500000 0.350000 0.863037 0.304000 0.350000 0.863037 0.150000 0.195999 0.863037 0.150000 0.000000 0.863037 0.500000 0.334379 0.895020 0.312750 0.334379 0.895020 0.165625 0.187250 0.895020 0.165625 0.000000 0.895020 0.500000 0.359381 0.895020 0.298750 0.359381 0.895020 0.140625 0.201250 0.895020 0.140625 0.000000 0.895020 0.500000 0.375000 0.863037 0.290000 0.375000 0.863037 0.125000 0.209999 0.863037 0.125000 0.000000 0.863037 0.150000 0.000000 0.863037 0.150000 -0.195999 0.863037 0.304000 -0.350000 0.863037 0.500000 -0.350000 0.863037 0.165625 0.000000 0.895020 0.165625 -0.187250 0.895020 0.312750 -0.334379 0.895020 0.500000 -0.334379 0.895020 0.140625 0.000000 0.895020 0.140625 -0.201250 0.895020 0.298750 -0.359369 0.895020 0.500000 -0.359369 0.895020 0.125000 0.000000 0.863037 0.125000 -0.209999 0.863037 0.290000 -0.375000 0.863037 0.500000 -0.375000 0.863037 0.500000 -0.350000 0.863037 0.696000 -0.350000 0.863037 0.850000 -0.195999 0.863037 0.850000 0.000000 0.863037 0.500000 -0.334379 0.895020 0.687250 -0.334379 0.895020 0.834375 -0.187250 0.895020 0.834375 0.000000 0.895020 0.500000 -0.359369 0.895020 0.701250 -0.359369 0.895020 0.859375 -0.201250 0.895020 0.859375 0.000000 0.895020 0.500000 -0.375000 0.863037 0.710000 -0.375000 0.863037 0.875000 -0.209999 0.863037 0.875000 0.000000 0.863037 0.875000 0.000000 0.863037 0.875000 0.209999 0.863037 0.710000 0.375000 0.863037 0.500000 0.375000 0.863037 0.937500 0.000000 0.730957 0.937500 0.245001 0.730957 0.745000 0.437500 0.730957 0.500000 0.437500 0.730957 1.000000 0.000000 0.600098 1.000000 0.280001 0.600098 0.780000 0.500000 0.600098 0.500000 0.500000 0.600098 1.000000 0.000000 0.488037 1.000000 0.280001 0.488037 0.780000 0.500000 0.488037 0.500000 0.500000 0.488037 0.500000 0.375000 0.863037 0.290000 0.375000 0.863037 0.125000 0.209999 0.863037 0.125000 0.000000 0.863037 0.500000 0.437500 0.730957 0.255000 0.437500 0.730957 0.062500 0.245001 0.730957 0.062500 0.000000 0.730957 0.500000 0.500000 0.600098 0.220000 0.500000 0.600098 0.000000 0.280001 0.600098 0.000000 0.000000 0.600098 0.500000 0.500000 0.488037 0.220000 0.500000 0.488037 0.000000 0.280001 0.488037 0.000000 0.000000 0.488037 0.125000 0.000000 0.863037 0.125000 -0.209999 0.863037 0.290000 -0.375000 0.863037 0.500000 -0.375000 0.863037 0.062500 0.000000 0.730957 0.062500 -0.245001 0.730957 0.255000 -0.437500 0.730957 0.500000 -0.437500 0.730957 0.000000 0.000000 0.600098 0.000000 -0.280001 0.600098 0.220000 -0.500000 0.600098 0.500000 -0.500000 0.600098 0.000000 0.000000 0.488037 0.000000 -0.280001 0.488037 0.220000 -0.500000 0.488037 0.500000 -0.500000 0.488037 0.500000 -0.375000 0.863037 0.710000 -0.375000 0.863037 0.875000 -0.209999 0.863037 0.875000 0.000000 0.863037 0.500000 -0.437500 0.730957 0.745000 -0.437500 0.730957 0.937500 -0.245001 0.730957 0.937500 0.000000 0.730957 0.500000 -0.500000 0.600098 0.780000 -0.500000 0.600098 1.000000 -0.280001 0.600098 1.000000 0.000000 0.600098 0.500000 -0.500000 0.488037 0.780000 -0.500000 0.488037 1.000000 -0.280001 0.488037 1.000000 0.000000 0.488037 1.000000 0.000000 0.488037 1.000000 0.280001 0.488037 0.780000 0.500000 0.488037 0.500000 0.500000 0.488037 1.000000 0.000000 0.375000 1.000000 0.280001 0.375000 0.780000 0.500000 0.375000 0.500000 0.500000 0.375000 0.875000 0.000000 0.319092 0.875000 0.209999 0.319092 0.710000 0.375000 0.319092 0.500000 0.375000 0.319092 0.875000 0.000000 0.300049 0.875000 0.209999 0.300049 0.710000 0.375000 0.300049 0.500000 0.375000 0.300049 0.500000 0.500000 0.488037 0.220000 0.500000 0.488037 0.000000 0.280001 0.488037 0.000000 0.000000 0.488037 0.500000 0.500000 0.375000 0.220000 0.500000 0.375000 0.000000 0.280001 0.375000 0.000000 0.000000 0.375000 0.500000 0.375000 0.319092 0.290000 0.375000 0.319092 0.125000 0.209999 0.319092 0.125000 0.000000 0.319092 0.500000 0.375000 0.300049 0.290000 0.375000 0.300049 0.125000 0.209999 0.300049 0.125000 0.000000 0.300049 0.000000 0.000000 0.488037 0.000000 -0.280001 0.488037 0.220000 -0.500000 0.488037 0.500000 -0.500000 0.488037 0.000000 0.000000 0.375000 0.000000 -0.280001 0.375000 0.220000 -0.500000 0.375000 0.500000 -0.500000 0.375000 0.125000 0.000000 0.319092 0.125000 -0.209999 0.319092 0.290000 -0.375000 0.319092 0.500000 -0.375000 0.319092 0.125000 0.000000 0.300049 0.125000 -0.209999 0.300049 0.290000 -0.375000 0.300049 0.500000 -0.375000 0.300049 0.500000 -0.500000 0.488037 0.780000 -0.500000 0.488037 1.000000 -0.280001 0.488037 1.000000 0.000000 0.488037 0.500000 -0.500000 0.375000 0.780000 -0.500000 0.375000 1.000000 -0.280001 0.375000 1.000000 0.000000 0.375000 0.500000 -0.375000 0.319092 0.710000 -0.375000 0.319092 0.875000 -0.209999 0.319092 0.875000 0.000000 0.319092 0.500000 -0.375000 0.300049 0.710000 -0.375000 0.300049 0.875000 -0.209999 0.300049 0.875000 0.000000 0.300049 0.100000 0.000000 0.769043 0.100000 0.075001 0.769043 0.125000 0.075001 0.824951 0.125000 0.000000 0.824951 -0.075000 0.000000 0.769043 -0.075000 0.075001 0.769043 -0.125000 0.075001 0.824951 -0.125000 0.000000 0.824951 -0.175000 0.000000 0.769043 -0.175000 0.075001 0.769043 -0.250000 0.075001 0.824951 -0.250000 0.000000 0.824951 -0.175000 0.000000 0.712891 -0.175000 0.075001 0.712891 -0.250000 0.075001 0.712891 -0.250000 0.000000 0.712891 0.125000 0.000000 0.824951 0.125000 -0.075001 0.824951 0.100000 -0.075001 0.769043 0.100000 0.000000 0.769043 -0.125000 0.000000 0.824951 -0.125000 -0.075001 0.824951 -0.075000 -0.075001 0.769043 -0.075000 0.000000 0.769043 -0.250000 0.000000 0.824951 -0.250000 -0.075001 0.824951 -0.175000 -0.075001 0.769043 -0.175000 0.000000 0.769043 -0.250000 0.000000 0.712891 -0.250000 -0.075001 0.712891 -0.175000 -0.075001 0.712891 -0.175000 0.000000 0.712891 -0.175000 0.000000 0.712891 -0.175000 0.075001 0.712891 -0.250000 0.075001 0.712891 -0.250000 0.000000 0.712891 -0.175000 0.000000 0.656006 -0.175000 0.075001 0.656006 -0.250000 0.075001 0.600098 -0.250000 0.000000 0.600098 -0.125000 0.000000 0.543945 -0.125000 0.075001 0.543945 -0.162500 0.075001 0.497070 -0.162500 0.000000 0.497070 0.000000 0.000000 0.488037 0.000000 0.075001 0.488037 0.025000 0.075001 0.413086 0.025000 0.000000 0.413086 -0.250000 0.000000 0.712891 -0.250000 -0.075001 0.712891 -0.175000 -0.075001 0.712891 -0.175000 0.000000 0.712891 -0.250000 0.000000 0.600098 -0.250000 -0.075001 0.600098 -0.175000 -0.075001 0.656006 -0.175000 0.000000 0.656006 -0.162500 0.000000 0.497070 -0.162500 -0.075001 0.497070 -0.125000 -0.075001 0.543945 -0.125000 0.000000 0.543945 0.025000 0.000000 0.413086 0.025000 -0.075001 0.413086 0.000000 -0.075001 0.488037 0.000000 0.000000 0.488037 0.925000 0.000000 0.618896 0.925000 0.165001 0.618896 0.925000 0.165001 0.413086 0.925000 0.000000 0.413086 1.150000 0.000000 0.618896 1.150000 0.165001 0.618896 1.275000 0.165001 0.468994 1.275000 0.000000 0.468994 1.075000 0.000000 0.788086 1.075000 0.062500 0.788086 1.100000 0.062500 0.769043 1.100000 0.000000 0.769043 1.175000 0.000000 0.863037 1.175000 0.062500 0.863037 1.325000 0.062500 0.863037 1.325000 0.000000 0.863037 0.925000 0.000000 0.413086 0.925000 -0.165001 0.413086 0.925000 -0.165001 0.618896 0.925000 0.000000 0.618896 1.275000 0.000000 0.468994 1.275000 -0.165001 0.468994 1.150000 -0.165001 0.618896 1.150000 0.000000 0.618896 1.100000 0.000000 0.769043 1.100000 -0.062500 0.769043 1.075000 -0.062500 0.788086 1.075000 0.000000 0.788086 1.325000 0.000000 0.863037 1.325000 -0.062500 0.863037 1.175000 -0.062500 0.863037 1.175000 0.000000 0.863037 1.175000 0.000000 0.863037 1.175000 0.062500 0.863037 1.325000 0.062500 0.863037 1.325000 0.000000 0.863037 1.200000 0.000000 0.881104 1.200000 0.062500 0.881104 1.381250 0.062500 0.885986 1.381250 0.000000 0.885986 1.225000 0.000000 0.881104 1.225000 0.037500 0.881104 1.362500 0.037500 0.891113 1.362500 0.000000 0.891113 1.200000 0.000000 0.863037 1.200000 0.037500 0.863037 1.300000 0.037500 0.863037 1.300000 0.000000 0.863037 1.325000 0.000000 0.863037 1.325000 -0.062500 0.863037 1.175000 -0.062500 0.863037 1.175000 0.000000 0.863037 1.381250 0.000000 0.885986 1.381250 -0.062500 0.885986 1.200000 -0.062500 0.881104 1.200000 0.000000 0.881104 1.362500 0.000000 0.891113 1.362500 -0.037500 0.891113 1.225000 -0.037500 0.881104 1.225000 0.000000 0.881104 1.300000 0.000000 0.863037 1.300000 -0.037500 0.863037 1.200000 -0.037500 0.863037 1.200000 0.000000 0.863037 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.700000 0.000000 1.050049 0.700000 0.112499 1.050049 0.612500 0.200001 1.050049 0.500000 0.200001 1.050049 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.550000 0.000000 0.937988 0.550000 0.028000 0.937988 0.528000 0.049999 0.937988 0.500000 0.049999 0.937988 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 0.200001 1.050049 0.387500 0.200001 1.050049 0.300000 0.112499 1.050049 0.300000 0.000000 1.050049 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.049999 0.937988 0.472000 0.049999 0.937988 0.450000 0.028000 0.937988 0.450000 0.000000 0.937988 0.500000 0.000000 1.050049 0.500000 -0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.300000 0.000000 1.050049 0.300000 -0.112499 1.050049 0.387500 -0.200001 1.050049 0.500000 -0.200001 1.050049 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.450000 0.000000 0.937988 0.450000 -0.028000 0.937988 0.472000 -0.049999 0.937988 0.500000 -0.049999 0.937988 0.500000 0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 -0.000000 1.050049 0.500000 0.000000 1.050049 0.500000 -0.200001 1.050049 0.612500 -0.200001 1.050049 0.700000 -0.112499 1.050049 0.700000 0.000000 1.050049 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 0.000000 0.975098 0.500000 -0.049999 0.937988 0.528000 -0.049999 0.937988 0.550000 -0.028000 0.937988 0.550000 0.000000 0.937988 0.550000 0.000000 0.937988 0.550000 0.028000 0.937988 0.528000 0.049999 0.937988 0.500000 0.049999 0.937988 0.600000 0.000000 0.899902 0.600000 0.056000 0.899902 0.556000 0.100000 0.899902 0.500000 0.100000 0.899902 0.825000 0.000000 0.899902 0.825000 0.181999 0.899902 0.682000 0.325001 0.899902 0.500000 0.325001 0.899902 0.825000 0.000000 0.863037 0.825000 0.181999 0.863037 0.682000 0.325001 0.863037 0.500000 0.325001 0.863037 0.500000 0.049999 0.937988 0.472000 0.049999 0.937988 0.450000 0.028000 0.937988 0.450000 0.000000 0.937988 0.500000 0.100000 0.899902 0.444000 0.100000 0.899902 0.400000 0.056000 0.899902 0.400000 0.000000 0.899902 0.500000 0.325001 0.899902 0.318000 0.325001 0.899902 0.175000 0.181999 0.899902 0.175000 0.000000 0.899902 0.500000 0.325001 0.863037 0.318000 0.325001 0.863037 0.175000 0.181999 0.863037 0.175000 0.000000 0.863037 0.450000 0.000000 0.937988 0.450000 -0.028000 0.937988 0.472000 -0.049999 0.937988 0.500000 -0.049999 0.937988 0.400000 0.000000 0.899902 0.400000 -0.056000 0.899902 0.444000 -0.100000 0.899902 0.500000 -0.100000 0.899902 0.175000 0.000000 0.899902 0.175000 -0.181999 0.899902 0.318000 -0.325001 0.899902 0.500000 -0.325001 0.899902 0.175000 0.000000 0.863037 0.175000 -0.181999 0.863037 0.318000 -0.325001 0.863037 0.500000 -0.325001 0.863037 0.500000 -0.049999 0.937988 0.528000 -0.049999 0.937988 0.550000 -0.028000 0.937988 0.550000 0.000000 0.937988 0.500000 -0.100000 0.899902 0.556000 -0.100000 0.899902 0.600000 -0.056000 0.899902 0.600000 0.000000 0.899902 0.500000 -0.325001 0.899902 0.682000 -0.325001 0.899902 0.825000 -0.181999 0.899902 0.825000 0.000000 0.899902 0.500000 -0.325001 0.863037 0.682000 -0.325001 0.863037 0.825000 -0.181999 0.863037 0.825000 0.000000 0.863037 geomview-1.9.4/data/geom/sphere.mesh0000644000175000001440000000465607730233140014302 00000000000000MESH 10 10 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0.34202 0 0.939693 0.262003 0.219846 0.939693 0.0593912 0.336824 0.939693 -0.17101 0.296198 0.939693 -0.321394 0.116978 0.939693 -0.321394 -0.116978 0.939693 -0.17101 -0.296198 0.939693 0.0593912 -0.336824 0.939693 0.262003 -0.219846 0.939693 0.34202 -8.37708e-17 0.939693 0.642788 0 0.766044 0.492404 0.413176 0.766044 0.111619 0.633022 0.766044 -0.321394 0.55667 0.766044 -0.604023 0.219846 0.766044 -0.604023 -0.219846 0.766044 -0.321394 -0.55667 0.766044 0.111619 -0.633022 0.766044 0.492404 -0.413176 0.766044 0.642788 -1.57438e-16 0.766044 0.866025 0 0.5 0.663414 0.55667 0.5 0.150384 0.852869 0.5 -0.433013 0.75 0.5 -0.813798 0.296198 0.5 -0.813798 -0.296198 0.5 -0.433013 -0.75 0.5 0.150384 -0.852869 0.5 0.663414 -0.55667 0.5 0.866025 -2.12115e-16 0.5 0.984808 0 0.173648 0.754407 0.633022 0.173648 0.17101 0.969846 0.173648 -0.492404 0.852868 0.173648 -0.925417 0.336824 0.173648 -0.925417 -0.336824 0.173648 -0.492404 -0.852869 0.173648 0.17101 -0.969846 0.173648 0.754407 -0.633022 0.173648 0.984808 -2.41208e-16 0.173648 0.984808 0 -0.173648 0.754407 0.633022 -0.173648 0.17101 0.969846 -0.173648 -0.492404 0.852868 -0.173648 -0.925417 0.336824 -0.173648 -0.925417 -0.336824 -0.173648 -0.492404 -0.852869 -0.173648 0.17101 -0.969846 -0.173648 0.754407 -0.633022 -0.173648 0.984808 -2.41208e-16 -0.173648 0.866025 0 -0.5 0.663414 0.55667 -0.5 0.150384 0.852868 -0.5 -0.433013 0.75 -0.5 -0.813798 0.296198 -0.5 -0.813798 -0.296198 -0.5 -0.433013 -0.75 -0.5 0.150384 -0.852868 -0.5 0.663414 -0.55667 -0.5 0.866025 -2.12115e-16 -0.5 0.642788 0 -0.766044 0.492404 0.413176 -0.766044 0.111619 0.633022 -0.766044 -0.321394 0.55667 -0.766044 -0.604023 0.219846 -0.766044 -0.604023 -0.219846 -0.766044 -0.321394 -0.55667 -0.766044 0.111619 -0.633022 -0.766044 0.492404 -0.413176 -0.766044 0.642788 -1.57438e-16 -0.766044 0.34202 0 -0.939693 0.262003 0.219846 -0.939693 0.0593912 0.336824 -0.939693 -0.17101 0.296198 -0.939693 -0.321394 0.116978 -0.939693 -0.321394 -0.116978 -0.939693 -0.17101 -0.296198 -0.939693 0.0593912 -0.336824 -0.939693 0.262003 -0.219846 -0.939693 0.34202 -8.37708e-17 -0.939693 1.22465e-16 0 -1 9.38134e-17 7.87188e-17 -1 2.12658e-17 1.20604e-16 -1 -6.12323e-17 1.06058e-16 -1 -1.15079e-16 4.18854e-17 -1 -1.15079e-16 -4.18854e-17 -1 -6.12323e-17 -1.06058e-16 -1 2.12658e-17 -1.20604e-16 -1 9.38134e-17 -7.87188e-17 -1 1.22465e-16 -2.99952e-32 -1 geomview-1.9.4/data/geom/cam.off0000644000175000001440000000014707730233102013357 00000000000000OFF 5 2 6 0 0 0 -.1 0 .5 .1 0 .5 0 -.1 .5 0 .1 .5 3 0 1 2 1.000 1.000 0.000 3 0 3 4 0.000 1.000 1.000 geomview-1.9.4/data/geom/vertcube.off0000644000175000001440000000063307730233147014447 00000000000000# off file with per vertex colors COFF 8 6 12 1.0 1.0 1.0 .05 .8 .1 .75 1.0 1.0 -1.0 .2 .05 .8 .75 1.0 -1.0 1.0 .9 .9 .02 .75 1.0 -1.0 -1.0 .0 .7 .4 .75 -1.0 1.0 1.0 .1 .4 .7 .75 -1.0 1.0 -1.0 .7 .7 0 .75 -1.0 -1.0 1.0 0. 0. 0. .75 -1.0 -1.0 -1.0 1. 1. 1. .75 4 0 2 3 1 4 4 5 7 6 4 0 4 6 2 4 1 3 7 5 4 0 1 5 4 4 2 6 7 3 geomview-1.9.4/data/geom/br2.grp0000644000175000001440000010262707730233077013343 00000000000000GROUP # epsilon # Undefined generator matrix epsilon 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] epsilon # x -1 0 0 0 0 -1 0 0 0 0 1 0 2 0 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 2 0 0 1 ] x # x*A 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 0 1 ] x*A # x*A*x -1 0 0 0 0 -1 0 0 0 0 1 0 6 0 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 6 0 0 1 ] x*A*x # x*A*x*A 1 0 0 0 0 1 0 0 0 0 1 0 -8 0 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -8 0 0 1 ] x*A*x*A # x*A*x*y -1 0 0 0 0 1 0 0 0 0 -1 0 6 2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 6 2 0 1 ] x*A*x*y # x*A*x*B -1 0 0 0 0 1 0 0 0 0 -1 0 6 -2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 6 -2 0 1 ] x*A*x*B # x*A*x*z 1 0 0 0 0 -1 0 0 0 0 -1 0 -6 0 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -6 0 2 1 ] x*A*x*z # x*A*x*C 1 0 0 0 0 -1 0 0 0 0 -1 0 -6 0 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -6 0 -2 1 ] x*A*x*C # x*A*y 1 0 0 0 0 -1 0 0 0 0 -1 0 -4 2 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -4 2 0 1 ] x*A*y # x*A*y*B 1 0 0 0 0 1 0 0 0 0 1 0 -4 -4 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -4 -4 0 1 ] x*A*y*B # x*A*y*z -1 0 0 0 0 -1 0 0 0 0 1 0 4 2 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 4 2 2 1 ] x*A*y*z # x*A*y*C -1 0 0 0 0 -1 0 0 0 0 1 0 4 2 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 4 2 -2 1 ] x*A*y*C # x*A*B 1 0 0 0 0 -1 0 0 0 0 -1 0 -4 -2 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -4 -2 0 1 ] x*A*B # x*A*B*y 1 0 0 0 0 1 0 0 0 0 1 0 -4 4 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -4 4 0 1 ] x*A*B*y # x*A*B*z -1 0 0 0 0 -1 0 0 0 0 1 0 4 -2 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 4 -2 2 1 ] x*A*B*z # x*A*B*C -1 0 0 0 0 -1 0 0 0 0 1 0 4 -2 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 4 -2 -2 1 ] x*A*B*C # x*A*z -1 0 0 0 0 1 0 0 0 0 -1 0 4 0 2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 4 0 2 1 ] x*A*z # x*A*z*C 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 -4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 -4 1 ] x*A*z*C # x*A*C -1 0 0 0 0 1 0 0 0 0 -1 0 4 0 -2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 4 0 -2 1 ] x*A*C # x*A*C*z 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -4 0 4 1 ] x*A*C*z # x*y -1 0 0 0 0 1 0 0 0 0 -1 0 2 2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 2 0 1 ] x*y # x*y*B -1 0 0 0 0 -1 0 0 0 0 1 0 2 -4 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 2 -4 0 1 ] x*y*B # x*y*B*y -1 0 0 0 0 1 0 0 0 0 -1 0 2 6 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 6 0 1 ] x*y*B*y # x*y*B*z 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 -4 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 -4 2 1 ] x*y*B*z # x*y*B*C 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 -4 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 -4 -2 1 ] x*y*B*C # x*y*z 1 0 0 0 0 1 0 0 0 0 1 0 -2 2 2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -2 2 2 1 ] x*y*z # x*y*z*C -1 0 0 0 0 1 0 0 0 0 -1 0 2 2 -4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 2 -4 1 ] x*y*z*C # x*y*C 1 0 0 0 0 1 0 0 0 0 1 0 -2 2 -2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -2 2 -2 1 ] x*y*C # x*y*C*z -1 0 0 0 0 1 0 0 0 0 -1 0 2 2 4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 2 4 1 ] x*y*C*z # x*B -1 0 0 0 0 1 0 0 0 0 -1 0 2 -2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 -2 0 1 ] x*B # x*B*y -1 0 0 0 0 -1 0 0 0 0 1 0 2 4 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 2 4 0 1 ] x*B*y # x*B*y*B -1 0 0 0 0 1 0 0 0 0 -1 0 2 -6 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 -6 0 1 ] x*B*y*B # x*B*y*z 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 4 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 4 2 1 ] x*B*y*z # x*B*y*C 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 4 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 4 -2 1 ] x*B*y*C # x*B*z 1 0 0 0 0 1 0 0 0 0 1 0 -2 -2 2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -2 -2 2 1 ] x*B*z # x*B*z*C -1 0 0 0 0 1 0 0 0 0 -1 0 2 -2 -4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 -2 -4 1 ] x*B*z*C # x*B*C 1 0 0 0 0 1 0 0 0 0 1 0 -2 -2 -2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 -2 -2 -2 1 ] x*B*C # x*B*C*z -1 0 0 0 0 1 0 0 0 0 -1 0 2 -2 4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 2 -2 4 1 ] x*B*C*z # x*z 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 2 1 ] x*z # x*z*C -1 0 0 0 0 -1 0 0 0 0 1 0 2 0 -4 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 2 0 -4 1 ] x*z*C # x*z*C*z 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 6 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 6 1 ] x*z*C*z # x*C 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 -2 1 ] x*C # x*C*z -1 0 0 0 0 -1 0 0 0 0 1 0 2 0 4 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 2 0 4 1 ] x*C*z # x*C*z*C 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 -6 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 -2 0 -6 1 ] x*C*z*C # A -1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 0 1 ] A # A*x 1 0 0 0 0 1 0 0 0 0 1 0 4 0 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 4 0 0 1 ] A*x # A*x*A -1 0 0 0 0 -1 0 0 0 0 1 0 -6 0 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -6 0 0 1 ] A*x*A # A*x*A*x 1 0 0 0 0 1 0 0 0 0 1 0 8 0 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 8 0 0 1 ] A*x*A*x # A*x*A*y -1 0 0 0 0 1 0 0 0 0 -1 0 -6 2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -6 2 0 1 ] A*x*A*y # A*x*A*B -1 0 0 0 0 1 0 0 0 0 -1 0 -6 -2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -6 -2 0 1 ] A*x*A*B # A*x*A*z 1 0 0 0 0 -1 0 0 0 0 -1 0 6 0 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 6 0 2 1 ] A*x*A*z # A*x*A*C 1 0 0 0 0 -1 0 0 0 0 -1 0 6 0 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 6 0 -2 1 ] A*x*A*C # A*x*y 1 0 0 0 0 -1 0 0 0 0 -1 0 4 2 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 4 2 0 1 ] A*x*y # A*x*y*B 1 0 0 0 0 1 0 0 0 0 1 0 4 -4 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 4 -4 0 1 ] A*x*y*B # A*x*y*z -1 0 0 0 0 -1 0 0 0 0 1 0 -4 2 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -4 2 2 1 ] A*x*y*z # A*x*y*C -1 0 0 0 0 -1 0 0 0 0 1 0 -4 2 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -4 2 -2 1 ] A*x*y*C # A*x*B 1 0 0 0 0 -1 0 0 0 0 -1 0 4 -2 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 4 -2 0 1 ] A*x*B # A*x*B*y 1 0 0 0 0 1 0 0 0 0 1 0 4 4 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 4 4 0 1 ] A*x*B*y # A*x*B*z -1 0 0 0 0 -1 0 0 0 0 1 0 -4 -2 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -4 -2 2 1 ] A*x*B*z # A*x*B*C -1 0 0 0 0 -1 0 0 0 0 1 0 -4 -2 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -4 -2 -2 1 ] A*x*B*C # A*x*z -1 0 0 0 0 1 0 0 0 0 -1 0 -4 0 2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -4 0 2 1 ] A*x*z # A*x*z*C 1 0 0 0 0 1 0 0 0 0 1 0 4 0 -4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 4 0 -4 1 ] A*x*z*C # A*x*C -1 0 0 0 0 1 0 0 0 0 -1 0 -4 0 -2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -4 0 -2 1 ] A*x*C # A*x*C*z 1 0 0 0 0 1 0 0 0 0 1 0 4 0 4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 4 0 4 1 ] A*x*C*z # A*y -1 0 0 0 0 1 0 0 0 0 -1 0 -2 2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 2 0 1 ] A*y # A*y*B -1 0 0 0 0 -1 0 0 0 0 1 0 -2 -4 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -2 -4 0 1 ] A*y*B # A*y*B*y -1 0 0 0 0 1 0 0 0 0 -1 0 -2 6 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 6 0 1 ] A*y*B*y # A*y*B*z 1 0 0 0 0 -1 0 0 0 0 -1 0 2 -4 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 -4 2 1 ] A*y*B*z # A*y*B*C 1 0 0 0 0 -1 0 0 0 0 -1 0 2 -4 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 -4 -2 1 ] A*y*B*C # A*y*z 1 0 0 0 0 1 0 0 0 0 1 0 2 2 2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 2 2 2 1 ] A*y*z # A*y*z*C -1 0 0 0 0 1 0 0 0 0 -1 0 -2 2 -4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 2 -4 1 ] A*y*z*C # A*y*C 1 0 0 0 0 1 0 0 0 0 1 0 2 2 -2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 2 2 -2 1 ] A*y*C # A*y*C*z -1 0 0 0 0 1 0 0 0 0 -1 0 -2 2 4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 2 4 1 ] A*y*C*z # A*B -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -2 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -2 0 1 ] A*B # A*B*y -1 0 0 0 0 -1 0 0 0 0 1 0 -2 4 0 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -2 4 0 1 ] A*B*y # A*B*y*B -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -6 0 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -6 0 1 ] A*B*y*B # A*B*y*z 1 0 0 0 0 -1 0 0 0 0 -1 0 2 4 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 4 2 1 ] A*B*y*z # A*B*y*C 1 0 0 0 0 -1 0 0 0 0 -1 0 2 4 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 4 -2 1 ] A*B*y*C # A*B*z 1 0 0 0 0 1 0 0 0 0 1 0 2 -2 2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 2 -2 2 1 ] A*B*z # A*B*z*C -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -2 -4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -2 -4 1 ] A*B*z*C # A*B*C 1 0 0 0 0 1 0 0 0 0 1 0 2 -2 -2 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 2 -2 -2 1 ] A*B*C # A*B*C*z -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -2 4 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 -2 -2 4 1 ] A*B*C*z # A*z 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 2 1 ] A*z # A*z*C -1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 -4 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 -4 1 ] A*z*C # A*z*C*z 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 6 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 6 1 ] A*z*C*z # A*C 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 -2 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 -2 1 ] A*C # A*C*z -1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 4 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 -2 0 4 1 ] A*C*z # A*C*z*C 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 -6 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 2 0 -6 1 ] A*C*z*C # y 1 0 0 0 0 -1 0 0 0 0 -1 0 0 2 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 2 0 1 ] y # y*B 1 0 0 0 0 1 0 0 0 0 1 0 0 -4 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 -4 0 1 ] y*B # y*B*y 1 0 0 0 0 -1 0 0 0 0 -1 0 0 6 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 6 0 1 ] y*B*y # y*B*y*B 1 0 0 0 0 1 0 0 0 0 1 0 0 -8 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 -8 0 1 ] y*B*y*B # y*B*y*z -1 0 0 0 0 -1 0 0 0 0 1 0 0 6 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 6 2 1 ] y*B*y*z # y*B*y*C -1 0 0 0 0 -1 0 0 0 0 1 0 0 6 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 6 -2 1 ] y*B*y*C # y*B*z -1 0 0 0 0 1 0 0 0 0 -1 0 0 -4 2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 -4 2 1 ] y*B*z # y*B*z*C 1 0 0 0 0 1 0 0 0 0 1 0 0 -4 -4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 -4 -4 1 ] y*B*z*C # y*B*C -1 0 0 0 0 1 0 0 0 0 -1 0 0 -4 -2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 -4 -2 1 ] y*B*C # y*B*C*z 1 0 0 0 0 1 0 0 0 0 1 0 0 -4 4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 -4 4 1 ] y*B*C*z # y*z -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 2 1 ] y*z # y*z*C 1 0 0 0 0 -1 0 0 0 0 -1 0 0 2 -4 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 2 -4 1 ] y*z*C # y*z*C*z -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 6 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 6 1 ] y*z*C*z # y*C -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 -2 1 ] y*C # y*C*z 1 0 0 0 0 -1 0 0 0 0 -1 0 0 2 4 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 2 4 1 ] y*C*z # y*C*z*C -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 -6 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 2 -6 1 ] y*C*z*C # B 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -2 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -2 0 1 ] B # B*y 1 0 0 0 0 1 0 0 0 0 1 0 0 4 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 4 0 1 ] B*y # B*y*B 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -6 0 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -6 0 1 ] B*y*B # B*y*B*y 1 0 0 0 0 1 0 0 0 0 1 0 0 8 0 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 8 0 1 ] B*y*B*y # B*y*B*z -1 0 0 0 0 -1 0 0 0 0 1 0 0 -6 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 -6 2 1 ] B*y*B*z # B*y*B*C -1 0 0 0 0 -1 0 0 0 0 1 0 0 -6 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 -6 -2 1 ] B*y*B*C # B*y*z -1 0 0 0 0 1 0 0 0 0 -1 0 0 4 2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 4 2 1 ] B*y*z # B*y*z*C 1 0 0 0 0 1 0 0 0 0 1 0 0 4 -4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 4 -4 1 ] B*y*z*C # B*y*C -1 0 0 0 0 1 0 0 0 0 -1 0 0 4 -2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 4 -2 1 ] B*y*C # B*y*C*z 1 0 0 0 0 1 0 0 0 0 1 0 0 4 4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 4 4 1 ] B*y*C*z # B*z -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 2 1 ] B*z # B*z*C 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -2 -4 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -2 -4 1 ] B*z*C # B*z*C*z -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 6 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 6 1 ] B*z*C*z # B*C -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 -2 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 -2 1 ] B*C # B*C*z 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -2 4 1 # [ 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -2 4 1 ] B*C*z # B*C*z*C -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 -6 1 # [ -1 0 0 0 0 -1 0 0 0 0 1 0 0 -2 -6 1 ] B*C*z*C # z -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 2 1 ] z # z*C 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -4 1 ] z*C # z*C*z -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 6 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 6 1 ] z*C*z # z*C*z*C 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -8 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -8 1 ] z*C*z*C # C -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 -2 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 -2 1 ] C # C*z 1 0 0 0 0 1 0 0 0 0 1 0 0 0 4 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 4 1 ] C*z # C*z*C -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 -6 1 # [ -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 -6 1 ] C*z*C # C*z*C*z 1 0 0 0 0 1 0 0 0 0 1 0 0 0 8 1 # [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 8 1 ] C*z*C*z unit < br2.off geomview-1.9.4/data/geom/br2.off0000644000175000001440000000157007730233100013303 00000000000000# off file with full color info # Dodecahedral skeleton -- with these vertices, every face has 3 collinear ones OFF 20 12 12 -1 1 -1 # 0 0 1 -1 # 1 1 1 -1 # 2 1 0 -1 # 3 1 -1 -1 # 4 0 -1 -1 # 5 -1 -1 -1 # 6 -1 0 -1 # 7 -1 1 0 # 8 1 1 0 # 9 1 -1 0 # 10 -1 -1 0 # 11 -1 -1 1 # 12 0 -1 1 # 13 1 -1 1 # 14 1 0 1 # 15 1 1 1 # 16 0 1 1 # 17 -1 1 1 # 18 -1 0 1 # 19 5 2 9 16 15 3 .7 .0 .0 # Gen a -- red axis, rot XY about x=1 5 15 14 10 4 3 .7 .4 .4 5 7 6 11 12 19 .7 .5 .5 # Gen d -- red axis, rot XY about x=-1 5 19 18 8 0 7 .7 .2 .2 5 1 2 3 4 5 .0 .7 .0 # Gen b -- green axis, rot XZ about z=1 5 0 1 5 6 7 .4 .7 .4 5 13 14 15 16 17 .5 .7 .5 # Gen e -- green axis, rot XZ about z=-1 5 12 13 17 18 19 .2 .7 .2 5 8 9 2 1 0 .0 .0 .7 # Gen c -- blue axis, rot YZ about y=1 5 18 17 16 9 8 .4 .4 .7 5 10 11 6 5 4 .5 .5 .7 # Gen f -- blue axis, rot YZ about y=-1 5 14 13 12 11 10 .2 .2 .7 geomview-1.9.4/data/geom/moebius.skel0000644000175000001440000003712510523140175014455 00000000000000SKEL 288 208 1.150411e+00 4.765160e-01 4.877258e-02 1.033748e+00 1.033748e+00 1.913417e-01 8.704272e-01 8.704272e-01 9.567086e-02 9.520873e-01 9.520873e-01 1.435063e-01 1.030386e+00 6.884821e-01 7.257117e-02 1.129845e+00 7.549381e-01 1.088568e-01 7.071068e-01 7.071068e-01 0.000000e+00 7.887670e-01 7.887670e-01 4.783543e-02 9.309280e-01 6.220262e-01 3.628558e-02 1.500000e+00 -3.673940e-16 -6.123234e-17 1.376943e+00 5.703486e-01 9.754516e-02 1.468817e+00 2.921658e-01 4.900857e-02 1.263677e+00 5.234323e-01 7.315887e-02 1.346809e+00 2.678969e-01 3.675643e-02 1.229303e+00 8.213940e-01 1.451423e-01 4.622308e-01 1.115924e+00 1.388926e-01 5.417783e-01 1.307968e+00 2.777851e-01 8.005548e-01 1.198115e+00 2.356984e-01 5.020045e-01 1.211946e+00 2.083388e-01 7.393087e-01 1.106454e+00 1.767738e-01 8.288124e-17 1.353553e+00 3.535534e-01 2.704938e-01 1.359864e+00 3.171966e-01 2.516429e-01 1.265094e+00 2.378975e-01 6.780625e-01 1.014792e+00 1.178492e-01 6.168164e-01 9.231310e-01 5.892459e-02 6.973477e-01 2.888509e-01 -4.877258e-02 1.000000e+00 -2.449294e-16 0.000000e+00 9.238795e-01 3.826834e-01 0.000000e+00 9.807853e-01 1.950903e-01 0.000000e+00 8.106136e-01 3.357671e-01 -2.438629e-02 8.587775e-01 1.708215e-01 -1.225214e-02 8.314696e-01 5.555702e-01 0.000000e+00 7.320113e-01 4.891143e-01 -3.628558e-02 5.000000e-01 -1.224647e-16 6.123234e-17 7.500000e-01 0.000000e+00 0.000000e+00 6.250000e-01 0.000000e+00 0.000000e+00 7.367696e-01 1.465526e-01 -2.450429e-02 6.147618e-01 1.222837e-01 -3.675643e-02 8.750000e-01 0.000000e+00 0.000000e+00 1.250000e+00 0.000000e+00 0.000000e+00 1.125000e+00 0.000000e+00 0.000000e+00 1.224801e+00 2.436280e-01 2.450429e-02 1.102793e+00 2.193592e-01 1.225214e-02 1.375000e+00 0.000000e+00 0.000000e+00 1.037145e+00 4.295997e-01 2.438629e-02 3.031360e-01 7.318351e-01 -1.388926e-01 3.804660e-01 3.804660e-01 -1.913417e-01 5.437864e-01 5.437864e-01 -9.567086e-02 4.621262e-01 4.621262e-01 -1.435063e-01 4.330779e-01 6.481469e-01 -1.178492e-01 3.718318e-01 5.564856e-01 -1.767738e-01 6.254466e-01 6.254466e-01 -4.783543e-02 4.943241e-01 7.398083e-01 -5.892459e-02 3.958344e-17 6.464466e-01 -3.535534e-01 2.235886e-01 5.397907e-01 -2.777851e-01 1.196869e-01 6.017066e-01 -3.171966e-01 2.633623e-01 6.358129e-01 -2.083388e-01 1.385378e-01 6.964763e-01 -2.378975e-01 3.105856e-01 4.648242e-01 -2.356984e-01 4.708158e-01 1.950183e-01 -9.754516e-02 4.336362e-01 2.897465e-01 -1.451423e-01 5.840817e-01 2.419346e-01 -7.315887e-02 5.330946e-01 3.562024e-01 -1.088568e-01 4.927540e-01 9.801487e-02 -4.900857e-02 6.325529e-01 4.226583e-01 -7.257117e-02 6.123234e-17 1.000000e+00 0.000000e+00 3.826834e-01 9.238795e-01 0.000000e+00 1.950903e-01 9.807853e-01 0.000000e+00 4.224571e-01 1.019902e+00 6.944628e-02 2.139412e-01 1.075555e+00 7.929916e-02 5.555702e-01 8.314696e-01 0.000000e+00 7.205679e-17 1.176777e+00 1.767767e-01 7.746902e-17 1.265165e+00 2.651650e-01 2.327920e-01 1.170325e+00 1.585983e-01 6.664457e-17 1.088388e+00 8.838835e-02 5.040789e-17 8.232233e-01 -1.767767e-01 5.582011e-17 9.116117e-01 -8.838835e-02 1.573886e-01 7.912460e-01 -1.585983e-01 1.762395e-01 8.860156e-01 -7.929916e-02 4.499566e-17 7.348350e-01 -2.651650e-01 3.429097e-01 8.278573e-01 -6.944628e-02 -4.358353e-01 1.052200e+00 2.078674e-01 -8.424058e-01 8.424058e-01 4.619398e-01 -7.747563e-01 7.747563e-01 2.309699e-01 -8.085810e-01 8.085810e-01 3.464548e-01 -6.210437e-01 9.294576e-01 2.204803e-01 -6.537805e-01 9.784516e-01 3.307205e-01 -7.071068e-01 7.071068e-01 0.000000e+00 -7.409315e-01 7.409315e-01 1.154849e-01 -5.883070e-01 8.804636e-01 1.102402e-01 -4.889872e-01 1.180520e+00 4.157348e-01 -2.569723e-01 1.291887e+00 3.865052e-01 -4.624113e-01 1.116360e+00 3.118011e-01 -2.415018e-01 1.214112e+00 2.898789e-01 -6.865172e-01 1.027446e+00 4.409606e-01 -9.689395e-01 4.013479e-01 2.451963e-01 -1.014000e+00 4.200123e-01 4.903926e-01 -9.521511e-01 6.362070e-01 4.784702e-01 -9.914695e-01 4.106801e-01 3.677945e-01 -9.219807e-01 6.160478e-01 3.588526e-01 -1.000000e+00 1.224647e-16 5.000000e-01 -1.028852e+00 2.046514e-01 4.975924e-01 -1.016835e+00 2.022611e-01 3.731943e-01 -8.918103e-01 5.958886e-01 2.392351e-01 -8.616400e-01 5.757294e-01 1.196175e-01 -3.295316e-01 7.955595e-01 -2.078674e-01 -3.826834e-01 9.238795e-01 0.000000e+00 -1.950903e-01 9.807853e-01 0.000000e+00 -3.561075e-01 8.597195e-01 -1.039337e-01 -1.796198e-01 9.030098e-01 -9.662631e-02 -5.555702e-01 8.314696e-01 0.000000e+00 -5.228335e-01 7.824756e-01 -1.102402e-01 -1.641493e-01 8.252344e-01 -1.932526e-01 -1.486788e-01 7.474589e-01 -2.898789e-01 -2.260313e-01 1.136336e+00 1.932526e-01 -2.105608e-01 1.058561e+00 9.662631e-02 -4.092594e-01 9.880395e-01 1.039337e-01 -8.788195e-01 3.640190e-01 -2.451963e-01 -5.718078e-01 5.718078e-01 -4.619398e-01 -6.394573e-01 6.394573e-01 -2.309699e-01 -6.056325e-01 6.056325e-01 -3.464548e-01 -7.711289e-01 5.152519e-01 -2.392351e-01 -7.409585e-01 4.950927e-01 -3.588526e-01 -6.732820e-01 6.732820e-01 -1.154849e-01 -8.012993e-01 5.354110e-01 -1.196175e-01 -1.000000e+00 1.224647e-16 -5.000000e-01 -8.337596e-01 3.453545e-01 -4.903926e-01 -9.327184e-01 1.855292e-01 -4.975924e-01 -8.562895e-01 3.546867e-01 -3.677945e-01 -9.447351e-01 1.879195e-01 -3.731943e-01 -7.107882e-01 4.749335e-01 -4.784702e-01 -2.763797e-01 6.672395e-01 -4.157348e-01 -4.246232e-01 6.354936e-01 -4.409606e-01 -3.029556e-01 7.313995e-01 -3.118011e-01 -4.573600e-01 6.844876e-01 -3.307205e-01 -1.332083e-01 6.696835e-01 -3.865052e-01 -4.900967e-01 7.334816e-01 -2.204803e-01 -1.000000e+00 1.224647e-16 0.000000e+00 -9.238795e-01 3.826834e-01 0.000000e+00 -9.807853e-01 1.950903e-01 0.000000e+00 -9.464095e-01 3.920157e-01 1.225982e-01 -9.928020e-01 1.974806e-01 1.243981e-01 -8.314696e-01 5.555702e-01 0.000000e+00 -1.000000e+00 1.224647e-16 2.500000e-01 -1.000000e+00 1.224647e-16 3.750000e-01 -1.004819e+00 1.998709e-01 2.487962e-01 -1.000000e+00 1.224647e-16 1.250000e-01 -1.000000e+00 1.224647e-16 -2.500000e-01 -1.000000e+00 1.224647e-16 -1.250000e-01 -9.567518e-01 1.903098e-01 -2.487962e-01 -9.687686e-01 1.927000e-01 -1.243981e-01 -1.000000e+00 1.224647e-16 -3.750000e-01 -9.013495e-01 3.733512e-01 -1.225982e-01 -8.788195e-01 -3.640190e-01 2.451963e-01 -5.718078e-01 -5.718078e-01 4.619398e-01 -6.394573e-01 -6.394573e-01 2.309699e-01 -6.056325e-01 -6.056325e-01 3.464548e-01 -7.711289e-01 -5.152519e-01 2.392351e-01 -7.409585e-01 -4.950927e-01 3.588526e-01 -7.071068e-01 -7.071068e-01 0.000000e+00 -6.732820e-01 -6.732820e-01 1.154849e-01 -8.012993e-01 -5.354110e-01 1.196175e-01 -8.337596e-01 -3.453545e-01 4.903926e-01 -9.327184e-01 -1.855292e-01 4.975924e-01 -8.562895e-01 -3.546867e-01 3.677945e-01 -9.447351e-01 -1.879195e-01 3.731943e-01 -7.107882e-01 -4.749335e-01 4.784702e-01 -3.295316e-01 -7.955595e-01 2.078674e-01 -2.763797e-01 -6.672395e-01 4.157348e-01 -4.246232e-01 -6.354936e-01 4.409606e-01 -3.029556e-01 -7.313995e-01 3.118011e-01 -4.573600e-01 -6.844876e-01 3.307205e-01 -1.187503e-16 -6.464466e-01 3.535534e-01 -1.332083e-01 -6.696835e-01 3.865052e-01 -1.486788e-01 -7.474589e-01 2.898789e-01 -4.900967e-01 -7.334816e-01 2.204803e-01 -5.228335e-01 -7.824756e-01 1.102402e-01 -9.689395e-01 -4.013479e-01 -2.451963e-01 -9.238795e-01 -3.826834e-01 0.000000e+00 -9.807853e-01 -1.950903e-01 0.000000e+00 -9.464095e-01 -3.920157e-01 -1.225982e-01 -9.928020e-01 -1.974806e-01 -1.243981e-01 -8.314696e-01 -5.555702e-01 0.000000e+00 -8.616400e-01 -5.757294e-01 -1.196175e-01 -1.004819e+00 -1.998709e-01 -2.487962e-01 -1.016835e+00 -2.022611e-01 -3.731943e-01 -9.567518e-01 -1.903098e-01 2.487962e-01 -9.687686e-01 -1.927000e-01 1.243981e-01 -9.013495e-01 -3.733512e-01 1.225982e-01 -4.358353e-01 -1.052200e+00 -2.078674e-01 -8.424058e-01 -8.424058e-01 -4.619398e-01 -7.747563e-01 -7.747563e-01 -2.309699e-01 -8.085810e-01 -8.085810e-01 -3.464548e-01 -6.210437e-01 -9.294576e-01 -2.204803e-01 -6.537805e-01 -9.784516e-01 -3.307205e-01 -7.409315e-01 -7.409315e-01 -1.154849e-01 -5.883070e-01 -8.804636e-01 -1.102402e-01 -2.486437e-16 -1.353553e+00 -3.535534e-01 -4.889872e-01 -1.180520e+00 -4.157348e-01 -2.569723e-01 -1.291887e+00 -3.865052e-01 -4.624113e-01 -1.116360e+00 -3.118011e-01 -2.415018e-01 -1.214112e+00 -2.898789e-01 -6.865172e-01 -1.027446e+00 -4.409606e-01 -1.014000e+00 -4.200123e-01 -4.903926e-01 -9.521511e-01 -6.362070e-01 -4.784702e-01 -9.914695e-01 -4.106801e-01 -3.677945e-01 -9.219807e-01 -6.160478e-01 -3.588526e-01 -1.028852e+00 -2.046514e-01 -4.975924e-01 -8.918103e-01 -5.958886e-01 -2.392351e-01 -1.836970e-16 -1.000000e+00 0.000000e+00 -3.826834e-01 -9.238795e-01 0.000000e+00 -1.950903e-01 -9.807853e-01 0.000000e+00 -3.561075e-01 -8.597195e-01 1.039337e-01 -1.796198e-01 -9.030098e-01 9.662631e-02 -5.555702e-01 -8.314696e-01 0.000000e+00 -1.512237e-16 -8.232233e-01 1.767767e-01 -1.349870e-16 -7.348350e-01 2.651650e-01 -1.641493e-01 -8.252344e-01 1.932526e-01 -1.674603e-16 -9.116117e-01 8.838835e-02 -2.161704e-16 -1.176777e+00 -1.767767e-01 -1.999337e-16 -1.088388e+00 -8.838835e-02 -2.260313e-01 -1.136336e+00 -1.932526e-01 -2.105608e-01 -1.058561e+00 -9.662631e-02 -2.324070e-16 -1.265165e+00 -2.651650e-01 -4.092594e-01 -9.880395e-01 -1.039337e-01 3.031360e-01 -7.318351e-01 1.388926e-01 3.804660e-01 -3.804660e-01 1.913417e-01 5.437864e-01 -5.437864e-01 9.567086e-02 4.621262e-01 -4.621262e-01 1.435063e-01 4.330779e-01 -6.481469e-01 1.178492e-01 3.718318e-01 -5.564856e-01 1.767738e-01 7.071068e-01 -7.071068e-01 0.000000e+00 6.254466e-01 -6.254466e-01 4.783543e-02 4.943241e-01 -7.398083e-01 5.892459e-02 2.235886e-01 -5.397907e-01 2.777851e-01 1.196869e-01 -6.017066e-01 3.171966e-01 2.633623e-01 -6.358129e-01 2.083388e-01 1.385378e-01 -6.964763e-01 2.378975e-01 3.105856e-01 -4.648242e-01 2.356984e-01 6.973477e-01 -2.888509e-01 4.877258e-02 4.708158e-01 -1.950183e-01 9.754516e-02 4.336362e-01 -2.897465e-01 1.451423e-01 5.840817e-01 -2.419346e-01 7.315887e-02 5.330946e-01 -3.562024e-01 1.088568e-01 4.927540e-01 -9.801487e-02 4.900857e-02 6.147618e-01 -1.222837e-01 3.675643e-02 6.325529e-01 -4.226583e-01 7.257117e-02 7.320113e-01 -4.891143e-01 3.628558e-02 4.622308e-01 -1.115924e+00 -1.388926e-01 3.826834e-01 -9.238795e-01 0.000000e+00 1.950903e-01 -9.807853e-01 0.000000e+00 4.224571e-01 -1.019902e+00 -6.944628e-02 2.139412e-01 -1.075555e+00 -7.929916e-02 5.555702e-01 -8.314696e-01 0.000000e+00 6.168164e-01 -9.231310e-01 -5.892459e-02 2.327920e-01 -1.170325e+00 -1.585983e-01 2.516429e-01 -1.265094e+00 -2.378975e-01 1.573886e-01 -7.912460e-01 1.585983e-01 1.762395e-01 -8.860156e-01 7.929916e-02 3.429097e-01 -8.278573e-01 6.944628e-02 1.150411e+00 -4.765160e-01 -4.877258e-02 1.033748e+00 -1.033748e+00 -1.913417e-01 8.704272e-01 -8.704272e-01 -9.567086e-02 9.520873e-01 -9.520873e-01 -1.435063e-01 1.030386e+00 -6.884821e-01 -7.257117e-02 1.129845e+00 -7.549381e-01 -1.088568e-01 7.887670e-01 -7.887670e-01 -4.783543e-02 9.309280e-01 -6.220262e-01 -3.628558e-02 1.376943e+00 -5.703486e-01 -9.754516e-02 1.468817e+00 -2.921658e-01 -4.900857e-02 1.263677e+00 -5.234323e-01 -7.315887e-02 1.346809e+00 -2.678969e-01 -3.675643e-02 1.229303e+00 -8.213940e-01 -1.451423e-01 5.417783e-01 -1.307968e+00 -2.777851e-01 8.005548e-01 -1.198115e+00 -2.356984e-01 5.020045e-01 -1.211946e+00 -2.083388e-01 7.393087e-01 -1.106454e+00 -1.767738e-01 2.704938e-01 -1.359864e+00 -3.171966e-01 6.780625e-01 -1.014792e+00 -1.178492e-01 9.238795e-01 -3.826834e-01 0.000000e+00 9.807853e-01 -1.950903e-01 0.000000e+00 8.106136e-01 -3.357671e-01 2.438629e-02 8.587775e-01 -1.708215e-01 1.225214e-02 8.314696e-01 -5.555702e-01 0.000000e+00 7.367696e-01 -1.465526e-01 2.450429e-02 1.224801e+00 -2.436280e-01 -2.450429e-02 1.102793e+00 -2.193592e-01 -1.225214e-02 1.037145e+00 -4.295997e-01 -2.438629e-02 3 1 3 2 0 0 0 1 3 2 4 0 0 0 0 1 3 0 5 1 0 0 1 1 3 2 7 6 0 0 0 1 3 6 8 0 0 0 1 1 3 9 11 10 0 0 0 1 3 10 12 0 0 0 0 1 3 0 13 9 0 0 1 1 3 10 14 1 0 0 0 1 3 1 17 16 0 0 0 1 3 16 18 15 0 0 0 1 3 15 19 1 0 0 1 1 3 16 21 20 0 0 0 1 3 20 22 15 0 0 1 1 3 2 23 15 0 0 0 1 3 15 24 6 0 0 1 1 3 26 28 27 0 0 0 1 3 27 29 25 0 0 0 1 3 25 30 26 0 0 1 1 3 27 31 6 0 0 0 1 3 6 32 25 0 0 1 1 3 33 35 34 0 0 0 1 3 34 36 25 0 0 0 1 3 25 37 33 0 0 1 1 3 34 38 26 0 0 0 1 3 26 40 39 0 0 0 1 3 39 41 0 0 0 0 1 3 0 42 26 0 0 1 1 3 39 43 9 0 0 0 1 3 27 44 0 0 0 0 1 3 46 48 47 0 0 0 1 3 47 49 45 0 0 0 1 3 45 50 46 0 0 1 1 3 47 51 6 0 0 0 1 3 6 52 45 0 0 1 1 3 53 55 54 0 0 0 1 3 54 56 45 0 0 0 1 3 45 57 53 0 0 1 1 3 54 58 46 0 0 0 1 3 46 60 59 0 0 0 1 3 59 61 25 0 0 0 1 3 25 62 46 0 0 1 1 3 59 63 33 0 0 0 1 3 47 64 25 0 0 0 1 3 65 67 66 0 0 0 1 3 66 68 15 0 0 0 1 3 15 69 65 0 0 1 1 3 66 70 6 0 0 0 1 3 20 72 71 0 0 0 1 3 71 73 15 0 0 0 1 3 71 74 65 0 0 0 1 3 65 76 75 0 0 0 1 3 75 77 45 0 0 0 1 3 45 78 65 0 0 1 1 3 75 79 53 0 0 0 1 3 66 80 45 0 0 0 1 3 82 84 83 0 0 0 1 3 83 85 81 0 0 0 1 3 81 86 82 0 0 1 1 3 83 88 87 0 0 0 1 3 87 89 81 0 0 1 1 3 20 91 90 0 0 0 1 3 90 92 81 0 0 0 1 3 81 93 20 0 0 1 1 3 90 94 82 0 0 0 1 3 82 97 96 0 0 0 1 3 96 98 95 0 0 0 1 3 95 99 82 0 0 1 1 3 96 101 100 0 0 0 1 3 100 102 95 0 0 1 1 3 83 103 95 0 0 0 1 3 95 104 87 0 0 1 1 3 65 107 106 0 0 0 1 3 106 108 105 0 0 0 1 3 105 109 65 0 0 1 1 3 106 110 87 0 0 0 1 3 87 111 105 0 0 1 1 3 75 112 105 0 0 0 1 3 105 113 53 0 0 1 1 3 71 114 81 0 0 0 1 3 81 115 65 0 0 1 1 3 106 116 81 0 0 0 1 3 118 120 119 0 0 0 1 3 119 121 117 0 0 0 1 3 117 122 118 0 0 1 1 3 119 123 87 0 0 0 1 3 87 124 117 0 0 1 1 3 125 127 126 0 0 0 1 3 126 128 117 0 0 0 1 3 117 129 125 0 0 1 1 3 126 130 118 0 0 0 1 3 118 132 131 0 0 0 1 3 131 133 105 0 0 0 1 3 105 134 118 0 0 1 1 3 131 135 53 0 0 0 1 3 119 136 105 0 0 0 1 3 137 139 138 0 0 0 1 3 138 140 95 0 0 0 1 3 95 141 137 0 0 1 1 3 138 142 87 0 0 0 1 3 100 144 143 0 0 0 1 3 143 145 95 0 0 0 1 3 143 146 137 0 0 0 1 3 137 148 147 0 0 0 1 3 147 149 117 0 0 0 1 3 117 150 137 0 0 1 1 3 147 151 125 0 0 0 1 3 138 152 117 0 0 0 1 3 154 156 155 0 0 0 1 3 155 157 153 0 0 0 1 3 153 158 154 0 0 1 1 3 155 160 159 0 0 0 1 3 159 161 153 0 0 1 1 3 100 163 162 0 0 0 1 3 162 164 153 0 0 0 1 3 153 165 100 0 0 1 1 3 162 166 154 0 0 0 1 3 154 169 168 0 0 0 1 3 168 170 167 0 0 0 1 3 167 171 154 0 0 1 1 3 168 173 172 0 0 0 1 3 172 174 167 0 0 1 1 3 155 175 167 0 0 0 1 3 167 176 159 0 0 1 1 3 137 179 178 0 0 0 1 3 178 180 177 0 0 0 1 3 177 181 137 0 0 1 1 3 178 182 159 0 0 0 1 3 159 183 177 0 0 1 1 3 147 184 177 0 0 0 1 3 177 185 125 0 0 1 1 3 143 186 153 0 0 0 1 3 153 187 137 0 0 1 1 3 178 188 153 0 0 0 1 3 190 192 191 0 0 0 1 3 191 193 189 0 0 0 1 3 189 194 190 0 0 1 1 3 191 195 159 0 0 0 1 3 159 196 189 0 0 1 1 3 197 199 198 0 0 0 1 3 198 200 189 0 0 0 1 3 189 201 197 0 0 1 1 3 198 202 190 0 0 0 1 3 190 204 203 0 0 0 1 3 203 205 177 0 0 0 1 3 177 206 190 0 0 1 1 3 203 207 125 0 0 0 1 3 191 208 177 0 0 0 1 3 209 211 210 0 0 0 1 3 210 212 167 0 0 0 1 3 167 213 209 0 0 1 1 3 210 214 159 0 0 0 1 3 172 216 215 0 0 0 1 3 215 217 167 0 0 0 1 3 215 218 209 0 0 0 1 3 209 220 219 0 0 0 1 3 219 221 189 0 0 0 1 3 189 222 209 0 0 1 1 3 219 223 197 0 0 0 1 3 210 224 189 0 0 0 1 3 226 228 227 0 0 0 1 3 227 229 225 0 0 0 1 3 225 230 226 0 0 1 1 3 227 232 231 0 0 0 1 3 231 233 225 0 0 1 1 3 172 235 234 0 0 0 1 3 234 236 225 0 0 0 1 3 225 237 172 0 0 1 1 3 234 238 226 0 0 0 1 3 226 241 240 0 0 0 1 3 240 242 239 0 0 0 1 3 239 243 226 0 0 1 1 3 240 244 33 0 0 0 1 3 33 245 239 0 0 1 1 3 227 246 239 0 0 0 1 3 239 247 231 0 0 1 1 3 209 250 249 0 0 0 1 3 249 251 248 0 0 0 1 3 248 252 209 0 0 1 1 3 249 253 231 0 0 0 1 3 231 254 248 0 0 1 1 3 219 255 248 0 0 0 1 3 248 256 197 0 0 1 1 3 215 257 225 0 0 0 1 3 225 258 209 0 0 1 1 3 249 259 225 0 0 0 1 3 261 263 262 0 0 0 1 3 262 264 260 0 0 0 1 3 260 265 261 0 0 1 1 3 262 266 231 0 0 0 1 3 231 267 260 0 0 1 1 3 9 269 268 0 0 0 1 3 268 270 260 0 0 0 1 3 260 271 9 0 0 1 1 3 268 272 261 0 0 0 1 3 261 274 273 0 0 0 1 3 273 275 248 0 0 0 1 3 248 276 261 0 0 1 1 3 273 277 197 0 0 0 1 3 262 278 248 0 0 0 1 3 26 280 279 0 0 0 1 3 279 281 239 0 0 0 1 3 239 282 26 0 0 1 1 3 279 283 231 0 0 0 1 3 34 284 239 0 0 0 1 3 39 285 260 0 0 0 1 3 260 286 26 0 0 1 1 3 279 287 260 0 0 0 1 geomview-1.9.4/data/geom/ref1.grp0000644000175000001440000000032307730233135013474 00000000000000GROUP 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 2 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 2 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 unit { = LIST < xyz.vect < dodec.quad } geomview-1.9.4/data/geom/ref.inst0000644000175000001440000000030307730233134013575 00000000000000INST geom { < ref.list } transforms { = TLIST 1 0 0 0 0 1 0 0 0 0 1 0 2 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 2 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 2 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 }geomview-1.9.4/data/geom/ref.list0000644000175000001440000000011007730233135013570 00000000000000LIST < xyz.vect < dodec.quad { = QUAD -1 -1 0 1 -1 0 1 1 0 -1 1 0} geomview-1.9.4/data/geom/br4fd.list0000644000175000001440000000450207730233102014020 00000000000000LIST { = MESH 2 8 0.7579059138615393 0 0 0.76651332039993 0.03177568660262966 0 0.7579779866175186 0 0.04538510606666562 0.7665625934501444 0.03169596107004424 0.0446271640792877 0.7581951357729962 0 0.0907318675787886 0.7667110744629495 0.03145571355597267 0.0892281091374536 0.7585602238832991 0 0.1360010995809191 0.7669607985179795 0.03105165122981218 0.1337760186804655 0.7590782673912475 0 0.1811518454941813 0.7673153312677793 0.03047800474002143 0.1782428169567251 0.7597568530207174 0 0.2261402424551481 0.7677800637708247 0.029726051163901 0.2225983631241245 0.7606068345221955 0 0.2709180175572909 0.7683627057880064 0.0287833158364887 0.2668093840957922 0.761643475234047 0 0.3154303394649576 0.7690740946291093 0.02763226360843495 0.3108379510433509 } { = MESH 3 8 0.7861517593139627 0 0.2661280023229838 0.7738976242448507 -0.01982764615896841 0.2833485453167403 0.769074105124659 -0.02763227943718742 0.3108379445592113 0.757071625106808 0.04705262662452854 0.28229323805774 0.7437062724435042 0.02689203114228158 0.3006908158437836 0.739090346704468 0.01795824204595514 0.3293689073588267 0.7243359492180561 0.1000200415588125 0.301004170404473 0.7098646844645808 0.07985308087092879 0.3204961991622625 0.7055942720601457 0.0696952943227478 0.3500705981219554 0.6872663974684004 0.1599998121193638 0.3227738126187827 0.671726893075355 0.1402129538949691 0.3432333014454127 0.6679544370507728 0.1287523144951528 0.3733332702265169 0.6450165049525545 0.2283615467424957 0.3482776400509785 0.6285096554912128 0.2094205706937072 0.3694984323075352 0.625400542586092 0.1966221502331062 0.3996329939579712 0.5965273548742813 0.3068186081068267 0.3784224389061146 0.579275294822943 0.2892927185164642 0.400056266821622 0.5769998417813672 0.2752223122882413 0.4295462376216213 0.5404835339218083 0.397499378804228 0.4144633058434224 0.5229476209569261 0.3820928662699146 0.435894636965632 0.5216579844253421 0.3670388728418455 0.4637493455224979 0.4753137794988412 0.502946214098463 0.4582362038235173 0.4584672578570311 0.4905491851102674 0.478294998570738 0.4582361416623694 0.4753138842983664 0.502946150726337 } geomview-1.9.4/data/geom/ref2.list0000644000175000001440000000131107730233136013657 00000000000000LIST # A couple copies of the colored square (csquare.quad), included literally here. { = GROUP 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 1 0 0 0 0 0 2 0 0 -2 0 0 1 0 0 1 unit { = CQUAD -1 -1 0 1 0 0 1 1 -1 0 0 1 0 1 1 1 0 0 1 0 1 -1 1 0 1 0 0 1 } } # Include Olaf's dodecahedron { < dodec.quad } # Any GeomReference can be enclosed in { }'s # But { }'s are only really needed for geom's, # where the trailing closebrace acts as an end-marker # for the various Load routines. # Finally an INST for a small skewed cube plus a set of axes { = INST transform .5 -.1 0 0 0 .5 .1 0 0 .1 .5 0 0 0 0 1 unit { = LIST < pieces/cube1.off < xyz.vect } } geomview-1.9.4/data/geom/octa.off0000644000175000001440000000032207730233127013547 00000000000000OFF 6 8 12 0.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 0.0 -1.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 -1.0 3 1 0 4 .7 0 0 3 4 0 3 .7 0 0 3 3 0 2 .7 0 0 3 2 0 1 .7 0 0 3 1 5 2 .7 0 0 3 2 5 3 .7 0 0 3 3 5 4 .7 0 0 3 4 5 1 .7 0 0 geomview-1.9.4/data/geom/warp.inst0000644000175000001440000000012007730233150013765 00000000000000INST transform { 1 0 0 0 0 9 0 0 0 0 3 0 0 0 0 1 } geom { < dodec.off } geomview-1.9.4/data/geom/hypercube.off0000644000175000001440000000103607730233115014607 000000000000004OFF 16 12 32 -1 -1 -1 -1.0 -1 -1 -1 1.0 -1 -1 1 -1.0 -1 -1 1 1.0 -1 1 -1 -1.0 -1 1 -1 1.0 -1 1 1 -1.0 -1 1 1 1.0 1 -1 -1 -1.0 1 -1 -1 1.0 1 -1 1 -1.0 1 -1 1 1.0 1 1 -1 -1.0 1 1 -1 1.0 1 1 1 -1.0 1 1 1 1.0 4 0 1 3 2 6 4 8 9 11 10 7 4 12 13 15 14 8 4 4 5 7 6 9 4 0 1 5 4 10 4 8 9 13 12 11 4 10 11 15 14 12 4 2 3 7 6 13 4 0 1 9 8 26 4 4 5 13 12 27 4 6 7 15 14 28 4 2 3 11 10 29 geomview-1.9.4/data/geom/helicoid0000644000175000001440000004233210530062313013624 00000000000000OFF 441 400 840 0 3.62686 0 -1.12076 3.44935 0.314159 0 2.94217 0 0 2.37557 0 0 1.9043 0 -0.466449 1.43558 0.314159 0 1.50946 0 -0.363157 1.11768 0.314159 0 1.1752 0 0 0.888106 0 0 0.636654 0 0 0.410752 0 -0.126929 0.390649 0.314159 0 0.201336 0 0 0 0 0 -0.201336 0 0 -0.410752 0 0.126929 -0.390649 0.314159 0 -0.636654 0 0.27444 -0.844639 0.314159 0 -0.888106 0 0 -1.1752 0 0 -1.50946 0 0 -1.9043 0 0 -2.37557 0 0.734091 -2.2593 0.314159 0 -2.94217 0 1.12076 -3.44935 0.314159 0 -3.62686 0 -2.13181 2.93419 0.628319 -0.909182 2.79817 0.314159 -1.72937 2.38027 0.628319 -1.39632 1.92188 0.628319 -0.734091 2.2593 0.314159 -0.588462 1.8111 0.314159 -0.27444 0.844639 0.314159 -0.522016 0.718493 0.628319 -0.196737 0.605494 0.314159 -0.374216 0.515064 0.628319 -0.062216 0.191482 0.314159 0 0 0.314159 0.118342 -0.162884 0.628319 0.062216 -0.191482 0.314159 0.196737 -0.605494 0.314159 0.363157 -1.11768 0.314159 0.466449 -1.43558 0.314159 0.887239 -1.22118 0.628319 0.588462 -1.8111 0.314159 1.11932 -1.54061 0.628319 1.72937 -2.38027 0.628319 0.909182 -2.79817 0.314159 2.13181 -2.93419 0.628319 -1.54061 1.11932 0.942478 -1.11932 1.54061 0.628319 -0.887239 1.22118 0.628319 -0.690766 0.950758 0.628319 -0.241434 0.332306 0.628319 -0.332306 0.241434 0.942478 -0.118342 0.162884 0.628319 -0.162884 0.118342 0.942478 0 0 0.628319 0.162884 -0.118342 0.942478 0.241434 -0.332306 0.628319 0.374216 -0.515064 0.628319 0.522016 -0.718493 0.628319 0.690766 -0.950758 0.628319 1.39632 -1.92188 0.628319 2.93419 -2.13181 0.942478 -2.93419 2.13181 0.942478 -2.79817 0.909182 1.25664 -2.38027 1.72937 0.942478 -1.92188 1.39632 0.942478 -1.8111 0.588462 1.25664 -1.22118 0.887239 0.942478 -0.950758 0.690766 0.942478 -1.11768 0.363157 1.25664 -0.718493 0.522016 0.942478 -0.844639 0.27444 1.25664 -0.515064 0.374216 0.942478 -0.390649 0.126929 1.25664 0 0 0.942478 0.191482 -0.062216 1.25664 0.390649 -0.126929 1.25664 0.332306 -0.241434 0.942478 0.515064 -0.374216 0.942478 0.718493 -0.522016 0.942478 0.844639 -0.27444 1.25664 0.950758 -0.690766 0.942478 1.11768 -0.363157 1.25664 1.43558 -0.466449 1.25664 1.22118 -0.887239 0.942478 1.8111 -0.588462 1.25664 1.54061 -1.11932 0.942478 1.92188 -1.39632 0.942478 2.38027 -1.72937 0.942478 -3.44935 1.12076 1.25664 -2.94217 0 1.5708 -2.2593 0.734091 1.25664 -1.9043 0 1.5708 -1.43558 0.466449 1.25664 -1.1752 0 1.5708 -0.605494 0.196737 1.25664 -0.191482 0.062216 1.25664 0 0 1.5708 0 0 1.25664 0.636654 0 1.5708 0.605494 -0.196737 1.25664 0.888106 0 1.5708 1.1752 0 1.5708 1.50946 0 1.5708 1.9043 0 1.5708 2.2593 -0.734091 1.25664 2.79817 -0.909182 1.25664 2.94217 0 1.5708 3.62686 0 1.5708 3.44935 -1.12076 1.25664 -3.62686 0 1.5708 -2.79817 -0.909182 1.88496 -2.37557 0 1.5708 -1.43558 -0.466449 1.88496 -1.50946 0 1.5708 -0.888106 0 1.5708 -0.636654 0 1.5708 -0.605494 -0.196737 1.88496 -0.410752 0 1.5708 -0.390649 -0.126929 1.88496 -0.201336 0 1.5708 0.201336 0 1.5708 0.410752 0 1.5708 0.605494 0.196737 1.88496 2.37557 0 1.5708 3.44935 1.12076 1.88496 -3.44935 -1.12076 1.88496 -2.38027 -1.72937 2.19912 -2.2593 -0.734091 1.88496 -1.54061 -1.11932 2.19912 -1.8111 -0.588461 1.88496 -1.22118 -0.887239 2.19912 -1.11768 -0.363157 1.88496 -0.950758 -0.690766 2.19912 -0.844639 -0.27444 1.88496 -0.191482 -0.062216 1.88496 0 0 1.88496 0.191482 0.062216 1.88496 0.390649 0.126929 1.88496 0.515064 0.374216 2.19912 0.844639 0.27444 1.88496 0.718493 0.522016 2.19912 1.11768 0.363157 1.88496 1.22118 0.887239 2.19912 1.43558 0.466449 1.88496 1.8111 0.588461 1.88496 1.54061 1.11932 2.19912 2.2593 0.734091 1.88496 2.79817 0.909182 1.88496 2.38027 1.72937 2.19912 2.93419 2.13181 2.19912 -2.93419 -2.13181 2.19912 -1.72937 -2.38027 2.51327 -1.39632 -1.92188 2.51327 -1.92188 -1.39632 2.19912 -0.718493 -0.522016 2.19912 -0.374216 -0.515064 2.51327 -0.515064 -0.374216 2.19912 -0.332306 -0.241434 2.19912 -0.118342 -0.162884 2.51327 -0.162884 -0.118342 2.19912 0 0 2.19912 0.118342 0.162884 2.51327 0.162884 0.118342 2.19912 0.332306 0.241434 2.19912 0.374216 0.515064 2.51327 0.522016 0.718493 2.51327 0.690766 0.950758 2.51327 0.950758 0.690766 2.19912 1.92188 1.39632 2.19912 2.13181 2.93419 2.51327 -2.13181 -2.93419 2.51327 -0.734091 -2.2593 2.82743 -1.11932 -1.54061 2.51327 -0.466449 -1.43558 2.82743 -0.887239 -1.22118 2.51327 -0.690766 -0.950758 2.51327 -0.363157 -1.11768 2.82743 -0.522016 -0.718493 2.51327 -0.196737 -0.605494 2.82743 -0.241434 -0.332306 2.51327 0 0 2.51327 0.062216 0.191482 2.82743 0.126929 0.390649 2.82743 0.241434 0.332306 2.51327 0.27444 0.844639 2.82743 0.363157 1.11768 2.82743 0.466449 1.43558 2.82743 0.887239 1.22118 2.51327 1.11932 1.54061 2.51327 0.588462 1.8111 2.82743 1.39632 1.92188 2.51327 0.909182 2.79817 2.82743 1.72937 2.38027 2.51327 1.12076 3.44935 2.82743 -1.12076 -3.44935 2.82743 0 -2.94217 3.14159 -0.909182 -2.79817 2.82743 0 -2.37557 3.14159 -0.588462 -1.8111 2.82743 0 -1.1752 3.14159 0 -0.888106 3.14159 -0.27444 -0.844639 2.82743 0 -0.410752 3.14159 -0.126929 -0.390649 2.82743 -0.062216 -0.191482 2.82743 0 -0.201336 3.14159 0 0 2.82743 0 0 3.14159 0 0.201336 3.14159 0.196737 0.605494 2.82743 0 1.50946 3.14159 0 1.9043 3.14159 0.734091 2.2593 2.82743 0 2.94217 3.14159 0 -3.62686 3.14159 1.12076 -3.44935 3.45575 0.588461 -1.8111 3.45575 0 -1.9043 3.14159 0 -1.50946 3.14159 0 -0.636654 3.14159 0.126929 -0.390649 3.45575 0.062216 -0.191482 3.45575 0 0 3.45575 -0.062216 0.191482 3.45575 0 0.410752 3.14159 0 0.636654 3.14159 0 0.888106 3.14159 0 1.1752 3.14159 -0.363157 1.11768 3.45575 0 2.37557 3.14159 -0.909182 2.79817 3.45575 0 3.62686 3.14159 2.13181 -2.93419 3.76991 0.909182 -2.79817 3.45575 0.734091 -2.2593 3.45575 1.39632 -1.92188 3.76991 0.466449 -1.43558 3.45575 0.363157 -1.11768 3.45575 0.27444 -0.844639 3.45575 0.374216 -0.515064 3.76991 0.196737 -0.605494 3.45575 0.241434 -0.332306 3.76991 0.118342 -0.162884 3.76991 0 0 3.76991 -0.241434 0.332306 3.76991 -0.126929 0.390649 3.45575 -0.196737 0.605494 3.45575 -0.522016 0.718493 3.76991 -0.27444 0.844639 3.45575 -0.466449 1.43558 3.45575 -0.588461 1.8111 3.45575 -0.734091 2.2593 3.45575 -1.72937 2.38027 3.76991 -1.12076 3.44935 3.45575 1.72937 -2.38027 3.76991 1.11932 -1.54061 3.76991 0.887239 -1.22118 3.76991 1.22118 -0.887239 4.08407 0.950758 -0.690766 4.08407 0.690766 -0.950758 3.76991 0.522016 -0.718493 3.76991 0.162884 -0.118342 4.08407 0 0 4.08407 -0.118342 0.162884 3.76991 -0.162884 0.118342 4.08407 -0.332306 0.241434 4.08407 -0.374216 0.515064 3.76991 -0.718493 0.522016 4.08407 -0.690766 0.950758 3.76991 -0.950758 0.690766 4.08407 -0.887239 1.22118 3.76991 -1.11932 1.54061 3.76991 -1.39632 1.92188 3.76991 -2.93419 2.13181 4.08407 -2.13181 2.93419 3.76991 2.93419 -2.13181 4.08407 2.38027 -1.72937 4.08407 1.92188 -1.39632 4.08407 1.54061 -1.11932 4.08407 0.718493 -0.522016 4.08407 0.844639 -0.27444 4.39823 0.515064 -0.374216 4.08407 0.332306 -0.241434 4.08407 0.191482 -0.062216 4.39823 0 0 4.39823 -0.191482 0.062216 4.39823 -0.390649 0.126929 4.39823 -0.515064 0.374216 4.08407 -0.605494 0.196737 4.39823 -0.844639 0.27444 4.39823 -1.22118 0.887239 4.08407 -1.43558 0.466449 4.39823 -1.54061 1.11932 4.08407 -1.92188 1.39632 4.08407 -2.2593 0.734091 4.39823 -2.38027 1.72937 4.08407 3.44935 -1.12076 4.39823 3.62686 0 4.71239 2.79817 -0.909182 4.39823 2.94217 0 4.71239 2.2593 -0.734091 4.39823 1.8111 -0.588462 4.39823 1.9043 0 4.71239 1.43558 -0.466449 4.39823 1.1752 0 4.71239 1.11768 -0.363157 4.39823 0.605494 -0.196737 4.39823 0.390649 -0.126929 4.39823 0.410752 0 4.71239 0 0 4.71239 -0.201336 0 4.71239 -0.410752 0 4.71239 -1.11768 0.363157 4.39823 -1.9043 0 4.71239 -1.8111 0.588462 4.39823 -2.94217 0 4.71239 -2.79817 0.909182 4.39823 -3.62686 0 4.71239 -3.44935 1.12076 4.39823 2.37557 0 4.71239 1.50946 0 4.71239 0.844639 0.27444 5.02655 0.888106 0 4.71239 0.636654 0 4.71239 0.605494 0.196737 5.02655 0.201336 0 4.71239 0.191482 0.062216 5.02655 -0.390649 -0.126929 5.02655 -0.636654 0 4.71239 -0.888106 0 4.71239 -1.1752 0 4.71239 -1.11768 -0.363157 5.02655 -1.50946 0 4.71239 -2.37557 0 4.71239 -2.2593 -0.734091 5.02655 -3.44935 -1.12076 5.02655 3.44935 1.12076 5.02655 2.79817 0.909182 5.02655 2.2593 0.734091 5.02655 1.8111 0.588461 5.02655 1.43558 0.466449 5.02655 0.950758 0.690766 5.34071 1.11768 0.363157 5.02655 0.515064 0.374216 5.34071 0.390649 0.126929 5.02655 0.162884 0.118342 5.34071 0 0 5.02655 -0.162884 -0.118342 5.34071 -0.191482 -0.062216 5.02655 -0.332306 -0.241434 5.34071 -0.605494 -0.196737 5.02655 -0.718493 -0.522016 5.34071 -0.844639 -0.27444 5.02655 -0.950758 -0.690766 5.34071 -1.43558 -0.466449 5.02655 -1.22118 -0.887239 5.34071 -1.8111 -0.588461 5.02655 -1.54061 -1.11932 5.34071 -2.79817 -0.909182 5.02655 -2.38027 -1.72937 5.34071 2.93419 2.13181 5.34071 2.13181 2.93419 5.65487 2.38027 1.72937 5.34071 1.72937 2.38027 5.65487 1.92188 1.39632 5.34071 1.39632 1.92188 5.65487 1.54061 1.11932 5.34071 1.22118 0.887239 5.34071 0.887239 1.22118 5.65487 0.690766 0.950758 5.65487 0.718493 0.522016 5.34071 0.522016 0.718493 5.65487 0.374216 0.515064 5.65487 0.332306 0.241434 5.34071 0.241434 0.332306 5.65487 0.118342 0.162884 5.65487 0 0 5.34071 -0.118342 -0.162884 5.65487 -0.241434 -0.332306 5.65487 -0.515064 -0.374216 5.34071 -0.522016 -0.718493 5.65487 -1.92188 -1.39632 5.34071 -2.13181 -2.93419 5.65487 -2.93419 -2.13181 5.34071 1.12076 3.44935 5.96903 0.909182 2.79817 5.96903 1.11932 1.54061 5.65487 0.363157 1.11768 5.96903 0.196737 0.605494 5.96903 0.062216 0.191482 5.96903 0 0 5.96903 0 0 5.65487 -0.062216 -0.191482 5.96903 -0.126929 -0.390649 5.96903 -0.374216 -0.515064 5.65487 -0.27444 -0.844639 5.96903 -0.690766 -0.950758 5.65487 -0.466449 -1.43558 5.96903 -0.887239 -1.22118 5.65487 -0.588462 -1.8111 5.96903 -1.11932 -1.54061 5.65487 -1.39632 -1.92188 5.65487 -0.734091 -2.2593 5.96903 -1.72937 -2.38027 5.65487 -0.909182 -2.79817 5.96903 0 3.62686 6.28319 0 2.94217 6.28319 0.734091 2.2593 5.96903 0 2.37557 6.28319 0 1.9043 6.28319 0.588462 1.8111 5.96903 0 1.50946 6.28319 0.466449 1.43558 5.96903 0 1.1752 6.28319 0.27444 0.844639 5.96903 0 0.888106 6.28319 0 0.636654 6.28319 0 0.410752 6.28319 0.126929 0.390649 5.96903 0 0.201336 6.28319 0 0 6.28319 0 -0.201336 6.28319 0 -0.410752 6.28319 -0.196737 -0.605494 5.96903 0 -0.636654 6.28319 0 -0.888106 6.28319 -0.363157 -1.11768 5.96903 0 -1.1752 6.28319 0 -1.50946 6.28319 0 -1.9043 6.28319 0 -2.37557 6.28319 0 -2.94217 6.28319 0 -3.62686 6.28319 -1.12076 -3.44935 5.96903 4 0 1 30 2 4 2 30 33 3 4 3 33 34 4 4 4 34 5 6 4 6 5 7 8 4 8 7 35 9 4 9 35 37 10 4 10 37 12 11 4 11 12 39 13 4 13 39 40 14 4 14 40 42 15 4 15 42 17 16 4 16 17 43 18 4 18 43 19 20 4 20 19 44 21 4 21 44 45 22 4 22 45 47 23 4 23 47 25 24 4 24 25 50 26 4 26 50 27 28 4 1 29 31 30 4 30 31 32 33 4 33 32 53 34 4 34 53 54 5 4 5 54 55 7 4 7 55 36 35 4 35 36 38 37 4 37 38 56 12 4 12 56 58 39 4 39 58 60 40 4 40 60 41 42 4 42 41 62 17 4 17 62 63 43 4 43 63 64 19 4 19 64 65 44 4 44 65 46 45 4 45 46 48 47 4 47 48 66 25 4 25 66 49 50 4 50 49 51 27 4 29 68 70 31 4 31 70 71 32 4 32 71 52 53 4 53 52 73 54 4 54 73 74 55 4 55 74 76 36 4 36 76 78 38 4 38 78 57 56 4 56 57 59 58 4 58 59 80 60 4 60 80 61 41 4 41 61 83 62 4 62 83 84 63 4 63 84 85 64 4 64 85 87 65 4 65 87 90 46 4 46 90 92 48 4 48 92 93 66 4 66 93 94 49 4 49 94 67 51 4 68 95 69 70 4 70 69 97 71 4 71 97 72 52 4 52 72 99 73 4 73 99 75 74 4 74 75 77 76 4 76 77 101 78 4 78 101 79 57 4 57 79 102 59 4 59 102 104 80 4 80 104 81 61 4 61 81 82 83 4 83 82 106 84 4 84 106 86 85 4 85 86 88 87 4 87 88 89 90 4 90 89 91 92 4 92 91 111 93 4 93 111 112 94 4 94 112 115 67 4 95 116 96 69 4 69 96 118 97 4 97 118 98 72 4 72 98 120 99 4 99 120 100 75 4 75 100 121 77 4 77 121 122 101 4 101 122 124 79 4 79 124 126 102 4 102 126 103 104 4 104 103 127 81 4 81 127 128 82 4 82 128 105 106 4 106 105 107 86 4 86 107 108 88 4 88 108 109 89 4 89 109 110 91 4 91 110 130 111 4 111 130 113 112 4 112 113 114 115 4 116 132 117 96 4 96 117 134 118 4 118 134 136 98 4 98 136 119 120 4 120 119 138 100 4 100 138 140 121 4 121 140 123 122 4 122 123 125 124 4 124 125 141 126 4 126 141 142 103 4 103 142 143 127 4 127 143 144 128 4 128 144 129 105 4 105 129 146 107 4 107 146 148 108 4 108 148 150 109 4 109 150 151 110 4 110 151 153 130 4 130 153 154 113 4 113 154 131 114 4 132 157 133 117 4 117 133 160 134 4 134 160 135 136 4 136 135 137 119 4 119 137 139 138 4 138 139 161 140 4 140 161 163 123 4 123 163 164 125 4 125 164 166 141 4 141 166 167 142 4 142 167 169 143 4 143 169 170 144 4 144 170 145 129 4 129 145 147 146 4 146 147 174 148 4 148 174 149 150 4 150 149 152 151 4 151 152 175 153 4 153 175 155 154 4 154 155 156 131 4 157 177 158 133 4 133 158 159 160 4 160 159 179 135 4 135 179 181 137 4 137 181 182 139 4 139 182 184 161 4 161 184 162 163 4 163 162 186 164 4 164 186 165 166 4 166 165 187 167 4 167 187 168 169 4 169 168 190 170 4 170 190 171 145 4 145 171 172 147 4 147 172 173 174 4 174 173 194 149 4 149 194 195 152 4 152 195 197 175 4 175 197 199 155 4 155 199 176 156 4 177 201 203 158 4 158 203 178 159 4 159 178 205 179 4 179 205 180 181 4 181 180 183 182 4 182 183 208 184 4 184 208 185 162 4 162 185 210 186 4 186 210 211 165 4 165 211 213 187 4 187 213 188 168 4 168 188 189 190 4 190 189 216 171 4 171 216 191 172 4 172 191 192 173 4 173 192 193 194 4 194 193 196 195 4 195 196 219 197 4 197 219 198 199 4 199 198 200 176 4 201 221 202 203 4 203 202 204 178 4 178 204 224 205 4 205 224 225 180 4 180 225 206 183 4 183 206 207 208 4 208 207 226 185 4 185 226 209 210 4 210 209 212 211 4 211 212 214 213 4 213 214 215 188 4 188 215 231 189 4 189 231 232 216 4 216 232 233 191 4 191 233 234 192 4 192 234 217 193 4 193 217 218 196 4 196 218 236 219 4 219 236 220 198 4 198 220 238 200 4 221 222 240 202 4 202 240 241 204 4 204 241 223 224 4 224 223 243 225 4 225 243 244 206 4 206 244 245 207 4 207 245 247 226 4 226 247 227 209 4 209 227 228 212 4 212 228 229 214 4 214 229 230 215 4 215 230 252 231 4 231 252 253 232 4 232 253 255 233 4 233 255 235 234 4 234 235 256 217 4 217 256 257 218 4 218 257 258 236 4 236 258 237 220 4 220 237 260 238 4 222 239 261 240 4 240 261 242 241 4 241 242 262 223 4 223 262 263 243 4 243 263 266 244 4 244 266 267 245 4 245 267 246 247 4 247 246 248 227 4 227 248 249 228 4 228 249 250 229 4 229 250 270 230 4 230 270 251 252 4 252 251 273 253 4 253 273 254 255 4 255 254 275 235 4 235 275 277 256 4 256 277 278 257 4 257 278 279 258 4 258 279 259 237 4 237 259 281 260 4 239 282 283 261 4 261 283 284 242 4 242 284 285 262 4 262 285 264 263 4 263 264 265 266 4 266 265 286 267 4 267 286 288 246 4 246 288 289 248 4 248 289 268 249 4 249 268 269 250 4 250 269 271 270 4 270 271 272 251 4 251 272 294 273 4 273 294 274 254 4 254 274 276 275 4 275 276 297 277 4 277 297 299 278 4 278 299 300 279 4 279 300 302 259 4 259 302 280 281 4 282 303 305 283 4 283 305 307 284 4 284 307 308 285 4 285 308 310 264 4 264 310 312 265 4 265 312 287 286 4 286 287 313 288 4 288 313 314 289 4 289 314 290 268 4 268 290 291 269 4 269 291 292 271 4 271 292 293 272 4 272 293 295 294 4 294 295 296 274 4 274 296 319 276 4 276 319 298 297 4 297 298 321 299 4 299 321 301 300 4 300 301 323 302 4 302 323 325 280 4 303 304 306 305 4 305 306 326 307 4 307 326 309 308 4 308 309 327 310 4 310 327 311 312 4 312 311 329 287 4 287 329 330 313 4 313 330 315 314 4 314 315 332 290 4 290 332 316 291 4 291 316 317 292 4 292 317 318 293 4 293 318 335 295 4 295 335 336 296 4 296 336 337 319 4 319 337 339 298 4 298 339 320 321 4 321 320 340 301 4 301 340 322 323 4 323 322 324 325 4 304 343 344 306 4 306 344 345 326 4 326 345 346 309 4 309 346 347 327 4 327 347 349 311 4 311 349 328 329 4 329 328 331 330 4 330 331 351 315 4 315 351 333 332 4 332 333 353 316 4 316 353 355 317 4 317 355 334 318 4 318 334 357 335 4 335 357 359 336 4 336 359 338 337 4 337 338 361 339 4 339 361 363 320 4 320 363 341 340 4 340 341 365 322 4 322 365 342 324 4 343 367 369 344 4 344 369 371 345 4 345 371 373 346 4 346 373 374 347 4 347 374 348 349 4 349 348 377 328 4 328 377 350 331 4 331 350 380 351 4 351 380 352 333 4 333 352 383 353 4 353 383 354 355 4 355 354 356 334 4 334 356 386 357 4 357 386 358 359 4 359 358 360 338 4 338 360 362 361 4 361 362 364 363 4 363 364 388 341 4 341 388 366 365 4 365 366 390 342 4 367 368 370 369 4 369 370 372 371 4 371 372 393 373 4 373 393 375 374 4 374 375 376 348 4 348 376 378 377 4 377 378 379 350 4 350 379 381 380 4 380 381 382 352 4 352 382 398 383 4 383 398 384 354 4 354 384 385 356 4 356 385 401 386 4 386 401 387 358 4 358 387 403 360 4 360 403 405 362 4 362 405 407 364 4 364 407 408 388 4 388 408 410 366 4 366 410 389 390 4 368 391 392 370 4 370 392 414 372 4 372 414 417 393 4 393 417 419 375 4 375 419 394 376 4 376 394 421 378 4 378 421 395 379 4 379 395 425 381 4 381 425 396 382 4 382 396 397 398 4 398 397 399 384 4 384 399 400 385 4 385 400 430 401 4 401 430 402 387 4 387 402 433 403 4 403 433 404 405 4 405 404 406 407 4 407 406 409 408 4 408 409 411 410 4 410 411 440 389 4 391 412 413 392 4 392 413 415 414 4 414 415 416 417 4 417 416 418 419 4 419 418 420 394 4 394 420 422 421 4 421 422 423 395 4 395 423 424 425 4 425 424 426 396 4 396 426 427 397 4 397 427 428 399 4 399 428 429 400 4 400 429 431 430 4 430 431 432 402 4 402 432 434 433 4 433 434 435 404 4 404 435 436 406 4 406 436 437 409 4 409 437 438 411 4 411 438 439 440 geomview-1.9.4/data/cmap.fmap0000644000175000001440000000365707730233005012774 00000000000000# # This colormap is used by OFF objects when a single (integer) color component # is specified per face. # 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 .7 .15 .1 .75 .2 .2 .8 .75 .9 .6 .02 .75 .1 .3 .8 .75 .1 .7 .2 .75 .8 .8 .4 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 .2 .75 .2 .9 0 .75 0 .2 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .8 .4 0 .75 0 .4 .8 .75 0 .4 .8 .75 0 .8 .4 .75 0 .8 .4 .75 .4 0 .8 .75 .4 0 .8 .75 .8 0 .4 .75 .8 0 .4 .75 .7 .5 .2 .75 .7 .5 .2 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 0 .75 0 .9 0 .75 0 0 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .4 .8 0 .75 0 .4 .8 .75 0 .8 .4 .75 .4 0 .8 .75 .8 0 .4 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 0 .75 0 .9 0 .75 0 0 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .4 .8 0 .75 0 .4 .8 .75 0 .8 .4 .75 .4 0 .8 .75 .8 0 .4 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 0 .75 0 .9 0 .75 0 0 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .4 .8 0 .75 0 .4 .8 .75 0 .8 .4 .75 .4 0 .8 .75 .8 0 .4 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 1.0 1.0 1.0 .75 .05 .3 .1 .75 .7 .01 .1 .75 .2 .05 .6 .75 .9 .9 .02 .75 .0 .2 .4 .75 .1 .4 .4 .75 .8 .8 .8 .75 .7 .7 0 .75 .7 .7 0 .75 .7 0 .7 .75 .7 0 .7 .75 0 .7 .7 .75 0 .7 .7 .75 .9 0 0 .75 .9 0 0 .75 0 .9 0 .75 0 .9 0 .75 0 0 .9 .75 0 0 .9 .75 .75 .75 .75 .75 .75 .75 .75 .75 .8 .4 0 .75 .8 .4 0 .75 0 .4 .8 .75 0 .4 .8 .75 0 .8 .4 .75 0 .8 .4 .75 .4 0 .8 .75 .4 0 .8 .75 .8 0 .4 .75 .8 0 .4 .75 .7 .5 .2 .75 .7 .5 .2 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 0 .75 0 .9 0 .75 0 0 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .4 .8 0 .75 0 .4 .8 .75 0 .8 .4 .75 .4 0 .8 .75 .8 0 .4 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 0 .75 0 .9 0 .75 0 0 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .4 .8 0 .75 0 .4 .8 .75 0 .8 .4 .75 .4 0 .8 .75 .8 0 .4 .75 .7 .7 0 .75 .7 0 .7 .75 0 .7 .7 .75 .9 0 0 .75 0 .9 0 .75 0 0 .9 .75 .75 .75 .75 .75 .8 .4 0 .75 .4 .8 0 .75 0 .4 .8 .75 0 .8 .4 .75 .4 0 .8 .75 .8 0 .4 .75 geomview-1.9.4/data/shaders/0000777000175000001440000000000010665240703012715 500000000000000geomview-1.9.4/data/shaders/hlight.sdl0000644000175000001440000000320410624244366014617 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 6.5.0 linux64 (Feb 9 2007) "Ennio" %code 6 40 3 27 4 Cl Ol L Ps 4 "k1" "" 2 1 0 0 "intensity" "" 2 1 0 0 "lightcolor" "rgb" 2 3 0 0 "from" "camera" 2 2 0 0 6 1 2 1 0 10 1 0 10 1 0 1 1 0 1 1 0 3 1 0 8 0 10 1 0 10 1 0 1 1 0 1 1 0 1 1 0 1 1 0 3 1 0 2 1 0 5 5 0 1 5.00000000e-01 1 1.00000000e+00 1 1.00000001e-01 1 0.00000000e+00 1 "camera" 3 1 4 23 3 1 5 24 5 18 6 24 24 25 9 18 8 26 26 26 20 7 8 2 0 0 0 0 0 0 0 273 358 18 1 24 24 24 6 0 26 359 295 14 22 7 22 22 3 2 345 9 14 364 9 230 358 360 14 36 21 7 2 58 16 21 21 69 15 16 24 362 359 17 15 14 15 345 10 15 364 10 46 358 360 15 104 17 16 50 16 24 17 194 17 21 42 19 16 17 197 21 19 195 19 21 42 17 16 19 198 21 17 196 17 21 42 19 16 17 199 21 19 58 16 21 21 362 359 358 360 14 37 16 24 16 64 15 16 26 362 359 17 15 14 15 345 10 15 364 10 8 358 360 15 1 16 26 362 359 58 11 7 7 37 12 24 11 358 360 14 1 17 12 58 19 21 7 37 18 24 19 42 16 16 17 68 15 16 26 362 359 17 15 14 15 345 10 15 364 10 60 358 360 15 104 19 16 50 16 18 19 42 19 16 16 37 17 19 24 115 17 17 104 17 17 32 16 16 17 106 16 16 362 359 43 13 5 6 62 12 4 358 360 15 42 16 12 16 103 17 16 45 20 13 17 36 0 0 20 362 359 347 15 15 14 345 10 15 364 10 8 358 360 15 6 0 26 362 359 378 14 3 2 0 22 346 14 14 345 9 14 364 9 10 358 360 14 18 0 26 26 26 362 359 %comment-3dl 6 40 0 %comment-user 6 40 0 geomview-1.9.4/data/shaders/hlight.sdr0000644000175000001440000000664210624242144014626 00000000000000#!version 2.1.1 light #!parameters: uniform float k1 = 0.5 uniform float intensity = 1 uniform color lightcolor = [ 1 1 .1 ] uniform point from = "camera" [ 0 0 0 ] #!variables: uniform vector temporary_0 varying float inpro varying float hdis varying float d varying float PP varying float QQ varying float PQ varying float tmp varying float PdotP varying vector sP varying vector temporary_1 varying vector temporary_2 varying boolean temporary_3 varying float temporary_4 varying float temporary_5 uniform float temporary_6 uniform float temporary_7 varying float temporary_8 varying float temporary_9 varying float temporary_10 varying float temporary_11 varying vector temporary_12 uniform vector temporary_13 varying vector temporary_14 #!Init: vfromf temporary_0 0 0 0 pfrom from "camera" temporary_0 return #!Code: vfromf temporary_0 0 vuvector Cl temporary_0 vuvector temporary_1 from illuminate temporary_1 #!Label8 vuvector temporary_2 from addvv sP temporary_2 L dot PdotP sP sP vufloat temporary_4 1.0 fegt temporary_3 PdotP temporary_4 if temporary_3 #!Label9 vufloat temporary_4 1.0 sqrt ("f=f") temporary_5 PdotP divff d temporary_4 temporary_5 xcomp ("f=p") temporary_5 sP mulff temporary_4 d temporary_5 setxcomp ("o=Vf") sP temporary_4 ycomp ("f=p") temporary_5 sP mulff temporary_4 d temporary_5 setycomp ("o=Vf") sP temporary_4 zcomp ("f=p") temporary_5 sP mulff temporary_4 d temporary_5 setzcomp ("o=Vf") sP temporary_4 dot PdotP sP sP #!Label9: endif vufloat temporary_4 1.0 subff PP temporary_4 PdotP vufloat temporary_4 0 flt temporary_3 PP temporary_4 if temporary_3 #!Label11 vufloat PP 0 #!Label11: endif dot temporary_7 from from subff temporary_6 1.0 temporary_7 vufloat QQ temporary_6 vufloat temporary_4 1.0 vuvector temporary_2 from dot temporary_5 sP temporary_2 subff PQ temporary_4 temporary_5 mulff d PP QQ vufloat temporary_4 0 fgt temporary_3 d temporary_4 if temporary_3 #!Label14 sqrt ("f=f") temporary_4 d divff inpro PQ temporary_4 mulff temporary_10 inpro inpro vufloat temporary_11 1 subff temporary_9 temporary_10 temporary_11 abs ("f=f") temporary_8 temporary_9 sqrt ("f=f") temporary_5 temporary_8 addff temporary_4 inpro temporary_5 log ("f=f") hdis temporary_4 vfromf temporary_13 intensity mulvv temporary_0 temporary_13 lightcolor vuvector temporary_12 temporary_0 vufloat temporary_9 k1 mulff temporary_8 temporary_9 hdis negf temporary_5 temporary_8 exp ("f=f") temporary_4 temporary_5 vfromf temporary_14 temporary_4 mulvv temporary_2 temporary_12 temporary_14 addvv Cl Cl temporary_2 #!Label14: else #!Label13 vfromf temporary_0 0 vuvector Cl temporary_0 #!Label13: endif #!Label8: endilluminate return geomview-1.9.4/data/shaders/hlight.slo0000644000175000001440000000344410462665406014642 00000000000000shader_obj 3.1 1 0 hlight 35 5 8 20 33 0 4 4 0 4 14 4 22 eye object rgb camera 4 0.5 1 0.1 0 0 35 k1 4 5 -1 1 3 1 1 1 1 29 29 intensity 4 5 -1 2 3 1 2 2 2 28 28 lightcolor 3 5 2 3 3 1 3 3 3 3 28 from 2 5 1 4 3 1 4 4 4 4 33 $C1 4 2 -1 0 3 0 0 0 0 1 1 $C2 4 2 -1 1 3 0 0 0 0 2 23 $C3 4 2 -1 2 3 0 0 0 0 3 3 $S6 6 2 -1 3 3 0 0 0 0 4 4 $C4 4 2 -1 3 3 0 0 0 0 4 33 inpro 4 3 -1 0 2 0 0 21 21 21 26 hdis 4 3 -1 0 2 0 0 27 27 27 30 d 4 3 -1 0 2 0 0 17 17 17 20 PP 4 3 -1 0 2 0 0 9 12 9 17 QQ 4 3 -1 0 2 0 0 14 14 14 17 PQ 4 3 -1 0 2 0 0 16 16 16 21 sP 2 3 0 0 2 0 0 7 7 7 15 Cl 3 10 2 0 2 0 0 5 33 33 33 $?0 10 11 -1 0 2 0 0 6 33 6 33 $T2 4 4 -1 0 2 0 0 6 33 6 33 L 2 10 0 0 2 0 0 0 0 7 7 $T4 4 4 -1 0 2 0 0 8 32 8 32 $?1 10 11 -1 0 2 0 0 12 12 12 12 $T6 11 4 -1 0 2 0 0 11 33 11 33 $X0 9 8 -1 0 2 0 0 0 0 10 11 $X1 9 8 -1 0 2 0 0 0 0 11 12 $X2 9 8 -1 0 3 0 0 0 0 12 12 $T7 4 4 -1 0 3 0 0 13 30 13 30 $?2 10 11 -1 0 2 0 0 33 33 33 33 $X3 9 8 -1 0 2 0 0 0 0 18 19 $T19 4 4 -1 0 2 0 0 23 31 23 31 $T21 3 4 2 0 3 0 0 28 32 28 32 $T25 3 4 2 0 2 0 0 32 33 32 33 $X4 9 8 -1 0 2 0 0 0 0 19 33 $X5 9 8 -1 0 3 0 0 0 0 33 33 $X6 9 8 -1 0 2 0 0 0 0 6 33 98 0 4 1 5 2 5 5 6 3 7 8 8 8 16 8 18 17 8 34 3 15 3 19 20 15 15 12 5 20 22 23 24 25 21 22 12 8 12 8 26 3 3 13 5 26 20 15 3 14 5 20 11 12 13 22 28 32 33 27 22 11 8 20 11 9 14 20 20 9 9 29 20 5 20 29 29 20 20 9 29 10 20 30 1 2 26 0 29 26 10 20 29 31 30 20 16 16 31 _assign 2 0 _assign 2 2 _color 4 4 _pointtransform 5 8 _assign 2 13 _illuminate 5 15 _add 3 20 _dot 3 23 _subtract 3 26 _if 5 29 _lt 3 34 _assign 2 37 _dot 3 39 _subtract 3 42 _dot 3 45 _subtract 3 48 _multiply 3 51 _if 5 54 _gt 3 59 sqrt 2 62 _divide 3 64 _multiply 3 67 _subtract 3 70 abs 2 73 sqrt 2 75 _add 3 77 log 2 80 _scale 3 82 _negate 2 85 _multiply 3 87 exp 2 90 _scale 3 92 _add 3 95 geomview-1.9.4/data/shaders/hlight.slx0000644000175000001440000000325210624242144014636 00000000000000lightsource AQSIS_V 1.2.0 segment Data USES 96 param uniform float k1 param uniform float intensity param uniform color lightcolor param uniform point from varying float inpro varying float hdis varying float d varying float PP varying float QQ varying float PQ varying float PdotP varying point sP segment Init pushif 0.5 pop k1 pushif 1 pop intensity pushif 0.1 pushif 1 pushif 1 settc pop lightcolor pushif 0 pushif 0 pushif 0 settp pushis "current" pushis "camera" transform2 pop from segment Code pushif 0 setfc pop Cl :0 S_CLEAR pushv from illuminate S_JZ 1 RS_PUSH RS_GET pushv L pushv from addpp pop sP pushv sP pushv sP dotpp pop PdotP S_CLEAR pushif 1 pushv PdotP geff S_GET RS_PUSH RS_GET RS_JZ 2 pushv PdotP sqrt pushif 1 divff pop d pushv sP xcomp pushv d mulff pushv sP setxcomp pushv sP ycomp pushv d mulff pushv sP setycomp pushv sP zcomp pushv d mulff pushv sP setzcomp pushv sP pushv sP dotpp pop PdotP :2 RS_POP pushv PdotP pushif 1 subff pop PP S_CLEAR pushif 0 pushv PP lsff S_GET RS_PUSH RS_GET RS_JZ 3 pushif 0 pop PP :3 RS_POP pushv from pushv from dotpp pushif 1 subff pop QQ pushv from pushv sP dotpp pushif 1 subff pop PQ pushv QQ pushv PP mulff pop d S_CLEAR pushif 0 pushv d gtff S_GET RS_PUSH RS_GET RS_JZ 5 pushv d sqrt pushv PQ divff pop inpro pushif 1 pushv inpro pushv inpro mulff subff abs sqrt pushv inpro addff log pop hdis pushv hdis pushv k1 negf mulff exp setfc pushv lightcolor pushv intensity mulfc mulcc pushv Cl addcc pop Cl :5 RS_JNZ 4 RS_INVERSE pushif 0 setfc pop Cl :4 RS_POP RS_POP jmp 0 :1 geomview-1.9.4/data/shaders/hplastic.sl0000644000175000001440000001016510462665407015012 00000000000000/* * Copyright (c) 1990, Geometry Supercomputer Project * University of Minnesota * 1200 Washington Ave. S * Minneapolis, MN 55415 * * email address: software@geomview.org * * This software is copyrighted as noted above. It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is". Bug reports or fixes may be sent * to the authors, who may or may not act on them as they desire. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. */ /* * hplastic.sl: a plastic shader for hyperbolic space * Author: Charlie Gunn * Description: * The parameters to this shader are the same as the parameters to the regular plastic * shader, but this shader computes angles and distances using the hyperbolic metric. * This metric is defined on homogeneous coordinates (x,y,z,w) and is induced by the * quadratic form x*x + y*y +z*z - w*w. * This metric is valid on the interior of the unit ball; the isometries of this metric * are projective transformations that preserve the unit sphere and map the interior to * itself. These are represented by 4x4 matrices hence can be implemented using the * regular geometry/viewing pipeline provided by Renderman (and other rendering systems). * Features: * It would be much easier to implement if there were more general datatypes in the * shading language. I mean if I could use 4-tuples as points instead of just 3-tuples * the code would be much more compact. As it is, I have to drag around a "w" coordinate * for each point through all the computations. Ugly. */ surface hplastic( float Ka = 1, Kd = 1, Ks = 1, roughness = .1; color specularcolor = color (1,1,1); ) { point Nh, Ih, M,Lh; float Ihw,Nhw, Mw, Lhw; float a,b,d,ss, nn, mag2,PdotP; point sP; color total; uniform float spec; sP = P; PdotP = sP.sP; /* turn it off if outside unit ball */ if (PdotP >= 1.0) { Ci = 0; Oi = 1.0; } else{ spec = 1.0/roughness; Nh = faceforward(normalize(N),I); /* make N be "tangent" to P i.e. = 0*/ Nhw = sP.Nh; nn = sqrt((Nh.Nh) - (Nhw*Nhw)); /* as a difference vector, I has w cord = 0 */ /* also, we want the L which points at the eye, not the surface */ Ih = -I; b = -((Ih.sP) - 0)/((PdotP) - 1); Ih = Ih + b*sP; /* hyperbolic eye vector is lin comb of I,P */ Ihw = 0 + b; /* normalize this light vector */ mag2 = sqrt(abs((Ih.Ih) - (Ihw*Ihw))); if (mag2 != 0.0) mag2 = 1.0/mag2; else mag2 = 1.0; Ih = mag2*Ih; Ihw = mag2*Ihw; total = 0; illuminance(sP) { /* compute specular */ /* first adjust light vector to be tangent at P */ /* L is also a difference vector, hence its w-cord = 0 */ b = -((L.sP) - 0)/((PdotP) - 1); Lh = L + b*sP; Lhw = 0 + b; /* normalize Lh */ mag2 = sqrt(abs((Lh.Lh) - (Lhw*Lhw))); if (mag2 != 0.0) mag2 = 1.0/mag2; else mag2 = 1.0; Lh = mag2*Lh; Lhw = mag2*Lhw; d = ((Lh.Nh) - (Lhw*Nhw))/nn; if (d > 1.0) /* printf("big d: %f\n",d); */ d = 1.0; /* now compute bisector of angle between L and I */ /* important for Lh, Ih to be unit length */ M = Ih - Lh; Mw = Ihw - Lhw; a = -((Ih.M) - (Ihw*Mw))/((Lh.M) - (Lhw*Mw)); M = Ih + a*Lh; Mw = Ihw + a*Lhw; /* detect very small vectors, reject them */ if (abs(M.M - Mw*Mw) < .0001) { M = Lh; Mw = Lhw; } if (Mw < 0.0) { M = -M; Mw = -Mw; } /* compute cos(angle between normal and mid-vector H) */ ss = ((M.Nh) - (Mw*Nhw))/(sqrt(abs((M.M - Mw*Mw))) * nn); if (ss < 0.0) ss = -ss; if (ss > 1.0) ss = 1.0; total = total + Os * Cs * Cl * (Ka*ambient() + Kd*d); total = total + Os * specularcolor * Cl * Ks*pow(ss,spec); } Ci = total; } Oi = Os; } geomview-1.9.4/data/shaders/GVreplaceplastic.sdl0000644000175000001440000000415510624244367016577 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 6.5.0 linux64 (Feb 9 2007) "Ennio" %code 6 40 0 53 13 Ci Oi s t du dv Cs Os N I Ng P L 7 "Ka" "" 2 1 0 0 "Kd" "" 2 1 0 0 "Ks" "" 2 1 0 0 "roughness" "" 2 1 0 0 "specularcolor" "rgb" 2 3 0 0 "texturename" "" 2 4 0 0 "At" "" 2 1 0 0 6 0 10 1 0 1 1 0 1 1 0 10 1 0 10 1 0 3 1 0 15 0 10 1 0 10 1 0 1 1 0 1 1 0 3 1 0 3 1 0 9 1 0 8 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 12 5 0 5 1 1 1.00000000e+00 1 5.00000000e-01 1 1.00000001e-01 4 "" 4 "channels" 1 3.00000000e+00 5 0 1 0.00000000e+00 1 2.00000000e+00 1 4.00000000e+00 0 3 1 13 43 3 1 14 44 3 1 15 44 3 1 16 45 3 6 17 43 3 9 18 46 3 1 19 43 0 0 0 0 0 0 0 0 0 0 366 73 20 18 46 364 20 28 358 360 20 1 21 29 362 359 328 22 18 21 47 49 42 49 358 360 20 1 29 21 362 359 70 20 22 43 364 20 253 358 64 26 29 48 359 345 23 26 364 23 106 10 34 2 339 41 34 35 36 10 37 3 339 41 37 38 39 307 10 40 26 18 50 34 37 35 38 36 39 41 41 41 41 41 41 50 41 41 41 41 41 358 360 26 6 30 40 70 27 29 51 362 359 17 27 26 27 345 24 27 364 24 44 10 40 2 339 41 40 39 38 10 37 3 339 41 37 36 35 307 10 34 27 18 43 40 37 39 36 38 35 41 41 41 41 41 41 50 41 41 41 41 41 14 28 34 27 346 26 26 345 23 26 364 23 103 10 34 2 339 41 34 35 36 10 37 3 339 41 37 38 39 309 10 30 26 18 50 34 37 35 38 36 39 41 41 41 41 41 41 50 41 41 41 41 41 358 360 26 70 27 29 52 362 359 17 27 26 27 345 24 27 364 24 44 10 39 2 339 41 39 38 37 10 36 3 339 41 36 35 34 307 10 40 27 18 48 39 36 38 35 37 34 41 41 41 41 41 41 50 41 41 41 41 41 14 28 40 27 37 22 43 19 358 42 40 19 28 32 28 22 40 45 0 30 28 6 1 28 359 357 75 11 0 6 11 1 7 206 33 41 8 213 32 41 33 9 206 33 41 9 358 63 33 33 359 267 30 41 358 43 30 13 30 359 269 31 41 32 358 43 31 14 31 36 30 30 31 46 30 0 30 359 45 25 17 15 271 31 41 32 33 16 358 46 31 25 31 36 0 30 31 46 0 0 7 359 %comment-3dl 6 40 0 %comment-user 6 40 0 geomview-1.9.4/data/shaders/GVreplaceplastic.sdr0000644000175000001440000000656510624242144016603 00000000000000#!version 2.1.1 surface #!parameters: uniform float Ka = 1 uniform float Kd = .5 uniform float Ks = .5 uniform float roughness = .1 uniform color specularcolor = 1 uniform string texturename = "" uniform float At = 1 #!variables: varying vector Nf varying vector V varying vector Ct varying float Ot varying float channels varying boolean temporary_0 varying boolean temporary_1 uniform boolean temporary_2 varying boolean temporary_3 varying float temporary_4 varying float temporary_5 uniform float temporary_6 varying float temporary_7 varying vector temporary_8 varying vector Nf_1 varying vector V_1 varying vector temporary_9 varying vector temporary_10 varying vector temporary_11 uniform vector temporary_12 varying vector temporary_13 varying vector temporary_14 uniform vector temporary_15 #!Init: return #!Code: sneql temporary_2 texturename "" vuboolean temporary_1 temporary_2 textureinfo ("f=SSF") temporary_4 texturename "channels" channels vufloat temporary_5 1.0 feql temporary_3 temporary_4 temporary_5 and temporary_0 temporary_1 temporary_3 if temporary_0 #!Label10 vufloat temporary_4 3 flt temporary_1 channels temporary_4 if temporary_1 #!Label12 texture ("f=SFffSf") temporary_4 texturename 0 s t "width" 0.0 vfromf Ct temporary_4 vufloat temporary_4 2 feql temporary_3 channels temporary_4 if temporary_3 #!Label13 texture ("f=SFffSf") Ot texturename 1 s t "width" 0.0 #!Label13: endif #!Label12: else #!Label11 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 vufloat temporary_4 4 feql temporary_3 channels temporary_4 if temporary_3 #!Label15 texture ("f=SFffSf") Ot texturename 3 s t "width" 0.0 #!Label15: endif #!Label11: endif subff temporary_6 1.0 At vufloat temporary_4 temporary_6 vufloat temporary_7 At mulff temporary_5 temporary_7 Ot addff Ot temporary_4 temporary_5 vfromf temporary_8 Ot mulvv Ci Ct temporary_8 vfromf Oi Ot #!Label10: else #!Label9 movevv Ci Cs movevv Oi Os normalize ("v=v") temporary_8 N faceforward ("v=vv") Nf_1 temporary_8 I normalize ("v=v") temporary_8 I negv V_1 temporary_8 vfromf temporary_12 Ka vuvector temporary_11 temporary_12 ambient ("c=") temporary_13 mulvv temporary_10 temporary_11 temporary_13 vfromf temporary_12 Kd vuvector temporary_13 temporary_12 diffuse ("c=n") temporary_14 Nf_1 mulvv temporary_11 temporary_13 temporary_14 addvv temporary_9 temporary_10 temporary_11 mulvv temporary_8 Ci temporary_9 vfromf temporary_15 Ks mulvv temporary_12 specularcolor temporary_15 vuvector temporary_10 temporary_12 vufloat temporary_4 roughness specular ("c=nvf") temporary_11 Nf_1 V_1 temporary_4 mulvv temporary_9 temporary_10 temporary_11 addvv Ci temporary_8 temporary_9 mulvv Ci Ci Os #!Label9: endif return geomview-1.9.4/data/shaders/GVreplaceplastic.slx0000644000175000001440000000352510624242144016612 00000000000000surface AQSIS_V 1.2.0 segment Data USES 522267 param uniform float Ka param uniform float Kd param uniform float Ks param uniform float roughness param uniform color specularcolor param uniform string texturename param uniform float At varying color Ct varying float Ot varying float channels varying normal b5::Nf varying vector b5::V segment Init pushif 1 pop Ka pushif 0.5 pop Kd pushif 0.5 pop Ks pushif 0.1 pop roughness pushif 1 setfc pop specularcolor pushis "" pop texturename pushif 1 pop At segment Code S_CLEAR pushis "" pushv texturename ness pushif 1 pushis "channels" pushv texturename textureinfo channels eqff land S_GET RS_PUSH RS_GET RS_JZ 1 S_CLEAR pushif 3 pushv channels lsff S_GET RS_PUSH RS_GET RS_JZ 3 pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ftexture1 setfc pop Ct S_CLEAR pushif 2 pushv channels eqff S_GET RS_PUSH RS_GET RS_JZ 4 pushif 0 pushis "width" pushif 1 pushv texturename pushif 2 ftexture1 pop Ot :4 RS_POP :3 RS_JNZ 2 RS_INVERSE pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ctexture1 pop Ct S_CLEAR pushif 4 pushv channels eqff S_GET RS_PUSH RS_GET RS_JZ 5 pushif 0 pushis "width" pushif 3 pushv texturename pushif 2 ftexture1 pop Ot :5 RS_POP :2 RS_POP pushv Ot pushv At mulff pushv At pushif 1 subff addff pop Ot pushv Ot setfc pushv Ct mulcc pop Ci pushv Ot setfc pop Oi :1 RS_JNZ 0 RS_INVERSE pushv Cs pop Ci pushv Os pop Oi pushv I pushv N normalize faceforward pop b5::Nf pushv I normalize negp pop b5::V pushv roughness pushv b5::V pushv b5::Nf specular pushv Ks setfc pushv specularcolor mulcc mulcc pushv b5::Nf diffuse pushv Kd mulfc ambient pushv Ka mulfc addcc pushv Ci mulcc addcc pop Ci pushv Os pushv Ci mulcc pop Ci :0 RS_POP geomview-1.9.4/data/shaders/hmatte.sl0000644000175000001440000000155210462665406014464 00000000000000surface hmatte( float Ka = 0.05, Kd = 1; ) { float Lhw,Nhw; /* w-cord of hyperbolic normal vector to P */ point Nh, Lh; /* first 3 cords of hyperbolic normal vector to P */ point Px; float b,d,nn; Nh = faceforward(normalize(N),I); Px = transform("shader",P); /* compute plane equation */ Ci = 0; illuminance(Px) { Nhw = Px.Nh; b = -(L.Px - 0)/(Px.Px - 1); Lh = L + b*Px; /* hyperbolic light vector is lin comb of L,P */ Lhw = 0 + b; d = (Lh.Nh - Lhw*Nhw)/sqrt(abs((Lh.Lh - Lhw*Lhw)*(Nh.Nh - Nhw*Nhw))); if (d < 0.0) d = -d; if (d > 1.0) { /* printf("Light:%f %f %f %f\n",xcomp(Lh),ycomp(Lh),zcomp(Lh),Lhw); printf("Normal:%f %f %f %f\n",xcomp(Nh),ycomp(Nh),zcomp(Nh),Nhw); printf("Posi:%f %f %f 1.0\n",xcomp(Px),ycomp(Px),zcomp(Px)); */ d = 1.0; } Ci += Os * Cs * (Ka*ambient() + Cl*Kd*d ); } Oi = Os; } geomview-1.9.4/data/shaders/README0000644000175000001440000000016410462665406013520 00000000000000The shaders in this directory are optionally used by the rib files generated by geomview when in hyperbolic space. geomview-1.9.4/data/shaders/GVblendplastic.sdl0000644000175000001440000000407310624244367016247 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 6.5.0 linux64 (Feb 9 2007) "Ennio" %code 6 40 0 51 13 Ci Oi Cs Os N I Ng P L s t du dv 8 "Ka" "" 2 1 0 0 "Kd" "" 2 1 0 0 "Ks" "" 2 1 0 0 "roughness" "" 2 1 0 0 "specularcolor" "rgb" 2 3 0 0 "texturename" "" 2 4 0 0 "bgcolor" "rgb" 2 3 0 0 "At" "" 2 1 0 0 5 0 3 1 0 10 1 0 1 1 0 1 1 0 10 1 0 15 0 10 1 0 1 1 0 1 1 0 3 1 0 3 1 0 3 1 0 9 1 0 8 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 10 5 0 5 1 1 1.00000000e+00 1 5.00000000e-01 1 1.00000001e-01 4 "" 5 0 1 0.00000000e+00 4 "channels" 1 3.00000000e+00 0 3 1 13 43 3 1 14 44 3 1 15 44 3 1 16 45 3 6 17 43 3 9 18 46 3 6 19 48 3 1 20 43 0 0 0 0 0 0 0 0 0 0 0 352 11 0 2 11 1 3 206 33 41 4 213 32 41 33 5 206 33 41 5 358 63 33 33 359 267 30 41 358 43 30 13 30 359 269 31 41 32 358 43 31 14 31 36 30 30 31 46 30 0 30 359 45 21 17 15 271 31 41 32 33 16 358 46 31 21 31 36 0 30 31 359 73 22 18 46 364 22 28 358 360 22 1 23 28 362 359 328 24 18 23 49 47 42 47 358 360 22 1 28 23 362 359 70 22 24 43 364 22 237 358 64 26 28 50 359 345 25 26 364 25 92 10 34 9 339 41 34 35 36 10 37 10 339 41 37 38 39 307 10 40 26 18 48 34 37 35 38 36 39 41 41 41 41 41 41 48 41 41 41 41 41 358 360 26 6 29 40 362 359 10 40 9 339 41 40 39 38 10 37 10 339 41 37 36 35 307 10 34 26 18 43 40 37 39 36 38 35 41 41 41 41 41 41 48 41 41 41 43 41 14 27 34 26 346 26 26 345 25 26 364 25 88 10 34 9 339 41 34 35 36 10 37 10 339 41 37 38 39 309 10 31 26 18 48 34 37 35 38 36 39 41 41 41 41 41 41 48 41 41 41 41 41 15 29 31 26 10 39 9 339 41 39 38 37 10 36 10 339 41 36 35 34 307 10 40 26 18 50 39 36 38 35 37 34 41 41 41 41 41 41 48 41 41 41 43 41 14 27 40 26 358 39 31 43 29 46 31 31 0 46 30 29 19 36 0 31 30 359 37 24 43 20 358 42 40 20 27 32 27 24 40 45 1 1 27 359 358 46 0 0 1 359 %comment-3dl 6 40 0 %comment-user 6 40 0 geomview-1.9.4/data/shaders/GVblendplastic.sdr0000644000175000001440000000644110624242144016245 00000000000000#!version 2.1.1 surface #!parameters: uniform float Ka = 1 uniform float Kd = .5 uniform float Ks = .5 uniform float roughness = .1 uniform color specularcolor = 1 uniform string texturename = "" uniform color bgcolor = 0 uniform float At = 1 #!variables: varying vector Nf varying vector V varying vector Ct varying float Ot varying float channels varying vector temporary_0 varying vector temporary_1 varying vector temporary_2 varying vector temporary_3 uniform vector temporary_4 varying vector temporary_5 varying vector temporary_6 uniform vector temporary_7 varying float temporary_8 varying boolean temporary_9 varying boolean temporary_10 uniform boolean temporary_11 varying boolean temporary_12 varying float temporary_13 uniform float temporary_14 varying float temporary_15 #!Init: return #!Code: movevv Ci Cs movevv Oi Os normalize ("v=v") temporary_0 N faceforward ("v=vv") Nf temporary_0 I normalize ("v=v") temporary_0 I negv V temporary_0 vfromf temporary_4 Ka vuvector temporary_3 temporary_4 ambient ("c=") temporary_5 mulvv temporary_2 temporary_3 temporary_5 vfromf temporary_4 Kd vuvector temporary_5 temporary_4 diffuse ("c=n") temporary_6 Nf mulvv temporary_3 temporary_5 temporary_6 addvv temporary_1 temporary_2 temporary_3 mulvv temporary_0 Ci temporary_1 vfromf temporary_7 Ks mulvv temporary_4 specularcolor temporary_7 vuvector temporary_2 temporary_4 vufloat temporary_8 roughness specular ("c=nvf") temporary_3 Nf V temporary_8 mulvv temporary_1 temporary_2 temporary_3 addvv Ci temporary_0 temporary_1 sneql temporary_11 texturename "" vuboolean temporary_10 temporary_11 textureinfo ("f=SSF") temporary_8 texturename "channels" channels vufloat temporary_13 1.0 feql temporary_12 temporary_8 temporary_13 and temporary_9 temporary_10 temporary_12 if temporary_9 #!Label5 vufloat temporary_8 3 flt temporary_10 channels temporary_8 if temporary_10 #!Label8 texture ("f=SFffSf") temporary_8 texturename 0 s t "width" 0.0 vfromf Ct temporary_8 texture ("f=SFffSfSf") Ot texturename 1 s t "fill" 1.0 "width" 0.0 #!Label8: else #!Label7 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 texture ("f=SFffSfSf") Ot texturename 3 s t "fill" 1.0 "width" 0.0 #!Label7: endif vfromf temporary_4 1.0 vuvector temporary_2 temporary_4 subvv temporary_1 temporary_2 Ct mulvv temporary_0 temporary_1 Ci vuvector temporary_2 bgcolor mulvv temporary_1 Ct temporary_2 addvv Ci temporary_0 temporary_1 subff temporary_14 1.0 At vufloat temporary_8 temporary_14 vufloat temporary_15 At mulff temporary_13 temporary_15 Ot addff Ot temporary_8 temporary_13 vfromf temporary_0 Ot mulvv Oi Oi temporary_0 #!Label5: endif mulvv Ci Ci Oi return geomview-1.9.4/data/shaders/GVblendplastic.slx0000644000175000001440000000344510624242144016264 00000000000000surface AQSIS_V 1.2.0 segment Data USES 522267 param uniform float Ka param uniform float Kd param uniform float Ks param uniform float roughness param uniform color specularcolor param uniform string texturename param uniform color bgcolor param uniform float At varying normal Nf varying vector V varying color Ct varying float Ot varying float channels segment Init pushif 1 pop Ka pushif 0.5 pop Kd pushif 0.5 pop Ks pushif 0.1 pop roughness pushif 1 setfc pop specularcolor pushis "" pop texturename pushif 0 setfc pop bgcolor pushif 1 pop At segment Code pushv Cs pop Ci pushv Os pop Oi pushv I pushv N normalize faceforward pop Nf pushv I normalize negp pop V pushv roughness pushv V pushv Nf specular pushv Ks setfc pushv specularcolor mulcc mulcc pushv Nf diffuse pushv Kd mulfc ambient pushv Ka mulfc addcc pushv Ci mulcc addcc pop Ci S_CLEAR pushis "" pushv texturename ness pushif 1 pushis "channels" pushv texturename textureinfo channels eqff land S_GET RS_PUSH RS_GET RS_JZ 0 S_CLEAR pushif 3 pushv channels lsff S_GET RS_PUSH RS_GET RS_JZ 2 pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ftexture1 setfc pop Ct pushif 0 pushis "width" pushif 1 pushis "fill" pushif 1 pushv texturename pushif 4 ftexture1 pop Ot :2 RS_JNZ 1 RS_INVERSE pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ctexture1 pop Ct pushif 0 pushis "width" pushif 1 pushis "fill" pushif 3 pushv texturename pushif 4 ftexture1 pop Ot :1 RS_POP pushv bgcolor pushv Ct mulcc pushv Ci pushv Ct pushif 1 subfc mulcc addcc pop Ci pushv Ot pushv At mulff pushv At pushif 1 subff addff pop Ot pushv Ot setfc pushv Oi mulcc pop Oi :0 RS_POP pushv Oi pushv Ci mulcc pop Ci geomview-1.9.4/data/shaders/GVdecalconstant.sl0000644000175000001440000000310310600044551016235 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = decal" for constant shading. This * means the alpha channel of the texture interpolates between the * texture and Cs, but Os remains unchanged. Note that the "fill == 1" * parameter automatically results in the "correct" (i.e. OpenGL) * behaviour when the texture does not carry an alpha-channel. */ surface GVdecalconstant(string texturename = "";) { /* texture provided color (luminance) and alpha */ color Ct; float Ot; Ci = Cs; Oi = Os; if (texturename != "") { Ct = color texture (texturename, "width", 0.0); Ot = float texture (texturename[3], "fill", 1.0, "width", 0.0); Ci = (1 - Ot) * Ci + Ot * Ct; } Ci *= Os; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/data/shaders/GVblendconstant.sdl0000644000175000001440000000316010624244367016435 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 6.5.0 linux64 (Feb 9 2007) "Ennio" %code 6 40 0 35 8 Ci Oi Cs Os s t du dv 3 "texturename" "" 2 4 0 0 "bgcolor" "rgb" 2 3 0 0 "At" "" 2 1 0 0 4 0 10 1 0 1 1 0 1 1 0 10 1 0 12 0 10 1 0 1 1 0 1 1 0 3 1 0 3 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 8 5 0 4 "" 5 0 1 0.00000000e+00 5 1 1 1.00000000e+00 4 "channels" 1 3.00000000e+00 0 3 9 8 28 3 6 9 30 3 1 10 32 0 0 0 0 0 0 287 11 0 2 11 1 3 73 11 8 28 364 11 28 358 360 11 1 12 17 362 359 328 13 8 12 33 29 31 29 358 360 11 1 17 12 362 359 70 11 13 32 364 11 237 358 64 15 17 34 359 345 14 15 364 14 92 10 20 4 339 27 20 21 22 10 23 5 339 27 23 24 25 307 10 26 15 8 30 20 23 21 24 22 25 27 27 27 27 27 27 30 27 27 27 27 27 358 360 15 6 18 26 362 359 10 26 4 339 27 26 25 24 10 23 5 339 27 23 22 21 307 10 20 15 8 32 26 23 25 22 24 21 27 27 27 27 27 27 30 27 27 27 32 27 14 16 20 15 346 15 15 345 14 15 364 14 88 10 20 4 339 27 20 21 22 10 23 5 339 27 23 24 25 309 10 19 15 8 30 20 23 21 24 22 25 27 27 27 27 27 27 30 27 27 27 27 27 15 18 19 15 10 25 4 339 27 25 24 23 10 22 5 339 27 22 21 20 307 10 26 15 8 34 25 22 24 21 23 20 27 27 27 27 27 27 30 27 27 27 32 27 14 16 26 15 358 39 19 32 18 46 19 19 0 46 18 18 9 36 0 19 18 359 37 13 32 10 358 42 26 10 16 32 16 13 26 45 1 1 16 359 358 46 0 0 1 359 %comment-3dl 6 40 0 %comment-user 6 40 0 geomview-1.9.4/data/shaders/GVblendconstant.sdr0000644000175000001440000000415110624242144016433 00000000000000#!version 2.1.1 surface #!parameters: uniform string texturename = "" uniform color bgcolor = 0 uniform float At = 1 #!variables: varying vector Ct varying float Ot varying float channels varying boolean temporary_0 varying boolean temporary_1 uniform boolean temporary_2 varying boolean temporary_3 varying float temporary_4 varying float temporary_5 varying vector temporary_6 varying vector temporary_7 varying vector temporary_8 uniform vector temporary_9 uniform float temporary_10 varying float temporary_11 #!Init: return #!Code: movevv Ci Cs movevv Oi Os sneql temporary_2 texturename "" vuboolean temporary_1 temporary_2 textureinfo ("f=SSF") temporary_4 texturename "channels" channels vufloat temporary_5 1.0 feql temporary_3 temporary_4 temporary_5 and temporary_0 temporary_1 temporary_3 if temporary_0 #!Label5 vufloat temporary_4 3 flt temporary_1 channels temporary_4 if temporary_1 #!Label8 texture ("f=SFffSf") temporary_4 texturename 0 s t "width" 0.0 vfromf Ct temporary_4 texture ("f=SFffSfSf") Ot texturename 1 s t "fill" 1.0 "width" 0.0 #!Label8: else #!Label7 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 texture ("f=SFffSfSf") Ot texturename 3 s t "fill" 1.0 "width" 0.0 #!Label7: endif vfromf temporary_9 1.0 vuvector temporary_8 temporary_9 subvv temporary_7 temporary_8 Ct mulvv temporary_6 temporary_7 Ci vuvector temporary_8 bgcolor mulvv temporary_7 Ct temporary_8 addvv Ci temporary_6 temporary_7 subff temporary_10 1.0 At vufloat temporary_4 temporary_10 vufloat temporary_11 At mulff temporary_5 temporary_11 Ot addff Ot temporary_4 temporary_5 vfromf temporary_6 Ot mulvv Oi Oi temporary_6 #!Label5: endif mulvv Ci Ci Oi return geomview-1.9.4/data/shaders/GVblendconstant.slx0000644000175000001440000000234310624242144016452 00000000000000surface AQSIS_V 1.2.0 segment Data USES 454683 param uniform string texturename param uniform color bgcolor param uniform float At varying color Ct varying float Ot varying float channels segment Init pushis "" pop texturename pushif 0 setfc pop bgcolor pushif 1 pop At segment Code pushv Cs pop Ci pushv Os pop Oi S_CLEAR pushis "" pushv texturename ness pushif 1 pushis "channels" pushv texturename textureinfo channels eqff land S_GET RS_PUSH RS_GET RS_JZ 0 S_CLEAR pushif 3 pushv channels lsff S_GET RS_PUSH RS_GET RS_JZ 2 pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ftexture1 setfc pop Ct pushif 0 pushis "width" pushif 1 pushis "fill" pushif 1 pushv texturename pushif 4 ftexture1 pop Ot :2 RS_JNZ 1 RS_INVERSE pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ctexture1 pop Ct pushif 0 pushis "width" pushif 1 pushis "fill" pushif 3 pushv texturename pushif 4 ftexture1 pop Ot :1 RS_POP pushv bgcolor pushv Ct mulcc pushv Ci pushv Ct pushif 1 subfc mulcc addcc pop Ci pushv Ot pushv At mulff pushv At pushif 1 subff addff pop Ot pushv Ot setfc pushv Oi mulcc pop Oi :0 RS_POP pushv Oi pushv Ci mulcc pop Ci geomview-1.9.4/data/shaders/Makefile.am0000644000175000001440000000163710622374303014671 00000000000000geomshaderdatadir=${geomdatadir}/shaders # # Old pre-compiled shaders, probably BMRT(?) # dist_geomshaderdata_DATA = hlight.slo hmatte.slo hplastic.slo shader_src = \ hlight.sl hmatte.sl hplastic.sl \ GVblendconstant.sl GVblendplastic.sl \ GVdecalconstant.sl GVdecalplastic.sl \ GVmodulateconstant.sl GVmodulateplastic.sl \ GVreplaceconstant.sl GVreplaceplastic.sl EXTRA_DIST = $(shader_src) # hlight.slo hmatte.slo hplastic.slo if AQSIS_SHADER_COMPILER dist_geomshaderdata_DATA += $(shader_src:.sl=.slx) .sl.slx: $(AQSIS_SHADER_COMPILER) -o $@ $< endif if PIXIE_SHADER_COMPILER dist_geomshaderdata_DATA += $(shader_src:.sl=.sdr) .sl.sdr: $(PIXIE_SHADER_COMPILER) -o $@ $< endif if DELIGHT_SHADER_COMPILER dist_geomshaderdata_DATA += $(shader_src:.sl=.sdl) # # SDLFLAGS = -O3 --embed-source --dso etc. # .sl.sdl: $(DELIGHT_SHADER_COMPILER) $(SDLFLAGS) -o $@ $< endif clean-local: -rm -f *.slx *.sdr *.sdl geomview-1.9.4/data/shaders/Makefile.in0000644000175000001440000003303010665240474014702 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @AQSIS_SHADER_COMPILER_TRUE@am__append_1 = $(shader_src:.sl=.slx) @PIXIE_SHADER_COMPILER_TRUE@am__append_2 = $(shader_src:.sl=.sdr) @DELIGHT_SHADER_COMPILER_TRUE@am__append_3 = $(shader_src:.sl=.sdl) subdir = data/shaders DIST_COMMON = README $(am__dist_geomshaderdata_DATA_DIST) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = am__dist_geomshaderdata_DATA_DIST = hlight.slo hmatte.slo hplastic.slo \ hlight.slx hmatte.slx hplastic.slx GVblendconstant.slx \ GVblendplastic.slx GVdecalconstant.slx GVdecalplastic.slx \ GVmodulateconstant.slx GVmodulateplastic.slx \ GVreplaceconstant.slx GVreplaceplastic.slx hlight.sdr \ hmatte.sdr hplastic.sdr GVblendconstant.sdr GVblendplastic.sdr \ GVdecalconstant.sdr GVdecalplastic.sdr GVmodulateconstant.sdr \ GVmodulateplastic.sdr GVreplaceconstant.sdr \ GVreplaceplastic.sdr hlight.sdl hmatte.sdl hplastic.sdl \ GVblendconstant.sdl GVblendplastic.sdl GVdecalconstant.sdl \ GVdecalplastic.sdl GVmodulateconstant.sdl \ GVmodulateplastic.sdl GVreplaceconstant.sdl \ GVreplaceplastic.sdl am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(geomshaderdatadir)" dist_geomshaderdataDATA_INSTALL = $(INSTALL_DATA) DATA = $(dist_geomshaderdata_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ geomshaderdatadir = ${geomdatadir}/shaders # # Old pre-compiled shaders, probably BMRT(?) # dist_geomshaderdata_DATA = hlight.slo hmatte.slo hplastic.slo \ $(am__append_1) $(am__append_2) $(am__append_3) shader_src = \ hlight.sl hmatte.sl hplastic.sl \ GVblendconstant.sl GVblendplastic.sl \ GVdecalconstant.sl GVdecalplastic.sl \ GVmodulateconstant.sl GVmodulateplastic.sl \ GVreplaceconstant.sl GVreplaceplastic.sl EXTRA_DIST = $(shader_src) # hlight.slo hmatte.slo hplastic.slo all: all-am .SUFFIXES: .SUFFIXES: .sdl .sdr .sl .slx $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/shaders/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu data/shaders/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_geomshaderdataDATA: $(dist_geomshaderdata_DATA) @$(NORMAL_INSTALL) test -z "$(geomshaderdatadir)" || $(MKDIR_P) "$(DESTDIR)$(geomshaderdatadir)" @list='$(dist_geomshaderdata_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(dist_geomshaderdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(geomshaderdatadir)/$$f'"; \ $(dist_geomshaderdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(geomshaderdatadir)/$$f"; \ done uninstall-dist_geomshaderdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_geomshaderdata_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(geomshaderdatadir)/$$f'"; \ rm -f "$(DESTDIR)$(geomshaderdatadir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(geomshaderdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dist_geomshaderdataDATA install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_geomshaderdataDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ clean-local distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am \ install-dist_geomshaderdataDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-dist_geomshaderdataDATA @AQSIS_SHADER_COMPILER_TRUE@.sl.slx: @AQSIS_SHADER_COMPILER_TRUE@ $(AQSIS_SHADER_COMPILER) -o $@ $< @PIXIE_SHADER_COMPILER_TRUE@.sl.sdr: @PIXIE_SHADER_COMPILER_TRUE@ $(PIXIE_SHADER_COMPILER) -o $@ $< # # SDLFLAGS = -O3 --embed-source --dso etc. # @DELIGHT_SHADER_COMPILER_TRUE@.sl.sdl: @DELIGHT_SHADER_COMPILER_TRUE@ $(DELIGHT_SHADER_COMPILER) $(SDLFLAGS) -o $@ $< clean-local: -rm -f *.slx *.sdr *.sdl # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/data/shaders/GVreplaceconstant.sdl0000644000175000001440000000325610624244367016772 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 6.5.0 linux64 (Feb 9 2007) "Ennio" %code 6 40 0 37 8 Ci Oi s t du dv Cs Os 2 "texturename" "" 2 4 0 0 "At" "" 2 1 0 0 5 0 10 1 0 1 1 0 1 1 0 10 1 0 10 1 0 12 0 10 1 0 10 1 0 1 1 0 1 1 0 3 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 10 5 0 4 "" 5 1 1 1.00000000e+00 4 "channels" 1 3.00000000e+00 5 0 1 0.00000000e+00 1 2.00000000e+00 1 4.00000000e+00 0 3 9 8 28 3 1 9 30 0 0 0 0 0 303 73 10 8 28 364 10 28 358 360 10 1 11 18 362 359 328 12 8 11 31 33 29 33 358 360 10 1 18 11 362 359 70 10 12 30 364 10 253 358 64 15 18 32 359 345 13 15 364 13 106 10 20 2 339 27 20 21 22 10 23 3 339 27 23 24 25 307 10 26 15 8 34 20 23 21 24 22 25 27 27 27 27 27 27 34 27 27 27 27 27 358 360 15 6 19 26 70 16 18 35 362 359 17 16 15 16 345 14 16 364 14 44 10 26 2 339 27 26 25 24 10 23 3 339 27 23 22 21 307 10 20 16 8 30 26 23 25 22 24 21 27 27 27 27 27 27 34 27 27 27 27 27 14 17 20 16 346 15 15 345 13 15 364 13 103 10 20 2 339 27 20 21 22 10 23 3 339 27 23 24 25 309 10 19 15 8 34 20 23 21 24 22 25 27 27 27 27 27 27 34 27 27 27 27 27 358 360 15 70 16 18 36 362 359 17 16 15 16 345 14 16 364 14 44 10 25 2 339 27 25 24 23 10 22 3 339 27 22 21 20 307 10 26 16 8 32 25 22 24 21 23 20 27 27 27 27 27 27 34 27 27 27 27 27 14 17 26 16 37 12 30 9 358 42 26 9 17 32 17 12 26 45 0 19 17 6 1 17 359 357 12 11 0 6 11 1 7 358 46 0 0 7 359 %comment-3dl 6 40 0 %comment-user 6 40 0 geomview-1.9.4/data/shaders/GVreplaceconstant.sdr0000644000175000001440000000405510624242144016765 00000000000000#!version 2.1.1 surface #!parameters: uniform string texturename = "" uniform float At = 1 #!variables: varying vector Ct varying float Ot varying float channels varying boolean temporary_0 varying boolean temporary_1 uniform boolean temporary_2 varying boolean temporary_3 varying float temporary_4 varying float temporary_5 uniform float temporary_6 varying float temporary_7 varying vector temporary_8 #!Init: return #!Code: sneql temporary_2 texturename "" vuboolean temporary_1 temporary_2 textureinfo ("f=SSF") temporary_4 texturename "channels" channels vufloat temporary_5 1.0 feql temporary_3 temporary_4 temporary_5 and temporary_0 temporary_1 temporary_3 if temporary_0 #!Label10 vufloat temporary_4 3 flt temporary_1 channels temporary_4 if temporary_1 #!Label12 texture ("f=SFffSf") temporary_4 texturename 0 s t "width" 0.0 vfromf Ct temporary_4 vufloat temporary_4 2 feql temporary_3 channels temporary_4 if temporary_3 #!Label13 texture ("f=SFffSf") Ot texturename 1 s t "width" 0.0 #!Label13: endif #!Label12: else #!Label11 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 vufloat temporary_4 4 feql temporary_3 channels temporary_4 if temporary_3 #!Label15 texture ("f=SFffSf") Ot texturename 3 s t "width" 0.0 #!Label15: endif #!Label11: endif subff temporary_6 1.0 At vufloat temporary_4 temporary_6 vufloat temporary_7 At mulff temporary_5 temporary_7 Ot addff Ot temporary_4 temporary_5 vfromf temporary_8 Ot mulvv Ci Ct temporary_8 vfromf Oi Ot #!Label10: else #!Label9 movevv Ci Cs movevv Oi Os mulvv Ci Ci Os #!Label9: endif return geomview-1.9.4/data/shaders/GVreplaceconstant.slx0000644000175000001440000000236710624242144017007 00000000000000surface AQSIS_V 1.2.0 segment Data USES 454683 param uniform string texturename param uniform float At varying color Ct varying float Ot varying float channels segment Init pushis "" pop texturename pushif 1 pop At segment Code S_CLEAR pushis "" pushv texturename ness pushif 1 pushis "channels" pushv texturename textureinfo channels eqff land S_GET RS_PUSH RS_GET RS_JZ 1 S_CLEAR pushif 3 pushv channels lsff S_GET RS_PUSH RS_GET RS_JZ 3 pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ftexture1 setfc pop Ct S_CLEAR pushif 2 pushv channels eqff S_GET RS_PUSH RS_GET RS_JZ 4 pushif 0 pushis "width" pushif 1 pushv texturename pushif 2 ftexture1 pop Ot :4 RS_POP :3 RS_JNZ 2 RS_INVERSE pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ctexture1 pop Ct S_CLEAR pushif 4 pushv channels eqff S_GET RS_PUSH RS_GET RS_JZ 5 pushif 0 pushis "width" pushif 3 pushv texturename pushif 2 ftexture1 pop Ot :5 RS_POP :2 RS_POP pushv Ot pushv At mulff pushv At pushif 1 subff addff pop Ot pushv Ot setfc pushv Ct mulcc pop Ci pushv Ot setfc pop Oi :1 RS_JNZ 0 RS_INVERSE pushv Cs pop Ci pushv Os pop Oi pushv Os pushv Ci mulcc pop Ci :0 RS_POP geomview-1.9.4/data/shaders/GVmodulateconstant.sl0000644000175000001440000000351210600044551017003 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = modulate" for constant shading. * * The additional parameter At interpolates 1 and Ot; the effective * alpha contribution from the texture will be (1-At) + At * Ot. */ surface GVmodulateconstant(string texturename = ""; float At = 1;) { /* texture provided color (luminance) and alpha */ color Ct; float Ot; /* number of texture channels, * < 3: liminance and possibly alpha, > 2: rgb and possibly alpha */ float channels; Ci = Cs; Oi = Os; if (texturename != "" && textureinfo(texturename, "channels", channels) == 1.0) { if (channels < 3) { Ct = float texture (texturename[0], "width", 0.0); Ot = texture (texturename[1], "fill", 1.0, "width", 0.0); } else { Ct = color texture (texturename, "width", 0.0); Ot = texture (texturename[3], "fill", 1.0, "width", 0.0); } Ot = (1.0 - At) + At * Ot; Ci *= Ct; Oi *= Ot; } Ci *= Oi; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/data/shaders/hlight.sl0000644000175000001440000000257110462665406014463 00000000000000/* hlight.sl: shader for point lights in hyperbolic space * Author: Charlie Gunn * Description: * See hplastic.sl also. * This simulates a point light in hyperbolic space. The brightness of the light * decays exponentially since the surface area of the sphere of radius r in hyperbolic * space is exp(kr) for some constant k. Distance is given by Arccosh({p1,p1}), * where {p1,p0} is the Minkowski inner product on projective space. */ light hlight( float k1 = 0.5, intensity = 1; color lightcolor = color (1, 1, .1); point from = point "camera" (0,0,0); /* light position */ ) { float inpro, hdis, d; /* hyperbolic distance (sort of) */ float PP, QQ, PQ, tmp, PdotP; point sP; Cl = 0; illuminate(from) { sP = from + L; /* need to reconstruct the position of light */ PdotP = sP.sP; if (PdotP >= 1.0) { d = 1.0/sqrt(PdotP); setxcomp(sP, d * xcomp(sP)); setycomp(sP, d * ycomp(sP)); setzcomp(sP, d * zcomp(sP)); PdotP = sP.sP; } PP = 1.0 - PdotP; if (PP < 0 ) PP = 0; QQ = 1.0 - from.from; /* if (QQ < 0 ) QQ = 0; if the light's bad, we're doomed */ PQ = 1.0 - sP.from; /* if (PQ < 0 ) PQ = 0; ditto */ d = PP * QQ; if (d > 0) { inpro = PQ / sqrt (d); hdis = log(inpro + sqrt((abs(inpro*inpro - 1)))); Cl += intensity * lightcolor * (exp(-k1*hdis)); } else Cl = 0; } } geomview-1.9.4/data/shaders/GVblendplastic.sl0000644000175000001440000000526410600044551016071 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = blend" for non-constant shading * * See also glTexEnvf(3). * * Note that we ignore the alpha value of the background color. This * is just what OpenGL does, as Geomview never uses GL_INTENSITY as * texture format. * * Note also that the background color is unaffected by lighting. This * means: we apply first the normal plastic shader, and then * interpolate between the shaded colour and the background color. * * If the texture has an alpha channel, then Oi = Os * Ot. * * The additional parameter At interpolates 1 and Ot; the effective * alpha contribution from the texture will be (1-At) + At * Ot. */ surface GVblendplastic(float Ka = 1, Kd = .5, Ks = .5, roughness = .1; color specularcolor = 1; string texturename = ""; color bgcolor = 0; float At = 1;) { /* variables used for lighting */ normal Nf; vector V; /* texture provided color (luminance) and alpha */ color Ct; float Ot; /* number of texture channels, * < 3: liminance and possibly alpha, > 2: rgb and possibly alpha */ float channels; /* normal plastic shader */ Ci = Cs; Oi = Os; Nf = faceforward (normalize(N),I); V = -normalize(I); Ci = Ci * (Ka*ambient() + Kd*diffuse(Nf)) + specularcolor * Ks*specular(Nf,V,roughness); /* texture support a la GL_BLEND */ if (texturename != "" && textureinfo(texturename, "channels", channels) == 1.0) { if (channels < 3) { Ct = float texture(texturename[0], "width", 0.0); Ot = float texture(texturename[1], "fill", 1.0, "width", 0.0); } else { Ct = color texture(texturename, "width", 0.0); Ot = float texture(texturename[3], "fill", 1.0, "width", 0.0); } Ci = (1.0 - Ct) * Ci + Ct * bgcolor; Ot = (1.0 - At) + At * Ot; Oi *= Ot; } Ci *= Oi; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/data/shaders/GVdecalplastic.sl0000644000175000001440000000444210600044551016052 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = decal" for (non-)constant * shading. This means the alpha channel of the texture interpolates * between the texture and Cs, but Os remains unchanged. Note that the * "fill == 1" parameter automatically results in the "correct" * (i.e. OpenGL) behaviour when the texture does not carry an * alpha-channel. * * "apply = decal" interpolates between the _shaded_ surface color and * the _un_shaded texture color. The resulting alpha channel is * unaffected by the texture. */ surface GVdecalplastic(float Ka = 1, Kd = .5, Ks = .5, roughness = .1; color specularcolor = 1; string texturename = "";) { /* variables used for lighting */ normal Nf; vector V; /* texture provided color (luminance) and alpha */ color Ct; float Ot; Ci = Cs; Oi = Os; /* First compute the _shaded_ surface color */ Nf = faceforward (normalize(N),I); V = -normalize(I); Ci = Ci * (Ka*ambient() + Kd*diffuse(Nf)) + specularcolor * Ks*specular(Nf,V,roughness); /* Then interpolate with the texture color, if there is a * texture. If the texture does not have an alpha-channel, then this * shader has the same effect as the "GVreplaceplastic()" shader. */ if (texturename != "") { Ct = color texture (texturename, "width", 0.0); Ot = float texture (texturename[3], "fill", 1.0, "width", 0.0); Ci = (1 - Ot) * Ci + Ot * Ct; } Ci *= Os; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/data/shaders/GVreplaceplastic.sl0000644000175000001440000000457010600044551016417 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = replace" for (non-)constant * shading. The surface color simply is replaced by the texture color, * the result is constantly shaded. * * The additional parameter At interpolates between 1 and Ot; the * effective alpha contribution from the texture will be (1-At) + At * * Ot. */ surface GVreplaceplastic(float Ka = 1, Kd = .5, Ks = .5, roughness = .1; color specularcolor = 1; string texturename = ""; float At = 1;) { /* variables used for lighting */ normal Nf; vector V; /* texture provided color (luminance) and alpha */ color Ct; float Ot; /* number of texture channels, * < 3: liminance and possibly alpha, > 2: rgb and possibly alpha */ float channels; if (texturename != "" && textureinfo(texturename, "channels", channels) == 1.0) { if (channels < 3) { Ct = float texture (texturename[0], "width", 0.0); if (channels == 2) { Ot = float texture (texturename[1], "width", 0.0); } } else { Ct = color texture (texturename, "width", 0.0); if (channels == 4) { Ot = float texture (texturename[3], "width", 0.0); } } Ot = (1.0 - At) + At * Ot; Ci = Ct * Ot; Oi = Ot; } else { /* no texture: use ordinary plastic shader */ normal Nf; vector V; Ci = Cs; Oi = Os; Nf = faceforward (normalize(N),I); V = -normalize(I); Ci = Ci * (Ka*ambient() + Kd*diffuse(Nf)) + specularcolor * Ks*specular(Nf,V,roughness); Ci *= Os; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/data/shaders/GVreplaceconstant.sl0000644000175000001440000000413710600044551016610 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = blend" for constant shading * * Maybe mgrib should set bgalpha to 0 if transparency is not enabled * (0 because this will leave the alpha channel of the surface * unaffected). * * The additional parameter At interpolates between 1 and Ot; the * effective alpha contribution from the texture will be (1-At) + At * * Ot. */ surface GVreplaceconstant(string texturename = ""; float At = 1;) { /* texture provided color (luminance) and alpha */ color Ct; float Ot; /* number of texture channels, * < 3: liminance and possibly alpha, > 2: rgb and possibly alpha */ float channels; if (texturename != "" && textureinfo(texturename, "channels", channels) == 1.0) { if (channels < 3) { Ct = float texture (texturename[0], "width", 0.0); if (channels == 2) { Ot = float texture (texturename[1], "width", 0.0); } } else { Ct = color texture (texturename, "width", 0.0); if (channels == 4) { Ot = float texture (texturename[3], "width", 0.0); } } Ot = (1.0 - At) + At * Ot; Ci = Ct * Ot; Oi = Ot; } else { /* no texture: use ordinary constant shader */ Ci = Cs; Oi = Os; Ci *= Os; } } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/data/shaders/GVmodulateplastic.sl0000644000175000001440000000417610600044551016620 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = modulate" for constant shading. * * The additional parameter At interpolates 1 and Ot; the effective * alpha contribution from the texture will be (1-At) + At * Ot. */ surface GVmodulateplastic(float Ka = 1, Kd = .5, Ks = .5, roughness = .1; color specularcolor = 1; string texturename = ""; float At = 1;) { /* variables used for lighting */ normal Nf; vector V; /* texture provided color (luminance) and alpha */ color Ct; float Ot; /* number of texture channels, * < 3: liminance and possibly alpha, > 2: rgb and possibly alpha */ float channels; Ci = Cs; Oi = Os; if (texturename != "" && textureinfo(texturename, "channels", channels) == 1.0) { if (channels < 3) { Ct = float texture (texturename[0], "width", 0.0); Ot = float texture (texturename[1], "fill", 1.0, "width", 0.0); } else { Ct = color texture (texturename, "width", 0.0); Ot = float texture (texturename[3], "fill", 1.0, "width", 0.0); } Ot = (1.0 - At) + At * Ot; Ci *= Ct; Oi *= Ot; } Nf = faceforward (normalize(N),I); V = -normalize(I); Ci = Ci * (Ka*ambient() + Kd*diffuse(Nf)) + specularcolor * Ks*specular(Nf,V,roughness); Ci *= Oi; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/data/shaders/GVdecalconstant.sdl0000644000175000001440000000177210624244367016430 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 6.5.0 linux64 (Feb 9 2007) "Ennio" %code 6 40 0 25 8 Ci Oi Cs Os s t du dv 1 "texturename" "" 2 4 0 0 1 0 10 1 0 10 0 1 1 0 1 1 0 3 1 0 3 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 5 5 0 4 "" 1 0.00000000e+00 1 3.00000000e+00 1 1.00000000e+00 0 3 9 8 21 0 0 0 0 123 11 0 2 11 1 3 73 9 8 21 364 9 104 10 14 4 339 20 14 15 16 10 17 5 339 20 17 18 19 309 10 13 20 8 22 14 17 15 18 16 19 20 20 20 20 20 20 22 20 20 20 20 20 11 12 13 10 19 4 339 20 19 18 17 10 16 5 339 20 16 15 14 307 10 11 20 8 23 19 16 18 15 17 14 20 20 20 20 20 20 22 20 20 20 24 20 10 10 11 358 37 11 24 11 43 13 11 0 43 12 10 12 36 0 13 12 359 358 46 0 0 3 359 %comment-3dl 6 40 0 %comment-user 6 40 0 geomview-1.9.4/data/shaders/GVdecalconstant.sdr0000644000175000001440000000203010624242144016411 00000000000000#!version 2.1.1 surface #!parameters: uniform string texturename = "" #!variables: varying vector Ct varying float Ot varying boolean temporary_0 uniform boolean temporary_1 varying vector temporary_2 varying vector temporary_3 varying float temporary_4 varying float temporary_5 varying vector temporary_6 #!Init: return #!Code: movevv Ci Cs movevv Oi Os sneql temporary_1 texturename "" vuboolean temporary_0 temporary_1 if temporary_0 #!Label3 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 texture ("f=SFffSfSf") Ot texturename 3 s t "fill" 1.0 "width" 0.0 vufloat temporary_5 1 subff temporary_4 temporary_5 Ot vfromf temporary_3 temporary_4 mulvv temporary_2 temporary_3 Ci vfromf temporary_6 Ot mulvv temporary_3 temporary_6 Ct addvv Ci temporary_2 temporary_3 #!Label3: endif mulvv Ci Ci Os return geomview-1.9.4/data/shaders/GVdecalconstant.slx0000644000175000001440000000115210624242144016433 00000000000000surface AQSIS_V 1.2.0 segment Data USES 454683 param uniform string texturename varying color Ct varying float Ot segment Init pushis "" pop texturename segment Code pushv Cs pop Ci pushv Os pop Oi S_CLEAR pushis "" pushv texturename ness S_GET RS_PUSH RS_GET RS_JZ 0 pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ctexture1 pop Ct pushif 0 pushis "width" pushif 1 pushis "fill" pushif 3 pushv texturename pushif 4 ftexture1 pop Ot pushv Ct pushv Ot mulfc pushv Ci pushv Ot pushif 1 subff mulfc addcc pop Ci :0 RS_POP pushv Os pushv Ci mulcc pop Ci geomview-1.9.4/data/shaders/GVdecalplastic.sdl0000644000175000001440000000267710624244367016243 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 6.5.0 linux64 (Feb 9 2007) "Ennio" %code 6 40 0 41 13 Ci Oi Cs Os N I Ng P L s t du dv 6 "Ka" "" 2 1 0 0 "Kd" "" 2 1 0 0 "Ks" "" 2 1 0 0 "roughness" "" 2 1 0 0 "specularcolor" "rgb" 2 3 0 0 "texturename" "" 2 4 0 0 2 0 3 1 0 10 1 0 13 0 1 1 0 1 1 0 3 1 0 3 1 0 3 1 0 9 1 0 8 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 7 5 0 1 1.00000000e+00 1 5.00000000e-01 1 1.00000001e-01 4 "" 1 0.00000000e+00 1 3.00000000e+00 0 3 1 13 35 3 1 14 36 3 1 15 36 3 1 16 37 3 6 17 35 3 9 18 38 0 0 0 0 0 0 0 0 0 188 11 0 2 11 1 3 206 27 34 4 213 26 34 27 5 206 27 34 5 358 63 27 27 359 267 23 34 358 43 23 13 23 359 269 24 34 26 358 43 24 14 24 36 23 23 24 46 23 0 23 359 45 19 17 15 271 24 34 26 27 16 358 46 25 19 24 36 0 23 25 359 73 20 18 38 364 20 104 10 28 9 339 34 28 29 30 10 31 10 339 34 31 32 33 309 10 25 34 18 39 28 31 29 32 30 33 34 34 34 34 34 34 39 34 34 34 34 34 11 23 25 10 33 9 339 34 33 32 31 10 30 10 339 34 30 29 28 307 10 22 34 18 40 33 30 32 29 31 28 34 34 34 34 34 34 39 34 34 34 35 34 10 21 22 358 37 22 35 22 43 25 22 0 43 24 21 23 36 0 25 24 359 358 46 0 0 3 359 %comment-3dl 6 40 0 %comment-user 6 40 0 geomview-1.9.4/data/shaders/GVdecalplastic.sdr0000644000175000001440000000434110624242144016226 00000000000000#!version 2.1.1 surface #!parameters: uniform float Ka = 1 uniform float Kd = .5 uniform float Ks = .5 uniform float roughness = .1 uniform color specularcolor = 1 uniform string texturename = "" #!variables: varying vector Nf varying vector V varying vector Ct varying float Ot varying vector temporary_0 varying vector temporary_1 varying vector temporary_2 varying vector temporary_3 uniform vector temporary_4 varying vector temporary_5 varying vector temporary_6 uniform vector temporary_7 varying float temporary_8 varying boolean temporary_9 uniform boolean temporary_10 varying float temporary_11 #!Init: return #!Code: movevv Ci Cs movevv Oi Os normalize ("v=v") temporary_0 N faceforward ("v=vv") Nf temporary_0 I normalize ("v=v") temporary_0 I negv V temporary_0 vfromf temporary_4 Ka vuvector temporary_3 temporary_4 ambient ("c=") temporary_5 mulvv temporary_2 temporary_3 temporary_5 vfromf temporary_4 Kd vuvector temporary_5 temporary_4 diffuse ("c=n") temporary_6 Nf mulvv temporary_3 temporary_5 temporary_6 addvv temporary_1 temporary_2 temporary_3 mulvv temporary_0 Ci temporary_1 vfromf temporary_7 Ks mulvv temporary_4 specularcolor temporary_7 vuvector temporary_2 temporary_4 vufloat temporary_8 roughness specular ("c=nvf") temporary_3 Nf V temporary_8 mulvv temporary_1 temporary_2 temporary_3 addvv Ci temporary_0 temporary_1 sneql temporary_10 texturename "" vuboolean temporary_9 temporary_10 if temporary_9 #!Label3 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 texture ("f=SFffSfSf") Ot texturename 3 s t "fill" 1.0 "width" 0.0 vufloat temporary_11 1 subff temporary_8 temporary_11 Ot vfromf temporary_1 temporary_8 mulvv temporary_0 temporary_1 Ci vfromf temporary_2 Ot mulvv temporary_1 temporary_2 Ct addvv Ci temporary_0 temporary_1 #!Label3: endif mulvv Ci Ci Os return geomview-1.9.4/data/shaders/GVdecalplastic.slx0000644000175000001440000000225410624242144016245 00000000000000surface AQSIS_V 1.2.0 segment Data USES 522267 param uniform float Ka param uniform float Kd param uniform float Ks param uniform float roughness param uniform color specularcolor param uniform string texturename varying normal Nf varying vector V varying color Ct varying float Ot segment Init pushif 1 pop Ka pushif 0.5 pop Kd pushif 0.5 pop Ks pushif 0.1 pop roughness pushif 1 setfc pop specularcolor pushis "" pop texturename segment Code pushv Cs pop Ci pushv Os pop Oi pushv I pushv N normalize faceforward pop Nf pushv I normalize negp pop V pushv roughness pushv V pushv Nf specular pushv Ks setfc pushv specularcolor mulcc mulcc pushv Nf diffuse pushv Kd mulfc ambient pushv Ka mulfc addcc pushv Ci mulcc addcc pop Ci S_CLEAR pushis "" pushv texturename ness S_GET RS_PUSH RS_GET RS_JZ 0 pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ctexture1 pop Ct pushif 0 pushis "width" pushif 1 pushis "fill" pushif 3 pushv texturename pushif 4 ftexture1 pop Ot pushv Ct pushv Ot mulfc pushv Ci pushv Ot pushif 1 subff mulfc addcc pop Ci :0 RS_POP pushv Os pushv Ci mulcc pop Ci geomview-1.9.4/data/shaders/GVblendconstant.sl0000644000175000001440000000406610600044551016262 00000000000000/* Copyright (C) 2007 Claus-Justus Heine * * This file is part of Geomview. * * Geomview is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2, or (at your option) * any later version. * * Geomview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Geomview; see the file COPYING. If not, write * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, * USA, or visit http://www.gnu.org. */ /* Implement Geomview's "apply = blend" for constant shading * * Maybe mgrib should set bgalpha to 0 if transparency is not enabled * (0 because this will leave the alpha channel of the surface * unaffected). * * The additional parameter At interpolates 1 and Ot; the effective * alpha contribution from the texture will be (1-At) + At * Ot. */ surface GVblendconstant(string texturename = ""; color bgcolor = 0; float At = 1;) { /* texture provided color (luminance) and alpha */ color Ct; float Ot; /* number of texture channels, * < 3: liminance and possibly alpha, > 2: rgb and possibly alpha */ float channels; Ci = Cs; Oi = Os; /* texture support a la GL_BLEND */ if (texturename != "" && textureinfo(texturename, "channels", channels) == 1.0) { if (channels < 3) { Ct = float texture(texturename[0], "width", 0.0); Ot = float texture(texturename[1], "fill", 1.0, "width", 0.0); } else { Ct = color texture(texturename, "width", 0.0); Ot = float texture(texturename[3], "fill", 1.0, "width", 0.0); } Ci = (1.0 - Ct) * Ci + Ct * bgcolor; Ot = (1.0 - At) + At * Ot; Oi *= Ot; } Ci *= Oi; } /* * Local Variables: *** * mode: c *** * c-basic-offset: 2 *** * End: *** */ geomview-1.9.4/data/shaders/GVmodulateconstant.sdl0000644000175000001440000000276310624244367017173 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 6.5.0 linux64 (Feb 9 2007) "Ennio" %code 6 40 0 33 8 Ci Oi Cs Os s t du dv 2 "texturename" "" 2 4 0 0 "At" "" 2 1 0 0 4 0 10 1 0 1 1 0 1 1 0 10 1 0 11 0 10 1 0 1 1 0 1 1 0 3 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 8 5 0 4 "" 5 1 1 1.00000000e+00 4 "channels" 1 3.00000000e+00 5 0 1 0.00000000e+00 0 3 9 8 26 3 1 9 28 0 0 0 0 0 261 11 0 2 11 1 3 73 10 8 26 364 10 28 358 360 10 1 11 16 362 359 328 12 8 11 29 31 27 31 358 360 10 1 16 11 362 359 70 10 12 28 364 10 211 358 64 14 16 30 359 345 13 14 364 13 88 10 18 4 339 25 18 19 20 10 21 5 339 25 21 22 23 307 10 24 14 8 32 18 21 19 22 20 23 25 25 25 25 25 25 32 25 25 25 25 25 358 360 14 6 17 24 362 359 10 24 4 339 25 24 23 22 10 21 5 339 25 21 20 19 307 10 15 14 8 28 24 21 23 20 22 19 25 25 25 25 25 25 32 25 25 25 28 25 346 14 14 345 13 14 364 13 80 10 19 4 339 25 19 20 21 10 22 5 339 25 22 23 24 309 10 17 14 8 32 19 22 20 23 21 24 25 25 25 25 25 25 32 25 25 25 25 25 10 24 4 339 25 24 23 22 10 21 5 339 25 21 20 19 307 10 15 14 8 30 24 21 23 20 22 19 25 25 25 25 25 25 32 25 25 25 28 25 37 12 28 9 358 42 19 9 15 32 15 12 19 46 0 0 17 45 1 1 15 359 358 46 0 0 1 359 %comment-3dl 6 40 0 %comment-user 6 40 0 geomview-1.9.4/data/shaders/GVmodulateconstant.sdr0000644000175000001440000000334110624242144017161 00000000000000#!version 2.1.1 surface #!parameters: uniform string texturename = "" uniform float At = 1 #!variables: varying vector Ct varying float Ot varying float channels varying boolean temporary_0 varying boolean temporary_1 uniform boolean temporary_2 varying boolean temporary_3 varying float temporary_4 varying float temporary_5 uniform float temporary_6 varying float temporary_7 varying vector temporary_8 #!Init: return #!Code: movevv Ci Cs movevv Oi Os sneql temporary_2 texturename "" vuboolean temporary_1 temporary_2 textureinfo ("f=SSF") temporary_4 texturename "channels" channels vufloat temporary_5 1.0 feql temporary_3 temporary_4 temporary_5 and temporary_0 temporary_1 temporary_3 if temporary_0 #!Label5 vufloat temporary_4 3 flt temporary_1 channels temporary_4 if temporary_1 #!Label8 texture ("f=SFffSf") temporary_4 texturename 0 s t "width" 0.0 vfromf Ct temporary_4 texture ("f=SFffSfSf") Ot texturename 1 s t "fill" 1.0 "width" 0.0 #!Label8: else #!Label7 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 texture ("f=SFffSfSf") Ot texturename 3 s t "fill" 1.0 "width" 0.0 #!Label7: endif subff temporary_6 1.0 At vufloat temporary_4 temporary_6 vufloat temporary_7 At mulff temporary_5 temporary_7 Ot addff Ot temporary_4 temporary_5 mulvv Ci Ci Ct vfromf temporary_8 Ot mulvv Oi Oi temporary_8 #!Label5: endif mulvv Ci Ci Oi return geomview-1.9.4/data/shaders/GVmodulateconstant.slx0000644000175000001440000000216010624242144017175 00000000000000surface AQSIS_V 1.2.0 segment Data USES 454683 param uniform string texturename param uniform float At varying color Ct varying float Ot varying float channels segment Init pushis "" pop texturename pushif 1 pop At segment Code pushv Cs pop Ci pushv Os pop Oi S_CLEAR pushis "" pushv texturename ness pushif 1 pushis "channels" pushv texturename textureinfo channels eqff land S_GET RS_PUSH RS_GET RS_JZ 0 S_CLEAR pushif 3 pushv channels lsff S_GET RS_PUSH RS_GET RS_JZ 2 pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ftexture1 setfc pop Ct pushif 0 pushis "width" pushif 1 pushis "fill" pushif 1 pushv texturename pushif 4 ftexture1 pop Ot :2 RS_JNZ 1 RS_INVERSE pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ctexture1 pop Ct pushif 0 pushis "width" pushif 1 pushis "fill" pushif 3 pushv texturename pushif 4 ftexture1 pop Ot :1 RS_POP pushv Ot pushv At mulff pushv At pushif 1 subff addff pop Ot pushv Ct pushv Ci mulcc pop Ci pushv Ot setfc pushv Oi mulcc pop Oi :0 RS_POP pushv Oi pushv Ci mulcc pop Ci geomview-1.9.4/data/shaders/hplastic.sdl0000644000175000001440000000554610624244366015162 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 6.5.0 linux64 (Feb 9 2007) "Ennio" %code 6 40 0 46 10 Ci Oi P N I Ng L Os Cs Cl 5 "Ka" "" 2 1 0 0 "Kd" "" 2 1 0 0 "Ks" "" 2 1 0 0 "roughness" "" 2 1 0 0 "specularcolor" "rgb" 2 3 0 0 4 0 1 1 0 10 1 0 10 1 0 10 1 0 22 0 10 1 0 10 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 3 1 0 3 1 0 3 1 0 3 1 0 2 1 0 2 1 0 2 1 0 2 1 0 2 1 0 5 5 0 1 1.00000000e+00 1 1.00000001e-01 1 0.00000000e+00 1 9.99999975e-05 0 3 1 10 42 3 1 11 42 3 1 12 42 3 1 13 43 5 18 14 42 42 42 0 0 0 0 0 0 0 0 641 358 18 0 44 44 44 359 11 40 2 358 58 27 40 40 69 19 27 42 359 345 16 19 364 16 8 358 360 19 6 0 44 362 359 346 19 19 345 16 19 364 16 595 50 15 42 13 206 36 19 3 213 38 19 36 4 358 360 19 4 36 38 58 22 40 38 58 28 38 38 42 29 22 22 37 28 28 29 104 26 28 63 38 4 4 37 38 58 28 38 40 62 28 28 37 29 27 42 50 23 28 29 43 38 23 40 36 37 37 38 58 29 37 37 42 28 23 23 37 29 29 28 115 28 29 104 24 28 71 20 24 44 362 359 17 20 19 20 345 17 20 364 17 9 358 360 20 50 24 42 24 362 359 347 20 20 19 345 17 20 364 17 8 358 360 20 1 24 42 362 359 358 360 19 43 37 24 37 42 21 24 23 6 32 44 362 359 300 17 40 41 0 0 364 17 438 358 46 33 7 8 359 358 360 19 58 28 6 40 62 28 28 37 29 27 42 50 23 28 29 43 38 23 40 36 39 6 38 58 29 39 39 42 28 23 23 37 29 29 28 115 28 29 104 24 28 71 20 24 44 362 359 17 20 19 20 345 18 20 364 18 9 358 360 20 50 24 42 24 362 359 347 20 20 19 345 18 20 364 18 8 358 360 20 1 24 42 362 359 358 360 19 43 39 24 39 42 24 24 23 58 28 39 36 42 29 24 22 37 28 28 29 50 25 28 26 68 20 25 42 362 359 17 20 19 20 345 18 20 364 18 8 358 360 20 1 25 42 362 359 358 360 19 41 38 37 39 37 23 21 24 58 28 37 38 42 29 21 23 37 28 28 29 62 29 28 58 28 39 38 42 30 24 23 37 31 28 30 50 23 29 31 43 38 23 39 36 38 37 38 42 31 23 24 32 23 21 31 58 31 38 38 42 30 23 23 37 28 31 30 115 29 28 64 20 29 45 362 359 17 20 19 20 345 18 20 364 18 8 15 38 39 20 14 23 24 20 358 360 19 64 20 23 44 362 359 17 20 19 20 345 18 20 364 18 11 358 360 20 63 38 38 62 23 23 362 359 358 360 19 58 29 38 36 42 28 23 22 37 30 29 28 58 31 38 38 42 28 23 23 37 29 31 28 115 28 29 104 23 28 42 24 23 26 50 23 30 24 64 20 23 44 362 359 17 20 19 20 345 18 20 364 18 8 358 360 20 62 23 23 362 359 358 360 19 68 20 23 42 362 359 17 20 19 20 345 18 20 364 18 8 358 360 20 1 23 42 362 359 358 360 19 46 34 33 9 362 359 267 35 19 358 360 19 43 35 10 35 42 24 11 25 35 35 35 24 46 34 34 35 36 32 32 34 46 34 7 14 46 35 34 9 45 35 35 12 1 24 15 102 23 23 24 45 35 35 23 36 32 32 35 362 359 302 17 40 41 0 0 364 17 2 357 -432 15 0 32 19 11 1 7 %comment-3dl 6 40 0 %comment-user 6 40 0 geomview-1.9.4/data/shaders/hplastic.sdr0000644000175000001440000001664310624242144015160 00000000000000#!version 2.1.1 surface #!parameters: uniform float Ka = 1 uniform float Kd = 1 uniform float Ks = 1 uniform float roughness = .1 uniform color specularcolor = [ 1 1 1 ] #!variables: varying vector Nh varying vector Ih varying vector M varying vector Lh varying float Ihw varying float Nhw varying float Mw varying float Lhw varying float a varying float b varying float d varying float ss varying float nn varying float mag2 varying float PdotP varying vector sP varying vector total uniform float spec varying boolean temporary_0 varying float temporary_1 uniform vector temporary_2 varying vector temporary_3 varying float temporary_4 varying float temporary_5 varying float temporary_6 varying vector temporary_7 varying boolean temporary_8 varying float temporary_9 varying float temporary_10 varying float temporary_11 varying vector temporary_12 varying vector temporary_13 varying vector temporary_14 varying vector temporary_15 #!Init: return #!Code: movevv sP P dot PdotP sP sP vufloat temporary_1 1.0 fegt temporary_0 PdotP temporary_1 if temporary_0 #!Label20 vfromf temporary_2 0 vuvector Ci temporary_2 vfromf temporary_2 1.0 vuvector Oi temporary_2 #!Label20: else #!Label19 divff spec 1.0 roughness normalize ("v=v") temporary_3 N faceforward ("v=vv") Nh temporary_3 I dot Nhw sP Nh dot temporary_4 Nh Nh mulff temporary_5 Nhw Nhw subff temporary_1 temporary_4 temporary_5 sqrt ("f=f") nn temporary_1 negv Ih I dot temporary_5 Ih sP vufloat temporary_6 0 subff temporary_4 temporary_5 temporary_6 vufloat temporary_6 1 subff temporary_5 PdotP temporary_6 divff temporary_1 temporary_4 temporary_5 negf b temporary_1 vfromf temporary_7 b mulvv temporary_3 temporary_7 sP addvv Ih Ih temporary_3 vufloat temporary_1 0 addff Ihw temporary_1 b dot temporary_5 Ih Ih mulff temporary_6 Ihw Ihw subff temporary_4 temporary_5 temporary_6 abs ("f=f") temporary_1 temporary_4 sqrt ("f=f") mag2 temporary_1 vufloat temporary_1 0.0 fneql temporary_8 mag2 temporary_1 if temporary_8 #!Label22 vufloat temporary_1 1.0 divff mag2 temporary_1 mag2 #!Label22: else #!Label21 vufloat mag2 1.0 #!Label21: endif vfromf temporary_3 mag2 mulvv Ih temporary_3 Ih mulff Ihw mag2 Ihw vfromf temporary_2 0 vuvector total temporary_2 illuminance sP #!Label23 #!Label24 #!Label23: dot temporary_5 L sP vufloat temporary_6 0 subff temporary_4 temporary_5 temporary_6 vufloat temporary_6 1 subff temporary_5 PdotP temporary_6 divff temporary_1 temporary_4 temporary_5 negf b temporary_1 vfromf temporary_7 b mulvv temporary_3 temporary_7 sP addvv Lh L temporary_3 vufloat temporary_1 0 addff Lhw temporary_1 b dot temporary_5 Lh Lh mulff temporary_6 Lhw Lhw subff temporary_4 temporary_5 temporary_6 abs ("f=f") temporary_1 temporary_4 sqrt ("f=f") mag2 temporary_1 vufloat temporary_1 0.0 fneql temporary_8 mag2 temporary_1 if temporary_8 #!Label26 vufloat temporary_1 1.0 divff mag2 temporary_1 mag2 #!Label26: else #!Label25 vufloat mag2 1.0 #!Label25: endif vfromf temporary_3 mag2 mulvv Lh temporary_3 Lh mulff Lhw mag2 Lhw dot temporary_4 Lh Nh mulff temporary_5 Lhw Nhw subff temporary_1 temporary_4 temporary_5 divff d temporary_1 nn vufloat temporary_1 1.0 fgt temporary_8 d temporary_1 if temporary_8 #!Label27 vufloat d 1.0 #!Label27: endif subvv M Ih Lh subff Mw Ihw Lhw dot temporary_5 Ih M mulff temporary_6 Ihw Mw subff temporary_4 temporary_5 temporary_6 dot temporary_6 Lh M mulff temporary_9 Lhw Mw subff temporary_5 temporary_6 temporary_9 divff temporary_1 temporary_4 temporary_5 negf a temporary_1 vfromf temporary_7 a mulvv temporary_3 temporary_7 Lh addvv M Ih temporary_3 mulff temporary_1 a Lhw addff Mw Ihw temporary_1 dot temporary_5 M M mulff temporary_6 Mw Mw subff temporary_4 temporary_5 temporary_6 abs ("f=f") temporary_1 temporary_4 vufloat temporary_4 .0001 flt temporary_8 temporary_1 temporary_4 if temporary_8 #!Label29 movevv M Lh moveff Mw Lhw #!Label29: endif vufloat temporary_1 0.0 flt temporary_8 Mw temporary_1 if temporary_8 #!Label31 negv M M negf Mw Mw #!Label31: endif dot temporary_4 M Nh mulff temporary_5 Mw Nhw subff temporary_1 temporary_4 temporary_5 dot temporary_10 M M mulff temporary_11 Mw Mw subff temporary_9 temporary_10 temporary_11 abs ("f=f") temporary_6 temporary_9 sqrt ("f=f") temporary_5 temporary_6 mulff temporary_4 temporary_5 nn divff ss temporary_1 temporary_4 vufloat temporary_1 0.0 flt temporary_8 ss temporary_1 if temporary_8 #!Label33 negf ss ss #!Label33: endif vufloat temporary_1 1.0 fgt temporary_8 ss temporary_1 if temporary_8 #!Label35 vufloat ss 1.0 #!Label35: endif mulvv temporary_12 Os Cs mulvv temporary_7 temporary_12 Cl vfromf temporary_2 Ka vuvector temporary_14 temporary_2 ambient ("c=") temporary_15 mulvv temporary_13 temporary_14 temporary_15 vufloat temporary_4 Kd mulff temporary_1 temporary_4 d vfromf temporary_14 temporary_1 addvv temporary_12 temporary_13 temporary_14 mulvv temporary_3 temporary_7 temporary_12 addvv total total temporary_3 vuvector temporary_14 specularcolor mulvv temporary_13 Os temporary_14 mulvv temporary_12 temporary_13 Cl vfromf temporary_2 Ks vuvector temporary_13 temporary_2 mulvv temporary_7 temporary_12 temporary_13 vufloat temporary_4 spec pow ("f=ff") temporary_1 ss temporary_4 vfromf temporary_12 temporary_1 mulvv temporary_3 temporary_7 temporary_12 addvv total total temporary_3 #!Label24: endilluminance movevv Ci total #!Label19: endif movevv Oi Os return geomview-1.9.4/data/shaders/hplastic.slo0000644000175000001440000001230510462665407015167 00000000000000shader_obj 3.1 1 0 hplastic 81 4 11 57 123 0 5 5 0 5 13 2 8 eye rgb 4 1 0.1 0 0.0001 0 81 Ka 4 5 -1 1 3 1 1 1 1 111 111 Kd 4 5 -1 2 3 1 2 2 2 112 112 Ks 4 5 -1 3 3 1 3 3 3 118 118 roughness 4 5 -1 4 3 1 4 4 4 12 12 specularcolor 3 5 1 5 3 1 5 5 5 5 116 $C1 4 2 -1 0 3 0 0 0 0 1 107 $C2 4 2 -1 1 3 0 0 0 0 4 4 Nh 2 3 0 0 2 0 0 14 14 14 92 Ih 2 3 0 0 2 0 0 20 37 20 77 M 2 3 0 0 2 0 0 66 90 66 95 Lh 2 3 0 0 2 0 0 46 57 46 86 Ihw 4 3 -1 0 2 0 0 27 38 29 79 Nhw 4 3 -1 0 2 0 0 15 15 15 93 Mw 4 3 -1 0 2 0 0 67 91 67 96 Lhw 4 3 -1 0 2 0 0 47 58 49 87 a 4 3 -1 0 2 0 0 75 75 75 78 b 4 3 -1 0 2 0 0 24 44 24 47 d 4 3 -1 0 2 0 0 62 65 62 112 ss 4 3 -1 0 2 0 0 101 107 101 119 nn 4 3 -1 0 2 0 0 19 19 19 100 mag2 4 3 -1 0 2 0 0 32 56 32 58 PdotP 4 3 -1 0 2 0 0 7 7 7 43 sP 2 3 0 0 2 0 0 6 6 7 121 total 3 3 1 0 2 0 0 39 121 115 122 spec 4 3 -1 0 3 0 0 12 12 12 119 Ps 2 10 0 0 2 0 0 0 0 6 6 $?8 10 11 -1 0 2 0 0 122 122 122 122 $T2 11 4 -1 0 2 0 0 9 122 9 122 $X22 9 8 -1 0 2 0 0 0 0 8 9 $C3 4 2 -1 2 3 0 0 0 0 10 121 Ci 3 10 1 0 2 0 0 10 122 0 0 Oi 3 10 -1 0 2 0 0 11 123 0 0 $X23 9 8 -1 0 2 0 0 0 0 9 11 N 2 10 0 0 2 0 0 0 0 13 13 $T5 2 4 0 0 2 0 0 13 77 13 77 I 2 10 0 0 2 0 0 0 0 14 20 $T8 4 4 -1 0 2 0 0 16 98 16 98 $T9 4 4 -1 0 2 0 0 17 101 17 101 $T10 4 4 -1 0 2 0 0 18 121 18 121 $?0 10 11 -1 0 2 0 0 36 36 36 36 $T23 11 4 -1 0 2 0 0 34 107 34 107 $X0 9 8 -1 0 2 0 0 0 0 33 34 $X1 9 8 -1 0 2 0 0 0 0 34 35 $X2 9 8 -1 0 2 0 0 0 0 35 36 $?1 10 11 -1 0 2 0 0 40 121 40 121 L 2 10 0 0 2 0 0 0 0 41 46 $T38 4 4 -1 0 2 0 0 50 100 50 100 $?2 10 11 -1 0 2 0 0 56 56 56 56 $X3 9 8 -1 0 2 0 0 0 0 53 54 $X4 9 8 -1 0 2 0 0 0 0 54 55 $X5 9 8 -1 0 2 0 0 0 0 55 56 $?3 10 11 -1 0 2 0 0 65 65 65 65 $X6 9 8 -1 0 2 0 0 0 0 63 64 $X7 9 8 -1 0 2 0 0 0 0 64 65 $X8 9 8 -1 0 3 0 0 0 0 65 65 $T56 4 4 -1 0 2 0 0 74 120 74 120 $?4 10 11 -1 0 2 0 0 87 87 87 87 $C4 4 2 -1 3 3 0 0 0 0 85 85 $X9 9 8 -1 0 2 0 0 0 0 80 85 $X10 9 8 -1 0 2 0 0 0 0 85 87 $X11 9 8 -1 0 3 0 0 0 0 87 87 $?5 10 11 -1 0 2 0 0 91 91 91 91 $X12 9 8 -1 0 2 0 0 0 0 88 89 $X13 9 8 -1 0 2 0 0 0 0 89 91 $X14 9 8 -1 0 3 0 0 0 0 91 91 $?6 10 11 -1 0 2 0 0 104 104 104 104 $X15 9 8 -1 0 2 0 0 0 0 102 103 $X16 9 8 -1 0 2 0 0 0 0 103 104 $X17 9 8 -1 0 3 0 0 0 0 104 104 $?7 10 11 -1 0 2 0 0 107 107 107 107 $X18 9 8 -1 0 2 0 0 0 0 105 106 $X19 9 8 -1 0 2 0 0 0 0 106 107 $X20 9 8 -1 0 3 0 0 0 0 107 107 Os 3 10 -1 0 2 0 0 0 0 108 123 Cs 3 10 1 0 2 0 0 0 0 108 108 $T83 3 4 1 0 2 0 0 108 114 108 114 Cl 3 10 1 0 2 0 0 0 0 109 117 $T84 3 4 1 0 2 0 0 109 121 109 121 $T86 3 4 1 0 2 0 0 111 120 111 120 $X21 9 8 -1 0 2 0 0 0 0 40 121 $X24 9 8 -1 0 2 0 0 0 0 11 122 352 0 5 1 5 2 5 3 6 4 5 5 5 22 25 21 22 22 27 28 32 80 26 27 21 5 30 29 31 5 24 5 3 34 33 7 34 35 12 22 7 36 7 7 37 12 12 38 36 37 19 38 8 35 38 8 22 37 38 38 21 5 16 37 38 34 16 22 8 8 34 11 16 38 8 8 37 11 11 36 38 37 38 36 20 38 40 41 42 43 39 40 20 29 20 5 20 20 5 8 20 8 11 20 11 23 29 38 44 29 79 22 37 45 22 36 37 37 21 5 16 36 37 34 16 22 10 45 34 14 16 37 10 10 36 14 14 46 37 36 37 46 20 37 40 48 49 50 47 40 20 29 20 5 20 20 5 10 20 10 14 20 14 46 10 7 37 14 12 36 46 37 17 36 19 40 52 53 54 51 40 17 5 17 5 9 8 10 13 11 14 46 8 9 37 11 13 36 46 37 46 36 37 10 9 36 14 13 55 37 36 15 46 55 34 15 10 9 8 34 55 15 14 13 11 55 40 58 59 60 56 55 9 9 46 13 13 37 55 46 55 37 40 55 57 9 10 13 14 40 62 63 64 61 40 13 29 9 9 13 13 55 9 7 46 13 12 37 55 46 55 9 9 46 13 13 36 55 46 55 36 46 55 55 46 19 18 37 55 40 66 67 68 65 40 18 29 18 18 40 70 71 72 69 40 18 5 18 5 75 73 74 77 75 76 75 78 0 75 55 1 17 75 78 55 78 77 75 23 23 78 78 73 4 77 78 76 78 77 2 55 18 24 77 78 55 23 23 77 30 23 31 73 _assign 2 0 _assign 2 2 _assign 2 4 _assign 2 6 _color 4 8 _assign 2 12 _dot 3 14 _if 5 17 _ge 3 22 _assign 2 25 _assign 2 27 _divide 3 29 normalize 2 32 faceforward 3 34 _dot 3 37 _dot 3 40 _multiply 3 43 _subtract 3 46 sqrt 2 49 _negate 2 51 _dot 3 53 _negate 2 56 _subtract 3 58 _divide 3 61 _scale 3 64 _add 3 67 _assign 2 70 _dot 3 72 _multiply 3 75 _subtract 3 78 abs 2 81 sqrt 2 83 _if 5 85 _ne 3 90 _divide 3 93 _assign 2 96 _scale 3 98 _multiply 3 101 _assign 2 104 _illuminance 5 106 _dot 3 111 _negate 2 114 _subtract 3 116 _divide 3 119 _scale 3 122 _add 3 125 _assign 2 128 _dot 3 130 _multiply 3 133 _subtract 3 136 abs 2 139 sqrt 2 141 _if 5 143 _ne 3 148 _divide 3 151 _assign 2 154 _scale 3 156 _multiply 3 159 _dot 3 162 _multiply 3 165 _subtract 3 168 _divide 3 171 _if 5 174 _gt 3 179 _assign 2 182 _subtract 3 184 _subtract 3 187 _dot 3 190 _multiply 3 193 _subtract 3 196 _negate 2 199 _dot 3 201 _multiply 3 204 _subtract 3 207 _divide 3 210 _scale 3 213 _add 3 216 _multiply 3 219 _add 3 222 _if 5 225 _dot 3 230 _multiply 3 233 _subtract 3 236 abs 2 239 _lt 3 241 _assign 2 244 _assign 2 246 _if 5 248 _lt 3 253 _negate 2 256 _negate 2 258 _dot 3 260 _multiply 3 263 _subtract 3 266 _dot 3 269 _multiply 3 272 _subtract 3 275 abs 2 278 sqrt 2 280 _multiply 3 282 _divide 3 285 _if 5 288 _lt 3 293 _negate 2 296 _if 5 298 _gt 3 303 _assign 2 306 _multiply 3 308 _multiply 3 311 ambient 1 314 _scale 3 315 _multiply 3 318 _add 3 321 _multiply 3 324 _add 3 327 _multiply 3 330 _multiply 3 333 _scale 3 336 pow 3 339 _scale 3 342 _add 3 345 _assign 2 348 _assign 2 350 geomview-1.9.4/data/shaders/hplastic.slx0000644000175000001440000000735310624242144015174 00000000000000surface AQSIS_V 1.2.0 segment Data USES 461155 param uniform float Ka param uniform float Kd param uniform float Ks param uniform float roughness param uniform color specularcolor varying point Nh varying point Ih varying point M varying point Lh varying float Ihw varying float Nhw varying float Mw varying float Lhw varying float a varying float b varying float d varying float ss varying float nn varying float mag2 varying float PdotP varying point sP varying color total uniform float spec segment Init pushif 1 pop Ka pushif 1 pop Kd pushif 1 pop Ks pushif 0.1 pop roughness pushif 1 pushif 1 pushif 1 settc pop specularcolor segment Code pushv P pop sP pushv sP pushv sP dotpp pop PdotP S_CLEAR pushif 1 pushv PdotP geff S_GET RS_PUSH RS_GET RS_JZ 1 pushif 0 setfc pop Ci pushif 1 setfc pop Oi :1 RS_JNZ 0 RS_INVERSE pushv roughness pushif 1 divff pop spec pushv I pushv N normalize faceforward pop Nh pushv Nh pushv sP dotpp pop Nhw pushv Nhw pushv Nhw mulff pushv Nh pushv Nh dotpp subff sqrt pop nn pushv I negp pop Ih pushif 1 pushv PdotP subff pushif 0 pushv sP pushv Ih dotpp subff negf divff pop b pushv sP pushv b mulfp pushv Ih addpp pop Ih pushv b pushif 0 addff pop Ihw pushv Ihw pushv Ihw mulff pushv Ih pushv Ih dotpp subff abs sqrt pop mag2 S_CLEAR pushif 0 pushv mag2 neff S_GET RS_PUSH RS_GET RS_JZ 3 pushv mag2 pushif 1 divff pop mag2 :3 RS_JNZ 2 RS_INVERSE pushif 1 pop mag2 :2 RS_POP pushv Ih pushv mag2 mulfp pop Ih pushv Ihw pushv mag2 mulff pop Ihw pushif 0 setfc pop total pushv sP init_illuminance jz 5 :4 S_CLEAR pushv sP pushis "" illuminance S_JZ 6 RS_PUSH RS_GET pushif 1 pushv PdotP subff pushif 0 pushv sP pushv L dotpp subff negf divff pop b pushv sP pushv b mulfp pushv L addpp pop Lh pushv b pushif 0 addff pop Lhw pushv Lhw pushv Lhw mulff pushv Lh pushv Lh dotpp subff abs sqrt pop mag2 S_CLEAR pushif 0 pushv mag2 neff S_GET RS_PUSH RS_GET RS_JZ 8 pushv mag2 pushif 1 divff pop mag2 :8 RS_JNZ 7 RS_INVERSE pushif 1 pop mag2 :7 RS_POP pushv Lh pushv mag2 mulfp pop Lh pushv Lhw pushv mag2 mulff pop Lhw pushv nn pushv Nhw pushv Lhw mulff pushv Nh pushv Lh dotpp subff divff pop d S_CLEAR pushif 1 pushv d gtff S_GET RS_PUSH RS_GET RS_JZ 9 pushif 1 pop d :9 RS_POP pushv Lh pushv Ih subpp pop M pushv Lhw pushv Ihw subff pop Mw pushv Mw pushv Lhw mulff pushv M pushv Lh dotpp subff pushv Mw pushv Ihw mulff pushv M pushv Ih dotpp subff negf divff pop a pushv Lh pushv a mulfp pushv Ih addpp pop M pushv Lhw pushv a mulff pushv Ihw addff pop Mw S_CLEAR pushif 1e-04 pushv Mw pushv Mw mulff pushv M pushv M dotpp subff abs lsff S_GET RS_PUSH RS_GET RS_JZ 10 pushv Lh pop M pushv Lhw pop Mw :10 RS_POP S_CLEAR pushif 0 pushv Mw lsff S_GET RS_PUSH RS_GET RS_JZ 11 pushv M negp pop M pushv Mw negf pop Mw :11 RS_POP pushv nn pushv Mw pushv Mw mulff pushv M pushv M dotpp subff abs sqrt mulff pushv Nhw pushv Mw mulff pushv Nh pushv M dotpp subff divff pop ss S_CLEAR pushif 0 pushv ss lsff S_GET RS_PUSH RS_GET RS_JZ 12 pushv ss negf pop ss :12 RS_POP S_CLEAR pushif 1 pushv ss gtff S_GET RS_PUSH RS_GET RS_JZ 13 pushif 1 pop ss :13 RS_POP pushv d pushv Kd mulff setfc ambient pushv Ka mulfc addcc pushv Cl pushv Cs pushv Os mulcc mulcc mulcc pushv total addcc pop total pushv spec pushv ss pow setfc pushv Ks setfc pushv Cl pushv specularcolor pushv Os mulcc mulcc mulcc mulcc pushv total addcc pop total RS_POP :6 advance_illuminance jnz 4 :5 pushv total pop Ci :0 RS_POP pushv Os pop Oi geomview-1.9.4/data/shaders/GVmodulateplastic.sdl0000644000175000001440000000371310624244367016775 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 6.5.0 linux64 (Feb 9 2007) "Ennio" %code 6 40 0 49 13 Ci Oi Cs Os s t du dv N I Ng P L 7 "Ka" "" 2 1 0 0 "Kd" "" 2 1 0 0 "Ks" "" 2 1 0 0 "roughness" "" 2 1 0 0 "specularcolor" "rgb" 2 3 0 0 "texturename" "" 2 4 0 0 "At" "" 2 1 0 0 5 0 10 1 0 1 1 0 1 1 0 10 1 0 3 1 0 14 0 10 1 0 1 1 0 1 1 0 3 1 0 3 1 0 9 1 0 8 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 10 5 0 5 1 1 1.00000000e+00 1 5.00000000e-01 1 1.00000001e-01 4 "" 4 "channels" 1 3.00000000e+00 5 0 1 0.00000000e+00 0 3 1 13 41 3 1 14 42 3 1 15 42 3 1 16 43 3 6 17 41 3 9 18 44 3 1 19 41 0 0 0 0 0 0 0 0 0 0 332 11 0 2 11 1 3 73 20 18 44 364 20 28 358 360 20 1 21 27 362 359 328 22 18 21 45 47 40 47 358 360 20 1 27 21 362 359 70 20 22 41 364 20 219 358 64 25 27 46 359 345 23 25 364 23 92 10 32 4 339 39 32 33 34 10 35 5 339 39 35 36 37 307 10 38 25 18 48 32 35 33 36 34 37 39 39 39 39 39 39 48 39 39 39 39 39 358 360 25 6 28 38 362 359 10 38 4 339 39 38 37 36 10 35 5 339 39 35 34 33 307 10 32 25 18 41 38 35 37 34 36 33 39 39 39 39 39 39 48 39 39 39 41 39 14 26 32 25 346 25 25 345 23 25 364 23 84 10 32 4 339 39 32 33 34 10 35 5 339 39 35 36 37 309 10 28 25 18 48 32 35 33 36 34 37 39 39 39 39 39 39 48 39 39 39 39 39 10 37 4 339 39 37 36 35 10 34 5 339 39 34 33 32 307 10 38 25 18 46 37 34 36 33 35 32 39 39 39 39 39 39 48 39 39 39 41 39 14 26 38 25 37 22 41 19 358 42 38 19 26 32 26 22 38 46 0 0 28 45 1 1 26 359 206 31 39 8 213 30 39 31 9 206 31 39 9 358 63 31 31 359 267 28 39 358 43 28 13 28 359 269 29 39 30 358 43 29 14 29 36 28 28 29 46 28 0 28 359 45 24 17 15 271 29 39 30 31 16 358 46 29 24 29 36 0 28 29 46 0 0 1 359 %comment-3dl 6 40 0 %comment-user 6 40 0 geomview-1.9.4/data/shaders/GVmodulateplastic.sdr0000644000175000001440000000577010624242144016777 00000000000000#!version 2.1.1 surface #!parameters: uniform float Ka = 1 uniform float Kd = .5 uniform float Ks = .5 uniform float roughness = .1 uniform color specularcolor = 1 uniform string texturename = "" uniform float At = 1 #!variables: varying vector Nf varying vector V varying vector Ct varying float Ot varying float channels varying boolean temporary_0 varying boolean temporary_1 uniform boolean temporary_2 varying boolean temporary_3 varying float temporary_4 varying float temporary_5 uniform float temporary_6 varying float temporary_7 varying vector temporary_8 varying vector temporary_9 varying vector temporary_10 varying vector temporary_11 uniform vector temporary_12 varying vector temporary_13 varying vector temporary_14 uniform vector temporary_15 #!Init: return #!Code: movevv Ci Cs movevv Oi Os sneql temporary_2 texturename "" vuboolean temporary_1 temporary_2 textureinfo ("f=SSF") temporary_4 texturename "channels" channels vufloat temporary_5 1.0 feql temporary_3 temporary_4 temporary_5 and temporary_0 temporary_1 temporary_3 if temporary_0 #!Label5 vufloat temporary_4 3 flt temporary_1 channels temporary_4 if temporary_1 #!Label8 texture ("f=SFffSf") temporary_4 texturename 0 s t "width" 0.0 vfromf Ct temporary_4 texture ("f=SFffSfSf") Ot texturename 1 s t "fill" 1.0 "width" 0.0 #!Label8: else #!Label7 texture ("c=SFffSf") Ct texturename 0 s t "width" 0.0 texture ("f=SFffSfSf") Ot texturename 3 s t "fill" 1.0 "width" 0.0 #!Label7: endif subff temporary_6 1.0 At vufloat temporary_4 temporary_6 vufloat temporary_7 At mulff temporary_5 temporary_7 Ot addff Ot temporary_4 temporary_5 mulvv Ci Ci Ct vfromf temporary_8 Ot mulvv Oi Oi temporary_8 #!Label5: endif normalize ("v=v") temporary_8 N faceforward ("v=vv") Nf temporary_8 I normalize ("v=v") temporary_8 I negv V temporary_8 vfromf temporary_12 Ka vuvector temporary_11 temporary_12 ambient ("c=") temporary_13 mulvv temporary_10 temporary_11 temporary_13 vfromf temporary_12 Kd vuvector temporary_13 temporary_12 diffuse ("c=n") temporary_14 Nf mulvv temporary_11 temporary_13 temporary_14 addvv temporary_9 temporary_10 temporary_11 mulvv temporary_8 Ci temporary_9 vfromf temporary_15 Ks mulvv temporary_12 specularcolor temporary_15 vuvector temporary_10 temporary_12 vufloat temporary_4 roughness specular ("c=nvf") temporary_11 Nf V temporary_4 mulvv temporary_9 temporary_10 temporary_11 addvv Ci temporary_8 temporary_9 mulvv Ci Ci Oi return geomview-1.9.4/data/shaders/GVmodulateplastic.slx0000644000175000001440000000326210624242144017007 00000000000000surface AQSIS_V 1.2.0 segment Data USES 522267 param uniform float Ka param uniform float Kd param uniform float Ks param uniform float roughness param uniform color specularcolor param uniform string texturename param uniform float At varying normal Nf varying vector V varying color Ct varying float Ot varying float channels segment Init pushif 1 pop Ka pushif 0.5 pop Kd pushif 0.5 pop Ks pushif 0.1 pop roughness pushif 1 setfc pop specularcolor pushis "" pop texturename pushif 1 pop At segment Code pushv Cs pop Ci pushv Os pop Oi S_CLEAR pushis "" pushv texturename ness pushif 1 pushis "channels" pushv texturename textureinfo channels eqff land S_GET RS_PUSH RS_GET RS_JZ 0 S_CLEAR pushif 3 pushv channels lsff S_GET RS_PUSH RS_GET RS_JZ 2 pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ftexture1 setfc pop Ct pushif 0 pushis "width" pushif 1 pushis "fill" pushif 1 pushv texturename pushif 4 ftexture1 pop Ot :2 RS_JNZ 1 RS_INVERSE pushif 0 pushis "width" pushif 0 pushv texturename pushif 2 ctexture1 pop Ct pushif 0 pushis "width" pushif 1 pushis "fill" pushif 3 pushv texturename pushif 4 ftexture1 pop Ot :1 RS_POP pushv Ot pushv At mulff pushv At pushif 1 subff addff pop Ot pushv Ct pushv Ci mulcc pop Ci pushv Ot setfc pushv Oi mulcc pop Oi :0 RS_POP pushv I pushv N normalize faceforward pop Nf pushv I normalize negp pop V pushv roughness pushv V pushv Nf specular pushv Ks setfc pushv specularcolor mulcc mulcc pushv Nf diffuse pushv Kd mulfc ambient pushv Ka mulfc addcc pushv Ci mulcc addcc pop Ci pushv Oi pushv Ci mulcc pop Ci geomview-1.9.4/data/shaders/hmatte.sdl0000644000175000001440000000245510624244366014631 000000000000003dl ############################################################################ # File automatically generated by the 3delight shader compiler. # # DO NOT EDIT THIS FILE !!! # ############################################################################ # Compiled with 3Delight 6.5.0 linux64 (Feb 9 2007) "Ennio" %code 6 40 0 31 10 Ci Oi N I Ng P L Os Cs Cl 2 "Ka" "" 2 1 0 0 "Kd" "" 2 1 0 0 2 0 10 1 0 10 1 0 13 0 10 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 3 1 0 3 1 0 3 1 0 2 1 0 2 1 0 2 1 0 4 5 0 1 5.00000007e-02 1 1.00000000e+00 1 0.00000000e+00 0 3 1 10 28 3 1 11 29 0 0 0 0 0 203 206 24 27 2 213 25 27 24 3 358 4 24 25 359 29 26 27 5 1 358 6 0 30 359 300 12 26 27 0 0 364 12 167 358 58 15 26 25 58 16 25 25 42 17 15 15 37 20 16 17 46 21 7 8 359 358 58 16 6 26 62 18 16 58 17 26 26 37 19 17 29 50 16 18 19 43 25 16 26 36 25 6 25 58 19 25 24 42 17 16 15 37 18 19 17 58 17 25 25 42 16 16 16 37 16 17 16 42 16 16 20 115 16 16 104 16 16 50 16 18 16 64 14 16 30 359 345 13 14 364 13 8 358 360 14 62 16 16 362 359 358 68 14 16 29 359 345 13 14 364 13 8 358 360 14 1 16 29 362 359 267 22 27 358 43 22 10 22 45 23 9 11 45 23 23 16 36 22 22 23 46 22 21 22 36 0 0 22 359 302 12 26 27 0 0 364 12 2 357 -145 11 1 7 %comment-3dl 6 40 0 %comment-user 6 40 0 geomview-1.9.4/data/shaders/hmatte.sdr0000644000175000001440000000611010624242144014617 00000000000000#!version 2.1.1 surface #!parameters: uniform float Ka = 0.05 uniform float Kd = 1 #!variables: varying float Lhw varying float Nhw varying vector Nh varying vector Lh varying vector Px varying float b varying float d varying float nn varying vector temporary_0 uniform vector temporary_1 varying float temporary_2 varying float temporary_3 varying float temporary_4 varying float temporary_5 varying float temporary_6 varying vector temporary_7 varying float temporary_8 varying float temporary_9 varying float temporary_10 varying boolean temporary_11 varying vector temporary_12 varying vector temporary_13 varying vector temporary_14 varying vector temporary_15 varying vector temporary_16 #!Init: return #!Code: normalize ("v=v") temporary_0 N faceforward ("v=vv") Nh temporary_0 I transform ("p=Sp") Px "shader" P vfromf temporary_1 0 vuvector Ci temporary_1 illuminance Px #!Label7 #!Label8 #!Label7: dot Nhw Px Nh dot temporary_4 L Px vufloat temporary_5 0 subff temporary_3 temporary_4 temporary_5 dot temporary_5 Px Px vufloat temporary_6 1 subff temporary_4 temporary_5 temporary_6 divff temporary_2 temporary_3 temporary_4 negf b temporary_2 vfromf temporary_7 b mulvv temporary_0 temporary_7 Px addvv Lh L temporary_0 vufloat temporary_2 0 addff Lhw temporary_2 b dot temporary_3 Lh Nh mulff temporary_4 Lhw Nhw subff temporary_2 temporary_3 temporary_4 dot temporary_8 Lh Lh mulff temporary_9 Lhw Lhw subff temporary_6 temporary_8 temporary_9 dot temporary_9 Nh Nh mulff temporary_10 Nhw Nhw subff temporary_8 temporary_9 temporary_10 mulff temporary_5 temporary_6 temporary_8 abs ("f=f") temporary_4 temporary_5 sqrt ("f=f") temporary_3 temporary_4 divff d temporary_2 temporary_3 vufloat temporary_2 0.0 flt temporary_11 d temporary_2 if temporary_11 #!Label9 negf d d #!Label9: endif vufloat temporary_2 1.0 fgt temporary_11 d temporary_2 if temporary_11 #!Label11 vufloat d 1.0 #!Label11: endif mulvv temporary_7 Os Cs vfromf temporary_1 Ka vuvector temporary_14 temporary_1 ambient ("c=") temporary_15 mulvv temporary_13 temporary_14 temporary_15 vfromf temporary_1 Kd vuvector temporary_16 temporary_1 mulvv temporary_15 Cl temporary_16 vfromf temporary_16 d mulvv temporary_14 temporary_15 temporary_16 addvv temporary_12 temporary_13 temporary_14 mulvv temporary_0 temporary_7 temporary_12 addvv Ci Ci temporary_0 #!Label8: endilluminance movevv Oi Os return geomview-1.9.4/data/shaders/hmatte.slo0000644000175000001440000000430510462665406014642 00000000000000shader_obj 3.1 1 0 hmatte 42 4 4 25 44 0 2 2 0 2 13 3 15 eye rgb shader 3 0.05 1 0 0 42 Ka 4 5 -1 1 3 1 1 1 1 38 38 Kd 4 5 -1 2 3 1 2 2 2 39 39 $C1 4 2 -1 0 3 0 0 0 0 1 1 $C2 4 2 -1 1 3 0 0 0 0 2 35 Lhw 4 3 -1 0 2 0 0 16 16 18 21 Nhw 4 3 -1 0 2 0 0 8 8 8 24 Nh 2 3 0 0 2 0 0 4 4 4 23 Lh 2 3 0 0 2 0 0 15 15 15 20 Px 2 3 0 0 2 0 0 5 5 5 43 b 4 3 -1 0 2 0 0 13 13 13 16 d 4 3 -1 0 2 0 0 29 35 29 40 N 2 10 0 0 2 0 0 0 0 3 3 $T1 2 4 0 0 2 0 0 3 15 3 15 I 2 10 0 0 2 0 0 0 0 4 4 $S6 6 2 -1 2 3 0 0 0 0 5 5 Ps 2 10 0 0 2 0 0 0 0 5 5 $C3 4 2 -1 2 3 0 0 0 0 6 43 Ci 3 10 1 0 2 0 0 6 43 43 43 $?0 10 11 -1 0 2 0 0 7 43 7 43 $T3 4 4 -1 0 2 0 0 7 43 7 43 L 2 10 0 0 2 0 0 0 0 9 15 $T5 4 4 -1 0 2 0 0 9 25 9 25 $T7 4 4 -1 0 2 0 0 11 29 11 29 $T18 4 4 -1 0 2 0 0 21 26 21 26 $T21 4 4 -1 0 2 0 0 24 29 24 29 $?1 10 11 -1 0 2 0 0 32 32 32 32 $T25 11 4 -1 0 2 0 0 31 35 31 35 $X0 9 8 -1 0 2 0 0 0 0 30 31 $X1 9 8 -1 0 2 0 0 0 0 31 32 $X2 9 8 -1 0 3 0 0 0 0 32 32 $?2 10 11 -1 0 2 0 0 35 35 35 35 $X3 9 8 -1 0 2 0 0 0 0 33 34 $X4 9 8 -1 0 2 0 0 0 0 34 35 $X5 9 8 -1 0 3 0 0 0 0 35 35 Os 3 10 -1 0 2 0 0 0 0 36 44 Cs 3 10 1 0 2 0 0 0 0 36 36 $T28 3 4 1 0 2 0 0 36 42 36 42 $T29 3 4 1 0 2 0 0 37 41 37 41 Cl 3 10 1 0 2 0 0 0 0 39 39 $T31 3 4 1 0 2 0 0 39 43 39 43 $X6 9 8 -1 0 2 0 0 0 0 7 43 Oi 3 10 -1 0 2 0 0 44 44 0 0 125 0 2 1 3 12 11 6 12 13 8 14 15 17 16 19 18 16 40 8 5 8 6 21 20 8 21 21 22 8 8 22 22 3 9 21 22 12 9 8 7 20 12 4 9 22 7 6 21 4 5 22 22 21 21 7 7 23 4 4 23 21 23 21 6 6 24 5 5 24 21 24 24 23 24 24 24 24 24 10 22 24 26 27 28 29 25 26 10 16 10 10 26 31 32 33 30 26 10 3 10 3 36 34 35 37 37 0 37 39 38 1 39 39 10 39 37 39 39 36 39 17 17 39 41 34 _assign 2 0 _assign 2 2 normalize 2 4 faceforward 3 6 transform 3 9 _assign 2 12 _illuminance 5 14 _dot 3 19 _dot 3 22 _negate 2 25 _dot 3 27 _subtract 3 30 _divide 3 33 _scale 3 36 _add 3 39 _assign 2 42 _dot 3 44 _multiply 3 47 _subtract 3 50 _dot 3 53 _multiply 3 56 _subtract 3 59 _dot 3 62 _multiply 3 65 _subtract 3 68 _multiply 3 71 abs 2 74 sqrt 2 76 _divide 3 78 _if 5 81 _lt 3 86 _negate 2 89 _if 5 91 _gt 3 96 _assign 2 99 _multiply 3 101 ambient 1 104 _scale 3 105 _scale 3 108 _scale 3 111 _add 3 114 _multiply 3 117 _add 3 120 _assign 2 123 geomview-1.9.4/data/shaders/hmatte.slx0000644000175000001440000000253410624242144014643 00000000000000surface AQSIS_V 1.2.0 segment Data USES 461155 param uniform float Ka param uniform float Kd varying float Lhw varying float Nhw varying point Nh varying point Lh varying point Px varying float b varying float d segment Init pushif 0.05 pop Ka pushif 1 pop Kd segment Code pushv I pushv N normalize faceforward pop Nh pushv P pushis "shader" transform pop Px pushif 0 setfc pop Ci pushv Px init_illuminance jz 1 :0 S_CLEAR pushv Px pushis "" illuminance S_JZ 2 RS_PUSH RS_GET pushv Nh pushv Px dotpp pop Nhw pushif 1 pushv Px pushv Px dotpp subff pushif 0 pushv Px pushv L dotpp subff negf divff pop b pushv Px pushv b mulfp pushv L addpp pop Lh pushv b pushif 0 addff pop Lhw pushv Nhw pushv Nhw mulff pushv Nh pushv Nh dotpp subff pushv Lhw pushv Lhw mulff pushv Lh pushv Lh dotpp subff mulff abs sqrt pushv Nhw pushv Lhw mulff pushv Nh pushv Lh dotpp subff divff pop d S_CLEAR pushif 0 pushv d lsff S_GET RS_PUSH RS_GET RS_JZ 3 pushv d negf pop d :3 RS_POP S_CLEAR pushif 1 pushv d gtff S_GET RS_PUSH RS_GET RS_JZ 4 pushif 1 pop d :4 RS_POP pushv d setfc pushv Kd setfc pushv Cl mulcc mulcc ambient pushv Ka mulfc addcc pushv Cs pushv Os mulcc mulcc pushv Ci addcc pop Ci RS_POP :2 advance_illuminance jnz 0 :1 pushv Os pop Oi geomview-1.9.4/data/Makefile.am0000644000175000001440000000762410622716737013255 00000000000000SUBDIRS = shaders # Current automake (version 1.4) will not create directory "b" if # "a/b/foo" is listed in a _DATA variable. # # # We can hack our way around this by taking advantage of the fact that # automake will install the various *_DATA files in order of the # variable name. groups = \ groups/101a.dgp \ groups/101b.dgp \ groups/120.dgp \ groups/230data \ groups/230data.Conway \ groups/230data.lat \ groups/230data.names \ groups/3torus.dgp \ groups/3torus2.dgp \ groups/94a.dgp \ groups/94b.dgp \ groups/borrom.dgp \ groups/borrom2.dgp \ groups/borrom3.dgp \ groups/borrom4.dgp \ groups/borrom4.wa \ groups/fig8.dgp \ groups/g233.prj \ groups/g234.prj \ groups/g235.prj \ groups/g236.prj \ groups/g237.prj \ groups/good_klein_quick.dgp \ groups/hook.off \ groups/klein.wa \ groups/klein_bricks.dgp \ groups/klein_whole.dgp \ groups/notknot.dgp \ groups/sample.proj.dgp \ groups/sample.uhs.dgp \ groups/spaceshipSpace.geom \ groups/tetra2.dgp \ groups/wholecube.geom nobase_dist_geomdata_DATA = \ .geomview \ cmap.fmap \ geom/abstr.off \ geom/alphabet.vect \ geom/antoine0.oogl \ geom/antoine1.oogl \ geom/antoine2.oogl \ geom/antoine3.oogl \ geom/axes.list \ geom/br2.grp \ geom/br2.off \ geom/br4.2 \ geom/br4fd.grp \ geom/br4fd.list \ geom/cam.off \ geom/camera-frustum \ geom/catenoid \ geom/cone.off \ geom/csquare.quad \ geom/cube \ geom/cube.off \ geom/diamond \ geom/dodec \ geom/dodec.off \ geom/dodec.quad \ geom/dodec2.off \ geom/facecube.off \ geom/hdodec.off \ geom/helicoid \ geom/hypercube.off \ geom/ico.grp \ geom/icosa.off \ geom/icosa.quad \ geom/jungle.list \ geom/klein8 \ geom/link2.grp \ geom/link8.grp \ geom/moebius.4d.mesh \ geom/moebius.skel \ geom/mushroom.off \ geom/nsquare.quad \ geom/octa.off \ geom/octant.bez \ geom/office.oogl \ geom/pieces/cube1.off \ geom/pieces/linkA.bez \ geom/pieces/linkB.bez \ geom/polyhedra/cube \ geom/polyhedra/cuboctahedron \ geom/polyhedra/dodecahedron \ geom/polyhedra/icosahedron \ geom/polyhedra/icosidodecahedron \ geom/polyhedra/octahedron \ geom/polyhedra/rhombicosidodecahedron \ geom/polyhedra/rhombicuboctahedron \ geom/polyhedra/rhombitruncated_cubeoctahedron \ geom/polyhedra/rhombitruncated_icosidodecahedron \ geom/polyhedra/snub_cube \ geom/polyhedra/snub_dodecahedron \ geom/polyhedra/tetrahedron \ geom/polyhedra/truncated_cube \ geom/polyhedra/truncated_dodecahedron \ geom/polyhedra/truncated_icosahedron \ geom/polyhedra/truncated_octahedron \ geom/polyhedra/truncated_tetrahedron \ geom/ref.inst \ geom/ref.list \ geom/ref1.grp \ geom/ref2.list \ geom/sample.mesh \ geom/sph12.mesh \ geom/sphere.mesh \ geom/spherical/dodecaplex.off \ geom/spherical/flattorus.mesh \ geom/spherical/hypercube.off \ geom/spherical/octaplex.off \ geom/spherical/orthoplex.off \ geom/spherical/ruledtorus.mesh \ geom/spherical/simplex.off \ geom/spherical/tetraplex.off \ geom/spherical/twosided.flattorus \ geom/square.quad \ geom/teapot.bez \ geom/tent.mesh \ geom/tetra \ geom/tetra.off \ geom/textured/Antenna.geom \ geom/textured/GCGball \ geom/textured/dodec.off \ geom/textured/lunar-t.oogl \ geom/textured/rabbitball \ geom/textured/square.off \ geom/textured/themi.bez \ geom/textured/sphere.gcl \ geom/textured/Earth.pam.bz2 \ geom/textured/NASA.pgm.gz \ geom/textured/geologo.pgm.gz \ geom/textured/grid.pgm.gz \ geom/textured/rabbits.ppm.gz \ geom/textured/white.pgm.gz \ geom/torus.bez \ geom/torus3.oogl \ geom/torus8.oogl \ geom/trapezoid.4d.off \ geom/tref.mesh \ geom/tref.off \ geom/tri.4d.vect \ geom/tri.vect \ geom/triangle \ geom/twosidedsquare.quad \ geom/unit.sphere \ geom/unitcube.off \ geom/vertcube.off \ geom/warp.inst \ geom/wraptent.mesh \ geom/xwyezed.vect \ geom/xyz.grp \ geom/xyz.vect \ geom/ztent.mesh nobase_dist_geomdata_DATA += $(groups) geomview-1.9.4/data/Makefile.in0000644000175000001440000005142710665240474013263 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = data DIST_COMMON = $(nobase_dist_geomdata_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(geomdatadir)" nobase_dist_geomdataDATA_INSTALL = $(install_sh_DATA) DATA = $(nobase_dist_geomdata_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = shaders # Current automake (version 1.4) will not create directory "b" if # "a/b/foo" is listed in a _DATA variable. # # # We can hack our way around this by taking advantage of the fact that # automake will install the various *_DATA files in order of the # variable name. groups = \ groups/101a.dgp \ groups/101b.dgp \ groups/120.dgp \ groups/230data \ groups/230data.Conway \ groups/230data.lat \ groups/230data.names \ groups/3torus.dgp \ groups/3torus2.dgp \ groups/94a.dgp \ groups/94b.dgp \ groups/borrom.dgp \ groups/borrom2.dgp \ groups/borrom3.dgp \ groups/borrom4.dgp \ groups/borrom4.wa \ groups/fig8.dgp \ groups/g233.prj \ groups/g234.prj \ groups/g235.prj \ groups/g236.prj \ groups/g237.prj \ groups/good_klein_quick.dgp \ groups/hook.off \ groups/klein.wa \ groups/klein_bricks.dgp \ groups/klein_whole.dgp \ groups/notknot.dgp \ groups/sample.proj.dgp \ groups/sample.uhs.dgp \ groups/spaceshipSpace.geom \ groups/tetra2.dgp \ groups/wholecube.geom nobase_dist_geomdata_DATA = .geomview cmap.fmap geom/abstr.off \ geom/alphabet.vect geom/antoine0.oogl geom/antoine1.oogl \ geom/antoine2.oogl geom/antoine3.oogl geom/axes.list \ geom/br2.grp geom/br2.off geom/br4.2 geom/br4fd.grp \ geom/br4fd.list geom/cam.off geom/camera-frustum geom/catenoid \ geom/cone.off geom/csquare.quad geom/cube geom/cube.off \ geom/diamond geom/dodec geom/dodec.off geom/dodec.quad \ geom/dodec2.off geom/facecube.off geom/hdodec.off \ geom/helicoid geom/hypercube.off geom/ico.grp geom/icosa.off \ geom/icosa.quad geom/jungle.list geom/klein8 geom/link2.grp \ geom/link8.grp geom/moebius.4d.mesh geom/moebius.skel \ geom/mushroom.off geom/nsquare.quad geom/octa.off \ geom/octant.bez geom/office.oogl geom/pieces/cube1.off \ geom/pieces/linkA.bez geom/pieces/linkB.bez \ geom/polyhedra/cube geom/polyhedra/cuboctahedron \ geom/polyhedra/dodecahedron geom/polyhedra/icosahedron \ geom/polyhedra/icosidodecahedron geom/polyhedra/octahedron \ geom/polyhedra/rhombicosidodecahedron \ geom/polyhedra/rhombicuboctahedron \ geom/polyhedra/rhombitruncated_cubeoctahedron \ geom/polyhedra/rhombitruncated_icosidodecahedron \ geom/polyhedra/snub_cube geom/polyhedra/snub_dodecahedron \ geom/polyhedra/tetrahedron geom/polyhedra/truncated_cube \ geom/polyhedra/truncated_dodecahedron \ geom/polyhedra/truncated_icosahedron \ geom/polyhedra/truncated_octahedron \ geom/polyhedra/truncated_tetrahedron geom/ref.inst \ geom/ref.list geom/ref1.grp geom/ref2.list geom/sample.mesh \ geom/sph12.mesh geom/sphere.mesh geom/spherical/dodecaplex.off \ geom/spherical/flattorus.mesh geom/spherical/hypercube.off \ geom/spherical/octaplex.off geom/spherical/orthoplex.off \ geom/spherical/ruledtorus.mesh geom/spherical/simplex.off \ geom/spherical/tetraplex.off geom/spherical/twosided.flattorus \ geom/square.quad geom/teapot.bez geom/tent.mesh geom/tetra \ geom/tetra.off geom/textured/Antenna.geom \ geom/textured/GCGball geom/textured/dodec.off \ geom/textured/lunar-t.oogl geom/textured/rabbitball \ geom/textured/square.off geom/textured/themi.bez \ geom/textured/sphere.gcl geom/textured/Earth.pam.bz2 \ geom/textured/NASA.pgm.gz geom/textured/geologo.pgm.gz \ geom/textured/grid.pgm.gz geom/textured/rabbits.ppm.gz \ geom/textured/white.pgm.gz geom/torus.bez geom/torus3.oogl \ geom/torus8.oogl geom/trapezoid.4d.off geom/tref.mesh \ geom/tref.off geom/tri.4d.vect geom/tri.vect geom/triangle \ geom/twosidedsquare.quad geom/unit.sphere geom/unitcube.off \ geom/vertcube.off geom/warp.inst geom/wraptent.mesh \ geom/xwyezed.vect geom/xyz.grp geom/xyz.vect geom/ztent.mesh \ $(groups) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu data/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-nobase_dist_geomdataDATA: $(nobase_dist_geomdata_DATA) @$(NORMAL_INSTALL) test -z "$(geomdatadir)" || $(MKDIR_P) "$(DESTDIR)$(geomdatadir)" @$(am__vpath_adj_setup) \ list='$(nobase_dist_geomdata_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__vpath_adj) \ echo " $(nobase_dist_geomdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(geomdatadir)/$$f'"; \ $(nobase_dist_geomdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(geomdatadir)/$$f"; \ done uninstall-nobase_dist_geomdataDATA: @$(NORMAL_UNINSTALL) @$(am__vpath_adj_setup) \ list='$(nobase_dist_geomdata_DATA)'; for p in $$list; do \ $(am__vpath_adj) \ echo " rm -f '$(DESTDIR)$(geomdatadir)/$$f'"; \ rm -f "$(DESTDIR)$(geomdatadir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(geomdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-nobase_dist_geomdataDATA install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-nobase_dist_geomdataDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-nobase_dist_geomdataDATA \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-nobase_dist_geomdataDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/data/groups/0000777000175000001440000000000010665240703012603 500000000000000geomview-1.9.4/data/groups/230data0000644000175000001440000001176410462200144013577 000000000000001. tr xyz 2. tr XYZ 3. m xyZ 4. m i,xyZ 5. m' xyZ 6. m' i,xyZ 7. m XYz 8. m k,XYz 9. m' XYz 10. m XYz xyZ 11. m k,XYz xyZ 12. m' XYz xyZ 13. m XYz i,xyZ 14. m k,XYz i,xyZ 15. m' XYz i,xyZ 16. o XYz xYz 17. o k,XYz xYz 18. o XYz k,xYz 19. o XYz i,xYz 20. o k,XYz i,xYz 21. o XYz i+k,xYz 22. o k,XYz i+k,xYz 23. o i+j,XYz j,xYz 24. o i+j+k,XYz j,xYz 25. o i+j,XYz j+k,xYz 26. o' XYz xYz 27. o' k,XYz xYz 28. o' XYz k,xYz 29. o' XyZ Xyz 30. o' XyZ j,Xyz 31. o' XyZ i,Xyz 32. o' XyZ i+j,Xyz 33. o'' XYz xYz 34. o'' XYz .5i+.5j+.5k,xYz 35. o''' XYz xYz 36. o''' XYz k,xYz 37. o''' XYz i,xYz 38. o xYZ XyZ 39. o xYZ k,XyZ 40. o i+j,xYZ XYz 41. o i+j,xYZ i+k,XYz 42. o' xYZ k,XyZ 43. o' xYZ XyZ 44. o'' xYZ XyZ 45. o''' xYZ XyZ 46. o''' k,xYZ i,XyZ 47. o xYZ XyZ XYZ 48. o xYZ XyZ i+j+k,XYZ 49. o xYZ XyZ k,XYZ 50. o xYZ XyZ i+j,XYZ 51. o xYZ k,XyZ XYZ 52. o xYZ k,XyZ i+j,XYZ 53. o xYZ k,XyZ i,XYZ 54. o xYZ k,XyZ j,XYZ 55. o i+j,xYZ XYz XYZ 56. o i+j,xYZ XYz i+j+k,XYZ 57. o i+j,xYZ XYz j,XYZ 58. o i+j,xYZ XYz k,XYZ 59. o i+j,xYZ XYz i+j,XYZ 60. o i+j,xYZ XYz j+k,XYZ 61. o i+j,xYZ j+k,XyZ XYZ 62. o i+j,xYZ j+k,XyZ i+j,XYZ 63. o' xYZ k,XyZ XYZ 64. o' xYZ k,XyZ i,XYZ 65. o' xYZ XyZ XYZ 66. o' xYZ XyZ i+j+k,XYZ 67. o' xYZ XyZ i,XYZ 68. o' xYZ XyZ j+k,XYZ 69. o'' xYZ XyZ XYZ 70. o'' xYZ XyZ .5i+.5j+.5k,XYZ 71. o''' xYZ XyZ XYZ 72. o''' xYZ XyZ k,XYZ 73. o''' k,xYZ i,XyZ XYZ 74. o''' k,xYZ i,XyZ i+j,XYZ 75. t YxZ 76. t' YxZ 77. t xYZ XyZ yxz 78. t xYZ XyZ k,yxz 79. t XYz YxZ i+j,XyZ 80. t XYz YxZ i+j+k,XyZ 81. t xYZ XyZ yxz i+j,xyz 82. t xYZ XyZ k,yxz i+j,xyz 83. t yXZ i,XyZ i+j,xyz 84. t yXZ i+k,XyZ i+j,xyz 85. t' xYZ XyZ yxz 86. t' xYZ XyZ k,yxz 87. t' xYZ XyZ yxz i+j+k,xyz 88. t' yXZ i+.5k,XyZ i+j+k,xyz 89. t Yxz 90. t .5k,Yxz 91. t k,Yxz 92. t k+.5k,Yxz 93. t' Yxz 94. t' .5k,Yxz 95. t Yxz XYZ 96. t k,Yxz XYZ 97. t Yxz i+j,XYZ 98. t k,Yxz i+j,XYZ 99. t' Yxz XYZ 100. t' .5i+.5j+k+.5k,yXz j,xyZ i+j+k,xyz XYZ 101. t Yxz yxz 102. t Yxz i+j,yxz 103. t k,Yxz yxz 104. t i+j+k,yXz yxz 105. t Yxz k,yxz 106. t Yxz i+j+k,yxz 107. t k,Yxz k,yxz 108. t k,Yxz i+j+k,yxz 109. t' Yxz yxz 110. t' Yxz k,yxz 111. t' j+.5k,yXz Xyz 112. t' j+.5k,yXz k,Xyz 113. t yXz XyZ 114. t i+j,yXz i+j,XyZ 115. t k+.5k,yXz XyZ 116. t i+j+k+.5k,yXz i+j+.5k,XyZ 117. t k,yXz XyZ 118. t i+j+k,yXz i+j+k,XyZ 119. t .5k,yXz XyZ 120. t i+j+.5k,yXz xyZ 121. t' Yxz yxZ 122. t' j+.5k,yXz i+k+.5k,XyZ 123. t Yxz yxZ XYZ 124. t Yxz yxZ k,XYZ 125. t Yxz yxZ i+j,XYZ 126. t Yxz yxZ i+j+k,XYZ 127. t Yxz i+j,yxZ XYZ 128. t yXz xyZ i+j+k,Xyz 129. t i+j,yXz i+j,xyZ Xyz 130. t i+j,yXz i+j,xyZ k,Xyz 131. t k,yXz xyZ Xyz 132. t k,yXz k,xyZ k,Xyz 133. t k,yXz i+j,xyZ i+j,Xyz 134. t k,yXz i+j+k,xyZ i+j+k,Xyz 135. t k,yXz xyZ i+j,Xyz 136. t i+j+k,yXz xyZ i+j+k,Xyz 137. t i+j+k,yXz i+j+k,xyZ Xyz 138. t i+j+k,yXz i+j,xyZ k,Xyz 139. t' Yxz yxZ XYZ 140. t' Yxz yxZ k,XYZ 141. t' j+.5k,yXz i+k+.5k,xyZ Xyz 142. t' j+.5k,yXz i+.5k,xyZ k,Xyz 143. c xYZ XyZ zxy 144. c' xYZ XyZ zxy 145. c'' xYZ XyZ zxy 146. c i+j,xYZ j+k,XyZ zxy 147. c'' k,xYZ i,XyZ zxy 148. c xYZ XyZ zxy XYZ 149. c xYZ XyZ zxy i+j+k,XYZ 150. c' xYZ XyZ zxy XYZ 151. c' xYZ XyZ zxy .5i+.5j+.5k,XYZ 152. c'' xYZ XyZ zxy XYZ 153. c i+j,xYZ j+k,XyZ zxy XYZ 154. c'' k,xYZ i,XyZ zxy XYZ 155. c xYZ XyZ zxy yxz 156. c' xYZ XyZ zxy yxz 157. c'' xYZ XyZ zxy yxz 158. c xYZ XyZ zxy i+j+k,yxz 159. c' xYZ XyZ zxy i+j+k,yxz 160. c'' k,xYZ i,XyZ zxy .5i+.5j+.5k,yxz 161. c xYZ XyZ zxy YXZ 162. c xYZ XyZ zxy i+j+k,YXZ 163. c' xYZ XyZ zxy YXZ 164. c' xYZ XyZ zxy .5i+.5j+.5k,YXZ 165. c'' xYZ XyZ zxy YXZ 166. c i+j,xYZ j+k,XyZ zxy .5i+.5j+.5k,YXZ 167. c i+j,xYZ j+k,XyZ zxy i+.5i+j+.5j+k+.5k,YXZ 168. c'' k,xYZ i,XyZ zxy .5i+.5j+.5k,YXZ 169. c xYZ XyZ zxy YXZ XYZ 170. c xYZ XyZ zxy YXZ i+j+k,XYZ 171. c xYZ XyZ zxy i+j+k,YXZ XYZ 172. c xYZ XyZ zxy i+j+k,YXZ i+j+k,XYZ 173. c' xYZ XyZ zxy YXZ XYZ 174. c' xYZ XyZ zxy YXZ i+j+k,XYZ 175. c' xYZ XyZ zxy .5i+.5j+.5k,YXZ .5i+.5j+.5k,XYZ 176. c' xYZ XyZ zxy .5i+.5j+.5k,YXZ i+.5i+j+.5j+k+.5k,XYZ 177. c'' xYZ XyZ zxy YXZ XYZ 178. c'' k,xYZ i,XyZ zxy .5i+.5j+.5k,YXZ XYZ 179. h y-xXz 180. h .6k,y-xXz 181. h .6k+.6k,y-xXz 182. rh zxy 183. h y-xXz XYZ 184. rh zxy XYZ 185. h y-xXz YXz 186. h y-xXz yxz 187. h y-xXz k,xx-yz 188. h y-xXz k,yxz 189. rh zxy xzy 190. rh zxy i+j+k,xzy 191. h y-xXz YXZ 192. h y-xXz yxZ 193. h .6k,y-xXz .6k+.6k,YXZ 194. h .6k,y-xXz .6k+.6k,yxZ 195. h .6k+.6k,y-xXz .6k,YXZ 196. h .6k+.6k,y-xXz .6k,yxZ 197. rh zxy YXZ 198. h y-xXz YXZ XYZ 199. h y-xXz YXZ k,XYZ 200. h y-xXz yxZ XYZ 201. h y-xXz yxZ k,XYZ 202. rh zxy YXZ XYZ 203. rh zxy YXZ i+j+k,XYZ 204. h y-xXz xyZ 205. h y-xXz YXZ xyZ 206. h y-xXz YXZ k,xyZ 207. h y-xXz yxZ xyZ 208. h y-xXz yxZ k,xyZ 209. h yy-xz 210. h .3k,yy-xz 211. h .6k+.6k+.3k,yy-xz 212. h .6k,yy-xz 213. h .6k+.6k,yy-xz 214. h k,yy-xz 215. h yy-xz yxz 216. h yy-xz k,yxz 217. h k,yy-xz yxz 218. h k,yy-xz k,yxz 219. h yy-xz xyZ 220. h k,yy-xz xyZ 221. h yy-xz Xy-xZ 222. h .3k,yy-xz Xy-xZ 223. h .6k+.6k+.3k,yy-xz Xy-xZ 224. h .6k,yy-xz Xy-xZ 225. h .6k+.6k,yy-xz Xy-xZ 226. h k,yy-xz Xy-xZ 227. h yy-xz Xy-xZ xyZ 228. h yy-xz Xy-xZ k,xyZ 229. h k,yy-xz Xy-xZ xyZ 230. h k,yy-xz Xy-xZ k,xyZ geomview-1.9.4/data/groups/230data.lat0000644000175000001440000000030710462200144014345 000000000000001. 2i 2j 2k 2. 2i 2j 2k 3. 2i j+k j-k 4. 2i 2j 2k 5. i+j i-j 2k 6. j+k k+i i+j 7. 2i 2j 2k i+j+k 8. 2i 2j 2k 9. j+k k+i i+j 10. 2i 2j 2k 11. j+k k+i i+j 12. 2i 2j 2k i+j+k 13. 2i 2j 2k 14. 2i 2j 2k geomview-1.9.4/data/groups/notknot.dgp0000644000175000001440000000667710462200150014712 00000000000000DISCGRP (group borrom4 ) (comment " This is a test of the new discrete group library. " ) (attribute Hyperbolic ) # following command is dangerous unless the viewer is in hyperbolic mode (display centercam ) (display zcull ) (display drawgeom ) (enumdepth 2 ) (enumdist 10.0 ) (dimn 3 ) (ngens 12 ) (geom { < dodec.vect }) (wafile borrom4.wa) (gens a -1.618033988749887 1.618033988749892 0 -2.058171027271484 -1.618033988749893 0 0 -1.272019649514066 0 0 1. 0 2.058171027271483 -1.272019649514065 0 2.618033988749887 d -1.618033988749887 1.618033988749892 0 2.058171027271484 -1.618033988749893 0 0 1.272019649514066 0 0 1. 0 -2.058171027271483 1.272019649514065 0 2.618033988749887 b 1. 0 0 0 0 -1.618033988749886 1.618033988749892 -2.058171027271483 0 -1.618033988749892 0 -1.272019649514065 0 2.058171027271483 -1.272019649514066 2.618033988749886 e 1. 0 0 0 0 -1.618033988749886 1.618033988749892 2.058171027271483 0 -1.618033988749892 0 1.272019649514065 0 -2.058171027271483 1.272019649514066 2.618033988749886 c 0 0 -1.618033988749892 -1.272019649514065 0 1. 0 0 1.618033988749892 0 -1.618033988749886 -2.058171027271483 -1.272019649514066 0 2.058171027271483 2.618033988749886 f 0 0 -1.618033988749892 1.272019649514065 0 1. 0 0 1.618033988749892 0 -1.618033988749886 2.058171027271483 1.272019649514066 0 -2.058171027271483 2.618033988749886 A -1.618033988749886 -1.618033988749892 0 -2.058171027271484 1.618033988749892 0 0 1.272019649514066 0 0 1. 0 2.058171027271483 1.272019649514065 0 2.618033988749886 D -1.618033988749886 -1.618033988749892 0 2.058171027271484 1.618033988749892 0 0 -1.272019649514066 0 0 1. 0 -2.058171027271483 -1.272019649514065 0 2.618033988749886 B 1. 0 0 0 0 -1.618033988749885 -1.618033988749892 -2.058171027271483 0 1.618033988749891 0 1.272019649514065 0 2.058171027271482 1.272019649514065 2.618033988749886 E 1. 0 0 0 0 -1.618033988749885 -1.618033988749892 2.058171027271483 0 1.618033988749891 0 -1.272019649514065 0 -2.058171027271482 -1.272019649514065 2.618033988749886 C 0 0 1.618033988749891 1.272019649514064 0 1. 0 0 -1.618033988749892 0 -1.618033988749885 -2.058171027271483 1.272019649514065 0 2.058171027271482 2.618033988749885 F 0 0 1.618033988749891 -1.272019649514064 0 1. 0 0 -1.618033988749892 0 -1.618033988749885 2.058171027271483 -1.272019649514065 0 -2.058171027271482 2.618033988749885 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) (camgeom { = OFF 5 2 5 0 0 0 -0.1 0 0.5 0.1 0 0.5 0 -0.1 0.5 0 0.1 0.5 3 0 1 2 200 200 0 1 3 0 3 4 0 200 200 1 } ) geomview-1.9.4/data/groups/klein_bricks.dgp0000644000175000001440000000360110462200150015635 00000000000000{ appearance { +edge -face } DISCGRP (group " 3trans " ) (comment " klein bottle for shape of space flythroughs " ) (attribute euclidean ) (display zcull ) (display drawgeom ) #(display drawdirdom) (display centercam) (dimn 3 ) (wafile klein.wa) (ngens 6 ) (gens a 1 0 0 0 0 -1 0 0 0 0 1 0 1 0 0 1 b 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 c 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 A 1 0 0 0 0 -1 0 0 0 0 1 0 -1 0 0 1 B 1 0 0 0 0 1 0 0 0 0 1 0 0 -1 0 1 C 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -1 1 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) (enumdepth 8) (enumdist 10 ) (scale 0.2 ) (geom { appearance { +face } OFF 6 3 1 .15 0 0 0 .15 0 0 0 .15 -.05 0 0 0 -.05 0 0 0 -.05 4 0 1 3 4 .1 .1 1 1 4 0 2 3 5 .1 1 .1 1 4 1 2 4 5 1 .1 .1 1 }) (camgeom { = OFF 5 2 5 0 0 0 -0.1 0 0.5 0.1 0 0.5 0 -0.1 0.5 0 0.1 0.5 3 0 1 2 0.784314 0.784314 0 0.00313725 3 0 3 4 0 0.784314 0.784314 0.00313725 } ) } geomview-1.9.4/data/groups/94a.dgp0000644000175000001440000001035510462200145013603 00000000000000DISCGRP (group 94a ) (comment " Smallest volume hyperbolic manifold? " ) (attribute Hyperbolic ) (dimn 3 ) (ngens 18 ) (gens a 0.69515771 0.9325555 -0.44641247 0.74309361 0.9325555 -0.032798689 0.59483933 0.47388759 0.44641247 -0.59483933 -0.67271382 0.075245082 0.74309361 0.47388759 -0.075245082 1.3350728 b 0.69515771 0.9325555 0.44641247 -0.74309361 0.9325555 -0.032798689 -0.59483933 -0.47388759 -0.44641247 0.59483933 -0.67271382 0.075245082 -0.74309361 -0.47388759 -0.075245082 1.3350728 c -0.68359327 -0.69526094 -0.41063213 -0.34540731 0.61666775 -0.01459119 -0.8171525 0.2196137 0.39042497 -1.2022747 0.57508993 -0.9636516 -0.00323719 0.96388018 -0.40876076 1.4478124 d -0.68359327 -0.69526094 0.41063213 0.34540731 0.61666775 -0.01459119 0.8171525 -0.2196137 -0.39042497 1.2022747 0.57508993 -0.9636516 0.00323719 -0.96388018 -0.40876076 1.4478124 e -0.68359327 0.61666775 -0.39042497 -0.00323719 -0.69526094 -0.01459119 1.2022747 0.96388018 0.41063213 0.8171525 0.57508993 0.40876076 -0.34540731 0.2196137 0.9636516 1.4478124 f -0.68359327 0.61666775 0.39042497 0.00323719 -0.69526094 -0.01459119 -1.2022747 -0.96388018 -0.41063213 -0.8171525 0.57508993 0.40876076 0.34540731 -0.2196137 0.9636516 1.4478124 g -0.076824293 -0.42700848 -0.93487066 0.24944204 0.75604057 -0.90628034 0.5796203 -0.85375696 -1.607969 -0.20775621 -0.11486502 1.2813746 -1.4707357 0.21643215 -0.47237352 1.8528473 h -0.076824293 -0.42700848 0.93487066 -0.24944204 0.75604057 -0.90628034 -0.5796203 0.85375696 1.607969 0.20775621 -0.11486502 1.2813746 1.4707357 -0.21643215 -0.47237352 1.8528473 i -0.076824293 0.75604057 1.607969 -1.4707357 -0.42700848 -0.90628034 0.20775621 0.21643215 0.93487066 -0.5796203 -0.11486502 0.47237352 0.24944204 -0.85375696 -1.2813746 1.8528473 j -0.076824293 0.75604057 -1.607969 1.4707357 -0.42700848 -0.90628034 -0.20775621 -0.21643215 -0.93487066 0.5796203 -0.11486502 0.47237352 -0.24944204 0.85375696 -1.2813746 1.8528473 k 0.27656791 -0.88842064 0.40909496 -0.18204314 -1.7498865 -0.38950139 1.1830077 -1.900874 -0.48701927 -0.50451517 -0.72039133 -0.10337843 1.5413568 0.44219697 -1.0420315 2.1580429 l 0.27656791 -0.88842064 -0.40909496 0.18204314 -1.7498865 -0.38950139 -1.1830077 1.900874 0.48701927 0.50451517 -0.72039133 -0.10337843 -1.5413568 -0.44219697 -1.0420315 2.1580429 m 0.27656791 -1.7498865 -0.48701927 -1.5413568 -0.88842064 -0.38950139 -0.50451517 -0.44219697 0.40909496 1.1830077 -0.72039133 1.0420315 0.18204314 1.900874 0.10337843 2.1580429 n 0.27656791 -1.7498865 0.48701927 1.5413568 -0.88842064 -0.38950139 0.50451517 0.44219697 -0.40909496 -1.1830077 -0.72039133 1.0420315 -0.18204314 -1.900874 0.10337843 2.1580429 o 0.81944591 -0.41962752 1.7334049 -1.6888669 0.66800648 0.19330809 -1.1760963 0.9310227 0.18612789 0.89538449 0.79072976 -0.67941928 -0.39034319 0.12316083 -2.0032845 2.2761118 p 0.81944591 -0.41962752 -1.7334049 1.6888669 0.66800648 0.19330809 1.1760963 -0.9310227 -0.18612789 -0.89538449 0.79072976 -0.67941928 0.39034319 -0.12316083 -2.0032845 2.2761118 r 0.81944591 0.66800648 -0.18612789 -0.39034319 -0.41962752 0.19330809 -0.89538449 0.12316083 -1.7334049 1.1760963 0.79072976 2.0032845 -1.6888669 0.9310227 0.67941928 2.2761118 s 0.81944591 0.66800648 0.18612789 0.39034319 -0.41962752 0.19330809 0.89538449 -0.12316083 1.7334049 -1.1760963 0.79072976 2.0032845 1.6888669 -0.9310227 0.67941928 2.2761118 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.4/data/groups/94b.dgp0000644000175000001440000001036110462200145013601 00000000000000DISCGRP (group 94b ) (comment " Smallest volume hyperbolic manifold? " ) (attribute Hyperbolic ) (dimn 3 ) (ngens 18 ) (gens a -0.048432771 0.53946757 -1.2293712 -0.89706439 -0.64358145 -0.93467182 0.0067009302 0.53651971 -0.79742205 0.52994418 0.29093555 0.036963571 -0.22896452 -0.66744101 0.77203745 1.4470468 b -0.048432771 0.53946757 1.2293712 0.89706439 -0.64358145 -0.93467182 -0.0067009302 -0.53651971 0.79742205 -0.52994418 0.29093555 0.036963571 0.22896452 0.66744101 0.77203745 1.4470468 c -0.048432771 -0.64358145 0.79742205 -0.22896452 0.53946757 -0.93467182 -0.52994418 -0.66744101 1.2293712 -0.0067009302 0.29093555 -0.77203745 -0.89706439 0.53651971 -0.036963571 1.4470468 d -0.048432771 -0.64358145 -0.79742205 0.22896452 0.53946757 -0.93467182 0.52994418 0.66744101 -1.2293712 0.0067009302 0.29093555 -0.77203745 0.89706439 -0.53651971 -0.036963571 1.4470468 e 1.0941947 0.64803386 -0.01528549 -0.7857756 0.64803386 -0.43183565 0.82143694 -0.53027219 0.01528549 -0.82143694 -0.85671443 0.63949347 -0.7857756 -0.53027219 -0.63949347 1.5190735 f 1.0941947 0.64803386 0.01528549 0.7857756 0.64803386 -0.43183565 -0.82143694 0.53027219 -0.01528549 0.82143694 -0.85671443 0.63949347 0.7857756 0.53027219 -0.63949347 1.5190735 g -0.66216111 0.78015375 -0.0088203801 -0.21719833 -0.53177488 -0.036023311 1.656855 -1.4245176 0.72973353 0.62916303 0.26876017 -0.024273572 0.50373894 -0.076050997 -1.3481388 1.7541423 h -0.66216111 0.78015375 0.0088203801 0.21719833 -0.53177488 -0.036023311 -1.656855 1.4245176 -0.72973353 -0.62916303 0.26876017 -0.024273572 -0.50373894 0.076050997 -1.3481388 1.7541423 i -0.66216111 -0.53177488 -0.72973353 0.50373894 0.78015375 -0.036023311 -0.62916303 -0.076050997 0.0088203801 -1.656855 0.26876017 1.3481388 -0.21719833 -1.4245176 0.024273572 1.7541423 j -0.66216111 -0.53177488 0.72973353 -0.50373894 0.78015375 -0.036023311 0.62916303 0.076050997 -0.0088203801 1.656855 0.26876017 1.3481388 0.21719833 1.4245176 0.024273572 1.7541423 k 0.84087801 0.50452042 0.54290265 -0.50632006 -0.58311361 0.17187595 0.79599869 -0.056362201 0.98707831 -1.2011001 1.0970596 -1.6187973 -1.0106537 0.85248089 -1.0639064 1.9697821 l 0.84087801 0.50452042 -0.54290265 0.50632006 -0.58311361 0.17187595 -0.79599869 0.056362201 -0.98707831 1.2011001 1.0970596 -1.6187973 1.0106537 -0.85248089 -1.0639064 1.9697821 m 0.84087801 -0.58311361 -0.98707831 -1.0106537 0.50452042 0.17187595 1.2011001 0.85248089 -0.54290265 -0.79599869 1.0970596 1.0639064 -0.50632006 -0.056362201 1.6187973 1.9697821 n 0.84087801 -0.58311361 0.98707831 1.0106537 0.50452042 0.17187595 -1.2011001 -0.85248089 0.54290265 0.79599869 1.0970596 1.0639064 0.50632006 0.056362201 1.6187973 1.9697821 o -0.41325793 -0.94610953 -0.64901817 -0.69794691 -0.94610953 1.5756168 -0.035764281 1.5423913 0.64901817 0.035764281 -0.83344561 -0.34225029 -0.69794691 1.5423913 0.34225029 1.9958048 p -0.41325793 -0.94610953 0.64901817 0.69794691 -0.94610953 1.5756168 0.035764281 -1.5423913 -0.64901817 -0.035764281 -0.83344561 -0.34225029 0.69794691 -1.5423913 0.34225029 1.9958048 r -0.38950139 -1.7498865 1.1830077 -1.900874 -0.88842064 0.27656791 0.40909496 -0.18204314 -0.50451517 -0.48701927 -0.72039133 -0.10337843 0.44219697 1.5413568 -1.0420315 2.1580429 R -0.38950133 -0.88842058 -0.50451523 -0.44219705 -1.7498868 0.27656788 -0.4870193 -1.5413573 1.1830078 0.40909493 -0.72039133 1.0420315 1.9008741 0.18204316 0.10337844 2.1580429 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.4/data/groups/g233.prj0000644000175000001440000000732410462200147013711 00000000000000# 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # a 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # ab 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abc 0.000000 0.707107 0.707107 0.000000 -0.707107 -0.500000 0.500000 0.000000 -0.707107 0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abca 0.000000 -0.707107 0.707107 0.000000 -0.707107 0.500000 0.500000 0.000000 -0.707107 -0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcab 0.000000 -0.707107 -0.707107 0.000000 -0.707107 0.500000 -0.500000 0.000000 -0.707107 -0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabc -1.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcb 0.000000 0.707107 -0.707107 0.000000 -0.707107 -0.500000 -0.500000 0.000000 -0.707107 0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # ac 0.000000 0.707107 0.707107 0.000000 -0.707107 -0.500000 0.500000 0.000000 0.707107 -0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # aca 0.000000 -0.707107 0.707107 0.000000 -0.707107 0.500000 0.500000 0.000000 0.707107 0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acab 0.000000 -0.707107 -0.707107 0.000000 -0.707107 0.500000 -0.500000 0.000000 0.707107 0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabc -1.000001 0.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acb 0.000000 0.707107 -0.707107 0.000000 -0.707107 -0.500000 -0.500000 0.000000 0.707107 -0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # b 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bc 0.000000 0.707107 0.707107 0.000000 0.707107 0.500000 -0.500000 0.000000 -0.707107 0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bca 0.000000 -0.707107 0.707107 0.000000 0.707107 -0.500000 -0.500000 0.000000 -0.707107 -0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcab 0.000000 -0.707107 -0.707107 0.000000 0.707107 -0.500000 0.500000 0.000000 -0.707107 -0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabc -1.000001 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcb 0.000000 0.707107 -0.707107 0.000000 0.707107 0.500000 0.500000 0.000000 -0.707107 0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # c 0.000000 0.707107 0.707107 0.000000 0.707107 0.500000 -0.500000 0.000000 0.707107 -0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # ca 0.000000 -0.707107 0.707107 0.000000 0.707107 -0.500000 -0.500000 0.000000 0.707107 0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cab 0.000000 -0.707107 -0.707107 0.000000 0.707107 -0.500000 0.500000 0.000000 0.707107 0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabc -1.000001 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cb 0.000000 0.707107 -0.707107 0.000000 0.707107 0.500000 0.500000 0.000000 0.707107 -0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 geomview-1.9.4/data/groups/g234.prj0000644000175000001440000001676010462200147013716 00000000000000# 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # a 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # ab 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abc 0.500000 0.707107 0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 -0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abca 0.500000 -0.707107 0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 -0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcab 0.500000 -0.707107 -0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 -0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabc -0.500000 0.707107 0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 -0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabca -0.500000 -0.707107 0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 -0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcab -0.500000 -0.707107 -0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 -0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabc -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcb -0.500000 0.707107 -0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 -0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcac 0.000000 0.000000 1.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacb 0.000000 0.000000 -1.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcb 0.500000 0.707107 -0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 -0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # ac 0.500000 0.707107 0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # aca 0.500000 -0.707107 0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acab 0.500000 -0.707107 -0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabc -0.500000 0.707107 0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabca -0.500000 -0.707107 0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcab -0.500000 -0.707107 -0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabc -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcb -0.500000 0.707107 -0.500000 0.000000 -0.707107 0.000000 0.707107 0.000000 0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acac 0.000000 0.000000 1.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acacb 0.000000 0.000000 -1.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acb 0.500000 0.707107 -0.500000 0.000000 -0.707107 0.000000 -0.707107 0.000000 0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # b 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bc 0.500000 0.707107 0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 -0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bca 0.500000 -0.707107 0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 -0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcab 0.500000 -0.707107 -0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 -0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabc -0.500000 0.707107 0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 -0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabca -0.500000 -0.707107 0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 -0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcab -0.500000 -0.707107 -0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 -0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabc -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcb -0.500000 0.707107 -0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 -0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcac 0.000000 0.000000 1.000000 0.000000 0.000000 1.000001 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacb 0.000000 0.000000 -1.000000 0.000000 0.000000 1.000001 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcb 0.500000 0.707107 -0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 -0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # c 0.500000 0.707107 0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # ca 0.500000 -0.707107 0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cab 0.500000 -0.707107 -0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabc -0.500000 0.707107 0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 0.500000 0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabca -0.500000 -0.707107 0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcab -0.500000 -0.707107 -0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 0.500000 -0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabc -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcb -0.500000 0.707107 -0.500000 0.000000 0.707107 0.000000 -0.707107 0.000000 0.500000 0.707107 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cac 0.000000 0.000000 1.000000 0.000000 0.000000 1.000001 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cacb 0.000000 0.000000 -1.000000 0.000000 0.000000 1.000001 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cb 0.500000 0.707107 -0.500000 0.000000 0.707107 0.000000 0.707107 0.000000 0.500000 -0.707107 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 geomview-1.9.4/data/groups/g235.prj0000644000175000001440000004623010462200147013712 00000000000000# 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # a 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # ab 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abc 0.809017 0.500000 0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abca 0.809017 -0.500000 0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcab 0.809017 -0.500000 -0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabc 0.309017 0.809017 0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabca 0.309017 -0.809017 0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcab 0.309017 -0.809017 -0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabc -0.309017 0.809017 0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabca -0.309017 -0.809017 0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcab -0.309017 -0.809017 -0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcabc -0.809017 0.500000 0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcabca -0.809017 -0.500000 0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcabcab -0.809017 -0.500000 -0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcabcabc -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcabcb -0.809017 0.500000 -0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcac -0.500000 -0.309017 0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcacb -0.500000 -0.309017 -0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcabcb -0.309017 0.809017 -0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcac 0.000000 0.000000 1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcacb 0.000000 0.000000 -1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcabcb 0.309017 0.809017 -0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcac 0.500000 0.309017 0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcaca 0.500000 -0.309017 0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacab 0.500000 -0.309017 -0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacabc 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacabca 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacabcac -0.500000 0.309017 0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacabcacb -0.500000 0.309017 -0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcacb 0.500000 0.309017 -0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # abcb 0.809017 0.500000 -0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # ac 0.809017 0.500000 0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # aca 0.809017 -0.500000 0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acab 0.809017 -0.500000 -0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabc 0.309017 0.809017 0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabca 0.309017 -0.809017 0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcab 0.309017 -0.809017 -0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabc -0.309017 0.809017 0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabca -0.309017 -0.809017 0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcab -0.309017 -0.809017 -0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcabc -0.809017 0.500000 0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcabca -0.809017 -0.500000 0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcabcab -0.809017 -0.500000 -0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcabcabc -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcabcb -0.809017 0.500000 -0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcac -0.500000 -0.309017 0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcacb -0.500000 -0.309017 -0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcabcb -0.309017 0.809017 -0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcac 0.000000 0.000000 1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcacb 0.000000 0.000000 -1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acabcb 0.309017 0.809017 -0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # acac 0.500000 0.309017 0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acaca 0.500000 -0.309017 0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acacab 0.500000 -0.309017 -0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acacabc 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acacabca 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acacabcac -0.500000 0.309017 0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acacabcacb -0.500000 0.309017 -0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acacb 0.500000 0.309017 -0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # acb 0.809017 0.500000 -0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # b 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bc 0.809017 0.500000 0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bca 0.809017 -0.500000 0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcab 0.809017 -0.500000 -0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabc 0.309017 0.809017 0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabca 0.309017 -0.809017 0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcab 0.309017 -0.809017 -0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabc -0.309017 0.809017 0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 -0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabca -0.309017 -0.809017 0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcab -0.309017 -0.809017 -0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 -0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcabc -0.809017 0.500000 0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 -0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcabca -0.809017 -0.500000 0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcabcab -0.809017 -0.500000 -0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 -0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcabcabc -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcabcb -0.809017 0.500000 -0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 -0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcac -0.500000 -0.309017 0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcacb -0.500000 -0.309017 -0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcabcb -0.309017 0.809017 -0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 -0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcac 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcacb 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcabcb 0.309017 0.809017 -0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 -0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcac 0.500000 0.309017 0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 -0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcaca 0.500000 -0.309017 0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacab 0.500000 -0.309017 -0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacabc 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacabca 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacabcac -0.500000 0.309017 0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 -0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacabcacb -0.500000 0.309017 -0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 -0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcacb 0.500000 0.309017 -0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 -0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # bcb 0.809017 0.500000 -0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 -0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # c 0.809017 0.500000 0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # ca 0.809017 -0.500000 0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cab 0.809017 -0.500000 -0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabc 0.309017 0.809017 0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabca 0.309017 -0.809017 0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcab 0.309017 -0.809017 -0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabc -0.309017 0.809017 0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabca -0.309017 -0.809017 0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcab -0.309017 -0.809017 -0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcabc -0.809017 0.500000 0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcabca -0.809017 -0.500000 0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcabcab -0.809017 -0.500000 -0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcabcabc -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcabcb -0.809017 0.500000 -0.309017 0.000000 0.500000 0.309017 -0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcac -0.500000 -0.309017 0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcacb -0.500000 -0.309017 -0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcabcb -0.309017 0.809017 -0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 0.500000 -0.309017 -0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcac 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcacb 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cabcb 0.309017 0.809017 -0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 0.500000 0.309017 0.809017 0.000000 0.000000 0.000000 0.000000 1.000000 # cac 0.500000 0.309017 0.809017 0.000000 0.309017 0.809017 -0.500000 0.000000 0.809017 -0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # caca 0.500000 -0.309017 0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cacab 0.500000 -0.309017 -0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cacabc 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cacabca 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cacabcac -0.500000 0.309017 0.809017 0.000000 0.309017 -0.809017 0.500000 0.000000 0.809017 0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cacabcacb -0.500000 0.309017 -0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 0.809017 0.500000 -0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cacb 0.500000 0.309017 -0.809017 0.000000 0.309017 0.809017 0.500000 0.000000 0.809017 -0.500000 0.309017 0.000000 0.000000 0.000000 0.000000 1.000000 # cb 0.809017 0.500000 -0.309017 0.000000 0.500000 -0.309017 0.809017 0.000000 0.309017 -0.809017 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 geomview-1.9.4/data/groups/g236.prj0000644000175000001440000013505010462200147013712 00000000000000# 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # a -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # ab -1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # abc 0.500000 0.866026 0.000000 0.000000 0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 0.433013 0.000000 1.000000 # abca -0.500000 0.866026 0.000000 0.000000 -0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 0.433013 0.000000 1.000000 # abcab -0.500000 -0.866026 0.000000 0.000000 -0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 -0.433013 0.000000 1.000000 # abcabc 1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 0.866026 0.000000 1.000000 # abcabca -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 0.866026 0.000000 1.000000 # abcabcab -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -0.866026 0.000000 1.000000 # abcabcabc 0.500001 0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 1.299039 0.000000 1.000000 # abcabcabca -0.500001 0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 1.299039 0.000000 1.000000 # abcabcabcab -0.500001 -0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -1.299039 0.000000 1.000000 # abcabcabcabc 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 1.732053 0.000000 1.000000 # abcabcabcabca -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 1.732053 0.000000 1.000000 # abcabcabcabcab -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 -1.732053 0.000000 1.000000 # abcabcabcabcabc 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 2.165067 0.000000 1.000000 # abcabcabcabcac 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 3.897120 0.000000 1.000000 # abcabcabcabcaca -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 3.897120 0.000000 1.000000 # abcabcabcabcacb 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 -3.897120 0.000000 1.000000 # abcabcabcabcb 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 -1.732053 0.000000 1.000000 # abcabcabcac -0.500002 0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 3.031092 0.000000 1.000000 # abcabcabcaca 0.500002 0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 3.031092 0.000000 1.000000 # abcabcabcacab 0.500002 -0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -3.031092 0.000000 1.000000 # abcabcabcacabc 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -0.433015 0.000000 1.000000 # abcabcabcacabca -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -0.433015 0.000000 1.000000 # abcabcabcacb -0.500002 -0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -3.031092 0.000000 1.000000 # abcabcabcb 0.500001 -0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -1.299039 0.000000 1.000000 # abcabcac 0.500001 0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 2.165065 0.000000 1.000000 # abcabcaca -0.500001 0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 2.165065 0.000000 1.000000 # abcabcacab -0.500001 -0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -2.165065 0.000000 1.000000 # abcabcacabc 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 0.000000 0.000000 1.000000 # abcabcacabca -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 0.000000 0.000000 1.000000 # abcabcacabcac 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.031093 0.000000 1.000000 # abcabcacabcaca -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.031093 0.000000 1.000000 # abcabcacabcacab -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 -3.031093 0.000000 1.000000 # abcabcacabcacb 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.031093 0.000000 1.000000 # abcabcacb 0.500001 -0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -2.165065 0.000000 1.000000 # abcabcb 1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -0.866026 0.000000 1.000000 # abcac -0.500001 0.866026 0.000000 0.000000 0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 1.299039 0.000000 1.000000 # abcaca 0.500001 0.866026 0.000000 0.000000 -0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 1.299039 0.000000 1.000000 # abcacab 0.500001 -0.866026 0.000000 0.000000 -0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -1.299039 0.000000 1.000000 # abcacabc 0.500001 -0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 0.433013 0.000000 1.000000 # abcacabca -0.500001 -0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 0.433013 0.000000 1.000000 # abcacabcab -0.500001 0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -0.433013 0.000000 1.000000 # abcacabcabc -0.500002 0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 2.165066 0.000000 1.000000 # abcacabcabca 0.500002 0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 2.165066 0.000000 1.000000 # abcacabcabcab 0.500002 -0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -2.165066 0.000000 1.000000 # abcacabcabcabc 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 1.299039 0.000000 1.000000 # abcacabcabcabca -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 1.299039 0.000000 1.000000 # abcacabcabcabcb 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -1.299039 0.000000 1.000000 # abcacabcabcac -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 3.464105 0.000000 1.000000 # abcacabcabcacb -1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 -3.464105 0.000000 1.000000 # abcacabcabcb -0.500002 -0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -2.165066 0.000000 1.000000 # abcacabcac 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 2.598079 0.000000 1.000000 # abcacabcaca -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 2.598079 0.000000 1.000000 # abcacabcacab -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -2.598079 0.000000 1.000000 # abcacabcacabc 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 0.433013 0.000000 1.000000 # abcacabcacabca -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 0.433013 0.000000 1.000000 # abcacabcacabcac -0.500002 0.866028 0.000000 0.000000 0.866028 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.897120 0.000000 1.000000 # abcacabcacb 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -2.598079 0.000000 1.000000 # abcacabcb 0.500001 0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -0.433013 0.000000 1.000000 # abcacac -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 1.732052 0.000000 1.000000 # abcacacb -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 -1.732052 0.000000 1.000000 # abcacb -0.500001 -0.866026 0.000000 0.000000 0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -1.299039 0.000000 1.000000 # abcb 0.500000 -0.866026 0.000000 0.000000 0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 -0.433013 0.000000 1.000000 # ac 0.500000 0.866026 0.000000 0.000000 -0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 0.433013 0.000000 1.000000 # aca -0.500000 0.866026 0.000000 0.000000 0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 0.433013 0.000000 1.000000 # acab -0.500000 -0.866026 0.000000 0.000000 0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 -0.433013 0.000000 1.000000 # acabc 1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 0.866026 0.000000 1.000000 # acabca -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 0.866026 0.000000 1.000000 # acabcab -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -0.866026 0.000000 1.000000 # acabcabc 0.500001 0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 1.299039 0.000000 1.000000 # acabcabca -0.500001 0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 1.299039 0.000000 1.000000 # acabcabcab -0.500001 -0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -1.299039 0.000000 1.000000 # acabcabcabc 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 1.732053 0.000000 1.000000 # acabcabcabca -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 1.732053 0.000000 1.000000 # acabcabcabcab -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 -1.732053 0.000000 1.000000 # acabcabcabcabc 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 2.165067 0.000000 1.000000 # acabcabcabcabca -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 2.165067 0.000000 1.000000 # acabcabcabcabcb 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -2.165067 0.000000 1.000000 # acabcabcabcac 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 3.897120 0.000000 1.000000 # acabcabcabcaca -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 3.897120 0.000000 1.000000 # acabcabcabcacab -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 -3.897120 0.000000 1.000000 # acabcabcabcacb 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 -3.897120 0.000000 1.000000 # acabcabcabcb 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 -1.732053 0.000000 1.000000 # acabcabcac -0.500002 0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 3.031092 0.000000 1.000000 # acabcabcaca 0.500002 0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 3.031092 0.000000 1.000000 # acabcabcacab 0.500002 -0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -3.031092 0.000000 1.000000 # acabcabcacabc 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -0.433015 0.000000 1.000000 # acabcabcacabca -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -0.433015 0.000000 1.000000 # acabcabcacabcac 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000004 3.464107 0.000000 1.000000 # acabcabcacb -0.500002 -0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -3.031092 0.000000 1.000000 # acabcabcb 0.500001 -0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -1.299039 0.000000 1.000000 # acabcac 0.500001 0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 2.165065 0.000000 1.000000 # acabcaca -0.500001 0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 2.165065 0.000000 1.000000 # acabcacab -0.500001 -0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -2.165065 0.000000 1.000000 # acabcacabc 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 0.000000 0.000000 1.000000 # acabcacabca -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 0.000000 0.000000 1.000000 # acabcacabcac 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.031093 0.000000 1.000000 # acabcacabcaca -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.031093 0.000000 1.000000 # acabcacabcacab -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 -3.031093 0.000000 1.000000 # acabcacabcacabc 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 4.500006 0.866027 0.000000 1.000000 # acabcacabcacb 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.031093 0.000000 1.000000 # acabcacb 0.500001 -0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -2.165065 0.000000 1.000000 # acabcb 1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -0.866026 0.000000 1.000000 # acac -0.500001 0.866026 0.000000 0.000000 -0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 1.299039 0.000000 1.000000 # acaca 0.500001 0.866026 0.000000 0.000000 0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 1.299039 0.000000 1.000000 # acacab 0.500001 -0.866026 0.000000 0.000000 0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -1.299039 0.000000 1.000000 # acacabc 0.500001 -0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 0.433013 0.000000 1.000000 # acacabca -0.500001 -0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 0.433013 0.000000 1.000000 # acacabcab -0.500001 0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -0.433013 0.000000 1.000000 # acacabcabc -0.500002 0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 2.165066 0.000000 1.000000 # acacabcabca 0.500002 0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 2.165066 0.000000 1.000000 # acacabcabcab 0.500002 -0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -2.165066 0.000000 1.000000 # acacabcabcabc 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 1.299039 0.000000 1.000000 # acacabcabcabca -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 1.299039 0.000000 1.000000 # acacabcabcabcab -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -1.299039 0.000000 1.000000 # acacabcabcabcac 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 4.330133 0.000000 1.000000 # acacabcabcabcb 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -1.299039 0.000000 1.000000 # acacabcabcac -1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 3.464105 0.000000 1.000000 # acacabcabcacb -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 -3.464105 0.000000 1.000000 # acacabcabcb -0.500002 -0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -2.165066 0.000000 1.000000 # acacabcac 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 2.598079 0.000000 1.000000 # acacabcaca -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 2.598079 0.000000 1.000000 # acacabcacab -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -2.598079 0.000000 1.000000 # acacabcacabc 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 0.433013 0.000000 1.000000 # acacabcacabca -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 0.433013 0.000000 1.000000 # acacabcacabcac -0.500002 0.866028 0.000000 0.000000 -0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.897120 0.000000 1.000000 # acacabcacabcaca 0.500002 0.866028 0.000000 0.000000 0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.897120 0.000000 1.000000 # acacabcacabcacb -0.500002 -0.866028 0.000000 0.000000 -0.866028 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.897120 0.000000 1.000000 # acacabcacb 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -2.598079 0.000000 1.000000 # acacabcb 0.500001 0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -0.433013 0.000000 1.000000 # acacac -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 1.732052 0.000000 1.000000 # acacacb -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 -1.732052 0.000000 1.000000 # acacb -0.500001 -0.866026 0.000000 0.000000 -0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -1.299039 0.000000 1.000000 # acb 0.500000 -0.866026 0.000000 0.000000 -0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 -0.433013 0.000000 1.000000 # b 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # bc -0.500000 -0.866026 0.000000 0.000000 0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 0.433013 0.000000 1.000000 # bca 0.500000 -0.866026 0.000000 0.000000 -0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 0.433013 0.000000 1.000000 # bcab 0.500000 0.866026 0.000000 0.000000 -0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 -0.433013 0.000000 1.000000 # bcabc -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 0.866026 0.000000 1.000000 # bcabca 1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 0.866026 0.000000 1.000000 # bcabcab 1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -0.866026 0.000000 1.000000 # bcabcabc -0.500001 -0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 1.299039 0.000000 1.000000 # bcabcabca 0.500001 -0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 1.299039 0.000000 1.000000 # bcabcabcab 0.500001 0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -1.299039 0.000000 1.000000 # bcabcabcabc -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 1.732053 0.000000 1.000000 # bcabcabcabca 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 1.732053 0.000000 1.000000 # bcabcabcabcab 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 -1.732053 0.000000 1.000000 # bcabcabcabcabc -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 2.165067 0.000000 1.000000 # bcabcabcabcabca 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 2.165067 0.000000 1.000000 # bcabcabcabcabcb -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -2.165067 0.000000 1.000000 # bcabcabcabcac -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 3.897120 0.000000 1.000000 # bcabcabcabcaca 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 3.897120 0.000000 1.000000 # bcabcabcabcacab 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 -3.897120 0.000000 1.000000 # bcabcabcabcacb -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 -3.897120 0.000000 1.000000 # bcabcabcabcb -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 -1.732053 0.000000 1.000000 # bcabcabcac 0.500002 -0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 3.031092 0.000000 1.000000 # bcabcabcaca -0.500002 -0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 3.031092 0.000000 1.000000 # bcabcabcacab -0.500002 0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -3.031092 0.000000 1.000000 # bcabcabcacabc -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -0.433015 0.000000 1.000000 # bcabcabcacabca 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -0.433015 0.000000 1.000000 # bcabcabcacabcac -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000004 3.464107 0.000000 1.000000 # bcabcabcacb 0.500002 0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -3.031092 0.000000 1.000000 # bcabcabcb -0.500001 0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -1.299039 0.000000 1.000000 # bcabcac -0.500001 -0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 2.165065 0.000000 1.000000 # bcabcaca 0.500001 -0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 2.165065 0.000000 1.000000 # bcabcacab 0.500001 0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -2.165065 0.000000 1.000000 # bcabcacabc -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 0.000000 0.000000 1.000000 # bcabcacabca 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 0.000000 0.000000 1.000000 # bcabcacabcac -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.031093 0.000000 1.000000 # bcabcacabcaca 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.031093 0.000000 1.000000 # bcabcacabcacab 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 -3.031093 0.000000 1.000000 # bcabcacabcacabc -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 4.500006 0.866027 0.000000 1.000000 # bcabcacabcacb -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.031093 0.000000 1.000000 # bcabcacb -0.500001 0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -2.165065 0.000000 1.000000 # bcabcb -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -0.866026 0.000000 1.000000 # bcac 0.500001 -0.866026 0.000000 0.000000 0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 1.299039 0.000000 1.000000 # bcaca -0.500001 -0.866026 0.000000 0.000000 -0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 1.299039 0.000000 1.000000 # bcacab -0.500001 0.866026 0.000000 0.000000 -0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -1.299039 0.000000 1.000000 # bcacabc -0.500001 0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 0.433013 0.000000 1.000000 # bcacabca 0.500001 0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 0.433013 0.000000 1.000000 # bcacabcab 0.500001 -0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -0.433013 0.000000 1.000000 # bcacabcabc 0.500002 -0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 2.165066 0.000000 1.000000 # bcacabcabca -0.500002 -0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 2.165066 0.000000 1.000000 # bcacabcabcab -0.500002 0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -2.165066 0.000000 1.000000 # bcacabcabcabc -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 1.299039 0.000000 1.000000 # bcacabcabcabca 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 1.299039 0.000000 1.000000 # bcacabcabcabcab 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -1.299039 0.000000 1.000000 # bcacabcabcabcac -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 4.330133 0.000000 1.000000 # bcacabcabcabcb -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -1.299039 0.000000 1.000000 # bcacabcabcac 1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 3.464105 0.000000 1.000000 # bcacabcabcacb 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 -3.464105 0.000000 1.000000 # bcacabcabcb 0.500002 0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -2.165066 0.000000 1.000000 # bcacabcac -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 2.598079 0.000000 1.000000 # bcacabcaca 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 2.598079 0.000000 1.000000 # bcacabcacab 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -2.598079 0.000000 1.000000 # bcacabcacabc -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 0.433013 0.000000 1.000000 # bcacabcacabca 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 0.433013 0.000000 1.000000 # bcacabcacabcac 0.500002 -0.866028 0.000000 0.000000 0.866028 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.897120 0.000000 1.000000 # bcacabcacabcaca -0.500002 -0.866028 0.000000 0.000000 -0.866028 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.897120 0.000000 1.000000 # bcacabcacabcacb 0.500002 0.866028 0.000000 0.000000 0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.897120 0.000000 1.000000 # bcacabcacb -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -2.598079 0.000000 1.000000 # bcacabcb -0.500001 -0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -0.433013 0.000000 1.000000 # bcacac 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 1.732052 0.000000 1.000000 # bcacacb 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 -1.732052 0.000000 1.000000 # bcacb 0.500001 0.866026 0.000000 0.000000 0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -1.299039 0.000000 1.000000 # bcb -0.500000 0.866026 0.000000 0.000000 0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 -0.433013 0.000000 1.000000 # c -0.500000 -0.866026 0.000000 0.000000 -0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 0.433013 0.000000 1.000000 # ca 0.500000 -0.866026 0.000000 0.000000 0.866026 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 0.433013 0.000000 1.000000 # cab 0.500000 0.866026 0.000000 0.000000 0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.750000 -0.433013 0.000000 1.000000 # cabc -1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 0.866026 0.000000 1.000000 # cabca 1.000001 0.000000 0.000000 0.000000 0.000000 -1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 0.866026 0.000000 1.000000 # cabcab 1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -0.866026 0.000000 1.000000 # cabcabc -0.500001 -0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 1.299039 0.000000 1.000000 # cabcabca 0.500001 -0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 1.299039 0.000000 1.000000 # cabcabcab 0.500001 0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -1.299039 0.000000 1.000000 # cabcabcabc -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 1.732053 0.000000 1.000000 # cabcabcabca 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 1.732053 0.000000 1.000000 # cabcabcabcab 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 -1.732053 0.000000 1.000000 # cabcabcabcabc -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 2.165067 0.000000 1.000000 # cabcabcabcabca 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 2.165067 0.000000 1.000000 # cabcabcabcabcab 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -2.165067 0.000000 1.000000 # cabcabcabcabcac 0.500002 -0.866028 0.000000 0.000000 -0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 4.763147 0.000000 1.000000 # cabcabcabcabcb -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -2.165067 0.000000 1.000000 # cabcabcabcac -0.500001 -0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 3.897120 0.000000 1.000000 # cabcabcabcaca 0.500001 -0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 3.897120 0.000000 1.000000 # cabcabcabcacab 0.500001 0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749998 -3.897120 0.000000 1.000000 # cabcabcabcacabc -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 4.500006 -0.866029 0.000000 1.000000 # cabcabcabcacb -0.500001 0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749998 -3.897120 0.000000 1.000000 # cabcabcabcb -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 -1.732053 0.000000 1.000000 # cabcabcac 0.500002 -0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 3.031092 0.000000 1.000000 # cabcabcaca -0.500002 -0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 3.031092 0.000000 1.000000 # cabcabcacab -0.500002 0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -3.031092 0.000000 1.000000 # cabcabcacabc -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -0.433015 0.000000 1.000000 # cabcabcacabca 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -0.433015 0.000000 1.000000 # cabcabcacabcac -1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000004 3.464107 0.000000 1.000000 # cabcabcacabcaca 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000004 3.464107 0.000000 1.000000 # cabcabcacabcacb -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000004 -3.464107 0.000000 1.000000 # cabcabcacb 0.500002 0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -3.031092 0.000000 1.000000 # cabcabcb -0.500001 0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -1.299039 0.000000 1.000000 # cabcac -0.500001 -0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 2.165065 0.000000 1.000000 # cabcaca 0.500001 -0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 2.165065 0.000000 1.000000 # cabcacab 0.500001 0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -2.165065 0.000000 1.000000 # cabcacabc -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.000003 0.000000 0.000000 1.000000 # cabcacabca 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.000003 0.000000 0.000000 1.000000 # cabcacabcac -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.031093 0.000000 1.000000 # cabcacabcaca 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.031093 0.000000 1.000000 # cabcacabcacab 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 -3.031093 0.000000 1.000000 # cabcacabcacabc -1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 4.500006 0.866027 0.000000 1.000000 # cabcacabcacabca 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -4.500006 0.866027 0.000000 1.000000 # cabcacabcacb -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.031093 0.000000 1.000000 # cabcacb -0.500001 0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -2.165065 0.000000 1.000000 # cabcb -1.000001 0.000000 0.000000 0.000000 0.000000 1.000001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -0.866026 0.000000 1.000000 # cac 0.500001 -0.866026 0.000000 0.000000 -0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 1.299039 0.000000 1.000000 # caca -0.500001 -0.866026 0.000000 0.000000 0.866026 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 1.299039 0.000000 1.000000 # cacab -0.500001 0.866026 0.000000 0.000000 0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.749999 -1.299039 0.000000 1.000000 # cacabc -0.500001 0.866027 0.000000 0.000000 -0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 0.433013 0.000000 1.000000 # cacabca 0.500001 0.866027 0.000000 0.000000 0.866027 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 0.433013 0.000000 1.000000 # cacabcab 0.500001 -0.866027 0.000000 0.000000 0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -0.433013 0.000000 1.000000 # cacabcabc 0.500002 -0.866027 0.000000 0.000000 -0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 2.165066 0.000000 1.000000 # cacabcabca -0.500002 -0.866027 0.000000 0.000000 0.866027 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 2.165066 0.000000 1.000000 # cacabcabcab -0.500002 0.866027 0.000000 0.000000 0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250001 -2.165066 0.000000 1.000000 # cacabcabcabc -0.500001 0.866028 0.000000 0.000000 -0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 1.299039 0.000000 1.000000 # cacabcabcabca 0.500001 0.866028 0.000000 0.000000 0.866028 -0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 1.299039 0.000000 1.000000 # cacabcabcabcab 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 -1.299039 0.000000 1.000000 # cacabcabcabcabc 0.500002 -0.866028 0.000000 0.000000 -0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 3.031094 0.000000 1.000000 # cacabcabcabcac -1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 4.330133 0.000000 1.000000 # cacabcabcabcaca 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 4.330133 0.000000 1.000000 # cacabcabcabcacb -1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -4.330133 0.000000 1.000000 # cacabcabcabcb -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 -1.299039 0.000000 1.000000 # cacabcabcac 1.000003 0.000000 0.000000 0.000000 0.000000 -1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 3.464105 0.000000 1.000000 # cacabcabcacb 1.000003 0.000000 0.000000 0.000000 0.000000 1.000003 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000003 -3.464105 0.000000 1.000000 # cacabcabcb 0.500002 0.866027 0.000000 0.000000 -0.866027 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -2.165066 0.000000 1.000000 # cacabcac -1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 2.598079 0.000000 1.000000 # cacabcaca 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 2.598079 0.000000 1.000000 # cacabcacab 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.500001 -2.598079 0.000000 1.000000 # cacabcacabc -0.500001 -0.866028 0.000000 0.000000 -0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 3.750004 0.433013 0.000000 1.000000 # cacabcacabca 0.500001 -0.866028 0.000000 0.000000 0.866028 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -3.750004 0.433013 0.000000 1.000000 # cacabcacabcac 0.500002 -0.866028 0.000000 0.000000 -0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 3.897120 0.000000 1.000000 # cacabcacabcaca -0.500002 -0.866028 0.000000 0.000000 0.866028 -0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 3.897120 0.000000 1.000000 # cacabcacabcacab -0.500002 0.866028 0.000000 0.000000 0.866028 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -2.250002 -3.897120 0.000000 1.000000 # cacabcacabcacb 0.500002 0.866028 0.000000 0.000000 -0.866028 0.500002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250002 -3.897120 0.000000 1.000000 # cacabcacb -1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.500001 -2.598079 0.000000 1.000000 # cacabcb -0.500001 -0.866027 0.000000 0.000000 -0.866027 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.250001 -0.433013 0.000000 1.000000 # cacac 1.000002 0.000000 0.000000 0.000000 0.000000 -1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 1.732052 0.000000 1.000000 # cacacb 1.000002 0.000000 0.000000 0.000000 0.000000 1.000002 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.000002 -1.732052 0.000000 1.000000 # cacb 0.500001 0.866026 0.000000 0.000000 -0.866026 0.500001 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.749999 -1.299039 0.000000 1.000000 # cb -0.500000 0.866026 0.000000 0.000000 -0.866026 -0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.750000 -0.433013 0.000000 1.000000 geomview-1.9.4/data/groups/g237.prj0000644000175000001440000022223310462200147013713 00000000000000# 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # a 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # ab -1.655971 0.000000 0.000000 -1.319939 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # abc -1.032481 -1.294690 0.000000 -1.319939 -0.781832 0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # abca -1.032481 1.294690 0.000000 -1.319939 -0.781832 -0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # abcab -0.032481 1.294690 0.000000 -0.822968 1.294690 -0.623490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # abcabc 0.991978 -0.832620 0.000000 -0.822968 0.319762 1.400969 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # abcabca 0.991978 0.832620 0.000000 -0.822968 0.319762 -1.400969 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # abcabcab -2.728954 0.832620 0.000000 -2.672162 0.832620 -1.400969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # abcabcabc -1.050506 -2.652713 0.000000 -2.672162 -0.576191 1.524459 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # abcabcabca -1.050506 2.652713 0.000000 -2.672162 -0.576191 -1.524459 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # abcabcabcab -1.787482 2.652713 0.000000 -3.038417 2.652713 -1.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311942 # abcabcabcabc 0.959497 -3.051449 0.000000 -3.038417 0.462070 3.024459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311942 # abcabcabcabca 0.959497 3.051449 0.000000 -3.038417 0.462070 -3.024459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311942 # abcabcabcabcab -5.599424 3.051449 0.000000 -6.298007 3.051449 -3.024459 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # abcabcabcabcabc -1.105465 -6.280354 0.000000 -6.298007 -0.462070 4.271438 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 0.659969 7.529146 0.000000 7.623883 # abcabcabcabcac 2.983956 -1.152382 0.000000 -3.038417 -2.076522 2.246980 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311942 # abcabcabcabcaca 2.983956 1.152382 0.000000 -3.038417 -2.076522 -2.246980 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -3.495130 -2.318815 0.000000 4.311942 # abcabcabcabcacb -8.951868 -1.152382 0.000000 -8.970169 7.255281 2.246980 0.000000 7.529145 0.000000 0.000000 1.000000 0.000000 11.479332 2.318815 0.000000 11.753806 # abcabcabcabcb -5.599424 -3.051449 0.000000 -6.298007 3.051449 3.024459 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # abcabcabcac 1.418994 -2.475258 0.000000 -2.672162 -1.551119 0.500000 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # abcabcabcaca 1.418994 2.475258 0.000000 -2.672162 -1.551119 -0.500000 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # abcabcabcacab -5.876903 2.475258 0.000000 -6.298007 4.267165 -0.500000 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # abcabcabcacabc -1.728954 -6.138046 0.000000 -6.298007 2.269618 3.647949 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 2.672162 7.069876 0.000000 7.623883 # abcabcabcacabca -1.728954 6.138046 0.000000 -6.298007 2.269618 -3.647949 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 2.672162 -7.069876 0.000000 7.623883 # abcabcabcacabcb -5.449887 -6.138046 0.000000 -8.147201 1.756759 3.647949 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 7.069876 0.000000 9.097836 # abcabcabcacac 2.819963 -0.433884 0.000000 -2.672162 -1.358023 -0.900969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # abcabcabcacacb -8.196866 -0.433884 0.000000 -8.147200 3.947402 -0.900969 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # abcabcabcacb -5.876903 -2.475258 0.000000 -6.298007 4.267165 0.500000 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # abcabcabcb -1.787482 -2.652713 0.000000 -3.038417 2.652713 1.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311942 # abcabcac 1.269457 0.256429 0.000000 -0.822968 -0.895953 1.123490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # abcabcaca 1.269457 -0.256429 0.000000 -0.822968 -0.895953 -1.123490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # abcabcacab -3.188451 -0.256429 0.000000 -3.038417 2.845809 -1.123490 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # abcabcacabc -2.188451 -2.332951 0.000000 -3.038417 0.895953 2.925428 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # abcabcacabca -2.188451 2.332951 0.000000 -3.038417 0.895953 -2.925428 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # abcabcacabcab -0.386513 2.332951 0.000000 -2.142907 2.332951 -2.925428 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311942 # abcabcacabcabc 1.582987 -1.756759 0.000000 -2.142907 -0.832621 3.647949 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311942 # abcabcacabcabca 1.582987 1.756759 0.000000 -2.142907 -0.832621 -3.647949 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311942 # abcabcacabcabcb -5.449887 -1.756759 0.000000 -5.638037 6.138046 3.647949 0.000000 7.069876 0.000000 0.000000 1.000000 0.000000 8.147201 3.923485 0.000000 9.097836 # abcabcacabcac 0.459497 -3.165571 0.000000 -3.038417 -1.728574 2.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311941 # abcabcacabcaca 0.459497 3.165571 0.000000 -3.038417 -1.728574 -2.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311941 # abcabcacabcacab -4.771438 3.165571 0.000000 -5.638037 6.679090 -2.524459 0.000000 7.069875 0.000000 0.000000 1.000000 0.000000 8.147200 -3.923485 0.000000 9.097835 # abcabcacabcacac 2.761435 -1.614452 0.000000 -3.038417 -3.051450 0.222521 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -3.992101 1.286845 0.000000 4.311941 # abcabcacabcacb -4.771438 -3.165571 0.000000 -5.638037 6.679090 2.524459 0.000000 7.069875 0.000000 0.000000 1.000000 0.000000 8.147200 3.923485 0.000000 9.097835 # abcabcacabcb -0.386513 -2.332951 0.000000 -2.142907 2.332951 2.925428 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311942 # abcabcacac 0.591009 1.152383 0.000000 -0.822968 -1.436997 0.000000 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # abcabcacacb -2.064961 1.152383 0.000000 -2.142907 3.741762 0.000000 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # abcabcacb -3.188451 0.256429 0.000000 -3.038417 2.845809 1.123490 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 4.155100 0.572700 0.000000 4.311941 # abcabcb -2.728954 -0.832620 0.000000 -2.672162 0.832620 1.400969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # abcac 0.368488 -1.614452 0.000000 -1.319939 -0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # abcaca 0.368488 1.614452 0.000000 -1.319939 -0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # abcacab -2.352444 1.614452 0.000000 -2.672162 1.614452 0.222521 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # abcacabc -0.204495 -2.845809 0.000000 -2.672162 1.180568 1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # abcacabca -0.204495 2.845809 0.000000 -2.672162 1.180568 -1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # abcacabcab -3.188451 2.845809 0.000000 -4.155100 -0.256429 -1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # abcacabcabc 0.236976 -4.267165 0.000000 -4.155100 -1.038261 0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311941 # abcacabcabca 0.236976 4.267165 0.000000 -4.155100 -1.038261 -0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311941 # abcacabcabcab -5.876903 4.267165 0.000000 -7.193517 2.475258 -0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # abcacabcabcabc -0.327985 -7.255281 0.000000 -7.193517 1.152383 2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 7.529145 0.000000 7.623883 # abcacabcabcabca -0.327985 7.255281 0.000000 -7.193517 1.152383 -2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 -7.529145 0.000000 7.623883 # abcacabcabcabcb -8.951868 -7.255281 0.000000 -11.479332 1.152382 2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 8.970169 7.529145 0.000000 11.753806 # abcacabcabcac 3.483956 -2.475258 0.000000 -4.155100 -1.038261 -0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311941 # abcacabcabcaca 3.483956 2.475258 0.000000 -4.155100 -1.038261 0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -3.495130 -2.318815 0.000000 4.311941 # abcacabcabcacab -11.253806 2.475258 0.000000 -11.479331 2.475258 0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 11.479331 -2.318815 0.000000 11.753806 # abcacabcabcacac 4.107446 1.180568 0.000000 -4.155100 -0.256429 -1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -3.992101 -1.286845 0.000000 4.311941 # abcacabcabcacb -11.253806 -2.475258 0.000000 -11.479331 2.475258 -0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 11.479331 2.318815 0.000000 11.753806 # abcacabcabcb -5.876903 -4.267165 0.000000 -7.193517 2.475258 0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # abcacabcac 2.097442 -1.934214 0.000000 -2.672162 -0.142308 1.623490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # abcacabcaca 2.097442 1.934214 0.000000 -2.672162 -0.142308 -1.623490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # abcacabcacab -7.000393 1.934214 0.000000 -7.193517 1.934214 -1.623490 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # abcacabcacabc -2.852444 -6.679090 0.000000 -7.193517 -0.063333 2.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 7.069875 0.000000 7.623883 # abcacabcacabca -2.852444 6.679090 0.000000 -7.193517 -0.063333 -2.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 -7.069875 0.000000 7.623883 # abcacabcacabcab -4.771438 6.679090 0.000000 -8.147200 3.165571 -2.524459 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 -7.069875 0.000000 9.097835 # abcacabcacabcac 3.443453 -6.394475 0.000000 -7.193517 -2.013189 1.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 -3.861386 6.497175 0.000000 7.623883 # abcacabcacabcb -4.771438 -6.679090 0.000000 -8.147200 3.165571 2.524459 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 7.069875 0.000000 9.097835 # abcacabcacac 2.819963 0.433884 0.000000 -2.672162 -1.358023 0.900969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # abcacabcacacb -8.196866 0.433884 0.000000 -8.147200 3.947403 0.900969 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # abcacabcacb -7.000393 -1.934214 0.000000 -7.193517 1.934214 1.623490 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # abcacabcb -3.188451 -2.845809 0.000000 -4.155100 -0.256429 1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # abcacac 1.491978 -0.718499 0.000000 -1.319939 -0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # abcacaca 1.491978 0.718499 0.000000 -1.319939 -0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # abcacacab -4.212910 0.718499 0.000000 -4.155099 0.718499 0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 4.155099 -0.572700 0.000000 4.311941 # abcacacabc -2.064962 -3.741762 0.000000 -4.155099 1.152382 0.000000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # abcacacabca -2.064962 3.741762 0.000000 -4.155099 1.152382 0.000000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # abcacacabcac 1.637945 -3.947403 0.000000 -4.155099 0.718499 0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311941 # abcacacabcaca 1.637945 3.947403 0.000000 -4.155099 0.718499 -0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311941 # abcacacabcacab -8.196866 3.947403 0.000000 -9.042710 -0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 8.147200 -3.923485 0.000000 9.097835 # abcacacabcacabc -2.024459 -8.869733 0.000000 -9.042710 -0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.012192 8.815990 0.000000 9.097835 # abcacacabcacac 4.107446 -1.180568 0.000000 -4.155099 -0.256429 1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -3.992101 1.286845 0.000000 4.311941 # abcacacabcacacb -12.286286 -1.180568 0.000000 -12.302300 1.180568 1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 12.302300 1.286845 0.000000 12.409776 # abcacacabcacb -8.196866 -3.947403 0.000000 -9.042710 -0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 8.147200 3.923485 0.000000 9.097835 # abcacacb -4.212910 -0.718499 0.000000 -4.155099 0.718499 -0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # abcacb -2.352444 -1.614452 0.000000 -2.672162 1.614452 -0.222521 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # abcb -0.032481 -1.294690 0.000000 -0.822968 1.294690 0.623490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # ac 0.623490 0.781832 0.000000 0.000000 -0.781832 0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # aca 0.623490 -0.781832 0.000000 0.000000 -0.781832 -0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acab -1.032481 -0.781832 0.000000 -0.822968 1.294690 -0.623490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # acabc -1.255002 -0.319762 0.000000 -0.822968 0.319762 1.400969 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # acabca -1.255002 0.319762 0.000000 -0.822968 0.319762 -1.400969 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # acabcab 0.991978 0.319762 0.000000 0.293714 0.832620 -1.400969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # acabcabc 0.868488 0.576191 0.000000 0.293714 -0.576191 1.524459 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # acabcabca 0.868488 -0.576191 0.000000 0.293714 -0.576191 -1.524459 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # acabcabcab -1.050506 -0.576191 0.000000 -0.659969 2.652713 -1.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # acabcabcabc -1.105465 -0.462070 0.000000 -0.659969 0.462070 3.024459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # acabcabcabca -1.105465 0.462070 0.000000 -0.659969 0.462070 -3.024459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # acabcabcabcab 0.959497 0.462070 0.000000 0.366256 3.051449 -3.024459 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311942 # acabcabcabcabc 0.959497 0.462070 0.000000 0.366256 -0.462070 4.271438 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311942 # acabcabcabcabca 0.959497 -0.462070 0.000000 0.366256 -0.462070 -4.271438 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311942 # acabcabcabcabcb -1.105465 0.462070 0.000000 -0.659969 6.280354 4.271438 0.000000 7.529146 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # acabcabcabcac -0.327985 -1.152383 0.000000 -0.659969 -2.076522 2.246980 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # acabcabcabcaca -0.327985 1.152383 0.000000 -0.659969 -2.076522 -2.246980 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # acabcabcabcacab -0.327985 1.152383 0.000000 -0.659969 7.255281 -2.246980 0.000000 7.529145 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # acabcabcabcacac 0.696474 -0.974928 0.000000 -0.659969 -3.051450 -0.222521 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # acabcabcabcacb -0.327985 -1.152383 0.000000 -0.659969 7.255281 2.246980 0.000000 7.529145 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # acabcabcabcb 0.959497 -0.462070 0.000000 0.366256 3.051449 3.024459 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311942 # acabcabcac 0.091009 1.038261 0.000000 0.293714 -1.551119 0.500000 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # acabcabcaca 0.091009 -1.038261 0.000000 0.293714 -1.551119 -0.500000 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # acabcabcacab 0.236976 -1.038261 0.000000 0.366256 4.267165 -0.500000 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # acabcabcacabc -0.663993 0.832621 0.000000 0.366256 2.269618 3.647949 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # acabcabcacabca -0.663993 -0.832621 0.000000 0.366256 2.269618 -3.647949 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # acabcabcacabcab 1.582987 -0.832621 0.000000 1.482938 1.756759 -3.647949 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311942 # acabcabcacabcac -1.064962 0.000000 0.000000 0.366256 -1.436997 4.048918 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311941 # acabcabcacabcb 1.582987 0.832621 0.000000 1.482938 1.756759 3.647949 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311942 # acabcabcacac -0.755002 0.718499 0.000000 0.293714 -1.358023 -0.900969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # acabcabcacacb 1.637945 0.718499 0.000000 1.482938 3.947402 -0.900969 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # acabcabcacb 0.236976 1.038261 0.000000 0.366256 4.267165 0.500000 0.000000 4.178360 0.000000 0.000000 1.000000 0.000000 4.155100 0.572700 0.000000 4.311941 # acabcabcb -1.050506 0.576191 0.000000 -0.659969 2.652713 1.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # acabcac -0.532481 -1.180568 0.000000 -0.822968 -0.895953 1.123490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # acabcaca -0.532481 1.180568 0.000000 -0.822968 -0.895953 -1.123490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # acabcacab -0.204495 1.180568 0.000000 -0.659969 2.845809 -1.123490 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # acabcacabc 0.795505 -0.895953 0.000000 -0.659969 0.895953 2.925428 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # acabcacabca 0.795505 0.895953 0.000000 -0.659969 0.895953 -2.925428 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # acabcacabcab -2.188451 0.895953 0.000000 -2.142907 2.332951 -2.925428 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # acabcacabcabc -0.663993 -2.269618 0.000000 -2.142907 -0.832621 3.647949 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311941 # acabcacabcabca -0.663993 2.269618 0.000000 -2.142907 -0.832621 -3.647949 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311941 # acabcacabcabcab -1.728954 2.269618 0.000000 -2.672162 6.138046 -3.647949 0.000000 7.069876 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # acabcacabcabcac 1.360466 -1.934214 0.000000 -2.142907 -3.371212 1.623490 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311941 # acabcacabcabcb -1.728954 -2.269618 0.000000 -2.672162 6.138046 3.647949 0.000000 7.069876 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # acabcacabcac 1.196473 0.063333 0.000000 -0.659969 -1.728574 2.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # acabcacabcaca 1.196473 -0.063333 0.000000 -0.659969 -1.728574 -2.524459 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # acabcacabcacab -2.852444 -0.063333 0.000000 -2.672162 6.679090 -2.524459 0.000000 7.069875 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # acabcacabcacabc -1.827985 -2.190643 0.000000 -2.672162 2.190643 6.795897 0.000000 7.069875 0.000000 0.000000 1.000000 0.000000 2.672162 7.069875 0.000000 7.623883 # acabcacabcacac 0.696473 0.974928 0.000000 -0.659969 -3.051450 0.222521 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # acabcacabcacacb -2.024459 0.974928 0.000000 -2.012192 8.869733 0.222521 0.000000 8.815990 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # acabcacabcacb -2.852444 0.063333 0.000000 -2.672162 6.679090 2.524459 0.000000 7.069875 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # acabcacabcb -2.188451 -0.895953 0.000000 -2.142907 2.332951 2.925428 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # acabcacac 0.591009 -1.152382 0.000000 -0.822968 -1.436997 0.000000 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # acabcacacb -2.064962 -1.152382 0.000000 -2.142907 3.741762 0.000000 0.000000 3.605660 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # acabcacb -0.204495 -1.180568 0.000000 -0.659969 2.845809 1.123490 0.000000 2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # acabcb 0.991978 -0.319762 0.000000 0.293714 0.832620 1.400969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # acac -0.222521 0.974928 0.000000 0.000000 -0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acaca -0.222521 -0.974928 0.000000 0.000000 -0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acacab 0.368488 -0.974928 0.000000 0.293714 1.614452 0.222521 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # acacabc -0.532481 0.895953 0.000000 0.293714 1.180568 1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # acacabca -0.532481 -0.895953 0.000000 0.293714 1.180568 -1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # acacabcab 1.269457 -0.895953 0.000000 1.189224 -0.256429 -1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # acacabcabc 0.091009 1.551119 0.000000 1.189224 -1.038261 0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # acacabcabca 0.091009 -1.551119 0.000000 1.189224 -1.038261 -0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # acacabcabcab 1.418994 -1.551119 0.000000 1.849193 2.475258 -0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # acacabcabcabc -0.327985 2.076522 0.000000 1.849193 1.152383 2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # acacabcabcabca -0.327985 -2.076522 0.000000 1.849193 1.152383 -2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # acacabcabcabcab 2.983956 -2.076522 0.000000 3.495130 1.152382 -2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311942 # acacabcabcabcac -1.827985 1.038261 0.000000 1.849193 -1.038261 2.301938 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # acacabcabcabcb 2.983956 2.076522 0.000000 3.495130 1.152382 2.246980 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311942 # acacabcabcac -1.155971 1.038261 0.000000 1.189224 -1.038261 -0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # acacabcabcaca -1.155971 -1.038261 0.000000 1.189224 -1.038261 0.500000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # acacabcabcacab 3.483956 -1.038261 0.000000 3.495130 2.475258 0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # acacabcabcacabc 1.360466 3.371212 0.000000 3.495130 1.934214 1.623490 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # acacabcabcacac -1.532481 -0.256429 0.000000 1.189224 -0.256429 -1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # acacabcabcacacb 4.107446 -0.256429 0.000000 3.992101 1.180568 -1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # acacabcabcacb 3.483956 1.038261 0.000000 3.495130 2.475258 -0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 4.155100 0.572700 0.000000 4.311941 # acacabcabcb 1.418994 1.551119 0.000000 1.849193 2.475258 0.500000 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # acacabcac -1.032481 0.142308 0.000000 0.293714 -0.142308 1.623490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # acacabcaca -1.032481 -0.142308 0.000000 0.293714 -0.142308 -1.623490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # acacabcacab 2.097442 -0.142308 0.000000 1.849193 1.934214 -1.623490 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # acacabcacabc 1.196473 1.728574 0.000000 1.849193 -0.063333 2.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # acacabcacabca 1.196473 -1.728574 0.000000 1.849193 -0.063333 -2.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # acacabcacabcab 0.459497 -1.728574 0.000000 1.482938 3.165571 -2.524459 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # acacabcacabcabc -1.064962 1.436997 0.000000 1.482938 0.000000 4.048918 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311941 # acacabcacabcac -0.605464 2.013189 0.000000 1.849193 -2.013189 1.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # acacabcacabcaca -0.605464 -2.013189 0.000000 1.849193 -2.013189 -1.524459 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # acacabcacabcacb 3.443453 2.013189 0.000000 3.861386 6.394475 1.524459 0.000000 6.497175 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # acacabcacabcb 0.459497 1.728574 0.000000 1.482938 3.165571 2.524459 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # acacabcacac -0.755002 -0.718499 0.000000 0.293714 -1.358023 0.900969 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # acacabcacacb 1.637945 -0.718499 0.000000 1.482938 3.947403 0.900969 0.000000 3.923485 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # acacabcacb 2.097442 0.142308 0.000000 1.849193 1.934214 1.623490 0.000000 2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # acacabcb 1.269457 0.895953 0.000000 1.189224 -0.256429 1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # acacac -0.900969 0.433884 0.000000 0.000000 -0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acacaca -0.900969 -0.433884 0.000000 0.000000 -0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # acacacab 1.491978 -0.433884 0.000000 1.189224 0.718499 0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # acacacabc 0.591009 1.436997 0.000000 1.189224 1.152382 0.000000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # acacacabca 0.591009 -1.436997 0.000000 1.189224 1.152382 0.000000 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # acacacabcac -0.755002 1.358023 0.000000 1.189224 0.718499 0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # acacacabcaca -0.755002 -1.358023 0.000000 1.189224 0.718499 -0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # acacacabcacab 2.819963 -1.358023 0.000000 2.965876 -0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # acacacabcacabc 0.696473 3.051450 0.000000 2.965876 -0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # acacacabcacabca 0.696473 -3.051450 0.000000 2.965876 -0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # acacacabcacabcb 2.761435 3.051450 0.000000 3.992101 1.614452 0.222521 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # acacacabcacac -1.532481 0.256429 0.000000 1.189224 -0.256429 1.123490 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # acacacabcacacb 4.107446 0.256429 0.000000 3.992101 1.180568 1.123490 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # acacacabcacb 2.819963 1.358023 0.000000 2.965876 -0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # acacacb 1.491978 0.433884 0.000000 1.189224 0.718499 -0.900969 0.000000 0.572700 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # acacb 0.368488 0.974928 0.000000 0.293714 1.614452 -0.222521 0.000000 1.286845 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # acb -1.032481 0.781832 0.000000 -0.822968 1.294690 0.623490 0.000000 1.031970 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # b -1.655971 0.000000 0.000000 -1.319939 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # bc -1.032481 -1.294690 0.000000 -1.319939 0.781832 -0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # bca -1.032481 1.294690 0.000000 -1.319939 0.781832 0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # bcab -0.032481 1.294690 0.000000 -0.822968 -1.294690 0.623490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # bcabc 0.991978 -0.832620 0.000000 -0.822968 -0.319762 -1.400969 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # bcabca 0.991978 0.832620 0.000000 -0.822968 -0.319762 1.400969 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # bcabcab -2.728954 0.832620 0.000000 -2.672162 -0.832620 1.400969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # bcabcabc -1.050506 -2.652713 0.000000 -2.672162 0.576191 -1.524459 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # bcabcabca -1.050506 2.652713 0.000000 -2.672162 0.576191 1.524459 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # bcabcabcab -1.787482 2.652713 0.000000 -3.038417 -2.652713 1.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311942 # bcabcabcabc 0.959497 -3.051449 0.000000 -3.038417 -0.462070 -3.024459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311942 # bcabcabcabca 0.959497 3.051449 0.000000 -3.038417 -0.462070 3.024459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311942 # bcabcabcabcab -5.599424 3.051449 0.000000 -6.298007 -3.051449 3.024459 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # bcabcabcabcabc -1.105465 -6.280354 0.000000 -6.298007 0.462070 -4.271438 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 0.659969 7.529146 0.000000 7.623883 # bcabcabcabcabca -1.105465 6.280354 0.000000 -6.298007 0.462070 4.271438 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 0.659969 -7.529146 0.000000 7.623883 # bcabcabcabcabcb -6.482367 -6.280354 0.000000 -8.970169 -6.280354 -4.271438 0.000000 -7.529146 0.000000 0.000000 1.000000 0.000000 8.970169 7.529146 0.000000 11.753807 # bcabcabcabcac 2.983956 -1.152382 0.000000 -3.038417 2.076522 -2.246980 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311942 # bcabcabcabcaca 2.983956 1.152382 0.000000 -3.038417 2.076522 2.246980 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -3.495130 -2.318815 0.000000 4.311942 # bcabcabcabcacab -8.951868 1.152382 0.000000 -8.970169 -7.255281 2.246980 0.000000 -7.529145 0.000000 0.000000 1.000000 0.000000 11.479332 -2.318815 0.000000 11.753806 # bcabcabcabcacac 2.761435 1.614452 0.000000 -3.038417 3.051450 0.222521 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -3.992101 -1.286846 0.000000 4.311942 # bcabcabcabcacb -8.951868 -1.152382 0.000000 -8.970169 -7.255281 -2.246980 0.000000 -7.529145 0.000000 0.000000 1.000000 0.000000 11.479332 2.318815 0.000000 11.753806 # bcabcabcabcb -5.599424 -3.051449 0.000000 -6.298007 -3.051449 -3.024459 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # bcabcabcac 1.418994 -2.475258 0.000000 -2.672162 1.551119 -0.500000 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # bcabcabcaca 1.418994 2.475258 0.000000 -2.672162 1.551119 0.500000 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # bcabcabcacab -5.876903 2.475258 0.000000 -6.298007 -4.267165 0.500000 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # bcabcabcacabc -1.728954 -6.138046 0.000000 -6.298007 -2.269618 -3.647949 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 2.672162 7.069876 0.000000 7.623883 # bcabcabcacabca -1.728954 6.138046 0.000000 -6.298007 -2.269618 3.647949 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 2.672162 -7.069876 0.000000 7.623883 # bcabcabcacabcab -5.449887 6.138046 0.000000 -8.147201 -1.756759 3.647949 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 -7.069876 0.000000 9.097836 # bcabcabcacabcac 3.720933 -5.178760 0.000000 -6.298007 1.436997 -4.048918 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 -3.861386 6.497176 0.000000 7.623883 # bcabcabcacabcb -5.449887 -6.138046 0.000000 -8.147201 -1.756759 -3.647949 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 7.069876 0.000000 9.097836 # bcabcabcacac 2.819963 -0.433884 0.000000 -2.672162 1.358023 0.900969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # bcabcabcacacb -8.196866 -0.433884 0.000000 -8.147200 -3.947402 0.900969 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # bcabcabcacb -5.876903 -2.475258 0.000000 -6.298007 -4.267165 -0.500000 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # bcabcabcb -1.787482 -2.652713 0.000000 -3.038417 -2.652713 -1.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311942 # bcabcac 1.269457 0.256429 0.000000 -0.822968 0.895953 -1.123490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # bcabcaca 1.269457 -0.256429 0.000000 -0.822968 0.895953 1.123490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # bcabcacab -3.188451 -0.256429 0.000000 -3.038417 -2.845809 1.123490 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # bcabcacabc -2.188451 -2.332951 0.000000 -3.038417 -0.895953 -2.925428 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # bcabcacabca -2.188451 2.332951 0.000000 -3.038417 -0.895953 2.925428 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # bcabcacabcab -0.386513 2.332951 0.000000 -2.142907 -2.332951 2.925428 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311942 # bcabcacabcabc 1.582987 -1.756759 0.000000 -2.142907 0.832621 -3.647949 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311942 # bcabcacabcabca 1.582987 1.756759 0.000000 -2.142907 0.832621 3.647949 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311942 # bcabcacabcabcab -5.449887 1.756759 0.000000 -5.638037 -6.138046 3.647949 0.000000 -7.069876 0.000000 0.000000 1.000000 0.000000 8.147201 -3.923485 0.000000 9.097836 # bcabcacabcabcac 2.360466 0.142308 0.000000 -2.142907 3.371212 -1.623490 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -3.992101 1.286845 0.000000 4.311942 # bcabcacabcabcb -5.449887 -1.756759 0.000000 -5.638037 -6.138046 -3.647949 0.000000 -7.069876 0.000000 0.000000 1.000000 0.000000 8.147201 3.923485 0.000000 9.097836 # bcabcacabcac 0.459497 -3.165571 0.000000 -3.038417 1.728574 -2.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311941 # bcabcacabcaca 0.459497 3.165571 0.000000 -3.038417 1.728574 2.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311941 # bcabcacabcacab -4.771438 3.165571 0.000000 -5.638037 -6.679090 2.524459 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 8.147200 -3.923485 0.000000 9.097835 # bcabcacabcacabc -0.500000 -5.704162 0.000000 -5.638037 -2.190643 -6.795897 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 2.012192 8.815991 0.000000 9.097835 # bcabcacabcacac 2.761435 -1.614452 0.000000 -3.038417 3.051450 -0.222521 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -3.992101 1.286845 0.000000 4.311941 # bcabcacabcacacb -8.583380 -1.614452 0.000000 -8.676454 -8.869733 -0.222521 0.000000 -8.815990 0.000000 0.000000 1.000000 0.000000 12.302300 1.286845 0.000000 12.409777 # bcabcacabcacb -4.771438 -3.165571 0.000000 -5.638037 -6.679090 -2.524459 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 8.147200 3.923485 0.000000 9.097835 # bcabcacabcb -0.386513 -2.332951 0.000000 -2.142907 -2.332951 -2.925428 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311942 # bcabcacac 0.591009 1.152383 0.000000 -0.822968 1.436997 0.000000 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # bcabcacacb -2.064961 1.152383 0.000000 -2.142907 -3.741762 0.000000 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # bcabcacb -3.188451 0.256429 0.000000 -3.038417 -2.845809 -1.123490 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 4.155100 0.572700 0.000000 4.311941 # bcabcb -2.728954 -0.832620 0.000000 -2.672162 -0.832620 -1.400969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # bcac 0.368488 -1.614452 0.000000 -1.319939 0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # bcaca 0.368488 1.614452 0.000000 -1.319939 0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # bcacab -2.352444 1.614452 0.000000 -2.672162 -1.614452 -0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # bcacabc -0.204495 -2.845809 0.000000 -2.672162 -1.180568 -1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # bcacabca -0.204495 2.845809 0.000000 -2.672162 -1.180568 1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # bcacabcab -3.188451 2.845809 0.000000 -4.155100 0.256429 1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # bcacabcabc 0.236976 -4.267165 0.000000 -4.155100 1.038261 -0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311941 # bcacabcabca 0.236976 4.267165 0.000000 -4.155100 1.038261 0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311941 # bcacabcabcab -5.876903 4.267165 0.000000 -7.193517 -2.475258 0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # bcacabcabcabc -0.327985 -7.255281 0.000000 -7.193517 -1.152383 -2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 7.529145 0.000000 7.623883 # bcacabcabcabca -0.327985 7.255281 0.000000 -7.193517 -1.152383 2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 -7.529145 0.000000 7.623883 # bcacabcabcabcab -8.951868 7.255281 0.000000 -11.479332 -1.152382 2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 8.970169 -7.529145 0.000000 11.753806 # bcacabcabcabcac 5.467912 -4.780023 0.000000 -7.193517 1.038261 -2.301938 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -5.475039 5.210330 0.000000 7.623883 # bcacabcabcabcb -8.951868 -7.255281 0.000000 -11.479332 -1.152382 -2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 8.970169 7.529145 0.000000 11.753806 # bcacabcabcac 3.483956 -2.475258 0.000000 -4.155100 1.038261 0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311941 # bcacabcabcaca 3.483956 2.475258 0.000000 -4.155100 1.038261 -0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -3.495130 -2.318815 0.000000 4.311941 # bcacabcabcacab -11.253806 2.475258 0.000000 -11.479331 -2.475258 -0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 11.479331 -2.318815 0.000000 11.753806 # bcacabcabcacabc -5.081398 -10.341878 0.000000 -11.479331 -1.934214 -1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 5.344324 10.420660 0.000000 11.753806 # bcacabcabcacac 4.107446 1.180568 0.000000 -4.155100 0.256429 1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -3.992101 -1.286845 0.000000 4.311941 # bcacabcabcacacb -12.286286 1.180568 0.000000 -12.302300 -1.180568 1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 12.302300 -1.286845 0.000000 12.409776 # bcacabcabcacb -11.253806 -2.475258 0.000000 -11.479331 -2.475258 0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 11.479331 2.318815 0.000000 11.753806 # bcacabcabcb -5.876903 -4.267165 0.000000 -7.193517 -2.475258 -0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # bcacabcac 2.097442 -1.934214 0.000000 -2.672162 0.142308 -1.623490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # bcacabcaca 2.097442 1.934214 0.000000 -2.672162 0.142308 1.623490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # bcacabcacab -7.000393 1.934214 0.000000 -7.193517 -1.934214 1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # bcacabcacabc -2.852444 -6.679090 0.000000 -7.193517 0.063333 -2.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 7.069875 0.000000 7.623883 # bcacabcacabca -2.852444 6.679090 0.000000 -7.193517 0.063333 2.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 -7.069875 0.000000 7.623883 # bcacabcacabcab -4.771438 6.679090 0.000000 -8.147200 -3.165571 2.524459 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 -7.069875 0.000000 9.097835 # bcacabcacabcabc 2.246980 -7.894805 0.000000 -8.147200 0.000000 -4.048918 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 -2.012193 8.815990 0.000000 9.097835 # bcacabcacabcac 3.443453 -6.394475 0.000000 -7.193517 2.013189 -1.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -3.861386 6.497175 0.000000 7.623883 # bcacabcacabcaca 3.443453 6.394475 0.000000 -7.193517 2.013189 1.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -3.861386 -6.497175 0.000000 7.623883 # bcacabcacabcacb -15.197259 -6.394475 0.000000 -16.457399 -6.394475 -1.524459 0.000000 -6.497175 0.000000 0.000000 1.000000 0.000000 16.457399 6.497175 0.000000 17.721718 # bcacabcacabcb -4.771438 -6.679090 0.000000 -8.147200 -3.165571 -2.524459 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 5.638037 7.069875 0.000000 9.097835 # bcacabcacac 2.819963 0.433884 0.000000 -2.672162 1.358023 -0.900969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # bcacabcacacb -8.196866 0.433884 0.000000 -8.147200 -3.947403 -0.900969 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # bcacabcacb -7.000393 -1.934214 0.000000 -7.193517 -1.934214 -1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # bcacabcb -3.188451 -2.845809 0.000000 -4.155100 0.256429 -1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # bcacac 1.491978 -0.718499 0.000000 -1.319939 0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # bcacaca 1.491978 0.718499 0.000000 -1.319939 0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # bcacacab -4.212910 0.718499 0.000000 -4.155099 -0.718499 -0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 4.155099 -0.572700 0.000000 4.311941 # bcacacabc -2.064962 -3.741762 0.000000 -4.155099 -1.152382 0.000000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # bcacacabca -2.064962 3.741762 0.000000 -4.155099 -1.152382 0.000000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # bcacacabcac 1.637945 -3.947403 0.000000 -4.155099 -0.718499 -0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311941 # bcacacabcaca 1.637945 3.947403 0.000000 -4.155099 -0.718499 0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311941 # bcacacabcacab -8.196866 3.947403 0.000000 -9.042710 0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 8.147200 -3.923485 0.000000 9.097835 # bcacacabcacabc -2.024459 -8.869733 0.000000 -9.042710 0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.012192 8.815990 0.000000 9.097835 # bcacacabcacabca -2.024459 8.869733 0.000000 -9.042710 0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.012192 -8.815990 0.000000 9.097835 # bcacacabcacabcb -8.583380 -8.869733 0.000000 -12.302300 -1.614452 -0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 8.676454 8.815990 0.000000 12.409777 # bcacacabcacac 4.107446 -1.180568 0.000000 -4.155099 0.256429 -1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -3.992101 1.286845 0.000000 4.311941 # bcacacabcacacb -12.286286 -1.180568 0.000000 -12.302300 -1.180568 -1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 12.302300 1.286845 0.000000 12.409776 # bcacacabcacb -8.196866 -3.947403 0.000000 -9.042710 0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 8.147200 3.923485 0.000000 9.097835 # bcacacb -4.212910 -0.718499 0.000000 -4.155099 -0.718499 0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # bcacb -2.352444 -1.614452 0.000000 -2.672162 -1.614452 0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # bcb -0.032481 -1.294690 0.000000 -0.822968 -1.294690 -0.623490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # c 0.623490 0.781832 0.000000 0.000000 0.781832 -0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # ca 0.623490 -0.781832 0.000000 0.000000 0.781832 0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cab -1.032481 -0.781832 0.000000 -0.822968 -1.294690 0.623490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # cabc -1.255002 -0.319762 0.000000 -0.822968 -0.319762 -1.400969 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # cabca -1.255002 0.319762 0.000000 -0.822968 -0.319762 1.400969 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # cabcab 0.991978 0.319762 0.000000 0.293714 -0.832620 1.400969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # cabcabc 0.868488 0.576191 0.000000 0.293714 0.576191 -1.524459 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # cabcabca 0.868488 -0.576191 0.000000 0.293714 0.576191 1.524459 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # cabcabcab -1.050506 -0.576191 0.000000 -0.659969 -2.652713 1.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # cabcabcabc -1.105465 -0.462070 0.000000 -0.659969 -0.462070 -3.024459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # cabcabcabca -1.105465 0.462070 0.000000 -0.659969 -0.462070 3.024459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # cabcabcabcab 0.959497 0.462070 0.000000 0.366256 -3.051449 3.024459 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311942 # cabcabcabcabc 0.959497 0.462070 0.000000 0.366256 0.462070 -4.271438 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311942 # cabcabcabcabca 0.959497 -0.462070 0.000000 0.366256 0.462070 4.271438 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311942 # cabcabcabcabcab -1.105465 -0.462070 0.000000 -0.659969 -6.280354 4.271438 0.000000 -7.529146 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # cabcabcabcabcac 0.236976 1.038261 0.000000 0.366256 3.627641 -2.301938 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311942 # cabcabcabcabcb -1.105465 0.462070 0.000000 -0.659969 -6.280354 -4.271438 0.000000 -7.529146 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # cabcabcabcac -0.327985 -1.152383 0.000000 -0.659969 2.076522 -2.246980 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # cabcabcabcaca -0.327985 1.152383 0.000000 -0.659969 2.076522 2.246980 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # cabcabcabcacab -0.327985 1.152383 0.000000 -0.659969 -7.255281 2.246980 0.000000 -7.529145 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # cabcabcabcacabc 0.696474 -0.974928 0.000000 -0.659969 -2.766834 -7.073377 0.000000 -7.529145 0.000000 0.000000 1.000000 0.000000 2.672162 7.069876 0.000000 7.623883 # cabcabcabcacac 0.696474 -0.974928 0.000000 -0.659969 3.051450 0.222521 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # cabcabcabcacacb -2.024459 -0.974928 0.000000 -2.012192 -8.869734 0.222521 0.000000 -8.815991 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # cabcabcabcacb -0.327985 -1.152383 0.000000 -0.659969 -7.255281 -2.246980 0.000000 -7.529145 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # cabcabcabcb 0.959497 -0.462070 0.000000 0.366256 -3.051449 -3.024459 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311942 # cabcabcac 0.091009 1.038261 0.000000 0.293714 1.551119 -0.500000 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # cabcabcaca 0.091009 -1.038261 0.000000 0.293714 1.551119 0.500000 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # cabcabcacab 0.236976 -1.038261 0.000000 0.366256 -4.267165 0.500000 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # cabcabcacabc -0.663993 0.832621 0.000000 0.366256 -2.269618 -3.647949 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # cabcabcacabca -0.663993 -0.832621 0.000000 0.366256 -2.269618 3.647949 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # cabcabcacabcab 1.582987 -0.832621 0.000000 1.482938 -1.756759 3.647949 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311942 # cabcabcacabcabc 0.336007 1.756760 0.000000 1.482938 1.756760 -3.647948 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311942 # cabcabcacabcac -1.064962 0.000000 0.000000 0.366256 1.436997 -4.048918 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 -1.482938 3.923485 0.000000 4.311941 # cabcabcacabcaca -1.064962 0.000000 0.000000 0.366256 1.436997 4.048918 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 -1.482938 -3.923485 0.000000 4.311941 # cabcabcacabcacb 2.246980 0.000000 0.000000 2.012193 -7.894805 -4.048918 0.000000 -8.815990 0.000000 0.000000 1.000000 0.000000 8.147200 3.923485 0.000000 9.097835 # cabcabcacabcb 1.582987 0.832621 0.000000 1.482938 -1.756759 -3.647949 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311942 # cabcabcacac -0.755002 0.718499 0.000000 0.293714 1.358023 0.900969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # cabcabcacacb 1.637945 0.718499 0.000000 1.482938 -3.947402 0.900969 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # cabcabcacb 0.236976 1.038261 0.000000 0.366256 -4.267165 -0.500000 0.000000 -4.178360 0.000000 0.000000 1.000000 0.000000 4.155100 0.572700 0.000000 4.311941 # cabcabcb -1.050506 0.576191 0.000000 -0.659969 -2.652713 -1.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # cabcac -0.532481 -1.180568 0.000000 -0.822968 0.895953 -1.123490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # cabcaca -0.532481 1.180568 0.000000 -0.822968 0.895953 1.123490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # cabcacab -0.204495 1.180568 0.000000 -0.659969 -2.845809 1.123490 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # cabcacabc 0.795505 -0.895953 0.000000 -0.659969 -0.895953 -2.925428 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # cabcacabca 0.795505 0.895953 0.000000 -0.659969 -0.895953 2.925428 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # cabcacabcab -2.188451 0.895953 0.000000 -2.142907 -2.332951 2.925428 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # cabcacabcabc -0.663993 -2.269618 0.000000 -2.142907 0.832621 -3.647949 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311941 # cabcacabcabca -0.663993 2.269618 0.000000 -2.142907 0.832621 3.647949 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311941 # cabcacabcabcab -1.728954 2.269618 0.000000 -2.672162 -6.138046 3.647949 0.000000 -7.069876 0.000000 0.000000 1.000000 0.000000 6.298007 -4.178360 0.000000 7.623883 # cabcacabcabcabc 0.696474 -2.766834 0.000000 -2.672162 -0.974928 -7.073377 0.000000 -7.069876 0.000000 0.000000 1.000000 0.000000 0.659969 7.529145 0.000000 7.623883 # cabcacabcabcac 1.360466 -1.934214 0.000000 -2.142907 3.371212 -1.623490 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -3.495130 2.318815 0.000000 4.311941 # cabcacabcabcaca 1.360466 1.934214 0.000000 -2.142907 3.371212 1.623490 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 -3.495130 -2.318815 0.000000 4.311941 # cabcacabcabcacb -5.081398 -1.934214 0.000000 -5.344324 -10.341878 -1.623490 0.000000 -10.420660 0.000000 0.000000 1.000000 0.000000 11.479331 2.318815 0.000000 11.753806 # cabcacabcabcb -1.728954 -2.269618 0.000000 -2.672162 -6.138046 -3.647949 0.000000 -7.069876 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # cabcacabcac 1.196473 0.063333 0.000000 -0.659969 1.728574 -2.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # cabcacabcaca 1.196473 -0.063333 0.000000 -0.659969 1.728574 2.524459 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # cabcacabcacab -2.852444 -0.063333 0.000000 -2.672162 -6.679090 2.524459 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # cabcacabcacabc -1.827985 -2.190643 0.000000 -2.672162 -2.190643 -6.795897 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 2.672162 7.069875 0.000000 7.623883 # cabcacabcacabca -1.827985 2.190643 0.000000 -2.672162 -2.190643 6.795897 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 2.672162 -7.069875 0.000000 7.623883 # cabcacabcacabcb -0.500000 -2.190643 0.000000 -2.012192 -5.704162 -6.795897 0.000000 -8.815991 0.000000 0.000000 1.000000 0.000000 5.638037 7.069875 0.000000 9.097835 # cabcacabcacac 0.696473 0.974928 0.000000 -0.659969 3.051450 -0.222521 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # cabcacabcacacb -2.024459 0.974928 0.000000 -2.012192 -8.869733 -0.222521 0.000000 -8.815990 0.000000 0.000000 1.000000 0.000000 9.042710 0.000000 0.000000 9.097835 # cabcacabcacb -2.852444 0.063333 0.000000 -2.672162 -6.679090 -2.524459 0.000000 -7.069875 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # cabcacabcb -2.188451 -0.895953 0.000000 -2.142907 -2.332951 -2.925428 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # cabcacac 0.591009 -1.152382 0.000000 -0.822968 1.436997 0.000000 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # cabcacacb -2.064962 -1.152382 0.000000 -2.142907 -3.741762 0.000000 0.000000 -3.605660 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # cabcacb -0.204495 -1.180568 0.000000 -0.659969 -2.845809 -1.123490 0.000000 -2.891515 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # cabcb 0.991978 -0.319762 0.000000 0.293714 -0.832620 -1.400969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # cac -0.222521 0.974928 0.000000 0.000000 0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # caca -0.222521 -0.974928 0.000000 0.000000 0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cacab 0.368488 -0.974928 0.000000 0.293714 -1.614452 -0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # cacabc -0.532481 0.895953 0.000000 0.293714 -1.180568 -1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # cacabca -0.532481 -0.895953 0.000000 0.293714 -1.180568 1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # cacabcab 1.269457 -0.895953 0.000000 1.189224 0.256429 1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # cacabcabc 0.091009 1.551119 0.000000 1.189224 1.038261 -0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # cacabcabca 0.091009 -1.551119 0.000000 1.189224 1.038261 0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # cacabcabcab 1.418994 -1.551119 0.000000 1.849193 -2.475258 0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # cacabcabcabc -0.327985 2.076522 0.000000 1.849193 -1.152383 -2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # cacabcabcabca -0.327985 -2.076522 0.000000 1.849193 -1.152383 2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # cacabcabcabcab 2.983956 -2.076522 0.000000 3.495130 -1.152382 2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311942 # cacabcabcabcabc 0.236976 3.627641 0.000000 3.495130 1.038261 -2.301938 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311942 # cacabcabcabcac -1.827985 1.038261 0.000000 1.849193 1.038261 -2.301938 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # cacabcabcabcaca -1.827985 -1.038261 0.000000 1.849193 1.038261 2.301938 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # cacabcabcabcacb 5.467912 1.038261 0.000000 5.475039 -4.780023 -2.301938 0.000000 -5.210330 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # cacabcabcabcb 2.983956 2.076522 0.000000 3.495130 -1.152382 -2.246980 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311942 # cacabcabcac -1.155971 1.038261 0.000000 1.189224 1.038261 0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # cacabcabcaca -1.155971 -1.038261 0.000000 1.189224 1.038261 -0.500000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # cacabcabcacab 3.483956 -1.038261 0.000000 3.495130 -2.475258 -0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # cacabcabcacabc 1.360466 3.371212 0.000000 3.495130 -1.934214 -1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311941 # cacabcabcacabca 1.360466 -3.371212 0.000000 3.495130 -1.934214 1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.142907 -3.605660 0.000000 4.311941 # cacabcabcacabcb 2.360466 3.371212 0.000000 3.992101 0.142308 -1.623490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 2.142907 3.605660 0.000000 4.311942 # cacabcabcacac -1.532481 -0.256429 0.000000 1.189224 0.256429 1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 -0.572700 0.000000 1.655971 # cacabcabcacacb 4.107446 -0.256429 0.000000 3.992101 -1.180568 1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 4.155100 -0.572700 0.000000 4.311941 # cacabcabcacb 3.483956 1.038261 0.000000 3.495130 -2.475258 0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 4.155100 0.572700 0.000000 4.311941 # cacabcabcb 1.418994 1.551119 0.000000 1.849193 -2.475258 -0.500000 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # cacabcac -1.032481 0.142308 0.000000 0.293714 0.142308 -1.623490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # cacabcaca -1.032481 -0.142308 0.000000 0.293714 0.142308 1.623490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # cacabcacab 2.097442 -0.142308 0.000000 1.849193 -1.934214 1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # cacabcacabc 1.196473 1.728574 0.000000 1.849193 0.063333 -2.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # cacabcacabca 1.196473 -1.728574 0.000000 1.849193 0.063333 2.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # cacabcacabcab 0.459497 -1.728574 0.000000 1.482938 -3.165571 2.524459 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # cacabcacabcabc -1.064962 1.436997 0.000000 1.482938 0.000000 -4.048918 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 -0.366256 4.178360 0.000000 4.311941 # cacabcacabcabca -1.064962 -1.436997 0.000000 1.482938 0.000000 4.048918 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 -0.366256 -4.178360 0.000000 4.311941 # cacabcacabcabcb 3.720933 1.436997 0.000000 3.861386 -5.178760 -4.048918 0.000000 -6.497176 0.000000 0.000000 1.000000 0.000000 6.298007 4.178360 0.000000 7.623883 # cacabcacabcac -0.605464 2.013189 0.000000 1.849193 2.013189 -1.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # cacabcacabcaca -0.605464 -2.013189 0.000000 1.849193 2.013189 1.524459 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -1.849193 -2.318815 0.000000 3.129923 # cacabcacabcacab 3.443453 -2.013189 0.000000 3.861386 -6.394475 1.524459 0.000000 -6.497175 0.000000 0.000000 1.000000 0.000000 7.193517 -2.318815 0.000000 7.623883 # cacabcacabcacac -1.951475 0.781831 0.000000 1.849193 2.447072 0.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 -2.965876 0.000000 0.000000 3.129923 # cacabcacabcacb 3.443453 2.013189 0.000000 3.861386 -6.394475 -1.524459 0.000000 -6.497175 0.000000 0.000000 1.000000 0.000000 7.193517 2.318815 0.000000 7.623883 # cacabcacabcb 0.459497 1.728574 0.000000 1.482938 -3.165571 -2.524459 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # cacabcacac -0.755002 -0.718499 0.000000 0.293714 1.358023 -0.900969 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # cacabcacacb 1.637945 -0.718499 0.000000 1.482938 -3.947403 -0.900969 0.000000 -3.923485 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # cacabcacb 2.097442 0.142308 0.000000 1.849193 -1.934214 -1.623490 0.000000 -2.318815 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # cacabcb 1.269457 0.895953 0.000000 1.189224 0.256429 -1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # cacac -0.900969 0.433884 0.000000 0.000000 0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cacaca -0.900969 -0.433884 0.000000 0.000000 0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 # cacacab 1.491978 -0.433884 0.000000 1.189224 -0.718499 -0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # cacacabc 0.591009 1.436997 0.000000 1.189224 -1.152382 0.000000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 1.031970 0.000000 1.655971 # cacacabca 0.591009 -1.436997 0.000000 1.189224 -1.152382 0.000000 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 0.822968 -1.031970 0.000000 1.655971 # cacacabcac -0.755002 1.358023 0.000000 1.189224 -0.718499 -0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 1.286845 0.000000 1.655971 # cacacabcaca -0.755002 -1.358023 0.000000 1.189224 -0.718499 0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -0.293714 -1.286845 0.000000 1.655971 # cacacabcacab 2.819963 -1.358023 0.000000 2.965876 0.433884 0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.672162 -1.286845 0.000000 3.129923 # cacacabcacabc 0.696473 3.051450 0.000000 2.965876 0.974928 -0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.659969 2.891515 0.000000 3.129923 # cacacabcacabca 0.696473 -3.051450 0.000000 2.965876 0.974928 0.222521 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.659969 -2.891515 0.000000 3.129923 # cacacabcacabcab 2.761435 -3.051450 0.000000 3.992101 -1.614452 0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 3.038417 -2.891515 0.000000 4.311941 # cacacabcacabcac -1.951475 2.447072 0.000000 2.965876 0.781831 0.623490 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -1.849193 2.318815 0.000000 3.129923 # cacacabcacabcb 2.761435 3.051450 0.000000 3.992101 -1.614452 -0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 3.038417 2.891515 0.000000 4.311941 # cacacabcacac -1.532481 0.256429 0.000000 1.189224 0.256429 -1.123490 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 -1.189224 0.572700 0.000000 1.655971 # cacacabcacacb 4.107446 0.256429 0.000000 3.992101 -1.180568 -1.123490 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 4.155099 0.572700 0.000000 4.311941 # cacacabcacb 2.819963 1.358023 0.000000 2.965876 0.433884 -0.900969 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 2.672162 1.286845 0.000000 3.129923 # cacacb 1.491978 0.433884 0.000000 1.189224 -0.718499 0.900969 0.000000 -0.572700 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # cacb 0.368488 0.974928 0.000000 0.293714 -1.614452 0.222521 0.000000 -1.286845 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 # cb -1.032481 0.781832 0.000000 -0.822968 -1.294690 -0.623490 0.000000 -1.031970 0.000000 0.000000 1.000000 0.000000 1.319939 0.000000 0.000000 1.655971 geomview-1.9.4/data/groups/230data.names0000644000175000001440000000514310462200144014673 000000000000001. p1 2. p^1 3. pm 4. pb 5. bm 6. bb 7. p2 8. p21 9. b2 10. p2/m 11. p21/m 12. b2/m 13. p2/b 14. p21/b 15. b2/b 16. p2mm 17. p21mc 18. p2cc 19. p2ma 20. p21ca 21. p2cn 22. p21mn 23. p2ba 24. p21bn 25. p2nn 26. c2mm 27. c21mc 28. c2cc 29. a2mm 30. a2ma 31. a2bm 32. a2ba 33. f2mm 34. f2dd 35. i2mm 36. i21mc 37. i2cc 38. p222 39. p2122 40. p22121 41. p212121 42. c2122 43. c222 44. f222 45. i222 46. i222- 47. p2/m2/m2/m 48. p2/n2/n2/n 49. p2/m2/c2/c 50. p2/n2/b2/a 51. p2/a21/m2/m 52. p2/a2/n21/n 53. p2/a21/c2/c 54. p2/m2/n21/c 55. p2/n21/m21/m 56. p2/m21/n21/n 57. p21/n2/c21/a 58. p2/n21/c21/c 59. p2/m21/b21/a 60. p2/m21/c21/a 61. p21/m21/n21/a 62. p21/a21/b21/c 63. c21/m2/m2/c 64. c21/a2/m2/c 65. c2/m2/m/2/m 66. c2/a2/c2/c 67. c2/a2/m2/m 68. c2/m2/c2/c 69. f2/m2/m2/m 70. f2/d2/d2/d 71. i2/m2/m2/m 72. i2/a2/m2/m 73. i2/m2/c2/c 74. i2/a2/c2/c 75. p^4 76. i^4 77. p^42m 78. p^42c 79. p^421m 80. p^421c 81. p^4m2 82. p^4c2 83. p^4y2 84. p^4n2 85. i^4m2 86. i^4c2 87. i^42m 88. i^42d 89. p4 90. p41 91. p42 92. p43 93. i4 94. i41 95. p4/m 96. p42/m 97. p4/n 98. p42/n 99. i4/m 100. i41/g 101. p4mm 102. p4gm 103. p42cm 104. p42nm 105. p4cc 106. p4nc 107. p42mc 108. p42gc 109. i4mm 110. i4cm 111. i41md 112. i41cd 113. p422 114. p4212 115. p4122 116. p41212 117. p4222 118. p42212 119. p4322 120. p43212 121. i422 122. i4122 123. p4/m2/m2/m 124. p4/m2/c2/c 125. p4/n2/g2/m 126. p4/n2/n2/c 127. p4/m21/g2/m 128. p4/m21/n2/c 129. p4/n21/m2/m 130. p4/n21/c2/c 131. p42/m2/m2/c 132. p42/m2/c2/m 133. p42/n2/g2/c 134. p42/n2/n2/m 135. p42/m21/n2/m 136. p42/m21/g2/c 137. p42/n21/m2/c 138. p42/n21/c2/m 139. i4/m2/m2/m 140. i4/m2/c2/m 141. i41/g2/m2/d 142. i41/g2/c2/d 143. p23 144. f23 145. i23 146. p213 147. i23- 148. p2/m^3 149. p2/n^3 150. f2/m^3 151. f2/d^3 152. i2/m^3 153. p21/a^3 154. i2/m^3- 155. p^43m 156. f^43m 157. i^43m 158. p^43n 159. f^43n 160. i^43d 161. p432 162. p4232 163. f432 164. f4132 165. i432 166. p4132 167. p4332 168. i4132 169. p4/m^32/n 170. p42/n^32/m 171. p42/m^32/n 172. p4/n^32/n 173. f4/m^32/m 174. f4/m^32/n 175. f41/d^32/m 176. f41/d^32/n 177. i4/m^32/m 178. i41/g^32/d 179. p3 180. p31 181. p32 182. r3 183. p^3 184. r^3 185. p31m 186. p3m 187. p31c 188. p3c 189. r3m 190. r3c 191. p312 192. p32 193. p3112 194. p312* 195. p3212 196. p322 197. r32 198. p^312/m 199. p^312/c 200. p^32/m 201. p^32/c 202. r^32/m 203. r^32/c 204. p^6 205. p^62m 206. p^62c 207. p^6m2 208. p^6c2 209. p6 210. p61 211. p65 212. p62 213. p64 214. p63 215. p6mm 216. p6cc 217. p63mc 218. p63cm 219. p6/m 220. p63/m 221. p622 222. p6122 223. p6522 224. p6222 225. p6422 226. p6322 227. p6/m2/m2/m 228. p6/m2/c2/c 229. p63/m2/m2/c 230. p63/m2/c2/m geomview-1.9.4/data/groups/fig8.dgp0000644000175000001440000000366110462200147014047 00000000000000DISCGRP (group fig8 ) (attribute Hyperbolic ) (dimn 3 ) (ngens 8 ) (gens a 0.83333337 0.28867513 -0.5 -0.16666667 -0.86602545 0.5 -0.86602545 0.86602545 0.5 0.86602545 1 -1 -0.83333337 -0.28867513 -1 1.6666667 b -0.16666667 0.86602545 -0.5 -0.16666667 -0.86602545 0.5 0.86602545 -0.86602545 0.5 0.86602545 1 -1 0.16666667 -0.86602545 -1 1.6666667 c 0.83333337 0.86602545 -0.5 0.83333337 -0.28867513 0.5 0.86602545 -0.28867513 0.5 -0.86602545 1 -1 0.16666667 0.86602545 -1 1.6666667 d -0.16666667 -0.86602545 0.5 -0.16666667 0.86602545 0.5 0.86602545 0.86602545 -0.5 0.86602545 1 1 0.16666667 0.86602545 1 1.6666667 e 0.33333331 -1.1547005 0 -0.66666669 1.1547005 1 0 1.1547005 0 0 1 0 0.66666669 1.1547005 0 1.6666667 f 0.33333331 1.1547005 0 -0.66666669 -1.1547005 1 0 -1.1547005 0 0 1 0 0.66666669 -1.1547005 0 1.6666667 g 0.83333337 -0.28867513 0.5 -0.16666667 0.86602545 0.5 -0.86602545 -0.86602545 -0.5 0.86602545 1 1 -0.83333337 0.28867513 1 1.6666667 h 0.83333337 -0.86602545 0.5 0.83333337 0.28867513 0.5 0.86602545 0.28867513 -0.5 -0.86602545 1 1 0.16666667 -0.86602545 1 1.6666667 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.4/data/groups/sample.proj.dgp0000644000175000001440000001314610462200151015436 00000000000000DISCGRP (group 1___1 ) (comment " This is a companion file to one using UHS model " ) (attribute Hyperbolic ) (dimn 3 ) (ngens 24 ) (gens a -0.97662032 -0.21497168 0 0 0.21497168 -0.97662032 0 0 0 0 1.3177842 0.85822791 0 0 0.85822791 1.3177842 b -1.3864428 -0.29766202 -0.40860799 1.0852588 0.40280136 1.3102623 0.27052286 -0.97581714 0.09639053 -0.01780214 -1.031155 0.26997912 -1.0458316 -0.89761186 -0.55083919 1.7896633 c 1.440619 -0.095338017 1.0245838 1.4609053 0.57237208 -1.2156399 0.74689615 1.1675805 0.45720959 -0.17635895 -0.88609421 -0.1590789 1.2696589 -0.7197029 1.1801648 2.1266863 d 1.2900393 0.58874869 0.39294231 1.0794582 -0.11171465 -1.3662196 -0.48098272 -1.0537461 -0.097963899 -0.0033352999 -1.1271361 -0.52919179 0.82841921 1.1014502 0.81005186 1.8856444 e 0.62794101 -0.9441911 0.30952233 0.61774665 1.0159307 2.467978 0.44843537 -2.5147812 -0.52255696 -0.27599698 0.87036377 0.32676169 -0.83635569 -2.4614196 -0.23330544 2.7950866 f -1.235863 -0.28128538 -0.28035775 -0.82769519 0.38642472 1.4608421 0.55420893 1.2611628 0.58187717 0.94090009 -0.79011309 0.92095208 1.0076023 1.4486111 0.10013379 2.0307052 g 2.4541793 1.1428077 0.65525067 2.5996842 -0.81731409 0.64173985 0.30177477 -0.41340092 -0.45397869 -0.63223839 0.80487323 -0.50362974 2.4283934 1.0571494 0.41017345 2.8605771 h 0.30005077 -2.5304751 0.75347096 2.4619207 -0.32548729 -0.53985906 -0.82002467 0.26425403 0.96668142 1.6979145 -0.88937283 -1.8995712 -0.3611722 -2.9287653 1.0154521 3.2770803 i -1.5299816 0.3544372 -1.1611909 -1.6777465 -0.24929789 1.1667236 -0.50917745 -0.82622945 1.6921601 -0.85007215 -0.15483063 1.6155499 2.0655265 -1.0997692 0.79473162 2.6659875 j -0.33836097 -0.36984065 -0.88202769 -0.17100596 -2.5748286 0.098552622 0.47682229 -2.4221509 1.3748474 1.0360756 -0.66142303 1.5495608 2.7630482 0.46898544 -0.66544175 3.0491304 k -0.22306508 2.5873678 -0.55957294 -2.4611688 0.38237992 -0.01674323 0.96282762 0.2711674 0.96390945 -0.27606332 -0.30051211 0.30925691 0.35368595 -2.402283 0.57486212 2.6882195 l 1.1465005 0.54038453 -1.0798022 -1.3313345 -0.063350499 -1.5097585 1.8126929 2.137578 -0.3660062 -1.0439892 -0.25081176 0.53551894 -0.67263454 -1.6313491 1.8747625 2.7619689 A -0.97662026 0.21497166 0 0 -0.21497166 -0.9766202 0 0 0 0 1.3177842 -0.85822791 0 0 -0.85822791 1.3177842 B -1.3864427 0.40280119 0.096390538 1.0458313 -0.29766193 1.3102624 -0.017802164 0.8976118 -0.4086079 0.27052283 -1.031155 0.55083907 -1.0852586 0.97581714 -0.26997912 1.7896631 C 1.4406192 0.57237226 0.45720965 -1.2696588 -0.095338285 -1.2156401 -0.17635888 0.71970302 1.0245839 0.74689627 -0.88609421 -1.1801649 -1.4609057 -1.1675806 0.15907888 2.1266866 D 1.2900394 -0.11171502 -0.097963981 -0.82841969 0.58874887 -1.3662201 -0.0033354163 -1.1014504 0.39294237 -0.48098293 -1.1271362 -0.81005198 -1.0794584 1.0537466 0.52919197 1.8856449 E 0.62794113 1.0159302 -0.52255696 0.83635473 -0.94419086 2.4679773 -0.27599686 2.4614189 0.30952233 0.44843531 0.87036383 0.23330536 -0.61774635 2.5147805 -0.3267616 2.7950857 F -1.235863 0.38642484 0.58187723 -1.0076026 -0.28128546 1.4608424 0.94090027 -1.4486114 -0.28035778 0.55420905 -0.79011309 -0.10013387 0.82769519 -1.261163 -0.9209522 2.0307055 G 2.4541783 -0.81731403 -0.45397839 -2.4283924 1.1428076 0.6417399 -0.63223839 -1.0571494 0.65525049 0.30177474 0.80487323 -0.4101733 -2.5996838 0.41340089 0.50362951 2.8605766 H 0.30005026 -0.32548726 0.9666813 0.36117125 -2.5304751 -0.53985912 1.6979146 2.9287655 0.7534709 -0.82002467 -0.88937283 -1.015452 -2.4619207 -0.26425406 1.8995712 3.2770801 I -1.5299816 -0.24929792 1.6921606 -2.0655265 0.35443732 1.1667237 -0.85007226 1.0997694 -1.1611909 -0.50917745 -0.15483057 -0.79473162 1.6777468 0.82622957 -1.6155503 2.665988 J -0.3383607 -2.5748267 1.3748462 -2.7630458 -0.36984065 0.098552689 1.0360756 -0.46898535 -0.88202769 0.47682196 -0.66142285 0.66544139 0.17100574 2.4221487 -1.5495596 3.0491281 K -0.22306508 0.38237989 0.96390939 -0.35368603 2.5873671 -0.016743302 -0.27606314 2.402282 -0.55957282 0.96282774 -0.30051219 -0.57486194 2.4611681 -0.27116752 -0.3092567 2.6882186 L 1.1465006 -0.06335026 -0.36600628 0.67263442 0.54038453 -1.5097582 -1.0439894 1.6313488 -1.0798022 1.8126929 -0.25081161 -1.8747625 1.3313345 -2.1375778 -0.53551924 2.7619686 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.4/data/groups/tetra2.dgp0000644000175000001440000000152310462200151014401 00000000000000DISCGRP (group tetrahedral ) (comment "group of isometries of a tetrahedron." ) (attribute spherical ) (attribute finite ) (dimn 2 ) (ngens 3 ) (gens a 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 b 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 c 0.000000 0.707107 0.707107 0.000000 0.707107 0.500000 -0.500000 0.000000 0.707107 -0.500000 0.500000 0.000000 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.4/data/groups/101a.dgp0000644000175000001440000000551610462200144013652 00000000000000DISCGRP (group 101a ) (attribute Hyperbolic ) (dimn 3 ) (ngens 12 ) (gens a 0.66237473 -0.42507491 0.88008505 -0.62767714 -0.65384501 -0.94948018 0.65384501 -0.86979264 0.47488055 -2.0088105 -0.03946 -1.8062084 -0.30292767 2.0291677 -0.4512428 2.3265655 b 0.66237473 -0.65384501 0.47488055 0.30292767 -0.42507491 -0.94948018 -2.0088105 -2.0291677 0.88008505 0.65384501 -0.03946 0.4512428 0.62767714 0.86979264 1.8062084 2.3265655 c 0.36602539 -0.06939514 0.93060488 -0.06939514 1.9306049 -0.36602539 -0.93060488 1.9306049 0.93060488 0.93060488 -0.36602539 0.93060488 1.9306049 0.06939514 -0.93060488 2.3660254 d 0.36602539 1.9306049 0.93060488 -1.9306049 -0.06939514 -0.36602539 0.93060488 -0.06939514 0.93060488 -0.93060488 -0.36602539 0.93060488 0.06939514 -1.9306049 -0.93060488 2.3660254 e -0.77675986 -1.0140597 1.9250748 -2.0826871 0.75717026 -0.28157547 0.91654527 -0.70188802 -0.21218036 0.79634935 0.62844467 -0.27227831 0.47083235 0.86126298 -1.985173 2.4298906 f -0.77675986 0.75717026 -0.21218036 -0.47083235 -1.0140597 -0.28157547 0.79634935 -0.86126298 1.9250748 0.91654527 0.62844467 1.985173 2.0826871 0.70188802 0.27227831 2.4298906 g 1.8453875 0.59374714 0.074157573 -1.6623747 -0.33685777 -1.2224727 0.18854263 0.80216014 1.280808 0.4645882 -1.2224727 -1.5332158 -2.0394599 -1.0309303 0.73176992 2.5995579 h 1.8453875 -0.33685777 1.280808 2.0394599 0.59374714 -1.2224727 0.4645882 1.0309303 0.074157573 0.18854263 -1.2224727 -0.73176992 1.6623747 -0.80216014 1.5332158 2.5995579 i -0.39831513 -0.91790462 -0.032289729 0.047397759 -0.98729986 0.46289459 1.943305 -1.991348 -0.37291476 0.1466748 -1.7389402 1.4780027 0.52199733 -0.27988189 -2.4086075 2.6743608 j -0.39831513 -0.98729986 -0.37291476 -0.52199733 -0.91790462 0.46289459 0.1466748 0.27988189 -0.032289729 1.943305 -1.7389402 2.4086075 -0.047397759 1.991348 -1.4780027 2.6743608 k 0.31145737 -1.5741575 -1.4597725 1.9250748 -0.41478261 0.31145737 -0.94018298 0.39114487 1.2028831 -0.41478261 -1.3003975 1.5198705 0.84615499 -1.3217497 -1.9250748 2.6774828 l 0.31145737 -0.41478261 1.2028831 -0.84615499 -1.5741575 0.31145737 -0.41478261 1.3217497 -1.4597725 -0.94018298 -1.3003975 1.9250748 -1.9250748 -0.39114487 -1.5198705 2.6774828 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.4/data/groups/101b.dgp0000644000175000001440000000643610462200144013655 00000000000000DISCGRP (group 101b ) (attribute Hyperbolic ) (dimn 3 ) (ngens 14 ) (gens a 1.3660254 0 0 -0.93060488 0 -0.36602539 0.93060488 0 0 -0.93060488 -0.36602539 0 -0.93060488 0 0 1.3660254 b 1.3660254 0 0 0.93060488 0 -0.36602539 -0.93060488 0 0 0.93060488 -0.36602539 0 0.93060488 0 0 1.3660254 c -0.41143784 0.35355341 0.88681328 -0.28411075 -0.35355341 0.91143787 -0.76204914 0.73241919 -0.88681328 -0.76204914 0.088562168 -0.61237246 0.28411075 0.73241919 -0.61237246 1.4114379 d -0.41143784 -0.35355341 -0.88681328 -0.28411075 0.35355341 0.91143787 -0.76204914 -0.73241919 0.88681328 -0.76204914 0.088562168 0.61237246 0.28411075 -0.73241919 0.61237246 1.4114379 e -0.29763967 0.95468229 -0.0044223098 -0.00521645 1.1645558 0.37555724 1.1271179 -1.3295217 0.64153272 0.19651297 -0.74158263 0.01124354 -0.9253884 -0.30179277 -0.90573674 1.6636651 f -0.29763967 -1.1645558 -0.64153272 0.9253884 -0.95468229 0.37555724 0.19651297 -0.30179277 0.0044223098 1.1271179 -0.74158263 -0.90573674 0.00521645 -1.3295217 0.01124354 1.6636651 g -0.29763967 1.1645558 0.64153272 0.9253884 0.95468229 0.37555724 0.19651297 0.30179277 -0.0044223098 1.1271179 -0.74158263 0.90573674 0.00521645 1.3295217 -0.01124354 1.6636651 h -0.29763967 -0.95468229 0.0044223098 -0.00521645 -1.1645558 0.37555724 1.1271179 1.3295217 -0.64153272 0.19651297 -0.74158263 -0.01124354 -0.9253884 0.30179277 0.90573674 1.6636651 i -1.0786567 0.14367995 0.24085826 -0.49209425 -0.14367995 -0.21263124 1.3199079 -0.89889526 -0.24085826 1.3199079 1.2126312 -1.5068656 0.49209425 -0.89889526 -1.5068656 2.0786567 j -1.0786567 -0.14367995 -0.24085826 -0.49209425 0.14367995 -0.21263124 1.3199079 0.89889526 0.24085826 1.3199079 1.2126312 1.5068656 0.49209425 0.89889526 1.5068656 2.0786567 k -0.82642937 -0.19862992 1.7812862 -1.7015934 -0.69586319 -1.042776 0.36134577 -0.83796078 0.6536147 -0.56925911 0.67675066 -0.45744896 0.77098858 0.67148465 -1.6617892 2.1924548 l -0.82642937 0.69586319 -0.6536147 -0.77098858 0.19862992 -1.042776 -0.56925911 0.67148465 -1.7812862 0.36134577 0.67675066 -1.6617892 1.7015934 -0.83796078 -0.45744896 2.1924548 K -0.82642955 -0.69586337 0.6536147 -0.77098894 -0.19862986 -1.0427761 -0.56925905 -0.67148447 1.781286 0.36134571 0.67675048 1.6617888 1.7015933 0.83796078 0.45744881 2.1924546 L -0.82642937 0.19863003 -1.7812862 -1.7015934 0.69586331 -1.0427763 0.36134583 0.83796102 -0.65361476 -0.56925905 0.67675042 0.45744881 0.77098846 -0.67148483 1.6617889 2.1924548 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.4/data/groups/borrom2.dgp0000644000175000001440000000105610462200145014566 00000000000000DISCGRP (group borrom2 ) (comment " Order 2 Borromean orbifold. " ) (attribute Euclidean ) (display zcull) (enumdepth 4 ) (enumdist 10.0 ) (dimn 3 ) (ngens 6 ) (gens a -1 0 0 0 0 -1 0 0 0 0 1 0 1 0 0 1 d -1 0 0 0 0 -1 0 0 0 0 1 0 -1 0 0 1 b 1 0 0 0 0 -1 0 0 0 0 -1 0 0 1 0 1 e 1 0 0 0 0 -1 0 0 0 0 -1 0 0 -1 0 1 c -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 1 1 f -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 -1 1 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) (camgeom { = OFF 5 2 5 0 0 0 -0.1 0 0.5 0.1 0 0.5 0 -0.1 0.5 0 0.1 0.5 3 0 1 2 200 200 0 3 0 3 4 0 200 200 } ) geomview-1.9.4/data/groups/borrom3.dgp0000644000175000001440000000552110462200145014570 00000000000000DISCGRP (group borrom3 ) (attribute Hyperbolic ) (dimn 3 ) (ngens 12 ) (gens a -1.6513901 1.15139 0 -1.74722 -1.15139 -0.5 0 -0.75874501 0 0 1 0 1.74722 -0.75874501 0 2.1513901 b -1.6513901 1.15139 0 1.74722 -1.15139 -0.5 0 0.75874501 0 0 1 0 -1.74722 0.75874501 0 2.1513901 c 1 0 0 0 0 -1.6513901 1.15139 -1.74722 0 -1.15139 -0.5 -0.75874501 0 1.74722 -0.75874501 2.1513901 d 1 0 0 0 0 -1.6513901 1.15139 1.74722 0 -1.15139 -0.5 0.75874501 0 -1.74722 0.75874501 2.1513901 e -0.5 0 -1.15139 -0.75874501 0 1 0 0 1.15139 0 -1.6513901 -1.74722 -0.75874501 0 1.74722 2.1513901 f -0.5 0 -1.15139 0.75874501 0 1 0 0 1.15139 0 -1.6513901 1.74722 0.75874501 0 -1.74722 2.1513901 g -1.6513901 -1.15139 0 -1.74722 1.15139 -0.5 0 0.75874501 0 0 1 0 1.74722 0.75874501 0 2.1513901 h -1.6513901 -1.15139 0 1.74722 1.15139 -0.5 0 -0.75874501 0 0 1 0 -1.74722 -0.75874501 0 2.1513901 i 1 0 0 0 0 -1.6513901 -1.15139 -1.74722 0 1.15139 -0.5 0.75874501 0 1.74722 0.75874501 2.1513901 j 1 0 0 0 0 -1.6513901 -1.15139 1.74722 0 1.15139 -0.5 -0.75874501 0 -1.74722 -0.75874501 2.1513901 k -0.5 0 1.15139 0.75874501 0 1 0 0 -1.15139 0 -1.6513901 -1.74722 0.75874501 0 1.74722 2.1513901 l -0.5 0 1.15139 -0.75874501 0 1 0 0 -1.15139 0 -1.6513901 1.74722 -0.75874501 0 -1.74722 2.1513901 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) geomview-1.9.4/data/groups/borrom4.dgp0000644000175000001440000000670010462200145014571 00000000000000DISCGRP (group borrom4 ) (comment " This is a test of the new discrete group library. " ) (attribute Hyperbolic ) # following command is dangerous unless the viewer is in hyperbolic mode (display centercam ) (display zcull ) (display drawdirdom ) (enumdepth 2 ) (enumdist 10.0 ) (dimn 3 ) (ngens 12 ) (geom : dggeomhandle ) (wafile borrom4.wa) (gens a -1.618033988749887 1.618033988749892 0 -2.058171027271484 -1.618033988749893 0 0 -1.272019649514066 0 0 1. 0 2.058171027271483 -1.272019649514065 0 2.618033988749887 d -1.618033988749887 1.618033988749892 0 2.058171027271484 -1.618033988749893 0 0 1.272019649514066 0 0 1. 0 -2.058171027271483 1.272019649514065 0 2.618033988749887 b 1. 0 0 0 0 -1.618033988749886 1.618033988749892 -2.058171027271483 0 -1.618033988749892 0 -1.272019649514065 0 2.058171027271483 -1.272019649514066 2.618033988749886 e 1. 0 0 0 0 -1.618033988749886 1.618033988749892 2.058171027271483 0 -1.618033988749892 0 1.272019649514065 0 -2.058171027271483 1.272019649514066 2.618033988749886 c 0 0 -1.618033988749892 -1.272019649514065 0 1. 0 0 1.618033988749892 0 -1.618033988749886 -2.058171027271483 -1.272019649514066 0 2.058171027271483 2.618033988749886 f 0 0 -1.618033988749892 1.272019649514065 0 1. 0 0 1.618033988749892 0 -1.618033988749886 2.058171027271483 1.272019649514066 0 -2.058171027271483 2.618033988749886 A -1.618033988749886 -1.618033988749892 0 -2.058171027271484 1.618033988749892 0 0 1.272019649514066 0 0 1. 0 2.058171027271483 1.272019649514065 0 2.618033988749886 D -1.618033988749886 -1.618033988749892 0 2.058171027271484 1.618033988749892 0 0 -1.272019649514066 0 0 1. 0 -2.058171027271483 -1.272019649514065 0 2.618033988749886 B 1. 0 0 0 0 -1.618033988749885 -1.618033988749892 -2.058171027271483 0 1.618033988749891 0 1.272019649514065 0 2.058171027271482 1.272019649514065 2.618033988749886 E 1. 0 0 0 0 -1.618033988749885 -1.618033988749892 2.058171027271483 0 1.618033988749891 0 -1.272019649514065 0 -2.058171027271482 -1.272019649514065 2.618033988749886 C 0 0 1.618033988749891 1.272019649514064 0 1. 0 0 -1.618033988749892 0 -1.618033988749885 -2.058171027271483 1.272019649514065 0 2.058171027271482 2.618033988749885 F 0 0 1.618033988749891 -1.272019649514064 0 1. 0 0 -1.618033988749892 0 -1.618033988749885 2.058171027271483 -1.272019649514065 0 -2.058171027271482 2.618033988749885 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) (camgeom { = OFF 5 2 5 0 0 0 -0.1 0 0.5 0.1 0 0.5 0 -0.1 0.5 0 0.1 0.5 3 0 1 2 200 200 0 1 3 0 3 4 0 200 200 1 } ) geomview-1.9.4/data/groups/hook.off0000644000175000001440000000102510462200147014142 00000000000000OFF 21 15 0 0 0 0 #0 0.2 0 0 #1 0.25 0 0 #2 0 0.1 0 #3 0.1 0.1 0 #4 0.2 0.1 0 #5 0 0.5 0 #6 0.1 0.5 0 #7 0 0 0.15 #8 0.2 0 0.15 #9 0.25 0 0.15 #10 0 0.1 0.15 #11 0.1 0.1 0.15 #12 0.2 0.1 0.15 #13 0 0.5 0.15 #14 0.1 0.5 0.15 #15 0.2 0 0.25 #16 0.25 0 0.25 #17 0.25 0.1 0.25 #18 0.2 0.1 0.25 #19 0.25 0.1 0 #20 4 0 1 5 3 4 3 4 7 6 4 8 9 13 11 4 11 12 15 14 4 0 6 14 8 4 7 4 12 15 4 0 2 10 8 4 16 17 18 19 0 1 0 1 4 16 17 10 9 4 6 7 15 14 4 4 5 13 12 4 1 2 20 5 4 2 17 18 20 1 0 0 1 4 5 20 18 19 4 13 19 16 9 geomview-1.9.4/data/groups/good_klein_quick.dgp0000644000175000001440000000364310462200147016520 00000000000000{ appearance { +edge -face } DISCGRP (group " 3trans " ) (comment " klein bottle for shape of space flythroughs " ) (attribute euclidean ) #(display zcull ) (geom < hook.off ) (display drawgeom ) #(display drawdirdom) #(display centercam) (dimn 3 ) (wafile klein.wa) (ngens 6 ) (gens a 1 0 0 0 0 -1 0 0 0 0 1 0 1 0 0 1 b 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 c 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 A 1 0 0 0 0 -1 0 0 0 0 1 0 -1 0 0 1 B 1 0 0 0 0 1 0 0 0 0 1 0 0 -1 0 1 C 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -1 1 ) (cpoint 0.000000 0.000000 0.000000 1.000000 ) (enumdepth 4) (enumdist 10 ) (scale 0.2 ) (geom { . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: geomview-1.9.4/aclocal.m40000644000175000001440000101611410665240464012137 00000000000000# generated automatically by aclocal 1.10 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_if(m4_PACKAGE_VERSION, [2.61],, [m4_fatal([this file was generated for autoconf 2.61. You have another version of autoconf. If you want to use that, you should regenerate the build system entirely.], [63])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # serial 51 AC_PROG_LIBTOOL # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) # ----------------------------------------------------------- # If this macro is not defined by Autoconf, define it here. m4_ifdef([AC_PROVIDE_IFELSE], [], [m4_define([AC_PROVIDE_IFELSE], [m4_ifdef([AC_PROVIDE_$1], [$2], [$3])])]) # AC_PROG_LIBTOOL # --------------- AC_DEFUN([AC_PROG_LIBTOOL], [AC_REQUIRE([_AC_PROG_LIBTOOL])dnl dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. AC_PROVIDE_IFELSE([AC_PROG_CXX], [AC_LIBTOOL_CXX], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX ])]) dnl And a similar setup for Fortran 77 support AC_PROVIDE_IFELSE([AC_PROG_F77], [AC_LIBTOOL_F77], [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 ])]) dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [ifdef([AC_PROG_GCJ], [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([A][M_PROG_GCJ], [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([LT_AC_PROG_GCJ], [define([LT_AC_PROG_GCJ], defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) ])])# AC_PROG_LIBTOOL # _AC_PROG_LIBTOOL # ---------------- AC_DEFUN([_AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl # Prevent multiple expansion define([AC_PROG_LIBTOOL], []) ])# _AC_PROG_LIBTOOL # AC_LIBTOOL_SETUP # ---------------- AC_DEFUN([AC_LIBTOOL_SETUP], [AC_PREREQ(2.50)dnl AC_REQUIRE([AC_ENABLE_SHARED])dnl AC_REQUIRE([AC_ENABLE_STATIC])dnl AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_LD])dnl AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl AC_REQUIRE([AC_PROG_NM])dnl AC_REQUIRE([AC_PROG_LN_S])dnl AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! AC_REQUIRE([AC_OBJEXT])dnl AC_REQUIRE([AC_EXEEXT])dnl dnl AC_LIBTOOL_SYS_MAX_CMD_LEN AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE AC_LIBTOOL_OBJDIR AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_PROG_ECHO_BACKSLASH case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e 1s/^X//' [sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] # Same as above, but do not quote variable references. [double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" AC_CHECK_TOOL(AR, ar, false) AC_CHECK_TOOL(RANLIB, ranlib, :) AC_CHECK_TOOL(STRIP, strip, :) old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then AC_PATH_MAGIC fi ;; esac AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], enable_win32_dll=yes, enable_win32_dll=no) AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes AC_ARG_WITH([pic], [AC_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=default # Check if we have a version mismatch between libtool.m4 and ltmain.sh. # # Note: This should be in AC_LIBTOOL_SETUP, _after_ $ltmain have been defined. # We also should do it _before_ AC_LIBTOOL_LANG_C_CONFIG that actually # calls AC_LIBTOOL_CONFIG and creates libtool. # _LT_VERSION_CHECK # Use C for the default configuration in the libtool script tagname= AC_LIBTOOL_LANG_C_CONFIG _LT_AC_TAGCONFIG ])# AC_LIBTOOL_SETUP # _LT_VERSION_CHECK # ----------------- AC_DEFUN([_LT_VERSION_CHECK], [AC_MSG_CHECKING([for correct ltmain.sh version]) if test "x$ltmain" = "x" ; then AC_MSG_RESULT(no) AC_MSG_ERROR([ *** @<:@Gentoo@:>@ sanity check failed! *** *** \$ltmain is not defined, please check the patch for consistency! *** ]) fi gentoo_lt_version="1.5.24" gentoo_ltmain_version=`sed -n '/^[[ ]]*VERSION=/{s/^[[ ]]*VERSION=//;p;q;}' "$ltmain"` if test "x$gentoo_lt_version" != "x$gentoo_ltmain_version" ; then AC_MSG_RESULT(no) AC_MSG_ERROR([ *** @<:@Gentoo@:>@ sanity check failed! *** *** libtool.m4 and ltmain.sh have a version mismatch! *** *** (libtool.m4 = $gentoo_lt_version, ltmain.sh = $gentoo_ltmain_version) *** Please run: libtoolize --copy --force if appropriate, please contact the maintainer of this package (or your distribution) for help. ]) else AC_MSG_RESULT(yes) fi ])# _LT_VERSION_CHECK # _LT_AC_SYS_COMPILER # ------------------- AC_DEFUN([_LT_AC_SYS_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_AC_SYS_COMPILER # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. AC_DEFUN([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ]) # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. AC_DEFUN([_LT_COMPILER_BOILERPLATE], [AC_REQUIRE([LT_AC_PROG_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. AC_DEFUN([_LT_LINKER_BOILERPLATE], [AC_REQUIRE([LT_AC_PROG_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* ])# _LT_LINKER_BOILERPLATE # _LT_AC_SYS_LIBPATH_AIX # ---------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_LINK_IFELSE(AC_LANG_PROGRAM,[ lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_AC_SYS_LIBPATH_AIX # _LT_AC_SHELL_INIT(ARG) # ---------------------- AC_DEFUN([_LT_AC_SHELL_INIT], [ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], [AC_DIVERT_PUSH(NOTICE)]) $1 AC_DIVERT_POP ])# _LT_AC_SHELL_INIT # _LT_AC_PROG_ECHO_BACKSLASH # -------------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], [_LT_AC_SHELL_INIT([ # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` ;; esac echo=${ECHO-echo} if test "X[$]1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} fi if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string=`eval $cmd`) 2>/dev/null && echo_test_string=`eval $cmd` && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL [$]0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL [$]0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "[$]0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" fi AC_SUBST(ECHO) ])])# _LT_AC_PROG_ECHO_BACKSLASH # _LT_AC_LOCK # ----------- AC_DEFUN([_LT_AC_LOCK], [AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) LD="${LD-ld} -64" ;; esac ;; esac fi rm -rf conftest* ;; AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], [*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; ]) esac need_locks="$enable_libtool_lock" ])# _LT_AC_LOCK # AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_REQUIRE([LT_AC_PROG_SED]) AC_CACHE_CHECK([$1], [$2], [$2=no ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $rm conftest* ]) if test x"[$]$2" = xyes; then ifelse([$5], , :, [$5]) else ifelse([$6], , :, [$6]) fi ])# AC_LIBTOOL_COMPILER_OPTION # AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ------------------------------------------------------------ # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then ifelse([$4], , :, [$4]) else ifelse([$5], , :, [$5]) fi ])# AC_LIBTOOL_LINKER_OPTION # AC_LIBTOOL_SYS_MAX_CMD_LEN # -------------------------- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [# find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi ])# AC_LIBTOOL_SYS_MAX_CMD_LEN # _LT_AC_CHECK_DLFCN # ------------------ AC_DEFUN([_LT_AC_CHECK_DLFCN], [AC_CHECK_HEADERS(dlfcn.h)dnl ])# _LT_AC_CHECK_DLFCN # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # --------------------------------------------------------------------- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); }] EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_AC_TRY_DLOPEN_SELF # AC_LIBTOOL_DLOPEN_SELF # ---------------------- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi ])# AC_LIBTOOL_DLOPEN_SELF # AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) # --------------------------------- # Check to see if options -c and -o are simultaneously supported by compiler AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* ]) ])# AC_LIBTOOL_PROG_CC_C_O # AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) # ----------------------------------------- # Check to see if we can do hard links to lock some files if needed AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_REQUIRE([_LT_AC_LOCK])dnl hard_links="nottested" if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi ])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS # AC_LIBTOOL_OBJDIR # ----------------- AC_DEFUN([AC_LIBTOOL_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir ])# AC_LIBTOOL_OBJDIR # AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) # ---------------------------------------------- # Check hardcoding attributes. AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_AC_TAGVAR(hardcode_action, $1)= if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existant directories. if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_AC_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_AC_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_AC_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi ])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH # AC_LIBTOOL_SYS_LIB_STRIP # ------------------------ AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], [striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi ])# AC_LIBTOOL_SYS_LIB_STRIP # AC_LIBTOOL_SYS_DYNAMIC_LINKER # ----------------------------- # PORTME Fill in your ld.so characteristics AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_MSG_CHECKING([dynamic linker characteristics]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" m4_if($1,[],[ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` else lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` sys_lib_search_path_spec=`echo $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[123]]*) objformat=aout ;; *) objformat=elf ;; esac fi # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[[3-9]]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER # _LT_AC_TAGCONFIG # ---------------- AC_DEFUN([_LT_AC_TAGCONFIG], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_ARG_WITH([tags], [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], [include additional configurations @<:@automatic@:>@])], [tagnames="$withval"]) if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then AC_MSG_WARN([output file `$ofile' does not exist]) fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) else AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) fi fi if test -z "$LTCFLAGS"; then eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in "") ;; *) AC_MSG_ERROR([invalid tag name: $tagname]) ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then AC_MSG_ERROR([tag name \"$tagname\" already exists]) fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_LIBTOOL_LANG_CXX_CONFIG else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then AC_LIBTOOL_LANG_F77_CONFIG else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then AC_LIBTOOL_LANG_GCJ_CONFIG else tagname="" fi ;; RC) AC_LIBTOOL_LANG_RC_CONFIG ;; *) AC_MSG_ERROR([Unsupported tag name: $tagname]) ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" AC_MSG_ERROR([unable to update list of available tagged configurations.]) fi fi ])# _LT_AC_TAGCONFIG # AC_LIBTOOL_DLOPEN # ----------------- # enable checks for dlopen support AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_DLOPEN # AC_LIBTOOL_WIN32_DLL # -------------------- # declare package support for building win32 DLLs AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_WIN32_DLL # AC_ENABLE_SHARED([DEFAULT]) # --------------------------- # implement the --enable-shared flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_SHARED], [define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([shared], [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]AC_ENABLE_SHARED_DEFAULT) ])# AC_ENABLE_SHARED # AC_DISABLE_SHARED # ----------------- # set the default shared flag to --disable-shared AC_DEFUN([AC_DISABLE_SHARED], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_SHARED(no) ])# AC_DISABLE_SHARED # AC_ENABLE_STATIC([DEFAULT]) # --------------------------- # implement the --enable-static flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_STATIC], [define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([static], [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]AC_ENABLE_STATIC_DEFAULT) ])# AC_ENABLE_STATIC # AC_DISABLE_STATIC # ----------------- # set the default static flag to --disable-static AC_DEFUN([AC_DISABLE_STATIC], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_STATIC(no) ])# AC_DISABLE_STATIC # AC_ENABLE_FAST_INSTALL([DEFAULT]) # --------------------------------- # implement the --enable-fast-install flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_FAST_INSTALL], [define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([fast-install], [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) ])# AC_ENABLE_FAST_INSTALL # AC_DISABLE_FAST_INSTALL # ----------------------- # set the default to --disable-fast-install AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_FAST_INSTALL(no) ])# AC_DISABLE_FAST_INSTALL # AC_LIBTOOL_PICMODE([MODE]) # -------------------------- # implement the --with-pic flag # MODE is either `yes' or `no'. If omitted, it defaults to `both'. AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl pic_mode=ifelse($#,1,$1,default) ])# AC_LIBTOOL_PICMODE # AC_PROG_EGREP # ------------- # This is predefined starting with Autoconf 2.54, so this conditional # definition can be removed once we require Autoconf 2.54 or later. m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], [AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi]) EGREP=$ac_cv_prog_egrep AC_SUBST([EGREP]) ])]) # AC_PATH_TOOL_PREFIX # ------------------- # find a file program which can recognize shared library AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="ifelse([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi ])# AC_PATH_TOOL_PREFIX # AC_PATH_MAGIC # ------------- # find a file program which can recognize a shared library AC_DEFUN([AC_PATH_MAGIC], [AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# AC_PATH_MAGIC # AC_PROG_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([AC_PROG_LD], [AC_ARG_WITH([gnu-ld], [AC_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no]) AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown ])# AC_DEPLIBS_CHECK_METHOD # AC_PROG_NM # ---------- # find the pathname to a BSD-compatible name lister AC_DEFUN([AC_PROG_NM], [AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) NM="$lt_cv_path_NM" ])# AC_PROG_NM # AC_CHECK_LIBM # ------------- # check for math library AC_DEFUN([AC_CHECK_LIBM], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac ])# AC_CHECK_LIBM # AC_LIBLTDL_CONVENIENCE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-convenience to the configure arguments. Note that # AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, # it is assumed to be `libltdl'. LIBLTDL will be prefixed with # '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' # (note the single quotes!). If your package is not flat and you're not # using automake, define top_builddir and top_srcdir appropriately in # the Makefiles. AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl case $enable_ltdl_convenience in no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; "") enable_ltdl_convenience=yes ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; esac LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_CONVENIENCE # AC_LIBLTDL_INSTALLABLE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl installable library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-install to the configure arguments. Note that # AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, # and an installed libltdl is not found, it is assumed to be `libltdl'. # LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with # '${top_srcdir}/' (note the single quotes!). If your package is not # flat and you're not using automake, define top_builddir and top_srcdir # appropriately in the Makefiles. # In the future, this macro may have to be called after AC_PROG_LIBTOOL. AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_CHECK_LIB(ltdl, lt_dlinit, [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], [if test x"$enable_ltdl_install" = xno; then AC_MSG_WARN([libltdl not installed, but installation disabled]) else enable_ltdl_install=yes fi ]) if test x"$enable_ltdl_install" = x"yes"; then ac_configure_args="$ac_configure_args --enable-ltdl-install" LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) else ac_configure_args="$ac_configure_args --enable-ltdl-install=no" LIBLTDL="-lltdl" LTDLINCL= fi # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_INSTALLABLE # AC_LIBTOOL_CXX # -------------- # enable support for C++ libraries AC_DEFUN([AC_LIBTOOL_CXX], [AC_REQUIRE([_LT_AC_LANG_CXX]) ])# AC_LIBTOOL_CXX # _LT_AC_LANG_CXX # --------------- AC_DEFUN([_LT_AC_LANG_CXX], [AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ])# _LT_AC_LANG_CXX # _LT_AC_PROG_CXXCPP # ------------------ AC_DEFUN([_LT_AC_PROG_CXXCPP], [ AC_REQUIRE([AC_PROG_CXX]) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP fi ])# _LT_AC_PROG_CXXCPP # AC_LIBTOOL_F77 # -------------- # enable support for Fortran 77 libraries AC_DEFUN([AC_LIBTOOL_F77], [AC_REQUIRE([_LT_AC_LANG_F77]) ])# AC_LIBTOOL_F77 # _LT_AC_LANG_F77 # --------------- AC_DEFUN([_LT_AC_LANG_F77], [AC_REQUIRE([AC_PROG_F77]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) ])# _LT_AC_LANG_F77 # AC_LIBTOOL_GCJ # -------------- # enable support for GCJ libraries AC_DEFUN([AC_LIBTOOL_GCJ], [AC_REQUIRE([_LT_AC_LANG_GCJ]) ])# AC_LIBTOOL_GCJ # _LT_AC_LANG_GCJ # --------------- AC_DEFUN([_LT_AC_LANG_GCJ], [AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) ])# _LT_AC_LANG_GCJ # AC_LIBTOOL_RC # ------------- # enable support for Windows resource files AC_DEFUN([AC_LIBTOOL_RC], [AC_REQUIRE([LT_AC_PROG_RC]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) ])# AC_LIBTOOL_RC # AC_LIBTOOL_LANG_C_CONFIG # ------------------------ # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) AC_DEFUN([_LT_AC_LANG_C_CONFIG], [lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_C_CONFIG # AC_LIBTOOL_LANG_CXX_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], [AC_LANG_PUSH(C++) AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_AC_TAGVAR(no_undefined_flag, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Dependencies to place before and after the object being linked: _LT_AC_TAGVAR(predep_objects, $1)= _LT_AC_TAGVAR(postdep_objects, $1)= _LT_AC_TAGVAR(predeps, $1)= _LT_AC_TAGVAR(postdeps, $1)= _LT_AC_TAGVAR(compiler_lib_search_path, $1)= # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration AC_PROG_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_AC_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes ; then lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[[12]]*) # C++ shared libraries reported to be fairly broken before switch to ELF _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_AC_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; hpux9*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc*) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC*) # Portland Group C++ compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; osf3*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ $rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. # So that behaviour is only enabled if SCOABSPATH is set to a # non-empty value in the environment. Most likely only useful for # creating official distributions of packages. # This is a hack until libtool officially supports absolute path # names for shared libraries. _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_AC_TAGVAR(GCC, $1)="$GXX" _LT_AC_TAGVAR(LD, $1)="$LD" AC_LIBTOOL_POSTDEP_PREDEP($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld ])# AC_LIBTOOL_LANG_CXX_CONFIG # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) # ------------------------------------ # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_AC_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac ])# AC_LIBTOOL_POSTDEP_PREDEP # AC_LIBTOOL_LANG_F77_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)]) AC_DEFUN([_LT_AC_LANG_F77_CONFIG], [AC_REQUIRE([AC_PROG_F77]) AC_LANG_PUSH(Fortran 77) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_AC_TAGVAR(no_undefined_flag, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_AC_TAGVAR(GCC, $1)="$G77" _LT_AC_TAGVAR(LD, $1)="$LD" AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_F77_CONFIG # AC_LIBTOOL_LANG_GCJ_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)]) AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG], [AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_CONFIG($1) AC_LANG_RESTORE CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_GCJ_CONFIG # AC_LIBTOOL_LANG_RC_CONFIG # ------------------------- # Ensure that the configuration vars for the Windows resource compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)]) AC_DEFUN([_LT_AC_LANG_RC_CONFIG], [AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes AC_LIBTOOL_CONFIG($1) AC_LANG_RESTORE CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_RC_CONFIG # AC_LIBTOOL_CONFIG([TAGNAME]) # ---------------------------- # If TAGNAME is not passed, then create an initial libtool script # with a default configuration from the untagged config vars. Otherwise # add code to config.status for appending the configuration named by # TAGNAME from the matching tagged config vars. AC_DEFUN([AC_LIBTOOL_CONFIG], [# The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ _LT_AC_TAGVAR(compiler, $1) \ _LT_AC_TAGVAR(CC, $1) \ _LT_AC_TAGVAR(LD, $1) \ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \ _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \ _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \ _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \ _LT_AC_TAGVAR(old_archive_cmds, $1) \ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \ _LT_AC_TAGVAR(predep_objects, $1) \ _LT_AC_TAGVAR(postdep_objects, $1) \ _LT_AC_TAGVAR(predeps, $1) \ _LT_AC_TAGVAR(postdeps, $1) \ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ _LT_AC_TAGVAR(archive_cmds, $1) \ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ _LT_AC_TAGVAR(postinstall_cmds, $1) \ _LT_AC_TAGVAR(postuninstall_cmds, $1) \ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \ _LT_AC_TAGVAR(allow_undefined_flag, $1) \ _LT_AC_TAGVAR(no_undefined_flag, $1) \ _LT_AC_TAGVAR(export_symbols_cmds, $1) \ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \ _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \ _LT_AC_TAGVAR(hardcode_automatic, $1) \ _LT_AC_TAGVAR(module_cmds, $1) \ _LT_AC_TAGVAR(module_expsym_cmds, $1) \ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \ _LT_AC_TAGVAR(fix_srcfile_path, $1) \ _LT_AC_TAGVAR(exclude_expsyms, $1) \ _LT_AC_TAGVAR(include_expsyms, $1); do case $var in _LT_AC_TAGVAR(old_archive_cmds, $1) | \ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \ _LT_AC_TAGVAR(archive_cmds, $1) | \ _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \ _LT_AC_TAGVAR(module_cmds, $1) | \ _LT_AC_TAGVAR(module_expsym_cmds, $1) | \ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \ _LT_AC_TAGVAR(export_symbols_cmds, $1) | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\[$]0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'` ;; esac ifelse([$1], [], [cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" AC_MSG_NOTICE([creating $ofile])], [cfgfile="$ofile"]) cat <<__EOF__ >> "$cfgfile" ifelse([$1], [], [#! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e 1s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG], [# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) # Is the compiler the GNU C compiler? with_gcc=$_LT_AC_TAGVAR(GCC, $1) # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_[]_LT_AC_TAGVAR(LD, $1) # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) # Commands used to build and install a shared archive. archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) # Flag that forces no undefined symbols. no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) # The commands to list exported symbols. export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) # Symbols that must always be exported. include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) ifelse([$1],[], [# ### END LIBTOOL CONFIG], [# ### END LIBTOOL TAG CONFIG: $tagname]) __EOF__ ifelse([$1],[], [ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ]) else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ])# AC_LIBTOOL_CONFIG # AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi ])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # --------------------------------- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([LT_AC_PROG_SED]) AC_REQUIRE([AC_PROG_NM]) AC_REQUIRE([AC_OBJEXT]) # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32*) symcode='[[ABCDGISTW]]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux* | k*bsd*-gnu) if test "$host_cpu" = ia64; then symcode='[[ABCDGIRSTW]]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[[]] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi ]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) # --------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], [_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)= AC_MSG_CHECKING([for $compiler option to produce PIC]) ifelse([$1],[CXX],[ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; icpc* | ecpc*) # Intel C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC*) # Portland Group C++ compiler. _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; vxworks*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; newsos6) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='' ;; esac ;; esac ;; osf3* | osf4* | osf5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ;; esac # # Check to make sure the static flag actually works. # wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) ]) # AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) # ------------------------------------ # See if the linker supports building shared libraries. AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) ifelse([$1],[CXX],[ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw*) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' ;; *) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ],[ runpath_var= _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)= _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_AC_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. _LT_CC_BASENAME([$compiler]) case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_AC_TAGVAR(ld_shlibs, $1)=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; interix[[3-9]]*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; *) tmp_sharedflag='-shared' ;; esac _LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=yes _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # see comment about different semantics on the GNU ld section _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; bsdi[[45]]*) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ;; dgux*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' if test "$GCC" = yes; then wlarc='${wl}' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_AC_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_AC_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_AC_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_MSG_CHECKING([whether -lc should be explicitly linked in]) $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) _LT_AC_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no else _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) ;; esac fi ;; esac ])# AC_LIBTOOL_PROG_LD_SHLIBS # _LT_AC_FILE_LTDLL_C # ------------------- # Be careful that the start marker always follows a newline. AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ # /* ltdll.c starts here */ # #define WIN32_LEAN_AND_MEAN # #include # #undef WIN32_LEAN_AND_MEAN # #include # # #ifndef __CYGWIN__ # # ifdef __CYGWIN32__ # # define __CYGWIN__ __CYGWIN32__ # # endif # #endif # # #ifdef __cplusplus # extern "C" { # #endif # BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); # #ifdef __cplusplus # } # #endif # # #ifdef __CYGWIN__ # #include # DECLARE_CYGWIN_DLL( DllMain ); # #endif # HINSTANCE __hDllInstance_base; # # BOOL APIENTRY # DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) # { # __hDllInstance_base = hInst; # return TRUE; # } # /* ltdll.c ends here */ ])# _LT_AC_FILE_LTDLL_C # _LT_AC_TAGVAR(VARNAME, [TAGNAME]) # --------------------------------- AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) # old names AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) # This is just to silence aclocal about the macro not being used ifelse([AC_DISABLE_FAST_INSTALL]) AC_DEFUN([LT_AC_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj, no) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS) ]) AC_DEFUN([LT_AC_PROG_RC], [AC_CHECK_TOOL(RC, windres, no) ]) # Cheap backport of AS_EXECUTABLE_P and required macros # from Autoconf 2.59; we should not use $as_executable_p directly. # _AS_TEST_PREPARE # ---------------- m4_ifndef([_AS_TEST_PREPARE], [m4_defun([_AS_TEST_PREPARE], [if test -x / >/dev/null 2>&1; then as_executable_p='test -x' else as_executable_p='test -f' fi ])])# _AS_TEST_PREPARE # AS_EXECUTABLE_P # --------------- # Check whether a file is executable. m4_ifndef([AS_EXECUTABLE_P], [m4_defun([AS_EXECUTABLE_P], [AS_REQUIRE([_AS_TEST_PREPARE])dnl $as_executable_p $1[]dnl ])])# AS_EXECUTABLE_P # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # # LT_AC_PROG_SED # -------------- # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. AC_DEFUN([LT_AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if AS_EXECUTABLE_P(["$as_dir/$lt_ac_prog$ac_exec_ext"]); then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ]) # Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.10' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.10], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.10])dnl _AM_AUTOCONF_VERSION(m4_PACKAGE_VERSION)]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 3 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.60])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $1 | $1:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 AC_DEFUN([AM_MAINTAINER_MODE], [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode is disabled by default AC_ARG_ENABLE(maintainer-mode, [ --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer], USE_MAINTAINER_MODE=$enableval, USE_MAINTAINER_MODE=no) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST(MAINT)dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputing VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/check-package.m4]) m4_include([m4/frameworks.m4]) m4_include([m4/geom_local.m4]) m4_include([m4/iso-c99.m4]) m4_include([m4/lf_local.m4]) m4_include([m4/set-prefix.m4]) m4_include([m4/withtool.m4]) geomview-1.9.4/README0000644000175000001440000002551310663304130011146 00000000000000 Geomview/OOGL Release 1.9.4 AUGUST 2007 ----------- CONTENTS -------- Introduction Note to Users of Previous Geomview Versions Installation More about Geomview External Modules Auxiliary Programs Documentation Geomview Support History Miscellaneous Known Bugs Improvements/Wish list Bug Reports and Comments INTRODUCTION ------------ This is version 1.9.4 of Geomview/OOGL. See the file NEWS for a summary of changes in this release, and the file ChangeLog for specific details. Geomview is an interactive geometry viewing program. OOGL, which stands for Object Oriented Graphics Library, is the library upon which Geomview is built. Geomview runs on many unix-like platforms including but not limited to GNU/Linux, Solaris, IRIX, and AIX. It requires X windows, OpenGL, and Motif (or OpenMotif). It also works with Mesa, which is a free-software replacement to OpenGL. See www.geomview.org for more information. In addition, if you use geomview please consider joining the geomview-users mailing list; send an empty note with 'subscribe' in the subject line to geomview-users-request@lists.sourceforge.net, or visit the list web page at http://lists.sourceforge.net/mailman/listinfo/geomview-users. NOTE TO USERS OF PREVIOUS GEOMVIEW VERSIONS ------------------------------------------- If you're a user of a really old (version 1.6 or earlier) version of Geomview and you're looking for some of the external modules that were included in the older versions but that are not present in this release, you can still download the old versions of Geomview from http://www.geom.uiuc.edu/software/download/geomview.html. INSTALLATION ------------ See the files INSTALL.Geomview and INSTALL for instructions on compiling and installing Geomview. MORE ABOUT GEOMVIEW ------------------- Geomview is the product of an effort at the Geometry Center at the University of Minnesota to provide interactive geometry software which is particularly appropriate for mathematics research and education. In particular, geomview can display things in hyperbolic and spherical space as well as Euclidean space. Geomview allows multiple independently controllable objects and cameras. It provides interactive control for motion, appearances (including lighting, shading, and materials), picking on an object, edge or vertex level, snapshots in SGI image file or Renderman RIB format, and adding or deleting objects is provided through direct mouse manipulation, control panels, and keyboard shortcuts. External programs can drive desired aspects of the viewer (such as continually loading changing geometry or controlling the motion of certain objects) while allowing interactive control of everything else. Geomview supports the following simple data types: polyhedra with shared vertices (.off), quadrilaterals, rectangular meshes, vectors, and Bezier surface patches of arbitrary degree including rational patches. Object hierarchies can be constructed with lists of objects and instances of object(s) transformed by one or many 4x4 matrices. Arbitrary portions of changing hierarchies may be transmitted by creating named references. Geomview can display Mathematica and Maple 3-D graphics output; for information on this see the files OOGL.m.txt and gvplot.txt, respectively, in the "doc" subdirectory. EXTERNAL MODULES ---------------- Geomview comes with several "external modules" (emodules) -- programs that communicate with geomview through a command language. The list of currently installed modules appears in the "Modules" browser on geomview's main panel. To invoke a module, click the mouse on the appropriate line in this browser. The modules in this distribution are: MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ Animate: flip through a sequence of objects Clipboard: save a single OOGL object to a clipboard Gvclock: an animated clock Nose: debugging/example for picking (see Geomview manual) Modules involving extra libraries like XForms or Tcl/Tk have been moved to separate packages to make the maintenance of the Geomview main-package easier. The packages can be downloaded from the Geomview download area at Sourceforge.net. The names of the emodule packages, and the emodules they contain, are as follows: Package gvemod-xforms-example -- example XForms-based emodule ************************************************************* MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ Example: generic FORMS example external module Package gvemodules-xforms -- emodules which require the XForms package ********************************************************************** MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ Cplxview: visualize the graphs of complex functions Example: generic FORMS example external module Flythrough: "Not Knot" visualisation (hyperbolic space) Ginsu: interactively slice objects (see "clip") Graffiti: draw line segments on objects Hinge: "copy-rotate" a polyhedron around edges of itself Stereo: stereo vision module Sweep: generate objects of rotation from line segments Tackdown: redefine an object's "home" position Transformer: explicitly control an object's transformation matrix Package maniview -- requires XForms *********************************** MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ Maniview visualize 3d manifolds and orbifolds Pacakge gvemod-crayola -- requires Tcl/Tk ***************************************** MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ Crayola: interactive colouring of OOGL objects Package gvemod-labeler -- requires Tcl/Tk ***************************************** MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ Labeler: somewhat crude generation of text as OOGL object gvemod-ndview -- requires Tcl/Tk **************************************************** MODULE DESCRIPTION ~~~~~~ ~~~~~~~~~~~ 3D-Snapshot: Save a 3D projection of an ND object Colormap: Coloring of ND objects w.r.t. the "invisible" directions NDview: visualization of objects in > 3D NDdemo: a demo for ND visualization Origin: draw a coordinate frame for an OOGL object Slicer: Slice ND objects (see also Ginsu above) AUXILIARY PROGRAMS ------------------ PROGRAM DESCRIPTION anytooff: convert any OOGL object into OFF format anytoucd: convert any OOGL object into UCD format bdy: compute the boundary edges of a geom as a VECT file bez2mesh: convert Bezier object to MESH clip: clip OOGL objects against planes or other surfaces hvectext: produce VECT text from Ghostscript Hershey fonts math2oogl: convert Mathematica graphics object to OOGL format offconsol: consolidate duplicate vertices in an OFF file oogl2rib: convert OOGL to RenderMan RIB (see doc/OOGL.m.txt) oogl2vrml: convert OOGL to VRML version 1 oogl2vrml2: convert OOGL to VRML version 2 polymerge: merge vertices, edges, and faces in an OFF file togeomview: pipe GCL commands or geometry to a copy of geomview, invoking geomview if necessary ucdtooff: convert UCD format file into an OFF OOGL file COMPUTER ALGEBRA INTERFACES --------------------------- gvplot.mapleVx: plot interface to Maple (tm). `x' is in {3, 4, 8}. The source code and Maple V8 work-sheets which can be used to generate a Maple library are installed below PREFIX/share/geomview/Maple/. After installation the documentation can be found in PREFIX/share/doc/geomview-VERISION/README.gvplot math2oogl: convert Mathematica graphics object to OOGL format DOCUMENTATION ------------- A comprehensive manual is in the "doc" subdirectory. You can also read or download the manual from the Geomview web site, www.geomview.org. "make install" installs the documentation under PREFIX/share/doc/geomview-VERSION/ The manual comes in Info, PDF and HTML format. The file doc/oogltour gives an introduction to the OOGL file format, which is the format of geometry files that geomview reads. More details are in the manual. Further documentation can be found in several manual pages; the manual pages are installed in their proper locations by "make install". Some of the external modules, as well as geomview itself, has a manual page. Of particular interest are: geomview(1) geomview man page geomview(5) geomview command language reference oogl(5) OOGL file format reference Other documentation is also moved to PREFIX/share/doc/geomview-VERSION/ by "make install", e.g. OOGL.m.txt documentation for interface to Mathematica README.gvplot documentation for interface to Maple GEOMVIEW MAILING LIST --------------------- geomview-users@lists@sourceforge.net This is a mailing list of people using geomview and can be used for communication between users regarding geomview problems, questions, experiences, etc. The geomview authors are also a part of this list and sometimes respond to questions posted to it. We also use this list to make announcements about new releases and other things of interest to users. To join the list, go the list web page at http://lists.sourceforge.net/mailman/listinfo/geomview-users. GEOMVIEW WEB SITE ----------------- The geomview web site is http://www.geomview.org. HISTORY ------- This project began in the summer of 1988 at the University of Minnesota's Geometry Center with the work of Pat Hanrahan on a viewing program called MinneView. Shortly thereafter Charlie Gunn begin developing OOGL in conjunction with MinneView. In 1991 a team of programmers headed by Mark Phillips, Stuart Levy, and Tamara Munzner set about developing a revised version of OOGL and a new viewer which they named Geomview. In the time since then, many people have contributed, including (in alphabetical order): Jorge Barros de Abreu, Steve Anderson, Rex Dieter, Celeste Fowler, Claus-Justus Heine, Todd Kaplan, Daniel Krech, Mario Lopez, Mark Meuer, Daeron Meyer, Steve Robbins, Timothy Rowley, Nathaniel Thurston, Scott Wisdom, Lloyd Woodand others. MISCELLANEOUS ------------- For a list of changes between versions, see the file ChangeLog. Geomview is distributed under the terms of the GNU Lesser Public License (LGPL); see the file COPYING for details. The file MANIFEST contains a list of the files in this distribution. KNOWN BUGS ---------- Picking can fail if any part of any object is behind the camera plane. (SNX) BUG REPORTS AND COMMENTS ------------------------ Please send bug reports and comments about Geomview to geomview-users@sourceforge.net. ======================================================================== This release packed up by: Claus-Justus Heine geomview-1.9.4/ltmain.sh0000644000175000001440000061176610662543373012136 00000000000000# ltmain.sh - Provide generalized library-building support services. # NOTE: Changing this file will not affect anything until you rerun configure. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007 Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. basename="s,^.*/,,g" # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" # The name of this program: progname=`echo "$progpath" | $SED $basename` modename="$progname" # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 PROGRAM=ltmain.sh PACKAGE=libtool VERSION=1.5.24 TIMESTAMP=" (1.1220.2.456 2007/06/24 02:25:32)" # Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # Check that we have a working $echo. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then # Yippee, $echo works! : else # Restart under the correct shell, and then maybe $echo will work. exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE fi # Global variables. mode=$default_mode nonopt= prev= prevopt= run= show="$echo" show_help= execute_dlfiles= duplicate_deps=no preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 ##################################### # Shell function definitions: # This seems to be the best place for them # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $mkdir "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || { $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 exit $EXIT_FAILURE } fi $echo "X$my_tmpdir" | $Xsed } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. func_win32_libid () { win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then win32_nmres=`eval $NM -f posix -A $1 | \ $SED -n -e '1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $echo $win32_libid_type } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done # user sometimes does CC=-gcc so we need to match that to 'gcc' trimedcc=`echo ${CC} | $SED -e "s/${host}-//g"` # and sometimes libtool has CC=-gcc but user does CC=gcc extendcc=${host}-${CC} # and sometimes libtool has CC=-gcc but user has CC=-gcc # (Gentoo-specific hack because we always export $CHOST) mungedcc=${CHOST-${host}}-${trimedcc} case "$@ " in "cc "* | " cc "* | "${host}-cc "* | " ${host}-cc "*|\ "gcc "* | " gcc "* | "${host}-gcc "* | " ${host}-gcc "*) tagname=CC break ;; "$trimedcc "* | " $trimedcc "* | "`$echo $trimedcc` "* | " `$echo $trimedcc` "*|\ "$extendcc "* | " $extendcc "* | "`$echo $extendcc` "* | " `$echo $extendcc` "*|\ "$mungedcc "* | " $mungedcc "* | "`$echo $mungedcc` "* | " `$echo $mungedcc` "*|\ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then $echo "$modename: unable to infer tagged configuration" $echo "$modename: specify a tag with \`--tag'" 1>&2 exit $EXIT_FAILURE # else # $echo "$modename: using $tagname tagged configuration" fi ;; esac fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 exit $EXIT_FAILURE fi } # func_extract_archives gentop oldlib ... func_extract_archives () { my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" my_status="" $show "${rm}r $my_gentop" $run ${rm}r "$my_gentop" $show "$mkdir $my_gentop" $run $mkdir "$my_gentop" my_status=$? if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then exit $my_status fi for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) extracted_serial=`expr $extracted_serial + 1` my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" $show "${rm}r $my_xdir" $run ${rm}r "$my_xdir" $show "$mkdir $my_xdir" $run $mkdir "$my_xdir" exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then exit $exit_status fi case $host in *-darwin*) $show "Extracting $my_xabs" # Do not bother doing anything if just a dry run if test -z "$run"; then darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` if test -n "$darwin_arches"; then darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= $show "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we have a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` lipo -create -output "$darwin_file" $darwin_files done # $darwin_filelist ${rm}r unfat-$$ cd "$darwin_orig_dir" else cd "$darwin_orig_dir" func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches fi # $run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # End of Shell function definitions ##################################### # Darwin sucks eval std_shrext=\"$shrext_cmds\" disable_libs=no # Parse our command line options once, thoroughly. while test "$#" -gt 0 do arg="$1" shift case $arg in -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in execute_dlfiles) execute_dlfiles="$execute_dlfiles $arg" ;; tag) tagname="$arg" preserve_args="${preserve_args}=$arg" # Check whether tagname contains only valid characters case $tagname in *[!-_A-Za-z0-9,/]*) $echo "$progname: invalid tag name: $tagname" 1>&2 exit $EXIT_FAILURE ;; esac case $tagname in CC) # Don't test for the "default" C tag, as we know, it's there, but # not specially marked. ;; *) if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then taglist="$taglist $tagname" # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" else $echo "$progname: ignoring unknown tag $tagname" 1>&2 fi ;; esac ;; *) eval "$prev=\$arg" ;; esac prev= prevopt= continue fi # Have we seen a non-optional argument yet? case $arg in --help) show_help=yes ;; --version) echo "\ $PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." exit $? ;; --config) ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath # Now print the configurations for the tags. for tagname in $taglist; do ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" done exit $? ;; --debug) $echo "$progname: enabling shell trace mode" set -x preserve_args="$preserve_args $arg" ;; --dry-run | -n) run=: ;; --features) $echo "host: $host" if test "$build_libtool_libs" = yes; then $echo "enable shared libraries" else $echo "disable shared libraries" fi if test "$build_old_libs" = yes; then $echo "enable static libraries" else $echo "disable static libraries" fi exit $? ;; --finish) mode="finish" ;; --mode) prevopt="--mode" prev=mode ;; --mode=*) mode="$optarg" ;; --preserve-dup-deps) duplicate_deps="yes" ;; --quiet | --silent) show=: preserve_args="$preserve_args $arg" ;; --tag) prevopt="--tag" prev=tag preserve_args="$preserve_args --tag" ;; --tag=*) set tag "$optarg" ${1+"$@"} shift prev=tag preserve_args="$preserve_args --tag" ;; -dlopen) prevopt="-dlopen" prev=execute_dlfiles ;; -*) $echo "$modename: unrecognized option \`$arg'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *) nonopt="$arg" break ;; esac done if test -n "$prevopt"; then $echo "$modename: option \`$prevopt' requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi case $disable_libs in no) ;; shared) build_libtool_libs=no build_old_libs=yes ;; static) build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` ;; esac # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= if test -z "$show_help"; then # Infer the operation mode. if test -z "$mode"; then $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 case $nonopt in *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) mode=link for arg do case $arg in -c) mode=compile break ;; esac done ;; *db | *dbx | *strace | *truss) mode=execute ;; *install*|cp|mv) mode=install ;; *rm) mode=uninstall ;; *) # If we have no mode, but dlfiles were specified, then do execute mode. test -n "$execute_dlfiles" && mode=execute # Just use the default operation mode. if test -z "$mode"; then if test -n "$nonopt"; then $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 else $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 fi fi ;; esac fi # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; then $echo "$modename: unrecognized option \`-dlopen'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$modename --help --mode=$mode' for more information." # These modes are in order of execution frequency so that they run quickly. case $mode in # libtool compile mode compile) modename="$modename: compile" # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) if test -n "$libobj" ; then $echo "$modename: you cannot specify \`-o' more than once" 1>&2 exit $EXIT_FAILURE fi arg_mode=target continue ;; -static | -prefer-pic | -prefer-non-pic) later="$later $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac lastarg="$lastarg $arg" done IFS="$save_ifs" lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` # Add the arguments to base_compile. base_compile="$base_compile $lastarg" continue ;; * ) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` case $lastarg in # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, and some SunOS ksh mistreat backslash-escaping # in scan sets (worked around with variable expansion), # and furthermore cannot handle '|' '&' '(' ')' in scan sets # at all, so we specify them separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") lastarg="\"$lastarg\"" ;; esac base_compile="$base_compile $lastarg" done # for arg case $arg_mode in arg) $echo "$modename: you must specify an argument for -Xcompile" exit $EXIT_FAILURE ;; target) $echo "$modename: you must specify a target with \`-o'" 1>&2 exit $EXIT_FAILURE ;; *) # Get the name of the library object. [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo xform='[cCFSifmso]' case $libobj in *.ada) xform=ada ;; *.adb) xform=adb ;; *.ads) xform=ads ;; *.asm) xform=asm ;; *.c++) xform=c++ ;; *.cc) xform=cc ;; *.ii) xform=ii ;; *.class) xform=class ;; *.cpp) xform=cpp ;; *.cxx) xform=cxx ;; *.[fF][09]?) xform=[fF][09]. ;; *.for) xform=for ;; *.java) xform=java ;; *.obj) xform=obj ;; esac libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` case $libobj in *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; *) $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 exit $EXIT_FAILURE ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -static) build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` case $qlibobj in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qlibobj="\"$qlibobj\"" ;; esac test "X$libobj" != "X$qlibobj" \ && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$obj"; then xdir= else xdir=$xdir/ fi lobj=${xdir}$objdir/$objname if test -z "$base_compile"; then $echo "$modename: you must specify a compilation command" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi $run $rm $removelist trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" removelist="$removelist $output_obj $lockfile" trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $run ln "$srcfile" "$lockfile" 2>/dev/null; do $show "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi $echo "$srcfile" > "$lockfile" fi if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` case $qsrcfile in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qsrcfile="\"$qsrcfile\"" ;; esac $run $rm "$libobj" "${libobj}T" # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then $show "$mv $output_obj $lobj" if $run $mv $output_obj $lobj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the PIC object to the libtool object file. test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then $show "$mv $output_obj $obj" if $run $mv $output_obj $obj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the non-PIC object the libtool object file. # Only append if the libtool object file exists. test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test ;; *) qarg=$arg ;; esac libtool_args="$libtool_args $qarg" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) compile_command="$compile_command @OUTPUT@" finalize_command="$finalize_command @OUTPUT@" ;; esac case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. compile_command="$compile_command @SYMFILE@" finalize_command="$finalize_command @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$dlprefiles $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" if test ! -f "$arg"; then $echo "$modename: symbol file \`$arg' does not exist" exit $EXIT_FAILURE fi prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat $save_arg` do # moreargs="$moreargs $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi done else $echo "$modename: link input file \`$save_arg' does not exist" exit $EXIT_FAILURE fi arg=$save_arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= compile_command="$compile_command $wl$qarg" finalize_command="$finalize_command $wl$qarg" continue ;; xcclinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; shrext) shrext_cmds="$arg" prev= continue ;; darwin_framework|darwin_framework_skip) test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" prev= continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then compile_command="$compile_command $link_static_flag" finalize_command="$finalize_command $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 continue ;; -avoid-version) avoid_version=yes continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: more than one -exported-symbols argument is not allowed" exit $EXIT_FAILURE fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework|-arch|-isysroot) case " $CC " in *" ${arg} ${1} "* | *" ${arg} ${1} "*) prev=darwin_framework_skip ;; *) compiler_flags="$compiler_flags $arg" prev=darwin_framework ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" ;; esac continue ;; -L*) dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" notinst_path="$notinst_path $dir" fi dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; *) dllsearchpath="$dllsearchpath:$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework deplibs="$deplibs -framework System" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. -model) compile_command="$compile_command $arg" compiler_flags="$compiler_flags $arg" finalize_command="$finalize_command $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) compiler_flags="$compiler_flags $arg" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" continue ;; -module) module=yes continue ;; # -64, -mips[0-9] enable 64-bit mode on the SGI compiler # -r[0-9][0-9]* specifies the processor on the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler # +DA*, +DD* enable 64-bit mode on the HP compiler # -q* pass through compiler args for the IBM compiler # -m* pass through architecture-specific compiler args for GCC # -m*, -t[45]*, -txscale* pass through architecture-specific # compiler args for GCC # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC # -F/path gives path to uninstalled frameworks, gcc on darwin # @file GCC response files -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" compiler_flags="$compiler_flags $arg" continue ;; -shrext) prev=shrext continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -Wc,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Wl,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $wl$flag" linker_flags="$linker_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # Some other compiler flag. -* | +*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; *.$objext) # A standard object. objs="$objs $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi ;; *.$libext) # An archive. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi done # argument parsing loop if test -n "$prev"; then $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi oldlibs= # calculate the name of the file, without its directory outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` if test "X$output_objdir" = "X$output"; then output_objdir="$objdir" else output_objdir="$output_objdir/$objdir" fi # Create the object directory. if test ! -d "$output_objdir"; then $show "$mkdir $output_objdir" $run $mkdir $output_objdir exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then exit $exit_status fi fi # Determine the type of output case $output in "") $echo "$modename: you must specify an output file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac case $host in *cygwin* | *mingw* | *pw32*) # don't eliminate duplications in $postdeps and $predeps duplicate_compiler_generated_deps=yes ;; *) duplicate_compiler_generated_deps=$duplicate_deps ;; esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if test "X$duplicate_deps" = "Xyes" ; then case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi libs="$libs $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac pre_post_deps="$pre_post_deps $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries case $linkmode in lib) passes="conv link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 exit $EXIT_FAILURE ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else compiler_flags="$compiler_flags $deplib" fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 continue fi name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then library_names= old_library= case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; *) $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` if eval $echo \"$deplib\" 2>/dev/null \ | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then $echo $echo "*** Warning: Trying to link with static lib archive $deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because the file extensions .$libext of this argument makes me believe" $echo "*** that it is just a static archive that I should not used here." else $echo $echo "*** Warning: Linking the shared library $output against the" $echo "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 exit $EXIT_FAILURE fi # Check to see that this really is a libtool archive. if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." dlname= dlopen= dlpreopen= libdir= library_names= old_library= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then $echo "$modename: \`$lib' is not a convenience library" 1>&2 exit $EXIT_FAILURE fi continue fi # $pass = conv # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done if test -z "$linklib"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 abs_ladir="$ladir" fi ;; esac laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then $echo "$modename: warning: library \`$lib' was moved." 1>&2 dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" fi fi # $installed = yes name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$newdlprefiles $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath " in *" $dir "*) ;; *" $absdir "*) ;; *) temp_rpath="$temp_rpath $absdir" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes ; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi # This is a shared library # Warn about portability, can't link against -module's on # some systems (darwin) if test "$shouldnotlink" = yes && test "$pass" = link ; then $echo if test "$linkmode" = prog; then $echo "*** Warning: Linking the executable $output against the loadable module" else $echo "*** Warning: Linking the shared library $output against the loadable module" fi $echo "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names realname="$2" shift; shift libname=`eval \\$echo \"$libname_spec\"` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw*) major=`expr $current - $age` versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" soname=`$echo $soroot | ${SED} -e 's/^.*\///'` newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else $show "extracting exported symbol list from \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$extract_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else $show "generating import library for \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$old_archive_from_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a module then we can not link against # it, someone is ignoring the new warnings I added if /usr/bin/file -L $add 2> /dev/null | $EGREP ": [^:]* bundle" >/dev/null ; then $echo "** Warning, lib $linklib is a module, not a shared library" if test -z "$old_library" ; then $echo $echo "** And there doesn't seem to be a static archive available" $echo "** The link will probably fail, sorry" else add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then $echo "$modename: configuration error: unsupported hardcode properties" exit $EXIT_FAILURE fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && \ test "$hardcode_minus_L" != yes && \ test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. $echo $echo "*** Warning: This system can not link to static lib archive $lib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then $echo "*** But as you try to build a module library, libtool will still create " $echo "*** a static module, that should work as long as the dlopening application" $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` case " $xrpath " in *" $temp_xrpath "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do case $deplib in -L*) path="$deplib" ;; *.la) dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$deplib" && dir="." # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" fi ;; esac if grep "^installed=no" $deplib > /dev/null; then path="$absdir/$objdir" else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi if test "$absdir" != "$libdir"; then $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 fi path="$absdir" fi depdepl= case $host in *-*-darwin*) # we do not want to link against static libs, # but need to link against shared eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$path/$depdepl" ; then depdepl="$path/$depdepl" fi # do not add paths which are already there case " $newlib_search_path " in *" $path "*) ;; *) newlib_search_path="$newlib_search_path $path";; esac fi path="" ;; *) path="-L$path" ;; esac ;; -l*) case $host in *-*-darwin*) # Again, we only want to link against shared libraries eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` for tmp in $newlib_search_path ; do if test -f "$tmp/lib$tmp_libs.dylib" ; then eval depdepl="$tmp/lib$tmp_libs.dylib" break fi done path="" ;; *) continue ;; esac ;; *) continue ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac case " $deplibs " in *" $depdepl "*) ;; *) deplibs="$depdepl $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 fi if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 fi # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) if test "$module" = no; then $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 exit $EXIT_FAILURE else $echo $echo "*** Warning: Linking the shared library $output against the non-libtool" $echo "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi if test "$dlself" != no; then $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 fi set dummy $rpath if test "$#" -gt 2; then $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 fi install_libdir="$2" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 fi else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 IFS="$save_ifs" if test -n "$8"; then $echo "$modename: too many parameters to \`-version-info'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$2" number_minor="$3" number_revision="$4" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows|none) current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$2" revision="$3" age="$4" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac if test "$age" -gt "$current"; then $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header major=.`expr $current - $age` versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... minor_current=`expr $current + 1` xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current"; ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then major=`expr $current - $age` else major=`expr $current - $age + 1` fi case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do iface=`expr $revision - $loop` loop=`expr $loop - 1` verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) major=.`expr $current - $age` versuffix="$major.$age.$revision" ;; osf) major=.`expr $current - $age` versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do iface=`expr $current - $loop` loop=`expr $loop - 1` verstring="$verstring:${iface}.0" done # Make executables depend on our current version. verstring="$verstring:${current}.0" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. major=`expr $current - $age` versuffix="-$major" ;; *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi if test "$mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$echo "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi removelist="$removelist $p" ;; *) ;; esac done if test -n "$removelist"; then $show "${rm}r $removelist" $run ${rm}r $removelist fi fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) dlfiles="$dlfiles $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$deplibs -framework System" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then deplibs="$deplibs -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $rm conftest.c cat > conftest.c </dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null \ | grep " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for file magic test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a file magic. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` for a_deplib in $deplibs; do name=`expr $a_deplib : '-l\(.*\)'` # If $name is empty we are operating on a -L argument. if test -n "$name" && test "$name" != "0"; then if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval \\$echo \"$libname_spec\"` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval $echo \"$potent_lib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for regex pattern test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a regex pattern. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` done fi if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ | grep . >/dev/null; then $echo if test "X$deplibs_check_method" = "Xnone"; then $echo "*** Warning: inter-library dependencies are not supported in this platform." else $echo "*** Warning: inter-library dependencies are not known to be supported." fi $echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then $echo $echo "*** Warning: libtool could not satisfy all declared inter-library" $echo "*** dependencies of module $libname. Therefore, libtool will create" $echo "*** a static module, that should work as long as the dlopening" $echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else $echo "*** The inter-library dependencies that have been dropped here will be" $echo "*** automatically added whenever a program is linked with this library" $echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then $echo $echo "*** Since this library must not contain undefined symbols," $echo "*** because either the platform does not support them or" $echo "*** it was explicitly requested with -no-undefined," $echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then case $archive_cmds in *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; esac else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names realname="$2" shift; shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do linknames="$linknames $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" if len=`expr "X$cmd" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then $show "$cmd" $run eval "$cmd" || exit $? skipped_export=false else # The command line is too long to execute in one step. $show "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex"; then $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' $show "$mv \"${export_symbols}T\" \"$export_symbols\"" $run eval '$mv "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" else gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $convenience libobjs="$libobjs $func_extract_archives_result" fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise. $echo "creating reloadable object files..." # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output output_la=`$echo "X$output" | $Xsed -e "$basename"` # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= delfiles= last_robj= k=1 output=$output_objdir/$output_la-${k}.$objext # Loop over the list of objects to be linked. for obj in $save_libobjs do eval test_cmds=\"$reload_cmds $objlist $last_robj\" if test "X$objlist" = X || { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len"; }; then objlist="$objlist $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. eval concat_cmds=\"$reload_cmds $objlist $last_robj\" else # All subsequent reloadable object files will link in # the last one created. eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext k=`expr $k + 1` output=$output_objdir/$output_la-${k}.$objext objlist=$obj len=1 fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" if ${skipped_export-false}; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols libobjs=$output # Append the command to create the export file. eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" fi # Set up a command to remove the reloadable object files # after they are used. i=0 while test "$i" -lt "$k" do i=`expr $i + 1` delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" done $echo "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi # Append the command to remove the reloadable object files # to the just-reset $cmds. eval cmds=\"\$cmds~\$rm $delfiles\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then $show "${rm}r $gentop" $run ${rm}r "$gentop" fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 fi case $output in *.lo) if test -n "$objs$old_deplibs"; then $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 exit $EXIT_FAILURE fi libobj="$output" obj=`$echo "X$output" | $Xsed -e "$lo2o"` ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $run $rm $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` else gentop="$output_objdir/${obj}x" generated="$generated $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $run eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; esac if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 fi if test "$preload" = yes; then if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && test "$dlopen_self_static" = unknown; then $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." fi fi case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac case $host in *darwin*) # Don't allow lazy linking, it breaks C++ global constructors if test "$tagname" = CXX ; then compile_command="$compile_command ${wl}-bind_at_load" finalize_command="$finalize_command ${wl}-bind_at_load" fi ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done compile_deplibs="$new_libs" compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; *) dllsearchpath="$dllsearchpath:$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then dlsyms="${outputname}S.c" else $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 fi fi if test -n "$dlsyms"; then case $dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${outputname}.nm" $show "$rm $nlist ${nlist}S ${nlist}T" $run $rm "$nlist" "${nlist}S" "${nlist}T" # Parse the name list into a source file. $show "creating $output_objdir/$dlsyms" test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ /* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ /* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ #ifdef __cplusplus extern \"C\" { #endif /* Prevent the only kind of declaration conflicts we can make. */ #define lt_preloaded_symbols some_other_symbol /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then $show "generating symbol list for \`$output'" test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for arg in $progfiles; do $show "extracting global C symbols from \`$arg'" $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi if test -n "$export_symbols_regex"; then $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $run $rm $export_symbols $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* ) $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac else $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' $run eval 'mv "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* ) $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac fi fi for arg in $dlprefiles; do $show "extracting global C symbols from \`$arg'" name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` $run eval '$echo ": $name " >> "$nlist"' $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -z "$run"; then # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $mv "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if grep -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else grep -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' else $echo '/* NONE */' >> "$output_objdir/$dlsyms" fi $echo >> "$output_objdir/$dlsyms" "\ #undef lt_preloaded_symbols #if defined (__STDC__) && __STDC__ # define lt_ptr void * #else # define lt_ptr char * # define const #endif /* The mapping between symbol names and symbols. */ " case $host in *cygwin* | *mingw* ) $echo >> "$output_objdir/$dlsyms" "\ /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs */ struct { " ;; * ) $echo >> "$output_objdir/$dlsyms" "\ const struct { " ;; esac $echo >> "$output_objdir/$dlsyms" "\ const char *name; lt_ptr address; } lt_preloaded_symbols[] = {\ " eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" $echo >> "$output_objdir/$dlsyms" "\ {0, (lt_ptr) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " fi pic_flag_for_symtable= case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; esac;; *-*-hpux*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag";; esac esac # Now compile the dynamic symbol file. $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? # Clean up the generated files. $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" # Transform the symbol file into the correct name. case $host in *cygwin* | *mingw* ) if test -f "$output_objdir/${outputname}.def" ; then compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` else compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` fi ;; * ) compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` ;; esac ;; *) $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 exit $EXIT_FAILURE ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` fi if test "$need_relink" = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. $show "$link_command" $run eval "$link_command" exit_status=$? # Delete the generated files. if test -n "$dlsyms"; then $show "$rm $output_objdir/${outputname}S.${objext}" $run $rm "$output_objdir/${outputname}S.${objext}" fi exit $exit_status fi if test -n "$shlibpath_var"; then # We should set the shlibpath_var rpath= for dir in $temp_rpath; do case $dir in [\\/]* | [A-Za-z]:[\\/]*) # Absolute path. rpath="$rpath$dir:" ;; *) # Relative path: add a thisdir entry. rpath="$rpath\$thisdir/$dir:" ;; esac done temp_rpath="$rpath" fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $run $rm $output # Link the executable and exit $show "$link_command" $run eval "$link_command" || exit $? exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 $echo "$modename: \`$output' will be relinked during installation" 1>&2 else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname $show "$link_command" $run eval "$link_command" || exit $? # Now create the wrapper script. $show "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` fi # Quote $echo for shipping. if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then case $progpath in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` fi # Only actually do things if our run command is non-null. if test -z "$run"; then # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) output_name=`basename $output` output_path=`dirname $output` cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $rm $cwrappersource $cwrapper trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 cat > $cwrappersource <> $cwrappersource<<"EOF" #include #include #include #include #include #include #include #include #include #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) /* -DDEBUG is fairly common in CFLAGS. */ #undef DEBUG #if defined DEBUGWRAPPER # define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) #else # define DEBUG(format, ...) #endif const char *program_name = NULL; void * xmalloc (size_t num); char * xstrdup (const char *string); const char * base_name (const char *name); char * find_executable(const char *wrapper); int check_executable(const char *path); char * strendzap(char *str, const char *pat); void lt_fatal (const char *message, ...); int main (int argc, char *argv[]) { char **newargz; int i; program_name = (char *) xstrdup (base_name (argv[0])); DEBUG("(main) argv[0] : %s\n",argv[0]); DEBUG("(main) program_name : %s\n",program_name); newargz = XMALLOC(char *, argc+2); EOF cat >> $cwrappersource <> $cwrappersource <<"EOF" newargz[1] = find_executable(argv[0]); if (newargz[1] == NULL) lt_fatal("Couldn't find %s", argv[0]); DEBUG("(main) found exe at : %s\n",newargz[1]); /* we know the script has the same name, without the .exe */ /* so make sure newargz[1] doesn't end in .exe */ strendzap(newargz[1],".exe"); for (i = 1; i < argc; i++) newargz[i+1] = xstrdup(argv[i]); newargz[argc+1] = NULL; for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" return 127; } void * xmalloc (size_t num) { void * p = (void *) malloc (num); if (!p) lt_fatal ("Memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL ; } const char * base_name (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha ((unsigned char)name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return base; } int check_executable(const char * path) { struct stat st; DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); if ((!path) || (!*path)) return 0; if ((stat (path, &st) >= 0) && ( /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ #if defined (S_IXOTH) ((st.st_mode & S_IXOTH) == S_IXOTH) || #endif #if defined (S_IXGRP) ((st.st_mode & S_IXGRP) == S_IXGRP) || #endif ((st.st_mode & S_IXUSR) == S_IXUSR)) ) return 1; else return 0; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise */ char * find_executable (const char* wrapper) { int has_slash = 0; const char* p; const char* p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char* concat_name; DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char* path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char* q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR(*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen(tmp); concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen(tmp); concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); return NULL; } char * strendzap(char *str, const char *pat) { size_t len, patlen; assert(str != NULL); assert(pat != NULL); len = strlen(str); patlen = strlen(pat); if (patlen <= len) { str += len - patlen; if (strcmp(str, pat) == 0) *str = '\0'; } return str; } static void lt_error_core (int exit_status, const char * mode, const char * message, va_list ap) { fprintf (stderr, "%s: %s: ", program_name, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, "FATAL", message, ap); va_end (ap); } EOF # we should really use a build-platform specific compiler # here, but OTOH, the wrappers (shell script and this C one) # are only useful if you want to execute the "real" binary. # Since the "real" binary is built for $host, then this # wrapper might as well be built for $host, too. $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource ;; esac $rm $output trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 $echo > $output "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variable: notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$echo are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then echo=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then # Yippee, \$echo works! : else # Restart under the correct shell, and then maybe \$echo will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $echo >> $output "\ # Find the directory that this script lives in. thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $echo >> $output "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || \\ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $mkdir \"\$progdir\" else $rm \"\$progdir/\$file\" fi" $echo >> $output "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $echo \"\$relink_command_output\" >&2 $rm \"\$progdir/\$file\" exit $EXIT_FAILURE fi fi $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $rm \"\$progdir/\$program\"; $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } $rm \"\$progdir/\$file\" fi" else $echo >> $output "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $echo >> $output "\ if test -f \"\$progdir/\$program\"; then" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $echo >> $output "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $echo >> $output "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $echo >> $output "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. # Make sure env LD_LIBRARY_PATH does not mess us up if test -n \"\${LD_LIBRARY_PATH+set}\"; then export LD_LIBRARY_PATH=\$progdir:\$LD_LIBRARY_PATH fi " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2*) $echo >> $output "\ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $echo >> $output "\ exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $echo >> $output "\ \$echo \"\$0: cannot exec \$program \$*\" exit $EXIT_FAILURE fi else # The program doesn't exist. \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$echo \"This script is just a wrapper for \$program.\" 1>&2 $echo \"See the $PACKAGE documentation for more information.\" 1>&2 exit $EXIT_FAILURE fi fi\ " chmod +x $output fi exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $addlibs oldobjs="$oldobjs $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do $echo "X$obj" | $Xsed -e 's%^.*/%%' done | sort | sort -uc >/dev/null 2>&1); then : else $echo "copying selected object files to avoid basename conflicts..." if test -z "$gentop"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "$mkdir $gentop" $run $mkdir "$gentop" exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$gentop"; then exit $exit_status fi fi save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase counter=`expr $counter + 1` case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" $run ln "$obj" "$gentop/$newobj" || $run cp "$obj" "$gentop/$newobj" oldobjs="$oldobjs $gentop/$newobj" ;; *) oldobjs="$oldobjs $obj" ;; esac done fi eval cmds=\"$old_archive_cmds\" if len=`expr "X$cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts $echo "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done for obj in $save_oldobjs do oldobjs="$objlist $obj" objlist="$objlist $obj" eval test_cmds=\"$old_archive_cmds\" if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do eval cmd=\"$cmd\" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$generated"; then $show "${rm}r$generated" $run ${rm}r$generated fi # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" $show "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. if test -z "$run"; then for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi if test "X$EGREP" = X ; then EGREP=egrep fi # We do not want portage's install root ($D) present. Check only for # this if the .la is being installed. if test "$installed" = yes && test "$D"; then eval mynewdependency_lib=`echo "$libdir/$name" |sed -e "s:$D:/:g" -e 's:/\+:/:g'` else mynewdependency_lib="$libdir/$name" fi # Do not add duplicates if test "$mynewdependency_lib"; then my_little_ninja_foo_1=`echo $newdependency_libs |$EGREP -e "$mynewdependency_lib"` if test -z "$my_little_ninja_foo_1"; then newdependency_libs="$newdependency_libs $mynewdependency_lib" fi fi ;; *) if test "$installed" = yes; then # Rather use S=WORKDIR if our version of portage supports it. # This is because some ebuild (gcc) do not use $S as buildroot. if test "$PWORKDIR"; then S="$PWORKDIR" fi # We do not want portage's build root ($S) present. my_little_ninja_foo_2=`echo $deplib |$EGREP -e "$S"` # We do not want portage's install root ($D) present. my_little_ninja_foo_3=`echo $deplib |$EGREP -e "$D"` if test -n "$my_little_ninja_foo_2" && test "$S"; then mynewdependency_lib="" elif test -n "$my_little_ninja_foo_3" && test "$D"; then eval mynewdependency_lib=`echo "$deplib" |sed -e "s:$D:/:g" -e 's:/\+:/:g'` else mynewdependency_lib="$deplib" fi else mynewdependency_lib="$deplib" fi # Do not add duplicates if test "$mynewdependency_lib"; then my_little_ninja_foo_4=`echo $newdependency_libs |$EGREP -e "$mynewdependency_lib"` if test -z "$my_little_ninja_foo_4"; then newdependency_libs="$newdependency_libs $mynewdependency_lib" fi fi ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlfiles="$newdlfiles $libdir/$name" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlprefiles="$newdlprefiles $libdir/$name" done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi $rm $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac # Do not add duplicates if test "$installed" = yes && test "$D"; then install_libdir=`echo "$install_libdir" |sed -e "s:$D:/:g" -e 's:/\+:/:g'` fi $echo > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $echo >> $output "\ relink_command=\"$relink_command\"" fi done fi # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ;; esac exit $EXIT_SUCCESS ;; # libtool install mode install) modename="$modename: install" # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $echo "X$nonopt" | grep shtool > /dev/null; then # Aesthetically quote it. arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$arg " arg="$1" shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$install_prog$arg" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) case " $install_prog " in *[\\\ /]cp\ *) ;; *) prev=$arg ;; esac ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$install_prog $arg" done if test -z "$install_prog"; then $echo "$modename: you must specify an install program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -n "$prev"; then $echo "$modename: the \`$prev' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -z "$files"; then if test -z "$dest"; then $echo "$modename: no file or destination specified" 1>&2 else $echo "$modename: you must specify a destination" 1>&2 fi $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Strip any trailing slash from the destination. dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` test "X$destdir" = "X$dest" && destdir=. destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` # Not a directory, so check to see that there is only one file specified. set dummy $files if test "$#" -gt 2; then $echo "$modename: \`$dest' is not a directory" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi library_names= old_library= relink_command= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ test "X$dir" = "X$file/" && dir= dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. if test "$inst_prefix_dir" = "$destdir"; then $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 exit $EXIT_FAILURE fi if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` else relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` fi $echo "$modename: warning: relinking \`$file'" 1>&2 $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 exit $EXIT_FAILURE fi fi # See the names of the shared library. set dummy $library_names if test -n "$2"; then realname="$2" shift shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. $show "$install_prog $dir/$srcname $destdir/$realname" $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? if test -n "$stripme" && test -n "$striplib"; then $show "$striplib $destdir/$realname" $run eval "$striplib $destdir/$realname" || exit $? fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do if test "$linkname" != "$realname"; then $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" fi done fi # Do each command in the postinstall commands. lib="$destdir/$realname" cmds=$postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' fi exit $lt_exit } done IFS="$save_ifs" fi # Install the pseudo-library for information purposes. name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` instname="$dir/$name"i $show "$install_prog $instname $destdir/$name" $run eval "$install_prog $instname $destdir/$name" || exit $? # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` ;; *.$objext) staticdest="$destfile" destfile= ;; *) $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac # Install the libtool object if requested. if test -n "$destfile"; then $show "$install_prog $file $destfile" $run eval "$install_prog $file $destfile" || exit $? fi # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` $show "$install_prog $staticobj $staticdest" $run eval "$install_prog \$staticobj \$staticdest" || exit $? fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then file=`$echo $file|${SED} 's,.exe$,,'` stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin*|*mingw*) wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` ;; *) wrapper=$file ;; esac if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then notinst_deplibs= relink_command= # Note that it is not necessary on cygwin/mingw to append a dot to # foo even if both foo and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. # # If there is no directory component, then add one. case $wrapper in */* | *\\*) . ${wrapper} ;; *) . ./${wrapper} ;; esac # Check the variables that should have been set. if test -z "$notinst_deplibs"; then $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 exit $EXIT_FAILURE fi finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then # If there is no directory component, then add one. case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac fi libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 finalize=no fi done relink_command= # Note that it is not necessary on cygwin/mingw to append a dot to # foo even if both foo and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. # # If there is no directory component, then add one. case $wrapper in */* | *\\*) . ${wrapper} ;; *) . ./${wrapper} ;; esac outputname= if test "$fast_install" = no && test -n "$relink_command"; then if test "$finalize" = yes && test -z "$run"; then tmpdir=`func_mktempdir` file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 ${rm}r "$tmpdir" continue fi file="$outputname" else $echo "$modename: warning: cannot relink \`$file'" 1>&2 fi else # Install the binary that we compiled earlier. file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` ;; esac ;; esac $show "$install_prog$stripme $file $destfile" $run eval "$install_prog\$stripme \$file \$destfile" || exit $? test -n "$outputname" && ${rm}r "$tmpdir" ;; esac done for file in $staticlibs; do name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` # Set up the ranlib parameters. oldlib="$destdir/$name" $show "$install_prog $file $oldlib" $run eval "$install_prog \$file \$oldlib" || exit $? if test -n "$stripme" && test -n "$old_striplib"; then $show "$old_striplib $oldlib" $run eval "$old_striplib $oldlib" || exit $? fi # Do each command in the postinstall commands. cmds=$old_postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$future_libdirs"; then $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 fi if test -n "$current_libdirs"; then # Maybe just do a dry run. test -n "$run" && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi ;; # libtool finish mode finish) modename="$modename: finish" libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. cmds=$finish_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || admincmds="$admincmds $cmd" done IFS="$save_ifs" fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $run eval "$cmds" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. test "$show" = : && exit $EXIT_SUCCESS $echo "X----------------------------------------------------------------------" | $Xsed $echo "Libraries have been installed in:" for libdir in $libdirs; do $echo " $libdir" done $echo $echo "If you ever happen to want to link against installed libraries" $echo "in a given directory, LIBDIR, you must either use libtool, and" $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" $echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" $echo " during execution" fi if test -n "$runpath_var"; then $echo " - add LIBDIR to the \`$runpath_var' environment variable" $echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $echo " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $echo " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi $echo $echo "See any operating system documentation about shared libraries for" $echo "more information, such as the ld(1) and ld.so(8) manual pages." $echo "X----------------------------------------------------------------------" | $Xsed exit $EXIT_SUCCESS ;; # libtool execute mode execute) modename="$modename: execute" # The first argument is the command name. cmd="$nonopt" if test -z "$cmd"; then $echo "$modename: you must specify a COMMAND" 1>&2 $echo "$help" exit $EXIT_FAILURE fi # Handle -dlopen flags immediately. for file in $execute_dlfiles; do if test ! -f "$file"; then $echo "$modename: \`$file' is not a file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi dir= case $file in *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Read the libtool library. dlname= library_names= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" continue fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. if test -f "$dir/$objdir/$dlname"; then dir="$dir/$objdir" else if test ! -f "$dir/$dlname"; then $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 exit $EXIT_FAILURE fi fi ;; *.lo) # Just add the directory containing the .lo file. dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. ;; *) $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -*) ;; *) # Do a test to see if this is really a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` args="$args \"$file\"" done if test -z "$run"; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" $echo "export $shlibpath_var" fi $echo "$cmd$args" exit $EXIT_SUCCESS fi ;; # libtool clean and uninstall mode clean | uninstall) modename="$modename: $mode" rm="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) rm="$rm $arg"; rmforce=yes ;; -*) rm="$rm $arg" ;; *) files="$files $arg" ;; esac done if test -z "$rm"; then $echo "$modename: you must specify an RM program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi rmdirs= origobjdir="$objdir" for file in $files; do dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` if test "X$dir" = "X$file"; then dir=. objdir="$origobjdir" else objdir="$dir/$origobjdir" fi name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if (test -L "$file") >/dev/null 2>&1 \ || (test -h "$file") >/dev/null 2>&1 \ || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then . $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" case "$mode" in clean) case " $library_names " in # " " in the beginning catches empty $dlname *" $dlname "*) ;; *) rmfiles="$rmfiles $objdir/$dlname" ;; esac test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. cmds=$postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. cmds=$old_postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # Read the .lo file . $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" \ && test "$pic_object" != none; then rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" \ && test "$non_pic_object" != none; then rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) if test "$mode" = clean ; then noexename=$name case $file in *.exe) file=`$echo $file|${SED} 's,.exe$,,'` noexename=`$echo $name|${SED} 's,.exe$,,'` # $file with .exe has already been added to rmfiles, # add $file without .exe rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then relink_command= . $dir/$noexename # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac $show "$rm $rmfiles" $run $rm $rmfiles || exit_status=1 done objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then $show "rmdir $dir" $run rmdir $dir >/dev/null 2>&1 fi done exit $exit_status ;; "") $echo "$modename: you must specify a MODE" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE ;; esac if test -z "$exec_cmd"; then $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE fi fi # test -z "$show_help" if test -n "$exec_cmd"; then eval exec $exec_cmd exit $EXIT_FAILURE fi # We need to display help for each of the modes. case $mode in "") $echo \ "Usage: $modename [OPTION]... [MODE-ARG]... Provide generalized library-building support services. --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --finish same as \`--mode=finish' --help display this help message and exit --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] --quiet same as \`--silent' --silent don't print informational messages --tag=TAG use configuration variables from tag TAG --version print version information MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for a more detailed description of MODE. Report bugs to ." exit $EXIT_SUCCESS ;; clean) $echo \ "Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $echo \ "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -prefer-pic try to building PIC objects only -prefer-non-pic try to building non-PIC objects only -static always build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $echo \ "Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $echo \ "Usage: $modename [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $echo \ "Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $echo \ "Usage: $modename [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $echo \ "Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac $echo $echo "Try \`$modename --help' for more information about other modes." exit $? # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared disable_libs=shared # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static disable_libs=static # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: geomview-1.9.4/configure0000754000175000001440000400633110665240470012205 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for geomview 1.9.4. # # Report bugs to >. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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 # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done 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) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # 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'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= 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=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # 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 after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, 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 # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { 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 sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac echo=${ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string=`eval $cmd`) 2>/dev/null && echo_test_string=`eval $cmd` && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi tagnames=${tagnames+${tagnames},}CXX tagnames=${tagnames+${tagnames},}F77 exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='geomview' PACKAGE_TARNAME='geomview' PACKAGE_VERSION='1.9.4' PACKAGE_STRING='geomview 1.9.4' PACKAGE_BUGREPORT='Claus-Justus Heine ' ac_unique_file="src/bin/geomview/x11/gvmain.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_config_libobj_dir=src/lib/aclib 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 datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA am__isrc CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT abs_top_builddir abs_top_srcdir DEFAULT_PREFIX expanded_prefix expanded_exec_prefix CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP LEX LEX_OUTPUT_ROOT LEXLIB YACC YFLAGS INSTALL_LIBGEOMVIEW_TRUE INSTALL_LIBGEOMVIEW_FALSE SED GREP EGREP LN_S ECHO AR RANLIB CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL FIND GLOB_SHELL_PATH GLOB_SHELL PS2EPSI EPSTOPDF PDFIMAGESPROG PNMTOPNG PAMTOTIFF AQSIS_SHADER_COMPILER AQSIS_SHADER_COMPILER_TRUE AQSIS_SHADER_COMPILER_FALSE PIXIE_SHADER_COMPILER PIXIE_SHADER_COMPILER_TRUE PIXIE_SHADER_COMPILER_FALSE DELIGHT_SHADER_COMPILER DELIGHT_SHADER_COMPILER_TRUE DELIGHT_SHADER_COMPILER_FALSE ALLOCA LIBOBJS POW_LIB SOCKETLIBS MACHTYPE HTMLBROWSER PDFVIEWER XMKMF X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS XLIBS XMULIBS MOTIFINCLUDE MOTIFLIBS MESAGL OPENGLLIBS OPENGLINCLUDE MGOPENGL_TRUE MGOPENGL_FALSE MGX11_TRUE MGX11_FALSE MGGL_TRUE MGGL_FALSE HAVE_ZLIB_TRUE HAVE_ZLIB_FALSE ZLIB_INCLUDE_PATH ZLIB_INCLUDES ZLIB_ALL_INCLUDES ZLIB_LIB_PATH ZLIB_LIB ZLIB_ALL_LIB ZLIB_NAME LD_LIBRARY_PATH_SETTINGS BEZIER_SPHERES_TRUE BEZIER_SPHERES_FALSE HAVE_CXX_TRUE HAVE_CXX_FALSE moduledir geomdatadir top_geom_builddir OOGLLIBS OOGLLIB MOTIFUILIB STUBLIB GEOMVIEWHDRFILES GEOMVIEWPRIVHDRFILES default_includes LTLIBOBJS' ac_subst_files='' ac_precious_vars='build_alias host_alias target_alias DEFAULT_PREFIX CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP YACC YFLAGS CXXCPP F77 FFLAGS XMKMF' # 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. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_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 ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_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'` 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 ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_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'` 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; }; } 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 directory names. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } 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 ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$0" || $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 test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures geomview 1.9.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/geomview] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of geomview 1.9.4:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-d1debug turn on D1 level debugging output --enable-motion-averaging turn on experimental motion averaging (default is off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-build-path=DIR use DIR/include DIR/lib --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] --with-tags[=TAGS] include additional configurations [automatic] --with-aqsis-shader-compiler=PROGRAM Set PROGRAM to the name of the `aqsis-shader-compiler' program (usually `aqsl'). (default: autodetected) --with-pixie-shader-compiler=PROGRAM Set PROGRAM to the name of the `pixie-shader-compiler' program (usually `sdrc'). (default: autodetected) --with-delight-shader-compiler=PROGRAM Set PROGRAM to the name of the `delight-shader-compiler' program (usually `shaderdl'). (default: autodetected) --with-htmlbrowser=BROWSER Use BROWSER for viewing the HTML version of the manual when the `Manual (HTML)' menu item is selected. This setting can be changed at runtime through the '(ui-html-browser BROWSER)' GCL-command. (default: firefox) --with-pdfviewer=VIEWER Use BROWSER for viewing the PDF version of the manual when the `Manual (PDF)' menu item is selected. This setting can be changed at runtime through the '(ui-pdf-viewer VIEWER)' GCL-command. (default: xpdf) --with-motif=DIR Set DIR to motif installation prefix. It is not possible to compile Geomview without Motif. --with-opengl=DIR Set DIR to opengl installation prefix. OpenGL is optional. The default is to auto-detect OpenGL and use it if available. Use `--without-opengl' to disable OpenGL. --with-x use the X Window System --without-zlib disable use of package zlib (default: autodetect) --with-zlib-name=NAME use NAME as the name of the zlib library (without leading "lib" prefix and trailing suffix). Default: "z" --with-zlib-dir=DIR use zlib library (and headers) below directory DIR (no default) --with-zlib-lib=DIR use zlib library below directory DIR (default: EPREFIX/lib/) --with-zlib-headers=DIR use zlib include files below directory DIR (default: PREFIX/include/) Some influential environment variables: DEFAULT_PREFIX Default installation prefix CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor YACC The `Yet Another C Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CXXCPP C++ preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to >. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF geomview configure 1.9.4 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by geomview $as_me 1.9.4, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`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_arg'" ;; 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: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # 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 -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file 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 $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { 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 { echo "$as_me:$LINENO: result: configuring $PACKAGE_NAME $PACKAGE_VERSION" >&5 echo "${ECHO_T}configuring $PACKAGE_NAME $PACKAGE_VERSION" >&6; } ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} { (exit 1); exit 1; }; } { echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6; } if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 echo "$as_me: error: invalid value of canonical build" >&2;} { (exit 1); exit 1; }; };; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6; } if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} { (exit 1); exit 1; }; } fi fi { echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 echo "$as_me: error: invalid value of canonical host" >&2;} { (exit 1); exit 1; }; };; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { echo "$as_me:$LINENO: checking target system type" >&5 echo $ECHO_N "checking target system type... $ECHO_C" >&6; } if test "${ac_cv_target+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} { (exit 1); exit 1; }; } fi fi { echo "$as_me:$LINENO: result: $ac_cv_target" >&5 echo "${ECHO_T}$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 echo "$as_me: error: invalid value of canonical target" >&2;} { (exit 1); exit 1; }; };; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- am__api_version='1.10' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm -f conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi { echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi { echo "$as_me:$LINENO: result: $MKDIR_P" >&5 echo "${ECHO_T}$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$AWK" && break done { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { 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 rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='geomview' VERSION='1.9.4' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { 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_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' { echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ac_config_headers="$ac_config_headers config.h" test "x${DEFAULT_PREFIX}" = "x" && DEFAULT_PREFIX="${ac_default_prefix}" test "x$prefix" = xNONE && prefix="${DEFAULT_PREFIX}" PREFIX="${prefix}" # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' expanded_prefix=`eval eval eval echo ${prefix}` expanded_exec_prefix=`eval eval eval echo ${exec_prefix}` # Check whether --with-build-path was given. if test "${with_build_path+set}" = set; then withval=$with_build_path; for d in `echo $withval | tr : ' '`; do test -d $d/include && CPPFLAGS="$CPPFLAGS -I$d/include" test -d $d/lib && LDFLAGS="$LDFLAGS -L$d/lib" done fi ## Autoheader stuff. ################################################################################ # # What follows was originally output from autoscan. We do some generic # checking before overiding specific stuff (ACCEPT_ARG3_TYPE) for # certain known systems. # # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { 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 g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { 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 if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi 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` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } if test -z "$ac_file"; then 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 # Check that 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' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 that 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 { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 | *.map | *.inf | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` 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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; *) 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_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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; 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 core 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 { 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 ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" 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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CXXFLAGS="" 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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" 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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { 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 ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi { echo "$as_me:$LINENO: result: $_am_result" >&5 echo "${ECHO_T}$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi if test "$CXX" = "" ; then HAVE_CXX=false { echo "$as_me:$LINENO: WARNING: Configuring without a C++ compiler (couldn't find one on your system). C++ is only used only to compile the vrml->OOGL converter, so your distribution will be compiled without it. " >&5 echo "$as_me: WARNING: Configuring without a C++ compiler (couldn't find one on your system). C++ is only used only to compile the vrml->OOGL converter, so your distribution will be compiled without it. " >&2;} else HAVE_CXX=true fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { 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 if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { 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 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { 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.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { 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.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { 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 if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi 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` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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_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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; 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 core 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 { 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 ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" 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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" 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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" 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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { 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 ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=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 -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi _alberta_save_cflags="${CFLAGS}" 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 ISO C99 features with \"${CC} ${CFLAGS}\"" >&5 echo $ECHO_N "checking for ISO C99 features with \"${CC} ${CFLAGS}\"... $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. */ extern void exit(int status); #define FOO(a, ...) (a, __VA_ARGS__) extern int foo(int a, int b, int c); int main () { int bar[foo FOO(3, 4, 5)]; exit(bar[0]); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then HAVE_ISO_C99=1 { echo "$as_me:$LINENO: result: variadic macros and variable length arrays are available" >&5 echo "${ECHO_T}variadic macros and variable length arrays are available" >&6; } else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 HAVE_ISO_C99=0 { echo "$as_me:$LINENO: result: variadic macros and/or vairable length arrays are NOT available" >&5 echo "${ECHO_T}variadic macros and/or vairable length arrays are NOT available" >&6; } fi rm -f core 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 CFLAGS="${_alberta_save_cflags}" cat >>confdefs.h <<_ACEOF #define HAVE_ISO_C99 ${HAVE_ISO_C99} _ACEOF for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$AWK" && break done # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' 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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.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 nonexistent 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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.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 nonexistent 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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.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 for ac_prog in flex lex 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_LEX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LEX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { echo "$as_me:$LINENO: result: $LEX" >&5 echo "${ECHO_T}$LEX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { yyless (input () != 0); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { (ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: checking lex output file root" >&5 echo $ECHO_N "checking lex output file root... $ECHO_C" >&6; } if test "${ac_cv_prog_lex_root+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else { { echo "$as_me:$LINENO: error: cannot find output from $LEX; giving up" >&5 echo "$as_me: error: cannot find output from $LEX; giving up" >&2;} { (exit 1); exit 1; }; } fi fi { echo "$as_me:$LINENO: result: $ac_cv_prog_lex_root" >&5 echo "${ECHO_T}$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { echo "$as_me:$LINENO: checking lex library" >&5 echo $ECHO_N "checking lex library... $ECHO_C" >&6; } if test "${ac_cv_lib_lex+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat >conftest.$ac_ext <<_ACEOF `cat $LEX_OUTPUT_ROOT.c` _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_lex=$ac_lib else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_lex" >&5 echo "${ECHO_T}$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { echo "$as_me:$LINENO: checking whether yytext is a pointer" >&5 echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6; } if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat >conftest.$ac_ext <<_ACEOF #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_prog_lex_yytext_pointer=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_prog_lex_yytext_pointer" >&5 echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then cat >>confdefs.h <<\_ACEOF #define YYTEXT_POINTER 1 _ACEOF fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi #AC_PROG_RANLIB for ac_prog in 'bison -y' byacc 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_YACC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_YACC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { echo "$as_me:$LINENO: result: $YACC" >&5 echo "${ECHO_T}$YACC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" #AC_DISABLE_SHARED if true || test "z${enable_shared}" = "zyes"; then INSTALL_LIBGEOMVIEW_TRUE= INSTALL_LIBGEOMVIEW_FALSE='#' else INSTALL_LIBGEOMVIEW_TRUE='#' INSTALL_LIBGEOMVIEW_FALSE= fi # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi { echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; } if test "${lt_cv_path_SED+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$lt_ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$lt_ac_prog$ac_exec_ext"; }; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done fi SED=$lt_cv_path_SED { echo "$as_me:$LINENO: result: $SED" >&5 echo "${ECHO_T}$SED" >&6; } { echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Extract the first word of "grep ggrep" to use in msg output if test -z "$GREP"; then set dummy grep ggrep; ac_prog_name=$2 if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS fi GREP="$ac_cv_path_GREP" if test -z "$GREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 echo "${ECHO_T}$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } if test "${ac_cv_path_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_path_EGREP="$GREP -E" else # Extract the first word of "egrep" to use in msg output if test -z "$EGREP"; then set dummy egrep; ac_prog_name=$2 if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS fi EGREP="$ac_cv_path_EGREP" if test -z "$EGREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } else { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } { echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; } if test "${lt_cv_ld_reload_flag+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_ld_reload_flag='-r' fi { echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac { echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6; } if test "${lt_cv_path_NM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi { echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 echo "${ECHO_T}$lt_cv_path_NM" >&6; } NM="$lt_cv_path_NM" { 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 how to recognize dependent libraries" >&5 echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6; } if test "${lt_cv_deplibs_check_method+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix4* | aix5*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; } file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 5743 "configure"' > conftest.$ac_ext 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 if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext 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 case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; } if test "${lt_cv_cc_needs_belf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat >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 conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_cv_cc_needs_belf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) LD="${LD-ld} -64" ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" { 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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; 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 core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >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 #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 core.conftest.* 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 { as_var=$as_ac_Header; eval "test \"\${$as_var+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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; 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 core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&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 dlfcn.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; 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 core 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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.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 Claus-Justus Heine ## ## -------------------------------------------------------------------------- ## _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 { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&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 -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { 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; } if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.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 nonexistent 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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.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_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { echo "$as_me:$LINENO: result: $CXXCPP" >&5 echo "${ECHO_T}$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.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 nonexistent 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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.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 \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then { echo "$as_me:$LINENO: result: $F77" >&5 echo "${ECHO_T}$F77" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { 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_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_F77="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then { echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 echo "${ECHO_T}$ac_ct_F77" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_F77" && break done if test "x$ac_ct_F77" = x; then F77="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac F77=$ac_ct_F77 fi fi # Provide some information about the compiler. echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6; } if test "${ac_cv_f77_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; 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 core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= { echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_f77_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else FFLAGS=-g cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_f77_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_f77_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 echo "${ECHO_T}$ac_cv_prog_f77_g" >&6; } if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi G77=`test $ac_compiler_gnu = yes && echo yes` ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments { echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; } if test "${lt_cv_sys_max_cmd_len+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; } else { echo "$as_me:$LINENO: result: none" >&5 echo "${ECHO_T}none" >&6; } fi # Check for command to grab the raw symbol name followed by C symbol from nm. { echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; } if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32*) symcode='[ABCDGISTW]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux* | k*bsd*-gnu) if test "$host_cpu" = ia64; then symcode='[ABCDGIRSTW]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Now try to grab the symbols. nlist=conftest.nm if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { echo "$as_me:$LINENO: result: failed" >&5 echo "${ECHO_T}failed" >&6; } else { echo "$as_me:$LINENO: result: ok" >&5 echo "${ECHO_T}ok" >&6; } fi { echo "$as_me:$LINENO: checking for objdir" >&5 echo $ECHO_N "checking for objdir... $ECHO_C" >&6; } if test "${lt_cv_objdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 echo "${ECHO_T}$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e 1s/^X//' sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { echo "$as_me:$LINENO: result: $AR" >&5 echo "${ECHO_T}$AR" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { 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_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 echo "${ECHO_T}$ac_ct_AR" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { 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_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { 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_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { echo "$as_me:$LINENO: checking for file" >&5 echo $ECHO_N "checking for file... $ECHO_C" >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac enable_dlopen=no enable_win32_dll=no # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Check whether --with-pic was given. if test "${with_pic+set}" = set; then withval=$with_pic; pic_mode="$withval" else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check if we have a version mismatch between libtool.m4 and ltmain.sh. # # Note: This should be in AC_LIBTOOL_SETUP, _after_ $ltmain have been defined. # We also should do it _before_ AC_LIBTOOL_LANG_C_CONFIG that actually # calls AC_LIBTOOL_CONFIG and creates libtool. # { echo "$as_me:$LINENO: checking for correct ltmain.sh version" >&5 echo $ECHO_N "checking for correct ltmain.sh version... $ECHO_C" >&6; } if test "x$ltmain" = "x" ; then { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } { { echo "$as_me:$LINENO: error: *** [Gentoo] sanity check failed! *** *** \$ltmain is not defined, please check the patch for consistency! *** " >&5 echo "$as_me: error: *** [Gentoo] sanity check failed! *** *** \$ltmain is not defined, please check the patch for consistency! *** " >&2;} { (exit 1); exit 1; }; } fi gentoo_lt_version="1.5.24" gentoo_ltmain_version=`sed -n '/^[ ]*VERSION=/{s/^[ ]*VERSION=//;p;q;}' "$ltmain"` if test "x$gentoo_lt_version" != "x$gentoo_ltmain_version" ; then { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } { { echo "$as_me:$LINENO: error: *** [Gentoo] sanity check failed! *** *** libtool.m4 and ltmain.sh have a version mismatch! *** *** (libtool.m4 = $gentoo_lt_version, ltmain.sh = $gentoo_ltmain_version) *** Please run: libtoolize --copy --force if appropriate, please contact the maintainer of this package (or your distribution) for help. " >&5 echo "$as_me: error: *** [Gentoo] sanity check failed! *** *** libtool.m4 and ltmain.sh have a version mismatch! *** *** (libtool.m4 = $gentoo_lt_version, ltmain.sh = $gentoo_ltmain_version) *** Please run: libtoolize --copy --force if appropriate, please contact the maintainer of this package (or your distribution) for help. " >&2;} { (exit 1); exit 1; }; } else { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } fi # Use C for the default configuration in the libtool script tagname= lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' { echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:7844: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:7848: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= { echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic='-qnocommon' lt_prog_compiler_wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; esac ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 echo "${ECHO_T}$lt_prog_compiler_pic" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; } if test "${lt_prog_compiler_pic_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8134: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8138: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works=yes fi fi $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6; } if test x"$lt_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } if test "${lt_prog_compiler_static_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_static_works=yes fi else lt_prog_compiler_static_works=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works" >&6; } if test x"$lt_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8238: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8242: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } runpath_var= allow_undefined_flag= enable_shared_with_static_runtimes=no archive_cmds= archive_expsym_cmds= old_archive_From_new_cmds= old_archive_from_expsyms_cmds= export_dynamic_flag_spec= whole_archive_flag_spec= thread_safe_flag_spec= hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no hardcode_shlibpath_var=unsupported link_all_deplibs=unknown hardcode_automatic=no module_cmds= module_expsym_cmds= always_export_symbols=no export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; *) tmp_sharedflag='-shared' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_libdir_separator=':' link_all_deplibs=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >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 conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. 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 conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='' link_all_deplibs=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs=no ;; esac fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld='-rpath $libdir' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac fi { echo "$as_me:$LINENO: result: $ld_shlibs" >&5 echo "${ECHO_T}$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext 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); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 echo "${ECHO_T}$archive_cmds_need_lc" >&6; } ;; esac fi ;; esac { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` else lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` sys_lib_search_path_spec=`echo $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var" || \ test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { echo "$as_me:$LINENO: result: $hardcode_action" >&5 echo "${ECHO_T}$hardcode_action" >&6; } if test "$hardcode_action" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= { echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { 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; } fi ;; *) { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) { echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } if test "${ac_cv_func_shl_load+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. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_shl_load || defined __stub___shl_load choke me #endif int main () { return shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else { echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } if test "${ac_cv_func_dlopen+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. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_dlopen || defined __stub___dlopen choke me #endif int main () { return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); } EOF 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); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); } EOF 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); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # Report which library types will actually be built { echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6; } { echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6; } { echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6; } # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler \ CC \ LD \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_prog_compiler_no_builtin_flag \ export_dynamic_flag_spec \ thread_safe_flag_spec \ whole_archive_flag_spec \ enable_shared_with_static_runtimes \ old_archive_cmds \ old_archive_from_new_cmds \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ archive_cmds \ archive_expsym_cmds \ postinstall_cmds \ postuninstall_cmds \ old_archive_from_expsyms_cmds \ allow_undefined_flag \ no_undefined_flag \ export_symbols_cmds \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ hardcode_automatic \ module_cmds \ module_expsym_cmds \ lt_cv_prog_compiler_c_o \ fix_srcfile_path \ exclude_expsyms \ include_expsyms; do case $var in old_archive_cmds | \ old_archive_from_new_cmds | \ archive_cmds | \ archive_expsym_cmds | \ module_cmds | \ module_expsym_cmds | \ old_archive_from_expsyms_cmds | \ export_symbols_cmds | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" { echo "$as_me:$LINENO: creating $ofile" >&5 echo "$as_me: creating $ofile" >&6;} cat <<__EOF__ >> "$cfgfile" #! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e 1s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler # Is the compiler the GNU C compiler? with_gcc=$GCC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # ### END LIBTOOL CONFIG __EOF__ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" # Check whether --with-tags was given. if test "${with_tags+set}" = set; then withval=$with_tags; tagnames="$withval" fi if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} else { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} fi fi if test -z "$LTCFLAGS"; then eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in "") ;; *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 echo "$as_me: error: invalid tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} { (exit 1); exit 1; }; } fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } else { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } { echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >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 conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. 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 conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='' link_all_deplibs_CXX=yes if test "$GXX" = yes ; then lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_CXX=no ;; esac fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc*) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC*) # Portland Group C++ compiler archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' else ld_shlibs_CXX=no fi ;; osf3*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ $rm $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. # So that behaviour is only enabled if SCOABSPATH is set to a # non-empty value in the environment. Most likely only useful for # creating official distributions of packages. # This is a hack until libtool officially supports absolute path # names for shared libraries. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no # The `*' in the case matches for architectures that use `case' in # $output_verbose_cmd can trigger glob expansion during the loop # eval without this substitution. output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` for p in `eval $output_verbose_link_cmd`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" \ || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $rm -f confest.$objext # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= { echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_CXX='-qnocommon' lt_prog_compiler_wl_CXX='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; icpc* | ecpc*) # Intel C++ lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC*) # Portland Group C++ compiler. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6; } if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13120: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:13124: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works_CXX=yes fi fi $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } if test "${lt_prog_compiler_static_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_static_works_CXX=yes fi else lt_prog_compiler_static_works_CXX=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6; } if test x"$lt_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_CXX=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13224: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13228: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext 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); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_CXX=no else archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6; } ;; esac fi ;; esac { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || \ test -n "$runpath_var_CXX" || \ test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 echo "${ECHO_T}$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_CXX \ CC_CXX \ LD_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_static_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ export_dynamic_flag_spec_CXX \ thread_safe_flag_spec_CXX \ whole_archive_flag_spec_CXX \ enable_shared_with_static_runtimes_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ postinstall_cmds_CXX \ postuninstall_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ export_symbols_cmds_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ hardcode_automatic_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ lt_cv_prog_compiler_c_o_CXX \ fix_srcfile_path_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX; do case $var in old_archive_cmds_CXX | \ old_archive_from_new_cmds_CXX | \ archive_cmds_CXX | \ archive_expsym_cmds_CXX | \ module_cmds_CXX | \ module_expsym_cmds_CXX | \ old_archive_from_expsyms_cmds_CXX | \ export_symbols_cmds_CXX | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU C compiler? with_gcc=$GCC_CXX # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_CXX # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_CXX old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_CXX # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_CXX # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_CXX # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_CXX # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC compiler_F77=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` { echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6; } { echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6; } { echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6; } GCC_F77="$G77" LD_F77="$LD" lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= { echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_F77='-qnocommon' lt_prog_compiler_wl_F77='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='' ;; esac ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; rdos*) lt_prog_compiler_static_F77='-non_shared' ;; solaris*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl_F77='-Qoption ld ';; *) lt_prog_compiler_wl_F77='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; unicos*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_can_build_shared_F77=no ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6; } if test "${lt_prog_compiler_pic_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14799: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:14803: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works_F77=yes fi fi $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6; } if test x"$lt_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" { echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } if test "${lt_prog_compiler_static_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works_F77=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_static_works_F77=yes fi else lt_prog_compiler_static_works_F77=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6; } if test x"$lt_prog_compiler_static_works_F77" = xyes; then : else lt_prog_compiler_static_F77= fi { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_F77=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14903: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:14907: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } runpath_var= allow_undefined_flag_F77= enable_shared_with_static_runtimes_F77=no archive_cmds_F77= archive_expsym_cmds_F77= old_archive_From_new_cmds_F77= old_archive_from_expsyms_cmds_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= thread_safe_flag_spec_F77= hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_direct_F77=no hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported link_all_deplibs_F77=unknown hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= always_export_symbols_F77=no export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_F77=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_F77='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_F77= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_F77=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_F77=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_F77=no fi ;; interix[3-9]*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; *) tmp_sharedflag='-shared' ;; esac archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs_F77=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test "$ld_shlibs_F77" = no; then runpath_var= hardcode_libdir_flag_spec_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77='$convenience' archive_cmds_need_lc_F77=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # see comment about different semantics on the GNU ld section ld_shlibs_F77=no ;; bsdi[45]*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path_F77='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_F77=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_F77=no hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported whole_archive_flag_spec_F77='' link_all_deplibs_F77=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_F77=no ;; esac fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; freebsd1*) ld_shlibs_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_F77='+b $libdir' hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; *) hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: link_all_deplibs_F77=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-R$libdir' ;; *) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs_F77=no fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi hardcode_libdir_separator_F77=: ;; solaris*) no_undefined_flag_F77=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_F77='${wl}-z,text' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_F77='${wl}-z,text' allow_undefined_flag_F77='${wl}-z,nodefs' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac fi { echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 echo "${ECHO_T}$ld_shlibs_F77" >&6; } test "$ld_shlibs_F77" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext 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); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 pic_flag=$lt_prog_compiler_pic_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_F77=no else archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6; } ;; esac fi ;; esac { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || \ test -n "$runpath_var_F77" || \ test "X$hardcode_automatic_F77" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_F77" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && test "$hardcode_minus_L_F77" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi { echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 echo "${ECHO_T}$hardcode_action_F77" >&6; } if test "$hardcode_action_F77" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_F77 \ CC_F77 \ LD_F77 \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_static_F77 \ lt_prog_compiler_no_builtin_flag_F77 \ export_dynamic_flag_spec_F77 \ thread_safe_flag_spec_F77 \ whole_archive_flag_spec_F77 \ enable_shared_with_static_runtimes_F77 \ old_archive_cmds_F77 \ old_archive_from_new_cmds_F77 \ predep_objects_F77 \ postdep_objects_F77 \ predeps_F77 \ postdeps_F77 \ compiler_lib_search_path_F77 \ archive_cmds_F77 \ archive_expsym_cmds_F77 \ postinstall_cmds_F77 \ postuninstall_cmds_F77 \ old_archive_from_expsyms_cmds_F77 \ allow_undefined_flag_F77 \ no_undefined_flag_F77 \ export_symbols_cmds_F77 \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_ld_F77 \ hardcode_libdir_separator_F77 \ hardcode_automatic_F77 \ module_cmds_F77 \ module_expsym_cmds_F77 \ lt_cv_prog_compiler_c_o_F77 \ fix_srcfile_path_F77 \ exclude_expsyms_F77 \ include_expsyms_F77; do case $var in old_archive_cmds_F77 | \ old_archive_from_new_cmds_F77 | \ archive_cmds_F77 | \ archive_expsym_cmds_F77 | \ module_cmds_F77 | \ module_expsym_cmds_F77 | \ old_archive_from_expsyms_cmds_F77 | \ export_symbols_cmds_F77 | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU C compiler? with_gcc=$GCC_F77 # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_F77 # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_F77 old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_F77 # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_F77 # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_F77 # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_F77 # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o objext_GCJ=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC compiler_GCJ=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # GCJ did not exist at the time GCC didn't implicitly link libc in. archive_cmds_need_lc_GCJ=no old_archive_cmds_GCJ=$old_archive_cmds lt_prog_compiler_no_builtin_flag_GCJ= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' { echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17103: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:17107: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl_GCJ= lt_prog_compiler_pic_GCJ= lt_prog_compiler_static_GCJ= { echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_static_GCJ='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_GCJ='-fno-common' ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_GCJ=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_GCJ=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_GCJ='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' else lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_GCJ='-qnocommon' lt_prog_compiler_wl_GCJ='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_GCJ='-non_shared' ;; newsos6) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-fpic' lt_prog_compiler_static_GCJ='-Bstatic' ;; ccc*) lt_prog_compiler_wl_GCJ='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' lt_prog_compiler_wl_GCJ='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' lt_prog_compiler_wl_GCJ='' ;; esac ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_GCJ='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; rdos*) lt_prog_compiler_static_GCJ='-non_shared' ;; solaris*) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl_GCJ='-Qoption ld ';; *) lt_prog_compiler_wl_GCJ='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_GCJ='-Qoption ld ' lt_prog_compiler_pic_GCJ='-PIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_GCJ='-Kconform_pic' lt_prog_compiler_static_GCJ='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; unicos*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_can_build_shared_GCJ=no ;; uts4*) lt_prog_compiler_pic_GCJ='-pic' lt_prog_compiler_static_GCJ='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_GCJ=no ;; esac fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_GCJ"; then { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6; } if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_GCJ=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_GCJ" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17393: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:17397: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_pic_works_GCJ=yes fi fi $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6; } if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then case $lt_prog_compiler_pic_GCJ in "" | " "*) ;; *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; esac else lt_prog_compiler_pic_GCJ= lt_prog_compiler_can_build_shared_GCJ=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_GCJ= ;; *) lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" { echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works_GCJ=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_prog_compiler_static_works_GCJ=yes fi else lt_prog_compiler_static_works_GCJ=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6; } if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then : else lt_prog_compiler_static_GCJ= fi { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_GCJ=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17497: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:17501: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_GCJ=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } runpath_var= allow_undefined_flag_GCJ= enable_shared_with_static_runtimes_GCJ=no archive_cmds_GCJ= archive_expsym_cmds_GCJ= old_archive_From_new_cmds_GCJ= old_archive_from_expsyms_cmds_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= thread_safe_flag_spec_GCJ= hardcode_libdir_flag_spec_GCJ= hardcode_libdir_flag_spec_ld_GCJ= hardcode_libdir_separator_GCJ= hardcode_direct_GCJ=no hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=unsupported link_all_deplibs_GCJ=unknown hardcode_automatic_GCJ=no module_cmds_GCJ= module_expsym_cmds_GCJ= always_export_symbols_GCJ=no export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_GCJ= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_GCJ=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_GCJ= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_GCJ=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_GCJ=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_GCJ=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_GCJ=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_GCJ='-L$libdir' allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=no enable_shared_with_static_runtimes_GCJ=yes export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_GCJ=no fi ;; interix[3-9]*) hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_GCJ='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; *) tmp_sharedflag='-shared' ;; esac archive_cmds_GCJ='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi else ld_shlibs_GCJ=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_GCJ=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_GCJ=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac ;; sunos4*) archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac if test "$ld_shlibs_GCJ" = no; then runpath_var= hardcode_libdir_flag_spec_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=yes archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_GCJ=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_GCJ=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_GCJ='' hardcode_direct_GCJ=yes hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_GCJ=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_GCJ=yes hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_libdir_separator_GCJ= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_GCJ=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_GCJ='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >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 conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_GCJ="-z nodefs" archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. 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 conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_GCJ=' ${wl}-bernotok' allow_undefined_flag_GCJ=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_GCJ='$convenience' archive_cmds_need_lc_GCJ=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # see comment about different semantics on the GNU ld section ld_shlibs_GCJ=no ;; bsdi[45]*) export_dynamic_flag_spec_GCJ=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_GCJ=' ' allow_undefined_flag_GCJ=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_GCJ='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_GCJ='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_GCJ=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_GCJ=no hardcode_direct_GCJ=no hardcode_automatic_GCJ=yes hardcode_shlibpath_var_GCJ=unsupported whole_archive_flag_spec_GCJ='' link_all_deplibs_GCJ=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_GCJ=no ;; esac fi ;; dgux*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; freebsd1*) ld_shlibs_GCJ=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no ;; *) hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: link_all_deplibs_GCJ=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; newsos6) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_shlibpath_var_GCJ=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' ;; *) archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs_GCJ=no fi ;; os2*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes allow_undefined_flag_GCJ=unsupported archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_GCJ='-rpath $libdir' fi hardcode_libdir_separator_GCJ=: ;; solaris*) no_undefined_flag_GCJ=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_shlibpath_var_GCJ=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_GCJ=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; sysv4) case $host_vendor in sni) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_GCJ='$CC -r -o $output$reload_objs' hardcode_direct_GCJ=no ;; motorola) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv4.3*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_GCJ=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_GCJ='${wl}-z,text' archive_cmds_need_lc_GCJ=no hardcode_shlibpath_var_GCJ=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_GCJ='${wl}-z,text' allow_undefined_flag_GCJ='${wl}-z,nodefs' archive_cmds_need_lc_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; *) ld_shlibs_GCJ=no ;; esac fi { echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 echo "${ECHO_T}$ld_shlibs_GCJ" >&6; } test "$ld_shlibs_GCJ" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_GCJ" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_GCJ=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_GCJ in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext 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); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_GCJ pic_flag=$lt_prog_compiler_pic_GCJ compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ allow_undefined_flag_GCJ= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_GCJ=no else archive_cmds_need_lc_GCJ=yes fi allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6; } ;; esac fi ;; esac { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi # Handle Gentoo/FreeBSD as it was Linux case $host_vendor in gentoo) version_type=linux ;; *) version_type=freebsd-$objformat ;; esac case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; linux) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' need_lib_prefix=no need_version=no ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action_GCJ= if test -n "$hardcode_libdir_flag_spec_GCJ" || \ test -n "$runpath_var_GCJ" || \ test "X$hardcode_automatic_GCJ" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_GCJ" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && test "$hardcode_minus_L_GCJ" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_GCJ=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_GCJ=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_GCJ=unsupported fi { echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 echo "${ECHO_T}$hardcode_action_GCJ" >&6; } if test "$hardcode_action_GCJ" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_GCJ \ CC_GCJ \ LD_GCJ \ lt_prog_compiler_wl_GCJ \ lt_prog_compiler_pic_GCJ \ lt_prog_compiler_static_GCJ \ lt_prog_compiler_no_builtin_flag_GCJ \ export_dynamic_flag_spec_GCJ \ thread_safe_flag_spec_GCJ \ whole_archive_flag_spec_GCJ \ enable_shared_with_static_runtimes_GCJ \ old_archive_cmds_GCJ \ old_archive_from_new_cmds_GCJ \ predep_objects_GCJ \ postdep_objects_GCJ \ predeps_GCJ \ postdeps_GCJ \ compiler_lib_search_path_GCJ \ archive_cmds_GCJ \ archive_expsym_cmds_GCJ \ postinstall_cmds_GCJ \ postuninstall_cmds_GCJ \ old_archive_from_expsyms_cmds_GCJ \ allow_undefined_flag_GCJ \ no_undefined_flag_GCJ \ export_symbols_cmds_GCJ \ hardcode_libdir_flag_spec_GCJ \ hardcode_libdir_flag_spec_ld_GCJ \ hardcode_libdir_separator_GCJ \ hardcode_automatic_GCJ \ module_cmds_GCJ \ module_expsym_cmds_GCJ \ lt_cv_prog_compiler_c_o_GCJ \ fix_srcfile_path_GCJ \ exclude_expsyms_GCJ \ include_expsyms_GCJ; do case $var in old_archive_cmds_GCJ | \ old_archive_from_new_cmds_GCJ | \ archive_cmds_GCJ | \ archive_expsym_cmds_GCJ | \ module_cmds_GCJ | \ module_expsym_cmds_GCJ | \ old_archive_from_expsyms_cmds_GCJ | \ export_symbols_cmds_GCJ | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_GCJ # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_GCJ # Is the compiler the GNU C compiler? with_gcc=$GCC_GCJ # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_GCJ # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_GCJ # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_GCJ pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_GCJ # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_GCJ old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_GCJ archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_GCJ module_expsym_cmds=$lt_module_expsym_cmds_GCJ # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_GCJ # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_GCJ # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_GCJ # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_GCJ # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_GCJ # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_GCJ # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_GCJ # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_GCJ # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_GCJ # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_GCJ # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_GCJ # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_GCJ # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_GCJ # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; RC) # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o objext_RC=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC compiler_RC=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` lt_cv_prog_compiler_c_o_RC=yes # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_RC \ CC_RC \ LD_RC \ lt_prog_compiler_wl_RC \ lt_prog_compiler_pic_RC \ lt_prog_compiler_static_RC \ lt_prog_compiler_no_builtin_flag_RC \ export_dynamic_flag_spec_RC \ thread_safe_flag_spec_RC \ whole_archive_flag_spec_RC \ enable_shared_with_static_runtimes_RC \ old_archive_cmds_RC \ old_archive_from_new_cmds_RC \ predep_objects_RC \ postdep_objects_RC \ predeps_RC \ postdeps_RC \ compiler_lib_search_path_RC \ archive_cmds_RC \ archive_expsym_cmds_RC \ postinstall_cmds_RC \ postuninstall_cmds_RC \ old_archive_from_expsyms_cmds_RC \ allow_undefined_flag_RC \ no_undefined_flag_RC \ export_symbols_cmds_RC \ hardcode_libdir_flag_spec_RC \ hardcode_libdir_flag_spec_ld_RC \ hardcode_libdir_separator_RC \ hardcode_automatic_RC \ module_cmds_RC \ module_expsym_cmds_RC \ lt_cv_prog_compiler_c_o_RC \ fix_srcfile_path_RC \ exclude_expsyms_RC \ include_expsyms_RC; do case $var in old_archive_cmds_RC | \ old_archive_from_new_cmds_RC | \ archive_cmds_RC | \ archive_expsym_cmds_RC | \ module_cmds_RC | \ module_expsym_cmds_RC | \ old_archive_from_expsyms_cmds_RC | \ export_symbols_cmds_RC | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_RC # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_RC # Is the compiler the GNU C compiler? with_gcc=$GCC_RC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_RC # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_RC # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_RC pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_RC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_RC old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_RC archive_expsym_cmds=$lt_archive_expsym_cmds_RC postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_RC module_expsym_cmds=$lt_module_expsym_cmds_RC # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_RC # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_RC # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_RC # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_RC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_RC # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_RC # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_RC # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_RC # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_RC # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_RC # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_RC # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_RC # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_RC # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_RC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_RC # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_RC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_RC # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ;; *) { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 echo "$as_me: error: Unsupported tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 echo "$as_me: error: unable to update list of available tagged configurations." >&2;} { (exit 1); exit 1; }; } fi fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' # Prevent multiple expansion # Search path for "find" executable. Use "find" unless # the bogus MS Windows version is first on the path, in # which case we use the full pathname. This AC_CHECK_PROG # macro is very strange. # Extract the first word of "find", so it can be a program name with args. set dummy find; 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_FIND+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$FIND"; then ac_cv_prog_FIND="$FIND" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/cygdrive/c/WINNT/system32/find"; then ac_prog_rejected=yes continue fi ac_cv_prog_FIND="find" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_FIND 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 FIND to just the basename; use the full file name. shift ac_cv_prog_FIND="$as_dir/$ac_word${1+' '}$@" fi fi test -z "$ac_cv_prog_FIND" && ac_cv_prog_FIND="no" fi fi FIND=$ac_cv_prog_FIND if test -n "$FIND"; then { echo "$as_me:$LINENO: result: $FIND" >&5 echo "${ECHO_T}$FIND" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "$FIND" = "no"; then { { echo "$as_me:$LINENO: error: No find found. Cannot continue." >&5 echo "$as_me: error: No find found. Cannot continue." >&2;} { (exit 1); exit 1; }; } fi # Check for availability of /bin/csh for file-name globbing. Try /bin/sh # if not found. for ac_prog in csh sh 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_path_GLOB_SHELL_PATH+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $GLOB_SHELL_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_GLOB_SHELL_PATH="$GLOB_SHELL_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GLOB_SHELL_PATH="$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 IFS=$as_save_IFS ;; esac fi GLOB_SHELL_PATH=$ac_cv_path_GLOB_SHELL_PATH if test -n "$GLOB_SHELL_PATH"; then { echo "$as_me:$LINENO: result: $GLOB_SHELL_PATH" >&5 echo "${ECHO_T}$GLOB_SHELL_PATH" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$GLOB_SHELL_PATH" && break done test -n "$GLOB_SHELL_PATH" || GLOB_SHELL_PATH="/bin/csh" if echo ${GLOB_SHELL_PATH} | grep csh > /dev/null 2>&1; then GLOB_SHELL="${GLOB_SHELL_PATH} -f -c " else GLOB_SHELL="${GLOB_SHELL_PATH} -c " fi cat >>confdefs.h <<_ACEOF #define GLOB_SHELL "${GLOB_SHELL}" _ACEOF # for ac_prog in ps2epsi 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_PS2EPSI+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$PS2EPSI"; then ac_cv_prog_PS2EPSI="$PS2EPSI" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PS2EPSI="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PS2EPSI=$ac_cv_prog_PS2EPSI if test -n "$PS2EPSI"; then { echo "$as_me:$LINENO: result: $PS2EPSI" >&5 echo "${ECHO_T}$PS2EPSI" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$PS2EPSI" && break done for ac_prog in epstopdf 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_EPSTOPDF+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$EPSTOPDF"; then ac_cv_prog_EPSTOPDF="$EPSTOPDF" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_EPSTOPDF="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi EPSTOPDF=$ac_cv_prog_EPSTOPDF if test -n "$EPSTOPDF"; then { echo "$as_me:$LINENO: result: $EPSTOPDF" >&5 echo "${ECHO_T}$EPSTOPDF" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$EPSTOPDF" && break done for ac_prog in pdfimages 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_PDFIMAGESPROG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$PDFIMAGESPROG"; then ac_cv_prog_PDFIMAGESPROG="$PDFIMAGESPROG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PDFIMAGESPROG="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PDFIMAGESPROG=$ac_cv_prog_PDFIMAGESPROG if test -n "$PDFIMAGESPROG"; then { echo "$as_me:$LINENO: result: $PDFIMAGESPROG" >&5 echo "${ECHO_T}$PDFIMAGESPROG" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$PDFIMAGESPROG" && break done for ac_prog in pnmtopng 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_PNMTOPNG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$PNMTOPNG"; then ac_cv_prog_PNMTOPNG="$PNMTOPNG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PNMTOPNG="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PNMTOPNG=$ac_cv_prog_PNMTOPNG if test -n "$PNMTOPNG"; then { echo "$as_me:$LINENO: result: $PNMTOPNG" >&5 echo "${ECHO_T}$PNMTOPNG" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$PNMTOPNG" && break done # For rman texture support. If not found we can only output RGB pnm images # without alpha channel. for ac_prog in pamtotiff 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_PAMTOTIFF+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$PAMTOTIFF"; then ac_cv_prog_PAMTOTIFF="$PAMTOTIFF" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PAMTOTIFF="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PAMTOTIFF=$ac_cv_prog_PAMTOTIFF if test -n "$PAMTOTIFF"; then { echo "$as_me:$LINENO: result: $PAMTOTIFF" >&5 echo "${ECHO_T}$PAMTOTIFF" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$PAMTOTIFF" && break done if test "${PAMTOTIFF}" = "pamtotiff"; then cat >>confdefs.h <<_ACEOF #define HAVE_PAMTOTIFF "$PAMTOTIFF" _ACEOF else { echo "$as_me:$LINENO: \`pamtotiff' executable not found; textures in RenderMan output will not have an alpha-channel. Consider installing a newer NetPBM package." >&5 echo "$as_me: \`pamtotiff' executable not found; textures in RenderMan output will not have an alpha-channel. Consider installing a newer NetPBM package." >&6;} fi # Check for various shader language comilers; we try to compile and # install our RenderMan shaders for any of the shader compilers; I # have included only those which are free of charge. # # Check whether --with-aqsis-shader-compiler was given. if test "${with_aqsis_shader_compiler+set}" = set; then withval=$with_aqsis_shader_compiler; case "${withval}" in no) { { echo "$as_me:$LINENO: error: \"--without-aqsis-shader-compiler\" or \"--with-aqsis-shader-compiler=no\" is not an option here" >&5 echo "$as_me: error: \"--without-aqsis-shader-compiler\" or \"--with-aqsis-shader-compiler=no\" is not an option here" >&2;} { (exit 1); exit 1; }; } ;; yes) # simply ignore that, use auto-detection ;; *) AQSIS_SHADER_COMPILEROPT="${withval}" ;; esac else AQSIS_SHADER_COMPILEROPT=aqsl fi acgv_path=`dirname "${AQSIS_SHADER_COMPILEROPT}"|sed -e 's|^\./\?||g'` if test -n "${acgv_path}"; then AQSIS_SHADER_COMPILERPROG=`basename "${AQSIS_SHADER_COMPILEROPT}"` if echo "${acgv_path}" | egrep '^/' > /dev/null 2>&1 ; then acgv_path="${acgv_path}" else acgv_path="`pwd`/${acgv_path}" fi for ac_prog in ${AQSIS_SHADER_COMPILERPROG} 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_path_AQSIS_SHADER_COMPILER+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $AQSIS_SHADER_COMPILER in [\\/]* | ?:[\\/]*) ac_cv_path_AQSIS_SHADER_COMPILER="$AQSIS_SHADER_COMPILER" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${acgv_path} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_AQSIS_SHADER_COMPILER="$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 IFS=$as_save_IFS ;; esac fi AQSIS_SHADER_COMPILER=$ac_cv_path_AQSIS_SHADER_COMPILER if test -n "$AQSIS_SHADER_COMPILER"; then { echo "$as_me:$LINENO: result: $AQSIS_SHADER_COMPILER" >&5 echo "${ECHO_T}$AQSIS_SHADER_COMPILER" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$AQSIS_SHADER_COMPILER" && break done test -n "$AQSIS_SHADER_COMPILER" || AQSIS_SHADER_COMPILER="not found" else AQSIS_SHADER_COMPILERPROG="${AQSIS_SHADER_COMPILEROPT}" acgv_path="${PATH}" for ac_prog in ${AQSIS_SHADER_COMPILERPROG} 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_AQSIS_SHADER_COMPILER+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AQSIS_SHADER_COMPILER"; then ac_cv_prog_AQSIS_SHADER_COMPILER="$AQSIS_SHADER_COMPILER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${acgv_path} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AQSIS_SHADER_COMPILER="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AQSIS_SHADER_COMPILER=$ac_cv_prog_AQSIS_SHADER_COMPILER if test -n "$AQSIS_SHADER_COMPILER"; then { echo "$as_me:$LINENO: result: $AQSIS_SHADER_COMPILER" >&5 echo "${ECHO_T}$AQSIS_SHADER_COMPILER" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$AQSIS_SHADER_COMPILER" && break done test -n "$AQSIS_SHADER_COMPILER" || AQSIS_SHADER_COMPILER="not found" fi acgv_required=optional if test "${AQSIS_SHADER_COMPILER}" = "not found" -a "${acgv_required}" = "required"; then { { echo "$as_me:$LINENO: error: \`aqsis-shader-compiler' executable not found. Check your installation." >&5 echo "$as_me: error: \`aqsis-shader-compiler' executable not found. Check your installation." >&2;} { (exit 1); exit 1; }; } exit 1 fi if ! test "${AQSIS_SHADER_COMPILER}" = "not found"; then AQSIS_SHADER_COMPILER_TRUE= AQSIS_SHADER_COMPILER_FALSE='#' else AQSIS_SHADER_COMPILER_TRUE='#' AQSIS_SHADER_COMPILER_FALSE= fi # Check whether --with-pixie-shader-compiler was given. if test "${with_pixie_shader_compiler+set}" = set; then withval=$with_pixie_shader_compiler; case "${withval}" in no) { { echo "$as_me:$LINENO: error: \"--without-pixie-shader-compiler\" or \"--with-pixie-shader-compiler=no\" is not an option here" >&5 echo "$as_me: error: \"--without-pixie-shader-compiler\" or \"--with-pixie-shader-compiler=no\" is not an option here" >&2;} { (exit 1); exit 1; }; } ;; yes) # simply ignore that, use auto-detection ;; *) PIXIE_SHADER_COMPILEROPT="${withval}" ;; esac else PIXIE_SHADER_COMPILEROPT=sdrc fi acgv_path=`dirname "${PIXIE_SHADER_COMPILEROPT}"|sed -e 's|^\./\?||g'` if test -n "${acgv_path}"; then PIXIE_SHADER_COMPILERPROG=`basename "${PIXIE_SHADER_COMPILEROPT}"` if echo "${acgv_path}" | egrep '^/' > /dev/null 2>&1 ; then acgv_path="${acgv_path}" else acgv_path="`pwd`/${acgv_path}" fi for ac_prog in ${PIXIE_SHADER_COMPILERPROG} 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_path_PIXIE_SHADER_COMPILER+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PIXIE_SHADER_COMPILER in [\\/]* | ?:[\\/]*) ac_cv_path_PIXIE_SHADER_COMPILER="$PIXIE_SHADER_COMPILER" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${acgv_path} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PIXIE_SHADER_COMPILER="$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 IFS=$as_save_IFS ;; esac fi PIXIE_SHADER_COMPILER=$ac_cv_path_PIXIE_SHADER_COMPILER if test -n "$PIXIE_SHADER_COMPILER"; then { echo "$as_me:$LINENO: result: $PIXIE_SHADER_COMPILER" >&5 echo "${ECHO_T}$PIXIE_SHADER_COMPILER" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$PIXIE_SHADER_COMPILER" && break done test -n "$PIXIE_SHADER_COMPILER" || PIXIE_SHADER_COMPILER="not found" else PIXIE_SHADER_COMPILERPROG="${PIXIE_SHADER_COMPILEROPT}" acgv_path="${PATH}" for ac_prog in ${PIXIE_SHADER_COMPILERPROG} 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_PIXIE_SHADER_COMPILER+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$PIXIE_SHADER_COMPILER"; then ac_cv_prog_PIXIE_SHADER_COMPILER="$PIXIE_SHADER_COMPILER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${acgv_path} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PIXIE_SHADER_COMPILER="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PIXIE_SHADER_COMPILER=$ac_cv_prog_PIXIE_SHADER_COMPILER if test -n "$PIXIE_SHADER_COMPILER"; then { echo "$as_me:$LINENO: result: $PIXIE_SHADER_COMPILER" >&5 echo "${ECHO_T}$PIXIE_SHADER_COMPILER" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$PIXIE_SHADER_COMPILER" && break done test -n "$PIXIE_SHADER_COMPILER" || PIXIE_SHADER_COMPILER="not found" fi acgv_required=optional if test "${PIXIE_SHADER_COMPILER}" = "not found" -a "${acgv_required}" = "required"; then { { echo "$as_me:$LINENO: error: \`pixie-shader-compiler' executable not found. Check your installation." >&5 echo "$as_me: error: \`pixie-shader-compiler' executable not found. Check your installation." >&2;} { (exit 1); exit 1; }; } exit 1 fi if ! test "${PIXIE_SHADER_COMPILER}" = "not found"; then PIXIE_SHADER_COMPILER_TRUE= PIXIE_SHADER_COMPILER_FALSE='#' else PIXIE_SHADER_COMPILER_TRUE='#' PIXIE_SHADER_COMPILER_FALSE= fi # Check whether --with-delight-shader-compiler was given. if test "${with_delight_shader_compiler+set}" = set; then withval=$with_delight_shader_compiler; case "${withval}" in no) { { echo "$as_me:$LINENO: error: \"--without-delight-shader-compiler\" or \"--with-delight-shader-compiler=no\" is not an option here" >&5 echo "$as_me: error: \"--without-delight-shader-compiler\" or \"--with-delight-shader-compiler=no\" is not an option here" >&2;} { (exit 1); exit 1; }; } ;; yes) # simply ignore that, use auto-detection ;; *) DELIGHT_SHADER_COMPILEROPT="${withval}" ;; esac else DELIGHT_SHADER_COMPILEROPT=shaderdl fi acgv_path=`dirname "${DELIGHT_SHADER_COMPILEROPT}"|sed -e 's|^\./\?||g'` if test -n "${acgv_path}"; then DELIGHT_SHADER_COMPILERPROG=`basename "${DELIGHT_SHADER_COMPILEROPT}"` if echo "${acgv_path}" | egrep '^/' > /dev/null 2>&1 ; then acgv_path="${acgv_path}" else acgv_path="`pwd`/${acgv_path}" fi for ac_prog in ${DELIGHT_SHADER_COMPILERPROG} 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_path_DELIGHT_SHADER_COMPILER+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $DELIGHT_SHADER_COMPILER in [\\/]* | ?:[\\/]*) ac_cv_path_DELIGHT_SHADER_COMPILER="$DELIGHT_SHADER_COMPILER" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${acgv_path} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_DELIGHT_SHADER_COMPILER="$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 IFS=$as_save_IFS ;; esac fi DELIGHT_SHADER_COMPILER=$ac_cv_path_DELIGHT_SHADER_COMPILER if test -n "$DELIGHT_SHADER_COMPILER"; then { echo "$as_me:$LINENO: result: $DELIGHT_SHADER_COMPILER" >&5 echo "${ECHO_T}$DELIGHT_SHADER_COMPILER" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$DELIGHT_SHADER_COMPILER" && break done test -n "$DELIGHT_SHADER_COMPILER" || DELIGHT_SHADER_COMPILER="not found" else DELIGHT_SHADER_COMPILERPROG="${DELIGHT_SHADER_COMPILEROPT}" acgv_path="${PATH}" for ac_prog in ${DELIGHT_SHADER_COMPILERPROG} 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_DELIGHT_SHADER_COMPILER+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$DELIGHT_SHADER_COMPILER"; then ac_cv_prog_DELIGHT_SHADER_COMPILER="$DELIGHT_SHADER_COMPILER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${acgv_path} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DELIGHT_SHADER_COMPILER="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DELIGHT_SHADER_COMPILER=$ac_cv_prog_DELIGHT_SHADER_COMPILER if test -n "$DELIGHT_SHADER_COMPILER"; then { echo "$as_me:$LINENO: result: $DELIGHT_SHADER_COMPILER" >&5 echo "${ECHO_T}$DELIGHT_SHADER_COMPILER" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$DELIGHT_SHADER_COMPILER" && break done test -n "$DELIGHT_SHADER_COMPILER" || DELIGHT_SHADER_COMPILER="not found" fi acgv_required=optional if test "${DELIGHT_SHADER_COMPILER}" = "not found" -a "${acgv_required}" = "required"; then { { echo "$as_me:$LINENO: error: \`delight-shader-compiler' executable not found. Check your installation." >&5 echo "$as_me: error: \`delight-shader-compiler' executable not found. Check your installation." >&2;} { (exit 1); exit 1; }; } exit 1 fi if ! test "${DELIGHT_SHADER_COMPILER}" = "not found"; then DELIGHT_SHADER_COMPILER_TRUE= DELIGHT_SHADER_COMPILER_FALSE='#' else DELIGHT_SHADER_COMPILER_TRUE='#' DELIGHT_SHADER_COMPILER_FALSE= fi # Checks for libraries. { echo "$as_me:$LINENO: checking for cos in -lm" >&5 echo $ECHO_N "checking for cos in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_cos+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_m_cos=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_m_cos" >&5 echo "${ECHO_T}$ac_cv_lib_m_cos" >&6; } if test $ac_cv_lib_m_cos = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi # Checks for header files. # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { echo "$as_me:$LINENO: checking for working alloca.h" >&5 echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6; } if test "${ac_cv_working_alloca_h+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 int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_working_alloca_h=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 echo "${ECHO_T}$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_ALLOCA_H 1 _ACEOF fi { echo "$as_me:$LINENO: checking for alloca" >&5 echo $ECHO_N "checking for alloca... $ECHO_C" >&6; } if test "${ac_cv_func_alloca_works+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. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_alloca_works=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 echo "${ECHO_T}$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_ALLOCA 1 _ACEOF else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext cat >>confdefs.h <<\_ACEOF #define C_ALLOCA 1 _ACEOF { echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6; } if test "${ac_cv_os_cray+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. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 echo "${ECHO_T}$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+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. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6; } if test "${ac_cv_c_stack_direction+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_c_stack_direction=0 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 int find_stack_direction () { static char *addr = 0; auto char dummy; if (addr == 0) { addr = &dummy; return find_stack_direction (); } else return (&dummy > addr) ? 1 : -1; } int main () { return find_stack_direction () < 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_stack_direction=1 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_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 echo "${ECHO_T}$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+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 <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; 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 core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { echo "$as_me:$LINENO: checking for library containing opendir" >&5 echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6; } if test "${ac_cv_search_opendir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_search_opendir=$ac_res else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 echo "${ECHO_T}$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { echo "$as_me:$LINENO: checking for library containing opendir" >&5 echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6; } if test "${ac_cv_search_opendir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_search_opendir=$ac_res else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 echo "${ECHO_T}$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { 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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; 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 core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >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 #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 core.conftest.* 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 { echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6; } if test "${ac_cv_header_sys_wait_h+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 #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_sys_wait_h=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SYS_WAIT_H 1 _ACEOF fi for ac_header in errno.h fcntl.h getopt.h inttypes.h libgen.h libintl.h \ limits.h locale.h malloc.h \ netinet/in.h stddef.h stdlib.h string.h sys/file.h sys/param.h sys/select.h \ sys/socket.h sys/systeminfo.h sys/time.h sys/types.h unistd.h io.h math.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; 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 core 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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.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 Claus-Justus Heine ## ## -------------------------------------------------------------------------- ## _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 { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&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 # Checks for typedefs, structures, and compiler characteristics. { echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6; } if test "${ac_cv_c_bigendian+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # See if sys/param.h defines the BYTE_ORDER macro. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN && defined LITTLE_ENDIAN \ && BYTE_ORDER && BIG_ENDIAN && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then # It does; now see whether it defined to BIG_ENDIAN or not. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_bigendian=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # It does not; compile a test program. if test "$cross_compiling" = yes; then # try to guess the endianness by grepping values into an object file ac_cv_c_bigendian=unknown cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } int main () { _ascii (); _ebcdic (); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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 int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_bigendian=no 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_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 echo "${ECHO_T}$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in yes) cat >>confdefs.h <<\_ACEOF #define WORDS_BIGENDIAN 1 _ACEOF ;; no) ;; *) { { echo "$as_me:$LINENO: error: unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" >&5 echo "$as_me: error: unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} { (exit 1); exit 1; }; } ;; esac { echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; } if test "${ac_cv_c_const+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 () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi { echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5 echo $ECHO_N "checking for stdbool.h that conforms to C99... $ECHO_C" >&6; } if test "${ac_cv_header_stdbool_h+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 #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; bool e = &s; char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; # if defined __xlc__ || defined __GNUC__ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0 reported by James Lemley on 2005-10-05; see http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html This test is not quite right, since xlc is allowed to reject this program, as the initializer for xlcbug is not one of the forms that C requires support for. However, doing the test right would require a runtime test, and that would make cross-compilation harder. Let us hope that IBM fixes the xlc bug, and also adds support for this kind of constant expression. In the meantime, this test will reject xlc, which is OK, since our stdbool.h substitute should suffice. We also test this with GCC, where it should work, to detect more quickly whether someone messes up the test in the future. */ char digs[] = "0123456789"; int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1); # endif /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdbool_h=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5 echo "${ECHO_T}$ac_cv_header_stdbool_h" >&6; } { echo "$as_me:$LINENO: checking for _Bool" >&5 echo $ECHO_N "checking for _Bool... $ECHO_C" >&6; } if test "${ac_cv_type__Bool+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 typedef _Bool ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type__Bool=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type__Bool=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5 echo "${ECHO_T}$ac_cv_type__Bool" >&6; } if test $ac_cv_type__Bool = yes; then cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_STDBOOL_H 1 _ACEOF fi { echo "$as_me:$LINENO: checking for inline" >&5 echo $ECHO_N "checking for inline... $ECHO_C" >&6; } if test "${ac_cv_c_inline+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_inline=$ac_kw else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 echo "${ECHO_T}$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac { echo "$as_me:$LINENO: checking for size_t" >&5 echo $ECHO_N "checking for size_t... $ECHO_C" >&6; } if test "${ac_cv_type_size_t+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 typedef size_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_size_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 echo "${ECHO_T}$ac_cv_type_size_t" >&6; } if test $ac_cv_type_size_t = yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6; } if test "${ac_cv_header_time+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 int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_time=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 echo "${ECHO_T}$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then cat >>confdefs.h <<\_ACEOF #define TIME_WITH_SYS_TIME 1 _ACEOF fi { echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6; } if test "${ac_cv_struct_tm+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 int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_struct_tm=time.h else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 echo "${ECHO_T}$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then cat >>confdefs.h <<\_ACEOF #define TM_IN_SYS_TIME 1 _ACEOF 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 M_PI" >&5 echo $ECHO_N "checking for M_PI... $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. */ #if HAVE_MATH_H # include #endif int main () { double blah = M_PI; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } cat >>confdefs.h <<\_ACEOF #define HAVE_M_PI 1 _ACEOF else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi rm -f core 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 { echo "$as_me:$LINENO: checking for dev_t" >&5 echo $ECHO_N "checking for dev_t... $ECHO_C" >&6; } if test "${ac_cv_type_dev_t+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 typedef dev_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_dev_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_dev_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_dev_t" >&5 echo "${ECHO_T}$ac_cv_type_dev_t" >&6; } if test $ac_cv_type_dev_t = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DEV_T 1 _ACEOF fi { echo "$as_me:$LINENO: checking for ino_t" >&5 echo $ECHO_N "checking for ino_t... $ECHO_C" >&6; } if test "${ac_cv_type_ino_t+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 typedef ino_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_ino_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_ino_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_ino_t" >&5 echo "${ECHO_T}$ac_cv_type_ino_t" >&6; } if test $ac_cv_type_ino_t = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_INO_T 1 _ACEOF fi { echo "$as_me:$LINENO: checking for time_t" >&5 echo $ECHO_N "checking for time_t... $ECHO_C" >&6; } if test "${ac_cv_type_time_t+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 typedef time_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_time_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_time_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_time_t" >&5 echo "${ECHO_T}$ac_cv_type_time_t" >&6; } if test $ac_cv_type_time_t = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_TIME_T 1 _ACEOF fi { echo "$as_me:$LINENO: checking for dev_t" >&5 echo $ECHO_N "checking for dev_t... $ECHO_C" >&6; } if test "${ac_cv_type_dev_t+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 typedef dev_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_dev_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_dev_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_dev_t" >&5 echo "${ECHO_T}$ac_cv_type_dev_t" >&6; } # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { echo "$as_me:$LINENO: checking size of dev_t" >&5 echo $ECHO_N "checking size of dev_t... $ECHO_C" >&6; } if test "${ac_cv_sizeof_dev_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. 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 typedef dev_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=0 ac_mid=0 while :; do 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 typedef dev_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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 typedef dev_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=-1 ac_mid=-1 while :; do 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 typedef dev_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` 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 typedef dev_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_dev_t=$ac_lo;; '') if test "$ac_cv_type_dev_t" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (dev_t) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (dev_t) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_dev_t=0 fi ;; esac 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 typedef dev_t ac__type_sizeof_; static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (((long int) (sizeof (ac__type_sizeof_))) < 0) { long int i = longval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%ld\n", i); } else { unsigned long int i = ulongval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%lu\n", i); } return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_dev_t=`cat conftest.val` 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 ) if test "$ac_cv_type_dev_t" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (dev_t) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (dev_t) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_dev_t=0 fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.val fi { echo "$as_me:$LINENO: result: $ac_cv_sizeof_dev_t" >&5 echo "${ECHO_T}$ac_cv_sizeof_dev_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_DEV_T $ac_cv_sizeof_dev_t _ACEOF { echo "$as_me:$LINENO: checking for ino_t" >&5 echo $ECHO_N "checking for ino_t... $ECHO_C" >&6; } if test "${ac_cv_type_ino_t+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 typedef ino_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_ino_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_ino_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_ino_t" >&5 echo "${ECHO_T}$ac_cv_type_ino_t" >&6; } # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { echo "$as_me:$LINENO: checking size of ino_t" >&5 echo $ECHO_N "checking size of ino_t... $ECHO_C" >&6; } if test "${ac_cv_sizeof_ino_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. 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 typedef ino_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=0 ac_mid=0 while :; do 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 typedef ino_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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 typedef ino_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=-1 ac_mid=-1 while :; do 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 typedef ino_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` 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 typedef ino_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_ino_t=$ac_lo;; '') if test "$ac_cv_type_ino_t" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (ino_t) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (ino_t) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_ino_t=0 fi ;; esac 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 typedef ino_t ac__type_sizeof_; static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (((long int) (sizeof (ac__type_sizeof_))) < 0) { long int i = longval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%ld\n", i); } else { unsigned long int i = ulongval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%lu\n", i); } return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_ino_t=`cat conftest.val` 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 ) if test "$ac_cv_type_ino_t" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (ino_t) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (ino_t) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_ino_t=0 fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.val fi { echo "$as_me:$LINENO: result: $ac_cv_sizeof_ino_t" >&5 echo "${ECHO_T}$ac_cv_sizeof_ino_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INO_T $ac_cv_sizeof_ino_t _ACEOF { echo "$as_me:$LINENO: checking for time_t" >&5 echo $ECHO_N "checking for time_t... $ECHO_C" >&6; } if test "${ac_cv_type_time_t+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 typedef time_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_time_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_time_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_time_t" >&5 echo "${ECHO_T}$ac_cv_type_time_t" >&6; } # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { echo "$as_me:$LINENO: checking size of time_t" >&5 echo $ECHO_N "checking size of time_t... $ECHO_C" >&6; } if test "${ac_cv_sizeof_time_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. 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 typedef time_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=0 ac_mid=0 while :; do 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 typedef time_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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 typedef time_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=-1 ac_mid=-1 while :; do 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 typedef time_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` 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 typedef time_t ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_time_t=$ac_lo;; '') if test "$ac_cv_type_time_t" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (time_t) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (time_t) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_time_t=0 fi ;; esac 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 typedef time_t ac__type_sizeof_; static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (((long int) (sizeof (ac__type_sizeof_))) < 0) { long int i = longval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%ld\n", i); } else { unsigned long int i = ulongval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%lu\n", i); } return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_time_t=`cat conftest.val` 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 ) if test "$ac_cv_type_time_t" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (time_t) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (time_t) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_time_t=0 fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.val fi { echo "$as_me:$LINENO: result: $ac_cv_sizeof_time_t" >&5 echo "${ECHO_T}$ac_cv_sizeof_time_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_TIME_T $ac_cv_sizeof_time_t _ACEOF { echo "$as_me:$LINENO: checking for long" >&5 echo $ECHO_N "checking for long... $ECHO_C" >&6; } if test "${ac_cv_type_long+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 typedef long ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_long=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_long=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 echo "${ECHO_T}$ac_cv_type_long" >&6; } # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { echo "$as_me:$LINENO: checking size of long" >&5 echo $ECHO_N "checking size of long... $ECHO_C" >&6; } if test "${ac_cv_sizeof_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. 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 typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=0 ac_mid=0 while :; do 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 typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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 typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=-1 ac_mid=-1 while :; do 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 typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` 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 typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_long=$ac_lo;; '') if test "$ac_cv_type_long" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (long) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_long=0 fi ;; esac 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 typedef long ac__type_sizeof_; static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (((long int) (sizeof (ac__type_sizeof_))) < 0) { long int i = longval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%ld\n", i); } else { unsigned long int i = ulongval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%lu\n", i); } return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_long=`cat conftest.val` 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 ) if test "$ac_cv_type_long" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (long) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_long=0 fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.val fi { echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 echo "${ECHO_T}$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF { echo "$as_me:$LINENO: checking for int" >&5 echo $ECHO_N "checking for int... $ECHO_C" >&6; } if test "${ac_cv_type_int+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 typedef int ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_int=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_int=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 echo "${ECHO_T}$ac_cv_type_int" >&6; } # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { echo "$as_me:$LINENO: checking size of int" >&5 echo $ECHO_N "checking size of int... $ECHO_C" >&6; } if test "${ac_cv_sizeof_int+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. 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 typedef int ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=0 ac_mid=0 while :; do 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 typedef int ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 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 typedef int ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=-1 ac_mid=-1 while :; do 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 typedef int ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` 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 typedef int ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_int=$ac_lo;; '') if test "$ac_cv_type_int" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (int) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_int=0 fi ;; esac 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 typedef int ac__type_sizeof_; static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (((long int) (sizeof (ac__type_sizeof_))) < 0) { long int i = longval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%ld\n", i); } else { unsigned long int i = ulongval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%lu\n", i); } return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_int=`cat conftest.val` 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 ) if test "$ac_cv_type_int" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (int) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_int=0 fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.val fi { echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 echo "${ECHO_T}$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF # Checks for library functions { echo "$as_me:$LINENO: checking whether closedir returns void" >&5 echo $ECHO_N "checking whether closedir returns void... $ECHO_C" >&6; } if test "${ac_cv_func_closedir_void+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_closedir_void=yes 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_dirent> #ifndef __cplusplus int closedir (); #endif int main () { return closedir (opendir (".")) != 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_closedir_void=no 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_func_closedir_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_closedir_void" >&5 echo "${ECHO_T}$ac_cv_func_closedir_void" >&6; } if test $ac_cv_func_closedir_void = yes; then cat >>confdefs.h <<\_ACEOF #define CLOSEDIR_VOID 1 _ACEOF fi { echo "$as_me:$LINENO: checking for pid_t" >&5 echo $ECHO_N "checking for pid_t... $ECHO_C" >&6; } if test "${ac_cv_type_pid_t+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 typedef pid_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_pid_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_pid_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 echo "${ECHO_T}$ac_cv_type_pid_t" >&6; } if test $ac_cv_type_pid_t = yes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi for ac_header in vfork.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; 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 core 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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.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 Claus-Justus Heine ## ## -------------------------------------------------------------------------- ## _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 { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&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 for ac_func in fork vfork do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+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. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_fork" = xyes; then { echo "$as_me:$LINENO: checking for working fork" >&5 echo $ECHO_N "checking for working fork... $ECHO_C" >&6; } if test "${ac_cv_func_fork_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_fork_works=cross 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 int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_fork_works=yes 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_func_fork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5 echo "${ECHO_T}$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { echo "$as_me:$LINENO: checking for working vfork" >&5 echo $ECHO_N "checking for working vfork... $ECHO_C" >&6; } if test "${ac_cv_func_vfork_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_vfork_works=cross else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #ifdef HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_vfork_works=yes 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_func_vfork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5 echo "${ECHO_T}$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WORKING_VFORK 1 _ACEOF else cat >>confdefs.h <<\_ACEOF #define vfork fork _ACEOF fi if test "x$ac_cv_func_fork_works" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WORKING_FORK 1 _ACEOF fi { echo "$as_me:$LINENO: checking for working memcmp" >&5 echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6; } if test "${ac_cv_func_memcmp_working+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_memcmp_working=no 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 int main () { /* Some versions of memcmp are not 8-bit clean. */ char c0 = '\100', c1 = '\200', c2 = '\201'; if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) return 1; /* The Next x86 OpenStep bug shows up only when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary. William Lewis provided this test program. */ { char foo[21]; char bar[21]; int i; for (i = 0; i < 4; i++) { char *a = foo + i; char *b = bar + i; strcpy (a, "--------01111111"); strcpy (b, "--------10000000"); if (memcmp (a, b, 16) >= 0) return 1; } return 0; } ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_memcmp_working=yes 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_func_memcmp_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_memcmp_working" >&5 echo "${ECHO_T}$ac_cv_func_memcmp_working" >&6; } test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in *" memcmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; esac { echo "$as_me:$LINENO: checking for obstacks" >&5 echo $ECHO_N "checking for obstacks... $ECHO_C" >&6; } if test "${ac_cv_func_obstack+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 "obstack.h" int main () { struct obstack mem; #define obstack_chunk_alloc malloc #define obstack_chunk_free free obstack_init (&mem); obstack_free (&mem, 0); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_obstack=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_obstack=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_obstack" >&5 echo "${ECHO_T}$ac_cv_func_obstack" >&6; } if test $ac_cv_func_obstack = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_OBSTACK 1 _ACEOF else case " $LIBOBJS " in *" obstack.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS obstack.$ac_objext" ;; esac fi #AC_FUNC_MALLOC It is ok when malloc(0) returns NULL. Why not? #AC_FUNC_REALLOC It is ok when realloc(0, 0) returns NULL. Why not? { echo "$as_me:$LINENO: checking whether setpgrp takes no argument" >&5 echo $ECHO_N "checking whether setpgrp takes no argument... $ECHO_C" >&6; } if test "${ac_cv_func_setpgrp_void+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot check setpgrp when cross compiling" >&5 echo "$as_me: error: cannot check setpgrp when cross compiling" >&2;} { (exit 1); exit 1; }; } 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 int main () { /* If this system has a BSD-style setpgrp which takes arguments, setpgrp(1, 1) will fail with ESRCH and return -1, in that case exit successfully. */ return setpgrp (1,1) != -1; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_setpgrp_void=no 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_func_setpgrp_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_setpgrp_void" >&5 echo "${ECHO_T}$ac_cv_func_setpgrp_void" >&6; } if test $ac_cv_func_setpgrp_void = yes; then cat >>confdefs.h <<\_ACEOF #define SETPGRP_VOID 1 _ACEOF fi { echo "$as_me:$LINENO: checking for function prototypes" >&5 echo $ECHO_N "checking for function prototypes... $ECHO_C" >&6; } if test "$ac_cv_prog_cc_c89" != no; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } cat >>confdefs.h <<\_ACEOF #define PROTOTYPES 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define __PROTOTYPES 1 _ACEOF else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi { echo "$as_me:$LINENO: checking whether setvbuf arguments are reversed" >&5 echo $ECHO_N "checking whether setvbuf arguments are reversed... $ECHO_C" >&6; } if test "${ac_cv_func_setvbuf_reversed+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_func_setvbuf_reversed=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include # ifdef PROTOTYPES int (setvbuf) (FILE *, int, char *, size_t); # endif int main () { char buf; return setvbuf (stdout, _IOLBF, &buf, 1); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include # ifdef PROTOTYPES int (setvbuf) (FILE *, int, char *, size_t); # endif int main () { char buf; return setvbuf (stdout, &buf, _IOLBF, 1); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then # It compiles and links either way, so it must not be declared # with a prototype and most likely this is a K&R C compiler. # Try running it. if test "$cross_compiling" = yes; then : # Assume setvbuf is not reversed when cross-compiling. 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 int main () { /* This call has the arguments reversed. A reversed system may check and see that the address of buf is not _IOLBF, _IONBF, or _IOFBF, and return nonzero. */ char buf; if (setvbuf (stdout, _IOLBF, &buf, 1) != 0) return 1; putchar ('\r'); return 0; /* Non-reversed systems SEGV here. */ ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_setvbuf_reversed=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi ac_cv_func_setvbuf_reversed=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_setvbuf_reversed" >&5 echo "${ECHO_T}$ac_cv_func_setvbuf_reversed" >&6; } if test $ac_cv_func_setvbuf_reversed = yes; then cat >>confdefs.h <<\_ACEOF #define SETVBUF_REVERSED 1 _ACEOF fi { echo "$as_me:$LINENO: checking return type of signal handlers" >&5 echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6; } if test "${ac_cv_type_signal+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 int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_signal=int else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 echo "${ECHO_T}$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF { echo "$as_me:$LINENO: checking whether lstat dereferences a symlink specified with a trailing slash" >&5 echo $ECHO_N "checking whether lstat dereferences a symlink specified with a trailing slash... $ECHO_C" >&6; } if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then ac_cv_func_lstat_dereferences_slashed_symlink=no 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 int main () { struct stat sbuf; /* Linux will dereference the symlink and fail. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_lstat_dereferences_slashed_symlink=yes 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_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { echo "$as_me:$LINENO: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 echo "${ECHO_T}$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi { echo "$as_me:$LINENO: checking whether stat accepts an empty string" >&5 echo $ECHO_N "checking whether stat accepts an empty string... $ECHO_C" >&6; } if test "${ac_cv_func_stat_empty_string_bug+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_stat_empty_string_bug=yes 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 int main () { struct stat sbuf; return stat ("", &sbuf) == 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_stat_empty_string_bug=no 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_func_stat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_stat_empty_string_bug" >&5 echo "${ECHO_T}$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIBOBJS " in *" stat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi { echo "$as_me:$LINENO: checking whether lstat accepts an empty string" >&5 echo $ECHO_N "checking whether lstat accepts an empty string... $ECHO_C" >&6; } if test "${ac_cv_func_lstat_empty_string_bug+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_lstat_empty_string_bug=yes 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 int main () { struct stat sbuf; return lstat ("", &sbuf) == 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_lstat_empty_string_bug=no 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_func_lstat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_lstat_empty_string_bug" >&5 echo "${ECHO_T}$ac_cv_func_lstat_empty_string_bug" >&6; } if test $ac_cv_func_lstat_empty_string_bug = yes; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_LSTAT_EMPTY_STRING_BUG 1 _ACEOF fi #AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK { echo "$as_me:$LINENO: checking for working strtod" >&5 echo $ECHO_N "checking for working strtod... $ECHO_C" >&6; } if test "${ac_cv_func_strtod+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_strtod=no 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 #ifndef strtod double strtod (); #endif int main() { { /* Some versions of Linux strtod mis-parse strings with leading '+'. */ char *string = " +69"; char *term; double value; value = strtod (string, &term); if (value != 69 || term != (string + 4)) return 1; } { /* Under Solaris 2.4, strtod returns the wrong value for the terminating character under some conditions. */ char *string = "NaN"; char *term; strtod (string, &term); if (term != string && *(term - 1) == 0) return 1; } return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_strtod=yes 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_func_strtod=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_strtod" >&5 echo "${ECHO_T}$ac_cv_func_strtod" >&6; } if test $ac_cv_func_strtod = no; then case " $LIBOBJS " in *" strtod.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtod.$ac_objext" ;; esac { echo "$as_me:$LINENO: checking for pow" >&5 echo $ECHO_N "checking for pow... $ECHO_C" >&6; } if test "${ac_cv_func_pow+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. */ /* Define pow to an innocuous variant, in case declares pow. For example, HP-UX 11i declares gettimeofday. */ #define pow innocuous_pow /* System header to define __stub macros and hopefully few prototypes, which can conflict with char pow (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef pow /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pow (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_pow || defined __stub___pow choke me #endif int main () { return pow (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_pow=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_pow=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_pow" >&5 echo "${ECHO_T}$ac_cv_func_pow" >&6; } if test $ac_cv_func_pow = no; then { echo "$as_me:$LINENO: checking for pow in -lm" >&5 echo $ECHO_N "checking for pow in -lm... $ECHO_C" >&6; } if test "${ac_cv_lib_m_pow+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pow (); int main () { return pow (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_m_pow=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_m_pow=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_m_pow" >&5 echo "${ECHO_T}$ac_cv_lib_m_pow" >&6; } if test $ac_cv_lib_m_pow = yes; then POW_LIB=-lm else { echo "$as_me:$LINENO: WARNING: cannot find library containing definition of pow" >&5 echo "$as_me: WARNING: cannot find library containing definition of pow" >&2;} fi fi fi for ac_func in vprintf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+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. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF { echo "$as_me:$LINENO: checking for _doprnt" >&5 echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6; } if test "${ac_cv_func__doprnt+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. */ /* Define _doprnt to an innocuous variant, in case declares _doprnt. For example, HP-UX 11i declares gettimeofday. */ #define _doprnt innocuous__doprnt /* System header to define __stub macros and hopefully few prototypes, which can conflict with char _doprnt (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef _doprnt /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char _doprnt (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub__doprnt || defined __stub____doprnt choke me #endif int main () { return _doprnt (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func__doprnt=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func__doprnt=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 echo "${ECHO_T}$ac_cv_func__doprnt" >&6; } if test $ac_cv_func__doprnt = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_DOPRNT 1 _ACEOF fi fi done { echo "$as_me:$LINENO: checking for wait3 that fills in rusage" >&5 echo $ECHO_N "checking for wait3 that fills in rusage... $ECHO_C" >&6; } if test "${ac_cv_func_wait3_rusage+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_wait3_rusage=no 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 #include #include /* HP-UX has wait3 but does not fill in rusage at all. */ int main () { struct rusage r; int i; /* Use a field that we can force nonzero -- voluntary context switches. For systems like NeXT and OSF/1 that don't set it, also use the system CPU time. And page faults (I/O) for Linux. */ r.ru_nvcsw = 0; r.ru_stime.tv_sec = 0; r.ru_stime.tv_usec = 0; r.ru_majflt = r.ru_minflt = 0; switch (fork ()) { case 0: /* Child. */ sleep(1); /* Give up the CPU. */ _exit(0); break; case -1: /* What can we do? */ _exit(0); break; default: /* Parent. */ wait3(&i, 0, &r); /* Avoid "text file busy" from rm on fast HP-UX machines. */ sleep(2); return (r.ru_nvcsw == 0 && r.ru_majflt == 0 && r.ru_minflt == 0 && r.ru_stime.tv_sec == 0 && r.ru_stime.tv_usec == 0); } } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_wait3_rusage=yes 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_func_wait3_rusage=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_wait3_rusage" >&5 echo "${ECHO_T}$ac_cv_func_wait3_rusage" >&6; } if test $ac_cv_func_wait3_rusage = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WAIT3 1 _ACEOF fi for ac_func in fmemopen do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+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. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF { echo "$as_me:$LINENO: checking whether fmemopen is declared" >&5 echo $ECHO_N "checking whether fmemopen is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_fmemopen+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 int main () { #ifndef fmemopen (void) fmemopen; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_fmemopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_fmemopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_fmemopen" >&5 echo "${ECHO_T}$ac_cv_have_decl_fmemopen" >&6; } if test $ac_cv_have_decl_fmemopen = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FMEMOPEN 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FMEMOPEN 0 _ACEOF fi else case " $LIBOBJS " in *" fmemopen.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS fmemopen.$ac_objext" ;; esac fi done for ac_func in acosh popen putenv strcasecmp strdup strncasecmp lstat stat do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+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. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else case " $LIBOBJS " in *" $ac_func.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;; esac fi done { echo "$as_me:$LINENO: checking whether putenv is declared" >&5 echo $ECHO_N "checking whether putenv is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_putenv+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 int main () { #ifndef putenv (void) putenv; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_putenv=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_putenv=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_putenv" >&5 echo "${ECHO_T}$ac_cv_have_decl_putenv" >&6; } if test $ac_cv_have_decl_putenv = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTENV 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PUTENV 0 _ACEOF fi { echo "$as_me:$LINENO: checking whether strdup is declared" >&5 echo $ECHO_N "checking whether strdup is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_strdup+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 int main () { #ifndef strdup (void) strdup; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_strdup=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_strdup=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_strdup" >&5 echo "${ECHO_T}$ac_cv_have_decl_strdup" >&6; } if test $ac_cv_have_decl_strdup = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRDUP 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRDUP 0 _ACEOF fi { echo "$as_me:$LINENO: checking whether acosh is declared" >&5 echo $ECHO_N "checking whether acosh is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_acosh+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 int main () { #ifndef acosh (void) acosh; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_acosh=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_acosh=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_acosh" >&5 echo "${ECHO_T}$ac_cv_have_decl_acosh" >&6; } if test $ac_cv_have_decl_acosh = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ACOSH 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ACOSH 0 _ACEOF fi { echo "$as_me:$LINENO: checking whether strcasecmp is declared" >&5 echo $ECHO_N "checking whether strcasecmp is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_strcasecmp+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 int main () { #ifndef strcasecmp (void) strcasecmp; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_strcasecmp=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_strcasecmp=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_strcasecmp" >&5 echo "${ECHO_T}$ac_cv_have_decl_strcasecmp" >&6; } if test $ac_cv_have_decl_strcasecmp = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRCASECMP 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRCASECMP 0 _ACEOF fi { echo "$as_me:$LINENO: checking whether strncasecmp is declared" >&5 echo $ECHO_N "checking whether strncasecmp is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_strncasecmp+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 int main () { #ifndef strncasecmp (void) strncasecmp; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_strncasecmp=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_strncasecmp=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_strncasecmp" >&5 echo "${ECHO_T}$ac_cv_have_decl_strncasecmp" >&6; } if test $ac_cv_have_decl_strncasecmp = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRNCASECMP 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRNCASECMP 0 _ACEOF fi for ac_func in fstat do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+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. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/select.h sys/socket.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; 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 core 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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.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 Claus-Justus Heine ## ## -------------------------------------------------------------------------- ## _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 { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&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 { echo "$as_me:$LINENO: checking types of arguments for select" >&5 echo $ECHO_N "checking types of arguments for select... $ECHO_C" >&6; } if test "${ac_cv_func_select_args+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do 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 #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : ${ac_cv_func_select_args='int,int *,struct timeval *'} fi { echo "$as_me:$LINENO: result: $ac_cv_func_select_args" >&5 echo "${ECHO_T}$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* { echo "$as_me:$LINENO: checking for select" >&5 echo $ECHO_N "checking for select... $ECHO_C" >&6; } if test "${ac_cv_func_select+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. */ /* Define select to an innocuous variant, in case declares select. For example, HP-UX 11i declares gettimeofday. */ #define select innocuous_select /* System header to define __stub macros and hopefully few prototypes, which can conflict with char select (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef select /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char select (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_select || defined __stub___select choke me #endif int main () { return select (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_select=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_select=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_select" >&5 echo "${ECHO_T}$ac_cv_func_select" >&6; } if test $ac_cv_func_select = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SELECT 1 _ACEOF { echo "$as_me:$LINENO: checking whether select is declared" >&5 echo $ECHO_N "checking whether select is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_select+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. */ #if HAVE_SYS_SELECT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_TIME_H # include #endif #if HAVE_SYS_TYPES_H # include #endif int main () { #ifndef select (void) select; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_select=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_select=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_select" >&5 echo "${ECHO_T}$ac_cv_have_decl_select" >&6; } if test $ac_cv_have_decl_select = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SELECT 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SELECT 0 _ACEOF fi fi { echo "$as_me:$LINENO: checking whether errno is declared" >&5 echo $ECHO_N "checking whether errno is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_errno+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. */ #if HAVE_ERRNO_H # include #endif int main () { #ifndef errno (void) errno; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_errno=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_errno=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_errno" >&5 echo "${ECHO_T}$ac_cv_have_decl_errno" >&6; } if test $ac_cv_have_decl_errno = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ERRNO 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ERRNO 0 _ACEOF fi for ac_func in alarm basename bzero bcopy dirname dup2 floor fcntl finite \ gethostname getopt gettimeofday isascii mallinfo memset mkdir pow rint \ select sqrt strchr strcspn strdup strerror strncasecmp strpbrk \ strrchr strstr strtol strerror sysinfo waitpid wait3 do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+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. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { echo "$as_me:$LINENO: checking whether getopt is declared" >&5 echo $ECHO_N "checking whether getopt is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_getopt+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 int main () { #ifndef getopt (void) getopt; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_getopt=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_getopt=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_getopt" >&5 echo "${ECHO_T}$ac_cv_have_decl_getopt" >&6; } if test $ac_cv_have_decl_getopt = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETOPT 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETOPT 0 _ACEOF fi { echo "$as_me:$LINENO: checking whether optarg is declared" >&5 echo $ECHO_N "checking whether optarg is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_optarg+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 int main () { #ifndef optarg (void) optarg; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_optarg=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_optarg=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_optarg" >&5 echo "${ECHO_T}$ac_cv_have_decl_optarg" >&6; } if test $ac_cv_have_decl_optarg = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_OPTARG 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_OPTARG 0 _ACEOF fi { echo "$as_me:$LINENO: checking whether optind is declared" >&5 echo $ECHO_N "checking whether optind is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_optind+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 int main () { #ifndef optind (void) optind; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_optind=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_optind=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_optind" >&5 echo "${ECHO_T}$ac_cv_have_decl_optind" >&6; } if test $ac_cv_have_decl_optind = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_OPTIND 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_OPTIND 0 _ACEOF fi { echo "$as_me:$LINENO: checking whether opterr is declared" >&5 echo $ECHO_N "checking whether opterr is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_opterr+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 int main () { #ifndef opterr (void) opterr; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_opterr=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_opterr=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_opterr" >&5 echo "${ECHO_T}$ac_cv_have_decl_opterr" >&6; } if test $ac_cv_have_decl_opterr = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_OPTERR 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_OPTERR 0 _ACEOF fi { echo "$as_me:$LINENO: checking whether optopt is declared" >&5 echo $ECHO_N "checking whether optopt is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_optopt+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 int main () { #ifndef optopt (void) optopt; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_optopt=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_optopt=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_optopt" >&5 echo "${ECHO_T}$ac_cv_have_decl_optopt" >&6; } if test $ac_cv_have_decl_optopt = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_OPTOPT 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_OPTOPT 0 _ACEOF fi for ac_func in setlocale do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+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. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF { echo "$as_me:$LINENO: checking whether LC_ALL is declared" >&5 echo $ECHO_N "checking whether LC_ALL is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_LC_ALL+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. */ #if HAVE_LOCALE_H # include #endif int main () { #ifndef LC_ALL (void) LC_ALL; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_LC_ALL=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_LC_ALL=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_LC_ALL" >&5 echo "${ECHO_T}$ac_cv_have_decl_LC_ALL" >&6; } if test $ac_cv_have_decl_LC_ALL = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_LC_ALL 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_LC_ALL 0 _ACEOF fi fi done # # we can use AC_COMPILE, because we check later for the existence of # socket() # ################################################################################ { echo "$as_me:$LINENO: checking for Unix domain sockets" >&5 echo $ECHO_N "checking for Unix domain sockets... $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. */ #if HAVE_SYS_SOCKET_H # include #endif int main () { int s = socket(PF_UNIX, SOCK_STREAM, 0); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then HAVE_UNIX_SOCKETS=yes { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 HAVE_UNIX_SOCKETS=no { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ################################################################################ { echo "$as_me:$LINENO: checking for IPv4 sockets" >&5 echo $ECHO_N "checking for IPv4 sockets... $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. */ #if HAVE_SYS_SOCKET_H # include #endif int main () { int s = socket(PF_INET, SOCK_STREAM, 0); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then HAVE_INET_SOCKETS=yes { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 HAVE_INET_SOCKETS=no { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ################################################################################ { echo "$as_me:$LINENO: checking for IPv6 sockets" >&5 echo $ECHO_N "checking for IPv6 sockets... $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. */ #if HAVE_SYS_SOCKET_H # include #endif int main () { int s = socket(PF_INET6, SOCK_STREAM, 0); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then HAVE_INET6_SOCKETS=yes { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 HAVE_INET6_SOCKETS=no { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ################################################################################ if test "z${HAVE_UNIX_SOCKETS}" != "zno"\ -o "z${HAVE_INET_SOCKETS}" != "zno"\ -o "z${HAVE_INET6_SOCKETS}" != "zno"; then # # Try to figure out how to get at the "socket()" function # { echo "$as_me:$LINENO: Checking whether we need to link -lsocket to get socket() ..." >&5 echo "$as_me: Checking whether we need to link -lsocket to get socket() ..." >&6;} for ac_func in socket do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+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. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define HAVE_SOCKET 1 _ACEOF SOCKETLIBS= { echo "$as_me:$LINENO: result: -lsocket not needed" >&5 echo "${ECHO_T}-lsocket not needed" >&6; } else { echo "$as_me:$LINENO: checking for socket in -lsocket" >&5 echo $ECHO_N "checking for socket in -lsocket... $ECHO_C" >&6; } if test "${ac_cv_lib_socket_socket+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_socket_socket=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_socket_socket=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5 echo "${ECHO_T}$ac_cv_lib_socket_socket" >&6; } if test $ac_cv_lib_socket_socket = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SOCKET 1 _ACEOF SOCKETLIBS=-lsocket { echo "$as_me:$LINENO: result: -lsocket is needed" >&5 echo "${ECHO_T}-lsocket is needed" >&6; } else SOCKETLIBS= HAVE_UNIX_SOCKETS=no { echo "$as_me:$LINENO: result: socket() not available" >&5 echo "${ECHO_T}socket() not available" >&6; } fi fi done fi # HAVE_UNIX/INET/INET6_SOCKETS=yes ac_save_LIBS="${LIBS}" LIBS="${SOCKETLIBS} ${LIBS}" if test "z${HAVE_UNIX_SOCKETS}" != "zno"; then for ac_func in accept bind connect listen socket do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+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. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else SOCKETLIBS= HAVE_UNIX_SOCKETS=no fi done fi LIBS="${ac_save_LIBS}" if test "z${HAVE_UNIX_SOCKETS}" != "zno"\ -o "z${HAVE_INET_SOCKETS}" != "zno"\ -o "z${HAVE_INET6_SOCKETS}" != "zno"; then # # Try to figure out what the 3rd argument of accept should be. The # third argument is an integer type, ideally it is "socklent_t". As # the third argument is a pointer, we cannot just check for a # declaration of accept() and leave the rest to the comiler: the size # of the type should match. On little-endian machines we could just # choose the largest integer type available, on big-endian machines # this would not work. Gnah. # { echo "$as_me:$LINENO: checking whether accept is declared" >&5 echo $ECHO_N "checking whether accept is declared... $ECHO_C" >&6; } if test "${ac_cv_have_decl_accept+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. */ #if HAVE_SYS_SOCKET_H # include #endif int main () { #ifndef accept (void) accept; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_have_decl_accept=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_accept=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_have_decl_accept" >&5 echo "${ECHO_T}$ac_cv_have_decl_accept" >&6; } if test $ac_cv_have_decl_accept = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ACCEPT 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ACCEPT 0 _ACEOF fi { echo "$as_me:$LINENO: checking for socklen_t" >&5 echo $ECHO_N "checking for socklen_t... $ECHO_C" >&6; } if test "${ac_cv_type_socklen_t+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. */ #if HAVE_SYS_SOCKET_H # include #endif typedef socklen_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_socklen_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_socklen_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_socklen_t" >&5 echo "${ECHO_T}$ac_cv_type_socklen_t" >&6; } if test $ac_cv_type_socklen_t = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_SOCKLEN_T 1 _ACEOF ACCEPT_ARG3_TYPE=socklen_t else ACCEPT_ARG3_TYPE=int fi fi # HAVE_UNIX/INET/INET6_SOCKETS=yes if test "z${HAVE_UNIX_SOCKETS}" != "zno"; then cat >>confdefs.h <<\_ACEOF #define HAVE_UNIX_SOCKETS 1 _ACEOF fi if test "z${HAVE_INET_SOCKETS}" != "zno"; then cat >>confdefs.h <<\_ACEOF #define HAVE_INET_SOCKETS 1 _ACEOF fi if test "z${HAVE_INET6_SOCKETS}" != "zno"; then cat >>confdefs.h <<\_ACEOF #define HAVE_INET6_SOCKETS 1 _ACEOF fi # # End autoscan stuff. # ################################################################################ # The following vars contain info about the local system: # (AC_CANONICAL_TARGET([]) sets them) # var value on RedHat 6.1 # --- ------------------- # build i686-pc-linux-gnu # host i686-pc-linux-gnu # target i686-pc-linux-gnu # build_alias i686-pc-linux-gnu # host_alias i686-pc-linux-gnu # target_alias i686-pc-linux-gnu # build_cpu i686 # build_vendor pc # build_os linux-gnu # host_cpu i686 # host_vendor pc # host_os linux-gnu # target_cpu i686 # target_vendor pc # target_os linux-gnu case "$target" in *linux*) MACHTYPE=`echo ${target}|sed 's/unknown/pc/g'` ;; *irix*) MACHTYPE="${target}" cat >>confdefs.h <<\_ACEOF #define sgi 1 _ACEOF if test "$CC" = "cc" ; then CFLAGS="$CFLAGS -float" LIBS="$LIBS -lmalloc" fi ;; *darwin*) MACHTYPE="${target}" cat >>confdefs.h <<\_ACEOF #define unix 1 _ACEOF ;; *rs6000*) MACHTYPE="${target}" cat >>confdefs.h <<\_ACEOF #define AIX 1 _ACEOF ACCEPT_ARG3_TYPE="unsigned long" cat >>confdefs.h <<\_ACEOF #define unix 1 _ACEOF ;; *) MACHTYPE="${target}" ;; esac cat >>confdefs.h <<_ACEOF #define MACHTYPE "$MACHTYPE" _ACEOF cat >>confdefs.h <<_ACEOF #define ACCEPT_ARG3_TYPE $ACCEPT_ARG3_TYPE _ACEOF # Search for necessary programs. # Check whether --with-htmlbrowser was given. if test "${with_htmlbrowser+set}" = set; then withval=$with_htmlbrowser; DFLTHTMLBROWSER="${withval}" else DFLTHTMLBROWSER="firefox" fi cat >>confdefs.h <<_ACEOF #define DFLTHTMLBROWSER "${DFLTHTMLBROWSER}" _ACEOF for ac_prog in ${DFLTHTMLBROWSER} 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_HTMLBROWSER+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$HTMLBROWSER"; then ac_cv_prog_HTMLBROWSER="$HTMLBROWSER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_HTMLBROWSER="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi HTMLBROWSER=$ac_cv_prog_HTMLBROWSER if test -n "$HTMLBROWSER"; then { echo "$as_me:$LINENO: result: $HTMLBROWSER" >&5 echo "${ECHO_T}$HTMLBROWSER" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$HTMLBROWSER" && break done if ! test "${HTMLBROWSER}" = "${DFLTHTMLBROWSER}"; then { echo "$as_me:$LINENO: HTML browser executable not found, online viewing of the HTML manual will probably not be possible." >&5 echo "$as_me: HTML browser executable not found, online viewing of the HTML manual will probably not be possible." >&6;} fi # Check whether --with-pdfviewer was given. if test "${with_pdfviewer+set}" = set; then withval=$with_pdfviewer; DFLTPDFVIEWER="${withval}" else DFLTPDFVIEWER="xpdf" fi cat >>confdefs.h <<_ACEOF #define DFLTPDFVIEWER "${DFLTPDFVIEWER}" _ACEOF for ac_prog in ${DFLTPDFVIEWER} 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_PDFVIEWER+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$PDFVIEWER"; then ac_cv_prog_PDFVIEWER="$PDFVIEWER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PDFVIEWER="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PDFVIEWER=$ac_cv_prog_PDFVIEWER if test -n "$PDFVIEWER"; then { echo "$as_me:$LINENO: result: $PDFVIEWER" >&5 echo "${ECHO_T}$PDFVIEWER" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$PDFVIEWER" && break done if ! test "${PDFVIEWER}" = "${DFLTPDFVIEWER}"; then { echo "$as_me:$LINENO: PDF viewr executable not found, online viewing of the PDF manual will probably not be possible." >&5 echo "$as_me: PDF viewr executable not found, online viewing of the PDF manual will probably not be possible." >&6;} fi ######################################################################## ######################################################################## ######################################################################## # If --with-motif=DIR was specified, set MOTIF_DIR to DIR # Check whether --with-motif was given. if test "${with_motif+set}" = set; then withval=$with_motif; MOTIF_DIR=$withval fi # Check whether --with-opengl was given. if test "${with_opengl+set}" = set; then withval=$with_opengl; OPENGL_DIR=$withval fi ######################################################################## # # Store X library link line in XLIBS # { echo "$as_me:$LINENO: checking for X" >&5 echo $ECHO_N "checking for X... $ECHO_C" >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) { { echo "$as_me:$LINENO: error: Cannot use X directory names containing '" >&5 echo "$as_me: error: Cannot use X directory names containing '" >&2;} { (exit 1); exit 1; }; };; #( *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /lib) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. 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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # We can compile using X headers with no special include directory. ac_x_includes= else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 LIBS=$ac_save_LIBS for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { echo "$as_me:$LINENO: result: $have_x" >&5 echo "${ECHO_T}$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. cat >>confdefs.h <<\_ACEOF #define X_DISPLAY_MISSING 1 _ACEOF X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes 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 conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 LIBS="$ac_xsave_LIBS -R $x_libraries" 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 conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { echo "$as_me:$LINENO: result: neither works" >&5 echo "${ECHO_T}neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6; } if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_dnet_dnet_ntoa=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test $ac_cv_lib_dnet_dnet_ntoa = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6; } if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_dnet_stub_dnet_ntoa=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. { echo "$as_me:$LINENO: checking for gethostbyname" >&5 echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6; } if test "${ac_cv_func_gethostbyname+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. */ /* Define gethostbyname to an innocuous variant, in case declares gethostbyname. For example, HP-UX 11i declares gettimeofday. */ #define gethostbyname innocuous_gethostbyname /* System header to define __stub macros and hopefully few prototypes, which can conflict with char gethostbyname (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef gethostbyname /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_gethostbyname || defined __stub___gethostbyname choke me #endif int main () { return gethostbyname (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_gethostbyname=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6; } if test $ac_cv_func_gethostbyname = no; then { echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6; } if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_nsl_gethostbyname=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6; } if test $ac_cv_lib_nsl_gethostbyname = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6; } if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_bsd_gethostbyname=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6; } if test $ac_cv_lib_bsd_gethostbyname = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. { echo "$as_me:$LINENO: checking for connect" >&5 echo $ECHO_N "checking for connect... $ECHO_C" >&6; } if test "${ac_cv_func_connect+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. */ /* Define connect to an innocuous variant, in case declares connect. For example, HP-UX 11i declares gettimeofday. */ #define connect innocuous_connect /* System header to define __stub macros and hopefully few prototypes, which can conflict with char connect (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef connect /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_connect || defined __stub___connect choke me #endif int main () { return connect (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_connect=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_connect=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 echo "${ECHO_T}$ac_cv_func_connect" >&6; } if test $ac_cv_func_connect = no; then { echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6; } if test "${ac_cv_lib_socket_connect+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_socket_connect=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6; } if test $ac_cv_lib_socket_connect = yes; then X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. { echo "$as_me:$LINENO: checking for remove" >&5 echo $ECHO_N "checking for remove... $ECHO_C" >&6; } if test "${ac_cv_func_remove+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. */ /* Define remove to an innocuous variant, in case declares remove. For example, HP-UX 11i declares gettimeofday. */ #define remove innocuous_remove /* System header to define __stub macros and hopefully few prototypes, which can conflict with char remove (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef remove /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_remove || defined __stub___remove choke me #endif int main () { return remove (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_remove=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_remove=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 echo "${ECHO_T}$ac_cv_func_remove" >&6; } if test $ac_cv_func_remove = no; then { echo "$as_me:$LINENO: checking for remove in -lposix" >&5 echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6; } if test "${ac_cv_lib_posix_remove+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_posix_remove=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6; } if test $ac_cv_lib_posix_remove = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. { echo "$as_me:$LINENO: checking for shmat" >&5 echo $ECHO_N "checking for shmat... $ECHO_C" >&6; } if test "${ac_cv_func_shmat+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. */ /* Define shmat to an innocuous variant, in case declares shmat. For example, HP-UX 11i declares gettimeofday. */ #define shmat innocuous_shmat /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shmat (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shmat /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_shmat || defined __stub___shmat choke me #endif int main () { return shmat (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_shmat=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shmat=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 echo "${ECHO_T}$ac_cv_func_shmat" >&6; } if test $ac_cv_func_shmat = no; then { echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6; } if test "${ac_cv_lib_ipc_shmat+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_ipc_shmat=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6; } if test $ac_cv_lib_ipc_shmat = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6; } if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $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 GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_ICE_IceConnectionNumber=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi XLIBS="$X_LIBS $X_PRE_LIBS -lXt -lXext -lX11 $X_EXTRA_LIBS" if test "${ac_cv_XLIBS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_XLIBS="XLIBS='$XLIBS'" fi ######################################################################## { echo "$as_me:$LINENO: checking for Xmu" >&5 echo $ECHO_N "checking for Xmu... $ECHO_C" >&6; } result="no" geom_lib=-lXmu geom_func=XmuLookupStandardColormap geom_dirs='"" "$x_libraries" "$MOTIF_DIR/lib"' geom_otherlibs=$XLIBS geom_saved_LIBS=$LIBS #AC_MSG_CHECKING([how to link with $geom_lib]) GEOM_L_OPTION=0 for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_l_option= test -n "$geom_z" && geom_l_option="-L$geom_z" LIBS="$geom_l_option $geom_lib $geom_otherlibs" echo "configure:30985: checking for $geom_func with $geom_l_option" >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $geom_func (); int main () { return $geom_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then GEOM_L_OPTION="$geom_l_option" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext done LIBS=$geom_saved_LIBS #if test "$GEOM_L_OPTION" != "0" ; then # AC_MSG_RESULT([$geom_l_option $geom_lib]) #else # AC_MSG_RESULT([not found]) #fi if test "$GEOM_L_OPTION" != "0" ; then result="yes" cat >>confdefs.h <<\_ACEOF #define HAVE_XMU 1 _ACEOF if test "$GEOM_L_OPTION" != "" ; then XMULIBS="$GEOM_L_OPTION -lXmu" else XMULIBS="-lXmu" fi fi { echo "$as_me:$LINENO: result: $result" >&5 echo "${ECHO_T}$result" >&6; } ######################################################################## { echo "$as_me:$LINENO: checking for motif" >&5 echo $ECHO_N "checking for motif... $ECHO_C" >&6; } if test "$MOTIF_DIR" != "" ; then USER_MOTIF_DIR="$MOTIF_DIR/include" else USER_MOTIF_DIR="" fi geom_header=Xm/Xm.h geom_dirs='"$USER_MOTIF_DIR" "" "$x_includes" "/usr/local/include"' geom_saved_CPPFLAGS=$CPPFLAGS GEOM_I_OPTION="0" #AC_MSG_CHECKING([for $geom_header]) for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_i_option= test -n "$geom_z" && geom_i_option="-I$geom_z" CPPFLAGS="$geom_i_option $geom_saved_CPPFLAGS" echo "configure:31085: checking for $geom_header with $geom_i_option" >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$geom_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then GEOM_I_OPTION="$geom_i_option" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_ext done CPPFLAGS=$geom_saved_CPPFLAGS #if test "$GEOM_I_OPTION" = "0" ; then # AC_MSG_RESULT([not found]) #else # if test "$GEOM_I_OPTION" != "" ; then # AC_MSG_RESULT($GEOM_I_OPTION) # else # AC_MSG_RESULT([(found with no -I required)]) # fi #fi if test "$GEOM_I_OPTION" = "0" ; then { { echo "$as_me:$LINENO: error: Can't find Motif header file Xm/Xm.h. Geomview requires Motif (or Lesstif). See the file INSTALL.Geomview for details. " >&5 echo "$as_me: error: Can't find Motif header file Xm/Xm.h. Geomview requires Motif (or Lesstif). See the file INSTALL.Geomview for details. " >&2;} { (exit 1); exit 1; }; } fi MOTIFINCLUDE=$GEOM_I_OPTION ######################################################################## if test "$MOTIFLIBS" = "" ; then MOTIFLIBS="-lXm" fi if test "$MOTIF_DIR" != "" ; then USER_MOTIF_DIR="$MOTIF_DIR/lib" else USER_MOTIF_DIR="" fi geom_lib=$MOTIFLIBS geom_func=XmCreateForm geom_dirs='"$USER_MOTIF_DIR" "" "$x_libraries" "/usr/local/lib"' geom_otherlibs=$XLIBS geom_saved_LIBS=$LIBS #AC_MSG_CHECKING([how to link with $geom_lib]) GEOM_L_OPTION=0 for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_l_option= test -n "$geom_z" && geom_l_option="-L$geom_z" LIBS="$geom_l_option $geom_lib $geom_otherlibs" echo "configure:31178: checking for $geom_func with $geom_l_option" >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $geom_func (); int main () { return $geom_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then GEOM_L_OPTION="$geom_l_option" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext done LIBS=$geom_saved_LIBS #if test "$GEOM_L_OPTION" != "0" ; then # AC_MSG_RESULT([$geom_l_option $geom_lib]) #else # AC_MSG_RESULT([not found]) #fi if test "$GEOM_L_OPTION" = "0" ; then { { echo "$as_me:$LINENO: error: Can't find Motif libraries. Geomview requires Motif (or Lesstif). See the file INSTALL.Geomview for details. " >&5 echo "$as_me: error: Can't find Motif libraries. Geomview requires Motif (or Lesstif). See the file INSTALL.Geomview for details. " >&2;} { (exit 1); exit 1; }; } fi MOTIF_L_OPTION=$GEOM_L_OPTION MOTIFLIBS="$GEOM_L_OPTION $MOTIFLIBS" { echo "$as_me:$LINENO: result: headers $MOTIFINCLUDE, libraries $MOTIFLIBS" >&5 echo "${ECHO_T}headers $MOTIFINCLUDE, libraries $MOTIFLIBS" >&6; } ######################################################################## if test "z${OPENGL_DIR}" != "zno"; then { echo "$as_me:$LINENO: checking for opengl" >&5 echo $ECHO_N "checking for opengl... $ECHO_C" >&6; } if test "$OPENGL_DIR" != "" ; then USER_OPENGL_DIR="$OPENGL_DIR/include" else USER_OPENGL_DIR="" fi geom_header=GL/gl.h geom_dirs='"$USER_OPENGL_DIR" "" "/usr/local/include"' geom_saved_CPPFLAGS=$CPPFLAGS GEOM_I_OPTION="0" #AC_MSG_CHECKING([for $geom_header]) for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_i_option= test -n "$geom_z" && geom_i_option="-I$geom_z" CPPFLAGS="$geom_i_option $geom_saved_CPPFLAGS" echo "configure:31283: checking for $geom_header with $geom_i_option" >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$geom_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then GEOM_I_OPTION="$geom_i_option" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_ext done CPPFLAGS=$geom_saved_CPPFLAGS #if test "$GEOM_I_OPTION" = "0" ; then # AC_MSG_RESULT([not found]) #else # if test "$GEOM_I_OPTION" != "" ; then # AC_MSG_RESULT($GEOM_I_OPTION) # else # AC_MSG_RESULT([(found with no -I required)]) # fi #fi if test "$GEOM_I_OPTION" = "0" ; then { echo "$as_me:$LINENO: WARNING: Can't find OpenGL header file GL/gl.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. " >&5 echo "$as_me: WARNING: Can't find OpenGL header file GL/gl.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. " >&2;} OPENGLINCLUDE="" # $GEOM_I_OPTION fi GL_I_OPTION=$GEOM_I_OPTION # Geomview does not require OpenGL, _BUT_ an OpenGL implementation # through the X11 GLX extension; so check for glx.h as well. # # geom_header=GL/glx.h geom_dirs='"$USER_OPENGL_DIR" "" "/usr/local/include"' geom_saved_CPPFLAGS=$CPPFLAGS GEOM_I_OPTION="0" #AC_MSG_CHECKING([for $geom_header]) for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_i_option= test -n "$geom_z" && geom_i_option="-I$geom_z" CPPFLAGS="$geom_i_option $geom_saved_CPPFLAGS" echo "configure:31361: checking for $geom_header with $geom_i_option" >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$geom_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then GEOM_I_OPTION="$geom_i_option" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_ext done CPPFLAGS=$geom_saved_CPPFLAGS #if test "$GEOM_I_OPTION" = "0" ; then # AC_MSG_RESULT([not found]) #else # if test "$GEOM_I_OPTION" != "" ; then # AC_MSG_RESULT($GEOM_I_OPTION) # else # AC_MSG_RESULT([(found with no -I required)]) # fi #fi if test "$GEOM_I_OPTION" = "0" ; then { echo "$as_me:$LINENO: WARNING: Can't find OpenGL header file GL/glx.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. " >&5 echo "$as_me: WARNING: Can't find OpenGL header file GL/glx.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. " >&2;} GL_I_OPTION=0 else GL_I_OPTION="${GL_I_OPTION} ${GEOM_I_OPTION}" OPENGLINCLUDE="${OPENGLINCLUDE} ${GEOM_I_OPTION}" fi ######################################################################## if test "$OPENGL_DIR" != "" ; then USER_OPENGL_DIR="$OPENGL_DIR/lib" else USER_OPENGL_DIR="" fi geom_lib=-lGL geom_func=glBegin geom_dirs='"$USER_OPENGL_DIR" "" "$x_libraries" "/usr/local/lib"' geom_otherlibs="$XLIBS -lm" geom_saved_LIBS=$LIBS #AC_MSG_CHECKING([how to link with $geom_lib]) GEOM_L_OPTION=0 for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_l_option= test -n "$geom_z" && geom_l_option="-L$geom_z" LIBS="$geom_l_option $geom_lib $geom_otherlibs" echo "configure:31447: checking for $geom_func with $geom_l_option" >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $geom_func (); int main () { return $geom_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then GEOM_L_OPTION="$geom_l_option" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext done LIBS=$geom_saved_LIBS #if test "$GEOM_L_OPTION" != "0" ; then # AC_MSG_RESULT([$geom_l_option $geom_lib]) #else # AC_MSG_RESULT([not found]) #fi if test "$GEOM_L_OPTION" = "0" ; then { echo "$as_me:$LINENO: WARNING: Can't find OpenGL header file GL/gl.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. " >&5 echo "$as_me: WARNING: Can't find OpenGL header file GL/gl.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. " >&2;} fi GL_L_OPTION=$GEOM_L_OPTION geom_lib=-lGLU geom_func=gluBeginPolygon geom_dirs='"$USER_OPENGL_DIR" "" "$x_libraries" "/usr/local/lib"' geom_otherlibs="$GL_L_OPTION -lGL $XLIBS -lm" geom_saved_LIBS=$LIBS #AC_MSG_CHECKING([how to link with $geom_lib]) GEOM_L_OPTION=0 for geom_z in $geom_dirs ; do geom_z=`eval echo $geom_z` geom_l_option= test -n "$geom_z" && geom_l_option="-L$geom_z" LIBS="$geom_l_option $geom_lib $geom_otherlibs" echo "configure:31535: checking for $geom_func with $geom_l_option" >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $geom_func (); int main () { return $geom_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then GEOM_L_OPTION="$geom_l_option" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext done LIBS=$geom_saved_LIBS #if test "$GEOM_L_OPTION" != "0" ; then # AC_MSG_RESULT([$geom_l_option $geom_lib]) #else # AC_MSG_RESULT([not found]) #fi if test "$GEOM_L_OPTION" != "$GL_L_OPTION" ; then GLU_L_OPTION=$GEOM_L_OPTION else GLU_L_OPTION="" fi if test "z${GLU_L_OPTION}" = "z0"; then { echo "$as_me:$LINENO: result: libGLU not found. libGLU is required to render non-flat or concave polygons." >&5 echo "${ECHO_T}libGLU not found. libGLU is required to render non-flat or concave polygons." >&6; } OPENGLLIBS="$GL_L_OPTION -lGL" cat >>confdefs.h <<\_ACEOF #define HAVE_LIBGLU 0 _ACEOF else OPENGLLIBS="$GL_L_OPTION -lGL $GLU_L_OPTION -lGLU" cat >>confdefs.h <<\_ACEOF #define HAVE_LIBGLU 1 _ACEOF fi { echo "$as_me:$LINENO: result: headers $OPENGLINCLUDE, libraries $OPENGLLIBS" >&5 echo "${ECHO_T}headers $OPENGLINCLUDE, libraries $OPENGLLIBS" >&6; } ############################################################################# # Check for the OSMesa library which can be used for high quality # off-screen snapshots, including texture. This is beneficial over # making a snapshot of a window, because the latter only works when # the window is mapped and not obscured by other windows. However, # this can only work if libGL is indeed based on Mesa because # libOSMesa overrides the OpenGL API entries. ### ### unluckily, this just does not seem to work. Sad story. Disable the ### stuff. The good news: we can use glXCreateGLXPixmap() and render ### into that pixmap. ### # ac_gv_save_LIBS="${LIBS}" # LIBS="${OPENGLLIBS} ${XLIBS} ${LIBS}" # AC_CHECK_FUNCS([glXAllocateMemoryMESA],[MESAGL=1],[MESAGL=0]) # if test "${MESAGL}" = "1"; then # AC_CHECK_LIB([OSMesa], [OSMesaCreateContext], # [OPENGLLIBS="$GL_L_OPTION -lOSMesa -lGL $GLU_L_OPTION -lGLU"], # [],[${OPENGLLIBS}]) # fi # LIBS="${ac_gv_save_LIBS}" MESAGL=0 cat >>confdefs.h <<_ACEOF #define MESAGL ${MESAGL} _ACEOF # Even without libOSMesa it is possible to generate off-screen snapshots # by using glXCrateGLXPixmap(). ac_gv_save_LIBS="${LIBS}" LIBS="${OPENGLLIBS} ${XLIBS} ${LIBS}" for ac_func in glXCreateGLXPixmap do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+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. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done LIBS="${ac_gv_save_LIBS}" fi # without-opengl # # substitute, even if empty # # # MGX11 is always defined, does not hurt to include it in the library. # if test "z${GL_I_OPTION}" != "z0" && \ test "z${GL_L_OPTION}" != "z0" && \ test "z${OPENGL_DIR}" != "zno"; then MGOPENGL=1 MGX11=1 else MGOPENGL=0 MGX11=1 fi MGGL=0 if test "${MGOPENGL}" = 1; then MGOPENGL_TRUE= MGOPENGL_FALSE='#' else MGOPENGL_TRUE='#' MGOPENGL_FALSE= fi cat >>confdefs.h <<_ACEOF #define MGOPENGL ${MGOPENGL} _ACEOF if test "${MGX11}" = 1; then MGX11_TRUE= MGX11_FALSE='#' else MGX11_TRUE='#' MGX11_FALSE= fi cat >>confdefs.h <<_ACEOF #define MGX11 ${MGX11} _ACEOF if test "${MGGL}" = 1; then MGGL_TRUE= MGGL_FALSE='#' else MGGL_TRUE='#' MGGL_FALSE= fi cat >>confdefs.h <<_ACEOF #define MGGL ${MGGL} _ACEOF ######################################################################## # Check for zlib (and maybe bzlib? (image compression/decompression)) #GEOMVIEW_CHECK_PACKAGE([bz2lib],[bz2],[],[],[bzlib.h],[],[],[optional enabled]) # Check whether --with-zlib was given. if test "${with_zlib+set}" = set; then withval=$with_zlib; if test -z "$ZLIB_DISABLE"; then case "$withval" in yes) ZLIB_DISABLE=no ;; no) ZLIB_DISABLE=yes { echo "$as_me:$LINENO: result: Disabling \"zlib\"" >&5 echo "${ECHO_T}Disabling \"zlib\"" >&6; } ;; *) { { echo "$as_me:$LINENO: error: \"$withval\" should have been either \"yes\" or \"no\"" >&5 echo "$as_me: error: \"$withval\" should have been either \"yes\" or \"no\"" >&2;} { (exit 1); exit 1; }; } ;; esac fi else if test -z "$ZLIB_DISABLE"; then ZLIB_DISABLE=no fi fi if test "${ZLIB_DISABLE}" = yes; then : else DEFAULT_LIBDIR="${libdir}" if test "${DEFAULT_LIBDIR}" = '' then DEFAULT_LIBDIR="'${libdir}'" fi # Check whether --with-zlib-name was given. if test "${with_zlib_name+set}" = set; then withval=$with_zlib_name; case "$withval" in yes) { { echo "$as_me:$LINENO: error: "option \"--with-zlib-name\" requires an argument"" >&5 echo "$as_me: error: "option \"--with-zlib-name\" requires an argument"" >&2;} { (exit 1); exit 1; }; } ;; no) { { echo "$as_me:$LINENO: error: "option \"--with-zlib-name\" requires an argument"" >&5 echo "$as_me: error: "option \"--with-zlib-name\" requires an argument"" >&2;} { (exit 1); exit 1; }; } ;; *) ZLIB_NAME="$withval" ;; esac else ZLIB_NAME="z" fi # Check whether --with-zlib-dir was given. if test "${with_zlib_dir+set}" = set; then withval=$with_zlib_dir; case "$withval" in yes) { { echo "$as_me:$LINENO: error: "option \"--with-zlib-dir\" requires an argument"" >&5 echo "$as_me: error: "option \"--with-zlib-dir\" requires an argument"" >&2;} { (exit 1); exit 1; }; } ;; no) { { echo "$as_me:$LINENO: error: "option \"--with-zlib-dir\" requires an argument"" >&5 echo "$as_me: error: "option \"--with-zlib-dir\" requires an argument"" >&2;} { (exit 1); exit 1; }; } ;; *) ZLIB_LIB_PATH="$withval" ZLIB_INCLUDE_PATH="$withval" ;; esac fi # Check whether --with-zlib-lib was given. if test "${with_zlib_lib+set}" = set; then withval=$with_zlib_lib; case "$withval" in yes) { { echo "$as_me:$LINENO: error: "option \"--with-zlib-lib\" requires an argument"" >&5 echo "$as_me: error: "option \"--with-zlib-lib\" requires an argument"" >&2;} { (exit 1); exit 1; }; } ;; no) { { echo "$as_me:$LINENO: error: "option \"--with-zlib-lib\" requires an argument"" >&5 echo "$as_me: error: "option \"--with-zlib-lib\" requires an argument"" >&2;} { (exit 1); exit 1; }; } ;; *) ZLIB_LIB_PATH="$withval" ;; esac else test -z "`eval eval eval echo ${ZLIB_LIB_PATH}`" && ZLIB_LIB_PATH="${DEFAULT_LIBDIR}" fi DEFAULT_INCDIR="${includedir}" # Check whether --with-zlib-headers was given. if test "${with_zlib_headers+set}" = set; then withval=$with_zlib_headers; case "$withval" in yes) { { echo "$as_me:$LINENO: error: "option \"--with-zlib-headers\" requires an argument"" >&5 echo "$as_me: error: "option \"--with-zlib-headers\" requires an argument"" >&2;} { (exit 1); exit 1; }; } ;; no) { { echo "$as_me:$LINENO: error: "option \"--with-zlib-headers\" requires an argument"" >&5 echo "$as_me: error: "option \"--with-zlib-headers\" requires an argument"" >&2;} { (exit 1); exit 1; }; } ;; *) ZLIB_INCLUDE_PATH="$withval" ;; esac else test -z "`eval eval eval echo ${ZLIB_INCLUDE_PATH}`" && ZLIB_INCLUDE_PATH="${DEFAULT_INCDIR}" fi as_ac_Lib=`echo "ac_cv_lib_${ZLIB_NAME}''_main" | $as_tr_sh` { echo "$as_me:$LINENO: checking for main in -l${ZLIB_NAME}" >&5 echo $ECHO_N "checking for main in -l${ZLIB_NAME}... $ECHO_C" >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ZLIB_NAME} -L`eval eval eval echo ${ZLIB_LIB_PATH}` $LIBS" 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 main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_Lib=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi ac_res=`eval echo '${'$as_ac_Lib'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Lib'}'` = yes; then ZLIB_LIB="-L${ZLIB_LIB_PATH} -l${ZLIB_NAME}" ZLIB_ALL_LIB="-L${ZLIB_LIB_PATH} -l${ZLIB_NAME} " else ZLIB_LIB="" ZLIB_ALL_LIB="" ZLIB_LIB_PATH="" ZLIB_INCLUDE_PATH="" fi if test "x${ZLIB_LIB}" = "x" ; then case "$host" in *darwin*) eval "unset ac_cv_lib_${ZLIB_NAME}___main" as_ac_Lib=`echo "ac_cv_lib_${ZLIB_NAME}''_main" | $as_tr_sh` { echo "$as_me:$LINENO: checking for main in -framework ${ZLIB_NAME}" >&5 echo $ECHO_N "checking for main in -framework ${ZLIB_NAME}... $ECHO_C" >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-framework ${ZLIB_NAME} -F`eval eval eval echo ${ZLIB_LIB_PATH}` `eval eval eval echo ` $LIBS" 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 main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_Lib=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi ac_res=`eval echo '${'$as_ac_Lib'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Lib'}'` = yes; then ZLIB_LIB="-F${ZLIB_LIB_PATH} -framework ${ZLIB_NAME}" ZLIB_ALL_LIB="-F${ZLIB_LIB_PATH} -framework ${ZLIB_NAME} " else ZLIB_LIB="" ZLIB_ALL_LIB="" ZLIB_LIB_PATH="" ZLIB_INCLUDE_PATH="" fi ;; esac fi if test "x${ZLIB_LIB}" = "x" ; then : else gv_ac_ZLIB_save_CPPFLAGS="$CPPFLAGS" unset gv_ac_zlib_h for incdir in "${ZLIB_INCLUDE_PATH}"; do if test -n "`eval eval eval echo ${incdir}`"; then CPPFLAGS="-I`eval eval eval echo ${incdir}` ${gv_ac_ZLIB_save_CPPFLAGS}" fi for ac_header in zlib.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&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 { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; 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 core 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 { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.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 Claus-Justus Heine ## ## -------------------------------------------------------------------------- ## _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 { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&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 gv_ac_zlib_h="zlib.h" fi done if ! test "${gv_ac_zlib_h}" = "zlib.h"; then eval "unset ac_cv_header_zlib_h" else break fi done if ! test "${gv_ac_zlib_h}" = "zlib.h"; then ZLIB_LIB="" ZLIB_ALL_LIB="" ZLIB_LIB_PATH="" ZLIB_INCLUDE_PATH="" else ZLIB_ALL_INCLUDES="-I${incdir} " ZLIB_INCLUDES="-I${incdir}" ZLIB_INCLUDE_PATH="${incdir}" fi CPPFLAGS="${gv_ac_ZLIB_save_CPPFLAGS}" if test "x${ZLIB_LIB}" = "x" ; then : else cat >>confdefs.h <<\_ACEOF #define HAVE_LIBZ 1 _ACEOF fi fi fi if test -n "$ZLIB_LIB"; then HAVE_ZLIB_TRUE= HAVE_ZLIB_FALSE='#' else HAVE_ZLIB_TRUE='#' HAVE_ZLIB_FALSE= fi gv_ac_save_LIBS="${LIBS}" LIBS="${LIBS} ${ZLIB_ALL_LIB}" for ac_func in compressBound do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+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. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # pre-1.2 zlib? LIBS="${gv_ac_save_LIBS}" ######################################################################## OPENGL_LD_LIBRARY_PATH=`expr "$GL_L_OPTION" : '-L\(.*\)'` MOTIF_LD_LIBRARY_PATH=`expr "$MOTIF_L_OPTION" : '-L\(.*\)'` if test "$OPENGL_LD_LIBRARY_PATH" != "0" ; then LOCAL_LD_LIBRARY_PATH=$OPENGL_LD_LIBRARY_PATH fi if test "$MOTIF_LD_LIBRARY_PATH" != "0" ; then if test "$LOCAL_LD_LIBRARY_PATH" != "" ; then LOCAL_LD_LIBRARY_PATH="$LOCAL_LD_LIBRARY_PATH:$MOTIF_LD_LIBRARY_PATH" else LOCAL_LD_LIBRARY_PATH="$MOTIF_LD_LIBRARY_PATH" fi fi if test "$LOCAL_LD_LIBRARY_PATH" != "" ; then LD_LIBRARY_PATH_SETTINGS="LD_LIBRARY_PATH=$LOCAL_LD_LIBRARY_PATH" fi ######################################################################## ######################################################################## ######################################################################## # Check whether --enable-d1debug was given. if test "${enable_d1debug+set}" = set; then enableval=$enable_d1debug; if test "$enableval" != "no" ; then cat >>confdefs.h <<\_ACEOF #define D1_DEBUG 1 _ACEOF fi else cat >>confdefs.h <<\_ACEOF #define D1_DEBUG 0 _ACEOF fi # Check whether --enable-motion-averaging was given. if test "${enable_motion_averaging+set}" = set; then enableval=$enable_motion_averaging; if test "$enableval" = "no" ; then cat >>confdefs.h <<\_ACEOF #define EXPERIMENTAL_MOTION_AVERAGING 0 _ACEOF else cat >>confdefs.h <<\_ACEOF #define EXPERIMENTAL_MOTION_AVERAGING 1 _ACEOF fi else cat >>confdefs.h <<\_ACEOF #define EXPERIMENTAL_MOTION_AVERAGING 0 _ACEOF fi BEZIER_SPHERES=0 if test "${BEZIER_SPHERES}" = 1; then BEZIER_SPHERES_TRUE= BEZIER_SPHERES_FALSE='#' else BEZIER_SPHERES_TRUE='#' BEZIER_SPHERES_FALSE= fi cat >>confdefs.h <<_ACEOF #define BEZIER_SPHERES ${BEZIER_SPHERES} _ACEOF ######################################################################## ######################################################################## ######################################################################## 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 popen(CMD, MODE) needs/accepts MODE = \"rb\" for binary files" >&5 echo $ECHO_N "checking whether popen(CMD, MODE) needs/accepts MODE = \"rb\" for binary files... $ECHO_C" >&6; } if test "$cross_compiling" = yes; then { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { FILE *pipe = popen("${SHELL}", "rb"); if (pipe == NULL) return 1; else return 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } cat >>confdefs.h <<\_ACEOF #define POPEN_ACCEPTS_RB 1 _ACEOF 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 ) { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test x$HAVE_CXX = xtrue; then HAVE_CXX_TRUE= HAVE_CXX_FALSE='#' else HAVE_CXX_TRUE='#' HAVE_CXX_FALSE= fi ######################################################################## cat >>confdefs.h <<_ACEOF #define DOCDIR "`eval eval echo ${docdir}`" _ACEOF moduledir="\$(libexecdir)/geomview" geomdatadir="\$(datadir)/geomview" ######################################################################## top_geom_builddir='$(top_builddir)' OOGLLIBS="\$(top_geom_builddir)/src/lib/oogl/wa/libwa.la \ \$(top_geom_builddir)/src/lib/camera/libcamera.la \ \$(top_geom_builddir)/src/lib/color/libcolor.la \ \$(top_geom_builddir)/src/lib/fexpr/libfexpr.la \ \$(top_geom_builddir)/src/lib/geomutil/bdy/libbdy.la \ \$(top_geom_builddir)/src/lib/geomutil/crayplutil/libcrayplutil.la \ \$(top_geom_builddir)/src/lib/geomutil/dim/libdim.la \ \$(top_geom_builddir)/src/lib/geomutil/plutil/libplutil.la \ \$(top_geom_builddir)/src/lib/gprim/bbox/libbbox.la \ \$(top_geom_builddir)/src/lib/gprim/bezier/libbezier.la \ \$(top_geom_builddir)/src/lib/gprim/comment/libcomment.la \ \$(top_geom_builddir)/src/lib/gprim/discgrp/libdg.la \ \$(top_geom_builddir)/src/lib/gprim/geom/libgeom.la \ \$(top_geom_builddir)/src/lib/gprim/inst/libinst.la \ \$(top_geom_builddir)/src/lib/gprim/lincoln/liblincoln.la \ \$(top_geom_builddir)/src/lib/gprim/list/liblist.la \ \$(top_geom_builddir)/src/lib/gprim/mesh/libmesh.la \ \$(top_geom_builddir)/src/lib/gprim/ndmesh/libndmesh.la \ \$(top_geom_builddir)/src/lib/gprim/npolylist/libnpolylist.la \ \$(top_geom_builddir)/src/lib/gprim/polylist/libpolylist.la \ \$(top_geom_builddir)/src/lib/gprim/quad/libquad.la \ \$(top_geom_builddir)/src/lib/gprim/skel/libskel.la \ \$(top_geom_builddir)/src/lib/gprim/sphere/libsphere.la \ \$(top_geom_builddir)/src/lib/gprim/tlist/libtlist.la \ \$(top_geom_builddir)/src/lib/gprim/vect/libvect.la \ \$(top_geom_builddir)/src/lib/mg/buf/liblibmgbuf.la \ \$(top_geom_builddir)/src/lib/mg/common/libmgcommon.la \ \$(top_geom_builddir)/src/lib/mg/ps/libmgps.la \ \$(top_geom_builddir)/src/lib/mg/rib/libmgrib.la \ \$(top_geom_builddir)/src/lib/pointlist/libpointlist.la \ \$(top_geom_builddir)/src/lib/shade/libshade.la \ \$(top_geom_builddir)/src/lib/window/libwindow.la \ \$(top_geom_builddir)/src/lib/geometry/cmodel/libcmodel.la \ \$(top_geom_builddir)/src/lib/geometry/point3/libpoint3.la \ \$(top_geom_builddir)/src/lib/geometry/transform3/libtransform3.la \ \$(top_geom_builddir)/src/lib/geometry/transformn/libtransformn.la \ \$(top_geom_builddir)/src/lib/geometry/transobj/libtransobj.la \ \$(top_geom_builddir)/src/lib/geometry/ntransobj/libntransobj.la \ \$(top_geom_builddir)/src/lib/oogl/lisp/liblisp.la \ \$(top_geom_builddir)/src/lib/oogl/refcomm/librefcomm.la \ \$(top_geom_builddir)/src/lib/oogl/util/libooglutil.la \ \$(top_geom_builddir)/src/lib/aclib/libacgeomview.la" if test "z${MGOPENGL}" = "z1"; then OOGLLIBS="${OOGLLIBS} \$(top_geom_builddir)/src/lib/mg/opengl/libmgopengl.la" fi if test "z${MGX11}" = "z1"; then OOGLLIBS="${OOGLLIBS} \$(top_geom_builddir)/src/lib/mg/x11/libmgx11.la" fi if test "${ac_cv_OOGLLIBS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_OOGLLIBS="OOGLLIBS='$OOGLLIBS'" fi OOGLLIB='$(top_geom_builddir)/src/lib/libgeomview.la' if test "${ac_cv_OOGLLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_OOGLLIB="OOGLLIB='$OOGLLIB'" fi MOTIFUILIB='$(top_geom_builddir)/src/lib/mib/libmib.a' if test "${ac_cv_MOTIFUILIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_MOTIFUILIB="MOTIFUILIB='$MOTIFUILIB'" fi STUBLIB="\$(top_builddir)/src/lib/gprim/stub/libstub.la" ######################################################################## # Find out how to link files if we haven't already if test -z "$LN_S" then { 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 fi # Remove the include directory if we haven't done that yet if test -z "$lf_link_headers" then lf_link_headers="we are all Kosh" rm -rf "$srcdir/include" fi # Get the directory from the second argument which is optional lf_directory="include" # ${srcdir}/mkinstalldirs "$lf_directory" mkdir $lf_directory if test -d "`pwd`/$srcdir"; then lf_srcdir="`pwd`/$srcdir" else lf_srcdir="$srcdir" fi # Link them lf_subdirs="`echo src/lib/aclib \ src/lib/oogl/lisp \ src/lib/oogl/refcomm \ src/lib/oogl/util \ src/lib/oogl/wa \ src/lib/geometry/ \ src/lib/geometry/cmodel \ src/lib/geometry/hpoint3 \ src/lib/geometry/hpointn \ src/lib/geometry/point3 \ src/lib/geometry/transform3 \ src/lib/geometry/transformn \ src/lib/geometry/transobj \ src/lib/geometry/ntransobj \ src/lib/camera \ src/lib/color \ src/lib/fexpr \ src/lib/geomutil/bdy \ src/lib/geomutil/crayplutil \ src/lib/geomutil/dim \ src/lib/geomutil/plutil \ src/lib/gprim/bbox \ src/lib/gprim/bezier \ src/lib/gprim/comment \ src/lib/gprim/discgrp \ src/lib/gprim/geom \ src/lib/gprim/inst \ src/lib/gprim/lincoln \ src/lib/gprim/list \ src/lib/gprim/mesh \ src/lib/gprim/polylist \ src/lib/gprim/ndmesh \ src/lib/gprim/npolylist \ src/lib/gprim/quad \ src/lib/gprim/skel \ src/lib/gprim/sphere \ src/lib/gprim/stub \ src/lib/gprim/tlist \ src/lib/gprim/vect \ src/lib/mg/buf \ src/lib/mg/common \ src/lib/mg/opengl \ src/lib/mg/x11 \ src/lib/mg/ps \ src/lib/mg/rib \ src/lib/mib \ src/lib/pointlist \ src/lib/shade \ src/lib/window \ src/lib/forms \ src/bin/geomview/common \ `" for lf_dir in $lf_subdirs do echo "linking headers from $srcdir/$lf_dir" # Check if the Headers file exists if test -f "$srcdir/$lf_dir/Headers" then for lf_file in `(cd $srcdir/$lf_dir; cat Headers)` do rm -f $lf_directory/$lf_file if test -f "$lf_srcdir/$lf_dir/$lf_file"; then $LN_S "$lf_srcdir/$lf_dir/$lf_file" "$lf_directory/$lf_file" else # assume it will be located in the build-directory $LN_S "`pwd`/$lf_dir/$lf_file" "$lf_directory/$lf_file" fi if echo ${lf_file}|fgrep 'P.h' > /dev/null 2>&1; then GEOMVIEWPRIVHDRFILES="${GEOMVIEWPRIVHDRFILES} include/${lf_file}" else GEOMVIEWHDRFILES="${GEOMVIEWHDRFILES} include/${lf_file}" fi done else echo "Warning: No Headers file for $srcdir/$lf_dir" fi done # See whether to put an entry for the prefix if test "$prefix" = "/usr" || test "$prefix" = "/usr/local" then default_includes="" else default_includes="-I\$(prefix) " fi # Get the directory list lf_dirs="`echo `" # Check whether we have a lib directory. If so put it in { echo "$as_me:$LINENO: checking whether sources have a lib directory" >&5 echo $ECHO_N "checking whether sources have a lib directory... $ECHO_C" >&6; } if test -d "`pwd`/$srcdir/lib" then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } default_includes="$default_includes -I\$(top_srcdir)/lib" else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Now add in the directories. If the list is empty then just add include/ # If the list is not empty then add the subdirectories. if test -z "$lf_dirs" then default_includes="$default_includes -I\$(top_builddir)/include" else for lf_dir in $lf_dirs do default_includes="$default_includes -I\$(top_builddir)/include/$lf_dir" done fi # And that's it ac_config_files="$ac_config_files Makefile data/Makefile data/shaders/Makefile doc/Makefile src/Makefile src/lib/Makefile src/lib/aclib/Makefile src/lib/camera/Makefile src/lib/color/Makefile src/lib/fexpr/Makefile src/lib/oogl/Makefile src/lib/oogl/lisp/Makefile src/lib/oogl/refcomm/Makefile src/lib/oogl/util/Makefile src/lib/oogl/wa/Makefile src/lib/geometry/Makefile src/lib/geometry/cmodel/Makefile src/lib/geometry/hpoint3/Makefile src/lib/geometry/hpointn/Makefile src/lib/geometry/point3/Makefile src/lib/geometry/transform3/Makefile src/lib/geometry/transformn/Makefile src/lib/geometry/transobj/Makefile src/lib/geometry/ntransobj/Makefile src/lib/geomutil/Makefile src/lib/geomutil/bdy/Makefile src/lib/geomutil/crayplutil/Makefile src/lib/geomutil/dim/Makefile src/lib/geomutil/plutil/Makefile src/lib/gprim/Makefile src/lib/gprim/bbox/Makefile src/lib/gprim/bezier/Makefile src/lib/gprim/comment/Makefile src/lib/gprim/discgrp/Makefile src/lib/gprim/geom/Makefile src/lib/gprim/inst/Makefile src/lib/gprim/lincoln/Makefile src/lib/gprim/list/Makefile src/lib/gprim/mesh/Makefile src/lib/gprim/polylist/Makefile src/lib/gprim/ndmesh/Makefile src/lib/gprim/npolylist/Makefile src/lib/gprim/quad/Makefile src/lib/gprim/skel/Makefile src/lib/gprim/sphere/Makefile src/lib/gprim/stub/Makefile src/lib/gprim/tlist/Makefile src/lib/gprim/vect/Makefile src/lib/mg/Makefile src/lib/mg/buf/Makefile src/lib/mg/common/Makefile src/lib/mg/opengl/Makefile src/lib/mg/x11/Makefile src/lib/mg/ps/Makefile src/lib/mg/rib/Makefile src/lib/mib/Makefile src/lib/pointlist/Makefile src/lib/shade/Makefile src/lib/window/Makefile src/lib/forms/Makefile src/bin/Makefile src/bin/geomview/Makefile src/bin/geomview/common/Makefile src/bin/geomview/x11/Makefile src/bin/geomview/x11/bitmaps/Makefile src/bin/geomview/x11/interface/Makefile src/bin/animate/Makefile src/bin/animate/interface/Makefile src/bin/clipboard/Makefile src/bin/gvclock/gvclock src/bin/gvclock/Makefile src/bin/geomutil/Makefile src/bin/geomutil/bdy/Makefile src/bin/geomutil/clip/Makefile src/bin/geomutil/hvectext/Makefile src/bin/geomutil/hvectext/hvectext src/bin/geomutil/maple2oogl/Makefile src/bin/geomutil/math2oogl/Makefile src/bin/geomutil/oogl2rib/Makefile src/bin/geomutil/oogl2vrml/Makefile src/bin/geomutil/plutil/Makefile src/bin/geomutil/ucd/Makefile src/bin/geomutil/vrml2oogl/Makefile src/bin/geomutil/vrml2oogl/lib/Makefile src/bin/nose/Makefile src/bin/togeomview/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${INSTALL_LIBGEOMVIEW_TRUE}" && test -z "${INSTALL_LIBGEOMVIEW_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"INSTALL_LIBGEOMVIEW\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"INSTALL_LIBGEOMVIEW\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${AQSIS_SHADER_COMPILER_TRUE}" && test -z "${AQSIS_SHADER_COMPILER_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"AQSIS_SHADER_COMPILER\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"AQSIS_SHADER_COMPILER\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${PIXIE_SHADER_COMPILER_TRUE}" && test -z "${PIXIE_SHADER_COMPILER_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"PIXIE_SHADER_COMPILER\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"PIXIE_SHADER_COMPILER\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${DELIGHT_SHADER_COMPILER_TRUE}" && test -z "${DELIGHT_SHADER_COMPILER_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"DELIGHT_SHADER_COMPILER\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"DELIGHT_SHADER_COMPILER\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${MGOPENGL_TRUE}" && test -z "${MGOPENGL_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"MGOPENGL\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"MGOPENGL\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${MGX11_TRUE}" && test -z "${MGX11_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"MGX11\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"MGX11\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${MGGL_TRUE}" && test -z "${MGGL_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"MGGL\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"MGGL\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${HAVE_ZLIB_TRUE}" && test -z "${HAVE_ZLIB_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"HAVE_ZLIB\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"HAVE_ZLIB\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${BEZIER_SPHERES_TRUE}" && test -z "${BEZIER_SPHERES_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"BEZIER_SPHERES\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"BEZIER_SPHERES\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${HAVE_CXX_TRUE}" && test -z "${HAVE_CXX_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"HAVE_CXX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"HAVE_CXX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${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 more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # 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 # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done 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) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # 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'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # 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 after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, 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 # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { 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 sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by geomview $as_me 1.9.4, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_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 and configuration settings, 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 --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ geomview config.status 1.9.4 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' _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 ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --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;; --he | --h) # Conflict between --help and --header { 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 ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { 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" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; "data/shaders/Makefile") CONFIG_FILES="$CONFIG_FILES data/shaders/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/lib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/Makefile" ;; "src/lib/aclib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/aclib/Makefile" ;; "src/lib/camera/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/camera/Makefile" ;; "src/lib/color/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/color/Makefile" ;; "src/lib/fexpr/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/fexpr/Makefile" ;; "src/lib/oogl/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/oogl/Makefile" ;; "src/lib/oogl/lisp/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/oogl/lisp/Makefile" ;; "src/lib/oogl/refcomm/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/oogl/refcomm/Makefile" ;; "src/lib/oogl/util/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/oogl/util/Makefile" ;; "src/lib/oogl/wa/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/oogl/wa/Makefile" ;; "src/lib/geometry/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/Makefile" ;; "src/lib/geometry/cmodel/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/cmodel/Makefile" ;; "src/lib/geometry/hpoint3/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/hpoint3/Makefile" ;; "src/lib/geometry/hpointn/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/hpointn/Makefile" ;; "src/lib/geometry/point3/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/point3/Makefile" ;; "src/lib/geometry/transform3/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/transform3/Makefile" ;; "src/lib/geometry/transformn/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/transformn/Makefile" ;; "src/lib/geometry/transobj/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/transobj/Makefile" ;; "src/lib/geometry/ntransobj/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geometry/ntransobj/Makefile" ;; "src/lib/geomutil/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geomutil/Makefile" ;; "src/lib/geomutil/bdy/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geomutil/bdy/Makefile" ;; "src/lib/geomutil/crayplutil/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geomutil/crayplutil/Makefile" ;; "src/lib/geomutil/dim/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geomutil/dim/Makefile" ;; "src/lib/geomutil/plutil/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/geomutil/plutil/Makefile" ;; "src/lib/gprim/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/Makefile" ;; "src/lib/gprim/bbox/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/bbox/Makefile" ;; "src/lib/gprim/bezier/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/bezier/Makefile" ;; "src/lib/gprim/comment/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/comment/Makefile" ;; "src/lib/gprim/discgrp/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/discgrp/Makefile" ;; "src/lib/gprim/geom/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/geom/Makefile" ;; "src/lib/gprim/inst/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/inst/Makefile" ;; "src/lib/gprim/lincoln/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/lincoln/Makefile" ;; "src/lib/gprim/list/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/list/Makefile" ;; "src/lib/gprim/mesh/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/mesh/Makefile" ;; "src/lib/gprim/polylist/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/polylist/Makefile" ;; "src/lib/gprim/ndmesh/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/ndmesh/Makefile" ;; "src/lib/gprim/npolylist/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/npolylist/Makefile" ;; "src/lib/gprim/quad/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/quad/Makefile" ;; "src/lib/gprim/skel/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/skel/Makefile" ;; "src/lib/gprim/sphere/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/sphere/Makefile" ;; "src/lib/gprim/stub/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/stub/Makefile" ;; "src/lib/gprim/tlist/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/tlist/Makefile" ;; "src/lib/gprim/vect/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gprim/vect/Makefile" ;; "src/lib/mg/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/Makefile" ;; "src/lib/mg/buf/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/buf/Makefile" ;; "src/lib/mg/common/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/common/Makefile" ;; "src/lib/mg/opengl/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/opengl/Makefile" ;; "src/lib/mg/x11/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/x11/Makefile" ;; "src/lib/mg/ps/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/ps/Makefile" ;; "src/lib/mg/rib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mg/rib/Makefile" ;; "src/lib/mib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/mib/Makefile" ;; "src/lib/pointlist/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/pointlist/Makefile" ;; "src/lib/shade/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/shade/Makefile" ;; "src/lib/window/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/window/Makefile" ;; "src/lib/forms/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/forms/Makefile" ;; "src/bin/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/Makefile" ;; "src/bin/geomview/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomview/Makefile" ;; "src/bin/geomview/common/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomview/common/Makefile" ;; "src/bin/geomview/x11/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomview/x11/Makefile" ;; "src/bin/geomview/x11/bitmaps/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomview/x11/bitmaps/Makefile" ;; "src/bin/geomview/x11/interface/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomview/x11/interface/Makefile" ;; "src/bin/animate/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/animate/Makefile" ;; "src/bin/animate/interface/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/animate/interface/Makefile" ;; "src/bin/clipboard/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/clipboard/Makefile" ;; "src/bin/gvclock/gvclock") CONFIG_FILES="$CONFIG_FILES src/bin/gvclock/gvclock" ;; "src/bin/gvclock/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/gvclock/Makefile" ;; "src/bin/geomutil/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/Makefile" ;; "src/bin/geomutil/bdy/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/bdy/Makefile" ;; "src/bin/geomutil/clip/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/clip/Makefile" ;; "src/bin/geomutil/hvectext/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/hvectext/Makefile" ;; "src/bin/geomutil/hvectext/hvectext") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/hvectext/hvectext" ;; "src/bin/geomutil/maple2oogl/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/maple2oogl/Makefile" ;; "src/bin/geomutil/math2oogl/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/math2oogl/Makefile" ;; "src/bin/geomutil/oogl2rib/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/oogl2rib/Makefile" ;; "src/bin/geomutil/oogl2vrml/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/oogl2vrml/Makefile" ;; "src/bin/geomutil/plutil/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/plutil/Makefile" ;; "src/bin/geomutil/ucd/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/ucd/Makefile" ;; "src/bin/geomutil/vrml2oogl/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/vrml2oogl/Makefile" ;; "src/bin/geomutil/vrml2oogl/lib/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/geomutil/vrml2oogl/lib/Makefile" ;; "src/bin/nose/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/nose/Makefile" ;; "src/bin/togeomview/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/togeomview/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 test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$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 "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for 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 _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim build!$build$ac_delim build_cpu!$build_cpu$ac_delim build_vendor!$build_vendor$ac_delim build_os!$build_os$ac_delim host!$host$ac_delim host_cpu!$host_cpu$ac_delim host_vendor!$host_vendor$ac_delim host_os!$host_os$ac_delim target!$target$ac_delim target_cpu!$target_cpu$ac_delim target_vendor!$target_vendor$ac_delim target_os!$target_os$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim am__isrc!$am__isrc$ac_delim CYGPATH_W!$CYGPATH_W$ac_delim PACKAGE!$PACKAGE$ac_delim VERSION!$VERSION$ac_delim ACLOCAL!$ACLOCAL$ac_delim AUTOCONF!$AUTOCONF$ac_delim AUTOMAKE!$AUTOMAKE$ac_delim AUTOHEADER!$AUTOHEADER$ac_delim MAKEINFO!$MAKEINFO$ac_delim install_sh!$install_sh$ac_delim STRIP!$STRIP$ac_delim INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim mkdir_p!$mkdir_p$ac_delim AWK!$AWK$ac_delim SET_MAKE!$SET_MAKE$ac_delim am__leading_dot!$am__leading_dot$ac_delim AMTAR!$AMTAR$ac_delim am__tar!$am__tar$ac_delim am__untar!$am__untar$ac_delim MAINTAINER_MODE_TRUE!$MAINTAINER_MODE_TRUE$ac_delim MAINTAINER_MODE_FALSE!$MAINTAINER_MODE_FALSE$ac_delim MAINT!$MAINT$ac_delim abs_top_builddir!$abs_top_builddir$ac_delim abs_top_srcdir!$abs_top_srcdir$ac_delim DEFAULT_PREFIX!$DEFAULT_PREFIX$ac_delim expanded_prefix!$expanded_prefix$ac_delim expanded_exec_prefix!$expanded_exec_prefix$ac_delim CXX!$CXX$ac_delim CXXFLAGS!$CXXFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CXX!$ac_ct_CXX$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim DEPDIR!$DEPDIR$ac_delim am__include!$am__include$ac_delim am__quote!$am__quote$ac_delim AMDEP_TRUE!$AMDEP_TRUE$ac_delim AMDEP_FALSE!$AMDEP_FALSE$ac_delim AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim CXXDEPMODE!$CXXDEPMODE$ac_delim am__fastdepCXX_TRUE!$am__fastdepCXX_TRUE$ac_delim am__fastdepCXX_FALSE!$am__fastdepCXX_FALSE$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF CEOF$ac_eof _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF ac_ct_CC!$ac_ct_CC$ac_delim CCDEPMODE!$CCDEPMODE$ac_delim am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim CPP!$CPP$ac_delim LEX!$LEX$ac_delim LEX_OUTPUT_ROOT!$LEX_OUTPUT_ROOT$ac_delim LEXLIB!$LEXLIB$ac_delim YACC!$YACC$ac_delim YFLAGS!$YFLAGS$ac_delim INSTALL_LIBGEOMVIEW_TRUE!$INSTALL_LIBGEOMVIEW_TRUE$ac_delim INSTALL_LIBGEOMVIEW_FALSE!$INSTALL_LIBGEOMVIEW_FALSE$ac_delim SED!$SED$ac_delim GREP!$GREP$ac_delim EGREP!$EGREP$ac_delim LN_S!$LN_S$ac_delim ECHO!$ECHO$ac_delim AR!$AR$ac_delim RANLIB!$RANLIB$ac_delim CXXCPP!$CXXCPP$ac_delim F77!$F77$ac_delim FFLAGS!$FFLAGS$ac_delim ac_ct_F77!$ac_ct_F77$ac_delim LIBTOOL!$LIBTOOL$ac_delim FIND!$FIND$ac_delim GLOB_SHELL_PATH!$GLOB_SHELL_PATH$ac_delim GLOB_SHELL!$GLOB_SHELL$ac_delim PS2EPSI!$PS2EPSI$ac_delim EPSTOPDF!$EPSTOPDF$ac_delim PDFIMAGESPROG!$PDFIMAGESPROG$ac_delim PNMTOPNG!$PNMTOPNG$ac_delim PAMTOTIFF!$PAMTOTIFF$ac_delim AQSIS_SHADER_COMPILER!$AQSIS_SHADER_COMPILER$ac_delim AQSIS_SHADER_COMPILER_TRUE!$AQSIS_SHADER_COMPILER_TRUE$ac_delim AQSIS_SHADER_COMPILER_FALSE!$AQSIS_SHADER_COMPILER_FALSE$ac_delim PIXIE_SHADER_COMPILER!$PIXIE_SHADER_COMPILER$ac_delim PIXIE_SHADER_COMPILER_TRUE!$PIXIE_SHADER_COMPILER_TRUE$ac_delim PIXIE_SHADER_COMPILER_FALSE!$PIXIE_SHADER_COMPILER_FALSE$ac_delim DELIGHT_SHADER_COMPILER!$DELIGHT_SHADER_COMPILER$ac_delim DELIGHT_SHADER_COMPILER_TRUE!$DELIGHT_SHADER_COMPILER_TRUE$ac_delim DELIGHT_SHADER_COMPILER_FALSE!$DELIGHT_SHADER_COMPILER_FALSE$ac_delim ALLOCA!$ALLOCA$ac_delim LIBOBJS!$LIBOBJS$ac_delim POW_LIB!$POW_LIB$ac_delim SOCKETLIBS!$SOCKETLIBS$ac_delim MACHTYPE!$MACHTYPE$ac_delim HTMLBROWSER!$HTMLBROWSER$ac_delim PDFVIEWER!$PDFVIEWER$ac_delim XMKMF!$XMKMF$ac_delim X_CFLAGS!$X_CFLAGS$ac_delim X_PRE_LIBS!$X_PRE_LIBS$ac_delim X_LIBS!$X_LIBS$ac_delim X_EXTRA_LIBS!$X_EXTRA_LIBS$ac_delim XLIBS!$XLIBS$ac_delim XMULIBS!$XMULIBS$ac_delim MOTIFINCLUDE!$MOTIFINCLUDE$ac_delim MOTIFLIBS!$MOTIFLIBS$ac_delim MESAGL!$MESAGL$ac_delim OPENGLLIBS!$OPENGLLIBS$ac_delim OPENGLINCLUDE!$OPENGLINCLUDE$ac_delim MGOPENGL_TRUE!$MGOPENGL_TRUE$ac_delim MGOPENGL_FALSE!$MGOPENGL_FALSE$ac_delim MGX11_TRUE!$MGX11_TRUE$ac_delim MGX11_FALSE!$MGX11_FALSE$ac_delim MGGL_TRUE!$MGGL_TRUE$ac_delim MGGL_FALSE!$MGGL_FALSE$ac_delim HAVE_ZLIB_TRUE!$HAVE_ZLIB_TRUE$ac_delim HAVE_ZLIB_FALSE!$HAVE_ZLIB_FALSE$ac_delim ZLIB_INCLUDE_PATH!$ZLIB_INCLUDE_PATH$ac_delim ZLIB_INCLUDES!$ZLIB_INCLUDES$ac_delim ZLIB_ALL_INCLUDES!$ZLIB_ALL_INCLUDES$ac_delim ZLIB_LIB_PATH!$ZLIB_LIB_PATH$ac_delim ZLIB_LIB!$ZLIB_LIB$ac_delim ZLIB_ALL_LIB!$ZLIB_ALL_LIB$ac_delim ZLIB_NAME!$ZLIB_NAME$ac_delim LD_LIBRARY_PATH_SETTINGS!$LD_LIBRARY_PATH_SETTINGS$ac_delim BEZIER_SPHERES_TRUE!$BEZIER_SPHERES_TRUE$ac_delim BEZIER_SPHERES_FALSE!$BEZIER_SPHERES_FALSE$ac_delim HAVE_CXX_TRUE!$HAVE_CXX_TRUE$ac_delim HAVE_CXX_FALSE!$HAVE_CXX_FALSE$ac_delim moduledir!$moduledir$ac_delim geomdatadir!$geomdatadir$ac_delim top_geom_builddir!$top_geom_builddir$ac_delim OOGLLIBS!$OOGLLIBS$ac_delim OOGLLIB!$OOGLLIB$ac_delim MOTIFUILIB!$MOTIFUILIB$ac_delim STUBLIB!$STUBLIB$ac_delim GEOMVIEWHDRFILES!$GEOMVIEWHDRFILES$ac_delim GEOMVIEWPRIVHDRFILES!$GEOMVIEWPRIVHDRFILES$ac_delim default_includes!$default_includes$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 91; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$ac_file_inputs $ac_f" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input="Generated from "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF 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&@top_builddir@&$ac_top_builddir_sub&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; :H) # # CONFIG_HEADER # _ACEOF # Transform confdefs.h into a sed script `conftest.defines', that # substitutes the proper values into config.h.in to produce config.h. rm -f conftest.defines conftest.tail # First, append a space to every undef/define line, to ease matching. echo 's/$/ /' >conftest.defines # Then, protect against being on the right side of a sed subst, or in # an unquoted here document, in config.status. If some macros were # called several times there might be several #defines for the same # symbol, which is useless. But do not sort them, since the last # AC_DEFINE must be honored. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* # These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where # NAME is the cpp macro being defined, VALUE is the value it is being given. # PARAMS is the parameter list in the macro definition--in most cases, it's # just an empty string. ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' ac_dB='\\)[ (].*,\\1define\\2' ac_dC=' ' ac_dD=' ,' uniq confdefs.h | sed -n ' t rset :rset s/^[ ]*#[ ]*define[ ][ ]*// t ok d :ok s/[\\&,]/\\&/g s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p ' >>conftest.defines # Remove the space that was appended to ease matching. # Then replace #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. # (The regexp can be short, since the line contains either #define or #undef.) echo 's/ $// s,^[ #]*u.*,/* & */,' >>conftest.defines # Break up conftest.defines: ac_max_sed_lines=50 # First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" # Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" # Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" # et cetera. ac_in='$ac_file_inputs' ac_out='"$tmp/out1"' ac_nxt='"$tmp/out2"' while : do # Write a here document: cat >>$CONFIG_STATUS <<_ACEOF # First, check the format of the line: cat >"\$tmp/defines.sed" <<\\CEOF /^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def /^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def b :def _ACEOF sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail grep . conftest.tail >/dev/null || break rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines conftest.tail echo "ac_result=$ac_in" >>$CONFIG_STATUS cat >>$CONFIG_STATUS <<\_ACEOF if test x"$ac_file" != x-; then echo "/* $configure_input */" >"$tmp/config.h" cat "$ac_result" >>"$tmp/config.h" if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else rm -f $ac_file mv "$tmp/config.h" $ac_file fi else echo "/* $configure_input */" cat "$ac_result" fi rm -f "$tmp/out12" # Compute $ac_file's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $ac_file | $ac_file:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $ac_file" >`$as_dirname -- $ac_file || $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X$ac_file : 'X\(//\)[^/]' \| \ X$ac_file : 'X\(//\)$' \| \ X$ac_file : 'X\(/\)' \| . 2>/dev/null || echo X$ac_file | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir=$dirpart/$fdir case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; esac done # for ac_tag { (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 geomview-1.9.4/mkmodulesdir0000755000175000001440000000154607730232777012735 00000000000000#! /bin/sh # usage: mkmodulesdir ROOT # where ROOT is the pathname (can be relative) of the geomview source tree MODULES="$1/modules" if test -d $MODULES ; then : else mkdir $MODULES fi cat > $MODULES/README <) AC_MSG_RESULT([configuring $PACKAGE_NAME $PACKAGE_VERSION]) AC_CANONICAL_TARGET([]) AM_INIT_AUTOMAKE([dist-bzip2 1.10]) AM_MAINTAINER_MODE AC_CONFIG_SRCDIR([src/bin/geomview/x11/gvmain.c]) AC_CONFIG_HEADER([config.h]) AC_SUBST(abs_top_builddir) AC_SUBST(abs_top_srcdir) GEOMVIEW_SET_PREFIX dnl Add extra include or link directories AC_ARG_WITH(build-path,[ --with-build-path[=DIR] use DIR/include DIR/lib ],[ for d in `echo $withval | tr : ' '`; do test -d $d/include && CPPFLAGS="$CPPFLAGS -I$d/include" test -d $d/lib && LDFLAGS="$LDFLAGS -L$d/lib" done ]) ## Autoheader stuff. AH_TOP([#ifndef CONFIG_H_INCLUDED #define CONFIG_H_INCLUDED]) AH_BOTTOM([#if D1_DEBUG #define D1PRINT(args) printf args #else #define D1PRINT(args) #endif #if !HAVE_WORKING_FORK # error FIXME! We need fork() #endif /* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif #endif #if !HAVE_LSTAT || \ !LSTAT_FOLLOWS_SLASHED_SYMLINK || \ HAVE_LSTAT_EMPTY_STRING_BUG # define lstat(path, buf) gv_lstat(path, buf) #endif #if !HAVE_STAT || HAVE_STAT_EMPTY_STRING_BUG # define stat(path, buf) gv_stat(path, buf) # define fstat(fd, buf) gv_fstat(fd, buf) #endif #ifdef HAVE_STDBOOL_H # include #else # ifndef HAVE__BOOL # ifdef __cplusplus typedef bool _Bool; # else # define _Bool signed char # endif # endif # define bool _Bool # define false 0 # define true 1 # define __bool_true_false_are_defined 1 #endif /* make sure we have PATH_MAX */ #if HAVE_LIMITS_H # include #endif #if HAVE_SYS_PARAM # include #endif #ifndef PATH_MAX # ifndef _POSIX_PATH_MAX # ifndef MAXPATHLEN # define PATH_MAX 4096 # else # define PATH_MAX MAXPATHLEN # endif # else # define PATH_MAX _POSIX_PATH_MAX # endif #endif #if HAVE_ISO_C99 # define VARARRAY(name, type, len) type name[len] # define VARARRAY2(name, type, len1, len2) type name[len1][len2] #else # define VARARRAY(name, type, len) type *name = alloca((len)*sizeof(type)) # define VARARRAY2(name, type, len1, len2) \ type (*name)[len2] = alloca((len1)*(len2)*sizeof(type)) #endif #if 0 #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #undef malloc #undef free #undef realloc #undef calloc #undef strdup extern void *malloc_record(size_t size, const char *file, const char *func, int line); extern void *realloc_record(void *ptr, size_t size, const char *file, const char *func, int line); extern void *calloc_record(size_t nmemb, size_t size, const char *file, const char *func, int line); extern char *strdup_record(const char *string, const char *file, const char *func, int line); extern void free_record(void *ptr); #define malloc(size) malloc_record(size, __FILE__, __FUNCTION__, __LINE__) #define realloc(ptr, size) realloc_record(ptr, size, __FILE__, __FUNCTION__, __LINE__) #define calloc(nmemb, size) calloc_record(nmemb, size, __FILE__, __FUNCTION__, __LINE__) #define strdup(str) strdup_record(str, __FILE__, __FUNCTION__, __LINE__) #define free(ptr) free_record(ptr) #define OOG_NewP(size) malloc(size) #define OOG_RenewP(p, size) realloc(p, size) #define OOG_NewE(size, blah) malloc(size) #define OOG_RenewE(p, size, blah) realloc(p, size) #define OOGLFree(p) free(p) #endif #endif /* CONFIG_H_INCLUDED */ ]) ################################################################################ # # What follows was originally output from autoscan. We do some generic # checking before overiding specific stuff (ACCEPT_ARG3_TYPE) for # certain known systems. # # Checks for programs. AC_PROG_CXX if test "$CXX" = "" ; then HAVE_CXX=false AC_MSG_WARN([ Configuring without a C++ compiler (couldn't find one on your system). C++ is only used only to compile the vrml->OOGL converter, so your distribution will be compiled without it. ]) else HAVE_CXX=true fi AC_PROG_CC GEOMVIEW_ISO_C99_CHECK AC_PROG_AWK AC_PROG_INSTALL AC_PROG_CPP AC_PROG_LEX #AC_PROG_RANLIB AC_PROG_YACC #AC_DISABLE_SHARED AM_CONDITIONAL([INSTALL_LIBGEOMVIEW],[true || test "z${enable_shared}" = "zyes"]) AC_PROG_LIBTOOL # Search path for "find" executable. Use "find" unless # the bogus MS Windows version is first on the path, in # which case we use the full pathname. This AC_CHECK_PROG # macro is very strange. AC_CHECK_PROG([FIND],[find],[find],[no],,[/cygdrive/c/WINNT/system32/find]) if test "$FIND" = "no"; then AC_MSG_ERROR([No find found. Cannot continue.]) fi # Check for availability of /bin/csh for file-name globbing. Try /bin/sh # if not found. AC_PATH_PROGS(GLOB_SHELL_PATH, [csh sh], [/bin/csh]) if echo ${GLOB_SHELL_PATH} | grep csh > /dev/null 2>&1; then GLOB_SHELL="${GLOB_SHELL_PATH} -f -c " else GLOB_SHELL="${GLOB_SHELL_PATH} -c " fi AC_DEFINE_UNQUOTED([GLOB_SHELL], ["${GLOB_SHELL}"], [Define to path and arguments of shell used for file name globbing]) AC_SUBST([GLOB_SHELL]) # AC_CHECK_PROGS(PS2EPSI, ps2epsi) AC_CHECK_PROGS(EPSTOPDF, epstopdf) AC_CHECK_PROGS(PDFIMAGESPROG, pdfimages) AC_CHECK_PROGS(PNMTOPNG, pnmtopng) # For rman texture support. If not found we can only output RGB pnm images # without alpha channel. AC_CHECK_PROGS(PAMTOTIFF, pamtotiff) if test "${PAMTOTIFF}" = "pamtotiff"; then AC_DEFINE_UNQUOTED([HAVE_PAMTOTIFF], "$PAMTOTIFF", [pamtotiff program]) else AC_MSG_NOTICE([`pamtotiff' executable not found; textures in RenderMan output will not have an alpha-channel. Consider installing a newer NetPBM package.]) fi # Check for various shader language comilers; we try to compile and # install our RenderMan shaders for any of the shader compilers; I # have included only those which are free of charge. # GV_CHECK_PROG(aqsis-shader-compiler, aqsl) GV_CHECK_PROG(pixie-shader-compiler, sdrc) GV_CHECK_PROG(delight-shader-compiler, shaderdl) # Checks for libraries. AC_CHECK_LIB([m], [cos]) # Checks for header files. AC_FUNC_ALLOCA AC_HEADER_DIRENT AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([errno.h fcntl.h getopt.h inttypes.h libgen.h libintl.h \ limits.h locale.h malloc.h \ netinet/in.h stddef.h stdlib.h string.h sys/file.h sys/param.h sys/select.h \ sys/socket.h sys/systeminfo.h sys/time.h sys/types.h unistd.h io.h math.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_BIGENDIAN AC_C_CONST AC_HEADER_STDBOOL AC_C_INLINE AC_TYPE_SIZE_T AC_HEADER_TIME AC_STRUCT_TM AC_LANG_PUSH([C]) AC_MSG_CHECKING([for M_PI]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [#if HAVE_MATH_H # include #endif ], [double blah = M_PI;])], [AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_M_PI, 1, [Define to 1 if M_PI is defined])], [AC_MSG_RESULT([no])]) AC_LANG_POP([C]) AC_CHECK_TYPES([dev_t, ino_t, time_t]) AC_CHECK_SIZEOF([dev_t]) AC_CHECK_SIZEOF([ino_t]) AC_CHECK_SIZEOF([time_t]) AC_CHECK_SIZEOF([long]) AC_CHECK_SIZEOF([int]) # Checks for library functions AC_CONFIG_LIBOBJ_DIR([src/lib/aclib]) AC_FUNC_CLOSEDIR_VOID AC_FUNC_FORK AC_FUNC_MEMCMP AC_FUNC_OBSTACK #AC_FUNC_MALLOC It is ok when malloc(0) returns NULL. Why not? #AC_FUNC_REALLOC It is ok when realloc(0, 0) returns NULL. Why not? AC_FUNC_SETPGRP AC_FUNC_SETVBUF_REVERSED AC_TYPE_SIGNAL AC_FUNC_STAT AC_FUNC_LSTAT #AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK AC_FUNC_STRTOD AC_FUNC_VPRINTF AC_FUNC_WAIT3 AC_CHECK_FUNCS([fmemopen], [AC_CHECK_DECLS([fmemopen])], [AC_LIBOBJ([fmemopen])]) AC_REPLACE_FUNCS([acosh popen putenv strcasecmp strdup strncasecmp lstat stat]) AC_CHECK_DECLS([putenv, strdup, acosh, strcasecmp, strncasecmp]) AC_CHECK_FUNCS([fstat]) AC_FUNC_SELECT_ARGTYPES AC_CHECK_FUNC([select], [AC_DEFINE(HAVE_SELECT, 1, [Define to 1 if you have the `select' function.]) AC_CHECK_DECLS([select],[],[],[ #if HAVE_SYS_SELECT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_TIME_H # include #endif #if HAVE_SYS_TYPES_H # include #endif])]) AC_CHECK_DECLS([errno],[],[],[ #if HAVE_ERRNO_H # include #endif]) AC_CHECK_FUNCS([alarm basename bzero bcopy dirname dup2 floor fcntl finite \ gethostname getopt gettimeofday isascii mallinfo memset mkdir pow rint \ select sqrt strchr strcspn strdup strerror strncasecmp strpbrk \ strrchr strstr strtol strerror sysinfo waitpid wait3]) AC_CHECK_DECLS([getopt, optarg, optind, opterr, optopt],[],[]) AC_CHECK_FUNCS([setlocale], [AC_CHECK_DECLS([LC_ALL],[],[],[ #if HAVE_LOCALE_H # include #endif ])]) # # we can use AC_COMPILE, because we check later for the existence of # socket() # ################################################################################ AC_MSG_CHECKING([for Unix domain sockets]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ #if HAVE_SYS_SOCKET_H # include #endif ],[int s = socket(PF_UNIX, SOCK_STREAM, 0); ]) ],[ HAVE_UNIX_SOCKETS=yes AC_MSG_RESULT([yes]) ],[ HAVE_UNIX_SOCKETS=no AC_MSG_RESULT([no])]) ################################################################################ AC_MSG_CHECKING([for IPv4 sockets]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ #if HAVE_SYS_SOCKET_H # include #endif ],[int s = socket(PF_INET, SOCK_STREAM, 0); ]) ],[ HAVE_INET_SOCKETS=yes AC_MSG_RESULT([yes]) ],[ HAVE_INET_SOCKETS=no AC_MSG_RESULT([no])]) ################################################################################ AC_MSG_CHECKING([for IPv6 sockets]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ #if HAVE_SYS_SOCKET_H # include #endif ],[int s = socket(PF_INET6, SOCK_STREAM, 0); ]) ],[ HAVE_INET6_SOCKETS=yes AC_MSG_RESULT([yes]) ],[ HAVE_INET6_SOCKETS=no AC_MSG_RESULT([no])]) ################################################################################ if test "z${HAVE_UNIX_SOCKETS}" != "zno"\ -o "z${HAVE_INET_SOCKETS}" != "zno"\ -o "z${HAVE_INET6_SOCKETS}" != "zno"; then # # Try to figure out how to get at the "socket()" function # AC_MSG_NOTICE([Checking whether we need to link -lsocket to get socket() ...]) AC_CHECK_FUNCS([socket],[ AC_DEFINE([HAVE_SOCKET],1,[Define to 1 if you have socket()]) SOCKETLIBS= AC_MSG_RESULT([-lsocket not needed]) ],[ AC_CHECK_LIB([socket],[socket],[ AC_DEFINE([HAVE_SOCKET],1,[Define to 1 if you have socket()]) SOCKETLIBS=-lsocket AC_MSG_RESULT([-lsocket is needed]) ],[ SOCKETLIBS= HAVE_UNIX_SOCKETS=no AC_MSG_RESULT([socket() not available]) ]) ]) fi # HAVE_UNIX/INET/INET6_SOCKETS=yes ac_save_LIBS="${LIBS}" LIBS="${SOCKETLIBS} ${LIBS}" if test "z${HAVE_UNIX_SOCKETS}" != "zno"; then AC_CHECK_FUNCS([accept bind connect listen socket],[],[ SOCKETLIBS= HAVE_UNIX_SOCKETS=no]) fi LIBS="${ac_save_LIBS}" if test "z${HAVE_UNIX_SOCKETS}" != "zno"\ -o "z${HAVE_INET_SOCKETS}" != "zno"\ -o "z${HAVE_INET6_SOCKETS}" != "zno"; then # # Try to figure out what the 3rd argument of accept should be. The # third argument is an integer type, ideally it is "socklent_t". As # the third argument is a pointer, we cannot just check for a # declaration of accept() and leave the rest to the comiler: the size # of the type should match. On little-endian machines we could just # choose the largest integer type available, on big-endian machines # this would not work. Gnah. # AC_CHECK_DECLS([accept],[],[],[ #if HAVE_SYS_SOCKET_H # include #endif ]) AC_CHECK_TYPES([socklen_t],[ ACCEPT_ARG3_TYPE=socklen_t ],[ ACCEPT_ARG3_TYPE=int ],[ #if HAVE_SYS_SOCKET_H # include #endif ]) fi # HAVE_UNIX/INET/INET6_SOCKETS=yes AC_SUBST(SOCKETLIBS) if test "z${HAVE_UNIX_SOCKETS}" != "zno"; then AC_DEFINE([HAVE_UNIX_SOCKETS],1, [Define to 1 if Unix domain sockets are available]) fi if test "z${HAVE_INET_SOCKETS}" != "zno"; then AC_DEFINE([HAVE_INET_SOCKETS],1, [Define to 1 if IPv4 sockets are available]) fi if test "z${HAVE_INET6_SOCKETS}" != "zno"; then AC_DEFINE([HAVE_INET6_SOCKETS],1, [Define to 1 if IPv6 sockets are available]) fi # # End autoscan stuff. # ################################################################################ # The following vars contain info about the local system: # (AC_CANONICAL_TARGET([]) sets them) # var value on RedHat 6.1 # --- ------------------- # build i686-pc-linux-gnu # host i686-pc-linux-gnu # target i686-pc-linux-gnu # build_alias i686-pc-linux-gnu # host_alias i686-pc-linux-gnu # target_alias i686-pc-linux-gnu # build_cpu i686 # build_vendor pc # build_os linux-gnu # host_cpu i686 # host_vendor pc # host_os linux-gnu # target_cpu i686 # target_vendor pc # target_os linux-gnu case "$target" in *linux*) MACHTYPE=`echo ${target}|sed 's/unknown/pc/g'` ;; *irix*) MACHTYPE="${target}" AC_DEFINE(sgi, 1, [Define to 1 if we are compiling for sgi]) if test "$CC" = "cc" ; then CFLAGS="$CFLAGS -float" LIBS="$LIBS -lmalloc" fi ;; *darwin*) MACHTYPE="${target}" AC_DEFINE(unix, 1, [Define to 1 since we are compiling for unix]) ;; *rs6000*) MACHTYPE="${target}" AC_DEFINE(AIX, 1, [Define to 1 if we are compiling for AIX]) ACCEPT_ARG3_TYPE="unsigned long" AC_DEFINE(unix, 1, [Define to 1 if we are compiling for unix???]) ;; *) MACHTYPE="${target}" ;; esac AC_DEFINE_UNQUOTED(MACHTYPE, "$MACHTYPE",[Define to the machine type]) AC_SUBST(MACHTYPE) AC_DEFINE_UNQUOTED(ACCEPT_ARG3_TYPE, $ACCEPT_ARG3_TYPE,[ ACCEPT_ARG3_TYPE should be the datatype of the 3rd arg to the 'accept' system call. It's 'int' on some systems, 'unsigned long' on some, and could be something else on others. Default to int]) # Search for necessary programs. AC_ARG_WITH(htmlbrowser, AC_HELP_STRING([--with-htmlbrowser=BROWSER], [Use BROWSER for viewing the HTML version of the manual when the `Manual (HTML)' menu item is selected. This setting can be changed at runtime through the '(ui-html-browser BROWSER)' GCL-command. (default: firefox)]), [DFLTHTMLBROWSER="${withval}"], [DFLTHTMLBROWSER="firefox"]) AC_DEFINE_UNQUOTED(DFLTHTMLBROWSER, ["${DFLTHTMLBROWSER}"], [Define to the name of the html browser for online viewing of the HTML manual.]) AC_CHECK_PROGS(HTMLBROWSER, ${DFLTHTMLBROWSER}) if ! test "${HTMLBROWSER}" = "${DFLTHTMLBROWSER}"; then AC_MSG_NOTICE([HTML browser executable not found, online viewing of the HTML manual will probably not be possible.]) fi AC_ARG_WITH(pdfviewer, AC_HELP_STRING([--with-pdfviewer=VIEWER], [Use BROWSER for viewing the PDF version of the manual when the `Manual (PDF)' menu item is selected. This setting can be changed at runtime through the '(ui-pdf-viewer VIEWER)' GCL-command. (default: xpdf)]), [DFLTPDFVIEWER="${withval}"], [DFLTPDFVIEWER="xpdf"]) AC_DEFINE_UNQUOTED(DFLTPDFVIEWER, ["${DFLTPDFVIEWER}"], [Define to the name of the html browser for online viewing of the PDF manual.]) AC_CHECK_PROGS(PDFVIEWER, ${DFLTPDFVIEWER}) if ! test "${PDFVIEWER}" = "${DFLTPDFVIEWER}"; then AC_MSG_NOTICE([PDF viewr executable not found, online viewing of the PDF manual will probably not be possible.]) fi ######################################################################## ######################################################################## ######################################################################## # If --with-motif=DIR was specified, set MOTIF_DIR to DIR AC_ARG_WITH(motif, AC_HELP_STRING([--with-motif=DIR], [Set DIR to motif installation prefix. It is not possible to compile Geomview without Motif.]), [MOTIF_DIR=$withval]) AC_ARG_WITH(opengl, AC_HELP_STRING([--with-opengl=DIR], [Set DIR to opengl installation prefix. OpenGL is optional. The default is to auto-detect OpenGL and use it if available. Use `--without-opengl' to disable OpenGL.]), [OPENGL_DIR=$withval]) ######################################################################## # # Store X library link line in XLIBS # AC_PATH_XTRA XLIBS="$X_LIBS $X_PRE_LIBS -lXt -lXext -lX11 $X_EXTRA_LIBS" AC_SUBST(XLIBS) AC_CACHE_VAL(ac_cv_XLIBS,[ac_cv_XLIBS="XLIBS='$XLIBS'"]) ######################################################################## AC_MSG_CHECKING([for Xmu]) result="no" GEOM_FIND_L_OPTION(-lXmu, XmuLookupStandardColormap, ["" "$x_libraries" "$MOTIF_DIR/lib"], $XLIBS) if test "$GEOM_L_OPTION" != "0" ; then result="yes" AC_DEFINE(HAVE_XMU, 1, [Does -lXmu exist on this system?]) if test "$GEOM_L_OPTION" != "" ; then XMULIBS="$GEOM_L_OPTION -lXmu" else XMULIBS="-lXmu" fi fi AC_SUBST(XMULIBS) AC_MSG_RESULT([$result]) ######################################################################## AC_MSG_CHECKING([for motif]) if test "$MOTIF_DIR" != "" ; then USER_MOTIF_DIR="$MOTIF_DIR/include" else USER_MOTIF_DIR="" fi GEOM_FIND_I_OPTION(Xm/Xm.h, ["$USER_MOTIF_DIR" "" "$x_includes" "/usr/local/include"]) if test "$GEOM_I_OPTION" = "0" ; then AC_MSG_ERROR([ Can't find Motif header file Xm/Xm.h. Geomview requires Motif (or Lesstif). See the file INSTALL.Geomview for details. ]) fi MOTIFINCLUDE=$GEOM_I_OPTION AC_SUBST(MOTIFINCLUDE) ######################################################################## if test "$MOTIFLIBS" = "" ; then MOTIFLIBS="-lXm" fi if test "$MOTIF_DIR" != "" ; then USER_MOTIF_DIR="$MOTIF_DIR/lib" else USER_MOTIF_DIR="" fi GEOM_FIND_L_OPTION($MOTIFLIBS, XmCreateForm, ["$USER_MOTIF_DIR" "" "$x_libraries" "/usr/local/lib"], $XLIBS ) if test "$GEOM_L_OPTION" = "0" ; then AC_MSG_ERROR([ Can't find Motif libraries. Geomview requires Motif (or Lesstif). See the file INSTALL.Geomview for details. ]) fi MOTIF_L_OPTION=$GEOM_L_OPTION MOTIFLIBS="$GEOM_L_OPTION $MOTIFLIBS" AC_SUBST(MOTIFLIBS) AC_MSG_RESULT([headers $MOTIFINCLUDE, libraries $MOTIFLIBS]) ######################################################################## if test "z${OPENGL_DIR}" != "zno"; then AC_MSG_CHECKING([for opengl]) if test "$OPENGL_DIR" != "" ; then USER_OPENGL_DIR="$OPENGL_DIR/include" else USER_OPENGL_DIR="" fi GEOM_FIND_I_OPTION(GL/gl.h, ["$USER_OPENGL_DIR" "" "/usr/local/include"]) if test "$GEOM_I_OPTION" = "0" ; then AC_MSG_WARN([ Can't find OpenGL header file GL/gl.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. ]) OPENGLINCLUDE="" # $GEOM_I_OPTION fi GL_I_OPTION=$GEOM_I_OPTION # Geomview does not require OpenGL, _BUT_ an OpenGL implementation # through the X11 GLX extension; so check for glx.h as well. # # GEOM_FIND_I_OPTION(GL/glx.h, ["$USER_OPENGL_DIR" "" "/usr/local/include"]) if test "$GEOM_I_OPTION" = "0" ; then AC_MSG_WARN([ Can't find OpenGL header file GL/glx.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. ]) GL_I_OPTION=0 else GL_I_OPTION="${GL_I_OPTION} ${GEOM_I_OPTION}" OPENGLINCLUDE="${OPENGLINCLUDE} ${GEOM_I_OPTION}" fi ######################################################################## if test "$OPENGL_DIR" != "" ; then USER_OPENGL_DIR="$OPENGL_DIR/lib" else USER_OPENGL_DIR="" fi GEOM_FIND_L_OPTION(-lGL, glBegin, ["$USER_OPENGL_DIR" "" "$x_libraries" "/usr/local/lib"], "$XLIBS -lm") if test "$GEOM_L_OPTION" = "0" ; then AC_MSG_WARN([ Can't find OpenGL header file GL/gl.h. Geomview does not require OpenGL but you will have to live without hardware accellerated rendering. See the file INSTALL.Geomview for details. ]) fi GL_L_OPTION=$GEOM_L_OPTION GEOM_FIND_L_OPTION(-lGLU, gluBeginPolygon, ["$USER_OPENGL_DIR" "" "$x_libraries" "/usr/local/lib"], "$GL_L_OPTION -lGL $XLIBS -lm") if test "$GEOM_L_OPTION" != "$GL_L_OPTION" ; then GLU_L_OPTION=$GEOM_L_OPTION else GLU_L_OPTION="" fi if test "z${GLU_L_OPTION}" = "z0"; then AC_MSG_RESULT([libGLU not found. libGLU is required to render non-flat or concave polygons.]) OPENGLLIBS="$GL_L_OPTION -lGL" AC_DEFINE([HAVE_LIBGLU], 0, [Define to 1 if you have libGLU]) else OPENGLLIBS="$GL_L_OPTION -lGL $GLU_L_OPTION -lGLU" AC_DEFINE([HAVE_LIBGLU], 1, [Define to 1 if you have libGLU]) fi AC_MSG_RESULT([headers $OPENGLINCLUDE, libraries $OPENGLLIBS]) ############################################################################# # Check for the OSMesa library which can be used for high quality # off-screen snapshots, including texture. This is beneficial over # making a snapshot of a window, because the latter only works when # the window is mapped and not obscured by other windows. However, # this can only work if libGL is indeed based on Mesa because # libOSMesa overrides the OpenGL API entries. ### ### unluckily, this just does not seem to work. Sad story. Disable the ### stuff. The good news: we can use glXCreateGLXPixmap() and render ### into that pixmap. ### # ac_gv_save_LIBS="${LIBS}" # LIBS="${OPENGLLIBS} ${XLIBS} ${LIBS}" # AC_CHECK_FUNCS([glXAllocateMemoryMESA],[MESAGL=1],[MESAGL=0]) # if test "${MESAGL}" = "1"; then # AC_CHECK_LIB([OSMesa], [OSMesaCreateContext], # [OPENGLLIBS="$GL_L_OPTION -lOSMesa -lGL $GLU_L_OPTION -lGLU"], # [],[${OPENGLLIBS}]) # fi # LIBS="${ac_gv_save_LIBS}" MESAGL=0 AC_DEFINE_UNQUOTED([MESAGL],${MESAGL}, [Define to 1 if your are using the Mesa OpenGL implementation]) AC_SUBST(MESAGL) # Even without libOSMesa it is possible to generate off-screen snapshots # by using glXCrateGLXPixmap(). ac_gv_save_LIBS="${LIBS}" LIBS="${OPENGLLIBS} ${XLIBS} ${LIBS}" AC_CHECK_FUNCS([glXCreateGLXPixmap]) LIBS="${ac_gv_save_LIBS}" fi # without-opengl # # substitute, even if empty # AC_SUBST(OPENGLLIBS) AC_SUBST(OPENGLINCLUDE) # # MGX11 is always defined, does not hurt to include it in the library. # if test "z${GL_I_OPTION}" != "z0" && \ test "z${GL_L_OPTION}" != "z0" && \ test "z${OPENGL_DIR}" != "zno"; then MGOPENGL=1 MGX11=1 else MGOPENGL=0 MGX11=1 fi MGGL=0 AM_CONDITIONAL([MGOPENGL],[test "${MGOPENGL}" = 1]) AC_DEFINE_UNQUOTED([MGOPENGL],${MGOPENGL}, [Define to 1 if OpenGL (or Mesa or anything equivalent) is available and should be used for rendering]) AM_CONDITIONAL([MGX11],[test "${MGX11}" = 1]) AC_DEFINE_UNQUOTED([MGX11],${MGX11}, [Define to 1 if all rendering should be performed through the X library (i.e. no accelerated 3D rendering, no textures)]) AM_CONDITIONAL([MGGL],[test "${MGGL}" = 1]) AC_DEFINE_UNQUOTED([MGGL],${MGGL}, [Leave this at 0]) ######################################################################## # Check for zlib (and maybe bzlib? (image compression/decompression)) #GEOMVIEW_CHECK_PACKAGE([bz2lib],[bz2],[],[],[bzlib.h],[],[],[optional enabled]) GEOMVIEW_CHECK_PACKAGE([zlib],[z],[],[],[zlib.h],[],[],[optional enabled]) gv_ac_save_LIBS="${LIBS}" LIBS="${LIBS} ${ZLIB_ALL_LIB}" AC_CHECK_FUNCS([compressBound]) # pre-1.2 zlib? LIBS="${gv_ac_save_LIBS}" ######################################################################## OPENGL_LD_LIBRARY_PATH=`expr "$GL_L_OPTION" : '-L\(.*\)'` MOTIF_LD_LIBRARY_PATH=`expr "$MOTIF_L_OPTION" : '-L\(.*\)'` if test "$OPENGL_LD_LIBRARY_PATH" != "0" ; then LOCAL_LD_LIBRARY_PATH=$OPENGL_LD_LIBRARY_PATH fi if test "$MOTIF_LD_LIBRARY_PATH" != "0" ; then if test "$LOCAL_LD_LIBRARY_PATH" != "" ; then LOCAL_LD_LIBRARY_PATH="$LOCAL_LD_LIBRARY_PATH:$MOTIF_LD_LIBRARY_PATH" else LOCAL_LD_LIBRARY_PATH="$MOTIF_LD_LIBRARY_PATH" fi fi if test "$LOCAL_LD_LIBRARY_PATH" != "" ; then LD_LIBRARY_PATH_SETTINGS="LD_LIBRARY_PATH=$LOCAL_LD_LIBRARY_PATH" AC_SUBST(LD_LIBRARY_PATH_SETTINGS) fi ######################################################################## ######################################################################## ######################################################################## AC_ARG_ENABLE(d1debug, [ --enable-d1debug turn on D1 level debugging output], [ if test "$enableval" != "no" ; then AC_DEFINE(D1_DEBUG, 1) fi ], [AC_DEFINE(D1_DEBUG, 0, [D1 debugging?])] ) AC_ARG_ENABLE([motion-averaging], AC_HELP_STRING([--enable-motion-averaging], [turn on experimental motion averaging (default is off)]), [if test "$enableval" = "no" ; then AC_DEFINE(EXPERIMENTAL_MOTION_AVERAGING, 0, [Use experimental motion averaging code?]) else AC_DEFINE(EXPERIMENTAL_MOTION_AVERAGING, 1) fi], [AC_DEFINE(EXPERIMENTAL_MOTION_AVERAGING, 0)]) dnl AC_ARG_ENABLE([bezier-spheres], dnl AC_HELP_STRING([--disable-bezier-spheres],[Use a mesh based on a polar dnl co-ordinate system instead of using Bezier-splines to approximate a sphere. dnl This simplifies drawing textured spheres if the texture co-ordinates live dnl in a polar co-ordinate system, e.g. when trying to paste a world-map onto dnl a sphere. (default: use Bezier splines)]), dnl [case "$enableval" in dnl yes) BEZIER_SPHERES=1 ;; dnl no) BEZIER_SPHERES=0 ;; dnl *) AC_MSG_ERROR([--disable-bezier-spheres does not take any arguments beside "yes" and "no"]) ;; dnl esac], dnl [BEZIER_SPHERES=1]) BEZIER_SPHERES=0 AM_CONDITIONAL([BEZIER_SPHERES],[test "${BEZIER_SPHERES}" = 1]) AC_DEFINE_UNQUOTED([BEZIER_SPHERES], [${BEZIER_SPHERES}], [Define to 0 to use polar meshes for drawing of spheres]) ######################################################################## ######################################################################## ######################################################################## AC_LANG_PUSH([C]) AC_MSG_CHECKING( [whether popen(CMD, MODE) needs/accepts MODE = "rb" for binary files]) AC_RUN_IFELSE( [AC_LANG_PROGRAM( [#include ], [FILE *pipe = popen("${SHELL}", "rb"); if (pipe == NULL) return 1; else return 0;])],[AC_MSG_RESULT([yes]) AC_DEFINE(POPEN_ACCEPTS_RB, 1, [Define to 1 if popen(CMD, MODE) accepts "rb" for MODE])], [AC_MSG_RESULT([no])]) AC_LANG_POP([C]) AM_CONDITIONAL(HAVE_CXX, test x$HAVE_CXX = xtrue) ######################################################################## dnl docdir='${datarootdir}/doc/${PACKAGE_TARNAME}-${PACKAGE_VERSION}' AC_SUBST(docdir) AC_DEFINE_UNQUOTED(DOCDIR, ["`eval eval echo ${docdir}`"], ["Define to the root of the Geomview documentation"]) moduledir="\$(libexecdir)/geomview" AC_SUBST(moduledir) geomdatadir="\$(datadir)/geomview" AC_SUBST(geomdatadir) ######################################################################## top_geom_builddir='$(top_builddir)' AC_SUBST(top_geom_builddir) OOGLLIBS="\$(top_geom_builddir)/src/lib/oogl/wa/libwa.la \ \$(top_geom_builddir)/src/lib/camera/libcamera.la \ \$(top_geom_builddir)/src/lib/color/libcolor.la \ \$(top_geom_builddir)/src/lib/fexpr/libfexpr.la \ \$(top_geom_builddir)/src/lib/geomutil/bdy/libbdy.la \ \$(top_geom_builddir)/src/lib/geomutil/crayplutil/libcrayplutil.la \ \$(top_geom_builddir)/src/lib/geomutil/dim/libdim.la \ \$(top_geom_builddir)/src/lib/geomutil/plutil/libplutil.la \ \$(top_geom_builddir)/src/lib/gprim/bbox/libbbox.la \ \$(top_geom_builddir)/src/lib/gprim/bezier/libbezier.la \ \$(top_geom_builddir)/src/lib/gprim/comment/libcomment.la \ \$(top_geom_builddir)/src/lib/gprim/discgrp/libdg.la \ \$(top_geom_builddir)/src/lib/gprim/geom/libgeom.la \ \$(top_geom_builddir)/src/lib/gprim/inst/libinst.la \ \$(top_geom_builddir)/src/lib/gprim/lincoln/liblincoln.la \ \$(top_geom_builddir)/src/lib/gprim/list/liblist.la \ \$(top_geom_builddir)/src/lib/gprim/mesh/libmesh.la \ \$(top_geom_builddir)/src/lib/gprim/ndmesh/libndmesh.la \ \$(top_geom_builddir)/src/lib/gprim/npolylist/libnpolylist.la \ \$(top_geom_builddir)/src/lib/gprim/polylist/libpolylist.la \ \$(top_geom_builddir)/src/lib/gprim/quad/libquad.la \ \$(top_geom_builddir)/src/lib/gprim/skel/libskel.la \ \$(top_geom_builddir)/src/lib/gprim/sphere/libsphere.la \ \$(top_geom_builddir)/src/lib/gprim/tlist/libtlist.la \ \$(top_geom_builddir)/src/lib/gprim/vect/libvect.la \ \$(top_geom_builddir)/src/lib/mg/buf/liblibmgbuf.la \ \$(top_geom_builddir)/src/lib/mg/common/libmgcommon.la \ \$(top_geom_builddir)/src/lib/mg/ps/libmgps.la \ \$(top_geom_builddir)/src/lib/mg/rib/libmgrib.la \ \$(top_geom_builddir)/src/lib/pointlist/libpointlist.la \ \$(top_geom_builddir)/src/lib/shade/libshade.la \ \$(top_geom_builddir)/src/lib/window/libwindow.la \ \$(top_geom_builddir)/src/lib/geometry/cmodel/libcmodel.la \ \$(top_geom_builddir)/src/lib/geometry/point3/libpoint3.la \ \$(top_geom_builddir)/src/lib/geometry/transform3/libtransform3.la \ \$(top_geom_builddir)/src/lib/geometry/transformn/libtransformn.la \ \$(top_geom_builddir)/src/lib/geometry/transobj/libtransobj.la \ \$(top_geom_builddir)/src/lib/geometry/ntransobj/libntransobj.la \ \$(top_geom_builddir)/src/lib/oogl/lisp/liblisp.la \ \$(top_geom_builddir)/src/lib/oogl/refcomm/librefcomm.la \ \$(top_geom_builddir)/src/lib/oogl/util/libooglutil.la \ \$(top_geom_builddir)/src/lib/aclib/libacgeomview.la" if test "z${MGOPENGL}" = "z1"; then OOGLLIBS="${OOGLLIBS} \$(top_geom_builddir)/src/lib/mg/opengl/libmgopengl.la" fi if test "z${MGX11}" = "z1"; then OOGLLIBS="${OOGLLIBS} \$(top_geom_builddir)/src/lib/mg/x11/libmgx11.la" fi AC_CACHE_VAL(ac_cv_OOGLLIBS,[ac_cv_OOGLLIBS="OOGLLIBS='$OOGLLIBS'"]) AC_SUBST(OOGLLIBS) OOGLLIB='$(top_geom_builddir)/src/lib/libgeomview.la' AC_CACHE_VAL(ac_cv_OOGLLIB, [ac_cv_OOGLLIB="OOGLLIB='$OOGLLIB'"]) AC_SUBST(OOGLLIB) MOTIFUILIB='$(top_geom_builddir)/src/lib/mib/libmib.a' AC_CACHE_VAL(ac_cv_MOTIFUILIB, [ac_cv_MOTIFUILIB="MOTIFUILIB='$MOTIFUILIB'"]) AC_SUBST(MOTIFUILIB) STUBLIB="\$(top_builddir)/src/lib/gprim/stub/libstub.la" AC_SUBST(STUBLIB) ######################################################################## LF_LINK_HEADERS(src/lib/aclib \ src/lib/oogl/lisp \ src/lib/oogl/refcomm \ src/lib/oogl/util \ src/lib/oogl/wa \ src/lib/geometry/ \ src/lib/geometry/cmodel \ src/lib/geometry/hpoint3 \ src/lib/geometry/hpointn \ src/lib/geometry/point3 \ src/lib/geometry/transform3 \ src/lib/geometry/transformn \ src/lib/geometry/transobj \ src/lib/geometry/ntransobj \ src/lib/camera \ src/lib/color \ src/lib/fexpr \ src/lib/geomutil/bdy \ src/lib/geomutil/crayplutil \ src/lib/geomutil/dim \ src/lib/geomutil/plutil \ src/lib/gprim/bbox \ src/lib/gprim/bezier \ src/lib/gprim/comment \ src/lib/gprim/discgrp \ src/lib/gprim/geom \ src/lib/gprim/inst \ src/lib/gprim/lincoln \ src/lib/gprim/list \ src/lib/gprim/mesh \ src/lib/gprim/polylist \ src/lib/gprim/ndmesh \ src/lib/gprim/npolylist \ src/lib/gprim/quad \ src/lib/gprim/skel \ src/lib/gprim/sphere \ src/lib/gprim/stub \ src/lib/gprim/tlist \ src/lib/gprim/vect \ src/lib/mg/buf \ src/lib/mg/common \ src/lib/mg/opengl \ src/lib/mg/x11 \ src/lib/mg/ps \ src/lib/mg/rib \ src/lib/mib \ src/lib/pointlist \ src/lib/shade \ src/lib/window \ src/lib/forms \ src/bin/geomview/common \ ) LF_SET_INCLUDES AC_CONFIG_FILES([Makefile data/Makefile data/shaders/Makefile doc/Makefile src/Makefile src/lib/Makefile src/lib/aclib/Makefile src/lib/camera/Makefile src/lib/color/Makefile src/lib/fexpr/Makefile src/lib/oogl/Makefile src/lib/oogl/lisp/Makefile src/lib/oogl/refcomm/Makefile src/lib/oogl/util/Makefile src/lib/oogl/wa/Makefile src/lib/geometry/Makefile src/lib/geometry/cmodel/Makefile src/lib/geometry/hpoint3/Makefile src/lib/geometry/hpointn/Makefile src/lib/geometry/point3/Makefile src/lib/geometry/transform3/Makefile src/lib/geometry/transformn/Makefile src/lib/geometry/transobj/Makefile src/lib/geometry/ntransobj/Makefile src/lib/geomutil/Makefile src/lib/geomutil/bdy/Makefile src/lib/geomutil/crayplutil/Makefile src/lib/geomutil/dim/Makefile src/lib/geomutil/plutil/Makefile src/lib/gprim/Makefile src/lib/gprim/bbox/Makefile src/lib/gprim/bezier/Makefile src/lib/gprim/comment/Makefile src/lib/gprim/discgrp/Makefile src/lib/gprim/geom/Makefile src/lib/gprim/inst/Makefile src/lib/gprim/lincoln/Makefile src/lib/gprim/list/Makefile src/lib/gprim/mesh/Makefile src/lib/gprim/polylist/Makefile src/lib/gprim/ndmesh/Makefile src/lib/gprim/npolylist/Makefile src/lib/gprim/quad/Makefile src/lib/gprim/skel/Makefile src/lib/gprim/sphere/Makefile src/lib/gprim/stub/Makefile src/lib/gprim/tlist/Makefile src/lib/gprim/vect/Makefile src/lib/mg/Makefile src/lib/mg/buf/Makefile src/lib/mg/common/Makefile src/lib/mg/opengl/Makefile src/lib/mg/x11/Makefile src/lib/mg/ps/Makefile src/lib/mg/rib/Makefile src/lib/mib/Makefile src/lib/pointlist/Makefile src/lib/shade/Makefile src/lib/window/Makefile src/lib/forms/Makefile src/bin/Makefile src/bin/geomview/Makefile src/bin/geomview/common/Makefile src/bin/geomview/x11/Makefile src/bin/geomview/x11/bitmaps/Makefile src/bin/geomview/x11/interface/Makefile src/bin/animate/Makefile src/bin/animate/interface/Makefile src/bin/clipboard/Makefile src/bin/gvclock/gvclock src/bin/gvclock/Makefile src/bin/geomutil/Makefile src/bin/geomutil/bdy/Makefile src/bin/geomutil/clip/Makefile src/bin/geomutil/hvectext/Makefile src/bin/geomutil/hvectext/hvectext src/bin/geomutil/maple2oogl/Makefile src/bin/geomutil/math2oogl/Makefile src/bin/geomutil/oogl2rib/Makefile src/bin/geomutil/oogl2vrml/Makefile src/bin/geomutil/plutil/Makefile src/bin/geomutil/ucd/Makefile src/bin/geomutil/vrml2oogl/Makefile src/bin/geomutil/vrml2oogl/lib/Makefile src/bin/nose/Makefile src/bin/togeomview/Makefile ]) AC_OUTPUT geomview-1.9.4/INSTALL.Geomview0000644000175000001440000001527510613447223013112 00000000000000 $Id: INSTALL.Geomview,v 1.17 2007/04/24 11:11:17 rotdrop Exp $ Instructions for using Geomview's `configure' script Geomview uses the GNU autoconf configuration system. The way to configure and compile Geomview is the same as with any piece of GNU-style software: ./configure make make install Once `make' completes you can run Geomview without doing `make install' by running the script `geomview' in the top-level directory. In order for this to work you'll need to be in that directory. The `reconf' script in the top-level directory will regenerate the `configure' script, using autoreconf, part of the autoconf system. This is useful if no useful `configure' script is already present, which is normal only for copies of Geomview that have been taken directly from developer CVS. See the `README.cvs' textfile for hints on building Geomview from developer CVS. The default installation prefix for Geomview is no longer `/usr/local/Geomview/', but just `/usr/local/'. The directory layout below the prefix follows the conventions of any other GNU package: binaries below `PREFIX/bin/', data below `PREFIX/share/geomview/', executable code below `PREFIX/libexec/geomview/' (here live the modules). The documentation is installed below `PREFIX/share/doc/geomview-VERSION/'. See the file `INSTALL' for generic installation instructions. Geomview requires Motif and benefits from OpenGL; you need to make sure Motif is installed on your system before you can compile (or run) Geomview. Both of these are commercial software packages but Geomview will also work with their free counterparts Lesstif or OpenMotif (www.lesstif.org or www.openmotif.org) and Mesa (www.mesa3d.org) [But Linux users see the comments in the 'Linux' section below about Lesstif/OpenMotif.] If either of these is installed on your system in a directory that your compiler doesn't look in by default, you can use the following options to Geomview's configure script to tell Geomview where to find them: --with-opengl=DIR You can use this option if the OpenGL header files and libraries on your system are installed in some place that your compiler doesn't recognize by default. This option specifies that OpenGL (or Mesa) is installed on your system in the directory DIR. DIR should have a subdirectory called `include' which has the GL header files, and a subdirectory called `lib' which has the library files in it. You don't need this option if your compiler can find the OpenGL header files and libraries in the standard places that it looks. If you're not sure about this option, try configuring without it. 'configure' will abort with an error if your compiler can't find the appropriate header files and libraries. You can use `--without-opengl' or `--with-opengl=no' to disable the use of OpenGL. --with-motif=DIR You can use this option if the Motif header files and libraries on your system are installed in some place that your compiler doesn't recognize by default. This option specifies that Motif is installed on your system in the directory DIR. DIR should have a subdirectory called `include' which has the Motif header files, and a subdirectory called `lib' which has the library files in it. You don't need this option if your compiler can find the Motif header files and libraries in the standard places that it looks. If you're not sure about this option, try configuring without it. 'configure' will abort with an error if your compiler can't find the appropriate header files and libraries. You can use evironment variables to override various default settings in 'configure' (such as which compiler to use and which options to pass to it). There are many such variables that are generic to all GNU autoconf 'configure' scripts; see the file INSTALL for details on this. In addition to these generic settings, the following variables are specific to Geomview: MOTIFLIBS '-l' options to pass to the linker for linking with the Motif libaraies. Defaults to "-lXm", but some versions of Motif apparently need additional libararies, such as '-lXp'. To specify this, do MOTIFLIBS='-lXm -lXp' ./configure Note that MOTIFLIBS should NOT include any -L options to specify the location of the libraries; use the --with-motif configure argument for that. The MOTIFLIBS variable is just for specifying the list of libraries themselves. ======================================================================== PLATFORM SPECIFIC NOTES: LinuxPPC -------- On at least one LinuxPPC system with MetroX it was necessary to specify -lXp when linking with the Motif libraries ("MOTIFLIBS='-lXm -lXp' ./configure"). Solaris ------- On the Solaris 2.6 system that I tested, the 'example' external module in 'src/bin/example' failed to link because of an error of the form ld: warning: relocation error: R_SPARC_32: file main.o: symbol .LLC1: external symbolic relocation against non-allocatable section .stab; cannot be processed at runtime: relocation ignored Undefined first referenced symbol in file .LLC1 main.o This was when using GNU gcc to compile and Sun's ld to link, and I believe this error may be due to an incompatibility between these two programs, or at least the versions that were on this system. If this happens to you, you can build with "make -k" to force "make" to continue building the rest of the distribution in spite of this error. The only thing you'll be missing is this one external module, which isn't necessary for Geomview itself. If you find a way to fix this problem, let me [mbp@geomtech.com] know. IRIX ---- Older IRIX systems may require compiling with -XSVR4. This flag had disappeared by IRIX 5.3, so you're unlikely to run into this. On the IRIX 6.3 system that I tested (using CC=cc), the linker crashed when trying to link several of the external modules. I suspect it may be due to a broken compiler installation on that particular machine, but I'm not sure. I'll try to get access to a more recent IRIX installation soon and will check it out more. In the meantime, if you compile Geomview on IRIX and run into any problems, please let me [mbp@geomtech.com] know. Cygwin and various older Unix-like system ----------------------------------------- Nowadays Xorg installs itself using the usual directory layout below a PREFIX path, just like many other GNU packages. Former version installed themselves below PFX/X11R (e.g. /usr/X11R6). In this case, the following switches are needed: ./configure --with-motif=/usr/X11R6 --with-opengl=/usr/X11R6 OTHERSWICHES geomview-1.9.4/config.guess0000755000175000001440000013010610665240507012612 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2007-01-15' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown if [ "${UNAME_SYSTEM}" = "Linux" ] ; then eval $set_cc_for_build cat << EOF > $dummy.c #include #ifdef __UCLIBC__ # ifdef __UCLIBC_CONFIG_VERSION__ LIBC=uclibc __UCLIBC_CONFIG_VERSION__ # else LIBC=uclibc # endif #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep LIBC= | sed -e 's: ::g'` fi # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; x86:Interix*:[3456]*) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T:Interix*:[3456]* | authenticamd:Interix*:[3456]*) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo cris-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo frv-unknown-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-${LIBC} exit ;; xtensa:Linux:*:*) echo xtensa-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-${LIBC}" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-${LIBC}aout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-${LIBC}coff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-${LIBC}oldld" exit ;; esac # This should get integrated into the C code below, but now we hack if [ "$LIBC" != "gnu" ] ; then echo "$TENTATIVE" && exit 0 ; fi # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: geomview-1.9.4/install-sh0000755000175000001440000003160010665240474012300 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2006-10-14.15 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" posix_glob= posix_mkdir= # Desired mode of installed file. mode=0755 chmodcmd=$chmodprog chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) mode=$2 shift shift case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac done if test $# -ne 0 && test -z "$dir_arg$dstarg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix=/ ;; -*) prefix=./ ;; *) prefix= ;; esac case $posix_glob in '') if (set -f) 2>/dev/null; then posix_glob=true else posix_glob=false fi ;; esac oIFS=$IFS IFS=/ $posix_glob && set -f set fnord $dstdir shift $posix_glob && set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dst"; then $doit $rmcmd -f "$dst" 2>/dev/null \ || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } } || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: geomview-1.9.4/config.sub0000755000175000001440000010024310665240507012254 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2007-01-18' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx | dvp \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[24]a*eb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]a*eb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mipsEE* | ee | ps2) basic_machine=mips64r5900el-scei case $os in -linux*) ;; *) os=-elf ;; esac ;; iop) basic_machine=mipsel-scei os=-irx ;; dvp) basic_machine=dvp-scei os=-elf ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -irx*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: geomview-1.9.4/missing0000755000175000001440000002557710665240474011713 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2006-05-10.23 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case $1 in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $1 in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: geomview-1.9.4/mkinstalldirs0000755000175000001440000000664710665240507013114 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2006-05-11.19 # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" errstatus=0 dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue pathcomp=$pathcomp$d case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr= chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp=$pathcomp/ done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: geomview-1.9.4/Makefile.am0000644000175000001440000000243610615644130012325 00000000000000ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src data doc EXTRA_DIST = reconf geomview.sh INSTALL.Geomview mkmodulesdir noinst_SCRIPTS = geomview nodist_pkginclude_HEADERS = @GEOMVIEWHDRFILES@ pkgincludeprivdir = ${pkgincludedir}/private nodist_pkgincludepriv_HEADERS = @GEOMVIEWPRIVHDRFILES@ EXTRA_HEADERS = geomview: geomview.sh Makefile echo top_builddir is $(abs_top_builddir) sed -e 's|%GEOMROOT%|$(abs_top_srcdir)|g' \ -e 's|%GEOMVIEW_GVX%|$(abs_top_builddir)/src/bin/geomview/x11/gvx|g' \ -e 's|%GEOMVIEW_LTGVX%|$(abs_top_builddir)/src/bin/geomview/x11/.libs/lt-gvx|g' \ -e 's|%MACHTYPE%|$(MACHTYPE)|g' \ -e 's|%GEOMDATA%|$(abs_top_srcdir)/data|g' \ -e 's|%MODULESDIR%|$(abs_top_builddir)/modules|g' \ -e "s|%LD_LIBRARY_PATH_SETTINGS%|$(LD_LIBRARY_PATH_SETTINGS)|g" \ -e "s|%GEOMVIEW_LIB%|$(libdir)|g" \ -e "s|%GEOMVIEW_INCLUDE%|$(pkgincludedir)|g" \ -e "s|%PACKAGE_VERSION%|$(PACKAGE_VERSION)|g" \ -e "s|%GEOMDOCDIR%|$(abs_top_builddir)/doc|g" \ < $(top_srcdir)/geomview.sh > geomview chmod +x geomview DISTCLEANFILES = geomview distclean-local: rm -rf include modules find . -name "*~" -exec rm -f \{\} \; MAINTAINERCLEANFILES = \ configure config.guess config.h.in config.sub depcomp geomview*.tar.* \ install-sh missing INSTALL aclocal.m4 geomview-1.9.4/Makefile.in0000644000175000001440000006141310665240507012343 00000000000000# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ config.guess config.sub depcomp install-sh ltmain.sh missing \ mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/check-package.m4 \ $(top_srcdir)/m4/frameworks.m4 $(top_srcdir)/m4/geom_local.m4 \ $(top_srcdir)/m4/iso-c99.m4 $(top_srcdir)/m4/lf_local.m4 \ $(top_srcdir)/m4/set-prefix.m4 $(top_srcdir)/m4/withtool.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = SCRIPTS = $(noinst_SCRIPTS) SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(pkgincludedir)" \ "$(DESTDIR)$(pkgincludeprivdir)" nodist_pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER) nodist_pkgincludeprivHEADERS_INSTALL = $(INSTALL_HEADER) HEADERS = $(nodist_pkginclude_HEADERS) \ $(nodist_pkgincludepriv_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AQSIS_SHADER_COMPILER = @AQSIS_SHADER_COMPILER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_PREFIX = @DEFAULT_PREFIX@ DEFS = @DEFS@ DELIGHT_SHADER_COMPILER = @DELIGHT_SHADER_COMPILER@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FIND = @FIND@ GEOMVIEWHDRFILES = @GEOMVIEWHDRFILES@ GEOMVIEWPRIVHDRFILES = @GEOMVIEWPRIVHDRFILES@ GLOB_SHELL = @GLOB_SHELL@ GLOB_SHELL_PATH = @GLOB_SHELL_PATH@ GREP = @GREP@ HTMLBROWSER = @HTMLBROWSER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LD_LIBRARY_PATH_SETTINGS = @LD_LIBRARY_PATH_SETTINGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MACHTYPE = @MACHTYPE@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MESAGL = @MESAGL@ MKDIR_P = @MKDIR_P@ MOTIFINCLUDE = @MOTIFINCLUDE@ MOTIFLIBS = @MOTIFLIBS@ MOTIFUILIB = @MOTIFUILIB@ OBJEXT = @OBJEXT@ OOGLLIB = @OOGLLIB@ OOGLLIBS = @OOGLLIBS@ OPENGLINCLUDE = @OPENGLINCLUDE@ OPENGLLIBS = @OPENGLLIBS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PAMTOTIFF = @PAMTOTIFF@ PATH_SEPARATOR = @PATH_SEPARATOR@ PDFIMAGESPROG = @PDFIMAGESPROG@ PDFVIEWER = @PDFVIEWER@ PIXIE_SHADER_COMPILER = @PIXIE_SHADER_COMPILER@ PNMTOPNG = @PNMTOPNG@ POW_LIB = @POW_LIB@ PS2EPSI = @PS2EPSI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SOCKETLIBS = @SOCKETLIBS@ STRIP = @STRIP@ STUBLIB = @STUBLIB@ VERSION = @VERSION@ XLIBS = @XLIBS@ XMKMF = @XMKMF@ XMULIBS = @XMULIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_ALL_INCLUDES = @ZLIB_ALL_INCLUDES@ ZLIB_ALL_LIB = @ZLIB_ALL_LIB@ ZLIB_INCLUDES = @ZLIB_INCLUDES@ ZLIB_INCLUDE_PATH = @ZLIB_INCLUDE_PATH@ ZLIB_LIB = @ZLIB_LIB@ ZLIB_LIB_PATH = @ZLIB_LIB_PATH@ ZLIB_NAME = @ZLIB_NAME@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ default_includes = @default_includes@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_exec_prefix = @expanded_exec_prefix@ expanded_prefix = @expanded_prefix@ geomdatadir = @geomdatadir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_geom_builddir = @top_geom_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src data doc EXTRA_DIST = reconf geomview.sh INSTALL.Geomview mkmodulesdir noinst_SCRIPTS = geomview nodist_pkginclude_HEADERS = @GEOMVIEWHDRFILES@ pkgincludeprivdir = ${pkgincludedir}/private nodist_pkgincludepriv_HEADERS = @GEOMVIEWPRIVHDRFILES@ EXTRA_HEADERS = DISTCLEANFILES = geomview MAINTAINERCLEANFILES = \ configure config.guess config.h.in config.sub depcomp geomview*.tar.* \ install-sh missing INSTALL aclocal.m4 all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ cd $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_srcdir) && $(AUTOHEADER) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool install-nodist_pkgincludeHEADERS: $(nodist_pkginclude_HEADERS) @$(NORMAL_INSTALL) test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" @list='$(nodist_pkginclude_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(nodist_pkgincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludedir)/$$f'"; \ $(nodist_pkgincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludedir)/$$f"; \ done uninstall-nodist_pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_pkginclude_HEADERS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pkgincludedir)/$$f'"; \ rm -f "$(DESTDIR)$(pkgincludedir)/$$f"; \ done install-nodist_pkgincludeprivHEADERS: $(nodist_pkgincludepriv_HEADERS) @$(NORMAL_INSTALL) test -z "$(pkgincludeprivdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludeprivdir)" @list='$(nodist_pkgincludepriv_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(nodist_pkgincludeprivHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgincludeprivdir)/$$f'"; \ $(nodist_pkgincludeprivHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgincludeprivdir)/$$f"; \ done uninstall-nodist_pkgincludeprivHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_pkgincludepriv_HEADERS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pkgincludeprivdir)/$$f'"; \ rm -f "$(DESTDIR)$(pkgincludeprivdir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d $(distdir) || mkdir $(distdir) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(SCRIPTS) $(HEADERS) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludeprivdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-local distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-nodist_pkgincludeHEADERS \ install-nodist_pkgincludeprivHEADERS install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-nodist_pkgincludeHEADERS \ uninstall-nodist_pkgincludeprivHEADERS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-shar dist-tarZ dist-zip distcheck distclean \ distclean-generic distclean-hdr distclean-libtool \ distclean-local distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-nodist_pkgincludeHEADERS \ install-nodist_pkgincludeprivHEADERS install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-nodist_pkgincludeHEADERS \ uninstall-nodist_pkgincludeprivHEADERS geomview: geomview.sh Makefile echo top_builddir is $(abs_top_builddir) sed -e 's|%GEOMROOT%|$(abs_top_srcdir)|g' \ -e 's|%GEOMVIEW_GVX%|$(abs_top_builddir)/src/bin/geomview/x11/gvx|g' \ -e 's|%GEOMVIEW_LTGVX%|$(abs_top_builddir)/src/bin/geomview/x11/.libs/lt-gvx|g' \ -e 's|%MACHTYPE%|$(MACHTYPE)|g' \ -e 's|%GEOMDATA%|$(abs_top_srcdir)/data|g' \ -e 's|%MODULESDIR%|$(abs_top_builddir)/modules|g' \ -e "s|%LD_LIBRARY_PATH_SETTINGS%|$(LD_LIBRARY_PATH_SETTINGS)|g" \ -e "s|%GEOMVIEW_LIB%|$(libdir)|g" \ -e "s|%GEOMVIEW_INCLUDE%|$(pkgincludedir)|g" \ -e "s|%PACKAGE_VERSION%|$(PACKAGE_VERSION)|g" \ -e "s|%GEOMDOCDIR%|$(abs_top_builddir)/doc|g" \ < $(top_srcdir)/geomview.sh > geomview chmod +x geomview distclean-local: rm -rf include modules find . -name "*~" -exec rm -f \{\} \; # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: geomview-1.9.4/config.h.in0000644000175000001440000004403410665240473012323 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ #ifndef CONFIG_H_INCLUDED #define CONFIG_H_INCLUDED /* ACCEPT_ARG3_TYPE should be the datatype of the 3rd arg to the 'accept' system call. It's 'int' on some systems, 'unsigned long' on some, and could be something else on others. Default to int */ #undef ACCEPT_ARG3_TYPE /* Define to 1 if we are compiling for AIX */ #undef AIX /* Define to 0 to use polar meshes for drawing of spheres */ #undef BEZIER_SPHERES /* Define to 1 if the `closedir' function returns void instead of `int'. */ #undef CLOSEDIR_VOID /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* D1 debugging? */ #undef D1_DEBUG /* Define to the name of the html browser for online viewing of the HTML manual. */ #undef DFLTHTMLBROWSER /* Define to the name of the html browser for online viewing of the PDF manual. */ #undef DFLTPDFVIEWER /* "Define to the root of the Geomview documentation" */ #undef DOCDIR /* Use experimental motion averaging code? */ #undef EXPERIMENTAL_MOTION_AVERAGING /* Define to path and arguments of shell used for file name globbing */ #undef GLOB_SHELL /* Define to 1 if you have the `accept' function. */ #undef HAVE_ACCEPT /* Define to 1 if you have the `acosh' function. */ #undef HAVE_ACOSH /* Define to 1 if you have the `alarm' function. */ #undef HAVE_ALARM /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the `basename' function. */ #undef HAVE_BASENAME /* Define to 1 if you have the `bcopy' function. */ #undef HAVE_BCOPY /* Define to 1 if you have the `bind' function. */ #undef HAVE_BIND /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if you have the `compressBound' function. */ #undef HAVE_COMPRESSBOUND /* Define to 1 if you have the `connect' function. */ #undef HAVE_CONNECT /* Define to 1 if you have the declaration of `accept', and to 0 if you don't. */ #undef HAVE_DECL_ACCEPT /* Define to 1 if you have the declaration of `acosh', and to 0 if you don't. */ #undef HAVE_DECL_ACOSH /* Define to 1 if you have the declaration of `errno', and to 0 if you don't. */ #undef HAVE_DECL_ERRNO /* Define to 1 if you have the declaration of `fmemopen', and to 0 if you don't. */ #undef HAVE_DECL_FMEMOPEN /* Define to 1 if you have the declaration of `getopt', and to 0 if you don't. */ #undef HAVE_DECL_GETOPT /* Define to 1 if you have the declaration of `LC_ALL', and to 0 if you don't. */ #undef HAVE_DECL_LC_ALL /* Define to 1 if you have the declaration of `optarg', and to 0 if you don't. */ #undef HAVE_DECL_OPTARG /* Define to 1 if you have the declaration of `opterr', and to 0 if you don't. */ #undef HAVE_DECL_OPTERR /* Define to 1 if you have the declaration of `optind', and to 0 if you don't. */ #undef HAVE_DECL_OPTIND /* Define to 1 if you have the declaration of `optopt', and to 0 if you don't. */ #undef HAVE_DECL_OPTOPT /* Define to 1 if you have the declaration of `putenv', and to 0 if you don't. */ #undef HAVE_DECL_PUTENV /* Define to 1 if you have the declaration of `select', and to 0 if you don't. */ #undef HAVE_DECL_SELECT /* Define to 1 if you have the declaration of `strcasecmp', and to 0 if you don't. */ #undef HAVE_DECL_STRCASECMP /* Define to 1 if you have the declaration of `strdup', and to 0 if you don't. */ #undef HAVE_DECL_STRDUP /* Define to 1 if you have the declaration of `strncasecmp', and to 0 if you don't. */ #undef HAVE_DECL_STRNCASECMP /* Define to 1 if the system has the type `dev_t'. */ #undef HAVE_DEV_T /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the `dirname' function. */ #undef HAVE_DIRNAME /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the `dup2' function. */ #undef HAVE_DUP2 /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* Define to 1 if you have the `fcntl' function. */ #undef HAVE_FCNTL /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `finite' function. */ #undef HAVE_FINITE /* Define to 1 if you have the `floor' function. */ #undef HAVE_FLOOR /* Define to 1 if you have the `fmemopen' function. */ #undef HAVE_FMEMOPEN /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the `fstat' function. */ #undef HAVE_FSTAT /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define to 1 if you have the `getopt' function. */ #undef HAVE_GETOPT /* Define to 1 if you have the header file. */ #undef HAVE_GETOPT_H /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the `glXCreateGLXPixmap' function. */ #undef HAVE_GLXCREATEGLXPIXMAP /* Define to 1 if IPv6 sockets are available */ #undef HAVE_INET6_SOCKETS /* Define to 1 if IPv4 sockets are available */ #undef HAVE_INET_SOCKETS /* Define to 1 if the system has the type `ino_t'. */ #undef HAVE_INO_T /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_IO_H /* Define to 1 if you have the `isascii' function. */ #undef HAVE_ISASCII /* Define to 1 if ISO C99 features are available (e.g. variadic macros and variable length arrays) */ #undef HAVE_ISO_C99 /* Define to 1 if you have the header file. */ #undef HAVE_LIBGEN_H /* Define to 1 if you have libGLU */ #undef HAVE_LIBGLU /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have libz */ #undef HAVE_LIBZ /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the `listen' function. */ #undef HAVE_LISTEN /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the `lstat' function. */ #undef HAVE_LSTAT /* Define to 1 if `lstat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_LSTAT_EMPTY_STRING_BUG /* Define to 1 if you have the `mallinfo' function. */ #undef HAVE_MALLINFO /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MATH_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR /* Define to 1 if M_PI is defined */ #undef HAVE_M_PI /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if libc includes obstacks. */ #undef HAVE_OBSTACK /* pamtotiff program */ #undef HAVE_PAMTOTIFF /* Define to 1 if you have the `popen' function. */ #undef HAVE_POPEN /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV /* Define to 1 if you have the `rint' function. */ #undef HAVE_RINT /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if the system has the type `socklen_t'. */ #undef HAVE_SOCKLEN_T /* Define to 1 if you have the `sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if you have the `stat' function. */ #undef HAVE_STAT /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strcspn' function. */ #undef HAVE_STRCSPN /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the `strpbrk' function. */ #undef HAVE_STRPBRK /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the `sysinfo' function. */ #undef HAVE_SYSINFO /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSTEMINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if the system has the type `time_t'. */ #undef HAVE_TIME_T /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if Unix domain sockets are available */ #undef HAVE_UNIX_SOCKETS /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the `wait3' function. */ #undef HAVE_WAIT3 /* Define to 1 if you have the `waitpid' function. */ #undef HAVE_WAITPID /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Does -lXmu exist on this system? */ #undef HAVE_XMU /* Define to 1 if you have the header file. */ #undef HAVE_ZLIB_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Define to the machine type */ #undef MACHTYPE /* Define to 1 if your are using the Mesa OpenGL implementation */ #undef MESAGL /* Leave this at 0 */ #undef MGGL /* Define to 1 if OpenGL (or Mesa or anything equivalent) is available and should be used for rendering */ #undef MGOPENGL /* Define to 1 if all rendering should be performed through the X library (i.e. no accelerated 3D rendering, no textures) */ #undef MGX11 /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if popen(CMD, MODE) accepts "rb" for MODE */ #undef POPEN_ACCEPTS_RB /* Define to 1 if the C compiler supports function prototypes. */ #undef PROTOTYPES /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* Define to 1 if the `setpgrp' function takes no argument. */ #undef SETPGRP_VOID /* Define to 1 if the `setvbuf' function takes the buffering type as its second argument and the buffer pointer as the third, as on System V before release 3. */ #undef SETVBUF_REVERSED /* The size of `dev_t', as computed by sizeof. */ #undef SIZEOF_DEV_T /* The size of `ino_t', as computed by sizeof. */ #undef SIZEOF_INO_T /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `time_t', as computed by sizeof. */ #undef SIZEOF_TIME_T /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Version number of package */ #undef VERSION /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ #undef WORDS_BIGENDIAN /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ #undef YYTEXT_POINTER /* Define like PROTOTYPES; this can be used by system headers. */ #undef __PROTOTYPES /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `int' if does not define. */ #undef pid_t /* Define to 1 if we are compiling for sgi */ #undef sgi /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to 1 if we are compiling for unix??? */ #undef unix /* Define as `fork' if `vfork' does not work. */ #undef vfork #if D1_DEBUG #define D1PRINT(args) printf args #else #define D1PRINT(args) #endif #if !HAVE_WORKING_FORK # error FIXME! We need fork() #endif /* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif #endif #if !HAVE_LSTAT || \ !LSTAT_FOLLOWS_SLASHED_SYMLINK || \ HAVE_LSTAT_EMPTY_STRING_BUG # define lstat(path, buf) gv_lstat(path, buf) #endif #if !HAVE_STAT || HAVE_STAT_EMPTY_STRING_BUG # define stat(path, buf) gv_stat(path, buf) # define fstat(fd, buf) gv_fstat(fd, buf) #endif #ifdef HAVE_STDBOOL_H # include #else # ifndef HAVE__BOOL # ifdef __cplusplus typedef bool _Bool; # else # define _Bool signed char # endif # endif # define bool _Bool # define false 0 # define true 1 # define __bool_true_false_are_defined 1 #endif /* make sure we have PATH_MAX */ #if HAVE_LIMITS_H # include #endif #if HAVE_SYS_PARAM # include #endif #ifndef PATH_MAX # ifndef _POSIX_PATH_MAX # ifndef MAXPATHLEN # define PATH_MAX 4096 # else # define PATH_MAX MAXPATHLEN # endif # else # define PATH_MAX _POSIX_PATH_MAX # endif #endif #if HAVE_ISO_C99 # define VARARRAY(name, type, len) type name[len] # define VARARRAY2(name, type, len1, len2) type name[len1][len2] #else # define VARARRAY(name, type, len) type *name = alloca((len)*sizeof(type)) # define VARARRAY2(name, type, len1, len2) \ type (*name)[len2] = alloca((len1)*(len2)*sizeof(type)) #endif #if 0 #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #undef malloc #undef free #undef realloc #undef calloc #undef strdup extern void *malloc_record(size_t size, const char *file, const char *func, int line); extern void *realloc_record(void *ptr, size_t size, const char *file, const char *func, int line); extern void *calloc_record(size_t nmemb, size_t size, const char *file, const char *func, int line); extern char *strdup_record(const char *string, const char *file, const char *func, int line); extern void free_record(void *ptr); #define malloc(size) malloc_record(size, __FILE__, __FUNCTION__, __LINE__) #define realloc(ptr, size) realloc_record(ptr, size, __FILE__, __FUNCTION__, __LINE__) #define calloc(nmemb, size) calloc_record(nmemb, size, __FILE__, __FUNCTION__, __LINE__) #define strdup(str) strdup_record(str, __FILE__, __FUNCTION__, __LINE__) #define free(ptr) free_record(ptr) #define OOG_NewP(size) malloc(size) #define OOG_RenewP(p, size) realloc(p, size) #define OOG_NewE(size, blah) malloc(size) #define OOG_RenewE(p, size, blah) realloc(p, size) #define OOGLFree(p) free(p) #endif #endif /* CONFIG_H_INCLUDED */ geomview-1.9.4/reconf0000754000175000001440000000004310474602547011473 00000000000000#! /bin/sh -x autoreconf -i "$@" geomview-1.9.4/AUTHORS0000644000175000001440000000030510663303733011336 00000000000000Many people have contributed to Geomview. See the file README for a list of the authors. This release (1.9.4) was put together by: Claus-Justus Heine geomview-1.9.4/INSTALL0000644000175000001440000002231010665240507011320 00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. geomview-1.9.4/geomview.sh0000755000175000001440000000733010663276612012461 00000000000000#! /bin/sh # geomview shell script driver if test -x %GEOMVIEW_LTGVX%; then GEOMVIEW_GVX=%GEOMVIEW_LTGVX% else GEOMVIEW_GVX=%GEOMVIEW_GVX% fi ######################################################################## # # DO NOT CHANGE ANYTHING BELOW HERE # # ######################################################################## %LD_LIBRARY_PATH_SETTINGS% export LD_LIBRARY_PATH ### Geomview and/or its modules use the following environment ### variables. For each of these that does not already have a value, ### this shell script assigns a value based on the setting of ### geomview_dir above. You can override these values if you want by ### setting them in your shell environment before invoking this ### script. ### ### GEOMVIEW_GVX: pathname of executable file "gvx" ### GEOMVIEW_LOAD_PATH: colon-separated list of directories to search ### for files ### GEOMVIEW_EMODULE_PATH: colon-separated list of directories to search ### for modules ### GEOMVIEW_SYSTEM_INITFILE: pathname of an initialization file to ### read upon startup ### GEOMDATA: [ used only by some modules; for backward compatibility ] ### pathname of the data directory MACHTYPE=%MACHTYPE% suf= : ${GEOMROOT=%GEOMROOT%} : ${GEOMDATA=%GEOMDATA%} : ${GEOMVIEW_DATA_DIR=%GEOMDATA%} : ${GEOMVIEW_LOAD_PATH=.:${GEOMDATA}/geom:${GEOMDATA}} : ${GEOMVIEW_EMODULE_DIR=%MODULESDIR%} : ${GEOMVIEW_EMODULE_PATH=${HOME}:${GEOMVIEW_EMODULE_DIR}} : ${GEOMVIEW_SYSTEM_INITFILE=${GEOMDATA}/.geomview} : ${GEOMVIEW_DOC_DIR=%GEOMDOCDIR%} export GEOMVIEW_GVX GEOMVIEW_LOAD_PATH GEOMVIEW_DATA_DIR GEOMDATA export GEOMVIEW_EMODULE_PATH GEOMVIEW_EMODULE_DIR export GEOMVIEW_SYSTEM_INITFILE export GEOMVIEW_DOC_DIR if [ -d /cygdrive ]; then TCL_LIBRARY=/usr/share/tcl8.4 TK_LIBRARY=/usr/share/tk8.4 export TCL_LIBRARY TK_LIBRARY fi gvx="${GEOMVIEW_GVX}" case "$gvx" in *gvx.[a-zA-Z3]) gvx="`expr match \"${GEOMVIEW_GVX}\" '(.*)\.[^./]*' \| \"${GEOMVIEW_GVX}\"`" ;; esac if [ -f "$gvx$suf" ]; then GEOMVIEW_GVX="$gvx$suf" elif [ -f "$gvx$suf2" ]; then GEOMVIEW_GVX="$gvx$suf2" elif [ -f "$gvx" ]; then GEOMVIEW_GVX="$gvx" fi export GEOMVIEW_GVX case "$1" in -dbx) GEOMVIEW_DEBUG=1 exec dbx ${GEOMVIEW_GVX} ;; -edge) GEOMVIEW_DEBUG=1 exec edge ${GEOMVIEW_GVX} ;; -gdb) GEOMVIEW_DEBUG=1 exec gdb ${GEOMVIEW_GVX} ;; -xdb) GEOMVIEW_DEBUG=1 exec xdb ${GEOMVIEW_GVX} ;; -ddd) GEOMVIEW_DEBUG=1 exec ddd ${GEOMVIEW_GVX} ;; -h|--help) cat < * Release of Geomview 1.9.4 2007-08-23 Claus-Justus Heine * NEWS: Mention GEOMROOT environment variable. * doc/Makefile.am: install/uninstall-local hook for the html stuff. * src/bin/geomview/common/help.c: Undo a debugging message. * doc/Makefile.am, src/bin/geomview/common/help.c: Support for installing and viewing a language specific manual (by examining the LANG environment variable). * doc/Makefile.am: Forgot to distribute geomview-pt_BR.pdf. * doc/version-pt_BR.texi, doc/version.texi: Update to 1.9.4. * rcs2log: Initial revision. * ChangeLog: Update. * AUTHORS, NEWS: Version to 1.9.4 * README: Add Jorge Barros, bump version to 1.9.4. * geomview.sh: Revive the GEOMROOT environment variable, because the StageTools suite needs its presence. * configure.ac: Use a more verbose MACHTYPE. * doc/geomview-pt_BR.texi, doc/geomview.texi, doc/version-pt_BR.texi, doc/version.texi: Update. 2007-08-22 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Translation pt_BR small corrections. Thanks to Patrice Dumas. 2007-08-19 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial translation pt_BR 2007-08-12 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial translation pt_BR 2007-08-05 Jorge Barros de Abreu * doc/geomview-pt_BR.texi: Partial translation pt_BR 2007-08-04 Jorge Barros de Abreu * doc/geomview-pt_BR.texi, doc/version-pt_BR.texi: Removing version-pt_BR.texi for keeping only version.texi Adjusting geomview-pt_BR.texi pointing to version.texi * doc/geomview-pt_BR.texi, doc/version-pt_BR.texi: Partial pt_BR translation 2007-08-03 Claus-Justus Heine * doc/Makefile.am: Fix typo (ooglttour-pt_BR -> oogltour-pt_BR). 2007-08-01 Claus-Justus Heine * doc/.cvsignore, doc/Makefile.am, doc/geomview-pt_BR.texi, doc/oogltour-pt_BR, doc/version-pt_BR.texi, doc/version.texi: Restructuring pt_BR translation. 2007-07-31 Claus-Justus Heine * src/lib/shade/image.c: run_filter(): did not close the write-end of the pipe. ImgStreamIn(): need to save the contents of w = iobfdelimtok(), it is overwritten on the next call to iobfdelimtok(). 2007-07-29 Jorge Barros de Abreu * doc/geomview.texi: replacing "and and" by "and" 2007-07-28 Jorge Barros de Abreu * doc/oogltour: adjusting "Obscure panel" to "Inspect pull-down menu" * doc/oogltour: adjusting "More panels" to "Inspect pull-down menu" 2007-07-20 Claus-Justus Heine * doc/geomview.texi: Some button names were wrong in the Tutorial (reported by Jorge Barros de Abreu ) 2007-07-19 Claus-Justus Heine * src/bin/geomview/common/motion.c: Revert a previous change and do NOT call drawer_transform() directly, instead go throught he Lisp-functions (transform ...) and (transform-incr ...). Otherwise interest stuff does not work as before. * configure.ac: Give OPENGLINCLUDE an empty value instead of giving it a value of 0 if OpengGL cannot be found. * doc/geomview.texi: Fix a typo. 2007-07-18 Claus-Justus Heine * src/bin/geomview/common/comm.c: Fix not restoring pool->outf for a temporary (from string) command pool. * src/lib/oogl/util/iobuffer.c: Typo in comment. 2007-07-11 Claus-Justus Heine * src/lib/mg/opengl/mgopengldraw.c: Only use the GLU tesselator if APF_CONCAVE is set (as was the previous behaviour) * src/lib/mg/opengl/mgopenglshade.c: Set GL_UNPACK_ALIGNMENT to 1 before scaling images; the default is 4. * src/lib/mg/opengl/mgopengldraw.c: Typo. * src/lib/gprim/polylist/plnormal.c: Use fneg() to evaluate the sign of scalar products. 2007-07-10 Claus-Justus Heine * src/lib/gprim/polylist/plnormal.c: Improved computation of per-vertex normals. 2007-07-07 Claus-Justus Heine * src/lib/gprim/mesh/meshload.c: Fix a bug introduced by the previous change. 2007-07-05 Claus-Justus Heine * src/lib/gprim/polylist/plsphere.c: Fix a memory leak; bounding sphere was created twice. 2007-06-21 Claus-Justus Heine * doc/version.texi: Update. 2007-06-21 * Release of Geomview 1.9.3 2007-06-21 Claus-Justus Heine * AUTHORS, NEWS, README, configure.ac: Bump version to 1.9.3; spheres were severely broken in > 1.8.2 < 1.9.2 * src/lib/gprim/sphere/spheredice.c: Drawing of sheres with center != 0 was severely broken. 2007-06-09 Claus-Justus Heine * ChangeLog: Update. * configure.ac, geomview.sh, src/bin/geomview/common/main.c, src/bin/gvclock/gvclock.in: Locale stuff. 2007-06-09 * Release of Geomview 1.9.2 2007-06-09 Claus-Justus Heine * configure.ac, geomview.sh, src/bin/geomview/common/main.c, src/bin/gvclock/gvclock.in: Locale stuff. 2007-06-07 Claus-Justus Heine * ChangeLog, AUTHORS, NEWS, README: Version to 1.9.2 * geomview.sh: Set LC_ALL to C to avoid problems with native language support. Geomview does not know about this stuff. 2007-06-07 Claus-Justus Heine * AUTHORS, NEWS, README: Version to 1.9.2 * geomview.sh: Set LC_ALL to C to avoid problems with native language support. Geomview does not know about this stuff. 2007-05-21 Claus-Justus Heine * doc/geomview.texi, doc/version.texi: Document changed picking interface. * NEWS, configure.ac: Update for 1.9.2 * src/lib/oogl/lisp/lisp.c, src/bin/geomview/common/comm.c, src/bin/geomview/common/event.c, src/bin/geomview/common/transform.c: (morehelp ...) docs: Use "\n\n" as hard-line break, use any following tabs as indentation. Paragraphs are generated by "\n\n\n\n". * src/bin/geomview/common/pickfunc.h: Execute 3d picking code if pn <= 4 (i.e. the 3d block is also responsible for void pick events). * src/bin/nose/nose.c: Add myself to the copyright notice. * src/lib/gprim/geom/Makefile.am: Add nodedata.h to library sources. * src/lib/mg/x11/mgx11windows.c: Xmg_showdisplaylist(): do nothing if (xmin > xmax || ymin > ymax), otherwise calling X[Shm]PutImage() causes (justly) an X-error, which previously was caught by a custom error handler. 2007-05-20 Claus-Justus Heine * src/bin/ndutils/.cvsignore: Bump version stamps. * doc/example3.c: Update to recent pick changes. * src/bin/geomview/common/pickfunc.h: Fix PICKFUNC() macro. (most recent ND-pick changes) * src/bin/cplxview/Makefile.am, src/bin/example/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am: First link with libgeomview, then with all other libs. * src/bin/graffiti/lang.c, src/bin/hinge/lang.c: ND-picking update. * src/bin/crayola/callbacks.c, src/bin/geomview/common/event.c, src/bin/geomview/common/pickfunc.h, src/bin/nose/nose.c: Pick events now use the new LVARARRAY stuff; this also means that picking of ND-objects is now fully (mmh, really?) supported. At least Nose seems to do the right things ... * src/bin/crayola/Makefile.am: First link with libgeomview, then with Tcl/Tk. * src/bin/geomview/common/drawer.c: drawer_dgeom(): Use NULL arg to GeomBSPTree(..., BSPTREE_CREATE) to trigger recreation. * src/bin/geomview/common/drawer.h, src/bin/geomview/common/ndshade.c: Comment out the last relicts of the most recent optimization attempts. * src/bin/geomview/common/lispext.c: List-type extension methods should be "static". Fix that. * src/bin/geomview/common/transform.c: Typo in error message. * src/bin/geomview/common/ndshade.c: Try to optimize ND-projections. Unluckily, it did not work out. Keep the source code embedded into "#if 0" brackets. See the comments in ndshade.c * src/lib/oogl/lisp/lisp.c, src/lib/oogl/lisp/lisp.h, src/lib/oogl/lisp/lisp2c: Implement new LVARARRAY lisp object: variable sized arrays, the argument parsing code just allocats as much space as needed. This comes in very handy -- e.g. -- for interest in pick objects. * src/lib/oogl/lisp/Makefile.am: Let clisp.c depend on lisp.h. * src/lib/oogl/lisp/Headers: lisp2.h was a duplicate, remove it. * src/lib/gprim/geom/Headers, src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/bsptree.h, src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/geomclass.h, src/lib/gprim/geom/nodedata.h, src/lib/gprim/geom/pick.c, src/lib/gprim/geom/pickP.h, src/lib/gprim/geom/replace.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/list/listcreate.c: Fix BSP-tree invalidation. * src/lib/gprim/npolylist/nplcreate.c: Formatting (while re-reading the stuff). * src/lib/gprim/polylist/plsphere.c: Nd stuff fixes. * src/lib/geomutil/crayplutil/Makefile.am, src/lib/geomutil/crayplutil/crayNPolylist.c, src/lib/geomutil/crayplutil/crayola.c, src/lib/geomutil/crayplutil/crayolaP.h: Add colouring support for NPolyList objects. Only NDMeshes are still missing. But the ND-Mesh concept is broken anyway. * src/lib/geomutil/crayplutil/crayVect.c: Get rid of a compiler warning. * src/lib/geometry/hpointn/hpointn.h: HPt3NTransform(): used wrong permutation (inverted). * src/lib/geometry/transform3/tm3print.c: Geeh, this stuff still used printf instead of fprintf. * src/lib/geometry/transformn/transformn.h: Formatting of comments. * m4/geomview.m4: Check for Geomview in bindir first. 2007-05-18 Claus-Justus Heine * src/bin/geomview/common/drawer.c: Shut-off a compiler warnings. * src/lib/mg/x11/mgx11windows.c: Revert to hiding a bug of this broken stuff. 2007-05-16 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c, src/lib/oogl/refcomm/streampool.c: Issue an error if non-blocking IO flags are not defined. * src/bin/geomview/common/comm.c: emodule_run() tiny fixes, shouldn't change anything. * data/Makefile.am: Distribute some more texture images. * src/lib/geometry/hpoint3/hpoint3.h: Hpt3MinMax(): catch the w == 0 case. * data/geom/textured/themi.bez: Use texturing. * data/geom/textured/Antenna.geom, data/geom/textured/GCGball, data/geom/textured/NASA.pgm.gz, data/geom/textured/dodec.off, data/geom/textured/geologo.pgm.gz, data/geom/textured/grid.pgm.gz, data/geom/textured/lunar-t.oogl, data/geom/textured/square.off, data/geom/textured/themi.bez, data/geom/textured/white.pgm.gz: Add missing texture images. * data/geom/textured/sphere.gcl, data/Makefile.am, data/geom/textured/Earth.pam.bz2: Initial revision of textured sphere (new replace apply flag + textured sphere support). * src/lib/gprim/bezier/bezbound.c: Bezier bounding boxes were totally broken. * src/lib/oogl/util/error.c, src/lib/oogl/util/futil.c, src/lib/oogl/util/glob.c, src/lib/oogl/util/iobfutil.c, src/lib/oogl/util/iobuffer.c, src/lib/shade/appearance.h, src/lib/shade/texture.c, src/bin/geomview/x11/gvlights.c, src/bin/geomview/x11/gvload.c, src/bin/geomview/x11/gvmaterial.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/gvtoolui.c, src/bin/geomview/x11/gvui.c, src/bin/togeomview/Makefile.am, src/lib/geomutil/crayplutil/crayVect.c, src/lib/geomutil/plutil/anytopl.c, src/lib/gprim/discgrp/dgdraw.c, src/lib/gprim/discgrp/dgsave.c, src/lib/gprim/discgrp/dgstream.c, src/lib/gprim/discgrp/polyhedron.c, src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/geomstream.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshpick.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshpick.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skelpick.c, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/vect/vectpick.c, src/lib/mg/buf/mgbuf.c, src/lib/mg/buf/mgbufdraw.c, src/lib/mg/common/mg.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/ps/mgps.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/ps/mgpstri.c, src/lib/mg/ps/mgpswindows.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribP.h, src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11windows.c, src/lib/mib/mibScale.c, src/lib/mib/mibload.c, src/lib/oogl/lisp/lisp.c, src/bin/geomutil/oogl2rib/Makefile.am, src/bin/geomutil/oogl2rib/oogl2rib.c, src/bin/geomutil/oogl2vrml/Makefile.am, src/bin/geomutil/ucd/Makefile.am, src/bin/geomutil/ucd/anytoucd.c, src/bin/geomutil/ucd/ucdtooff.c, src/bin/geomutil/vrml2oogl/lib/QvFieldData.c++, src/bin/geomview/common/comm.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/event.c, src/bin/geomview/common/lang.c, src/bin/geomview/common/lang.h, src/bin/geomview/common/lights.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/shaders.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/ui.c, src/bin/geomview/x11/gvappear.c, src/bin/geomview/x11/gvcameras.c, src/bin/geomview/x11/gvcolor.c, src/bin/geomview/x11/gvcommands.c, src/bin/geomview/x11/gvcredits.c, src/bin/animate/Makefile.am, src/bin/animate/animate.c, src/bin/clipboard/clipboard.c, src/bin/geomutil/clip/Makefile.am: Get rid of quite a bunch of SGI compiler warnings. * data/geom/torus8.oogl: Formatting. * m4/withtool.m4, m4/lf_local.m4: Don't use -qs (SGI compatibility issue). * src/lib/oogl/refcomm/streampool.c: StreamPoolTemp(): sizeof(dummy) was too small, bug introduced by an attempt to make the stuff 64-bit clean (actually: to make it independent from sizeof(void *)). * src/lib/oogl/refcomm/reference.c: No longer needed (inlined). * src/bin/geomutil/bdy/Makefile.am, src/bin/geomutil/bdy/drawbdy.sh: Installation directory layout change broke the drawbdy script (which already was somewhat broken anyway) 2007-05-15 Claus-Justus Heine * src/bin/geomview/common/worldio.c: Pool->level increment/decrement did not match. * src/bin/geomutil/vrml2oogl/lib/QvPList.c++: Another AIX fix. * src/lib/mg/opengl/mgopengldraw.c: Never release stuff without testing ... * data/Makefile.am, data/shaders/Makefile.am: Use "dist_" prefix instead of EXTRA_DIST for .._DATA stuff, distribute the compiled shader source. * src/lib/geometry/cmodel/cmodel.c: Do not use alloc for large arrays. Don't. * src/lib/gprim/geom/bsptree.c, src/lib/mg/opengl/mgopengldraw.c: Although otherwise documented the "vertex_data" argument to the GLU tesselator combine-callbine does _NOT_ always contain valid pointers. Also make sure that a zero homogeneous component does not produce NaNs; this leads to memory corruption or infinite loops in the tesselator. * src/lib/gprim/mesh/meshdraw.c: cm_mesh_draw() needs the per-point normals. * configure.ac, doc/Makefile.am, src/bin/geomutil/oogl2rib/oogl2rib.c, src/bin/geomutil/plutil/polymerge.c, src/lib/oogl/util/porting.h: Fix (hopefully) some issues concerning IBM AIX. 2007-05-12 Claus-Justus Heine * src/bin/geomview/common/event.c: Cosmetics. * src/bin/geomview/common/event.c: tog_ap_flag(): initialize ApStruct. * src/bin/geomutil/oogl2rib/Makefile.am: Add newline at end of file. 2007-05-07 Claus-Justus Heine * Release of Geomview 1.9.1 2007-05-07 Claus-Justus Heine * ChangeLog, doc/version.texi: Release 1.9.1 2007-05-04 Claus-Justus Heine * README: Bump version to 1.9.1 * NEWS: Update. * doc/geomview.texi: Some sort of spell-checking. Not complete. ispell and TeXinfo is a real nightmare. * src/lib/mg/common/mg.c: When we delete a context then we must make sure that textures are pruned which only belong to this context, otherwise mgopengl thinks the texture is still loaded, even when the last (shared) OpenGL context has gone. * src/lib/mg/common/mgtexture.c: Cosmetics. * doc/Makefile.am: Tweak TEXINPUTS. 2007-05-03 Claus-Justus Heine * doc/Makefile.am: Try to provide working html doc in the build-directory. * configure.ac: Use automake 1.10. 2007-05-01 Claus-Justus Heine * doc/version.texi: Update. * doc/Makefile.am: Prevent automake from including Emacs backup-files into the distro. * AUTHORS, Makefile.am, NEWS, configure.ac: Bump version to 1.9.1 * AUTHORS, README: Version stamps were wrong. * src/lib/aclib/putenv.c, src/lib/aclib/strdup.c: Fix bug "[ 1687598 ] Check return codes everywhere" where it was appropriate. 2007-04-29 Lloyd Wood * doc/geomview.texi: Fixing minor typo. 2007-04-27 Claus-Justus Heine * Release of Geomview 1.9.0 2007-04-27 Claus-Justus Heine * ChangeLog: Update. * configure.ac: Use default docdir. * src/bin/togeomview/togeomview.c: Really fix the ipv4/v6 issue. 2007-04-26 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c: Cosmetics. * src/lib/oogl/refcomm/streampool.c: initialization of pool->infd was broken. 2007-04-27 Claus-Justus Heine * configure.ac: Use default docdir. * src/bin/togeomview/togeomview.c: Really fix the ipv4/v6 issue. 2007-04-26 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c: Cosmetics. * src/lib/oogl/refcomm/streampool.c: initialization of pool->infd was broken. * src/bin/togeomview/togeomview.c: Forgot an #ifdef (for IpV4/V6). 2007-04-25 Claus-Justus Heine * m4/geomview.m4: Search under DEFAULT_PREFIX/lib/ and libdir for libgeomview. * configure.ac, src/lib/gprim/geom/bsptree.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/mg/opengl/mgopengldraw.c: Use ISO C99 variable size arrays through a VARARRAY() macro that falls back to alloca is ISOC99 is not available. * src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c: Try to avoid alloca for large arrays. * src/lib/geomutil/crayplutil/crayolaP.h: missing proto-type * src/bin/togeomview/togeomview.c: Some uninitialized variables. * src/bin/nose/nose.c: main() should return something. * configure.ac: Check for ISO C99 features. * m4/iso-c99.m4: Initial revision. 2007-04-24 Claus-Justus Heine * INSTALL.Geomview, NEWS, README, README.cvs: Doc update. 2007-04-21 Claus-Justus Heine * configure.ac: Call GEOMVIEW_SET_PREFIX (DEFAULT_PREFIX env var etc) 2007-04-20 Claus-Justus Heine * m4/geomview.m4: Check for libgeomview under DEFAULT_PREFIX, disable (per default) --enable-geomview-query if --prefix was given (can be re-enabled). * m4/set-prefix.m4: Iterate with eval. 2007-04-19 Claus-Justus Heine * src/bin/geomview/common/space.c: Fix ND-view scale bug, introduced by earlier changes. * src/bin/geomview/common/motion.c: Formatting. * src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/nplcopy.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/sphere/spherecreate.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.h, src/lib/mg/x11/mgx11draw.c, src/lib/shade/image.c: Compiler warnings. 2007-04-18 Claus-Justus Heine * src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c, src/lib/mg/opengl/mgopengldraw.c: Partial support for flat-shaded facets with smooth color interpolation between the vertices. * src/lib/gprim/mesh/meshnormal.c: Fill per-quad normals for all mesh points to support shading=vcflat. * src/lib/gprim/mesh/meshdraw.c: Support shading=vcflat in draw_projected_mesh(). * src/lib/shade/apstream.c: Support shading=vcflat * src/lib/mg/opengl/mgopenglmesh.c: Fix a bug missing () bug in mgopenglsubmesh(). 2007-04-17 Claus-Justus Heine * src/bin/geomview/common/event.c, src/bin/geomview/common/ui.c, src/bin/geomview/common/ui.h, src/lib/gprim/polylist/plload.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglmesh.c, src/lib/shade/appearance.h, src/lib/shade/apstream.c: New shading option VCflat: smooth interpolated per-vertex colours, but with flat lighting. * m4/geomview.m4: Make --enable-geomview-query the default, i.e. ask the installed version of Geomview about the installation directories if not disabled via --disable-geomview-query. * m4/check-package.m4: Iterate with eval over the extra framework search paths. * m4/check-package.m4: Revert previous two changes. 2007-04-16 Claus-Justus Heine * m4/check-package.m4: Need to use LDFLAGS; the library path passed to AC_CHECK_LIB() in the last argument really is passed as last argument to the linker; and linker paths are position sensitive. 2007-04-15 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c: iobffileopen(): bail out if istream argument is NULL. * src/lib/oogl/refcomm/streampool.c: Handle drive-letter in file name. 2007-04-12 Claus-Justus Heine * src/lib/mg/rib/mgribtoken.c: Again: The world is not Big-Endian (luckily). So fix the damn RIB-stuff to not misbehave. Also: Binary RIB was missing some tokens the ASCII stuff already was aware of. * src/lib/mg/rib/mgribtoken.c: The world is not Big-Endian (luckily). So fix the damn RIB-stuff to not misbehave. * src/bin/geomview/common/drawer.c, src/bin/geomview/common/lang.c, src/bin/geomview/common/worldio.c, src/bin/geomview/x11/gvsave.c: Make sure we can save the universe (i.e. include aliens). 2007-04-11 Claus-Justus Heine * src/bin/ndutils/TransformGeom.c, src/bin/ndutils/WithColor.c: Support 3d-snapshots for Insts (colored or not). * src/bin/ndutils/TransformGeom.c: 3d snapshot without colour works for INSTs, colour snapshots still to be done (but should now be trivial). * src/bin/ndutils/TransformGeom.c, src/bin/ndutils/Clip.h, src/bin/ndutils/GeomtoNoff.c: Trying to make 3d snapshots work again ... (not yet). 2007-04-10 Claus-Justus Heine * src/bin/geomview/common/worldio.c: Use bool true/false * src/bin/ndutils/snapshot.c: Quote geometry names. * src/bin/ndutils/clip.c: clip_all_vertices(): the list head may be deleted, cope with that. * src/bin/ndutils/clipoogl.c: readNDPoly() was broken (my fault). * src/bin/ndutils/testwish.c: Emacs stuff. * src/bin/ndutils/GeomtoNoff.c: Make it work for lists and insts, fix toNoffNPolyList() (did modify stuff instead of copying). * src/bin/ndutils/Clip.h: Bool data type. * src/lib/gprim/npolylist/nplcreate.c: CR_POINT: homogeneous component is now at index 0 for ND stuff. * src/lib/gprim/npolylist/nplcopy.c: Only copy per-vertex colour if they are present. * src/lib/gprim/geom/geomstream.c: GeomStreamOut(): _always_ surround geometries by braces, some geometries (INSTs) have a variable number of "sections" which may be there or not. * src/bin/geomview/common/worldio.c: save_dgeom_geom(): only decrease the pool-level is wrap == true. * src/lib/oogl/refcomm/streampool.c: PoolIncLevel(): debugging code. 2007-04-09 Claus-Justus Heine * src/lib/geometry/ntransobj/ntransobj.c: Forgot the closing brace. * src/bin/ndutils/GeomtoNoff.c: Try to support Inst objects. * src/lib/geomutil/crayplutil/craySkel.c: cray_skel_UseFColor(): allocation bug. * src/bin/crayola/callbacks.c, src/bin/geomview/common/lispext.c: Stringe geom-ids have to be quoted, they might contain spaces. * doc/geomview.texi, src/lib/gprim/inst/inststream.c: Allow texture transform in the on-disk format. * src/lib/gprim/inst/instcreate.c: InstCopy(): need to initialize txtlist. * m4/check-package.m4: Some more m4 fixes. 2007-04-08 Claus-Justus Heine * data/Makefile.am: Add moebius.skel * src/bin/crayola/callbacks.c: Cosmetics. * src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skelpick.c: Pick related fixes. * src/lib/geomutil/crayplutil/Makefile.am, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/craySkel.c, src/lib/geomutil/crayplutil/crayola.c: Some smaller fixes + support for SKEL objects. 2007-04-07 Claus-Justus Heine * m4/withtool.m4: Fix empty path issue in GV_PATH_PROG (dirname perl == ., not empty). * configure.ac: Make sure to use new CHECK_PACKAGE stuff. * src/lib/geomutil/crayplutil/crayMesh.c, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/crayQuad.c: Colouring edge picks should really only colour the edge. Fix that. MISSING: colouring of SKEL objects. * doc/version.texi, src/bin/NDview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/labeler/Makefile.am, src/bin/ndutils/Makefile.am: Make sure to use new CHECK_PACKAGE stuff. * src/bin/crayola/callbacks.c: Cosmetics. * src/bin/cplxview/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am: Use new CHECK_PACKAGE() stuff etc. * src/bin/example/Makefile.am: XFORMS_ALL_INCLUDES already contains ${X_CFLAGS} * m4/check-package.m4, m4/geomview.m4: FreeBSD seems to work now (with this emodule) * m4/check-package.m4: Cosmetics. * m4/check-package.m4, src/bin/example/Makefile.am: We need to be a little bit more careful when checking for packages; Linux is not the world. * src/bin/crayola/Makefile.am, src/bin/crayola/tkcrayola.c: Fix checking for tcl/tk headers. * Makefile.am, m4/lf_local.m4: Fix header link & install issue for auto-generated headers. 2007-04-06 Claus-Justus Heine * src/bin/cplxview/Makefile.am, src/bin/example/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/ndutils/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am: Fix include path for private headers. * m4/check-package.m4, m4/geomview.m4: Fix include path stuff for tcl and geomview * src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c: Fix faulty alloca #ifdef's * src/lib/shade/image.c: Need to include signal.h * configure.ac: Fix --help texts. * src/bin/geomview/common/main.c, src/bin/togeomview/togeomview.c, src/bin/geomview/common/comm.c, src/bin/geomview/geomview.1gv, doc/geomview.texi: Support IPv4/v6 sockets. Somewhat dangerous, but so what. * src/bin/geomview/x11/gvcamui.c: Remove spaces from version string. * src/lib/oogl/refcomm/streampool.c: Cosmetics. * configure.ac, src/bin/geomview/common/comm.c, src/bin/geomview/common/main.c, src/bin/togeomview/togeomview.c: Try to support IPv4/v6 sockets. * src/bin/geomutil/math2oogl/math2oogl.c, src/lib/oogl/refcomm/streampool.c: Cosmetics: use PF_xxx insteadof AF_xxx as argument to connect. 2007-04-05 Claus-Justus Heine * src/bin/crayola/callbacks.c, src/bin/crayola/tkcrayola.c: Replace the functionality of Tcl_CreateFileHandler() by polling via timer events. * src/bin/cplxview/.cvsignore: Add .geomview. * src/bin/flythrough/data/Makefile.am: EXTRA_DIST stuff. * src/bin/geomview/common/comm.c: Typo. * src/bin/geomview/x11/gvmain.c: Local variables section. 2007-04-04 Claus-Justus Heine * src/lib/oogl/refcomm/streampool.c: HandleReferringTo(): ref-count cleanups introduced some bugs which made it impossible to read from a named pipe, fix that (always return with a handle if the file could be opened, even when it does not have (yet) data available). * data/Makefile.am: dodec.vec belongs to cplxview. * src/bin/nose/nose.c: Fix some compiler warnings. 2007-04-03 Claus-Justus Heine * src/bin/flythrough/Makefile.am, src/bin/flythrough/data/Makefile.am: Move flythrough data to flythrough emodule. * src/bin/flythrough/data/.cvsignore: Add Makefile[.in] * data/groups/equi.1.gv, data/groups/equi.2.gv, data/groups/equi.3.gv, data/groups/equi.4.gv, data/groups/loop.1.gv, data/groups/loop.2.gv, data/groups/loop.3.gv, data/groups/loop.4.gv, data/groups/quart.1.gv, data/groups/quart.2.gv, data/groups/quart.3.gv, data/groups/quart.4.gv, data/Makefile.am, data/geom/dodec.vect, data/geom/flythrough_diagram.gv, data/groups/br4.0.tlist, data/groups/br4.1.tlist, data/groups/br4.2.tlist, data/groups/br4.3.tlist, data/groups/dir.1.gv, data/groups/dir.2.gv, data/groups/dir.3.gv, data/groups/dir.4.gv: Move flythrough data to flythrough emodule. * src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am, src/bin/example/Makefile.am, src/bin/NDview/Makefile.am, src/bin/cplxview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/ndutils/Makefile.am: Add path to X11 include files via X_CFLAGS. * src/lib/gprim/geom/Makefile.am: OPENGLINCLUDE without trailing s. * src/lib/gprim/geom/geomclass.h: free-list fix. * src/lib/gprim/geom/bsptree.c, src/lib/mg/opengl/mgopengldraw.c: Fix a compiler warning. * src/lib/mib/Makefile.am: Use X_CFLAGS for the proper location of the X11-headers. * src/lib/oogl/util/malloc-debug.c: Only use malloc.h and mallinfo() when found by configure. * src/lib/shade/image.c: compressBound() is not always available, replace by a macro in that case. * src/lib/geometry/hpointn/hpointn.h, src/lib/geometry/transformn/transformn.h, src/lib/oogl/util/freelist.h: Fix w.r.t. to local/extern/declaration only free-lists. * src/lib/geometry/hpoint3/Makefile.am, src/lib/geometry/hpointn/Makefile.am: Do not create empty archives. * src/bin/geomview/x11/Makefile.am, src/bin/labeler/Makefile.am, src/lib/mg/x11/Makefile.am: Use X_CFLAGS; on older systems the X11 headers are still below X11R6/include/ * configure.ac: Do not try to generate empty archives, this is not supported on all platforms. Check for compressBound() if zlib is found (then it is pre-1.2.x). Check for malloc.h and mallinfo() (debugging only). * data/shaders/Makefile.am: Forgot to add .sdl files to clean-local: * configure.ac: AC_CHECK_TYPES takes a comma separated list. Gnah. Autoconf is really inconsistent. 2007-04-02 Claus-Justus Heine * src/bin/nose/nose.c: Fix the nose emodule; need to use IOBFILEs not FILEs. * src/bin/example/.cvsignore, src/bin/labeler/.cvsignore: Ignore .geomview. * src/bin/example/Makefile.am: Typo. * src/bin/geomview/common/event.c: Keyboard short-cuts for help browsers (html/pdf). * src/bin/NDview/Makefile.am: EXTRA_DIST was doubly defined. 2007-04-01 Claus-Justus Heine * doc/geomview.texi: Finish the docs for (ui-html-browser ......... * src/bin/geomview/common/help.c, Makefile.am, configure.ac, geomview.sh, src/Makefile.am, src/bin/geomview/common/Makefile.am, src/bin/geomview/common/ui.h, src/bin/geomview/geomview.1gv, src/bin/geomview/x11/gvmnpanel.c: Add a real "Help" button the the main-menu; the user manual may be viewed by external browsers (either PDF or HTML, browsers are configurable). * src/lib/oogl/lisp/lisp.c: Fix an ugliness. * doc/geomview.texi: Document (ui-html-browser...) and (ui-pdf-viewer...) configuration commands. * src/bin/geomview/x11/gvcredits.c, src/bin/geomview/x11/interface/Credits.mib: Convert the "credits" stuff into an "about" panel, add myself and the others from the README. * src/bin/geomview/x11/Makefile.am: Use %Y format for date, not %y. * src/lib/mib/mibload.c: Cosmetics. * src/bin/geomview/x11/gvcredits.c: Add myself. * src/bin/geomview/x11/gvui.c, src/bin/geomview/common/lang.c, src/bin/geomview/common/lang.h, src/bin/geomview/x11/gvmnpanel.c: Defined a (ui-motion ...) command to give access to the motion menu through GCL. * doc/geomview.texi, doc/version.texi: Document new (ui-motion...) GCL command. * src/bin/NDview/.cvsignore, src/bin/NDview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/labeler/Makefile.am, src/bin/ndutils/.cvsignore, src/bin/ndutils/Makefile.am: --enable-[local-emodule,geomview-query] support. * src/bin/flythrough/.cvsignore, src/bin/ginsu/.cvsignore, src/bin/graffiti/.cvsignore, src/bin/hinge/.cvsignore, src/bin/stereo/.cvsignore, src/bin/sweep/.cvsignore, src/bin/tackdown/.cvsignore, src/bin/transformer/.cvsignore: Ignore .geomview. * src/bin/hinge/Makefile.am: Typo. * src/bin/cplxview/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am: Support the --enable-[local-emodule,geomview-query] switches. * data/Makefile.am: Move Hinge... objects to gvemodules-xforms * data/geom/HingeCube, data/geom/HingeDiamond, data/geom/HingeDodec, data/geom/HingeLongcube, data/geom/HingeTetra, data/geom/HingeTriangle: Moved to gvemodules-xforms/src/hinge/ * src/bin/example/Makefile.am: Changes w.r.t. to template-like automake stuff. * src/bin/example/Makefile.am: Use abs_builddir as path to the executable for the local .geomview emodule definition. * src/bin/crayola/Makefile.am: Generate .geomview for local testing (without the need to install the stuff). * src/bin/crayola/.cvsignore: Ignore .geomview. * m4/geomview.m4: Fix help text (kill reference to "example" emodule). * src/lib/gprim/geom/Makefile.am: bsptree.c needs the correct path to the glu.h header file 'cause it is using the GLU tesselator for complicated polygons. 2007-03-24 Claus-Justus Heine * NEWS, doc/geomview.texi: Docment most recent translucency progress (by means of the GLU tesselator). * src/lib/gprim/geom/bsptree.c: Use a very large floating point tolerance (1e-3). This still seems to give good results in most cases, and prevents consumption of tremendous amounts of memory for translucent ND-objects and for Adrian's fancy self-intersecting polygons. * src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/geomclass.h, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c: Various ND-viewing translucency fixes; the stuff was broken again. Gnah. * src/lib/oogl/util/dbllist.h: New function DblListMove(): move the entire list from one head to another (this implies adjusting the back pointers to the list head as well 'cause it is a doubly linked list). * src/lib/mg/common/mg.c: Fix of a very silly beginners bug. What a shame. 2007-03-23 Claus-Justus Heine * src/lib/mg/opengl/mgopengldraw.c: Clean up of the "tricky" polygon code. * src/lib/gprim/geom/bsptree.c: Give the GLU tesselator the (already computed) normal. * src/lib/gprim/geom/bsptree.c: Use the GLU tesselator for non-convex quadrilaterals and for all polygons with more than 4 vertices. Should still need some performance tuning (e.g. we should pass the polygon normal to the tesselator etc.) * src/lib/gprim/geom/bsptree.c: Untested "#if 0"ed GLU tesselation for non-convex or non-flat polygons. * configure.ac, src/lib/gprim/geom/bsptree.c, src/lib/mg/opengl/mgopengldraw.c: Define HAVE_LIBGLU is that library is actually there, only compile trickypolygon() if GLU is found. The stuff still needs cleanup. The first attempt at the combine callback was really incomplete (textures, colors etc); and it could probably be sped up a little bit. First attempts to use the GLU tesselator for the BSP-tree stuff. * src/lib/gprim/discgrp/Makefile.am, src/lib/gprim/discgrp/discgrp.5gv: Resurrect the discgrp manual page. * data/NDview/cplxview/.cvsignore, data/NDview/cplxview/Makefile.am: Compose an cplxview emodule. * data/Makefile.am: Move cplxviewdata to that module. * data/NDview/.cvsignore, data/NDview/Makefile.am: Move NDview data to the nd-view module where it belongs to. * src/bin/nose/Makefile.am: Typos. * data/Makefile.am: Move NDview data to NDview module where it belongs to. * configure.ac: Get rid of "foreign" automake flag. * README, configure.ac, src/bin/Makefile.am: Add nose emodule. * src/bin/geomutil/math2oogl/Makefile.am: Add man-page to EXTRA_DIST. * src/bin/nose/.cvsignore, src/bin/nose/Makefile.am, src/bin/nose/nose.1gv, src/bin/nose/nose.c: Nose module / example, debugging for picking. * m4/check-package.m4, m4/geomview.m4: Writing autoconf test is really a little bit complicated ... * m4/geomview.m4: Check also in standard places for geomview include files. 2007-03-22 Claus-Justus Heine * doc/geomview.texi, doc/version.texi: Version bumped to 1.9.0 * src/lib/geomutil/Makefile.am, src/lib/geomutil/bdy/Makefile.am, src/lib/geomutil/plutil/Makefile.am, src/lib/oogl/wa/Makefile.am: Man-page move (NR -> NRgv). * doc/Makefile.am: Man page update. * doc/gvplot.txt: This really is README.gvplot. * src/lib/Makefile.am: Versioning. * src/bin/togeomview/Makefile.am, doc/geomview.5gv, doc/lisp.3gv, doc/oogl.5gv, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am, src/bin/example/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/geomutil/bdy/Makefile.am, src/bin/geomutil/clip/Makefile.am, src/bin/geomutil/hvectext/Makefile.am, src/bin/geomutil/oogl2rib/Makefile.am, src/bin/geomutil/oogl2vrml/Makefile.am, src/bin/geomutil/plutil/Makefile.am, src/bin/geomutil/ucd/Makefile.am, src/bin/geomutil/vrml2oogl/Makefile.am, src/bin/geomview/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/sweep/Makefile.am, doc/Makefile.am, src/bin/animate/Makefile.am, src/bin/cplxview/Makefile.am, src/bin/crayola/Makefile.am, src/lib/geomutil/bdy/bdy.3gv, src/lib/geomutil/plutil/anytopl.3gv, src/lib/geomutil/plutil/plcombine.3gv, src/lib/geomutil/plutil/plconsol.3gv, src/lib/oogl/wa/fsaparse.3gv, src/bin/geomview/geomview.1gv, src/bin/ginsu/ginsu.1gv, src/bin/graffiti/graffiti.1gv, src/bin/hinge/hinge.1gv, src/bin/sweep/sweep.1gv, src/bin/sweep/sweep.3gv, src/bin/tackdown/tackdown.1gv, src/bin/togeomview/togeomview.1gv, src/bin/transformer/transformer.1gv, src/lib/geomutil/geomutil.3gv, src/bin/geomutil/clip/clip.1gv, src/bin/geomutil/hvectext/hvectext.1gv, src/bin/geomutil/math2oogl/OOGL.m.txt, src/bin/geomutil/math2oogl/math2oogl.1gv, src/bin/geomutil/oogl2rib/oogl2rib.1gv, src/bin/geomutil/oogl2vrml/oogl2vrml.1gv, src/bin/geomutil/plutil/anytooff.1gv, src/bin/geomutil/plutil/bez2mesh.1gv, src/bin/geomutil/plutil/offconsol.1gv, src/bin/geomutil/plutil/polymerge.1gv, src/bin/geomutil/ucd/anytoucd.1gv, src/bin/geomutil/ucd/ucdtooff.1gv, src/bin/geomutil/vrml2oogl/vrml2oogl.1gv, src/bin/animate/animate.1gv, src/bin/cplxview/cplxview.1gv, src/bin/crayola/crayola.1gv, src/bin/example/example.1gv, src/bin/flythrough/flythrough.1gv, src/bin/geomutil/bdy/bdy.1gv, src/lib/geomutil/bdy/bdy.3, src/lib/geomutil/plutil/anytopl.3, src/lib/geomutil/plutil/plcombine.3, src/lib/geomutil/plutil/plconsol.3, src/lib/oogl/wa/fsaparse.3, src/lib/geomutil/geomutil.3, src/bin/tackdown/tackdown.1, src/bin/togeomview/togeomview.1, src/bin/transformer/transformer.1, src/bin/geomview/geomview.1, src/bin/ginsu/ginsu.1, src/bin/graffiti/graffiti.1, src/bin/hinge/hinge.1, src/bin/sweep/sweep.1, src/bin/sweep/sweep.3, src/bin/geomutil/plutil/bez2mesh.1, src/bin/geomutil/plutil/offconsol.1, src/bin/geomutil/plutil/polymerge.1, src/bin/geomutil/ucd/anytoucd.1, src/bin/geomutil/ucd/ucdtooff.1, src/bin/geomutil/vrml2oogl/vrml2oogl.1, src/bin/geomutil/oogl2rib/oogl2rib.1, src/bin/geomutil/oogl2vrml/oogl2vrml.1, src/bin/geomutil/plutil/anytooff.1, src/bin/geomutil/hvectext/hvectext.1, src/bin/geomutil/maple2oogl/Makefile.am, src/bin/geomutil/math2oogl/Makefile.am, src/bin/geomutil/math2oogl/math2oogl.1, src/bin/geomutil/bdy/bdy.1, src/bin/geomutil/clip/clip.1, src/bin/flythrough/flythrough.1, src/bin/example/example.1, src/bin/cplxview/cplxview.1, src/bin/crayola/crayola.1, doc/oogl.5, src/bin/animate/animate.1, doc/geomview.5, doc/lisp.3: Give all manual pages a gv suffix, some of the names are just too short. * doc/README.gvplot: Initial revision. * .cvsignore: Blah. * src/lib/Makefile.am: Versioning. * doc/version.texi: Update. * doc/Makefile.am: Use globally defined docdir. * README: Update. * configure.ac: No longer use /usr/local/Geomview/ as default prefix. * NEWS: Update. * m4/geomview.m4: Fix version check. Move most of the generic autoconf initialization to the GV_INIT_GEOMVIEW() macro. * NEWS, configure.ac: Call the beast 1.9.0 * m4/geomview.m4: Small fixes (check for -lm, math.h, other minor stuff). * m4/geomview.m4, m4/set-prefix.m4: Some fine-tuning * src/bin/example/Makefile.am: Emodule definition stuff. * README: Cosmetics. * geomview.sh: Add $HOME to the search path for emodule definitions. * data/shaders/Makefile.am: Add blue-moon compiled shaders to EXTRA_DIST. * src/lib/oogl/util/Makefile.am: Add freelist.h to sources. * m4/geomview.m4: Feature local installation. * m4/check-package.m4, m4/geomview.m4, src/bin/example/Makefile.am: Autoconf madness. * src/bin/cplxview/Makefile.am, src/bin/example/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am: Separate emodules, using xforms library. * src/bin/crayola/Makefile.am: Add man-pages to EXTRA_DIST. * configure.ac, src/bin/Makefile.am: Move xforms modules and Tcl/Tk modules to the separate packages gvemod-ndview gvemodules-xforms gvemodules-tcltk * src/bin/crayola/Makefile.am, src/bin/labeler/Makefile.am: External gvemodules-xforms and gvemodules-tcltk packages. 2007-03-21 Claus-Justus Heine * src/bin/NDview/Makefile.am, src/bin/ndutils/Makefile.am: Emodule strip-off should be finished now. * src/bin/ndutils/GeomExtentDirection.c: Cosmetics. * Makefile.am: Also install the private header files to enable stripping off emodules into separate package; private header files go to PKGINCLUDEDIR/private/ * src/bin/Makefile.am: Remove NDview and ndutils, moved to a separate package. * doc/geomview.texi: Add some more cross-references for GCL commands. * doc/geomview.texi: Convert the GCL reference into subsections; the stuff can now be referenced and there is a menu node for each command. * doc/geomview.texi: Cosmetics * doc/geomview.texi: Forgot a closing bracket. * doc/geomview.texi, doc/version.texi, src/bin/geomview/common/comm.c: New command (hdelete [type] name) which can be used to actually delete a named global handle. * src/lib/gprim/geom/delete.c, src/lib/oogl/refcomm/handle.c: HandleRefIterate(), HandlePoolIterate() were not safe w.r.t. to the deletion of handles. Fix that. * src/bin/geomview/common/comm.c: commandclose(): should we really keep Pools with command-language? ATM I'm calling PoolDelete(). Mmmh. * src/bin/geomview/common/worldio.c: Lwrite(): also delete the tempoaray pool. * src/bin/geomview/common/lang.c: Lwrite_handle(): don't forget to delete the temporary pool. * src/bin/geomview/common/drawer.c: Lwrite_comments(): also delete the temporary pool. What else. * src/bin/geomview/common/comm.c: Slight changes for reading from command strings. * src/lib/oogl/refcomm/streampool.c: HandleReferringTo(): accessing a handle via ": blahhandle" automatically converts "blahhandle" into a global one. PoolClose(): revert back to not deleting the closed Pool. But maybe we should get rid of all the opened emodule pools nevertheless ... * src/lib/oogl/refcomm/handleP.h: Move the list-node to the top of the structure; this way (hack!) we can use the double-list node for the free-list without overwriting the "deleted" tag. * src/lib/oogl/refcomm/handle.c: HandleCreateGlobal(): do not reset the attached object when converting a temporary handle to a permanent one. * src/lib/gprim/geom/geomstream.c: GeomInvokeTranslator(): do not forget to really delete the temporary pool. * src/bin/geomview/x11/gvsave.c: PoolClose() takes care of stdout/stdin for itself. * src/lib/gprim/discgrp/dgclass.c, src/lib/gprim/discgrp/dgcreate.c, src/lib/gprim/discgrp/dgstream.c, src/lib/gprim/discgrp/discgrp.h, src/lib/gprim/discgrp/discgrpP.h: Sanitize the handling of geom, camgeom, ddgeom and their associated handles. Define a Get() method, so maniview no longer needs to access private data-structures. * configure.ac, src/lib/oogl/util/porting.h: Should use AC_CHECK_DECLS() before defining proto-types. The mere fact the function does not exist as a symbol does not mean that it is not declared. * m4/geomview.m4: Use GeomGet()/GeomSet() instead of accessing private data-structures. Make sure the damn stuff compiles as external module, outside the Geomview source-tree. * m4/geomview.m4: Fix unbalanced if-fi * Makefile.am, configure.ac, data/shaders/Makefile.am, geomview.sh, m4/geomview.m4, src/Makefile.am: Build system fixes. * m4/geomview.m4: Optionally check for the version of Geomview. * src/bin/NDview/Makefile.am: Cosmetics. * m4/withtool.m4: CHECK_PROG/PATH_PROG duality. * m4/withtool.m4: Absolute/relative path-name support. 2007-03-20 Claus-Justus Heine * m4/withtool.m4, m4/geomview.m4: Initial revision. * src/lib/mg/opengl/mgopengldraw.c: Back-face culling cannot work with transparency, so disable it while drawing translucent facets. * src/lib/gprim/geom/geomclass.h, src/lib/gprim/inst/instcreate.c, src/lib/oogl/lisp/Makefile.am, src/lib/oogl/lisp/lisp.c, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/util/Headers, src/lib/oogl/util/freelist.h, src/bin/geomview/common/lispext.c, src/bin/geomview/common/lispext.h, src/lib/geometry/hpointn/hpointn.h, src/lib/geometry/ntransobj/ntransobj.c, src/lib/geometry/transformn/transformn.h, src/lib/geometry/transobj/transobj.c, src/lib/gprim/geom/delete.c: Implement a simplistic free-list approach for small objects which are allocated/deallocated very often. * src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/geomclass.h: Handle tagging of appearance and the necessary per-node data madness more efficiently (i.e. do _not_ allocate and check for per-node data if transparency is not enabled). * src/lib/mg/common/mgP.h: Cosmetics. * src/lib/shade/texture.c: TxMerge() did not correctly increase the ref.-count in all cases. * src/lib/oogl/util/ooglutil.h: Fix memory debug definitions. * src/lib/mg/common/mg.c: Don't forget to set ap->tx to NULL after calling TxDelete(). * src/lib/geometry/transobj/transobj.c: TransStreamIn(): TransObjStreamIn() can (successfully) return with an empty handle, in which case we must not try to access the (non-existing) TransObj. * src/bin/geomview/common/comm.c: TransObj handling had a memory leak. * src/bin/NDview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/labeler/Makefile.am, src/bin/ndutils/Makefile.am, geomview.sh: Adjust environment variables in preparation for Orrery and maniview autoconf revision. * configure.ac: Fix debug malloc definitions. * configure.ac, data/shaders/Makefile.am: Check for shader compilers sdrc (Pixie) and shaderdl (3Delight). Luckily Aqsis, Pixie and 3Delight produce shader files with different suffixes. * data/shaders/GVblendconstant.sl, data/shaders/GVblendplastic.sl, data/shaders/GVdecalconstant.sl, data/shaders/GVdecalplastic.sl, data/shaders/GVmodulateconstant.sl, data/shaders/GVmodulateplastic.sl, data/shaders/GVreplaceconstant.sl, data/shaders/GVreplaceplastic.sl: Use texture(..., "width", 0.0); at least aqsis otherwise produces textures which are just overblurred. 2007-03-19 Claus-Justus Heine * doc/geomview.texi: Image object doc fixes. * src/lib/gprim/sphere/spherecreate.c: Typo (CR_SPHERETEX -> CR_SPHERETX) * src/lib/gprim/sphere/spherecreate.c: Undo previous commit. * src/lib/shade/image.c, src/lib/gprim/sphere/spherecreate.c: Fix handling of raw image data. * src/bin/geomutil/maple2oogl/README.gvplot, src/bin/geomutil/maple2oogl/gvplot.mapleV8, src/bin/geomutil/maple2oogl/gvplot.mws, src/bin/geomutil/maple2oogl/savegvplot.mws: Most documentation. * src/bin/geomview/common/drawer.h, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/transform.h, src/bin/geomview/common/drawer.c: ND-fixes. 2007-03-18 Claus-Justus Heine * configure.ac, doc/geomview.texi, doc/version.texi, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/bezier/bezdraw.c, src/lib/gprim/bezier/bezierP.h, src/lib/gprim/bezier/bezload.c, src/lib/gprim/bezier/bezsave.c, src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/geom/geom.h, src/lib/gprim/geom/geomstream.c, src/lib/gprim/geom/iterate.c, src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instdraw.c, src/lib/gprim/mesh/meshP.h, src/lib/gprim/mesh/meshcopy.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshload.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/ndmesh/ndmeshP.h, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plsave.c, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/sphere/sphereP.h, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/sphere/spheredice.c, src/lib/gprim/sphere/sphereload.c, src/lib/gprim/sphere/spheresave.c, src/lib/mg/common/mg.c, src/lib/mg/common/mg.h, src/lib/mg/common/mgP.h, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopenglmesh.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/oogl/util/create.h, src/lib/shade/appearance.h: Support for textured spheres/define TxST structure + transforms, support for texture transform stacks. * src/bin/geomview/common/worldio.c: Comment/cosmetics. * Makefile.am: Use absolute path-names for build-dir geomview script. 2007-03-16 Claus-Justus Heine * src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/ps/mgps.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/x11/mgx11.c, src/lib/mg/buf/mgbuf.c, src/lib/mg/common/mg.c, src/lib/mg/common/mg.h, src/lib/mg/common/mgP.h, src/lib/mg/opengl/mgopengl.c: Prepare for texture transform stacks to support texturing of objects pasted together via INSTs and TLists. * src/lib/gprim/sphere/spherecreate.c: Compilation fix. * src/lib/gprim/sphere/sphereP.h: Get rid of a compiler warning. * doc/version.texi: This file should not be kept in the CVS. * src/lib/gprim/sphere/spherecreate.c: Start defining texture transformations. * src/lib/gprim/sphere/sphere.h, src/lib/gprim/sphere/sphereP.h, src/lib/gprim/sphere/sphereclass.c, src/lib/gprim/sphere/spherecreate.c, configure.ac, src/lib/gprim/sphere/Makefile.am: Optionally use a polar mesh for drawing spheres, should also make it much easier to define spheres with textures. * src/lib/gprim/bezier/bezdice.c: BSP-tree invalidation now done via call-back. * src/lib/gprim/sphere/spheredice.c, src/lib/gprim/sphere/spheredraw.c: Initial revision. * src/lib/mg/rib/mgribdraw.c: Fix textured beziers (up-side down issue). * src/lib/gprim/bezier/bezdice.c: Cosmetics. * src/lib/mg/opengl/mgopenglmesh.c: Turn-off texturing before drawing edges, otherwise at least GL_REPLACE leads to the wrong colors (for the edges). * src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/event.c, src/bin/geomview/common/lights.c, src/bin/geomview/common/rman.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/transform.h, src/bin/geomview/common/ui.h, src/bin/geomview/common/worldio.c: Try to be a little bit more consistent in the choice of data-types in some places. * src/lib/gprim/bezier/bezbound.c: Fix bbox for pdim == 4 with 3d drawing. * src/lib/shade/texture.c, src/lib/shade/appearance.h: tex->background really is only RGB, _not_ RGBA (see glTexEnvf(3)). * src/lib/shade/apstream.c, src/lib/shade/light.c: Use 8 digits for output of float. * src/lib/mg/opengl/mgopenglshade.c: mgopengl_needtexture(): always load tex->tfm, even if the texture in the cache is otherwise identical to the desired texture. * src/lib/mg/common/mgtexture.c: mg_same_texture(): tex->background is only relevant for tex->apply == blend. 2007-03-15 Claus-Justus Heine * src/lib/gprim/sphere/spherecreate.c: Cosmetics. * src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgribtoken.h: Debugging, correctly draw flat shaded stuff (i.e. emit per-vertex normals in this case). Shading logic was broken in mgribmesh.c and mgribdraw.c. Leave the texture clipping to RiMakeTexture(). Disable texture alpha-channel when transparency is not enabled (exception GL_BLEND, cause the the alpha channel of the texture only influences the colouring, not the transparency). * doc/version.texi: Update, this file does not belong to the CVS. * data/shaders/GVblendconstant.sl, data/shaders/GVblendplastic.sl, data/shaders/GVdecalconstant.sl, data/shaders/GVmodulateconstant.sl, data/shaders/GVmodulateplastic.sl, data/shaders/GVreplaceplastic.sl, data/shaders/Makefile.am: Shader debugging, should work now, more or less. * data/shaders/GVreplaceconst.sl, data/shaders/GVreplaceconstant.sl: Renamed. * src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgribtoken.h: Further progress with texture and alpha-aware shaders. * doc/version.texi: Update. This file should not be in the CVS. * data/shaders/GVblendplastic.sl, data/shaders/GVdecalplastic.sl, data/shaders/GVmodulateplastic.sl, data/shaders/GVreplaceplastic.sl: Fixed some silly bugs. We still need some shaders which ignore the alpha channel if transparency is enabled; or give all of them another float parameter which is used to switch off the alpha channel. 2007-03-14 Claus-Justus Heine * configure.ac: Check for aqsl, the aqsis shader language compiler. * data/shaders/.cvsignore: Ignore Makefile.in. * data/Makefile.am: Conditionally compile shader sources for the Aqsis renderer. * data/shaders/Makefile.am: Initial revision; conditionally compile shader sources for the Aqsis renderer. * src/lib/gprim/geom/geomclass.h, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglmesh.c: Also honor the alpha channel provided by the texture. Do some restructering of mgopengl_bsptreerecursive(). * src/lib/shade/appearance.h: Comment stuff. * data/shaders/GVreplaceconst.sl, data/shaders/GVreplaceplastic.sl, data/shaders/GVblendconstant.sl, data/shaders/GVblendplastic.sl, data/shaders/GVdecalplastic.sl, data/shaders/GVmodulateconstant.sl, data/shaders/GVmodulateplastic.sl: Bring the stuff (hopefully) into accordance with the OpenGL docs (because this is what Geomview also uses). * src/bin/geomview/common/drawer.c, src/bin/geomview/common/transform.c: Hang the BSP-tree to dg->Lgeom, not dg->Item. Otherwise transformations would need special handling. * src/lib/mg/opengl/mgopenglP.h, src/lib/mg/opengl/mgopenglshade.c: Even for constantly shaded objects we should allow override of the alpha channel by material->diffuse[3]. Fix that. * src/lib/mg/opengl/mgopenglshade.c, src/lib/shade/appearance.h, src/lib/shade/texture.c: Implement "apply = replace" mode; texture color simply replaces the surface color. * data/shaders/rgbmaskpaintedconstant.sl, data/shaders/rgbmaskpaintedplastic.sl: Renamed * data/shaders/GVblendconstant.sl, data/shaders/GVblendplastic.sl, data/shaders/GVdecalconstant.sl, data/shaders/GVdecalplastic.sl, data/shaders/GVmodulateconstant.sl, data/shaders/GVmodulateplastic.sl: Initial revision. 2007-03-13 Claus-Justus Heine * doc/version.texi: Should not be in the CVS. * src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgrib.h, src/lib/mg/rib/mgribP.h, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgribtoken.h: Texture stuff seems to work. We need some shaders to actually implement texturing the same way as the OpenGL backend is doing it. * src/lib/mg/buf/mgbuf.c, src/lib/mg/common/mg.c, src/lib/mg/common/mg.h, src/lib/mg/opengl/mgopengl.c, src/lib/mg/ps/mgps.c, src/lib/mg/x11/mgx11.c: mgctxset() has now a return value: -1 on error, 0 on success. * data/shaders/rgbapaintedconstant.sl, data/shaders/rgbmaskpaintedconstant.sl: Initial revision. * src/lib/mg/rib/mgrib.c: Comment. * doc/version.texi: Update. This file should not be in the CVS. * configure.ac: Provide PATH_MAX. * src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribP.h, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgribtoken.h: Fiddle with texture stuff. * src/bin/geomview/common/rman.c: Undo a previous change. * src/lib/shade/image.c: Remove some unneeded variables. * data/shaders/rgbapaintedplastic.sl, data/shaders/rgbmaskpaintedplastic.sl, data/shaders/.cvsignore: Initial revision. 2007-03-12 Claus-Justus Heine * configure.ac, doc/geomview.texi, src/bin/geomview/common/rman.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribP.h, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgribtoken.h: Substantial progress in supporting textures with RenderMan. Not really complete yet. * src/lib/shade/appearance.h, src/lib/shade/image.c: New function ImgWriteFilter() to dump the image to disk through an external filter program (i.e. convert to tiff for RenderMan texture support). * configure.ac: Check for pamtotiff in anticipation of RenderMan texture support. * src/lib/shade/appearance.h, src/lib/shade/image.c: New globally defined functions ImgWritePGM() and ImgWritePNM(), in preparation for real RenderMan texture support. * doc/version.texi: Update. * src/lib/shade/image.c: Sanity checks for write_pmm/pgm. 2007-03-11 Claus-Justus Heine * src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgrib.c: Fix the (rudimentory) texture support. This really needs to be reworked. * src/lib/gprim/list/liststream.c: ListStreamOut(): Proper indent of inferior geometries. * src/lib/shade/image.c: Continue parsing, even if reading of specific channels fails. This increases the chance of skipping over broken binary data. * src/bin/geomview/common/worldio.c, src/lib/camera/camstream.c, src/lib/geometry/ntransobj/ntransobj.c, src/lib/geometry/transobj/transobj.c, src/lib/gprim/geom/geomstream.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/list/liststream.c, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/handle.h, src/lib/oogl/refcomm/handleP.h, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/refcomm/streampool.h, src/lib/shade/appearance.c, src/lib/shade/appearance.h, src/lib/shade/apstream.c, src/lib/shade/image.c, src/lib/shade/light.c, src/lib/shade/material.c, src/lib/shade/texture.c: Dump handles as handles if possible (but take care to dump every referenced object also). ppath fix for lists. Formatting of StreamOut() (proper -- or at least better -- indentation where possible). * doc/geomview.texi: Bring command line switches in sync with the stuff acutally supported, add some notes about translucency. * src/lib/gprim/inst/instmisc.c: No need to free bsptree->tree when transforming an INST. * src/lib/gprim/geom/bsptreeP.h: Delete the no longer needed structure component geomflags. * src/bin/geomview/geomview.1: Move -noopengl explanation closer to the other "-no..." options. * doc/geomview.texi, doc/version.texi: Document new image OOGL object. 2007-03-10 Claus-Justus Heine * src/lib/gprim/geom/draw.c: Undo faulty optimizations. Gnah. * src/lib/gprim/geom/geomclass.h: Protect GeomNodeDataByPath() and GeomNodeDataCreate() against an undefined (NULL) object path. * src/lib/camera/camera.c: Use the same bgcolor default as the GUI. * src/bin/geomview/common/main.c: Use 1.0/3.0 and leave it to the comiler to generate the best approximation ... * doc/geomview.texi, doc/version.texi: Start update of docs. * src/lib/shade/texture.c, src/lib/window/winstream.c, src/bin/geomview/common/comm.c, src/bin/geomview/common/lang.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/geomclass.h, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/quad/quaddraw.c, src/lib/shade/image.c: Get rid of some compiler warnings. * doc/Makefile.am: Install man-pages. * src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/draw.c: Tagged appearance logic was somewhat broken. * doc/Makefile.am: Remove geomview.1, oogl.5.man and geomview.5.man. * doc/geomview.1: generated from (and in) src/bin/geomview/ * doc/oogl.5.man: Just a duplicate of oogl.5 * doc/geomview.5.man: Just a duplicate of geomview.5 * src/bin/geomview/x11/gvcamui.c: ui_ppmglxsnapshot(): get rid of some unused variables. * src/lib/camera/camstream.c, src/lib/gprim/geom/geomstream.c, src/lib/window/winstream.c: Cleanup and unification w.r.t. to Handles; applies also to all other xxxStreamIn() routines. * src/lib/camera/camera.c: Handle handling cleanup, was maybe unnecessary, but the current code works. Also: A camera now (optionally) has a background image and a background color. IMHO those things do not belong to the mg-layer. It is questionabble, though, whether stuff like this belongs to the camera. * src/lib/camera/camera.h: New atributes: CAM_BGCOLOR, CAM_BGIMAGE, CAM_BGIMGHANDLE. A camera now (optionally) has a background image and a background color. IMHO those things do not belong to the mg-layer. It is questionabble, though, whether stuff like this belongs to the camera. * src/lib/camera/cameraP.h: A camera now (optionally) has a background image and a background color. IMHO those things do not belong to the mg-layer. It is questionabble, though, whether stuff like this belongs to the camera. * src/lib/window/window.c: Ref->handle has been replaced by a list of handles and is properly handled in RefInit() now. * src/lib/window/windowP.h: Get rid of the silly "long" data type. * src/lib/gprim/inst/instdraw.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c: BSP-tree cleanup: properly handle the case that a geometry can belong to several nodes in the object hierarchy (referenced through handles). * src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/bezier/bezdraw.c, src/lib/gprim/bezier/bezierP.h: Use a Handle to define callbacks for invalidating BSP-trees. The issue is that a geometry can belong to several nodes in the object hierarchy when it is referenced by handles, and hence can belong to several BSP-trees, and may have to be entered more than once to the same BSP-tree (with a different position or appearance). * src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/list/listP.h, src/lib/gprim/list/listcreate.c, src/lib/gprim/list/liststream.c: BSP-tree cleanup: can now live again with the standard HandleUpdRef() callback. * src/lib/gprim/inst/instmisc.c: Transform[To](): installed a 3d transform now leaves any ND-transform alone and vice-versa. Needed to allow for simplification in the top-level ND-drawing code in really_draw_view()@src/bin/geomview/common/drawer.c * src/lib/gprim/polylist/plcreate.c: PolyListCreate(): always delete the temporary projected polylist used to speed up ND-drawing. * src/lib/gprim/polylist/plcopy.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/polylistP.h: ND-drawing: allocate on demand an additional polylist; it is not necessary and inefficient to copy over the structure of the polylist on every draw. This way it has to be done only once. * src/lib/gprim/polylist/plsphere.c: Treat VERT_4D pl's as projective things in 3d. * src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/polylist/plcreate.c: BSPTree alloc/dealloc is done at a higher level now. * src/lib/gprim/mesh/meshcopy.c: Ansification. * src/bin/geomview/common/worldio.c, src/bin/geomview/common/space.c: Cosmetics. * src/bin/geomview/common/main.c: Remove unnecessary handle ops external declaration. * src/bin/geomview/common/comm.c: Image and appearance objects. Handle ref-count related fixes. * src/bin/geomview/common/lang.c, src/bin/geomview/common/lang.h, src/bin/geomview/common/lispext.c, src/bin/geomview/common/lispext.h: Image and appearance objects. * src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/ndshade.c, src/bin/geomview/common/transform.c: internal ND-view simplification * src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/bsptree.h, src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/geom/copy.c, src/lib/gprim/geom/create.c, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/geom.h, src/lib/gprim/geom/geomclass.h: BSP-tree stuff was broken: as geometries can be referenced by handles we need to take special precaution when attaching global data to geoms. * src/lib/oogl/util/Makefile.am, src/lib/oogl/util/Headers: Add dbllist.h header. * src/lib/oogl/util/ppopen.c: Program flow logic was broken. Fix that. * src/lib/oogl/util/create.h: Delete unused CR_HANDLE attribute. * src/lib/shade/Makefile.am, src/lib/shade/appearance.c, src/lib/shade/appearance.h, src/lib/shade/apstream.c: Strip off texture and material stuff. Allow defining global handles for appearances. * src/lib/geometry/ntransobj/ntransobj.c, src/lib/geometry/ntransobj/ntransobj.h, src/lib/geometry/transobj/transobj.c, src/lib/geometry/transobj/transobj.h, src/lib/oogl/refcomm/Makefile.am, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/handle.h, src/lib/oogl/refcomm/handleP.h, src/lib/oogl/refcomm/reference.c, src/lib/oogl/refcomm/reference.h, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/refcomm/streampool.h: Fix the deeply broken handle reference count stuff. Gnah. * src/lib/geometry/transform3/transform3.h: Cosmetics. 2007-03-09 Claus-Justus Heine * src/lib/gprim/bezier/bezbound.c, src/lib/gprim/inst/instbound.c, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/polylist/plbound.c, src/lib/gprim/quad/quadbound.c, src/lib/gprim/skel/skelbound.c, src/lib/gprim/vect/vectbound.c: Handle VERT_4D co-ordinates as homogeneous coords if no ND-transform is given. * src/lib/mg/common/mg.c, src/lib/mg/common/mgP.h, src/lib/mg/common/mgtexture.c, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopenglP.h, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglshade.c: Texture cleanup and some translucency changes. * src/lib/mg/buf/mgbufdraw.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/x11/mgx11draw.c: Copy with numerical instabilities which everting normals. * src/lib/mg/common/mg.h: Add a pointer to the current BSP-tree to mgNDctx, part of a larger BSP-tree cleanup. * src/lib/mg/rib/mgrib.c, src/lib/mg/x11/mgx11.c, src/lib/mg/buf/mgbuf.c: Return the new ap. There is just no point in returning the user specified ap pointer. * src/lib/gprim/comment/commentstream.c: Get rid of just another memory leak. * src/lib/gprim/comment/commentcreate.c: Cosmetics. * src/lib/geometry/transform3/tm3print.c: Change the output format. * src/lib/geometry/transformn/transformn.h: Slight changes, typos mostly. * src/lib/geometry/hpointn/hpointn.h: Typo. * src/lib/geometry/hpoint3/hpoint3.h: Support for denormalized linear combination. * src/lib/Makefile.am: link (optionally) with libz * configure.ac: false/true/bool definition. Also (optionally) check for zlib/bzlib. * src/lib/oogl/util/malloc-debug.c: Fix alloc size accounting. * src/lib/oogl/util/iobfutil.c, src/lib/oogl/util/iobuffer.h: Fix iobfcontext(); syntax error messages should work again now. * src/lib/shade/image.c, src/lib/shade/material.c, src/lib/shade/texture.c, src/lib/oogl/util/dbllist.h: Initial revision. 2007-02-19 Claus-Justus Heine * src/lib/mg/common/mgtexture.c: Add pngtopnm filter. 2007-02-17 Claus-Justus Heine * src/lib/mg/opengl/mgopengldraw.c: Merge Adrian Rossiter's changes for concave and self-intersecting polygons. 2007-02-16 Claus-Justus Heine * src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopengldraw.c: Fix logic concerning alpha blending. * src/lib/gprim/inst/instdraw.c: BSP-tree fixes. * src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/mesh/meshdraw.c: Change BSPTreePushAppearance(): appearances are only set when geom->ap_tagged != NULL. * src/lib/mg/common/mgtexture.c: Remove a crazy comment. * src/lib/shade/appearance.c: TxStreamOut(): fix file: -> alphafile bug. * src/bin/geomview/x11/gvcamui.c: Some cleanup w.r.t. to the logic of gv_no_opengl and the pre-processor symbols MGGL, MGOPENGL and MGX11. Also, `#define' gv_no_opengl to `true' if !(MGGL || MGOPENGL) to simplify some of the gv_no_opengl/MG... related conditionals. * src/lib/mg/common/mg.c: mg_untagappearance(): Only delete texture and light if the appearance slot is not currently in use; delete astk->texture, not ctx->astk->texture (copy and paste bug). * src/bin/geomview/x11/gvcamui.c: Remove and/or document some slightly confusing preprocessor constructs. * src/lib/gprim/inst/instdraw.c: Fix a BSP-tree related bug: do not loop over the transformation if when not adding to the tree, but just distributing the tree-handle to all sub-geometries (when running InstBSPTree(..., action = BSPTREE_CREATE), in contrast to action == BSPTREE_ADDGEOM). * configure.ac: Disable OSMesa because it just does not work, unluckily. 2007-02-15 Claus-Justus Heine * src/lib/mg/common/mgtexture.c: Support bzip2 for compression of texture files. * src/bin/NDview/NDdemo, src/bin/NDview/NDview: Remove invalid script interpreter * configure.ac: Get rid of the CONFIG_SUBDIR stuff. * configure.ac, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/interface/Save.mib: Implement a GLX off-screen snapshot by rendering into a GLX pixmap. The idea is that off-screen rendering does not suffer from partially obscured windows, screen-saver etc. * configure.ac: Gnah. Should read twice through my changes before committing. * configure.ac: Should check for glXAllocateMemoryMESA() not GLX_MESA_allocate_memory. * configure.ac, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/interface/Save.mib: Check for libOSMesa if we are using Mesa and re-enable ppmmesasnapshot() in gvcamui.c 2007-02-14 Claus-Justus Heine * src/lib/oogl/wa/wa.lex.c, src/lib/oogl/wa/wa.yacc.c, src/lib/oogl/wa/wa.yacc.h: Auto-generated. * src/lib/oogl/wa/Makefile.am: Split-out rule for lex.yy.c, otherwise a dependency for "all:" cannot be resolved. * src/bin/geomview/common/main.c, src/bin/geomview/common/main.h, src/bin/geomview/geomview.1, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvmain.c: Implement a -noopengl option. * Makefile.am, geomview.sh: --print-BLAH switches to figure out the location of the data directory etc. of an already installed geomview. * configure.ac: Cosmetics (some help strings and such). * src/lib/mg/common/mgtexture.c: Cosmetics. 2007-02-13 Claus-Justus Heine * src/lib/gprim/geom/geomstream.c: Get rid of the infamous "can't seek back for enough (on pipe?)" error message because it is no longer adequate and misleading. * src/lib/mg/rib/mgribdraw.c: Cosmetics. * src/lib/mg/opengl/mgopenglshade.c: Do the obvious fixes for tex_adequate(). * src/lib/mg/opengl/mgopengldraw.c: Fix texture handling during BSP-tree traversal. * doc/version.texi, doc/geomview.texi: Document "linear" texture option. * src/lib/gprim/geom/bsptree.c: Hack around round-off error w.r.t. to plane equations. * src/lib/gprim/list/listcreate.c: cosmetics. * src/lib/mg/common/mg.c: Fix lazy deletion of sticky (tagged) appearances. * src/lib/oogl/refcomm/handle.c: Cosmetics. * src/lib/mg/opengl/mgopenglmesh.c: Braces around && inside ||. * src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/polylist/pltransform.c, src/lib/gprim/quad/quadtransform.c: Handle NormalTransform() correctly. * src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instdraw.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/list/listP.h, src/lib/gprim/list/listcreate.c, src/lib/gprim/list/liststream.c: Invalidate the BSP-tree if any object underlying a handle changes. * src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/bsptreeP.h: Handle NormalTransform() correctly (i.e. use the dual of T). * src/lib/gprim/geom/replace.c: Call BSPTreeFreeTree(). * src/lib/gprim/bezier/bezdraw.c: Cleanup. * src/lib/geometry/transobj/transobj.c, src/lib/geometry/transform3/tm3adjoint.c, src/lib/geometry/transform3/tm3dual.c, src/lib/geometry/transform3/tm3invert.c: Cosmetics. * src/lib/geometry/point3/point3.h: Simplify NormalTransform(), add a comment stating that NormalTransform(Tdual, ...) should be called with the dual of T. * src/lib/geometry/ntransobj/ntransobj.c: Cosmetics. 2007-02-12 Claus-Justus Heine * src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/delete.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/list/listcreate.c, src/lib/gprim/mesh/meshdelete.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/quad/quaddelete.c: Move deletion of BSP-trees to GeomDelete(). 2007-02-10 Claus-Justus Heine * m4/lf_local.m4: Hopefully LF_LINK_HEADERS() works _NOW_ for in-path and VPATH builds. * m4/lf_local.m4: Undo a bug introduced previously by myself. 2007-02-09 Claus-Justus Heine * src/lib/gprim/ndmesh/ndmeshclass.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/npolylist/npldraw.c: Implement BSP-tree stuff for ND objects. Not tested. Needs testing. * src/lib/gprim/mesh/meshcreate.c: nu*nv, not nu+nv, fixing myself. * src/bin/geomview/common/drawer.c: Give every object accesible through the browser a BSP-tree. Transluceny is now correctly implemented for OpenGL (and RMAN, of course, as RMAN handles translucency by itself). Supported is a single translucent compound object (like the list of SaVI's coverage cones) which is drawn on a solid scene consisting of arbitrarily many objects. * src/bin/geomview/common/rman.c, src/bin/geomview/common/worldio.c: Small changes w.r.t. to unneeded (?FIXME) appearance copies * src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/bezier/bezclass.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/bezier/bezdraw.c, src/lib/gprim/geom/bsptree.c, src/lib/gprim/geom/bsptree.h, src/lib/gprim/geom/bsptreeP.h, src/lib/gprim/geom/create.c, src/lib/gprim/geom/dice.c, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/geom.h, src/lib/gprim/geom/geomclass.h, src/lib/gprim/inst/inst.h, src/lib/gprim/inst/instclass.c, src/lib/gprim/inst/instdraw.c, src/lib/gprim/list/listP.h, src/lib/gprim/list/listclass.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/mesh/mesh.h, src/lib/gprim/mesh/meshclass.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/mesh/meshevert.c, src/lib/gprim/polylist/plclass.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quad.h, src/lib/gprim/quad/quadclass.c: Support BSP-trees consisting of multiple geoms. * src/lib/oogl/refcomm/reference.c: The reference count should be an int, not a long. * src/lib/mg/buf/mgbuf.c, src/lib/mg/buf/mgbufdraw.c, src/lib/mg/common/mg.c, src/lib/mg/common/mg.h, src/lib/mg/common/mgP.h, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglmesh.c, src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/ps/mgps.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/ps/mgpswindows.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11shade.c: Introduce a "tagged" appearance which can safely be re-used while traversing a BSP-tree. Needed to implement BSP-trees for geoms consisting of multiple parts like lists and insts. * src/lib/gprim/sphere/spherecreate.c: Run GeomDecorate() to have the chance to define a sphere with an attached appearance. * src/lib/camera/cameraP.h, src/lib/geometry/geomtypes.h, src/lib/geometry/ntransobj/ntransobj.h, src/lib/geometry/transobj/transobj.h: Remove the semicolon from the end of REFERENCEFIELDS, just looks more natural when defining a derived "class". * src/lib/shade/appearance.c, src/lib/shade/appearance.h: Remove the semicolon from the end of REFERENCEFIELDS, just looks more natural when defining a derived "class". Introducde some "const" keywords in some places. * src/lib/window/windowP.h, src/lib/oogl/refcomm/handleP.h, src/lib/oogl/refcomm/reference.h: Remove the semicolon from the end of REFERENCEFIELDS, just looks more natural when defining a derived "class". * src/lib/pointlist/ptlMesh.c, src/lib/gprim/vect/vectP.h, src/lib/gprim/vect/vectcreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/vect/vectload.c, src/lib/gprim/vect/vectsphere.c, src/lib/gprim/quad/quadP.h, src/lib/gprim/quad/quadcopy.c, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadload.c, src/lib/gprim/quad/quadnormal.c, src/lib/gprim/quad/quadsave.c, src/lib/gprim/quad/quadtransform.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/plevert.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plnormal.c, src/lib/gprim/polylist/plsave.c, src/lib/gprim/polylist/pltransform.c, src/lib/gprim/polylist/polylist.h, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/ndmesh/ndmeshP.h, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/ndmesh/ndmeshpick.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/npolylist/npolylistP.h, src/lib/gprim/mesh/meshcopy.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshflag.h, src/lib/gprim/mesh/meshload.c, src/lib/gprim/mesh/meshnormal.c, src/lib/gprim/mesh/meshpick.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/mesh/meshsphere.c, src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/mesh/meshP.h, src/lib/gprim/bezier/bezier.h, src/lib/gprim/bezier/bezsphere.c, src/lib/gprim/bezier/bezsave.c, src/lib/gprim/bezier/bezpick.c, src/lib/gprim/bezier/bezload.c, src/lib/gprim/bezier/bezevert.c, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezierP.h, src/lib/gprim/lincoln/lincolnload.c, src/lib/geomutil/plutil/anytopl.c, src/lib/geomutil/plutil/plcombine.c, src/lib/geomutil/crayplutil/crayBezier.c, src/lib/geomutil/crayplutil/crayMesh.c, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/crayQuad.c, src/lib/geometry/cmodel/cmodel.c, src/bin/ndutils/GeomtoNoff.c, src/bin/ndutils/WithColor.c, src/bin/ndutils/clipoogl.c, src/bin/geomutil/ucd/anytoucd.c, src/bin/geomutil/oogl2vrml/oogl2vrml.c, src/bin/geomutil/oogl2vrml/oogl2vrml2.c, src/bin/geomutil/clip/clipoogl.c: Move some more flag values to geom->geomflags, kind of unification. 2007-02-04 Claus-Justus Heine * src/lib/gprim/bezier/bezbound.c: Treat VERT_4D bez's as homogeneous coords (undo my previous changes). 2007-01-29 Claus-Justus Heine * src/lib/aclib/obstack.c: Hack around exitfail and gettext, should compile now with cygwin. 2007-01-27 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c: setmark()/seekmark() has to take the ungetc() value into account. 2007-01-21 Claus-Justus Heine * src/bin/geomview/common/drawer.c: Reset "center-bbox" feature at reset. 2007-01-20 Claus-Justus Heine * src/bin/geomview/common/transform.c: Comment. * src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c: Remove unused variable warnings. 2007-01-15 Claus-Justus Heine * configure.ac, doc/version.texi, src/lib/aclib/obstack.c: Include obstack.c from glibc-2.5; my fault, thought obstack was implemented as a pure macro stuff. 2007-01-14 Claus-Justus Heine * configure.ac: Use "foreing" automake option to prevent the latest and greatest automake from complaining about using GNU extensions. 2007-01-08 Claus-Justus Heine * doc/version.texi, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skelsave.c, doc/geomview.texi: Allow per-vertex colors for SKEL filec, i.e. support a C[4][n]SKEL format. Document the change in the TeXInfo manual 2007-01-07 Claus-Justus Heine * src/lib/gprim/polylist/plnormal.c: New per-vertex normal computation was borken. 2007-01-06 Claus-Justus Heine * src/lib/gprim/geom/bsptree.c: SplitPolyNode(): v0 <-> v1 typo. 2007-01-04 Claus-Justus Heine * src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddelete.c, src/lib/gprim/quad/quaddraw.c: Remove some compiler warnings. * src/lib/gprim/polylist/plnormal.c: missing initialization bug (n_edges). 2007-01-03 Claus-Justus Heine * doc/geomview.texi, doc/version.texi: Fix VECT binary documentation bug and work around a figure cross-referencing bug in GNU makeinfo. 2007-01-02 Claus-Justus Heine * src/lib/gprim/geom/bsptree.c: Work around a strange "-fstrict-aliasing" comiler bug. At least I think it is a compiler bug ... 2006-12-28 Steve M. Robbins * ChangeLog, configure.ac: Fix probe for Tcl_CreateFileHandler to use ${TCL_ALL_LIB}, rather than "-ltcl". 2006-12-27 Steve M. Robbins * configure.ac: Use ${TCL_ALL_LIB}, not "-ltcl", to check for function Tcl_CreateFileHandler. 2006-11-05 Claus-Justus Heine * src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribP.h, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgribtoken.h: Rudimentary texture support; also scale points s.t. they remain visible even at large distances. Use "ReverseOrientation" to prevent the renderer from inverting explicitly specified normals. * src/lib/mg/ps/mgpstri.c: Point-plotting was broken. * src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribP.h: Make sure Push/PopAppearance is not called outsde WorldBegin/WorldEnd * configure.ac: Bump version to rc10. * NEWS: Document ND changes. * doc/version.texi: Update. 2006-11-04 Claus-Justus Heine * doc/geomview.texi: Picking does work now with ND viewing, so remove the note saying otherwise from the documentation. * doc/figs/tools.ps: Use a half-size screenshot. * src/bin/geomview/common/transform.c: Cosmetics. * src/lib/gprim/ndmesh/Makefile.am, src/lib/gprim/ndmesh/ndmesh.h, src/lib/gprim/ndmesh/ndmeshclass.c, src/lib/gprim/ndmesh/ndmeshpick.c: Native "picking" for ND-meshes. * src/lib/gprim/ndmesh/ndmeshbound.c: Bail out if meshd > 2. * src/lib/gprim/npolylist/Makefile.am, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/npolylist/nplpick.c: Add "pick" support. * src/lib/gprim/skel/skelpick.c: Remove an unused variable. * src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skelpick.c: Pick support for SKEL, just clone the vect code (skelpick.c contains a code fragment which seemingly was meant as a draft; however, the VECT code works and really just naturally carries "itself" over to the SKEL case). * src/lib/gprim/skel/skelload.c: Fix a 3d bug caused by moving the homogeneous component to index 0 in ND. * src/lib/gprim/mesh/meshpick.c, src/lib/gprim/polylist/plpick.c, src/lib/gprim/quad/quadpick.c, src/lib/gprim/vect/vectpick.c: Rename NTransPt3() to HPt3NTransPt3(). * src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/hpointn/hpointn.h: Rename NTransPt3() to HPt3NTransPt3(), new function HPtNNTransPt3(). * data/NDview/geom/klein4d.skel, data/geom/moebius.skel: Initial revision. * src/lib/gprim/quad/quadP.h, src/lib/gprim/quad/quadpick.c, src/lib/gprim/vect/vectP.h, src/lib/gprim/vect/vectpick.c: ND picking. * src/lib/gprim/geom/pick.c: Fix GenericPick() for ND picking. * src/lib/gprim/inst/instpick.c, src/lib/gprim/list/listpick.c: ND-pick support. * src/lib/gprim/npolylist/nplload.c: Homogeneous divisor sits at index 0 for ND vectors, fix that. * src/lib/gprim/polylist/plpick.c, src/lib/gprim/polylist/polylistP.h: ND-pick support. * src/lib/gprim/mesh/meshpick.c: Move some support functions to hpointn.c * src/lib/gprim/inst/instdraw.c: Cosmetics. * src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/hpointn/hpointn.h: New functions NTransPt3() and HPt3NTransHPt3() to support ND-picking. * src/lib/geometry/hpoint3/hpoint3.c: Remove a stray hash. * src/bin/geomview/common/transform.c: Forgot to delete an HPointN temporary. 2006-11-03 Claus-Justus Heine * src/lib/geometry/hpoint3/hpoint3b.c: Remove a stray hash * src/lib/gprim/list/listpick.c, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plpick.c, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/quad/quadP.h, src/lib/gprim/quad/quadpick.c, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelpick.c, src/lib/gprim/vect/vectP.h, src/lib/gprim/vect/vectpick.c, src/lib/gprim/bezier/bezier.h, src/lib/gprim/bezier/bezpick.c, src/lib/gprim/comment/commentclass.c, src/lib/gprim/discgrp/dgpick.c, src/lib/gprim/discgrp/discgrp.h, src/lib/gprim/discgrp/weeks_dirdom.c, src/lib/gprim/inst/instpick.c, src/lib/gprim/list/listP.h: Adapt to changed pick interface (ND-picking not yet working except for MESHes). * src/lib/gprim/mesh/mesh.h, src/lib/gprim/mesh/meshP.h, src/lib/gprim/mesh/meshpick.c: Support ND-picking. * src/bin/geomview/common/lights.c: Adapt to changed pick interface. * src/bin/geomview/common/event.c, src/lib/gprim/geom/geomclass.h, src/lib/gprim/geom/pick.c, src/lib/gprim/geom/pick.h, src/lib/gprim/geom/pickP.h: Support ND-picks. * src/bin/geomview/common/drawer.h, src/bin/geomview/common/transform.c: New function drawer_ND_CamView() which is the ND-equivalent for the CamView() function. Allow ND-picks in make-center_from_pick(). * src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/hpointn/hpointn.h: Use HPoint3 parameter-type instead of HPt3Coord * for some Pt4...() stuff. * src/lib/geometry/hpoint3/hpoint3.c: Remove HPt3Transform(). * src/lib/aclib/Headers, src/lib/aclib/Makefile.am: Symlink the obstack.h header for use by (e.g.) ndutils. * src/bin/ndutils/ColorPoint.c, src/bin/ndutils/TransformGeom.c, src/bin/ndutils/WithColor.c: Remove some variable decl which are no longer needed. * src/bin/geomview/common/ui.h: Missing proto-type for set_ui_wm_focus(). * src/bin/geomview/common/ui.c: Need to include transform.h for make_center_from_bbox(). 2006-10-30 Claus-Justus Heine * src/bin/ndutils/Clip.h, src/bin/ndutils/clip.c, src/bin/ndutils/clipoogl.c, src/lib/aclib/obstack.h: Use an obstack to clean up after ND clipping. 2006-10-29 Claus-Justus Heine * src/bin/NDview/NDdemo, src/bin/NDview/NDview, src/bin/geomview/common/drawer.c, src/bin/geomview/common/motion.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/transform.h, src/bin/geomview/common/ui.c, src/bin/geomview/x11/gvtoolui.c, src/bin/geomview/x11/gvui.c, src/bin/geomview/x11/interface/Tool.mib, src/bin/gvclock/gvclock.in: The "origin/bbox-center" keyword to transform and transform-incr was a bad idea. There is still a new button in the Tools-menu which translates the CENTER object to the currently selected geom's bounding box. * src/bin/geomview/common/comm.c: Document ntransform keyword in online-help for (read ...) command. * src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/inststream.c: HandleRegister() needs &inst->NDaxis, not inst->NDaxis, otherwise inst->NDaxis (originally NULL) cannot be modified. * src/lib/gprim/inst/instdraw.c: Insert once-only warning message if somebody wants to use origin != NONE (i.e. LOCAL) with ND-drawing. * src/lib/gprim/bbox/bboxload.c: Handle 4d/Nd correctly. * src/bin/geomview/common/worldio.c: Document "ntransform" keyword in the online help. * doc/figs/tools.ps, doc/geomview.texi, doc/version.texi: Update the documentation to the latest changes. 2006-10-26 Claus-Justus Heine * src/bin/ndutils/GeomtoNoff.h, src/bin/ndutils/LoadMap.c, src/bin/ndutils/LoadMap.h, src/bin/ndutils/MakeGoodTransforms.c, src/bin/ndutils/MakeGoodTransforms.h, src/bin/ndutils/Makefile.am, src/bin/ndutils/Random.c, src/bin/ndutils/TransformGeom.c, src/bin/ndutils/TransformGeom.h, src/bin/ndutils/WithColor.c, src/bin/ndutils/WithColor.h, src/bin/ndutils/clip.c, src/bin/ndutils/clipoogl.c, src/bin/ndutils/init.c, src/bin/ndutils/init.h, src/bin/ndutils/slicer.c, src/bin/ndutils/slicer.h, src/bin/ndutils/snapshot.c, src/bin/ndutils/snapshot.h, src/bin/ndutils/testwish.c, src/bin/ndutils/wrappers.c, src/bin/ndutils/wrappers.h, data/NDview/cplxview/scripts/4d.cplx, data/NDview/cplxview/scripts/startup.script, data/NDview/scripts/4d.2bigwins, data/NDview/scripts/4d.3wins, data/NDview/scripts/4d.4wins, data/NDview/scripts/4d.cplx, data/NDview/scripts/4d.xyw, data/NDview/scripts/4d.xyz, data/NDview/scripts/4d.xzw, data/NDview/scripts/4d.yzw, data/NDview/scripts/5d.123, data/NDview/scripts/5d.5wins, data/NDview/scripts/startup.big.script, data/NDview/scripts/startup.small.script, src/bin/NDview/NDdemo, src/bin/NDview/NDview, src/bin/NDview/ndview.c, src/bin/ndutils/BasicFns.c, src/bin/ndutils/BasicFns.h, src/bin/ndutils/Clip.h, src/bin/ndutils/ColorMapDefs.h, src/bin/ndutils/ColorPoint.c, src/bin/ndutils/ColorPoint.h, src/bin/ndutils/GeExDir.c, src/bin/ndutils/GeExDir.h, src/bin/ndutils/GeomExtentDirection.c, src/bin/ndutils/GeomExtentDirection.h, src/bin/ndutils/GeomtoNoff.c: Fixed a BUNCH of memory leaks and other errors. But the main-work was to move thehomogeneous component to index 0. And the most important change was that each camera of an ND-cluster now has additionally its own 3d transform. * src/bin/gvclock/gvclock.in: Calling convention for transfrom-incr has changed (will undo that later). * src/bin/geomview/common/drawer.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/ndshade.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c: Homogeneous component for ND-viewing moved to index 0. Some other changes. ndshade.c changed such that INST stuff works even for ND. * src/bin/stereo/stereo.c: fucking ugliness removement. * src/lib/gprim/skel/skelsave.c, src/lib/gprim/skel/skelsphere.c, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/vect/vectbound.c, src/lib/gprim/vect/vectcreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadsphere.c, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/npolylist/nplsphere.c, src/lib/gprim/npolylist/npolylistP.h, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plsphere.c, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/quad/quadbound.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshdelete.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/mesh/meshnormal.c, src/lib/gprim/mesh/meshsphere.c, src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/ndmesh/ndmesh.h, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/ndmesh/ndmeshtransform.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/geom/vert.h, src/lib/gprim/inst/instbound.c, src/lib/gprim/inst/instsphere.c, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/geom/transform.c, src/lib/gprim/bbox/bboxunion.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/geom/boundsphere.c, src/lib/gprim/geom/geomclass.h, src/lib/gprim/bbox/bboxminmax.c, src/lib/gprim/bbox/bboxsave.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/bbox/bboxcopy.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bbox/bboxload.c, src/lib/gprim/bbox/bboxbound.c, src/lib/gprim/bbox/bboxcenter.c: The homoegenous component for ND is now at index 0. VERT_4D flag is now only a mere input-flag for ND. Fixed several bugs. Forgot about the rest. (but the damn thing seems to work). * src/lib/geometry/hpoint3/hpoint3.c, src/lib/geometry/hpoint3/hpoint3.h, src/lib/geometry/hpoint3/hpoint3b.c: Some more utility functions concerning the conversion between ND<->3d. ND has its homogeneous component at index 0 now. * src/lib/mg/rib/mgribdraw.c: HPt3Normalize() is dead, changed everything to HPt3Dehomogenize. * src/lib/geometry/transformn/tmNpolardecomp.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transformn/transformn.h: Moved the homogeneous component to position 0, this really MUCH more handy with varying ND-dimensions. * src/lib/geometry/hpointn/Makefile.am, src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/hpointn/hpointn.h, src/lib/geometry/hpointn/hpointnb.c: Move everything to hpointn.c * src/lib/geomutil/plutil/anytopl.c: Adapt to changed TransformComponents() calling convention. * configure.ac, src/lib/oogl/util/malloc-debug.c: strdup() replacement for detecting memory leaks. * src/bin/geomview/common/ui.h, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvevent.c, src/bin/geomview/x11/gvui.c, src/bin/geomview/x11/gvui.h, src/bin/geomview/common/lang.c, src/bin/geomview/common/lang.h, src/bin/geomview/common/ui.c: Optionally change the active camera only on focus-change events; this is most desirable in the context of multiple windows when it starts to become complicated to move the mouse cursor back to the tool panel without crossing another camera window. * src/lib/oogl/lisp/lisp.c: Fix a severe memory leak in AssignArgs(): if the argument type is LLOBJECT and the argument itself is either not a list or the LHOLD modifyer is in effect, then the ref-count of the object would be increased one times too often which had the effect that constructs like (e.g.) (if (real-id blah) (echo foo) (echo bar)) would not free there arguments lists. Very bad. 2006-10-22 Claus-Justus Heine * src/bin/geomview/common/drawer.c: Correct drawing of ND cameras. * src/bin/geomview/common/worldio.c: lisp function (camera-prop ...): handle keyword args correctly, including checking for the correct keyword. * src/bin/geomview/common/ui.h: Cosmetics. * src/bin/geomview/common/transform.c: drawer_transform(): now returns success status. * src/bin/geomview/common/space.c: Unused variable compile warning. * src/bin/geomview/common/ndshade.c: Account for changes in mgNDctx struct. * src/bin/geomview/common/lang.h: Remove comma at end of enum. * src/bin/geomview/x11/gvui.h: Proto-type for ui_tool_center_origin_set() (to get rid of a compiler warning). * src/lib/geometry/hpointn/hpointnb.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transformn/transformn.h: Do not use "short" for parameters; that doesn't make too much sense. New function TmNPermute() which applies a permutations to an ND-Transform (to map an x,y,z 3d sub-space to some other 3d-subspace). Some more fixes w.r.t. to prolongation and restriction of ND vectors/matrices. * src/lib/gprim/inst/instdraw.c: Better handling of ND-drawing; also: support non-local locations with ND-drawing. Non-local origins, however, are not (and probably will not be) supported with ND-drawing. * src/lib/gprim/inst/instmisc.c: Cosmetics. * src/lib/geometry/ntransobj/ntransobj.c: Remove unused variables. * src/lib/gprim/tlist/tlist.h, src/lib/gprim/tlist/tltransform.c: Handle TransformN argument to TListTransform(). * src/lib/gprim/vect/vectdraw.c: Fix ND drawing of VECTs: use the VECTs colors of no ND cmap is defined (same handling as in SKEL). * src/lib/mg/common/mg.h: restructured mgNDctx struct and hook functions; we can now push a 3-Transform (make INST support much easier). * src/lib/mg/common/mg.c, src/lib/mg/common/mgP.h: mgc->T4 and associated 3To4() stuff has gone because it was unused; seems to be a relict of beginning ND-support. * src/lib/oogl/lisp/lisp.c: include ctype.h, fix compiler warning in print_help_formatted(). 2006-10-20 Claus-Justus Heine * src/lib/oogl/util/create.h: New define CR_NCENTER to retrieve the center of a bounding box with GeomGet(bbox, ...) * src/bin/geomview/x11/gvcredits.c, src/bin/geomview/x11/gvfiles.c, src/bin/geomview/x11/gvlights.c, src/bin/geomview/x11/gvload.c, src/bin/geomview/x11/gvmaterial.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/gvtoolui.c, src/bin/geomview/x11/gvui.c, src/bin/geomview/x11/gvui.h, src/bin/geomview/x11/interface/Tool.mib, src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/motion.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/transform.h, src/bin/geomview/common/ui.c, src/bin/geomview/common/ui.h, src/bin/geomview/x11/gvappear.c, src/bin/geomview/x11/gvcameras.c, src/bin/geomview/x11/gvcolor.c, src/bin/geomview/x11/gvcommands.c: New toggle "Origin BBox": if set and a geometry is the center of motion (except the world), then the center of the geometry's bounding box is used as origin of the coordinate system (instead of just using the origin of the center-object's co-ordinate system). The idea is that this makes it much easier to look at objects which are translated out of the center of their own coordinate frame, e.g. by using an INST geometry. * src/bin/geomview/common/lang.c, src/bin/geomview/common/lang.h, src/bin/geomview/common/lispext.c, src/bin/geomview/common/lispext.h: The list of keyword names is now generated on the fly in define_keyword(). * src/lib/gprim/bbox/bboxP.h, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bbox/bboxcreate.c: CR_4MIN/4MAX do not cause VERT_4D to be set (why should), but simply install an HPoint3. Bounding boxes now compute their center point, it can be fetched from the bounding box via GeomGet(bbox, CR_CENTER/CR_NCENTER, &point) to retrieve the center as HPoint3 or HPointN. * src/lib/gprim/bbox/bboxbound.c, src/lib/gprim/bbox/bboxunion.c: Use CR_4MIN/4MAX. * src/lib/oogl/lisp/lisp.c: Automatically format the help text to be indented by 8 chars, and wrapped at column 72. This simplifies modifying help texts (no need to format manually). A double \n\n is interpreted as paragraph, all other embedded spaces, tabs and newlines are converted to a single space. * src/lib/gprim/bezier/bezbound.c, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/polylist/plbound.c, src/lib/gprim/quad/quadbound.c, src/lib/gprim/skel/skelbound.c, src/lib/gprim/vect/vectbound.c: Use CR_4MIN/4MAX to generate the bounding box. VERT_4D can be set separately via CR_4D. 2006-10-19 Claus-Justus Heine * src/lib/gprim/inst/instbound.c: Typo. * src/bin/NDview/ndview.c, src/bin/ndutils/ColorPoint.c, src/bin/ndutils/GeExDir.c, src/bin/ndutils/slicer.c, src/bin/ndutils/snapshot.c, src/lib/geometry/ntransobj/ntransobj.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transformn/transformn.h: Prepare for binary ntransform format. 2006-10-18 Claus-Justus Heine * src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/ndshade.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/discgrp/dgdraw.c, src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instbound.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instdraw.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/inst/instsphere.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/mg/buf/mgbuf.c, src/lib/mg/common/mg.c, src/lib/mg/common/mg.h, src/lib/mg/common/mgP.h, src/lib/mg/opengl/mgopengl.c, src/lib/mg/ps/mgps.c, src/lib/mg/rib/mgrib.c, src/lib/mg/x11/mgx11.c: ND-INST support (origin and location local only, no multi-transform stuff, i.e. there are no NTLISTs). * src/lib/gprim/inst/inststream.c: The attempt to introduce ND-INSTs broke saving of the transformation matrix (axis), fix that. * src/lib/gprim/vect/vectbound.c: Fogot to intialize "min". * src/lib/gprim/vect/vectload.c: Initialize flag to 0. * src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/skel/skelbound.c: Fix previously introduced ND-bug. * src/lib/gprim/geom/create.c: GeomInit(): set pdim to 4 by default. * src/lib/gprim/bbox/bboxcenter.c, src/lib/gprim/bbox/bboxunion.c: Fix bugs previously introduced by my ND-changes. 2006-10-17 Claus-Justus Heine * src/lib/gprim/inst/instbound.c: First glimpse at ndaxis support. * src/lib/gprim/bbox/bboxbound.c: Some ND fixes. * src/lib/gprim/sphere/spherecreate.c: Fix a long-standing memory leakage bug: a sphere's Bezier-mesh and tlist were NEVER freed. * src/bin/geomview/common/transform.c: id_bsphere(): fix a memory leak (ND-case). * src/lib/gprim/geom/boundsphere.c: Fix a memory leak (ND-case). 2006-10-16 Claus-Justus Heine * src/lib/gprim/inst/instcreate.c, src/lib/gprim/sphere/spherecreate.c: Forgot the initialization of inst->ndaxis in some places. * src/bin/geomview/common/transform.c: Forgot yet another TmNDelete() * src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/inst/inststream.c: Preparations for ND-Transform INST objects (not working yet). * src/lib/gprim/inst/instsphere.c, src/lib/gprim/inst/instbound.c: Fix handling of ND-Transform if present. * src/lib/oogl/util/create.h, src/bin/ndutils/TransformGeom.c, src/bin/ndutils/WithColor.c, src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instcreate.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/quad/quadP.h, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadload.c, src/lib/gprim/quad/quadsphere.c, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/sphere/sphereP.h, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/vect/vectdraw.c: Some cleanup w.r.t. to ND drawing of 3d objects. * src/bin/geomview/common/comm.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/worldio.c: include ntransobj.h. * src/bin/geomview/common/transform.c: Pass Transfrom, not (Transform *) to HPt3Tranform. 2006-10-15 Claus-Justus Heine * src/bin/geomview/common/comm.c, src/bin/geomview/common/comm.h, src/bin/geomview/common/lang.c, src/bin/geomview/common/lang.h, src/bin/geomview/common/lispext.c, src/bin/geomview/common/worldio.c: Support ntransform as real lisp-object. * src/bin/geomview/common/transform.c: look-recenter: only set the 3d transform if ND-viewing is NOT enabled. * src/lib/geometry/Makefile.am: Add ntransobj/ subdir. * configure.ac: Add src/lib/geometry/ntransobj/Makefile * src/lib/geometry/ntransobj/.cvsignore, src/lib/geometry/ntransobj/Headers, src/lib/geometry/ntransobj/Makefile.am, src/lib/geometry/ntransobj/ntransobj.c, src/lib/geometry/ntransobj/ntransobj.h: Initial revision. * src/bin/geomview/common/transform.c: apply_ND_transform(): need to delete Tmp, drawer_set_ND_xform() just makes a copy. * src/lib/gprim/sphere/spheremisc.c: Fix off-by-one loop-count errors in SphereEncompassXXXN(). * src/lib/gprim/npolylist/nplsphere.c: Fix silly typos and complete the implementation (stopped somewhere in middle, unnoticed because the file was never compiled). * src/lib/gprim/npolylist/npolylistP.h: Proto-type for NPolyListSphere(). * src/lib/gprim/npolylist/Makefile.am: Forgot to add nplsphere.c * src/lib/gprim/ndmesh/ndmeshclass.c, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelclass.c: Do not forget to install BoundSphere() method. * src/lib/gprim/mesh/meshclass.c, src/lib/gprim/polylist/plclass.c: Cosmetics. * src/lib/gprim/geom/boundsphere.c: GeomBoundSphereFromBBox(): handle ND-BBoxes correctly. * src/lib/gprim/bezier/bezbound.c, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/quad/quadbound.c, src/lib/gprim/skel/skelbound.c: Array loop-count was off by one; bug introduced by myself. * src/lib/gprim/bbox/bboxminmax.c: Handle ND-BBoxes correctly. * src/lib/geometry/hpointn/hpointnb.c: Cosmetic changes to HPtNToHPt3(). * src/bin/NDview/.cvsignore, src/bin/clipboard/.cvsignore, src/bin/ndutils/.cvsignore, src/lib/oogl/wa/.cvsignore: Ignore some files generated during compilation. 2006-10-14 Claus-Justus Heine * src/lib/geometry/transformn/transformn.c: TmNRead(): release ->a array on error. 2006-10-13 Claus-Justus Heine * src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c: ND-stuff cleanup: just use the cameras C2W and W2C instead of using additional (unmotivated ...) entries in DView. Seems to work quite nice ... * src/lib/oogl/wa/wa.yacc.h, src/lib/gprim/quad/quadbound.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadsphere.c, src/lib/gprim/skel/Makefile.am, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skelsave.c, src/lib/gprim/skel/skelsphere.c, src/lib/gprim/skel/skeltransform.c, src/lib/gprim/sphere/sphere.h, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/vect/vectbound.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/vect/vectsphere.c, src/lib/oogl/wa/wa.lex.c, src/lib/oogl/wa/wa.yacc.c, src/lib/gprim/inst/instbound.c, src/lib/gprim/list/list.h, src/lib/gprim/list/listmisc.c, src/lib/gprim/mesh/mesh.h, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/mesh/meshsphere.c, src/lib/gprim/ndmesh/Makefile.am, src/lib/gprim/ndmesh/ndmesh.h, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/ndmesh/ndmeshsphere.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/npolylist/nplsphere.c, src/lib/gprim/npolylist/npolylist.h, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plsphere.c, src/lib/gprim/polylist/polylist.h, src/lib/gprim/quad/quad.h, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bbox/bboxcopy.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bbox/bboxload.c, src/lib/gprim/bbox/bboxminmax.c, src/lib/gprim/bbox/bboxsave.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/bbox/bboxunion.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezload.c, src/lib/gprim/discgrp/dgbound.c, src/lib/gprim/discgrp/discgrp.h, src/lib/gprim/geom/bound.c, src/lib/gprim/geom/boundsphere.c, src/lib/gprim/geom/create.c, src/lib/gprim/geom/geom.h, src/lib/gprim/geom/geomclass.h, src/lib/gprim/geom/pick.c, src/lib/gprim/inst/inst.h, src/lib/geomutil/dim/dim.c, src/lib/geomutil/plutil/anytopl.c, src/lib/gprim/bbox/bbox.h, src/lib/gprim/bbox/bboxP.h, src/lib/gprim/bbox/bboxbound.c, src/lib/gprim/bbox/bboxcenter.c, src/bin/geomutil/oogl2rib/oogl2rib.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/drawer.h, src/bin/geomview/common/motion.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/bin/gvclock/Makefile.am, src/bin/ndutils/GeomExtentDirection.c, src/bin/ndutils/GeomtoNoff.c, src/bin/ndutils/TransformGeom.c, src/bin/ndutils/WithColor.c, src/lib/geometry/hpoint3/hpoint3.c, src/lib/geometry/hpoint3/hpoint3.h, src/lib/geometry/hpoint3/hpoint3b.c, src/lib/geometry/hpointn/hpointn.h, src/lib/geometry/hpointn/hpointnb.c, src/lib/geometry/point3/point3.c, src/lib/geometry/transform3/tm3conjugate.c, src/lib/geometry/transform3/tm3polardecomp.c, src/lib/geometry/transformn/tmNpolardecomp.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transformn/transformn.h: Quite a lot of ND drawing changes: look-encompass/-recenter etc. should work now; every camera of an ND-cluster now additionally has a 3d transform attached which acts on the 3d sub-space it is looking at; this is used by look-encompass. The prevous ND paradigm focal-len == translation in z direction was just an ugly hack. Motions are not applied to the 3d transforms while in Nd mode. Mouse-scaling now works while in Nd-mode, however, it is no longer treated as a motion: mouse initiated scaling in Nd is never incremental; changing this would require quite some more changes. Picking still does not work in Nd. Nd drawing honours the 3d transformations set by the xform/xform-set commands. But the result may look very funny. * src/bin/geomutil/hvectext/Makefile.am: Fix all-local: rule. * src/bin/NDview/NDview: Disable normalization, do not disable bboxes, they work in Nd now. * src/lib/oogl/wa/.cvsignore: Ignore some files. 2006-10-06 Claus-Justus Heine * m4/lf_local.m4: Prefix fix for header linking was wrong. Correct that. * src/lib/gprim/comment/commentP.h, src/lib/gprim/discgrp/discgrpP.h, src/lib/gprim/inst/instP.h, src/lib/gprim/list/listP.h, src/lib/gprim/mesh/meshP.h, src/lib/gprim/ndmesh/ndmeshP.h, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/npolylistP.h, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/quad/quadP.h, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelload.c, src/lib/gprim/tlist/tlistP.h, src/lib/gprim/vect/vectP.h, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezierP.h, src/lib/gprim/geom/geomclass.h: Add "pdim" component to GEOMFIELDS * src/lib/gprim/geom/vert.h: Add new flag VERT_ND. Unused yet. * src/lib/geometry/hpointn/hpointn.h, src/lib/geometry/hpointn/hpointnb.c: New function Pt4ToHPtN(). * src/bin/geomview/common/transform.c: look-toward seems to start to work for ND objects. Maybe. * src/lib/gprim/bbox/Makefile.am, src/lib/gprim/bbox/bbox.h, src/lib/gprim/bbox/bboxP.h, src/lib/gprim/bbox/bboxcenter.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxminmax.c, src/lib/gprim/bbox/bboxunion.c: Support for ND bounding boxes. * src/bin/NDview/Makefile.am: Use $(realpath ..) for the in-tree emodule definitions. * doc/version.texi: Update. * m4/lf_local.m4: Take relative/non relative source locations into account. 2006-10-04 Claus-Justus Heine * src/lib/gprim/ndmesh/ndmeshtransform.c, src/lib/gprim/npolylist/npltransform.c: Initial revision. * src/lib/gprim/polylist/pltransform.c, src/lib/gprim/polylist/polylist.h, src/lib/gprim/quad/quad.h, src/lib/gprim/quad/quadbound.c, src/lib/gprim/quad/quadsphere.c, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skeltransform.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/tlist/tlist.h, src/lib/gprim/vect/vectbound.c, src/lib/gprim/vect/vectsphere.c, src/lib/oogl/util/create.h, src/lib/gprim/list/list.h, src/lib/gprim/list/listclass.c, src/lib/gprim/list/listmisc.c, src/lib/gprim/list/listsphere.c, src/lib/gprim/mesh/mesh.h, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/mesh/meshclass.c, src/lib/gprim/mesh/meshsphere.c, src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/ndmesh/Makefile.am, src/lib/gprim/ndmesh/ndmesh.h, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshclass.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/npolylist/Makefile.am, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/npolylist.h, src/lib/gprim/npolylist/npolylistP.h, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plclass.c, src/lib/gprim/polylist/plsphere.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bbox/bboxload.c, src/lib/gprim/bbox/bboxminmax.c, src/lib/gprim/bbox/bboxsave.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/bbox/bboxunion.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/bezier/bezclass.c, src/lib/gprim/bezier/bezier.h, src/lib/gprim/bezier/bezsphere.c, src/lib/gprim/bezier/beztransform.c, src/lib/gprim/discgrp/dgbound.c, src/lib/gprim/discgrp/discgrp.h, src/lib/gprim/geom/bound.c, src/lib/gprim/geom/boundsphere.c, src/lib/gprim/geom/geom.h, src/lib/gprim/geom/geomclass.h, src/lib/gprim/geom/pick.c, src/lib/gprim/geom/pick.h, src/lib/gprim/geom/transform.c, src/lib/gprim/inst/inst.h, src/lib/gprim/inst/instbound.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/inst/instsphere.c, data/NDview/text/axeshelp.txt, doc/version.texi, src/bin/NDview/ndview.c, src/bin/geomutil/oogl2rib/oogl2rib.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/lights.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/worldio.c, src/bin/geomview/x11/gvcamui.c, src/bin/ndutils/slicer.c, src/bin/tackdown/origin.common.c, src/bin/tackdown/tackdown.main.c, src/lib/geometry/hpoint3/hpoint3.c, src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/transform3/3d.h, src/lib/geometry/transformn/Makefile.am, src/lib/geometry/transformn/tmNpolardecomp.c, src/lib/geometry/transformn/transformn.h, src/lib/geomutil/plutil/plutil.h, src/lib/gprim/bbox/bbox.h, src/lib/gprim/bbox/bboxP.h, src/lib/gprim/bbox/bboxbound.c, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bbox/bboxcopy.c: Preparation for some ND-view changes; I plan support for working "look" and "positioning" commands. Needed quite some changes. I tagged everything with the GEOMVIEW_PRE_NDVIEW_CHANGE tag; so we can revert if it does not work out. * src/lib/mg/buf/mgbuf.c: Complete my previous fix concerning the orietation of "alien" objects. 2006-10-03 Mark Phillips * doc/geomview.5, doc/geomview.5.man, doc/geomview.texi: add list of mode strings to documentation for event-mode gcl command * src/bin/geomview/x11/gvcamui.c: fixed snapshot setup code (used in ppmscreen snapshots) so that delay works on 64-bit systems 2006-10-03 Claus-Justus Heine * src/lib/mg/opengl/mgopengldraw.c: Applied Adrian Rossiter's fix for non-concave quadrilaterals. * src/lib/mg/buf/mgbuf.c: Flipping of the the coordinate system has to be done on a per-object basis because there are objects which do not belong to the world (e.g. SaVI's logo). This leaves, of course, room for optimization: as most objects belong to the world, we should flip the world's coordinate system (y-coordinate) and only do a per-object flipping for those few objects not belonging to the world. * src/lib/mg/x11/mgx11.c: Add a comment to some disabled code in mgx11_worldbegin(). * src/bin/geomview/common/space.c: A more understandable help text for ND-xform. * src/bin/geomview/common/drawer.c: The previous code accessed components of obj after obj already had been deleted. Gnah. Buuh. * src/bin/geomview/common/comm.c: Cosmetics. * src/lib/oogl/lisp/lisp.c, src/lib/oogl/lisp/lisp2.h: "not", "or" and "and" functions. * data/NDview/scripts/4d.3wins, data/NDview/scripts/4d.4wins: Correct some more-or-LESS cosmetic errors. 2006-10-02 Lloyd Wood * ChangeLog: Correcting typo in my name. Plus expanding on doc/ build note. 2006-10-01 Claus-Justus Heine * src/bin/geomview/x11/gvmnpanel.c, src/lib/mib/mibload.c: One of the more obscure features of the variable argument functions of the Xt toolkit is the handling of mnemonic's (in short keyboard short-cuts for menus etc): internally they are expected to be of type XID, which means "unsigned long int" outside of the X-server and CARD32 inside the X-server (we are talking about X-toolkits, and so we are outside the X-server and have "unsigned long int"). Now, at least on some 64bit archs passing 64bit variable arguments or 32bit variable arguments makes a difference. The solution is to use a type-cast to XID for mnemonic chars. This was the reason for the Warning: Name: button_0 Class: XmCascadeButtonGadget Illegal mnemonic character; Could not convert X KEYSYM to a keycode messages received on (some, at least) 64bit systems. * src/bin/geomview/x11/gvmnpanel.c: Prevent automatic resizing of the main-panel; otherwise it will suffer an unnecessary change each a module is started. 2006-09-30 Claus-Justus Heine * configure.ac, doc/version.texi: Bump version to post-rc9 * ChangeLog: Update. * NEWS: Document the Nd-code bugfix. * configure.ac, doc/version.texi: Bump version to rc9. * src/bin/stereo/stereo.c: Fix unused variable warning. * src/lib/geometry/transformn/transformn.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c: The nD stuff was really badly broken. I'm tempted to say that it did not have memory leaks, but _was_ one single big memory leak. * doc/version.texi: Update. 2006-09-30 Claus-Justus Heine * rc9 checkpoint. * NEWS: Document the Nd-code bugfix. * configure.ac, doc/version.texi: Bump version to rc9. * src/bin/stereo/stereo.c: Fix unused variable warning. * src/lib/geometry/transformn/transformn.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c: The nD stuff was really badly broken. I'm tempted to say that it did not have memory leaks, but _was_ one single big memory leak. * doc/version.texi: Update. 2006-09-13 Claus-Justus Heine * doc/geomview.texi: The menu entry for the GCL reference somehow vanished in the previous commit. * doc/version.texi: Update. * src/lib/gprim/comment/commentcreate.c: Undo a debugging relict that broke comment objects. 2006-08-30 Claus-Justus Heine * src/lib/gprim/vect/vectload.c: Typo. * doc/version.texi, doc/geomview.texi: Document binary SKEL format. * src/lib/gprim/skel/skelload.c: Binary SKEL format. * src/lib/gprim/npolylist/nplload.c: Fix Emacs per-file variable spec. * doc/version.texi: Update time-stamp. 2006-08-27 Claus-Justus Heine * doc/version.texi, doc/geomview.texi: The node- and menu structure was partially garbled which confused the html output, at least. Get rid of most @ifFORMAT constructs; use @uref{} to refer to URL's (works nowadays). * src/lib/oogl/util/iobuffer.c: Debugging stuff. 2006-08-24 Claus-Justus Heine * README.cvs: At least mention flex and bison (although the parser is now included in the CVS). 2006-08-23 Lloyd Wood * geomview.sh: This is the same Cygwin filesystem check that SaVi uses. It's less complex than if test "`uname | grep CYGWIN`"; then /cygdrive only exists if cygwin is running... 2006-08-21 Claus-Justus Heine * src/lib/oogl/wa/.cvsignore, src/lib/oogl/wa/wa.lex.c, src/lib/oogl/wa/wa.yacc.c, src/lib/oogl/wa/wa.yacc.h: Re-add scanner/parser output files. 2006-08-07 Claus-Justus Heine * doc/version.texi: Update to post-rc8 version. 2006-08-07 Lloyd Wood * Makefile.am: Building doc/ at end -- so that if there's a problem with the tex or ps stuff, the C build has already completed and is unaffected. make geomview can be used if the C build has completed and the doc/ build fails, to create the ./geomview script than runs Geomview. 2006-08-07 Claus-Justus Heine * src/bin/NDview/.cvsignore, src/bin/clipboard/.cvsignore, src/bin/cplxview/.cvsignore, src/bin/flythrough/.cvsignore, src/bin/ginsu/.cvsignore, src/bin/graffiti/.cvsignore, src/bin/hinge/.cvsignore, src/bin/ndutils/.cvsignore, src/bin/stereo/.cvsignore, src/bin/sweep/.cvsignore, src/bin/tackdown/.cvsignore, src/bin/transformer/.cvsignore: CVS ignore stuff. * src/lib/oogl/wa/Makefile.am: The dependency of the parser/scanner files should be on $(srcdir)/Makefile.in, not on Makefile. * src/lib/gprim/geom/geomstream.c: Remove a double file-close. * configure.ac: Use a fancy "post-rc8-CVS" version string. * src/lib/oogl/wa/.cvsignore: Ignore wa.yacc.c * doc/.cvsignore, doc/version.texi: Include version.texi into the CVS. IMHO this is a bad idea, but the maintainer-mode concept seems to be too complicated. * src/bin/NDview/.cvsignore, src/bin/clipboard/.cvsignore, src/bin/ndutils/.cvsignore: Ignore .deps directory. * configure.ac: Unconditionally check for ps2epsi, epstopdf, pdfimags and pnmtopng, even without MAINTAINERMODE: * reconf: Use "$@" not $* (expansion of arguments in quoted words). 2006-08-04 Claus-Justus Heine * README.cvs, doc/Makefile.am, src/lib/oogl/lisp/Makefile.am, src/lib/oogl/wa/Makefile.am: Letting targets to create "maintainermode"-files depend on the automake-conditional MAINTAINERMODE was a very stupid idea. 2006-08-03 Claus-Justus Heine * README.cvs: Mention that we need --enable-maintainer-mode ... 2006-08-02 Claus-Justus Heine * NEWS: Meanwhile it's August 2006 ... tempus fugit. * ChangeLog: Update to 1.8.2-rc8 state. * configure.ac: Apply David's Darwin patch. * src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11windows.c: Quick and dirty hack to fix upside-down bug with MGX11 driver. * src/bin/labeler/Makefile.am: Fix the local (i.e. in build-tree) .geomview-labeler module def. * src/bin/geomview/common/transform.c: When doing "look-recenter" we do not want to apply the object transformation to the camera, because the object-trafo may contain arbitrary deformations (at least I do not like being deformed when watching Geomview). Instead, us a polar decomposition of the object's transform and apply only the orthogonal factor to the camera. * src/lib/Makefile.am: Maybe do not install the library if not using shared libraries (we do install ATM). * src/lib/oogl/wa/yystype.h, src/lib/oogl/wa/Headers, src/lib/oogl/wa/Makefile.am, src/lib/oogl/wa/fsaparse.l, src/lib/oogl/wa/fsaparse.y, src/lib/oogl/wa/wa.yystype.h: Renamed yystype.h to wa.yystype.h * src/lib/geometry/transform3/Makefile.am, src/lib/geometry/transform3/tm3polardecomp.c, src/lib/geometry/transform3/transform.h, src/lib/geometry/transform3/transform3.h: Polar decomposition of 3x3 matrix. * Makefile.am: Install non-private header-files in pkginclude. * configure.ac: Adapt xforms include and library paths to the xforms source distro at savannah. * src/lib/geometry/transform3/tm3polardecomp.c: Initial revision. 2006-08-02 Claus-Justus Heine * configure.ac: Apply David's Darwin patch. * src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11windows.c: Quick and dirty hack to fix upside-down bug with MGX11 driver. * src/bin/labeler/Makefile.am: Fix the local (i.e. in build-tree) .geomview-labeler module def. * src/bin/geomview/common/transform.c: When doing "look-recenter" we do not want to apply the object transformation to the camera, because the object-trafo may contain arbitrary deformations (at least I do not like being deformed when watching Geomview). Instead, us a polar decomposition of the object's transform and apply only the orthogonal factor to the camera. * src/lib/Makefile.am: Maybe do not install the library if not using shared libraries (we do install ATM). * src/lib/oogl/wa/yystype.h, src/lib/oogl/wa/Headers, src/lib/oogl/wa/Makefile.am, src/lib/oogl/wa/fsaparse.l, src/lib/oogl/wa/fsaparse.y, src/lib/oogl/wa/wa.yystype.h: Renamed yystype.h to wa.yystype.h * src/lib/geometry/transform3/Makefile.am, src/lib/geometry/transform3/tm3polardecomp.c, src/lib/geometry/transform3/transform.h, src/lib/geometry/transform3/transform3.h: Polar decomposition of 3x3 matrix. * Makefile.am: Install non-private header-files in pkginclude. * configure.ac: Adapt xforms include and library paths to the xforms source distro at savannah. * src/lib/geometry/transform3/tm3polardecomp.c: Initial revision. 2006-08-01 Claus-Justus Heine * configure.ac: Disable building a shared library by default. * src/lib/oogl/util/futil.c, src/lib/oogl/util/iobfutil.c: htons/l -> gv_htons/l (bug reported by David Morisson). * src/bin/geomutil/bdy/Makefile.am, src/bin/geomutil/clip/Makefile.am, src/bin/geomutil/oogl2rib/Makefile.am, src/bin/geomutil/oogl2vrml/Makefile.am, src/bin/geomutil/plutil/Makefile.am, src/bin/geomutil/ucd/Makefile.am, src/bin/geomview/x11/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/hinge/Makefile.am, src/bin/labeler/Makefile.am, src/bin/ndutils/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/NDview/Makefile.am, src/bin/animate/Makefile.am, src/bin/clipboard/Makefile.am, src/bin/cplxview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/example/Makefile.am: Remove -rpath, not needed and not wanted by Debian. 2006-08-01 Steve M. Robbins * src/bin/ChangeLog, src/bin/geomutil/plutil/offconsol.1: Fix manpage section. * ChangeLog, configure.ac, src/bin/ChangeLog, src/bin/stereo/stereo.c: Search for /usr/gfx/setmon at configure time; may be overridden by setting shell variable SETMON_PATH. If not found, diagnostic is emitted at runtime by stereo. * src/lib/ChangeLog, src/lib/gprim/geom/knownclass.c: Fix bug in list of function prototypes, arising from the fact that the "*" in C attaches to the declarator rather than the type. * ChangeLog, geomview.sh: Specifying -help should only print help and not bring up geomview windows. Fix diagnostic emitted when invoked with "-graphics" and no alternatives exist. * src/bin/ChangeLog, src/bin/example/oogl.c, src/bin/flythrough/main.c, src/bin/hinge/hui.c: Remove or rename function getline() to avoid clash with standard C library function. * src/lib/ChangeLog, src/lib/oogl/util/ooglutil.h: Remove duplicate declaration of fmemopen(). 2006-07-31 Claus-Justus Heine * configure.ac: AM_CONDITIONALS _must_ _not_ be defined conditionally. Gnah. * src/bin/Makefile.am: Forward the src_bin_module_subdirs to "make distclean" via distclean-local. * ChangeLog: *** empty log message *** * configure.ac: Search for GL/gl.h and GL/glx.h and make sure the beast still compiles without OpenGL. * geomview.sh: Set TCL/TK_LIBRARY variables on Cygwin, the Cygwin Tcl/Tk port is buggy in this respect. * src/bin/geomview/x11/gvcamui.c: Missing closing " after contact info update. 2006-07-30 Claus-Justus Heine * configure.ac: Use PREFIX/share/geomview as data-dir (instead of PREFIX/share/geomview/data). * src/bin/ndutils/ColorPoint.c: Off-by-1 bug: in C (in contrast to maybe Fortran ...) the last array index is (size-1). Ups. * src/bin/ndutils/GeExDir.c: Debugging message. * src/bin/ndutils/slicer.c, src/bin/ndutils/snapshot.c: Consume the fourth number of the ND-axes command. * doc/geomview.texi, src/bin/geomview/common/space.c: The "ND-axes" command was not correctly documented: it accepts 4 numbers, not 3, and return 4 numbers, not 3, when called without camera cluster ID. The last number seems to be hard-wired to -1. But??????? 2006-07-31 Steve M. Robbins * configure.ac: Search for /usr/gfx/setmon; may be overridden by setting shell variable SETMON_PATH. Used in stereo module. * geomview.sh: Specifying -help should only print help and not bring up geomview windows. Fix diagnostic emitted when invoked with "-graphics" and no alternatives exist. 2006-07-31 Claus-Justus Heine * 1.8.2-rc7 release. * configure.ac: Search for GL/gl.h and GL/glx.h and make sure the beast still compiles without OpenGL. * geomview.sh: Set TCL/TK_LIBRARY variables on Cygwin, the Cygwin Tcl/Tk port is buggy in this respect. * src/bin/geomview/x11/gvcamui.c: Missing closing " after contact info update. 2006-07-30 Claus-Justus Heine * configure.ac: Use PREFIX/share/geomview as data-dir (instead of PREFIX/share/geomview/data). * src/bin/ndutils/ColorPoint.c: Off-by-1 bug: in C (in contrast to maybe Fortran ...) the last array index is (size-1). Ups. * src/bin/ndutils/GeExDir.c: Debugging message. * src/bin/ndutils/slicer.c, src/bin/ndutils/snapshot.c: Consume the fourth number of the ND-axes command. * doc/geomview.texi, src/bin/geomview/common/space.c: The "ND-axes" command was not correctly documented: it accepts 4 numbers, not 3, and return 4 numbers, not 3, when called without camera cluster ID. The last number seems to be hard-wired to -1. But??????? * configure.ac, src/bin/Makefile.am: Cygwin (and maybe other non-Unix systems) do not have the Tcl_CreateFileHandler() function. Check for it and disable the crayola module if the function is not found. * src/bin/ndutils/clipoogl.c, src/bin/ndutils/slicer.c, src/bin/ndutils/wrappers.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11windows.c: Remove some compiler warnings. * src/lib/oogl/lisp/Makefile.am: clisp.h must be copied to $(srcdir), otherwise the headers sym-link stuff does not work. * ChangeLog: Update email addresses; I need to be more careful to run rcs2log with the correct -u options. * doc/Makefile.am: Cleaned up as suggested by Steve M. Robbins. * data/Makefile.am: Erroneously included the groups/CVS/ subdir. * src/bin/gvclock/Makefile.am: CLEANFILES was set twice. * src/bin/sweep/.geomview-sweep, src/bin/tackdown/.geomview-tackdown, src/bin/transformer/.geomview-transformer, src/bin/hinge/.geomview-hinge, src/bin/stereo/.geomview-stereo, src/bin/graffiti/.geomview-graffiti, src/bin/flythrough/.geomview-flythrough, src/bin/ginsu/.geomview-ginsu, src/bin/cplxview/.geomview-cplxview: Generated by make * src/bin/geomview/common/comm.c: LDEFINE(read, ...): Fix a long standing memory bug; (read blah {stuff}) treats blah just as keyword, the resulting lisp-object (e.g. a string "geometry") is never referenced again; so we _must_ free the keyword in this function, not only on error, but in any case. * src/bin/clipboard/clipx.c: Use the "default" grey as backgound for the clibboard view. * src/bin/transformer/Makefile.am, data/Makefile.am, src/bin/NDview/Makefile.am, src/bin/animate/Makefile.am, src/bin/clipboard/Makefile.am, src/bin/cplxview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/example/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/gvclock/Makefile.am, src/bin/hinge/Makefile.am, src/bin/labeler/Makefile.am, src/bin/ndutils/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am: Some fixes after running "make distchek". * README: Update modules list. * NEWS: Update list of resurrected modules. * INSTALL.Geomview: Note that we are back to "vanilla" installation layout (with the exception of the different prefix default). * configure.ac: Again build a shared library. * src/bin/ndutils/Slicer: Bail out if we are not in ND with N > 3. * src/bin/maniview/maniview.h: xforms issue. * src/bin/orrery/Makefile.am: Let .geomview-orrery depend on the Makefile * src/bin/tackdown/Makefile.am: origin module. * src/bin/ndutils/.cvsignore: Initial revision. * src/bin/hinge/hui.c: Mmmh. * src/bin/flythrough/flythrough.h: Xforms issue. * src/bin/flythrough/main.c: Check for NULL before trying to close files. * src/bin/cplxview/Makefile.am: Help text now in top-level directory. * src/bin/NDview/Makefile.am: Moved all data-files to top-level directory. * configure.ac: ndutils * data/Makefile.am: Install all data-files from here. * src/bin/cplxview/cplxpanels2.c, src/bin/cplxview/cplxpanels2.fd, src/bin/cplxview/cplxpanels2.h, src/bin/example/panel.c, src/bin/example/panel.fd, src/bin/example/panel.h, src/bin/flythrough/panel.c, src/bin/flythrough/panel.fd, src/bin/flythrough/panel.h, src/bin/ginsu/ginsuF.c, src/bin/ginsu/ginsuF.fd, src/bin/ginsu/ginsuF.h, src/bin/hinge/panel.c, src/bin/hinge/panel.fd, src/bin/hinge/panel.h, src/bin/maniview/controlpanel.c, src/bin/maniview/controlpanel.fd, src/bin/maniview/controlpanel.h, src/bin/stereo/sterui.c, src/bin/stereo/sterui.fd, src/bin/stereo/sterui.h, src/bin/sweep/panel.c, src/bin/sweep/panel.fd, src/bin/sweep/panel.h, src/bin/tackdown/origin.panel.c, src/bin/tackdown/origin.panel.fd, src/bin/tackdown/origin.panel.h, src/bin/tackdown/panel.c, src/bin/tackdown/panel.fd, src/bin/tackdown/panel.h, src/bin/transformer/panel.c, src/bin/transformer/panel.fd, src/bin/transformer/panel.h: Re-ran the fdesign program; several button, widges etc. just did not look too good with the newer xforms stuff. * src/bin/Makefile.am: Resurrect ndutils. * src/lib/oogl/util/iobuffer.c: Make iobfrewind() more efficient. * src/bin/ndutils/init.h, src/bin/ndutils/slicer.c, src/bin/ndutils/slicer.h, src/bin/ndutils/snapshot.c, src/bin/ndutils/snapshot.h, src/bin/ndutils/testwish.c, src/bin/ndutils/wrappers.c, src/bin/ndutils/wrappers.h, src/bin/ndutils/3D-Snapshot, src/bin/ndutils/BasicFns.c, src/bin/ndutils/BasicFns.h, src/bin/ndutils/Clip.h, src/bin/ndutils/ColorMapDefs.h, src/bin/ndutils/ColorPoint.c, src/bin/ndutils/ColorPoint.h, src/bin/ndutils/Colormap, src/bin/ndutils/GeExDir.c, src/bin/ndutils/GeExDir.h, src/bin/ndutils/GeomExtentDirection.c, src/bin/ndutils/GeomExtentDirection.h, src/bin/ndutils/GeomtoNoff.c, src/bin/ndutils/GeomtoNoff.h, src/bin/ndutils/LoadMap.c, src/bin/ndutils/LoadMap.h, src/bin/ndutils/MakeGoodTransforms.c, src/bin/ndutils/MakeGoodTransforms.h, src/bin/ndutils/Makefile.am, src/bin/ndutils/Random.c, src/bin/ndutils/Random.h, src/bin/ndutils/Slicer, src/bin/ndutils/TransformGeom.c, src/bin/ndutils/TransformGeom.h, src/bin/ndutils/WithColor.c, src/bin/ndutils/WithColor.h, src/bin/ndutils/clip.c, src/bin/ndutils/clipoogl.c, src/bin/ndutils/init.c, data/NDview/geom/demo/axes, data/NDview/geom/demo/cubew, data/NDview/geom/demo/cubew+, data/NDview/geom/demo/point, data/NDview/geom/demo/points, data/NDview/geom/demo/segmentw+x+z, data/NDview/geom/demo/segmentw+x+z+, data/NDview/geom/demo/squarew+x, data/NDview/geom/demo/squarew+x+, data/NDview/geom/demo/tesseract, data/NDview/scripts/reset.script, data/NDview/scripts/startup.big.script, data/NDview/scripts/startup.small.script, data/NDview/text/axeshelp.txt, data/NDview/text/cube.txt, data/NDview/text/cubed.txt, data/NDview/text/demohelp.txt, data/NDview/text/introhelp.txt, data/NDview/text/point.txt, data/NDview/text/pointd.txt, data/NDview/text/prefabhelp.txt, data/NDview/text/segment.txt, data/NDview/text/segmentd.txt, data/NDview/text/square.txt, data/NDview/text/squared.txt, data/NDview/text/tesseract.txt, data/NDview/text/toolkithelp.txt, data/NDview/scripts/.ndview, data/NDview/scripts/4d.2bigwins, data/NDview/scripts/4d.3wins, data/NDview/scripts/4d.4wins, data/NDview/scripts/4d.cplx, data/NDview/scripts/4d.earthcolor, data/NDview/scripts/4d.wildcolor, data/NDview/scripts/4d.xyw, data/NDview/scripts/4d.xyz, data/NDview/scripts/4d.xzw, data/NDview/scripts/4d.yzw, data/NDview/scripts/4dcol.w.rb, data/NDview/scripts/4dcol.x.rb, data/NDview/scripts/4dcol.y.rb, data/NDview/scripts/4dcol.z.rb, data/NDview/scripts/5d.123, data/NDview/scripts/5d.5wins, data/NDview/scripts/5dcol.1.rb, data/NDview/scripts/5dcol.2.rb, data/NDview/scripts/5dcol.3.rb, data/NDview/scripts/5dcol.4.rb, data/NDview/scripts/5dcol.5.rb, data/NDview/scripts/color.script, data/NDview/scripts/delete_all.script, data/NDview/scripts/deletecams.script, data/NDview/scripts/eitherwindow, data/NDview/scripts/nocolor.script, data/NDview/cplxview/geom/funcplane, data/NDview/cplxview/scripts/4d.colorcplx, data/NDview/cplxview/scripts/4d.cplx, data/NDview/cplxview/scripts/del_c0, data/NDview/cplxview/scripts/reset.script, data/NDview/cplxview/scripts/startup.script, data/NDview/cplxview/text/cplxhelp.txt, data/NDview/geom/4cube, data/NDview/geom/4daxes, data/NDview/geom/5daxes, data/NDview/geom/6daxes, data/NDview/geom/crosscap, data/NDview/geom/dodecaplex.skel, data/NDview/geom/flattorus, data/NDview/geom/funcplane, data/NDview/geom/hypercube.skel, data/NDview/geom/octaplex.skel, data/NDview/geom/orthoplex.skel, data/NDview/geom/pluker23col.4d, data/NDview/geom/simplex.skel, data/NDview/geom/tetraplex.skel: Resurrected from older Geomview releases. 2006-07-30 Claus-Justus Heine * src/bin/ndutils/clipoogl.c, src/bin/ndutils/slicer.c, src/bin/ndutils/wrappers.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11windows.c: Remove some compiler warnings. * src/lib/oogl/lisp/Makefile.am: clisp.h must be copied to $(srcdir), otherwise the headers sym-link stuff does not work. * ChangeLog: Update email addresses; I need to be more careful to run rcs2log with the correct -u options. * doc/Makefile.am: Cleaned up as suggested by Steve M. Robbins. * data/Makefile.am: Erroneously included the groups/CVS/ subdir. * src/bin/gvclock/Makefile.am: CLEANFILES was set twice. * src/bin/sweep/.geomview-sweep, src/bin/tackdown/.geomview-tackdown, src/bin/transformer/.geomview-transformer, src/bin/hinge/.geomview-hinge, src/bin/stereo/.geomview-stereo, src/bin/graffiti/.geomview-graffiti, src/bin/flythrough/.geomview-flythrough, src/bin/ginsu/.geomview-ginsu, src/bin/cplxview/.geomview-cplxview: Generated by make * src/bin/geomview/common/comm.c: LDEFINE(read, ...): Fix a long standing memory bug; (read blah {stuff}) treats blah just as keyword, the resulting lisp-object (e.g. a string "geometry") is never referenced again; so we _must_ free the keyword in this function, not only on error, but in any case. * src/bin/clipboard/clipx.c: Use the "default" grey as backgound for the clibboard view. * src/bin/transformer/Makefile.am, data/Makefile.am, src/bin/NDview/Makefile.am, src/bin/animate/Makefile.am, src/bin/clipboard/Makefile.am, src/bin/cplxview/Makefile.am, src/bin/crayola/Makefile.am, src/bin/example/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/ginsu/Makefile.am, src/bin/graffiti/Makefile.am, src/bin/gvclock/Makefile.am, src/bin/hinge/Makefile.am, src/bin/labeler/Makefile.am, src/bin/ndutils/Makefile.am, src/bin/stereo/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am: Some fixes after running "make distchek". * README: Update modules list. * NEWS: Update list of resurrected modules. * INSTALL.Geomview: Note that we are back to "vanilla" installation layout (with the exception of the different prefix default). * configure.ac: Again build a shared library. * src/bin/ndutils/Slicer: Bail out if we are not in ND with N > 3. * src/bin/maniview/maniview.h: xforms issue. * src/bin/orrery/Makefile.am: Let .geomview-orrery depend on the Makefile * src/bin/tackdown/Makefile.am: origin module. * src/bin/ndutils/.cvsignore: Initial revision. * src/bin/hinge/hui.c: Mmmh. * src/bin/flythrough/flythrough.h: Xforms issue. * src/bin/flythrough/main.c: Check for NULL before trying to close files. * src/bin/cplxview/Makefile.am: Help text now in top-level directory. * src/bin/NDview/Makefile.am: Moved all data-files to top-level directory. * configure.ac: ndutils * data/Makefile.am: Install all data-files from here. * src/bin/cplxview/cplxpanels2.c, src/bin/cplxview/cplxpanels2.fd, src/bin/cplxview/cplxpanels2.h, src/bin/example/panel.c, src/bin/example/panel.fd, src/bin/example/panel.h, src/bin/flythrough/panel.c, src/bin/flythrough/panel.fd, src/bin/flythrough/panel.h, src/bin/ginsu/ginsuF.c, src/bin/ginsu/ginsuF.fd, src/bin/ginsu/ginsuF.h, src/bin/hinge/panel.c, src/bin/hinge/panel.fd, src/bin/hinge/panel.h, src/bin/maniview/controlpanel.c, src/bin/maniview/controlpanel.fd, src/bin/maniview/controlpanel.h, src/bin/stereo/sterui.c, src/bin/stereo/sterui.fd, src/bin/stereo/sterui.h, src/bin/sweep/panel.c, src/bin/sweep/panel.fd, src/bin/sweep/panel.h, src/bin/tackdown/origin.panel.c, src/bin/tackdown/origin.panel.fd, src/bin/tackdown/origin.panel.h, src/bin/tackdown/panel.c, src/bin/tackdown/panel.fd, src/bin/tackdown/panel.h, src/bin/transformer/panel.c, src/bin/transformer/panel.fd, src/bin/transformer/panel.h: Re-ran the fdesign program; several button, widges etc. just did not look too good with the newer xforms stuff. * src/bin/Makefile.am: Resurrect ndutils. * src/lib/oogl/util/iobuffer.c: Make iobfrewind() more efficient. * src/bin/ndutils/init.h, src/bin/ndutils/slicer.c, src/bin/ndutils/slicer.h, src/bin/ndutils/snapshot.c, src/bin/ndutils/snapshot.h, src/bin/ndutils/testwish.c, src/bin/ndutils/wrappers.c, src/bin/ndutils/wrappers.h, src/bin/ndutils/3D-Snapshot, src/bin/ndutils/BasicFns.c, src/bin/ndutils/BasicFns.h, src/bin/ndutils/Clip.h, src/bin/ndutils/ColorMapDefs.h, src/bin/ndutils/ColorPoint.c, src/bin/ndutils/ColorPoint.h, src/bin/ndutils/Colormap, src/bin/ndutils/GeExDir.c, src/bin/ndutils/GeExDir.h, src/bin/ndutils/GeomExtentDirection.c, src/bin/ndutils/GeomExtentDirection.h, src/bin/ndutils/GeomtoNoff.c, src/bin/ndutils/GeomtoNoff.h, src/bin/ndutils/LoadMap.c, src/bin/ndutils/LoadMap.h, src/bin/ndutils/MakeGoodTransforms.c, src/bin/ndutils/MakeGoodTransforms.h, src/bin/ndutils/Makefile.am, src/bin/ndutils/Random.c, src/bin/ndutils/Random.h, src/bin/ndutils/Slicer, src/bin/ndutils/TransformGeom.c, src/bin/ndutils/TransformGeom.h, src/bin/ndutils/WithColor.c, src/bin/ndutils/WithColor.h, src/bin/ndutils/clip.c, src/bin/ndutils/clipoogl.c, src/bin/ndutils/init.c, data/NDview/geom/demo/axes, data/NDview/geom/demo/cubew, data/NDview/geom/demo/cubew+, data/NDview/geom/demo/point, data/NDview/geom/demo/points, data/NDview/geom/demo/segmentw+x+z, data/NDview/geom/demo/segmentw+x+z+, data/NDview/geom/demo/squarew+x, data/NDview/geom/demo/squarew+x+, data/NDview/geom/demo/tesseract, data/NDview/scripts/reset.script, data/NDview/scripts/startup.big.script, data/NDview/scripts/startup.small.script, data/NDview/text/axeshelp.txt, data/NDview/text/cube.txt, data/NDview/text/cubed.txt, data/NDview/text/demohelp.txt, data/NDview/text/introhelp.txt, data/NDview/text/point.txt, data/NDview/text/pointd.txt, data/NDview/text/prefabhelp.txt, data/NDview/text/segment.txt, data/NDview/text/segmentd.txt, data/NDview/text/square.txt, data/NDview/text/squared.txt, data/NDview/text/tesseract.txt, data/NDview/text/toolkithelp.txt, data/NDview/scripts/.ndview, data/NDview/scripts/4d.2bigwins, data/NDview/scripts/4d.3wins, data/NDview/scripts/4d.4wins, data/NDview/scripts/4d.cplx, data/NDview/scripts/4d.earthcolor, data/NDview/scripts/4d.wildcolor, data/NDview/scripts/4d.xyw, data/NDview/scripts/4d.xyz, data/NDview/scripts/4d.xzw, data/NDview/scripts/4d.yzw, data/NDview/scripts/4dcol.w.rb, data/NDview/scripts/4dcol.x.rb, data/NDview/scripts/4dcol.y.rb, data/NDview/scripts/4dcol.z.rb, data/NDview/scripts/5d.123, data/NDview/scripts/5d.5wins, data/NDview/scripts/5dcol.1.rb, data/NDview/scripts/5dcol.2.rb, data/NDview/scripts/5dcol.3.rb, data/NDview/scripts/5dcol.4.rb, data/NDview/scripts/5dcol.5.rb, data/NDview/scripts/color.script, data/NDview/scripts/delete_all.script, data/NDview/scripts/deletecams.script, data/NDview/scripts/eitherwindow, data/NDview/scripts/nocolor.script, data/NDview/cplxview/geom/funcplane, data/NDview/cplxview/scripts/4d.colorcplx, data/NDview/cplxview/scripts/4d.cplx, data/NDview/cplxview/scripts/del_c0, data/NDview/cplxview/scripts/reset.script, data/NDview/cplxview/scripts/startup.script, data/NDview/cplxview/text/cplxhelp.txt, data/NDview/geom/4cube, data/NDview/geom/4daxes, data/NDview/geom/5daxes, data/NDview/geom/6daxes, data/NDview/geom/crosscap, data/NDview/geom/dodecaplex.skel, data/NDview/geom/flattorus, data/NDview/geom/funcplane, data/NDview/geom/hypercube.skel, data/NDview/geom/octaplex.skel, data/NDview/geom/orthoplex.skel, data/NDview/geom/pluker23col.4d, data/NDview/geom/simplex.skel, data/NDview/geom/tetraplex.skel: Resurrected from older Geomview releases. 2006-07-29 Claus-Justus Heine * src/bin/flythrough/main.c: Do not try to call flcose() with NULL pointer. 2006-07-29 Steve M. Robbins * ChangeLog, configure.ac: FIX setting of AM_CONDITIONAL HAVE_TCLTK. 2006-07-29 Claus-Justus Heine * src/bin/NDview/ndview.c: We have no fscanf() for IOBFILE files. Work around that. * src/bin/NDview/Makefile.am, src/bin/NDview/NDdemo, src/bin/NDview/NDview: Enable in-build-tree use of NDview and NDdemo. * Makefile.am: Back to using top_srcdir for preliminary GEOMROOT. * src/bin/NDview/Makefile.am: Fiddle with in-builddir module definition. * src/bin/orrery/Makefile.am: Look under GEOMDATA/modules/orrery/orrery * src/lib/oogl/util/iobuffer.c, src/lib/oogl/util/iobuffer.h: Fix iobfgetbuffer() should return 1 if iobf->ungetc != EOF; that ungetc counts for one char of data :) * src/lib/aclib/lstat.c, src/lib/aclib/stat.c: Real wrappers for stat/lstat/fstat in case configure detects bugs in the system's stat() implementations. * src/bin/clipboard/.cvsignore: Add Makefile.in/Makefile. * src/bin/animate/Makefile.am, src/bin/togeomview/Makefile.am: Link against libgeomview.la (to get stat replacement functions). * src/bin/NDview/Makefile.am: Do not copy data to toplevel build-directory. * src/bin/NDview/.cvsignore: Ignore Makefile, Makefile.in * configure.ac: Provide wrappers for stat and lstat and fstat. * data/Makefile.am: Include shaders into the distro. * .cvsignore: Ignore directories starting with "build". * data/shaders/hplastic.sl, data/shaders/hplastic.slo, data/shaders/README, data/shaders/hlight.sl, data/shaders/hlight.slo, data/shaders/hmatte.sl, data/shaders/hmatte.slo: Initial revision. * src/bin/orrery/configure.ac: Fixed configure.ac: AM_INIT_AUTOMAKE/AC_CONFIG_AUXDIR order. 2006-07-29 Claus-Justus Heine * src/bin/flythrough/main.c: Do not try to call flcose() with NULL pointer. 2006-07-29 Steve M. Robbins * ChangeLog, configure.ac: FIX setting of AM_CONDITIONAL HAVE_TCLTK. 2006-07-29 Claus-Justus Heine * src/bin/NDview/ndview.c: We have no fscanf() for IOBFILE files. Work around that. * src/bin/NDview/Makefile.am, src/bin/NDview/NDdemo, src/bin/NDview/NDview: Enable in-build-tree use of NDview and NDdemo. * Makefile.am: Back to using top_srcdir for preliminary GEOMROOT. * src/bin/NDview/Makefile.am: Fiddle with in-builddir module definition. * src/bin/orrery/Makefile.am: Look under GEOMDATA/modules/orrery/orrery * src/lib/oogl/util/iobuffer.c, src/lib/oogl/util/iobuffer.h: Fix iobfgetbuffer() should return 1 if iobf->ungetc != EOF; that ungetc counts for one char of data :) * src/lib/aclib/lstat.c, src/lib/aclib/stat.c: Real wrappers for stat/lstat/fstat in case configure detects bugs in the system's stat() implementations. * src/bin/clipboard/.cvsignore: Add Makefile.in/Makefile. * src/bin/animate/Makefile.am, src/bin/togeomview/Makefile.am: Link against libgeomview.la (to get stat replacement functions). * src/bin/NDview/Makefile.am: Do not copy data to toplevel build-directory. * src/bin/NDview/.cvsignore: Ignore Makefile, Makefile.in * configure.ac: Provide wrappers for stat and lstat and fstat. * data/Makefile.am: Include shaders into the distro. * .cvsignore: Ignore directories starting with "build". * data/shaders/hplastic.sl, data/shaders/hplastic.slo, data/shaders/README, data/shaders/hlight.sl, data/shaders/hlight.slo, data/shaders/hmatte.sl, data/shaders/hmatte.slo: Initial revision. * src/bin/orrery/configure.ac: Fixed configure.ac: AM_INIT_AUTOMAKE/AC_CONFIG_AUXDIR order. 2006-07-28 Claus-Justus Heine * src/bin/orrery/data/orr/.cvsignore: Initial revision. * src/bin/orrery/data/.cvsignore, src/bin/maniview/.cvsignore: The usual ignore blah. * src/bin/maniview/.cvsignore: The usual ignore stuff. * src/bin/maniview/Makefile.am: automake stuff. * src/bin/orrery/data/Makefile.am, src/bin/orrery/data/orr/Makefile.am, src/bin/orrery/Makefile.am: Automake stuff. * src/bin/orrery/.cvsignore: CVS ignore pattern. * src/bin/orrery/configure.ac, src/bin/orrery/configure.in: Renamed. * configure.ac: Restore PREFIX_DEFAULT to /usr/local/Geomview. * src/bin/NDview/ndview.c: Remove a debugging message. * src/bin/NDview/Makefile.am: Fiddle with vpath data installation. * src/lib/oogl/util/iobuffer.c: Programs seem to assume that rewind() just flushed the buffer of the input stream ... * src/lib/oogl/util/futil.c, src/lib/oogl/util/iobfutil.c: Use gv_htons() etc. * src/lib/oogl/util/malloc-debug.c: Remove a compiler warning. * src/lib/oogl/wa/Makefile.am: Only rebuild the parser with maintainer-mode enabled. * src/lib/oogl/lisp/Makefile.am: Do not remove clisp.[ch] with make distclean. * src/lib/oogl/lisp/lisp.c: AssignArgs() should not call va_end() itself (although va_end() is a no-op on many machines). * src/lib/mg/x11/mgx11dither.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11render1.c, src/lib/mg/x11/mgx11render16.c, src/lib/mg/x11/mgx11render8.c, src/lib/mg/x11/mgx11shade.c, src/lib/mg/x11/mgx11windows.c, src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11clip.c: Compiler warnings. * src/bin/geomview/x11/Makefile.am: Probably clang.h, not clang.hy * src/bin/geomview/x11/gvcamui.c: Default to MGOPENGL if both, MGX11 and MGOPENGL are defined. * src/bin/geomview/x11/gvmain.c: Compiler warning (main without return type). * src/bin/animate/Makefile.am, src/bin/example/Makefile.am: Slight changes (library order or so, man-page installation). * src/bin/clipboard/.cvsignore: Initial revision. * src/bin/Makefile.am: Add some more modules. * doc/Makefile.am: Do not try to build maintainer-files when doing VPATH builds. * data/Makefile.am: Use "nobase_" prefix to properly install into subdirectories. * configure.ac: Always build mgx11 (needed for clipboar and does not hurt). Disable shared libraries by default 'cause I have problems with gcc-4.1.1 with the big libgeomview.so. Compiler error??? * .cvsignore: ignore it ignore it ignore it ignore it ... * src/bin/NDview/NDdemo, src/bin/NDview/NDview, src/bin/NDview/ndview.c, src/bin/NDview/testwish.c, src/bin/NDview/.cvsignore, src/bin/NDview/Makefile.am: Forthcoming NDview module, but needs more work. * src/bin/clipboard/clip.h, src/bin/clipboard/clipboard.c, src/bin/clipboard/clipboard.mib, src/bin/clipboard/clipx.c, src/bin/clipboard/Makefile.am: Initial revision. * src/bin/maniview/configure.in: Renamed to configure.ac * src/bin/hinge/Makefile.am, src/bin/sweep/Makefile.am, src/bin/tackdown/Makefile.am, src/bin/transformer/Makefile.am, src/bin/cplxview/Makefile.am, src/bin/flythrough/Makefile.am, src/bin/graffiti/Makefile.am: Install man-pages. 2006-07-27 Claus-Justus Heine * src/bin/Makefile.am, src/bin/geomutil/Makefile.am, src/bin/geomutil/clip/Makefile.am, src/bin/ginsu/Makefile.am, configure.ac: Some additional modules. * src/bin/gvclock/.cvsignore, src/bin/labeler/.cvsignore, src/bin/crayola/.cvsignore, src/bin/geomutil/hvectext/.cvsignore: The usual ignore stuff. * src/bin/geomutil/hvectext/Makefile.am, src/bin/geomutil/hvectext/hvectext.1, src/bin/geomutil/hvectext/hvectext.in, src/bin/crayola/Crayola, src/bin/crayola/Makefile.am, src/bin/crayola/callbacks.c, src/bin/crayola/callbacks.h, src/bin/crayola/crayola.1, src/bin/crayola/testwish.c, src/bin/crayola/tkcrayola.c, src/bin/crayola/ui.h, src/bin/labeler/Labeler, src/bin/labeler/Makefile.am, src/bin/labeler/labeler.c, src/bin/labeler/testwish.c, src/bin/gvclock/Makefile.am, src/bin/gvclock/gvclock.in, m4/check-package.m4, m4/frameworks.m4, m4/set-prefix.m4: Initial revision. * data/Makefile.am: Install group definitions. * data/groups/quart.4.gv, data/groups/sample.proj.dgp, data/groups/sample.uhs.dgp, data/groups/spaceshipSpace.geom, data/groups/tetra2.dgp, data/groups/wholecube.geom, data/groups/klein.wa, data/groups/klein_bricks.dgp, data/groups/klein_whole.dgp, data/groups/loop.1.gv, data/groups/loop.2.gv, data/groups/loop.3.gv, data/groups/loop.4.gv, data/groups/notknot.dgp, data/groups/quart.1.gv, data/groups/quart.2.gv, data/groups/quart.3.gv, data/groups/equi.3.gv, data/groups/equi.4.gv, data/groups/fig8.dgp, data/groups/g233.prj, data/groups/g234.prj, data/groups/g235.prj, data/groups/g236.prj, data/groups/g237.prj, data/groups/good_klein_quick.dgp, data/groups/hook.off, data/groups/br4.3.tlist, data/groups/dir.1.gv, data/groups/dir.2.gv, data/groups/dir.3.gv, data/groups/dir.4.gv, data/groups/dodec.vect, data/groups/equi.1.gv, data/groups/equi.2.gv, data/groups/94a.dgp, data/groups/94b.dgp, data/groups/borrom.dgp, data/groups/borrom2.dgp, data/groups/borrom3.dgp, data/groups/borrom4.dgp, data/groups/borrom4.wa, data/groups/br4.0.tlist, data/groups/br4.1.tlist, data/groups/br4.2.tlist, data/groups/101a.dgp, data/groups/101b.dgp, data/groups/120.dgp, data/groups/230data, data/groups/230data.Conway, data/groups/230data.lat, data/groups/230data.names, data/groups/3torus.dgp, data/groups/3torus2.dgp: Resurrected from Geomview v1.7 2006-07-27 Mark Phillips * src/lib/oogl/wa/fsaparse.3, AUTHORS, ChangeLog, README, doc/geomview.1, doc/geomview.texi, doc/lisp.3, doc/newsletter_article.txt, src/bin/animate/animate.1, src/bin/example/example.1, src/bin/flythrough/flyhelp, src/bin/flythrough/flyhelp.h, src/bin/flythrough/flythrough.1, src/bin/geomutil/bdy/bdy.1, src/bin/geomutil/maple2oogl/gvplot.mapleV3, src/bin/geomutil/maple2oogl/gvplot.mapleV4, src/bin/geomutil/maple2oogl/gvplot.mapleV8, src/bin/geomutil/math2oogl/OOGL.m, src/bin/geomutil/plutil/anytooff.1, src/bin/geomutil/plutil/offconsol.1, src/bin/geomutil/ucd/anytoucd.1, src/bin/geomutil/ucd/ucdtooff.1, src/bin/geomview/common/drawer.c, src/bin/geomview/geomview.1, src/bin/geomview/x11/gvcamui.c, src/bin/ginsu/ginsu.1, src/bin/hinge/hinge.1, src/bin/sweep/sweep.1, src/bin/sweep/sweep.3, src/bin/tackdown/tackdown.1, src/bin/transformer/transformer.1, src/lib/geomutil/bdy/bdy.3, src/lib/geomutil/geomutil.3, src/lib/geomutil/plutil/anytopl.3, src/lib/geomutil/plutil/plcombine.3, src/lib/geomutil/plutil/plconsol.3: updated contact info in docs and text files 2006-07-26 Claus-Justus Heine * AUTHORS, NEWS, README: Update some email addresses, time stamps, NEWs file. 2006-07-26 Lloyd Wood * INSTALL.Geomview: Pointing to Claus's new README.cvs textfile instead. * README: Updating credits list. * INSTALL.Geomview: Noting requirements for reconf to work. * reconf: Passing parameters through to the autoreconf command -- if reconf warns about --force to replace all files, saying reconf --force will do the expected thing. 2006-07-26 Claus-Justus Heine * src/bin/Makefile.am: Fix handling of XFORMS_SUBDIRS. 2006-07-25 Claus-Justus Heine * ChangeLog: Blah. * ChangeLog: *** empty log message *** * configure.ac: Bump version to 1.8.2-rc6 * src/bin/Makefile.am: hinge, cplxview and flythrough need xforms, disable when xforms is not found. 2006-07-24 Claus-Justus Heine * doc/Makefile.am: Don't include the PS version of the manual in the distro. * ChangeLog: Update. * configure.ac: Fogot to apply BE patch, bump version to rc5. * src/lib/oogl/util/futil.c, src/lib/oogl/util/iobfutil.c: Finally apply _AND_ commit (!) Rex Dieter's patch. * src/bin/stereo/stereo.c: Use PoolInputFile() instead of calling iobfileopen(stdin) a second time. * doc/Makefile.am: Fix pnm->png target. * src/lib/oogl/wa/Makefile.am: Fix dependencies. * doc/Makefile.am: Do not use convert, doesn't work on Cygwin (at least not for me). Use pnmtopng from the netpbm package. * configure.ac: Do not search for xforms dir in source/build directory. * configure: Do not keep it in CVS. * README.cvs: A list of tools needed to rebuild the documentation. * INSTALL.Geomview: Update xforms notice. 2006-07-22 Claus-Justus Heine * configure.ac: Bump version to rc4. 2006-07-20 Claus-Justus Heine * src/lib/aclib/Makefile.am: Should use LTLIBOBJS, not LIBOBJS. 2006-07-19 Claus-Justus Heine * Makefile.am: *** empty log message *** * Makefile.am: Blah * src/lib/oogl/util/iobuffer.c: Remove debugging statements. * src/lib/oogl/refcomm/streampool.c: Open named pipes RDWR to always leave one active writer, PoolSleepFor() is no longer necessary then. 2006-07-18 Claus-Justus Heine * src/lib/oogl/refcomm/streampool.c: Additional comments about why better opening a pipe in read-write mode; opening O_RDWR leaves at least one writer on the pipe: ourselves. This way select may work as usual ... * src/lib/oogl/refcomm/streampool.c: I'm still a little bit puzzled w.r.t. to named pipes and select and blocking/non-blocking IO. * src/lib/oogl/util/iobuffer.c: Correct handling of O_NONBLOCK if HAVE_FCNTL (for efficiency, if iobuffer.c is still broken, we have force HAVE_FCNTL to 0). 2006-07-16 Claus-Justus Heine * src/bin/maniview/.cvsignore, src/bin/maniview/INSTALL, src/bin/maniview/Makefile.am, src/bin/maniview/callbacks.c, src/bin/maniview/configure.ac, src/bin/maniview/controlpanel.c, src/bin/maniview/maniview.c, src/bin/maniview/maniview.h: Ported to new geomview stuff. * src/lib/oogl/util/iobuffer.c, src/lib/oogl/util/malloc-debug.c, src/lib/oogl/util/mallocp.c, src/lib/oogl/util/ooglutil.h, Makefile.am, configure, configure.ac, doc/Makefile.am, geomview.sh, src/bin/flythrough/Makefile.am, src/bin/hinge/Makefile.am, src/lib/fexpr/Makefile.am, src/lib/gprim/comment/commentcreate.c, src/lib/oogl/util/Makefile.am: Slight changes; named pipes must not be run in non-blocking mode, I think. 2006-07-15 Claus-Justus Heine * src/lib/oogl/refcomm/streampool.h, src/lib/oogl/util/findfile.c, src/lib/oogl/util/futil.c, src/lib/oogl/util/glob.c, src/lib/oogl/util/iobfutil.c, src/lib/oogl/util/iobuffer.c, src/lib/oogl/util/iobuffer.h, src/lib/oogl/util/mallocp.c, src/lib/oogl/util/porting.h, src/lib/oogl/util/vvec.c, src/lib/pointlist/pointlist.h, src/lib/shade/appearance.c, src/lib/shade/light.c, src/lib/window/window.c, src/lib/window/winstream.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plnormal.c, src/lib/gprim/polylist/plpick.c, src/lib/gprim/polylist/plsave.c, src/lib/gprim/quad/quadbound.c, src/lib/gprim/quad/quadcopy.c, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadevert.c, src/lib/gprim/quad/quadload.c, src/lib/gprim/quad/quadnormal.c, src/lib/gprim/quad/quadsave.c, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelpick.c, src/lib/gprim/tlist/tlcreate.c, src/lib/gprim/tlist/tltransform.c, src/lib/gprim/vect/vectbound.c, src/lib/gprim/vect/vectcreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/vect/vectload.c, src/lib/gprim/vect/vectpick.c, src/lib/gprim/vect/vectsave.c, src/lib/mg/buf/MGRdolines.h, src/lib/mg/buf/MGRline.h, src/lib/mg/buf/mgbuf.c, src/lib/mg/buf/mgbufdraw.c, src/lib/mg/common/mg.c, src/lib/mg/common/mgshade.c, src/lib/mg/common/mgtexture.c, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglmesh.c, src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/ps/mgps.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11dither.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11shade.c, src/lib/oogl/lisp/lisp.c, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/handle.h, src/lib/oogl/refcomm/reference.c, src/lib/oogl/refcomm/streampool.c, src/lib/gprim/bezier/bezsave.c, src/lib/gprim/comment/commentcreate.c, src/lib/gprim/comment/commentsave.c, src/lib/gprim/comment/commentstream.c, src/lib/gprim/discgrp/complex.c, src/lib/gprim/discgrp/dgbound.c, src/lib/gprim/discgrp/dgcopy.c, src/lib/gprim/discgrp/dgcreate.c, src/lib/gprim/discgrp/dgdirdom.c, src/lib/gprim/discgrp/dgdraw.c, src/lib/gprim/discgrp/dgenum.c, src/lib/gprim/discgrp/matlist.c, src/lib/gprim/discgrp/projective.c, src/lib/gprim/discgrp/xform.c, src/lib/gprim/geom/class.c, src/lib/gprim/geom/create.c, src/lib/gprim/geom/extend.c, src/lib/gprim/geom/geomstream.c, src/lib/gprim/geom/iterate.c, src/lib/gprim/geom/knownclass.c, src/lib/gprim/geom/pick.c, src/lib/gprim/inst/instbound.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/inst/instsphere.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/lincoln/lincolnload.c, src/lib/gprim/list/listcreate.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/list/listmisc.c, src/lib/gprim/list/listpick.c, src/lib/gprim/list/listsphere.c, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/mesh/meshcopy.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/mesh/meshload.c, src/lib/gprim/mesh/meshnormal.c, src/lib/gprim/mesh/meshpick.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plcopy.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/polylist/plevert.c, src/bin/geomutil/oogl2vrml/oogl2vrml2.c, src/bin/geomutil/plutil/polymerge.c, src/bin/geomutil/ucd/anytoucd.c, src/bin/geomutil/ucd/stack.c, src/bin/geomview/common/comm.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/event.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/shaders.c, src/bin/geomview/common/space.c, src/bin/geomview/common/ui.c, src/bin/geomview/common/ui.h, src/bin/geomview/common/worldio.c, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvtoolui.c, src/bin/hinge/panel.c, src/lib/aclib/alloca.c, src/lib/aclib/putenv.c, src/lib/camera/camcompat.c, src/lib/camera/camera.c, src/lib/camera/camstream.c, src/lib/color/mergein.c, src/lib/color/mergeout.c, src/lib/color/mergeover.c, src/lib/color/mergeunder.c, src/lib/color/paintcopy.c, src/lib/color/paintover.c, src/lib/fexpr/lex.yy.c, src/lib/forms/xforms-compat.h, src/lib/geometry/hpoint3/hg4.c, src/lib/geometry/hpoint3/hpoint3.c, src/lib/geometry/hpointn/hpointnb.c, src/lib/geometry/point3/point3.c, src/lib/geometry/point3/segments.c, src/lib/geometry/transform3/ctm3rotate.c, src/lib/geometry/transform3/ctm3scale.c, src/lib/geometry/transform3/ctm3translate.c, src/lib/geometry/transform3/tm3adjoint.c, src/lib/geometry/transform3/tm3concat.c, src/lib/geometry/transform3/tm3invert.c, src/lib/geometry/transform3/tm3transpose.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transobj/transobj.c, src/lib/geomutil/plutil/anytopl.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/bbox/bboxunion.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezevert.c, src/bin/animate/glob.c, src/bin/animate/glob.h, src/bin/cplxview/computegraph.c, src/bin/example/oogl.c: Do not use the "register" keyword. Modern compilers do this kind of stuff themselves. * configure.ac: Unix domain socket stuff (listen, accept, socket etc) * m4/geom_local.m4: configure.in -> configure.ac * doc/Makefile.am: Do not delete html and pdf with "make clean". * src/lib/oogl/util/glibglue.C, src/lib/oogl/util/seekpipe.c: No longer needed. 2006-07-14 Claus-Justus Heine * src/lib/aclib/strcasecmp.c, src/lib/aclib/strdup.c, src/lib/aclib/strncasecmp.c, src/lib/aclib/acosh.c, src/lib/aclib/popen.c, src/lib/aclib/putenv.c: Initial revision, copied here from "porting.c" * src/lib/oogl/util/ppopen.c, src/lib/oogl/util/vvec.c, src/lib/pointlist/pointlist.c, src/lib/pointlist/ptlBezier.c, src/lib/pointlist/ptlInst.c, src/lib/pointlist/ptlList.c, src/lib/pointlist/ptlMesh.c, src/lib/pointlist/ptlPolylist.c, src/lib/pointlist/ptlQuad.c, src/lib/pointlist/ptlVect.c, src/lib/shade/appearance.c, src/lib/shade/apstream.c, src/lib/shade/light.c, src/lib/window/window.c, src/lib/window/winstream.c, src/lib/mib/mibDrawArea.c, src/lib/mib/mibFrame.c, src/lib/mib/mibLabel.c, src/lib/mib/mibList.c, src/lib/mib/mibMenu.c, src/lib/mib/mibRadioBox.c, src/lib/mib/mibScale.c, src/lib/mib/mibScrollBar.c, src/lib/mib/mibTextBig.c, src/lib/mib/mibTextBox.c, src/lib/mib/mibToggle.c, src/lib/mib/mibload.c, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/reference.c, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/refcomm/streampool.h, src/lib/oogl/util/Makefile.am, src/lib/oogl/util/error.c, src/lib/oogl/util/findfile.c, src/lib/oogl/util/fsa.c, src/lib/oogl/util/glob.c, src/lib/oogl/util/iobuffer.c, src/lib/oogl/util/mallocp.c, src/lib/oogl/util/porting.c, src/lib/oogl/util/porting.h, src/lib/mg/buf/mgbufrender.c, src/lib/mg/buf/mgbufrender24.c, src/lib/mg/common/mg.c, src/lib/mg/common/mgshade.c, src/lib/mg/common/mgtexture.c, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglmesh.c, src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/ps/mgps.c, src/lib/mg/ps/mgpsclip.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/ps/mgpstri.c, src/lib/mg/ps/mgpswindows.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgributil.c, src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11clip.c, src/lib/mg/x11/mgx11dither.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11render1.c, src/lib/mg/x11/mgx11render16.c, src/lib/mg/x11/mgx11render8.c, src/lib/mg/x11/mgx11shade.c, src/lib/mg/x11/mgx11visual.c, src/lib/mg/x11/mgx11windows.c, src/lib/mib/mibButton.c, src/lib/gprim/stub/inst.c, src/lib/gprim/stub/lincoln.c, src/lib/gprim/stub/list.c, src/lib/gprim/stub/mesh.c, src/lib/gprim/stub/ndmesh.c, src/lib/gprim/stub/npolylist.c, src/lib/gprim/stub/polylist.c, src/lib/gprim/stub/quad.c, src/lib/gprim/stub/skel.c, src/lib/gprim/stub/sphere.c, src/lib/gprim/stub/stub.c, src/lib/gprim/stub/stubdraw.c, src/lib/gprim/stub/tlist.c, src/lib/gprim/stub/vect.c, src/lib/gprim/tlist/tlclass.c, src/lib/gprim/tlist/tlcreate.c, src/lib/gprim/tlist/tlstream.c, src/lib/gprim/tlist/tltransform.c, src/lib/gprim/vect/vectbound.c, src/lib/gprim/vect/vectclass.c, src/lib/gprim/vect/vectcreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/vect/vectload.c, src/lib/gprim/vect/vectpick.c, src/lib/gprim/vect/vectsave.c, src/lib/gprim/vect/vectsphere.c, src/lib/gprim/vect/vecttransform.c, src/lib/mg/buf/mgbuf.c, src/lib/mg/buf/mgbufclip.c, src/lib/mg/buf/mgbufdraw.c, src/lib/gprim/polylist/plevert.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plnormal.c, src/lib/gprim/polylist/plpick.c, src/lib/gprim/polylist/plsave.c, src/lib/gprim/polylist/plsphere.c, src/lib/gprim/polylist/pltransform.c, src/lib/gprim/quad/quadbound.c, src/lib/gprim/quad/quadclass.c, src/lib/gprim/quad/quadcopy.c, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/quad/quaddelete.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadevert.c, src/lib/gprim/quad/quadload.c, src/lib/gprim/quad/quadnormal.c, src/lib/gprim/quad/quadpick.c, src/lib/gprim/quad/quadsave.c, src/lib/gprim/quad/quadsphere.c, src/lib/gprim/quad/quadtransform.c, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skelclass.c, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skelpick.c, src/lib/gprim/skel/skelsave.c, src/lib/gprim/skel/skeltransform.c, src/lib/gprim/sphere/sphereclass.c, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/sphere/sphereload.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/sphere/spheresave.c, src/lib/gprim/stub/bbox.c, src/lib/gprim/stub/bezier.c, src/lib/gprim/stub/bezierlist.c, src/lib/gprim/stub/comment.c, src/lib/gprim/stub/discgrp.c, src/lib/gprim/mesh/meshevert.c, src/lib/gprim/mesh/meshload.c, src/lib/gprim/mesh/meshnormal.c, src/lib/gprim/mesh/meshpick.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/mesh/meshsphere.c, src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshclass.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/npolylist/nplcopy.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plclass.c, src/lib/gprim/polylist/plcopy.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/inst/instclass.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instdraw.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/inst/instpick.c, src/lib/gprim/inst/instsphere.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/lincoln/lincolnclass.c, src/lib/gprim/lincoln/lincolnload.c, src/lib/gprim/list/listclass.c, src/lib/gprim/list/listcreate.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/list/listmisc.c, src/lib/gprim/list/listpick.c, src/lib/gprim/list/listsphere.c, src/lib/gprim/list/liststream.c, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/mesh/meshclass.c, src/lib/gprim/mesh/meshcopy.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshdelete.c, src/lib/gprim/mesh/meshdice.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/discgrp/dgpick.c, src/lib/gprim/discgrp/dgsave.c, src/lib/gprim/discgrp/dgstream.c, src/lib/gprim/discgrp/dgtransform.c, src/lib/gprim/discgrp/dhpoint3.c, src/lib/gprim/discgrp/matlist.c, src/lib/gprim/discgrp/outstack.c, src/lib/gprim/discgrp/polyhedron.c, src/lib/gprim/discgrp/projective.c, src/lib/gprim/discgrp/stack.c, src/lib/gprim/discgrp/util.c, src/lib/gprim/discgrp/weeks_dirdom.c, src/lib/gprim/discgrp/xform.c, src/lib/gprim/geom/bound.c, src/lib/gprim/geom/boundsphere.c, src/lib/gprim/geom/class.c, src/lib/gprim/geom/copy.c, src/lib/gprim/geom/create.c, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/dice.c, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/evert.c, src/lib/gprim/geom/extend.c, src/lib/gprim/geom/geomstream.c, src/lib/gprim/geom/handlescan.c, src/lib/gprim/geom/iterate.c, src/lib/gprim/geom/knownclass.c, src/lib/gprim/geom/message.c, src/lib/gprim/geom/name.c, src/lib/gprim/geom/pick.c, src/lib/gprim/geom/replace.c, src/lib/gprim/geom/transform.c, src/lib/gprim/inst/instbound.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/bezier/bezclass.c, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/bezier/bezdraw.c, src/lib/gprim/bezier/bezevert.c, src/lib/gprim/bezier/bezload.c, src/lib/gprim/bezier/bezpick.c, src/lib/gprim/bezier/bezsave.c, src/lib/gprim/bezier/bezsphere.c, src/lib/gprim/bezier/beztransform.c, src/lib/gprim/comment/commentclass.c, src/lib/gprim/comment/commentcreate.c, src/lib/gprim/comment/commentsave.c, src/lib/gprim/comment/commentstream.c, src/lib/gprim/discgrp/colormap.c, src/lib/gprim/discgrp/complex.c, src/lib/gprim/discgrp/dgbound.c, src/lib/gprim/discgrp/dgclass.c, src/lib/gprim/discgrp/dgconstraint.c, src/lib/gprim/discgrp/dgcopy.c, src/lib/gprim/discgrp/dgcreate.c, src/lib/gprim/discgrp/dgdelete.c, src/lib/gprim/discgrp/dgdirdom.c, src/lib/gprim/discgrp/dgdraw.c, src/lib/gprim/discgrp/dgenum.c, src/lib/gprim/discgrp/dgevert.c, src/lib/gprim/discgrp/dgmisc.c, src/lib/geometry/transform3/tm3stack.c, src/lib/geometry/transform3/tm3tetrad.c, src/lib/geometry/transform3/tm3translate.c, src/lib/geometry/transform3/tm3transpose.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transobj/transobj.c, src/lib/geomutil/bdy/bdy.c, src/lib/geomutil/crayplutil/crayBezier.c, src/lib/geomutil/crayplutil/crayInst.c, src/lib/geomutil/crayplutil/crayList.c, src/lib/geomutil/crayplutil/crayMesh.c, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/crayQuad.c, src/lib/geomutil/crayplutil/crayVect.c, src/lib/geomutil/crayplutil/crayola.c, src/lib/geomutil/dim/dim.c, src/lib/geomutil/plutil/anytopl.c, src/lib/geomutil/plutil/plcombine.c, src/lib/geomutil/plutil/plconsol.c, src/lib/gprim/bbox/bboxbound.c, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bbox/bboxcopy.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bbox/bboxload.c, src/lib/gprim/bbox/bboxminmax.c, src/lib/gprim/bbox/bboxsave.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/bbox/bboxunion.c, src/lib/geometry/hpoint3/hpoint3b.c, src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/hpointn/hpointnb.c, src/lib/geometry/point3/point3.c, src/lib/geometry/point3/polyint.c, src/lib/geometry/point3/segments.c, src/lib/geometry/transform3/ctm3align.c, src/lib/geometry/transform3/ctm3ortho.c, src/lib/geometry/transform3/ctm3persp.c, src/lib/geometry/transform3/ctm3perspfov.c, src/lib/geometry/transform3/ctm3rotate.c, src/lib/geometry/transform3/ctm3scale.c, src/lib/geometry/transform3/ctm3tetrad.c, src/lib/geometry/transform3/ctm3translate.c, src/lib/geometry/transform3/tm3adjoint.c, src/lib/geometry/transform3/tm3align.c, src/lib/geometry/transform3/tm3concat.c, src/lib/geometry/transform3/tm3conjugate.c, src/lib/geometry/transform3/tm3copy.c, src/lib/geometry/transform3/tm3dual.c, src/lib/geometry/transform3/tm3identity.c, src/lib/geometry/transform3/tm3invert.c, src/lib/geometry/transform3/tm3ortho.c, src/lib/geometry/transform3/tm3persp.c, src/lib/geometry/transform3/tm3perspfov.c, src/lib/geometry/transform3/tm3print.c, src/lib/geometry/transform3/tm3rotate.c, src/lib/geometry/transform3/tm3scale.c, src/lib/color/color.c, src/lib/color/mergein.c, src/lib/color/mergeout.c, src/lib/color/mergeover.c, src/lib/color/mergeplus.c, src/lib/color/mergeunder.c, src/lib/color/paintcopy.c, src/lib/color/paintover.c, src/lib/fexpr/binfuncs.c, src/lib/fexpr/complex.c, src/lib/fexpr/evaluate.c, src/lib/fexpr/exprs.c, src/lib/fexpr/lex.yy.c, src/lib/fexpr/monfuncs.c, src/lib/fexpr/real.c, src/lib/fexpr/vars.c, src/lib/geometry/cmodel/cm_geometry.c, src/lib/geometry/cmodel/cmodel.c, src/lib/geometry/cmodel/cmodel_data.c, src/lib/geometry/hpoint3/hg4.c, src/lib/geometry/hpoint3/hline3.c, src/lib/geometry/hpoint3/hplane3.c, src/lib/geometry/hpoint3/hpoint3.c, src/lib/geometry/hpoint3/hpoint3a.c, src/bin/geomview/x11/gvappear.c, src/bin/geomview/x11/gvcameras.c, src/bin/geomview/x11/gvcolor.c, src/bin/geomview/x11/gvcommands.c, src/bin/geomview/x11/gvcredits.c, src/bin/geomview/x11/gvevent.c, src/bin/geomview/x11/gvfiles.c, src/bin/geomview/x11/gvlights.c, src/bin/geomview/x11/gvload.c, src/bin/geomview/x11/gvmain.c, src/bin/geomview/x11/gvmaterial.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/gvtoolui.c, src/bin/geomview/x11/gvui.c, src/bin/togeomview/Makefile.am, src/bin/togeomview/togeomview.c, src/lib/Makefile.am, src/lib/camera/camcompat.c, src/lib/camera/camera.c, src/lib/camera/camstream.c, src/bin/geomview/common/ndshade.c, src/bin/geomview/common/rman.c, src/bin/geomview/common/shaders.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, src/bin/geomview/common/ui.c, src/bin/geomview/common/version.h, src/bin/geomview/common/worldio.c, src/bin/geomview/common/mouse.c, src/bin/animate/glob.c, src/bin/animate/xanimate.c, src/bin/geomutil/math2oogl/math2oogl.c, src/bin/geomutil/vrml2oogl/Makefile.am, src/bin/geomview/common/comm.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/event.c, src/bin/geomview/common/lang.c, src/bin/geomview/common/lights.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/main.c, src/bin/geomview/common/motion.c, configure, configure.ac, doc/Makefile.am, src/bin/animate/animate.c: Mostly cosmetic changes, still something wrong ... * src/lib/oogl/util/Makefile.am, src/lib/oogl/util/error.c, src/lib/oogl/util/futil.c, src/lib/oogl/util/glob.c, src/lib/oogl/util/iobfutil.c, src/lib/oogl/util/iobuffer.c, src/lib/oogl/util/iobuffer.h, src/lib/oogl/util/ooglutil.h, src/lib/oogl/wa/.cvsignore, src/lib/oogl/wa/Makefile.am, src/lib/pointlist/.cvsignore, src/lib/pointlist/Makefile.am, src/lib/shade/.cvsignore, src/lib/shade/Makefile.am, src/lib/shade/appearance.c, src/lib/shade/appearance.h, src/lib/shade/light.c, src/lib/window/.cvsignore, src/lib/window/Makefile.am, src/lib/window/winstream.c, src/lib/gprim/npolylist/Makefile.am, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/npolylist.h, src/lib/gprim/polylist/.cvsignore, src/lib/gprim/polylist/Makefile.am, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/polylist.h, src/lib/gprim/quad/.cvsignore, src/lib/gprim/quad/Makefile.am, src/lib/gprim/quad/quad.h, src/lib/gprim/quad/quadload.c, src/lib/gprim/skel/.cvsignore, src/lib/gprim/skel/Makefile.am, src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelload.c, src/lib/gprim/sphere/.cvsignore, src/lib/gprim/sphere/Makefile.am, src/lib/gprim/sphere/sphereP.h, src/lib/gprim/sphere/sphereload.c, src/lib/gprim/stub/.cvsignore, src/lib/gprim/stub/Makefile.am, src/lib/gprim/tlist/.cvsignore, src/lib/gprim/tlist/Makefile.am, src/lib/gprim/tlist/tlstream.c, src/lib/gprim/vect/.cvsignore, src/lib/gprim/vect/Makefile.am, src/lib/gprim/vect/vectload.c, src/lib/mg/.cvsignore, src/lib/mg/Makefile.am, src/lib/mg/buf/.cvsignore, src/lib/mg/buf/Makefile.am, src/lib/mg/common/.cvsignore, src/lib/mg/common/Makefile.am, src/lib/mg/common/mgtexture.c, src/lib/mg/opengl/.cvsignore, src/lib/mg/opengl/Makefile.am, src/lib/mg/ps/.cvsignore, src/lib/mg/ps/Makefile.am, src/lib/mg/rib/.cvsignore, src/lib/mg/rib/Makefile.am, src/lib/mg/x11/.cvsignore, src/lib/mg/x11/Makefile.am, src/lib/mib/.cvsignore, src/lib/oogl/.cvsignore, src/lib/oogl/Makefile.am, src/lib/oogl/lisp/.cvsignore, src/lib/oogl/lisp/Makefile.am, src/lib/oogl/lisp/lisp.c, src/lib/oogl/lisp/lisp.h, src/lib/oogl/refcomm/.cvsignore, src/lib/oogl/refcomm/Makefile.am, src/lib/oogl/refcomm/handleP.h, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/refcomm/streampool.h, src/lib/oogl/util/.cvsignore, src/lib/oogl/util/Headers, src/lib/geometry/transobj/transobj.c, src/lib/geomutil/.cvsignore, src/lib/geomutil/bdy/.cvsignore, src/lib/geomutil/bdy/Makefile.am, src/lib/geomutil/crayplutil/.cvsignore, src/lib/geomutil/crayplutil/Makefile.am, src/lib/geomutil/dim/.cvsignore, src/lib/geomutil/dim/Makefile.am, src/lib/geomutil/plutil/.cvsignore, src/lib/geomutil/plutil/Makefile.am, src/lib/geomutil/plutil/anytopl.c, src/lib/gprim/.cvsignore, src/lib/gprim/bbox/.cvsignore, src/lib/gprim/bbox/Makefile.am, src/lib/gprim/bbox/bboxload.c, src/lib/gprim/bezier/.cvsignore, src/lib/gprim/bezier/Makefile.am, src/lib/gprim/bezier/bezload.c, src/lib/gprim/comment/.cvsignore, src/lib/gprim/comment/Makefile.am, src/lib/gprim/comment/commentstream.c, src/lib/gprim/discgrp/.cvsignore, src/lib/gprim/discgrp/Makefile.am, src/lib/gprim/discgrp/complex.h, src/lib/gprim/discgrp/dgstream.c, src/lib/gprim/geom/.cvsignore, src/lib/gprim/geom/Makefile.am, src/lib/gprim/geom/geom.h, src/lib/gprim/geom/geomclass.h, src/lib/gprim/geom/geomstream.c, src/lib/gprim/inst/.cvsignore, src/lib/gprim/inst/Makefile.am, src/lib/gprim/inst/inststream.c, src/lib/gprim/lincoln/.cvsignore, src/lib/gprim/lincoln/Makefile.am, src/lib/gprim/lincoln/lincolnload.c, src/lib/gprim/list/.cvsignore, src/lib/gprim/list/Makefile.am, src/lib/gprim/list/liststream.c, src/lib/gprim/mesh/.cvsignore, src/lib/gprim/mesh/Makefile.am, src/lib/gprim/mesh/mesh.h, src/lib/gprim/mesh/meshload.c, src/lib/gprim/ndmesh/.cvsignore, src/lib/gprim/ndmesh/Makefile.am, src/lib/gprim/ndmesh/ndmesh.h, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/npolylist/.cvsignore, src/bin/graffiti/graffiti.h, src/bin/graffiti/gui.c, src/bin/graffiti/lang.c, src/bin/graffiti/lang.h, src/bin/hinge/.cvsignore, src/bin/hinge/Makefile.am, src/bin/hinge/hinge.c, src/bin/hinge/hinge.h, src/bin/hinge/hui.c, src/bin/hinge/hui.h, src/bin/hinge/lang.c, src/bin/hinge/lang.h, src/bin/stereo/.cvsignore, src/bin/stereo/Makefile.am, src/bin/stereo/stereo.c, src/bin/sweep/.cvsignore, src/bin/sweep/Makefile.am, src/bin/sweep/sweep.main.c, src/bin/tackdown/.cvsignore, src/bin/tackdown/Makefile.am, src/bin/tackdown/origin.common.c, src/bin/tackdown/tackdown.main.c, src/bin/togeomview/.cvsignore, src/bin/transformer/.cvsignore, src/bin/transformer/Makefile.am, src/lib/.cvsignore, src/lib/Makefile.am, src/lib/aclib/.cvsignore, src/lib/camera/.cvsignore, src/lib/camera/Makefile.am, src/lib/camera/camcompat.c, src/lib/camera/camera.h, src/lib/camera/camstream.c, src/lib/color/.cvsignore, src/lib/color/Makefile.am, src/lib/fexpr/.cvsignore, src/lib/fexpr/Makefile.am, src/lib/forms/.cvsignore, src/lib/geometry/.cvsignore, src/lib/geometry/cmodel/.cvsignore, src/lib/geometry/cmodel/Makefile.am, src/lib/geometry/hpoint3/.cvsignore, src/lib/geometry/hpoint3/Makefile.am, src/lib/geometry/hpointn/.cvsignore, src/lib/geometry/hpointn/Makefile.am, src/lib/geometry/point3/.cvsignore, src/lib/geometry/point3/Makefile.am, src/lib/geometry/transform3/.cvsignore, src/lib/geometry/transform3/Makefile.am, src/lib/geometry/transformn/.cvsignore, src/lib/geometry/transformn/Makefile.am, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transformn/transformn.h, src/lib/geometry/transobj/.cvsignore, src/lib/geometry/transobj/Makefile.am, src/bin/flythrough/data/.cvsignore, src/bin/flythrough/main.c, src/bin/flythrough/panel.h, src/bin/geomutil/.cvsignore, src/bin/geomutil/bdy/.cvsignore, src/bin/geomutil/bdy/Makefile.am, src/bin/geomutil/bdy/bdy.c, src/bin/geomutil/clip/.cvsignore, src/bin/geomutil/clip/Makefile.am, src/bin/geomutil/clip/clipmain.c, src/bin/geomutil/maple2oogl/.cvsignore, src/bin/geomutil/maple2oogl/gvplot.mapleV8, src/bin/geomutil/maple2oogl/gvplot.mws, src/bin/geomutil/maple2oogl/savegvplot.mws, src/bin/geomutil/math2oogl/.cvsignore, src/bin/geomutil/oogl2rib/.cvsignore, src/bin/geomutil/oogl2rib/Makefile.am, src/bin/geomutil/oogl2rib/oogl2rib.c, src/bin/geomutil/oogl2vrml/.cvsignore, src/bin/geomutil/oogl2vrml/Makefile.am, src/bin/geomutil/oogl2vrml/oogl2vrml.c, src/bin/geomutil/oogl2vrml/oogl2vrml2.c, src/bin/geomutil/plutil/.cvsignore, src/bin/geomutil/plutil/Makefile.am, src/bin/geomutil/plutil/anytooff.main.c, src/bin/geomutil/plutil/bez2mesh.c, src/bin/geomutil/plutil/offconsol.main.c, src/bin/geomutil/plutil/polymerge.c, src/bin/geomutil/ucd/.cvsignore, src/bin/geomutil/ucd/Makefile.am, src/bin/geomutil/ucd/anytoucd.c, src/bin/geomutil/ucd/ucdtooff.c, src/bin/geomutil/vrml2oogl/.cvsignore, src/bin/geomutil/vrml2oogl/lib/.cvsignore, src/bin/geomview/.cvsignore, src/bin/geomview/common/.cvsignore, src/bin/geomview/common/comm.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/lights.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/worldio.c, src/bin/geomview/x11/.cvsignore, src/bin/geomview/x11/Makefile.am, src/bin/geomview/x11/bitmaps/.cvsignore, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/interface/.cvsignore, src/bin/ginsu/.cvsignore, src/bin/ginsu/Makefile.am, src/bin/ginsu/ginsu.c, src/bin/graffiti/.cvsignore, src/bin/graffiti/Makefile.am, src/bin/graffiti/graffiti.c, .cvsignore, INSTALL.Geomview, README.cvs, configure, configure.ac, data/.cvsignore, data/geom/.cvsignore, data/geom/pieces/.cvsignore, data/geom/polyhedra/.cvsignore, data/geom/spherical/.cvsignore, data/geom/textured/.cvsignore, doc/.cvsignore, doc/figs/.cvsignore, geomview.sh, m4/.cvsignore, src/.cvsignore, src/bin/.cvsignore, src/bin/Makefile.am, src/bin/animate/.cvsignore, src/bin/animate/Makefile.am, src/bin/animate/interface/.cvsignore, src/bin/cplxview/.cvsignore, src/bin/cplxview/Makefile.am, src/bin/cplxview/computegraph.c, src/bin/cplxview/cplxview.c, src/bin/example/.cvsignore, src/bin/example/Makefile.am, src/bin/flythrough/.cvsignore, src/bin/flythrough/Makefile.am: * use one shared library (i.e. libgeomview.so) * do not use undocumented stdio internals * src/lib/aclib/fmemopen.c -- fmemopen replacement * src/lib/oogl/utilt/iobuffer.[ch] -- totally buffered input, with seekback (pipes) * a bunch of autoconf changes * OpenGL is optional again * reenable hinge module * reenable flythrough module * reenable cplxview module * src/lib/aclib/Makefile.am, src/lib/aclib/alloca.c, src/lib/aclib/fmemopen.c, src/lib/aclib/lstat.c, src/lib/aclib/memcmp.c, src/lib/aclib/stat.c, src/lib/aclib/strtod.c: Initial revision. 2006-07-11 Claus-Justus Heine * src/lib/oogl/util/iobuffer.c: Initial revision, not working yet. 2006-07-10 Claus-Justus Heine * src/lib/pointlist/ptlInst.c, src/lib/pointlist/ptlList.c, src/lib/pointlist/ptlMesh.c, src/lib/pointlist/ptlPolylist.c, src/lib/pointlist/ptlQuad.c, src/lib/pointlist/ptlVect.c, src/lib/geomutil/crayplutil/crayMesh.c, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/crayQuad.c, src/lib/geomutil/crayplutil/crayVect.c, src/lib/geomutil/crayplutil/crayola.c, src/lib/geomutil/dim/dim.c, src/lib/oogl/lisp/lisp.c, src/lib/oogl/refcomm/streampool.c, src/lib/pointlist/pointlist.c, src/lib/pointlist/ptlBezier.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/space.c, src/bin/geomview/x11/gvappear.c, src/bin/geomview/x11/gvcameras.c, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvcolor.c, src/bin/geomview/x11/gvevent.c, src/bin/geomview/x11/gvmaterial.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/gvtoolui.c, src/lib/geomutil/crayplutil/crayBezier.c, src/lib/geomutil/crayplutil/crayInst.c, src/lib/geomutil/crayplutil/crayList.c: Remove a couple of "cast from pointer to integer of different size" warnings (and vice versa). 2006-07-08 Claus-Justus Heine * .cvsignore, doc/.cvsignore, src/bin/.cvsignore, src/bin/animate/.cvsignore, src/bin/example/.cvsignore, src/bin/geomutil/bdy/.cvsignore, src/bin/geomutil/oogl2vrml/.cvsignore, src/bin/geomview/x11/.cvsignore, src/lib/geometry/cmodel/.cvsignore: Ignore some stuff. * src/lib/mib/mibTextBox.c, src/lib/mib/mibToggle.c, src/lib/mib/mibload.c, src/lib/mib/mibload.h, src/lib/oogl/lisp/lisp.c, src/lib/oogl/lisp/lisp.h, src/lib/oogl/refcomm/handle.c, src/lib/oogl/refcomm/reference.c, src/lib/oogl/refcomm/streampool.c, src/lib/oogl/util/error.c, src/lib/oogl/util/findfile.c, src/lib/oogl/util/fsa.c, src/lib/oogl/util/futil.c, src/lib/oogl/util/glob.c, src/lib/oogl/util/mallocp.c, src/lib/oogl/util/porting.c, src/lib/oogl/util/ppopen.c, src/lib/oogl/util/seekpipe.c, src/lib/oogl/util/vvec.c, src/lib/oogl/wa/Makefile.am, src/lib/oogl/wa/fsaparse.y, src/lib/oogl/wa/wa.h, src/lib/oogl/wa/yystype.h, src/lib/pointlist/pointlist.c, src/lib/pointlist/ptlBezier.c, src/lib/pointlist/ptlInst.c, src/lib/pointlist/ptlList.c, src/lib/pointlist/ptlMesh.c, src/lib/pointlist/ptlPolylist.c, src/lib/pointlist/ptlQuad.c, src/lib/pointlist/ptlVect.c, src/lib/shade/appearance.c, src/lib/shade/apstream.c, src/lib/shade/light.c, src/lib/window/window.c, src/lib/window/window.h, src/lib/window/winstream.c, src/lib/gprim/stub/vect.c, src/lib/gprim/tlist/tlclass.c, src/lib/gprim/tlist/tlcreate.c, src/lib/gprim/tlist/tlstream.c, src/lib/gprim/tlist/tltransform.c, src/lib/gprim/vect/vect.h, src/lib/gprim/vect/vectbound.c, src/lib/gprim/vect/vectclass.c, src/lib/gprim/vect/vectcreate.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/vect/vectload.c, src/lib/gprim/vect/vectpick.c, src/lib/gprim/vect/vectsave.c, src/lib/gprim/vect/vectsphere.c, src/lib/gprim/vect/vecttransform.c, src/lib/mg/buf/mgbuf.c, src/lib/mg/buf/mgbufclip.c, src/lib/mg/buf/mgbufdraw.c, src/lib/mg/buf/mgbufrender.c, src/lib/mg/buf/mgbufrender24.c, src/lib/mg/common/mg.c, src/lib/mg/common/mgshade.c, src/lib/mg/common/mgtexture.c, src/lib/mg/opengl/mgopengl.c, src/lib/mg/opengl/mgopengldraw.c, src/lib/mg/opengl/mgopenglmesh.c, src/lib/mg/opengl/mgopenglshade.c, src/lib/mg/ps/mgps.c, src/lib/mg/ps/mgpsclip.c, src/lib/mg/ps/mgpsdraw.c, src/lib/mg/ps/mgpstri.c, src/lib/mg/ps/mgpswindows.c, src/lib/mg/rib/mgrib.c, src/lib/mg/rib/mgribdraw.c, src/lib/mg/rib/mgribmesh.c, src/lib/mg/rib/mgribshade.c, src/lib/mg/rib/mgribtoken.c, src/lib/mg/rib/mgributil.c, src/lib/mg/x11/mgx11.c, src/lib/mg/x11/mgx11clip.c, src/lib/mg/x11/mgx11draw.c, src/lib/mg/x11/mgx11render1.c, src/lib/mg/x11/mgx11render16.c, src/lib/mg/x11/mgx11render8.c, src/lib/mg/x11/mgx11shade.c, src/lib/mg/x11/mgx11visual.c, src/lib/mg/x11/mgx11windows.c, src/lib/mib/mibButton.c, src/lib/mib/mibDrawArea.c, src/lib/mib/mibFrame.c, src/lib/mib/mibLabel.c, src/lib/mib/mibList.c, src/lib/mib/mibMenu.c, src/lib/mib/mibRadioBox.c, src/lib/mib/mibScale.c, src/lib/mib/mibScrollBar.c, src/lib/mib/mibTextBig.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/ndmesh/ndmeshdraw.c, src/lib/gprim/ndmesh/ndmeshload.c, src/lib/gprim/ndmesh/ndmeshsave.c, src/lib/gprim/npolylist/nplbound.c, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/npolylist/nplcopy.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/npldraw.c, src/lib/gprim/npolylist/nplload.c, src/lib/gprim/npolylist/nplsave.c, src/lib/gprim/polylist/plbound.c, src/lib/gprim/polylist/plclass.c, src/lib/gprim/polylist/plcopy.c, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/pldraw.c, src/lib/gprim/polylist/plevert.c, src/lib/gprim/polylist/plload.c, src/lib/gprim/polylist/plnormal.c, src/lib/gprim/polylist/plpick.c, src/lib/gprim/polylist/plsave.c, src/lib/gprim/polylist/plsphere.c, src/lib/gprim/polylist/pltransform.c, src/lib/gprim/quad/quadbound.c, src/lib/gprim/quad/quadclass.c, src/lib/gprim/quad/quadcopy.c, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/quad/quaddelete.c, src/lib/gprim/quad/quaddraw.c, src/lib/gprim/quad/quadevert.c, src/lib/gprim/quad/quadload.c, src/lib/gprim/quad/quadnormal.c, src/lib/gprim/quad/quadpick.c, src/lib/gprim/quad/quadsave.c, src/lib/gprim/quad/quadsphere.c, src/lib/gprim/quad/quadtransform.c, src/lib/gprim/skel/skelbound.c, src/lib/gprim/skel/skelclass.c, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/skel/skeldraw.c, src/lib/gprim/skel/skelload.c, src/lib/gprim/skel/skelpick.c, src/lib/gprim/skel/skelsave.c, src/lib/gprim/skel/skeltransform.c, src/lib/gprim/sphere/sphereclass.c, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/sphere/sphereload.c, src/lib/gprim/sphere/spheremisc.c, src/lib/gprim/sphere/spheresave.c, src/lib/gprim/stub/bbox.c, src/lib/gprim/stub/bezier.c, src/lib/gprim/stub/bezierlist.c, src/lib/gprim/stub/comment.c, src/lib/gprim/stub/discgrp.c, src/lib/gprim/stub/inst.c, src/lib/gprim/stub/lincoln.c, src/lib/gprim/stub/list.c, src/lib/gprim/stub/mesh.c, src/lib/gprim/stub/ndmesh.c, src/lib/gprim/stub/npolylist.c, src/lib/gprim/stub/polylist.c, src/lib/gprim/stub/quad.c, src/lib/gprim/stub/skel.c, src/lib/gprim/stub/sphere.c, src/lib/gprim/stub/stub.c, src/lib/gprim/stub/stubdraw.c, src/lib/gprim/stub/tlist.c, src/lib/gprim/geom/draw.c, src/lib/gprim/geom/evert.c, src/lib/gprim/geom/extend.c, src/lib/gprim/geom/geomstream.c, src/lib/gprim/geom/handlescan.c, src/lib/gprim/geom/iterate.c, src/lib/gprim/geom/knownclass.c, src/lib/gprim/geom/message.c, src/lib/gprim/geom/name.c, src/lib/gprim/geom/pick.c, src/lib/gprim/geom/replace.c, src/lib/gprim/geom/transform.c, src/lib/gprim/inst/instbound.c, src/lib/gprim/inst/instclass.c, src/lib/gprim/inst/instcreate.c, src/lib/gprim/inst/instdraw.c, src/lib/gprim/inst/instmisc.c, src/lib/gprim/inst/instpick.c, src/lib/gprim/inst/instsphere.c, src/lib/gprim/inst/inststream.c, src/lib/gprim/lincoln/lincolnclass.c, src/lib/gprim/lincoln/lincolnload.c, src/lib/gprim/list/listclass.c, src/lib/gprim/list/listcreate.c, src/lib/gprim/list/listdraw.c, src/lib/gprim/list/listmisc.c, src/lib/gprim/list/listpick.c, src/lib/gprim/list/listsphere.c, src/lib/gprim/list/liststream.c, src/lib/gprim/mesh/meshbound.c, src/lib/gprim/mesh/meshclass.c, src/lib/gprim/mesh/meshcopy.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/mesh/meshdelete.c, src/lib/gprim/mesh/meshdice.c, src/lib/gprim/mesh/meshdraw.c, src/lib/gprim/mesh/meshevert.c, src/lib/gprim/mesh/meshload.c, src/lib/gprim/mesh/meshnormal.c, src/lib/gprim/mesh/meshpick.c, src/lib/gprim/mesh/meshsave.c, src/lib/gprim/mesh/meshsphere.c, src/lib/gprim/mesh/meshtransform.c, src/lib/gprim/ndmesh/ndmeshbound.c, src/lib/gprim/ndmesh/ndmeshclass.c, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bbox/bboxcopy.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bbox/bboxdraw.c, src/lib/gprim/bbox/bboxload.c, src/lib/gprim/bbox/bboxminmax.c, src/lib/gprim/bbox/bboxsave.c, src/lib/gprim/bbox/bboxtransform.c, src/lib/gprim/bbox/bboxunion.c, src/lib/gprim/bezier/bezbound.c, src/lib/gprim/bezier/bezclass.c, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/bezier/bezdraw.c, src/lib/gprim/bezier/bezevert.c, src/lib/gprim/bezier/bezload.c, src/lib/gprim/bezier/bezpick.c, src/lib/gprim/bezier/bezsave.c, src/lib/gprim/bezier/bezsphere.c, src/lib/gprim/bezier/beztransform.c, src/lib/gprim/comment/commentclass.c, src/lib/gprim/comment/commentcreate.c, src/lib/gprim/comment/commentsave.c, src/lib/gprim/comment/commentstream.c, src/lib/gprim/discgrp/colormap.c, src/lib/gprim/discgrp/complex.c, src/lib/gprim/discgrp/dgbound.c, src/lib/gprim/discgrp/dgclass.c, src/lib/gprim/discgrp/dgconstraint.c, src/lib/gprim/discgrp/dgcopy.c, src/lib/gprim/discgrp/dgcreate.c, src/lib/gprim/discgrp/dgdelete.c, src/lib/gprim/discgrp/dgdirdom.c, src/lib/gprim/discgrp/dgdraw.c, src/lib/gprim/discgrp/dgenum.c, src/lib/gprim/discgrp/dgevert.c, src/lib/gprim/discgrp/dgmisc.c, src/lib/gprim/discgrp/dgpick.c, src/lib/gprim/discgrp/dgsave.c, src/lib/gprim/discgrp/dgstream.c, src/lib/gprim/discgrp/dgtransform.c, src/lib/gprim/discgrp/dhpoint3.c, src/lib/gprim/discgrp/matlist.c, src/lib/gprim/discgrp/outstack.c, src/lib/gprim/discgrp/polyhedron.c, src/lib/gprim/discgrp/projective.c, src/lib/gprim/discgrp/stack.c, src/lib/gprim/discgrp/util.c, src/lib/gprim/discgrp/weeks_dirdom.c, src/lib/gprim/discgrp/xform.c, src/lib/gprim/geom/bound.c, src/lib/gprim/geom/boundsphere.c, src/lib/gprim/geom/class.c, src/lib/gprim/geom/copy.c, src/lib/gprim/geom/create.c, src/lib/gprim/geom/delete.c, src/lib/gprim/geom/dice.c, src/lib/fexpr/real.c, src/lib/fexpr/vars.c, src/lib/forms/xforms-compat.h, src/lib/geometry/cmodel/cm_geometry.c, src/lib/geometry/cmodel/cmodel.c, src/lib/geometry/cmodel/cmodel_data.c, src/lib/geometry/hpoint3/hg4.c, src/lib/geometry/hpoint3/hline3.c, src/lib/geometry/hpoint3/hplane3.c, src/lib/geometry/hpoint3/hpoint3.c, src/lib/geometry/hpoint3/hpoint3a.c, src/lib/geometry/hpoint3/hpoint3b.c, src/lib/geometry/hpointn/hpointn.c, src/lib/geometry/hpointn/hpointnb.c, src/lib/geometry/point3/point3.c, src/lib/geometry/point3/polyint.c, src/lib/geometry/point3/segments.c, src/lib/geometry/transform3/ctm3align.c, src/lib/geometry/transform3/ctm3ortho.c, src/lib/geometry/transform3/ctm3persp.c, src/lib/geometry/transform3/ctm3perspfov.c, src/lib/geometry/transform3/ctm3rotate.c, src/lib/geometry/transform3/ctm3scale.c, src/lib/geometry/transform3/ctm3tetrad.c, src/lib/geometry/transform3/ctm3translate.c, src/lib/geometry/transform3/tm3adjoint.c, src/lib/geometry/transform3/tm3align.c, src/lib/geometry/transform3/tm3concat.c, src/lib/geometry/transform3/tm3conjugate.c, src/lib/geometry/transform3/tm3copy.c, src/lib/geometry/transform3/tm3dual.c, src/lib/geometry/transform3/tm3identity.c, src/lib/geometry/transform3/tm3invert.c, src/lib/geometry/transform3/tm3ortho.c, src/lib/geometry/transform3/tm3persp.c, src/lib/geometry/transform3/tm3perspfov.c, src/lib/geometry/transform3/tm3print.c, src/lib/geometry/transform3/tm3rotate.c, src/lib/geometry/transform3/tm3scale.c, src/lib/geometry/transform3/tm3stack.c, src/lib/geometry/transform3/tm3tetrad.c, src/lib/geometry/transform3/tm3translate.c, src/lib/geometry/transform3/tm3transpose.c, src/lib/geometry/transformn/transformn.c, src/lib/geometry/transobj/transobj.c, src/lib/geomutil/bdy/bdy.c, src/lib/geomutil/crayplutil/crayBezier.c, src/lib/geomutil/crayplutil/crayInst.c, src/lib/geomutil/crayplutil/crayList.c, src/lib/geomutil/crayplutil/crayMesh.c, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/crayQuad.c, src/lib/geomutil/crayplutil/crayVect.c, src/lib/geomutil/crayplutil/crayola.c, src/lib/geomutil/dim/dim.c, src/lib/geomutil/plutil/anytopl.c, src/lib/geomutil/plutil/plcombine.c, src/lib/geomutil/plutil/plconsol.c, src/lib/gprim/bbox/bboxbound.c, src/bin/geomview/common/ui.c, src/bin/geomview/common/worldio.c, src/bin/geomview/x11/bitmaps/icon, src/bin/geomview/x11/gvappear.c, src/bin/geomview/x11/gvcameras.c, src/bin/geomview/x11/gvcamui.c, src/bin/geomview/x11/gvcolor.c, src/bin/geomview/x11/gvcommands.c, src/bin/geomview/x11/gvcredits.c, src/bin/geomview/x11/gvevent.c, src/bin/geomview/x11/gvfiles.c, src/bin/geomview/x11/gvlights.c, src/bin/geomview/x11/gvload.c, src/bin/geomview/x11/gvmain.c, src/bin/geomview/x11/gvmaterial.c, src/bin/geomview/x11/gvmnpanel.c, src/bin/geomview/x11/gvsave.c, src/bin/geomview/x11/gvtoolui.c, src/bin/geomview/x11/gvui.c, src/bin/ginsu/ginsu.c, src/bin/graffiti/graffiti.c, src/bin/graffiti/graffiti.h, src/bin/graffiti/gui.c, src/bin/graffiti/lang.c, src/bin/hinge/hinge.c, src/bin/hinge/hui.c, src/bin/hinge/lang.c, src/bin/stereo/stereo.c, src/bin/stereo/sterui.c, src/bin/sweep/sweep.c, src/bin/sweep/sweep.main.c, src/bin/tackdown/origin.common.c, src/bin/tackdown/origin.common.h, src/bin/tackdown/origin.main.c, src/bin/tackdown/tackdown.main.c, src/bin/togeomview/togeomview.c, src/bin/transformer/transformer.main.c, src/lib/camera/camcompat.c, src/lib/camera/camera.c, src/lib/camera/camstream.c, src/lib/color/color.c, src/lib/color/mergein.c, src/lib/color/mergeout.c, src/lib/color/mergeover.c, src/lib/color/mergeplus.c, src/lib/color/mergeunder.c, src/lib/color/paintcopy.c, src/lib/color/paintover.c, src/lib/fexpr/binfuncs.c, src/lib/fexpr/complex.c, src/lib/fexpr/evaluate.c, src/lib/fexpr/exprs.c, src/lib/fexpr/lex.yy.c, src/lib/fexpr/monfuncs.c, src/lib/fexpr/parse.tab.c-saved, src/bin/animate/xanimate.c, src/bin/cplxview/computegraph.c, src/bin/cplxview/cplxview.c, src/bin/example/callbacks.c, src/bin/example/main.c, src/bin/example/oogl.c, src/bin/flythrough/main.c, src/bin/geomutil/bdy/bdy.c, src/bin/geomutil/clip/Clip.h, src/bin/geomutil/clip/clip.c, src/bin/geomutil/clip/clipmain.c, src/bin/geomutil/clip/clipoogl.c, src/bin/geomutil/math2oogl/math2oogl.c, src/bin/geomutil/oogl2rib/oogl2rib.c, src/bin/geomutil/oogl2vrml/oogl2vrml.c, src/bin/geomutil/oogl2vrml/oogl2vrml2.c, src/bin/geomutil/plutil/anytooff.main.c, src/bin/geomutil/plutil/bez2mesh.c, src/bin/geomutil/plutil/offconsol.main.c, src/bin/geomutil/plutil/polymerge.c, src/bin/geomutil/ucd/anytoucd.c, src/bin/geomutil/ucd/make_frame.c, src/bin/geomutil/ucd/stack.c, src/bin/geomutil/ucd/ucdtooff.c, src/bin/geomview/common/comm.c, src/bin/geomview/common/drawer.c, src/bin/geomview/common/event.c, src/bin/geomview/common/lang.c, src/bin/geomview/common/lights.c, src/bin/geomview/common/lispext.c, src/bin/geomview/common/main.c, src/bin/geomview/common/motion.c, src/bin/geomview/common/mouse.c, src/bin/geomview/common/ndshade.c, src/bin/geomview/common/rman.c, src/bin/geomview/common/shaders.c, src/bin/geomview/common/space.c, src/bin/geomview/common/transform.c, configure.ac, src/bin/animate/animate.c, src/bin/animate/glob.c: This is the big "no warnings" patch. Warnings that remain: length of string constants, and some unput() functions in the two scanners, those are defined but not used. 2006-07-05 Lloyd Wood * src/lib/mg/rib/mgribdraw.c: Checking in rendering transparency patch: http://sourceforge.net/tracker/index.php?func=detail&aid=1231146&group_id=9736&atid=309736 provided by Chun-Chung Chen - cjj. 2006-06-26 Claus-Justus Heine * src/lib/oogl/util/seekpipe.c: seekpipe_read() was severly broken (end of function reached without return statement. Gnah. * src/lib/camera/camera.c, src/lib/geometry/cmodel/cmodel.c, src/lib/geomutil/crayplutil/crayBezier.c, src/lib/geomutil/crayplutil/crayInst.c, src/lib/geomutil/crayplutil/crayList.c, src/lib/geomutil/crayplutil/crayMesh.c, src/lib/geomutil/crayplutil/crayPolylist.c, src/lib/geomutil/crayplutil/crayQuad.c, src/lib/geomutil/crayplutil/crayola.c, src/lib/geomutil/crayplutil/crayolaP.h, src/lib/geomutil/dim/dim.c, src/lib/gprim/bbox/bboxclass.c, src/lib/gprim/bezier/bezdice.c, src/lib/gprim/discgrp/dgdirdom.c, src/lib/gprim/discgrp/dgenum.c, src/lib/gprim/discgrp/matlist.c, src/lib/gprim/discgrp/stack.c, src/lib/gprim/discgrp/weeks_dirdom.c, src/lib/gprim/geom/extend.c, src/lib/gprim/geom/geom.h, src/lib/gprim/mesh/meshpick.c, src/lib/gprim/sphere/sphereP.h, src/lib/gprim/sphere/spherecreate.c, src/lib/gprim/tlist/tlstream.c, src/lib/gprim/vect/vectdraw.c, src/lib/gprim/vect/vectpick.c, src/lib/mg/common/mgtexture.c, src/lib/oogl/lisp/lisp.c, src/lib/oogl/util/futil.c, src/lib/oogl/wa/Makefile.am, src/lib/oogl/wa/fsaparse.l, src/lib/pointlist/ptlBezier.c, src/lib/shade/appearance.c, src/lib/shade/appearance.h: va_args issues, sphere command works again. * configure.ac: Bump version to 1.8.2-rc1 2006-06-25 Lloyd Wood * configure: It's INSTALL.Geomview with a capital G. * INSTALL.Geomview, configure: Updating text of documentation referring to reconf to reflect recent changes by rotdrop. (It's still a good idea to direct users to the reconf script, rather than just autoreconf -i, in case the reconf script needs to do anything else in future.) 2006-06-24 Claus-Justus Heine * doc/Makefile.am: Install png figures in info directory (although at least _MY_ emacs/xemacs cannot handle them). * src/lib/oogl/wa/.cvsignore, doc/figs/.cvsignore: Ignore some more auto-generated files. * doc/Makefile.am: It is "dist-hook", not "distlocal". * .cvsignore: Add geomview dist directory (created during "make dist"). * Makefile.am: Remove almost everything with "make maintainer-clean". * .cvsignore: Ignore INSTALL (auto-generated). * .cvsignore: Remove build/packbuild. * acconfig.h: use new autoheader interface. * INSTALL: Auto-generated. * configure: Resurrect dummy configure script. * NEWS: Update, add 1.8.2 release note (for future use). * Makefile.am: Remove traces of old build-system. * reconf: Just redirect to "autoreconf -i" as should be. * build.in, packbuild.in: People should use the normal "configure && make" stuff. * .cvsignore: Ignore the tar-balls generated by "make dist". * configure: Don't keep auto-generated files in CVS. Use 'autoreconf -i' instead. * configure.in: Renamed to configure.ac. * configure.ac: Renamed. * src/lib/oogl/wa/yystype.h: Define YYSTYPE_IS_DECLARD, otherwise recent flex/bison combo's define it to int, which is not what we want. * src/lib/oogl/wa/fsaparse.l, src/lib/oogl/wa/fsaparse.y: Include string.h (missing prototype issue). * src/lib/oogl/wa/Makefile.am: Include "BUILT_SOURCES", i.e. wa.lex.c etc into the distro. Remove stuff with "make maintainer-clean". * src/lib/oogl/wa/wa.lex.c, src/lib/oogl/wa/y.tab.h, src/lib/oogl/lisp/clisp.h, src/bin/example/.geomview-example, src/bin/animate/.geomview-animate: Not in CVS, because the maintainers can generate them. * src/bin/geomutil/bdy/Makefile.am, src/bin/geomview/Makefile.am, src/bin/geomview/x11/Makefile.am, src/lib/oogl/lisp/Makefile.am, src/bin/animate/Makefile.am, src/bin/example/Makefile.am: Make sure "make distclean" deletes everything which is not included in the distributions, because that is what distclean is for. * src/bin/geomutil/oogl2vrml/.cvsignore: Ignore oogl2vrml2 * src/bin/geomutil/bdy/.geomview-drawbdy: Generated during "make". * m4/geom_local.m4, m4/lf_local.m4: Fix "underquoted" AC_DEFUN's * doc/.cvsignore, doc/Makefile.am, doc/README, doc/geomview.texi: Move to a recent TeXinfo release, this simplifies things a lot, even support for HTML is now built into makeinfo. * doc/figs/.cvsignore: Ignore .png, .eps, .pdf * doc/figs/eps2pdf1.sh: Use epstopdf, if available. * doc/figs/trefdodecinter.pdf, doc/figs/tools.pdf, doc/figs/initial.pdf, doc/figs/light.pdf, doc/figs/load.pdf, doc/figs/main.pdf, doc/figs/mat.pdf, doc/figs/myfilelist.pdf, doc/figs/save.pdf, doc/figs/secondlinelist.pdf, doc/figs/cam.pdf, doc/figs/color.pdf, doc/figs/command.pdf, doc/figs/fig2.pdf, doc/figs/ap.pdf: Only keep the original PS files, everything else can be generated. * doc/figs/color.ps, doc/figs/command.ps, doc/figs/initial.ps, doc/figs/light.ps, doc/figs/load.ps, doc/figs/main.ps: Those files were in Landscape mode, unluckily. Back-converted to portrait, kept care to do this pixel-wise, so the pictures should be unchanged. 2006-06-23 Claus-Justus Heine * configure.in: Explicitly link with -lXpm, at least I need it. 2006-06-23 Lloyd Wood * INSTALL.Geomview: Adding explanatory note about reconf use. * reconf: Indicate revision of reconf script. * configure: Adding some hints concerning autoreconf and automake. * reconf: autoconf presumes that any existing configure file is a good configure file. So moving any existing file to configure-old first to allow a new one to be created. * configure: Adding placeholder configure file as hint to new CVS users to run reconf to autoconf/automake configure and Makefiles. 2005-10-31 Claus-Justus Heine * src/lib/gprim/geom/create.c, src/lib/gprim/geom/geomclass.h: Some more va_list stuff; actually, my previous patch was incomplete (submitted over 18 months ago ...). Here comes the fix; the cvs version should work again with with patch, even on x86 and not only on x86_64 ... See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557 The problem is that va_list is not only opaque, but ReallyOpaque (maybe (tm)??). va_list may even be an array_type. Then in the context of foo(va_list foo) {} already is not of type "va_list" _BUT_ of type "&va_list[0]". So: foo(va_list foo) { bar(&foo); } passes _NOT_ the base address of va_list to "bar()" _BUT_ the address of the piece of storage which holds the parameter "foo" which is _NOT_ what we want (think about it!! This is JAIOCABD (JustAnotherInstanceOfCArrayBrainDamegedness) Oops. I did all this to make Geomview work on AMD64 with Linux. Actually, I DO NOT like the libc implementation of va_list, but we have to cope with it. Also, the changes _should_ not break archs/compilers where va_list is a structure and not of array-type. Hope this will be portable (_should_ be, but FIXME if not). * Makefile.am: Don't try to include stuff into the distro which is not there, the smr_SOMETHING macros are still missing in m4/ 2005-02-21 Mark Phillips * reconf: remove system-specific '--with-motif' option when ./configure is run 2004-05-02 Claus-Justus Heine * src/lib/oogl/util/seekpipe.c: My previous commit did not even compile, I _very_ deeply apologize. * src/lib/oogl/util/futil.c: Binary formats where severely broken w.r.t. little-endian 64-bit archs. Keep the following in mind: _NEVER_ use "long" if you mean "32-bit wide". Either use bit-types defined by the OS (libc header-files), or assume that int's are 32-bits (maybe wrong) and that you do not have any knowledge about the size of long's. * src/lib/oogl/util/seekpipe.c: Add debugging code. To actually switch on debugging, the environment variable SEEKPIPE_DEBUG has to be set (to whatever value). The name of the output-file is controlled via SEEKPIPE_DEBUGFILE. The default is /tmp/seekpipe-foo. If set the data-stream will be copied to SEEKPIPE_DEBUGFILE. * src/bin/geomview/common/comm.c: On the client: Close the pipe-fd's after duping them to stdin and stdout, they are no longer needed. 2004-04-27 Claus-Justus Heine * configure.in: Set CFLAGS to -O0 when checking for math-lib, some compilers already inline math-functions when used with -O2. * ChangeLog: Update. * src/bin/geomutil/oogl2vrml/Makefile.am, src/bin/geomutil/oogl2vrml/oogl2vrml2.c: Use oogl2vrml to create an oogl->VRML 2.0 converter. Most modern viewers do not understand VRML 1.0. 2004-03-15 Claus-Justus Heine * src/lib/gprim/skel/skelP.h, src/lib/gprim/skel/skelcreate.c, src/lib/gprim/tlist/tlcreate.c, src/lib/gprim/tlist/tlistP.h, src/lib/gprim/vect/vectP.h, src/lib/gprim/vect/vectcreate.c, src/lib/gprim/list/listcreate.c, src/lib/gprim/mesh/meshcreate.c, src/lib/gprim/ndmesh/ndmeshcreate.c, src/lib/gprim/npolylist/nplclass.c, src/lib/gprim/npolylist/nplcreate.c, src/lib/gprim/npolylist/npolylistP.h, src/lib/gprim/polylist/plcreate.c, src/lib/gprim/polylist/polylistP.h, src/lib/gprim/quad/quadcreate.c, src/lib/gprim/bbox/bboxcreate.c, src/lib/gprim/bezier/bezcreate.c, src/lib/gprim/bezier/bezierP.h, src/lib/gprim/comment/commentP.h, src/lib/gprim/comment/commentcreate.c, src/lib/gprim/discgrp/dgcreate.c, src/lib/gprim/inst/instP.h, src/lib/gprim/inst/instcreate.c, src/lib/gprim/list/listP.h: See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557 The problem is that va_list is not only opaque, but ReallyOpaque (maybe (tm)??). va_list may even be an array_type. Then in the context of foo(va_list foo) {} already is not of type "va_list" _BUT_ of type "&va_list[0]". So: foo(va_list foo) { bar(&foo); } passes _NOT_ the base address of va_list to "bar()" _BUT_ the address of the piece of storage which holds the parameter "foo" which is _NOT_ what we want (think about it!! This is JAIOCABD (JustAnotherInstanceOfCArrayBrainDamegedness) Oops. I did all this to make Geomview work on AMD64 with Linux. Actually, I DO NOT like the libc implementation of va_list, but we have to cope with it. Also, the changes _should_ not break archs/compilers where va_list is a structure and not of array-type. Hope this will be portable (_should_ be, but FIXME if not). * configure.in: Remove ALISTADDR and add check for /bin/csh versus /bin/sh. * acconfig.h: Remove ALISTADDR (was a BUG!). See notes for the big bunch of the other changed files. * src/lib/oogl/wa/wa.yacc.c: Auto-generated. * src/lib/oogl/util/glob.c: Resort to /bin/sh if /bin/csh is not found. At least _I_ don't have csh installed (don't like it, but that's OT). Default is to use /bin/csh as before. * src/lib/oogl/util/futil.c: fmemopen() is a GNU-stuff (AFAIK). So define _GNU_SOURCE to get the proper proto-type (makes a _MAJOR_ difference on 64-bit systems!!!!!!!!!!) 2004-02-22 Steve M. Robbins * m4/lf_local.m4, Makefile.am, configure.in, ChangeLog: *** empty log message *** * ChangeLog: entries for previous configure and Makefile change. * Makefile.am, configure.in, m4/Makefile.am: * m4/Makefile.am: Remove. * Makefile.am (m4_files): Distribute the m4/*.m4 files. * configure.in: Take care to avoid using MS Windows "find" command. Do not create m4/Makefile. 2004-02-21 Steve M. Robbins * configure.in: Run autoupdate from autoconf 1.8. * m4/lf_local.m4 (LF_LINK_HEADERS): Generate the include symlink farm in $(top_builddir), as $(top_srcdir) may not be writable. Use "mkdir" to make the common include directory. Newer autoconf no longer provides shell script mkinstalldirs. * Makefile.am (EXTRA_DIST): Do not list mkinstalldirs. * m4/Makefile.am: Remove. * Makefile.am (m4_files): Distribute the m4/*.m4 files. * configure.in: Take care to avoid using MS Windows "find" command. Do not create m4/Makefile. 2002-10-26 Steve M. Robbins * configure.in: Bump version to 1.8.2. 2002-04-13 Steve M. Robbins * Makefile.am (ACLOCAL_AMFLAGS): Set to "-I m4" so that the proper option is passed when aclocal is run. 2002-04-06 Steve M. Robbins * INSTALL.Geomview: Document --with-xforms as the configure flag. 2001-03-24 Steve M. Robbins * configure.in: Do not add -XSVR4 and -common to CFLAGS when configuring with IRIX cc. 2001-03-21 Steve M. Robbins * doc/Makefile.am (EXTRA_DIST): Remove motion.pdf. * configure.in: Set revision to 1.8.1. * m4/geom_local.m4 (GEOM_FIND_I_OPTION): Respect prior setting of $CPPFLAGS while probing. 2001-03-19 Mark Phillips * doc/motion.tex: new file added to release; documents the mathematics behind Geomview's motion model. For use by developers (not needed by regular users). 2001-02-21 Steve M. Robbins * configure.in: Add AC_FUNC_SETPGRP. 2001-02-18 Steve M. Robbins * configure.in: Add option --with-build-path. Use AC_PATH_XTRA. Correct the X library link order. Make sure to check /usr/local/lib for all libraries that check /usr/local/include. Check for in $x_includes and $x_includes/X11. Make sure both the includes and the libs are correct before using FORMS. Announce whether Xmu is found. General tidying up. 2001-02-17 Steve Robbins * acconfig.h: Close comment above define for HAVE_FMEMOPEN. * configure.in: Check endianness and check for header netinet/in.h. * doc/Makefile.am: Only build "geomview.pdf" on target "pdf". 2001-02-11 Steve Robbins * m4/geom_local.m4 (GEOM_CHECK_XFORMS): New. If XFORMS library is available, set variables for finding includes and libraries, emit warning if XFORMS is not available. 2001-01-16 Steve Robbins * configure.in: removed redundant --with-forms argument; its effects got overwritten by --with-xforms, anyway. 2000-11-23 Steve Robbins * src/Makefile.am (geomview): look for "gvx" in $(moduledir) rather than $(bindir). (CLEANFILES): clean geomview script. 2000-11-20 Mark Phillips * release 1.8.0 (see NEWS file for summary) 2000-11-19 Mark Phillips * texi2pdf doesn't seem to include figures; for now revert to dvipdf to generate pdf version of manual 2000-11-17 Mark Phillips * doc/Makefile.am: refer to $(srcdir)/geomview.texi rather than geomview.texi when invoking tex 2000-11-15 Mark Phillips * removed 'stamp-h.in' and 'aclocal.m4' from CVS, since they are derived files. * cleaned up & documented 'reconf' script, used to bootstrap a fresh Geomview tree checked out from CVS. * INSTALL.Geomview: re-wrote XFORMS configuration instructions to reflect the fact that XFORMS (Linux Intel version) is no longer part of the Geomview distribution; users who want it now download it separately and unpack it into the top-level Geomview directory before configuring Geomview. * src/lib/Makefile.am: explicitly mention 'forms' dir in SUBDIRS now, rather than having it be conditional based on whether xforms is present, since this dir only contains a .h file which can be installed even if xforms isn't present. * configure.in: Changed all variables that mention forms to say 'xforms' instead, for consistency. Added caching of many variables so their values can be shared with other configure scripts. Changed OOGLLIBS to use top_geom_builddir instead of top_builddir, so that its value can be used in other configure scripts. Added check to detect subdirs of src/bin having additional configure.in's, and to call AC_CONFIG_SUBDIRS with them. * m4/geom_local.m4: added macros GEOM_LOG_MSG, GEOM_GET_CACHED_VALUE, and GEOM_REQUIRE_XFORMS. Removed verbosity from GEOM_FIND_I_OPTION and GEOM_FIND_L_OPTION operate quietly so that whoever would call them can print messages even if the corresponding values are coming from the cache (rather than actually calling GEOM_FIND_I_OPTION/GEOM_FIND_L_OPTION). * Makefile.am: removed xforms from SUBDIRS * removed xforms directory from distribution; re-wrote configure.in & friends to just notice whether xforms is present and use it if so, or quietly (with a warning) ignore it if not. 2000-11-09 Mark Phillips * configure.in: improvements to the test for -lgl so that it gives a false negative less often; added message to output saying what geomview version is being configured, to aid in deciphering other people's 'configure' output * src/bin/geomutil/vrml2oogl/Makefile.am: added -lm to vrml2oogl link line where necessary * src/lib/oogl/util/futil.c: corrected USE_FSTROPEN_1 definition for AIX/__osf__/__hpux/__FreeBSD__ case 2000-11-05 Steve Robbins * Makefile.am (distclean-local): Remove "include" directory. * doc/html/Makefile.am (EXTRA_DIST): * doc/Makefile.am (EXTRA_DIST): List files explicitly, to avoid distributing CVS directory. * configure.in: Check for either "texi2pdf" or "dvipdf". * doc/Makefile.am (.texi.pdf): Build PDF files using "texi2pdf" (from GNU Texinfo package), if available. * data/Makefile.am (geomdata_DATA): List data files to install. * configure.in: Set geomdatadir variable, allowing easy overriding at configure time. * src/Makefile.am (geomview): * Makefile.am (geomview): * geomview.sh (GEOMVIEW_LOAD_PATH): Do not assume data lives in a subdirectory of $GEOMROOT. 2000-11-04 Steve Robbins * src/Makefile.am (geomview): * Makefile.am (geomview): * geomview.sh (GEOMVIEW_EMODULE_PATH): Do not assume that modules live in a subdirectory of $GEOMROOT. * configure.in: Change "modulesdir" to "moduledir", so that "module_PROGRAMS" 2000-11-02 Steve Robbins * doc/html/Makefile.am (geomview_toc.html): Use $srcdir to refer to a file in the sources. * Makefile.am (geomview): * src/Makefile.am (geomview): Refer to `geomview.sh' using $top_srcdir. * configure.in: The macro AC_OUTPUT will only create a single directory level at a time, so we must list the files in directory `a/b' before those in directory `a/b/c'. 2000-11-01 Mark Phillips * release 1.7.10 (see NEWS file for summary) * src/lib/oogl/util/futil.c: Added tests to 'configure' to decide whether to use fmemopen() instead of CC_fmemopen__FPci() on linux systems in the implementation of fstropen. Also added "--enable-fstropen-1" flag to 'configure' to allow forced use of manual implementation of fstropen. These changes are in response to reports of Geomview crashing upon startup, while reading the default appearance (via a call to fstropen), on some newer Linux systems. [thanks to Mikhail Tchernychev and Belinda Marchand ] * src/lib/oogl/wa/fsaparse.l: removed duplicate rules for "min" and "bfs" [sent by Steve Robbins ] * src/bin/geomview/common/comm.c: added preprocessor condition to allow compilation on the Alpha [sent by Tamara Munzner ] 2000-10-29 Steve Robbins * configure.in: also try $x_includes when searching for Xm/Xm.h 2000-10-20 * release 1.7.9 (see NEWS file for summary) 2000-10-14 * release 1.7.8 (see NEWS file for summary) 1.7.7 August 22, 2000 Added some of the external modules to the distribution, but haven't actually tested them. Updated the documentation to reflect the fact that the geomview-users mailing list is now hosted at lists.sourceforge.net. 1.7.6 May 25, 2000 Converted source tree (geomview only; no external modules yet) to use GNU autoconf gv_rawevent now actually is passed an 'unsigned long' (which is what it expected all along, but previous was passed an 'int') for the time value. This had been causing mouse motions to fail on 64bit RS6000 running AIX 4.3.2. Many function prototypes fixed, and other warnings turned up by 'gcc -Wall' fixed. (Most of them had to do with functions that were implictly declared to return an int not returning a value). Changed Geomview's X application name from "gv" to "geomview", to avoid possible conflicts with other applications named "gv, such as ghostview. This affects the name used for X resources that apply to Geomview. If you want to force Geomview to use the old "gv" name for backward compatability, set the environment variable GEOMVIEW_X_NAME=gv in the "geomview" shell script (be sure to 'export' this variable too). 1.7 February 13, 2000 This version of the software is the same as 1.6.1p9d; the only difference is in the documentation, which has been substantially changed to reflect the fact that the Geometry Center is now closed and that the new home for Geomview is http://www.geomview.org. 1.6.1p9d August 18, 1998 Fixed coloring of N-D OFF objects noted by James Lawrence. Fixes to many obscure bugs and great wads of lint, suggested by David Kaelbling of SGI. 1.6.1p8 March 13, 1998 Fixes to compile with GNU glibc, and on Linux under non-x86 machines. Geomview panels: don't limit FOV < 180 if in orthographic mode. Fix more bugs in anytooff: convert VECTs even if appearance suppresses faces and edges; preserve edgecolor property in vects. Fix togeomview "Bad address" error: execvp() with no trailing NULL! 1.6.1p7 November 20, 1997 Geomview: Fix egregious vertex-picking bug, present in all earlier 1.6.1 versions, where the returned vertex index was wrong (it returned one of the adjacent vertices instead). Include lighting properly in saved .rib files. Use OpenGL texture_object extension if available; this improves multiple-texture performance dramatically on some systems. Automated making multiple gvx binary versions (MESA, native, etc.). Distribute MapleV4 version of gvplot as well as earlier ones. Thanks to Loris Renggli, loris@math.fsu.edu, for supplying a patch. Repaired geomview/x11/geomview-x11 script so its Makefile can customize it properly again (broken in 1.6.1p6). Fix togeomview, which sometimes could fail spuriously with "Bad address". 1.6.1p6 August 29, 1997 Geomview: Now seems to work, more or less, with lesstif. Avoid crashing in X11 renderer: work around DEC Alpha cc and gcc bugs. Don't draw into iconified windows, even if told to redraw via GCL. Postscript-save mode produces postscript which doesn't fail when invoked with non-empty Postscript stack. New "ppmmesa" snapshot type. If compiled with MESA OpenGL-like library, allow arbitrary-res off-screen rendering using (snapshot CAMID FILENAME ppmmesa ...) Presence of this indicated by "(MESA)" in (geomview-version) string. Allow control over texture-mapping quality (interpolated or not). Try to produce usable display colors (not all black) on 8-bit Indigos. I'm told this still doesn't work, though. geomview script accepts "-opengl", "-mesa", "-x11" etc. flags, and selects alternate gvx.{OGL,MESA,X11} binaries if installed. anytooff handles "dice" appearance tag for Bezier & Sphere objects, and gets the right color for colored VECTs. emodule_wish.sh script sets tcl/tk envariables, making it easier for emodules to use "wish". Make math2oogl really, really turn off non-blocking mode on its named pipe. vrml2oogl now invokes gzip to read compressed files, passes color into OOGL edgecolor as well as surface color, and handles text by invoking "hvectext". OOGL library changes: prototypes at last for geometry functions. new cleaner way to organize mg lights; they're now shared and refcounted. 1.6.1 December 10, 1996 Source distribution no longer uses GL-based FORMS library. Geomview's X/Motif interface is now the primary version, which the manual now describes. Many modules rewritten by Nils McCarthy, Tim Rowley, and others using Tcl/Tk. Many FORMS-based external modules adapted to use XForms (object libraries available from ftp://laue.phys.uwm.edu/pub/Xforms; see INSTALL). This release finally supports the extensions needed for Tamara Munzner's weboogl package. Known problems: Many changes aren't mentioned in this CHANGES file (though I think the significant ones are). Porting: Should now work under FreeBSD, and HP-UX 10.x. Has been tried in some new environments, including Sun UltraSparc with Creator3D card under Open GL, and Mesa Open-GL-like clone under Linux and HP-UX. Various portability problems fixed in the source code. Modules: Some modules from earlier releases are omitted here: PS Snapshot's functionality is superceded by Geomview's PS Save mode. 4dview is superceded by NDview, and in any case it depends on some GL-based FORMS code which hasn't been ported. Crayola, Warp, and parts of NDview depend on old FORMS code. Some new modules are added: Crayola, NDview, NDdemo, and Labeler are now in Tcl/Tk. You'll need to install Tcl/Tk in order to compile them; see INSTALL. Also in Tcl/Tk are some new N-dimensional utilities by Brian Luense: 3D-Snapshot (save a projected copy of the current N-D object), Colormap (interactive N-D colormap controls), and Slicer (N-dimensional clipping). FORMS modules were only minimally ported to X-Forms. You can't use the new Forms designer to change their interfaces, since the new designer writes .c files in an incompatible (though superior) way. The FORMS section in the Geomview manual needs to be updated. Applications: New "vrml2oogl" and "oogl2vrml" converters, written by Daeron Meyer and Tamara Munzner respectively. "vrml2oogl" uses the C++ QvLib library, included here; if you use GNU g++ to compile it, it seems to require 2.7.2. "anytooff" now more efficient on large data sets, and preserves appearance information where possible. Maple graphics now pay attention to color, and can now be displayed on remote computers; see doc/gvplot.doc. New command-line text generator "hvectext" uses Hershey stroke fonts. Benchmarks for various platforms, with a Makefile to run your own, are in data/speedtests. Geomview graphics: Supports Open GL as well as GL and X renderers. Future development will most likely focus on Open GL. Texture mapping available in GL and Open GL (but not plain X11) renderers. Texture coordinate must be explicitly specified. Images may be sgi, ppm/pgm/pbm, or tiff or gif if netpbm toolkit installed. See data/geom/textured/* for some examples. New built-in PostScript renderer by Tim Rowley replaces PS Snapshot module -- respects appearances, but still uses only painter's algorithm for hidden-surface removal. New in-memory renderer (related to X renderer) writes arbitrary-size PPM images of geomview scenes. Single/double-buffered switching works in Motif version too. You can specify an image as a window background. X11 renderer on 8-bit colormapped displays defaults to 5x5x5 color cube, to leave more color-table slots available. New GEOMVIEW_COLORLEVELS environment variable may be set to "6" to get the old 6x6x6 behavior. Some binary distributions include two geomview binaries, both bin/*/gvx with X11 renderer, and bin/*/gvx.OGL, with Mesa OpenGL-clone libraries. "geomview -opengl" invokes the Open GL version. OOGL data formats: More-robust geometry parser never backtracks on valid input, and should now reliably read data from pipes (rather than almost-reliably as before). "Lincoln" objects no longer supported. New "origin" and "location" fields in INSTs allow fixing objects in screen or camera or etc. coordinates, e.g. to paste text or UI elements onto objects or onto the screen. (No built-in geomview text yet, though.) "input-translator" command allows specifying an external program to translate a file beginning with a particular string into OOGL format. This hack lets us read ASCII VRML files directly using vrml2oogl. New appearance attributes for texture-mapping, concave polygons, shaded lines, back-face culling, Bezier patch dicing. Geomview command language: (snapshot ...) commands -- except SGI format -- allow piping PPM or PostScript data to a shell command as well as writing to a file. PPM images may be arbitrary size. (background-image ...) puts an image up as a window background. (pick-invisible ...) lets picking depend on appearance (though the default is still to ignore appearances). Geomview UI: Keyboard shortcuts work in Motif panels! Single ESC no longer exits from geomview; use ESC ESC. Motif panels are now resizable. GL/FORMS user interface is no longer available in this release. Now terminates cleanly, notifying any running modules, if sent interrupt/hangup/terminate signals. Geomview documentation: Manual now included in HTML form (see doc/geomview_toc.html) as well as Texinfo and (in binary packages) Postscript. Manual updated to describe the Motif user interface. It also includes a Tcl/Tk sample module, though without commentary. The commentary for modules using the FORMS library is no longer accurate, though probably still somewhat useful. 1.5 October 21, 1994 Source distribution now includes support for generic X/Motif (Sun, HP-UX, Linux, probably other systems) as well as SGI and NeXT graphics. Geomview motions: INCOMPATIBLE bug fix in the GCL command language: Motions defined with respect to the object itself, e.g. (transform world world world translate 0 0 1) had been interpreted with the wrong sign. This is now fixed. Application programs which depended on this bug (including gvclock and stereo) need to change accordingly. Documentation fix: GCL rotations (transform/transform-incr/transform-set) are given in radians, not degrees. New motion-animation commands: The (transform ...) command now allows a simple form of animation. If given an amount of time, it arranges to move by exactly that amount during approximately that many seconds, either at constant speed or with smooth start and stop. Scaling now happens with respect to the selected "center" object, not the object's own origin. There's a new (transform ... scale ...) subcommand. Keyboard input: New (event-keys) and (event-pick) commands can suppress geomview interpreting keyboard input as commands and rightmouse-clicks as picking, in graphics windows. Useful for modules which want to impose their own interpretations on events. Non-Euclidean spaces: Newly created cameras now correctly live in the current (possibly non-Euclidean) space. They had been always Euclidean, despite misleading window titles. N-D projection: New "nOFF" object is a collection of 0-, 1- or 2-dimensional polygons in N-dimensional space. N-D coloring projection axes can be with respect to any coordinate system. Two-sided surface coloring: The "backdiffuse" material field, if defined, is interpreted as the reverse-side's diffuse color. Works whenever software shading is enabled (i.e. always on generic-X systems); also works on those SGI systems whose hardware supports two-sided GL lighting. There's no control panel for this feature yet but GCL commands can, e.g. (merge-ap world { material { backdiffuse .7 .5 0 } }) There were a number of portability improvements in the X version, fixing bugs for Sun/Solaris, HP-UX, Linux, DEC OSF, AIX. Code is now more careful to avoid floating-point exceptions, which cause trouble on some machines. Yacc and lex, which were needed for one library, are no longer essential. Substantial improvements to the 3D graphics in the X11 version of Geomview: - Uses X Shared Memory extension (when available) for quick rendering of polygons and lines to X11 framebuffer - Support for 1, 8, or 24 bit deep X displays added - Optional dithering for 8 bit displays - Dithers 1 bit displays - Optional zbuffering (for hidden line/surface removal) added - Smooth shading added - Support for line thickness > 1 added - Clipping planes added Numerous fixes/additions to the X11 Geomview Motif interface: - Window positioning commands work (under most window managers) except for the Load and Save panels - fixed edit menu - added ability to type in RGB values in color panel - added numeric displays for sliders on material panel - added option menu on camera panel for choosing hidden surface removal method - added toggle button on camera panel for activating/deactivating dithering of colors (only shows up in 8 bit mode) Unlike the beta-release X graphics, the new version transmits complete images, not polygons, to the X server. It's faster for local displays; can be slow when the display-to-geomview connection traverses a slow network link. New associated packages: gvplot/writeoogl, a Maple package for displaying Maple 3-D graphics objects in Geomview or saving them as OOGL files. See doc/gvplot.doc. clip, a new command-line program based on Ginsu. Allows clipping OOGL objects against spheres and cylinders as well as planes. 1.4.3 July 24, 1994 Most changes since 1.4.2 were to fix minor bugs & improve portability. Documentation Documented the OOGL "COMMENT" object. Clarified explanation of transparency. Geomview New ui-freeze command (effective on SGI only) allows suspending/resuming updates to UI panels, for decent performance when lots of things are changing. Portability mods: ensure FNDELAY is defined; pass the proper argument type to wait3/waitpid (union wait vs int). Fix ``normalization'' command; it had failed on "all" and "keep". Fix ``ND-xform-get'' command; it had returned the inverse of the correct matrix. Make ``set-conformal-refine'' command process its arguments properly. Call proper version of setpgrp() when spawning external modules; ensures we can properly kill them when exiting. Work around lost SIGCHLD signals when we kill an e-module invoked with ``(emodule-run exec program ...)''; this caused geomview to hang when trying to quit while such a module was running. Erase comm link (named pipe/socket) if it already exists but is of the wrong type (-M option). ["togeomview" and "math2oogl" fixed similarly.] OOGL libraries COMMENT objects can't be picked. (Due to bugs fixed here, scenes with COMMENTs could sometimes yield totally spurious pick results.) Compute bounding spheres of 3-D objects properly, even when not normalized to w=1. Affects geomview's Look command. Draw N-D SKEL objects even when not in N-D mode. Maintain mg drawing flags correctly, so driver applies proper colors, etc., when drawing SKEL and VECT objects. Draw SPHERE objects with degenerate corner at x=1, so the Bezier normals come out right. Allow binding an appearance to a reference to a handle, e.g. { appearance { +edge } : fred }, by inserting an INST to hold the handle. Concentrate all stdio dependencies in src/lib/oogl/util/futil.c. Handle Linux 1.0. Implement acosh() correctly! X graphics Allow drawing into subregions of the graphics window; needed for stereo. External modules PSSnap Make isolated points visible. Ensure lightness values don't exceed 1.0. mgexample Handle lighting properly. Allow giving data file on command line. Configuration New "make clobber" rule cleans and removes targets (except libraries). Handy for saving space after building & installing the source distribution. "all" is now the sole first target in Makerules.src, to avoid confusing RS/6000 make. Expect Motif include files in /usr/include/X11/Xm/... on HP-UX. Define default settings for CPLUSPLUS (compiler name) for SGI and RS/6000. Compile on RS/6000 with "-ma" flag to allow unrestricted use of alloca(). SunOS 4.x: set "BSD" flag, initially for choosing version of setpgrp(). Finish incorporating SYSLIBS, etc. macros into makefiles. Omit -lXt when linking with mgexample, to avoid spurious link errors on Sun. 1.4.2 April 20, 1994 Beta X11 source distribution supports HP PA-RISC, DEC Alpha, RS/6000, Solaris, and Linux (0.99), in addition to SunOS 4.x. New external modules: SGI version: Maniview (3-manifold viewer), NDview and NDdemo (N-dimensional viewer and demonstration program) X11 version now includes Animate and PS Snapshot modules. Configuration Make SYSLIBS, SYSXLIBS, etc. settings -- set in makefiles/mk.* files -- be used when compiling all programs. Ditto for ALLOOGLLIBS, so new OOGL libraries can be added in one place. Geomview Picking now works in X11 Geomview. Maintain reference counts better, avoiding memory leaks. Fix various cases that caused core dumps: - (interest ...) command entered in the Command panel - sending message to an external module started with -start option. - (echo (ND-xform ...)) Make RIB snapshotting work in conformal and N-D viewing modes. (dimension) command now returns the correct setting, and (dimension N) does nothing if we're already in that dimension. Correctly choose a new current camera when the "focus" camera is deleted. Don't crash when sending messages to an external module started with -start command-line option. Make a crude estimate of bounding-box size for N-D objects, so "Look At" can begin to work. It's only roughly right, and that only for objects roughly centered on the origin. Automatically switch all cameras into N-D mode when (dimension) is set, if (ND-axes) have not yet been specified. New (ND-xform-get) command returns N-D transform between two objects. More documentation on ND-axes, ND-xform, ND-color commands. SGI Geomview (actually FORMS library) Add X copy/paste facility to FORMS text input fields. NeXT Geomview Deactivate color panel while changing its color -- don't be fooled into thinking the user selected a new color. PS Snapshot Make isolated points visible. Draw uncolored points and lines in black; default had been nearly white, almost invisible. Mathematica -> OOGL converter Add an XDisplay option, allowing mathematica to run on one machine, geomview on another, and send geomview's X display to a third machine. Handle escaped newlines in Mathematica's output, preventing strange parsing errors. OOGL libraries New N-dimensional OOGL object types: nSKEL and nMESH. pick.h now correctly describes interpretation of pick arguments, and gives brief usage example. Waste less memory when loading Quads. malloc(big)/realloc(small) can lose! GL graphics: leave mixed-model GL/X windows alone. Next graphics: allow setting window depth; allow lights to live in other coordinate systems. New "keepcolor" appearance keyword tags objects as being immune to N-D recoloring. OOGL objects containing an appearance attached to a handle/file reference now work correctly, rather than modifying the handle; the reference is silently wrapped in an INST. Various minor bug & portability fixes. 1.4.1 November 9, 1993 Distribution includes both NeXT and SGI versions. New modules included: crayola (SGI and NeXT) coloring program warp (SGI and NeXT) interactive object warping ndviewer (SGI only) N-dimensional viewer (currently only 4D objects) cplxview (SGI only) graphs of complex functions clipboard (SGI only) cut, copy and paste objects drawbdy (SGI and NeXT) find and draw the boundary of an object flythrough (SGI only) Not Knot hyperbolic gvclock (SGI and NeXT) 3D clock, demonstrates real-time motion maniview (SGI only) 3-manifold viewer trigrp (SGI only) explore triangle symmetry groups plus source for all the existing modules. Documentation: New manual! doc/geomview.tex (TeX version) and doc/geomview-* (GNU texinfo version) explain Geomview in far more detail than previous documentation. They strictly describe Geomview on the Iris, but much also applies to the Next. Configuration: SITE makefile variable selects one of several site-specific configuration settings, namely installation directories for binaries (BINDIR), manual pages (MANDIR), and Mathematica scripts (MMAPACKAGEDIR). Settings stored in makefiles/mk.site.{default,private,public}. ``make instprivate'' and ``make instpublic'' are ``make install'' variants that use the latter two. Prevent 'make' from failing if C++ compiler isn't present; just don't compile the C++ programs. Geomview, General: Extend implementation of conformal transformations. Conformal mode, which had been allowed only in hyperbolic space, is now also meaningful in Euclidean space, where it amounts to inversion in the unit sphere, and spherical space, where it's a stereographic projection from the 3-sphere into Euclidean 3-space. New command (set-conformal-refine). Read both ~/.geomview and ./.geomview, in that order. New -noinit command-line option suppress reading all .geomview files. Implement Olaf Holt's design for N-D viewing by projection. New commands (ND-axes) (ND-xform) (ND-color). (Invoked by ndviewer and cplxview modules.) Keep track correctly of which window the mouse is in. Had sometimes gotten confused if a window was uncovered. Allow disabling "override" status. New Override button & (ap-override) command selects whether appearance controls should suppress objects' own settings, or just provide default values. New (camera-prop) command allows setting the object used to show cameras when "Draw Other Cameras" selected (e.g. see file "camera-frustum"). Mention Next variants to mouse usage (alt + left = middle, etc.) in Help message. SGI Interface: Add transparency controls to materials panel. (No transparency supported on NeXT.) Color picker has numeric RGB input. Buttons for motion controls (Obscure) and Override control (Appearance). Add focal length and software shading controls to camera panel. "vl" keyboard shortcut sets camera focal length. Limit picked projected Z values to -1 .. +1, so we can only pick things that lie between the clipping planes! Motions: Really stop motions of objects when we reset them. Controllable inertia, constrained motion, own-coordinate-frame motion ('ui', 'uc', 'uo' key sequences). Make more use of the ``focal plane''. Look At button sets focal distance. Shift-rightmouse-click selects a focal point; also becomes center of rotation. Translations are interpreted as at the focal plane, so objects at the focal distance should move with the mouse. Use ordinary, no longer scaled, translations. Let the scaling be based on the frame camera's focal length, set e.g. by Look or etc. operations. Pay attention to window aspect ratio and camera focal length when moving. Add more parameters to (look-encompass-size ...) indicating desired margins for setting near and far clipping planes. Geomview, Graphics: Pay proper attention to override bits in Next and RenderMan drawing libraries; ensures that objects will be the color chosen on the panel. Position SGI windows in exactly the specified place. Draw degenerate polylist (OFF) objects correctly for Next and RenderMan: use points and lines where they have 1- or 2-vertex "faces". Correctly handle lights whose positions don't lie within the model space (as the default lights are) in hyperbolic & spherical shaders. Geomview, Saving: Save window positions when saving cameras in command form. Use a unique name when saving geom objects as commands; avoids the problem of saving as object X and having it automatically renamed X in case of conflict, making further commands ineffective. Geomview, RenderMan: Include both NeXT and SGI (etc) standard shader directories; we don't know where .rib files will be rendered. RenderMan saving no longer enforces adding four-digit numeric suffix. Geomview, Communications: GCL command files containing multiple commands now work sensibly: geomview always reads entire contents, one command per display loop. (Use (progn ... ) to swallow all at once.) emodule-run command: all e-module directories are appended to $PATH when the program is started, so emodule-run may mention module programs without requiring full pathnames. Both SGI and NeXT versions can read from either named pipes or UNIX-domain sockets; -M[gc][sp] command-line option specifies data type and communications mechanism. Software shading now implements fog; density set by lighting attenconst. External-module programs are invoked by their full path names when possible. Allow L)ooking at cameras. Allow reading either geometry or commands from either UNIX-domain sockets or named pipes, using '-M[gc][sp] name' command-line option. (camera-prop) command specifies how to draw other cameras. (cursor) command (for SGI) controls GL cursor and/or loads from .pbm file. (setenv) command allows setting environment of e.g. external modules. Assorted bug fixes. Utility programs: New programs ucdtooff, anytoucd convert AVS "UCD" format to/from OOGL. Anytooff accepts (multiple) arguments, and combines their contents. Mathematica to OOGL software: Improve installation document; be more robust about locating math2oogl, geomview, etc. executables, and warning the user if we can't. Allow specifying user name when displaying on remote host. Don't fail if graphics contain complex values (just plot real part). New BezierPlot[] in BezierPlot.m allows plotting Bezier patches directly. FORMS: Include FORMS-2.0-PATCHES, all differences from FORMS 2.0 release. Change summary: FORMS Library: New color-picker module. New fouraxis module, derived from positioner.c. Allows specifying a direction in 4-space. Be more intelligent about frozen forms: only redraw if some object changed while the form was frozen. Use the sign bit of the form->frozen field to tell. Add '@I' prefix to embed FL_ICON_STYLE (symbol font) items in a browser. Tie mouse (x,y) position to all mouse clicks. Use this to ensure that we always register a mouse click in its correct position, not the place where the mouse lies when we get a chance to read it! Click position is fed to the next caller to ask for the mouse position after a click; later calls read the live mouse position. Seems to work. Cache stuff as much as possible. Don't load fonts or read color map unless (until) we actually need them. Might allow programs to start up at a reasonable speed, since the SGI font manager is slower in 4.0.x than 3.3. Handle Icon font usefully -- use the Symbol font, and allow it to be scaled. Accommodate new font-sizing rule in IRIX 4.0.5: fonts are now scaled to constant real size rather than constant size in pixels. On IRIX 4.0.5 or greater, we discover the error this will cause and scale all font sizes by its reciprocal (!). Optimize drawing bitmaps. Cache fl_getmcolor() values; use pointers to scan input & output pixel arrays. ~sixfold speedup. Save 64K data size. FORMS designer: Add fdesign2c, batch-mode translator from *.fd to *.{c,h}. Added colorwheel and fouraxis objects. 1.3.2 March 1, 1993 Fix RenderMan file saving bug. New OOGL classes: discrete groups and spheres. Underlying support for stereo added. Fix replace world bug. Rotate about CENTERID, not the target geom, in orbit mode. Add slow-motion controls (invoked with Shift key). Scaled translation procedures now take world size into account, not distance from target object. Use this mode in fly and orbit. Add "emodule-defined" command: returns the given emodule's shell command (& tests whether any such is defined). Add cull-backface as a command. 1.3.1 January 31, 1993 IMPORTANT: the "pick" command has changed completely and is incompatible with previous versions. If you have an external module that uses the "pick" command you should change it to use the new "interest" command instead. Change the way system-dependent information is specified; everything is now specified in the "geomview" shell script which sets environment variables and then invokes the binary. Nothing that is system-dependent (e.g. pathnames) are compiled in; not even default values. External modules now appear in alphabetical order in the applications browser. Geomview finds out about them via files named .geomview-* in the modules directory, rather than in the system-wide .geomview file. So there is no need to edit the system-wide .geomview when installing a module now. See man/cat1/geomview.1 for more information on how to install a module. The space browser is now on the main panel. Different models of hyperbolic space are now available: virtual (the insider's view of the projective model), projective (outsider's view), and conformal-ball. The conformal-ball model is only partially implemented; it works only for polylist (OFF) objects and only in constant-color and smooth-shading modes (not in flat-shading mode). The model is per-camera attribute and is settable via a browser in the camera panel. The camera, when drawn, now fits inside the unit sphere. Fixed RenderMan saving bug: file is now opened properly. "Fly" mode now uses scaled z-translation. A color wheel replaces the RGB sliders for picking colors. Several "look" functions added for positioning a camera to look at an object. "Look At [L]" button added to tools panel positions the current camera to place the target object nicely in the view. Look At and look-encompass compute and use a bounding sphere for the object rather than using its bounding box. Add "Orbit [o]" mode. Like fly mode, but rotates the camera about the center of the selected object. Better error reporting; syntax errors in input files are now reported with messages including the input line where the error was detected. Picking code improved; picking now works in more cases than before. Still broken if any part of any object is behind the camera plane. Null geoms now allowed, denoted { }. Added "interest" command which allows external modules to express interest in a command; the module is then notified whenever geomview executes the command. Useful for modules that need to know when things in geomview happen. Reduced sensitivity to accidental mouse twitches -- it's now easier to make an object stop moving. Motion now proceeds wrt real elapsed time. transform-incr allows specifying rate of motion. Control over when commands are executed: sleep-for, sleep-until, clock, set-clock, time-interest commands. A "load" command simplifies reading files. Added stereo viewing support: hardware, crosseyed, red/cyan modes. (An external module is needed to control it.) Lights may be specified (from command language only) in camera or object coordinates, as well as world coordinates. Allows depth cueing. "emodule-transmit" command allows sending messages to running modules. "real-id" gives an object's canonical name. "all" gives a list of all items (geometry, emodules, ...) of a kind. "soft-shader" selects whether to use new software shading. New "v~" keyboard shortcut does, too. "echo" can be used to print results of evaluating lisp expressions. Now reads all commands from command files; used to sometimes read only the first command. Modules may continue sending messages after being killed. Modules receive SIGHUP signal when killed. 1.2.3 October 22, 1992 Geomview: Add outside-hyperbolic space mode ("mo" keyboard shortcut). "mh" still selects a view inside hyperbolic space. A "spherical" language keyword ``(space spherical)'' is now recognized. Implementation of spherical motion is improved. Do a better job of adjusting camera setup when switching spaces. The first directory in the "Files" browser is initially selected, so its files are visible when the panel is first displayed. (This directory is the first one given to "load-path", by default "."). A new "Vects" button and "aV" keyboard shortcut select whether vect objects (lines and points) are visible; they're now controlled separately from polygon edges. Make hyperbolic translation behave better when the center-of-motion is literally "target" (the default); such translations are now along an axis through the origin, avoiding spurious rotation. If "center" is anything else, it's taken at face value. Use color to indicate status of Appearance-panel buttons: highlighted yellow when true, gray when false. Buttons lie flat on the panel if they've never been changed, and depressed if they have been. (The "Revert [ax]" button restores the never-set status, and shows objects as they naturally appear.) Add half-baked transparency: "aT" keyboard sequence. Fix supersensitive behavior of Applications browser; running modules now appear in boldface red. Add "-nopanels" command-line option. trigrp: Switch between euclidean and hyperbolic space when changing groups. FORMS library: Adapt to new IRIX 4.0.5 font manager's sizing behavior. Since FORMS panels are fixed in pixel units, we rescale fonts to be constant pixel size rather than 4.0.5's constant real size. [Still works on older systems.] External modules in general: A list of all external-module definitions is now kept in "data/.geomview-modules"; it's automatically updated when new modules are installed in the geomview binary directory. It's also safe to edit this file by hand. General distribution: Distributed files are now writable by the owner, to make it easier to apply upgrades. Once this 1.2.3 distribution package is installed, it should be possible to install future distributions without being the superuser, since "tar" will be able to overwrite the old files. 1.2.2 October 3, 1992 Geomview: Repaired ANSI C incompatibilities -- this version compiles under Irix 4.0.4. Several memory leaks were fixed. Don't corrupt memory when new-geometry command is used. Avoid crashing when a camera is deleted. Bezier patch dicing level is now properly recorded and applied to newly loaded Bezier objects. Bezier's saved in RenderMan format are written as true patches, not polygonal meshes. Texture coordinates also saved for STBBP's. Don't lose commands sent by external modules just before they die. Don't continuously redraw the display when camera drawing is on. Make hyperbolic translation, which was approximately correct, exact. Repair "position", "position-at", "position-toward" commands. Fix -b (background color) command-line option. Added performance metering (control-T keyboard character). Libraries: New libformsx.a library has some handy FORMS-related functions: enabling/disabling objects, reading numbers from input fields, etc. Maximum Bezier degree is now 12 rather than 6. Bounding boxes of Bezier patches now at least fairly meaningful. Avoid crashing when encountering erroneous OFF files. Invert the sense of QUAD normals to be consistent with other objects. Makefile configuration: Removed "make lib" warning in multiple-source library directories. Ensured that the FORMS library is installed by the time it's needed. 1.2.1 September 17, 1992 Fixed a problem with src/lib/forms/Makefile which prevented successful compilation on systems that don't already have the FORMS library installed. 1.2.1 is not really a new release --- it's just a re-packing of the tar file with a new src/lib/forms/Makefile. [ Details of the problem: modified src/lib/forms/Makefile so that it installs libforms.a in bin/sgi upon "make all" rather than just "make install". This is now consistent with the way the other .a files are installed, and fixes a problem which prevented successful makes on systems that don't already have FORMS installed. In previous releases libforms.a was installed by geomview/gl/O.sgi/Makefile before it attempted to link geomview; in 1.2, however, the "example" program links with libforms.a but doesn't install it first. Since "e" comes before "g", "example" is compiled by "make all" before geomview, with the result that the compilation fails since libforms.a is not yet in place. I created geomview-1.2.1.tar.Z by unpacking the 1.2 tar file into a fresh dir, replacing the files ./src/lib/forms/Makefile and ./CHANGES (this file), and re-packing. ] 1.2 September 4, 1992 Panels ------ New iconic tool panel replaces parts of old main panel. "Zoom" now changes camera field of view: add "scale" to change size of geometry. (Can also change apparent size by z-translating object or camera.) Reorganized panels. Camera panel has camera-related things, appearance panel has geometry-related things. Obscure panel now only has normalization and space things. Add save panel. Now through user interface can save: Renderman or .sgi snapshot, text file of commands, geometry, cameras, transforms, windows for any (or all) objects, and position information for all panels. Appearance controls now override all lower levels (before if lower level had appearance of its own it was left unchanged). Added revert button to appearance panel. New "?" button on main panel same as "?" keyboard shortcut (dumps keyboard shortcut summary to tty). Add "CSmooth" mode to shading browser of appearance panel. This is a constant-shaded style (shading depends only on vertex colors, not on lighting) but with smooth interpolation where colors vary across a face. Keyboard Shortcuts ------------------ Lines-closer shortcut "ac" now also "vc" since it's a per-camera option at the moment. Add backface culling (only accessible through keyboard toggle "vb"). "g" keyboard prefix now picks world not most recently picked geometry. "." new prefix for target object, i.e. "self". "P*" keyboard shortcut to bring up panels. "[se|sh]" shortcut changed to "[me|mh|ms]". (m for metric since s for space got taken over by "scale"). "TV" toggles NTSC video mode. "vs" toggles single vs. double-buffered windows. Commands ------------- Add complete help messages for all command language functions and new commands "?" and "??". The syntax of the write command has changed. See geomview.5. Added position, position-at, position-toward commands. Added rawevent, winenter, freeze commands (intended for development not for general use.) External module command name changes: emodule-define is the new name for ui-emotion-program. emodule-start is the new name for ui-emotion-run. emodule-run is the new name for "|". Eliminated ui-emotion-modename: awkward event-shipping to external modules. More useful access to functionality that is presently hidden internally is under development now. Motion ------- Totally new motion paradigm. Most old functions are mimicked. New functionality added. Can now specify a center of motion (orbit mode used to be camera around center of world: now can be any object orbiting any other object. See "ui-center" command.). Can specify rotations and translations in x, y, z instead of a raw 4x4 matrix (see "transform*" commands). Fly mode changed yet again: now left mouse rotates camera, middle mouse flies camera forward/backward. Flight Sim mode eliminated. External Modules ---------------- Distributing external modules separately from geomview proper, except for a few examples. Added example external module with accompanying tutorial document. Improved handling of external modules; can now run multiple concurrent modules and can finally terminate them. See command language changes above. External modules MUST now run in the foreground, lest geomview think they've died. FORMS/GL modules need to call foreground(). See emodule-run documentation in geomview(5). Do a better job of killing off external modules when geomview exits and suspending them when geomview is suspended. Can now invoke external modules from geomview's command line and can pass (globbed) parameters through to their command lines. Geomview general ---------------- Better Renderman support, especially for automated generation of movie frames. Can specify whether to render directly to framebuffer or to a tiff disk file. Can give file prefix which is then autoincremented on each Renderman snapshot. Tiff file name is constructed from rib file name (used to always be called "image.tiff"). Snapshot pops window to prevent obscuration, and redraws in singlebuffered mode to minimize dithering artifacts, and to avoid a "scrsave" bug which sometimes caused the previous image to be saved. In hyperbolic mode the camera starts out inside the sphere instead of outside the sphere, and the bounding sphere is not automatically drawn. Add spherical space mode. Add new special id's: self, universe, primitive (for coordinate systems). Pick data can be written in any of several coordinate systems. Make picking work on views with dedicated scenes. Better camera geometry for default camera drawn. (Development feature that may change in the future: uses "cam.oogl" file instead if it exists.) Number new objects according to their id, so camera c2 == "Camera<2>", etc. OOGL ---- Better error detection and recovery in OOGL loading rountines. Added method extension mechanism for geom objects. Various internal reorganizations --- renaming variables, etc. Added support for variable-length arrays (vvec's). Added geom transform methods. Print a useful error message if a camera file can't be found. Fixed binary mesh loading bug; binary meshes now load properly. Fixed bug which caused sometimes-wrong screen z computation associated with picking. Fixed picking of closed VECT object. Don't draw VECTs when edge drawing is off. Objects loaded from files are no longer tied to the contents of those files; the sequence "load object, change file, load other object from same file" now yields two distinct objects, not two identical copies of the new version. General ------- Made source code more ANSI-compliant. Many optimizations; code runs faster. Fixed bugs assocaited with communication via pipes; close them Fixed bugs associated with reference counting and memory allocation and freeing. New configuration setup; more robust Overhaul Makefile structure; rely more on common Makefiles referenced via "include" Completely new lisp interpreter; much more general and easier to use than previous version. See the man page man/cat3/lisp.3 for details. Fixed various minor bugs. Known problems: --------------- Spherical mode doesn't work on VGXes. Zoom and Scale have no inertia. Constrained motion (to X or Y axis) no longer works. Sometimes core dumps on bad input files. ------------------------------------------------------------------------------- 1.1 May 27 1992 Slightly better documentation; lang.doc renamed geomview.5. Four more sample external modules added. Control panel settings override objects' own appearances. Object vertex/edge/face picking (rightmouse), w/command-language feedback. New flight-simulator motion mode. More state-saving operations, 'write' and 'snapshot' language commands. Command-language control over windows & panels (placement, visibility). Can save scenes in RenderMan .rib format. Many bug fixes including: Memory should now be freed properly when objects are deleted. Code now compiles under IRIX 4.0.1 ANSI C. Input panels now accept input properly under 4.0 (input focus bug fixed). Known problems: IRIX 4.0 remote display (DGL) doesn't work; geomview must run on the machine where it's displaying. ------------------------------------------------------------------------------- 1.0.1 February 25 1992: Miscellaneous minor bug fixes Slightly better documentation ------------------------------------------------------------------------------- 1.0 January 31 1992 initial release geomview-1.9.4/COPYING0000644000175000001440000006006407730240643011332 00000000000000GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 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. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provy at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used foobject code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library alreser has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distrib not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBR 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. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. Copyright (C) year name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice That's all there is to it!